Merge MC1.7 into MC1.10

This commit is contained in:
Unknown 2018-05-22 12:07:10 -04:00
parent 4b967f150e
commit 9bd5ce213c
114 changed files with 1338 additions and 826 deletions

View file

@ -1,4 +1,4 @@
#
minecraft_version=1.10.2
forge_version=12.18.3.2511
mod_version=1.4.0-dev
mod_version=1.5.0-dev

View file

@ -8,6 +8,7 @@ import cr0s.warpdrive.data.VectorI;
import cr0s.warpdrive.world.SpaceTeleporter;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLiquid;
import net.minecraft.block.state.IBlockState;
import net.minecraft.command.EntitySelector;
import net.minecraft.command.ICommandSender;
@ -55,11 +56,16 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
/**
* Common static methods
*/
@ -696,6 +702,40 @@ public class Commons {
return world.rayTraceBlocks(vec3Position, vec3Target, false, false, true);
}
// Fluid registry fix
// As of MC1.7.10 CoFH is remapping blocks without updating the fluid registry
// This imply that call to FluidRegistry.lookupFluidForBlock() for Water and Lava will return null
// We're remapping it using unlocalized names, since those don't change
private static HashMap<String, Fluid> fluidByBlockName;
public static Fluid fluid_getByBlock(final Block block) {
// validate context
if (!(block instanceof BlockLiquid)) {
// if (WarpDrive.isDev) {
WarpDrive.logger.warn(String.format("Invalid lookup for fluid block not derived from BlockLiquid %s",
block));
// }
return null;
}
// build cache on first call
if (fluidByBlockName == null) {
final Map<String, Fluid> fluidsRegistry = FluidRegistry.getRegisteredFluids();
final HashMap<String, Fluid> map = new HashMap<>(100);
fluidByBlockName = map;
for (final Fluid fluid : fluidsRegistry.values()) {
final Block blockFluid = fluid.getBlock();
if (blockFluid != null) {
map.put(blockFluid.getUnlocalizedName(), fluid);
}
}
fluidByBlockName = map;
}
// final Fluid fluid = FluidRegistry.lookupFluidForBlock(blockState.getBlock()); @TODO MC1.10 fluid detection
return fluidByBlockName.get(block.getUnlocalizedName());
}
public static EnumFacing getDirection(final int index) {
if (index < 0 || index > 5) {
return null;

View file

@ -54,9 +54,6 @@ import cr0s.warpdrive.block.movement.BlockTransporterBeacon;
import cr0s.warpdrive.block.movement.BlockTransporterContainment;
import cr0s.warpdrive.block.movement.BlockTransporterCore;
import cr0s.warpdrive.block.movement.BlockTransporterScanner;
import cr0s.warpdrive.block.decoration.BlockBedrockGlass;
import cr0s.warpdrive.block.decoration.BlockDecorative;
import cr0s.warpdrive.block.decoration.BlockGas;
import cr0s.warpdrive.block.passive.BlockHighlyAdvancedMachine;
import cr0s.warpdrive.block.passive.BlockIridium;
import cr0s.warpdrive.block.weapon.BlockLaserCamera;
@ -130,7 +127,6 @@ import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.ForgeChunkManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;

View file

@ -3,6 +3,7 @@ package cr0s.warpdrive.api;
import cr0s.warpdrive.data.Vector3;
public interface IBeamFrequency {
int BEAM_FREQUENCY_SCANNING = 1420;
int BEAM_FREQUENCY_MIN = 0;
int BEAM_FREQUENCY_MAX = 65000;
@ -15,7 +16,7 @@ public interface IBeamFrequency {
void setBeamFrequency(final int beamFrequency);
static Vector3 getBeamColor(final int beamFrequency) {
float r, g, b;
final float r, g, b;
if (beamFrequency <= BEAM_FREQUENCY_MIN) { // invalid frequency
r = 1.0F;
g = 0.0F;
@ -45,7 +46,7 @@ public interface IBeamFrequency {
g = 0.0F;
b = 0.5F - 0.5F * (beamFrequency - 50000F) / 10000F;
} else if (beamFrequency <= BEAM_FREQUENCY_MAX) { // rainbow
int component = Math.round(4096F * (beamFrequency - 60000F) / (BEAM_FREQUENCY_MAX - 60000F));
final int component = Math.round(4096F * (beamFrequency - 60000F) / (BEAM_FREQUENCY_MAX - 60000F));
r = 1.0F - 0.5F * (component & 0xF);
g = 0.5F + 0.5F * (component >> 4 & 0xF);
b = 0.5F + 0.5F * (component >> 8 & 0xF);

View file

@ -281,7 +281,7 @@ public abstract class BlockAbstractContainer extends BlockContainer implements I
if (enumComponentType == null) {
// no more upgrades to dismount
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.noUpgradeToDismount"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.no_upgrade_to_dismount"));
return true;
}
@ -310,13 +310,13 @@ public abstract class BlockAbstractContainer extends BlockContainer implements I
// validate type
if (tileEntityAbstractBase.getUpgradeMaxCount(enumComponentType) <= 0) {
// invalid upgrade type
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.invalidUpgrade"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.invalid_upgrade"));
return true;
}
if (!tileEntityAbstractBase.canUpgrade(enumComponentType)) {
// too many upgrades
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.tooManyUpgrades",
tileEntityAbstractBase.getUpgradeMaxCount(enumComponentType)));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.too_many_upgrades",
tileEntityAbstractBase.getUpgradeMaxCount(enumComponentType)));
return true;
}
@ -324,7 +324,7 @@ public abstract class BlockAbstractContainer extends BlockContainer implements I
// validate quantity
if (itemStackHeld.stackSize < 1) {
// not enough upgrade items
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.notEnoughUpgrades"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.not_enough_upgrades"));
return true;
}

View file

@ -59,6 +59,10 @@ public abstract class TileEntityAbstractBase extends TileEntity implements IBloc
}
}
protected boolean isFirstTick() {
return isFirstTick;
}
@Override
public void onBlockUpdateDetected() {
}
@ -477,4 +481,12 @@ public abstract class TileEntityAbstractBase extends TileEntity implements IBloc
}
return false;
}
@Override
public String toString() {
return String.format("%s @ %s (%d %d %d)",
getClass().getSimpleName(),
worldObj == null ? "~NULL~" : worldObj.provider.getSaveFolder(),
pos.getX(), pos.getY(), pos.getZ());
}
}

View file

@ -204,6 +204,20 @@ public abstract class TileEntityAbstractEnergy extends TileEntityAbstractInterfa
}
// Minecraft overrides
@Override
protected void onFirstUpdateTick() {
super.onFirstUpdateTick();
if (worldObj.isRemote) {
return;
}
// Thermal Expansion
if (WarpDriveConfig.isCoFHCoreLoaded) {
CoFH_scanForEnergyHandlers();
}
}
@Override
public void update() {
super.update();

View file

@ -334,10 +334,11 @@ public abstract class TileEntityAbstractInterfaced extends TileEntityAbstractBas
}
} catch (final Exception exception) {
exception.printStackTrace();
WarpDrive.logger.error(String.format("Failed to mount ComputerCraft scripts for %s @ %s (%d %d %d)",
WarpDrive.logger.error(String.format("Failed to mount ComputerCraft scripts for %s @ %s (%d %d %d), isFirstTick %s",
peripheralName,
worldObj == null ? "~NULL~" : worldObj.provider.getSaveFolder(),
pos.getX(), pos.getY(), pos.getZ()));
pos.getX(), pos.getY(), pos.getZ(),
isFirstTick()));
}
}
}

View file

@ -44,6 +44,12 @@ public abstract class TileEntityAbstractLaser extends TileEntityAbstractInterfac
});
}
@Override
protected void onFirstUpdateTick() {
super.onFirstUpdateTick();
updateLaserMediumDirection();
}
@Override
public void update() {
super.update();

View file

@ -24,11 +24,6 @@ public class BlockAbstractAccelerator extends BlockAbstractBase implements IBloc
setResistance((2 + 2 * tier) * 5 / 3);
}
@Override
public int damageDropped(IBlockState blockState) {
return 0;
}
@Override
public byte getTier(final ItemStack itemStack) {
return tier;

View file

@ -47,18 +47,30 @@ public class BlockChiller extends BlockAbstractAccelerator {
@Override
public void onEntityCollidedWithBlock(final World world, final BlockPos blockPos, final IBlockState blockState, final Entity entity) {
super.onEntityCollidedWithBlock(world, blockPos, blockState, entity);
if (world.isRemote) {
return;
}
onEntityEffect(world, blockPos, entity);
}
@Override
public void onEntityWalk(World world, BlockPos blockPos, Entity entity) {
super.onEntityWalk(world, blockPos, entity);
if (world.isRemote) {
return;
}
onEntityEffect(world, blockPos, entity);
}
@Override
public void onBlockClicked(final World world, final BlockPos blockPos, final EntityPlayer entityPlayer) {
super.onBlockClicked(world, blockPos, entityPlayer);
if (world.isRemote) {
return;
}
onEntityEffect(world, blockPos, entityPlayer);
}

View file

@ -150,7 +150,7 @@ public class TileEntityAirGenerator extends TileEntityAbstractEnergy {
@Callback
@Optional.Method(modid = "OpenComputers")
public Object[] enable(final Context context, final Arguments arguments) {
return enable(argumentsOCtoCC(arguments));
return enable(argumentsOCtoCC(arguments));
}
// ComputerCraft IPeripheral methods implementation

View file

@ -4,6 +4,7 @@ import cr0s.warpdrive.Commons;
import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.api.ISequencerCallbacks;
import cr0s.warpdrive.block.TileEntityAbstractInterfaced;
import cr0s.warpdrive.block.movement.BlockShipCore;
import cr0s.warpdrive.block.movement.TileEntityShipCore;
import cr0s.warpdrive.config.Dictionary;
import cr0s.warpdrive.config.WarpDriveConfig;
@ -49,6 +50,7 @@ import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.Optional;
import javax.annotation.Nonnull;
@ -429,7 +431,7 @@ public class TileEntityShipScanner extends TileEntityAbstractInterfaced implemen
final double distance = MathHelper.sqrt_double(dX * dX + dY * dY + dZ * dZ);
if (distance > WarpDriveConfig.SS_MAX_DEPLOY_RADIUS_BLOCKS) {
reason.append(String.format("Cannot deploy ship more than %d blocks away from scanner.", WarpDriveConfig.SS_MAX_DEPLOY_RADIUS_BLOCKS));
reason.append(String.format("§cCannot deploy ship more than %d blocks away from scanner.", WarpDriveConfig.SS_MAX_DEPLOY_RADIUS_BLOCKS));
return 5;
}
@ -447,14 +449,11 @@ public class TileEntityShipScanner extends TileEntityAbstractInterfaced implemen
Math.max(targetLocation1.getZ(), targetLocation2.getZ()) + 1);
if (isForced) {
if (!worldObj.isAirBlock(new BlockPos(targetX, targetY, targetZ))) {
worldObj.newExplosion(null, targetX, targetY, targetZ, 1, false, false);
if (!isShipCoreClear(worldObj, new BlockPos(targetX, targetY, targetZ), playerName, reason)) {
if (WarpDriveConfig.LOGGING_BUILDING) {
WarpDrive.logger.info(String.format("Deployment collision detected at (%d %d %d)",
targetX, targetY, targetZ));
}
reason.append(String.format("Deployment area occupied with existing ship.\nCan't deploy new ship at (%d %d %d)",
targetX, targetY, targetZ));
return 2;
}
@ -488,7 +487,7 @@ public class TileEntityShipScanner extends TileEntityAbstractInterfaced implemen
}
}
if (occupiedBlockCount > 0) {
reason.append(String.format("Deployment area occupied with %d blocks. Can't deploy ship.", occupiedBlockCount));
reason.append(String.format("§cDeployment area occupied with %d blocks. Can't deploy ship.", occupiedBlockCount));
return 2;
}
}
@ -503,6 +502,63 @@ public class TileEntityShipScanner extends TileEntityAbstractInterfaced implemen
return 3;
}
private static boolean isShipCoreClear(final World world, final BlockPos blockPos,
final String nameRequestingPlayer, final StringBuilder reason) {
final IBlockState blockState = world.getBlockState(blockPos);
if (blockState.getBlock().isAir(blockState, world, blockPos)) {
return true;
}
if (!(blockState.getBlock() instanceof BlockShipCore)) {
world.newExplosion(null, blockPos.getX(), blockPos.getY(), blockPos.getZ(),
1, false, false);
reason.append(String.format("§cDeployment area occupied by %s.\nCan't deploy new ship at (%d %d %d)",
blockState.getBlock().getLocalizedName(),
blockPos.getX(), blockPos.getY(), blockPos.getZ()));
return false;
}
final TileEntity tileEntity = world.getTileEntity(blockPos);
if (!(tileEntity instanceof TileEntityShipCore)) {
reason.append(String.format("§cDeployment area occupied with invalid tile entity %s for ship core.\nContact an admin for help at (%d %d %d)",
tileEntity,
blockPos.getX(), blockPos.getY(), blockPos.getZ()));
WarpDrive.logger.error(reason.toString());
world.newExplosion(null, blockPos.getX(), blockPos.getY(), blockPos.getZ(),
1, false, false);
return false;
}
final TileEntityShipCore tileEntityShipCore = (TileEntityShipCore) tileEntity;
final String namePlayersAboard = tileEntityShipCore.getAllPlayersOnShip();
if (!namePlayersAboard.isEmpty()) {
reason.append(String.format("§cDeployment area occupied by active crew %s.\n§6Please wait or use another deployment spot",
namePlayersAboard));
return false;
}
if (tileEntityShipCore.isBooting()) {
reason.append("§cDeployment area is busy.\n§6Please try again in a few seconds.");
return false;
}
final String nameOnlineCrew = tileEntityShipCore.getFirstOnlineCrew();
if (nameOnlineCrew == null || nameOnlineCrew.isEmpty()) {
return true;
}
if (nameOnlineCrew.equals(nameRequestingPlayer)) {
reason.append(String.format("§cDeployment area occupied by your ship, captain %s!\n§2Come back inside and use the computer to jump away!",
nameOnlineCrew));
return false;
}
reason.append(String.format("§cDeployment area occupied with ship owned by %s.\n§6Contact that player or use another deployment spot",
nameOnlineCrew));
return false;
}
@Override
public void readFromNBT(final NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound);

View file

@ -23,6 +23,7 @@ import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
public abstract class TileEntityAbstractMiner extends TileEntityAbstractLaser {
// machine type
protected EnumFacing laserOutputSide = EnumFacing.NORTH;
@ -37,8 +38,8 @@ public abstract class TileEntityAbstractMiner extends TileEntityAbstractLaser {
}
@Override
public void validate() {
super.validate();
protected void onFirstUpdateTick() {
super.onFirstUpdateTick();
laserOutput = new Vector3(this).translate(0.5D).translate(laserOutputSide, 0.5D);
}

View file

@ -28,7 +28,7 @@ public class ItemBlockDecorative extends ItemBlockAbstractBase {
throw new IllegalArgumentException(String.format("Invalid damage %d for %s", damage, itemStack.getItem()));
}
ResourceLocation resourceLocation = getRegistryName();
String variant = String.format("type=%s", EnumDecorativeType.get( itemStack.getItemDamage() ).getUnlocalizedName());
String variant = String.format("type=%s", EnumDecorativeType.get( itemStack.getItemDamage() ).getName());
return new ModelResourceLocation(resourceLocation, variant);
}
@ -38,6 +38,6 @@ public class ItemBlockDecorative extends ItemBlockAbstractBase {
if (itemStack == null) {
return getUnlocalizedName();
}
return "tile.warpdrive.decoration.decorative." + EnumDecorativeType.get(itemStack.getItemDamage()).getUnlocalizedName();
return "tile.warpdrive.decoration.decorative." + EnumDecorativeType.get(itemStack.getItemDamage()).getName();
}
}

View file

@ -2,6 +2,7 @@ package cr0s.warpdrive.block.detection;
import cr0s.warpdrive.Commons;
import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.api.IVideoChannel;
import cr0s.warpdrive.block.BlockAbstractRotatingContainer;
import cr0s.warpdrive.data.CameraRegistryItem;
import cr0s.warpdrive.render.ClientCameraHandler;
@ -53,22 +54,31 @@ public class BlockMonitor extends BlockAbstractRotatingContainer {
final TileEntity tileEntity = world.getTileEntity(blockPos);
if (tileEntity instanceof TileEntityMonitor) {
// validate video channel
final int videoChannel = ((TileEntityMonitor) tileEntity).getVideoChannel();
final CameraRegistryItem camera = WarpDrive.cameras.getCameraByVideoChannel(world, videoChannel);
if (camera == null || entityPlayer.isSneaking()) {
if ( videoChannel < IVideoChannel.VIDEO_CHANNEL_MIN
|| videoChannel > IVideoChannel.VIDEO_CHANNEL_MAX ) {
Commons.addChatMessage(entityPlayer, ((TileEntityMonitor) tileEntity).getStatus());
return true;
} else {
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.monitor.viewingCamera",
videoChannel,
camera.position.getX(),
camera.position.getY(),
camera.position.getZ() ));
ClientCameraHandler.setupViewpoint(
camera.type, entityPlayer, entityPlayer.rotationYaw, entityPlayer.rotationPitch,
blockPos, blockState,
camera.position, world.getBlockState(camera.position));
}
// validate camera
final CameraRegistryItem camera = WarpDrive.cameras.getCameraByVideoChannel(world, videoChannel);
if ( camera == null
|| entityPlayer.isSneaking() ) {
Commons.addChatMessage(entityPlayer, ((TileEntityMonitor) tileEntity).getStatus());
return true;
}
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.monitor.viewing_camera",
videoChannel,
camera.position.getX(),
camera.position.getY(),
camera.position.getZ() ));
ClientCameraHandler.setupViewpoint(
camera.type, entityPlayer, entityPlayer.rotationYaw, entityPlayer.rotationPitch,
blockPos, blockState,
camera.position, world.getBlockState(camera.position));
}
}

View file

@ -97,9 +97,6 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
updateTicks--;
if (updateTicks <= 0) {
if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.info(this + " Updating cloaking state...");
}
updateTicks = ((tier == 1) ? 20 : (tier == 2) ? 10 : 20) * WarpDriveConfig.CLOAKING_FIELD_REFRESH_INTERVAL_SECONDS; // resetting timer
isRefreshNeeded = validateAssembly();
@ -141,9 +138,7 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
if (area != null) {
area.sendCloakPacketToPlayersEx(false); // re-cloak field
} else {
if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.info("getCloakedArea1 returned null for " + worldObj + " " + pos.getX() + " " + pos.getY() + " " + pos.getZ());
}
WarpDrive.logger.error("getCloakedArea1 returned null for " + worldObj + " " + pos.getX() + " " + pos.getY() + " " + pos.getZ());
}
} else {// enabled, not cloaking and not able to
@ -162,15 +157,19 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
} else {// enabled, cloaking and valid
if (hasEnoughPower) {// enabled, cloaking and able to
if (isRefreshNeeded) {
WarpDrive.cloaks.updateCloakedArea(worldObj,
worldObj.provider.getDimension(), pos, tier,
minX, minY, minZ, maxX, maxY, maxZ);
}
// IDLE
// Refresh the field (workaround to re-synchronize players since client may 'eat up' the packets)
final CloakedArea area = WarpDrive.cloaks.getCloakedArea(worldObj, pos);
if (area != null) {
area.sendCloakPacketToPlayersEx(false); // re-cloak field
} else {
if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.info("getCloakedArea2 returned null for " + worldObj + " " + pos.getX() + " " + pos.getY() + " " + pos.getZ());
}
WarpDrive.logger.error("getCloakedArea2 returned null for " + worldObj + " " + pos.getX() + " " + pos.getY() + " " + pos.getZ());
}
setCoilsState(true);
@ -252,8 +251,9 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
pos.getX() + 0.5D + distanceOuterCoils_blocks[direction.ordinal()] * direction.getFrontOffsetX(),
pos.getY() + 0.5D + distanceOuterCoils_blocks[direction.ordinal()] * direction.getFrontOffsetY(),
pos.getZ() + 0.5D + distanceOuterCoils_blocks[direction.ordinal()] * direction.getFrontOffsetZ()),
r, g, b, LASER_DURATION_TICKS, 0,
new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ));
r, g, b,
LASER_DURATION_TICKS,
new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ));
}
}
@ -282,7 +282,8 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
pos.getX() + 0.5D + (DISTANCE_INNER_COILS_BLOCKS + 0.3D) * stop .getFrontOffsetX() + 0.2D * start.getFrontOffsetX(),
pos.getY() + 0.5D + (DISTANCE_INNER_COILS_BLOCKS + 0.3D) * stop .getFrontOffsetY() + 0.2D * start.getFrontOffsetY(),
pos.getZ() + 0.5D + (DISTANCE_INNER_COILS_BLOCKS + 0.3D) * stop .getFrontOffsetZ() + 0.2D * start.getFrontOffsetZ()),
r, g, b, LASER_DURATION_TICKS, 0,
r, g, b,
LASER_DURATION_TICKS,
new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ));
}
}
@ -422,13 +423,13 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
// build status message
final float integrity = countIntegrity / 13.0F;
if (messageInnerCoils.length() > 0 && messageOuterCoils.length() > 0) {
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.missingInnerAndOuter",
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.missing_channeling_and_projecting_coils",
Math.round(100.0F * integrity), messageInnerCoils, messageOuterCoils).toString();
} else if (messageInnerCoils.length() > 0) {
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.missingInner",
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.missing_channeling_coils",
Math.round(100.0F * integrity), messageInnerCoils).toString();
} else if (messageOuterCoils.length() > 0) {
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.missingOuter",
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.missing_projecting_coils",
Math.round(100.0F * integrity), messageOuterCoils).toString();
} else {
messageValidityIssues = new TextComponentTranslation("warpdrive.cloaking_core.valid").toString();
@ -458,7 +459,7 @@ public class TileEntityCloakingCore extends TileEntityAbstractEnergy {
} else if (!isEnabled) {
unlocalizedStatus = "warpdrive.cloaking_core.disabled";
} else if (!isCloaking) {
unlocalizedStatus = "warpdrive.cloaking_core.lowPower";
unlocalizedStatus = "warpdrive.cloaking_core.low_power";
} else {
unlocalizedStatus = "warpdrive.cloaking_core.cloaking";
}

View file

@ -226,16 +226,16 @@ public class BlockEnergyBank extends BlockAbstractContainer implements IExplosio
switch (tileEntityEnergyBank.getMode(side)) {
case INPUT:
Commons.addChatMessage(entityPlayer, Commons.getChatPrefix(itemStack)
.appendSibling(new TextComponentTranslation("warpdrive.energy.side.changedToInput", side.name())));
.appendSibling(new TextComponentTranslation("warpdrive.energy.side.changed_to_input", side.name())));
return true;
case OUTPUT:
Commons.addChatMessage(entityPlayer, Commons.getChatPrefix(itemStack)
.appendSibling(new TextComponentTranslation("warpdrive.energy.side.changedToOutput", side.name())));
.appendSibling(new TextComponentTranslation("warpdrive.energy.side.changed_to_output", side.name())));
return true;
case DISABLED:
default:
Commons.addChatMessage(entityPlayer, Commons.getChatPrefix(itemStack)
.appendSibling(new TextComponentTranslation("warpdrive.energy.side.changedToDisabled", side.name())));
.appendSibling(new TextComponentTranslation("warpdrive.energy.side.changed_to_disabled", side.name())));
return true;
}
}

View file

@ -190,14 +190,13 @@ public class TileEntityIC2reactorLaserMonitor extends TileEntityAbstractLaser {
return super.getStatus();
}
final IReactor reactor = findReactor();
if (reactor != null) {
if (facing != null) {
return super.getStatus()
.appendSibling(new TextComponentTranslation("warpdrive.ic2_reactor_laser_monitor.multipleReactors",
1));
.appendSibling(new TextComponentTranslation("warpdrive.ic2_reactor_laser_monitor.reactor_found",
facing.name().toLowerCase()));
} else {
return super.getStatus()
.appendSibling(new TextComponentTranslation("warpdrive.ic2_reactor_laser_monitor.noReactor"));
.appendSibling(new TextComponentTranslation("warpdrive.ic2_reactor_laser_monitor.no_reactor"));
}
}
}

View file

