Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8d549266d | ||
|
|
2289f38a4c | ||
|
|
a046b0d4ed | ||
|
|
df9b1e4620 | ||
|
|
fc5d4989a4 | ||
|
|
6276db64e0 | ||
|
|
09af082c0a | ||
|
|
9c9ed35710 | ||
|
|
d3bc7da61d | ||
|
|
b3e5699e1c | ||
|
|
2044ee882d | ||
|
|
d2748d9fcd | ||
|
|
f906012210 | ||
|
|
a27e022adb | ||
|
|
cbe04e2be1 | ||
|
|
c3eebd5500 | ||
|
|
bc6f5e520c | ||
|
|
355efec1cf |
2
.gitignore
vendored
@@ -3,3 +3,5 @@ package-lock.json
|
||||
package.json
|
||||
.DS_Store
|
||||
.idea
|
||||
mcguide/30-测试/video/airperf.mp4
|
||||
mcguide/30-测试/video/tracy.mp4
|
||||
|
||||
51
mcguide/10-新内容/1-开发工作台/932-1.1.48.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
front: https://nie.res.netease.com/r/pic/20251126/f99d0bfc-97b5-40fc-8157-394f2776d1d3.jpg
|
||||
hard: 入门
|
||||
time: 2分钟
|
||||
selection: 23
|
||||
---
|
||||
|
||||
# 2025.11.26 版本1.1.48
|
||||
|
||||
## 编辑器/Mod PC支持4D皮肤
|
||||
|
||||
为方便开发者在 PC 端直接进行 4D 皮肤与模组的兼容性调试,MC Studio 在 3.6 版本起正式支持 4D 皮肤测试。开发者可以灵活选择手机端和MC Studio,进行模组与4D皮肤的兼容性测试
|
||||
|
||||
### 使用方法
|
||||
|
||||
1. 新建开发测试
|
||||
|
||||
新建开发测试按钮,选择3.6(或以上)版本的Mod PC
|
||||
|
||||

|
||||
|
||||
选择下方的皮肤选项,可以看到除了默认的史蒂夫和爱丽克丝以外新增4款4D皮肤皮肤,选择皮肤后即可开始测试
|
||||
|
||||

|
||||
|
||||
2. 配置已有存档
|
||||
|
||||
对于已有的3.6测试存档,可以点击配置
|
||||
|
||||

|
||||
|
||||
在配置界面中可以切换下方的皮肤
|
||||
|
||||

|
||||
|
||||
3. 局内切换
|
||||
|
||||
进入游戏时,会触发一次UpdatePlayerSkinClient客户端事件
|
||||
点击右上角菜单,选择切换皮肤选项,即可选择其他4D皮肤
|
||||
|
||||

|
||||
|
||||
注意:
|
||||
|
||||
- 菜单切换4D皮肤是模拟玩家使用局内更衣室切换皮肤的情况
|
||||
|
||||
- 菜单切换会触发UpdatePlayerSkinClientEvent事件,开发者可以使用IsHighLevelOfficialSkin、IsOfficialSkin、IsHighLevelMultiJointOfficialSkin、IsMultiJointOfficialSkin接口进行调试与兼容
|
||||
|
||||
## 屏蔽我的伙伴功能
|
||||
|
||||
- 自本3.6版本Mod PC和1.1.48版本MC Studio开始,Mod PC开发者包和地图编辑器中挖矿将不会出现我的伙伴
|
||||
@@ -24,7 +24,7 @@ selection: 23
|
||||
|
||||

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

|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
## 关卡编辑器支持放置生物
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||

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

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

