This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -24,14 +24,24 @@ next: false
title: '界面UI开发',
desc: '前往界面UI开发指南',
link: '/mcguide/18-界面与交互/2-从零开始创建UI'
},
{
title: '网络游戏Apollo',
desc: '前往网络游戏开发指南',
link: '/mcguide/27-网络游戏/课程0基岩版网络游戏概述/第1节基岩版网络游戏概述与工具指引'
}
]" />
### 服务器开发与入驻
<MyFeatures :items="[
{
title: '服务器(基岩版)',
desc: '前往基岩版网络游戏开发指南',
link: '/mcguide/27-手机网络游戏/课程0基岩版网络游戏概述/第1节基岩版网络游戏概述与工具指引'
},
{
title: '服务器Java版',
desc: '前往Java版网络游戏开发指南',
link: '/mcguide/28-电脑网络游戏/课程0电脑端网络游戏概述/第1节电脑版网络游戏概述与工具指引'
},
]" />
### 自定义游戏内容
<MyFeatures :items="[

View File

@@ -0,0 +1,34 @@
---
front: https://nie.res.netease.com/r/pic/20250709/095c3bb4-eb58-4444-811f-76be2b94eedf.jpg
hard: 入门
time: 2分钟
selection: 23
---
# 2025.7.08 版本1.1.44
## 地图编辑器
替换和填充界面增加方块收藏功能
- 点击所有方块列表中的方块后,会出现收藏按钮,点击按钮即可将方块放入收藏列表
![图片](./images/250708/0_0.png)
- 点击在收藏方块列表中的方块后,会出现取消收藏按钮,点击按钮即可将方块移出收藏列表
![图片](./images/250708/0_1.png)
## 配置编辑器
- 对新建文件中"生成规则"描述文字优化为"实体生成规则",避免和特征规则造成混淆
## 问题修复
- 修复多结构生成规则字段"is multi sub editor"检测会删除文件问题
- 修复原版模型转fbx工具0帧处理问题
- 修复文本输入框控件调整输入文本颜色属性后,再改属性在编辑器内消失问题
- 修复地图编辑器替换、填充弹出界面位置UI会遮挡的问题

View File

