Refactored Jump interfaces

Added diagonal and rotation jumps support
Added fine movement in hyperspace dimension
Updated CC ship default LUA to match its OC counterpart
Removed ship size impact on interfaces
Improved ship dimension update to be more tolerant
This commit is contained in:
LemADEC 2016-03-13 21:17:09 +01:00
parent 763f0308f5
commit 696c7d3da5
8 changed files with 1419 additions and 866 deletions

View file

@ -16,6 +16,7 @@ import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
@ -26,6 +27,7 @@ import net.minecraftforge.common.ForgeChunkManager;
import net.minecraftforge.common.ForgeChunkManager.Ticket;
import net.minecraftforge.common.ForgeChunkManager.Type;
import cr0s.warpdrive.api.IBlockTransformer;
import cr0s.warpdrive.api.ITransformation;
import cr0s.warpdrive.block.movement.TileEntityShipCore;
import cr0s.warpdrive.config.Dictionary;
import cr0s.warpdrive.config.WarpDriveConfig;
@ -42,8 +44,8 @@ public class EntityJump extends Entity {
// Jump vector
private Transformation transformation;
private int distance;
public int shipLength;
private int moveX, moveY, moveZ;
private byte rotationSteps;
private boolean isHyperspaceJump;
private World targetWorld;
@ -64,7 +66,7 @@ public class EntityJump extends Entity {
private int state = STATE_IDLE;
private int currentIndexInShip = 0;
public JumpShip ship = new JumpShip();
public JumpShip ship;
private boolean betweenWorlds;
private int destX, destY, destZ;
@ -76,35 +78,38 @@ public class EntityJump extends Entity {
public EntityJump(World world) {
super(world);
targetWorld = worldObj;
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Entity created (empty) in dimension " + worldObj.getProviderName() + " - " + worldObj.getWorldInfo().getWorldName());
if (!world.isRemote) {
WarpDrive.logger.error(this + " Entity created (empty) in dimension " + worldObj.getProviderName() + " - " + worldObj.getWorldInfo().getWorldName());
}
}
public EntityJump(World world, int x, int y, int z, int _dx, int _dz, TileEntityShipCore _shipCore, boolean _isHyperspaceJump, int _distance, int _direction,
boolean _isCoordJump, int _destX, int _destY, int _destZ) {
public EntityJump(World world, int x, int y, int z, int _dx, int _dz, TileEntityShipCore shipCore, boolean isHyperspaceJump,
final int moveX, final int moveY, final int moveZ, final byte rotationSteps,
boolean isCoordJump, int destX, int destY, int destZ) {
super(world);
this.posX = x + 0.5D;
this.posY = y + 0.5D;
this.posZ = z + 0.5D;
this.ship = new JumpShip();
this.ship.worldObj = worldObj;
this.ship.coreX = x;
this.ship.coreY = y;
this.ship.coreZ = z;
this.ship.dx = _dx;
this.ship.dz = _dz;
this.ship.shipCore = _shipCore;
this.isHyperspaceJump = _isHyperspaceJump;
this.distance = _distance;
this.ship.direction = _direction;
this.isCoordJump = _isCoordJump;
this.destX = _destX;
this.destY = _destY;
this.destZ = _destZ;
this.ship.shipCore = shipCore;
this.isHyperspaceJump = isHyperspaceJump;
this.moveX = moveX;
this.moveY = moveY;
this.moveZ = moveZ;
this.rotationSteps = rotationSteps;
this.isCoordJump = isCoordJump;
this.destX = destX;
this.destY = destY;
this.destZ = destZ;
// set by reactor
ship.maxX = ship.maxZ = ship.maxY = ship.minX = ship.minZ = ship.minY = 0;
shipLength = 0;
// set when preparing jump
targetWorld = null;
@ -292,25 +297,6 @@ public class EntityJump extends Entity {
LocalProfiler.stop();
}
public static String getDirectionLabel(int direction) {
switch (direction) {
case -1:
return "UP";
case -2:
return "DOWN";
case 0:
return "FRONT";
case 180:
return "BACK";
case 90:
return "LEFT";
case 255:
return "RIGHT";
default:
return direction + " degrees";
}
}
private void prepareToJump() {
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Preparing to jump...");
@ -322,14 +308,37 @@ public class EntityJump extends Entity {
boolean isInSpace = (worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID);
boolean isInHyperSpace = (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID);
boolean toSpace = (ship.direction == -1) && (ship.maxY + distance > 255) && (!isInSpace) && (!isInHyperSpace);
boolean fromSpace = (ship.direction == -2) && (ship.minY - distance < 0) && isInSpace;
boolean toSpace = (moveY > 0) && (ship.maxY + moveY > 255) && (!isInSpace) && (!isInHyperSpace);
boolean fromSpace = (moveY < 0) && (ship.minY + moveY < 0) && isInSpace;
betweenWorlds = fromSpace || toSpace || isHyperspaceJump;
int moveX = 0;
int moveY = 0;
int moveZ = 0;
if (!isHyperspaceJump && toSpace) {
if (isHyperspaceJump) {
if (isInHyperSpace) {
targetWorld = MinecraftServer.getServer().worldServerForDimension(WarpDriveConfig.G_SPACE_DIMENSION_ID);
if (targetWorld == null) {
LocalProfiler.stop();
String msg = "Unable to load Space dimension " + WarpDriveConfig.G_SPACE_DIMENSION_ID + ", aborting jump.";
ship.messageToAllPlayersOnShip(this, msg);
killEntity(msg);
return;
}
} else if (isInSpace) {
targetWorld = MinecraftServer.getServer().worldServerForDimension(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID);
if (targetWorld == null) {
LocalProfiler.stop();
String msg = "Unable to load Hyperspace dimension " + WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID + ", aborting jump.";
ship.messageToAllPlayersOnShip(this, msg);
killEntity(msg);
return;
}
} else {
String msg = "Unable to reach hyperspace from a planet";
killEntity(msg);
ship.messageToAllPlayersOnShip(this, msg);
LocalProfiler.stop();
return;
}
} else if (toSpace) {
Boolean planetFound = false;
Boolean planetValid = false;
int closestPlanetDistance = Integer.MAX_VALUE;
@ -359,7 +368,7 @@ public class EntityJump extends Entity {
}
if (!planetFound) {
LocalProfiler.stop();
String msg = "Unable to reach space!\nThere's no valid transition plane for current dimension " + worldObj.provider.getDimensionName() + " ("
String msg = "Unable to reach space!\nThere's not planet defined for current dimension " + worldObj.provider.getDimensionName() + " ("
+ worldObj.provider.dimensionId + ")";
ship.messageToAllPlayersOnShip(this, msg);
killEntity(msg);
@ -378,7 +387,7 @@ public class EntityJump extends Entity {
killEntity(msg);
return;
}
} else if (!isHyperspaceJump && fromSpace) {
} else if (fromSpace) {
Boolean planetFound = false;
int closestPlaneDistance = Integer.MAX_VALUE;
Planet closestTransitionPlane = null;
@ -408,7 +417,7 @@ public class EntityJump extends Entity {
if (closestTransitionPlane == null) {
msg = "No planet defined, unable to enter atmosphere!";
} else {
msg = "No planet in range, unable to enter atmosphere!\nClosest transition plane is " + closestPlaneDistance + " m away ("
msg = "No planet in range, unable to enter atmosphere!\nClosest planet is " + closestPlaneDistance + " m away ("
+ (closestTransitionPlane.spaceCenterX - closestTransitionPlane.borderSizeX) + ", 250,"
+ (closestTransitionPlane.spaceCenterZ - closestTransitionPlane.borderSizeZ) + ") to ("
+ (closestTransitionPlane.spaceCenterX + closestTransitionPlane.borderSizeX) + ", 255,"
@ -418,24 +427,6 @@ public class EntityJump extends Entity {
killEntity(msg);
return;
}
} else if (isHyperspaceJump && isInHyperSpace) {
targetWorld = MinecraftServer.getServer().worldServerForDimension(WarpDriveConfig.G_SPACE_DIMENSION_ID);
if (targetWorld == null) {
LocalProfiler.stop();
String msg = "Unable to load Space dimension " + WarpDriveConfig.G_SPACE_DIMENSION_ID + ", aborting jump.";
ship.messageToAllPlayersOnShip(this, msg);
killEntity(msg);
return;
}
} else if (isHyperspaceJump && isInSpace) {
targetWorld = MinecraftServer.getServer().worldServerForDimension(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID);
if (targetWorld == null) {
LocalProfiler.stop();
String msg = "Unable to load Hyperspace dimension " + WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID + ", aborting jump.";
ship.messageToAllPlayersOnShip(this, msg);
killEntity(msg);
return;
}
} else {
targetWorld = worldObj;
}
@ -443,19 +434,9 @@ public class EntityJump extends Entity {
// Calculate jump vector
if (isCoordJump) {
moveX = destX - ship.coreX;
moveZ = destZ - ship.coreZ;
moveY = destY - ship.coreY;
distance = 0; // FIXME: check collision in straight path, starting with getPossibleJumpDistance() ?
} else if (isHyperspaceJump) {
distance = 0;
if (!isInSpace && !isInHyperSpace) {
String msg = "Unable to reach hyperspace from a planet";
killEntity(msg);
ship.messageToAllPlayersOnShip(this, msg);
LocalProfiler.stop();
return;
}
} else {
moveZ = destZ - ship.coreZ;
} else if (!isHyperspaceJump) {
if (toSpace) {
// enter space at current altitude
moveY = 0;
@ -464,15 +445,10 @@ public class EntityJump extends Entity {
moveY = 245 - ship.maxY;
} else {
// Do not check in long jumps
if (distance < 256) {
distance = getPossibleJumpDistance();
if (Math.max(moveX, moveZ) < 256) {
getPossibleJumpDistance();
}
int movementVector[] = getVector(ship.direction);
moveX = movementVector[0] * distance;
moveY = movementVector[1] * distance;
moveZ = movementVector[2] * distance;
if ((ship.maxY + moveY) > 255) {
moveY = 255 - ship.maxY;
}
@ -482,7 +458,7 @@ public class EntityJump extends Entity {
}
}
}
transformation = new Transformation(ship, targetWorld, moveX, moveY, moveZ, (byte) 0);
transformation = new Transformation(ship, targetWorld, moveX, moveY, moveZ, rotationSteps);
if (betweenWorlds && WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " From world " + worldObj.provider.getDimensionName() + " to " + targetWorld.provider.getDimensionName());
@ -490,7 +466,14 @@ public class EntityJump extends Entity {
// Validate positions aren't overlapping
if (!betweenWorlds) {
if (Math.abs(moveX) <= (ship.maxX - ship.minX + 1) && Math.abs(moveY) <= (ship.maxY - ship.minY + 1) && Math.abs(moveZ) <= (ship.maxZ - ship.minZ + 1)) {
ChunkCoordinates target1 = transformation.apply(ship.minX, ship.minY, ship.minZ);
ChunkCoordinates target2 = transformation.apply(ship.maxX, ship.maxY, ship.maxZ);
AxisAlignedBB aabbSource = AxisAlignedBB.getBoundingBox(ship.minX, ship.minY, ship.minZ, ship.maxX, ship.maxY, ship.maxZ);
aabbSource.expand(1.0D, 1.0D, 1.0D);
AxisAlignedBB aabbTarget = AxisAlignedBB.getBoundingBox(
Math.min(target1.posX, target2.posX), Math.min(target1.posY, target2.posY), Math.min(target1.posZ, target2.posZ),
Math.max(target1.posX, target2.posX), Math.max(target1.posY, target2.posY), Math.max(target1.posZ, target2.posZ));
if (aabbSource.intersectsWith(aabbTarget)) {
// render fake explosions
doCollisionDamage(false);
@ -529,9 +512,22 @@ public class EntityJump extends Entity {
} else if (isHyperspaceJump && isInHyperSpace) {
ship.messageToAllPlayersOnShip(this, "Leaving HYPERSPACE..");
} else if (isCoordJump) {
ship.messageToAllPlayersOnShip(this, "Jumping to coordinates (" + destX + "; " + ship.coreY + "; " + destZ + ")!");
ship.messageToAllPlayersOnShip(this, "Jumping to coordinates (" + destX + " " + destY + " " + destZ + ")!");
} else {
ship.messageToAllPlayersOnShip(this, "Jumping " + getDirectionLabel(ship.direction) + " by " + distance + " blocks");
ship.messageToAllPlayersOnShip(this, "Jumping of " + Math.round(Math.sqrt(moveX * moveX + moveY * moveY + moveZ * moveZ)) + " blocks (" + moveX + " " + moveY + " " + moveZ + ")");
}
switch (rotationSteps) {
case 1:
ship.messageToAllPlayersOnShip(this, "Turning to the right");
break;
case 2:
ship.messageToAllPlayersOnShip(this, "Turning back");
break;
case 3:
ship.messageToAllPlayersOnShip(this, "Turning to the left");
break;
default:
break;
}
// validate ship content
@ -791,14 +787,15 @@ public class EntityJump extends Entity {
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Calculating possible jump distance...");
}
int testDistance = this.distance;
int originalRange = Math.max(Math.abs(moveX), Math.max(Math.abs(moveY), Math.abs(moveZ)));
int testRange = originalRange;
int blowPoints = 0;
collisionDetected = false;
CheckMovementResult result = null;
while (testDistance >= 0) {
while (testRange >= 0) {
// Is there enough space in destination point?
result = checkMovement(testDistance, false);
result = checkMovement(testRange / (double)originalRange, false);
if (result == null) {
break;
@ -807,16 +804,20 @@ public class EntityJump extends Entity {
if (result.isCollision) {
blowPoints++;
}
testDistance--;
testRange--;
}
VectorI finalMovement = getMovementVector(testRange / (double)originalRange);
moveX = finalMovement.x;
moveY = finalMovement.y;
moveZ = finalMovement.z;
if (distance != testDistance && WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Jump distance adjusted to " + testDistance + " after " + blowPoints + " collisions");
if (originalRange != testRange && WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Jump range adjusted from " + originalRange + " to " + testRange + " after " + blowPoints + " collisions");
}
// Register explosion(s) at collision point
if (blowPoints > WarpDriveConfig.SHIP_COLLISION_TOLERANCE_BLOCKS) {
result = checkMovement(Math.max(1, testDistance + 1), true);
result = checkMovement(Math.max(1, testRange + 1), true);
if (result != null) {
/*
* Strength scaling:
@ -834,15 +835,15 @@ public class EntityJump extends Entity {
collisionStrength = (4.0F + blowPoints - WarpDriveConfig.SHIP_COLLISION_TOLERANCE_BLOCKS) * massCorrection;
collisionAtSource = result.atSource;
collisionAtTarget = result.atTarget;
WarpDrive.logger.info(this + " Reporting " + collisionAtTarget.size() + " collisions coordinates " + blowPoints
+ " blowPoints with massCorrection of " + String.format("%.2f", massCorrection) + " => strength "
+ String.format("%.2f", collisionStrength));
WarpDrive.logger.info(this + " Reporting " + collisionAtTarget.size() + " collisions points after " + blowPoints
+ " blowPoints with " + String.format("%.2f", massCorrection) + " ship mass correction => "
+ String.format("%.2f", collisionStrength) + " explosion strength");
} else {
WarpDrive.logger.error("WarpDrive error: unable to compute collision points, ignoring...");
}
}
return testDistance;
return testRange;
}
private void doCollisionDamage(boolean atTarget) {
@ -1007,46 +1008,6 @@ public class EntityJump extends Entity {
return true;
}
public int[] getVector(int i) {
int v[] = { 0, 0, 0 };
switch (i) {
case -1:
v[1] = 1;
break;
case -2:
v[1] = -1;
break;
case 0:
v[0] = ship.dx;
v[2] = ship.dz;
break;
case 180:
v[0] = -ship.dx;
v[2] = -ship.dz;
break;
case 90:
v[0] = ship.dz;
v[2] = -ship.dx;
break;
case 270:
v[0] = -ship.dz;
v[2] = ship.dx;
break;
default:
WarpDrive.logger.error(this + " Invalid direction " + i);
break;
}
return v;
}
class CheckMovementResult {
public ArrayList<Vector3> atSource;
public ArrayList<Vector3> atTarget;
@ -1071,42 +1032,40 @@ public class EntityJump extends Entity {
}
};
private CheckMovementResult checkMovement(int testDistance, boolean fullCollisionDetails) {
private CheckMovementResult checkMovement(final double ratio, final boolean fullCollisionDetails) {
CheckMovementResult result = new CheckMovementResult();
if ((ship.direction == -1 && ship.maxY + testDistance > 255) && !betweenWorlds) {
result.add(ship.coreX, ship.maxY + testDistance, ship.coreZ, ship.coreX + 0.5D, ship.maxY + testDistance + 1.0D, ship.coreZ + 0.5D, false,
"Reactor will blow due +high limit");
VectorI testMovement = getMovementVector(ratio);
VectorI offset = new VectorI((int)Math.signum(moveX), (int)Math.signum(moveY), (int)Math.signum(moveZ));
if ((moveY > 0 && ship.maxY + testMovement.y > 255) && !betweenWorlds) {
result.add(ship.coreX, ship.maxY + testMovement.y, ship.coreZ, ship.coreX + 0.5D, ship.maxY + testMovement.y + 1.0D, ship.coreZ + 0.5D, false,
"Ship core is moving too high");
return result;
}
if ((ship.direction == -2 && ship.minY - testDistance <= 8) && !betweenWorlds) {
result.add(ship.coreX, ship.minY - testDistance, ship.coreZ, ship.coreX + 0.5D, ship.maxY - testDistance, ship.coreZ + 0.5D, false, "Reactor will blow due -low limit");
if ((moveY < 0 && ship.minY + testMovement.y <= 8) && !betweenWorlds) {
result.add(ship.coreX, ship.minY + testMovement.y, ship.coreZ, ship.coreX + 0.5D, ship.maxY + testMovement.y, ship.coreZ + 0.5D, false,
"Ship core is moving too low");
return result;
}
int movementVector[] = getVector(ship.direction);
int lmoveX = movementVector[0] * testDistance;
int lmoveY = movementVector[1] * testDistance;
int lmoveZ = movementVector[2] * testDistance;
int x, y, z, newX, newY, newZ;
int x, y, z;
ITransformation testTransformation = new Transformation(ship, targetWorld, testMovement.x, testMovement.y, testMovement.z, rotationSteps);
ChunkCoordinates coordTarget;
Block blockSource;
Block blockTarget;
for (y = ship.minY; y <= ship.maxY; y++) {
newY = y + lmoveY;
for (x = ship.minX; x <= ship.maxX; x++) {
newX = x + lmoveX;
for (z = ship.minZ; z <= ship.maxZ; z++) {
newZ = z + lmoveZ;
coordTarget = testTransformation.apply(x, y, z);
blockSource = worldObj.getBlock(x, y, z);
blockTarget = worldObj.getBlock(newX, newY, newZ);
blockTarget = worldObj.getBlock(coordTarget.posX, coordTarget.posY, coordTarget.posZ);
if (Dictionary.BLOCKS_ANCHOR.contains(blockTarget)) {
result.add(x, y, z,
newX + 0.5D - movementVector[0] * 1.0D,
newY + 0.5D - movementVector[1] * 1.0D,
newZ + 0.5D - movementVector[2] * 1.0D,
true, "Unpassable block " + blockTarget + " detected at destination (" + newX + ";" + newY + ";" + newZ + ")");
coordTarget.posX + 0.5D - offset.x,
coordTarget.posY + 0.5D - offset.y,
coordTarget.posZ + 0.5D - offset.z,
true, "Unpassable block " + blockTarget + " detected at destination (" + coordTarget.posX + " " + coordTarget.posY + " " + coordTarget.posZ + ")");
if (!fullCollisionDetails) {
return result;
}
@ -1117,10 +1076,10 @@ public class EntityJump extends Entity {
&& blockTarget != Blocks.air
&& !Dictionary.BLOCKS_EXPANDABLE.contains(blockTarget)) {
result.add(x, y, z,
newX + 0.5D + movementVector[0] * 0.1D,
newY + 0.5D + movementVector[1] * 0.1D,
newZ + 0.5D + movementVector[2] * 0.1D,
true, "Obstacle block #" + blockTarget + " detected at (" + newX + ", " + newY + ", " + newZ + ")");
coordTarget.posX + 0.5D + offset.x * 0.1D,
coordTarget.posY + 0.5D + offset.y * 0.1D,
coordTarget.posZ + 0.5D + offset.z * 0.1D,
true, "Obstacle block " + blockTarget + " detected at (" + coordTarget.posX + " " + coordTarget.posY + " " + coordTarget.posZ + ")");
if (!fullCollisionDetails) {
return result;
}
@ -1136,6 +1095,10 @@ public class EntityJump extends Entity {
}
}
private VectorI getMovementVector(final double ratio) {
return new VectorI((int)Math.round(moveX * ratio), (int)Math.round(moveY * ratio), (int)Math.round(moveZ * ratio));
}
private static ArrayList<Object> removeDuplicates(List<TileEntity> l) {
Set<TileEntity> s = new TreeSet<TileEntity>(new Comparator<TileEntity>() {
@Override

View file

@ -16,6 +16,7 @@ import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.block.TileEntityAbstractInterfaced;
import cr0s.warpdrive.block.movement.TileEntityShipCore.ShipCoreMode;
import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.VectorI;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.peripheral.IComputerAccess;
@ -27,6 +28,10 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
// Variables
private int distance = 0;
private int direction = 0;
private int moveFront = 0;
private int moveUp = 0;
private int moveRight = 0;
private byte rotationSteps = 0;
private ShipCoreMode mode = ShipCoreMode.IDLE;
private boolean jumpFlag = false;
@ -76,7 +81,9 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
"isInHyperspace",
"targetJumpgate",
"isAttached",
"getEnergyRequired"
"getEnergyRequired",
"movement",
"rotationSteps"
});
CC_scripts = Arrays.asList("startup");
}
@ -111,7 +118,7 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
}
}
private void setMode(int mode) {
private void setMode(final int mode) {
ShipCoreMode[] modes = ShipCoreMode.values();
if (mode >= 0 && mode <= modes.length) {
this.mode = modes[mode];
@ -121,21 +128,37 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
}
}
private void setDirection(int dir) {
if (dir == 1) {
private void setDirection(final int parDirection) {
if (parDirection == 1) {
this.direction = -1;
} else if (dir == 2) {
} else if (parDirection == 2) {
this.direction = -2;
} else if (dir == 255) {
} else if (parDirection == 255) {
this.direction = 270;
} else {
this.direction = dir;
this.direction = parDirection;
}
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Direction set to " + direction);
}
}
private void setMovement(final int parMoveFront, final int parMoveUp, final int parMoveRight) {
moveFront = parMoveFront;
moveUp = parMoveUp;
moveRight = parMoveRight;
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Movement set to " + moveFront + " front, " + moveUp + " up, " + moveRight + " right");
}
}
private void setRotationSteps(final byte parRotationSteps) {
rotationSteps = (byte) ((parRotationSteps + 4) % 4);
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " RotationSteps set to " + rotationSteps);
}
}
private void doJump() {
if (core != null) {
// Adding random ticks to warmup
@ -159,6 +182,8 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
setDown(tag.getInteger("down"));
setDistance(tag.getInteger("distance"));
setDirection(tag.getInteger("direction"));
setMovement(tag.getInteger("moveFront"), tag.getInteger("moveUp"), tag.getInteger("moveRight"));
setRotationSteps(tag.getByte("rotationSteps"));
playersString = tag.getString("players");
updatePlayersList();
setBeaconFrequency(tag.getString("bfreq"));
@ -169,15 +194,19 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
super.writeToNBT(tag);
updatePlayersString();
tag.setString("players", playersString);
tag.setInteger("mode", this.mode.getCode());
tag.setInteger("front", this.front);
tag.setInteger("right", this.right);
tag.setInteger("up", this.up);
tag.setInteger("back", this.back);
tag.setInteger("left", this.left);
tag.setInteger("down", this.down);
tag.setInteger("distance", this.distance);
tag.setInteger("direction", this.direction);
tag.setInteger("mode", mode.getCode());
tag.setInteger("front", front);
tag.setInteger("right", right);
tag.setInteger("up", up);
tag.setInteger("back", back);
tag.setInteger("left", left);
tag.setInteger("down", down);
tag.setInteger("distance", distance);
tag.setInteger("direction", direction);
tag.setInteger("moveFront", moveFront);
tag.setInteger("moveUp", moveUp);
tag.setInteger("moveRight", moveRight);
tag.setByte("rotationSteps", rotationSteps);
tag.setString("bfreq", getBeaconFrequency());
// FIXME: shouldn't we save boolean jumpFlag, boolean summonFlag, String toSummon, String targetJumpgateName?
}
@ -375,13 +404,6 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
return this.distance;
}
/**
* @return current reactor mode
*/
public ShipCoreMode getMode() {
return mode;
}
/**
* @return the direction
*/
@ -389,6 +411,20 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
return direction;
}
/**
* @return the rotation steps
*/
public byte getRotationSteps() {
return rotationSteps;
}
/**
* @return current reactor mode
*/
public ShipCoreMode getMode() {
return mode;
}
/**
* @return the summonFlag
*/
@ -397,8 +433,7 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
}
/**
* @param summonFlag
* to set
* @param summonFlag to set
*/
public void setSummonAllFlag(boolean summonFlag) {
this.summonFlag = summonFlag;
@ -412,8 +447,7 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
}
/**
* @param toSummon
* the toSummon to set
* @param toSummon the toSummon to set
*/
public void setToSummon(String toSummon) {
this.toSummon = toSummon;
@ -427,11 +461,12 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
}
/**
* @param beaconFrequency
* the beaconFrequency to set
* @param beaconFrequency the beaconFrequency to set
*/
public void setBeaconFrequency(String beaconFrequency) {
//WarpDrive.debugPrint("Setting beacon frequency: " + beaconFrequency);
if (WarpDriveConfig.LOGGING_LUA) {
WarpDrive.logger.info(this + " Beacon frequency set to " + beaconFrequency);
}
this.beaconFrequency = beaconFrequency;
}
@ -492,6 +527,18 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
return direction(argumentsOCtoCC(arguments));
}
@Callback
@Optional.Method(modid = "OpenComputers")
public Object[] movement(Context context, Arguments arguments) {
return movement(argumentsOCtoCC(arguments));
}
@Callback
@Optional.Method(modid = "OpenComputers")
public Object[] rotationSteps(Context context, Arguments arguments) {
return rotationSteps(argumentsOCtoCC(arguments));
}
@Callback
@Optional.Method(modid = "OpenComputers")
public Object[] getAttachedPlayers(Context context, Arguments arguments) {
@ -607,20 +654,17 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
try {
if (arguments.length == 3) {
int argInt0, argInt1, argInt2;
argInt0 = toInt(arguments[0]);
argInt1 = toInt(arguments[1]);
argInt2 = toInt(arguments[2]);
if (argInt0 < 0 || argInt1 < 0 || argInt2 < 0) {
return new Integer[] { getFront(), getRight(), getUp() };
}
if (WarpDriveConfig.LOGGING_JUMP) {
argInt0 = clamp(0, WarpDriveConfig.SHIP_MAX_SIDE_SIZE, Math.abs(toInt(arguments[0])));
argInt1 = clamp(0, WarpDriveConfig.SHIP_MAX_SIDE_SIZE, Math.abs(toInt(arguments[1])));
argInt2 = clamp(0, WarpDriveConfig.SHIP_MAX_SIDE_SIZE, Math.abs(toInt(arguments[2])));
if (WarpDriveConfig.LOGGING_LUA) {
WarpDrive.logger.info(this + " Positive dimensions set to front " + argInt0 + ", right " + argInt1 + ", up " + argInt2);
}
setFront(argInt0);
setRight(argInt1);
setUp(argInt2);
setUp(Math.min(255 - yCoord, argInt2));
}
} catch (Exception e) {
} catch (Exception exception) {
return new Integer[] { getFront(), getRight(), getUp() };
}
@ -631,20 +675,17 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
try {
if (arguments.length == 3) {
int argInt0, argInt1, argInt2;
argInt0 = toInt(arguments[0]);
argInt1 = toInt(arguments[1]);
argInt2 = toInt(arguments[2]);
if (argInt0 < 0 || argInt1 < 0 || argInt2 < 0) {
return new Integer[] { getBack(), getLeft(), getDown() };
}
if (WarpDriveConfig.LOGGING_JUMP) {
argInt0 = clamp(0, WarpDriveConfig.SHIP_MAX_SIDE_SIZE, Math.abs(toInt(arguments[0])));
argInt1 = clamp(0, WarpDriveConfig.SHIP_MAX_SIDE_SIZE, Math.abs(toInt(arguments[1])));
argInt2 = clamp(0, WarpDriveConfig.SHIP_MAX_SIDE_SIZE, Math.abs(toInt(arguments[2])));
if (WarpDriveConfig.LOGGING_LUA) {
WarpDrive.logger.info(this + " Negative dimensions set to back " + argInt0 + ", left " + argInt1 + ", down " + argInt2);
}
setBack(argInt0);
setLeft(argInt1);
setDown(argInt2);
setDown(Math.min(yCoord, argInt2));
}
} catch (Exception e) {
} catch (Exception exception) {
return new Integer[] { getBack(), getLeft(), getDown() };
}
@ -656,7 +697,7 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
if (arguments.length == 1) {
setMode(toInt(arguments[0]));
}
} catch (Exception e) {
} catch (Exception exception) {
return new Integer[] { mode.getCode() };
}
@ -668,7 +709,7 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
if (arguments.length == 1) {
setDistance(toInt(arguments[0]));
}
} catch (Exception e) {
} catch (Exception exception) {
return new Integer[] { getDistance() };
}
@ -680,13 +721,37 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
if (arguments.length == 1) {
setDirection(toInt(arguments[0]));
}
} catch (Exception e) {
} catch (Exception exception) {
return new Integer[] { getDirection() };
}
return new Integer[] { getDirection() };
}
private Object[] movement(Object[] arguments) {
try {
if (arguments.length == 3) {
setMovement(toInt(arguments[0]), toInt(arguments[1]), toInt(arguments[2]));
}
} catch (Exception exception) {
return new Integer[] { moveFront, moveUp, moveRight };
}
return new Integer[] { moveFront, moveUp, moveRight };
}
private Object[] rotationSteps(Object[] arguments) {
try {
if (arguments.length == 1) {
setRotationSteps((byte)toInt(arguments[0]));
}
} catch (Exception exception) {
return new Integer[] { (int) rotationSteps };
}
return new Integer[] { (int) rotationSteps };
}
private Object[] getAttachedPlayers(Object[] arguments) {
String list = "";
@ -707,7 +772,7 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
}
try {
playerIndex = toInt(arguments[0]);
} catch (Exception e) {
} catch (Exception exception) {
return new Object[] { false };
}
@ -856,6 +921,12 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
if (core != null) {
return new Object[] { (boolean) (core.controller != null) };
}
} else if (methodName.equals("movement")) {
return movement(arguments);
} else if (methodName.equals("rotationSteps")) {
return rotationSteps(arguments);
}
return super.callMethod(computer, context, method, arguments);
@ -876,6 +947,35 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
targetJumpgateName = parTargetJumpgateName;
}
public VectorI getMovement() {
if (moveFront != 0 || moveUp != 0 || moveRight != 0) {
return new VectorI(moveFront, moveUp, moveRight);
}
switch (direction) {
case -1:
return new VectorI(0, distance, 0);
case -2:
return new VectorI(0, -distance, 0);
case 0:
return new VectorI(distance, 0, 0);
case 180:
return new VectorI(-distance, 0, 0);
case 90:
return new VectorI(0, 0, -distance);
case 270:
return new VectorI(0, 0, distance);
default:
WarpDrive.logger.error(this + " Invalid direction " + direction);
return new VectorI(0, 0, 0);
}
}
@Override
public String toString() {
return String.format("%s \'%s\' @ \'%s\' (%d %d %d)", new Object[] {

View file

@ -29,6 +29,7 @@ import cr0s.warpdrive.config.Dictionary;
import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.Jumpgate;
import cr0s.warpdrive.data.StarMapEntry;
import cr0s.warpdrive.data.VectorI;
import cr0s.warpdrive.world.SpaceTeleporter;
/**
@ -39,17 +40,12 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
public Boolean launchState = false;
public final int JUMP_UP = -1;
public final int JUMP_DOWN = -2;
public int dx, dz;
private int direction;
public int maxX, maxY, maxZ;
public int minX, minY, minZ;
public int shipFront, shipBack;
public int shipLeft, shipRight;
public int shipUp, shipDown;
public int shipLength;
public int shipMass;
public int shipVolume;
@ -74,27 +70,27 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
return code;
}
}
private int warmupTime = 0;
private int cooldownTime = 0;
public int randomWarmupAddition = 0;
private int chestTeleportUpdateTicks = 0;
private final int registryUpdateInterval_ticks = 20 * WarpDriveConfig.SHIP_CORE_REGISTRY_UPDATE_INTERVAL_SECONDS;
private final int registryUpdateInterval_ticks = 20 * WarpDriveConfig.SHIP_CORE_REGISTRY_UPDATE_INTERVAL_SECONDS;
private int registryUpdateTicks = 0;
private int bootTicks = 20;
private int bootTicks = 20;
public UUID uuid = null;
public String shipName = "default";
public int isolationBlocksCount = 0;
public double isolationRate = 0.0D;
public int isolationUpdateTicks = 0;
public TileEntityShipController controller;
private boolean soundPlayed = false;
public TileEntityShipCore() {
super();
peripheralName = "warpdriveShipCore";
@ -356,17 +352,17 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
int xmin, ymin, zmin;
xmin = xCoord - WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE;
xmax = xCoord + WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE;
zmin = zCoord - WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE;
zmax = zCoord + WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE;
// scan 1 block higher to encourage putting isolation block on both
// ground and ceiling
ymin = Math.max(0, yCoord - WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE + 1);
ymax = Math.min(255, yCoord + WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE + 1);
int newCount = 0;
// Search for warp isolation blocks
for (int y = ymin; y <= ymax; y++) {
for (int x = xmin; x <= xmax; x++) {
@ -407,25 +403,25 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
private void summonPlayers() {
AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ);
for (int i = 0; i < controller.players.size(); i++) {
String nick = controller.players.get(i);
EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().func_152612_a(nick);
if (player != null
&& !testBB(aabb, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))) {
summonPlayer(player, xCoord + dx, yCoord, zCoord + dz);
}
}
}
private void summonSinglePlayer(String nickname) {
AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ);
for (int i = 0; i < controller.players.size(); i++) {
String nick = controller.players.get(i);
EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().func_152612_a(nick);
if (player != null && nick.equals(nickname)
&& !testBB(aabb, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))) {
summonPlayer(player, xCoord + dx, yCoord, zCoord + dz);
@ -433,7 +429,7 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
}
}
}
private void summonPlayer(EntityPlayerMP player, int x, int y, int z) {
if (consumeEnergy(WarpDriveConfig.SHIP_TELEPORT_ENERGY_PER_ENTITY, false)) {
if (player.dimension != worldObj.provider.dimensionId) {
@ -451,13 +447,16 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
}
}
}
public boolean validateShipSpatialParameters(StringBuilder reason) {
if (controller == null) {
reason.append("TileEntityReactor.validateShipSpatialParameters: no controller detected!");
return false;
}
direction = controller.getDirection();
int shipFront, shipBack;
int shipLeft, shipRight;
int shipUp, shipDown;
shipFront = controller.getFront();
shipRight = controller.getRight();
shipUp = controller.getUp();
@ -492,7 +491,7 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
x2 = xCoord + shipRight;
}
}
if (x1 < x2) {
minX = x1;
maxX = x2;
@ -500,7 +499,7 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
minX = x2;
maxX = x1;
}
if (z1 < z2) {
minZ = z1;
maxZ = z2;
@ -508,32 +507,10 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
minZ = z2;
maxZ = z1;
}
minY = yCoord - shipDown;
maxY = yCoord + shipUp;
shipLength = 0;
switch (direction) {
case 0:
case 180:
shipLength = shipBack + shipFront;
break;
case 90:
case 270:
shipLength = shipLeft + shipRight;
break;
case -1:
case -2:
shipLength = shipDown + shipUp;
break;
default:
reason.append("Invalid jump direction " + direction);
return false;
}
// Ship side is too big
if ( (shipBack + shipFront) > WarpDriveConfig.SHIP_MAX_SIDE_SIZE
|| (shipLeft + shipRight) > WarpDriveConfig.SHIP_MAX_SIDE_SIZE
@ -541,50 +518,50 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
reason.append("Ship is too big (max is " + WarpDriveConfig.SHIP_MAX_SIDE_SIZE + " per side)");
return false;
}
boolean isUnlimited = false;
AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX + 0.99D, maxY + 0.99D, maxZ + 0.99D);
List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb);
for (Object o : list) {
if (o == null || !(o instanceof EntityPlayer)) {
for (Object object : list) {
if (object == null || !(object instanceof EntityPlayer)) {
continue;
}
String playerName = ((EntityPlayer) o).getDisplayName();
String playerName = ((EntityPlayer) object).getDisplayName();
for (String unlimiteName : WarpDriveConfig.SHIP_VOLUME_UNLIMITED_PLAYERNAMES) {
isUnlimited = isUnlimited || unlimiteName.equals(playerName);
}
}
updateShipMassAndVolume();
if (!isUnlimited && shipMass > WarpDriveConfig.SHIP_VOLUME_MAX_ON_PLANET_SURFACE && worldObj.provider.dimensionId == 0) {
if (!isUnlimited && shipMass > WarpDriveConfig.SHIP_VOLUME_MAX_ON_PLANET_SURFACE && worldObj.provider.dimensionId == 0) {// FIXME: need to support any planets and landing movement
reason.append("Ship is too big for the overworld (max is " + WarpDriveConfig.SHIP_VOLUME_MAX_ON_PLANET_SURFACE + " blocks)");
return false;
}
return true;
}
private void doBeaconJump() {
// Search beacon coordinates
String freq = controller.getBeaconFrequency();
int beaconX = 0, beaconZ = 0;
boolean isBeaconFound = false;
EntityPlayerMP player;
for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) {
player = (EntityPlayerMP) MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i);
// Skip players from other dimensions
if (player.dimension != worldObj.provider.dimensionId) {
continue;
}
TileEntity tileEntity = worldObj.getTileEntity(
MathHelper.floor_double(player.posX),
MathHelper.floor_double(player.posY) - 1,
MathHelper.floor_double(player.posZ));
if (tileEntity != null && (tileEntity instanceof TileEntityShipController)) {
if (((TileEntityShipController) tileEntity).getBeaconFrequency().equals(freq)) {
beaconX = tileEntity.xCoord;
@ -600,14 +577,13 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
// Consume energy
if (consumeEnergy(calculateRequiredEnergy(currentMode, shipMass, controller.getDistance()), false)) {
WarpDrive.logger.info(this + " Moving ship to beacon (" + beaconX + "; " + yCoord + "; " + beaconZ + ")");
EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, false, 1, 0, true, beaconX, yCoord, beaconZ);
EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, false, 0, 0, 0, (byte)0, true, beaconX, yCoord, beaconZ);
jump.ship.maxX = maxX;
jump.ship.minX = minX;
jump.ship.maxZ = maxZ;
jump.ship.minZ = minZ;
jump.ship.maxY = maxY;
jump.ship.minY = minY;
jump.shipLength = shipLength;
jump.on = true;
worldObj.spawnEntityInWorld(jump);
} else {
@ -680,7 +656,7 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
private boolean isFreePlaceForShip(int destX, int destY, int destZ) {
int newX, newZ;
if (destY + shipUp > 255 || destY - shipDown < 5) {
if (controller == null || destY + controller.getUp() > 255 || destY - controller.getDown() < 5) {
return false;
}
@ -770,14 +746,13 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
// Consume energy
if (consumeEnergy(calculateRequiredEnergy(currentMode, shipMass, controller.getDistance()), false)) {
WarpDrive.logger.info(this + " Moving ship to a place around gate '" + targetGate.name + "' (" + destX + "; " + destY + "; " + destZ + ")");
EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, false, 1, 0, true, destX, destY, destZ);
EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, false, 0, 0, 0, (byte)0, true, destX, destY, destZ);
jump.ship.maxX = maxX;
jump.ship.minX = minX;
jump.ship.maxZ = maxZ;
jump.ship.minZ = minZ;
jump.ship.maxY = maxY;
jump.ship.minY = minY;
jump.shipLength = shipLength;
jump.on = true;
worldObj.spawnEntityInWorld(jump);
} else {
@ -792,7 +767,7 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
if (!consumeEnergy(requiredEnergy, true)) {
messageToAllPlayersOnShip("Insufficient energy to jump! Core is currently charged with " + getEnergyStored() + " EU while jump requires "
+ requiredEnergy + " EU");
this.controller.setJumpFlag(false);
controller.setJumpFlag(false);
return;
}
@ -819,9 +794,9 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
StringBuilder reason = new StringBuilder();
if (nearestGate == null || !isShipInJumpgate(nearestGate, reason)) {
this.messageToAllPlayersOnShip("Ship is too small (" + shipMass + "/" + WarpDriveConfig.SHIP_VOLUME_MIN_FOR_HYPERSPACE
messageToAllPlayersOnShip("Ship is too small (" + shipMass + "/" + WarpDriveConfig.SHIP_VOLUME_MIN_FOR_HYPERSPACE
+ ").\nInsufficient ship mass to open hyperspace portal.\nUse a jumpgate to reach or exit hyperspace.");
this.controller.setJumpFlag(false);
controller.setJumpFlag(false);
return;
}
}
@ -838,21 +813,31 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
messageToAllPlayersOnShip("Insufficient energy level");
return;
}
int moveX = 0;
int moveY = 0;
int moveZ = 0;
if (this.currentMode == ShipCoreMode.BASIC_JUMP) {
distance += shipLength;
}
if (currentMode == ShipCoreMode.LONG_JUMP && (direction != -1) && (direction != -2)) {
if (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) {
distance *= 100;
if (currentMode != ShipCoreMode.HYPERSPACE) {
VectorI movement = controller.getMovement();
moveX = dx * movement.x - dz * movement.z;
moveY = movement.y;
moveZ = dz * movement.x + dx * movement.z;
if (currentMode == ShipCoreMode.BASIC_JUMP) {
// VectorI sizes = new VectorI(controller.getBack() + controller.getFront(), controller.getDown() + controller.getUp(), controller.getLeft() + controller.getRight());
// moveX += Math.signum((double)moveX) * Math.abs(dx * sizes.x - dz * sizes.z);
// moveY += Math.signum((double)moveY) * (sizes.y);
// moveZ += Math.signum((double)moveZ) * Math.abs(dz * sizes.x + dx * sizes.z);
} else if (currentMode == ShipCoreMode.LONG_JUMP) {
moveX *= 100;
moveZ *= 100;
}
}
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Distance adjusted to " + distance + " blocks.");
WarpDrive.logger.info(this + " Movement adjusted to (" + moveX + " " + moveY + " " + moveZ + ") blocks.");
}
EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, (currentMode == ShipCoreMode.HYPERSPACE), distance, direction,
EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, (currentMode == ShipCoreMode.HYPERSPACE),
moveX, moveY, moveZ, controller.getRotationSteps(),
false, 0, 0, 0);
jump.ship.maxX = maxX;
jump.ship.minX = minX;
@ -860,7 +845,6 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy {
jump.ship.minZ = minZ;
jump.ship.maxY = maxY;
jump.ship.minY = minY;
jump.shipLength = shipLength;
jump.on = true;
worldObj.spawnEntityInWorld(jump);
}

View file

@ -231,21 +231,21 @@ public class JumpBlock {
public void deploy(World targetWorld, ITransformation transformation) {
try {
NBTTagCompound oldnbt = null;
NBTTagCompound nbtToDeploy = null;
if (blockTileEntity != null) {
oldnbt = new NBTTagCompound();
blockTileEntity.writeToNBT(oldnbt);
nbtToDeploy = new NBTTagCompound();
blockTileEntity.writeToNBT(nbtToDeploy);
}
int newBlockMeta = blockMeta;
if (externals != null) {
for (Entry<String, NBTBase> external : externals.entrySet()) {
IBlockTransformer blockTransformer = WarpDriveConfig.blockTransformers.get(external.getKey());
if (blockTransformer != null) {
newBlockMeta = blockTransformer.rotate(block, blockMeta, oldnbt, transformation.getRotationSteps(), transformation.getRotationYaw());
newBlockMeta = blockTransformer.rotate(block, blockMeta, nbtToDeploy, transformation.getRotationSteps(), transformation.getRotationYaw());
}
}
} else {
newBlockMeta = getMetadataRotation(oldnbt, transformation.getRotationSteps());
newBlockMeta = getMetadataRotation(nbtToDeploy, transformation.getRotationSteps());
}
ChunkCoordinates target = transformation.apply(x, y, z);
setBlockNoLight(targetWorld, target.posX, target.posY, target.posZ, block, newBlockMeta, 2);
@ -256,23 +256,23 @@ public class JumpBlock {
targetWorld.scheduleBlockUpdate(target.posX, target.posY, target.posZ, block, 40 + targetWorld.rand.nextInt(20));
}
if (oldnbt != null) {
oldnbt.setInteger("x", target.posX);
oldnbt.setInteger("y", target.posY);
oldnbt.setInteger("z", target.posZ);
if (nbtToDeploy != null) {
nbtToDeploy.setInteger("x", target.posX);
nbtToDeploy.setInteger("y", target.posY);
nbtToDeploy.setInteger("z", target.posZ);
if (oldnbt.hasKey("mainX") && oldnbt.hasKey("mainY") && oldnbt.hasKey("mainZ")) {// Mekanism 6.0.4.44
if (nbtToDeploy.hasKey("mainX") && nbtToDeploy.hasKey("mainY") && nbtToDeploy.hasKey("mainZ")) {// Mekanism 6.0.4.44
if (WarpDriveConfig.LOGGING_JUMPBLOCKS) {
WarpDrive.logger.info(this + " deploy: TileEntity has mainXYZ");
}
ChunkCoordinates mainTarget = transformation.apply(oldnbt.getInteger("mainX"), oldnbt.getInteger("mainY"), oldnbt.getInteger("mainZ"));
oldnbt.setInteger("mainX", mainTarget.posX);
oldnbt.setInteger("mainY", mainTarget.posY);
oldnbt.setInteger("mainZ", mainTarget.posZ);
ChunkCoordinates mainTarget = transformation.apply(nbtToDeploy.getInteger("mainX"), nbtToDeploy.getInteger("mainY"), nbtToDeploy.getInteger("mainZ"));
nbtToDeploy.setInteger("mainX", mainTarget.posX);
nbtToDeploy.setInteger("mainY", mainTarget.posY);
nbtToDeploy.setInteger("mainZ", mainTarget.posZ);
}
if (oldnbt.hasKey("screenData")) {// IC2NuclearControl 2.2.5a
NBTTagCompound nbtScreenData = oldnbt.getCompoundTag("screenData");
if (nbtToDeploy.hasKey("screenData")) {// IC2NuclearControl 2.2.5a
NBTTagCompound nbtScreenData = nbtToDeploy.getCompoundTag("screenData");
if ( nbtScreenData.hasKey("minX") && nbtScreenData.hasKey("minY") && nbtScreenData.hasKey("minZ")
&& nbtScreenData.hasKey("maxX") && nbtScreenData.hasKey("maxY") && nbtScreenData.hasKey("maxZ")) {
if (WarpDriveConfig.LOGGING_JUMPBLOCKS) {
@ -286,24 +286,24 @@ public class JumpBlock {
nbtScreenData.setInteger("maxX", maxTarget.posX);
nbtScreenData.setInteger("maxY", maxTarget.posY);
nbtScreenData.setInteger("maxZ", maxTarget.posZ);
oldnbt.setTag("screenData", nbtScreenData);
nbtToDeploy.setTag("screenData", nbtScreenData);
}
}
if (oldnbt.hasKey("hasValidBubble")) {// Galacticraft 3.0.11.333
oldnbt.setBoolean("hasValidBubble", false);
if (nbtToDeploy.hasKey("hasValidBubble")) {// Galacticraft 3.0.11.333
nbtToDeploy.setBoolean("hasValidBubble", false);
// old bubble will die naturally due to missing tile entity, new one will be spawned
}
TileEntity newTileEntity = null;
boolean isForgeMultipart = false;
if (WarpDriveConfig.isForgeMultipartLoaded && oldnbt.hasKey("id") && oldnbt.getString("id") == "savedMultipart") {
if (WarpDriveConfig.isForgeMultipartLoaded && nbtToDeploy.hasKey("id") && nbtToDeploy.getString("id") == "savedMultipart") {
isForgeMultipart = true;
newTileEntity = (TileEntity) WarpDriveConfig.forgeMultipart_helper_createTileFromNBT.invoke(null, targetWorld, oldnbt);
newTileEntity = (TileEntity) WarpDriveConfig.forgeMultipart_helper_createTileFromNBT.invoke(null, targetWorld, nbtToDeploy);
} else if (block == WarpDriveConfig.CC_Computer || block == WarpDriveConfig.CC_peripheral
|| block == WarpDriveConfig.CCT_Turtle || block == WarpDriveConfig.CCT_Expanded || block == WarpDriveConfig.CCT_Advanced) {
newTileEntity = TileEntity.createAndLoadEntity(oldnbt);
newTileEntity = TileEntity.createAndLoadEntity(nbtToDeploy);
newTileEntity.invalidate();
} /* else if (block == WarpDriveConfig.AS_Turbine) {
@ -318,7 +318,7 @@ public class JumpBlock {
} /* No 1.7.10 version */
if (newTileEntity == null) {
newTileEntity = TileEntity.createAndLoadEntity(oldnbt);
newTileEntity = TileEntity.createAndLoadEntity(nbtToDeploy);
}
if (newTileEntity != null) {
@ -333,7 +333,7 @@ public class JumpBlock {
return;
} else {
WarpDrive.logger.info(" deploy failed to create new tile entity at " + x + ", " + y + ", " + z + " blockId " + block + ":" + blockMeta);
WarpDrive.logger.info("NBT data was " + oldnbt);
WarpDrive.logger.info("NBT data was " + nbtToDeploy);
}
}
} catch (Exception exception) {

View file

@ -25,7 +25,6 @@ public class JumpShip {
public int coreZ;
public int dx;
public int dz;
public int direction;
public int maxX;
public int maxZ;
public int maxY;

View file

@ -318,4 +318,11 @@ public class VectorI implements Cloneable {
public int getMagnitudeSquared() {
return x * x + y * y + z * z;
}
public VectorI scale(final int amount) {
x *= amount;
y *= amount;
z *= amount;
return this;
}
}

View file

@ -5,6 +5,11 @@ local event = require("event")
local fs = require("filesystem")
local serialization = require("serialization")
if not term.isAvailable() then
computer.beep()
return
end
Style = {
CDefault = 0xFFFFFF,
BGDefault = 0x0000FF,
@ -22,11 +27,6 @@ Style = {
BGDisabled = 0x0000FF
}
if not term.isAvailable() then
computer.beep()
return
end
----------- Monitor support
-- need to memorize colors so we can see debug stack dump
@ -196,7 +196,7 @@ function readInputNumber(currentValue)
SetCursorPos(x, y)
Write(input .. " ")
input = string.sub(input, -9)
local params = { event.pull() }
local eventName = params[1]
local address = params[2]
@ -210,6 +210,16 @@ function readInputNumber(currentValue)
input = input .. string.format(keycode - 1)
elseif char == 48 or keycode == 11 then -- 0
input = input .. "0"
elseif char == 45 or keycode == 74 then -- -
if string.sub(input, 1, 1) == "-" then
input = string.sub(input, 2)
else
input = "-" .. input
end
elseif char == 43 or keycode == 78 then -- +
if string.sub(input, 1, 1) == "-" then
input = string.sub(input, 2)
end
elseif char == 8 then -- Backspace
input = string.sub(input, 1, string.len(input) - 1)
elseif char == 0 and keycode == 211 then -- Delete
@ -220,7 +230,13 @@ function readInputNumber(currentValue)
ShowWarning("Key " .. char .. " " .. keycode .. " is invalid")
end
elseif eventName == "key_up" then
-- drop it
-- drop it
elseif eventName == "touch" then
-- drop it
elseif eventName == "drop" then
-- drop it
elseif eventName == "drag" then
-- drop it
elseif eventName == "interrupted" then
inputAbort = true
elseif not common_event(eventName, params[3]) then
@ -228,7 +244,7 @@ function readInputNumber(currentValue)
end
until inputAbort
SetCursorPos(1, y + 1)
if input == "" then
if input == "" or input == "-" then
return currentValue
else
return tonumber(input)
@ -266,6 +282,12 @@ function readInputText(currentValue)
end
elseif eventName == "key_up" then
-- drop it
elseif eventName == "touch" then
-- drop it
elseif eventName == "drop" then
-- drop it
elseif eventName == "drag" then
-- drop it
elseif eventName == "interrupted" then
inputAbort = true
elseif not common_event(eventName, params[3]) then
@ -289,13 +311,19 @@ function readConfirmation()
if address == nil then address = "none" end
if eventName == "key_down" then
local char = params[3]
if char == 89 or char == 121 then -- Y
if char == 89 or char == 121 or keycode == 21 then -- Y
return true
else
return false
end
elseif eventName == "key_up" then
-- drop it
elseif eventName == "touch" then
-- drop it
elseif eventName == "drop" then
-- drop it
elseif eventName == "drag" then
-- drop it
elseif eventName == "interrupted" then
return false
elseif not common_event(eventName, params[3]) then
@ -346,8 +374,6 @@ function data_read()
file:close()
end
if data.core_summon == nil then data.core_summon = false; end
if data.core_distance == nil then data.core_distance = 0; end
if data.core_direction == nil then data.core_direction = 0; end
end
function data_setName()
@ -372,117 +398,129 @@ core_back = 0
core_left = 0
core_down = 0
core_isInHyper = false
core_shipLength = 0
core_realDistance = 0
core_jumpCost = 0
core_shipSize = 0
core_movement = { 0, 0, 0 }
core_rotationSteps = 0
function core_boot()
if ship == nil then
return
end
Write("Booting Ship Core")
if data.core_summon then
ship.summon_all()
end
Write(".")
WriteLn("...")
core_front, core_right, core_up = ship.dim_positive()
core_back, core_left, core_down = ship.dim_negative()
core_isInHyper = ship.isInHyperspace()
Write(".")
core_rotationSteps = ship.rotationSteps()
core_movement = { ship.movement() }
if ship.direction ~= nil then
ship.direction(666)
ship.distance(0)
end
WriteLn("Ship core detected...")
repeat
pos = ship.position()
os.sleep(0.3)
until pos ~= nil
X, Y, Z = ship.position()
Write(".")
WriteLn("Ship position triangulated...")
repeat
isAttached = ship.isAttached()
os.sleep(0.3)
until isAttached ~= false
Write(".")
WriteLn("Ship core linked...")
repeat
core_shipSize = ship.getShipSize()
os.sleep(0.3)
until core_shipSize ~= nil
Write(".")
core_computeRealDistance()
Write(".")
WriteLn("Ship size updated...")
ship.mode(1)
WriteLn("")
end
function core_writeDirection()
if data.core_direction == 1 then
WriteLn(" Direction = Up")
elseif data.core_direction == 2 then
WriteLn(" Direction = Down")
elseif data.core_direction == 0 then
WriteLn(" Direction = Front")
elseif data.core_direction == 180 then
WriteLn(" Direction = Back")
elseif data.core_direction == 90 then
WriteLn(" Direction = Left")
elseif data.core_direction == 270 then
WriteLn(" Direction = Right")
function core_writeMovement()
local message = " Movement = "
local count = 0
if core_movement[1] > 0 then
message = message .. core_movement[1] .. " front"
count = count + 1
elseif core_movement[1] < 0 then
message = message .. (- core_movement[1]) .. " back"
count = count + 1
end
if core_movement[2] > 0 then
if count > 0 then message = message .. ", "; end
message = message .. core_movement[2] .. " up"
count = count + 1
elseif core_movement[2] < 0 then
if count > 0 then message = message .. ", "; end
message = message .. (- core_movement[2]) .. " down"
count = count + 1
end
if core_movement[3] > 0 then
if count > 0 then message = message .. ", "; end
message = message .. core_movement[3] .. " right"
count = count + 1
elseif core_movement[3] < 0 then
if count > 0 then message = message .. ", "; end
message = message .. (- core_movement[3]) .. " left"
count = count + 1
end
if core_rotationSteps == 1 then
if count > 0 then message = message .. ", "; end
message = message .. "Turn right"
count = count + 1
elseif core_rotationSteps == 2 then
if count > 0 then message = message .. ", "; end
message = message .. "Turn back"
count = count + 1
elseif core_rotationSteps == 3 then
if count > 0 then message = message .. ", "; end
message = message .. "Turn left"
count = count + 1
end
if count == 0 then
message = message .. "(none)"
end
WriteLn(message)
end
function core_computeRealDistance()
if core_isInHyper then
core_shipLength = 0
core_realDistance = data.core_distance * 100 + core_shipLength
ship.mode(2)
else
if data.core_direction == 1 or data.core_direction == 2 then
core_shipLength = core_up + core_down + 1
elseif data.core_direction == 0 or data.core_direction == 180 then
core_shipLength = core_front + core_back + 1
elseif data.core_direction == 90 or data.core_direction == 270 then
core_shipLength = core_left + core_right + 1
end
core_realDistance = data.core_distance + core_shipLength - 1
ship.mode(1)
function core_writeRotation()
if core_rotationSteps == 0 then
WriteLn(" Rotation = Front")
elseif core_rotationSteps == 1 then
WriteLn(" Rotation = Right +90")
elseif core_rotationSteps == 2 then
WriteLn(" Rotation = Back 180")
elseif core_rotationSteps == 3 then
WriteLn(" Rotation = Left -90")
end
core_jumpCost = ship.getEnergyRequired(core_realDistance)
end
function core_computeNewCoordinates(cx, cy, cz)
local res = { x = cx, y = cy, z = cz }
if data.core_direction == 1 then
res.y = res.y + core_realDistance
elseif data.core_direction == 2 then
res.y = res.y - core_realDistance
end
local dx, dy, dz = ship.getOrientation()
if dx ~= 0 then
if data.core_direction == 0 then
res.x = res.x + (core_realDistance * dx)
elseif data.core_direction == 180 then
res.x = res.x - (core_realDistance * dx)
elseif data.core_direction == 90 then
res.z = res.z + (core_realDistance * dx)
elseif data.core_direction == 270 then
res.z = res.z - (core_realDistance * dx)
end
else
if data.core_direction == 0 then
res.z = res.z + (core_realDistance * dz)
elseif data.core_direction == 180 then
res.z = res.z - (core_realDistance * dz)
elseif data.core_direction == 90 then
res.x = res.x + (core_realDistance * dz)
elseif data.core_direction == 270 then
res.x = res.x - (core_realDistance * dz)
end
end
local worldMovement = { x = 0, y = 0, z = 0 }
worldMovement.x = dx * core_movement[1] - dz * core_movement[3]
worldMovement.y = core_movement[2]
worldMovement.z = dz * core_movement[1] + dx * core_movement[3]
core_actualDistance = math.ceil(math.sqrt(worldMovement.x * worldMovement.x + worldMovement.y * worldMovement.y + worldMovement.z * worldMovement.z))
core_jumpCost = ship.getEnergyRequired(core_actualDistance)
res.x = res.x + worldMovement.x
res.y = res.y + worldMovement.y
res.z = res.z + worldMovement.z
return res
end
@ -490,55 +528,53 @@ function core_warp()
-- rs.setOutput(alarm_side, true)
if readConfirmation() then
-- rs.setOutput(alarm_side, false)
ship.direction(data.core_direction)
ship.distance(data.core_distance)
if core_isInHyper then
ship.mode(2)
else
ship.mode(1)
end
ship.movement(core_movement[1], core_movement[2], core_movement[3])
ship.rotationSteps(core_rotationSteps)
ship.mode(1)
ship.jump()
-- ship = nil
end
-- rs.setOutput(alarm_side, false)
end
function core_page_setDistance()
ShowTitle("<==== Set distance ====>")
function core_page_setMovement()
ShowTitle("<==== Set movement ====>")
core_computeRealDistance()
local maximumDistance = core_shipLength + 127
local userEntry = core_realDistance
if userEntry <= 1 then
userEntry = 0
end
repeat
SetCursorPos(1, 2)
if core_isInHyper then
Write("Distance * 100 (min " .. core_shipLength .. ", max " .. maximumDistance .. "): ")
else
Write("Distance (min " .. (core_shipLength + 1) .. ", max " .. maximumDistance .. "): ")
end
userEntry = readInputNumber(userEntry)
if userEntry <= core_shipLength or userEntry > maximumDistance then
ShowWarning("Wrong distance. Try again.")
end
until userEntry > core_shipLength and userEntry <= maximumDistance
data.core_distance = userEntry - core_shipLength + 1
core_computeRealDistance()
core_movement[1] = core_page_setDistanceAxis(2, "Front", core_movement[1], math.abs(core_front + core_back + 1))
core_movement[2] = core_page_setDistanceAxis(3, "Up" , core_movement[2], math.abs(core_up + core_down + 1))
core_movement[3] = core_page_setDistanceAxis(4, "Right", core_movement[3], math.abs(core_left + core_right + 1))
core_movement = { ship.movement(core_movement[1], core_movement[2], core_movement[3]) }
end
function core_page_setDirection()
function core_page_setDistanceAxis(line, axis, userEntry, shipLength)
local maximumDistance = shipLength + 127
if core_isInHyper and line ~= 3 then
maximumDistance = shipLength + 127 * 100
end
repeat
SetCursorPos(1, line)
Write(axis .. " (min " .. (shipLength + 1) .. ", max " .. maximumDistance .. "): ")
userEntry = readInputNumber(userEntry)
if userEntry == 0 then
return userEntry
end
if math.abs(userEntry) <= shipLength or math.abs(userEntry) > maximumDistance then
ShowWarning("Wrong distance. Try again.")
end
until math.abs(userEntry) > shipLength and math.abs(userEntry) <= maximumDistance
return userEntry
end
function core_page_setRotation()
local inputAbort = false
local drun = true
repeat
ShowTitle("<==== Set direction ====>")
core_writeDirection()
ShowTitle("<==== Set rotation ====>")
core_writeRotation()
SetCursorPos(1, 19)
SetColorTitle()
ShowMenu("Use directional keys")
ShowMenu("W/S keys for Up/Down")
ShowMenu("Enter - confirm")
SetColorDefault()
local params = { event.pull() }
@ -549,17 +585,13 @@ function core_page_setDirection()
local char = params[3]
local keycode = params[4]
if keycode == 200 then
data.core_direction = 0
elseif keycode == 17 or keycode == 201 then
data.core_direction = 1
core_rotationSteps = 0
elseif keycode == 203 then
data.core_direction = 90
core_rotationSteps = 3
elseif keycode == 205 then
data.core_direction = 270
core_rotationSteps = 1
elseif keycode == 208 then
data.core_direction = 180
elseif keycode == 31 or keycode == 209 then
data.core_direction = 2
core_rotationSteps = 2
elseif keycode == 28 then
inputAbort = true
else
@ -567,12 +599,19 @@ function core_page_setDirection()
end
elseif eventName == "key_up" then
-- drop it
elseif eventName == "touch" then
-- drop it
elseif eventName == "drop" then
-- drop it
elseif eventName == "drag" then
-- drop it
elseif eventName == "interrupted" then
inputAbort = true
elseif not common_event(eventName, params[3]) then
ShowWarning("Event '" .. eventName .. "', " .. address .. " is unsupported")
end
until inputAbort
core_rotationSteps = ship.rotationSteps(core_rotationSteps)
end
function core_page_setDimensions()
@ -590,8 +629,8 @@ function core_page_setDimensions()
Write(" Down (".. core_down ..") : ")
core_down = readInputNumber(core_down)
Write("Setting dimensions...")
ship.dim_positive(core_front, core_right, core_up)
ship.dim_negative(core_back, core_left, core_down)
core_front, core_right, core_up = ship.dim_positive(core_front, core_right, core_up)
core_back, core_left, core_down = ship.dim_negative(core_back, core_left, core_down)
core_shipSize = ship.getShipSize()
if core_shipSize == nil then core_shipSize = 0 end
end
@ -606,7 +645,7 @@ function core_page_summon()
ShowMenu("Enter player number")
ShowMenu("or press enter to summon everyone")
SetColorDefault()
Write(":")
local input = readInputNumber("")
if input == "" then
@ -619,7 +658,7 @@ end
function core_page_jumpToBeacon()
ShowTitle("<==== Jump to beacon ====>")
Write("Enter beacon frequency: ")
local freq = readInputText("")
-- rs.setOutput(alarm_side, true)
@ -635,7 +674,7 @@ end
function core_page_jumpToGate()
ShowTitle("<==== Jump to Jumpgate ====>")
Write("Enter jumpgate name: ")
local name = readInputText("")
-- rs.setOutput(alarm_side, true)
@ -670,9 +709,9 @@ function core_page()
WriteLn(" Size = " .. core_shipSize .. " blocks")
WriteLn("")
WriteLn("Warp data:")
core_writeDirection()
core_writeMovement()
local dest = core_computeNewCoordinates(X, Y, Z)
WriteLn(" Distance = " .. core_realDistance .. " (" .. core_jumpCost .. "EU, " .. math.floor(energy / core_jumpCost) .. " jumps)")
WriteLn(" Distance = " .. core_actualDistance .. " (" .. core_jumpCost .. "EU, " .. math.floor(energy / core_jumpCost) .. " jumps)")
WriteLn(" Dest.coordinates = " .. FormatInteger(dest.x) .. ", " .. FormatInteger(dest.y) .. ", " .. FormatInteger(dest.z))
if data.core_summon then
WriteLn(" Summon after = Yes")
@ -682,29 +721,29 @@ function core_page()
else
ShowWarning("No ship controller detected")
end
SetCursorPos(1, 19)
SetColorTitle()
ShowMenu("D - Dimensions, M - Toggle summon, N - Ship name")
ShowMenu("S - Set Warp Data, J - Jump, G - Jump to JumpGate")
ShowMenu("B - Jump to Beacon, H - Jump to Hyperspace")
ShowMenu("C - summon Crew")
ShowMenu("D - set Dimensions, N - set ship Name")
ShowMenu("M - set Movement, J - Jump, G - jump through Gate")
ShowMenu("B - jump to Beacon, H - jump to Hyperspace")
ShowMenu("C - summon Crew, M - Toggle summon")
end
function core_key(char, keycode)
if char == 83 or char == 115 then -- S
core_page_setDirection()
core_page_setDistance()
if char == 77 or char == 109 then -- M
core_page_setMovement()
core_page_setRotation()
data_save()
return true
elseif char == 77 or char == 109 then -- M
elseif char == 84 or char == 116 then -- T
if data.core_summon then
data.core_summon = false
else
data.core_summon = true
end
data_save()
return true
else
data.core_summon = true
end
data_save()
return true
elseif char == 68 or char == 100 then -- D
core_page_setDimensions()
data_save()
@ -739,6 +778,7 @@ function core_key(char, keycode)
end
----------- Boot sequence
label = computer.address()
if not label then
label = "" .. computer.address()
@ -759,7 +799,6 @@ for address, componentType in component.list() do
ship = component.proxy(address)
end
end
-- os.sleep(1)
if not computer.address() and ship ~= nil then
data_setName()
@ -768,7 +807,7 @@ end
-- peripherals status
function connections_page()
ShowTitle(label .. " - Connections")
WriteLn("")
if ship == nil then
SetColorDisabled()
@ -811,13 +850,13 @@ repeat
if eventName == "key_down" then
char = params[3]
keycode = params[4]
if char == 88 or char == 120 then -- x for eXit
if char == 88 or char == 120 or keycode == 45 then -- x for eXit
abort = true
elseif char == 48 or keycode == 11 then -- 0
elseif char == 48 or keycode == 11 or keycode == 82 then -- 0
page = connections_page
keyHandler = nil
refresh = true
elseif char == 49 or keycode == 2 then -- 1
elseif char == 49 or keycode == 2 or keycode == 79 then -- 1
page = core_page
keyHandler = core_key
refresh = true
@ -834,9 +873,15 @@ repeat
-- func(unpack(params))
-- abort, refresh = false, false
elseif eventName == "char" then
-- drop it
-- drop it
elseif eventName == "key_up" then
-- drop it
-- drop it
elseif eventName == "touch" then
-- drop it
elseif eventName == "drop" then
-- drop it
elseif eventName == "drag" then
-- drop it
elseif eventName == "interrupted" then
abort = true
elseif not common_event(eventName, params[3]) then
@ -846,6 +891,16 @@ repeat
end
until abort
-- exiting
if data.core_summon then
data.core_summon = false
data_save()
end
if ship ~= nil then
ship.mode(0)
end
-- clear screens on exit
SetMonitorColorFrontBack(0xFFFFFF, 0x000000)
term.clear()