Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
5eee4b4
重写服务器管理界面
CaaMoe Sep 20, 2026
008f783
还原distributionUrl, 更改服务器管理tab图标
CaaMoe Sep 21, 2026
3a3cbc0
添加服务器添加界面
CaaMoe Sep 22, 2026
f347fe6
add server status check
CaaMoe Sep 22, 2026
277ea3c
srv support
CaaMoe Sep 23, 2026
d6f1fd1
状态页
CaaMoe Sep 23, 2026
4c6139e
Merge remote-tracking branch 'hmcl_origin/main'
CaaMoe Sep 23, 2026
b9a32e0
update I18N_zh_Hant.properties
CaaMoe Sep 23, 2026
eadfaed
一些问题修复
CaaMoe Sep 24, 2026
c13f89f
修复当实例 servers.dat 不存在时,试图在启动器内添加、复制服务器会失败的问题
CaaMoe Sep 25, 2026
ee3dc67
状态页强制使用服务器当前所使用的最新图标
CaaMoe Sep 25, 2026
b155466
列表页显示服务器延迟
CaaMoe Sep 26, 2026
73670e0
在列表中显示服务器延迟以及dnd实现
CaaMoe Sep 26, 2026
387d40a
缩小状态对话框里的图标大小为多人游戏页面的图标大小
CaaMoe Sep 27, 2026
285f422
补充 Not Material 标记
CaaMoe Sep 27, 2026
5204574
补充 Tooltip 以及补充更多的便捷按钮
CaaMoe Sep 27, 2026
ec06952
补充 ServerStatus 所有可能存在的字段
CaaMoe Sep 27, 2026
a0512ec
使用 ReadOnlyObjectWrapper 包装 ServerStatusPane 的 ServerStatus
CaaMoe Sep 27, 2026
0709a78
修复 StatusPane 一处问题
CaaMoe Sep 27, 2026
58b6c0c
删除 ServerStatus 内对 description 的封装
CaaMoe Sep 28, 2026
8c8d35e
限制 txt name 可输入的最大长度为 32
CaaMoe Sep 28, 2026
728a0e1
状态框补充更多有用的信息
CaaMoe Sep 28, 2026
3881aec
同步和更新翻译内容
CaaMoe Sep 28, 2026
c0bc41e
输出硬编码的内容
CaaMoe Sep 28, 2026
2a56e26
update I18N_zh_Hant.properties
CaaMoe Sep 28, 2026
9ca3c2b
还原 distributionUrl
CaaMoe Sep 28, 2026
dfcf2ac
重新排列翻译
CaaMoe Sep 28, 2026
75a36f2
补充原版悬浮显示玩家的功能,以及新增悬浮显示mod信息的功能
CaaMoe Sep 29, 2026
cc1b945
更新翻译内容
CaaMoe Sep 29, 2026
a4e18ee
Update HMCL/src/main/resources/assets/lang/I18N_zh_Hans.properties
CaaMoe Sep 29, 2026
4b69adf
限制ping任务数量, 列表和状态弹窗共用Property
CaaMoe Sep 29, 2026
9fe33eb
当获取服务器状态失败后,打开服务器状态界面时重新获取服务器状态
CaaMoe Sep 29, 2026
709d799
Merge remote-tracking branch 'hmcl_origin/main'
CaaMoe Sep 30, 2026
33bb487
适配26.4快照1新连接协议
CaaMoe Oct 1, 2026
878e8fa
修复编辑服务器返回上一步时会将当前编辑的内容丢弃
CaaMoe Oct 1, 2026
74ed47f
设置服务器ip包含的query参数在服务器列表中隐藏,在状态页面中显示为半透明状态
CaaMoe Oct 1, 2026
438f1a8
Update ServerAddressMaskHBox
CaaMoe Oct 1, 2026
2fb33bf
一些细节逻辑上的问题修复
CaaMoe Oct 1, 2026
08bff98
将服务器地址@前以及?后的内容设置为掩码,在状态界面中悬浮显示
CaaMoe Oct 1, 2026
ec6d18f
修复其他界面的一些问题
CaaMoe Oct 1, 2026
c4aaa25
列表服务器地址标签应用subtitle样式
CaaMoe Oct 1, 2026
1ded58c
修复 acceptTextures 与原版行为保持一致
CaaMoe Oct 1, 2026
a16214a
修复 ServerAddress.fromString 尽量与原版行为保持一致
CaaMoe Oct 1, 2026
fc29747
限制ping包接收的大小
CaaMoe Oct 2, 2026
6a26327
修复不自动更新servers.dat文件避免并发写入互相覆盖的问题
CaaMoe Oct 2, 2026
cd85d1a
调整 Server DnD Format
CaaMoe Oct 3, 2026
d11a822
Merge
CaaMoe Oct 5, 2026
3183b46
修复 Server DnD 没有判断 SCHEME
CaaMoe Oct 7, 2026
c4cd0a6
服务器地址掩码部分调整为悬浮显示
CaaMoe Oct 7, 2026
202d06c
重新调整 EditServerPane 界面操作逻辑
CaaMoe Oct 7, 2026
13ced33
update EditServerPane
CaaMoe Oct 7, 2026
9b01512
重新调整 ServerListPage 对数据的处理
CaaMoe Oct 7, 2026
ed0d681
细节问题修复
CaaMoe Oct 7, 2026
2c2b684
细节问题修复
CaaMoe Oct 7, 2026
9195379
当当前界面为 ServerListPage 时,拖拽添加服务器时不再重新打开当前界面
CaaMoe Oct 7, 2026
3073d34
ping error 添加自定义样式
CaaMoe Oct 8, 2026
8892f20
update server pinger
CaaMoe Oct 8, 2026
c6425c9
merge
CaaMoe Oct 8, 2026
53d6c4a
server status pane 重新调整样式
CaaMoe Oct 8, 2026
b6ec4ee
update ServerListPage
CaaMoe Oct 9, 2026
f379b7e
Legacy ping support
CaaMoe Oct 9, 2026
f7bfff4
修复 Legacy ping 未捕获报错导致的一系列问题
CaaMoe Oct 9, 2026
ccf0787
ping协议兼容到b1.8
CaaMoe Oct 9, 2026
9b5ddfc
merge
CaaMoe Oct 9, 2026
fd3396b
ping协议向下兼容到b1.8
CaaMoe Oct 9, 2026
ae6d926
显示未知的协议
CaaMoe Oct 9, 2026
9330b90
服务器列表页加上搜索框
CaaMoe Oct 9, 2026
b47379d
修复服务器列表页按esc返回不了主界面的问题
CaaMoe Oct 9, 2026
693911f
ServerListPage多选支持
CaaMoe Oct 10, 2026
16a6433
支持编辑服务器资源包状态
CaaMoe Oct 10, 2026
dab17b3
细节问题修复
CaaMoe Oct 10, 2026
d144ed9
update ServerListPage
CaaMoe Oct 10, 2026
7d57517
细节问题修复
CaaMoe Oct 10, 2026
f03642b
参考原版行为调整 EditServerPane 的 validator
CaaMoe Oct 10, 2026
cb6ac86
也不允许空host
CaaMoe Oct 10, 2026
25b7574
启动参数添加对 26.4-snapshot-1 带参数的服务器地址的支持
CaaMoe Oct 10, 2026
e5a5736
快速游玩中ServerIPField字段设置Validator为MinecraftServerAddressValidator
CaaMoe Oct 10, 2026
26510d2
merge
CaaMoe Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions HMCL/src/main/java/org/jackhuang/hmcl/ui/SVG.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ public enum SVG {
SCRIPT("M14,20A2,2 0 0,0 16,18V5H9A1,1 0 0,0 8,6V16H5V5A3,3 0 0,1 8,2H19A3,3 0 0,1 22,5V6H18V18L18,19A3,3 0 0,1 15,22H5A3,3 0 0,1 2,19V18H12A2,2 0 0,0 14,20Z"), // Not Material
SEARCH("M19.6 21 13.3 14.7Q12.55 15.3 11.575 15.65T9.5 16Q6.775 16 4.8875 14.1125T3 9.5Q3 6.775 4.8875 4.8875T9.5 3Q12.225 3 14.1125 4.8875T16 9.5Q16 10.6 15.65 11.575T14.7 13.3L21 19.6 19.6 21ZM9.5 14Q11.375 14 12.6875 12.6875T14 9.5Q14 7.625 12.6875 6.3125T9.5 5Q7.625 5 6.3125 6.3125T5 9.5Q5 11.375 6.3125 12.6875T9.5 14Z"),
SELECT_ALL("M7 17V7H17V17H7ZM9 15H15V9H9V15ZM5 19V21Q4.175 21 3.5875 20.4125T3 19H5ZM3 17V15H5V17H3ZM3 13V11H5V13H3ZM3 9V7H5V9H3ZM5 5H3Q3 4.175 3.5875 3.5875T5 3V5ZM7 21V19H9V21H7ZM7 5V3H9V5H7ZM11 21V19H13V21H11ZM11 5V3H13V5H11ZM15 21V19H17V21H15ZM15 5V3H17V5H15ZM19 21V19H21Q21 19.825 20.4125 20.4125T19 21ZM19 17V15H21V17H19ZM19 13V11H21V13H19ZM19 9V7H21V9H19ZM19 5V3Q19.825 3 20.4125 3.5875T21 5H19Z"),
SERVER_SIGNAL_0_BAR("M1 18.5v-3q0-.625.438-1.062T2.5 14t1.063.438T4 15.5v3q0 .625-.437 1.063T2.5 20t-1.062-.437T1 18.5"), // Not Material
SERVER_SIGNAL_1_BAR("M1 18.5v-3q0-.625.438-1.062T2.5 14t1.063.438T4 15.5v3q0 .625-.437 1.063T2.5 20t-1.062-.437T1 18.5 m4.75 0v-5q0-.625.438-1.062T7.25 12t1.063.438t.437 1.062v5q0 .625-.437 1.063T7.25 20t-1.062-.437T5.75 18.5"), // Not Material
SERVER_SIGNAL_2_BAR("M1 18.5v-3q0-.625.438-1.062T2.5 14t1.063.438T4 15.5v3q0 .625-.437 1.063T2.5 20t-1.062-.437T1 18.5 m4.75 0v-5q0-.625.438-1.062T7.25 12t1.063.438t.437 1.062v5q0 .625-.437 1.063T7.25 20t-1.062-.437T5.75 18.5 m4.75 0v-8q0-.625.438-1.062T12 9t1.063.438t.437 1.062v8q0 .625-.437 1.063T12 20t-1.062-.437T10.5 18.5"), // Not Material
SERVER_SIGNAL_3_BAR("M1 18.5v-3q0-.625.438-1.062T2.5 14t1.063.438T4 15.5v3q0 .625-.437 1.063T2.5 20t-1.062-.437T1 18.5 m4.75 0v-5q0-.625.438-1.062T7.25 12t1.063.438t.437 1.062v5q0 .625-.437 1.063T7.25 20t-1.062-.437T5.75 18.5 m4.75 0v-8q0-.625.438-1.062T12 9t1.063.438t.437 1.062v8q0 .625-.437 1.063T12 20t-1.062-.437T10.5 18.5 m4.75 0v-10q0-.625.438-1.062T16.75 7t1.063.438t.437 1.062v10q0 .625-.437 1.063T16.75 20t-1.062-.437t-.438-1.063"), // Not Material
SERVER_SIGNAL_FULL("M1 18.5v-3q0-.625.438-1.062T2.5 14t1.063.438T4 15.5v3q0 .625-.437 1.063T2.5 20t-1.062-.437T1 18.5 m4.75 0v-5q0-.625.438-1.062T7.25 12t1.063.438t.437 1.062v5q0 .625-.437 1.063T7.25 20t-1.062-.437T5.75 18.5 m4.75 0v-8q0-.625.438-1.062T12 9t1.063.438t.437 1.062v8q0 .625-.437 1.063T12 20t-1.062-.437T10.5 18.5 m4.75 0v-10q0-.625.438-1.062T16.75 7t1.063.438t.437 1.062v10q0 .625-.437 1.063T16.75 20t-1.062-.437t-.438-1.063m4.75 0v-13q0-.625.438-1.062T21.5 4t1.063.438T23 5.5v13q0 .625-.437 1.063T21.5 20t-1.062-.437T20 18.5"), // Not Material
SERVER_SIGNAL_ERROR("M10.5 18.5V14L1.75 7.875q-.425-.3-.513-.8t.213-.925t.812-.525t.938.2l17.6 12.35q.425.3.525.8t-.2.925t-.812.513t-.938-.213l-2.55-1.775h1.425v.075q0 .625-.437 1.063T16.75 20t-1.062-.437t-.438-1.063v-1.175L13.5 16.1v2.325q0 .675-.437 1.125T12 20t-1.062-.437T10.5 18.5m-9.5 0v-3q0-.625.438-1.062T2.5 14t1.063.438T4 15.5v3q0 .625-.437 1.063T2.5 20t-1.062-.437T1 18.5m4.75 0v-5q0-.625.438-1.062T7.25 12t1.063.438t.437 1.062v5q0 .625-.437 1.063T7.25 20t-1.062-.437T5.75 18.5m12.5-5.175l-3-2.1V8.5q0-.625.438-1.062T16.75 7t1.063.438t.437 1.062zM23 16.65l-3-2.1V5.5q0-.625.438-1.062T21.5 4t1.063.438T23 5.5z"), // Not Material
SETTINGS("M19.43 12.98C19.47 12.66 19.5 12.34 19.5 12 19.5 11.66 19.47 11.34 19.43 11.02L21.54 9.37C21.73 9.22 21.78 8.95 21.66 8.73L19.66 5.27C19.57 5.11 19.4 5.02 19.22 5.02 19.16 5.02 19.1 5.03 19.05 5.05L16.56 6.05C16.04 5.65 15.48 5.32 14.87 5.07L14.49 2.42C14.46 2.18 14.25 2 14 2H10C9.75 2 9.54 2.18 9.51 2.42L9.13 5.07C8.52 5.32 7.96 5.66 7.44 6.05L4.95 5.05C4.89 5.03 4.83 5.02 4.77 5.02 4.6 5.02 4.43 5.11 4.34 5.27L2.34 8.73C2.21 8.95 2.27 9.22 2.46 9.37L4.57 11.02C4.53 11.34 4.5 11.67 4.5 12 4.5 12.33 4.53 12.66 4.57 12.98L2.46 14.63C2.27 14.78 2.22 15.05 2.34 15.27L4.34 18.73C4.43 18.89 4.6 18.98 4.78 18.98 4.84 18.98 4.9 18.97 4.95 18.95L7.44 17.95C7.96 18.35 8.52 18.68 9.13 18.93L9.51 21.58C9.54 21.82 9.75 22 10 22H14C14.25 22 14.46 21.82 14.49 21.58L14.87 18.93C15.48 18.68 16.04 18.34 16.56 17.95L19.05 18.95C19.11 18.97 19.17 18.98 19.23 18.98 19.4 18.98 19.57 18.89 19.66 18.73L21.66 15.27C21.78 15.05 21.73 14.78 21.54 14.63L19.43 12.98ZM17.45 11.27C17.49 11.58 17.5 11.79 17.5 12 17.5 12.21 17.48 12.43 17.45 12.73L17.31 13.86 18.2 14.56 19.28 15.4 18.58 16.61 17.31 16.1 16.27 15.68 15.37 16.36C14.94 16.68 14.53 16.92 14.12 17.09L13.06 17.52 12.9 18.65 12.7 20H11.3L11.11 18.65 10.95 17.52 9.89 17.09C9.46 16.91 9.06 16.68 8.66 16.38L7.75 15.68 6.69 16.11 5.42 16.62 4.72 15.41 5.8 14.57 6.69 13.87 6.55 12.74C6.52 12.43 6.5 12.2 6.5 12S6.52 11.57 6.55 11.27L6.69 10.14 5.8 9.44 4.72 8.6 5.42 7.39 6.69 7.9 7.73 8.32 8.63 7.64C9.06 7.32 9.47 7.08 9.88 6.91L10.94 6.48 11.1 5.35 11.3 4H12.69L12.88 5.35 13.04 6.48 14.1 6.91C14.53 7.09 14.93 7.32 15.33 7.62L16.24 8.32 17.3 7.89 18.57 7.38 19.27 8.59 18.2 9.44 17.31 10.14 17.45 11.27ZM12 8C9.79 8 8 9.79 8 12S9.79 16 12 16 16 14.21 16 12 14.21 8 12 8ZM12 14C10.9 14 10 13.1 10 12S10.9 10 12 10 14 10.9 14 12 13.1 14 12 14Z"), // Material Icons
SETTINGS_FILL("M9.25 22l-.4-3.2q-.325-.125-.6125-.3t-.5625-.375L4.7 19.375l-2.75-4.75 2.575-1.95Q4.5 12.5 4.5 12.3375v-.675q0-.1625.025-.3375L1.95 9.375 4.7 4.625l2.975 1.25q.275-.2.575-.375t.6-.3L9.25 2h5.5l.4 3.2q.325.125.6125.3t.5625.375L19.3 4.625l2.75 4.75-2.575 1.95q.025.175.025.3375v.675q0 .1625-.05.3375l2.575 1.95-2.75 4.75-2.95-1.25q-.275.2-.575.375t-.6.3l-.4 3.2H9.25Zm2.8-6.5q1.45 0 2.475-1.025T15.55 12 14.525 9.525 12.05 8.5q-1.475 0-2.4875 1.025T8.55 12q0 1.45 1.0125 2.475T12.05 15.5Z"), // Material Icons
STADIA_CONTROLLER("M4.725 20Q3.225 20 2.1625 18.925T1.05 16.325Q1.05 16.1 1.075 15.875T1.15 15.425L3.25 7.025Q3.6 5.675 4.675 4.8375T7.125 4H16.875Q18.25 4 19.325 4.8375T20.75 7.025L22.85 15.425Q22.9 15.65 22.9375 15.8875T22.975 16.35Q22.975 17.875 21.8875 18.9375T19.275 20Q18.225 20 17.325 19.45T15.975 17.95L15.275 16.5Q15.15 16.25 14.9 16.125T14.375 16H9.625Q9.35 16 9.1 16.125T8.725 16.5L8.025 17.95Q7.575 18.9 6.675 19.45T4.725 20ZM4.8 18Q5.275 18 5.6625 17.75T6.25 17.075L6.95 15.65Q7.325 14.875 8.05 14.4375T9.625 14H14.375Q15.225 14 15.95 14.45T17.075 15.65L17.775 17.075Q17.975 17.5 18.3625 17.75T19.225 18Q19.925 18 20.425 17.5375T20.95 16.375Q20.95 16.4 20.9 15.9L18.8 7.525Q18.625 6.85 18.1 6.425T16.875 6H7.125Q6.425 6 5.8875 6.425T5.2 7.525L3.1 15.9Q3.05 16.05 3.05 16.35 3.05 17.05 3.5625 17.525T4.8 18ZM13.5 11Q13.925 11 14.2125 10.7125T14.5 10Q14.5 9.575 14.2125 9.2875T13.5 9Q13.075 9 12.7875 9.2875T12.5 10Q12.5 10.425 12.7875 10.7125T13.5 11ZM15.5 9Q15.925 9 16.2125 8.7125T16.5 8Q16.5 7.575 16.2125 7.2875T15.5 7Q15.075 7 14.7875 7.2875T14.5 8Q14.5 8.425 14.7875 8.7125T15.5 9ZM15.5 13Q15.925 13 16.2125 12.7125T16.5 12Q16.5 11.575 16.2125 11.2875T15.5 11Q15.075 11 14.7875 11.2875T14.5 12Q14.5 12.425 14.7875 12.7125T15.5 13ZM17.5 11Q17.925 11 18.2125 10.7125T18.5 10Q18.5 9.575 18.2125 9.2875T17.5 9Q17.075 9 16.7875 9.2875T16.5 10Q16.5 10.425 16.7875 10.7125T17.5 11ZM8.5 12.5Q8.825 12.5 9.0375 12.2875T9.25 11.75V10.75H10.25Q10.575 10.75 10.7875 10.5375T11 10Q11 9.675 10.7875 9.4625T10.25 9.25H9.25V8.25Q9.25 7.925 9.0375 7.7125T8.5 7.5Q8.175 7.5 7.9625 7.7125T7.75 8.25V9.25H6.75Q6.425 9.25 6.2125 9.4625T6 10Q6 10.325 6.2125 10.5375T6.75 10.75H7.75V11.75Q7.75 12.075 7.9625 12.2875T8.5 12.5ZM12 12Z"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Hello Minecraft! Launcher
* Copyright (C) 2026 huangyuhui <huanghongxun2008@126.com> and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.jackhuang.hmcl.ui.construct;

import com.jfoenix.validation.base.ValidatorBase;
import javafx.scene.control.TextInputControl;
import org.jackhuang.hmcl.util.ServerAddress;

import java.util.Objects;

public class MinecraftServerAddressValidator extends ValidatorBase {
private final boolean ignoreEmpty;

public MinecraftServerAddressValidator(String message, boolean ignoreEmpty) {
super(message);
this.ignoreEmpty = ignoreEmpty;
}

@Override
protected void eval() {
if (srcControl.get() instanceof TextInputControl) {
evalTextInputField();
}
}

private void evalTextInputField() {
TextInputControl textField = ((TextInputControl) srcControl.get());
String text = textField.getText();

if (text == null || text.isEmpty()) {
if (ignoreEmpty) {
hasErrors.set(false);
return;
}
}

try {
ServerAddress.parse(Objects.requireNonNull(text));
hasErrors.set(false);
} catch (Exception e) {
hasErrors.set(true);
}
}
}
28 changes: 10 additions & 18 deletions HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/Decorator.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,7 @@
import javafx.animation.Timeline;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.*;
import javafx.beans.value.ChangeListener;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
Expand All @@ -43,24 +36,17 @@
import javafx.scene.Scene;
import javafx.scene.effect.BlurType;
import javafx.scene.effect.DropShadow;
import javafx.scene.input.DragEvent;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.*;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;
import javafx.stage.WindowEvent;
import javafx.stage.*;
import javafx.util.Duration;
import org.jackhuang.hmcl.Launcher;
import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorDnD;
import org.jackhuang.hmcl.server.ServerDnD;
import org.jackhuang.hmcl.setting.SettingsManager;
import org.jackhuang.hmcl.theme.Themes;
import org.jackhuang.hmcl.ui.Controllers;
Expand All @@ -73,6 +59,8 @@
import org.jackhuang.hmcl.ui.animation.TransitionPane;
import org.jackhuang.hmcl.ui.construct.JFXDialogPane;
import org.jackhuang.hmcl.ui.construct.Navigator;
import org.jackhuang.hmcl.ui.instances.server.ServerListPage;
import org.jackhuang.hmcl.ui.instances.server.ServerStatusPane;
import org.jackhuang.hmcl.ui.wizard.Navigation;
import org.jackhuang.hmcl.ui.wizard.Refreshable;
import org.jackhuang.hmcl.ui.wizard.WizardProvider;
Expand Down Expand Up @@ -269,6 +257,10 @@ public Decorator(Node mainPage, Consumer<Stage> stageInitializer) {
root.addEventFilter(DragEvent.DRAG_OVER, AuthlibInjectorDnD.dragOverHandler());
root.addEventFilter(DragEvent.DRAG_DROPPED, AuthlibInjectorDnD.dragDroppedHandler(
url -> Controllers.dialog(new AddAuthlibInjectorServerPane(url))));

root.addEventFilter(DragEvent.DRAG_OVER, ServerDnD.dragOverHandler());
root.addEventFilter(DragEvent.DRAG_DROPPED, ServerDnD.dragDroppedHandler(
server -> Controllers.dialog(new ServerStatusPane(null, ServerListPage.IconedServer.pack(server), true))));
}

/// Returns the node that must be installed as the scene root.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
import org.jackhuang.hmcl.ui.instances.GameInstancePage;
import org.jackhuang.hmcl.util.Holder;
import org.jackhuang.hmcl.util.Pair;
import org.jackhuang.hmcl.util.ServerAddress;
import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.i18n.I18n;
import org.jackhuang.hmcl.util.io.FileUtils;
Expand Down Expand Up @@ -527,16 +526,7 @@ public GameSettingsPage(
var noneOption = new RadioChoiceList.Choice<>(i18n("settings.game.quick_play.none"), QuickPlayType.NONE);

var multiplayerTextField = new JFXTextField();
multiplayerTextField.setValidators(new Validator(str -> {
if (StringUtils.isBlank(str))
return true;
try {
ServerAddress.parse(str);
return true;
} catch (Exception ignored) {
return false;
}
}));
multiplayerTextField.setValidators(new MinecraftServerAddressValidator(null, true));
FXUtils.setValidateWhileTextChanged(multiplayerTextField, true);
@Nullable JFXButton multiplayerInheritanceButton = !isPresetSetting ? createInheritanceButton() : null;
var multiplayerOption = new EditorChoice<>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import javafx.beans.value.ChangeListener;
import javafx.event.Event;
import javafx.event.EventType;
import javafx.scene.Node;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import org.jackhuang.hmcl.game.GameInstanceID;
Expand All @@ -42,6 +43,7 @@
import org.jackhuang.hmcl.ui.decorator.DecoratorAnimatedPage;
import org.jackhuang.hmcl.ui.decorator.DecoratorPage;
import org.jackhuang.hmcl.ui.game.GameSettingsPage;
import org.jackhuang.hmcl.ui.instances.server.ServerListPage;
import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.io.FileUtils;
import org.jetbrains.annotations.Nullable;
Expand All @@ -60,6 +62,7 @@ public class GameInstancePage extends DecoratorAnimatedPage implements Decorator
private final TabHeader.Tab<WorldListPage> worldListTab = new TabHeader.Tab<>("worldList");
private final TabHeader.Tab<SchematicsPage> schematicsTab = new TabHeader.Tab<>("schematicsTab");
private final TabHeader.Tab<ResourcePackListPage> resourcePackTab = new TabHeader.Tab<>("resourcePackTab");
private final TabHeader.Tab<ServerListPage> serverListTab = new TabHeader.Tab<>("serverListTab");
private final TransitionPane transitionPane = new TransitionPane();
private final BooleanProperty currentInstanceUpgradable = new SimpleBooleanProperty();
private final ObjectProperty<HMCLGameInstance.@Nullable Optional> instance =
Expand Down Expand Up @@ -92,8 +95,9 @@ public GameInstancePage() {
resourcePackTab.setNodeSupplier(() -> new ResourcePackListPage(instance));
worldListTab.setNodeSupplier(() -> new WorldListPage(instance));
schematicsTab.setNodeSupplier(() -> new SchematicsPage(instance));
serverListTab.setNodeSupplier(() -> new ServerListPage(instance));

tab = new TabHeader(transitionPane, gameSettingsTab, installerListTab, modListTab, resourcePackTab, worldListTab, schematicsTab);
tab = new TabHeader(transitionPane, gameSettingsTab, installerListTab, modListTab, resourcePackTab, worldListTab, schematicsTab, serverListTab);
tab.select(gameSettingsTab);

addEventHandler(Navigator.NavigationEvent.NAVIGATED, this::onNavigated);
Expand Down Expand Up @@ -168,6 +172,14 @@ public void showInstanceSettings() {
tab.select(gameSettingsTab, false);
}

public void showServerList() {
tab.select(serverListTab, false);
}

public Node getSelectedTab() {
return tab.getSelectionModel().getSelectedItem().getNode();
}

public void setInstance(GameInstanceID instanceId, HMCLGameRepository repository) {
this.instance.set(HMCLGameInstance.Optional.of(repository, instanceId));
}
Expand Down Expand Up @@ -356,7 +368,8 @@ protected Skin(GameInstancePage control) {
.addNavigationDrawerTab(control.tab, control.modListTab, i18n("mods.manage"), SVG.EXTENSION, SVG.EXTENSION_FILL)
.addNavigationDrawerTab(control.tab, control.resourcePackTab, i18n("resourcepack.manage"), SVG.TEXTURE)
.addNavigationDrawerTab(control.tab, control.worldListTab, i18n("world.manage"), SVG.PUBLIC)
.addNavigationDrawerTab(control.tab, control.schematicsTab, i18n("schematics.manage"), SVG.SCHEMA, SVG.SCHEMA_FILL);
.addNavigationDrawerTab(control.tab, control.schematicsTab, i18n("schematics.manage"), SVG.SCHEMA, SVG.SCHEMA_FILL)
.addNavigationDrawerTab(control.tab, control.serverListTab, i18n("server.manage"), SVG.DRESSER);
VBox.setVgrow(sideBar, Priority.ALWAYS);

PopupMenu browseList = new PopupMenu();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@
import org.jackhuang.hmcl.download.game.GameDownloadTask;
import org.jackhuang.hmcl.download.game.GameLibrariesTask;
import org.jackhuang.hmcl.game.*;
import org.jackhuang.hmcl.setting.*;
import org.jackhuang.hmcl.setting.Accounts;
import org.jackhuang.hmcl.setting.AuthlibInjectorServers;
import org.jackhuang.hmcl.setting.GameDirectoryManager;
import org.jackhuang.hmcl.setting.SettingsManager;
import org.jackhuang.hmcl.task.FileDownloadTask;
import org.jackhuang.hmcl.task.Schedulers;
import org.jackhuang.hmcl.task.Task;
Expand Down Expand Up @@ -383,6 +386,16 @@ public static void generateLaunchScriptForQuickEnterWorld(HMCLGameInstance gameI
launcherHelper.setQuickPlayOption(new QuickPlayOption.SinglePlayer(worldFolderName)));
}

public static void launchAndEnterServer(@Nullable HMCLGameInstance gameInstance, String serverIp) {
launch(gameInstance, launcherHelper ->
launcherHelper.setQuickPlayOption(new QuickPlayOption.MultiPlayer(serverIp)));
}

public static void generateLaunchScriptForQuickConnectServer(HMCLGameInstance gameInstance, String serverIp) {
generateLaunchScript(gameInstance, launcherHelper ->
launcherHelper.setQuickPlayOption(new QuickPlayOption.MultiPlayer(serverIp)));
}

private static void ensureSelectedAccount(Consumer<Account> action) {
Account account = Accounts.getSelectedAccount();
if (SettingsManager.isNewlyCreated() && !AuthlibInjectorServers.getServers().isEmpty() &&
Expand Down Expand Up @@ -425,4 +438,9 @@ public static void modifyGameSettings(HMCLGameInstance gameInstance) {
Controllers.navigate(Controllers.getGameInstancePage());
}

public static void modifyServerList(HMCLGameInstance gameInstance) {
Controllers.getGameInstancePage().setInstance(gameInstance.getId(), gameInstance.getRepository());
Controllers.getGameInstancePage().showServerList();
Controllers.navigate(Controllers.getGameInstancePage());
}
}
Loading
Loading