|
||||
|
||||
|
||||
BIN
mcguide/10-新内容/1-开发工作台/images/251126/1.1.48_1.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
mcguide/10-新内容/1-开发工作台/images/251126/1.1.48_2.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
mcguide/10-新内容/1-开发工作台/images/251126/1.1.48_3.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
mcguide/10-新内容/1-开发工作台/images/251126/1.1.48_4.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
mcguide/10-新内容/1-开发工作台/images/251126/1.1.48_5.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
@@ -5,8 +5,9 @@ time: 10分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 申请材料准备
|
||||
## 材料列表
|
||||
# 从零开始注册成为开发者
|
||||
## 申请材料准备
|
||||
### 材料列表
|
||||
入驻全过程中,共需要下列材料:
|
||||
- 1个网易邮箱账号(推荐是163邮箱,126邮箱无法被添加为协作成员)
|
||||
- 1个手机号码
|
||||
@@ -16,23 +17,23 @@ selection: true
|
||||
- 本人有效身份证
|
||||
- 本人开户的银行卡
|
||||
> 如果想注册企业开发者,也需要先注册个人开发者再转企业开发者。
|
||||
## 材料准备攻略
|
||||
### 材料准备攻略
|
||||
- 1.本人身份证号和姓名
|
||||
- 如果您不知道您的身份证号,请您拿出自己的二代身份证卡片,翻到背面(人像面),下方有【公民身份号码】,请将这18位的号码输入到输入框中,若知晓则直接填写。
|
||||
如果您不知道您的身份证号,请您拿出自己的二代身份证卡片,翻到背面(人像面),下方有【公民身份号码】,请将这18位的号码输入到输入框中,若知晓则直接填写。
|
||||
- 2.有效身份证
|
||||
- 如果您没有申领身份证,则请前往属地派出所申领您的身份证。若您的身份证已过期,则请前往属地派出所换领您的身份证。注册身份证必须在有效期内,若有则跳过。
|
||||
如果您没有申领身份证,则请前往属地派出所申领您的身份证。若您的身份证已过期,则请前往属地派出所换领您的身份证。注册身份证必须在有效期内,若有则跳过。
|
||||
- 3.QQ号
|
||||
- 前往QQ官网,下载客户端并注册QQ,将信息页面打开,复制自己的QQ号,若有则直接填写。
|
||||
前往QQ官网,下载客户端并注册QQ,将信息页面打开,复制自己的QQ号,若有则直接填写。
|
||||
- 4.网易邮箱账号
|
||||
- 前往[网易邮箱注册](https://zc.reg.163.com/regInitialized#/),注册一个账号,若有则跳过。
|
||||
前往[网易邮箱注册](https://zc.reg.163.com/regInitialized#/),注册一个账号,若有则跳过。
|
||||
- 5.手机号码
|
||||
- 前往营业厅办理1张手机卡,未成年人需要监护人办理,若有则跳过。
|
||||
前往营业厅办理1张手机卡,未成年人需要监护人办理,若有则跳过。
|
||||
- 6.本人开户的银行卡
|
||||
- 首先请先确定自己想要办哪家银行的银行卡,建议先在网上查询好哪家银行的网点比较近或比较好。
|
||||
首先请先确定自己想要办哪家银行的银行卡,建议先在网上查询好哪家银行的网点比较近或比较好。
|
||||
按照政策规定,16岁以下的未成年人办理银行卡需要监护人陪同办理,16岁以上、18岁以下的未成年人可以自行办理,也可以监护人陪同办理,18岁以上的成年人可以自行办理。**具体以各地区各银行各网点规定为准**
|
||||
- 然后,前往网点,说明是开户人是您,让工作人员帮您开户,开户成功给到卡片后,**请核实卡片是否为I类账户,开户人是否为您的名字**。(**若开户人不是本人,则会打款失败,若不是I类账户,则会有限额,收益过多时,会打款失败**)
|
||||
然后,前往网点,说明是开户人是您,让工作人员帮您开户,开户成功给到卡片后,**请核实卡片是否为I类账户,开户人是否为您的名字**。(**若开户人不是本人,则会打款失败,若不是I类账户,则会有限额,收益过多时,会打款失败**)
|
||||
- 至此银行卡办理流程结束,若有则跳过。
|
||||
# 如何注册开发者
|
||||
## 如何注册开发者
|
||||
|
||||
首先,在 **官网** 中找到注册页面([或点击此处直接进入开发者内容管理网址](https://mcdev.webapp.163.com/#/login) )
|
||||
|
||||
@@ -72,10 +73,10 @@ selection: true
|
||||
|
||||

|
||||
|
||||
# 如何个人开发者转企业开发者
|
||||
## 如何个人开发者转企业开发者
|
||||
1. 点击开发者平台右上角的头像,点击“申请企业开发者认证”。
|
||||
2. 提交认证信息,等待审核通过,一般在10个工作日内给结果。
|
||||
# 如何企业开发者转个人开发者
|
||||
## 如何企业开发者转个人开发者
|
||||
目前**不支持**手动转回个人开发者,需要等待年审提出转个人申请。
|
||||
## 开发者注册常见问题答疑
|
||||
|
||||
138
mcguide/12-入门教程/10-注册成为开发者.md
Normal file
@@ -0,0 +1,138 @@
|
||||
---
|
||||
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/),点击右上角 **【进入官网】** 按钮
|
||||
|
||||

|
||||
|
||||
2 - 在[新的网页](http://mc.163.com/index.html )中,点击 **【成为创造者】** 按钮,前往开发者平台注册页面
|
||||
|
||||

|
||||
|
||||
3 - 跳转至新的页面,根据提示填入信息和**真实姓名、身份证号(新增)**,并勾选同意《隐私协议》,点击 **【注册】** 按钮(注意:开发者昵称注册后每90天可以修改1次)。
|
||||
|
||||

|
||||
|
||||
> 每个信息的用途:
|
||||
>
|
||||
> 开发者邮箱:开发者账号的唯一标识符
|
||||
>
|
||||
> 开发者昵称:资源中心、开发者平台、MCStudio显示的昵称
|
||||
>
|
||||
> 手机号码:手机号码用于接收平台短信通知
|
||||
>
|
||||
> QQ号码:目前没有实际用途
|
||||
>
|
||||
> 真实姓名:实名认证
|
||||
>
|
||||
> 身份证号:实名认证
|
||||
|
||||
- 注:**1个身份证号只能实名1个开发者账号,请谨慎选择账号注册,注册后非特殊情况不支持修改,注销无法释放身份证信息。**
|
||||
|
||||
4 - 成功入驻后,需要进行银行卡认证,填写身份证、银行卡等信息,点击 **【申请银行卡认证】** 跳转至银行卡认证界面。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
如实完成以上信息的正确填写并提交后,随后等待 **实名认证审核** 即可,通过后就可以发布作品啦!
|
||||
|
||||

|
||||
|
||||
## 如何个人开发者转企业开发者
|
||||
|
||||
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主身份进行注册。**
|
||||
@@ -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>。
|
||||
|
||||
其余的教学内容简介详见官网——教学中心——网络游戏以及官网——在线课程——网络服插件教程。
|
||||
|
||||
|
||||
BIN
mcguide/12-入门教程/images/0 5.jpg
Normal file
|
After Width: | Height: | Size: 700 KiB |
BIN
mcguide/12-入门教程/images/0_5.png
Normal file
|
After Width: | Height: | Size: 415 KiB |
211
mcguide/16-美术/6-模型和动作/6-模型规范指南.md
Normal file
@@ -0,0 +1,211 @@
|
||||
---
|
||||
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规范进行制作
|
||||
|
||||

|
||||
### 其余注意事项
|
||||
|
||||
1. 除盔甲骨骼以外,其他骨骼下必须有同名cube。例如:
|
||||
|
||||

|
||||
|
||||
## 新增支持
|
||||
|
||||
### 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该测试皮肤不会生效
|
||||
|
||||
#### MC Studio
|
||||
|
||||
为方便开发者在 PC 端直接进行 4D 皮肤与模组的兼容性调试,MC Studio 在 3.6 版本起正式支持 4D 皮肤测试。开发者可以灵活选择手机端和MC Studio,进行模组与4D皮肤的兼容性测试
|
||||
|
||||
##### 新增皮肤介绍
|
||||
|
||||
| 皮肤名 | 皮肤品质 | 是否为多关节 | 皮肤预览 |
|
||||
|--------------|----------|--------------|--------------|
|
||||
| 4D测试皮肤 | 传说 | 是 | |
|
||||
| 黑洞之心 | 传说 | 否 | |
|
||||
| 云霄战姬 | 稀有 | 否 | |
|
||||
| 4D学生晴音 | 稀有 | 否 | |
|
||||
|
||||
##### 使用教程
|
||||
|
||||
更新MC Studio至1.1.48版本(发布日期:11月26日)
|
||||
|
||||
1. 新建开发测试
|
||||
|
||||
新建开发测试按钮,选择3.6(或以上)版本
|
||||
|
||||
注意:4D皮肤仅支持3.6及以上版本使用
|
||||
|
||||

|
||||
|
||||
选择下方的皮肤选项,可以看到除了默认的史蒂夫和爱丽克丝以外新增4款4D皮肤皮肤,选择皮肤后即可开始测试
|
||||
|
||||

|
||||
|
||||
2. 配置已有存档
|
||||
|
||||
对于已有的3.6测试存档,可以点击配置
|
||||
|
||||

|
||||
|
||||
在配置界面中可以切换下方的皮肤
|
||||
|
||||

|
||||
|
||||
3. 局内切换
|
||||
进入游戏时,会触发一次UpdatePlayerSkinClient客户端事件
|
||||
|
||||
点击右上角菜单,选择切换皮肤选项,即可选择其他4D皮肤
|
||||
|
||||

|
||||
|
||||
说明:
|
||||
|
||||
1.菜单切换4D皮肤是模拟玩家使用局内更衣室切换皮肤的情况
|
||||
|
||||
2.菜单切换会触发UpdatePlayerSkinClientEvent事件,开发者可以使用IsHighLevelOfficialSkin、IsOfficialSkin、IsHighLevelMultiJointOfficialSkin、IsMultiJointOfficialSkin接口进行调试与兼容
|
||||
BIN
mcguide/16-美术/6-模型和动作/resources/0_10.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_11.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_3.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_4.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_5.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_6.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_7.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_8.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
mcguide/16-美术/6-模型和动作/resources/0_9.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
157
mcguide/16-美术/6-模型和动作/模型规范指南.md
Normal 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规范进行制作
|
||||
|
||||

|
||||
### 其余注意事项
|
||||
|
||||
1. 除盔甲骨骼以外,其他骨骼下必须有同名cube。例如:
|
||||
|
||||

|
||||
|
||||
## 新增支持
|
||||
|
||||
### 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该测试皮肤不会生效
|
||||
|
||||
|
||||
@@ -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
|
||||
},
|
||||
...
|
||||
}
|
||||
|
||||
@@ -1188,12 +1188,6 @@ JSON如下:
|
||||
"size": [100, 100],
|
||||
"offset": "@UIDemo.animation_in",
|
||||
"texture": "textures/netease/common/image/default",
|
||||
"is_new_nine_slice": false,
|
||||
"nine_slice_buttom" : 0,
|
||||
"nine_slice_left" : 0,
|
||||
"nine_slice_right" : 0,
|
||||
"nine_slice_top" : 0,
|
||||
"nineslice_size" : [0, 0, 0, 0],
|
||||
"type": "image"
|
||||
},
|
||||
"animation_in": {
|
||||
@@ -1246,104 +1240,6 @@ button是按钮控件,按钮有四种状态,分别为default/hover/pressed/l
|
||||
下面是一个使用了三种状态的按钮,我们继承common.button里的属性,无需自己再定义default_control等属性。
|
||||
|
||||
```json
|
||||
{
|
||||
"button0@common.button" : {
|
||||
"$default_texture" : "textures/netease/common/button/default",
|
||||
"$hover_texture" : "textures/netease/common/button/hover",
|
||||
"$is_new_nine_slice" : false,
|
||||
"$label_color" : [ 1, 1, 1 ],
|
||||
"$label_font_scale_factor" : 1.0,
|
||||
"$label_font_size" : "large",
|
||||
"$label_layer" : 3,
|
||||
"$label_offset" : [ 0, 0 ],
|
||||
"$label_text" : "Button",
|
||||
"$nine_slice_buttom" : 0,
|
||||
"$nine_slice_left" : 0,
|
||||
"$nine_slice_right" : 0,
|
||||
"$nine_slice_top" : 0,
|
||||
"$nineslice_size" : [ 0, 0, 0, 0 ],
|
||||
"$pressed_button_name" : "%fpsBattle.click",
|
||||
"$pressed_texture" : "textures/netease/common/button/pressed",
|
||||
"$texture_layer" : 2,
|
||||
"anchor_from" : "center",
|
||||
"anchor_to" : "center",
|
||||
"is_handle_button_move_event" : true,
|
||||
"button_mappings" : [],
|
||||
"bindings" : [
|
||||
{
|
||||
"binding_collection_name" : "",
|
||||
"binding_condition" : "always_when_visible",
|
||||
"binding_type" : "collection_details"
|
||||
}
|
||||
],
|
||||
"controls" : [
|
||||
{
|
||||
"default@fpsBattle.default" : {}
|
||||
},
|
||||
{
|
||||
"hover@fpsBattle.hover" : {}
|
||||
},
|
||||
{
|
||||
"pressed@fpsBattle.pressed" : {}
|
||||
},
|
||||
{
|
||||
"button_label@fpsBattle.button_label" : {}
|
||||
}
|
||||
],
|
||||
"default_control" : "default",
|
||||
"hover_control" : "hover",
|
||||
"layer" : 3,
|
||||
"offset" : [ 0, 0 ],
|
||||
"pressed_control" : "pressed",
|
||||
"size" : [ 100, 50 ],
|
||||
"type" : "button",
|
||||
"visible" : true
|
||||
},
|
||||
"button_label" : {
|
||||
"color" : "$label_color",
|
||||
"font_scale_factor" : "$label_font_scale_factor",
|
||||
"font_size" : "$label_font_size",
|
||||
"font_type" : "smooth",
|
||||
"layer" : "$label_layer",
|
||||
"max_size" : [ "100%", "100%" ],
|
||||
"offset" : [ 0, 0 ],
|
||||
"shadow" : false,
|
||||
"text" : "$label_text",
|
||||
"text_alignment" : "center",
|
||||
"type" : "label"
|
||||
},
|
||||
"default" : {
|
||||
"is_new_nine_slice" : "$is_new_nine_slice",
|
||||
"layer" : "$texture_layer",
|
||||
"nine_slice_buttom" : "$nine_slice_buttom",
|
||||
"nine_slice_left" : "$nine_slice_left",
|
||||
"nine_slice_right" : "$nine_slice_right",
|
||||
"nine_slice_top" : "$nine_slice_top",
|
||||
"texture" : "$default_texture",
|
||||
"type" : "image"
|
||||
},
|
||||
"hover" : {
|
||||
"is_new_nine_slice" : "$is_new_nine_slice",
|
||||
"layer" : "$texture_layer",
|
||||
"nine_slice_buttom" : "$nine_slice_buttom",
|
||||
"nine_slice_left" : "$nine_slice_left",
|
||||
"nine_slice_right" : "$nine_slice_right",
|
||||
"nine_slice_top" : "$nine_slice_top",
|
||||
"texture" : "$hover_texture",
|
||||
"type" : "image"
|
||||
},
|
||||
"pressed" : {
|
||||
"is_new_nine_slice" : "$is_new_nine_slice",
|
||||
"layer" : "$texture_layer",
|
||||
"nine_slice_buttom" : "$nine_slice_buttom",
|
||||
"nine_slice_left" : "$nine_slice_left",
|
||||
"nine_slice_right" : "$nine_slice_right",
|
||||
"nine_slice_top" : "$nine_slice_top",
|
||||
"texture" : "$pressed_texture",
|
||||
"type" : "image"
|
||||
}
|
||||
}
|
||||
```
|
||||
"button0@common.button": {
|
||||
"size": [100, 50],
|
||||
"button_mappings": [], //和$pressed_button_name只能二选一
|
||||
@@ -2372,7 +2268,7 @@ hover事件的触发本质上是与鼠标悬浮相关,在PC模式中,当鼠
|
||||
|
||||
UI编辑器暂时不支持编辑
|
||||
|
||||
### MiniMap
|
||||
### mini\_map
|
||||
|
||||
该控件可以在UI上画小地图,需要继承mini_map命名空间下的mini_map_wrapper控件。
|
||||
|
||||
@@ -2423,290 +2319,19 @@ UI编辑器暂时不支持编辑
|
||||
| $face_icon_size | 脸部icon的大小,默认为[4,4] |
|
||||
| $face_icon_bg_color | 标记icon底部背景颜色,默认为白色 |
|
||||
| $highest_y | 绘制的高度最大值,默认当前区块的最大值,当该值为-1时,表示最大高度值为玩家当前位置所在的高度 |
|
||||
| enable_scissor_test | 超出父控件区域后是否裁剪,默认为false, [enable_scissor_test](https://wiki.bedrock.dev/json-ui/json-ui-documentation.html)|
|
||||
|
||||
### **颜色渐变控件(gradientRenderer)**
|
||||
|
||||
该控件可以用于在ui上绘制渐变颜色
|
||||
|
||||
```json
|
||||
{
|
||||
"gradient": {
|
||||
"color1": [1, 0, 1, 1],
|
||||
"color2": [0, 0, 1, 1],
|
||||
"gradient_direction": "vertical",
|
||||
"renderer": "gradient_renderer",
|
||||
"type": "custom"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
| 变量 | 解释 |
|
||||
| ------------------ | -------------------------------------- |
|
||||
| color1 | 渐变起始颜色的RGBA |
|
||||
| color2 | 渐变结束颜色的RGBA |
|
||||
| gradient_direction | 渐变方向,可选"vertical"或"horizontal" |
|
||||
| renderer | 需要指定为gradient_renderer |
|
||||
| type | 需要指定为custom |
|
||||
|
||||
<img src="./picture/IntroduceUI/IntroduceUI-50.png" alt="图片描述" style="display: block; margin-left: 0;" />
|
||||
|
||||
下图为UI编辑器中颜色渐变控件的属性编辑面板
|
||||
|
||||
<img src="./picture/IntroduceUI/IntroduceUI-51.png" alt="图片描述" style="display: block; margin-left: 0;" />
|
||||
|
||||
| 变量 | 解释 |
|
||||
| ------------ | ------------------------------------------------------ |
|
||||
| 渐变起始颜色 | 对应color1字段,支持调整不透明度(Alpha通道) |
|
||||
| 渐变结束颜色 | 对应color2字段,支持调整不透明度(Alpha通道) |
|
||||
| 渐变方向 | 对应gradient_direction字段,可选“垂直排布”或“水平排布” |
|
||||
### 继承控件
|
||||
|
||||
继承控件允许开发者选择并继承目标控件,继承成功后该控件拥有目标控件的所有属性,并可以重写其中任何一个属性的数据。
|
||||
|
||||
#### 继承写法简述
|
||||
|
||||
在界面json文件所有的编写技巧中,最为好用和灵活的功能当属继承写法。当界面中有一个需求,需要将若干个相同的控件按序排列,除了可以通过复制粘贴出若干个控件副本外,继承模板控件并只修改我们所需要修改的属性,其他的属性依然沿用模板控件的数据才是最便捷,也是最漂亮的写法。下面我们从一个简单的例子入手熟悉继承的写法,从例子中我们可以快速熟悉继承技巧。
|
||||
|
||||
```json
|
||||
{
|
||||
"main" : {
|
||||
"absorbs_input" : true,
|
||||
"always_accepts_input" : false,
|
||||
"controls" : [
|
||||
{
|
||||
"label0@myInherit.label0" : {}
|
||||
},
|
||||
{
|
||||
"inheritor0@myInherit.label0" : {
|
||||
"offset" : [ 10.0, 0.0 ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"inheritor1@myInherit.label0" : {
|
||||
"offset" : [ 20.0, 0.0 ]
|
||||
}
|
||||
}
|
||||
],
|
||||
"force_render_below" : false,
|
||||
"is_showing_menu" : true,
|
||||
"render_game_behind" : true,
|
||||
"render_only_when_topmost" : true,
|
||||
"should_steal_mouse" : false,
|
||||
"type" : "screen"
|
||||
},
|
||||
"label0" : {
|
||||
"anchor_from" : "center",
|
||||
"anchor_to" : "center",
|
||||
"color" : [ 1, 1, 1 ],
|
||||
"font_scale_factor" : 1.0,
|
||||
"font_size" : "normal",
|
||||
"font_type" : "smooth",
|
||||
"layer" : 0,
|
||||
"offset" : [ 0, 0 ],
|
||||
"shadow" : false,
|
||||
"size" : [ 100, 100 ],
|
||||
"text" : "Hello World!",
|
||||
"text_alignment" : "center",
|
||||
"type" : "label",
|
||||
"visible" : true
|
||||
},
|
||||
"namespace" : "myInherit"
|
||||
}
|
||||
```
|
||||
|
||||
该段json描述了在main画布中创建了一个文本控件label0,并使继承控件inherit0和inherit1均继承了label0控件,并重写了offset属性,在场景中就得到了三个文本控件,这三个文本控件除了在场景中的位置因为重写而不同外,其他的属性一模一样。但是要注意的是,可以被继承的控件必须写在json文件的最外层,和main处在同一层级,即一个命名空间下有且仅有一个该名称的控件,满足该条件的控件才可以被继承。
|
||||
#### UI编辑器中的继承
|
||||
|
||||
新版的UI编辑器对继承提供了更可视化的方法,请参考[继承和自定义控件](./13-继承和自定义控件.md)。
|
||||
|
||||
## Python编写说明
|
||||
|
||||
### 必要的属性
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
ViewBinder = clientApi.GetViewBinderCls()
|
||||
ViewRequest = clientApi.GetViewViewRequestCls()
|
||||
ScreenNode = clientApi.GetScreenNodeCls()
|
||||
```
|
||||
| 变量 | 解释 |
|
||||
| :------------: | :----------------------------------- |
|
||||
| extraClientApi | 我们开发的Client端Api接口文件 |
|
||||
| ViewBinder | 用于绑定回调函数的类型和响应的方法 |
|
||||
| ViewRequest | 用于返回绑定函数的返回值 |
|
||||
| ScreenNode | UI的基类,用于继承基类的方法和UI管理 |
|
||||
|
||||
### UI界面初始化
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
|
||||
ScreenNode = clientApi.GetScreenNodeCls()
|
||||
|
||||
class TestScreen(ScreenNode):
|
||||
def __init__(self, namespace, name, param):
|
||||
ScreenNode.__init__(self, namespace, name, param)
|
||||
```
|
||||
|
||||
ScreenNode是我们的UI节点基类,必须继承。
|
||||
|
||||
```python
|
||||
# Bind Type
|
||||
class ViewBinder(object):
|
||||
ButtonFilter = 0x10000000
|
||||
BF_ButtonClickUp = 0 | ButtonFilter
|
||||
BF_ButtonClickDown = 1 | ButtonFilter
|
||||
BF_ButtonClick = 2 | ButtonFilter
|
||||
BF_ButtonClickCancel = 3
|
||||
BF_InteractButtonClick = 4
|
||||
BindFilter = 0x01000000
|
||||
BF_BindBool = 5 | BindFilter
|
||||
BF_BindInt = 6 | BindFilter
|
||||
BF_BindFloat = 7 | BindFilter
|
||||
BF_BindString = 8 | BindFilter
|
||||
BF_BindGridSize = 9 | BindFilter
|
||||
BF_BindColor = 10 | BindFilter
|
||||
EditFilter = 0x00100000
|
||||
BF_EditChanged = 11 | EditFilter
|
||||
BF_EditFinished = 12 | EditFilter
|
||||
ToggleFilter = 0x00010000
|
||||
BF_ToggleChanged = 13 | ToggleFilter
|
||||
|
||||
# Return Type
|
||||
class ViewRequest(object):
|
||||
Nothing = 0
|
||||
Refresh = 1 << 0
|
||||
PointerHeldEventsRequest = 1 << 1
|
||||
PointerHeldEventsCancel = 1 << 2
|
||||
Exit = 1 << 3
|
||||
```
|
||||
### UI绑定和返回
|
||||
|
||||
UI的绑定分为binding单个绑定和binding_collection集合绑定,适合集合容器。
|
||||
|
||||
| 绑定类型 | 绑定方式 | 解释 |
|
||||
| :--------------------- | :---------------------------: | :------------------------------------- |
|
||||
| BF_ButtonClickUp | binding | 绑定按钮的Up事件 |
|
||||
| BF_ButtonClickDown | binding | 绑定按钮的Down事件 |
|
||||
| BF_ButtonClick | binding | 同时绑定Up和Down事件 |
|
||||
| BF_ButtonClickCancel | binding | 绑定按钮的Cancel事件(按钮down其他up) |
|
||||
| BF_InteractButtonClick | binding | 绑定游戏原生的按钮点击事件 |
|
||||
| BF_BindBool | binding \| binding_collection | 绑定Bool变量 |
|
||||
| BF_BindInt | binding \| binding_collection | 绑定Int变量 |
|
||||
| BF_BindFloat | binding \| binding_collection | 绑定Float变量 |
|
||||
| BF_BindString | binding \| binding_collection | 绑定String变量 |
|
||||
| BF_BindGridSize | binding | 绑定GridSize变量 |
|
||||
| BF_BindColor | binding \| binding_collection | 绑定颜色变量 |
|
||||
| BF_EditChanged | binding | 绑定输入框输入改变事件 |
|
||||
| BF_EditFinished | binding | 绑定输入框输入完成事件 |
|
||||
| BF_ToggleChanged | binding | 开关状态改变事件 |
|
||||
|
||||
**binding(bind_flag, binding_name = None)**
|
||||
|
||||
bind_flag为上文中绑定类型,binding_name为绑定名称。
|
||||
|
||||
binding_name为脚本绑定变量,binding_name_override为引擎变量,json格式如下
|
||||
|
||||
```json
|
||||
{
|
||||
"bindings": [
|
||||
{
|
||||
"binding_condition" : "always",
|
||||
"binding_name" : "#scoreboard_grid.item_count",
|
||||
"binding_name_override" : "#StackGridItemsCount"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
对应的Python代码如下
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
|
||||
ViewBinder = clientApi.GetViewBinderCls()
|
||||
|
||||
@ViewBinder.binding(ViewBinder.BF_BindInt, "#scoreboard_grid.item_count")
|
||||
def OnStarkGridResize(self):
|
||||
return len(self.scoreBoardList)
|
||||
```
|
||||
|
||||
**binding_collection(bind_flag, collection_name, binding_name = None)**
|
||||
|
||||
bind_flag为上文中的绑定类型,collection_name为集合名称,binding_name为绑定的变量名称。
|
||||
|
||||
集合的json如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"collection_name" : "scoreboard_stackgrid"
|
||||
}
|
||||
```
|
||||
|
||||
在集合的子控件中,binding_collection_name为集合名,binding_condition为绑定条件,binding_name为绑定名称,binding_type为collection绑定,property_bag设置他的初始值,text为它的绑定值。
|
||||
|
||||
```json
|
||||
{
|
||||
"label_score_board" : {
|
||||
"bindings" : [
|
||||
{
|
||||
"binding_collection_name" : "scoreboard_stackgrid",
|
||||
"binding_condition" : "always",
|
||||
"binding_name" : "#label_score_board.text",
|
||||
"binding_type" : "collection"
|
||||
}
|
||||
],
|
||||
"offset" : [ "0%+0 px", "0%+0px" ],
|
||||
"property_bag" : {
|
||||
"#label_score_board.text" : "666666666666"
|
||||
},
|
||||
"text" : "#label_score_board.text",
|
||||
"text_alignment" : "left",
|
||||
"type" : "label",
|
||||
"visible" : true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
对应的Python代码如下,其中index表示在集合中的哪一元素。
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
|
||||
ViewBinder = clientApi.GetViewBinderCls()
|
||||
|
||||
@ViewBinder.binding_collection(ViewBinder.BF_BindString, "scoreboard_stackgrid", "#label_score_board.text")
|
||||
def OnRefreshScoreBoardLabel(self, index):
|
||||
return self.scoreBoardList[index] if len(self.scoreBoardList) > index else ""
|
||||
```
|
||||
## 接口调用说明
|
||||
|
||||
### 参数命名说明
|
||||
|
||||
@Mod.Binding(name = myModName, version = myModVersion)
|
||||
|
||||
| 参数 | 类型 | 解释 |
|
||||
| :----------: | :--: | :------ |
|
||||
| myModName | str | Mod名称 |
|
||||
| myModVersion | str | Mod版本 |
|
||||
|
||||
假设设置Mod名称为"myModName",示例:
|
||||
```python
|
||||
from mod.common.mod import Mod
|
||||
@Mod.Binding(name = "myModName", version = "0.1")
|
||||
class MyModClass(object):
|
||||
def __init__(self):
|
||||
pass
|
||||
```
|
||||
|
||||
### 界面创建流程及生命周期
|
||||
### 界面创建流程
|
||||
|
||||
界面在<a href="../../mcdocs/1-ModAPI/事件/UI.html#uiinitfinished" rel="noopenner"> UiInitFinished </a>事件发送之后就可以开始创建
|
||||
|
||||
创建UI的第一步是UI的注册,通过调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#registerui" rel="noopenner"> RegisterUI </a>接口,将想开启UI的相关数据进行注册。同一UI只需要注册一次即可
|
||||
创建UI的第一步是UI的注册,通过调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#registerui" rel="noopenner"> RegisterUI </a>接口,传入UI类路径和JSON控件路径注册UI,同一UI只需要注册一次即可。
|
||||
|
||||
注册完成之后就可以在需要的时候实例化UI,可使用的接口有<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#createui" rel="noopenner"> CreateUI </a>和<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>两种。使用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#createui" rel="noopenner"> CreateUI </a>生成的界面都生成在操作UI下,不同的生成参数UI层级不同,而使用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>生成的界面以堆栈管理的方式生成,该界面生成时上一个<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>生成的界面就会被隐藏。值得注意的是,MC原生界面(比如暂停界面,背包界面等)也是类似<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>的方式加载进来,并以堆栈管理。
|
||||
|
||||
在UI创建完成之后,可以调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#getui" rel="noopenner"> GetUI </a>接口拿到UI对应的ScreenNode实例。
|
||||
|
||||
如果想获取MC原生界面的实例,则需要监听原生界面Push进来的事件<a href="../../mcdocs/1-ModAPI/事件/UI.html#pushscreenevent" rel="noopenner"> PushScreenEvent </a>,然后在事件回调中调用接口<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#gettoppushedui" rel="noopenner"> GetTopPushedUI </a>。
|
||||
|
||||
每个ScreenNode都有生命周期函数,生命周期函数会被自动在以下情况下调用,重写函数可以完成一些逻辑。
|
||||
@@ -2716,9 +2341,38 @@ class MyModClass(object):
|
||||
| <a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#create" rel="noopenner"> Create </a> | UI创建成功时调用 |
|
||||
| <a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#onactive" rel="noopenner"> OnActive </a> | UI重新回到栈顶时调用 |
|
||||
| <a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#ondeactive" rel="noopenner"> OnDeactive </a> | 栈顶UI有其他UI入栈时调用 |
|
||||
| <a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#update" rel="noopenner"> Update </a> | 客户端每帧调用,1秒有30帧 |
|
||||
| <a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#destroy" rel="noopenner"> Destroy </a> | UI销毁时调用 |
|
||||
|
||||
最后,当UI需要销毁时,可以调用ScreenNode实例的<a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#setremove" rel="noopenner"> SetRemove </a>接口,此外使用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>接口创建的界面还可以使用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#popscreen" rel="noopenner"> PopScreen </a>接口进行销毁。
|
||||
|
||||
### 编写UI类
|
||||
|
||||
UI类用于编写界面逻辑,需要在<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#registerui" rel="noopenner"> RegisterUI </a>时传入UI类的路径。一个客户端类可以对应多个UI类。UI类一般包含以下内容:
|
||||
|
||||
```python
|
||||
import client.extraClientApi as clientApi
|
||||
ScreenNode = clientApi.GetScreenNodeCls()
|
||||
ViewBinder = clientApi.GetViewBinderCls()
|
||||
ViewRequest = clientApi.GetViewViewRequestCls()
|
||||
Client = clientApi.GetSystem('xxxxMod', 'xxxxClientSystem')
|
||||
CF = clientApi.GetEngineCompFactory()
|
||||
PID = clientApi.GetLocalPlayerId()
|
||||
|
||||
class uiName(ScreenNode):
|
||||
def __init__(self, namespace, name, param):
|
||||
ScreenNode.__init__(self, namespace, name, param)
|
||||
|
||||
def Create(self):
|
||||
pass
|
||||
|
||||
def Destroy(self):
|
||||
pass
|
||||
|
||||
def Update(self):
|
||||
pass
|
||||
```
|
||||
|
||||
| 变量 | 解释 |
|
||||
| :------------: | :----------------------------------- |
|
||||
| extraClientApi | 我们开发的Client端Api接口文件 |
|
||||
@@ -2858,11 +2512,9 @@ button_data: {
|
||||
在字符串中嵌入`<link>link_data</link>`样式会被解析成超链接,外观和普通文本无异但可以被点击,link_data为特殊化数据,开发者可以在其中添加符合JSON格式的自定义数据,在点击富文本中对应超链接时会将link_data通过回调函数整个返回,以下属性为必须属性,text表示显示文本,format_code表示该段显示文本的样式代码,注意,基岩版的文本控件不支持下划线和删除线。
|
||||
|
||||
```json
|
||||
{
|
||||
"link_data":{
|
||||
"text":"末影人",
|
||||
"format_code":"§2"
|
||||
}
|
||||
link_data: {
|
||||
"text": "末影人",
|
||||
"format_code": "§2"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -168,6 +168,115 @@ time: 分钟
|
||||
|
||||
指定语言文件键,用于映射鼠标悬停在物品栏和快捷栏中的方块物品上时显示的文本。如果给定的字符串无法解析为本地字符串,则将显示给定的原始字符串。使用需要方块行为的 `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
|
||||
@@ -303,7 +412,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>事件给方块附加逻辑。
|
||||
|
||||
| 键 | 类型 | 默认值 | 解释 |
|
||||
| ------------ | ----- | ------ | ------ |
|
||||
|
||||
@@ -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 | 屏蔽所有原版结构 | 选择性屏蔽原版结构,示例见下方,支持主世界、下界、末地维度类型 |
|
||||
|
||||
@@ -228,7 +228,7 @@ time: 分钟
|
||||
| 字段 | 名称 | 描述 |
|
||||
| --------- | -------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| tags | 配方标签 | 请填写“smithing_table” |
|
||||
| template | 锻造模板 | 可不填,执行转换操作所需的锻造模板,物品需要具有minecraft:transform_materials标签才能放入对应槽位 |
|
||||
| template | 锻造模板 | 可不填,执行转换操作所需的锻造模板,物品需要具有minecraft:transform_templates标签才能放入对应槽位 |
|
||||
| base | 输入物品 | 要转换的物品。输入物品的属性将被复制到输出物品,物品需要具有minecraft:transformable_items标签才能放入对应槽位,例如原版盔甲和工具 |
|
||||
| addition | 转换材料 | 转换所需的材料。目前只支持minecraft:netherite_ingot(下界合金锭) |
|
||||
| result | 输出物品 | 转换后的结果物品 |
|
||||
|
||||
@@ -57,7 +57,7 @@ selection: true
|
||||
|format_version|str||格式版本,请填写0.0.1|
|
||||
|name|str||指令名称,例如gamemode|
|
||||
|description|str||指令描述,也支持在语言文件(例如zh_CN.lang)中定义|
|
||||
|permission_level|str|权限等级,可选game_directors、admin、host、owner、any,具体含义如下<br>game_directors:任何操作员都可以运行此命令,包括命令方块<br>admin:任何操作员都可以运行此命令,但命令方块不能<br>host:任何服务器主机都可以运行此命令<br>owner:只有专用服务器可以运行此命令<br>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的参数说明如下
|
||||
|
||||
|
||||
@@ -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值的自动同步
|
||||
|
||||
### 工作原理
|
||||
|
||||
@@ -92,32 +92,33 @@ playerId = clientApi.GetLocalPlayerId()
|
||||
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)
|
||||
modAttr.RegisterUpdateFunc("playerIsCreateFlying", self.PlayerCreateFlyStateChanged)
|
||||
modAttr.RegisterUpdateFunc("playerIsElytraFlying", self.PlayerElytraFlyStateChanged)
|
||||
for attr, query in queryDict.items():
|
||||
ClientComp.CreateModAttr(playerId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
|
||||
|
||||
def OnAddPlayerAOIClient(self, args):
|
||||
"""玩家加入游戏或进入视野时触发,注册属性值变化回调"""
|
||||
pId = args["playerId"]
|
||||
modAttr = ClientComp.CreateModAttr(pId)
|
||||
modAttr.RegisterUpdateFunc("playerIsCreateFlying", self.PlayerCreateFlyStateChanged)
|
||||
modAttr.RegisterUpdateFunc("playerIsElytraFlying", self.PlayerElytraFlyStateChanged)
|
||||
|
||||
def PlayerCreateFlyStateChanged(self, args):
|
||||
"""创造飞行状态变化回调"""
|
||||
molangVar = args["newValue"] # 属性变化后的值
|
||||
pId = args["entityId"] # 属性变化对应的实体Id
|
||||
ClientComp.CreateQueryVariable(pId).Set("query.mod.ysm_is_create_flying", molangVar)
|
||||
|
||||
def PlayerElytraFlyStateChanged(self, args):
|
||||
"""鞘翅飞行状态变化回调"""
|
||||
molangVar = args["newValue"] # 属性变化后的值
|
||||
pId = args["entityId"] # 属性变化对应的实体Id
|
||||
ClientComp.CreateQueryVariable(pId).Set("query.mod.ysm_is_elytra_flying", molangVar)
|
||||
for attr, query in queryDict.items():
|
||||
ClientComp.CreateModAttr(pId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
|
||||
```
|
||||
|
||||
### 工作流程说明
|
||||
|
||||
103
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/0-Nukkit开服教程.md
Normal 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,不要额外套一层文件夹
|
||||

|
||||
|
||||
## 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)
|
||||
107
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/0-Nukkit部署教程.md
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 60分钟
|
||||
---
|
||||
|
||||
# Nukkit部署教程
|
||||
|
||||
## 前言
|
||||
本文默认认为你了解过Nukkit 或者 通过Waterdogpe + Nukkit搭建过第三方服务器。
|
||||
|
||||
如果你没有了解过,请移步到 [2-Nukkit开服教程](2-Server.properties详解.md)
|
||||
|
||||
特别鸣谢(排名不分先后): LT_Name(NukkitMOT作者)、bbbroken(EaseCation服务器开发者)、亦染(社区支持者)
|
||||
|
||||
## 准备阶段
|
||||
1. 准备Java版本,建议Java版本为Java17及以上版本
|
||||
2. 准备NukkitMOT分支,NukkitMOT原作者已将中国版打包到github主分支内 https://github.com/MemoriesOfTime/Nukkit-MOT
|
||||
> 目前仅支持接入Nukkit-MOT,其他分支可自行通过参考NukkitMOT源码进行对接
|
||||
3. 准备 WaterDogPE 代理服务端而。WaterdogPE 已兼容中国版,开源仓库是: https://github.com/MCNeteaseDevs/WaterdogPE_Netease/tree/netease。
|
||||
|
||||
|
||||
## 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,不要额外套一层文件夹
|
||||

|
||||
|
||||
## 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)
|
||||
278
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/1-NukkitMasterAPI文档.md
Normal file
@@ -0,0 +1,278 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 60分钟
|
||||
---
|
||||
|
||||
# NukkitMaster文档
|
||||
|
||||
## 准备阶段
|
||||
|
||||
在部署Nukkit服务器之前,您需要阅读一下NukkitMaster的API来进行基本的ModSDK通信与商业化内容接入。
|
||||
NukkitMaster需要安装在Nukkit-MOT服务端中。
|
||||
|
||||
> 需要注意: NukkitMaster是基于Nukkit-MOT分支进行开发的。Nukkit官方服务端版本无法兼容。
|
||||
|
||||
> 如果您需要使用其他分支的Nukkit,您可以参考NukkitMOT源码仓库修改的内容而自行修改服务端以兼容中国版的协议。
|
||||
> 通信内容方面,您可以自行反编译NukkitMaster来兼容您的其他分支的Nukkit服务端。
|
||||
|
||||
> 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完成事件
|
||||
271
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/10-NukkitMasterAPI文档.md
Normal 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完成事件
|
||||
974
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/2-Server.properties详解.md
Normal file
@@ -0,0 +1,974 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 60分钟
|
||||
---
|
||||
|
||||
# server.properties参数解释
|
||||
|
||||
## 前言
|
||||
|
||||
作者:LT_Name
|
||||
原文: [server.properties](https://www.nukkit-mot.com/zh/docs/server-config/server-properties)
|
||||
|
||||
修改服务器的运行配置,以此来定制一些基本功能。
|
||||
|
||||
## `server-ip`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|---------|
|
||||
| String | 0.0.0.0 |
|
||||
|
||||
服务器的IP
|
||||
|
||||
## `server-port`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-------|
|
||||
| Integer | 19132 |
|
||||
|
||||
服务器的端口
|
||||
|
||||
> 同一端口不能运行多个服务器
|
||||
如果不能访问请检查防火墙
|
||||
基岩版使用 UDP
|
||||
|
||||
## `enable-query`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用 Query 查询
|
||||
详见:https://wiki.vg/Query
|
||||
|
||||
## `motd`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|------------------|
|
||||
| String | Minecraft Server |
|
||||
|
||||
服务器名称/显示在服务器列表上的文本
|
||||
|
||||
## `sub-motd`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----------------------|
|
||||
| String | Powered by Nukkit-MOT |
|
||||
|
||||
motd 的第二行
|
||||
|
||||
> 只有当在游戏中的好友列表中查看服务器时,才会显示给本地网络中的玩家
|
||||
自 1.16.210 以来不能为空
|
||||
|
||||
## `view-distance`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 8 |
|
||||
|
||||
最大视距(以区块为单位)
|
||||
更大的值 = 加载更多区块 = 更多的内存和 CPU 使用
|
||||
|
||||
## `achievements`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用玩家成就
|
||||
|
||||
## `announce-player-achievements`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
向所有玩家广播获得成就的消息
|
||||
|
||||
## `spawn-protection`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 10 |
|
||||
|
||||
非管理员(OP)玩家无法在区块内建造或破坏方块的生成保护区域大小(以方块为单位)
|
||||
|
||||
## `max-players`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 50 |
|
||||
|
||||
服务器允许的最大玩家人数
|
||||
|
||||
## `drop-spawners`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
刷怪笼被挖掘后掉落
|
||||
|
||||
## `spawn-animals`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用动物生成
|
||||
|
||||
## `spawn-mobs`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用怪物生成
|
||||
|
||||
## `gamemode`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 2 |
|
||||
|
||||
服务器的默认游戏模式
|
||||
0 = 生存, 1 = 创造, 2 = 冒险, 3 = 旁观
|
||||
|
||||
## `force-gamemode`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
每次加入时将玩家游戏模式设置为默认游戏模式
|
||||
|
||||
## `difficulty`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 2 |
|
||||
|
||||
服务器的默认难度(0-3)
|
||||
|
||||
## `hardcore`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
玩家死亡后将其封禁
|
||||
|
||||
## `pvp`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
是否启用玩家对战
|
||||
|
||||
## `white-list`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
仅允许白名单中的玩家加入服务器
|
||||
使用`/whitelist`命令或修改 `white-list.txt` 来添加玩家到白名单
|
||||
|
||||
## `whitelist-reason`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|------------------------|
|
||||
| String | Server is white-listed |
|
||||
|
||||
启用白名单的原因,显示给被阻挡在外的玩家
|
||||
|
||||
## `generator-settings`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
默认级别的特殊世界生成器设置
|
||||
|
||||
## `level-name`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-------|
|
||||
| String | world |
|
||||
|
||||
默认世界的名称
|
||||
|
||||
## `level-seed`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
默认世界的种子
|
||||
|
||||
## `level-type`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|------|
|
||||
| String | void |
|
||||
|
||||
如果默认世界不存在,则使用的生成器
|
||||
默认支持:default, normal, flat, nether, the_end或void
|
||||
|
||||
## `enable-rcon`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用远程控制台访问
|
||||
|
||||
> RCON 不是一个非常安全的远程控制服务器的方式
|
||||
RCON 可以使用与服务器相同的端口(TCP 协议)
|
||||
详见:https://developer.valvesoftware.com/wiki/Source_RCON_Protocol
|
||||
|
||||
## `rcon.password`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|---------|
|
||||
| String | 随机10位字符 |
|
||||
|
||||
RCON 连接的密码
|
||||
|
||||
## `rcon.port`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-------|
|
||||
| Integer | 25575 |
|
||||
|
||||
RCON 连接的端口
|
||||
|
||||
## `auto-save`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
自动保存世界、玩家数据
|
||||
|
||||
> 如果禁用,则对世界的更改不会自动保存,即使在卸载时也是如此,如果需要可以使用插件手动保存
|
||||
|
||||
您可以使用 `worlds-level-auto-save-disabled` 仅禁用自动保存世界
|
||||
|
||||
## `force-resources`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
强制玩家下载服务器的资源包后才能加入
|
||||
还请参阅 `force-resources-allow-client-packs`
|
||||
|
||||
## `force-resources-allow-client-packs`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
在启用 `force-resources` 时不要禁用客户端自己的资源包
|
||||
|
||||
## `xbox-auth`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
需要经过 Xbox 帐户验证后才能加入
|
||||
|
||||
> 不会绕过客户端的限制条件。
|
||||
如果您选择禁用此功能(不推荐这样做),请在玩家名称和 UUIDs 传递给权限管理器或管理员之后,以确保它们已经得到了验证。
|
||||
|
||||
## `encryption`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用网络加密
|
||||
如果不使用代理软件,则建议启用此功能
|
||||
|
||||
## `bed-spawnpoints`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许玩家使用床和重生锚设置重生点
|
||||
|
||||
## `explosion-break-blocks`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用爆炸对方块造成的破坏
|
||||
影响所有爆炸,如 TNT、苦力怕和末影水晶
|
||||
|
||||
## `stop-in-game`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许 OP 在游戏中使用 `/stop` 命令
|
||||
|
||||
## `op-in-game`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许 OP 在游戏中使用 `/op` 命令对其他玩家进行操作
|
||||
|
||||
## `space-name-mode`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|--------|
|
||||
| String | ignore |
|
||||
|
||||
玩家名称中带有空格的处理方式
|
||||
"disabled" - 禁止带有空格名称的玩家进入服务器
|
||||
"ignore" - 忽略空格名称 (默认)
|
||||
"replacing" - 用"_"替换玩家名称中的空格
|
||||
|
||||
## `xp-bottles-on-creative`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许创造模式下玩家扔经验瓶
|
||||
|
||||
## `spawn-eggs`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用刷怪蛋,允许通过刷怪蛋生成实体
|
||||
|
||||
## `mob-ai`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用 MobPlugin 的生物 AI
|
||||
|
||||
## `entity-auto-spawn-task`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用自动生成怪物和动物的任务
|
||||
生成功能依据服务器的游戏难度来工作
|
||||
注意:如果您希望生成任何生物,必须启用`spawn-animals`、`spawn-mobs`其一,或者两者都启用。
|
||||
|
||||
## `entity-despawn-task`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
若启用,则没有使用命名牌命名的生物的会自动消失
|
||||
|
||||
> 末影龙、凋灵和村民不会消失
|
||||
|
||||
## `language`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | eng |
|
||||
|
||||
Nukkit 使用的默认语言
|
||||
|
||||
## `force-language`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
强制使用服务器端翻译
|
||||
只有在你有插件来实现这些翻译时才启用
|
||||
|
||||
## `shutdown-message`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|---------------|
|
||||
| String | Server closed |
|
||||
|
||||
当您停止服务器时向玩家显示的消息
|
||||
可以使用颜色符号`§`,换行请使用 `§n`。
|
||||
|
||||
## `save-player-data`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
如果启用,则以其UUID保存玩家数据的格式,并自动将旧格式的玩家数据转换为新格式
|
||||
如果使用旧版Waterdog代理,请禁用此功能
|
||||
如果存在新的玩家数据,请勿禁用
|
||||
|
||||
## `query-plugins`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
若启用则 Query 查询可以获取插件列表(enable-query=on)
|
||||
|
||||
## `debug-level`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 1 |
|
||||
|
||||
如果您想要更多的调试日志记录,请设置较高的值(1-3)
|
||||
|
||||
## `async-workers`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|------|
|
||||
| String | auto |
|
||||
|
||||
异步工作线程数
|
||||
如果设置为 auto,则会尝试自动检测核心数进行调整
|
||||
|
||||
## `zlib-provider`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 2 |
|
||||
|
||||
选择 zlib 提供程序
|
||||
0 = ZlibOriginal,1 = ZlibSingleThreadLowMem,2 = ZlibThreadLocal
|
||||
默认:2
|
||||
其他提供程序可能会对服务器的性能产生负面影响
|
||||
|
||||
## `compression-level`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 4 |
|
||||
|
||||
发送数据包的 Zlib 压缩级别(0-9)
|
||||
更高的值 = 更多的 CPU 占用 + 更少的网络占用
|
||||
|
||||
## `compression-threshold`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 256 |
|
||||
|
||||
不要压缩小于此值的批处理数据包(仅限Zlib)
|
||||
|
||||
## `use-snappy-compression`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
使用 Snappy 压缩数据包
|
||||
|
||||
## ~~min-mtu~~
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 576 |
|
||||
|
||||
~~设置最小 MTU 大小~~
|
||||
~~默认值:576~~
|
||||
|
||||
## ~~max-mtu~~
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|------|
|
||||
| Integer | 1492 |
|
||||
|
||||
~~设置最大 MTU 大小(576 - 1492)~~
|
||||
~~值越大网络发包越高效,但较小的值或许可以解决某些连接上的问题。~~
|
||||
|
||||
## `rak-packet-limit`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 120 |
|
||||
|
||||
每个ip可以在一个 RakNet 周期(10ms)内发送的数据包数量
|
||||
超过此限制的ip将被暂时封禁
|
||||
|
||||
## `enable-rak-send-cookie`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Boolean | on |
|
||||
|
||||
启用此选项后,服务器会在客户端连接时发送一个 Cookie,用于验证客户端的合法性。
|
||||
这将增强连接的安全性,防止潜在的恶意连接或攻击。
|
||||
|
||||
## `timeout-milliseconds`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-------|
|
||||
| Integer | 25000 |
|
||||
|
||||
如果客户端没有响应,服务器应该等待多长时间后踢出玩家
|
||||
单位为毫秒,1000 毫秒 = 1 秒
|
||||
|
||||
## `auto-tick-rate`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许服务器自动调整世界游戏刻以维持每秒 20 个游戏刻
|
||||
|
||||
## `auto-tick-rate-limit`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 20 |
|
||||
|
||||
服务器可以临时降低游戏刻速率到多少
|
||||
|
||||
## `base-tick-rate`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 1 |
|
||||
|
||||
基础游戏刻速率
|
||||
1 = 每秒 20 个刻度,2 = 每秒 10 个刻度,以此类推。
|
||||
建议保持默认值(1)。
|
||||
|
||||
## `always-tick-players`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
始终对玩家进行游戏刻更新
|
||||
|
||||
## `light-updates`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
光照更新
|
||||
|
||||
## `clear-chunk-tick-list`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许服务器在完成每个游戏刻的逻辑更新后,清空用于追踪哪些区块需要进行逻辑更新的列表 `chunkTickList`。
|
||||
这可以帮助优化服务器性能,防止不必要的计算,特别是在大型服务器或有大量区块需要管理的情况下。
|
||||
|
||||
## `spawn-threshold`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 56 |
|
||||
|
||||
在生成玩家之前需要加载多少个区块
|
||||
|
||||
## `chunk-sending-per-tick`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 4 |
|
||||
|
||||
每游戏刻发送的区块数
|
||||
|
||||
## `chunk-ticking-per-tick`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 40 |
|
||||
|
||||
每游戏刻 `chunkTickList` 存储的区块数
|
||||
|
||||
## `chunk-ticking-radius`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Integer | 3 |
|
||||
|
||||
玩家周围需要进行刻算的区块半径
|
||||
|
||||
## `chunk-generation-queue-size`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Integer | 8 |
|
||||
|
||||
等待生成的区块数量
|
||||
|
||||
## `chunk-generation-population-queue-size`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Integer | 8 |
|
||||
|
||||
等待填充的区块数量
|
||||
|
||||
## `ticks-per-autosave`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Integer | 6000 |
|
||||
|
||||
世界自动保存任务运行的频率
|
||||
以刻为单位,20刻 = 1秒
|
||||
|
||||
## `ticks-per-entity-spawns`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Integer | 200 |
|
||||
|
||||
实体自动生成任务运行的频率
|
||||
以刻为单位,20刻 = 1秒
|
||||
|
||||
## `ticks-per-entity-despawns`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Integer | 12000 |
|
||||
|
||||
实体存活的时间
|
||||
以刻为单位,20刻 = 1秒
|
||||
|
||||
## `thread-watchdog`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用线程看门狗
|
||||
|
||||
## `thread-watchdog-tick`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-------|
|
||||
| Integer | 60000 |
|
||||
|
||||
如果 Nukkit-MOT 主线程暂停超过 60000 毫秒,会抛出致命错误并终止执行的毫秒数
|
||||
|
||||
## `nether`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
生成地狱世界
|
||||
|
||||
## `end`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
生成末地世界
|
||||
|
||||
## `vanilla-portals`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
原版传送门
|
||||
|
||||
## `portal-ticks`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 80 |
|
||||
|
||||
玩家触发传送门所需Tick
|
||||
|
||||
## `multi-nether-worlds`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
如果你需要多个地狱世界,在这里列出应该有自己地狱的世界,否则使用默认的地狱世界
|
||||
|
||||
## `anti-xray-worlds`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
启用内置反矿透的世界列表
|
||||
|
||||
示例:`world, survival, factions`
|
||||
|
||||
## `do-not-tick-worlds`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
禁用随机方块刻度的世界列表
|
||||
这将禁用植物生长、树叶腐烂、草方块蔓延、方块掉落等。
|
||||
你可能想在这里添加你的大堂和迷你游戏世界
|
||||
|
||||
## `worlds-entity-spawning-disabled`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
不允许实体自动生成的世界列表
|
||||
|
||||
示例:`lobby, pvp, creative`
|
||||
|
||||
## `load-all-worlds`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
加载所有世界
|
||||
|
||||
## `ansi-title`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用在 Windows CMD 标题中显示服务器占用信息
|
||||
<Image img={require('@site/static/images/server-config/windows_cmd_title.png')} alt="Windows 命令行标题" />
|
||||
|
||||
## `block-listener`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用用于雪块、铁傀儡、怪物蛋石等的检查
|
||||
|
||||
## `allow-flight`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用/禁用飞行反作弊
|
||||
|
||||
## `multiversion-min-protocol`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 0 |
|
||||
|
||||
多版本的最低协议
|
||||
|
||||
## `multiversion-max-protocol`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | -1 |
|
||||
|
||||
多版本的最高协议
|
||||
|
||||
## `vanilla-bossbars`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
显示凋零和末影龙的Boss血条(实验性)
|
||||
|
||||
## `strong-ip-bans`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
强制 IP 封禁
|
||||
|
||||
## `worlds-level-auto-save-disabled`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
禁用自动保存
|
||||
等级的世界
|
||||
|
||||
## `temp-ip-ban-failed-xbox-auth`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
临时封禁 Xbox 身份验证失败的玩家
|
||||
|
||||
## `call-data-pk-send-event`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
如果没有插件使用它,可以禁用 `DataPacketSendEvent` 以获得更好的性能
|
||||
|
||||
## `call-batch-pk-send-event`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
如果没有插件使用它,可以禁用 `BatchPacketsEvent` 以获得更好的性能
|
||||
|
||||
## `do-level-gc`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
在游戏刻之间进行世界垃圾收集
|
||||
|
||||
## `skin-change-cooldown`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 15 |
|
||||
|
||||
玩家皮肤更换冷却时间(秒)
|
||||
|
||||
## ~~check-op-movement~~
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
~~为管理员(OP)启用移动检查~~
|
||||
|
||||
## `do-not-limit-interactions`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
禁用用于限制客户端右键交互垃圾数据包的黑客技术
|
||||
|
||||
## `do-not-limit-skin-geometry`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
禁用最大皮肤几何大小检查
|
||||
可能对某些玩家,皮肤的可用性是必需的
|
||||
|
||||
## `automatic-bug-report`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用自动报告错误
|
||||
|
||||
## ~~anvils-enabled~~
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
~~启用铁砧~~
|
||||
~~在 Nukkit 上,铁砧属于实验性功能方块,普遍存在物品重命名、物品数据丢失等问题~~
|
||||
|
||||
## `save-player-data-by-uuid`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
如果启用,则以 NukkitX 使用的格式保存玩家数据,并自动将旧格式的玩家数据转换为新格式
|
||||
如果使用旧版 WaterdogPE 代理,请禁用此功能
|
||||
|
||||
> 如果存在新的玩家数据,请勿禁用
|
||||
|
||||
## `persona-skins`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
允许玩家自己的皮肤
|
||||
|
||||
> 如果禁用,将显示默认的史蒂夫皮肤
|
||||
某些玩家的皮肤可能需要启用 `do-not-limit-skin-geometry` 才能使用
|
||||
|
||||
## ~~call-entity-motion-event~~
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
~~您可以禁用 EntityMotionEvent 以获得更好的性能,如果您的插件没有使用它~~
|
||||
|
||||
## `update-notifications`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
有新的 Nukkit-MOT 版本发布时通知刚加入游戏的管理员(OP)
|
||||
|
||||
## `bstats-metrics`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用 bStats 统计
|
||||
https://bstats.org/plugin/server-implementation/Nukkit/
|
||||
匿名收集数据:Nukkit 版本(Nukkit-MOT)、玩家数量、玩家游戏版本、是否开启 Xbox 身份验证、Java 版本、操作系统、CPU 架构及数量、服务器地理位置(粗略)
|
||||
|
||||
## `cache-chunks`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
将区块保存到内存中以加快发送速度
|
||||
|
||||
> 多版本支持的效果不佳
|
||||
|
||||
## `async-chunks`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用异步区块发送
|
||||
当向不同版本的玩家发送大量区块时,这可以极大地提高性能
|
||||
建议保持此选项开启
|
||||
|
||||
## `deprecated-verbose`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
当插件使用不推荐 API 时在控制台显示警告。
|
||||
|
||||
## `server-authoritative-movement`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-------------|
|
||||
| String | server-auth |
|
||||
|
||||
服务器移动验证方式
|
||||
可选:`client-auth / server-auth-with-rewind / server-auth`
|
||||
|
||||
## `server-authoritative-block-breaking`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
服务器权威方块破坏
|
||||
|
||||
## `use-client-spectator`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
使用客户端侧的旁观者模式
|
||||
|
||||
## `enable-experiment-mode`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用实验模式
|
||||
|
||||
## `use-waterdog`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
尝试获取 WaterdogPE 提供的客户端真实 IP
|
||||
详见:https://waterdog.dev/
|
||||
|
||||
## `enable-spark`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
启用 Spark 用于性能分析
|
||||
详见:https://spark.lucko.me/docs
|
||||
|
||||
## `hastebin-token`
|
||||
| 数据类型 | 默认值 |
|
||||
|--------|-----|
|
||||
| String | |
|
||||
|
||||
Hastebin 令牌,方便生成 debug 链接
|
||||
详见:https://www.toptal.com/developers/hastebin/documentation
|
||||
|
||||
## `use-native-leveldb`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | off |
|
||||
|
||||
使用原生的 LevelDB 实现
|
||||
|
||||
## `enable-raw-ores`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Boolean | on |
|
||||
|
||||
启用粗矿石;若启用则对高版本玩家掉落粗铜、粗铁、粗金
|
||||
版本自 [BE 1.17.0](https://minecraft.wiki/w/Bedrock_Edition_1.17.0) 起
|
||||
|
||||
## `enable-new-paintings`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Boolean | on |
|
||||
|
||||
启用在1.21版本新加入的画
|
||||
|
||||
## `enable-new-chicken-eggs-laying`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Boolean | on |
|
||||
|
||||
启用鸡产出新类型鸡蛋
|
||||
(蓝色鸡蛋&棕色鸡蛋)
|
||||
|
||||
## `leveldb-cache-mb`
|
||||
| 数据类型 | 默认值 |
|
||||
|---------|-----|
|
||||
| Integer | 80 |
|
||||
|
||||
与 `use-native-leveldb` 一同使用
|
||||
用于减少每个世界硬盘读写操作的区块数据最大缓存大小
|
||||
如果你拥有大量内存并且仅有几个大型世界,可以调高此缓存大小
|
||||
|
||||
## `forced-safety-enchant`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Boolean | on |
|
||||
|
||||
启用强制安全附魔(限制附魔最大等级)
|
||||
|
||||
## `netease-client-support`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Boolean | off |
|
||||
|
||||
启用网易客户端支持,启用后将允许网易玩家进入服务器
|
||||
|
||||
## `only-allow-netease-client`
|
||||
| Data Type | Default Value |
|
||||
|-----------|---------------|
|
||||
| Boolean | off |
|
||||
|
||||
仅允许网易玩家进入服务器,开启后将禁止微软版玩家进入服务器,仅允许网易玩家加入服务器
|
||||
|
||||
|
||||
30
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/3-客户端打包教程.md
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 60分钟
|
||||
---
|
||||
|
||||
# 客户端打包教程
|
||||
|
||||
## 前言
|
||||
|
||||
为了能够让MC Server识别到开发者在客户端的模组,除了将资源文件放在服务端/代理端相应位置以外,还需要将行为包和资源包打包成可被解析的包体
|
||||
|
||||
## 打包与上传
|
||||
|
||||
客户端的包体您可以将他视作一个地图Addons去看待
|
||||
|
||||
里面的内容都与地图addons相似
|
||||
|
||||

|
||||
|
||||
获取到这些文件后,用压缩软件压缩成7z格式的压缩包
|
||||
|
||||
目录格式如下
|
||||
|
||||

|
||||

|
||||
|
||||
打包完后,上传客户端即可
|
||||
|
||||
> 入驻上传的客户端没有做机审验证,上架期间上传的客户端是有机审验证的,从而确保格式正确
|
||||
0
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/README.md
Normal file
BIN
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/images/img.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/images/img_1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/images/img_2.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
mcguide/27-手机网络游戏/课程11:使用Nukkit开服/images/img_3.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
@@ -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:
|
||||
|
||||

|
||||
|
||||
### 教学视频
|
||||
|
||||
<video src="./video/airperf.mp4" controls></video>
|
||||
|
||||
### 了解界面
|
||||
|
||||
启动客户端后我们可以先看一下布局,主要包括菜单栏、用户信息栏、功能栏、多功能面板(设备、场景)以及最重要的性能曲线面板。
|
||||
|
||||
86
mcguide/30-测试/6-我的山头模组测试教程.md
Normal file
@@ -0,0 +1,86 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# MCS支持我的山头模组兼容测试
|
||||
|
||||
## 准备工作
|
||||
|
||||
1. 最新版MC Studio
|
||||
2. 最新版 3.6 及以后版本的 安卓手机测试包 (目前暂时不支持IOS)
|
||||
|
||||
MCS我的山头容器管理页面位于 【基岩版组件-联机测试】
|
||||
|
||||

|
||||
|
||||
## 如何创建一个测试山头
|
||||
|
||||
首先需要说明的是,MCS仅支持查阅日志和邀请玩家进入山头服,山头服的创建仍然需要前往测试审核服进行创建
|
||||
|
||||
创建完以后MCS会自动同步山头服实例
|
||||
|
||||
为了避免资源的浪费,目前只允许创建山腰服务器。其他档位会置灰
|
||||
|
||||

|
||||
|
||||
打开购买弹窗,点击确认即可
|
||||
|
||||

|
||||
|
||||
现在,你已经完成了在审核服创建山头的方法,此时当你创建好以后就可以在MCS管理成员和查阅日志
|
||||
|
||||
## 添加模组
|
||||
|
||||
您现在创建的山头,目前是没有模组的,但是山头容器可以获取到你上传到审核服的所有自测中的模组,但是前提是这个模组必须勾选上架 我的山头 专区
|
||||
|
||||
山头专区的模组,可以直接选择安装
|
||||
|
||||

|
||||
|
||||
这可能有些麻烦,这是因为山头容器只能拉取模组的itemid,这就代表无法本地进行山头服模组兼容测试,你只能上传模组到开平,然后在审核服测试
|
||||
|
||||
日志通过MCS进行查阅
|
||||
|
||||
## 日志
|
||||
|
||||
日志是山头测试的一个重要内容,关系到开发者能否查阅到模组在山头当中的报错从而追踪定位问题所在的代码
|
||||
|
||||
所以当你在测试服创建好山头以后,您可以直接在MCS山头测试页面,打开日志
|
||||
|
||||
第一次打开日志会出现有一定的时间的卡顿,这是正常现象
|
||||
|
||||
打开日志会一次性打开服务端日志和客户端日志,服务端日志会直接链接这个山头实例
|
||||
|
||||
但是客户端日志则需要开发者自行连接到手机端
|
||||
|
||||
连接手机端的方式可以查阅 [使用调试工具进行手机和电脑端调试](1-使用调试工具进行手机和电脑端调试.md)
|
||||
|
||||

|
||||
|
||||
## 成员管理
|
||||
|
||||
为了保证数据安全,成员管理请在MC Studio进行
|
||||
|
||||

|
||||
|
||||
您可以直接在这个页面输入对方的UID进行添加,添加以后点击确定即可
|
||||
|
||||
备注: 每次添加UID,只能一个一个的添加, 也就是输入UID以后点添加,就直接点击确认,不能一次性添加两个人及以上。这是为了防止恶意通过此入口来对山头服服务端进行多次请求
|
||||
|
||||
添加以后,开发者在审核服山头页面就会收到邀请,点击同意即可加入
|
||||
|
||||

|
||||
|
||||
如果对方没有同意,下一次再打开成员管理页面,仍然不会显示那名玩家的名称和UID,你不必重新添加
|
||||
|
||||
## 山头服自动回收
|
||||
|
||||
为了避免资源的浪费,每位开发者测试完毕后,应该主动在MCS删除实例,恶意占用资源的我们会严肃处理
|
||||
|
||||
当山头服 30 分钟内没有任何人时,山头服会自动进行回收,下次重新购买山腰档的山头服即可
|
||||
|
||||
|
||||
|
||||
BIN
mcguide/30-测试/images/img.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
mcguide/30-测试/images/img_1.png
Normal file
|
After Width: | Height: | Size: 461 KiB |
BIN
mcguide/30-测试/images/img_2.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
mcguide/30-测试/images/img_3.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
mcguide/30-测试/images/img_4.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
mcguide/30-测试/images/img_5.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
mcguide/30-测试/images/img_6.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
mcguide/30-测试/images/img_7.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
@@ -23,15 +23,15 @@ selection: true
|
||||
- 设为核心成员:在游戏的开发者主页中显示为核心成员。
|
||||
- 测试版启动器登录权限:设置成员是否可以使用手机版测试工具。开发者有内容通过审核后,最多可以设置10个子账号登录手机版测试启动器。未曾有过过审内容者,最多只能设置2个名额。 **注意:未经过实名认证的开发者主账号无法使用手机版测试启动器。**
|
||||
- 协作开发权限设置:可以登录我的世界开发者工作台看到主账号的云端组件、网络服等,也可以通过手机测试段与主账号联机测试。若开发者有网络游戏作品,还可以对成员额外设置是否在 **【开发阶段允许配置、部署与热更】** 、 **【上线阶段允许控制台调试】** 等功能。
|
||||
- 开发阶段允许配置、部署与热更:允许成员使用我的世界基岩版网络游戏开服工具对主账号的开发中服务器进行配置、部署与热更。有关网络游戏开服工具的配置、部署与热更功能,[详细教程可查看此处](../27-网络游戏/课程2:Apollo基础知识/第4节:部署.html#部署)。
|
||||
- 上线阶段允许控制台调试:允许成员使用我的世界基岩版网络游戏开服工具对主账号的上线阶段服务器进行控制台调试。有关网络游戏开服工具控制台调试功能,[详细教程可查看此处](../27-网络游戏/课程7:开发技巧/第3节:控制台调试.html)。
|
||||
- 开发阶段允许配置、部署与热更:允许成员使用我的世界基岩版网络游戏开服工具对主账号的开发中服务器进行配置、部署与热更。有关网络游戏开服工具的配置、部署与热更功能,[详细教程可查看此处](../27-手机网络游戏/课程2:Apollo基础知识/第4节:部署.html#部署)。
|
||||
- 上线阶段允许控制台调试:允许成员使用我的世界基岩版网络游戏开服工具对主账号的上线阶段服务器进行控制台调试。有关网络游戏开服工具控制台调试功能,[详细教程可查看此处](../27-手机网络游戏/课程7:开发技巧/第3节:控制台调试.html)。
|
||||
|
||||

|
||||
|
||||
成员管理模块不仅仅用于管理团队,对于开发也起着很重要的作用:
|
||||
|
||||
- 联机测试:可使用我的世界基岩版手机版开发启动器在外网网域下远程联机作品,<a href="../../mconline/10-addon教程/第18章:打包导出你的作品/课程03.在手机和电脑上测试你的作品.html#使用开发者子母账号在手机测试端上联机" rel="noopenner">详细教程可查看</a>;
|
||||
- 多账号协作:可在网络游戏开服工具下实现多账号协作,[详细教程可查看此处](../27-网络游戏/课程1:成为Apollo服主及相关准备/第7节:McStudio多账号协作.md);
|
||||
- 多账号协作:可在网络游戏开服工具下实现多账号协作,[详细教程可查看此处](../27-手机网络游戏/课程1:成为Apollo服主及相关准备/第7节:McStudio多账号协作.md);
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
mcguide/35-上架与入驻/images/6.1_1.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
mcguide/35-上架与入驻/images/6.1_2.jpg
Normal file
|
After Width: | Height: | Size: 464 KiB |
BIN
mcguide/35-上架与入驻/images/6.1_3.jpg
Normal file
|
After Width: | Height: | Size: 296 KiB |
BIN
mcguide/35-上架与入驻/images/img.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
mcguide/35-上架与入驻/images/img_1.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
mcguide/35-上架与入驻/images/img_2.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
mcguide/35-上架与入驻/images/img_3.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
mcguide/35-上架与入驻/images/img_4.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
mcguide/35-上架与入驻/new_images/11.1/0.png
Normal file
|
After Width: | Height: | Size: 244 KiB |
BIN
mcguide/35-上架与入驻/new_images/11.1/1.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
mcguide/35-上架与入驻/new_images/11.1/2.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
mcguide/35-上架与入驻/new_images/11.1/3.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
mcguide/35-上架与入驻/new_images/11.1/4.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
@@ -122,7 +122,7 @@ selection: true
|
||||
- 此次组件定价功能调整针对电脑版及手机版发布平台的组件资源。
|
||||
- 网络游戏商品内购、联机大厅商品内购不在以上价格档位中。
|
||||
- 内购联机大厅的本体资源若设置为付费资源作品,资源本体同样适用直购定价档位。
|
||||
- 资源组合包依据[资源组合包概览](./课程11.1-资源组合包概览.html)的相关条规继续执行。
|
||||
- 整合包依据[整合包概览](./课程11.1-整合包概览.html)的相关条规继续执行。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ time: 10分钟
|
||||
|
||||
|
||||
|
||||
附件下载链接:[http://mc.netease.com/thread-417091-1-2.html](http://mc.netease.com/thread-417091-1-2.html)
|
||||
附件下载链接:[组件修改建议](https://g79.gdl.netease.com/zujianxiugaijianyi20240730.xlsx)
|
||||
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ time: 10分钟
|
||||
|
||||
组件的封面,简介不得存在真实的枪械贴图与名称,如果有请作修改。
|
||||
|
||||
详细请参考:[http://mc.netease.com/thread-532700-1-1.html](http://mc.netease.com/thread-532700-1-1.html)
|
||||
详细请参考(附件下载链接):[武器审核评分表](https://g79.gdl.netease.com/wuqishenhepingfenbiaov5_070221.xlsx)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ time: 10分钟
|
||||
|
||||

|
||||
|
||||
手机版 **网络游戏使用[基岩版开服工具(Apollo)](../27-网络游戏/课程0:基岩版网络游戏概述/第1节:基岩版网络游戏概述与工具指引.html)** ,为开发者提供基于 **基岩版网络游戏** 与基于 **JAVA版网络游戏** 两种开服模式,以服务手机版与电脑基岩版的玩家。 [**基于基岩版网络游戏**](../27-网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.html) 的开服模式,适合已经有在手机版平台使用`Python`语言进行功能玩法开发的开发者。而 [**基于JAVA版网络游戏**](../27-网络游戏/课程10:使用Spigot开服/10-支持基岩版客户端的Java版网络游戏概述.html) 的开服模式,适合对 **JAVA版网络游戏** 和 **JAVA版网络游戏插件** 有一定概念的开发者。
|
||||
手机版 **网络游戏使用[基岩版开服工具(Apollo)](../27-手机网络游戏/课程0:基岩版网络游戏概述/第1节:基岩版网络游戏概述与工具指引.html)** ,为开发者提供基于 **基岩版网络游戏** 与基于 **JAVA版网络游戏** 两种开服模式,以服务手机版与电脑基岩版的玩家。 [**基于基岩版网络游戏**](../27-手机网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.html) 的开服模式,适合已经有在手机版平台使用`Python`语言进行功能玩法开发的开发者。而 [**基于JAVA版网络游戏**](../27-手机网络游戏/课程10:使用Spigot开服/10-支持基岩版客户端的Java版网络游戏概述.html) 的开服模式,适合对 **JAVA版网络游戏** 和 **JAVA版网络游戏插件** 有一定概念的开发者。
|
||||
|
||||
上线网络游戏前,还必须先获得网络游戏入驻资格,请查看 **[基岩版网络游戏入驻指南](./课程12.1-基岩版网络游戏入驻指南.html)** 与 **[JAVA网络游戏入驻指南](./课程13-《我的世界》中国版JAVA网络游戏入驻指南.html)** 。
|
||||
|
||||
|
||||
82
mcguide/35-上架与入驻/课程06-新版分类指引.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# 新版分类指引
|
||||
|
||||
## 新版分类
|
||||
|
||||
模组中心正在进行一轮模组分类的迭代,基于此迭代,作品上传的流程会发生两个变化:
|
||||
|
||||
1. 手机版模组上传时的 *功能玩法-Add_ons* 下将会多出一个新的子分类选项作为必选项存在
|
||||
|
||||
2. 手机版模组上传时的 *功能玩法-Add_ons* 类型的模组新增模组标签设置
|
||||
|
||||
接下来本指引将会帮助您选择合适的模组分类和标签。
|
||||
|
||||
## 新的分类机制
|
||||
|
||||
在**作品上传-上传PE资源管理**,选择资源类别为*Add_ons*后,将会出现两个子分类选项。
|
||||
|
||||

|
||||
|
||||
*子分类(新)* 即对应本次新增的分类
|
||||
|
||||
*子分类*为旧的模组分类选项,在替换期间,这两个分类会共存。
|
||||
|
||||
*子分类(新)* 以模组主要提供游玩乐趣的修改部分作为分类依据,以下是分类的基本定义:
|
||||
|
||||
1. **武器装备** 仅修改玩家的可用武器、防具,或以赋予玩家战斗攻防手段为主要核心的道具扩展
|
||||
|
||||
2. **物品道具** 非武器装备的全部道具扩展
|
||||
|
||||
3. **更多生物** 以新增非玩家生物实体为核心可玩性的模组,包括围绕生物新增的衍生道具
|
||||
|
||||
4. **方块与群系** 以新增或修改群系、非装饰方块为核心可玩性的模组
|
||||
|
||||
5. **辅助工具** 以优化原版游戏体验为核心,不提供内容扩展性的模组
|
||||
|
||||
6. **建筑与家具** 围绕建造、建筑、家具、装饰以及辅助建造工具的模组
|
||||
|
||||
7. **视觉美化** 以提供独特的视听交互反馈为核心可玩性的模组
|
||||
|
||||
8. **大型玩法** 新增维度、综合修改多个分类内容,或者创造了独特的玩法机制
|
||||
|
||||
>特别的,即使一个模组属于一个大型玩法系列,仍然要按照模组本身的修改范围来分类。
|
||||
>例如假设 *朝霞森林* 是一个包含了众多新维度、道具、BOSS的大型玩法系列,主包*朝霞森林*可被归类为**大型玩法**,但是 *朝霞森林-更多武器* 仅仅是新增了武器道具,那么该模组 *朝霞森林-更多武器* 应该被归类为**武器装备**
|
||||
|
||||
## 新的标签机制
|
||||
新的标签将会由多个标签组构成,冒险家能够通过不同的标签组来筛选找到自己喜爱的模组,本次更新将会上线的标签组包含 【玩法标签】和【主题标签】两个标签组,后续将会视情况增加新的标签组。
|
||||
|
||||
**玩法标签** 即主要描述玩法乐趣的标签
|
||||
**主题标签** 主要描述玩法的题材风格
|
||||
>例如,一个网络热门动漫的二创角色技能MOD,在玩法上为玩家创造了专属某个角色的代入感,因此选择玩法标签1-*扮演*,新增技能强化战斗体验,因此选择玩法标签2-*战斗*。在题材上属于对流行文化内容的致敬,因此选择主题标签1-*流行*。
|
||||
|
||||
**温馨提示**:请尽量选择贴合作品的标签, 因为标签关联程度会纳入推荐算法考量,选择不合适的标签可能会导致作品自然流量下滑
|
||||
|
||||
## 分类和标签在冒险家前台的表现
|
||||
分类对应冒险家进入**模组中心-全部模组-功能玩法**后看到的顶部分类:
|
||||

|
||||
|
||||
标签对应冒险家点击筛选按钮后可以看到的筛选词条:
|
||||

|
||||
## 分类与标签的提交和更新
|
||||
|
||||
自您看到这篇文章开始,开发者内容管理平台已经支持选择新的分类和标签。
|
||||
|
||||
目前标签体系属于试运行阶段,每次上传新作品时,需要在每个标签组至少选择一个适用的标签,至多三个标签
|
||||
|
||||
当您新建作品时,您必须选择新的分类和标签,该分类和标签将会随模组过审应用至线上环境;若您对分类和标签有调整,可随时通过作品更新来修改,过审后一小时左右将会同步线上环境。
|
||||
|
||||
此外,由于当前新的分类和标签仍属于试运行阶段,新旧子分类会继续共存一段时间
|
||||
|
||||
## 为什么会有新分类和标签?
|
||||
|
||||
**与时俱进** 模组中心(旧称资源中心)的分类系统距离上线后的分类调整已经过去了悠长的时间,当初设计的分类逻辑和分类词均已无法适应当前的市场现状
|
||||
|
||||
**模组集中度** 根据数据统计,模组中心当前的分类集中度过高,大部分模组集中在 *Add_ons-玩法拓展* 这个类型中, 对应的是玩家在游戏前端浏览时的效率低下,众多有质量的模组被埋没在长长的列表中。通过优化分类和标签,缩短冒险家找到心仪模组的路径,能够整体提升模组的有效曝光
|
||||
|
||||
**降低理解门槛** 通过优化分类的词汇表达,使分类对于不同游玩水平的冒险家均能够理解,帮助冒险家找到自己想要寻找的内容
|
||||
|
||||
## 后面有什么计划?
|
||||
|
||||
在本轮针对Add_ons的调整结果得到数据上的正反馈后,我们将结合数据结论和开发者、冒险家的使用反馈,进一步迭代其余所有的模组分类体系,并完善自动打标体系,让标签机制更加智能
|
||||
|
||||
## 如果对当前的新分类和标签有建议,如何反馈?
|
||||
请点击填写专属反馈问卷,我们乐意听到您的建议:[>点击此处填写模组分类反馈<](https://research-game.163.com/htmls/pbr3fi/paper.html)
|
||||
176
mcguide/35-上架与入驻/课程11.1-整合包概览.md
Normal file
@@ -0,0 +1,176 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 整合包概览
|
||||
|
||||
## 前言
|
||||
|
||||
> 文档版本:2025.09.26, **更新整合包的使用说明** 。
|
||||
|
||||
《我的世界》整合包是一种面向玩家的新型购物模式,它能将多个上线模组捆绑在一起进行打折销售,为开发者的专一粉丝提供附加价值与更多惠益。针对常见情况,有两种普遍的使用场景:
|
||||
|
||||
- 结合 主包 搭配 DLC 的模式销售系列模组。
|
||||
- 根据模组题材进行分类,帮助粉丝玩家更短时间找到喜欢的内容。
|
||||
|
||||
《我的世界》开发者平台将在 **2月21日** 上线整合包功能,玩家可在 **3月23日** 后下载整合包。
|
||||
|
||||
期待各位开发者挖掘整合包的更多整合,使用上的建议与反馈可以通过[问题与反馈中心](https://mcdev.webapp.163.com/#/feedbackModal?target=browser)与我们取得联系。《我的世界》开发者平台也会提供独立的整合包流量位,敬请期待。
|
||||
|
||||
- 我们鼓励开发者注重模组间的协同与扩展(例如通过魔改实现资源互通、配方统一,或结合科技与魔法主题设计连贯的进程路线),从而打造出更具整体性与沉浸感的整合包体验;
|
||||
|
||||
- 我们也建议在开发中关注性能优化与玩家体验的平衡,加入必要的功能辅助与引导设计,共同构建富有生命力的整合包生态。
|
||||
|
||||
## 创建整合包
|
||||
|
||||
### 入口
|
||||
|
||||
进入 《我的世界》开发者平台,点击 **作品管理** - **上架与资源管理**,接着点击 **模组** - **手机版** - **整合包**。
|
||||
|
||||

|
||||
|
||||
### 创建基本信息
|
||||
|
||||
点击 **创建整合包** ,可先设置 **整合包名称** 、 **基础折扣** 与 **限时折扣** 。
|
||||
|
||||

|
||||
|
||||
之后按照内容
|
||||
- 整合包名称:将作为整合包的名称进行展示。
|
||||
- 基础折扣:必填,整合包上线后的默认折扣。
|
||||
- 限时折扣:选填,可设置整合包在特定时间期间的折扣。整合包内的基础折扣与限时折扣同时生效时, **优先使用限时折扣** 。
|
||||
|
||||
#### 创建规则
|
||||
|
||||
开发者可按以下配置创建新的整合包:
|
||||
- **多个** Add-on 模组
|
||||
|
||||
- **1** 张地图
|
||||
|
||||
- **多个**材质/光影
|
||||
|
||||
- **多个**皮肤
|
||||
|
||||
#### 创建注意事项:
|
||||
- 整合包内不能添加多张地图
|
||||
|
||||
- 整合包内不能添加联机大厅
|
||||
|
||||
- 整合包内模组可以全部为Add-on模组或材质光影,不可全部为皮肤
|
||||
|
||||
- 仅符合新版规则的整合包可由玩家在详情页一键游玩,且可在存档管理 - 新增的整合包页签中找到并进行管理
|
||||
|
||||
模组购买价格将按照**模组本身的折扣**以及**整合包限时折扣**进行叠加,若整合包限时折扣不存在时,将由整合包基础折扣代替。
|
||||
|
||||
折扣的运作模式可参考下图:
|
||||
|
||||

|
||||
|
||||
### 创建整合包资源
|
||||
|
||||
接着在资源区域添加与整合包关联的模组。其中,整合包最多关联20个,最少关联3个 **有过审记录的模组资源** 。 **单个模组资源可加入的整合包次数不限** 。
|
||||
|
||||

|
||||
|
||||
添加模组资源后,必须设置其中一个模组为核心模组。核心模组默认在第一顺位展示。开发者可在每次关联模组时,通过添加顺序管理新增的模组展示顺序。
|
||||
|
||||

|
||||
|
||||
同时也提供直接调整非核心模组的展示顺序功能
|
||||
|
||||

|
||||
|
||||
### 创建详细信息、图片和上传视频
|
||||
|
||||
接着填充 **详情信息** 、**编辑图片** 和 **上传视频** 区域的相关内容,这些信息内容将会展示在整合包详情页中。也可直接点击同步按钮同步核心资源的资源描述,减少人工操作的时间。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 创建更新纪要
|
||||
|
||||
与编辑模组上传信息不同,整合包的 **更新纪要** 为必填内容。设置之后会在玩家的订阅功能中同步生成资源卡片,并会在手机消息通知中同步收到提醒。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 自测、提审与更新整合包
|
||||
|
||||
进入 《我的世界》开发者平台,点击 **作品管理** - **上架与资源管理**,接着点击 **模组** - **手机版** - **整合包**。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
对已创建好的整合包,可在《我的世界》2.6整包Beta更新后,点击自测按钮进行 **自测** ,在手机版测试启动器中预览对应的整合包。
|
||||
|
||||
点击 **提交审核** 按钮对整合包提交审核,点击后需进行二次确认才可提审,同样支持在二次确认弹窗中补充提审说明。
|
||||
|
||||

|
||||
|
||||
点击 **编辑** 按钮可重新进入整合包编辑页面,编辑更新后记得保存。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 下架整合包
|
||||
|
||||
在单个整合包详情页中,找到 **上架设置** 。编辑 **上架设置** ,勾选 **弱下架** ,并提供 **弱下架原因** 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
最后重新提审,等待审核通过后即可下架整合包。
|
||||
|
||||
|
||||
|
||||
## 整合包FAQ
|
||||
|
||||
#### 整合包的展示位置在哪里?
|
||||
|
||||
答:整合包会在 **关联的单个模组详情页** 下进行展示,也可在开发者主页下的 **整合包分区** 中找到。
|
||||
|
||||
#### 整合包的折扣后价格是如何计算得出的?
|
||||
|
||||
答:价格是所有关联整合包的模组当前总价与整合包折扣相乘后的折扣价格, **折扣后的价格出现小数点时,将向下取整到整数钻石** 。例如其中一个模组原价20钻石,使用模组折扣5折,并添入基础折扣为88折的整合包,则该模组最终在整合包的价格向下取整至8钻石。其余细则具体可查看 [创建整合包](#创建整合包)的折扣运作模式。
|
||||
|
||||
#### 整合包的评分与评论系统来源是哪里?
|
||||
|
||||
答:整合包的评分与评论系统将直接使用核心资源的评分与评论。
|
||||
|
||||
#### 整合包支持加入购物车、心愿单与索要转赠功能吗?
|
||||
|
||||
答:整合包暂不支持搭配购物车、心愿单与索要转赠功能使用。
|
||||
|
||||
#### 是否可以将整合包加入折扣特卖或作品活动?
|
||||
|
||||
答:目前尚不支持开发者登记整合包至[折扣特卖或作品活动](../40-活动、推广与收益/课程08-对作品进行推广与活动.html?catalog=1#活动参与)。
|
||||
|
||||
#### 是否可以使用整合包的参与手机版推广位申请与竞拍?
|
||||
|
||||
答:目前尚不支持在[推广位申请与竞拍功能](../40-活动、推广与收益/课程16-推广位申请与竞拍试运行指南.html?catalog=1#申请手机版轮播图推广位)内选择整合包,请期待后续更新。
|
||||
|
||||
#### 整合包的审核流程是什么形式?
|
||||
|
||||
答:与模组审核流程一致,开发者需要点击提审进入审核队列,并通过开发者邮箱与短信获得审核结果。
|
||||
|
||||
#### 已购模组在整合包内会如何展示?
|
||||
|
||||
答:已购模组会在整合包内的模组列表显示已购标识,同理,未购模组也会显示未购买标识。
|
||||
|
||||
#### 如何更换/新增/取消关联核心模组与非核心模组?
|
||||
|
||||
答: **在整合包首次上架前,开发者可以随时更换/新增与取消关联相应的核心模组与非核心模组。** 但在上架后,就无法更换/取消之前的核心模组或非核心模组,只允许关联其他新的模组资源为非核心模组。
|
||||
|
||||
#### 核心模组或其他关联模组下架时,整合包会如何处理?
|
||||
|
||||
答:核心模组下架后,整合包将会消失,请开发者注意。其他关联模组下架时,整合包会清除对应模组信息。
|
||||
39
mcguide/35-上架与入驻/课程11.2-一键同步合集组件至整合包.md
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
# 一键同步合集组件至整合包
|
||||
|
||||
> 文档版本:2023.2.21, **首次更新合集组件迁移整合包的使用说明** 。
|
||||
|
||||
整合包功能推出后,原合集功能不再支持创建新的合集,组件管理页面也不再支持将组件加入原有的合集。
|
||||
|
||||
有关整合包的使用说明,请查看[整合包概览](./课程11.1-整合包概览.html)。
|
||||
|
||||
**资源中心** - **开发者主页** 的合集分区将替换为整合包分区,合集内容不再展示。使用 **一键生成整合包功能** 可以帮助开发者快速导入合集组件信息至新的整合包,减少人工操作的时间。
|
||||
|
||||
|
||||
|
||||
## 使用一键生成整合包功能
|
||||
|
||||
进入 《我的世界》开发者平台,点击 **作品管理** - **上架与资源管理**,接着点击 **组件** - **手机版** - **合集**。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
在原有的合集列表下,点击 **一键生成整合包** ,进入整合包编辑页。
|
||||
|
||||

|
||||
|
||||
按照[创建整合包](./课程11.1-整合包概览.html?catalog=1#创建整合包)的步骤完成配置,点击 **保存** 或 **提交审核** 即可完成迁移。
|
||||
|
||||
|
||||
|
||||
## 一键同步功能FAQ
|
||||
|
||||
### 整合包功能上线后,合集功能还能继续使用吗?
|
||||
|
||||
答:合集功能将在整合包功能上线后不再显示在 **资源中心** - **开发者主页** ,且原合集功能也不再支持创建新的合集,因此无法继续使用。
|
||||
@@ -63,7 +63,7 @@ time: 10分钟
|
||||
|
||||

|
||||
|
||||
物理机发放后,开发者可以在项目信息中查到网络游戏的 **正式项目代号** 、 **数据库信息** 与 **数据监控平台** 的登录信息。有关数据库连接、数据监控平台的使用或项目代号的用途,可在<a href="../27-网络游戏/课程9:服务器上线/第1节:平台发布.html">开发者官网-开发指南-网络游戏分类</a>下找到相关教程。
|
||||
物理机发放后,开发者可以在项目信息中查到网络游戏的 **正式项目代号** 、 **数据库信息** 与 **数据监控平台** 的登录信息。有关数据库连接、数据监控平台的使用或项目代号的用途,可在<a href="../27-手机网络游戏/课程9:服务器上线/第1节:平台发布.html">开发者官网-开发指南-网络游戏分类</a>下找到相关教程。
|
||||
|
||||

|
||||
|
||||
@@ -91,7 +91,7 @@ time: 10分钟
|
||||
|
||||
网络游戏需要长线经营,在日常维护中需要新增内容或修复问题时,同样需要在开发者平台进行提审并上架的操作。
|
||||
|
||||
为了减轻开发者更新内容造成的审核时间成本负担,可查看<a href="../../mcguide/27-网络游戏/课程9:服务器上线/第9节:上线阶段热更.html">基岩版网络游戏开发指南-上线阶段热更</a>了解如何在不停服的情况下,将代码更新到服务器。满足热更条件时,开发者平台会自动协助提审的网络游戏触发免审机制,接着点击上架即可完成内容更新。
|
||||
为了减轻开发者更新内容造成的审核时间成本负担,可查看<a href="../../mcguide/27-手机网络游戏/课程9:服务器上线/第9节:上线阶段热更.html">基岩版网络游戏开发指南-上线阶段热更</a>了解如何在不停服的情况下,将代码更新到服务器。满足热更条件时,开发者平台会自动协助提审的网络游戏触发免审机制,接着点击上架即可完成内容更新。
|
||||
|
||||
若某次维护不可避免地需要修改函数外实现,新增插件或引擎版本更新,则还是需要等待审核人员进行审核并通过后,方可上架。
|
||||
|
||||
|
||||
272
mcguide/35-上架与入驻/课程16-基岩版第三方服务端网络游戏入驻指南.md
Normal file
@@ -0,0 +1,272 @@
|
||||
---
|
||||
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/8_1.b13ebca4.jpg
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
# 基岩版第三方服务端网络游戏入驻指南
|
||||
|
||||
|
||||
## 基岩版第三方服务端网络游戏概括
|
||||
|
||||
### 什么是基岩版第三方服务端网络游戏?
|
||||
|
||||
是指没有利用 Apollo1.0 和 Apollo2.0 制作,而是依靠 Nukkit、PocketMine 等第三方服务端部署的网络游戏,此类型的服务器称为基岩版第三方服务端网络游戏
|
||||
|
||||
目前中国版比较常见的Nukkit服务器有:EaseCation、最强斗神、花雨庭
|
||||
|
||||
|
||||
|
||||
### 入驻后优点
|
||||
|
||||
官方不仅能够提供一台稳定的正式机用于部署您的网络游戏、还可以提供性能更强劲的官方租赁机器为您服务器运行保驾护航。
|
||||
|
||||
官方还会不定期的举办活动,邀请优质服务器参与从而更进一步的提高曝光量,提高日活。
|
||||
|
||||
并且,您在入驻后还可以获得大量的流量扶持和稳定的现金流,显著提升您的收入水平。
|
||||
|
||||
|
||||
|
||||
相关数据:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### 基岩版第三方服务端网络游戏技术服务
|
||||
|
||||
官方会为您提供NukkitMaster、适配中国版协议的WaterdogPE、开发者收益快速提现等技术服务。
|
||||
|
||||
后续还会继续扩大项管技术服务以确保您的服务器能够更好的保持长线运营。
|
||||
|
||||
但由于第三方服务端的工具链生态已经较为完善,除与ModSDK通信、商业化接口的NukkitMaster和中国版提供的WaterdogPE以外,NukkitMOT需要自行前往原仓库构建。
|
||||
|
||||
|
||||
|
||||
## 入驻申请
|
||||
|
||||
### 发起入驻申请
|
||||
|
||||
首先前往 开发者平台 <https://mcdev.webapp.163.com/> ,注册您的开发者账号 登记您的实名认证。
|
||||
|
||||
找到作品管理后打开新的页面后点击网络游戏 -> 基岩版第三方开服工具,找到 入驻申请,点击后进入入驻页面
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### 填写入驻服务器信息
|
||||
|
||||
您可以按照下方图片信息来填写入驻信息
|
||||
|
||||
资料填写完毕后,回到页面右上角点击【保存】可以保存申请资料。您也可以点击【立刻提交审核】进行提审。申请可以在【网络游戏入驻申请进度】进行提审、退审等操作。
|
||||
|
||||

|
||||
|
||||
填写完毕后,并且表单中的所有信息都填写完毕即可提交
|
||||
|
||||
后续耐心等待即可
|
||||
|
||||
|
||||
### 对接教程
|
||||
|
||||
#### 等待入驻审核 (一审)
|
||||
|
||||
当您申请入驻后,您可以点击 入驻进度 实时查看您的入驻申请进度
|
||||
|
||||

|
||||
|
||||
|
||||
在审核过程中,您可以随时选择撤回申请。但请注意:一旦撤回后重新提交,您的审核批次将自动排到所有服务器队列的末尾。
|
||||
|
||||
因此,官方建议您在填写入驻申请页面时,务必一次性完整、准确地填写所有信息,以免影响审核进度
|
||||
|
||||
|
||||
|
||||
#### 入驻审核失败 (一审失败)
|
||||
|
||||
当您的服务器存在: 流程无法跑通、玩法同质化严重、美术资源廉价混乱等问题时将无法通过入驻审核。
|
||||
|
||||
审核未通过时,系统会自动发送一封入驻失败的通知邮件。
|
||||
|
||||
但请不要灰心,邮件会详细说明需要整改的具体问题。根据提示进行修复和优化后,便可以重修提交审核。
|
||||
|
||||
入驻审核不设置次数限制,欢迎您持续完善内容并再次申请。
|
||||
|
||||
|
||||
#### 入驻审核成功 (一审通过)
|
||||
|
||||
当您的服务器通过入驻审核后,系统会通过开发者平台邮件通知您的入驻结果,对接人员会在1-3天内主动添加您的好友
|
||||
|
||||
如果你没有接收到好友申请,您也可以主动添加对接人员的QQ号
|
||||
|
||||
对接人员的QQ号会提供在开发者邮箱中,请您按照邮件内容格式添加好友,对接人员在确认服主身份后方可同意您的申请。
|
||||
|
||||
**注意: 请勿将对接人员的QQ号泄露给任何人,否则官方有权对您的入驻流程进行终止。**
|
||||
|
||||
|
||||
|
||||
#### 申请正式机
|
||||
|
||||
当您一审通过后您需要主动在 网络游戏-服务器使用情况 处申请正式机
|
||||
|
||||
正式服请先申请新增,后续根据自身运营情况再选择租赁服务器或申请服务器
|
||||
|
||||
#### 选择正式机
|
||||
|
||||
初次申请服务器请根据您的服务器具体情况进行申请。如果您申请的服务器库存不足,官方会自动调整成其他服务器。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
#### 服务器迁移
|
||||
|
||||
当您的正式服下来以后,官方会通过开发者平台邮件告知您 正式机的配置和连接信息。
|
||||
|
||||
您可以通过 XShell 、 XFTP 等 SSH工具来快速管理您的服务器。
|
||||
|
||||
|
||||
|
||||
第一次连接服务器您需要使用 JumpServer跳板机 来绑定您的个人信息,Jumpserver 还可以作为远程管服的一个便携式工具。
|
||||
|
||||
具体教程官方会在发放正式机后将教学文件发放于您。
|
||||
|
||||
当您一切都配置好以后,您就可以通过XFTP、JumpServer等传输工具将您的服务端上传至正式机后,配置环境后进行开服准备二审
|
||||
|
||||
机器默认开放19132/19133端口 作为测试服或正式服入口,额外的端口需要申请,请提前说明(比如数据库远程管理端口3306)
|
||||
|
||||
|
||||
|
||||
#### 认证接入
|
||||
|
||||
服务器入驻中国版时需下载 NukkitMaster 使用,确保接入商业化内容和与ModSDK进行通信 。
|
||||
|
||||
在您服务器拿到正式机以后,官方对接人员会将 NukkitMaster 发放于您以便对接。
|
||||
|
||||
而 WaterdogPE已兼容中国版,开源仓库是: https://github.com/MCNeteaseDevs/WaterdogPE_Netease/tree/netease
|
||||
|
||||
|
||||
|
||||
#### 网络游戏配置
|
||||
|
||||
当您完成了认证接入以后,就需要在开发者平台配置您的服务器
|
||||
|
||||
在这个页面点击更新客户端,进入新的页面后进行配置
|
||||
|
||||

|
||||
|
||||
填写完成后点击保存后 开始二审
|
||||
|
||||
|
||||
|
||||
#### 内容审核 (二次审核)
|
||||
|
||||
本次审核主要是针对在迁移以后是否存在流程跑通的问题。
|
||||
|
||||
大大在迁移完服务端后,便可以在开发者平台网络游戏管理中更新客户端填写基本信息
|
||||
|
||||

|
||||
|
||||
按照表单中的内容全部完成后,点击保存然后提交审核
|
||||
|
||||
提交审核后官方对接人员会在1-3天内主动与你沟通二审时间。
|
||||
|
||||
如果没有收到二审,也可以主动在对接讨论群中与官方对接人员沟通二审时间,然后进行二审。
|
||||
|
||||
二审通过后您便可以进行商业化对接或直接上架。
|
||||
|
||||
|
||||
|
||||
### 商业化对接与提审
|
||||
|
||||
商业化是非常重要的一个模块,您可以通过接入官方的商业化接口实现自助快速发货。
|
||||
|
||||
接入商业化您必须要使用 NukkitMaster,或者是参考 NukkitMaster 自行编写商业化对接内容
|
||||
|
||||
根据 NukkitMaster 插件的config.yml文件配置商业化
|
||||
|
||||
### 正式上架
|
||||
|
||||
恭喜您完成上述所有内容,现在您可以直接上架,完成全部流程。
|
||||
|
||||
|
||||
|
||||
### 开发者平台资源用量统计功能
|
||||
|
||||
为了在后续能够更好地规范开发者的资源使用情况,帮助开发者合理地使用资源用量,助力建设更加有序的开发环境,开发者平台新增开发者平台资源用量统计功能。
|
||||
|
||||
|
||||
|
||||
**使用资源用量统计功能**
|
||||
|
||||
进入《我的世界》开发者平台,点击首页的**数据与收益 - 数据分析(公测)**,点击**网络游戏**选项,选择对应的**手机版**或者**电脑版**类型,然后点击**月度用量汇总**进入查看服务器资源用量的具体内容。
|
||||
|
||||

|
||||
|
||||
开发者可以通过**筛选月份筛选**,选择查看对应当月服务器在平台提供的各资源的具体用量情况。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## FAQ
|
||||
|
||||
Q: 官方提供的服务器是什么系统的?
|
||||
|
||||
A: 官方提供的服务器是Linux系统,官方也注意到很多私服服主仅接触过WINDOWS SERVER系统。所以官方推荐在您一审通过后尽可能的学习Linux的一些基础运维知识确保后续运营不会出现严重的问题。
|
||||
|
||||
|
||||
|
||||
|
||||
Q: 入驻申请是否会产生费用呢,是否需要押金呢?
|
||||
|
||||
A: 您在入驻申请 到 正式上架,官方都不会收取费用,也不会收取押金。
|
||||
|
||||
|
||||
|
||||
Q: 入驻服务器有没有名额限制?
|
||||
|
||||
A: 原则上官方不会设置入驻申请数量限制,但后续官方还是会根据您之前服务器的运营情况进行综合评判。
|
||||
|
||||
|
||||
|
||||
Q: 我入驻网络游戏需要自备机器吗?
|
||||
|
||||
A: 没有,服主第一次入驻官方会免费发放一台正式机用于使用,但正式机的性能比较差可能会对后续长期运营造成一定影响。
|
||||
|
||||
|
||||
|
||||
Q: 那后续如果服务器性能出现瓶颈怎么办?
|
||||
|
||||
A: 您可以继续申请一台低频率的正式机,也可以选择租赁性能非常强劲的租赁物理机。
|
||||
|
||||
|
||||
|
||||
Q: 入驻一审一直失败会不会影响后续评分?
|
||||
|
||||
A: 原则上不会影响后续评分,但官方希望您能够避免多次审核,尽量一次性把缺点修改。
|
||||
|
||||
|
||||
|
||||
Q: 我入驻可以用其他人的服务端进行提审,然后上架后更换吗?
|
||||
|
||||
A: 这个是红线行为,官方决不允许此类情况的发生,一经发现官方将按照规程进行处罚。
|
||||
|
||||
还希望开发者能够用自己创造的世界去给冒险家们提供服务。
|
||||
|
||||
|
||||
|
||||
Q: 入驻的新服有什么流量扶持呢?
|
||||
|
||||
A:
|
||||
|
||||
1、当服务器正式上架以后,您可以主动申请 资源中心 进行推广,第一次申请的服务器无需写更新内容,只需要写上是第一次服务器申请。
|
||||
|
||||
2、上述流量扶持完全免费,不会产生任何费用,后续推广则需要开发者自行根据更新需求写上以后进行申请了哦。
|
||||
|
||||
3、对于热门服和讨论度极高的服务器入驻以后,官方还会有特殊的流量扶持流程为您的服务器提高核心竞争力。
|
||||
|
||||
推广位详情可以查看开发者文档中的 活动、推广与收益。
|
||||
@@ -93,7 +93,7 @@ TAG:内容审核 制度
|
||||
|
||||
通过机器人挂机等方式虚增在线人数
|
||||
|
||||
违反 [互通人数显示规则](../27-网络游戏/课程9:服务器上线/第6节:在线人数显示.md),将在线人数进行合并统计
|
||||
违反 [互通人数显示规则](../27-手机网络游戏/课程9:服务器上线/第6节:在线人数显示.md),将在线人数进行合并统计
|
||||
|
||||
**二类**:
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 156 KiB |
@@ -4,8 +4,12 @@
|
||||
|
||||
每周五、六、日三天,将限时开启周末秒杀活动,报名并中标的模组将在活动当天20:00-23:59获得额外曝光,进行限时秒杀。
|
||||
|
||||
当周末秒杀与其他游戏内促销节日冲突时,将有概率暂时关闭当周【周末秒杀】活动。
|
||||
|
||||

|
||||
|
||||
<span style="color:red;">* 当周末秒杀与其他游戏内促销节日冲突时,将有概率暂时关闭当周【周末秒杀】活动。</span>
|
||||
|
||||
## 二、【周末秒杀】报名规则
|
||||
|
||||
1. 开发者平台新增【周末秒杀】报名通道,报名流程可查看【报名流程图解】
|
||||
@@ -13,7 +17,7 @@
|
||||
- 满15个模组在申请队列中时,此秒杀日将不再接受申请
|
||||
- 每个秒杀日有且仅有一个模组能够中标
|
||||
|
||||
2. 信用分满12分的开发者均可在:开发者平台 - 折扣与优惠 - 【周末秒杀】 页面进行报名:
|
||||
2. 信用分满12分的开发者均可在:开发者平台 - 推广与活动- 【周末秒杀】 页面进行报名:
|
||||
- 开发者至少提前9个自然日、至多提前22个自然日进行申请(e.g. 7月11-13日的秒杀模组,最晚在7月2日申请,最早在6月18日申请)
|
||||
- 每位开发者同一时间最多有6个模组处于申请中状态
|
||||
- 申请中状态:审核中、已通过、已上架
|
||||
@@ -22,28 +26,27 @@
|
||||
3. 可申请的模组需满足以下条件:
|
||||
- 申请的模组6周内未参与过秒杀活动
|
||||
- 申请的模组必须为:原价大于100钻, 且是钻石付费模组
|
||||
- 秒杀份数最少为1000份,最多为10000份
|
||||
- 秒杀份数最少为1000份,最多为10000份,秒杀份数需为整千数
|
||||
|
||||
4. 申请后,开发者可在【我的申请】中查看42天内申请历史
|
||||
|
||||

|
||||
|
||||
5. 申请通过/未通过时,我们将通过 站内信的形式 告知各位开发者
|
||||
|
||||
## 三、【报名流程图解】
|
||||
|
||||
1. 在开发者平台【折扣与优惠 - 周末秒杀申请】页面
|
||||
1. 在开发者平台【推广与活动 - 周末秒杀申请】页面
|
||||
|
||||

|
||||

|
||||
|
||||
2. 选择想要申请秒杀的周末,点击【申请】
|
||||
|
||||

|
||||
|
||||
3. 在【申请弹窗】中选择对应的日期,填写: 模组ID 、秒杀份数(秒杀份数需为整千数)
|
||||
|
||||

|
||||
|
||||
3. 在【申请弹窗】中选择对应的日期,填写: 模组ID 、秒杀份数
|
||||
|
||||

|
||||
|
||||
4. 申请后,开发者可在【我的申请】中查看42天内申请历史
|
||||
|
||||

|
||||

|
||||
@@ -47,7 +47,7 @@ selection: true
|
||||
|
||||
此外,我们还有一些关于Add On,玩法地图,美术制作的<a href="../../mconline/15-玩法组件教程/0-使用我的世界开发工作台制作第一个玩法/0-摘要.html" rel="noopenner"> 示例课程 </a>。
|
||||
|
||||
如果你想开发网络游戏,可以参考[网络游戏开服工具文档](../27-网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.md)。
|
||||
如果你想开发网络游戏,可以参考[网络游戏开服工具文档](../27-手机网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.md)。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ time: 50分钟
|
||||
|
||||
### **什么是网络游戏开服工具?**
|
||||
|
||||
网络游戏开服工具是由我的世界中国版开花组维护的PE版网络游戏服务器集群工具。它被内置于我的世界开发工作台中,集成了负载均衡、集群管理、运营指令、多号协作的功能,同时支持**完整的原版内容**与**附加包自定义功能**。为了让服务器开发者能够更好地由浅入深地学习网络游戏开服工具,我们还为服主提供了[一站式图文教学](../27-网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.md)和官方插件库。[点击这里](http://mc.163.com/mcstudio/)下载我的世界开发工作台开启你的手游版服主之旅吧!
|
||||
网络游戏开服工具是由我的世界中国版开花组维护的PE版网络游戏服务器集群工具。它被内置于我的世界开发工作台中,集成了负载均衡、集群管理、运营指令、多号协作的功能,同时支持**完整的原版内容**与**附加包自定义功能**。为了让服务器开发者能够更好地由浅入深地学习网络游戏开服工具,我们还为服主提供了[一站式图文教学](../27-手机网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.md)和官方插件库。[点击这里](http://mc.163.com/mcstudio/)下载我的世界开发工作台开启你的手游版服主之旅吧!
|
||||
|
||||
### **如何入驻手游版网络游戏?**
|
||||
|
||||
@@ -151,11 +151,11 @@ tutorialApolloMod
|
||||
|
||||

|
||||
|
||||
**[更多详细内容请戳官方教程链接](../27-网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.md)**
|
||||
**[更多详细内容请戳官方教程链接](../27-手机网络游戏/课程1:成为Apollo服主及相关准备/第1节:Apollo介绍.md)**
|
||||
|
||||
### 我该如何在开发服务器内进行单人/多人测试呢?
|
||||
|
||||
若想要进入服务器进行单人测试,点击网络服项目的开发阶段,再点击开发测试即可。而多人测试分为多台PC终端以及一台PC终端多号测试的情况。若是多台终端连接服务器,[可以使用子账号协作功能](../27-网络游戏/课程7:开发技巧/第2节:多账号协同部署.md)。若只有单机开发但想要多人测试,可以在主账号中获得服务器IP和端口,通过MCSTUDIO右上角的工具箱—ModPC客户端多开客户端裸连服务器。
|
||||
若想要进入服务器进行单人测试,点击网络服项目的开发阶段,再点击开发测试即可。而多人测试分为多台PC终端以及一台PC终端多号测试的情况。若是多台终端连接服务器,[可以使用子账号协作功能](../27-手机网络游戏/课程7:开发技巧/第2节:多账号协同部署.md)。若只有单机开发但想要多人测试,可以在主账号中获得服务器IP和端口,通过MCSTUDIO右上角的工具箱—ModPC客户端多开客户端裸连服务器。
|
||||
|
||||

|
||||
|
||||
@@ -204,7 +204,7 @@ post body:{
|
||||
}
|
||||
```
|
||||
|
||||
如果对指令输入仍有疑问,可查阅下列教程:**[公告插件使用](../27-网络游戏/课程3:简易网络服模板部署与常见操作/第7节:官方插件.md)**
|
||||
如果对指令输入仍有疑问,可查阅下列教程:**[公告插件使用](../27-手机网络游戏/课程3:简易网络服模板部署与常见操作/第7节:官方插件.md)**
|
||||
|
||||
|
||||
## 还有一些其他问题?
|
||||
|
||||
59
mcguide/9-规范开发/5-多人联机适配规范.md
Normal file
@@ -0,0 +1,59 @@
|
||||
---
|
||||
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 多人联机适配规范
|
||||
|
||||
## 前言
|
||||
|
||||
最近,在山头测试中,我们发现很多开发者的模组明明在单人游戏运行是非常正常的,但在山头、多人联机环境下就会出现功能无效或者异常的情况
|
||||
|
||||
后面我们发现,实际上只要遵循 ServerSystem 和 ClientSystem 分离的原则。基本上就能保证开发的模组兼容山头服和多人联机
|
||||
|
||||
## 开发范例
|
||||
|
||||
> 下方代码仅供参考和通俗化解释,并不能实际运行!
|
||||
|
||||
**modClient.py**
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
|
||||
class ModClient(clientApi.GetClientSystemCls()):
|
||||
|
||||
def Register(self):
|
||||
|
||||
self.NotifyToServer("test", {})
|
||||
print("register successfully")
|
||||
# TODO
|
||||
|
||||
def NoClientApiRegister(self):
|
||||
print("register successfully")
|
||||
# TODO
|
||||
```
|
||||
**modServer.py**
|
||||
```python
|
||||
import mod.client.extraClientApi as serverApi
|
||||
from xxx.xxx.xxx import ModClient
|
||||
|
||||
class ModServer(serverApi.GetServerSystemCls()):
|
||||
|
||||
def ServerRegister(self):
|
||||
ModClient.NoClientApiRegister()
|
||||
print("register successfully")
|
||||
# TODO
|
||||
```
|
||||
可以看到 上面的 `modClient.py` 引入了 `clientApi`
|
||||
而 ModServer 这边希望能够调用到 `ModClient` 类里的 `NoClientApiRegister` 方法
|
||||
虽然这个方法仅仅只是简单的 print,并不涉及 `clientApi` 里的任何方法
|
||||
但由于 `ModClient` import了 `clientApi`,此时 `ModServer` 在初始化的时候就会报错,类里的方法都不会被正常执行
|
||||
|
||||
由上述例子可以得出
|
||||
在开发模组时,应该避免在 ServerSystem 下的子类引用客户端的接口和方法
|
||||
如果无法满足要求,可以前往**开发者平台-反馈与建议** 或者 **[Github接口建议](https://github.com/MCNeteaseDevs/SDK-Campaign/issues) 提出接口建议
|
||||
|
||||
当你遵循上述开发原则,即客户端和服务端分离,您开发的模组基本天然兼容多人联机和我的山头的环境
|
||||
|
||||
|
||||
10
mcguide/9-规范开发/6-模型规范指南.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 模型规范指南
|
||||
|
||||
[点击前往快捷链接](../16-美术/6-模型和动作/6-模型规范指南.md)
|
||||
10
mcguide/9-规范开发/7-性能优化规范.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 性能优化规范
|
||||
|
||||
[点击前往快捷链接](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/20-%E7%8E%A9%E6%B3%95%E5%BC%80%E5%8F%91/18-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/%E4%BB%A3%E7%A0%81%E4%BC%98%E5%8C%96.html?catalog=1)
|
||||
BIN
mcguide/9-规范开发/images/after_optimization.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
mcguide/9-规范开发/images/before_optimization.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
mcguide/9-规范开发/images/textureFlickering.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
mcguide/9-规范开发/resources/0_1.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
mcguide/9-规范开发/resources/0_2.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
473
mcguide/9-规范开发/resources/standard_steve.geo.json
Normal 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]}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
mcguide/9-规范开发/resources/standard_steve.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |