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;
import cr0s.warpdrive.block.BlockAbstractContainer;
import cr0s.warpdrive.data.EnumReactorFace;
import cr0s.warpdrive.data.ReactorFace;
import cr0s.warpdrive.data.EnumTier;
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) {
super.breakBlock(world, blockPos, blockState);
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) {
for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
if (reactorFace.indexStability < 0) {
continue;
}
@ -68,7 +68,7 @@ public class BlockEnanReactorCore extends BlockAbstractContainer {
final TileEntity tileEntity = world.getTileEntity(blockPos.add(reactorFace.x, reactorFace.y, reactorFace.z));
if (tileEntity instanceof TileEntityEnanReactorLaser) {
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.config.WarpDriveConfig;
import cr0s.warpdrive.data.EnergyWrapper;
import cr0s.warpdrive.data.EnumReactorFace;
import cr0s.warpdrive.data.ReactorFace;
import cr0s.warpdrive.data.EnumReactorOutputMode;
import cr0s.warpdrive.data.Vector3;
import cr0s.warpdrive.network.PacketHandler;
@ -12,7 +12,6 @@ import cr0s.warpdrive.network.PacketHandler;
import javax.annotation.Nonnull;
import java.lang.ref.WeakReference;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import net.minecraft.block.state.IBlockState;
@ -46,7 +45,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private int stabilizerEnergy = 10000;
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
private boolean isFirstException = true;
@ -64,7 +63,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private long energyReleasedLastCycle = 0;
@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() {
super();
@ -135,7 +134,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
}
private void increaseInstability() {
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) {
for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
// increase instability
final int indexStability = reactorFace.indexStability;
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) {
return;
}
@ -164,7 +163,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
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;
if (lasersReceived > 1.0F) {
nospamFactor = 0.5;
@ -194,7 +193,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private void generateEnergy() {
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);
}
@ -218,7 +217,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
}
private void runControlLoop() {
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) {
for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
if (instabilityValues[reactorFace.indexStability] > instabilityTarget) {
final TileEntityEnanReactorLaser tileEntityEnanReactorLaser = getLaser(reactorFace);
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];
TileEntityEnanReactorLaser tileEntityEnanReactorLaser;
if (weakTileEntityLaser != null) {
@ -270,7 +269,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
private boolean shouldExplode() {
boolean exploding = false;
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) {
for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
exploding = exploding || (instabilityValues[reactorFace.indexStability] >= 100);
}
exploding &= (world.rand.nextInt(4) == 2);
@ -278,7 +277,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
if (exploding) {
final StringBuilder statusLasers = new StringBuilder();
final MutableBlockPos mutableBlockPos = new MutableBlockPos();
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) {
for (final ReactorFace reactorFace : ReactorFace.getLasers(enumTier)) {
long energyStored = -1L;
int countLaserMediums = 0;
mutableBlockPos.setPos(
@ -396,7 +395,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
// first check if we have the required 'air' blocks
boolean isValid = true;
for (final EnumReactorFace reactorFace : EnumReactorFace.get(enumTier)) {
for (final ReactorFace reactorFace : ReactorFace.get(enumTier)) {
assert reactorFace.enumTier == enumTier;
if (reactorFace.indexStability < 0) {
mutableBlockPos.setPos(pos.getX() + reactorFace.x,
@ -417,7 +416,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
}
// 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,
pos.getY() + reactorFace.y,
pos.getZ() + reactorFace.z);
@ -426,7 +425,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
if (isValid) {
((TileEntityEnanReactorLaser) tileEntity).setReactorFace(reactorFace, this);
} else {
((TileEntityEnanReactorLaser) tileEntity).setReactorFace(EnumReactorFace.UNKNOWN, null);
((TileEntityEnanReactorLaser) tileEntity).setReactorFace(ReactorFace.UNKNOWN, null);
}
} else {
final Vector3 vPosition = new Vector3(mutableBlockPos).translate(0.5D);
@ -461,11 +460,13 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
// computer is alive => start updating reactor
hold = false;
final ArrayList<Double> result = new ArrayList<>(16);
for (final EnumReactorFace reactorFace : EnumReactorFace.getLasers(enumTier)) {
result.add(reactorFace.indexStability, instabilityValues[reactorFace.indexStability]);
final ReactorFace[] lasers = ReactorFace.getLasers(enumTier);
final Double[] result = new Double[lasers.length];
for (final ReactorFace reactorFace : lasers) {
final double value = instabilityValues[reactorFace.indexStability];
result[reactorFace.indexStability] = value;
}
return result.toArray(new Double[0]);
return result;
}
@Override
@ -622,7 +623,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
tagCompound.setInteger("energy", containedEnergy);
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]);
}
tagCompound.setTag("instability", tagCompoundInstability);
@ -649,7 +650,7 @@ public class TileEntityEnanReactorCore extends TileEntityEnanReactorController {
containedEnergy = tagCompound.getInteger("energy");
final NBTTagCompound tagCompoundInstability = tagCompound.getCompoundTag("instability");
// 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) {
continue;
}

View file

@ -6,7 +6,7 @@ import cr0s.warpdrive.api.computer.IEnanReactorLaser;
import cr0s.warpdrive.block.TileEntityAbstractLaser;
import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.BlockProperties;
import cr0s.warpdrive.data.EnumReactorFace;
import cr0s.warpdrive.data.ReactorFace;
import cr0s.warpdrive.data.Vector3;
import cr0s.warpdrive.network.PacketHandler;
@ -30,7 +30,7 @@ import net.minecraftforge.fml.common.Optional;
public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implements IEnanReactorLaser {
// persistent properties
private EnumReactorFace reactorFace = EnumReactorFace.UNKNOWN;
private ReactorFace reactorFace = ReactorFace.UNKNOWN;
private int energyStabilizationRequest = 0;
// computed properties
@ -56,10 +56,10 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
protected void onFirstUpdateTick() {
super.onFirstUpdateTick();
if (reactorFace == EnumReactorFace.UNKNOWN) {
if (reactorFace == ReactorFace.UNKNOWN) {
final MutableBlockPos mutableBlockPos = new MutableBlockPos(pos);
// 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) {
continue;
}
@ -90,11 +90,11 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
}
@Nonnull
public EnumReactorFace getReactorFace() {
return reactorFace != null ? reactorFace : EnumReactorFace.UNKNOWN;
public ReactorFace getReactorFace() {
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
if (this.reactorFace == reactorFace) {
return;
@ -102,7 +102,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
// update properties
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
final IBlockState blockState_old = world.getBlockState(pos);
@ -123,7 +123,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
}
private TileEntityEnanReactorCore getReactorCore() {
if (reactorFace == EnumReactorFace.UNKNOWN) {
if (reactorFace == ReactorFace.UNKNOWN) {
return null;
}
TileEntityEnanReactorCore reactorCore = weakReactorCore != null ? weakReactorCore.get() : null;
@ -208,7 +208,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) {
tagCompound = super.writeToNBT(tagCompound);
tagCompound.setInteger("reactorFace", reactorFace.ordinal());
tagCompound.setString("reactorFace", reactorFace.getName());
tagCompound.setInteger("energyStabilizationRequest", energyStabilizationRequest);
return tagCompound;
}
@ -217,7 +217,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
public void readFromNBT(final NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound);
reactorFace = EnumReactorFace.get(tagCompound.getInteger("reactorFace"));
reactorFace = ReactorFace.get(tagCompound.getString("reactorFace"));
energyStabilizationRequest = tagCompound.getInteger("energyStabilizationRequest");
}
@ -225,7 +225,7 @@ public class TileEntityEnanReactorLaser extends TileEntityAbstractLaser implemen
// Common OC/CC methods
@Override
public Object[] isAssemblyValid() {
if (reactorFace == EnumReactorFace.UNKNOWN) {
if (reactorFace == ReactorFace.UNKNOWN) {
return new Object[] { false, "No reactor detected" };
}
return super.isAssemblyValid();

View file

@ -483,7 +483,7 @@ public class WarpDriveConfig {
// Enantiomorphic power reactor
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 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_MAX_RF_BY_TIER = { 64000, 64000, 192000, 576000 };
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 =
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);
ENAN_REACTOR_MAX_LASERS_PER_SECOND = Commons.clamp(4, 80,
config.get("enantiomorphic_reactor", "max_lasers", ENAN_REACTOR_MAX_LASERS_PER_SECOND, "Maximum number of stabilisation laser shots per seconds before loosing efficiency").getInt());
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").getIntList();
clampByTier(1, Integer.MAX_VALUE, ENAN_REACTOR_MAX_LASERS_PER_SECOND);
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();
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() }
for key, instability in pairs(instabilities) do
local y = (key - 1) % 4
local x = (key - y - 1) / 4
local x = (key - 1 - y) / 4
w.setCursorPos(2 + 6 * x, 3 + y)
local stability = math.floor((100.0 - instability) * 10) / 10.0
if stability >= reactor_targetStability then
@ -136,7 +136,7 @@ function reactor_page()
w.write(w.format_boolean(isEnabled, "YES", "no"))
end
w.setCursorPos(26, 2)
w.setCursorPos(28, 2)
if #reactorlasers == 0 then
w.setColorDisabled()
w.write("Lasers not detected")
@ -144,11 +144,11 @@ function reactor_page()
w.setColorNormal()
w.write("Lasers charge (k)")
for key, reactorlaser in pairs(reactorlasers) do
for _, reactorlaser in pairs(reactorlasers) do
if reactorlaser.wrap ~= nil then
local y = (key - 1) % 4
local x = (key - y - 1) / 4
w.setCursorPos(26 + 7 * x, 3 + y)
local y = reactorlaser.side % 4
local x = (reactorlaser.side - y) / 4
w.setCursorPos(28 + 6 * x, 3 + y)
local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus()
if energyStored == nil then
energyStored = -1
@ -259,7 +259,7 @@ function reactor_pulse(output)
if w.page_getCallbackDisplay() == reactor_page and (not reactor_configPageLoaded) then
for key, instability in pairs(instabilities) do
local y = (key - 1) % 4
local x = (key - y - 1) / 4
local x = (key - 1 - y) / 4
w.setCursorPos(2 + 6 * x, 3 + y)
local stability = math.floor((100.0 - instability) * 10) / 10
if stability >= reactor_targetStability then
@ -270,7 +270,7 @@ function reactor_pulse(output)
w.write(w.format_float(stability, 5))
end
local energyStored, energyMax, energyUnits, _, energyOutputRate = reactor.getEnergyStatus()
local energyStored, _, _, _, energyOutputRate = reactor.getEnergyStatus()
w.setCursorPos(12, 7)
w.setColorNormal()
w.write(w.format_integer(energyStored, 10))
@ -280,11 +280,11 @@ function reactor_pulse(output)
w.write(w.format_integer(energyOutputRate, 6))
if #reactorlasers ~= 0 then
for key, reactorlaser in pairs(reactorlasers) do
if key ~= nil and reactorlaser.wrap ~= nil then
local y = (key - 1) % 4
local x = (key - y - 1) / 4
w.setCursorPos(26 + 7 * x, 3 + y)
for _, reactorlaser in pairs(reactorlasers) do
if reactorlaser.wrap ~= nil then
local y = reactorlaser.side % 4
local x = (reactorlaser.side - y) / 4
w.setCursorPos(28 + 6 * x, 3 + y)
local energyStored, _, _ = reactorlaser.wrap.getEnergyStatus()
if energyStored == nil then
energyStored = -1

View file

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