├── static ├── .nojekyll └── img │ ├── head.png │ ├── logo.ico │ ├── logo.png │ ├── up.png │ ├── kamu1.jpg │ ├── kamu2.jpg │ ├── kamu3.jpg │ ├── question.png │ ├── ares_logo_500.png │ ├── chl_icon_500.png │ └── neb_icon_500.png ├── docs ├── assets │ ├── neb0.png │ ├── neb1.png │ ├── portfolio_0.png │ ├── portfolio_1.png │ └── portfolio_2.png ├── holojaneway │ ├── assets │ │ ├── 0-1.png │ │ ├── 0-2.png │ │ ├── 0-3.png │ │ ├── 1-1.png │ │ ├── t88.png │ │ ├── 88x31.png │ │ ├── 88x31.png:Zone.Identifier │ │ ├── 88x31-16591417204391.png:Zone.Identifier │ │ ├── image-20230519145036970.png │ │ ├── image-20230519145040196.png │ │ ├── 88x31-1673181674927-1-1673181674927-2.png:Zone.Identifier │ │ └── t88.png:Zone.Identifier │ ├── 2 方块.md │ ├── 1.5i 配置部分.md │ ├── 1.6i 其他部分.md │ ├── 1.4i 分析器部分.md │ ├── 9 Capability.md │ ├── 4 实体.md │ ├── ∞ 发布你的mod.md │ ├── 3 方块实体.md │ ├── -0 后记.md │ ├── 1.3i 渲染部分.md │ ├── -6 Minecraft版本变化.md │ ├── i T88使用文档.md │ ├── 1 物品.md │ ├── 1.7i 网络监视器.md │ ├── -2 杂项.md │ ├── -1.1 折跃门.md │ ├── -5 lib-mod.md │ ├── -2.2 性能问题.md │ ├── 1.2i 网络包部分.md │ ├── 3.1 固定模型的方块实体.md │ ├── 0.2 服务端和客户端.md │ ├── 0.1 可能与法律相关的问题.md │ └── -2.1 JNI.md ├── tellmewhere │ ├── assets │ │ ├── up.png │ │ ├── down.png │ │ ├── exit.png │ │ ├── land.png │ │ ├── left.png │ │ ├── right.png │ │ ├── left_up.png │ │ ├── takeoff.png │ │ ├── back_left.png │ │ ├── bypass_left.png │ │ ├── left_down.png │ │ ├── std_left_up.png │ │ ├── std_right.png │ │ └── up_then_left.png │ ├── home.md │ └── signblock.md ├── madparticle │ ├── assets │ │ ├── madparticle.png │ │ ├── 2023-01-26_19.01.26.jpg │ │ ├── image-20241008223015928.png │ │ ├── 187078262-1a8b4737-b721-4df4-b092-2ca51bd0279d.png │ │ └── 187078284-8321bc4f-5250-49bd-b16b-443b840f02c4.png │ ├── Home.md │ ├── 常见问题解答.md │ ├── 第三方模组.md │ ├── madparticle辅助设计工具使用指南(一).md │ ├── 杂项.md │ ├── 元指令指南.md │ └── 性能与配置.md ├── r6ms │ ├── 地图制作指南.md │ ├── 玩家游玩-设置.md │ ├── 跨服务器数据服务.md │ ├── 反作弊.md │ ├── voyager_home.md │ ├── 服务器管理员指南.md │ ├── 玩家游玩指南.md │ ├── update_log │ │ └── 1.0.0.md │ ├── 玩家游玩-对局.md │ ├── voyager_eula.md │ ├── home.md │ ├── 常见问题解答(FAQ).md │ └── 统计数据收集说明.md └── intro.md.disabled ├── .idea ├── .gitignore ├── encodings.xml ├── vcs.xml ├── dictionaries │ └── uss_shenzhou.xml ├── modules.xml ├── HoloJaneway.iml └── inspectionProfiles │ └── Project_Default.xml ├── babel.config.js ├── src ├── pages │ ├── markdown-page.md │ ├── index.module.css │ ├── index.js.old │ └── index.js ├── components │ ├── HomepageFeatures │ │ ├── styles.module.css │ │ └── index.js │ └── ModList │ │ └── styles.module.css ├── theme │ └── MDXComponents.js └── css │ ├── custom.css │ └── custom.css.backup ├── i18n └── en │ ├── docusaurus-plugin-content-docs │ ├── current │ │ └── madparticle │ │ │ ├── assets │ │ │ ├── madparticle.png │ │ │ ├── 2023-01-26_19.01.26.jpg │ │ │ ├── image-20241008223015928.png │ │ │ ├── 187078262-1a8b4737-b721-4df4-b092-2ca51bd0279d.png │ │ │ └── 187078284-8321bc4f-5250-49bd-b16b-443b840f02c4.png │ │ │ ├── Home.md │ │ │ ├── 常见问题解答.md │ │ │ ├── 第三方模组.md │ │ │ ├── madparticle辅助设计工具使用指南(一).md │ │ │ ├── 杂项.md │ │ │ ├── 性能与配置.md │ │ │ └── 元指令指南.md │ └── current.json │ └── docusaurus-theme-classic │ ├── navbar.json │ └── footer.json ├── .gitignore ├── .fleet └── run.json ├── README.md ├── LICENSE ├── package.json ├── .github └── workflows │ └── azure-static-web-apps-calm-moss-079461300.yml ├── sidebars.js └── docusaurus.config.js /static/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/head.png -------------------------------------------------------------------------------- /static/img/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/logo.ico -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/logo.png -------------------------------------------------------------------------------- /static/img/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/up.png -------------------------------------------------------------------------------- /docs/assets/neb0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/assets/neb0.png -------------------------------------------------------------------------------- /docs/assets/neb1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/assets/neb1.png -------------------------------------------------------------------------------- /static/img/kamu1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/kamu1.jpg -------------------------------------------------------------------------------- /static/img/kamu2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/kamu2.jpg -------------------------------------------------------------------------------- /static/img/kamu3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/kamu3.jpg -------------------------------------------------------------------------------- /static/img/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/question.png -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | # 基于编辑器的 HTTP 客户端请求 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/assets/portfolio_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/assets/portfolio_0.png -------------------------------------------------------------------------------- /docs/assets/portfolio_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/assets/portfolio_1.png -------------------------------------------------------------------------------- /docs/assets/portfolio_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/assets/portfolio_2.png -------------------------------------------------------------------------------- /static/img/ares_logo_500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/ares_logo_500.png -------------------------------------------------------------------------------- /static/img/chl_icon_500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/chl_icon_500.png -------------------------------------------------------------------------------- /static/img/neb_icon_500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/static/img/neb_icon_500.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/0-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/0-1.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/0-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/0-2.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/0-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/0-3.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/1-1.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/t88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/t88.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/up.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/88x31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/88x31.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/down.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/exit.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/land.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/land.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/left.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/right.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/left_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/left_up.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/takeoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/takeoff.png -------------------------------------------------------------------------------- /docs/madparticle/assets/madparticle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/madparticle/assets/madparticle.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/back_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/back_left.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/bypass_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/bypass_left.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/left_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/left_down.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/std_left_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/std_left_up.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/std_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/std_right.png -------------------------------------------------------------------------------- /docs/tellmewhere/assets/up_then_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/tellmewhere/assets/up_then_left.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/88x31.png:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | HostUrl=https://licensebuttons.net/l/by-nc/4.0/88x31.png 4 | -------------------------------------------------------------------------------- /docs/madparticle/assets/2023-01-26_19.01.26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/madparticle/assets/2023-01-26_19.01.26.jpg -------------------------------------------------------------------------------- /docs/holojaneway/2 方块.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 2 3 | title: 2 方块 4 | description: 方块 5 | hide_table_of_contents: false 6 | sidebar_position: 120 7 | --- 8 | 9 | -------------------------------------------------------------------------------- /docs/holojaneway/assets/88x31-16591417204391.png:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | HostUrl=https://licensebuttons.net/l/by-nc/4.0/88x31.png 4 | -------------------------------------------------------------------------------- /docs/holojaneway/assets/image-20230519145036970.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/image-20230519145036970.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/image-20230519145040196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/holojaneway/assets/image-20230519145040196.png -------------------------------------------------------------------------------- /docs/madparticle/assets/image-20241008223015928.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/madparticle/assets/image-20241008223015928.png -------------------------------------------------------------------------------- /src/pages/markdown-page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Markdown page example 3 | --- 4 | 5 | # Markdown page example 6 | 7 | You don't need React to write simple standalone pages. 8 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/holojaneway/assets/88x31-1673181674927-1-1673181674927-2.png:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | HostUrl=https://licensebuttons.net/l/by-nc/4.0/88x31.png 4 | -------------------------------------------------------------------------------- /docs/holojaneway/1.5i 配置部分.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.5i 3 | title: 1.5i 配置 4 | description: T88使用文档-配置 5 | hide_table_of_contents: false 6 | 7 | 8 | 9 | --- 10 | 11 | # -------------------------------------------------------------------------------- /docs/holojaneway/1.6i 其他部分.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.6i 3 | title: 1.6i 其他 4 | description: T88使用文档-其他 5 | hide_table_of_contents: false 6 | 7 | 8 | 9 | --- 10 | 11 | # -------------------------------------------------------------------------------- /docs/holojaneway/1.4i 分析器部分.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.4i 3 | title: 1.4i 分析器 4 | description: T88使用文档-分析器 5 | hide_table_of_contents: false 6 | 7 | 8 | 9 | --- 10 | 11 | # -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/madparticle/assets/187078262-1a8b4737-b721-4df4-b092-2ca51bd0279d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/madparticle/assets/187078262-1a8b4737-b721-4df4-b092-2ca51bd0279d.png -------------------------------------------------------------------------------- /docs/madparticle/assets/187078284-8321bc4f-5250-49bd-b16b-443b840f02c4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/docs/madparticle/assets/187078284-8321bc4f-5250-49bd-b16b-443b840f02c4.png -------------------------------------------------------------------------------- /.idea/dictionaries/uss_shenzhou.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | janeway 5 | 6 | 7 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/madparticle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/madparticle.png -------------------------------------------------------------------------------- /docs/holojaneway/9 Capability.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 9 3 | title: 9 Capability 4 | description: Capability 5 | hide_table_of_contents: false 6 | sidebar_position: 190 7 | 8 | --- 9 | 10 | # Capability 11 | 12 | -------------------------------------------------------------------------------- /docs/holojaneway/4 实体.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 4 3 | title: 4 实体 4 | description: 实体 5 | hide_table_of_contents: false 6 | sidebar_position: 140 7 | --- 8 | 9 | 10 | 11 | context.get().getSender().connection.teleport 12 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/2023-01-26_19.01.26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/2023-01-26_19.01.26.jpg -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 200px; 10 | width: 200px; 11 | } 12 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/image-20241008223015928.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/image-20241008223015928.png -------------------------------------------------------------------------------- /docs/holojaneway/assets/t88.png:Zone.Identifier: -------------------------------------------------------------------------------- 1 | [ZoneTransfer] 2 | ZoneId=3 3 | ReferrerUrl=https://github.com/USS-Shenzhou/t88/blob/master/src/main/resources/t88.png 4 | HostUrl=https://raw.githubusercontent.com/USS-Shenzhou/t88/master/src/main/resources/t88.png 5 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/187078262-1a8b4737-b721-4df4-b092-2ca51bd0279d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/187078262-1a8b4737-b721-4df4-b092-2ca51bd0279d.png -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/187078284-8321bc4f-5250-49bd-b16b-443b840f02c4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/USS-Shenzhou/HoloJaneway/HEAD/i18n/en/docusaurus-plugin-content-docs/current/madparticle/assets/187078284-8321bc4f-5250-49bd-b16b-443b840f02c4.png -------------------------------------------------------------------------------- /docs/r6ms/地图制作指南.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: map 3 | title: 地图制作指南 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 地图制作指南 8 | 9 | 制作一张地图分为两个步骤:你首先需要搭建出一张合理的地图,然后将其标记到R6MS系统中,标记各类点位。 10 | 11 | --- 12 | 13 | ## 建设一张合理的地图 14 | 15 | 16 | 17 | --- 18 | 19 | ## 标记到R6MS对战系统 20 | 21 | -------------------------------------------------------------------------------- /src/theme/MDXComponents.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import MDXComponents from '@theme-original/MDXComponents'; 3 | 4 | import Tabs from '@theme/Tabs'; 5 | import TabItem from '@theme/TabItem'; 6 | 7 | export default { 8 | ...MDXComponents, 9 | Tabs, 10 | TabItem, 11 | }; -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/holojaneway/∞ 发布你的mod.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: ∞ 3 | title: ∞ 发布你的mod 4 | description: ∞ 发布你的mod 5 | hide_table_of_contents: false 6 | sidebar_position: 1000 7 | --- 8 | 9 | # 发布你的mod 10 | 11 | 大功告成,看看你的! 12 | 13 | --- 14 | 15 | ## 使用CurseForge发布 16 | 17 | 18 | 19 | ## 使用GitHub Actions自动构建并分发 20 | -------------------------------------------------------------------------------- /docs/intro.md.disabled: -------------------------------------------------------------------------------- 1 | --- 2 | id: intro 3 | title: "" 4 | hide_table_of_contents: true 5 | slug: / 6 | --- 7 | 8 | 9 | 10 |
欢迎
11 |
12 |
13 | 14 | --- 15 | 16 | 17 |
在上方导航栏选择想要查看的项目。
18 |
-------------------------------------------------------------------------------- /.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 | 22 | /.fleet/settings.json 23 | /.idea/ 24 | -------------------------------------------------------------------------------- /docs/holojaneway/3 方块实体.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 3 3 | title: 3 方块实体 4 | description: 方块实体 5 | hide_table_of_contents: false 6 | sidebar_position: 130 7 | --- 8 | 9 | # 方块实体 10 | 11 | 在这一章,我将以自动消防水炮为例,讲解如何写出一个方块实体。 12 | 13 | --- 14 | 15 | 在上一节末尾,你可能已经发现了这个问题:我们写出来的方块只会杵在那里,似乎没有什么高级的功能——当然如果你想要的就是一个比较简单的装饰性方块,当我没说。但如何使方块能像熔炉一样储存和加工物品、像幽匿感测体一样检测声音、像箱子一样拥有流畅的开合动画?这一切都需要方块实体。 16 | -------------------------------------------------------------------------------- /.fleet/run.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "type": "npm", 5 | "name": "npm configuration", 6 | "command": "run", 7 | "scripts": "start", 8 | }, 9 | { 10 | "type": "command", 11 | "name": "Command Run", 12 | "program": "npm", 13 | "args": ["run","start"], 14 | }, 15 | 16 | 17 | ] 18 | } -------------------------------------------------------------------------------- /.idea/HoloJaneway.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/r6ms/玩家游玩-设置.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: player_option 3 | title: 设置 4 | hide_table_of_contents: false 5 | 6 | --- 7 | 8 | # 设置 9 | 10 | Minecraft原来的设置界面称为游戏内设置。R6MS提供一个自己的设置界面,称为模组内设置。 11 | 12 | --- 13 | 14 | ## 自动设置 15 | 16 | 在对战开始前,可能有某些设置项会被强制设置为指定值,在对战结束后恢复。 17 | 18 | :::info 19 | 20 | 这些项目包含: 21 | 22 | - 23 | 24 | ::: 25 | 26 | --- 27 | 28 | ## 游戏内设置 29 | 30 | ### 分辨率与GUI缩放 31 | 32 | 1. 如果您的显示器分辨率为`1920x1080`,且最大化或全屏游玩,则建议将`视频设置 > 界面尺寸`设置为`4`。如果您的显示器拥有更高的分辨率,您可以自行调整到一个合适的值。通常建议这个值为偶数。 33 | 34 | 2. 另外建议`将强制使用Unicode字体`设置为`关`。 35 | 36 | R6MS与[Modern UI](https://www.curseforge.com/minecraft/mc-mods/modern-ui)兼容良好。你也可以借助其来改进使用体验。 37 | 38 | 39 | --- 40 | 41 | ## 模组内设置 42 | 43 | 模组内设置的配置文件由[本地跨服务器数据同步](cross_server#本地跨服务器数据同步)保存。 44 | 45 | ### 控制 46 | 47 | -------------------------------------------------------------------------------- /docs/holojaneway/-0 后记.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: "-0" 3 | title: -0 后记 4 | description: 后记 5 | hide_table_of_contents: false 6 | sidebar_position: 90 7 | --- 8 | 9 | 10 | # 后记 11 | 12 | --- 13 | 14 | ## 获得成就:结束了? 15 | 16 | 是的,至此,这篇教程就结束了。 17 | 18 | 在IDEA里尽情地去驰骋吧,去创造你的世界。然后把它变成我们的世界。 19 | 20 | 如果你将你写出来的mod在Bilibili发布,记得 @USS_Shenzhou,我一定来为你点赞。 21 | 22 | 感谢你的耐心阅读。感谢你为Minecraft社区所作的贡献。我水平有限,只能助你至此。 23 | 24 | --- 25 | 26 | ## 致谢 27 | 28 | 排名不分先后。 29 | 30 | 感谢FledgeShiu(FledgeXu),他是我学习mod创作的领路人。 31 | 32 | 感谢3TUSK、土球球(ustc_zzzz)、IPzzelAliz 、MalayP、XeKr,和其他未提及的工作人员,以及所有参赛选手,他们创造的TeaCon是最为绝妙的Minecraft社区活动之一。 33 | 34 | 感谢秦前久(tt432)、zomb-676、道家深湖的专栏、文章、教程和文档,万丈高楼平地起。 35 | 36 | 感谢Minecraft的开发者、Forge的开发者、Minecraft Wiki的编写者和翻译者,Forge Community Wiki的编写者,Fabric Wiki的编写者,他们创造了一个如此巨大的舞台。 37 | 38 | 感谢你的阅读。 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Holo Janeway 2 | 3 | ![logo.png](./static/img/logo.png) 4 | 5 | Holo Janeway是一个面向初学者的Forge模组开发教程。 6 | 7 | 你可以在[这里](https://holojaneway.uss-shenzhou.cn/)查看。 8 | 9 | --- 10 | 11 | Holo Janeway网站使用MIT协议授权。 12 | 13 | The Holo Janeway website is licensed under MIT License. 14 | 15 | 《Holo Janeway mod 开发教程》使用CC BY-NC 4.0协议,BSD-3-Clause协议和GPLv3协议授权。 16 | 17 | The Holo Janeway Mod Developing Tutorial is licensed under CC BY-NC 4.0,BSD-3-Clause and GPLv3 License. 18 | 19 | 对《MadParticle 指南》和《R6MS 指南》保留所有权利。 20 | 21 | All rights reserved for the MadParticle Guidelines and the R6MS Guidelines. 22 | -------------------------------------------------------------------------------- /docs/r6ms/跨服务器数据服务.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: cross_server 3 | title: 跨服务器同步服务 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 跨服务器同步服务 8 | 9 | 为了解决令人困扰的切换Minecraft实例时配置文件需要手动同步、在不同的Minecraft服务器数据不互通等问题,我们提供一个跨服务器数据同步服务(英文名*Cross-Server Synchronization Service*, 简称*CSSS*),旨在使您获得更加方便、灵活的游戏体验。 10 | 11 | 以持久化位置划分,*CSSS*包含`本地跨服务器数据同步`和`云上跨服务器数据同步服务`两部分。后者也叫作***Voyager***。 12 | 13 | **Voyager是一个独立的项目,不是本模组的一部分,不受本模组许可证约束。** 14 | 15 | 此页仅介绍本地跨服务器数据同步服务。[云上跨服务器数据同步服务(Voyager)](voyager_home)有单独介绍页面。 16 | 17 | ## 本地跨服务器数据同步 18 | 19 | 几个配置文件将会被保存在你的系统用户目录,其中包含有你的偏好信息,可能包括但不限于你选择的干员装备、武器配件、使用的皮肤、光学瞄准镜颜色、灵敏度等。它是一个较为友好的格式,因此你可以在不进行游戏的情况下使用文本编辑器修改。~~别想着改皮肤了,有校验的。~~ 20 | 21 | :::info 22 | 23 | - 如果你使用Windows,它应该在`C:\Users\<用户名>\MinecraftT88Config\r6ms\`下。 24 | - 如果你使用Linux,它应该在`/home/<用户名>/MinecraftT88Config/r6ms/`下。 25 | - 如果你使用macOS,它应该在`/Users/<用户名>/MinecraftT88Config/r6ms/`下。 26 | 27 | ::: 28 | 29 | 这些配置文件仅保存在你的本地磁盘上,由你的客户端读取,不会被上传。切换游戏实例或服务器均不影响此文件,但当游戏或模组版本更新时,可能需要一些手动修正。 30 | -------------------------------------------------------------------------------- /docs/holojaneway/1.3i 渲染部分.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.3i 3 | title: 1.3i 渲染 4 | description: T88使用文档-渲染 5 | hide_table_of_contents: false 6 | 7 | 8 | 9 | --- 10 | 11 | # RawQuad 12 | 13 | `RawQuad`的目的是将`BakedQuad`变为方便操作的格式,然后再还原为BakedQuad以进行渲染。 14 | 15 | 目前只支持`DefaultVertexFormat.BLOCK`格式的`BakedQuad`。 16 | 17 | >`void shrink(float fromUp, float fromDown, float fromLeft, float fromRight)` 18 | > 19 | >以`fromDown`为例,对原来的四边形进行如图方式的裁剪。 20 | > 21 | > 22 | > 23 | >在`extinguish.blockentites.ExtinguisherBracketBuiltinEntity.calculateDisguiseModel()`查看使用例。 24 | > 25 | > `BakedQuad bake()` 26 | > 27 | > 需要的操作完成后导出BakedQuad。 28 | 29 | 当你需要渲染导出的BakedQuad时,一般情况下建议使用`ModelBlockRenderer.tesselateWithAO(...)`。其他方法可能会导致不正确的光照或阴影。 30 | 31 | > - 显然,如果需要修改的BakedQuad并不是通常的样式,那么就自然地会产生奇奇怪怪的错乱。已知的例子有基岩、带釉陶瓦。 32 | > 33 | > - 对半透明面的处理不正确,目前尚未知晓解决方法。 34 | > 35 | > - 在TeaCon 2022期间,产生的错乱意外而短暂地得到了修复,目前不清楚是哪个mod的什么功能造成了此效果。 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright © 2023 USS_Shenzhou 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /docs/r6ms/反作弊.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: anti_cheat 3 | title: 反作弊 4 | hide_table_of_contents: false 5 | 6 | --- 7 | 8 | # 反作弊 9 | 10 | R6MS提供了一些专门的反作弊功能。这些功能仅在启用了正版验证的服务器上可用。 11 | 12 | --- 13 | 14 | ## 跨服务器作弊标记 15 | 16 | 此功能仅在启用了*Voyager*的服务器上可用。 17 | 18 | 如果玩家有作弊行为,服务器管理员对玩家进行封禁时,可以选择一并对玩家的同步系统账号进行标记:在`/ban`其之前先执行`/r6ms cheat-ban [玩家名]`。 19 | 20 | 服务器名称、所在服务器的ip地址、当前时间和管理员的UUID会被一并记录。如果有相应的截图等,请管理员自行保存。 21 | 22 | 在被标记超过一次后,如果玩家认为遇到了恶意封禁,可以在我们的KOOK服务器内进行申诉。 23 | 24 | 除非玩家发起申诉且被通过,其作弊记录不会被抹消。暂不接受管理员的撤回请求。 25 | 26 | 如果一个服务器短时间被多名玩家申诉且通过,服务器可能会被取消访问CSSS的权限。 27 | 28 | :::caution 注意 29 | 30 | - 被不同服务器标记超过一次的账号名称将会在对战中显示为粉色。 31 | - 被不同服务器标记超过三次的账号将会被禁止进入对战。 32 | 33 | ::: 34 | 35 | --- 36 | 37 | ## 管理员监视 38 | 39 | 服务器管理员在其认为有必要时可以向玩家发起游戏监视。 40 | 41 | 在进入旁观对战并选中玩家后,管理员会有一个额外的“获取画面”按钮。如果管理员对某位玩家的行为有疑问,可以尝试使用此功能来获取其游戏内的一帧画面。玩家游戏中的画面将会被截取一帧图像并转发至管理员客户端。在此过程中玩家不会得到通知。 42 | 43 | 如果玩家设置了`管理员监视:拒绝`,或者出现了其他异常情况,你会获得相应的提示。 44 | 45 | 在获得画面后,如果管理员认为有必要,可以选择`保存`。图像将会被保存到管理员客户端的`游戏根目录/screenshot/r6ms-spy/`。 46 | 47 | **此功能默认启用。玩家可以在R6MS设置界面选择`管理员监视:拒绝`来禁用此功能。**当然——拒绝管理员监视可能会引起极大的怀疑。 -------------------------------------------------------------------------------- /docs/r6ms/voyager_home.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: voyager_home 3 | title: Voyager 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 云上跨服务器数据同步服务 8 | 9 | 云上跨服务器数据同步服务,代号Voyager,能够把你拥有的武器涂装、对战场次记录、作弊情况等数据在不同的Minecraft多人游戏服务器之间同步。 10 | 11 | **如果要使用Voyager,请阅读[最终用户许可协议](voyager_eula)和[个人与统计信息收集政策](data_collect),并在初次进入连接了Voyager的Minecraft多人游戏服务器时进行确认。** 有关个人信息跨境转移的内容也需要您同时确认。 12 | 13 | ## 工作原理 14 | 15 | 在你进入多人游戏服务器时,服务器会尝试从Voyager获取你的武器涂装和作弊次数。武器涂装数据随后会被转发至你的客户端以备选取。 16 | 17 | 如果你在Voyager中还没有任何记录,则会在你确认后自动地为你创建一条记录。 18 | 19 | 在你完成一场对战时,你的胜败和击杀信息会被上传至Voyager,这场对战的干员选取信息也会被上传至Voyager。 20 | 21 | ## 使用条件 22 | 23 | Voyager并不是在所有服务器默认可用。需要服务器管理员主动进行接入。有关更详细的说明,请查看[服务器管理员指南](op#voyager)。 24 | 25 | - 当你所在的服务器未接入同步时,你会在主菜单看到提示。如果你希望某个服务器接入同步,你可以联系服务器拥有者或管理员。 26 | 27 | 对于第三方验证登录的账号而言,Voyager是否适用的唯一决定因素是您当前的UUID是否与微软根据您用户名提供的UUID一致。 28 | 29 | - 如果服务器使用了*authlib-injector*,则Voyager可能不适用。 30 | - 如果服务器使用了*MultiLogin*,则Voyager仅向在Mojang验证服务器上拥有对应用户名和UUID的玩家提供。 31 | 32 | Voyager仅向拥有并使用正版账号的玩家提供。**Voyager仅向使用未经修改的R6MS jar的玩家和服务器提供。** 33 | 34 | 有关更详细的说明,请查看[最终用户许可协议](voyager_eula)。 35 | 36 | ## 问题追踪、意见或建议 37 | 38 | Voyager致力于让你在不同服务器之间实现平滑过渡。如果有任何问题,你可以通过页面下方的KOOK链接联系我们。 39 | 40 | -------------------------------------------------------------------------------- /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: #2583ff; 10 | --ifm-color-primary-dark: #226fd4; 11 | --ifm-color-primary-darker: #0450b3; 12 | --ifm-color-primary-darkest: #003a86; 13 | --ifm-color-primary-light: #1398e6; 14 | --ifm-color-primary-lighter: #0a9bf0; 15 | --ifm-color-primary-lightest: #2facf5; 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: #3c91ff; 23 | --ifm-color-primary-dark: #2d7feb; 24 | --ifm-color-primary-darker: #0963d8; 25 | --ifm-color-primary-darkest: #0050b9; 26 | --ifm-color-primary-light: #53c0ff; 27 | --ifm-color-primary-lighter: #51bfff; 28 | --ifm-color-primary-lightest: #79ceff; 29 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); 30 | } 31 | -------------------------------------------------------------------------------- /src/css/custom.css.backup: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /docs/holojaneway/-6 Minecraft版本变化.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: -6 3 | title: -6 Minecraft版本变化 4 | description: -6 Minecraft版本变化 5 | hide_table_of_contents: false 6 | sidebar_position: 40 7 | 8 | --- 9 | 10 | # Minecraft版本变化 11 | 12 | 这一章将会记录在MC版本更新之后需要做出、但又不方便以补丁形式写在其他章节中的改动。善用右侧目录和`ctrl+F`。 13 | 14 | 显然不可能完全记录所有可能需要的改动,作者也没有精力去搜集更多的信息——所以下列只是记录遇到的。 15 | 16 | --- 17 | 18 | ## 1.18.2→1.19.4 19 | 20 | - 这是一些第三方参考: 21 | - 1.19.2-1.19.3 https://gist.github.com/ChampionAsh5357/c21724bafbc630da2ed8899fe0c1d226 22 | - 1.19.3-1.19.4 https://gist.github.com/ChampionAsh5357/163a75e87599d19ee6b4b879821953e8 23 | 24 | - `RegistryEvent`→`RegisterEvent`。在泛型中指定注册类型→在参数中指定注册类型。可选的注册类型在`ForgeRegistries.Keys`内。 25 | 26 | - `setRegistryName`被取消。在`DeferredRegister.register`或`RegisterEvent.register`中指定。 27 | 28 | - `object.getRegistryName`→`ForgeRegistries.[注册类型].getKey(object)`。 29 | 30 | - `Component`(GUI)的各种子类被取消。`Component`现在提供对应的静态工厂方法。 31 | 32 | ## 1.19.4→1.20 33 | 34 | - 这是一些第三方参考: 35 | - https://gist.github.com/ChampionAsh5357/cf818acc53ffea6f4387fe28c2977d56 36 | 37 | - `PoseStack`(GUI)包装为 → `GuiGraphics`。 38 | 39 | - `GuiComponent`被取消。包含的方法并入`GuiGraphics`。 -------------------------------------------------------------------------------- /i18n/en/docusaurus-theme-classic/navbar.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": { 3 | "message": "HoloJaneway", 4 | "description": "The title in the navbar" 5 | }, 6 | "logo.alt": { 7 | "message": "My Site Logo", 8 | "description": "The alt text of navbar logo" 9 | }, 10 | "item.label.Mod开发": { 11 | "message": "Mod Dev", 12 | "description": "Navbar item with label Mod开发" 13 | }, 14 | "item.label.MadParticle": { 15 | "message": "MadParticle", 16 | "description": "Navbar item with label MadParticle" 17 | }, 18 | "item.label.R6MS": { 19 | "message": "R6MS", 20 | "description": "Navbar item with label R6MS" 21 | }, 22 | "item.label.GitHub": { 23 | "message": "GitHub", 24 | "description": "Navbar item with label GitHub" 25 | }, 26 | "item.label.Mod开发教程": { 27 | "message": "Mod Development Tutorial", 28 | "description": "Navbar item with label Mod开发教程" 29 | }, 30 | "item.label.Mod使用指南": { 31 | "message": "Mod Usage Guide", 32 | "description": "Navbar item with label Mod使用指南" 33 | }, 34 | "item.label.点个Star吧!": { 35 | "message": "Give me a Star!", 36 | "description": "Navbar item with label 点个Star吧!" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /docs/madparticle/Home.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: home 3 | title: MadParticle 主页 4 | hide_table_of_contents: false 5 | sidebar_position: 100 6 | slug: /madparticle 7 | --- 8 | 9 | # MadParticle 指南 10 | 11 | madparticle 12 | 13 | 欢迎来到MadParticle指南! 14 | 15 | --- 16 | 17 | 疯狂粒子受[Extinguish](https://www.curseforge.com/minecraft/mc-mods/extinguish-by-uss_shenzhou)在[Teacon 2022](https://www.teacon.cn/2022/index)中的表现启发,是一个主要适用于多人游戏和数据包的模组。依靠粒子贴图的再利用而不是新增加,有几乎无穷多的粒子可供您营造各种场景。 18 | 19 | MadParticle的设计哲学基于以下几条原则: 20 | 21 | - 最大化利用原版指令系统,以尽可能实现跨版本或平台兼容、持久化、便捷转移; 22 | - 不主动引入新的美术资源,除非是出于跨平台的需要; 23 | - 尽可能采用偏向Minecraft原版的美术风格。 24 | 25 | `/madparticle`命令是这个模组中最重要的部分。作为最基础的内容,你应该先完整阅读`/madparticle 命令指南`,随后在`Designer GUI指南`中学习对辅助设计工具的使用,并阅读剩下的章节。 26 | 27 | :::tip 28 | 29 | 请注意,MadParticle的主要设计功能是如上所述为游戏增加更多粒子,其优化功能仅为附带。 30 | 31 | ::: 32 | 33 | :::info 34 | 35 | [杂项](madparticle/misc)一章包含许多有用的内容: 36 | 37 | - 完全自定义粒子 38 | - 在Fabric中使用MadParticle 39 | - 在服务器中使用MadParticle 40 | - 在ReplayMod中使用MadParticle 41 | - 在光影包中使用MadParticle 42 | 43 | ::: 44 | 45 | **指南内容随着模组规划与开发而更新,故请注意其中可能含有未发布的模组内容。** 46 | 47 | :::info 48 | 49 | 如果有任何疑问或建议,您可以在页面最下方找到我们的KOOK服务器地址。 50 | 51 | ::: 52 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "holo-janeway", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids" 15 | }, 16 | "dependencies": { 17 | "@docusaurus/core": "^3.9.2", 18 | "@docusaurus/preset-classic": "^3.9.2", 19 | "@docusaurus/theme-mermaid": "^3.9.2", 20 | "@mdx-js/react": "^3.0.0", 21 | "clsx": "^1.2.1", 22 | "docusaurus": "^1.14.7", 23 | "prism-react-renderer": "^2.1.0", 24 | "react": "^18.2.0", 25 | "react-dom": "^18.2.0" 26 | }, 27 | "devDependencies": { 28 | "@docusaurus/module-type-aliases": "^3.9.2", 29 | "@docusaurus/types": "^3.9.2" 30 | }, 31 | "browserslist": { 32 | "production": [ 33 | ">0.5%", 34 | "not dead", 35 | "not op_mini all" 36 | ], 37 | "development": [ 38 | "last 1 chrome version", 39 | "last 1 firefox version", 40 | "last 1 safari version" 41 | ] 42 | }, 43 | "engines": { 44 | "node": ">=18.0" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /docs/r6ms/服务器管理员指南.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: op 3 | title: 服务器管理员指南 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 服务器管理员指南 8 | 9 | 作为服务器管理员或拥有者,你需要了解以下所有内容。关于跨服务器同步服务,请查看[这里](cross_server#云跨服务器数据同步服务器拥有者和管理员)。 10 | 11 | --- 12 | 13 | ## 游戏内设置 14 | 15 | 如果你拥有4级权限,在打开R6MS设置时你会发现一个额外的`管理员`类别,其中包含一些特殊的选项。 16 | 17 | :::caution 18 | 19 | - 不建议在有其他玩家正在对战时进行更改,这是未定义行为。 20 | - 进行的更改可能不会立即生效。推荐你在完成更改后立即重启服务器。 21 | 22 | ::: 23 | 24 | :::info 25 | 26 | **未定义行为**:指没有没明确地被规范的行为。通常不会导致游戏崩溃这样严重的错误,而是有可能产生一些奇怪的不符合预期的现象,也有可能不会有任何问题。 27 | 28 | ::: 29 | 30 | ### 旁观对战: 31 | 32 | 限制哪些人可以进入旁观对战。 33 | 34 | 可被设为`允许`或`仅管理员`。默认为`允许`。 35 | 36 | ### 对战中光影: 37 | 38 | 在进入对战后是否可以使用自定义光影。 39 | 40 | 可被设为`自由`或`禁止`。默认为`自由`。 41 | 42 | ### 暂停对战在: 43 | 44 | 是否在服务器持续掉刻超过10秒时强制暂停对战。被暂停的玩家可以一直等待或在30秒后选择退出。 45 | 46 | 可被设为`TPS小于20时`,`TPS小于15时`,`TPS小于10时`或`从不`。默认为`TPS小于15时`。 47 | 48 | --- 49 | 50 | ## Voyager 51 | 52 | ### 获取接入权限 53 | 54 | 默认状况下,*Voyager*不可用。服务器上的玩家只能使用默认皮肤进行游戏。 55 | 56 | 如果你希望你的服务器接入*Voyager*,请按页面下方的链接加入KOOK服务器,进行相应的申请。 57 | 58 | 目前,使用*Voyager*是免费的。 59 | 60 | ### 设置配置文件 61 | 62 | 在你的申请通过后,你将收到访问*Voyager*所必要的数据。TODO 63 | 64 | --- 65 | 66 | ## 在服务器中售卖皮肤 67 | 68 | 69 | 70 | --- 71 | 72 | ## 控制台警告和错误 73 | 74 | 如果在服务器运行过程中出现警告和错误,你可以尝试在[错误与警告排除](faq#错误与警告排除)一节中寻找对应的解释和解决办法。 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /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: 5rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } 12 | 13 | .buttons { 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | } 18 | 19 | .uss_shenzhou_info { 20 | width: 100%; 21 | display: flex; 22 | align-items: center; 23 | justify-content: center; 24 | column-gap: 1rem; 25 | row-gap: 1rem; 26 | } 27 | 28 | .uss_shenzhou_info img { 29 | border-radius: 1rem; 30 | scale: 0.5; 31 | } 32 | 33 | .infoBox { 34 | padding: 2rem; 35 | width: 100%; 36 | display: flex; 37 | flex-direction: column; 38 | align-items: center; 39 | justify-content: center; 40 | text-align-all: center; 41 | } 42 | 43 | .text { 44 | width: 50%; 45 | font-size: 1.5rem; 46 | } 47 | 48 | @media screen and (max-width: 996px) { 49 | .heroBanner { 50 | padding: 2rem 0.5rem; 51 | } 52 | 53 | .uss_shenzhou_info { 54 | flex-direction: column; 55 | } 56 | 57 | .uss_shenzhou_info img { 58 | border-radius: 1rem; 59 | scale: 0.4; 60 | } 61 | 62 | .text { 63 | width: 80%; 64 | font-size: 1.2rem; 65 | } 66 | } -------------------------------------------------------------------------------- /src/pages/index.js.old: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Link from '@docusaurus/Link'; 4 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 5 | import Layout from '@theme/Layout'; 6 | import HomepageFeatures from '@site/src/components/HomepageFeatures'; 7 | 8 | import styles from './index.module.css'; 9 | 10 | function HomepageHeader() { 11 | const {siteConfig} = useDocusaurusContext(); 12 | return ( 13 |
14 |
15 |

