Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88c7c0d76a | ||
|
|
fc457c77b4 | ||
|
|
fcf47af619 | ||
|
|
d4f35639f2 | ||
|
|
e36e1a8a9b | ||
|
|
48e19d260b |
@@ -1,128 +0,0 @@
|
||||
---
|
||||
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主身份进行注册。**
|
||||
@@ -5,58 +5,34 @@ 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类账户,则会有限额,收益过多时,会打款失败**)
|
||||
|
||||
至此银行卡办理流程结束,若有则跳过。
|
||||
|
||||
然后,前往网点,说明是开户人是您,让工作人员帮您开户,开户成功给到卡片后,**请核实卡片是否为I类账户,开户人是否为您的名字**。(**若开户人不是本人,则会打款失败,若不是I类账户,则会有限额,收益过多时,会打款失败**)
|
||||
- 至此银行卡办理流程结束,若有则跳过。
|
||||
## 如何注册开发者
|
||||
|
||||
首先,在 **官网** 中找到注册页面([或点击此处直接进入开发者内容管理网址](https://mcdev.webapp.163.com/#/login) )
|
||||
@@ -71,10 +47,7 @@ selection: true
|
||||
|
||||
3 - 跳转至新的页面,根据提示填入信息和**真实姓名、身份证号(新增)**,并勾选同意《隐私协议》,点击 **【注册】** 按钮(注意:开发者昵称注册后每90天可以修改1次)。
|
||||
|
||||
注意:新版开发者平台更新后,登录已经**实名过网易游戏**的网易邮箱账号,会**直接用该网易邮箱账号实名信息快捷认证完成开发者注册**,请**仔细检查您想要注册的账号是不是已经完成实名**(**一旦开发者账号实名通过,就再也无法释放更改实名信息**)
|
||||
|
||||

|
||||
|
||||
> 每个信息的用途:
|
||||
>
|
||||
> 开发者邮箱:开发者账号的唯一标识符
|
||||
@@ -88,51 +61,35 @@ selection: true
|
||||
> 真实姓名:实名认证
|
||||
>
|
||||
> 身份证号:实名认证
|
||||
|
||||
- 注:**1个身份证号只能实名1个开发者账号,请谨慎选择账号注册,注册后非特殊情况不支持修改,注销无法释放身份证信息。**
|
||||
|
||||
4 - 成功入驻后
|
||||
|
||||
你已经可以开始发布免费作品(目前的状态称为“**快捷验证账号**”),但若你需要发布钻石作品获取收益,则需要继续进行银行卡认证,填写身份证、银行卡等信息,点击 **【申请银行卡认证】** 跳转至银行卡认证界面。
|
||||
4 - 成功入驻后,需要进行银行卡认证,填写身份证、银行卡等信息,点击 **【申请银行卡认证】** 跳转至银行卡认证界面。
|
||||
|
||||

|
||||
|
||||

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

|
||||
|
||||
## 如何个人开发者转企业开发者
|
||||
|
||||
1. 点击开发者平台右上角的头像,点击“企业转个人申请”。
|
||||
1. 点击开发者平台右上角的头像,点击“申请企业开发者认证”。
|
||||
2. 提交认证信息,等待审核通过,一般在10个工作日内给结果。
|
||||
|
||||
注意:申请通过后1年内不能再次发起变更
|
||||
|
||||
## 如何企业开发者转个人开发者
|
||||
|
||||
目前**不支持**手动转回个人开发者,需要等待年审提出转个人申请。
|
||||
|
||||
## 开发者注册常见问题答疑
|
||||
|
||||
### 账号审核时间
|
||||
|
||||
开发者账号审核通过一般在 **7 个工作日** ,请耐心等待。
|
||||
|
||||
### 快捷验证账号皮肤区限制
|
||||
|
||||
近期因响应相关政策,皮肤区加强管理,**暂时对快捷验证登录用户上传皮肤进行限制**,后续开放时间请各位开发者持续关注官网公告及开发者平台。在此,我们再次感谢各位开发者的理解与支持。
|
||||
|
||||
解决方案:**申请银行卡认证**
|
||||
|
||||
### 选择符合自身实际情况的结算方式
|
||||
|
||||
在注册开发者时,需要选择 **结算方式** (指通过《我的世界》中国版投稿付费钻石组件后获得的收益结算),开发者应当选择 **符合自身实际情况** 的结算方式,共两种:
|
||||
|
||||
1. 代扣代缴:由我司代为扣缴,请注意此选项仅针对非公司性质的个人开发者
|
||||
2. 自备税票:自行开票或者请税局代为开票
|
||||
**只有代扣代缴才可以享受收益结算“快捷打款”服务,自备税票还是在月底打款。**
|
||||
|
||||
建议个人开发者或小规模团队选择“代扣代缴”的结算方式,公司类型的开发者及个体工商户选择“自备税票”的结算方式。
|
||||
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
---
|
||||
front: 进阶
|
||||
time: 15分钟
|
||||
---
|
||||
|
||||
# 模型规范指南
|
||||
## 前言
|
||||
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
|
||||
|
||||
因此换了BlockBench模型的Mod,会导致官方皮肤时出现贴图错位、模型消失等兼容性问题,影响了玩家的视觉体验。
|
||||
|
||||
现已开放官方模型规范,开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型,确保模组能够与官方皮肤良好配合,为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型,确保模组能够与官方皮肤良好配合,为玩家带来更加一致、流畅的游戏体验
|
||||
|
||||
## 模型模板下载
|
||||
|
||||
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者,请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
|
||||
|
||||
## 兼容分类
|
||||
|
||||
根据模组与官方皮肤的兼容程度,分为:
|
||||
|
||||
1. **完全兼容**:未更换bb模型。表现为:皮肤模型贴图,以及穿戴外观,模组动画等表现都正常。
|
||||
2. **部分兼容**:更换了bb模型,但按照官方规范制作。表现为:皮肤挂件以及穿戴外观正常,但是模型样式改变及贴图错乱。
|
||||
3. **不兼容**:更换了bb模型,且未按照官方规范制作。表现为:模型样式改变,皮肤挂件错乱,穿戴外观错乱,以及动作异常。
|
||||
|
||||
## 规范概要
|
||||
|
||||
1. 玩法模组:非必要不改bb模型,如需修改bb模型需遵循动作优化类模组规范
|
||||
2. 动作优化类模组:
|
||||
- 人形角色,非必要不修改bb结构,即无需使用AddPlayerGeometry的Api
|
||||
- 如需修改修改bb结构,则应该按以下优先级进行美术制作
|
||||
- 不修改玩家模型为多关节
|
||||
- **按规范**修改四肢为多关节模型,但是不修改Body为多关节模型
|
||||
- **按规范**砍四肢与body为多关节模型
|
||||
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
|
||||
3. SDK使用:
|
||||
- 开发者可以结合以下Mod SDK,判断是否需要更换模型
|
||||
- 建议穿戴史诗及以上多关节官方4d皮肤,在模组对皮肤兼容度较差的前提下,不进行玩家模型修改
|
||||
- 其余情况开发者也可以使用接口判断更换模型的必要性
|
||||
- [IsOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
|
||||
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
|
||||
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
|
||||
4. 动画制作:人形角色,必须修改bb模型的,建议使用官方模型并用其进行动画制作
|
||||
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json,如果改了请务必在官方的规范下进行拓展
|
||||
|
||||
## 多关节美术制作参考
|
||||
|
||||
### 必要骨骼
|
||||
|
||||
1. 常规骨骼(常作为挂件的挂点):
|
||||
|
||||
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
|
||||
|
||||
2. 会员盔甲挂点:
|
||||
|
||||
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
|
||||
|
||||
**【注意】**
|
||||
|
||||
* 共计26个骨骼,开发者请不要随意删除
|
||||
* 必要骨骼中,加粗字体的骨骼为相比原版Steve新增的关节
|
||||
|
||||
|
||||
### 骨骼层级一览
|
||||
|
||||
| 节点名称 | | 枢轴点 | 备注 |
|
||||
|---------------------------|---|----------------| --- |
|
||||
| root | | (0,0,0) | |
|
||||
| —waist | | (0, 12, 0) | |
|
||||
| ——body | | (0, 24, 0) | |
|
||||
| ———head | | (0, 24, 0) | |
|
||||
| —————hat | | (0, 24, 0) | |
|
||||
| ———cape | | (0, 24, 3) | |
|
||||
| ———leftArm | | (-5, 22, 0) | |
|
||||
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
|
||||
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
|
||||
| ———————leftItem | | (-6, 15, 1) | |
|
||||
| —————leftSleeve | | (-5, 22, 0) | |
|
||||
| ———rightArm | | (5, 22, 0) | |
|
||||
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
|
||||
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
|
||||
| ———————rightItem | | (6, 15, 1) | |
|
||||
| —————rightSleeve | | (5, 22, 0) | |
|
||||
| ———jacket | | (0, 24, 0) | |
|
||||
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
|
||||
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
|
||||
| —leftLeg | | (-1.9, 12, 0) | |
|
||||
| ——leftPants | | (-1.9, 12, 0) | |
|
||||
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
|
||||
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
|
||||
| —rightLeg | | (1.9, 12, 0) | |
|
||||
| ——rightPants | | (1.9, 12, 0) | |
|
||||
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
|
||||
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
|
||||
|
||||
**【注意】**
|
||||
* 骨骼层级:影响官方动画兼容
|
||||
* 骨骼命名:影响官方挂件兼容
|
||||
* 枢轴点影响。比如:body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
|
||||
|
||||
### 骨骼层级说明
|
||||
* body 和 bodyDown 层级并列
|
||||
* 新增的切分关节
|
||||
- 5个骨骼节点:`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
|
||||
- 5个骨骼节点:`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
|
||||
|
||||
### UV贴图制作
|
||||
如下图所示,需要按照Steve规范进行制作
|
||||
|
||||

|
||||
### 其余注意事项
|
||||
|
||||
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皮肤,可通过邮件领取
|
||||
|
||||
|
||||
@@ -1,157 +0,0 @@
|
||||
---
|
||||
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该测试皮肤不会生效
|
||||
|
||||
|
||||
232
mcguide/20-玩法开发/18-性能优化/Tick 事件优化.md
Normal file
@@ -0,0 +1,232 @@
|
||||
---
|
||||
front: https://nie.res.netease.com/r/pic/20210728/5507b669-4c6f-4958-b5d0-b8556ab4cfb5.png
|
||||
hard: 进阶
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# Tick 事件优化指南
|
||||
|
||||
Tick 事件是网易版组件开发中最为核心的机制之一,绝大多数重要的游戏逻辑都需要在 Tick 事件中实现。
|
||||
|
||||
然而,由于事件系统的架构特性,多个逻辑模块集中在同一时间执行时,容易产生性能瓶颈。本文将分享几个经过实践验证的优化策略,帮助开发者提升游戏性能。
|
||||
|
||||
在后续示例中,我们将以 `ServerBlockEntityTickEvent` 事件为例进行说明。该事件会在方块实体配置并启用 tick 组件后,以每秒 20 次的频率执行。
|
||||
|
||||
## 一、设计原则
|
||||
|
||||
### 原则一:优先执行开销最小、访问频率最高的运算
|
||||
|
||||
由于 `ServerBlockEntityTickEvent` 事件会在所有启用了 tick 组件的方块实体上执行,通过在事件处理的最开始进行方块类型判断,可以有效避免不必要的性能开销:
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# ServerBlockEntityTickEvent 事件
|
||||
def on_block_entity_tick(args):
|
||||
block_name = args["blockName"]
|
||||
if block_name == "custom:some_tickable_block":
|
||||
# tick 逻辑
|
||||
pass
|
||||
```
|
||||
|
||||
值得注意的是,网易版 API 中的 `serverApi.GetEngineCompFactory()` 等工厂方法在频繁调用时也会产生性能开销,在高频执行的 tick 事件中尤其需要注意这一点。
|
||||
|
||||
推荐的做法是将 tick 事件中常用的接口组件预先缓存为全局变量,避免重复创建:
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import mod.server.extraServerApi as serverApi
|
||||
|
||||
# 将部分组件缓存,以便后续高频访问使用
|
||||
level_id = serverApi.GetLevelId()
|
||||
factory = serverApi.GetEngineCompFactory()
|
||||
block_info = factory.CreateBlockInfo(level_id)
|
||||
be_comp = factory.CreateBlockEntityData(level_id)
|
||||
|
||||
|
||||
# ServerBlockEntityTickEvent 事件
|
||||
def on_block_entity_tick(args):
|
||||
block_name = args["blockName"]
|
||||
x = args["posX"]
|
||||
y = args["posY"]
|
||||
z = args["posZ"]
|
||||
dim_id = args["dimension"]
|
||||
|
||||
if block_name == "custom:some_tickable_block":
|
||||
below_block = block_info.GetBlockNew((x, y - 1, z), dim_id)
|
||||
# 其他逻辑部分...
|
||||
```
|
||||
|
||||
### 原则二:采用间隔执行机制,降低计算频率
|
||||
|
||||
并非所有游戏逻辑都需要在每个 tick 中执行。例如,在设计烤炉烤制食物的功能时,食物的烤制进度检查完全可以每隔 20 tick 或更长时间进行一次,而无需每 tick 都执行。
|
||||
|
||||
最简单的实现方式是引入全局计数变量,通过取余运算实现间隔执行:
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
TICK_COUNT = 0
|
||||
|
||||
|
||||
# OnScriptTickServer 事件
|
||||
# 注意:OnScriptTickServer 每秒执行 30 次
|
||||
# 而 ServerBlockEntityTickEvent 每秒执行 20 次
|
||||
# 实际项目中需要考虑这一频率差异
|
||||
def on_script_tick():
|
||||
# 每个 tick 计数变量递增
|
||||
global TICK_COUNT
|
||||
TICK_COUNT += 1
|
||||
|
||||
|
||||
# ServerBlockEntityTickEvent 事件
|
||||
def on_block_entity_tick(args):
|
||||
block_name = args["blockName"]
|
||||
|
||||
if block_name == "custom:some_tickable_block" and TICK_COUNT % 20 == 0:
|
||||
# 每 20 tick 执行一次特定操作
|
||||
pass
|
||||
```
|
||||
|
||||
## 二、Tick 计数的潜在问题与负载均衡策略
|
||||
|
||||
上述原则二中的 tick 计数方法虽然简单有效,但存在一个重要缺陷。
|
||||
|
||||
当玩家同时放置多个相同的可 tick 方块(如 20 个烤炉)时,由于它们共享同一个全局计数器 TICK_COUNT,所有方块的逻辑会在同一时刻集中触发,造成明显的间歇性卡顿现象。
|
||||
|
||||
解决这个问题的关键在于实现 tick 负载均衡,让每个方块的执行时机分散到不同的 tick 中。
|
||||
|
||||
### 加盐(Salt)机制
|
||||
|
||||
这是借鉴自密码学的概念。
|
||||
|
||||
通过在 tick 计数判断中加入特定的偏移值,使每个方块的执行时机产生差异:
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
TICK_COUNT = 0
|
||||
|
||||
|
||||
# OnScriptTickServer 事件
|
||||
def on_script_tick():
|
||||
# 每 tick 时,此计数变量自增 1
|
||||
global TICK_COUNT
|
||||
TICK_COUNT += 1
|
||||
|
||||
|
||||
# ServerBlockEntityTickEvent 事件
|
||||
def on_block_entity_tick(args):
|
||||
block_name = args["blockName"]
|
||||
x = args["posX"]
|
||||
y = args["posY"]
|
||||
z = args["posZ"]
|
||||
dim_id = args["dimension"]
|
||||
|
||||
if block_name == "custom:some_tickable_block":
|
||||
# 使用坐标和维度 ID 作为偏移量,确保不同位置的方块错开执行时机
|
||||
offset_tick_count = x + y + z + dim_id + TICK_COUNT
|
||||
# 每 20 tick 执行一次,但各方块的执行时机已经分散
|
||||
if offset_tick_count % 20 == 0:
|
||||
pass
|
||||
```
|
||||
|
||||
通过这种方式,可以有效确保不同位置的方块避开在同一 tick 中执行操作。
|
||||
|
||||
### 逻辑模块化与分频执行
|
||||
|
||||
当可 tick 方块包含复杂的游戏逻辑,且这些逻辑可以划分为多个独立模块时,可以根据各模块的性能开销和实时性要求,采用不同的执行频率:
|
||||
|
||||
- 性能开销大、实时性要求低的模块:**低频执行**
|
||||
- 性能开销小、实时性要求高的模块:**高频执行**
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
TICK_COUNT = 0
|
||||
|
||||
|
||||
# OnScriptTickServer 事件
|
||||
def on_script_tick():
|
||||
# 每 tick 时,此计数变量自增 1
|
||||
global TICK_COUNT
|
||||
TICK_COUNT += 1
|
||||
|
||||
|
||||
# ServerBlockEntityTickEvent 事件
|
||||
def on_block_entity_tick(args):
|
||||
block_name = args["blockName"]
|
||||
x = args["posX"]
|
||||
y = args["posY"]
|
||||
z = args["posZ"]
|
||||
dim_id = args["dimension"]
|
||||
|
||||
if block_name == "custom:some_tickable_block":
|
||||
# 使用坐标和维度 ID 作为偏移量,实现负载均衡
|
||||
offset_tick_count = x + y + z + dim_id + TICK_COUNT
|
||||
|
||||
# 高频模块:每 5 tick 执行一次
|
||||
if offset_tick_count % 5 == 0:
|
||||
fast_logic(args)
|
||||
|
||||
# 低频模块:每 100 tick 执行一次
|
||||
if offset_tick_count % 100 == 0:
|
||||
slow_logic(args)
|
||||
|
||||
|
||||
def fast_logic(args):
|
||||
# 低开销、高频率执行的游戏逻辑
|
||||
pass
|
||||
|
||||
|
||||
def slow_logic(args):
|
||||
# 高开销、低频率执行的游戏逻辑
|
||||
pass
|
||||
```
|
||||
|
||||
### 使用质数间隔,避免执行时机冲突
|
||||
|
||||
当游戏逻辑足够复杂,需要拆分为多个不同执行频率的模块时
|
||||
|
||||
```python3
|
||||
# 每 10 tick 执行一次特定操作
|
||||
if offset_tick_count % 10 == 0:
|
||||
logic_a(args)
|
||||
|
||||
# 每 20 tick 执行一次特定操作
|
||||
if offset_tick_count % 20 == 0:
|
||||
logic_b(args)
|
||||
|
||||
# 每 40 tick 执行一次特定操作
|
||||
if offset_tick_count % 40 == 0:
|
||||
logic_c(args)
|
||||
|
||||
# 每 80 tick 执行一次特定操作
|
||||
if offset_tick_count % 80 == 0:
|
||||
logic_d(args)
|
||||
```
|
||||
|
||||
当游戏运行到 80 tick 的倍数时,会发现四个逻辑模块同时触发,导致性能峰值和卡顿现象。
|
||||
|
||||
使用质数作为执行间隔可以有效避免这一问题。将原有的间隔替换为质数 `11, 19, 41, 79`:
|
||||
|
||||
```python
|
||||
# 每 11 tick 执行一次特定操作
|
||||
if offset_tick_count % 11 == 0:
|
||||
logic_a(args)
|
||||
|
||||
# 每 19 tick 执行一次特定操作
|
||||
if offset_tick_count % 19 == 0:
|
||||
logic_b(args)
|
||||
|
||||
# 每 41 tick 执行一次特定操作
|
||||
if offset_tick_count % 41 == 0:
|
||||
logic_c(args)
|
||||
|
||||
# 每 79 tick 执行一次特定操作
|
||||
if offset_tick_count % 79 == 0:
|
||||
logic_d(args)
|
||||
```
|
||||
|
||||
利用质数的数学特性,这些逻辑模块在任何 tick 时刻都不会同时执行,从而实现了更均匀的性能负载分布。
|
||||
234
mcguide/27-手机网络游戏/课程10:使用Spigot开服/13-0-通过MCSM面板管理服务器.md
Normal file
@@ -0,0 +1,234 @@
|
||||
***
|
||||
|
||||
front:
|
||||
hard: 入门
|
||||
time: 60分钟
|
||||
----------
|
||||
|
||||
# 通过MCSM面板管理服务器
|
||||
|
||||

|
||||
|
||||
## 准备阶段
|
||||
|
||||
1. PE/PC网络服入驻通过,并且拿到网易开发机/正式机。
|
||||
2. 自备服务器(非网易机器),最低要求1c1g,建议安装宝塔
|
||||
3. 下载所需要的文件(相关文件已上传内容库)
|
||||
4. 完成上一章节《部署服务器》
|
||||
5. MCSM面板中文指南:<https://docs.mcsmanager.com/zh_cn/>
|
||||
|
||||
## 特别提示
|
||||
|
||||
本教程不会在网易机器部署web面板及自建服务。
|
||||
|
||||
本教程将默认开发者已经熟悉MCSM面板,基础内容不再介绍。
|
||||
|
||||
开始前请熟知并遵守《高危操作警告说明》:
|
||||
|
||||
* 网易机器禁止私自开放附录名单内端口对外
|
||||
|
||||
* 网易机器禁止私自把无任何认证校验服务直接对外
|
||||
|
||||
* 网易机器禁止私自把机器交付时开放的业务端口用于其他用途,如数据库或自建服务等
|
||||
|
||||

|
||||
|
||||
## 原理说明
|
||||
|
||||
在网易机器部署mcsm daemon守护进程,通过自备机器协议转发SSH隧道与网易机器通信,从而达到使用mcsm面板管理网易机器。
|
||||
|
||||

|
||||
|
||||
## 操作步骤
|
||||
|
||||
### (一)在网易机器
|
||||
|
||||
#### 1. 无root安装node.js
|
||||
|
||||
```bash
|
||||
# 下载nodejs
|
||||
cd ~/downloads
|
||||
wget https://nodejs.org/dist/v15.7.0/node-v15.7.0-linux-x64.tar.xz
|
||||
|
||||
# 创建工作目录并解压
|
||||
mkdir -p ~/apps/node-v15.7.0
|
||||
tar -xJf node-v15.7.0-linux-x64.tar.xz --no-wildcards-match-slash --anchored --exclude */CHANGELOG.md --exclude */LICENSE --exclude */README.md --strip 1 -C ~/apps/node-v15.7.0
|
||||
|
||||
# 添加path变量
|
||||
export PATH=~/apps/node-v15.7.0/bin:$PATH
|
||||
source ~/.bashrc
|
||||
|
||||
# 检查nodejs版本
|
||||
node -v
|
||||
npm -v
|
||||
|
||||
# 至此安装完成
|
||||
```
|
||||
|
||||
#### 2. 守护进程mcsm daemon上传部署
|
||||
|
||||
从github下载压缩包(内容库也已上传)
|
||||
|
||||
<https://gitee.com/mcsmanager/MCSManager-Daemon-Production>
|
||||
|
||||
```bash
|
||||
# 创建mcsm daemon工作目录
|
||||
cd ~
|
||||
mkdir -p ~/mcsm
|
||||
|
||||
# 上传到这个目录(Xftp, FinalShell均可)
|
||||
|
||||
# 解压
|
||||
cd ~/mcsm
|
||||
unzip MCSManager-Daemon-Production-master.zip
|
||||
cd ~/mcsm/MCSManager-Daemon-Production-master
|
||||
|
||||
# 设置 npm 镜像源为国内淘宝源
|
||||
npm config set registry https://registry.npmmirror.com
|
||||
npm config get registry
|
||||
|
||||
# 新增screen
|
||||
screen -S mcsm
|
||||
|
||||
# 安装依赖后部署
|
||||
npm install --production
|
||||
node app.js
|
||||
```
|
||||
|
||||
#### 3. 检查24444端口和秘钥
|
||||
|
||||
执行上一步骤后,服务将会启动成功,请使用**ctrl+a、d**来后台运行screen
|
||||
|
||||
启动成功后,你会看到类似 \[INFO] Key: xxxxxxx 和 Port: 24444 的信息。
|
||||
|
||||
(记录key秘钥,后续将用于自备机器节点配置。)
|
||||
|
||||
```bash
|
||||
# 检查端口是否正常
|
||||
netstat -tulnp | grep 24444
|
||||
```
|
||||
|
||||
### (二)在自备机器
|
||||
|
||||
#### 1. 自动安装mcsm+开启守护进程
|
||||
|
||||
```bash
|
||||
# 请确保root登录,有sudo权限
|
||||
sudo su -c "wget -qO- https://script.mcsmanager.com/setup_cn.sh | bash"
|
||||
|
||||
# 先启动面板守护进程。
|
||||
# 这是用于进程控制,终端管理的服务进程。
|
||||
systemctl start mcsm-daemon.service
|
||||
# 再启动面板 Web 服务。
|
||||
# 这是用来实现支持网页访问和用户管理的服务。
|
||||
systemctl start mcsm-web.service
|
||||
|
||||
# 以下命令已列出(如有需要请自取)
|
||||
# 重启面板命令
|
||||
systemctl restart mcsm-daemon.service
|
||||
systemctl restart mcsm-web.service
|
||||
|
||||
# 停止面板命令
|
||||
systemctl stop mcsm-web.service
|
||||
systemctl stop mcsm-daemon.service
|
||||
```
|
||||
|
||||
如果 systemctl 命令无法启动面板,可以参考手动安装(<https://docs.mcsmanager.com/zh_cn/>) 中的 启动方式 来启动 MCSManager。 但这需要你用其他后台运行程序来接管它,否则当你的 SSH 终端断开之时,手动启动的 MCSManager 面板也会随之被系统强制结束。
|
||||
|
||||
面板 Web 服务是提供用户管理与网页访问功能的服务,守护进程是提供进程管理和容器管理的服务,两者缺一不可。如果某个功能不正常,可以只重启这一部分的服务来热修复问题。
|
||||
|
||||
#### 2. 配置协议转发(autossh)
|
||||
|
||||
下面将以宝塔面板进行操作:
|
||||
|
||||
① 进入/root/.ssh/目录上传网易机器秘钥
|
||||
|
||||
② 配置秘钥密码和隧道转发
|
||||
|
||||
```bash
|
||||
# 设置秘钥权限(请自行替换)
|
||||
chmod 600 /root/.ssh/netease.key
|
||||
|
||||
# 启动 ssh-agent
|
||||
eval `ssh-agent -s`
|
||||
|
||||
# 添加密钥并输入一次密码(请自行替换)
|
||||
ssh-add /root/.ssh/netease.key
|
||||
|
||||
# 如无autossh,请自行安装
|
||||
apt-get update
|
||||
apt-get install autossh -y
|
||||
|
||||
# 执行隧道命令(请自行替换)
|
||||
# 将ssh隧道连接的网易机器24444端口转发到自备机器的24445端口
|
||||
# 注意 -L 后面的 0.0.0.0:24445
|
||||
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -p 32200 -i /root/.ssh/netease.key -CNf -L 0.0.0.0:24445:127.0.0.1:24444 fuzhu@<网易机器IP>
|
||||
|
||||
# 验证是否成功
|
||||
netstat -tunlp | grep 24445
|
||||
|
||||
# 如果你看到类似下面的输出:
|
||||
# tcp 0 0 127.0.0.1:24445 0.0.0.0:* LISTEN 1234/ssh
|
||||
# 那么就成功了
|
||||
|
||||
# 至此隧道转发结束
|
||||
```
|
||||
|
||||
③ 防火墙和安全组开放端口(仅在自备机器,网易机器禁止开放端口)
|
||||
|
||||
| mcsm面板web端口(建议nginx转发改端口,安全一些) | 23333 |
|
||||
| ------------------------------ | ----- |
|
||||
| **ssh协议转发端口(设置端口白名单,否则有安全问题)** | 24445 |
|
||||
|
||||
#### 3. 配置mcsm节点
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这里的“远程节点秘钥”请替换为网易机器守护进程输出的key秘钥。
|
||||
|
||||
添加后,显示节点状态为正常,网页直连为正常,可以读取内存和处理器使用率后节点配置成功。
|
||||
|
||||
#### 4. 检查实例创建和文件管理是否正常
|
||||
|
||||
如需迁移网易机器的screen至mcsm,请使用“直接创建”,配置服务端目录、实例类型和启动命令后,即可迁移成功。
|
||||
|
||||

|
||||

|
||||
|
||||
#### 5. 常见的问题
|
||||
|
||||
① 无法连接到远程节点
|
||||
|
||||
检查自备机器端口/安全组是否开放,是否需要配置nginx反向代理。
|
||||
|
||||
最简单的方法就是直接复制地址,浏览器访问,看是否有显示daemon状态。
|
||||
|
||||

|
||||

|
||||
|
||||
② 多网易机器部署
|
||||
|
||||
按照此方法,在不同机器上配置mcsm daemon守护进程,配置多个SSH隧道协议转发,然后新增节点即可。
|
||||
|
||||
## 特别鸣谢
|
||||
|
||||
|
||||
教程作者:初云
|
||||
|
||||
灵感和帮助:Soldier
|
||||
|
||||
全过程步骤指导:Gemini3 Pro
|
||||
|
||||
教程参考指南:MCSManager团队
|
||||
|
||||
MCSM常见问题解答:混合、封神、MuFeng、西瓜、星汉
|
||||
|
||||
调试与测试:千阙云庭服务器团队、初云杯服务器团队、风之谷服务器团队
|
||||
|
||||
<br />
|
||||
|
||||
如您在操作过程中有困难,欢迎您随时联系我们\~
|
||||
|
||||
感谢帮助过我们的人,期待网络服环境蒸蒸日上!
|
||||
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/10.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/20.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/30.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/40.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/50.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/60.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/70.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/80.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/90.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
@@ -1,103 +0,0 @@
|
||||
---
|
||||
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)
|
||||
@@ -1,271 +0,0 @@
|
||||
# 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完成事件
|
||||
@@ -1,175 +0,0 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 资源组合包概览
|
||||
|
||||
> 文档版本:2023.2.21, **首次更新资源组合包的使用说明** 。
|
||||
|
||||
《我的世界》资源组合包是一种面向玩家的新型购物模式,它能将多个上线组件捆绑在一起进行打折销售,为开发者的专一粉丝提供附加价值与更多惠益。针对常见情况,有两种普遍的使用场景:
|
||||
|
||||
- 结合 主包 搭配 DLC 的模式销售系列组件。
|
||||
- 根据组件题材进行分类,帮助粉丝玩家更短时间找到喜欢的内容。
|
||||
|
||||
原合集功能将支持一键同步合集组件至资源组合包,后续开发者也无法创建新的合集,详情请查看[一键同步合集组件至资源组合包](./课程11.2-一键同步合集组件至资源组合包.html)。 **资源中心** - **开发者主页** 的合集分区将替换为资源组合包分区。 **且资源组合包当前仅支持《我的世界》手机版。**
|
||||
|
||||
《我的世界》开发者平台将在 **2月21日** 上线资源组合包功能,玩家可在 **3月23日** 后下载资源组合包。
|
||||
|
||||
期待各位开发者挖掘资源组合包的更多组合,使用上的建议与反馈可以通过[问题与反馈中心](https://mcdev.webapp.163.com/#/feedbackModal?target=browser)与我们取得联系。《我的世界》开发者平台也会提供独立的资源组合包流量位,敬请期待。
|
||||
|
||||
|
||||
|
||||
## 创建资源组合包
|
||||
|
||||
进入 《我的世界》开发者平台,点击 **作品管理** - **上架与资源管理**,接着点击 **组件** - **手机版** - **资源组合包**。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
点击 **创建资源组合包** ,可先设置 **组合包名称** 、 **组合包类型** 、 **基础折扣** 与 **限时折扣** 。
|
||||
|
||||
- 组合包类型:分为 **普通组合包** 、 **纯皮肤组合包** 、 **纯地图组合包** 。
|
||||
- **普通组合包** :可以选择任一类型的组件。
|
||||
- **纯皮肤组合包** :只能选择 **皮肤组件** 。
|
||||
- **纯地图组合包** :只能选择 **地图组件** 。
|
||||
- 组合包名称:将作为资源组合包的名称进行展示。
|
||||
- 基础折扣:必填,资源组合包上线后的默认折扣。
|
||||
- 限时折扣:选填,可设置资源组合包在特定时间期间的折扣。资源组合包内的基础折扣与限时折扣同时生效时, **优先使用限时折扣** 。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
**纯皮肤组合包** 、 **纯地图组合包** 最低折扣为50%, **普通资源组合包** 有价格限制,最低折扣需按组件原价折后价**500钻石**设置。组合包类型将根据包内组件类型情况进行自动选择。
|
||||
|
||||
组件购买价格将按照**组件本身的折扣**以及**组合包限时折扣**进行叠加,若组合包限时折扣不存在时,将由组合包基础折扣代替。
|
||||
|
||||
折扣的运作模式可参考下图:
|
||||
|
||||

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

|
||||
|
||||
|
||||
|
||||
添加组件资源后,必须设置其中一个组件为核心组件。核心组件默认在第一顺位展示。开发者可在每次关联组件时,通过添加顺序管理新增的组件展示顺序,未来也会提供直接调整非核心组件的展示顺序功能,敬请期待。
|
||||
|
||||

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

|
||||
|
||||

|
||||
|
||||

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

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

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

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

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

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

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

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