diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b01da52..84c84ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: - name: checkout repository uses: actions/checkout@v4 - name: validate gradle wrapper - uses: gradle/wrapper-validation-action@v2 + uses: gradle/actions/wrapper-validation@v3 - name: setup jdk ${{ matrix.java }} uses: actions/setup-java@v4 with: diff --git a/README.md b/README.md index 6e368b1..63da0f0 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ ## 模组信息 - 加载器: Fabric (版本: ≥ 0.16.7) - 支持版本: + - 1.16 - 1.18.2 - 1.19.2 - 1.19.4 @@ -11,29 +12,30 @@ - 1.20.6 - 1.21 - 1.21.1 + - 1.21.11 - 前置模组: Fabric API ## 配置文件介绍 ```json -{"address":"http://localhost:8080/","order":"default","updatePeriod":60} +{"ip":"http://localhost:8080/","order":"default","updatePeriod":60} ``` 说明: -- `address`: 服务器列表同步地址 +- `ip`: 服务器列表同步地址 - `order`: 服务器列表排序方式, 可选值: `default` (默认排序), `reverse` (倒序), `alphabetical` (字母序), `random` (随机排序) - `updatePeriod`: 服务器列表更新间隔, 单位: 秒 ## 服务器列表格式参照 -此处的格式指的是上文配置文件中 `address` 字段中填写的地址所返回的服务器列表格式 +此处的格式指的是上文配置文件中 `ip` 字段中填写的地址所返回的服务器列表格式 ```json { "servers": [ { "name": "Sample #1", - "address": "localhost:25565" + "ip": "localhost:25565" }, { "name": "Hypixel", - "address": "mc.hypixel.net" + "ip": "mc.hypixel.net" } ] } @@ -41,12 +43,12 @@ 说明: - `servers`: 服务器列表,将所有需要添加的服务器放在这个列表里 - `name`: 服务器名称 -- `address`: 服务器地址 +- `ip`: 服务器地址 ## 开源协议 - 本模组遵循 [LGPL-3.0](https://www.gnu.org/licenses/lgpl-3.0.html) 协议 - 最终解释权归 **MCJPG组织** 所有 ## 贡献 -- 本模组核心开发者为 **alazeprt**, 由 **MCJPG组织** 进行发行 +- 本模组核心开发者为 **alazeprt,LonelySail**, 由 **MCJPG组织** 进行发行 - 欢迎提交 [Issue](https://github.com/MineJPGCraft/ServerListSync/issues) 或 [Pull Request](https://github.com/MineJPGCraft/ServerListSync/pulls) \ No newline at end of file diff --git a/build.gradle b/build.gradle index c9a38b4..9bc3927 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.8-SNAPSHOT' + id 'fabric-loom' version '1.13-SNAPSHOT' id 'maven-publish' } @@ -46,6 +46,9 @@ dependencies { // Mod Menu modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" + // Apache HttpClient for HttpUtil + modImplementation include("org.apache.httpcomponents:httpclient:4.5.14") + } processResources { @@ -100,4 +103,4 @@ remapJar { remapSourcesJar { archiveFileName.set("serverlistsync-fabric-${minecraft_version}-${version}-sources.jar") -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index b2a1ace..b43dc8e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,15 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.1 -yarn_mappings=1.21.1+build.3 -loader_version=0.16.7 +minecraft_version=1.21.11 +yarn_mappings=1.21.11+build.4 +loader_version=0.18.4 # Mod Properties -mod_version=1.0.2 +mod_version=1.0.3 maven_group=top.alazeprt.sls archives_base_name=serverlistsync # Dependencies -fabric_version=0.106.0+1.21.1 +fabric_version=0.141.3+1.21.11 modmenu_version=11.0.3 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9..1b33c55 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df97d72..d4081da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index f5feea6..23d15a9 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/serverlistsync.json b/serverlistsync.json deleted file mode 100644 index 9748411..0000000 --- a/serverlistsync.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "servers": [ - { - "name": "Craft233", - "address": "mc.craft233.top" - }, - { - "name": "BugCraft", - "address": "play.bugcraft.org" - }, - { - "name": "Minecraft MCIC", - "address": "mcs.mcic.us.kg" - }, - { - "name": "风河 | WindyRiver", - "address": "mc.windyriver.top" - }, - { - "name": "Ocean Network 服务器", - "address": "mc26.rhymc.com:20049" - }, - { - "name": "EternalStar", - "address": "etstmc.cn" - }, - { - "name": "HappyDog", - "address": "happydog.us.kg" - }, - { - "name": "MC生电服", - "address": "mc.zhuyuxuan.link" - } - ] -} diff --git a/src/client/java/top/alazeprt/sls/ServerListSyncClient.java b/src/client/java/top/alazeprt/sls/ServerListSyncClient.java index 0597ba6..e839292 100644 --- a/src/client/java/top/alazeprt/sls/ServerListSyncClient.java +++ b/src/client/java/top/alazeprt/sls/ServerListSyncClient.java @@ -38,7 +38,11 @@ public class ServerListSyncClient implements ClientModInitializer { try { ServerListSync.serverInfosJson.clear(); for (JsonElement element : result.getAsJsonArray("servers")) { - ServerListSync.serverInfosJson.add(element); + if (element.getAsJsonObject().has("ip") && element.getAsJsonObject().has("name")) { + ServerListSync.serverInfosJson.add(element); + continue; + } + threadLogger.error("Error occurred while parsing server information: {} ; ip or name is empty", new Gson().toJson(element)); } synchronized (serverInfos) { serverInfos.clear(); } updateServerInfos(); @@ -59,7 +63,7 @@ public void onInitializeClient() { public static synchronized void updateServerInfos() { for (JsonElement element : ServerListSync.serverInfosJson) { serverInfos.add(new ServerInfo(element.getAsJsonObject().get("name").getAsString(), - element.getAsJsonObject().get("address").getAsString(), ServerInfo.ServerType.OTHER)); + element.getAsJsonObject().get("ip").getAsString(), ServerInfo.ServerType.OTHER)); } if (SLSConfig.order.equals(ServerOrder.REVERSE)) Collections.reverse(serverInfos); if (SLSConfig.order.equals(ServerOrder.ALPHABETICAL)) { diff --git a/src/client/java/top/alazeprt/sls/screen/SLSConfigScreen.java b/src/client/java/top/alazeprt/sls/screen/SLSConfigScreen.java index 75adc04..7b7d16d 100644 --- a/src/client/java/top/alazeprt/sls/screen/SLSConfigScreen.java +++ b/src/client/java/top/alazeprt/sls/screen/SLSConfigScreen.java @@ -87,11 +87,15 @@ protected void init() { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - super.render(context, mouseX, mouseY, delta); + // 1. 先渲染所有子组件 (按钮、输入框等) context.drawTextWithShadow(textRenderer, Text.literal("服务器地址"), width/2-170, height*2/9+5, 0xffffff); context.drawTextWithShadow(textRenderer, Text.literal("排序方式"), width/2-170, (int) (height*3.5/9+5), 0xffffff); context.drawTextWithShadow(textRenderer, Text.literal("更新时间"), width/2-170, height*5/9+5, 0xffffff); context.drawCenteredTextWithShadow(textRenderer, Text.literal("ServerListSync 配置界面"), width/2, height/9, 0xffffff); + + super.render(context, mouseX, mouseY, delta); + + System.out.println("SLSConfigScreen.render() 被调用"); } @Override diff --git a/src/main/java/top/alazeprt/sls/ServerListSync.java b/src/main/java/top/alazeprt/sls/ServerListSync.java index ad4897e..4ad1646 100644 --- a/src/main/java/top/alazeprt/sls/ServerListSync.java +++ b/src/main/java/top/alazeprt/sls/ServerListSync.java @@ -40,7 +40,11 @@ public void onInitialize() { if (result.get("error") == null) { try { for (JsonElement element : result.getAsJsonArray("servers")) { - serverInfosJson.add(element); + if (!element.getAsJsonObject().has("ip") || !element.getAsJsonObject().has("name")) { + serverInfosJson.add(element); + continue; + } + LOGGER.error("Error occurred while parsing server information: {} ; ip or name is empty", new Gson().toJson(element)); } } catch (Exception e) { LOGGER.error("Error occurred while parsing server information: {} ; Exception: {}", new Gson().toJson(result), e); diff --git a/src/main/java/top/alazeprt/sls/config/SLSConfig.java b/src/main/java/top/alazeprt/sls/config/SLSConfig.java index a871532..7edda6c 100644 --- a/src/main/java/top/alazeprt/sls/config/SLSConfig.java +++ b/src/main/java/top/alazeprt/sls/config/SLSConfig.java @@ -19,7 +19,7 @@ public class SLSConfig { private static final File configFile = new File("config", "serverlistsync.json"); private static final Gson gson = new Gson(); - public static String address = "https://ghp.ci/https://raw.githubusercontent.com/MineJPGcraft/ServerListSync/refs/heads/master/serverlistsync.json"; + public static String address = "https://serverlist.mcjpg.org/servers.json"; public static ServerOrder order = ServerOrder.RANDOM; public static int updatePeriod = 60; @@ -46,6 +46,6 @@ public static void save() throws IOException { private static void initialize() throws IOException { Files.createDirectories(configFile.getParentFile().toPath()); - Files.writeString(configFile.toPath(), "{\"address\":\"https://ghp.ci/https://raw.githubusercontent.com/MineJPGcraft/ServerListSync/refs/heads/master/serverlistsync.json\",\"order\":\"random\",\"updatePeriod\":60}", StandardCharsets.UTF_8); + Files.writeString(configFile.toPath(), "{\"address\":\"https://serverlist.mcjpg.org/servers.json\",\"order\":\"random\",\"updatePeriod\":60}", StandardCharsets.UTF_8); } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3ee53d5..e4740f2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -29,8 +29,8 @@ } ], "depends": { - "fabricloader": ">=0.15.12", - "minecraft": "~1.21.1", + "fabricloader": ">=0.18.4", + "minecraft": "~1.21.11", "java": ">=21", "fabric-api": "*" },