{siteConfig.title}

16 |

{siteConfig.tagline}

17 |
18 | 21 | Docusaurus Tutorial - 5min ⏱️ 22 | 23 |
24 |
25 |
26 | ); 27 | } 28 | 29 | export default function Home() { 30 | const {siteConfig} = useDocusaurusContext(); 31 | return ( 32 | 35 | 36 |
37 | 38 |
39 |
40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /docs/holojaneway/i T88使用文档.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: i 3 | title: i T88使用文档 4 | description: T88使用文档 5 | hide_table_of_contents: false 6 | 7 | --- 8 | 9 | # T88使用文档 10 | 11 | ## 概述 12 | 13 | 1-1 14 | 15 | 欢迎登上USS Vancouver! 16 | 17 | T88的名称源于《星际迷航:下层甲板》中提到的一种先进的手持探测工具,在这里是一个库模组,用于存放可以在一些mod之间共享的类,而无需重复编写。 18 | 19 | 此文档适用于T88最新版本。 20 | 21 | --- 22 | 23 | T88的主要设计目的/原则是便于我个人复用代码,并在版本更新时作为抽象层**尽量**减少上层需要的更改。 24 | 25 | T88包含以下几个功能: 26 | 27 | 1. `analyzer`:分析器,允许在游戏内方便地录制和查看开发时指定变量的图表,而不需要在日志中逐次打印再观测。 28 | 2. `config`:配置文件部分,提供一些工具以简化配置文件有关编写。基于GSON,故配置文件是json格式的。 29 | 3. `gui`:GUI部分,对原版GUI进行偏向Swing代码风格的简单抽象和封装。 30 | 4. `network`:网络包部分,提供一系列注解以简化网络包编写。 31 | 5. `networkanalyzer`:网络分析器,监视客户端/服务器上下行网络包流量。 32 | 6. `render`:渲染部分 33 | 1. 提供`RawQuad`以操作`BakedQuad`。 34 | 2. 提供`IFixedModelBlockEntity`以提高固定式BER的渲染效率。 35 | 7. `task`:一个简单的延时任务执行器。 36 | 8. `util`:其他一些杂项工具类。 37 | 38 | ## 启动选项 39 | 40 | T88有一些JVM选项可用: 41 | 42 | | 示例 | 说明 | 43 | | :---------------------------------------------------------- | :----------------------------------------------------------- | 44 | | `-Dt88.test_screen_override=org.example.yourmod.YourScreen` | 覆盖按下T88 GUI测试键(默认为`ALT+T`)时要启动的界面。
需要指定完整名称和无参构造器。 | 45 | | `-Dt88.ignore_section_buffer_render_type=true` | 忽略由其他mod引起的过早加载`RenderType`类导致的注入问题。
可能会导致游戏时崩溃或一些内容不显示。
`=`等号后填任意文本均有效。 | -------------------------------------------------------------------------------- /docs/holojaneway/1 物品.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1 3 | title: 1 物品 4 | description: 物品 5 | hide_table_of_contents: false 6 | sidebar_position: 110 7 | --- 8 | 9 | # 物品 10 | 11 | 在这一章,我将以R6MS的破片手榴弹为例,向你讲述如何编写一个物品,顺带介绍其他基本内容。 12 | 13 | --- 14 | 15 | 在R6MS重制版发布之前,暂时留空。R6MS旧版本的手榴弹实现需要改进。 16 | 17 | 18 | 19 | --- 20 | 21 | ## 奇奇怪怪的注意事项 22 | 23 | ### Item与ItemStack 24 | 25 | 你需要注意这两者的区别。如图所示,这是一个最常见的物品栏: 26 | 27 | 1-1 28 | 29 | 在通常的语境中,我们极易把`Item`与`ItemStack`相混淆:你所见的这一个一个小格子是`ItemStack`,其中装着某个`Item`。 30 | 31 | 请注意,装有**相同**`Item`的**不同**`ItemStack`中的`Item`是**相同**对象!也就是说,这一个草方块和一组草方块两个`ItemStack`,其共同含有一个草方块实例。这意味着,你不能在你的`Item`中保存独有的对象。比如,你不应该这样写: 32 | 33 | ```java 34 | public abstract class WrongItem extends Item { 35 | private int id; 36 | ... 37 | ``` 38 | 39 | 你如果在`inventoryTick(ItemStack pStack,...)`中尝试输出`id`和`pStack`,就会发现`pStack`不同而`id`相同。 40 | 41 | 如果你需要为某种`Item`保存独有的数据,你的首选是使用tag。当然也可以使用mixin,甚至可以自己造一个用于保存这个数据的轮子。 42 | 43 | ### 物品的耐久消耗 44 | 45 | 当你以某些方法修改(一般是减少)物品耐久时,请考虑在修改之前先判定物品是否能被损坏: 46 | 47 | ```java 48 | // 自然而直接地,你可能会这样写 49 | public void damage(ItemStack stack){ 50 | stack.setDamageValue(stack.getDamageValue() + 1); 51 | } 52 | 53 | // 但是我更推荐这样做 54 | public void damage(ItemStack stack){ 55 | if (stack.isDamageableItem()){ 56 | stack.setDamageValue(stack.getDamageValue() + 1); 57 | } 58 | } 59 | ``` 60 | 61 | 这样做的目的是支持`Unbreakable`标签。好处是,不但使玩家在创造模式下能够按需获得无限耐久的物品,也可以让玩家在生存模式下的某些特殊情况也能按需获得无限耐久的物品。 62 | 63 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current.json: -------------------------------------------------------------------------------- 1 | { 2 | "version.label": { 3 | "message": "Next", 4 | "description": "The label for version current" 5 | }, 6 | "sidebar.r6ms.category.更新日志": { 7 | "message": "Update Logs", 8 | "description": "The label for category 更新日志 in sidebar r6ms" 9 | }, 10 | "sidebar.madparticle.category./madparticle 命令指南": { 11 | "message": "Command Guide", 12 | "description": "The label for category Command Guideline in sidebar madparticle" 13 | }, 14 | "sidebar.madparticle.category.Mad Particle指南": { 15 | "message": "MadParticle Guide", 16 | "description": "The label for category Mad Particle指南 in sidebar madparticle" 17 | }, 18 | "sidebar.madparticle.category.Rawinbow6 Minesiege指南": { 19 | "message": "Rawinbow6 Minesiege Guide", 20 | "description": "The label for category Rawinbow6 Minesiege指南 in sidebar madparticle" 21 | }, 22 | "sidebar.madparticle.category.玩家游玩指南": { 23 | "message": "Player Gameplay Guide", 24 | "description": "The label for category 玩家游玩指南 in sidebar madparticle" 25 | }, 26 | "sidebar.madparticle.category.Voyager": { 27 | "message": "Voyager", 28 | "description": "The label for category Voyager in sidebar madparticle" 29 | }, 30 | "sidebar.madparticle.category.更新日志": { 31 | "message": "Update Logs", 32 | "description": "The label for category 更新日志 in sidebar madparticle" 33 | }, 34 | "sidebar.madparticle.category.Tell Me Where指南": { 35 | "message": "Guide Me To Guide", 36 | "description": "The label for category Tell Me Where指南 in sidebar madparticle" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import styles from './styles.module.css'; 4 | 5 | const FeatureList = [ 6 | { 7 | title: 'Easy to Use', 8 | Svg: require('@site/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('@site/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('@site/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 | -------------------------------------------------------------------------------- /.github/workflows/azure-static-web-apps-calm-moss-079461300.yml: -------------------------------------------------------------------------------- 1 | name: Azure Static Web Apps CI/CD 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | types: [opened, synchronize, reopened, closed] 9 | branches: 10 | - main 11 | 12 | jobs: 13 | build_and_deploy_job: 14 | if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') 15 | runs-on: ubuntu-latest 16 | name: Build and Deploy Job 17 | steps: 18 | - uses: actions/checkout@v3 19 | with: 20 | submodules: true 21 | lfs: false 22 | - name: Build And Deploy 23 | id: builddeploy 24 | uses: Azure/static-web-apps-deploy@v1 25 | with: 26 | azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_CALM_MOSS_079461300 }} 27 | repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) 28 | action: "upload" 29 | ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### 30 | # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig 31 | app_location: "/" # App source code path 32 | api_location: "" # Api source code path - optional 33 | output_location: "build" # Built app content directory - optional 34 | ###### End of Repository/Build Configurations ###### 35 | 36 | close_pull_request_job: 37 | if: github.event_name == 'pull_request' && github.event.action == 'closed' 38 | runs-on: ubuntu-latest 39 | name: Close Pull Request Job 40 | steps: 41 | - name: Close Pull Request 42 | id: closepullrequest 43 | uses: Azure/static-web-apps-deploy@v1 44 | with: 45 | azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_CALM_MOSS_079461300 }} 46 | action: "close" 47 | -------------------------------------------------------------------------------- /docs/holojaneway/1.7i 网络监视器.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.7i 3 | title: 1.7i 网络监视器 4 | description: T88使用文档-网络监视器 5 | hide_table_of_contents: false 6 | 7 | 8 | 9 | 10 | --- 11 | 12 | # 网络监视器 13 | 14 | ## 后端 15 | 16 | T88将会在调用`ne.mi.ne.Connection#sendPacket`时记录出站网络包,在`ne.mi.ne.Connection#channelRead0`记录入站网络包。因此,使用其他方式进行的网络活动不会被记录。通常来讲,由模组自行注册的网络包会被再包装为`ServerboundCustomPayloadPacket`或`ClientboundCustomPayloadPacket`,并经由以上两个方法传输。 17 | 18 | 对于这两种网络包,T88首先会通过`NetworkRegistry`查找其对应的Codec,然后传入一个全新的ByteBuf,执行一遍其`encode`方法,借此得知网络包所占大小。 19 | 20 | 对于其他类型的网络包,比如原版的一系列网络包,T88会直接尝试查找其`write`方法并调用。如果以上方法均不奏效,网络包大小会被直接认定为0. 21 | 22 | :::info 23 | 24 | 以后可能会加入更多的尝试方法。 25 | 26 | ::: 27 | 28 | :::tip 29 | 30 | 由上述信息可以看出,T88在游戏内测得的流量数据可能与操作系统测得的流量数据有非常大的差异。由于我们的目标是监视第三方模组网络通信,故这种差异在特定目标下可以不考虑。 31 | 32 | ::: 33 | 34 | :::danger 35 | 36 | 你的网络包的`encode`和`decode`部分不应该有任何副作用。这不仅是出于对网络监视器兼容性的考虑,具有副作用的编解码器是非常糟糕的设计。 37 | 38 | ::: 39 | 40 | 在算得网络包大小后,T88会利用`ModFileScanData`遍历所有类来尝试找到匹配网络包类名的modid。如果查找失败,则会返回`unknown`。 41 | 42 | 两个`ConcurrentHashMap`被交替用于存储当前记录周期内的网络数据。通常的刷新周期为1秒,由于是由`TickEvent`驱动,故视游戏性能情况可能会有延迟。 43 | 44 | ## GUI 45 | 46 | 在游戏内按下`Alt+W`即可打开网络监视器。 47 | 48 | 屏幕最上方将会有三个tab项,分别是客户端网络监视、服务端网络监视、设置。 49 | 50 | :::tip 51 | 52 | 对于1080p屏幕,建议将界面尺寸设为`2`。 53 | 54 | 在单人游戏时可能会出现记录交叉混叠的情况。以下说明均基于多人游戏。 55 | 56 | ::: 57 | 58 | ### 监视器面板 59 | 60 | 面板最上方将会显示当前的总流量大小和收发网络包的个数。 61 | 62 | :::info 63 | 64 | 由上文我们可以知道,T88不考虑例如TCP/IP报文头部之类的数据。 65 | 66 | ::: 67 | 68 | 画面中央的是条状图绘制区域。你可以选择分别查看入站和出站网络监视图。网络监视图为横向绘制,原点位于左下角,纵轴是时间,横轴是大小。每1秒钟在底部绘制新一条,并将之前的向上推挤。纵轴最大容量为20(秒),横轴则为动态缩放,保证20秒内最大的一条记录占满横轴长度。 69 | 70 | 网络包按modid进行合并上色,modid字符串哈希值低六位(十六进制)决定了条带的颜色。为防止不同模组流量大小过于悬殊导致的问题,在计算条带长度时,取对数的三次方作为条带相对长度计算的依据。 71 | 72 | 将鼠标悬停在一个条带上时,详细的网络包数据将以tooltip形式展示。各个网络包类将会按大小顺序由上至下排列并着色。 73 | 74 | 暂停按钮可以停止面板的滚动,以方便进行截图等操作。 75 | 76 | :::info 77 | 78 | 服务端监视面板的工作原理略有不同:在打开服务端监视面板后,客户端每秒会向服务端发出请求数据指令,服务端收到后才会将上一秒的数据打包返回。 79 | 80 | 由于一次性传输网络数据所需空间较大,故服务端只响应创造模式玩家或具有2级权限玩家的请求。 81 | 82 | ::: 83 | 84 | ### 设置 85 | 86 | #### 单位 87 | 88 | 指定新生成的条带以及汇总数据在显示时使用的单位。默认为字节(Byte,KiB/S),你可以根据自己的喜好设置为比特(Bit,Kbps)。 89 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React, {useEffect, useState} from 'react'; 2 | import clsx from 'clsx'; 3 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 4 | import Layout from '@theme/Layout'; 5 | import ModList from "@site/src/components/ModList/ModList"; 6 | import styles from './index.module.css'; 7 | import Translate from '@docusaurus/Translate' 8 | 9 | function HomepageHeader() { 10 | const {siteConfig} = useDocusaurusContext(); 11 | return (
12 |
13 |

14 | 欢迎 15 |

16 |

19 | 在上方导航栏选择想要查看的项目。 20 |

21 |

24 | English translations may not cover all pages. 25 |

26 |
27 |
); 28 | } 29 | 30 | export default function Home() { 31 | const {siteConfig} = useDocusaurusContext(); 32 | return ( 36 | 37 |
38 |
39 | USS_Shenzhou head 43 |

44 | 你好!我是USS_Shenzhou,你也可以叫我神舟。 45 |
我主要使用Forge/NeoForge为Minecraft Java Edition编写模组。 46 |
你可以在页面底端找到我的其他赛博刷新点。 47 |

48 |
49 | 50 |
51 |
); 52 | } 53 | -------------------------------------------------------------------------------- /docs/holojaneway/-2 杂项.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: -2 3 | title: -2 杂项 4 | description: 杂项 5 | hide_table_of_contents: false 6 | sidebar_position: 70 7 | --- 8 | 9 | # 杂项 10 | 11 | --- 12 | 13 | ## 循环执行逻辑 14 | 15 | 在《灭》中,我们需要监测世界上新增的火焰,如果没有对应的自动消防水炮能够立即处理,则将新增的火焰存入缓存中,在之后重复检查,直至火焰熄灭或者被自动消防水炮处理; 16 | 17 | 在R6MS中,我们需要常常检测正在等待匹配的玩家,通过一定的算法选择合适的玩家,建立一局新的对战。 18 | 19 | 这些需要一直重复做的事情,我们当然应该放在`tick`中去执行。 20 | 21 | 在`TickEvent`类下,有五种不同的子类可供选择: 22 | 23 | TODO 24 | 25 | --- 26 | 27 | 两个不同的类的实例要是各自注册了一个一模一样的事件监听器,事件响应的时候会报ClassCastException 28 | 29 | --- 30 | 31 | ## 重复继承问题 32 | 33 | 这种情况在造轮子时更容易遇到。你的mod在开发环境下一切正常,但却在生产环境下崩溃,错误报告中有这样一行: 34 | 35 | ```java 36 | Caused by: java.lang.AbstractMethodError: Receiver class cn.ussshenzhou.t88.gui.widegt.TButton does not define or inherit an implementation of the resolved method 'abstract int getX()' of interface cn.ussshenzhou.t88.gui.widegt.TWidget. 37 | ``` 38 | 39 | 这是典型的重复继承后混淆产生的问题,它的大体原理是这样: 40 | 41 | ~~~mermaid 42 | graph TD 43 | id0["VanillaClass#foo()"] --> id1["YourClass#foo()"] 44 | id2["IYourInterface#foo()"] --> id1 45 | ~~~ 46 | 47 | 你出于某种目的让`YourClass`继承了一个原版类`VanillaClass`,又实现了一个新接口`IYourInterface`,但是恰好这个新接口内的`foo()`方法在`VanillaClass`中也有一个同名的方法。 48 | 49 | 在开发环境下不会有任何问题,`yourClass.foo()`调用的就是`YourClass#foo()`,不会有任何毛病;在生产环境可就不一样了:在你构建mod时,所有的原版方法都会被重混淆——很不幸的是,混淆工具并不知道此`foo()`非彼`foo()`。 50 | 51 | 假如`VanillaClass#foo()`的SRG名是`bar()`,那你的`YourClass#foo()`就会被混淆成为`YourClass#bar()`(因为看起来是从原版父类那里继承来的),但是`yourClass.foo()`却不会被改变(因为看起来是从新接口实现的)。然后等到生产环境运行`yourClass.foo()`的时候——找不到`foo()`了。 52 | 53 | 一种简单而高效的补救措施是把你的新方法改个名,就像T88里的`tickT()`、`isVisibleT()`、`getXT()`、`getYT()`一样: 54 | 55 | ~~~mermaid 56 | graph TD 57 | id0["VanillaClass#foo()"] --> id1["YourClass#foo(), YourClass#bob()"] 58 | id2["IYourInterface#bob()"] --> id1 59 | ~~~ 60 | 61 | :::info 62 | 63 | ~~另一种比较沙雕的办法是反向改名:~~ 64 | 65 | ~~~mermaid 66 | graph TD 67 | id0["VanillaClass#foo() (SRG名为bar)"] --> id1["YourClass#bar()"] 68 | id2["IYourInterface#bar()"] --> id1 69 | ~~~ 70 | 71 | 显然,由于SRG名没有可读性而不推荐。 72 | 73 | ::: 74 | 75 | 你应该可以感觉到,这种错误在编写阶段很难发现——开发环境完成测试不代表生产环境就万事大吉了。 -------------------------------------------------------------------------------- /docs/r6ms/玩家游玩指南.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: player 3 | title: 玩家游玩指南 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 玩家游玩指南 8 | 9 | export const Highlight = ({children, color}) => ( 10 | 17 | {children} 18 | 19 | ); 20 | 21 | export const Highlight2 = ({children,color}) => ( 22 | 29 | {children} 30 | 31 | ); 32 | 33 | 在这里,我们将向你简要介绍如何游玩R6MS。 34 | 35 | 在左侧查看子章节以了解有关[对局](player_match)和[设置](player_option)的详细内容。 36 | 37 | 如果你游玩过《彩虹六号:围攻》,你需要尤其注意有蓝色边框的文字。 38 | 39 | 如果你**没有**游玩过《彩虹六号:围攻》,你需要尤其注意有绿色边框的文字。 40 | 41 | --- 42 | 43 | ## 可能的错误提示及原因 44 | 45 | 错误提示通常以单独对话框的形式出现。 46 | 47 | ### 在对战外 48 | 49 | #### 无法连接至跨服务器数据同步 50 | 51 | - 你所在的服务器是离线模式,或是未接入跨服务器数据同步。请咨询服务器管理员。 52 | - 你所在的服务器不能连接到跨服务器数据同步服务器,或是跨服务器数据同步服务器未在正常工作。请咨询服务器管理员。 53 | 54 | #### 无法寻找对战 55 | 56 | - 你在同步服务中被标记了超过三次作弊。如果你认为遇到了恶意封禁,你可以在我们的KOOK服务器内进行申诉。 57 | 58 | ### 在对战中 59 | 60 | #### 对战已终止 61 | 62 | - 回合某一阶段花费的时间超过了设置的上限,比如花费了太久时间加载回合选点俯视图。 63 | - 有玩家主动地或被迫地退出对战。 64 | 65 | --- 66 | 67 | ## 报告错误与提供建议 68 | 69 | 如果遇到游戏崩溃、行为不符合预期,请查看日志中是否有相应的报错内容。如果在游戏运行过程中出现警告和错误,你可以尝试在[错误与警告排除](faq#错误与警告排除)一节中寻找对应的解释和解决办法。 70 | 71 | 如果遇到UI显示问题,尤其当你的屏幕分辨率不是`1920x1080`时,我们特别欢迎你进行反馈。 72 | 73 | 如果你遇到任何由R6MS产生的错误,你可以在页面最下方的KOOK服务器地址中报告。你也可以在包括但不限于GitHub的Issue页面、MC百科的评论区、Bilibili评论区、CurseForge评论区报告,但我们更推荐第一种方式。 74 | 75 | --- 76 | 77 | ## 旁观对战 78 | 79 | 如果你处在旁观模式,你可以在`开始游戏`菜单中选择`旁观`。 80 | 81 | 一个界面将会展示服务器中所有正在进行的对战。你可以选择一场对战,进入观察模式以浏览全图,或是选择对战中的一位玩家,进入其视角。 82 | 83 | 此功能可以被服务器管理员禁用。你将会在上述界面得到提示。 84 | 85 | --- 86 | 87 | ## 更多信息 88 | 89 | 接下来,你应该阅读[跨服务器数据服务](cross_server)和[统计数据收集说明](data_collect)。 90 | 91 | 有关武器或道具皮肤,请查看[跨服务器数据服务中的有关说明](cross_server#云上跨服务器数据同步服务voyager)。 92 | -------------------------------------------------------------------------------- /docs/r6ms/update_log/1.0.0.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.0.0 3 | title: 1.0.0更新日志 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 1.0.0更新日志 8 | 9 | 欢迎回来!在经历四年两个版本的时间之后,我们正式向您推出《我的六号》完全重制版本。 10 | 11 | 你可以看到完整的jar版本号为`1.0.x.tc`。`tc`代表这是TeaCon特别体验版本。 12 | 13 | 推荐你使用最新版的T88。 14 | 15 | --- 16 | 17 | ## 内容更新 18 | 19 | ### 武器 20 | 21 | 感谢GPLv3!我们成功地引入了[MrCrayfish's Gun Mod](https://github.com/MrCrayfish/MrCrayfishGunMod)模组和[Timeless and Classics Guns](https://github.com/ClumsyAlien/TimelessandClassics_Reforged)模组中的枪械系统,并在其基础上进行了适合R6S特性的改动。我们对照R6S,尽量还原了武器的各种表现。 22 | 23 | ### 干员道具 24 | 25 | 20位开拓者干员,以及新进干员,还有他们的各种道具也已经加入了游戏中!我们期待以像素和还原取得平衡为主的设计方针将会给你一个良好的体验。 26 | 27 | ### 盔甲 28 | 29 | 干员盔甲已回归游戏中!为游玩公平性起见,盔甲自带的模型会覆盖玩家的自定义皮肤。 30 | 31 | > 是的,很高兴地告诉您:我们将继续采用以100点血为基础的伤害衰减机制,而不是使用更新的盔甲折算到血量中的机制。这可能会造成一些效果略有变化——我们认为这是一个特性,而不是错误。 32 | 33 | 为适应Minecraft特性,R6S中的1~3级盔甲已经经过折算和分配。 34 | 35 | ### GUI(图形用户界面) 36 | 37 | 完整的GUI框架已经在T88的基础上建立!我们尽力复原了《彩虹六号:围攻》中的GUI——当然得再加上一些像素风格和简化。 38 | 39 | GUI系统主要是在`1920x1080`的屏幕下设计,还没有经过十分全面的测试。如果你觉得什么地方不对劲,请及时告诉开发者。 40 | 41 | --- 42 | 43 | ## 游玩更新 44 | 45 | ### 全流程游玩体验 46 | 47 | 不再需要大箱子里的染色玻璃板、boss血量条、层层叠叠的指令或是其他什么东西,准备好在这一个mod上获得完整的游玩体验! 48 | 49 | 你可以在[玩家游玩指南](/r6ms/player)找到更多关于游玩流程的信息。 50 | 51 | > 由于技术限制,我们目前只提供一种游戏模式——传统的快速对战模式。 52 | 53 | ### 武器涂装 54 | 55 | 在MC里也可以拥有416墨冰了!武器材质切换系统已上线。 56 | 57 | 不过很遗憾,我们并没有alpha包给你开,所以你只能通过参与活动,或者其他什么方式来获得。 58 | 59 | 提醒一下——使用皮肤需要正版账号。请参看下一条。 60 | 61 | ### CSSS与Voyager 62 | 63 | 全新的跨服务器数据同步服务(CSSS)让你在不同的服务器之间无缝衔接!即使是不同的MC实例,你也不需要手动更改一遍配置偏好。 64 | 65 | 如果你有正版账号,那你还能使用云上跨服务器数据同步服务(Voyager)!作为CSSS的一部分,只要你所在的服务器启用了,这个基于云的服务可以记录并同步你的战绩和拥有的武器涂装。当然,你需要先读一读[统计数据收集说明](/r6ms/data_collect)。 66 | 67 | 更多信息可以在[跨服务器同步服务](/r6ms/cross_server)一章找到。 68 | 69 | ### 反作弊 70 | 71 | 我们不会进行低效的数据合理性检测——但作弊者需要为自己的账号负责!我们现在提供两种反作弊方法,一种基于Voyager,另一种则不限制服务器正版与否。 72 | 73 | 更多信息可以在[反作弊](/r6ms/anti_cheat)一章找到。 74 | 75 | --- 76 | 77 | 78 | ## 技术更新 79 | 80 | ### 动作系统 81 | 82 | 再次感谢GPLv3,以及[跑酷](https://www.curseforge.com/minecraft/mc-mods/parcool)模组。我们以其为基础构建了自己的动作系统框架。 83 | 84 | ### 配置文件与设置界面 85 | 86 | 我们新增了一些`json`格式的配置文件,你可以在[这一节](/r6ms/cross_server#本地跨服务器数据同步)读到更多介绍。 87 | 88 | 在R6MS主菜单的右上角,你可以打开R6MS的设置界面。在里面可以找到独属于R6MS的设置项。而例如按键设置的项目,你可以在MC设置中找到。 89 | 90 | --- 91 | 92 | 感谢阅读。 93 | 94 | 以上提到的多数内容仍在完善中,会在后续版本得到改进。欢迎在我们的KOOK进行反馈。 95 | -------------------------------------------------------------------------------- /docs/holojaneway/-1.1 折跃门.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: -1.1 3 | title: -1.1 折跃门 4 | description: 折跃门 5 | hide_table_of_contents: false 6 | --- 7 | 8 | export const Highlight = ({children}) => ( 9 | 16 | {children} 17 | 18 | ); 19 | 20 | # 折跃门 21 | 22 | 这里有一些你可能感兴趣的链接,请自行注意对应的使用许可。 23 | 24 | --- 25 | 26 | ## 索引性文档 27 | 28 | [我的世界开发者中文指南](https://github.com/Mouse0w0/MinecraftDeveloperGuide),mouse0w0,与MC开发有关了几乎一切资料。 29 | 30 | ## 综合性开发教程或文档 31 | 32 | ### 多版本 33 | 34 | [Minecraft Modding Knowledge Base](https://www.mcjty.eu/docs/intro),作者McJty。YouTube上可以找到对应视频,适合入门。英文。 35 | 36 | [《正山小种》](https://www.teacon.cn/xiaozhong/1.18.x),由Teacon执行委员会维护 。门槛与上一条相比略高。仍在编写中。 37 | 38 | 相当推荐:[NeoForge官方文档](https://docs.neoforged.net/),NeoForge分支后的官方文档。偏向于概念性,覆盖面广且相当详细。英文。

