From f3caf63489a364fe96e750aaeacbdde47b6057f4 Mon Sep 17 00:00:00 2001 From: Francesco Macagno Date: Wed, 22 Jul 2015 17:31:10 -0700 Subject: [PATCH] Moved missing files back in to proper places Sorry Lem --- src/cr0s/WarpDrive/EntityJump.java | 1230 ---------- src/cr0s/WarpDrive/WarpDrive.java | 818 ------- src/cr0s/WarpDrive/WarpDriveConfig.java | 1086 --------- .../WarpDrive/machines/TileEntityReactor.java | 1121 --------- .../machines/WarpBlockContainer.java | 85 - src/java/cr0s/warpdrive/EntityJump.java | 79 +- src/java/cr0s/warpdrive/WarpDrive.java | 456 ++-- src/java/cr0s/warpdrive/WarpDriveConfig.java | 503 ++-- .../warpdrive}/block/BlockDecorative.java | 0 .../block/BlockTransportBeacon.java | 0 .../warpdrive}/block/ItemBlockDecorative.java | 0 .../cr0s/warpdrive}/command/DebugCommand.java | 0 .../cr0s/warpdrive}/item/ItemWarpUpgrade.java | 0 .../warpdrive}/machines/BlockChunkLoader.java | 0 .../machines/BlockLaserReactorMonitor.java | 0 .../machines/BlockLaserTreeFarm.java | 0 .../warpdrive}/machines/BlockPowerLaser.java | 0 .../machines/BlockPowerReactor.java | 0 .../warpdrive}/machines/BlockPowerStore.java | 0 .../warpdrive}/machines/BlockTransporter.java | 0 .../machines/TileEntityAbstractLaser.java | 0 .../machines/TileEntityAbstractMiner.java | 0 .../machines/TileEntityChunkLoader.java | 0 .../TileEntityLaserReactorMonitor.java | 0 .../machines/TileEntityLaserTreeFarm.java | 0 .../machines/TileEntityPowerLaser.java | 0 .../machines/TileEntityPowerReactor.java | 0 .../machines/TileEntityPowerStore.java | 0 .../warpdrive/machines/TileEntityReactor.java | 2129 +++++++++-------- .../machines/TileEntityTransporter.java | 0 .../machines/WarpBlockContainer.java | 67 +- 31 files changed, 1796 insertions(+), 5778 deletions(-) delete mode 100644 src/cr0s/WarpDrive/EntityJump.java delete mode 100644 src/cr0s/WarpDrive/WarpDrive.java delete mode 100644 src/cr0s/WarpDrive/WarpDriveConfig.java delete mode 100644 src/cr0s/WarpDrive/machines/TileEntityReactor.java delete mode 100644 src/cr0s/WarpDrive/machines/WarpBlockContainer.java rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/block/BlockDecorative.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/block/BlockTransportBeacon.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/block/ItemBlockDecorative.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/command/DebugCommand.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/item/ItemWarpUpgrade.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockChunkLoader.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockLaserReactorMonitor.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockLaserTreeFarm.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockPowerLaser.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockPowerReactor.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockPowerStore.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/BlockTransporter.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityAbstractLaser.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityAbstractMiner.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityChunkLoader.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityLaserReactorMonitor.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityLaserTreeFarm.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityPowerLaser.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityPowerReactor.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityPowerStore.java (100%) rename src/{cr0s/WarpDrive => java/cr0s/warpdrive}/machines/TileEntityTransporter.java (100%) diff --git a/src/cr0s/WarpDrive/EntityJump.java b/src/cr0s/WarpDrive/EntityJump.java deleted file mode 100644 index e3daa6f0..00000000 --- a/src/cr0s/WarpDrive/EntityJump.java +++ /dev/null @@ -1,1230 +0,0 @@ -package cr0s.WarpDrive; - -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.data.JumpBlock; -import cr0s.WarpDrive.data.MovingEntity; -import cr0s.WarpDrive.data.TransitionPlane; -import cr0s.WarpDrive.data.Vector3; -import cr0s.WarpDrive.machines.TileEntityReactor; -import cr0s.WarpDrive.world.SpaceTeleporter; -import dan200.computercraft.api.peripheral.IPeripheral; -import ic2.api.network.NetworkHelper; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -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.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.ForgeChunkManager.Ticket; -import net.minecraftforge.common.ForgeChunkManager.Type; - -public class EntityJump extends Entity -{ - // Jump vector - private int moveX; - private int moveY; - private int moveZ; - - private int xCoord; - private int yCoord; - private int zCoord; - private int dx; - private int dz; - private int distance; - private int direction; - public int shipLength; - public int maxX; - public int maxZ; - public int maxY; - public int minX; - public int minZ; - public int minY; - - private boolean isHyperspaceJump; - - private World targetWorld; - private Ticket sourceWorldTicket; - private Ticket targetWorldTicket; - - private boolean collisionDetected = false; - private ArrayList collisionAtSource; - private ArrayList collisionAtTarget; - private float collisionStrength = 0; - - public boolean on = false; - private JumpBlock ship[]; - private TileEntityReactor reactor; - - private final static int STATE_IDLE = 0; - private final static int STATE_JUMPING = 1; - private final static int STATE_REMOVING = 2; - private int state = STATE_IDLE; - private int currentIndexInShip = 0; - - private List entitiesOnShip; - private List ASTurbines; - - private boolean betweenWorlds; - - private int destX, destY, destZ; - private boolean isCoordJump; - - private long msCounter = 0; - private int ticks = 0; - - public EntityJump(World world) - { - super(world); - targetWorld = worldObj; - WarpDrive.debugPrint("" + this + " Entity created (empty) in dimension " + worldObj.getProviderName() + " - " + worldObj.getWorldInfo().getWorldName() - + " " + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client":"Server")); - } - - public EntityJump(World world, int x, int y, int z, int _dx, int _dz, TileEntityReactor _reactor, - boolean _isHyperspaceJump, int _distance, int _direction, 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.xCoord = x; - this.yCoord = y; - this.zCoord = z; - this.dx = _dx; - this.dz = _dz; - this.reactor = _reactor; - this.isHyperspaceJump = _isHyperspaceJump; - this.distance = _distance; - this.direction = _direction; - this.isCoordJump = _isCoordJump; - this.destX = _destX; - this.destY = _destY; - this.destZ = _destZ; - - // set by reactor - maxX = maxZ = maxY = minX = minZ = minY = 0; - shipLength = 0; - - // set when preparing jump - targetWorld = null; - - WarpDrive.debugPrint("" + this + " Entity created"); - } - - public void killEntity(String reason) { - if (!on) { - return; - } - - on = false; - - if (reason == null || reason.isEmpty()) { - WarpDrive.debugPrint("" + this + " Killing jump entity..."); - } else { - WarpDrive.debugPrint("" + this + " Killing jump entity... (" + reason + ")"); - } - - unforceChunks(); - worldObj.removeEntity(this); - } - - @Override - public boolean isEntityInvulnerable() { - return true; - } - - @Override - public void onUpdate() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - - if (!on) { - WarpDrive.print(this + " Removing from onUpdate..."); - worldObj.removeEntity(this); - return; - } - - if (minY < 0 || maxY > 256) { - String msg = "Invalid Y coordinate(s), check ship dimensions..."; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - - ticks++; - if (state == STATE_IDLE) { - WarpDrive.debugPrint(this + " Preparing to jump..."); - prepareToJump(); - if (on) { - state = STATE_JUMPING; - } - } else if (state == STATE_JUMPING) { - if (currentIndexInShip < ship.length - 1) { - //moveEntities(true); - moveShip(); - } else { - moveEntities(false); - currentIndexInShip = 0; - state = STATE_REMOVING; - } - } else if (state == STATE_REMOVING) { - ASTurbines = new ArrayList(); - removeShip(); - - if (currentIndexInShip >= ship.length - 1) { - finishJump(); - state = STATE_IDLE; - } - } else { - String msg = "Invalid state, aborting jump..."; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - } - - private boolean forceChunks(StringBuilder reason) - { - LocalProfiler.start("EntityJump.forceChunks"); - WarpDrive.debugPrint("" + this + " Forcing chunks in " + worldObj.provider.getDimensionName() + " and " + targetWorld.provider.getDimensionName()); - sourceWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, worldObj, Type.NORMAL); // Type.ENTITY); - if (sourceWorldTicket == null) { - reason.append("Chunkloading rejected in S:" + worldObj.getWorldInfo().getWorldName() + ". Aborting."); - return false; - } - targetWorldTicket = ForgeChunkManager.requestTicket(WarpDrive.instance, targetWorld, Type.NORMAL); - if (targetWorldTicket == null) { - reason.append("Chunkloading rejected in T:" + worldObj.getWorldInfo().getWorldName() + ". Aborting."); - return false; - } -// sourceWorldTicket.bindEntity(this); - int x1 = minX >> 4; - int x2 = maxX >> 4; - int z1 = minZ >> 4; - int z2 = maxZ >> 4; - int chunkCount = 0; - for (int x = x1; x <= x2; x++) - { - for (int z = z1; z <= z2; z++) - { - chunkCount++; - if (chunkCount > sourceWorldTicket.getMaxChunkListDepth()) { - reason.append("Ship is extending over too many chunks, max is S:" + sourceWorldTicket.getMaxChunkListDepth() + ". Aborting."); - return false; - } - ForgeChunkManager.forceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); - } - } - - x1 = (minX + moveX) >> 4; - x2 = (maxX + moveX) >> 4; - z1 = (minZ + moveZ) >> 4; - z2 = (maxZ + moveZ) >> 4; - chunkCount = 0; - for (int x = x1; x <= x2; x++) - { - for (int z = z1; z <= z2; z++) - { - chunkCount++; - if (chunkCount > targetWorldTicket.getMaxChunkListDepth()) { - reason.append("Ship is extending over too many chunks, max is T:" + sourceWorldTicket.getMaxChunkListDepth() + ". Aborting."); - return false; - } - ForgeChunkManager.forceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); - } - } - LocalProfiler.stop(); - return true; - } - - private void unforceChunks() - { - LocalProfiler.start("EntityJump.unforceChunks"); - WarpDrive.debugPrint("" + this + " Unforcing chunks"); - - int x1, x2, z1, z2; - if (sourceWorldTicket != null) { - x1 = minX >> 4; - x2 = maxX >> 4; - z1 = minZ >> 4; - z2 = maxZ >> 4; - for (int x = x1; x <= x2; x++) { - for (int z = z1; z <= z2; z++) { - ForgeChunkManager.unforceChunk(sourceWorldTicket, new ChunkCoordIntPair(x, z)); - } - } - ForgeChunkManager.releaseTicket(sourceWorldTicket); - sourceWorldTicket = null; - } - - if (targetWorldTicket != null) { - x1 = (minX + moveX) >> 4; - x2 = (maxX + moveX) >> 4; - z1 = (minZ + moveZ) >> 4; - z2 = (maxZ + moveZ) >> 4; - for (int x = x1; x <= x2; x++) { - for (int z = z1; z <= z2; z++) { - ForgeChunkManager.unforceChunk(targetWorldTicket, new ChunkCoordIntPair(x, z)); - } - } - ForgeChunkManager.releaseTicket(targetWorldTicket); - targetWorldTicket = null; - } - - LocalProfiler.stop(); - } - - private void messageToAllPlayersOnShip(String msg) { - if (entitiesOnShip == null) { - reactor.messageToAllPlayersOnShip(msg); - } else { - WarpDrive.print("" + this + " messageToAllPlayersOnShip: " + msg); - for (MovingEntity me : entitiesOnShip) { - if (me.entity instanceof EntityPlayer) { - ((EntityPlayer)me.entity).addChatMessage("[" + ((reactor != null && reactor.coreFrequency.length() > 0) ? reactor.coreFrequency : "WarpCore") + "] " + msg); - } - } - } - } - - 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() { - StringBuilder reason = new StringBuilder(); - - LocalProfiler.start("EntityJump.prepareToJump"); - boolean isInSpace = (worldObj.provider.dimensionId == WarpDriveConfig.G_SPACE_DIMENSION_ID); - boolean isInHyperSpace = (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID); - - boolean toSpace = (direction == -1) && (maxY + distance > 255) && (!isInSpace) && (!isInHyperSpace); - boolean fromSpace = (direction == -2) && (minY - distance < 0) && isInSpace; - betweenWorlds = fromSpace || toSpace || isHyperspaceJump; - moveX = moveY = moveZ = 0; - - if (toSpace) { - Boolean planeFound = false; - Boolean planeValid = false; - int closestPlaneDistance = Integer.MAX_VALUE; - TransitionPlane closestTransitionPlane = null; - for (int iPlane = 0; (!planeValid) && iPlane < WarpDriveConfig.G_TRANSITIONPLANES.length; iPlane++) { - TransitionPlane transitionPlane = WarpDriveConfig.G_TRANSITIONPLANES[iPlane]; - if (worldObj.provider.dimensionId == transitionPlane.dimensionId) { - planeFound = true; - int planeDistance = transitionPlane.isValidToSpace(new Vector3(this)); - if (planeDistance == 0) { - planeValid = true; - moveX = transitionPlane.spaceCenterX - transitionPlane.dimensionCenterX; - moveZ = transitionPlane.spaceCenterZ - transitionPlane.dimensionCenterZ; - targetWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - } else if (closestPlaneDistance > planeDistance) { - closestPlaneDistance = planeDistance; - closestTransitionPlane = transitionPlane; - } - } - } - if (!planeFound) { - LocalProfiler.stop(); - String msg = "Unable to reach space!\nThere's no valid transition plane for current dimension " + worldObj.provider.getDimensionName() + " (" + worldObj.provider.dimensionId + ")"; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - if (!planeValid) { - LocalProfiler.stop(); - @SuppressWarnings("null") - String msg = "Ship is outside border, unable to reach space!\nClosest transition plane is ~" + closestPlaneDistance + " m away (" - + (closestTransitionPlane.dimensionCenterX - closestTransitionPlane.borderSizeX) + ", 250," - + (closestTransitionPlane.dimensionCenterZ - closestTransitionPlane.borderSizeZ) + ") to (" - + (closestTransitionPlane.dimensionCenterX + closestTransitionPlane.borderSizeX) + ", 255," - + (closestTransitionPlane.dimensionCenterZ + closestTransitionPlane.borderSizeZ) + ")"; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - } else if (fromSpace) { - Boolean planeFound = false; - int closestPlaneDistance = Integer.MAX_VALUE; - TransitionPlane closestTransitionPlane = null; - for (int iPlane = 0; (!planeFound) && iPlane < WarpDriveConfig.G_TRANSITIONPLANES.length; iPlane++) { - TransitionPlane transitionPlane = WarpDriveConfig.G_TRANSITIONPLANES[iPlane]; - int planeDistance = transitionPlane.isValidFromSpace(new Vector3(this)); - if (planeDistance == 0) { - planeFound = true; - moveX = transitionPlane.dimensionCenterX - transitionPlane.spaceCenterX; - moveZ = transitionPlane.dimensionCenterZ - transitionPlane.spaceCenterZ; - targetWorld = DimensionManager.getWorld(transitionPlane.dimensionId); - } else if (closestPlaneDistance > planeDistance) { - closestPlaneDistance = planeDistance; - closestTransitionPlane = transitionPlane; - } - } - if (!planeFound) { - LocalProfiler.stop(); - String msg = ""; - if (closestTransitionPlane == null) { - msg = "No transition plane defined, unable to enter atmosphere!"; - } else { - msg = "No planet in range, unable to enter atmosphere!\nClosest transition plane is " + closestPlaneDistance + " m away (" - + (closestTransitionPlane.dimensionCenterX - closestTransitionPlane.borderSizeX) + ", 250," - + (closestTransitionPlane.dimensionCenterZ - closestTransitionPlane.borderSizeZ) + ") to (" - + (closestTransitionPlane.dimensionCenterX + closestTransitionPlane.borderSizeX) + ", 255," - + (closestTransitionPlane.dimensionCenterZ + closestTransitionPlane.borderSizeZ) + ")"; - } - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - } else if (isHyperspaceJump && isInHyperSpace) { - targetWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - } else if (isHyperspaceJump && isInSpace) { - targetWorld = DimensionManager.getWorld(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID); - } else { - targetWorld = worldObj; - } - - // FIXME - //turnOffModems(); - - // Calculate jump vector - if (isCoordJump) { - moveX = destX - xCoord; - moveZ = destZ - zCoord; - moveY = destY - yCoord; - distance = 0; // FIXME: check collision in straight path, starting with getPossibleJumpDistance() ? - } else if (isHyperspaceJump) { - distance = 0; - } else { - if (toSpace) { - // enter space at current altitude - moveY = 0; - } else if (fromSpace) { - // re-enter atmosphere at max altitude - moveY = 245 - maxY; - } else { - // Do not check in long jumps - if (distance < 256) { - distance = getPossibleJumpDistance(); - } - - int movementVector[] = getVector(direction); - moveX = movementVector[0] * distance; - moveY = movementVector[1] * distance; - moveZ = movementVector[2] * distance; - - if ((maxY + moveY) > 255) { - moveY = 255 - maxY; - } - - if ((minY + moveY) < 5) { - moveY = 5 - minY; - } - } - } - - if (betweenWorlds) { - WarpDrive.debugPrint("" + this + " Worlds: " + worldObj.provider.getDimensionName() + " -> " + targetWorld.provider.getDimensionName()); - } - - // Validate positions aren't overlapping - if (!betweenWorlds) { - if ( Math.abs(moveX) <= (maxX - minX + 1) && Math.abs(moveY) <= (maxY - minY + 1) && Math.abs(moveZ) <= (maxZ - minZ + 1) ) { - // render fake explosions - doCollisionDamage(false); - - // cancel jump - LocalProfiler.stop(); - String msg = "Not enough space for jump!"; - messageToAllPlayersOnShip(msg); - killEntity(msg); - return; - } - } - - if (!forceChunks(reason)) { - String msg = reason.toString(); - killEntity(msg); - messageToAllPlayersOnShip(msg); - LocalProfiler.stop(); - return; - } -// lockWorlds(); - saveEntities(); - WarpDrive.debugPrint("" + this + " Saved " + entitiesOnShip.size() + " entities from ship"); - - if (isHyperspaceJump && isInSpace) { - messageToAllPlayersOnShip("Entering HYPERSPACE..."); - } else if (isHyperspaceJump && isInHyperSpace) { - messageToAllPlayersOnShip("Leaving HYPERSPACE.."); - } else if (isCoordJump) { - messageToAllPlayersOnShip("Jumping to coordinates (" + destX + "; " + yCoord + "; " + destZ + ")!"); - } else { - messageToAllPlayersOnShip("Jumping " + getDirectionLabel(direction) + " by " + distance + " blocks"); - } - - // validate ship content - int shipVolume = getRealShipVolume_checkBedrock(reason); - if (shipVolume == -1) { - String msg = reason.toString(); - killEntity(msg); - messageToAllPlayersOnShip(msg); - LocalProfiler.stop(); - return; - } - - saveShip(shipVolume); - this.currentIndexInShip = 0; - msCounter = System.currentTimeMillis(); - LocalProfiler.stop(); - WarpDrive.debugPrint("Removing TE duplicates: tileEntities in target world before jump: " + targetWorld.loadedTileEntityList.size()); - } - - /** - * Finish jump: move entities, unlock worlds and delete self - */ - private void finishJump() { - WarpDrive.debugPrint("" + this + " Jump done in " + ((System.currentTimeMillis() - msCounter) / 1000F) + " seconds and " + ticks + " ticks"); - //FIXME TileEntity duplication workaround - WarpDrive.debugPrint("Removing TE duplicates: tileEntities in target world after jump, before cleanup: " + targetWorld.loadedTileEntityList.size()); - LocalProfiler.start("EntityJump.removeDuplicates()"); - - try { - targetWorld.loadedTileEntityList = this.removeDuplicates(targetWorld.loadedTileEntityList); - } catch (Exception e) { - WarpDrive.debugPrint("TE Duplicates removing exception: " + e.getMessage()); - } - FixASTurbines(); - doCollisionDamage(true); - - LocalProfiler.stop(); - WarpDrive.debugPrint("Removing TE duplicates: tileEntities in target world after jump, after cleanup: " + targetWorld.loadedTileEntityList.size()); - killEntity("Jump done"); - } - - /** - * Removing ship from world - * - */ - private void removeShip() { - LocalProfiler.start("EntityJump.removeShip"); - int blocksToMove = Math.min(WarpDriveConfig.G_BLOCKS_PER_TICK, ship.length - currentIndexInShip); - WarpDrive.debugPrint("" + this + " Removing ship blocks " + currentIndexInShip + " to " + (currentIndexInShip + blocksToMove - 1) + " / " + (ship.length - 1)); - TileEntity te; - Class teClass; - Class teSuperclass; - for (int index = 0; index < blocksToMove; index++) { - if (currentIndexInShip >= ship.length) { - break; - } - JumpBlock jb = ship[ship.length - currentIndexInShip - 1]; - if (jb == null) { - WarpDrive.debugPrint("" + this + " Removing ship part: unexpected null found at ship[" + currentIndexInShip + "]"); - currentIndexInShip++; - continue; - } - - if (jb.blockTileEntity != null) { - // WarpDrive.debugPrint("Removing tile entity at " + jb.x + ", " + jb.y + ", " + jb.z); - worldObj.removeBlockTileEntity(jb.x, jb.y, jb.z); - } - worldObj.setBlock(jb.x, jb.y, jb.z, 0, 0, 2); - - te = targetWorld.getBlockTileEntity(jb.x + moveX, jb.y + moveY, jb.z + moveZ); - if (te != null) { - teClass = te.getClass(); - // WarpDrive.debugPrint("Tile at " + jb.x + ", " + jb.y + ", " + jb.z + " is " + teClass + " derived from " + teClass.getSuperclass()); - if (teClass.getName().equals("atomicscience.jiqi.TTurbine")) { - try { - if (teClass.getField("shiDa").getBoolean(te)) - ASTurbines.add(te); - } catch (Exception e) { - WarpDrive.print("Exception involving TileEntity '" + teClass.getName() + "' at " + jb.x + ", " + jb.y + ", " + jb.z); - e.printStackTrace(); - } - } else if (te instanceof TileEntityReactor) { - WarpDrive.warpCores.removeFromRegistry((TileEntityReactor)te); - } - - teSuperclass = teClass.getSuperclass(); - if ( teSuperclass.getName().equals("ic2.core.block.wiring.TileEntityElectricBlock") - || teSuperclass.getName().equals("ic2.core.block.TileEntityBlock") - || teSuperclass.getName().contains("ic2.core.block.generator")) { - try { - Method onUnloaded = teSuperclass.getDeclaredMethod("onUnloaded"); - Method onLoaded = teSuperclass.getDeclaredMethod("onLoaded"); - if (onUnloaded != null && onLoaded != null) { - onUnloaded.invoke(te); - onLoaded.invoke(te); - } - } catch (Exception e) { - WarpDrive.print("Exception involving TileEntity '" + teClass.getName() + "' at " + jb.x + ", " + jb.y + ", " + jb.z); - e.printStackTrace(); - } - te.updateContainingBlockInfo(); - try { - NetworkHelper.updateTileEntityField(te, "facing"); - } catch (Exception e) { - WarpDrive.print("Exception involving TileEntity '" + teClass.getName() + "' at " + jb.x + ", " + jb.y + ", " + jb.z); - e.printStackTrace(); - } - } - } - - currentIndexInShip++; - } - LocalProfiler.stop(); - } - - /** - * Saving ship to memory - * - * @param shipSize - */ - private void saveShip(int shipSize) { - LocalProfiler.start("EntityJump.saveShip"); - try { - int reactorChamber = WarpDriveConfig.isICLoaded ? WarpDriveConfig.getIC2Item("reactorChamber").itemID : 0; - - ship = new JumpBlock[shipSize]; - JumpBlock placeAfter[] = new JumpBlock[shipSize]; // blocks and tile entities to be placed at the end, and removed first - - int indexPlaceNormal = 0; - int indexPlaceAfter = 0; - int xc1 = minX >> 4; - int xc2 = maxX >> 4; - int zc1 = minZ >> 4; - int zc2 = maxZ >> 4; - - for (int xc = xc1; xc <= xc2; xc++) { - int x1 = Math.max(minX, xc << 4); - int x2 = Math.min(maxX, (xc << 4) + 15); - - for (int zc = zc1; zc <= zc2; zc++) { - int z1 = Math.max(minZ, zc << 4); - int z2 = Math.min(maxZ, (zc << 4) + 15); - - for (int y = minY; y <= maxY; y++) { - for (int x = x1; x <= x2; x++) { - for (int z = z1; z <= z2; z++) { - int blockID = worldObj.getBlockId(x, y, z); - - // Skip air blocks - if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) { - continue; - } - - int blockMeta = worldObj.getBlockMetadata(x, y, z); - TileEntity tileEntity = worldObj.getBlockTileEntity(x, y, z); - JumpBlock jumpBlock = new JumpBlock(blockID, blockMeta, tileEntity, x, y, z); - - if (tileEntity == null || blockID != reactorChamber) { - ship[indexPlaceNormal] = jumpBlock; - indexPlaceNormal++; - } else { - placeAfter[indexPlaceAfter] = jumpBlock; - indexPlaceAfter++; - } - } - } - } - } - } - - for (int index = 0; index < indexPlaceAfter; index++) { - ship[indexPlaceNormal] = placeAfter[index]; - indexPlaceNormal++; - } - } catch (Exception e) { - e.printStackTrace(); - killEntity("Exception during jump preparation (saveShip)!"); - LocalProfiler.stop(); - return; - } - - WarpDrive.debugPrint("" + this + " Ship saved as " + ship.length + " blocks"); - LocalProfiler.stop(); - } - - /** - *Ship moving - */ - private void moveShip() { - LocalProfiler.start("EntityJump.moveShip"); - int blocksToMove = Math.min(WarpDriveConfig.G_BLOCKS_PER_TICK, ship.length - currentIndexInShip); - WarpDrive.debugPrint("" + this + " Moving ship blocks " + currentIndexInShip + " to " + (currentIndexInShip + blocksToMove - 1) + " / " + (ship.length - 1)); - - for (int index = 0; index < blocksToMove; index++) { - if (currentIndexInShip >= ship.length) { - break; - } - - JumpBlock jb = ship[currentIndexInShip]; - if (jb != null) { - jb.deploy(targetWorld, moveX, moveY, moveZ); - if (jb.blockID != WarpDriveConfig.CC_peripheral || (jb.blockMeta != 2 && jb.blockMeta != 4)) { - worldObj.removeBlockTileEntity(jb.x, jb.y, jb.z); - } - } - currentIndexInShip++; - } - - LocalProfiler.stop(); - } - - /** - * Checking jump possibility - * - * @return possible jump distance or -1 - */ - private int getPossibleJumpDistance() { - WarpDrive.debugPrint("" + this + " Calculating possible jump distance..."); - int testDistance = this.distance; - int blowPoints = 0; - collisionDetected = false; - - CheckMovementResult result = null; - while (testDistance >= 0) { - // Is there enough space in destination point? - result = checkMovement(testDistance, false); - - if (result == null) { - break; - } - - if (result.isCollision) { - blowPoints++; - } - testDistance--; - } - - if (distance != testDistance) { - WarpDrive.debugPrint("" + this + " Jump distance adjusted to " + testDistance + " after " + blowPoints + " collisions"); - } - - // Register explosion(s) at collision point - if (blowPoints > WarpDriveConfig.WC_COLLISION_TOLERANCE_BLOCKS) { - result = checkMovement(Math.max(1, testDistance + 1), true); - if (result != null) { - /* - * Strength scaling: - * Creeper = 3 or 6 - * Wither skull = 1 - * Wither boom = 5 - * Endercrystal = 6 - * TNTcart = 4 to 11.5 - * TNT = 4 - */ - float massCorrection = 0.5F + (float)Math.sqrt( - Math.min(1.0D, Math.max(0.0D, reactor.shipVolume - WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE) / WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE)); - collisionDetected = true; - collisionStrength = (4.0F + blowPoints - WarpDriveConfig.WC_COLLISION_TOLERANCE_BLOCKS) * massCorrection; - collisionAtSource = result.atSource; - collisionAtTarget = result.atTarget; - WarpDrive.debugPrint("" + this + " Reporting " + collisionAtTarget.size() + " collisions coordinates " - + blowPoints + " blowPoints with massCorrection of " + String.format("%.2f", massCorrection) + " => strength " + String.format("%.2f", collisionStrength) ); - } else { - WarpDrive.print("WarpDrive error: unable to compute collision points, ignoring..."); - } - } - - return testDistance; - } - - private void doCollisionDamage(boolean atTarget) { - if (!collisionDetected) { - WarpDrive.debugPrint("" + this + " doCollisionDamage No collision detected..."); - return; - } - ArrayList collisionPoints = atTarget ? collisionAtTarget : collisionAtSource; - Vector3 min = collisionPoints.get(0); - Vector3 max = collisionPoints.get(0); - for (Vector3 v : collisionPoints) { - if (min.x > v.x) { - min.x = v.x; - } else if (max.x < v.x) { - max.x = v.x; - } - if (min.y > v.y) { - min.y = v.y; - } else if (max.y < v.y) { - max.y = v.y; - } - if (min.z > v.z) { - min.z = v.z; - } else if (max.z < v.z) { - max.z = v.z; - } - } - - // inform players on board - double rx = Math.round(min.x + worldObj.rand.nextInt( Math.max(1, (int) (max.x - min.x)) )); - double ry = Math.round(min.y + worldObj.rand.nextInt( Math.max(1, (int) (max.y - min.y)) )); - double rz = Math.round(min.z + worldObj.rand.nextInt( Math.max(1, (int) (max.z - min.z)) )); -// WarpDrive.debugPrint("doCollisionDamage msg " + rx + ", " + ry + ", " + rz + " atTarget " + atTarget + " min " + min + " max " + max); - messageToAllPlayersOnShip("Ship collision detected around " + (int)rx + ", " + (int)ry + ", " + (int)rz + ". Damage report pending..."); - - // randomize if too many collision points - int nbExplosions = Math.min(5, collisionPoints.size()); - WarpDrive.debugPrint("doCollisionDamage nbExplosions " + nbExplosions + "/" + collisionPoints.size()); - for (int i = 0; i < nbExplosions; i++) { - // get location - Vector3 current; - if (nbExplosions < collisionPoints.size()) { - WarpDrive.debugPrint("doCollisionDamage random #" + i); - current = collisionPoints.get(worldObj.rand.nextInt(collisionPoints.size())); - } else { - WarpDrive.debugPrint("doCollisionDamage get " + i); - current = collisionPoints.get(i); - } - - // compute explosion strength with a jitter, at least 1 TNT - float strength = Math.max(4.0F, collisionStrength / nbExplosions - 2.0F + 2.0F * worldObj.rand.nextFloat()); - - (atTarget ? targetWorld : worldObj).newExplosion((Entity) null, current.x, current.y, current.z, strength, atTarget, atTarget); - WarpDrive.debugPrint("doCollisionDamage explosion at " + current.x + ", " + current.y + ", " + current.z + " with strength " + strength); - } - } - - private int getRealShipVolume_checkBedrock(StringBuilder reason) { - LocalProfiler.start("EntityJump.getRealShipVolume_checkBedrock"); - int shipVolume = 0; - - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - int blockID = worldObj.getBlockId(x, y, z); - - // Skipping vanilla air & WarpDrive gas blocks, keep WarpDrive air block - if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) {// whitelist - continue; - } - - shipVolume++; - - /* - Item item = Item.itemsList[blockID]; - if (item == null) - WarpDrive.debugPrint("Block(" + x + ", " + y + ", " + z + ") is undefined#" + blockID + ":" + worldObj.getBlockMetadata(x, y, z)); - else - WarpDrive.debugPrint("Block(" + x + ", " + y + ", " + z + ") is " + item.getUnlocalizedName() + ":" + worldObj.getBlockMetadata(x, y, z)); - /**/ - - if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist - reason.append("Bedrock detected onboard at " + x + ", " + y + ", " + z + ". Aborting."); - LocalProfiler.stop(); - return -1; - } - } - } - } - - // Lem: abort jump if blocks with TE are connecting to the ship (avoid crash when splitting multi-blocks) - for (int x = minX - 1; x <= maxX + 1; x++) { - boolean xBorder = (x == minX - 1) || (x == maxX + 1); - for (int z = minZ - 1; z <= maxZ + 1; z++) { - boolean zBorder = (z == minZ - 1) || (z == maxZ + 1); - for (int y = minY - 1; y <= maxY + 1; y++) { - boolean yBorder = (y == minY - 1) || (y == maxY + 1); - if ((y < 0) || (y > 255)) - continue; - if (!(xBorder || yBorder || zBorder)) - continue; - - int blockID = worldObj.getBlockId(x, y, z); - - // Skipping air blocks - if (worldObj.isAirBlock(x, y, z)) { - continue; - } - - // Skipping unmovable blocks - if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist - continue; - } - - TileEntity te = worldObj.getBlockTileEntity(x, y, z); - if (te == null) { - continue; - } - - reason.append("Ship snagged at " + x + ", " + y + ", " + z + ". Damage report pending..."); - worldObj.createExplosion((Entity) null, x, y, z, Math.min(4F * 30, 4F * (shipVolume / 50)), false); - LocalProfiler.stop(); - return -1; - } - } - } - - LocalProfiler.stop(); - return shipVolume; - } - - - private void saveEntities() { - entitiesOnShip = new ArrayList(); - - 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 Entity) || (o instanceof EntityJump)) { - continue; - } - - Entity entity = (Entity)o; - MovingEntity movingEntity = new MovingEntity(entity); - entitiesOnShip.add(movingEntity); - } - } - - - private boolean moveEntities(boolean restorePositions) { - WarpDrive.debugPrint("" + this + " Moving entities"); - LocalProfiler.start("EntityJump.moveEntities"); - - if (entitiesOnShip != null) { - for (MovingEntity me : entitiesOnShip) { - Entity entity = me.entity; - - if (entity == null) { - continue; - } - - double oldEntityX = me.oldX; - double oldEntityY = me.oldY; - double oldEntityZ = me.oldZ; - double newEntityX; - double newEntityY; - double newEntityZ; - - if (restorePositions) { - newEntityX = oldEntityX; - newEntityY = oldEntityY; - newEntityZ = oldEntityZ; - } else { - newEntityX = oldEntityX + moveX; - newEntityY = oldEntityY + moveY; - newEntityZ = oldEntityZ + moveZ; - } - - //WarpDrive.debugPrint("Entity moving: old (" + oldEntityX + " " + oldEntityY + " " + oldEntityZ + ") -> new (" + newEntityX + " " + newEntityY + " " + newEntityZ); - - // Travel to another dimension if needed - if (betweenWorlds && !restorePositions) { - MinecraftServer server = MinecraftServer.getServer(); - WorldServer from = server.worldServerForDimension(worldObj.provider.dimensionId); - WorldServer to = server.worldServerForDimension(targetWorld.provider.dimensionId); - SpaceTeleporter teleporter = new SpaceTeleporter(to, 0, MathHelper.floor_double(newEntityX), MathHelper.floor_double(newEntityY), MathHelper.floor_double(newEntityZ)); - - if (entity instanceof EntityPlayerMP) { - EntityPlayerMP player = (EntityPlayerMP) entity; - server.getConfigurationManager().transferPlayerToDimension(player, targetWorld.provider.dimensionId, teleporter); - } else { - server.getConfigurationManager().transferEntityToWorld(entity, worldObj.provider.dimensionId, from, to, teleporter); - } - } - - // Update position - if (entity instanceof EntityPlayerMP) { - EntityPlayerMP player = (EntityPlayerMP) entity; - - ChunkCoordinates bedLocation = player.getBedLocation(player.worldObj.provider.dimensionId); - - if (bedLocation != null - && minX <= bedLocation.posX && maxX >= bedLocation.posX - && minY <= bedLocation.posY && maxY >= bedLocation.posY - && minZ <= bedLocation.posZ && maxZ >= bedLocation.posZ) { - bedLocation.posX = bedLocation.posX + moveX; - bedLocation.posY = bedLocation.posY + moveY; - bedLocation.posZ = bedLocation.posZ + moveZ; - player.setSpawnChunk(bedLocation, false); - } - - player.setPositionAndUpdate(newEntityX, newEntityY, newEntityZ); - } else { - entity.setPosition(newEntityX, newEntityY, newEntityZ); - } - } - } - - LocalProfiler.stop(); - 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] = dx; - v[2] = dz; - break; - - case 180: - v[0] = -dx; - v[2] = -dz; - break; - - case 90: - v[0] = dz; - v[2] = -dx; - break; - - case 270: - v[0] = -dz; - v[2] = dx; - } - - return v; - } - - class CheckMovementResult { - public ArrayList atSource; - public ArrayList atTarget; - public boolean isCollision = false; - public String reason = ""; - - CheckMovementResult() { - this.atSource = new ArrayList(1); - this.atTarget = new ArrayList(1); - this.isCollision = false; - this.reason = "Unknown reason"; - } - - public void add(double sx, double sy, double sz, double tx, double ty, double tz, boolean pisCollision, String preason) { - atSource.add(new Vector3(sx, sy, sz)); - atTarget.add(new Vector3(tx, ty, tz)); - isCollision = isCollision || pisCollision; - reason = preason; - WarpDrive.debugPrint("CheckMovementResult " + sx + ", " + sy + ", " + sz + " -> " + tx + ", " + ty + ", " + tz + " " + isCollision + " '" + reason + "'"); - } - }; - private CheckMovementResult checkMovement(int testDistance, boolean fullCollisionDetails) { - CheckMovementResult result = new CheckMovementResult(); - if ((direction == -1 && maxY + testDistance > 255) && !betweenWorlds) { - result.add(xCoord, maxY + testDistance, zCoord, xCoord + 0.5D, maxY + testDistance + 1.0D, zCoord + 0.5D, - false, "Reactor will blow due +high limit"); - return result; - } - - if ((direction == -2 && minY - testDistance <= 8) && !betweenWorlds) { - result.add(xCoord, minY - testDistance, zCoord, xCoord + 0.5D, maxY - testDistance, zCoord + 0.5D, - false, "Reactor will blow due -low limit"); - return result; - } - - int movementVector[] = getVector(direction); - int lmoveX = movementVector[0] * testDistance; - int lmoveY = movementVector[1] * testDistance; - int lmoveZ = movementVector[2] * testDistance; - - int x, y, z, newX, newY, newZ, blockOnShipID, blockID; - for (y = minY; y <= maxY; y++) { - newY = y + lmoveY; - for (x = minX; x <= maxX; x++) { - newX = x + lmoveX; - for (z = minZ; z <= maxZ; z++) { - newZ = z + lmoveZ; - - blockID = worldObj.getBlockId(newX, newY, newZ); - if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist - 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 " + blockID + " detected at destination (" + newX + ";" + newY + ";" + newZ + ")"); - if (!fullCollisionDetails) { - return result; - } - } - - blockOnShipID = worldObj.getBlockId(x, y, z); - if (blockOnShipID != 0 && blockID != 0 && blockID != WarpDriveConfig.airID && blockID != WarpDriveConfig.gasID && blockID != 18) { - 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 #" + blockID + " detected at (" + newX + ", " + newY + ", " + newZ + ")"); - if (!fullCollisionDetails) { - return result; - } - } - } - } - } - - if (fullCollisionDetails && result.isCollision) { - return result; - } else { - return null; - } - } -/* - private void turnOffModem(IPeripheral p) - { - // FIXME - if (p.getType() == "modem") { - String[] methods = p.getMethodNames(); - for(int i = 0; i < methods.length; i++) { - if (methods[i] == "closeAll") { - try { - p.callMethod(null, i, null); // FIXME - } catch (Exception e) { - // ignore iy - } - return; - } - } - } - } - - private void turnOffModems() - { - // FIXME - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - int blockID = worldObj.getBlockId(x, y, z); - if (blockID == 0 || blockID == WarpDriveConfig.airID || blockID == WarpDriveConfig.gasID) { - continue; - } - - TileEntity tileEntity = worldObj.getBlockTileEntity(x, y, z); - if (tileEntity == null) continue; - - if (tileEntity instanceof IPeripheral) { - IPeripheral p = (IPeripheral)tileEntity; - turnOffModem(p); - } - if (tileEntity instanceof ITurtleAccess) { - ITurtleAccess a = (ITurtleAccess)tileEntity; - IPeripheral pl = a.getPeripheral(TurtleSide.Left); - if (pl != null) turnOffModem(pl); - IPeripheral pr = a.getPeripheral(TurtleSide.Right); - if (pr != null) turnOffModem(pr); - } - } - } - } - }/**/ - - private static ArrayList removeDuplicates(List l) - { - Set s = new TreeSet(new Comparator() - { - @Override - public int compare(TileEntity o1, TileEntity o2) - { - if (o1.xCoord == o2.xCoord && o1.yCoord == o2.yCoord && o1.zCoord == o2.zCoord) - { - WarpDrive.debugPrint("Removed duplicated TE: " + o1 + ", " + o2); - return 0; - } - else - { - return 1; - } - } - }); - s.addAll(l); - return new ArrayList(Arrays.asList(s.toArray())); - } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - //WarpDrive.debugPrint("" + this + " readEntityFromNBT()"); - } - - @Override - protected void entityInit() { - //WarpDrive.debugPrint("" + this + " entityInit()"); - } - - @Override - protected void writeEntityToNBT(NBTTagCompound var1) { - //WarpDrive.debugPrint("" + this + " writeEntityToNBT()"); - } - - private void FixASTurbines() - { - Class c; - for (TileEntity t : ASTurbines) - try - { - c = t.getClass(); - Method method = c.getDeclaredMethod("bianDa", (Class[])null); - method.invoke(t, (Object[])null); - method.invoke(t, (Object[])null); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - public void setMinMaxes(int minXV,int maxXV,int minYV,int maxYV,int minZV,int maxZV) - { - minX = minXV; - maxX = maxXV; - minY = minYV; - maxY = maxYV; - minZ = minZV; - maxZ = maxZV; - } - - @Override - public String toString() { - return String.format("%s/%d \'%s\' @ \'%s\' %.2f, %.2f, %.2f", new Object[] { - getClass().getSimpleName(), - Integer.valueOf(entityId), - reactor == null ? "~NULL~" : reactor.coreFrequency, - worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Double.valueOf(posX), Double.valueOf(posY), Double.valueOf(posZ)}); - } -} \ No newline at end of file diff --git a/src/cr0s/WarpDrive/WarpDrive.java b/src/cr0s/WarpDrive/WarpDrive.java deleted file mode 100644 index c99e35b7..00000000 --- a/src/cr0s/WarpDrive/WarpDrive.java +++ /dev/null @@ -1,818 +0,0 @@ -package cr0s.WarpDrive; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.Mod.Instance; -import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.network.NetworkMod; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.block.*; -import cr0s.WarpDrive.command.*; -import cr0s.WarpDrive.data.*; -import cr0s.WarpDrive.item.*; -import cr0s.WarpDrive.machines.*; -import cr0s.WarpDrive.render.*; -import cr0s.WarpDrive.world.*; -import dan200.computercraft.api.ComputerCraftAPI; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.EnumArmorMaterial; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraftforge.common.Configuration; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.EnumHelper; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; -import net.minecraftforge.common.ForgeChunkManager.Ticket; -import net.minecraftforge.common.ForgeChunkManager.Type; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -@Mod(modid = "WarpDrive", name = "WarpDrive", version = "1.2.7.0", - dependencies = "required-after:IC2;" - + " required-after:CoFHCore;" - + " after:ComputerCraft;" - + " after:OpenComputer;" - + " after:CCTurtle;" - + " after:gregtech_addon;" - + " required-after:AppliedEnergistics;" - + " after:AdvancedSolarPanel;" - + " after:AtomicScience;" - + " after:ICBM|Explosion;" - + " after:MFFS;" - + " after:GraviSuite;" - + " after:UndergroundBiomes;" - + " after:NetherOres") -@NetworkMod(clientSideRequired = true, serverSideRequired = true, channels = { - "WarpDriveBeam", - "WarpDriveFreq", - "WarpDriveLaserT", - "WarpDriveCloaks" }, packetHandler = PacketHandler.class) -/** - * @author Cr0s - */ -public class WarpDrive implements LoadingCallback { - public static Block warpCore; - public static Block protocolBlock; - public static Block radarBlock; - public static Block isolationBlock; - public static Block airgenBlock; - public static Block laserBlock; - public static Block laserCamBlock; - public static Block cameraBlock; - public static Block monitorBlock; - public static Block boosterBlock; - public static Block miningLaserBlock; - public static Block laserTreeFarmBlock; - public static Block liftBlock; - public static Block scannerBlock; - public static Block cloakBlock; - public static Block cloakCoilBlock; - public static Block transporterBlock; - public static Block reactorMonitorBlock; - public static Block powerReactorBlock; - public static Block powerLaserBlock; - public static Block powerStoreBlock; - public static Block airBlock; - public static Block gasBlock; - public static Block iridiumBlock; - public static Block transportBeaconBlock; - public static Block chunkLoaderBlock; - public static BlockDecorative decorativeBlock; - - public static Item reactorLaserFocusItem; - public static ItemWarpComponent componentItem; - public static ItemWarpUpgrade upgradeItem; - - public static EnumArmorMaterial armorMaterial = EnumHelper.addArmorMaterial("WARP", 5, new int[]{1, 3, 2, 1}, 15); - public static ItemWarpArmor helmetItem; - public static ItemWarpAirCanister airCanisterItem; - - public static BiomeGenBase spaceBiome; - public World space; - public SpaceWorldGenerator spaceWorldGenerator; - public HyperSpaceWorldGenerator hyperSpaceWorldGenerator; - public World hyperSpace; - - // Client settings - public static float normalFOV = 70.0F; - public static float normalSensitivity = 1.0F; - - public static CreativeTabs warpdriveTab = new WarpDriveCreativeTab("Warpdrive", "Warpdrive").setBackgroundImageName("warpdrive:creativeTab"); - - @Instance("WarpDrive") - public static WarpDrive instance; - @SidedProxy(clientSide = "cr0s.WarpDrive.client.ClientProxy", serverSide = "cr0s.WarpDrive.CommonProxy") - public static CommonProxy proxy; - - public static WarpCoresRegistry warpCores; - public static JumpgatesRegistry jumpgates; - public static CloakManager cloaks; - - public static CamRegistry cams; - public boolean isOverlayEnabled = false; - public int overlayType = 0; - public String debugMessage = ""; - - public static WarpDrivePeripheralHandler peripheralHandler = null; - - public static String defHelpStr = "help(\"functionName\"): returns help for the function specified"; - public static String defEnergyStr = "getEnergyLevel(): returns currently contained energy, max contained energy"; - public static String defUpgradeStr = "upgrades(): returns a list of currently installed upgrades"; - - @EventHandler - public void preInit(FMLPreInitializationEvent event) { - WarpDriveConfig.preInit(new Configuration(event.getSuggestedConfigurationFile())); - - if (FMLCommonHandler.instance().getSide().isClient()) { - Minecraft mc = Minecraft.getMinecraft(); - - // System.out.println("[WarpDrive] Registering sounds event handler..."); - MinecraftForge.EVENT_BUS.register(new SoundHandler()); - - normalFOV = mc.gameSettings.fovSetting; - normalSensitivity = mc.gameSettings.mouseSensitivity; - WarpDrive.print("[WarpDrive] FOV is " + normalFOV + " Sensitivity is " + normalSensitivity); - } - } - - @SideOnly(Side.CLIENT) - @EventHandler - public void init(FMLInitializationEvent event) { -// FIXME FMLInterModComms.sendMessage("Waila", "register", "cr0s.WarpDrive.client.WailaHandler.callbackRegister"); - } - - public static void print(String out) { - System.out.println((FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client ":"Server ") + out); - } - - public static void debugPrint(String out) { - if (WarpDriveConfig.G_DEBUGMODE) { - print(out); - } - } - - @EventHandler - public void load(FMLInitializationEvent event) { - WarpDriveConfig.load(); - - // CORE CONTROLLER - protocolBlock = new BlockProtocol(WarpDriveConfig.controllerID,0, Material.rock); - - GameRegistry.registerBlock(protocolBlock, "protocolBlock"); - GameRegistry.registerTileEntity(TileEntityProtocol.class, "protocolBlock"); - - // WARP CORE - warpCore = new BlockReactor(WarpDriveConfig.coreID, 0, Material.rock); - - GameRegistry.registerBlock(warpCore, "warpCore"); - GameRegistry.registerTileEntity(TileEntityReactor.class, "warpCore"); - - // WARP RADAR - radarBlock = new BlockRadar(WarpDriveConfig.radarID, 0, Material.rock); - - GameRegistry.registerBlock(radarBlock, "radarBlock"); - GameRegistry.registerTileEntity(TileEntityRadar.class, "radarBlock"); - - // WARP ISOLATION - isolationBlock = new BlockWarpIsolation( WarpDriveConfig.isolationID, 0, Material.rock); - - GameRegistry.registerBlock(isolationBlock, "isolationBlock"); - - // AIR GENERATOR - airgenBlock = new BlockAirGenerator(WarpDriveConfig.airgenID, 0,Material.rock); - - GameRegistry.registerBlock(airgenBlock, "airgenBlock"); - GameRegistry.registerTileEntity(TileEntityAirGenerator.class, "airgenBlock"); - - - // AIR BLOCK - airBlock = (new BlockAir(WarpDriveConfig.airID)); - - GameRegistry.registerBlock(airBlock, "airBlock"); - - // GAS BLOCK - gasBlock = (new BlockGas(WarpDriveConfig.gasID)); - - GameRegistry.registerBlock(gasBlock, "gasBlock"); - - // LASER EMITTER - laserBlock = new BlockLaser(WarpDriveConfig.laserID, 0,Material.rock); - - GameRegistry.registerBlock(laserBlock, "laserBlock"); - GameRegistry.registerTileEntity(TileEntityLaser.class, "laserBlock"); - - // LASER EMITTER WITH CAMERA - laserCamBlock = new BlockLaserCam(WarpDriveConfig.laserCamID, 0, Material.rock); - - GameRegistry.registerBlock(laserCamBlock, "laserCamBlock"); - - // CAMERA - cameraBlock = new BlockCamera(WarpDriveConfig.camID, 0,Material.rock); - - GameRegistry.registerBlock(cameraBlock, "cameraBlock"); - GameRegistry.registerTileEntity(TileEntityCamera.class, "cameraBlock"); - - // MONITOR - monitorBlock = new BlockMonitor(WarpDriveConfig.monitorID); - - GameRegistry.registerBlock(monitorBlock, "monitorBlock"); - GameRegistry.registerTileEntity(TileEntityMonitor.class, "monitorBlock"); - - - // MINING LASER - miningLaserBlock = new BlockMiningLaser(WarpDriveConfig.miningLaserID, 0, Material.rock); - - GameRegistry.registerBlock(miningLaserBlock, "miningLaserBlock"); - GameRegistry.registerTileEntity(TileEntityMiningLaser.class, "miningLaserBlock"); - - // LASER TREE FARM - laserTreeFarmBlock = new BlockLaserTreeFarm(WarpDriveConfig.laserTreeFarmID, 0, Material.rock); - - GameRegistry.registerBlock(laserTreeFarmBlock, "laserTreeFarmBlock"); - GameRegistry.registerTileEntity(TileEntityLaserTreeFarm.class,"laserTreeFarmBlock"); - - // PARTICLE BOOSTER - boosterBlock = new BlockParticleBooster(WarpDriveConfig.particleBoosterID, 0, Material.rock); - - GameRegistry.registerBlock(boosterBlock, "boosterBlock"); - GameRegistry.registerTileEntity(TileEntityParticleBooster.class, "boosterBlock"); - - // LASER LIFT - liftBlock = new BlockLift(WarpDriveConfig.liftID, 0, Material.rock); - - GameRegistry.registerBlock(liftBlock, "liftBlock"); - GameRegistry.registerTileEntity(TileEntityLift.class, "liftBlock"); - - // IRIDIUM BLOCK - iridiumBlock = new BlockIridium(WarpDriveConfig.iridiumBlockID); - - GameRegistry.registerBlock(iridiumBlock, "iridiumBlock"); - - // SHIP SCANNER - scannerBlock = new BlockShipScanner(WarpDriveConfig.shipScannerID, 0, Material.rock); - - GameRegistry.registerBlock(scannerBlock, "scannerBlock"); - GameRegistry.registerTileEntity(TileEntityShipScanner.class, "scannerBlock"); - - // CLOAKING DEVICE CORE - cloakBlock = new BlockCloakingDeviceCore(WarpDriveConfig.cloakCoreID, 0, Material.rock); - - GameRegistry.registerBlock(cloakBlock, "cloakBlock"); - GameRegistry.registerTileEntity(TileEntityCloakingDeviceCore.class, "cloakBlock"); - - // CLOAKING DEVICE COIL - cloakCoilBlock = new BlockCloakingCoil(WarpDriveConfig.cloakCoilID, 0, Material.rock); - - GameRegistry.registerBlock(cloakCoilBlock, "cloakCoilBlock"); - - // TRANSPORTER - transporterBlock = new BlockTransporter(WarpDriveConfig.transporterID,Material.rock); - - GameRegistry.registerBlock(transporterBlock, "transporter"); - GameRegistry.registerTileEntity(TileEntityTransporter.class,"transporter"); - - // REACTOR MONITOR - reactorMonitorBlock = new BlockLaserReactorMonitor(WarpDriveConfig.reactorMonitorID, Material.rock); - - GameRegistry.registerBlock(reactorMonitorBlock, "reactorMonitor"); - GameRegistry.registerTileEntity(TileEntityLaserReactorMonitor.class,"reactorMonitor"); - - // TRANSPORT BEACON - transportBeaconBlock = new BlockTransportBeacon(WarpDriveConfig.transportBeaconID); - - GameRegistry.registerBlock(transportBeaconBlock, "transportBeacon"); - - // POWER REACTOR, LASER, STORE - powerReactorBlock = new BlockPowerReactor(WarpDriveConfig.powerReactorID); - GameRegistry.registerBlock(powerReactorBlock,"powerReactor"); - GameRegistry.registerTileEntity(TileEntityPowerReactor.class, "powerReactor"); - - powerLaserBlock = new BlockPowerLaser(WarpDriveConfig.powerLaserID); - GameRegistry.registerBlock(powerLaserBlock, "powerLaser"); - GameRegistry.registerTileEntity(TileEntityPowerLaser.class, "powerLaser"); - - powerStoreBlock = new BlockPowerStore(WarpDriveConfig.powerStoreID); - GameRegistry.registerBlock(powerStoreBlock,"powerStore"); - GameRegistry.registerTileEntity(TileEntityPowerStore.class, "powerStore"); - - // CHUNK LOADER - chunkLoaderBlock = new BlockChunkLoader(WarpDriveConfig.chunkLoaderID); - GameRegistry.registerBlock(chunkLoaderBlock, "chunkLoader"); - GameRegistry.registerTileEntity(TileEntityChunkLoader.class, "chunkLoader"); - - // DECORATIVE - decorativeBlock = new BlockDecorative(WarpDriveConfig.decorativeID); - GameRegistry.registerBlock(decorativeBlock, ItemBlockDecorative.class, "decorative"); - - // REACTOR LASER FOCUS - reactorLaserFocusItem = new ItemReactorLaserFocus(WarpDriveConfig.reactorLaserFocusID); - GameRegistry.registerItem(reactorLaserFocusItem, "reactorLaserFocus"); - - // COMPONENT ITEMS - componentItem = new ItemWarpComponent(WarpDriveConfig.componentID); - GameRegistry.registerItem(componentItem, "component"); - - helmetItem = new ItemWarpArmor(WarpDriveConfig.helmetID, 0); - GameRegistry.registerItem(helmetItem, "helmet"); - - airCanisterItem = new ItemWarpAirCanister(WarpDriveConfig.airCanisterID); - GameRegistry.registerItem(airCanisterItem, "airCanisterFull"); - - upgradeItem = new ItemWarpUpgrade(WarpDriveConfig.upgradeID); - GameRegistry.registerItem(upgradeItem, "upgrade"); - - proxy.registerEntities(); - ForgeChunkManager.setForcedChunkLoadingCallback(instance, instance); - - spaceWorldGenerator = new SpaceWorldGenerator(); - GameRegistry.registerWorldGenerator(spaceWorldGenerator); - hyperSpaceWorldGenerator = new HyperSpaceWorldGenerator(); - GameRegistry.registerWorldGenerator(hyperSpaceWorldGenerator); - - registerSpaceDimension(); - registerHyperSpaceDimension(); - - MinecraftForge.EVENT_BUS.register(new SpaceEventHandler()); - - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - warpdriveTab.setBackgroundImageName("items.png"); - MinecraftForge.EVENT_BUS.register(new CameraOverlay(Minecraft.getMinecraft())); - } - - if (WarpDriveConfig.isCCLoaded) { - peripheralHandler = new WarpDrivePeripheralHandler(); - ComputerCraftAPI.registerPeripheralProvider(peripheralHandler); - } - } - - @EventHandler - public void postInit(FMLPostInitializationEvent event) { - space = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - hyperSpace = DimensionManager.getWorld(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID); - - WarpDriveConfig.postInit(); - - if (WarpDriveConfig.isICLoaded && WarpDriveConfig.G_ENABLE_IC2_RECIPES) { - initIC2Recipes(); - } - if (WarpDriveConfig.isAppliedEnergisticsLoaded && WarpDriveConfig.isThermalExpansionLoaded && WarpDriveConfig.isAtomicScienceLoaded && WarpDriveConfig.G_ENABLE_TDK_RECIPES) { - initAETERecipes(); - } - if (WarpDriveConfig.G_ENABLE_VANILLA_RECIPES) { - initVanillaRecipes(); - } - - warpCores = new WarpCoresRegistry(); - jumpgates = new JumpgatesRegistry(); - cams = new CamRegistry(); - } - - private static void initVanillaRecipes() { - componentItem.registerRecipes(); - decorativeBlock.initRecipes(); - upgradeItem.initRecipes(); - - //WarpCore - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(warpCore), false, "ipi", "ici", "idi", - 'i', Item.ingotIron, - 'p', componentItem.getIS(6), - 'c', componentItem.getIS(2), - 'd', Item.diamond)); - - //Controller - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(protocolBlock), false, "ici", "idi", "iii", - 'i', Item.ingotIron, - 'c', componentItem.getIS(5), - 'd', Item.diamond)); - - //Radar - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(radarBlock), false, "ggg", "pdc", "iii", - 'i', Item.ingotIron, - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6), - 'g', Block.glass, - 'd', Item.diamond)); - - //Isolation Block - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(isolationBlock), false, "igi", "geg", "igi", - 'i', Item.ingotIron, - 'g', Block.glass, - 'e', Item.enderPearl)); - - //Air generator - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(airgenBlock), false, "ibi", "i i", "ipi", - 'i', Item.ingotIron, - 'b', Block.fenceIron, - 'p', componentItem.getIS(6))); - - //Laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserBlock), false, "ili", "iri", "ici", - 'i', Item.ingotIron, - 'r', Item.redstone, - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3), - 'p', componentItem.getIS(6))); - - //Mining laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(miningLaserBlock), false, "ici", "iti", "ili", - 'i', Item.ingotIron, - 'r', Item.redstone, - 't', componentItem.getIS(1), - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3))); - - //Tree farm laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserTreeFarmBlock), false, "ili", "sts", "ici", - 'i', Item.ingotIron, - 's', "treeSapling", - 't', componentItem.getIS(1), - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3))); - - //Laser Lift - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(liftBlock), false, "ipi", "rtr", "ili", - 'i', Item.ingotIron, - 'r', Item.redstone, - 't', componentItem.getIS(1), - 'l', componentItem.getIS(3), - 'p', componentItem.getIS(6))); - - //Transporter - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transporterBlock), false, "iii", "ptc", "iii", - 'i', Item.ingotIron, - 't', componentItem.getIS(1), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - - //Particle Booster - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(boosterBlock), false, "ipi", "rgr", "iii", - 'i', Item.ingotIron, - 'r', Item.redstone, - 'g', Block.glass, - 'p', componentItem.getIS(6))); - - //Camera - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cameraBlock), false, "ngn", "i i", "ici", - 'i', Item.ingotIron, - 'n', Item.goldNugget, - 'g', Block.glass, - 'c', componentItem.getIS(5))); - - //LaserCamera - GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(laserCamBlock), cameraBlock, laserBlock)); - - //Monitor - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(monitorBlock), false, "ggg", "iti", "ici", - 'i', Item.ingotIron, - 't', Block.torchWood, - 'g', Block.glass, - 'c', componentItem.getIS(5))); - - //Cloaking device - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cloakBlock), false, "ipi", "lrl", "ici", - 'i', Item.ingotIron, - 'r', Item.redstone, - 'l', componentItem.getIS(3), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - - //Cloaking coil - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cloakCoilBlock), false, "ini", "rdr", "ini", - 'i', Item.ingotIron, - 'd', Item.diamond, - 'r', Item.redstone, - 'n', Item.goldNugget)); - - //Power Laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerLaserBlock), false, "iii", "ilg", "ici", - 'i', Item.ingotIron, - 'g', Block.glass, - 'c', componentItem.getIS(5), - 'l', componentItem.getIS(3))); - - //Power Reactor - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerReactorBlock), false, "ipi", "gog", "ici", - 'i', Item.ingotIron, - 'g', Block.glass, - 'o', componentItem.getIS(4), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - - //Power Store - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerStoreBlock), false, "ipi", "isi", "ici", - 'i', Item.ingotIron, - 's', componentItem.getIS(7), - 'c', componentItem.getIS(5), - 'p', componentItem.getIS(6))); - - //Transport Beacon - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transportBeaconBlock), false, " e ", "ldl", " s ", - 'e', Item.enderPearl, - 'l', "dyeBlue", - 'd', Item.diamond, - 's', Item.stick)); - - //Chunk Loader - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(chunkLoaderBlock), false, "ipi", "ici", "ifi", - 'i', Item.ingotIron, - 'p', componentItem.getIS(6), - 'c', componentItem.getIS(0), - 'f', componentItem.getIS(5))); - - //Helmet - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(helmetItem), false, "iii", "iwi", "gcg", - 'i', Item.ingotIron, - 'w', Block.cloth, - 'g', Block.glass, - 'c', componentItem.getIS(8))); - } - - private static void initAETERecipes() { - ItemStack redstoneEnergycell = GameRegistry.findItemStack("ThermalExpansion", "cellReinforced", 1); - ItemStack resonantEnergycell = GameRegistry.findItemStack("ThermalExpansion", "cellResonant", 1); - ItemStack bucketEnder = GameRegistry.findItemStack("ThermalExpansion", "bucketEnder", 1); - ItemStack fluixCrystal = WarpDriveConfig.getAEMaterial("matFluxCrystal"); - ItemStack quantumEntangledSingularity = WarpDriveConfig.getAEMaterial("matQuantumEntangledSingularity"); - ItemStack vibrantQuartzGlass = WarpDriveConfig.getAEBlock("blkQuartzLamp"); - vibrantQuartzGlass.setItemDamage(4); - ItemStack antimatter = GameRegistry.findItemStack("ResonantInduction|Atomic", "antimatter", 1); - antimatter.setItemDamage(0); - ItemStack floppy = GameRegistry.findItemStack("ComputerCraft", "disk", 1); - ItemStack ultimateLappack = new ItemStack(WarpDriveConfig.GS_ultimateLappack, 1, 1); - - // top = advancedCircuit, redstoneEnergycell, advancedCircuit - // middle = fluix crystal, advancedMachine, fluix crystal - // bottom = advancedCircuit, bucket Resonant ender, advancedCircuit - GameRegistry.addRecipe(new ItemStack(warpCore), "crc", "fmf", "cec", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'r', redstoneEnergycell, - 'e', bucketEnder, - 'f', fluixCrystal); - - // top = advancedCircuit, floppy, advancedCircuit - // middle = advancedCircuit, advancedMachine, advancedCircuit - // bottom = advancedCircuit, fluix crystal, advancedCircuit - GameRegistry.addRecipe(new ItemStack(protocolBlock), "coc", "cmc", "cfc", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'o', floppy, - 'f', fluixCrystal); - - // top = Iridium plate, Resonant Energycell, Iridium plate - // middle = Singularity, 125 milligram antimatter, Singularity - // bottom = Iridium plate, Ultimate lappack, Iridium plate - GameRegistry.addRecipe(new ItemStack(powerReactorBlock), "iri", "sas", "ili", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 's', quantumEntangledSingularity, - 'a', antimatter, - 'l', ultimateLappack, - 'r', resonantEnergycell); - - // top = Advanced circuit, Advanced alloy, Advanced alloy - // middle = Advanced circuit, Warp drive laser, Vibrant quartz glass - // bottom = Advanced circuit, Certus quartz tank, Advanced alloy - ItemStack isMiningLaserBlock = new ItemStack(miningLaserBlock.blockID, 1, 0); - ItemStack isCertusQuartzTank = new ItemStack(WarpDriveConfig.AEExtra_certusQuartzTank.blockID, 1, 0); - - GameRegistry.addRecipe(new ItemStack(powerLaserBlock), "caa", "czg", "cta", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'z', isMiningLaserBlock, - 't', isCertusQuartzTank, - 'g', vibrantQuartzGlass); - } - - private static void initIC2Recipes() { - GameRegistry.addRecipe(new ItemStack(warpCore), "ici", "cmc", "ici", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - - GameRegistry.addRecipe(new ItemStack(protocolBlock), "iic", "imi", "cii", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - - GameRegistry.addRecipe(new ItemStack(radarBlock), "ifi", "imi", "imi", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'f', WarpDriveConfig.getIC2Item("frequencyTransmitter")); - - GameRegistry.addRecipe(new ItemStack(isolationBlock), "iii", "idi", "iii", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'd', Block.blockDiamond); - - GameRegistry.addRecipe(new ItemStack(airgenBlock), "lcl", "lml", "lll", - 'l', Block.leaves, - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - - GameRegistry.addRecipe(new ItemStack(laserBlock), "sss", "ama", "aaa", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 's', WarpDriveConfig.getIC2Item("advancedCircuit")); - - GameRegistry.addRecipe(new ItemStack(miningLaserBlock), "aaa", "ama", "ccc", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'm', WarpDriveConfig.getIC2Item("miner")); - - GameRegistry.addRecipe(new ItemStack(boosterBlock), "afc", "ama", "cfa", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'f', WarpDriveConfig.getIC2Item("glassFiberCableItem"), - 'm', WarpDriveConfig.getIC2Item("mfeUnit")); - - GameRegistry.addRecipe(new ItemStack(liftBlock), "aca", "ama", "a#a", - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 'm', WarpDriveConfig.getIC2Item("magnetizer")); - - GameRegistry.addRecipe(new ItemStack(iridiumBlock), "iii", "iii", "iii", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate")); - - GameRegistry.addShapelessRecipe( - new ItemStack(WarpDriveConfig.getIC2Item("iridiumPlate").getItem(), 9), - new ItemStack(iridiumBlock)); - - GameRegistry.addRecipe(new ItemStack(laserCamBlock), "imi", "cec", "#k#", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'e', laserBlock, - 'k', cameraBlock); - - GameRegistry.addRecipe(new ItemStack(cameraBlock), "cgc", "gmg", "cgc", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Block.glass); - - GameRegistry.addRecipe(new ItemStack(monitorBlock), "gcg", "gmg", "ggg", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Block.glass); - - GameRegistry.addRecipe(new ItemStack(scannerBlock), "sgs", "mma", "amm", - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), - 's', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Block.glass); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserTreeFarmBlock),false,new Object[] { - "cwc", "wmw", "cwc", - 'c', WarpDriveConfig.getIC2Item("electronicCircuit"), - 'w', "logWood", - 'm', miningLaserBlock })); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transporterBlock), false, new Object[] { - "ece", "imi", "iei", - 'e', Item.enderPearl, - 'c', WarpDriveConfig.getIC2Item("electronicCircuit"), - 'i', WarpDriveConfig.getIC2Item("plateiron"), - 'm', WarpDriveConfig.getIC2Item("machine") })); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(reactorLaserFocusItem),false,new Object[] { - " p ", "pdp", " p ", - 'p', WarpDriveConfig.getIC2Item("plateiron"), - 'd', "gemDiamond"})); - - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(reactorMonitorBlock), false, new Object[] { - "pdp", "dmd", "pdp", - 'p', WarpDriveConfig.getIC2Item("plateiron"), - 'd', "gemDiamond", - 'm', WarpDriveConfig.getIC2Item("mfeUnit")})); - - GameRegistry.addRecipe(new ItemStack(cloakBlock), "imi", "mcm", "imi", - 'i', iridiumBlock, - 'c', cloakCoilBlock, - 'm', WarpDriveConfig.getIC2Item("advancedMachine")); - - GameRegistry.addRecipe(new ItemStack(cloakCoilBlock), "iai", "aca", "iai", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'a', WarpDriveConfig.getIC2Item("advancedAlloy")); - } - - private static void registerSpaceDimension() { - spaceBiome = (new BiomeSpace(24)) - .setColor(0) - .setDisableRain() - .setBiomeName("Space"); - DimensionManager.registerProviderType(WarpDriveConfig.G_SPACE_PROVIDER_ID, SpaceProvider.class, true); - DimensionManager.registerDimension(WarpDriveConfig.G_SPACE_DIMENSION_ID, WarpDriveConfig.G_SPACE_PROVIDER_ID); - } - - private static void registerHyperSpaceDimension() { - DimensionManager.registerProviderType(WarpDriveConfig.G_HYPERSPACE_PROVIDER_ID, HyperSpaceProvider.class, true); - DimensionManager.registerDimension(WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID, WarpDriveConfig.G_HYPERSPACE_PROVIDER_ID); - } - - @EventHandler - public void serverLoad(FMLServerStartingEvent event) { - cloaks = new CloakManager(); - MinecraftForge.EVENT_BUS.register(new CloakChunkWatcher()); - - event.registerServerCommand(new GenerateCommand()); - event.registerServerCommand(new SpaceTpCommand()); - event.registerServerCommand(new InvisibleCommand()); - event.registerServerCommand(new JumpgateCommand()); - event.registerServerCommand(new DebugCommand()); - } - - public Ticket registerChunkLoadTE(WarpChunkTE te, boolean refreshLoading) { - World worldObj = te.worldObj; - if (ForgeChunkManager.ticketCountAvailableFor(this, worldObj) > 0) - { - Ticket t = ForgeChunkManager.requestTicket(this, worldObj, Type.NORMAL); - if (t != null) { - te.giveTicket(t); // FIXME calling the caller is a bad idea - if(refreshLoading) - te.refreshLoading(); - return t; - } - else - { - WarpDrive.debugPrint("Ticket not granted"); - } - } - else - { - WarpDrive.debugPrint("No tickets left!"); - } - return null; - } - - public Ticket registerChunkLoadTE(WarpChunkTE te) - { - return registerChunkLoadTE(te, true); - } - - public Ticket getTicket(WarpChunkTE te) - { - return registerChunkLoadTE(te, false); - } - - @Override - public void ticketsLoaded(List tickets, World world) - { - for (Ticket ticket : tickets) - { - NBTTagCompound data = ticket.getModData(); - if(data != null) - { - int w = data.getInteger("ticketWorldObj"); - int x = data.getInteger("ticketX"); - int y = data.getInteger("ticketY"); - int z = data.getInteger("ticketZ"); - if(w != 0 || x != 0 || y != 0 || z != 0) - { - WorldServer ws = DimensionManager.getWorld(w); - if(ws != null) - { - TileEntity te = ws.getBlockTileEntity(x, y, z); - if(te != null && te instanceof WarpChunkTE) - { - if(((WarpChunkTE)te).shouldChunkLoad()) - { - WarpDrive.debugPrint("[TicketCallback] Regiving Ticket!"); - ((WarpChunkTE)te).giveTicket(ticket); - ((WarpChunkTE)te).refreshLoading(true); - return; - } - } - } - } - } - - ForgeChunkManager.releaseTicket(ticket); - } - } -} diff --git a/src/cr0s/WarpDrive/WarpDriveConfig.java b/src/cr0s/WarpDrive/WarpDriveConfig.java deleted file mode 100644 index 80714008..00000000 --- a/src/cr0s/WarpDrive/WarpDriveConfig.java +++ /dev/null @@ -1,1086 +0,0 @@ -package cr0s.WarpDrive; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.Random; - -import cpw.mods.fml.common.Loader; -import cr0s.WarpDrive.data.TransitionPlane; -import net.minecraftforge.common.Configuration; -import net.minecraftforge.common.Property; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import ic2.api.item.Items; - -public class WarpDriveConfig -{ - private static Configuration config; - // Blocks - public static int coreID; - public static int controllerID; - public static int radarID; - public static int isolationID; - public static int airID; - public static int airgenID; - public static int gasID; - public static int laserID; - public static int miningLaserID; - public static int particleBoosterID; - public static int liftID; - public static int laserCamID; - public static int camID; - public static int monitorID; - public static int iridiumBlockID; - public static int shipScannerID; - public static int cloakCoreID; - public static int cloakCoilID; - public static int laserTreeFarmID; - public static int transporterID; - public static int transportBeaconID; - public static int reactorLaserFocusID; - public static int reactorMonitorID; - public static int powerReactorID; - public static int powerLaserID; - public static int powerStoreID; - public static int chunkLoaderID; - public static int decorativeID; - - // Items - public static int componentID; - public static int helmetID; - public static int chestID; - public static int pantsID; - public static int bootsID; - public static int airCanisterID; - public static int upgradeID; - - /* - * The variables which store whether or not individual mods are loaded - */ - public static boolean isForgeMultipartLoaded = false; - public static boolean isGregLoaded = false; - public static boolean isAppliedEnergisticsLoaded = false; - public static boolean isAdvSolPanelLoaded = false; - public static boolean isAtomicScienceLoaded = false; - public static boolean isAEExtraLoaded = false; - public static boolean isICBMLoaded = false; - public static boolean isMFFSLoaded = false; - public static boolean isGraviSuiteLoaded = false; - public static boolean isICLoaded = false; - public static boolean isCCLoaded = false; - public static boolean isUndergroundBiomesLoaded = false; - public static boolean isNetherOresLoaded = false; - public static boolean isThermalExpansionLoaded = false; - public static boolean isMetallurgyLoaded = false; - public static boolean isAdvancedRepulsionSystemsLoaded = false; - public static boolean isMagicalCropsLoaded = false; - - // ForgeMultipart (microblocks) support - public static Method forgeMultipart_helper_createTileFromNBT = null; - public static Method forgeMultipart_helper_sendDescPacket = null; - public static Method forgeMultipart_tileMultipart_onChunkLoad = null; - - public static int[] IC2_Air; - public static int[] IC2_Empty; - public static int IC2_RubberWood; - public static ItemStack IC2_Resin; - public static Item IC2_fluidCell; - public static int CC_Computer = 0, CC_peripheral = 0, CC_Floppy = 0, CCT_Turtle = 0, CCT_Upgraded = 0, CCT_Advanced = 0; - public static int GT_Ores = 0, GT_Granite = 0, GT_Machine = 0; - public static int ASP = 0; - public static int AS_Turbine = 0, AS_deuteriumCell = 0; - public static int ICBM_Machine = 0, ICBM_Missile = 0, ICBM_Explosive = 0; - public static int GS_ultimateLappack = 0; - public static int UB_igneousStone = 0, UB_igneousCobblestone = 0, UB_metamorphicStone = 0, UB_metamorphicCobblestone = 0, UB_sedimentaryStone = 0; - public static int NetherOres_count; - public static int[] NetherOres_block; - public static int[][] Metallurgy_overworldOresBlock; - public static int[][] Metallurgy_netherOresBlock; - public static int[][] Metallurgy_endOresBlock; - public static ArrayList forceFieldBlocks; - - public static Set SpaceHelmets, Jetpacks, MinerOres, MinerLogs, MinerLeaves, scannerIgnoreBlocks; - private static Class AEBlocks; - private static Class AEMaterials; - private static Class AEItems; - public static ArrayList CommonWorldGenOres; - public static Item AEExtra_fluidDrive; - public static Block AEExtra_certusQuartzTank; - - // Mod configuration (see loadWarpDriveConfig() for comments/definitions) - // General - public static int G_SPACE_PROVIDER_ID = 14; - public static int G_SPACE_DIMENSION_ID = -2; - public static int G_HYPERSPACE_PROVIDER_ID = 15; - public static int G_HYPERSPACE_DIMENSION_ID = -3; - public static int G_SPACE_WORLDBORDER_BLOCKS = 100000; - public static final int LUA_SCRIPTS_NONE = 0; - public static final int LUA_SCRIPTS_TEMPLATES = 1; - public static final int LUA_SCRIPTS_ALL = 2; - public static int G_LUA_SCRIPTS = LUA_SCRIPTS_ALL; - public static boolean G_DEBUGMODE = false; - public static String G_SCHEMALOCATION = "warpDrive_schematics"; - public static int G_BLOCKS_PER_TICK = 3500; - - public static boolean G_ENABLE_IC2_RECIPES = true; - public static boolean G_ENABLE_VANILLA_RECIPES = false; - public static boolean G_ENABLE_TDK_RECIPES = false; - - // Transition planes - public static TransitionPlane[] G_TRANSITIONPLANES = null; - - // Warp Drive Core - public static int WC_MAX_ENERGY_VALUE = 100000000; - public static int WC_ENERGY_PER_BLOCK_MODE1 = 10; - public static int WC_ENERGY_PER_DISTANCE_MODE1 = 100; - public static int WC_ENERGY_PER_BLOCK_MODE2 = 1000; - public static int WC_ENERGY_PER_DISTANCE_MODE2 = 1000; - public static int WC_ENERGY_PER_ENTITY_TO_SPACE = 1000000; - public static int WC_MAX_JUMP_DISTANCE = 128; - public static int WC_MAX_SHIP_VOLUME_ON_SURFACE = 3000; - public static int WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE = 1200; - public static int WC_MAX_SHIP_SIDE = 127; - public static int WC_COOLDOWN_INTERVAL_SECONDS = 30; - public static int WC_COLLISION_TOLERANCE_BLOCKS = 3; - public static int WC_WARMUP_SHORTJUMP_SECONDS = 10; - public static int WC_WARMUP_LONGJUMP_SECONDS = 30; - public static int WC_WARMUP_RANDOM_TICKS = 60; - public static int WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = 10; - public static int WC_ISOLATION_UPDATE_INTERVAL_SECONDS = 10; - public static String[] WC_UNLIMITED_PLAYERNAMES = { "notch", "someone" }; - - // Warp Radar - public static int WR_MAX_ENERGY_VALUE = 100000000; // 100kk eU - public static int WR_MAX_ISOLATION_RANGE = 2; - public static int WR_MIN_ISOLATION_BLOCKS = 5; - public static int WR_MAX_ISOLATION_BLOCKS = 132; - public static double WR_MIN_ISOLATION_EFFECT = 0.12; - public static double WR_MAX_ISOLATION_EFFECT = 1.00; - - // Ship Scanner - public static int SS_MAX_ENERGY_VALUE = 500000000; - public static int SS_EU_PER_BLOCK_SCAN = 100; // eU per block of ship volume (including air) - public static int SS_EU_PER_BLOCK_DEPLOY = 5000; - public static int SS_MAX_DEPLOY_RADIUS_BLOCKS = 50; - - // Particle Booster - public static int PB_MAX_ENERGY_VALUE = 100000; - - // Laser Emitter - public static int LE_MAX_BOOSTERS_NUMBER = 10; - public static int LE_MAX_LASER_ENERGY = 4000000; - public static int LE_EMIT_DELAY_TICKS = 20 * 3; - public static int LE_EMIT_SCAN_DELAY_TICKS = 10; - - public static double LE_COLLECT_ENERGY_MULTIPLIER = 0.60D; - public static int LE_BEAM_LENGTH_PER_ENERGY_DIVIDER = 5000; - public static int LE_ENTITY_HIT_SET_ON_FIRE_TIME = 100; - public static int LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER = 10000; - public static int LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY = 1000000; - public static int LE_BLOCK_HIT_CONSUME_ENERGY = 70000; - public static int LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE = 1000; - public static int LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE = 10; - - // Mining Laser - // BuildCraft quarry values for reference - // - harvesting one block is 60 MJ/block = 600 RF/block = ~145 EU/block - // - maximum speed is 3.846 ticks per blocks - // - overall consumption varies from 81.801 to 184.608 MJ/block (depending on speed) = up to 1846.08 RF/block = up to ~448 EU/block - // - at radius 5, one layer takes ~465 ticks ((ML_MAX_RADIUS * 2 + 1) ^ 2 * 3.846) - // - overall consumption is ((ML_MAX_RADIUS * 2 + 1) ^ 2) * 448 => ~ 54208 EU/layer - // WarpDrive mining laser in comparison - // - each mined layer is scanned twice - // - default ore generation: 1 ore out of 25 blocks - // - overall consumption in 'all, space' is ML_EU_PER_LAYER_SPACE / ((ML_MAX_RADIUS * 2 + 1) ^ 2) + ML_EU_PER_BLOCK_SPACE => ~ 356 EU/block - // - overall consumption in 'all, space' is ML_EU_PER_LAYER_SPACE + ((ML_MAX_RADIUS * 2 + 1) ^ 2) * ML_EU_PER_BLOCK_SPACE => ~ 43150 EU/layer - // - overall consumption in 'ores, space' is ML_EU_PER_LAYER_SPACE + ((ML_MAX_RADIUS * 2 + 1) ^ 2) * ML_EU_PER_BLOCK_SPACE * ML_EU_MUL_ORESONLY / 25 => ~ 28630 EU/layer - // - at radius 5, one layer takes 403 ticks (2 * ML_SCAN_DELAY_TICKS + ML_MINE_DELAY_TICKS * (ML_MAX_RADIUS * 2 + 1) ^ 2) - public static int ML_MAX_BOOSTERS_NUMBER = 1; - public static int ML_WARMUP_DELAY_TICKS = 20; - public static int ML_SCAN_DELAY_TICKS = 20; - public static int ML_MINE_DELAY_TICKS = 3; - public static int ML_EU_PER_LAYER_SPACE = 25000; - public static int ML_EU_PER_LAYER_EARTH = 35000; - public static int ML_EU_PER_BLOCK_SPACE = 150; - public static int ML_EU_PER_BLOCK_EARTH = 300; - public static double ML_EU_MUL_ORESONLY = 5.0; // lower value encourages to keep the land 'clean' - public static double ML_EU_MUL_SILKTOUCH = 2.5; - public static double ML_DEUTERIUM_MUL_SILKTOUCH = 1.0; - public static double ML_EU_MUL_FORTUNE = 2.5; - public static int ML_MAX_RADIUS = 5; - - // Tree farm - public static int TF_MAX_SIZE = 16; - - // Cloaking device core - public static int CD_MAX_CLOAKING_FIELD_SIDE = 100; - public static int CD_ENERGY_PER_BLOCK_TIER1 = 125; - public static int CD_ENERGY_PER_BLOCK_TIER2 = 500; - public static int CD_FIELD_REFRESH_INTERVAL_SECONDS = 3; - public static int CD_COIL_CAPTURE_BLOCKS = 5; - - // Air generator - public static int AG_RF_PER_CANISTER = 20; - - // Reactor monitor - public static int RM_MAX_ENERGY = 1000000; - public static double RM_EU_PER_HEAT = 2; - - // Transporter - public static int TR_MAX_ENERGY = 1000000; - public static boolean TR_RELATIVE_COORDS = true; - public static double TR_EU_PER_METRE = 100; - // public static double TR_MAX_SCAN_RANGE = 4; FIXME: not used ?!? - public static double TR_MAX_BOOST_MUL = 4; - - // Power reactor - public static int PR_MAX_ENERGY = 100000000; - public static int PR_TICK_TIME = 5; - public static int PR_MAX_LASERS = 6; - - // Power store - public static int PS_MAX_ENERGY = 1000000; - - // Laser Lift - public static int LL_MAX_ENERGY = 2400; - public static int LL_LIFT_ENERGY = 800; - public static int LL_TICK_RATE = 10; - - // Chunk Loader - public static int CL_MAX_ENERGY = 1000000; - public static int CL_MAX_DISTANCE = 2; - public static int CL_RF_PER_CHUNKTICK = 320; - - public static ItemStack getIC2Item(String id) { - return Items.getItem(id); - } - - public static ItemStack getAEBlock(String id) { - try { - Object ret = AEBlocks.getField(id).get(null); - if (ret instanceof ItemStack) - return (ItemStack)ret; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Call getAEBlock failed for " + id); - } - return null; - } - - public static ItemStack getAEMaterial(String id) { - try { - Object ret = AEMaterials.getField(id).get(null); - if (ret instanceof ItemStack) - return (ItemStack)ret; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Call getAEMaterial failed for " + id); - } - return null; - } - - public static ItemStack getAEItem(String id) { - try { - Object ret = AEItems.getField(id).get(null); - if (ret instanceof ItemStack) - return (ItemStack)ret; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Call getAEItem failed for " + id); - } - return null; - } - - public static void preInit(Configuration configIn) { - config = configIn; - } - - public static void loadWarpDriveConfig() { - // General - G_SPACE_PROVIDER_ID = config.get("General", "space_provider_id", G_SPACE_PROVIDER_ID, "Space dimension provider ID").getInt(); - G_SPACE_DIMENSION_ID = config.get("General", "space_dimension_id", G_SPACE_DIMENSION_ID, "Space dimension world ID").getInt(); - G_HYPERSPACE_PROVIDER_ID = config.get("General", "hyperspace_provider_id", G_HYPERSPACE_PROVIDER_ID, "Hyperspace dimension provider ID").getInt(); - G_HYPERSPACE_DIMENSION_ID = config.get("General", "hyperspace_dimension_id", G_HYPERSPACE_DIMENSION_ID, "Hyperspace dimension world ID").getInt(); - G_SPACE_WORLDBORDER_BLOCKS = config.get("General", "space_worldborder_blocks", G_SPACE_WORLDBORDER_BLOCKS, "World border applied to hyperspace & space, set to 0 to disable it").getInt(); - G_LUA_SCRIPTS = config.get("General", "lua_scripts", G_LUA_SCRIPTS, "LUA scripts to load when connecting machines: 0 = none, 1 = templates in a subfolder, 2 = ready to roll (templates are still provided)").getInt(); - G_DEBUGMODE = config.get("General", "debug_mode", G_DEBUGMODE, "Detailled logs to help debug the mod, enable it before reporting a bug").getBoolean(false); - G_SCHEMALOCATION = config.get("General", "schematic_location", G_SCHEMALOCATION, "Folder where to save ship schematics").getString(); - G_BLOCKS_PER_TICK = config.get("General", "blocks_per_tick", G_BLOCKS_PER_TICK, "Number of blocks to move per ticks, too high will cause lag spikes on ship jumping or deployment, too low may break the ship wirings").getInt(); - - G_ENABLE_IC2_RECIPES = config.get("General", "enable_ic2_recipes", G_ENABLE_IC2_RECIPES, "Original recipes based on IndustrialCrat2 by Cr0s").getBoolean(true); - G_ENABLE_VANILLA_RECIPES = config.get("General", "enable_vanilla_recipes", G_ENABLE_VANILLA_RECIPES, "Vanilla recipes by DarkholmeTenk").getBoolean(false); - G_ENABLE_TDK_RECIPES = config.get("General", "enable_TDK_recipes", G_ENABLE_TDK_RECIPES, "Mixed recipes for TDK packs by Lem'ADEC (currently requires at least AppliedEnergistics, Extracells, AtomicScience, IndustrialCraft2, GraviSuite and ThermalExpansion").getBoolean(false); - - // TransitionPlane - config.addCustomCategoryComment("TransitionPlane", "Transition planes defines which region in space allows to go to other dimensions, default is overworld with 100k radius.\n" - + "Each plane is square shaped and defined as a list of 7 integers (all measured in blocks, border is the radius from center)"); - String[] transitionNames = { "overworld" }; - transitionNames = config.get("TransitionPlane", "names", transitionNames, "this is the list of transition planes defined hereafter").getStringList(); - int[] defaultPlane = {0, 0, 0, 30000000, 30000000, 0, 0}; // 30000000 is Minecraft limit for SetBlock - G_TRANSITIONPLANES = new TransitionPlane[transitionNames.length]; - int index = 0; - for (String name : transitionNames) { - int[] plane = config.get("TransitionPlane", name, defaultPlane, "dimensionId, dimensionCenterX, dimensionCenterZ, borderSizeX, borderSizeZ, SpaceCenterX, SpaceCenterZ").getIntList(); - if (plane.length != 7) { - WarpDrive.print("Invalid transition plane definition '" + name + "' (exactly 7 integers are expected), using default instead"); - plane = defaultPlane.clone(); - } - TransitionPlane newPlane = new TransitionPlane(plane[0], plane[1], plane[2], plane[3], plane[4], plane[5], plane[6]); - WarpDrive.print("Adding '" + name + "' as " + newPlane.toString()); - G_TRANSITIONPLANES[index] = newPlane; - } - // FIXME: check transition planes aren't overlapping - // FIXME: check transition planes have valid dimension id - - // Warp Core - WC_MAX_ENERGY_VALUE = config.get("WarpCore", "max_energy_value", WC_MAX_ENERGY_VALUE, "Maximum energy storage").getInt(); - WC_ENERGY_PER_BLOCK_MODE1 = config.get("WarpCore", "energy_per_block_mode1", WC_ENERGY_PER_BLOCK_MODE1).getInt(); - WC_ENERGY_PER_DISTANCE_MODE1 = config.get("WarpCore", "energy_per_distance_mode1", WC_ENERGY_PER_DISTANCE_MODE1).getInt(); - WC_ENERGY_PER_DISTANCE_MODE2 = config.get("WarpCore", "energy_per_distance_mode2", WC_ENERGY_PER_DISTANCE_MODE2).getInt(); - WC_ENERGY_PER_BLOCK_MODE2 = config.get("WarpCore", "energy_per_block_mode2", WC_ENERGY_PER_BLOCK_MODE2).getInt(); - WC_ENERGY_PER_ENTITY_TO_SPACE = config.get("WarpCore", "energy_per_entity_to_space", WC_ENERGY_PER_ENTITY_TO_SPACE).getInt(); - WC_MAX_JUMP_DISTANCE = config.get("WarpCore", "max_jump_distance", WC_MAX_JUMP_DISTANCE, "Maximum jump lenght value in blocks").getInt(); - WC_MAX_SHIP_VOLUME_ON_SURFACE = config.get("WarpCore", "max_ship_volume_on_surface", WC_MAX_SHIP_VOLUME_ON_SURFACE, "Maximum ship mass (in blocks) to jump on earth").getInt(); - WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE = config.get("WarpCore", "min_ship_volume_for_hyperspace", WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE, "Minimum ship mass (in blocks) to enter or exit hyperspace without a jumpgate").getInt(); - WC_MAX_SHIP_SIDE = config.get("WarpCore", "max_ship_side", WC_MAX_SHIP_SIDE, "Maximum ship size on each axis in blocks").getInt(); - WC_COLLISION_TOLERANCE_BLOCKS = config.get("WarpCore", "collision_tolerance_blocks", WC_COLLISION_TOLERANCE_BLOCKS, "Tolerance in block in case of collision before causing damages...").getInt(); - WC_COOLDOWN_INTERVAL_SECONDS = config.get("WarpCore", "cooldown_interval_seconds", WC_COOLDOWN_INTERVAL_SECONDS, "Cooldown seconds to wait after jumping").getInt(); - WC_WARMUP_SHORTJUMP_SECONDS = config.get("WarpCore", "warmup_shortjump_seconds", WC_WARMUP_SHORTJUMP_SECONDS, "Short jump means less than 50 blocks").getInt(); - WC_WARMUP_LONGJUMP_SECONDS = config.get("WarpCore", "warmup_longjump_seconds", WC_WARMUP_LONGJUMP_SECONDS, "Long jump means more than 50 blocks").getInt(); - - WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "cores_registry_update_interval", WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS, "(measured in seconds)").getInt(); - WC_ISOLATION_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "isolation_update_interval", WC_ISOLATION_UPDATE_INTERVAL_SECONDS, "(measured in seconds)").getInt(); - WC_UNLIMITED_PLAYERNAMES = config.get("WarpCore", "unlimited_playernames", WC_UNLIMITED_PLAYERNAMES, "List of player names which gives unlimited block counts to their ship").getStringList(); - - // Warp Radar - WR_MAX_ENERGY_VALUE = config.get("WarpRadar", "max_energy_value", WR_MAX_ENERGY_VALUE).getInt(); - WR_MAX_ISOLATION_RANGE = config.get("WarpRadar", "max_isolation_range", WR_MAX_ISOLATION_RANGE, "radius around core where isolation blocks count (2 to 8), higher is lagger").getInt(); - WR_MAX_ISOLATION_RANGE = Math.min(8, Math.max(WR_MAX_ISOLATION_RANGE, 2)); - WR_MIN_ISOLATION_BLOCKS = config.get("WarpRadar", "min_isolation_blocks", WR_MIN_ISOLATION_BLOCKS, "number of isolation blocks required to get some isolation (0 to 20)").getInt(); - WR_MIN_ISOLATION_BLOCKS = Math.min(20, Math.max(WR_MIN_ISOLATION_BLOCKS, 0)); - WR_MAX_ISOLATION_BLOCKS = config.get("WarpRadar", "max_isolation_blocks", WR_MAX_ISOLATION_BLOCKS, "number of isolation blocks required to reach maximum effect (5 to 100)").getInt(); - WR_MAX_ISOLATION_BLOCKS = Math.min(100, Math.max(WR_MAX_ISOLATION_BLOCKS, 5)); - WR_MIN_ISOLATION_EFFECT = config.get("WarpRadar", "min_isolation_effect", WR_MIN_ISOLATION_EFFECT, "isolation effect achieved with min number of isolation blocks (0.01 to 0.95)").getDouble(0.12D); - WR_MIN_ISOLATION_EFFECT = Math.min(0.95D, Math.max(WR_MIN_ISOLATION_EFFECT, 0.01D)); - WR_MAX_ISOLATION_EFFECT = config.get("WarpRadar", "max_isolation_effect", WR_MAX_ISOLATION_EFFECT, "isolation effect achieved with max number of isolation blocks (0.01 to 1.00)").getDouble(1.00D); - WR_MAX_ISOLATION_EFFECT = Math.min(1.0D, Math.max(WR_MAX_ISOLATION_EFFECT, 0.01D)); - - // Ship Scanner - SS_MAX_ENERGY_VALUE = config.get("WarpCore", "max_energy_value", SS_MAX_ENERGY_VALUE, "Maximum energy storage").getInt(); - SS_EU_PER_BLOCK_SCAN = config.get("ShipScanner", "energy_per_block_when_scanning", SS_EU_PER_BLOCK_SCAN, "Energy consummed per block when scanning a ship (use -1 to consume everything)").getInt(); - if (SS_EU_PER_BLOCK_SCAN != -1) { - SS_EU_PER_BLOCK_SCAN = Math.min(SS_MAX_ENERGY_VALUE, Math.max(SS_EU_PER_BLOCK_SCAN, 1)); - } - SS_EU_PER_BLOCK_DEPLOY = config.get("ShipScanner", "energy_per_block_when_deploying", SS_EU_PER_BLOCK_DEPLOY, "Energy consummed per block when deploying a ship (use -1 to consume everything)").getInt(); - if (SS_EU_PER_BLOCK_DEPLOY != -1) { - SS_EU_PER_BLOCK_DEPLOY = Math.min(SS_MAX_ENERGY_VALUE, Math.max(SS_EU_PER_BLOCK_DEPLOY, 1)); - } - SS_MAX_DEPLOY_RADIUS_BLOCKS = config.get("ShipScanner", "max_deploy_radius_blocks", SS_MAX_DEPLOY_RADIUS_BLOCKS, "Max distance from ship scanner to ship core, measured in blocks").getInt(); - - // Particle Booster - PB_MAX_ENERGY_VALUE = config.get("ParticleBooster", "max_energy_value", PB_MAX_ENERGY_VALUE).getInt(); - - // Laser Emitter - LE_MAX_BOOSTERS_NUMBER = config.get("LaserEmitter", "max_boosters_number", LE_MAX_BOOSTERS_NUMBER).getInt(); - LE_MAX_LASER_ENERGY = config.get("LaserEmitter", "max_laser_energy", LE_MAX_LASER_ENERGY).getInt(); - LE_EMIT_DELAY_TICKS = config.get("LaserEmitter", "emit_delay_ticks", LE_EMIT_DELAY_TICKS).getInt(); - LE_EMIT_SCAN_DELAY_TICKS = config.get("LaserEmitter", "emit_scan_delay_ticks", LE_EMIT_SCAN_DELAY_TICKS).getInt(); - - // Laser Emitter tweaks - LE_COLLECT_ENERGY_MULTIPLIER = config.get("LaserEmitterTweaks", "collect_energy_multiplier", LE_COLLECT_ENERGY_MULTIPLIER).getDouble(0.6D); - LE_BEAM_LENGTH_PER_ENERGY_DIVIDER = config.get("LaserEmitterTweaks", "beam_length_per_energy_divider", LE_BEAM_LENGTH_PER_ENERGY_DIVIDER).getInt(); - LE_ENTITY_HIT_SET_ON_FIRE_TIME = config.get("LaserEmitterTweaks", "entity_hit_set_on_fire_time", LE_ENTITY_HIT_SET_ON_FIRE_TIME).getInt(); - LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER = config.get("LaserEmitterTweaks", "entity_hit_damage_per_energy_divider", LE_ENTITY_HIT_DAMAGE_PER_ENERGY_DIVIDER).getInt(); - LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY = config.get("LaserEmitterTweaks", "entity_hit_explosion_laser_energy", LE_ENTITY_HIT_EXPLOSION_LASER_ENERGY).getInt(); - LE_BLOCK_HIT_CONSUME_ENERGY = config.get("LaserEmitterTweaks", "block_hit_consume_energy", LE_BLOCK_HIT_CONSUME_ENERGY).getInt(); - LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE = config.get("LaserEmitterTweaks", "block_hit_consume_energy_per_block_resistance", LE_BLOCK_HIT_CONSUME_ENERGY_PER_BLOCK_RESISTANCE).getInt(); - LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE = config.get("LaserEmitterTweaks", "block_hit_consume_energy_per_distance", LE_BLOCK_HIT_CONSUME_ENERGY_PER_DISTANCE).getInt(); - - // Mining Laser - ML_MAX_BOOSTERS_NUMBER = config.get("MiningLaser", "max_boosters_number", ML_MAX_BOOSTERS_NUMBER).getInt(); - ML_WARMUP_DELAY_TICKS = config.get("MiningLaser", "warmup_delay_ticks", ML_WARMUP_DELAY_TICKS).getInt(); - ML_SCAN_DELAY_TICKS = config.get("MiningLaser", "scan_delay_ticks", ML_SCAN_DELAY_TICKS).getInt(); - ML_MINE_DELAY_TICKS = config.get("MiningLaser", "mine_delay_ticks", ML_MINE_DELAY_TICKS).getInt(); - ML_EU_PER_LAYER_SPACE = config.get("MiningLaser", "eu_per_layer_space", ML_EU_PER_LAYER_SPACE).getInt(); - ML_EU_PER_LAYER_EARTH = config.get("MiningLaser", "eu_per_layer_earth", ML_EU_PER_LAYER_EARTH).getInt(); - ML_EU_PER_BLOCK_SPACE = config.get("MiningLaser", "eu_per_block_space", ML_EU_PER_BLOCK_SPACE).getInt(); - ML_EU_PER_BLOCK_EARTH = config.get("MiningLaser", "eu_per_block_earth", ML_EU_PER_BLOCK_EARTH).getInt(); - ML_EU_MUL_ORESONLY = config.get("MiningLaser", "oresonly_power_mul", ML_EU_MUL_ORESONLY).getDouble(4.0); - ML_EU_MUL_SILKTOUCH = config.get("MiningLaser", "silktouch_power_mul", ML_EU_MUL_SILKTOUCH).getDouble(2.5); - ML_DEUTERIUM_MUL_SILKTOUCH = config.get("MiningLaser", "silktouch_deuterium_mul", ML_DEUTERIUM_MUL_SILKTOUCH).getDouble(1.0); - ML_EU_MUL_FORTUNE = config.get("MiningLaser", "fortune_power_base", ML_EU_MUL_FORTUNE).getDouble(2.5); - ML_MAX_RADIUS = config.get("MiningLaser", "max_radius", ML_MAX_RADIUS).getInt(); - - // Tree Farm - TF_MAX_SIZE = config.get("TreeFarm", "max_treefarm_size", TF_MAX_SIZE).getInt(); - - // Cloaking device core - CD_MAX_CLOAKING_FIELD_SIDE = config.get("CloakingDevice", "max_cloaking_field_side", CD_MAX_CLOAKING_FIELD_SIDE).getInt(); - CD_ENERGY_PER_BLOCK_TIER1 = config.get("CloakingDevice", "energy_per_block_tier1", CD_ENERGY_PER_BLOCK_TIER1).getInt(); - CD_ENERGY_PER_BLOCK_TIER2 = config.get("CloakingDevice", "energy_per_block_tier2", CD_ENERGY_PER_BLOCK_TIER2).getInt(); - CD_FIELD_REFRESH_INTERVAL_SECONDS = config.get("CloakingDevice", "field_refresh_interval_seconds", CD_FIELD_REFRESH_INTERVAL_SECONDS).getInt(); - CD_COIL_CAPTURE_BLOCKS = config.get("CloakingDevice", "coil_capture_blocks", CD_COIL_CAPTURE_BLOCKS, "Extra blocks covered after the outer coils").getInt(); - - // Air generator - AG_RF_PER_CANISTER = config.get("Air Generator", "energy_per_canister", AG_RF_PER_CANISTER).getInt(); - - // Reactor monitor - RM_MAX_ENERGY = config.get("Reactor Monitor", "max_rm_energy", RM_MAX_ENERGY).getInt(); - RM_EU_PER_HEAT = config.get("Reactor Monitor", "eu_per_heat", RM_EU_PER_HEAT).getDouble(2); - - // Transporter - TR_MAX_ENERGY = config.get("Transporter", "max_energy", TR_MAX_ENERGY).getInt(); - TR_RELATIVE_COORDS = config.get("Transporter", "relative_coords", TR_RELATIVE_COORDS).getBoolean(true); - TR_EU_PER_METRE = config.get("Transporter", "eu_per_ent_per_metre", TR_EU_PER_METRE).getDouble(100); - TR_MAX_BOOST_MUL = config.get("Transporter", "max_boost", TR_MAX_BOOST_MUL).getInt(); - - // Power reactor - PR_MAX_ENERGY = config.get("Reactor", "max_energy", PR_MAX_ENERGY).getInt(); - PR_TICK_TIME = config.get("Reactor", "ticks_per_update", PR_TICK_TIME).getInt(); - PR_MAX_LASERS = config.get("Reactor", "max_lasers", PR_MAX_LASERS).getInt(); - - // Power store - PS_MAX_ENERGY = config.get("PowerStore", "max_energy", PS_MAX_ENERGY).getInt(); - - // Laser lift - LL_MAX_ENERGY = config.get("LaserLift", "max_energy", LL_MAX_ENERGY).getInt(); - LL_LIFT_ENERGY = config.get("LaserLift", "lift_energy", LL_LIFT_ENERGY, "Energy consummed per entity moved").getInt(); - LL_TICK_RATE = config.get("LaserLift", "tick_rate", LL_TICK_RATE).getInt(); - } - - public static void load() { - CommonWorldGenOres = new ArrayList(30); - CommonWorldGenOres.add(new int[] {Block.oreIron.blockID, 0}); - CommonWorldGenOres.add(new int[] {Block.oreGold.blockID, 0}); - CommonWorldGenOres.add(new int[] {Block.oreCoal.blockID, 0}); - CommonWorldGenOres.add(new int[] {Block.oreEmerald.blockID, 0}); - CommonWorldGenOres.add(new int[] {Block.oreLapis.blockID, 0}); - CommonWorldGenOres.add(new int[] {Block.oreRedstoneGlowing.blockID, 0}); - CommonWorldGenOres.add(new int[] {Block.oreRedstone.blockID, 0}); - - forceFieldBlocks = new ArrayList(); - - SpaceHelmets = new HashSet(); - Jetpacks = new HashSet(); - MinerOres = new HashSet(); - MinerLogs = new HashSet(); - MinerLeaves = new HashSet(); - scannerIgnoreBlocks = new HashSet(); - config.load(); - coreID = config.getBlock("core", 500).getInt(); - controllerID = config.getBlock("controller", 501).getInt(); - radarID = config.getBlock("radar", 502).getInt(); - isolationID = config.getBlock("isolation", 503).getInt(); - airID = config.getBlock("air", 504).getInt(); - airgenID = config.getBlock("airgen", 505).getInt(); - gasID = config.getBlock("gas", 506).getInt(); - laserID = config.getBlock("laser", 507).getInt(); - miningLaserID = config.getBlock("mininglaser", 508).getInt(); - particleBoosterID = config.getBlock("particlebooster", 509).getInt(); - liftID = config.getBlock("lift", 510).getInt(); - laserCamID = config.getBlock("lasercam", 512).getInt(); - camID = config.getBlock("camera", 513).getInt(); - monitorID = config.getBlock("monitor", 514).getInt(); - iridiumBlockID = config.getBlock("iridium", 515).getInt(); - shipScannerID = config.getBlock("shipscanner", 516).getInt(); - cloakCoreID = config.getBlock("cloakcore", 517).getInt(); - cloakCoilID = config.getBlock("cloakcoil", 518).getInt(); - laserTreeFarmID = config.getBlock("lasertreefarm", 519).getInt(); - transporterID = config.getBlock("transporter", 520).getInt(); - transportBeaconID = config.getBlock("transportBeacon", 521).getInt(); - reactorMonitorID = config.getBlock("reactorMonitor", 522).getInt(); - powerLaserID = config.getBlock("powerLaser", 523).getInt(); - powerReactorID = config.getBlock("powerReactor", 524).getInt(); - powerStoreID = config.getBlock("powerStore", 525).getInt(); - chunkLoaderID = config.getBlock("chunkLoader", 526).getInt(); - decorativeID = config.getBlock("decorative",527).getInt(); - - reactorLaserFocusID = config.getItem("reactorLaserFocus", 8700).getInt(); - componentID = config.getItem("component", 8701).getInt(); - helmetID = config.getItem("helmet", 8702).getInt(); - chestID = config.getItem("chest", 8703).getInt(); - pantsID = config.getItem("pants", 8704).getInt(); - bootsID = config.getItem("boots", 8705).getInt(); - airCanisterID = config.getItem("airCanisterFull", 8706).getInt(); - upgradeID = config.getItem("upgrade", 8707).getInt(); - - isForgeMultipartLoaded = Loader.isModLoaded("ForgeMultipart"); - if (isForgeMultipartLoaded) { - loadForgeMultipart(); - } - - isICLoaded = Loader.isModLoaded("IC2"); - if (isICLoaded) - loadIC2(); - - isCCLoaded = Loader.isModLoaded("ComputerCraft"); - if (isCCLoaded) - loadCC(); - - isGregLoaded = Loader.isModLoaded("gregtech_addon"); - if (isGregLoaded) - loadGT(); - - isAppliedEnergisticsLoaded = Loader.isModLoaded("AppliedEnergistics"); - if (isAppliedEnergisticsLoaded) - loadAppliedEnergistics(); - - isAEExtraLoaded = Loader.isModLoaded("extracells"); - if (isAEExtraLoaded) - loadAEExtra(); - - isAdvSolPanelLoaded = Loader.isModLoaded("AdvancedSolarPanel"); - if (isAdvSolPanelLoaded) - loadASP(); - - isAtomicScienceLoaded = Loader.isModLoaded("ResonantInduction|Atomic"); - if (isAtomicScienceLoaded) - loadAtomicScience(); - - isICBMLoaded = Loader.isModLoaded("ICBM|Explosion"); - if (isICBMLoaded) - loadICBM(); - - isMFFSLoaded = Loader.isModLoaded("MFFS"); - if (isMFFSLoaded) - loadMFFS(); - - isGraviSuiteLoaded = Loader.isModLoaded("GraviSuite"); - if (isGraviSuiteLoaded) - loadGraviSuite(); - - isUndergroundBiomesLoaded = Loader.isModLoaded("UndergroundBiomes"); - if (isUndergroundBiomesLoaded) - loadUndergroundBiomes(); - - isNetherOresLoaded = Loader.isModLoaded("NetherOres"); - if (isNetherOresLoaded) - loadNetherOres(); - - isThermalExpansionLoaded = Loader.isModLoaded("ThermalExpansion"); - if (isThermalExpansionLoaded) - loadThermalExpansion(); - - isMetallurgyLoaded = Loader.isModLoaded("Metallurgy3Core"); - if (isMetallurgyLoaded) { - loadMetallurgy(); - } - - isAdvancedRepulsionSystemsLoaded = Loader.isModLoaded("AdvancedRepulsionSystems"); - if (isAdvancedRepulsionSystemsLoaded) { - loadAdvancedRepulsionSystems(); - } - - isMagicalCropsLoaded = Loader.isModLoaded("MagicalCrops"); -// - MinerOres.add(iridiumBlockID); - MinerOres.add(Block.oreCoal.blockID); - MinerOres.add(Block.oreNetherQuartz.blockID); - MinerOres.add(Block.obsidian.blockID); - MinerOres.add(Block.web.blockID); - MinerOres.add(Block.fence.blockID); - MinerOres.add(Block.torchWood.blockID); - MinerOres.add(Block.glowStone.blockID); - MinerOres.add(Block.blockRedstone.blockID); - - // Ignore WarpDrive blocks (which potentially will be duplicated by cheaters using ship scan/deploy) - scannerIgnoreBlocks.add(coreID); - scannerIgnoreBlocks.add(controllerID); - scannerIgnoreBlocks.add(iridiumBlockID); - - if (isICLoaded) { - scannerIgnoreBlocks.add(Items.getItem("mfsUnit").itemID); - scannerIgnoreBlocks.add(Items.getItem("mfeUnit").itemID); - scannerIgnoreBlocks.add(Items.getItem("cesuUnit").itemID); - scannerIgnoreBlocks.add(Items.getItem("batBox").itemID); - } - if (isICBMLoaded) { - scannerIgnoreBlocks.add(ICBM_Explosive); - } - if (isCCLoaded) { - scannerIgnoreBlocks.add(CC_Computer); - scannerIgnoreBlocks.add(CCT_Turtle); - scannerIgnoreBlocks.add(CCT_Upgraded); - scannerIgnoreBlocks.add(CCT_Advanced); - } - // Do not deploy ores and valuables - for (int[] t : CommonWorldGenOres) {// each element of this set is pair [id, meta] - scannerIgnoreBlocks.add(t[0]); // we adding ID only - } - - loadWarpDriveConfig(); - config.save(); - } - - public static void postInit() { - LoadOreDict(); - } - - private static void LoadOreDict() { - String[] oreNames = OreDictionary.getOreNames(); - for(String oreName: oreNames) { - String lowerOreName = oreName.toLowerCase(); - if (oreName.substring(0,3).equals("ore")) { - ArrayList item = OreDictionary.getOres(oreName); - for(ItemStack i: item) { - MinerOres.add(i.itemID); - WarpDrive.debugPrint("WD: Added ore ID: "+i.itemID); - } - } - if (lowerOreName.contains("log")) { - ArrayList item = OreDictionary.getOres(oreName); - for(ItemStack i: item) { - MinerLogs.add(i.itemID); - WarpDrive.debugPrint("WD: Added log ID: "+i.itemID); - } - } - if (lowerOreName.contains("leave") || lowerOreName.contains("leaf")) { - ArrayList item = OreDictionary.getOres(oreName); - for(ItemStack i: item) { - MinerLeaves.add(i.itemID); - WarpDrive.debugPrint("WD: Added leaf ID: "+i.itemID); - } - } - } - } - - private static void loadForgeMultipart() { - try { - Class forgeMultipart_helper = Class.forName("codechicken.multipart.MultipartHelper"); - forgeMultipart_helper_createTileFromNBT = forgeMultipart_helper.getDeclaredMethod("createTileFromNBT", World.class, NBTTagCompound.class); - forgeMultipart_helper_sendDescPacket = forgeMultipart_helper.getDeclaredMethod("sendDescPacket", World.class, TileEntity.class); - Class forgeMultipart_tileMultipart = Class.forName("codechicken.multipart.TileMultipart"); - forgeMultipart_tileMultipart_onChunkLoad = forgeMultipart_tileMultipart.getDeclaredMethod("onChunkLoad"); - } catch (Exception e) { - isForgeMultipartLoaded = false; - WarpDrive.debugPrint("WarpDriveConfig Error loading ForgeMultipart classes"); - e.printStackTrace(); - } - } - - private static void loadIC2() - { - ASP = Items.getItem("solarPanel").itemID; - SpaceHelmets.add(Items.getItem("hazmatHelmet").itemID); - SpaceHelmets.add(Items.getItem("quantumHelmet").itemID); - Jetpacks.add(Items.getItem("jetpack").itemID); - Jetpacks.add(Items.getItem("electricJetpack").itemID); - IC2_Air = new int[] {Items.getItem("airCell").itemID, Items.getItem("airCell").getItemDamage()}; - IC2_Empty = new int[] {Items.getItem("cell").itemID, Items.getItem("cell").getItemDamage()}; - ItemStack rubberWood = Items.getItem("rubberWood"); - IC2_Resin = Items.getItem("resin"); - if(rubberWood != null) { - IC2_RubberWood = rubberWood.itemID; - } - ItemStack ore = Items.getItem("uraniumOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - ore = Items.getItem("copperOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - ore = Items.getItem("tinOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - ore = Items.getItem("leadOre"); - if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - - MinerOres.add(Items.getItem("rubberWood").itemID); - IC2_fluidCell = Items.getItem("FluidCell").getItem(); - } - - private static void loadCC() - { - try - { - Class z = Class.forName("dan200.computercraft.ComputerCraft"); - CC_Computer = z.getField("computerBlockID").getInt(null); - CC_peripheral = z.getField("peripheralBlockID").getInt(null); - CC_Floppy = z.getField("diskItemID").getInt(null); - CCT_Turtle = z.getField("turtleBlockID").getInt(null); - CCT_Upgraded = z.getField("turtleUpgradedBlockID").getInt(null); - CCT_Advanced = z.getField("turtleAdvancedBlockID").getInt(null); - } - catch (Exception e) - { - WarpDrive.debugPrint("WarpDriveConfig Error loading ComputerCraft classes"); - e.printStackTrace(); - } - } - - private static void loadGT() - { - try - { - Class z = Class.forName("gregtechmod.GT_Mod"); - int[] t = (int[])z.getField("sBlockIDs").get(null); - GT_Machine = t[1]; - GT_Ores = t[2]; // meta 1-15 = ores - GT_Granite = t[5]; // 0 - black, 1 - black cobble, 8 - red, 9 - red cobble - MinerOres.add(GT_Ores); - //MinerOres.add(GT_Granite); - } - catch (Exception e) - { - WarpDrive.debugPrint("WarpDriveConfig Error loading GT classes"); - e.printStackTrace(); - isGregLoaded = false; - } - } - - private static void loadAppliedEnergistics() - { - try - { - AEBlocks = Class.forName("appeng.api.Blocks"); - AEMaterials = Class.forName("appeng.api.Materials"); - AEItems = Class.forName("appeng.api.Items"); - MinerOres.add(((ItemStack)AEBlocks.getField("blkQuartzOre").get(null)).itemID); - } - catch (Exception e) - { - WarpDrive.debugPrint("WarpDriveConfig Error loading AppliedEnergistics classes"); - e.printStackTrace(); - isAppliedEnergisticsLoaded = false; - } - } - - private static void loadAEExtra() - { - try - { - Class z = Class.forName("extracells.ItemEnum"); - Object z1 = z.getEnumConstants()[6]; - AEExtra_fluidDrive = (Item)z1.getClass().getDeclaredMethod("getItemInstance").invoke(z1); - z = Class.forName("extracells.BlockEnum"); - z1 = z.getEnumConstants()[9]; - AEExtra_certusQuartzTank = (Block)z1.getClass().getDeclaredMethod("getBlockInstance").invoke(z1); - } - catch (Exception e) - { - WarpDrive.debugPrint("WarpDriveConfig Error loading AEExtra classes"); - e.printStackTrace(); - isAEExtraLoaded = false; - } - } - - private static void loadASP() - { - try - { - Class z = Class.forName("advsolar.common.AdvancedSolarPanel"); - ASP = z.getField("idAdv").getInt(null); - SpaceHelmets.add(((Item)z.getField("advancedSolarHelmet").get(null)).itemID); - SpaceHelmets.add(((Item)z.getField("hybridSolarHelmet").get(null)).itemID); - SpaceHelmets.add(((Item)z.getField("ultimateSolarHelmet").get(null)).itemID); - } - catch (Exception e) - { - WarpDrive.debugPrint("WarpDriveConfig Error loading ASP classes"); - e.printStackTrace(); - isAdvSolPanelLoaded = false; - } - } - - private static void loadAtomicScience() { - try { - Class z = Class.forName("resonantinduction.atomic.Atomic"); - CommonWorldGenOres.add(new int[] {((Block)z.getField("blockUraniumOre").get(null)).blockID, 0}); - AS_Turbine = ((Block)z.getField("blockElectricTurbine").get(null)).blockID; - AS_deuteriumCell = ((Item)z.getField("itemDeuteriumCell").get(null)).itemID; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading AS classes"); - isAtomicScienceLoaded = false; - } - } - - private static void loadICBM() { - try { - Class z = Class.forName("icbm.core.ICBMCore"); - CommonWorldGenOres.add(new int[] {((Block)z.getField("blockSulfurOre").get(null)).blockID, 0}); - z = Class.forName("icbm.explosion.ICBMExplosion"); - ICBM_Machine = ((Block)z.getField("blockMachine").get(null)).blockID; - ICBM_Missile = ((Item)z.getField("itemMissile").get(null)).itemID; - ICBM_Explosive = ((Block)z.getField("blockExplosive").get(null)).blockID; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading ICBM classes"); - e.printStackTrace(); - isICBMLoaded = false; - } - } - - private static void loadMFFS() { - try { - Class z = Class.forName("mffs.ModularForceFieldSystem"); - int blockId = ((Block)z.getField("blockForceField").get(null)).blockID; - forceFieldBlocks.add(blockId); - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading MFFS classes"); - e.printStackTrace(); - isICBMLoaded = false; - } - } - - private static void loadGraviSuite() { - try { - Class z = Class.forName("gravisuite.GraviSuite"); - if (z.getField("ultimateSolarHelmet").get(null) != null) - SpaceHelmets.add(((Item)z.getField("ultimateSolarHelmet").get(null)).itemID); - Jetpacks.add(z.getField("advJetpackID").getInt(null) + 256); - Jetpacks.add(z.getField("graviChestPlateID").getInt(null) + 256); - GS_ultimateLappack = z.getField("ultimateLappackID").getInt(null) + 256; - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading GS classes"); - e.printStackTrace(); - isGraviSuiteLoaded = false; - } - } - - private static void loadUndergroundBiomes() { - try { - Class z = Class.forName("exterminatorJeff.undergroundBiomes.common.UndergroundBiomes"); - UB_igneousStone = ((Block)z.getField("igneousStone").get(null)).blockID; - UB_igneousCobblestone = ((Block)z.getField("igneousCobblestone").get(null)).blockID; - UB_metamorphicStone = ((Block)z.getField("metamorphicStone").get(null)).blockID; - UB_metamorphicCobblestone = ((Block)z.getField("metamorphicCobblestone").get(null)).blockID; - UB_sedimentaryStone = ((Block)z.getField("sedimentaryStone").get(null)).blockID; - WarpDrive.debugPrint("WarpDriveConfig found UndergroundBiomes blocks " + UB_igneousStone + ", " + UB_igneousCobblestone + ", " + UB_metamorphicStone + ", " + UB_metamorphicCobblestone + ", " + UB_sedimentaryStone); - } catch (Exception e) { - WarpDrive.debugPrint("WarpDriveConfig Error loading UndergroundBiomes classes"); - e.printStackTrace(); - isUndergroundBiomesLoaded = false; - } - } - - private static void loadNetherOres() { - try { - NetherOres_count = 21; // FIXME: extract it properly -/* Class z = Class.forName("powercrystals.netherores.ores.Ores"); - NO_netherOresCount = z.getField("values").get(null).length; - WarpDrive.debugPrint("WarpDriveConfig found NetherOres count " + NO_netherOresCount); - - z = Class.forName("powercrystals.netherores.NetherOresCore"); - for (int i = 0; i < (NO_netherOresCount + 15) / 16; i++) - { - NO_netherOresBlock[i] = ((Block[])z.getDeclaredField("blockNetherOres").get(null))[i].blockID; - WarpDrive.debugPrint("WarpDriveConfig found NetherOres blockId " + NO_netherOresBlock[i]); - }*/ - NetherOres_block = new int[(NetherOres_count + 15) / 16]; - NetherOres_block[0] = 1440; - NetherOres_block[1] = 1442; - WarpDrive.debugPrint("WarpDriveConfig found " + NetherOres_count + " NetherOres"); - } - catch (Exception e) - { - WarpDrive.print("WarpDriveConfig Error loading NetherOres classes"); - e.printStackTrace(); - isNetherOresLoaded = false; - } - } - - private static void loadThermalExpansion() { - try { -// TEEnergyCell = Class.forName("thermalexpansion.block.energycell.BlockEnergyCell"); -// TEFluids = Class.forName("thermalexpansion.fluid.TEFluids"); - } catch (Exception e) { - WarpDrive.print("WarpDriveConfig Error loading ThermalExpansion classes"); - e.printStackTrace(); - isThermalExpansionLoaded = false; - } - } - - private static void loadMetallurgy() { - try { - Metallurgy_overworldOresBlock = new int[][] { { 905, 7}, { 905, 8}, { 905, 9}, { 905, 10}, { 905, 11}, { 905, 12}, { 906, 0}, { 906, 1}, { 906, 2}, { 906, 4}, { 906, 5}, { 906, 6}, { 906, 7}, { 906, 8}, { 906, 11}, { 906, 13}, { 906, 14} }; - Metallurgy_netherOresBlock = new int[][] { { 903, 0}, { 903, 1}, { 903, 2}, { 903, 3}, { 903, 4}, { 903, 5}, { 903, 6}, { 903, 7}, { 903, 8}, { 903, 9} }; - Metallurgy_endOresBlock = new int[][] { { 900, 5}, { 900, 6} }; - } catch (Exception e) { - WarpDrive.print("WarpDriveConfig Error loading Metallurgy classes"); - e.printStackTrace(); - isMetallurgyLoaded = false; - } - } - - private static void loadAdvancedRepulsionSystems() { - try { - Class z = Class.forName("mods.immibis.ars.ARSMod"); - int fieldBlockId = ((Block)z.getField("MFFSFieldblock").get(null)).blockID; - forceFieldBlocks.add(fieldBlockId); - } catch (Exception e) { - WarpDrive.print("WarpDriveConfig Error loading AdvancedRepulsionSystems classes"); - e.printStackTrace(); - isAdvancedRepulsionSystemsLoaded = false; - } - } - - public static int[] getDefaultSurfaceBlock(Random random, boolean corrupted, boolean isMoon) { - if (isMoon) { - if (isGregLoaded && (random.nextInt(100) == 1)) { - if (random.nextBoolean()) { - return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; - } else { - return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; - } - } else if (random.nextInt(5) == 1) { - return new int[] {Block.netherrack.blockID, 0}; - } else if (random.nextInt(15) == 1) { - return new int[] {Block.whiteStone.blockID, 0}; - } - } else { - if (isGregLoaded && (random.nextInt(25) == 1)) { - if (random.nextBoolean()) { - return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; - } else { - return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; - } - } else if (random.nextInt(6) == 1) { - return new int[] {Block.netherrack.blockID, 0}; - } else if (random.nextInt(50) == 1) { - return new int[] {Block.whiteStone.blockID, 0}; - } - } - if (corrupted && random.nextBoolean()) { - if (isUndergroundBiomesLoaded) { - int rnd = random.nextInt(8 + 8 + 2); - if (rnd < 8) { - return new int[] {UB_igneousCobblestone, rnd}; - } else if (rnd < (8 + 8)) { - return new int[] {UB_metamorphicCobblestone, rnd - 8}; - } - } - return new int[] {Block.cobblestone.blockID, 0}; - } - if (isUndergroundBiomesLoaded) { - int rnd = random.nextInt(8 + 8 + 8 + 3); - if (rnd < 8) { - return new int[] {UB_igneousStone, rnd}; - } else if (rnd < (8 + 8)) { - return new int[] {UB_metamorphicStone, rnd - 8}; - } - else if (rnd < (8 + 8 + 8)) { - if (rnd == 8 + 8 + 8) { - return new int[] {205, 0}; // emasher Limestone - } else { - return new int[] {UB_sedimentaryStone, rnd - 8 - 8}; - } - } - } - return new int[] {Block.stone.blockID, 0}; - } - - public static int[] getRandomSurfaceBlock(Random random, int blockID, int blockMeta, boolean bedrock) { - if (bedrock && (random.nextInt(1000) == 1)) { - return new int[] {Block.bedrock.blockID, 0}; - } else if (blockID == GT_Granite) { - if ((blockMeta == 0) || (blockMeta == 1)) { - int[] t; - t = getRandomOverworldBlock(random, blockID, blockMeta); - if (t[0] == blockID) - t = getRandomOverworldBlock(random, blockID, blockMeta); - if (t[0] == blockID) - t = getRandomEndBlock(random, blockID, blockMeta); - return t; - } else if ((blockMeta == 8) || (blockMeta == 9)) { - int[] t; - t = getRandomOverworldBlock(random, blockID, blockMeta); - if (t[0] == blockID) - t = getRandomEndBlock(random, blockID, blockMeta); - if (t[0] == blockID) - t = getRandomOverworldBlock(random, blockID, blockMeta); - return t; - } - } else if (blockID == Block.whiteStone.blockID) { - return getRandomEndBlock(random, blockID, blockMeta); - } else if (blockID == Block.netherrack.blockID) { - return getRandomNetherBlock(random, blockID, blockMeta); - } - return getRandomOverworldBlock(random, blockID, blockMeta); - } - - public static int[] getRandomOverworldBlock(Random random, int blockID, int blockMeta) - { - if (random.nextInt(25) == 5) { - return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); - } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { - return Metallurgy_overworldOresBlock[random.nextInt(Metallurgy_overworldOresBlock.length)]; - } else if (isAppliedEnergisticsLoaded && random.nextInt(750) == 1) { - return new int[] {getAEBlock("blkQuartzOre").itemID, getAEBlock("blkQuartzOre").getItemDamage()}; - } else if (random.nextInt(250) == 1) { - return new int[] {Block.oreDiamond.blockID, 0}; - } else if (!isNetherOresLoaded && (random.nextInt(10000) == 42)) { - return new int[] {iridiumBlockID, 0}; - } else if (!isMagicalCropsLoaded && (random.nextInt(100) == 56)) { - return new int[] {3108, 0}; // Essence ore - } else if (isGregLoaded) { - if (random.nextInt(50) == 1) - return new int[] {GT_Ores, 5}; //Bauxite S /* Stone/Iron/Diamod pick | +S = Silktouch recommended */ - else if (random.nextInt(50) == 1) - return new int[] {GT_Ores, 1}; //Galena S - else if (random.nextInt(100) == 1) - return new int[] {GT_Ores, 8}; //Sphalerite S+S - else if (random.nextInt(250) == 1) - return new int[] {GT_Ores, 13}; //Tetrahedrite I - else if (random.nextInt(250) == 1) - return new int[] {GT_Ores, 14}; //Cassiterite I - else if (random.nextInt(250) == 1) - return new int[] {GT_Ores, 15}; //Nickel I - else if (random.nextInt(500) == 1) - return new int[] {GT_Ores, 3}; //Ruby I+S - else if (random.nextInt(500) == 1) - return new int[] {GT_Ores, 4}; //Sapphire I+S - else if (random.nextInt(2000) == 1) - return new int[] {GT_Ores, 2}; //Iridium D+S - } - return new int[] {blockID, blockMeta}; - } - - public static int[] getRandomNetherBlock(Random random, int blockID, int blockMeta) { - if (isICLoaded && (!isNetherOresLoaded) && (random.nextInt(10000) == 42)) { - return new int[] {iridiumBlockID, 0}; - } else if (isNetherOresLoaded && (random.nextInt(25) == 1)) { - int rnd = random.nextInt(NetherOres_count); - return new int[] {NetherOres_block[rnd / 16], rnd % 16}; - } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { - return Metallurgy_netherOresBlock[random.nextInt(Metallurgy_netherOresBlock.length)]; - } else if (random.nextInt(25) == 1) { - return new int[] {Block.oreNetherQuartz.blockID, 0}; - } else if (!isMagicalCropsLoaded && (random.nextInt(100) == 56)) { - return new int[] {3109, 0}; // Nether essence ore - } else if (isGregLoaded) { - if (random.nextInt(100) == 1) - return new int[] {GT_Ores, 6}; //Pyrite S+S - else if (random.nextInt(100) == 1) - return new int[] {GT_Ores, 8}; //Sphalerite S+S - else if (random.nextInt(500) == 1) - return new int[] {GT_Ores, 7}; //Cinnabar I+S - } else if ((!isNetherOresLoaded) && (random.nextInt(100) == 13)) - return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); - return new int[] {blockID, blockMeta}; - } - - public static int[] getRandomEndBlock(Random random, int blockID, int blockMeta) - { - if (isICLoaded && random.nextInt(10000) == 42) { - return new int[] { iridiumBlockID, 0 }; - } else if (isGregLoaded) { - if (random.nextInt(250) == 1) - return new int[] {GT_Ores, 9}; //Tungstate I - else if (random.nextInt(500) == 1) - return new int[] {GT_Ores, 12}; //Sodalite I+S - else if (random.nextInt(500) == 1) - return new int[] {GT_Ores, 10}; //Cooperite=Sheldonite D - else if (random.nextInt(1000) == 1) - return new int[] {GT_Ores, 11}; //Olivine D+S - } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { - return Metallurgy_endOresBlock[random.nextInt(Metallurgy_endOresBlock.length)]; - } else if (random.nextInt(200) == 13) { - return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); - } - return new int[] {blockID, blockMeta}; - } - - public static boolean isAirBlock(World worldObj, int id, int x, int y, int z) { - return id == 0 || Block.blocksList[id] == null || Block.blocksList[id].isAirBlock(worldObj, x, y, z); - } -} diff --git a/src/cr0s/WarpDrive/machines/TileEntityReactor.java b/src/cr0s/WarpDrive/machines/TileEntityReactor.java deleted file mode 100644 index 464bdf3c..00000000 --- a/src/cr0s/WarpDrive/machines/TileEntityReactor.java +++ /dev/null @@ -1,1121 +0,0 @@ -package cr0s.WarpDrive.machines; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.world.WorldServer; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.ForgeDirection; -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.*; -import cr0s.WarpDrive.data.Jumpgate; -import cr0s.WarpDrive.data.MovingEntity; -import cr0s.WarpDrive.world.SpaceTeleporter; - -/** - * @author Cr0s - */ -public class TileEntityReactor extends WarpEnergyTE -{ - public Boolean ready; - - 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 shipVolume; - private ReactorMode currentMode = ReactorMode.IDLE; - - public enum ReactorMode { - IDLE ( 0 ), - BASIC_JUMP ( 1 ), // 0-128 - LONG_JUMP ( 2 ), // 0-12800 - TELEPORT ( 3 ), - BEACON_JUMP ( 4 ), // Jump ship by beacon - HYPERSPACE ( 5 ), // Jump to/from Hyperspace - GATE_JUMP ( 6 ); // Jump via jumpgate - - private final int code; - ReactorMode(int code) { - this.code = code; - } - - public int getCode() { - return code; - } - } - - private int warmupTime = 0; - private int cooldownTime = 0; - public int randomWarmupAddition = 0; - - private int chestTeleportUpdateTicks = 0; - private int registryUpdateTicks = 15; - public String coreFrequency = "default"; - - public int isolationBlocksCount = 0; - public double isolationRate = 0.0D; - public int isolationUpdateTicks = 0; - - public TileEntityProtocol controller; - - private boolean soundPlayed = false; - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - // Always cooldown - if (cooldownTime > 0) { - cooldownTime--; - warmupTime = 0; - } - - // Update state - if (cooldownTime > 0) { // cooling down (2) - if (getBlockMetadata() != 2) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); - } - } else if (controller == null) { // not connected (0) - if (getBlockMetadata() != 0) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } - } else if (controller.isJumpFlag() || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { // active (1) - if (getBlockMetadata() != 1) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); - } - } else { // inactive - if (getBlockMetadata() != 0) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } - } - - // Update warp core in cores registry - registryUpdateTicks++; - if (registryUpdateTicks > WarpDriveConfig.WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS * 20) { - registryUpdateTicks = 0; - WarpDrive.warpCores.updateInRegistry(this); -// WarpDrive.warpCores.printRegistry(); -// WarpDrive.debugPrint("" + this + " controller is " + controller + ", warmupTime " + warmupTime + ", currentMode " + currentMode + ", jumpFlag " + (controller == null ? "NA" : controller.isJumpFlag()) + ", cooldownTime " + cooldownTime); - - TileEntity c = findControllerBlock(); - if (c == null) { - controller = null; - warmupTime = 0; - soundPlayed = false; - return; - } - controller = (TileEntityProtocol)c; - } - - isolationUpdateTicks++; - if (isolationUpdateTicks > WarpDriveConfig.WC_ISOLATION_UPDATE_INTERVAL_SECONDS * 20) { - isolationUpdateTicks = 0; - updateIsolationState(); - } - - if (controller == null) { - return; - } - - currentMode = controller.getMode(); - - StringBuilder reason = new StringBuilder(); - - if ((controller.isJumpFlag() && (isolationUpdateTicks == 1)) || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { - if (!validateShipSpatialParameters(reason)) { - if (controller.isJumpFlag()) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - } - warmupTime = 0; - soundPlayed = false; - return; - } - - if (this.controller.isSummonAllFlag()) { - summonPlayers(); - controller.setSummonAllFlag(false); - } else if (!this.controller.getToSummon().isEmpty()) { - summonSinglePlayer(this.controller.getToSummon()); - this.controller.setToSummon(""); - } - } - - switch (currentMode) { - case TELEPORT: - if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { - if (isChestSummonMode()) { - chestTeleportUpdateTicks++; - if (chestTeleportUpdateTicks >= 20) { - summonPlayersByChestCode(); - chestTeleportUpdateTicks = 0; - } - } else { - teleportPlayersToSpace(); - } - } else { - chestTeleportUpdateTicks = 0; - } - break; - - case BASIC_JUMP: - case LONG_JUMP: - case BEACON_JUMP: - case HYPERSPACE: - case GATE_JUMP: - if (controller.isJumpFlag()) { - // Compute warm-up time - int targetWarmup = 0; - switch (currentMode) { - case BASIC_JUMP: - case LONG_JUMP: - if (controller.getDistance() < 50) { - targetWarmup = WarpDriveConfig.WC_WARMUP_SHORTJUMP_SECONDS * 20; - } else { - targetWarmup = WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS * 20; - } - break; - - case BEACON_JUMP: - case HYPERSPACE: - case GATE_JUMP: - default: - targetWarmup = WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS * 20; - break; - } - // Select best sound file and adjust offset - int soundThreshold = 0; - String soundFile = ""; - if (targetWarmup < 10 * 20) { - soundThreshold = targetWarmup - 4 * 20; - soundFile = "warpdrive:warp_4s"; - } else if (targetWarmup > 29 * 20) { - soundThreshold = targetWarmup - 30 * 20; - soundFile = "warpdrive:warp_30s"; - } else { - soundThreshold = targetWarmup - 10 * 20; - soundFile = "warpdrive:warp_10s"; - } - // Add random duration - soundThreshold += randomWarmupAddition; - - // Check cooldown time - if (cooldownTime > 0) { - if (cooldownTime % 20 == 0) { - int seconds = cooldownTime / 20; - if ((seconds < 5) || ((seconds < 30) && (seconds % 5 == 0)) || (seconds % 10 == 0)) { - messageToAllPlayersOnShip("Warp core is cooling down... " + cooldownTime / 20 + "s to go..."); - } - } - return; - } - - // Set up activated animation - if (warmupTime == 0) { - messageToAllPlayersOnShip("Running pre-jump checklist..."); - - // update ship parameters - if (!validateShipSpatialParameters(reason)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - return; - } - // WarpDrive.debugPrint(this + " Giving warp sickness targetWarmup " + targetWarmup + " distance " + controller.getDistance()); - makePlayersOnShipDrunk(targetWarmup + WarpDriveConfig.WC_WARMUP_RANDOM_TICKS); - } - - if (!soundPlayed && (soundThreshold > warmupTime)) { - // WarpDrive.debugPrint(this + " Playing sound effect '" + soundFile + "' soundThreshold " + soundThreshold + " warmupTime " + warmupTime); - worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, soundFile, 4F, 1F); - soundPlayed = true; - } - - // Awaiting cool-down time - if (warmupTime < (targetWarmup + randomWarmupAddition)) { - warmupTime++; - return; - } - - warmupTime = 0; - soundPlayed = false; - - if (!validateShipSpatialParameters(reason)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - return; - } - - if (WarpDrive.warpCores.isWarpCoreIntersectsWithOthers(this)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip("Warp field intersects with other ship's field. Cannot jump."); - return; - } - - if (WarpDrive.cloaks.isCloaked(worldObj.provider.dimensionId, xCoord, yCoord, zCoord)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip("Core is inside a cloaking field. Aborting. Disable cloaking field to jump!"); - return; - } - - doJump(); - cooldownTime = WarpDriveConfig.WC_COOLDOWN_INTERVAL_SECONDS * 20; - controller.setJumpFlag(false); - } else { - warmupTime = 0; - } - break; - } - } - - public void messageToAllPlayersOnShip(String msg) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX + 0.99D, this.maxY + 0.99D, this.maxZ + 0.99D); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - WarpDrive.print("" + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client":"Server") + this + " messageToAllPlayersOnShip: " + msg); - for (Object o : list) { - if (o == null || !(o instanceof EntityPlayer)) { - continue; - } - - ((EntityPlayer)o).addChatMessage("[" + (coreFrequency.length() > 0 ? coreFrequency : "WarpCore") + "] " + msg); - } - } - - private void updateIsolationState() { - // Search block in cube around core - int xmax, ymax, zmax; - int xmin, ymin, zmin; - xmin = xCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - xmax = xCoord + WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - - zmin = zCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - zmax = zCoord + WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - - // scan 1 block higher to encourage putting isolation block on both ground and ceiling - ymin = Math.max( 0, yCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE + 1); - ymax = Math.min(255, yCoord + WarpDriveConfig.WR_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++) { - for (int z = zmin; z <= zmax; z++) { - if (worldObj.getBlockId(x, y, z) == WarpDriveConfig.isolationID) { - newCount++; - } - } - } - } - isolationBlocksCount = newCount; - if (isolationBlocksCount >= WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS) { - isolationRate = WarpDriveConfig.WR_MIN_ISOLATION_EFFECT - + (isolationBlocksCount - WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS) // bonus blocks - * (WarpDriveConfig.WR_MAX_ISOLATION_EFFECT - WarpDriveConfig.WR_MIN_ISOLATION_EFFECT) - / (WarpDriveConfig.WR_MAX_ISOLATION_BLOCKS - WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS); - } else { - isolationRate = 0.0D; - } - // WarpDrive.debugPrint(this + " Isolation updated to " + isolationBlocksCount + " (" + String.format("%.1f", isolationRate * 100) + "%)"); - } - - private void makePlayersOnShipDrunk(int tickDuration) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - for (Object o : list) { - if (o == null || !(o instanceof EntityPlayer)) { - continue; - } - - // Set "drunk" effect - ((EntityPlayer)o).addPotionEffect(new PotionEffect(Potion.confusion.id, tickDuration, 0, true)); - } - } - - 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().getPlayerForUsername(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().getPlayerForUsername(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); - return; - } - } - } - - private void summonPlayer(EntityPlayerMP player, int x, int y, int z) { - if (consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { - player.setPositionAndUpdate(x, y, z); - - if (player.dimension != worldObj.provider.dimensionId) { - player.mcServer.getConfigurationManager().transferPlayerToDimension(player, this.worldObj.provider.dimensionId, new SpaceTeleporter(DimensionManager.getWorld(this.worldObj.provider.dimensionId), 0, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))); - } - } - } - - public boolean validateShipSpatialParameters(StringBuilder reason) { - if (controller == null) { - reason.append("TileEntityReactor.validateShipSpatialParameters: no controller detected!"); - return false; - } - direction = controller.getDirection(); - shipFront = controller.getFront(); - shipRight = controller.getRight(); - shipUp = controller.getUp(); - shipBack = controller.getBack(); - shipLeft = controller.getLeft(); - shipDown = controller.getDown(); - - int x1 = 0, x2 = 0, z1 = 0, z2 = 0; - - if (Math.abs(dx) > 0) { - if (dx == 1) { - x1 = xCoord - shipBack; - x2 = xCoord + shipFront; - z1 = zCoord - shipLeft; - z2 = zCoord + shipRight; - } else { - x1 = xCoord - shipFront; - x2 = xCoord + shipBack; - z1 = zCoord - shipRight; - z2 = zCoord + shipLeft; - } - } else if (Math.abs(dz) > 0) { - if (dz == 1) { - z1 = zCoord - shipBack; - z2 = zCoord + shipFront; - x1 = xCoord - shipRight; - x2 = xCoord + shipLeft; - } else { - z1 = zCoord - shipFront; - z2 = zCoord + shipBack; - x1 = xCoord - shipLeft; - x2 = xCoord + shipRight; - } - } - - if (x1 < x2) { - minX = x1; - maxX = x2; - } else { - minX = x2; - maxX = x1; - } - - if (z1 < z2) { - minZ = z1; - maxZ = z2; - } else { - 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.WC_MAX_SHIP_SIDE || (shipLeft + shipRight) > WarpDriveConfig.WC_MAX_SHIP_SIDE || (shipDown + shipUp) > WarpDriveConfig.WC_MAX_SHIP_SIDE) { - reason.append("Ship is too big (max is " + WarpDriveConfig.WC_MAX_SHIP_SIDE + " 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)) { - continue; - } - - String playerName = ((EntityPlayer)o).username; - for (String unlimiteName : WarpDriveConfig.WC_UNLIMITED_PLAYERNAMES) { - isUnlimited = isUnlimited || unlimiteName.equals(playerName); - } - } - - shipVolume = computeRealShipVolume(); - if (!isUnlimited && shipVolume > WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE && worldObj.provider.dimensionId == 0) { - reason.append("Ship is too big for the overworld (max is " + WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_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 te = worldObj.getBlockTileEntity(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY) - 1, MathHelper.floor_double(player.posZ)); - - if (te != null && (te instanceof TileEntityProtocol)) - { - if (((TileEntityProtocol)te).getBeaconFrequency().equals(freq)) - { - beaconX = te.xCoord; - beaconZ = te.zCoord; - isBeaconFound = true; - break; - } - } - } - - // Now make jump to a beacon - if (isBeaconFound) { - // Consume energy - if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, controller.getDistance()), false)) { - WarpDrive.print(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); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } else { - messageToAllPlayersOnShip("Insufficient energy level"); - } - } else { - WarpDrive.print(this + " Beacon '" + freq + "' is unknown."); - } - } - - private boolean isShipInJumpgate(Jumpgate jg, StringBuilder reason) - { - AxisAlignedBB aabb = jg.getGateAABB(); - WarpDrive.debugPrint("[TEWarpCore] Jumpgate " + jg.name + " AABB is " + aabb); - int countBlocksInside = 0; - int countBlocksTotal = 0; - - if (aabb.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(maxX - minX, maxY - minY, maxZ - minZ))) - { - return true; - } - - for (int x = minX; x <= maxX; x++) - { - for (int z = minZ; z <= maxZ; z++) - { - for (int y = minY; y <= maxY; y++) - { - int blockID = worldObj.getBlockId(x, y, z); - - if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) - { - continue; - } - if (aabb.minX <= x && aabb.maxX >= x && aabb.minY <= y && aabb.maxY >= y && aabb.minZ <= z && aabb.maxZ >= z) - { - countBlocksInside++; - } - countBlocksTotal++; - } - } - } - - float percent = 0F; - if (shipVolume != 0) - { - percent = Math.round((((countBlocksInside * 1.0F) / shipVolume) * 100.0F) * 10.0F) / 10.0F; - } - if (shipVolume != countBlocksTotal) - { - WarpDrive.print(this + " Ship volume has changed from " + shipVolume + " to " + countBlocksTotal + " blocks"); - } - WarpDrive.debugPrint("Ship has " + countBlocksInside + " / " + shipVolume + " blocks (" + percent + "%) in jumpgate '" + jg.name + "'"); - // At least 80% of ship must be inside jumpgate - if (percent > 80F) - { - return true; - } - else if (percent <= 0.001) - { - reason.append("Ship is not inside a jumpgate. Jump rejected. Nearest jumpgate is " + jg.toNiceString()); - return false; - } - else - { - reason.append("Ship is only " + percent + "% inside a jumpgate. Sorry, we'll loose too much crew as is, jump rejected."); - return false; - } - } - - private boolean isFreePlaceForShip(int destX, int destY, int destZ) - { - int newX, newY, newZ; - - if (destY + shipUp > 255 || destY - shipDown < 5) - { - return false; - } - - int moveX = destX - xCoord; - int moveY = destY - yCoord; - int moveZ = destZ - zCoord; - - for (int x = minX; x <= maxX; x++) - { - for (int z = minZ; z <= maxZ; z++) - { - for (int y = minY; y <= maxY; y++) - { - if (!worldObj.isAirBlock(x, y, z)) - { - newX = moveX + x; - newY = moveY + y; - newZ = moveZ + z; - - if (!worldObj.isAirBlock(newX, newY, newZ)) - { - return false; - } - } - } - } - } - - return true; - } - - private void doGateJump() - { - // Search nearest jump-gate - String gateName = controller.getTargetJumpgateName(); - Jumpgate targetGate = WarpDrive.jumpgates.findGateByName(gateName); - - if (targetGate == null) - { - messageToAllPlayersOnShip("Destination jumpgate '" + gateName + "' is unknown. Check jumpgate name."); - this.controller.setJumpFlag(false); - return; - } - - // Now make jump to a beacon - int gateX = targetGate.xCoord; - int gateY = targetGate.yCoord; - int gateZ = targetGate.zCoord; - int destX = gateX; - int destY = gateY; - int destZ = gateZ; - Jumpgate nearestGate = WarpDrive.jumpgates.findNearestGate(xCoord, yCoord, zCoord); - - StringBuilder reason = new StringBuilder(); - if (!isShipInJumpgate(nearestGate, reason)) - { - messageToAllPlayersOnShip(reason.toString()); - this.controller.setJumpFlag(false); - return; - } - - // If gate is blocked by obstacle - if (!isFreePlaceForShip(gateX, gateY, gateZ)) - { - // Randomize destination coordinates and check for collision with obstacles around jumpgate - // Try to find good place for ship - int numTries = 10; // num tries to check for collision - boolean placeFound = false; - - for (; numTries > 0; numTries--) - { - // randomize destination coordinates around jumpgate - destX = gateX + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); - destZ = gateZ + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); - destY = gateY + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(50)); - - // check for collision - if (isFreePlaceForShip(destX, destY, destZ)) - { - placeFound = true; - break; - } - } - - if (!placeFound) - { - messageToAllPlayersOnShip("Destination gate is blocked by obstacles. Aborting..."); - this.controller.setJumpFlag(false); - return; - } - - WarpDrive.print("[GATE] Place found over " + (10 - numTries) + " tries."); - } - - // Consume energy - if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, controller.getDistance()), false)) { - WarpDrive.print(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); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } else { - messageToAllPlayersOnShip("Insufficient energy level"); - } - } - - private void doJump() { - int distance = controller.getDistance(); - int requiredEnergy = calculateRequiredEnergy(currentMode, shipVolume, distance); - - 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); - return; - } - - String shipInfo = "" + shipVolume + " blocks inside (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"; - if (currentMode == ReactorMode.GATE_JUMP) { - WarpDrive.print(this + " Performing gate jump of " + shipInfo); - doGateJump(); - return; - } else if (currentMode == ReactorMode.BEACON_JUMP) { - WarpDrive.print(this + " Performing beacon jump of " + shipInfo); - doBeaconJump(); - return; - } else if (currentMode == ReactorMode.HYPERSPACE) { - WarpDrive.print(this + " Performing hyperspace jump of " + shipInfo); - - // Check ship size for hyper-space jump - if (shipVolume < WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE) { - Jumpgate nearestGate = null; - if (WarpDrive.jumpgates == null) { - WarpDrive.print(this + " WarpDrive.instance.jumpGates is NULL!"); - } else { - nearestGate = WarpDrive.jumpgates.findNearestGate(xCoord, yCoord, zCoord); - } - - StringBuilder reason = new StringBuilder(); - if (nearestGate == null || !isShipInJumpgate(nearestGate, reason)) { - this.messageToAllPlayersOnShip("Ship is too small (" + shipVolume + "/" + WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE + "). Insufficient ship mass to open hyperspace portal. Use a jumpgate to reach or exit hyperspace."); - this.controller.setJumpFlag(false); - return; - } - } - } else if (currentMode == ReactorMode.BASIC_JUMP) { - WarpDrive.print(this + " Performing basic jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); - } else if (currentMode == ReactorMode.LONG_JUMP) { - WarpDrive.print(this + " Performing long jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); - } else { - WarpDrive.print(this + " Performing some jump #" + currentMode + " of " + shipInfo); - } - - if (currentMode == ReactorMode.BASIC_JUMP || currentMode == ReactorMode.LONG_JUMP || currentMode == ReactorMode.HYPERSPACE) { - if (!consumeEnergy(requiredEnergy, false)) { - messageToAllPlayersOnShip("Insufficient energy level"); - return; - } - - if (this.currentMode == ReactorMode.BASIC_JUMP) { - distance += shipLength; - } - - if (currentMode == ReactorMode.LONG_JUMP && (direction != -1) && (direction != -2)) { - if (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) { - distance *= 100; - } - } - - WarpDrive.debugPrint("" + this + " Distance adjusted to " + distance + " blocks."); - EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, (currentMode == ReactorMode.HYPERSPACE), distance, direction, false, 0, 0, 0); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } - } - - private void teleportPlayersToSpace() { - if (worldObj.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord - 1, zCoord - 2, xCoord + 2, yCoord + 4, zCoord + 2); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - WorldServer spaceWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - for (Object o : list) { - if (!consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { - return; - } - - Entity entity = (Entity) o; - int x = MathHelper.floor_double(entity.posX); - int z = MathHelper.floor_double(entity.posZ); - //int y = MathHelper.floor_double(entity.posY); - final int WOOL_BLOCK_ID = 35; - int newY; - - for (newY = 254; newY > 0; newY--) { - if (spaceWorld.getBlockId(x, newY, z) == WOOL_BLOCK_ID) { - break; - } - } - - if (newY <= 0) { - newY = 254; - } - - if (entity instanceof EntityPlayerMP) { - ((EntityPlayerMP) entity).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP) entity), WarpDriveConfig.G_SPACE_DIMENSION_ID, new SpaceTeleporter(DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID), 0, x, 256, z)); - - if (spaceWorld.isAirBlock(x, newY, z)) { - spaceWorld.setBlock(x , newY, z , Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x + 1, newY, z , Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x - 1, newY, z , Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x , newY, z + 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x , newY, z - 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x + 1, newY, z + 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x - 1, newY, z - 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x + 1, newY, z - 1, Block.stone.blockID, 0, 2); - spaceWorld.setBlock(x - 1, newY, z + 1, Block.stone.blockID, 0, 2); - } - - ((EntityPlayerMP) entity).setPositionAndUpdate(x + 0.5D, newY + 2.0D, z + 0.5D); - } - } - } - } - - private void summonPlayersByChestCode() - { - if (worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord) == null) - { - return; - } - - TileEntityChest chest = (TileEntityChest)worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - EntityPlayerMP player; - - for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) - { - player = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); - - if (checkPlayerInventory(chest, player)) - { - WarpDrive.print(this + " Summoning " + player.username); - summonPlayer(player, xCoord, yCoord + 2, zCoord); - } - } - } - - private static boolean checkPlayerInventory(TileEntityChest chest, EntityPlayerMP player) { - Boolean result = false; - final int MIN_KEY_LENGTH = 5; - int keyLength = 0; - - for (int index = 0; index < chest.getSizeInventory(); index++) { - ItemStack chestItem = chest.getStackInSlot(index); - ItemStack playerItem = player.inventory.getStackInSlot(9 + index); - - if (chestItem == null) { - continue; - } - - if (playerItem == null || chestItem.itemID != playerItem.itemID || chestItem.getItemDamage() != playerItem.getItemDamage() || chestItem.stackSize != playerItem.stackSize) { - return false; - } else { - result = true; - } - - keyLength++; - } - - if (keyLength < MIN_KEY_LENGTH) { - WarpDrive.print("[ChestCode] Key is too short: " + keyLength + " < " + MIN_KEY_LENGTH); - return false; - } - - return result; - } - - private Boolean isChestSummonMode() - { - TileEntity te = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); - - if (te != null) - { - return (te instanceof TileEntityChest); - } - - return false; - } - - private static boolean testBB(AxisAlignedBB axisalignedbb, int x, int y, int z) - { - return axisalignedbb.minX <= x && axisalignedbb.maxX >= x && axisalignedbb.minY <= y && axisalignedbb.maxY >= y && axisalignedbb.minZ <= z && axisalignedbb.maxZ >= z; - } - - @Override - public String getStatus() { - return getBlockType().getLocalizedName() + String.format(" '%s' energy level is %.0f/%.0f EU.", coreFrequency, convertInternalToEU(getEnergyStored()), convertInternalToEU(getMaxEnergyStored())) - + ((cooldownTime > 0) ? ("\n" + (cooldownTime / 20) + " s left of cooldown.") : ((isolationBlocksCount > 0) ? ("\n" + isolationBlocksCount + " active isolation blocks") : "")); - } - - public static int calculateRequiredEnergy(ReactorMode currentMode, int shipVolume, int jumpDistance) { - switch (currentMode) { - case TELEPORT: - return WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE; - - case BASIC_JUMP: - return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE1 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE1 * jumpDistance); - - case LONG_JUMP: - return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE2 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE2 * jumpDistance); - - case HYPERSPACE: - return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 10; // 10% of maximum - - case BEACON_JUMP: - return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 2; // half of maximum - - case GATE_JUMP: - return 2 * shipVolume; - } - - return WarpDriveConfig.WC_MAX_ENERGY_VALUE; - } - - private int computeRealShipVolume() { - int realShipVolume = 0; - - try { - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - int blockID = worldObj.getBlockId(x, y, z); - - if (WarpDriveConfig.isAirBlock(worldObj, blockID, x, y, z) && (blockID != WarpDriveConfig.airID)) { - continue; - } - - realShipVolume++; - } - } - } - } catch(Exception e) { - e.printStackTrace(); - } - - return realShipVolume; - } - - private TileEntity findControllerBlock() - { - TileEntity result; - result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = 1; - dz = 0; - return result; - } - - result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = -1; - dz = 0; - return result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = 0; - dz = 1; - return result; - } - - result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); - - if (result != null && result instanceof TileEntityProtocol) - { - dx = 0; - dz = -1; - return result; - } - - return null; - } - - public int getCooldown() { - return cooldownTime; - } - - public boolean isHidden() { - if (cooldownTime <= 0 && worldObj.rand.nextDouble() < isolationRate) { - // WarpDrive.debugPrint(this + " Core '" + coreFrequency + "' is hidden"); - return true; - } - - return false; - } - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.WC_MAX_ENERGY_VALUE; - } - - @Override - public double demandedEnergyUnits() { - if (this.controller != null && controller.getMode() == ReactorMode.IDLE) { - return 0.0D; - } - - return super.demandedEnergyUnits(); - } - - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } - - @Override - public boolean canInputEnergy(ForgeDirection from) { - return true; - } - - @Override - public void readFromNBT(NBTTagCompound tag) - { - super.readFromNBT(tag); - coreFrequency = tag.getString("corefrequency"); - isolationBlocksCount = tag.getInteger("isolation"); - cooldownTime = tag.getInteger("cooldownTime"); - WarpDrive.warpCores.updateInRegistry(this); - } - - @Override - public void writeToNBT(NBTTagCompound tag) - { - super.writeToNBT(tag); - tag.setString("corefrequency", coreFrequency); - tag.setInteger("isolation", isolationBlocksCount); - tag.setInteger("cooldownTime", cooldownTime); - } - - @Override - public void onChunkUnload() { - WarpDrive.warpCores.removeFromRegistry(this); - super.onChunkUnload(); - } - - @Override - public void validate() { - super.validate(); - WarpDrive.warpCores.updateInRegistry(this); - } - - @Override - public void invalidate() { - WarpDrive.warpCores.removeFromRegistry(this); - super.invalidate(); - } - - @Override - public String toString() { - return String.format("%s \'%s\' @ \'%s\' %d, %d, %d", new Object[] { - getClass().getSimpleName(), - coreFrequency, - worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Integer.valueOf(xCoord), Integer.valueOf(yCoord), Integer.valueOf(zCoord)}); - } -} diff --git a/src/cr0s/WarpDrive/machines/WarpBlockContainer.java b/src/cr0s/WarpDrive/machines/WarpBlockContainer.java deleted file mode 100644 index df15dbf2..00000000 --- a/src/cr0s/WarpDrive/machines/WarpBlockContainer.java +++ /dev/null @@ -1,85 +0,0 @@ -package cr0s.WarpDrive.machines; - -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.api.IBlockUpdateDetector; -import cr0s.WarpDrive.api.IUpgradable; -import cr0s.WarpDrive.data.EnumUpgradeTypes; -import cr0s.WarpDrive.item.ItemWarpUpgrade; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public abstract class WarpBlockContainer extends BlockContainer { - protected WarpBlockContainer(int par1) { - super(par1, Material.iron); - } - - protected WarpBlockContainer(int par1, Material m) { - super(par1, m); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); - } - - @Override - public void onBlockAdded(World w, int x, int y, int z) { - super.onBlockAdded(w, x, y, z); - TileEntity te = w.getBlockTileEntity(x, y, z); - if (te instanceof IBlockUpdateDetector) { - ((IBlockUpdateDetector)te).updatedNeighbours(); - } - } - - /* FIXME untested - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) - { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return false; - } - - boolean hasResponse = false; - TileEntity te = world.getBlockTileEntity(x, y, z); - if(te != null && te instanceof IUpgradable) - { - IUpgradable upgradable = (IUpgradable)te; - ItemStack is = player.inventory.getCurrentItem(); - if(is != null) - { - Item i = is.getItem(); - if(i instanceof ItemWarpUpgrade) - { - if(upgradable.takeUpgrade(EnumUpgradeTypes.values()[is.getItemDamage()],false)) - { - if(!player.capabilities.isCreativeMode) - player.inventory.decrStackSize(player.inventory.currentItem, 1); - player.addChatMessage("Upgrade accepted"); - } - else - { - player.addChatMessage("Upgrade declined"); - } - hasResponse = true; - } - } - } - - return hasResponse; - } - /**/ - - @Override - public void onNeighborBlockChange(World w, int x, int y, int z, int b) { - super.onNeighborBlockChange(w, x, y, z, b); - TileEntity te = w.getBlockTileEntity(x, y, z); - if (te instanceof IBlockUpdateDetector) { - ((IBlockUpdateDetector)te).updatedNeighbours(); - } - } -} diff --git a/src/java/cr0s/warpdrive/EntityJump.java b/src/java/cr0s/warpdrive/EntityJump.java index dff29fda..e3daa6f0 100644 --- a/src/java/cr0s/warpdrive/EntityJump.java +++ b/src/java/cr0s/warpdrive/EntityJump.java @@ -1,5 +1,13 @@ -package cr0s.warpdrive; +package cr0s.WarpDrive; +import cpw.mods.fml.common.FMLCommonHandler; +import cr0s.WarpDrive.data.JumpBlock; +import cr0s.WarpDrive.data.MovingEntity; +import cr0s.WarpDrive.data.TransitionPlane; +import cr0s.WarpDrive.data.Vector3; +import cr0s.WarpDrive.machines.TileEntityReactor; +import cr0s.WarpDrive.world.SpaceTeleporter; +import dan200.computercraft.api.peripheral.IPeripheral; import ic2.api.network.NetworkHelper; import java.lang.reflect.Method; @@ -14,29 +22,21 @@ import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; -import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.warpdrive.data.JumpBlock; -import cr0s.warpdrive.data.MovingEntity; -import cr0s.warpdrive.data.TransitionPlane; -import cr0s.warpdrive.data.Vector3; -import cr0s.warpdrive.machines.TileEntityReactor; -import cr0s.warpdrive.world.SpaceTeleporter; public class EntityJump extends Entity { @@ -143,7 +143,6 @@ public class EntityJump extends Entity WarpDrive.debugPrint("" + this + " Killing jump entity... (" + reason + ")"); } -// unlockWorlds(); unforceChunks(); worldObj.removeEntity(this); } @@ -302,7 +301,7 @@ public class EntityJump extends Entity WarpDrive.print("" + this + " messageToAllPlayersOnShip: " + msg); for (MovingEntity me : entitiesOnShip) { if (me.entity instanceof EntityPlayer) { - ((EntityPlayer)me.entity).addChatMessage(new ChatComponentText("[" + ((reactor != null && reactor.coreFrequency.length() > 0) ? reactor.coreFrequency : "WarpCore") + "] " + msg)); + ((EntityPlayer)me.entity).addChatMessage("[" + ((reactor != null && reactor.coreFrequency.length() > 0) ? reactor.coreFrequency : "WarpCore") + "] " + msg); } } } @@ -362,6 +361,7 @@ public class EntityJump extends Entity } if (!planeValid) { LocalProfiler.stop(); + @SuppressWarnings("null") String msg = "Ship is outside border, unable to reach space!\nClosest transition plane is ~" + closestPlaneDistance + " m away (" + (closestTransitionPlane.dimensionCenterX - closestTransitionPlane.borderSizeX) + ", 250," + (closestTransitionPlane.dimensionCenterZ - closestTransitionPlane.borderSizeZ) + ") to (" @@ -554,11 +554,11 @@ public class EntityJump extends Entity if (jb.blockTileEntity != null) { // WarpDrive.debugPrint("Removing tile entity at " + jb.x + ", " + jb.y + ", " + jb.z); - worldObj.removeTileEntity(jb.x, jb.y, jb.z); + worldObj.removeBlockTileEntity(jb.x, jb.y, jb.z); } - worldObj.setBlock(jb.x, jb.y, jb.z, Blocks.air, 0, 2); + worldObj.setBlock(jb.x, jb.y, jb.z, 0, 0, 2); - te = targetWorld.getTileEntity(jb.x + moveX, jb.y + moveY, jb.z + moveZ); + te = targetWorld.getBlockTileEntity(jb.x + moveX, jb.y + moveY, jb.z + moveZ); if (te != null) { teClass = te.getClass(); // WarpDrive.debugPrint("Tile at " + jb.x + ", " + jb.y + ", " + jb.z + " is " + teClass + " derived from " + teClass.getSuperclass()); @@ -612,7 +612,7 @@ public class EntityJump extends Entity private void saveShip(int shipSize) { LocalProfiler.start("EntityJump.saveShip"); try { - ItemStack reactorChamber = WarpDriveConfig.isICLoaded ? WarpDriveConfig.getIC2Item("reactorChamber") : null; + int reactorChamber = WarpDriveConfig.isICLoaded ? WarpDriveConfig.getIC2Item("reactorChamber").itemID : 0; ship = new JumpBlock[shipSize]; JumpBlock placeAfter[] = new JumpBlock[shipSize]; // blocks and tile entities to be placed at the end, and removed first @@ -635,18 +635,18 @@ public class EntityJump extends Entity for (int y = minY; y <= maxY; y++) { for (int x = x1; x <= x2; x++) { for (int z = z1; z <= z2; z++) { - Block block = worldObj.getBlock(x, y, z); + int blockID = worldObj.getBlockId(x, y, z); // Skip air blocks - if (worldObj.isAirBlock(x, y, z) && (block.isAssociatedBlock(WarpDrive.airBlock))) { + if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) { continue; } int blockMeta = worldObj.getBlockMetadata(x, y, z); - TileEntity tileEntity = worldObj.getTileEntity(x, y, z); - JumpBlock jumpBlock = new JumpBlock(block, blockMeta, tileEntity, x, y, z); + TileEntity tileEntity = worldObj.getBlockTileEntity(x, y, z); + JumpBlock jumpBlock = new JumpBlock(blockID, blockMeta, tileEntity, x, y, z); - if (tileEntity == null || block.isAssociatedBlock(Block.getBlockFromItem(reactorChamber.getItem()))) { + if (tileEntity == null || blockID != reactorChamber) { ship[indexPlaceNormal] = jumpBlock; indexPlaceNormal++; } else { @@ -690,8 +690,8 @@ public class EntityJump extends Entity JumpBlock jb = ship[currentIndexInShip]; if (jb != null) { jb.deploy(targetWorld, moveX, moveY, moveZ); - if (jb.block != WarpDriveConfig.CC_peripheral || (jb.blockMeta != 2 && jb.blockMeta != 4)) { - worldObj.removeTileEntity(jb.x, jb.y, jb.z); + if (jb.blockID != WarpDriveConfig.CC_peripheral || (jb.blockMeta != 2 && jb.blockMeta != 4)) { + worldObj.removeBlockTileEntity(jb.x, jb.y, jb.z); } } currentIndexInShip++; @@ -821,10 +821,10 @@ public class EntityJump extends Entity for (int x = minX; x <= maxX; x++) { for (int z = minZ; z <= maxZ; z++) { for (int y = minY; y <= maxY; y++) { - Block block = worldObj.getBlock(x, y, z); + int blockID = worldObj.getBlockId(x, y, z); // Skipping vanilla air & WarpDrive gas blocks, keep WarpDrive air block - if (worldObj.isAirBlock(x, y, z) && (block.isAssociatedBlock(WarpDrive.airBlock))) {// whitelist + if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) {// whitelist continue; } @@ -838,8 +838,7 @@ public class EntityJump extends Entity WarpDrive.debugPrint("Block(" + x + ", " + y + ", " + z + ") is " + item.getUnlocalizedName() + ":" + worldObj.getBlockMetadata(x, y, z)); /**/ - //TODO: What is block 2702?!? - if ((block.isAssociatedBlock(Blocks.bedrock)) /*|| (block == 2702)*/) {// Blacklist + if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist reason.append("Bedrock detected onboard at " + x + ", " + y + ", " + z + ". Aborting."); LocalProfiler.stop(); return -1; @@ -860,7 +859,7 @@ public class EntityJump extends Entity if (!(xBorder || yBorder || zBorder)) continue; - Block block = worldObj.getBlock(x, y, z); + int blockID = worldObj.getBlockId(x, y, z); // Skipping air blocks if (worldObj.isAirBlock(x, y, z)) { @@ -868,11 +867,11 @@ public class EntityJump extends Entity } // Skipping unmovable blocks - if ((block.isAssociatedBlock(Blocks.bedrock)) /*|| (block == 2702)*/) {// Blacklist + if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist continue; } - TileEntity te = worldObj.getTileEntity(x, y, z); + TileEntity te = worldObj.getBlockTileEntity(x, y, z); if (te == null) { continue; } @@ -1064,9 +1063,7 @@ public class EntityJump extends Entity int lmoveY = movementVector[1] * testDistance; int lmoveZ = movementVector[2] * testDistance; - int x, y, z, newX, newY, newZ; - Block blockOnShip; - Block block; + int x, y, z, newX, newY, newZ, blockOnShipID, blockID; for (y = minY; y <= maxY; y++) { newY = y + lmoveY; for (x = minX; x <= maxX; x++) { @@ -1074,25 +1071,25 @@ public class EntityJump extends Entity for (z = minZ; z <= maxZ; z++) { newZ = z + lmoveZ; - block = worldObj.getBlock(newX, newY, newZ); - if ((block.isAssociatedBlock(Blocks.bedrock))/* || (block == 2702)*/) {// Blacklist + blockID = worldObj.getBlockId(newX, newY, newZ); + if ((blockID == Block.bedrock.blockID) || (blockID == 2702)) {// Blacklist 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 " + block + " detected at destination (" + newX + ";" + newY + ";" + newZ + ")"); + true, "Unpassable block " + blockID + " detected at destination (" + newX + ";" + newY + ";" + newZ + ")"); if (!fullCollisionDetails) { return result; } } - blockOnShip = worldObj.getBlock(x, y, z); - if (!blockOnShip.isAssociatedBlock(Blocks.air) && !block.isAssociatedBlock(Blocks.air) && !block.isAssociatedBlock(WarpDrive.airBlock) && !block.isAssociatedBlock(WarpDrive.gasBlock)/* && block != 18* TODO: */) { + blockOnShipID = worldObj.getBlockId(x, y, z); + if (blockOnShipID != 0 && blockID != 0 && blockID != WarpDriveConfig.airID && blockID != WarpDriveConfig.gasID && blockID != 18) { 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 #" + block + " detected at (" + newX + ", " + newY + ", " + newZ + ")"); + true, "Obstacle block #" + blockID + " detected at (" + newX + ", " + newY + ", " + newZ + ")"); if (!fullCollisionDetails) { return result; } @@ -1225,7 +1222,7 @@ public class EntityJump extends Entity public String toString() { return String.format("%s/%d \'%s\' @ \'%s\' %.2f, %.2f, %.2f", new Object[] { getClass().getSimpleName(), - Integer.valueOf(getEntityId()), + Integer.valueOf(entityId), reactor == null ? "~NULL~" : reactor.coreFrequency, worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), Double.valueOf(posX), Double.valueOf(posY), Double.valueOf(posZ)}); diff --git a/src/java/cr0s/warpdrive/WarpDrive.java b/src/java/cr0s/warpdrive/WarpDrive.java index 824b3391..c99e35b7 100644 --- a/src/java/cr0s/warpdrive/WarpDrive.java +++ b/src/java/cr0s/warpdrive/WarpDrive.java @@ -1,30 +1,5 @@ -package cr0s.warpdrive; +package cr0s.WarpDrive; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemArmor.ArmorMaterial; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; -import net.minecraftforge.common.ForgeChunkManager.Ticket; -import net.minecraftforge.common.ForgeChunkManager.Type; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.util.EnumHelper; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; @@ -34,60 +9,51 @@ import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.warpdrive.block.BlockAir; -import cr0s.warpdrive.block.BlockGas; -import cr0s.warpdrive.block.BlockIridium; -import cr0s.warpdrive.command.GenerateCommand; -import cr0s.warpdrive.command.InvisibleCommand; -import cr0s.warpdrive.command.JumpgateCommand; -import cr0s.warpdrive.command.SpaceTpCommand; -import cr0s.warpdrive.data.CamRegistry; -import cr0s.warpdrive.data.CloakManager; -import cr0s.warpdrive.data.JumpgatesRegistry; -import cr0s.warpdrive.data.WarpCoresRegistry; -import cr0s.warpdrive.item.ItemWarpAirCanister; -import cr0s.warpdrive.item.ItemWarpArmor; -import cr0s.warpdrive.item.ItemWarpComponent; -import cr0s.warpdrive.machines.BlockAirGenerator; -import cr0s.warpdrive.machines.BlockCamera; -import cr0s.warpdrive.machines.BlockCloakingCoil; -import cr0s.warpdrive.machines.BlockCloakingDeviceCore; -import cr0s.warpdrive.machines.BlockLaser; -import cr0s.warpdrive.machines.BlockLaserCam; -import cr0s.warpdrive.machines.BlockLift; -import cr0s.warpdrive.machines.BlockMiningLaser; -import cr0s.warpdrive.machines.BlockMonitor; -import cr0s.warpdrive.machines.BlockParticleBooster; -import cr0s.warpdrive.machines.BlockProtocol; -import cr0s.warpdrive.machines.BlockRadar; -import cr0s.warpdrive.machines.BlockReactor; -import cr0s.warpdrive.machines.BlockShipScanner; -import cr0s.warpdrive.machines.BlockWarpIsolation; -import cr0s.warpdrive.machines.TileEntityAirGenerator; -import cr0s.warpdrive.machines.TileEntityCamera; -import cr0s.warpdrive.machines.TileEntityCloakingDeviceCore; -import cr0s.warpdrive.machines.TileEntityLaser; -import cr0s.warpdrive.machines.TileEntityLift; -import cr0s.warpdrive.machines.TileEntityMiningLaser; -import cr0s.warpdrive.machines.TileEntityMonitor; -import cr0s.warpdrive.machines.TileEntityParticleBooster; -import cr0s.warpdrive.machines.TileEntityProtocol; -import cr0s.warpdrive.machines.TileEntityRadar; -import cr0s.warpdrive.machines.TileEntityReactor; -import cr0s.warpdrive.machines.TileEntityShipScanner; -import cr0s.warpdrive.machines.WarpChunkTE; -import cr0s.warpdrive.render.CameraOverlay; -import cr0s.warpdrive.world.BiomeSpace; -import cr0s.warpdrive.world.HyperSpaceProvider; -import cr0s.warpdrive.world.HyperSpaceWorldGenerator; -import cr0s.warpdrive.world.SpaceProvider; -import cr0s.warpdrive.world.SpaceWorldGenerator; +import cr0s.WarpDrive.block.*; +import cr0s.WarpDrive.command.*; +import cr0s.WarpDrive.data.*; +import cr0s.WarpDrive.item.*; +import cr0s.WarpDrive.machines.*; +import cr0s.WarpDrive.render.*; +import cr0s.WarpDrive.world.*; import dan200.computercraft.api.ComputerCraftAPI; -@Mod(modid = "warpdrive", name = "WarpDrive", version = "2.0.0", +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.EnumArmorMaterial; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet250CustomPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.Configuration; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.EnumHelper; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +@Mod(modid = "WarpDrive", name = "WarpDrive", version = "1.2.7.0", dependencies = "required-after:IC2;" + " required-after:CoFHCore;" + " after:ComputerCraft;" @@ -102,6 +68,11 @@ import dan200.computercraft.api.ComputerCraftAPI; + " after:GraviSuite;" + " after:UndergroundBiomes;" + " after:NetherOres") +@NetworkMod(clientSideRequired = true, serverSideRequired = true, channels = { + "WarpDriveBeam", + "WarpDriveFreq", + "WarpDriveLaserT", + "WarpDriveCloaks" }, packetHandler = PacketHandler.class) /** * @author Cr0s */ @@ -117,19 +88,28 @@ public class WarpDrive implements LoadingCallback { public static Block monitorBlock; public static Block boosterBlock; public static Block miningLaserBlock; + public static Block laserTreeFarmBlock; public static Block liftBlock; public static Block scannerBlock; public static Block cloakBlock; public static Block cloakCoilBlock; - + public static Block transporterBlock; + public static Block reactorMonitorBlock; + public static Block powerReactorBlock; + public static Block powerLaserBlock; + public static Block powerStoreBlock; public static Block airBlock; public static Block gasBlock; - public static Block iridiumBlock; + public static Block transportBeaconBlock; + public static Block chunkLoaderBlock; + public static BlockDecorative decorativeBlock; + public static Item reactorLaserFocusItem; public static ItemWarpComponent componentItem; + public static ItemWarpUpgrade upgradeItem; - public static ArmorMaterial armorMaterial = EnumHelper.addArmorMaterial("WARP", 5, new int[]{1, 3, 2, 1}, 15); + public static EnumArmorMaterial armorMaterial = EnumHelper.addArmorMaterial("WARP", 5, new int[]{1, 3, 2, 1}, 15); public static ItemWarpArmor helmetItem; public static ItemWarpAirCanister airCanisterItem; @@ -147,7 +127,7 @@ public class WarpDrive implements LoadingCallback { @Instance("WarpDrive") public static WarpDrive instance; - @SidedProxy(clientSide = "cr0s.warpdrive.client.ClientProxy", serverSide = "cr0s.warpdrive.CommonProxy") + @SidedProxy(clientSide = "cr0s.WarpDrive.client.ClientProxy", serverSide = "cr0s.WarpDrive.CommonProxy") public static CommonProxy proxy; public static WarpCoresRegistry warpCores; @@ -172,6 +152,9 @@ public class WarpDrive implements LoadingCallback { if (FMLCommonHandler.instance().getSide().isClient()) { Minecraft mc = Minecraft.getMinecraft(); + // System.out.println("[WarpDrive] Registering sounds event handler..."); + MinecraftForge.EVENT_BUS.register(new SoundHandler()); + normalFOV = mc.gameSettings.fovSetting; normalSensitivity = mc.gameSettings.mouseSensitivity; WarpDrive.print("[WarpDrive] FOV is " + normalFOV + " Sensitivity is " + normalSensitivity); @@ -181,10 +164,11 @@ public class WarpDrive implements LoadingCallback { @SideOnly(Side.CLIENT) @EventHandler public void init(FMLInitializationEvent event) { +// FIXME FMLInterModComms.sendMessage("Waila", "register", "cr0s.WarpDrive.client.WailaHandler.callbackRegister"); } public static void print(String out) { - System.out.println("WarpDrive " + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client ":"Server ") + ": " + out); + System.out.println((FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client ":"Server ") + out); } public static void debugPrint(String out) { @@ -198,126 +182,178 @@ public class WarpDrive implements LoadingCallback { WarpDriveConfig.load(); // CORE CONTROLLER - protocolBlock = new BlockProtocol(0, Material.rock); + protocolBlock = new BlockProtocol(WarpDriveConfig.controllerID,0, Material.rock); GameRegistry.registerBlock(protocolBlock, "protocolBlock"); GameRegistry.registerTileEntity(TileEntityProtocol.class, "protocolBlock"); // WARP CORE - warpCore = new BlockReactor(0, Material.rock); + warpCore = new BlockReactor(WarpDriveConfig.coreID, 0, Material.rock); GameRegistry.registerBlock(warpCore, "warpCore"); GameRegistry.registerTileEntity(TileEntityReactor.class, "warpCore"); // WARP RADAR - radarBlock = new BlockRadar(0, Material.rock); + radarBlock = new BlockRadar(WarpDriveConfig.radarID, 0, Material.rock); GameRegistry.registerBlock(radarBlock, "radarBlock"); GameRegistry.registerTileEntity(TileEntityRadar.class, "radarBlock"); // WARP ISOLATION - isolationBlock = new BlockWarpIsolation(0, Material.rock); + isolationBlock = new BlockWarpIsolation( WarpDriveConfig.isolationID, 0, Material.rock); GameRegistry.registerBlock(isolationBlock, "isolationBlock"); // AIR GENERATOR - airgenBlock = new BlockAirGenerator(0,Material.rock); + airgenBlock = new BlockAirGenerator(WarpDriveConfig.airgenID, 0,Material.rock); GameRegistry.registerBlock(airgenBlock, "airgenBlock"); GameRegistry.registerTileEntity(TileEntityAirGenerator.class, "airgenBlock"); - // AIR Block - airBlock = (new BlockAir()); + // AIR BLOCK + airBlock = (new BlockAir(WarpDriveConfig.airID)); GameRegistry.registerBlock(airBlock, "airBlock"); - // GAS Block - gasBlock = new BlockGas(); + // GAS BLOCK + gasBlock = (new BlockGas(WarpDriveConfig.gasID)); GameRegistry.registerBlock(gasBlock, "gasBlock"); // LASER EMITTER - laserBlock = new BlockLaser(0, Material.rock); + laserBlock = new BlockLaser(WarpDriveConfig.laserID, 0,Material.rock); GameRegistry.registerBlock(laserBlock, "laserBlock"); GameRegistry.registerTileEntity(TileEntityLaser.class, "laserBlock"); // LASER EMITTER WITH CAMERA - laserCamBlock = new BlockLaserCam(0, Material.rock); + laserCamBlock = new BlockLaserCam(WarpDriveConfig.laserCamID, 0, Material.rock); GameRegistry.registerBlock(laserCamBlock, "laserCamBlock"); // CAMERA - cameraBlock = new BlockCamera(0,Material.rock); + cameraBlock = new BlockCamera(WarpDriveConfig.camID, 0,Material.rock); GameRegistry.registerBlock(cameraBlock, "cameraBlock"); GameRegistry.registerTileEntity(TileEntityCamera.class, "cameraBlock"); // MONITOR - monitorBlock = new BlockMonitor(); + monitorBlock = new BlockMonitor(WarpDriveConfig.monitorID); GameRegistry.registerBlock(monitorBlock, "monitorBlock"); GameRegistry.registerTileEntity(TileEntityMonitor.class, "monitorBlock"); // MINING LASER - miningLaserBlock = new BlockMiningLaser(0, Material.rock); + miningLaserBlock = new BlockMiningLaser(WarpDriveConfig.miningLaserID, 0, Material.rock); GameRegistry.registerBlock(miningLaserBlock, "miningLaserBlock"); GameRegistry.registerTileEntity(TileEntityMiningLaser.class, "miningLaserBlock"); + // LASER TREE FARM + laserTreeFarmBlock = new BlockLaserTreeFarm(WarpDriveConfig.laserTreeFarmID, 0, Material.rock); + + GameRegistry.registerBlock(laserTreeFarmBlock, "laserTreeFarmBlock"); + GameRegistry.registerTileEntity(TileEntityLaserTreeFarm.class,"laserTreeFarmBlock"); + // PARTICLE BOOSTER - boosterBlock = new BlockParticleBooster(0, Material.rock); + boosterBlock = new BlockParticleBooster(WarpDriveConfig.particleBoosterID, 0, Material.rock); GameRegistry.registerBlock(boosterBlock, "boosterBlock"); GameRegistry.registerTileEntity(TileEntityParticleBooster.class, "boosterBlock"); // LASER LIFT - liftBlock = new BlockLift(0, Material.rock); + liftBlock = new BlockLift(WarpDriveConfig.liftID, 0, Material.rock); - GameRegistry.registerBlock(liftBlock, "liftBlocks"); + GameRegistry.registerBlock(liftBlock, "liftBlock"); GameRegistry.registerTileEntity(TileEntityLift.class, "liftBlock"); - // IRIDIUM Blocks - iridiumBlock = new BlockIridium(); + // IRIDIUM BLOCK + iridiumBlock = new BlockIridium(WarpDriveConfig.iridiumBlockID); GameRegistry.registerBlock(iridiumBlock, "iridiumBlock"); // SHIP SCANNER - scannerBlock = new BlockShipScanner(0, Material.rock); + scannerBlock = new BlockShipScanner(WarpDriveConfig.shipScannerID, 0, Material.rock); - GameRegistry.registerBlock(scannerBlock, "scannerBlocks"); + GameRegistry.registerBlock(scannerBlock, "scannerBlock"); GameRegistry.registerTileEntity(TileEntityShipScanner.class, "scannerBlock"); // CLOAKING DEVICE CORE - cloakBlock = new BlockCloakingDeviceCore(0, Material.rock); + cloakBlock = new BlockCloakingDeviceCore(WarpDriveConfig.cloakCoreID, 0, Material.rock); GameRegistry.registerBlock(cloakBlock, "cloakBlock"); GameRegistry.registerTileEntity(TileEntityCloakingDeviceCore.class, "cloakBlock"); // CLOAKING DEVICE COIL - cloakCoilBlock = new BlockCloakingCoil(0, Material.rock); + cloakCoilBlock = new BlockCloakingCoil(WarpDriveConfig.cloakCoilID, 0, Material.rock); GameRegistry.registerBlock(cloakCoilBlock, "cloakCoilBlock"); - // COMPONENT ItemsS - componentItem = new ItemWarpComponent(); + // TRANSPORTER + transporterBlock = new BlockTransporter(WarpDriveConfig.transporterID,Material.rock); + + GameRegistry.registerBlock(transporterBlock, "transporter"); + GameRegistry.registerTileEntity(TileEntityTransporter.class,"transporter"); + + // REACTOR MONITOR + reactorMonitorBlock = new BlockLaserReactorMonitor(WarpDriveConfig.reactorMonitorID, Material.rock); + + GameRegistry.registerBlock(reactorMonitorBlock, "reactorMonitor"); + GameRegistry.registerTileEntity(TileEntityLaserReactorMonitor.class,"reactorMonitor"); + + // TRANSPORT BEACON + transportBeaconBlock = new BlockTransportBeacon(WarpDriveConfig.transportBeaconID); + + GameRegistry.registerBlock(transportBeaconBlock, "transportBeacon"); + + // POWER REACTOR, LASER, STORE + powerReactorBlock = new BlockPowerReactor(WarpDriveConfig.powerReactorID); + GameRegistry.registerBlock(powerReactorBlock,"powerReactor"); + GameRegistry.registerTileEntity(TileEntityPowerReactor.class, "powerReactor"); + + powerLaserBlock = new BlockPowerLaser(WarpDriveConfig.powerLaserID); + GameRegistry.registerBlock(powerLaserBlock, "powerLaser"); + GameRegistry.registerTileEntity(TileEntityPowerLaser.class, "powerLaser"); + + powerStoreBlock = new BlockPowerStore(WarpDriveConfig.powerStoreID); + GameRegistry.registerBlock(powerStoreBlock,"powerStore"); + GameRegistry.registerTileEntity(TileEntityPowerStore.class, "powerStore"); + + // CHUNK LOADER + chunkLoaderBlock = new BlockChunkLoader(WarpDriveConfig.chunkLoaderID); + GameRegistry.registerBlock(chunkLoaderBlock, "chunkLoader"); + GameRegistry.registerTileEntity(TileEntityChunkLoader.class, "chunkLoader"); + + // DECORATIVE + decorativeBlock = new BlockDecorative(WarpDriveConfig.decorativeID); + GameRegistry.registerBlock(decorativeBlock, ItemBlockDecorative.class, "decorative"); + + // REACTOR LASER FOCUS + reactorLaserFocusItem = new ItemReactorLaserFocus(WarpDriveConfig.reactorLaserFocusID); + GameRegistry.registerItem(reactorLaserFocusItem, "reactorLaserFocus"); + + // COMPONENT ITEMS + componentItem = new ItemWarpComponent(WarpDriveConfig.componentID); GameRegistry.registerItem(componentItem, "component"); - helmetItem = new ItemWarpArmor(0); + helmetItem = new ItemWarpArmor(WarpDriveConfig.helmetID, 0); GameRegistry.registerItem(helmetItem, "helmet"); - airCanisterItem = new ItemWarpAirCanister(); + airCanisterItem = new ItemWarpAirCanister(WarpDriveConfig.airCanisterID); GameRegistry.registerItem(airCanisterItem, "airCanisterFull"); + upgradeItem = new ItemWarpUpgrade(WarpDriveConfig.upgradeID); + GameRegistry.registerItem(upgradeItem, "upgrade"); + proxy.registerEntities(); ForgeChunkManager.setForcedChunkLoadingCallback(instance, instance); spaceWorldGenerator = new SpaceWorldGenerator(); - GameRegistry.registerWorldGenerator(spaceWorldGenerator, 0); + GameRegistry.registerWorldGenerator(spaceWorldGenerator); hyperSpaceWorldGenerator = new HyperSpaceWorldGenerator(); - GameRegistry.registerWorldGenerator(hyperSpaceWorldGenerator, 0); + GameRegistry.registerWorldGenerator(hyperSpaceWorldGenerator); registerSpaceDimension(); registerHyperSpaceDimension(); @@ -325,7 +361,7 @@ public class WarpDrive implements LoadingCallback { MinecraftForge.EVENT_BUS.register(new SpaceEventHandler()); if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - warpdriveTab.setBackgroundImageName("Items.png"); + warpdriveTab.setBackgroundImageName("items.png"); MinecraftForge.EVENT_BUS.register(new CameraOverlay(Minecraft.getMinecraft())); } @@ -359,76 +395,93 @@ public class WarpDrive implements LoadingCallback { private static void initVanillaRecipes() { componentItem.registerRecipes(); + decorativeBlock.initRecipes(); + upgradeItem.initRecipes(); //WarpCore GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(warpCore), false, "ipi", "ici", "idi", - 'i', Items.iron_ingot, + 'i', Item.ingotIron, 'p', componentItem.getIS(6), 'c', componentItem.getIS(2), - 'd', Items.diamond)); + 'd', Item.diamond)); //Controller GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(protocolBlock), false, "ici", "idi", "iii", - 'i', Items.iron_ingot, + 'i', Item.ingotIron, 'c', componentItem.getIS(5), - 'd', Items.diamond)); + 'd', Item.diamond)); //Radar GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(radarBlock), false, "ggg", "pdc", "iii", - 'i', Items.iron_ingot, + 'i', Item.ingotIron, 'c', componentItem.getIS(5), 'p', componentItem.getIS(6), - 'g', Blocks.glass, - 'd', Items.diamond)); + 'g', Block.glass, + 'd', Item.diamond)); - //Isolation Blocks + //Isolation Block GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(isolationBlock), false, "igi", "geg", "igi", - 'i', Items.iron_ingot, - 'g', Blocks.glass, - 'e', Items.ender_pearl)); + 'i', Item.ingotIron, + 'g', Block.glass, + 'e', Item.enderPearl)); //Air generator GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(airgenBlock), false, "ibi", "i i", "ipi", - 'i', Items.iron_ingot, - 'b', Blocks.iron_bars, + 'i', Item.ingotIron, + 'b', Block.fenceIron, 'p', componentItem.getIS(6))); //Laser GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserBlock), false, "ili", "iri", "ici", - 'i', Items.iron_ingot, - 'r', Items.redstone, + 'i', Item.ingotIron, + 'r', Item.redstone, 'c', componentItem.getIS(5), 'l', componentItem.getIS(3), 'p', componentItem.getIS(6))); //Mining laser GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(miningLaserBlock), false, "ici", "iti", "ili", - 'i', Items.iron_ingot, - 'r', Items.redstone, + 'i', Item.ingotIron, + 'r', Item.redstone, + 't', componentItem.getIS(1), + 'c', componentItem.getIS(5), + 'l', componentItem.getIS(3))); + + //Tree farm laser + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserTreeFarmBlock), false, "ili", "sts", "ici", + 'i', Item.ingotIron, + 's', "treeSapling", 't', componentItem.getIS(1), 'c', componentItem.getIS(5), 'l', componentItem.getIS(3))); //Laser Lift GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(liftBlock), false, "ipi", "rtr", "ili", - 'i', Items.iron_ingot, - 'r', Items.redstone, + 'i', Item.ingotIron, + 'r', Item.redstone, 't', componentItem.getIS(1), 'l', componentItem.getIS(3), 'p', componentItem.getIS(6))); + //Transporter + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transporterBlock), false, "iii", "ptc", "iii", + 'i', Item.ingotIron, + 't', componentItem.getIS(1), + 'c', componentItem.getIS(5), + 'p', componentItem.getIS(6))); + //Particle Booster GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(boosterBlock), false, "ipi", "rgr", "iii", - 'i', Items.iron_ingot, - 'r', Items.redstone, - 'g', Blocks.glass, + 'i', Item.ingotIron, + 'r', Item.redstone, + 'g', Block.glass, 'p', componentItem.getIS(6))); //Camera GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cameraBlock), false, "ngn", "i i", "ici", - 'i', Items.iron_ingot, - 'n', Items.gold_nugget, - 'g', Blocks.glass, + 'i', Item.ingotIron, + 'n', Item.goldNugget, + 'g', Block.glass, 'c', componentItem.getIS(5))); //LaserCamera @@ -436,43 +489,82 @@ public class WarpDrive implements LoadingCallback { //Monitor GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(monitorBlock), false, "ggg", "iti", "ici", - 'i', Items.iron_ingot, - 't', Blocks.torch, - 'g', Blocks.glass, + 'i', Item.ingotIron, + 't', Block.torchWood, + 'g', Block.glass, 'c', componentItem.getIS(5))); //Cloaking device GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cloakBlock), false, "ipi", "lrl", "ici", - 'i', Items.iron_ingot, - 'r', Items.redstone, + 'i', Item.ingotIron, + 'r', Item.redstone, 'l', componentItem.getIS(3), 'c', componentItem.getIS(5), 'p', componentItem.getIS(6))); //Cloaking coil GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(cloakCoilBlock), false, "ini", "rdr", "ini", - 'i', Items.iron_ingot, - 'd', Items.diamond, - 'r', Items.redstone, - 'n', Items.gold_nugget)); + 'i', Item.ingotIron, + 'd', Item.diamond, + 'r', Item.redstone, + 'n', Item.goldNugget)); + + //Power Laser + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerLaserBlock), false, "iii", "ilg", "ici", + 'i', Item.ingotIron, + 'g', Block.glass, + 'c', componentItem.getIS(5), + 'l', componentItem.getIS(3))); + + //Power Reactor + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerReactorBlock), false, "ipi", "gog", "ici", + 'i', Item.ingotIron, + 'g', Block.glass, + 'o', componentItem.getIS(4), + 'c', componentItem.getIS(5), + 'p', componentItem.getIS(6))); + + //Power Store + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerStoreBlock), false, "ipi", "isi", "ici", + 'i', Item.ingotIron, + 's', componentItem.getIS(7), + 'c', componentItem.getIS(5), + 'p', componentItem.getIS(6))); + + //Transport Beacon + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transportBeaconBlock), false, " e ", "ldl", " s ", + 'e', Item.enderPearl, + 'l', "dyeBlue", + 'd', Item.diamond, + 's', Item.stick)); + + //Chunk Loader + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(chunkLoaderBlock), false, "ipi", "ici", "ifi", + 'i', Item.ingotIron, + 'p', componentItem.getIS(6), + 'c', componentItem.getIS(0), + 'f', componentItem.getIS(5))); //Helmet GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(helmetItem), false, "iii", "iwi", "gcg", - 'i', Items.iron_ingot, - 'w', Blocks.wool, - 'g', Blocks.glass, + 'i', Item.ingotIron, + 'w', Block.cloth, + 'g', Block.glass, 'c', componentItem.getIS(8))); } private static void initAETERecipes() { ItemStack redstoneEnergycell = GameRegistry.findItemStack("ThermalExpansion", "cellReinforced", 1); + ItemStack resonantEnergycell = GameRegistry.findItemStack("ThermalExpansion", "cellResonant", 1); ItemStack bucketEnder = GameRegistry.findItemStack("ThermalExpansion", "bucketEnder", 1); ItemStack fluixCrystal = WarpDriveConfig.getAEMaterial("matFluxCrystal"); + ItemStack quantumEntangledSingularity = WarpDriveConfig.getAEMaterial("matQuantumEntangledSingularity"); ItemStack vibrantQuartzGlass = WarpDriveConfig.getAEBlock("blkQuartzLamp"); vibrantQuartzGlass.setItemDamage(4); ItemStack antimatter = GameRegistry.findItemStack("ResonantInduction|Atomic", "antimatter", 1); antimatter.setItemDamage(0); ItemStack floppy = GameRegistry.findItemStack("ComputerCraft", "disk", 1); + ItemStack ultimateLappack = new ItemStack(WarpDriveConfig.GS_ultimateLappack, 1, 1); // top = advancedCircuit, redstoneEnergycell, advancedCircuit // middle = fluix crystal, advancedMachine, fluix crystal @@ -492,14 +584,37 @@ public class WarpDrive implements LoadingCallback { 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), 'o', floppy, 'f', fluixCrystal); + + // top = Iridium plate, Resonant Energycell, Iridium plate + // middle = Singularity, 125 milligram antimatter, Singularity + // bottom = Iridium plate, Ultimate lappack, Iridium plate + GameRegistry.addRecipe(new ItemStack(powerReactorBlock), "iri", "sas", "ili", + 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), + 's', quantumEntangledSingularity, + 'a', antimatter, + 'l', ultimateLappack, + 'r', resonantEnergycell); + + // top = Advanced circuit, Advanced alloy, Advanced alloy + // middle = Advanced circuit, Warp drive laser, Vibrant quartz glass + // bottom = Advanced circuit, Certus quartz tank, Advanced alloy + ItemStack isMiningLaserBlock = new ItemStack(miningLaserBlock.blockID, 1, 0); + ItemStack isCertusQuartzTank = new ItemStack(WarpDriveConfig.AEExtra_certusQuartzTank.blockID, 1, 0); + + GameRegistry.addRecipe(new ItemStack(powerLaserBlock), "caa", "czg", "cta", + 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), + 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), + 'z', isMiningLaserBlock, + 't', isCertusQuartzTank, + 'g', vibrantQuartzGlass); } private static void initIC2Recipes() { GameRegistry.addRecipe(new ItemStack(warpCore), "ici", "cmc", "ici", - 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), - 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); - + 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), + 'm', WarpDriveConfig.getIC2Item("advancedMachine"), + 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); + GameRegistry.addRecipe(new ItemStack(protocolBlock), "iic", "imi", "cii", 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.getIC2Item("advancedMachine"), @@ -513,10 +628,10 @@ public class WarpDrive implements LoadingCallback { GameRegistry.addRecipe(new ItemStack(isolationBlock), "iii", "idi", "iii", 'i', WarpDriveConfig.getIC2Item("iridiumPlate"), 'm', WarpDriveConfig.getIC2Item("advancedMachine"), - 'd', Blocks.diamond_block); + 'd', Block.blockDiamond); GameRegistry.addRecipe(new ItemStack(airgenBlock), "lcl", "lml", "lll", - 'l', Blocks.leaves, + 'l', Block.leaves, 'm', WarpDriveConfig.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.getIC2Item("advancedCircuit")); @@ -558,18 +673,42 @@ public class WarpDrive implements LoadingCallback { GameRegistry.addRecipe(new ItemStack(cameraBlock), "cgc", "gmg", "cgc", 'm', WarpDriveConfig.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Blocks.glass); + 'g', Block.glass); GameRegistry.addRecipe(new ItemStack(monitorBlock), "gcg", "gmg", "ggg", 'm', WarpDriveConfig.getIC2Item("advancedMachine"), 'c', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Blocks.glass); + 'g', Block.glass); GameRegistry.addRecipe(new ItemStack(scannerBlock), "sgs", "mma", "amm", 'm', WarpDriveConfig.getIC2Item("advancedMachine"), 'a', WarpDriveConfig.getIC2Item("advancedAlloy"), 's', WarpDriveConfig.getIC2Item("advancedCircuit"), - 'g', Blocks.glass); + 'g', Block.glass); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(laserTreeFarmBlock),false,new Object[] { + "cwc", "wmw", "cwc", + 'c', WarpDriveConfig.getIC2Item("electronicCircuit"), + 'w', "logWood", + 'm', miningLaserBlock })); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(transporterBlock), false, new Object[] { + "ece", "imi", "iei", + 'e', Item.enderPearl, + 'c', WarpDriveConfig.getIC2Item("electronicCircuit"), + 'i', WarpDriveConfig.getIC2Item("plateiron"), + 'm', WarpDriveConfig.getIC2Item("machine") })); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(reactorLaserFocusItem),false,new Object[] { + " p ", "pdp", " p ", + 'p', WarpDriveConfig.getIC2Item("plateiron"), + 'd', "gemDiamond"})); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(reactorMonitorBlock), false, new Object[] { + "pdp", "dmd", "pdp", + 'p', WarpDriveConfig.getIC2Item("plateiron"), + 'd', "gemDiamond", + 'm', WarpDriveConfig.getIC2Item("mfeUnit")})); GameRegistry.addRecipe(new ItemStack(cloakBlock), "imi", "mcm", "imi", 'i', iridiumBlock, @@ -605,10 +744,11 @@ public class WarpDrive implements LoadingCallback { event.registerServerCommand(new SpaceTpCommand()); event.registerServerCommand(new InvisibleCommand()); event.registerServerCommand(new JumpgateCommand()); + event.registerServerCommand(new DebugCommand()); } public Ticket registerChunkLoadTE(WarpChunkTE te, boolean refreshLoading) { - World worldObj = te.getWorldObj(); + World worldObj = te.worldObj; if (ForgeChunkManager.ticketCountAvailableFor(this, worldObj) > 0) { Ticket t = ForgeChunkManager.requestTicket(this, worldObj, Type.NORMAL); @@ -657,7 +797,7 @@ public class WarpDrive implements LoadingCallback { WorldServer ws = DimensionManager.getWorld(w); if(ws != null) { - TileEntity te = ws.getTileEntity(x, y, z); + TileEntity te = ws.getBlockTileEntity(x, y, z); if(te != null && te instanceof WarpChunkTE) { if(((WarpChunkTE)te).shouldChunkLoad()) diff --git a/src/java/cr0s/warpdrive/WarpDriveConfig.java b/src/java/cr0s/warpdrive/WarpDriveConfig.java index 781e7530..80714008 100644 --- a/src/java/cr0s/warpdrive/WarpDriveConfig.java +++ b/src/java/cr0s/warpdrive/WarpDriveConfig.java @@ -1,36 +1,29 @@ -package cr0s.warpdrive; - -import gravisuite.GraviSuite; -import ic2.api.item.IC2Items; +package cr0s.WarpDrive; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; -import java.util.Random; +import java.util.Map; import java.util.Set; +import java.util.Random; -import advsolar.common.AdvancedSolarPanel; -import mffs.Content; -import mffs.ModularForceFieldSystem; +import cpw.mods.fml.common.Loader; +import cr0s.WarpDrive.data.TransitionPlane; +import net.minecraftforge.common.Configuration; +import net.minecraftforge.common.Property; +import net.minecraftforge.oredict.OreDictionary; import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.oredict.OreDictionary; -import cpw.mods.fml.common.Loader; -import cr0s.warpdrive.data.TransitionPlane; -import dan200.computercraft.ComputerCraft; +import ic2.api.item.Items; public class WarpDriveConfig { private static Configuration config; - // Blocks (no longer neccessary, TODO: delete once compiling without) - /* + // Blocks public static int coreID; public static int controllerID; public static int radarID; @@ -49,6 +42,16 @@ public class WarpDriveConfig public static int shipScannerID; public static int cloakCoreID; public static int cloakCoilID; + public static int laserTreeFarmID; + public static int transporterID; + public static int transportBeaconID; + public static int reactorLaserFocusID; + public static int reactorMonitorID; + public static int powerReactorID; + public static int powerLaserID; + public static int powerStoreID; + public static int chunkLoaderID; + public static int decorativeID; // Items public static int componentID; @@ -58,12 +61,12 @@ public class WarpDriveConfig public static int bootsID; public static int airCanisterID; public static int upgradeID; - */ /* * The variables which store whether or not individual mods are loaded */ public static boolean isForgeMultipartLoaded = false; + public static boolean isGregLoaded = false; public static boolean isAppliedEnergisticsLoaded = false; public static boolean isAdvSolPanelLoaded = false; public static boolean isAtomicScienceLoaded = false; @@ -78,37 +81,37 @@ public class WarpDriveConfig public static boolean isThermalExpansionLoaded = false; public static boolean isMetallurgyLoaded = false; public static boolean isAdvancedRepulsionSystemsLoaded = false; + public static boolean isMagicalCropsLoaded = false; // ForgeMultipart (microblocks) support public static Method forgeMultipart_helper_createTileFromNBT = null; public static Method forgeMultipart_helper_sendDescPacket = null; public static Method forgeMultipart_tileMultipart_onChunkLoad = null; - public static ItemStack IC2_Air; - public static ItemStack IC2_Empty; - public static Item IC2_RubberWood; - public static Item IC2_Resin; + public static int[] IC2_Air; + public static int[] IC2_Empty; + public static int IC2_RubberWood; + public static ItemStack IC2_Resin; public static Item IC2_fluidCell; - public static Block CC_Computer, CC_peripheral, CC_Floppy, CCT_Turtle, CCT_Upgraded, CCT_Advanced; - public static Block GT_Ores, GT_Granite, GT_Machine; - public static Item ASP; + public static int CC_Computer = 0, CC_peripheral = 0, CC_Floppy = 0, CCT_Turtle = 0, CCT_Upgraded = 0, CCT_Advanced = 0; + public static int GT_Ores = 0, GT_Granite = 0, GT_Machine = 0; + public static int ASP = 0; public static int AS_Turbine = 0, AS_deuteriumCell = 0; public static int ICBM_Machine = 0, ICBM_Missile = 0, ICBM_Explosive = 0; - public static Item GS_ultimateLappack; - public static Block UB_igneousStone, UB_metamorphicStone, UB_metamorphicCobblestone, UB_sedimentaryStone, UB_igneousCobblestone; + public static int GS_ultimateLappack = 0; + public static int UB_igneousStone = 0, UB_igneousCobblestone = 0, UB_metamorphicStone = 0, UB_metamorphicCobblestone = 0, UB_sedimentaryStone = 0; public static int NetherOres_count; public static int[] NetherOres_block; public static int[][] Metallurgy_overworldOresBlock; public static int[][] Metallurgy_netherOresBlock; public static int[][] Metallurgy_endOresBlock; - public static ArrayList forceFieldBlocks; + public static ArrayList forceFieldBlocks; - public static ArrayList spaceHelmets, jetpacks, minerLogs, minerLeaves; - public static ArrayList minerOres, scannerIgnoreBlocks; + public static Set SpaceHelmets, Jetpacks, MinerOres, MinerLogs, MinerLeaves, scannerIgnoreBlocks; private static Class AEBlocks; private static Class AEMaterials; private static Class AEItems; - public static ArrayList commonWorldGenOres; + public static ArrayList CommonWorldGenOres; public static Item AEExtra_fluidDrive; public static Block AEExtra_certusQuartzTank; @@ -152,6 +155,7 @@ public class WarpDriveConfig public static int WC_WARMUP_RANDOM_TICKS = 60; public static int WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = 10; public static int WC_ISOLATION_UPDATE_INTERVAL_SECONDS = 10; + public static String[] WC_UNLIMITED_PLAYERNAMES = { "notch", "someone" }; // Warp Radar public static int WR_MAX_ENERGY_VALUE = 100000000; // 100kk eU @@ -225,7 +229,26 @@ public class WarpDriveConfig // Air generator public static int AG_RF_PER_CANISTER = 20; - + + // Reactor monitor + public static int RM_MAX_ENERGY = 1000000; + public static double RM_EU_PER_HEAT = 2; + + // Transporter + public static int TR_MAX_ENERGY = 1000000; + public static boolean TR_RELATIVE_COORDS = true; + public static double TR_EU_PER_METRE = 100; + // public static double TR_MAX_SCAN_RANGE = 4; FIXME: not used ?!? + public static double TR_MAX_BOOST_MUL = 4; + + // Power reactor + public static int PR_MAX_ENERGY = 100000000; + public static int PR_TICK_TIME = 5; + public static int PR_MAX_LASERS = 6; + + // Power store + public static int PS_MAX_ENERGY = 1000000; + // Laser Lift public static int LL_MAX_ENERGY = 2400; public static int LL_LIFT_ENERGY = 800; @@ -237,7 +260,7 @@ public class WarpDriveConfig public static int CL_RF_PER_CHUNKTICK = 320; public static ItemStack getIC2Item(String id) { - return IC2Items.getItem(id); + return Items.getItem(id); } public static ItemStack getAEBlock(String id) { @@ -332,6 +355,7 @@ public class WarpDriveConfig WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "cores_registry_update_interval", WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS, "(measured in seconds)").getInt(); WC_ISOLATION_UPDATE_INTERVAL_SECONDS = config.get("WarpCore", "isolation_update_interval", WC_ISOLATION_UPDATE_INTERVAL_SECONDS, "(measured in seconds)").getInt(); + WC_UNLIMITED_PLAYERNAMES = config.get("WarpCore", "unlimited_playernames", WC_UNLIMITED_PLAYERNAMES, "List of player names which gives unlimited block counts to their ship").getStringList(); // Warp Radar WR_MAX_ENERGY_VALUE = config.get("WarpRadar", "max_energy_value", WR_MAX_ENERGY_VALUE).getInt(); @@ -405,6 +429,24 @@ public class WarpDriveConfig // Air generator AG_RF_PER_CANISTER = config.get("Air Generator", "energy_per_canister", AG_RF_PER_CANISTER).getInt(); + // Reactor monitor + RM_MAX_ENERGY = config.get("Reactor Monitor", "max_rm_energy", RM_MAX_ENERGY).getInt(); + RM_EU_PER_HEAT = config.get("Reactor Monitor", "eu_per_heat", RM_EU_PER_HEAT).getDouble(2); + + // Transporter + TR_MAX_ENERGY = config.get("Transporter", "max_energy", TR_MAX_ENERGY).getInt(); + TR_RELATIVE_COORDS = config.get("Transporter", "relative_coords", TR_RELATIVE_COORDS).getBoolean(true); + TR_EU_PER_METRE = config.get("Transporter", "eu_per_ent_per_metre", TR_EU_PER_METRE).getDouble(100); + TR_MAX_BOOST_MUL = config.get("Transporter", "max_boost", TR_MAX_BOOST_MUL).getInt(); + + // Power reactor + PR_MAX_ENERGY = config.get("Reactor", "max_energy", PR_MAX_ENERGY).getInt(); + PR_TICK_TIME = config.get("Reactor", "ticks_per_update", PR_TICK_TIME).getInt(); + PR_MAX_LASERS = config.get("Reactor", "max_lasers", PR_MAX_LASERS).getInt(); + + // Power store + PS_MAX_ENERGY = config.get("PowerStore", "max_energy", PS_MAX_ENERGY).getInt(); + // Laser lift LL_MAX_ENERGY = config.get("LaserLift", "max_energy", LL_MAX_ENERGY).getInt(); LL_LIFT_ENERGY = config.get("LaserLift", "lift_energy", LL_LIFT_ENERGY, "Energy consummed per entity moved").getInt(); @@ -412,24 +454,24 @@ public class WarpDriveConfig } public static void load() { - commonWorldGenOres = new ArrayList(); - commonWorldGenOres.add(Blocks.iron_ore); - commonWorldGenOres.add(Blocks.gold_ore); - commonWorldGenOres.add(Blocks.coal_ore); - commonWorldGenOres.add(Blocks.emerald_ore); - commonWorldGenOres.add(Blocks.lapis_ore); - commonWorldGenOres.add(Blocks.redstone_ore); + CommonWorldGenOres = new ArrayList(30); + CommonWorldGenOres.add(new int[] {Block.oreIron.blockID, 0}); + CommonWorldGenOres.add(new int[] {Block.oreGold.blockID, 0}); + CommonWorldGenOres.add(new int[] {Block.oreCoal.blockID, 0}); + CommonWorldGenOres.add(new int[] {Block.oreEmerald.blockID, 0}); + CommonWorldGenOres.add(new int[] {Block.oreLapis.blockID, 0}); + CommonWorldGenOres.add(new int[] {Block.oreRedstoneGlowing.blockID, 0}); + CommonWorldGenOres.add(new int[] {Block.oreRedstone.blockID, 0}); - forceFieldBlocks = new ArrayList(); + forceFieldBlocks = new ArrayList(); - spaceHelmets = new ArrayList(); - jetpacks = new ArrayList(); - minerOres = new ArrayList(); - minerLogs = new ArrayList(); - minerLeaves = new ArrayList(); - scannerIgnoreBlocks = new ArrayList(); + SpaceHelmets = new HashSet(); + Jetpacks = new HashSet(); + MinerOres = new HashSet(); + MinerLogs = new HashSet(); + MinerLeaves = new HashSet(); + scannerIgnoreBlocks = new HashSet(); config.load(); - /* Unnneccessary, delete at some point coreID = config.getBlock("core", 500).getInt(); controllerID = config.getBlock("controller", 501).getInt(); radarID = config.getBlock("radar", 502).getInt(); @@ -448,7 +490,17 @@ public class WarpDriveConfig shipScannerID = config.getBlock("shipscanner", 516).getInt(); cloakCoreID = config.getBlock("cloakcore", 517).getInt(); cloakCoilID = config.getBlock("cloakcoil", 518).getInt(); + laserTreeFarmID = config.getBlock("lasertreefarm", 519).getInt(); + transporterID = config.getBlock("transporter", 520).getInt(); + transportBeaconID = config.getBlock("transportBeacon", 521).getInt(); + reactorMonitorID = config.getBlock("reactorMonitor", 522).getInt(); + powerLaserID = config.getBlock("powerLaser", 523).getInt(); + powerReactorID = config.getBlock("powerReactor", 524).getInt(); + powerStoreID = config.getBlock("powerStore", 525).getInt(); + chunkLoaderID = config.getBlock("chunkLoader", 526).getInt(); + decorativeID = config.getBlock("decorative",527).getInt(); + reactorLaserFocusID = config.getItem("reactorLaserFocus", 8700).getInt(); componentID = config.getItem("component", 8701).getInt(); helmetID = config.getItem("helmet", 8702).getInt(); chestID = config.getItem("chest", 8703).getInt(); @@ -456,7 +508,6 @@ public class WarpDriveConfig bootsID = config.getItem("boots", 8705).getInt(); airCanisterID = config.getItem("airCanisterFull", 8706).getInt(); upgradeID = config.getItem("upgrade", 8707).getInt(); - */ isForgeMultipartLoaded = Loader.isModLoaded("ForgeMultipart"); if (isForgeMultipartLoaded) { @@ -471,6 +522,10 @@ public class WarpDriveConfig if (isCCLoaded) loadCC(); + isGregLoaded = Loader.isModLoaded("gregtech_addon"); + if (isGregLoaded) + loadGT(); + isAppliedEnergisticsLoaded = Loader.isModLoaded("AppliedEnergistics"); if (isAppliedEnergisticsLoaded) loadAppliedEnergistics(); @@ -520,43 +575,42 @@ public class WarpDriveConfig if (isAdvancedRepulsionSystemsLoaded) { loadAdvancedRepulsionSystems(); } - - minerOres.add(WarpDrive.iridiumBlock); - minerOres.add(Blocks.coal_ore); - minerOres.add(Blocks.quartz_ore); - minerOres.add(Blocks.obsidian); - minerOres.add(Blocks.web); - minerOres.add(Blocks.fence); - minerOres.add(Blocks.torch); - minerOres.add(Blocks.glowstone); - minerOres.add(Blocks.redstone_block); + + isMagicalCropsLoaded = Loader.isModLoaded("MagicalCrops"); +// + MinerOres.add(iridiumBlockID); + MinerOres.add(Block.oreCoal.blockID); + MinerOres.add(Block.oreNetherQuartz.blockID); + MinerOres.add(Block.obsidian.blockID); + MinerOres.add(Block.web.blockID); + MinerOres.add(Block.fence.blockID); + MinerOres.add(Block.torchWood.blockID); + MinerOres.add(Block.glowStone.blockID); + MinerOres.add(Block.blockRedstone.blockID); // Ignore WarpDrive blocks (which potentially will be duplicated by cheaters using ship scan/deploy) - scannerIgnoreBlocks.add(WarpDrive.warpCore); - scannerIgnoreBlocks.add(WarpDrive.protocolBlock); - scannerIgnoreBlocks.add(WarpDrive.iridiumBlock); + scannerIgnoreBlocks.add(coreID); + scannerIgnoreBlocks.add(controllerID); + scannerIgnoreBlocks.add(iridiumBlockID); if (isICLoaded) { - scannerIgnoreBlocks.add(Block.getBlockFromItem(IC2Items.getItem("mfsUnit").getItem())); - scannerIgnoreBlocks.add(Block.getBlockFromItem(IC2Items.getItem("mfeUnit").getItem())); - scannerIgnoreBlocks.add(Block.getBlockFromItem(IC2Items.getItem("cesuUnit").getItem())); - scannerIgnoreBlocks.add(Block.getBlockFromItem(IC2Items.getItem("batBox").getItem())); + scannerIgnoreBlocks.add(Items.getItem("mfsUnit").itemID); + scannerIgnoreBlocks.add(Items.getItem("mfeUnit").itemID); + scannerIgnoreBlocks.add(Items.getItem("cesuUnit").itemID); + scannerIgnoreBlocks.add(Items.getItem("batBox").itemID); } if (isICBMLoaded) { - //TODO: What is this for? - //scannerIgnoreBlocks.add(ICBM_Explosive); + scannerIgnoreBlocks.add(ICBM_Explosive); } if (isCCLoaded) { - //TODO: Fix - - //scannerIgnoreBlocks.add(CC_Computer); - //scannerIgnoreBlocks.add(CCT_Turtle); - //scannerIgnoreBlocks.add(CCT_Upgraded); - //scannerIgnoreBlocks.add(CCT_Advanced); + scannerIgnoreBlocks.add(CC_Computer); + scannerIgnoreBlocks.add(CCT_Turtle); + scannerIgnoreBlocks.add(CCT_Upgraded); + scannerIgnoreBlocks.add(CCT_Advanced); } // Do not deploy ores and valuables - for (Block t : commonWorldGenOres) {// each element of this set is pair [id, meta] - scannerIgnoreBlocks.add(t); // we adding ID only + for (int[] t : CommonWorldGenOres) {// each element of this set is pair [id, meta] + scannerIgnoreBlocks.add(t[0]); // we adding ID only } loadWarpDriveConfig(); @@ -564,32 +618,32 @@ public class WarpDriveConfig } public static void postInit() { - loadOreDict(); + LoadOreDict(); } - private static void loadOreDict() { + private static void LoadOreDict() { String[] oreNames = OreDictionary.getOreNames(); for(String oreName: oreNames) { String lowerOreName = oreName.toLowerCase(); if (oreName.substring(0,3).equals("ore")) { ArrayList item = OreDictionary.getOres(oreName); for(ItemStack i: item) { - minerOres.add(Block.getBlockFromItem(i.getItem())); - WarpDrive.debugPrint("Added ore: "+ i.getItem().getUnlocalizedName()); + MinerOres.add(i.itemID); + WarpDrive.debugPrint("WD: Added ore ID: "+i.itemID); } } if (lowerOreName.contains("log")) { ArrayList item = OreDictionary.getOres(oreName); for(ItemStack i: item) { - minerLogs.add(i.getItem()); - WarpDrive.debugPrint("Added log: "+i.getDisplayName()); + MinerLogs.add(i.itemID); + WarpDrive.debugPrint("WD: Added log ID: "+i.itemID); } } if (lowerOreName.contains("leave") || lowerOreName.contains("leaf")) { ArrayList item = OreDictionary.getOres(oreName); for(ItemStack i: item) { - minerLeaves.add(i.getItem()); - WarpDrive.debugPrint("Added leaf: "+i.getDisplayName()); + MinerLeaves.add(i.itemID); + WarpDrive.debugPrint("WD: Added leaf ID: "+i.itemID); } } } @@ -611,42 +665,42 @@ public class WarpDriveConfig private static void loadIC2() { - ASP = IC2Items.getItem("solarPanel").getItem(); - spaceHelmets.add(IC2Items.getItem("hazmatHelmet").getItem()); - spaceHelmets.add(IC2Items.getItem("quantumHelmet").getItem()); - jetpacks.add(IC2Items.getItem("jetpack").getItem()); - jetpacks.add(IC2Items.getItem("electricJetpack").getItem()); - IC2_Air = IC2Items.getItem("airCell"); - IC2_Empty = IC2Items.getItem("cell"); - ItemStack rubberWood = IC2Items.getItem("rubberWood"); - IC2_Resin = IC2Items.getItem("resin").getItem(); + ASP = Items.getItem("solarPanel").itemID; + SpaceHelmets.add(Items.getItem("hazmatHelmet").itemID); + SpaceHelmets.add(Items.getItem("quantumHelmet").itemID); + Jetpacks.add(Items.getItem("jetpack").itemID); + Jetpacks.add(Items.getItem("electricJetpack").itemID); + IC2_Air = new int[] {Items.getItem("airCell").itemID, Items.getItem("airCell").getItemDamage()}; + IC2_Empty = new int[] {Items.getItem("cell").itemID, Items.getItem("cell").getItemDamage()}; + ItemStack rubberWood = Items.getItem("rubberWood"); + IC2_Resin = Items.getItem("resin"); if(rubberWood != null) { - IC2_RubberWood = rubberWood.getItem(); + IC2_RubberWood = rubberWood.itemID; } - ItemStack ore = IC2Items.getItem("uraniumOre"); - if (ore != null) commonWorldGenOres.add(Block.getBlockFromItem(ore.getItem())); - ore = IC2Items.getItem("copperOre"); - if (ore != null) commonWorldGenOres.add(Block.getBlockFromItem(ore.getItem())); - ore = IC2Items.getItem("tinOre"); - if (ore != null) commonWorldGenOres.add(Block.getBlockFromItem(ore.getItem())); - ore = IC2Items.getItem("leadOre"); - if (ore != null) commonWorldGenOres.add(Block.getBlockFromItem(ore.getItem())); + ItemStack ore = Items.getItem("uraniumOre"); + if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); + ore = Items.getItem("copperOre"); + if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); + ore = Items.getItem("tinOre"); + if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); + ore = Items.getItem("leadOre"); + if (ore != null) CommonWorldGenOres.add(new int[] {ore.itemID, ore.getItemDamage()}); - minerOres.add(Block.getBlockFromItem(IC2Items.getItem("rubberWood").getItem())); - IC2_fluidCell = IC2Items.getItem("FluidCell").getItem(); + MinerOres.add(Items.getItem("rubberWood").itemID); + IC2_fluidCell = Items.getItem("FluidCell").getItem(); } private static void loadCC() { try { - - CC_Computer = ComputerCraft.Blocks.computer; - CC_peripheral = ComputerCraft.Blocks.peripheral; - //CC_Floppy = ComputerCraft.Blocks.floppy; //TODO: Does not exist anymore. Check if replacement relevant - CCT_Turtle = ComputerCraft.Blocks.turtle; - CCT_Upgraded = ComputerCraft.Blocks.turtleExpanded; - CCT_Advanced = ComputerCraft.Blocks.turtleAdvanced; + Class z = Class.forName("dan200.computercraft.ComputerCraft"); + CC_Computer = z.getField("computerBlockID").getInt(null); + CC_peripheral = z.getField("peripheralBlockID").getInt(null); + CC_Floppy = z.getField("diskItemID").getInt(null); + CCT_Turtle = z.getField("turtleBlockID").getInt(null); + CCT_Upgraded = z.getField("turtleUpgradedBlockID").getInt(null); + CCT_Advanced = z.getField("turtleAdvancedBlockID").getInt(null); } catch (Exception e) { @@ -654,7 +708,27 @@ public class WarpDriveConfig e.printStackTrace(); } } - + + private static void loadGT() + { + try + { + Class z = Class.forName("gregtechmod.GT_Mod"); + int[] t = (int[])z.getField("sBlockIDs").get(null); + GT_Machine = t[1]; + GT_Ores = t[2]; // meta 1-15 = ores + GT_Granite = t[5]; // 0 - black, 1 - black cobble, 8 - red, 9 - red cobble + MinerOres.add(GT_Ores); + //MinerOres.add(GT_Granite); + } + catch (Exception e) + { + WarpDrive.debugPrint("WarpDriveConfig Error loading GT classes"); + e.printStackTrace(); + isGregLoaded = false; + } + } + private static void loadAppliedEnergistics() { try @@ -662,7 +736,7 @@ public class WarpDriveConfig AEBlocks = Class.forName("appeng.api.Blocks"); AEMaterials = Class.forName("appeng.api.Materials"); AEItems = Class.forName("appeng.api.Items"); - minerOres.add(Block.getBlockFromItem(((ItemStack)AEBlocks.getField("blkQuartzOre").get(null)).getItem())); + MinerOres.add(((ItemStack)AEBlocks.getField("blkQuartzOre").get(null)).itemID); } catch (Exception e) { @@ -695,10 +769,11 @@ public class WarpDriveConfig { try { - - spaceHelmets.add(AdvancedSolarPanel.advancedSolarHelmet); - spaceHelmets.add(AdvancedSolarPanel.hybridSolarHelmet); - spaceHelmets.add(AdvancedSolarPanel.ultimateSolarHelmet); + Class z = Class.forName("advsolar.common.AdvancedSolarPanel"); + ASP = z.getField("idAdv").getInt(null); + SpaceHelmets.add(((Item)z.getField("advancedSolarHelmet").get(null)).itemID); + SpaceHelmets.add(((Item)z.getField("hybridSolarHelmet").get(null)).itemID); + SpaceHelmets.add(((Item)z.getField("ultimateSolarHelmet").get(null)).itemID); } catch (Exception e) { @@ -709,25 +784,21 @@ public class WarpDriveConfig } private static void loadAtomicScience() { - //No 1.7.10 version - /* try { Class z = Class.forName("resonantinduction.atomic.Atomic"); - commonWorldGenOres.add(new int[] {((Block)z.getField("blockUraniumOre").get(null)).blockID, 0}); + CommonWorldGenOres.add(new int[] {((Block)z.getField("blockUraniumOre").get(null)).blockID, 0}); AS_Turbine = ((Block)z.getField("blockElectricTurbine").get(null)).blockID; AS_deuteriumCell = ((Item)z.getField("itemDeuteriumCell").get(null)).itemID; } catch (Exception e) { WarpDrive.debugPrint("WarpDriveConfig Error loading AS classes"); isAtomicScienceLoaded = false; - }*/ + } } private static void loadICBM() { - //No 1.7 yet, second project - /* try { Class z = Class.forName("icbm.core.ICBMCore"); - commonWorldGenOres.add(new int[] {((Block)z.getField("blockSulfurOre").get(null)).blockID, 0}); + CommonWorldGenOres.add(new int[] {((Block)z.getField("blockSulfurOre").get(null)).blockID, 0}); z = Class.forName("icbm.explosion.ICBMExplosion"); ICBM_Machine = ((Block)z.getField("blockMachine").get(null)).blockID; ICBM_Missile = ((Item)z.getField("itemMissile").get(null)).itemID; @@ -736,12 +807,14 @@ public class WarpDriveConfig WarpDrive.debugPrint("WarpDriveConfig Error loading ICBM classes"); e.printStackTrace(); isICBMLoaded = false; - }*/ + } } private static void loadMFFS() { try { - forceFieldBlocks.add(Content.forceField()); + Class z = Class.forName("mffs.ModularForceFieldSystem"); + int blockId = ((Block)z.getField("blockForceField").get(null)).blockID; + forceFieldBlocks.add(blockId); } catch (Exception e) { WarpDrive.debugPrint("WarpDriveConfig Error loading MFFS classes"); e.printStackTrace(); @@ -751,10 +824,12 @@ public class WarpDriveConfig private static void loadGraviSuite() { try { - spaceHelmets.add(GraviSuite.ultimateSolarHelmet); - jetpacks.add(GraviSuite.advJetpack); - jetpacks.add(GraviSuite.graviChestPlate); - GS_ultimateLappack = GraviSuite.ultimateLappack; + Class z = Class.forName("gravisuite.GraviSuite"); + if (z.getField("ultimateSolarHelmet").get(null) != null) + SpaceHelmets.add(((Item)z.getField("ultimateSolarHelmet").get(null)).itemID); + Jetpacks.add(z.getField("advJetpackID").getInt(null) + 256); + Jetpacks.add(z.getField("graviChestPlateID").getInt(null) + 256); + GS_ultimateLappack = z.getField("ultimateLappackID").getInt(null) + 256; } catch (Exception e) { WarpDrive.debugPrint("WarpDriveConfig Error loading GS classes"); e.printStackTrace(); @@ -763,8 +838,6 @@ public class WarpDriveConfig } private static void loadUndergroundBiomes() { - //TODO: Re-add if desired. My patience has run out for mod compatibility. - /* try { Class z = Class.forName("exterminatorJeff.undergroundBiomes.common.UndergroundBiomes"); UB_igneousStone = ((Block)z.getField("igneousStone").get(null)).blockID; @@ -778,7 +851,6 @@ public class WarpDriveConfig e.printStackTrace(); isUndergroundBiomesLoaded = false; } - */ } private static void loadNetherOres() { @@ -831,10 +903,10 @@ public class WarpDriveConfig } private static void loadAdvancedRepulsionSystems() { - //TODO: Cant find block object - try { - //forceFieldBlocks.add(BlockForceField); + Class z = Class.forName("mods.immibis.ars.ARSMod"); + int fieldBlockId = ((Block)z.getField("MFFSFieldblock").get(null)).blockID; + forceFieldBlocks.add(fieldBlockId); } catch (Exception e) { WarpDrive.print("WarpDriveConfig Error loading AdvancedRepulsionSystems classes"); e.printStackTrace(); @@ -842,86 +914,173 @@ public class WarpDriveConfig } } - public static Block getDefaultSurfaceBlock(Random random, boolean corrupted, boolean isMoon) { + public static int[] getDefaultSurfaceBlock(Random random, boolean corrupted, boolean isMoon) { if (isMoon) { - if (random.nextInt(5) == 1) { - return Blocks.netherrack; + if (isGregLoaded && (random.nextInt(100) == 1)) { + if (random.nextBoolean()) { + return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; + } else { + return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; + } + } else if (random.nextInt(5) == 1) { + return new int[] {Block.netherrack.blockID, 0}; } else if (random.nextInt(15) == 1) { - return Blocks.end_stone; + return new int[] {Block.whiteStone.blockID, 0}; } } else { - if (random.nextInt(6) == 1) { - return Blocks.netherrack; + if (isGregLoaded && (random.nextInt(25) == 1)) { + if (random.nextBoolean()) { + return new int[] {GT_Granite, (corrupted && random.nextBoolean())?1:0}; + } else { + return new int[] {GT_Granite, (corrupted && random.nextBoolean())?9:8}; + } + } else if (random.nextInt(6) == 1) { + return new int[] {Block.netherrack.blockID, 0}; } else if (random.nextInt(50) == 1) { - return Blocks.end_stone; + return new int[] {Block.whiteStone.blockID, 0}; } } if (corrupted && random.nextBoolean()) { if (isUndergroundBiomesLoaded) { int rnd = random.nextInt(8 + 8 + 2); if (rnd < 8) { - return UB_igneousCobblestone; + return new int[] {UB_igneousCobblestone, rnd}; } else if (rnd < (8 + 8)) { - return UB_metamorphicCobblestone; + return new int[] {UB_metamorphicCobblestone, rnd - 8}; } } - return Blocks.cobblestone; + return new int[] {Block.cobblestone.blockID, 0}; } if (isUndergroundBiomesLoaded) { int rnd = random.nextInt(8 + 8 + 8 + 3); if (rnd < 8) { - return UB_igneousCobblestone; + return new int[] {UB_igneousStone, rnd}; } else if (rnd < (8 + 8)) { - return UB_metamorphicStone; + return new int[] {UB_metamorphicStone, rnd - 8}; } else if (rnd < (8 + 8 + 8)) { - return UB_sedimentaryStone; + if (rnd == 8 + 8 + 8) { + return new int[] {205, 0}; // emasher Limestone + } else { + return new int[] {UB_sedimentaryStone, rnd - 8 - 8}; + } } } - return Blocks.stone; + return new int[] {Block.stone.blockID, 0}; } - public static Block getRandomSurfaceBlock(Random random, Block block, int blockMeta, boolean bedrock) { + public static int[] getRandomSurfaceBlock(Random random, int blockID, int blockMeta, boolean bedrock) { if (bedrock && (random.nextInt(1000) == 1)) { - return Blocks.bedrock; - } else if (Blocks.end_stone.isAssociatedBlock(block)) { - return getRandomEndBlock(random, block, blockMeta); - } else if (Blocks.netherrack.isAssociatedBlock(block)) { - return getRandomNetherBlock(random, block, blockMeta); + return new int[] {Block.bedrock.blockID, 0}; + } else if (blockID == GT_Granite) { + if ((blockMeta == 0) || (blockMeta == 1)) { + int[] t; + t = getRandomOverworldBlock(random, blockID, blockMeta); + if (t[0] == blockID) + t = getRandomOverworldBlock(random, blockID, blockMeta); + if (t[0] == blockID) + t = getRandomEndBlock(random, blockID, blockMeta); + return t; + } else if ((blockMeta == 8) || (blockMeta == 9)) { + int[] t; + t = getRandomOverworldBlock(random, blockID, blockMeta); + if (t[0] == blockID) + t = getRandomEndBlock(random, blockID, blockMeta); + if (t[0] == blockID) + t = getRandomOverworldBlock(random, blockID, blockMeta); + return t; + } + } else if (blockID == Block.whiteStone.blockID) { + return getRandomEndBlock(random, blockID, blockMeta); + } else if (blockID == Block.netherrack.blockID) { + return getRandomNetherBlock(random, blockID, blockMeta); } - return getRandomOverworldBlock(random, block, blockMeta); + return getRandomOverworldBlock(random, blockID, blockMeta); } - public static Block getRandomOverworldBlock(Random random, Block block, int blockMeta) + public static int[] getRandomOverworldBlock(Random random, int blockID, int blockMeta) { if (random.nextInt(25) == 5) { - return commonWorldGenOres.get(random.nextInt(commonWorldGenOres.size())); + return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); + } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { + return Metallurgy_overworldOresBlock[random.nextInt(Metallurgy_overworldOresBlock.length)]; } else if (isAppliedEnergisticsLoaded && random.nextInt(750) == 1) { - return Block.getBlockFromItem(getAEBlock("blkQuartzOre").getItem()); + return new int[] {getAEBlock("blkQuartzOre").itemID, getAEBlock("blkQuartzOre").getItemDamage()}; } else if (random.nextInt(250) == 1) { - return Blocks.diamond_ore; + return new int[] {Block.oreDiamond.blockID, 0}; + } else if (!isNetherOresLoaded && (random.nextInt(10000) == 42)) { + return new int[] {iridiumBlockID, 0}; + } else if (!isMagicalCropsLoaded && (random.nextInt(100) == 56)) { + return new int[] {3108, 0}; // Essence ore + } else if (isGregLoaded) { + if (random.nextInt(50) == 1) + return new int[] {GT_Ores, 5}; //Bauxite S /* Stone/Iron/Diamod pick | +S = Silktouch recommended */ + else if (random.nextInt(50) == 1) + return new int[] {GT_Ores, 1}; //Galena S + else if (random.nextInt(100) == 1) + return new int[] {GT_Ores, 8}; //Sphalerite S+S + else if (random.nextInt(250) == 1) + return new int[] {GT_Ores, 13}; //Tetrahedrite I + else if (random.nextInt(250) == 1) + return new int[] {GT_Ores, 14}; //Cassiterite I + else if (random.nextInt(250) == 1) + return new int[] {GT_Ores, 15}; //Nickel I + else if (random.nextInt(500) == 1) + return new int[] {GT_Ores, 3}; //Ruby I+S + else if (random.nextInt(500) == 1) + return new int[] {GT_Ores, 4}; //Sapphire I+S + else if (random.nextInt(2000) == 1) + return new int[] {GT_Ores, 2}; //Iridium D+S } - return block; + return new int[] {blockID, blockMeta}; } - public static Block getRandomNetherBlock(Random random, Block block, int blockMeta) { + public static int[] getRandomNetherBlock(Random random, int blockID, int blockMeta) { if (isICLoaded && (!isNetherOresLoaded) && (random.nextInt(10000) == 42)) { - return WarpDrive.iridiumBlock; + return new int[] {iridiumBlockID, 0}; + } else if (isNetherOresLoaded && (random.nextInt(25) == 1)) { + int rnd = random.nextInt(NetherOres_count); + return new int[] {NetherOres_block[rnd / 16], rnd % 16}; + } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { + return Metallurgy_netherOresBlock[random.nextInt(Metallurgy_netherOresBlock.length)]; } else if (random.nextInt(25) == 1) { - return Blocks.quartz_ore; + return new int[] {Block.oreNetherQuartz.blockID, 0}; + } else if (!isMagicalCropsLoaded && (random.nextInt(100) == 56)) { + return new int[] {3109, 0}; // Nether essence ore + } else if (isGregLoaded) { + if (random.nextInt(100) == 1) + return new int[] {GT_Ores, 6}; //Pyrite S+S + else if (random.nextInt(100) == 1) + return new int[] {GT_Ores, 8}; //Sphalerite S+S + else if (random.nextInt(500) == 1) + return new int[] {GT_Ores, 7}; //Cinnabar I+S } else if ((!isNetherOresLoaded) && (random.nextInt(100) == 13)) - return commonWorldGenOres.get(random.nextInt(commonWorldGenOres.size())); - return block; + return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); + return new int[] {blockID, blockMeta}; } - public static Block getRandomEndBlock(Random random, Block block, int blockMeta) + public static int[] getRandomEndBlock(Random random, int blockID, int blockMeta) { if (isICLoaded && random.nextInt(10000) == 42) { - return WarpDrive.iridiumBlock; + return new int[] { iridiumBlockID, 0 }; + } else if (isGregLoaded) { + if (random.nextInt(250) == 1) + return new int[] {GT_Ores, 9}; //Tungstate I + else if (random.nextInt(500) == 1) + return new int[] {GT_Ores, 12}; //Sodalite I+S + else if (random.nextInt(500) == 1) + return new int[] {GT_Ores, 10}; //Cooperite=Sheldonite D + else if (random.nextInt(1000) == 1) + return new int[] {GT_Ores, 11}; //Olivine D+S + } else if (isMetallurgyLoaded && (random.nextInt(25) == 1)) { + return Metallurgy_endOresBlock[random.nextInt(Metallurgy_endOresBlock.length)]; } else if (random.nextInt(200) == 13) { - return commonWorldGenOres.get(random.nextInt(commonWorldGenOres.size())); + return CommonWorldGenOres.get(random.nextInt(CommonWorldGenOres.size())); } - return block; + return new int[] {blockID, blockMeta}; } - + + public static boolean isAirBlock(World worldObj, int id, int x, int y, int z) { + return id == 0 || Block.blocksList[id] == null || Block.blocksList[id].isAirBlock(worldObj, x, y, z); + } } diff --git a/src/cr0s/WarpDrive/block/BlockDecorative.java b/src/java/cr0s/warpdrive/block/BlockDecorative.java similarity index 100% rename from src/cr0s/WarpDrive/block/BlockDecorative.java rename to src/java/cr0s/warpdrive/block/BlockDecorative.java diff --git a/src/cr0s/WarpDrive/block/BlockTransportBeacon.java b/src/java/cr0s/warpdrive/block/BlockTransportBeacon.java similarity index 100% rename from src/cr0s/WarpDrive/block/BlockTransportBeacon.java rename to src/java/cr0s/warpdrive/block/BlockTransportBeacon.java diff --git a/src/cr0s/WarpDrive/block/ItemBlockDecorative.java b/src/java/cr0s/warpdrive/block/ItemBlockDecorative.java similarity index 100% rename from src/cr0s/WarpDrive/block/ItemBlockDecorative.java rename to src/java/cr0s/warpdrive/block/ItemBlockDecorative.java diff --git a/src/cr0s/WarpDrive/command/DebugCommand.java b/src/java/cr0s/warpdrive/command/DebugCommand.java similarity index 100% rename from src/cr0s/WarpDrive/command/DebugCommand.java rename to src/java/cr0s/warpdrive/command/DebugCommand.java diff --git a/src/cr0s/WarpDrive/item/ItemWarpUpgrade.java b/src/java/cr0s/warpdrive/item/ItemWarpUpgrade.java similarity index 100% rename from src/cr0s/WarpDrive/item/ItemWarpUpgrade.java rename to src/java/cr0s/warpdrive/item/ItemWarpUpgrade.java diff --git a/src/cr0s/WarpDrive/machines/BlockChunkLoader.java b/src/java/cr0s/warpdrive/machines/BlockChunkLoader.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockChunkLoader.java rename to src/java/cr0s/warpdrive/machines/BlockChunkLoader.java diff --git a/src/cr0s/WarpDrive/machines/BlockLaserReactorMonitor.java b/src/java/cr0s/warpdrive/machines/BlockLaserReactorMonitor.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockLaserReactorMonitor.java rename to src/java/cr0s/warpdrive/machines/BlockLaserReactorMonitor.java diff --git a/src/cr0s/WarpDrive/machines/BlockLaserTreeFarm.java b/src/java/cr0s/warpdrive/machines/BlockLaserTreeFarm.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockLaserTreeFarm.java rename to src/java/cr0s/warpdrive/machines/BlockLaserTreeFarm.java diff --git a/src/cr0s/WarpDrive/machines/BlockPowerLaser.java b/src/java/cr0s/warpdrive/machines/BlockPowerLaser.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockPowerLaser.java rename to src/java/cr0s/warpdrive/machines/BlockPowerLaser.java diff --git a/src/cr0s/WarpDrive/machines/BlockPowerReactor.java b/src/java/cr0s/warpdrive/machines/BlockPowerReactor.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockPowerReactor.java rename to src/java/cr0s/warpdrive/machines/BlockPowerReactor.java diff --git a/src/cr0s/WarpDrive/machines/BlockPowerStore.java b/src/java/cr0s/warpdrive/machines/BlockPowerStore.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockPowerStore.java rename to src/java/cr0s/warpdrive/machines/BlockPowerStore.java diff --git a/src/cr0s/WarpDrive/machines/BlockTransporter.java b/src/java/cr0s/warpdrive/machines/BlockTransporter.java similarity index 100% rename from src/cr0s/WarpDrive/machines/BlockTransporter.java rename to src/java/cr0s/warpdrive/machines/BlockTransporter.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityAbstractLaser.java b/src/java/cr0s/warpdrive/machines/TileEntityAbstractLaser.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityAbstractLaser.java rename to src/java/cr0s/warpdrive/machines/TileEntityAbstractLaser.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityAbstractMiner.java b/src/java/cr0s/warpdrive/machines/TileEntityAbstractMiner.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityAbstractMiner.java rename to src/java/cr0s/warpdrive/machines/TileEntityAbstractMiner.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityChunkLoader.java b/src/java/cr0s/warpdrive/machines/TileEntityChunkLoader.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityChunkLoader.java rename to src/java/cr0s/warpdrive/machines/TileEntityChunkLoader.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityLaserReactorMonitor.java b/src/java/cr0s/warpdrive/machines/TileEntityLaserReactorMonitor.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityLaserReactorMonitor.java rename to src/java/cr0s/warpdrive/machines/TileEntityLaserReactorMonitor.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityLaserTreeFarm.java b/src/java/cr0s/warpdrive/machines/TileEntityLaserTreeFarm.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityLaserTreeFarm.java rename to src/java/cr0s/warpdrive/machines/TileEntityLaserTreeFarm.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java b/src/java/cr0s/warpdrive/machines/TileEntityPowerLaser.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java rename to src/java/cr0s/warpdrive/machines/TileEntityPowerLaser.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java b/src/java/cr0s/warpdrive/machines/TileEntityPowerReactor.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java rename to src/java/cr0s/warpdrive/machines/TileEntityPowerReactor.java diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerStore.java b/src/java/cr0s/warpdrive/machines/TileEntityPowerStore.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityPowerStore.java rename to src/java/cr0s/warpdrive/machines/TileEntityPowerStore.java diff --git a/src/java/cr0s/warpdrive/machines/TileEntityReactor.java b/src/java/cr0s/warpdrive/machines/TileEntityReactor.java index 39b14a9b..464bdf3c 100644 --- a/src/java/cr0s/warpdrive/machines/TileEntityReactor.java +++ b/src/java/cr0s/warpdrive/machines/TileEntityReactor.java @@ -1,4 +1,4 @@ -package cr0s.warpdrive.machines; +package cr0s.WarpDrive.machines; import java.util.List; @@ -6,7 +6,6 @@ import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; @@ -15,1090 +14,1108 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityChest; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.common.ForgeDirection; import cpw.mods.fml.common.FMLCommonHandler; -import cr0s.warpdrive.EntityJump; -import cr0s.warpdrive.WarpDrive; -import cr0s.warpdrive.WarpDriveConfig; -import cr0s.warpdrive.data.Jumpgate; -import cr0s.warpdrive.world.SpaceTeleporter; +import cr0s.WarpDrive.*; +import cr0s.WarpDrive.data.Jumpgate; +import cr0s.WarpDrive.data.MovingEntity; +import cr0s.WarpDrive.world.SpaceTeleporter; /** * @author Cr0s */ -public class TileEntityReactor extends WarpEnergyTE { - public enum ReactorMode { - IDLE(0), BASIC_JUMP(1), // 0-128 - LONG_JUMP(2), // 0-12800 - TELEPORT(3), BEACON_JUMP(4), // Jump ship by beacon - HYPERSPACE(5), // Jump to/from Hyperspace - GATE_JUMP(6); // Jump via jumpgate +public class TileEntityReactor extends WarpEnergyTE +{ + public Boolean ready; - private final int code; + public Boolean launchState = false; - ReactorMode(int code) { - this.code = code; + 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 shipVolume; + private ReactorMode currentMode = ReactorMode.IDLE; + + public enum ReactorMode { + IDLE ( 0 ), + BASIC_JUMP ( 1 ), // 0-128 + LONG_JUMP ( 2 ), // 0-12800 + TELEPORT ( 3 ), + BEACON_JUMP ( 4 ), // Jump ship by beacon + HYPERSPACE ( 5 ), // Jump to/from Hyperspace + GATE_JUMP ( 6 ); // Jump via jumpgate + + private final int code; + ReactorMode(int code) { + this.code = code; } - - public int getCode() { - return code; - } - } - - public static int calculateRequiredEnergy(ReactorMode currentMode, int shipVolume, int jumpDistance) { - switch (currentMode) { - case TELEPORT: - return WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE; - - case BASIC_JUMP: - return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE1 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE1 * jumpDistance); - - case LONG_JUMP: - return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE2 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE2 * jumpDistance); - - case HYPERSPACE: - return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 10; // 10% of maximum - - case BEACON_JUMP: - return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 2; // half of maximum - - case GATE_JUMP: - return 2 * shipVolume; - default: - break; - } - - return WarpDriveConfig.WC_MAX_ENERGY_VALUE; - } - - private static boolean checkPlayerInventory(TileEntityChest chest, EntityPlayerMP player) { - Boolean result = false; - final int MIN_KEY_LENGTH = 5; - int keyLength = 0; - - for (int index = 0; index < chest.getSizeInventory(); index++) { - ItemStack chestItem = chest.getStackInSlot(index); - ItemStack playerItem = player.inventory.getStackInSlot(9 + index); - - if (chestItem == null) { - continue; - } - - if (playerItem == null || chestItem.isItemEqual(playerItem) || chestItem.getItemDamage() != playerItem.getItemDamage() - || chestItem.stackSize != playerItem.stackSize) { - return false; - } else { - result = true; - } - - keyLength++; - } - - if (keyLength < MIN_KEY_LENGTH) { - System.out.println("[ChestCode] Key is too short: " + keyLength + " < " + MIN_KEY_LENGTH); - return false; - } - - return result; - } - - private static boolean testBB(AxisAlignedBB axisalignedbb, int x, int y, int z) { - return axisalignedbb.minX <= x && axisalignedbb.maxX >= x && axisalignedbb.minY <= y && axisalignedbb.maxY >= y && axisalignedbb.minZ <= z - && axisalignedbb.maxZ >= z; - } - - public Boolean ready; - 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 shipVolume; - private ReactorMode currentMode = ReactorMode.IDLE; - - private int warmupTime = 0; - private int cooldownTime = 0; - public int randomWarmupAddition = 0; - - private int chestTeleportUpdateTicks = 0; - private int registryUpdateTicks = 15; - public String coreFrequency = "default"; - - public int isolationBlocksCount = 0; - - public double isolationRate = 0.0D; - - public int isolationUpdateTicks = 0; - - public TileEntityProtocol controller; - - private boolean soundPlayed = false; - - @Override - public boolean canInputEnergy(ForgeDirection from) { - return true; - } - - private int computeRealShipVolume() { - int realShipVolume = 0; - - try { - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - Block block = worldObj.getBlock(x, y, z); - - if (worldObj.isAirBlock(x, y, z) && (block.isAssociatedBlock(WarpDrive.airBlock))) { - continue; - } - - realShipVolume++; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - - return realShipVolume; - } - - 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 te = worldObj.getTileEntity(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY) - 1, - MathHelper.floor_double(player.posZ)); - - if (te != null && (te instanceof TileEntityProtocol)) { - if (((TileEntityProtocol) te).getBeaconFrequency().equals(freq)) { - beaconX = te.xCoord; - beaconZ = te.zCoord; - isBeaconFound = true; - break; - } - } - } - - // Now make jump to a beacon - if (isBeaconFound) { - // Consume energy - if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, controller.getDistance()), false)) { - System.out.println("" + 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); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } else { - messageToAllPlayersOnShip("Insufficient energy level"); - } - } else { - System.out.println("" + this + " Beacon '" + freq + "' is unknown."); - } - } - - private void doGateJump() { - // Search nearest jump-gate - String gateName = controller.getTargetJumpgateName(); - Jumpgate targetGate = WarpDrive.jumpgates.findGateByName(gateName); - - if (targetGate == null) { - messageToAllPlayersOnShip("Destination jumpgate '" + gateName + "' is unknown. Check jumpgate name."); - this.controller.setJumpFlag(false); - return; - } - - // Now make jump to a beacon - int gateX = targetGate.xCoord; - int gateY = targetGate.yCoord; - int gateZ = targetGate.zCoord; - int destX = gateX; - int destY = gateY; - int destZ = gateZ; - Jumpgate nearestGate = WarpDrive.jumpgates.findNearestGate(xCoord, yCoord, zCoord); - - StringBuilder reason = new StringBuilder(); - if (!isShipInJumpgate(nearestGate, reason)) { - messageToAllPlayersOnShip(reason.toString()); - this.controller.setJumpFlag(false); - return; - } - - // If gate is blocked by obstacle - if (!isFreePlaceForShip(gateX, gateY, gateZ)) { - // Randomize destination coordinates and check for collision with - // obstacles around jumpgate - // Try to find good place for ship - int numTries = 10; // num tries to check for collision - boolean placeFound = false; - - for (; numTries > 0; numTries--) { - // randomize destination coordinates around jumpgate - destX = gateX + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); - destZ = gateZ + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); - destY = gateY + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(50)); - - // check for collision - if (isFreePlaceForShip(destX, destY, destZ)) { - placeFound = true; - break; - } - } - - if (!placeFound) { - messageToAllPlayersOnShip("Destination gate is blocked by obstacles. Aborting..."); - this.controller.setJumpFlag(false); - return; - } - - System.out.println("[GATE] Place found over " + (10 - numTries) + " tries."); - } - - // Consume energy - if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, controller.getDistance()), false)) { - System.out.println("[TE-WC] 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); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } else { - messageToAllPlayersOnShip("Insufficient energy level"); - } - } - - private void doJump() { - int distance = controller.getDistance(); - int requiredEnergy = calculateRequiredEnergy(currentMode, shipVolume, distance); - - 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); - return; - } - - String shipInfo = "" + shipVolume + " blocks inside (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"; - if (currentMode == ReactorMode.GATE_JUMP) { - System.out.println("" + this + " Performing gate jump of " + shipInfo); - doGateJump(); - return; - } else if (currentMode == ReactorMode.BEACON_JUMP) { - System.out.println("" + this + " Performing beacon jump of " + shipInfo); - doBeaconJump(); - return; - } else if (currentMode == ReactorMode.HYPERSPACE) { - System.out.println("" + this + " Performing hyperspace jump of " + shipInfo); - - // Check ship size for hyper-space jump - if (shipVolume < WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE) { - Jumpgate nearestGate = null; - if (WarpDrive.jumpgates == null) { - System.out.println("" + this + " WarpDrive.instance.jumpGates is NULL!"); - } else { - nearestGate = WarpDrive.jumpgates.findNearestGate(xCoord, yCoord, zCoord); - } - - StringBuilder reason = new StringBuilder(); - if (nearestGate == null || !isShipInJumpgate(nearestGate, reason)) { - this.messageToAllPlayersOnShip("Ship is too small (" + shipVolume + "/" + WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE - + "). Insufficient ship mass to open hyperspace portal. Use a jumpgate to reach or exit hyperspace."); - this.controller.setJumpFlag(false); - return; - } - } - } else if (currentMode == ReactorMode.BASIC_JUMP) { - System.out.println("" + this + " Performing basic jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); - } else if (currentMode == ReactorMode.LONG_JUMP) { - System.out.println("" + this + " Performing long jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); - } else { - System.out.println("" + this + " Performing some jump #" + currentMode + " of " + shipInfo); - } - - if (currentMode == ReactorMode.BASIC_JUMP || currentMode == ReactorMode.LONG_JUMP || currentMode == ReactorMode.HYPERSPACE) { - if (!consumeEnergy(requiredEnergy, false)) { - messageToAllPlayersOnShip("Insufficient energy level"); - return; - } - - if (this.currentMode == ReactorMode.BASIC_JUMP) { - distance += shipLength; - } - - if (currentMode == ReactorMode.LONG_JUMP && (direction != -1) && (direction != -2)) { - if (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) { - distance *= 100; - } - } - - WarpDrive.debugPrint("" + this + " Distance adjusted to " + distance + " blocks."); - EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, (currentMode == ReactorMode.HYPERSPACE), distance, direction, - false, 0, 0, 0); - jump.maxX = maxX; - jump.minX = minX; - jump.maxZ = maxZ; - jump.minZ = minZ; - jump.maxY = maxY; - jump.minY = minY; - jump.shipLength = shipLength; - jump.on = true; - worldObj.spawnEntityInWorld(jump); - } - } - - private TileEntity findControllerBlock() { - TileEntity result; - result = worldObj.getTileEntity(xCoord + 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityProtocol) { - dx = 1; - dz = 0; - return result; - } - - result = worldObj.getTileEntity(xCoord - 1, yCoord, zCoord); - - if (result != null && result instanceof TileEntityProtocol) { - dx = -1; - dz = 0; - return result; - } - - result = worldObj.getTileEntity(xCoord, yCoord, zCoord + 1); - - if (result != null && result instanceof TileEntityProtocol) { - dx = 0; - dz = 1; - return result; - } - - result = worldObj.getTileEntity(xCoord, yCoord, zCoord - 1); - - if (result != null && result instanceof TileEntityProtocol) { - dx = 0; - dz = -1; - return result; - } - - return null; - } - - public int getCooldown() { - return cooldownTime; - } - - @Override - public double getDemandedEnergy() { - if (this.controller != null && controller.getMode() == ReactorMode.IDLE) { - return 0.0D; - } - - return super.getDemandedEnergy(); - } - - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.WC_MAX_ENERGY_VALUE; - } - - @Override - public String getStatus() { - return getBlockType().getLocalizedName() - + String.format(" '%s' energy level is %.0f/%.0f EU.", coreFrequency, convertInternalToEU(getEnergyStored()), - convertInternalToEU(getMaxEnergyStored())) - + ((cooldownTime > 0) ? ("\n" + (cooldownTime / 20) + " s left of cooldown.") - : ((isolationBlocksCount > 0) ? ("\n" + isolationBlocksCount + " active isolation blocks") : "")); - } - - @Override - public void invalidate() { - WarpDrive.warpCores.removeFromRegistry(this); - super.invalidate(); - } - - private Boolean isChestSummonMode() { - TileEntity te = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - - if (te != null) { - return (te instanceof TileEntityChest); - } - - return false; - } - - private boolean isFreePlaceForShip(int destX, int destY, int destZ) { - int newX, newY, newZ; - - if (destY + shipUp > 255 || destY - shipDown < 5) { - return false; - } - - int moveX = destX - xCoord; - int moveY = destY - yCoord; - int moveZ = destZ - zCoord; - - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - if (!worldObj.isAirBlock(x, y, z)) { - newX = moveX + x; - newY = moveY + y; - newZ = moveZ + z; - - if (!worldObj.isAirBlock(newX, newY, newZ)) { - return false; - } - } - } - } - } - - return true; - } - - public boolean isHidden() { - if (cooldownTime <= 0 && worldObj.rand.nextDouble() < isolationRate) { - // WarpDrive.debugPrint(this + " Core '" + coreFrequency + - // "' is hidden"); - return true; - } - - return false; - } - - private boolean isShipInJumpgate(Jumpgate jg, StringBuilder reason) { - AxisAlignedBB aabb = jg.getGateAABB(); - WarpDrive.debugPrint("[TEWarpCore] Jumpgate " + jg.name + " AABB is " + aabb); - int countBlocksInside = 0; - int countBlocksTotal = 0; - - if (aabb.isVecInside(Vec3.createVectorHelper( // TODO: Unknown if will - // work - maxX - minX, maxY - minY, maxZ - minZ))) { - return true; - } - - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - for (int y = minY; y <= maxY; y++) { - Block block = worldObj.getBlock(x, y, z); - - if (worldObj.isAirBlock(x, y, z) && (!block.isAssociatedBlock(WarpDrive.airBlock))) { - continue; - } - if (aabb.minX <= x && aabb.maxX >= x && aabb.minY <= y && aabb.maxY >= y && aabb.minZ <= z && aabb.maxZ >= z) { - countBlocksInside++; - } - countBlocksTotal++; - } - } - } - - float percent = 0F; - if (shipVolume != 0) { - percent = Math.round((((countBlocksInside * 1.0F) / shipVolume) * 100.0F) * 10.0F) / 10.0F; - } - if (shipVolume != countBlocksTotal) { - System.out.println("" + this + " Ship volume has changed from " + shipVolume + " to " + countBlocksTotal + " blocks"); - } - WarpDrive.debugPrint("Ship has " + countBlocksInside + " / " + shipVolume + " blocks (" + percent + "%) in jumpgate '" + jg.name + "'"); - // At least 80% of ship must be inside jumpgate - if (percent > 80F) { - return true; - } else if (percent <= 0.001) { - reason.append("Ship is not inside a jumpgate. Jump rejected. Nearest jumpgate is " + jg.toNiceString()); - return false; - } else { - reason.append("Ship is only " + percent + "% inside a jumpgate. Sorry, we'll loose too much crew as is, jump rejected."); - return false; - } - } - - private void makePlayersOnShipDrunk(int tickDuration) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - for (Object o : list) { - if (o == null || !(o instanceof EntityPlayer)) { - continue; - } - - // Set "drunk" effect - ((EntityPlayer) o).addPotionEffect(new PotionEffect(Potion.confusion.id, tickDuration, 0, true)); - } - } - - public void messageToAllPlayersOnShip(String msg) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX + 0.99D, this.maxY + 0.99D, this.maxZ + 0.99D); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - System.out - .println("" + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client" : "Server") + this + " messageToAllPlayersOnShip: " + msg); - for (Object o : list) { - if (o == null || !(o instanceof EntityPlayer)) { - continue; - } - - ((EntityPlayer) o).addChatMessage(new ChatComponentText("[" + (coreFrequency.length() > 0 ? coreFrequency : "WarpCore") + "] " + msg)); - } - } - - @Override - public void onChunkUnload() { - WarpDrive.warpCores.removeFromRegistry(this); - super.onChunkUnload(); - } - - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - coreFrequency = tag.getString("corefrequency"); - isolationBlocksCount = tag.getInteger("isolation"); - cooldownTime = tag.getInteger("cooldownTime"); - WarpDrive.warpCores.updateInRegistry(this); - } - - private void summonPlayer(EntityPlayerMP player, int x, int y, int z) { - if (consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { - player.setPositionAndUpdate(x, y, z); - - if (player.dimension != worldObj.provider.dimensionId) { - player.mcServer.getConfigurationManager().transferPlayerToDimension( - player, - this.worldObj.provider.dimensionId, - new SpaceTeleporter(DimensionManager.getWorld(this.worldObj.provider.dimensionId), 0, MathHelper.floor_double(player.posX), MathHelper - .floor_double(player.posY), MathHelper.floor_double(player.posZ))); - } - } - } - - 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); // getPlayerForUsername - - 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 summonPlayersByChestCode() { - if (worldObj.getTileEntity(xCoord, yCoord + 1, zCoord) == null) { - return; - } - - TileEntityChest chest = (TileEntityChest) worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); - EntityPlayerMP player; - - for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) { - player = (EntityPlayerMP) MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); - - if (checkPlayerInventory(chest, player)) { - System.out.println("" + this + " Summoning " + player.getDisplayName()); - summonPlayer(player, xCoord, yCoord + 2, zCoord); - } - } - } - - 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); // getPlayerForUsername - - 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); - return; - } - } - } - - private void teleportPlayersToSpace() { - if (worldObj.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID) { - AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord - 1, zCoord - 2, xCoord + 2, yCoord + 4, zCoord + 2); - List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - - WorldServer spaceWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); - for (Object o : list) { - if (!consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { - return; - } - - Entity entity = (Entity) o; - int x = MathHelper.floor_double(entity.posX); - int z = MathHelper.floor_double(entity.posZ); - // int y = MathHelper.floor_double(entity.posY); - final int WOOL_BLOCK_ID = 35; - int newY; - - for (newY = 254; newY > 0; newY--) { - if (spaceWorld.getBlock(x, newY, z).isAssociatedBlock(Blocks.wool)) { - break; - } - } - - if (newY <= 0) { - newY = 254; - } - - if (entity instanceof EntityPlayerMP) { - ((EntityPlayerMP) entity).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP) entity), - WarpDriveConfig.G_SPACE_DIMENSION_ID, - new SpaceTeleporter(DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID), 0, x, 256, z)); - - if (spaceWorld.isAirBlock(x, newY, z)) { - spaceWorld.setBlock(x, newY, z, Blocks.stone, 0, 2); - spaceWorld.setBlock(x + 1, newY, z, Blocks.stone, 0, 2); - spaceWorld.setBlock(x - 1, newY, z, Blocks.stone, 0, 2); - spaceWorld.setBlock(x, newY, z + 1, Blocks.stone, 0, 2); - spaceWorld.setBlock(x, newY, z - 1, Blocks.stone, 0, 2); - spaceWorld.setBlock(x + 1, newY, z + 1, Blocks.stone, 0, 2); - spaceWorld.setBlock(x - 1, newY, z - 1, Blocks.stone, 0, 2); - spaceWorld.setBlock(x + 1, newY, z - 1, Blocks.stone, 0, 2); - spaceWorld.setBlock(x - 1, newY, z + 1, Blocks.stone, 0, 2); - } - - ((EntityPlayerMP) entity).setPositionAndUpdate(x + 0.5D, newY + 2.0D, z + 0.5D); - } - } - } - } - - @Override - public String toString() { - return String.format( - "%s \'%s\' @ \'%s\' %d, %d, %d", - new Object[] { getClass().getSimpleName(), coreFrequency, worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), - Integer.valueOf(xCoord), Integer.valueOf(yCoord), Integer.valueOf(zCoord) }); - } - - @Override - public void updateEntity() { - if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { - return; - } - super.updateEntity(); - - // Always cooldown - if (cooldownTime > 0) { - cooldownTime--; - warmupTime = 0; - } - - // Update state - if (cooldownTime > 0) { // cooling down (2) - if (getBlockMetadata() != 2) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); - } - } else if (controller == null) { // not connected (0) - if (getBlockMetadata() != 0) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } - } else if (controller.isJumpFlag() || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { // active - // (1) - if (getBlockMetadata() != 1) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); - } - } else { // inactive - if (getBlockMetadata() != 0) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); - } - } - - // Update warp core in cores registry - registryUpdateTicks++; - if (registryUpdateTicks > WarpDriveConfig.WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS * 20) { - registryUpdateTicks = 0; - WarpDrive.warpCores.updateInRegistry(this); - // WarpDrive.warpCores.printRegistry(); - // WarpDrive.debugPrint("" + this + " controller is " + controller + - // ", warmupTime " + warmupTime + ", currentMode " + currentMode + - // ", jumpFlag " + (controller == null ? "NA" : - // controller.isJumpFlag()) + ", cooldownTime " + cooldownTime); - - TileEntity c = findControllerBlock(); - if (c == null) { - controller = null; - warmupTime = 0; - soundPlayed = false; - return; - } - controller = (TileEntityProtocol) c; - } - - isolationUpdateTicks++; - if (isolationUpdateTicks > WarpDriveConfig.WC_ISOLATION_UPDATE_INTERVAL_SECONDS * 20) { - isolationUpdateTicks = 0; - updateIsolationState(); - } - - if (controller == null) { - return; - } - - currentMode = controller.getMode(); - - StringBuilder reason = new StringBuilder(); - - if ((controller.isJumpFlag() && (isolationUpdateTicks == 1)) || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { - if (!validateShipSpatialParameters(reason)) { - if (controller.isJumpFlag()) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - } - warmupTime = 0; - soundPlayed = false; - return; - } - - if (this.controller.isSummonAllFlag()) { - summonPlayers(); - controller.setSummonAllFlag(false); - } else if (!this.controller.getToSummon().isEmpty()) { - summonSinglePlayer(this.controller.getToSummon()); - this.controller.setToSummon(""); - } - } - - switch (currentMode) { - case TELEPORT: - if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { - if (isChestSummonMode()) { - chestTeleportUpdateTicks++; - if (chestTeleportUpdateTicks >= 20) { - summonPlayersByChestCode(); - chestTeleportUpdateTicks = 0; - } - } else { - teleportPlayersToSpace(); - } - } else { - chestTeleportUpdateTicks = 0; - } - break; - - case BASIC_JUMP: - case LONG_JUMP: - case BEACON_JUMP: - case HYPERSPACE: - case GATE_JUMP: - if (controller.isJumpFlag()) { - // Compute warm-up time - int targetWarmup = 0; - switch (currentMode) { - case BASIC_JUMP: - case LONG_JUMP: - if (controller.getDistance() < 50) { - targetWarmup = WarpDriveConfig.WC_WARMUP_SHORTJUMP_SECONDS * 20; - } else { - targetWarmup = WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS * 20; - } - break; - - case BEACON_JUMP: - case HYPERSPACE: - case GATE_JUMP: - default: - targetWarmup = WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS * 20; - break; - } - // Select best sound file and adjust offset - int soundThreshold = 0; - String soundFile = ""; - if (targetWarmup < 10 * 20) { - soundThreshold = targetWarmup - 4 * 20; - soundFile = "warpdrive:warp_4s"; - } else if (targetWarmup > 29 * 20) { - soundThreshold = targetWarmup - 30 * 20; - soundFile = "warpdrive:warp_30s"; - } else { - soundThreshold = targetWarmup - 10 * 20; - soundFile = "warpdrive:warp_10s"; - } - // Add random duration - soundThreshold += randomWarmupAddition; - - // Check cooldown time - if (cooldownTime > 0) { - if (cooldownTime % 20 == 0) { - int seconds = cooldownTime / 20; - if ((seconds < 5) || ((seconds < 30) && (seconds % 5 == 0)) || (seconds % 10 == 0)) { - messageToAllPlayersOnShip("Warp core is cooling down... " + cooldownTime / 20 + "s to go..."); - } - } - return; - } - - // Set up activated animation - if (warmupTime == 0) { - messageToAllPlayersOnShip("Running pre-jump checklist..."); - - // update ship parameters - if (!validateShipSpatialParameters(reason)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - return; - } - // WarpDrive.debugPrint(this + - // " Giving warp sickness targetWarmup " + targetWarmup + - // " distance " + controller.getDistance()); - makePlayersOnShipDrunk(targetWarmup + WarpDriveConfig.WC_WARMUP_RANDOM_TICKS); - } - - if (!soundPlayed && (soundThreshold > warmupTime)) { - // WarpDrive.debugPrint(this + " Playing sound effect '" + - // soundFile + "' soundThreshold " + soundThreshold + - // " warmupTime " + warmupTime); - worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, soundFile, 4F, 1F); - soundPlayed = true; - } - - // Awaiting cool-down time - if (warmupTime < (targetWarmup + randomWarmupAddition)) { - warmupTime++; - return; - } - - warmupTime = 0; - soundPlayed = false; - - if (!validateShipSpatialParameters(reason)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip(reason.toString()); - return; - } - - if (WarpDrive.warpCores.isWarpCoreIntersectsWithOthers(this)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip("Warp field intersects with other ship's field. Cannot jump."); - return; - } - - if (WarpDrive.cloaks.isCloaked(worldObj.provider.dimensionId, xCoord, yCoord, zCoord)) { - controller.setJumpFlag(false); - messageToAllPlayersOnShip("Core is inside a cloaking field. Aborting. Disable cloaking field to jump!"); - return; - } - - doJump(); - cooldownTime = WarpDriveConfig.WC_COOLDOWN_INTERVAL_SECONDS * 20; - controller.setJumpFlag(false); - } else { - warmupTime = 0; - } - break; - default: - break; - } - } - - private void updateIsolationState() { - // Search block in cube around core - int xmax, ymax, zmax; - int xmin, ymin, zmin; - xmin = xCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - xmax = xCoord + WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - - zmin = zCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - zmax = zCoord + WarpDriveConfig.WR_MAX_ISOLATION_RANGE; - - // scan 1 block higher to encourage putting isolation block on both - // ground and ceiling - ymin = Math.max(0, yCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE + 1); - ymax = Math.min(255, yCoord + WarpDriveConfig.WR_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++) { - for (int z = zmin; z <= zmax; z++) { - if (worldObj.getBlock(x, y, z).isAssociatedBlock(WarpDrive.isolationBlock)) { - newCount++; - } - } - } - } - isolationBlocksCount = newCount; + + public int getCode() { + return code; + } + } + + private int warmupTime = 0; + private int cooldownTime = 0; + public int randomWarmupAddition = 0; + + private int chestTeleportUpdateTicks = 0; + private int registryUpdateTicks = 15; + public String coreFrequency = "default"; + + public int isolationBlocksCount = 0; + public double isolationRate = 0.0D; + public int isolationUpdateTicks = 0; + + public TileEntityProtocol controller; + + private boolean soundPlayed = false; + + @Override + public void updateEntity() { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + return; + } + super.updateEntity(); + + // Always cooldown + if (cooldownTime > 0) { + cooldownTime--; + warmupTime = 0; + } + + // Update state + if (cooldownTime > 0) { // cooling down (2) + if (getBlockMetadata() != 2) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); + } + } else if (controller == null) { // not connected (0) + if (getBlockMetadata() != 0) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); + } + } else if (controller.isJumpFlag() || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { // active (1) + if (getBlockMetadata() != 1) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 1 + 2); + } + } else { // inactive + if (getBlockMetadata() != 0) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 1 + 2); + } + } + + // Update warp core in cores registry + registryUpdateTicks++; + if (registryUpdateTicks > WarpDriveConfig.WC_CORES_REGISTRY_UPDATE_INTERVAL_SECONDS * 20) { + registryUpdateTicks = 0; + WarpDrive.warpCores.updateInRegistry(this); +// WarpDrive.warpCores.printRegistry(); +// WarpDrive.debugPrint("" + this + " controller is " + controller + ", warmupTime " + warmupTime + ", currentMode " + currentMode + ", jumpFlag " + (controller == null ? "NA" : controller.isJumpFlag()) + ", cooldownTime " + cooldownTime); + + TileEntity c = findControllerBlock(); + if (c == null) { + controller = null; + warmupTime = 0; + soundPlayed = false; + return; + } + controller = (TileEntityProtocol)c; + } + + isolationUpdateTicks++; + if (isolationUpdateTicks > WarpDriveConfig.WC_ISOLATION_UPDATE_INTERVAL_SECONDS * 20) { + isolationUpdateTicks = 0; + updateIsolationState(); + } + + if (controller == null) { + return; + } + + currentMode = controller.getMode(); + + StringBuilder reason = new StringBuilder(); + + if ((controller.isJumpFlag() && (isolationUpdateTicks == 1)) || this.controller.isSummonAllFlag() || !this.controller.getToSummon().isEmpty()) { + if (!validateShipSpatialParameters(reason)) { + if (controller.isJumpFlag()) { + controller.setJumpFlag(false); + messageToAllPlayersOnShip(reason.toString()); + } + warmupTime = 0; + soundPlayed = false; + return; + } + + if (this.controller.isSummonAllFlag()) { + summonPlayers(); + controller.setSummonAllFlag(false); + } else if (!this.controller.getToSummon().isEmpty()) { + summonSinglePlayer(this.controller.getToSummon()); + this.controller.setToSummon(""); + } + } + + switch (currentMode) { + case TELEPORT: + if (worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { + if (isChestSummonMode()) { + chestTeleportUpdateTicks++; + if (chestTeleportUpdateTicks >= 20) { + summonPlayersByChestCode(); + chestTeleportUpdateTicks = 0; + } + } else { + teleportPlayersToSpace(); + } + } else { + chestTeleportUpdateTicks = 0; + } + break; + + case BASIC_JUMP: + case LONG_JUMP: + case BEACON_JUMP: + case HYPERSPACE: + case GATE_JUMP: + if (controller.isJumpFlag()) { + // Compute warm-up time + int targetWarmup = 0; + switch (currentMode) { + case BASIC_JUMP: + case LONG_JUMP: + if (controller.getDistance() < 50) { + targetWarmup = WarpDriveConfig.WC_WARMUP_SHORTJUMP_SECONDS * 20; + } else { + targetWarmup = WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS * 20; + } + break; + + case BEACON_JUMP: + case HYPERSPACE: + case GATE_JUMP: + default: + targetWarmup = WarpDriveConfig.WC_WARMUP_LONGJUMP_SECONDS * 20; + break; + } + // Select best sound file and adjust offset + int soundThreshold = 0; + String soundFile = ""; + if (targetWarmup < 10 * 20) { + soundThreshold = targetWarmup - 4 * 20; + soundFile = "warpdrive:warp_4s"; + } else if (targetWarmup > 29 * 20) { + soundThreshold = targetWarmup - 30 * 20; + soundFile = "warpdrive:warp_30s"; + } else { + soundThreshold = targetWarmup - 10 * 20; + soundFile = "warpdrive:warp_10s"; + } + // Add random duration + soundThreshold += randomWarmupAddition; + + // Check cooldown time + if (cooldownTime > 0) { + if (cooldownTime % 20 == 0) { + int seconds = cooldownTime / 20; + if ((seconds < 5) || ((seconds < 30) && (seconds % 5 == 0)) || (seconds % 10 == 0)) { + messageToAllPlayersOnShip("Warp core is cooling down... " + cooldownTime / 20 + "s to go..."); + } + } + return; + } + + // Set up activated animation + if (warmupTime == 0) { + messageToAllPlayersOnShip("Running pre-jump checklist..."); + + // update ship parameters + if (!validateShipSpatialParameters(reason)) { + controller.setJumpFlag(false); + messageToAllPlayersOnShip(reason.toString()); + return; + } + // WarpDrive.debugPrint(this + " Giving warp sickness targetWarmup " + targetWarmup + " distance " + controller.getDistance()); + makePlayersOnShipDrunk(targetWarmup + WarpDriveConfig.WC_WARMUP_RANDOM_TICKS); + } + + if (!soundPlayed && (soundThreshold > warmupTime)) { + // WarpDrive.debugPrint(this + " Playing sound effect '" + soundFile + "' soundThreshold " + soundThreshold + " warmupTime " + warmupTime); + worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, soundFile, 4F, 1F); + soundPlayed = true; + } + + // Awaiting cool-down time + if (warmupTime < (targetWarmup + randomWarmupAddition)) { + warmupTime++; + return; + } + + warmupTime = 0; + soundPlayed = false; + + if (!validateShipSpatialParameters(reason)) { + controller.setJumpFlag(false); + messageToAllPlayersOnShip(reason.toString()); + return; + } + + if (WarpDrive.warpCores.isWarpCoreIntersectsWithOthers(this)) { + controller.setJumpFlag(false); + messageToAllPlayersOnShip("Warp field intersects with other ship's field. Cannot jump."); + return; + } + + if (WarpDrive.cloaks.isCloaked(worldObj.provider.dimensionId, xCoord, yCoord, zCoord)) { + controller.setJumpFlag(false); + messageToAllPlayersOnShip("Core is inside a cloaking field. Aborting. Disable cloaking field to jump!"); + return; + } + + doJump(); + cooldownTime = WarpDriveConfig.WC_COOLDOWN_INTERVAL_SECONDS * 20; + controller.setJumpFlag(false); + } else { + warmupTime = 0; + } + break; + } + } + + public void messageToAllPlayersOnShip(String msg) { + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX + 0.99D, this.maxY + 0.99D, this.maxZ + 0.99D); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); + + WarpDrive.print("" + (FMLCommonHandler.instance().getEffectiveSide().isClient() ? "Client":"Server") + this + " messageToAllPlayersOnShip: " + msg); + for (Object o : list) { + if (o == null || !(o instanceof EntityPlayer)) { + continue; + } + + ((EntityPlayer)o).addChatMessage("[" + (coreFrequency.length() > 0 ? coreFrequency : "WarpCore") + "] " + msg); + } + } + + private void updateIsolationState() { + // Search block in cube around core + int xmax, ymax, zmax; + int xmin, ymin, zmin; + xmin = xCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE; + xmax = xCoord + WarpDriveConfig.WR_MAX_ISOLATION_RANGE; + + zmin = zCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE; + zmax = zCoord + WarpDriveConfig.WR_MAX_ISOLATION_RANGE; + + // scan 1 block higher to encourage putting isolation block on both ground and ceiling + ymin = Math.max( 0, yCoord - WarpDriveConfig.WR_MAX_ISOLATION_RANGE + 1); + ymax = Math.min(255, yCoord + WarpDriveConfig.WR_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++) { + for (int z = zmin; z <= zmax; z++) { + if (worldObj.getBlockId(x, y, z) == WarpDriveConfig.isolationID) { + newCount++; + } + } + } + } + isolationBlocksCount = newCount; if (isolationBlocksCount >= WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS) { isolationRate = WarpDriveConfig.WR_MIN_ISOLATION_EFFECT - + (isolationBlocksCount - WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS) // bonus - // blocks + + (isolationBlocksCount - WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS) // bonus blocks * (WarpDriveConfig.WR_MAX_ISOLATION_EFFECT - WarpDriveConfig.WR_MIN_ISOLATION_EFFECT) / (WarpDriveConfig.WR_MAX_ISOLATION_BLOCKS - WarpDriveConfig.WR_MIN_ISOLATION_BLOCKS); } else { isolationRate = 0.0D; } - // WarpDrive.debugPrint(this + " Isolation updated to " + - // isolationBlocksCount + " (" + String.format("%.1f", isolationRate * - // 100) + "%)"); - } + // WarpDrive.debugPrint(this + " Isolation updated to " + isolationBlocksCount + " (" + String.format("%.1f", isolationRate * 100) + "%)"); + } - @Override - public void validate() { - super.validate(); - WarpDrive.warpCores.updateInRegistry(this); - } + private void makePlayersOnShipDrunk(int tickDuration) { + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); - public boolean validateShipSpatialParameters(StringBuilder reason) { - if (controller == null) { - reason.append("TileEntityReactor.validateShipSpatialParameters: no controller detected!"); - return false; - } - direction = controller.getDirection(); - shipFront = controller.getFront(); - shipRight = controller.getRight(); - shipUp = controller.getUp(); - shipBack = controller.getBack(); - shipLeft = controller.getLeft(); - shipDown = controller.getDown(); + for (Object o : list) { + if (o == null || !(o instanceof EntityPlayer)) { + continue; + } - int x1 = 0, x2 = 0, z1 = 0, z2 = 0; + // Set "drunk" effect + ((EntityPlayer)o).addPotionEffect(new PotionEffect(Potion.confusion.id, tickDuration, 0, true)); + } + } - if (Math.abs(dx) > 0) { - if (dx == 1) { - x1 = xCoord - shipBack; - x2 = xCoord + shipFront; - z1 = zCoord - shipLeft; - z2 = zCoord + shipRight; - } else { - x1 = xCoord - shipFront; - x2 = xCoord + shipBack; - z1 = zCoord - shipRight; - z2 = zCoord + shipLeft; + 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().getPlayerForUsername(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().getPlayerForUsername(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); + return; + } + } + } + + private void summonPlayer(EntityPlayerMP player, int x, int y, int z) { + if (consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { + player.setPositionAndUpdate(x, y, z); + + if (player.dimension != worldObj.provider.dimensionId) { + player.mcServer.getConfigurationManager().transferPlayerToDimension(player, this.worldObj.provider.dimensionId, new SpaceTeleporter(DimensionManager.getWorld(this.worldObj.provider.dimensionId), 0, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ))); + } + } + } + + public boolean validateShipSpatialParameters(StringBuilder reason) { + if (controller == null) { + reason.append("TileEntityReactor.validateShipSpatialParameters: no controller detected!"); + return false; + } + direction = controller.getDirection(); + shipFront = controller.getFront(); + shipRight = controller.getRight(); + shipUp = controller.getUp(); + shipBack = controller.getBack(); + shipLeft = controller.getLeft(); + shipDown = controller.getDown(); + + int x1 = 0, x2 = 0, z1 = 0, z2 = 0; + + if (Math.abs(dx) > 0) { + if (dx == 1) { + x1 = xCoord - shipBack; + x2 = xCoord + shipFront; + z1 = zCoord - shipLeft; + z2 = zCoord + shipRight; + } else { + x1 = xCoord - shipFront; + x2 = xCoord + shipBack; + z1 = zCoord - shipRight; + z2 = zCoord + shipLeft; + } + } else if (Math.abs(dz) > 0) { + if (dz == 1) { + z1 = zCoord - shipBack; + z2 = zCoord + shipFront; + x1 = xCoord - shipRight; + x2 = xCoord + shipLeft; + } else { + z1 = zCoord - shipFront; + z2 = zCoord + shipBack; + x1 = xCoord - shipLeft; + x2 = xCoord + shipRight; + } + } + + if (x1 < x2) { + minX = x1; + maxX = x2; + } else { + minX = x2; + maxX = x1; + } + + if (z1 < z2) { + minZ = z1; + maxZ = z2; + } else { + 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.WC_MAX_SHIP_SIDE || (shipLeft + shipRight) > WarpDriveConfig.WC_MAX_SHIP_SIDE || (shipDown + shipUp) > WarpDriveConfig.WC_MAX_SHIP_SIDE) { + reason.append("Ship is too big (max is " + WarpDriveConfig.WC_MAX_SHIP_SIDE + " 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)) { + continue; } - } else if (Math.abs(dz) > 0) { - if (dz == 1) { - z1 = zCoord - shipBack; - z2 = zCoord + shipFront; - x1 = xCoord - shipRight; - x2 = xCoord + shipLeft; - } else { - z1 = zCoord - shipFront; - z2 = zCoord + shipBack; - x1 = xCoord - shipLeft; - x2 = xCoord + shipRight; + + String playerName = ((EntityPlayer)o).username; + for (String unlimiteName : WarpDriveConfig.WC_UNLIMITED_PLAYERNAMES) { + isUnlimited = isUnlimited || unlimiteName.equals(playerName); } } + + shipVolume = computeRealShipVolume(); + if (!isUnlimited && shipVolume > WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE && worldObj.provider.dimensionId == 0) { + reason.append("Ship is too big for the overworld (max is " + WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE + " blocks)"); + return false; + } - if (x1 < x2) { - minX = x1; - maxX = x2; - } else { - minX = x2; - maxX = x1; + 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 te = worldObj.getBlockTileEntity(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY) - 1, MathHelper.floor_double(player.posZ)); + + if (te != null && (te instanceof TileEntityProtocol)) + { + if (((TileEntityProtocol)te).getBeaconFrequency().equals(freq)) + { + beaconX = te.xCoord; + beaconZ = te.zCoord; + isBeaconFound = true; + break; + } + } + } + + // Now make jump to a beacon + if (isBeaconFound) { + // Consume energy + if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, controller.getDistance()), false)) { + WarpDrive.print(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); + jump.maxX = maxX; + jump.minX = minX; + jump.maxZ = maxZ; + jump.minZ = minZ; + jump.maxY = maxY; + jump.minY = minY; + jump.shipLength = shipLength; + jump.on = true; + worldObj.spawnEntityInWorld(jump); + } else { + messageToAllPlayersOnShip("Insufficient energy level"); + } + } else { + WarpDrive.print(this + " Beacon '" + freq + "' is unknown."); + } + } + + private boolean isShipInJumpgate(Jumpgate jg, StringBuilder reason) + { + AxisAlignedBB aabb = jg.getGateAABB(); + WarpDrive.debugPrint("[TEWarpCore] Jumpgate " + jg.name + " AABB is " + aabb); + int countBlocksInside = 0; + int countBlocksTotal = 0; + + if (aabb.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(maxX - minX, maxY - minY, maxZ - minZ))) + { + return true; + } + + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + for (int y = minY; y <= maxY; y++) + { + int blockID = worldObj.getBlockId(x, y, z); + + if (worldObj.isAirBlock(x, y, z) && (blockID != WarpDriveConfig.airID)) + { + continue; + } + if (aabb.minX <= x && aabb.maxX >= x && aabb.minY <= y && aabb.maxY >= y && aabb.minZ <= z && aabb.maxZ >= z) + { + countBlocksInside++; + } + countBlocksTotal++; + } + } + } + + float percent = 0F; + if (shipVolume != 0) + { + percent = Math.round((((countBlocksInside * 1.0F) / shipVolume) * 100.0F) * 10.0F) / 10.0F; + } + if (shipVolume != countBlocksTotal) + { + WarpDrive.print(this + " Ship volume has changed from " + shipVolume + " to " + countBlocksTotal + " blocks"); + } + WarpDrive.debugPrint("Ship has " + countBlocksInside + " / " + shipVolume + " blocks (" + percent + "%) in jumpgate '" + jg.name + "'"); + // At least 80% of ship must be inside jumpgate + if (percent > 80F) + { + return true; + } + else if (percent <= 0.001) + { + reason.append("Ship is not inside a jumpgate. Jump rejected. Nearest jumpgate is " + jg.toNiceString()); + return false; + } + else + { + reason.append("Ship is only " + percent + "% inside a jumpgate. Sorry, we'll loose too much crew as is, jump rejected."); + return false; + } + } + + private boolean isFreePlaceForShip(int destX, int destY, int destZ) + { + int newX, newY, newZ; + + if (destY + shipUp > 255 || destY - shipDown < 5) + { + return false; + } + + int moveX = destX - xCoord; + int moveY = destY - yCoord; + int moveZ = destZ - zCoord; + + for (int x = minX; x <= maxX; x++) + { + for (int z = minZ; z <= maxZ; z++) + { + for (int y = minY; y <= maxY; y++) + { + if (!worldObj.isAirBlock(x, y, z)) + { + newX = moveX + x; + newY = moveY + y; + newZ = moveZ + z; + + if (!worldObj.isAirBlock(newX, newY, newZ)) + { + return false; + } + } + } + } + } + + return true; + } + + private void doGateJump() + { + // Search nearest jump-gate + String gateName = controller.getTargetJumpgateName(); + Jumpgate targetGate = WarpDrive.jumpgates.findGateByName(gateName); + + if (targetGate == null) + { + messageToAllPlayersOnShip("Destination jumpgate '" + gateName + "' is unknown. Check jumpgate name."); + this.controller.setJumpFlag(false); + return; + } + + // Now make jump to a beacon + int gateX = targetGate.xCoord; + int gateY = targetGate.yCoord; + int gateZ = targetGate.zCoord; + int destX = gateX; + int destY = gateY; + int destZ = gateZ; + Jumpgate nearestGate = WarpDrive.jumpgates.findNearestGate(xCoord, yCoord, zCoord); + + StringBuilder reason = new StringBuilder(); + if (!isShipInJumpgate(nearestGate, reason)) + { + messageToAllPlayersOnShip(reason.toString()); + this.controller.setJumpFlag(false); + return; + } + + // If gate is blocked by obstacle + if (!isFreePlaceForShip(gateX, gateY, gateZ)) + { + // Randomize destination coordinates and check for collision with obstacles around jumpgate + // Try to find good place for ship + int numTries = 10; // num tries to check for collision + boolean placeFound = false; + + for (; numTries > 0; numTries--) + { + // randomize destination coordinates around jumpgate + destX = gateX + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); + destZ = gateZ + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(100)); + destY = gateY + ((worldObj.rand.nextBoolean()) ? -1 : 1) * (20 + worldObj.rand.nextInt(50)); + + // check for collision + if (isFreePlaceForShip(destX, destY, destZ)) + { + placeFound = true; + break; + } + } + + if (!placeFound) + { + messageToAllPlayersOnShip("Destination gate is blocked by obstacles. Aborting..."); + this.controller.setJumpFlag(false); + return; + } + + WarpDrive.print("[GATE] Place found over " + (10 - numTries) + " tries."); + } + + // Consume energy + if (consumeEnergy(calculateRequiredEnergy(currentMode, shipVolume, controller.getDistance()), false)) { + WarpDrive.print(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); + jump.maxX = maxX; + jump.minX = minX; + jump.maxZ = maxZ; + jump.minZ = minZ; + jump.maxY = maxY; + jump.minY = minY; + jump.shipLength = shipLength; + jump.on = true; + worldObj.spawnEntityInWorld(jump); + } else { + messageToAllPlayersOnShip("Insufficient energy level"); + } + } + + private void doJump() { + int distance = controller.getDistance(); + int requiredEnergy = calculateRequiredEnergy(currentMode, shipVolume, distance); + + 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); + return; + } + + String shipInfo = "" + shipVolume + " blocks inside (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"; + if (currentMode == ReactorMode.GATE_JUMP) { + WarpDrive.print(this + " Performing gate jump of " + shipInfo); + doGateJump(); + return; + } else if (currentMode == ReactorMode.BEACON_JUMP) { + WarpDrive.print(this + " Performing beacon jump of " + shipInfo); + doBeaconJump(); + return; + } else if (currentMode == ReactorMode.HYPERSPACE) { + WarpDrive.print(this + " Performing hyperspace jump of " + shipInfo); + + // Check ship size for hyper-space jump + if (shipVolume < WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE) { + Jumpgate nearestGate = null; + if (WarpDrive.jumpgates == null) { + WarpDrive.print(this + " WarpDrive.instance.jumpGates is NULL!"); + } else { + nearestGate = WarpDrive.jumpgates.findNearestGate(xCoord, yCoord, zCoord); + } + + StringBuilder reason = new StringBuilder(); + if (nearestGate == null || !isShipInJumpgate(nearestGate, reason)) { + this.messageToAllPlayersOnShip("Ship is too small (" + shipVolume + "/" + WarpDriveConfig.WC_MIN_SHIP_VOLUME_FOR_HYPERSPACE + "). Insufficient ship mass to open hyperspace portal. Use a jumpgate to reach or exit hyperspace."); + this.controller.setJumpFlag(false); + return; + } + } + } else if (currentMode == ReactorMode.BASIC_JUMP) { + WarpDrive.print(this + " Performing basic jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); + } else if (currentMode == ReactorMode.LONG_JUMP) { + WarpDrive.print(this + " Performing long jump of " + shipInfo + " toward direction " + direction + " over " + distance + " blocks."); + } else { + WarpDrive.print(this + " Performing some jump #" + currentMode + " of " + shipInfo); + } + + if (currentMode == ReactorMode.BASIC_JUMP || currentMode == ReactorMode.LONG_JUMP || currentMode == ReactorMode.HYPERSPACE) { + if (!consumeEnergy(requiredEnergy, false)) { + messageToAllPlayersOnShip("Insufficient energy level"); + return; + } + + if (this.currentMode == ReactorMode.BASIC_JUMP) { + distance += shipLength; + } + + if (currentMode == ReactorMode.LONG_JUMP && (direction != -1) && (direction != -2)) { + if (worldObj.provider.dimensionId == WarpDriveConfig.G_HYPERSPACE_DIMENSION_ID) { + distance *= 100; + } + } + + WarpDrive.debugPrint("" + this + " Distance adjusted to " + distance + " blocks."); + EntityJump jump = new EntityJump(worldObj, xCoord, yCoord, zCoord, dx, dz, this, (currentMode == ReactorMode.HYPERSPACE), distance, direction, false, 0, 0, 0); + jump.maxX = maxX; + jump.minX = minX; + jump.maxZ = maxZ; + jump.minZ = minZ; + jump.maxY = maxY; + jump.minY = minY; + jump.shipLength = shipLength; + jump.on = true; + worldObj.spawnEntityInWorld(jump); + } + } + + private void teleportPlayersToSpace() { + if (worldObj.provider.dimensionId != WarpDriveConfig.G_SPACE_DIMENSION_ID) { + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox(xCoord - 2, yCoord - 1, zCoord - 2, xCoord + 2, yCoord + 4, zCoord + 2); + List list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb); + + WorldServer spaceWorld = DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID); + for (Object o : list) { + if (!consumeEnergy(WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE, false)) { + return; + } + + Entity entity = (Entity) o; + int x = MathHelper.floor_double(entity.posX); + int z = MathHelper.floor_double(entity.posZ); + //int y = MathHelper.floor_double(entity.posY); + final int WOOL_BLOCK_ID = 35; + int newY; + + for (newY = 254; newY > 0; newY--) { + if (spaceWorld.getBlockId(x, newY, z) == WOOL_BLOCK_ID) { + break; + } + } + + if (newY <= 0) { + newY = 254; + } + + if (entity instanceof EntityPlayerMP) { + ((EntityPlayerMP) entity).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP) entity), WarpDriveConfig.G_SPACE_DIMENSION_ID, new SpaceTeleporter(DimensionManager.getWorld(WarpDriveConfig.G_SPACE_DIMENSION_ID), 0, x, 256, z)); + + if (spaceWorld.isAirBlock(x, newY, z)) { + spaceWorld.setBlock(x , newY, z , Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x + 1, newY, z , Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x - 1, newY, z , Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x , newY, z + 1, Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x , newY, z - 1, Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x + 1, newY, z + 1, Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x - 1, newY, z - 1, Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x + 1, newY, z - 1, Block.stone.blockID, 0, 2); + spaceWorld.setBlock(x - 1, newY, z + 1, Block.stone.blockID, 0, 2); + } + + ((EntityPlayerMP) entity).setPositionAndUpdate(x + 0.5D, newY + 2.0D, z + 0.5D); + } + } + } + } + + private void summonPlayersByChestCode() + { + if (worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord) == null) + { + return; + } + + TileEntityChest chest = (TileEntityChest)worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); + EntityPlayerMP player; + + for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++) + { + player = (EntityPlayerMP)MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i); + + if (checkPlayerInventory(chest, player)) + { + WarpDrive.print(this + " Summoning " + player.username); + summonPlayer(player, xCoord, yCoord + 2, zCoord); + } + } + } + + private static boolean checkPlayerInventory(TileEntityChest chest, EntityPlayerMP player) { + Boolean result = false; + final int MIN_KEY_LENGTH = 5; + int keyLength = 0; + + for (int index = 0; index < chest.getSizeInventory(); index++) { + ItemStack chestItem = chest.getStackInSlot(index); + ItemStack playerItem = player.inventory.getStackInSlot(9 + index); + + if (chestItem == null) { + continue; + } + + if (playerItem == null || chestItem.itemID != playerItem.itemID || chestItem.getItemDamage() != playerItem.getItemDamage() || chestItem.stackSize != playerItem.stackSize) { + return false; + } else { + result = true; + } + + keyLength++; + } + + if (keyLength < MIN_KEY_LENGTH) { + WarpDrive.print("[ChestCode] Key is too short: " + keyLength + " < " + MIN_KEY_LENGTH); + return false; + } + + return result; + } + + private Boolean isChestSummonMode() + { + TileEntity te = worldObj.getBlockTileEntity(xCoord, yCoord + 1, zCoord); + + if (te != null) + { + return (te instanceof TileEntityChest); + } + + return false; + } + + private static boolean testBB(AxisAlignedBB axisalignedbb, int x, int y, int z) + { + return axisalignedbb.minX <= x && axisalignedbb.maxX >= x && axisalignedbb.minY <= y && axisalignedbb.maxY >= y && axisalignedbb.minZ <= z && axisalignedbb.maxZ >= z; + } + + @Override + public String getStatus() { + return getBlockType().getLocalizedName() + String.format(" '%s' energy level is %.0f/%.0f EU.", coreFrequency, convertInternalToEU(getEnergyStored()), convertInternalToEU(getMaxEnergyStored())) + + ((cooldownTime > 0) ? ("\n" + (cooldownTime / 20) + " s left of cooldown.") : ((isolationBlocksCount > 0) ? ("\n" + isolationBlocksCount + " active isolation blocks") : "")); + } + + public static int calculateRequiredEnergy(ReactorMode currentMode, int shipVolume, int jumpDistance) { + switch (currentMode) { + case TELEPORT: + return WarpDriveConfig.WC_ENERGY_PER_ENTITY_TO_SPACE; + + case BASIC_JUMP: + return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE1 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE1 * jumpDistance); + + case LONG_JUMP: + return (WarpDriveConfig.WC_ENERGY_PER_BLOCK_MODE2 * shipVolume) + (WarpDriveConfig.WC_ENERGY_PER_DISTANCE_MODE2 * jumpDistance); + + case HYPERSPACE: + return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 10; // 10% of maximum + + case BEACON_JUMP: + return WarpDriveConfig.WC_MAX_ENERGY_VALUE / 2; // half of maximum + + case GATE_JUMP: + return 2 * shipVolume; + } + + return WarpDriveConfig.WC_MAX_ENERGY_VALUE; + } + + private int computeRealShipVolume() { + int realShipVolume = 0; + + try { + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = minY; y <= maxY; y++) { + int blockID = worldObj.getBlockId(x, y, z); + + if (WarpDriveConfig.isAirBlock(worldObj, blockID, x, y, z) && (blockID != WarpDriveConfig.airID)) { + continue; + } + + realShipVolume++; + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } + + return realShipVolume; + } + + private TileEntity findControllerBlock() + { + TileEntity result; + result = worldObj.getBlockTileEntity(xCoord + 1, yCoord, zCoord); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = 1; + dz = 0; + return result; + } + + result = worldObj.getBlockTileEntity(xCoord - 1, yCoord, zCoord); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = -1; + dz = 0; + return result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord + 1); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = 0; + dz = 1; + return result; + } + + result = worldObj.getBlockTileEntity(xCoord, yCoord, zCoord - 1); + + if (result != null && result instanceof TileEntityProtocol) + { + dx = 0; + dz = -1; + return result; + } + + return null; + } + + public int getCooldown() { + return cooldownTime; + } + + public boolean isHidden() { + if (cooldownTime <= 0 && worldObj.rand.nextDouble() < isolationRate) { + // WarpDrive.debugPrint(this + " Core '" + coreFrequency + "' is hidden"); + return true; } - if (z1 < z2) { - minZ = z1; - maxZ = z2; - } else { - 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.WC_MAX_SHIP_SIDE || (shipLeft + shipRight) > WarpDriveConfig.WC_MAX_SHIP_SIDE - || (shipDown + shipUp) > WarpDriveConfig.WC_MAX_SHIP_SIDE) { - reason.append("Ship is too big (max is " + WarpDriveConfig.WC_MAX_SHIP_SIDE + " per side)"); - return false; - } - - this.shipVolume = computeRealShipVolume(); - - if (shipVolume > WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE && worldObj.provider.dimensionId == 0) { - reason.append("Ship is too big for the overworld (max is " + WarpDriveConfig.WC_MAX_SHIP_VOLUME_ON_SURFACE + " blocks)"); - return false; - } - - return true; + return false; } - - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setString("corefrequency", coreFrequency); - tag.setInteger("isolation", isolationBlocksCount); - tag.setInteger("cooldownTime", cooldownTime); + + @Override + public int getMaxEnergyStored() { + return WarpDriveConfig.WC_MAX_ENERGY_VALUE; } + + @Override + public double demandedEnergyUnits() { + if (this.controller != null && controller.getMode() == ReactorMode.IDLE) { + return 0.0D; + } - @Override - public int getSinkTier() { - // TODO Auto-generated method stub - return 3; - } + return super.demandedEnergyUnits(); + } + + @Override + public int getMaxSafeInput() { + return Integer.MAX_VALUE; + } + + @Override + public boolean canInputEnergy(ForgeDirection from) { + return true; + } - @Override - public int getSourceTier() { - // TODO Auto-generated method stub - return 3; - } + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + coreFrequency = tag.getString("corefrequency"); + isolationBlocksCount = tag.getInteger("isolation"); + cooldownTime = tag.getInteger("cooldownTime"); + WarpDrive.warpCores.updateInRegistry(this); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + tag.setString("corefrequency", coreFrequency); + tag.setInteger("isolation", isolationBlocksCount); + tag.setInteger("cooldownTime", cooldownTime); + } + + @Override + public void onChunkUnload() { + WarpDrive.warpCores.removeFromRegistry(this); + super.onChunkUnload(); + } + + @Override + public void validate() { + super.validate(); + WarpDrive.warpCores.updateInRegistry(this); + } + + @Override + public void invalidate() { + WarpDrive.warpCores.removeFromRegistry(this); + super.invalidate(); + } + + @Override + public String toString() { + return String.format("%s \'%s\' @ \'%s\' %d, %d, %d", new Object[] { + getClass().getSimpleName(), + coreFrequency, + worldObj == null ? "~NULL~" : worldObj.getWorldInfo().getWorldName(), + Integer.valueOf(xCoord), Integer.valueOf(yCoord), Integer.valueOf(zCoord)}); + } } diff --git a/src/cr0s/WarpDrive/machines/TileEntityTransporter.java b/src/java/cr0s/warpdrive/machines/TileEntityTransporter.java similarity index 100% rename from src/cr0s/WarpDrive/machines/TileEntityTransporter.java rename to src/java/cr0s/warpdrive/machines/TileEntityTransporter.java diff --git a/src/java/cr0s/warpdrive/machines/WarpBlockContainer.java b/src/java/cr0s/warpdrive/machines/WarpBlockContainer.java index cbee5015..df15dbf2 100644 --- a/src/java/cr0s/warpdrive/machines/WarpBlockContainer.java +++ b/src/java/cr0s/warpdrive/machines/WarpBlockContainer.java @@ -1,38 +1,83 @@ -package cr0s.warpdrive.machines; +package cr0s.WarpDrive.machines; +import cpw.mods.fml.common.FMLCommonHandler; +import cr0s.WarpDrive.WarpDrive; +import cr0s.WarpDrive.api.IBlockUpdateDetector; +import cr0s.WarpDrive.api.IUpgradable; +import cr0s.WarpDrive.data.EnumUpgradeTypes; +import cr0s.WarpDrive.item.ItemWarpUpgrade; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import cr0s.warpdrive.WarpDrive; -import cr0s.warpdrive.api.IBlockUpdateDetector; public abstract class WarpBlockContainer extends BlockContainer { - protected WarpBlockContainer() { - super(Material.iron); + protected WarpBlockContainer(int par1) { + super(par1, Material.iron); } - protected WarpBlockContainer(Material m) { - super(m); + protected WarpBlockContainer(int par1, Material m) { + super(par1, m); setHardness(0.5F); - setStepSound(Block.soundTypeMetal); + setStepSound(Block.soundMetalFootstep); setCreativeTab(WarpDrive.warpdriveTab); } @Override public void onBlockAdded(World w, int x, int y, int z) { super.onBlockAdded(w, x, y, z); - TileEntity te = w.getTileEntity(x, y, z); + TileEntity te = w.getBlockTileEntity(x, y, z); if (te instanceof IBlockUpdateDetector) { ((IBlockUpdateDetector)te).updatedNeighbours(); } } + /* FIXME untested @Override - public void onNeighborBlockChange(World w, int x, int y, int z, Block b) { + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + return false; + } + + boolean hasResponse = false; + TileEntity te = world.getBlockTileEntity(x, y, z); + if(te != null && te instanceof IUpgradable) + { + IUpgradable upgradable = (IUpgradable)te; + ItemStack is = player.inventory.getCurrentItem(); + if(is != null) + { + Item i = is.getItem(); + if(i instanceof ItemWarpUpgrade) + { + if(upgradable.takeUpgrade(EnumUpgradeTypes.values()[is.getItemDamage()],false)) + { + if(!player.capabilities.isCreativeMode) + player.inventory.decrStackSize(player.inventory.currentItem, 1); + player.addChatMessage("Upgrade accepted"); + } + else + { + player.addChatMessage("Upgrade declined"); + } + hasResponse = true; + } + } + } + + return hasResponse; + } + /**/ + + @Override + public void onNeighborBlockChange(World w, int x, int y, int z, int b) { super.onNeighborBlockChange(w, x, y, z, b); - TileEntity te = w.getTileEntity(x, y, z); + TileEntity te = w.getBlockTileEntity(x, y, z); if (te instanceof IBlockUpdateDetector) { ((IBlockUpdateDetector)te).updatedNeighbours(); }