Compare commits

..

4 Commits

Author SHA1 Message Date
neveler
69179534e0
优化更新日志 (#360)
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-03 16:13:44 +08:00
neveler
5c4d02c89e
添加设置页 (#362) 2025-12-03 16:13:21 +08:00
辞庐
76862e28a7
Update groups.csv (#363) 2025-12-03 16:12:29 +08:00
neveler
3b9618db37
优化资源链接 (#365) 2025-12-03 16:12:05 +08:00
30 changed files with 429 additions and 110 deletions

View File

@ -118,6 +118,16 @@ defaults:
type: downloads type: downloads
values: values:
toc: false toc: false
- scope:
path: _changelogs/dev
type: changelogs
values:
channel: dev
- scope:
path: _changelogs/stable
type: changelogs
values:
channel: stable
# liquid: # liquid:
# error_mode: warn # error_mode: warn
@ -139,8 +149,6 @@ defaults:
# Theme Settings # Theme Settings
theme: minimal-mistakes-jekyll theme: minimal-mistakes-jekyll
minimal_mistakes_skin: default # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
minimal_mistakes_skin_dark: dark
# Site Settings # Site Settings
locale: zh locale: zh
@ -309,6 +317,7 @@ compress_html:
envs: development envs: development
head_scripts: head_scripts:
- /assets/js/settings.js
- /assets/js/theme.js - /assets/js/theme.js
after_footer_scripts: after_footer_scripts:
- /assets/js/plugins/jquery.auto-redirect.js - /assets/js/plugins/jquery.auto-redirect.js

View File

@ -1,11 +1,11 @@
name,link,status name,link,status
HMCL 用户群 ① (633640264),https://qm.qq.com/q/fvJueufsvC, HMCL 用户群 ① (633640264),https://qm.qq.com/q/fvJueufsvC,
HMCL 用户群 ② (203232161),https://qm.qq.com/q/N7hgdNYfy,已满 HMCL 用户群 ② (203232161),https://qm.qq.com/q/N7hgdNYfy,
HMCL 用户群 ③ (201034984),https://qm.qq.com/q/7sbMrFm9CE,已满 HMCL 用户群 ③ (201034984),https://qm.qq.com/q/7sbMrFm9CE,
HMCL 用户群 ④ (533529045),https://qm.qq.com/q/ACmZa98tGg, HMCL 用户群 ④ (533529045),https://qm.qq.com/q/ACmZa98tGg,已满
HMCL 用户群 ⑤ (744304553),https://qm.qq.com/q/MlVArSCMwM, HMCL 用户群 ⑤ (744304553),https://qm.qq.com/q/MlVArSCMwM,已满
HMCL 用户群 ⑥ (282845310),https://qm.qq.com/q/S782Skmu0U, HMCL 用户群 ⑥ (282845310),https://qm.qq.com/q/S782Skmu0U,
HMCL 用户群 ⑦ (482624681),https://qm.qq.com/q/WFsZ65F6MY, HMCL 用户群 ⑦ (482624681),https://qm.qq.com/q/WFsZ65F6MY,
HMCL 用户群 ⑧ (991620626),https://qm.qq.com/q/ECVKkslPqi, HMCL 用户群 ⑧ (991620626),https://qm.qq.com/q/ECVKkslPqi,
HMCL 用户群 ⑨ (657677715),https://qm.qq.com/q/DVj9tTrwze, HMCL 用户群 ⑨ (657677715),https://qm.qq.com/q/DVj9tTrwze,已满
HMCL 用户群 ⑩ (775084843),https://qm.qq.com/q/V5F9DswQEu, HMCL 用户群 ⑩ (775084843),https://qm.qq.com/q/V5F9DswQEu,已满

1 name link status
2 HMCL 用户群 ① (633640264) https://qm.qq.com/q/fvJueufsvC
3 HMCL 用户群 ② (203232161) https://qm.qq.com/q/N7hgdNYfy 已满
4 HMCL 用户群 ③ (201034984) https://qm.qq.com/q/7sbMrFm9CE 已满
5 HMCL 用户群 ④ (533529045) https://qm.qq.com/q/ACmZa98tGg 已满
6 HMCL 用户群 ⑤ (744304553) https://qm.qq.com/q/MlVArSCMwM 已满
7 HMCL 用户群 ⑥ (282845310) https://qm.qq.com/q/S782Skmu0U
8 HMCL 用户群 ⑦ (482624681) https://qm.qq.com/q/WFsZ65F6MY
9 HMCL 用户群 ⑧ (991620626) https://qm.qq.com/q/ECVKkslPqi
10 HMCL 用户群 ⑨ (657677715) https://qm.qq.com/q/DVj9tTrwze 已满
11 HMCL 用户群 ⑩ (775084843) https://qm.qq.com/q/V5F9DswQEu 已满

View File

@ -1,6 +1,8 @@
main: main:
- title: 常见问题 - title: 常见问题
url: /faq.html url: /faq.html
- title: 设置
url: /settings.html
docs: docs:
- title: 问题集合 - title: 问题集合

35
_data/settings.yaml Normal file
View File

@ -0,0 +1,35 @@
appearance_color:
type: radio
default: light
options:
- light
- dark
- auto
appearance_skin_light:
type: radio
default: default
options:
- default
- air
- aqua
- contrast
- dark
- dirt
- neon
- mint
- plum
- sunrise
appearance_skin_dark:
type: radio
default: dark
options:
- default
- air
- aqua
- contrast
- dark
- dirt
- neon
- mint
- plum
- sunrise

View File

@ -88,7 +88,7 @@ HMCL 自动安装与使用模组教程: [跳转](/_launcher/auto-installing.md
或者前往模组包报错排查手册中查看: [跳转](/_modpack/error-handbook.md) 或者前往模组包报错排查手册中查看: [跳转](/_modpack/error-handbook.md)
如果无法解决错误,尝试 [寻求帮助](help.html) 如果无法解决错误,尝试 [寻求帮助](/_docs/help.md)
### 如何选择游戏的 Java 版本 ### 如何选择游戏的 Java 版本

View File

@ -1 +1,2 @@
<link rel="shortcut icon" href="{{ '/favicon.ico' | relative_url }}"> <link rel="shortcut icon" href="{{ '/favicon.ico' | relative_url }}">
<link rel="stylesheet" id="skin">

View File

@ -1,40 +1,48 @@
--- ---
title: 全局版本隔离 title: 全局版本隔离
date: 2021-10-09 23:18:02 +0800 date: 2021-10-09T23:18:02+08:00
last_modified_at: 2025-12-03T14:31:42+08:00
author: LIPiston author: LIPiston
redirect_from:
- /launcher/global-version-isolation.html
--- ---
这是一个游戏客户端很多不方便寻找的最佳解决方案<br/> 请注意该方法会改变默认的游戏文件结构。
**注意:该方法会改变默认的 minecraft 文件结构**
## 使用方式 ## 使用方式
进入 hmcl 的`设置`
![](\assets\img\docs\Global-version-isolation\img.webp) 进入 hmcl 的 `设置`
在全局设置中找到 `版本隔离`
改为 `各版本独立` ![](/assets/img/docs/isolation/img1.png)
![](\assets\img\docs\Global-version-isolation\img2.webp)
在全局游戏设置中找到 `版本隔离` 并设置为 `各实例独立`
![](/assets/img/docs/isolation/img2.png)
这时候 minecraft 的文件结构就会有所改变,如下方 这时候 minecraft 的文件结构就会有所改变,如下方
```
```plaintext
.minecraft .minecraft
|*asstes ├── asstes
|*libraries ├── libraries
|*versions └── versions
\1.16.5-optifine └── 1.16.5-optifine
|1.16.5-optifine.jar ├── 1.16.5-optifine.jar
|*saves ├── saves
|*resourcepacks ├── resourcepacks
|*logs ├── logs
|*mods ├── mods
|*config └── ...
...
``` ```
并非在 .minecraft 文件夹中存储一切的 mod 和 资源包**而是各版本的资源互相独立** 并非在 .minecraft 文件夹中存储一切的 mod 和 资源包**而是各版本的资源互相独立**
这样你就可以在一个目录下,安装多个客户端 这样你就可以在一个目录下,安装多个客户端
## 往后的使用 ## 往后的使用
在做完版本隔离的设置后hmcl 的快速打开各个游戏文件夹的功能就会显得十分好用。 在做完版本隔离的设置后hmcl 的快速打开各个游戏文件夹的功能就会显得十分好用。
![](/assets/img/docs/Global-version-isolation/img1.png)
![](/assets/img/docs/isolation/img3.png)
~~善用该功能也可为你的磁盘剩下不少的空间~~,现在反思过来其实都差不多 ~~善用该功能也可为你的磁盘剩下不少的空间~~,现在反思过来其实都差不多

View File

@ -5,7 +5,7 @@ layout: document
{{ content }} {{ content }}
{% assign channel = page.channel | default: 'stable' %} {% assign channel = page.channel | default: 'stable' %}
{% assign changelogs = site.changelogs | where_exp: "item", "item.relative_path contains channel" | reverse %} {% assign changelogs = site.changelogs | where: "channel", channel | reverse %}
{% for item in changelogs %} {% for item in changelogs %}
{% assign version = item.slug %} {% assign version = item.slug %}
<h1 id="{% if forloop.index == 1 %}nowchange{% else %}HMCL-{{ version }}{% endif %}" data-version="{{ version }}">HMCL {{ version }}</h1> <h1 id="{% if forloop.index == 1 %}nowchange{% else %}HMCL-{{ version }}{% endif %}" data-version="{{ version }}">HMCL {{ version }}</h1>

46
_layouts/settings.html Normal file
View File

@ -0,0 +1,46 @@
---
layout: document
---
{% for group in page.data %}
{% capture notice %}
## {{ group.title }}
{% for pair in group.settings %}
{% assign name = pair[0] %}
{% assign value = pair[1] %}
{% assign setting = site.data.settings[name] %}
{% if setting.type == 'radio' %}
<div class="notice">
<ul class="task-list">
<li><strong>{{ value.title }}</strong></li>
<li>{{ value.description }}</li>
{% for option in setting.options %}
<li class="task-list-item">
<input type="radio" class="task-list-item-checkbox" name="{{ name }}" value="{{ option }}" id="{{ name }}_{{ option }}"{% if setting.default == option %} checked{% endif %}><label for="{{ name }}_{{ option }}">{{ value.options[option] }}</label>
</li>
{% endfor %}
</ul>
</div>
<script>
settings.onChange("{{ name }}", function (newValue, oldValue) {
var list = document.getElementsByName("{{ name }}");
for (var i = 0; i < list.length; i++) {
list[i].checked = list[i].value === newValue;
list[i].onchange = function () {
if (this.checked) {
settings.set(this.name, this.value);
}
}
}
});
</script>
{% endif %}
{% endfor %}
{% endcapture %}
{{ notice | markdownify }}
{% endfor %}

View File

@ -7,7 +7,7 @@ author: LIPiston
## 文件夹结构 ## 文件夹结构
首先我们需要先认识Minecraft的文件夹结构 首先我们需要先认识Minecraft的文件夹结构
如果你开启了 [版本隔离](launcher/global-version-isolation.html) 那么你的文件夹结构如下 如果你开启了 [版本隔离](/_launcher/isolation.md) 那么你的文件夹结构如下
```text ```text
.minecraft .minecraft
|*assets # 游戏资源文件夹,存放纹理、声音等资源 |*assets # 游戏资源文件夹,存放纹理、声音等资源

View File

@ -1,16 +1,24 @@
@import "minimal-mistakes"; @import "minimal-mistakes";
blockquote { blockquote {
margin-inline: 0; margin-inline: 0;
font-style: normal; font-style: normal;
} }
a, span, code, kbd, pre, em, strong, b, i { * {
overflow-wrap: break-word; overflow-wrap: break-word;
word-wrap: break-word; word-wrap: break-word;
word-break: break-word; word-break: break-word;
} }
.m0 { .notice ul:first-child {
margin: 0 !important; margin-top: 0;
} }
.task-list-item label {
display: inline
}
.m0 {
margin: 0 !important;
}

View File

@ -1,8 +1,8 @@
--- ---
--- ---
@charset "utf-8"; @charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; $sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin | default: 'default' }}"; @import "minimal-mistakes/skins/default";
@import "minimal-mistakes-plus"; @import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/air";
@import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/aqua";
@import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/contrast";
@import "minimal-mistakes-plus";

View File

@ -1,8 +1,8 @@
--- ---
--- ---
@charset "utf-8"; @charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; $sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin_dark | default: 'dark' }}"; @import "minimal-mistakes/skins/dark";
@import "minimal-mistakes-plus"; @import "minimal-mistakes-plus";

View File

@ -0,0 +1,2 @@
---
---

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/dirt";
@import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/mint";
@import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/neon";
@import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/plum";
@import "minimal-mistakes-plus";

View File

@ -0,0 +1,8 @@
---
---
@charset "utf-8";
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@import "minimal-mistakes/skins/sunrise";
@import "minimal-mistakes-plus";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

View File

Before

Width:  |  Height:  |  Size: 204 KiB

After

Width:  |  Height:  |  Size: 204 KiB

76
assets/js/settings.js Normal file
View File

@ -0,0 +1,76 @@
---
layout: null
---
(function (global) {
var PREFIX = "HMCL_DOCS_SETTINGS_";
var data = {};
var events = {};
var config = /*{%comment%}*/{}/*{%endcomment%}*//**{{'/'}}{{ site.data.settings | jsonify }}/**/;
global.addEventListener("storage", function (event) {
if (!event.key) return;
if (event.key.indexOf(PREFIX) !== 0) return;
var handlers = events[event.key];
if (!handlers) return;
var newValue = event.newValue;
var oldValue = event.oldValue;
if (oldValue === newValue) return;
data[event.key] = newValue;
for (var i = 0; i < handlers.length; i++) {
if (typeof handlers[i] === "function") {
handlers[i](newValue, oldValue);
}
}
});
var settings = {
set: function (key, value) {
if (config[key] === undefined) return;
var strKey = (PREFIX + key).toUpperCase();
var newValue = value + "";
data[strKey] = newValue;
localStorage.setItem(strKey, newValue);
var handlers = events[strKey];
if (!handlers) return;
for (var i = 0; i < handlers.length; i++) {
if (typeof handlers[i] === "function") {
handlers[i](newValue);
}
}
},
get: function (key, defaultValue) {
if (config[key] === undefined) return;
var strKey = (PREFIX + key).toUpperCase();
data.hasOwnProperty(strKey) || (data[strKey] = localStorage.getItem(strKey));
if (typeof defaultValue === "string" && data[strKey] === null) {
return defaultValue;
}
return data[strKey];
},
refresh: function (key) {
if (config[key] === undefined) return;
settings.set(key, settings.get(key, config[key].default));
},
onChange: function (key, handler) {
if (config[key] === undefined) return;
if (typeof handler !== "function") return;
var strKey = (PREFIX + key).toUpperCase();
if (config[key].type === "radio") {
handler(settings.get(key, config[key].default));
}
if (!events[strKey]) {
events[strKey] = [handler];
} else {
events[strKey].push(handler);
}
}
};
global.settings = settings;
})(window);

View File

@ -1,45 +1,70 @@
--- ---
layout: null layout: null
--- ---
var darkTheme = document.createElement("link"); window.addEventListener("DOMContentLoaded", function () {
darkTheme.rel = "stylesheet alternate"; var skinLink = document.getElementById("skin");
darkTheme.href = "{{ '/assets/css/dark.css' | relative_url }}"; var darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)");
document.head.appendChild(darkTheme); function applyDarkSkin() {
window.addEventListener("DOMContentLoaded", function () { skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + settings.get("appearance_skin_dark", "dark") + ".css";
var list = document.querySelector(".masthead .visible-links"); }
if (!list) return; function applyLightSkin() {
var mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); skinLink.href = "{{ '/assets/css/skins/' | relative_url }}" + settings.get("appearance_skin_light", "default") + ".css";
function handler() { }
darkTheme.rel = mediaQuery.matches ? "stylesheet" : "stylesheet alternate"; function autoSchemeHandler() {
} if (darkModeQuery.matches) {
var current = 0; applyDarkSkin();
var modes = ["light", "dark", "auto"]; } else {
var modeNames = ["亮色", "暗色", "自动"]; applyLightSkin();
var switcher = document.createElement("a"); }
switcher.className = "masthead__menu-item"; }
switcher.innerText = modeNames[current]; var activeModeIndex = 0;
switcher.href = "javascript:;"; var modeKeys = ["light", "dark", "auto"];
switcher.onclick = function () { var modeLabels = ["亮色", "暗色", "自动"];
themeApply(current + 1);
} var menuList = document.querySelector(".masthead .visible-links");
list.appendChild(switcher); var modeSwitcher = null;
function themeApply(index) { if (menuList) {
index = (Number(index) || 0) % modes.length; modeSwitcher = document.createElement("a");
if (index === current) return; modeSwitcher.className = "masthead__menu-item";
if (modes[current] === "auto") mediaQuery.removeEventListener("change", handler); modeSwitcher.textContent = modeLabels[activeModeIndex];
current = index; modeSwitcher.href = "javascript:;";
var mode = modes[current]; modeSwitcher.onclick = function () {
switcher.innerText = modeNames[current]; var nextIndex = (activeModeIndex + 1) % modeKeys.length;
localStorage.setItem("theme", current); settings.set("appearance_color", modeKeys[nextIndex]);
if (mode === "light") darkTheme.rel = "stylesheet alternate"; }
else if (mode === "dark") darkTheme.rel = "stylesheet"; menuList.appendChild(modeSwitcher);
else { }
mediaQuery.addEventListener("change", handler); function applyTheme(mode) {
handler(); var newIndex = modeKeys.indexOf(mode);
} if (newIndex < 0) newIndex = 0;
}
themeApply(localStorage.getItem("theme")); if (modeKeys[activeModeIndex] === "auto") {
window.addEventListener("storage", function (event) { darkModeQuery.removeEventListener("change", autoSchemeHandler);
event.key === "theme" && themeApply(event.newValue); }
});
}); activeModeIndex = newIndex;
var resolvedMode = modeKeys[activeModeIndex];
if (modeSwitcher) {
modeSwitcher.textContent = modeLabels[activeModeIndex];
}
if (resolvedMode === "light") {
applyLightSkin();
}
else if (resolvedMode === "dark") {
applyDarkSkin();
}
else {
darkModeQuery.addEventListener("change", autoSchemeHandler);
autoSchemeHandler();
}
}
settings.onChange("appearance_color", applyTheme);
settings.onChange("appearance_skin_dark", function () {
settings.refresh("appearance_color");
});
settings.onChange("appearance_skin_light", function () {
settings.refresh("appearance_color");
});
});

43
settings.yaml Normal file
View File

@ -0,0 +1,43 @@
---
title: 设置
layout: settings
permalink: /settings.html
data:
- title: 外观
settings:
appearance_color:
title: 颜色模式
description: 用于切换站点主题颜色模式。
options:
light: 亮色
dark: 暗色
auto: 自动
appearance_skin_light:
title: 亮色皮肤
description: 亮色模式下应用的皮肤。
options:
default: 默认
air: 天空
aqua: 水蓝
contrast: 高对比
dark: 暗色
dirt: 泥土
neon: 霓虹
mint: 薄荷
plum: 梅紫
sunrise: 日出
appearance_skin_dark:
title: 暗色皮肤
description: 暗色模式下应用的皮肤。
options:
default: 默认
air: 天空
aqua: 水蓝
contrast: 高对比
dark: 暗色
dirt: 泥土
neon: 霓虹
mint: 薄荷
plum: 梅紫
sunrise: 日出
---