39 | 40 | [Forge官方文档](https://docs.minecraftforge.net/),覆盖面广且比较简略。请注意自行选择合适的版本。英文。 41 | 42 | [Forge社区文档](https://forge.gemwire.uk/wiki/Main_Page),覆盖面广且比较详细。请注意自行选择合适的版本。英文。 43 | 44 | ### 单版本 45 | 46 | 1.12.2模组开发,[Harbinger](https://harbinger.covertdragon.team/),Team CovertDragon。虽然版本较旧,但详细地阐述了很多历史问题。 47 | 48 | 1.16.5模组开发,[《Boson 1.16 Modding Tutorial》](https://boson.v2mcdev.com),由FledgeShiu所著 。除去有几篇空着的,Boson是你学习1.16.5模组开发的不二之选。 49 | 50 | 1.18.2模组开发,由秦前久所著:https://tt432.github.io/ModdingTutorial118 。相对来讲比较精简但实用。 51 | 52 | ### 版本无关 53 | 54 | [《模组开发手记》](https://github.com/lksj-dev/lksj-mom),龙龛手鉴计划 。碎片化mod开发指南,类似于“奇奇怪怪的注意事项”大合集。龙龛手鉴计划同时还有一系列模组开发辅助项目。 55 | 56 | ## 专门性开发教程或文档 57 | 58 | [Mixin官方文档的中文翻译](https://mouse0w0.github.io/categories/Mixin/) ,mouse0w0。 59 | 60 | [《从0开始玩Datagen》](https://skyinr.github.io/DatagenBook/#/zh-cn/),skyinr 。Datagen教程,当你需要Datagen的时候。 61 | 62 | [《Cobalt》](https://zomb-676.github.io/CobaltDocs/),zomb-676 。关于渲染的说明文档。模型,材质,顶点与OpenGL。 63 | 64 | ## 开发者或团队主页及博客 65 | 66 | [土球球(ustc-zzzz)的博客](https://blog.ustc-zzzz.net/) 。时间可能较久,但其中的《Forge 能量系统简述》仍有参考价值。如果你还不知道4z是谁,总有一天你会知道的。 67 | 68 | [TeaCon的博客](https://blog.teacon.cn/)。值得一看。 69 | 70 | 开发者[道家深湖](https://space.bilibili.com/24124162) 。他有相当的专栏值得一看。 71 | 72 | ## 单篇文章 73 | 74 | [为什么你学不会Minecraft模组开发](https://www.bilibili.com/read/cv24543904),作者[雪尼Snownee](https://space.bilibili.com/6939567),有一定参考性。 75 | 76 | ## 其他内容 77 | 78 | MC wiki,https://zh.minecraft.wiki/ 。 -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/Home.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: home 3 | title: MadParticle Home 4 | hide_table_of_contents: false 5 | sidebar_position: 100 6 | slug: /madparticle 7 | --- 8 | 9 | # MadParticle Guide 10 | 11 | :::caution 12 | 13 | Some content on this page may have been translated by AI. The translated pages may be behind the latest version. 14 | 15 | ::: 16 | 17 | madparticle 18 | 19 | Welcome to the MadParticle Guide! 20 | 21 | --- 22 | 23 | Inspired by [Extinguish](https://www.curseforge.com/minecraft/mc-mods/extinguish-by-uss_shenzhou)'s showcase at [Teacon 2022](https://www.teacon.cn/2022/index), MadParticle is a mod primarily intended for multiplayer games and data packs. By creatively reusing existing particle textures rather than adding new ones, it provides nearly unlimited possibilities for particle effects in various scenarios. 24 | 25 | MadParticle's design philosophy is based on the following principles: 26 | 27 | - Maximizing the utilization of Minecraft's native command system for compatibility across versions or platforms, persistence, and ease of transfer. 28 | - Avoiding the introduction of new artistic assets unless required for cross-platform needs. 29 | - Maintaining a visual style that closely aligns with vanilla Minecraft. 30 | 31 | The `/madparticle` command is the most essential feature of this mod. As foundational content, you should first thoroughly read the `/madparticle Command Guide`, then explore the use of the auxiliary design tools in the `Designer GUI Guide`, and finally review the remaining chapters. 32 | 33 | :::tip 34 | 35 | Please note that MadParticle's primary purpose is to enhance particle effects in the game, with optimization features included as supplementary benefits. 36 | 37 | ::: 38 | 39 | :::info 40 | 41 | The [Misc](madparticle/misc) section contains several useful topics: 42 | 43 | - Fully custom particles 44 | - Using MadParticle in Fabric 45 | - Using MadParticle on servers 46 | - Using MadParticle with ReplayMod 47 | - Using MadParticle with shader packs 48 | 49 | ::: 50 | 51 | **This guide is updated alongside the planning and development of the mod, so be aware that it might include unreleased mod content.** 52 | 53 | :::info 54 | 55 | If you have any questions or suggestions, you can find our KOOK server address at the bottom of this page. 56 | 57 | ::: 58 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-theme-classic/footer.json: -------------------------------------------------------------------------------- 1 | { 2 | "link.item.label.KOOK": { 3 | "message": "KOOK", 4 | "description": "The label of footer link with label=KOOK linking to https://kook.top/Bu1WLb" 5 | }, 6 | "link.item.label.Bilibili": { 7 | "message": "Bilibili", 8 | "description": "The label of footer link with label=Bilibili linking to https://space.bilibili.com/266675750" 9 | }, 10 | "link.item.label.GitHub": { 11 | "message": "GitHub", 12 | "description": "The label of footer link with label=GitHub linking to https://github.com/USS-Shenzhou" 13 | }, 14 | "copyright": { 15 | "message": "\n Copyleft 2025 HoloJaneway, USS_Shenzhou. Built with Docusaurus.\n
川公网安备51112302000191号\n | 蜀ICP备2023001090号-1\n
HoloJaneway网站使用MIT许可证。\n | The HoloJaneway website is licensed under MIT License.\n
《HoloJaneway Mod开发教程》使用CC BY-NC 4.0,BSD-3-Clause和GPLv3许可证。\n | The HoloJaneway Mod Developing Tutorial is licensed under CC BY-NC 4.0,BSD-3-Clause and GPLv3 License.\n
USS_Shenzhou 对《Mod使用指南》中的所有内容保留所有权利。\n | All rights reserved for the Mod Usage Guidelines.\n
\n ", 16 | "description": "The footer copyright" 17 | }, 18 | "link.item.label.CurseForge": { 19 | "message": "CurseForge", 20 | "description": "The label of footer link with label=CurseForge linking to https://legacy.curseforge.com/members/uss_shenzhou/projects" 21 | }, 22 | "link.item.label.Modrinth": { 23 | "message": "Modrinth", 24 | "description": "The label of footer link with label=Modrinth linking to https://modrinth.com/user/USS-Shenzhou" 25 | }, 26 | "link.item.label.Discord": { 27 | "message": "Discord", 28 | "description": "The label of footer link with label=Discord linking to https://discord.gg/kNbGdDXpSA" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/常见问题解答.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: faq 3 | title: 常见问题解答 4 | hide_table_of_contents: false 5 | toc_max_heading_level: 4 6 | --- 7 | 8 | # 常见问题解答 9 | 10 | --- 11 | 12 | export const Box = ({children}) => ( 13 |
21 | {children} 22 |
23 | ); 24 | 25 | 26 | 27 | 28 | 29 | #### 会支持Minecraft 1.19或更以前的版本吗? 30 | 31 | - 不会。我们的时间和精力有限。 32 | 33 | 34 | 35 | 36 | 37 | #### 会支持Fabric吗? 38 | 39 | - MadParticle支持Fabric的主要目的是和ReplayMod一同使用。原则上只要在Forge平台上没有可用的ReplayMod,我们就会编写对应的Fabric版MadParticle。但版本之间的转移需要额外的时间,Fabric版本的发布可能显著落后于对应的Forge版本。 40 | 41 | 42 | 43 | 44 | 45 | #### 兼容其他模组吗? 46 | 47 | “兼容”在此处分为几个具体方面。 48 | 49 | 1. 实例化渲染支持以下模组: 50 | 51 | - **Rubidium**:✅ 52 | - **Embeddium**:✅ 53 | - **Optifine**:✅ 54 | - *启用光影时*:⚠️ 依光影具体使用的着色器决定。如果一些光影使用了奇奇怪怪的渲染方式,则可能会产生画面错误。已测试过的光影包: 55 | - BSL:✅ 56 | - SEUS系列:❌ 57 | - **Iris/Oculus**:✅ 58 | - *启用光影时*:实例化渲染已支持使用光影,但由于与Shimmer的联动尚未更新,`PARTICLE_SHEET_TRANSLUCENT`和`PARTICLE_SHEET_OPAQUE`等传统渲染方式将自动降级为对应的原版方式。 59 | - 此外不排除一些光影的特定着色器导致粒子颜色出现错误。 60 | 61 | 2. 并行化计算: 62 | 63 | 并行化计算仅支持未对世界产生主动干涉的粒子,否则可能会导致`ConcurrentModificationException`或其他错误使游戏崩溃。我们已经对原版粒子作出区分,自动地将不能并行化计算的粒子放到主线程中运行。 64 | 65 | 对于其他模组的粒子,显然MadParticle难以预先得知其是否会导致错误,故默认采取保守策略,不接管其他模组粒子的计算。如果有需要,你可以手动在设置中启用。 66 | 67 | 关于支持的原版粒子列表,请看[这一部分](config/#性能原理)。 68 | 69 | 70 | 71 | 72 | 73 | #### 这个模组和ColorBlock有什么区别? 74 | 75 | - ColorBlock更侧重于让许多粒子共同地组成一个预定的形状;MadParticle更侧重于让每个粒子都能跑完形状的全程。 76 | 77 | 78 | 79 | 80 | 81 | #### 这个模组和Photon有什么区别? 82 | 83 | - Photon在多个方面比MadParticle更为现代化;MadParticle原则上不引入新的美术资源。 84 | 85 | 86 | 87 | 88 | 89 | #### 为什么我看不见我生成的粒子? 90 | - 有非常多地方出差错都可能导致看不到粒子。你可以尝试按以下顺序依次检查: 91 | - 确定你有执行`/mp`指令的权限; 92 | - 确定Designer GUI辅助设计工具中没有红色文字; 93 | - 确定Designer GUI中的粒子预览符合预期; 94 | - 确定生成坐标没有混淆相对坐标和绝对坐标; 95 | - 确定初速度没有误填为坐标或其他太大的值; 96 | - 确定渲染方式选择正确; 97 | - 确定透明度不为0或不太小。 98 | 99 | 100 | 101 | 102 | 103 | #### 附带的优化效果似乎并不明显? 104 | 105 | - 游戏的实际帧数受具体场景、硬件性能、后台程序等因素共同影响。在极大粒子数量情况下,后台程序运行可能会极大地影响帧数表现。 106 | 107 | 108 | 109 | 110 | 111 | #### 启用优化之后,游戏帧数不稳定? 112 | 113 | - 在玩家快速移动、粒子数量较少时,可能会产生和原版相比额外的卡顿,这是正常现象。 114 | 115 | 116 | -------------------------------------------------------------------------------- /docs/madparticle/常见问题解答.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: faq 3 | title: 常见问题解答 4 | hide_table_of_contents: false 5 | toc_max_heading_level: 4 6 | --- 7 | 8 | # 常见问题解答 9 | 10 | --- 11 | 12 | export const Box = ({children}) => ( 13 |
21 | {children} 22 |
23 | ); 24 | 25 | 26 | 27 | 28 | 29 | #### 会支持Minecraft 1.19或更以前的版本吗? 30 | 31 | - 不会。我们的时间和精力有限。 32 | 33 | 34 | 35 | 36 | 37 | #### 会支持Fabric吗? 38 | 39 | - MadParticle支持Fabric的主要目的是和ReplayMod一同使用。原则上只要在Forge平台上没有可用的ReplayMod,我们就会编写对应的Fabric版MadParticle。但版本之间的转移需要额外的时间,Fabric版本的发布可能显著落后于对应的Forge版本。 40 | 41 | 42 | 43 | 44 | 45 | #### 兼容其他模组吗? 46 | 47 | “兼容”在此处分为几个具体方面。 48 | 49 | 1. 实例化渲染支持以下模组: 50 | 51 | - **Rubidium**:✅ 52 | - **Embeddium**:✅ 53 | - **Optifine**:✅ 54 | - *启用光影时*:⚠️ 依光影具体使用的着色器决定。如果一些光影使用了奇奇怪怪的渲染方式,则可能会产生画面错误。已测试过的光影包: 55 | - BSL:✅ 56 | - SEUS系列:❌ 57 | - **Iris/Oculus**:✅ 58 | - *启用光影时*:实例化渲染已支持使用光影,但由于与Shimmer的联动尚未更新,`PARTICLE_SHEET_TRANSLUCENT`和`PARTICLE_SHEET_OPAQUE`等传统渲染方式将自动降级为对应的原版方式。 59 | - 此外不排除一些光影的特定着色器导致粒子颜色出现错误。 60 | 61 | 2. 并行化计算: 62 | 63 | 并行化计算仅支持未对世界产生主动干涉的粒子,否则可能会导致`ConcurrentModificationException`或其他错误使游戏崩溃。我们已经对原版粒子作出区分,自动地将不能并行化计算的粒子放到主线程中运行。 64 | 65 | 对于其他模组的粒子,显然MadParticle难以预先得知其是否会导致错误,故默认采取保守策略,不接管其他模组粒子的计算。如果有需要,你可以手动在设置中启用。 66 | 67 | 关于支持的原版粒子列表,请看[这一部分](config/#性能原理)。 68 | 69 | 70 | 71 | 72 | 73 | #### 这个模组和ColorBlock有什么区别? 74 | 75 | - ColorBlock更侧重于让许多粒子共同地组成一个预定的形状;MadParticle更侧重于让每个粒子都能跑完形状的全程。 76 | 77 | 78 | 79 | 80 | 81 | #### 这个模组和Photon有什么区别? 82 | 83 | - Photon在多个方面比MadParticle更为现代化;MadParticle原则上不引入新的美术资源。 84 | 85 | 86 | 87 | 88 | 89 | #### 为什么我看不见我生成的粒子? 90 | - 有非常多地方出差错都可能导致看不到粒子。你可以尝试按以下顺序依次检查: 91 | - 确定你有执行`/mp`指令的权限; 92 | - 确定Designer GUI辅助设计工具中没有红色文字; 93 | - 确定Designer GUI中的粒子预览符合预期; 94 | - 确定生成坐标没有混淆相对坐标和绝对坐标; 95 | - 确定初速度没有误填为坐标或其他太大的值; 96 | - 确定渲染方式选择正确; 97 | - 确定透明度不为0或不太小。 98 | 99 | 100 | 101 | 102 | 103 | #### 附带的优化效果似乎并不明显? 104 | 105 | - 游戏的实际帧数受具体场景、硬件性能、后台程序等因素共同影响。在极大粒子数量情况下,后台程序运行可能会极大地影响帧数表现。 106 | 107 | 108 | 109 | 110 | 111 | #### 启用优化之后,游戏帧数不稳定? 112 | 113 | - 在玩家快速移动、粒子数量较少时,可能会产生和原版相比额外的卡顿,这是正常现象。 114 | 115 | 116 | -------------------------------------------------------------------------------- /src/components/ModList/styles.module.css: -------------------------------------------------------------------------------- 1 | .modContainer { 2 | border: 2px solid #3c91ff; 3 | border-radius: 1rem; 4 | width: 60%; 5 | margin-top: 0.25rem; 6 | margin-bottom: 0.25rem; 7 | display: flex; 8 | align-items: center; 9 | } 10 | 11 | .spinner { 12 | border: 4px solid rgba(0,0,0,0.1); 13 | border-top: 4px solid #3c91ff; 14 | border-radius: 50%; 15 | width: 2rem; 16 | height: 2rem; 17 | animation: spin 0.9s linear infinite; 18 | margin: 1rem; 19 | } 20 | 21 | @keyframes spin { 22 | to { transform: rotate(360deg); } 23 | } 24 | 25 | .biliModAllContainer { 26 | width: 60%; 27 | margin-top: 0.25rem; 28 | margin-bottom: 1.5rem; 29 | display: grid; 30 | grid-template-columns: 1fr 1fr; 31 | grid-gap: 1rem; 32 | } 33 | 34 | .biliMod { 35 | border: 2px solid #3c91ff; 36 | border-radius: 1rem; 37 | width: 100%; 38 | display: flex; 39 | align-items: center; 40 | } 41 | 42 | .biliThumbnail { 43 | width: 14rem; 44 | height: 8rem; 45 | object-fit: cover; 46 | margin: 1.5% 1.5% 2% 1.5%; 47 | border-radius: 0.5rem; 48 | } 49 | 50 | .h2Margin { 51 | margin: 1rem 0 0.5rem; 52 | } 53 | 54 | .thumbnail { 55 | width: 8rem; 56 | height: 8rem; 57 | object-fit: cover; 58 | margin: 1.5% 1.5% 1.5% 3%; 59 | border-radius: 0.5rem; 60 | } 61 | 62 | .modInfo { 63 | width: 100%; 64 | padding: 1rem; 65 | } 66 | 67 | .title { 68 | font-size: 1.5rem; 69 | margin: 0; 70 | } 71 | 72 | .summary { 73 | font-size: 1rem; 74 | width: 100%; 75 | border-bottom: 2px solid; 76 | border-bottom-color: rgba(100, 100, 100, 100); 77 | margin: 0.25rem 0; 78 | } 79 | 80 | .latestVersion { 81 | font-size: 1rem; 82 | margin: 0.25rem 0 0; 83 | } 84 | 85 | .buttonContainer { 86 | display: flex; 87 | flex-wrap: wrap; 88 | } 89 | 90 | .button { 91 | display: block; 92 | text-align: center; 93 | background-color: #3c91ff; 94 | border: 2px solid #3c91ff; 95 | color: #fff; 96 | border-radius: 0.5rem; 97 | padding: 0.25rem 0.7rem; 98 | text-decoration: none; 99 | font-size: 14px; 100 | margin-right: 0.5rem; 101 | margin-top: 0.5rem; 102 | } 103 | 104 | .button:hover { 105 | background-color: transparent; 106 | color: #3c91ff; 107 | text-decoration: none; 108 | } 109 | 110 | .container { 111 | margin-top: -2rem; 112 | display: flex; 113 | flex-direction: column; 114 | align-items: center; 115 | width: 100%; 116 | } 117 | 118 | @media screen and (max-width: 996px) { 119 | .container { 120 | margin-top: 1rem; 121 | } 122 | 123 | .modContainer { 124 | width: 95%; 125 | } 126 | 127 | .biliModAllContainer { 128 | width: 95%; 129 | } 130 | 131 | .biliModAllContainer { 132 | grid-template-columns: 1fr; 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /docs/madparticle/第三方模组.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev 3 | title: 第三方模组开发者 4 | hide_table_of_contents: false 5 | toc_max_heading_level: 4 6 | 7 | --- 8 | 9 | # 第三方模组开发者指南 10 | 11 | 我们非常欢迎您对MadParticle作出主动或被动的支持。 12 | 13 | ## 被动兼容 14 | 15 | 只需要让您的粒子继承`TextureSheetParticle`,按常规路径走原版`ParticleEngine`的各种逻辑,MadParticle会自动地按照用户的设置进行接管。 16 | 17 | ## 主动兼容 18 | 19 | 在以上所述的被动兼容的基础上,您还可以主动向MadParticle告知您的粒子是否支持并行计算,以及是否支持实例化渲染。 20 | 21 | :::info 22 | 23 | 如果您不确定您的粒子是否支持并行计算和实例化渲染: 24 | 25 | - 只需要检查您的粒子`tick`方法中的内容是否含有只能在主线程中执行的内容,例如对`Minecraft`对象的写操作; 26 | - 您的粒子是否含有特殊的渲染?比如具有固定旋转角度而不是常规billboard、材质不来源于`TextureAtlas.LOCATION_PARTICLES`; 27 | 28 | ::: 29 | 30 | MadParticle在`Particle`类中注入了类型为枚举`TakeOver.TickType`的`madparticleTickType`字段,以表示这个粒子是否支持并行计算。`TickType`的值可以是`SYNC`、`ASYNC`和`UNKNOWN`。对于没有主动赋值的第三方粒子,默认值是`UNKNOWN`。 31 | 32 | MadParticle依靠`Particle.getRenderType`方法来判断粒子是否支持实例化渲染。如果你返回传统的`PARTICLE_SHEET_TRANSLUCENT`或`PARTICLE_SHEET_OPAQUE`,MadParticle会自动根据用户设置来决定是否进行实例化渲染。如果返回`INSTANCED`,则是显式指定总是进行实例化渲染。 33 | 34 | 以下是完整的参考代码: 35 | 36 | ```java 37 | public class YourParticle extends TextureSheetParticle { 38 | private @NotNull ParticleRenderType particleRenderType = ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; 39 | 40 | public YourParticle(ClientLevel pLevel, double pX, double pY, double pZ, ParticleRenderType particleRenderType) { 41 | super(pLevel, pX, pY, pZ); 42 | if (ModList.get().isLoaded("madparticle")) { 43 | try { 44 | var madparticleTickType = this.getClass().getDeclaredField("madparticleTickType"); 45 | madparticleTickType.setAccessible(true); 46 | var takeOver = Class.forName("cn.ussshenzhou.madparticle.particle.enums.TakeOver.TickType"); 47 | var valueOf = takeOver.getMethod("valueOf", String.class); 48 | //SYNC ASYNC UNKNOWN 49 | var sync = valueOf.invoke(null, "SYNC"); 50 | madparticleTickType.set(this, sync); 51 | } catch (NoSuchFieldException | ClassNotFoundException | NoSuchMethodException | IllegalAccessException | 52 | InvocationTargetException ignored) { 53 | } 54 | try { 55 | var madparticleModParticleRenderTypes = Class.forName("cn.ussshenzhou.madparticle.particle.ModParticleRenderTypes"); 56 | var instance = madparticleModParticleRenderTypes.getField("INSTANCED"); 57 | this.particleRenderType = (ParticleRenderType) instance.get(null); 58 | } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException ignored) { 59 | } 60 | } 61 | } 62 | 63 | /** 64 | * Do NOT put reflection or other logic here. This method should be as quick as possible. 65 | */ 66 | @Override 67 | public @NotNull ParticleRenderType getRenderType() { 68 | return particleRenderType; 69 | } 70 | } 71 | ``` 72 | 73 | :::info 74 | 75 | 这里利用了反射来避免在你的项目中引入MadParticle本身。如果你不太喜欢这样做,你也可以借助CurseMaven引入MadParticle。 76 | 77 | ::: 78 | 79 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/第三方模组.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev 3 | title: 第三方模组开发者 4 | hide_table_of_contents: false 5 | toc_max_heading_level: 4 6 | 7 | --- 8 | 9 | # 第三方模组开发者指南 10 | 11 | 我们非常欢迎您对MadParticle作出主动或被动的支持。 12 | 13 | ## 被动兼容 14 | 15 | 只需要让您的粒子继承`TextureSheetParticle`,按常规路径走原版`ParticleEngine`的各种逻辑,MadParticle会自动地按照用户的设置进行接管。 16 | 17 | ## 主动兼容 18 | 19 | 在以上所述的被动兼容的基础上,您还可以主动向MadParticle告知您的粒子是否支持并行计算,以及是否支持实例化渲染。 20 | 21 | :::info 22 | 23 | 如果您不确定您的粒子是否支持并行计算和实例化渲染: 24 | 25 | - 只需要检查您的粒子`tick`方法中的内容是否含有只能在主线程中执行的内容,例如对`Minecraft`对象的写操作; 26 | - 您的粒子是否含有特殊的渲染?比如具有固定旋转角度而不是常规billboard、材质不来源于`TextureAtlas.LOCATION_PARTICLES`; 27 | 28 | ::: 29 | 30 | MadParticle在`Particle`类中注入了类型为枚举`TakeOver.TickType`的`madparticleTickType`字段,以表示这个粒子是否支持并行计算。`TickType`的值可以是`SYNC`、`ASYNC`和`UNKNOWN`。对于没有主动赋值的第三方粒子,默认值是`UNKNOWN`。 31 | 32 | MadParticle依靠`Particle.getRenderType`方法来判断粒子是否支持实例化渲染。如果你返回传统的`PARTICLE_SHEET_TRANSLUCENT`或`PARTICLE_SHEET_OPAQUE`,MadParticle会自动根据用户设置来决定是否进行实例化渲染。如果返回`INSTANCED`,则是显式指定总是进行实例化渲染。 33 | 34 | 以下是完整的参考代码: 35 | 36 | ```java 37 | public class YourParticle extends TextureSheetParticle { 38 | private @NotNull ParticleRenderType particleRenderType = ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; 39 | 40 | public YourParticle(ClientLevel pLevel, double pX, double pY, double pZ, ParticleRenderType particleRenderType) { 41 | super(pLevel, pX, pY, pZ); 42 | if (ModList.get().isLoaded("madparticle")) { 43 | try { 44 | var madparticleTickType = this.getClass().getDeclaredField("madparticleTickType"); 45 | madparticleTickType.setAccessible(true); 46 | var takeOver = Class.forName("cn.ussshenzhou.madparticle.particle.enums.TakeOver.TickType"); 47 | var valueOf = takeOver.getMethod("valueOf", String.class); 48 | //SYNC ASYNC UNKNOWN 49 | var sync = valueOf.invoke(null, "SYNC"); 50 | madparticleTickType.set(this, sync); 51 | } catch (NoSuchFieldException | ClassNotFoundException | NoSuchMethodException | IllegalAccessException | 52 | InvocationTargetException ignored) { 53 | } 54 | try { 55 | var madparticleModParticleRenderTypes = Class.forName("cn.ussshenzhou.madparticle.particle.ModParticleRenderTypes"); 56 | var instance = madparticleModParticleRenderTypes.getField("INSTANCED"); 57 | this.particleRenderType = (ParticleRenderType) instance.get(null); 58 | } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException ignored) { 59 | } 60 | } 61 | } 62 | 63 | /** 64 | * Do NOT put reflection or other logic here. This method should be as quick as possible. 65 | */ 66 | @Override 67 | public @NotNull ParticleRenderType getRenderType() { 68 | return particleRenderType; 69 | } 70 | } 71 | ``` 72 | 73 | :::info 74 | 75 | 这里利用了反射来避免在你的项目中引入MadParticle本身。如果你不太喜欢这样做,你也可以借助CurseMaven引入MadParticle。 76 | 77 | ::: 78 | 79 | -------------------------------------------------------------------------------- /docs/holojaneway/-5 lib-mod.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: -5 3 | title: -5 lib-mod 4 | description: lib-mod 5 | hide_table_of_contents: false 6 | sidebar_position: 40 7 | --- 8 | 9 | # lib-mod 10 | 11 | 在这一章,我将以《T88》这个lib-mod为例,向你讲述如何编写并使用属于自己的lib-mod。 12 | 13 | 当你写了不止一个mod的时候,你很有可能会发现你需要时不时的从之前的mod中复制代码到之后的mod——如果这些代码的数量达到了相当的程度,你可以选择将这些复用代码收集起来,整理为一个库模组,亦即lib-mod。 14 | 15 | 我们将借助CurseForge和CurseMaven来实现这一目的。 16 | 17 | ## lib-mod本质上也是一个mod 18 | 19 | 所以,像平常一样,新建一个mod,取一个你想要的名字,构建,把你的共享代码写进去。 20 | 21 | 然后你需要在你的`build.gradle`中增加一行: 22 | 23 | ```java 24 | java { 25 | ... 26 | withSourcesJar() 27 | } 28 | ``` 29 | 30 | 刷新项目,你会发现在`build > jar`旁边多出来一个`sourcesJar`。顾名思义,这个任务将会把你的mod打包为源代码Jar,而不是编译和混淆之后、可以在被MC加载的Jar。 31 | 32 | ## 在CurseForge上发布 33 | 34 | 然后你就可以把这个mod在CurseForge上发布了。请在上传jar文件之后,将source-jar也上传。 35 | 36 | 我建议你在项目介绍中写明类似如下的内容: 37 | 38 | > 注意:如果你需要在游戏中使用此模组,请下载**不**带“sources”后缀的版本! 39 | > 40 | > Attention: If you want to install this mod to your game, do download the versions WITHOUT "sources" ! 41 | 42 | ## 使用这个lib-mod 43 | 44 | 借助[CurseMaven](https://www.cursemaven.com/),我们可以方便地将CurseForge上的mod作为你自己mod的依赖。 45 | 46 | 在你的lib-mod首页,即`Description`一栏,你可以在右侧找到你的`ProjectID`。 47 | 48 | 你的lib-mod在上传CurseForge,在`Files`一栏,分别点击对应的jar和source-jar,将鼠标悬停于`Install`旁的下拉菜单中的`Download file`,你就可以在浏览器下方显示的URL中查看它们的`fileID`了。 49 | 50 | :::tip 51 | 52 | 即使你的mod jar暂时没有审核通过,你也可以照常查看并使用`fileID`。 53 | 54 | ::: 55 | 56 | 打开你需要使用lib-mod的mod,在`build.gradle`中增加: 57 | 58 | ```gradle 59 | //注意,这里不是在buildscript之下,而是build.gradle接近末尾处有单独的一块。 60 | repositories { 61 | maven { 62 | url "https://cursemaven.com" 63 | content { includeGroup "curse.maven" } 64 | } 65 | } 66 | 67 | dependencies { 68 | implementation fg.deobf("curse.maven:[lib-mod名称]-[ProjectID]:[jar的fileID]-sources-[source-jar的fileID]") 69 | } 70 | ``` 71 | 72 | 刷新项目,你应该就能在外部库列表里找到你自己的lib-mod了。 73 | 74 | 然后你还需要在`mods.toml`中告诉FML,你需要这个lib-mod: 75 | 76 | ```toml 77 | # 在末尾添加如下内容 78 | [[dependencies.你的modid]] 79 | modId = "你依赖的lib-modid" 80 | mandatory = true 81 | versionRange = "[你依赖的lib-mod版本号下限,上限)" # 无上限则可以留空 82 | ordering = "NONE" 83 | side = "BOTH" 84 | # 各项含义请参照原文件内的注释 85 | ``` 86 | 87 | 更多内容可以参考CurseMaven的官方网站,https://www.cursemaven.com/ 。 88 | 89 | --- 90 | 91 | ## 奇奇怪怪的注意事项 92 | 93 | ### 更灵活的使用方式 94 | 95 | 你可能会遇到这种情况:某个mod需要作一些修改,与此同时本地也需要修改另一个联动mod或者前置mod。 96 | 97 | 将前置mod不停地上传CurseFouge显然会很低效——但local maven什么的似乎又没有那个必要...你可以直接把前置mod的构建输出文件夹作为后置mod的依赖仓库,这样就能直接读取本地构建出来的jar了。 98 | 99 | ```gradle {4-6,12} 100 | repositories { 101 | ... 102 | 103 | flatDir { 104 | dir 'D:/develop/t88/build/libs' 105 | } 106 | } 107 | 108 | dependencies { 109 | minecraft ... 110 | 111 | implementation fg.deobf("blank:t88:0.4.+") 112 | 113 | ... 114 | } 115 | ``` 116 | 117 | 如上所示,通过指定前置mod的绝对路径,就可以方便地把对应的jar作为项目依赖了。 118 | 119 | :::tip 120 | 121 | 你可以像上面一样,使用`+`号来绕过前置mod的版本号有后缀的情况。 122 | 123 | ::: 124 | -------------------------------------------------------------------------------- /docs/tellmewhere/home.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: home 3 | title: Tell Me Where使用指南 4 | description: Tell Me Where使用指南 5 | hide_table_of_contents: false 6 | 7 | --- 8 | 9 | # Guide Me To使用指南 10 | 11 |
22 |
26 | madparticle 27 | madparticle 28 |
29 |
32 | | 33 |  2号线  34 | | 35 |  4号线  36 | madparticle 37 |
38 |
39 |

40 | 41 | 欢迎查看Guide Me To使用指南! 42 | 43 | :::info 44 | 45 | **Tell Me Where**在正式版本已更名为**Guide Me To**。以下简称GMT。 46 | 47 | ::: 48 | 49 | Guide Me To提供形态各异的指示牌方块,你可以在其中编写你想要的指示内容。GMT的设计指导思想是: 50 | 51 | - 提供(视觉和语义上)清晰易读的指示牌,(基础指示牌)在通常分辨率和FOV下拥有16m及以上的可读距离; 52 | - 为此单方块仅支持单行文本(绝对不是懒得写多行); 53 | - 在此基础上尽可能适应各种不同风格的场景; 54 | 55 | 要查看指示牌的使用方法,请转到[这里](signblock)。 56 | 57 | ## 图文混写 58 | 59 | 借助文本形式存储和渲染前预“编译”,GMT支持图文混写。 60 | 61 | :::tip 62 | 63 | GMT也支持原版的格式化代码,即使用分节符`§`来控制文字样式。 64 | 65 | ::: 66 | 67 | 在纯文本形式下,图片以前缀`&@`+`图片id`形式表现。 68 | 69 | :::info 70 | 71 | 图片id固定为两位36进制数。这使得GMT最大可以支持1296个标志。 72 | 73 | ::: 74 | 75 | ### 标志 76 | 77 | Tell Me Where默认提供两套标志合集: 78 | 79 | - “标准”:标准、清晰、准确的标志。主要参考来源有: 80 | - 北京地铁导向标志; 81 | - `GB/T 10001` 标志用公共信息图形符号。 82 | - “Google”:更加现代、轻量的标志,可读性可能略差一些。来自[Google Material Symbols](https://fonts.google.com/icons),使用[Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)许可。 83 | 84 | 这些标志的颜色按照下文的规定进行标准化。 85 | 86 | 参考`ISO 3864-1:2011`和`GB 2894-2008`,Tell Me Where的指示标志分为以下几类: 87 | 88 | - **提示标志**或**指示标志**:提供某种信息的图形标志; 89 | - **禁止标志**:禁止不安全行为的图形标志; 90 | - **警告标志**:提醒对周围环境引起注意的图形标志; 91 | - **指令标志**:强制做出某种动作或措施的图形标志。 92 | 93 | #### 颜色 94 | 95 | Tell Me Where的指示牌均使用纯黑色背景,并默认使用纯白色文字。 96 | 97 | 参考`ISO 3864-4:2011`,Tell Me Where的四种标准颜色及其对应RGB为: 98 | 99 | - **红色**:#BC2221 100 | - **黄色**:#FBC30A 101 | - **绿色**:#237F52 102 | - **蓝色**:#005387 103 | 104 | ## 国际化 105 | 106 | GMT提供原生国际化支持。 107 | 108 | 在方块实体同步时,服务端会将所有可用语言内容发送至客户端,供客户端自行选择显示的内容。 109 | 110 | 想要为指示牌添加多种语言,只需要在指示牌编辑界面的`language`输入框中输入语言代码,点击`create`,即创建对应的编辑页面。 111 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/madparticle辅助设计工具使用指南(一).md: -------------------------------------------------------------------------------- 1 | --- 2 | id: designer 3 | title: Designer GUI指南 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # Designer GUI指南 8 | 9 | 在这里,我将向您介绍`MadParticle Designer GUI`辅助设计工具的使用方法 10 | 11 | :::info 12 | 13 | 为保障GUI界面紧凑,以及防止字符显示重叠,英文界面使用了大量的缩写。为此,当在英文设定下打开Designer GUI时,一些输入框会有特定的Tooltip提示,而中文环境则不存在。 14 | 15 | `MadParticle Designer GUI`与[Modern UI](https://www.curseforge.com/minecraft/mc-mods/modern-ui)兼容良好。你可以借助其来改进使用体验。 16 | 17 | ::: 18 | 19 | --- 20 | 21 | ## 参数 22 | 23 | 参数模式是最为基础的Designer GUI模式,此模式旨在帮助您更直观清晰地(相对于一串五颜六色的字符来说)编写MP命令。 24 | 25 | ### 基础概念与操作 26 | 27 | 进入游戏后,默认按`alt+m`新建并打开辅助工具。`参数辅助`模式在一开始是被默认选择的。最上方的`总输入框`将展示最终的结果,点击`复制`即将`总输入框`的内容复制到剪贴板。左边的`命令串`选择栏以列表的形式展示所有的`子命令`。点击`新建`,您将看到右侧出现了一个`参数面板`,同时`命令串`选择栏也出现了一个被选中的名为`null`的`子命令`。`子命令`所显示的名称由其模仿的目标粒子自动地决定。 28 | 29 | :::tip 30 | 31 | - 如果你需要重新编写一条MP命令,而又懒得一个一个删掉`命令串`选择栏里面的`子命令`;或者遇到了一些意料之外的辅助工具错误: 32 | - 你可以按`esc`退出辅助工具、回到游戏世界中之后,默认按下`crtl+m`来初始化辅助工具。 33 | - 辅助工具默认使用`/mp`(即简化后的`快速mp指令执行`)。如果您需要使用`/madparticle`(即原版指令执行),请手动替换之。 34 | 35 | ::: 36 | 37 | 38 | 39 | ### 填写一个参数面板 40 | 41 | - 点击`目标粒子`,所有可选粒子会自动地出现在提示栏中。使用↑和↓来切换选中的提示,`tab`或`enter`来应用提示。多数粒子都是可被MP接受的,少数粒子,比如`minecraft:block`不可接受,会被显示为红色。 42 | 43 | :::tip 44 | 45 | 多数输入框都有自动检测功能,白色文字代表输入内容可以被接受,红色文字代表输入内容不可接受,灰色文字代表不可编辑。 46 | 47 | 一些输入框还有提示功能,可以帮助您补全部分内容。自动补全内容可能不适用于所有的情况,可能存在潜在的错误。 48 | 49 | ::: 50 | 51 | - 当你正确地填写一个粒子之后,辅助工具会随机的从该粒子所有可用材质中随机地选取一张,展示在右侧小区域内。如果右侧小区域显示紫黑方块或者没有显示任何图片,则说明该粒子没有使用通常的显示方式、或该粒子没有贴图、或出现了其他不兼容的情况。在这种情况下,我们非常不建议您使用这个粒子(除非您对它们非常熟悉)。 52 | 53 | :::tip 54 | 55 | 如果你想要查看其他的可用材质,单击`目标粒子`输入框(使输入框进行一次更新)即可。未发生变化则说明只有一张可用的材质。 56 | 57 | ::: 58 | 59 | - 当你填写一个可被接受的粒子之后,可以继续常规地填写下面参数以完成这条子命令。你也可以点击`尝试填写默认值`按钮,辅助工具会尝试在程序内部按默认参数生成对应的粒子并读取其参数,自动地填写空白的输入框。自动填写的内容会被自动地标记为蓝色,以提示您可能需要检查和修正。 60 | 61 | :::tip 62 | 63 | 自动填写的`重力`、`二次重力`、`初始大小`、`结束大小`很有可能不正确,需要特别注意。 64 | 65 | ::: 66 | 67 | ### 更多的参数面板 68 | 69 | 在完成一个参数面板之后,你可以继续新建更多的参数面板,从而创造一个粒子串命令。为便于寻找填写错误的参数,在`命令串`选择栏中,解析失败的子命令会被标为红色。辅助工具会自动异步地将各子命令连接起来,展示在最上方的`总输入框`中。 70 | 71 | ### 编写完成 72 | 73 | 完成编写之后,你只需要将`总输入框`中的内容复制到你想要的地方,比如命令方块或者聊天栏中,执行即可。 74 | 75 | ### 再次编辑 76 | 77 | 辅助工具本身是不会持久化的,这意味着你在此界面看到的所有内容都会在退出存档之后消失。不过你只需要复制`总输入框`中的内容到其他什么地方(比如命令方块或者一个txt),下次打开游戏时复制回来,你会看到`复制`按钮短暂地变为了`解析`——抓紧点它!程序可能会有短暂的卡顿,辅助工具将尝试把您复制进来的命令还原为各个填写好了的子命令。 78 | 79 | > 这个解析过程并不特别智能,有可能会出现错误,所以您最好人工检查一遍。 80 | 81 | 随后,您就可以正常地修改各个子命令了。 82 | 83 | --- 84 | 85 | ## 元指令区 86 | 87 | 自`0.4`版本起,你可能会注意到在参数面板的底部增加了一个元指令区。你可以利用`+`和对应的`-`按钮,增加或删去相应的键值对。 88 | 89 | 要使用它很简单:在一对两个输入框中,左侧填写键,右侧填写值。Designer GUI会在你填写/更改键时,自动地改变值输入框的参数检测规则。 90 | 91 | 有关更多元指令的信息,请查看[元指令参数指南](meta)。 92 | 93 | --- 94 | 95 | ## 喷花筒 96 | 97 | 喷花筒模式可以帮助您制作一个能够喷出指定粒子的喷花筒物品. 98 | 99 | ### 编写粒子 100 | 101 | 粒子参数编辑的方法与参数模式基本相同。 102 | 103 | 你会注意到`X`、`Y`、`Z`被锁定在`~`,这是为了表示喷花筒喷出粒子的位置固定在玩家手持喷花筒头部(第一人称和第三人称可能略有不同)。 104 | 105 | 你也会注意到`Vx`、`Vy`、`Vz`消失不见,取而代之的是一个大的`V`输入框。喷花筒喷出的粒子始终会朝向玩家视线,而`V`则是一个速度系数,用于非精确地控制向这个方向喷出粒子的速度。 106 | 107 | 生成位置误差指和速度误差值仍然有效。 108 | 109 | ### 制作喷花筒 110 | 111 | 在完成编辑后,你只需要点击`制作喷花筒`,服务器会发放一个对应的喷花筒到你的物品栏中。请注意,制作喷花筒需要2级权限。 112 | 113 | ### 再次编辑 114 | 115 | 你可以把参数模式编写的指令复制到此处进行解析并制作喷花筒。 116 | 117 | 值得注意的是,在粘贴并解析之后,你需要轻击任意一个参数输入框来手动更新,以使程序为指令添加上`"tada":1`的标签。 118 | 119 | :::info 120 | 121 | 指令解析时,依靠元指令中`"tada":1`的标签来将粒子以喷花筒模式而不是常规模式发送至客户端。 122 | 123 | ::: 124 | -------------------------------------------------------------------------------- /docs/holojaneway/-2.2 性能问题.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: -2.2 3 | title: -2 性能问题 4 | description: 性能问题 5 | hide_table_of_contents: false 6 | sidebar_position: 72 7 | 8 | --- 9 | 10 | # 性能问题 11 | 12 | 啊,你终于看到了这里。优化,这个令无数开发者和玩家魂牵梦萦的问题,显然是不可能在这一篇小小的网页中讲完的——我也没有全部的知识。但不论怎么说,我在此尽力而为。 13 | 14 | ## 前言:开发与优化 15 | 16 | > "Make it work, make it right, make it fast." 17 | > 18 | > —— Kent Beck 19 | 20 | 如果你有专业学习过软件工程相关内容,那就不需要我多讲。不论你前期想到了之后可以做的多么绝妙的优化点子,也要把精力先集中在你的最初目标上。当然,这也是我自己惨痛的教训。 21 | 22 | ## 常见问题 23 | 24 | ### 不要把long封装的`BlockPos`作为哈希Key 25 | 26 | 只要接触Mod开发的时间稍长,你一定会发现`BlockPos`类有这几个方法: 27 | 28 | ```java 29 | public static final int PACKED_HORIZONTAL_LENGTH = 1 + Mth.log2(Mth.smallestEncompassingPowerOfTwo(30000000)); 30 | public static final int PACKED_Y_LENGTH = 64 - 2 * PACKED_HORIZONTAL_LENGTH; 31 | private static final long PACKED_X_MASK = (1L << PACKED_HORIZONTAL_LENGTH) - 1L; 32 | private static final long PACKED_Y_MASK = (1L << PACKED_Y_LENGTH) - 1L; 33 | private static final long PACKED_Z_MASK = (1L << PACKED_HORIZONTAL_LENGTH) - 1L; 34 | 35 | public static long asLong(int x, int y, int z) { 36 | long i = 0L; 37 | i |= (x & PACKED_X_MASK) << X_OFFSET; 38 | i |= (y & PACKED_Y_MASK) << 0; 39 | return i | (z & PACKED_Z_MASK) << Z_OFFSET; 40 | } 41 | 42 | public static int getX(long packedPos) { 43 | return (int)(packedPos << 64 - X_OFFSET - PACKED_HORIZONTAL_LENGTH >> 64 - PACKED_HORIZONTAL_LENGTH); 44 | } 45 | 46 | public static int getY(long packedPos) { 47 | return (int)(packedPos << 64 - PACKED_Y_LENGTH >> 64 - PACKED_Y_LENGTH); 48 | } 49 | 50 | public static int getZ(long packedPos) { 51 | return (int)(packedPos << 64 - Z_OFFSET - PACKED_HORIZONTAL_LENGTH >> 64 - PACKED_HORIZONTAL_LENGTH); 52 | } 53 | 54 | public static BlockPos of(long packedPos) { 55 | return new BlockPos(getX(packedPos), getY(packedPos), getZ(packedPos)); 56 | } 57 | ``` 58 | 59 | 嗯,把一个`BlockPos`直接封装进64bits的`long`,看起来优雅又美妙。你当然还会需要存一些东西,比如说用`HashMap`来缓存光照;然后你不禁就会想到,要是用这个和`BlockPos`一一对应的`long`,既可以减少内存占用,又可以有更快的`hashcode`和`equals`,岂不是一举两得? 60 | 61 | 很可惜并不是这样。用`long`作为哈希键很容易产生大量哈希冲突,而java的`HashMap`在处理哈希冲突时——多么经典的面试八股,现在终于有用了——如果冲突元素小于8,则使用链表串在一起;如果有更多,就用红黑树把这些冲突元素装起来。 62 | 63 | 我们可以做一个简单的试验: 64 | 65 | 1. 在X/Z ±1000、Y -64~320的范围内,随机取一个点; 66 | 2. 遍历这个点附近 X/Z ±25,Y ±10的范围内,所有50000个点; 67 | 3. 把各点坐标转换为`long`封装,对N=65536取余,收集结果。 68 | 69 | 结果由ChatGPT给出:一共只用到了65536中的320个桶;总冲突49680次;单桶大小约156.25,对于红黑树而言大约需要8次查询。 70 | 71 | 当然,`HashMap`对`long`还有额外的处理流程——重新计算hashcode、再扰动、最后取余。把这一点考虑上,我们重做试验:用到了17000\~32000个桶,平均约19000;总冲突约30000次;桶大小为2~4,平均2.53,看起来比简单取模好多了。 72 | 73 | 如果我们直接用`BlockPos`作为哈希键,其哈希函数将使用父类`Vec3i`的`hashcode`方法: 74 | 75 | ```java 76 | @Override 77 | public int hashCode() { 78 | return (this.getY() + this.getZ() * 31) * 31 + this.getX(); 79 | } 80 | ``` 81 | 82 | 在这种情况下,平均用到了约31950个桶;总冲突约18050次,桶平均大小为1.565. 83 | 84 | 如果我们再把`hashCode`改成`(Y + Z * 31) * 71 + X`的形式,这种情况下平均用到约38000个桶;总冲突约11000次;平均桶大小为1.313——只比理想情况慢三分之一。 85 | 86 | 汇总一下: 87 | 88 | | 哈希键和函数 | 使用桶 | 总冲突 | 平均桶大小 | 89 | | ---------------------------------- | ------ | ------ | ---------- | 90 | | `long`取余 | 320 | 49600 | 156.25 | 91 | | `long`考虑Java处理 | 19000 | 30000 | 2.53 | 92 | | BlockPos#hashCode | 31950 | 18050 | 1.565 | 93 | | BlockPos#hashcode 第二个常数改为71 | 38000 | 11000 | 1.313 | 94 | 95 | 显然,使用封装`long`作为哈希键会比使用`BlockPos`慢60%——这还只是平均情况。从一些开发者的反映来看,实际可能会有数倍的差异。 96 | -------------------------------------------------------------------------------- /docs/madparticle/madparticle辅助设计工具使用指南(一).md: -------------------------------------------------------------------------------- 1 | --- 2 | id: designer 3 | title: Designer GUI指南 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # Designer GUI指南 8 | 9 | 在这里,我将向您介绍`MadParticle Designer GUI`辅助设计工具的使用方法 10 | 11 | :::info 12 | 13 | 为保障GUI界面紧凑,以及防止字符显示重叠,英文界面使用了大量的缩写。为此,当在英文设定下打开Designer GUI时,一些输入框会有特定的Tooltip提示,而中文环境则不存在。 14 | 15 | `MadParticle Designer GUI`与[Modern UI](https://www.curseforge.com/minecraft/mc-mods/modern-ui)兼容良好。你可以借助其来改进使用体验。 16 | 17 | ::: 18 | 19 | --- 20 | 21 | ## 参数 22 | 23 | 参数模式是最为基础的Designer GUI模式,此模式旨在帮助您更直观清晰地(相对于一串五颜六色的字符来说)编写MP命令。 24 | 25 | ### 基础概念与操作 26 | 27 | 进入游戏后,默认按`alt+m`新建并打开辅助工具。`参数辅助`模式在一开始是被默认选择的。最上方的`总输入框`将展示最终的结果,点击`复制`即将`总输入框`的内容复制到剪贴板。左边的`命令串`选择栏以列表的形式展示所有的`子命令`。点击`新建`,您将看到右侧出现了一个`参数面板`,同时`命令串`选择栏也出现了一个被选中的名为`null`的`子命令`。`子命令`所显示的名称由其模仿的目标粒子自动地决定。 28 | 29 | :::tip 30 | 31 | - 如果你需要重新编写一条MP命令,而又懒得一个一个删掉`命令串`选择栏里面的`子命令`;或者遇到了一些意料之外的辅助工具错误: 32 | - 你可以按`esc`退出辅助工具、回到游戏世界中之后,默认按下`crtl+m`来初始化辅助工具。 33 | - 辅助工具默认使用`/mp`(即简化后的`快速mp指令执行`)。如果您需要使用`/madparticle`(即原版指令执行),请手动替换之。 34 | 35 | ::: 36 | 37 | 38 | 39 | ### 填写一个参数面板 40 | 41 | - 点击`目标粒子`,所有可选粒子会自动地出现在提示栏中。使用↑和↓来切换选中的提示,`tab`或`enter`来应用提示。多数粒子都是可被MP接受的,少数粒子,比如`minecraft:block`不可接受,会被显示为红色。 42 | 43 | :::tip 44 | 45 | 多数输入框都有自动检测功能,白色文字代表输入内容可以被接受,红色文字代表输入内容不可接受,灰色文字代表不可编辑。 46 | 47 | 一些输入框还有提示功能,可以帮助您补全部分内容。自动补全内容可能不适用于所有的情况,可能存在潜在的错误。 48 | 49 | ::: 50 | 51 | - 当你正确地填写一个粒子之后,辅助工具会随机的从该粒子所有可用材质中随机地选取一张,展示在右侧小区域内。如果右侧小区域显示紫黑方块或者没有显示任何图片,则说明该粒子没有使用通常的显示方式、或该粒子没有贴图、或出现了其他不兼容的情况。在这种情况下,我们非常不建议您使用这个粒子(除非您对它们非常熟悉)。 52 | 53 | :::tip 54 | 55 | 如果你想要查看其他的可用材质,单击`目标粒子`输入框(使输入框进行一次更新)即可。未发生变化则说明只有一张可用的材质。 56 | 57 | ::: 58 | 59 | - 当你填写一个可被接受的粒子之后,可以继续常规地填写下面参数以完成这条子命令。你也可以点击`尝试填写默认值`按钮,辅助工具会尝试在程序内部按默认参数生成对应的粒子并读取其参数,自动地填写空白的输入框。自动填写的内容会被自动地标记为蓝色,以提示您可能需要检查和修正。 60 | 61 | :::tip 62 | 63 | 自动填写的`重力`、`二次重力`、`初始大小`、`结束大小`很有可能不正确,需要特别注意。 64 | 65 | ::: 66 | 67 | ### 更多的参数面板 68 | 69 | 在完成一个参数面板之后,你可以继续新建更多的参数面板,从而创造一个粒子串命令。为便于寻找填写错误的参数,在`命令串`选择栏中,解析失败的子命令会被标为红色。辅助工具会自动异步地将各子命令连接起来,展示在最上方的`总输入框`中。 70 | 71 | ### 编写完成 72 | 73 | 完成编写之后,你只需要将`总输入框`中的内容复制到你想要的地方,比如命令方块或者聊天栏中,执行即可。 74 | 75 | ### 再次编辑 76 | 77 | 辅助工具本身是不会持久化的,这意味着你在此界面看到的所有内容都会在退出存档之后消失。不过你只需要复制`总输入框`中的内容到其他什么地方(比如命令方块或者一个txt),下次打开游戏时复制回来,你会看到`复制`按钮短暂地变为了`解析`——抓紧点它!程序可能会有短暂的卡顿,辅助工具将尝试把您复制进来的命令还原为各个填写好了的子命令。 78 | 79 | > 这个解析过程并不特别智能,有可能会出现错误,所以您最好人工检查一遍。 80 | 81 | 随后,您就可以正常地修改各个子命令了。 82 | 83 | --- 84 | 85 | ## 元指令区 86 | 87 | 自`0.4`版本起,你可能会注意到在参数面板的底部增加了一个元指令区。你可以利用`+`和对应的`-`按钮,增加或删去相应的键值对。 88 | 89 | 要使用它很简单:在一对两个输入框中,左侧填写键,右侧填写值。Designer GUI会在你填写/更改键时,自动地改变值输入框的参数检测规则。 90 | 91 | 有关更多元指令的信息,请查看[元指令参数指南](meta)。 92 | 93 | --- 94 | 95 | ## 喷花筒 96 | 97 | 喷花筒模式可以帮助您制作一个能够喷出指定粒子的喷花筒物品. 98 | 99 | ### 编写粒子 100 | 101 | 粒子参数编辑的方法与参数模式基本相同。 102 | 103 | 你会注意到`X`、`Y`、`Z`被锁定在`~`,这是为了表示喷花筒喷出粒子的位置固定在玩家手持喷花筒头部(第一人称和第三人称可能略有不同)。 104 | 105 | 你也会注意到`Vx`、`Vy`、`Vz`消失不见,取而代之的是一个大的`V`输入框。喷花筒喷出的粒子始终会朝向玩家视线,而`V`则是一个速度系数,用于非精确地控制向这个方向喷出粒子的速度。 106 | 107 | 生成位置误差指和速度误差值仍然有效。 108 | 109 | ### 制作喷花筒 110 | 111 | 在完成编辑后,你只需要点击`制作喷花筒`,服务器会发放一个对应的喷花筒到你的物品栏中。请注意,制作喷花筒需要2级权限。 112 | 113 | ### 再次编辑 114 | 115 | 你可以把参数模式编写的指令复制到此处进行解析并制作喷花筒。 116 | 117 | 值得注意的是,在粘贴并解析之后,你需要轻击任意一个参数输入框来手动更新,以使程序为指令添加上`"tada":1`的标签。 118 | 119 | :::info 120 | 121 | 指令解析时,依靠元指令中`"tada":1`的标签来将粒子以喷花筒模式而不是常规模式发送至客户端。 122 | 123 | ::: 124 | -------------------------------------------------------------------------------- /docs/r6ms/玩家游玩-对局.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: player_match 3 | title: 对局 4 | hide_table_of_contents: false 5 | 6 | --- 7 | 8 | # 对局 9 | 10 | export const Highlight2 = ({children,color}) => ( 11 | 18 | {children} 19 | 20 | ); 21 | 22 | 以下简要介绍基本游戏流程和其他知识。 23 | 24 | --- 25 | 26 | ## 游戏流程 27 | 28 | ### 各就位...... 29 | 30 | 要打开R6MS主菜单,点击暂停菜单最下方的`Play R6MS`按钮,或是在世界中按下`alt+6`。 31 | 32 | 在进入某个服务器第一次打开主菜单时,可能需要一段时间来加载数据。当你重新进入同一服务器时也是如此。 33 | 34 | 如果这是你第一次游玩,你可以先到设置界面调整你的操作偏好。 35 | 36 | :::info 37 | 38 | 如果你此前并未进入过接入了同步服务的服务器,同步服务会自动地为你新建一个账号,用于保存战绩信息和涂装数据。更多信息请查看[跨服务器数据服务](cross_server)。 39 | 40 | ::: 41 | 42 | 当你想要进行对战时,点击`多人游戏 进入快速对战`即可开始寻找对战,一个提示条将会出现在屏幕上方。在等待的过程中,你可以按下`esc`回到世界照常游玩。别担心,在对战开始之前,你的物品栏将会转交至异次元空间妥善保管,并在对战结束后将你传送回原处,把物品交还与你。 43 | 44 | :::info 45 | 46 | - 目前仅有快速对战可用。 47 | - 如果在对战结束后发现你所在的原处没有足够的空间,你将会被传送至世界出生点。 48 | 49 | ::: 50 | 51 | ### 预备... 52 | 53 | 一场对战至多有五个回合,五局三胜。每两个回合进行攻守轮换。每个回合由选取阶段、准备阶段、行动阶段组成。

