diff --git a/build.properties b/build.properties index 6c67d421..84e5a7a9 100644 --- a/build.properties +++ b/build.properties @@ -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 diff --git a/src/main/java/cr0s/warpdrive/Commons.java b/src/main/java/cr0s/warpdrive/Commons.java index 6f5c6e12..57c0b060 100644 --- a/src/main/java/cr0s/warpdrive/Commons.java +++ b/src/main/java/cr0s/warpdrive/Commons.java @@ -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 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 fluidsRegistry = FluidRegistry.getRegisteredFluids(); + final HashMap 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; diff --git a/src/main/java/cr0s/warpdrive/WarpDrive.java b/src/main/java/cr0s/warpdrive/WarpDrive.java index 7536f098..66bfb600 100644 --- a/src/main/java/cr0s/warpdrive/WarpDrive.java +++ b/src/main/java/cr0s/warpdrive/WarpDrive.java @@ -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; diff --git a/src/main/java/cr0s/warpdrive/api/IBeamFrequency.java b/src/main/java/cr0s/warpdrive/api/IBeamFrequency.java index 740b60e1..89249cb1 100644 --- a/src/main/java/cr0s/warpdrive/api/IBeamFrequency.java +++ b/src/main/java/cr0s/warpdrive/api/IBeamFrequency.java @@ -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); diff --git a/src/main/java/cr0s/warpdrive/block/BlockAbstractContainer.java b/src/main/java/cr0s/warpdrive/block/BlockAbstractContainer.java index 385bc0c0..8f869c72 100644 --- a/src/main/java/cr0s/warpdrive/block/BlockAbstractContainer.java +++ b/src/main/java/cr0s/warpdrive/block/BlockAbstractContainer.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractBase.java b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractBase.java index 76eabebd..ac3aee24 100644 --- a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractBase.java +++ b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractBase.java @@ -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()); + } } diff --git a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractEnergy.java b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractEnergy.java index 009634f1..4ee9551d 100644 --- a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractEnergy.java +++ b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractEnergy.java @@ -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(); diff --git a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractInterfaced.java b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractInterfaced.java index f91e7c7b..f99703bf 100644 --- a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractInterfaced.java +++ b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractInterfaced.java @@ -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())); } } } diff --git a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractLaser.java b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractLaser.java index 6e46fcd7..46181e23 100644 --- a/src/main/java/cr0s/warpdrive/block/TileEntityAbstractLaser.java +++ b/src/main/java/cr0s/warpdrive/block/TileEntityAbstractLaser.java @@ -44,6 +44,12 @@ public abstract class TileEntityAbstractLaser extends TileEntityAbstractInterfac }); } + @Override + protected void onFirstUpdateTick() { + super.onFirstUpdateTick(); + updateLaserMediumDirection(); + } + @Override public void update() { super.update(); diff --git a/src/main/java/cr0s/warpdrive/block/atomic/BlockAbstractAccelerator.java b/src/main/java/cr0s/warpdrive/block/atomic/BlockAbstractAccelerator.java index c563733a..b2e5acf9 100644 --- a/src/main/java/cr0s/warpdrive/block/atomic/BlockAbstractAccelerator.java +++ b/src/main/java/cr0s/warpdrive/block/atomic/BlockAbstractAccelerator.java @@ -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; diff --git a/src/main/java/cr0s/warpdrive/block/atomic/BlockChiller.java b/src/main/java/cr0s/warpdrive/block/atomic/BlockChiller.java index b7fcc3c2..b119960b 100644 --- a/src/main/java/cr0s/warpdrive/block/atomic/BlockChiller.java +++ b/src/main/java/cr0s/warpdrive/block/atomic/BlockChiller.java @@ -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); } diff --git a/src/main/java/cr0s/warpdrive/block/breathing/TileEntityAirGenerator.java b/src/main/java/cr0s/warpdrive/block/breathing/TileEntityAirGenerator.java index 9d8463dd..951535a9 100644 --- a/src/main/java/cr0s/warpdrive/block/breathing/TileEntityAirGenerator.java +++ b/src/main/java/cr0s/warpdrive/block/breathing/TileEntityAirGenerator.java @@ -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 diff --git a/src/main/java/cr0s/warpdrive/block/building/TileEntityShipScanner.java b/src/main/java/cr0s/warpdrive/block/building/TileEntityShipScanner.java index 1cf195e6..b011dffb 100644 --- a/src/main/java/cr0s/warpdrive/block/building/TileEntityShipScanner.java +++ b/src/main/java/cr0s/warpdrive/block/building/TileEntityShipScanner.java @@ -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); diff --git a/src/main/java/cr0s/warpdrive/block/collection/TileEntityAbstractMiner.java b/src/main/java/cr0s/warpdrive/block/collection/TileEntityAbstractMiner.java index 1d8e6cb3..5f744f3d 100644 --- a/src/main/java/cr0s/warpdrive/block/collection/TileEntityAbstractMiner.java +++ b/src/main/java/cr0s/warpdrive/block/collection/TileEntityAbstractMiner.java @@ -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); } diff --git a/src/main/java/cr0s/warpdrive/block/decoration/ItemBlockDecorative.java b/src/main/java/cr0s/warpdrive/block/decoration/ItemBlockDecorative.java index ea42f544..f74e2dec 100644 --- a/src/main/java/cr0s/warpdrive/block/decoration/ItemBlockDecorative.java +++ b/src/main/java/cr0s/warpdrive/block/decoration/ItemBlockDecorative.java @@ -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(); } } diff --git a/src/main/java/cr0s/warpdrive/block/detection/BlockMonitor.java b/src/main/java/cr0s/warpdrive/block/detection/BlockMonitor.java index ad3e3801..2e8ded70 100644 --- a/src/main/java/cr0s/warpdrive/block/detection/BlockMonitor.java +++ b/src/main/java/cr0s/warpdrive/block/detection/BlockMonitor.java @@ -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)); } } diff --git a/src/main/java/cr0s/warpdrive/block/detection/TileEntityCloakingCore.java b/src/main/java/cr0s/warpdrive/block/detection/TileEntityCloakingCore.java index 839abf34..03c2893a 100644 --- a/src/main/java/cr0s/warpdrive/block/detection/TileEntityCloakingCore.java +++ b/src/main/java/cr0s/warpdrive/block/detection/TileEntityCloakingCore.java @@ -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"; } diff --git a/src/main/java/cr0s/warpdrive/block/energy/BlockEnergyBank.java b/src/main/java/cr0s/warpdrive/block/energy/BlockEnergyBank.java index 9965a843..f5ca8e3e 100644 --- a/src/main/java/cr0s/warpdrive/block/energy/BlockEnergyBank.java +++ b/src/main/java/cr0s/warpdrive/block/energy/BlockEnergyBank.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/block/energy/TileEntityIC2reactorLaserMonitor.java b/src/main/java/cr0s/warpdrive/block/energy/TileEntityIC2reactorLaserMonitor.java index 2fd46020..804f9cd4 100644 --- a/src/main/java/cr0s/warpdrive/block/energy/TileEntityIC2reactorLaserMonitor.java +++ b/src/main/java/cr0s/warpdrive/block/energy/TileEntityIC2reactorLaserMonitor.java @@ -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")); } } } diff --git a/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceField.java b/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceField.java index bfdfc028..67728ba4 100644 --- a/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceField.java +++ b/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceField.java @@ -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); } diff --git a/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldProjector.java b/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldProjector.java index bb0c5d43..e78aaf97 100644 --- a/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldProjector.java +++ b/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldProjector.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldRelay.java b/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldRelay.java index ffe1c7fc..e7211b9e 100644 --- a/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldRelay.java +++ b/src/main/java/cr0s/warpdrive/block/forcefield/BlockForceFieldRelay.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityAbstractForceField.java b/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityAbstractForceField.java index be7bdc1f..f0cf5fb3 100644 --- a/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityAbstractForceField.java +++ b/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityAbstractForceField.java @@ -75,8 +75,8 @@ public class TileEntityAbstractForceField extends TileEntityAbstractEnergy imple @Override public void invalidate() { - super.invalidate(); ForceFieldRegistry.removeFromRegistry(this); + super.invalidate(); } @Override diff --git a/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceField.java b/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceField.java index 2a1c4a00..284c75d4 100644 --- a/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceField.java +++ b/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceField.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceFieldProjector.java b/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceFieldProjector.java index f46671fa..70c7bae5 100644 --- a/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceFieldProjector.java +++ b/src/main/java/cr0s/warpdrive/block/forcefield/TileEntityForceFieldProjector.java @@ -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 vForceFields = new HashSet<>(); + // schedule removal/destruction in main thread + final CopyOnWriteArraySet 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 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 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 vPerimeterBlocks = null; Set 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 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 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); + } } } } diff --git a/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipController.java b/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipController.java index 39bd5e78..2f5f7f3a 100644 --- a/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipController.java +++ b/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipController.java @@ -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() { diff --git a/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipCore.java b/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipCore.java index 1de8a9cf..8e1656a0 100644 --- a/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipCore.java +++ b/src/main/java/cr0s/warpdrive/block/movement/TileEntityShipCore.java @@ -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)); } } diff --git a/src/main/java/cr0s/warpdrive/block/weapon/BlockLaserCamera.java b/src/main/java/cr0s/warpdrive/block/weapon/BlockLaserCamera.java index 0b8de9cd..2b5ef7cd 100644 --- a/src/main/java/cr0s/warpdrive/block/weapon/BlockLaserCamera.java +++ b/src/main/java/cr0s/warpdrive/block/weapon/BlockLaserCamera.java @@ -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; diff --git a/src/main/java/cr0s/warpdrive/block/weapon/BlockWeaponController.java b/src/main/java/cr0s/warpdrive/block/weapon/BlockWeaponController.java index 034b450f..cb104126 100644 --- a/src/main/java/cr0s/warpdrive/block/weapon/BlockWeaponController.java +++ b/src/main/java/cr0s/warpdrive/block/weapon/BlockWeaponController.java @@ -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; diff --git a/src/main/java/cr0s/warpdrive/config/Dictionary.java b/src/main/java/cr0s/warpdrive/config/Dictionary.java index 82865eb1..72a60990 100644 --- a/src/main/java/cr0s/warpdrive/config/Dictionary.java +++ b/src/main/java/cr0s/warpdrive/config/Dictionary.java @@ -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); diff --git a/src/main/java/cr0s/warpdrive/config/WarpDriveConfig.java b/src/main/java/cr0s/warpdrive/config/WarpDriveConfig.java index 81a0fd98..eb5e298f 100644 --- a/src/main/java/cr0s/warpdrive/config/WarpDriveConfig.java +++ b/src/main/java/cr0s/warpdrive/config/WarpDriveConfig.java @@ -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"); diff --git a/src/main/java/cr0s/warpdrive/data/AcceleratorSetup.java b/src/main/java/cr0s/warpdrive/data/AcceleratorSetup.java index afd37732..3607f740 100644 --- a/src/main/java/cr0s/warpdrive/data/AcceleratorSetup.java +++ b/src/main/java/cr0s/warpdrive/data/AcceleratorSetup.java @@ -52,6 +52,7 @@ public class AcceleratorSetup extends GlobalPosition { public final HashMap chillers = new HashMap<>(); public final Set energyBanks = new HashSet<>(); public final int energy_maxStorage; + public final Set setJammed = new HashSet<>(); public final TreeMap mapInjectors = new TreeMap<>(); public final Integer[] keyInjectors; public final ArrayList 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); diff --git a/src/main/java/cr0s/warpdrive/data/AirSpreader.java b/src/main/java/cr0s/warpdrive/data/AirSpreader.java index 77e8c3d5..58372de9 100644 --- a/src/main/java/cr0s/warpdrive/data/AirSpreader.java +++ b/src/main/java/cr0s/warpdrive/data/AirSpreader.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/data/CloakManager.java b/src/main/java/cr0s/warpdrive/data/CloakManager.java index c75a88c1..6f90fb69 100644 --- a/src/main/java/cr0s/warpdrive/data/CloakManager.java +++ b/src/main/java/cr0s/warpdrive/data/CloakManager.java @@ -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) { diff --git a/src/main/java/cr0s/warpdrive/data/CloakedArea.java b/src/main/java/cr0s/warpdrive/data/CloakedArea.java index 6ccf66a4..9b5d31bc 100644 --- a/src/main/java/cr0s/warpdrive/data/CloakedArea.java +++ b/src/main/java/cr0s/warpdrive/data/CloakedArea.java @@ -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 playersInArea; - public byte tier = 0; + private CopyOnWriteArraySet 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 list = player.worldObj.getEntitiesWithinAABBExcludingEntity(player, new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ)); + public void revealEntitiesToPlayer(final EntityPlayerMP entityPlayerMP) { + final List 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))); } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumCameraType.java b/src/main/java/cr0s/warpdrive/data/EnumCameraType.java index b7e27b61..55cb3e7d 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumCameraType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumCameraType.java @@ -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; diff --git a/src/main/java/cr0s/warpdrive/data/EnumComponentType.java b/src/main/java/cr0s/warpdrive/data/EnumComponentType.java index c5e97353..409c45e3 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumComponentType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumComponentType.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumDecorativeType.java b/src/main/java/cr0s/warpdrive/data/EnumDecorativeType.java index 53634d74..270da310 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumDecorativeType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumDecorativeType.java @@ -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; + } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumDisplayAlignment.java b/src/main/java/cr0s/warpdrive/data/EnumDisplayAlignment.java index 347f5358..ded12702 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumDisplayAlignment.java +++ b/src/main/java/cr0s/warpdrive/data/EnumDisplayAlignment.java @@ -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; + } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumForceFieldShape.java b/src/main/java/cr0s/warpdrive/data/EnumForceFieldShape.java index ad8a919f..cf1397b4 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumForceFieldShape.java +++ b/src/main/java/cr0s/warpdrive/data/EnumForceFieldShape.java @@ -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 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 { diff --git a/src/main/java/cr0s/warpdrive/data/EnumForceFieldUpgrade.java b/src/main/java/cr0s/warpdrive/data/EnumForceFieldUpgrade.java index 7ebffa99..91fccac0 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumForceFieldUpgrade.java +++ b/src/main/java/cr0s/warpdrive/data/EnumForceFieldUpgrade.java @@ -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; diff --git a/src/main/java/cr0s/warpdrive/data/EnumHullPlainType.java b/src/main/java/cr0s/warpdrive/data/EnumHullPlainType.java index 455c868c..1399f641 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumHullPlainType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumHullPlainType.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumJumpSequencerState.java b/src/main/java/cr0s/warpdrive/data/EnumJumpSequencerState.java new file mode 100644 index 00000000..60b82e2e --- /dev/null +++ b/src/main/java/cr0s/warpdrive/data/EnumJumpSequencerState.java @@ -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; } +} diff --git a/src/main/java/cr0s/warpdrive/data/EnumLiftMode.java b/src/main/java/cr0s/warpdrive/data/EnumLiftMode.java index bf8413d3..cac7ad45 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumLiftMode.java +++ b/src/main/java/cr0s/warpdrive/data/EnumLiftMode.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumPermissionNode.java b/src/main/java/cr0s/warpdrive/data/EnumPermissionNode.java index 70ceae05..405cba08 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumPermissionNode.java +++ b/src/main/java/cr0s/warpdrive/data/EnumPermissionNode.java @@ -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; + } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumReactorFace.java b/src/main/java/cr0s/warpdrive/data/EnumReactorFace.java index 08504286..be48498e 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumReactorFace.java +++ b/src/main/java/cr0s/warpdrive/data/EnumReactorFace.java @@ -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), diff --git a/src/main/java/cr0s/warpdrive/data/EnumReactorReleaseMode.java b/src/main/java/cr0s/warpdrive/data/EnumReactorReleaseMode.java index 2e049c33..9cfbf23f 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumReactorReleaseMode.java +++ b/src/main/java/cr0s/warpdrive/data/EnumReactorReleaseMode.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumShipCoreState.java b/src/main/java/cr0s/warpdrive/data/EnumShipCoreState.java index f839a9ed..ef7986fc 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumShipCoreState.java +++ b/src/main/java/cr0s/warpdrive/data/EnumShipCoreState.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumShipMovementType.java b/src/main/java/cr0s/warpdrive/data/EnumShipMovementType.java index f79fa450..8b42e10e 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumShipMovementType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumShipMovementType.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/data/EnumShipScannerState.java b/src/main/java/cr0s/warpdrive/data/EnumShipScannerState.java index 1a9897af..875387b0 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumShipScannerState.java +++ b/src/main/java/cr0s/warpdrive/data/EnumShipScannerState.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumStarMapEntryType.java b/src/main/java/cr0s/warpdrive/data/EnumStarMapEntryType.java index 39eea3aa..8337040a 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumStarMapEntryType.java +++ b/src/main/java/cr0s/warpdrive/data/EnumStarMapEntryType.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/data/EnumTier.java b/src/main/java/cr0s/warpdrive/data/EnumTier.java index 2e26d9dd..2da19055 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumTier.java +++ b/src/main/java/cr0s/warpdrive/data/EnumTier.java @@ -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), diff --git a/src/main/java/cr0s/warpdrive/data/EnumTooltipCondition.java b/src/main/java/cr0s/warpdrive/data/EnumTooltipCondition.java index cbf8c094..16488bee 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumTooltipCondition.java +++ b/src/main/java/cr0s/warpdrive/data/EnumTooltipCondition.java @@ -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(); diff --git a/src/main/java/cr0s/warpdrive/data/EnumTransporterBeaconState.java b/src/main/java/cr0s/warpdrive/data/EnumTransporterBeaconState.java index 12765a47..b98befe1 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumTransporterBeaconState.java +++ b/src/main/java/cr0s/warpdrive/data/EnumTransporterBeaconState.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/EnumTransporterState.java b/src/main/java/cr0s/warpdrive/data/EnumTransporterState.java index 1e92ef1a..5aad50e5 100644 --- a/src/main/java/cr0s/warpdrive/data/EnumTransporterState.java +++ b/src/main/java/cr0s/warpdrive/data/EnumTransporterState.java @@ -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; } } diff --git a/src/main/java/cr0s/warpdrive/data/ForceFieldSetup.java b/src/main/java/cr0s/warpdrive/data/ForceFieldSetup.java index e879dd34..841e738c 100644 --- a/src/main/java/cr0s/warpdrive/data/ForceFieldSetup.java +++ b/src/main/java/cr0s/warpdrive/data/ForceFieldSetup.java @@ -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); diff --git a/src/main/java/cr0s/warpdrive/data/JumpShip.java b/src/main/java/cr0s/warpdrive/data/JumpShip.java index 401afc09..689a4104 100644 --- a/src/main/java/cr0s/warpdrive/data/JumpShip.java +++ b/src/main/java/cr0s/warpdrive/data/JumpShip.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/data/StarMapRegistry.java b/src/main/java/cr0s/warpdrive/data/StarMapRegistry.java index ba03dd4e..db4ba7df 100644 --- a/src/main/java/cr0s/warpdrive/data/StarMapRegistry.java +++ b/src/main/java/cr0s/warpdrive/data/StarMapRegistry.java @@ -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); } diff --git a/src/main/java/cr0s/warpdrive/data/TrajectoryPoint.java b/src/main/java/cr0s/warpdrive/data/TrajectoryPoint.java index 944c296a..b56811be 100644 --- a/src/main/java/cr0s/warpdrive/data/TrajectoryPoint.java +++ b/src/main/java/cr0s/warpdrive/data/TrajectoryPoint.java @@ -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; } diff --git a/src/main/java/cr0s/warpdrive/event/ClientHandler.java b/src/main/java/cr0s/warpdrive/event/ClientHandler.java index f5894470..19444a7c 100644 --- a/src/main/java/cr0s/warpdrive/event/ClientHandler.java +++ b/src/main/java/cr0s/warpdrive/event/ClientHandler.java @@ -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()); diff --git a/src/main/java/cr0s/warpdrive/event/DeploySequencer.java b/src/main/java/cr0s/warpdrive/event/DeploySequencer.java index 32b7bb4c..10871ded 100644 --- a/src/main/java/cr0s/warpdrive/event/DeploySequencer.java +++ b/src/main/java/cr0s/warpdrive/event/DeploySequencer.java @@ -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")); } } } diff --git a/src/main/java/cr0s/warpdrive/event/JumpSequencer.java b/src/main/java/cr0s/warpdrive/event/JumpSequencer.java index 8d9225f9..a38580e3 100644 --- a/src/main/java/cr0s/warpdrive/event/JumpSequencer.java +++ b/src/main/java/cr0s/warpdrive/event/JumpSequencer.java @@ -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 ) { diff --git a/src/main/java/cr0s/warpdrive/item/ItemComponent.java b/src/main/java/cr0s/warpdrive/item/ItemComponent.java index e3a27eaf..7463fd56 100644 --- a/src/main/java/cr0s/warpdrive/item/ItemComponent.java +++ b/src/main/java/cr0s/warpdrive/item/ItemComponent.java @@ -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 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); - } } \ No newline at end of file diff --git a/src/main/java/cr0s/warpdrive/network/MessageBeamEffect.java b/src/main/java/cr0s/warpdrive/network/MessageBeamEffect.java index d429b688..5a5beabc 100644 --- a/src/main/java/cr0s/warpdrive/network/MessageBeamEffect.java +++ b/src/main/java/cr0s/warpdrive/network/MessageBeamEffect.java @@ -23,21 +23,19 @@ public class MessageBeamEffect implements IMessage, IMessageHandler 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 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(); + } + } } \ No newline at end of file diff --git a/src/main/java/cr0s/warpdrive/render/EntityFXBeam.java b/src/main/java/cr0s/warpdrive/render/EntityFXBeam.java index c65df880..c00eb098 100644 --- a/src/main/java/cr0s/warpdrive/render/EntityFXBeam.java +++ b/src/main/java/cr0s/warpdrive/render/EntityFXBeam.java @@ -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); diff --git a/src/main/java/cr0s/warpdrive/render/RenderOverlayCamera.java b/src/main/java/cr0s/warpdrive/render/RenderOverlayCamera.java index 022cb83d..17c8aed0 100644 --- a/src/main/java/cr0s/warpdrive/render/RenderOverlayCamera.java +++ b/src/main/java/cr0s/warpdrive/render/RenderOverlayCamera.java @@ -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"; } diff --git a/src/main/java/cr0s/warpdrive/world/BiomeSpace.java b/src/main/java/cr0s/warpdrive/world/BiomeSpace.java index 4cce1274..83465530 100644 --- a/src/main/java/cr0s/warpdrive/world/BiomeSpace.java +++ b/src/main/java/cr0s/warpdrive/world/BiomeSpace.java @@ -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; + } } diff --git a/src/main/resources/assets/warpdrive/lang/de_DE.lang b/src/main/resources/assets/warpdrive/lang/de_DE.lang index ca5c4434..5bb96fa9 100644 --- a/src/main/resources/assets/warpdrive/lang/de_DE.lang +++ b/src/main/resources/assets/warpdrive/lang/de_DE.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lang/en_US.lang b/src/main/resources/assets/warpdrive/lang/en_US.lang index b881d7a5..15e9afd1 100644 --- a/src/main/resources/assets/warpdrive/lang/en_US.lang +++ b/src/main/resources/assets/warpdrive/lang/en_US.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lang/fr_FR.lang b/src/main/resources/assets/warpdrive/lang/fr_FR.lang index 0edbb95f..9701405c 100644 --- a/src/main/resources/assets/warpdrive/lang/fr_FR.lang +++ b/src/main/resources/assets/warpdrive/lang/fr_FR.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lang/nl_NL.lang b/src/main/resources/assets/warpdrive/lang/nl_NL.lang index 04cbc654..ed7ea0e7 100644 --- a/src/main/resources/assets/warpdrive/lang/nl_NL.lang +++ b/src/main/resources/assets/warpdrive/lang/nl_NL.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lang/ru_RU.lang b/src/main/resources/assets/warpdrive/lang/ru_RU.lang index 7e60ac76..eaa4d3d0 100644 --- a/src/main/resources/assets/warpdrive/lang/ru_RU.lang +++ b/src/main/resources/assets/warpdrive/lang/ru_RU.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lang/zh_CN.lang b/src/main/resources/assets/warpdrive/lang/zh_CN.lang index 5a07b891..e4b4302c 100644 --- a/src/main/resources/assets/warpdrive/lang/zh_CN.lang +++ b/src/main/resources/assets/warpdrive/lang/zh_CN.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lang/zh_TW.lang b/src/main/resources/assets/warpdrive/lang/zh_TW.lang index d301f57d..93f99f4b 100644 --- a/src/main/resources/assets/warpdrive/lang/zh_TW.lang +++ b/src/main/resources/assets/warpdrive/lang/zh_TW.lang @@ -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 diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak1 b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak1 index eddc7426..30110596 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak1 +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak1 @@ -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") diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak2 b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak2 index d44330fe..1a82cedc 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak2 +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/cloak2 @@ -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") diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/uncloak b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/uncloak index 95950ae5..e721e288 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/uncloak +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveCloakingCore/uncloak @@ -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") diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveForceFieldController/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveForceFieldController/startup index 7c35d009..004a4a92 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveForceFieldController/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveForceFieldController/startup @@ -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() diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup index 6647a668..9b1fa083 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveShipController/startup @@ -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 diff --git a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup index 77552ada..5a3b5abe 100644 --- a/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup +++ b/src/main/resources/assets/warpdrive/lua.ComputerCraft/warpdriveWeaponController/startup @@ -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.") diff --git a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup index 3a9f1f67..9fdf6f18 100644 --- a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup +++ b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveShipController/startup @@ -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 diff --git a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup index 755533d1..66bffe4a 100644 --- a/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup +++ b/src/main/resources/assets/warpdrive/lua.OpenComputers/warpdriveWeaponController/startup @@ -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.") diff --git a/src/main/resources/assets/warpdrive/textures/blocks/detection/cameraOverlay.png b/src/main/resources/assets/warpdrive/textures/blocks/detection/camera-overlay.png similarity index 100% rename from src/main/resources/assets/warpdrive/textures/blocks/detection/cameraOverlay.png rename to src/main/resources/assets/warpdrive/textures/blocks/detection/camera-overlay.png diff --git a/src/main/resources/assets/warpdrive/textures/blocks/movement/ship_core-top.png b/src/main/resources/assets/warpdrive/textures/blocks/movement/ship_core-top.png deleted file mode 100644 index da52c058..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/blocks/movement/ship_core-top.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/blocks/weapon/laserCameraOverlay.png b/src/main/resources/assets/warpdrive/textures/blocks/weapon/laser_camera-overlay.png similarity index 100% rename from src/main/resources/assets/warpdrive/textures/blocks/weapon/laserCameraOverlay.png rename to src/main/resources/assets/warpdrive/textures/blocks/weapon/laser_camera-overlay.png diff --git a/src/main/resources/assets/warpdrive/textures/items/breathing/air_canister-empty.png b/src/main/resources/assets/warpdrive/textures/items/breathing/air_canister-empty.png deleted file mode 100644 index 1082dc42..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/breathing/air_canister-empty.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/Crystals.pdn b/src/main/resources/assets/warpdrive/textures/items/component/Crystals.pdn deleted file mode 100644 index eacbc9cd..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/Crystals.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/Crystals2.pdn b/src/main/resources/assets/warpdrive/textures/items/component/Crystals2.pdn deleted file mode 100644 index af88ec47..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/Crystals2.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/EmptyCore.png b/src/main/resources/assets/warpdrive/textures/items/component/EmptyCore.png deleted file mode 100644 index 6ed5d00a..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/EmptyCore.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/EmptyCore.psd b/src/main/resources/assets/warpdrive/textures/items/component/EmptyCore.psd deleted file mode 100644 index fbadd94c..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/EmptyCore.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/LaserCore.png b/src/main/resources/assets/warpdrive/textures/items/component/LaserCore.png deleted file mode 100644 index e4c64ac2..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/LaserCore.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/LaserCore.psd b/src/main/resources/assets/warpdrive/textures/items/component/LaserCore.psd deleted file mode 100644 index f2a96fad..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/LaserCore.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/Lens.pdn b/src/main/resources/assets/warpdrive/textures/items/component/Lens.pdn deleted file mode 100644 index eed3dcec..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/Lens.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/Motor.pdn b/src/main/resources/assets/warpdrive/textures/items/component/Motor.pdn deleted file mode 100644 index eb96e7b0..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/Motor.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.png b/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.png deleted file mode 100644 index 4a85c3a4..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.png.mcmeta b/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.png.mcmeta deleted file mode 100644 index 37d84f6a..00000000 --- a/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.png.mcmeta +++ /dev/null @@ -1,4 +0,0 @@ -{ - "animation": { - } -} \ No newline at end of file diff --git a/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.psd b/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.psd deleted file mode 100644 index bc2f955a..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/PowerCore.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/TeleCore.png b/src/main/resources/assets/warpdrive/textures/items/component/TeleCore.png deleted file mode 100644 index efdde533..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/TeleCore.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/TeleCore.psd b/src/main/resources/assets/warpdrive/textures/items/component/TeleCore.psd deleted file mode 100644 index 2ea4787c..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/TeleCore.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/WarpCore.png b/src/main/resources/assets/warpdrive/textures/items/component/WarpCore.png deleted file mode 100644 index 674ca427..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/WarpCore.png and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/WarpCore.psd b/src/main/resources/assets/warpdrive/textures/items/component/WarpCore.psd deleted file mode 100644 index 8f25d07d..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/WarpCore.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/activated_carbon.pdn b/src/main/resources/assets/warpdrive/textures/items/component/activated_carbon.pdn deleted file mode 100644 index 4d239e77..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/activated_carbon.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/bone_charcoal.pdn b/src/main/resources/assets/warpdrive/textures/items/component/bone_charcoal.pdn deleted file mode 100644 index 8a693557..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/bone_charcoal.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/computer_interface1.psd b/src/main/resources/assets/warpdrive/textures/items/component/computer_interface1.psd deleted file mode 100644 index 355275af..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/computer_interface1.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/computer_interface2.psd b/src/main/resources/assets/warpdrive/textures/items/component/computer_interface2.psd deleted file mode 100644 index 119bbf84..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/computer_interface2.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/diffraction_grating.pdn b/src/main/resources/assets/warpdrive/textures/items/component/diffraction_grating.pdn deleted file mode 100644 index 3d3dfad0..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/diffraction_grating.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/flat_screen.pdn b/src/main/resources/assets/warpdrive/textures/items/component/flat_screen.pdn deleted file mode 100644 index c30ff2c9..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/flat_screen.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/glass_tank.pdn b/src/main/resources/assets/warpdrive/textures/items/component/glass_tank.pdn deleted file mode 100644 index 4ad7c2f8..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/glass_tank.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/laser_medium_empty.pdn b/src/main/resources/assets/warpdrive/textures/items/component/laser_medium_empty.pdn deleted file mode 100644 index 1962afe1..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/laser_medium_empty.pdn and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/power_interface.psd b/src/main/resources/assets/warpdrive/textures/items/component/power_interface.psd deleted file mode 100644 index eedee267..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/power_interface.psd and /dev/null differ diff --git a/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.png b/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.png index 25ac7675..4a85c3a4 100644 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.png and b/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.png differ diff --git a/src/main/resources/assets/warpdrive/textures/blocks/movement/ship_core-side_active.png.mcmeta b/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.png.mcmeta similarity index 100% rename from src/main/resources/assets/warpdrive/textures/blocks/movement/ship_core-side_active.png.mcmeta rename to src/main/resources/assets/warpdrive/textures/items/component/reactor_core.png.mcmeta diff --git a/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.psd b/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.psd deleted file mode 100644 index db3c593d..00000000 Binary files a/src/main/resources/assets/warpdrive/textures/items/component/reactor_core.psd and /dev/null differ