diff --git a/.gitignore b/.gitignore index 540f0e71..e0b49eff 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,8 @@ common/build /*/build/ build/ -/fabric/src/main/resources/rpmtw_platform_mod.accesswidener -/quilt/src/main/resources/rpmtw_platform_mod.accesswidener +fabric/src/generated/ +quilt/src/generated/ .architectury-transformer/ .idea \ No newline at end of file diff --git a/README.md b/README.md index 69c9ab06..6379aa54 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,17 @@ # RPMTW Platform Mod [![](https://img.shields.io/github/license/RPMTW/RPMTW-Platform-Mod.svg)](LICENSE) -[![](https://img.shields.io/github/release/RPMTW/RPMTW-Platform-Mod.svg)](https://github.com/RPMTW/RPMTW-Platform-Mod/releases) -![](http://cf.way2muchnoise.eu/versions/minecraft_rpmtw-update-mod_all.svg) -[![](http://cf.way2muchnoise.eu/rpmtw-update-mod.svg)](https://www.curseforge.com/minecraft/mc-mods/rpmtw-update-mod) +[![](https://img.shields.io/github/release/RPMTW/RPMTW-Platform-Mod.svg)](../../releases) +![](https://cf.way2muchnoise.eu/versions/rpmtw-platform.svg) +[![](https://cf.way2muchnoise.eu/rpmtw-platform.svg)](https://www.curseforge.com/minecraft/mc-mods/rpmtw-platform) [![](https://img.shields.io/modrinth/dt/ZukQzaRP?label=Modrinth%20Downloads)](https://modrinth.com/mod/ZukQzaRP)

 

#### 🌐 README Languages - English (Current Language) -- [繁體中文](https://github.com/RPMTW/RPMTW-Platform-Mod/blob/main/README/zh_tw.md) -- [简体中文](https://github.com/RPMTW/RPMTW-Platform-Mod/blob/main/README/zh_cn.md) +- [繁體中文](README/zh_tw.md) +- [简体中文](README/zh_cn.md) ## 📚 Introduction diff --git a/README/zh_cn.md b/README/zh_cn.md index f03f0f9a..e69d41fb 100644 --- a/README/zh_cn.md +++ b/README/zh_cn.md @@ -2,23 +2,23 @@ # RPMTW 平台 -[![](https://img.shields.io/github/license/RPMTW/RPMTW-Platform-Mod.svg)](LICENSE) -[![](https://img.shields.io/github/release/RPMTW/RPMTW-Platform-Mod.svg)](https://github.com/RPMTW/RPMTW-Platform-Mod/releases) -![](http://cf.way2muchnoise.eu/versions/minecraft_rpmtw-update-mod_all.svg) -[![](http://cf.way2muchnoise.eu/rpmtw-update-mod.svg)](https://www.curseforge.com/minecraft/mc-mods/rpmtw-update-mod) +[![](https://img.shields.io/github/license/RPMTW/RPMTW-Platform-Mod.svg)](../LICENSE) +[![](https://img.shields.io/github/release/RPMTW/RPMTW-Platform-Mod.svg)](../../../releases) +![](https://cf.way2muchnoise.eu/versions/rpmtw-platform.svg) +[![](https://cf.way2muchnoise.eu/rpmtw-platform.svg)](https://www.curseforge.com/minecraft/mc-mods/rpmtw-update-mod) [![](https://img.shields.io/modrinth/dt/ZukQzaRP?label=Modrinth%20Downloads)](https://modrinth.com/mod/ZukQzaRP)

 

 

#### 🌐 自叙文件语言 -- [English](https://github.com/RPMTW/RPMTW-Platform-Mod/blob/main/README.md) -- [繁體中文](https://github.com/RPMTW/RPMTW-Platform-Mod/blob/main/README/zh_tw.md) -- 简体中文 (当前语言) +- [English](../../README.md) +- [繁體中文](zh_tw.md) +- 简体中文(当前语言) ## 📚 介绍 -整合了RPMTW各项服务的MOD,涵盖翻译、百科、宇宙通信、中文输入优化等功能,让 Minecraft 中文玩家获得更好的游戏体验。 +整合了 RPMTW 各项服务的 MOD,涵盖翻译、百科、宇宙通信、中文输入优化等功能,让 Minecraft 中文玩家获得更好的游戏体验。 ## 🎨 特色功能 @@ -41,7 +41,7 @@ - ### 机器翻译 -遇到没人工翻译的内容吗?全部交给 AI 吧!不再被语言隔阂导致无法游玩MOD。 +遇到没人工翻译的内容吗?全部交给 AI 吧!不再被语言隔阂导致无法游玩 MOD。 - ### 开启 Crowdin 页面 @@ -73,4 +73,4 @@ ## 🎓 许可证 -[GNU 通用公共许可证 3.0 版 (GPL3)](https://www.gnu.org/licenses/gpl-3.0.html) +[GNU 通用公共许可证 3.0 版(GPL3)](https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/README/zh_tw.md b/README/zh_tw.md index 120c150c..a18d16d4 100644 --- a/README/zh_tw.md +++ b/README/zh_tw.md @@ -2,23 +2,23 @@ # RPMTW 平台 -[![](https://img.shields.io/github/license/RPMTW/RPMTW-Platform-Mod.svg)](LICENSE) -[![](https://img.shields.io/github/release/RPMTW/RPMTW-Platform-Mod.svg)](https://github.com/RPMTW/RPMTW-Platform-Mod/releases) -![](http://cf.way2muchnoise.eu/versions/minecraft_rpmtw-update-mod_all.svg) -[![](http://cf.way2muchnoise.eu/rpmtw-update-mod.svg)](https://www.curseforge.com/minecraft/mc-mods/rpmtw-update-mod) +[![](https://img.shields.io/github/license/RPMTW/RPMTW-Platform-Mod.svg)](../LICENSE) +[![](https://img.shields.io/github/release/RPMTW/RPMTW-Platform-Mod.svg)](../../../releases) +![](https://cf.way2muchnoise.eu/versions/rpmtw-platform.svg) +[![](https://cf.way2muchnoise.eu/rpmtw-platform.svg)](https://www.curseforge.com/minecraft/mc-mods/rpmtw-update-mod) [![](https://img.shields.io/modrinth/dt/ZukQzaRP?label=Modrinth%20Downloads)](https://modrinth.com/mod/ZukQzaRP)

 

#### 🌐 說明檔案語言 -- [English](https://github.com/RPMTW/RPMTW-Platform-Mod/blob/main/README.md) -- 繁體中文 (目前語言) -- [简体中文](https://github.com/RPMTW/RPMTW-Platform-Mod/blob/main/README/zh_cn.md) +- [English](../README.md) +- 繁體中文(目前語言) +- [简体中文](zh_cn.md) ## 📚 介紹 -整合了RPMTW各項服務的模組,涵蓋翻譯、百科、宇宙通訊、中文輸入優化等功能,讓 Minecraft 中文玩家獲得更好的遊戲體驗。 +整合了 RPMTW 各項服務的模組,涵蓋翻譯、百科、宇宙通訊、中文輸入優化等功能,讓 Minecraft 中文玩家獲得更好的遊戲體驗。 ## 🎨 特色功能 @@ -64,7 +64,7 @@ ### ️ 使用的技術 -- [Kotlin](https://kotlinlang.org/) +- [Kotlin](https://kotlinlang.org) - Java - JVM - [Architectury](https://github.com/architectury) @@ -73,4 +73,4 @@ ## 🎓 授權條款 -[GNU 通用公眾授權條款 3.0 版 (GPL3)](https://www.gnu.org/licenses/gpl-3.0.html) +[GNU 通用公眾授權條款 3.0 版(GPL3)](https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/build.gradle.kts b/build.gradle.kts index bf4dbc7f..98ae442d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,8 +6,8 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { base id("org.jetbrains.kotlin.jvm") version "1.6.10" - id("architectury-plugin") version "3.4.143" - id("dev.architectury.loom") version "1.0.+" apply false + id("architectury-plugin") version "3.4.146" + id("dev.architectury.loom") version "1.2.+" apply false id("com.github.johnrengelman.shadow") version "7.1.2" } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 748f7ab8..650b27c9 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -5,11 +5,14 @@ dependencies { // Remove the next line if you don't want to depend on the API modApi("dev.architectury:architectury:${project.property("architectury_version").toString()}") modApi("me.shedaniel.cloth:cloth-config:${project.property("cloth_config_version").toString()}") - modApi( + implementation( group = "com.github.RPMTW", name = "RPMTW-API-Client-Kotlin", version = project.property("rpmtw_api_client_version").toString() ) + implementation("com.github.kittinunf.fuel:fuel:2.3.1") + implementation("com.github.kittinunf.fuel:fuel-gson:2.3.1") + implementation("com.github.kittinunf.fuel:fuel-coroutines:2.3.1") modApi(group = "io.sentry", name = "sentry", version = project.property("sentry_version").toString()) } diff --git a/common/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/RunClientCommandOnComponent.java b/common/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/RunClientCommandOnComponent.java index d4cf33d5..2bb5d45f 100644 --- a/common/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/RunClientCommandOnComponent.java +++ b/common/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/RunClientCommandOnComponent.java @@ -23,4 +23,4 @@ public void handleComponentClick(Screen instance, String command, boolean bl) { instance.sendMessage(command); } -} +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/RPMTWPlatformMod.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/RPMTWPlatformMod.kt index 063ca807..bfa463ae 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/RPMTWPlatformMod.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/RPMTWPlatformMod.kt @@ -5,6 +5,7 @@ import com.rpmtw.rpmtw_platform_mod.command.CommandHandler import com.rpmtw.rpmtw_platform_mod.config.RPMTWConfig import com.rpmtw.rpmtw_platform_mod.handlers.EventHandler import com.rpmtw.rpmtw_platform_mod.handlers.SentryHandler +import com.rpmtw.rpmtw_platform_mod.translation.GameLanguage import dev.architectury.platform.Platform import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.Logger @@ -21,6 +22,7 @@ object RPMTWPlatformMod { @JvmStatic fun init() { LOGGER.info("Initializing RPMTW Platform Mod") + GameLanguage.initialize() if (RPMTWConfig.get().advanced.sendExceptionToSentry) { SentryHandler.init() } diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/CommandHandler.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/CommandHandler.kt index aa8bd4cf..c42737b4 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/CommandHandler.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/CommandHandler.kt @@ -15,7 +15,8 @@ object CommandHandler { fun init() { val mainCommand = literal("rpmtw") - val commandList = listOf(UniverseMessageActionCommand(), LoginRPMTWAccountCommand()) + val commandList = + listOf(UniverseMessageActionCommand(), LoginRPMTWAccountCommand(), LogoutRPMTWAccountCommand()) commandList.forEach { mainCommand.then(it.register()) diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/LogoutRPMTWAccountCommand.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/LogoutRPMTWAccountCommand.kt new file mode 100644 index 00000000..4c4e7c92 --- /dev/null +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/command/LogoutRPMTWAccountCommand.kt @@ -0,0 +1,17 @@ +package com.rpmtw.rpmtw_platform_mod.command + +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.rpmtw.rpmtw_platform_mod.handlers.RPMTWAuthHandler +import net.minecraft.commands.SharedSuggestionProvider + +class LogoutRPMTWAccountCommand : RPMTWCommand() { + override fun register(): LiteralArgumentBuilder { + val command = literal("logout").executes { + RPMTWAuthHandler.logout() + + return@executes CommandHandler.success + } + + return command + } +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/ConfigObject.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/ConfigObject.kt index 23103b82..7daaeee3 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/ConfigObject.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/ConfigObject.kt @@ -26,6 +26,10 @@ class ConfigObject : ConfigData { val advanced = Advanced() class Translate { + @ConfigEntry.Gui.Tooltip(count = 1) + @ConfigEntry.Gui.RequiresRestart + var loadTranslateResourcePack = GameLanguage.getSystem() == GameLanguage.TraditionalChinese + @ConfigEntry.Gui.Tooltip(count = 1) @ConfigEntry.Gui.RequiresRestart var machineTranslation = true @@ -45,16 +49,6 @@ class ConfigObject : ConfigData { } } - @ConfigEntry.Gui.Tooltip(count = 1) - @ConfigEntry.Gui.RequiresRestart - var loadTranslateResourcePack = false - get() { - return if (GameLanguage.getSystem() == GameLanguage.TraditionalChinese) { - true - } else { - field - } - } @ConfigEntry.Gui.Tooltip(count = 1) @ConfigEntry.Gui.RequiresRestart @@ -106,6 +100,8 @@ class ConfigObject : ConfigData { var sendExceptionToSentry = true } + @ConfigEntry.Gui.Excluded + var protocolVersion : Int? = null @ConfigEntry.Gui.Excluded var rpmtwAuthToken: String? = null diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWAccountEntry.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWAccountEntry.kt new file mode 100644 index 00000000..dbfeffdf --- /dev/null +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWAccountEntry.kt @@ -0,0 +1,120 @@ +package com.rpmtw.rpmtw_platform_mod.config + +import com.mojang.blaze3d.vertex.PoseStack +import com.rpmtw.rpmtw_platform_mod.handlers.RPMTWAuthHandler +import me.shedaniel.clothconfig2.api.AbstractConfigListEntry +import net.minecraft.client.Minecraft +import net.minecraft.client.gui.components.AbstractWidget +import net.minecraft.client.gui.components.Button +import net.minecraft.client.gui.components.events.GuiEventListener +import net.minecraft.client.gui.narration.NarratableEntry +import net.minecraft.client.resources.language.I18n +import net.minecraft.network.chat.TextComponent +import net.minecraft.network.chat.TranslatableComponent +import java.util.* + + +class RPMTWAccountEntry : AbstractConfigListEntry( + TextComponent( + UUID.randomUUID().toString() + ), false +) { + private val widgets: MutableList = ArrayList() + override fun getItemHeight(): Int { + return 48 + } + + override fun narratables(): List { + return widgets + } + + override fun getValue(): Any { + return Any() + } + + @Suppress("UNCHECKED_CAST") + override fun getDefaultValue(): Optional { + return Optional.of(Any()) as Optional + } + + override fun save() { + + } + + override fun isMouseInside(mouseX: Int, mouseY: Int, x: Int, y: Int, entryWidth: Int, entryHeight: Int): Boolean { + return false + } + + override fun render( + matrices: PoseStack, + index: Int, + y: Int, + x: Int, + entryWidth: Int, + entryHeight: Int, + mouseX: Int, + mouseY: Int, + isHovered: Boolean, + delta: Float + ) { + super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, isHovered, delta) + + val title = TranslatableComponent("auth.rpmtw_platform_mod.title") + val isLogin = RPMTWConfig.get().isLogin() + val authStatus: String = if (isLogin) { + I18n.get("auth.rpmtw_platform_mod.status.logged_in") + } else { + I18n.get("auth.rpmtw_platform_mod.status.not_logged_in") + } + + if (!isLogin) { + val loginButton = Button(entryWidth / 2 + 20, + y + 10, + 65, + 20, + TranslatableComponent("auth.rpmtw_platform_mod.button.login"), + { + RPMTWAuthHandler.login() + }, + { _, matrixStack, i, j -> + Minecraft.getInstance().screen?.renderTooltip( + matrixStack, TranslatableComponent("auth.rpmtw_platform_mod.button.login.tooltip"), i, j + ) + }) + + widgets.add(loginButton) + loginButton.render(matrices, mouseX, mouseY, delta) + } else { + val logoutButton = Button( + entryWidth / 2 + 20, y + 10, 65, 20, TranslatableComponent("auth.rpmtw_platform_mod.button.logout") + ) { + RPMTWAuthHandler.logout() + } + + widgets.add(logoutButton) + logoutButton.render(matrices, mouseX, mouseY, delta) + } + + val font = Minecraft.getInstance().font + + font.drawShadow( + matrices, + title, + (x - 4 + entryWidth / 2 - Minecraft.getInstance().font.width(title) / 2).toFloat(), + (y).toFloat(), + -1 + ) + + font.drawShadow( + matrices, + authStatus, + (x - 4 + entryWidth / 2 - Minecraft.getInstance().font.width(authStatus) / 2).toFloat(), + (y + 33).toFloat(), + -1 + ) + } + + override fun children(): List { + return widgets + } +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWConfig.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWConfig.kt index c52a62cd..2648b03f 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWConfig.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/config/RPMTWConfig.kt @@ -1,10 +1,9 @@ package com.rpmtw.rpmtw_platform_mod.config import com.mojang.blaze3d.platform.InputConstants -import com.mojang.blaze3d.vertex.PoseStack import com.rpmtw.rpmtw_platform_mod.RPMTWPlatformMod -import com.rpmtw.rpmtw_platform_mod.handlers.RPMTWAuthHandler import com.rpmtw.rpmtw_platform_mod.handlers.UniverseChatHandler +import dev.architectury.platform.Platform import me.shedaniel.autoconfig.AutoConfig import me.shedaniel.autoconfig.ConfigHolder import me.shedaniel.autoconfig.annotation.Config @@ -17,23 +16,19 @@ import me.shedaniel.autoconfig.util.Utils.setUnsafely import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.Jankson import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.JsonObject import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.JsonPrimitive -import me.shedaniel.clothconfig2.api.* -import me.shedaniel.clothconfig2.gui.GlobalizedClothConfigScreen +import me.shedaniel.clothconfig2.api.ConfigBuilder +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder +import me.shedaniel.clothconfig2.api.Modifier +import me.shedaniel.clothconfig2.api.ModifierKeyCode import me.shedaniel.clothconfig2.gui.entries.KeyCodeEntry -import net.minecraft.client.Minecraft -import net.minecraft.client.gui.components.AbstractWidget -import net.minecraft.client.gui.components.Button -import net.minecraft.client.gui.components.events.GuiEventListener -import net.minecraft.client.gui.narration.NarratableEntry import net.minecraft.client.gui.screens.Screen -import net.minecraft.client.resources.language.I18n -import net.minecraft.network.chat.TextComponent import net.minecraft.network.chat.TranslatableComponent import net.minecraft.world.InteractionResult -import java.util.* + object RPMTWConfig { private var config: ConfigObject? = null + private const val PROTOCOL_VERSION = 1 private fun register() { @@ -59,6 +54,8 @@ object RPMTWConfig { val holder = AutoConfig.getConfigHolder(ConfigObject::class.java) config = holder.config + + checkProtocolVersion(holder, holder.config) listenOnSave(holder, holder.config) RPMTWPlatformMod.LOGGER.info("Registered config") @@ -107,6 +104,18 @@ object RPMTWConfig { } } + private fun checkProtocolVersion(holder: ConfigHolder, config: ConfigObject) { + if (config.protocolVersion == null) { + holder.config.protocolVersion = PROTOCOL_VERSION + + if (!config.firstJoinLevel) { + holder.resetToDefault() + } + + holder.save() + } + } + @JvmStatic fun get(): ConfigObject { if (config == null) { @@ -124,13 +133,10 @@ object RPMTWConfig { builder.setGlobalized(true) builder.setGlobalizedExpanded(false) - builder.setAfterInitConsumer { screen -> - val globalizedScreen: GlobalizedClothConfigScreen = screen as GlobalizedClothConfigScreen - - val entry = RPMTWAccountEntry() - entry.setScreen(screen) - @Suppress("UNCHECKED_CAST") globalizedScreen.listWidget.children() - .add(0, entry as AbstractConfigEntry>) + if (!Platform.isForge()) { + val category = + builder.getOrCreateCategory(TranslatableComponent("auth.rpmtw_platform_mod.title")) + category.addEntry(RPMTWAccountEntry()) } builder.build() @@ -141,105 +147,4 @@ object RPMTWConfig { fun save() { AutoConfig.getConfigHolder(get().javaClass).save() } -} - -internal class RPMTWAccountEntry : AbstractConfigListEntry(TextComponent("rpmtw_account"), false) { - - private var widgets: List = listOf() - - override fun save() {} - - override fun isMouseInside(mouseX: Int, mouseY: Int, x: Int, y: Int, entryWidth: Int, entryHeight: Int): Boolean { - return false - } - - override fun render( - matrices: PoseStack, - index: Int, - y: Int, - x: Int, - entryWidth: Int, - entryHeight: Int, - mouseX: Int, - mouseY: Int, - isHovered: Boolean, - delta: Float - ) { - super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, isHovered, delta) - - val title = TranslatableComponent("auth.rpmtw_platform_mod.title") - val isLogin = RPMTWConfig.get().isLogin() - val authStatus: String = if (isLogin) { - I18n.get("auth.rpmtw_platform_mod.status.logged_in") - } else { - I18n.get("auth.rpmtw_platform_mod.status.not_logged_in") - } - - if (!isLogin) { - val loginButton = Button(entryWidth / 2 + 20, - y + 10, - 65, - 20, - TranslatableComponent("auth.rpmtw_platform_mod.button.login"), - { - RPMTWAuthHandler.login() - }, - { _, matrixStack, i, j -> - Minecraft.getInstance().screen?.renderTooltip( - matrixStack, TranslatableComponent("auth.rpmtw_platform_mod.button.login.tooltip"), i, j - ) - }) - - widgets = listOf(loginButton) - loginButton.render(matrices, mouseX, mouseY, delta) - } else { - val logoutButton = Button( - entryWidth / 2 + 20, y + 10, 65, 20, TranslatableComponent("auth.rpmtw_platform_mod.button.logout") - ) { - RPMTWAuthHandler.logout() - } - - widgets = listOf(logoutButton) - logoutButton.render(matrices, mouseX, mouseY, delta) - } - - val font = Minecraft.getInstance().font - - font.drawShadow( - matrices, - title, - (x - 4 + entryWidth / 2 - Minecraft.getInstance().font.width(title) / 2).toFloat(), - (y).toFloat(), - -1 - ) - - font.drawShadow( - matrices, - authStatus, - (x - 4 + entryWidth / 2 - Minecraft.getInstance().font.width(authStatus) / 2).toFloat(), - (y + 33).toFloat(), - -1 - ) - } - - override fun children(): List { - return widgets - } - - override fun narratables(): List { - return widgets - } - - override fun getValue(): Any? { - return null - } - - @Suppress("UNCHECKED_CAST") - override fun getDefaultValue(): Optional { - return Optional.of(Any()) as Optional - } - - override fun getItemHeight(): Int { - return 45 - } -} +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/gui/widgets/TranslucentButton.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/gui/widgets/TranslucentButton.kt index 4f9c2f94..91b10765 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/gui/widgets/TranslucentButton.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/gui/widgets/TranslucentButton.kt @@ -12,13 +12,8 @@ class TranslucentButton( height: Int, message: Component, onPress: OnPress, - val tooltip: Component? + val tooltip: Component?, ) : Button(x, y, width, height, message, onPress) { - - override fun blit(stack: PoseStack, x: Int, y: Int, textureX: Int, textureY: Int, width: Int, height: Int) { - fill(stack, x, y, x + width, y + height, Int.MIN_VALUE) - } - override fun renderButton(poseStack: PoseStack, i: Int, j: Int, f: Float) { super.renderButton(poseStack, i, j, f) if (this.isHoveredOrFocused && tooltip != null) { diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/handlers/RPMTWAuthHandler.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/handlers/RPMTWAuthHandler.kt index d9e1b0f2..35a9ab7f 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/handlers/RPMTWAuthHandler.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/handlers/RPMTWAuthHandler.kt @@ -19,7 +19,7 @@ import java.util.stream.Collectors object RPMTWAuthHandler { - private const val port: Int = 37953 + const val port: Int = 37953 private var tryCount: Int = 0 fun login(port: Int = this.port) { diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/GameLanguage.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/GameLanguage.kt index e759b0bb..8eae1c0d 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/GameLanguage.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/GameLanguage.kt @@ -9,15 +9,23 @@ enum class GameLanguage(val code: String, val isO3Code: Set) { SimplifiedChinese("zh_cn", setOf("CHN")); companion object { + private var systemLanguage: GameLanguage? = null + + fun initialize() { + systemLanguage = getSystem() + } + fun getMinecraft(): GameLanguage { val minecraftLanguage = Minecraft.getInstance().options.languageCode return values().firstOrNull { it.code == minecraftLanguage } ?: English } + fun getSystem(): GameLanguage? { - val systemCountry = Locale.getDefault().isO3Country + if (systemLanguage != null) return systemLanguage + val systemCountry = Locale.getDefault().isO3Country return values().firstOrNull { it.isO3Code.contains(systemCountry) } } } diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/machineTranslation/MTManager.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/machineTranslation/MTManager.kt index d26fa4d8..bd24ef30 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/machineTranslation/MTManager.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/machineTranslation/MTManager.kt @@ -26,7 +26,7 @@ object MTManager { private val queue: MutableList = mutableListOf() private var handleQueueing: Boolean = false private var translatingCount: Int = 0 - private const val maxTranslatingCount: Int = 3 + private const val MAX_TRANSLATING_COUNT: Int = 3 private val formatPattern = Pattern.compile("%(?:(\\d+)\\$)?([A-Za-z%]|$)") private val gson = GsonBuilder().registerTypeAdapter(Exception::class.java, ExceptionSerializer()) .registerTypeAdapter(Timestamp::class.java, TimestampAdapter()) @@ -46,7 +46,7 @@ object MTManager { TextComponent(I18n.get("machineTranslation.rpmtw_platform_mod.status.failed", info.error)).withStyle( ChatFormatting.RED ) - } else if (translatingCount >= maxTranslatingCount) { + } else if (translatingCount >= MAX_TRANSLATING_COUNT) { // If there are too many things to translate at the same time, the translation will be skipped to avoid sending too many requests to the server generateProgressText() } else if (info?.status == MTDataStatus.Translating) { @@ -66,7 +66,7 @@ object MTManager { queue.add(sourceText) } - if (!handleQueueing && queue.isNotEmpty() && translatingCount < maxTranslatingCount) { + if (!handleQueueing && queue.isNotEmpty() && translatingCount < MAX_TRANSLATING_COUNT) { handleQueue() } } @@ -172,7 +172,7 @@ object MTManager { private fun handleQueue() { handleQueueing = true Util.coroutineLaunch { - while (queue.isNotEmpty() && translatingCount < maxTranslatingCount) { + while (queue.isNotEmpty() && translatingCount < MAX_TRANSLATING_COUNT) { val sourceText = queue.removeAt(0) translateAndCache(sourceText.text) withContext(Dispatchers.IO) { diff --git a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/resourcepack/TranslateResourcePack.kt b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/resourcepack/TranslateResourcePack.kt index 43a0879a..7d9a18c1 100644 --- a/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/resourcepack/TranslateResourcePack.kt +++ b/common/src/main/kotlin/com/rpmtw/rpmtw_platform_mod/translation/resourcepack/TranslateResourcePack.kt @@ -12,10 +12,10 @@ import java.net.URL import java.nio.charset.StandardCharsets object TranslateResourcePack { - private const val fileName = "RPMTW-Translate-Resource-Pack-1.18.zip" + private const val FILE_NAME = "RPMTW-Translate-Resource-Pack-1.18.zip" private val resourcePackFolder: File = RPMTWPlatformModPlugin.getGameFolder().resolve("resourcepacks") - private val resourcePackFile = resourcePackFolder.resolve(fileName) - private val cacheFile = Util.getFileLocation(fileName) + private val resourcePackFile = resourcePackFolder.resolve(FILE_NAME) + private val cacheFile = Util.getFileLocation(FILE_NAME) private var loaded = false fun init() { @@ -75,7 +75,7 @@ object TranslateResourcePack { return } - val downloadUrl = "https://github.com/RPMTW/ResourcePack-Mod-zh_tw/raw/Translated-1.18/RPMTW-1.18.zip" + val downloadUrl = "https://github.com/RPMTW/Translate-Resource-Pack/releases/latest/download/$FILE_NAME" FileUtils.copyURLToFile(URL(downloadUrl), cacheFile) if (!cacheFile.exists()) { @@ -111,6 +111,6 @@ object TranslateResourcePack { } fun getPackId(): String { - return "file/$fileName" + return "file/$FILE_NAME" } } \ No newline at end of file diff --git a/common/src/main/resources/assets/rpmtw_platform_mod/lang/ja_jp.json b/common/src/main/resources/assets/rpmtw_platform_mod/lang/ja_jp.json index 57305dea..0f7559ed 100644 --- a/common/src/main/resources/assets/rpmtw_platform_mod/lang/ja_jp.json +++ b/common/src/main/resources/assets/rpmtw_platform_mod/lang/ja_jp.json @@ -1,60 +1,76 @@ { - "auth.rpmtw_platform_mod.title": "RPMTWアカウント", - "auth.rpmtw_platform_mod.button.login": "ログイン", - "auth.rpmtw_platform_mod.button.login.tooltip": "RPMTWアカウントでログインする。", - "auth.rpmtw_platform_mod.button.logout": "ログアウト", - "auth.rpmtw_platform_mod.status.failed": "ログインに失敗しました。\nそれでも失敗する場合は、RPMTW Discordにアクセスして\nhttps://discord.gg/5xApZtgV2u に問い合わせてください。", - "auth.rpmtw_platform_mod.status.logged_in": "既にログインしています。", - "auth.rpmtw_platform_mod.status.not_logged_in": "ログインしていません。", - "config.rpmtw_platform_mod.category.default": "RPMTW Platform Mod 設定", - "config.rpmtw_platform_mod.option.base": "基本設定", - "config.rpmtw_platform_mod.option.universeChat": "宇宙チャット", - "config.rpmtw_platform_mod.option.universeChat.accountType": "アカウントタイプ", - "config.rpmtw_platform_mod.option.universeChat.accountType.@Tooltip": "RPMTWアカウントにログインしていない場合は、Minecraftのアカウントがデフォルトで使用されます", - "config.rpmtw_platform_mod.option.universeChat.enable": "宇宙チャットを有効にする", - "config.rpmtw_platform_mod.option.universeChat.enable.@Tooltip": "無効にすると、他の宇宙チャットオプションが上書きされ無効になります。", - "config.rpmtw_platform_mod.option.universeChat.enableButton": "ショートカットボタン", - "config.rpmtw_platform_mod.option.universeChat.enableButton.@Tooltip": "チャット画面で宇宙チャットのショートカットボタンを表示するかどうか。", - "config.rpmtw_platform_mod.option.universeChat.enableReceiveMessage": "メッセージを受信", - "config.rpmtw_platform_mod.option.universeChat.nickname": "ニックネーム", - "config.rpmtw_platform_mod.option.universeChat.nickname.@Tooltip": "宇宙チャットでのプレイヤーのニックネームです。", - "config.rpmtw_platform_mod.option.keyBindings": "キーバインディング", - "config.rpmtw_platform_mod.option.keyBindings.config": "設定画面を開く", - "config.rpmtw_platform_mod.option.keyBindings.machineTranslation": "機械翻訳を使用", - "config.rpmtw_platform_mod.option.translate": "RPMTranslator", - "config.rpmtw_platform_mod.option.translate.autoMachineTranslation": "自動機械翻訳", - "config.rpmtw_platform_mod.option.translate.machineTranslation": "機械翻訳", - "config.rpmtw_platform_mod.option.translate.machineTranslation.@Tooltip": "人間による翻訳が利用できない場合、機械翻訳を使用してテキストを翻訳します。", - "config.rpmtw_platform_mod.option.translate.unlocalized": "ローカライズされないコンテンツ", - "config.rpmtw_platform_mod.option.translate.unlocalized.@Tooltip": "ローカライズされていないコンテンツの追加表示。ゲーム言語がアメリカ英語の場合は機能しません。", - "config.rpmtw_platform_mod.option.translate.loadTranslateResourcePack": "翻訳リソースパックをロード", - "config.rpmtw_platform_mod.title": "RPMTW Platform 設定", - "universeChat.rpmtw_platform_mod.button.receive": "メッセージを受信", - "universeChat.rpmtw_platform_mod.button.receive.tooltip": "他の惑星からメッセージを受信します。", - "universeChat.rpmtw_platform_mod.button.send": "メッセージを送信", - "universeChat.rpmtw_platform_mod.gui.eula.agree": "同意します", - "universeChat.rpmtw_platform_mod.gui.eula.disagree": "同意しない", - "universeChat.rpmtw_platform_mod.gui.eula.subtitle": "宇宙チャットシステムを使用することにより、以下の条件に同意したことになります。", - "universeChat.rpmtw_platform_mod.gui.eula.text.2": "- メッセージ内でいかなる形態の嫌がらせを使用したり、宇宙チャットサーバーを攻撃するための手段を使用したりすることは許可されていません。", - "universeChat.rpmtw_platform_mod.gui.eula.text.3": "- UUID / IPは、確認とアカウントの禁止のみを目的として収集されます。", - "universeChat.rpmtw_platform_mod.gui.eula.text.4": "- これらの利用規約はいつでも変更される可能性があります(最新バージョンを表示するには、RPMTWの公式Webサイトにアクセスしてください)。", - "universeChat.rpmtw_platform_mod.gui.eula.title": "《RPMTW宇宙チャットシステムエンドユーザーライセンス契約》", - "universeChat.rpmtw_platform_mod.gui.input.null": "メッセージは空欄にできません。", - "universeChat.rpmtw_platform_mod.gui.send": "宇宙チャットシステムにメッセージを送信する", - "universeChat.rpmtw_platform_mod.gui.what": "これは何ですか?", - "universeChat.rpmtw_platform_mod.open_avatar_url": "アバターのURLを開く", - "universeChat.rpmtw_platform_mod.status.banned": "IPが禁止されているため、メッセージを送信できません。", - "universeChat.rpmtw_platform_mod.status.phishing": "メッセージに不審なリンクが含まれていることをシステムが検出しているため、メッセージを送信できません。", - "universeChat.rpmtw_platform_mod.status.sending": "メッセージを送信中…", - "universeChat.rpmtw_platform_mod.status.success": "メッセージ送信に成功しました!", - "universeChat.rpmtw_platform_mod.status.unauthorized": "許可されていないアカウントであるか、証明書データが正しく処理されていないため、メッセージを送信できません。もう一度やり直してください。", - "universeChat.rpmtw_platform_mod.title": "宇宙チャット", - "gui.rpmtw_platform_mod.cancel": "キャンセル", - "gui.rpmtw_platform_mod.reply": "返信する", - "gui.rpmtw_platform_mod.self": "自身", - "gui.rpmtw_platform_mod.send": "送信", - "machineTranslation.rpmtw_platform_mod.status.exception": "例外エラーが発生しました。ステータスコード:%d。後でもう一度やり直してください。", - "machineTranslation.rpmtw_platform_mod.status.failed": "翻訳に失敗しました:%s", - "machineTranslation.rpmtw_platform_mod.status.rate_limit": "Google翻訳サーバーへの接続がレート制限を超えました(429)。しばらくしてからもう一度お試しください。", - "machineTranslation.rpmtw_platform_mod.status.translating": "翻訳中..." + "auth.rpmtw_platform_mod.title": "RPMTWアカウント", + "auth.rpmtw_platform_mod.button.login": "ログイン", + "auth.rpmtw_platform_mod.button.login.tooltip": "RPMTWアカウントでログインする。", + "auth.rpmtw_platform_mod.button.logout": "ログアウト", + "auth.rpmtw_platform_mod.status.failed": "ログインに失敗しました。\nそれでも失敗する場合は、RPMTW Discordにアクセスして\nhttps://discord.gg/5xApZtgV2u に問い合わせてください。", + "auth.rpmtw_platform_mod.status.logged_in": "既にログインしています。", + "auth.rpmtw_platform_mod.status.not_logged_in": "ログインしていません。", + "command.rpmtw_platform_mod.universeChatAction.getMessage.failed": "宇宙チャットのメッセージの受信に失敗しました。", + "config.rpmtw_platform_mod.category.default": "RPMTW Platform Mod 設定", + "config.rpmtw_platform_mod.option.base": "基本設定", + "config.rpmtw_platform_mod.option.universeChat": "宇宙チャット", + "config.rpmtw_platform_mod.option.universeChat.accountType": "アカウントタイプ", + "config.rpmtw_platform_mod.option.universeChat.accountType.@Tooltip": "RPMTWアカウントにログインしていない場合は、Minecraftのアカウントがデフォルトで使用されます", + "config.rpmtw_platform_mod.option.universeChat.enable": "宇宙チャットを有効にする", + "config.rpmtw_platform_mod.option.universeChat.enable.@Tooltip": "無効にすると、他の宇宙チャットオプションが上書きされ無効になります。", + "config.rpmtw_platform_mod.option.universeChat.enableButton": "ショートカットボタン", + "config.rpmtw_platform_mod.option.universeChat.enableButton.@Tooltip": "チャット画面で宇宙チャットのショートカットボタンを表示するかどうか。", + "config.rpmtw_platform_mod.option.universeChat.enableReceiveMessage": "メッセージを受信", + "config.rpmtw_platform_mod.option.universeChat.nickname": "ニックネーム", + "config.rpmtw_platform_mod.option.universeChat.nickname.@Tooltip": "宇宙チャットでのプレイヤーのニックネームです。", + "config.rpmtw_platform_mod.option.universeChat.blockUsers": "ブロックしたユーザーのリスト", + "config.rpmtw_platform_mod.option.universeChat.blockUsers.@Tooltip": "これらのユーザーからのメッセージはブロックされます。", + "config.rpmtw_platform_mod.option.keyBindings": "キーバインディング", + "config.rpmtw_platform_mod.option.keyBindings.config": "設定画面を開く", + "config.rpmtw_platform_mod.option.keyBindings.machineTranslation": "機械翻訳を使用", + "config.rpmtw_platform_mod.option.keyBindings.reloadTranslatePack": "翻訳リソースパックを再読み込み", + "config.rpmtw_platform_mod.option.keyBindings.openCrowdinPage": "Crowdinのページを開く", + "config.rpmtw_platform_mod.option.translate": "RPMTranslator", + "config.rpmtw_platform_mod.option.translate.autoMachineTranslation": "自動機械翻訳", + "config.rpmtw_platform_mod.option.translate.machineTranslation": "機械翻訳", + "config.rpmtw_platform_mod.option.translate.machineTranslation.@Tooltip": "人間による翻訳が利用できない場合、機械翻訳を使用してテキストを翻訳します。", + "config.rpmtw_platform_mod.option.translate.unlocalized": "ローカライズされないコンテンツ", + "config.rpmtw_platform_mod.option.translate.unlocalized.@Tooltip": "ローカライズされていないコンテンツの追加表示。ゲーム言語がアメリカ英語の場合は機能しません。", + "config.rpmtw_platform_mod.option.translate.loadTranslateResourcePack": "翻訳リソースパックをロード", + "config.rpmtw_platform_mod.option.translate.autoToggleLanguage": "言語を自動で切り替える", + "config.rpmtw_platform_mod.option.translate.autoToggleLanguage.@Tooltip": "OSの国/地域 言語設定に合わせて自動でゲームの言語を切り替えます。", + "config.rpmtw_platform_mod.option.advanced": "高度な設定", + "config.rpmtw_platform_mod.title": "RPMTW Platform 設定", + "universeChat.rpmtw_platform_mod.button.receive": "メッセージを受信", + "universeChat.rpmtw_platform_mod.button.receive.tooltip": "他の惑星からメッセージを受信します。", + "universeChat.rpmtw_platform_mod.button.send": "メッセージを送信", + "universeChat.rpmtw_platform_mod.gui.eula.agree": "同意します", + "universeChat.rpmtw_platform_mod.gui.eula.disagree": "同意しない", + "universeChat.rpmtw_platform_mod.gui.eula.subtitle": "宇宙チャットシステムを使用することにより、以下の条件に同意したことになります。", + "universeChat.rpmtw_platform_mod.gui.eula.text.2": "- メッセージ内でいかなる形態の嫌がらせを使用したり、宇宙チャットサーバーを攻撃するための手段を使用したりすることは許可されていません。", + "universeChat.rpmtw_platform_mod.gui.eula.text.3": "- UUID / IPは、確認とアカウントの禁止のみを目的として収集されます。", + "universeChat.rpmtw_platform_mod.gui.eula.text.4": "- これらの利用規約はいつでも変更される可能性があります(最新バージョンを表示するには、RPMTWの公式Webサイトにアクセスしてください)。", + "universeChat.rpmtw_platform_mod.gui.eula.title": "《RPMTW宇宙チャットシステムエンドユーザーライセンス契約》", + "universeChat.rpmtw_platform_mod.gui.input.null": "空のままメッセージを送信することはできません。", + "universeChat.rpmtw_platform_mod.gui.input.tooltip": "何か言いたい?", + "universeChat.rpmtw_platform_mod.gui.action": "メッセージアクション", + "universeChat.rpmtw_platform_mod.gui.action.reply": "返信", + "universeChat.rpmtw_platform_mod.gui.action.reply.tooltip": "%s に返信", + "universeChat.rpmtw_platform_mod.gui.action.blockUser": "ユーザーをブロック", + "universeChat.rpmtw_platform_mod.gui.action.blockUser.tooltip": "%s からのメッセージをブロック", + "universeChat.rpmtw_platform_mod.gui.send": "宇宙チャットシステムにメッセージを送信する", + "universeChat.rpmtw_platform_mod.gui.what": "ナニコレ?", + "universeChat.rpmtw_platform_mod.open_avatar_url": "アバターのURLを開く", + "universeChat.rpmtw_platform_mod.status.banned": "IPが禁止されているため、メッセージを送信できません。", + "universeChat.rpmtw_platform_mod.status.phishing": "メッセージに不審なリンクが含まれていることをシステムが検出しているため、メッセージを送信できません。", + "universeChat.rpmtw_platform_mod.status.sending": "メッセージを送信中…", + "universeChat.rpmtw_platform_mod.status.success": "メッセージ送信に成功しました!", + "universeChat.rpmtw_platform_mod.status.unauthorized": "許可されていないアカウントであるか、証明書データが正しく処理されていないため、メッセージを送信できません。もう一度やり直してください。", + "universeChat.rpmtw_platform_mod.title": "宇宙チャット", + "gui.rpmtw_platform_mod.cancel": "キャンセル", + "gui.rpmtw_platform_mod.reply": "返信する", + "gui.rpmtw_platform_mod.self": "自身", + "gui.rpmtw_platform_mod.send": "送信", + "gui.rpmtw_platform_mod.close": "閉じる", + "gui.rpmtw_platform_mod_open_link": "リンクを開く", + "machineTranslation.rpmtw_platform_mod.status.exception": "例外エラーが発生しました。ステータスコード:%d。後でもう一度やり直してください。", + "machineTranslation.rpmtw_platform_mod.status.failed": "翻訳に失敗しました:%s", + "machineTranslation.rpmtw_platform_mod.status.rate_limit": "Google翻訳サーバーへの接続がレート制限を超えました(429)。しばらくしてからもう一度お試しください。", + "machineTranslation.rpmtw_platform_mod.status.translating": "翻訳中..." } \ No newline at end of file diff --git a/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_cn.json b/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_cn.json index c9362b2e..2fe4149a 100644 --- a/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_cn.json +++ b/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_cn.json @@ -38,6 +38,9 @@ "config.rpmtw_platform_mod.option.translate.unlocalized": "未本地化的内容", "config.rpmtw_platform_mod.option.translate.unlocalized.@Tooltip": "额外显示未本地化的内容,若游戏语言为美国英语将不会起作用。", "config.rpmtw_platform_mod.option.translate.loadTranslateResourcePack": "加载翻译资源包", + "config.rpmtw_platform_mod.option.translate.loadTranslateResourcePack.@Tooltip": "加载翻译资源包翻译模组和其他内容,只有在游戏语言是繁体中文时才会启用。", + "config.rpmtw_platform_mod.option.translate.autoToggleLanguage": "自动切换语言", + "config.rpmtw_platform_mod.option.translate.autoToggleLanguage.@Tooltip": "自动切换游戏语言到电脑系统使用的语言", "config.rpmtw_platform_mod.option.advanced": "高级设置", "config.rpmtw_platform_mod.option.advanced.sendExceptionToSentry": "發送本模組的例外錯誤至 Sentry", "config.rpmtw_platform_mod.option.advanced.sendExceptionToSentry.@Tooltip": "发送本模组的例外错误至 Sentry 以协助我们改善本模组。(所有资料将会被去识别化并且我们不会将其用于其他用途。)", @@ -75,8 +78,10 @@ "gui.rpmtw_platform_mod.self": "自己", "gui.rpmtw_platform_mod.send": "发送", "gui.rpmtw_platform_mod.close": "关闭", + "gui.rpmtw_platform_mod_open_link": "打开链接", "machineTranslation.rpmtw_platform_mod.status.exception": "发生异常错误,状态码:%d。请稍后再试。", "machineTranslation.rpmtw_platform_mod.status.failed": "翻译失败:%s", "machineTranslation.rpmtw_platform_mod.status.rate_limit": "连接到Google翻译服务器已超过速率限制(429),请稍后再试。", - "machineTranslation.rpmtw_platform_mod.status.translating": "正在翻译..." + "machineTranslation.rpmtw_platform_mod.status.translating": "正在翻译...", + "messages.rpmtw_platform_mod.thanks": "§7-----------------------------------------------------\n§f感谢你使用RPMTW Platform Mod,若有任何问题或想和大家一起聊天欢迎加入我们的 Discord 社群。\n\n§f官方网址:%s\n§f官方 Discord 社群:%s\n\n§f此外,如要自定义此模组,可按下 %s 键进入设定界面。\n§7-----------------------------------------------------" } \ No newline at end of file diff --git a/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_hk.json b/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_hk.json index 83da5277..7e19caf2 100644 --- a/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_hk.json +++ b/common/src/main/resources/assets/rpmtw_platform_mod/lang/zh_hk.json @@ -38,6 +38,9 @@ "config.rpmtw_platform_mod.option.translate.unlocalized": "打開原文顯示", "config.rpmtw_platform_mod.option.translate.unlocalized.@Tooltip": "額外顯示未本地化嘅內容,若遊戲語言為美國英語將不會起作用", "config.rpmtw_platform_mod.option.translate.loadTranslateResourcePack": "載入翻譯資源包", + "config.rpmtw_platform_mod.option.translate.loadTranslateResourcePack.@Tooltip": "加載翻譯資源包翻譯模組同埋其他內容,只有在遊戲語言是繁體中文時先會啟用。", + "config.rpmtw_platform_mod.option.translate.autoToggleLanguage": "自動切換語言", + "config.rpmtw_platform_mod.option.translate.autoToggleLanguage.@Tooltip": "自動切換遊戲語言到電腦系統使用嘅語言", "config.rpmtw_platform_mod.option.advanced": "進階設定", "config.rpmtw_platform_mod.option.advanced.sendExceptionToSentry": "發送本 Mod 例外錯誤至 Sentry", "config.rpmtw_platform_mod.option.advanced.sendExceptionToSentry.@Tooltip": "發送本 Mod 嘅例外錯誤至 Sentry 以協助我哋改善本 Mod。(所有資料將被去識別化,並且不會將其用於其他用途。)", @@ -75,8 +78,10 @@ "gui.rpmtw_platform_mod.self": "自己", "gui.rpmtw_platform_mod.send": "發送", "gui.rpmtw_platform_mod.close": "關閉", + "gui.rpmtw_platform_mod_open_link": "開啓鏈結", "machineTranslation.rpmtw_platform_mod.status.exception": "發生例外錯誤,狀態碼:%d,請稍候再試。", "machineTranslation.rpmtw_platform_mod.status.failed": "翻譯失敗:%s", "machineTranslation.rpmtw_platform_mod.status.rate_limit": "與 Google 翻譯伺服器嘅連接已超過速率限制(429)。請稍後再試。", - "machineTranslation.rpmtw_platform_mod.status.translating": "翻譯中..." + "machineTranslation.rpmtw_platform_mod.status.translating": "翻譯中...", + "messages.rpmtw_platform_mod.thanks": "§7-----------------------------------------------------\n§f感謝使用 RPMTW Platform Mod,如果你有任何問題,歡迎加入我地個 Discord 社群伺服器。\n\n§f官方網址:%s\n§f官方 Discord 社群:%s\n\n§f此外,如果你想要調整本模組的設定,按 %s 鍵能夠將其開啓。\n§7-----------------------------------------------------" } \ No newline at end of file diff --git a/fabric-like/build.gradle.kts b/fabric-like/build.gradle.kts index d19f299f..2b60d1db 100644 --- a/fabric-like/build.gradle.kts +++ b/fabric-like/build.gradle.kts @@ -2,25 +2,15 @@ architectury { common(project.property("enabled_platforms").toString().split(",")) } -val common by configurations.registering -configurations { - compileClasspath { - extendsFrom(common.get()) - } - - runtimeClasspath { - extendsFrom(common.get()) - } -} - repositories { mavenCentral() maven { - url = uri("https://bai.jfrog.io/artifactory/maven") //ModMenu + url = uri("https://maven.terraformersmc.com") //ModMenu content { includeGroup("com.terraformersmc") } } + maven { // Patchouli url = uri("https://maven.blamejared.com") @@ -37,11 +27,11 @@ dependencies { modImplementation("vazkii.patchouli:Patchouli:${project.property("patchouli_version")}-FABRIC") modImplementation("com.terraformersmc:modmenu:${project.property("modmenu_version")}") - "compileClasspath"(project(path = ":common", configuration = "namedElements")) { isTransitive = false } + implementation(project(path = ":common", configuration = "namedElements")) { isTransitive = false } } val accessWidenerFile = project(":common").file("src/main/resources/rpmtw_platform_mod.accesswidener") loom { accessWidenerPath.set(accessWidenerFile) -} \ No newline at end of file +} diff --git a/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookContentClasspathLoader.java b/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookContentClasspathLoader.java index 3d069342..2ee51cc2 100644 --- a/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookContentClasspathLoader.java +++ b/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookContentClasspathLoader.java @@ -33,23 +33,19 @@ private void findFiles(Book book, String dir, List list, Callb String prefix = String.format("%s/%s/%s/%s", BookRegistry.BOOKS_LOCATION, book.id.getPath(), BookContentsBuilder.DEFAULT_LANG, dir); Collection files = Minecraft.getInstance().getResourceManager().listResources(prefix, p -> p.endsWith(".json")); - files.stream() - .distinct() - .filter(file -> file.getNamespace().equals(book.id.getNamespace())) - .map(file -> { - // caller expects list to contain logical id's, not file paths. - // we end up going from path -> id -> back to path, but it's okay as a transitional measure - Preconditions.checkArgument(file.getPath().startsWith(prefix)); - Preconditions.checkArgument(file.getPath().endsWith(".json")); - String newPath = file.getPath().substring(prefix.length(), file.getPath().length() - ".json".length()); - // Vanilla expects `prefix` above to not have a trailing slash, so we - // have to remove it ourselves from the path - if (newPath.startsWith("/")) { - newPath = newPath.substring(1); - } - return new ResourceLocation(file.getNamespace(), newPath); - }) - .forEach(list::add); + files.stream().distinct().filter(file -> file.getNamespace().equals(book.id.getNamespace())).map(file -> { + // caller expects list to contain logical id's, not file paths. + // we end up going from path -> id -> back to path, but it's okay as a transitional measure + Preconditions.checkArgument(file.getPath().startsWith(prefix)); + Preconditions.checkArgument(file.getPath().endsWith(".json")); + String newPath = file.getPath().substring(prefix.length(), file.getPath().length() - ".json".length()); + // Vanilla expects `prefix` above to not have a trailing slash, so we + // have to remove it ourselves from the path + if (newPath.startsWith("/")) { + newPath = newPath.substring(1); + } + return new ResourceLocation(file.getNamespace(), newPath); + }).forEach(list::add); } @Inject(at = @At("HEAD"), method = "loadJson", cancellable = true, remap = false) diff --git a/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookRegistry.java b/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookRegistry.java index 116b89b2..5b78fc89 100644 --- a/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookRegistry.java +++ b/fabric-like/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/fabriclike/MixinBookRegistry.java @@ -23,8 +23,6 @@ public class MixinBookRegistry { @Final @Shadow public final Map books = new HashMap<>(); - @Shadow - private boolean loaded = false; @Inject(method = "reloadContents", at = @At("HEAD"), cancellable = true) public void reloadContents(boolean resourcePackBooksOnly, CallbackInfo ci) { @@ -33,7 +31,6 @@ public void reloadContents(boolean resourcePackBooksOnly, CallbackInfo ci) { book.reloadContents(false); } ClientBookRegistry.INSTANCE.reloadLocks(false); - loaded = true; ci.cancel(); } } \ No newline at end of file diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 951ef374..8674da14 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -6,11 +6,12 @@ architectury { repositories { mavenCentral() maven { - url = uri("https://bai.jfrog.io/artifactory/maven") //ModMenu + url = uri("https://maven.terraformersmc.com") //ModMenu content { includeGroup("com.terraformersmc") } } + maven { // Patchouli url = uri("https://maven.blamejared.com") @@ -65,18 +66,18 @@ dependencies { modImplementation("com.terraformersmc:modmenu:${project.property("modmenu_version")}") } -val accessWidenerFile = project(":common").file("src/main/resources/rpmtw_platform_mod.accesswidener") +val accessWidenerFile: File = project(":common").file("src/main/resources/rpmtw_platform_mod.accesswidener") loom { accessWidenerPath.set(accessWidenerFile) } tasks { - val resourcesPath = file("src/main/resources") + val generatedResourcesPath = file("src/generated/resources") // The access widener file is needed in :fabric project resources when the game is run. val copyAccessWidener by registering(Copy::class) { from(accessWidenerFile) - into(resourcesPath) + into(generatedResourcesPath) } processResources { @@ -94,4 +95,4 @@ tasks { from(commonSources.get().archiveFile.map { zipTree(it) }) exclude("rpmtw_platform_mod.accesswidener") } -} \ No newline at end of file +} diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts index 7554c136..c7574abd 100644 --- a/forge/build.gradle.kts +++ b/forge/build.gradle.kts @@ -21,19 +21,15 @@ dependencies { // Mod required mod dependencies implementation("thedarkcolour:kotlinforforge:${project.property("kotlin_forge_version").toString()}") - modApi("dev.architectury:architectury-forge:${project.property("architectury_version").toString()}") - modApi("me.shedaniel.cloth:cloth-config-forge:${project.property("cloth_config_version").toString()}") + modLocalRuntime("dev.architectury:architectury-forge:${project.property("architectury_version").toString()}") + modLocalRuntime("me.shedaniel.cloth:cloth-config-forge:${project.property("cloth_config_version").toString()}") // Optional mod dependencies modApi("vazkii.patchouli:Patchouli:${project.property("patchouli_version")}:api") modApi("vazkii.patchouli:Patchouli:${project.property("patchouli_version")}") // Dependencies for the mod - bundle( - "com.github.RPMTW:RPMTW-API-Client-Kotlin:${ - project.property("rpmtw_api_client_version").toString() - }" - ) { + bundle("com.github.RPMTW:RPMTW-API-Client-Kotlin:${project.property("rpmtw_api_client_version").toString()}") { exclude("com.google.code.gson") exclude("org.jetbrains.kotlinx") exclude("org.jetbrains.kotlin") @@ -48,8 +44,8 @@ dependencies { ) ) - forgeRuntimeLibrary(kotlin("stdlib-jdk8", version = "1.6.10")) - forgeRuntimeLibrary(kotlin("reflect", version = "1.6.10")) + forgeRuntimeLibrary(kotlin("stdlib-jdk8", version = "1.7.22")) + forgeRuntimeLibrary(kotlin("reflect", version = "1.7.22")) forgeRuntimeLibrary("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") "common"(project(path = ":common", configuration = "namedElements")) { isTransitive = false } diff --git a/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookContentClasspathLoader.java b/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookContentClasspathLoader.java index 6a223f6b..ce4641c4 100644 --- a/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookContentClasspathLoader.java +++ b/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookContentClasspathLoader.java @@ -33,23 +33,19 @@ private void findFiles(Book book, String dir, List list, Callb String prefix = String.format("%s/%s/%s/%s", BookRegistry.BOOKS_LOCATION, book.id.getPath(), BookContentsBuilder.DEFAULT_LANG, dir); Collection files = Minecraft.getInstance().getResourceManager().listResources(prefix, p -> p.endsWith(".json")); - files.stream() - .distinct() - .filter(file -> file.getNamespace().equals(book.id.getNamespace())) - .map(file -> { - // caller expects list to contain logical id's, not file paths. - // we end up going from path -> id -> back to path, but it's okay as a transitional measure - Preconditions.checkArgument(file.getPath().startsWith(prefix)); - Preconditions.checkArgument(file.getPath().endsWith(".json")); - String newPath = file.getPath().substring(prefix.length(), file.getPath().length() - ".json".length()); - // Vanilla expects `prefix` above to not have a trailing slash, so we - // have to remove it ourselves from the path - if (newPath.startsWith("/")) { - newPath = newPath.substring(1); - } - return new ResourceLocation(file.getNamespace(), newPath); - }) - .forEach(list::add); + files.stream().distinct().filter(file -> file.getNamespace().equals(book.id.getNamespace())).map(file -> { + // caller expects list to contain logical id's, not file paths. + // we end up going from path -> id -> back to path, but it's okay as a transitional measure + Preconditions.checkArgument(file.getPath().startsWith(prefix)); + Preconditions.checkArgument(file.getPath().endsWith(".json")); + String newPath = file.getPath().substring(prefix.length(), file.getPath().length() - ".json".length()); + // Vanilla expects `prefix` above to not have a trailing slash, so we + // have to remove it ourselves from the path + if (newPath.startsWith("/")) { + newPath = newPath.substring(1); + } + return new ResourceLocation(file.getNamespace(), newPath); + }).forEach(list::add); } @Inject(at = @At("HEAD"), method = "loadJson", cancellable = true, remap = false) diff --git a/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookRegistry.java b/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookRegistry.java index 12573ced..7abee8af 100644 --- a/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookRegistry.java +++ b/forge/src/main/java/com/rpmtw/rpmtw_platform_mod/mixins/forge/MixinBookRegistry.java @@ -23,8 +23,6 @@ public class MixinBookRegistry { @Final @Shadow public final Map books = new HashMap<>(); - @Shadow - private boolean loaded = false; @Inject(method = "reloadContents", at = @At("HEAD"), cancellable = true) public void reloadContents(boolean resourcePackBooksOnly, CallbackInfo ci) { @@ -33,7 +31,6 @@ public void reloadContents(boolean resourcePackBooksOnly, CallbackInfo ci) { book.reloadContents(false); } ClientBookRegistry.INSTANCE.reloadLocks(false); - loaded = true; ci.cancel(); } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 0f3a7a08..73b95237 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.18.1 enabled_platforms=fabric,forge archives_base_name=rpmtw-platform-mod-1.18.1 -mod_version=1.5.4 +mod_version=1.5.8 maven_group=com.rpmtw.rpmtw_platform_mod architectury_version=3.9.66 # yarn_version=1.18.1+build.22 @@ -14,7 +14,6 @@ architectury_version=3.9.66 fabric_loader_version=0.14.10 fabric_api_version=0.46.6+1.18 fabric-kotlin_version=1.8.1+kotlin.1.7.0 - # Forge # https://files.minecraftforge.net/net/minecraftforge/forge/ forge_version=1.18.1-39.1.2 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661e..fae08049 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/quilt/build.gradle.kts b/quilt/build.gradle.kts index ef889c46..37cf73bb 100644 --- a/quilt/build.gradle.kts +++ b/quilt/build.gradle.kts @@ -7,15 +7,11 @@ repositories { mavenCentral() maven { - url = uri("https://bai.jfrog.io/artifactory/maven") //ModMenu + url = uri("https://maven.terraformersmc.com") //ModMenu content { includeGroup("com.terraformersmc") } } - maven { - // Patchouli - url = uri("https://maven.blamejared.com") - } } architectury { @@ -23,6 +19,12 @@ architectury { loader("quilt") } +val accessWidenerFile = project(":common").file("src/main/resources/rpmtw_platform_mod.accesswidener") + +loom { + accessWidenerPath.set(accessWidenerFile) +} + val common by configurations.registering configurations { compileClasspath { @@ -36,12 +38,6 @@ configurations { getByName("developmentQuilt").extendsFrom(common.get()) } -val accessWidenerFile = project(":common").file("src/main/resources/rpmtw_platform_mod.accesswidener") - -loom { - accessWidenerPath.set(accessWidenerFile) -} - dependencies { modImplementation("org.quiltmc:quilt-loader:${project.property("quilt_loader_version")}") modImplementation("org.quiltmc:qsl:${project.property("qsl_version")}+${project.property("minecraft_version")}") @@ -69,10 +65,6 @@ dependencies { exclude(group = "net.fabricmc.fabric-api") } - modImplementation("vazkii.patchouli:Patchouli:${project.property("patchouli_version")}-FABRIC") { - exclude(group = "net.fabricmc") - exclude(group = "net.fabricmc.fabric-api") - } modImplementation("com.terraformersmc:modmenu:${project.property("modmenu_version")}") { exclude(group = "net.fabricmc") exclude(group = "net.fabricmc.fabric-api") @@ -103,11 +95,11 @@ dependencies { } tasks { - val resourcesPath = file("src/main/resources") + val generatedResourcesPath = file("src/generated/resources") // The access widener file is needed in :quilt project resources when the game is run. val copyAccessWidener by registering(Copy::class) { from(accessWidenerFile) - into(resourcesPath) + into(generatedResourcesPath) } processResources { diff --git a/settings.gradle.kts b/settings.gradle.kts index 3abd5a0d..e7032a26 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,4 +12,4 @@ include("fabric-like") include("fabric") include("forge") -rootProject.name = "rpmtw-platform-mod" \ No newline at end of file +rootProject.name = "rpmtw-platform-mod"