diff --git a/build.gradle b/build.gradle index 5d17cfb..5cd730d 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ minecraft { repositories { maven { url "http://dvs1.progwml6.com/files/maven" } - maven { url = "http://maven.ic2.player.to/" } + maven { url = "https://modmaven.dev/" } maven { url = "http://maven.covers1624.net" } } @@ -144,4 +144,4 @@ idea { module { outputDir = file('build/classes/main') } -} +} \ No newline at end of file diff --git a/src/main/java/li/cil/scannable/client/ScanManager.java b/src/main/java/li/cil/scannable/client/ScanManager.java index 36de57a..4298f38 100644 --- a/src/main/java/li/cil/scannable/client/ScanManager.java +++ b/src/main/java/li/cil/scannable/client/ScanManager.java @@ -6,6 +6,7 @@ import li.cil.scannable.common.capabilities.CapabilityScanResultProvider; import li.cil.scannable.common.config.Constants; import li.cil.scannable.common.config.Settings; +import li.cil.scannable.common.config.ClientSettings; import li.cil.scannable.common.init.Items; import li.cil.scannable.integration.optifine.ProxyOptiFine; import net.minecraft.client.Minecraft; @@ -36,21 +37,23 @@ public enum ScanManager { // --------------------------------------------------------------------- // private static int computeTargetRadius() { - return Minecraft.getMinecraft().gameSettings.renderDistanceChunks * Constants.CHUNK_SIZE - Constants.SCAN_INITIAL_RADIUS; + return Minecraft.getMinecraft().gameSettings.renderDistanceChunks * Constants.CHUNK_SIZE + - Constants.SCAN_INITIAL_RADIUS; } public static int computeScanGrowthDuration() { - return Constants.SCAN_GROWTH_DURATION * Minecraft.getMinecraft().gameSettings.renderDistanceChunks / Constants.REFERENCE_RENDER_DISTANCE; + return Constants.SCAN_GROWTH_DURATION * Minecraft.getMinecraft().gameSettings.renderDistanceChunks + / Constants.REFERENCE_RENDER_DISTANCE; } public static float computeRadius(final long start, final float duration) { // Scan wave speeds up exponentially. To avoid the initial speed being // near zero due to that we offset the time and adjust the remaining // parameters accordingly. Base equation is: - // r = a + (t + b)^2 * c + // r = a + (t + b)^2 * c // with r := 0 and target radius and t := 0 and target time this yields: - // c = r1/((t1 + b)^2 - b*b) - // a = -r1*b*b/((t1 + b)^2 - b*b) + // c = r1/((t1 + b)^2 - b*b) + // a = -r1*b*b/((t1 + b)^2 - b*b) final float r1 = (float) computeTargetRadius(); final float t1 = duration; @@ -91,7 +94,8 @@ public void beginScan(final EntityPlayer player, final List modules) float scanRadius = Settings.getBaseScanRadius(); for (final ItemStack module : modules) { - final ScanResultProvider provider = module.getCapability(CapabilityScanResultProvider.SCAN_RESULT_PROVIDER_CAPABILITY, null); + final ScanResultProvider provider = module + .getCapability(CapabilityScanResultProvider.SCAN_RESULT_PROVIDER_CAPABILITY, null); if (provider != null) { collectingProviders.add(provider); } @@ -120,7 +124,8 @@ public void updateScan(final Entity entity, final boolean finish) { } for (final ScanResultProvider provider : collectingProviders) { - provider.computeScanResults(result -> collectingResults.computeIfAbsent(provider, p -> new ArrayList<>()).add(result)); + provider.computeScanResults( + result -> collectingResults.computeIfAbsent(provider, p -> new ArrayList<>()).add(result)); } ++scanningTicks; @@ -130,7 +135,8 @@ public void updateScan(final Entity entity, final boolean finish) { for (int i = 0; i < remaining; i++) { for (final ScanResultProvider provider : collectingProviders) { - provider.computeScanResults(result -> collectingResults.computeIfAbsent(provider, p -> new ArrayList<>()).add(result)); + provider.computeScanResults( + result -> collectingResults.computeIfAbsent(provider, p -> new ArrayList<>()).add(result)); } } @@ -144,7 +150,8 @@ public void updateScan(final Entity entity, final boolean finish) { currentStart = System.currentTimeMillis(); pendingResults.putAll(collectingResults); - pendingResults.values().forEach(list -> list.sort(Comparator.comparing(result -> -lastScanCenter.distanceTo(result.getPosition())))); + pendingResults.values().forEach( + list -> list.sort(Comparator.comparing(result -> -lastScanCenter.distanceTo(result.getPosition())))); ScannerRenderer.INSTANCE.ping(lastScanCenter); @@ -166,12 +173,13 @@ public void onClientTick(final TickEvent.ClientTickEvent event) { if (lastScanCenter == null || currentStart < 0) { return; } - - if (Constants.SCAN_STAY_DURATION < (int) (System.currentTimeMillis() - currentStart)) { + final int duration = ClientSettings.scanStayDuration; + if (duration < (int) (System.currentTimeMillis() - currentStart) && duration != -1) { pendingResults.clear(); synchronized (renderingResults) { if (!renderingResults.isEmpty()) { - for (Iterator>> iterator = renderingResults.entrySet().iterator(); iterator.hasNext(); ) { + for (Iterator>> iterator = renderingResults + .entrySet().iterator(); iterator.hasNext();) { final Map.Entry> entry = iterator.next(); final List list = entry.getValue(); for (int i = MathHelper.ceil(list.size() / 2f); i > 0; i--) { @@ -257,7 +265,8 @@ public void onPreRenderGameOverlay(final RenderGameOverlayEvent.Pre event) { return; } - // Using shaders so we render as game overlay; restore matrices as used for world rendering. + // Using shaders so we render as game overlay; restore matrices as used for + // world rendering. GlStateManager.matrixMode(GL11.GL_PROJECTION); GlStateManager.pushMatrix(); GlStateManager.matrixMode(GL11.GL_MODELVIEW); diff --git a/src/main/java/li/cil/scannable/common/config/ClientSettings.java b/src/main/java/li/cil/scannable/common/config/ClientSettings.java new file mode 100644 index 0000000..77a4157 --- /dev/null +++ b/src/main/java/li/cil/scannable/common/config/ClientSettings.java @@ -0,0 +1,31 @@ +package li.cil.scannable.common.config; + +import li.cil.scannable.api.API; +import li.cil.scannable.client.scanning.ScanResultProviderBlock; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.config.Config; +import net.minecraftforge.fml.common.registry.ForgeRegistries; + +import javax.annotation.Nullable; +import java.util.HashSet; +import java.util.Set; + +@Config(modid = API.MOD_ID, category = "client", name = "scannable-Client") +public final class ClientSettings { + @Config.LangKey(Constants.CONFIG_SCAN_STAY_DURATION) + @Config.Comment("How long the results from a scan should remain visible (in milliseconds).") + @Config.RangeInt(min = -1) + public static int scanStayDuration = 10000; + + /* + * public static int getScanStayDuration() { + * return serverSettings != null ? serverSettings.scanStayDuration : + * scanStayDuration; + * } + */ + + private ClientSettings() { + } +} \ No newline at end of file diff --git a/src/main/java/li/cil/scannable/common/config/Constants.java b/src/main/java/li/cil/scannable/common/config/Constants.java index bcb482e..89970c8 100644 --- a/src/main/java/li/cil/scannable/common/config/Constants.java +++ b/src/main/java/li/cil/scannable/common/config/Constants.java @@ -52,6 +52,7 @@ public final class Constants { public static final String CONFIG_FLUID_BLACKLIST = "config.scannable.fluidBlacklist"; public static final String CONFIG_FLUID_COLORS = "config.scannable.fluidColors"; public static final String CONFIG_LOG_BLOCK_DROP_LOOKUP_FAILURES = "config.scannable.logBlockDropLookupFailures"; + public static final String CONFIG_SCAN_STAY_DURATION = "config.scannable.scanStayDuration"; // --------------------------------------------------------------------- // // GUI labels diff --git a/src/main/java/li/cil/scannable/common/config/Settings.java b/src/main/java/li/cil/scannable/common/config/Settings.java index fe69e1d..18131a2 100644 --- a/src/main/java/li/cil/scannable/common/config/Settings.java +++ b/src/main/java/li/cil/scannable/common/config/Settings.java @@ -12,11 +12,11 @@ import java.util.HashSet; import java.util.Set; -@Config(modid = API.MOD_ID) +@Config(modid = API.MOD_ID, name = "scannable-Common") public final class Settings { @Config.LangKey(Constants.CONFIG_USE_ENERGY) @Config.Comment("Whether to consume energy when performing a scan.\n" + - "Will make the scanner a chargeable item.") + "Will make the scanner a chargeable item.") @Config.RequiresWorldRestart public static boolean useEnergy = true; @@ -82,10 +82,11 @@ public final class Settings { @Config.LangKey(Constants.CONFIG_BASE_SCAN_RADIUS) @Config.Comment("The basic scan radius without range modules.\n" + - "IMPORTANT: some modules such as the block and ore scanner modules will already use\n" + - "a reduced radius based on this value. Specifically, the ore scanners multiply this\n" + - "value by " + Constants.MODULE_ORE_RADIUS_MULTIPLIER + ", and the block scanner multiplies it by " + Constants.MODULE_BLOCK_RADIUS_MULTIPLIER + ".\n" + - "Range modules will boost the range by half this value.") + "IMPORTANT: some modules such as the block and ore scanner modules will already use\n" + + "a reduced radius based on this value. Specifically, the ore scanners multiply this\n" + + "value by " + Constants.MODULE_ORE_RADIUS_MULTIPLIER + ", and the block scanner multiplies it by " + + Constants.MODULE_BLOCK_RADIUS_MULTIPLIER + ".\n" + + "Range modules will boost the range by half this value.") @Config.RangeInt(min = 16, max = 128) @Config.RequiresWorldRestart public static int baseScanRadius = 64; @@ -105,7 +106,7 @@ public final class Settings { @Config.LangKey(Constants.CONFIG_ORES_COMMON) @Config.Comment("Ore dictionary entries considered common ores, requiring the common ore scanner module.\n" + - "Use this to mark ores as common, as opposed to rare (see oresRare).") + "Use this to mark ores as common, as opposed to rare (see oresRare).") @Config.RequiresWorldRestart public static String[] oresCommon = { // Minecraft @@ -129,43 +130,43 @@ public final class Settings { @Config.LangKey(Constants.CONFIG_ORES_RARE) @Config.Comment("Ore dictionary names of ores considered 'rare', requiring the rare ore scanner module.\n" + - "Anything matching /ore[A-Z].*/ that isn't in the common ore list is\n" + - "automatically considered a rare ore (as opposed to the other way around,\n" + - "to make missing entries less likely be a problem). Use this to add rare\n" + - "ores that do follow this pattern.") + "Anything matching /ore[A-Z].*/ that isn't in the common ore list is\n" + + "automatically considered a rare ore (as opposed to the other way around,\n" + + "to make missing entries less likely be a problem). Use this to add rare\n" + + "ores that do follow this pattern.") @Config.RequiresWorldRestart public static String[] oresRare = { }; @Config.LangKey(Constants.CONFIG_STATES_COMMON) @Config.Comment("Block states considered common ores, requiring the common ore scanner module.\n" + - "Use this to mark arbitrary block states as common ores. Format is as follows:\n" + - " mod_id:block_name\n" + - "or with block properties:\n" + - " mod_id:block_name[property1=value1,property2=value2]\n" + - "You can look up the properties (as well as name and mod id) in the F3 debug overlay\n" + - "in the bottom right.") + "Use this to mark arbitrary block states as common ores. Format is as follows:\n" + + " mod_id:block_name\n" + + "or with block properties:\n" + + " mod_id:block_name[property1=value1,property2=value2]\n" + + "You can look up the properties (as well as name and mod id) in the F3 debug overlay\n" + + "in the bottom right.") @Config.RequiresWorldRestart public static String[] statesCommon = { }; @Config.LangKey(Constants.CONFIG_STATES_RARE) @Config.Comment("Block states considered rare ores, requiring the rare ore scanner module.\n" + - "Use this to mark arbitrary block states as rare ores. Format is as follows:\n" + - " mod_id:block_name\n" + - "or with block properties:\n" + - " mod_id:block_name[property1=value1,property2=value2]\n" + - "You can look up the properties (as well as name and mod id) in the F3 debug overlay\n" + - "in the bottom right.") + "Use this to mark arbitrary block states as rare ores. Format is as follows:\n" + + " mod_id:block_name\n" + + "or with block properties:\n" + + " mod_id:block_name[property1=value1,property2=value2]\n" + + "You can look up the properties (as well as name and mod id) in the F3 debug overlay\n" + + "in the bottom right.") @Config.RequiresWorldRestart public static String[] statesRare = { }; @Config.LangKey(Constants.CONFIG_ORE_COLORS) @Config.Comment("The colors for ores used when rendering their result bounding box.\n" + - "Each entry must be a key-value pair separated by a `=`, with the.\n" + - "key being the ore dictionary name and the value being the hexadecimal\n" + - "RGB value of the color.") + "Each entry must be a key-value pair separated by a `=`, with the.\n" + + "key being the ore dictionary name and the value being the hexadecimal\n" + + "RGB value of the color.") @Config.RequiresWorldRestart public static String[] oreColors = { // Minecraft @@ -231,7 +232,7 @@ public final class Settings { @Config.LangKey(Constants.CONFIG_FLUID_COLORS) @Config.Comment("The colors for fluids used when rendering their result bounding box.\n" + - "See `oreColors` for format entries have to be in.") + "See `oreColors` for format entries have to be in.") @Config.RequiresWorldRestart public static String[] fluidColors = { "water=0x4275DC", @@ -240,25 +241,25 @@ public final class Settings { @Config.LangKey(Constants.CONFIG_INJECT_DEPTH_TEXTURE) @Config.Comment("Whether to try to inject a depth texture into Minecraft's FBO when rendering the\n" + - "scan wave effect. This is much faster as it will not have to re-render the world\n" + - "geometry to retrieve the depth information required for the effect. However, it\n" + - "appears that on some systems this doesn't work. The mod tries to detect that and\n" + - "will fall back to re-rendering automatically, but you can force re-rendering by\n" + - "setting this to false, e.g. for debugging or just to avoid the one logged warning.") + "scan wave effect. This is much faster as it will not have to re-render the world\n" + + "geometry to retrieve the depth information required for the effect. However, it\n" + + "appears that on some systems this doesn't work. The mod tries to detect that and\n" + + "will fall back to re-rendering automatically, but you can force re-rendering by\n" + + "setting this to false, e.g. for debugging or just to avoid the one logged warning.") public static boolean injectDepthTexture = true; @Config.LangKey(Constants.CONFIG_LOG_BLOCK_DROP_LOOKUP_FAILURES) @Config.Comment("Whether to log out failure to determine the item stack dropped by a block.\n" + - "Scannable needs to find the item stack representation of a block to get the\n" + - "ore dictionary name(s) of blocks, as well as to show a more accurate tooltip\n" + - "of the currently bound block in the block module. Scannable attempts to find\n" + - "the item stack representation by calling Block.getPickBlock (which is allowed\n" + - "to fail, as some blocks require a valid world state) and alternatively by using\n " + - "Item.getItemFromBlock+Block.damageDropped, the latter being verified using the\n" + - "roundtrip through Block.damageDropped/Item.getMetadata/Block.getStateFromMeta.\n" + - "Sadly this fails for a lot of modded blocks because people rarely implement\n" + - "Block.damageDropped. As a workaround you can add blocks for which this fails to\n" + - "the `statesCommon` and `statesRare` lists.") + "Scannable needs to find the item stack representation of a block to get the\n" + + "ore dictionary name(s) of blocks, as well as to show a more accurate tooltip\n" + + "of the currently bound block in the block module. Scannable attempts to find\n" + + "the item stack representation by calling Block.getPickBlock (which is allowed\n" + + "to fail, as some blocks require a valid world state) and alternatively by using\n " + + "Item.getItemFromBlock+Block.damageDropped, the latter being verified using the\n" + + "roundtrip through Block.damageDropped/Item.getMetadata/Block.getStateFromMeta.\n" + + "Sadly this fails for a lot of modded blocks because people rarely implement\n" + + "Block.damageDropped. As a workaround you can add blocks for which this fails to\n" + + "the `statesCommon` and `statesRare` lists.") public static boolean logBlockDropLookupFailures = false; // --------------------------------------------------------------------- // diff --git a/src/main/resources/assets/scannable/lang/en_US.lang b/src/main/resources/assets/scannable/lang/en_US.lang index 9f9719a..36add93 100644 --- a/src/main/resources/assets/scannable/lang/en_US.lang +++ b/src/main/resources/assets/scannable/lang/en_US.lang @@ -65,3 +65,4 @@ config.scannable.injectDepthTexture=Inject Depth Texture config.scannable.fluidBlacklist=Blacklist: Fluids config.scannable.fluidColors=Fluid Colors config.scannable.logBlockDropLookupFailures=Log item lookup failures +config.scannable.scanStayDuration=Scan result retention time \ No newline at end of file diff --git a/src/main/resources/assets/scannable/lang/zh_CN.lang b/src/main/resources/assets/scannable/lang/zh_CN.lang index 22e8f7b..b0215e3 100644 --- a/src/main/resources/assets/scannable/lang/zh_CN.lang +++ b/src/main/resources/assets/scannable/lang/zh_CN.lang @@ -6,35 +6,38 @@ item.scannable.module_range.name=扫描模块:范围 item.scannable.module_animal.name=扫描模块:动物 item.scannable.module_monster.name=扫描模块:怪物 item.scannable.module_ore_common.name=扫描模块:常见矿石 -item.scannable.module_ore_rare.name=扫描模块:罕见矿石 +item.scannable.module_ore_rare.name=扫描模块:稀有矿石 item.scannable.module_block.name=扫描模块:方块 item.scannable.module_structure.name=扫描模块:结构 item.scannable.module_fluid.name=扫描模块:流体 item.scannable.module_entity.name=扫描模块:实体 -tooltip.scannable.scanner=§8用于扫描附近有趣的东西。 +tooltip.scannable.scanner=§8用于扫描附近指定的方块或实体。 tooltip.scannable.scanner.energy=§7能量:§f%s/%s tooltip.scannable.module.energy_cost=§7能量消耗:§a%s tooltip.scannable.module_range=§7增加扫描的范围。 -tooltip.scannable.module_animal=§7检测动物(非敌对性生物)。 -tooltip.scannable.module_monster=§7检测怪物(敌对性生物)。 -tooltip.scannable.module_ore_common=§7检测常见矿物(比如:煤、铁)。 -tooltip.scannable.module_ore_rare=§7检测罕见矿物(比如:钻石、绿宝石)。 -tooltip.scannable.module_block=§7右击方块绑定模块。 +tooltip.scannable.module_animal=§7检测附近的动物 (中立生物)。 +tooltip.scannable.module_monster=§7检测附近的怪物 (敌对生物)。 +tooltip.scannable.module_ore_common=§7检测附近的常见矿物 (煤, 铁, etc.)。 +tooltip.scannable.module_ore_rare=§7检测附近的稀有矿物 (钻石, 绿宝石, etc.)。 +tooltip.scannable.module_block=§7检测附近指定的方块,右键单击方块进行绑定。 tooltip.scannable.module_block.name=§7绑定的方块:§f%s -tooltip.scannable.module_structure=§7检测世界上邻近的结构 +tooltip.scannable.module_structure=§7检测附近的结构 tooltip.scannable.module_structure.show_explored=§a包括§f发现的结构。 tooltip.scannable.module_structure.hide_explored=§c不包括§f发现的结构。 -tooltip.scannable.module_fluid=§7检测流体(比如:水,熔岩)。 -tooltip.scannable.module_entity=§7右击实体绑定模块。 +tooltip.scannable.module_fluid=§7检测附近的流体 (水, 熔岩, etc.)。 +tooltip.scannable.module_entity=§7检测附近指定的实体,右键单击实体进行绑定。 tooltip.scannable.module_entity.name=§7绑定的实体:§f%s gui.scannable.scanner.title=扫描器 -gui.scannable.scanner.modules=模块 +gui.scannable.scanner.modules=模块激活的模块 +gui.scannable.scanner.modules.tooltip=此栏为扫描时使用的模块 +gui.scannable.scanner.modules_inactive=备用的模块 +gui.scannable.scanner.modules_inactive.tooltip=此栏存放备用模块 gui.scannable.scanner.progress=充能中……%s%% gui.scannable.overlay.entity_details=%s(%sm) -message.scannable.no_scan_modules=§c没有装填任何扫描模块。 +message.scannable.no_scan_modules=§c未安装任何扫描模块。 message.scannable.not_enough_energy=§c能量不足。 message.scannable.block_blacklisted=§c方块在黑名单中。 @@ -44,7 +47,7 @@ config.scannable.energyCostModuleRange=能量消耗:范围模块 config.scannable.energyCostModuleAnimal=能量消耗:动物模块 config.scannable.energyCostModuleMonster=能量消耗:怪物模块 config.scannable.energyCostModuleOreCommon=能量消耗:常见矿石 -config.scannable.energyCostModuleOreRare=能量消耗:罕见矿石 +config.scannable.energyCostModuleOreRare=能量消耗:稀有矿石 config.scannable.energyCostModuleBlock=能量消耗:方块模块 config.scannable.energyCostModuleStructure=能量消耗:结构模块 config.scannable.energyCostModuleFluid=能量消耗:流体模块 @@ -53,9 +56,13 @@ config.scannable.baseScanRadius=基础扫描范围 config.scannable.blockBlacklist=黑名单:方块 config.scannable.oreBlacklist=黑名单:矿物 config.scannable.oresCommon=矿物:常见 -config.scannable.oresRare=矿物:罕见 +config.scannable.oresRare=矿物:稀有 +config.scannable.statesCommon=方块: 常见 +config.scannable.statesRare=方块: 稀有 config.scannable.oreColors=矿物颜色 config.scannable.structures=结构 config.scannable.injectDepthTexture=添加深度纹理 config.scannable.fluidBlacklist=黑名单:流体 config.scannable.fluidColors=流体颜色 +config.scannable.logBlockDropLookupFailures=记录专案寻找失败 +config.scannable.scanStayDuration=扫描结果停留时间 \ No newline at end of file diff --git a/src/main/resources/assets/scannable/lang/zh_TW.lang b/src/main/resources/assets/scannable/lang/zh_TW.lang new file mode 100644 index 0000000..06e8e18 --- /dev/null +++ b/src/main/resources/assets/scannable/lang/zh_TW.lang @@ -0,0 +1,68 @@ +itemGroup.scannable=Scannable + +item.scannable.scanner.name=掃描器 +item.scannable.module_blank.name=空白掃描模組 +item.scannable.module_range.name=掃描模組:範圍 +item.scannable.module_animal.name=掃描模組:動物 +item.scannable.module_monster.name=掃描模組:怪物 +item.scannable.module_ore_common.name=掃描模組:常見礦石 +item.scannable.module_ore_rare.name=掃描模組:稀有礦石 +item.scannable.module_block.name=掃描模組:方塊 +item.scannable.module_structure.name=掃描模組:結構 +item.scannable.module_fluid.name=掃描模組:流體 +item.scannable.module_entity.name=掃描模組:實體 + +tooltip.scannable.scanner=§8用於掃描附近指定的方塊或實體。 +tooltip.scannable.scanner.energy=§7能量:§f%s/%s +tooltip.scannable.module.energy_cost=§7能量消耗:§a%s +tooltip.scannable.module_range=§7增加掃描的範圍。 +tooltip.scannable.module_animal=§7檢測附近的動物 (中立生物)。 +tooltip.scannable.module_monster=§7檢測附近的怪物 (敵對生物)。 +tooltip.scannable.module_ore_common=§7檢測附近的常見礦物 (煤, 鐵, etc.)。 +tooltip.scannable.module_ore_rare=§7檢測附近的稀有礦物 (鑽石, 綠寶石, etc.)。 +tooltip.scannable.module_block=§7檢測附近指定的方塊,右鍵單擊方塊進行綁定。 +tooltip.scannable.module_block.name=§7綁定的方塊:§f%s +tooltip.scannable.module_structure=§7檢測附近的結構 +tooltip.scannable.module_structure.show_explored=§a包括§f發現的結構。 +tooltip.scannable.module_structure.hide_explored=§c不包括§f發現的結構。 +tooltip.scannable.module_fluid=§7檢測附近的流體 (水, 熔岩, etc.)。 +tooltip.scannable.module_entity=§7檢測附近指定的實體,右鍵單擊實體進行綁定。 +tooltip.scannable.module_entity.name=§7綁定的實體:§f%s + +gui.scannable.scanner.title=掃描器 +gui.scannable.scanner.modules=模組 +gui.scannable.scanner.modules.tooltip=此欄為掃描時使用的模組 +gui.scannable.scanner.modules_inactive=備用的模組 +gui.scannable.scanner.modules_inactive.tooltip=此欄存放備用模組 +gui.scannable.scanner.progress=充能中……%s%% +gui.scannable.overlay.entity_details=%s(%sm) + +message.scannable.no_scan_modules=§c未安裝任何掃描模組。 +message.scannable.not_enough_energy=§c能量不足。 +message.scannable.block_blacklisted=§c方塊在黑名單中。 + +config.scannable.useEnergy=能量使用情況 +config.scannable.energyCapacityScanner=儲能上限:掃描器 +config.scannable.energyCostModuleRange=能量消耗:範圍模組 +config.scannable.energyCostModuleAnimal=能量消耗:動物模組 +config.scannable.energyCostModuleMonster=能量消耗:怪物模組 +config.scannable.energyCostModuleOreCommon=能量消耗:常見礦石 +config.scannable.energyCostModuleOreRare=能量消耗:稀有礦石 +config.scannable.energyCostModuleBlock=能量消耗:方塊模組 +config.scannable.energyCostModuleStructure=能量消耗:結構模組 +config.scannable.energyCostModuleFluid=能量消耗:流體模組 +config.scannable.energyCostModuleEntity=能量消耗:實體模組 +config.scannable.baseScanRadius=基礎掃描範圍 +config.scannable.blockBlacklist=黑名單:方塊 +config.scannable.oreBlacklist=黑名單:礦物 +config.scannable.oresCommon=礦物:常見 +config.scannable.oresRare=礦物:稀有 +config.scannable.statesCommon=方塊: 常見 +config.scannable.statesRare=方塊: 稀有 +config.scannable.oreColors=礦物顏色 +config.scannable.structures=結構 +config.scannable.injectDepthTexture=添加深度紋理 +config.scannable.fluidBlacklist=黑名單:流體 +config.scannable.fluidColors=流體顏色 +config.scannable.logBlockDropLookupFailures=記錄專案尋找失敗 +config.scannable.scanStayDuration=掃描結果停留時間 \ No newline at end of file