54 | 55 | 在第一个防守方和第一个进攻方选取阶段开始之前,模组需要一段时间来加载俯视图。在俯视图加载完成之后,干员选取阶段倒计时才会开始。因此,每个玩家的选取阶段开始时刻可能有轻微的差异,但选取阶段持续时间都是恒定的。 56 | 57 | 在选取阶段,进攻方可以在几个出生点间自由选取,防守方炸弹点则由游戏随机选择。两方都需要在此期间准备自己的作战策略,不重复地选择自己的干员(新进干员则允许重复)。

58 | 59 | 考虑到玩家可能不熟悉有关内容,目前选取阶段可用时间为40秒,而不是原版R6S的30秒。

60 | 61 | :::info 62 | 63 | 如果区块加载情况很恶劣、或是服务器性能存在问题、或是其他怪问题导致俯视图加载一直未完成,俯视图加载过程将在一定时间后被强制继续。你可能会看到一张显示了错误地点或缺少区块的俯视图。 64 | 65 | 从你看到回合开始的场景屏幕开始,如果在约100秒之后仍有玩家未(向服务器报告)完成选取阶段,对战将会被终止。 66 | 67 | ::: 68 | 69 | ### 开始! 70 | 71 | 与原版R6S相同,准备阶段为45秒,行动阶段为3分钟。 72 | 73 | #### 准备阶段 74 | 75 | 在准备阶段的宝贵45秒内,进攻方的任务是操纵无人小车找到两个炸弹点,侦察防守方的干员选取和防守布置。防守方的任务是利用道具布置防守(也叫作“装修”),找到、拦截并击毁进攻方的无人小车,以使进攻方尽量迟地找到炸弹点。

76 | 77 | 由于显而易见的技术原因,准备阶段仍然有友军伤害;暂不支持进攻方改变干员选取。

78 | 79 | #### 行动阶段 80 | 81 | 行动阶段开始!在三分钟内使用你所有的武器和道具,尽你所能地获取回合胜利。

82 | 83 | 进攻方玩家将在所选出生点约7米范围内生成。如果没有选择出生点,服务器会为你随机选择一个。 84 | 85 | 防守方玩家将在AB炸弹点其中一个的约7米范围内生成。游戏将使用类似原版玩家出生点的逻辑尝试寻找合适的位置,若尝试一定次数之后无果,进攻方将会直接被生成在所选出生点的精确位置,防守方将会直接被生成在炸弹点(与炸弹重合)。 86 | 87 | 想要在回合中获取胜利,进攻方需要进入到装有炸弹的房间内安设拆弹器,防守方需要阻止进攻方或者破坏拆弹器。当然,把对面全打死也不是不行。

88 | 89 | 以下是更为详细的说明:

90 | 91 | - 在三分钟内、尚未安装拆弹器:有任一方全军覆没,则另一方取得胜利。

92 | - 三分钟时间到,尚未安装拆弹器:防守方胜利。

93 | - 三分钟时间到,正在安装拆弹器:回合将会短暂地延迟结束以允许完成安装。如果安装过程被打断,则回合立即结束,防守方胜利。

94 | - 已经安设拆弹器:回合将立即开始一个较短的新倒计时,防守方需要在这个时间之内找到并破坏拆弹器。如果进攻方已全军覆没,防守方依然需要找到找到拆弹器并破坏。如果防守方全军覆没,或是防守方未能在此时间之内完成破坏拆弹器,进攻方胜利。

95 | 96 | 由于显而易见的技术原因,暂不支持死亡回放与对战回放。也不支持缺员战斗和重连。如果有玩家中途弃赛,不论是主动或被迫,对战都将被立即终止。

97 | 98 | --- 99 | 100 | ## 数值 101 | 102 | 我们选择以R6S数值为参考,将其除以5来换算为模组中的数值,并在多数情况下采用四舍五入。 103 | 104 | 由于Minecraft本身特性,武器的TTK很有可能与R6S存在差异。切勿自信收枪。

105 | -------------------------------------------------------------------------------- /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 | // But you can create a sidebar manually 19 | holojaneway:[ 20 | 'holojaneway/-6', 21 | 'holojaneway/-5', 22 | 'holojaneway/-3', 23 | { 24 | type: 'category', 25 | label: '-2 杂项', 26 | link: {type: 'doc', id: 'holojaneway/-2'}, 27 | items: [ 28 | 'holojaneway/-2.1', 29 | 'holojaneway/-2.2' 30 | ], 31 | }, 32 | { 33 | type: 'category', 34 | label: '-1 附件', 35 | link: {type: 'doc', id: 'holojaneway/-1'}, 36 | items: ['holojaneway/-1.1'], 37 | }, 38 | 'holojaneway/-0', 39 | { 40 | type: 'category', 41 | label: '0 绪论', 42 | link: {type: 'doc', id: 'holojaneway/0'}, 43 | items: ['holojaneway/0.1', 'holojaneway/0.2',], 44 | }, 45 | 'holojaneway/1', 46 | 'holojaneway/2', 47 | { 48 | type: 'category', 49 | label: '3 方块实体', 50 | link: {type: 'doc', id: 'holojaneway/3'}, 51 | items: ['holojaneway/3.1',], 52 | }, 53 | 'holojaneway/4', 54 | 'holojaneway/5', 55 | 'holojaneway/6', 56 | 'holojaneway/7', 57 | 'holojaneway/8', 58 | 'holojaneway/9', 59 | 'holojaneway/∞', 60 | { 61 | type: 'category', 62 | label: 'i T88使用文档', 63 | link: {type: 'doc', id: 'holojaneway/i'}, 64 | items: [ 65 | 'holojaneway/1.1i', 66 | 'holojaneway/1.2i', 67 | 'holojaneway/1.3i', 68 | 'holojaneway/1.4i', 69 | 'holojaneway/1.5i', 70 | 'holojaneway/1.6i', 71 | 'holojaneway/1.7i' 72 | ], 73 | } 74 | ], 75 | madparticle:[ 76 | { 77 | type: 'category', 78 | label: 'Mad Particle指南', 79 | link: {type: 'doc', id: 'madparticle/home'}, 80 | items: [ 81 | 'madparticle/command', 82 | 'madparticle/meta', 83 | 'madparticle/designer', 84 | 'madparticle/config', 85 | 'madparticle/misc', 86 | 'madparticle/faq', 87 | 'madparticle/dev' 88 | ], 89 | }, 90 | /*{ 91 | type: 'category', 92 | label: 'Rawinbow6 Minesiege指南', 93 | link: {type: 'doc', id: 'r6ms/home'}, 94 | items: [ 95 | 'r6ms/faq', 96 | { 97 | type: 'category', 98 | label: '玩家游玩指南', 99 | link: {type: 'doc', id: 'r6ms/player'}, 100 | items: [ 101 | 'r6ms/player_match', 102 | 'r6ms/player_option' 103 | ], 104 | }, 105 | 'r6ms/op', 106 | 'r6ms/map', 107 | 'r6ms/cross_server', 108 | 'r6ms/anti_cheat', 109 | { 110 | type: 'category', 111 | label: 'Voyager', 112 | link: {type: 'doc', id: 'r6ms/voyager_home'}, 113 | items: [ 114 | 'r6ms/voyager_eula', 'r6ms/data_collect', 115 | ], 116 | }, 117 | { 118 | type: 'category', 119 | label: '更新日志', 120 | collapsed: true, 121 | items: [ 122 | 'r6ms/update_log/1.0.0' 123 | ], 124 | } 125 | ], 126 | },*/ 127 | { 128 | type: 'category', 129 | label: 'Tell Me Where指南', 130 | link: {type: 'doc', id: 'tellmewhere/home'}, 131 | items: [ 132 | 'tellmewhere/signblock' 133 | ], 134 | }, 135 | ], 136 | }; 137 | 138 | module.exports = sidebars; 139 | -------------------------------------------------------------------------------- /docs/r6ms/voyager_eula.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: voyager_eula 3 | title: 最终用户许可协议 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # Voyager最终用户许可协议 8 | 9 | 本Voyager最终用户许可协议包含您使用Voyager服务时所应遵守的条款与条件。 10 | 11 | 最近更新日期:2024年1月1日。 12 | 13 | ## 服务的适用 14 | 15 | 作为Minecraft游戏玩家,如果您下载并安装了《我的六号》模组,并使用一个拥有Minecraft: Java Edition的微软账户进入一个启用了Voyager服务的Minecraft多人游戏服务器;或作为Minecraft多人游戏服务器经营者,为您的服务器安装了《我的六号》模组,并启用了Voyager服务,则我们依据本协议授予您不可转让、不可再许可和有限的许可。 16 | 17 | 如果您是未成年人,并且难以理解这些条款和条件,请让您的父母或法定监护人解释这些条款和条件。 18 | 19 | ## 安全和隐私 20 | 21 | (一)我们将采取适当的管理、物理和技术措施帮助您保护在服务环境下存储的您的内容的安全性和保密性。我们不会主动访问您的内容,除非是为您提供必要的服务,或者为遵守法律法规或政府机关的约束性命令。 22 | 23 | (二)为了保护您的个人信息,我们遵守[Voyager个人与统计信息收集政策](data_collect)。 24 | 25 | ## 声明与保证 26 | 27 | 我们和您都声明合法有效地签署了本协议,具有相应的权力和授权。 28 | 29 | (一)您声明、保证并承诺: 30 | 31 | 1. 您应遵守与您在本协议项下的活动有关的所有适用法律和法规; 32 | 2. 您在使用服务时应遵守本协议; 33 | 3. 您对服务的使用不得侵犯任何第三方的权利。 34 | 35 | (二)我们将尽力做到但不就下述行为进行保证: 36 | 37 | 1. Voyager服务将无错误或不会中断; 38 | 2. 我们会修正与服务有关的所有缺陷或错误,或防止与本服务有关的所有第三方破坏或未经授权的访问; 39 | 40 | (三)在法律允许的范围内,除非另有明文规定,否则我们排除并明确拒绝任何保证、陈述、条款、条件或其他任何形式的承诺,无论是明示的或默示的,法定的或其他方式,包括但不限于任何针对适销性、质量满意度、非侵权性或特定用途适用性的保证、陈述、条款、条件或其他承诺。 41 | 42 | ## 您的权利和限制 43 | 44 | (一)您保留对您的账户内容的所有权。根据本协议,您授予我们托管、处理和传输您的内容以运行和提供服务的权利。 45 | 46 | 您的账户内容是指您在服务上传输、存储或处理的的所有数据。 47 | 48 | (二)您拥有的武器涂装是您的虚拟财产。 49 | 50 | - 如果因为我们的原因导致您通过有偿途径拥有的武器涂装丢失,在不能恢复的情况下,您有权要求我们退款; 51 | - 武器涂装不得转让。例外情况是在注销账户时,您可以同时要求我们将旧账户中的武器涂装转移至新账户,前提是新旧账户均为您所有; 52 | - 如果某个武器涂装有潜在或者现实的合规风险、侵犯第三方知识产权的风险或其他安全风险,我们有权不经事先通知地移除该武器涂装; 53 | - 我们有权对某个武器涂装对应的模型或材质进行不经事先通知的修改。 54 | 55 | ## 您不能做的事情 56 | 57 | 您不得有下列行为: 58 | 59 | 1. 违反[Minecraft最终用户许可协议](https://www.minecraft.net/en-us/eula)、[Minecraft使用指南](https://www.minecraft.net/en-us/usage-guidelines)、其他Mojang政策或Microsoft政策,违反任何地区、国家或国际上的法律法规及规定; 60 | 2. 侵犯或侵害他人权益,包括但不限于隐私权或知识产权,以及从事、鼓动、协助或允许他人进行任何违法、非法、侵权、有害或欺诈行为; 61 | 3. 攻击、干扰、扰乱或不利影响Voyager服务、硬件、软件、系统、网站或网络,包括但不限于使用大量自动化手段访问或攻击,以及违反或不利影响Voyager服务、硬件、软件、系统、网站或网络的安全性或完整性; 62 | 4. 未经授权访问Voyager服务、账户或系统的任何部分,或试图进行上述行为; 63 | 5. 干扰、劫持或修改《我的六号》模组与Voyager的网络通讯,从内存中尝试读取、修改或导出《我的六号》模组从Voayger获取到的信息; 64 | 6. 使用经过修改的模组文件或第三方程序间接或直接地访问Voyager,未经修改的模组文件以[CurseForge](https://www.curseforge.com/minecraft/mc-mods/rainbow6/files)上的版本为准; 65 | 7. 冒充我们或我们的工作人员,无论是出于何种目的。 66 | 67 | 作为玩家,您也不能: 68 | 69 | 1. 在多人游戏中使用作弊辅助工具、模组,或其他有害对战公平性的行为; 70 | 71 | 72 | 作为服务器经营者,您也不能: 73 | 74 | 1. 未经许可分发、传播或发送关于Voyager的电子邮件、群发电子邮件或其他消息、促销、广告或招揽; 75 | 2. 欺骗性地提供商品或服务,或任何含有虚假、欺骗或误导性陈述的广告、促销或其他材料; 76 | 3. 使用其他模组、插件等方法阻止特定玩家访问Voyager,包括但不限于为访问Voyager设置充值门槛,但踢出和封禁除外; 77 | 4. 恶意滥用反作弊功能,包括但不限于滥用监视工具、恶意为玩家添加作弊记录; 78 | 5. 未经许可干涉玩家在《我的六号》对局中的自然游戏过程,包括但不限于给予额外物品、添加状态效果、修改基础属性等 79 | 80 | 81 | 82 | ## 期限、暂停和终止 83 | 84 | (一)本协议自您第一次满足***服务的适用***一节所规定的条件起生效,并持续有效,除非满足下列体条件终止或暂停。 85 | 86 | (二)在下列情况下,我们可能会暂停您使用服务的权利: 87 | 88 | 1. 出于防止对您数据进行未授权访问的合理需要; 89 | 2. 您违反了***您不能做的事情***一节中的内容,或适用的法律法规; 90 | 3. 您违反了您的付款义务; 91 | 4. 您的访问和对服务的使用可能会对服务、我们或第三方造成安全风险; 92 | 5. 您的访问和使用服务可能会对服务的功能、可用性或操作产生不利影响; 93 | 6. 根据相关法律法规或政府机构的要求; 94 | 7. 您的访问和使用服务可能使我们、我们的关联方或分包商承担责任或监管合规风险; 95 | 8. 您可能侵犯第三方的知识产权; 96 | 9. 有合理理由相信存在欺诈行为; 97 | 98 | 当存在以上情况时,我们可能会视具体情况暂停您使用Voyager的权利3天、7天或更长。 99 | 100 | (三)您认可并同意如果以上描述的任何场景发生,且您或我们任一方严重违反本协议且/或在接到另一方通知后30天内未能修复违约行为,我们亦保留立即终止服务或本协议的权利,您在服务环节中存储的内容可能会被立即删除。 101 | 102 | ## 法律适用和不可抗力 103 | 104 | 本协议如果有与Minecraft最终用户许可协议、Minecraft使用指南、其他Mojang政策或Microsoft政策相冲突的,以后者为准。 105 | 106 | 本协议的订立、效力、解释、履行和争议的解决均适用中华人民共和国法律。 107 | 108 | 我们或您任一方均不对不能预见、不能避免且不可克服的事件引起的行为、事件、遗漏或者事故负责,包括但不限于自然灾害(包括地震、风暴或其他自然灾害)、恐怖主义行为、战争或类似战争的行为、内乱或暴乱、电气、网络或通信中断、封锁、禁运、火灾、洪水、爆炸或恶意的破坏、工厂或设备故障、或任何法律、政府命令、规则、规章、指令或行业标准的变化。双方将尽合理努力减轻不可抗力事件的影响。如果此类事件持续超过60天,任何一方均可在书面通知后取消未履行的服务和受影响的订单。本节不免除您在本协议下应履行的付款义务。 109 | 110 | ## 变更 111 | 112 | 本协议可能会进行变更。 113 | 114 | 我们会在本页面上发布对本协议所做的任何变更。对于重大变更,我们还会提供更为显著的通知。 115 | 116 | 您在条款修改生效后继续使用服务将被视为您接受修改后的条款。 117 | 118 | ## 联系我们 119 | 120 | 如果您有任何疑问、意见或建议,请通过页面最下方的KOOK链接,或发送邮件至voyager@uss-shenzhou.cn与我们联系。 121 | 122 | 如果您向我们提出任何与开展服务有关的反馈、建议、请求或意见,您认可并同意我们有权不受限制地使用客户建议,包括但不限于任何将使用客户建议和将客户建议纳入我们的服务以开发新功能或提高服务的性能、功能性或安全性的权利。 123 | 124 | 一般情况下,我们将在30天内回复。 125 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/杂项.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: misc 3 | title: 杂项 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 杂项 8 | 9 | 以下进行一些简短的讲解。 10 | 11 | --- 12 | 13 | ## 完全自定义粒子 14 | 15 | MadParticle提供另一个非常强大的功能,允许你自由且非常方便地为游戏添加新粒子。 16 | 17 | :::info 注意 18 | 19 | 添加的新粒子应该仅用于`/mp`或`/madparticle`指令的参数,而**不应该**将其用于`/particle`等处。将其用于其他地方是未定义行为。 20 | 21 | ::: 22 | 23 | 如果游戏内的各种粒子贴图无法满足你的需求,你可以通过这个功能添加你自己的粒子。 24 | 25 | 你只需要准备好粒子贴图,然后把它们放进游戏根目录的`customparticle`文件夹内,并遵循如下的命名规则: 26 | 27 | - 如果这个粒子只有一张贴图(即不随着年龄变化,或是在生成时没有随机变化): 28 | - 你只需要将其命名为`<粒子名称>.png`。例如`leaves.png`。 29 | - 如果这个粒子有多张贴图: 30 | - 你需要从0开始,依次将其命名为`<粒子名称>#<序号>.png`,例如`smoke#0.png`,`smoke#1.png`。 31 | - 生成的粒子默认命名空间为`madparticle`。如果你想自定义命名空间: 32 | - 请在文件名前面加上`<命名空间>~`,例如`nocaet~leaves.png`,`test~smoke#1.png`。 33 | 34 | :::danger 注意 35 | 36 | 请严格按照命名规则填写文件名。 37 | 38 | ::: 39 | 40 | 如果你的命名有误,日志中可能会有相应的提醒,以便于找到具体对应的文件。 41 | 42 | 启动游戏,你应该就能看到新粒子了! 43 | 44 | :::caution 45 | 46 | - 过多的`.png`文件可能会导致游戏加载缓慢。懒得优化,只有等。 47 | - 目前暂时没有与服务端同步图片的功能。在多人游戏中使用自定义粒子是未定义行为。 48 | 49 | ::: 50 | 51 | --- 52 | 53 | ## 在Fabric中使用MadParticle 54 | 55 | MadParticle提供Fabric版本,但有且只有核心功能:解析命令并生成粒子,不提供GUI辅助工具。 56 | 57 | 当然,我并不推荐在Fabric版本中徒手编写如此长的命令,所以在一般情况下有几种方案: 58 | 59 | - 你可以先使用Forge版本完成地图有关MP部分的制作,再将其复制到Fabric版本中。 60 | - 作为一个变通,你也可以用WorldEdit的schme来转移编写好的命令方块。 61 | - 当然,你可以同时打开Forge和Fabric客户端,在Forge版本的Designer GUI中编写好命令,复制到Fabric版本中。 62 | 63 | :::tip 64 | 65 | 请关注Fabric/Forge两端版本更新可能导致的命令参数变化。 66 | 67 | ::: 68 | 69 | 很有可能你需要用到的某个粒子由某个Mod提供,而这个Mod仅在Forge端提供——这正是发明完全自定义粒子的初衷。 70 | 71 | :::caution 72 | 73 | 在复制某个mod的资产时,请注意其许可证是否允许你这样做。 74 | 75 | ::: 76 | 77 | 你只需要在拷贝存档前,将需要的粒子图片文件复制到Fabric端的`customparticle`文件夹内,并按上述的规则指定命名空间即可。 78 | 79 | --- 80 | 81 | ## 在服务器中使用MadParticle 82 | 83 | 我了解您作为服主或管理员对服务器性能的担忧。 84 | 85 | 在MadParticle Forge 0.2.0(Fabric 0.1.0)版本之后,对`/madparticle`和`/mp`命令的解析均以异步方式执行,这在多数情况下减少了对主线程的干扰。但如果您的服务器只有1个核心,那可能会存在一些极其轻微的负面影响。 86 | 87 | ### /madparticle性能测试 88 | 89 | 在接下来的性能测试中,我们使用这条命令作为测试例。其含有2个子粒子,适合用来代表一般情况: 90 | 91 | ``` 92 | madparticle minecraft:crit RANDOM 30 FALSE 1 ~ ~1 ~ 0.0 0.0 0.0 0.0 0.45 0.0 0.05 0.05 0.05 FALSE 0 0 0 0.97 0.97 0.15 0.15 0 0 0 0 0.0 TRUE 0 0 PARTICLE_SHEET_TRANSLUCENT 0.996 0.801 0.318 1.0 1.0 1 LINEAR 1 1 LINEAR @a expireThen minecraft:cloud RANDOM 40 FALSE 1 = = = 0.0 0.0 0.0 0.0 0.0 0.0 0.08 0.0 0.08 FALSE 0 0 0 0.97 0.97 0.0 0.0 0 0 0 0 0.0 TRUE 0 0 PARTICLE_SHEET_TRANSLUCENT 0.996 0.733 0.216 1.0 1 0.6 LINEAR 1 1 LINEAR @a expireThen minecraft:cloud RANDOM 20 FALSE 1 = = = 0.0 0.0 0.0 = = = 0.0 0.0 0.0 FALSE 0 0 0 0.96 0.96 0.0 0.0 0 0 0 0 0.0 TRUE 0 0 PARTICLE_SHEET_TRANSLUCENT 0.996 0.860 0.725 1.0 1.0 1 LINEAR 1 1 LINEAR @a 93 | ``` 94 | 95 | 其效果如下图: 96 | 97 | madparticle 98 | 99 | 80个循环型命令方块工作引起的额外mspt消耗约为13ms,平均每个循环型命令方块的mspt消耗为0.1625ms。 100 | 101 | ### /mp性能测试 102 | 103 | `/mp`使用经过简化的指令执行步骤,跳过了常规的指令解析工作。 104 | 105 | 使用同样的命令,80个循环型命令方块工作引起的额外mspt消耗约为4.5ms,平均每个循环型命令方块的mspt消耗为0.05625ms,是`/madparticle`消耗的约三分之一。 106 | 107 | :::caution 108 | 109 | 以上性能测试数据仅供参考。使用的服务端为开发环境下的Forge原生服务端。CPU为AMD Ryzen 7 5800X,频率4.65GHz,内存频率3200MHz。在不同的服务器环境下,具体的mspt消耗可能有所不同。 110 | 111 | ::: 112 | 113 | :::info 114 | 115 | 不论是`/mp`还是`/madparticle`,解析时消耗的内存可能较大。我们未来会进行优化。 116 | 117 | ::: 118 | 119 | ### 减少mspt消耗 120 | 121 | 最简单的办法是让服务器玩家使用红石时钟控制的脉冲型命令方块,在不必要时减少命令的执行。 122 | 123 | 如果您使用的是Forge版本的MadParticle,我推荐一同使用由TeaCon组委会制作的[PowerTool](https://github.com/teaconmc/PowerTool),其中的`周期循环命令方块儿`能够比红石时钟更加方便地控制命令循环。 124 | 125 | :::info 126 | 127 | 众所周知,短时间内执行大量指令可能会对网络线程造成极大挑战;不过单指令内的粒子数量值大小则不会对服务器产生影响。 128 | 129 | ::: 130 | 131 | --- 132 | 133 | ## 在ReplayMod中使用MadParticle 134 | 135 | 由于ReplayMod的录制原理是记录所有发生的事情并将其重复,即不会记录粒子的位置而是重新生成,故你可能需要特别注意: 136 | 137 | - 如果存在大量的运动粒子,你可能需要在渲染前提高码率。 138 | - 在录制时为正片素材留下足够的预备时间,这个时间的长度一般由你的粒子具体作用、生成频率、存活时间、运动距离决定。 139 | - 在渲染前,关闭快速模式,从预留时间处开始播放至接近第一个时间关键帧,然后启动渲染。其目的是避免重新生成世界导致已经出现的粒子消失。 140 | - 如果你的指令中有随机因素(比如生成坐标误差不为0),replay中的粒子对应的因素会与录制时不同,每次重新replay也不同。 141 | 142 | --- 143 | 144 | ## 在光影包中使用MadParticle 145 | 146 | 由于粒子在视觉效果占比的增加,一些问题需要额外注意: 147 | 148 | - 光影包对半透明粒子的处理很有可能不正确或不符合预期。 149 | - 尤其是在即时录制时:如果你的游戏帧率不太高,建议关闭TAA。TAA在低帧率下导致的拖影会在粒子这种与背景区别较大的物体上尤其明显。这是由TAA的原理决定的。 150 | -------------------------------------------------------------------------------- /docs/madparticle/杂项.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: misc 3 | title: 杂项 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 杂项 8 | 9 | 以下进行一些简短的讲解。 10 | 11 | --- 12 | 13 | ## 完全自定义粒子 14 | 15 | MadParticle提供另一个非常强大的功能,允许你自由且非常方便地为游戏添加新粒子。 16 | 17 | :::info 注意 18 | 19 | 添加的新粒子应该仅用于`/mp`或`/madparticle`指令的参数,而**不应该**将其用于`/particle`等处。将其用于其他地方是未定义行为。 20 | 21 | ::: 22 | 23 | 如果游戏内的各种粒子贴图无法满足你的需求,你可以通过这个功能添加你自己的粒子。 24 | 25 | 你只需要准备好粒子贴图,然后把它们放进游戏根目录的`customparticle`文件夹内,并遵循如下的命名规则: 26 | 27 | - 如果这个粒子只有一张贴图(即不随着年龄变化,或是在生成时没有随机变化): 28 | - 你只需要将其命名为`<粒子名称>.png`。例如`leaves.png`。 29 | - 如果这个粒子有多张贴图: 30 | - 你需要从0开始,依次将其命名为`<粒子名称>#<序号>.png`,例如`smoke#0.png`,`smoke#1.png`。 31 | - 生成的粒子默认命名空间为`madparticle`。如果你想自定义命名空间: 32 | - 请在文件名前面加上`<命名空间>~`,例如`nocaet~leaves.png`,`test~smoke#1.png`。 33 | 34 | :::danger 注意 35 | 36 | 请严格按照命名规则填写文件名。 37 | 38 | ::: 39 | 40 | 如果你的命名有误,日志中可能会有相应的提醒,以便于找到具体对应的文件。 41 | 42 | 启动游戏,你应该就能看到新粒子了! 43 | 44 | :::caution 45 | 46 | - 过多的`.png`文件可能会导致游戏加载缓慢。懒得优化,只有等。 47 | - 目前暂时没有与服务端同步图片的功能。在多人游戏中使用自定义粒子是未定义行为。 48 | 49 | ::: 50 | 51 | --- 52 | 53 | ## 在Fabric中使用MadParticle 54 | 55 | MadParticle提供Fabric版本,但有且只有核心功能:解析命令并生成粒子,不提供GUI辅助工具。 56 | 57 | 当然,我并不推荐在Fabric版本中徒手编写如此长的命令,所以在一般情况下有几种方案: 58 | 59 | - 你可以先使用Forge版本完成地图有关MP部分的制作,再将其复制到Fabric版本中。 60 | - 作为一个变通,你也可以用WorldEdit的schme来转移编写好的命令方块。 61 | - 当然,你可以同时打开Forge和Fabric客户端,在Forge版本的Designer GUI中编写好命令,复制到Fabric版本中。 62 | 63 | :::tip 64 | 65 | 请关注Fabric/Forge两端版本更新可能导致的命令参数变化。 66 | 67 | ::: 68 | 69 | 很有可能你需要用到的某个粒子由某个Mod提供,而这个Mod仅在Forge端提供——这正是发明完全自定义粒子的初衷。 70 | 71 | :::caution 72 | 73 | 在复制某个mod的资产时,请注意其许可证是否允许你这样做。 74 | 75 | ::: 76 | 77 | 你只需要在拷贝存档前,将需要的粒子图片文件复制到Fabric端的`customparticle`文件夹内,并按上述的规则指定命名空间即可。 78 | 79 | --- 80 | 81 | ## 在服务器中使用MadParticle 82 | 83 | 我了解您作为服主或管理员对服务器性能的担忧。 84 | 85 | 在MadParticle Forge 0.2.0(Fabric 0.1.0)版本之后,对`/madparticle`和`/mp`命令的解析均以异步方式执行,这在多数情况下减少了对主线程的干扰。但如果您的服务器只有1个核心,那可能会存在一些极其轻微的负面影响。 86 | 87 | ### /madparticle性能测试 88 | 89 | 在接下来的性能测试中,我们使用这条命令作为测试例。其含有2个子粒子,适合用来代表一般情况: 90 | 91 | ``` 92 | madparticle minecraft:crit RANDOM 30 FALSE 1 ~ ~1 ~ 0.0 0.0 0.0 0.0 0.45 0.0 0.05 0.05 0.05 FALSE 0 0 0 0.97 0.97 0.15 0.15 0 0 0 0 0.0 TRUE 0 0 PARTICLE_SHEET_TRANSLUCENT 0.996 0.801 0.318 1.0 1.0 1 LINEAR 1 1 LINEAR @a expireThen minecraft:cloud RANDOM 40 FALSE 1 = = = 0.0 0.0 0.0 0.0 0.0 0.0 0.08 0.0 0.08 FALSE 0 0 0 0.97 0.97 0.0 0.0 0 0 0 0 0.0 TRUE 0 0 PARTICLE_SHEET_TRANSLUCENT 0.996 0.733 0.216 1.0 1 0.6 LINEAR 1 1 LINEAR @a expireThen minecraft:cloud RANDOM 20 FALSE 1 = = = 0.0 0.0 0.0 = = = 0.0 0.0 0.0 FALSE 0 0 0 0.96 0.96 0.0 0.0 0 0 0 0 0.0 TRUE 0 0 PARTICLE_SHEET_TRANSLUCENT 0.996 0.860 0.725 1.0 1.0 1 LINEAR 1 1 LINEAR @a 93 | ``` 94 | 95 | 其效果如下图: 96 | 97 | madparticle 98 | 99 | 80个循环型命令方块工作引起的额外mspt消耗约为13ms,平均每个循环型命令方块的mspt消耗为0.1625ms。 100 | 101 | ### /mp性能测试 102 | 103 | `/mp`使用经过简化的指令执行步骤,跳过了常规的指令解析工作。 104 | 105 | 使用同样的命令,80个循环型命令方块工作引起的额外mspt消耗约为4.5ms,平均每个循环型命令方块的mspt消耗为0.05625ms,是`/madparticle`消耗的约三分之一。 106 | 107 | :::caution 108 | 109 | 以上性能测试数据仅供参考。使用的服务端为开发环境下的Forge原生服务端。CPU为AMD Ryzen 7 5800X,频率4.65GHz,内存频率3200MHz。在不同的服务器环境下,具体的mspt消耗可能有所不同。 110 | 111 | ::: 112 | 113 | :::info 114 | 115 | 不论是`/mp`还是`/madparticle`,解析时消耗的内存可能较大。我们未来会进行优化。 116 | 117 | ::: 118 | 119 | ### 减少mspt消耗 120 | 121 | 最简单的办法是让服务器玩家使用红石时钟控制的脉冲型命令方块,在不必要时减少命令的执行。 122 | 123 | 如果您使用的是Forge版本的MadParticle,我推荐一同使用由TeaCon组委会制作的[PowerTool](https://github.com/teaconmc/PowerTool),其中的`周期循环命令方块儿`能够比红石时钟更加方便地控制命令循环。 124 | 125 | :::info 126 | 127 | 众所周知,短时间内执行大量指令可能会对网络线程造成极大挑战;不过单指令内的粒子数量值大小则不会对服务器产生影响。 128 | 129 | ::: 130 | 131 | --- 132 | 133 | ## 在ReplayMod中使用MadParticle 134 | 135 | 由于ReplayMod的录制原理是记录所有发生的事情并将其重复,即不会记录粒子的位置而是重新生成,故你可能需要特别注意: 136 | 137 | - 如果存在大量的运动粒子,你可能需要在渲染前提高码率。 138 | - 在录制时为正片素材留下足够的预备时间,这个时间的长度一般由你的粒子具体作用、生成频率、存活时间、运动距离决定。 139 | - 在渲染前,关闭快速模式,从预留时间处开始播放至接近第一个时间关键帧,然后启动渲染。其目的是避免重新生成世界导致已经出现的粒子消失。 140 | - 如果你的指令中有随机因素(比如生成坐标误差不为0),replay中的粒子对应的因素会与录制时不同,每次重新replay也不同。 141 | 142 | --- 143 | 144 | ## 在光影包中使用MadParticle 145 | 146 | 由于粒子在视觉效果占比的增加,一些问题需要额外注意: 147 | 148 | - 光影包对半透明粒子的处理很有可能不正确或不符合预期。 149 | - 尤其是在即时录制时:如果你的游戏帧率不太高,建议关闭TAA。TAA在低帧率下导致的拖影会在粒子这种与背景区别较大的物体上尤其明显。这是由TAA的原理决定的。 150 | -------------------------------------------------------------------------------- /docs/tellmewhere/signblock.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: signblock 3 | title: 指示牌方块 4 | description: 指示牌方块 5 | hide_table_of_contents: false 6 | 7 | 8 | --- 9 | 10 | 11 | 12 | # 指示牌方块 13 | 14 | :::tip 15 | 16 | 只有指示牌中的纯文字部分使用动态渲染(BER),其余图片、背景、壳体均采用`ChunkBuffer`进行高效渲染。你可以想放多少指示牌就放多少。 17 | 18 | ::: 19 | 20 | ## 使用 21 | 22 | :::info 23 | 24 | 我们事先约定,将指示牌放置于世界中,面向放置者、有黑色背景的一面为**正面**。东西方向(或是南北方向)是**平行**的。 25 | 26 | ::: 27 | 28 | 放下指示牌后,右键单击指示牌正面即可打开指示牌编辑界面。 29 | 30 | :::info 31 | 32 | ### 指示牌编辑界面 33 | 34 | 右侧为标志选取区域,左上侧为主编辑区,左下侧为国际化编辑区。 35 | 36 | 单击你想要的标志,即可在光标所在处插入图像代码,同时在上方显示预览。 37 | 38 | **编辑完成后,别忘了点击*完成* !** 39 | 40 | ::: 41 | 42 | 手持完整方块(对应的物品)右击指示牌侧面或背面可以为指示牌设置外观。应用外观时会使用手持方块的默认`BlockState`。 43 | 44 | 在现有指示牌的侧面放下平行的同一种指示牌,显示区域会自动连接。在这情况下,显示的内容由最左侧(面向显示区域)的指示牌决定。当正面右击这一排指示牌中的任意一个时,总是会打开最左侧指示牌的编辑界面。 45 | 46 | :::tip 47 | 48 | 你可以在放下一排指示牌后,绕到后方重新放置最左侧的指示牌,这样就可以有一个双面指示牌了! 49 | 50 | ::: 51 | 52 | ## 选取 53 | 54 | GMT提供形态各异的各种指示牌变体。 55 | 56 | 最基础的指示牌是`挂式 薄`指示牌,拥有8像素(在x16材质下)的屏幕宽度,适用于各种场合。 57 | 58 | 如果你想提高指示牌的可用距离,或是显示一些特别重要的内容,你可以选择`宽`变体,拥有14像素的屏幕宽度,或许不够美观但足够醒目。 59 | 60 | `窄`变体只有4像素的屏幕宽度,建议仅作为导流带,或是狭小空间近距离指示用。 61 | 62 | ## 内容 63 | 64 | ### 排列 65 | 66 | 需要时在同一块指示牌上表表示不同方向的内容时,内容排列应遵循以下原则: 67 | 68 | 1. 指示方向的标志应当放置在实际方向的对应处。以左侧为例,各方向的优先级为: 69 | 70 |
81 |
84 | madparticle 85 | madparticle 86 | madparticle 87 | madparticle 88 | madparticle 89 | madparticle 90 | madparticle 91 | madparticle 92 |
93 |
94 |

