24 Commits

Author SHA1 Message Date
kwiilh
6276db64e0 同步最新文档10m17d 2025-10-17 14:52:29 +08:00
kwiilh
09af082c0a Merge pull request #17 from sevenstars0/patch-2
fix 9-自定义指令.md
2025-09-26 17:49:30 +08:00
kwiilh
9c9ed35710 同步官网文档 2025-09-26 17:47:57 +08:00
MCNeteaseDevs
d3bc7da61d Merge pull request #18 from lovelyXiaoQi/main
优化 代码进阶优化教程 内的部分内容
2025-09-16 16:37:39 +08:00
lovelyXiaoQi
b3e5699e1c 优化 代码进阶优化教程 内的部分内容 2025-09-13 21:40:25 +09:00
sevenstars
2044ee882d fix 9-自定义指令.md
修复表格错误
2025-09-09 19:47:01 +08:00
MCNeteaseDevs
d2748d9fcd Merge pull request #16 from Xunzoua/main
fix:10-从零开始的开发者生活!修改为 10-从零开始注册成为开发者
2025-09-02 14:47:21 +08:00
Xunzoua
f906012210 Update 10-从零开始注册成为开发者.md 2025-08-29 15:00:04 +08:00
Xunzoua
a27e022adb Update and rename 10-从零开始的开发者生活!.md to 10-从零开始注册成为开发者.md 2025-08-29 14:59:47 +08:00
Xunzoua
cbe04e2be1 【紧急】修复PE查看标题乱码问题 2025-08-27 21:08:15 +08:00
Xunzoua
c3eebd5500 Merge branch 'MCNeteaseDevs:main' into main 2025-08-27 20:48:49 +08:00
kwiilh
18b5ecd7f0 同步周末秒杀文档 2025-08-27 10:21:18 +08:00
kwiilh
b93c3930ce Merge branch 'pr/8' 2025-08-26 17:11:11 +08:00
kwiilh
9ab2d462a1 Merge branch 'pr/7' 2025-08-26 17:08:34 +08:00
DarkPath
6299f1abb5 Merge branch 'MCNeteaseDevs:main' into main 2025-06-10 20:53:15 +08:00
DarkPath
48ea7e07b4 docs: 建议仅开放最新两个版本以增强安全性和兼容性 2025-06-09 21:02:07 +08:00
DarkPath
ad48c9dd2f docs: 补充 Apollo 版本兼容性说明及更新提醒短信图示,优化用户排查指引 2025-06-09 20:56:53 +08:00
DarkPath
6cfd7cc219 docs: 添加开发包更新提醒相关短信截图,辅助排查或说明版本更新原因 2025-06-09 20:50:10 +08:00
Xunzoua
ff268c20ff 更新现代化图片 2025-06-09 20:48:41 +08:00
Xunzoua
76d87d253c Delete mcguide/12-入门教程/images/0_5.png 2025-06-09 20:48:18 +08:00
Xunzoua
bc6f5e520c 更新现代化图片 2025-06-09 20:41:39 +08:00
Xunzoua
355efec1cf Delete mcguide/12-入门教程/images/0_5.png 2025-06-09 20:41:10 +08:00
Xunzoua
7befe2c2c8 添加一些教程,修改教程名为10-从零开始的开发者生活! 2025-06-09 20:38:25 +08:00
Xunzoua
d27c9c8564 Update and rename 10-注册成为开发者.md to 10-从零开始的开发者生活!.md 2025-06-09 20:09:22 +08:00
25 changed files with 1256 additions and 35 deletions

2
.gitignore vendored
View File

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

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主身份进行注册。**

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 KiB

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

@@ -303,7 +303,7 @@ time: 分钟
### netease:block_animate_random_tick
频率更高的方块tick用于实现类似樱花树叶的方块特效。给自定义方块配置该组件后开发者可以在**客户端**监听<a href="../../../../mcdocs/1-ModAPI-beta/事件/方块.html#blockanimaterandomtickevent" rel="noopenner"> BlockAnimateRandomTickEvent </a>事件给方块附加逻辑。
频率更高的方块tick用于实现类似樱花树叶的方块特效。给自定义方块配置该组件后开发者可以在**客户端**监听<a href="../../../../mcdocs/1-ModAPI/事件/方块.html#blockanimaterandomtickevent" rel="noopenner"> BlockAnimateRandomTickEvent </a>事件给方块附加逻辑。
| 键 | 类型 | 默认值 | 解释 |
| ------------ | ----- | ------ | ------ |

View File

@@ -49,7 +49,7 @@ 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 | 屏蔽所有原版结构 | 选择性屏蔽原版结构,示例见下方,支持主世界、下界、末地维度类型 |

View File

@@ -31,8 +31,8 @@ query.mod.ysm_is_elytra_flying # 是否正在鞘翅飞行
结合以下两个关键功能实现:
1. [OnPlayerActionServerEvent](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI-beta/事件/玩家.html#onplayeractionserverevent) - 用于监听玩家动作状态
2. [实体自定义属性](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI-beta/接口/实体/索引.html?catalog=1#自定义属性) - 实现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值的自动同步
### 工作原理

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指令**

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

View File

@@ -0,0 +1,103 @@
---
front:
hard: 入门
time: 60分钟
---
# Nukkit部署教程
## 前言
本文默认认为你了解过Nukkit 或者 通过Waterdogpe + Nukkit搭建过第三方服务器。
## 准备阶段
1. 准备Java版本建议Java版本为Java17及以上版本
2. 准备NukkitMOT分支NukkitMOT原作者已将中国版打包到github主分支内 https://github.com/MemoriesOfTime/Nukkit-MOT
> 目前仅支持接入Nukkit-MOT其他分支可自行通过参考NukkitMOT源码进行对接
3. 准备 WaterDogPE 代理服务端。
## WaterDogPE
### config.yml 的配置
需要修改以下参数,其他配置根据情况自行修改
```yaml
# ....
netease_client: true # 启用 netease 客户端的支持
online_mode: true
# 开发测试阶段需要改为false否则会提示需要 minecraft验证
# 发布阶段时需要改为true之后只能用网易手机客户端连接才能进入
listener:
# .....
host: 0.0.0.0:19132 # waterdogpe 代理端的IP和端口 。官方提供的机器19132端口可能会被占用根据实际情况更改
priorites: # 按顺序配置,第一个是玩家进入时默认在的服务器。 一般为大厅服
- lobby1
# .....
servers: # 子服务器的连接ID配置如大厅服、游戏服等等。如子服务器不在同一台机器则需要写具体的ip。
lobby1:
address: 127.0.0.1:19133
public_address: play.myserver.com:19133
server_type: bedrock
permissions: # 权限配置,一般用于配置管理员的权限,用于测试、调试。仅通过名字识别,建议发布阶段去掉,改为用插件实现相关调试功能
玩家id:
- waterdog.player.transfer
- waterdog.player.list
- waterdog.command.server
```
### 装载客户端模组
当通过waterdogpe代理后需要将客户端模组存放在waterdogpe 根目录下的 packs 文件夹中不要存放在NukkitMOT根目录
> 除非你仅通过NukkitMOT单端开服 否则waterdogpe 会自动将nukkit模组加载数据包拦截
> 但如果关闭waterdogpe的资源包功能Nukkit数据包依然会被waterdogpe拦截而无法正常进入游戏
确保 config.yml 已启用资源包
```yaml
enable_packs: true # 必须打开
overwrite_client_packs: true # 按需
force_server_packs: true # 按需
```
### 模组打包格式
waterdogpe 仅支持 zip和mcpack包不支持文件夹。
可以将行为包、资源包都存放在packs目录中。
目前仅支持 manifest.json ,不支持 pack_manifest.json
zip打包格式为 压缩包一级目录下就是 manifest.json不要额外套一层文件夹
![](./images/img.png)
## Nukkit-MOT
nukkit社区的插件
https://cloudburstmc.org/resources/categories/nukkit-plugins.1/
### server.properties 配置
为了确保Nukkit-MOT正常接入中国版您需要调整一些配置
```properties
xbox-auth=off
netease-client-support=on
only-allow-netease-client=on
```
### 模组装载
如果使用 waterdogpe 代理,则需要将模组放在 waterdogpe 目录而非Nukkit目录
如果仅适用Nukkit则将行为包合资源包都放在Nukkit目录下有关 netease的文件里
### NukkitMaster插件
NukkitMaster相当于Spigot服的SpigotMaster内置封装了PyRPC、订单接口、消息收发等功能API和使用方法和SpigotMaster一样。
### 自定义物品、方块和实体
Nukkit-MOT本身已经支持自定义物品、方块、实体的功能可以参考[官方文档](https://www.nukkit-mot.com/zh/docs/tutorial-extras/custom/custom_item)

View File

@@ -0,0 +1,277 @@
---
front:
hard: 入门
time: 60分钟
---
# NukkitMaster文档
## 准备阶段
在部署Nukkit服务器之前您需要阅读一下NukkitMaster的API来进行基本的ModSDK通信与商业化内容接入。
NukkitMaster需要安装在Nukkit-MOT服务端中。
> 需要注意: NukkitMaster是基于Nukkit-MOT分支进行开发的。Nukkit官方服务端版本无法兼容。
> 如果您需要使用其他分支的Nukkit您可以自行反编译NukkitMaster
> NukkitMOT分支开源地址 https://github.com/MemoriesOfTime/Nukkit-MOT
## 插件配置
```yaml
# 服务器id开发者平台中的资源数字id
game_id: ""
# 正式服务器key开发者平台中的签名信息
game_key: ""
# 测试服务器key开发者平台中的签名信息
test_game_key: ""
# 是否是测试服
test_server: false
# 是否使用自定义商城false表示使用官方提供的商城功能
custom_shop: false
# 订单服务器地址(一般不用填,保持""即可)
shop_server_url: ""
# web服务器地址一般不用填保持""即可)
web_server_url: ""
```
NukkitMaster插件会在 `plugins/NukkitMaster` 下生成 `config.yml` 需要将服务器的相关数据进行配置订单API才能生效。
其中`gameid``rawkey``test rawkey`是必须要填写的。
`test_server`需要根据服务器部署情况进行修改这个值会影响NukkitMaster插件使用的是正式服url还是测试服url
`custom_shop` 和 [商业化流程](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/27-%E6%89%8B%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/%E8%AF%BE%E7%A8%8B9%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%BA%BF/%E7%AC%AC3%E8%8A%82%EF%BC%9A%E5%95%86%E4%B8%9A%E5%8C%96%E6%93%8D%E4%BD%9C.html?key=use_custom_shop&docindex=1&type=0) 中 use custom shop 功能同理
`shop_server_url``web_server_url`为预留配置,目前不需要修改,默认即可
## API
### `public void enableCustomShopEntry(boolean useCustomShop)`
开启商城插件的入口该功能已经在NukkitMaster中集成可修改NukkitMaster的`config.yml`文件。
参数: `useCustomShop` —— 是否使用自定义商城入口为false时则使用官方商城入口
### `public void openShop(Player player)`
打开指定玩家商城界面 注意该接口需要使用商城插件并修改config.yml的`custom_shop`为true。
参数: `player` —— 玩家
### `public void closeShop(Player player)`
关闭指定玩家商城界面 注意该接口需要使用商城插件并修改config.yml的`custom_shop`为true。
参数: `player` —— 玩家
### `public void getPlayerOrderList(Player player, FutureCallback<Map<String, Object>> callback)`
获取玩家未发货订单列表
参数:
`player` —— 玩家
`callback` —— FutureCallBack 回调函数
例子:
回调参数为Map<String,Object>, 目前值为
| Key | Value |
|-------------|------------|
| json_result | 订单json数据对象 |
| player | Player玩家对象 |
### `public void finPlayerOrder(Player player, List<String> orderList, FutureCallback<Map<String, Object>> callback)`
获取玩家未发货订单列表
参数:
`player` —— 玩家
`orderList` —— 订单id列表
`callback` —— FutureCallBack 回调函数
### `public void listenForNukkitMasterEvent(SpigotMasterEvent event, PyRpcHandler handler)`
监听spigot master的自定义事件
参数:
`event` — SpigotMasterEvent的枚举值
`handler` — 回调函数
### `public void listenForEvent(String namespace, String system, String event, PyRpcHandler handler)`
注册客户端事件
参数:
`namespace` — 来源客户端系统的namespace
`system` — 来源客户端系统的systemName
`event` — 事件名
`handler` — 回调函数
### `public void notifyToClient(Player player, String namespace, String system, String event, Map<String, Object> data)`
给指定玩家发送服务端事件
参数:
`player` — 接收事件的玩家
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数。注意,要使用-2指代本地玩家的entityId。
### `public void notifyToMultiClients(List<Player> players, String namespace, String system, String event, Map<String, Object> data)`
给多个玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`players` — 接收事件的玩家列表
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
### `public void notifyToClientsNearby(@Nullable Player except, Location loc, double dist, String namespace, String system, String event, Map<String, Object> data)`
给某个位置附近一定半径内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`except` — 发送事件时排除掉这个玩家可以为null表示不排除
`loc` — 圆心位置
`dist` — 半径
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
### `public void broadcastToAllClient(@Nullable Player except, World world, String namespace, String system, String event, Map<String, Object> data)`
给某个world内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`except` — 发送事件时排除掉这个玩家可以为null表示不排除
`world` — 所在world
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
### `public void broadcastToAllClient(@Nullable Player except, String namespace, String system, String event, Map<String, Object> data)`
给服务器内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`except` — 发送事件时排除掉这个玩家可以为null表示不排除
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
## API的使用例子
可以参考Spigot开服的商店DEMO [商城Demo详解](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/27-%E6%89%8B%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/%E8%AF%BE%E7%A8%8B10%EF%BC%9A%E4%BD%BF%E7%94%A8Spigot%E5%BC%80%E6%9C%8D/30-Spigot%E6%9C%8DDemo%E8%AF%A6%E8%A7%A3/3-%E5%95%86%E5%9F%8EDemo%E8%AF%A6%E8%A7%A3.html)
仅仅只是将其中spigotMaster更换为nukkitMaster其他逻辑基本相同
### 获取nukkitMaster对象
```java
import com.neteasemc.nukkitmaster.NukkitMaster;
public final class App extends PluginBase {
NukkitMaster nukkitMaster;
@Override
public void onEnable() {
// 可以直接获取instance
nukkitMaster = NukkitMaster.getInstance();
// 或者通过插件名字获取
nukkitMaster = (NukkitMaster)getServer().getPluginManager().getPlugin("NukkitMaster");
}
}
```
### 监听玩家购买商品事件、玩家催发货事件和发货逻辑
```java
public void ListenShop() {
PyRpcHandler shipItemHandler = new PyRpcHandler() {
@Override
public void onEvent(Player player, Map<String, Object> data) {
tryShipItem(player);
}
};
// 玩家催发货或者玩家购买物品成功事件进行发货检查
nukkitMaster.listenForNukkitMasterEvent(NukkitMasterEvent.PLAYER_BUY_ITEM_SUCCESS, shipItemHandler);
nukkitMaster.listenForNukkitMasterEvent(NukkitMasterEvent.PLAYER_URGE_SHIP, shipItemHandler);
}
// 获取玩家订单,并且尝试发货
public void tryShipItem(Player player){
FutureCallback<Map<String, Object>> cbHandler = new FutureCallback<Map<String, Object>>() {
@Override
public void completed(Map<String, Object> result) {
JSONObject jsonRes = (JSONObject)result.get("json_result");
Player requestPlayer = (Player)result.get("player");
JSONArray entities = (JSONArray)jsonRes.get("entities");
// 这里进行entites的订单内容发放
List<String> finOrderIds = new ArrayList<>();
for(int i = 0; i < entities.size(); ++i){
JSONObject order = (JSONObject)entities.get(i);
// 取出订单id判断是否已经发放过比如说通过本地的数据库等
String orderId = order.getAsString("orderid");
// 对于还未发放的订单, 根据order的cmd字段进行对应的奖励逻辑发放
// 如shipItemToPlayer(requestPlayer);
// 发放完之后记录数据库
// 如saveOrder(requestPlayer, orderId);
// 最后通知网易服务器订单已完成
finOrderIds.add(orderId);
}
finPlayerOrder(requestPlayer, finOrderIds);
}
@Override
public void failed(Exception ex) {
// 失败原因
getLogger().info(ex.toString());
}
@Override
public void cancelled() {
getLogger().info("取消请求玩家订单");
}
};
nukkitMaster.getPlayerOrderList(player, cbHandler);
}
// 通知网易服务器订单完成
public void finPlayerOrder(Player player, List<String> finOrderList){
FutureCallback<Map<String, Object>> cbHandler = new FutureCallback<Map<String, Object>>() {
@Override
public void completed(Map<String, Object> result) {
JSONObject jsonRes = (JSONObject)result.get("json_result");
Player requestPlayer = (Player)result.get("player");
getLogger().info("玩家:" + requestPlayer.getDisplayName() + " 订单已完成:" + jsonRes);
}
@Override
public void failed(Exception ex) {
getLogger().info(ex.toString());
}
@Override
public void cancelled() {
getLogger().info("取消通知玩家订单完成");
}
};
nukkitMaster.finPlayerOrder(player, finOrderList, cbHandler);
}
```
## NukkitMaster Event事件
### `PLAYER_URGE_SHIP("player_urge_ship")`
玩家催发货事件
### `PLAYER_BUY_ITEM_SUCCESS("player_buy_item_success")`
玩家购买成功事件
### `CLIENT_LOAD_ADDON_FINISH("client_load_addon_finish")`
玩家客户端加载Mod完成事件

View File

@@ -0,0 +1,271 @@
# NukkitMaster文档
## 准备阶段
在部署Nukkit服务器之前您需要阅读一下NukkitMaster的API来进行基本的ModSDK通信与商业化内容接入。
NukkitMaster需要安装在Nukkit-MOT服务端中。
> 需要注意: NukkitMaster是基于Nukkit-MOT分支进行开发的。Nukkit官方服务端版本无法兼容。
> 如果您需要使用其他分支的Nukkit您可以自行反编译NukkitMaster
> NukkitMOT分支开源地址 https://github.com/MemoriesOfTime/Nukkit-MOT
## 插件配置
```yaml
# 服务器id开发者平台中的资源数字id
game_id: ""
# 正式服务器key开发者平台中的签名信息
game_key: ""
# 测试服务器key开发者平台中的签名信息
test_game_key: ""
# 是否是测试服
test_server: false
# 是否使用自定义商城false表示使用官方提供的商城功能
custom_shop: false
# 订单服务器地址(一般不用填,保持""即可)
shop_server_url: ""
# web服务器地址一般不用填保持""即可)
web_server_url: ""
```
NukkitMaster插件会在 `plugins/NukkitMaster` 下生成 `config.yml` 需要将服务器的相关数据进行配置订单API才能生效。
其中`gameid``rawkey``test rawkey`是必须要填写的。
`test_server`需要根据服务器部署情况进行修改这个值会影响NukkitMaster插件使用的是正式服url还是测试服url
`custom_shop` 和 [商业化流程](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/27-%E6%89%8B%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/%E8%AF%BE%E7%A8%8B9%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%BA%BF/%E7%AC%AC3%E8%8A%82%EF%BC%9A%E5%95%86%E4%B8%9A%E5%8C%96%E6%93%8D%E4%BD%9C.html?key=use_custom_shop&docindex=1&type=0) 中 use custom shop 功能同理
`shop_server_url``web_server_url`为预留配置,目前不需要修改,默认即可
## API
### `public void enableCustomShopEntry(boolean useCustomShop)`
开启商城插件的入口该功能已经在NukkitMaster中集成可修改NukkitMaster的`config.yml`文件。
参数: `useCustomShop` —— 是否使用自定义商城入口为false时则使用官方商城入口
### `public void openShop(Player player)`
打开指定玩家商城界面 注意该接口需要使用商城插件并修改config.yml的`custom_shop`为true。
参数: `player` —— 玩家
### `public void closeShop(Player player)`
关闭指定玩家商城界面 注意该接口需要使用商城插件并修改config.yml的`custom_shop`为true。
参数: `player` —— 玩家
### `public void getPlayerOrderList(Player player, FutureCallback<Map<String, Object>> callback)`
获取玩家未发货订单列表
参数:
`player` —— 玩家
`callback` —— FutureCallBack 回调函数
例子:
回调参数为Map<String,Object>, 目前值为
| Key | Value |
|-------------|------------|
| json_result | 订单json数据对象 |
| player | Player玩家对象 |
### `public void finPlayerOrder(Player player, List<String> orderList, FutureCallback<Map<String, Object>> callback)`
获取玩家未发货订单列表
参数:
`player` —— 玩家
`orderList` —— 订单id列表
`callback` —— FutureCallBack 回调函数
### `public void listenForNukkitMasterEvent(SpigotMasterEvent event, PyRpcHandler handler)`
监听spigot master的自定义事件
参数:
`event` — SpigotMasterEvent的枚举值
`handler` — 回调函数
### `public void listenForEvent(String namespace, String system, String event, PyRpcHandler handler)`
注册客户端事件
参数:
`namespace` — 来源客户端系统的namespace
`system` — 来源客户端系统的systemName
`event` — 事件名
`handler` — 回调函数
### `public void notifyToClient(Player player, String namespace, String system, String event, Map<String, Object> data)`
给指定玩家发送服务端事件
参数:
`player` — 接收事件的玩家
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数。注意,要使用-2指代本地玩家的entityId。
### `public void notifyToMultiClients(List<Player> players, String namespace, String system, String event, Map<String, Object> data)`
给多个玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`players` — 接收事件的玩家列表
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
### `public void notifyToClientsNearby(@Nullable Player except, Location loc, double dist, String namespace, String system, String event, Map<String, Object> data)`
给某个位置附近一定半径内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`except` — 发送事件时排除掉这个玩家可以为null表示不排除
`loc` — 圆心位置
`dist` — 半径
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
### `public void broadcastToAllClient(@Nullable Player except, World world, String namespace, String system, String event, Map<String, Object> data)`
给某个world内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`except` — 发送事件时排除掉这个玩家可以为null表示不排除
`world` — 所在world
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
### `public void broadcastToAllClient(@Nullable Player except, String namespace, String system, String event, Map<String, Object> data)`
给服务器内的所有玩家发送服务端事件。 因为-2的entityId对于不同玩家来说都指代本机玩家而非某个固定的实体所以不要在多播中发送这种信息。
参数:
`except` — 发送事件时排除掉这个玩家可以为null表示不排除
`namespace` — 在客户端系统使用ListenForEvent监听的namespace
`system` — 在客户端系统使用ListenForEvent监听的systemName
`event` — 事件名
`data` — 事件参数
## API的使用例子
可以参考Spigot开服的商店DEMO [商城Demo详解](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/27-%E6%89%8B%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/%E8%AF%BE%E7%A8%8B10%EF%BC%9A%E4%BD%BF%E7%94%A8Spigot%E5%BC%80%E6%9C%8D/30-Spigot%E6%9C%8DDemo%E8%AF%A6%E8%A7%A3/3-%E5%95%86%E5%9F%8EDemo%E8%AF%A6%E8%A7%A3.html)
仅仅只是将其中spigotMaster更换为nukkitMaster其他逻辑基本相同
### 获取nukkitMaster对象
```java
import com.neteasemc.nukkitmaster.NukkitMaster;
public final class App extends PluginBase {
NukkitMaster nukkitMaster;
@Override
public void onEnable() {
// 可以直接获取instance
nukkitMaster = NukkitMaster.getInstance();
// 或者通过插件名字获取
nukkitMaster = (NukkitMaster)getServer().getPluginManager().getPlugin("NukkitMaster");
}
}
```
### 监听玩家购买商品事件、玩家催发货事件和发货逻辑
```java
public void ListenShop() {
PyRpcHandler shipItemHandler = new PyRpcHandler() {
@Override
public void onEvent(Player player, Map<String, Object> data) {
tryShipItem(player);
}
};
// 玩家催发货或者玩家购买物品成功事件进行发货检查
nukkitMaster.listenForNukkitMasterEvent(NukkitMasterEvent.PLAYER_BUY_ITEM_SUCCESS, shipItemHandler);
nukkitMaster.listenForNukkitMasterEvent(NukkitMasterEvent.PLAYER_URGE_SHIP, shipItemHandler);
}
// 获取玩家订单,并且尝试发货
public void tryShipItem(Player player){
FutureCallback<Map<String, Object>> cbHandler = new FutureCallback<Map<String, Object>>() {
@Override
public void completed(Map<String, Object> result) {
JSONObject jsonRes = (JSONObject)result.get("json_result");
Player requestPlayer = (Player)result.get("player");
JSONArray entities = (JSONArray)jsonRes.get("entities");
// 这里进行entites的订单内容发放
List<String> finOrderIds = new ArrayList<>();
for(int i = 0; i < entities.size(); ++i){
JSONObject order = (JSONObject)entities.get(i);
// 取出订单id判断是否已经发放过比如说通过本地的数据库等
String orderId = order.getAsString("orderid");
// 对于还未发放的订单, 根据order的cmd字段进行对应的奖励逻辑发放
// 如shipItemToPlayer(requestPlayer);
// 发放完之后记录数据库
// 如saveOrder(requestPlayer, orderId);
// 最后通知网易服务器订单已完成
finOrderIds.add(orderId);
}
finPlayerOrder(requestPlayer, finOrderIds);
}
@Override
public void failed(Exception ex) {
// 失败原因
getLogger().info(ex.toString());
}
@Override
public void cancelled() {
getLogger().info("取消请求玩家订单");
}
};
nukkitMaster.getPlayerOrderList(player, cbHandler);
}
// 通知网易服务器订单完成
public void finPlayerOrder(Player player, List<String> finOrderList){
FutureCallback<Map<String, Object>> cbHandler = new FutureCallback<Map<String, Object>>() {
@Override
public void completed(Map<String, Object> result) {
JSONObject jsonRes = (JSONObject)result.get("json_result");
Player requestPlayer = (Player)result.get("player");
getLogger().info("玩家:" + requestPlayer.getDisplayName() + " 订单已完成:" + jsonRes);
}
@Override
public void failed(Exception ex) {
getLogger().info(ex.toString());
}
@Override
public void cancelled() {
getLogger().info("取消通知玩家订单完成");
}
};
nukkitMaster.finPlayerOrder(player, finOrderList, cbHandler);
}
```
## NukkitMaster Event事件
### `PLAYER_URGE_SHIP("player_urge_ship")`
玩家催发货事件
### `PLAYER_BUY_ITEM_SUCCESS("player_buy_item_success")`
玩家购买成功事件
### `CLIENT_LOAD_ADDON_FINISH("client_load_addon_finish")`
玩家客户端加载Mod完成事件

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -11,6 +11,10 @@ selection: true
## 1.方块探针
### 教学视频
<video src="./video/tracy.mp4" controls></video>
### 准备工作
首先您需要登陆到您的MCStudio如果您还没有账号可以点击[**开发者平台链接**](https://mcdev.webapp.163.com/#/login)进行注册:
@@ -425,6 +429,10 @@ MC\_SERVER:
![图片](./images/airperf01.png)
### 教学视频
<video src="./video/airperf.mp4" controls></video>
### 了解界面
启动客户端后我们可以先看一下布局,主要包括菜单栏、用户信息栏、功能栏、多功能面板(设备、场景)以及最重要的性能曲线面板。

View File

@@ -0,0 +1,174 @@
---
front:
hard: 入门
time: 15分钟
selection: true
---
# 整合包概览
> 文档版本2023.2.21 **首次更新整合包的使用说明** 。
《我的世界》整合包是一种面向玩家的新型购物模式,它能将多个上线模组捆绑在一起进行打折销售,为开发者的专一粉丝提供附加价值与更多惠益。针对常见情况,有两种普遍的使用场景:
- 结合 主包 搭配 DLC 的模式销售系列模组。
- 根据模组题材进行分类,帮助粉丝玩家更短时间找到喜欢的内容。
原合集功能将支持一键同步合集模组至整合包,后续开发者也无法创建新的合集,详情请查看[一键同步合集模组至整合包](./课程11.2-一键同步合集模组至整合包.html)。 **资源中心** - **开发者主页** 的合集分区将替换为整合包分区。 **且整合包当前仅支持《我的世界》手机版。**
《我的世界》开发者平台将在 **2月21日** 上线整合包功能,玩家可在 **3月23日** 后下载整合包。
期待各位开发者挖掘整合包的更多整合,使用上的建议与反馈可以通过[问题与反馈中心](https://mcdev.webapp.163.com/#/feedbackModal?target=browser)与我们取得联系。《我的世界》开发者平台也会提供独立的整合包流量位,敬请期待。
## 创建整合包
进入 《我的世界》开发者平台,点击 **作品管理** - **上架与资源管理**,接着点击 **模组** - **手机版** - **整合包**
![image-20230216150314989](./images/bundle_8.png)
点击 **创建整合包** ,可先设置 **整合包名称****整合包类型****基础折扣****限时折扣**
- 整合包类型:分为 **普通整合包****纯地图整合包**
- **普通整合包** :可以选择任一类型的模组。
- **纯地图整合包** :只能选择 **地图模组**
- 整合包名称:将作为整合包的名称进行展示。
- 基础折扣:必填,整合包上线后的默认折扣。
- 限时折扣:选填,可设置整合包在特定时间期间的折扣。整合包内的基础折扣与限时折扣同时生效时, **优先使用限时折扣**
![image-20230216163112834](./images/bundle_12.png)
**纯地图整合包** 最低折扣为50% **普通整合包** 有价格限制,最低折扣需按模组原价折后价**500钻石**设置。整合包类型将根据包内模组类型情况进行自动选择。
模组购买价格将按照**模组本身的折扣**以及**整合包限时折扣**进行叠加,若整合包限时折扣不存在时,将由整合包基础折扣代替。
折扣的运作模式可参考下图:
![bundle_example_0](./images/bundle_0.png)
接着在资源区域添加与整合包关联的模组。其中整合包最多关联20个最少关联3个 **有过审记录的模组资源****单个模组资源可加入的整合包次数不限**
![image-20230216162103730](./images/bundle_2.png)
添加模组资源后,必须设置其中一个模组为核心模组。核心模组默认在第一顺位展示。开发者可在每次关联模组时,通过添加顺序管理新增的模组展示顺序,未来也会提供直接调整非核心模组的展示顺序功能,敬请期待。
![image-20230216161858452](./images/bundle_6.png)
接着填充 **详情信息** 、**编辑图片** 和 **上传视频** 区域的相关内容,这些信息内容将会展示在整合包详情页中。也可直接点击同步按钮同步核心资源的资源描述,减少人工操作的时间。
![image-20230216162211163](./images/bundle_5.png)
![image-20230216142214820](./images/bundle_3.png)
![image-20230216142226019](./images/bundle_4.png)
与编辑模组上传信息不同,整合包的 **更新纪要** 为必填内容。设置之后会在玩家的订阅功能中同步生成资源卡片,并会在手机消息通知中同步收到提醒。
![image-20230216141926921](./images/bundle_1.png)
## 自测、提审与更新整合包
进入 《我的世界》开发者平台,点击 **作品管理** - **上架与资源管理**,接着点击 **模组** - **手机版** - **整合包**
![image-20230216145005670](./images/bundle_8.png)
对已创建好的整合包可在《我的世界》2.6整包Beta更新后点击自测按钮进行 **自测** ,在手机版测试启动器中预览对应的整合包。
点击 **提交审核** 按钮对整合包提交审核,点击后需进行二次确认才可提审,同样支持在二次确认弹窗中补充提审说明。
![image-20230216143926571](./images/bundle_9.png)
点击 **编辑** 按钮可重新进入整合包编辑页面,编辑更新后记得保存。
![image-20230216144831521](./images/bundle_7.png)
## 下架整合包
在单个整合包详情页中,找到 **上架设置** 。编辑 **上架设置** ,勾选 **弱下架** ,并提供 **弱下架原因**
![image-20230216161426665](./images/bundle_11.png)
最后重新提审,等待审核通过后即可下架整合包。
## 整合包FAQ
### 整合包的展示位置在哪里?
答:整合包会在 **关联的单个模组详情页** 下进行展示,也可在开发者主页下的 **整合包分区** 中找到。
### 整合包的折扣后价格是如何计算得出的?
答:价格是所有关联整合包的模组当前总价与整合包折扣相乘后的折扣价格, **折扣后的价格出现小数点时,将向下取整到整数钻石** 。例如其中一个模组原价20钻石使用模组折扣5折并添入基础折扣为88折的整合包则该模组最终在整合包的价格向下取整至8钻石。其余细则具体可查看 [创建整合包](#创建整合包)的折扣运作模式。
### 整合包的评分与评论系统来源是哪里?
答:整合包的评分与评论系统将直接使用核心资源的评分与评论。
### 整合包支持加入购物车、心愿单与索要转赠功能吗?
答:整合包暂不支持搭配购物车、心愿单与索要转赠功能使用。
### 是否可以将整合包加入折扣特卖或作品活动?
答:目前尚不支持开发者登记整合包至[折扣特卖或作品活动](../40-活动、推广与收益/课程08-对作品进行推广与活动.html?catalog=1#活动参与)。
### 是否可以使用整合包的参与手机版推广位申请与竞拍?
答:目前尚不支持在[推广位申请与竞拍功能](../40-活动、推广与收益/课程16-推广位申请与竞拍试运行指南.html?catalog=1#申请手机版轮播图推广位)内选择整合包,请期待后续更新。
### 整合包的审核流程是什么形式?
答:与模组审核流程一致,开发者需要点击提审进入审核队列,并通过开发者邮箱与短信获得审核结果。
### 已购模组在整合包内会如何展示?
答:已购模组会在整合包内的模组列表显示已购标识,同理,未购模组也会显示未购买标识。
### 如何更换/新增/取消关联核心模组与非核心模组?
答: **在整合包首次上架前,开发者可以随时更换/新增与取消关联相应的核心模组与非核心模组。** 但在上架后,就无法更换/取消之前的核心模组或非核心模组,只允许关联其他新的模组资源为非核心模组。
### 核心模组或其他关联模组下架时,整合包会如何处理?
答:核心模组下架后,整合包将会消失,请开发者注意。其他关联模组下架时,整合包会清除对应模组信息。

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -0,0 +1,52 @@
# 周末秒杀活动说明
## 一、什么是【周末秒杀】活动
每周五、六、日三天将限时开启周末秒杀活动报名并中标的模组将在活动当天20:00-23:59获得额外曝光进行限时秒杀。
当周末秒杀与其他游戏内促销节日冲突时,将有概率暂时关闭当周【周末秒杀】活动。
![48](./images/zhoumo_miaosha/0_0.png)
<span style="color:red;">* 当周末秒杀与其他游戏内促销节日冲突时,将有概率暂时关闭当周【周末秒杀】活动。</span>
## 二、【周末秒杀】报名规则
1. 开发者平台新增【周末秒杀】报名通道,报名流程可查看【报名流程图解】
- 每个秒杀日有且仅有15个模组可进行申请报名
- 满15个模组在申请队列中时此秒杀日将不再接受申请
- 每个秒杀日有且仅有一个模组能够中标
2. 信用分满12分的开发者均可在开发者平台 - 推广与活动- 【周末秒杀】 页面进行报名:
- 开发者至少提前9个自然日、至多提前22个自然日进行申请e.g. 7月11-13日的秒杀模组最晚在7月2日申请最早在6月18日申请
- 每位开发者同一时间最多有6个模组处于申请中状态
- 申请中状态:审核中、已通过、已上架
- 以下情况不在申请中:未通过、已下架
3. 可申请的模组需满足以下条件:
- 申请的模组6周内未参与过秒杀活动
- 申请的模组必须为原价大于100钻 且是钻石付费模组
- 秒杀份数最少为1000份,最多为10000份秒杀份数需为整千数
4. 申请后开发者可在【我的申请】中查看42天内申请历史
5. 申请通过/未通过时,我们将通过 站内信的形式 告知各位开发者
## 三、【报名流程图解】
1. 在开发者平台【推广与活动 - 周末秒杀申请】页面
![48](./images/zhoumo_miaosha/0_1.png)
2. 选择想要申请秒杀的周末,点击【申请】
![48](./images/zhoumo_miaosha/0_2.png)
3. 在【申请弹窗】中选择对应的日期,填写: 模组ID 、秒杀份数(秒杀份数需为整千数)
![48](./images/zhoumo_miaosha/0_3.png)
4. 申请后开发者可在【我的申请】中查看42天内申请历史
![48](./images/zhoumo_miaosha/0_4.png)