From 78c92d4e421b45566cf87069f1f2ee4dfd9e6c8f Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Sun, 24 Nov 2024 22:09:08 +0800 Subject: [PATCH] =?UTF-8?q?2024/11/24=20=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E4=B8=8B+2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++- gradle.properties | 2 +- .../211976637bfb5e111401ad2bfb58570ef2fb3dff | 4 +- .../a1129211d3ad6d65c101bb152ae8c66c8256bccb | 4 +- .../ed628fd843215c1bf29a07b9cbd1b26a6af0636d | 4 +- .../assets/leashedplayer/lang/en_us.json | 5 ++ .../assets/leashedplayer/lang/zh_cn.json | 5 ++ .../assets/leashedplayer/lang/zh_tw.json | 5 ++ .../leashedplayer/ClientEventHandler.java | 82 +++++++++++-------- .../leashedplayer/CommonEventHandler.java | 6 +- .../leashedplayer/content/ModKeyMapping.java | 22 +++++ .../content/commands/ChatCommand.java | 40 ++++++--- .../content/commands/Command.java | 2 +- .../content/commands/DebugCommand.java | 58 +++++++++++++ .../content/commands/LeashCommand.java | 8 +- .../content/commands/MotionCommand.java | 9 +- .../content/commands/TickCommand.java | 9 +- .../CanCommonPlayerChangeSelfTalkArea.java | 25 ++++++ .../LanguageAndOtherData/ModLangKeyValue.java | 13 ++- 19 files changed, 237 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/r3944realms/leashedplayer/content/ModKeyMapping.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/content/commands/DebugCommand.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CanCommonPlayerChangeSelfTalkArea.java diff --git a/README.md b/README.md index 9659402..058d960 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 版本 0.0.3.9.9.3 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 +# 版本 0.0.3.9.9.7 提前介绍c[最终版本对于0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 ## 简介 现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧( @@ -48,6 +48,8 @@ * `/lp tick ...` - 用法同原版Tick,但权限降为2,只用于调试,切勿滥用,后期考虑可能写成区域性的 +* `/lp debug ...` - Debug指令,未来可能会移除 + ## 游戏规则 @@ -57,4 +59,8 @@ * `LP.KeepLeashNotDropTime` - 此规则决定,当拴绳关系创建时一段时间里,即是距离已经达到了断裂距离,也保持其不断裂 [默认值: 240ticks ,可设置范围[80, 1200]ticks] -* `LP.DefaultTalkArea` - 此规则决定,聊天半径最小正值 [默认值: -1] \ No newline at end of file +* `LP.DefaultTalkArea` - 此规则决定,聊天半径最小正值 [默认值: -1] + +* `LP.OpenTOPNeededModeWhenScreenIsNotNull` - 此规则决定,是否在在打开 屏幕{除Top的NoteGui 和 聊天GUI外} 情况下改变Top的显示模式为NEEDED [默认值: true] + +* `LP.CanCommonPlayerChangeSelfTalkArea` - 此规则决定,是否普通玩家可以修改自己的聊天可见区域 [默认值: true] \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 297c024..51d22de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,7 +35,7 @@ mod_name=Leashed Player # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=0.0.3.9.9.3 +mod_version=0.0.3.9.9.7 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff index 6349632..5c757e7 100644 --- a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff +++ b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff @@ -1,2 +1,2 @@ -// 1.21 2024-11-24T18:33:50.0269287 Languages: en_us for mod: leashedplayer -a71b7d357b5cd2711e5d59a1784c7c60d8548c43 assets/leashedplayer/lang/en_us.json +// 1.21 2024-11-24T21:20:56.9104455 Languages: en_us for mod: leashedplayer +15a68b539dc9bfec4a0c802a501ee207a84a5a7f assets/leashedplayer/lang/en_us.json diff --git a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb index 54a3df3..7907d2f 100644 --- a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb +++ b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb @@ -1,2 +1,2 @@ -// 1.21 2024-11-24T18:33:50.0259301 Languages: zh_cn for mod: leashedplayer -81b6af6b88539aaf86f0942573198ead6098478a assets/leashedplayer/lang/zh_cn.json +// 1.21 2024-11-24T21:20:56.9094392 Languages: zh_cn for mod: leashedplayer +5231f5c20d6bf6d646c8bb8cf28a7d3caf82073b assets/leashedplayer/lang/zh_cn.json diff --git a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d index 4703559..f6c1e76 100644 --- a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d +++ b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d @@ -1,2 +1,2 @@ -// 1.21 2024-11-24T18:33:50.0239354 Languages: zh_tw for mod: leashedplayer -232af0a8d220b865292cabcc3b5afc0164520116 assets/leashedplayer/lang/zh_tw.json +// 1.21 2024-11-24T21:20:56.907444 Languages: zh_tw for mod: leashedplayer +c99a4f7dd93ced0df1f2689852879858297d3f60 assets/leashedplayer/lang/zh_tw.json diff --git a/src/generated/resources/assets/leashedplayer/lang/en_us.json b/src/generated/resources/assets/leashedplayer/lang/en_us.json index ae11311..416be2e 100644 --- a/src/generated/resources/assets/leashedplayer/lang/en_us.json +++ b/src/generated/resources/assets/leashedplayer/lang/en_us.json @@ -26,6 +26,8 @@ "entity.leashedplayer.kid_player": "Kid", "entity.leashedplayer.leash_rope_arrow": "Leash Rope Arrow", "entity.leashedplayer.spectral_leash_rope_arrow": "Spectral Leash Rope Arrow", + "gamerule.LP.CanCommonPlayerChangeSelfTalkArea": "Should Non-OP Player can change their TalkArea", + "gamerule.LP.CanCommonPlayerChangeSelfTalkArea.description": "Above on its Name", "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "Create Leash Fence Knot Entity if absent", "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "Create LeashKnot Entity if it's absent on fence", "gamerule.LP.DefaultTalkArea": "Default Area Talk", @@ -58,7 +60,10 @@ "item.variant.leash_rope_arrow.desc.1": "§7A variant of Leash Rope Arrow", "item.variant.leash_rope_arrow.desc.2": "§c1.§r The function is the same as its original one。", "jukebox_song.leashedplayer.what_does_the_fox_say": "What does the fox say?", + "key.leashedplayer.apply_talkarea_preference": "Apply TalkArea Preference", + "key.leashedplayer.category": "Leashed Player", "leashedplayer.chat.none_heard_you": "Nobody heard your message", + "leashedplayer.command.chat.message.no_right": "You haven't the right to do that!", "leashedplayer.command.chat.message.talkarea.current_config": "%s 's §6TalkArea Current§7:§e %d §6blocks §f(§aPrefence§7:§e %d §ablocks§f)§r", "leashedplayer.command.chat.message.talkarea.preference.set": "%s 's §atalk area preference set to §e%d§a blocks!§r", "leashedplayer.command.chat.message.talkarea.preference_not_set": "%s 's talk area preference is not set!", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json index 54a823a..b0920c8 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json @@ -26,6 +26,8 @@ "entity.leashedplayer.kid_player": "小孩", "entity.leashedplayer.leash_rope_arrow": "拴绳箭", "entity.leashedplayer.spectral_leash_rope_arrow": "拴绳光灵箭", + "gamerule.LP.CanCommonPlayerChangeSelfTalkArea": "非OP应该可以修改自己的聊天可见半径吗?", + "gamerule.LP.CanCommonPlayerChangeSelfTalkArea.description": "同名", "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失则创建拴绳结", "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在栅栏处缺失拴绳结,则创建它", "gamerule.LP.DefaultTalkArea": "默认聊天区域可见半径", @@ -58,7 +60,10 @@ "item.variant.leash_rope_arrow.desc.1": "§7拴绳箭的一个变种", "item.variant.leash_rope_arrow.desc.2": "§c1.§r 功能同其本体;", "jukebox_song.leashedplayer.what_does_the_fox_say": "狐狸是怎么叫的?", + "key.leashedplayer.apply_talkarea_preference": "应用可见区域预设", + "key.leashedplayer.category": "可拴玩家", "leashedplayer.chat.none_heard_you": "沒有人接收到你的消息", + "leashedplayer.command.chat.message.no_right": "你无权这样做!", "leashedplayer.command.chat.message.talkarea.current_config": "%s§6目前聊天区域可见半径设置§7:§e %d §6格 §f(§a默认值§7:§e %d §a格§f)§r", "leashedplayer.command.chat.message.talkarea.preference.set": "%s§a默认聊天区域可见消息半径设置为 §e%d §a格!§r", "leashedplayer.command.chat.message.talkarea.preference_not_set": "%s未设置默认可见消息聊天区域半径", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json index 3341315..1f7f5b5 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json @@ -26,6 +26,8 @@ "entity.leashedplayer.kid_player": "小孩", "entity.leashedplayer.leash_rope_arrow": "拴繩箭", "entity.leashedplayer.spectral_leash_rope_arrow": "拴繩光靈箭", + "gamerule.LP.CanCommonPlayerChangeSelfTalkArea": "非OP應該可以修改自己的聊天可見半徑嗎?", + "gamerule.LP.CanCommonPlayerChangeSelfTalkArea.description": "同名", "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失則創建拴繩結", "gamerule.LP.CreateLeashFenceKnotEntityIfAbsent.description": "如果在柵欄処缺失拴繩結,則創建它", "gamerule.LP.DefaultTalkArea": "默認聊天區域可見半徑", @@ -58,7 +60,10 @@ "item.variant.leash_rope_arrow.desc.1": "§7拴繩箭矢的一個變種", "item.variant.leash_rope_arrow.desc.2": "§c1.§r 功能與本體一致;", "jukebox_song.leashedplayer.what_does_the_fox_say": "狐狸是怎麽叫的?", + "key.leashedplayer.apply_talkarea_preference": "應用設置可見區域預設", + "key.leashedplayer.category": "可拴玩家", "leashedplayer.chat.none_heard_you": "無人接收到你的訊息", + "leashedplayer.command.chat.message.no_right": "你無權這麽做!", "leashedplayer.command.chat.message.talkarea.current_config": "%s§6目前可見訊息聊天半徑設置§7:§e%d §6格 §f(§a默認值§7:§e%d §a格§f)§r", "leashedplayer.command.chat.message.talkarea.preference.set": "%s§a默認聊天區域可見訊息半徑設置為 §e%d §a格!§r", "leashedplayer.command.chat.message.talkarea.preference_not_set": "%s未設置可見訊息聊天半徑", diff --git a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java index aa106d7..cbefa12 100644 --- a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java @@ -4,6 +4,8 @@ import com.r3944realms.leashedplayer.client.renders.entities.ChestItemLayerRende import com.r3944realms.leashedplayer.client.renders.entities.KidPlayerRenderer; import com.r3944realms.leashedplayer.client.renders.entities.LeashRopeArrowRenderer; import com.r3944realms.leashedplayer.client.renders.entities.SpectralLeashRopeArrowRenderer; +import com.r3944realms.leashedplayer.content.ModKeyMapping; +import com.r3944realms.leashedplayer.content.commands.Command; import com.r3944realms.leashedplayer.content.entities.ModEntityRegister; import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry; import com.r3944realms.leashedplayer.content.gamerules.Server.OpenTOPNeededModeWhenScreenIsNotNull; @@ -34,10 +36,7 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModList; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.neoforge.client.event.ClientTickEvent; -import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; -import net.neoforged.neoforge.client.event.ScreenEvent; +import net.neoforged.neoforge.client.event.*; import java.util.Objects; import java.util.Stack; @@ -85,55 +84,68 @@ public abstract class ClientEventHandler { } } } + @SubscribeEvent + public static void onKetBoardInput(InputEvent.Key event) { + if(ModKeyMapping.KEY_APPLY_TALKAREA_PREFERENCE.isDown()) { + assert Minecraft.getInstance().player != null; + String prefix = (Command.SHOULD_USE_PREFIX ? Command.PREFIX : "") + " "; + Minecraft.getInstance().player.connection.sendCommand(prefix + "talkArea usePreference"); + } + } } @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD, modid = LeashedPlayer.MOD_ID) public static class Mod extends ClientEventHandler { @SubscribeEvent public static void onRegisterItemProperties (FMLClientSetupEvent event){ - event.enqueueWork(() -> { - ItemProperties.register(Items.CROSSBOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow"), - ((pStack, pLevel, pEntity, pSeed) -> { - ChargedProjectiles chargedProjectiles = pStack.get(DataComponents.CHARGED_PROJECTILES); - return chargedProjectiles != null && (chargedProjectiles.contains(ModItemRegister.LEASH_ROPE_ARROW.get()) || chargedProjectiles.contains(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get())) ? 1.0F : 0.0F; - })); - ItemProperties.register(Items.BOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow_pulling"), - ((pStack, pLevel, pEntity, pSeed) -> - (pEntity != null && pEntity.isUsingItem() && pEntity.getUseItem() == pStack && ILeashRopeArrow.isLeashRopeArrow(pStack, pEntity)) ? 1.0F : 0.0F - )); - }); + event.enqueueWork(() -> { + ItemProperties.register(Items.CROSSBOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow"), + ((pStack, pLevel, pEntity, pSeed) -> { + ChargedProjectiles chargedProjectiles = pStack.get(DataComponents.CHARGED_PROJECTILES); + return chargedProjectiles != null && (chargedProjectiles.contains(ModItemRegister.LEASH_ROPE_ARROW.get()) || chargedProjectiles.contains(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get())) ? 1.0F : 0.0F; + })); + ItemProperties.register(Items.BOW, ResourceLocation.withDefaultNamespace("leash_rope_arrow_pulling"), + ((pStack, pLevel, pEntity, pSeed) -> + (pEntity != null && pEntity.isUsingItem() && pEntity.getUseItem() == pStack && ILeashRopeArrow.isLeashRopeArrow(pStack, pEntity)) ? 1.0F : 0.0F + )); + }); - } + } + + @SubscribeEvent + public static void registerKeyMapping(RegisterKeyMappingsEvent event) { + event.register(ModKeyMapping.KEY_APPLY_TALKAREA_PREFERENCE); + } @SubscribeEvent public static void onRegisterRenderer (EntityRenderersEvent.RegisterRenderers event){ - event.registerEntityRenderer(ModEntityRegister.LEASH_ROPE_ARROW.get(), LeashRopeArrowRenderer::new); - event.registerEntityRenderer(ModEntityRegister.SPECTRAL_LEASH_ROPE_ARROW.get(), SpectralLeashRopeArrowRenderer::new); - event.registerEntityRenderer(ModEntityRegister.KID.get(), KidPlayerRenderer::create); - } + event.registerEntityRenderer(ModEntityRegister.LEASH_ROPE_ARROW.get(), LeashRopeArrowRenderer::new); + event.registerEntityRenderer(ModEntityRegister.SPECTRAL_LEASH_ROPE_ARROW.get(), SpectralLeashRopeArrowRenderer::new); + event.registerEntityRenderer(ModEntityRegister.KID.get(), KidPlayerRenderer::create); + } @SubscribeEvent public static void onAddLayers (EntityRenderersEvent.AddLayers event){ - PlayerRenderer renderer = event.getSkin(PlayerSkin.Model.WIDE); - if (renderer instanceof PlayerRenderer playerRenderer) { - playerRenderer.addLayer(new ChestItemLayerRenderer<>(playerRenderer, event.getContext().getItemInHandRenderer())); - } + PlayerRenderer renderer = event.getSkin(PlayerSkin.Model.WIDE); + if (renderer instanceof PlayerRenderer playerRenderer) { + playerRenderer.addLayer(new ChestItemLayerRenderer<>(playerRenderer, event.getContext().getItemInHandRenderer())); + } - PlayerRenderer slimRenderer = event.getSkin(PlayerSkin.Model.SLIM); - if (slimRenderer instanceof PlayerRenderer slimPlayerRenderer) { - slimPlayerRenderer.addLayer(new ChestItemLayerRenderer<>(slimPlayerRenderer, event.getContext().getItemInHandRenderer())); + PlayerRenderer slimRenderer = event.getSkin(PlayerSkin.Model.SLIM); + if (slimRenderer instanceof PlayerRenderer slimPlayerRenderer) { + slimPlayerRenderer.addLayer(new ChestItemLayerRenderer<>(slimPlayerRenderer, event.getContext().getItemInHandRenderer())); + } } - } @SubscribeEvent public static void onRegisterItemColorHandlers (RegisterColorHandlersEvent.Item event){ - event.register( - (color, i) -> i > 0 - ? -1 - : FastColor.ARGB32.opaque(color.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).getColor()), - ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get() - ); - } + event.register( + (color, i) -> i > 0 + ? -1 + : FastColor.ARGB32.opaque(color.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).getColor()), + ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get() + ); + } } } diff --git a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java index 95b6af7..a811026 100644 --- a/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/CommonEventHandler.java @@ -1,10 +1,7 @@ package com.r3944realms.leashedplayer; import com.mojang.brigadier.CommandDispatcher; -import com.r3944realms.leashedplayer.content.commands.ChatCommand; -import com.r3944realms.leashedplayer.content.commands.LeashCommand; -import com.r3944realms.leashedplayer.content.commands.MotionCommand; -import com.r3944realms.leashedplayer.content.commands.TickCommand; +import com.r3944realms.leashedplayer.content.commands.*; import com.r3944realms.leashedplayer.content.effects.ModEffectRegister; import com.r3944realms.leashedplayer.content.effects.ModPotionRegister; import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; @@ -64,6 +61,7 @@ public class CommonEventHandler { MotionCommand.register(dispatcher); ChatCommand.register(dispatcher); TickCommand.register(dispatcher); + DebugCommand.register(dispatcher); } @SubscribeEvent diff --git a/src/main/java/com/r3944realms/leashedplayer/content/ModKeyMapping.java b/src/main/java/com/r3944realms/leashedplayer/content/ModKeyMapping.java new file mode 100644 index 0000000..f6167f5 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/ModKeyMapping.java @@ -0,0 +1,22 @@ +package com.r3944realms.leashedplayer.content; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.neoforged.neoforge.client.settings.KeyConflictContext; +import net.neoforged.neoforge.client.settings.KeyModifier; +import org.lwjgl.glfw.GLFW; + +public class ModKeyMapping { + static String KEY_ROOT_ = "key.leashedplayer."; + public static String CATEGORY = "key.leashedplayer.category"; + public static String APPLY_TALKAREA_PREFERENCE_KEY = KEY_ROOT_ + "apply_talkarea_preference"; + public static final KeyMapping KEY_APPLY_TALKAREA_PREFERENCE = + new KeyMapping( + APPLY_TALKAREA_PREFERENCE_KEY, + KeyConflictContext.IN_GAME, + KeyModifier.NONE, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_I, + CATEGORY + ); +} diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/ChatCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/ChatCommand.java index a0f8670..374a350 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/ChatCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/ChatCommand.java @@ -4,7 +4,8 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig; +import com.r3944realms.leashedplayer.content.gamerules.GameruleRegistry; +import com.r3944realms.leashedplayer.content.gamerules.Server.CanCommonPlayerChangeSelfTalkArea; import com.r3944realms.leashedplayer.modInterface.ServerPlayerCapacity; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -18,10 +19,12 @@ import java.util.Collection; import java.util.List; import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; +import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX; public class ChatCommand { private static final String LP_CHAT_MESSAGE_ = "leashedplayer.command.chat.message."; + public static final String NO_RIGHT = LP_CHAT_MESSAGE_ + "no_right"; public static final String SELF_TALK_AREA_SET = LP_CHAT_MESSAGE_ + "talkarea.self.set", SELF_TALK_AREA_PREFERENCE_SET = LP_CHAT_MESSAGE_ + "talkarea.self.preference.set", SELF_TALK_AREA_PREFERENCE_NOT_SET = LP_CHAT_MESSAGE_ + "talkarea.self.preference_not_set", @@ -33,13 +36,17 @@ public class ChatCommand { TALK_AREA_UNLIMITED = LP_CHAT_MESSAGE_ + "talkarea.unlimited", TALK_AREA_CURRENT_CONFIG = LP_CHAT_MESSAGE_ + "talkarea.current_config"; public static void register(CommandDispatcher dispatcher) { - boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); - @Nullable List> nodeList = shouldUsePrefix ? null : new ArrayList<>(); + @Nullable List> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); - LiteralArgumentBuilder $$leashRoot = getLiterArgumentBuilderOfCSS("talkArea", !shouldUsePrefix, nodeList); + LiteralArgumentBuilder $$leashRoot = getLiterArgumentBuilderOfCSS("talkArea", !SHOULD_USE_PREFIX, nodeList); Command chat$self$talkArea_set = (context -> { CommandSourceStack source = context.getSource(); - ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException(); + ServerPlayer player = source.getPlayerOrException(); + ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) player; + if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) { + source.sendFailure(Component.translatable(NO_RIGHT)); + return 1; + } int integer = IntegerArgumentType.getInteger(context, "talkAreaRadius"); serverPlayer.setTalkArea(integer); source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_SET, integer),true); @@ -47,7 +54,12 @@ public class ChatCommand { }); Command chat$self$talkArea_preference_set = (context -> { CommandSourceStack source = context.getSource(); - ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException(); + ServerPlayer player = source.getPlayerOrException(); + ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) player; + if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) { + source.sendFailure(Component.translatable(NO_RIGHT)); + return 1; + } int integer = IntegerArgumentType.getInteger(context, "talkAreaPreferenceRadius"); serverPlayer.setTalkAreaPreference(integer); source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_PREFERENCE_SET, integer),true); @@ -55,7 +67,12 @@ public class ChatCommand { }); Command chat$self$talkArea_usePreference = (context -> { CommandSourceStack source = context.getSource(); - ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException(); + ServerPlayer player = source.getPlayerOrException(); + ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) player; + if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) { + source.sendFailure(Component.translatable(NO_RIGHT)); + return 1; + } if(serverPlayer.getTalkAreaPreference() == -1) { source.sendFailure(Component.translatable(SELF_TALK_AREA_PREFERENCE_NOT_SET)); return 1; @@ -67,8 +84,11 @@ public class ChatCommand { }); Command chat$self$talkArea_unlimited = (context -> { CommandSourceStack source = context.getSource(); - ServerPlayerCapacity serverPlayer = (ServerPlayerCapacity) source.getPlayerOrException(); - serverPlayer.setTalkArea(-1); + ServerPlayer player = source.getPlayerOrException(); + if((!player.hasPermissions(2) && !GameruleRegistry.getGameruleBoolValue(source.getLevel(), CanCommonPlayerChangeSelfTalkArea.ID))) { + source.sendFailure(Component.translatable(NO_RIGHT)); + return 1; + } source.sendSuccess(() -> Component.translatable(SELF_TALK_AREA_UNLIMITED),true); return 0; }); @@ -153,7 +173,7 @@ public class ChatCommand { .executes(chat$talkArea_unlimited)) .then(Commands.literal("currentConfig") .executes(chat$talkArea_getCurrentConfig))); - if(shouldUsePrefix) { + if(SHOULD_USE_PREFIX) { literalArgumentBuilder.then(selfTalkAreaSet); literalArgumentBuilder.then(TalkAreaCommon); dispatcher.register(literalArgumentBuilder); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java index 290786e..2d97ed3 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/Command.java @@ -10,7 +10,7 @@ import java.util.List; public class Command { public static final String PREFIX = LeashPlayerCommonConfig.LeashedPlayerModCommandPrefix.get(); - + public static boolean SHOULD_USE_PREFIX = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); static LiteralArgumentBuilder getLiterArgumentBuilderOfCSS(String name, boolean shouldAddToList, @Nullable List> list) { LiteralArgumentBuilder literal = Commands.literal(name); if (shouldAddToList) { diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/DebugCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/DebugCommand.java new file mode 100644 index 0000000..f797fba --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/DebugCommand.java @@ -0,0 +1,58 @@ +package com.r3944realms.leashedplayer.content.commands; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.Connection; +import net.minecraft.network.PacketSendListener; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.common.ClientboundDisconnectPacket; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; +import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX; + +public class DebugCommand { + public static void register(CommandDispatcher dispatcher) { + @Nullable List> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); + LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); + LiteralArgumentBuilder $$DebugRoot = getLiterArgumentBuilderOfCSS("debug", !SHOULD_USE_PREFIX, nodeList); + com.mojang.brigadier.Command kickTargets = context -> { + for(ServerPlayer entity : EntityArgument.getPlayers(context, "targets")){ + MutableComponent literal = Component.literal("You are already connected to this proxy!"); + Connection connection = entity.connection.getConnection(); + connection.send(new ClientboundDisconnectPacket(literal), PacketSendListener.thenRun(() -> connection.disconnect(literal))); + } + return 0; + }; + com.mojang.brigadier.Command kickSelf = context -> { + CommandSourceStack source = context.getSource(); + if (source.getEntity() instanceof ServerPlayer serverPlayer) { + MutableComponent literal = Component.literal("You are already connected to this proxy!"); + Connection connection = serverPlayer.connection.getConnection(); + connection.send(new ClientboundDisconnectPacket(literal), PacketSendListener.thenRun(() -> connection.disconnect(literal))); + } + return 0; + }; + LiteralArgumentBuilder debugKick = $$DebugRoot.requires(commandSourceStack -> commandSourceStack.hasPermission(2)) + .then( + Commands.literal("kick").executes(kickSelf) + .then(Commands.argument("targets", EntityArgument.entities()) + .executes(kickTargets) + ) + ); + if(SHOULD_USE_PREFIX){ + literalArgumentBuilder.then(debugKick); + dispatcher.register(literalArgumentBuilder); + } else { + nodeList.forEach(dispatcher::register); + } + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java index 88888bf..842df6f 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java @@ -29,6 +29,7 @@ import java.util.Collection; import java.util.List; import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; +import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX; public class LeashCommand { public static final Integer MIN_VALUE = LeashPlayerCommonConfig.MinimumLeashLengthCanBeSet.get(); @@ -54,10 +55,9 @@ public class LeashCommand { ; public static void register(CommandDispatcher dispatcher) { - boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); - @Nullable List> nodeList = shouldUsePrefix ? null : new ArrayList<>(); + @Nullable List> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); - LiteralArgumentBuilder $$leashRoot = getLiterArgumentBuilderOfCSS("leash", !shouldUsePrefix, nodeList); + LiteralArgumentBuilder $$leashRoot = getLiterArgumentBuilderOfCSS("leash", !SHOULD_USE_PREFIX, nodeList); Command getSelfLeashLength = context -> { CommandSourceStack source = context.getSource(); @@ -393,7 +393,7 @@ public class LeashCommand { ) ); - if(shouldUsePrefix) { + if(SHOULD_USE_PREFIX) { literalArgumentBuilder .then(RefPlayerLeashLength) .then(SelfLeashLength) diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java index 91222ba..fced654 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/MotionCommand.java @@ -4,7 +4,6 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.DoubleArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig; import com.r3944realms.leashedplayer.network.client.UpdatePlayerMovement; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -20,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; +import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX; public class MotionCommand { private final static String LEASHED_PLAYER_MOTION_MESSAGE_ = "leashedplayer.command.motion.message."; @@ -27,10 +27,9 @@ public class MotionCommand { MOTION_ADDER_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "adder.successful", MOTION_MULTIPLY_SUCCESSFUL = LEASHED_PLAYER_MOTION_MESSAGE_ + "multiply.successful"; public static void register(CommandDispatcher dispatcher) { - boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); - @Nullable List> nodeList = shouldUsePrefix ? null : new ArrayList<>(); + @Nullable List> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); - LiteralArgumentBuilder $$motionRoot = getLiterArgumentBuilderOfCSS("motion", !shouldUsePrefix, nodeList); + LiteralArgumentBuilder $$motionRoot = getLiterArgumentBuilderOfCSS("motion", !SHOULD_USE_PREFIX, nodeList); com.mojang.brigadier.Command motionVecAdder = context -> { CommandSourceStack source = context.getSource(); for(Entity entity : EntityArgument.getEntities(context, "targets")){ @@ -116,7 +115,7 @@ public class MotionCommand { ) ) ); - if(shouldUsePrefix){ + if(SHOULD_USE_PREFIX){ literalArgumentBuilder.then(Motion); dispatcher.register(literalArgumentBuilder); } else { diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/TickCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/TickCommand.java index cb0bb07..7bbe7ac 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/TickCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/TickCommand.java @@ -4,7 +4,6 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.r3944realms.leashedplayer.config.LeashPlayerCommonConfig; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; @@ -19,15 +18,15 @@ import java.util.Arrays; import java.util.List; import static com.r3944realms.leashedplayer.content.commands.Command.getLiterArgumentBuilderOfCSS; +import static com.r3944realms.leashedplayer.content.commands.Command.SHOULD_USE_PREFIX; public class TickCommand { private static final String DEFAULT_TICKRATE = String.valueOf(20); public static void register(CommandDispatcher dispatcher) { - boolean shouldUsePrefix = LeashPlayerCommonConfig.EnableLeashPlayerCommandPrefix.get(); - @Nullable List> nodeList = shouldUsePrefix ? null : new ArrayList<>(); + @Nullable List> nodeList = SHOULD_USE_PREFIX ? null : new ArrayList<>(); LiteralArgumentBuilder literalArgumentBuilder = Commands.literal(com.r3944realms.leashedplayer.content.commands.Command.PREFIX); - LiteralArgumentBuilder $$TickRoot = getLiterArgumentBuilderOfCSS("tick", !shouldUsePrefix, nodeList); + LiteralArgumentBuilder $$TickRoot = getLiterArgumentBuilderOfCSS("tick", !SHOULD_USE_PREFIX, nodeList); LiteralArgumentBuilder Tick = $$TickRoot.requires(p_308941_ -> p_308941_.hasPermission(2)) .then(Commands.literal("query").executes(p_308950_ -> tickQuery(p_308950_.getSource()))) @@ -60,7 +59,7 @@ public class TickCommand { ) .then(Commands.literal("unfreeze").executes(p_309184_ -> setFreeze(p_309184_.getSource(), false))) .then(Commands.literal("freeze").executes(p_309070_ -> setFreeze(p_309070_.getSource(), true))); - if(shouldUsePrefix){ + if(SHOULD_USE_PREFIX){ literalArgumentBuilder.then(Tick); dispatcher.register(literalArgumentBuilder); } else { diff --git a/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CanCommonPlayerChangeSelfTalkArea.java b/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CanCommonPlayerChangeSelfTalkArea.java new file mode 100644 index 0000000..c0ea33e --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/gamerules/Server/CanCommonPlayerChangeSelfTalkArea.java @@ -0,0 +1,25 @@ +package com.r3944realms.leashedplayer.content.gamerules.Server; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.content.gamerules.Gamerules; +import com.r3944realms.leashedplayer.utils.Util; +import net.minecraft.world.level.GameRules; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; + +import static com.r3944realms.leashedplayer.content.gamerules.Gamerules.GAMERULE_REGISTRY; + +@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, bus = EventBusSubscriber.Bus.MOD) +public class CanCommonPlayerChangeSelfTalkArea { + public static final boolean DEFAULT_VALUE = true; + public static final String ID = Util.getGameruleName(CanCommonPlayerChangeSelfTalkArea.class); + public static final String DESCRIPTION_KEY = Gamerules.getDescriptionKey(CanCommonPlayerChangeSelfTalkArea.class); + public static final String NAME_KEY = Gamerules.getNameKey(CanCommonPlayerChangeSelfTalkArea.class); + public static final GameRules.Category CATEGORY = GameRules.Category.PLAYER; + + @SubscribeEvent + public static void onCommonSetup(final FMLCommonSetupEvent event) { + GAMERULE_REGISTRY.registerGamerule(ID, CATEGORY, DEFAULT_VALUE); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java index 83cf825..9f97eae 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java @@ -1,6 +1,7 @@ package com.r3944realms.leashedplayer.datagen.LanguageAndOtherData; import com.r3944realms.leashedplayer.ClientEventHandler; +import com.r3944realms.leashedplayer.content.ModKeyMapping; import com.r3944realms.leashedplayer.content.commands.ChatCommand; import com.r3944realms.leashedplayer.content.commands.LeashCommand; import com.r3944realms.leashedplayer.content.commands.MotionCommand; @@ -29,6 +30,8 @@ import static com.r3944realms.leashedplayer.content.items.ModCreativeTab.LEASHED public enum ModLangKeyValue { ADDICTION(ClientEventHandler.ADDICTION, ModPartEnum.NAME, "You've triggered the anti-addiction mechanic, and you'll come back when you rest!", "你触发了防沉迷机制,休息会再来吧!", "你觸發了防沉迷機制,休息會再來吧!", false), + KEY_CATEGORY(ModKeyMapping.CATEGORY, ModPartEnum.NAME, "Leashed Player", "可拴玩家", "可拴玩家", false), + KEY_APPLY_TALKAREA(ModKeyMapping.APPLY_TALKAREA_PREFERENCE_KEY, ModPartEnum.NAME, "Apply TalkArea Preference", "应用可见区域预设", "應用設置可見區域預設", false), //ITEM ITEM_LEASH_ROPE_ARROW(ModItemRegister.LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Leash Rope Arrow", "拴绳箭", "拴繩箭", true), ITEM_SPECTRAL_LEASH_ROPE_ARROW(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", true), @@ -87,13 +90,15 @@ public enum ModLangKeyValue { MESSAGE_CHAT_TALKAREA_UNLIMITED(ChatCommand.TALK_AREA_UNLIMITED, ModPartEnum.COMMAND, "%s 's §atalk area unlimited!§r", "%s§a聊天区域半径无限制§r", "%s§a聊天區域半徑無限制§r","%s§a语矢无限§r" ,false), MESSAGE_CHAT_TALKAREA_PREFERENCE_NOT_SET(ChatCommand.TALK_AREA_PREFERENCE_NOT_SET, ModPartEnum.COMMAND, "%s 's talk area preference is not set!", "%s未设置默认可见消息聊天区域半径", "%s未設置可見訊息聊天半徑", "%s未置默视之",false), MESSAGE_CHAT_TALKAREA_CURRENT_CONFIG(ChatCommand.TALK_AREA_CURRENT_CONFIG, ModPartEnum.COMMAND, "%s 's §6TalkArea Current§7:§e %d §6blocks §f(§aPrefence§7:§e %d §ablocks§f)§r", "%s§6目前聊天区域可见半径设置§7:§e %d §6格 §f(§a默认值§7:§e %d §a格§f)§r", "%s§6目前可見訊息聊天半徑設置§7:§e%d §6格 §f(§a默認值§7:§e%d §a格§f)§r", "%s§6今聊城可知半径置§e %d§6格§f(§a默§7:§e%d格§f)§r",false), + MESSAGE_CHAT_TALKAREA_NO_RIGHT(ChatCommand.NO_RIGHT, ModPartEnum.COMMAND, "You haven't the right to do that!", "你无权这样做!", "你無權這麽做!", false), //GAME_RULE_NAME DEFAULT_AREA_TALK_NAME(DefaultTalkArea.NAME_KEY, ModPartEnum.NAME, "Default Area Talk", "默认聊天区域可见半径", "默認聊天區域可見半徑",false), - TELEPORT_WITH_LEASHED_PLAYERS(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport leashed player with player holder", "被拴玩家随玩家持有者传送", "被拴玩家随玩家持有者傳送" ,false), - CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT(CreateLeashFenceKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, "Create Leash Fence Knot Entity if absent", "如果缺失则创建拴绳结", "如果缺失則創建拴繩結", false), - KEEP_LEASH_NOT_DROP_TIME(KeepLeashNotDropTime.NAME_KEY, ModPartEnum.NAME, "Keep leash alive Time", "保持拴绳不掉落的时间", "保持其不掉落的時間", false), + TELEPORT_WITH_LEASHED_PLAYERS_NAME(TeleportWithLeashedPlayers.NAME_KEY, ModPartEnum.NAME, "Teleport leashed player with player holder", "被拴玩家随玩家持有者传送", "被拴玩家随玩家持有者傳送" ,false), + CREATE_LEASH_FENCE_KNOT_ENTITY_IF_ABSENT_NAME(CreateLeashFenceKnotEntityIfAbsent.NAME_KEY, ModPartEnum.NAME, "Create Leash Fence Knot Entity if absent", "如果缺失则创建拴绳结", "如果缺失則創建拴繩結", false), + KEEP_LEASH_NOT_DROP_TIME_NAME(KeepLeashNotDropTime.NAME_KEY, ModPartEnum.NAME, "Keep leash alive Time", "保持拴绳不掉落的时间", "保持其不掉落的時間", false), OTOPNMWSINN_MAME(OpenTOPNeededModeWhenScreenIsNotNull.NAME_KEY, ModPartEnum.NAME, "Open TOP NEEDED Mode When Screen isn't null", "当屏幕不为空时自动打开探测器的Needed模式", "避免糠測器糠屏幕", false), + CAN_COMMON_PLAYER_CHANGER_SELF_TALKAREA_NAME(CanCommonPlayerChangeSelfTalkArea.NAME_KEY, ModPartEnum.NAME, "Should Non-OP Player can change their TalkArea", "非OP应该可以修改自己的聊天可见半径吗?", "非OP應該可以修改自己的聊天可見半徑嗎?", false), // DISABLE_MOVE_CHECK(DisablePlayerMoveCheck.NAME_KEY, ModPartEnum.NAME, "Disable Player Move Check", "禁止检查玩家移动", "禁止檢查玩家移動", false), //GAME_RULE_DESCRIPTION @@ -103,6 +108,8 @@ public enum ModLangKeyValue { // DISABLE_MOVE_CHECK_DESCRIPTION(DisablePlayerMoveCheck.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Disable the player's movement Check And Correct it.", "禁止检查玩家移动并且纠正它","禁止檢查玩家移動並糾正他它", false), OTOPNMWSINN_DESCRIPTION(OpenTOPNeededModeWhenScreenIsNotNull.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "The One Probe will automatic to be in the Needed Mode when Gui Screen is not NULL", "当屏幕不为空时自动打开探测器的Needed模式", "避免糠測器糠屏幕", false), DEFAULT_AREA_TALK_DESCRIPTION(DefaultTalkArea.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "When the global setting is non-negative, it limits the chat range for all players. If a player's configured chat range is smaller than this value, this rule applies. Otherwise, the player's custom value is used.", "全局区域设置为非负数时,则限制全体玩家的聊天区域。若玩家设置的聊天区域小于该值则采用该规则,反之则采用玩家自定义值", "儅全局區域為非負時,則限制全服玩家聊天區域。若玩家自定義值小於該規則則采用,反之則用玩家自定義值","阖局初置非负数,则限一顾之日下,若立聊城小在直则用其常,若用玩义直上跻之地", false), + CAN_COMMON_PLAYER_CHANGER_SELF_TALKAREA_DESCRIPTION(CanCommonPlayerChangeSelfTalkArea.DESCRIPTION_KEY, ModPartEnum.DESCRIPTION, "Above on its Name", "同名", "同名", false), + //ADV_NAME LEASH_START(ModAdvancementKey.LEASH_START.getNameKey(), ModPartEnum.NAME, "The Power of Traction", "牵引之力", "牽引之力", false), LEASH_LR_ARROW(ModAdvancementKey.LEASH_ARROW.getNameKey(), ModPartEnum.NAME, "Arrow with a Tether?" , "拴绳之箭?", "拴繩之箭?", false),