From 5b4f0ec6f90ad93dc4e086841288de6367685581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=98=BF=E9=B9=B0?= Date: Thu, 6 Nov 2025 11:48:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(menu):=20=E6=B7=BB=E5=8A=A0=E7=89=A9?= =?UTF-8?q?=E5=93=81=E4=B8=8D=E5=8F=AF=E7=A0=B4=E5=9D=8F=E4=B8=8E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=80=BC=E9=85=8D=E7=BD=AE=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Meta 类中新增 unbreakable 和 data 字段及其动态解析逻辑 - 支持通过配置文件设置物品的 unbreakable 属性 - 支持通过配置文件设置物品的数据值(damage) - 更新 MenuSerializer 以支持新属性的继承与解析 - 修复 Item 构建时名称可能为空的问题 - 为 EvalResult 添加 asInt 方法以支持整数类型转换 --- .../kotlin/trplugins/menu/util/EvalResult.kt | 6 ++++++ .../trplugins/menu/util/conf/Property.kt | 10 ++++++++++ .../menu/module/conf/MenuSerializer.kt | 8 +++++++- .../menu/module/display/item/Item.kt | 4 +++- .../menu/module/display/item/Meta.kt | 20 ++++++++++++++++++- 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/common/src/main/kotlin/trplugins/menu/util/EvalResult.kt b/common/src/main/kotlin/trplugins/menu/util/EvalResult.kt index fb44cad3..366a3c12 100644 --- a/common/src/main/kotlin/trplugins/menu/util/EvalResult.kt +++ b/common/src/main/kotlin/trplugins/menu/util/EvalResult.kt @@ -1,5 +1,7 @@ package trplugins.menu.util +import taboolib.common5.cint + /** * @author Arasple * @date 2021/1/31 11:53 @@ -19,6 +21,10 @@ value class EvalResult(val any: Any? = null) { return any.toString() } + fun asInt(def: Int = 0): Int { + return any?.cint ?: def + } + companion object { val TRUE = EvalResult(true) diff --git a/common/src/main/kotlin/trplugins/menu/util/conf/Property.kt b/common/src/main/kotlin/trplugins/menu/util/conf/Property.kt index d040e63f..a8d453db 100644 --- a/common/src/main/kotlin/trplugins/menu/util/conf/Property.kt +++ b/common/src/main/kotlin/trplugins/menu/util/conf/Property.kt @@ -208,6 +208,11 @@ enum class Property(val default: String, val regex: Regex) { */ ICON_DISPLAY_LORE("lore", "(display)?-?lores?"), + /** + * 菜单图标显示 - 物品损伤值 + */ + ICON_DISPLAY_DATA("data", "(display)?-?data"), + /** * 菜单图标显示 - 物品数量 */ @@ -243,6 +248,11 @@ enum class Property(val default: String, val regex: Regex) { */ ICON_DISPLAY_HIDE_TOOLTIP("hide_tooltip", "hide_?tool(tip)?"), + /** + * 菜单图标 - Unbreakable + */ + ICON_DISPLAY_UNBREAKABLE("unbreakable", "unbreak(able)?"), + /** * 菜单图标 - 子图标 */ diff --git a/plugin/src/main/kotlin/trplugins/menu/module/conf/MenuSerializer.kt b/plugin/src/main/kotlin/trplugins/menu/module/conf/MenuSerializer.kt index 12628190..a70e592d 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/conf/MenuSerializer.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/conf/MenuSerializer.kt @@ -360,6 +360,12 @@ object MenuSerializer : ISerializer { val hideTooltip = if (inherit.contains(Property.ICON_DISPLAY_HIDE_TOOLTIP)) { def!!.display.meta.hideTooltip } else Property.ICON_DISPLAY_HIDE_TOOLTIP.ofString(display, "false") + val unbreakable = if (inherit.contains(Property.ICON_DISPLAY_UNBREAKABLE)) { + def!!.display.meta.unbreakable + } else Property.ICON_DISPLAY_UNBREAKABLE.ofString(display, "false") + val data = if (inherit.contains(Property.ICON_DISPLAY_DATA)) { + def!!.display.meta.data + } else Property.ICON_DISPLAY_DATA.ofString(display, "") // only for the subIcon val priority = Property.PRIORITY.ofInt(it, order) @@ -396,7 +402,7 @@ object MenuSerializer : ISerializer { if (def != null && inherit.contains(Property.ICON_DISPLAY_LORE) && lore.isEmpty()) def.display.lore else CycleList(lore.map { Lore(line(it)) }), // 图标附加属性 - Meta(amount, shiny, flags, nbt, tooltipStyle, itemModel, hideTooltip) + Meta(amount, shiny, flags, nbt, tooltipStyle, itemModel, hideTooltip, unbreakable, data) ) // i18n diff --git a/plugin/src/main/kotlin/trplugins/menu/module/display/item/Item.kt b/plugin/src/main/kotlin/trplugins/menu/module/display/item/Item.kt index 89c2b484..ba5ee35a 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/display/item/Item.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/display/item/Item.kt @@ -90,6 +90,8 @@ open class Item( meta.tooltipStyle(session, this) meta.itemModel(session, this) meta.hideTooltip(session, this) + meta.unbreakable(session, this) + meta.data(session, this) if (meta.hasAmount()) this.amount = meta.amount(session) } @@ -132,7 +134,7 @@ open class Item( else { val current = cache[session.id] try { - val new = buildItem(current!!) { name = parsedName(session) } + val new = buildItem(current!!) { parsedName(session)?.let { name = it } } cache[session.id] = new } catch (t: Throwable) { t.stackTrace diff --git a/plugin/src/main/kotlin/trplugins/menu/module/display/item/Meta.kt b/plugin/src/main/kotlin/trplugins/menu/module/display/item/Meta.kt index 4f7df888..ed39321a 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/display/item/Meta.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/display/item/Meta.kt @@ -24,12 +24,16 @@ class Meta( val tooltip: String?, val itemModel: String?, val hideTooltip: String, + val unbreakable: String, + val data: String, ) { private val isAmountDynamic = amount.toIntOrNull() == null private val isShinyDynamic = !shiny.matches(Regexs.BOOLEAN) private val isHideTooltipDynamic = !hideTooltip.matches(Regexs.BOOLEAN) private val isNBTDynamic = nbt != null && Regexs.containsPlaceholder(nbt.toJsonSimplified()) + private val isUnbreakableDynamic = !unbreakable.matches(Regexs.BOOLEAN) + private val isDataDynamic = data.toIntOrNull() == null val isDynamic = isAmountDynamic || isNBTDynamic || isShinyDynamic || isHideTooltipDynamic fun amount(session: MenuSession): Int { @@ -82,9 +86,23 @@ class Meta( } fun hideTooltip(session: MenuSession, builder: ItemBuilder) { - if ((hideTooltip.toBoolean()) || (isHideTooltipDynamic && session.placeholderPlayer.evalScript(hideTooltip).asBoolean())) { + if (hideTooltip.toBoolean() || (isHideTooltipDynamic && session.placeholderPlayer.evalScript(hideTooltip).asBoolean())) { builder.isHideTooltip = true } } + fun unbreakable(session: MenuSession, builder: ItemBuilder) { + if (unbreakable.toBoolean() || (isUnbreakableDynamic && session.placeholderPlayer.evalScript(unbreakable).asBoolean())) { + builder.isUnbreakable = true + } + } + + fun data(session: MenuSession, builder: ItemBuilder) { + if (data.isEmpty()) { + return + } + val evalData = session.parse(amount).toIntOrNull() ?: session.placeholderPlayer.evalScript(data).asInt(0) + builder.damage = evalData + } + } \ No newline at end of file From 1958bd6b1c34b48efe9c18fbee943b7e48dcb142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=98=BF=E9=B9=B0?= Date: Thu, 6 Nov 2025 16:23:48 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(debug):=20=E5=A2=9E=E5=BC=BA=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了将调试信息写入文件的功能 - 改进了Java版本详细信息的获取方式 - 更新了服务器软件信息的显示格式 - 优化了插件列表的展示内容 - 增加了多语言支持的文件创建提示 - 移除了过时的代码引用和不必要的依赖项 - 升级了TabooLib版本 - 兼容了BannerMeta设置图案的高版本支持 --- .github/ISSUE_TEMPLATE/zh_bug_request.yml | 1 - build.gradle.kts | 3 +- gradle.properties | 2 +- plugin/build.gradle.kts | 2 + .../internal/command/impl/CommandDebug.kt | 45 +++++++++++++------ .../trplugins/menu/util/bukkit/ItemHelper.kt | 4 +- plugin/src/main/resources/lang/en_US.yml | 3 +- plugin/src/main/resources/lang/ru_RU.yml | 3 +- plugin/src/main/resources/lang/uk_UA.yml | 1 + plugin/src/main/resources/lang/vi_VN.yml | 3 +- plugin/src/main/resources/lang/zh_CN.yml | 3 +- plugin/src/main/resources/lang/zh_HK.yml | 3 +- plugin/src/main/resources/lang/zh_TW.yml | 3 +- 13 files changed, 52 insertions(+), 24 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/zh_bug_request.yml b/.github/ISSUE_TEMPLATE/zh_bug_request.yml index 4f8ee16a..fadaf30a 100644 --- a/.github/ISSUE_TEMPLATE/zh_bug_request.yml +++ b/.github/ISSUE_TEMPLATE/zh_bug_request.yml @@ -43,7 +43,6 @@ body: | Server software: xxxx | Java version: xxxx - | TabooLib: x.x.x | TrMenu: x.x.x Installed Plugins: · XXXXXX - x.x.x diff --git a/build.gradle.kts b/build.gradle.kts index 9791d295..5a6b48be 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,10 +68,11 @@ subprojects { PtcObject ) repoTabooLib = "https://repo.aeoliancloud.com/repository/releases" +// repoTabooLib = project.repositories.mavenLocal().url.toString() disableOnSkippedVersion = false } version { - taboolib = "6.2.3-c573ce52" + taboolib = "6.2.3-d4a5f0ea" coroutines = null } } diff --git a/gradle.properties b/gradle.properties index e674454f..eb681cd0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group=me.arasple.mc.trmenu -version=3.8.9 \ No newline at end of file +version=3.9.7 \ No newline at end of file diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index a687fe87..4f882efd 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -67,6 +67,8 @@ dependencies { compileOnly("org.apache.commons:commons-lang3:3.17.0") // Server Core + compileOnly("ink.ptms.core:v12005:12005-minimize:mapped") + compileOnly("ink.ptms.core:v12005:12005-minimize:universal") compileOnly("ink.ptms.core:v12002:12002-minimize:mapped") compileOnly("ink.ptms.core:v12002:12002-minimize:universal") compileOnly("ink.ptms.core:v11904:11904-minimize:mapped") diff --git a/plugin/src/main/kotlin/trplugins/menu/module/internal/command/impl/CommandDebug.kt b/plugin/src/main/kotlin/trplugins/menu/module/internal/command/impl/CommandDebug.kt index 0de059cf..f09d357c 100644 --- a/plugin/src/main/kotlin/trplugins/menu/module/internal/command/impl/CommandDebug.kt +++ b/plugin/src/main/kotlin/trplugins/menu/module/internal/command/impl/CommandDebug.kt @@ -3,11 +3,13 @@ package trplugins.menu.module.internal.command.impl import org.bukkit.Bukkit import org.bukkit.command.CommandSender import org.bukkit.entity.Player +import taboolib.common.io.newFile import taboolib.common.platform.command.subCommand import taboolib.common.platform.function.adaptCommandSender +import taboolib.common.platform.function.getDataFolder import taboolib.common.platform.function.pluginVersion -import taboolib.common.platform.function.submit import taboolib.module.chat.HexColor +import taboolib.platform.util.sendLang import trplugins.menu.TrMenu import trplugins.menu.api.TrMenuAPI import trplugins.menu.module.display.Menu @@ -84,27 +86,44 @@ object CommandDebug : CommandExpression { val dump = buildString { append("TrMenu Dump Information (Date: ${Time.formatDate()})\n\n") append("| Server OS: ${properties["os.name"]} ${properties["os.arch"]} ${properties["os.version"]}\n") - append("| Server software: ${Bukkit.getServer().version} (${Bukkit.getServer().bukkitVersion})\n") - append("| Java version: ${System.getProperty("java.version")}\n\n") + append("| Server software: ${Bukkit.getName()} - ${Bukkit.getServer().version} (${Bukkit.getServer().bukkitVersion})\n") + append("| Java version: ${getJavaVendorDetailed()}\n\n") append("| TrMenu: ${pluginVersion}\n") // append(" ${description.getString("built-time")} by ${description.getString("built-by")})\n\n") append("Installed Plugins: \n") Bukkit.getPluginManager().plugins.sortedBy { it.name }.forEach { plugin -> - var file: File? = null - try { - Class.forName("org.bukkit.plugin.java.JavaPlugin").also { it -> - file = it.getMethod("getFile").also { it.isAccessible = true }.invoke(plugin) as File - } - } catch (t: Throwable) { - t.stackTrace - } - val size = (file?.length() ?: 0) / 1024 - append("· ${plugin.name} - ${plugin.description.version} ($size KB)\n") + append("· ${plugin.name} - ${plugin.description.version}\n") } } + val fileName = "dump-info-${System.currentTimeMillis()}.log" + val file = newFile(getDataFolder(), "debug/$fileName") + file.writeText(dump) + sender.sendLang("Dump-Info-Created", file.absolutePath) Paster.paste(adaptCommandSender(sender), dump) } + private fun getJavaVendorDetailed(): String { + val vendor = System.getProperty("java.vendor") ?: "Unknown" + val version = System.getProperty("java.version") ?: "?" + val runtimeName = System.getProperty("java.runtime.name") ?: "" + val runtimeVersion = System.getProperty("java.runtime.version") ?: "" + + return buildString { + append(vendor) + append(" (") + append(runtimeName) + if (runtimeVersion.isNotBlank()) { + append(" ") + append(runtimeVersion) + } else { + append(" v") + append(version) + } + append(")") + } + } + + /** * 服务器信息查看 */ diff --git a/plugin/src/main/kotlin/trplugins/menu/util/bukkit/ItemHelper.kt b/plugin/src/main/kotlin/trplugins/menu/util/bukkit/ItemHelper.kt index 93fed24a..b92e8cf9 100644 --- a/plugin/src/main/kotlin/trplugins/menu/util/bukkit/ItemHelper.kt +++ b/plugin/src/main/kotlin/trplugins/menu/util/bukkit/ItemHelper.kt @@ -50,9 +50,9 @@ object ItemHelper { if (type.size == 1) { builder.finishing = { try { - (it.itemMeta as? BannerMeta)?.baseColor = DyeColor.valueOf(type[0].uppercase()) + (it.itemMeta as? BannerMeta)?.addPattern(Pattern(DyeColor.valueOf(type[0].uppercase()), PatternType.BASE)) } catch (e: Exception) { - (it.itemMeta as? BannerMeta)?.baseColor = DyeColor.BLACK + (it.itemMeta as? BannerMeta)?.addPattern(Pattern(DyeColor.BLACK, PatternType.BASE)) } } } else if (type.size == 2) { diff --git a/plugin/src/main/resources/lang/en_US.yml b/plugin/src/main/resources/lang/en_US.yml index 19f3c6ca..82d39d41 100644 --- a/plugin/src/main/resources/lang/en_US.yml +++ b/plugin/src/main/resources/lang/en_US.yml @@ -94,4 +94,5 @@ Command-Convert-Unknown-Type: '&8[&3Tr&bMenu&8] &7Unknown type &b{0} &7.' Command-Convert-Type-Already: '&8[&3Tr&bMenu&8] &7The type of menu &6{0} &7 is already &b{1} &7.' Command-Convert-Converted: '&8[&3Tr&bMenu&8] &7Typecast menu &6{0} &7 to &b{1}&7.' Command-Data-Get: '&8[&3Tr&bMenu&8] &7Get &6{1} &7data &6{2} &7for player &6{0} &7: &f{3}.' -Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' \ No newline at end of file +Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7File Created: &f{0}' \ No newline at end of file diff --git a/plugin/src/main/resources/lang/ru_RU.yml b/plugin/src/main/resources/lang/ru_RU.yml index ac155fed..e231c89a 100644 --- a/plugin/src/main/resources/lang/ru_RU.yml +++ b/plugin/src/main/resources/lang/ru_RU.yml @@ -93,4 +93,5 @@ Command-Convert-Unknown-Type: '&8[&3Tr&bMenu&8] &7Неизвестный вид Command-Convert-Type-Already: '&8[&3Tr&bMenu&8] &7Вид меню &6{0} &7 находится &b{1} &7.' Command-Convert-Converted: '&8[&3Tr&bMenu&8] &7Типичное меню от &6{0} &7 до &b{1}&7.' Command-Data-Get: '&8[&3Tr&bMenu&8] &7Получение &6{1} &7данных &6{2} &7для &7игрока &6{0}&7: &f{3}' -Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' \ No newline at end of file +Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7File Created: &f{0}' \ No newline at end of file diff --git a/plugin/src/main/resources/lang/uk_UA.yml b/plugin/src/main/resources/lang/uk_UA.yml index dbd4a8fa..b345dd3d 100644 --- a/plugin/src/main/resources/lang/uk_UA.yml +++ b/plugin/src/main/resources/lang/uk_UA.yml @@ -203,3 +203,4 @@ Menu-Loader-Loading: '&8[&3Tr&bMenu&8] &6ПОТІК &8| &3Завантаженн Command-Data-Get: '&8[&3Tr&bMenu&8] &7Отримати дані про &6{1} &7гравців &6{0} {2} &7: &f{3}' Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' Command-Data-Description: 'Modify & get data' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7File Created: &f{0}' diff --git a/plugin/src/main/resources/lang/vi_VN.yml b/plugin/src/main/resources/lang/vi_VN.yml index 68482b5f..a57d261d 100644 --- a/plugin/src/main/resources/lang/vi_VN.yml +++ b/plugin/src/main/resources/lang/vi_VN.yml @@ -94,4 +94,5 @@ Command-Convert-Unknown-Type: '&8[&3Tr&bMenu&8] &7Unknown type &b{0} &7.' Command-Convert-Type-Already: '&8[&3Tr&bMenu&8] &7The type of menu &6{0} &7 is already &b{1} &7.' Command-Convert-Converted: '&8[&3Tr&bMenu&8] &7Typecast menu &6{0} &7 to &b{1}&7.' Command-Data-Get: '&8[&3Tr&bMenu&8] &7Nhận &6{1} &7dữ liệu &6{2} &7của người chơi &6{0}&7: &f{3}' -Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' \ No newline at end of file +Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &cInvalid modify type.' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7File Created: &f{0}' \ No newline at end of file diff --git a/plugin/src/main/resources/lang/zh_CN.yml b/plugin/src/main/resources/lang/zh_CN.yml index 6baeb2c4..bcc93a34 100644 --- a/plugin/src/main/resources/lang/zh_CN.yml +++ b/plugin/src/main/resources/lang/zh_CN.yml @@ -97,4 +97,5 @@ Command-Convert-Unknown-Type: '&8[&3Tr&bMenu&8] &7未知类型 &b{0} &7.' Command-Convert-Type-Already: '&8[&3Tr&bMenu&8] &7菜单 &6{0} &7的类型已经是 &b{1} &7了.' Command-Convert-Converted: '&8[&3Tr&bMenu&8] &7已将菜单 &6{0} &7的类型转换为 &b{1}&7.' Command-Data-Get: '&8[&3Tr&bMenu&8] &7获取玩家 &6{0} &7的 &6{1} &7数据 &6{2} &7: &f{3}' -Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &c无效的修改类型' \ No newline at end of file +Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &c无效的修改类型' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7已创建文件: &f{0}' \ No newline at end of file diff --git a/plugin/src/main/resources/lang/zh_HK.yml b/plugin/src/main/resources/lang/zh_HK.yml index c50c5c26..fbe37051 100644 --- a/plugin/src/main/resources/lang/zh_HK.yml +++ b/plugin/src/main/resources/lang/zh_HK.yml @@ -94,4 +94,5 @@ Command-Convert-Unknown-Type: '&8[&3Tr&bMenu&8] &7未知類型 &b{0} &7.' Command-Convert-Type-Already: '&8[&3Tr&bMenu&8] &7菜單 &6{0} &7的類型已經是 &b{1} &7了.' Command-Convert-Converted: '&8[&3Tr&bMenu&8] &7已將菜單 &6{0} &7的類型轉換為 &b{1}&7.' Command-Data-Get: '&8[&3Tr&bMenu&8] &7獲取玩家 &6{0} &7的 &6{1} &7數據 &6{2} &7: &f{3}' -Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &c無效的修改類型' \ No newline at end of file +Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &c無效的修改類型' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7已創建文件: &f{0}' \ No newline at end of file diff --git a/plugin/src/main/resources/lang/zh_TW.yml b/plugin/src/main/resources/lang/zh_TW.yml index 71d2a092..760fd025 100644 --- a/plugin/src/main/resources/lang/zh_TW.yml +++ b/plugin/src/main/resources/lang/zh_TW.yml @@ -93,4 +93,5 @@ Command-Convert-Unknown-Type: '&8[&3Tr&bMenu&8] &7未知類型 &b{0} &7.' Command-Convert-Type-Already: '&8[&3Tr&bMenu&8] &7菜單 &6{0} &7的類型已經是 &b{1} &7了.' Command-Convert-Converted: '&8[&3Tr&bMenu&8] &7已將菜單 &6{0} &7的類型轉換為 &b{1}&7.' Command-Data-Get: '&8[&3Tr&bMenu&8] &7獲取玩家 &6{0} &7的 &6{1} &7數據 &6{2} &7: &f{3}' -Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &c無效的修改類型' \ No newline at end of file +Command-Data-Invalid-Modify: '&8[&3Tr&bMenu&8] &c無效的修改類型' +Dump-Info-Created: '&8[&3Tr&bMenu&8] &7已創建文件: &f{0}' \ No newline at end of file