From acd12747b882af1c838fd04f7e73e41d02ed251c Mon Sep 17 00:00:00 2001 From: antideath <243911689@qq.com> Date: Mon, 1 Sep 2025 23:06:43 +0800 Subject: [PATCH] Update Translation --- .../OptCarpetAddition.java | 7 + .../OptCarpetSettings.java | 180 +++++++----------- .../commands/CommandLoggerCommand.java | 6 +- .../utils/RuleTranslator.java | 30 +++ .../opt-carpet-addition/lang/en_us.json | 69 +++++++ .../opt-carpet-addition/lang/zh_cn.json | 100 ++++++++++ 6 files changed, 283 insertions(+), 109 deletions(-) create mode 100644 src/main/java/io/github/optijava/opt_carpet_addition/utils/RuleTranslator.java create mode 100644 src/main/resources/assets/opt-carpet-addition/lang/en_us.json create mode 100644 src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java index 05c1f48..5f320a9 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetAddition.java @@ -11,6 +11,7 @@ import io.github.optijava.opt_carpet_addition.logger.LoggerRegister; import io.github.optijava.opt_carpet_addition.utils.CommandLogger; import io.github.optijava.opt_carpet_addition.utils.ConfigUtil; +import io.github.optijava.opt_carpet_addition.utils.RuleTranslator; import io.github.optijava.opt_carpet_addition.utils.TpLimit; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; @@ -24,6 +25,7 @@ import org.apache.logging.log4j.Logger; import java.io.File; +import java.util.Map; import java.util.Objects; public class OptCarpetAddition implements CarpetExtension, ModInitializer { @@ -174,4 +176,9 @@ public void onPlayerLoggedOut(ServerPlayerEntity player) { public void registerLoggers() { LoggerRegister.registry(); } + + @Override + public Map canHasTranslations(String lang) { + return RuleTranslator.getTranslationFromResourcePath(lang); + } } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java index 009f0cc..d7699cd 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java @@ -1,13 +1,20 @@ package io.github.optijava.opt_carpet_addition; -//#if MC >= 11900 -//$$ import carpet.api.settings.RuleCategory; -//#else - -import carpet.settings.RuleCategory; +//#if MC >= 12001 +import carpet.api.settings.RuleCategory; +//#endif +////#else +////$$ +////$$ import carpet.settings.RuleCategory; +////#endif +//import carpet.settings.Rule; +//#if MC < 12001 +//$$ import carpet.settings.Rule; +//$$ import carpet.settings.RuleCategory; +//#endif +//#if MC >= 12001 +import carpet.api.settings.Rule; //#endif -import carpet.settings.Rule; - import io.github.optijava.opt_carpet_addition.utils.config_bean.CommandLoggerConfigBean; import io.github.optijava.opt_carpet_addition.utils.config_bean.TpLimitConfigBean; import io.github.optijava.opt_carpet_addition.utils.validator.CustomItemDiscardTimeValidator; @@ -18,7 +25,7 @@ import java.nio.file.Path; //#if MC >= 11900 -//$$ @SuppressWarnings("all") +@SuppressWarnings("all") //#endif public class OptCarpetSettings { public static final String OCA = "OCA"; @@ -27,46 +34,36 @@ public class OptCarpetSettings { // Tp command rules ======================================================================= - @Rule( - desc = "Enables [/player xxx tp] to teleport to fake player", - category = {RuleCategory.COMMAND,OCA}, - options = {"true", "false", "ops"} - ) + @Rule(categories = {RuleCategory.COMMAND,OCA}) public static String commandTpToFakePlayer = FALSE; - @Rule( - desc = "Enables [/player xxx tp] to teleport to real player", - category = {RuleCategory.COMMAND,OCA}, + @Rule(categories = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String allowTpToRealPlayer = FALSE; @Rule( - desc = "Enables [/player xxx tp] to teleport to fake player", - category = {RuleCategory.COMMAND,OCA}, + categories = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String commandTpHereFakePlayer = FALSE; @Rule( - desc = "Enables [/player xxx tp] to teleport to real player", - category = {RuleCategory.COMMAND,OCA}, + categories = {RuleCategory.COMMAND,OCA}, options = {"true", "false", "ops"} ) public static String allowTpHereRealPlayer = FALSE; // Force fake player gamemode rule ========================================================= @Rule( - desc = "Force fake player gamemode", - category = {RuleCategory.FEATURE,OCA}, + categories = {RuleCategory.FEATURE,OCA}, options = {"survival", "creative", "adventure", "false"} ) public static String forceFakePlayerGameMode = FALSE; // Fix bugs ================================================================================ @Rule( - desc = "Refresh xp level when player change world", - category = {RuleCategory.BUGFIX,OCA} + categories = {RuleCategory.BUGFIX,OCA} ) public static boolean fixXpLevelBug = false; @@ -77,196 +74,167 @@ public class OptCarpetSettings { public static CommandLoggerConfigBean commandLoggerConfigBean; @Rule( - desc = "Enable tp prefix blacklist", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpPrefixBlacklist = false; @Rule( - desc = "Enable tp prefix whitelist", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpPrefixWhitelist = false; @Rule( - desc = "Enable tp here prefix blacklist", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpHerePrefixBlacklist = false; @Rule( - desc = "Enable tp here prefix whitelist", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean enableTpHerePrefixWhitelist = false; @Rule( - desc = "Disable chicken lays eggs", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean disabledLayEggs = false; @Rule( - desc = "Disable enderman pickup block goal", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean disabledEnderManPickupGoal = false; @Rule( - desc = "Disable enderman place block goal", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean disabledEnderManPlaceBlockGoal = false; @Rule( - desc = "Disable zombified piglin spawn in nether portal", - category = {RuleCategory.OPTIMIZATION, RuleCategory.FEATURE,OCA} + categories = {RuleCategory.OPTIMIZATION, RuleCategory.FEATURE,OCA} ) public static boolean disabledNetherPortalSpawn = false; @Rule( - desc = "Disable entity tick(contains all entity and BlockEntity)", - category = {RuleCategory.EXPERIMENTAL,OCA} + categories = {RuleCategory.EXPERIMENTAL,OCA} ) public static boolean disabledEntityTick = false; //#if MC < 11900 - @Rule( - desc = "Disable error stack when update suppression.", - category = {RuleCategory.BUGFIX,OCA} - ) - public static boolean disabledUpdateSuppressionErrorStackTrace = false; + //$$ @Rule( + //$$ desc = "Disable error stack when update suppression.", + //$$ category = {RuleCategory.BUGFIX,OCA} + //$$ ) + //$$ public static boolean disabledUpdateSuppressionErrorStackTrace = false; //#endif @Rule( - desc = "Unescape chat message. \\u4e2d -> 中", - category = {RuleCategory.FEATURE, RuleCategory.CLIENT,OCA} + categories = {RuleCategory.FEATURE, RuleCategory.CLIENT,OCA} ) public static boolean unescapeChatMessage = false; //#if MC < 11900 - @Rule( - desc = "Handle player connect in a new thread to reduce the lag.", - category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL,OCA} - ) - public static boolean optimizePlayerConnect = false; + //$$ @Rule( + //$$ desc = "Handle player connect in a new thread to reduce the lag.", + //$$ category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL,OCA} + //$$ ) + //$$ public static boolean optimizePlayerConnect = false; //#endif //#if MC < 11900 - @Rule( - desc = "Handle player teleport in a new thread to reduce the lag.", - category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL,OCA} - ) - public static boolean optimizeTeleport = false; + //$$ @Rule( + //$$ desc = "Handle player teleport in a new thread to reduce the lag.", + //$$ category = {RuleCategory.OPTIMIZATION, RuleCategory.EXPERIMENTAL,OCA} + //$$ ) + //$$ public static boolean optimizeTeleport = false; //#endif @Rule( - desc = "Print info log when players submit command", - category = {RuleCategory.COMMAND, RuleCategory.FEATURE,OCA} + categories = {RuleCategory.COMMAND, RuleCategory.FEATURE,OCA} ) public static boolean commandLogger = false; //#if MC < 11900 - @Rule( - desc = "Dropper crash fix", - category = {RuleCategory.BUGFIX,OCA} - ) - public static boolean dropperCrashFix = false; + //$$ @Rule( + //$$ desc = "Dropper crash fix", + //$$ category = {RuleCategory.BUGFIX,OCA} + //$$ ) + //$$ public static boolean dropperCrashFix = false; //#endif @Rule( - desc = "Always spawn offline fake player to reduce lagging", - category = {RuleCategory.OPTIMIZATION,OCA} + categories = {RuleCategory.OPTIMIZATION,OCA} ) public static boolean optimizeFakePlayerSpawn = false; //#if MC < 12100 - @Rule( - desc = "Fix CCE Suppression crashes", - category = {RuleCategory.BUGFIX, RuleCategory.EXPERIMENTAL,OCA} - ) - public static boolean cceSuppressionCrashFix = false; + //$$ @Rule( + //$$ + //$$ categories = {RuleCategory.BUGFIX, RuleCategory.EXPERIMENTAL,OCA} + //$$ ) + //$$ public static boolean cceSuppressionCrashFix = false; //#endif @Rule( - desc = "Remove every armour which has `curse of binding` enchantment when player dead in wall (keepInventory must be true).", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean removeAllCurseOfBindingArmorWhenPlayerDeadInWall = false; @Rule( - desc = "Modify item disappeared time, default value -1 (unit: tick)", - category = {RuleCategory.FEATURE,OCA}, + categories = {RuleCategory.FEATURE,OCA}, options = {"-1", "6000"}, strict = false, - validate = CustomItemDiscardTimeValidator.class + validators = CustomItemDiscardTimeValidator.class ) public static int customItemDiscardTime = -1; //#if MC >= 12000 - //$$ @Rule( - //$$ desc = "Disallow redstone wire connects to open trapdoor(in version >= 1.20)", - //$$ category = {RuleCategory.FEATURE,OCA} - //$$ ) - //$$ public static boolean disallowRedstoneWireConnectsToOpenTrapdoor = false; + @Rule( + categories = {RuleCategory.FEATURE,OCA} + ) + public static boolean disallowRedstoneWireConnectsToOpenTrapdoor = false; //#endif @Rule( - desc = "Don't enable this rule unless you need blockUpdate logger! Enabling this rule may cause performance issues, so this rule was false by default. Before you set this rule to true, everyone can not use blockUpdate logger.", - category = {RuleCategory.FEATURE, RuleCategory.OPTIMIZATION,OCA} + categories = {RuleCategory.FEATURE, RuleCategory.OPTIMIZATION,OCA} ) public static boolean allowBlockUpdateLogger = false; @Rule( - desc = "Don't spawn bats!", - category = {RuleCategory.FEATURE,OCA} + categories = {RuleCategory.FEATURE,OCA} ) public static boolean removeBats = false; @Rule( - desc = "The rate limit of `/player xxx tp` command. Default: permit 1 request per 2 seconds per player.", - category = {RuleCategory.FEATURE, RuleCategory.COMMAND,OCA}, - validate = PlayerTpRateLimitTimeValidator.class, + categories = {RuleCategory.FEATURE, RuleCategory.COMMAND,OCA}, + validators = PlayerTpRateLimitTimeValidator.class, strict = false, options = {"2"} ) public static int playerTpRateLimitTime = 2; @Rule( - desc = "If enabled, command logger will broadcast commands to those players.", - category = {RuleCategory.COMMAND, RuleCategory.FEATURE,OCA}, + categories = {RuleCategory.COMMAND, RuleCategory.FEATURE,OCA}, options = {"true", "false", "ops"} ) public static String commandLoggerBroadcastToPlayer = FALSE; @Rule( - desc = "allow spectator tp to any player!", - category = {RuleCategory.FEATURE, RuleCategory.COMMAND,OCA}, + categories = {RuleCategory.FEATURE, RuleCategory.COMMAND,OCA}, options = {"true", "false"} ) public static boolean allowSpectatorTpToAnyPlayer = false; @Rule( - desc = "enableLoggerCommand", - category = {RuleCategory.COMMAND , OCA} - ) - public static boolean enableLoggerCommand = true; - - @Rule( - desc = "enableCrashCommand", - category = {RuleCategory.COMMAND , OCA} + categories = {RuleCategory.COMMAND , OCA} ) public static boolean enableCrashCommand = true; @Rule( - desc = "enableListAdvanceCommand", - category = {RuleCategory.COMMAND , OCA} + categories = {RuleCategory.COMMAND , OCA} ) public static boolean enableListAdvanceCommand = true; @Rule( - desc = "enableTpmanagerCommand", - category = {RuleCategory.COMMAND , OCA} + categories = {RuleCategory.COMMAND , OCA} ) public static boolean enableTpmanagerCommand = true; } diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java b/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java index 5a724a4..748feaf 100644 --- a/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java +++ b/src/main/java/io/github/optijava/opt_carpet_addition/commands/CommandLoggerCommand.java @@ -6,15 +6,15 @@ import io.github.optijava.opt_carpet_addition.utils.CommandLogger; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; -import static io.github.optijava.opt_carpet_addition.OptCarpetSettings.enableLoggerCommand; +import static io.github.optijava.opt_carpet_addition.OptCarpetSettings.commandLogger; public class CommandLoggerCommand { public static void registerCommand(CommandDispatcher dispatcher) { LiteralArgumentBuilder argumentBuilder = CommandManager.literal("commandlogger") //#if MC < 12004 - //$$.requires((player) -> carpet.settings.SettingsManager.canUseCommand(source, enableLoggerCommand)) + //$$.requires((player) -> carpet.settings.SettingsManager.canUseCommand(source, commandLogger)) //#else - //$$.requires((player) -> carpet.utils.CommandHelper.canUseCommand(player, enableLoggerCommand)) + //$$.requires((player) -> carpet.utils.CommandHelper.canUseCommand(player, commandLogger)) //#endif .then( CommandManager.literal("reload") diff --git a/src/main/java/io/github/optijava/opt_carpet_addition/utils/RuleTranslator.java b/src/main/java/io/github/optijava/opt_carpet_addition/utils/RuleTranslator.java new file mode 100644 index 0000000..0db2a03 --- /dev/null +++ b/src/main/java/io/github/optijava/opt_carpet_addition/utils/RuleTranslator.java @@ -0,0 +1,30 @@ +package io.github.optijava.opt_carpet_addition.utils; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; + +public class RuleTranslator { + public static Map getTranslationFromResourcePath(String lang) + { + InputStream langFile = RuleTranslator.class.getClassLoader().getResourceAsStream("assets/opt-carpet-addition/lang/%s.json".formatted(lang)); + if (langFile == null) { + return Collections.emptyMap(); + } + String jsonData; + try { + jsonData = IOUtils.toString(langFile, StandardCharsets.UTF_8); + } catch (IOException e) { + return Collections.emptyMap(); + } + Gson gson = new GsonBuilder().setLenient().create(); + return gson.fromJson(jsonData, new TypeToken>() {}.getType()); + } +} diff --git a/src/main/resources/assets/opt-carpet-addition/lang/en_us.json b/src/main/resources/assets/opt-carpet-addition/lang/en_us.json new file mode 100644 index 0000000..ef265af --- /dev/null +++ b/src/main/resources/assets/opt-carpet-addition/lang/en_us.json @@ -0,0 +1,69 @@ +{ + "carpet.rule.commandTpToFakePlayer.desc": "Enables [/player xxx tp] to teleport to fake players.", + + "carpet.rule.allowTpToRealPlayer.desc": "Enables [/player xxx tp] to teleport to real players.", + + "carpet.rule.commandTpHereFakePlayer.desc": "Enables [/player xxx tp] to teleport fake players to yourself.", + + "carpet.rule.allowTpHereRealPlayer.desc": "Enables [/player xxx tp] to teleport real players to yourself.", + + "carpet.rule.forceFakePlayerGameMode.desc": "Force fake players to use a specified gamemode (survival/creative/adventure).", + + "carpet.rule.fixXpLevelBug.desc": "Refresh XP level when players change world.", + + "carpet.rule.enableTpPrefixBlacklist.desc": "Blacklist certain prefixes from using teleport commands.", + + "carpet.rule.enableTpPrefixWhitelist.desc": "Only allow whitelisted prefixes to use teleport commands.", + + "carpet.rule.enableTpHerePrefixBlacklist.desc": "Blacklist certain prefixes from using teleport-here commands.", + + "carpet.rule.enableTpHerePrefixWhitelist.desc": "Only allow whitelisted prefixes to use teleport-here commands.", + + "carpet.rule.disabledLayEggs.desc": "When enabled, chickens no longer lay eggs.", + + "carpet.rule.disabledEnderManPickupGoal.desc": "When enabled, endermen cannot pick up blocks.", + + "carpet.rule.disabledEnderManPlaceBlockGoal.desc": "When enabled, endermen cannot place blocks.", + + "carpet.rule.disabledNetherPortalSpawn.desc": "When enabled, zombified piglins will not spawn in nether portals.", + + "carpet.rule.disabledEntityTick.desc": "Disables ticking of all entities and block entities.", + + "carpet.rule.disabledUpdateSuppressionErrorStackTrace.desc": "Prevents printing error stack traces during update suppression.", + + "carpet.rule.unescapeChatMessage.desc": "Convert Unicode sequences (\\u4e2d) in chat messages into characters (中).", + + "carpet.rule.optimizePlayerConnect.desc": "Handle player connection in a new thread to reduce lag.", + + "carpet.rule.optimizeTeleport.desc": "Handle teleportation in a new thread to reduce lag.", + + "carpet.rule.commandLogger.desc": "When enabled, logs commands executed by players.", + + "carpet.rule.dropperCrashFix.desc": "Fix crashes related to droppers.", + + "carpet.rule.optimizeFakePlayerSpawn.desc": "Always spawn offline fake players to reduce lag.", + + "carpet.rule.cceSuppressionCrashFix.desc": "Fix crashes caused by ClassCastException during suppression.", + + "carpet.rule.removeAllCurseOfBindingArmorWhenPlayerDeadInWall.desc": "Removes all curse of binding armor when players die in walls (keepInventory must be true).", + + "carpet.rule.customItemDiscardTime.desc": "Modify item despawn time (default -1, unit: tick).", + + "carpet.rule.allowBlockUpdateLogger.desc": "Do not enable unless needed! May cause performance issues.", + + "carpet.rule.removeBats.desc": "When enabled, bats will not spawn.", + + "carpet.rule.playerTpRateLimitTime.desc": "Limit /player xxx tp rate, default 1 request per 2 seconds per player.", + + "carpet.rule.commandLoggerBroadcastToPlayer.desc": "When enabled, command logs are broadcast to specified players.", + + "carpet.rule.allowSpectatorTpToAnyPlayer.desc": "Allow spectators to teleport to any player.", + + "carpet.rule.enableCrashCommand.desc": "Enable use of the crash command.", + + "carpet.rule.enableListAdvanceCommand.desc": "Enable advanced player list functionality.", + + "carpet.rule.enableTpmanagerCommand.desc": "Enable use of the tpmanager command.", + + "carpet.rule.disallowRedstoneWireConnectsToOpenTrapdoor.desc": "disallowRedstoneWireConnectsToOpenTrapdoor" +} diff --git a/src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json b/src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json new file mode 100644 index 0000000..9b4c1f7 --- /dev/null +++ b/src/main/resources/assets/opt-carpet-addition/lang/zh_cn.json @@ -0,0 +1,100 @@ +{ + "carpet.rule.commandTpToFakePlayer.name": "传送到假人", + "carpet.rule.commandTpToFakePlayer.desc": "启用后允许使用 [/player xxx tp] 传送到假玩家。", + + "carpet.rule.allowTpToRealPlayer.name": "传送到真人", + "carpet.rule.allowTpToRealPlayer.desc": "启用后允许使用 [/player xxx tp] 传送到真实玩家。", + + "carpet.rule.commandTpHereFakePlayer.name": "传送假人到自己", + "carpet.rule.commandTpHereFakePlayer.desc": "启用后允许使用 [/player xxx tp] 将假玩家传送到自己。", + + "carpet.rule.allowTpHereRealPlayer.name": "传送真人到自己", + "carpet.rule.allowTpHereRealPlayer.desc": "启用后允许使用 [/player xxx tp] 将真实玩家传送到自己。", + + "carpet.rule.forceFakePlayerGameMode.name": "强制假人游戏模式", + "carpet.rule.forceFakePlayerGameMode.desc": "强制指定假人的游戏模式(生存/创造/冒险)。", + + "carpet.rule.fixXpLevelBug.name": "修复经验等级错误", + "carpet.rule.fixXpLevelBug.desc": "玩家切换世界时刷新经验等级。", + + "carpet.rule.enableTpPrefixBlacklist.name": "启用传送前缀黑名单", + "carpet.rule.enableTpPrefixBlacklist.desc": "启用后限制部分前缀禁止使用传送命令。", + + "carpet.rule.enableTpPrefixWhitelist.name": "启用传送前缀白名单", + "carpet.rule.enableTpPrefixWhitelist.desc": "启用后仅允许白名单内的前缀使用传送命令。", + + "carpet.rule.enableTpHerePrefixBlacklist.name": "启用传送到这里前缀黑名单", + "carpet.rule.enableTpHerePrefixBlacklist.desc": "启用后限制部分前缀禁止使用传送到这里命令。", + + "carpet.rule.enableTpHerePrefixWhitelist.name": "启用传送到这里前缀白名单", + "carpet.rule.enableTpHerePrefixWhitelist.desc": "启用后仅允许白名单内的前缀使用传送到这里命令。", + + "carpet.rule.disabledLayEggs.name": "禁用母鸡下蛋", + "carpet.rule.disabledLayEggs.desc": "启用后鸡不会产蛋。", + + "carpet.rule.disabledEnderManPickupGoal.name": "禁用末影人捡方块", + "carpet.rule.disabledEnderManPickupGoal.desc": "启用后末影人无法捡起方块。", + + "carpet.rule.disabledEnderManPlaceBlockGoal.name": "禁用末影人放置方块", + "carpet.rule.disabledEnderManPlaceBlockGoal.desc": "启用后末影人无法放置方块。", + + "carpet.rule.disabledNetherPortalSpawn.name": "禁用地狱门猪灵生成", + "carpet.rule.disabledNetherPortalSpawn.desc": "启用后僵尸猪灵不会在地狱门生成。", + + "carpet.rule.disabledEntityTick.name": "禁用实体刻更新", + "carpet.rule.disabledEntityTick.desc": "禁用所有实体与方块实体的 tick 更新。", + + "carpet.rule.disabledUpdateSuppressionErrorStackTrace.name": "禁用更新抑制错误堆栈", + "carpet.rule.disabledUpdateSuppressionErrorStackTrace.desc": "启用后不会打印更新抑制时的错误堆栈。", + + "carpet.rule.unescapeChatMessage.name": "反转义聊天消息", + "carpet.rule.unescapeChatMessage.desc": "将聊天消息中的 Unicode 代码 (\\u4e2d) 转换为文字 (中)。", + + "carpet.rule.optimizePlayerConnect.name": "优化玩家连接", + "carpet.rule.optimizePlayerConnect.desc": "在新线程中处理玩家连接以减少卡顿。", + + "carpet.rule.optimizeTeleport.name": "优化传送", + "carpet.rule.optimizeTeleport.desc": "在新线程中处理传送以减少卡顿。", + + "carpet.rule.commandLogger.name": "命令日志记录", + "carpet.rule.commandLogger.desc": "启用后会在玩家输入命令时打印日志。", + + "carpet.rule.dropperCrashFix.name": "投掷器崩溃修复", + "carpet.rule.dropperCrashFix.desc": "修复投掷器相关的崩溃问题。", + + "carpet.rule.optimizeFakePlayerSpawn.name": "优化假人生成", + "carpet.rule.optimizeFakePlayerSpawn.desc": "始终生成离线假人以减少卡顿。", + + "carpet.rule.cceSuppressionCrashFix.name": "CCE 抑制崩溃修复", + "carpet.rule.cceSuppressionCrashFix.desc": "修复更新抑制引发的 ClassCastException 崩溃。", + + "carpet.rule.removeAllCurseOfBindingArmorWhenPlayerDeadInWall.name": "移除绑定诅咒装备", + "carpet.rule.removeAllCurseOfBindingArmorWhenPlayerDeadInWall.desc": "玩家在墙中死亡时移除所有绑定诅咒装备(需启用保留物品)。", + + "carpet.rule.customItemDiscardTime.name": "自定义物品消失时间", + "carpet.rule.customItemDiscardTime.desc": "修改物品消失时间(默认 -1,单位 tick)。", + + "carpet.rule.allowBlockUpdateLogger.name": "允许方块更新日志", + "carpet.rule.allowBlockUpdateLogger.desc": "启用前请谨慎!此功能可能影响性能。", + + "carpet.rule.removeBats.name": "移除蝙蝠", + "carpet.rule.removeBats.desc": "启用后不再生成蝙蝠。", + + "carpet.rule.playerTpRateLimitTime.name": "玩家传送速率限制", + "carpet.rule.playerTpRateLimitTime.desc": "限制 /player xxx tp 的速率,默认每 2 秒一次。", + + "carpet.rule.commandLoggerBroadcastToPlayer.name": "命令日志广播", + "carpet.rule.commandLoggerBroadcastToPlayer.desc": "启用后,命令日志会广播给指定玩家。", + + "carpet.rule.allowSpectatorTpToAnyPlayer.name": "旁观者自由传送", + "carpet.rule.allowSpectatorTpToAnyPlayer.desc": "允许旁观者模式下传送到任意玩家。", + + "carpet.rule.enableCrashCommand.name": "启用崩溃指令", + "carpet.rule.enableCrashCommand.desc": "启用后可使用崩溃指令。", + + "carpet.rule.enableListAdvanceCommand.name": "启用增强列表指令", + "carpet.rule.enableListAdvanceCommand.desc": "启用后提供更高级的玩家列表功能。", + + "carpet.rule.enableTpmanagerCommand.name": "启用传送管理指令", + "carpet.rule.enableTpmanagerCommand.desc": "启用后可使用传送管理指令。" +}