95 | 96 | 2. 指示方向的标志应当放置在对应内容的外侧,如指南开头所示。 97 | 3. 提示标志应放在文字左侧: 98 | 99 |
110 |
114 | madparticle 115 | madparticle 116 | 国内出发 117 |
118 |
121 | madparticle 122 | 国内到达 123 | madparticle 124 |
125 |
126 | 127 | 128 | 129 |

130 | 131 | 4. 不同方向的对应内容相邻排列时,应当在两组内容之间以(多个)空格、分隔线或其他适当方式分开。 132 | 133 | 134 | 135 | 为保证可读性,指示牌内容不支持换行。 136 | 137 | ### 彩色文字 138 | 139 | 像其他游戏内文本一样,你可以使用格式化代码`§`来控制文字的形态和颜色。 140 | 141 | 除非用于指示线路,彩色文字的使用应当尽量少。一般情况下,在已经使用了彩色标志的情况下,不建议使用彩色文字。 142 | 143 | ### 布局 144 | 145 | 指示牌内容自动居中。 146 | 147 | ### 缩放 148 | 149 | GMT有一定的自适应缩放。当内容长度短于指示牌长度时,不会进行任何缩放。 150 | 151 | 当内容长度长于指示牌长度时,GMT将会按照以下顺序尝试缩放内容以避免溢出: 152 | 153 | 1. 仅压缩文字宽度。标志的大小不会发生变化,而文字宽度会被逐渐压缩直至特定倍数。 154 | 若游戏语言为中文,这个阈值倍数为0.7;对于其他语言,这个阈值倍数为0.6。 155 | 2. 整体缩小至不发生溢出为止。 156 | 157 | -------------------------------------------------------------------------------- /docs/holojaneway/1.2i 网络包部分.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 1.2i 3 | title: 1.2i 网络包 4 | description: T88使用文档-网络包 5 | hide_table_of_contents: false 6 | 7 | 8 | --- 9 | 10 | # 网络包注解处理器 11 | 12 | 基础的使用介绍参考[网络包](5)一节。 13 | 14 | 15 | 16 | ## ClientHandler 17 | 18 | 在1.21.7之前,你可能习惯于直接在网络包的`clientHandler`方法里调用仅客户端的类,然后在方法上加`OnlyIn`。显然这个方法在新版本已经不适用,为了方便你的编写,T88提供一个简单的编译器插件,能够在编译时自动把`clientHandler`方法体用`Runnable`包起来以实现延迟加载。 19 | 20 | 为了使用这个插件,除去常规的导入之外: 21 | 22 | ```groovy 23 | dependencies { 24 | implementation "net.neoforged:neoforge:${neo_version}" 25 | 26 | implementation("cn.ussshenzhou:t88:0.+") 27 | annotationProcessor("cn.ussshenzhou:t88:0.+") 28 | } 29 | ``` 30 | 31 | 还需要在你的`build.gradle`里加上这么一段: 32 | 33 | ```groovy 34 | tasks.withType(JavaCompile).configureEach { 35 | options.fork = true 36 | options.forkOptions.jvmArgs += [ 37 | '--add-exports', 'jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED', 38 | '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', 39 | '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', 40 | '--add-exports', 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', 41 | ] 42 | options.compilerArgs += ['-Xplugin:T88ClientHandlerWrapper'] 43 | } 44 | ``` 45 | 46 | 然后重新编译项目,对比源代码的从字节码反编译的结果: 47 | 48 | ```java 49 | @ClientHandler 50 | public void clientHandler(IPayloadContext context) { 51 | Level level = Minecraft.getInstance().level; 52 | if (level != null) { 53 | Random r = new Random(); 54 | var player = Minecraft.getInstance().level.getPlayerByUUID(sourcePlayerUUID); 55 | if (player == null) { 56 | return; 57 | } 58 | var posOffset = getNozzlePosInWorld(player, 4, 0); 59 | var speed = getSpeedVec(player); 60 | for (int i = 0; i < particleOption.amount(); i++) { 61 | level.addParticle( 62 | particleOption, 63 | true, 64 | particleOption.alwaysRender().get(), 65 | posOffset.x + MathHelper.signedRandom(r) * particleOption.xDiffuse(), 66 | posOffset.y + MathHelper.signedRandom(r) * particleOption.yDiffuse(), 67 | posOffset.z + MathHelper.signedRandom(r) * particleOption.zDiffuse(), 68 | speed.x + MathHelper.signedRandom(r) * particleOption.vxDiffuse(), 69 | speed.y + MathHelper.signedRandom(r) * particleOption.vyDiffuse(), 70 | speed.z + MathHelper.signedRandom(r) * particleOption.vzDiffuse() 71 | ); 72 | } 73 | } 74 | } 75 | ``` 76 | 77 | ```java 78 | public void clientHandler(IPayloadContext context) { 79 | Runnable wrapped = new Runnable() { 80 | public void run() { 81 | Level level = Minecraft.getInstance().level; 82 | if (level != null) { 83 | Random r = new Random(); 84 | Player player = Minecraft.getInstance().level.getPlayerByUUID(MadParticleTadaPacket.this.sourcePlayerUUID); 85 | if (player == null) { 86 | return; 87 | } 88 | 89 | Vec3 posOffset = MadParticleTadaPacket.this.getNozzlePosInWorld(player, 4.0F, 0.0F); 90 | Vec3 speed = MadParticleTadaPacket.this.getSpeedVec(player); 91 | 92 | for(int i = 0; i < MadParticleTadaPacket.this.particleOption.amount(); ++i) { 93 | level.addParticle(MadParticleTadaPacket.this.particleOption, true, MadParticleTadaPacket.this.particleOption.alwaysRender().get(), posOffset.x + MathHelper.signedRandom(r) * (double)MadParticleTadaPacket.this.particleOption.xDiffuse(), posOffset.y + MathHelper.signedRandom(r) * (double)MadParticleTadaPacket.this.particleOption.yDiffuse(), posOffset.z + MathHelper.signedRandom(r) * (double)MadParticleTadaPacket.this.particleOption.zDiffuse(), speed.x + MathHelper.signedRandom(r) * (double)MadParticleTadaPacket.this.particleOption.vxDiffuse(), speed.y + MathHelper.signedRandom(r) * (double)MadParticleTadaPacket.this.particleOption.vyDiffuse(), speed.z + MathHelper.signedRandom(r) * (double)MadParticleTadaPacket.this.particleOption.vzDiffuse()); 94 | } 95 | } 96 | 97 | } 98 | }; 99 | wrapped.run(); 100 | } 101 | ``` 102 | 103 | :::tip 104 | 105 | 在此过程中,`T88ClientHandlerWrapper`会自动地将`this`和`super`转换成`OuterClass.this`和`OuterClass.super`,但需要注意的是,T88并不会主动处理匿名内部类方法要求参数均为effective final的特性,effective final依靠方法体内实现自行保证。 106 | 107 | ::: 108 | -------------------------------------------------------------------------------- /docs/r6ms/home.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: home 3 | title: R6MS 主页 4 | hide_table_of_contents: false 5 | sidebar_position: 100 6 | slug: /r6ms 7 | 8 | --- 9 | import React from 'react'; 10 | 11 | # Rainbow6: Minesiege 指南 12 | 13 | 14 | 欢迎查看R6MS指南! 15 | 16 | export const Banner = ({children}) => ( 17 |
27 | {children} 28 |
29 | ); 30 | 31 | 32 | 准备好在TeaCon 2024中游玩预览版本,
33 | 并获得L85A2 TeaCon2024独特涂装! 34 |
35 | 36 |

37 | 38 |
48 | 49 | 注意安全!
50 | 我们不会主动要求您为游戏内容支付任何费用。
51 | 我们不会主动要求您提供Minecraft账户的密码。 52 | 53 |
54 | 55 | --- 56 | 57 | ## 介绍 58 | 59 | ### 关于《我的六号》 60 | 61 | *Rainbow6: Minesiege*(简称*R6MS*,中文名 *《我的六号》*)模组受2020年偶然观看的一次游戏直播启发,目的是希望探索出一种合理而有趣的方式来解决《彩虹六号:围攻》在中国大陆境内不允许直播的问题。 62 | 63 | 现在,经过两次重写,R6MS来到了第三个版本。在这四年的时间里,我们极大地提高了模组开发的有关技能,结合对*Rainbow6: siege *以及*Minercaft* 的热爱,我们有相当良好的预期来完成预定的目标。 64 | 65 | 我们希望在这个版本能够使玩家取得较为完整的体验,同时在设计上于原版MC风格和R6S风格之中取得平衡。 66 | 67 | Voyager是一个与R6MS配套的全新数据同步系统。我们强烈建议你阅读[Voyager的有关介绍](r6ms/voyager_home)。 73 |