@ -153,7 +153,7 @@ public class BlockForceField extends BlockAbstractForceField implements IDamageR
ClientProxy.modelInitialisation(item);
// register camouflage
for (Integer integer : FREQUENCY.getAllowedValues()) {
for (final Integer integer : FREQUENCY.getAllowedValues()) {
final String variant = String.format("%s=%d", FREQUENCY.getName(), integer);
ModelBakeEventHandler.registerBakedModel(new ModelResourceLocation(getRegistryName(), variant), BakedModelCamouflage.class);
}

View file

@ -245,7 +245,7 @@ public class BlockForceFieldProjector extends BlockAbstractForceField {
if (enumForceFieldUpgrade == EnumForceFieldUpgrade.NONE) {
// no more upgrades to dismount
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.noUpgradeToDismount"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.no_upgrade_to_dismount"));
return true;
}
@ -275,16 +275,16 @@ public class BlockForceFieldProjector extends BlockAbstractForceField {
tileEntityForceFieldProjector.setShape(EnumForceFieldShape.NONE);
// shape dismounted
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.shapeDismounted"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.shape_dismounted"));
} else {
// wrong side
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.wrongShapeSide"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.wrong_shape_side"));
return true;
}
} else {
// no shape to dismount
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.noShapeToDismount"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.no_shape_to_dismount"));
return true;
}
}
@ -301,7 +301,7 @@ public class BlockForceFieldProjector extends BlockAbstractForceField {
// not enough shape items
Commons.addChatMessage(entityPlayer, new TextComponentTranslation(
tileEntityForceFieldProjector.isDoubleSided ?
"warpdrive.upgrade.result.notEnoughShapes.double" : "warpdrive.upgrade.result.notEnoughShapes.single"));
"warpdrive.upgrade.result.not_enough_shapes.double" : "warpdrive.upgrade.result.not_enough_shapes.single"));
return true;
}
@ -320,11 +320,11 @@ public class BlockForceFieldProjector extends BlockAbstractForceField {
// mount the new shape item(s)
tileEntityForceFieldProjector.setShape(EnumForceFieldShape.get(itemStackHeld.getItemDamage()));
// shape mounted
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.shapeMounted"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.shape_mounted"));
} else {
// wrong side
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.wrongShapeSide"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.wrong_shape_side"));
return true;
}
@ -332,12 +332,12 @@ public class BlockForceFieldProjector extends BlockAbstractForceField {
// validate type
if (tileEntityForceFieldProjector.getUpgradeMaxCount(enumForceFieldUpgrade) <= 0) {
// invalid upgrade type
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.invalidProjectorUpgrade"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.invalid_upgrade_for_projector"));
return true;
}
if (!tileEntityForceFieldProjector.canUpgrade(enumForceFieldUpgrade)) {
// too many upgrades
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.tooManyUpgrades",
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.too_many_upgrades",
tileEntityForceFieldProjector.getUpgradeMaxCount(enumForceFieldUpgrade)));
return true;
}
@ -346,7 +346,7 @@ public class BlockForceFieldProjector extends BlockAbstractForceField {
// validate quantity
if (itemStackHeld.stackSize < 1) {
// not enough upgrade items
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.notEnoughUpgrades"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.not_enough_upgrades"));
return true;
}

View file

