Merge MC1.7 into MC1.10
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,6 +44,12 @@ public abstract class TileEntityAbstractLaser extends TileEntityAbstractInterfac
|
|||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFirstUpdateTick() {
|
||||
super.onFirstUpdateTick();
|
||||
updateLaserMediumDirection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
super.update();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -75,8 +75,8 @@ public class TileEntityAbstractForceField extends TileEntityAbstractEnergy imple
|
|||
|
||||
@Override
|
||||
public void invalidate() {
|
||||
super.invalidate();
|
||||
ForceFieldRegistry.removeFromRegistry(this);
|
||||
super.invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.")
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.")
|
||||
|
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 727 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 544 B |
Before Width: | Height: | Size: 3 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 9.8 KiB |
|
@ -1,4 +0,0 @@
|
|||
{
|
||||
"animation": {
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 3.2 KiB |