├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── blog ├── 2024-06-21-v1-releases.md ├── 2024-10-07-v2-client-releases.md ├── 2024-10-20-v2-server-releases.md └── authors.yml ├── docs ├── index.md ├── release-notes.md ├── sponsor-list.json ├── sponsors.md ├── v1-old │ ├── advance │ │ ├── cli-interface.md │ │ ├── combine.md │ │ ├── custom-deploy.md │ │ ├── dynamic-loader.md │ │ ├── ignores.md │ │ ├── modclient-self-update.md │ │ ├── overwrites.md │ │ ├── run-as-exe.md │ │ └── spell-start.md │ ├── config.md │ ├── faq │ │ ├── client.md │ │ └── manage.md │ ├── guide │ │ ├── auto-start.md │ │ ├── caution.md │ │ ├── client.md │ │ ├── manager.md │ │ ├── preparations.md │ │ └── server.md │ ├── img │ │ ├── 6411f6297cc3f.jpg │ │ └── 6411fd659499b.jpg │ └── start.md ├── v1 │ ├── advanced │ │ └── client.md │ ├── config.md │ ├── faq │ │ └── client.md │ ├── img │ │ ├── httpserver-http.png │ │ ├── httpserver.png │ │ ├── installation-cmd-c-1.0-y-n.png │ │ ├── installation-cmd-c-1.0-y.png │ │ ├── installation-cmd-c-1.0.png │ │ ├── installation-cmd-c.png │ │ ├── installation-cmd.png │ │ ├── installation-oss.png │ │ └── installation-path.png │ ├── installation │ │ ├── client.md │ │ ├── deploy.md │ │ ├── prepare.md │ │ └── server.mdx │ └── start.md └── v2 │ ├── config.md │ ├── faq.md │ ├── installation │ ├── guide.md │ └── upload.md │ ├── maintain │ └── combine-versions.md │ ├── practices │ ├── cdn.md │ └── self-update.md │ └── start.md ├── docusaurus.config.js ├── package-lock.json ├── package.json ├── plugins └── sponsor-info │ └── index.js ├── sidebars.js ├── src ├── components │ ├── ContributorsList │ │ ├── index.js │ │ └── styles.module.css │ ├── HomepageFeatures │ │ ├── index.js │ │ ├── index.js.back │ │ └── styles.module.css │ ├── HomepageIntro │ │ ├── index.js │ │ └── styles.module.css │ ├── HomepageTestimonials │ │ ├── index.js │ │ └── styles.module.css │ ├── ReleaseList │ │ ├── index.js │ │ └── styles.module.css │ └── SponsorList │ │ ├── example_data.json │ │ ├── index.js │ │ └── styles.module.css ├── css │ └── custom.css └── pages │ ├── contribute.js │ ├── contributors.module.css │ ├── index.js │ └── index.module.css └── static ├── .nojekyll └── img ├── index ├── image-1.png ├── image-2.png └── image-3.png └── logo.png /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | # schedule: 8 | # - cron: '0 5 * * *' # runs on every 05:00 9 | # Review gh actions docs if you want to further define triggers, paths, etc 10 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on 11 | 12 | jobs: 13 | build: 14 | name: Build Docusaurus 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | with: 19 | fetch-depth: 0 20 | - uses: actions/setup-node@v4 21 | with: 22 | node-version: 18 23 | cache: npm 24 | 25 | - name: Install dependencies 26 | run: npm install --frozen-lockfile 27 | - name: Build website 28 | run: npm run build 29 | 30 | - name: Upload Build Artifact 31 | uses: actions/upload-pages-artifact@v3 32 | with: 33 | path: build 34 | 35 | deploy: 36 | name: Deploy to GitHub Pages 37 | needs: build 38 | 39 | # Grant GITHUB_TOKEN the permissions required to make a Pages deployment 40 | permissions: 41 | pages: write # to deploy to Pages 42 | id-token: write # to verify the deployment originates from an appropriate source 43 | 44 | # Deploy to the github-pages environment 45 | environment: 46 | name: github-pages 47 | url: ${{ steps.deployment.outputs.page_url }} 48 | 49 | runs-on: ubuntu-latest 50 | steps: 51 | - name: Deploy to GitHub Pages 52 | id: deployment 53 | uses: actions/deploy-pages@v4 54 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # McPatchDocs 2 | 3 | McPatchDocs 官方文档 4 | 5 | ## 旧版本 6 | - 原初文档:[仓库 old 分支](https://github.com/BalloonUpdate/McPatchDocs/tree/old) 7 | - 旧架构文档:[仓库 V1.0 分支](https://github.com/BalloonUpdate/McPatchDocs/tree/V1.0) -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /blog/2024-06-21-v1-releases.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: v1-releases 3 | title: McPath V1 更新日志 4 | authors: [asforest] 5 | tags: [McPath, releases] 6 | --- 7 | 8 | 空白白白白白白白白白 9 | -------------------------------------------------------------------------------- /blog/2024-10-07-v2-client-releases.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: v2-client-releases 3 | title: McPath V2 客户端更新日志 4 | authors: [asforest] 5 | tags: [McPath, releases] 6 | --- 7 | ### v0.0.15 8 | 1. 新增Linux glibc版本的客户端 9 | 2. 修复不带pad的base64字符串无法解码并识别的问题 10 | 11 | ### v0.0.15 12 | 1. 修复webdavs协议连接无法识别的问题 13 | 14 | ### v0.0.14 15 | 1. 没有填写有效服务器时发出提示 16 | 2. 客户端支持base64编码过的服务器地址 17 | 3. 删除目录时会强制删除整个文件夹 18 | 4. 修复不能删除管理端不存在的文件的问题 19 | 20 | ### v0.0.13 21 | 1. 修复小概率出现的Windows TLS -2146893018错误 22 | 23 | ### v0.0.12 24 | 1. 增加弹窗中的服务器地址打码功能 25 | 2. 增加更详细的错误提示 26 | 27 | ### v0.0.11 28 | 1. 修复http和webdav协议频繁超时的问题 29 | 2. 客户端为http/webdav增加错误响应体显示 30 | 3. 修改配置文件描述,最大重试不能超过245次 31 | 32 | ### v0.0.10 33 | 1. 客户端修复删除不存在的文件会报错的问题 34 | 35 | ### v0.0.9 36 | 1. 修复版本号判断逻辑不正确导致多更新版本的问题 37 | 38 | ### v0.0.8 39 | 1. 换回老的.minecraft目录搜索逻辑 40 | 41 | ### v0.0.7 42 | 1. 使用新的.minecraft目录搜索逻辑 43 | 2. 修复某些情况下会导致重复文件的问题 44 | 3. 修复客户端处理合并更新包时多下载文件的问题 45 | 46 | ### v0.0.6 47 | 1. 修复http协议下载时异步缓冲区填充不正确的问题 48 | 49 | ### v0.0.5 50 | 1. 修复http断点续传参数生成不对的问题 51 | 52 | ### v0.0.4 53 | 1. 去掉http协议传输压缩以确保content-length可以正常读取 54 | 55 | ### v0.0.3 56 | 1. 修复配置文件中的https协议不能识别到的问题 57 | 58 | ### v0.0.2 59 | 1. 修复webdav地址不能识别的问题 60 | 61 | ### v0.0.1 62 | 1. 客户端首个版本 63 | -------------------------------------------------------------------------------- /blog/2024-10-20-v2-server-releases.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: v2-server-releases 3 | title: McPath V2 管理端更新日志 4 | authors: [asforest, Cnzw] 5 | tags: [McPath, releases] 6 | --- 7 | ### v0.0.15 8 | 1. 增加serve命令填写端口的兼容性,老版本使用不会再报错 9 | 10 | ### v0.0.14 11 | 1. 将serve命令的设置从命令参数移动到配置文件中 12 | 2. 服务端现在会显示日志的时间戳 13 | 14 | ### v0.0.13 15 | 1. 修复连接断开后,工作协程也无法退出的问题 16 | 17 | ### v0.0.12 18 | 1. 修复管理端的serve命令运行久了之后,会卡住的问题 19 | 20 | ### v0.0.11 21 | 1. 修复内置服务端遇到错误会崩溃的问题 22 | 23 | ### v0.0.10 24 | 1. 修复合并时会导致合并包中的元数据体积膨胀的问题 25 | 26 | ### v0.0.9 27 | 1. 修复忽略文件有时候不能成功忽略的问题 28 | 29 | ### v0.0.8 30 | 1. 此版本增加了Linux musl libc版本的打包 31 | 32 | ### v0.0.7 33 | 1. 管理端支持内置服务端的单连接限速功能(基于令牌桶) 34 | 35 | ### v0.0.6 36 | 1. 管理端修复不支持带空格的路径的问题 37 | 38 | ### v0.0.5 39 | 1. 增加自动创建更新记录文件的功能 40 | 2. 管理端使用排除规则来替代过滤规则 41 | 42 | ### v0.0.4 43 | 1. 管理端支持交互式命令模式 44 | 45 | ### v0.0.3 46 | 1. 修复打包数据损坏的问题 47 | 48 | ### v0.0.2 49 | 1. 管理端支持revert退回工作空间的修改 50 | 51 | ### v0.0.1 52 | 1. 管理端首个版本 -------------------------------------------------------------------------------- /blog/authors.yml: -------------------------------------------------------------------------------- 1 | asforest: 2 | name: 四月森林 3 | title: McPath 维护者 4 | url: https://github.com/asforest 5 | image_url: https://github.com/asforest.png 6 | 7 | NiuBoss123: 8 | name: MisakaAkio 9 | title: McPathDocs 文档编写者 10 | url: https://github.com/NiuBoss123 11 | image_url: https://github.com/NiuBoss123.png 12 | 13 | 1zyao: 14 | name: 1zyao 15 | title: McPathDocs 文档编写者 16 | url: https://github.com/1zyao 17 | image_url: https://github.com/1zyao.png 18 | 19 | Mr-Ao-Dragon: 20 | name: 敖律风 21 | title: McPathDocs 文档编写者 22 | url: https://github.com/Mr-Ao-Dragon 23 | image_url: https://github.com/Mr-Ao-Dragon.png 24 | 25 | Cnzw: 26 | name: Cnzw 27 | title: McPathDocs 文档编写者 28 | url: https://github.com/Cnzw 29 | image_url: https://github.com/Cnzw.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 文档首页 3 | --- 4 | 5 | McPatch 是一个给 Minecraft 客户端做文件更新的独立应用程序,目前分为 V1 版本和 V2 版本 6 | 7 | 各版本的支持情况如下: 8 | 9 | | 版本分支 | 维护状态 | 客户端最新版本 | 服务端最新版本 | 最近更新 | Windows | Mac OS | Linux | Android | 10 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | 11 | | [V1](/docs/v1-old/start.md) | 稳定版 | 1.1.13 | 1.1.15 | 24年5月 | ✅ | ✅ | ✅ | ✅ | 12 | | [V2](/docs/v2/start.md) | 测试版 | 2.0.0 | 2.0.3 | 25年2月 | ✅ | ✅ | ✅ | ✅ | 13 | 14 | - [V1 版本文档](/docs/v1-old/start.md) 15 | - [V2 版本文档](/docs/v2/start.md) 16 | 17 | 注:V2版本需要使用Jar版客户端才可以实现全版本覆盖,使用Exe版客户端只能支持windows系统 18 | 19 | 注:V2 版本与 V1 版本无法共存或互通,如需升级到 V2 版本,请依照 V2 版本文档重新部署 20 | 21 | :::warning 22 | 23 | 本软件完全开源免费下载和使用,如果你是花钱购买到的,请立即退款。 24 | 25 | ::: 26 | 27 | --- 28 | 29 | ## 发行说明 30 | 31 | 我们一共发布了2个系列的软件作品。分别是“原版更新助手”系列和“Mcpatch”系列。 32 | 33 | 相关旧版下载链接在对应版本介绍的下面,如果你发现某些文件找不到,可以到这里来找找,这里应该会比较全 https://pan.baidu.com/s/1d3TtyY 34 | 35 | ## “Mcpatch”系列 36 | 37 | ### McPatch v2 38 | 39 | 发布于2024年,是对v1版本的重写,修复了网络限速和窗口无响应问题,同时大幅提升性能和简化使用流程,使用难度最低,是目前主推的版本 40 | 41 | 链接:[教程文档](https://balloonupdate.github.io/McPatchDocs/docs/v2)、[加载器](https://github.com/BalloonUpdate/McPatch2Loader/releases)、[管理端](https://github.com/BalloonUpdate/McPatch2/releases)、[新客户端](https://github.com/BalloonUpdate/Mcpatch2JavaClient/releases)、[旧客户端](https://github.com/BalloonUpdate/Mcpatch2RustClient/releases) 42 | 43 | ### McPatch v1 44 | 45 | 发布于2022年,采用差异式更新,所以无需编写更新规则,这降低了使用门槛,也方便做静态分发,是综合体验最好的版本 46 | 47 | 归档链接:[教程文档](https://balloonupdate.github.io/McPatchDocs/docs/v1-old/start)、[动态加载器](https://github.com/BalloonUpdate/DynamicLoader/releases)、[MiniHttpServer服务端](https://github.com/BalloonUpdate/MiniHttpServer/releases)、[管理端](https://github.com/BalloonUpdate/McPatchManage/releases)、[客户端](https://github.com/BalloonUpdate/McPatchClient/releases) 48 | 49 | ## “原版更新助手”系列 50 | 51 | ### 3.0版本和4.0版本 52 | 53 | 发布于2021年,也叫JarClient或者ExeClient,支持Jar和Electron双版本客户端和支持正则和glob编写更新规则,同时还有一大堆周边配套工具,是我维护起来的最累的版本 54 | 55 | 归档链接:[教程文档 v3.x](https://github.com/BalloonUpdate/Docs/tree/v3.2)、[教程文档 v4.x(建议看离线版)](https://github.com/BalloonUpdate/Docs/tree/main)、[离线版教程文档 v4.x(推荐)](https://github.com/BalloonUpdate/Docs/releases)、[PHP服务端](https://github.com/BalloonUpdate/PhpServer/releases/download/archive/php.server-4.2.zip)、[单文件服务端](https://github.com/BalloonUpdate/LittleServer/releases)、[服务端单文件图形化增强](https://github.com/BalloonUpdate/BalloonServer/releases)、[静态服务端整合包](https://github.com/BalloonUpdate/StaticServerForPages/releases)、[规则编辑器](https://github.com/BalloonUpdate/RuleEditorServer/releases)、[Exe客户端](https://github.com/BalloonUpdate/ExeClient/releases)、[Forge模组版(加载器)](https://github.com/BalloonUpdate/ModClient/releases)、[Jar客户端](https://github.com/BalloonUpdate/JarClient/releases)(已过时不推荐使用) 56 | 57 | ### 2.0版本 58 | 59 | 发布于2020年,改为使用Python编程语言加qt/webview的方式制作界面,开始支持http协议和对象存储,后因误报率高停止维护 60 | 61 | 归档链接:[教程文档](https://github.com/BalloonUpdate/Docs/tree/v2.8.4)、[PHP服务端](https://github.com/BalloonUpdate/PhpServer/releases/download/archive/php.server-2.8.zip)、[客户端](https://github.com/BalloonUpdate/Launcher/releases)、[热更新包](https://github.com/BalloonUpdate/Hotupdate/releases)、[小工具](https://github.com/BalloonUpdate/Tool/releases)(已过时不推荐使用) 62 | 63 | ### 1.0版本 64 | 65 | 发布于2016年,当时叫做ClientUpdater和FileSA。服务端基于Bukkit插件制作,有专门的规则编辑器,使用私有更新协议,后从ClientUpdater改名为FileSA 66 | 67 | 归档链接:[食用方法](https://github.com/BalloonUpdate/updater/blob/master/%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83%E5%BD%92%E6%A1%A3/2020%E5%B9%B41%E6%9C%8828%E6%97%A5%E6%9B%B4%E6%96%B0/updater%E8%AF%A6%E7%BB%86%E7%9A%84%E9%A3%9F%E7%94%A8%E6%96%B9%E6%B3%951.2.2.docx)、[全部文件](https://github.com/BalloonUpdate/updater/tree/master/%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83%E5%BD%92%E6%A1%A3)(已过时不推荐使用) 68 | 69 | -------------------------------------------------------------------------------- /docs/release-notes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: McPatch V2 更新日志 3 | authors: [asforest, Cnzw] 4 | tags: [McPath, releases] 5 | --- 6 | import Tabs from '@theme/Tabs'; 7 | import TabItem from '@theme/TabItem'; 8 | 9 | import ReleaseList from '@site/src/components/ReleaseList'; 10 | 11 | 12 | 13 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/sponsor-list.json: -------------------------------------------------------------------------------- 1 | [ 2 | ["3c0021da845b11eb8de752540025c377", "1970/1/1", "四月浅森"], 3 | ["ac11e172757711eb904e52540025c377", "2024/2/6", "御坂秋生"], 4 | ["", "2021/4/26", "小鱼人的三叉戟"], 5 | ["6e354d5aace811eba65352540025c377", "2021/5/4", "爱发电用户_6e354"], 6 | ["a66f79d2f5a311e9af4e52540025c377", "2021/5/9", "伊南"], 7 | ["", "2021/6/3", "3232715933"], 8 | ["e85efea8c92311eba9b352540025c377", "2021/6/9", "Neveark"], 9 | ["", "2021/6/17", "洛神Field"], 10 | ["4fbb14a2d09411eba70652540025c377", "2021/6/19", "一只小海狮"], 11 | ["c4cc37d8607511eba2ff52540025c377", "2021/7/2", "Angelways"], 12 | ["7360147cd4b711ea85ac52540025c377", "2021/7/2", "ET-荼"], 13 | ["61ee24f6d21811e9a9f552540025c377", "2021/7/13", "山青夜遥"], 14 | ["9a39963e33e111eb8d2e52540025c377", "2021/7/22", "爱发电用户_ujbt"], 15 | ["", "2021/7/30", "懵逼小唐"], 16 | ["2ac1a1cef2d711eb832a52540025c377", "2021/8/1", "子轩"], 17 | ["", "2021/8/14", "Az7"], 18 | ["bebb32e224e711eaa4d552540025c377", "2021/8/28", "MgSuperz"], 19 | ["", "2021/9/2", "大卫"], 20 | ["", "2021/10/28", "1372436983"], 21 | ["34f65df049c311ebaaf252540025c377", "2021/11/26", "Feiyuyu"], 22 | ["deb5a2246ba711eabcef52540025c377", "2021/12/20", "牛奶在撤硕~"], 23 | ["", "2021/12/25", "左手牵右手"], 24 | ["1f56b914200e11ec871152540025c377", "2022/4/4", "樱花祈愿树"], 25 | ["e04b4dba29e111ec95a052540025c377", "2022/4/6", "爱发电用户_e04b4"], 26 | ["", "2022/4/26", "吃货酱"], 27 | ["", "2022/4/26", "文少"], 28 | ["", "2022/5/8", "Le1_B"], 29 | ["9c52766a673011ec818752540025c377", "2022/5/9", "爱发电用户_ynt7"], 30 | ["", "2022/5/10", "X"], 31 | ["", "2022/6/4", "duaoxun"], 32 | ["", "2022/7/16", "Mr.魏"], 33 | ["", "2022/7/16", "你的左耳"], 34 | ["", "2022/7/22", "Epresin"], 35 | ["", "2022/8/9", "君"], 36 | ["525ba80aefd311e996a552540025c377", "2022/7/27", "Zapic"], 37 | ["496dcff4192711ed820752540025c377", "2022/8/11", "爱发电用户_fWw6"], 38 | ["f02f57c83e1a11ed91c652540025c377", "2022/9/27", "爱发电用户_f02f5"], 39 | ["be74e2b24e0911ed8f3152540025c377", "2022/10/19", "爱发电用户_be74e"], 40 | ["a3ab4d72d46211eabb5b52540025c377", "2024/2/6", "樱花工艺SakuraCraft"], 41 | ["28911eeac4f611ee8aa45254001e7c00", "2024/2/6", "爱发电用户_fh6q"], 42 | ["e2660ad0713b11ec917652540025c377", "2024/2/6", "AurLemon"], 43 | ["90ec41b411ca11eba39852540025c377", "2024/2/6", "爱发电用户_90ec4"], 44 | ["2563b38c8f0411edabe952540025c377", "2024/3/25", "爱发电用户_2563b"], 45 | ["", "2024/9/1", "Tollainmear"], 46 | ["8cf8ae146dbe11ee93305254001e7c00", "2024/12/24", "MFD7"], 47 | ["c7ca7dca60e411edac7d52540025c377", "2024/12/31", "supian"], 48 | ["b49dfc4026c911edb96652540025c377", "2024/12/31", "Angel*:.心浅~"] 49 | ] -------------------------------------------------------------------------------- /docs/sponsors.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 赞助名单 3 | --- 4 | import SponsorList from '@site/src/components/SponsorList'; 5 | 6 | 这里是赞助名单,感谢各位老板们对更新助手系列和mcpatch系列开源软件的支持! 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/v1-old/advance/cli-interface.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 命令行直接打包 3 | --- 4 | > 此功能需要管理端 1.1.4 或者更高版本 5 | 6 | 有时候,你可能需要一个命令行就能启动管理端并且直接进入打包过程,而不是手动输入 c 然后输入版本号,这样显然对脚本调用管理端不友好 7 | 8 | 从管理端 1.1.4 开始,新增了一个叫“预输入”的特性,这个特性可以让程序的启动参数直接变成后续的输入 9 | 10 | 举个栗子,创建一个新版本,通常要先输入c进入创建模式,然后输入2.0这么一个版本号,最后还要在输入y来确认 11 | 12 | 现在有了预输入这个特性之后,在启动管理端的时候,直接使用 `java -jar manager.jar c 2.0 y n q` 就能一键创建好一个新版本,无需任何键盘输入 13 | 14 | 后面的运行参数 `c 2.0 y n q` 表示这四个参数会依次被模拟成你的手动输入,这对使用脚本调用管理端打包的场景来说非常有用(参数分隔是空格,因此版本号如果包含空格会导致解析失败) 15 | 16 | 脚本在打包完成之后,可以通过检查管理端的进程退出代码(exit code)来判断打包是否成功,成功会返回 0,其它非 0 值均代表打包失败。打包失败通常是版本号冲突 17 | 18 | ### 小细节 19 | 20 | 1. 预输入参数的最后面一定要跟上一个 `q`,否则程序在打包 完成后,仍会停留在交互式模式下,无法正常退出! 21 | 2. 使用预输入参数进行打包之前,脚本可以先把更新记录写入 `changelogs.txt` 文件,再进行打包。因为使用预输入参数进行打包时,没法手动输入更新记录,更新记录只能提前准备好 22 | 3. 脚本可以在打包之前,使用 `java -jar manage.jar s q` 来输出一下文件修改列表。而不必进入真正的打包过程,这对想要先审阅文件修改列表,再进行打包的脚本来说非常有用 23 | -------------------------------------------------------------------------------- /docs/v1-old/advance/combine.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 合并更新包 3 | --- 4 | :::warning 5 | 6 | 最新消息:合并更新包功能有缺陷,请不要再使用此功能,会导致太久不更新的玩家漏更新! 7 | 8 | 此问题受限于更新架构没法修复,但会在未来的 2.0 版本中解决 9 | 10 | ::: 11 | 12 | #### 已知问题1: 13 | 14 | 如果某个文件在之前的版本中存在,但在参与合并的末尾版本中不存在。合并后会导致此文件无法在客户端被正常删除! 15 | 16 | 问题表现:大多数情况表现为客户端同时存在一个 mod 的新版本和旧版本两个文件导致冲突 17 | 18 | 解决办法:若已经出问题:参考[注意事项](../guide/caution.md)页面里面的“怎么删除管理端不存在的文件”。若未出问题:不要使用合并功能 19 | 20 | 问题原因:在之前版本中存在,但后来被删除的文件在合并时会被认为是没有加入过更新的文件,也就导致这些文件没有被正确的删除 21 | 22 | #### 已知问题2: 23 | 24 | 请勿使用管理端 1.1.12 和更旧的版本进行合并操作,因为严重 bug 会导致合并数据损坏,请升级到管理端 1.1.13 及以上版本再进行合并 25 | 26 | ### 合并教程 27 | 28 | 当管理端用的时间长了以后,会积累非常多的版本,不仅占空间,还会增加更新流量。这时就需要更新包合并功能 29 | 30 | 合并功能有限制,并非可以随意合并,这些限制如下: 31 | 32 | 1. 仅支持管理端 1.1 或者更高版本 33 | 2. 只能从头合并,比如有 `1234567` 这七个版本,只能从最早的1开始往后合并,不能从中间开始 34 | 3. 合并后无法再拆分,操作是不可逆的。但合并后的更新包内容完全等价于合并前的更新包 35 | 36 | 合并方法如下: 37 | 38 | 1. 启动管理端,输入 `combine` 指令 39 | 2. 然后输入要合并多少个版本,比如有 `4567` 这四个版本,输入 3 可以合并 `456` 三个版本 40 | 3. 检查无误后输入 `y` 开始正式合并,这个过程需要时间较长,需要耐心等待 41 | 4. 然后会提示要你编辑 `changelogs.txt` 文件,来手动合并一下更新记录 42 | 5. 编辑好之后按任意键继续,开始输入合并后的新的版本号 43 | + 注意不能和已有版本号重复,但可以和参与合并的版本号们重复 44 | 6. 最后会进行打包操作,打包完成后会提示版本已经合并完成了 45 | -------------------------------------------------------------------------------- /docs/v1-old/advance/custom-deploy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 自定义部署 3 | --- 4 | McPatch 的后台是服务端+管理端的分离架构,以方便你将打包过程和文件分发过程分离 5 | 6 | 分离后有许多好处,比如更换性能更强的 HTTP 服务端程序,比如 Nginx,Apache,对象存储。同时也方便大佬们进行魔改(自带服务端性能没有经过特别优化,只能用在一些平时在线人数不多的服务器或者本地调试场景中) 7 | 8 | 自由化部署的大致原理就是将整个 public 目录下的所有文件(不包括 public 目录本身)上传到对象存储或者自己的服务器上去 9 | 10 | 这里以对象存储为例,你每打一个新版本更新包,比如 1.1,就需要将 public 目录里面的这些文件上传到对象存储或者你的服务器上公开提供HTTP服务: 11 | 12 | 如果是 1.0 版本的管理端,需要上传这些文件: 13 | 14 | 1. 二进制数据文件(.bin):`1.2.mc-patch.json`(如果这个文件不存在就不用上传) 15 | 2. 元数据文件(.json):`1.2.mc-patch.bin` 16 | 3. 版本列表文件(mc-patch-versions.txt):此文件每次都需要上传更新(并刷新缓存,如果是 CDN 的话) 17 | 18 | 如果是1.1版本的管理端,需要上传这些文件: 19 | 20 | 1. 更新包文件(.zip):`1.2.mcpatch.zip` 21 | 2. 版本列表文件(versions.txt):此文件每次都需要上传更新(并刷新缓存,如果是 CDN 的话) 22 | 23 | 然后,客户端 server 选项要这样填写: 24 | 25 | 1. 首先拿到版本列表文件(mc-patch-versions.txt)的URL,比如 `https://duixiangcunchu.com/some-folder/mc-patch-versions.txt`(或者 `versions.txt`) 26 | 2. 在浏览器打开这个URL,确认能顺利访问之后,删除URL末尾的 `/mc-patch-versions.txt`(或者`versions.txt`)部分,变成这样 `https://duixiangcunchu.com/some-folder` 27 | 3. 然后粘贴进客户端配置文件的server选项后面 28 | 29 | -------------------------------------------------------------------------------- /docs/v1-old/advance/dynamic-loader.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 热升级 3 | --- 4 | McPatch 客户端会不定期发布新的版本。但升级客户端不像升级管理端那样方便,因为客户端在玩家电脑上,升级需要重新发包,比较麻烦 5 | 6 | 热升级就是用来解决这个问题的,通过使用动态加载器启动 McPatch 客户端后,McPatch 客户端就可以间接地自己更新自己的版本了 7 | 8 | 说明:热升级新版本之后,需要第二次启动的时候新版本才会生效,这是一个很小的细节,但是必须要提一下 9 | 10 | ### 兼容性 11 | 12 | 动态加载器目前支持全平台的所有 Minecraft 版本,但最低需要 Java 8 才能运行 13 | 14 | 动态加载器目前支持 McPatch 客户端全版本 15 | 16 | 注意 McPatch 客户端跨大版本升级(1.0升级到1.1)是不支持的,会出现 `version.txt` 文件一直404的情况!原因是新版修改了版本号文件的文件名 17 | 18 | ### 1.客户端首次配置 19 | 20 | 动态加载器需要提前配置在客户端,并且这个文件是永远不需要更新的(除非遇到严重 bug),只更新客户端本体就好 21 | 22 | 1. 下载动态加载器 DynamicLoader(版本选择最新版即可) 23 | 2. 把动态加载器文件复制到目前正在使用的 McPatch 客户端旁边(一定要挨着放,不然会报错) 24 | 3. 双击运行动态加载器,然后会提示什么什么文件为空,无法启动之类的,先不管它,直接叉掉 25 | 4. 打开 `mc-patch-dynamic-loader.txt` 文件(这个文件就是动态加载器的配置文件) 26 | 5. 将目前正在使用 McPatch 客户端的实际文件名(包括后缀名)写入进去,然后保存关闭 27 | 6. 再次运行动态加载器,发现可以启动McPatch客户端了 28 | 8. 打开 Minecraft 启动器,修改原先的 Java 虚拟机参数。将原先 McPatch 客户端的文件名换成动态加载器的文件名(仅替换文件名,其它不动) 29 | 9. 比如原来是 `-javaagent:McPatchClient-11.45.14.jar`,改过之后就是 `-javaagent:DynamicLoader-1.0.0.jar`(最后面的空格不要漏掉,此段代码请勿复制,如果复制必定启动失败) 30 | 10. 回到启动器主页,启动 Minecraft,如果 McPatch 客户端运行起来了,说明配置无误,可以继续进行后面的步骤 31 | 32 | ### 2.管理端这边的操作 33 | 34 | 1. 第一步是手工下载好新版本的 McPatch 客户端文件 35 | 2. 将动态加载器的配置文件 `mc-patch-dynamic-loader.txt` 文件从客户端那边复制到工作空间目录里,以加入更新 36 | 3. 动态加载器的配置文件位置需要放到:能通过更新去覆盖掉客户端对应的文件的位置上就可以,因为每个人位置都不一样,所以没有一个固定的文件位置 37 | 4. 如果你之前做过第 2、3 步骤,那么后续的更新就可以跳这两个步骤 38 | 5. 将新版的 McPatch 客户端本体文件也放入工作空间目录,位置在动态加载器的配置文件的旁边紧挨着 39 | 6. 打开动态加载器的配置文件,先清空原有内容,然后将新版的 McPatch 客户端文件名粘贴进去保存关闭。这样动态加载器就会加载新版本的客户端文件了 40 | 7. 创建一个新的版本,包含这两个文件,然后分发给玩家即可 41 | 42 | ### 一些小提示 43 | 44 | 做远程热升级的时候,务必保证动态加载器的配置文件的内容填写正确,因为填写错误会导致客户端启动失败,游戏也无法启动。解决办法是只能手动给玩家发一份【动态加载器的配置文件】和【客户端本体】替换掉游戏才可以恢复正常 45 | 46 | -------------------------------------------------------------------------------- /docs/v1-old/advance/ignores.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 管理端 ignores.txt 3 | --- 4 | 管理端 ignore 机制类似于 gitignore 文件的用途。可以屏蔽掉工作空间目录下的一些文件或者目录让管理端看不到它们的存在,也就不会被打进更新包里 5 | 6 | 将客户端直接丢到工作空间目录下,或者用软链接链接过去的用户应该会用得上这个功能 7 | 8 | 使用方法很简单,在管理端程序旁边创建一个叫 `ignores.txt` 的文件,在这个文件里一行行写上要忽略的文件就可以了。 9 | 10 | 一些注意的地方: 11 | 12 | + 注意路径分隔符需要使用正斜线(Windows 上也是如此) 13 | + 目前还不支持注释语法,但空行会被忽略 14 | 15 | 从管理端 1.1.10 版本开始更换了文件语法,因此请按不同的版本阅读下方不同的教程 16 | 17 | ### 管理端 1.1.10 和之后的版本 18 | 19 | 从1.1.10开始支持了Glob表达式,支持用简短的语法同时匹配多个文件,相比之前的纯文本匹配效率要高了不少 20 | 21 | ignores.txt 的语法和 gitignore 文件类似,每一行都是一条路径,下面是一些例子: 22 | 23 | + `.minecraft/saves/旧的世界/*`:忽略旧的世界这个目录下面所有的文件不会被打包 24 | + `.minecraft/options.txt`:精准匹配一个文件,让MC的设置文件不会被打包 25 | 26 | 需要注意的是两个方括号 `[]` 在Glob表达式里有特别的意义,且没有转义字符可用,会导致匹配失败。所以请尽量把工作空间目录下文件名中带方括号的文件名换成不带方括号的,这样就可以避免出现这个问题 27 | 28 | ### 管理端1.1.9和之前版本 29 | 30 | 比如添加这样一行:`.minecraft/saves/旧的世界`,可以让`旧的世界`这个目录不被打包 31 | 32 | 这样添加一行:`.minecraft/options.txt`,可以让MC设置文件不会被打包 33 | 34 | ignores文件的写法有三种: 35 | 36 | + 精准匹配文件:`aaa/bbb.txt` 37 | + 精准匹配目录:`aaa/bbb/` 38 | + 模糊匹配文件或者目录:`aaa/bbb`(小提示:忽略目录应优先用这个方法,而不是上面那个) 39 | 40 | ### 进行测试 41 | 42 | 编写好了 ignores 文件之后,打开管理端,可以直接使用 s 命令来很方便地调试文件忽略成功了没有。当然用c命令也是没有问题的 -------------------------------------------------------------------------------- /docs/v1-old/advance/modclient-self-update.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ModClient 自更新教程 3 | --- 4 | 借助 ModClient 的特殊能力,可以实现给 McPatchClient.jar 本身做自更新(即使 McPatchClient.jar 本身是不支持的) 5 | 6 | 下文中所指的 `旧版列表文件` 在不同的 ModClient 版本中,具体文件名不一样,请注意区分: 7 | 8 | + 在 ModClient 版本 1.1.1 和更早的版本中叫 `OldBalloonUpdateFileName.txt` 9 | + 在 ModClient 版本 1.1.1 以后的版本中叫 `OldClientFileName.txt`(不包括1.1.1版本本身) 10 | 11 | 自更新教程: 12 | 13 | 准备好新版本客户端程序,并放在工作空间目录下,对应的原先旧版本客户端程序的位置的旁边 14 | 15 | 比如原先旧版在 `.minecraft/旧版本.jar`,那么新版就要和旧版同目录放置:`.minecraft/新版本.jar` 16 | 17 | 然后在工作空间目录下创建一个文本文件叫 `.minecraft/旧版列表文件`(旧版列表文件这个名字在上文中有提到) 18 | 19 | 打开 `旧版列表文件`,新增一行,将旧版的客户端程序的文件名添加一进去(这样做是为了让 ModClientLoader 自动删除旧版文件)如果有多个旧版,就一行一个 20 | 21 | 最后打包新版本,等待客户端更新 -------------------------------------------------------------------------------- /docs/v1-old/advance/overwrites.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 管理端 overwrites.txt 3 | --- 4 | 管理端 overwrites 是保存文件强制覆盖规则的地方。可以让某些文件在更新时每次都全量打包,而不是只记录增量信息 5 | 6 | 这样即使客户端某些文件被人为修改或者删除,利用这个功能也可以强制更新这些“有问题”的文件。当然前提是这个文件被修改过,如果没有服务端修改,它还是不会被打包的,所以不用担心流量消耗的问题 7 | 8 | 使用方法很简单,在管理端程序旁边创建一个叫 `overwrites.txt` 的文件,在这个文件里一行行写上要覆盖的文件路径就可以了 9 | 10 | 一些注意的地方: 11 | 12 | + 注意路径分隔符需要使用正斜线(Windows 上也是如此) 13 | + 目前还不支持注释语法,但空行会被忽略 14 | 15 | 从管理端 1.1.10 版本开始更换了文件语法,因此请按不同的版本阅读下方不同的教程 16 | 17 | ### 管理端 1.1.10 和之后的版本 18 | 19 | 从 1.1.10 开始支持了 Glob 表达式,支持用简短的语法同时匹配多个文件,相比之前的纯文本匹配效率要高了不少 20 | 21 | overwrites的语法和gitignore文件类似,每一行都是一条路径,下面是一些例子: 22 | 23 | + `.minecraft/saves/旧的世界/*`:让旧的世界这个目录下面所有的文件都被强制覆盖 24 | + `.minecraft/options.txt`:精准匹配一个文件,让MC的设置文件被强制覆盖 25 | 26 | 需要注意的是两个方括号 `[]` 在 Glob 表达式里有特别的意义,且没有转义字符可用,会导致匹配失败。所以请尽量把工作空间目录下文件名中带方括号的文件名换成不带方括号的,这样就可以避免出现这个问题 27 | 28 | ### 管理端 1.1.9 和之前版本 29 | 30 | 管理端 1.1.9 和之前版本只能写单个文件,不支持目录和通配符等语法 31 | 32 | 比如添加这样一行:`.minecraft/saves/options.txt`,可以让MC设置文件每次都会全量打包 33 | 34 | ### 进行测试 35 | 36 | 编写好了 overwrites.txt 文件之后,打开管理端,可以直接使用s命令来很方便地调试文件忽略成功了没有,如果文件匹配成功了,文件名后面会出现 `(强制覆盖)` 的字样,如果看不到则说明匹配失败了 -------------------------------------------------------------------------------- /docs/v1-old/advance/run-as-exe.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 以双击启动客户端 3 | --- 4 | 在某些场景中需要让 McPatch 客户端能够在玩家的电脑上被双击启动。但玩家电脑上 jar 文件普遍都是以压缩软件打开的,或者 PATH 变量里找不到 java.exe,因此无法通过双击启动。此时可以借助 ba 文件来实现双击启动客户端的目的。此功能也可以利用在 PCL 的自定义界面上来实现点击更新按钮后,调用命令行启动 McPatch 客户端 5 | 6 | 首先我们需要下载 `Jar启动助手`,然后将 `java-locator.exe`,`run.bat`,`start.bat` 这三个文件复制到 McPatch 客户端或者动态加载器旁边 7 | 8 | 然后编辑 `run.bat`,将里面的 `DynamicLoader-1.1.jar` 改成你的客户端文件名,或者动态加载器的文件名,这样就指定好了要启动的 Jar 文件,保存关闭 9 | 10 | 双击启动 `run.bat` 即可看到效果 11 | -------------------------------------------------------------------------------- /docs/v1-old/advance/spell-start.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: URL 咒语启动 3 | --- 4 | 配置 URL 咒语启动,云端配置下发以及配置自更新(可选) 5 | 6 | 前置动作: 7 | 8 | 1. 将配置文件、`McPatchClient.jar`、`hmclversion.cfg` 放在 `workspace/` 内,一定要按照您想要的配置修改配置文件。 9 | 2. 打包一个新版本,并按照普通更新流程更新。 10 | 3. 发布更新。 11 | 12 | --- 13 | 14 | 前提条件: 15 | 16 | 您对客户端打开了版本隔离。 17 | 您使用 https、http 任意一个协议共享文件。 18 | 您明白且知道如何教会玩家使用在线导入整合包功能。 19 | 您很确定您的玩家会使用 hmcl。 20 | 21 | --- 22 | 23 | 概念解释: 24 | 25 | - 目录 = 文件夹 = 📁 26 | - 根目录:某目录结构的起点。 27 | - 路径:告诉计算机如何找到某目录或文件的一串字符。 28 | 29 | ### hmcl 30 | 31 | 1. 首先准备好已正确安装 McPatchClient 的客户端,**需要开启版本隔离**。 32 | 2. 打开客户端游戏版本单独设置,填写JVM虚拟机选项,如图: 33 | 34 | ![](../img/6411f6297cc3f.jpg) 35 | 36 | 3. 如您没有将config.yml放置在客户端文件夹,请补上它。 37 | 4. 导出整合包,信息可按照您的喜好填写,但您**必须勾选**下列文件,这是咒语能否起效的关键! 38 | + tips:打开包含启动器后,可以让玩家直接下载整合包并解压,但也失去了在线导入的能力,您可以选择另外导出一份不含启动器的整合包,并一起上传。 39 | 40 | 这是需要的文件列表: 41 | 42 | ![](../img/6411fd659499b.jpg) 43 | 44 | 5. 在存放更新文件的根目录,新建一个目录,上传刚刚导出的整合包。 45 | 6. 组装您的在线整合包url,格式为 `http或https://您存放整合包的网站服务器地址:端口/您的更新地址`,例如 `https://download.example.com/somefile/your-package.zip` 46 | 7. 在您编写客户端安装教程时告诉玩家使用此 url,hmcl 会完全接管安装。 -------------------------------------------------------------------------------- /docs/v1-old/config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 默认配置文件 3 | --- 4 | ## 客户端 mc-patch-config.yml 5 | ``` 6 | # server是更新服务器的地址,是最重要的参数 7 | # 目前支持客户端支持三种服务器源:http源、webdav源、sftp源 8 | # 9 | # http源例子: 10 | # 1. http://127.0.0.1:6600 (默认形式,http协议) 11 | # 2. https://127.0.0.1:6600/subfolder (子目录形式,末尾不要加斜线,https协议) 12 | # ----- --------- ---- --------- 13 | # | | | | 14 | # | | | +------ 子目录(可选) 15 | # | | +-------------- 端口 16 | # | +--------------------- 地址 17 | # +------------------------------ 协议名称,只能是http或者https 18 | # 19 | # webdav源:(webdav源的格式和http源很相似,注意webdav代表走http协议,webdavs代表走https协议,这样写是为了和http源做区分) 20 | # 1. webdav://user:pass:127.0.0.1:80 (默认形式,webdav使用http协议) 21 | # 2. webdavs://user:pass:127.0.0.1:443/subfolder (子目录形式,webdav使用https协议,注意https默认端口为443,而非80) 22 | # ------- ---- ---- --------- --- --------- 23 | # | | | | | | 24 | # | | | | | +------ webdav 目录(可选) 25 | # | | | | +------------- webdav 端口(注意端口不能省略,通常是80和443 26 | # | | | +-------------------- webdav 主机地址 27 | # | | +---------------------------- webdav 密码 28 | # | +--------------------------------- webdav 用户名 29 | # +----------------------------------------- webdav 协议,只能是webdav或者webdavs 30 | # 31 | # sftp源例子: (切勿直接使用Linux登录端口做sftp源,会有极大安全隐患,请使用专业sftp服务器软件!) 32 | # 1. sftp://user:pass:f0:91:07:33:28:19:c5:2c:ea:e4:a9:2b:41:ce:3d:63@192.168.5.133:22/ (默认形式,工作目录本身) 33 | # 2. sftp://user:pass:f0:91:07:33:28:19:c5:2c:ea:e4:a9:2b:41:ce:3d:63@192.168.5.133:22/subfolder (相对目录形式,末尾无斜线) 34 | # 3. sftp://user:pass:f0:91:07:33:28:19:c5:2c:ea:e4:a9:2b:41:ce:3d:63@192.168.5.133:22//subfolder (绝对目录形式,末尾无斜线) 35 | # ---- ---- ---- ----------------------------------------------- ------------- -- ---------- 36 | # | | | | | | | 37 | # | | +---- 密码 主机指纹(请自行确保指纹可信) | | +------- 子目录(可选) 38 | # | +--------- 用户 | +--------------- 端口,通常是22 39 | # +---------------- 协议名称,只能是sftp +----------------------- 主机地址 40 | # 主机指纹支持以下格式 41 | # 1. SHA1:2Fo8c/96zv32xc8GZWbOGYOlRak= (sha1指纹格式) 42 | # 2. SHA256:oQGbQTujGeNIgh0ONthcEpA/BHxtt3rcYY+NxXTxQjs= (sha256指纹格式) 43 | # 3. MD5:d3:5e:40:72:db:08:f1:6d:0c:d7:6d:35:0d:ba:7c:32 (md5十六进制冒号分隔形式) 44 | # 4. d3:5e:40:72:db:08:f1:6d:0c:d7:6d:35:0d:ba:7c:32 (base64编码过的sha1指纹格式或者sha256指纹格式) 45 | # 46 | # 支持多个备用更新源,可以写成“YAML列表语法”的形式来使用多个备用源 47 | # 遇到网络问题时会从上往下依次切换备用的更新源。下面是例子: 48 | # 49 | # server: 50 | # - http://127.0.0.1:6600 # 首选源 51 | # - http://localhost:6600 # 第二个备用源 52 | # - http://[::1]:6600 # 第三个备用源 53 | # 54 | server: http://127.0.0.1:6600 55 | 56 | # 是否禁用界面主题 57 | # true: 禁用界面主题,可以解决窗口出现无响应的问题! 58 | # false: 不会禁用界面主题,运行在某些机器上时可能会出现窗口出现无响应的问题! 59 | disable-theme: false 60 | 61 | # 是否在没有任何更新时,显示暂无更新的对话框(通常是:资源文件暂无更新!) 62 | # true:更新完成后会显示“暂无更新”的对话框,需要手点确定 63 | # false:更新完成后会自动退出,无需手动操作 64 | # 本地调试环境建议开启,线上环境建议关闭。当quiet-mode开启时,本设置会被强制覆盖为false,无法变更。 65 | show-finish-message: true 66 | 67 | # 是否显示更新记录 68 | # true:每次更新完后都会弹出窗口显示更新记录 69 | # false:更新完成后不会弹出更新记录窗口而是继续下载下一个更新 70 | show-changelogs-message: true 71 | 72 | # 是否自动关闭更新记录窗口(无论是否操作) 73 | # 设置为0来禁用这个功能 74 | changelogs-auto-close: 0 75 | 76 | # 安静模式(默认不开启此选项) 77 | # true: 程序启动后不显示窗口,会在后台静默检查文件更新,如果没有更新就直接启动Minecraft, 78 | # 如果有更新再显示下载进度条窗口,此选项可以尽可能将更新助手的存在感降低(只在下载文件时显示窗口) 79 | # false: 程序启动后每次都显示窗口,并在窗口中显示检查文件的进度和下载文件的进度,一切妥当后启动Minecraft 80 | # 此选项仅仅当程序以图型界面模式启动时有效 81 | # 本地调试环境建议关闭,线上环境建议开启 82 | quiet-mode: false 83 | 84 | # 更新时如果发生错误(尤其是网络原因)时,是否继续进入游戏,而不是使游戏崩溃(默认不开启此选项) 85 | # true: 如果更新发生错误,继续启动Minecraft游戏 86 | # false:如果更新发生错误,强制使Minecraft崩溃,停止启动过程 87 | # 如果需要区分是更新问题还是游戏本身的问题,请查看游戏启动日志 88 | # 此选项仅当程序以JavaAgent模式(非图形模式)启动时有效 89 | no-throwing: false 90 | 91 | # 全局http连接超时(单位毫秒,仅对http源有效) 92 | http-connect-timeout: 3000 93 | 94 | # 全局http响应超时(单位毫秒,仅对http源有效) 95 | http-response-timeout: 5000 96 | 97 | # 出现网络问题时的重试次数(对所有源有效) 98 | retry-times: 5 99 | 100 | # 多线程下载时使用的线程数,仅对http源有效,且需要服务端支持断点续传功能 101 | # 自带的MiniHTTPServer不支持断点续传! 102 | concurrent-threads: 4 103 | 104 | # 多线程下载时每个文件块的大小 105 | concurrent-block-size: 4194304 # 默认为4mb 106 | 107 | # 如果客户端当前版本号在服务端的版本列表里不存在时(即版本号损坏),是否自动重头开始下载所有版本 108 | # true:如果客户端版本号出现问题,会从新下载一遍服务端的所有版本以达到修复文件的目的 109 | # false:如果客户端版本号出现问题,会直接报错而不会进行任何额外动作 110 | # 如果选择开启这个选项,重下所有版本,可以自动修复客户端,但会比较费时间和费流量,请仔细权衡 111 | auto-restart-version: true 112 | 113 | # 存储当前版本号的文件(一般无需修改此选项) 114 | # 起始目录为程序Jar文件所在目录 115 | version-file: mc-patch-version.txt 116 | 117 | # 自定义版本号文件名,此功能用于支持灰度更新 118 | server-versions-file-name: versions.txt 119 | 120 | # 自定义Http协议头,仅对Http源和Webdav源生效 121 | # 某些自定义头不会生效,例如 Content-Length 和 Content-Encoding 等等 122 | http-headers: 123 | # User-Agent: This filled by youself # 这是一个自定义UserAgent的配置示例 124 | 125 | # 是否忽略HTTPS更新源的SSL证书验证 126 | ignore-https-certificate: false 127 | 128 | # HTTP/WEBDAV 源的默认下载文件大小,当服务器未报告文件大小时则假定文件为这个大小,默认值为 1 GiB 129 | http-fallback-file-size: 1073741824 130 | 131 | # 此选项用来指定“更新起始目录”,也就是把文件都更新到哪里去。(此目录会从工作目录开始计算) 132 | # 默认情况下,程序会智能搜索.minecraft目录的父目录作为更新起始目录,因此通常不需要手动调整此选项 133 | # 若你要手动指定一个“更新起始目录”,请参考下面的示例 134 | # 示例一、此选项值设置为 '.' 可以将程序工作目录锁定为更新起始目录(同时会禁用自动搜索机制) 135 | # 示例二、此选项值设置为 '../' 可以将程序工作目录的上级目录锁定为更新起始目录(同时会禁用自动搜索机制) 136 | # 示例三、此选项值设置为 'abc' 可以将程序工作目录下的abc目录锁定为更新起始目录(同时会禁用自动搜索机制) 137 | # 示例四、此选项值设置为 '' 也就是空字符串(默认值),程序会智能搜索.minecraft目录的父目录作为更新起始目录 138 | base-path: '' 139 | ``` -------------------------------------------------------------------------------- /docs/v1-old/faq/client.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 客户端FAQ 3 | --- 4 | 一些常见的问题都列举在这里了,希望对你有帮助。 5 | 6 | ### 更新时窗口无响应卡死或者内容丢失 7 | 8 | `影响范围`:客户端全版本 9 | 10 | `问题原因`:目前未知 11 | 12 | `解决方法`:在配置文件里把主题禁用即可 `disable-theme: true` 或者升级到1.0.13或更高的版本 13 | 14 | `其它建议`:如果你在用模组启动时遇到了这个问题,可能会同时遇到在配置文件里关不掉主题的情况,这时请考虑使用 JavaAgent 启动,因为适用于 1.12.1 游戏版本的 BalloonUpdateModLoader 会强制开启主题,然后就会导致未响应的问题出现 15 | 16 | ### 窗口内容是空白 17 | 18 | 使用动态加载器后主题会加载失败,且窗口内容全部是空白 19 | 20 | `影响范围`:客户端小于等于 1.1.3,或者大于等于 1.1.7,同时使用了 DynamicLoader 21 | 22 | `问题原因`:GUI 的兼容性问题 23 | 24 | `解决方法`:升级到客户端 1.1.9 或者以上版本,并用压缩软件打开客户端jar文件删除根目录的 `.no-standalone-process` 文件来切换到独立进程启动可以解决此问题(若遇到进程卡死无法退出的问题请手动创建这个文件回到非独立进程启动,并关闭主题功能) 25 | 26 | ### Javaagent 启动时卡住游戏无法启动 27 | 28 | 在使用 Javaagent 启动时程序结束后游戏无法启动,一直卡在那,需要在任务管理器里手动关闭进程 29 | 30 | `影响范围`:客户端大于 1.0.13 小于等于 1.1.3 31 | 32 | `问题原因`:客户端 1.0.13 开始更换了程序内部的启动方式,尝试以独立的进程启动以绕过限速和窗口未响应的问题 33 | 34 | `解决方法`:换回老的启动方式(此方法需要 1.0.15 或者更高版本):用压缩软件打开客户端jar文件,在根目录下创建一个名为 `.no-standalone-process` 的空文件(也就是在内置配置文件的旁边)然后保存关闭 35 | 36 | ### Error opening zip file or JAR Manifest missing 37 | 38 | ``` 39 | Error occurred during initialization of VM 40 | agent library failed to init: instrument 41 | 42 | Error opening zip file or JAR Manifest missing: McPatchClient.jar 43 | ``` 44 | 45 | `影响范围`:客户端全版本 46 | 47 | `问题原因`:一键启动参数设置有误,找不到 McPatchClient.jar 文件 48 | 49 | `解决方法`:检查 JVM 参数是否设置正确,McPatchClient.jar 是否放到了正确位置 50 | 51 | McPatchClient.jar 需要放到 `.minecraft/` 目录下(如果未开启版本隔离),或者放到 `.minecraft/versions/your-version/` 目录下(如果开启了版本隔离) 52 | 53 | ### 下载限速问题 54 | 55 | 有小概率会遇到下载速度会变得非常慢(约几百 kb/s),远低于浏览器直接下载的速度 56 | 57 | `影响范围`:客户端全版本 58 | 59 | `问题原因`:问题源头目前未知,貌似和操作系统,启动器,Java 发行版,黄历忌宜,游戏版本都有关系 60 | 61 | `解决方法`:此问题目前无法彻底解决,但可以尝试一下方法 62 | 63 | 1. 升级客户端到 1.0.13 或者更高版本(大于等于 1.1.7 需要用压缩软件打开客户端 jar 文件删除根目录的 `.no-standalone-process` 文件) 64 | 2. 把 minihttpserver 更换成 nginx,apache 等专业服务器软件 65 | 3. 更换 Java 发行版,如 openjdk,zulu 等 66 | 4. 尝试使用 sftp 协议更新 67 | 68 | ### 连接被拒绝 69 | 70 | `影响范围`:客户端全版本 71 | 72 | `问题原因`:由于网络原因,服务器拒绝了客户端的 HTTP TCP 请求。俗话叫端口不通 73 | 74 | `解决方法`:这不是程序 bug,请排查与服务器直接的网络是否通畅,是否需要放开安全组规则,配置端口映射,放行服务器防火墙规则,也请检查客户端配置文件中的地址是否填写错误等 75 | 76 | 如果你的服务端部署在公网,请检查客户端报错提示框中的地址是否含有 localhost 或者 127.0.0.1 等字样,如果有,将其修改成你的公网IP地址再重试 77 | 78 | ### 连接超时 79 | 80 | `影响范围`:客户端全版本 81 | 82 | `问题原因`:由于网络原因,服务器未能在指定时间内及时应答客户端的 HTTP TCP 数据包。可能是网络不稳定也可能端口不通 83 | 84 | `解决方法`:这不是程序 bug,请检查客户端与服务器之间的网络是否稳定,防火墙是否放行 85 | 86 | 如果你的服务端部署在公网,请检查客户端报错提示框中的地址是否含有 localhost 或者 127.0.0.1 等字样,如果有,将其修改成你的公网IP地址再重试 87 | 88 | ### 连接中断 89 | 90 | `影响范围`:客户端全版本 91 | 92 | `问题原因`:由于网络原因,已建立的 HTTP TCP 连接被意外断开。俗话叫网络不稳定 93 | 94 | `解决方法`:这不是程序 bug,请检查客户端与服务器之间的网络是否流畅 95 | 96 | ### HTTP状态码不在2xx-3xx之间 97 | 98 | `影响范围`:客户端全版本 99 | 100 | `问题原因`:访问对应 URL 时,服务端返回了一个表示错误的HTTP状态码(即不在 2xx-3xx 之间) 101 | 102 | `解决方法`:如果是 HTTP(s) 源,用浏览器打开这个出错的 URL,根据浏览器的错误信息自行解决。如果是 Webdav 源,请向贡献者报告此问题 103 | 104 | ### HTTP状态码(404)不在2xx-3xx之间(versions.txt) 105 | 106 | `影响范围`:客户端全版本 107 | 108 | `问题原因`:服务端 public 目录下找不到 versions.txt 文件。多出现在忘记使用管理端创建过更新包的情况 109 | 110 | `解决方法`:打开管理端,创建任意一个版本或者更新包。另外,如果你刚升级到客户端 1.1 版本就碰到这个问题,说明你的管理端没有同步更新到 1.1 版本,因为 1.1 版本的客户端和管理端和 1.0 版本是完全不兼容的,需要重新创建所有的更新包(因为格式不兼容) 111 | 112 | ### 拒绝访问 113 | 114 | 错误详情:java.io.FileNotFoundException。且路径所指向的文件是 mc-patch-version.txt 或者 mc-patch.log 115 | 116 | `影响范围`:客户端全版本 117 | 118 | `问题原因`:你把对应的文件属性设置成了隐藏,而隐藏文件是没有写入权限的,所以会报错 119 | 120 | `解决方法`:取消勾选文件的隐藏属性。如果不想让玩家乱点,可以单独创建一个很深的文件夹来存放 McPatchClient 本体和配置文件 121 | 122 | ### Webdav连接失败 123 | 124 | `影响范围`:客户端 1.0.9 版或以上 125 | 126 | `问题原因`:由于网络原因,Webdav 服务器源出现了网络连接层面的错误 127 | 128 | `解决方法`:这不是程序 bug,此时需要根据报错信息后面的状态详情来定位具体原因 129 | 130 | ### java.lang.NoSuchMethodError 131 | 132 | `java.lang.NoSuchMethodError ..... org.apache.http.impl.client.HttpClientBuilder.setSSLContext` 133 | 134 | `影响范围`:客户端全版本 135 | 136 | `问题原因`:目前未知,会出现在 1.16.5 和更高版本上,同时使用 webdav 协议更新 137 | 138 | `解决方法`:删除客户端包内的 `.no-standalone-process` 文件使用独立进程启动;或者使用非 webdav 源进行更新 139 | 140 | ### Stream is not in the BZip2 format 141 | 142 | `影响范围`:客户端 1.0.13 和之前的版本 143 | 144 | `问题原因`:代码 bug 导致 145 | 146 | `解决方法`:升级客户端到 1.0.14 或者更高版本 147 | 148 | ### 客户端版本号重启时删掉了所有的文件 149 | 150 | 当客户端版本号出现问题而重头下载所有版本时,删掉了所有游戏的文件和目录 151 | 152 | `影响范围`:管理端 1.1.0 至 1.1.5(没错这个是管理端问题而非客户端) 153 | 154 | `问题原因`:代码bug导致 155 | 156 | `解决方法`:升级到管理端 1.1.5 或者更高版本,然后重头打包所有更新包(尤其是第一个更新包) 157 | 158 | ### 与图书馆模组 librarianlib 的兼容性问题 159 | 160 | 客户端程序使用 Kotlin 编写,并打包了 Kotlin 标准库。和图书馆模组同时加载时,可能会出现问题 161 | 162 | `影响范围`:客户端全版本 163 | 164 | `问题原因`:截止撰写本条目时,因为图书馆使用了较旧的 Kotlin 标准库版本(1.3),本程序使用(1.7)版本,直接可能会出现冲突 165 | 166 | `解决方法`:此问题无法解决,只能等待图书馆模组将自带的 Kotlin 标准库升级到较新的版本来解决 167 | 168 | 题外话:截止撰写本条目时,图书馆模组的GitHub Issue里也有不少人反馈这个问题,但似乎这个模组很久未更新了 169 | 170 | ### McPatchClient 是否可以自己更新自己 171 | 172 | `问题描述`:McPatchClient 是否可以通过把自身文件加入到更新中来实现自己更新自己? 173 | 174 | `问题解答`:不可以,对运行中的文件进行写入操作会导致未知行为(UB),这是非常危险的。程序已在代码里完全写死以阻止这种危险操作 175 | 176 | `小小提示`:虽然不可以更新客户端程序本身,但是更新配置文件是允许的,但缺点是第二次启动时新的配置文件才会生效 177 | 178 | `解决方法`:可以参考[热升级](../advance/dynamic-loader.md)使用 DynamicLoader,缺点同样是是第二次启动时才会生效 179 | 180 | ### PCL 的修改窗口标题改错了窗口 181 | 182 | `问题描述`:PCL 的修改窗口标题修改了 McPatchClient 的窗口标题,而没有修改Minecraft窗口标题 183 | 184 | `问题原因`:PCL 的检测机制会把第一个出现的窗口当做游戏窗口,当 McPatchClient 加入之后,会挤占这个窗口位置,导致窗口重命名到了 McPatchClient 上 185 | 186 | `解决方法`:此问题无解 187 | 188 | ### 另一个程序已锁定文件的一部分,进程无法访问 189 | 190 | java.io.IOException:另一个程序已锁定文件的一部分,进程无法访问 191 | 192 | `影响范围`:客户端全版本 193 | 194 | `问题原因`:Windows 不允许对一个正在运行中的文件进行读写操作 195 | 196 | `解决方法`:如果你使用 JavaAgent 启动,请不要更新游戏核心文件,游戏资源文件等可能与 McPatchClient 同时处于运行中的文件。如果你未使用 JavaAgent 启动,请检查 Minecraft 进程是否退出再更新 197 | 198 | ### 配置文件中的选项(xxx)无效 199 | 200 | `影响范围`:客户端全版本 201 | 202 | `问题原因`:配置文件中找不到名为 xxx 的配置项,或者配置项的数据类型不正确 203 | 204 | `解决方法`:删除配置文件并重新从文件内部解压重新配置一次 205 | 206 | ### 配置文件无法解码为 yaml 格式 207 | 208 | `影响范围`:客户端全版本 209 | 210 | `问题原因`:配置文件语法错误导致无法解码 211 | 212 | `解决方法`:检查配置文件格式是否正确,注释,缩进,忘打逗号等都会引发这个错误。如果仍然遇到这个错误,请先备份现有的配置文件,然后重新从 Jar 文件里解压官方示例配置文件,并一步步修改,直到定位到错误位置为止(也叫排除法) 213 | 214 | ### mc-patch.json 无法解码为版本 Meta 文件格式 215 | 216 | `影响范围`:客户端版本小于 1.1.0 217 | 218 | `问题原因`:更新包的元数据文件 `.mc-patch.json` 格式不正确,无法解码。此问题多出现在 SakuraFrp 穿透场景中 219 | 220 | `解决方法`:如果你使用了 SakuraFrp,且报错信息中包含 `` 加跟着一长串乱码的话,请检查你的 SakuraFrp 穿透是否出了问题。如果你没有使用 SakuraFrp,请报告此问题。 221 | 222 | ### 找不到 .minecraft 目录 223 | 224 | 即使把Jar客户端放到 `.minecraft` 目录旁也提示找不到的问题 225 | 226 | `影响范围`:客户端全版本 227 | 228 | `问题原因`:启动Jar文件时,在 `打开方式` 中选择了以 Java 启动打开,而非默认 Java 启动 229 | 230 | `解决方案`:将 Jar 文件设置为默认使用 Jav a运行,然后使用双击方式启动 231 | 232 | ### 无法确定版本前后关系 233 | 234 | `影响范围`:客户端全版本 235 | 236 | `问题原因`:客户端的版本号在服务端的 mc-patch-versions.txt(高版本为 versions.txt 或 1.1.7 版本后自定义的文件名)文件里找不到,可能是删掉了某个版本更新包导致 237 | 238 | `解决方法`: 239 | 240 | 1. 让玩家删掉并重新下载一份群文件里的客户端压缩包(十分推荐,省时省力) 241 | 2. 删除客户端的 `mc-patch-client-version.txt` 文件使其重新下载所有的版本更新包(谨慎操作,此行为非常消耗流量) 242 | 3. 修改客户端的 `mc-patch-client-version.txt` 文件,输入一个服务端存在的有效版本号(谨慎操作,可能会导致对某些文件的后续更新直接失效) 243 | 244 | ### 版本的补丁文件的(xxx)已损坏 245 | 246 | `影响范围`:客户端全版本 247 | 248 | `问题原因`:更新包文件(.bin)里的某个文件二进制数据无法通过哈希校验,可能是文件下载时收到了损坏 249 | 250 | `解决方法`:多次重试更新过程 251 | 252 | ### 主机指纹不可信任 253 | 254 | `影响范围`:客户端全版本 255 | 256 | `问题原因`:SFTP 源的服务器字符串中指定的指纹和远程主机报告的指纹不一致,可能出现中间人攻击 257 | 258 | `解决方法`:请自行确认远程主机是否可信,如果可信,请更新 SFTP 源的服务器字符串中的指纹部分 259 | 260 | ### 无效的 sftp 服务器字符串 261 | 262 | `影响范围`:客户端全版本 263 | 264 | `问题原因`:SFTP 源的服务器字符串的格式不正确 265 | 266 | `解决方法`:请仔细阅读配置文件注释和文档,修改服务器字符串的格式。如果仍然遇到这个错误,请先备份现有的配置文件,然后重新从 Jar 文件里解压官方示例配置文件,并一步步修改,直到定位到错误位置为止(也叫排除法) 267 | 268 | ### 无效的 webdav 服务器字符串 269 | 270 | `影响范围`:客户端 1.0.9 版或以上 271 | 272 | `问题原因`:Webdav 源的服务器字符串的格式不正确 273 | 274 | `解决方法`:请仔细阅读配置文件注释和文档,修改服务器字符串的格式 275 | 276 | ### SFTP 身份验证失败 277 | 278 | `影响范围`:客户端全版本 279 | 280 | `问题原因`:SFTP 源的服务器字符串中的用户名或者密码不正确,无法登录SSH 281 | 282 | `解决方法`:将服务器字符串中的用户名和密码修改正确 283 | 284 | ### SFTP Client 打开失败 285 | 286 | `影响范围`:客户端全版本 287 | 288 | `问题原因`:SSH 已经登录成功,但是无法开启 SFTP 通信,可能是服务端 SSH 不支持 SFTP 协议 289 | 290 | `解决方法`:更换 SSH 服务端软件 291 | 292 | ### SFTP 下载文件失败 293 | 294 | `影响范围`:客户端全版本 295 | 296 | `问题原因`:通过 SFTP 下载文件时遇到错误 297 | 298 | `解决方法`:可能是网络原因导致。具体问题原因请看程序报告的错误信息内容 299 | 300 | ### 服务器SSL证书无法验证 301 | 302 | `影响范围`:客户端 1.0.9 版或以上 303 | 304 | `问题原因`:Webdav 源的服务器 SSL 证书无法通过验证,可能是证书已过期,也可能网络被劫持 305 | 306 | `解决方法`:更新服务器证书,并且用浏览器打开未显示证书错误后重新使用 McPatchClient 重试 307 | 308 | 为安全起见,McPatch 无法跳过 Webdav 源的 SSL 证书验证过程,也就是说几乎是不支持自签证书的 309 | 310 | ### 找不到任何更新服务器地址 311 | 312 | `影响范围`:客户端全版本 313 | 314 | `问题原因`:客户端配置文件中的 server 选项不要写一个空列表,这样无法更新任何文件 315 | 316 | `解决方法`:客户端配置文件中的 server 选项不要留空 317 | 318 | ### 未知格式的服务器字符串 319 | 320 | `影响范围`:客户端全版本 321 | 322 | `问题原因`:客户端配置文件中的 server 选项中的某一项因为格式不正确而无法解析 323 | 324 | `解决方法`:仔细阅读示例格式,并对照检查错误。如果仍然遇到这个错误,请先备份现有的配置文件,然后重新从 Jar 文件里解压官方示例配置文件,并一步步修改,直到定位到错误位置为止(也叫排除法) 325 | -------------------------------------------------------------------------------- /docs/v1-old/faq/manage.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 管理端FAQ 3 | --- 4 | 一些常见的问题都列举在这里了,希望对你有帮助。 5 | 6 | ### OutOfMemoryError: Java heap space 7 | 8 | 创建新版本时,打包文件到一半出现这个问题 9 | 10 | `影响范围`:管理端全版本 11 | 12 | `问题原因`:给管理端分配的内存不够大 13 | 14 | `解决方法`:参考下面的《内存不足,打包过程中断》问题 15 | 16 | ### 创建新版本时直接提示版本号为空 17 | 18 | 创建新版本时, 没有任何输入就直接提示版本号为空 19 | 20 | `影响范围`:管理端 1.1.0 至 1.1.2 21 | 22 | `问题原因`:软件 bug 23 | 24 | `解决方法`:升级到管理端 1.1.3 或者更高版本 25 | 26 | ### 暂时不支持打包大小超过2GB的文件 27 | 28 | `影响范围`:管理端全版本 29 | 30 | `问题原因`:受部分 JavaAPI 的限制,Int 类型只能表示 2GB 大小以内的文件 31 | 32 | `解决方法`:不要打包单个大小超过 2GB 的文件 33 | 34 | ### 内存不足,打包过程中断 35 | 36 | `影响范围`:管理端全版本 37 | 38 | `问题原因`:打包过程非常消耗内存,如果分配的内存过少,又要执意进行打包,可能会出现这个问题 39 | 40 | `解决方法`:使用 JVM 参数 `-Xmx4g` 或者 `-Xmx4096m` 分配更多内存(同 Minecraft 服务端设置的方式) 41 | 42 | 此问题多出现在打包大型文件时,一般认为超过 100mb 以上的单文件为大型文件,打包越大的文件时越应该有更大的内存 43 | 44 | 注:出现此问题的概率 = 文件大小的平方(没错就是平方) 45 | 46 | ### 补丁文件超过了 2Gb 大小的限制 47 | 48 | `影响范围`:管理端全版本 49 | 50 | `问题原因`:一次性打包的内容太多,导致最终补丁文件超过你2Gb大小的限制,受部分 JavaAPI 的限制,Int 类型只能表示 2GB 大小以内的文件 51 | 52 | `解决方法`:将一次更新分开打包到多个更新包里 53 | 54 | ### Stream is not in the BZip2 format 55 | 56 | `影响范围`:管理端 1.0.3 和之前的版本 57 | 58 | `问题原因`:代码 bug 导致 59 | 60 | `解决方法`:升级到 1.0.4 或者更高版本 61 | 62 | ### 是否有类似 gitignore 的机制 63 | 64 | 是否有类似 gitignore 机制来忽略对工作空间目录下某些文件的打包,这样就让管理端和客户端共用一份目录了 65 | 66 | 没有这个机制,建议管理端和客户端的维护分开维护,不要共享,这会在很大程度上避免很多非常隐蔽的暗坑 -------------------------------------------------------------------------------- /docs/v1-old/guide/auto-start.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 一键启动 3 | --- 4 | 一键启动可以让 McPatchClient 在 Minecraft 启动时自动弹出更新,无需手动运行,适合线上环境使用 5 | 6 | 在配置一键启动之前,必须要确保 McPatchClient 双击启动没问题! 7 | 8 | 目前共有三种不同的启动方式,各自有不同的特点,下面是功能对比 9 | 10 | | 启动方式 | 支持游戏版本 | 支持的平台 | 猫反兼容 | 11 | | ----------------------------- | ------------ | ---------- | -------- | 12 | | [Windows平台](#Windows) | 全版本 | 仅电脑端 | 坏 | 13 | | [Android平台](#Android) | 全版本 | 仅手机端 | 坏 | 14 | | [模组方式启动](#模组方式启动) | 部分版本 | 全平台 | 好 | 15 | 16 | 如果你有安装猫反作弊,而 Windows 平台的方法又不能正常工作,可以尝试使用[模组方式启动](#模组方式启动)来避免这个问题。但此方式并非支持所有的Minecraft版本和模组框架 17 | 18 | ## Windows 19 | 20 | 1. 首先确保 McPatchClient.jar 双击启动没问题 21 | 2. 将McPatchClient.jar文件移动到`.minecraft`目录里面(注意是里面不是旁边) 22 | 3. 打开启动器,找到JVM(Java虚拟机)参数。在现有内容的最前面插入一段`-javaagent:xxx.jar `(`xxx`换成McPatchClient.jar的实际的文件名,注意`.jar`的后面还跟着一个空格别漏了) 23 | 4. 启动游戏测试效果 24 | 25 | 如果游戏无法启动,并且提示找不到 McPatchClient.jar 的文件名,而你又十分确定文件名没有写错时。记得看看你是不是开启了版本隔离,如果是,请将 McPatchClient 的文件移动到 Minecraft 游戏版本的核心文件旁边(核心文件通常由两个同名的 jar 和 json 文件组成,在 `.minecraft/version/your-version` 目录下) 26 | 27 | 如果配置之后 McPatchClient 并没有随 Minecraft 启动(游戏正常启动也没有闪退啥的),请检查是否是开启了启动器的 `版本特定设置` 导致配置实际并未生效 28 | 29 | --- 30 | 31 | McPatch 客户端支持通过 hmcl 的下载整合包功能在线安装,点击[这里](../advance/spell-start.md)来阅读详细教程 32 | 33 | ### 游戏崩溃 34 | 35 | 当 McPatchClient 在运行过程中遇到网络问题,或者其它错误时,***会主动崩溃掉 Minecraft 进程!*** 这是刻意的设计 36 | 37 | 如果启动过程中发生闪退或者崩溃,请首先***翻阅日志末尾***,判断是否是 McPatchClient 主动使得 Minecraft 进程崩溃的,或者其他原因所导致 38 | 39 | 如果排查日志后发现确实是 McPatchClient 主动崩溃所致,错误信息中会有中文文字很清晰地说明具体是什么原因导致的游戏崩溃。并且每条日志前面都会有`McPatchClient`的字样标明这是一条 McPatchClient 的日志 40 | 41 | 当然,在 McPatchClient 主动崩溃 Minecraft 进程之前,会有非常显眼的错误提示框告诉你发生什么错误,错误可能是什么原因导致的。当你点击确定或者取消按钮以后,表明你已经知晓了是 McPatchClient 报告的错误之后,McPatchClient 才会真正崩溃掉 Minecraft 进程。 42 | 43 | 如果你不喜欢这种直接崩溃的做法,可以在配置文件里设置 `no-throwing` 选项来让 McPatchClient 遇到错误时不打断游戏启动的过程,而不是弹出崩溃 Minecraft 询问框。但这样做可能会导致一些莫名其妙的问题(比如有模组未更新就强行进入游戏会导致无法进服) 44 | 45 | ## Android 46 | 47 | 教程这里以澪和 HMCLPE 作为示例 48 | 49 | 1. 首先确保 McPatchClient 在电脑上双击启动没问题 50 | 2. 将 McPatchClient.jar 和配置文件一起复制到游戏目录下,所谓游戏目录就是指 .minecraft 目录,无论何时,McPatchClient.jar 和 config.yml 都需要放到 .minecraft 里面,注意是里面不是旁边 51 | 1. 澪的默认路径:`/sdcard/MioLauncher/.minecraft` 52 | 2. HMCLPE的默认路径:`/sdcard/HMCLPE/.minecraft` 53 | 3. 如果你开启了版本隔离,请将 McPatchClient 的文件移动到 Minecraft 游戏版本的核心文件旁边(核心文件通常由两个同名的 jar 和 json 文件组成,在 `.minecraft/version/your-version` 目录下) 54 | 3. 配置启动参数 55 | 1. 澪:切换到 `游戏配置` 页面,在游戏参数(JVM参数)的最前面插入一段内容 `-javaagent:xxx.jar `(`xxx` 换成将 McPatchClient.jar 的实际的文件名,注意 `.jar` 的后面还跟着一个空格别漏了)接着点击保存按钮,然后重启澪 56 | 2. HMCLPE:切换到 `版本列表`,修改全局游戏设置或者特点版本设置,在Java虚拟机参数的最前面插入一段内容 `-javaagent:xxx.jar `(`xxx` 换成将 McPatchClient.jar 的实际的文件名,注意 `.jar` 的后面还跟着一个空格别漏了),然后点击房子按钮回到主界面 57 | 4. 启动游戏测试效果 58 | 1. 澪:请打开日志窗口观察 McPatchClient 是否运行成功 59 | 2. HMCLPE:截止到撰写教程时未能成功打开日志窗口,只能手动查看 HMCLPE 的日志文件 `/sdcard/Android/data/com.tungsten.hmclpe/files/debug/boat_latest_log.txt` 60 | 5. 如果游戏启动后马上闪退,请翻阅日志末尾判断是否是参数配置不正确或者其它原因 61 | 6. 如果日志只有短短几行,且有出现这样的内容:`Error opening zip file or JAR manifest missing : McPatchClient-1.0.1.jar` 说明启动参数配置不正确,McPatchClient.jar 这个文件找不到,请检查是否放到了 .minecraft 目录下面(开启版本隔离后需要放到游戏核心文件旁边) 62 | 7. 如果每一行日志信息的开头都有 `[McPatchClient]` 的字样,说明此次崩溃是由 McPatchClient 引起的,这种情况去翻阅常见问题解答就可以解决,如果是其它复杂的情况,请向报告这个问题 63 | 64 | ### 优化小提示 65 | 66 | Android 平台通常使用 ARM 处理器和 LPDDR 内存,无论是处理器功耗还是内存带宽都相当有限,所以请尽量控制每次客户端体积大小。不要给游戏加载体积特别大的模组(尤指大小超过50Mb以上),不仅会导致更新过程变长,也会影响 Minecraft 游戏的启动速度 67 | 68 | ### 游戏闪退崩溃 69 | 70 | 虽然 McPatchClient 可以跑在 Android 平台上,但是却无法像 PC 端那样显示更新进度条窗口,一切的更新过程都是在后台进行的 71 | 72 | 当McPatchClient在运行过程中遇到网络问题,或者其它错误时,***会主动崩溃掉 Minecraft 进程!*** 这是刻意的设计 73 | 74 | 如果启动过程中发生闪退或者崩溃,请首先***翻阅日志末尾***,判断是否是 McPatchClient 主动使得 Minecraft 进程崩溃的,或者其他原因所导致 75 | 76 | 如果排查日志后发现确实是 McPatchClient 主动崩溃所致,错误信息中会有中文文字很清晰地说明具体是什么原因导致的游戏崩溃。并且每条日志前面都会有 `McPatchClient` 的字样标明这是一条 McPatchClient 的日志 77 | 78 | 如果崩溃信息里找不到 McPatchClient 相关的字样说明是其它原因导致的崩溃,也就是说崩溃和 McPatchClient 没有直接的关系 79 | 80 | 如果你不喜欢这种直接崩溃的做法,可以在配置文件里设置 `no-throwing` 选项来让 McPatchClient 遇到错误时不打断游戏启动的过程,而不是主动崩溃游戏进程。但这样做可能会导致一些莫名其妙的问题(比如有模组未更新就强行进入游戏会导致无法进服) 81 | 82 | ## 模组方式启动 83 | 84 | 模组方式启动优点在于对猫反作弊模组友好,不用配置易出错的 Java 虚拟机参数 85 | 86 | 但是不足是仅支持部分游戏版本和模组框架,还有能更新的文件范围大大受限,模组文件只能更新除 CoreMod、Minecraft 核心文件、Minecraft 资源文件以外的其它文件 87 | 88 | 使用教程如下: 89 | 90 | 首先访问 ModClient 仓库的 [Releases页面](https://github.com/BalloonUpdate/ModClient/releases),下载合适版本的 ModClient 模组文件并安装到你的游戏模组目录中,同时请详细阅读 Releases 页面里的下载说明! 91 | 92 | > 目前模组形式一键启动支持的游戏版本有限,如果没有你需要的版本,可以尝试使用别的方式启动 93 | 94 | 接着将 McPatchClient.jar 文件移动到 `.minecraft` 目录里面。如果开启了版本隔离,就要移动到 Minecraft 游戏版本的核心文件旁边(核心文件通常由两个同名的jar和json文件组成),比如 `.minecraft/versions/your-version/` 这里 95 | 96 | 将 McPatchClient.jar 的文件名后面增加一串文字 `-JarClient`(注意大小写),比如 `McPatchClient-1.0.5.jar` 变成 `McPatchClient-1.0.5-JarClient.jar` 97 | 98 | > 虽然 ModClient 是为 JarClient 设计,但只要在文件名里加上 `-JarClient`,McPatch也能正常运行 99 | 100 | 接下来就是启动游戏测试效果(如果之前有配置过 javaagent 一键启动请删掉 Java 虚拟机参数避免重复启动) 101 | 102 | --- 103 | 104 | 如果你某些模组文件更新失败,删除失败,但客户端程序日志里又没有明显报错消息,那么你多半是遇到了模组启动优先级的问题。也就是这些更新失败的模组先于 BalloonUpdateModLoader 模组启动了 105 | 106 | 遇到这个问题尝试在 BalloonUpdateModLoade 模组的文件名最前面加一个英文感叹号 `!` 来提升 BalloonUpdateModLoader 模组的启动优先级,确保 BalloonUpdateModLoader 先于要被更新的模组启动 107 | 108 | --- 109 | 110 | ModClient 支持给 McPatchClient.jar 本身做自更新,可以点击[这里](../advance/modclient-self-update.md)阅读详细的教程 111 | -------------------------------------------------------------------------------- /docs/v1-old/guide/caution.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 注意事项 3 | --- 4 | ## 文件的下载位置 5 | 6 | 文件的下载位置不受客户端程序的路径影响。客户端程序会自动搜索 .minecraft 的父目录,依次作为更新的起始目录 7 | 8 | 因此到处移动客户端程序不会影响文件的下载或者说更新的位置。如果要禁用这个机制,可以在配置文件里调整 `base-path` 选项 9 | 10 | 移动客户端程序时,记得带着 `mc-patch-version.txt` 和配置文件一起移动,否则程序会找不到配置文件报错 11 | 12 | ## 文件会更新失败 13 | 14 | 若客户端里的某个文件在更新时,检测到文件内容被玩家人为修改过了(或删除),那么这个文件会跳过更新(丢失更新状态),后续所有对这个文件的更新都会直接跳过,也就是会更新失败 15 | 16 | 这不是程序BUG,这是特意的设计。原因是因为管理端打包会对比新旧文件,生成差异文件(补丁文件) 17 | 18 | + 旧文件 + 新文件 => 补丁文件 19 | 20 | 然后客户端会下载这个补丁文件把旧文件修补(合并)成新文件 21 | 22 | + 补丁文件 + 旧文件 => 新文件 23 | 24 | 这样只记录差异的方法可以很大程度上节省更新流量 25 | 26 | 但也有一个致命的缺点:当客户端合并文件时,如果旧文件被修改过,那么最终合并出来的新文件数据就是完全错乱的 27 | 28 | 为了不引起文件数据错乱,客户端选择了跳过对这些文件的更新。同时也保留了玩家自己的个性化设置数据不被更新覆盖(直到这个被修改的文件在服务端被删除才会打破循环,重新加入更新) 29 | 30 | 这个机制导致了玩家不能“手贱”修改文件,否则会导致这个文件在他的电脑上,从此之后的更新全部失败(但其它玩家不会受影响) 31 | 32 | ## 版本发错了怎么办 33 | 34 | 更新包一旦发布就不能撤回,撤回可能会导致客户端某些文件更新永久更新失败,而且这种问题很难发现和调试。你应该额外再发布一个版本来替代撤回 35 | 36 | 如果你100%确定刚发布的错误版本没有任何人下载的话,可以使用以下方法来撤回: 37 | 38 | 1. 打开 `public` 目录下的版本列表文件:`mc-patch-versions.txt` 或 `versions.txt`,将错误版本那一行连带后面所有的行都删除掉(**这一行前面部分的千万别改动**) 39 | 2. 比如 123456 这 6 个版本中,4出了问题,就要撤回456三个版本,就在版本列表文件里删除456这三行,使3这一行成为文件末尾 40 | 3. 接着删除 publi c目录下 456 这三个版本对应的 json 文件和 bin 文件 41 | 4. 最后运行管理端,在主菜单输入(1.0 版本输入 `bv` ,1.1版本输入 `revert` )进入还原菜单,恢复 workspace 目录和 history 目录的内容。恢复所需的时间和已有版本的数量成正比,如果版本非常多,过程可能会非常慢 42 | 5. 这样就回退到了你发布错误版本号之前的状态了 43 | 6. 如果你不能100%保证没有任何人下载过这个错误的版本,就不要撤回版本,否则那个人会出现各种各样的奇奇怪怪的问题 44 | 45 | ## 怎么删掉管理端不存在的文件 46 | 47 | 在使用过程中,有时会想删除一些在客户端存在,但管理端不存在的文件。这些文件没法用往常办法删除 48 | 49 | 删掉这些不存在的文件有两个方法,一个是加入更新之后再删掉,一个是直接修改更新包内部数据 50 | 51 | 通常情况下建议使用第一个方法,更加安全可靠不易出错。第二种方法适合大佬,因为要改一些内部数据,但好处是快,能一步到位 52 | 53 | 第一种方法很简单 54 | 55 | 1. 客户端有个叫 `abc.jar` 的文件需要删除 56 | 2. 先在工作空间目录下的相同位置下,创建一个同名的空文件 `abc.jar`) 57 | 3. 然后开启管理端创建一个新版本(这样 `abc.jar` 就从未加入更新的状态变为加入更新的状态了) 58 | 4. 接着把刚创建的 `abc.jar` 删掉,再创建一个新版本 59 | 5. 客户端会依次下载这两个版本,最终的效果就是这个文件被成功删除掉了 60 | 61 | 第二种方法仅适用于管理端 1.1 或者更新的版本 62 | 63 | 1. 创建一个空的版本号 64 | 2. 直接打开更新包zip里的 `.mcpatch-meta.json` 文件 65 | 3. 在 `old-files` 字段处添加要删除的文件的相对路径(相对工作空间目录的路径),路径分隔符用正斜线 66 | 4. 保存关闭 `.mcpatch-meta.json` 文件并更新回更新包zip文件 67 | 68 | ## 不小心修改了 history 目录 69 | 70 | 如果你不小心修改了 history 目录下的内容,可以在主菜单输入(1.0 版本输入 `bv`,1.1 版本输入 `revert`)进入还原菜单来同时还原 workspace 目录和 history 目录,注意使用此命令会丢失已有修改,注意备份重要数据 71 | 72 | 恢复所需的时间和已有版本的数量成正比,如果版本非常多,过程可能会非常慢 73 | 74 | ## 加密配置文件和版本号文件 75 | 76 | > 此特性仅 McPatchClient 1.0.11 或更高版本支持 77 | 78 | 这里的加密不是真的加密,而是将内容以 base64 编码后以非明文保存,不能起到绝对的安全防护的作用 79 | 80 | 加密配置文件(config.yml/mc-patch-config.yml):将整个配置文件内容复制后使用Base64进行编码,然后删掉原有内容,将编码后的内容粘贴进去,然后在文件的开头添加单个英文冒号 `:` 用来告诉程序配置文件被“加密”了,使用之前要先“解密” 81 | 82 | 加密版本号文件(mc-patch-version.txt):将整个版本号文件内容复制后使用Base64进行编码,然后删掉原有内容,将编码后的内容粘贴进去,然后在文件的开头添加单个英文冒号 `:` 用来告诉程序配置文件被“加密”了,使用之前要先“解密” 83 | 84 | 注意:配置文件和版本号文件“加密”后,不会影响日志文件里的账号密码信息的显示,如果在意,可以在配置文件里禁用日志文件生成 85 | 86 | ## 避免仅修改文件名大小写 87 | 88 | 如果有个文件叫 abc.jar 你将其改名成 Abc.jar 然后打包,这种情况会出问题! 89 | 90 | 你改成 Abc1.jar 都没事,改成 Ab.jar 也可以,但唯独 Abc.jar 不行 91 | 92 | 客户端遇到这种文件时,会直接删掉 abc.jar,而不下载 Abc.jar,然后这个文件就会永久更新失败 93 | 94 | 这个问题的原因是文件系统不区分文件名大小写造成的 95 | 96 | 从管理端 1.1.9 版本开始遇到这种文件会直接打包失败,避免将有问题的数据带进更新包。而在这之前的版本中,需要人为避免出现这种情况 97 | 98 | ## 版本号并非判断新旧的依据 99 | 100 | 版本号只是一个普通的标签,是给人类看的,程序不会解析对比版本号的文字,也不作为任何判断版本前后的依据。 101 | 102 | 实际版本的新旧顺序是按你打包的时间来判断的,后打的版本总是比先打的版本要新 103 | 104 | 版本号并没有规定一定要往高走,也可以往低走。就是说你可以从 1.5 版本更新到 1.4 版本。这算更新而非回退,因为 1.4 版本晚于 1.5 版本打包,所以被认为是较新的版本 105 | 106 | 至于哪个版本更新,哪个版本更旧?可以亲自打开版本列表文件看看(**注意只能看不能改**) 107 | 108 | ## 客户端配置文件可以隐藏吗 109 | 110 | 不行!不仅是配置文件,连日志文件也不能隐藏。因为隐藏的文件没有写入权限,程序会报错 111 | 112 | ## 修复客户端的文件 113 | 114 | 使用此功能需要1.1版本或者更高版本的管理端和服务端 115 | 116 | 从1.1版本开始,更新包开始划分为增量包和全量包两种。最先创建的第一个版本永远是全量包,后面创建的永远是增量包。无论客户端文件损坏成什么样,只要能运行 McPatch 就可以利用全量更新包机制把整个客户端重新安装一次 117 | 118 | 方法很简单:删除客户端的版本号文件即可。客户端会自动重头开始下载所有的更新包并依次安装 119 | 120 | 需要注意: 121 | 122 | 1. 这个功能如果在配置文件里被手动关闭了,是不起作用的(默认是开启的) 123 | 2. 完整下载一边所有的更新包会非常消耗时间,也非常消耗流量和带宽 124 | 3. 文件的修复范围仅限于加入过更新的文件(也就是工作空间目录里曾经出现的文件和目录) 125 | 126 | -------------------------------------------------------------------------------- /docs/v1-old/guide/client.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 安装客户端 3 | --- 4 | :::tip 5 | 6 | 首先推荐你把客户端先整个备份一遍,以避免调试更新时误删了重要的文件(尤其是第一次使用 McPatch 时) 7 | 8 | ::: 9 | 10 | 我们把客户端程序文件复制到你客户端的 `.minecraft` 目录的旁边(紧挨着) 11 | 12 | 用压缩软件打开客户端程序文件,把配置文件 `mc-patch-config.yml` 或者 `config.yml` 解压到旁边,并打开编辑 13 | 14 | 接着把在“远程访问测试”或者“本地访问测试”中提到的链接(优先使用前者提到的链接),粘贴到配置文件的 `server` 选项后面,然后保存关闭(具体使用哪一个链接取决于你的部署环境是局域网还是广域网) 15 | 16 | :::warning 17 | 18 | 如果你发现你没有这个链接,那么你很可能是跳过了访问测试的步骤,这个步骤很重要请不要跳过去 19 | 20 | ::: 21 | 22 | 接着双击运行客户端主程序,此时会开始更新刚刚打包的第一个版本 23 | 24 | 更新完成后检查一下 `mc-patch-version.txt` 这个文件的内容,确保是 `1.0` 或者你刚创建的版本号 25 | 26 | 到此,客户端就算配置成功了。 27 | 28 | --- 29 | 30 | 最后,请请仔细阅读[注意事项](../guide/caution.md),这里写的都是最、最、最常见的问题,看过后帮你少踩很多坑!内容包括但不限于: 31 | 32 | 1. 不小心发错版本怎么办? 33 | 2. 为什么个别文件会更新失败? 34 | 3. 不小心修改了 history 目录怎么还原? 35 | 4. 怎么加密配置文件? 36 | 37 | :::tip 38 | 39 | 如果你确定配置文件已经调试完成,不会再改它,可以把这个文件打包回 `McPatchClient.jar` 里,然后删除外部的配置文件,程序会自动读取 Jar 内部的配置文件,以保持目录整洁 40 | 41 | ::: 42 | -------------------------------------------------------------------------------- /docs/v1-old/guide/manager.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 创建更新包 3 | --- 4 | ## 准备要更新的文件 5 | 6 | 第一步,首先需要决定好哪些文件要更新,哪些不需要。然后把需要更新的文件,复制到`workspace`目录里去,注意复制时需要保持与在客户端相同的文件结构。 7 | 8 | 下面一些栗子可以参考:(不存在的文件夹需要手动创建) 9 | 10 | + 要更新所有模组,复制 `.minecraft/mods` 目录 11 | + 到 `mp/workspace/.minecraft/mods` 12 | 13 | + 要更新资源包,复制 `.minecraft/resourcepacks` 目录 14 | + 到 `mp/workspace/.minecraft/resourcepacks` 15 | 16 | + 要更新.minecraft目录旁边的 `新玩家进服教程.txt`,复制 `新玩家进服教程.txt` 文件 17 | + 到 `mp/workspace/新玩家进服教程.txt` 18 | 19 | + 如果你开了版本隔离,就需要复制 `.minecraft/versions/your-version/mods` 目录 20 | + 到 `mp/workspace/.minecraft/versions/your-version/mods` 21 | + 其它文件也是同理,需要复制到versions目录下 22 | 23 | 到这里你可能已经看出规律了:`workspace` 目录相当于本地的 `.minecraft` 的父目录。只有 `workspace` 目录和客户端保持相同文件结构,文件才能更新到正确的地方 24 | 25 | :::tip 26 | 若开启了版本隔离,那么要更新的实际上是 versions 目录下的 mods 文件夹,具体可以看上面的最后一条例子。(客户端程序本身严格按照管理端摆放的文件结构更新,不会读取任何MC或者启动器的配置信息) 27 | ::: 28 | 29 | :::warning 30 | 31 | 不要一股脑把整个 `.minecraft` 目录全部丢进更新,Minecraft 的核心文件和 Minecraft 的资源文件大部分情况下是不能加入更新的,尤其是打算配置一键启动时,会导致更新失败! 32 | 33 | ::: 34 | 35 | ## 创建首个更新包 36 | 37 | 接下来可以开始创建更新包了,首先双击刚创建的 `manage.bat` 脚本即可启动管理端。管理端使用交互式命令行来完成各种操作,即使是在黑框命令行下也非常简单易用 38 | 39 | 看到主界面以后,我们输入 `c` 或 `1`,按下回车键就可以开始创建第一个更新包。第一个版本号通常输入 1.0,当然你也可以输入任何你喜欢的版本号风格,好了之后按 Enter 确定 40 | 41 | :::warning 42 | 43 | 版本号只能包括大小写字母数字,以及 `!@#$()_+-=;',.` 切勿使用中文,空格,或其它字符 44 | 45 | ::: 46 | 47 | 输入版本号之后,程序会列出你对文件的所有更改。因为我们是第一次打更新包,文件很多,我们粗略看一下就好,后续打包建议还是稍微看一下这个列表,确保对文件的修改都是没问题的 48 | 49 | 如果给这个版本写更新记录,可以在此时打开 `changelogs.txt` 文件,把你的更新记录粘贴进去并保存(更新记录只能使用 UTF8 编码的纯文本,不支持富文本格式)。如果你不想写更新记录,请直接跳过这一步 50 | 51 | 接着输入 `y` 开始正式打包,首次打包内容一般都较大,可能会花费相当多的时间,请耐心等待 52 | 53 | 等到出现 `创建版本完成` 的字样后,就说明打包成功了(更新包文件会保存在public目录下) 54 | 55 | :::danger 56 | 57 | 请勿替换更新包中的任何文件,包中存储的是 bzip 压缩数据,并非原样存储,胡乱修改会导致客户端报错和后续更新全部失败!(如果你一定要修改包中文件,请在修改完后,使用管理端 t 命令来验证压缩包完整性) 58 | 59 | ::: 60 | 61 | :::danger 62 | 63 | 已经发布的更新包不支持撤回,更不能手动删除文件,这会导致后面更新的文件数据错乱,且不会触发任何的报错弹框。此时应该再打一个新的版本来修复上个版本里的问题 64 | 65 | 若实在需要撤回这个版本,请参考[版本发错了怎么办](./caution.md#版本发错了怎么办) 66 | 67 | ::: 68 | 69 | ## 后续发布新版 70 | 71 | 后续发布新版本很简单,只需要对 `workspace` 目录下的文件做修改(就像对本地文件一样修改就好),然后打一个更新包就完成了,管理端会自动检测新旧文件差异生成更新包。 72 | 73 | 比如我想要删除客户端的一个模组 a.jar 再添加一个新的模组 b.jar,那么只需要在工作空间目录下删掉 a.jar 然后复制进去 b.jar,接着打包新版本就好 74 | 75 | 若新旧文件同名,但文件内容被修改了也只一样的做法:直接覆盖旧文件就好,程序也能自动检测到 76 | 77 | 对目录的新建和删除也是一样,该怎么新建怎么新建,该什么删除怎么删除,就就像对本地文件一样进行这些操作 78 | 79 | 如果你在工作空间目录改了一些文件,但又觉得不妥,想要还原工作空间到没修改之前,可以启动管理端,输入 `4` 或 `restore` 来还原 80 | 81 | ## 目录用途说明 82 | 83 | 1. worksapce 工作空间目录:服主日常维护客户端文件内容的地方 84 | 2. history历史目录:用来作为对比,以计算你对 workspace 目录做了哪些修改的目录 85 | + 此目录由程序自动维护,切勿手动修改,会导致数据错乱,若不小心修改了,参考[注意事项](./caution.md#不小心修改了history目录)来还原 86 | 3. public公共目录:用来存放历史更新包, 87 | + 版本列表文件(versions.txt)—— 这个文件仅 1.1 版本的管理端才有 88 | + 更新包文件(.zip)—— 这个文件仅 1.1 版本的管理端才有 -------------------------------------------------------------------------------- /docs/v1-old/guide/preparations.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 准备工作 3 | --- 4 | 一些使用小提示: 5 | 6 | 1. 熟悉一些计算机相关的知识会让你在使用过程中遇到的坑更少 7 | 2. 遇到问题先来常见问题解答找答案,这里收录了大部分常见的报错信息 8 | 3. 有过开服经验或者 Java 开发经验会让你上手的更快 9 | 10 | ## 下载文件 11 | 12 | 在开始安装 McPatch 之前,你需要先下载好这些文件: 13 | 14 | 1. `McPatchManage.jar`(管理端):用来打更新包 15 | 2. `MiniHttpServer.jar`(服务端):小白友好的HTTP服务器,用来让客户端下载更新 16 | 3. `McPatchClient.jar`(客户端):用来更新客户端文件 17 | 18 | 然后在桌面新建一个文件夹叫 `mp`(名字可以随意),再把管理端和服务端放进去,要放到一起 19 | 20 | ## 编写启动脚本 21 | 22 | 接下来需要编写两个简单的启动脚本来启动管理端和服务端 23 | 24 | 1. 打开刚创建的 `mp` 目录 25 | 2. 新建 `manage.bat`,粘贴 `java -jar xxx.jar & pause`,然后保存关闭 26 | + 把 `xxx` 换成管理端的实际文件名 27 | 3. 新建 `httpserver.bat`,粘贴 `java -jar xxx.jar & pause`,然后保存关闭 28 | + 把 `xxx` 换成服务端的实际文件名 29 | 4. 在 `mp` 目录下创建一个新的目录叫 `workspace` 30 | 31 | 每个文件的用途: 32 | 33 | + `manage.bat` 脚本用来启动管理端,打新的更新包,用完后可以关掉管理端 34 | + `httpserver.bat` 脚本用来启动服务端,给客户端下载用,需要一直开着不能关闭 35 | + `workspace` 目录用来存放你要更新的文件 36 | -------------------------------------------------------------------------------- /docs/v1-old/guide/server.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 搭建服务端 3 | --- 4 | McPatch 的服务端是分离架构,打包版本和启动服务端是分开进行的,以方便大佬们魔改出自己的更新系统 5 | 6 | ## 启动服务端 7 | 8 | 如果你是小白,非常建议使用自带的服务端,也就是 `MiniHttpServer`,开箱即用,无需任何配置 9 | 10 | 启动自带的服务端很简单,在之前的教程中我们已经编写好了启动脚本,此时直接双击 `httpserver.bat`文件就可以启动自带服务端了 11 | 12 | 启动成功后服务端会自动输出一个叫 `API地址` 的东西,我们需要复制这个地址,后面会有用 13 | 14 | ## 本地访问测试 15 | 16 | 使用自己电脑上的浏览器打开刚复制的 `API地址`,若显示 `FORBIDDEN: Directory is unable to show` 就表示服务端正常启动了。此时将浏览器中的地址复制一份,后面会用到 17 | 18 | 若你是在 VPS 上搭建服务端,那么需要使用 VPS 上的浏览器访问,而不是用自己电脑上的浏览器 19 | 20 | 这一步测试99%会成功,如果失败记得看看是不是6600端口冲突了,换个端口再试试 21 | 22 | ## 远程访问测试 23 | 24 | 接着是远程访问测试,这一步很重要,因为你安装 McPatch 最终是要发出去给玩家用的,而不是给自己用的 25 | 26 | :::danger 27 | 28 | 远程访问测试很重要,可以推迟,但不要跳过!浏览器显示的报错信息远比客户端程序丰富,对调试网络问题有极大的帮助! 29 | 30 | ::: 31 | 32 | 测试过程不复杂,将 McPatch 的端口(6600)映射出去之后,或者放行防火墙,安全组之后。将 `API地址` 里的本地 IP 地址替换为你外网的 IP 或者域名再浏览器进行访问就行了。注意此时要用你自己电脑上的浏览器,而不能用服务器上安装的 33 | 34 | 满足以下所有条件,才能算所测试通过: 35 | 36 | 1. 浏览器显示:`FORBIDDEN: Directory is unable to show` 字样 37 | 2. 多次测试打开时间均小于 5s(尽量在 3s 以内是最好的) 38 | 39 | 如果第一个条件不满足,需要根据浏览器显示的内容做对应的处理。若第二个条件不满足,就要排查网络是否稳定(自己电脑的网络和服务器网络都要排查) 40 | 41 | 若测试通过,那么服务端就算安装成功了。此时将浏览器里的地址复制一份,后面会用到 42 | 43 | ### 备案问题 44 | 45 | 中国大陆公有云的 VPS 要求要有 ICP 备案,如果没有就搭建不了更新,因为更新走的是HTTP协议 46 | 47 | 同时樱花映射也要求要有 ICP 备案,才能使用国内节点,否则只能会一刀切阻断所有https/tls流量 48 | 49 | 若你没有备案,可以尝试下面几种方法来搭建更新: 50 | 51 | 1. 选择海外 VPS 和节点,因为海外无需备案 52 | 2. 使用SFTP协议进行更新,目前已经提供了 SFT P服务端,SFTP 协议是免备案的 53 | 54 | :::danger 55 | 56 | 切勿直接使用 linux ssh 的 sftp 做更新,这是极其危险的行为!务必使用 xlight、filezilla 等专用软件,或使用 Docker 进行隔离。然后将目录设置为只读,不要暴露任何外部写入权限 57 | 58 | ::: 59 | -------------------------------------------------------------------------------- /docs/v1-old/img/6411f6297cc3f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1-old/img/6411f6297cc3f.jpg -------------------------------------------------------------------------------- /docs/v1-old/img/6411fd659499b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1-old/img/6411fd659499b.jpg -------------------------------------------------------------------------------- /docs/v1-old/start.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: McPatch 介绍 3 | --- 4 | McPatch 是一个给 Minecraft 客户端做文件更新的独立应用程序,支持 Windows(电脑端)和 Android 平台(手机端) 5 | 6 | 官方企鹅群[【更新助手官方群】](https://jq.qq.com/?_wv=1027&k=PqAEtn39) 925057600 7 | 8 | 提问前先来[常见问题解答](faq/client)找找答案,这里收录了大部分报错信息和对应的解决方法 9 | 10 | --- 11 | 12 | 开源仓库:(更新记录请查阅各仓库的发行版页面) 13 | 14 | + 文档站:[https://github.com/BalloonUpdate/McPatchDocs](https://github.com/BalloonUpdate/McPatchDocs) 15 | + 管理端:[https://github.com/BalloonUpdate/McPatchManage](https://github.com/BalloonUpdate/McPatchManage) 16 | + 客户端:[https://github.com/BalloonUpdate/McPatchClient](https://github.com/BalloonUpdate/McPatchClient) 17 | + 服务端:[https://github.com/BalloonUpdate/MiniHttpServer](https://github.com/BalloonUpdate/MiniHttpServer) 18 | -------------------------------------------------------------------------------- /docs/v1/advanced/client.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 客户端进阶内容 3 | --- 4 | ## 自动更新 5 | -------------------------------------------------------------------------------- /docs/v1/config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 默认配置文件 3 | --- 4 | ## 客户端 mc-patch-config.yml 5 | ``` 6 | # server是更新服务器的地址,是最重要的参数 7 | # 目前支持客户端支持三种服务器源:http源、webdav源、sftp源 8 | # 9 | # http源例子: 10 | # 1. http://127.0.0.1:6600 (默认形式,http协议) 11 | # 2. https://127.0.0.1:6600/subfolder (子目录形式,末尾不要加斜线,https协议) 12 | # ----- --------- ---- --------- 13 | # | | | | 14 | # | | | +------ 子目录(可选) 15 | # | | +-------------- 端口 16 | # | +--------------------- 地址 17 | # +------------------------------ 协议名称,只能是http或者https 18 | # 19 | # webdav源:(webdav源的格式和http源很相似,注意webdav代表走http协议,webdavs代表走https协议,这样写是为了和http源做区分) 20 | # 1. webdav://user:pass:127.0.0.1:80 (默认形式,webdav使用http协议) 21 | # 2. webdavs://user:pass:127.0.0.1:443/subfolder (子目录形式,webdav使用https协议,注意https默认端口为443,而非80) 22 | # ------- ---- ---- --------- --- --------- 23 | # | | | | | | 24 | # | | | | | +------ webdav 目录(可选) 25 | # | | | | +------------- webdav 端口(注意端口不能省略,通常是80和443 26 | # | | | +-------------------- webdav 主机地址 27 | # | | +---------------------------- webdav 密码 28 | # | +--------------------------------- webdav 用户名 29 | # +----------------------------------------- webdav 协议,只能是webdav或者webdavs 30 | # 31 | # sftp源例子: (切勿直接使用Linux登录端口做sftp源,会有极大安全隐患,请使用专业sftp服务器软件!) 32 | # 1. sftp://user:pass:f0:91:07:33:28:19:c5:2c:ea:e4:a9:2b:41:ce:3d:63@192.168.5.133:22/ (默认形式,工作目录本身) 33 | # 2. sftp://user:pass:f0:91:07:33:28:19:c5:2c:ea:e4:a9:2b:41:ce:3d:63@192.168.5.133:22/subfolder (相对目录形式,末尾无斜线) 34 | # 3. sftp://user:pass:f0:91:07:33:28:19:c5:2c:ea:e4:a9:2b:41:ce:3d:63@192.168.5.133:22//subfolder (绝对目录形式,末尾无斜线) 35 | # ---- ---- ---- ----------------------------------------------- ------------- -- ---------- 36 | # | | | | | | | 37 | # | | +---- 密码 主机指纹(请自行确保指纹可信) | | +------- 子目录(可选) 38 | # | +--------- 用户 | +--------------- 端口,通常是22 39 | # +---------------- 协议名称,只能是sftp +----------------------- 主机地址 40 | # 主机指纹支持以下格式 41 | # 1. SHA1:2Fo8c/96zv32xc8GZWbOGYOlRak= (sha1指纹格式) 42 | # 2. SHA256:oQGbQTujGeNIgh0ONthcEpA/BHxtt3rcYY+NxXTxQjs= (sha256指纹格式) 43 | # 3. MD5:d3:5e:40:72:db:08:f1:6d:0c:d7:6d:35:0d:ba:7c:32 (md5十六进制冒号分隔形式) 44 | # 4. d3:5e:40:72:db:08:f1:6d:0c:d7:6d:35:0d:ba:7c:32 (base64编码过的sha1指纹格式或者sha256指纹格式) 45 | # 46 | # 支持多个备用更新源,可以写成“YAML列表语法”的形式来使用多个备用源 47 | # 遇到网络问题时会从上往下依次切换备用的更新源。下面是例子: 48 | # 49 | # server: 50 | # - http://127.0.0.1:6600 # 首选源 51 | # - http://localhost:6600 # 第二个备用源 52 | # - http://[::1]:6600 # 第三个备用源 53 | # 54 | server: http://127.0.0.1:6600 55 | 56 | # 是否禁用界面主题 57 | # true: 禁用界面主题,可以解决窗口出现无响应的问题! 58 | # false: 不会禁用界面主题,运行在某些机器上时可能会出现窗口出现无响应的问题! 59 | disable-theme: false 60 | 61 | # 是否在没有任何更新时,显示暂无更新的对话框(通常是:资源文件暂无更新!) 62 | # true:更新完成后会显示“暂无更新”的对话框,需要手点确定 63 | # false:更新完成后会自动退出,无需手动操作 64 | # 本地调试环境建议开启,线上环境建议关闭。当quiet-mode开启时,本设置会被强制覆盖为false,无法变更。 65 | show-finish-message: true 66 | 67 | # 是否显示更新记录 68 | # true:每次更新完后都会弹出窗口显示更新记录 69 | # false:更新完成后不会弹出更新记录窗口而是继续下载下一个更新 70 | show-changelogs-message: true 71 | 72 | # 是否自动关闭更新记录窗口(无论是否操作) 73 | # 设置为0来禁用这个功能 74 | changelogs-auto-close: 0 75 | 76 | # 安静模式(默认不开启此选项) 77 | # true: 程序启动后不显示窗口,会在后台静默检查文件更新,如果没有更新就直接启动Minecraft, 78 | # 如果有更新再显示下载进度条窗口,此选项可以尽可能将更新助手的存在感降低(只在下载文件时显示窗口) 79 | # false: 程序启动后每次都显示窗口,并在窗口中显示检查文件的进度和下载文件的进度,一切妥当后启动Minecraft 80 | # 此选项仅仅当程序以图型界面模式启动时有效 81 | # 本地调试环境建议关闭,线上环境建议开启 82 | quiet-mode: false 83 | 84 | # 更新时如果发生错误(尤其是网络原因)时,是否继续进入游戏,而不是使游戏崩溃(默认不开启此选项) 85 | # true: 如果更新发生错误,继续启动Minecraft游戏 86 | # false:如果更新发生错误,强制使Minecraft崩溃,停止启动过程 87 | # 如果需要区分是更新问题还是游戏本身的问题,请查看游戏启动日志 88 | # 此选项仅当程序以JavaAgent模式(非图形模式)启动时有效 89 | no-throwing: false 90 | 91 | # 全局http连接超时(单位毫秒,仅对http源有效) 92 | http-connect-timeout: 3000 93 | 94 | # 全局http响应超时(单位毫秒,仅对http源有效) 95 | http-response-timeout: 5000 96 | 97 | # 出现网络问题时的重试次数(对所有源有效) 98 | retry-times: 5 99 | 100 | # 多线程下载时使用的线程数,仅对http源有效,且需要服务端支持断点续传功能 101 | # 自带的MiniHTTPServer不支持断点续传! 102 | concurrent-threads: 4 103 | 104 | # 多线程下载时每个文件块的大小 105 | concurrent-block-size: 4194304 # 默认为4mb 106 | 107 | # 如果客户端当前版本号在服务端的版本列表里不存在时(即版本号损坏),是否自动重头开始下载所有版本 108 | # true:如果客户端版本号出现问题,会从新下载一遍服务端的所有版本以达到修复文件的目的 109 | # false:如果客户端版本号出现问题,会直接报错而不会进行任何额外动作 110 | # 如果选择开启这个选项,重下所有版本,可以自动修复客户端,但会比较费时间和费流量,请仔细权衡 111 | auto-restart-version: true 112 | 113 | # 存储当前版本号的文件(一般无需修改此选项) 114 | # 起始目录为程序Jar文件所在目录 115 | version-file: mc-patch-version.txt 116 | 117 | # 自定义版本号文件名,此功能用于支持灰度更新 118 | server-versions-file-name: versions.txt 119 | 120 | # 自定义Http协议头,仅对Http源和Webdav源生效 121 | # 某些自定义头不会生效,例如 Content-Length 和 Content-Encoding 等等 122 | http-headers: 123 | # User-Agent: This filled by youself # 这是一个自定义UserAgent的配置示例 124 | 125 | # 是否忽略HTTPS更新源的SSL证书验证 126 | ignore-https-certificate: false 127 | 128 | # HTTP/WEBDAV 源的默认下载文件大小,当服务器未报告文件大小时则假定文件为这个大小,默认值为 1 GiB 129 | http-fallback-file-size: 1073741824 130 | 131 | # 此选项用来指定“更新起始目录”,也就是把文件都更新到哪里去。(此目录会从工作目录开始计算) 132 | # 默认情况下,程序会智能搜索.minecraft目录的父目录作为更新起始目录,因此通常不需要手动调整此选项 133 | # 若你要手动指定一个“更新起始目录”,请参考下面的示例 134 | # 示例一、此选项值设置为 '.' 可以将程序工作目录锁定为更新起始目录(同时会禁用自动搜索机制) 135 | # 示例二、此选项值设置为 '../' 可以将程序工作目录的上级目录锁定为更新起始目录(同时会禁用自动搜索机制) 136 | # 示例三、此选项值设置为 'abc' 可以将程序工作目录下的abc目录锁定为更新起始目录(同时会禁用自动搜索机制) 137 | # 示例四、此选项值设置为 '' 也就是空字符串(默认值),程序会智能搜索.minecraft目录的父目录作为更新起始目录 138 | base-path: '' 139 | ``` -------------------------------------------------------------------------------- /docs/v1/faq/client.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 客户端常见问题 3 | --- 4 | ## 更新时窗口无响应卡死或者内容丢失 5 | `影响范围`:客户端全版本 6 | 7 | `问题原因`:目前未知 8 | 9 | `解决方法`:在配置文件里把主题禁用即可disable-theme: true或者升级到1.0.13或更高的版本 10 | 11 | `其它建议`:如果你在用模组启动时遇到了这个问题,可能会同时遇到在配置文件里关不掉主题的情况,这时请考虑使用JavaAgent启动,因为适用于1.12.1游戏版本的BalloonUpdateModLoader会强制开启主题,然后就会导致未响应的问题出现 -------------------------------------------------------------------------------- /docs/v1/img/httpserver-http.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/httpserver-http.png -------------------------------------------------------------------------------- /docs/v1/img/httpserver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/httpserver.png -------------------------------------------------------------------------------- /docs/v1/img/installation-cmd-c-1.0-y-n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-cmd-c-1.0-y-n.png -------------------------------------------------------------------------------- /docs/v1/img/installation-cmd-c-1.0-y.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-cmd-c-1.0-y.png -------------------------------------------------------------------------------- /docs/v1/img/installation-cmd-c-1.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-cmd-c-1.0.png -------------------------------------------------------------------------------- /docs/v1/img/installation-cmd-c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-cmd-c.png -------------------------------------------------------------------------------- /docs/v1/img/installation-cmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-cmd.png -------------------------------------------------------------------------------- /docs/v1/img/installation-oss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-oss.png -------------------------------------------------------------------------------- /docs/v1/img/installation-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/docs/v1/img/installation-path.png -------------------------------------------------------------------------------- /docs/v1/installation/client.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 配置客户端 3 | --- 4 | ## 下载游戏 5 | 1. 创建一个文件夹并命名为你喜欢的名称 6 | 2. 将下载的启动器放入新建的文件夹,下载你需要的游戏版本 7 | -------------------------------------------------------------------------------- /docs/v1/installation/deploy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 创建更新包 3 | --- 4 | ## 创建文件夹 5 | 创建一个文件夹并命名为你喜欢的名称 6 | 7 | ## 放入管理端 8 | 将下载的 `McPatchManage-x.x.x.jar` 导入你创建的文件夹 9 | 10 | ## 编写启动指令 11 | 创建 `manage.bat` 并写入以下内容: 12 | 13 | ```bat title="manage.bat" 14 | java -jar McPatchManage-x.x.x.jar & pause 15 | ``` 16 | 17 | ## 生成相关文件 18 | 双击 `manage.bat`,然后关闭窗口 19 | 20 | 此时程序会自动生成 `history`、`public`、`workspace` 三个文件夹,如下图 21 | 22 | ![](../img//installation-path.png) 23 | 24 | + 如果缺少文件夹,可自行补齐 25 | + 如果缺少文件,请重走一遍文档,并检查自己是否遗漏了相关步骤 26 | 27 | ## 放入需要发布的文件 28 | 在 `workspace` 内放入你需要发布的文件 29 | 30 |
31 | 文件路径示例(新手必看) 32 | 33 | 我们假设创建的文件夹叫 `mcpatch` 34 | 35 | + 要更新所有模组,复制 `.minecraft/mods` 目录 36 | + 到 `mcpatch/workspace/.minecraft/mods` 37 | 38 | + 要更新资源包,复制`.minecraft/resourcepacks` 目录 39 | + 到 `mcpatch/workspace/.minecraft/resourcepacks` 40 | 41 | + 要更新.minecraft目录旁边的 `新玩家进服教程.txt`,复制 `新玩家进服教程.txt` 文件 42 | + 到 `mcpatch/workspace/新玩家进服教程.txt` 43 | 44 | 本质上,`workspace` 目录相当于本地的 `.minecraft` 的父目录。只有 `workspace` 目录和客户端保持相同文件结构,文件才能更新到正确的地方 45 | 46 |
47 | 48 |
49 | 关于版本隔离的说明 50 | 51 | 客户端程序严格按照管理端摆放的文件结构更新,因此,若开启了版本隔离,实际需要更新的文件将位于 `versions` 目录下的以你创建 Minecraft 游戏版本时设定的名字为名称的文件夹 52 | 53 | 我们假设你一开始创建的文件夹叫 `mcpatch`,你创建的 Minecraft 游戏名称为 `your-version` 54 | 55 | + 如果你开了版本隔离,就需要复制 `.minecraft/versions/your-version/mods` 目录 56 | + 到 `mcpatch/workspace/.minecraft/versions/your-version/mods` 57 | + 其它文件同理,只有在 `versions` 目录下才能在更新的时候保持文件处于正确的位置 58 | 59 | 如果后续的更新决定弃用版本隔离,则将 `your-version` 的文件悉数挪至 `mcpatch/workspace/.minecraft`,反之同理 60 | 61 |
62 | 63 | :::danger[特别注意] 64 | 65 | 不要把整个 `.minecraft` 目录全部放入 `workspace`,Minecraft 核心文件和 Minecraft 资源文件大部分情况下不能也不应该加入更新,会导致更新错误,更可能导致 Minecraft 无法启动 66 | 67 | ::: 68 | 69 | ## 创建更新包 70 | 双击 `manage.bat`,会出现如下界面 71 | ![](../img//installation-cmd.png) 72 | 73 | 根据提示输入 `C`,出现如下界面 74 | ![](../img//installation-cmd-c.png) 75 | 76 | 我们假定更新的版本号为 `1.0`,根据提示输入 `1.0` 77 | ![](../img//installation-cmd-c-1.0.png) 78 | 此时出现版本号确认指示,根据提示输入 `y` 79 | 80 | 此时出现强制覆盖的相关设定,由于我们是第一次打包,输入 `n` 即可 81 | ![](../img//installation-cmd-c-1.0-y.png) 82 | 83 | 出现 `创建版本 1.0 完成`,则更新包创建成功 84 | ![](../img//installation-cmd-c-1.0-y-n.png) 85 | -------------------------------------------------------------------------------- /docs/v1/installation/prepare.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 准备工作 3 | --- 4 | ## 配置 Java 环境 5 | + 根据游戏版本而定,一般情况下,≤`1.16.5` 建议使用 `java 8`(即 `jre 1.8`),≥`1.17` 建议使用 `JDK 17` 6 | 7 | :::danger[关于 Java 的问题] 8 | 9 | + 根据用户反馈,高版本 Java 可能会导致运行错误 10 | + 我们建议使用游戏版本所使用的 Java 版本,如果仍旧无法正常运作,请考虑 `java 8`(即 `jre 1.8`) 11 | 12 | ::: 13 | 14 | ## 下载 McPatch 相关工具 15 | + `McPatchManage.jar`:[GitHub Releases](https://github.com/BalloonUpdate/McPatchManage/releases) 16 | + 管理端程序,用来打包需要发布的内容 17 | + `McPatchClient.jar`:[GitHub Releases](https://github.com/BalloonUpdate/McPatchClient/releases) 18 | + 客户端程序,用来检测和更新客户端文件 19 | 20 | :::warning 21 | 22 | + 你应该下载名称诸如 `McPatchManage-x.x.x.jar` 的文件,而不是 `Source code` 23 | 24 | ::: 25 | 26 | ## 下载 Minecraft 启动器 27 | + 可选择 `Hello Minecraft! Launcher`、`Plain Craft Launcher` 28 | 29 | :::danger[关于官方启动器] 30 | 31 | + 一定不要使用 `Minecraft Launcher`(即官方启动器),官方启动器不能满足我们后续的操作 32 | 33 | ::: -------------------------------------------------------------------------------- /docs/v1/installation/server.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: 发布更新包 3 | --- 4 | import Tabs from '@theme/Tabs'; 5 | import TabItem from '@theme/TabItem'; 6 | 7 | ## 前提条件 8 | 你的文件夹里应有如下内容 9 | 10 | ![](../img/installation-path.png) 11 | 12 | ## 部署服务端 13 | 14 | 15 | 16 | 1. 前往 MiniHttpServer 的 [GitHub Releases](https://github.com/BalloonUpdate/MiniHttpServer/releases) 下载即可 17 | + 和前文一样,你应该下载名称诸如 `MiniHttpServer-x.x.x.jar` 的文件,而不是 `Source code` 18 | 19 | 2. 将下载的 MiniHttpServer 导入你创建的文件夹 20 | 21 | 3. 创建 `httpserver.bat` 并写入如下内容: 22 | ```bat title="httpserver.bat" 23 | java -jar MiniHttpServer-x.x.x.jar & pause 24 | ``` 25 | 26 | 4. 双击 `httpserver.bat`,此时出现如下界面即为启动成功 27 | ![](../img//httpserver.png) 28 | 29 | 30 | + 请参阅 [安装 nginx](https://docshome.gitbook.io/nginx-docs/readme/an-zhuang-nginx) 31 | 32 | 33 | + 请参阅 [Apache安装配置(Windows和Linux)](https://cloud.tencent.com/developer/article/1698069) 34 | 35 | 36 | + 大部分对象存储都可以引导式部署,无需担心存储桶创建问题 37 | + 各家的对象存储均有教程,请自行查阅相关文档 38 | 39 | 40 | 41 | ## 远程访问测试 42 | 43 | 44 | 1. 在运行了 MiniHttpServer 的设备上用浏览器打开 [http://localhost:6600](http://localhost:6600/) 45 | 2. 出现 `FORBIDDEN: Directory is unable to show` 后,将 MiniHttpServer 所使用的端口映射至公网环境 46 | ![](../img//httpserver-http.png) 47 | 3. 用任意设备打开映射到的地址 48 | + 满足以下所有条件,才能算测试通过: 49 | + + 浏览器显示 `FORBIDDEN: Directory is unable to show` 50 | + + + 若出现其他内容,请根据所显示的内容进行处理 51 | + + 多次测试打开时间均小于5s 52 | + + + 若超过5s,请排查设备的网络环境,一般情况下,打开网页 53 | 54 | 55 | + 在任意设备打开你刚部署的网站,出现 `404` 即为访问正常 56 | 57 | 58 | + 在任意设备打开你刚部署的网站,出现 `404` 即为访问正常 59 | 60 | 61 | 1. 将对象存储设置为可读 62 | 2. 在任意设备打开对象存储的地址,出现类似于以下内容即为访问正常 63 | ![](../img/installation-oss.png) 64 | 65 | 66 | 67 | ### 中国大陆境内服务器连入问题 68 | 69 | 根据政策要求,位于中国大陆境内的服务器使用 HTTP 协议需要进行 ICP 备案,相应的,在中国大陆境内有节点的内网穿透也要求实名认证,在绑定自有域名时也需要该域名有 ICP 备案 70 | 71 | 若因使用家庭网络无法备案、域名无法备案等原因,你可使用 SFTP 协议进行更新,SFTP 协议无需备案 72 | 73 | ## 发布更新包 74 | 75 | 76 | + 无需进行任何操作,MiniHttpServer 已经可以处理相关文件 77 | 78 | 79 | 1. 创建一个网站 80 | 2. 把 `public` 下的所有文件上传至网站目录 81 | 3. 重启 `Nginx` 82 | 83 | 84 | 1. 创建一个网站 85 | 2. 把 `public` 下的所有文件上传至网站目录 86 | 3. 重启 `Apache` 87 | 88 | 89 | 1. 把 `public` 下的所有文件上传至对象存储 90 | 91 | -------------------------------------------------------------------------------- /docs/v1/start.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: McPatch 介绍 3 | --- 4 | 5 | McPatch 是一个给 Minecraft 客户端做文件更新的独立应用程序,支持 Windows 和 Android,理论支持 Linux 和 Mac OS 6 | 7 | 只要你想,你可以通过这个程序向你服务器的玩家提供一切内容,包括模组、资源包、以及~~不可言说的视频~~ 8 | 9 | ## 为什么需要这样一款软件 10 | 11 | 你在游戏中出现的每一个 Bug,开发者都在修复,自然,模组也是如此,对于替换掉玩家手里旧的 Mod 这件事,相信你和我们一样被困扰着 12 | 13 | 当玩家找到你,问你“这是什么错误”、“我又缺了什么模组”,你也心烦吧。 14 | 15 | 所以,McPatch 诞生了! 16 | 17 | McPatch 是一个提供给 Minecraft 服主的工具,它提供更新这个服务来减少发布新整合包的各种麻烦,玩家只需要点击“更新”,或者完全不需要点击更新,在启动游戏的瞬间,客户端就在自己更新了,而各位服主只需要在服务器上打包好各类资源,剩下的就交给程序吧。不管是新增文件、修改文件、删除文件,一步到位。 18 | 19 | McPatch 通过这种方式优化了 Minecraft 的更新过程,使得更新更加高效和可靠。 20 | 21 | ## 还有更多? 22 | 我们欢迎各位使用者提交 Bug(可以通过[QQ群](https://jq.qq.com/?_wv=1027&k=PqAEtn39)、[Github](https://github.com/BalloonUpdate)),或是在[爱发电](https://afdian.net/a/aprilforest)赞助我们,以便我们开发出更有用的功能。 23 | 24 | -------------------------------------------------------------------------------- /docs/v2/config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 配置文件参考 3 | --- 4 | ## 客户端 mcpatch.yml 5 | ```yaml 6 | # 更新服务器地址,可以填写多个备用地址,当一个不可用时会切换到备用地址上 7 | # 目前支持的协议:http(s)、webdav(s)、私有协议 8 | # 9 | # http协议的例子:(填写索引文件index.json所在的目录就好,不需要填写index.json本身) 10 | # 1. http://127.0.0.1:6700 (走http协议) 11 | # 2. https://127.0.0.1:6700/subfolder (走https协议) 12 | # 13 | # webdav协议的例子:(webdav代表走http协议,webdavs代表走https协议,要这样写只是为了和http源做区分) 14 | # 1. webdav://user:pass:127.0.0.1:80 (webdav走http协议) 15 | # 2. webdavs://user:pass:127.0.0.1:443 (webdav走https协议) 16 | # 注:需要把user和pass这两个地方换成自己的账号密码,127.0.0.1换成主机地址,端口号不能省略 17 | # 18 | # 私有协议的例子:(私有协议是mcpatch自己的协议,无需备案,如果做内网穿透请走普通tcp隧道而非http隧道) 19 | # 1. mcpatch://127.0.0.1:6700 (私有协议以mcpatch开头,只需要主机和端口号即可,无需输入子目录) 20 | # 21 | urls: 22 | - mcpatch://127.0.0.1:6700 # 若在公网部署记得换成自己的公网ip或者域名 23 | 24 | # 记录客户端版本号文件的路径 25 | # 客户端的版本号会被存储在这个文件里,并以此为依据判断是否更新到了最新版本 26 | version-file-path: version-label.txt 27 | 28 | # 当程序发生错误而更新失败时,是否可以继续进入游戏 29 | # 如果为true,发生错误时会忽略错误,正常启动游戏,但是可能会因为某些新模组未下载无法进服 30 | # 如果为false,发生错误时会直接崩溃掉Minecraft进程,停止游戏启动过程 31 | # 此选项仅当程序以非图形模式启动时有效,因为在图形模式下,会主动弹框并将选择权交给用户 32 | allow-error: false 33 | 34 | # 在没有更新时,是否显示“资源文件暂无更新!”提示框 35 | # 在有更新时,此选项不生效 36 | show-finish-message: true 37 | 38 | # 安静模式,是否只在下载文件时才显示窗口 39 | # 如果为true,程序启动后在后台静默检查文件更新,而不显示窗口,若没有更新会直接启动Minecraft, 40 | # 有更新的话再显示下载进度条窗口,此选项可以尽可能将程序的存在感降低(适合线上环境) 41 | # 如果为false,每次都正常显示窗口(适合调试环境) 42 | # 此选项仅当程序以图形模式启动时有效 43 | silent-mode: false 44 | 45 | # 窗口标题,可以自定义更新时的窗口标题 46 | # 只有在桌面环境上时才有效,因为非桌面环境没法弹出窗口 47 | window-title: Mcpatch 48 | 49 | # 更新的起始目录,也就是要把文件都更新到哪个目录下 50 | # 默认情况下程序会智能搜索,并将所有文件更新到.minecraft父目录下(也是启动主程序所在目录), 51 | # 这样文件更新的位置就不会随主程序文件的工作目录变化而改变了,每次都会更新在相同目录下。 52 | # 如果你不喜欢这个智能搜索的机制,可以修改此选项来把文件更新到别的地方(十分建议保持默认不要修改) 53 | # 1. 当此选项的值是空字符串''时,会智能搜索.minecraft父目录作为更新起始目录(这也是默认值) 54 | # 2. 当此选项的值是'.'时,会把当前工作目录作为更新起始目录 55 | # 3. 当此选项的值是'..'时,会把当前工作目录的上级目录作为更新起始目录 56 | # 4. 当此选项的值是别的时,比如'ab/cd'时,会把当前工作目录下的ab目录里面的cd目录作为更新起始目录 57 | base-path: '' 58 | 59 | # 私有协议的超时判定时间,单位毫秒,值越小判定越严格 60 | # 网络环境较差时可能会频繁出现连接超时,那么此时可以考虑增加此值(建议30s以下) 61 | private-timeout: 7000 62 | 63 | # 为http/webdav设置协议头 64 | http-headers: 65 | # User-Agent: This filled by youself # 这是一个自定义UserAgent的配置示例 66 | 67 | # http/webdav协议的连接超时判定时间,单位毫秒,值越小判定越严格 68 | # 网络环境较差时可能会频繁出现连接超时,那么此时可以考虑增加此值(建议30s以下) 69 | http-timeout: 5000 70 | 71 | # http/webdav协议的重试次数,最大值为254 72 | # 当超过http_timeout服务器还是没有响应数据时,会消耗1次重试次数,然后进行重新连接 73 | # 当所有的重试次数消耗完后,程序才会真正判定为超时,并弹出网络错误对话框 74 | # 建议 http_timeout * http_retries 在20秒以内,避免玩家等的太久 75 | http-retries: 3 76 | 77 | # http/webdav协议是否忽略SSL证书验证 78 | http-ignore-certificate: false 79 | ``` 80 | 81 | ## 管理端 config.yml 82 | 83 | ```toml 84 | [core] 85 | # 要排除的文件规则,格式为正则表达式,暂时不支持Glob表达式 86 | # 匹配任意一条规则时,文件就会被忽略(忽略,指管理端会当这个文件不存在一般) 87 | exclude-rules = [] 88 | 89 | [web] 90 | # webui的监听地址,通常情况下请保持0.0.0.0不要修改 91 | listen-addr = "0.0.0.0" 92 | 93 | # webui的监听端口,可以调整为其它的端口 94 | listen-port = 6710 95 | 96 | # https的证书文件路径 97 | tls-cert-file = "" 98 | 99 | # https的私钥文件路径 100 | tls-key-file = "" 101 | 102 | # 控制`Access-Control-Allow-Credentials`的值 103 | cors-allow-credentials = false 104 | 105 | # 控制`Access-Control-Allow-Headers`的值 106 | cors-allow-headers = ["*"] 107 | 108 | # 控制`Access-Control-Allow-Methods`的值 109 | cors-allow-methods = ["*"] 110 | 111 | # 控制`Access-Control-Allow-Origin`的值 112 | cors-allow-origin = ["*"] 113 | 114 | # 控制`Access-Control-Allow-Private-Network`的值 115 | cors-allow-private-network = false 116 | 117 | # 控制`Access-Control-Expose-Headers`的值 118 | cors-expose-headers = ["*"] 119 | 120 | # 首页的文件名。用来在访问根目录时展示给用户的页面。一般情况下无需修改 121 | index_filename = "index.html" 122 | 123 | # 遇到文件404时,重定向到哪个文件。主要用于支持前端的SinglePageApplication特性。一般情况下无需修改 124 | redirect_404 = "index.html" 125 | 126 | [builtin-server] 127 | # 是否启动私有协议服务器功能 128 | enabled = true 129 | 130 | # 私有协议服务器的监听地址,通常情况下请保持0.0.0.0不要修改 131 | listen-addr = "0.0.0.0" 132 | 133 | # 私有协议服务器的监听端口,可以按需调整 134 | listen-port = 6700 135 | 136 | # 内置服务端之限速功能的突发容量,单位为字节,默认为0不开启限速。 137 | # 如果需要开启可以填写建议值1048576(背后的限速算法为令牌桶) 138 | capacity = 0 139 | 140 | # 内置服务端之限速功能的每秒回复的令牌数,单位为字节,默认为0不开启限速。 141 | # 如果需要开启,这里填写需要限制的最大速度即可,比如1048576代表单链接限速1mb/s(背后的限速算法为令牌桶) 142 | regain = 0 143 | 144 | [s3] 145 | # 启用webdav的上传功能 146 | enabled = true 147 | 148 | # 端点地址 149 | endpoint = "https://test-123456789.cos.ap-nanjing.myqcloud.com" 150 | 151 | # 桶名 152 | bucket = "test-123456789" 153 | 154 | # 地域 155 | region = "ap-nanjing" 156 | 157 | # 认证id 158 | access-id = "" 159 | 160 | # 认证key 161 | secret-key = "" 162 | 163 | [webdav] 164 | # 启用webdav的上传功能 165 | enabled = true 166 | 167 | # 主机部分 168 | host = "" 169 | 170 | # 用户名 171 | username = "" 172 | 173 | # 密码 174 | password = "" 175 | ``` -------------------------------------------------------------------------------- /docs/v2/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 常见问题 3 | --- 4 | 5 | ## 由于找不到VCRUNTIME140.dll,无法继续执行代码 6 | 7 | 问题原因:没有安装 vc++ 2015 运行库(从Windows 10开始都是自带的) 8 | 9 | 解决方法:前往[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145&751be11f-ede8-5a0c-058c-2ee190a24fa6=True&44F86079-8679-400C-BFF2-9CA5F2BCBDFC=1)下载(vc_redist.x64.exe和vc_redist.x86.exe两个文件都要安装) 10 | 11 | ## 私有协议状态码不正确 12 | 13 | 这里记录了一些常见的mcpatch内置服务端私有协议的状态码: 14 | 15 | + 状态码-2:客户端请求的文件range无效。出现此错误后,请向mcpatch作者报告寻求解决办法 16 | + 状态码-1:客户端请求的文件不存在。通常是index.json文件不存在,这是因为管理端那边还没有任何一个更新包,打包一个后错误就会消失 17 | + 其它状态码:通常是客户端填写了错误的地址或者端口,连接到其它的软件服务上去了 -------------------------------------------------------------------------------- /docs/v2/installation/guide.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 安装教程 3 | --- 4 | import Tabs from '@theme/Tabs'; 5 | import TabItem from '@theme/TabItem'; 6 | 7 | ## 一、下载文件 8 | 9 | 安装需要客户端和管理端,可以从这些地方下载: 10 | 11 | + Github Releases([管理端](https://github.com/BalloonUpdate/McPatch2/releases)、[jar客户端](https://github.com/BalloonUpdate/Mcpatch2JavaClient/releases)、[exe客户端](https://github.com/BalloonUpdate/Mcpatch2RustClient/releases)) 12 | + [hoshiroko.com](https://mcpatch.hoshiroko.com)(感谢[@薄荷の尾巴提供](https://hoshiroko.com)) 13 | 14 | 管理端程序的文件名通常叫`mcpatch-manager`或者直接简写为`m`。是用来打更新包和进行日常维护工作的。同时也提供一个内置的开箱即用服务端方便上手。管理端通常上放在自己电脑上,或者服务器上运行。 15 | 16 | 客户端会有一些区别,v2版本目前有两个客户端可供选择,一个是exe格式的客户端,另一个是jar格式的客户端。可以使用下面的选项卡来切换不同的使用教程。 17 | 18 | 两个版本的区别: 19 | 20 | 1. exe客户端使用Rust编写,在基于x86的Windows和Linux平台上拥有最好的性能和稳定性,但不支持win7或者其它的操作系统 21 | 2. jar客户端使用Java编写,支持在多平台上运行,比如LinuxArm,Windows7等(macos和手机端部分支持) 22 | 23 | 选择建议: 24 | 25 | 优先选择exe客户端,如果不能满足需求,使用jar客户端作为备选。 26 | 27 | 28 | 29 | 客户端程序的文件名通常叫`Mcpatch-xxx.jar`。是用来更新Minecraft客户端的文件的。通常配置好后和Minecraft客户端一起打包发给玩家,以实现远程更新文件的效果。 30 | 31 | 32 | 33 | 客户端程序的文件名通常叫`mcpatch-client`或者直接简写为`c`。是用来更新Minecraft客户端的文件的。通常配置好后和Minecraft客户端一起打包发给玩家,以实现远程更新文件的效果。 34 | 35 | :::tip 36 | 37 | 如果提示找不到 VCRUNTIME140.dll 文件,说明需要 [安装 VC++ 2015 运行库](../faq.md#由于找不到VCRUNTIME140.dll,无法继续执行代码)。 38 | 39 | ::: 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | ## 二、配置管理端 48 | 49 | :::note[小知识] 50 | 51 | 管理端的作用是打包和管理更新包,服主日常维护更新文件时,都需要和它打交道。 52 | 53 | ::: 54 | 55 | 首先在桌面上(或者任何你喜欢的地方)创建一个目录,叫`guanli`。然后将刚刚下载好的管理端程序放进去。 56 | 57 | 不同版本的管理端支持不同的运行模式,具体请参考下表: 58 | 59 | + 管理端 0.0.x:仅支持命令行模式 60 | + 管理端 0.1.x - 2.0.2:仅支持WebUI模式 61 | + 管理端 2.0.3 - 未来版本:支持命令行和WebUI模式 62 | 63 | 注:从`0.0.x`升级到更高版本需要删除一下config.toml文件重新生成,否则程序无法启动 64 | 65 | 66 | 67 | 双击即可启动管理端。启动成功后可以看到有`> `的字样,此时进入了交互式命令行模式。按回车就可以出现管理端支持的命令列表。 68 | 69 | 我们输出`check`命令按下回车键,它会提示修改的文件数量为多少多少,我们先忽视这个消息。 70 | 71 | 72 | 73 | 双击即可启动管理端。如果启动成功后你看到有`> `的字样,说明进入了命令行模式,只需要输入`webui`再按Enter键就能进入webui模式。(或者直接使用启动参数`m.exe webui`来直接进入webui模式,管理端是支持指令预填写的) 74 | 75 | 启动成功之后,会自动创建配置文件和生成一组默认的账号密码。我们需要复制密码到安全的地方妥善保存,因为密码只会显示一次。 76 | 77 | 管理端默认会同时启动webui服务(port: 6710)和私有协议服务(port: 6700)。我们打开浏览器,输入`http://127.0.0.1:6710`即可打开webui界面。 78 | 79 | 如果你忘记了用户名或者是密码,可以删除user.toml文件后,重启管理端,就可以重新生成账号密码。 80 | 81 | 82 | 83 | 接着回到`guanli`目录下,你会注意到管理端程序旁边新增了一个名为`workspace`的文件夹,这就是工作空间目录。 84 | 85 | 此时,`guanli`目录大概长这样: 86 | 87 | 88 | 89 | ``` 90 | guanli/ 91 | ├─ workspace/ # 工作空间目录 92 | ├─ public/ # 公共目录 93 | └─ m-0.0.11-x86_64-pc-windows-msvc.exe # 管理端程序 94 | ``` 95 | 96 | 97 | ``` 98 | guanli/ 99 | ├─ workspace/ # 工作空间目录 100 | ├─ public/ # 公共目录 101 | ├─ config.toml # 管理端配置文件 102 | ├─ user.toml # 管理端的认证相关配置文件,账号密码等数据 103 | └─ m.exe # 管理端程序 104 | ``` 105 | 106 | 107 | 108 | 无论是要向客户端添加新文件、修改现有文件、删除文件、移动文件,你只需要在`workspace`目录中对相应的文件进行操作。每当管理端进行打包操作时,管理端会对比`workspace`目录中文件的变化,来生成更新包。 109 | 110 | ## 三、放入要更新的文件 111 | 112 | :::note[小知识] 113 | 114 | 一般来说,服务器整合包的首包是服主制作好后,通过链接或者QQ群文件分享给玩家的,而后续的文件更新,则是使用 McPatch 进行远程推送。 115 | 116 | ::: 117 | 118 | 现在把目前需要更新的文件全部放到工作空间目录里,暂时不更新的文件以后再放,这能减少更新包的大小。 119 | 120 | 如果你在使用WebUI版本,可以使用左侧菜单中的在线文件管理功能直接上传,也可以将文件手动添加到工作空间目录里。 121 | 122 | 那么,下面是一些常见的栗子可以参考。(不存在的文件夹需要手动创建) 123 | 124 | 125 | 126 | 要更新模组文件的话: 127 | 128 | + 复制`.minecraft/mods`目录下你想要更新的文件 129 | + 粘贴到`guanli/workspace/.minecraft/mods`下 130 | 131 | ``` 132 | 客户端整合包目录结构: 133 | 134 | Minecraft客户端/ 135 | └─ .minecraft/ 136 | └─ mods/ 137 | ├─ 模组a.jar (复制) 138 | ├─ 模组b.jar (复制) 139 | └─ 模组c.jar (复制) 140 | 141 | 管理端目录结构: 142 | 143 | guanli/ 144 | └─ workspace/ 145 | └─ .minecraft/ 146 | └─ mods/ 147 | ├─ 模组a.jar (粘贴过来) 148 | ├─ 模组b.jar (粘贴过来) 149 | └─ 模组c.jar (粘贴过来) 150 | ``` 151 | 152 | 153 | 154 | 要更新启动器文件旁边的`新玩家进服教程.txt`的话 155 | 156 | + 复制:`新玩家进服教程.txt`文件 157 | + 粘贴到:`guanli/workspace/新玩家进服教程.txt` 158 | 159 | 如果客户端没有该文件,客户端会下载新的 `新玩家进服教程.txt`放到这里。 160 | 161 | 如果客户端有该文件,客户端会下载新的 `新玩家进服教程.txt` 并覆盖老的 `新玩家进服教程.txt`。(如果有更新的话) 162 | 163 | ``` 164 | 客户端整合包目录结构: 165 | 166 | Minecraft客户端/ 167 | ├─ .minecraft/ 168 | │ └─ 各种文件 169 | ├─ 新玩家进服教程.txt (复制) 170 | └─ PCL启动器.exe 171 | 172 | 管理端目录结构: 173 | 174 | guanli/ 175 | ├─ workspace/ 176 | │  └─ 新玩家进服教程.txt (粘贴过来) 177 | └─ m-0.0.11-x86_64-pc-windows-msvc.exe 178 | ``` 179 | 180 | 181 | 182 | + 要更新JEI模组的配置文件(开启版本隔离) 183 | + 复制`.minecraft/versions/<版本名称>/config/jei/jei.cfg`文件 184 | + 粘贴到`guanli/workspace/.minecraft/versions/<版本名称>/config/jei/jei.cfg` 185 | 186 | ``` 187 | 客户端整合包目录结构: 188 | 189 | Minecraft客户端/ 190 | ├─ .minecraft/ 191 | │  ├─ versions/ 192 | │  │  └─ <版本名称>/ 193 | │  │     ├─ config/ 194 | │  │     │  ├─ jei/ 195 | │  │     │  │  └─ jei.cfg # 要更新这个配置文件 196 | │  │     │  └─ 其他模组配置 197 | │  │     └─ 其他游戏文件 198 | │  └─ 其他文件 199 | └─ PCL启动器.exe 200 | 201 | 管理端目录结构: 202 | 203 | guanli/ 204 | ├─ workspace/ 205 | │  └─ .minecraft/ 206 | │     └─ versions/ 207 | │        └─ <版本名称>/ 208 | │           └─ config/ 209 | │              └─ jei/ 210 | │                 └─ jei.cfg 211 | └─ m-0.0.11-x86_64-pc-windows-msvc.exe 212 | ``` 213 | 214 | 215 | 216 | --- 217 | 218 | 如果你开了版本隔离,模组文件通常是在 versions 目录下的。那么你要更新的模组就不是在`.minecraft/mods`下的文件了。而是在`.minecraft/versions/<版本名称>/mods`目录下。如果你还把文件直接丢到`.minecraft/mods`目录下,虽然也能更新,但游戏读取不到。 219 | 220 | 其它受版本隔离影响的文件也是同理,也需要复制到 versions 目录下才能被 Minecraft 正常读取。 221 | 222 | ## 四、打包 223 | 224 | 225 | 226 | 切回管理端窗口。(如果你已经退出了,那么再次双击运行即可) 227 | 228 | 看到`> `的字样后。输入`pack `即可开始打包,``是要打包的版本号,不能和现有的重复。 229 | 230 | 版本号只能包括大小写字母,数字,以及`!@#$()_+-=;',.`这几个符号,不要使用中文,空格,或其它字符,会出问题。 231 | 232 | :::tip 233 | 234 | 如果要写版本更新记录,需要在打包开始之前,提前把更新记录用使用utf-8编码写在`guanli/logs.txt`文件里,管理端打包时会自动读取这个文件。 235 | 236 | ::: 237 | 238 | 看到“打包完成!”的字样即代表打包成功了,更新包会存放在public目录下,会按版本号进行命名。 239 | 240 | 241 | 点击左侧菜单切换到终端界面。 242 | 243 | 点击“打包新版本”按钮,输入版本号和更新记录即可。 244 | 245 | 版本号只能包括大小写字母,数字,以及`!@#$()_+-=;',.`这几个符号,不要使用中文,空格,或其它字符,会出问题。 246 | 247 | 248 | 249 | 250 | 251 | 此时,`guanli`目录大概长这样: 252 | ``` 253 | guanli/ 254 | ├─ public/ # 存放更新包 255 | │ ├─ v1.tar 256 | │ └─ index.json 257 | ├─ workspace/ # 工作空间 258 | │ └─ 各种文件 259 | └─ m-0.0.11-x86_64-pc-windows-msvc.exe # 管理端程序 260 | ``` 261 | 262 | 263 | 264 | 如果对打包结果不放心,可以使用`test`对更新包进行校验,这会模拟客户端的解压过程,检查文件是否损坏。 265 | 266 | 267 | 如果对打包结果不放心,可以点击“测试更新包”按钮对更新包进行校验,这会模拟客户端的解压过程,检查文件是否损坏。 268 | 269 | 270 | 271 | 272 | 273 | :::danger[万分小心!!!] 274 | 275 | 已经打好的更新包文件(也就是`public`目录里面的文件)不能手动删除,不能修改里面的文件,也不能重新打包,这会导致数据损坏,应该再打一个新的包来替代删除旧的包。 276 | 277 | ::: 278 | 279 | ## 五、后续打包 280 | 281 | 后续的文件维护很简单!直接对工作空间目录下的文件或者目录进行增加,删除,修改替换,移动,重命名都可。想怎么操作怎么操作。 282 | 283 | 284 | 285 | 修改到自己满意为止后,完后输入`pack `打包即可。 286 | 287 | 288 | 修改到自己满意为止后,点击“打包新版本”按钮即可。 289 | 290 | 291 | 292 | 293 | 管理端会自动感知到你做的所有文件修改,并打成更新包,再将这些修改同步到客户端。整个过程操作起来方便和直观,只需要把工作空间目录当成普通目录一样修改就好了。 294 | 295 | 296 | 297 | 298 | 如果对工作空间目录下的文件进行了修改,但又发现改的不对。可以使用管理端的`revert`命令来丢弃刚刚的修改,将文件状态退回上一次打包的时候。 299 | 300 | 301 | 如果对工作空间目录下的文件进行了修改,但又发现改的不对。可以点击“回退工作空间”按钮来丢弃刚刚的修改,将文件状态退回上一次打包的时候。 302 | 303 | 304 | 305 | 下面是一些管理端中,常被问到的问题: 306 | 307 | 1. 支持所有文件操作:包括移动,修改,覆盖,新建,删除,复制等等等等,文件夹同理 308 | 2. 支持更新加密的压缩包。只需要当普通文件一样用新版替换覆盖旧版就行 309 | 3. 新旧文件同名,但是文件内容变了也能检测到。因为打包时会检查文件校验,文件里任何字节发生变化,管理端都能感知到。 310 | 4. 避免单纯的将`Abc.jar`重命名为`abc.jar`这种仅修改大小写部分,同时没有改动文件所在目录和文件内容的行为。这种单纯原地修改大小写重命名的行为,管理端会出bug 311 | 312 | --- 313 | 314 | ### 删除不存在的文件 315 | 316 | 有些时候,你可能会想删掉一些文件,这些文件存在于玩家那边,但却不存在于管理端的工作空间目录里。你会发现这些文件没法删除,因为它们本来就不存在于工作空间目录里。 317 | 318 | 删除这些文件或者目录,需要用一些取巧的方式。其中最简单的方法就是将这些文件先放进工作空间目录正常打个包,这样工作空间目录里就有这个文件了,此时把它们删掉,再打个包,即可从客户端删除这些文件了。 319 | 320 | 不用担心这个操作会有副作用。客户端会自动针对这种情况进行下载优化,以节省流量。 321 | 322 | 文件夹也可以使用这个方法来删除。不过需要注意,如果玩家在文件夹中存放了一些自己的文件,也会被顺带删除,所以使用时请小心一些。 323 | 324 | ## 六、启动服务端 325 | 326 | :::tip[小知识] 327 | 328 | 管理端除了管理更新包以外,还自带一个内置服务端的功能。这是给小白用户准备的功能。不仅能免去额外搭建HTTP服务端的繁琐过程,还能免备案使用 329 | 330 | ::: 331 | 332 | 客户端程序支持多种更新协议,比如HTTP协议。WEBDAV协议,私有协议等。 333 | 334 | 由于我们是初次上手本软件,这里使用管理端自带的服务端功能进行教程演示。待教程结束后,你可以在[最佳实践](/docs/v2/practices)中找到其它的部署方式,以适应更加复杂的部署需求。 335 | 336 | 管理端自带的服务端使用私有协议,这是mcpatch自己基于tcp设计的一套文件传输协议。相较HTTP协议的优点是配置难度低和免备案即可使用。其开箱即用的特性,非常适合小服使用或者本地测试。 337 | 338 | 339 | 340 | 要启动管理端自带的服务端功能,首先需要启动管理端,然后输入`serve`按回车即可启动。(注意命令是`serve`不是`server`不要打错) 341 | 342 | 默认的端口是6700,如果需要调整,可用修改管理端的配置文件`config.toml`中的`[builtin-server].listen-port`或者`serve-listen-port`字段。 343 | 344 | 想要关闭服务端可以叉掉终端的窗口,或者按Ctrl + C即可。 345 | 346 | 管理端一般都是同时开两个管理端进程实例,一个打包用,用完叉掉。一个跑内置服务端,一直挂在后台 347 | 348 | --- 349 | 350 | 通常我们都习惯从bat启动这个自带服务端。但服务端除了使用交互式命令行启动以外,也支持从普通命令行参数启动。 351 | 352 | 我们可以在`guanli`目录下,也就是管理端程序旁边新建一个`serve.bat`文件。(名字随意) 353 | 354 | 然后将下面的内容粘贴进去,然后双击启动即可。(其中``需要替换成实际的文件名) 355 | 356 | ```bat 357 | @echo off 358 | serve 359 | ``` 360 | 361 | 362 | WebUI版本默认会自动启动私有协议服务端,监听端口为6700,默认情况下无需手动开启,可以直接使用。 363 | 364 | 365 | 366 | :::warning 367 | 368 | 注意配置文件中的所有`listen-addr`参数请勿随意调整,应该始终保持`0.0.0.0`,否则会导致所有连接都连不上(除非你很清楚监听地址的功能是什么) 369 | 370 | ::: 371 | 372 | 如果需要在内网穿透环境下使用管理端自带的服务端功能,协议记得选择TCP协议。 373 | 374 | ## 七、配置客户端 375 | 376 | 当管理端部署安装好之后,就可以开始配置客户端程序这边了。 377 | 378 | :::tip[推荐的步骤,但不强制] 379 | 380 | 在开始配置客户端程序之前,建议先将Mc客户端整个文件夹压缩一遍备份,避免调试更新的过程中,误删了什么文件没法恢复了。 381 | 382 | ::: 383 | 384 | 将客户端程序放到Minecraft客户端的`.minecraft/mcpatch`目录里面(需要手动创建),然后直接双击运行exe。 385 | 386 | 不出意外的话,客户端会报错无法连接之类的错误,不用管这个报错,直接关掉。 387 | 388 | 此时它会生成一个配置文件`mcpatch.yml`,我们需要打开编辑。 389 | 390 | 这里唯一需要修改的是`urls`选项,这个参数控制更新服务器的地址,默认是本机地址`mcpatch://127.0.0.1:6700`。 391 | 392 | 如果你的服务端是管理端自带的,且监听的端口也是默认的6700的话,那么这里可以不用修改端口。 393 | 394 | 如果你的服务端没有和客户端程序部署在同一台电脑上,那么记得修改这个127.0.0.1的IP地址,不然铁定连不上。只需要将这个地址修改成自己服务器的ip和端口即可。 395 | 396 | `urls`支持`base64`编码。(例如`mcpatch://127.0.0.1:80`的`base64`编码为`bWNwYXRjaDovLzEyNy4wLjAuMTo4MA==`) 397 | 398 | 客户端配置文件中的其它选项都有对应的注释说明,可以按需修改。 399 | 400 | ## 八、一键启动 401 | 402 | 客户端每次都要手动双击运行很是麻烦,可以借助一些方法在游戏启动时自动进行更新。 403 | 404 | 405 | 406 | 407 | 打开Minecraft客户端的`.minecraft/mcpatch`目录。将客户端jar文件移动到里面去。(记得把配置文件和版本号文件也一起移动) 408 | 409 | 打开Minecraft启动器(任意启动器均可,官方启动器除外),调整游戏版本设置,找到Java虚拟机参数(或者叫JVM 参数)。 410 | 411 | 在参数的开头插入这串代码`-javaagent:mcpatch/《举个栗子》.jar `(注意.jar的后面还有个空格也不要漏),然后回到启动器主界面。 412 | 413 | `《举个栗子》`要换成客户端程序的实际文件名,这里只是举例,下文同理。 414 | 415 | 416 | 417 | 418 | 首先到[BalloonUpdate/McPatch2Loader](https://github.com/BalloonUpdate/McPatch2Loader/releases)下载最新版的加载器文件。 419 | 420 | 打开Minecraft客户端的`.minecraft/mcpatch`目录。将加载器放在里面,和客户端程序放到一起。 421 | 422 | 在此处创建“启动列表”文件,叫`startlist.txt`。 423 | 424 | 将客户端程序的文件名复制,比如`mcpatch-client-0.0.0.exe`。粘贴到`startlist.txt`里,保存关闭。 425 | 426 | 此时,目录结构大概长这样。 427 | ``` 428 | 客户端整合包/ 429 | ├─ .minecraft/ 430 | │  ├─ mcpatch/ 431 | │  │  ├─ mcpatch-client-0.0.0.exe 432 | │  │  ├─ startlist.txt 433 | │  │  ├─ loader-2.jar 434 | │  │  ├─ mcpatch.yml 435 | │  │  └─ mcpatch.log 436 | │  └─ versions/ 437 | └─ PCL启动器.exe 438 | ``` 439 | 440 | 打开Minecraft启动器(任意启动器均可,官方启动器除外),调整游戏版本设置,找到Java虚拟机参数(或者JVM 参数)。 441 | 442 | 在参数的开头插入这串代码`-javaagent:mcpatch/《举个栗子》.jar `(注意.jar的后面还有个空格也不要漏),然后回到启动器主界面。 443 | 444 | `《举个栗子》`要换成loader.jar的实际文件名,这里只是举例,下文同理。 445 | 446 | 447 | 448 | 449 | :::info 450 | 451 | 如果你发现启动器有`JVM参数头`或者`JVM参数尾`这两个选项,则需要填到`JVM参数头`的最前面,最前面! 452 | 453 | ::: 454 | 455 | 点击Minecraft启动器的“启动游戏”按钮,一切顺利的话,在启动Minecraft主窗口之前,就会启动更新了。 456 | 457 | 如果启动游戏失败,且日志里有`Error opening zip file or JAR manifest missing`的字样,说明填写的jar文件找不到。 458 | 459 | 你可能会好奇,明明这个文件在`mcpatch`目录下面,怎么就会找不到呢? 460 | 461 | 这个问题其实不怪你,它通常和MC游戏的启动设置有关,其中影响最明显的就是版本隔离选项! 462 | 463 | 一般不开版本隔离功能时,使用`-javaagent:mcpatch/《举个栗子》.jar `就可以顺利启动,但是开启版本隔离后就不行了。 464 | 465 | 这是因为开启版本隔离后,javaagent参数的判定路径(也就是工作目录)会发生改变。没开启时,是从.minecraft目录下开始计算,这也是为什么明明放在`.minecraft/mcpatch`下,但参数里却只需要填写`mcpatch/《举个栗子》.jar`,而不需要加上`.minecraft`的原因。 466 | 467 | 当开启版本隔离后,这个判定路径多数情况下都会变成从`.minecraft/version/xxxx/`目录下开始计算。 468 | 469 | 此时将参数改成`-javaagent:../../mcpatch/《举个栗子》.jar `通常就可以正常启动了。其中`../`表示返回上级目录,可以不断连用来多次返回上级目录。 470 | 471 | 从版本文件夹`.minecraft/version/xxxx/`开始,两个`../`正好抵消掉`version/xxxx/`,使其判定路径变成`.minecraft/`,那么再加上`mcpatch/《举个栗子》.jar`,就正好能定位到loader的实际位置了,游戏便可以正常启动了。 472 | 473 | ## 九、经常被问到的问题 474 | 475 | ### 文件更新位置 476 | 477 | 客户端程序会自动搜索`.minecraft`的父目录作为更新起始位置,到处移动客户端程序(不管套几层文件夹)都不会影响更新起始位置。 478 | 479 | 如果要调整这个机制,可以修改配置文件里的`base-path`选项。 480 | 481 | ### 版本号不是判断版本新旧的依据 482 | 483 | 版本号只是一个普通的标签,是给人类看的,程序不会解析对比版本号的文字,也不作为任何判断版本前后的依据。 484 | 485 | 版本号的判断顺序的按打包时间来计算的,后打的版本总是新版本。 486 | -------------------------------------------------------------------------------- /docs/v2/installation/upload.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 上传对象存储 3 | --- 4 | import Tabs from '@theme/Tabs'; 5 | import TabItem from '@theme/TabItem'; 6 | 7 | 管理端打包后,可能要把更新包上传到自己的服务器,或者对象存储上供大家下载。 8 | 9 | 10 | 11 | 管理端本身没有直接上传文件的能力,但可以通过“上传脚本模板”这个特性间接将更新包上传到服务器上。 12 | 13 | 配置好后,每次打包完成自动生成一个上传脚本,双击运行后也可以自动把更新包上传到自定义的服务器上。 14 | 15 | 在使用这个功能之前,需要提前准备好对应的cli上传工具,比如要上传到对象存储,就要准备对象存储的命令行工具。 16 | 17 | 打开管理端的文件夹,编辑管理端的配置文件`config.toml`,将`upload-script-output`后面的`.txt`替换成`.bat`好方便在Windows系统上运行。 18 | 19 | 再在管理端exe文件旁边创建一个空文件`upload-template.txt`。 20 | 21 | 这个文件就是模板文件了,打包后会按这个模板文件的内容,自动生成一个新的上传脚本。 22 | 23 | 这里以windows平台上传到腾讯对象存储为例,其它平台和上传方式也是同理。 24 | 25 | 首先要从[腾讯云的官网](https://cloud.tencent.com/document/product/436/63144)下载COSCLI工具,这里要下载自己操作系统对应的版本。 26 | 27 | 将下载好的`coscli-windows.exe`移动到管理端文件夹里来,再创建一个新文件`tencent-cos.yml`作为coscli的配置文件。 28 | 29 | 打开`tencent-cos.yml`进行编辑,将下面内容粘贴进去: 30 | 31 | ```yaml 32 | cos: 33 | base: 34 | secretid: aaaaa 35 | secretkey: bbbbb 36 | sessiontoken: "" 37 | protocol: https 38 | buckets: 39 | - name: ccccc 40 | alias: my-default-bucket 41 | region: "" 42 | endpoint: ddddd 43 | ``` 44 | 45 | 这里有4个内容需要手动替换成自己的: 46 | 47 | 1. aaaaa:替换成自己的Secret Id 48 | 2. bbbbb:替换成自己的Secret Key 49 | 3. ccccc:替换成自己的桶名 50 | 4. ddddd:替换成自己的地域 51 | 52 | 完成后保存关闭,coscli就配置完毕了。现在来配置从脚本调用coscli的命令。 53 | 54 | 打开编辑模板文件`upload-template.txt`,将下面的内容粘贴进去,然后保存关闭: 55 | 56 | ```batch 57 | @echo off 58 | 59 | {{ for f in upload_files }} 60 | coscli-windows.exe -c tencent-cos.yml sync "{f}" "cos://my-default-bucket/backgrounds/{f}" --force {{ endfor }} 61 | 62 | {{ for f in delete_files }} 63 | coscli-windows.exe -c tencent-cos.yml rm "cos://my-default-bucket/backgrounds/{f}" --force {{ endfor }} 64 | 65 | pause 66 | del %0 67 | ``` 68 | 69 | 脚本最后一行代表删除自己,当上传完成后,可以按任意键继续,然后脚本会删除自己。如果上传失败了,可以手动叉掉窗口,然后重新运行一次上传。 70 | 71 | 上面是以windows平台为例子,如果是linux平台,可以用模板生成sh文件,只需要在配置文件config.toml中将生成的脚本文件后缀名修改成`.sh`。 72 | 73 | 74 | WebUI版本支持s3和webdav协议的上传。s3协议支持上传到亚马逊,阿里云,腾讯云,华为云,百度云,七牛,雨云等服务商的对象存储服务。 75 | 76 | 首先打开管理端的配置文件config.toml。 77 | 78 | 将s3下的enabled改为true,打开s3的上传功能。 79 | 80 | s3的配置有5项,端点,桶名,地域,id和key。 81 | 82 | 后续教程全部使用virtual-hosted方式进行访问s3,path-like方式已经不受支持。 83 | 84 | 首先需要配置端点: 85 | 86 | + 腾讯云:`https://cos..myqcloud.com` 87 | + 将``替换成对应的地域,比如`ap-guangzhou` 88 | + 阿里云:`https://oss-.aliyuncs.com` 89 | + 将``替换成对应的地域,比如`cn-hangzhou` 90 | 91 | 然后需要配置桶名。 92 | 93 | + 腾讯云:通常格式为``,既桶名+APPID 94 | + 阿里云:格式没有限制 95 | 96 | 然后需要配置地域,虽然端点中已经包含了地域,但这里仍然需要再填一次。 97 | 98 | + 腾讯云:通常格式以ap打头,比如`ap-guangzhou` 99 | + 阿里云:通常格式以cn打头,`cn-hangzhou` 100 | 101 | 最后是id和key,配置好后重新启动管理端即可生效。 102 | 103 | 104 | 105 | WebUI版本支持s3和webdav协议的上传。 106 | 107 | 首先打开管理端的配置文件config.toml。 108 | 109 | 将webdav下的enabled改为true,打开webdav的上传功能。 110 | 111 | host部分填写webdav的访问地址,username和password分别填写账号和密码。 112 | 113 | 配置好后重新启动管理端即可生效。 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /docs/v2/maintain/combine-versions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 合并更新包 3 | --- 4 | 5 | 当管理端用久了以后,会积累非常多的更新包,会占用大量的存储空间。 6 | 7 | 管理端提供了一个功能,可以将多个更新包合并成一个,每个文件只保留一份最新版本,可以释放出大量存储空间,同时不影响玩家的正常更新。 8 | 9 | 使用管理端的`combine`命令即可开始自动合并更新包,会将所有更新包合并成一个。v2的合并更新包功能不会丢失版本信息,因此相较v1版本,无需再输入新的版本号就能完成合并。 -------------------------------------------------------------------------------- /docs/v2/practices/cdn.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 使用 CDN 3 | --- 4 | 5 | OSS(对象存储服务,COS等)是提供者(也就是你)用来上传和存储文件的地方,而CDN(内容分发网络)则是为了加速用户(玩家)下载这些文件的服务。 6 | 7 | ## 为什么使用 CDN 8 | 9 | 1. mcpatch 自有协议受限于你自己的服务器带宽和延迟,还会挤占你的服务器资源 10 | 2. 依靠服务商提供的全国节点服务器,稳定且高速下载,不再挤牙膏限速 11 | 3. 整合包本地也可以丢 CDN 里,再也不用 QQ 群文件龟速下载了 12 | 3. **不要钱,能白嫖** 13 | 14 | 缺点: 15 | 1. 需要实名认证 16 | 2. 需要手动上传更新包(欢迎投稿“上传脚本模板”) 17 | 18 | ## 白嫖介绍 19 | 20 | - [七牛云](https://s.qiniu.com/MNf6fe) 21 | 22 | 免费 10GB 存储 + 每月 10GB 下载 + 后续 0.24 元/GB 23 | 24 | - [多吉云](https://www.dogecloud.com/product/oss) 25 | 26 | 免费 10GB 存储 + 每月 20GB 下载 + 后续 0.11 元/GB 27 | 28 | ## 如何使用 29 | 30 | 上传`public`内的所有文件即可。 31 | 32 | ``` 33 | 对象存储根目录/ 34 | ├─ download/ 35 | │  └─ mcpatch/ 36 | │     ├─ v1.tar 37 | │     ├─ v2.tar 38 | │     └─ index.json 39 | └─ 其他文件 40 | ``` 41 | 如上述目录结构的话,`urls`就是: 42 | ```yaml 43 | urls: 44 | - 你的CDN域名.com/download/mcpatch 45 | ``` 46 | 47 | ## 注意事项 48 | 49 | 1. 一个中型整合包就可能接近 1GB,10GB/月 的流量其实并不多,请合理安排 50 | 1. 可以利用`urls`的优先级来串联多个 CDN 白嫖流量 51 | 2. CDN 存在缓存机制,上传更新包后通常需要刷新`index.json`这个文件的缓存 -------------------------------------------------------------------------------- /docs/v2/practices/self-update.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 客户端自更新 3 | --- 4 | 5 | :::warning 6 | 7 | 此特性仅支持Rust编写的旧版v2客户端,新的Java版客户端暂不支持 8 | 9 | ::: 10 | 11 | McPatch 客户端会不定时发布新版本,新版本一般都会包含新的特性和改进修复,需要尽可能升级到新版本。 12 | 13 | 但客户端升级不像管理端那么容易:因为客户端在玩家电脑上,升级需要重新发包,比较麻烦。 14 | 15 | 因此 McPatch 特别支持了客户端热升级功能,用来远程下发新的客户端版本,无需重新发包。 16 | 17 | 客户端热升级的原理,是通过修改`loader.jar`的配置文件`startlist.txt`,来实现启动新版的客户端exe文件来做到热升级的。 18 | 19 | ## 首次配置 20 | 21 | 这部分步骤只需要进行一次即可,后续不用再做:(也就是配置了`一键启动`) 22 | 23 | 将下面的文件放入工作空间目录,以加入更新。并且文件位置要和客户端那边一一对应。 24 | 25 | 1. startlist.txt文件 26 | 2. 当前版本的客户端程序文件 27 | 28 | ## 升级过程 29 | 30 | 1. 下载好新版本的客户端程序文件 31 | 2. 将新版的客户端程序文件放入`minecraft/genxin`里(同时删除老版本的客户端程序) 32 | 3. 编辑`startlist.txt`文件 33 | 4. 将新版的文件名,插入到第一行。使旧版的文件名从第一行变成第二行。以此类推,不要删除这些旧文件名 34 | 5. 将刚刚的修改正常打包部署,客户端程序会自动下载。等到下一次运行时,启动的就会是新版的客户端程序了 35 | 36 | startlist.txt的内容 37 | ``` 38 | mcpatch-client-新版本.exe 39 | mcpatch-client-老版本2.exe 40 | mcpatch-client-老版本1.exe 41 | ``` 42 | `workspace`大概长这样: 43 | ``` 44 | guanli/ 45 | ├─ workspace/ 46 | │  └─ .minecraft/ 47 | │     └─ mcpatch/ 48 | │        ├─ mcpatch-client-新版本.exe 49 | │        └─ startlist.txt 50 | └─ m-0.0.11-x86_64-pc-windows-msvc.exe 51 | ``` 52 | -------------------------------------------------------------------------------- /docs/v2/start.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: McPatch V2 介绍 3 | --- 4 | 5 | McPatch 是一个给 Minecraft 客户端做文件更新的独立应用程序。客户端仅支持Windows,管理端支持全平台。 6 | 7 | 只要你想,你可以通过这个程序向你服务器的玩家提供一切内容,包括模组、资源包、以及~~不可言说的视频~~ 8 | 9 | 10 |
11 | 更新日志(V2相较于V1的变化) 12 | 13 | ### 新功能(相较v1) 14 | 15 | 1. 客户端支持按需下载,通过其它方式提前更新的文件,在下载时会被跳过,不会重复下载 16 | 2. 管理端现在自带一个内置的小服务端,使用tcp协议和客户端通信,无需再担心备案的问题 17 | 3. 管理端支持上传脚本模板,每次打包后都会按模板生成一个脚本,用来一键上传更新包文件 18 | 19 | ### 改进(相较v1) 20 | 21 | 1. 优化管理端文件结构,省去了history目录的设计,硬盘占用减少三分之一 22 | 2. 更新包每次都记录完整文件,避免客户端文件因玩家被修改导致无法更新 23 | 3. 客户端修复窗口无响应和下载限速的问题,现在可以跑到更快的下载速度 24 | 25 | ### 取舍(相较v1) 26 | 27 | 2.0版本相比1.0做出了一些功能上的取舍,以下是1.0支持,2.0不支持的功能列表: 28 | 29 | 1. 客户端不再支持sftp(使用管理端内置的tcp协议作为替代) 30 | 2. 管理端现在支持纯命令行启动,而不是1.0版本的交互式命令行(方便其它脚本调用) 31 | 32 |
33 | 34 | ## 为什么需要这样一款软件 35 | 36 | 你在游戏中出现的每一个 Bug,开发者都在修复,自然,模组也是如此,对于替换掉玩家手里旧的 Mod 这件事,相信你和我们一样被困扰着。 37 | 38 | 当玩家找到你,问你“这是什么错误”、“我又缺了什么模组”,你也心烦吧。 39 | 40 | 所以,McPatch 诞生了! 41 | 42 | McPatch 是一个提供给 Minecraft 服主的工具,它提供更新这个服务来减少发布新整合包的各种麻烦,玩家只需要点击“更新”,或者完全不需要点击更新,在启动游戏的瞬间,客户端就在自己更新了,而各位服主只需要在服务器上打包好各类资源,剩下的就交给程序吧。不管是新增文件、修改文件、删除文件,一步到位。 43 | 44 | McPatch 通过这种方式优化了 Minecraft 的更新过程,使得更新更加高效和可靠。 45 | 46 | 当然,McPatch 不仅限于更新整合包;通过自定义更新起始目录 `base-path`,它能够更新几乎所有类型的文件和文件夹,甚至包括它自身。 47 | 48 | ## 还有更多? 49 | 我们欢迎各位使用者提交 Bug(可以通过[QQ群](https://jq.qq.com/?_wv=1027&k=PqAEtn39)、[Github](https://github.com/BalloonUpdate)),或是在[爱发电](https://afdian.net/a/aprilforest)赞助我们,以便我们开发出更有用的功能。 50 | 51 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // 本文档使用 Docusaurus 编写,各类内容请查看 https://docusaurus.io 2 | 3 | import {themes as prismThemes} from 'prism-react-renderer'; 4 | 5 | /** @type {import('@docusaurus/types').Config} */ 6 | const config = { 7 | title: 'McPatchDocs', //网站名称 8 | tagline: 'Minecraft客户端文件更新解决方案', //网站简介 9 | favicon: 'img/logo.png', //网站 Icon 10 | url: 'https://balloonupdate.github.io', //网站地址 11 | baseUrl: '/McPatchDocs/', //路由 12 | 13 | // GitHub 编辑引用 14 | organizationName: 'BalloonUpdate', // 用户 & 组织名 15 | projectName: 'McPatchDocs', // 仓库名 16 | onBrokenLinks: 'throw', 17 | onBrokenMarkdownLinks: 'throw', 18 | 19 | // 国际化 20 | i18n: { 21 | defaultLocale: 'zh-Hans', 22 | locales: ['zh-Hans'], 23 | }, 24 | 25 | // 插件 26 | plugins: [ 27 | 'plugin-image-zoom', //图片灯箱 28 | './plugins/sponsor-info', 29 | ], 30 | 31 | // 预设内容。https://docusaurus.io/zh-CN/docs/using-plugins#using-presets 32 | presets: [ 33 | [ 34 | 'classic', 35 | /** @type {import('@docusaurus/preset-classic').Options} */ 36 | ({ 37 | docs: { 38 | sidebarPath: './sidebars.js', 39 | editUrl: 40 | 'https://github.com/BalloonUpdate/McPatchDocs/tree/main', 41 | }, 42 | blog: { 43 | showReadingTime: true, 44 | path: 'blog', 45 | blogTitle: '更新日志', 46 | blogSidebarTitle: '所有文章', 47 | blogSidebarCount: 'ALL', 48 | showReadingTime: true, 49 | postsPerPage: 5, 50 | editUrl: 51 | 'https://github.com/BalloonUpdate/McPatchDocs/tree/main', 52 | }, 53 | theme: { 54 | customCss: './src/css/custom.css', 55 | }, 56 | }), 57 | ], 58 | ], 59 | 60 | // 主题设置 61 | themeConfig: 62 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ 63 | ({ 64 | image: 'img/docusaurus-social-card.jpg',// 65 | 66 | // 顶部全局横条(姑且叫这个) 67 | /* announcementBar: { 68 | id: 'support_us', 69 | content: '该版本仍在编写,请查阅 V1版本文档 & V2版本文档', 70 | backgroundColor: '#84ccc9', 71 | textColor: '#fff', 72 | isCloseable: true, 73 | }, */ 74 | // 网站信息 75 | navbar: { 76 | title: 'McPatchDocs', // 网站标题。显示在右上角 77 | logo: { 78 | alt: 'McPatchDocs Logo', // Logo名称 79 | src: 'img/logo.png', // 80 | }, 81 | 82 | // 导航栏 83 | items: [ 84 | { 85 | href: '/docs/v1-old/start', 86 | label: 'V1 文档', 87 | position: 'left', 88 | }, 89 | /*{ 90 | href: '/docs/v1/start', 91 | label: 'V1 新版文档', 92 | position: 'left', 93 | },*/ 94 | { 95 | href: '/docs/v2/start', 96 | label: 'V2 文档', 97 | position: 'left', 98 | }, 99 | // {to: '/blog', label: '更新日志', position: 'left'}, 100 | { 101 | href: '/docs/release-notes', 102 | label: '更新记录', 103 | position: 'left', 104 | }, 105 | { 106 | href: '/docs/sponsors', 107 | label: '赞助名单', 108 | position: 'right', 109 | }, 110 | { 111 | href: '/contribute', 112 | label: '贡献者列表', 113 | position: 'right', 114 | }, 115 | { 116 | href: 'https://jq.qq.com/?_wv=1027&k=PqAEtn39', 117 | label: 'QQ群', 118 | position: 'right', 119 | }, 120 | { 121 | href: 'https://github.com/BalloonUpdate', 122 | label: 'GitHub', 123 | position: 'right', 124 | }, 125 | ], 126 | }, 127 | 128 | // 页脚 129 | footer: { 130 | style: 'dark', 131 | links: [ 132 | { 133 | title: 'V1版本', 134 | items: [ 135 | { 136 | label: '管理端', 137 | href: 'https://github.com/BalloonUpdate/McPatchManage', 138 | }, 139 | { 140 | label: '客户端', 141 | href: 'https://github.com/BalloonUpdate/McPatchClient', 142 | }, 143 | { 144 | label: '服务端', 145 | href: 'https://github.com/BalloonUpdate/MiniHttpServer', 146 | }, 147 | ], 148 | }, 149 | { 150 | title: 'V2版本', 151 | items: [ 152 | { 153 | label: '新客户端', 154 | href: 'https://github.com/BalloonUpdate/Mcpatch2JavaClient', 155 | }, 156 | { 157 | label: '旧客户端', 158 | href: 'https://github.com/BalloonUpdate/Mcpatch2RustClient', 159 | }, 160 | { 161 | label: '管理端', 162 | href: 'https://github.com/BalloonUpdate/McPatch2', 163 | }, 164 | { 165 | label: '加载器', 166 | href: 'https://github.com/BalloonUpdate/McPatch2Loader', 167 | }, 168 | ], 169 | }, 170 | { 171 | title: '其他', 172 | items: [ 173 | { 174 | label: '贡献者列表', 175 | href: '/contribute', 176 | } 177 | ], 178 | }, 179 | { 180 | title: '相关链接', 181 | items: [ 182 | { 183 | label: 'QQ群', 184 | href: 'https://jq.qq.com/?_wv=1027&k=PqAEtn39', 185 | }, 186 | { 187 | label: '爱发电', 188 | href: 'https://afdian.com/a/aprilforest', 189 | }, 190 | ], 191 | }, 192 | ], 193 | copyright: `