@ -124,7 +124,7 @@ public class BlockForceFieldRelay extends BlockAbstractForceField {
} else {
// no more upgrades to dismount
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.noUpgradeToDismount"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.no_upgrade_to_dismount"));
return true;
}
@ -136,7 +136,7 @@ public class BlockForceFieldRelay extends BlockAbstractForceField {
// validate type
if (EnumForceFieldUpgrade.get(itemStackHeld.getItemDamage()).maxCountOnRelay <= 0) {
// invalid upgrade type
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.invalidRelayUpgrade"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.invalid_upgrade_for_relay"));
return true;
}
@ -144,7 +144,7 @@ public class BlockForceFieldRelay extends BlockAbstractForceField {
// validate quantity
if (itemStackHeld.stackSize < 1) {
// not enough upgrade items
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.notEnoughUpgrades"));
Commons.addChatMessage(entityPlayer, new TextComponentTranslation("warpdrive.upgrade.result.not_enough_upgrades"));
return true;
}

View file

@ -75,8 +75,8 @@ public class TileEntityAbstractForceField extends TileEntityAbstractEnergy imple
@Override
public void invalidate() {
super.invalidate();
ForceFieldRegistry.removeFromRegistry(this);
super.invalidate();
}
@Override

View file

@ -33,30 +33,31 @@ public class TileEntityForceField extends TileEntityAbstractBase {
@Override
public void readFromNBT(final NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound);
if (tagCompound.hasKey("projector")) {
if (tagCompound.hasKey("projector")) {// are we server side and is it a valid force field block?
vProjector = VectorI.createFromNBT(tagCompound.getCompoundTag("projector"));
cache_beamFrequency = tagCompound.getInteger(IBeamFrequency.BEAM_FREQUENCY_TAG);
if (tagCompound.hasKey("camouflageBlock")) {
try {
cache_blockStateCamouflage = Block.getBlockFromName(tagCompound.getString("camouflageBlock")).getStateFromMeta(tagCompound.getByte("camouflageMeta"));
cache_colorMultiplierCamouflage = tagCompound.getInteger("camouflageColorMultiplier");
cache_lightCamouflage = tagCompound.getByte("camouflageLight");
if (Dictionary.BLOCKS_NOCAMOUFLAGE.contains(cache_blockStateCamouflage.getBlock())) {
cache_blockStateCamouflage = null;
cache_colorMultiplierCamouflage = 0;
cache_lightCamouflage = 0;
}
} catch (final Exception exception) {
exception.printStackTrace();
} else {
vProjector = null;
cache_beamFrequency = -1;
}
if (tagCompound.hasKey("camouflage")) {
final NBTTagCompound nbtCamouflage = tagCompound.getCompoundTag("camouflage");
try {
cache_blockStateCamouflage = Block.getBlockFromName(nbtCamouflage.getString("block")).getStateFromMeta(nbtCamouflage.getByte("meta"));
cache_colorMultiplierCamouflage = nbtCamouflage.getInteger("color");
cache_lightCamouflage = nbtCamouflage.getByte("light");
if (Dictionary.BLOCKS_NOCAMOUFLAGE.contains(cache_blockStateCamouflage.getBlock())) {
cache_blockStateCamouflage = null;
cache_colorMultiplierCamouflage = 0;
cache_lightCamouflage = 0;
}
} else {
} catch (final Exception exception) {
exception.printStackTrace();
cache_blockStateCamouflage = null;
cache_colorMultiplierCamouflage = 0;
cache_lightCamouflage = 0;
}
} else {
vProjector = null;
cache_beamFrequency = -1;
cache_blockStateCamouflage = null;
cache_colorMultiplierCamouflage = 0;
cache_lightCamouflage = 0;
@ -71,10 +72,12 @@ public class TileEntityForceField extends TileEntityAbstractBase {
tagCompound.setTag("projector", vProjector.writeToNBT(new NBTTagCompound()));
tagCompound.setInteger(IBeamFrequency.BEAM_FREQUENCY_TAG, cache_beamFrequency);
if (cache_blockStateCamouflage != null) {
tagCompound.setString("camouflageBlock", cache_blockStateCamouflage.getBlock().getRegistryName().toString());
tagCompound.setByte("camouflageMeta", (byte) cache_blockStateCamouflage.getBlock().getMetaFromState(cache_blockStateCamouflage));
tagCompound.setInteger("camouflageColorMultiplier", cache_colorMultiplierCamouflage);
tagCompound.setByte("camouflageLight", (byte) cache_lightCamouflage);
final NBTTagCompound nbtCamouflage = new NBTTagCompound();
nbtCamouflage.setString("block", cache_blockStateCamouflage.getBlock().getRegistryName().toString());
nbtCamouflage.setByte("meta", (byte) cache_blockStateCamouflage.getBlock().getMetaFromState(cache_blockStateCamouflage));
nbtCamouflage.setInteger("color", cache_colorMultiplierCamouflage);
nbtCamouflage.setByte("light", (byte) cache_lightCamouflage);
tagCompound.setTag("camouflage", nbtCamouflage);
}
}
return tagCompound;
@ -84,6 +87,10 @@ public class TileEntityForceField extends TileEntityAbstractBase {
@Override
public NBTTagCompound getUpdateTag() {
final NBTTagCompound tagCompound = writeToNBT(super.getUpdateTag());
tagCompound.removeTag("projector");
tagCompound.removeTag(IBeamFrequency.BEAM_FREQUENCY_TAG);
return tagCompound;
}

View file

@ -22,6 +22,7 @@ import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import javax.annotation.Nonnull;
import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
@ -29,11 +30,11 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicBoolean;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLiquid;
import net.minecraft.block.BlockStaticLiquid;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
@ -54,7 +55,8 @@ import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidBlock;
import net.minecraftforge.fml.common.Optional;
public class TileEntityForceFieldProjector extends TileEntityAbstractForceField {
@ -113,6 +115,9 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
// currently placed forcefield blocks
private final Set<VectorI> vForceFields = new HashSet<>();
// schedule removal/destruction in main thread
final CopyOnWriteArraySet<VectorI> vForceFields_forRemoval = new CopyOnWriteArraySet<>();
public TileEntityForceFieldProjector() {
super();
IC2_sinkTier = 4;
@ -181,13 +186,16 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
guideTicks--;
}
// remove from main thread
doScheduledForceFieldRemoval();
// Powered ?
final ForceFieldSetup forceFieldSetup = getForceFieldSetup();
final int energyRequired;
if (!legacy_isOn) {
energyRequired = (int)Math.round(forceFieldSetup.startupEnergyCost + forceFieldSetup.placeEnergyCost * forceFieldSetup.placeSpeed * PROJECTOR_PROJECTION_UPDATE_TICKS / 20.0F);
energyRequired = (int) Math.round(forceFieldSetup.startupEnergyCost + forceFieldSetup.placeEnergyCost * forceFieldSetup.placeSpeed * PROJECTOR_PROJECTION_UPDATE_TICKS / 20.0F);
} else {
energyRequired = (int)Math.round( forceFieldSetup.scanEnergyCost * forceFieldSetup.scanSpeed * PROJECTOR_PROJECTION_UPDATE_TICKS / 20.0F);
energyRequired = (int) Math.round( forceFieldSetup.scanEnergyCost * forceFieldSetup.scanSpeed * PROJECTOR_PROJECTION_UPDATE_TICKS / 20.0F);
}
if (energyRequired > energy_getMaxStorage()) {
WarpDrive.logger.error("Force field projector requires " + energyRequired + " to get started but can only store " + energy_getMaxStorage());
@ -253,14 +261,14 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
cooldownTicks = PROJECTOR_COOLDOWN_TICKS;
guideTicks = 0;
}
destroyForceField(false);
destroyForceField();
if (isEnabledAndValid) {
if (guideTicks <= 0) {
guideTicks = PROJECTOR_GUIDE_UPDATE_TICKS;
final ITextComponent msg = Commons.getChatPrefix(getBlockType())
.appendSibling(new TextComponentTranslation("warpdrive.forcefield.guide.lowPower"));
.appendSibling(new TextComponentTranslation("warpdrive.forcefield.guide.low_power"));
final AxisAlignedBB axisalignedbb = new AxisAlignedBB(pos.getX() - 10, pos.getY() - 10, pos.getZ() - 10, pos.getX() + 10, pos.getY() + 10, pos.getZ() + 10);
final List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(null, axisalignedbb);
@ -280,8 +288,13 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
@Override
public void invalidate() {
destroyForceField();
try {
doScheduledForceFieldRemoval();
} catch (final Exception exception) {
exception.printStackTrace();
}
super.invalidate();
destroyForceField(true);
}
public boolean isValid() {
@ -397,7 +410,9 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
vector = iteratorForcefield.next();
if (!worldObj.isBlockLoaded(vector.getBlockPos(), false) || !worldObj.getChunkFromBlockCoords(vector.getBlockPos()).isLoaded()) {
// skip non loaded chunks
if ( !worldObj.isBlockLoaded(vector.getBlockPos(), false)
|| !worldObj.getChunkFromBlockCoords(vector.getBlockPos()).isLoaded() ) {
continue;
}
@ -414,6 +429,8 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
}
}
Fluid fluid = null;
// skip if block properties prevents it
if ( doProjectThisBlock
&& (blockState.getBlock() != Blocks.TALLGRASS)
@ -421,9 +438,38 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
&& !Dictionary.BLOCKS_EXPANDABLE.contains(blockState.getBlock()) ) {
// MFR laser is unbreakable and replaceable
// Liquid, vine and snow are replaceable
if (blockState.getBlock() instanceof BlockLiquid) {
final Fluid fluid = FluidRegistry.lookupFluidForBlock(blockState.getBlock());
doProjectThisBlock = fluid == null || forceFieldSetup.pumping_maxViscosity >= fluid.getViscosity();
final Block block = blockState.getBlock();
if ( block instanceof BlockLiquid
|| block instanceof IFluidBlock ) {
// BlockLiquid remapped by CoFH
// minecraft:flowing_water:0 = source
// minecraft:flowing_water:1 2 = flow
// minecraft:flowing_lava:1 2 4 6 = flow
// BlockLiquid in Vanilla ?
// minecraft:water:1 =
// minecraft:lava:6 =
fluid = block instanceof IFluidBlock ? ((IFluidBlock) block).getFluid() : Commons.fluid_getByBlock(block);
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info(String.format("Block %s %s Fluid %s with viscosity %d, projector max is %.1f: %s %s",
block.getUnlocalizedName(),
blockState,
fluid == null ? null : fluid.getName(),
fluid == null ? 0 : fluid.getViscosity(),
forceFieldSetup.pumping_maxViscosity,
block, fluid));
}
if (fluid == null) {
if ((worldObj.getWorldTime() & 0xFF) == 0) {
WarpDrive.logger.error(String.format("Block %s %s is not a valid fluid! %s",
block.getUnlocalizedName(),
blockState,
block));
}
doProjectThisBlock = false;
} else {
doProjectThisBlock = forceFieldSetup.pumping_maxViscosity >= fluid.getViscosity();
}
} else if (forceFieldSetup.breaking_maxHardness > 0) {
final float blockHardness = blockState.getBlockHardness(worldObj, vector.getBlockPos());
@ -482,9 +528,9 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
if (doProjectThisBlock) {
if ((blockState.getBlock() != WarpDrive.blockForceFields[tier - 1]) && (!vector.equals(this))) {
boolean hasPlaced = false;
if (blockState.getBlock() instanceof BlockLiquid) {
if (fluid != null) {
hasPlaced = true;
doPumping(forceFieldSetup, blockStateForceField, vector, blockState);
doPumping(forceFieldSetup, blockStateForceField, vector, blockState, fluid);
} else if (forceFieldSetup.breaking_maxHardness > 0) {
hasPlaced = true;
@ -548,13 +594,38 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
}
}
private void doPumping(final ForceFieldSetup forceFieldSetup, final IBlockState blockStateForceField, final VectorI vector, final IBlockState blockState) {
if (blockState.getBlock() instanceof BlockStaticLiquid) {// it's a source block
// TODO collect fluid
private void doPumping(final ForceFieldSetup forceFieldSetup, final IBlockState blockStateForceField, final VectorI vector,
final IBlockState blockState,
final Fluid fluid) {
final Block block = blockState.getBlock();
final int metadata = block.getMetaFromState(blockState);
final boolean isForceFluid = block instanceof IFluidBlock;
final boolean isSourceBlock = ( block instanceof BlockLiquid
&& metadata == 0 )
|| ( isForceFluid
&& ((IFluidBlock) block).canDrain(worldObj, vector.getBlockPos()) );
if (isSourceBlock) {
final FluidStack fluidStack;
if (isForceFluid) {
fluidStack = ((IFluidBlock) block).drain(worldObj, vector.getBlockPos(), true);
} else {
fluidStack = new FluidStack(fluid, 1000);
}
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info("Fluid source found! " + fluidStack.getUnlocalizedName() + " x " + fluidStack.amount + " mL");
}
// @TODO store fluid using IFluidHandler
} else {
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info("Fluid flow found! " + fluid.getUnlocalizedName());
}
}
if (forceFieldSetup.isInverted || forceFieldSetup.breaking_maxHardness > 0) {
worldObj.setBlockState(vector.getBlockPos(), Blocks.AIR.getDefaultState(), 2);
if (!(isForceFluid && isSourceBlock)) {
worldObj.setBlockState(vector.getBlockPos(), Blocks.AIR.getDefaultState(), 2);
}
} else {
worldObj.setBlockState(vector.getBlockPos(), blockStateForceField, 2);
@ -698,46 +769,73 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
return false;
}
private void destroyForceField(final boolean isChunkLoading) {
private void destroyForceField() {
if (worldObj == null || worldObj.isRemote) {
return;
}
if (legacy_isOn) {
// invalidate() can be multi-threaded, so we're delaying the destruction
if (!Commons.isSafeThread()) {
vForceFields_forRemoval.addAll(vForceFields);
vForceFields.clear();
// add calculated blocks only once
if ( isCalculated()
&& vForceFields_forRemoval.size() < calculated_forceField.size() ) {
vForceFields_forRemoval.addAll(calculated_forceField);
}
// force a reboot
legacy_isOn = false;
markDirty();
return;
}
if (!vForceFields.isEmpty()) {
// invalidate() can be multi-threaded, so we're working with a copy of the collection
final VectorI[] vForceFields_cache = vForceFields.toArray(new VectorI[0]);
vForceFields.clear();
for (final VectorI vector : vForceFields_cache) {
if (!isChunkLoading) {
if (!(worldObj.isBlockLoaded(vector.getBlockPos(), false))) {// chunk is not loaded, skip it
continue;
}
if (!worldObj.getChunkFromBlockCoords(vector.getBlockPos()).isLoaded()) {// chunk is unloading, skip it
continue;
}
}
final IBlockState blockState = vector.getBlockState(worldObj);
if (blockState.getBlock() == WarpDrive.blockForceFields[tier - 1]) {
worldObj.setBlockToAir(vector.getBlockPos());
}
}
if (isCalculated()) {
for (final VectorI vector : calculated_forceField) {
final Block block = vector.getBlock(worldObj);
if (block == WarpDrive.blockForceFields[tier - 1]) {
final TileEntity tileEntity = worldObj.getTileEntity(vector.getBlockPos());
if ( tileEntity instanceof TileEntityForceField
&& (((TileEntityForceField) tileEntity).getProjector() == this) ) {
worldObj.setBlockToAir(vector.getBlockPos());
}
}
}
}
}
if (isCalculated() && isChunkLoading) {
for (final VectorI vector : calculated_forceField) {
final IBlockState blockState = vector.getBlockState(worldObj);
if (blockState.getBlock() == WarpDrive.blockForceFields[tier - 1]) {
final TileEntity tileEntity = worldObj.getTileEntity(vector.getBlockPos());
if (tileEntity instanceof TileEntityForceField && (((TileEntityForceField) tileEntity).getProjector() == this)) {
worldObj.setBlockToAir(vector.getBlockPos());
}
// force a reboot
legacy_isOn = false;
}
private void doScheduledForceFieldRemoval() {
if (!Commons.isSafeThread()) {
WarpDrive.logger.warn("Removing force field blocks outside main thread, bad things may happen...");
}
final VectorI[] vForceFields_cache = vForceFields_forRemoval.toArray(new VectorI[0]);
vForceFields_forRemoval.clear();
for (final VectorI vector : vForceFields_cache) {
final IBlockState blockState = vector.getBlockState(worldObj);
if (blockState.getBlock() == WarpDrive.blockForceFields[tier - 1]) {
final TileEntity tileEntity = worldObj.getTileEntity(vector.getBlockPos());
if ( tileEntity instanceof TileEntityForceField
&& (((TileEntityForceField) tileEntity).getProjector() == this) ) {
worldObj.setBlockToAir(vector.getBlockPos());
}
}
}
@ -753,11 +851,9 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
}
@Override
public void setBeamFrequency(final int parBeamFrequency) {
super.setBeamFrequency(parBeamFrequency);
public void setBeamFrequency(final int beamFrequency) {
super.setBeamFrequency(beamFrequency);
cache_forceFieldSetup = null;
isDirty.set(true);
destroyForceField(false);
}
public Vector3 getMin() {
@ -827,10 +923,10 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
this.rotationYaw = Commons.clamp( -45.0F, +45.0F, rotationYaw);
this.rotationPitch = Commons.clamp( -45.0F, +45.0F, rotationPitch);
this.rotationRoll = (rotationRoll + 720.0F) % 360.0F - 180.0F;
if (oldYaw != this.rotationYaw || oldPitch != this.rotationPitch || oldRoll != this.rotationRoll) {
isDirty.set(true);
destroyForceField(false);
markDirty();
if ( oldYaw != this.rotationYaw
|| oldPitch != this.rotationPitch
|| oldRoll != this.rotationRoll ) {
cache_forceFieldSetup = null;
}
}
@ -842,12 +938,12 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
}
void setShape(final EnumForceFieldShape shape) {
this.shape = shape;
cache_forceFieldSetup = null;
isDirty.set(true);
markDirty();
if (hasWorldObj()) {
destroyForceField(false);
if (this.shape != shape) {
this.shape = shape;
cache_forceFieldSetup = null;
// refresh block rendering
markDirty();
}
}
@ -876,15 +972,17 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
}
private void setTranslation(final float x, final float y, final float z) {
final Vector3 oldTranslation = this.v3Translation;
v3Translation = new Vector3(Commons.clamp(-1.0D, 1.0D, x), Commons.clamp(-1.0D, 1.0D, y), Commons.clamp(-1.0D, 1.0D, z));
if (!oldTranslation.equals(v3Translation)) {
cache_forceFieldSetup = null;
}
}
@Override
public boolean mountUpgrade(final Object upgrade) {
if (super.mountUpgrade(upgrade)) {
cache_forceFieldSetup = null;
isDirty.set(true);
destroyForceField(false);
return true;
}
return false;
@ -894,8 +992,6 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
public boolean dismountUpgrade(final Object upgrade) {
if (super.dismountUpgrade(upgrade)) {
cache_forceFieldSetup = null;
isDirty.set(true);
destroyForceField(false);
return true;
}
return false;
@ -1005,6 +1101,11 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
public ForceFieldSetup getForceFieldSetup() {
if (cache_forceFieldSetup == null) {
// don't try until projector has initialised (see: entities colliding with the world during chunk loading)
if (isFirstTick()) {
return null;
}
cache_forceFieldSetup = new ForceFieldSetup(worldObj.provider.getDimension(), pos, tier, beamFrequency);
setupTicks = Math.max(setupTicks, 10);
@ -1017,7 +1118,7 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info(this + " rebooting with new rendering...");
}
destroyForceField(true);
destroyForceField();
} else if ( legacy_forceFieldSetup.isInverted != cache_forceFieldSetup.isInverted
|| legacy_forceFieldSetup.shapeProvider != cache_forceFieldSetup.shapeProvider
@ -1025,11 +1126,14 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
|| !legacy_forceFieldSetup.vMin.equals(cache_forceFieldSetup.vMin)
|| !legacy_forceFieldSetup.vMax.equals(cache_forceFieldSetup.vMax)
|| !legacy_forceFieldSetup.vTranslation.equals(cache_forceFieldSetup.vTranslation)
|| (legacy_forceFieldSetup.breaking_maxHardness <= 0 && cache_forceFieldSetup.breaking_maxHardness > 0) ) {
|| legacy_forceFieldSetup.rotationYaw != cache_forceFieldSetup.rotationYaw
|| legacy_forceFieldSetup.rotationPitch != cache_forceFieldSetup.rotationPitch
|| legacy_forceFieldSetup.rotationRoll != cache_forceFieldSetup.rotationRoll
|| (legacy_forceFieldSetup.breaking_maxHardness <= 0 && cache_forceFieldSetup.breaking_maxHardness > 0) ) {
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.info(this + " rebooting with new shape...");
}
destroyForceField(true);
destroyForceField();
isDirty.set(true);
}
}
@ -1177,24 +1281,33 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
}
private class ThreadCalculation extends Thread {
private final TileEntityForceFieldProjector projector;
private final WeakReference<TileEntityForceFieldProjector> weakProjector;
private final String stringProjector;
ThreadCalculation(final TileEntityForceFieldProjector projector) {
this.projector = projector;
this.weakProjector = new WeakReference<>(projector);
stringProjector = projector.toString();
}
@Override
public void run() {
TileEntityForceFieldProjector projector;
Set<VectorI> vPerimeterBlocks = null;
Set<VectorI> vInteriorBlocks = null;
// calculation start is done synchronously, by caller
try {
projector = weakProjector.get();
if ( projector != null
&& projector.isValid() ) {
// collect what we need, then release the object
final ForceFieldSetup forceFieldSetup = projector.getForceFieldSetup();
final int heightWorld = projector.worldObj.getHeight();
projector = null;
if (WarpDriveConfig.LOGGING_FORCEFIELD) {
WarpDrive.logger.debug(this + " Calculation started for " + projector);
WarpDrive.logger.debug(this + " Calculation started for " + stringProjector);
}
// create HashSets
@ -1205,18 +1318,20 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
// compute interior fields to remove overlapping parts
final Map<VectorI, Boolean> vertexes = forceFieldSetup.shapeProvider.getVertexes(forceFieldSetup);
if (vertexes.isEmpty()) {
WarpDrive.logger.error(this + " No vertexes for " + forceFieldSetup + " at " + projector);
WarpDrive.logger.error(this + " No vertexes for " + forceFieldSetup + " at " + stringProjector);
}
for (final Map.Entry<VectorI, Boolean> entry : vertexes.entrySet()) {
final VectorI vPosition = entry.getKey();
if (forceFieldSetup.isDoubleSided || vPosition.y >= 0) {
if ((forceFieldSetup.rotationYaw != 0.0F) || (forceFieldSetup.rotationPitch != 0.0F) || (forceFieldSetup.rotationRoll != 0.0F)) {
if ( (forceFieldSetup.rotationYaw != 0.0F)
|| (forceFieldSetup.rotationPitch != 0.0F)
|| (forceFieldSetup.rotationRoll != 0.0F) ) {
vPosition.rotateByAngle(forceFieldSetup.rotationYaw, forceFieldSetup.rotationPitch, forceFieldSetup.rotationRoll);
}
vPosition.translate(forceFieldSetup.vTranslation);
if (vPosition.y > 0 && vPosition.y <= projector.worldObj.getHeight()) {
if (vPosition.y > 0 && vPosition.y <= heightWorld) {
if (entry.getValue()) {
vPerimeterBlocks.add(vPosition);
} else {
@ -1245,10 +1360,13 @@ public class TileEntityForceFieldProjector extends TileEntityAbstractForceField
vInteriorBlocks = null;
vPerimeterBlocks = null;
exception.printStackTrace();
WarpDrive.logger.error(this + " Calculation failed for " + (projector == null ? "-null-" : projector.toString()));
WarpDrive.logger.error(this + " Calculation failed for " + stringProjector);
}
projector.calculation_done(vInteriorBlocks, vPerimeterBlocks);
projector = weakProjector.get();
if (projector != null) {
projector.calculation_done(vInteriorBlocks, vPerimeterBlocks);
}
}
}
}

View file

@ -223,8 +223,8 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced imple
@Override
public ITextComponent getStatus() {
return super.getStatus()
.appendSibling(new TextComponentTranslation("warpdrive.ship.attachedPlayers",
getAttachedPlayersList()));
.appendSibling(new TextComponentTranslation("warpdrive.ship.attached_players",
getAttachedPlayersList()));
}
private TileEntityShipCore findCoreBlock() {
@ -265,18 +265,18 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced imple
if (entityPlayer.getName().equals(name)) {
players.remove(i);
return Commons.getChatPrefix(getBlockType())
.appendSibling(new TextComponentTranslation("warpdrive.ship.playerDetached",
tileEntityShipCore != null && !tileEntityShipCore.shipName.isEmpty() ? tileEntityShipCore.shipName : "-",
getAttachedPlayersList()));
.appendSibling(new TextComponentTranslation("warpdrive.ship.player_detached",
tileEntityShipCore != null && !tileEntityShipCore.shipName.isEmpty() ? tileEntityShipCore.shipName : "-",
getAttachedPlayersList()));
}
}
entityPlayer.attackEntityFrom(DamageSource.generic, 1);
players.add(entityPlayer.getName());
return Commons.getChatPrefix(getBlockType())
.appendSibling(new TextComponentTranslation("warpdrive.ship.playerAttached",
tileEntityShipCore != null && !tileEntityShipCore.shipName.isEmpty() ? tileEntityShipCore.shipName : "-",
getAttachedPlayersList()));
.appendSibling(new TextComponentTranslation("warpdrive.ship.player_attached",
tileEntityShipCore != null && !tileEntityShipCore.shipName.isEmpty() ? tileEntityShipCore.shipName : "-",
getAttachedPlayersList()));
}
protected String getAttachedPlayersList() {

View file

@ -18,7 +18,6 @@ import cr0s.warpdrive.data.Vector3;
import cr0s.warpdrive.data.VectorI;
import cr0s.warpdrive.event.JumpSequencer;
import cr0s.warpdrive.render.EntityFXBoundingBox;
import cr0s.warpdrive.world.SpaceTeleporter;
import javax.annotation.Nonnull;
import java.lang.ref.WeakReference;
@ -49,7 +48,6 @@ import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@ -135,7 +133,13 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy implements ISta
}
return;
}
TileEntityShipController tileEntityShipController = tileEntityShipControllerWeakReference == null ? null : tileEntityShipControllerWeakReference.get();
if ( tileEntityShipController != null
&& tileEntityShipController.isInvalid() ) {
tileEntityShipControllerWeakReference = null;
tileEntityShipController = null;
}
// Always cooldown
if (cooldownTime_ticks > 0) {
@ -189,6 +193,9 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy implements ISta
WarpDrive.starMap.updateInRegistry(this);
final TileEntityShipController tileEntityShipControllerNew = findControllerBlock();
if (tileEntityShipControllerNew == null) {
tileEntityShipControllerWeakReference = null;
}
if (tileEntityShipControllerNew != tileEntityShipController) {
tileEntityShipController = tileEntityShipControllerNew;
tileEntityShipControllerWeakReference = new WeakReference<>(tileEntityShipController);
@ -200,8 +207,13 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy implements ISta
if (logTicks <= 0) {
logTicks = LOG_INTERVAL_TICKS;
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " controller is " + tileEntityShipController + ", warmupTime " + warmupTime_ticks + ", stateCurrent " + stateCurrent + ", jumpFlag "
+ (tileEntityShipController == null ? "NA" : tileEntityShipController.isEnabled) + ", cooldownTime " + cooldownTime_ticks);
WarpDrive.logger.info(String.format("%s %s, jumpFlag %s from %s, warmup %d, cooldown %d",
this,
stateCurrent,
tileEntityShipController == null ? "NA" : tileEntityShipController.isEnabled,
tileEntityShipController,
warmupTime_ticks,
cooldownTime_ticks));
}
}
@ -412,7 +424,9 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy implements ISta
return false;
}
final TileEntityShipController tileEntityShipController = tileEntityShipControllerWeakReference.get();
return tileEntityShipController != null && tileEntityShipController.getCommand() == EnumShipControllerCommand.OFFLINE;
return tileEntityShipController != null
&& !tileEntityShipController.isInvalid()
&& tileEntityShipController.getCommand() == EnumShipControllerCommand.OFFLINE;
}
protected boolean isAttached(final TileEntityShipController tileEntityShipControllerExpected) {
@ -460,6 +474,54 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy implements ISta
return stringBuilderResult.toString();
}
public boolean isBooting() {
if (bootTicks > 0) {
return true;
}
if (tileEntityShipControllerWeakReference == null) {// not attached
return false;
}
final TileEntityShipController tileEntityShipController = tileEntityShipControllerWeakReference.get();
if ( tileEntityShipController == null
|| tileEntityShipController.isInvalid() ) {// we're desync
// force a refresh
registryUpdateTicks = 0;
return true;
}
return false;
}
public String getFirstOnlineCrew() {
if (tileEntityShipControllerWeakReference == null) {// not attached
return null;
}
final TileEntityShipController tileEntityShipController = tileEntityShipControllerWeakReference.get();
if ( tileEntityShipController == null
|| tileEntityShipController.isInvalid() ) {// we're desync
// force a refresh
registryUpdateTicks = 0;
return "-busy-";
}
if (tileEntityShipController.players == null || tileEntityShipController.players.isEmpty()) {// no crew defined
return null;
}
for (final String namePlayer : tileEntityShipController.players) {
final EntityPlayer entityPlayer = Commons.getOnlinePlayerByName(namePlayer);
if (entityPlayer != null) {// crew member is online
return namePlayer;
}
}
// all cleared
return null;
}
private void updateIsolationState() {
// Search block in cube around core
final int xMin = pos.getX() - WarpDriveConfig.RADAR_MAX_ISOLATION_RANGE;
@ -629,19 +691,7 @@ public class TileEntityShipCore extends TileEntityAbstractEnergy implements ISta
private void summonPlayer(final EntityPlayerMP player, final BlockPos blockPos) {
if (energy_consume(WarpDriveConfig.SHIP_TELEPORT_ENERGY_PER_ENTITY, false)) {
if (player.dimension != worldObj.provider.getDimension()) {
player.mcServer.getPlayerList().transferPlayerToDimension(
player,
worldObj.provider.getDimension(),
new SpaceTeleporter(
DimensionManager.getWorld(worldObj.provider.getDimension()),
0,
MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)));
player.setPositionAndUpdate(blockPos.getX() + 0.5d, blockPos.getY(), blockPos.getZ() + 0.5d);
player.sendPlayerAbilities();
} else {
player.setPositionAndUpdate(blockPos.getX() + 0.5d, blockPos.getY(), blockPos.getZ() + 0.5d);
}
Commons.moveEntity(player, worldObj, new Vector3(blockPos.getX() + 0.5D, blockPos.getY(), blockPos.getZ() + 0.5D));
}
}

View file

@ -57,7 +57,7 @@ public class BlockLaserCamera extends BlockAbstractContainer {
Commons.addChatMessage(entityPlayer, ((TileEntityLaserCamera) tileEntity).getStatus());
} else {
Commons.addChatMessage(entityPlayer, Commons.getChatPrefix(this)
.appendSibling(new TextComponentTranslation("warpdrive.error.badTileEntity")));
.appendSibling(new TextComponentTranslation("warpdrive.error.bad_tile_entity")));
WarpDrive.logger.error("Block " + this + " with invalid tile entity " + tileEntity);
}
return false;

View file

@ -54,7 +54,7 @@ public class BlockWeaponController extends BlockAbstractContainer {
Commons.addChatMessage(entityPlayer, ((TileEntityWeaponController) tileEntity).getStatus());
} else {
Commons.addChatMessage(entityPlayer, Commons.getChatPrefix(this)
.appendSibling(new TextComponentTranslation("warpdrive.error.badTileEntity")));
.appendSibling(new TextComponentTranslation("warpdrive.error.bad_tile_entity")));
WarpDrive.logger.error("Block " + this + " with invalid tile entity " + tileEntity);
}
return true;

View file

@ -3,7 +3,6 @@ package cr0s.warpdrive.config;
import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.block.BlockAbstractBase;
import cr0s.warpdrive.block.BlockAbstractContainer;
import cr0s.warpdrive.block.forcefield.BlockForceFieldProjector;
import cr0s.warpdrive.block.hull.BlockHullGlass;
import cr0s.warpdrive.block.hull.BlockHullSlab;
import cr0s.warpdrive.block.hull.BlockHullStairs;
@ -514,12 +513,13 @@ public class Dictionary {
for (final ResourceLocation resourceLocation : Block.REGISTRY.getKeys()) {
final Block block = Block.REGISTRY.getObject(resourceLocation);
WarpDrive.logger.debug("Checking block registry for '" + resourceLocation + "': " + block);
// get hardness and blast resistance
float hardness = -2.0F;
if (WarpDrive.fieldBlockHardness != null) {
// WarpDrive.fieldBlockHardness.setAccessible(true);
try {
hardness = (float)WarpDrive.fieldBlockHardness.get(block);
hardness = (float) WarpDrive.fieldBlockHardness.get(block);
} catch (final IllegalArgumentException | IllegalAccessException exception) {
exception.printStackTrace();
WarpDrive.logger.error("Unable to access block hardness value '" + resourceLocation + "' " + block);

View file

@ -351,7 +351,7 @@ public class WarpDriveConfig {
public static int IC2_REACTOR_COOLING_INTERVAL_TICKS = 10;
// Transporter
public static int TRANSPORTER_MAX_ENERGY_STORED = 2000000;
public static int TRANSPORTER_MAX_ENERGY_STORED = 1000000;
public static int TRANSPORTER_ENERGY_STORED_UPGRADE_BONUS = TRANSPORTER_MAX_ENERGY_STORED / 2;
public static int TRANSPORTER_ENERGY_STORED_UPGRADE_MAX_QUANTITY = 8;
public static int TRANSPORTER_SETUP_UPDATE_PARAMETERS_TICKS = 1 * 20;
@ -361,7 +361,7 @@ public class WarpDriveConfig {
public static int TRANSPORTER_RANGE_BASE_BLOCKS = 256;
public static int TRANSPORTER_RANGE_UPGRADE_BLOCKS = 64;
public static int TRANSPORTER_RANGE_UPGRADE_MAX_QUANTITY = 8;
public static double[] TRANSPORTER_LOCKING_ENERGY_FACTORS = { 50.0, 3.0, 0.0, 10.0, 1.0 / Math.sqrt(2.0) };
public static double[] TRANSPORTER_LOCKING_ENERGY_FACTORS = { 20.0, 3.0, 0.0, 10.0, 1.0 / Math.sqrt(2.0) };
public static double TRANSPORTER_LOCKING_STRENGTH_FACTOR_PER_TICK = Math.pow(0.01D, 1.0D / 300.0D); // natural decay down to 1% over 300 ticks
public static double TRANSPORTER_LOCKING_STRENGTH_IN_WILDERNESS = 0.25D;
public static double TRANSPORTER_LOCKING_STRENGTH_AT_BEACON = 0.50D;
@ -375,7 +375,7 @@ public class WarpDriveConfig {
public static int TRANSPORTER_LOCKING_SPEED_OPTIMAL_TICKS = 5 * 20;
public static int TRANSPORTER_LOCKING_UPGRADE_MAX_QUANTITY = 2;
public static int TRANSPORTER_JAMMED_COOLDOWN_TICKS = 2 * 20;
public static double[] TRANSPORTER_ENERGIZING_ENERGY_FACTORS = { 10000.0, 5.0, 0.0, 10.0, 1.0 / Math.sqrt(2.0) };
public static double[] TRANSPORTER_ENERGIZING_ENERGY_FACTORS = { 10000.0, 1500.0, 0.0, 10.0, 1.0 / Math.sqrt(2.0) };
public static double TRANSPORTER_ENERGIZING_MAX_ENERGY_FACTOR = 10.0D;
public static int TRANSPORTER_ENERGIZING_FAILURE_MAX_DAMAGE = 5;
public static double TRANSPORTER_ENERGIZING_SUCCESS_LOCK_BONUS = 0.20D;
@ -556,7 +556,7 @@ public class WarpDriveConfig {
CelestialObjectManager.load(configDirectory);
// read mod dependencies
isCoFHCoreLoaded = Loader.isModLoaded("cofhcore");
isCoFHCoreLoaded = Loader.isModLoaded("CoFHCore");
isComputerCraftLoaded = Loader.isModLoaded("ComputerCraft");
isEnderIOLoaded = Loader.isModLoaded("EnderIO");

View file

@ -52,6 +52,7 @@ public class AcceleratorSetup extends GlobalPosition {
public final HashMap<VectorI, Byte> chillers = new HashMap<>();
public final Set<TileEntityEnergyBank> energyBanks = new HashSet<>();
public final int energy_maxStorage;
public final Set<VectorI> setJammed = new HashSet<>();
public final TreeMap<Integer, VectorI> mapInjectors = new TreeMap<>();
public final Integer[] keyInjectors;
public final ArrayList<TrajectoryPoint> listColliders = new ArrayList<>();
@ -309,6 +310,11 @@ public class AcceleratorSetup extends GlobalPosition {
private void computeVectorArrays(final WorldServer world) {
// check for chillers, injectors and colliders blocks
for (final TrajectoryPoint trajectoryPoint : trajectoryAccelerator.values()) {
// check for invalid setup
if (trajectoryPoint.isJammed()) {
setJammed.add(trajectoryPoint);
}
// check for injectors
VectorI vectorToAdd = trajectoryPoint.clone(trajectoryPoint.directionForward.getOpposite());
final Block blockForward = vectorToAdd.getBlock(world);

View file

@ -136,15 +136,17 @@ public class AirSpreader {
if ( stateCenter.pressureVoid > 0
&& stateCenter.pressureGenerator > 0
&& stateCenter.directionGenerator == stateCenter.directionVoid.getOpposite() ) {
final Vector3 v3Origin = new Vector3(x + 0.5D, y + 0.5D, z + 0.5D);
final Vector3 v3Direction = new Vector3(stateCenter.directionVoid).scale(0.5D);
PacketHandler.sendSpawnParticlePacket(world, "cloud", (byte) 2, v3Origin, v3Direction,
0.20F + 0.10F * world.rand.nextFloat(),
0.25F + 0.25F * world.rand.nextFloat(),
0.60F + 0.30F * world.rand.nextFloat(),
0.0F,
0.0F,
0.0F, 32);
if (world.rand.nextInt(4) == 2) {
final Vector3 v3Origin = new Vector3(x + 0.5D, y + 0.5D, z + 0.5D);
final Vector3 v3Direction = new Vector3(stateCenter.directionVoid).scale(0.5D);
PacketHandler.sendSpawnParticlePacket(world, "cloud", (byte) 2, v3Origin, v3Direction,
0.20F + 0.10F * world.rand.nextFloat(),
0.25F + 0.25F * world.rand.nextFloat(),
0.60F + 0.30F * world.rand.nextFloat(),
0.0F,
0.0F,
0.0F, 32);
}
}
return;
}

View file

@ -97,7 +97,9 @@ public class CloakManager {
if (world.isRemote) {
newArea.clientCloak();
}
if (WarpDriveConfig.LOGGING_CLOAKING) { WarpDrive.logger.info("Cloak count is " + cloaks.size()); }
if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.info("Cloak count is " + cloaks.size());
}
}
public void removeCloakedArea(final int dimensionId, final BlockPos blockPos) {
@ -118,18 +120,7 @@ public class CloakManager {
public CloakedArea getCloakedArea(final World world, final BlockPos blockPos) {
for (final CloakedArea area : cloaks) {
if ( area.dimensionId == world.provider.getDimension()
&& area.blockPosCore.equals(blockPos) )
return area;
}
return null;
}
@SideOnly(Side.CLIENT)
public CloakedArea getCloakedArea(final BlockPos blockPos) {
// client only
for (final CloakedArea area : cloaks) {
if (area.blockPosCore.equals(blockPos)) {
&& area.blockPosCore.equals(blockPos) ) {
return area;
}
}
@ -143,9 +134,10 @@ public class CloakManager {
}
}
@SuppressWarnings("unused") // Core mod
@SideOnly(Side.CLIENT)
public static boolean onBlockChange(final int x, final int y, final int z, final Block block, final int metadata, final int flag) {
if (block != Blocks.AIR && cloaks != null) {
if (block != Blocks.AIR) {
for (final CloakedArea area : cloaks) {
if (area.isBlockWithinArea(x, y, z)) {
// WarpDrive.logger.info("CM block is inside");
@ -159,6 +151,7 @@ public class CloakManager {
return Minecraft.getMinecraft().theWorld.setBlockState(new BlockPos(x, y, z), block.getStateFromMeta(metadata), flag);
}
@SuppressWarnings("unused") // Core mod
@SideOnly(Side.CLIENT)
public static void onFillChunk(final Chunk chunk) {
if (cloaks == null) {

View file

@ -5,9 +5,9 @@ import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.network.PacketHandler;
import cr0s.warpdrive.render.EntityFXBeam;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.entity.EntityPlayerSP;
@ -18,7 +18,6 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.network.Packet;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
@ -35,8 +34,8 @@ public class CloakedArea {
public BlockPos blockPosCore;
public int minX, minY, minZ;
public int maxX, maxY, maxZ;
private LinkedList<UUID> playersInArea;
public byte tier = 0;
private CopyOnWriteArraySet<UUID> playersInArea;
public byte tier;
public IBlockState blockStateFog;
public CloakedArea(final World worldObj,
@ -54,7 +53,7 @@ public class CloakedArea {
this.maxY = maxY;
this.maxZ = maxZ;
this.playersInArea = new LinkedList<>();
this.playersInArea = new CopyOnWriteArraySet<>();
if (worldObj != null) {
try {
@ -75,29 +74,16 @@ public class CloakedArea {
}
}
public boolean isPlayerListedInArea(final UUID uniqueId) {
for (UUID playerInArea : playersInArea) {
if (playerInArea.equals(uniqueId)) {
return true;
}
}
return false;
public boolean isPlayerListedInArea(final UUID uuidPlayer) {
return playersInArea.contains(uuidPlayer);
}
private void removePlayer(final UUID uniqueId) {
for (int i = 0; i < playersInArea.size(); i++) {
if (playersInArea.get(i).equals(uniqueId)) {
playersInArea.remove(i);
return;
}
}
private void removePlayer(final UUID uuidPlayer) {
playersInArea.remove(uuidPlayer);
}
private void addPlayer(final UUID uniqueId) {
if (!isPlayerListedInArea(uniqueId)) {
playersInArea.add(uniqueId);
}
private void addPlayer(final UUID uuidPlayer) {
playersInArea.add(uuidPlayer);
}
public boolean isEntityWithinArea(final EntityLivingBase entity) {
@ -211,19 +197,11 @@ public class CloakedArea {
/**/
}
public void revealEntitiesToPlayer(final EntityPlayer player) {
final List<Entity> list = player.worldObj.getEntitiesWithinAABBExcludingEntity(player, new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ));
public void revealEntitiesToPlayer(final EntityPlayerMP entityPlayerMP) {
final List<Entity> list = entityPlayerMP.worldObj.getEntitiesWithinAABBExcludingEntity(entityPlayerMP, new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ));
for (final Entity entity : list) {
final Packet packet = PacketHandler.getPacketForThisEntity(entity);
if (packet != null) {
if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.warn("Revealing entity " + entity + " with packet " + packet);
}
((EntityPlayerMP) player).connection.sendPacket(packet);
} else if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.warn("Revealing entity " + entity + " fails: null packet");
}
PacketHandler.revealEntityToPlayer(entity, entityPlayerMP);
}
}
@ -261,8 +239,10 @@ public class CloakedArea {
@SideOnly(Side.CLIENT)
public void clientDecloak() {
final World world = Minecraft.getMinecraft().theWorld;
world.markBlockRangeForRenderUpdate(minX - 1, Math.max(0, minY - 1), minZ - 1, maxX + 1, Math.min(255, maxY + 1), maxZ + 1);
world.markBlockRangeForRenderUpdate(
minX - 1, Math.max( 0, minY - 1), minZ - 1,
maxX + 1, Math.min(255, maxY + 1), maxZ + 1);
// Make some graphics
final int numLasers = 80 + world.rand.nextInt(50);
@ -284,7 +264,7 @@ public class CloakedArea {
centerY + radiusY * world.rand.nextGaussian(),
centerZ + radiusZ * world.rand.nextGaussian()),
world.rand.nextFloat(), world.rand.nextFloat(), world.rand.nextFloat(),
60 + world.rand.nextInt(60), 100));
60 + world.rand.nextInt(60)));
}
}

View file

@ -6,7 +6,8 @@ import cr0s.warpdrive.block.detection.TileEntityCamera;
import java.util.HashMap;
public enum EnumCameraType {
SIMPLE_CAMERA (TileEntityCamera.class),
SIMPLE_CAMERA (TileEntityCamera.class),
LASER_CAMERA (TileEntityLaser.class);
public final Class<?> clazz;

View file

@ -1,8 +1,12 @@
package cr0s.warpdrive.data;
import net.minecraft.util.IStringSerializable;
import javax.annotation.Nonnull;
import java.util.HashMap;
public enum EnumComponentType {
public enum EnumComponentType implements IStringSerializable {
EMERALD_CRYSTAL ("emerald_crystal"),
ENDER_CRYSTAL ("ender_crystal"),
DIAMOND_CRYSTAL ("diamond_crystal"),
@ -25,7 +29,7 @@ public enum EnumComponentType {
ELECTROMAGNETIC_PROJECTOR ("electromagnetic_projector"),
SUPERCONDUCTOR ("superconductor");
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -38,15 +42,17 @@ public enum EnumComponentType {
}
}
EnumComponentType(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumComponentType(final String name) {
this.name = name;
}
public static EnumComponentType get(final int damage) {
return ID_MAP.get(damage);
}
public String getUnlocalizedName() {
return unlocalizedName;
@Nonnull
@Override
public String getName() {
return name;
}
}

View file

@ -6,11 +6,12 @@ import javax.annotation.Nonnull;
import java.util.HashMap;
public enum EnumDecorativeType implements IStringSerializable {
PLAIN ("plain"),
ENERGIZED ("energized"),
NETWORK ("network");
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -23,19 +24,17 @@ public enum EnumDecorativeType implements IStringSerializable {
}
}
EnumDecorativeType(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumDecorativeType(final String name) {
this.name = name;
}
public static EnumDecorativeType get(final int damage) {
return ID_MAP.get(damage);
}
public String getUnlocalizedName() {
return unlocalizedName;
}
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() {
return name;
}
}

View file

@ -1,7 +1,11 @@
package cr0s.warpdrive.data;
import net.minecraft.util.IStringSerializable;
public enum EnumDisplayAlignment {
import javax.annotation.Nonnull;
public enum EnumDisplayAlignment implements IStringSerializable {
TOP_LEFT ("top_left" , 0.0F, 0.0F),
TOP_CENTER ("top_center" , 0.5F, 0.0F),
TOP_RIGHT ("top_right" , 1.0F, 0.0F),
@ -12,13 +16,19 @@ public enum EnumDisplayAlignment {
BOTTOM_CENTER ("bottom_center", 0.5F, 1.0F),
BOTTOM_RIGHT ("bottom_right" , 1.0F, 1.0F);
public final String unlocalizedName;
private final String name;
public final float xRatio;
public final float yRatio;
EnumDisplayAlignment(final String unlocalizedName, final float xRatio, final float yRatio) {
this.unlocalizedName = unlocalizedName;
EnumDisplayAlignment(final String name, final float xRatio, final float yRatio) {
this.name = name;
this.xRatio = xRatio;
this.yRatio = yRatio;
}
@Nonnull
@Override
public String getName() {
return name;
}
}

View file

@ -11,6 +11,7 @@ import java.util.HashMap;
import java.util.Map;
public enum EnumForceFieldShape implements IStringSerializable, IForceFieldShape {
NONE ("none"),
SPHERE ("sphere"),
CYLINDER_H ("cylinder_h"),
@ -37,16 +38,16 @@ public enum EnumForceFieldShape implements IStringSerializable, IForceFieldShape
this.name = name;
}
public static EnumForceFieldShape get(final int damage) {
return ID_MAP.get(damage);
}
@Nonnull
@Override
public String getName() {
return name;
}
public static EnumForceFieldShape get(final int damage) {
return ID_MAP.get(damage);
}
@Override
public Map<VectorI, Boolean> getVertexes(final ForceFieldSetup forceFieldSetup) {
final VectorI vScale = forceFieldSetup.vMax.clone().translateBack(forceFieldSetup.vMin);
@ -86,9 +87,9 @@ public enum EnumForceFieldShape implements IStringSerializable, IForceFieldShape
default:
sizeEstimation = 8;
WarpDrive.logger.error(String.format("Invalid object %s for shape %s with size %s. Please report this to the mod author",
this,
name,
vScale));
this,
name,
vScale));
break;
}
} else {

View file

@ -29,6 +29,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public enum EnumForceFieldUpgrade implements IStringSerializable, IForceFieldUpgrade, IForceFieldUpgradeEffector {
// Upgrade - Compatibility - ----- Value ----- -- Scan speed -- -- Place speed -- --------- Energy costs --------- comment
// name projector relay incr. cap minimum maximum minimum maximum startup scan place entity
NONE ("none" , 0, 0, 0.0F, 0.0F, 0.000F, 0.000F, 0.000F, 0.000F, 0.0F, 0.000F, 0.000F, 0.0F, "n/a"),
@ -40,7 +41,7 @@ public enum EnumForceFieldUpgrade implements IStringSerializable, IForceFieldUpg
HEATING ("heating" , 3, 1, 100.0F, 10000.0F, 0.000F, 0.000F, 0.900F, 0.900F, 150.0F, 0.300F, 3.000F, 25.0F, "value is heat units"),
INVERSION ("inversion" , 1, 0, 1.0F, 1.0F, 1.250F, 1.250F, 0.000F, 0.000F, 1500.0F, 0.150F, 0.150F, 20.0F, "value is boolean"),
ITEM_PORT ("item_port" , 0, 1, 1.0F, 10.0F, 0.000F, 0.000F, 0.950F, 0.900F, 50.0F, 0.120F, 0.500F, 2.0F, "value is boolean"),
PUMPING ("pumping" , 0, 1, 1000.0F, 50000.0F, 0.800F, 1.000F, 0.400F, 1.000F, 800.0F, 0.150F, 4.500F, 0.0F, "value is viscosity"),
PUMPING ("pumping" , 0, 1, 2500.0F, 50000.0F, 0.800F, 1.000F, 0.400F, 1.000F, 800.0F, 0.150F, 4.500F, 0.0F, "value is viscosity"),
RANGE ("range" , 4, 1, 8.0F, 128.0F, 1.150F, 0.450F, 1.150F, 0.450F, 10.0F, 0.300F, 0.750F, 12.0F, "value is bonus blocks"),
REPULSION ("repulsion" , 0, 1, 1.0F, 4.0F, 0.000F, 0.000F, 0.000F, 0.000F, 50.0F, 0.150F, 0.000F, 5.0F, "value is acceleration"),
ROTATION ("rotation" , 1, 0, 1.0F, 1.0F, 0.000F, 0.000F, 0.000F, 0.000F, 100.0F, 0.000F, 0.000F, 0.0F, "value is boolean"),
@ -101,18 +102,18 @@ public enum EnumForceFieldUpgrade implements IStringSerializable, IForceFieldUpg
assert(!comment.isEmpty());
}
@Nonnull
@Override
public String getName() {
return name;
}
@Nonnull
public static EnumForceFieldUpgrade get(final int damage) {
final EnumForceFieldUpgrade enumForceFieldUpgrade = ID_MAP.get(damage);
return enumForceFieldUpgrade == null ? EnumForceFieldUpgrade.NONE : enumForceFieldUpgrade;
}
@Nonnull
@Override
public String getName() {
return name;
}
@Override
public IForceFieldUpgradeEffector getUpgradeEffector() {
return this;

View file

@ -1,13 +1,17 @@
package cr0s.warpdrive.data;
import net.minecraft.util.IStringSerializable;
import javax.annotation.Nonnull;
import java.util.HashMap;
public enum EnumHullPlainType {
public enum EnumHullPlainType implements IStringSerializable {
PLAIN ("plain"),
TILED ("tiled"),
;
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -20,13 +24,15 @@ public enum EnumHullPlainType {
}
}
EnumHullPlainType(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumHullPlainType(final String name) {
this.name = name;
}
public static EnumHullPlainType get(final int index) {
return ID_MAP.get(index);
}
public String getName() { return unlocalizedName; }
@Nonnull
@Override
public String getName() { return name; }
}

View file

@ -0,0 +1,34 @@
package cr0s.warpdrive.data;
import net.minecraft.util.IStringSerializable;
import javax.annotation.Nonnull;
public enum EnumJumpSequencerState implements IStringSerializable {
IDLE ("idle"),
LOAD_SOURCE_CHUNKS ("load_source_chunks"),
SAVE_TO_MEMORY ("save_to_memory"),
CHECK_BORDERS ("check_borders"),
SAVE_TO_DISK ("save_to_disk"),
GET_INITIAL_VECTOR ("get_initial_vector"),
ADJUST_JUMP_VECTOR ("adjust_jump_vector"),
LOAD_TARGET_CHUNKS ("load_target_chunks"),
SAVE_ENTITIES ("save_entities"),
MOVE_BLOCKS ("move_blocks"),
MOVE_EXTERNALS ("move_externals"),
MOVE_ENTITIES ("move_entities"),
REMOVING ("removing"),
CHUNK_UNLOADING ("chunk_unloading"),
FINISHING ("finishing");
private final String name;
EnumJumpSequencerState(final String name) {
this.name = name;
}
@Nonnull
@Override
public String getName() { return name; }
}

View file

@ -6,12 +6,13 @@ import javax.annotation.Nonnull;
import java.util.HashMap;
public enum EnumLiftMode implements IStringSerializable {
INACTIVE ("inactive"),
UP ("up"),
DOWN ("down"),
REDSTONE ("redstone");
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -24,19 +25,15 @@ public enum EnumLiftMode implements IStringSerializable {
}
}
EnumLiftMode(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumLiftMode(final String name) {
this.name = name;
}
public static EnumLiftMode get(final int damage) {
return ID_MAP.get(damage);
}
public String getUnlocalizedName() {
return unlocalizedName;
}
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
}

View file

@ -1,16 +1,20 @@
package cr0s.warpdrive.data;
import net.minecraft.util.IStringSerializable;
import javax.annotation.Nonnull;
import java.util.HashMap;
public enum EnumPermissionNode {
NONE ("None"),
ENABLE ("Enable"),
OPEN_GUI ("OpenGUI"),
MODIFY ("Modify"),
SNEAK_THROUGH ("SneakThrough"),
public enum EnumPermissionNode implements IStringSerializable {
NONE ("none"),
ENABLE ("enable"),
OPEN_GUI ("open_gui"),
MODIFY ("modify"),
SNEAK_THROUGH ("sneak_through"),
;
public final String unlocalizedName;
public final String name;
// cached values
public static final int length;
@ -23,11 +27,17 @@ public enum EnumPermissionNode {
}
}
EnumPermissionNode(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumPermissionNode(final String name) {
this.name = name;
}
public static EnumPermissionNode get(final int id) {
return ID_MAP.get(id);
}
@Nonnull
@Override
public String getName() {
return name;
}
}

View file

@ -9,6 +9,7 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
public enum EnumReactorFace implements IStringSerializable {
// tier inst name facing x y z propertyLaser
UNKNOWN (null , -1, "unknown" , null , 0, 0, 0, null ),
BASIC_NORTH (EnumTier.BASIC, 0, "north" , EnumFacing.NORTH, 0, 0, -2, EnumFacing.SOUTH),

View file

@ -6,12 +6,13 @@ import java.util.HashMap;
import net.minecraft.util.IStringSerializable;
public enum EnumReactorReleaseMode implements IStringSerializable {
OFF ("OFF"),
UNLIMITED ("MANUAL"),
ABOVE ("ABOVE"),
AT_RATE ("RATE");
private final String unlocalizedName;
OFF ("off"),
UNLIMITED ("unlimited"),
ABOVE ("above"),
AT_RATE ("at_rate");
private final String name;
// cached values
public static final int length;
@ -24,19 +25,15 @@ public enum EnumReactorReleaseMode implements IStringSerializable {
}
}
EnumReactorReleaseMode(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumReactorReleaseMode(final String name) {
this.name = name;
}
public static EnumReactorReleaseMode get(final int ordinal) {
return ID_MAP.get(ordinal);
}
public String getUnlocalizedName() {
return unlocalizedName;
}
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
}

View file

@ -15,7 +15,7 @@ public enum EnumShipCoreState implements IStringSerializable {
COOLING_DOWN (5, "cooling_down"); // Pending cooldown
private final int metadata;
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -28,9 +28,9 @@ public enum EnumShipCoreState implements IStringSerializable {
}
}
EnumShipCoreState(final int metadata, final String unlocalizedName) {
EnumShipCoreState(final int metadata, final String name) {
this.metadata = metadata;
this.unlocalizedName = unlocalizedName;
this.name = name;
}
public int getMetadata() {
@ -43,5 +43,5 @@ public enum EnumShipCoreState implements IStringSerializable {
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
}

View file

@ -24,7 +24,7 @@ public enum EnumShipMovementType implements IStringSerializable {
// nota: empty names won't show up in the configuration file
public final boolean hasConfiguration;
private final String unlocalizedName;
private final String name;
private final String description;
public final double[] maximumDistanceDefault;
public final double[] energyRequiredDefault;
@ -43,14 +43,14 @@ public enum EnumShipMovementType implements IStringSerializable {
}
}
EnumShipMovementType(final boolean hasConfiguration, final String unlocalizedName, final String description,
EnumShipMovementType(final boolean hasConfiguration, final String name, final String description,
final double[] maximumDistanceDefault,
final double[] energyRequiredDefault,
final double[] warmupDefault,
final double[] sicknessDefault,
final double[] cooldownDefault) {
this.hasConfiguration = hasConfiguration;
this.unlocalizedName = unlocalizedName;
this.name = name;
this.description = description;
this.maximumDistanceDefault = maximumDistanceDefault;
this.energyRequiredDefault = energyRequiredDefault;
@ -65,7 +65,7 @@ public enum EnumShipMovementType implements IStringSerializable {
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
@Nonnull
public String getDescription() { return description; }

View file

@ -12,7 +12,7 @@ public enum EnumShipScannerState implements IStringSerializable {
DEPLOYING (2, "online"); // Deploying a ship
private final int metadata;
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -25,9 +25,9 @@ public enum EnumShipScannerState implements IStringSerializable {
}
}
EnumShipScannerState(final int metadata, final String unlocalizedName) {
EnumShipScannerState(final int metadata, final String name) {
this.metadata = metadata;
this.unlocalizedName = unlocalizedName;
this.name = name;
}
public int getMetadata() {
@ -40,5 +40,5 @@ public enum EnumShipScannerState implements IStringSerializable {
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
}

View file

@ -1,8 +1,12 @@
package cr0s.warpdrive.data;
import net.minecraft.util.IStringSerializable;
import javax.annotation.Nonnull;
import java.util.HashMap;
public enum EnumStarMapEntryType {
public enum EnumStarMapEntryType implements IStringSerializable {
UNDEFINED (0, "-undefined-"),
SHIP (1, "ship" ), // a ship core
JUMPGATE (2, "jumpgate" ), // a jump gate
@ -36,6 +40,8 @@ public enum EnumStarMapEntryType {
return id;
}
@Nonnull
@Override
public String getName() {
return name;
}

View file

@ -6,6 +6,7 @@ import java.util.HashMap;
import net.minecraft.util.IStringSerializable;
public enum EnumTier implements IStringSerializable {
CREATIVE ("creative", 0),
BASIC ("basic" , 1),
ADVANCED ("advanced", 2),

View file

@ -13,10 +13,10 @@ public enum EnumTooltipCondition implements IStringSerializable {
CREATIVE_ONLY ("creative_only" ),
ALWAYS ("always" );
public final String unlocalizedName;
public final String name;
EnumTooltipCondition(final String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
EnumTooltipCondition(final String name) {
this.name = name;
}
public boolean isEnabled(final boolean isSneaking, final boolean isCreativeMode) {
@ -30,14 +30,9 @@ public enum EnumTooltipCondition implements IStringSerializable {
}
}
@Override
public String toString() {
return unlocalizedName;
}
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
public static String formatAllValues() {
final StringBuilder result = new StringBuilder();

View file

@ -15,7 +15,7 @@ public enum EnumTransporterBeaconState implements IStringSerializable {
DEPLOYED_ACTIVE (3, "deployed_active");
private final int metadata;
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -28,9 +28,9 @@ public enum EnumTransporterBeaconState implements IStringSerializable {
}
}
EnumTransporterBeaconState(final int metadata, final String unlocalizedName) {
EnumTransporterBeaconState(final int metadata, final String name) {
this.metadata = metadata;
this.unlocalizedName = unlocalizedName;
this.name = name;
}
public int getMetadata() {
@ -43,5 +43,5 @@ public enum EnumTransporterBeaconState implements IStringSerializable {
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
}

View file

@ -13,7 +13,7 @@ public enum EnumTransporterState implements IStringSerializable {
ENERGIZING (3, "energizing"); // transferring entities
private final int metadata;
private final String unlocalizedName;
private final String name;
// cached values
public static final int length;
@ -26,9 +26,9 @@ public enum EnumTransporterState implements IStringSerializable {
}
}
EnumTransporterState(final int metadata, final String unlocalizedName) {
EnumTransporterState(final int metadata, final String name) {
this.metadata = metadata;
this.unlocalizedName = unlocalizedName;
this.name = name;
}
public int getMetadata() {
@ -41,5 +41,5 @@ public enum EnumTransporterState implements IStringSerializable {
@Nonnull
@Override
public String getName() { return unlocalizedName; }
public String getName() { return name; }
}

View file

@ -137,7 +137,8 @@ public class ForceFieldSetup extends GlobalPosition {
continue;
}
// only consider same dimension
if (tileEntity.getWorld() == null || tileEntity.getWorld().provider.getDimension() != dimensionId) {
if ( tileEntity.getWorld() == null
|| tileEntity.getWorld().provider.getDimension() != dimensionId ) {
continue;
}
// projectors
@ -169,13 +170,14 @@ public class ForceFieldSetup extends GlobalPosition {
}
} else {
if ((((TileEntityForceFieldProjector) tileEntity).isEnabled)
&& (((TileEntityForceFieldProjector) tileEntity).isCalculated())
&& (((TileEntityForceFieldProjector) tileEntity).isValid())) {
if ( ((TileEntityForceFieldProjector) tileEntity).isEnabled
&& ((TileEntityForceFieldProjector) tileEntity).isCalculated()
&& ((TileEntityForceFieldProjector) tileEntity).isValid() ) {
projectors.add((TileEntityForceFieldProjector) tileEntity);
}
}
}
// upgrade blocks (namely, relays)
if (tileEntity instanceof IForceFieldUpgrade) {
final IForceFieldUpgradeEffector upgradeEffector = ((IForceFieldUpgrade)tileEntity).getUpgradeEffector();
@ -205,6 +207,13 @@ public class ForceFieldSetup extends GlobalPosition {
}
}
if (shapeProvider == null) {
WarpDrive.logger.error(String.format("ForceFieldSetup without a projector or null shape returned @ (%d %d %d), while #%d has %d registered tile entities",
x, y, z,
beamFrequency,
tileEntities.size()));
}
// set default coefficients, depending on projector
scanSpeed = FORCEFIELD_BASE_SCAN_SPEED_BLOCKS_PER_SECOND * (isDoubleSided ? 2.1F : 1.0F);
placeSpeed = FORCEFIELD_BASE_PLACE_SPEED_BLOCKS_PER_SECOND * (isDoubleSided ? 2.1F : 1.0F);

View file

@ -81,7 +81,8 @@ public class JumpShip {
jumpShip.jumpBlocks = new JumpBlock[width * height * length];
// Read blocks and TileEntities from NBT to internal storage array
final NBTTagList localBlocks = (NBTTagList) schematic.getTag("Blocks");
final byte localBlocks[] = schematic.getByteArray("Blocks");
final byte localAddBlocks[] = schematic.hasKey("AddBlocks") ? schematic.getByteArray("AddBlocks") : null;
final byte localMetadata[] = schematic.getByteArray("Data");
// Load Tile Entities
@ -107,8 +108,26 @@ public class JumpShip {
jumpBlock.x = x;
jumpBlock.y = y;
jumpBlock.z = z;
jumpBlock.block = Block.getBlockFromName(localBlocks.getStringTagAt(index));
jumpBlock.blockMeta = (localMetadata[index]) & 0xFF;
// rebuild block id from signed byte + nibble tables
int blockId = localBlocks[index];
if (blockId < 0) {
blockId += 256;
}
if (localAddBlocks != null) {
int MSB = localAddBlocks[index / 2];
if (MSB < 0) {
MSB += 256;
}
if (index % 2 == 0) {
blockId += (MSB & 0x0F) << 8;
} else {
blockId += (MSB & 0xF0) << 4;
}
}
jumpBlock.block = Block.getBlockById(blockId);
jumpBlock.blockMeta = (localMetadata[index]) & 0x0F;
jumpBlock.blockNBT = tileEntities[index];
if (jumpBlock.block != null) {
@ -253,7 +272,8 @@ public class JumpShip {
final Block block = blockState.getBlock();
// Skipping any air block & ignored blocks
if (worldObj.isAirBlock(blockPos) || Dictionary.BLOCKS_LEFTBEHIND.contains(block)) {
if ( worldObj.isAirBlock(blockPos)
|| Dictionary.BLOCKS_LEFTBEHIND.contains(block) ) {
continue;
}

View file

@ -392,6 +392,13 @@ public class StarMapRegistry {
continue;
}
// Compare areas for intersection
final AxisAlignedBB aabb2 = new AxisAlignedBB(registryItem.minX, registryItem.minY, registryItem.minZ,
registryItem.maxX, registryItem.maxY, registryItem.maxZ);
if (!aabb1.intersectsWith(aabb2)) {
continue;
}
// Skip missing ship cores
final TileEntity tileEntity = core.getWorld().getTileEntity(new BlockPos(registryItem.x, registryItem.y, registryItem.z));
if (!(tileEntity instanceof TileEntityShipCore)) {
@ -409,18 +416,15 @@ public class StarMapRegistry {
continue;
}
// Compare areas for intersection
final AxisAlignedBB aabb2 = new AxisAlignedBB(registryItem.minX, registryItem.minY, registryItem.minZ,
registryItem.maxX, registryItem.maxY, registryItem.maxZ);
if (aabb1.intersectsWith(aabb2)) {
return true;
}
// ship is intersecting, online and valid
return true;
}
return false;
}
// do not call during tileEntity construction (readFromNBT and validate)
private static boolean isExceptionReported = false;
private void cleanup() {
LocalProfiler.start("Starmap registry cleanup");
@ -442,6 +446,12 @@ public class StarMapRegistry {
final Chunk chunk = chunkProviderServer.id2ChunkMap.get(ChunkPos.chunkXZ2Int(registryItem.x >> 4, registryItem.z >> 4));
isLoaded = chunk != null && chunk.isLoaded();
} catch (final NoSuchFieldError exception) {
if (!isExceptionReported) {
WarpDrive.logger.info(String.format("Unable to check non-loaded chunks for star map entry %s",
registryItem));
exception.printStackTrace();
isExceptionReported = true;
}
isLoaded = chunkProviderServer.chunkExists(registryItem.x >> 4, registryItem.z >> 4);
}
} else {
@ -449,6 +459,10 @@ public class StarMapRegistry {
}
// skip unloaded chunks
if (!isLoaded) {
if (WarpDrive.isDev) {
WarpDrive.logger.info(String.format("Skipping non-loaded star map entry %s",
registryItem));
}
continue;
}
@ -458,38 +472,41 @@ public class StarMapRegistry {
final TileEntity tileEntity = world.getTileEntity(new BlockPos(registryItem.x, registryItem.y, registryItem.z));
isValid = true;
switch (registryItem.type) {
case UNDEFINED:
break;
case SHIP:
isValid = block == WarpDrive.blockShipCore && tileEntity != null && !tileEntity.isInvalid();
break;
case JUMPGATE:
break;
case PLANET:
break;
case STAR:
break;
case STRUCTURE:
break;
case WARP_ECHO:
break;
case ACCELERATOR:
isValid = block == WarpDrive.blockAcceleratorController && tileEntity != null && !tileEntity.isInvalid();
break;
default:
break;
case UNDEFINED:
break;
case SHIP:
isValid = block == WarpDrive.blockShipCore && tileEntity != null && !tileEntity.isInvalid();
break;
case JUMPGATE:
break;
case PLANET:
break;
case STAR:
break;
case STRUCTURE:
break;
case WARP_ECHO:
break;
case ACCELERATOR:
isValid = block == WarpDrive.blockAcceleratorController && tileEntity != null && !tileEntity.isInvalid();
break;
case TRANSPORTER:
isValid = block == WarpDrive.blockTransporterCore && tileEntity != null && !tileEntity.isInvalid();
break;
default:
break;
}
}
if (!isValid) {
if (WarpDriveConfig.LOGGING_STARMAP) {
// if (WarpDriveConfig.LOGGING_STARMAP) {
if (registryItem == null) {
WarpDrive.logger.info("Cleaning up starmap object ~null~");
} else {
WarpDrive.logger.info("Cleaning up starmap object " + registryItem.type + " at "
+ registryItem.dimensionId + " " + registryItem.x + " " + registryItem.y + " " + registryItem.z);
}
}
// }
countRemove++;
entryDimension.getValue().remove(registryItem);
}

View file

@ -403,6 +403,10 @@ public class TrajectoryPoint extends VectorI {
return isCollider(type);
}
public boolean isJammed() {
return (type & MASK_ERRORS) != ERROR_NONE;
}
public static boolean isCollider(final int type) {
return (type & IS_COLLIDER) != 0;
}

View file

@ -34,7 +34,7 @@ public class ClientHandler {
return;
}
if (Dictionary.ITEMS_BREATHING_HELMET.contains(event.getItemStack().getItem())) {
Commons.addTooltip(event.getToolTip(), new TextComponentTranslation("warpdrive.tooltip.item_tag.breathingHelmet").getFormattedText());
Commons.addTooltip(event.getToolTip(), new TextComponentTranslation("warpdrive.tooltip.item_tag.breathing_helmet").getFormattedText());
}
if (Dictionary.ITEMS_FLYINSPACE.contains(event.getItemStack().getItem())) {
Commons.addTooltip(event.getToolTip(), new TextComponentTranslation("warpdrive.tooltip.item_tag.flyInSpace").getFormattedText());

View file

@ -54,7 +54,7 @@ public class DeploySequencer extends JumpSequencer {
// Warn owner if deployment done but wait next tick for teleportation
final EntityPlayerMP entityPlayerMP = Commons.getOnlinePlayerByName(playerName);
if (entityPlayerMP != null) {
Commons.addChatMessage(entityPlayerMP, new TextComponentString("Ship complete. Teleporting captain to the main deck"));
Commons.addChatMessage(entityPlayerMP, new TextComponentString("Ship deployed. Teleporting captain to the main deck"));
}
}
}

View file

@ -11,6 +11,7 @@ import cr0s.warpdrive.data.CelestialObjectManager;
import cr0s.warpdrive.config.Dictionary;
import cr0s.warpdrive.config.WarpDriveConfig;
import cr0s.warpdrive.data.CelestialObject;
import cr0s.warpdrive.data.EnumJumpSequencerState;
import cr0s.warpdrive.data.EnumShipMovementType;
import cr0s.warpdrive.data.JumpBlock;
import cr0s.warpdrive.data.JumpShip;
@ -79,22 +80,13 @@ public class JumpSequencer extends AbstractSequencer {
private float collisionStrength = 0;
protected boolean isEnabled = false;
private static final int STATE_IDLE = 0;
private static final int STATE_CHUNKLOADING = 1;
private static final int STATE_SAVING = 2;
private static final int STATE_BORDERS = 3;
private static final int STATE_TRANSFORMER = 4;
private static final int STATE_BLOCKS = 5;
private static final int STATE_EXTERNALS = 6;
private static final int STATE_ENTITIES = 7;
private static final int STATE_REMOVING = 8;
private static final int STATE_CHUNKUNLOADING = 9;
private static final int STATE_FINISHING = 10;
private int state = STATE_IDLE;
private EnumJumpSequencerState enumJumpSequencerState = EnumJumpSequencerState.IDLE;
private int actualIndexInShip = 0;
protected final JumpShip ship;
private boolean betweenWorlds;
private boolean isPluginCheckDone = false;
private String firstAdjustmentReason = "";
protected final int destX;
protected final int destY;
@ -222,92 +214,119 @@ public class JumpSequencer extends AbstractSequencer {
}
ticks++;
switch (state) {
case STATE_IDLE:
// blank state in case we got desync
switch (enumJumpSequencerState) {
case IDLE:
// blank state in case we got desynchronized
msCounter = System.currentTimeMillis();
if (isEnabled) {
if ( shipMovementType != EnumShipMovementType.INSTANTIATE
&& shipMovementType != EnumShipMovementType.RESTORE ) {
state = STATE_CHUNKLOADING;
enumJumpSequencerState = EnumJumpSequencerState.LOAD_SOURCE_CHUNKS;
} else {
state = STATE_TRANSFORMER;
enumJumpSequencerState = EnumJumpSequencerState.GET_INITIAL_VECTOR;
}
}
break;
case STATE_CHUNKLOADING:
case LOAD_SOURCE_CHUNKS:
state_chunkLoadingSource();
if (isEnabled) {
actualIndexInShip = 0;
state = STATE_SAVING;
enumJumpSequencerState = EnumJumpSequencerState.SAVE_TO_MEMORY;
}
break;
case STATE_SAVING:
state_saving();
case SAVE_TO_MEMORY:
state_saveToMemory();
if (isEnabled) {
actualIndexInShip = 0;
state = STATE_BORDERS;
enumJumpSequencerState = EnumJumpSequencerState.CHECK_BORDERS;
}
break;
case STATE_BORDERS:
state_borders();
case CHECK_BORDERS:
state_checkBorders();
if (isEnabled) {
enumJumpSequencerState = EnumJumpSequencerState.SAVE_TO_DISK;
}
break;
case SAVE_TO_DISK:
state_saveToDisk();
if (isEnabled) {
enumJumpSequencerState = EnumJumpSequencerState.GET_INITIAL_VECTOR;
}
break;
case GET_INITIAL_VECTOR:
state_getInitialVector();
if (isEnabled) {
enumJumpSequencerState = EnumJumpSequencerState.ADJUST_JUMP_VECTOR;
}
break;
case ADJUST_JUMP_VECTOR:
state_adjustJumpVector();
if (isEnabled) {
enumJumpSequencerState = EnumJumpSequencerState.LOAD_TARGET_CHUNKS;
}
break;
case LOAD_TARGET_CHUNKS:
state_loadTargetChunks();
if (isEnabled) {
enumJumpSequencerState = EnumJumpSequencerState.SAVE_ENTITIES;
}
break;
case SAVE_ENTITIES:
state_saveEntitiesAndInformPlayers();
if (isEnabled) {
actualIndexInShip = 0;
state = STATE_TRANSFORMER;
enumJumpSequencerState = EnumJumpSequencerState.MOVE_BLOCKS;
}
break;
case STATE_TRANSFORMER:
state_transformer();
if (isEnabled) {
actualIndexInShip = 0;
state = STATE_BLOCKS;
}
break;
case STATE_BLOCKS:
case MOVE_BLOCKS:
state_moveBlocks();
if (actualIndexInShip >= ship.jumpBlocks.length - 1) {
actualIndexInShip = 0;
state = STATE_EXTERNALS;
enumJumpSequencerState = EnumJumpSequencerState.MOVE_EXTERNALS;
}
break;
case STATE_EXTERNALS:
case MOVE_EXTERNALS:
state_moveExternals();
if (actualIndexInShip >= ship.jumpBlocks.length - 1) {
state = STATE_ENTITIES;
enumJumpSequencerState = EnumJumpSequencerState.MOVE_ENTITIES;
}
break;
case STATE_ENTITIES:
case MOVE_ENTITIES:
state_moveEntities();
actualIndexInShip = 0;
state = STATE_REMOVING;
enumJumpSequencerState = EnumJumpSequencerState.REMOVING;
break;
case STATE_REMOVING:
case REMOVING:
if (enforceEntitiesPosition) {
restoreEntitiesPosition();
}
state_removeBlocks();
if (actualIndexInShip >= ship.jumpBlocks.length - 1) {
state = STATE_CHUNKUNLOADING;
enumJumpSequencerState = EnumJumpSequencerState.CHUNK_UNLOADING;
}
break;
case STATE_CHUNKUNLOADING:
case CHUNK_UNLOADING:
state_chunkReleasing();
state = STATE_FINISHING;
enumJumpSequencerState = EnumJumpSequencerState.FINISHING;
break;
case STATE_FINISHING:
case FINISHING:
state_finishing();
state = STATE_IDLE;
enumJumpSequencerState = EnumJumpSequencerState.IDLE;
break;
default:
@ -386,6 +405,11 @@ public class JumpSequencer extends AbstractSequencer {
}
private void releaseChunks() {
if ( sourceWorldTicket == null
&& targetWorldTicket == null ) {
return;
}
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Releasing chunks");
}
@ -440,8 +464,8 @@ public class JumpSequencer extends AbstractSequencer {
LocalProfiler.stop();
}
protected void state_saving() {
LocalProfiler.start("Jump.saving");
protected void state_saveToMemory() {
LocalProfiler.start("Jump.saveToMemory");
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Saving ship...");
}
@ -459,8 +483,8 @@ public class JumpSequencer extends AbstractSequencer {
LocalProfiler.stop();
}
protected void state_borders() {
LocalProfiler.start("Jump.borders");
protected void state_checkBorders() {
LocalProfiler.start("Jump.checkBorders");
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Checking ship borders...");
@ -475,6 +499,11 @@ public class JumpSequencer extends AbstractSequencer {
LocalProfiler.stop();
return;
}
LocalProfiler.stop();
}
protected void state_saveToDisk() {
LocalProfiler.start("Jump.saveToDisk");
final File file = new File(WarpDriveConfig.G_SCHEMALOCATION + "/auto");
if (!file.exists() || !file.isDirectory()) {
@ -523,10 +552,10 @@ public class JumpSequencer extends AbstractSequencer {
LocalProfiler.stop();
}
protected void state_transformer() {
LocalProfiler.start("Jump.transformer");
protected void state_getInitialVector() {
LocalProfiler.start("Jump.getInitialVector");
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Transformer evaluation...");
WarpDrive.logger.info(this + " Getting initial target vector...");
}
final StringBuilder reason = new StringBuilder();
@ -567,8 +596,8 @@ public class JumpSequencer extends AbstractSequencer {
}
// Calculate jump vector
boolean isPluginCheckDone = false;
String firstAdjustmentReason = "";
isPluginCheckDone = false;
firstAdjustmentReason = "";
switch (shipMovementType) {
case GATE_ACTIVATING:
moveX = destX - ship.core.getX();
@ -624,10 +653,17 @@ public class JumpSequencer extends AbstractSequencer {
}
transformation = new Transformation(ship, targetWorld, moveX, moveY, moveZ, rotationSteps);
if (betweenWorlds && WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " From world " + sourceWorld.provider.getDimensionType().getName() + " to " + targetWorld.provider.getDimensionType().getName());
LocalProfiler.stop();
}
protected void state_adjustJumpVector() {
LocalProfiler.start("Jump.adjustJumpVector");
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Adjusting jump vector...");
}
// final StringBuilder reason = new StringBuilder();
{
final BlockPos target1 = transformation.apply(ship.minX, ship.minY, ship.minZ);
final BlockPos target2 = transformation.apply(ship.maxX, ship.maxY, ship.maxZ);
@ -691,6 +727,17 @@ public class JumpSequencer extends AbstractSequencer {
}
}
LocalProfiler.stop();
}
protected void state_loadTargetChunks() {
LocalProfiler.start("Jump.loadTargetChunks");
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Loading chunks at target...");
}
final StringBuilder reason = new StringBuilder();
if (!forceTargetChunks(reason)) {
final ITextComponent msg = new TextComponentString(reason.toString());
disable(msg);
@ -699,6 +746,17 @@ public class JumpSequencer extends AbstractSequencer {
return;
}
LocalProfiler.stop();
}
protected void state_saveEntitiesAndInformPlayers() {
LocalProfiler.start("Jump.saveEntitiesAndInformPlayers");
if (WarpDriveConfig.LOGGING_JUMP) {
WarpDrive.logger.info(this + " Saving entities...");
}
final StringBuilder reason = new StringBuilder();
{
if ( shipMovementType != EnumShipMovementType.INSTANTIATE
&& shipMovementType != EnumShipMovementType.RESTORE ) {

View file

@ -1,6 +1,5 @@
package cr0s.warpdrive.item;
import cr0s.warpdrive.Commons;
import cr0s.warpdrive.WarpDrive;
import cr0s.warpdrive.api.IAirContainerItem;
import cr0s.warpdrive.block.energy.BlockEnergyBank;
@ -18,7 +17,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@ -29,7 +27,7 @@ public class ItemComponent extends ItemAbstractBase implements IAirContainerItem
public ItemComponent(final String registryName) {
super(registryName);
setHasSubtypes(true);
setUnlocalizedName("warpdrive.component");
setUnlocalizedName("warpdrive.component.malformed");
itemStackCache = new ItemStack[EnumComponentType.length];
}
@ -54,7 +52,7 @@ public class ItemComponent extends ItemAbstractBase implements IAirContainerItem
public String getUnlocalizedName(final ItemStack itemStack) {
final int damage = itemStack.getItemDamage();
if (damage >= 0 && damage < EnumComponentType.length) {
return "item.warpdrive.component." + EnumComponentType.get(damage).getUnlocalizedName();
return "item.warpdrive.component." + EnumComponentType.get(damage).getName();
}
return getUnlocalizedName();
}
@ -73,7 +71,7 @@ public class ItemComponent extends ItemAbstractBase implements IAirContainerItem
final int damage = itemStack.getItemDamage();
ResourceLocation resourceLocation = getRegistryName();
if (damage >= 0 && damage < EnumComponentType.length) {
resourceLocation = new ResourceLocation(resourceLocation.getResourceDomain(), resourceLocation.getResourcePath() + "-" + EnumComponentType.get(damage).getUnlocalizedName());
resourceLocation = new ResourceLocation(resourceLocation.getResourceDomain(), resourceLocation.getResourcePath() + "-" + EnumComponentType.get(damage).getName());
}
return new ModelResourceLocation(resourceLocation, "inventory");
}
@ -129,8 +127,6 @@ public class ItemComponent extends ItemAbstractBase implements IAirContainerItem
return null;
}
@Override
public boolean doesSneakBypassUse(final ItemStack itemStack, final IBlockAccess world, final BlockPos blockPos, final EntityPlayer player) {
final Block block = world.getBlockState(blockPos).getBlock();
@ -138,20 +134,4 @@ public class ItemComponent extends ItemAbstractBase implements IAirContainerItem
return block instanceof BlockEnergyBank
|| super.doesSneakBypassUse(itemStack, world, blockPos, player);
}
@Override
public void addInformation(final ItemStack itemStack, final EntityPlayer entityPlayer, final List<String> list, final boolean advancedItemTooltips) {
super.addInformation(itemStack, entityPlayer, list, advancedItemTooltips);
String tooltip = "";
switch (EnumComponentType.get(itemStack.getItemDamage())) {
case AIR_CANISTER:
tooltip += new TextComponentTranslation("item.warpdrive.component.airCanisterEmpty.tooltip").getFormattedText();
break;
default:
break;
}
Commons.addTooltip(list, tooltip);
}
}

View file

@ -23,21 +23,19 @@ public class MessageBeamEffect implements IMessage, IMessageHandler<MessageBeamE
private float green;
private float blue;
private int age;
private int energy;
@SuppressWarnings("unused")
public MessageBeamEffect() {
// required on receiving side
}
public MessageBeamEffect(final Vector3 source, final Vector3 target, final float red, final float green, final float blue, final int age, final int energy) {
public MessageBeamEffect(final Vector3 source, final Vector3 target, final float red, final float green, final float blue, final int age) {
this.source = source;
this.target = target;
this.red = red;
this.green = green;
this.blue = blue;
this.age = age;
this.energy = energy;
}
public MessageBeamEffect(
@ -51,7 +49,6 @@ public class MessageBeamEffect implements IMessage, IMessageHandler<MessageBeamE
this.green = green;
this.blue = blue;
this.age = age;
this.energy = energy;
}
@Override
@ -70,7 +67,6 @@ public class MessageBeamEffect implements IMessage, IMessageHandler<MessageBeamE
green = buffer.readFloat();
blue = buffer.readFloat();
age = buffer.readShort();
energy = buffer.readInt();
}
@Override
@ -85,12 +81,11 @@ public class MessageBeamEffect implements IMessage, IMessageHandler<MessageBeamE
buffer.writeFloat(green);
buffer.writeFloat(blue);
buffer.writeShort(Math.min(32767, age));
buffer.writeInt(energy);
}
@SideOnly(Side.CLIENT)
private void handle(final World world) {
FMLClientHandler.instance().getClient().effectRenderer.addEffect(new EntityFXBeam(world, source.clone(), target.clone(), red, green, blue, age, energy));
FMLClientHandler.instance().getClient().effectRenderer.addEffect(new EntityFXBeam(world, source.clone(), target.clone(), red, green, blue, age));
}
@Override
@ -105,7 +100,7 @@ public class MessageBeamEffect implements IMessage, IMessageHandler<MessageBeamE
if (WarpDriveConfig.LOGGING_EFFECTS) {
WarpDrive.logger.info("Received beam packet from " + beamEffectMessage.source + " to " + beamEffectMessage.target
+ " as RGB " + beamEffectMessage.red + " " + beamEffectMessage.green + " " + beamEffectMessage.blue
+ " age " + beamEffectMessage.age +" energy " + beamEffectMessage.energy);
+ " age " + beamEffectMessage.age);
}
beamEffectMessage.handle(Minecraft.getMinecraft().theWorld);

View file

@ -13,10 +13,17 @@ import java.util.Collection;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.EntityTrackerEntry;
import net.minecraft.entity.ai.attributes.AttributeMap;
import net.minecraft.entity.ai.attributes.IAttributeInstance;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.network.Packet;
import net.minecraft.server.MinecraftServer;
import net.minecraft.network.play.server.*;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@ -59,7 +66,7 @@ public class PacketHandler {
final int age, final int energy, final int radius) {
assert(!world.isRemote);
final MessageBeamEffect messageBeamEffect = new MessageBeamEffect(v3Source, v3Target, red, green, blue, age, energy);
final MessageBeamEffect messageBeamEffect = new MessageBeamEffect(v3Source, v3Target, red, green, blue, age);
// small beam are sent relative to beam center
if (v3Source.distanceTo_square(v3Target) < 3600 /* 60 * 60 */) {
@ -84,10 +91,10 @@ public class PacketHandler {
public static void sendBeamPacketToPlayersInArea(final World world, final Vector3 source, final Vector3 target,
final float red, final float green, final float blue,
final int age, final int energy, final AxisAlignedBB aabb) {
final int age, final AxisAlignedBB aabb) {
assert(!world.isRemote);
final MessageBeamEffect messageBeamEffect = new MessageBeamEffect(source, target, red, green, blue, age, energy);
final MessageBeamEffect messageBeamEffect = new MessageBeamEffect(source, target, red, green, blue, age);
// Send packet to all players within cloaked area
final List<Entity> list = world.getEntitiesWithinAABB(EntityPlayerMP.class, aabb);
for (final Entity entity : list) {
@ -190,6 +197,70 @@ public class PacketHandler {
} catch (final Exception exception) {
exception.printStackTrace();
}
WarpDrive.logger.error(String.format("Unable to get packet for entity %s",
entity));
return null;
}
public static void revealEntityToPlayer(final Entity entity, final EntityPlayerMP entityPlayerMP) {
try {
final Packet packet = getPacketForThisEntity(entity);
if (packet == null) {
WarpDrive.logger.error(String.format("Unable to reveal entity %s to player %s: null packet",
entity, entityPlayerMP));
return;
}
if (WarpDriveConfig.LOGGING_CLOAKING) {
WarpDrive.logger.info("Revealing entity " + entity + " with packet " + packet);
}
entityPlayerMP.connection.sendPacket(packet);
if (!entity.getDataManager().isEmpty()) {
entityPlayerMP.connection.sendPacket(new SPacketEntityMetadata(entity.getEntityId(), entity.getDataManager(), true));
}
if (entity instanceof EntityLivingBase) {
final AttributeMap attributemap = (AttributeMap) ((EntityLivingBase) entity).getAttributeMap();
final Collection<IAttributeInstance> collection = attributemap.getWatchedAttributes();
if (!collection.isEmpty()) {
entityPlayerMP.connection.sendPacket(new SPacketEntityProperties(entity.getEntityId(), collection));
}
// if (((EntityLivingBase)this.trackedEntity).isElytraFlying()) ... (we always send velocity information)
}
if (!(packet instanceof SPacketSpawnMob)) {
entityPlayerMP.connection.sendPacket(new SPacketEntityVelocity(entity.getEntityId(), entity.motionX, entity.motionY, entity.motionZ));
}
if (entity instanceof EntityLivingBase) {
for (EntityEquipmentSlot entityequipmentslot : EntityEquipmentSlot.values()) {
final ItemStack itemstack = ((EntityLivingBase) entity).getItemStackFromSlot(entityequipmentslot);
if (itemstack != null) {
entityPlayerMP.connection.sendPacket(new SPacketEntityEquipment(entity.getEntityId(), entityequipmentslot, itemstack));
}
}
}
if (entity instanceof EntityPlayer) {
final EntityPlayer entityplayer = (EntityPlayer) entity;
if (entityplayer.isPlayerSleeping()) {
entityPlayerMP.connection.sendPacket(new SPacketUseBed(entityplayer, new BlockPos(entity)));
}
}
if (entity instanceof EntityLivingBase) {
final EntityLivingBase entitylivingbase = (EntityLivingBase) entity;
for (final PotionEffect potioneffect : entitylivingbase.getActivePotionEffects()) {
entityPlayerMP.connection.sendPacket(new SPacketEntityEffect(entity.getEntityId(), potioneffect));
}
}
} catch (final Exception exception) {
exception.printStackTrace();
}
}
}

View file

@ -35,7 +35,7 @@ public class EntityFXBeam extends Particle {
public EntityFXBeam(final World world, final Vector3 position, final Vector3 target,
final float red, final float green, final float blue,
final int age, final int energy) {
final int age) {
super(world, position.x, position.y, position.z, 0.0D, 0.0D, 0.0D);
this.setRBGColorF(red, green, blue);
this.setSize(0.02F, 0.02F);

View file

@ -34,10 +34,10 @@ public class RenderOverlayCamera {
try {
final String strHelp;
if (ClientCameraHandler.overlayType == EnumCameraType.SIMPLE_CAMERA) {
minecraft.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/detection/cameraOverlay.png"));
minecraft.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/detection/camera-overlay.png"));
strHelp = "Left click to zoom / Right click to exit";
} else {
minecraft.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/weapon/laserCameraOverlay.png"));
minecraft.getTextureManager().bindTexture(new ResourceLocation("warpdrive", "textures/blocks/weapon/laser_camera-overlay.png"));
strHelp = "Left click to zoom / Right click to exit / Space to fire";
}

View file

@ -2,10 +2,9 @@ package cr0s.warpdrive.world;
import net.minecraft.world.biome.Biome;
public class BiomeSpace extends Biome
{
public BiomeSpace(final BiomeProperties biomeProperties)
{
public class BiomeSpace extends Biome {
public BiomeSpace(final BiomeProperties biomeProperties) {
super(biomeProperties);
this.theBiomeDecorator.treesPerChunk = 0;
//this.temperature = 1F;
@ -15,14 +14,12 @@ public class BiomeSpace extends Biome
}
@Override
public float getSpawningChance()
{
return 0;
}
@Override
public boolean getEnableSnow()
{
return false;
public float getSpawningChance() {
return 0.0F;
}
@Override
public boolean getEnableSnow() {
return false;
}
}

View file

@ -570,23 +570,23 @@ tile.warpdrive.hull3.stairs.black.name=Schwarze überlegene Treppe
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§cDieser Block benötigt ein Update, durch zerstören und neu setzen.
warpdrive.monitor.viewingCamera=Kamera bei %2$d, %3$d, %4$d läuft auf Videokanal %1$d
warpdrive.ship.attachedPlayers=Verbundene Spieler: %1$s
warpdrive.ship.playerAttached=Du bist jetzt mit dem Schiff %1$s verbunden.\nVerbundene Spieler sind %2$s
warpdrive.ship.playerDetached=Du wurdest vom Schiff %1$s getrennt.\nVerbundene Spieler sind %2$s
warpdrive.error.bad_tile_entity=§cDieser Block benötigt ein Update, durch zerstören und neu setzen.
warpdrive.monitor.viewing_camera=Kamera bei %2$d, %3$d, %4$d läuft auf Videokanal %1$d
warpdrive.ship.attached_players=Verbundene Spieler: %1$s
warpdrive.ship.player_attached=Du bist jetzt mit dem Schiff %1$s verbunden.\nVerbundene Spieler sind %2$s
warpdrive.ship.player_detached=Du wurdest vom Schiff %1$s getrennt.\nVerbundene Spieler sind %2$s
warpdrive.ship.status_line.cooling=%1$d s Abklingzeit verbleibend.
warpdrive.ship.status_line.isolation=%1$d aktive Isolations Blöcke bieten %2$2.1f%% Absorption.
warpdrive.energy.status_line=Das Energie Level ist %1$s / %2$s EU.
warpdrive.energy.side.changedToInput=%1$s Seite auf Energiezufuhr Modus gestellt!
warpdrive.energy.side.changedToOutput=%1$s Seite auf Energieausgabe Modus gestellt!
warpdrive.energy.side.changedToDisabled=%1$s Seite auf Deaktiviert gestellt!
warpdrive.energy.side.changed_to_input=%1$s Seite auf Energiezufuhr Modus gestellt!
warpdrive.energy.side.changed_to_output=%1$s Seite auf Energieausgabe Modus gestellt!
warpdrive.energy.side.changed_to_disabled=%1$s Seite auf Deaktiviert gestellt!
warpdrive.accelerator.guide.lowPower_noStorage=Energiespeicher zu klein; wir brauchen mindestens %1$d um den Betrieb fortzusetzen, können aber nur %2$d speichern.
warpdrive.accelerator.guide.lowPower_accelerating=Uns geht der Strom aus, Chef, Teilchen werden frei, auf massiven Strahlungsaustritt vorbereiten!
warpdrive.accelerator.guide.lowPower_noParticles=Wir brauchen mehr Strom um den Beschleuniger zu starten!
warpdrive.accelerator.guide.noChiller=Für diesen Beschleuniger konnte kein Kühler gefunden werden!
warpdrive.accelerator.guide.low_power.not_enough_storage=Energiespeicher zu klein; wir brauchen mindestens %1$d um den Betrieb fortzusetzen, können aber nur %2$d speichern.
warpdrive.accelerator.guide.low_power.accelerating=Uns geht der Strom aus, Chef, Teilchen werden frei, auf massiven Strahlungsaustritt vorbereiten!
warpdrive.accelerator.guide.low_power.no_particles=Wir brauchen mehr Strom um den Beschleuniger zu starten!
warpdrive.accelerator.guide.no_chiller=Für diesen Beschleuniger konnte kein Kühler gefunden werden!
warpdrive.beam_frequency.tooltip=Strahlfrequenz auf %1$d gestellt
warpdrive.beam_frequency.get=Strahlfrequenz %2$d wurde von %1$s abgerufen
@ -607,7 +607,7 @@ warpdrive.control_channel.status_line.valid=Steuerungskanal %1$d ist gültig.
warpdrive.control_channel.status_line.invalid=§cSteuerungskanal %1$d ist ungültig.
warpdrive.control_channel.status_line.undefined=§7Nicht definierter Steuerungskanal.\n§bNutze eine Stimmgabel§r um ihn einzustellen.
warpdrive.forcefield.guide.lowPower=Uns geht die Energie aus, Captain. Verringere unseren Energieverbrauch oder hol den schottischen Ingenieur!
warpdrive.forcefield.guide.low_power=Uns geht die Energie aus, Captain. Verringere unseren Energieverbrauch oder hol den schottischen Ingenieur!
warpdrive.forcefield.shape.status_line.none=§cForm ist nicht definiert
warpdrive.forcefield.shape.status_line.double=Die Form ist ein(e) volle(r) %1$s
@ -648,22 +648,22 @@ warpdrive.particle.antimatter.tooltip=Erzeugt durch Kollision eines Partikelhauf
warpdrive.particle.strange_matter.name=Seltsame Materie
warpdrive.particle.strange_matter.tooltip=Erzeugt durch Kollision zweier Partikelhaufen in einem Überlegenen Beschleuniger
warpdrive.upgrade.result.noUpgradeToDismount=§cKein Upgrade zum deinstallieren vorhanden.
warpdrive.upgrade.result.notEnoughUpgrades=§cDu brauchst mindestens 1 Item um diesen Block aufzuwerten.
warpdrive.upgrade.result.invalidUpgrade=§cDies ist kein gültiges Item, um diesen Block upzugraden.
warpdrive.upgrade.result.invalidProjectorUpgrade=§cDieses Upgrade ist zu groß für einen Projektor. Nutze ein Relais.
warpdrive.upgrade.result.invalidRelayUpgrade=§cDieses Upgrade funktioniert nur bei Projektoren!
warpdrive.upgrade.result.validUpgrades=Gültige Upgrades für diesen Block sind: %1$s. @TODO noch nicht implementiert
warpdrive.upgrade.result.tooManyUpgrades=§cEs sind schon %1$d Upgrades installiert.
warpdrive.upgrade.result.no_upgrade_to_dismount=§cKein Upgrade zum deinstallieren vorhanden.
warpdrive.upgrade.result.not_enough_upgrades=§cDu brauchst mindestens 1 Item um diesen Block aufzuwerten.
warpdrive.upgrade.result.invalid_upgrade=§cDies ist kein gültiges Item, um diesen Block upzugraden.
warpdrive.upgrade.result.invalid_upgrade_for_projector=§cDieses Upgrade ist zu groß für einen Projektor. Nutze ein Relais.
warpdrive.upgrade.result.invalid_upgrade_for_relay=§cDieses Upgrade funktioniert nur bei Projektoren!
warpdrive.upgrade.result.valid_upgrades=Gültige Upgrades für diesen Block sind: %1$s. @TODO noch nicht implementiert
warpdrive.upgrade.result.too_many_upgrades=§cEs sind schon %1$d Upgrades installiert.
warpdrive.upgrade.result.dismounted=Upgrade %1$s erfolgreich deinstalliert.
warpdrive.upgrade.result.mounted=Upgrade %1$s erfolgreich installiert.
warpdrive.upgrade.result.wrongShapeSide=§cAuf dieser Seite gibt es keinen Elektromagnetischen Projektor.
warpdrive.upgrade.result.noShapeToDismount=§cKeine Form zum deinstallieren vorhanden.
warpdrive.upgrade.result.notEnoughShapes.double=§cDu brauchst mindestens 2 Items um einen doppelseitigen Projektor einzustellen.
warpdrive.upgrade.result.notEnoughShapes.single=§cDu brauchst mindestens 1 Item um einen einseitigen Projektor einzustellen.
warpdrive.upgrade.result.shapeDismounted=Form erfolgreich deinstalliert.
warpdrive.upgrade.result.shapeMounted=Form erfolgreich installiert.
warpdrive.upgrade.result.wrong_shape_side=§cAuf dieser Seite gibt es keinen Elektromagnetischen Projektor.
warpdrive.upgrade.result.no_shape_to_dismount=§cKeine Form zum deinstallieren vorhanden.
warpdrive.upgrade.result.not_enough_shapes.double=§cDu brauchst mindestens 2 Items um einen doppelseitigen Projektor einzustellen.
warpdrive.upgrade.result.not_enough_shapes.single=§cDu brauchst mindestens 1 Item um einen einseitigen Projektor einzustellen.
warpdrive.upgrade.result.shape_dismounted=Form erfolgreich deinstalliert.
warpdrive.upgrade.result.shape_mounted=Form erfolgreich installiert.
warpdrive.upgrade.status_line.none=§7Kein Upgrade installiert.
warpdrive.upgrade.status_line.valid=%1$s Upgrade installiert.
@ -677,16 +677,16 @@ warpdrive.video_channel.status_line.invalid=§cVideokanal %1$d ist ungültig.
warpdrive.video_channel.status_line.not_loaded=§cVideokanal %1$d ist ungültig oder die Kamera ist zu weit weg!
warpdrive.video_channel.status_line.undefined=§7Nicht definierter Videokanal.\n§bNutze eine Stimmgabel§r um ihn einzustellen.
warpdrive.cloaking_core.missingInnerAndOuter=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s !!!
warpdrive.cloaking_core.missingInner=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s !!!
warpdrive.cloaking_core.missingOuter=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s !!!
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s !!!
warpdrive.cloaking_core.missing_channeling_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s !!!
warpdrive.cloaking_core.missing_projecting_coils=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s !!!
warpdrive.cloaking_core.valid=System is valid !!!
warpdrive.cloaking_core.disabled=Tarnfeld ist deaktiviert!
warpdrive.cloaking_core.lowPower=§cTarnfeld ist ausgefallen, wir brauchen mehr Energie, Captain!
warpdrive.cloaking_core.low_power=§cTarnfeld ist ausgefallen, wir brauchen mehr Energie, Captain!
warpdrive.cloaking_core.cloaking=Ein Stufe %1$d Tarnfeld überdeckt jetzt %2$d Blöcke!
warpdrive.ic2_reactor_laser_monitor.noReactor=Kein Reaktor gefunden!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d Reaktor(en) verbunden.
warpdrive.ic2_reactor_laser_monitor.no_reactor=Kein Reaktor gefunden!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Reactor connected on %1$s.
warpdrive.transporter.status=Von (%1$.0f %2$.0f %3$.0f) zu (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -568,23 +568,23 @@ tile.warpdrive.hull3.stairs.black.name=Black Stained Superior Hull Stairs
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§cThis block needs an update by breaking and placing it.
warpdrive.monitor.viewingCamera=Viewing camera at %2$d, %3$d, %4$d on video channel %1$d
warpdrive.ship.attachedPlayers=Attached players: %1$s
warpdrive.ship.playerAttached=You're now attached to ship %1$s.\nAttached players are %2$s
warpdrive.ship.playerDetached=You've been detached from ship %1$s.\nAttached players are %2$s
warpdrive.error.bad_tile_entity=§cThis block needs an update by breaking and placing it.
warpdrive.monitor.viewing_camera=Viewing camera at %2$d, %3$d, %4$d on video channel %1$d
warpdrive.ship.attached_players=Attached players: %1$s
warpdrive.ship.player_attached=You're now attached to ship %1$s.\nAttached players are %2$s
warpdrive.ship.player_detached=You've been detached from ship %1$s.\nAttached players are %2$s
warpdrive.ship.status_line.cooling=%1$d s left of cooldown.
warpdrive.ship.status_line.isolation=%1$d active isolation blocks providing %2$2.1f%% absorption.
warpdrive.energy.status_line=Energy level is %1$s / %2$s EU.
warpdrive.energy.side.changedToInput=%1$s side changed to energy Input mode!
warpdrive.energy.side.changedToOutput=%1$s side changed to energy Output mode!
warpdrive.energy.side.changedToDisabled=%1$s side changed to Disabled mode!
warpdrive.energy.side.changed_to_input=%1$s side changed to energy Input mode!
warpdrive.energy.side.changed_to_output=%1$s side changed to energy Output mode!
warpdrive.energy.side.changed_to_disabled=%1$s side changed to Disabled mode!
warpdrive.accelerator.guide.lowPower_noStorage=Energy storage is too low; we need at least %1$d to continue operation but can only store %2$d
warpdrive.accelerator.guide.lowPower_accelerating=We're running out of power chief, particles are on the loose, prepare for massive irradiation!
warpdrive.accelerator.guide.lowPower_noParticles=We need more power to start the accelerator!
warpdrive.accelerator.guide.noChiller=No chiller could be found for this accelerator!
warpdrive.accelerator.guide.low_power.not_enough_storage=Energy storage is too low; we need at least %1$d to continue operation but can only store %2$d
warpdrive.accelerator.guide.low_power.accelerating=We're running out of power chief, particles are on the loose, prepare for massive irradiation!
warpdrive.accelerator.guide.low_power.no_particles=We need more power to start the accelerator!
warpdrive.accelerator.guide.no_chiller=No chiller could be found for this accelerator!
warpdrive.beam_frequency.tooltip=Beam frequency is set to %1$d
warpdrive.beam_frequency.get=Beam frequency %2$d has been retrieved from %1$s
@ -605,7 +605,7 @@ warpdrive.control_channel.status_line.valid=Control channel %1$d is valid.
warpdrive.control_channel.status_line.invalid=§cControl channel %1$d is invalid.
warpdrive.control_channel.status_line.undefined=§7Undefined Control channel.\n§bUse a Tuning fork§r to set it.
warpdrive.forcefield.guide.lowPower=We're running out of power captain, reduce our consumption or get that scottish engineer to boost our power!
warpdrive.forcefield.guide.low_power=We're running out of power captain, reduce our consumption or get that scottish engineer to boost our power!
warpdrive.forcefield.shape.status_line.none=§cShape isn't defined.
warpdrive.forcefield.shape.status_line.double=Shape is a full %1$s
@ -646,22 +646,22 @@ warpdrive.particle.antimatter.tooltip=Produced by colliding a particle bunch in
warpdrive.particle.strange_matter.name=strange matter
warpdrive.particle.strange_matter.tooltip=Produced by colliding 2 particle bunches in a superior accelerator
warpdrive.upgrade.result.noUpgradeToDismount=§cNo upgrade to dismount.
warpdrive.upgrade.result.notEnoughUpgrades=§cYou need at least 1 item to upgrade this block.
warpdrive.upgrade.result.invalidUpgrade=§cThis is not a valid item to upgrade this block.
warpdrive.upgrade.result.invalidProjectorUpgrade=§cThis upgrade is too big for a projector, use a relay instead.
warpdrive.upgrade.result.invalidRelayUpgrade=§cThis upgrade only applies to projectors.
warpdrive.upgrade.result.validUpgrades=Valid upgrades for this block include: %1$s. @TODO not implemented yet
warpdrive.upgrade.result.tooManyUpgrades=§cThere's already %1$d upgrades installed.
warpdrive.upgrade.result.no_upgrade_to_dismount=§cNo upgrade to dismount.
warpdrive.upgrade.result.not_enough_upgrades=§cYou need at least 1 item to upgrade this block.
warpdrive.upgrade.result.invalid_upgrade=§cThis is not a valid item to upgrade this block.
warpdrive.upgrade.result.invalid_upgrade_for_projector=§cThis upgrade is too big for a projector, use a relay instead.
warpdrive.upgrade.result.invalid_upgrade_for_relay=§cThis upgrade only applies to projectors.
warpdrive.upgrade.result.valid_upgrades=Valid upgrades for this block include: %1$s. @TODO not implemented yet
warpdrive.upgrade.result.too_many_upgrades=§cThere's already %1$d upgrades installed.
warpdrive.upgrade.result.dismounted=Upgrade %1$s was dismounted successfully.
warpdrive.upgrade.result.mounted=Upgrade %1$s was mounted successfully.
warpdrive.upgrade.result.wrongShapeSide=§cThere's no Electromagnetic projector on this side.
warpdrive.upgrade.result.noShapeToDismount=§cNo shape to dismount.
warpdrive.upgrade.result.notEnoughShapes.double=§cYou need at least 2 items to set the shape of a double sided projector.
warpdrive.upgrade.result.notEnoughShapes.single=§cYou need at least 1 item to set the shape of a single sided projector.
warpdrive.upgrade.result.shapeDismounted=Shape dismounted successfully.
warpdrive.upgrade.result.shapeMounted=Shape mounted successfully.
warpdrive.upgrade.result.wrong_shape_side=§cThere's no Electromagnetic projector on this side.
warpdrive.upgrade.result.no_shape_to_dismount=§cNo shape to dismount.
warpdrive.upgrade.result.not_enough_shapes.double=§cYou need at least 2 items to set the shape of a double sided projector.
warpdrive.upgrade.result.not_enough_shapes.single=§cYou need at least 1 item to set the shape of a single sided projector.
warpdrive.upgrade.result.shape_dismounted=Shape dismounted successfully.
warpdrive.upgrade.result.shape_mounted=Shape mounted successfully.
warpdrive.upgrade.status_line.none=§7No upgrade installed.
warpdrive.upgrade.status_line.valid=Upgraded with %1$s.
@ -675,16 +675,16 @@ warpdrive.video_channel.status_line.invalid=§cVideo channel %1$d is invalid.
warpdrive.video_channel.status_line.not_loaded=§cVideo channel %1$d is invalid or camera is too far away!
warpdrive.video_channel.status_line.undefined=§7Undefined Video channel.\n§bUse a Tuning fork§r to set it.
warpdrive.cloaking_core.missingInnerAndOuter=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missingInner=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missingOuter=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missing_channeling_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missing_projecting_coils=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.valid=System is valid
warpdrive.cloaking_core.disabled=Cloak is disabled
warpdrive.cloaking_core.lowPower=§cCloak is down, we need more power Captain!
warpdrive.cloaking_core.low_power=§cCloak is down, we need more power Captain!
warpdrive.cloaking_core.cloaking=A tier %1$d cloak is currently covering %2$d blocks!
warpdrive.ic2_reactor_laser_monitor.noReactor=No reactor found!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d reactor(s) connected.
warpdrive.ic2_reactor_laser_monitor.no_reactor=No reactor found!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Reactor connected on %1$s.
warpdrive.transporter.status=From (%1$.0f %2$.0f %3$.0f) to (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -21,9 +21,9 @@ item.warpdrive.component.emerald_crystal.name=Cristal d'émeraude accordé
item.warpdrive.component.ender_crystal.name=Cristal de l'ender accordé
item.warpdrive.component.diamond_crystal.name=Cristal de diamond accordé
item.warpdrive.component.diffraction_grating.name=Réseau de diffraction
item.warpdrive.component.reactor_core.name=Noyau de réacteur
item.warpdrive.component.reactor_core.name=Noyeau de réacteur
item.warpdrive.component.computer_interface.name=Interface informatique
item.warpdrive.component.power_interface.name=Interface de puissance
item.warpdrive.component.power_interface.name=Power Interface
item.warpdrive.component.capacitive_crystal.name=Cristal capacitif
item.warpdrive.component.air_canister_empty.name=Cartouche d'air vide
item.warpdrive.component.air_canister_empty.tooltip=§bClique droit sur un Générateur d'air§r pour me remplir
@ -568,23 +568,23 @@ tile.warpdrive.hull3.stairs.black.name=Escalier de coque supérieure noire
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§cCe bloc requiers une mise à jour par dépose puis repose.
warpdrive.monitor.viewingCamera=Affichage de la caméra à %2$d, %3$d, %4$d sur le canal vidéo %1$d
warpdrive.ship.attachedPlayers=Joueurs attachés: %1$s
warpdrive.ship.playerAttached=Tu es désormais attaché au vaisseau %1$s.\nLes joueurs attachés sont %2$s
warpdrive.ship.playerDetached=Tu es désormais détaché du vaisseau %1$s.\nLes joueurs attachés sont %2$s
warpdrive.error.bad_tile_entity=§cCe bloc requiers une mise à jour par dépose puis repose.
warpdrive.monitor.viewing_camera=Affichage de la caméra à %2$d, %3$d, %4$d sur le canal vidéo %1$d
warpdrive.ship.attached_players=Joueurs attachés: %1$s
warpdrive.ship.player_attached=Tu es désormais attaché au vaisseau %1$s.\nLes joueurs attachés sont %2$s
warpdrive.ship.player_detached=Tu es désormais détaché du vaisseau %1$s.\nLes joueurs attachés sont %2$s
warpdrive.ship.status_line.cooling=Encore %1$d s de refroidissement.
warpdrive.ship.status_line.isolation=Les %1$d blocs d'isolations actifs fournissent %2$2.1f%% d'absorption.
warpdrive.energy.status_line=Le niveau d'énergie est de %1$s / %2$s EU.
warpdrive.energy.side.changedToInput=Le coté %1$s est en mode Réception d'énergie!
warpdrive.energy.side.changedToOutput=Le coté %1$s est en mode Emission d'énergie!
warpdrive.energy.side.changedToDisabled=Le coté %1$s side est en mode Inactif!
warpdrive.energy.side.changed_to_input=Le coté %1$s est en mode Réception d'énergie!
warpdrive.energy.side.changed_to_output=Le coté %1$s est en mode Emission d'énergie!
warpdrive.energy.side.changed_to_disabled=Le coté %1$s side est en mode Inactif!
warpdrive.accelerator.guide.lowPower_noStorage=La capacité de stockage d'énergie est insuffisante; Nous avons besoin d'au moins %1$d pour continuer mais ne pouvons stocker que %2$d
warpdrive.accelerator.guide.lowPower_accelerating=Nous sommes à court d'énergie Capitaine, les bunches de particules s'échappent, préparez-vous à une irradiation de masse!
warpdrive.accelerator.guide.lowPower_noParticles=Il nous faut plus d'énergie pour démarrer l'accélérateur!
warpdrive.accelerator.guide.noChiller=Cet accélérateur n'a aucun refroidisseur!
warpdrive.accelerator.guide.low_power.not_enough_storage=La capacité de stockage d'énergie est insuffisante; Nous avons besoin d'au moins %1$d pour continuer mais ne pouvons stocker que %2$d
warpdrive.accelerator.guide.low_power.accelerating=Nous sommes à court d'énergie Capitaine, les bunches de particules s'échappent, préparez-vous à une irradiation de masse!
warpdrive.accelerator.guide.low_power.no_particles=Il nous faut plus d'énergie pour démarrer l'accélérateur!
warpdrive.accelerator.guide.no_chiller=Cet accélérateur n'a aucun refroidisseur!
warpdrive.beam_frequency.tooltip=Fréquence de faisceau ajustée à %1$d
warpdrive.beam_frequency.get=Beam frequency %2$d has been retrieved from %1$s
@ -605,7 +605,7 @@ warpdrive.control_channel.status_line.valid=Le canal de contrôle %1$d est valid
warpdrive.control_channel.status_line.invalid=§cLe canal de contrôle %1$d est invalide.
warpdrive.control_channel.status_line.undefined=§7Le canal de contrôle est non défini.\n§bUtilises un Diapason§r pour l'ajuster.
warpdrive.forcefield.guide.lowPower=Nous sommes à court d'énergie Capitaine, réduissez la consommation ou appelez l'ingénieur écossais pour booster notre production!
warpdrive.forcefield.guide.low_power=Nous sommes à court d'énergie Capitaine, réduissez la consommation ou appelez l'ingénieur écossais pour booster notre production!
warpdrive.forcefield.shape.status_line.none=§cLa forme n'est pas définie.
warpdrive.forcefield.shape.status_line.double=La forme est %1$s plein(e)
@ -646,22 +646,22 @@ warpdrive.particle.antimatter.tooltip=Produit par collision d'un bunch de partic
warpdrive.particle.strange_matter.name=matière étrange
warpdrive.particle.strange_matter.tooltip=Produit par collision frontale de 2 bunches de particules dans un accélérateur supérieur
warpdrive.upgrade.result.noUpgradeToDismount=§cAucune amélioration à démonter.
warpdrive.upgrade.result.notEnoughUpgrades=§cIl faut au moins 1 object pour améliorer ce bloc.
warpdrive.upgrade.result.invalidUpgrade=§cThis is not a valid item to upgrade this block.
warpdrive.upgrade.result.invalidProjectorUpgrade=§cCette amélioration est trop grosse pour un projecteur, utilises un relais à la place.
warpdrive.upgrade.result.invalidRelayUpgrade=§cCette amélioration s'applique uniquement sur un projecteur.
warpdrive.upgrade.result.validUpgrades=Valid upgrades for this block include: %1$s. @TODO not implemented yet
warpdrive.upgrade.result.tooManyUpgrades=§cCette amélioration est déjà montée %1$s fois sur ce bloc, utilises un relais à la place.
warpdrive.upgrade.result.no_upgrade_to_dismount=§cAucune amélioration à démonter.
warpdrive.upgrade.result.not_enough_upgrades=§cIl faut au moins 1 object pour améliorer ce bloc.
warpdrive.upgrade.result.invalid_upgrade=§cThis is not a valid item to upgrade this block.
warpdrive.upgrade.result.invalid_upgrade_for_projector=§cCette amélioration est trop grosse pour un projecteur, utilises un relais à la place.
warpdrive.upgrade.result.invalid_upgrade_for_relay=§cCette amélioration s'applique uniquement sur un projecteur.
warpdrive.upgrade.result.valid_upgrades=Valid upgrades for this block include: %1$s. @TODO not implemented yet
warpdrive.upgrade.result.too_many_upgrades=§cCette amélioration est déjà montée %1$s fois sur ce bloc, utilises un relais à la place.
warpdrive.upgrade.result.dismounted=Amélioration %1$s démontée correctement.
warpdrive.upgrade.result.mounted=Amélioration %1$s montée correctement.
warpdrive.upgrade.result.wrongShapeSide=§cIl n'y a pas de projecteur électromagnétique sur cette face.
warpdrive.upgrade.result.noShapeToDismount=§cAucune forme à démonter.
warpdrive.upgrade.result.notEnoughShapes.double=§cIl faut au moins 2 objets pour établir la forme d'un projecteur double face.
warpdrive.upgrade.result.notEnoughShapes.single=§cIl faut au moins 1 object pour établir la forme d'un projecteur simple face.
warpdrive.upgrade.result.shapeDismounted=Forme démontée correctement.
warpdrive.upgrade.result.shapeMounted=Forme montée correctement.
warpdrive.upgrade.result.wrong_shape_side=§cIl n'y a pas de projecteur électromagnétique sur cette face.
warpdrive.upgrade.result.no_shape_to_dismount=§cAucune forme à démonter.
warpdrive.upgrade.result.not_enough_shapes.double=§cIl faut au moins 2 objets pour établir la forme d'un projecteur double face.
warpdrive.upgrade.result.not_enough_shapes.single=§cIl faut au moins 1 object pour établir la forme d'un projecteur simple face.
warpdrive.upgrade.result.shape_dismounted=Forme démontée correctement.
warpdrive.upgrade.result.shape_mounted=Forme montée correctement.
warpdrive.upgrade.status_line.none=§7Pas d'augmentation installée.
warpdrive.upgrade.status_line.valid=Augmenté avec %1$s.
@ -675,16 +675,16 @@ warpdrive.video_channel.status_line.invalid=§cLe canal vidéo %1$d est invalide
warpdrive.video_channel.status_line.not_loaded=§cLe canal vidéo %1$d est invalide ou la caméra est trop loin!
warpdrive.video_channel.status_line.undefined=§7Le canal vidéo est non défini.\n§bUtilises un Diapason§r pour l'ajuster.
warpdrive.cloaking_core.missingInnerAndOuter=§cIntegrité réduite à %1$d%%: bobine(s) de canalisation manquante(nt) en direction de %2$s, et bobine(s) de projection manquante(nt) en direction de %3$s
warpdrive.cloaking_core.missingInner=§cIntegrité réduite à %1$d%%: bobine(s) de canalisation manquante(nt) en direction de %2$s
warpdrive.cloaking_core.missingOuter=§cIntegrité réduite à %1$d%%: bobine(s) de projection manquante(nt) en direction de %2$s
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§cIntegrité réduite à %1$d%%: bobine(s) de canalisation manquante(nt) en direction de %2$s, et bobine(s) de projection manquante(nt) en direction de %3$s
warpdrive.cloaking_core.missing_channeling_coils=§cIntegrité réduite à %1$d%%: bobine(s) de canalisation manquante(nt) en direction de %2$s
warpdrive.cloaking_core.missing_projecting_coils=§cIntegrité réduite à %1$d%%: bobine(s) de projection manquante(nt) en direction de %2$s
warpdrive.cloaking_core.valid=Le système est valide
warpdrive.cloaking_core.disabled=Le champ d'invisibilité est désactivé
warpdrive.cloaking_core.lowPower=§cLe champ d'invisibilité est en panne. Il nous faut plus d'énergie, Capitaine!
warpdrive.cloaking_core.low_power=§cLe champ d'invisibilité est en panne. Il nous faut plus d'énergie, Capitaine!
warpdrive.cloaking_core.cloaking=Un champ de niveau %1$d couvre actuellement %2$d blocs!
warpdrive.ic2_reactor_laser_monitor.noReactor=Pas de réacteur IC2 trouvé!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d réacteur(s) connecté(s).
warpdrive.ic2_reactor_laser_monitor.no_reactor=Pas de réacteur IC2 trouvé!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Réacteur connecté au %1$s.
warpdrive.transporter.status=De (%1$.0f %2$.0f %3$.0f) à (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -16,29 +16,29 @@ death.attack.warpdrive.warm.player=%1$s is gekookt door %2$s
itemGroup.warpdrive=WarpDrive
item.warpdrive.crafting.Malformed.name=Verkeerd item
item.warpdrive.crafting.EmeraldCrystal.name=Smaragd afgestemd kristal
item.warpdrive.crafting.EnderCrystal.name=Einde afgestemd kristal
item.warpdrive.crafting.DiamondCrystal.name=Diamant afgestemd kristal
item.warpdrive.crafting.DiffractionGrating.name=Diffractierooster
item.warpdrive.crafting.ReactorCore.name=Reactor Kern
item.warpdrive.crafting.ComputerInterface.name=Computer Interface
item.warpdrive.crafting.PowerInterface.name=Stroom Interface
item.warpdrive.crafting.CapacitiveCrystal.name=Capacitief Kristal
item.warpdrive.crafting.AirCanisterEmpty.name=Lege zuurstoffles
item.warpdrive.crafting.AirCanisterEmpty.tooltip=§bRechts-klik op de zuurstofgenerator§7 om me te hervullen
item.warpdrive.crafting.Lens.name=Lens
item.warpdrive.crafting.Zoom.name=Zoom
item.warpdrive.crafting.GlassTank.name=Tank van Glas
item.warpdrive.crafting.FlatScreen.name=Flat Screen
item.warpdrive.crafting.MemoryCrystal.name=Geheugen Kristal
item.warpdrive.crafting.Motor.name=Motor
item.warpdrive.crafting.BoneCharcoal.name=Botkool
item.warpdrive.crafting.ActivatedCarbon.name=Geactiveerde Koolstof
item.warpdrive.crafting.LaserMediumEmpty.name=Lege Deeltjesversneller
item.warpdrive.crafting.CoilCrystal.name=Spoelkristal
item.warpdrive.crafting.ElectromagneticProjector.name=Electromagnetische Projector
item.warpdrive.crafting.Superconductor.name=Superconductor
item.warpdrive.component.malformed.name=Verkeerd item
item.warpdrive.component.emerald_crystal.name=Smaragd afgestemd kristal
item.warpdrive.component.ender_crystal.name=Einde afgestemd kristal
item.warpdrive.component.diamond_crystal.name=Diamant afgestemd kristal
item.warpdrive.component.diffraction_grating.name=Diffractierooster
item.warpdrive.component.reactor_core.name=Reactor Kern
item.warpdrive.component.computer_interface.name=Computer Interface
item.warpdrive.component.power_interface.name=Stroom Interface
item.warpdrive.component.capacitive_crystal.name=Capacitief Kristal
item.warpdrive.component.air_canister_empty.name=Lege zuurstoffles
item.warpdrive.component.air_canister_empty.tooltip=§bRechts-klik op de zuurstofgenerator§7 om me te hervullen
item.warpdrive.component.lens.name=Lens
item.warpdrive.component.zoom.name=Zoom
item.warpdrive.component.glass_tank.name=Tank van Glas
item.warpdrive.component.flat_screen.name=Flat Screen
item.warpdrive.component.memory_crystal.name=Geheugen Kristal
item.warpdrive.component.motor.name=Motor
item.warpdrive.component.bone_charcoal.name=Botkool
item.warpdrive.component.activated_carbon.name=Geactiveerde Koolstof
item.warpdrive.component.laser_medium_empty.name=Lege Deeltjesversneller
item.warpdrive.component.coil_crystal.name=Spoelkristal
item.warpdrive.component.electromagnetic_projector.name=Electromagnetische Projector
item.warpdrive.component.superconductor.name=Superconductor
item.warpdrive.armor.helmet.name=Warp Helm
item.warpdrive.armor.chestplate.name=Warp Borstplaat
@ -565,23 +565,23 @@ tile.warpdrive.hull3.stairs.black.name=Zwart Gekleurd Superieur Pantser Trap
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§cDit blok heeft een verversing nodig door het de breken en weer te plaatsen.
warpdrive.monitor.viewingCamera=Camera op%2$d, %3$d, %4$d met videokanaal %1$d aan het bekijken...
warpdrive.ship.attachedPlayers=Aangesloten Spelers: %1$s
warpdrive.ship.playerAttached=Je bent nu aangesloten op schip %1$s.\nDe aangesloten spelers zijn %2$s
warpdrive.ship.playerDetached=Je bent nu afgesloten op schip %1$s.\nDe aangesloten spelers zijn %2$s
warpdrive.error.bad_tile_entity=§cDit blok heeft een verversing nodig door het de breken en weer te plaatsen.
warpdrive.monitor.viewing_camera=Camera op%2$d, %3$d, %4$d met videokanaal %1$d aan het bekijken...
warpdrive.ship.attached_players=Aangesloten Spelers: %1$s
warpdrive.ship.player_attached=Je bent nu aangesloten op schip %1$s.\nDe aangesloten spelers zijn %2$s
warpdrive.ship.player_detached=Je bent nu afgesloten op schip %1$s.\nDe aangesloten spelers zijn %2$s
warpdrive.ship.status_line.cooling=%1$d seconden over van afkoeling
warpdrive.ship.status_line.isolation=%1$d actieve isolatie-blokken geven %2$2.1f%% absorptie.
warpdrive.energy.status_line=Energielevel is op %1$s / %2$s EU.
warpdrive.energy.side.changedToInput=%1$s kant verandert naar energie input modus!
warpdrive.energy.side.changedToOutput=%1$s kant verandert naar energie output modus!
warpdrive.energy.side.changedToDisabled=%1$s kant verandert naar inactief modus!
warpdrive.energy.side.changed_to_input=%1$s kant verandert naar energie input modus!
warpdrive.energy.side.changed_to_output=%1$s kant verandert naar energie output modus!
warpdrive.energy.side.changed_to_disabled=%1$s kant verandert naar inactief modus!
warpdrive.accelerator.guide.lowPower_noStorage=Energie-opslagcapaciteit is te weinig; we hebben tenminste %1$d om verder te opereren maar we kunnen alleen %2$d opslaan
warpdrive.accelerator.guide.lowPower_accelerating=We verliezen stroom baas, deeltjes vliegen in het rond, bereid je voor op grote bestraling!
warpdrive.accelerator.guide.lowPower_noParticles=We hebben meer stroom nodig om de versneller te activeren!
warpdrive.accelerator.guide.noChiller=Geen koeler gevonden voor deze versneller!
warpdrive.accelerator.guide.low_power.not_enough_storage=Energie-opslagcapaciteit is te weinig; we hebben tenminste %1$d om verder te opereren maar we kunnen alleen %2$d opslaan
warpdrive.accelerator.guide.low_power.accelerating=We verliezen stroom baas, deeltjes vliegen in het rond, bereid je voor op grote bestraling!
warpdrive.accelerator.guide.low_power.no_particles=We hebben meer stroom nodig om de versneller te activeren!
warpdrive.accelerator.guide.no_chiller=Geen koeler gevonden voor deze versneller!
warpdrive.beam_frequency.tooltip=Straal-frequentie is gezet naar %1$d
warpdrive.beam_frequency.get=Straal-frequentie %2$d is opgehaald door %1$s
@ -602,7 +602,7 @@ warpdrive.control_channel.status_line.valid=Controlekanaal %1$d is Geldig.
warpdrive.control_channel.status_line.invalid=§cControlekanaal %1$d is incorrect.
warpdrive.control_channel.status_line.undefined=§7Niet gedefinieerde controlekanaal.\n§bGebruik een Afstemmingsvork§r om deze te zetten.
warpdrive.forcefield.guide.lowPower=we verliezen stroom kapitein, verminder onze consumptie of laat die schotse ingenieur onze stroomkracht vergroten!
warpdrive.forcefield.guide.low_power=we verliezen stroom kapitein, verminder onze consumptie of laat die schotse ingenieur onze stroomkracht vergroten!
warpdrive.forcefield.shape.status_line.none=§cVorm is niet gedefinieerd.
warpdrive.forcefield.shape.status_line.double=Vorm is een volledig vorm %1$s
@ -643,22 +643,22 @@ warpdrive.particle.antimatter.tooltip=Geproduceerd door de botsing van een aanta
warpdrive.particle.strange_matter.name=rare materie
warpdrive.particle.strange_matter.tooltip=Geproduceerd door de botsing van 2 wolkjes van deeltjes in de Superieure Versneller
warpdrive.upgrade.result.noUpgradeToDismount=§cGeen upgrade om uit te schakelen
warpdrive.upgrade.result.notEnoughUpgrades=§cJe hebt tenminste 1 item nodig om dit blok te upgraden.
warpdrive.upgrade.result.invalidUpgrade=§cDid is niet het correcte item om dit blok te upgraden.
warpdrive.upgrade.result.invalidProjectorUpgrade=§cDeze upgrade is te groot voor de projector, probeer een relais te gebruiken.
warpdrive.upgrade.result.invalidRelayUpgrade=§cDeze upgrade kan alleen op projectors.
warpdrive.upgrade.result.validUpgrades=Geldige upgrades voor dit block zijn: %1$s. @TODO nog niet ingebouwd
warpdrive.upgrade.result.tooManyUpgrades=§cEr zijn al %1$d upgrades geinstalleert.
warpdrive.upgrade.result.no_upgrade_to_dismount=§cGeen upgrade om uit te schakelen
warpdrive.upgrade.result.not_enough_upgrades=§cJe hebt tenminste 1 item nodig om dit blok te upgraden.
warpdrive.upgrade.result.invalid_upgrade=§cDid is niet het correcte item om dit blok te upgraden.
warpdrive.upgrade.result.invalid_upgrade_for_projector=§cDeze upgrade is te groot voor de projector, probeer een relais te gebruiken.
warpdrive.upgrade.result.invalid_upgrade_for_relay=§cDeze upgrade kan alleen op projectors.
warpdrive.upgrade.result.valid_upgrades=Geldige upgrades voor dit block zijn: %1$s. @TODO nog niet ingebouwd
warpdrive.upgrade.result.too_many_upgrades=§cEr zijn al %1$d upgrades geinstalleert.
warpdrive.upgrade.result.dismounted=Upgrade %1$s is succesvol uitgeschakeld.
warpdrive.upgrade.result.mounted=Upgrade %1$s is succesvol geplaatst.
warpdrive.upgrade.result.wrongShapeSide=§cEr is geen elektromagnetische-projector aan deze kant.
warpdrive.upgrade.result.noShapeToDismount=§cGeen vorm om uit te schakelen.
warpdrive.upgrade.result.notEnoughShapes.double=§cJe hebt tenminste 2 items nodig om de vorm van een dubbelzijdige-projector te zetten.
warpdrive.upgrade.result.notEnoughShapes.single=§cJe hebt tenminste 1 items nodig om de vorm van een eenzijdige-projector te zetten.
warpdrive.upgrade.result.shapeDismounted=Vorm succesvol uitgeschakeld.
warpdrive.upgrade.result.shapeMounted=Vorm succesvol geplaatst.
warpdrive.upgrade.result.wrong_shape_side=§cEr is geen elektromagnetische-projector aan deze kant.
warpdrive.upgrade.result.no_shape_to_dismount=§cGeen vorm om uit te schakelen.
warpdrive.upgrade.result.not_enough_shapes.double=§cJe hebt tenminste 2 items nodig om de vorm van een dubbelzijdige-projector te zetten.
warpdrive.upgrade.result.not_enough_shapes.single=§cJe hebt tenminste 1 items nodig om de vorm van een eenzijdige-projector te zetten.
warpdrive.upgrade.result.shape_dismounted=Vorm succesvol uitgeschakeld.
warpdrive.upgrade.result.shape_mounted=Vorm succesvol geplaatst.
warpdrive.upgrade.status_line.none=§7Geen upgrade geinstalleerd.
warpdrive.upgrade.status_line.valid=Geupgrade met1$s.
@ -672,15 +672,15 @@ warpdrive.video_channel.status_line.invalid=§cVideokanaal %1$d is ongeldig.
warpdrive.video_channel.status_line.not_loaded=§cVideokanaal %1$d is ongeldig of camera is te ver weg!
warpdrive.video_channel.status_line.undefined=§7niet gedefinieerd videokanaal.\n§bGebruik een Afstemmingsvork§r om het te zetten.
warpdrive.cloaking_core.missingInnerAndOuter=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missingInner=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missingOuter=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missing_channeling_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missing_projecting_coils=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.disabled=Dekmantelveld is uitgeschakeld
warpdrive.cloaking_core.lowPower=§cDekmantelveld is uit, We hebben meer stroom nodig kapitein!
warpdrive.cloaking_core.low_power=§cDekmantelveld is uit, We hebben meer stroom nodig kapitein!
warpdrive.cloaking_core.cloaking=Een Niveau %1$d dekmantelveld bedekt huidig %2$d blokken!
warpdrive.ic2_reactor_laser_monitor.noReactor=Geen reactor gevonden!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d reactor(s) aangesloten.
warpdrive.ic2_reactor_laser_monitor.no_reactor=Geen reactor gevonden!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Reactor connected on %1$s.
warpdrive.transporter.status=Van (%1$.0f %2$.0f %3$.0f) naar (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -37,7 +37,7 @@ item.warpdrive.component.bone_charcoal.name=Костяной уголь
item.warpdrive.component.activated_carbon.name=Активированный уголь
item.warpdrive.component.laser_medium_empty.name=Лазерный излучатель (Пустой)
item.warpdrive.component.coil_crystal.name=Coil Crystal
item.warpdrive.component.electromagnetic_rojector.name=Electromagnetic Projector
item.warpdrive.component.electromagnetic_projector.name=Electromagnetic Projector
item.warpdrive.component.superconductor.name=Superconductor
item.warpdrive.armor.helmet.name=Космический шлем
@ -568,23 +568,23 @@ tile.warpdrive.hull3.stairs.black.name=Black Stained Superior Hull Stairs
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§cэтот блок нужно сломать и поставить заново.
warpdrive.monitor.viewingCamera=Просмотр камеры на %2$d, %3$d, %4$d через канал %1$d
warpdrive.ship.attachedPlayers=Прирепленные игроки: %1$s
warpdrive.ship.playerAttached=Вы были прикреплены к кораблю %1$s.\nПрикрепленные игроки: %2$s
warpdrive.ship.playerDetached=Вы были откреплены от корабля %1$s.\nПрикрепленные игроки: %2$s
warpdrive.error.bad_tile_entity=§cэтот блок нужно сломать и поставить заново.
warpdrive.monitor.viewing_camera=Просмотр камеры на %2$d, %3$d, %4$d через канал %1$d
warpdrive.ship.attached_players=Прирепленные игроки: %1$s
warpdrive.ship.player_attached=Вы были прикреплены к кораблю %1$s.\nПрикрепленные игроки: %2$s
warpdrive.ship.player_detached=Вы были откреплены от корабля %1$s.\nПрикрепленные игроки: %2$s
warpdrive.ship.status_line.cooling=Осталось %1$d с до остывания.
warpdrive.ship.status_line.isolation=%1$d активных блоков изоляции предоставляют %2$2.1f%% поглощения.
warpdrive.energy.status_line=Содержит энергии: %1$s / %2$s EU.
warpdrive.energy.side.changedToInput=%1$s side changed to energy Input mode!
warpdrive.energy.side.changedToOutput=%1$s side changed to energy Output mode!
warpdrive.energy.side.changedToDisabled=%1$s side changed to Disabled mode!
warpdrive.energy.side.changed_to_input=%1$s side changed to energy Input mode!
warpdrive.energy.side.changed_to_output=%1$s side changed to energy Output mode!
warpdrive.energy.side.changed_to_disabled=%1$s side changed to Disabled mode!
warpdrive.accelerator.guide.lowPower_noStorage=Energy storage is too low; we need at least %1$d to continue operation but can only store %2$d
warpdrive.accelerator.guide.lowPower_accelerating=We're running out of power chief, particles are on the loose, prepare for massive irradiation!
warpdrive.accelerator.guide.lowPower_noParticles=We need more power to start the accelerator!
warpdrive.accelerator.guide.noChiller=No chiller could be found for this accelerator!
warpdrive.accelerator.guide.low_power.not_enough_storage=Energy storage is too low; we need at least %1$d to continue operation but can only store %2$d
warpdrive.accelerator.guide.low_power.accelerating=We're running out of power chief, particles are on the loose, prepare for massive irradiation!
warpdrive.accelerator.guide.low_power.no_particles=We need more power to start the accelerator!
warpdrive.accelerator.guide.no_chiller=No chiller could be found for this accelerator!
warpdrive.beam_frequency.tooltip=Частота луча установлена на %1$d
warpdrive.beam_frequency.get=Beam frequency %2$d has been retrieved from %1$s
@ -605,7 +605,7 @@ warpdrive.control_channel.status_line.valid=Control channel %1$d is valid.
warpdrive.control_channel.status_line.invalid=§cControl channel %1$d is invalid.
warpdrive.control_channel.status_line.undefined=§7Undefined Control channel.\n§bUse a Tuning fork§r to set it.
warpdrive.forcefield.guide.lowPower=We're running out of power captain, reduce our consumption or get that scottish engineer to boost our power!
warpdrive.forcefield.guide.low_power=We're running out of power captain, reduce our consumption or get that scottish engineer to boost our power!
warpdrive.forcefield.shape.status_line.none=§cShape isn't defined.
warpdrive.forcefield.shape.status_line.double=Shape is a full %1$s
@ -646,22 +646,22 @@ warpdrive.particle.antimatter.tooltip=Produced by colliding a particle bunch in
warpdrive.particle.strange_matter.name=strange matter
warpdrive.particle.strange_matter.tooltip=Produced by colliding 2 particle bunches in a superior accelerator
warpdrive.upgrade.result.noUpgradeToDismount=§cNo upgrade to dismount.
warpdrive.upgrade.result.notEnoughUpgrades=§cYou need at least 1 item to upgrade this block.
warpdrive.upgrade.result.invalidUpgrade=§cThis is not a valid item to upgrade this block.
warpdrive.upgrade.result.invalidProjectorUpgrade=§cThis upgrade is too big for a projector, use a relay instead.
warpdrive.upgrade.result.invalidRelayUpgrade=§cThis upgrade only applies to projectors.
warpdrive.upgrade.result.validUpgrades=Valid upgrades for this block include: %1$s. @TODO not implemented yet
warpdrive.upgrade.result.tooManyUpgrades=§cThere's already %1$d upgrades installed.
warpdrive.upgrade.result.no_upgrade_to_dismount=§cNo upgrade to dismount.
warpdrive.upgrade.result.not_enough_upgrades=§cYou need at least 1 item to upgrade this block.
warpdrive.upgrade.result.invalid_upgrade=§cThis is not a valid item to upgrade this block.
warpdrive.upgrade.result.invalid_upgrade_for_projector=§cThis upgrade is too big for a projector, use a relay instead.
warpdrive.upgrade.result.invalid_upgrade_for_relay=§cThis upgrade only applies to projectors.
warpdrive.upgrade.result.valid_upgrades=Valid upgrades for this block include: %1$s. @TODO not implemented yet
warpdrive.upgrade.result.too_many_upgrades=§cThere's already %1$d upgrades installed.
warpdrive.upgrade.result.dismounted=Upgrade %1$s was dismounted successfully.
warpdrive.upgrade.result.mounted=Upgrade %1$s was mounted successfully.
warpdrive.upgrade.result.wrongShapeSide=§cThere's no Electromagnetic projector on this side.
warpdrive.upgrade.result.noShapeToDismount=§cNo shape to dismount.
warpdrive.upgrade.result.notEnoughShapes.double=§cYou need at least 2 items to set the shape of a double sided projector.
warpdrive.upgrade.result.notEnoughShapes.single=§cYou need at least 1 item to set the shape of a single sided projector.
warpdrive.upgrade.result.shapeDismounted=Shape dismounted successfully.
warpdrive.upgrade.result.shapeMounted=Shape mounted successfully.
warpdrive.upgrade.result.wrong_shape_side=§cThere's no Electromagnetic projector on this side.
warpdrive.upgrade.result.no_shape_to_dismount=§cNo shape to dismount.
warpdrive.upgrade.result.not_enough_shapes.double=§cYou need at least 2 items to set the shape of a double sided projector.
warpdrive.upgrade.result.not_enough_shapes.single=§cYou need at least 1 item to set the shape of a single sided projector.
warpdrive.upgrade.result.shape_dismounted=Shape dismounted successfully.
warpdrive.upgrade.result.shape_mounted=Shape mounted successfully.
warpdrive.upgrade.status_line.none=§7No upgrade installed.
warpdrive.upgrade.status_line.valid=Upgraded with %1$s.
@ -675,16 +675,16 @@ warpdrive.video_channel.status_line.invalid=§cВидеоканал %1$d нед
warpdrive.video_channel.status_line.not_loaded=§cВидеоканал %1$d недействителен или камера слишком далеко.
warpdrive.video_channel.status_line.undefined=§7Undefined Video channel.\n§bUse a Tuning fork§r to set it.
warpdrive.cloaking_core.missingInnerAndOuter=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missingInner=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missingOuter=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missing_channeling_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missing_projecting_coils=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.valid=System is valid
warpdrive.cloaking_core.disabled=Маскировка выключена
warpdrive.cloaking_core.lowPower=§cМаскировка выключилась, нужно больше энергии, капитан!
warpdrive.cloaking_core.low_power=§cМаскировка выключилась, нужно больше энергии, капитан!
warpdrive.cloaking_core.cloaking=Маскировка %1$d уровня покрывает %2$d блоков.
warpdrive.ic2_reactor_laser_monitor.noReactor=Реактор не найден!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d реактор(ов) подключено.
warpdrive.ic2_reactor_laser_monitor.no_reactor=Реактор не найден!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Reactor connected on %1$s.
warpdrive.transporter.status=Из (%1$.0f %2$.0f %3$.0f) в (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -16,29 +16,29 @@ death.attack.warpdrive.warm.player=%1$s被%2$s煮熟了
itemGroup.warpdrive=曲率驱动
item.warpdrive.crafting.Malformed.name=畸变废品
item.warpdrive.crafting.EmeraldCrystal.name=绿宝石调谐水晶
item.warpdrive.crafting.EnderCrystal.name=末影调谐水晶
item.warpdrive.crafting.DiamondCrystal.name=钻石调谐水晶
item.warpdrive.crafting.DiffractionGrating.name=衍射光栅
item.warpdrive.crafting.ReactorCore.name=反应堆芯
item.warpdrive.crafting.ComputerInterface.name=计算机接口
item.warpdrive.crafting.PowerInterface.name=电源接口
item.warpdrive.crafting.CapacitiveCrystal.name=电容水晶
item.warpdrive.crafting.AirCanisterEmpty.name=空气罐(空)
item.warpdrive.crafting.AirCanisterEmpty.tooltip=§b右键一个空气发生器§7来进行填充
item.warpdrive.crafting.Lens.name=透镜
item.warpdrive.crafting.Zoom.name=缩放
item.warpdrive.crafting.GlassTank.name=玻璃水槽
item.warpdrive.crafting.FlatScreen.name=平面屏幕
item.warpdrive.crafting.MemoryCrystal.name=记忆水晶
item.warpdrive.crafting.Motor.name=发动机
item.warpdrive.crafting.BoneCharcoal.name=骨炭
item.warpdrive.crafting.ActivatedCarbon.name=活性炭
item.warpdrive.crafting.LaserMediumEmpty.name=激光媒质(空)
item.warpdrive.crafting.CoilCrystal.name=线圈水晶
item.warpdrive.crafting.ElectromagneticProjector.name=电磁投影仪
item.warpdrive.crafting.Superconductor.name=超导体
item.warpdrive.component.malformed.name=畸变废品
item.warpdrive.component.emerald_crystal.name=绿宝石调谐水晶
item.warpdrive.component.ender_crystal.name=末影调谐水晶
item.warpdrive.component.diamond_crystal.name=钻石调谐水晶
item.warpdrive.component.diffraction_grating.name=衍射光栅
item.warpdrive.component.reactor_core.name=反应堆芯
item.warpdrive.component.computer_interface.name=计算机接口
item.warpdrive.component.power_interface.name=电源接口
item.warpdrive.component.capacitive_crystal.name=电容水晶
item.warpdrive.component.air_canister_empty.name=空气罐(空)
item.warpdrive.component.air_canister_empty.tooltip=§b右键一个空气发生器§7来进行填充
item.warpdrive.component.lens.name=透镜
item.warpdrive.component.zoom.name=缩放
item.warpdrive.component.glass_tank.name=玻璃水槽
item.warpdrive.component.flat_screen.name=平面屏幕
item.warpdrive.component.memory_crystal.name=记忆水晶
item.warpdrive.component.motor.name=发动机
item.warpdrive.component.bone_charcoal.name=骨炭
item.warpdrive.component.activated_carbon.name=活性炭
item.warpdrive.component.laser_medium_empty.name=激光媒质(空)
item.warpdrive.component.coil_crystal.name=线圈水晶
item.warpdrive.component.electromagnetic_projector.name=电磁投影仪
item.warpdrive.component.superconductor.name=超导体
item.warpdrive.armor.helmet.name=曲率头盔
item.warpdrive.armor.chestplate.name=曲率胸甲
@ -565,23 +565,23 @@ tile.warpdrive.hull3.stairs.black.name=黑色卓越船体楼梯
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§c需要重放置以更新此方块.
warpdrive.monitor.viewingCamera=观景相机位于 %2$d, %3$d, %4$d 在视频频道%1$d
warpdrive.ship.attachedPlayers=所属的玩家: %1$s
warpdrive.ship.playerAttached=你在飞船 %1$s上.\n属于%2$s
warpdrive.ship.playerDetached=你已经脱离了飞船 %1$s.\n属于%2$s
warpdrive.error.bad_tile_entity=§c需要重放置以更新此方块.
warpdrive.monitor.viewing_camera=观景相机位于 %2$d, %3$d, %4$d 在视频频道%1$d
warpdrive.ship.attached_players=所属的玩家: %1$s
warpdrive.ship.player_attached=你在飞船 %1$s上.\n属于%2$s
warpdrive.ship.player_detached=你已经脱离了飞船 %1$s.\n属于%2$s
warpdrive.ship.status_line.cooling=%1$d s 冷却时间
warpdrive.ship.status_line.isolation=%1$d有效的隔离方块提供%2$2.1f%%吸收.
warpdrive.energy.status_line=能量水平%1$s / %2$s EU.
warpdrive.energy.side.changedToInput=%1$s侧面更改为能量输入模式
warpdrive.energy.side.changedToOutput=%1$s侧面更改为能量输出模式
warpdrive.energy.side.changedToDisabled=%1$s侧面更改为禁用模式
warpdrive.energy.side.changed_to_input=%1$s侧面更改为能量输入模式
warpdrive.energy.side.changed_to_output=%1$s侧面更改为能量输出模式
warpdrive.energy.side.changed_to_disabled=%1$s侧面更改为禁用模式
warpdrive.accelerator.guide.lowPower_noStorage=能量不足;我们需要%1$d的能量储备维持运转 目前仅剩%2$d
warpdrive.accelerator.guide.lowPower_accelerating=我们的主能量储备耗尽, 粒子正在泄漏,准备承受巨量辐射!
warpdrive.accelerator.guide.lowPower_noParticles=需要更多能量以启动加速器!
warpdrive.accelerator.guide.noChiller=这台加速器没有冷却设备!
warpdrive.accelerator.guide.low_power.not_enough_storage=能量不足;我们需要%1$d的能量储备维持运转 目前仅剩%2$d
warpdrive.accelerator.guide.low_power.accelerating=我们的主能量储备耗尽, 粒子正在泄漏,准备承受巨量辐射!
warpdrive.accelerator.guide.low_power.no_particles=需要更多能量以启动加速器!
warpdrive.accelerator.guide.no_chiller=这台加速器没有冷却设备!
warpdrive.beam_frequency.tooltip=设置光束频率为%1$d
warpdrive.beam_frequency.get=光束频率%2$d 已从 %1$s 断开
@ -602,7 +602,7 @@ warpdrive.control_channel.status_line.valid=控制连接 %1$d 有效.
warpdrive.control_channel.status_line.invalid=§c控制连接 %1$d 无效.
warpdrive.control_channel.status_line.undefined=§7未定义控制连接.\n§b使用音叉§r进行设置.
warpdrive.forcefield.guide.lowPower=舰长,我们的能量已耗尽,请降低能耗或者找一个苏格兰工程师恢复能量!
warpdrive.forcefield.guide.low_power=舰长,我们的能量已耗尽,请降低能耗或者找一个苏格兰工程师恢复能量!
warpdrive.forcefield.shape.status_line.none=§c形状未定义.
warpdrive.forcefield.shape.status_line.double=形状是完整的%1$s
@ -643,22 +643,22 @@ warpdrive.particle.antimatter.tooltip=产生于卓越粒子加速器的束流对
warpdrive.particle.strange_matter.name=奇异物质
warpdrive.particle.strange_matter.tooltip=产生于卓越粒子加速器的二级束流对撞中.
warpdrive.upgrade.result.noUpgradeToDismount=§c没有可卸载的升级
warpdrive.upgrade.result.notEnoughUpgrades=§c你需要至少一个物品去升级这个方块
warpdrive.upgrade.result.invalidUpgrade=§c这不是一个能够升级升级方块的有效物品
warpdrive.upgrade.result.invalidProjectorUpgrade=§c这个升级对于一个投影仪来说过于巨大需要用一个继电器来替代它.
warpdrive.upgrade.result.invalidRelayUpgrade=§c这个升级只适用于投影仪.
warpdrive.upgrade.result.validUpgrades=这个方块所能加载的有效升级包括: %1$s. @TODO 仍未加载
warpdrive.upgrade.result.tooManyUpgrades=§c这个 %1$d升级已经安装.
warpdrive.upgrade.result.no_upgrade_to_dismount=§c没有可卸载的升级
warpdrive.upgrade.result.not_enough_upgrades=§c你需要至少一个物品去升级这个方块
warpdrive.upgrade.result.invalid_upgrade=§c这不是一个能够升级升级方块的有效物品
warpdrive.upgrade.result.invalid_upgrade_for_projector=§c这个升级对于一个投影仪来说过于巨大需要用一个继电器来替代它.
warpdrive.upgrade.result.invalid_upgrade_for_relay=§c这个升级只适用于投影仪.
warpdrive.upgrade.result.valid_upgrades=这个方块所能加载的有效升级包括: %1$s. @TODO 仍未加载
warpdrive.upgrade.result.too_many_upgrades=§c这个 %1$d升级已经安装.
warpdrive.upgrade.result.dismounted=升级 %1$s 已经被成功卸载.
warpdrive.upgrade.result.mounted=升级 %1$s已被成功安装.
warpdrive.upgrade.result.wrongShapeSide=§c这一边没有电磁投影仪。
warpdrive.upgrade.result.noShapeToDismount=§c没有模型可供卸载
warpdrive.upgrade.result.notEnoughShapes.double=§c你需要至少两个物品去设定一个双面投影仪所投影的形状.
warpdrive.upgrade.result.notEnoughShapes.single=§c你需要至少一个物品去设定一个单面投影仪所投影的形状.
warpdrive.upgrade.result.shapeDismounted=模型卸载成功.
warpdrive.upgrade.result.shapeMounted=模型加载成功.
warpdrive.upgrade.result.wrong_shape_side=§c这一边没有电磁投影仪。
warpdrive.upgrade.result.no_shape_to_dismount=§c没有模型可供卸载
warpdrive.upgrade.result.not_enough_shapes.double=§c你需要至少两个物品去设定一个双面投影仪所投影的形状.
warpdrive.upgrade.result.not_enough_shapes.single=§c你需要至少一个物品去设定一个单面投影仪所投影的形状.
warpdrive.upgrade.result.shape_dismounted=模型卸载成功.
warpdrive.upgrade.result.shape_mounted=模型加载成功.
warpdrive.upgrade.status_line.none=§7没有安装升级
warpdrive.upgrade.status_line.valid=用升级%1$s.
@ -672,16 +672,16 @@ warpdrive.video_channel.status_line.invalid=§c视频通道 %1$d 无效.
warpdrive.video_channel.status_line.not_loaded=§c视频通道 %1$d 无效或者是相机的距离太远!
warpdrive.video_channel.status_line.undefined=§7未定义的视频通道.\n§b使用一个音叉§r 去设置它.
warpdrive.cloaking_core.missingInnerAndOuter=§c完整度降低至 %1$d%%: %2$s 线圈失去联系且预计将失去 %3$s 线圈
warpdrive.cloaking_core.missingInner=§c完整度降低至 %1$d%%: %2$s 线圈失去联系
warpdrive.cloaking_core.missingOuter=§c完整度降低至 %1$d%%: 预计丢失 %2$s 线圈
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§c完整度降低至 %1$d%%: %2$s 线圈失去联系且预计将失去 %3$s 线圈
warpdrive.cloaking_core.missing_channeling_coils=§c完整度降低至 %1$d%%: %2$s 线圈失去联系
warpdrive.cloaking_core.missing_projecting_coils=§c完整度降低至 %1$d%%: 预计丢失 %2$s 线圈
warpdrive.cloaking_core.valid=系统认证
warpdrive.cloaking_core.disabled=伪装被禁用
warpdrive.cloaking_core.lowPower=§c伪装失效我们需要更多的能量.
warpdrive.cloaking_core.low_power=§c伪装失效我们需要更多的能量.
warpdrive.cloaking_core.cloaking=一个层级 %1$d 伪装目前覆盖 %2$d方块!
warpdrive.ic2_reactor_laser_monitor.noReactor=未发现反应堆!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d反应堆已连接.
warpdrive.ic2_reactor_laser_monitor.no_reactor=未发现反应堆!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Reactor connected on %1$s.
warpdrive.transporter.status=从 (%1$.0f %2$.0f %3$.0f) 到 (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -16,29 +16,29 @@ death.attack.warpdrive.warm.player=%2$s 把 %1$s 變成了綠色香蕉
itemGroup.warpdrive=WarpDrive
item.warpdrive.crafting.Malformed.name=不良道具[WD]
item.warpdrive.crafting.EmeraldCrystal.name=翡翠調諧水晶
item.warpdrive.crafting.EnderCrystal.name=終界調諧水晶
item.warpdrive.crafting.DiamondCrystal.name=鑽石調諧水晶
item.warpdrive.crafting.DiffractionGrating.name=散射光柵
item.warpdrive.crafting.ReactorCore.name=反應核心
item.warpdrive.crafting.ComputerInterface.name=電腦接入界面
item.warpdrive.crafting.PowerInterface.name=電力接口
item.warpdrive.crafting.CapacitiveCrystal.name=電容結晶
item.warpdrive.crafting.AirCanisterEmpty.name=虛空罐
item.warpdrive.crafting.AirCanisterEmpty.tooltip=§b右鍵單擊空氣發生器§7 填充虛空罐
item.warpdrive.crafting.Lens.name=透鏡
item.warpdrive.crafting.Zoom.name=放大
item.warpdrive.crafting.GlassTank.name=玻璃罐子
item.warpdrive.crafting.FlatScreen.name=平面屏幕
item.warpdrive.crafting.MemoryCrystal.name=記憶水晶
item.warpdrive.crafting.Motor.name=發動機
item.warpdrive.crafting.BoneCharcoal.name=骨灰
item.warpdrive.crafting.ActivatedCarbon.name=活性炭
item.warpdrive.crafting.LaserMediumEmpty.name=激光觸媒 (空)
item.warpdrive.crafting.CoilCrystal.name=回紋水晶
item.warpdrive.crafting.ElectromagneticProjector.name=電磁投射器
item.warpdrive.crafting.Superconductor.name=超導材料
item.warpdrive.component.malformed.name=不良道具[WD]
item.warpdrive.component.emerald_crystal.name=翡翠調諧水晶
item.warpdrive.component.ender_crystal.name=終界調諧水晶
item.warpdrive.component.diamond_crystal.name=鑽石調諧水晶
item.warpdrive.component.diffraction_grating.name=散射光柵
item.warpdrive.component.reactor_core.name=反應核心
item.warpdrive.component.computer_interface.name=電腦接入界面
item.warpdrive.component.power_interface.name=電力接口
item.warpdrive.component.capacitive_crystal.name=電容結晶
item.warpdrive.component.air_canister_empty.name=虛空罐
item.warpdrive.component.air_canister_empty.tooltip=§b右鍵單擊空氣發生器§7 填充虛空罐
item.warpdrive.component.lens.name=透鏡
item.warpdrive.component.zoom.name=放大
item.warpdrive.component.glass_tank.name=玻璃罐子
item.warpdrive.component.flat_screen.name=平面屏幕
item.warpdrive.component.memory_crystal.name=記憶水晶
item.warpdrive.component.motor.name=發動機
item.warpdrive.component.bone_charcoal.name=骨灰
item.warpdrive.component.activated_carbon.name=活性炭
item.warpdrive.component.laser_medium_empty.name=激光觸媒 (空)
item.warpdrive.component.coil_crystal.name=回紋水晶
item.warpdrive.component.electromagnetic_projector.name=電磁投射器
item.warpdrive.component.superconductor.name=超導材料
item.warpdrive.armor.helmet.name=躍遷保護盔
item.warpdrive.armor.chestplate.name=Warp Chestplate
@ -563,23 +563,23 @@ tile.warpdrive.hull3.stairs.black.name=黑色高階船體階梯
warpdrive.guide.prefix=%1$s:
warpdrive.error.badTileEntity=§c該塊需要重新放置。
warpdrive.monitor.viewingCamera=查看攝影機 %2$d, %3$d, %4$d 在視頻頻道 %1$d
warpdrive.ship.attachedPlayers=屬於: %1$s
warpdrive.ship.playerAttached=您現在已連接到船艦 %1$s.\n這艘船艦屬於 %2$s
warpdrive.ship.playerDetached=您現在已從船艦分離 %1$s.\n這艘船艦屬於 %2$s
warpdrive.error.bad_tile_entity=§c該塊需要重新放置。
warpdrive.monitor.viewing_camera=查看攝影機 %2$d, %3$d, %4$d 在視頻頻道 %1$d
warpdrive.ship.attached_players=屬於: %1$s
warpdrive.ship.player_attached=您現在已連接到船艦 %1$s.\n這艘船艦屬於 %2$s
warpdrive.ship.player_detached=您現在已從船艦分離 %1$s.\n這艘船艦屬於 %2$s
warpdrive.ship.status_line.cooling=%1$d s 升降梯的冷卻中。
warpdrive.ship.status_line.isolation=%1$d 主動隔離塊由 %2$2.1f%% 吸收。
warpdrive.energy.status_line=能量填充 %1$s / %2$s EU.
warpdrive.energy.side.changedToInput=%1$s 側面變為能量輸入模式!
warpdrive.energy.side.changedToOutput=%1$s 側面變為能量輸出模式!
warpdrive.energy.side.changedToDisabled=%1$s 側面變為能量禁用模式!
warpdrive.energy.side.changed_to_input=%1$s 側面變為能量輸入模式!
warpdrive.energy.side.changed_to_output=%1$s 側面變為能量輸出模式!
warpdrive.energy.side.changed_to_disabled=%1$s 側面變為能量禁用模式!
warpdrive.accelerator.guide.lowPower_noStorage=Energy storage is too low; we need at least %1$d to continue operation but can only store %2$d
warpdrive.accelerator.guide.lowPower_accelerating=We're running out of power chief, particles are on the loose, prepare for massive irradiation!
warpdrive.accelerator.guide.lowPower_noParticles=We need more power to start the accelerator!
warpdrive.accelerator.guide.noChiller=No chiller could be found for this accelerator!
warpdrive.accelerator.guide.low_power.not_enough_storage=Energy storage is too low; we need at least %1$d to continue operation but can only store %2$d
warpdrive.accelerator.guide.low_power.accelerating=We're running out of power chief, particles are on the loose, prepare for massive irradiation!
warpdrive.accelerator.guide.low_power.no_particles=We need more power to start the accelerator!
warpdrive.accelerator.guide.no_chiller=No chiller could be found for this accelerator!
warpdrive.beam_frequency.tooltip=光束頻率設置為 %1$d
warpdrive.beam_frequency.get=Beam frequency %2$d has been retrieved from %1$s
@ -600,7 +600,7 @@ warpdrive.control_channel.status_line.valid=Control channel %1$d is valid.
warpdrive.control_channel.status_line.invalid=§cControl channel %1$d is invalid.
warpdrive.control_channel.status_line.undefined=§7Undefined Control channel.\n§bUse a Tuning fork§r to set it.
warpdrive.forcefield.guide.lowPower=我們的能量用完了,艦長!減少消耗,或讓引擎長提高我們的輸出!
warpdrive.forcefield.guide.low_power=我們的能量用完了,艦長!減少消耗,或讓引擎長提高我們的輸出!
warpdrive.forcefield.shape.status_line.none=§c形狀未定義。
warpdrive.forcefield.shape.status_line.double=形狀是滿的 %1$s
@ -641,22 +641,22 @@ warpdrive.particle.antimatter.tooltip=Produced by colliding a particle bunch in
warpdrive.particle.strange_matter.name=strange matter
warpdrive.particle.strange_matter.tooltip=Produced by colliding 2 particle bunches in a superior accelerator
warpdrive.upgrade.result.noUpgradeToDismount=§c無需升級即可卸載。
warpdrive.upgrade.result.notEnoughUpgrades=§c您需要至少1個才能升級此塊。
warpdrive.upgrade.result.invalidUpgrade=§c這不是升級此方塊的有效項。
warpdrive.upgrade.result.invalidProjectorUpgrade=§c此升級對於投射器而言太大請改用繼電器。
warpdrive.upgrade.result.invalidRelayUpgrade=§c此升級僅適用於投射器。
warpdrive.upgrade.result.validUpgrades=此方塊塊的有效升級包括: %1$s. @TODO 尚未執行。
warpdrive.upgrade.result.tooManyUpgrades=§c已經有 %1$d 升級安裝。
warpdrive.upgrade.result.no_upgrade_to_dismount=§c無需升級即可卸載。
warpdrive.upgrade.result.not_enough_upgrades=§c您需要至少1個才能升級此塊。
warpdrive.upgrade.result.invalid_upgrade=§c這不是升級此方塊的有效項。
warpdrive.upgrade.result.invalid_upgrade_for_projector=§c此升級對於投射器而言太大請改用繼電器。
warpdrive.upgrade.result.invalid_upgrade_for_relay=§c此升級僅適用於投射器。
warpdrive.upgrade.result.valid_upgrades=此方塊塊的有效升級包括: %1$s. @TODO 尚未執行。
warpdrive.upgrade.result.too_many_upgrades=§c已經有 %1$d 升級安裝。
warpdrive.upgrade.result.dismounted=升級 %1$s 成功卸下。
warpdrive.upgrade.result.mounted=升級 %1$s 已成功掛載。
warpdrive.upgrade.result.wrongShapeSide=§c這邊沒有電磁投射器。
warpdrive.upgrade.result.noShapeToDismount=§c沒有形狀來卸下。
warpdrive.upgrade.result.notEnoughShapes.double=§c您需要至少2個項目來設置雙面投射器的形狀。
warpdrive.upgrade.result.notEnoughShapes.single=§c至少需要1個項目來設置單面投射器的形狀。
warpdrive.upgrade.result.shapeDismounted=已成功卸載形狀。
warpdrive.upgrade.result.shapeMounted=形狀已成功安裝。
warpdrive.upgrade.result.wrong_shape_side=§c這邊沒有電磁投射器。
warpdrive.upgrade.result.no_shape_to_dismount=§c沒有形狀來卸下。
warpdrive.upgrade.result.not_enough_shapes.double=§c您需要至少2個項目來設置雙面投射器的形狀。
warpdrive.upgrade.result.not_enough_shapes.single=§c至少需要1個項目來設置單面投射器的形狀。
warpdrive.upgrade.result.shape_dismounted=已成功卸載形狀。
warpdrive.upgrade.result.shape_mounted=形狀已成功安裝。
warpdrive.upgrade.status_line.none=§7未安裝升級。
warpdrive.upgrade.status_line.valid=已升級 %1$s.
@ -665,21 +665,21 @@ warpdrive.video_channel.tooltip=視頻頻道設置為 %1$d
warpdrive.video_channel.get=Video channel %2$d has been retrieved from %1$s
warpdrive.video_channel.set=%1$s 現在調整為視頻頻道 %2$d
warpdrive.video_channel.status_line.valid_camera=視頻頻道 %1$d 有效。
warpdrive.video_channel.status_line.validCamera視頻頻道 %1$d 對於攝像機 %2$d, %3$d, %4$d 有效
warpdrive.video_channel.status_line.valid_monitor=視頻頻道 %1$d 對於攝像機 %2$d, %3$d, %4$d 有效
warpdrive.video_channel.status_line.invalid=§c視頻頻道 %1$d 是無效的。
warpdrive.video_channel.status_line.not_loaded=§c視頻頻道 %1$d 是無效的或者錄像機太過遙遠。
warpdrive.video_channel.status_line.undefined=§7未定義的視頻通道。\n§bUse 調音叉§r 來設定。
warpdrive.cloaking_core.missingInnerAndOuter=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missingInner=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missingOuter=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.missing_channeling_and_projecting_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s and projecting coil(s) towards %3$s
warpdrive.cloaking_core.missing_channeling_coils=§cIntegrity down to %1$d%%: missing channeling coil(s) towards %2$s
warpdrive.cloaking_core.missing_projecting_coils=§cIntegrity down to %1$d%%: missing projecting coil(s) towards %2$s
warpdrive.cloaking_core.valid=System is valid
warpdrive.cloaking_core.disabled=僞裝無效!
warpdrive.cloaking_core.lowPower=§c僞裝失效了我們需要更多的能量艦長
warpdrive.cloaking_core.low_power=§c僞裝失效了我們需要更多的能量艦長
warpdrive.cloaking_core.cloaking=A 層 %1$d 僞裝目前正確覆蓋 %2$d 區域!
warpdrive.ic2_reactor_laser_monitor.noReactor=沒有反應堆!
warpdrive.ic2_reactor_laser_monitor.multipleReactors=%1$d 反應器連接。
warpdrive.ic2_reactor_laser_monitor.no_reactor=沒有反應堆!
warpdrive.ic2_reactor_laser_monitor.reactor_found=Reactor connected on %1$s.
warpdrive.transporter.status=From (%1$.0f %2$.0f %3$.0f) to (%4$.0f %5$.0f %6$.0f)
warpdrive.transporter_beacon.status.invalid=§cNo transporter room linked

View file

@ -14,7 +14,7 @@ for _, side in pairs(sides) do
end
if cloakingcore == nil or cloakingcore.interfaced() == nil then
if cloakingCore == nil or cloakingCore.interfaced() == nil then
term.setBackgroundColor(colors.red)
term.setTextColor(colors.white)
term.write("No cloaking core detected")

View file

@ -14,7 +14,7 @@ for _, side in pairs(sides) do
end
if cloakingcore == nil or cloakingcore.interfaced() == nil then
if cloakingCore == nil or cloakingCore.interfaced() == nil then
term.setBackgroundColor(colors.red)
term.setTextColor(colors.white)
term.write("No cloaking core detected")

View file

@ -14,7 +14,7 @@ for _, side in pairs(sides) do
end
if cloakingcore == nil or cloakingcore.interfaced() == nil then
if cloakingCore == nil or cloakingCore.interfaced() == nil then
term.setBackgroundColor(colors.red)
term.setTextColor(colors.white)
term.write("No cloaking core detected")

View file

@ -233,7 +233,7 @@ function ffield_projector_page()
w.setCursorPos(1, 15)
w.writeFullLine(" Start/stoP all force field projectors (S/P)")
w.writeFullLine(" Configure (C) or togglE (E) selected projector")
w.writeFullLine(" select force field projector (Arrows)")
w.writeFullLine(" select force field projector (Up, Down)")
end
function ffield_projector_config()
@ -481,7 +481,7 @@ function ffield_relay_page()
w.setCursorPos(1, 15)
w.writeFullLine(" Start/stoP all force field relays (S/P)")
w.writeFullLine(" Configure (C) or togglE (E) selected relay")
w.writeFullLine(" select force field relay (Arrows)")
w.writeFullLine(" select force field relay (Up, Down)")
end
function ffield_relay_config()

View file

@ -547,7 +547,7 @@ function ship_page_crew()
w.setCursorPos(1, 16)
w.setColorControl()
w.writeFullLine(" Summon all crew (S), Toggle summon after jump (T)")
w.writeFullLine(" select crew (arrows), summon selected crew (enter)")
w.writeFullLine(" select crew (Up, Down), summon selected crew (enter)")
end
function ship_key_crew(character, keycode)
@ -604,7 +604,7 @@ function ship_page_navigation()
w.setCursorPos(1, 16)
w.setColorControl()
w.writeFullLine(" select target (arrows), register target (enter)")
w.writeFullLine(" select target (Up, Down), register target (enter)")
w.writeFullLine(" jump through Gate (G)")
end

View file

@ -240,7 +240,7 @@ function laser_battery_page()
w.setColorControl()
w.setCursorPos(1, 15)
w.writeFullLine(" Add/Remove/Configure selected battery (A/R/C)")
w.writeFullLine(" select battery (Arrows), Link lasers (L)")
w.writeFullLine(" select battery (Up, Down), Link lasers (L)")
w.writeFullLine(" change Firing mode (F), toggle Scatter mode (S)")
end
@ -307,7 +307,7 @@ function laser_battery_linkLasers()
w.setColorDisabled()
w.setCursorPos(1, 3)
w.writeLn("Help: Use arrows to select lasers.")
w.writeLn("Use Up/Down/Left/Right to select lasers.")
w.writeLn("Press backspace/delete to remove laser.")
w.writeLn("Press enter to validate.")
w.writeLn("Validate with '-no laser-' to stop adding lasers.")
@ -556,7 +556,7 @@ function laser_station_page()
w.setColorControl()
w.setCursorPos(1, 15)
w.writeFullLine(" Add/Remove/Configure laser station (A/R/C)")
w.writeFullLine(" select station (Arrows), Link batteries (L)")
w.writeFullLine(" select station (Up, Down), Link batteries (L)")
w.writeFullLine(" change Firing mode (F), toggle Scatter mode (S)")
end
@ -592,7 +592,7 @@ function laser_station_config()
local channel
repeat
w.setCursorPos(1, 7)
w.write("Camera video frequency (" .. w.format_integer(camVideoChannel, 5) .. "): ")
w.write("Camera video channel (" .. w.format_integer(camVideoChannel, 5) .. "): ")
channel = w.input_readInteger(camVideoChannel)
if channel ~= 0 and (channel < 0 or channel > 268435455) then
w.status_showWarning("This is not a valid video channel. Try again.")
@ -643,7 +643,7 @@ function laser_station_linkBatteries()
w.setColorDisabled()
w.setCursorPos(1, 3)
w.writeLn("Instruction: use arrows to select batteries.")
w.writeLn("Use Up/Down/Left/Right to select batteries.")
w.writeLn("Press backspace/delete to remove battery.")
w.writeLn("Press enter to validate.")
w.writeLn("Validate '-no battery-' to stop adding batteries.")

View file

@ -551,7 +551,7 @@ function ship_page_crew()
w.setCursorPos(1, 20)
w.setColorControl()
w.writeFullLine(" Summon all crew (S), Toggle summon after jump (T)")
w.writeFullLine(" select crew (arrows), summon selected crew (enter)")
w.writeFullLine(" select crew (Up, Down), summon selected crew (enter)")
end
function ship_key_crew(character, keycode)
@ -608,7 +608,7 @@ function ship_page_navigation()
w.setCursorPos(1, 20)
w.setColorControl()
w.writeFullLine(" select target (arrows), register target (enter)")
w.writeFullLine(" select target (Up, Down), register target (enter)")
w.writeFullLine(" jump through Gate (G)")
end

View file

@ -239,7 +239,7 @@ function laser_battery_page()
w.setColorControl()
w.setCursorPos(1, 19)
w.writeFullLine(" Add/Remove/Configure selected battery (A/R/C)")
w.writeFullLine(" select battery (Arrows), Link lasers (L)")
w.writeFullLine(" select battery (Up, Down), Link lasers (L)")
w.writeFullLine(" change Firing mode (F), toggle Scatter mode (S)")
end
@ -306,7 +306,7 @@ function laser_battery_linkLasers()
w.setColorDisabled()
w.setCursorPos(1, 3)
w.writeLn("Help: Use arrows to select lasers.")
w.writeLn("Use Up/Down/Left/Right to select lasers.")
w.writeLn("Press backspace/delete to remove laser.")
w.writeLn("Press enter to validate.")
w.writeLn("Validate with '-no laser-' to stop adding lasers.")
@ -555,7 +555,7 @@ function laser_station_page()
w.setColorControl()
w.setCursorPos(1, 19)
w.writeFullLine(" Add/Remove/Configure laser station (A/R/C)")
w.writeFullLine(" select station (Arrows), Link batteries (L)")
w.writeFullLine(" select station (Up, Down), Link batteries (L)")
w.writeFullLine(" change Firing mode (F), toggle Scatter mode (S)")
end
@ -591,7 +591,7 @@ function laser_station_config()
local channel
repeat
w.setCursorPos(1, 7)
w.write("Camera video frequency (" .. w.format_integer(camVideoChannel, 5) .. "): ")
w.write("Camera video channel (" .. w.format_integer(camVideoChannel, 5) .. "): ")
channel = w.input_readInteger(camVideoChannel)
if channel ~= 0 and (channel < 0 or channel > 268435455) then
w.status_showWarning("This is not a valid video channel. Try again.")
@ -642,7 +642,7 @@ function laser_station_linkBatteries()
w.setColorDisabled()
w.setCursorPos(1, 3)
w.writeLn("Instruction: use arrows to select batteries.")
w.writeLn("Use Up/Down/Left/Right to select batteries.")
w.writeLn("Press backspace/delete to remove battery.")
w.writeLn("Press enter to validate.")
w.writeLn("Validate '-no battery-' to stop adding batteries.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Some files were not shown because too many files have changed in this diff Show more