Added superior to enantiomorphic reactor

This commit is contained in:
Unknown 2019-03-15 22:46:33 +01:00 committed by unknown
parent 949a0ef630
commit 9c39220a24
8 changed files with 245 additions and 217 deletions

View file

@ -1,7 +1,7 @@
package cr0s.warpdrive.block.energy; package cr0s.warpdrive.block.energy;
import cr0s.warpdrive.block.BlockAbstractContainer; import cr0s.warpdrive.block.BlockAbstractContainer;
import cr0s.warpdrive.data.EnumReactorFace; import cr0s.warpdrive.data.ReactorFace;
import cr0s.warpdrive.data.EnumTier; import cr0s.warpdrive.data.EnumTier;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -60,7 +60,7 @@ public class BlockEnanReactorCore extends BlockAbstractContainer {
public void breakBlock(final World world, @Nonnull final BlockPos blockPos, @Nonnull final IBlockState blockState) { public void breakBlock(final World world, @Nonnull final BlockPos blockPos, @Nonnull final IBlockState blockState) {
super.breakBlock(world, blockPos, blockState); super.breakBlock(world, blockPos, blockState);
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
if (reactorFace.indexStability < 0) { if (reactorFace.indexStability < 0) {
continue; continue;
} }
@ -68,7 +68,7 @@ public class BlockEnanReactorCore extends BlockAbstractContainer {
final TileEntity tileEntity = world.getTileEntity(blockPos.add(reactorFace.x, reactorFace.y, reactorFace.z)); final TileEntity tileEntity = world.getTileEntity(blockPos.add(reactorFace.x, reactorFace.y, reactorFace.z));
if (tileEntity instanceof TileEntityEnanReactorLaser) { if (tileEntity instanceof TileEntityEnanReactorLaser) {
if (((TileEntityEnanReactorLaser) tileEntity).getReactorFace() == reactorFace) { if (((TileEntityEnanReactorLaser) tileEntity).getReactorFace() == reactorFace) {
((TileEntityEnanReactorLaser) tileEntity).setReactorFace(EnumReactorFace.UNKNOWN, null); ((TileEntityEnanReactorLaser) tileEntity).setReactorFace(ReactorFace.UNKNOWN, null);
} }
} }
} }

View file

@ -4,7 +4,7 @@ import cr0s.warpdrive.Commons;
import cr0s.warpdrive.WarpDrive; import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.config.WarpDriveConfig; import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.EnergyWrapper; import cr0s.warpdrive.data.EnergyWrapper;
import cr0s.warpdrive.data.EnumReactorFace; import cr0s.warpdrive.data.ReactorFace;
import cr0s.warpdrive.data.EnumReactorOutputMode; import cr0s.warpdrive.data.EnumReactorOutputMode;
import cr0s.warpdrive.data.Vector3; import cr0s.warpdrive.data.Vector3;
import cr0s.warpdrive.network.PacketHandler; import cr0s.warpdrive.network.PacketHandler;
@ -12,7 +12,6 @@ import cr0s.warpdrive.network.PacketHandler;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@ -46,7 +45,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private int stabilizerEnergy = 10000; private int stabilizerEnergy = 10000;
private int containedEnergy = 0; private int containedEnergy = 0;
private final double[] instabilityValues = new double[EnumReactorFace.maxInstabilities]; // no instability = 0, explosion = 100 private final double[] instabilityValues = new double[ReactorFace.maxInstabilities]; // no instability = 0, explosion = 100
// computed properties // computed properties
private boolean isFirstException = true; private boolean isFirstException = true;
@ -64,7 +63,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private long energyReleasedLastCycle = 0; private long energyReleasedLastCycle = 0;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private final WeakReference<TileEntityEnanReactorLaser>[] weakTileEntityLasers = (WeakReference<TileEntityEnanReactorLaser>[]) Array.newInstance(WeakReference.class, EnumReactorFace.maxInstabilities); private final WeakReference<TileEntityEnanReactorLaser>[] weakTileEntityLasers = (WeakReference<TileEntityEnanReactorLaser>[]) Array.newInstance(WeakReference.class, ReactorFace.maxInstabilities);
public TileEntityEnanReactorCore() { public TileEntityEnanReactorCore() {
super(); super();
@ -135,7 +134,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
} }
private void increaseInstability() { private void increaseInstability() {
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
// increase instability // increase instability
final int indexStability = reactorFace.indexStability; final int indexStability = reactorFace.indexStability;
if (containedEnergy > 2000) { if (containedEnergy > 2000) {
@ -154,7 +153,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
} }
} }
void decreaseInstability(final EnumReactorFace reactorFace, final int energy) { void decreaseInstability(final ReactorFace reactorFace, final int energy) {
if (reactorFace.indexStability < 0) { if (reactorFace.indexStability < 0) {
return; return;
} }
@ -164,7 +163,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
return; return;
} }
lasersReceived = Math.min(10.0F, lasersReceived + 1.0F / WarpDriveConfig.ENAN_REACTOR_MAX_LASERS_PER_SECOND); lasersReceived = Math.min(10.0F, lasersReceived + 1.0F / WarpDriveConfig.ENAN_REACTOR_MAX_LASERS_PER_SECOND[enumTier.getIndex()]);
double nospamFactor = 1.0D; double nospamFactor = 1.0D;
if (lasersReceived > 1.0F) { if (lasersReceived > 1.0F) {
nospamFactor = 0.5; nospamFactor = 0.5;
@ -194,7 +193,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private void generateEnergy() { private void generateEnergy() {
double stabilityOffset = 0.5; double stabilityOffset = 0.5;
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
stabilityOffset *= Math.max(0.01D, instabilityValues[reactorFace.indexStability] / 100.0D); stabilityOffset *= Math.max(0.01D, instabilityValues[reactorFace.indexStability] / 100.0D);
} }
@ -218,7 +217,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
} }
private void runControlLoop() { private void runControlLoop() {
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
if (instabilityValues[reactorFace.indexStability] > instabilityTarget) { if (instabilityValues[reactorFace.indexStability] > instabilityTarget) {
final TileEntityEnanReactorLaser tileEntityEnanReactorLaser = getLaser(reactorFace); final TileEntityEnanReactorLaser tileEntityEnanReactorLaser = getLaser(reactorFace);
if (tileEntityEnanReactorLaser != null) { if (tileEntityEnanReactorLaser != null) {
@ -232,7 +231,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
} }
} }
private TileEntityEnanReactorLaser getLaser(final EnumReactorFace reactorFace) { private TileEntityEnanReactorLaser getLaser(final ReactorFace reactorFace) {
final WeakReference<TileEntityEnanReactorLaser> weakTileEntityLaser = weakTileEntityLasers[reactorFace.indexStability]; final WeakReference<TileEntityEnanReactorLaser> weakTileEntityLaser = weakTileEntityLasers[reactorFace.indexStability];
TileEntityEnanReactorLaser tileEntityEnanReactorLaser; TileEntityEnanReactorLaser tileEntityEnanReactorLaser;
if (weakTileEntityLaser != null) { if (weakTileEntityLaser != null) {
@ -270,7 +269,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private boolean shouldExplode() { private boolean shouldExplode() {
boolean exploding = false; boolean exploding = false;
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
exploding = exploding || (instabilityValues[reactorFace.indexStability] >= 100); exploding = exploding || (instabilityValues[reactorFace.indexStability] >= 100);
} }
exploding &= (world.rand.nextInt(4) == 2); exploding &= (world.rand.nextInt(4) == 2);
@ -278,7 +277,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
if (exploding) { if (exploding) {
final StringBuilder statusLasers = new StringBuilder(); final StringBuilder statusLasers = new StringBuilder();
final MutableBlockPos mutableBlockPos = new MutableBlockPos(); final MutableBlockPos mutableBlockPos = new MutableBlockPos();
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
long energyStored = -1L; long energyStored = -1L;
int countLaserMediums = 0; int countLaserMediums = 0;
mutableBlockPos.setPos( mutableBlockPos.setPos(
@ -396,7 +395,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
// first check if we have the required 'air' blocks // first check if we have the required 'air' blocks
boolean isValid = true; boolean isValid = true;
for (final EnumReactorFace reactorFace : EnumReactorFace.get(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.get(enumTier)) {
assert reactorFace.enumTier == enumTier; assert reactorFace.enumTier == enumTier;
if (reactorFace.indexStability < 0) { if (reactorFace.indexStability < 0) {
mutableBlockPos.setPos(pos.getX() + reactorFace.x, mutableBlockPos.setPos(pos.getX() + reactorFace.x,
@ -417,7 +416,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
} }
// then update the stabilization lasers accordingly // then update the stabilization lasers accordingly
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
mutableBlockPos.setPos(pos.getX() + reactorFace.x, mutableBlockPos.setPos(pos.getX() + reactorFace.x,
pos.getY() + reactorFace.y, pos.getY() + reactorFace.y,
pos.getZ() + reactorFace.z); pos.getZ() + reactorFace.z);
@ -426,7 +425,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
if (isValid) { if (isValid) {
((TileEntityEnanReactorLaser) tileEntity).setReactorFace(reactorFace, this); ((TileEntityEnanReactorLaser) tileEntity).setReactorFace(reactorFace, this);
} else { } else {
((TileEntityEnanReactorLaser) tileEntity).setReactorFace(EnumReactorFace.UNKNOWN, null); ((TileEntityEnanReactorLaser) tileEntity).setReactorFace(ReactorFace.UNKNOWN, null);
} }
} else { } else {
final Vector3 vPosition = new Vector3(mutableBlockPos).translate(0.5D); final Vector3 vPosition = new Vector3(mutableBlockPos).translate(0.5D);
@ -461,11 +460,13 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
// computer is alive => start updating reactor // computer is alive => start updating reactor
hold = false; hold = false;
final ArrayList<Double> result = new ArrayList<>(16); final ReactorFace[] lasers = ReactorFace.getLasers(enumTier);
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { final Double[] result = new Double[lasers.length];
result.add(reactorFace.indexStability, instabilityValues[reactorFace.indexStability]); for (final ReactorFace reactorFace : lasers) {
final double value = instabilityValues[reactorFace.indexStability];
result[reactorFace.indexStability] = value;
} }
return result.toArray(new Double[0]); return result;
} }
@Override @Override
@ -622,7 +623,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
tagCompound.setInteger("energy", containedEnergy); tagCompound.setInteger("energy", containedEnergy);
final NBTTagCompound tagCompoundInstability = new NBTTagCompound(); final NBTTagCompound tagCompoundInstability = new NBTTagCompound();
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) { for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
tagCompoundInstability.setDouble(reactorFace.name, instabilityValues[reactorFace.indexStability]); tagCompoundInstability.setDouble(reactorFace.name, instabilityValues[reactorFace.indexStability]);
} }
tagCompound.setTag("instability", tagCompoundInstability); tagCompound.setTag("instability", tagCompoundInstability);
@ -649,7 +650,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
containedEnergy = tagCompound.getInteger("energy"); containedEnergy = tagCompound.getInteger("energy");
final NBTTagCompound tagCompoundInstability = tagCompound.getCompoundTag("instability"); final NBTTagCompound tagCompoundInstability = tagCompound.getCompoundTag("instability");
// tier isn't defined yet, so we check all candidates // tier isn't defined yet, so we check all candidates
for (final EnumReactorFace reactorFace : EnumReactorFace.values()) { for (final ReactorFace reactorFace : ReactorFace.getLasers()) {
if (reactorFace.indexStability < 0) { if (reactorFace.indexStability < 0) {
continue; continue;
} }

View file

@ -6,7 +6,7 @@ import cr0s.warpdrive.api.computer.IEnanReactorLaser;
import cr0s.warpdrive.block.TileEntityAbstractLaser; import cr0s.warpdrive.block.TileEntityAbstractLaser;
import cr0s.warpdrive.config.WarpDriveConfig; import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.BlockProperties; import cr0s.warpdrive.data.BlockProperties;
import cr0s.warpdrive.data.EnumReactorFace; import cr0s.warpdrive.data.ReactorFace;
import cr0s.warpdrive.data.Vector3; import cr0s.warpdrive.data.Vector3;
import cr0s.warpdrive.network.PacketHandler; import cr0s.warpdrive.network.PacketHandler;
@ -30,7 +30,7 @@ import net.minecraftforge.fml.common.Optional;
public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implements IEnanReactorLaser { public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implements IEnanReactorLaser {
// persistent properties // persistent properties
private EnumReactorFace reactorFace = EnumReactorFace.UNKNOWN; private ReactorFace reactorFace = ReactorFace.UNKNOWN;
private int energyStabilizationRequest = 0; private int energyStabilizationRequest = 0;
// computed properties // computed properties
@ -56,10 +56,10 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
protected void onFirstUpdateTick() { protected void onFirstUpdateTick() {
super.onFirstUpdateTick(); super.onFirstUpdateTick();
if (reactorFace == EnumReactorFace.UNKNOWN) { if (reactorFace == ReactorFace.UNKNOWN) {
final MutableBlockPos mutableBlockPos = new MutableBlockPos(pos); final MutableBlockPos mutableBlockPos = new MutableBlockPos(pos);
// laser isn't linked yet, let's try to update nearby reactors // laser isn't linked yet, let's try to update nearby reactors
for (final EnumReactorFace reactorFace : EnumReactorFace.values()) { for (final ReactorFace reactorFace : ReactorFace.getLasers()) {
if (reactorFace.indexStability < 0) { if (reactorFace.indexStability < 0) {
continue; continue;
} }
@ -90,11 +90,11 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
} }
@Nonnull @Nonnull
public EnumReactorFace getReactorFace() { public ReactorFace getReactorFace() {
return reactorFace != null ? reactorFace : EnumReactorFace.UNKNOWN; return reactorFace != null ? reactorFace : ReactorFace.UNKNOWN;
} }
public void setReactorFace(@Nonnull final EnumReactorFace reactorFace, final TileEntityEnanReactorCore reactorCore) { public void setReactorFace(@Nonnull final ReactorFace reactorFace, final TileEntityEnanReactorCore reactorCore) {
// skip if it's already set to save resources // skip if it's already set to save resources
if (this.reactorFace == reactorFace) { if (this.reactorFace == reactorFace) {
return; return;
@ -102,7 +102,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
// update properties // update properties
this.reactorFace = reactorFace; this.reactorFace = reactorFace;
this.weakReactorCore = reactorCore != null && reactorFace != EnumReactorFace.UNKNOWN ? new WeakReference<>(reactorCore) : null; this.weakReactorCore = reactorCore != null && reactorFace != ReactorFace.UNKNOWN ? new WeakReference<>(reactorCore) : null;
// refresh blockstate // refresh blockstate
final IBlockState blockState_old = world.getBlockState(pos); final IBlockState blockState_old = world.getBlockState(pos);
@ -123,7 +123,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
} }
private TileEntityEnanReactorCore getReactorCore() { private TileEntityEnanReactorCore getReactorCore() {
if (reactorFace == EnumReactorFace.UNKNOWN) { if (reactorFace == ReactorFace.UNKNOWN) {
return null; return null;
} }
TileEntityEnanReactorCore reactorCore = weakReactorCore != null ? weakReactorCore.get() : null; TileEntityEnanReactorCore reactorCore = weakReactorCore != null ? weakReactorCore.get() : null;
@ -208,7 +208,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
@Override @Override
public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) { public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) {
tagCompound = super.writeToNBT(tagCompound); tagCompound = super.writeToNBT(tagCompound);
tagCompound.setInteger("reactorFace", reactorFace.ordinal()); tagCompound.setString("reactorFace", reactorFace.getName());
tagCompound.setInteger("energyStabilizationRequest", energyStabilizationRequest); tagCompound.setInteger("energyStabilizationRequest", energyStabilizationRequest);
return tagCompound; return tagCompound;
} }
@ -217,7 +217,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
public void readFromNBT(final NBTTagCompound tagCompound) { public void readFromNBT(final NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound); super.readFromNBT(tagCompound);
reactorFace = EnumReactorFace.get(tagCompound.getInteger("reactorFace")); reactorFace = ReactorFace.get(tagCompound.getString("reactorFace"));
energyStabilizationRequest = tagCompound.getInteger("energyStabilizationRequest"); energyStabilizationRequest = tagCompound.getInteger("energyStabilizationRequest");
} }
@ -225,7 +225,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
// Common OC/CC methods // Common OC/CC methods
@Override @Override
public Object[] isAssemblyValid() { public Object[] isAssemblyValid() {
if (reactorFace == EnumReactorFace.UNKNOWN) { if (reactorFace == ReactorFace.UNKNOWN) {
return new Object[] { false, "No reactor detected" }; return new Object[] { false, "No reactor detected" };
} }
return super.isAssemblyValid(); return super.isAssemblyValid();

View file

@ -483,7 +483,7 @@ public class WarpDriveConfig {
// Enantiomorphic power reactor // Enantiomorphic power reactor
public static int[] ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER = { 100000000, 100000000, 500000000, 2000000000 }; public static int[] ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER = { 100000000, 100000000, 500000000, 2000000000 };
public static final int ENAN_REACTOR_UPDATE_INTERVAL_TICKS = 5; // hardcoded in the equations, public static final int ENAN_REACTOR_UPDATE_INTERVAL_TICKS = 5; // hardcoded in the equations,
public static int ENAN_REACTOR_MAX_LASERS_PER_SECOND = 6; public static int[] ENAN_REACTOR_MAX_LASERS_PER_SECOND = { 64, 6, 12, 24 };
public static int[] ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER = { 4, 4, 4, 4 }; public static int[] ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER = { 4, 4, 4, 4 };
public static int[] ENAN_REACTOR_GENERATION_MAX_RF_BY_TIER = { 64000, 64000, 192000, 576000 }; public static int[] ENAN_REACTOR_GENERATION_MAX_RF_BY_TIER = { 64000, 64000, 192000, 576000 };
public static int[] ENAN_REACTOR_EXPLOSION_MAX_RADIUS_BY_TIER = { 6, 6, 8, 10 }; public static int[] ENAN_REACTOR_EXPLOSION_MAX_RADIUS_BY_TIER = { 6, 6, 8, 10 };
@ -1199,8 +1199,9 @@ public class WarpDriveConfig {
ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER = ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER =
config.get("enantiomorphic_reactor", "max_energy_stored_by_tier", ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER, "Maximum energy stored in the core for a given tier").getIntList(); config.get("enantiomorphic_reactor", "max_energy_stored_by_tier", ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER, "Maximum energy stored in the core for a given tier").getIntList();
clampByTier(1, Integer.MAX_VALUE, ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER); clampByTier(1, Integer.MAX_VALUE, ENAN_REACTOR_MAX_ENERGY_STORED_BY_TIER);
ENAN_REACTOR_MAX_LASERS_PER_SECOND = Commons.clamp(4, 80, ENAN_REACTOR_MAX_LASERS_PER_SECOND =
config.get("enantiomorphic_reactor", "max_lasers", ENAN_REACTOR_MAX_LASERS_PER_SECOND, "Maximum number of stabilisation laser shots per seconds before loosing efficiency").getInt()); config.get("enantiomorphic_reactor", "max_lasers", ENAN_REACTOR_MAX_LASERS_PER_SECOND, "Maximum number of stabilisation laser shots per seconds before loosing efficiency").getIntList();
clampByTier(1, Integer.MAX_VALUE, ENAN_REACTOR_MAX_LASERS_PER_SECOND);
ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER = ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER =
config.get("enantiomorphic_reactor", "min_generation_RF_by_tier", ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER, "Minimum energy added to the core when enabled, measured in RF/t, for a given tier").getIntList(); config.get("enantiomorphic_reactor", "min_generation_RF_by_tier", ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER, "Minimum energy added to the core when enabled, measured in RF/t, for a given tier").getIntList();
clampByTier(1, Integer.MAX_VALUE, ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER); clampByTier(1, Integer.MAX_VALUE, ENAN_REACTOR_GENERATION_MIN_RF_BY_TIER);

View file

@ -1,153 +0,0 @@
package cr0s.warpdrive.data;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
public enum EnumReactorFace implements IStringSerializable {
// tier inst name x y z facingLaserProperty
UNKNOWN (null , -1, "unknown" , 0, 0, 0, null ),
BASIC_LASER_SOUTH (EnumTier.BASIC , 0, "laser_south" , 0, 0, -2, EnumFacing.NORTH),
BASIC_LASER_NORTH (EnumTier.BASIC , 1, "laser_north" , 0, 0, 2, EnumFacing.SOUTH),
BASIC_LASER_EAST (EnumTier.BASIC , 2, "laser_east" , -2, 0, 0, EnumFacing.WEST ),
BASIC_LASER_WEST (EnumTier.BASIC , 3, "laser_west" , 2, 0, 0, EnumFacing.EAST ),
BASIC_LENS_NORTH (EnumTier.BASIC , -1, "lens_north" , 0, 0, -1, null ),
BASIC_LENS_SOUTH (EnumTier.BASIC , -1, "lens_south" , 0, 0, 1, null ),
BASIC_LENS_EAST (EnumTier.BASIC , -1, "lens_east" , -1, 0, 0, null ),
BASIC_LENS_WEST (EnumTier.BASIC , -1, "lens_west" , 1, 0, 0, null ),
ADVANCED_LASER_SOUTH_BOTTOM (EnumTier.ADVANCED, 0, "laser_south" , 1, 2, -3, EnumFacing.NORTH),
ADVANCED_LASER_SOUTH_TOP (EnumTier.ADVANCED, 1, "laser_south" , -1, 4, -3, EnumFacing.NORTH),
ADVANCED_LASER_NORTH_BOTTOM (EnumTier.ADVANCED, 2, "laser_north" , -1, 2, 3, EnumFacing.SOUTH),
ADVANCED_LASER_NORTH_TOP (EnumTier.ADVANCED, 3, "laser_north" , 1, 4, 3, EnumFacing.SOUTH),
ADVANCED_LASER_EAST_BOTTOM (EnumTier.ADVANCED, 4, "laser_east" , -3, 2, -1, EnumFacing.WEST ),
ADVANCED_LASER_EAST_TOP (EnumTier.ADVANCED, 5, "laser_east" , -3, 4, 1, EnumFacing.WEST ),
ADVANCED_LASER_WEST_BOTTOM (EnumTier.ADVANCED, 6, "laser_west" , 3, 2, 1, EnumFacing.EAST ),
ADVANCED_LASER_WEST_TOP (EnumTier.ADVANCED, 7, "laser_west" , 3, 4, -1, EnumFacing.EAST ),
ADVANCED_LENS_SOUTH_BOTTOM (EnumTier.ADVANCED, -1, "lens_south" , 1, 2, -2, null ),
ADVANCED_LENS_SOUTH_TOP (EnumTier.ADVANCED, -1, "lens_south" , -1, 4, -2, null ),
ADVANCED_LENS_NORTH_BOTTOM (EnumTier.ADVANCED, -1, "lens_north" , -1, 2, 2, null ),
ADVANCED_LENS_NORTH_TOP (EnumTier.ADVANCED, -1, "lens_north" , 1, 4, 2, null ),
ADVANCED_LENS_EAST_BOTTOM (EnumTier.ADVANCED, -1, "lens_east" , -2, 2, -1, null ),
ADVANCED_LENS_EAST_TOP (EnumTier.ADVANCED, -1, "lens_east" , -2, 4, 1, null ),
ADVANCED_LENS_WEST_BOTTOM (EnumTier.ADVANCED, -1, "lens_west" , 2, 2, 1, null ),
ADVANCED_LENS_WEST_TOP (EnumTier.ADVANCED, -1, "lens_west" , 2, 4, -1, null ),
ADVANCED_CORE_CENTER (EnumTier.ADVANCED, -1, "core_center" , 0, 3, -1, null ),
ADVANCED_CORE_BOTTOM (EnumTier.ADVANCED, -1, "core_bottom" , 0, 2, 0, null ),
ADVANCED_CORE_TOP (EnumTier.ADVANCED, -1, "core_top" , 0, 4, 0, null ),
ADVANCED_CORE_NORTH (EnumTier.ADVANCED, -1, "core_north" , 0, 3, -1, null ),
ADVANCED_CORE_SOUTH (EnumTier.ADVANCED, -1, "core_south" , 0, 3, 1, null ),
ADVANCED_CORE_EAST (EnumTier.ADVANCED, -1, "core_east" , -1, 3, 0, null ),
ADVANCED_CORE_WEST (EnumTier.ADVANCED, -1, "core_west" , 1, 3, 0, null ),
ADVANCED_SHELL1_BOTTOM_NORTH (EnumTier.ADVANCED, -1, "shell_inner" , 0, 2, -1, null ),
ADVANCED_SHELL1_BOTTOM_SOUTH (EnumTier.ADVANCED, -1, "shell_inner" , 0, 2, 1, null ),
ADVANCED_SHELL1_BOTTOM_EAST (EnumTier.ADVANCED, -1, "shell_inner" , -1, 2, 0, null ),
ADVANCED_SHELL1_BOTTOM_WEST (EnumTier.ADVANCED, -1, "shell_inner" , 1, 2, 0, null ),
ADVANCED_SHELL1_TOP_NORTH (EnumTier.ADVANCED, -1, "shell_inner" , 0, 4, -1, null ),
ADVANCED_SHELL1_TOP_SOUTH (EnumTier.ADVANCED, -1, "shell_inner" , 0, 4, 1, null ),
ADVANCED_SHELL1_TOP_EAST (EnumTier.ADVANCED, -1, "shell_inner" , -1, 4, 0, null ),
ADVANCED_SHELL1_TOP_WEST (EnumTier.ADVANCED, -1, "shell_inner" , 1, 4, 0, null ),
ADVANCED_SHELL1_NORTH_EAST (EnumTier.ADVANCED, -1, "shell_inner" , -1, 3, -1, null ),
ADVANCED_SHELL1_NORTH_WEST (EnumTier.ADVANCED, -1, "shell_inner" , 1, 3, -1, null ),
ADVANCED_SHELL1_SOUTH_EAST (EnumTier.ADVANCED, -1, "shell_inner" , -1, 3, 1, null ),
ADVANCED_SHELL1_SOUTH_WEST (EnumTier.ADVANCED, -1, "shell_inner" , 1, 3, 1, null ),
ADVANCED_SHELL2_BOTTOM (EnumTier.ADVANCED, -1, "shell_outer" , 0, 1, 0, null ),
ADVANCED_SHELL2_TOP (EnumTier.ADVANCED, -1, "shell_outer" , 0, 5, 0, null ),
ADVANCED_SHELL2_NORTH (EnumTier.ADVANCED, -1, "shell_outer" , 0, 3, -2, null ),
ADVANCED_SHELL2_SOUTH (EnumTier.ADVANCED, -1, "shell_outer" , 0, 3, 2, null ),
ADVANCED_SHELL2_EAST (EnumTier.ADVANCED, -1, "shell_outer" , -2, 3, 0, null ),
ADVANCED_SHELL2_WEST (EnumTier.ADVANCED, -1, "shell_outer" , 2, 3, 0, null ),
ADVANCED_SHELL2_BOTTOM_NORTH_EAST (EnumTier.ADVANCED, -1, "shell_outer" , -1, 2, -1, null ),
ADVANCED_SHELL2_BOTTOM_NORTH_WEST (EnumTier.ADVANCED, -1, "shell_outer" , 1, 2, -1, null ),
ADVANCED_SHELL2_BOTTOM_SOUTH_EAST (EnumTier.ADVANCED, -1, "shell_outer" , -1, 2, 1, null ),
ADVANCED_SHELL2_BOTTOM_SOUTH_WEST (EnumTier.ADVANCED, -1, "shell_outer" , 1, 2, 1, null ),
ADVANCED_SHELL2_TOP_NORTH_EAST (EnumTier.ADVANCED, -1, "shell_outer" , -1, 4, -1, null ),
ADVANCED_SHELL2_TOP_NORTH_WEST (EnumTier.ADVANCED, -1, "shell_outer" , 1, 4, -1, null ),
ADVANCED_SHELL2_TOP_SOUTH_EAST (EnumTier.ADVANCED, -1, "shell_outer" , -1, 4, 1, null ),
ADVANCED_SHELL2_TOP_SOUTH_WEST (EnumTier.ADVANCED, -1, "shell_outer" , 1, 4, 1, null ),
;
public final EnumTier enumTier;
public final int indexStability;
public final String name;
public final int x;
public final int y;
public final int z;
public final EnumFacing facingLaserProperty;
// cached values
public static final int length;
public static final int maxInstabilities;
private static final HashMap<Integer, EnumReactorFace> ID_MAP = new HashMap<>();
private static final HashMap<EnumTier, EnumReactorFace[]> TIER_ALL = new HashMap<>(EnumTier.length);
private static final HashMap<EnumTier, EnumReactorFace[]> TIER_LASERS = new HashMap<>(EnumTier.length);
static {
length = EnumReactorFace.values().length;
for (final EnumReactorFace reactorFace : values()) {
ID_MAP.put(reactorFace.ordinal(), reactorFace);
}
// pre-build the list of lasers in the structure
final HashMap<EnumTier, ArrayList<EnumReactorFace>> tierAll = new HashMap<>(EnumTier.length);
final HashMap<EnumTier, ArrayList<EnumReactorFace>> tierLasers = new HashMap<>(EnumTier.length);
for (final EnumTier tierLoop : EnumTier.values()) {
tierAll.put(tierLoop, new ArrayList<>(16));
tierLasers.put(tierLoop, new ArrayList<>(16));
}
for (final EnumReactorFace reactorFace : values()) {
if (reactorFace.enumTier == null) {
continue;
}
tierAll.get(reactorFace.enumTier).add(reactorFace);
if (reactorFace.indexStability >= 0) {
tierLasers.get(reactorFace.enumTier).add(reactorFace);
}
}
for (final Entry<EnumTier, ArrayList<EnumReactorFace>> entry : tierAll.entrySet()) {
TIER_ALL.put(entry.getKey(), entry.getValue().toArray(new EnumReactorFace[0]));
}
int max = 0;
for (final Entry<EnumTier, ArrayList<EnumReactorFace>> entry : tierLasers.entrySet()) {
TIER_LASERS.put(entry.getKey(), entry.getValue().toArray(new EnumReactorFace[0]));
max = Math.max(max, entry.getValue().size());
}
maxInstabilities = max;
}
EnumReactorFace(final EnumTier enumTier, final int indexStability, final String name,
final int x, final int y, final int z,
final EnumFacing facingLaserProperty) {
this.enumTier = enumTier;
this.indexStability = indexStability;
this.name = name;
this.x = x;
this.y = y;
this.z = z;
this.facingLaserProperty = facingLaserProperty;
}
public static EnumReactorFace[] get(final EnumTier tier) {
return TIER_ALL.get(tier);
}
public static EnumReactorFace[] getLasers(final EnumTier tier) {
return TIER_LASERS.get(tier);
}
@Nonnull
@Override
public String getName() {
return name;
}
public static EnumReactorFace get(final int ordinal) {
return ID_MAP.get(ordinal);
}
}

View file

@ -0,0 +1,179 @@
package cr0s.warpdrive.data;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
public class ReactorFace implements IStringSerializable {
public static final ReactorFace UNKNOWN;
public final EnumTier enumTier;
public final int indexStability; // >= 0 for lasers, -1 otherwise
public final String name; // non null
public final int x;
public final int y;
public final int z;
public final EnumFacing facingLaserProperty; // defined for laser, null otherwise
// cached values
public static final int maxInstabilities;
private static final HashMap<String, ReactorFace> NAME_MAP = new HashMap<>();
private static final HashMap<EnumTier, ReactorFace[]> FACES_BY_TIER;
private static final HashMap<EnumTier, ReactorFace[]> LASERS_BY_TIER;
private static final ReactorFace[] LASERS;
static {
UNKNOWN = new ReactorFace(null, -1, "unknown", 0, 0, 0, null);
// basic reactor has core for core
new ReactorFace(EnumTier.BASIC , 0, "laser.basic.south" , 0, 0, -2, EnumFacing.NORTH);
new ReactorFace(EnumTier.BASIC , 1, "laser.basic.north" , 0, 0, 2, EnumFacing.SOUTH);
new ReactorFace(EnumTier.BASIC , 2, "laser.basic.east" , -2, 0, 0, EnumFacing.WEST );
new ReactorFace(EnumTier.BASIC , 3, "laser.basic.west" , 2, 0, 0, EnumFacing.EAST );
// advanced reactor has core offset with small radius
new ReactorFace(EnumTier.ADVANCED, 0, "laser.advanced.south+" , 1, 2, -3, EnumFacing.NORTH);
new ReactorFace(EnumTier.ADVANCED, 1, "laser.advanced.south-" , -1, 4, -3, EnumFacing.NORTH);
new ReactorFace(EnumTier.ADVANCED, 2, "laser.advanced.north-" , -1, 2, 3, EnumFacing.SOUTH);
new ReactorFace(EnumTier.ADVANCED, 3, "laser.advanced.north+" , 1, 4, 3, EnumFacing.SOUTH);
new ReactorFace(EnumTier.ADVANCED, 4, "laser.advanced.east-" , -3, 2, -1, EnumFacing.WEST );
new ReactorFace(EnumTier.ADVANCED, 5, "laser.advanced.east+" , -3, 4, 1, EnumFacing.WEST );
new ReactorFace(EnumTier.ADVANCED, 6, "laser.advanced.west+" , 3, 2, 1, EnumFacing.EAST );
new ReactorFace(EnumTier.ADVANCED, 7, "laser.advanced.west-" , 3, 4, -1, EnumFacing.EAST );
addCoreBlocks(EnumTier.ADVANCED, 1, 0, 3, 0);
// superior reactor has core offset with larger radius
new ReactorFace(EnumTier.SUPERIOR, 0, "laser.superior.south+" , 1, 3, -4, EnumFacing.NORTH);
new ReactorFace(EnumTier.SUPERIOR, 1, "laser.superior.south-" , -1, 5, -4, EnumFacing.NORTH);
new ReactorFace(EnumTier.SUPERIOR, 2, "laser.superior.north-" , -1, 3, 4, EnumFacing.SOUTH);
new ReactorFace(EnumTier.SUPERIOR, 3, "laser.superior.north+" , 1, 5, 4, EnumFacing.SOUTH);
new ReactorFace(EnumTier.SUPERIOR, 4, "laser.superior.east-" , -4, 3, -1, EnumFacing.WEST );
new ReactorFace(EnumTier.SUPERIOR, 5, "laser.superior.east+" , -4, 5, 1, EnumFacing.WEST );
new ReactorFace(EnumTier.SUPERIOR, 6, "laser.superior.west+" , 4, 3, 1, EnumFacing.EAST );
new ReactorFace(EnumTier.SUPERIOR, 7, "laser.superior.west-" , 4, 5, -1, EnumFacing.EAST );
new ReactorFace(EnumTier.SUPERIOR, 8, "laser.superior.south--" , -2, 2, -4, EnumFacing.NORTH);
new ReactorFace(EnumTier.SUPERIOR, 9, "laser.superior.south++" , 2, 6, -4, EnumFacing.NORTH);
new ReactorFace(EnumTier.SUPERIOR, 10, "laser.superior.north++" , 2, 2, 4, EnumFacing.SOUTH);
new ReactorFace(EnumTier.SUPERIOR, 11, "laser.superior.north--" , -2, 6, 4, EnumFacing.SOUTH);
new ReactorFace(EnumTier.SUPERIOR, 12, "laser.superior.east++" , -4, 2, 2, EnumFacing.WEST );
new ReactorFace(EnumTier.SUPERIOR, 13, "laser.superior.east--" , -4, 6, -2, EnumFacing.WEST );
new ReactorFace(EnumTier.SUPERIOR, 14, "laser.superior.west--" , 4, 2, -2, EnumFacing.EAST );
new ReactorFace(EnumTier.SUPERIOR, 15, "laser.superior.west++" , 4, 6, 2, EnumFacing.EAST );
addCoreBlocks(EnumTier.SUPERIOR, 2, 0, 4, 0);
// pre-build the list of lasers in the structure
final HashMap<EnumTier, ArrayList<ReactorFace>> facesByTiers = new HashMap<>(EnumTier.length);
final HashMap<EnumTier, ArrayList<ReactorFace>> lasersByTiers = new HashMap<>(EnumTier.length);
for (final EnumTier tierLoop : EnumTier.values()) {
facesByTiers.put(tierLoop, new ArrayList<>(16));
lasersByTiers.put(tierLoop, new ArrayList<>(16));
}
for (final ReactorFace reactorFace : NAME_MAP.values()) {
if (reactorFace.enumTier == null) {
continue;
}
facesByTiers.get(reactorFace.enumTier).add(reactorFace);
if (reactorFace.indexStability >= 0) {
lasersByTiers.get(reactorFace.enumTier).add(reactorFace);
}
}
FACES_BY_TIER = new HashMap<>(EnumTier.length);
for (final Entry<EnumTier, ArrayList<ReactorFace>> entry : facesByTiers.entrySet()) {
FACES_BY_TIER.put(entry.getKey(), entry.getValue().toArray(new ReactorFace[0]));
}
int max = 0;
LASERS_BY_TIER = new HashMap<>(EnumTier.length);
final ArrayList<ReactorFace> lasers = new ArrayList<>(32);
for (final Entry<EnumTier, ArrayList<ReactorFace>> entry : lasersByTiers.entrySet()) {
LASERS_BY_TIER.put(entry.getKey(), entry.getValue().toArray(new ReactorFace[0]));
lasers.addAll(entry.getValue());
max = Math.max(max, entry.getValue().size());
}
LASERS = lasers.toArray(new ReactorFace[0]);
maxInstabilities = max;
}
private static void addCoreBlocks(final EnumTier enumTier, final int radius, final int xOffset, final int yOffset, final int zOffset) {
// square radius from center of block
final double sqRadiusHigh = (radius + 0.5D) * (radius + 0.5D);
// sphere
final int radiusCeil = radius + 1;
// Pass the cube and check points for sphere equation x^2 + y^2 + z^2 = r^2
for (int x = -radiusCeil; x <= radiusCeil; x++) {
final double x2 = (x + 0.5D) * (x + 0.5D);
for (int y = -radiusCeil; y <= radiusCeil; y++) {
final double x2y2 = x2 + (y + 0.5D) * (y + 0.5D);
for (int z = -radiusCeil; z <= radiusCeil; z++) {
final double sqRange = x2y2 + (z + 0.5D) * (z + 0.5D); // Square distance from current position to center
// Skip too far blocks
if (sqRange > sqRadiusHigh) {
continue;
}
new ReactorFace(enumTier,
-1,
String.format("core.%s.[%d,%d,%d]", enumTier.getName(), x, y, z),
xOffset + x, yOffset + y, zOffset + z,
null);
}
}
}
}
ReactorFace(final EnumTier enumTier, final int indexStability, final String name,
final int x, final int y, final int z,
final EnumFacing facingLaserProperty) {
this.enumTier = enumTier;
this.indexStability = indexStability;
this.name = name;
this.x = x;
this.y = y;
this.z = z;
this.facingLaserProperty = facingLaserProperty;
// register
NAME_MAP.put(name, this);
// add lens
if (facingLaserProperty != null) {
new ReactorFace(enumTier, -1, name + ".lens",
x - facingLaserProperty.getXOffset(),
y - facingLaserProperty.getYOffset(),
z - facingLaserProperty.getZOffset(),
null);
}
}
@Nonnull
public static ReactorFace[] get(@Nonnull final EnumTier tier) {
return FACES_BY_TIER.get(tier);
}
@Nonnull
public static ReactorFace[] getLasers() {
return LASERS;
}
@Nonnull
public static ReactorFace[] getLasers(@Nonnull final EnumTier tier) {
return LASERS_BY_TIER.get(tier);
}
@Nonnull
@Override
public String getName() {
return name;
}
public static ReactorFace get(final String name) {
return NAME_MAP.get(name);
}
}

View file

@ -108,7 +108,7 @@ function reactor_page()
local instabilities = { reactor.getInstabilities() } local instabilities = { reactor.getInstabilities() }
for key, instability in pairs(instabilities) do for key, instability in pairs(instabilities) do
local y = (key - 1) % 4 local y = (key - 1) % 4
local x = (key - y - 1) / 4 local x = (key - 1 - y) / 4
w.setCursorPos(2 + 6 * x, 3 + y) w.setCursorPos(2 + 6 * x, 3 + y)
local stability = math.floor((100.0 - instability) * 10) / 10.0 local stability = math.floor((100.0 - instability) * 10) / 10.0
if stability >= reactor_targetStability then if stability >= reactor_targetStability then
@ -136,7 +136,7 @@ function reactor_page()
w.write(w.format_boolean(isEnabled, "YES", "no")) w.write(w.format_boolean(isEnabled, "YES", "no"))
end end
w.setCursorPos(26, 2) w.setCursorPos(28, 2)
if #reactorlasers == 0 then if #reactorlasers == 0 then
w.setColorDisabled() w.setColorDisabled()
w.write("Lasers not detected") w.write("Lasers not detected")
@ -144,11 +144,11 @@ function reactor_page()
w.setColorNormal() w.setColorNormal()
w.write("Lasers charge (k)") w.write("Lasers charge (k)")
for key, reactorlaser in pairs(reactorlasers) do for _, reactorlaser in pairs(reactorlasers) do
if reactorlaser.wrap ~= nil then if reactorlaser.wrap ~= nil then
local y = (key - 1) % 4 local y = reactorlaser.side % 4
local x = (key - y - 1) / 4 local x = (reactorlaser.side - y) / 4
w.setCursorPos(26 + 7 * x, 3 + y) w.setCursorPos(28 + 6 * x, 3 + y)
local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus() local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus()
if energyStored == nil then if energyStored == nil then
energyStored = -1 energyStored = -1
@ -259,7 +259,7 @@ function reactor_pulse(output)
if w.page_getCallbackDisplay() == reactor_page and (not reactor_configPageLoaded) then if w.page_getCallbackDisplay() == reactor_page and (not reactor_configPageLoaded) then
for key, instability in pairs(instabilities) do for key, instability in pairs(instabilities) do
local y = (key - 1) % 4 local y = (key - 1) % 4
local x = (key - y - 1) / 4 local x = (key - 1 - y) / 4
w.setCursorPos(2 + 6 * x, 3 + y) w.setCursorPos(2 + 6 * x, 3 + y)
local stability = math.floor((100.0 - instability) * 10) / 10 local stability = math.floor((100.0 - instability) * 10) / 10
if stability >= reactor_targetStability then if stability >= reactor_targetStability then
@ -270,7 +270,7 @@ function reactor_pulse(output)
w.write(w.format_float(stability, 5)) w.write(w.format_float(stability, 5))
end end
local energyStored, energyMax, energyUnits, _, energyOutputRate = reactor.getEnergyStatus() local energyStored, _, _, _, energyOutputRate = reactor.getEnergyStatus()
w.setCursorPos(12, 7) w.setCursorPos(12, 7)
w.setColorNormal() w.setColorNormal()
w.write(w.format_integer(energyStored, 10)) w.write(w.format_integer(energyStored, 10))
@ -280,11 +280,11 @@ function reactor_pulse(output)
w.write(w.format_integer(energyOutputRate, 6)) w.write(w.format_integer(energyOutputRate, 6))
if #reactorlasers ~= 0 then if #reactorlasers ~= 0 then
for key, reactorlaser in pairs(reactorlasers) do for _, reactorlaser in pairs(reactorlasers) do
if key ~= nil and reactorlaser.wrap ~= nil then if reactorlaser.wrap ~= nil then
local y = (key - 1) % 4 local y = reactorlaser.side % 4
local x = (key - y - 1) / 4 local x = (reactorlaser.side - y) / 4
w.setCursorPos(26 + 7 * x, 3 + y) w.setCursorPos(28 + 6 * x, 3 + y)
local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus() local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus()
if energyStored == nil then if energyStored == nil then
energyStored = -1 energyStored = -1

View file

@ -107,7 +107,7 @@ function reactor_page()
local instabilities = { reactor.getInstabilities() } local instabilities = { reactor.getInstabilities() }
for key, instability in pairs(instabilities) do for key, instability in pairs(instabilities) do
local y = (key - 1) % 4 local y = (key - 1) % 4
local x = (key - y - 1) / 4 local x = (key - 1 - y) / 4
w.setCursorPos(2 + 6 * x, 3 + y) w.setCursorPos(2 + 6 * x, 3 + y)
local stability = math.floor((100.0 - instability) * 10) / 10.0 local stability = math.floor((100.0 - instability) * 10) / 10.0
if stability >= reactor_targetStability then if stability >= reactor_targetStability then
@ -135,7 +135,7 @@ function reactor_page()
w.write(w.format_boolean(isEnabled, "YES", "no")) w.write(w.format_boolean(isEnabled, "YES", "no"))
end end
w.setCursorPos(26, 2) w.setCursorPos(28, 2)
if #reactorlasers == 0 then if #reactorlasers == 0 then
w.setColorDisabled() w.setColorDisabled()
w.write("Lasers not detected") w.write("Lasers not detected")
@ -143,11 +143,11 @@ function reactor_page()
w.setColorNormal() w.setColorNormal()
w.write("Lasers charge (k)") w.write("Lasers charge (k)")
for key, reactorlaser in pairs(reactorlasers) do for _, reactorlaser in pairs(reactorlasers) do
if reactorlaser.wrap ~= nil then if reactorlaser.wrap ~= nil then
local y = (key - 1) % 4 local y = reactorlaser.side % 4
local x = (key - y - 1) / 4 local x = (reactorlaser.side - y) / 4
w.setCursorPos(26 + 7 * x, 3 + y) w.setCursorPos(28 + 6 * x, 3 + y)
local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus() local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus()
if energyStored == nil then if energyStored == nil then
energyStored = -1 energyStored = -1
@ -260,7 +260,7 @@ function reactor_pulse(output)
if w.page_getCallbackDisplay() == reactor_page and (not reactor_configPageLoaded) then if w.page_getCallbackDisplay() == reactor_page and (not reactor_configPageLoaded) then
for key, instability in pairs(instabilities) do for key, instability in pairs(instabilities) do
local y = (key - 1) % 4 local y = (key - 1) % 4
local x = (key - y - 1) / 4 local x = (key - 1 - y) / 4
w.setCursorPos(2 + 6 * x, 3 + y) w.setCursorPos(2 + 6 * x, 3 + y)
local stability = math.floor((100.0 - instability) * 10) / 10 local stability = math.floor((100.0 - instability) * 10) / 10
if stability >= reactor_targetStability then if stability >= reactor_targetStability then
@ -283,11 +283,11 @@ function reactor_pulse(output)
end end
if #reactorlasers ~= 0 then if #reactorlasers ~= 0 then
for key, reactorlaser in pairs(reactorlasers) do for _, reactorlaser in pairs(reactorlasers) do
if reactor_pulseStep == key and reactorlaser.wrap ~= nil then if reactorlaser.wrap ~= nil and reactor_pulseStep == key then
local y = (key - 1) % 4 local y = reactorlaser.side % 4
local x = (key - y - 1) / 4 local x = (reactorlaser.side - y) / 4
w.setCursorPos(26 + 7 * x, 3 + y) w.setCursorPos(28 + 6 * x, 3 + y)
local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus() local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus()
if energyStored == nil then if energyStored == nil then
energyStored = -1 energyStored = -1