37 Commits

Author SHA1 Message Date
github-actions[bot]
9cd2bb07a0 Merge commit '707e3a7b2b24bf84cb59143eeeaf73a167be4b33' 2026-04-01 02:24:37 +00:00
MCNeteaseDevs
707e3a7b2b [自动同步] 新增 1 个 - 2026-04-01 10:17:03
Some checks failed
Auto Push on Tag / push-code (push) Has been cancelled
2026-04-01 10:17:03 +08:00
kwiilh
8af5e1ad39 同步官网文档 2026-03-26 15:25:27 +08:00
MCNeteaseDevs
8f48148961 修复 GitHub Actions 权限问题
Some checks failed
Auto Push on Tag / push-code (push) Has been cancelled
2026-03-25 18:55:32 +08:00
MCNeteaseDevs
e5ecce5841 [自动同步] 新增 2 个文件 - 2026-03-25 18:50:52 2026-03-25 18:50:53 +08:00
MCNeteaseDevs
0806b4e69f 添加自动同步 GitHub Actions 工作流 2026-03-25 18:48:27 +08:00
MCNeteaseDevs
fb17060866 添加 .codemaker 到 gitignore 2026-03-25 18:41:41 +08:00
xiaobo
8af3e13f2f 新增集合面板和集合相关内容 (#47) 2026-03-25 15:14:15 +08:00
daoge
fb9586cf5d feat: 添加Allay相关教程 (#48)
* feat: 添加Allay相关教程

* feat: 添加 3-NetAllay常用接口文档.md

* docs: 更新NetAllay支持说明,添加常用接口文档链接
2026-03-25 15:13:35 +08:00
kwiilh
f105f936e0 Merge branch 'main' of github.com:MCNeteaseDevs/netease-bedrock-wiki 2026-03-09 14:15:22 +08:00
kwiilh
ec2c7f60b9 同步官网文档 2026-03-09 14:14:44 +08:00
MCNeteaseDevs
d977df2dc2 Merge pull request #43 from MCNeteaseDevs/all-contributors/add-Nacalpha
docs: add Nacalpha as a contributor for doc
2026-01-09 16:05:15 +08:00
allcontributors[bot]
31d219956f docs: update .all-contributorsrc 2026-01-09 08:04:55 +00:00
allcontributors[bot]
df4bece89b docs: update README.md 2026-01-09 08:04:54 +00:00
MCNeteaseDevs
77ba105452 Merge pull request #40 from sevenstars0/patch-3
Update 30-UI说明文档.md
2026-01-09 16:02:43 +08:00
kwiilh
439216893d Github双端同步 2026-01-09 15:55:00 +08:00
MCNeteaseDevs
074cf234bd Fix typo in Mod SDK documentation section 2025-12-30 11:18:07 +08:00
MCNeteaseDevs
64282118f6 添加修改SDK文档流程说明 2025-12-30 11:17:14 +08:00
sevenstars
d68587065c Update 30-UI说明文档.md
增加了scroll_view中对于$touch变量的说明
2025-12-30 10:47:57 +08:00
MCNeteaseDevs
688a85ffff Merge pull request #38 from MCNeteaseDevs/all-contributors/add-sevenstars0
docs: add sevenstars0 as a contributor for doc
2025-12-30 10:36:20 +08:00
MCNeteaseDevs
521e187767 Merge branch 'main' into all-contributors/add-sevenstars0 2025-12-30 10:36:11 +08:00
MCNeteaseDevs
d458ef7ec7 Merge pull request #39 from MCNeteaseDevs/all-contributors/add-LiangJi23333
docs: add LiangJi23333 as a contributor for doc
2025-12-30 10:33:34 +08:00
allcontributors[bot]
77bdd38c05 docs: update .all-contributorsrc 2025-12-30 02:31:59 +00:00
allcontributors[bot]
0f012cde17 docs: update README.md 2025-12-30 02:31:58 +00:00
allcontributors[bot]
58189c3d48 docs: update .all-contributorsrc 2025-12-30 02:28:50 +00:00
allcontributors[bot]
d778ffb81c docs: update README.md 2025-12-30 02:28:49 +00:00
MCNeteaseDevs
e74c284815 Merge pull request #32 from xbmanh/patch-1
Improve guidelines for multiplayer compatibility
2025-12-30 10:17:06 +08:00
MCNeteaseDevs
8c8ae31c08 Merge pull request #33 from ShangguanXi/Supplement-the-base_block-field-
更新 1-JSON组件.md 内容
2025-12-30 10:15:27 +08:00
kwiilh
31dea08de7 同步正式环境 2025-12-30 10:14:17 +08:00
上官汐
c51b5bb73c Update 1-JSON组件.md 2025-12-28 18:53:54 +08:00
TimWang486
da08f15ac2 Improve guidelines for multiplayer compatibility
Clarified the principle of separating ServerSystem and ClientSystem for better compatibility in multiplayer environments. Updated example code to highlight incorrect client-side imports.
2025-12-27 22:04:25 +08:00
MCNeteaseDevs
a510d13f2b Merge pull request #29 from imchuyun/patch-2
fix: 修复新版守护进程因node版本号问题无法运行的BUG
2025-12-26 15:25:36 +08:00
MCNeteaseDevs
5ee48218b8 补充删除的开头 2025-12-26 15:25:03 +08:00
kwiilh
3a2cf90fa9 同步官网文档 2025-12-26 15:22:18 +08:00
MCNeteaseDevs
667aa53bc5 补充首页贡献展示说明 2025-12-26 14:15:08 +08:00
MCNeteaseDevs
7797f0e939 Merge pull request #31 from MCNeteaseDevs/all-contributors/add-MCNeteaseDevs
docs: add MCNeteaseDevs as a contributor for doc
2025-12-26 10:57:15 +08:00
imchuyun
915e1dcf98 fix: 修复新版守护进程因node版本号问题无法运行的BUG
升级node为16+,并且强制要求16+,保证新版守护进程正常运行。
2025-12-25 09:20:05 +08:00
38 changed files with 2314 additions and 287 deletions

View File

@@ -16,6 +16,33 @@
"contributions": [ "contributions": [
"doc" "doc"
] ]
},
{
"login": "sevenstars0",
"name": "sevenstars",
"avatar_url": "https://avatars.githubusercontent.com/u/148792757?v=4",
"profile": "https://github.com/sevenstars0",
"contributions": [
"doc"
]
},
{
"login": "LiangJi23333",
"name": "LiangJi23333",
"avatar_url": "https://avatars.githubusercontent.com/u/102958768?v=4",
"profile": "https://github.com/LiangJi23333",
"contributions": [
"doc"
]
},
{
"login": "Nacalpha",
"name": "Nacalpha",
"avatar_url": "https://avatars.githubusercontent.com/u/128111367?v=4",
"profile": "https://github.com/Nacalpha",
"contributions": [
"doc"
]
} }
] ]
} }

63
.github/workflows/sync.yml vendored Normal file
View File

