diff --git a/.gitignore b/.gitignore index ed0537e..78cf3e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /.gradle/ /build/ /.vscode/ +/.idea/ /bin/ /run/ /run-data/ diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 359bb53..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b589d56..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/git_toolbox_blame.xml b/.idea/git_toolbox_blame.xml deleted file mode 100644 index 7dc1249..0000000 --- a/.idea/git_toolbox_blame.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 1fd1b27..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index da4688f..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index fe0b0da..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 93dbdd9..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/QuickCopy.main.iml b/.idea/modules/QuickCopy.main.iml deleted file mode 100644 index b745635..0000000 --- a/.idea/modules/QuickCopy.main.iml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - FORGE - MIXIN - MCP - - 1 - - - - - - \ No newline at end of file diff --git a/.idea/modules/QuickCopy.test.iml b/.idea/modules/QuickCopy.test.iml deleted file mode 100644 index b745635..0000000 --- a/.idea/modules/QuickCopy.test.iml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - FORGE - MIXIN - MCP - - 1 - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/runClient.xml b/.idea/runConfigurations/runClient.xml deleted file mode 100644 index 9cb5c53..0000000 --- a/.idea/runConfigurations/runClient.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/.idea/runConfigurations/runData.xml b/.idea/runConfigurations/runData.xml deleted file mode 100644 index 31ddcac..0000000 --- a/.idea/runConfigurations/runData.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/.idea/runConfigurations/runGameTestServer.xml b/.idea/runConfigurations/runGameTestServer.xml deleted file mode 100644 index 01a891e..0000000 --- a/.idea/runConfigurations/runGameTestServer.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/.idea/runConfigurations/runServer.xml b/.idea/runConfigurations/runServer.xml deleted file mode 100644 index 17b2891..0000000 --- a/.idea/runConfigurations/runServer.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index f464919..7dc456b 100644 --- a/build.gradle +++ b/build.gradle @@ -86,6 +86,14 @@ minecraft { client { // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. property 'forge.enabledGameTestNamespaces', mod_id + + /* + 修复类似问题 + [mixin/]: Mixing XxxMixin from jade.mixins.json into Xxx + [mixin/]: jade.mixins.json:XxxMixin: Class version 61 required is higher than the class version supported by the current version of Mixin (JAVA_16 supports class version 60) + */ + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" } server { @@ -117,10 +125,15 @@ repositories { maven { // CurseForge url "https://www.cursemaven.com" } + maven { + url = "https://api.modrinth.com/maven" + } } dependencies { - implementation fg.deobf("curse.maven:jade-324717:6271651") + // jade_version example: 11.13.1+forge + // Visit https://modrinth.com/mod/jade/versions?l=forge to get the latest version + implementation fg.deobf("maven.modrinth:jade:${project.jade_version}") implementation fg.deobf("curse.maven:slashblade-resharped-1022428:6298272") // Specify the version of Minecraft to use. diff --git a/gradle.properties b/gradle.properties index af40848..dde0ff9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,6 @@ org.gradle.daemon=false minecraft_version=1.20.1 minecraft_version_range = [1.16.5,) - ] # The Minecraft version must agree with the Forge version to get a valid artifact # The Minecraft version range can use any release version of Minecraft as bounds. # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly @@ -51,3 +50,6 @@ mod_group_id=net.exmo mod_authors=canyuesama # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description=this is a simple tool to help you copy item id + +# Jade version +jade_version=11.13.2+forge diff --git a/src/main/java/net/exmo/quickcopy/Config.java b/src/main/java/net/exmo/quickcopy/Config.java new file mode 100644 index 0000000..eb474e5 --- /dev/null +++ b/src/main/java/net/exmo/quickcopy/Config.java @@ -0,0 +1,21 @@ +package net.exmo.quickcopy; + + +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; + +public class Config { + public static ConfigValue isEnable; + public static ConfigValue showTip; + public static ConfigValue withTag; + public static final ForgeConfigSpec SPEC; + Config(ForgeConfigSpec.Builder builder) { + isEnable = builder.comment("是否开启").define("isEnable", true); + showTip = builder.comment("是否显示提示").define("ShowTooltip", true); + withTag = builder.comment("复制时是否包含NBT标签").define("withTag", false); + } + + static { + SPEC = new ForgeConfigSpec.Builder().configure(Config::new).getRight(); + } +} diff --git a/src/main/java/net/exmo/quickcopy/JadeBlockProvider.java b/src/main/java/net/exmo/quickcopy/JadeBlockProvider.java new file mode 100644 index 0000000..868eb08 --- /dev/null +++ b/src/main/java/net/exmo/quickcopy/JadeBlockProvider.java @@ -0,0 +1,32 @@ +package net.exmo.quickcopy; + +import net.exmo.quickcopy.Quickcopy.KeyBindings; +import net.exmo.quickcopy.Quickcopy.TooltipTracker; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; +import snownee.jade.api.*; +import snownee.jade.api.config.IPluginConfig; + +public enum JadeBlockProvider implements IBlockComponentProvider { + INSTANCE; + + @Override + public ResourceLocation getUid() { + return JadeSupport.blockProviderId; + } + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + if (!Config.isEnable.get()) { + return; + } + if (!KeyBindings.COPY_INFO.isDown()) + return; + + ResourceLocation key = ForgeRegistries.BLOCKS.getKey(blockAccessor.getBlock()); + String string = key.toString(); + TooltipTracker.copyToClipboard(string); + + } +} diff --git a/src/main/java/net/exmo/quickcopy/JadeEntityProvider.java b/src/main/java/net/exmo/quickcopy/JadeEntityProvider.java new file mode 100644 index 0000000..3760026 --- /dev/null +++ b/src/main/java/net/exmo/quickcopy/JadeEntityProvider.java @@ -0,0 +1,32 @@ +package net.exmo.quickcopy; + +import net.exmo.quickcopy.Quickcopy.KeyBindings; +import net.exmo.quickcopy.Quickcopy.TooltipTracker; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; +import snownee.jade.api.EntityAccessor; +import snownee.jade.api.IEntityComponentProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public enum JadeEntityProvider implements IEntityComponentProvider { + INSTANCE; + + @Override + public ResourceLocation getUid() { + return JadeSupport.entityProviderId; + } + + @Override + public void appendTooltip(ITooltip iTooltip, EntityAccessor entityAccessor, IPluginConfig iPluginConfig) { + if (!Config.isEnable.get()) { + return; + } + if (!KeyBindings.COPY_INFO.isDown()) + return; + + ResourceLocation key = ForgeRegistries.ENTITY_TYPES.getKey(entityAccessor.getEntity().getType()); + String string = key.toString(); + TooltipTracker.copyToClipboard(string); + } +} diff --git a/src/main/java/net/exmo/quickcopy/JadeSupport.java b/src/main/java/net/exmo/quickcopy/JadeSupport.java index 9c52aa9..77056bc 100644 --- a/src/main/java/net/exmo/quickcopy/JadeSupport.java +++ b/src/main/java/net/exmo/quickcopy/JadeSupport.java @@ -4,7 +4,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.block.Block; import snownee.jade.api.IWailaClientRegistration; -import snownee.jade.api.IWailaCommonRegistration; import snownee.jade.api.IWailaPlugin; import snownee.jade.api.WailaPlugin; @@ -12,17 +11,12 @@ @WailaPlugin public class JadeSupport implements IWailaPlugin { - public static final ResourceLocation element_id = new ResourceLocation(MODID, "test"); - public static final ResourceLocation element_id2 = new ResourceLocation(MODID, "test_2"); - @Override - public void register(IWailaCommonRegistration registration) { - //TODO register data providers - } - + public static final ResourceLocation entityProviderId = new ResourceLocation(MODID, "entity"); + public static final ResourceLocation blockProviderId = new ResourceLocation(MODID, "block"); @Override public void registerClient(IWailaClientRegistration registration) { - registration.registerEntityComponent(TestJadeProvider.INSTANCE, LivingEntity.class); - registration.registerBlockComponent(TestJadeProviderBlock.INSTANCE, Block.class); + registration.registerEntityComponent(JadeEntityProvider.INSTANCE, LivingEntity.class); + registration.registerBlockComponent(JadeBlockProvider.INSTANCE, Block.class); } } diff --git a/src/main/java/net/exmo/quickcopy/Quickcopy.java b/src/main/java/net/exmo/quickcopy/Quickcopy.java index c3654db..6626b5b 100644 --- a/src/main/java/net/exmo/quickcopy/Quickcopy.java +++ b/src/main/java/net/exmo/quickcopy/Quickcopy.java @@ -4,115 +4,130 @@ import mods.flammpfeil.slashblade.item.ItemSlashBlade; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.event.RenderTooltipEvent; +import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.registries.ForgeRegistries; import org.lwjgl.glfw.GLFW; -import java.util.logging.Logger; + +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.logging.LogUtils; + +import io.netty.util.internal.StringUtil; + +import org.slf4j.Logger; + +import java.util.Optional; @OnlyIn(Dist.CLIENT) @Mod(Quickcopy.MODID) public class Quickcopy { public static final String MODID = "quickcopy"; - - static Logger LOGGER = Logger.getLogger(MODID); + private static final Logger LOGGER = LogUtils.getLogger(); public Quickcopy() { - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - - modEventBus.addListener(this::commonSetup); - MinecraftForge.EVENT_BUS.register(this); - + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, Config.SPEC); } - private void commonSetup(final FMLCommonSetupEvent event) { + @Mod.EventBusSubscriber(modid = MODID, bus = Bus.MOD, value = Dist.CLIENT) + public static class KeyBindings { + @SubscribeEvent + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + event.register(COPY_INFO); + } + + public static final KeyMapping COPY_INFO = new KeyMapping("key.quickcopy.copy", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT_ALT, + "key.categories.quickcopy"); } - static boolean isKeyDown = false; - - @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) - public static class ClientInit { - - public static final KeyMapping COPY_ITEM_ID = new KeyMapping("key.quickcopy.copy", GLFW.GLFW_KEY_0, - "key.categories.misc") { - private boolean isDownOld = false; - - @Override - public void setDown(boolean isDown) { - super.setDown(isDown); - if (isDownOld != isDown && isDown) { - if (isKeyDown) { - Minecraft.getInstance().getChatListener() - .handleSystemMessage(Component.translatable("message.quickcopy.2"), false); - isKeyDown = false; - } else { - Minecraft.getInstance().getChatListener() - .handleSystemMessage(Component.translatable("message.quickcopy.1"), false); - isKeyDown = true; - } - } + @Mod.EventBusSubscriber(modid = MODID, bus = Bus.FORGE, value = Dist.CLIENT) + public static class TooltipTracker { + public static ItemStack hoveredStack = ItemStack.EMPTY; + @SubscribeEvent + public static void onTooltipGather(RenderTooltipEvent.GatherComponents event) { + hoveredStack = event.getItemStack(); + } + + @SubscribeEvent + public static void renderTooltip(ItemTooltipEvent event) { + if (!Config.isEnable.get()) { + return; + } + var keyName = KeyBindings.COPY_INFO.getTranslatedKeyMessage().getString(); + var tooltip = Component.translatable("tootip.quickcopy.tooltip", keyName); + if (Config.showTip.get()) { + event.getToolTip().add(tooltip); } - }; + } @SubscribeEvent - public static void registerKeyMappings(RegisterKeyMappingsEvent event) { - event.register(COPY_ITEM_ID); + public static void onClientTick(ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) + return; + if (Minecraft.getInstance().screen == null) { + hoveredStack = ItemStack.EMPTY; + } } - } - - @Mod.EventBusSubscriber(Dist.CLIENT) - public static class ClientModEvents { + // 处理在GUI的按键事件,用于复制物品ID @SubscribeEvent - public static void renderTooltip(ItemTooltipEvent event) { - if (isKeyDown) { - event.getToolTip().add(Component.translatable("tootip.quickcopy.item")); - - if (Screen.hasAltDown()) { - LOGGER.info("Copy item id"); - boolean flag = false; - String anObject = ""; - if (ModList.get().isLoaded(SlashBlade.MODID)) { - if (event.getItemStack().getItem() instanceof ItemSlashBlade) { - flag = true; - anObject = event.getItemStack().getTag().getCompound("bladeState") - .getString("translationKey"); - } - } - - if (!flag) { - ResourceLocation key = ForgeRegistries.ITEMS.getKey(event.getItemStack().getItem()); - anObject = String.valueOf(key); - } - if (!Minecraft.getInstance().keyboardHandler.getClipboard().equals(anObject)) { - - Minecraft.getInstance().getChatListener().handleSystemMessage( - Component.translatable("message.quickcopy.3").append(Component.literal(anObject)), - false); - - Minecraft.getInstance().keyboardHandler.setClipboard(anObject); - - } - - } + public static void onGuiKeyPress(ScreenEvent.KeyPressed.Pre event) { + var key = InputConstants.getKey(event.getKeyCode(), event.getScanCode()); + if (key != null && KeyBindings.COPY_INFO.isActiveAndMatches(key)) { + executeCopy(hoveredStack); } } + + public static void executeCopy(ItemStack itemStack) { + if (itemStack.isEmpty()) { + return; + } + var item = itemStack.getItem(); + + if (ModList.get().isLoaded(SlashBlade.MODID) && item instanceof ItemSlashBlade) { + var info = Optional.ofNullable(itemStack.getTag()) + .map(tag -> tag.getCompound("bladeState")) + .map(compound -> compound.getString("translationKey")).orElse(""); + copyToClipboard(info); + return; + } + + var key = ForgeRegistries.ITEMS.getKey(item).toString(); + if (itemStack.hasTag() && Config.withTag.get()) { + key += itemStack.getTag(); + } + copyToClipboard(key); + } + + public static void copyToClipboard(String str) { + if (StringUtil.isNullOrEmpty(str) || Minecraft.getInstance().keyboardHandler.getClipboard().equals(str)) + return; + Component message = Optional + .ofNullable(Component.translatable("message.quickcopy.completed").append(Component.literal(str))) + .orElse(Component.literal("获取到空的内容")); + Minecraft.getInstance().getChatListener().handleSystemMessage(message, false); + Minecraft.getInstance().keyboardHandler.setClipboard(str); + } } } diff --git a/src/main/java/net/exmo/quickcopy/TestJadeProvider.java b/src/main/java/net/exmo/quickcopy/TestJadeProvider.java deleted file mode 100644 index 46e53fa..0000000 --- a/src/main/java/net/exmo/quickcopy/TestJadeProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.exmo.quickcopy; - - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.registries.ForgeRegistries; -import snownee.jade.api.EntityAccessor; -import snownee.jade.api.IEntityComponentProvider; -import snownee.jade.api.ITooltip; -import snownee.jade.api.config.IPluginConfig; - -import static net.exmo.quickcopy.Quickcopy.isKeyDown; - -public enum TestJadeProvider implements IEntityComponentProvider { - INSTANCE; - - - @Override - public void appendTooltip(ITooltip iTooltip, EntityAccessor entityAccessor, IPluginConfig iPluginConfig) { - if (Screen.hasAltDown()) { - if (isKeyDown) { - - ResourceLocation key = ForgeRegistries.ENTITY_TYPES.getKey(entityAccessor.getEntity().getType()); - String string = key.toString(); - if (!Minecraft.getInstance().keyboardHandler.getClipboard().equals(string)) { - - Minecraft.getInstance().getChatListener().handleSystemMessage(Component.translatable("message.quickcopy.3").append(Component.literal(string)), false); - - Minecraft.getInstance().keyboardHandler.setClipboard(string); - - } - } - } - - } - @Override - public ResourceLocation getUid() { - return JadeSupport.element_id; - } -} diff --git a/src/main/java/net/exmo/quickcopy/TestJadeProviderBlock.java b/src/main/java/net/exmo/quickcopy/TestJadeProviderBlock.java deleted file mode 100644 index a1c4629..0000000 --- a/src/main/java/net/exmo/quickcopy/TestJadeProviderBlock.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.exmo.quickcopy; - - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.registries.ForgeRegistries; -import snownee.jade.api.*; -import snownee.jade.api.config.IPluginConfig; - -import static net.exmo.quickcopy.Quickcopy.isKeyDown; - -public enum TestJadeProviderBlock implements IBlockComponentProvider { - INSTANCE; - - - - @Override - public ResourceLocation getUid() { - return JadeSupport.element_id2; - } - - @Override - public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - if (Screen.hasAltDown()) { - if (isKeyDown) { - - ResourceLocation key = ForgeRegistries.BLOCKS.getKey(blockAccessor.getBlock()); - String string = key.toString(); - if (!Minecraft.getInstance().keyboardHandler.getClipboard().equals(string)) { - - Minecraft.getInstance().getChatListener().handleSystemMessage(Component.translatable("message.quickcopy.3").append(Component.literal(string)), false); - - Minecraft.getInstance().keyboardHandler.setClipboard(string); - - } - } - } - } -} diff --git a/src/main/resources/assets/quickcopy/lang/en_us.json b/src/main/resources/assets/quickcopy/lang/en_us.json index 1afa4e8..872f775 100644 --- a/src/main/resources/assets/quickcopy/lang/en_us.json +++ b/src/main/resources/assets/quickcopy/lang/en_us.json @@ -1,7 +1,8 @@ { "key.quickcopy.copy": "open or close item id copy function", - "tootip.quickcopy.item": "§7Press \"Alt\" to copy item ID", - "message.quickcopy.1": "§7[QuickCopy] Copy item ID function to activate", - "message.quickcopy.2": "§7[QuickCopy] Copy item ID function to disable", - "message.quickcopy.3": "§7[QuickCopy] Replicated:" + "key.categories.quickcopy": "QuickCopy", + "tootip.quickcopy.tooltip": "§7Press [{0}] to copy item ID", + "message.quickcopy.completed": "§7[QuickCopy] :", + "config.jade.plugin_quickcopy.block": "Copy Block ID", + "config.jade.plugin_quickcopy.entity": "Copy Entity ID" } \ No newline at end of file diff --git a/src/main/resources/assets/quickcopy/lang/zh_cn.json b/src/main/resources/assets/quickcopy/lang/zh_cn.json index 0f9c00c..3279c8e 100644 --- a/src/main/resources/assets/quickcopy/lang/zh_cn.json +++ b/src/main/resources/assets/quickcopy/lang/zh_cn.json @@ -1,7 +1,8 @@ { - "key.quickcopy.copy": "打开或关闭复制物品ID功能", - "tootip.quickcopy.item": "§7按下[Alt]来复制物品ID", - "message.quickcopy.1": "§7[快捷复制] 复制物品ID功能已启动", - "message.quickcopy.2": "§7[快捷复制] 复制物品ID功能已关闭", - "message.quickcopy.3": "§7[快捷复制] 已复制:" + "key.quickcopy.copy": "复制物品ID", + "key.categories.quickcopy": "快捷复制", + "tootip.quickcopy.tooltip": "§7按下 [{0}] 来复制物品ID", + "message.quickcopy.completed": "§7[快捷复制] :", + "config.jade.plugin_quickcopy.block": "复制方块ID", + "config.jade.plugin_quickcopy.entity": "复制实体ID" } \ No newline at end of file