74 | 75 | R6MS在客户端和服务端都需要[T88](https://www.curseforge.com/minecraft/mc-mods/t88)作为前置。你通常可以直接下载最新版,也可以在各版本更新日志中找到推荐的T88版本。 76 | 77 | 78 | ### 关于本指南 79 | 80 | :::info 81 | 82 | 你可以在左侧侧边栏查看你感兴趣的内容,在各个页面右侧查看分节。 83 | 84 | 由于指南按面向的阅读对象分节,某些内容可能需要跳转以获取完整信息。 85 | 86 | ::: 87 | 88 | **你需要先查看[常见问题解答](r6ms/faq),然后了解[跨服务器数据服务](r6ms/cross_server)。** 89 | 90 | - 如果你是一名玩家,你需要阅读[玩家游玩指南](r6ms/player)及其子章节。 91 | - 如果你是服务器管理员或服主,你还需要阅读[服务器管理员指南](r6ms/op)。 92 | - 如果你还想为你的服务器增加可供对战的地图,请阅读[地图制作指南](r6ms/map)。 93 | - 有关反作弊的内容已被统一移至[反作弊](r6ms/anti_cheat)。 94 | 95 | **指南内容随着模组规划与开发而更新,故请注意其中可能含有未发布的模组内容。** 96 | 97 | 如果有任何疑问或建议,你可以在页面最下方找到我们的KOOK服务器地址。 98 | 99 | --- 100 | 101 | ## 版权和许可信息(《我的六号》) 102 | 103 | 关于《我的六号》模组版权的完整及最新文本可以在[GitHub仓库](https://github.com/USS-Shenzhou/MC-R6mod)找到。 104 | 105 | **以下仅是为方便起见的复制版本,以项目README文件为准。** 106 | 107 |
113 | 114 | ### 本模组许可证 115 | 116 | 本模组使用双许可证。 117 | 118 | - 对位于`/resources/`下的模型、图片、声音等美术资源文件,我们以CC BY-NC-SA 4.0许可证进行授权; 119 | - 对以代码为主的其余文件,我们以GPLv3许可证进行授权。 120 | 121 | #### 美术资源 122 | 123 | [![知识共享许可协议](https://camo.githubusercontent.com/f05d4039b67688cfdf339d2a445ad686a60551f9891734c418f7096184de5fac/68747470733a2f2f692e6372656174697665636f6d6d6f6e732e6f72672f6c2f62792d6e632d73612f342e302f38387833312e706e67)](http://creativecommons.org/licenses/by-nc-sa/4.0/) 124 | 125 | 本模组的美术资源文件采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-sa/4.0/)进行许可。 126 | 127 | **额外许可** 128 | 129 | - a) 以下的“使用”指的是玩家在Minecraft多人游戏服务器内游玩时获取、与之互动、展示、渲染或播放对应的物品、实体或音效;也包括将前述过程录制为图片或视频,并以公开渠道展示。 130 | - b) 如果你是Minecraft多人游戏服务器所有者,不论你的服务器是盈利还是非盈利性质的,也不论你的服务器是否接入了*Voyager*,本许可证授予你的服务器使用默认武器涂装所对应的模型和图片文件、以及声音文件等通用的美术资源的权利。 131 | - c) 如果你是Minecraft多人游戏服务器所有者,且你的服务器接入了*Voyager*,在向开发者支付事先约定的费用的前提下(如果存在),本许可证授予你的服务器在公开渠道售卖模组提供的指定武器涂装的权利,也授予你的服务器使用玩家拥有的武器涂装所对应的模型和图片文件的权利。 132 | 133 | #### 代码和其余文件 134 | 135 | Copyright 2023 USS_Shenzhou 136 | 137 | 本模组是自由软件,你可以再分发之和/或依照由自由软件基金会发布的 GNU 通用公共许可证修改之,无论是版本 3 许可证,还是(按你的决定)任何以后版都可以。 138 | 139 | 发布这个软件是希望它能有用,但是并无保障;甚至连可销售和符合某个特定的目的都不保证。请参看 GNU 通用公共许可证,了解详情。 140 | 141 | **附加条款** 142 | 143 | 根据GNU GPL版本3第7节所述,对协议补充如下: 144 | 145 | - a) 作为Minecraft模组的额外授权:如果你通过连接或合并Minecraft修改该程序或者其任何部分,而受到该库许可证(即Minecraft EULA)条款的制约,本程序的许可证授权你输送修改结果的额外权利。修改结果的非源代码形式的相关源代码应当包含本软件的源代码部分。 146 | - b) 如果你对本软件进行了修改,你在转发修改后的版本时,应当明确说明其修改自本软件,并说明本软件开发者不对修改后的版本提供任何保证。不得使用本软件任一开发者或本软件的的名义来宣传修改后的版本。 147 | 148 | ### 其他开源信息 149 | 150 | 1. 模组中有关改变玩家动作的部分,包括`cn.ussshenzhou.rainbow6.action`包、其他与`Action`有关的类,是在GPLv3下,受[跑酷](https://github.com/alRex-U/ParCool)模组启发、从其复制和由其演绎。 151 | 2. 模组中有关枪械的部分,包括`cn.ussshenzhou.rainbow6.gun`包,其他与枪械有关的类,是在GPLv3下,受[MrCrayfish's Gun Mod](https://github.com/MrCrayfish/MrCrayfishGunMod)模组和/或[Timeless and Classics Guns](https://github.com/ClumsyAlien/TimelessandClassics_Reforged)模组启发、从其复制和由其演绎。 152 | 153 | ### 其他版权信息 154 | 155 | ***这是一个粉丝项目,非《彩虹六号:围攻》官方产品。未获育碧许可,亦与育碧无任何关联。*** 156 | 157 | ***《彩虹六号:围攻》商标及其内容的所有权及版权属于育碧。*** 158 | 159 |
160 | 161 | 162 | 163 | --- 164 | 165 | ## 版权和许可信息(本指南) 166 | 167 | *USS_Shenzhou*对本指南的文本内容保留所有权利。本网站的框架及代码使用MIT许可证。 -------------------------------------------------------------------------------- /docs/madparticle/元指令指南.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: meta 3 | title: 元指令参数指南 4 | hide_table_of_contents: false 5 | 6 | --- 7 | 8 | # 元指令参数指南 9 | 10 | `meta`参数是一个元指令区域,以`CompoundTag`的形式呈现,被设计用来保障未来更新时的兼容性和扩展性。 11 | 12 | 你可以根据下列标志的介绍、你的需求及当前版本,来选择性地填写内容。 13 | 14 | :::info 15 | 16 | 下列一些值给出了推荐范围。尽管你可能可以在游戏内填写超出推荐范围的值,但我们不推荐您如此做。填写超出推荐范围的值是未定义行为。 17 | 18 | ::: 19 | 20 | --- 21 | 22 | ## 喷花筒标记 23 | 24 | > 可用版本:0.3.+ 25 | > 26 | > 形式:`"tada":1` 27 | > 28 | > 值类型:布尔值(填写`0`或`1`) 29 | 30 | 表示这是一条喷花筒指令,客户端需计算玩家手部位置并在生成粒子时进行对应偏移。 31 | 32 | ## 脉冲 33 | 34 | > 可用版本:0.4.19+ 35 | > 36 | > 形式:`"pulse":1` 37 | > 38 | > 值类型:布尔值 39 | 40 | 将喷花筒的工作模式设定为脉冲式。发射一次粒子后,玩家需抬起右键才能再次发射粒子。 41 | 42 | --- 43 | 44 | ## 数学表达式:dx、dy、dz 45 | 46 | > 可用版本:0.4.+ 47 | > 48 | > 形式:`"dx":"<数学表达式f(t)>"` 49 | > 50 | > 示例:`"dy":"0.2*sin(3t)+0.5*t"` 51 | > 52 | > 值类型:字符串 53 | 54 | 你可以填写一个以`t`为自变量的函数表达式,来取得对每tick中粒子在X、Y、Z三轴上增量的高级控制。由于直接控制粒子的绝对坐标会极大地影响指令的复用性,所以假设你想要粒子在X轴上的的运动轨迹为`F(t)`,你就需要填写其**导数`f(t)`**,以此消除绝对坐标的影响。 55 | 56 | 同样地,为了消除不同粒子寿命对指令复用性的影响,**`t`的值域为`[0,1]`**(对应粒子生成到消失),在实际应用时按照粒子寿命进行放缩。 57 | 58 | :::caution 59 | 60 | 如果你在此处指定了dx、dy、dz: 61 | 62 | - 对应的`gravity`、`xDeflection`、`zDeflection`将会失效,`friction`将会被覆盖; 63 | - `interactWithEntity`(与玩家互动)的效果会叠加; 64 | 65 | ::: 66 | 67 | :::info 68 | 69 | 考虑到复杂的表达式可能会对性能造成影响,目前的计算方式为: 70 | 71 | 1. 若存在指定的dx、dy、dz,则交由其他线程进行粒子对象初始化,每一条指令对应一个线程,初始化一批粒子; 72 | 1. 初始化过程包含dx、dy、dz的预计算过程:将0.00~1.00之间共101(若粒子寿命小于100,则取粒子寿命+1)个`t`代入所给表达式,求出对应值以供查询; 73 | 2. 一批粒子初始化完成后,在适当的时候加入世界; 74 | 3. 粒子在运动时读取保存的dx、dy、dz数组,以类似`alphaMode`的`SIN`模式,使用查表和线性插值得到对应的值。 75 | 76 | 如此做的好处在于尽量减少粒子对mspt的影响,但目前的弊端是会占用相对较多的内存资源。 77 | 78 | ::: 79 | 80 | ### 支持的运算符 81 | 82 | 以下列出支持的所有运算符号: 83 | 84 | - `+`、`-`、`*`、`/`:加、减(负)、乘、除; 85 | - `^`:幂; 86 | - `%`:取模; 87 | 88 | 如示例所示,你可以在适当的时候省略乘号。 89 | 90 | ### 支持的常数 91 | 92 | 以下列出支持的所有常数: 93 | 94 | - `pi`或`π`:圆周率,`3.14159265358979323846`; 95 | - `e`:自然常数,`2.7182818284590452354`; 96 | - `φ`:黄金比例,`1.61803398874`; 97 | 98 | ### 支持的函数 99 | 100 | 以下列出支持的所有函数: 101 | 102 | - `abs`:绝对值; 103 | - `sin`,`cos`,`tan`:正弦,余弦,正切;单位为弧度; 104 | - `asin`,`acos`,`atan`:反正弦,反余弦,反正切; 105 | - `sinh`,`cosh`,`tanh`:双曲正弦,双曲余弦,双曲正切; 106 | - `sqrt`,`cbrt`:平方根,立方根; 107 | - `floor`,`ceil`:不大于的最大整数,不小于的最小整数; 108 | - `exp`:以e为底的幂; 109 | - `log`,`log10`,`log2`:自然对数(底数e),常用对数(底数10),对数(底数2); 110 | - `signum`:符号函数; 111 | 112 | ### 科学计数法 113 | 114 | 技术上讲确实支持,但是我实在想不到什么样的粒子需要科学计数法...... 115 | 116 | --- 117 | 118 | ## 寿命误差 119 | 120 | > 可用版本:0.4.+ 121 | > 122 | > 形式:`"life":"<误差百分数>"` 123 | > 124 | > 示例:`"life":"20"` 125 | > 126 | > 值类型:整数(`1`~`99`) 127 | 128 | 覆盖粒子生成时默认的10%寿命误差。示例中即为20%的寿命误差。 129 | 130 | --- 131 | 132 | ## 碰撞后消失 133 | 134 | > 可用版本:0.4.3+ 135 | > 136 | > 形式:`"disappearOnCollision":"<触发时碰撞次数>"` 137 | > 138 | > 示例:`"disappearOnCollision":"2"` 139 | > 140 | > 值类型:整数(大于`0`) 141 | 142 | 是粒子在达到指定的碰撞次数时立即消失。示例中即为粒子在第二次碰撞时消失。 143 | 144 | 你可以利用此特性,结合`expireThen`,来使某个粒子在碰撞时变为其他的粒子。 145 | 146 | --- 147 | 148 | ## 倒放 149 | 150 | :::info 151 | 152 | 这是一条`长期实验性`的元指令标志,这意味着它可能会在未来被更改或取消。 153 | 154 | ::: 155 | 156 | > 可用版本:0.4.7+ 157 | > 158 | > 形式:`"tenet":1` 159 | > 160 | > 值类型:布尔值 161 | 162 | 在生成粒子时进行一遍预计算,计算完成后加入世界并按预计算的轨迹倒放。 163 | 164 | ## 预计算(正向) 165 | 166 | > 可用版本:0.4.21+ 167 | > 168 | > 形式:`"preCalculate":1` 169 | > 170 | > 值类型:布尔值 171 | 172 | 在生成粒子时进行正向预计算,计算完成后再加入世界。有效减少碰撞计算对主线程的压力。 173 | 174 | :::caution 175 | 176 | 如果你指定了倒放或预计算: 177 | 178 | - 倒放逻辑已包含预计算,因此若两标记同时出现则倒放优先。 179 | - `interactWithEntity`(与玩家互动)会失效; 180 | - 不能对粒子预计算完成后改变的地形做出反应。 181 | 182 | ::: 183 | 184 | :::danger 185 | 186 | 目前倒放和预计算对子粒子的兼容性可能不佳。 187 | 188 | ::: 189 | 190 | :::danger 191 | 192 | 预计算只适用于少量粒子的场景。在大量粒子的场景下,由于CPU被占满而无法起到优化效果。 193 | 194 | ::: 195 | 196 | --- 197 | 198 | ## 亮度 199 | 200 | :::info 201 | 202 | 这是一条`测试阶段`的元指令标志,这意味着它没有经过完整的测试,在某些情况下(例如使用光影时)可能会产生异常。 203 | 204 | ::: 205 | 206 | > 可用版本:0.4.9+ 207 | > 208 | > 形式:`"light":"<数学表达式f(t)>"` 209 | > 210 | > 示例:`"light":"15t"` 211 | > 212 | > 值类型:字符串 213 | 214 | 与dx、dy、dz相似,你可以填写一个以`t`为自变量的函数表达式,同样采用预计算-查表-插值的方式进行应用。计算时函数值将会被向下取整,并以截取的方式限定在0~15之内。 215 | 216 | :::caution 217 | 218 | 倒放粒子(即`"tenet"`)对指定的亮度变化无效。 219 | 220 | ::: 221 | 222 | --- 223 | 224 | ## 压缩传输 225 | 226 | > 可用版本:0.7.2+ 227 | > 228 | > 形式:`"halfPrecision":1` 229 | > 230 | > 值类型:布尔值 231 | 232 | 使用半精度浮点数来传输部分参数。通常在视觉上无感而可以节省约28%服务器流量。 233 | 234 | --- 235 | 236 | ## 索引传输 237 | 238 | > 可用版本:0.8.1+ 239 | > 240 | > 形式:`"indexed":1` 241 | > 242 | > 值类型:布尔值 243 | 244 | 使用索引号来传输几乎全部指令。索引为随机生成的整数以代表一整条指令,可以极大地节省服务器流量消耗。 245 | 246 | :::info 247 | 248 | 客户端在第一次执行某条指令时会先向服务器查询指令对应的指令文本以作缓存。故第一次执行某指令可能会产生三倍的延迟。 249 | 250 | ::: 251 | 252 | :::caution 253 | 254 | 索引传输和压缩传输不兼容。同时存在时,索引传输会覆盖压缩传输。 255 | 256 | ::: 257 | 258 | :::tip 259 | 260 | 如果你对应该使用何种优化参数感到困惑,以下是一张帮你选择前缀和传输方式的简图: 261 | 262 | ![image-20241008223015928](./assets/image-20241008223015928.png) 263 | 264 | ::: 265 | -------------------------------------------------------------------------------- /docs/holojaneway/3.1 固定模型的方块实体.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 3.1 3 | title: 3.1 优化:固定模型 4 | description: 利用ChunkBuffer提高BER渲染效率 5 | hide_table_of_contents: false 6 | sidebar_position: 131 7 | 8 | --- 9 | 10 | # 优化:具有固定模型的方块实体 11 | 12 | 有些时候,我们创造一个方块实体是为了获得比json模型更大的自由度,但最终使用BER渲染出来的是一个固定的模型,不需要旋转或移动之类——就像原版的告示牌一样。 13 | 14 | :::caution 15 | 16 | - 本节仅适用于固定模型。 17 | - 本节仅适用于只需要使用`solid`,`cutoutMipped`,`cutout`,`translucent`,`tripwire`这几种RenderType的情况。如果你需要更多类型,请查看[T88的渲染部分](1.3i)。 18 | 19 | ::: 20 | 21 | --- 22 | 23 | 正如BER的原理决定的,在BER中进行渲染需要每一帧都进行一次算来算去填顶点之类的漫长无比的操作。如果渲染结果没有变化(正如开头所言),我们可以想办法在第一次`render`之后,保存填好的BufferBuilder,以后就直接塞进去,省去重复计算的花费。 24 | 25 | :::info 26 | 27 | 当然,你可以选择自己维护一个这样的缓存,自己监听相关事件,自己更新、缓存和渲染。这样做的优点是: 28 | 29 | - 可以绕开ChunkBuffer在渲染时令人头大的坐标系变换; 30 | - 可以尽可能地减少对原版逻辑的干扰; 31 | - 可以更方便地使用自定义RenderType。 32 | 33 | 或许我们也可以想想,原版有没有类似的做法呢? 34 | 35 | ——当然有,这就是原版渲染世界(地形)时使用的ChunkBuffer,在区块(其实是`Section`)加载时进行`compile`,遍历内部所有方块,渲染到缓存里。我们也可以向其中插一脚,在`compile`时塞进自己的东西。这样做的优点是: 36 | 37 | - 不需要关心更新、缓存和渲染的触发,不用担心漏掉什么情况导致渲染糠掉; 38 | 39 | 这看起来只有似乎只占一点,但是其中可能会隐藏着巨大的工作量。因此选择借用ChunkBuffer是值得的。 40 | 41 | ::: 42 | 43 | 为了把顶点们塞进进ChunkBuffer,我们需要注入`section`的`compile`相关方法,检测对应方块并进行渲染。 44 | 45 | ## 准备方块实体 46 | 47 | 我们首先需要一个接口来标记这种特殊的固定BER方块: 48 | 49 | ```java 50 | public interface IFixedBEREntity { 51 | 52 | private BlockEntity self() { 53 | return (BlockEntity) this; 54 | } 55 | 56 | void renderFixedBER(Set begunRenderTypes, BlockRenderDispatcher blockRenderer, ChunkBufferBuilderPack builderPack, PoseStack poseStack, int packedOverlay); 57 | 58 | default int getPackedLight() { 59 | if (self().getLevel() != null) { 60 | return LevelRenderer.getLightColor(self().getLevel(), self().getBlockPos()); 61 | } else { 62 | return 0; 63 | } 64 | } 65 | 66 | default BufferBuilder getBuilder(Set begunRenderTypes, ChunkBufferBuilderPack bufferBuilderPack, RenderType type) { 67 | var builder = bufferBuilderPack.builder(type); 68 | if (begunRenderTypes.add(type)) { 69 | builder.begin(type.mode(), type.format()); 70 | } 71 | return builder; 72 | } 73 | } 74 | ``` 75 | 76 | 除了主要的`renderFixedBER`方法外,这里还有两个辅助方法。 77 | 78 | `getPackedLight`显然是BER里`render`方法提供的`packedLight`的补充;而值得注意的是,与在BER中使用`bufferSource.getBuffer()`不同,你**不能**直接使用`bufferBuilderPack.builder()`,而是需要使用此处的`getBuilder`,在开始绘制前检查与所需的`renderType`对应的`BufferBuilder`是否已初始化。 79 | 80 | 现在,你只需要让你的方块实体类实现这个接口,并把BER中的render函数(几乎)照样copy过来: 81 | 82 | ```java 83 | public final class YourFixedModelBlockEntity extends BlockEntity implements IFixedBEREntity { 84 | 85 | @OnlyIn(Dist.CLIENT) 86 | @Override 87 | public void renderFixedBER(Set begunRenderTypes, BlockRenderDispatcher blockRenderer, ChunkBufferBuilderPack builderPack, PoseStack poseStack, int packedOverlay) { 88 | ... 89 | } 90 | } 91 | ``` 92 | 93 | :::tip 94 | 95 | 如果你的BER里没有其他的部分,那你就可以把你的BER删掉并取消注册了;如果还包含有其他部分的代码,例如某种withoutLevelRenderer,你可以选择保留,或是挪到其他地方去、再去掉BER。 96 | 97 | ::: 98 | 99 | ## 注入 100 | 101 | 我们只需要找到合适的位置,然后注入渲染调用: 102 | 103 | ```java 104 | @Mixin(ChunkRenderDispatcher.RenderChunk.RebuildTask.class) 105 | public class ChunkRenderDispatcher$RenderChunk$RebuildTaskMixin { 106 | 107 | @Inject(method = "compile", at = @At(value = "INVOKE", shift = At.Shift.AFTER, 108 | target = "Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk$RebuildTask;handleBlockEntity(Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$RenderChunk$RebuildTask$CompileResults;Lnet/minecraft/world/level/block/entity/BlockEntity;)V"), 109 | locals = LocalCapture.CAPTURE_FAILSOFT) 110 | private void t88CompileFixedBlockEntity(float pX, float pY, float pZ, ChunkBufferBuilderPack pChunkBufferBuilderPack, 111 | CallbackInfoReturnable cir, 112 | ChunkRenderDispatcher.RenderChunk.RebuildTask.CompileResults compileResults, int i, BlockPos from, BlockPos to, VisGraph visgraph, RenderChunkRegion renderchunkregion, PoseStack poseStack, Set renderTypes, RandomSource random, BlockRenderDispatcher blockRenderer, Iterator posIterator, BlockPos pos, BlockState state, BlockEntity entity) { 113 | if (entity instanceof IFixedBEREntity fixedEntity) { 114 | poseStack.pushPose(); 115 | poseStack.translate(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15); 116 | fixedEntity.renderFixedBER(renderTypes,blockRenderer, pChunkBufferBuilderPack, poseStack, OverlayTexture.NO_OVERLAY); 117 | poseStack.popPose(); 118 | } 119 | } 120 | } 121 | ``` 122 | 123 | 我们还需要借助AT打开两个内部类的访问权限: 124 | 125 | ```java 126 | public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask 127 | public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask$CompileResults 128 | ``` 129 | 130 | 你可以注意到,在调用`renderFixedBER`之前,我们使用`poseStack.translate(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15);`,其目的是将原点从section原点挪到方块原点处。 131 | 132 | :::info 133 | 134 | 关于此处的坐标变换,你可以在[Cobalt](https://zomb-676.github.io/CobaltDocs/#/render/coordinateSystem)读到更多信息。 135 | 136 | 注入点上下文源码,以及`LevelRenderer.renderLevel`和它的下文也可能对你的理解有帮助。 137 | 138 | ::: 139 | 140 | 好了,现在启动你的游戏,你就应该能看到和之前BER一样的渲染结果了。 141 | 142 | :::caution 143 | 144 | 对渲染相关代码的注入(尤其是需要捕获局部变量时),很有可能会与Optifine打架。参考**[这一段](/holojaneway/-3#与optifine的兼容)**内容来解决冲突。 145 | 146 | ::: 147 | -------------------------------------------------------------------------------- /docs/r6ms/常见问题解答(FAQ).md: -------------------------------------------------------------------------------- 1 | --- 2 | id: faq 3 | title: 常见问题解答和错误排除 4 | hide_table_of_contents: false 5 | toc_max_heading_level: 4 6 | --- 7 | 8 | # 常见问题解答和错误排除 9 | 10 | --- 11 | 12 | ## 常见问题解答 13 | 14 | export const Box = ({children}) => ( 15 |
23 | {children} 24 |
25 | ); 26 | 27 | 28 | 29 | 30 | #### 会支持Minecraft 1.19或更以前的版本吗?会支持Fabric/Quilt吗? 31 | - 不会。我们的时间和精力有限。 32 | 33 | 34 | 35 | 36 | 37 | #### 可以使用非最新版本游玩吗? 38 | - 我们强烈反对您这样做。 39 | 40 | 41 | 42 | 43 | 44 | #### 我没有正版账号,我可以游玩R6MS吗? 45 | - 可以。除离线登录只能使用默认武器涂装外,其余功能均相同。 46 | 47 | 48 | 49 | 50 | 51 | #### 我是玩家,我想要游玩R6MS? 52 | - R6MS本身与其他mod无异,你只需要将其放入你的mods文件夹即可。想要进行多人游戏,你需要自己寻找一个可用的服务器。除非公开的临时测试服务器外,我们不提供多人游戏服务器。 53 | 54 | 55 | 56 | 57 | 58 | #### 我是服主或管理员,我想要在我的服务器上安装R6MS? 59 | - 如上所述——就像其他mod一样,下载最新版本的jar,放进mods文件夹即可。如果想要探索其他功能,请阅读指南的其余内容。 60 | 61 | 62 | 63 | 64 | 65 | #### 我没有正版账号,我可以获取和使用武器涂装(皮肤)吗? 66 | - 很遗憾,武器涂装系统(Voager)和正版账号是强绑定的。 67 | 68 | 69 | 70 | 71 | 72 | #### 我可以使用第三方验证登录吗? 73 | - R6MS并不限制你进入任何服务器。只要你的用户名和当前UUID与微软提供的UUID相同,你即被Voyager视为拥有正版账号。 74 | 75 | 76 | 77 | 78 | 79 | #### 干员、武器或武器配件需要付费解锁吗? 80 | - 不论是游戏中的货币或现实中的货币,都不需要。根据[Mojang有关规定](https://www.minecraft.net/zh-hans/usage-guidelines),这些内容都是初始全可用的。我们也不支持多人游戏服务器经营者实施类似的限制。 81 | 82 | 83 | 84 | 85 | 86 | #### 我的账号会有额外的泄露风险吗? 87 | - 不会。我们仅会读取您的Minecraft用户名和对应UUID。对账号所有权的验证依赖于Minecraft本身的登录验证机制。 88 | 89 | 90 | 91 | 92 | 93 | #### 我要如何获取武器涂装? 94 | 目前有以下几种预想中的获取涂装途径:我们举行的活动或事件、指定渠道的捐赠、我们对特定玩家赠与、以及在服务器中购买。 95 | - 我们举行的活动或事件通常会在指南首页和bilibili进行宣布。通过这种途径获得的涂装最迟会在数周内发放。 96 | - 你通过爱发电捐赠获得的涂装最迟会在一周内发放。 97 | - 在邀请特定玩家进入游戏时,我们可能会发放专有的武器涂装。 98 | - 连接到Voyager的多人游戏服务器可能会被允许售卖指定的涂装。我们不会直接售卖任何涂装,一切涂装售卖均由服务器进行。服务器通知我们售卖的对象并支付指定的费用(如果存在)。 99 | - 如果服务器并未向我们支付指定的费用,则你购买的涂装可能不会被发放或被撤回。 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | #### 会有盔甲涂装吗? 109 | - 出于对战公平性考虑,不会有盔甲涂装。因此也不会有精英皮。 110 | 111 | 112 | 113 | 114 | 115 | #### 会有武器挂件吗? 116 | - 现在没有,但我们有相关的技术计划。 117 | 118 | 119 | 120 | 121 | 122 | #### 会有Alpha包吗? 123 | - 不会。 124 | 125 | 126 | 127 | 128 | 129 | 130 | #### 会有配件涂装吗? 131 | - 不会有单独的配件涂装。配件涂装包含在武器涂装中。 132 | 133 | 134 | --- 135 | 136 | ## 错误与警告排除 137 | 138 | 以下列举出在游戏运行过程中可能出现的警告和错误,以及导致此错误的原因、对应的解决方案、程序预设的处理方法和手动处理建议。不保证完全覆盖所有情况。 139 | 140 | 如果提供内容不够详细,或是你需要进一步的支持,请到KOOK联系模组开发者。 141 | 142 | ### 双端 143 | 144 | 145 | - ​Failed to load config ... . Things may not work well. 启动时加载某个配置文件失败。若频繁出现,请联系mod开发者。 146 | - 游戏将自动继续,但推荐你重新启动游戏。缺失的配置文件可能会导致意外的行为。 147 | - 如果重新启动游戏后仍异常,请检查对应的配置文件是否被占用或出现错误。 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | - ​Cannot find id for skin ... . If this is a development environment, assign it. This should not happen in product environments. 未能找到为皮肤预先设定的id值。请联系mod开发者。 157 | - 在发行版本中不应该发生这样的情况。 158 | - 有另一个与此相似的错误,不过不是skin而是item,不再赘述。 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | - ​Failed to find skin ... for item ... . This should not happen. 未能找到物品标签所指的皮肤。请联系mod开发者。 168 | - 在发行版本中不应该发生这样的情况。 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | ### 服务器端 177 | 178 | 179 | - ​Failed to find channel for ... . 服务器在向玩家发送网络包时找不到对应的Channel。请联系mod开发者。 180 | - 网络包将会被丢弃。 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | - ​Player ... sent a RoundPrepareTopView packet, but it looks like this player is not in a match. 玩家向服务端发送了用于请求将其传送至地图俯视图位置的网络包,但该玩家并未在对战中。 190 | - 玩家的请求将会被忽略。 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | - ​Player ... sent a RoundPrepareTopView pacbket and wants to teleport to ... , but it looks like this pos is not in the range of designated map. 玩家向服务端发送了用于请求将其传送至地图俯视图位置的网络包,但请求的位置不在对战地图范围内。可能是因为玩家的Minecraft窗口有不寻常的长宽比;也可能是恶意发包。 200 | - 玩家的请求将会被忽略。 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | - ​[ServerMatchController]: Failed to find world ... . 在对战结束尝试恢复玩家状态时失败,找不到玩家之前所在的世界。可能是整个世界被卸载,或是世界已经不存在,或是配置文件中的世界名被不正确地修改。 210 | - 玩家将会被传送回世界出生点。 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | - ​[RoundPrepareTopView]: Failed to find world ... . 玩家向服务端发送了用于请求将其传送至地图俯视图位置的网络包,但找不到该地图所在的世界。可能是整个世界未被加载,或是世界已经不存在,或是配置文件中的世界名被不正确地修改。 220 | - 玩家的请求将会被忽略。 221 | 222 | 223 | 224 | 225 | 226 | :::info 227 | 228 | 模组开发者对服务器使用的多世界插件并不熟悉,因此可能在此处或类似的地方产生错误。请联系模组开发者。 229 | 230 | ::: 231 | 232 | 233 | 234 | 235 | - ​Can't get player ...'s before-match data. This should not happen. 在对战结束尝试恢复玩家状态时失败,找不到玩家在对战前保存的数据。若频繁出现,请联系mod开发者。 236 | - 玩家将会被传送回世界出生点、清空并重置所有状态,被设为服务器默认游戏模式。 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | - ​Received unreasonable network packet ... from ... . ...玩家向服务器发送了与对战有关的网络包,但其内容看起来不太合理。若频繁出现,考虑恶意发包可能。 247 | - 玩家发送的内容可能会被忽略。 248 | 249 | 250 | 251 | -------------------------------------------------------------------------------- /docs/r6ms/统计数据收集说明.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: data_collect 3 | title: 个人与统计信息收集政策 4 | hide_table_of_contents: false 5 | --- 6 | 7 | # 个人与统计信息收集政策 8 | 9 | > 本政策主要依据GB/T 35273-2020编写。 10 | 11 | 本政策仅适用于跨服务器数据同步服务的云上跨服务器数据同步服务(Voyager)。本地跨服务器数据同步服务的相关内容只会在您本地进行处理。 12 | 13 | 最近更新日期:2024年1月1日。 14 | 15 | 我们深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最小必要原则、确保安全原则、主体参与原则、公开透明原则等。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。 16 | 请在使用我们的产品或服务前,仔细阅读并了解本《个人与统计信息收集政策》。 17 | 18 | ## 有关玩家数据的信息收集使用规则 19 | 20 | ### 1.我们收集哪些您的个人信息 21 | 22 | 我们提供的业务功能需要依赖下列信息才得以运行。您选择使用该项业务功能,则需要向我们提供或允许我们收集的必要信息包括: 23 | 24 | - 您Minecraft账号所对应的UUID 25 | - 创建此账号记录的时间 26 | - 您的作弊历史记录,包括: 27 | - (作弊行为被记录时,以下同)所在服务器的名称 28 | - 所在服务器的ip地址 29 | - 被记录时的时间 30 | - 进行作弊记录的管理员UUID 31 | - 您的战绩信息,包括:胜场数、败场数、死亡数、击杀数、爆头数 32 | - 您拥有的武器涂装 33 | - 您获取武器涂装的记录(仅限于从爱发电、服务器内购等存在潜在退款需求处获取武器涂装时),包括: 34 | - 武器涂装的名称 35 | - 获取武器涂装的渠道 36 | - 获取武器涂装的时间 37 | 38 | 以上个人信息将会被保留直至您要求删除账户或我们彻底停止服务。 39 | 40 | ### 2.我们如何使用您的个人信息 41 | 42 | 以上提及的个人信息会被用于提供以下功能: 43 | 44 | - 为其他玩家提供作弊次数预警 45 | - 为Minecraft多人游戏服务器(以下简称“MC服务器”)提供作弊次数检查 46 | - 满足潜在的作弊申诉需求 47 | - 记录对战结果 48 | - 在进入MC服务器时获取拥有的武器涂装,并在服务器内应用于对应物品,或进行检查 49 | - 记录新获取的武器涂装 50 | - 满足潜在的武器涂装退款需求 51 | - 去除您的UUID后用于统计和公开展示,例如游玩时间最长的玩家展示 52 | 53 | ### 3.我们如何委托处理、共享、转让、公开披露您的个人信息 54 | 55 | #### (1)委托处理 56 | 本业务功能中某些具体的模块或功能由外部供应商提供。我们的数据库或中间件可能会部署在Azure、阿里云或华为云。 57 | 58 | 对我们委托处理个人信息的公司、组织和个人,我们会与其签署严格的协定,要求他们按照我们的要求、本个人信息保护政策以及其他任何相关的保密和安全措施来处理个人信息。 59 | 60 | #### (2)共享 61 | 62 | 我们不会与本公司以外的任何公司、组织和个人分享您的个人信息。 63 | 64 | 我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。 65 | 66 | #### (3)转让 67 | 68 | 我们不会将您的个人信息转让给任何公司、组织和个人,但以下情形除外: 69 | 70 | a)在涉及《我的六号》(R6MS)模组停止更新时,如涉及到个人信息转让,我们会在要求新的开发者和服务提供者受此个人信息保护政策的约束,否则我们将要求新的开发者和服务提供者重新向您征求授权同意。 71 | 72 | #### (4)公开披露 73 | 我们仅会在以下情形下,公开披露您的个人信息: 74 | 75 | a)获得您明确同意后; 76 | 77 | b)基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。 78 | 79 | ## 有关对战数据的信息收集使用规则 80 | 81 | ### 1.我们收集哪些您的个人信息 82 | 83 | 我们提供的业务功能需要依赖下列信息才得以运行。您选择使用该项业务功能,则需要向我们提供或允许我们收集的必要信息包括: 84 | 85 | - 对战UUID 86 | - 对战时使用的R6MS版本号 87 | - MC服务器名称 88 | - MC服务器ip地址 89 | - 对战地图名称 90 | - 对战中各个回合的数据,包括: 91 | - 回合开始时间和结束时间 92 | - 进攻方选取的干员 93 | - 防守方选取的干员 94 | - 回合的胜利方 95 | 96 | 以上个人信息将会被保留直至您要求注销账户或我们彻底停止服务。 97 | 98 | ### 2.我们如何使用您的个人信息 99 | 100 | 以上提及的个人信息会被用于提供以下功能: 101 | 102 | - 游戏平衡性分析 103 | - 用于统计和公开展示,例如干员选取/胜场率分布图 104 | 105 | ### 3.我们如何委托处理、共享、转让、公开披露您的个人信息 106 | 107 | 此部分内容与***有关玩家数据的信息收集使用规则***一节的对应内容相同。 108 | 109 | ## 我们如何保护您的个人信息 110 | 111 | (一)我们已使用符合业界标准的安全防护措施保护您提供的个人信息, 防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。 112 | 113 | (二)我们会采取一切合理可行的措施,确保未收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。 114 | 115 | (三)互联网环境并非百分之百安全,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。 116 | 117 | (四)在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。 118 | 119 | ## 您的权利 120 | 121 | 按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利: 122 | 123 | ### (一)访问您的个人信息 124 | 125 | 您有权访问您的个人信息,法律法规规定的例外情况除外。 126 | 127 | 对于您在使用我们的产品或服务过程中产生的其他个人信息,只要我们不需要过多投入,我们会向您提供。如果您想行使数据访问权,可以通过本政策中公示的联系方式联系我们。 128 | 129 | ### (二)更正您的个人信息 130 | 131 | 当您发现我们处理的关于您的个人信息有错误时,您有权要求我们作出更正。 132 | 133 | 对Voyager具体而言,更正个人信息仅指的是撤销作弊记录。如果您想撤销作弊记录,可以通过本政策中公示的联系方式联系我们。 134 | 135 | ### (三)删除您的个人信息 136 | 137 | 在以下情形中,您可以向我们提出删除个人信息的请求: 138 | 139 | 1. 如果我们处理个人信息的行为违反法律法规; 140 | 2. 如果我们收集、使用您的个人信息,却未征得您的同意; 141 | 3. 如果我们处理个人信息的行为违反了与您的约定; 142 | 4. 如果您不再使用我们的产品或服务,或您注销了账号; 143 | 5. 如果我们不再为您提供产品或服务。 144 | 145 | 当您从我们的服务中删除信息后,我们可能不会立即在备份系统中删除相应的信息,但会在备份更新时删除这些信息。 146 | 147 | ### (四)改变您授权同意的范围 148 | 149 | 我们不会额外收集您的个人信息。 150 | 151 | ### (五)个人信息主体注销账户 152 | 153 | 您随时可注销此前注册的账户,如果您想注销账户,可以通过本政策中公示的联系方式联系我们。在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,法律法规另有规定的除外。 154 | 155 | ### (六)个人信息主体获取个人信息副本 156 | 157 | 您有权获取您的个人信息副本。如果您想获取您的个人信息副本,可以通过本政策中公示的联系方式联系我们。 158 | 159 | ### (七)响应您的上述请求 160 | 161 | 为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。 162 | 163 | 我们将在30天内作出答复。 164 | 165 | 对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。 166 | 167 | 在以下情形中,我们将无法响应您的请求: 168 | 169 | 1. 与个人信息控制者履行法律法规规定的义务相关的; 170 | 2. 与国家安全、国防安全直接相关的; 171 | 3. 与公共安全、公共卫生、重大公共利益直接相关的; 172 | 4. 与刑事侦查、起诉、审判和执行判决等直接相关的; 173 | 5. 个人信息控制者有充分证据表明个人信息主体存在主观恶意或滥用权利的; 174 | 6. 出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; 175 | 7. 响应个人信息主体的请求将导致个人信息主体或其他个人、组织的合法权益受到严重损害的; 176 | 8. 涉及商业秘密的。 177 | 178 | ## 我们如何处理儿童的个人信息 179 | 180 | 我们主要面向成年人提供服务。但我们非常重视对未成年人个人信息的保护。如果您是未成年人,我们要求您请您的父母或其他监护人仔细阅读本政策的所有内容,并在征得您的父母或其他监护人同意的前提下使用我们的产品或服务以及向我们提供信息。 181 | 182 | 我们的服务依赖于正版Minecraft账户。根据Microsoft有关条款,未成年人的父母或法定监护人负责创建您的Microsoft帐户并代表您接受所有Microsoft条款。受制于现有技术和服务模式,我们很难主动识别未成年人的个人信息。 183 | 184 | 对于经父母同意而收集儿童个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息。 185 | 186 | 如果我们发现自己在未事先获得可证实的父母同意的情况下收集了儿童的个人信息,则会设法尽快删除相关数据。 187 | 188 | ## 您的个人信息如何在全球范围内转移 189 | 190 | 原则上,我们在中华人民共和国境内收集和产生的个人信息, 将存储在中华人民共和国境内(大陆地区)。 191 | 192 | 由于我们对全球的Minecraft多人游戏服务器都开放服务,这意味着: 193 | 194 | 1. 在获得您的授权同意后,您的全部个人信息可能会被转移到香港特别行政区; 195 | 196 | 2. 当您决定加入一个启用了Voyager的多人游戏服务器时,您的部分个人信息将会被发送至该服务器,即受到来自您加入的多人游戏服务器的境外管辖区的访问。 197 | 198 | 此类管辖区可能设有不同的数据保护法,甚至未设立相关法律。由于我们对第三方多人游戏服务器不具有完全的控制权,故请您自行决定是否要加入境外第三方服务器。在此类情况下,我们会尽力确保您的个人信息至少得到在中华人民共和国境内足够同等的保护,或与该管辖区法律相符的更严格的保护。 199 | 200 | 被传输的这部分个人信息包括: 201 | 202 | - 您Minecraft账号所对应的UUID 203 | - 您的作弊次数,但不包括作弊记录的详细信息 204 | - 您拥有的武器涂装,不包括获取武器涂装的详细历史记录 205 | 206 | 207 | 208 | ## 本政策如何更新 209 | 210 | 本政策可能会进行变更。 211 | 212 | 未经您明确同意,我们不会削减您按照本个人信息保护政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。对于重大变更,我们还会提供更为显著的通知。 213 | 214 | 本政策所指的重大变更包括但不限于: 215 | 216 | 1. 我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等; 217 | 2. 我们在所有权结构、组织架构等方面发生重大变化。如业务调整、主要开发者变更等引起的所有者变更等; 218 | 3. 个人信息共享、转让或公开披露的主要对象发生变化; 219 | 4. 您参与个人信息处理方面的权利及其行使方式发生重大变化; 220 | 6. 个人信息安全影响评估报告表明存在高风险时。我们还会将本政策的旧版本存档,供您查阅。 221 | 222 | ## 如何联系我们 223 | 224 | 如果您有任何疑问、意见或建议,请通过页面最下方的KOOK链接,或发送邮件至voyager@uss-shenzhou.cn与我们联系。 225 | 226 | 一般情况下,我们将在30天内回复。 -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Note: type annotations allow type checking and IDEs autocompletion 3 | 4 | const {themes} = require('prism-react-renderer'); 5 | const lightTheme = themes.github; 6 | const darkTheme = themes.dracula; 7 | 8 | /** @type {import('@docusaurus/types').Config} */ 9 | const config = { 10 | title: 'HoloJaneway', 11 | tagline: 'Dinosaurs are cool', 12 | url: 'https://your-docusaurus-test-site.com', 13 | baseUrl: '/', 14 | onBrokenLinks: 'throw', 15 | onBrokenMarkdownLinks: 'warn', 16 | favicon: 'img/logo.ico', 17 | 18 | // GitHub pages deployment config. 19 | // If you aren't using GitHub pages, you don't need these. 20 | organizationName: '', // Usually your GitHub org/user name. 21 | projectName: '', // Usually your repo name. 22 | 23 | // Even if you don't use internalization, you can use this field to set useful 24 | // metadata like html lang. For example, if your site is Chinese, you may want 25 | // to replace "en" with "zh-Hans". 26 | i18n: { 27 | defaultLocale: 'zh-Hans', 28 | locales: ['zh-Hans','en'], 29 | localeConfigs: { 30 | en: { 31 | htmlLang: 'en-US', 32 | }, 33 | }, 34 | }, 35 | 36 | presets: [ 37 | [ 38 | 'classic', 39 | /** @type {import('@docusaurus/preset-classic').Options} */ 40 | ({ 41 | docs: { 42 | routeBasePath: '/', 43 | sidebarPath: require.resolve('./sidebars.js'), 44 | // Please change this to your repo. 45 | // Remove this to remove the "edit this page" links. 46 | /*editUrl: 47 | 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',*/ 48 | }, 49 | blog: false,/*{ 50 | showReadingTime: true, 51 | // Please change this to your repo. 52 | // Remove this to remove the "edit this page" links. 53 | editUrl: 54 | 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', 55 | },*/ 56 | theme: { 57 | customCss: require.resolve('./src/css/custom.css'), 58 | }, 59 | }), 60 | ], 61 | ], 62 | 63 | themeConfig: 64 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ 65 | ({ 66 | navbar: { 67 | title: 'HoloJaneway', 68 | logo: { 69 | alt: 'My Site Logo', 70 | src: 'img/logo.png', 71 | }, 72 | items: [ 73 | { 74 | type: 'doc', 75 | docId: 'holojaneway/0', 76 | position: 'left', 77 | label: 'Mod开发教程', 78 | }, 79 | { 80 | type: 'doc', 81 | docId: 'madparticle/home', 82 | position: 'left', 83 | label: 'Mod使用指南', 84 | }, 85 | { 86 | type: 'doc', 87 | docId: 'portfolio', 88 | position: 'left', 89 | label: 'Portfolio', 90 | }, 91 | /*{ 92 | type: 'doc', 93 | docId: 'r6ms/home', 94 | position: 'left', 95 | label: 'R6MS指南', 96 | },*/ 97 | //{to: '/blog', label: 'Blog', position: 'left'}, 98 | { 99 | href: 'https://github.com/USS-Shenzhou/HoloJaneway', 100 | label: '点个Star吧!', 101 | position: 'right', 102 | }, 103 | { 104 | type: 'localeDropdown', 105 | position: 'right', 106 | }, 107 | ], 108 | }, 109 | docs: { 110 | sidebar: { 111 | autoCollapseCategories: true, 112 | }, 113 | }, 114 | footer: { 115 | style: 'dark', 116 | links: [ 117 | { 118 | label: 'CurseForge', 119 | href: 'https://legacy.curseforge.com/members/uss_shenzhou/projects' 120 | }, 121 | { 122 | label: 'Modrinth', 123 | href: 'https://modrinth.com/user/USS-Shenzhou' 124 | }, 125 | { 126 | label: 'Discord', 127 | href:'https://discord.gg/kNbGdDXpSA' 128 | }, 129 | { 130 | label: 'Bilibili', 131 | href:'https://space.bilibili.com/266675750' 132 | }, 133 | { 134 | label: 'GitHub', 135 | href:'https://github.com/USS-Shenzhou' 136 | } 137 | /*{ 138 | title: 'Docs', 139 | items: [ 140 | { 141 | label: 'Tutorial', 142 | to: '/docs/intro', 143 | }, 144 | ], 145 | }, 146 | { 147 | title: 'Community', 148 | items: [ 149 | { 150 | label: 'Stack Overflow', 151 | href: 'https://stackoverflow.com/questions/tagged/docusaurus', 152 | }, 153 | { 154 | label: 'Discord', 155 | href: 'https://discordapp.com/invite/docusaurus', 156 | }, 157 | { 158 | label: 'Twitter', 159 | href: 'https://twitter.com/docusaurus', 160 | }, 161 | ], 162 | }, 163 | { 164 | title: 'More', 165 | items: [ 166 | { 167 | label: 'Blog', 168 | to: '/blog', 169 | }, 170 | { 171 | label: 'GitHub', 172 | href: 'https://github.com/facebook/docusaurus', 173 | }, 174 | ], 175 | },*/ 176 | ], 177 | // REMEMBER TO UPDATE I18N FOOTER.JSON 178 | copyright: ` 179 | Copyleft ${new Date().getFullYear()} HoloJaneway, USS_Shenzhou. Built with Docusaurus. 180 |
川公网安备51112302000191号 181 | | 蜀ICP备2023001090号-1 182 |
HoloJaneway网站使用MIT许可证。 183 | | The HoloJaneway website is licensed under MIT License. 184 |
《HoloJaneway Mod开发教程》使用CC BY-NC 4.0,BSD-3-Clause和GPLv3许可证。 185 | | The HoloJaneway Mod Developing Tutorial is licensed under CC BY-NC 4.0,BSD-3-Clause and GPLv3 License. 186 |
USS_Shenzhou 对《Mod使用指南》中的所有内容保留所有权利。 187 | | All rights reserved for the Mod Usage Guidelines. 188 |
189 | `, 190 | }, 191 | prism: { 192 | theme: lightTheme, 193 | darkTheme: darkTheme, 194 | additionalLanguages: ['java','toml','gradle','json','cmake','powershell'], 195 | }, 196 | }), 197 | markdown:{ 198 | mermaid:true, 199 | }, 200 | themes:['@docusaurus/theme-mermaid'], 201 | }; 202 | 203 | module.exports = config; 204 | -------------------------------------------------------------------------------- /docs/holojaneway/0.2 服务端和客户端.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 0.2 3 | title: 0.2 服务端和客户端 4 | description: 服务端和客户端 5 | hide_table_of_contents: false 6 | sidebar_position: 102 7 | --- 8 | 9 | # 服务端和客户端 10 | 11 | 有关服务端和客户端的内容十分重要,值得我们在绪论之后单独开一节来讲。 12 | 13 | --- 14 | 15 | 如果你曾经自己开过服务器来玩,你应该就知道服务端和客户端是不同的。多人游戏时,物理服务端和物理客户端运行在不同的物理主机上,通过网络传输信息。而即使在单人游戏中,MC也存在一个逻辑服务端和一个逻辑客户端。 16 | 17 | 显然,有些数据需要在正确的一端进行运算,并同步至另外一端(幽灵方块就是个典型的反面例子);有些数据只在一端存在(比如粒子效果)。单人游戏时两端在不同线程上运行,多人游戏时两端在不同设备上运行,显然这需要数据同步、更新才能保证程序的准确运行。 18 | 19 | ## 你是哪端的? 20 | 21 | 有一些方法在两端都会被执行,而一些时候我们希望在不同侧执行不同的逻辑,这就需要分辨。而通常参数中都会有`Level`: 22 | 23 | ```java 24 | public void bothSideMethod(Level level){ 25 | if (level.isClientSide){ 26 | //客户端逻辑 27 | } else { 28 | //服务端逻辑 29 | } 30 | } 31 | ``` 32 | 33 | 借助`level.isClientSide`,我们可以判断传入的参数是对应逻辑服务端还是逻辑客户端。 34 | 35 | ## 获取服务端和客户端 36 | 37 | 在多数时候,方法的形参带有`level`,我们可以直接使用上面的方法来实现想要的逻辑。但偶尔我们需要“凭空”获取两端。 38 | 39 | 在客户端,要想获取客户端十分简单: 40 | 41 | ```java 42 | Minecraft minecraft = Minecraft.getInstance(); 43 | //如果你还想要Level 44 | ClientLevel clientLevel = minecraft.level; 45 | ``` 46 | 47 | 在服务端,你需要借助`LogicalSidedProvider`: 48 | 49 | ```java 50 | MinecraftServer minecraftServer = (MinecraftServer) LogicalSidedProvider.WORKQUEUE.get(LogicalSide.SERVER); 51 | //如果你还想要Level,由于有多个Level存在,你需要提前通过其他方法获取ResourceKey 52 | //原版三个世界的ResourceKey在Level类中可以找到,以主世界为例: 53 | ServerLevel serverLevel = minecraftServer.getLevel(Level.OVERWORLD); 54 | //当然,你可以遍历所有的level,通过某种条件来找到自己想要的。但请尽量不要这样做,除非真的很有必要,没有其他方法,或者你已经尽了最大可能减少性能开销。 55 | ``` 56 | 57 | 当然你也可以使用`LogicalSidedProvider`来获取客户端,但是在多数时候显然不如直接使用`Minecraft.getInstance()`来的方便。 58 | 59 | 你也可以使用`DistExecutor`来分辨两端并执行逻辑,但上述的方法在绝大多数时候已经足够了。 60 | 61 | 62 | 63 | ## OnlyIn! 64 | 65 |
71 | 72 | 73 | :::caution 74 | 75 | 在1.21.7,OnlyIn遭到了彻底的降级。现在OnlyIn不再起任何实际作用,NeoForge会检查你是否还在用,并且在游戏启动时给出警告——如果你正在升级版本,应该很快就能发现这个问题。这也意味着,你需要自行处理这个双端分离的问题。参考[OnlyIn,但是为什么?](#onlyin但是为什么)了解更多内容。 76 | 77 | ::: 78 | 79 | 80 | 81 | 82 |

83 |
84 | 85 |

86 | 87 | 如果你因为好奇而查看了`ClientLevel`的具体内容,你可能已经注意到了这样一个注解`@OnlyIn(Dist.CLIENT)`。括号中的value一般是`Dist.CLIENT`,极少数时候会用到`Dist.DEDICATED_SERVER`。字段、方法等一旦被`@OnlyIn`注解,他们对于另一端就是逻辑上不可见的(即使这几行代码确实存在于磁盘之中)。请注意,`@OnlyIn`区分的是物理两端而不是逻辑两端。这意味着单人游戏中的服务端可以执行被注解`@OnlyIn(Dist.CLIENT)`的代码,而`@OnlyIn(Dist.DEDICATED_SERVER)`在单人游戏时意味着谁也不能执行到它。 88 | 89 | 对于被`@OnlyIn`标记的类,需要注意的是,即使你已经用了`isClientSide`来区分,你也不能在一个双端方法内使用它(的对象),需要单独拆出来: 90 | 91 | ```java 92 | //这是一个错误的用法 93 | public void bothSideMethodWrong(Level level){ 94 | if (level.isClientSide){ 95 | Minecraft minecraft = Minecraft.getInstance(); 96 | //客户端逻辑 97 | } else { 98 | MinecraftServer minecraftServer = (MinecraftServer) LogicalSidedProvider.WORKQUEUE.get(LogicalSide.SERVER); 99 | //服务端逻辑 100 | } 101 | } 102 | 103 | //这是一个正确的用法 104 | public void bothSideMethodCorrect(Level level){ 105 | if (level.isClientSide){ 106 | doClientStuff(); 107 | } else { 108 | doServerStuff(); 109 | } 110 | } 111 | 112 | private void doClientStuff(){ 113 | Minecraft minecraft = Minecraft.getInstance(); 114 | //客户端逻辑 115 | } 116 | 117 | private void doServerStuff(){ 118 | MinecraftServer minecraftServer = (MinecraftServer) LogicalSidedProvider.WORKQUEUE.get(LogicalSide.SERVER); 119 | //服务端逻辑 120 | } 121 | ``` 122 | 在你第一次启动`runServer`时,你很有可能遇到这样的报错: 123 | 124 | > Caused by: java.lang.BootstrapMethodError: java.lang.RuntimeException: Attempted to load class net/minecraft/client/resources/sounds/SoundInstance for invalid dist DEDICATED_SERVER 125 | 126 | 你可能会感到很疑惑:我明明已经在我的实体/物品/方块类中像上面说的一样,把两端方法分开写了啊? 127 | 128 | 请检查你的类**成员变量**中是否像这样,有单端对象: 129 | 130 | ```java 131 | //来自之前版本的Extinguish, 由于过时而采用BSD-3 132 | public abstract class AbstractFireExtinguisher extends Item { 133 | private final int maxTime; 134 | private static final Predicate ALL_BUT_SPECTATOR = entity -> !entity.isSpectator(); 135 | private static final double INTERACT_DISTANCE = 7; 136 | FollowingSoundInstance soundInstanceBuffer = null; 137 | ... 138 | ``` 139 | 140 | > 其中的`FollowingSoundInstance`继承自`SimpleSoundInstance`,而`SimpleSoundInstance`显然有着`@OnlyIn`的注解。 141 | 142 | 如此的话,你需要在你的单端方法上也加上`@OnlyIn`的注解(成员变量的定义处也加上),这样Forge/FML就会替你把这个方法也变成仅客户端可见的: 143 | 144 | ```java 145 | ... 146 | @OnlyIn(Dist.CLIENT) 147 | FollowingSoundInstance soundInstanceBuffer = null; 148 | ... 149 | //来自之前版本的Extinguish, 由于过时而采用BSD-3 150 | @OnlyIn(Dist.CLIENT) 151 | public void stopClientSound() { 152 | if (soundInstanceBuffer != null) { 153 | Minecraft.getInstance().getSoundManager().stop(soundInstanceBuffer); 154 | soundInstanceBuffer = null; 155 | } 156 | } 157 | ``` 158 | 159 | ### 一些争议 160 | 161 | 一些开发者声称,“没有任何理由在mod中使用`@OnlyIn`。”他们会建议你将类或方法分离出去,写到一个单独的包或者类中,从而完全规避使用它。 162 | 163 | 我的观点是: 164 | 165 | - 你应该仅出于规避`ClassNotFoundException`或者`BootstrapMethodError`之类,由原版使用了`@OnlyIn`,但你没有专门处理而产生的错误。是的,这种情况也可以通过上述的分离来解决,但大多数适合是不划算的——我可能只是需要一行`Minecraft.getInstance()...;`,而不是什么复杂的逻辑。而当你的逻辑达到一定长度时,你就更可能需要将他们拆分出去——但总之这是你的自由。 166 | - 但另一种情况是,你编写了某个类或者方法,想(在以后)提醒你自己或其他开发者只能在客户端使用他们。这样的话,你更应该在你的包、类或方法名称里加上`Client`字样来区分——而不是使用`@OnlyIn`。 167 | 168 | 综上,我只推荐你被动地使用`@OnlyIn`,而不应该主动地使用它——鬼知道以后会在哪里给你搞出`ClassNotFoundException`。 169 | 170 | 171 | 172 | ## 数据同步 173 | 174 | 显然我们需要时不时地把服务端的变动同步到客户端,把客户端的输入同步到服务端,不然两边都不知道对面在干嘛。 175 | 176 | 好消息是,MC已经给我们造好了一大堆轮子可以直接使用。坏消息是,有些时候这些原版提供的轮子并不够用,需要我们手动发包同步。不同类有不同的方法来进行同步,而最通用的方式是手动发包,我将会在[5 网络包](/holojaneway/5)一节讲解。其他方式的详细内容会在涉及到的时候再讲。 177 | 178 | --- 179 | 180 | ## 奇奇怪怪的注意事项 181 | 182 | ### OnlyIn,但是为什么? 183 | 184 | 从1.21.7开始,由于你不能再使用@OnlyIn,就需要额外注意客户端与服务端代码分离。考虑这样一个示例: 185 | 186 | ```java 187 | public class Example { 188 | public void foo(){ 189 | Minecraft.getInstance()...; 190 | } 191 | 192 | public void bar(){ 193 | System.out.println("bar"); 194 | } 195 | } 196 | ``` 197 | 198 | 显然你不能在服务端调用`example.foo()`,这会立即导致`ClassNotFoundException/NoClassDefFoundError`。 199 | 200 | 但是如果在服务端调用`example.bar()`呢?我们都知道实际的类加载只会在程序跑到那里时才会触发,是否意味着只要我们私下约定不在服务端调用`foo()`,就不会出问题? 201 | 202 | 并非如此。显然,在你获取`example`对象之前,JVM需要先加载`Example`这个类。在加载过程中,JVM还需要进行验证、解析、链接等操作,而在这些操作中,根据不同的实现,JVM可以把类的方法中局部用到的类也一并加载。 203 | 204 | 然后,boom——但是这样听起来很不合理,对吧?我明明可以信心十足地约定或保证`foo()`不会在服务端被用到,何苦一定要拆成`ExampleC`和`ExampleS`两个类呢? 205 | 206 | 当然也有办法,我们注意到刚才只是说“JVM可以把类的方法中局部用到的类也一并加载”,那我们可以把`foo()`的内容用一个`Runnable`套起来,就像这样: 207 | 208 | ```java 209 | public void foo(){ 210 | Runnable run = new Runnable(){ 211 | public void run(){ 212 | Minecraft.getInstance()...; 213 | } 214 | } 215 | run.run(); 216 | } 217 | ``` 218 | 219 | 当`Example`加载的时候,就只会加载到`Runnable`这个类——而这个类本身里面什么也没有。等到真正开始执行`foo()`,才会尝试加载`Minecraft`类。 220 | 221 | :::info 222 | 223 | 编译器或许还会提示你,`new Runnable()`可以写成lambda形式——在这里是万万不能的。`new Runnable(){}`是创建了一个新的匿名内部类,而lambda表达式则会直接调用`lambdaMetaFactory`来进行处理,在此过程中仍然会导致加载方法体内的内容。这是一个值得注意的微妙差别。 224 | 225 | ::: 226 | 227 | 当然这样并不方便,你或许可以像T88一样搞个编译器插件,甚至是直接用Manifold插件写个宏——但尽量还是直接分成两个类吧。 228 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/性能与配置.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: config 3 | title: 设置与性能 4 | hide_table_of_contents: false 5 | 6 | --- 7 | 8 | # 设置与性能 9 | 10 | --- 11 | 12 | ## 设置 13 | 14 | 在Forge版本的游戏中默认按下`Alt+M`,你就能打开`MadParticle Designer GUI`,找到`设置`界面。 15 | 16 | 以下提到的所有设置项,在必要的情况下,都可以在`.minecraft/config/MadParticleConfig.json`中手动更改。 17 | 18 | ## 通用 19 | 20 | ### 最大粒子数量 21 | 22 | 滑块的数值范围是8192~1000000。 23 | 24 | 在原版设定下,每种`RenderType`各自的粒子数量最大为16384,而我们通常只使用有限的一两种`RenderType`,在这种情况下使得世界内粒子最大数量相当于16384。MadParticle允许你自由调整此值。 25 | 26 | :::info 27 | 28 | MadParticle的最初设计应用是线上多人展会或类似场景,由于各个玩家硬件状况不同,在这种情况下: 29 | 30 | - 如果粒子指定的[渲染类型](command#rendertype)是`实例化`,我们建议将场景粒子总数控制在100000以内; 31 | - 如果粒子指定的渲染类型是`半透明`或`不透明`,我们建议将场景粒子总数控制在8000以内。 32 | 33 | ::: 34 | 35 | ### 始终限制最大生成距离 36 | 37 | 当粒子生成时,其与摄像机的距离将有两道阈值: 38 | 39 | 1. **一般最大生成距离**:视距的一半,只有[始终渲染](command#lifetime-alwaysrender-amount)为`true`的粒子可以在这个距离外生成; 40 | 1. **强制最大生成距离**:视距的两倍,即使是始终渲染为`true`的粒子也不能在此距离外生成。将*始终限制最大生成距离*设置为*否*可以取消掉此限制。 41 | 42 | ### 辅助线程数 43 | 44 | :::info 45 | 46 | 循环按钮的排列顺序为`仅主线程`(值为1)、`6`、`4`、`8`、`12`、`2`。默认值为`4`。如需要未提供的其他值,请直接修改配置文件。 47 | 48 | ::: 49 | 50 | 指定有多少辅助线程将被用于辅助计算,通常推荐这个值略小于或等于你的CPU核心数量。 51 | 52 | - 大于核心数时辅助线程之间会产生竞争,从而使得效率降低; 53 | - 等于核心数时, 54 | - 后台的其他程序可能会与Minecraft产生竞争,影响后台程序运行; 55 | - Minecraft切换到主线程所花的时间可能会更久,使游戏帧数产生明显波动,故只推荐用在追求最高效率的固定场景; 56 | 57 | :::info 58 | 59 | 上文提到的“CPU核心数量”不考虑超线程技术,仅指物理核心。 60 | 61 | 对于混合架构用户,目前MadParticle还做不到区分大小核并智能分配任务,您可能需要手动指定Minecraft仅在大核上运行。在这种情况下,你可以将*辅助线程数*指定等于您的大核(P-core)数量。 62 | 63 | ::: 64 | 65 | :::tip 66 | 67 | 服务端解析`/mp`指令所使用的多线程不受此限制。 68 | 69 | ::: 70 | 71 | ### 半透明处理方式 72 | 73 | 半透明面作为图形学经典问题,MadParticle允许你选择你想要的半透明处理方式。 74 | 75 | - **深度测试:启用**:原版方法。不同深度的重叠粒子只会有一个或几个被渲染,适用于不透明粒子占多数的场景。 76 | - **深度测试:禁用**:不同深度的重叠粒子被直接叠加在一起,而不考虑其具体的深度大小。适用于同种半透明粒子占多数的场景。 77 | - **加权混合OIT**:顺序无关半透明(Order Independent Transparency)的简单加权方式实现,通过特定公式由透明度和深度计算出权重再进行叠加,可以实现较为正确的半透明渲染。普遍适用于多种场景,但性能消耗比前两者稍大。 78 | 79 | :::info 80 | 81 | **深度**:想象从摄像机中向前射出一条线,这条线依次由近及远穿过了多个半透明面,这些面具有不同的“深度”。 82 | 83 | ::: 84 | 85 | --- 86 | 87 | ## 附加 88 | 89 | ### 接管粒子渲染 90 | 91 | 循环按钮为`不接管`、`仅原版`、`原版及其他Mod`。默认为`仅原版`。 92 | 93 | - 设为`仅原版`时,MadParticle会把**大部分**原版粒子的渲染方式修改为`实例化`,从而极大地提升性能; 94 | - 设为`原版及其他Mod`时,MadParticle会把**所有**渲染类型为`半透明`或`不透明`的粒子修改为`实例化`。这会使得一些具有特殊渲染的粒子不再遵循其自身的渲染逻辑,因此一般不建议使用。 95 | 96 | ### 接管粒子计算 97 | 98 | 循环按钮为`不接管`、`仅原版`、`原版及其他Mod`。默认为`原版及其他Mod`。 99 | 100 | - 设为`不接管`时,粒子计算(tick)将按原版逻辑在主线程中执行(包括MadParticle粒子); 101 | - 设为`仅原版`时,**全部原版**(除非我找漏了)粒子和MadParticle粒子的计算将会并行化,从而提升性能。由于需要额外过滤其他Mod粒子,性能会略低于`原版及其他Mod`模式; 102 | - 设为`原版及其他Mod`时,**全部**粒子计算将会并行化,按*辅助线程数*分摊任务。通常情况下不需要额外关心,如果有其他Mod粒子产生错误从而需要特别地将其调回主线程,你可以手动选择`仅原版`。 103 | 104 | ### 改进命令方块编辑界面 105 | 106 | 拉长命令方块的输入框,并在其下方增加一个直接跳转至`Designer GUI`的按钮。 107 | 108 | ### 粒子计数器 109 | 110 | 在左上角显示一个简易的临时计数器。和完整的`F3`相比可以节省性能。 111 | 112 | --- 113 | 114 | ## 光照缓存 115 | 116 | 在以摄像机为中心的一个柱形范围内,方块坐标的光照值会被以最快速的方式缓存,但这种方式会消耗一定的内存。 117 | 118 | ### 水平范围、垂直范围 119 | 120 | 指定如上所述柱形的大小。 121 | 122 | ### 强制光照为15 123 | 124 | 跳过所有光照计算,直接将光照强制设置为15(最亮)。可以取得最好的性能。 125 | 126 | ### 刷新间隔 127 | 128 | 缓存刷新间隔越短,消耗的性能也越多。如果摄像机(玩家)往往在高速移动,那就需要更小的刷新间隔以避免出现黑色伪影。 129 | 130 | --- 131 | 132 | ## 性能:原理 133 | 134 | 游戏帧率会受硬件性能、运行环境、软件性能、设置选择、实际场景等许多方面影响。 135 | 136 | ### 1.1 实例化 137 | 138 | 实例化渲染(Instanced Rendering)使得CPU-GPU通信几乎完全不再是渲染瓶颈,能在有大量重复元素时提高帧率。简单来讲,原版粒子的渲染方式逐个地把粒子的数据发送给GPU,有多少粒子就发多少次;实例化渲染是一次性把所有的粒子的数据都发送给GPU,无论多少粒子都只用发一次。 139 | 140 | 你可以把粒子命令中的[渲染类型](command#rendertype)设为`实例化`来启用此技术。 141 | 142 | 我们也支持把原版粒子或/和其他Mod的粒子渲染类型从`半透明`或`不透明`的粒子修改为`实例化`。这会使一些具有特殊渲染方法的粒子不再执行其本身的渲染方法,我们已经对原版粒子做了过滤,但对其他Mod的粒子暂时没什么好办法。如果你能容忍其他Mod的粒子的画面错误那你可以把`仅原版`改为`原版及其他Mod`以获得最大效率。 143 | 144 | 以下是**可以**进行实例化渲染的粒子列表,不在此列表内的粒子不进行实例化渲染: 145 | 146 | ``` 147 | (此列表可能不会得到及时更新,故可能与实际实现有偶尔出入。) 148 | SnowflakeParticle, 149 | SpitParticle, 150 | SpellParticle, 151 | HeartParticle, 152 | BubbleParticle, 153 | BubbleColumnUpParticle, 154 | BubblePopParticle, 155 | CampfireSmokeParticle, 156 | PlayerCloudParticle, 157 | SuspendedTownParticle, 158 | CritParticle, 159 | WaterCurrentDownParticle, 160 | DragonBreathParticle, 161 | DripParticle, 162 | DustParticle, 163 | EnchantmentTableParticle, 164 | EndRodParticle, 165 | FallingDustParticle, 166 | WakeParticle, 167 | FlameParticle, 168 | SoulParticle, 169 | SculkChargeParticle, 170 | SculkChargePopParticle, 171 | LargeSmokeParticle, 172 | LavaParticle, 173 | NoteParticle, 174 | ExplodeParticle, 175 | PortalParticle, 176 | WaterDropParticle, 177 | SmokeParticle, 178 | SplashParticle, 179 | TotemParticle, 180 | SquidInkParticle, 181 | SuspendedParticle, 182 | ReversePortalParticle, 183 | WhiteAshParticle, 184 | GlowParticle 185 | ``` 186 | 187 | ### 1.2 并行填充 188 | 189 | 既然是一次性发送所有粒子的数据,那自然需要CPU先把这些数据填入缓冲区。在消除CPU-GPU通信瓶颈之后,影响帧率的主要瓶颈就是CPU进行各类运算所花的时间。 190 | 191 | 很幸运地,我们可以便利地利用所有能用的CPU核心来执行填缓冲区的任务而不需要考虑经典的多线程同步/阻塞问题,这使你在上文中选择的*辅助线程数*对这项工作可以有几乎线性的影响——两个核心需要原来一半的时间,32个核心就只需要原来1/32的时间。当然,如果你的CPU确实有这么多核心,那内存和CPU-GPU带宽可能会成为新的瓶颈。 192 | 193 | ### 2.1 并行计算 194 | 195 | 除了帧内计算要消耗时间,帧间计算也要消耗许多时间——这里特指粒子的tick计算。 196 | 197 | 原则上讲,粒子与世界应该是几乎独立的:作为一种最初目的是仅客户端的锦上添花的装饰物,除了需要进行碰撞计算的读取外,不应该对世界造成任何影响。同样地,我们也可以把计算并行化,有几个核心就只需要几分之一的时间。 198 | 199 | 为了预防有其他Mod的粒子不符合这个原则,我们预留了`仅原版`选项,使其他Mod的粒子留在主线程里计算。但这样就需要额外的筛选,造成一些性能损失。 200 | 201 | 以下是**可以**进行并行计算的原版粒子列表,不在此列表内的粒子不能进行并行计算: 202 | 203 | ``` 204 | (此列表可能不会得到及时更新,故可能与实际实现有偶尔出入。) 205 | BlockMarker, 206 | TerrainParticle, 207 | DustColorTransitionParticle, 208 | HugeExplosionSeedParticle, 209 | HugeExplosionParticle, 210 | SonicBoomParticle, 211 | FallingDustParticle, 212 | FireworkParticles.OverlayParticle, 213 | SnowflakeParticle, 214 | SpitParticle, 215 | AttackSweepParticle, 216 | VibrationSignalParticle, 217 | ShriekParticle, 218 | SpellParticle, 219 | HeartParticle, 220 | BubbleParticle, 221 | BubbleColumnUpParticle, 222 | BubblePopParticle, 223 | CampfireSmokeParticle, 224 | PlayerCloudParticle, 225 | SuspendedTownParticle, 226 | CritParticle, 227 | WaterCurrentDownParticle, 228 | DragonBreathParticle, 229 | DripParticle, 230 | DustParticle, 231 | EnchantmentTableParticle, 232 | EndRodParticle, 233 | FallingDustParticle, 234 | WakeParticle, 235 | FlameParticle, 236 | SoulParticle, 237 | SculkChargeParticle, 238 | SculkChargePopParticle, 239 | LargeSmokeParticle, 240 | NoteParticle, 241 | ExplodeParticle, 242 | PortalParticle, 243 | WaterDropParticle, 244 | SmokeParticle, 245 | SplashParticle, 246 | TotemParticle, 247 | SquidInkParticle, 248 | SuspendedParticle, 249 | ReversePortalParticle, 250 | WhiteAshParticle, 251 | GlowParticle 252 | ``` 253 | 254 | ### 2.2 内存压力 255 | 256 | 如上所述,我们成功地增加了计算密度,减少了计算时间。而这会让计算所需内存和GC的压力急剧增大。通常情况下我们建议尽可能地在启动器中增大内存分配,以减少频繁Full GC造成的卡顿——甚至是来不及GC造成的内存不足崩溃。 257 | 258 | :::info 259 | 260 | 对于MadParticle粒子,我们已经在新版本中应用了经过极大优化的运动计算代码,大幅减小了内存压力。 261 | 262 | ::: 263 | 264 | ### 3 无能为力 265 | 266 | 在应用以上这些技术之后,如果世界中还有其他传统渲染类型的粒子,或者有其他Mod的粒子要在主线程里计算,那我们无能为力,只能等待它们完成。 267 | 268 | ### 4 粒子本身 269 | 270 | 粒子本身的属性设置相互叠加也会改变系统压力: 271 | 272 | - 粒子移动会增加tick时的计算压力; 273 | - 与方块碰撞会增加tick时的计算,也是内存压力的主要来源之一; 274 | - 过快的速度也可能会增加碰撞计算所需时间; 275 | - 与玩家互动会增加tick时的计算压力; 276 | - 渲染类型决定了粒子的渲染效率,通过`实例化`可以极大地减轻原本的压力; 277 | - Shimmer联动泛光会增加额外渲染时压力; 278 | - 粒子消失时召唤新粒子可能会增加内存压力; 279 | - 数学表达式会在生成粒子时增加一些计算和内存压力; 280 | - 预计算粒子会由于生成前的密集计算可能会极大地增加内存压力。 281 | 282 | ### 5 最后 283 | 284 | 此外,Shimmer、Optifine、Sodium等渲染/优化相关的模组也可能对帧数有显著的影响。 285 | 286 | 总之,在上述诸多因素的影响下,大量粒子场景的性能表现可能会很难有游戏世界空间上、时间上、玩家/设备间的可重复性。同一场景的性能表现可能会在多次测量时有明显差异——但原则性的大方向不受影响。 287 | 288 | ## 性能:测试 289 | 290 | 我们提供并使用以下场景进行性能测试,仅供参考。所有场景均使用一个循环型命令方块,其余统一设置为: 291 | 292 | - Minecraft游戏内设置: 293 | - 图像品质:高品质 294 | - 渲染距离:12区块 295 | - 模拟距离:8区块 296 | - 云:关 297 | - 难度:和平 298 | - 超平坦地形 299 | - MadParticle辅助线程数:与CPU物理核心数相同 300 | 301 | - 其余场景设置: 302 | - 操作系统:Windows 11 23H2(或更新) 303 | - 尽量减少后台程序 304 | 305 | 306 | 以下指令均以50000粒子为例。 307 | 308 | :::info 309 | 310 | 以下场景的设置原则是简单地兼顾实际使用场景和测试极限性能,故其表现可能与实际情况有所不同。 311 | 312 | ::: 313 | 314 | ### 无物理场景 315 | 316 | #### MadParticle指令 317 | 318 | ``` 319 | mp minecraft:totem_of_undying RANDOM 100 TRUE 500 ~ ~15 ~ 10.0 10.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 FALSE 0 0 0 1 1 0.0 0.0 0 0 0 0 0.0 FALSE 0 0 INSTANCED 0.780 0.170 0.962 0 1.0 1.0 LINEAR 1.00 1.00 LINEAR @a {} 320 | ``` 321 | 322 | ### 有物理场景 323 | 324 | #### MadParticle指令 325 | 326 | ``` 327 | mp minecraft:totem_of_undying RANDOM 200 TRUE 250 ~ ~1 ~ 0.0 0.0 0.0 0.0 0.35 0.0 0.15 0.05 0.15 TRUE 2 1 1 0.99 0.99 0.1 0.1 0 0 0 0 0.00001 FALSE 0 0 INSTANCED 3 0.496 0.000 0 1.0 1 INDEX 1.2 0.8 LINEAR @a {"light":"15-14t^2"} 328 | ``` 329 | 330 | ### 原版优化场景 331 | 332 | #### 原版指令 333 | 334 | ``` 335 | particle minecraft:white_ash ~ ~10 ~ 1 1 1 0 1230 force 336 | ``` 337 | 338 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 80 | -------------------------------------------------------------------------------- /docs/madparticle/性能与配置.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: config 3 | title: 设置与性能 4 | hide_table_of_contents: false 5 | 6 | --- 7 | 8 | # 设置与性能 9 | 10 | --- 11 | 12 | ## 设置 13 | 14 | 在Forge版本的游戏中默认按下`Alt+M`,你就能打开`MadParticle Designer GUI`,找到`设置`界面。 15 | 16 | 以下提到的所有设置项,在必要的情况下,都可以在`.minecraft/config/MadParticleConfig.json`中手动更改。 17 | 18 | ## 通用 19 | 20 | ### 最大粒子数量 21 | 22 | 滑块的数值范围是8192~1000000。 23 | 24 | 在原版设定下,每种`RenderType`各自的粒子数量最大为16384,而我们通常只使用有限的一两种`RenderType`,在这种情况下使得世界内粒子最大数量相当于16384。MadParticle允许你自由调整此值。 25 | 26 | :::info 27 | 28 | MadParticle的最初设计应用是线上多人展会或类似场景,由于各个玩家硬件状况不同,在这种情况下: 29 | 30 | - 如果粒子指定的[渲染类型](command#rendertype)是`实例化`,我们建议将场景粒子总数控制在100000以内; 31 | - 如果粒子指定的渲染类型是`半透明`或`不透明`,我们建议将场景粒子总数控制在8000以内。 32 | 33 | ::: 34 | 35 | ### 始终限制最大生成距离 36 | 37 | 当粒子生成时,其与摄像机的距离将有两道阈值: 38 | 39 | 1. **一般最大生成距离**:视距的一半,只有[始终渲染](command#lifetime-alwaysrender-amount)为`true`的粒子可以在这个距离外生成; 40 | 1. **强制最大生成距离**:视距的两倍,即使是始终渲染为`true`的粒子也不能在此距离外生成。将*始终限制最大生成距离*设置为*否*可以取消掉此限制。 41 | 42 | ### 辅助线程数 43 | 44 | :::info 45 | 46 | 循环按钮的排列顺序为`仅主线程`(值为1)、`6`、`4`、`8`、`12`、`2`。默认值为`4`。如需要未提供的其他值,请直接修改配置文件。 47 | 48 | ::: 49 | 50 | 指定有多少辅助线程将被用于辅助计算,通常推荐这个值略小于或等于你的CPU核心数量。 51 | 52 | - 大于核心数时辅助线程之间会产生竞争,从而使得效率降低; 53 | - 等于核心数时, 54 | - 后台的其他程序可能会与Minecraft产生竞争,影响后台程序运行; 55 | - Minecraft切换到主线程所花的时间可能会更久,使游戏帧数产生明显波动,故只推荐用在追求最高效率的固定场景; 56 | 57 | :::info 58 | 59 | 上文提到的“CPU核心数量”不考虑超线程技术,仅指物理核心。 60 | 61 | 对于混合架构用户,目前MadParticle还做不到区分大小核并智能分配任务,您可能需要手动指定Minecraft仅在大核上运行。在这种情况下,你可以将*辅助线程数*指定等于您的大核(P-core)数量。 62 | 63 | ::: 64 | 65 | :::tip 66 | 67 | 服务端解析`/mp`指令所使用的多线程不受此限制。 68 | 69 | ::: 70 | 71 | ### 半透明处理方式 72 | 73 | 半透明面作为图形学经典问题,MadParticle允许你选择你想要的半透明处理方式。 74 | 75 | - **深度测试:启用**:原版方法。不同深度的重叠粒子只会有一个或几个被渲染,适用于不透明粒子占多数的场景。 76 | - **深度测试:禁用**:不同深度的重叠粒子被直接叠加在一起,而不考虑其具体的深度大小。适用于同种半透明粒子占多数的场景。 77 | - **加权混合OIT**:顺序无关半透明(Order Independent Transparency)的简单加权方式实现,通过特定公式由透明度和深度计算出权重再进行叠加,可以实现较为正确的半透明渲染。普遍适用于多种场景,但性能消耗比前两者稍大。 78 | 79 | :::info 80 | 81 | **深度**:想象从摄像机中向前射出一条线,这条线依次由近及远穿过了多个半透明面,这些面具有不同的“深度”。 82 | 83 | ::: 84 | 85 | --- 86 | 87 | ## 附加 88 | 89 | ### 接管粒子渲染 90 | 91 | 循环按钮为`不接管`、`仅原版`、`原版及其他Mod`。默认为`仅原版`。 92 | 93 | - 设为`仅原版`时,MadParticle会把**大部分**原版粒子的渲染方式修改为`实例化`,从而极大地提升性能; 94 | - 设为`原版及其他Mod`时,MadParticle会把**所有**渲染类型为`半透明`或`不透明`的粒子修改为`实例化`。这会使得一些具有特殊渲染的粒子不再遵循其自身的渲染逻辑,因此一般不建议使用。 95 | 96 | ### 接管粒子计算 97 | 98 | 循环按钮为`不接管`、`仅原版`、`原版及其他Mod`。默认为`原版及其他Mod`。 99 | 100 | - 设为`不接管`时,粒子计算(tick)将按原版逻辑在主线程中执行(包括MadParticle粒子); 101 | - 设为`仅原版`时,**全部原版**(除非我找漏了)粒子和MadParticle粒子的计算将会并行化,从而提升性能。由于需要额外过滤其他Mod粒子,性能会略低于`原版及其他Mod`模式; 102 | - 设为`原版及其他Mod`时,**全部**粒子计算将会并行化,按*辅助线程数*分摊任务。通常情况下不需要额外关心,如果有其他Mod粒子产生错误从而需要特别地将其调回主线程,你可以手动选择`仅原版`。 103 | 104 | ### 改进命令方块编辑界面 105 | 106 | 拉长命令方块的输入框,并在其下方增加一个直接跳转至`Designer GUI`的按钮。 107 | 108 | ### 粒子计数器 109 | 110 | 在左上角显示一个简易的临时计数器。和完整的`F3`相比可以节省性能。 111 | 112 | --- 113 | 114 | ## 光照缓存 115 | 116 | 在以摄像机为中心的一个柱形范围内,方块坐标的光照值会被以最快速的方式缓存,但这种方式会消耗一定的内存。 117 | 118 | ### 水平范围、垂直范围 119 | 120 | 指定如上所述柱形的大小。 121 | 122 | ### 强制光照为15 123 | 124 | 跳过所有光照计算,直接将光照强制设置为15(最亮)。可以取得最好的性能。 125 | 126 | ### 刷新间隔 127 | 128 | 缓存刷新间隔越短,消耗的性能也越多。如果摄像机(玩家)往往在高速移动,那就需要更小的刷新间隔以避免出现黑色伪影。 129 | 130 | --- 131 | 132 | ## 性能:原理 133 | 134 | 游戏帧率会受硬件性能、运行环境、软件性能、设置选择、实际场景等许多方面影响。 135 | 136 | ### 1.1 实例化 137 | 138 | 实例化渲染(Instanced Rendering)使得CPU-GPU通信几乎完全不再是渲染瓶颈,能在有大量重复元素时提高帧率。简单来讲,原版粒子的渲染方式逐个地把粒子的数据发送给GPU,有多少粒子就发多少次;实例化渲染是一次性把所有的粒子的数据都发送给GPU,无论多少粒子都只用发一次。 139 | 140 | 你可以把粒子命令中的[渲染类型](command#rendertype)设为`实例化`来启用此技术。 141 | 142 | 我们也支持把原版粒子或/和其他Mod的粒子渲染类型从`半透明`或`不透明`的粒子修改为`实例化`。这会使一些具有特殊渲染方法的粒子不再执行其本身的渲染方法,我们已经对原版粒子做了过滤,但对其他Mod的粒子暂时没什么好办法。如果你能容忍其他Mod的粒子的画面错误那你可以把`仅原版`改为`原版及其他Mod`以获得最大效率。 143 | 144 | 以下是**可以**进行实例化渲染的粒子列表,不在此列表内的粒子不进行实例化渲染: 145 | 146 | ``` 147 | (此列表可能不会得到及时更新,故可能与实际实现有偶尔出入。) 148 | SnowflakeParticle, 149 | SpitParticle, 150 | SpellParticle, 151 | HeartParticle, 152 | BubbleParticle, 153 | BubbleColumnUpParticle, 154 | BubblePopParticle, 155 | CampfireSmokeParticle, 156 | PlayerCloudParticle, 157 | SuspendedTownParticle, 158 | CritParticle, 159 | WaterCurrentDownParticle, 160 | DragonBreathParticle, 161 | DripParticle, 162 | DustParticle, 163 | EnchantmentTableParticle, 164 | EndRodParticle, 165 | FallingDustParticle, 166 | WakeParticle, 167 | FlameParticle, 168 | SoulParticle, 169 | SculkChargeParticle, 170 | SculkChargePopParticle, 171 | LargeSmokeParticle, 172 | LavaParticle, 173 | NoteParticle, 174 | ExplodeParticle, 175 | PortalParticle, 176 | WaterDropParticle, 177 | SmokeParticle, 178 | SplashParticle, 179 | TotemParticle, 180 | SquidInkParticle, 181 | SuspendedParticle, 182 | ReversePortalParticle, 183 | WhiteAshParticle, 184 | GlowParticle 185 | ``` 186 | 187 | ### 1.2 并行填充 188 | 189 | 既然是一次性发送所有粒子的数据,那自然需要CPU先把这些数据填入缓冲区。在消除CPU-GPU通信瓶颈之后,影响帧率的主要瓶颈就是CPU进行各类运算所花的时间。 190 | 191 | 很幸运地,我们可以便利地利用所有能用的CPU核心来执行填缓冲区的任务而不需要考虑经典的多线程同步/阻塞问题,这使你在上文中选择的*辅助线程数*对这项工作可以有几乎线性的影响——两个核心需要原来一半的时间,32个核心就只需要原来1/32的时间。当然,如果你的CPU确实有这么多核心,那内存和CPU-GPU带宽可能会成为新的瓶颈。 192 | 193 | ### 2.1 并行计算 194 | 195 | 除了帧内计算要消耗时间,帧间计算也要消耗许多时间——这里特指粒子的tick计算。 196 | 197 | 原则上讲,粒子与世界应该是几乎独立的:作为一种最初目的是仅客户端的锦上添花的装饰物,除了需要进行碰撞计算的读取外,不应该对世界造成任何影响。同样地,我们也可以把计算并行化,有几个核心就只需要几分之一的时间。 198 | 199 | 为了预防有其他Mod的粒子不符合这个原则,我们预留了`仅原版`选项,使其他Mod的粒子留在主线程里计算。但这样就需要额外的筛选,造成一些性能损失。 200 | 201 | 以下是**可以**进行并行计算的原版粒子列表,不在此列表内的粒子不能进行并行计算: 202 | 203 | ``` 204 | (此列表可能不会得到及时更新,故可能与实际实现有偶尔出入。) 205 | BlockMarker, 206 | TerrainParticle, 207 | DustColorTransitionParticle, 208 | HugeExplosionSeedParticle, 209 | HugeExplosionParticle, 210 | SonicBoomParticle, 211 | FallingDustParticle, 212 | FireworkParticles.OverlayParticle, 213 | SnowflakeParticle, 214 | SpitParticle, 215 | AttackSweepParticle, 216 | VibrationSignalParticle, 217 | ShriekParticle, 218 | SpellParticle, 219 | HeartParticle, 220 | BubbleParticle, 221 | BubbleColumnUpParticle, 222 | BubblePopParticle, 223 | CampfireSmokeParticle, 224 | PlayerCloudParticle, 225 | SuspendedTownParticle, 226 | CritParticle, 227 | WaterCurrentDownParticle, 228 | DragonBreathParticle, 229 | DripParticle, 230 | DustParticle, 231 | EnchantmentTableParticle, 232 | EndRodParticle, 233 | FallingDustParticle, 234 | WakeParticle, 235 | FlameParticle, 236 | SoulParticle, 237 | SculkChargeParticle, 238 | SculkChargePopParticle, 239 | LargeSmokeParticle, 240 | NoteParticle, 241 | ExplodeParticle, 242 | PortalParticle, 243 | WaterDropParticle, 244 | SmokeParticle, 245 | SplashParticle, 246 | TotemParticle, 247 | SquidInkParticle, 248 | SuspendedParticle, 249 | ReversePortalParticle, 250 | WhiteAshParticle, 251 | GlowParticle 252 | ``` 253 | 254 | ### 2.2 内存压力 255 | 256 | 如上所述,我们成功地增加了计算密度,减少了计算时间。而这会让计算所需内存和GC的压力急剧增大。通常情况下我们建议尽可能地在启动器中增大内存分配,以减少频繁Full GC造成的卡顿——甚至是来不及GC造成的内存不足崩溃。 257 | 258 | :::info 259 | 260 | 对于MadParticle粒子,我们已经在新版本中应用了经过极大优化的运动计算代码,大幅减小了内存压力。 261 | 262 | ::: 263 | 264 | ### 3 无能为力 265 | 266 | 在应用以上这些技术之后,如果世界中还有其他传统渲染类型的粒子,或者有其他Mod的粒子要在主线程里计算,那我们无能为力,只能等待它们完成。 267 | 268 | ### 4 粒子本身 269 | 270 | 粒子本身的属性设置相互叠加也会改变系统压力: 271 | 272 | - 粒子移动会增加tick时的计算压力; 273 | - 与方块碰撞会增加tick时的计算,也是内存压力的主要来源之一; 274 | - 过快的速度也可能会增加碰撞计算所需时间; 275 | - 与玩家互动会增加tick时的计算压力; 276 | - 渲染类型决定了粒子的渲染效率,通过`实例化`可以极大地减轻原本的压力; 277 | - Shimmer联动泛光会增加额外渲染时压力; 278 | - 粒子消失时召唤新粒子可能会增加内存压力; 279 | - 数学表达式会在生成粒子时增加一些计算和内存压力; 280 | - 预计算粒子会由于生成前的密集计算可能会极大地增加内存压力。 281 | 282 | ### 5 最后 283 | 284 | 此外,Shimmer、Optifine、Sodium等渲染/优化相关的模组也可能对帧数有显著的影响。 285 | 286 | 总之,在上述诸多因素的影响下,大量粒子场景的性能表现可能会很难有游戏世界空间上、时间上、玩家/设备间的可重复性。同一场景的性能表现可能会在多次测量时有明显差异——但原则性的大方向不受影响。 287 | 288 | ## 性能:测试 289 | 290 | 我们提供并使用以下场景进行性能测试,仅供参考。所有场景均使用一个循环型命令方块,其余统一设置为: 291 | 292 | - Minecraft游戏内设置: 293 | - 图像品质:高品质 294 | - 渲染距离:12区块 295 | - 模拟距离:8区块 296 | - 云:关 297 | - 难度:和平 298 | - 超平坦地形 299 | - MadParticle辅助线程数:与CPU物理核心数相同 300 | 301 | - 其余场景设置: 302 | - 操作系统:Windows 11 23H2(或更新) 303 | - 尽量减少后台程序 304 | 305 | 306 | 以下指令均以50000粒子为例。 307 | 308 | :::info 309 | 310 | 以下场景的设置原则是简单地兼顾实际使用场景和测试极限性能,故其表现可能与实际情况有所不同。 311 | 312 | ::: 313 | 314 | ### 无物理场景 315 | 316 | #### MadParticle指令 317 | 318 | ``` 319 | mp minecraft:totem_of_undying RANDOM 100 TRUE 500 ~ ~15 ~ 10.0 10.0 10.0 0.0 0.0 0.0 0.0 0.0 0.0 FALSE 0 0 0 1 1 0.0 0.0 0 0 0 0 0.0 FALSE 0 0 INSTANCED 0.780 0.170 0.962 0 1.0 1.0 LINEAR 1.00 1.00 LINEAR @a {} 320 | ``` 321 | 322 | ### 有物理场景 323 | 324 | #### MadParticle指令 325 | 326 | ``` 327 | mp minecraft:totem_of_undying RANDOM 200 TRUE 250 ~ ~1 ~ 0.0 0.0 0.0 0.0 0.35 0.0 0.15 0.05 0.15 TRUE 2 1 1 0.99 0.99 0.1 0.1 0 0 0 0 0.00001 FALSE 0 0 INSTANCED 3 0.496 0.000 0 1.0 1 INDEX 1.2 0.8 LINEAR @a {"light":"15-14t^2"} 328 | ``` 329 | 330 | ### 原版优化场景 331 | 332 | #### 原版指令 333 | 334 | ``` 335 | particle minecraft:white_ash ~ ~10 ~ 1 1 1 0 1230 force 336 | ``` 337 | 338 | -------------------------------------------------------------------------------- /docs/holojaneway/0.1 可能与法律相关的问题.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 0.1 3 | title: 0.1 许可证,法律与协作 4 | description: 许可证,法律与协作 5 | hide_table_of_contents: false 6 | sidebar_position: 101 7 | --- 8 | 9 | # 许可证,法律与协作 10 | 11 | 在你正式开始为你的mod编写实际内容之前,你需要了解下面的内容。它们虽然并不直接涉及你的mod内容,但是其重要性不可忽视。 12 | 13 | --- 14 | 15 | ## 本教程采用的许可证 16 | 17 | Creative Commons License 18 | 19 | 本教程的**文字部分**,在没有特别标明的情况下,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 20 | 21 | 本教程的**代码部分**,在没有特别标明的情况下,采用BSD-3-Clause协议(The 3-Clause BSD License)进行许可;在有标明的情况下,该片段以标明的许可证进行许可。部分代码可能来源于`0 绪论 > 前言`中提到的mod,为了尽可能地减少学习和使用障碍,只有在涉及mod核心功能的情况下,才会被明确标为原本的协议(通常是有附加条款的GPLv3),未明确标明的按BSD-3授权。 22 | 23 | 许可证全文见`-1 附件`。 24 | 25 | ### 省流 26 | 27 | :::caution 注意 28 | 29 | 以下内容不是一个许可证,仅为便于理解而只强调一些关键点,没有法律价值。请以上文提到的许可证内容为准。 30 | 31 | ::: 32 | 33 | 对于**文字部分**: 34 | 35 | > 你可以对这些内容自由地复制、分发、修改、再创作,并将演绎后的作品以其他许可证发布。但是你必须提供适当的署名,包括但不限于指向本教程的链接、本教程的许可声明、作者名称、作者网站等。供参考的署名内容见**附件**。你不可以将此部分及演绎作品用于商业用途。 36 | 37 | 对于**代码部分**,**没有专门标明许可证**,**即使用BSD-3-Clause协议**的部分: 38 | 39 | > 你可以对这些内容自由地复制、分发、修改、再创作,并将演绎后的作品以其他许可证发布。你可以将此部分及演绎作品用于商业用途。你同样也必须提供如上所述的适当署名内容。你不可以以本教程或作者的名义来推广你的演绎作品。 40 | 41 | 对于**代码部分**,**标明为GPLv3许可证**的部分: 42 | 43 | > 你可以对这些内容自由地复制、分发、修改、再创作,但必须将演绎后的作品继续以GPL许可证开源发布。你可以将此部分及演绎作品用于商业用途。你同样也必须提供如上所述的适当署名内容。除此之外,你还需要提供对这些部分的修改说明。 44 | 45 | --- 46 | 47 | :::danger 注意 48 | 49 | 以下内容不是正式的法律建议,您可能需要咨询专业的法律工作者。 50 | 51 | 以下内容不代表Mojang的官方态度,只是个人理解或引用。 52 | 53 | ::: 54 | 55 | ## 刚刚上面这一坨都是啥? 56 | 57 | ### 开源和开源许可证 58 | 59 | 开源即指将你的mod的源代码以某种形式公开(通常是利用GitHub)。借由此,社区成员容易地检查你的代码,及时填补漏洞,帮助你发现和改进问题,增加兼容性,乃至于为你的mod开发附属mod。 60 | 61 | :::info 62 | 63 | **社区**:在这里所说的社区,自然是指Minecraft玩家与开发者的总和。 64 | 65 | **开源(软件)**:不同的组织对开源可能有不同的定义,而由于一些历史和翻译问题,这些定义从“开源就指的是自由软件”到“开源只需要开放源代码”不一而足。我们在这里采用最宽松的定义——只要你通过某种公开途径开放源代码即可。 66 | 67 | **自由(软件)**:与开源不同,自由软件有着明确且严格的定义。自由软件基金会对其定义如下: 68 | 69 | > - 自由度0:无论用户出于何种目的,必须可以按照用户意愿,自由地运行该软件。 70 | > - 自由度1:用户可以自由地学习并修改该软件,以此来帮助用户完成用户自己的计算。作为前提,用户必须可以访问到该软件的源代码。 71 | > - 自由度2:用户可以自由地分发该软件的拷贝,这样就可以助人。 72 | > - 自由度3:用户可以自由地分发该软件修改后的拷贝。借此,用户可以把改进后的软件分享给整个社区令他人也从中受益。作为前提,用户必须可以访问到该软件的源代码。 73 | > 74 | > 一个软件只有提供了以上所有的自由给它的用户,才可以被成为自由软件。 75 | 76 | 由这里你可以看出:大多数mod都是开源的(我们也提倡和鼓励这样);但其中一部分mod可能有禁止商业使用的条款(例如CC BY-NC许可证),这使得这部分mod不是自由的。 77 | 78 | ::: 79 | 80 | 你自然地拥有对你原创mod的著作权和版权。在一些时候,你需要向别人授予一些权利: 81 | 82 | - 其他开发者想要帮助你改进模组,即使你开放了源代码的获取,他们也需要复制和修改的权利; 83 | - 其他开发者想要将你的mod移植到Fabric,这需要复制、修改和再发行的权利; 84 | - 玩家希望将mod文件转载到其他平台,这需要复制和分发的权利。 85 | 86 | 而随着时间与项目的积累,作者对作品著作权的放宽或限制,逐渐有了某种常用而公认的集合,这就是开源协议,也叫开源许可证。 87 | 88 | 成文的开源协议方便地规范了使用者的行为,从最紧到最宽松,大概有这几种分类: 89 | 90 | - 保留所有权利(在作者没有写明开源协议时的默认选项,这不是一个自由许可证) 91 | - 著左权许可证(Copyleft,限制较为严格的开源协议种类) 92 | - 宽松许可证(限制较为宽松的开源协议种类) 93 | - 公有领域许可证(限制最宽松的开源协议种类) 94 | 95 | ### 有哪些许可证可供我选择? 96 | 97 | 这里列举出一些常见开源许可证,大体由严格到宽松,仅供参考。在做出选择前,你应该查看它们的详细内容: 98 | 99 | - "**All rights reserved**",即“保留所有权利”,简称ARR:这意味着你可以对mod的分发、修改等制定任何你想要的(在法律范围内)的限制。 100 | - 非正式许可证:开发者在ARR基础上自行规定的许可证。当然,对普通人而言,很难写出在法律意义上与自己期望相符的、全面而有效的条款。不同国家的法律对非正式许可证可能有着不同的认可程度,在中国,据我所知目前没有与非正式许可证有关的判例或规定。 101 | 102 | - [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.zh-cn.html),简称GPLv3:特点是让对你mod进行的修改也要开源。如果你有“我想看看你们都干了什么好事”的想法,那GPLv3很合适。 103 | 104 | :::caution 注意 105 | 106 | 这里有一个小问题:你的mod符合GNU对“组合程序”的说明,而Minecraft并不是一个自由软件。这使得你不能直接使用GPL许可证。你可以选择借助GPLv3的第七节,参考**[这个说明](https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs)**,为MC添加一个例外。 107 | 108 | 更多信息可以在**[这个说明及其链接问题](https://www.gnu.org/licenses/gpl-faq.html#GPLPlugins)**里找到。 109 | 110 | 为了规避这个问题,你可以选择**[LGPLv3](https://www.gnu.org/licenses/lgpl-3.0.html)**。不过它更多地适用于库模组而不是普通模组。 111 | 112 | ::: 113 | 114 | - [APACHE LICENSE, VERSION 2.0](https://www.apache.org/licenses/LICENSE-2.0.html),简称Apache 2.0:特点是在修改你的mod是必须保留你的版权信息。没什么特别的。 115 | - [The 3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause),简称BSD3:特点是不允许其他人修改后的mod借你的名义宣传。除此之外很宽松。 116 | - [The MIT License](https://mit-license.org/),简称MIT:只要别人修改时保留你原来的许可就行。 117 | 118 | :::tip 119 | 120 | 你可能发现MIT与上面的Apache 2.0有些相似——其实有很多许可证不同的重点在于专利、商标、纠纷等方面。对于一个简单的Minecraft模组而言,它们确实不会有很大区别。 121 | 122 | ::: 123 | 124 | - [CC0](https://creativecommons.org/share-your-work/public-domain/cc0/):与第一个相反,即“放弃所有权利”。使用CC0许可的作品即被视为公有领域作品。 125 | 126 | :::info 127 | 128 | 各式各样的CC协议通常不被用于程序或代码。对于CC0,你可以选择下面这个许可协议作为替代。 129 | 130 | ::: 131 | 132 | - [Do What The Fuck You Want To Public License](http://www.wtfpl.net/about/),简称WTFPL:与CC0相似,“放弃所有权利”。 133 | 134 | ### 如何选择开源许可证? 135 | 136 | :::caution 注意 137 | 138 | 选择不正确的许可证可能会使您受到不必要的损失。您可能需要咨询专业的法律工作者。 139 | 140 | ::: 141 | 142 | 以下是一些可能有用的链接。 143 | 144 | - [帮助你选择你的许可证](https://choosealicense.com/ )。适合新手入门了解各主流许可证。英文。 145 | - [《各类许可证及其评论》](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses )。覆盖面相当广。有中文翻译页面。 146 | - [*Beginner's Guide to Licensing your Mods*](https://blog.modrinth.com/licensing-guide/ )。同样适合新手入门了解各种许可方式。英文。 147 | 148 | 以下问题可能也可以帮助你选择: 149 | 150 | - 如果你觉得没什么好保留的,欢迎任何人游玩、分发,其他开发者也可以在你的基础上制作自己的版本,随便怎么折腾都行:你可以选择MIT许可证。 151 | 152 | 153 | 154 | - 如果你想知道别人的衍生版本里面都有些啥:你可以选择GPLv3许可证。不过要记得上面提到的注意事项。 155 | 156 | 157 | 158 | - 如果你不想让别人的衍生版本借你的名义宣传:你可以给GPLv3许可证增加附加条款(其第7节允许你这样做);或是使用BSD-3许可证。 159 | 160 | 161 | 162 | - 如果你不想让别人在商业服务器里使用你的模组,或是不想允许别人修改你的模组,或是不想允许别人转发你的模组:这将使你的模组不是自由软件。你几乎只能使用非正式许可证来声明这些限制,或是,尽管不推荐,使用CC协议的各个版本来偷懒。 163 | 164 | 165 | 166 | ### 为什么我们提倡把mod开源? 167 | 168 | > 开源(Open Source)是人类在互联网发展进程中探索出的一种面向全球的大规模协作生产方式,它以开放共享、合作共赢为宗旨,有效地推进了全球化进程。 169 | > 170 | > 开源许可证是对开源软件的使用、复制、修改和分发等行为进行规范和约束的一种具有法律效力的格式合同,是开源运动的基石。 171 | > 172 | >
——《木兰宽松许可证》引言
173 | 174 | 本着自由、共享、平等、互利的互联网精神,我提倡您把您的mod在GitHub或者其他开源网站上开源,并在介绍您的mod时给出仓库链接。 175 | 176 | 同时我诚挚地建议您: 177 | 178 | - 在使用他人的项目时,遵守其许可证; 179 | - 在您的项目被违规使用时,站出来寻求帮助; 180 | - 在遇到问题时,在您能力所及的范围内提出issue或者提交pr,而不是在混乱的评论区里留下无用的抱怨; 181 | - 作为玩家时,不要盲目地对开发者说“我想要...”,而是说“我想要...,我自己做不到,但是我能给你提供一些资料...”; 182 | - 在遇到新人时,于合理范围内提高您的[943指数](https://github.com/lksj-dev/lksj-mom/blob/bleeding/memo/meme/943%E6%8C%87%E6%95%B0.md)。 183 | 184 | 如果您做到了公开mod源代码,甚至是提供相应的文档、写出开发笔记,抑或是给他人的项目做出贡献;那我衷心地感谢您为Minecraft社区做出的贡献,感谢您对国际主义和共产主义精神的实践。 185 | 186 | ### 开源许可证真的有用吗? 187 | 188 | 是的,(至少主流的)开源许可证是受到现行法律保护的。 189 | 190 | 以下内容引用自广东省深圳市中级人民法院民事判决书,即罗盒网络科技诉福建风灵公司及腾讯公司一案,[(2019)粤03民初3928号](https://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=05f553bd178d4354bb48ad5100c1314f): 191 | 192 | > 关于GPL3.0协议的法律性质。其一,协议的内容具备合同特征。GPL3.0协议属于发生私法上效果的意思表示,而意思表示是民事法律行为的核心要素,因此GPL3.0协议是一种民事法律行为。该协议授予用户复制、修改、再发布等权利,实际上在授权人和用户间形成了权利变动,属于设立、变更、终止民事权利义务关系的民事法律行为。授权人许可的权利符合我国著作权法的相关规定;其采用开源许可证发布源代码,将自己的大部分著作权授予不特定用户,完全是出于自愿。用户在许可证下复制、修改或再发布源代码,通过行为对许可证作出承诺,也是出于自愿。用户在对源代码进行复制、修改或发布时许可证成立,同时许可证发生法律效力。其二,协议的形式亦具备合同特征。GPL3.0协议以电子文本方式表现其内容,而电子文本是一种有形的表现形式,属于以书面形式订立的合同。综上所述,GPL3.0协议具有合同性质,可认定为授权人与用户间订立的著作权协议,属于我国《合同法》调整的范围。 193 | 194 | 当然,简单地标明“此项目使用xxx许可证”并不一定意味着万事大吉。您可能需要仔细查看许可证的内容和咨询专业人员。 195 | 196 | --- 197 | 198 | ## 与Minecraft EULA有关 199 | 200 | 鉴于我们是在为Minecraft开发模组,我们的行为就自然受到[Minecraft EULA](https://www.minecraft.net/zh-hans/eula)和[使用条款](https://www.minecraft.net/zh-hans/terms)的约束。 201 | 202 | ### 那些开源协议似乎都没有限制别人拿我的mod来商用? 203 | 204 | 第一点原因是,限制商用将会使得你的软件不是一个[自由软件](https://www.gnu.org/philosophy/free-sw.zh-cn.html)。 205 | 206 | 更简单的原因是,**Mojang本来就不允许你将mod直接用于商业用途**: 207 | 208 | > “您从头开始为游戏创建的任何 Mod 均归您所有(包括事先运行的 Mod 和内存中 Mod),您可以对它们执行任何所需操作,只要您不通过出售它们来赚钱/尝试通过它们赚钱,并且不分发游戏的 Mod 版本即可。” 209 | 210 | ### 那我岂不是白干? 211 | 212 | 并不是, 213 | 214 | > “您可以按照以下“服务器和托管”部分中的说明通过 Mod 赚钱。” 215 | 216 | 你可以通过开设带有你的mod的服务器的方式来赚钱。但是你仍然需要遵守[MINECRAFT 商业使用准则](https://www.minecraft.net/zh-hans/terms#terms-commercial_guidelines)。 217 | 218 | 为阅读方便,以下是部分节选。**仅供参考,请以原文为准。** 219 | 220 | 作为服主,你可以: 221 | 222 | - 对玩家收取访问费用,但是需要: 223 | - 对每个人收取相同的费用; 224 | - 收费即全解锁Mod(即不能阶梯式收费); 225 | - 只允许正版玩家; 226 | - 要求捐赠,但是不能提供对个人的捐赠奖励。只能在达到某个捐赠目标的情况下提供全服范围的捐赠奖励。 227 | - 出售影响游戏玩法的特权,前提是不能让其他玩家心态爆炸。 228 | - 卖各种装饰,但不包括披风和长得像披风的东西。 229 | - 为第三方提供广告植入,但是不能让玩家心态爆炸。 230 | - 卖游戏内的虚拟货币,但是不能兑现,不能在付费和免费服务器直接转移,不能模仿基岩版的金币,等等等等。 231 | - 等等等等。 232 | 233 | 但是你需要: 234 | 235 | - 在玩家进服之前,透明地告知所有内容和价格。 236 | - 等等等等。 237 | 238 | ### 灰色地带 239 | 240 | 麻将在EULA里没有明说的事项,基本都算作灰色地带。例如利用Patron/爱发电获得赞助、通过相关视频获得盈利等都算。自行斟酌即可。 241 | 242 | :::danger 注意 243 | 244 | 再次强调,以上内容不是正式的法律建议,涉及具体事务时请咨询专业的法律工作者。 245 | 246 | ::: 247 | 248 | --- 249 | 250 | ## 奇奇怪怪的注意事项 251 | 252 | ### EditorConfig 253 | 254 | 当你与其他人进行协作开发的时候,难免会遇到“我的缩进是4个空格”“你的缩进是一个tab”这种令commit页面变得像股票市场一样的情况。 255 | 256 | 要避免出现第三次世界大战也很简单——作为项目拥有者,你可以启用EditorConfig,并方便地按你的习惯进行规定:在IDEA的`设置 > 编辑器 > 代码样式 > 方案 > (齿轮图标)导出 > EditorConfig文件`,在项目根目录添加一个`.editorconfig`文件。这使得所有人的代码都会被规定为统一的样式。 257 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/madparticle/元指令指南.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | id: meta 4 | title: Meta Command Parameter Guide 5 | hide\_table\_of\_contents: false 6 | 7 | --- 8 | 9 | # Meta Command Parameter Guide 10 | 11 | :::caution 12 | 13 | Some content on this page may have been translated by AI. The translated pages may be behind the latest version. 14 | 15 | ::: 16 | 17 | The `meta` parameter is a meta command section presented as a `CompoundTag`. It is designed to ensure compatibility and extensibility in future updates. 18 | 19 | You can selectively fill in content based on the descriptions of the flags below, your needs, and the current version. 20 | 21 | :::info 22 | 23 | The following values provide recommended ranges. Although you may be able to enter values outside the recommended ranges in-game, we do not recommend doing so. Entering values outside the recommended ranges is undefined behavior. 24 | 25 | ::: 26 | 27 | --- 28 | 29 | ## Tada (Celebration) Flag 30 | 31 | > Available in version: 0.3.+ 32 | > 33 | > Format: `"tada":1` 34 | > 35 | > Value type: Boolean (enter `0` or `1`) 36 | 37 | Indicates that this is a celebration (tada) command. The client must calculate the player’s hand position and apply the corresponding offset when generating particles. 38 | 39 | ## Pulse 40 | 41 | > Available in version: 0.4.19+ 42 | > 43 | > Format: `"pulse":1` 44 | > 45 | > Value type: Boolean 46 | 47 | Sets the celebration mode to pulse. After emitting particles once, the player must release the right mouse button before emitting particles again. 48 | 49 | --- 50 | 51 | ## Mathematical Expressions: dx, dy, dz 52 | 53 | > Available in version: 0.4.+ 54 | > 55 | > Format: `"dx":""` 56 | > 57 | > Example: `"dy":"0.2*sin(3t)+0.5*t"` 58 | > 59 | > Value type: String 60 | 61 | You can fill in a function expression with `t` as the independent variable to achieve advanced control over the per-tick increments of particles along the X, Y, and Z axes. Because directly controlling absolute particle coordinates greatly affects command reusability, if you want a particle’s trajectory along the X-axis to be `F(t)`, you need to fill in its **derivative `f(t)`** to eliminate the influence of absolute coordinates. 62 | 63 | Similarly, to remove the effect of different particle lifetimes on command reusability, **`t` is in the range `[0,1]`** (corresponding to the particle’s generation to disappearance), and in practice it is scaled according to the particle’s lifetime. 64 | 65 | :::caution 66 | 67 | If you specify dx, dy, or dz here: 68 | 69 | * The corresponding `gravity`, `xDeflection`, and `zDeflection` will be disabled, and `friction` will be overridden; 70 | * The `interactWithEntity` (interaction with players) effect will stack; 71 | 72 | ::: 73 | 74 | :::info 75 | 76 | Considering that complex expressions may impact performance, the current calculation method is: 77 | 78 | 1. If dx, dy, or dz is specified, particle object initialization is delegated to another thread, with each command running in its own thread to initialize a batch of particles; 79 | 80 | 1. The initialization process includes precomputing dx, dy, and dz: substitute a total of 101 `t` values between 0.00–1.00 (or, if the particle lifetime is less than 100, take the particle lifetime + 1) into the provided expression to compute corresponding values for lookup; 81 | 2. After a batch of particles is initialized, they are added to the world at the appropriate time; 82 | 3. When particles move, they read from the saved dx, dy, dz arrays and, using a method similar to `alphaMode`’s `SIN` mode, use lookup tables and linear interpolation to obtain the corresponding values. 83 | 84 | The benefit of this approach is minimizing the impact on MSPT, but the current drawback is that it consumes relatively more memory resources. 85 | 86 | ::: 87 | 88 | ### Supported Operators 89 | 90 | The following list includes all supported operators: 91 | 92 | * `+`, `-`, `*`, `/`: addition, subtraction (negation), multiplication, division; 93 | * `^`: exponentiation; 94 | * `%`: modulus (remainder); 95 | 96 | As shown in the example, you can omit the multiplication sign where appropriate. 97 | 98 | ### Supported Constants 99 | 100 | The following list includes all supported constants: 101 | 102 | * `pi` or `π`: π (pi), `3.14159265358979323846`; 103 | * `e`: Euler’s number, `2.7182818284590452354`; 104 | * `φ`: Golden ratio, `1.61803398874`; 105 | 106 | ### Supported Functions 107 | 108 | The following list includes all supported functions: 109 | 110 | * `abs`: absolute value; 111 | * `sin`, `cos`, `tan`: sine, cosine, tangent (radians); 112 | * `asin`, `acos`, `atan`: arcsine, arccosine, arctangent; 113 | * `sinh`, `cosh`, `tanh`: hyperbolic sine, hyperbolic cosine, hyperbolic tangent; 114 | * `sqrt`, `cbrt`: square root, cube root; 115 | * `floor`, `ceil`: largest integer ≤, smallest integer ≥; 116 | * `exp`: exponentiation with base e; 117 | * `log`, `log10`, `log2`: natural logarithm (base e), common logarithm (base 10), logarithm (base 2); 118 | * `signum`: sign function; 119 | 120 | ### Scientific Notation 121 | 122 | Technically supported, but we can’t think of any particle use case requiring scientific notation… 123 | 124 | --- 125 | 126 | ## Lifetime Variance 127 | 128 | > Available in version: 0.4.+ 129 | > 130 | > Format: `"life":""` 131 | > 132 | > Example: `"life":"20"` 133 | > 134 | > Value type: Integer (`1`\~`99`) 135 | 136 | Overrides the default 10% lifetime variance when generating particles. In the example, it is 20% lifetime variance. 137 | 138 | --- 139 | 140 | ## Disappear on Collision 141 | 142 | > Available in version: 0.4.3+ 143 | > 144 | > Format: `"disappearOnCollision":""` 145 | > 146 | > Example: `"disappearOnCollision":"2"` 147 | > 148 | > Value type: Integer (greater than `0`) 149 | 150 | Causes the particle to disappear immediately upon reaching the specified number of collisions. In the example, the particle disappears on its second collision. 151 | 152 | You can use this feature in combination with `expireThen` to make a particle transform into another particle upon collision. 153 | 154 | --- 155 | 156 | ## Rewind 157 | 158 | :::info 159 | 160 | This is a `long-term experimental` meta command flag, which means it may be changed or removed in the future. 161 | 162 | ::: 163 | 164 | > Available in version: 0.4.7+ 165 | > 166 | > Format: `"tenet":1` 167 | > 168 | > Value type: Boolean 169 | 170 | Performs one round of precomputation when generating the particle, then adds it to the world and plays it back in reverse along the precomputed trajectory. 171 | 172 | ## Precompute (Forward) 173 | 174 | > Available in version: 0.4.21+ 175 | > 176 | > Format: `"preCalculate":1` 177 | > 178 | > Value type: Boolean 179 | 180 | Performs forward precomputation when generating the particle, then adds it to the world. Effectively reduces main-thread load from collision calculations. 181 | 182 | :::caution 183 | 184 | If you specify Rewind or Precompute: 185 | 186 | * Rewind logic already includes Precompute, so if both flags appear then Rewind takes priority. 187 | * `interactWithEntity` (interaction with players) will be disabled; 188 | * The particle cannot react to terrain changes made after precomputation. 189 | 190 | ::: 191 | 192 | :::danger 193 | 194 | Currently, compatibility of Rewind and Precompute with child particles may be poor. 195 | 196 | ::: 197 | 198 | :::danger 199 | 200 | Precompute is only suitable for scenarios with a small number of particles. In scenarios with many particles, it may not be effective because the CPU becomes saturated. 201 | 202 | ::: 203 | 204 | --- 205 | 206 | ## Light (Brightness) 207 | 208 | :::info 209 | 210 | This is a `testing-phase` meta command flag, which means it has not undergone complete testing and may behave unexpectedly in some cases (e.g., when using shaders). 211 | 212 | ::: 213 | 214 | > Available in version: 0.4.9+ 215 | > 216 | > Format: `"light":""` 217 | > 218 | > Example: `"light":"15t"` 219 | > 220 | > Value type: String 221 | 222 | Similar to dx, dy, dz, you can fill in a function expression with `t` as the independent variable, also using the precompute–lookup–interpolation method. During calculation, the function value will be floored and clamped between 0 and 15. 223 | 224 | :::caution 225 | 226 | Particles played in reverse (i.e., `"tenet"`) will not honor the specified light changes. 227 | 228 | ::: 229 | 230 | --- 231 | 232 | ## Compressed Transmission 233 | 234 | > Available in version: 0.7.2+ 235 | > 236 | > Format: `"halfPrecision":1` 237 | > 238 | > Value type: Boolean 239 | 240 | Uses half-precision floating-point numbers to transmit certain parameters. Typically saves about 28% of server bandwidth without noticeable visual difference. 241 | 242 | --- 243 | 244 | ## Indexed Transmission 245 | 246 | > Available in version: 0.8.1+ 247 | > 248 | > Format: `"indexed":1` 249 | > 250 | > Value type: Boolean 251 | 252 | Uses an index number to transmit nearly the entire command. The index, a randomly generated integer, represents the entire command and can greatly reduce server bandwidth usage. 253 | 254 | :::info 255 | 256 | When the client executes a command for the first time, it will first query the server for the corresponding command text to cache. Therefore, the first execution of a given command may incur triple the latency. 257 | 258 | ::: 259 | 260 | :::caution 261 | 262 | Indexed Transmission and Compressed Transmission are not compatible. When both are present, Indexed Transmission will override Compressed Transmission. 263 | 264 | ::: 265 | 266 | :::tip 267 | 268 | If you are unsure which optimization parameters to use, here is a simple diagram to help you choose the prefix and transmission method: 269 | 270 | ![image-20241008223015928](./assets/image-20241008223015928.png) 271 | 272 | ::: 273 | -------------------------------------------------------------------------------- /docs/holojaneway/-2.1 JNI.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: -2.1 3 | title: -2 JNI 4 | description: JNI 5 | hide_table_of_contents: false 6 | sidebar_position: 71 7 | 8 | --- 9 | 10 | # JNI 11 | 12 | 这或许是一个非常奇怪的需求。在涉及性能的场合,通常在Java内部进行优化就已经足够;而涉及到底层硬件之类的——为什么MC需要这玩意? 13 | 14 | :::tip 15 | 16 | 我个人的经验是,从原理上优化往往比换个语言更有效。 17 | 18 | ::: 19 | 20 | :::info 21 | 22 | 本章的重点是在MC中使用JNI,而不是JNI教程。 23 | 24 | 为简便起见,我们只考虑编译为win32 dll。 25 | 26 | ::: 27 | 28 | 我们将以MadParticle曾经作过的JNI尝试——快速清除光照缓存为例,向你讲解如何在Mod中使用JNI。 29 | 30 | --- 31 | 32 | ## JNI本身 33 | 34 | 首先我们需要写出我们的native方法: 35 | 36 | ```java 37 | public class Native { 38 | static { 39 | System.loadLibrary("native"); 40 | } 41 | 42 | public static native void reset(byte[][][] array); 43 | 44 | public static native void resetByte(byte[] array); 45 | } 46 | ``` 47 | 48 | :::tip 49 | 50 | 此处的`Native`不是特定的,你可以使用任何你想使用的名字。 51 | 52 | ::: 53 | 54 | 然后切换到命令行(终端),生成头文件: 55 | 56 | ```powershell 57 | PS H:\Minecraft Develop\MadParticle\src\main\java\cn\ussshenzhou\madparticle\util> javac -h . Native.java 58 | ``` 59 | 60 | 你可以看到生成了一个`Native.class`和`cn_ussshenzhou_madparticle_util_Native.h`。`Native.class`不再需要,可以删掉。头文件的名称也不是固定的,你可以将其改为任意你喜欢的名字。我们这里将其改为`nativeUtil.h`,放在一边。 61 | 62 | ## JNI与Gradle 63 | 64 | 首先打开你的`settings.gradle`,在末尾添加 65 | 66 | ```groovy 67 | include 'native' 68 | ``` 69 | 70 | 然后在你的项目根目录下建立如下文件夹和文件(显然`nativeUtil.h`则使用复制): 71 | 72 | ```css 73 | MadParticle/ 74 | └── native/ 75 | ├── build.gradle 76 | ├── CMakeLists.txt 77 | └── src/ 78 | └── main/ 79 | └── cpp/ 80 | ├── library.cpp 81 | ├── library.h 82 | ├── nativeUtil.cpp 83 | └── nativeUtil.h 84 | ``` 85 | 86 | :::info 87 | 88 | `CMakeLists.txt`,`library.cpp`,`library.h`只有在你使用Clion编写C++代码时才是必要的。当你使用VSC或者VS时,可以手动地在编辑器设置中添加JNI头文件目录。 89 | 90 | ```cmake 91 | cmake_minimum_required(VERSION 3.28) 92 | project(native) 93 | 94 | set(CMAKE_CXX_STANDARD 17) 95 | 96 | include_directories() 97 | 98 | add_library(native SHARED src/main/cpp/library.cpp 99 | src/main/cpp/nativeUtil.h 100 | src/main/cpp/nativeUtil.cpp) 101 | 102 | find_package(JNI REQUIRED) 103 | include_directories(${JAVA_INCLUDE_PATH}) 104 | include_directories(${JAVA_INCLUDE_PATH2}) 105 | ``` 106 | 107 | `library.cpp`只需要`#include "library.h"`即可,仅作为占位,没有实际意义。 108 | 109 | `library.h`只需要: 110 | 111 | ```cpp 112 | #ifndef NATIVE_LIBRARY_H 113 | #define NATIVE_LIBRARY_H 114 | 115 | #endif 116 | ``` 117 | 118 | ::: 119 | 120 | `build.gradle`的内容如下,你可以直接复制,记得改`group`和`version`: 121 | 122 | ```gradle 123 | import org.gradle.internal.jvm.Jvm 124 | 125 | plugins { 126 | id 'cpp-library' 127 | } 128 | 129 | group 'cn.ussshenzhou' 130 | version '0.5.3' 131 | 132 | library { 133 | binaries.configureEach { CppBinary binary -> 134 | def compileTask = binary.compileTask.get() 135 | compileTask.includes.from("${Jvm.current().javaHome}/include") 136 | 137 | def osFamily = binary.targetPlatform.targetMachine.operatingSystemFamily 138 | if (osFamily.macOs) { 139 | compileTask.includes.from("${Jvm.current().javaHome}/include/darwin") 140 | } else if (osFamily.linux) { 141 | compileTask.includes.from("${Jvm.current().javaHome}/include/linux") 142 | } else if (osFamily.windows) { 143 | compileTask.includes.from("${Jvm.current().javaHome}/include/win32") 144 | } 145 | 146 | compileTask.source.from fileTree(dir: "src/main/cpp", include: "**/*.cpp") 147 | 148 | def toolChain = binary.toolChain 149 | if (toolChain instanceof VisualCpp) { 150 | compileTask.compilerArgs.addAll(["/std:c17", "/O2"]) 151 | } else if (toolChain instanceof GccCompatibleToolChain) { 152 | compileTask.compilerArgs.addAll(["-std=c17", "-O2"]) 153 | } 154 | } 155 | } 156 | ``` 157 | 158 | 然后在`nativeUtil.cpp`写具体实现: 159 | 160 | ```cpp 161 | #include "jni.h" 162 | #include "nativeUtil.h" 163 | 164 | void Java_cn_ussshenzhou_madparticle_util_Native_reset(JNIEnv *env, jclass clazz, jobjectArray array) { 165 | ... 166 | } 167 | 168 | void Java_cn_ussshenzhou_madparticle_util_Native_resetByte(JNIEnv *env, jclass clazz, jbyteArray array) { 169 | ... 170 | } 171 | ``` 172 | 173 | :::caution 174 | 175 | 此处自动生成的的方法名称不能改变。 176 | 177 | ::: 178 | 179 | ## MC环境 180 | 181 | 为了在开发环境运行时找到库文件,构建时自动编译C++以及打包jar时加入.dll,我们需要在**根项目**的`build.gradle`添加以下内容: 182 | 183 | ```gradle {6,12,18,25,27-30} 184 | minecraft { 185 | ... 186 | runs { 187 | client { 188 | ... 189 | property "java.library.path", file("${project(":native").buildDir}/lib/main/debug").absolutePath 190 | ... 191 | } 192 | 193 | server { 194 | ... 195 | property "java.library.path", file("${project(":native").buildDir}/lib/main/debug").absolutePath 196 | ... 197 | } 198 | 199 | gameTestServer { 200 | ... 201 | property "java.library.path", file("${project(":native").buildDir}/lib/main/debug").absolutePath 202 | ... 203 | } 204 | ... 205 | } 206 | } 207 | ... 208 | compileJava.dependsOn(":native:assembleDebug").dependsOn(":native:assembleRelease") 209 | 210 | processResources { 211 | from("${project(":native").buildDir}/lib/main/release/") { 212 | include("*.dll") 213 | } 214 | } 215 | ``` 216 | 217 | 最后就是处理dll被打包入jar的情况,我们补充原先的`Native.java`: 218 | 219 | ```java {2-16} 220 | public class Native { 221 | static { 222 | if (!FMLLoader.isProduction()) { 223 | System.loadLibrary("native"); 224 | } else { 225 | loadFromJar(); 226 | } 227 | } 228 | 229 | private static void loadFromJar() { 230 | try { 231 | NativeUtils.loadLibraryFromJar("/native.dll"); 232 | } catch (IOException e1) { 233 | throw new RuntimeException(e1); 234 | } 235 | } 236 | 237 | public static native void reset(byte[][][] array); 238 | 239 | public static native void resetByte(byte[] array); 240 | } 241 | ``` 242 | 243 | `NativeUtils`来自https://github.com/adamheinrich/native-utils ,你可以直接复制到你的项目内(Forge不会在生产环境带上它): 244 | 245 | ```java 246 | /** 247 | * Copied from {@link ca.weblite.nativeutils.NativeUtils} under MIT license for convenience. 248 | * @author Adam Heirnich , 249 | */ 250 | public class NativeUtils { 251 | 252 | /** 253 | * Private constructor - this class will never be instanced 254 | */ 255 | private NativeUtils() { 256 | } 257 | 258 | /** 259 | * Loads a library from current JAR archive, using the class loader of the {@code NativeUtils} 260 | * class to find the resource in the JAR. 261 | * 262 | * @param path a {@link java.lang.String} object. 263 | * @throws java.io.IOException if any. 264 | * @throws UnsatisfiedLinkError if loading the native library fails. 265 | */ 266 | public static void loadLibraryFromJar(String path) throws IOException { 267 | loadLibraryFromJar(path, NativeUtils.class); 268 | } 269 | 270 | /** 271 | * Loads a library from current JAR archive. 272 | * 273 | * The file from JAR is copied into system temporary directory and then loaded. The temporary file is deleted after exiting. 274 | * Method uses String as filename because the pathname is "abstract", not system-dependent. 275 | * 276 | * @throws java.lang.IllegalArgumentException If the path is not absolute or if the filename is shorter than three characters (restriction of @see File#createTempFile(java.lang.String, java.lang.String)). 277 | * @param path a {@link java.lang.String} object. 278 | * @param source {@code Class} whose class loader should be used to look up the resource in the JAR file 279 | * @throws java.io.IOException if any. 280 | * @throws UnsatisfiedLinkError if loading the native library fails. 281 | */ 282 | public static void loadLibraryFromJar(String path, Class source) throws IOException, UnsatisfiedLinkError { 283 | // Finally, load the library 284 | System.load(extractFromJar(path, source).toAbsolutePath().toString()); 285 | } 286 | 287 | /** 288 | * Extracts a resource from the JAR and stores it as temporary file 289 | * in the file system. 290 | * 291 | * @param path path of the resource, must begin with {@code '/'}, see {@link Class#getResourceAsStream(String)} 292 | * @param source {@code Class} whose class loader should be used to look up the resource in the JAR file 293 | * @return file path of the temporary file extracted from this JAR 294 | * @throws java.io.IOException if any. 295 | */ 296 | public static Path extractFromJar(String path, Class source) throws IOException { 297 | if (!path.startsWith("/")) { 298 | throw new IllegalArgumentException("The path has to be absolute (start with '/')."); 299 | } 300 | 301 | String filename = path.substring(path.lastIndexOf('/') + 1); 302 | 303 | // Split filename to prefix and suffix (extension) 304 | String prefix; 305 | String suffix; 306 | int lastDot = filename.lastIndexOf('.'); 307 | if (lastDot == -1) { 308 | // No file extension; use complete filename as prefix 309 | prefix = filename; 310 | suffix = null; 311 | } else { 312 | prefix = filename.substring(0, lastDot); 313 | suffix = filename.substring(lastDot); 314 | } 315 | 316 | // Check if the filename is okay 317 | if (prefix.length() < 3) { 318 | throw new IllegalArgumentException("The filename has to be at least 3 characters long."); 319 | } 320 | 321 | // Prepare temporary file 322 | Path temp = Files.createTempFile(prefix, suffix); 323 | temp.toFile().deleteOnExit(); 324 | 325 | // Open and check input stream 326 | InputStream is = source.getResourceAsStream(path); 327 | if (is == null) { 328 | throw new FileNotFoundException("File " + path + " was not found inside JAR."); 329 | } 330 | 331 | try (is; OutputStream out = Files.newOutputStream(temp, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)) { 332 | is.transferTo(out); 333 | } 334 | 335 | return temp; 336 | } 337 | } 338 | ``` --------------------------------------------------------------------------------