@@ -0,0 +1,63 @@
# GitHub Actions 工作流
# 检测到 sync-* 标签时自动推送代码到 main 分支
name: Auto Push on Tag
on:
push:
tags:
- 'sync-*'
# 授予写入权限
permissions:
contents: write
jobs:
push-code:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Get tag info
id: tag_info
run: |
TAG_NAME=${GITHUB_REF#refs/tags/}
COMMIT_SHA=$(git rev-list -n 1 $TAG_NAME)
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT
echo "🏷️ Tag: $TAG_NAME"
echo "📝 Commit: $COMMIT_SHA"
- name: Push commit to main
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# 获取标签指向的 commit
TAG_COMMIT=${{ steps.tag_info.outputs.commit_sha }}
# 切换到 main 分支
git checkout main
# 检查 main 是否已经包含这个 commit
if git merge-base --is-ancestor $TAG_COMMIT HEAD; then
echo "✓ main 分支已包含此 commit无需推送"
else
# 将 commit 合并到 main
git merge $TAG_COMMIT --no-edit
git push origin main
echo "✓ 已推送到 main 分支"
fi
- name: Summary
run: |
echo "## 同步完成 ✅" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- **标签**: ${{ steps.tag_info.outputs.tag_name }}" >> $GITHUB_STEP_SUMMARY
echo "- **Commit**: ${{ steps.tag_info.outputs.commit_sha }}" >> $GITHUB_STEP_SUMMARY
echo "- **时间**: $(date)" >> $GITHUB_STEP_SUMMARY

1
.gitignore vendored
View File

@@ -5,3 +5,4 @@ package.json
.idea .idea
mcguide/30-测试/video/airperf.mp4 mcguide/30-测试/video/airperf.mp4
mcguide/30-测试/video/tracy.mp4 mcguide/30-测试/video/tracy.mp4
.codemaker/

View File

@@ -18,6 +18,22 @@
## 贡献指南 ## 贡献指南
**开发指南/教学课程文档**与**Mod SDK文档**修改流程不一致,接下来将会分别介绍
### Mod SDK文档修改
1. 点击仓库中**Issues** - 点击**New Issue** - 选择**SDK文档修改**
2. 按照模版依次填写以下内容:
- 标题:为了方便其他开发者查找相同修改,请写明**接口名称与修改部分**。例如StopCustomMusicById添加备注
- 接口名称:填写需要修改的接口名称或链接
- 接口类型:选择接口的类型,共有服务端、客户端、双端三种选项
- 修改内容:详细描述修改的接口文档内容
- 其他补充信息:如有其他信息可以补充在这里
- 开发者信息:将会用于贡献致谢展示与奖品发放
3. 完成后点击Create。修改内容会由官方进行审核审核通过后会在**两周之内**同步至官网
### 开发指南/教学课程修改
1. Fork 本项目。点击 Fork 按钮创建一个新的派生项目到自己的工作区Create a new fork 1. Fork 本项目。点击 Fork 按钮创建一个新的派生项目到自己的工作区Create a new fork
2. 克隆派生 2. 克隆派生
@@ -63,7 +79,7 @@ git push --set-upstream origin your-branch-name
## 致谢 ## 致谢
在此感谢以下开发者作出的贡献 在此感谢以下开发者作出的贡献(以下排名不分先后)
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start --> <!-- prettier-ignore-start -->
@@ -72,6 +88,9 @@ git push --set-upstream origin your-branch-name
<tbody> <tbody>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MCNeteaseDevs"><img src="https://avatars.githubusercontent.com/u/186891705?v=4?s=100" width="100px;" alt="MCNeteaseDevs"/><br /><sub><b>MCNeteaseDevs</b></sub></a><br /><a href="#doc-MCNeteaseDevs" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/MCNeteaseDevs"><img src="https://avatars.githubusercontent.com/u/186891705?v=4?s=100" width="100px;" alt="MCNeteaseDevs"/><br /><sub><b>MCNeteaseDevs</b></sub></a><br /><a href="#doc-MCNeteaseDevs" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sevenstars0"><img src="https://avatars.githubusercontent.com/u/148792757?v=4?s=100" width="100px;" alt="sevenstars"/><br /><sub><b>sevenstars</b></sub></a><br /><a href="#doc-sevenstars0" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LiangJi23333"><img src="https://avatars.githubusercontent.com/u/102958768?v=4?s=100" width="100px;" alt="LiangJi23333"/><br /><sub><b>LiangJi23333</b></sub></a><br /><a href="#doc-LiangJi23333" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Nacalpha"><img src="https://avatars.githubusercontent.com/u/128111367?v=4?s=100" width="100px;" alt="Nacalpha"/><br /><sub><b>Nacalpha</b></sub></a><br /><a href="#doc-Nacalpha" title="Documentation">📖</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -12,6 +12,12 @@ selection: 14
![更新信息](./images/gxxx.png) ![更新信息](./images/gxxx.png)
或者点击下列链接进行跳转 或者点击下列链接进行跳转
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.8.html" rel="noopenner">3.8更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.7.html" rel="noopenner">3.7更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.6.html" rel="noopenner">3.6更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.5.html" rel="noopenner">3.5更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.4.html" rel="noopenner">3.4更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.3.html" rel="noopenner">3.3更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.2.html" rel="noopenner">3.2更新信息 </a> - <a href="../../../mcdocs/1-ModAPI/更新信息/3.2.html" rel="noopenner">3.2更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.1.html" rel="noopenner">3.1更新信息 </a> - <a href="../../../mcdocs/1-ModAPI/更新信息/3.1.html" rel="noopenner">3.1更新信息 </a>
- <a href="../../../mcdocs/1-ModAPI/更新信息/3.0.html" rel="noopenner">3.0更新信息 </a> - <a href="../../../mcdocs/1-ModAPI/更新信息/3.0.html" rel="noopenner">3.0更新信息 </a>

View File

@@ -0,0 +1,14 @@
---
front: https://nie.res.netease.com/r/pic/20221108/151b6d0d-5ea5-43fc-a346-45c25572a2ca.gif
hard: 入门
time: 2分钟
---
# 编辑器插件总览
编辑器插件是指开发者可以通过特定的API开发和定制MC Studio中编辑器内容的功能。
您可以大幅度的定制自己常用的编辑器变成自己最顺手的工具链,还可以把这套工具链分享给其他开发者进行使用。
## 公测时间
目前编辑器插件还处于实验性阶段我们无法保证是否会对编辑器产生不可预料的后果所以目前我们仅邀请部分开发者进行使用并逐步开放编辑器API给全体开发者。

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

View File

@@ -157,7 +157,11 @@ def onUpdatePlayerSkinClient(self,args):
为方便开发者测试4D皮肤与模组本身的兼容性官方在**开发者测试服(手机自测)**提供了测试用4D皮肤可通过邮件领取 为方便开发者测试4D皮肤与模组本身的兼容性官方在**开发者测试服(手机自测)**提供了测试用4D皮肤可通过邮件领取
**注意:** 请各位开发者更新到3.5测试服3.4该测试皮肤不会生效 **注意:**
- 请各位开发者更新到3.5测试服3.4该测试皮肤不会生效
- 自3.7版本之后渲染龙包体无法使用4D皮肤。开发者请勿在游戏内视频设置中切换为渲染龙这将导致断言报错
#### MC Studio #### MC Studio

View File

@@ -1759,6 +1759,8 @@ PC和IOS平台没有这个问题
而对于scrolling_content的绝对路径一共有以下两种可以通过UI-API<a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#getallchildrenpath">GetAllChildrenPath</a>清楚的看到。 而对于scrolling_content的绝对路径一共有以下两种可以通过UI-API<a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#getallchildrenpath">GetAllChildrenPath</a>清楚的看到。
#### 特别注意
```python ```python
scroll_view_path = "/scroll_view0" scroll_view_path = "/scroll_view0"
touch_path = scroll_view_path + "/scroll_touch/scroll_view/panel/background_and_viewport/scrolling_view_port/scrolling_content" touch_path = scroll_view_path + "/scroll_touch/scroll_view/panel/background_and_viewport/scrolling_view_port/scrolling_content"

View File

@@ -0,0 +1,257 @@
# 3.7版本物品id变更
## 简介
微软在1.21.50继续修改了部分方块ID取消了附加值相关链接请参阅[基岩版扁平化](https://zh.minecraft.wiki/w/%E5%AE%98%E6%96%B9%E9%A1%B5%E9%9D%A2/%E5%9F%BA%E5%B2%A9%E7%89%88%E6%89%81%E5%B9%B3%E5%8C%96),请开发者注意适配。
## 处理方法
在ModSDK的接口与事件中我们针对上述情况做了以下处理
1. 对于返回物品信息字典的接口与事件:
newItemName及newAuxValue返回新版名称与附加值。
原字段itemName及auxValue返回旧版名称与附加值。
2. 对于接受物品信息字典的接口与事件:
当字典存在newItemName及newAuxValue时使用这两个字段。
不存在时使用旧字段itemName及auxValue。
## 注意事项
* 通过附加值获取获取方块状态接口没有做兼容例如GetBlockAuxValueFromStates、GetBlockStatesFromAuxValue、GetBlockStates、SetBlockStates如果您的组件对此有依赖则需要对这次的改动自行做兼容处理。
* **开发完成或正在开发的组件建议统一采用newItemName及newAuxValue字段也不要新旧字段混用。**
* 某些写法可能会失效,例如
```python
# 获取itemDict然后在他基础上修改itemName或auxValue后再用来生成
itemdict = GetPlayerItem()
itemdict['itemName'] = 'xxx'
itemdict['auxValue'] = itemdict['auxValue']+1
SpawnItemToPlayerInv(itemdict)
```
因为GetPlayerItem返回的itemDict含有新字段再传入SpawnItemToPlayerInv时会读取新字段生成物品因此对原字段的修改无效。
## 版本变更方块数据
以下为3.7版本变更了id、名称等的物品列表表格内的名称省略了minecraft命名空间。
## 统计信息
- 变更项数量: 89
- 仅名称变更: 12
- 新增项数量: 69
- 移除项数量: 17
### 变更项
| 新中文名 | 旧中文名 | 旧命名 | 旧附加值 | 新命名 | 新附加值 |
| :------ | ------ | ------ | ------ | ------ | ------ |
| 蒲公英 | 蒲公英 | yellow_flower | 0 | dandelion | 0
| 虫蚀石头 | 虫蚀石头 | monster_egg | 0 | infested_stone | 0
| 石砖 | 石砖 | stonebrick | 0 | stone_bricks | 0
| 蘑菇柄 | 蘑菇柄 | brown_mushroom_block | 15 | mushroom_stem | 0
| 双红砂岩台阶 | 红砂岩双层台阶 | double_stone_block_slab2 | 0 | red_sandstone_double_slab | 0
| 红砂岩台阶 | 红砂岩台阶 | stone_block_slab2 | 0 | red_sandstone_slab | 0
| 末地石砖台阶 | 末地石砖台阶 | stone_block_slab3 | 0 | end_stone_brick_slab | 0
| 苔石砖台阶 | 苔石砖台阶 | stone_block_slab4 | 0 | mossy_stone_brick_slab | 0
| 光源方块-亮度0 | 光源方块 | light_block | 0 | light_block_0 | 0
| 虫蚀圆石 | 虫蚀圆石 | monster_egg | 1 | infested_cobblestone | 0
| 虫蚀石砖 | 虫蚀石砖 | monster_egg | 2 | infested_stone_bricks | 0
| 虫蚀苔石砖 | 虫蚀苔石砖 | monster_egg | 3 | infested_mossy_stone_bricks | 0
| 虫蚀裂纹石砖 | 虫蚀裂纹石砖 | monster_egg | 4 | infested_cracked_stone_bricks | 0
| 虫蚀雕纹石砖 | 虫蚀雕纹石砖 | monster_egg | 5 | infested_chiseled_stone_bricks | 0
| 苔石砖 | 苔石砖 | stonebrick | 1 | mossy_stone_bricks | 0
| 裂纹石砖 | 裂纹石砖 | stonebrick | 2 | cracked_stone_bricks | 0
| 雕纹石砖 | 雕纹石砖 | stonebrick | 3 | chiseled_stone_bricks | 0
| 双砂岩台阶 | 砂岩双层台阶 | double_stone_block_slab | 1 | sandstone_double_slab | 0
| 双圆石台阶 | 圆石双层台阶 | double_stone_block_slab | 3 | cobblestone_double_slab | 0
| 双红砖台阶 | 红砖双层台阶 | double_stone_block_slab | 4 | brick_double_slab | 0
| 双石砖台阶 | 石砖双层台阶 | double_stone_block_slab | 5 | stone_brick_double_slab | 0
| 双石英台阶 | 石英双层台阶 | double_stone_block_slab | 6 | quartz_double_slab | 0
| 双下界砖台阶 | 下界砖双层台阶 | double_stone_block_slab | 7 | nether_brick_double_slab | 0
| 紫珀台阶 | 紫珀台阶 | stone_block_slab2 | 1 | purpur_slab | 0
| 海晶石台阶 | 海晶石台阶 | stone_block_slab2 | 2 | prismarine_slab | 0
| 暗海晶石台阶 | 暗海晶石台阶 | stone_block_slab2 | 3 | dark_prismarine_slab | 0
| 海晶石砖台阶 | 海晶石砖台阶 | stone_block_slab2 | 4 | prismarine_brick_slab | 0
| 苔石台阶 | 苔石台阶 | stone_block_slab2 | 5 | mossy_cobblestone_slab | 0
| 平滑砂岩台阶 | 平滑砂岩台阶 | stone_block_slab2 | 6 | smooth_sandstone_slab | 0
| 红色下界砖台阶 | 红色下界砖台阶 | stone_block_slab2 | 7 | red_nether_brick_slab | 0
| 平滑红砂岩台阶 | 平滑红砂岩台阶 | stone_block_slab3 | 1 | smooth_red_sandstone_slab | 0
| 磨制安山岩台阶 | 磨制安山岩台阶 | stone_block_slab3 | 2 | polished_andesite_slab | 0
| 安山岩台阶 | 安山岩台阶 | stone_block_slab3 | 3 | andesite_slab | 0
| 闪长岩台阶 | 闪长岩台阶 | stone_block_slab3 | 4 | diorite_slab | 0
| 磨制闪长岩台阶 | 磨制闪长岩台阶 | stone_block_slab3 | 5 | polished_diorite_slab | 0
| 花岗岩台阶 | 花岗岩台阶 | stone_block_slab3 | 6 | granite_slab | 0
| 磨制花岗岩台阶 | 磨制花岗岩台阶 | stone_block_slab3 | 7 | polished_granite_slab | 0
| 平滑石英台阶 | 平滑石英台阶 | stone_block_slab4 | 1 | smooth_quartz_slab | 0
| 石头台阶 | 石头台阶 | stone_block_slab4 | 2 | normal_stone_slab | 0
| 切制砂岩台阶 | 切制砂岩台阶 | stone_block_slab4 | 3 | cut_sandstone_slab | 0
| 切制红砂岩台阶 | 切制红砂岩台阶 | stone_block_slab4 | 4 | cut_red_sandstone_slab | 0
| 双石化橡木台阶 | 石化橡木双层台阶 | double_stone_block_slab | 2 | petrified_oak_double_slab | 0
| 双紫珀台阶 | 双紫珀台阶 | double_stone_block_slab2 | 1 | purpur_double_slab | 0
| 双海晶石台阶 | 双海晶石台阶 | double_stone_block_slab2 | 2 | prismarine_double_slab | 0
| 双暗海晶石台阶 | 双暗海晶石台阶 | double_stone_block_slab2 | 3 | dark_prismarine_double_slab | 0
| 双海晶石砖台阶 | 双海晶石砖台阶 | double_stone_block_slab2 | 4 | prismarine_brick_double_slab | 0
| 双苔石台阶 | 双苔石台阶 | double_stone_block_slab2 | 5 | mossy_cobblestone_double_slab | 0
| 双平滑砂岩台阶 | 双平滑砂岩台阶 | double_stone_block_slab2 | 6 | smooth_sandstone_double_slab | 0
| 双红色下界砖台阶 | 双红色下界砖台阶 | double_stone_block_slab2 | 7 | red_nether_brick_double_slab | 0
| 双平滑红砂岩台阶 | 双平滑红砂岩台阶 | double_stone_block_slab3 | 1 | smooth_red_sandstone_double_slab | 0
| 双磨制安山岩台阶 | 双磨制安山岩台阶 | double_stone_block_slab3 | 2 | polished_andesite_double_slab | 0
| 双安山岩台阶 | 双安山岩台阶 | double_stone_block_slab3 | 3 | andesite_double_slab | 0
| 双闪长岩台阶 | 双闪长岩台阶 | double_stone_block_slab3 | 4 | diorite_double_slab | 0
| 双磨制闪长岩台阶 | 双磨制闪长岩台阶 | double_stone_block_slab3 | 5 | polished_diorite_double_slab | 0
| 双花岗岩台阶 | 双花岗岩台阶 | double_stone_block_slab3 | 6 | granite_double_slab | 0
| 双磨制花岗岩台阶 | 双磨制花岗岩台阶 | double_stone_block_slab3 | 7 | polished_granite_double_slab | 0
| 双平滑石英台阶 | 双平滑石英台阶 | double_stone_block_slab4 | 1 | smooth_quartz_double_slab | 0
| 双石台阶 | 双石台阶 | double_stone_block_slab4 | 2 | normal_stone_double_slab | 0
| 双切制砂岩台阶 | 双切制砂岩台阶 | double_stone_block_slab4 | 3 | cut_sandstone_double_slab | 0
| 双切制红砂岩台阶 | 双切制红砂岩台阶 | double_stone_block_slab4 | 4 | cut_red_sandstone_double_slab | 0
| 雕纹砂岩 | 雕纹砂岩 | sandstone | 1 | chiseled_sandstone | 0
| 切制砂岩 | 切制砂岩 | sandstone | 2 | cut_sandstone | 0
| 平滑砂岩 | 平滑砂岩 | sandstone | 3 | smooth_sandstone | 0
| 暗海晶石 | 暗海晶石 | prismarine | 1 | dark_prismarine | 0
| 海晶石砖 | 海晶石砖 | prismarine | 2 | prismarine_bricks | 0
| 红沙 | 红沙 | sand | 1 | red_sand | 0
| 雕纹石英块 | 雕纹石英块 | quartz_block | 1 | chiseled_quartz_block | 0
| 石英柱 | 石英柱 | quartz_block | 2 | quartz_pillar | 0
| 平滑石英块 | 平滑石英块 | quartz_block | 3 | smooth_quartz | 0
| 雕纹红砂岩 | 雕纹红砂岩 | red_sandstone | 1 | chiseled_red_sandstone | 0
| 切制红砂岩 | 切制红砂岩 | red_sandstone | 2 | cut_red_sandstone | 0
| 平滑红砂岩 | 平滑红砂岩 | red_sandstone | 3 | smooth_red_sandstone | 0
| 开裂的铁砧 | 开裂的铁砧 | anvil | 4 | chipped_anvil | 0
| 损坏的铁砧 | 损坏的铁砧 | anvil | 8 | damaged_anvil | 0
| 砂土 | 砂土 | dirt | 1 | coarse_dirt | 0
| 苔石墙 | 苔石墙 | cobblestone_wall | 1 | mossy_cobblestone_wall | 0
| 花岗岩墙 | 花岗岩墙 | cobblestone_wall | 2 | granite_wall | 0
| 闪长岩墙 | 闪长岩墙 | cobblestone_wall | 3 | diorite_wall | 0
| 安山岩墙 | 安山岩墙 | cobblestone_wall | 4 | andesite_wall | 0
| 砂岩墙 | 砂岩墙 | cobblestone_wall | 5 | sandstone_wall | 0
| 红砖墙 | 红砖墙 | cobblestone_wall | 6 | brick_wall | 0
| 石砖墙 | 石砖墙 | cobblestone_wall | 7 | stone_brick_wall | 0
| 苔石砖墙 | 苔石砖墙 | cobblestone_wall | 8 | mossy_stone_brick_wall | 0
| 下界砖墙 | 下界砖墙 | cobblestone_wall | 9 | nether_brick_wall | 0
| 末地石砖墙 | 末地石砖墙 | cobblestone_wall | 10 | end_stone_brick_wall | 0
| 海晶石墙 | 海晶石墙 | cobblestone_wall | 11 | prismarine_wall | 0
| 红砂岩墙 | 红砂岩墙 | cobblestone_wall | 12 | red_sandstone_wall | 0
| 红色下界砖墙 | 红色下界砖墙 | cobblestone_wall | 13 | red_nether_brick_wall | 0
| 湿海绵 | 湿海绵 | sponge | 1 | wet_sponge | 0
### 仅名称变更(内容不变)
| 新中文名 | 旧中文名 | 英文命名 | 附加值 |
| :------ | ------ | ------ | ------ |
| 橡木门 | 木门 | wooden_door | 0 |
| 双绯红木台阶 | 绯红木双层台阶 | crimson_double_slab | 0 |
| 双诡异木台阶 | 诡异木双层台阶 | warped_double_slab | 0 |
| 双深板岩圆石台阶 | 深板岩圆石双层台阶 | cobbled_deepslate_double_slab | 0 |
| 双磨制深板岩台阶 | 磨制深板岩双层台阶 | polished_deepslate_double_slab | 0 |
| 双深板岩瓦台阶 | 深板岩瓦双层台阶 | deepslate_tile_double_slab | 0 |
| 双深板岩砖台阶 | 深板岩砖双层台阶 | deepslate_brick_double_slab | 0 |
| 悬挂式云杉木告示牌 | 云杉木悬挂告示牌 | spruce_hanging_sign | 0 |
| 悬挂式白桦木告示牌 | 白桦木悬挂告示牌 | birch_hanging_sign | 0 |
| 悬挂式金合欢木告示牌 | 金合欢木悬挂告示牌 | acacia_hanging_sign | 0 |
| 悬挂式深色橡木告示牌 | 深色橡木悬挂告示牌 | dark_oak_hanging_sign | 0 |
| 双樱花木台阶 | 樱花木双层台阶 | cherry_double_slab | 0 |
### 新增项
| 中文名称 | 英文命名 | 附加值 |
| :------ | ------ | ------ |
| 双平滑石头台阶 | smooth_stone_double_slab | 0 |
| 下界砖 | nether_brick | 0 |
| 骷髅模型 | skeleton_skull | 0 |
| 潜声感测器 | sculk_sensor | 0 |
| 荧光物品展示框 | glow_frame | 0 |
| 潜声 | sculk | 0 |
| 红树木门 | mangrove_door | 0 |
| 红树木告示牌 | mangrove_standing_sign | 0 |
| 双红树木台阶 | mangrove_double_slab | 0 |
| 悬挂式橡木告示牌 | oak_hanging_sign | 0 |
| 悬挂式丛林木告示牌 | jungle_hanging_sign | 0 |
| 悬挂式绯红木告示牌 | crimson_hanging_sign | 0 |
| 悬挂式诡异木告示牌 | warped_hanging_sign | 0 |
| 悬挂式红树木告示牌 | mangrove_hanging_sign | 0 |
| 悬挂式竹告示牌 | bamboo_hanging_sign | 0 |
| 悬挂式樱花木告示牌 | cherry_hanging_sign | 0 |
| 光源方块-亮度1 | light_block_1 | 0 |
| 光源方块-亮度2 | light_block_2 | 0 |
| 光源方块-亮度3 | light_block_3 | 0 |
| 光源方块-亮度4 | light_block_4 | 0 |
| 光源方块-亮度5 | light_block_5 | 0 |
| 光源方块-亮度6 | light_block_6 | 0 |
| 光源方块-亮度7 | light_block_7 | 0 |
| 光源方块-亮度8 | light_block_8 | 0 |
| 光源方块-亮度9 | light_block_9 | 0 |
| 光源方块-亮度10 | light_block_10 | 0 |
| 光源方块-亮度11 | light_block_11 | 0 |
| 光源方块-亮度12 | light_block_12 | 0 |
| 光源方块-亮度13 | light_block_13 | 0 |
| 光源方块-亮度14 | light_block_14 | 0 |
| 光源方块-亮度15 | light_block_15 | 0 |
| 紫珀柱 | purpur_pillar | 0 |
| 凋灵骷髅模型 | wither_skeleton_skull | 0 |
| 僵尸模型 | zombie_head | 0 |
| 模型 | player_head | 0 |
| 苦力怕模型 | creeper_head | 0 |
| 龙的模型 | dragon_head | 0 |
| 猪灵模型 | piglin_head | 0 |
| 苍白橡木按钮 | pale_oak_button | 0 |
| 苍白橡木门 | pale_oak_door | 0 |
| 苍白橡木栅栏 | pale_oak_fence | 0 |
| 苍白橡木栅栏大门 | pale_oak_fence_gate | 0 |
| 苍白橡木悬挂告示牌 | pale_oak_hanging_sign | 0 |
| 去皮苍白橡树原木 | stripped_pale_oak_log | 0 |
| 苍白橡树原木 | pale_oak_log | 0 |
| 苍白橡木木板 | pale_oak_planks | 0 |
| 苍白橡木压力板 | pale_oak_pressure_plate | 0 |
| 苍白橡木台阶 | pale_oak_slab | 0 |
| 苍白橡木双台阶 | pale_oak_double_slab | 0 |
| 苍白橡木楼梯 | pale_oak_stairs | 0 |
| 苍白橡木活板门 | pale_oak_trapdoor | 0 |
| 去皮苍白橡木 | stripped_pale_oak_wood | 0 |
| 苍白橡木 | pale_oak_wood | 0 |
| 苍白橡木树苗 | pale_oak_sapling | 0 |
| 苍白橡木树叶 | pale_oak_leaves | 0 |
| 苍白苔藓块 | pale_moss_block | 0 |
| 苍白苔藓地毯 | pale_moss_carpet | 0 |
| 苍白垂须 | pale_hanging_moss | 0 |
| 嘎枝之心 | creaking_heart | 0 |
| 树脂砖块 | resin_bricks | 0 |
| 树脂砖台阶 | resin_brick_slab | 0 |
| 双树脂砖台阶 | resin_brick_double_slab | 0 |
| 树脂砖楼梯 | resin_brick_stairs | 0 |
| 树脂砖墙 | resin_brick_wall | 0 |
| 张开的眼眸花 | open_eyeblossom | 0 |
| 闭合的眼眸花 | closed_eyeblossom | 0 |
| 雕纹树脂砖块 | chiseled_resin_bricks | 0 |
| 树脂块 | resin_block | 0 |
| 树脂团 | resin_clump | 0 |
### 移除项
| 中文名称 | 英文命名 | 附加值 |
| :------ | ------ | ------ |
| 石头双层台阶 | double_stone_block_slab | 0 |
| 蘑菇 | brown_mushroom_block | 0 |
| 下界砖块 | nether_brick | 0 |
| 生物头颅 | skull | 0 |
| 紫珀柱子 | purpur_block | 2 |
| 幽匿感测体 | sculk_sensor | 0 |
| 幽匿块 | sculk | 0 |
| 红树林门 | mangrove_door | 0 |
| 红树林告示牌 | mangrove_standing_sign | 0 |
| 双红树林台阶 | mangrove_double_slab | 0 |
| 橡树悬挂告示牌 | oak_hanging_sign | 0 |
| 丛林悬挂告示牌 | jungle_hanging_sign | 0 |
| 绯红悬挂告示牌 | crimson_hanging_sign | 0 |
| 翘曲悬挂告示牌 | warped_hanging_sign | 0 |
| 红树林悬挂告示牌 | mangrove_hanging_sign | 0 |
| 竹制悬挂告示牌 | bamboo_hanging_sign | 0 |
| 樱花悬挂告示牌 | cherry_hanging_sign | 0 |

View File

@@ -0,0 +1,94 @@
---
front:
hard: 入门
time: 分钟
---
# 自定义鱼竿
## 概述
属于特殊的自定义物品,在支持自定义物品所有特性的基础上,还具有原版鱼竿相关功能,可以自定义鱼线长、鱼线颜色,以及鱼漂,其中鱼漂支持自定义实体
## 注册
1. 与自定义基础物品的注册1-6步相同
1. 在behavior/netease_items_beh的json中添加武器/工具相关的定义,包括:
custom_item_type为custom_item_type
一个netease:fishing_hook组件选填。组件的参数见[json组件](#json组件)
```json
{
"minecraft:item": {
"description": {
"category": "Custom",
"identifier": "customshield:test_fishing_rod",
"custom_item_type": "fishing_rod"
},
"components": {
"netease:fishing_hook":{
"hook_entity":["minecraft:creeper"],//代表投掷出的将会是一个苦力怕实体作为鱼漂苦力实体无AI。
"line_max":50,//代表鱼线可以达到的最长长度(鱼漂与玩家实体的直线距离),超过这个长度后鱼线将会直接断开
"line_color":[0.6, 0.5, 0.3, 1.0]//线的颜色和透明度
}
}
},
"format_version": "1.10"
}
```
## JSON组件
### 网易components
* netease:fishing_hook
| 键 | 类型 | 默认值 | 解释 |
| -------- | ---- | --------- | ---------------------------------------------- |
| hook_entity | str | | 实体的identify填入的实体除了无AI以外支持动画、动画控制器等实体一系列操控 |
| line_max | int | 32 | 代表鱼线可以达到的最长长度鱼漂与玩家实体的直线距离超过这个长度后鱼线将会直接断开。如果不配置代表和原版鱼线一致为32米 |
| line_color | list(rgba) | | 代表鱼线的初始颜色与透明度,如果不配置默认为原版鱼竿黑色 |
## 新增的事件和接口
### 事件
* <a href="../../../../mcdocs/1-ModAPI/事件/玩家.html#playerfishingserverevent">PlayerFishingServerEvent</a>
服务端,钓鱼成功收杆时触发事件
* <a href="../../../../mcdocs/1-ModAPI/事件/玩家html#playerfishingafterserverevent">PlayerFishingAfterServerEvent</a>
服务端,钓鱼成功收杆后触发事件
* <a href="../../../../mcdocs/1-ModAPI/事件/玩家html#playerstartfishingserverevent">PlayerStartFishingServerEvent</a>
服务端,玩家开始钓鱼事件
### 接口
* <a href="../../../../mcdocs/1-ModAPI/接口/玩家/背包.html#getplayerfishitem">GetPlayerFishItem</a>
服务端接口。获取玩家钓鱼时候的鱼竿物品字典
* <a href="../../../../mcdocs/1-ModAPI/接口/玩家/行为.html#getplayerisfishing">GetPlayerIsFishing</a>
客户端接口。获取玩家是否在钓鱼
* <a href="../../../../mcdocs/1-ModAPI/接口/玩家/背包.html#getplayerfishhookentity">GetPlayerFishHookEntity</a>
客户端接口。获取玩家钓鱼时候的鱼漂实体id
## demo解释
[自定义鱼竿](../../13-模组SDK编程/60-Demo示例.md#CustomFishHookItemMod)中定义了一个自定义鱼竿

View File

@@ -196,7 +196,7 @@ time: 分钟
| type | string | | 必须设置,用于控制生成的生物类型 | | type | string | | 必须设置,用于控制生成的生物类型 |
- 原生生物type为"minecraft:Namespaced ID",如"minecraft:parrot"Namespaced ID可参考[官方wiki](https://zh.minecraft.wiki/w/%E5%9F%BA%E5%B2%A9%E7%89%88%E6%95%B0%E6%8D%AE%E5%80%BC/%E5%AE%9E%E4%BD%93ID)中各Mob的详细信息。 - 原生生物type为"minecraft:Namespaced ID",如"minecraft:parrot"Namespaced ID可参考[官方wiki](https://zh.minecraft.wiki/w/%E5%9F%BA%E5%B2%A9%E7%89%88%E6%95%B0%E6%8D%AE%E5%80%BC/%E5%AE%9E%E4%BD%93ID)中各Mob的详细信息。
- 微软自定义生物type为"minecraft:entity"中"description"的"identifier"项,可参考[自定义生物文档](../../3-自定义生物/01-自定义基础生物.md)及[CustomBlocksMod](../../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)中的customblocks_test_mobspawner1.json。 - 微软自定义生物type为"minecraft:entity"中"description"的"identifier"项,可参考[自定义生物文档](../3-自定义生物/01-自定义基础生物.md)及[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)中的customblocks_test_mobspawner1.json。
- 自定义刷怪箱方块的base_block需要设为mob_spawner。 - 自定义刷怪箱方块的base_block需要设为mob_spawner。

View File

@@ -0,0 +1,242 @@
# 物理的使用指南
## 使用准则与免责声明
### 使用准则
1. 仅限第三方用户生成内容UGC使用
2. 只有创作者创建的自定义实体才能与物理刚体绑定原版实体无法与PhysX创建的刚体绑定
3. 物理身件可以与其他游戏物件(包括原生游戏物件)产生互动,但是原生游戏物件与其他原生游戏物件之间的互动方式及物理碰撞不会被改变
4. 当两个碰撞同时发生时,核心游戏的物理引擎具有最高优先级
只有满足上述条件,您的模组才能符合要求进行上架
### 免责声明
物理相关api与特性可能会在将来调整并且不向前兼容。请随时做好调整的准备
但是,每次调整都会做出充分的预告和调整内容公告,方便你对您的模组进行最新内容的兼容。
## 准备工作
由于我们的物理引擎是用的 NVIDIA PhysX您可以先前往NVIDIA官网下载PhysX Visual Debugger方便后续调试。
[https://developer.nvidia.com/physx-visual-debugger](https://developer.nvidia.com/physx-visual-debugger)
![img.png](./picture/img_2.png)
## 全局配置
在使用物理引擎之前,您需要在模组的 behavior_packs 行为包中新增 physx_setting.json 全局配置文件
![img.png](./picture/img.png)
文件里面需要设置成
```json
{
"enable": true
}
```
保存后,您的模组可以正常使用 PhysX 物理引擎了。
## 开始创作
现在我会通过demo来向你介绍physx能做的内容
### 创建自定义刚体
使用物理内容的之前,您首先需要创建一个新的物理刚体,物理刚体**必须**绑定在`自定义实体`上,且创建刚体的方法只能在 `AddEntityServerEvent` 事件中使用
```python
# 创建一个自定义刚体
comp = serverApi.GetEngineCompFactory().CreatePhysx(entityId)
comp.CreatePxActor()
```
现在你已经为这个 entityId 的实体添加了一个物理刚体
> 注意: 刚体创建数量不得大于 8192 虽然Physx限制是31767但是我们需要预留一些刚体阈值给到其他实体和客户端内容
> 注意:必须要在 AddEntityServerEvent 事件中创建刚体,否则会报错
> 注意:实体必须绑定在 自定义实体上,不得绑定在原版实体上
### 添加包围盒
目前这个刚体暂时没有任何功能和属性,为了让它能够正常工作,我们需要给刚体添加一些属性
首先需要添加包围盒,包围盒是刚体的基本属性,你只有添加了包围盒,才能让刚体与世界实体进行交互
添加包围盒的方法是 AddBoxGeometry ,参数方法如下
```python
# localTransform tuple(float,float,float) 盒子中心相对实体原点的偏移
# halfX float 表示盒子长度的一半
# halfY float 表示盒子高度的一半
# halfZ float 表示盒子宽度的一半
# staticFriction float 静摩擦系数
# dynamicFriction float 动摩擦系数默认为e 注意此摩擦力设置为0并不代表刚体与原生游戏交互也是 0 摩擦力
# restitution float 弹性恢复系数默认为0
# eventMask int PxEventMask枚举用于监听碰撞事件默认为PxRigidBodyFlag.Null即不需要碰撞事件
# userData None或str 可记录自定义数据长度不超过20默认为None
comp.AddBoxGeometry((0, 0.9, 0), 0.3, 0.9, 0.3, 0.05, 0.05, 0, PxEventMask.Server | PxEventMask.Found, None)
```
PxEventMask 枚举目前有六个
1. PxEventMask.Server 服务端事件
2. PxEventMask.Client 客户端事件
3. PxEventMask.Lost 结束碰撞事件
4. PxEventMask.Found 开始碰撞事件
5. PxEventMask.Found_Detail 碰撞事件的详细信息
6. PxEventMask.Null 该刚体不附加任何事件
此时你已经成功为你的刚体创建好了包围盒
当你启动游戏时,如果你此时提前打开了 PhysX Visual Debugger那么刚体的包围盒就会显示出来了
![img.png](./picture/img_3.png)
红色代表世界的原生方块、绿色和黄色代表刚体的包围盒
![img.png](./picture/img_4.png)
### 添加约束和运动
如果你想给刚体添加一些约束,比如刚体的运动锁定某个轴体,您需要添加动态约束
```python
# 下面的方法是规定此刚体只会沿着 X Y Z 轴运动
comp.SetRigidDynamicLockFlags(PxRigidDynamicLockFlag.eLOCK_ANGULAR_X | PxRigidDynamicLockFlag.eLOCK_ANGULAR_Y | PxRigidDynamicLockFlag.eLOCK_ANGULAR_Z)
```
PxRigidDynamicLockFlag 枚举目前有六个
1. PxRigidDynamicLockFlag.eLOCK_ANGULAR_X 锁定沿着 X 轴运动
2. PxRigidDynamicLockFlag.eLOCK_ANGULAR_Y 锁定沿着 Y 轴运动
3. PxRigidDynamicLockFlag.eLOCK_ANGULAR_Z 锁定沿着 Z 轴运动
4. PxRigidDynamicLockFlag.eLOCK_LINEAR_X 锁定沿着 X 轴旋转
5. PxRigidDynamicLockFlag.eLOCK_LINEAR_Y 锁定沿着 Y 轴旋转
6. PxRigidDynamicLockFlag.eLOCK_LINEAR_Z 锁定沿着 Z 轴旋转
如果你希望您的刚体具有运动的属性你需要将刚体设置为运动学刚体
那什么叫做有运动的属性
比如你想要手动控制刚体的运动那么你需要将刚体设置为运动学刚体
包括做成刚体风车刚体传送带等行为
```python
# 目前PxRigdiBodyFlag 仅支持PxRigidBodyFlag.eKINEMATIC
comp.SetRigidBodyFlag(PxRigidBodyFlag.eKINEMATIC, True)
```
### AI控制
利用实体创建刚体您需要对AI进行调整
否则在客户端会出现悬空的情况
```python
comp = serverApi.GetEngineCompFactory().CreateControlAi(entityId)
comp.SetBlockControlAi(False)
```
### 做一个简单的风车
对此我们可以通过上述内容做一个简单的风车,我们计划是配合方块调色板 + 物理引擎来做一个简单的风车
机械动力的风车是一个比较不错的参考对象
我们仿照机械动力的风车,来做一个中国版物理引擎的风车
首先根据上面介绍的内容,我们依次创建刚体,设置包围盒
但是原版Java版机械动力的风车可以自由组合方块所以我们需要一个刚体对应一个方块。目前规划是创建一个长度5格的刚体
可以做一个for循环
```python
for i in range(2):
for j in range(-2,3):
comp.AddBoxGeometry((j, 0.5 + i, 0), 0.5, 0.5, 0.5, 0.05, 0.05, 0,
PxEventMask.Server | PxEventMask.Client | PxEventMask.Found | PxEventMask.Found_Detail | PxEventMask.Lost,
%s,%s,0'%(j, i))
```
此时就会创建一个总长度 5 格的刚体包围盒,并且每个刚体对应一个方块
因为这个刚体会有旋转的效果,所以我们需要给刚体添加一个运动属性
```python
# 目前PxRigdiBodyFlag 仅支持PxRigidBodyFlag.eKINEMATIC
comp.SetRigidBodyFlag(PxRigidBodyFlag.eKINEMATIC, True)
```
因为刚体旋转是通过传入一个四元数并对四元数调整来达到目标的
所以我们需要创建一个四元数组
```python
# 这里建议用一个成员变量来做存储,方便删除实体后对数据进行调整和删除
self.mSkeletons[entityId] = Quaternion(0, 0, 0, 1)
```
因为旋转是一个连续的过程所以我们需要重写Update方法以达到每tick刷新我们的旋转数据
```python
# 这里我们对 self.mSkeletons 进行遍历,获取刚刚存储好的四元数,修改的同时传入刚体运动方法
for entityId, v in self.mSkeletons.iteritems():
# 旋转
q = v * Quaternion.AngleAxis(1, Vector3.Up())
# 修改变量值
self.mSkeletons[entityId] = q
# 设置为运动学目标
comp = serverApi.GetEngineCompFactory().CreatePhysx(entityId)
# 运动
comp.SetKinematicTarget(None, q.ToTuple())
```
此时刚体就会每tick旋转角度
但是目前做的内容仅仅只是对刚体进行了旋转,客户端没有表现,我们还需要用方块调色板对客户端进行调试
首先创建一个调色板
```python
dataDict = {'extra': {}, 'void': False, 'actor': {}, 'volume': (1, 5, 2), 'common': {('minecraft:grass_block', 0): [4, 9], ('minecraft:glass', 0): [1, 6], ('minecraft:quartz_block', 0): [3, 8], ('minecraft:white_wool', 0): [0, 5], ('minecraft:oak_planks', 0): [2, 7]}, 'eliminateAir': True}
comp = compFactory.CreateBlock(levelId)
palette = comp.GetBlankBlockPalette()
palette.DeserializeBlockPalette(dataDict)
blockGeometryComp = compFactory.CreateBlockGeometry(levelId)
geometryName = blockGeometryComp.CombineBlockPaletteToGeometry(palette,"my_block_geometry")
```
然后需要将调色板绑定在实体上,但是绑定刚体是欧拉角,也就是说我们还需要将四元数转成欧拉角
好在ModSDK提供了这个简单的方法物理引擎也有获取客户端刚体的四元数数据
```python
actorRenderComp = compFactory.CreateActorRender(entityId)
comp = compFactory.CreatePhysx(entityId)
q = Quaternion(comp.GetQuaternion())
# AddActorBlockGeometry 在 3.7 新增了一个参数, 会控制先旋转后偏移还是先偏移后旋转。默认是False
# 为了做风车,我们设置为 True也就是先旋转再偏移
actorRenderComp.AddActorBlockGeometry(geometryName, (-2, 0, 0), q.EulerAngles().ToTuple(), 0True)
self.mSkeletons.add(entityId)
```
此时刚体的方块调色板就已经绑定在实体上了,但是这个我们查看 PhysX Visual Debugger 时,发现刚体变动了,但是调色板方块没有变化
所以我们也要对客户端表现进行调整
同样需要重写 Update 方法每tick修改方块调色板的旋转角度
```python
def Update(self):
for entityId in self.mSkeletons:
comp = compFactory.CreatePhysx(entityId)
q = comp.GetQuaternion()
if q:
q = Quaternion(q)
actorRenderComp = compFactory.CreateActorRender(entityId)
actorRenderComp.SetActorBlockGeometryRotation("my_block_geometry", q.EulerAngles().ToTuple())
```
当全部完成后,就可以做到风车围绕着一个自定义实体进行旋转,然后推动实体进行移动了
并且你也可以站在这个刚体上,但是站在刚体上,刚体并不会带着玩家一起移动,开发者们可以自行思考解决办法来处理这个问题!
![img_5.png](./picture/img_5.png)
### 思考
虽然我们现在是在用 Update 的方式去动态的调整刚体旋转和外观旋转
但是进入游戏后会发现,用此方法来旋转会有一点的顿挫感,虽然影响不是很大,但如果你需要追求细致,可能还不算太完美
或许还可以通过 `GameRenderTickEvent` 来调整,但是这个方法笔者并没有使用过,所以需要开发者们自行思考研究

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

View File

@@ -44,17 +44,19 @@ time: 60分钟
#### 1. 无root安装node.js #### 1. 无root安装node.js
**强制要求安装node16+的版本,不然守护进程跑不起来**
```bash ```bash
# 下载nodejs # 下载nodejs
cd ~/downloads cd ~/downloads
wget https://nodejs.org/dist/v15.7.0/node-v15.7.0-linux-x64.tar.xz wget https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xz
# 创建工作目录并解压 # 创建工作目录并解压
mkdir -p ~/apps/node-v15.7.0 mkdir -p ~/apps/node-v16.20.2
tar -xJf node-v15.7.0-linux-x64.tar.xz --no-wildcards-match-slash --anchored --exclude */CHANGELOG.md --exclude */LICENSE --exclude */README.md --strip 1 -C ~/apps/node-v15.7.0 tar -xJf node-v16.20.2-linux-x64.tar.xz --no-wildcards-match-slash --anchored --exclude */CHANGELOG.md --exclude */LICENSE --exclude */README.md --strip 1 -C ~/apps/node-v16.20.2
# 添加path变量 # 添加path变量
export PATH=~/apps/node-v15.7.0/bin:$PATH export PATH=~/apps/node-v16.20.2/bin:$PATH
source ~/.bashrc source ~/.bashrc
# 检查nodejs版本 # 检查nodejs版本

View File

@@ -0,0 +1,79 @@
---
front:
hard: 入门
time: 15分钟
---
# Allay部署教程
本系列教程将指导您使用Allay搭建一个服务器安装NetAllay以使用网易独有接口以及使用WaterdogPE搭建群组服。
本系列教程主要侧重于网易版相关内容。有关Allay的更多文档请移步至[AllayMC官方文档站](https://docs.allaymc.org)。
相关链接:
- AllayMC交流群QQ1072132791
- AllayMC官方文档站https://docs.allaymc.org
- AllayMC插件市场https://hub.allaymc.org
- AllayMC代码仓库https://github.com/AllayMC/Allay
## 安装Java
Allay 需要**Java 21**才能运行。市面上有多种 Java 发行版,但我们推荐以下版本:
- [**GraalVM**](https://www.graalvm.org/) 提供更好的性能
- [**OpenJDK**](https://adoptium.net/) 提供更佳的稳定性
安装后,通过运行以下程序验证 Java 是否正确安装:
```shell
java --version
```
如果 Java 安装正确,您应该能看到没有错误提示的版本输出。
## 使用AllayLauncher
[AllayLauncher](https://github.com/AllayMC/AllayLauncher)是一个轻量级、快速的工具用C++编写能帮您轻松下载、更新和管理您的Allay实例。
安装它只需执行一个命令:
Windows (PowerShell):
```powershell
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/AllayMC/AllayLauncher/refs/heads/main/scripts/install_windows.ps1").Content
```
Linux:
```bash
wget -qO- https://raw.githubusercontent.com/AllayMC/AllayLauncher/refs/heads/main/scripts/install_linux.sh | bash
```
## 手动安装Allay
### 获取Allay核心文件
请从[GitHub Releases](https://github.com/AllayMC/Allay/releases/latest)页面获取最新稳定版本。您也可以尝试[Nightly Build](https://github.com/AllayMC/Allay/releases/tag/nightly)。
您应该会得到一个文件,名称如下:
```
allay-server-<version>-<commit-hash>[-dev]-shaded.jar
```
示例:
```
allay-server-0.1.0-dev-shaded.jar
```
> `-dev`后缀表示开发版本。
### 运行服务器
如果您的系统有图形界面GUI只需双击jar文件即可。如果正确安装了Java会出现类似这样的窗口
![installation-p1.png](images/installation-p1.png)
如果您在无头服务器(无图形界面)上,使用以下命令启动服务器:
```bash
java -jar allay-server-*-shaded.jar
```
您会在终端看到同样的启动输出。

View File

@@ -0,0 +1,51 @@
---
front:
hard: 入门
time: 20分钟
---
# 启用网易支持
本文将指导您调整服务器设置以允许网易客户端进服如果您并不了解如何部署一个Allay服务器请移步至[Allay部署教程](0-Allay部署教程.md)。
## 调整`server-settings.yml`
Allay默认不允许网易客户端进服需要修改服务器根目录下`server-settings.yml`中的如下配置项:
```yaml
network-settings:
# Enable support for NetEase (China) Minecraft clients
netease-client-support: true
# If set to true, only NetEase clients can join the server
# This option only takes effect when netease-client-support is enabled
only-allow-netease-client: false
```
您还可以将`only-allow-netease-client`设置为`true`,以阻止国际版客户端进服。
## 安装NetAllay可选
Allay的API模块默认不提供网易版独有接口例如PyRpc商城接口等。如需使用您需要在服务器上安装[NetAllay](https://github.com/AllayMC/NetAllay)。
您需要从Release页面下载NetAllay的jar包并将其放入服务器的`plugins`文件夹内。
如果您的插件需要调用NetAllay的接口需要在项目中引入NetAllay作为依赖
```kotlin
repositories {
mavenCentral()
}
dependencies {
compileOnly("org.allaymc:net-allay:<version>")
}
allay {
plugin {
dependency("NetAllay")
}
}
```
有关NetAllay的更多内容
- 常用接口文档请见[NetAllay常用接口文档](3-NetAllay常用接口文档.md)
- 源码与项目仓库请见https://github.com/AllayMC/NetAllay

View File

@@ -0,0 +1,85 @@
---
front:
hard: 进阶
time: 30分钟
---
# 使用WaterdogPE搭建群组服
本文将指导您使用WaterdogPE搭建群组服务器您需要具有群组服部署相关经验。WaterdogPE是一款适用于MCBE的群组服反代软件类似MCJE的BungeeCord以及Velocity。
有关更多WaterdogPE的相关文档您可以移步至其[官方文档站](https://docs.waterdog.dev/books/waterdogpe-setup),本文将侧重于网易相关内容。
## 构建WaterdogPE
由于WaterdogPE官方仓库并未提供网易客户端支持您需要使用[AllayMC的分叉版本](https://github.com/AllayMC/WaterdogPE)请自行构建jar包。
## 启用网易支持
WaterdogPE启动后会生成一个`config.yml`配置文件,您需要修改以下配置项以启用网易客户端支持:
```yaml
netease_client_support: true
# Optional: only allow NetEase clients to connect
only_allow_netease_client: false
```
> 启用网易客户端支持后所有RakNet v8客户端都将被视为网易客户端。
## 配置下游服务器
`config.yml`您需要配置WaterdogPE所代理的下游Allay服务器。以下是一个示例配置
```yaml
# 下游服务器列表
servers:
lobby:
address: 127.0.0.1:19133
public_address: play.myserver.com:19133
survival:
address: 127.0.0.1:19134
# 玩家连接时的服务器优先级(玩家进服后默认进入列表中的第一个服务器)
priorities:
- lobby
- survival
# 强制域名映射(可选)
forced_hosts:
lobby.myserver.com: lobby
```
其中:
- `address`:下游服务器的实际地址和端口
- `public_address`:(可选)公开地址,用于玩家直连该子服
- `priorities`:玩家进入代理后默认连接的服务器顺序
## 其他常用配置
以下是`config.yml`中一些值得关注的配置项:
```yaml
# 代理监听地址与端口
host: 0.0.0.0:19132
# 最大玩家数
max_players: 20
# 传递玩家真实信息到下游服务器(推荐启用)
use_login_extras: true
# 启用快速转服(玩家在子服之间转移时不会断开连接)
fast_transfer: true
# 压缩等级设置
# 上行代理→客户端值越高带宽越省但CPU占用越高
upstream_compression_level: 7
# 下行(代理→子服),本地网络可设为较低值
downstream_compression_level: -1
```
> `use_login_extras`启用后代理会在LoginPacket中附加`Waterdog_IP`玩家真实IP和`Waterdog_XUID`玩家XUID等信息方便下游服务器获取玩家的真实连接信息。
## 配置下游Allay服务器
下游Allay服务器同样需要启用网易客户端支持请参考[启用网易支持](1-启用网易支持.md)。
此外请确保每个下游Allay服务器监听的端口与WaterdogPE中配置的`address`端口一致。例如若WaterdogPE中配置了`lobby`服务器地址为`127.0.0.1:19133`则对应Allay服务器的端口应设置为`19133`

View File

@@ -0,0 +1,399 @@
---
front:
hard: 进阶
time: 30分钟
---
# NetAllay常用接口文档
本文整理了`NetAllay`项目中最常用、最适合插件开发直接使用的接口方便您在Allay服务器中调用网易版独有能力例如PyRpc通信与商城能力。
如果您尚未安装NetAllay请先阅读[启用网易支持](1-启用网易支持.md)。
## 获取NetAllay实例
调用接口前,先拿到`NetAllay`插件实例:
```java
import org.allaymc.api.server.Server;
import org.allaymc.netallay.NetAllay;
// 方式一:直接获取静态实例
NetAllay netAllay = NetAllay.getInstance();
// 方式二:通过插件管理器获取
NetAllay netAllay = (NetAllay) Server.getInstance()
.getPluginManager()
.getPlugin("NetAllay");
```
## PyRpc事件监听
### 监听客户端发来的事件
最常用的入口是`listenForEvent`用于监听网易客户端发送到服务端的PyRpc事件。
```java
netAllay.listenForEvent(
"MyMod",
"MySystemCS",
"OnButtonClick",
(player, data) -> {
String buttonId = (String) data.get("buttonId");
plugin.getPluginLogger().info("玩家点击了按钮: {}", buttonId);
}
);
```
参数说明:
- `namespace`命名空间一般对应客户端Mod命名空间
- `systemName`:客户端系统名
- `eventName`:事件名
- `handler`:回调函数,参数为`Player``Map<String, Object>`
### 取消事件监听
如果您不再需要某个监听器,可以调用以下接口:
```java
boolean removed = netAllay.unlistenForEvent(namespace, systemName, eventName, handler);
netAllay.unlistenAllForEvent(namespace, systemName, eventName);
```
其中:
- `unlistenForEvent`:取消一个具体处理器
- `unlistenAllForEvent`:取消某个事件下的全部处理器
## 向客户端发送PyRpc事件
### 发送给单个玩家
```java
Map<String, Object> data = new LinkedHashMap<>();
data.put("message", "Hello from server!");
data.put("timestamp", System.currentTimeMillis());
boolean success = netAllay.notifyToClient(
player,
"MyMod",
"MySystemSS",
"ServerMessage",
data
);
```
该方法返回`boolean`,表示是否发送成功。若玩家不是网易客户端,则会返回`false`
### 立即发送
若您希望不经过缓冲立即下发,可以使用:
```java
boolean success = netAllay.notifyToClientImmediately(
player,
"MyMod",
"MySystemSS",
"ServerMessage",
data
);
```
### 发送给多个玩家
```java
int successCount = netAllay.notifyToMultiClients(
players,
"MyMod",
"MySystemSS",
"Announcement",
Map.of("content", "服务器公告")
);
```
返回值为成功发送的玩家数量。
### 发送给附近玩家
```java
var center = player.getControlledEntity().getLocation();
int count = netAllay.notifyToClientsNearby(
null,
center,
50.0,
"MyMod",
"MySystemSS",
"NearbyEvent",
Map.of("type", "explosion")
);
```
参数中的`except`可用于排除某个玩家;若不需要排除,传`null`即可。
### 广播到世界、维度或全服
广播接口统一为`broadcastToAllClient`,但有三个重载版本:
```java
// 广播到指定世界
int worldCount = netAllay.broadcastToAllClient(
null,
world,
"MyMod",
"MySystemSS",
"WorldEvent",
data
);
// 广播到指定维度
int dimensionCount = netAllay.broadcastToAllClient(
null,
dimension,
"MyMod",
"MySystemSS",
"DimensionEvent",
data
);
// 广播到整个服务器
int serverCount = netAllay.broadcastToAllClient(
null,
"MyMod",
"MySystemSS",
"GlobalEvent",
data
);
```
## 工具接口
### 判断玩家是否为网易客户端
```java
boolean netease = netAllay.isNetEasePlayer(player);
```
### 获取当前注册的事件数量
```java
int count = netAllay.getRegisteredEventCount();
```
## 特殊常量
### `LOCAL_PLAYER_ENTITY_ID`
```java
int entityId = NetAllay.LOCAL_PLAYER_ENTITY_ID; // -2
```
这个常量表示“接收消息的玩家自己”。常见用法是把实体ID传给客户端时使用`-2`代表当前玩家自身实体。
```java
netAllay.notifyToClient(
player,
"MyMod",
"MySystemSS",
"Welcome",
Map.of("entityId", NetAllay.LOCAL_PLAYER_ENTITY_ID)
);
```
注意:`-2`只能在单播接口`notifyToClient``notifyToClientImmediately`中使用,不要在多播或广播接口中使用。
## 事件数据支持的类型
`NetAllay`的事件数据类型为`Map<String, Object>`,其中值通常支持以下类型:
- `null`
- `Boolean`
- `Integer``Long`
- `Float``Double`
- `String`
- `byte[]`
- `Map<String, Object>`
- `List<?>``Iterable<?>`
一个常见示例:
```java
Map<String, Object> data = new LinkedHashMap<>();
data.put("title", "测试标题");
data.put("count", 1);
data.put("extra", Map.of("flag", true));
data.put("list", List.of("a", "b", "c"));
```
## 商城接口
`NetAllay`内置了商城管理器`ShopManager`,用于控制网易商城界面与监听商城事件。
### 获取商城管理器
```java
var shopManager = netAllay.getShopManager();
```
### 控制商城入口与界面
```java
// 是否启用自定义商城入口
netAllay.enableCustomShopEntry(true);
// 打开商城
netAllay.openShop(player);
// 关闭商城
netAllay.closeShop(player);
// 显示一行提示
netAllay.showHint(player, "购买成功");
// 显示两行提示
netAllay.showHint(player, "购买成功", "奖励已发放");
```
这些方法本质上是对`ShopManager`的便捷封装。
### 监听商城事件
商城常见事件定义在`ShopEvent`中:
- `ShopEvent.PLAYER_BUY_ITEM_SUCCESS`:玩家购买成功
- `ShopEvent.PLAYER_URGE_SHIP`:玩家催发货
- `ShopEvent.CLIENT_LOAD_ADDON_FINISH`客户端加载Addon完成
注册示例:
```java
shopManager.listenForShopEvent(ShopEvent.PLAYER_BUY_ITEM_SUCCESS, (player, data) -> {
plugin.getPluginLogger().info("玩家 {} 完成了一笔购买", player.getOriginName());
});
shopManager.listenForShopEvent(ShopEvent.PLAYER_URGE_SHIP, (player, data) -> {
plugin.getPluginLogger().info("玩家 {} 请求催发货", player.getOriginName());
});
```
取消监听:
```java
boolean removed = shopManager.unlistenForShopEvent(ShopEvent.PLAYER_BUY_ITEM_SUCCESS, handler);
```
### 按玩家覆盖商城配置
如果您希望不同玩家拿到不同的商城参数,可以为玩家设置单独配置:
```java
ShopManager.PlayerShopConfig config = new ShopManager.PlayerShopConfig();
config.setGameId("123456");
config.setUseCustomShop(true);
config.setTestServer(false);
config.setCacheTime(1);
config.setUid(0L);
config.setPlatformUid("");
shopManager.setPlayerConfig(player, config);
```
获取和移除配置:
```java
ShopManager.PlayerShopConfig config = shopManager.getPlayerConfig(player);
shopManager.removePlayerConfig(player);
```
## 配置文件
NetAllay会在插件目录生成`config.json`。当前源码中的默认配置如下:
```json
{
"shop": {
"gameId": "",
"gameKey": "",
"testGameKey": "",
"testServer": false,
"useCustomShop": false,
"cacheTime": 1,
"shopServerUrl": "",
"webServerUrl": ""
}
}
```
其中商城相关字段含义如下:
- `gameId`资源数字ID
- `gameKey`:正式服签名密钥
- `testGameKey`:测试服签名密钥
- `testServer`:是否使用测试服模式
- `useCustomShop`:是否隐藏默认商城按钮并改为自定义入口
- `cacheTime`:商城配置缓存时间,单位为秒
- `shopServerUrl`:自定义订单服务地址,可留空
- `webServerUrl`自定义Web服务地址可留空
如果您在运行中修改了配置,也可以调用以下接口:
```java
netAllay.reloadConfig();
netAllay.saveConfig();
```
## 完整示例
```java
import org.allaymc.api.player.Player;
import org.allaymc.netallay.NetAllay;
import org.allaymc.netallay.shop.ShopEvent;
import java.util.Map;
public final class DemoService {
public void register() {
NetAllay netAllay = NetAllay.getInstance();
netAllay.listenForEvent("MyMod", "MySystemCS", "RequestData", (player, data) -> {
netAllay.notifyToClient(
player,
"MyMod",
"MySystemSS",
"ResponseData",
Map.of(
"success", true,
"playerName", player.getOriginName()
)
);
});
netAllay.getShopManager().listenForShopEvent(ShopEvent.PLAYER_BUY_ITEM_SUCCESS, (player, data) -> {
netAllay.showHint(player, "购买成功", "请及时发货");
});
}
public void welcome(Player player) {
NetAllay.getInstance().notifyToClient(
player,
"MyMod",
"MySystemSS",
"Welcome",
Map.of(
"entityId", NetAllay.LOCAL_PLAYER_ENTITY_ID,
"message", "欢迎来到服务器"
)
);
}
}
```
## 注意事项
- `NetAllay`只会向网易客户端发送数据,非网易玩家会被自动跳过
- 广播、多播、附近广播时不要使用`NetAllay.LOCAL_PLAYER_ENTITY_ID`
- 插件禁用时,建议取消自己注册的事件监听
- 单次发送的数据不宜过大避免发送过大的PyRpc包

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -6,33 +6,63 @@ time: 5分钟
# 组件打包发布 # 组件打包发布
## 前言
本文将从MC Studio工具快捷打包 和 手动打包 两个方面介绍组件的打包发布
## 组件配置 ## 组件配置
在组件的右键菜单选择配置可以对作品的UUID与版本号进行修改 ### 配置介绍
UUID: 代表模组的内容的全局唯一标识符如果有相同的UUID的组件会在组件上传审核机审时候报错
版本号:对应模组内容的迭代版本
### UUID更新
在组件的右键菜单选择配置。可以对作品的UUID与版本号进行修改
![image-20220523212424951](./images/image-20220523212424951.png) ![image-20220523212424951](./images/image-20220523212424951.png)
点击随机UUID将会自动对所有资源包和行为包的UUID进行随机 **点击随机UUID将会自动对所有资源包和行为包的UUID进行随机**
选中对应的资源包右键可以复制其UUID 选中对应的资源包右键可以复制其UUID
![image-20220523212517202](./images/image-20220523212517202.png) ![image-20220523212517202](./images/image-20220523212517202.png)
在开发测试阶段,并不需要关注版本号,而当你的组件需要发布到平台,为了让组件上线后能顺利更新,每次发布前需要提升组件版本号,这里你既可以单独升级个别资源包,也可以全选升级所有资源包。 ### 版本号
## 组件发布 ![升级版本号](./new_images/zujiandabao/0_1.png)
当你的组件一切准备就绪,就可以在组件的右键菜单里,点击进行发布。 在开发测试阶段,并不需要关注版本号,其不会影响你的开发
发布时会自动选中平台已有的同名组件,并自动勾选更新已有作品,因此请尽量保持作品与平台名称一致 当你的组件需要发布到平台,如果你是第一次发布组件时,会以资源包与行为包**默认的0.0.1版本**进行发布。而之后的每次更新发布前,需要提升组件版本号,根据你更新的内容决定,这里你可以单独升级个别资源包,也可以全选升级所有资源包
![image-20220523213006425](./images/image-20220523213006425.png) ## MC Studio进行快捷打包发布
点击确定后,我们会对作品进行自检,然后导出必要的文件,并压缩成<名称_时间.zip>的命名格式,上传到开发者平台,并打开浏览器对应链接,你可以在这个页面进一步编辑器组件的详情,最后点击保存。 1. MC Studio提供了组件间的转换功能你可以在右键菜单里找到它将AddOn方便的转换为地图或服务器Mod
## 组件转换
同时我们还提供了组件间的转换功能你可以在右键菜单里找到它将AddOn方便的转换为地图或服务器Mod
![image-20220523213431590](./images/image-20220523213431590.png) ![image-20220523213431590](./images/image-20220523213431590.png)
2. 当你的组件一切准备就绪,就可以在组件的右键菜单里,点击进行发布,随后会有一个选择界面。
![image-20220523213006425](./images/image-20220523213006425.png)
- 新建作品:你的开发者平台中没有该作品,这时会创建一个全新的组件
- 更新已有作品:此时会自动选中平台已有的同名组件,并自动勾选更新已有作品。**当然也可以手动选择其他组件,但是这代表着其他组件的内容将会被本次发布的组件内容覆盖,因此请尽量保持作品与平台中作品名称一致,避免组件上传错误** (可以看到上图中和首页第一张图的组件名称都是叫lobbyGoodsMod2.0)
3. 点击确定后MC Studio会对作品进行自检然后导出必要的文件并压缩成<名称_时间.zip>的命名格式,上传到开发者平台,并打开浏览器对应链接,你可以在这个页面进一步编辑器组件的详情,最后点击保存。
## 手动打包发布
### 检查包体的文件结构与导出
[课程01.包体的结构和导入](https://mc.163.com/dev/mcmanual/mc-dev/mconline/10-addon%E6%95%99%E7%A8%8B/%E7%AC%AC18%E7%AB%A0%EF%BC%9A%E6%89%93%E5%8C%85%E5%AF%BC%E5%87%BA%E4%BD%A0%E7%9A%84%E4%BD%9C%E5%93%81/%E8%AF%BE%E7%A8%8B01.%E5%8C%85%E4%BD%93%E7%9A%84%E7%BB%93%E6%9E%84%E5%92%8C%E5%AF%BC%E5%85%A5.html?catalog=1)介绍了PC PE中所有组件类型的文件结构与打包开发者可以进行参考检查自己的文件
### 发布
[课程03-组件上架的规范及过审攻略](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/35-%E4%B8%8A%E6%9E%B6%E4%B8%8E%E5%85%A5%E9%A9%BB/%E8%AF%BE%E7%A8%8B04-%E8%AE%A4%E8%AF%86%E4%BD%9C%E5%93%81%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97.html?catalog=1)介绍了如何将打包后组件上传发布,开发者可以进行流程参考

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1,5 +1,4 @@
--- ---
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
hard: 入门 hard: 入门
time: 15分钟 time: 15分钟
selection: true selection: true

View File

@@ -1,10 +1,8 @@
--- ---
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
hard: 入门 hard: 入门
time: 15分钟 time: 15分钟
selection: true selection: true
--- ---
# 模型规范指南 # 模型规范指南
[点击前往快捷链接](../16-美术/6-模型和动作/6-模型规范指南.md)
[点击前往快捷链接](../16-美术/6-模型和动作/6-模型规范指南.md)

View File

@@ -1,5 +1,4 @@
--- ---
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
hard: 入门 hard: 入门
time: 15分钟 time: 15分钟
selection: true selection: true

View File

@@ -0,0 +1,788 @@
---
hard: 入门
time: 15分钟
selection: true
---
# 通用设置接口规范
欢迎使用由官方牵头,允许开发者通过接口快速注册设置选项的工具。
下面我们将介绍如何使用通用设置接口。
由于通用设置接口不更改引擎内容,可不需要跟整包更新,补全库更新后即可使用。
## 注册通用设置界面
我们首先需要获取通用设置接口的Comp组件然后在Comp组件中使用`RegisterSettingInst`方法
```python
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(playerId)
# 第一个参数必须要填写 ItemID我们强烈建议您先上传一个模组获取到ItemID再进行开发。
# 后面两个参数是为了在 ModPC 中测试开发而引入的参数,在正式服中后面两个参数没有任何作用。
settingInst = comp.RegisterSettingInst("itemId", "模组1", "textures/ui/abc")
```
由于要传入 itemId你需要先在开平上传一个模组获取到 itemId然后再通过此方法注册
> 由于页面注册的到的是 Cocos UI 页面,页面里的模组数据都是从开平上传的模组中获取的,所以才需要传入 itemId
> 由于ModPC不自带 Cocos UI 页面所以需要传入后面两个参数以便ModPC使用进行测试
## 注册控件
控件是指在设置页面中的设置选项,例如按钮、开关、输入框等
控件注册允许链式调用
```python
if settingInst:
# 允许链式调用,添加多个控件
(settingInst
.AddText("text_uid_01", "这是一段文字",5)
.AddToggle("toggle_uid_01", "开关按钮", callbackFunction, 1, False)
.AddToggle("toggle_uid_02", "开关按钮2", callbackFunction, 3, False)
.AddToggle("toggle_uid_03", "开关按钮3", callbackFunction, 4, True)
.AddInput("input_uid_01", "输入框", callbackFunction, 2, "神秘")
.AddButton("button_uid_01", "按钮", "点击前往设置页面", callback, 2))
```
`callbackFunction``callback`是回调函数
```python
def callbackFunction(*args):
# args1 参数是 key 值用于获取控件ID
# args2 参数是 value 值,用于获取控件的当前值
if settingInst.GetToggleDefault("toggle_uid_01"):
#获取 控件1 的默认值如果是True则将默认值改成 False下次打开页面就会显示False了
# settingInst.SetToggleDefault("toggle_uid_01", False)
settingInst.SetLockSettingComp("toggle_uid_02", False)
else:
# 这里我们判断,如果从 False 改成 True了我们还会给控件 toggle_uid_02 上锁
# settingInst.SetToggleDefault("toggle_uid_01", True)
settingInst.SetLockSettingComp("toggle_uid_02", True)
def callback(*args):
# args1 参数是 key 值用于获取控件ID
# args2 参数是 value 值,用于获取控件的当前值
comp.CloseSettingUI()
```
上述内容完成后您就成功注册了设置界面中的控件,并且可以通过设置页面中的按钮进行调用。
此时你就可以前往开发者测试服查看效果
![alt text](./images/image.png)
> 设置页面集束在 暂停菜单 - 模组 中
我们不限制开发者必须把模组设置做在通用设置界面中,但设置入口一定要在这个界面中,减少玩家寻找模组设置的时间成本。
您可以只在通用设置界面注册一个按钮,点击按钮可以跳转到你们的设置页面中
## 疑难解答
Q1怎么没有翻页功能
A为了确保与原本UI风格一致我们没有做翻页功能而是内置了滚动功能。
Q2怎么不能加图片
A为了确保各开发者风格一致我们没有做图片功能以免开发者随心所欲添加图片造成设置界面杂乱无章
Q3限制有点大我不想用你们的设置怎么办
A我们不限制开发者使用自己的设置界面但为了提高玩家体验减少模组设置学习成本开发者可以即使不适用官方提供的设置接口也可以在这个页面注册按钮允许玩家点击按钮打开开发者自己定义的设置界面中
## 接口速查
### CloseSettingUI
<span style="display:inline;color:#7575f9">客户端</span>
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
- 描述
关闭模组信息界面
- 参数
- 返回值
| <div style="width: 4em">数据类型</div> | 说明 |
| :--- | :--- |
| bool | 是否关闭成功 |
- 备注
- 该接口在modPC环境下将是关闭局内json ui
- 示例
```python
import mod.client.extraClientApi as clientApi
levelId = clientApi.GetLevelId()
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
# 关闭界面
result = comp.CloseSettingUI()
```
### GetSettingInst
<span style="display:inline;color:#7575f9">客户端</span>
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
- 描述
获取当前模组的通用设置实例
- 参数
| 参数名 | <div style="width: 4em">数据类型</div> | 说明 |
| :--- | :--- | :--- |
| modNamespace | str | 组件命名空间,需唯一性,仅在开发环境预览使用 |
- 返回值
| <div style="width: 4em">数据类型</div> | 说明 |
| :--- | :--- |
| SettingInst | 返回实例对象未注册则返回None |
- 备注
- 请先使用RegisterSettingInst注册再使用GetSettingInst获取。
- 开发环境中将会获取modNamespace对应的通用设置实例正式环境中则仅能获取当前模组注册的实例。
- 建议不要在__init__的时候就获取实例过早获取会返回None。
- 示例
```python
import mod.client.extraClientApi as clientApi
levelId = clientApi.GetLevelId()
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
settingInst = comp.GetSettingInst()
if settingInst:
settingInst.AddText("text_uid_01", "这是一段文字").AddToggle("toggle_uid_01", "开关按钮", False, callbackFunction)
```
### OpenSettingUI
<span style="display:inline;color:#7575f9">客户端</span>
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
- 描述
在模组信息界面中打开设置页面(此操作仅可访问本模组的配置选项)
- 参数
- 返回值
| <div style="width: 4em">数据类型</div> | 说明 |
| :--- | :--- |
| bool | 是否打开成功 |
- 备注
- 该接口在modPC环境下将是打开局内json ui
- 示例
```python
import mod.client.extraClientApi as clientApi
levelId = clientApi.GetLevelId()
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
# 打开界面
result = comp.OpenSettingUI()
```
### RegisterSettingInst
<span style="display:inline;color:#7575f9">客户端</span>
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
- 描述
注册通用设置实例
- 参数
| 参数名 | <div style="width: 4em">数据类型</div> | 说明 |
| :--- | :--- | :--- |
| modNamespace | str | 组件命名空间,需唯一性,仅在开发环境预览使用 |
| modName | str | 组件名字默认为None仅在开发环境预览使用 |
| iconPath | str | 组件icon图路径默认为None仅在开发环境预览使用 |
- 返回值
| <div style="width: 4em">数据类型</div> | 说明 |
| :--- | :--- |
| SettingInst | 返回实例对象系统未初始化则返回None |
- 备注
- 每个模组仅能注册一个通用设置实例,重复注册会返回同样的实例。
- 建议在UiInitFinished触发时再注册注册过早会导致注册失败而返回None。
- 设置界面的注册是通过Scripts文件夹名称来判断是由哪个模组注册的实例开发者的Scripts名称需要确保不与其他模组作者的Scripts名称冲突。
- 示例
```python
import mod.client.extraClientApi as clientApi
levelId = clientApi.GetLevelId()
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
settingInst = comp.RegisterSettingInst("123456789", "模组1", "textures/ui/abc")
if settingInst:
settingInst.AddText("text_uid_01", "这是一段文字").AddToggle("toggle_uid_01", "开关按钮", False, callbackFunction)
```
### SettingInst 下的方法
#### AddText
添加文本控件。
```python
def AddText(self, key, name, priority=None)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| name | str | 控件的文字描述 |
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### AddToggle
添加开关控件。
```python
def AddToggle(self, key, name, callback, priority=None, default=False)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| name | str | 控件的文字描述 |
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
| default | bool | 默认值默认为False |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### AddSlider
添加滑动条控件。
```python
def AddSlider(self, key, name, step, callback, priority=None, default=0)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| name | str | 控件的文字描述 |
| step | int | 滑动条的最大值范围0~step |
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
| default | int | 默认值默认为0 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### AddDropDown
添加下拉选项控件。
```python
def AddDropDown(self, key, name, options, callback, priority=None, default=None)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| name | str | 控件的文字描述 |
| options | list[str] | 下拉选项列表 |
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
| default | str或None | 默认选项该值需在options中 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### AddInput
添加输入框控件。
```python
def AddInput(self, key, name, callback, priority=None, default="")
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| name | str | 控件的文字描述 |
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
| default | str | 默认显示的文本,默认为空字符串 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### AddButton
添加按钮控件。
```python
def AddButton(self, key, name, buttonText, callback, priority=None)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| name | str | 控件的文字描述 |
| buttonText | str | 按钮的文字描述 |
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### GetToggleDefault
获取开关控件的默认值。
```python
def GetToggleDefault(self, key)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| bool | 开关状态 |
---
#### GetInputDefault
获取输入框的默认输入文本。
```python
def GetInputDefault(self, key)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| str | 输入框的文本 |
---
#### GetDropDownDefault
获取下拉选项控件的默认值。
```python
def GetDropDownDefault(self, key)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| str | 默认选项在列表中的索引 |
---
#### GetSliderDefault
获取滑动条控件的默认值。
```python
def GetSliderDefault(self, key)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| int | 滑块的值 |
---
#### GetText
获取文字控件的文本。
```python
def GetText(self, key)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| str | 显示的文本 |
---
#### SetToggleDefault
设置开关控件的默认值。
```python
def SetToggleDefault(self, key, value)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| value | bool | 开关的值 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### SetInputDefault
设置输入框控件的默认文本。
```python
def SetInputDefault(self, key, value)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| value | str | 显示的文本 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### SetDropDownDefault
设置下拉选项控件的默认选项。
```python
def SetDropDownDefault(self, key, option)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| option | str | 选项文字,如文字不在选项列表里,会自动添加到列表 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### SetSliderDefault
设置滑动条控件的默认值。
```python
def SetSliderDefault(self, key, value)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| value | int | 滑块的值 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### SetButtonText
设置按钮控件的文字。
```python
def SetButtonText(self, key, value)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| value | str | 显示的文字 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### SetText
设置文本控件的值。
```python
def SetText(self, key, value)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| value | str | 显示的文本 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### SetLockSettingComp
设置锁定控件,锁定后无法点击。
```python
def SetLockSettingComp(self, key, is_locked)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
| is_locked | bool | 是否锁定 |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| SettingInst | 当前实例,支持链式调用 |
---
#### GetFormatData
获取当前实例的结构化数据控件数据根据priority的值升序排序。
```python
def GetFormatData(self)
```
- 参数
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| dict | 结构化数据 |
- 返回格式
```json
{
"modId": "str // 模组ID",
"name": "str // 名称",
"icon": "str // 图标路径",
"settings": "list // 设置项列表按priority升序排序"
}
```
---
#### GetSettingsControl
获取控件的结构化数据。
```python
def GetSettingsControl(self, key)
```
- 参数
| 参数名 | 数据类型 | 说明 |
| :--- | :--- | :--- |
| key | str | 控件id |
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| dict | 控件的结构化数据 |
---
#### GetModId
获取实例的modId。
```python
def GetModId(self)
```
- 参数
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| str | 模组ID |
---
#### GetAutoPriority
获取自动设置的优先级的值。
```python
def GetAutoPriority(self)
```
- 参数
- 返回值
| 数据类型 | 说明 |
| :--- | :--- |
| int | 当前自动优先级的值 |
- 备注
当添加控件时如果不设置优先级则会自动从0开始设置。优先级会影响控件排列顺序升序排列。

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

View File

@@ -45,7 +45,7 @@ time: 10分钟
{ {
"rolls": 1, "rolls": 1,
"entries": [ "entries": [
{type: "item", "name": "minecraft:wool","function": [{"function": "set_data","data":15}]} {"type": "item", "name": "minecraft:wool", "function": [{"function": "set_data", "data":15}]}
] ]
} }
] ]

View File

@@ -8,397 +8,265 @@ time: 20分钟
#### 作者:境界 ### 作者:
境界
## 前言
包体也被称为Package它是由开发者将本地的JAVA版资源内容和基岩版资源内容进行压缩打包后的档案。在中国版开发者平台拿到上传的包体后通过机器审核和人工审核后包体最终会被推送至公共下载服务器。最后再由玩家下载后压缩包后经客户端解压才能玩到组件资源。 包体也被称为Package它是由开发者将本地的JAVA版资源内容和基岩版资源内容进行压缩打包后的档案。在中国版开发者平台拿到上传的包体后通过机器审核和人工审核后包体最终会被推送至公共下载服务器。最后再由玩家下载后压缩包后经客户端解压才能玩到组件资源。
在上传至平台前,开发者应确保在本地开发的内容达到了预期的运行效果。并遵照本章的打包方式进行压缩打包,降低机器审核的打回概率或审核时间。 在上传至平台前,开发者应确保在**本地开发的内容达到了预期的运行效果。并遵照本章的打包方式进行压缩打包,降低机器审核的打回概率或审核时间**
## 认识JAVA包体结构
### PC地图
### 认识JAVA包体结构 <img src="./images/1_1.jpg" style="zoom:40%; display:block; margin:0 auto;" />
#### PC地图 1. 截图截选了我的世界JAVA版1.12.2游戏客户端生成的世界存档的内容。test文件夹下存放着名为test的世界信息。
<img src="./images/1_2.jpg" style="zoom:40%; display:block; margin:0 auto;" />
2. 打开这个客户端可以看到test存档。
![](./images/1_1.jpg) <img src="./images/1_3.jpg" style="zoom:40%; display:block; margin:0 auto;" />
3. 返回到目录的上一级saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹其中就有前面提到的test存档。
<img src="./images/1_4.jpg" style="zoom:40%; display:block; margin:0 auto;" />
1) 截图截选了我的世界JAVA版1.12.2游戏客户端生成的世界存档的内容。test文件夹下存放着名为test的世界信息 4. 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择地图。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本
![](./images/1_2.jpg) <img src="./images/1_5.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
5. 点击导入窗体内的+号按钮直接选择test文件夹后点击选择文件夹。
<img src="./images/1_6.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2) 打开这个客户端可以看到test存档 6. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的存档文件夹
![](./images/1_3.jpg) <img src="./images/1_7.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
7. 开发者不通过MCSTUDIO而选择自行打包时请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
### PC MOD
3) 返回到目录的上一级saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹其中就有前面提到的test存档。 <img src="./images/1_8.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_4.jpg) 1. 上传平台的MOD文件必须以jar格式作为分发给玩家游玩的标准文件格式。
<img src="./images/1_9.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择Mod。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
4) 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择地图。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。 <img src="./images/1_10.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_5.jpg)
5) 点击导入窗体内的+号按钮直接选择test文件夹后点击选择文件夹。
![](./images/1_6.jpg)
6) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的存档文件夹。
![](./images/1_7.jpg)
7) 开发者不通过MCSTUDIO而选择自行打包时请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
#### PC MOD
![](./images/1_8.jpg)
1) 上传平台的MOD文件必须以jar格式作为分发给玩家游玩的标准文件格式。
![](./images/1_9.jpg)
2) 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择Mod。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
![](./images/1_10.jpg)
3点击导入窗体内的+号按钮直接双击或选择jar文件后选打开。 3点击导入窗体内的+号按钮直接双击或选择jar文件后选打开。
![](./images/1_11.jpg) <img src="./images/1_11.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的jar文件。
<img src="./images/1_12.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的jar文件。 <img src="./images/1_13.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_12.jpg) 5. 开发者不通过MCSTUDIO而选择自行打包时请将jar文件放入一个文件夹内将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
![](./images/1_13.jpg) ### PC 材质
<img src="./images/1_14.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1. 截图主要展示JAVA版材质的目录和文件结构。
5) 开发者不通过MCSTUDIO而选择自行打包时请将jar文件放入一个文件夹内将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。 <img src="./images/1_15.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 直接将材质文件夹内的内容全部选取后右键保存成zip压缩文档。
<img src="./images/1_16.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
#### PC 材质 3. 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择材质。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
![](./images/1_14.jpg) <img src="./images/1_17.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4. 点击导入窗体内的+号按钮直接双击或选择zip文档后选打开。
<img src="./images/1_18.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1) 截图主要展示JAVA版材质的目录和文件结构 5. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的材质压缩档
![](./images/1_15.jpg) <img src="./images/1_19.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
6. 开发者不通过MCSTUDIO而选择自行打包时请将材质压缩文档放入一个文件夹内将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
### PC 光影
2) 直接将材质文件夹内的内容全部选取后右键保存成zip压缩文档。 <img src="./images/1_20.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_16.jpg) 1. 截图主要展示JAVA版光影的内容目录和文件结构。
<img src="./images/1_21.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 直接将文件夹内的所有文件全部选取后右键保存成zip压缩文档。
3) 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择材质。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。 <img src="./images/1_22.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_17.jpg) 3. 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择光影。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
<img src="./images/1_23.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4. 点击导入窗体内的+号按钮直接双击或选择zip文档后选打开。
4) 点击导入窗体内的+号按钮直接双击或选择zip文档后选打开。 <img src="./images/1_24.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_18.jpg) 5. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的光影压缩档。
6. 开发者不通过MCSTUDIO而选择自行打包时请将光影压缩文档放入一个文件夹内将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
### PC 皮肤
5) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的材质压缩档。 <img src="./images/1_25.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_19.jpg) 1. 截图主要展示PC皮肤资源支持的文件格式为结尾png的图片文档。该格式的图片保存着一道透明通道。
<img src="./images/1_26.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择皮肤。【适用MC版本】选择默认选择全版本即可。
6) 开发者不通过MCSTUDIO而选择自行打包时请将材质压缩文档放入一个文件夹内将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。 <img src="./images/1_27.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
3. 点击导入窗体内的+号按钮直接双击或选择png文档后选打开。
<img src="./images/1_28.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
#### PC 光影 4. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的图片文档。
![](./images/1_20.jpg) 5. 开发者不通过MCSTUDIO而选择自行打包时请直接通过开发者平台上传皮肤组件源图片文档。
### PC 玩法
<img src="./images/1_29.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1) 截图主要展示JAVA版光影的内容目录和文件结构 1. 截图截选了我的世界JAVA版1.12.2游戏客户端生成的地图的内容。test文件夹下存放着名为test的世界信息。命令方块玩法、数据包等是用我的世界JAVA版地图作为承载
![](./images/1_21.jpg) <img src="./images/1_30.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开这个客户端可以看到test存档。
<img src="./images/1_31.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2) 直接将文件夹内的所有文件全部选取后右键保存成zip压缩文档。 3. 返回到目录的上一级saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹其中就有前面提到的test存档。
![](./images/1_22.jpg) <img src="./images/1_32.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4. 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择玩法。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
<img src="./images/1_33.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
3) 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择光影。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本 5. 点击导入窗体内的+号按钮直接选择test文件夹后点击选择文件夹
![](./images/1_23.jpg) <img src="./images/1_34.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
6. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的存档文件夹。
<img src="./images/1_35.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4) 点击导入窗体内的+号按钮直接双击或选择zip文档后选打开 7. 开发者不通过MCSTUDIO而选择自行打包时请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作
![](./images/1_24.jpg) ## 认识基岩版包体结构
### PE地图
<img src="./images/1_36.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
5) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的光影压缩档 1. 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息
6) 开发者不通过MCSTUDIO而选择自行打包时请将光影压缩文档放入一个文件夹内将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。 <img src="./images/1_38.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开MCSTUDIO点击作品库后再点击基岩版版组件分类选择【地图】。若勾选【复制文件到默认文件夹】MCSTUDIO会将地图完整拷贝一份至C:/MCStudioDownload/work/开发者ID/Cpp/Map下。若不勾选则不会做出此操作。
<img src="./images/1_37.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
#### PC 皮肤 3. 勾选选项时,点击窗体内的+号。不勾选选项时,点击窗体内的选择按钮。双击存档文件夹或选择文件夹后点击【选择文件夹】按钮。
![](./images/1_25.jpg) <img src="./images/1_39.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4. 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品并且作品勾选【复制文件到默认文件夹】则会系统会将C:/MCStudioDownload/work/开发者ID/Cpp/Map下相应的拷贝文件夹删除。
<img src="./images/1_40.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1) 截图主要展示PC皮肤资源支持的文件格式为结尾png的图片文档。该格式的图片保存着一道透明通道 5. 开发者不通过MCSTUDIO而选择自行打包时请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作
![](./images/1_26.jpg) ### PE 联机地图
<img src="./images/1_41.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1. 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。联机地图指代可以同时在本地、本地联机、联机大厅上使用的地图资源。
2) 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择皮肤。【适用MC版本】选择默认选择全版本即可。 <img src="./images/1_42.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_27.jpg) <img src="./images/1_43.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 若世界存档携带附加包玩法请确保存档文件夹目录下存有world_behavior_packs.json和world_resource_packs.json文件。其中pack_id对应材质包或行为包manifest内header下的uuid。version对应manifest内header下的version。若只携带材质包或行为包可以在world_behavior_packs.json内或world_resource_packs.json将第一个方括号内的内容全部清除。若不携带附加包则则不需要在存档文件夹下携带此类文件。
<img src="./images/1_44.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
3) 点击导入窗体内的+号按钮直接双击或选择png文档后选打开。 3. 开发者可以在存档中放置一个server.properties指定玩家的游戏模式。这样在联机大厅玩这个联机地图时玩家每次进入都是server.properties文件中设置的游戏模式。更多基岩版多人联机地图的配置设定请参考网址[https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F](https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)
![](./images/1_28.jpg) 4. 当前MCSTUDIO暂不支持导入联机大厅地图请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
### PE Addon
<img src="./images/1_45.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
4) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的图片文档 1. 截图截选了我的世界基岩版Addon的内容。Addon又被称作附加包它由材质包和行为包组成。因此开发者在上架完整的附加包内容包含附加包和行为包需依照接下来的规范进行打包上传即可。请注意上架至中国版平台的附加包中行为包内必须携带entities文件夹材质包内必须携带textures文件夹
5) 开发者不通过MCSTUDIO而选择自行打包时请直接通过开发者平台上传皮肤组件源图片文档。 <img src="./images/1_46.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
<img src="./images/1_47.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开MCSTUDIO点击作品库后再点击基岩版版组件。若勾选【复制文件到默认文件夹】请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档MCSTUDIO会在导入zip文档后将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/AddOn下。若不勾选则直接选择带有行为包或材质包的文件夹即可。最后点击导入即可之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
#### PC 玩法 3. 若开发者不通过MCSTUDIO而选择自行打包时请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
![](./images/1_29.jpg) ### PE 材质
<img src="./images/1_48.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1. 附加包是行为包和材质包的统称因此材质包被算入附加包的一种类型。因此开发者在上架完整的材质包内容前需依照接下来的规范进行打包上传。请注意上架至中国版平台的材质包内必须携带textures文件夹。
1) 截图截选了我的世界JAVA版1.12.2游戏客户端生成的地图的内容。test文件夹下存放着名为test的世界信息。命令方块玩法、数据包等是用我的世界JAVA版地图作为承载。 <img src="./images/1_49.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_30.jpg) <img src="./images/1_50.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开MCSTUDIO点击作品库后再点击基岩版版组件在右上角点击本地导入分区选择【基岩版作品】分类选择【皮肤】。若勾选【复制文件到默认文件夹】请将材质包文件夹右键使用压缩工具压缩成zip文档MCSTUDIO会在导入zip文档后将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Material下。若不勾选则直接选择带有材质包的文件夹即可。最后点击导入即可之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
3. 若开发者不通过MCSTUDIO而选择自行打包时请将材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
2) 打开这个客户端可以看到test存档。 ### PE 光影
![](./images/1_31.jpg) <img src="./images/1_51.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
1. 光影的内容都被保存在材质包文件夹中因此在运行机制与打包机制上与材质包类似。因此开发者在上架完整的光影内容前需依照接下来的规范进行打包上传。请注意上架至中国版平台的材质包内必须携带textures文件夹。
<img src="./images/1_52.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
3) 返回到目录的上一级saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹其中就有前面提到的test存档。 <img src="./images/1_53.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_32.jpg) 2. 打开MCSTUDIO点击作品库后再点击基岩版版组件在右上角点击本地导入分区选择【基岩版作品】分类选择【光影】。若勾选【复制文件到默认文件夹】请将光影材质包文件夹右键使用压缩工具压缩成zip文档MCSTUDIO会在导入zip文档后将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Light下。若不勾选则直接选择带有光影的材质包文件夹即可。最后点击导入即可之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
3. 若开发者不通过MCSTUDIO而选择自行打包时请将带有光影的材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
### PE 皮肤
4) 打开MCSTUDIO点击作品库后再点击Java版组件。在右上角点击本地导入【作品分区】选择Java版作品。【作品分类】中选择玩法。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。 <img src="./images/1_54.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
![](./images/1_33.jpg) 1. 截图主要展示PE皮肤资源支持的文件格式为结尾png的图片文档。该格式的图片保存着一道透明通道。
<img src="./images/1_55.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
2. 打开MCSTUDIO点击作品库后再点击基岩版版组件在右上角点击本地导入分区选择【基岩版作品】分类选择【皮肤】。直接点击+号选择png结尾的皮肤图片即可。
5) 点击导入窗体内的+号按钮直接选择test文件夹后点击选择文件夹 3. 若开发者不通过MCSTUDIO而选择自行打包时请将带有皮肤文件直接通过开发者平台进行上传操作
![](./images/1_34.jpg)
6) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品也不会影响到最原先的存档文件夹。
![](./images/1_35.jpg)
7) 开发者不通过MCSTUDIO而选择自行打包时请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
### 认识基岩版包体结构
#### PE地图
![](./images/1_36.jpg)
1) 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。
![](./images/1_38.jpg)
2) 打开MCSTUDIO点击作品库后再点击基岩版版组件分类选择【地图】。若勾选【复制文件到默认文件夹】MCSTUDIO会将地图完整拷贝一份至C:/MCStudioDownload/work/开发者ID/Cpp/Map下。若不勾选则不会做出此操作。
![](./images/1_37.jpg)
3) 勾选选项时,点击窗体内的+号。不勾选选项时,点击窗体内的选择按钮。双击存档文件夹或选择文件夹后点击【选择文件夹】按钮。
![](./images/1_39.jpg)
4) 最后点击导入按钮即可由MCSTUDIO拷贝作品后导入进作品库内进行后续的测试、发布、配置等操作。若开发者选择删除作品并且作品勾选【复制文件到默认文件夹】则会系统会将C:/MCStudioDownload/work/开发者ID/Cpp/Map下相应的拷贝文件夹删除。
![](./images/1_40.jpg)
5) 开发者不通过MCSTUDIO而选择自行打包时请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
#### PE 联机地图
![](./images/1_41.jpg)
1) 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。联机地图指代可以同时在本地、本地联机、联机大厅上使用的地图资源。
![](./images/1_42.jpg)
![](./images/1_43.jpg)
2) 若世界存档携带附加包玩法请确保存档文件夹目录下存有world_behavior_packs.json和world_resource_packs.json文件。其中pack_id对应材质包或行为包manifest内header下的uuid。version对应manifest内header下的version。若只携带材质包或行为包可以在world_behavior_packs.json内或world_resource_packs.json将第一个方括号内的内容全部清除。若不携带附加包则则不需要在存档文件夹下携带此类文件。
![](./images/1_44.jpg)
3) 开发者可以在存档中放置一个server.properties指定玩家的游戏模式。这样在联机大厅玩这个联机地图时玩家每次进入都是server.properties文件中设置的游戏模式。更多基岩版多人联机地图的配置设定请参考网址[https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F](https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)
4) 当前MCSTUDIO暂不支持导入联机大厅地图请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
#### PE Addon
![](./images/1_45.jpg)
1) 截图截选了我的世界基岩版Addon的内容。Addon又被称作附加包它由材质包和行为包组成。因此开发者在上架完整的附加包内容包含附加包和行为包需依照接下来的规范进行打包上传即可。请注意上架至中国版平台的附加包中行为包内必须携带entities文件夹材质包内必须携带textures文件夹。
![](./images/1_46.jpg)
![](./images/1_47.jpg)
2) 打开MCSTUDIO点击作品库后再点击基岩版版组件。若勾选【复制文件到默认文件夹】请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档MCSTUDIO会在导入zip文档后将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/AddOn下。若不勾选则直接选择带有行为包或材质包的文件夹即可。最后点击导入即可之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
3) 若开发者不通过MCSTUDIO而选择自行打包时请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
#### PE 材质
![](./images/1_48.jpg)
1) 附加包是行为包和材质包的统称因此材质包被算入附加包的一种类型。因此开发者在上架完整的材质包内容前需依照接下来的规范进行打包上传。请注意上架至中国版平台的材质包内必须携带textures文件夹。
![](./images/1_49.jpg)
![](./images/1_50.jpg)
2) 打开MCSTUDIO点击作品库后再点击基岩版版组件在右上角点击本地导入分区选择【基岩版作品】分类选择【皮肤】。若勾选【复制文件到默认文件夹】请将材质包文件夹右键使用压缩工具压缩成zip文档MCSTUDIO会在导入zip文档后将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Material下。若不勾选则直接选择带有材质包的文件夹即可。最后点击导入即可之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
3) 若开发者不通过MCSTUDIO而选择自行打包时请将材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
#### PE 光影
![](./images/1_51.jpg)
1) 光影的内容都被保存在材质包文件夹中因此在运行机制与打包机制上与材质包类似。因此开发者在上架完整的光影内容前需依照接下来的规范进行打包上传。请注意上架至中国版平台的材质包内必须携带textures文件夹。
![](./images/1_52.jpg)
![](./images/1_53.jpg)
2) 打开MCSTUDIO点击作品库后再点击基岩版版组件在右上角点击本地导入分区选择【基岩版作品】分类选择【光影】。若勾选【复制文件到默认文件夹】请将光影材质包文件夹右键使用压缩工具压缩成zip文档MCSTUDIO会在导入zip文档后将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Light下。若不勾选则直接选择带有光影的材质包文件夹即可。最后点击导入即可之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
3) 若开发者不通过MCSTUDIO而选择自行打包时请将带有光影的材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
#### PE 皮肤
![](./images/1_54.jpg)
1) 截图主要展示PE皮肤资源支持的文件格式为结尾png的图片文档。该格式的图片保存着一道透明通道。
![](./images/1_55.jpg)
2) 打开MCSTUDIO点击作品库后再点击基岩版版组件在右上角点击本地导入分区选择【基岩版作品】分类选择【皮肤】。直接点击+号选择png结尾的皮肤图片即可。
3) 若开发者不通过MCSTUDIO而选择自行打包时请将带有皮肤文件直接通过开发者平台进行上传操作。