@@ -0,0 +1,34 @@
---
front: https://nie.res.netease.com/r/pic/20250625/93d00c93-a3de-43e2-86d2-8128f8c467aa.jpg
hard: 入门
time: 2分钟
selection: 23
---
# 2025.6.25 版本1.1.43
## 编辑器
### 编辑器升级3.4
新增支持1.21.0的新物品、方块、实体等
### 贴图压缩工具
工具箱新增资源包贴图压缩工具可根据JSON配置自动压缩资源包贴图并生成报告帮助开发者减少包体体积
详细使用链接请前往官方Github仓库[https://github.com/MCNeteaseDevs/Image-AutoCompress](https://github.com/MCNeteaseDevs/Image-AutoCompress)
![图片](./images/250625/0_0.png)
### Java版组件-本地导入-适用版本新增支持Java1.21
![图片](./images/250625/0_1.png)
## 配置编辑器
- 新建页签优化
现在新建配置会根据当前所在页面打开对应的配置选择界面。如在**界面编辑器界面**,新建文件向导会默认**选择界面选项**(见下图)
![图片](./images/250625/0_2.png)

View File

@@ -0,0 +1,26 @@
---
front: https://nie.res.netease.com/r/pic/20250609/61c838c0-4e9e-49a0-8555-403f760039ad.jpg
hard: 入门
time: 2分钟
selection: 23
---
# 2025.6.10 版本1.1.42
## 编辑器
- 组件名称发布适配特殊字符
现在支持特殊字符的作品名,并一键发布到开发者内容管理平台
![图片](./images/250610/0_0.png)
## 地图编辑器
- **按住Ctrl键**点击可以多选所需要替换/填充的方块行,再次点击右侧方块即可全部**预选**该方块进行替换/填充
![图片](./images/250610/0_1.png)
## 问题修复
- 修复界面编辑器使用原版贴图会复制问题

View File

@@ -0,0 +1,22 @@
---
front: https://nie.res.netease.com/r/pic/20250528/cb9ff22d-2b87-4c3a-9114-4f2e947d9f1e.jpg
hard: 入门
time: 2分钟
selection: 23
---
# 2025.5.27 版本1.1.41
## 编辑器
- 版本升级优化
点击版本升级后也会升级modules字段的version
![图片](./images/250527/0_0.png)
![图片](./images/250527/0_1.png)
## 问题修复
- 修复方块易测获取测试端游戏进程失败问题

View File

@@ -0,0 +1,38 @@
---
front: https://nie.res.netease.com/r/pic/20250513/d83d9999-e1e2-4f29-870d-a50582e47cfc.jpg
hard: 入门
time: 2分钟
selection: 23
---
# 2025.5.13 版本1.1.40
## 配置编辑器
- 新增自定义锻造转换配方选项
## 界面编辑器
- 界面编辑器生成控件键值对源码排序,方便开发者进行阅读
排序规则如下
```bash
控件类type、renderer
变量(按字母顺序):$变量1: xxx
变量初始化variables
尺寸和位置相关offset、size等
可见性和状态视觉相关layer、alpha等
动画相关: anims、animation_reset_name等
数据绑定相关modifications、property_bag、bindings
最后为controls
```
## UI调试工具
- UI调试工具仅顶部分割线才可拖动 变为 右侧分割线均可拖动
## 问题修复
- 方块易测连接失败问题修复
- 修复贴图资源复制问题

View File

@@ -0,0 +1,26 @@
---
front: https://nie.res.netease.com/r/pic/20250422/45cbbcc5-1c8e-43de-b011-cf822f273031.jpg
hard: 入门
time: 2分钟
selection: 23
---
# 2025.4.22 版本1.1.39
## 启动器
- 性能诊断工具优化优化采集服务的CPU消耗、优化获取进程列表的效率等
- 组件编辑界面优化,编辑界面排布与配置界面一致
- 日志与调试工具,保存窗口位置和大小以及字号大小为配置,下次打开工具使用保存配置
## 编辑器
- 自定义指令支持参数变体配置
![图片](./images/250422/0_0.png)
- 支持批量导入原版方块模型,点击导入-原版方块模型后打开模型所在文件夹,可以选择多个文件导入
## 问题修复
- 编辑功能对橡木方块进行旋转操作后变为白桦木方块

View File

@@ -24,7 +24,7 @@ selection: 23
![图片](./images/230323/contentlib2.png)
2. 内容库**其他**分页上线3个spigot插件和一个SDK的示例模型包详情参考[这篇文档](../../27-网络游戏/课程10使用Spigot开服/99-下载内容.md)。
2. 内容库**其他**分页上线3个spigot插件和一个SDK的示例模型包详情参考[这篇文档](../../27-手机网络游戏/课程10使用Spigot开服/99-下载内容.md)。
![图片](./images/230323/contentlib3.png)

View File

@@ -9,7 +9,7 @@ selection: 12
## 开服工具2.0正式外放
1. 支持使用Spigot和模组SDK制作基岩版手游服务器详情参考[开服工具2.0](../../27-网络游戏/课程10使用Spigot开服/10-支持基岩版客户端的Java版网络游戏概述.md)
1. 支持使用Spigot和模组SDK制作基岩版手游服务器详情参考[开服工具2.0](../../27-手机网络游戏/课程10使用Spigot开服/10-支持基岩版客户端的Java版网络游戏概述.md)
## 关卡编辑器支持放置生物

View File

@@ -21,7 +21,7 @@ selection:
### 新建服务器插件
- 工作台新建基岩版服务器的弹窗中,新增了一个空白插件,可以用来新建插件,详情请见[使用工作台新建插件](../../27-网络游戏/课程5插件教学/第0节使用工作台新建插件.md)
- 工作台新建基岩版服务器的弹窗中,新增了一个空白插件,可以用来新建插件,详情请见[使用工作台新建插件](../../27-手机网络游戏/课程5插件教学/第0节使用工作台新建插件.md)
- 新建插件支持分开创建大厅服Mod和游戏服Mod
- 插件导入的界面同样得到了更新
@@ -32,7 +32,7 @@ selection:
- 可以在开发者平台赋予子账号更高权限
- 如果子账号被赋予了开发及审核阶段的部署权限:那么子账号拥有除了删除之外的所有权限
- 如果子账号被赋予了上线阶段的调试权限:那么子账号拥有调试和查看日志的权限
- 详情请见[子账号部署和控制台调试功能](../../27-网络游戏/课程7开发技巧/第4节子账号部署和控制台调试功能.md)
- 详情请见[子账号部署和控制台调试功能](../../27-手机网络游戏/课程7开发技巧/第4节子账号部署和控制台调试功能.md)
![image-20220411204613763](./images/image-20220411204613763.png)

View File

@@ -2,7 +2,7 @@
### Apollo性能优化工具
我们为各位服务器开发者提供了脚本性能的监测工具,你可以选择要监测的服务器,并在监测一段时间后,获取到这段时间内的脚本函数调用的火焰图,并根据火焰图进行代码优化,详见[性能优化小贴士](../../27-网络游戏/课程8性能优化/第6节性能优化小贴士.md)。
我们为各位服务器开发者提供了脚本性能的监测工具,你可以选择要监测的服务器,并在监测一段时间后,获取到这段时间内的脚本函数调用的火焰图,并根据火焰图进行代码优化,详见[性能优化小贴士](../../27-手机网络游戏/课程8性能优化/第6节性能优化小贴士.md)。
![image-20211208181043002](./images/image-20211208181043002.png)

View File

@@ -46,7 +46,7 @@ from mod.server import extraServerApi
### Apollo快速切服
对于需要频繁切服的游戏类型(例如小游戏),我们提供了快速切服的功能,详情请参考[快速切服](../../27-网络游戏/课程8性能优化/第3节快速切服.md)文档。
对于需要频繁切服的游戏类型(例如小游戏),我们提供了快速切服的功能,详情请参考[快速切服](../../27-手机网络游戏/课程8性能优化/第3节快速切服.md)文档。
![image-20210826105407118](./images/image-20210826105407118.png)

View File

@@ -0,0 +1,128 @@
---
front: https://nie.res.netease.com/r/pic/20230524/e76f932d-0dda-464a-9b04-54f689d024c1.png
hard: 入门
time: 10分钟
selection: true
---
# 从零开始注册成为开发者
## 申请材料准备
### 材料列表
入驻全过程中,共需要下列材料:
- 1个网易邮箱账号推荐是163邮箱126邮箱无法被添加为协作成员
- 1个手机号码
- 本人身份证号和姓名
- 1个自己的QQ号
银行卡认证全过程中,共需要下列材料:
- 本人有效身份证
- 本人开户的银行卡
> 如果想注册企业开发者,也需要先注册个人开发者再转企业开发者。
### 材料准备攻略
- 1.本人身份证号和姓名
如果您不知道您的身份证号请您拿出自己的二代身份证卡片翻到背面人像面下方有【公民身份号码】请将这18位的号码输入到输入框中若知晓则直接填写。
- 2.有效身份证
如果您没有申领身份证,则请前往属地派出所申领您的身份证。若您的身份证已过期,则请前往属地派出所换领您的身份证。注册身份证必须在有效期内,若有则跳过。
- 3.QQ号
前往QQ官网下载客户端并注册QQ将信息页面打开复制自己的QQ号若有则直接填写。
- 4.网易邮箱账号
前往[网易邮箱注册](https://zc.reg.163.com/regInitialized#/),注册一个账号,若有则跳过。
- 5.手机号码
前往营业厅办理1张手机卡未成年人需要监护人办理若有则跳过。
- 6.本人开户的银行卡
首先请先确定自己想要办哪家银行的银行卡,建议先在网上查询好哪家银行的网点比较近或比较好。
按照政策规定16岁以下的未成年人办理银行卡需要监护人陪同办理16岁以上、18岁以下的未成年人可以自行办理也可以监护人陪同办理18岁以上的成年人可以自行办理。**具体以各地区各银行各网点规定为准**
然后,前往网点,说明是开户人是您,让工作人员帮您开户,开户成功给到卡片后,**请核实卡片是否为I类账户开户人是否为您的名字**。(**若开户人不是本人则会打款失败若不是I类账户则会有限额收益过多时会打款失败**
- 至此银行卡办理流程结束,若有则跳过。
## 如何注册开发者
首先,在 **官网** 中找到注册页面([或点击此处直接进入开发者内容管理网址](https://mcdev.webapp.163.com/#/login)
1 - 在搜索引擎中,搜索“我的世界”找到[官网](http://mc.163.com/),点击右上角 **【进入官网】** 按钮
![1](./images/0_1.png)
2 - 在[新的网页](http://mc.163.com/index.html )中,点击 **【成为创造者】** 按钮,前往开发者平台注册页面
![2](./images/0_2.png)
3 - 跳转至新的页面,根据提示填入信息和**真实姓名、身份证号(新增)**,并勾选同意《隐私协议》,点击 **【注册】** 按钮注意开发者昵称注册后每90天可以修改1次
![4](./images/0_4.png)
> 每个信息的用途:
>
> 开发者邮箱:开发者账号的唯一标识符
>
> 开发者昵称资源中心、开发者平台、MCStudio显示的昵称
>
> 手机号码:手机号码用于接收平台短信通知
>
> QQ号码目前没有实际用途
>
> 真实姓名:实名认证
>
> 身份证号:实名认证
- 注:**1个身份证号只能实名1个开发者账号请谨慎选择账号注册注册后非特殊情况不支持修改注销无法释放身份证信息。**
4 - 成功入驻后,需要进行银行卡认证,填写身份证、银行卡等信息,点击 **【申请银行卡认证】** 跳转至银行卡认证界面。
![5](./images/0_5.jpg)
![5.1](./images/0_6.png)
如实完成以上信息的正确填写并提交后,随后等待 **实名认证审核** 即可,通过后就可以发布作品啦!
![5.2](./images/0_7.png)
## 如何个人开发者转企业开发者
1. 点击开发者平台右上角的头像,点击“申请企业开发者认证”。
2. 提交认证信息等待审核通过一般在10个工作日内给结果。
## 如何企业开发者转个人开发者
目前**不支持**手动转回个人开发者,需要等待年审提出转个人申请。
## 开发者注册常见问题答疑
### 账号审核时间
开发者账号审核通过一般在 **7 个工作日** ,请耐心等待。
### 选择符合自身实际情况的结算方式
在注册开发者时,需要选择 **结算方式** (指通过《我的世界》中国版投稿付费钻石组件后获得的收益结算),开发者应当选择 **符合自身实际情况** 的结算方式,共两种:
1. 代扣代缴:由我司代为扣缴,请注意此选项仅针对非公司性质的个人开发者
2. 自备税票:自行开票或者请税局代为开票
建议个人开发者或小规模团队选择“代扣代缴”的结算方式,公司类型的开发者及个体工商户选择“自备税票”的结算方式。
### 如何更换开发者平台的结算信息(如换绑银行卡、改结算方式等)
**个人身份开发者:**
1. 点击开发者平台右上角的头像,点击“修改结算信息”提交新的银行信息或结算方式。
2. 提交内容前,请确保申请的信息与账号实名信息相符。更改结算信息后,还需等待审核通过方能生效。
3. 变更成功后90天内将不可再次发起银行卡及结算类型信息修改申请。无论通过与否平台都会通过开发者平台邮件和短信告知审核结果。
**企业身份开发者**
1. 非特殊情况不支持更改若有特殊情况请联系《我的世界》开发者频道管理staff。
### 若在规定期限内结算收益,但在打款时未拿到款项
在通常情况下,若点击结算的时间为工作日,在结算收益后会在当天或次日收到款项。如果超出正常结算周期仍然没收到款项,请检查您的资料信息是否有误。
1. 若出现银行卡信息错误导致收益无法收到的,官方会为账号打开 **“更新结算信息”** 入口,请尽快点击开发者平台右上方头像,在个人信息窗口找到 **"更换结算信息"** 入口,上传正确的结算资料等待审核。打款失败的款目会在审核通过后的下一周到账。如无及时更改将会影响后续的正常结算的流程,敬请了解。
2. 若出现过去可以正常收款,但在之后出现超出结算周期未收到款项。可以在 **【开发者平台】** - **【开发者常见问题答疑】** - **【反馈其他问题】** 与我们取得联系,填写表单时,请记得写好 **联系方式** 。在通常情况下,官方人员会通过留下的联系方式与您取得联系。
3. 若结算开放后超过5天才点击结算结算信息将会顺延至下个月打款。
### 想要注销开发者/UP主请问要怎么做呢
进入开发者平台后,点击右上角的个人昵称呼出 **个人信息窗口** ,点击 **申请注销账号** 按钮,并等待审核通过即可。注销申请提出后不可撤回, **且同个身份证、银行卡信息和手机号只允许注册一个开发者或一个UP主账号。当开发者或UP主账号被注册或注销时所使用过的个人信息将不再支持作为第二次注册开发者/UP主账号时的凭证资料请慎重操作。**
**温馨提示由于平台系统功能优化从2023年5月16日起平台已对up主带货系统进行逐步关停处理因此原平台不再开放up主身份进行注册。**

View File

@@ -5,9 +5,41 @@ time: 10分钟
selection: true
---
# 如何注册开发者
# 注册成为开发者
## 申请材料准备
### 材料列表
入驻全过程中,共需要下列材料:
- 1个网易邮箱账号推荐是163邮箱126邮箱无法被添加为协作成员
- 1个手机号码
- 本人身份证号和姓名
- 1个自己的QQ号
银行卡认证全过程中,共需要下列材料:
- 本人有效身份证
- 本人开户的银行卡
> 如果想注册企业开发者,也需要先注册个人开发者再转企业开发者。
### 材料准备攻略
- 1.本人身份证号和姓名
如果您不知道您的身份证号请您拿出自己的二代身份证卡片翻到背面人像面下方有【公民身份号码】请将这18位的号码输入到输入框中若知晓则直接填写。
- 2.有效身份证
如果您没有申领身份证,则请前往属地派出所申领您的身份证。若您的身份证已过期,则请前往属地派出所换领您的身份证。注册身份证必须在有效期内,若有则跳过。
- 3.QQ号
前往QQ官网下载客户端并注册QQ将信息页面打开复制自己的QQ号若有则直接填写。
- 4.网易邮箱账号
前往[网易邮箱注册](https://zc.reg.163.com/regInitialized#/),注册一个账号,若有则跳过。
- 5.手机号码
前往营业厅办理1张手机卡未成年人需要监护人办理若有则跳过。
- 6.本人开户的银行卡
首先请先确定自己想要办哪家银行的银行卡,建议先在网上查询好哪家银行的网点比较近或比较好。
首先,在 **官网** 中找到注册页面([或点击此处直接进入网址](https://mcdev.webapp.163.com/#/login)
按照政策规定16岁以下的未成年人办理银行卡需要监护人陪同办理16岁以上、18岁以下的未成年人可以自行办理也可以监护人陪同办理18岁以上的成年人可以自行办理。**具体以各地区各银行各网点规定为准**
然后,前往网点,说明是开户人是您,让工作人员帮您开户,开户成功给到卡片后,**请核实卡片是否为I类账户开户人是否为您的名字**。(**若开户人不是本人则会打款失败若不是I类账户则会有限额收益过多时会打款失败**
至此银行卡办理流程结束,若有则跳过。
## 如何注册开发者
首先,在 **官网** 中找到注册页面([或点击此处直接进入开发者内容管理网址](https://mcdev.webapp.163.com/#/login)
1 - 在搜索引擎中,搜索“我的世界”找到[官网](http://mc.163.com/),点击右上角 **【进入官网】** 按钮
@@ -17,13 +49,29 @@ selection: true
![2](./images/0_2.png)
3 - 跳转至新的页面,根据提示填入信息,并勾选同意《隐私协议》,点击 **【注册】** 按钮(注意:开发者昵称注册后不可修改)。
3 - 跳转至新的页面,根据提示填入信息和**真实姓名、身份证号(新增)**,并勾选同意《隐私协议》,点击 **【注册】** 按钮(注意:开发者昵称注册后每90天可以修改1次)。
![4](./images/0_4.png)
4 - 成功入驻后,需要进行实名认证,填写真实姓名、身份证、银行卡等信息,点击 **【去完善】** 跳转至实名认证界面。
> 每个信息的用途:
>
> 开发者邮箱:开发者账号的唯一标识符
>
> 开发者昵称资源中心、开发者平台、MCStudio显示的昵称
>
> 手机号码:手机号码用于接收平台短信通知
>
> QQ号码目前没有实际用途
>
> 真实姓名:实名认证
>
> 身份证号:实名认证
![5](./images/0_5.png)
- 注:**1个身份证号只能实名1个开发者账号请谨慎选择账号注册注册后非特殊情况不支持修改注销无法释放身份证信息。**
4 - 成功入驻后,需要进行银行卡认证,填写身份证、银行卡等信息,点击 **【申请银行卡认证】** 跳转至银行卡认证界面。
![5](./images/0_5.jpg)
![5.1](./images/0_6.png)
@@ -31,33 +79,20 @@ selection: true
![5.2](./images/0_7.png)
## 如何个人开发者转企业开发者
1. 点击开发者平台右上角的头像,点击“申请企业开发者认证”。
2. 提交认证信息等待审核通过一般在10个工作日内给结果。
## 如何企业开发者转个人开发者
目前**不支持**手动转回个人开发者,需要等待年审提出转个人申请。
## 开发者注册常见问题答疑
### 账号审核时间
开发者账号审核通过一般在 **7 工作日**
开发者账号催审请通过发送邮件至 **minecraftstarter@163.com** 与官方取得联系。
邮件标题为:【开发者信息审核催审】+ 开发者昵称 + 开发者账号
邮件内容为:
> 开发者账号xxxx@xxx.com
>
> 开发者昵称xxx
>
> 真实姓名xxx
>
> 手机号xxx
>
> 联系QQxxx
>
> 身份证号xxx
>
> 提交时间xxx
开发者账号审核通过一般在 **7 工作日** ,请耐心等待。
### 选择符合自身实际情况的结算方式
@@ -86,7 +121,7 @@ selection: true
### 若在规定期限内结算收益,但在打款时未拿到款项
在通常情况下,在结算收益后会在30个工作日左右收到款项。如果超出正常结算周期仍然没收到款 项,请检查您的资料信息是否有误。
在通常情况下,若点击结算的时间为工作日,在结算收益后会在当天或次日收到款项。如果超出正常结算周期仍然没收到款项,请检查您的资料信息是否有误。
1. 若出现银行卡信息错误导致收益无法收到的,官方会为账号打开 **“更新结算信息”** 入口,请尽快点击开发者平台右上方头像,在个人信息窗口找到 **"更换结算信息"** 入口,上传正确的结算资料等待审核。打款失败的款目会在审核通过后的下一周到账。如无及时更改将会影响后续的正常结算的流程,敬请了解。
2. 若出现过去可以正常收款,但在之后出现超出结算周期未收到款项。可以在 **【开发者平台】** - **【开发者常见问题答疑】** - **【反馈其他问题】** 与我们取得联系,填写表单时,请记得写好 **联系方式** 。在通常情况下,官方人员会通过留下的联系方式与您取得联系。
@@ -96,8 +131,8 @@ selection: true
### 想要注销开发者/UP主请问要怎么做呢
进入开发者平台后,点击右上角的个人昵称呼出 **个人信息窗口** ,点击 **申请注销账号** 按钮,并等待审核通过即可。注销申请提出后不可撤回, **且同个身份证、银行卡信息和手机号只允许注册一个开发者或一个UP主账号。当开发者或UP主账号被注册或注销时所使用过的个人信息将不再支持作为第二次注册开发者/UP主账号时的凭证资料请慎重操作。**
进入开发者平台后,点击右上角的个人昵称呼出 **个人信息窗口** ,点击 **申请注销账号** 按钮,并等待审核通过即可。注销申请提出后不可撤回, **且同个身份证、银行卡信息和手机号只允许注册一个开发者或一个UP主账号。当开发者或UP主账号被注册或注销时所使用过的个人信息将不再支持作为第二次注册开发者/UP主账号时的凭证资料请慎重操作。**
**温馨提示由于平台系统功能优化从2023年5月16日起平台已对up主带货系统进行逐步关停处理因此原平台不再开放up主身份进行注册。**
**温馨提示由于平台系统功能优化从2023年5月16日起平台已对up主带货系统进行逐步关停处理因此原平台不再开放up主身份进行注册。**

View File

@@ -65,7 +65,7 @@ selection: true
[地图编辑器使用说明](../14-地图制作/2-地图编辑器使用说明.html)
<a href="../../mconline/100-历史归档教程/40-美术教程/2.建筑教程/01.建筑搭建的思路及基本方法.html" rel="noopenner"> 建筑搭建的思路及基本方法 </a>
<a href="../../mconline/40-美术教程/2.建筑教程/01.建筑搭建的思路及基本方法.html" rel="noopenner"> 建筑搭建的思路及基本方法 </a>
制作局部地图主要使用结构功能你可以将部分地图保存为结构并且在你的玩法模组中使用。要做到这点除了地图编辑器之外还需要使用模组SDK进行编程等其他工具辅助。
@@ -79,7 +79,7 @@ selection: true
[原版模型制作指南](../16-美术/6-模型和动作/01-原版模型制作指南.html)
<a href="../../mconline/100-历史归档教程/40-美术教程/6.模型和模型动作/04.BLOCKBENCH教学.产出模型案例.html" rel="noopenner"> BLOCKBENCH教学 </a>
<a href="../../mconline/40-美术教程/6.模型和模型动作/04.BLOCKBENCH教学.产出模型案例.html" rel="noopenner"> BLOCKBENCH教学 </a>
另一种是骨骼模型骨骼模型被广泛应用于影视游戏行业的模型和动画制作上手门槛较高但是能提供比基岩版更好的效果。blender是一个免费且强大的软件可以用于骨骼模型的制作。
@@ -105,7 +105,7 @@ selection: true
你可以使用第三方软件Snow Storm或者直接写Json来制作原版特效并通过附加包来配置特效最终应用在模组中。
<a href="../../mconline/100-历史归档教程/10-addon教程/第17章原版粒子和特效粒子/课程10.简易教学.html" rel="noopenner"> 原版特效示例教学 </a>
<a href="../../mconline/10-addon教程/第17章原版粒子和特效粒子/课程10.简易教学.html" rel="noopenner"> 原版特效示例教学 </a>
除了原版特效外,我们专门为中国版特效提供了制作工具——特效编辑器。
@@ -125,7 +125,7 @@ selection: true
[界面编辑器使用说明](../18-界面与交互/1-界面编辑器使用说明.html)
<a href="../../mconline/100-历史归档教程/10-addon教程/第16章创建界面/课程01.认识界面控件.html" rel="noopenner"> 认识界面控件 </a>
<a href="../../mconline/10-addon教程/第16章创建界面/课程01.认识界面控件.html" rel="noopenner"> 认识界面控件 </a>
![img](./images/ui_image004.png)
@@ -143,7 +143,7 @@ selection: true
[我的世界基础概念](../20-玩法开发/10-基本概念/1-我的世界基础概念.html)
<a href="../../mconline/100-历史归档教程/10-addon教程/第02章认识Minecraft世界/课程01.认识Minecraft世界.html" rel="noopenner"> 认识Minecraft世界 </a>
<a href="../../mconline/10-addon教程/第02章认识Minecraft世界/课程01.认识Minecraft世界.html" rel="noopenner"> 认识Minecraft世界 </a>
![](./images/1_3.jpg)
@@ -175,7 +175,7 @@ selection: true
[脚本开发入门](../20-玩法开发/13-模组SDK编程/2-Python脚本开发/0-脚本开发入门.html)
<a href="../../mconline/100-历史归档教程/10-addon教程/第10章你的第一个MOD/课程01.认识MODSDK.html" rel="noopenner"> 认识MODSDK </a>
<a href="../../mconline/10-addon教程/第10章你的第一个MOD/课程01.认识MODSDK.html" rel="noopenner"> 认识MODSDK </a>
编程离不开接口的使用除了Python自带的接口之外你还需要使用模组SDK提供的一系列接口API这些接口的文档在技术手册中在编程的过程中你可能需要实时查阅。
@@ -212,7 +212,7 @@ selection: true
[自定义基础物品](../20-玩法开发/15-自定义游戏内容/1-自定义物品/1-自定义基础物品.html)
<a href="../../mconline/100-历史归档教程/10-addon教程/第06章认识Addon/课程01.认识Add-on.html" rel="noopenner"> 认识Add-on </a>
<a href="../../mconline/10-addon教程/第06章认识Addon/课程01.认识Add-on.html" rel="noopenner"> 认识Add-on </a>
## 手机电脑适配
@@ -230,11 +230,11 @@ selection: true
网络服开发者简称“服主”,服主在申请成为开发者之后,还需要申请测试机器,用于网络服的部署开发。开发完成后,需要进行提审,申请正式机器,用于最终上线。
测试机器申请可查看教程:<a href="../../mcguide/27-网络游戏/课程1成为Apollo服主及相关准备/第3节入驻申请.html">入驻申请</a>。
测试机器申请可查看教程:<a href="../../mcguide/27-手机网络游戏/课程1成为Apollo服主及相关准备/第3节入驻申请.html">入驻申请</a>。
获得测试机器之后,需要连接开发机,可查看课程:<a href="../../mcguide/27-网络游戏/课程1成为Apollo服主及相关准备/第5节连接开发机.html">连接开发机</a>。
获得测试机器之后,需要连接开发机,可查看课程:<a href="../../mcguide/27-手机网络游戏/课程1成为Apollo服主及相关准备/第5节连接开发机.html">连接开发机</a>。
机器连接成功之后,可以按照指引视频,完成一系列的基本操作。可查看课程:<a href="../../mcguide/27-网络游戏/课程3简易网络服模板部署与常见操作/第1节简易网络服视频教程.html">简易网络服视频教程</a>。
机器连接成功之后,可以按照指引视频,完成一系列的基本操作。可查看课程:<a href="../../mcguide/27-手机网络游戏/课程3简易网络服模板部署与常见操作/第1节简易网络服视频教程.html">简易网络服视频教程</a>。
其余的教学内容简介详见官网——教学中心——网络游戏以及官网——在线课程——网络服插件教程。

Binary file not shown.

Binary file not shown.

View File

@@ -10,52 +10,52 @@ selection: true
下面是地图类型作品的文件夹结构。
作品文件夹
|--&nbsp;.mcs&nbsp;&nbsp;*<font color=#009900>//文件夹,保存了编辑器配置信息。</font>*
|--&nbsp;behavior_packs&nbsp;&nbsp;*<font color=#009900>//文件夹,行为包集合,下面可放置多个行为包。</font>*
|&nbsp;&nbsp;&nbsp;|--&nbsp;behavior_pack_\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹,行为包,命名并没有固定的格式。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;entities&nbsp;&nbsp;*<font color=#009900>//文件夹放置实体的JSON文件配置实体的血量、攻击、行为等。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;script_\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹Python脚本文件夹一般为script加特定字符串。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Parts&nbsp;&nbsp;*<font color=#009900>//文件夹,里面是零件文件夹的子文件夹的链接,自动生成,无需处理。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;items&nbsp;&nbsp;*<font color=#009900>//文件夹放置物品的原版JSON文件配置物品的使用时间、效果等。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;netease_items&nbsp;&nbsp;*<font color=#009900>//文件夹放置网易版自定义物品的JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;netease_blocks&nbsp;&nbsp;*<font color=#009900>//文件夹放置网易版自定义方块的JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Parts&nbsp;&nbsp;*<font color=#009900>//文件夹,放置所有的零件文件夹。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹,放置一个零件的所有文件,名称在新建时确认,不要修改。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*.part&nbsp;&nbsp;*<font color=#009900>//零件本体文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*Part.py&nbsp;&nbsp;*<font color=#009900>//零件脚本文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*PartMeta.py&nbsp;&nbsp;*<font color=#009900>//零件元数据文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\_init\_.py&nbsp;&nbsp;*<font color=#009900>//导入用,不要删除。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Presets&nbsp;&nbsp;*<font color=#009900>//文件夹,放置所有的预设。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;loot_tables&nbsp;&nbsp;*<font color=#009900>//文件夹放置掉落配置JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;recipes&nbsp;&nbsp;*<font color=#009900>//文件夹放置原版的配方JSON文件如工作台、熔炉配方。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;spawn_rules&nbsp;&nbsp;*<font color=#009900>//文件夹放置原版的生物生成规则的JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;trading&nbsp;&nbsp;*<font color=#009900>//文件夹,放置原版的交易配置文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;storyline&nbsp;&nbsp;*<font color=#009900>//文件夹,放置逻辑编辑器生成的逻辑文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Galaxy&nbsp;&nbsp;*<font color=#009900>//文件夹,放置逻辑编辑器中的宏文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;manifest.json&nbsp;&nbsp;*<font color=#009900>//文件配置行为包的信息包括uuid、版本信息。</font>*
|--&nbsp;resource_packs&nbsp;&nbsp;*<font color=#009900>//文件夹,资源包集合,下面可放置多个资源包。</font>*
|&nbsp;&nbsp;&nbsp;|--&nbsp;resource_pack_\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹,资源包,命名并没有固定的格式。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;entity&nbsp;&nbsp;*<font color=#009900>//文件夹放置实体客户端的配置JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;attachables&nbsp;&nbsp;*<font color=#009900>//文件夹,放置原版装备模型的文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;models&nbsp;&nbsp;*<font color=#009900>//文件夹,放置模型文件,包括原版生物模型文件、骨骼模型文件等。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;materials&nbsp;&nbsp;*<font color=#009900>//文件夹,放置材质文件,一般来说无需关心。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;effects&nbsp;&nbsp;*<font color=#009900>//文件夹放置网易版的粒子和序列帧JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;textures&nbsp;&nbsp;*<font color=#009900>//文件夹,放置各类图片文件,文件夹内按用途又分成了不同文件夹。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;netease_items_res&nbsp;&nbsp;*<font color=#009900>//文件夹,放置网易版自定义物品的客户端配置文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;sounds&nbsp;&nbsp;*<font color=#009900>//文件夹,放置音效文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;texts&nbsp;&nbsp;*<font color=#009900>//文件夹放置文本lang文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;ui&nbsp;&nbsp;*<font color=#009900>//文件夹放置界面JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;font&nbsp;&nbsp;*<font color=#009900>//文件夹,放置字体文件,一般来说无需关心。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;manifest.json&nbsp;&nbsp;*<font color=#009900>//文件配置资源包的信息包括uuid、版本信息。</font>*
|--&nbsp;.db&nbsp;&nbsp;*<font color=#009900>//文件夹,保存了地图信息。</font>*
|&nbsp;&nbsp;&nbsp;|--&nbsp;presets.json&nbsp;&nbsp;*<font color=#009900>//预设存档,记录地图中的所有实例信息。</font>*
|--&nbsp;level.dat&nbsp;&nbsp;*<font color=#009900>//文件,地图相关数据,无需关心。</font>*
|--&nbsp;level.dat_old&nbsp;&nbsp;*<font color=#009900>//文件,地图相关数据,无需关心。</font>*
|--&nbsp;levelname.txt&nbsp;&nbsp;*<font color=#009900>//文件,记录了存档名字。</font>*
|--&nbsp;world_behavior_packs.json&nbsp;&nbsp;*<font color=#009900>//文件,配置这个存档会使用哪些行为包。</font>*
|--&nbsp;world_resource_packs.json&nbsp;&nbsp;*<font color=#009900>//文件,配置这个存档会使用哪些资源包。</font>*
|--&nbsp;world_icon.jpeg&nbsp;&nbsp;*<font color=#009900>//文件,原版中部分地方会用到该图标作为作品封面。</font>*
|--&nbsp;work.mcscfg&nbsp;&nbsp;*<font color=#009900>//文件,保存了编辑器配置信息。</font>*
作品文件夹
|--&nbsp;.mcs&nbsp;&nbsp;*<font color=#009900>//文件夹,保存了编辑器配置信息。</font>*
|--&nbsp;behavior_packs&nbsp;&nbsp;*<font color=#009900>//文件夹,行为包集合,下面可放置多个行为包。</font>*
|&nbsp;&nbsp;&nbsp;|--&nbsp;behavior_pack_\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹,行为包,命名并没有固定的格式。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;entities&nbsp;&nbsp;*<font color=#009900>//文件夹放置实体的JSON文件配置实体的血量、攻击、行为等。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;script_\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹Python脚本文件夹一般为script加特定字符串。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Parts&nbsp;&nbsp;*<font color=#009900>//文件夹,里面是零件文件夹的子文件夹的链接,自动生成,无需处理。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;items&nbsp;&nbsp;*<font color=#009900>//文件夹放置物品的原版JSON文件配置物品的使用时间、效果等。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;netease_items&nbsp;&nbsp;*<font color=#009900>//文件夹放置网易版自定义物品的JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;netease_blocks&nbsp;&nbsp;*<font color=#009900>//文件夹放置网易版自定义方块的JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Parts&nbsp;&nbsp;*<font color=#009900>//文件夹,放置所有的零件文件夹。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹,放置一个零件的所有文件,名称在新建时确认,不要修改。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*.part&nbsp;&nbsp;*<font color=#009900>//零件本体文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*Part.py&nbsp;&nbsp;*<font color=#009900>//零件脚本文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\*\*\*PartMeta.py&nbsp;&nbsp;*<font color=#009900>//零件元数据文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;\_init\_.py&nbsp;&nbsp;*<font color=#009900>//导入用,不要删除。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Presets&nbsp;&nbsp;*<font color=#009900>//文件夹,放置所有的预设。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;loot_tables&nbsp;&nbsp;*<font color=#009900>//文件夹放置掉落配置JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;recipes&nbsp;&nbsp;*<font color=#009900>//文件夹放置原版的配方JSON文件如工作台、熔炉配方。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;spawn_rules&nbsp;&nbsp;*<font color=#009900>//文件夹放置原版的生物生成规则的JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;trading&nbsp;&nbsp;*<font color=#009900>//文件夹,放置原版的交易配置文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;storyline&nbsp;&nbsp;*<font color=#009900>//文件夹,放置逻辑编辑器生成的逻辑文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;Galaxy&nbsp;&nbsp;*<font color=#009900>//文件夹,放置逻辑编辑器中的宏文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;manifest.json&nbsp;&nbsp;*<font color=#009900>//文件配置行为包的信息包括uuid、版本信息。</font>*
|--&nbsp;resource_packs&nbsp;&nbsp;*<font color=#009900>//文件夹,资源包集合,下面可放置多个资源包。</font>*
|&nbsp;&nbsp;&nbsp;|--&nbsp;resource_pack_\*\*\*&nbsp;&nbsp;*<font color=#009900>//文件夹,资源包,命名并没有固定的格式。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;entity&nbsp;&nbsp;*<font color=#009900>//文件夹放置实体客户端的配置JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;attachables&nbsp;&nbsp;*<font color=#009900>//文件夹,放置原版装备模型的文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;models&nbsp;&nbsp;*<font color=#009900>//文件夹,放置模型文件,包括原版生物模型文件、骨骼模型文件等。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;materials&nbsp;&nbsp;*<font color=#009900>//文件夹,放置材质文件,一般来说无需关心。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;effects&nbsp;&nbsp;*<font color=#009900>//文件夹放置网易版的粒子和序列帧JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;textures&nbsp;&nbsp;*<font color=#009900>//文件夹,放置各类图片文件,文件夹内按用途又分成了不同文件夹。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;netease_items_res&nbsp;&nbsp;*<font color=#009900>//文件夹,放置网易版自定义物品的客户端配置文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;sounds&nbsp;&nbsp;*<font color=#009900>//文件夹,放置音效文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;texts&nbsp;&nbsp;*<font color=#009900>//文件夹放置文本lang文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;ui&nbsp;&nbsp;*<font color=#009900>//文件夹放置界面JSON文件。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;font&nbsp;&nbsp;*<font color=#009900>//文件夹,放置字体文件,一般来说无需关心。</font>*
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;manifest.json&nbsp;&nbsp;*<font color=#009900>//文件配置资源包的信息包括uuid、版本信息。</font>*
|--&nbsp;.db&nbsp;&nbsp;*<font color=#009900>//文件夹,保存了地图信息。</font>*
|&nbsp;&nbsp;&nbsp;|--&nbsp;presets.json&nbsp;&nbsp;*<font color=#009900>//预设存档,记录地图中的所有实例信息。</font>*
|--&nbsp;level.dat&nbsp;&nbsp;*<font color=#009900>//文件,地图相关数据,无需关心。</font>*
|--&nbsp;level.dat_old&nbsp;&nbsp;*<font color=#009900>//文件,地图相关数据,无需关心。</font>*
|--&nbsp;levelname.txt&nbsp;&nbsp;*<font color=#009900>//文件,记录了存档名字。</font>*
|--&nbsp;world_behavior_packs.json&nbsp;&nbsp;*<font color=#009900>//文件,配置这个存档会使用哪些行为包。</font>*
|--&nbsp;world_resource_packs.json&nbsp;&nbsp;*<font color=#009900>//文件,配置这个存档会使用哪些资源包。</font>*
|--&nbsp;world_icon.jpeg&nbsp;&nbsp;*<font color=#009900>//文件,原版中部分地方会用到该图标作为作品封面。</font>*
|--&nbsp;work.mcscfg&nbsp;&nbsp;*<font color=#009900>//文件,保存了编辑器配置信息。</font>*
Addon类型的作品内没有地图文件、behavior_packs、resource_packs只有行为包、资源包。Addon中的行为包和资源包的结构和上面的说明一样。

View File

@@ -0,0 +1,150 @@
---
front: 进阶
time: 15分钟
---
# 模型规范指南
## 前言
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
因此换了BlockBench模型的Mod会导致官方皮肤时出现贴图错位、模型消失等兼容性问题影响了玩家的视觉体验。
现已开放官方模型规范开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验
## 模型模板下载
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
## 兼容分类
根据模组与官方皮肤的兼容程度,分为:
1. **完全兼容**未更换bb模型。表现为皮肤模型贴图以及穿戴外观模组动画等表现都正常。
2. **部分兼容**更换了bb模型但按照官方规范制作。表现为皮肤挂件以及穿戴外观正常但是模型样式改变及贴图错乱。
3. **不兼容**更换了bb模型且未按照官方规范制作。表现为模型样式改变皮肤挂件错乱穿戴外观错乱以及动作异常。
## 规范概要
1. 玩法模组非必要不改bb模型如需修改bb模型需遵循动作优化类模组规范
2. 动作优化类模组:
- 人形角色非必要不修改bb结构即无需使用AddPlayerGeometry的Api
- 如需修改修改bb结构则应该按以下优先级进行美术制作
- 不修改玩家模型为多关节
- **按规范**修改四肢为多关节模型但是不修改Body为多关节模型
- **按规范**砍四肢与body为多关节模型
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
3. SDK使用
- 开发者可以结合以下Mod SDK判断是否需要更换模型
- 建议穿戴史诗及以上多关节官方4d皮肤在模组对皮肤兼容度较差的前提下不进行玩家模型修改
- 其余情况开发者也可以使用接口判断更换模型的必要性
- [IsOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
4. 动画制作人形角色必须修改bb模型的建议使用官方模型并用其进行动画制作
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json如果改了请务必在官方的规范下进行拓展
## 多关节美术制作参考
### 必要骨骼
1. 常规骨骼(常作为挂件的挂点):
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
2. 会员盔甲挂点:
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
**【注意】**
* 共计26个骨骼开发者请不要随意删除
* 必要骨骼中加粗字体的骨骼为相比原版Steve新增的关节
### 骨骼层级一览
| 节点名称 | | 枢轴点 | 备注 |
|---------------------------|---|----------------| --- |
| root | | (0,0,0) | |
| —waist | | (0, 12, 0) | |
| ——body | | (0, 24, 0) | |
| ———head | | (0, 24, 0) | |
| —————hat | | (0, 24, 0) | |
| ———cape | | (0, 24, 3) | |
| ———leftArm | | (-5, 22, 0) | |
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
| ———————leftItem | | (-6, 15, 1) | |
| —————leftSleeve | | (-5, 22, 0) | |
| ———rightArm | | (5, 22, 0) | |
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
| ———————rightItem | | (6, 15, 1) | |
| —————rightSleeve | | (5, 22, 0) | |
| ———jacket | | (0, 24, 0) | |
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
| —leftLeg | | (-1.9, 12, 0) | |
| ——leftPants | | (-1.9, 12, 0) | |
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
| —rightLeg | | (1.9, 12, 0) | |
| ——rightPants | | (1.9, 12, 0) | |
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
**【注意】**
* 骨骼层级:影响官方动画兼容
* 骨骼命名:影响官方挂件兼容
* 枢轴点影响。比如body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
### 骨骼层级说明
* body 和 bodyDown 层级并列
* 新增的切分关节
- 5个骨骼节点`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
- 5个骨骼节点`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
### UV贴图制作
如下图所示需要按照Steve规范进行制作
![](./resources/0_1.png)
### 其余注意事项
1. 除盔甲骨骼以外其他骨骼下必须有同名cube。例如
![](./resources/0_2.jpg)
## 新增支持
### MOD SDK
为了方便开发者们在脚本中判断当前玩家皮肤状态,新增了三个接口和一个事件。
开发者可在事件当中判定**当前皮肤是否是官方,从而决定是否修改模型。**
也请开发者注意[**规范概要**](#规范概要)**非必要情况不修改模型。如需修改,也遵循照官方模型规范**
**【接口和事件】**
1. IsOfficialSkin 是否为官方皮肤
2. IsHighLevelOfficialSkin 是否为官方史诗级以上皮肤
3. IsHighLevelMultiJointOfficialSkin 是否为官方史诗级以上的多关节皮肤
4. UpdatePlayerSkinClient 更新模型皮肤事件
**【注意】**
上述三个接口在收到 Minecraft:EngineScripts:UpdatePlayerSkinClient 事件后进行调用。更多详细说明,见官网文档
使用示例
```python
# 这里以IsHighLevelMultiJointOfficialSkin为例
self.ListenForEvent('Minecraft', "EngineScripts", "UpdatePlayerSkinClient', self, self onUpdatePlayerSkinClient)
def onUpdatePlayerSkinClient(self,args):
import mod.client.extraClientApi as clientApi
comp = clientApi.GetEngineCompFactory().CreateGame(levelId)
comp.IsHighLevelMultiJointOfficialSkin(args['playerId']) # 返回bool为官方史诗级以上的多关节皮肤
```
### 测试服测试
为方便开发者测试4D皮肤与模组本身的兼容性官方在开发者测试服提供了测试用4D皮肤可通过邮件领取

View File

@@ -0,0 +1,159 @@
---
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
hard: 入门
time: 15分钟
selection: true
---
# 模型规范指南
## 前言
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
因此换了BlockBench模型的Mod会导致官方皮肤时出现贴图错位、模型消失等兼容性问题影响了玩家的视觉体验。
现已开放官方模型规范开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验
## 资源提供
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者
- 请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
- 手机端则可在开平下载**更新至3.5测试端**,在邮件**领取测试用4D皮肤**测试模组与4D皮肤的兼容性
## 兼容分类
根据模组与官方皮肤的兼容程度,分为:
1. **完全兼容**未更换bb模型。表现为皮肤模型贴图以及穿戴外观模组动画等表现都正常。
2. **部分兼容**更换了bb模型但按照官方规范制作。表现为皮肤挂件以及穿戴外观正常但是模型样式改变及贴图错乱。
3. **不兼容**更换了bb模型且未按照官方规范制作。表现为模型样式改变皮肤挂件错乱穿戴外观错乱以及动作异常。
## 规范概要
1. 玩法模组非必要不改bb模型如需修改bb模型需遵循动作优化类模组规范
2. 动作优化类模组:
- 人形角色非必要不修改bb结构即无需使用AddPlayerGeometry的Api
- 如需修改修改bb结构则应该按以下优先级进行美术制作
- 不修改玩家模型为多关节
- **按规范**修改四肢为多关节模型但是不修改Body为多关节模型
- **按规范**砍四肢与body为多关节模型
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
3. SDK使用
- 开发者可以结合以下Mod SDK判断是否需要更换模型
- 建议穿戴史诗及以上多关节官方4d皮肤在模组对皮肤兼容度较差的前提下不进行玩家模型修改
- 其余情况开发者也可以使用接口判断更换模型的必要性
- [IsOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
4. 动画制作人形角色必须修改bb模型的建议使用官方模型并用其进行动画制作
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json如果改了请务必在官方的规范下进行拓展
## 多关节美术制作参考
### 必要骨骼
1. 常规骨骼(常作为挂件的挂点):
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
2. 会员盔甲挂点:
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
**【注意】**
* 共计26个骨骼开发者请不要随意删除
* 必要骨骼中加粗字体的骨骼为相比原版Steve新增的关节
### 骨骼层级一览
| 节点名称 | | 枢轴点 | 备注 |
|---------------------------|---|----------------| --- |
| root | | (0,0,0) | |
| —waist | | (0, 12, 0) | |
| ——body | | (0, 24, 0) | |
| ———head | | (0, 24, 0) | |
| —————hat | | (0, 24, 0) | |
| ———cape | | (0, 24, 3) | |
| ———leftArm | | (-5, 22, 0) | |
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
| ———————leftItem | | (-6, 15, 1) | |
| —————leftSleeve | | (-5, 22, 0) | |
| ———rightArm | | (5, 22, 0) | |
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
| ———————rightItem | | (6, 15, 1) | |
| —————rightSleeve | | (5, 22, 0) | |
| ———jacket | | (0, 24, 0) | |
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
| —leftLeg | | (-1.9, 12, 0) | |
| ——leftPants | | (-1.9, 12, 0) | |
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
| —rightLeg | | (1.9, 12, 0) | |
| ——rightPants | | (1.9, 12, 0) | |
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
**【注意】**
* 骨骼层级:影响官方动画兼容
* 骨骼命名:影响官方挂件兼容
* 枢轴点影响。比如body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
### 骨骼层级说明
* body 和 bodyDown 层级并列
* 新增的切分关节
- 5个骨骼节点`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
- 5个骨骼节点`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
### UV贴图制作
如下图所示需要按照Steve规范进行制作
![](./resources/0_1.png)
### 其余注意事项
1. 除盔甲骨骼以外其他骨骼下必须有同名cube。例如
![](./resources/0_2.jpg)
## 新增支持
### MOD SDK
为了方便开发者们在脚本中判断当前玩家皮肤状态,新增了三个接口和一个事件。
开发者可在事件当中判定**当前皮肤是否是官方,从而决定是否修改模型。**
也请开发者注意[**规范概要**](#规范概要)**非必要情况不修改模型。如需修改,也遵循照官方模型规范**
**【接口和事件】**
1. IsOfficialSkin 是否为官方皮肤
2. IsHighLevelOfficialSkin 是否为官方史诗级以上皮肤
3. IsHighLevelMultiJointOfficialSkin 是否为官方史诗级以上的多关节皮肤
4. UpdatePlayerSkinClient 更新模型皮肤事件
**【注意】**
上述三个接口在收到 Minecraft:EngineScripts:UpdatePlayerSkinClient 事件后进行调用。更多详细说明,见官网文档
使用示例
```python
# 这里以IsHighLevelMultiJointOfficialSkin为例
self.ListenForEvent('Minecraft', "EngineScripts", "UpdatePlayerSkinClient', self, self onUpdatePlayerSkinClient)
def onUpdatePlayerSkinClient(self,args):
import mod.client.extraClientApi as clientApi
comp = clientApi.GetEngineCompFactory().CreateGame(levelId)
comp.IsHighLevelMultiJointOfficialSkin(args['playerId']) # 返回bool为官方史诗级以上的多关节皮肤
```
### 测试皮肤
为方便开发者测试4D皮肤与模组本身的兼容性官方在开发者测试服提供了测试用4D皮肤可通过邮件领取
**注意:** 请各位开发者更新到3.5测试服3.4该测试皮肤不会生效

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,473 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.standard_steve",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 3,
"visible_bounds_height": 4,
"visible_bounds_offset": [0, 1, 0]
},
"bones": [
{
"name": "root",
"pivot": [0, 0, 0]
},
{
"name": "waist",
"parent": "root",
"pivot": [0, 12, 0]
},
{
"name": "body",
"parent": "waist",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 16, -2],
"size": [8, 8, 4],
"uv": {
"north": {"uv": [20, 20], "uv_size": [8, 8]},
"east": {"uv": [16, 20], "uv_size": [4, 8]},
"south": {"uv": [32, 20], "uv_size": [8, 8]},
"west": {"uv": [28, 20], "uv_size": [4, 8]},
"up": {"uv": [20, 16], "uv_size": [8, 4]},
"down": {"uv": [28, 20], "uv_size": [8, -4]}
}
}
]
},
{
"name": "head",
"parent": "body",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 24, -4],
"size": [8, 8, 8],
"uv": {
"north": {"uv": [8, 8], "uv_size": [8, 8]},
"east": {"uv": [0, 8], "uv_size": [8, 8]},
"south": {"uv": [24, 8], "uv_size": [8, 8]},
"west": {"uv": [16, 8], "uv_size": [8, 8]},
"up": {"uv": [8, 0], "uv_size": [8, 8]},
"down": {"uv": [16, 8], "uv_size": [8, -8]}
}
}
]
},
{
"name": "hat",
"parent": "head",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 24, -4],
"size": [8, 8, 8],
"inflate": 0.25,
"uv": {
"north": {"uv": [40, 8], "uv_size": [8, 8]},
"east": {"uv": [32, 8], "uv_size": [8, 8]},
"south": {"uv": [56, 8], "uv_size": [8, 8]},
"west": {"uv": [48, 8], "uv_size": [8, 8]},
"up": {"uv": [40, 0], "uv_size": [8, 8]},
"down": {"uv": [48, 8], "uv_size": [8, -8]}
}
}
]
},
{
"name": "cape",
"parent": "body",
"pivot": [0, 24, 3]
},
{
"name": "leftArm",
"parent": "body",
"pivot": [5, 22, 0],
"cubes": [
{
"origin": [4, 18, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [36, 52], "uv_size": [4, 6]},
"east": {"uv": [32, 52], "uv_size": [4, 6]},
"south": {"uv": [44, 52], "uv_size": [4, 6]},
"west": {"uv": [40, 52], "uv_size": [4, 6]},
"up": {"uv": [36, 48], "uv_size": [4, 4]},
"down": {"uv": [40, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftArmDown",
"parent": "leftArm",
"pivot": [5, 18, 0],
"cubes": [
{
"origin": [4, 12, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [36, 58], "uv_size": [4, 6]},
"east": {"uv": [32, 58], "uv_size": [4, 6]},
"south": {"uv": [44, 58], "uv_size": [4, 6]},
"west": {"uv": [40, 58], "uv_size": [4, 6]},
"up": {"uv": [40, 48], "uv_size": [4, 4]},
"down": {"uv": [40, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftSleeveDown",
"parent": "leftArmDown",
"pivot": [5, 18.25, 0],
"cubes": [
{
"origin": [4, 12, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [52, 58], "uv_size": [4, 6]},
"east": {"uv": [48, 58], "uv_size": [4, 6]},
"south": {"uv": [60, 58], "uv_size": [4, 6]},
"west": {"uv": [56, 58], "uv_size": [4, 6]},
"up": {"uv": [56, 48], "uv_size": [4, 4]},
"down": {"uv": [56, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftItem",
"parent": "leftArmDown",
"pivot": [6, 15, 1]
},
{
"name": "leftSleeve",
"parent": "leftArm",
"pivot": [5, 22, 0],
"cubes": [
{
"origin": [4, 18, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [52, 52], "uv_size": [4, 6]},
"east": {"uv": [48, 52], "uv_size": [4, 6]},
"south": {"uv": [60, 52], "uv_size": [4, 6]},
"west": {"uv": [56, 52], "uv_size": [4, 6]},
"up": {"uv": [52, 48], "uv_size": [4, 4]},
"down": {"uv": [56, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "rightArm",
"parent": "body",
"pivot": [-5, 22, 0],
"cubes": [
{
"origin": [-8, 18, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [40, 52], "uv_size": [-4, 6]},
"east": {"uv": [44, 52], "uv_size": [-4, 6]},
"south": {"uv": [48, 52], "uv_size": [-4, 6]},
"west": {"uv": [36, 52], "uv_size": [-4, 6]},
"up": {"uv": [40, 48], "uv_size": [-4, 4]},
"down": {"uv": [44, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightArmDown",
"parent": "rightArm",
"pivot": [-5, 18, 0],
"cubes": [
{
"origin": [-8, 12, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [40, 58], "uv_size": [-4, 6]},
"east": {"uv": [44, 58], "uv_size": [-4, 6]},
"south": {"uv": [48, 58], "uv_size": [-4, 6]},
"west": {"uv": [36, 58], "uv_size": [-4, 6]},
"up": {"uv": [44, 48], "uv_size": [-4, 4]},
"down": {"uv": [44, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightISleeveDown",
"parent": "rightArmDown",
"pivot": [-5, 18.25, 0],
"cubes": [
{
"origin": [-8, 12, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [48, 42], "uv_size": [-4, 6]},
"east": {"uv": [52, 42], "uv_size": [-4, 6]},
"south": {"uv": [56, 42], "uv_size": [-4, 6]},
"west": {"uv": [44, 42], "uv_size": [-4, 6]},
"up": {"uv": [52, 32], "uv_size": [-4, 4]},
"down": {"uv": [52, 36], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightItem",
"parent": "rightArmDown",
"pivot": [-6, 15, 1],
"locators": {
"lead_hold": [-6, 15, 1]
}
},
{
"name": "rightSleeve",
"parent": "rightArm",
"pivot": [-5, 22, 0],
"cubes": [
{
"origin": [-8, 18, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [48, 36], "uv_size": [-4, 6]},
"east": {"uv": [52, 36], "uv_size": [-4, 6]},
"south": {"uv": [56, 36], "uv_size": [-4, 6]},
"west": {"uv": [44, 36], "uv_size": [-4, 6]},
"up": {"uv": [48, 32], "uv_size": [-4, 4]},
"down": {"uv": [52, 36], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "jacket",
"parent": "body",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 16, -2],
"size": [8, 8, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [20, 36], "uv_size": [8, 8]},
"east": {"uv": [16, 36], "uv_size": [4, 8]},
"south": {"uv": [32, 36], "uv_size": [8, 8]},
"west": {"uv": [28, 36], "uv_size": [4, 8]},
"up": {"uv": [20, 32], "uv_size": [8, 4]},
"down": {"uv": [28, 36], "uv_size": [8, -4]}
}
}
]
},
{
"name": "bodyDown",
"parent": "waist",
"pivot": [0, 16, 0],
"cubes": [
{
"origin": [-4, 12, -2],
"size": [8, 4, 4],
"uv": {
"north": {"uv": [20, 28], "uv_size": [8, 4]},
"east": {"uv": [16, 28], "uv_size": [4, 4]},
"south": {"uv": [32, 28], "uv_size": [8, 4]},
"west": {"uv": [28, 28], "uv_size": [4, 4]},
"up": {"uv": [28, 16], "uv_size": [8, 4]},
"down": {"uv": [28, 20], "uv_size": [8, -4]}
}
}
]
},
{
"name": "jacketDown",
"parent": "bodyDown",
"pivot": [0, 16.25, 0],
"cubes": [
{
"origin": [-4, 12, -2],
"size": [8, 4, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [20, 44], "uv_size": [8, 4]},
"east": {"uv": [16, 44], "uv_size": [4, 4]},
"south": {"uv": [32, 44], "uv_size": [8, 4]},
"west": {"uv": [28, 44], "uv_size": [4, 4]},
"up": {"uv": [0, 4], "uv_size": [8, 4]},
"down": {"uv": [0, 4], "uv_size": [8, -4]}
}
}
]
},
{
"name": "leftLeg",
"parent": "root",
"pivot": [1.9, 12, 0],
"cubes": [
{
"origin": [-0.1, 6, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [20, 52], "uv_size": [4, 6]},
"east": {"uv": [16, 52], "uv_size": [4, 6]},
"south": {"uv": [28, 52], "uv_size": [4, 6]},
"west": {"uv": [24, 52], "uv_size": [4, 6]},
"up": {"uv": [20, 48], "uv_size": [4, 4]},
"down": {"uv": [24, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftPants",
"parent": "leftLeg",
"pivot": [1.9, 12, 0],
"cubes": [
{
"origin": [-0.1, 6, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [4, 52], "uv_size": [4, 6]},
"east": {"uv": [0, 52], "uv_size": [4, 6]},
"south": {"uv": [12, 52], "uv_size": [4, 6]},
"west": {"uv": [8, 52], "uv_size": [4, 6]},
"up": {"uv": [4, 48], "uv_size": [4, 4]},
"down": {"uv": [8, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftLegDown",
"parent": "leftLeg",
"pivot": [1.9, 6, 0],
"cubes": [
{
"origin": [-0.1, 0, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [20, 58], "uv_size": [4, 6]},
"east": {"uv": [16, 58], "uv_size": [4, 6]},
"south": {"uv": [28, 58], "uv_size": [4, 6]},
"west": {"uv": [24, 58], "uv_size": [4, 6]},
"up": {"uv": [24, 48], "uv_size": [4, 4]},
"down": {"uv": [24, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftPantsDown",
"parent": "leftLegDown",
"pivot": [1.9, 6.25, 0],
"cubes": [
{
"origin": [-0.1, 0, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [4, 58], "uv_size": [4, 6]},
"east": {"uv": [0, 58], "uv_size": [4, 6]},
"south": {"uv": [12, 58], "uv_size": [4, 6]},
"west": {"uv": [8, 58], "uv_size": [4, 6]},
"up": {"uv": [8, 48], "uv_size": [4, 4]},
"down": {"uv": [8, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "rightLeg",
"parent": "root",
"pivot": [-1.9, 12, 0],
"cubes": [
{
"origin": [-3.9, 6, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [24, 52], "uv_size": [-4, 6]},
"east": {"uv": [28, 52], "uv_size": [-4, 6]},
"south": {"uv": [32, 52], "uv_size": [-4, 6]},
"west": {"uv": [20, 52], "uv_size": [-4, 6]},
"up": {"uv": [24, 48], "uv_size": [-4, 4]},
"down": {"uv": [28, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightPants",
"parent": "rightLeg",
"pivot": [-1.9, 12, 0],
"cubes": [
{
"origin": [-3.9, 6, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [8, 36], "uv_size": [-4, 6]},
"east": {"uv": [12, 36], "uv_size": [-4, 6]},
"south": {"uv": [16, 36], "uv_size": [-4, 6]},
"west": {"uv": [4, 36], "uv_size": [-4, 6]},
"up": {"uv": [8, 32], "uv_size": [-4, 4]},
"down": {"uv": [12, 36], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightLegDown",
"parent": "rightLeg",
"pivot": [-1.9, 6, 0],
"cubes": [
{
"origin": [-3.9, 0, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [24, 58], "uv_size": [-4, 6]},
"east": {"uv": [28, 58], "uv_size": [-4, 6]},
"south": {"uv": [32, 58], "uv_size": [-4, 6]},
"west": {"uv": [20, 58], "uv_size": [-4, 6]},
"up": {"uv": [28, 48], "uv_size": [-4, 4]},
"down": {"uv": [28, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightPantsDown",
"parent": "rightLegDown",
"pivot": [-1.9, 6.25, 0],
"cubes": [
{
"origin": [-3.9, 0, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [8, 42], "uv_size": [-4, 6]},
"east": {"uv": [12, 42], "uv_size": [-4, 6]},
"south": {"uv": [16, 42], "uv_size": [-4, 6]},
"west": {"uv": [4, 42], "uv_size": [-4, 6]},
"up": {"uv": [12, 32], "uv_size": [-4, 4]},
"down": {"uv": [12, 36], "uv_size": [-4, -4]}
}
}
]
}
]
}
]
}

View File

@@ -0,0 +1,157 @@
---
front: 进阶
time: 15分钟
---
# 模型规范指南
## 前言
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
因此换了BlockBench模型的Mod会导致官方皮肤时出现贴图错位、模型消失等兼容性问题影响了玩家的视觉体验。
现已开放官方模型规范开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验
## 资源提供
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者
- 请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
- 手机端则可在开平下载**更新至3.5测试端**,在邮件**领取测试用4D皮肤**测试模组与4D皮肤的兼容性
## 兼容分类
根据模组与官方皮肤的兼容程度,分为:
1. **完全兼容**未更换bb模型。表现为皮肤模型贴图以及穿戴外观模组动画等表现都正常。
2. **部分兼容**更换了bb模型但按照官方规范制作。表现为皮肤挂件以及穿戴外观正常但是模型样式改变及贴图错乱。
3. **不兼容**更换了bb模型且未按照官方规范制作。表现为模型样式改变皮肤挂件错乱穿戴外观错乱以及动作异常。
## 规范概要
1. 玩法模组非必要不改bb模型如需修改bb模型需遵循动作优化类模组规范
2. 动作优化类模组:
- 人形角色非必要不修改bb结构即无需使用AddPlayerGeometry的Api
- 如需修改修改bb结构则应该按以下优先级进行美术制作
- 不修改玩家模型为多关节
- **按规范**修改四肢为多关节模型但是不修改Body为多关节模型
- **按规范**砍四肢与body为多关节模型
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
3. SDK使用
- 开发者可以结合以下Mod SDK判断是否需要更换模型
- 建议穿戴史诗及以上多关节官方4d皮肤在模组对皮肤兼容度较差的前提下不进行玩家模型修改
- 其余情况开发者也可以使用接口判断更换模型的必要性
- [IsOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
4. 动画制作人形角色必须修改bb模型的建议使用官方模型并用其进行动画制作
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json如果改了请务必在官方的规范下进行拓展
## 多关节美术制作参考
### 必要骨骼
1. 常规骨骼(常作为挂件的挂点):
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
2. 会员盔甲挂点:
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
**【注意】**
* 共计26个骨骼开发者请不要随意删除
* 必要骨骼中加粗字体的骨骼为相比原版Steve新增的关节
### 骨骼层级一览
| 节点名称 | | 枢轴点 | 备注 |
|---------------------------|---|----------------| --- |
| root | | (0,0,0) | |
| —waist | | (0, 12, 0) | |
| ——body | | (0, 24, 0) | |
| ———head | | (0, 24, 0) | |
| —————hat | | (0, 24, 0) | |
| ———cape | | (0, 24, 3) | |
| ———leftArm | | (-5, 22, 0) | |
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
| ———————leftItem | | (-6, 15, 1) | |
| —————leftSleeve | | (-5, 22, 0) | |
| ———rightArm | | (5, 22, 0) | |
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
| ———————rightItem | | (6, 15, 1) | |
| —————rightSleeve | | (5, 22, 0) | |
| ———jacket | | (0, 24, 0) | |
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
| —leftLeg | | (-1.9, 12, 0) | |
| ——leftPants | | (-1.9, 12, 0) | |
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
| —rightLeg | | (1.9, 12, 0) | |
| ——rightPants | | (1.9, 12, 0) | |
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
**【注意】**
* 骨骼层级:影响官方动画兼容
* 骨骼命名:影响官方挂件兼容
* 枢轴点影响。比如body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
### 骨骼层级说明
* body 和 bodyDown 层级并列
* 新增的切分关节
- 5个骨骼节点`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
- 5个骨骼节点`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
### UV贴图制作
如下图所示需要按照Steve规范进行制作
![](./resources/0_1.png)
### 其余注意事项
1. 除盔甲骨骼以外其他骨骼下必须有同名cube。例如
![](./resources/0_2.jpg)
## 新增支持
### MOD SDK
为了方便开发者们在脚本中判断当前玩家皮肤状态,新增了三个接口和一个事件。
开发者可在事件当中判定**当前皮肤是否是官方,从而决定是否修改模型。**
也请开发者注意[**规范概要**](#规范概要)**非必要情况不修改模型。如需修改,也遵循照官方模型规范**
**【接口和事件】**
1. IsOfficialSkin 是否为官方皮肤
2. IsHighLevelOfficialSkin 是否为官方史诗级以上皮肤
3. IsHighLevelMultiJointOfficialSkin 是否为官方史诗级以上的多关节皮肤
4. UpdatePlayerSkinClient 更新模型皮肤事件
**【注意】**
上述三个接口在收到 Minecraft:EngineScripts:UpdatePlayerSkinClient 事件后进行调用。更多详细说明,见官网文档
使用示例
```python
# 这里以IsHighLevelMultiJointOfficialSkin为例
self.ListenForEvent('Minecraft', "EngineScripts", "UpdatePlayerSkinClient', self, self onUpdatePlayerSkinClient)
def onUpdatePlayerSkinClient(self,args):
import mod.client.extraClientApi as clientApi
comp = clientApi.GetEngineCompFactory().CreateGame(levelId)
comp.IsHighLevelMultiJointOfficialSkin(args['playerId']) # 返回bool为官方史诗级以上的多关节皮肤
```
### 测试皮肤
为方便开发者测试4D皮肤与模组本身的兼容性官方在开发者测试服提供了测试用4D皮肤可通过邮件领取
**注意:** 请各位开发者更新到3.5测试服3.4该测试皮肤不会生效

View File

@@ -394,14 +394,14 @@ uniform vec4 EXTRA_VECTOR2; // vec4(param2.y, ?, ?, ?) // 问号表示冗余 不
目前我们设置了多个可在自定义后处理中使用的shader宏变量他们包含了多种游戏中的环境参数。如下表所示。
| 宏变量名称 | 格式 | 包含参数 | 备注 |
| ------------------ | ------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 宏变量名称 | 格式 | 包含参数 | 备注 |
| ------------------ | ------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| WORLD_PARAMETERS | vec3(int, float, float) | 玩家所在维度id星星亮度环境光亮度 | 1. 玩家所在维度id。id=0(主世界)id=1(下界)id=2(末地)id>=3(自定义维度)。<br />2. 星星亮度。该值与<a href="./../../../mcdocs/1-ModAPI/接口/世界/渲染.html#GetStarBrightness">GetStarBrightness接口</a>所返回的值一致。<br />3. 环境光亮度。该值与<a href="./../../../mcdocs/1-ModAPI/接口/世界/渲染.html#GetAmbientBrightness">GetAmbientBrightness接口</a>所返回的值一致。 |
| TIME_PARAMETERS | vec2(float, float) | 自当天日出后流逝的游戏刻数,世界总共流逝的游戏刻数 | 1. 自当天日出后流逝的游戏刻数,与`/time query daytime`指令所得出值一致。<br />2. 世界总共流逝的游戏刻数,与`/time query worldtime`指令所得出的值一致。 |
| WEATHER_PARAMETERS | vec3(int, float, float) | 天气类型,降雨等级,打雷等级 | 1. 天气类型。值为0表示晴天值为1时表示下雨值为2时表示雷暴。<br />2. 降雨等级。目前世界的降雨强度,值范围为[0,1]。<br />3. 打雷等级。目前世界的打雷强度,值范围为[0,1]。 |
| CAMERA_POSITION | vec3(float, float, float) | 相机位置 | 玩家相机的位置。 |
| PLAYER_POSITION | vec3(float, float, float) | 玩家位置 | 玩家的世界位置。 |
| SKY_COLOR | vec3(float, float, float) | 天空颜色 | 天空盒的颜色。只有开启了精美天空选项时该值才有效否则该值为0。 |
| SKY_COLOR | vec3(float, float, float) | 天空颜色 | 天空盒的颜色。只有开启了精美天空选项时该值才有效否则该值为0。 |
以上宏变量均可在fragment shader或者vertex shader中使用。下面我们使用fragment shader作为示例

View File

@@ -378,13 +378,16 @@ mc里的特效实例有两种承载方式一种是在世界空间单独存在
动画是否循环播放如果设置为false则会在每个发射器的生命周期开始时重新播放动画。
- `size`
设置发射出来的骨骼模型的大小支持molang表达式。
- `ignore_lighting`
设置粒子模型是否受到环境光照影响与实体json中ignore_lighting作用相同。该值设置为true时粒子模型不受环境光影响始终保持默认亮度。
```json
"components": {
"netease:particle_appearance_FBX": {
"play_animation": "happy",
"loop": true,
"size": [1, 1, 1]
"size": [1, 1, 1],
"ignore_lighting": false
},
...
}

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
---
@@ -186,52 +186,52 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
要表现一个属性动画需要先写一个Json数据块透明度动画举例如下相关参数会在下文详细描述
```json
{
"anim_type" : "alpha",
"duration" : 1.0,
"from" : 0.0,
"to" : 1.0
}
```json
{
"anim_type" : "alpha",
"duration" : 1.0,
"from" : 0.0,
"to" : 1.0
}
```
这段代码块代表一个控件在1秒钟内alpha值从0线性变化到1的属性动画为了将这个动画绑定到控件上一共有两种写法。
一种是将Json数据块直接赋给alpha属性
```json
{
"alphaImg" : {
"alpha" : {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"to" : 1.0
},
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
}
}
```
另一种则是将属性动画写成自定义控件的形式写在UIjson文件的最外层在alpha属性值以 “@”+动画名 的形式进行赋值:
```json
{
"alphaImg" : {
"alpha" : "@show_alpha_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"show_alpha_ani": {
```json
{
"alphaImg" : {
"alpha" : {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"to" : 1.0
},
}
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
}
}
```
另一种则是将属性动画写成自定义控件的形式写在UIjson文件的最外层在alpha属性值以 “@”+动画名 的形式进行赋值:
```json
{
"alphaImg" : {
"alpha" : "@show_alpha_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"show_alpha_ani": {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"to" : 1.0
}
}
```
两种写法都能达成相同的效果,不同的是第二种写法能够被复用。
@@ -259,33 +259,34 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
* 注2
```json
"alphaImg" : {
"alpha" : "@show_alpha_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"show_alpha_ani": {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"next" : "@hold_alpha_ani",
"to" : 1.0
},
"hold_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 1,
"from" : 1.0,
"next" : "@hide_alpha_ani",
"to" : 1.0
},
"hide_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 1.0,
"to" : 0.0
},
{
"alphaImg" : {
"alpha" : "@show_alpha_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"show_alpha_ani": {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"next" : "@hold_alpha_ani",
"to" : 1.0
},
"hold_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 1,
"from" : 1.0,
"next" : "@hide_alpha_ani",
"to" : 1.0
},
"hide_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 1.0,
"to" : 0.0
}
}
```
### 透明度动画
@@ -301,33 +302,34 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![alpha动画](./picture/UIAnimation/alpha.gif)
```json
"alphaImg" : {
"alpha" : "@show_alpha_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"show_alpha_ani": {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"next" : "@hold_alpha_ani",
"to" : 1.0
},
"hold_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 1,
"from" : 1.0,
"next" : "@hide_alpha_ani",
"to" : 1.0
},
"hide_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 1.0,
"to" : 0.0
},
{
"alphaImg" : {
"alpha" : "@show_alpha_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"show_alpha_ani": {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 0.0,
"next" : "@hold_alpha_ani",
"to" : 1.0
},
"hold_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 1,
"from" : 1.0,
"next" : "@hide_alpha_ani",
"to" : 1.0
},
"hide_alpha_ani" : {
"anim_type" : "alpha",
"duration" : 0.30,
"from" : 1.0,
"to" : 0.0
}
}
```
### 裁剪动画
@@ -343,18 +345,19 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![clip动画](./picture/UIAnimation/clip.gif)
```json
"clipImg" : {
"clip_ratio" : {
"anim_type" : "clip",
"duration" : 1.0,
"from" : 0.0,
"to" : 1.0
},
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
{
"clipImg" : {
"clip_ratio" : {
"anim_type" : "clip",
"duration" : 1.0,
"from" : 0.0,
"to" : 1.0
},
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
}
}
```
### 颜色动画
@@ -370,19 +373,20 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![color动画](./picture/UIAnimation/color.gif)
```json
"colorImg" : {
"color": "@color_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"color_ani": {
"anim_type" : "color",
"duration" : 1.0,
"from" : [1,0,0],
"to" : [0,0,1]
},
{
"colorImg" : {
"color": "@color_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"color_ani": {
"anim_type" : "color",
"duration" : 1.0,
"from" : [1,0,0],
"to" : [0,0,1]
}
}
```
### 序列帧动画
@@ -402,20 +406,22 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![flipbook动画](./picture/UIAnimation/flipbook.gif)
```json
"flipbookImg" : {
"texture" : "textures/ui/my_eating_apple",
"type" : "image",
"uv" : "@flipbook_ani",
"uv_size" : [ 64.0, 64.0 ],
"visible" : true
},
"flipbook_ani": {
"anim_type": "flip_book",
"initial_frame": 10,
"frame_count": 36,
"fps": 10,
"reversible": false
},
{
"flipbookImg" : {
"texture" : "textures/ui/my_eating_apple",
"type" : "image",
"uv" : "@flipbook_ani",
"uv_size" : [ 64.0, 64.0 ],
"visible" : true
},
"flipbook_ani": {
"anim_type": "flip_book",
"initial_frame": 10,
"frame_count": 36,
"fps": 10,
"reversible": false
}
}
```
当一个图片控件被用作序列帧的载体时,该控件的属性配置有以下规则需要遵守:
@@ -441,19 +447,20 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![offset动画](./picture/UIAnimation/offset.gif)
```json
"offsetImg" : {
"offset" : "@offset_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"offset_ani": {
"anim_type" : "offset",
"duration" : 1.0,
"from" : [0, 0],
"to" : [0, 50]
},
{
"offsetImg" : {
"offset" : "@offset_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"offset_ani": {
"anim_type" : "offset",
"duration" : 1.0,
"from" : [0, 0],
"to" : [0, 50]
}
}
```
**注**
@@ -477,19 +484,20 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![size动画](./picture/UIAnimation/size.gif)
```json
"sizeImg" : {
"size" : "@size_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"size_ani": {
"anim_type" : "size",
"duration" : 1.0,
"from" : [100, 100],
"to" : [150, 150]
},
{
"sizeImg" : {
"size" : "@size_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"size_ani": {
"anim_type" : "size",
"duration" : 1.0,
"from" : [100, 100],
"to" : [150, 150]
}
}
```
**注**
@@ -513,19 +521,20 @@ uv动画和序列帧动画都是uv起点属性的动画不同于其他属性
![uv动画](./picture/UIAnimation/uv.gif)
```json
"sizeImg" : {
"uv" : "@uv_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"uv_ani": {
"anim_type" : "uv",
"duration" : 5,
"from" : [0, 0],
"to" : [2240, 0]
},
{
"sizeImg" : {
"uv" : "@uv_ani",
"texture" : "textures/netease/common/image/default",
"type" : "image",
"visible" : true
},
"uv_ani": {
"anim_type" : "uv",
"duration" : 5,
"from" : [0, 0],
"to" : [2240, 0]
}
}
```

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
selection: true
@@ -248,23 +248,22 @@ shootButton的锚点位移XY尺寸XY的参考属性如下。按照这种
3. 然后激活(显示)对应的界面预设
```python
def InitClient(self):
import mod.client.extraClientApi as clientApi
self.ListenForEngineEvent("UiInitFinished", self, self.OnUIInitFinished)
def InitClient(self):
import mod.client.extraClientApi as clientApi
self.ListenForEngineEvent(UiInitFinishedEvent, self, self.OnUIInitFinished)
```
```python
def OnUIInitFinished(self, args):
import mod.client.extraClientApi as clientApi
if clientApi.GetPlatform() == 0:
uiNodePreset = self.GetParent().GetChildPresetsByName("PC版UI界面")[0]
else:
uiNodePreset = self.GetParent().GetChildPresetsByName("PE版UI界面")[0]
if uiNodePreset:
uiNodePreset.SetUiActive(True)
def OnUIInitFinished(self, args):
import mod.client.extraClientApi as clientApi
if clientApi.GetPlatform() == 0:
uiNodePreset = self.GetParent().GetChildPresetsByName("PC版UI界面")[0]
else:
uiNodePreset = self.GetParent().GetChildPresetsByName("PE版UI界面")[0]
if uiNodePreset:
uiNodePreset.SetUiActive(True)
```
我们利用[UI API文档](40-UIAPI文档.html)中对各个控件的接口和游戏原生支持的格式化可以在python代码中动态的改变界面的表现具体可以参考[样式代码](https://zh.minecraft.wiki/w/%E6%A0%B7%E5%BC%8F%E4%BB%A3%E7%A0%81)
我们利用[UI API文档](40-UIAPI文档.html)中对各个控件的接口和游戏原生支持的格式化可以在python代码中动态的改变界面的表现具体可以参考[样式代码](https://minecraft-zh.gamepedia.com/index.php?title=%E6%A0%B7%E5%BC%8F%E4%BB%A3%E7%A0%81&variant=zh)
当然更多API功能还需要你的发现和尝试。

View File

@@ -881,7 +881,7 @@ screen即画布控件是游戏中一个UI界面的根节点所有其他
*
always_accepts_inputforce_render_below render_game_behind render_only_when_topmost属性仅在调用PushScreen接口创建UI时才会正常生效。
always_accepts_inputforce_render_below render_game_behind render_only_when_topmost属性仅在调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>接口创建UI时才会正常生效。
名称 | 类型 | 默认值 | 描述
--- | --- | --- | ---
@@ -900,7 +900,7 @@ force_render_below | boolean | false | 是否渲染下方的界面置true时
send_telemetry | boolean | true | 是否发送遥测数据
close_on_player_hurt | boolean | false | 是否在玩家受伤时关闭屏幕
cache_screen | boolean | false | 是否缓存屏幕上的控件,下次打开界面会更快,但会占用更多内存
load_screen_immediately | boolean | false | 是否在PushScreen后立即加载界面默认会延迟几帧加载防止卡顿
load_screen_immediately | boolean | false | 是否在<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>后立即加载界面,默认会延迟几帧加载防止卡顿
gamepad_cursor | boolean | false | 是否支持显示手柄光标
gamepad_cursor_deflection_mode | boolean | false | 是否开启手柄光标偏转模式默认值为false主要用于手柄适配[轮盘控件](#selection_wheel)
should_be_skipped_during_automation | boolean | false | 是否在自动化测试中应被跳过
@@ -939,7 +939,7 @@ inherit_max_sibling_width | boolean | false | 是否使用兄弟控件的最大
inherit_max_sibling_height | boolean | false | 是否使用兄弟控件的最大高度
contained | false | 该控件可拖动时,是否会被父控件的大小范围所限制
draggable | enum | "not_draggable" | 使控件可以被拖动。控件应能够接受输入才能被拖动如input_panel, button等并且必须具有所需的按钮映射。<br>可选值not_draggable不可拖动, vertical允许垂直拖动, horizontal允许水平拖动, both自由拖动
follows_cursor | boolean | false | 控件是否跟随鼠标或手柄指针移动
follows_cursor | boolean | false | 控件是否跟随鼠标或手柄指针移动,仅在调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>接口创建的UI中才会正常生效
grid_position | array [row, column] | 取决于自身 | 用于设置控件在grid中的位置这也允许修改原版硬编码网格的特定网格项
collection_index | int | 取决于自身 | 用于设置控件在集合中的索引
priority | int | 0 | 该控件的优先级,数字越小优先级越高
@@ -1858,7 +1858,7 @@ class UIDemoScreen(ScreenNode):
return index < self.showNum and self.demoGridControl.GetVisible()
```
可以看到grid格子的visible属性我们以"#UIDemo.visible"设置而该字段经由bindings字段的设置取代了系统变量#visible再在Python代码中绑定了"#UIDemo.visible"字段的函数更新回调。因此每个格子的visible属性就会读取Python函数的返回值进行动态的设置。有关于数据绑定详情可见[UI绑定和返回](#UI绑定和返回)
可以看到grid格子的visible属性我们以"#UIDemo.visible"设置而该字段经由bindings字段的设置取代了系统变量#visible再在Python代码中绑定了"#UIDemo.visible"字段的函数更新回调。因此每个格子的visible属性就会读取Python函数的返回值进行动态的设置,详情可见[集合绑定教程](70-UI数据绑定.md#集合绑定)
### progress_bar
@@ -2201,7 +2201,7 @@ hover事件的触发本质上是与鼠标悬浮相关在PC模式中当鼠
* 注2
推荐轮盘所在的Screen用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen">PushScreen</a>的方式创建因为PushScreen加载的UI是会对该UI中存在的控件中的贴图资源进行强制加载如果这个贴图从未显示过的话考虑到轮盘的贴图资源比较多6切片的轮盘如果用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#createui">CreateUI</a>的方式创建轮盘,并且这些轮盘贴图从未显示过,那么选择轮盘的时候就会产生闪烁现象,原因就是第一次显示的贴图资源会动态加载,而动态加载是需要一定时间的。如果想彻底解决这类加载问题,详见<a href="../20-玩法开发/18-性能优化/内存优化.html#贴图预加载" rel="noopenner"> 贴图预加载 </a>。
推荐轮盘所在的Screen用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>的方式创建因为PushScreen加载的UI是会对该UI中存在的控件中的贴图资源进行强制加载如果这个贴图从未显示过的话考虑到轮盘的贴图资源比较多6切片的轮盘如果用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#createui" rel="noopenner"> CreateUI </a>的方式创建轮盘,并且这些轮盘贴图从未显示过,那么选择轮盘的时候就会产生闪烁现象,原因就是第一次显示的贴图资源会动态加载,而动态加载是需要一定时间的。如果想彻底解决这类加载问题,详见<a href="../20-玩法开发/18-性能优化/内存优化.html#贴图预加载" rel="noopenner"> 贴图预加载 </a>。
![轮盘控件-9](./picture/IntroduceUI/IntroduceUI-48.gif)

View File

@@ -23,8 +23,8 @@ sidebarDepth: 1
ScreenNode的一些有用的函数界面Node节点的获取方式在[UI使用文档](30-UI说明文档.html)中有详细说明。
```python
import mod.client.extraClientApi as clientApi
uiNode = clientApi.GetUI("myModName", "myUIName")
import mod.client.extraClientApi as clientApi
uiNode = clientApi.GetUI("myModName", "myUIName")
```
假设下文中的函数uiNode为获取到的ScreenNode继承类调用的UI界面是按下面的节点树组织结构的

View File

@@ -116,8 +116,10 @@ CustomUIScreenProxy是原生界面的代理类可通过extraClientApi.GetUISc
- 示例
```python
# coding=utf-8
import client.extraClientApi as clientApi
CustomUIScreenProxy = clientApi.GetUIScreenProxyCls()
ViewBinder = clientApi.GetViewBinderCls()
class PauseScreenProxy(CustomUIScreenProxy):
@@ -135,10 +137,10 @@ class PauseScreenProxy(CustomUIScreenProxy):
@ViewBinder.binding(ViewBinder.BF_ToggleChanged, "#myMod.myToggle")
def onToggleChanged(self, args):
"""
proxy也支持binding这里展示的是绑定一类toggle这类toggle甚至可以不存在这类toggle满足"toggle_name"属性是"#myMod.myToggle"这一要求,当他们发生状态改变的时候就会调用该函数。
"""
print("myToggle onToggleChanged: {}".format(args))
"""
proxy也支持binding这里展示的是绑定一类toggle这类toggle甚至可以不存在这类toggle满足"toggle_name"属性是"#myMod.myToggle"这一要求,当他们发生状态改变的时候就会调用该函数。
"""
print("myToggle onToggleChanged: {}".format(args))
```

View File

@@ -169,13 +169,13 @@ property_bag用于定义绑定变量的默认值假如Python没有返回数
如果直接将 binding_name 与控件需要的属性同名那么“控件需要的属性名”和“Python 函数里声明的绑定变量名”就会一致,进而“一一对应”,不需要任何额外映射。但在实际项目中,我们可能会遇到以下需求或问题:
1. 你的控件属性名是 #abcdefg,但 Python 中的绑定名偏偏叫 #my_python_binding,二者不一样。
2. 界面上不止一个属性值需要使用同一个绑定变量。举例:我们想让“某个整数”既用来显示文本,又控制可见性(具体见视图绑定部分)。
3. 你不想改 Python 里的函数名,也不想改 JSON 里已有的属性名(因为牵涉到其他位置的调用)。
1. 你的控件属性名是 #abcdefg,但 Python 中的绑定名偏偏叫 #my_python_binding,二者不一样。
2. 界面上不止一个属性值需要使用同一个绑定变量。举例:我们想让“某个整数”既用来显示文本,又控制可见性(具体见视图绑定部分)。
3. 你不想改 Python 里的函数名,也不想改 JSON 里已有的属性名(因为牵涉到其他位置的调用)。
这些场景下binding_name_override 就能发挥作用:
• binding_name用来告诉引擎“我要引用 Python 端哪个绑定变量”。
• binding_name用来告诉引擎“我要引用 Python 端哪个绑定变量”。
• binding_name_override用来告诉引擎“我把这个绑定变量的值最终要赋给 UI 的哪个属性”。
假设你原本写了一个 Python 绑定函数,返回一个字符串,名为:
@@ -349,7 +349,7 @@ def ReturnMyStr(self):
## 效果展示
如图所示为季度mod西游大闹天宫中图鉴的效果展示下面我们将一步步拆解通过一个demo复刻来详细介绍如何使用ui数据绑定。这部分是之前的人写的,讲的不是很清楚,看看就好。
如图所示为季度mod西游大闹天宫中图鉴的效果展示下面我们将一步步拆解通过一个demo复刻来详细介绍如何使用ui数据绑定。
![分页](./picture/dataBindingUI/fenye.gif)
@@ -482,6 +482,7 @@ def OnTypeTabChecked(self, args):
self.OnMonsterToggleChecked({ "index": self.mCurMonsterIndex })
```
从JSON中我们可以看到toggle总共有八种状态各种状态的详细效果可以打开游戏设置界面查看左侧的按钮就是toggle。主要有选中、未选中两种基础状态每种状态又有hover和非hover然后还有锁定、未锁定所以总共就有2^3=8种状态组合需要不同的控件展示。由于我们这里比较简单只考虑了选中、未选中以及锁定三种状态所以只实现了对应的三种控制panel其JSON如下
```json
@@ -700,9 +701,9 @@ def OnItemToggleChecked(self, args):
toggleIndex = 0
self.mCurItemIndex = toggleIndex
itemDict = self.mItemData[self.mCurItemTab][toggleIndex]
self.SetSprite(self.mItemIcon, itemDict["icon"])
self.SetText(self.mItemName, itemDict["name"])
self.SetText(self.mItemDesc, itemDict["desc"])
self.GetBaseUIControl(self.mItemIcon).asImage().SetSprite(itemDict["icon"])
self.GetBaseUIControl(self.mItemName).asLabel().SetText(itemDict["name"])
self.GetBaseUIControl(self.mItemDesc).asLabel().SetText(itemDict["desc"])
self.set_control_visible(self.mItemInfoWrap, True)
```

View File

@@ -197,7 +197,7 @@ customTips 设置支持自定义格式:包含四种自带格式:
| explosionResistance | float | 方块爆炸抗性|
| loot | str | loot table控制掉落物(只有定义了"minecraft:loot"组件的方块有数据,其余默认为空字符串"")|
| mapColor | str | 用十六进制颜色定义该方块在地图上显示的颜色(只有定义了"minecraft:map_color"组件的方块以及部分原版方块有数据,其余默认为"#0")|
| unwalkable | bool | 生物是否可在上方行走,默认为false(只有定义了"<a href="../../../mconline/100-历史归档教程/20-玩法地图教程/第07章使用实验玩法增加自定义内容/课程01.接触新自定义方块.html#minecraft-unwalkable">minecraft:unwalkable</a>"组件的方块有数据,其余默认为false)|
| unwalkable | bool | 生物是否可在上方行走,默认为false(只有定义了"<a href="../../../mconline/20-玩法地图教程/第07章使用实验玩法增加自定义内容/课程01.接触新自定义方块.html#minecraft-unwalkable">minecraft:unwalkable</a>"组件的方块有数据,其余默认为false)|
| tier | dict/None | 与挖掘相关的属性,具体见<a href="../../20-玩法开发/15-自定义游戏内容/2-自定义方块/1-JSON组件.html">挖掘属性</a>(只有定义了"netease:tier"组件的方块有数据,其余默认为None)|
| renderLayer | int | 方块渲染时使用的<a href="../../../mcdocs/1-ModAPI/枚举值/RenderLayer.html" rel="noopenner"> 材质 </a>|
| solid | bool | 方块是否为实心方块,影响生物在方块内是否受到窒息伤害|

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
---
@@ -281,7 +281,7 @@ c = Vector3.Dot(a, b) # 1 * 0 + 2 * 3 + 3 * 1 = 9
| 数据类型 | 说明 |
| :------- | :------------- |
| float | 两个向量的积 |
| Vector3 | 两个向量的积 |
- 示例
@@ -296,6 +296,72 @@ c = Vector3.Cross(a, b)
## 成员方法
### x
- 描述
返回该向量的x坐标值。
- 返回值
| 数据类型 | 说明 |
| :------- | :-------------- |
| float | 该向量x的坐标值 |
- 示例
```python
from common.utils.mcmath import Vector3
a = Vector3(3.0, 4.0, 0.0)
print a.x # 打印 3.0
```
### y
- 描述
返回该向量的y坐标值。
- 返回值
| 数据类型 | 说明 |
| :------- | :-------------- |
| float | 该向量y的坐标值 |
- 示例
```python
from common.utils.mcmath import Vector3
a = Vector3(3.0, 4.0, 0.0)
print a.y # 打印 4.0
```
### z
- 描述
返回该向量的z坐标值。
- 返回值
| 数据类型 | 说明 |
| :------- | :-------------- |
| float | 该向量z的坐标值 |
- 示例
```python
from common.utils.mcmath import Vector3
a = Vector3(3.0, 4.0, 0.0)
print a.z # 打印 0.0
```
### Length
- 描述
@@ -551,4 +617,4 @@ print a / 2 # 打印结果(1.5, 2, 0)
- 描述
判断两个向量是否不等当各分量均相等时返回False
判断两个向量是否不等当各分量均相等时返回False

View File

@@ -42,7 +42,7 @@
![](./images/0-2.gif)
我们接下来可以在【关卡编辑器】中将刚刚创建好的Pig预设拖到场景中并放置到刚刚用栅栏圈出的区域里这样它就不会导出乱跑了。
我们接下来可以在【关卡编辑器】中将刚刚创建好的Pig预设拖到场景中并放置到刚刚用栅栏圈出的区域里这样它就不会到处乱跑了。
放置完成后务必记得点击右上角的【保存】按钮,勤保存是一个很好的习惯。

View File

@@ -0,0 +1,130 @@
# 3.4版本物品id变更
## 简介
微软在1.21.00继续修改了部分方块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.4版本变更了名称的物品列表表格内的名称省略了minecraft命名空间。
| 中文名称 | 旧命名 | 旧附加值 | 新命名 |
| :------- | ------ | -------- | ------ |
| 草方块 | grass | 0 | grass_block |
| 橡树树苗 | sapling | 0 | oak_sapling |
| 云杉树苗 | sapling | 1 | spruce_sapling |
| 白桦树苗 | sapling | 2 | birch_sapling |
| 丛林树苗 | sapling | 3 | jungle_sapling |
| 金合欢树苗 | sapling | 4 | acacia_sapling |
| 深色橡树苗 | sapling | 5 | dark_oak_sapling |
| 橡树树叶 | leaves | 0 | oak_leaves |
| 云杉树叶 | leaves | 1 | spruce_leaves |
| 白桦树叶 | leaves | 2 | birch_leaves |
| 丛林树叶 | leaves | 3 | jungle_leaves |
| 金合欢树叶 | leaves2 | 0 | acacia_leaves |
| 深色橡树叶 | leaves2 | 1 | dark_oak_leaves |
| 矮草丛 | 0 | tallgrass | short_grass |
| 蕨 | 2 | tallgrass | fern |
| 虞美人 | 0 | red_flower | poppy |
| 兰花 | 1 | red_flower | blue_orchid |
| 绒球葱 | 2 | red_flower | allium |
| 蓝花美耳草 | 3 | red_flower | azure_bluet |
| 红色郁金香 | 4 | red_flower | red_tulip |
| 橙色郁金香 | 5 | red_flower | orange_tulip |
| 白色郁金香 | 6 | red_flower | white_tulip |
| 粉红色郁金香 | 7 | red_flower | pink_tulip |
| 滨菊 | 8 | red_flower | oxeye_daisy |
| 矢车菊 | 9 | red_flower | cornflower |
| 铃兰 | 10 | red_flower | lily_of_the_valley |
| 平滑石台阶 | 0 | stone_block_slab | smooth_stone_slab |
| 砂岩台阶 | 1 | stone_block_slab | sandstone_slab |
| 石化橡木台阶 | 2 | stone_block_slab | petrified_oak_slab |
| 圆石台阶 | 3 | stone_block_slab | cobblestone_slab |
| 红砖台阶 | 4 | stone_block_slab | brick_slab |
| 石砖台阶 | 5 | stone_block_slab | stone_brick_slab |
| 石英台阶 | 6 | stone_block_slab | quartz_slab |
| 下界砖台阶 | 7 | stone_block_slab | nether_brick_slab |
| 双橡木台阶 | 0 | double_wooden_slab | oak_double_slab |
| 双云杉木台阶 | 1 | double_wooden_slab | spruce_double_slab |
| 双白桦木台阶 | 2 | double_wooden_slab | birch_double_slab |
| 双丛林木台阶 | 3 | double_wooden_slab | jungle_double_slab |
| 双金合欢木台阶 | 4 | double_wooden_slab | acacia_double_slab |
| 双深色橡木台阶 | 5 | double_wooden_slab | dark_oak_double_slab |
| 橡木台阶 | 0 | wooden_slab | oak_slab |
| 云杉木台阶 | 1 | wooden_slab | spruce_slab |
| 白桦木台阶 | 2 | wooden_slab | birch_slab |
| 丛林木台阶 | 3 | wooden_slab | jungle_slab |
| 金合欢木台阶 | 4 | wooden_slab | acacia_slab |
| 深色橡木台阶 | 5 | wooden_slab | dark_oak_slab |
| 向日葵 | 0 | double_plant | sunflower |
| 丁香 | 1 | double_plant | lilac |
| 高草丛 | 2 | double_plant | tall_grass |
| 大型蕨 | 3 | double_plant | large_fern |
| 玫瑰丛 | 4 | double_plant | rose_bush |
| 牡丹 | 5 | double_plant | peony |
| 管珊瑚块 | 0 | coral_block | tube_coral_block |
| 脑纹珊瑚块 | 1 | coral_block | brain_coral_block |
| 气泡珊瑚块 | 2 | coral_block | bubble_coral_block |
| 火珊瑚块 | 3 | coral_block | fire_coral_block |
| 鹿角珊瑚块 | 4 | coral_block | horn_coral_block |
| 失活的管珊瑚块 | 5 | coral_block | dead_tube_coral_block |
| 失活的脑纹珊瑚块 | 6 | coral_block | dead_brain_coral_block |
| 失活的气泡珊瑚块 | 7 | coral_block | dead_bubble_coral_block |
| 失活的火珊瑚块 | 8 | coral_block | dead_fire_coral_block |
| 失活的鹿角珊瑚块 | 9 | coral_block | dead_horn_coral_block |
| 管珊瑚扇 | 0 | coral_fan | tube_coral_fan |
| 脑纹珊瑚扇 | 1 | coral_fan | brain_coral_fan |
| 气泡珊瑚扇 | 2 | coral_fan | bubble_coral_fan |
| 火珊瑚扇 | 3 | coral_fan | fire_coral_fan |
| 鹿角珊瑚扇 | 4 | coral_fan | horn_coral_fan |
| 失活的管珊瑚扇 | 0 | coral_fan_dead | dead_tube_coral_fan |
| 失活的脑纹珊瑚扇 | 1 | coral_fan_dead | dead_brain_coral_fan |
| 失活的气泡珊瑚扇 | 2 | coral_fan_dead | dead_bubble_coral_fan |
| 失活的火珊瑚扇 | 3 | coral_fan_dead | dead_fire_coral_fan |
| 失活的鹿角珊瑚扇 | 4 | coral_fan_dead | dead_horn_coral_fan |
| 橡木 | 0 | wood | oak_wood |
| 云杉木 | 1 | wood | spruce_wood |
| 白桦木 | 2 | wood | birch_wood |
| 丛林木 | 3 | wood | jungle_wood |
| 金合欢木 | 4 | wood | acacia_wood |
| 深色橡木 | 5 | wood | dark_oak_wood |
| 去皮橡木 | 8 | wood | stripped_oak_wood |
| 去皮云杉木 | 9 | wood | stripped_spruce_wood |
| 去皮桦木 | 10 | wood | stripped_birch_wood |
| 去皮丛林木 | 11 | wood | stripped_jungle_wood |
| 去皮金合欢木 | 12 | wood | stripped_acacia_wood |
| 去皮深色橡木 | 13 | wood | stripped_dark_oak_wood |

View File

@@ -10,7 +10,7 @@ time: 分钟
## 示例下载
下载地址:[示例Demo](https://g79.gdl.netease.com/3.3Demo.zip)。
下载地址:[示例Demo](https://g79.gdl.netease.com/3.6Demo.zip)。
@@ -175,7 +175,7 @@ time: 分钟
- 自定义云成就-CloudAchievementMod
展示了[云成就](../../28-成就系统/云成就使用文档.md)的基本用法
展示了[云成就](../../29-成就系统/云成就使用文档.md)的基本用法
- 微软粒子发射骨骼模型-NeteaseModelParticleDemo

View File

@@ -159,10 +159,10 @@ selection: true
> plant_at["minecraft:grass", "minecraft:dirt"]["grass", "dirt"]
```json
"minecraft:seed": {
"minecraft:seed": {
"crop_result": "sweet_berry_bush",
"plant_at": ["grass", "dirt", "podzol"]
},
},
```
### minecraft:stacked\_by\_data

View File

@@ -96,6 +96,7 @@ time: 分钟
| cosmetic_head | 骷髅模型/凋零骷髅模型/模型/僵尸模型/龙的模型/爬行者的模型/雕刻南瓜 |
| compass | 指南针 |
| mushroom_stick | 诡异菌钓竿 |
| brush | 刷子 |
### 2.3 frequency(稀有度)

View File

@@ -69,13 +69,13 @@ Json支持多种软件打开和查看这里我们使用vscode进行查看。
<br/>
## <a href="../../../mconline/100-历史归档教程/20-玩法地图教程/第05章设置NPC的基本状态和交易表/课程03.给NPC添加对应的交易表.html" rel="noopenner"> 自定义交易表 </a>配置对应文件
## <a href="../../../mconline/20-玩法地图教程/第05章设置NPC的基本状态和交易表/课程03.给NPC添加对应的交易表.html" rel="noopenner"> 自定义交易表 </a>配置对应文件
> 行为包json***behavior_pack_xxxxxx/trading/交易表名称.json***
<br/>
## <a href="../../../mconline/100-历史归档教程/10-addon教程/第12章更完善的自定义掉落物/课程01.更完善的自定义掉落物.html" rel="noopenner"> 自定义掉落表 </a>配置对应文件
## <a href="../../../mconline/10-addon教程/第12章更完善的自定义掉落物/课程01.更完善的自定义掉落物.html" rel="noopenner"> 自定义掉落表 </a>配置对应文件
> 行为包json***behavior_pack_xxxxxx/loot_tables/掉落表名称.json***

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
---
@@ -10,36 +10,35 @@ time: 分钟
基岩版自定义方块的json结构曾经过多次调整当填写format_version时需要按照对应版本的json结构编写components。
你可以在以下两个版本进行选择:
例如`minecraft:destroy_time`在1.10.0中为
- 1.16.0
```json
"minecraft:destroy_time": {
"value": 4.0
}
```
该版本的components结构详见[bedrock.dev](https://bedrock.dev/zh/docs/1.16.0.0/1.16.0.66/Blocks)。
而在1.16.0的版本中为
- 1.10.0
该版本的components结构详见[bedrock.dev](https://bedrock.dev/zh/docs/1.12.0.0/1.12.0.28/Blocks)。该版本相比于1.16.0component的值为一个Json Object例如`minecraft:destroy_time`在1.10.0中为
```json
"minecraft:destroy_time": {
"value": 4.0
}
```
而在更高的版本中为
```json
"minecraft:destroy_time": 4.0
```
```json
"minecraft:destroy_time": 4.0
```
而在1.19.20以上的版本中为
```json
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 4.0
}
```
## description
| 键 | 类型 | 默认值 | 解释 |
| ----------------------- | ---- | ------ | ------------------------------------------------------------ |
| identifier | str | | 包括命名空间及物品名。需要全局唯一。<br>建议使用mod名称作为命名空间 |
| category | str | construction | 注册分类,可选的值有:<br>construction注册到建筑<br>equipment注册到装备<br>items注册到物品<br>nature注册到自然<br>commands只有指令和API可获取<br>none只有API可获取<br>以及<a href="../../../20-玩法开发/15-自定义游戏内容/13-自定义物品分页.html#使用" rel="noopenner">自定义分页</a>名称 |
| identifier | str | | 包括命名空间及物品名。需要全局唯一。建议使用mod名称作为命名空间 |
| register_to_create_menu | bool | false | 是否注册到创造栏 |
| category | str | Nature | 注册到创造栏的分类,可选的值有:<br/>Construction<br/>Nature<br/>Equipment<br/>Items |
## components
@@ -47,55 +46,252 @@ time: 分钟
对于原版component你可以在上方的format_version解释中找到更多的参数及解释。
<span id="minecraft_loot"></span>
### minecraft:loot
可用于使用loot table控制掉落物
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_test_ore方块
### minecraft:max\_stack\_size
<span id="minecraft_friction"></span>
### minecraft:friction
可用于设置方块的摩擦力,取值范围为(0.0-0.9)。`注意此摩擦力和原版方块的摩擦力不是同一个摩擦力`
<span id="minecraft_max_stack_size"></span>
### minecraft:max_stack_size
可用于设置方块物品最大堆叠数量,`注意该值不能超过64`
### minecraft:destroy\_time
<span id="minecraft_destroy_time"></span>
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://zh.minecraft.wiki/w/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
### minecraft:destroy_time
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://minecraft-zh.gamepedia.com/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
主要用于[挖掘](./2-功能.md#wajue)的功能
### minecraft:block\_light\_emission
<span id="minecraft_destructible_by_mining"></span>
可用于设置方块亮度。关于亮度及方块光源可参考[官方wiki](https://zh.minecraft.wiki/w/%E4%BA%AE%E5%BA%A6)
### minecraft:destructible_by_mining
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://minecraft-zh.gamepedia.com/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
- 如果设置为 `true`,方块会采用默认的破坏时间。
- 如果设置为 `false`,方块将不可被挖掘破坏。
- 如果省略该组件,则方块同样会使用默认的破坏时间。
- 如果类型为object则是以下参数
| 键 | 类型| 默认值 | 解释|
|------------------|--------|----------------|-------------|
| seconds_to_destroy| 浮点数| `0.0` |设置方块的硬度,实际破坏时间 = 1.5 × seconds_to_destroy。 |
此组件需要在`format_version`大于等于1.19.20的方块行为中代替[minecraft:destroy_time](./1-JSON组件.md###minecraft:destroy_time)使用。
主要用于[挖掘](./2-功能.md#wajue)的功能
<span id="minecraft_block_light_emission"></span>
### minecraft:block_light_emission
可用于设置方块亮度,取值范围为[0, 1]。关于亮度及方块光源可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6)
主要用于[亮度](./2-功能.md#liangdu)的功能
### minecraft:explosion\_resistance
<span id="minecraft_light_emission"></span>
可用于设置爆炸抗性。原版方块的爆炸抗性见[官方wiki](https://zh.minecraft.wiki/w/%E7%88%86%E7%82%B8#.E7.88.86.E7.82.B8.E6.8A.97.E6.80.A7)
### minecraft:light_emission
### minecraft:block\_light\_absorption
可用于设置方块亮度, 取值范围为[0, 15]。此组件需要在`format_version`大于等于1.19.20的方块行为中代替
[minecraft:block_light_emission](./1-JSON组件.md###minecraft:block_light_emission)使用。
关于亮度及方块光源可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6)
可用于设置方块的透光率。具体可参考[官方wiki](https://zh.minecraft.wiki/w/%E4%BA%AE%E5%BA%A6#.E9.98.BB.E7.A2.8D.E5.85.89.E7.85.A7.E7.9A.84.E6.96.B9.E5.9D.97)
主要用于[亮度](./2-功能.md#liangdu)的功能
<span id="minecraft_explosion_resistance"></span>
### minecraft:explosion_resistance
可用于设置爆炸抗性。原版方块的爆炸抗性见[官方wiki](https://minecraft-zh.gamepedia.com/%E7%88%86%E7%82%B8#.E7.88.86.E7.82.B8.E6.8A.97.E6.80.A7)
<span id="minecraft_destructible_by_explosion"></span>
### minecraft:destructible_by_explosion
可用于控制挖掘所需的时间。该值的含义与[官方wiki](https://minecraft-zh.gamepedia.com/%E6%8C%96%E6%8E%98#.E6.96.B9.E5.9D.97.E7.A1.AC.E5.BA.A6)的“硬度”一致
- 如果设置为 `true`,方块会采用默认的爆炸抗性。
- 如果设置为 `false`,方块将不可被爆炸破坏。
- 如果省略该组件,则方块同样会使用默认的爆炸抗性。
- 如果类型为object则是以下参数
| 键 | 类型| 默认值 | 解释|
|------------------|--------|----------------|-------------|
| explosion_resistance| 浮点数| `0.0` |设置方块的爆炸抗性,实际爆炸抗性 = 5 × explosion_resistance。 |
此组件需要在`format_version`大于等于1.19.20的方块行为中代替[minecraft:explosion_resistance](./1-JSON组件.md###minecraft:explosion_resistance)使用。
原版方块的爆炸抗性见[官方wiki](https://minecraft-zh.gamepedia.com/%E7%88%86%E7%82%B8#.E7.88.86.E7.82.B8.E6.8A.97.E6.80.A7)
<span id="minecraft_block_light_absorption"></span>
### minecraft:block_light_absorption
可用于设置方块的透光率。具体可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6#.E9.98.BB.E7.A2.8D.E5.85.89.E7.85.A7.E7.9A.84.E6.96.B9.E5.9D.97)
默认为不透光。
主要用于[亮度](./2-功能.md#liangdu)的功能
### minecraft:map\_color
<span id="minecraft_light_dampening"></span>
### minecraft:light_dampening
可用于设置方块吸光程度, 取值范围为[0, 15]。此组件需要在 `format_version`大于等于1.19.20的方块行为中代替[minecraft:block_light_absorption](./1-JSON组件.md###minecraft:block_light_absorption)使用。
关于亮度及方块光源可参考[官方wiki](https://minecraft-zh.gamepedia.com/%E4%BA%AE%E5%BA%A6)
主要用于[亮度](./2-功能.md#liangdu)的功能
<span id="minecraft_map_color"></span>
### minecraft:map_color
可用于设置方块显示在地图上的颜色
<span id="minecraft_display_name"></span>
### minecraft:display_name
指定语言文件键,用于映射鼠标悬停在物品栏和快捷栏中的方块物品上时显示的文本。如果给定的字符串无法解析为本地字符串,则将显示给定的原始字符串。使用需要方块行为的 `format_version`大于等于1.19.60。
<span id="netease_portal"></span>
### netease:portal
| 键 | 类型 | 默认值 | 解释 |
| -------------------- | ------ | ------ | ------------------------------------------------------------ |
| particle_east_west | string | | 可选对应于粒子json文件中的identifier用于控制方块与Z轴同向时播放的粒子特效 |
| particle_north_south | string | | 可选对应于粒子json文件中的identifier用于控制方块与X轴同向时播放的粒子特效 |
| target_dimension | int | | 必须设置,用于控制进入传送门方块后到达的目标维度 |
- **自定义传送门方块的base_block需要设为portal。**
- 粒子特效应放置于`resource/particles`,粒子特效编写可参考[官方关于粒子组件的说明](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/particlesreference/particlecomponentlist?view=minecraft-bedrock-stable)。
- **目标维度为0或3-20的整数或者大于21的新版自定义维度的数值1下界和2末地会被视作0来处理。**
<span id="netease_mob_spawner"></span>
### netease:mob_spawner
可在netease:mob_spawner组件中设置刷怪的类型目前支持原生生物、微软自定义生物。
| 键 | 类型 | 默认值 | 解释 |
| ---- | ------ | ------ | -------------------------------- |
| 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:entity"中"description"的"identifier"项,可参考[自定义生物文档](../../3-自定义生物/01-自定义基础生物.md)及[CustomBlocksMod](../../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)中的customblocks_test_mobspawner1.json。
- 自定义刷怪箱方块的base_block需要设为mob_spawner。
<span id="netease_water_destory"></span>
### netease:water_destory
可在netease:water_destory组件中设置是否无法摆放在水源和流水方块中如果设置为true会被流水摧毁。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------------- |
| value | bool | | 必须设置,用于设置无法摆放在水源和流水方块中 |
- 可以在方块的loottable中设置被水流摧毁后的掉落物
<span id="netease_water_only"></span>
### netease:water_only
可在netease:water_only组件中设置是否必须放置在水中。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------ |
| value | bool | | 必须设置,用于设置是否必须放在水中。 |
<span id="netease_water_source"></span>
### netease:water_source
可在netease:water_source组件中设置是否在水源方块中表现为含水。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------- |
| value | bool | | 必须设置,是否在水源方块中表现为含水。 |
<span id="netease_water_flow_source"></span>
### netease:water_flow_source
可在netease:water_flow_source组件中设置是否在水源和流水方块中表现为含水。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------------- |
| value | bool | | 必须设置,是否在水源和流水方块中表现为含水。 |
<span id="netease_snow_recover_able"></span>
### netease:snow_recover_able
可在netease:snow_recover_able组件中设置方块是否能含雪。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------- |
| value | bool | | 必须设置,用于设置方块是否能含雪 |
- 目前自定义含雪方块和方块实体不兼容(包括自定义方块实体,自定义刷怪箱等),请不要一起使用。
<span id="netease_can_built_over"></span>
### netease:can_built_over
可在netease:can_built_over组件中设置在放置其他方块时如果该位置已有含netease:can_built_over配置的方块其他方块能否和放置在此方块中。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | | 必须设置用于设置在放置其他方块时如果该位置已有含netease:can_built_over配置的方块其他方块能否和放置在此方块中 |
<span id="netease_tier"></span>
### netease:tier
用于设置与挖掘相关的属性
主要用于[挖掘](./2-功能.md#wajue)的功能
| 键 | 类型 | 默认值 | 解释 |
| :-------------: | :----: | :----: | :----------------------------------------------------------- |
| digger | string | | 必须设置。表示方块使用此工具挖掘时有速度加成。<br>可选的值有:<br> shovel铲<br> pickaxe镐<br> hatchet斧<br> hoe |
| destroy_special | bool | false | 可选。<br>当设置为true时表示只有使用digger设置的工具进行挖掘才会产生掉落物。 |
| level | int | 0 | 可选。<br>当destroy_special为true时才会生效。表示挖掘所需的工具等级若手持工具等级小于该值则不会产生掉落物。<br>原版工具的等级:<br> 空手/其他非工具物品0<br> 木制/金制工具0<br> 石制工具1<br> 铁制工具2<br> 钻石工具3 |
| 键 | 类型 | 默认值 | 解释 |
| :-------------: | :----: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| digger | string | | 必须设置。表示方块使用此工具挖掘时有速度加成。<br/>可选的值有: <br/>shovel铲 <br/>pickaxe镐 <br/>hatchet斧 <br/>hoe |
| destroy_special | bool | false | 可选。当设置为true时表示只有使用digger设置的工具进行挖掘才会产生掉落物。 |
| level | int | 0 | 可选。当destroy_special为true时才会生效。表示挖掘所需的工具等级若手持工具等级小于该值则不会产生掉落物。<br/>原版工具的等级: <br/>空手/其他非工具物品0<br/>木制/金制工具0<br/>石制工具1 <br/>铁制工具2 <br/>钻石工具3 |
<span id="netease_aabb"></span>
### netease:aabb
@@ -109,27 +305,29 @@ time: 分钟
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks_model_flower及customblocks_model_wire方块。
| 键 | 类型 | 默认值 | 解释 |
| --------- | ------------- | ------ | ------------------------------------------------------------ |
| collision | object或array | | 计算与物体碰撞时用的碰撞盒 |
| clip | object或array | | 计算射线检测时用的碰撞盒。如准心选取及弹射物碰撞。<br>那么当该AABB没有体积时准心与弹射物都会无视这个方块 |
| 键 | 类型 | 默认值 | 解释 |
| --------- | ------------- | ------ | -------------------------------------------------------------------------------------------------------------- |
| collision | object或array | | 计算与物体碰撞时用的碰撞盒 |
| clip | object或array | | 计算射线检测时用的碰撞盒。如准心选取及弹射物碰撞。那么当该AABB没有体积时准心与弹射物都会无视这个方块 |
当collision或clip为object时用于表示恒定大小的单一碰撞盒结构为
| 键 | 类型 | 默认值 | 解释 |
| ---- | ------------ | --------- | ---------------------------------- |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
| 键 | 类型 | 默认值 | 解释 |
| --- | ------------ | --------- | ---------------------------------- |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
当collision或clip为array时用于可变化的多个碰撞盒的组合通常用于可变化的自定义方块模型。元素的结构为
| | 类型 | 默认值 | 解释 |
| ------ | ------------ | --------- | ------------------------------------------------------------ |
| enable | molang | true | 控制是否开启该碰撞箱<br/>目前仅支持is_connect查询详见[netease:connection](#netease_connection) |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
| | 类型 | 默认值 | 解释 |
| ------ | ------------ | --------- | ------------------------------------------------------------------------------------------------ |
| enable | molang | true | 控制是否开启该碰撞箱目前仅支持is_connect查询详见[netease:connection](#netease_connection) |
| min | array(float) | [0, 0, 0] | min的三个值必须小于等于max的三个值 |
| max | array(float) | [1, 1, 1] | |
### netease:face\_directional
<span id="netease_face_directional"></span>
### netease:face_directional
用于设置方块的多面向
@@ -137,21 +335,21 @@ time: 分钟
| 键 | 类型 | 默认值 | 解释 |
| ---- | ------ | ------ | ----------------------------------------------------- |
| type | string | | direction四面向方块<br>facing_direction六面向方块 |
| type | string | | direction四面向方块facing_direction六面向方块 |
需要注意使用netease:face_directional组件的六面向方块的放置出来的贴图朝向和手持时的贴图朝向不同。
可以通过修改blocks.json中的carried_textures属性重新定义手持方块贴图的朝向来解决该问题。
<span id="netease:fuel "></span>
### netease:fuel
设置方块的燃料属性,允许该方块作为燃料在熔炉中燃烧
可燃类物品组件。允许该方块物品作为燃料在熔炉中燃烧
| 键 | 类型 | 默认值 | 解释 |
| -------- | ----- | ------ | -------------------------------- |
| duration | float | 0.0 | 该方块可提供的熔炉燃烧时长(秒) |
| 键 | 类型 | 默认值 | 解释 |
| -------- | ----- | ------ | ----------------------------------------- |
| duration | float | 0 | 可填, 该物品可提供的熔炉燃烧时长(秒) |
### netease:render\_layer
<span id="netease_render_layer"></span>
### netease:render_layer
用于设置方块渲染时使用的材质
@@ -159,7 +357,9 @@ time: 分钟
| 键 | 类型 | 默认值 | 解释 |
| ----- | ------ | ------ | ------------------------------------------------------------ |
| value | string | | 目前支持的材质有:<br>opaque不透明即“terrain_opaque”材质。默认为此项<br>alpha全透明即“terrain_alpha”材质如火焰该材质用于异形方块用在方块类上但与其他方块重合时会出现闪烁可以使用no_crop_face_block组件避免闪烁。<br>blend半透明即“terrain_blend”材质如彩色玻璃。<br>optionalAlpha局部透明与alpha不同alpha超过一定距离将不渲染而optionalAlpha不会能配合no_crop_face_block组件实现原版叶子效果。 |
| value | string | | 目前支持的材质有:<br>opaque不透明即“terrain_opaque”材质。默认为此项<br/>alpha全透明即“terrain_alpha”材质如火焰该材质用于异形方块用在方块类上但与其他方块重合时会出现闪烁可以使用no_crop_face_block组件避免闪烁。<br/>blend半透明即“terrain_blend”材质如彩色玻璃。<br/>optionalAlpha局部透明与alpha不同alpha超过一定距离将不渲染而optionalAlpha不会能配合no_crop_face_block组件实现原版叶子效果。 |
<span id="netease_solid"></span>
### netease:solid
@@ -169,9 +369,11 @@ time: 分钟
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_model_flower方块。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | true | 为true时生物在方块内会受到窒息伤害<br>为false时生物在方块内不会受到窒息伤害 |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------------------------- |
| value | bool | true | 为true时生物在方块内会受到窒息伤害为false时生物在方块内不会受到窒息伤害 |
<span id="netease_pathable"></span>
### netease:pathable
@@ -179,58 +381,66 @@ time: 分钟
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_model_flower方块。
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | false | 为true时寻路时被当作空气<br>为false时寻路时被当作障碍物并且可在其上方行走 |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------------------------- |
| value | bool | false | 为true时寻路时被当作空气为false时寻路时被当作障碍物并且可在其上方行走 |
### netease:block\_entity
<span id="netease_block_entity"></span>
### netease:block_entity
用于给自定义方块添加[自定义方块实体](./4-自定义方块实体.md)。
可参考[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)的customblocks:customblocks_test_block_entity方块。
| 键 | 类型 | 默认值 | 解释 |
| ------- | ---- | ------ | ------------------------------------------------------------ |
| tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ServerBlockEntityTickEvent事件<br>为false时该方块不会发送ServerBlockEntityTickEvent事件 |
| client_tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ModBlockEntityTickClientEvent事件<br>为false时该方块不会发送ModBlockEntityTickClientEvent事件 |
| movable | bool | true | 为true时该方块可被粘性活塞拉回<br>为false时该方块不可被粘性活塞拉回 |
| 键 | 类型 | 默认值 | 解释 |
| ----------- | ---- | ------ | ------------------------------------------------------------ |
| tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ServerBlockEntityTickEvent事件<br/>为false时该方块不会发送ServerBlockEntityTickEvent事件 |
| client_tick | bool | false | 为true时当玩家进入方块tick范围时该方块每秒会发送**20次**ModBlockEntityTickClientEvent事件<br/>为false时该方块不会发送ModBlockEntityTickClientEvent事件 |
| movable | bool | true | 为true时该方块可被粘性活塞拉回为false时该方块不可被粘性活塞拉回 |
### netease:random\_tick
<span id="netease_random_tick"></span>
### netease:random_tick
用于给自定义方块定义是否可以随机tick并且设置该tick事件是否发送到脚本层。
| 键 | 类型 | 默认值 | 解释 |
| -------------- | ---- | ------ | ------------------------------------------------------------ |
| enable | bool | false | 方块是否随机tick |
| tick_to_script | bool | false | 是否发送事件<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockrandomtickserverevent" rel="noopenner"> BlockRandomTickServerEvent </a>到python脚本 |
| 键 | 类型 | 默认值 | 解释 |
| -------------- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| enable | bool | false | 方块是否随机tick |
| tick_to_script | bool | false | 是否发送事件 BlockRandomTickServerEvent 到python脚本 |
### netease:block\_animate\_random\_tick
### netease:block_animate_random_tick
频率更高的方块tick用于实现类似樱花树叶的方块特效。给自定义方块配置该组件后开发者可以在**客户端**监听<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockanimaterandomtickevent" rel="noopenner"> BlockAnimateRandomTickEvent </a>事件给方块附加逻辑。
| 键 | 类型 | 默认值 | 解释 |
| ------------ | ----- | ------ | ------ |
| trigger_rate | float | 0.1 | 触发率 |
| send_event | bool | true | 触发BlockAnimateRandomTickEvent事件 |
该组件采用了和原版樱花树叶/末地烛相同的逻辑支持无需方块实体即可tick且性能开销低。不建议在事件里将数据传给服务端因为每个玩家客户端tick到的方块都是随机的可能相同也可能不同,除非你知道自己在做什么
该组件采用了和原版樱花树叶/末地烛相同的逻辑支持无需方块实体即可tick且性能开销低。不建议在事件里将数据传给服务端因为每个玩家客户端tick到的方块都是随机的可能相同也可能不同。
**方块离玩家越近,触发频率越大**当方块距离玩家16个方块以内时如果设置trigger_rate为1几乎每秒都能触发原版樱花树叶的触发率为0.1约等于总是10%的概率触发落叶。随着方块离玩家越远触发几率也会递减。最大触发距离为32-40格32是玩家静止不动时的值玩家移动时最多可能有8个方块距离的偏移。
**设备性能越好,触发频率越大**游戏引擎会记录帧耗时超时的tick不会触发Python事件避免大量方块同时tick导致卡顿。
### netease:redstone\_property
### netease:redstone_property
用于给自定义方块设置红石属性
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ----------------------------------------------------------------------------------------------- |
| value | str | None | 目前只支持break_on_push设置之后方块可以被活塞破坏变成掉落物否则方块会被活塞推动而不破坏 |
### netease:neighborchanged\_sendto\_script
### netease:neighborchanged_sendto_script
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | ------------------------------------------------------------ |
| value | bool | false | 方块周围环境变化是否发送事件<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockneighborchangedserverevent#blockneighborchangedserverevent" rel="noopenner"> BlockNeighborChangedServerEvent </a>到脚本层 |
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| value | bool | false | 方块周围环境变化是否发送事件 BlockNeighborChangedServerEvent 到脚本层 |
<span id="netease_connection"></span>
### netease:connection
@@ -250,7 +460,9 @@ time: 分钟
| 名称 | 解释 |
| ---------------- | ------------------------------------------------------------ |
| query.is_connect | 传入一个参数返回该方块与对应临面上的方块是否有connection属性<br/>参数取值与对应的面:<br>0-down面1-up面2-north面3-south面4-west面5-east面。 |
| query.is_connect | 传入一个参数返回该方块与对应临面上的方块是否有connection属性参数取值与对应的面<br/>0-down面<br/>1-up面<br/>2-north面<br/>3-south面<br/>4-west面<br/>5-east面。 |
<span id="netease_redstone"></span>
### netease:redstone
@@ -265,7 +477,9 @@ time: 分钟
| type | str | | 红石类型:<br/>producer红石源<br/>consumer红石机械元件 |
| strength | int | 15 | 红石信号值,范围[0,15] |
### netease:listen\_block\_remove
<span id="listen_block_remove"></span>
### netease:listen_block_remove
用于配置自定义方块是否监听方块的<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockremoveserverevent" rel="noopenner"> BlockRemoveServerEvent </a>事件
@@ -273,7 +487,9 @@ time: 分钟
| ----- | ---- | ------ | ------------ |
| value | bool | false | 是否监听事件 |
### netease:may\_place\_on
<span id="netease_may_place_on"></span>
### netease:may_place_on
用于配置自定义方块可存在于哪些方块的上面。
@@ -281,13 +497,15 @@ time: 分钟
可参考CustomBlocksMod示例中的customblocks_model_flower
| 键 | 类型 | 默认值 | 说明 |
| --------------- | ------------ | ------ | ------------------------------------------------------------ |
| block | list(str) | | 方块identifier的列表。这些方块的所有[方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)都可放置 |
| block_state | list(object) | | [方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)的列表。<br>每个元素只对应一个特定的方块状态,如果方块有多个种类的状态,需要考虑排列组合的所有情况<br>最终可在上面放置的方块是block字段与block_state字段的并集 |
| spawn_resources | bool | true | 已存在的方块因下方的方块发生改变而被破坏时,是否生成掉落物 |
| 键 | 类型 | 默认值 | 说明 |
| --------------- | ------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| block | list(str) | | 方块identifier的列表。这些方块的所有[方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)都可放置 |
| block_state | list(object) | | [方块状态](../../10-基本概念/1-我的世界基础概念.md#方块状态)的列表。每个元素只对应一个特定的方块状态如果方块有多个种类的状态需要考虑排列组合的所有情况最终可在上面放置的方块是block字段与block_state字段的并集 |
| spawn_resources | bool | true | 已存在的方块因下方的方块发生改变而被破坏时,是否生成掉落物 |
### netease:fire\_resistant
<span id="netease_fire_resistant"></span>
### netease:fire_resistant
用于配置自定义方块是否防火。
@@ -299,7 +517,7 @@ time: 分钟
| ----- | ---- | ------ | -------- |
| value | bool | | 是否防火 |
### netease:block\_properties
### netease:block_properties
用于配置自定义方块的方块属性
@@ -307,35 +525,35 @@ time: 分钟
可参考CustomBlocksMod示例中的customblocks_slime、customblocks_flower_extend
| 键 | 类型 | 默认值 | 说明 |
| ----- | ---- | ------ | -------- |
| 键 | 类型 | 默认值 | 说明 |
| ---------- | ----- | ------ | -------------- |
| properties | array | | 所有属性字符串 |
其中properties数组目前支持以下字符串填充
| 键 | 说明 |
| ----- |-------- |
| piston_block_grabber | 被活塞推动时是否带动旁边方块 |
| slime | 主要用于变为移动方块(例如被活塞推)时修改对实体力的计算 |
|breaks_when_fallen_on_by_heavy| 当重力方块结束下落在该方块位置后,自身是否被毁坏|
| 键 | 说明 |
| ------------------------------ | -------------------------------------------------------- |
| piston_block_grabber | 被活塞推动时是否带动旁边方块 |
| slime | 主要用于变为移动方块(例如被活塞推)时修改对实体力的计算 |
| breaks_when_fallen_on_by_heavy | 当重力方块结束下落在该方块位置后,自身是否被毁坏 |
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_stand\_on
### netease:on_stand_on
用于触发实体站在方块上的事件
可参考CustomBlocksMod示例中的customblocks_slime利用了该事件组合做出了个模拟原版粘液块的效果。
| 键 | 类型 | 默认值 | 说明 |
| ----- | ---- | ------ | -------- |
| 键 | 类型 | 默认值 | 说明 |
| ----------------- | ---- | ------ | -------------------- |
| send_python_event | bool | | 是否发送事件至python |
当send_python_event为true时该方块会触发OnStandOnBlockClientEvent、OnStandOnBlockServerEvent事件。
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_before\_fall\_on
### netease:on_before_fall_on
用于触发实体刚下落至方块的事件,主要用于伤害计算
@@ -343,7 +561,7 @@ time: 分钟
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_after\_fall\_on
### netease:on_after_fall_on
用于触发实体下落至方块后的事件,主要用于力的计算
@@ -351,25 +569,27 @@ time: 分钟
如果方块碰撞盒体积使用netease:aabb或minecraft:entity_collision改小可能会导致无法触发目前可参考范围是边长0.4以下不会触发)。
### netease:on\_entity\_inside
### netease:on_entity_inside
用于触发实体碰撞盒所在位置有方块时的事件(判断位置逻辑有无方块,与方块碰撞盒大小无关)。
当send_python_event为true时该方块会触发OnEntityInsideBlockClientEvent、OnEntityInsideBlockServerEvent事件。
### netease:on\_step\_on
### netease:on_step_on
用于触发实体刚移动至一个实心方块上的事件
可参考CustomBlocksMod示例中的customblocks_slime在触发该事件时进行了日志打印
### netease:on\_step\_off
### netease:on_step_off
用于触发实体刚离开一个实心方块上的事件
可参考CustomBlocksMod示例中的customblocks_slime在触发该事件时进行了日志打印
### netease:block\_random\_offset
<span id="netease_offset"></span>
### netease:block_random_offset
用于设置方块的偏移,能实现原版花朵的偏移效果。
@@ -377,12 +597,14 @@ time: 分钟
该组件会把方块的材质设置为透明且不可与netease:render_layer的不透明材质一起共用否则会出现渲染错误
| 键 | 类型 | 默认值 | 解释 |
| ------- | ------------- | ------ | ------------------------------------------------------------ |
| 键 | 类型 | 默认值 | 解释 |
| ------- | ------------- | ------ | ------------------------------------------------------------------------------ |
| x_scope | [float,float] | [0,0] | x轴方向的偏移范围size为2的array取值范围为0.0~1.0,如果两个值相同则为指定点 |
| z_scope | [float,float] | [0,0] | z轴方向的偏移范围size为2的array取值范围为0.0~1.0,如果两个值相同则为指定点 |
### netease:block\_chest
<span id="block_chest"></span>
### netease:block_chest
用于给方块添加箱子功能使用了该组件会创建一个block_entity方块会与其他block_entity逻辑有冲突请谨慎使用。
@@ -392,16 +614,29 @@ time: 分钟
使用SetBlockNew接口创建自定义箱子的时候需要先调用一次SetBlockNew将目标位置方块设置为Air再使用AddTimer延后调用SetBlockNew创建自定义箱子
| 键 | 类型 | 默认值 | 解释 |
| ------------------ | ---- | ------ | ------------------------------------------------------------ |
| custom_description | str | | 箱子UI上面显示的箱子名称不填为空 |
| chest_capacity | int | | 必填箱子的容量行数取值范围1-8如果can_pair取值为true且该值大于4将自动变为4 |
| can_pair | bool | false | 是否可以与隔壁箱子组合,合成一个大箱子 |
| 键 | 类型 | 默认值 | 解释 |
| ------------------ | ---- | ------ | ------------------------------------------------------------------------------------------ |
| custom_description | str | | 箱子UI上面显示的箱子名称不填为空 |
| chest_capacity | int | | 必填箱子的容量行数取值范围1-8如果can_pair取值为true且该值大于4将自动变为4 |
| can_pair | bool | false | 是否可以与隔壁箱子组合,合成一个大箱子 |
| is_shulker_box | bool | false | 是否为潜影盒箱子,如果开启摧毁方块将不会掉落,与原版潜影盒功能相同,无法与隔壁箱子进行组合 |
| mute | bool | true | 是否关闭箱子开启与关闭时的音效 |
| can_be_blocked | bool | false | 是否能被阻挡,即箱子上面有阻挡的方块时能否打开箱子 |
| mute | bool | true | 是否关闭箱子开启与关闭时的音效 |
| can_be_blocked | bool | false | 是否能被阻挡,即箱子上面有阻挡的方块时能否打开箱子 |
<span id="block_container"></span>
### netease:no\_crop\_face\_block
### netease:block_container
[自定义容器](./3-特殊方块/11-自定义容器.md)组件使用时需要将base_block设为netease_container。相比[netease:block_chest](#netease-block-chest)该组件支持使用资源包UI Json配置方块打开后的UI界面方便开发者制作自定义熔炉等界面而无需考虑复杂的交互逻辑数据同步逻辑等。
| 键 | 类型 | 默认值 | 解释 |
| ------------------ | ---- | ----- | ------------------------------------------ |
| custom_description | str | | 容器ui打开时的title复用原版ui时生效 |
| screen_name | str | | 交互方块时打开的ui形如namespace.screenName |
| container_size | int | | 方块容器能够存放的物品槽位数量取值范围1-108需与ui槽位匹配。若ui槽位大于配置容量超过配置的部分无法放入物品若ui槽位小于配置容量按shift可放入但无法在ui中显示 |
<span id="no_crop_face_block"></span>
### netease:no_crop_face_block
该组件能实现当两个方块相邻时相邻面渲染其中一个方块的一面与原版2个叶子方块相邻效果一致不会把相邻面都裁剪掉
@@ -417,10 +652,12 @@ time: 分钟
}
```
### netease:custom\_tips
<span id="custom_tips"></span>
### netease:custom_tips
该组件用于自定义方块Item的物品信息描述与自定义物品中的 netease:customtips 作用相同
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | -------- | -------------- |
| value | str | 物品名称 | 物品的描述信息 |
| value | str | 物品名称 | 物品的描述信息 |

View File

@@ -0,0 +1,334 @@
---
hard: 入门
time: 分钟
---
# 自定义容器
## 概述
该功能类似自定义箱子使用原生c++驱动背包界面,实现自定义容器界面的方块。
包含长按分堆、双击合堆、右键拖放等功能方块破坏后内部物品会掉落方便开发者制作自定义熔炉等界面而无需考虑复杂的UI逻辑数据同步逻辑等。
## base_block新增netease_container
base_block指定现在可以指定为netease_container
## netease:block_container
| 键 | 类型 | 默认值 | 解释 |
| ----- | ---- | -------- | -------------- |
| custom_description | str | 容器名 | 容器ui打开时的title复用原版ui时生效|
| screen_name | str | ui名 | 交互方块时打开的ui形如namespace.screenName |
| container_size | int | 容器容量 | 方块容器能够存放的物品槽位数量取值范围1-108需与ui槽位匹配。若ui槽位大于配置容量超过配置的部分无法放入物品若ui槽位小于配置容量按shift可放入但无法在ui中显示
| hopper | str | {} | 配置支持漏斗漏入漏出详细请见下面hopper字段说明 |
## hopper字段说明
- hopper漏斗字段无此字段或字段为空时无用dict
- input是否支持漏入True为使用input_solt字段中漏入规则False为不支持漏入input_solt不会起作用。缺省代表支持全部漏入input_slot不会起作用
- input_slot支持漏入字段list当input字段存在且为True时漏入规则才会生效无此字段、字段为空、input字段不存在时代表所有朝向支持漏入
- face支持漏入的面int
- slot支持漏入netease_container的槽位如[1,10]代表1和10槽位支持漏入其余槽位不支持漏入无此字段和字段为空时代表所有槽位支持漏入 list
- output为true时代表支持自定义容器底部漏出功能bool无此字段代表支持底部漏出
## hopper字段举例
```json
"hopper": {
"input": true,
"input_slot": [
{
"face": 1,
"slot": [1,10]
}
],
"output": true
}
```
### 注意事项
- netease_container的size限定为1-108不在该范围会导致注册失败需在组件中配置
- netease_ui_container的size为108ui中如果指定了大于108的slot将无法放入物品无需配置
## 自定义容器事件
1. PlayerTryPutCustomContainerItemServerEvent事件玩家尝试改变自定义容器物品时触发该事件开发者可以监听该事件实现其他逻辑
## 示例
自定义容器方块配置:
```json
{
"format_version": "1.16.100",
"minecraft:block": {
"components": {
"netease:block_container": {
"custom_description": "自定义方块容器",
"screen_name": "netease_container.netease_custom_container_screen", // 交互该方块时打开的ui
"container_size": 27 // 关闭后保存在方块中的容器size对应ui中的netease_container扩展写法
}
},
"description": {
"base_block": "netease_container",
"category": "construction",
"identifier": "test:my_custom_container"
}
}
}
```
ui配置
> 此处以原版箱子的json为基础进行修改
注意:
- collection_name指定为netease_container
- ui的grid空格数量如果大于组件中设置的size那超出的那一部分无法放置物品
```json
{
"namespace": "netease_container",
"test_collection": {
"type": "stack_panel",
"size": [ "100%", "100%c" ],
"controls": [
{
"row_1": {
"type": "stack_panel",
"orientation": "horizontal",
"size": [ "100%", "100%cm" ],
"collection_name": "netease_container",
"controls": [
{
"a@netease_container.custom_grid_item": {
"collection_index": 27
}
},
{
"padding": {
"type": "panel",
"size": [ 4, 0 ]
}
},
{
"b@netease_container.custom_grid_item": {
"collection_index": 28
}
}
]
}
},
{
"padding_1": {
"type": "panel",
"size": [ "100%", 4 ]
}
},
{
"row_2": {
"type": "stack_panel",
"orientation": "horizontal",
"size": [ "100%", "100%cm" ],
"collection_name": "netease_container",
"controls": [
{
"c@netease_container.custom_grid_item": {
"collection_index": 29
}
},
{
"padding": {
"type": "panel",
"size": [ 4, 0 ]
}
},
{
"d@netease_container.custom_grid_item": {
"collection_index": 30
}
}
]
}
},
{
"padding_2": {
"type": "panel",
"size": [ "100%", 4 ]
}
}
]
},
"custom_grid_item@common.container_item": {
"$item_collection_name": "netease_container"
},
"custom_drop_grid_item@common.container_item": {
"$item_collection_name": "netease_ui_container"
},
"netease_custom_container_grid": {
"type": "grid",
"size": [ 162, "100.0%c" ],
"anchor_from": "top_left",
"anchor_to": "top_left",
"grid_dimensions": [ 9, 3 ],
"grid_item_template": "netease_container.custom_grid_item",
"collection_name": "netease_container",
"maximum_grid_items": 27
},
"netease_drop_container_grid": {
"type": "grid",
"size": [ 162, "100.0%c" ],
"anchor_from": "top_left",
"anchor_to": "top_left",
"grid_dimensions": [ 9, 2 ],
"grid_item_template": "netease_container.custom_drop_grid_item",
"collection_name": "netease_ui_container",
"maximum_grid_items": 18
},
"container_label": {
"type": "label",
"offset": [ 7, -1 ],
"anchor_from": "top_left",
"anchor_to": "top_left",
"text": "$container_title",
"size": [ "90%", "default" ],
"color": "$title_text_color",
"layer": 2
},
"selected_item_details@common.selected_item_details": {
"offset": [ 0, 0 ]
},
"netease_custom_container_panel_top_half": {
"type": "panel",
"size": [ "100%", "100.0%c" ],
"offset": [ 0, 11 ],
"anchor_to": "top_left",
"anchor_from": "top_left",
"controls": [
{
"container_label@netease_container.container_label": {}
},
{
"netease_custom_container_grid1@netease_container.netease_custom_container_grid": {
"offset": [ 7, 10 ]
}
},
{
"netease_custom_container_grid2@netease_container.netease_drop_container_grid": {
"offset": [ 7, 70 ]
}
}
]
},
"netease_custom_container_panel": {
"type": "panel",
"controls": [
{
"container_gamepad_helpers@common.container_gamepad_helpers": {}
},
{
"flying_item_renderer@common.flying_item_renderer": {
"layer": 11
}
},
{
"selected_item_details_factory@common.selected_item_details_factory": {
"control_name": "@netease_container.selected_item_details"
}
},
{
"item_lock_notification_factory@common.item_lock_notification_factory": {
"control_name": "@common.item_lock_notification"
}
},
{
"root_panel@common.root_panel": {
"size": [ 176, 220 ],
"layer": 1,
"controls": [
{
"common_panel@common.common_panel": {
"size": [ "100%", "100.0%c" ],
"$dialog_background|default": "common.dialog_background_opaque",
"controls": [
{
"bg_image@$dialog_background": {
"size": [ "100%", "100.0%c+-37.0px" ],
"layer": 1,
"controls": [
{
"chest_panel": {
"type": "panel",
"layer": 5,
"size": [ "100%", "100.0%c+-7.0px" ],
"controls": [
{
"netease_custom_container_panel_top_half@netease_container.netease_custom_container_panel_top_half": {}
},
{
"inventory_panel_bottom_half_with_label@common.inventory_panel_bottom_half_with_label": {}
},
{
"hotbar_grid@common.hotbar_grid_template": {}
}
]
}
},
{
"inventory_selected_icon_button@common.inventory_selected_icon_button": {}
},
{
"gamepad_cursor@common.gamepad_cursor_button": {}
},
{
"close@common.close_button": {
"layer": "$close_button_layer",
"offset": "$close_button_offset",
"ignored": "$use_compact_close_button"
}
},
{
"compact_close@common.compact_close_button": {
"layer": "$close_button_layer",
"offset": "$close_button_offset",
"ignored": "(not $use_compact_close_button)"
}
}
],
"bindings": [
{
"binding_name": "$close_button_visible_binding_name",
"binding_name_override": "#visible"
}
]
}
}
]
}
}
]
}
}
]
},
"netease_custom_container_screen@common.inventory_screen_common": {
"$close_on_player_hurt|default": true,
"close_on_player_hurt": "$close_on_player_hurt",
"variables": [
{
"requires": "$desktop_screen",
"$screen_content": "netease_container.netease_custom_container_panel",
"$screen_bg_content": "common.screen_background",
"$screen_background_alpha": 0.4
},
{
"requires": "$pocket_screen",
"$screen_content": "netease_container_pocket.netease_custom_container_panel"
}
]
}
}
```

View File

@@ -500,23 +500,23 @@ resource_pack/models/entity/squirrel.geo.json
```json
"render_controllers": [
{ "controller.render.player.first_person": "variable.is_first_person" },
{ "controller.render.player.third_person": "!variable.is_first_person && !variable.map_face_icon" },
{ "controller.render.player.map": "variable.map_face_icon" },
{ "controller.render.player.first_person_bloom": "variable.is_first_person" },
{ "controller.render.player.third_person_bloom": "!variable.is_first_person && !variable.map_face_icon" }
{"controller.render.player.first_person_spectator": "variable.is_first_person && query.is_spectator"},
{"controller.render.player.third_person_spectator": "!variable.is_first_person && !variable.map_face_icon && query.is_spectator"},
{"controller.render.player.first_person": "variable.is_first_person && !query.is_spectator"},
{"controller.render.player.third_person": "!variable.is_first_person && !variable.map_face_icon && !query.is_spectator"},
{"controller.render.player.map": "variable.map_face_icon"}
],
```
在render_controllers数组中玩家存在五个渲染控制器。
| 渲染控制器名称 | 渲染控制器应用条件 | 说明 |
| ------------------------------------------- | ---------------------------------------------------- | -------------------------------- |
| controller.render.player.first_person | variable.is_first_person | 第一人称该渲染控制器生效 |
| controller.render.player.third_person | !variable.is_first_person && !variable.map_face_icon | 非第一人称下同时非地图图标下生效 |
| controller.render.player.map | variable.map_face_icon | 地图图标模式下生效 |
| controller.render.player.first_person_bloom | variable.is_first_person | 第一人称时该渲染控制器生效 |
| controller.render.player.third_person_bloom | !variable.is_first_person && !variable.map_face_icon | 非第一人称下同时非地图图标下生效 |
| ------------------------------------------- | ---------------------------------------------------- | -------------------------------- |
| controller.render.player.first_person_spectator | variable.is_first_person && query.is_spectator | 第一人称且旁观者模式下该渲染控制器生效 |
| controller.render.player.third_person_spectator | !variable.is_first_person && !variable.map_face_icon && query.is_spectator | 非第一人称非地图图标、旁观者模式下生效 |
| controller.render.player.first_person | variable.is_first_person && !query.is_spectator | 第一人称且非旁观者模式下生效 |
| controller.render.player.third_person | !variable.is_first_person && !variable.map_face_icon && !query.is_spectator | 第一人称、非地图图标、非旁观者模式下生效 |
| controller.render.player.map | variable.map_face_icon | 地图图标下生效 |
**其中,以上五个渲染控制器在渲染过程中并不保证顺序。**

View File

@@ -49,10 +49,20 @@ components中可以配置的组件如下
| netease:generator_noise | 空object | | 噪声生成器,用于生成随机凹凸的地面<br>如果没有配置任何生成器,则默认使用该生成器<br>(对三个原生维度无效) |
| netease:generator_flat | 空object | | 超平坦生成器,仅主世界和下界类型可用<br>(对三个原生维度无效) |
| netease:generator_legacy | 空object | | 旧世界/经典(有限地图)生成器,仅主世界类型可用<br>(对三个原生维度无效) |
| netease:ban_vanilla_feature | 空object | | 清除原版feature可解决类似空岛玩法天空悬浮结构问题仅主世界类型维度可用) |
| netease:ban_vanilla_feature | 空object | | 清除原版feature可解决类似空岛玩法天空悬浮结构问题任何维度可用) |
| netease:spawn_biomes | array(string) | 该维度下的forest, forest_hills, plains, taiga, taiga_hills, jungle, jungle_hills | 该维度下可供玩家出生的群系名称的列表<br>请确保列表的群系会生成在该维度 |
| [netease:biome_source](./2-群系地貌.md#8-4.群系源节点类型) | array(dict) | | 该维度下的群系源,仅主世界类型可用<br>(对三个原生维度无效) |
| netease:ban_vanilla_structure | object | 屏蔽所有原版结构 | 选择性屏蔽原版结构,示例见下方,支持主世界、下界、末地维度类型 |
| netease:ban_vanilla_mineshaft | 空object | | 屏蔽废弃矿井 |
| netease:ban_vanilla_monument | 空object | | 屏蔽海底遗迹 |
| netease:ban_vanilla_mansion | 空object | | 屏蔽林地府邸 |
| netease:ban_vanilla_temple | 空object | | 屏蔽神庙 |
| netease:ban_vanilla_pillageroutpost | 空object | | 屏蔽掠夺者前哨 |
| netease:ban_vanilla_ruinedportal | 空object | | 屏蔽破坏的传送门(仅主世界类型维度可用) |
| netease:ban_vanilla_ruins | 空object | | 屏蔽水下遗迹 |
| netease:ban_vanilla_shipwreck | 空object | | 屏蔽沉船 |
| netease:ban_vanilla_stronghold | 空object | | 屏蔽要塞 |
| netease:ban_vanilla_village | 空object | | 屏蔽村庄 |
使用白名单,只允许生成沉船和要塞,其他所有原版结构都不生成,结构名称和[`/locate`](https://learn.microsoft.com/en-us/minecraft/creator/commands/commands/locate?view=minecraft-bedrock-stable#structurefeature)指令中的相同。
@@ -62,6 +72,29 @@ components中可以配置的组件如下
}
```
allowlist里面填写的是原版结构类型并非自定义结构的名称。如需屏蔽自定义结构请填写netease_large_feature。
目前allowlist字段可以填写字段如下
```
"end_city"
"fortress"
"mineshaft"
"monument"
"ruins"
"stronghold"
"temple"
"village"
"mansion"
"shipwreck"
"ruined_portal"
"buried_treasure"
"pillager_outpost"
"bastion_remnant"
"ancient_city"
"trail_ruins"
"trial_chambers"
"netease_large_feature"
```
使用黑名单,除了不生成废弃传送门和海底神殿外,其他原版结构正常生成。
```json

View File

@@ -57,9 +57,8 @@ selection: true
|format_version|str||格式版本请填写0.0.1|
|name|str||指令名称例如gamemode|
|description|str||指令描述也支持在语言文件例如zh_CN.lang中定义|
|permission_level|str|game_directors|权限等级,可选any、game_directors、admin、host、owner具体含义如下<br>any任何人都能运行此命令<br>game_directors任何操作员都可以运行此命令包括命令方块<br>admin任何操作员都可以运行此命令但命令方块不能<br>host任何服务器主机都可以运行此命令<br>owner只有专用服务器可以运行此命令|
|requires_cheats|bool|true|是否需要开启作弊才可使用该指令若设为false需要同时将permission_level设为any|
|permission_level|str|game_directors|权限等级可选game_directors、admin、host、owner、any,具体含义如下<br>game_directors任何操作员都可以运行此命令包括命令方块<br>admin任何操作员都可以运行此命令但命令方块不能<br>host任何服务器主机都可以运行此命令<br>owner只有专用服务器可以运行此命令<br>any任何人都可以运行此命令|
- args是一个包含object的列表定义指令的参数。每个object都代表一个参数object的顺序决定指令参数的输入顺序每个object的参数说明如下
|键|类型|解释|

View File

@@ -0,0 +1,131 @@
---
front: https://nie.res.netease.com/r/pic/20210728/5507b669-4c6f-4958-b5d0-b8556ab4cfb5.png
hard: 进阶
time: 10分钟
---
# ModAPI代码进阶优化
> 本文档介绍了一些高级的ModAPI代码优化技巧帮助开发者们编写更高效的代码。
> 我们将结合一些开发情景,逐一讲解优化流程
## 使用实体Attr实现Molang同步
### 背景说明
在开发过程中假设我们需要给玩家添加创造飞行或鞘翅动画效果。但是翻找wiki却发现原版并没有提供相关的Molang所以我们需要自定义以下两个Molang变量
```
query.mod.ysm_is_create_flying # 是否正在创造飞行
query.mod.ysm_is_elytra_flying # 是否正在鞘翅飞行
```
### 实现方案对比
**不推荐的方案:**
通过tick函数持续获取玩家状态并与客户端通信来设置Molang值
这种方式会导致严重的性能开销,十分的不友好
**推荐的方案:**
结合以下两个关键功能实现:
1. [OnPlayerActionServerEvent](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/事件/玩家.html#onplayeractionserverevent) - 用于监听玩家动作状态
2. [实体自定义属性](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/接口/实体/索引.html?catalog=1#自定义属性) - 实现Molang值的自动同步
### 工作原理
众所周知,当使用服务端的`SetAttr`接口设置属性值后,系统会自动将这些值同步到客户端
在实体Attr文档中我们可以找到一个关键接口`RegisterUpdateFunc`,它用于注册属性值变化时的回调函数
这个机制就是实现实体Molang值自动同步的核心
### Attr同步优点
- 高性能、低功耗的实现方式
- 使用游戏原生发包的Attr通信比直接通信接口更快
- 自动处理可见渲染范围内的同步,无需手动监听`AddPlayerCreatedClientEvent`事件
- 适合在tick内进行多次操作统一更新数据
### 代码实现
##### 服务端代码
```python
# 服务端代码实现
ServerComp = serverApi.GetEngineCompFactory()
class PlayerActionServerSystem(ServerSystem):
def __init__(self, namespace, systemName):
ServerSystem.__init__(self, namespace, systemName)
def OnPlayerActionServerEvent(self, args):
# 玩家动作事件,当玩家开始/停止某些动作时触发该事件
playerId = args["playerId"]
actionType = args["actionType"]
modAttr = ServerComp.CreateModAttr(playerId)
# 使用鞘翅飞行/创造飞行的动作枚举值为(15,16,34,35)
if actionType == 34:
# 开始创造飞行
modAttr.SetAttr("playerIsCreateFlying", 1)
elif actionType == 35:
# 停止创造飞行
modAttr.SetAttr("playerIsCreateFlying", 0)
elif actionType == 15:
# 开始鞘翅飞行
modAttr.SetAttr("playerIsElytraFlying", 1)
elif actionType == 16:
# 停止鞘翅飞行
modAttr.SetAttr("playerIsElytraFlying", 0)
```
##### 客户端代码
```python
# 客户端代码实现
ClientComp = clientApi.GetEngineCompFactory()
levelId = clientApi.GetLevelId()
playerId = clientApi.GetLocalPlayerId()
# 注册自定义Molang变量
ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_create_flying", 0)
ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_elytra_flying", 0)
# key为需要监听的attr名称,value为需要设置的对应Molang变量名称
queryDict = {
"playerIsFlying": "query.mod.ysm_is_flying",
"playerIsElytraFlying": "query.mod.ysm_is_elytra_flying"
}
# 根据queryDict自动配置监听,简化代码
def CreateAttrCallBack(bindQuery):
def _eventFuckCallBack(args):
ClientComp.CreateQueryVariable(args["entityId"]).Set(bindQuery, args["newValue"])
return _eventFuckCallBack
class PlayerActionClientSystem(ClientSystem):
def __init__(self, namespace, systemName):
ClientSystem.__init__(self, namespace, systemName)
# 注册本地玩家的属性值变化回调函数
modAttr = ClientComp.CreateModAttr(playerId)
for attr, query in queryDict.items():
ClientComp.CreateModAttr(playerId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
def OnAddPlayerAOIClient(self, args):
"""玩家加入游戏或进入视野时触发,注册属性值变化回调"""
pId = args["playerId"]
modAttr = ClientComp.CreateModAttr(pId)
for attr, query in queryDict.items():
ClientComp.CreateModAttr(pId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
```
### 工作流程说明
1. 客户端为本地玩家和其他玩家注册属性值变化的回调函数
2. 服务端通过`OnPlayerActionServerEvent`事件监测玩家的飞行状态
3. 使用`SetAttr`设置属性值,自动同步到客户端
4. 客户端的回调函数被触发更新相应的Molang值
#### 其他性能优化教程,敬请期待...

View File

@@ -0,0 +1,177 @@
---
front: https://nie.res.netease.com/r/pic/20210728/5507b669-4c6f-4958-b5d0-b8556ab4cfb5.png
hard: 进阶
time: 20分钟
---
# 配置文件优化指南
本文介绍了如何优化Python配置文件的内存使用。
## 1. 使用结构优化建筑生成
在建筑生成和放置方面我们推荐使用结构文件而不是Python配置。
### 使用feature\_rules控制建筑生成
参考教程:[自定义特征](../15-自定义游戏内容/4-自定义维度/4-自定义特征.md)
**优点:**
* 无需代码处理,无卡顿效果
* 采用微软原生机制,性能优异
**缺点:**
* feature\_rules文件中的molang表达式不宜过于复杂
* 复杂的表达式可能导致内存占用增加,影响游戏加载速度
### 通过API放置structure
参考API<a href="../../../mcdocs/1-ModAPI/接口/世界/地图.html#placestructure" rel="noopenner">PlaceStructure</a>
**优点:**
* 提供灵活的代码控制能力
* 可实现复杂的生成规则
**缺点:**
* 放置时可能出现短暂卡顿
## 2. 使用方块调色板节约内存
方块调色板可用于保存建筑数据。使用<a href="../../../mcdocs/1-ModAPI/接口/世界/方块组合.html#getblockpalettebetweenpos" rel="noopenner">GetBlockPaletteBetweenPos</a>等接口获取方块调色板后,使用<a href="../../../mcdocs/1-ModAPI/接口/方块/方块调色板.html#serializeblockpalette" rel="noopenner">SerializeBlockPalette</a>将调色板转化成字典后,手动存入配置文件中。
**优点:**
* 方块调色板是高度压缩的字典结构,可最大程度节约内存
* 对应的放置接口<a href="../../../mcdocs/1-ModAPI/接口/世界/方块组合.html#setblockbyblockpalette" rel="noopenner">SetBlockByBlockPalette</a>是原生c++批量放置,性能较好
* 可实现复杂的生成规则
**缺点:**
* 放置时可能出现短暂卡顿
## 3. 使用引用避免重复定义
在配置文件中,应避免重复定义相同的配置项,而是采用引用方式:
* 错误的写法
```python
# 存在大量重复的方块数据定义
building = {
'build_A': {
'size': [0, 1, 2],
'blocks': [
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
{'aux': 0, 'name': 'minecraft:air'},
],
},
}
```
* 正确的写法
```python
# 定义基础方块数据
AirBlock = {'aux': 0, 'name': 'minecraft:air'}
GrassBlock = {'aux': 0, 'name': 'minecraft:grass'}
StoneBlock = {'aux': 0, 'name': 'minecraft:stone'}
# 通过引用复用方块数据
building = {
'build_A': {
'size': (0, 1, 2),
'blocks': [
AirBlock, AirBlock, StoneBlock, AirBlock, AirBlock,
GrassBlock, AirBlock, GrassBlock, AirBlock, AirBlock, StoneBlock,
],
},
}
```
## 4. 使用元组替代字典
对于只读的配置数据,建议使用元组代替字典,以提高内存使用效率:
* 错误的写法
```python
# 定义基础方块数据
AirBlock = {'aux': 0, 'name': 'minecraft:air'}
GrassBlock = {'aux': 0, 'name': 'minecraft:grass'}
StoneBlock = {'aux': 0, 'name': 'minecraft:stone'}
```
* 正确的写法
```python
# 使用元组存储只读数据,提高内存效率
AirBlock = ('minecraft:air', 0)
GrassBlock = ('minecraft:grass', 0)
StoneBlock = ('minecraft:stone', 0)
```
## 5. 分割配置文件并动态加载
如果你的配置文件已经有几十M的大小建议将配置文件按功能模块分割采用动态加载方式
* 错误的写法
```python
# 一次性导入所有配置
from build import build1, build2, build3
```
* 正确的写法
```python
def load_build_config(data):
building = data['build']
if build == '1':
# 按需导入配置
import build1
place_build(data, build1)
elif build == '2':
# 按需导入配置
import build2
place_build(data, build)
```
## 注意事项
* 建议将一个模块切割得尽量细,并结合前面所述的方法减少单个模块的大小,否则动态加载模块也会带来卡顿。
* 即便使用动态加载,如果玩家将各个类型的建筑都摆放一次,那么所有配置也会被加载进来,大量占用内存。
* 如果想进一步优化可以将配置存储为json文件通过json方式使用和卸载相关接口<a href="../../../mcdocs/1-ModAPI/接口/通用/工具.html#getmodconfigjson" rel="noopenner">GetModConfigJson</a>。
* 可以使用`zlib`库压缩数据。
## 优化效果
**优化前内存占用715.32M、优化后占用下降到了224.46M**
优化前的内存占用(使用方块探针工具):
![image](./images/before_optimization.png)
优化后的内存占用(使用方块探针工具):
![image](./images/after_optimization.png)
## 总结
1. 优先使用结构文件/方块调色板存储大型数据
2. 使用类组织相关配置
3. 采用引用而不是重复定义
4. 使用元组存储只读数据
5. 按功能分割配置文件

View File

@@ -74,6 +74,20 @@ time: 60分钟
- 请检查BC服与Spigot服配置以及日志确定BC服能正常连接上Spigot服
### (5) 排查 Apollo 版本兼容性问题
- 当客户端与服务端的 Apollo 版本不一致(例如客户端为 3.1.0,而服务端为 3.0.0)时,玩家将无法进入游戏,界面会一直停留在“正在链接外部服务器”,同时 Geyser 日志中不会有任何输出。
- 请确保客户端与服务端使用的是相同版本,以避免因版本不兼容导致连接失败的问题。
- 可能您会疑惑:“我怎么知道什么时候需要更新 Apollo 版本呢?”
建议您在收到类似下图的 **开发包更新提醒短信或站内信** 时,**及时将开发环境中的服务器更新到最新的开发版本**,以确保当正式版本发布时能够顺利对接,避免出现严重兼容性问题,导致玩家无法连接或难以及时修复。
![问题1-9](./res/quest11.png)
- 在正式版本发布后,通常也会通过类似短信或站内信的方式通知您进行更新。**此外,请务必前往“编辑更新”中的“上传网络游戏”界面,在“适用版本”选项中勾选对应的新版本**,以确保玩家可以正常进入服务器。
- 同时我们建议为了防御可能的外挂破解和兼容性问题建议只开放最新的2个版本如目前最新为3.4版本则只开放3.3和3.4版本)
## 6、SpigotMaster是否必须加载?
目前Spigotmaster是强制要求加载虽然不加载不会报错但是会有部分功能无法支持。如皮肤防作弊、聊天插件控制、商城接口等。因此强烈要求必须加载SpigotMaster
**另外目前SpigotMaster不支持reload指令使用后会不正常建议不使用Spigot等端的reload指令**

Some files were not shown because too many files have changed in this diff Show More