© ${new Date().getFullYear()} BalloonUpdate. Bulit with Docusaurus.
`, 194 | }, 195 | prism: { 196 | theme: prismThemes.github, 197 | darkTheme: prismThemes.dracula, 198 | }, 199 | }), 200 | 201 | // 添加主题配置 202 | themes: [ 203 | [ 204 | require.resolve("@easyops-cn/docusaurus-search-local"), 205 | /** @type {import("@easyops-cn/docusaurus-search-local").PluginOptions} */ 206 | ({ 207 | // 配置搜索 208 | language: ["en","zh"], 209 | // 其他配置 210 | hashed: true, 211 | // 显示搜索快捷键提示 (应该是布尔值而不是字符串) 212 | searchBarShortcutHint: true, 213 | // 高亮搜索结果 214 | highlightSearchTermsOnTargetPage: true, 215 | // 搜索结果预览长度 216 | searchResultContextMaxLength: 50 217 | }), 218 | ], 219 | ], 220 | }; 221 | 222 | export default config; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "McPatchDocs", 3 | "version": "2.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "start2": "docusaurus start --no-open", 9 | "build": "docusaurus build", 10 | "swizzle": "docusaurus swizzle", 11 | "deploy": "docusaurus deploy", 12 | "clear": "docusaurus clear", 13 | "serve": "docusaurus serve", 14 | "write-translations": "docusaurus write-translations", 15 | "write-heading-ids": "docusaurus write-heading-ids" 16 | }, 17 | "dependencies": { 18 | "@docusaurus/core": "^3.5.2", 19 | "@docusaurus/preset-classic": "^3.5.2", 20 | "@easyops-cn/docusaurus-search-local": "^0.44.0", 21 | "@mdx-js/react": "^3.0.0", 22 | "axios": "^1.7.7", 23 | "clsx": "^2.0.0", 24 | "fetch": "^1.1.0", 25 | "js-yaml": "^4.1.0", 26 | "plugin-image-zoom": "github:flexanalytics/plugin-image-zoom", 27 | "prism-react-renderer": "^2.3.0", 28 | "react": "^18.3.1", 29 | "react-dom": "^18.3.1" 30 | }, 31 | "devDependencies": { 32 | "@docusaurus/module-type-aliases": "^3.5.2", 33 | "@docusaurus/types": "^3.5.2" 34 | }, 35 | "browserslist": { 36 | "production": [ 37 | ">0.5%", 38 | "not dead", 39 | "not op_mini all" 40 | ], 41 | "development": [ 42 | "last 3 chrome version", 43 | "last 3 firefox version", 44 | "last 5 safari version" 45 | ] 46 | }, 47 | "engines": { 48 | "node": ">=18.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /plugins/sponsor-info/index.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import fs from 'fs/promises'; 3 | import util from 'node:util'; 4 | 5 | // 代表从爱发电接口获取赞助者信息的插件 6 | export default async function(context, options) { 7 | // console.log("ok"); 8 | // console.log(context); 9 | 10 | // console.log(json); 11 | return { 12 | name: 'sponsor-info', 13 | async loadContent() { 14 | // 读取赞助者列表 15 | const content = await fs.readFile('./docs/sponsor-list.json'); 16 | const sponsors = JSON.parse(content); 17 | 18 | const data = []; 19 | 20 | // 依次获取每位赞助者信息 21 | for (const sponsor of sponsors) { 22 | // 爱发电用户id 23 | const afd = sponsor[0] 24 | 25 | // 赞助时间 26 | const date = sponsor[1] 27 | 28 | // 老板如何称呼 29 | const name = sponsor[2] 30 | 31 | // 如果没有填写爱发电链接,就会返回0作为状态码 32 | if (afd == '') { 33 | data.push([0, { 34 | name: name, 35 | reason: 'no afd', 36 | }]) 37 | 38 | continue 39 | } 40 | 41 | console.log('fetch afdian data: ' + name); 42 | 43 | try { 44 | // 发起请求 45 | const response = await axios({ 46 | method: 'get', 47 | // url: 'https://afdian.com/api/user/get-profile-by-slug?url_slug=' + afd, 48 | url: 'https://afdian.com/api/user/get-profile?user_id=' + afd, 49 | proxy: false, 50 | }) 51 | 52 | // console.log('response data: '); 53 | // console.log(util.inspect(response.data, { 54 | // colors: true, 55 | // depth: 4, 56 | // })); 57 | 58 | // 检查爱发电返回的状态码 59 | if (response.data.ec != 200) { 60 | throw `ec: ${response.data.ec}, em: ${response.data.em}` 61 | } 62 | 63 | const d = response.data 64 | 65 | // 获取成功,会返回1作为状态码 66 | data.push([1, { 67 | name: name, 68 | afd: d.data.user, 69 | }]) 70 | } catch (error) { 71 | // console.log(error); 72 | // throw error 73 | 74 | // 有爱发电id,但是获取失败,会返回-1作为状态码 75 | data.push([-1, { 76 | name: name, 77 | err: `Error fetching: ${error}`, 78 | }]) 79 | // console.log('field: ' + error); 80 | } 81 | } 82 | 83 | return data 84 | }, 85 | async contentLoaded({content, actions}) { 86 | // 将数据存储起来,给后面的组件进行读取 87 | actions.setGlobalData(content) 88 | }, 89 | }; 90 | } -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Creating a sidebar enables you to: 3 | - create an ordered group of docs 4 | - render a sidebar for each doc of that group 5 | - provide next/previous navigation 6 | 7 | The sidebars can be generated from the filesystem, or explicitly defined here. 8 | 9 | Create as many sidebars as you want. 10 | */ 11 | 12 | // @ts-check 13 | 14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 15 | const sidebars = { 16 | // By default, Docusaurus generates a sidebar from the docs folder structure 17 | //tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], 18 | 19 | // But you can create a sidebar manually 20 | Sidebar: [ 21 | { 22 | type: 'doc', 23 | id: 'index', 24 | label: '文档首页', 25 | }, 26 | { 27 | type: 'doc', 28 | id: 'v1-old/start', 29 | label: 'V1 文档', 30 | }, 31 | /*{ 32 | type: 'doc', 33 | id: 'v1/start', 34 | label: 'V1 新版文档', 35 | },*/ 36 | { 37 | type: 'doc', 38 | id: 'v2/start', 39 | label: 'V2 文档', 40 | }, 41 | ], 42 | v1oldSidebar: [ 43 | { 44 | type: 'doc', 45 | id: 'v1-old/start', 46 | label: 'McPatch 介绍', 47 | }, 48 | { 49 | type: 'category', 50 | label: '安装教程', 51 | collapsed: false, 52 | link: { 53 | type: 'generated-index', 54 | title: '安装教程', 55 | description: '安装 McPatch 需要做的事情', 56 | slug: '/v1-old/guide', 57 | keywords: ['v1-old/guides'], 58 | image: '/img/docusaurus.png', 59 | }, 60 | items: [ 61 | 'v1-old/guide/preparations', 62 | 'v1-old/guide/manager', 63 | 'v1-old/guide/server', 64 | 'v1-old/guide/client', 65 | 'v1-old/guide/caution', 66 | 'v1-old/guide/auto-start', 67 | ], 68 | }, 69 | { 70 | type: 'category', 71 | label: '常见问题解答', 72 | collapsed: true, 73 | link: { 74 | type: 'generated-index', 75 | title: '常见问题解答', 76 | description: 'McPatch 常见问题解答', 77 | slug: '/v1-old/faq', 78 | keywords: ['v1-old/faq'], 79 | image: '/img/docusaurus.png', 80 | }, 81 | items: [ 82 | 'v1-old/faq/client', 83 | 'v1-old/faq/manage', 84 | ], 85 | }, 86 | { 87 | type: 'category', 88 | label: '高级教程', 89 | collapsed: true, 90 | link: { 91 | type: 'generated-index', 92 | title: '高级教程', 93 | description: 'McPatch 高级教程', 94 | slug: '/v1-old/advance', 95 | keywords: ['v1-old/advance'], 96 | image: '/img/docusaurus.png', 97 | }, 98 | items: [ 99 | 'v1-old/advance/custom-deploy', 100 | 'v1-old/advance/spell-start', 101 | 'v1-old/advance/modclient-self-update', 102 | 'v1-old/advance/dynamic-loader', 103 | 'v1-old/advance/combine', 104 | 'v1-old/advance/cli-interface', 105 | 'v1-old/advance/ignores', 106 | 'v1-old/advance/overwrites', 107 | 'v1-old/advance/run-as-exe', 108 | ], 109 | }, 110 | { 111 | type: 'doc', 112 | id: 'v1-old/config', 113 | label: '默认配置文件', 114 | }, 115 | ], 116 | v1Sidebar: [ 117 | { 118 | type: 'doc', 119 | id: 'v1/start', 120 | label: 'McPatch 介绍', 121 | }, 122 | { 123 | type: 'category', 124 | label: '部署', 125 | collapsed: false, 126 | link: { 127 | type: 'generated-index', 128 | title: '部署', 129 | description: '部署 McPatch 需要做的事情', 130 | slug: '/v1/installation', 131 | keywords: ['v1/installation'], 132 | image: '/img/docusaurus.png', 133 | }, 134 | items: [ 135 | 'v1/installation/prepare', 136 | 'v1/installation/deploy', 137 | 'v1/installation/server', 138 | 'v1/installation/client', 139 | ], 140 | }, 141 | { 142 | type: 'category', 143 | label: '进阶内容', 144 | collapsed: true, 145 | link: { 146 | type: 'generated-index', 147 | title: '进阶内容', 148 | description: 'McPatch 进阶内容', 149 | slug: '/v1/advanced', 150 | keywords: ['v1/advanced'], 151 | image: '/img/docusaurus.png', 152 | }, 153 | items: [ 154 | 'v1/advanced/client', 155 | ], 156 | }, 157 | { 158 | type: 'category', 159 | label: '常见问题', 160 | collapsed: true, 161 | link: { 162 | type: 'generated-index', 163 | title: '常见问题', 164 | description: 'McPatch 常见问题', 165 | slug: '/v1/faq', 166 | keywords: ['v1/faq'], 167 | image: '/img/docusaurus.png', 168 | }, 169 | items: [ 170 | 'v1/faq/client', 171 | ], 172 | }, 173 | { 174 | type: 'doc', 175 | id: 'v1/config', 176 | label: '默认配置文件', 177 | }, 178 | ], 179 | v2Sidebar: [ 180 | { 181 | type: 'doc', 182 | id: 'v2/start', 183 | label: 'McPatch 介绍', 184 | }, 185 | { 186 | type: 'category', 187 | label: '首次安装', 188 | collapsed: false, 189 | link: { 190 | type: 'generated-index', 191 | title: '首次安装', 192 | description: '首次安装 McPatch 需要做的事情', 193 | slug: '/v2/installation', 194 | keywords: ['v2/installation'], 195 | image: '/img/docusaurus.png', 196 | }, 197 | items: [ 198 | 'v2/installation/guide', 199 | 'v2/installation/upload', 200 | ], 201 | }, 202 | { 203 | type: 'category', 204 | label: '后续维护', 205 | collapsed: false, 206 | link: { 207 | type: 'generated-index', 208 | title: '后续维护', 209 | description: '日常维护 McPath 要做的事', 210 | slug: '/v2/maintain', 211 | keywords: ['v2/maintain'], 212 | image: '/img/docusaurus.png', 213 | }, 214 | items: [ 215 | 'v2/maintain/combine-versions', 216 | ], 217 | }, 218 | { 219 | type: 'category', 220 | label: '最佳实践', 221 | collapsed: false, 222 | link: { 223 | type: 'generated-index', 224 | title: '最佳实践', 225 | description: '一些优化 McPatch 要做的事', 226 | slug: '/v2/practices', 227 | keywords: ['v2/practices'], 228 | image: '/img/docusaurus.png', 229 | }, 230 | items: [ 231 | 'v2/practices/self-update', 232 | 'v2/practices/cdn' 233 | ], 234 | }, 235 | { 236 | type: 'doc', 237 | id: 'v2/faq', 238 | label: '常见问题', 239 | }, 240 | { 241 | type: 'doc', 242 | id: 'v2/config', 243 | label: '配置文件参考', 244 | }, 245 | ], 246 | }; 247 | 248 | export default sidebars; 249 | -------------------------------------------------------------------------------- /src/components/ContributorsList/index.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import axios from 'axios'; 3 | import Link from '@docusaurus/Link'; 4 | import styles from './styles.module.css'; 5 | 6 | const ContributorsList = ({projectName, repos}) => { 7 | const [contributors, setContributors] = useState([]); 8 | 9 | const fetchContributors = async () => { 10 | let contributors = [] 11 | 12 | try { 13 | for (const repo of repos.split(',')) { 14 | const url = 'https://api.github.com/repos/' + repo + '/contributors' 15 | const response = await axios.get(url); 16 | 17 | for (const people of response.data) { 18 | if (people.login == 'dependabot[bot]') 19 | continue 20 | contributors.push(people) 21 | } 22 | } 23 | } catch (error) { 24 | console.error(`Error fetching contributors for ${projectName}:`, error); 25 | contributors = [] 26 | } 27 | 28 | return contributors 29 | }; 30 | 31 | useEffect(() => { 32 | fetchContributors().then(e => setContributors(e)) 33 | }, [projectName, repos]); 34 | 35 | const renderList = () => { 36 | if (contributors.length == 0) { 37 | return

加载中...
38 | } 39 | 40 | return contributors.map(contributor => ( 41 |
42 | 43 | {contributor.login} 44 |
{contributor.login}
45 | 46 |
47 | )) 48 | }; 49 | 50 | return ( 51 |
52 |

{projectName}

53 |
54 | {renderList()} 55 |
56 |
57 | ); 58 | }; 59 | 60 | export default ContributorsList; 61 | -------------------------------------------------------------------------------- /src/components/ContributorsList/styles.module.css: -------------------------------------------------------------------------------- 1 | /* src/components/ContributorsList.module.css */ 2 | .container { 3 | margin-bottom: 2rem; 4 | } 5 | 6 | .projectTitle { 7 | font-size: 2rem; 8 | margin-bottom: 1rem; 9 | } 10 | 11 | .contributorsGrid { 12 | display: flex; 13 | flex-wrap: wrap; 14 | gap: 2rem; 15 | justify-content: flex-start; /* 靠左对齐 */ 16 | } 17 | 18 | .contributorItem { 19 | text-align: center; 20 | background-color: var(--ifm-background-color); 21 | padding: 1rem; 22 | border-radius: 8px; 23 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 24 | transition: transform 0.2s ease-in-out; 25 | width: 150px; /* 固定宽度 */ 26 | } 27 | 28 | .contributorItem:hover { 29 | transform: translateY(-5px); 30 | } 31 | 32 | .avatar { 33 | width: 100px; 34 | height: 100px; 35 | border-radius: 50%; 36 | margin-bottom: 1rem; 37 | } 38 | 39 | .contributorName { 40 | font-size: 1.2rem; 41 | font-weight: bold; 42 | color: var(--ifm-font-color-base); 43 | } 44 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Heading from '@theme/Heading'; 3 | import styles from './styles.module.css'; 4 | 5 | const FeatureList = [ 6 | { 7 | title: '对 Minecraft 的兼容性强', 8 | //Svg: require('/static/img/undraw_docusaurus_mountain.svg').default, 9 | description: ( 10 | <> 11 | McPatch 作为独立项目,不基于 Minecraft,意味着可以基于任意一个 Minecraft 版本部署,稳定性有保障 12 | 13 | ), 14 | }, 15 | { 16 | title: '对 Minecraft 服主友好', 17 | //Svg: require('/static/img/undraw_docusaurus_react.svg').default, 18 | description: ( 19 | <> 20 | McPatch 是一个提供给 Minecraft 服主的工具,只需要在服务器上打包好各类资源,就可分发给每一位玩家 21 | 22 | ), 23 | }, 24 | ]; 25 | 26 | function Feature({Svg, title, description}) { 27 | return ( 28 |
29 |
30 | {title} 31 |

{description}

32 |
33 |
34 | ); 35 | } 36 | 37 | export default function HomepageFeatures() { 38 | return ( 39 |
40 |
41 |
42 | {FeatureList.map((props, idx) => ( 43 | 44 | ))} 45 |
46 |
47 |
48 | ); 49 | } -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.js.back: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Heading from '@theme/Heading'; 3 | import styles from './styles.module.css'; 4 | 5 | const FeatureList = [ 6 | { 7 | title: '', 8 | Svg: require('/static/img/undraw_docusaurus_mountain.svg').default, 9 | description: ( 10 | <> 11 | Docusaurus was designed from the ground up to be easily installed and 12 | used to get your website up and running quickly. 13 | 14 | ), 15 | }, 16 | { 17 | title: 'Focus on What Matters', 18 | Svg: require('/static/img/undraw_docusaurus_tree.svg').default, 19 | description: ( 20 | <> 21 | Docusaurus lets you focus on your docs, and we'll do the chores. Go 22 | ahead and move your docs into the docs directory. 23 | 24 | ), 25 | }, 26 | { 27 | title: 'Powered by React', 28 | Svg: require('/static/img/undraw_docusaurus_react.svg').default, 29 | description: ( 30 | <> 31 | Extend or customize your website layout by reusing React. Docusaurus can 32 | be extended while reusing the same header and footer. 33 | 34 | ), 35 | }, 36 | ]; 37 | 38 | function Feature({Svg, title, description}) { 39 | return ( 40 |
41 |
42 | 43 |
44 |
45 | {title} 46 |

{description}

47 |
48 |
49 | ); 50 | } 51 | 52 | export default function HomepageFeatures() { 53 | return ( 54 |
55 |
56 |
57 | {FeatureList.map((props, idx) => ( 58 | 59 | ))} 60 |
61 |
62 |
63 | ); 64 | } 65 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | /* styles.module.css */ 2 | .features { 3 | display: flex; 4 | align-items: center; 5 | padding: 2rem 0; 6 | width: 100%; 7 | } 8 | 9 | .featureSvg { 10 | height: 200px; 11 | width: 200px; 12 | } 13 | 14 | .centered { 15 | display: flex; 16 | justify-content: center; 17 | } 18 | -------------------------------------------------------------------------------- /src/components/HomepageIntro/index.js: -------------------------------------------------------------------------------- 1 | // src/components/HomepageIntro.js 2 | import React from 'react'; 3 | import clsx from 'clsx'; 4 | import styles from './styles.module.css'; 5 | 6 | function HomepageIntro() { 7 | return ( 8 |
9 |
10 |
11 | Intro Image 12 |
13 |
14 |

15 | McPatch 不仅提供了便捷的客户端文件更新功能,还支持多种 Mod 服的配置和优化。无论你是新手还是老手,McPath 都能满足你的需求。 16 |

17 |
18 |
19 |
20 |
21 |

22 | McPatch 不挑网络环境。不仅支持主流通信协议,还有开箱即用的私有协议,让你在任何网络环境下都能轻松使用。 23 |

24 |
25 |
26 | Intro Image 27 |
28 |
29 |
30 |
31 | Intro Image 32 |
33 |
34 |

35 | McPatch 十分轻量。可以忽略不计的运行占用,不超过 20Mb 的程序大小,再低配置的服务器都可以运作起来。 36 |

37 |
38 |
39 |
40 | ); 41 | } 42 | 43 | export default HomepageIntro; 44 | -------------------------------------------------------------------------------- /src/components/HomepageIntro/styles.module.css: -------------------------------------------------------------------------------- 1 | /* src/components/HomepageIntro.module.css */ 2 | .introContainer { 3 | padding: 40px 0; 4 | } 5 | 6 | .introSection { 7 | display: flex; 8 | align-items: center; 9 | justify-content: space-between; 10 | margin-bottom: 40px; 11 | } 12 | 13 | .introImage { 14 | flex: 1; 15 | padding-right: 20px; 16 | } 17 | 18 | .introImage img { 19 | max-width: 100%; 20 | height: auto; 21 | display: block; /* 去除图片底部的空白 */ 22 | } 23 | 24 | .introText { 25 | flex: 1; 26 | padding-left: 20px; 27 | } 28 | 29 | .introText h2 { 30 | font-size: 2rem; 31 | margin-bottom: 1rem; 32 | } 33 | 34 | .introText p { 35 | font-size: 1.2rem; 36 | line-height: 1.6; 37 | } 38 | 39 | /* 右图左文字的样式 */ 40 | .introSection:nth-child(2) .introImage { 41 | order: 2; 42 | padding-right: 0; 43 | padding-left: 20px; 44 | } 45 | 46 | .introSection:nth-child(2) .introText { 47 | order: 1; 48 | padding-left: 0; 49 | padding-right: 20px; 50 | } 51 | 52 | /* 媒体查询:在宽度较窄的环境下切换到上图下文字的布局 */ 53 | @media (max-width: 768px) { 54 | .introSection { 55 | flex-direction: column; 56 | } 57 | 58 | .introImage, 59 | .introText { 60 | padding: 0; 61 | text-align: center; 62 | } 63 | 64 | .introImage { 65 | margin-bottom: 20px; 66 | } 67 | 68 | .introImage img { 69 | max-width: 80%; /* 设置图片的最大宽度 */ 70 | margin: 0 auto; /* 使图片居中 */ 71 | } 72 | 73 | .introSection:nth-child(2) .introImage { 74 | order: 1; 75 | margin-bottom: 20px; 76 | } 77 | 78 | .introSection:nth-child(2) .introText { 79 | order: 2; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/components/HomepageTestimonials/index.js: -------------------------------------------------------------------------------- 1 | // src/components/HomepageTestimonials.js 2 | import React, { useEffect, useState } from 'react'; 3 | import clsx from 'clsx'; 4 | import styles from './styles.module.css'; 5 | 6 | const testimonials = [ 7 | { 8 | name: '四月森林', 9 | id: 'asforest', 10 | avatar: 'https://github.com/asforest.png', 11 | quote: 'McPatch 的部署非常轻量化,资源占用非常少。即便是内存只有512Mb的树莓派1b也能流畅运行。非常适合我这样电脑配置有限的服主', 12 | }, 13 | { 14 | name: '御坂秋生', 15 | id: 'NiuBoss123', 16 | avatar: 'https://github.com/NiuBoss123.png', 17 | quote: '服务器所使用的 mod 更新速度非常快,感谢 McPatch 方便我们分发 mod,这下再也不需要每次都往群里面传最新的 mod 了', 18 | }, 19 | { 20 | name: '薄荷の尾巴', 21 | id: 'mintdesu', 22 | avatar: 'https://github.com/mintdesu.png', 23 | quote: '服务器每次@全体要更新 mod 时我就像是变成了客服,现在有了 McPatch 后直接根源上解决了这个问题,非常好用!快去用!', 24 | }, 25 | ]; 26 | 27 | function HomepageTestimonials() { 28 | return ( 29 |
30 |
31 |

被许多服主追捧

32 |
33 | {testimonials.map((testimonial, idx) => ( 34 |
35 |
36 | {testimonial.name} 37 |
38 |

{testimonial.quote}

39 |
40 | {testimonial.name} 41 |
42 |
@{testimonial.id}
43 |
44 |
45 | ))} 46 |
47 |
48 |
49 | ); 50 | } 51 | 52 | export default HomepageTestimonials; 53 | -------------------------------------------------------------------------------- /src/components/HomepageTestimonials/styles.module.css: -------------------------------------------------------------------------------- 1 | /* src/components/HomepageTestimonials.module.css */ 2 | 3 | .testimonials { 4 | padding: 4rem 0; 5 | background-color: #f8f8f8; 6 | } 7 | 8 | .testimonialsTitle { 9 | text-align: center; 10 | margin-bottom: 2rem; 11 | font-size: 2rem; 12 | color: #333; 13 | } 14 | 15 | .testimonialsGrid { 16 | display: grid; 17 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); 18 | gap: 2rem; 19 | } 20 | 21 | .testimonialCard { 22 | background-color: white; 23 | padding: 1.5rem; 24 | border-radius: 8px; 25 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 26 | text-align: center; 27 | } 28 | 29 | .testimonialAvatar img { 30 | width: 80px; 31 | height: 80px; 32 | border-radius: 50%; 33 | margin-bottom: 1rem; 34 | } 35 | 36 | .testimonialQuote { 37 | font-style: italic; 38 | margin-bottom: 1rem; 39 | color: #555; 40 | } 41 | 42 | .testimonialAuthor { 43 | font-size: 0.9rem; 44 | color: #666; 45 | margin-bottom: 0.5rem; 46 | } 47 | 48 | .testimonialId { 49 | font-size: 0.8rem; 50 | color: #888; 51 | } 52 | -------------------------------------------------------------------------------- /src/components/ReleaseList/index.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import axios from 'axios'; 3 | import Link from '@docusaurus/Link'; 4 | import styles from './styles.module.css'; 5 | 6 | const ReleaseList = ({ api, filter }) => { 7 | const [releases, setReleases] = useState([]); 8 | 9 | useEffect(() => { 10 | const fetchReleases = async () => { 11 | try { 12 | const response = await axios.get(api); 13 | 14 | console.log(response.data); 15 | 16 | let list = []; 17 | 18 | for (const release of response.data) { 19 | if (release.tag_name[0] == filter) { 20 | list.push(release); 21 | } 22 | } 23 | 24 | setReleases(list); 25 | } catch (error) { 26 | console.error(`Error fetching contributors for ${projectName}:`, error); 27 | } 28 | }; 29 | 30 | fetchReleases(); 31 | }, [api]); 32 | 33 | function fmt(isoString) { 34 | const date = new Date(isoString); 35 | 36 | const options = { 37 | year: 'numeric', 38 | month: '2-digit', 39 | day: '2-digit', 40 | hour: '2-digit', 41 | minute: '2-digit', 42 | second: '2-digit', 43 | hour12: false, 44 | }; 45 | 46 | return date.toLocaleString('zh-CN', options).replace(/\//g, '-'); 47 | } 48 | 49 | return ( 50 |
51 | {releases.map(re => ( 52 |
53 |

54 | 55 | {re.name}({fmt(re.created_at)}) 56 | 57 |

58 | 59 | {re.body} 60 | 61 |
62 | ))} 63 |
64 | ); 65 | }; 66 | 67 | export default ReleaseList; 68 | -------------------------------------------------------------------------------- /src/components/ReleaseList/styles.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | margin-bottom: 2rem; 3 | } 4 | 5 | .projectTitle { 6 | font-size: 2rem; 7 | margin-bottom: 1rem; 8 | } 9 | 10 | .contributorsGrid { 11 | display: flex; 12 | flex-wrap: wrap; 13 | gap: 2rem; 14 | justify-content: flex-start; /* 靠左对齐 */ 15 | } 16 | 17 | .contributorItem { 18 | text-align: center; 19 | background-color: var(--ifm-background-color); 20 | padding: 1rem; 21 | border-radius: 8px; 22 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 23 | transition: transform 0.2s ease-in-out; 24 | width: 150px; /* 固定宽度 */ 25 | } 26 | 27 | .contributorItem:hover { 28 | transform: translateY(-5px); 29 | } 30 | 31 | .avatar { 32 | width: 100px; 33 | height: 100px; 34 | border-radius: 50%; 35 | margin-bottom: 1rem; 36 | } 37 | 38 | .contributorName { 39 | font-size: 1.2rem; 40 | font-weight: bold; 41 | color: var(--ifm-font-color-base); 42 | } 43 | -------------------------------------------------------------------------------- /src/components/SponsorList/example_data.json: -------------------------------------------------------------------------------- 1 | { 2 | "ec": 200, 3 | "em": "", 4 | "data": { 5 | "user": { 6 | "user_id": "3c0021da845b11eb8de752540025c377", 7 | "status": 1, 8 | "name": "四月浅森", 9 | "gender": 0, 10 | "birthday": "", 11 | "avatar": "https://pic1.afdiancdn.com/user/3c0021da845b11eb8de752540025c377/avatar/d510e4ac7a0e40c8bcd2d3d315bd1256_w200_h200_s66.jpg", 12 | "cover": "https://pic1.afdiancdn.com/user/3c0021da845b11eb8de752540025c377/common/20214637fb30e8a69eb470b1e2f50783_w1920_h800_s3279.jpg", 13 | "url_slug": "aprilforest", 14 | "is_verified": 1, 15 | "verified_type": 2, 16 | "is_not_rec": 0, 17 | "show_sponsoring": 0, 18 | "default_page": 1, 19 | "show_badge": 1, 20 | "has_mark": 0, 21 | "creator": { 22 | "user_id": "3c0021da845b11eb8de752540025c377", 23 | "status": 2, 24 | "category_id": "ed45455e30dc11e89fd452540025c377", 25 | "type": 1, 26 | "doing": "Minecraft客户端文件更新解决方案", 27 | "detail": "Minecraft客户端更新方案,再也不用发布完整客户端压缩包,对经常要升级Mod版本的服务器非常友好。\n\n https://www.mcbbs.net/thread-711833-1-1.html", 28 | "pic": "", 29 | "create_time": 1615682789, 30 | "custom_plan": 1, 31 | "custom_plan_desc": "如果喜欢我的作品,请随缘赞助哦", 32 | "is_tic": 0, 33 | "show_album": 1, 34 | "show_shop": 0, 35 | "homepage_product_count": -1, 36 | "can_copy_text": 1, 37 | "can_copy_pic": 1, 38 | "watermark": 1, 39 | "monthly_fans": 1, 40 | "monthly_income": "**", 41 | "privacy_public_income": 0, 42 | "privacy_public_sponsor": 1, 43 | "discount_option": 1, 44 | "limit_show_product_count": -1, 45 | "show_sponsor_list": 1, 46 | "category": { "category_id": "ed45455e30dc11e89fd452540025c377", "name": "游戏" }, 47 | "album_count": 0 48 | }, 49 | "is_sponsoring": 0 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /src/components/SponsorList/index.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import styles from './styles.module.css'; 3 | import useGlobalData from '@docusaurus/useGlobalData'; 4 | 5 | // 渲染赞助列表 6 | const SponsorList = ({ }) => { 7 | // 具体的数据会由sponsor-info插件进行准备,这里直接获取结果就好。 8 | // 文件旁边有一个example_data.json,这是爱发电api返回的数据参考格式 9 | const globalData = useGlobalData(); 10 | const data = globalData['sponsor-info']['default']; 11 | 12 | // 点击赞助者后打开对应的主页 13 | const onClick = (e) => { 14 | const link = 'https://afdian.com/u/' + e.user_id 15 | // const link = 'https://afdian.com/a/' + e.url_slug 16 | console.log(link); 17 | window.open(link) 18 | }; 19 | 20 | // console.log(data); 21 | 22 | // 将data转换成带index的列表 23 | const indexedData = [] 24 | let index = 0 25 | 26 | for (const d of data) { 27 | indexedData.push({ fstatus: d[0], index: index, raw_name: d[1].name, ...d[1].afd }) 28 | index += 1 29 | } 30 | 31 | // 生成头像 32 | const avatarImage = (e) => { 33 | if (e.fstatus != 1) { 34 | return { background: 'url("https://pic1.afdiancdn.com/default/avatar/avatar-purple.png") center center / cover no-repeat' }; 35 | } 36 | 37 | return { background: 'url("' + e.avatar + '") center center / cover no-repeat' }; 38 | }; 39 | 40 | // 生成背景图片 41 | const backgroundImage = (e) => { 42 | if (e.fstatus != 1) { 43 | return { }; 44 | } 45 | 46 | return { background: 'url("' + e.cover + '") center center / cover no-repeat' }; 47 | }; 48 | 49 | return ( 50 |
51 | {indexedData.map(e => ( 52 |
onClick(e) : null}> 53 |
54 |
55 | 56 |
57 |
{e.name ?? e.raw_name}
58 | 59 | { 60 |
{e.creator?.doing != null ? ('正在创作 ' + e.creator.doing) : '...'}
//:
61 | } 62 | 63 |
64 |
65 | ))} 66 |
67 | ); 68 | }; 69 | 70 | export default SponsorList; 71 | 72 | // 下面的代码是从markdown表格中解析赞助列表的,目前用不上,先注释 73 | // const ReleaseList = ({ children }) => { 74 | // console.log(children); 75 | 76 | // const table = React.Children.toArray(children).find(child => child.type === 'table'); 77 | // const headers = React.Children.toArray(table.props.children[0].props.children).map(e => e.props.children)[0]; 78 | // const rows = React.Children.toArray(table.props.children[1].props.children); 79 | // const headerNames = headers.map(e => e.props.children) 80 | // const dataRows = rows.map(e => e.props.children.map(q => q.props.children)); 81 | // // console.log(dataRows); 82 | 83 | // const sponsorIndex = headerNames.indexOf('赞助人'); 84 | // const dateIndex = headerNames.indexOf('日期'); 85 | // const avatarIndex = headerNames.indexOf('头像'); 86 | // const linkIndex = headerNames.indexOf('链接'); 87 | // const descIndex = headerNames.indexOf('文字'); 88 | 89 | // if (sponsorIndex == -1 || dateIndex == -1 || avatarIndex == -1 || linkIndex == -1 || descIndex == -1) 90 | // return (
渲染数据不正确 [{sponsorIndex}, {dateIndex}, {avatarIndex}, {linkIndex}, {descIndex}]
) 91 | 92 | // const data = dataRows.map(e => { 93 | // return { 94 | // sponsor: e[sponsorIndex], 95 | // date: e[dateIndex], 96 | // avatar: e[avatarIndex]?.props?.children ?? '', 97 | // link: e[linkIndex]?.props?.children ?? '', 98 | // desc: e[descIndex] ?? '', 99 | // } 100 | // }); 101 | 102 | // const onClick = (e) => { 103 | // console.log(e); 104 | // window.open(e.link) 105 | // }; 106 | 107 | // // console.log(data); 108 | 109 | // return ( 110 | //
111 | // {data.map(e => ( 112 | //
onClick(e)}> 113 | //
114 | //
115 | //
116 | 117 | //
118 | //
{e.sponsor}
119 | 120 | // { 121 | // e.desc != '' ?
{e.desc}
:
122 | // } 123 | 124 | //
125 | //
126 | //
127 | //
128 | // ))} 129 | //
130 | // ); 131 | // }; 132 | 133 | // export default ReleaseList; 134 | -------------------------------------------------------------------------------- /src/components/SponsorList/styles.module.css: -------------------------------------------------------------------------------- 1 | .sponsorContainer { 2 | display: flex; 3 | flex-wrap: wrap; 4 | } 5 | 6 | .sponsor { 7 | position: relative; 8 | display: block; 9 | width: calc(49% - 20px); 10 | border-radius: 0.5rem; 11 | height: 110px; 12 | margin: 10px 10px; 13 | background-color: transparent; 14 | box-shadow: 0px 0px 0px transparent !important; 15 | border: none; 16 | transition: all 0.2s; 17 | padding: 10px; 18 | } 19 | 20 | .sponsor:hover { 21 | cursor: pointer; 22 | background-color: #8685852e; 23 | transform: none; 24 | } 25 | 26 | .avatar { 27 | transition: all .3s; 28 | position: absolute; 29 | width: 70px; 30 | height: 70px; 31 | flex-shrink: 0; 32 | margin-right: 10px; 33 | border-radius: 50% !important; 34 | margin-top: 2px; 35 | margin-left: 9px; 36 | } 37 | 38 | .friendTextContainer { 39 | width: calc(100% - 90px); 40 | white-space: break-spaces; 41 | overflow: hidden; 42 | text-overflow: ellipsis; 43 | color: #525f7f; 44 | height: 90px; 45 | font-size: .9rem; 46 | margin-left: 100px; 47 | transition: all .4s; 48 | text-align: left; 49 | line-height: 1.3; 50 | } 51 | 52 | .friendText { 53 | 54 | } 55 | 56 | .friendTextH5 { 57 | margin: 0px; 58 | margin-bottom: .1rem; 59 | margin-top: 0.2rem; 60 | line-height: 1.5; 61 | font-weight: bold; 62 | font-size: 1rem; 63 | } 64 | 65 | .cover1 { 66 | position: absolute; 67 | top: 0; 68 | bottom: 0; 69 | left: 0; 70 | right: 0; 71 | opacity: 0.3; 72 | z-index: -99999; 73 | border-radius: 8px; 74 | } 75 | 76 | .sponsor:hover .cover1 { 77 | opacity: 1; 78 | z-index: 99999; 79 | } -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | /* You can override the default Infima variables here. */ 8 | :root { 9 | --ifm-color-primary: #2e8555; 10 | --ifm-color-primary-dark: #29784c; 11 | --ifm-color-primary-darker: #277148; 12 | --ifm-color-primary-darkest: #205d3b; 13 | --ifm-color-primary-light: #33925d; 14 | --ifm-color-primary-lighter: #359962; 15 | --ifm-color-primary-lightest: #3cad6e; 16 | --ifm-code-font-size: 95%; 17 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); 18 | } 19 | 20 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 21 | [data-theme='dark'] { 22 | --ifm-color-primary: #25c2a0; 23 | --ifm-color-primary-dark: #21af90; 24 | --ifm-color-primary-darker: #1fa588; 25 | --ifm-color-primary-darkest: #1a8870; 26 | --ifm-color-primary-light: #29d5b0; 27 | --ifm-color-primary-lighter: #32d8b4; 28 | --ifm-color-primary-lightest: #4fddbf; 29 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); 30 | } 31 | -------------------------------------------------------------------------------- /src/pages/contribute.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import Head from '@docusaurus/Head'; 4 | import ContributorsList from '../components/ContributorsList'; 5 | import styles from './contributors.module.css'; 6 | 7 | const ContributorsPage = () => { 8 | return ( 9 | 10 |
11 |

贡献者列表

12 | 13 | 14 | 15 | 16 |
17 |
18 | ); 19 | }; 20 | 21 | export default ContributorsPage; 22 | -------------------------------------------------------------------------------- /src/pages/contributors.module.css: -------------------------------------------------------------------------------- 1 | /* src/pages/contributors.module.css */ 2 | .container { 3 | padding: 2rem 1rem; 4 | max-width: 1200px; 5 | margin: 0 auto; 6 | } 7 | 8 | .title { 9 | margin-bottom: 2rem; 10 | font-size: 2.5rem; 11 | text-align: center; 12 | } 13 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Link from '@docusaurus/Link'; 3 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 4 | import Layout from '@theme/Layout'; 5 | import HomepageIntro from '/src/components/HomepageIntro'; 6 | import HomepageFeatures from '/src/components/HomepageFeatures'; 7 | import HomepageTestimonials from '/src/components/HomepageTestimonials'; 8 | 9 | import Heading from '@theme/Heading'; 10 | import styles from './index.module.css'; 11 | 12 | function HomepageHeader() { 13 | const {siteConfig} = useDocusaurusContext(); 14 | return ( 15 |
16 |
17 | 18 | {siteConfig.title} 19 | 20 |

{siteConfig.tagline}

21 |
22 | 25 | 花 10 分钟搭建一个 26 | 27 |
28 |
29 |
30 | ); 31 | } 32 | 33 | export default function Home() { 34 | const {siteConfig} = useDocusaurusContext(); 35 | return ( 36 | 39 |
40 |
41 | 给我们的组织 42 | 43 | 点个 follow 吧 44 | 45 |
46 |
47 | 48 |
49 | 50 | 51 | 52 |
53 |
54 | ); 55 | } 56 | -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | 13 | @media screen and (max-width: 996px) { 14 | .heroBanner { 15 | padding: 2rem; 16 | } 17 | } 18 | 19 | .buttons { 20 | display: flex; 21 | align-items: center; 22 | justify-content: center; 23 | } 24 | 25 | /* 首页公告样式 */ 26 | 27 | .HomepageTips { 28 | font-weight: bold; 29 | font-size: 20px; 30 | padding: 16px; 31 | max-width: 768px; 32 | margin: 0 auto; 33 | text-align: center; 34 | } -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/static/.nojekyll -------------------------------------------------------------------------------- /static/img/index/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/static/img/index/image-1.png -------------------------------------------------------------------------------- /static/img/index/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/static/img/index/image-2.png -------------------------------------------------------------------------------- /static/img/index/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/static/img/index/image-3.png -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalloonUpdate/McPatchDocs/72d60ef60f7b4f54107fab5469c433a91e1f4497/static/img/logo.png --------------------------------------------------------------------------------