Compare commits
64 Commits
12m08d
...
sync-20260
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
707e3a7b2b | ||
|
|
8f48148961 | ||
|
|
e5ecce5841 | ||
|
|
0806b4e69f | ||
|
|
fb17060866 | ||
|
|
8af3e13f2f | ||
|
|
fb9586cf5d | ||
|
|
f105f936e0 | ||
|
|
ec2c7f60b9 | ||
|
|
d977df2dc2 | ||
|
|
31d219956f | ||
|
|
df4bece89b | ||
|
|
77ba105452 | ||
|
|
439216893d | ||
|
|
074cf234bd | ||
|
|
64282118f6 | ||
|
|
d68587065c | ||
|
|
688a85ffff | ||
|
|
521e187767 | ||
|
|
d458ef7ec7 | ||
|
|
77bdd38c05 | ||
|
|
0f012cde17 | ||
|
|
58189c3d48 | ||
|
|
d778ffb81c | ||
|
|
e74c284815 | ||
|
|
8c8ae31c08 | ||
|
|
31dea08de7 | ||
|
|
c51b5bb73c | ||
|
|
da08f15ac2 | ||
|
|
a510d13f2b | ||
|
|
5ee48218b8 | ||
|
|
3a2cf90fa9 | ||
|
|
667aa53bc5 | ||
|
|
7797f0e939 | ||
|
|
93e56894f7 | ||
|
|
719cee30f0 | ||
|
|
4ac57df199 | ||
|
|
bf866fd56e | ||
|
|
915e1dcf98 | ||
|
|
7d7a7fbfa3 | ||
|
|
99128414ab | ||
|
|
f8027b4b19 | ||
|
|
bcde4dc33a | ||
|
|
5f219a7e26 | ||
|
|
dd3d05715c | ||
|
|
680b621604 | ||
|
|
ebb8988a32 | ||
|
|
fb87dd369a | ||
|
|
4621ea48f1 | ||
|
|
a636b82b38 | ||
|
|
88c7c0d76a | ||
|
|
f7a59982c0 | ||
|
|
51d0042f6a | ||
|
|
fc457c77b4 | ||
|
|
fcf47af619 | ||
|
|
d4f35639f2 | ||
|
|
8a80e928c8 | ||
|
|
e36e1a8a9b | ||
|
|
48e19d260b | ||
|
|
332010d79b | ||
|
|
74e056146a | ||
|
|
cb1c065e58 | ||
|
|
dfa6901bff | ||
|
|
01cba91236 |
48
.all-contributorsrc
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"projectName": "netease-bedrock-wiki",
|
||||
"projectOwner": "MCNeteaseDevs",
|
||||
"files": [
|
||||
"README.md"
|
||||
],
|
||||
"commitType": "docs",
|
||||
"commitConvention": "angular",
|
||||
"contributorsPerLine": 7,
|
||||
"contributors": [
|
||||
{
|
||||
"login": "MCNeteaseDevs",
|
||||
"name": "MCNeteaseDevs",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/186891705?v=4",
|
||||
"profile": "https://github.com/MCNeteaseDevs",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "sevenstars0",
|
||||
"name": "sevenstars",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/148792757?v=4",
|
||||
"profile": "https://github.com/sevenstars0",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "LiangJi23333",
|
||||
"name": "LiangJi23333",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/102958768?v=4",
|
||||
"profile": "https://github.com/LiangJi23333",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Nacalpha",
|
||||
"name": "Nacalpha",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/128111367?v=4",
|
||||
"profile": "https://github.com/Nacalpha",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
57
.github/ISSUE_TEMPLATE/issue-template-sdk.yml
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
name: SDK文档修改
|
||||
description: 一条SDK修改对应一条Issue,可以修改参数描述、接口备注等
|
||||
title: "[sdk] "
|
||||
labels: [sdk]
|
||||
body:
|
||||
- type: textarea
|
||||
id: sdk_name
|
||||
attributes:
|
||||
label: 接口名称/链接
|
||||
description: 请填写接口的名称或链接
|
||||
placeholder: |
|
||||
例如: CreateUI
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: sdk_type
|
||||
attributes:
|
||||
label: 接口类型
|
||||
description: 接口的类型
|
||||
options:
|
||||
- 服务端
|
||||
- 客户端
|
||||
- 双端
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: modifications
|
||||
attributes:
|
||||
label: 修改内容
|
||||
description: 详细描述修改后的内容
|
||||
placeholder: |
|
||||
例如:
|
||||
# 以CreateUI为例
|
||||
1、参数修改
|
||||
createParams的说明修改为:创建UI的参数,会传到UI类的_init_函数中,详细请看下方备注说明
|
||||
2、备注修改
|
||||
createParams中的bindEntityId参数描述修改为:意为绑定实体的id。若不传入该键值对或值为None,则会以isHud = 0来处理该UI界面。血量显示模组可以使用该参数。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: other_content
|
||||
attributes:
|
||||
label: 其他补充信息
|
||||
description: 如有其他补充信息请填写在这里
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: developer_info
|
||||
attributes:
|
||||
label: 开发者名称/联系方式
|
||||
description: 请填写您的开发者名称或联系方式(QQ),将会用于奖励发放等
|
||||
validations:
|
||||
required: false
|
||||
63
.github/workflows/sync.yml
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
# GitHub Actions 工作流
|
||||
# 检测到 sync-* 标签时自动推送代码到 main 分支
|
||||
|
||||
name: Auto Push on Tag
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'sync-*'
|
||||
|
||||
# 授予写入权限
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
push-code:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Get tag info
|
||||
id: tag_info
|
||||
run: |
|
||||
TAG_NAME=${GITHUB_REF#refs/tags/}
|
||||
COMMIT_SHA=$(git rev-list -n 1 $TAG_NAME)
|
||||
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
|
||||
echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT
|
||||
echo "🏷️ Tag: $TAG_NAME"
|
||||
echo "📝 Commit: $COMMIT_SHA"
|
||||
|
||||
- name: Push commit to main
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
# 获取标签指向的 commit
|
||||
TAG_COMMIT=${{ steps.tag_info.outputs.commit_sha }}
|
||||
|
||||
# 切换到 main 分支
|
||||
git checkout main
|
||||
|
||||
# 检查 main 是否已经包含这个 commit
|
||||
if git merge-base --is-ancestor $TAG_COMMIT HEAD; then
|
||||
echo "✓ main 分支已包含此 commit,无需推送"
|
||||
else
|
||||
# 将 commit 合并到 main
|
||||
git merge $TAG_COMMIT --no-edit
|
||||
git push origin main
|
||||
echo "✓ 已推送到 main 分支"
|
||||
fi
|
||||
|
||||
- name: Summary
|
||||
run: |
|
||||
echo "## 同步完成 ✅" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **标签**: ${{ steps.tag_info.outputs.tag_name }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Commit**: ${{ steps.tag_info.outputs.commit_sha }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **时间**: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
1
.gitignore
vendored
@@ -5,3 +5,4 @@ package.json
|
||||
.idea
|
||||
mcguide/30-测试/video/airperf.mp4
|
||||
mcguide/30-测试/video/tracy.mp4
|
||||
.codemaker/
|
||||
|
||||
45
README.md
@@ -11,8 +11,29 @@
|
||||
如果你发现了一些错误,或者想要补充一些新的教程到我们的官网,那可以在本仓库提交pr,并在项目中留下你的大名!
|
||||
提交的文档会经过审核,最终以每两周一次的频率更新到我们的官网中
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 因为**mcguide/12-入门教程/10-注册成为开发者**的文件名,是首页 https://mc.163.com/dev/guide.html 左侧目录生成抓取的依据,因此请开发者们勿修改**注册成为开发者**文件名。修改了文件名的Pull requests审核将不通过
|
||||
- 文档一般双周进行同步,如需要立即同步等需求,请开发者在自己的提交请求下@MCNeteaseDevs,并给出申请立即同步的原因(如我提交的文档有误导致目录错误等)
|
||||
|
||||
## 贡献指南
|
||||
|
||||
**开发指南/教学课程文档**与**Mod SDK文档**修改流程不一致,接下来将会分别介绍
|
||||
|
||||
### Mod SDK文档修改
|
||||
1. 点击仓库中**Issues** - 点击**New Issue** - 选择**SDK文档修改**
|
||||
|
||||
2. 按照模版依次填写以下内容:
|
||||
- 标题:为了方便其他开发者查找相同修改,请写明**接口名称与修改部分**。例如:StopCustomMusicById添加备注
|
||||
- 接口名称:填写需要修改的接口名称或链接
|
||||
- 接口类型:选择接口的类型,共有服务端、客户端、双端三种选项
|
||||
- 修改内容:详细描述修改的接口文档内容
|
||||
- 其他补充信息:如有其他信息可以补充在这里
|
||||
- 开发者信息:将会用于贡献致谢展示与奖品发放
|
||||
|
||||
3. 完成后点击Create。修改内容会由官方进行审核,审核通过后会在**两周之内**同步至官网
|
||||
|
||||
### 开发指南/教学课程修改
|
||||
1. Fork 本项目。点击 Fork 按钮,创建一个新的派生项目到自己的工作区(Create a new fork)
|
||||
|
||||
2. 克隆派生
|
||||
@@ -48,7 +69,7 @@ git push --set-upstream origin your-branch-name
|
||||
|
||||
## 备注
|
||||
|
||||
我们的官网文档是使用VuePress构建的,我们鼓励你使用VuePress的语法对文档进行美化。
|
||||
我们的官网文档是使用VuePress构建的,我们鼓励你使用VuePress的语法对文档进行美化
|
||||
|
||||
## 鸣谢
|
||||
|
||||
@@ -56,3 +77,25 @@ git push --set-upstream origin your-branch-name
|
||||
|
||||
|
||||
|
||||
## 致谢
|
||||
|
||||
在此感谢以下开发者作出的贡献(以下排名不分先后)
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MCNeteaseDevs"><img src="https://avatars.githubusercontent.com/u/186891705?v=4?s=100" width="100px;" alt="MCNeteaseDevs"/><br /><sub><b>MCNeteaseDevs</b></sub></a><br /><a href="#doc-MCNeteaseDevs" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sevenstars0"><img src="https://avatars.githubusercontent.com/u/148792757?v=4?s=100" width="100px;" alt="sevenstars"/><br /><sub><b>sevenstars</b></sub></a><br /><a href="#doc-sevenstars0" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LiangJi23333"><img src="https://avatars.githubusercontent.com/u/102958768?v=4?s=100" width="100px;" alt="LiangJi23333"/><br /><sub><b>LiangJi23333</b></sub></a><br /><a href="#doc-LiangJi23333" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Nacalpha"><img src="https://avatars.githubusercontent.com/u/128111367?v=4?s=100" width="100px;" alt="Nacalpha"/><br /><sub><b>Nacalpha</b></sub></a><br /><a href="#doc-Nacalpha" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
@@ -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,7 +5,7 @@ time: 10分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 注册成为开发者
|
||||
# 从零开始注册成为开发者
|
||||
## 申请材料准备
|
||||
### 材料列表
|
||||
入驻全过程中,共需要下列材料:
|
||||
@@ -19,24 +19,20 @@ 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) )
|
||||
@@ -52,7 +48,6 @@ selection: true
|
||||
3 - 跳转至新的页面,根据提示填入信息和**真实姓名、身份证号(新增)**,并勾选同意《隐私协议》,点击 **【注册】** 按钮(注意:开发者昵称注册后每90天可以修改1次)。
|
||||
|
||||

|
||||
|
||||
> 每个信息的用途:
|
||||
>
|
||||
> 开发者邮箱:开发者账号的唯一标识符
|
||||
@@ -66,7 +61,6 @@ selection: true
|
||||
> 真实姓名:实名认证
|
||||
>
|
||||
> 身份证号:实名认证
|
||||
|
||||
- 注:**1个身份证号只能实名1个开发者账号,请谨慎选择账号注册,注册后非特殊情况不支持修改,注销无法释放身份证信息。**
|
||||
|
||||
4 - 成功入驻后,需要进行银行卡认证,填写身份证、银行卡等信息,点击 **【申请银行卡认证】** 跳转至银行卡认证界面。
|
||||
@@ -80,14 +74,10 @@ selection: true
|
||||

|
||||
|
||||
## 如何个人开发者转企业开发者
|
||||
|
||||
1. 点击开发者平台右上角的头像,点击“申请企业开发者认证”。
|
||||
2. 提交认证信息,等待审核通过,一般在10个工作日内给结果。
|
||||
|
||||
## 如何企业开发者转个人开发者
|
||||
|
||||
目前**不支持**手动转回个人开发者,需要等待年审提出转个人申请。
|
||||
|
||||
## 开发者注册常见问题答疑
|
||||
|
||||
### 账号审核时间
|
||||
|
||||
@@ -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皮肤,可通过邮件领取
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ selection: true
|
||||
- 建议穿戴史诗及以上多关节官方4d皮肤,在模组对皮肤兼容度较差的前提下,不进行玩家模型修改
|
||||
- 其余情况开发者也可以使用接口判断更换模型的必要性
|
||||
- [IsOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
|
||||
- [IsMultiJointOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ismultijointofficialskin) —— 获取玩家穿戴的皮肤是否为多关节官方4d皮肤
|
||||
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
|
||||
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
|
||||
4. 动画制作:人形角色,必须修改bb模型的,建议使用官方模型并用其进行动画制作
|
||||
@@ -156,7 +157,11 @@ def onUpdatePlayerSkinClient(self,args):
|
||||
|
||||
为方便开发者测试4D皮肤与模组本身的兼容性,官方在**开发者测试服(手机自测)**提供了测试用4D皮肤,可通过邮件领取
|
||||
|
||||
**注意:** 请各位开发者更新到3.5测试服,3.4该测试皮肤不会生效
|
||||
**注意:**
|
||||
|
||||
- 请各位开发者更新到3.5测试服,3.4该测试皮肤不会生效
|
||||
|
||||
- 自3.7版本之后,渲染龙包体无法使用4D皮肤。开发者请勿在游戏内视频设置中切换为渲染龙,这将导致断言报错
|
||||
|
||||
#### MC Studio
|
||||
|
||||
|
||||
@@ -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该测试皮肤不会生效
|
||||
|
||||
|
||||
@@ -942,6 +942,7 @@ draggable | enum | "not_draggable" | 使控件可以被拖动。控件应能够
|
||||
follows_cursor | boolean | false | 控件是否跟随鼠标或手柄指针移动,仅在调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>接口创建的UI中才会正常生效
|
||||
grid_position | array [row, column] | 取决于自身 | 用于设置控件在grid中的位置,这也允许修改原版硬编码网格的特定网格项
|
||||
collection_index | int | 取决于自身 | 用于设置控件在集合中的索引
|
||||
collection_name | string | | 该控件的集合名称。该控件的值会向子控件传递。该属性仅适用于 工厂、堆叠面板、集合面板、网格。
|
||||
priority | int | 0 | 该控件的优先级,数字越小优先级越高
|
||||
layer | int | 0 | 当前控件相对父节点的层级,最终显示层级取决于父节点到该节点的layer之和,较高的层级将会渲染在上层
|
||||
alpha | number | 1.0 | 控件的不透明度。取值0.0-1.0。它只会影响UI控件本身,其子控件不受影响。如果希望透明度同时应用于父控件和子控件,请使用propagate_alpha
|
||||
@@ -1389,7 +1390,26 @@ input_panel与panel类似,可以用来放置其他控件。还可以用来检
|
||||
**注**
|
||||
|
||||
排序的顺序和子控件的排序有关,需要手动调整。
|
||||
### collection\_panel
|
||||
|
||||
collection_panel与panel类似,可以用来放置其他控件。除此之外还有集合绑定功能。
|
||||
|
||||
```json
|
||||
"collection_panel_name": {
|
||||
"type": "collection_panel",
|
||||
"layer": 1,
|
||||
"collection_name": "netease_ui_container",
|
||||
"controls": [
|
||||
{
|
||||
"9@fakeplayer_bag.fakeplayer_bag_grid_item": {
|
||||
"anchor_from": "top_left",
|
||||
"anchor_to": "top_left",
|
||||
"collection_index": 9
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### edit\_box
|
||||
|
||||
edit_box是输入框控件,用来输入文字信息,可以获取输入内容,设置输入框内容,触发输入中和输入完成事件,设置最大输入值等。下面的示例展示了一个搜索框的信息。
|
||||
@@ -1759,13 +1779,23 @@ PC和IOS平台没有这个问题
|
||||
|
||||
而对于scrolling_content的绝对路径,一共有以下两种,可以通过UI-API<a href="../../mcdocs/1-ModAPI/接口/自定义UI/UI界面.html#getallchildrenpath">GetAllChildrenPath</a>清楚的看到。
|
||||
|
||||
#### 特别注意
|
||||
|
||||
```python
|
||||
scroll_view_path = "/scroll_view0"
|
||||
touch_path = scroll_view_path + "/scroll_touch/scroll_view/panel/background_and_viewport/scrolling_view_port/scrolling_content"
|
||||
mouse_path = scroll_view_path + "/scroll_mouse/scroll_view/stack_panel/background_and_viewport/scrolling_view_port/scrolling_content"
|
||||
```
|
||||
|
||||
在PC端进行游戏时,按F11可以切换鼠标和触摸屏两种操作模式,而手机端通常只有触摸屏这一种操作模式。不同的操作模式,scroll_view的scrolling_content会生成在不同的路径下,触摸屏使用touch_path获得scrolling_content的绝对路径,而鼠标控制使用mouse_path获得。
|
||||
在PC端进行游戏时,按F11可以切换鼠标和触摸屏两种操作模式,而手机端通常只有触摸屏这一种操作模式。不同的操作模式,scroll_view的scrolling_content会生成在不同的路径下,触摸屏使用touch_path获得scrolling_content的绝对路径,而鼠标控制使用mouse_path获得。如果不想让路径随操作模式变化,可以指定$touch变量为true,此时路径将固定为touch_path。
|
||||
|
||||
```json
|
||||
"scroll_view0@common.scrolling_panel": {
|
||||
// 手动指定$touch变量为true
|
||||
"$touch": true
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### grid
|
||||
|
||||
@@ -2639,4 +2669,4 @@ def OnRichTextCreateFinishCallback(self):
|
||||
|
||||
##### 使用事项
|
||||
- 富文本是Python实现的一个复合控件,在生成富文本后会有部分数据缓存在RichTextItem实例中,因此不支持使用clone接口复制已创建完成的富文本,但是clone没有调用过readRichText的富文本是可行的。
|
||||
- 我们在内部会缓存路径与RichTextItem实例的映射,使用GetRichTextItem接口,传入相同路径返回的RichTextItem实例也会是相同的。
|
||||
- 我们在内部会缓存路径与RichTextItem实例的映射,使用GetRichTextItem接口,传入相同路径返回的RichTextItem实例也会是相同的。
|
||||
|
||||
@@ -206,7 +206,7 @@ python是一门很容易入门的编程语言,没有接触过python的开发
|
||||
| ----------------------- | ------------------------------------------------------------ |
|
||||
| tutorialScripts | python脚本的根目录,该目录的脚本会被加到python运行环境下,可以从该路径开始import脚本文件,例如from tutorilaScripts import modMain |
|
||||
| \_\_init\_\_.py | 是python module的标识,表示这是一个可以import的module,同时也可以做一些初始化的操作,内容可为空,但是文件必须有。 |
|
||||
| modMain.py | 必须有该文件,用来初始化我们的Mod |
|
||||
| modMain.py | 必须有该文件,用来初始化我们的Mod。**因为会基于该文件的层级进行打包,所以该文件必须放在Scripts(脚本)文件夹下,否则会导致Mod在手机端失效** |
|
||||
| tutorialClientSystem.py | 执行客户端逻辑的system |
|
||||
| tutorialServerSystem.py | 执行服务器逻辑的system |
|
||||
|
||||
|
||||
257
mcguide/20-玩法开发/13-模组SDK编程/2-Python脚本开发/103-3.7版本物品id变更.md
Normal file
@@ -0,0 +1,257 @@
|
||||
# 3.7版本物品id变更
|
||||
|
||||
## 简介
|
||||
|
||||
微软在1.21.50继续修改了部分方块ID,取消了附加值,相关链接请参阅[基岩版扁平化](https://zh.minecraft.wiki/w/%E5%AE%98%E6%96%B9%E9%A1%B5%E9%9D%A2/%E5%9F%BA%E5%B2%A9%E7%89%88%E6%89%81%E5%B9%B3%E5%8C%96),请开发者注意适配。
|
||||
|
||||
## 处理方法
|
||||
|
||||
在ModSDK的接口与事件中,我们针对上述情况做了以下处理:
|
||||
|
||||
1. 对于返回物品信息字典的接口与事件:
|
||||
|
||||
newItemName及newAuxValue返回新版名称与附加值。
|
||||
|
||||
原字段itemName及auxValue返回旧版名称与附加值。
|
||||
|
||||
2. 对于接受物品信息字典的接口与事件:
|
||||
|
||||
当字典存在newItemName及newAuxValue时,使用这两个字段。
|
||||
|
||||
不存在时,使用旧字段itemName及auxValue。
|
||||
|
||||
## 注意事项
|
||||
|
||||
* 通过附加值获取获取方块状态接口没有做兼容,例如GetBlockAuxValueFromStates、GetBlockStatesFromAuxValue、GetBlockStates、SetBlockStates,如果您的组件对此有依赖,则需要对这次的改动自行做兼容处理。
|
||||
|
||||
* **开发完成或正在开发的组件,建议统一采用newItemName及newAuxValue字段,也不要新旧字段混用。**
|
||||
|
||||
* 某些写法可能会失效,例如
|
||||
|
||||
```python
|
||||
# 获取itemDict,然后在他基础上修改itemName或auxValue后再用来生成
|
||||
itemdict = GetPlayerItem()
|
||||
itemdict['itemName'] = 'xxx'
|
||||
itemdict['auxValue'] = itemdict['auxValue']+1
|
||||
SpawnItemToPlayerInv(itemdict)
|
||||
```
|
||||
|
||||
因为GetPlayerItem返回的itemDict含有新字段,再传入SpawnItemToPlayerInv时,会读取新字段生成物品,因此对原字段的修改无效。
|
||||
|
||||
## 版本变更方块数据
|
||||
|
||||
以下为3.7版本变更了id、名称等的物品列表,表格内的名称省略了minecraft命名空间。
|
||||
|
||||
## 统计信息
|
||||
|
||||
- 变更项数量: 89
|
||||
- 仅名称变更: 12
|
||||
- 新增项数量: 69
|
||||
- 移除项数量: 17
|
||||
|
||||
### 变更项
|
||||
|
||||
| 新中文名 | 旧中文名 | 旧命名 | 旧附加值 | 新命名 | 新附加值 |
|
||||
| :------ | ------ | ------ | ------ | ------ | ------ |
|
||||
| 蒲公英 | 蒲公英 | yellow_flower | 0 | dandelion | 0
|
||||
| 虫蚀石头 | 虫蚀石头 | monster_egg | 0 | infested_stone | 0
|
||||
| 石砖 | 石砖 | stonebrick | 0 | stone_bricks | 0
|
||||
| 蘑菇柄 | 蘑菇柄 | brown_mushroom_block | 15 | mushroom_stem | 0
|
||||
| 双红砂岩台阶 | 红砂岩双层台阶 | double_stone_block_slab2 | 0 | red_sandstone_double_slab | 0
|
||||
| 红砂岩台阶 | 红砂岩台阶 | stone_block_slab2 | 0 | red_sandstone_slab | 0
|
||||
| 末地石砖台阶 | 末地石砖台阶 | stone_block_slab3 | 0 | end_stone_brick_slab | 0
|
||||
| 苔石砖台阶 | 苔石砖台阶 | stone_block_slab4 | 0 | mossy_stone_brick_slab | 0
|
||||
| 光源方块-亮度0 | 光源方块 | light_block | 0 | light_block_0 | 0
|
||||
| 虫蚀圆石 | 虫蚀圆石 | monster_egg | 1 | infested_cobblestone | 0
|
||||
| 虫蚀石砖 | 虫蚀石砖 | monster_egg | 2 | infested_stone_bricks | 0
|
||||
| 虫蚀苔石砖 | 虫蚀苔石砖 | monster_egg | 3 | infested_mossy_stone_bricks | 0
|
||||
| 虫蚀裂纹石砖 | 虫蚀裂纹石砖 | monster_egg | 4 | infested_cracked_stone_bricks | 0
|
||||
| 虫蚀雕纹石砖 | 虫蚀雕纹石砖 | monster_egg | 5 | infested_chiseled_stone_bricks | 0
|
||||
| 苔石砖 | 苔石砖 | stonebrick | 1 | mossy_stone_bricks | 0
|
||||
| 裂纹石砖 | 裂纹石砖 | stonebrick | 2 | cracked_stone_bricks | 0
|
||||
| 雕纹石砖 | 雕纹石砖 | stonebrick | 3 | chiseled_stone_bricks | 0
|
||||
| 双砂岩台阶 | 砂岩双层台阶 | double_stone_block_slab | 1 | sandstone_double_slab | 0
|
||||
| 双圆石台阶 | 圆石双层台阶 | double_stone_block_slab | 3 | cobblestone_double_slab | 0
|
||||
| 双红砖台阶 | 红砖双层台阶 | double_stone_block_slab | 4 | brick_double_slab | 0
|
||||
| 双石砖台阶 | 石砖双层台阶 | double_stone_block_slab | 5 | stone_brick_double_slab | 0
|
||||
| 双石英台阶 | 石英双层台阶 | double_stone_block_slab | 6 | quartz_double_slab | 0
|
||||
| 双下界砖台阶 | 下界砖双层台阶 | double_stone_block_slab | 7 | nether_brick_double_slab | 0
|
||||
| 紫珀台阶 | 紫珀台阶 | stone_block_slab2 | 1 | purpur_slab | 0
|
||||
| 海晶石台阶 | 海晶石台阶 | stone_block_slab2 | 2 | prismarine_slab | 0
|
||||
| 暗海晶石台阶 | 暗海晶石台阶 | stone_block_slab2 | 3 | dark_prismarine_slab | 0
|
||||
| 海晶石砖台阶 | 海晶石砖台阶 | stone_block_slab2 | 4 | prismarine_brick_slab | 0
|
||||
| 苔石台阶 | 苔石台阶 | stone_block_slab2 | 5 | mossy_cobblestone_slab | 0
|
||||
| 平滑砂岩台阶 | 平滑砂岩台阶 | stone_block_slab2 | 6 | smooth_sandstone_slab | 0
|
||||
| 红色下界砖台阶 | 红色下界砖台阶 | stone_block_slab2 | 7 | red_nether_brick_slab | 0
|
||||
| 平滑红砂岩台阶 | 平滑红砂岩台阶 | stone_block_slab3 | 1 | smooth_red_sandstone_slab | 0
|
||||
| 磨制安山岩台阶 | 磨制安山岩台阶 | stone_block_slab3 | 2 | polished_andesite_slab | 0
|
||||
| 安山岩台阶 | 安山岩台阶 | stone_block_slab3 | 3 | andesite_slab | 0
|
||||
| 闪长岩台阶 | 闪长岩台阶 | stone_block_slab3 | 4 | diorite_slab | 0
|
||||
| 磨制闪长岩台阶 | 磨制闪长岩台阶 | stone_block_slab3 | 5 | polished_diorite_slab | 0
|
||||
| 花岗岩台阶 | 花岗岩台阶 | stone_block_slab3 | 6 | granite_slab | 0
|
||||
| 磨制花岗岩台阶 | 磨制花岗岩台阶 | stone_block_slab3 | 7 | polished_granite_slab | 0
|
||||
| 平滑石英台阶 | 平滑石英台阶 | stone_block_slab4 | 1 | smooth_quartz_slab | 0
|
||||
| 石头台阶 | 石头台阶 | stone_block_slab4 | 2 | normal_stone_slab | 0
|
||||
| 切制砂岩台阶 | 切制砂岩台阶 | stone_block_slab4 | 3 | cut_sandstone_slab | 0
|
||||
| 切制红砂岩台阶 | 切制红砂岩台阶 | stone_block_slab4 | 4 | cut_red_sandstone_slab | 0
|
||||
| 双石化橡木台阶 | 石化橡木双层台阶 | double_stone_block_slab | 2 | petrified_oak_double_slab | 0
|
||||
| 双紫珀台阶 | 双紫珀台阶 | double_stone_block_slab2 | 1 | purpur_double_slab | 0
|
||||
| 双海晶石台阶 | 双海晶石台阶 | double_stone_block_slab2 | 2 | prismarine_double_slab | 0
|
||||
| 双暗海晶石台阶 | 双暗海晶石台阶 | double_stone_block_slab2 | 3 | dark_prismarine_double_slab | 0
|
||||
| 双海晶石砖台阶 | 双海晶石砖台阶 | double_stone_block_slab2 | 4 | prismarine_brick_double_slab | 0
|
||||
| 双苔石台阶 | 双苔石台阶 | double_stone_block_slab2 | 5 | mossy_cobblestone_double_slab | 0
|
||||
| 双平滑砂岩台阶 | 双平滑砂岩台阶 | double_stone_block_slab2 | 6 | smooth_sandstone_double_slab | 0
|
||||
| 双红色下界砖台阶 | 双红色下界砖台阶 | double_stone_block_slab2 | 7 | red_nether_brick_double_slab | 0
|
||||
| 双平滑红砂岩台阶 | 双平滑红砂岩台阶 | double_stone_block_slab3 | 1 | smooth_red_sandstone_double_slab | 0
|
||||
| 双磨制安山岩台阶 | 双磨制安山岩台阶 | double_stone_block_slab3 | 2 | polished_andesite_double_slab | 0
|
||||
| 双安山岩台阶 | 双安山岩台阶 | double_stone_block_slab3 | 3 | andesite_double_slab | 0
|
||||
| 双闪长岩台阶 | 双闪长岩台阶 | double_stone_block_slab3 | 4 | diorite_double_slab | 0
|
||||
| 双磨制闪长岩台阶 | 双磨制闪长岩台阶 | double_stone_block_slab3 | 5 | polished_diorite_double_slab | 0
|
||||
| 双花岗岩台阶 | 双花岗岩台阶 | double_stone_block_slab3 | 6 | granite_double_slab | 0
|
||||
| 双磨制花岗岩台阶 | 双磨制花岗岩台阶 | double_stone_block_slab3 | 7 | polished_granite_double_slab | 0
|
||||
| 双平滑石英台阶 | 双平滑石英台阶 | double_stone_block_slab4 | 1 | smooth_quartz_double_slab | 0
|
||||
| 双石台阶 | 双石台阶 | double_stone_block_slab4 | 2 | normal_stone_double_slab | 0
|
||||
| 双切制砂岩台阶 | 双切制砂岩台阶 | double_stone_block_slab4 | 3 | cut_sandstone_double_slab | 0
|
||||
| 双切制红砂岩台阶 | 双切制红砂岩台阶 | double_stone_block_slab4 | 4 | cut_red_sandstone_double_slab | 0
|
||||
| 雕纹砂岩 | 雕纹砂岩 | sandstone | 1 | chiseled_sandstone | 0
|
||||
| 切制砂岩 | 切制砂岩 | sandstone | 2 | cut_sandstone | 0
|
||||
| 平滑砂岩 | 平滑砂岩 | sandstone | 3 | smooth_sandstone | 0
|
||||
| 暗海晶石 | 暗海晶石 | prismarine | 1 | dark_prismarine | 0
|
||||
| 海晶石砖 | 海晶石砖 | prismarine | 2 | prismarine_bricks | 0
|
||||
| 红沙 | 红沙 | sand | 1 | red_sand | 0
|
||||
| 雕纹石英块 | 雕纹石英块 | quartz_block | 1 | chiseled_quartz_block | 0
|
||||
| 石英柱 | 石英柱 | quartz_block | 2 | quartz_pillar | 0
|
||||
| 平滑石英块 | 平滑石英块 | quartz_block | 3 | smooth_quartz | 0
|
||||
| 雕纹红砂岩 | 雕纹红砂岩 | red_sandstone | 1 | chiseled_red_sandstone | 0
|
||||
| 切制红砂岩 | 切制红砂岩 | red_sandstone | 2 | cut_red_sandstone | 0
|
||||
| 平滑红砂岩 | 平滑红砂岩 | red_sandstone | 3 | smooth_red_sandstone | 0
|
||||
| 开裂的铁砧 | 开裂的铁砧 | anvil | 4 | chipped_anvil | 0
|
||||
| 损坏的铁砧 | 损坏的铁砧 | anvil | 8 | damaged_anvil | 0
|
||||
| 砂土 | 砂土 | dirt | 1 | coarse_dirt | 0
|
||||
| 苔石墙 | 苔石墙 | cobblestone_wall | 1 | mossy_cobblestone_wall | 0
|
||||
| 花岗岩墙 | 花岗岩墙 | cobblestone_wall | 2 | granite_wall | 0
|
||||
| 闪长岩墙 | 闪长岩墙 | cobblestone_wall | 3 | diorite_wall | 0
|
||||
| 安山岩墙 | 安山岩墙 | cobblestone_wall | 4 | andesite_wall | 0
|
||||
| 砂岩墙 | 砂岩墙 | cobblestone_wall | 5 | sandstone_wall | 0
|
||||
| 红砖墙 | 红砖墙 | cobblestone_wall | 6 | brick_wall | 0
|
||||
| 石砖墙 | 石砖墙 | cobblestone_wall | 7 | stone_brick_wall | 0
|
||||
| 苔石砖墙 | 苔石砖墙 | cobblestone_wall | 8 | mossy_stone_brick_wall | 0
|
||||
| 下界砖墙 | 下界砖墙 | cobblestone_wall | 9 | nether_brick_wall | 0
|
||||
| 末地石砖墙 | 末地石砖墙 | cobblestone_wall | 10 | end_stone_brick_wall | 0
|
||||
| 海晶石墙 | 海晶石墙 | cobblestone_wall | 11 | prismarine_wall | 0
|
||||
| 红砂岩墙 | 红砂岩墙 | cobblestone_wall | 12 | red_sandstone_wall | 0
|
||||
| 红色下界砖墙 | 红色下界砖墙 | cobblestone_wall | 13 | red_nether_brick_wall | 0
|
||||
| 湿海绵 | 湿海绵 | sponge | 1 | wet_sponge | 0
|
||||
|
||||
### 仅名称变更(内容不变)
|
||||
|
||||
| 新中文名 | 旧中文名 | 英文命名 | 附加值 |
|
||||
| :------ | ------ | ------ | ------ |
|
||||
| 橡木门 | 木门 | wooden_door | 0 |
|
||||
| 双绯红木台阶 | 绯红木双层台阶 | crimson_double_slab | 0 |
|
||||
| 双诡异木台阶 | 诡异木双层台阶 | warped_double_slab | 0 |
|
||||
| 双深板岩圆石台阶 | 深板岩圆石双层台阶 | cobbled_deepslate_double_slab | 0 |
|
||||
| 双磨制深板岩台阶 | 磨制深板岩双层台阶 | polished_deepslate_double_slab | 0 |
|
||||
| 双深板岩瓦台阶 | 深板岩瓦双层台阶 | deepslate_tile_double_slab | 0 |
|
||||
| 双深板岩砖台阶 | 深板岩砖双层台阶 | deepslate_brick_double_slab | 0 |
|
||||
| 悬挂式云杉木告示牌 | 云杉木悬挂告示牌 | spruce_hanging_sign | 0 |
|
||||
| 悬挂式白桦木告示牌 | 白桦木悬挂告示牌 | birch_hanging_sign | 0 |
|
||||
| 悬挂式金合欢木告示牌 | 金合欢木悬挂告示牌 | acacia_hanging_sign | 0 |
|
||||
| 悬挂式深色橡木告示牌 | 深色橡木悬挂告示牌 | dark_oak_hanging_sign | 0 |
|
||||
| 双樱花木台阶 | 樱花木双层台阶 | cherry_double_slab | 0 |
|
||||
|
||||
### 新增项
|
||||
|
||||
| 中文名称 | 英文命名 | 附加值 |
|
||||
| :------ | ------ | ------ |
|
||||
| 双平滑石头台阶 | smooth_stone_double_slab | 0 |
|
||||
| 下界砖 | nether_brick | 0 |
|
||||
| 骷髅模型 | skeleton_skull | 0 |
|
||||
| 潜声感测器 | sculk_sensor | 0 |
|
||||
| 荧光物品展示框 | glow_frame | 0 |
|
||||
| 潜声 | sculk | 0 |
|
||||
| 红树木门 | mangrove_door | 0 |
|
||||
| 红树木告示牌 | mangrove_standing_sign | 0 |
|
||||
| 双红树木台阶 | mangrove_double_slab | 0 |
|
||||
| 悬挂式橡木告示牌 | oak_hanging_sign | 0 |
|
||||
| 悬挂式丛林木告示牌 | jungle_hanging_sign | 0 |
|
||||
| 悬挂式绯红木告示牌 | crimson_hanging_sign | 0 |
|
||||
| 悬挂式诡异木告示牌 | warped_hanging_sign | 0 |
|
||||
| 悬挂式红树木告示牌 | mangrove_hanging_sign | 0 |
|
||||
| 悬挂式竹告示牌 | bamboo_hanging_sign | 0 |
|
||||
| 悬挂式樱花木告示牌 | cherry_hanging_sign | 0 |
|
||||
| 光源方块-亮度1 | light_block_1 | 0 |
|
||||
| 光源方块-亮度2 | light_block_2 | 0 |
|
||||
| 光源方块-亮度3 | light_block_3 | 0 |
|
||||
| 光源方块-亮度4 | light_block_4 | 0 |
|
||||
| 光源方块-亮度5 | light_block_5 | 0 |
|
||||
| 光源方块-亮度6 | light_block_6 | 0 |
|
||||
| 光源方块-亮度7 | light_block_7 | 0 |
|
||||
| 光源方块-亮度8 | light_block_8 | 0 |
|
||||
| 光源方块-亮度9 | light_block_9 | 0 |
|
||||
| 光源方块-亮度10 | light_block_10 | 0 |
|
||||
| 光源方块-亮度11 | light_block_11 | 0 |
|
||||
| 光源方块-亮度12 | light_block_12 | 0 |
|
||||
| 光源方块-亮度13 | light_block_13 | 0 |
|
||||
| 光源方块-亮度14 | light_block_14 | 0 |
|
||||
| 光源方块-亮度15 | light_block_15 | 0 |
|
||||
| 紫珀柱 | purpur_pillar | 0 |
|
||||
| 凋灵骷髅模型 | wither_skeleton_skull | 0 |
|
||||
| 僵尸模型 | zombie_head | 0 |
|
||||
| 模型 | player_head | 0 |
|
||||
| 苦力怕模型 | creeper_head | 0 |
|
||||
| 龙的模型 | dragon_head | 0 |
|
||||
| 猪灵模型 | piglin_head | 0 |
|
||||
| 苍白橡木按钮 | pale_oak_button | 0 |
|
||||
| 苍白橡木门 | pale_oak_door | 0 |
|
||||
| 苍白橡木栅栏 | pale_oak_fence | 0 |
|
||||
| 苍白橡木栅栏大门 | pale_oak_fence_gate | 0 |
|
||||
| 苍白橡木悬挂告示牌 | pale_oak_hanging_sign | 0 |
|
||||
| 去皮苍白橡树原木 | stripped_pale_oak_log | 0 |
|
||||
| 苍白橡树原木 | pale_oak_log | 0 |
|
||||
| 苍白橡木木板 | pale_oak_planks | 0 |
|
||||
| 苍白橡木压力板 | pale_oak_pressure_plate | 0 |
|
||||
| 苍白橡木台阶 | pale_oak_slab | 0 |
|
||||
| 苍白橡木双台阶 | pale_oak_double_slab | 0 |
|
||||
| 苍白橡木楼梯 | pale_oak_stairs | 0 |
|
||||
| 苍白橡木活板门 | pale_oak_trapdoor | 0 |
|
||||
| 去皮苍白橡木 | stripped_pale_oak_wood | 0 |
|
||||
| 苍白橡木 | pale_oak_wood | 0 |
|
||||
| 苍白橡木树苗 | pale_oak_sapling | 0 |
|
||||
| 苍白橡木树叶 | pale_oak_leaves | 0 |
|
||||
| 苍白苔藓块 | pale_moss_block | 0 |
|
||||
| 苍白苔藓地毯 | pale_moss_carpet | 0 |
|
||||
| 苍白垂须 | pale_hanging_moss | 0 |
|
||||
| 嘎枝之心 | creaking_heart | 0 |
|
||||
| 树脂砖块 | resin_bricks | 0 |
|
||||
| 树脂砖台阶 | resin_brick_slab | 0 |
|
||||
| 双树脂砖台阶 | resin_brick_double_slab | 0 |
|
||||
| 树脂砖楼梯 | resin_brick_stairs | 0 |
|
||||
| 树脂砖墙 | resin_brick_wall | 0 |
|
||||
| 张开的眼眸花 | open_eyeblossom | 0 |
|
||||
| 闭合的眼眸花 | closed_eyeblossom | 0 |
|
||||
| 雕纹树脂砖块 | chiseled_resin_bricks | 0 |
|
||||
| 树脂块 | resin_block | 0 |
|
||||
| 树脂团 | resin_clump | 0 |
|
||||
|
||||
### 移除项
|
||||
|
||||
| 中文名称 | 英文命名 | 附加值 |
|
||||
| :------ | ------ | ------ |
|
||||
| 石头双层台阶 | double_stone_block_slab | 0 |
|
||||
| 蘑菇 | brown_mushroom_block | 0 |
|
||||
| 下界砖块 | nether_brick | 0 |
|
||||
| 生物头颅 | skull | 0 |
|
||||
| 紫珀柱子 | purpur_block | 2 |
|
||||
| 幽匿感测体 | sculk_sensor | 0 |
|
||||
| 幽匿块 | sculk | 0 |
|
||||
| 红树林门 | mangrove_door | 0 |
|
||||
| 红树林告示牌 | mangrove_standing_sign | 0 |
|
||||
| 双红树林台阶 | mangrove_double_slab | 0 |
|
||||
| 橡树悬挂告示牌 | oak_hanging_sign | 0 |
|
||||
| 丛林悬挂告示牌 | jungle_hanging_sign | 0 |
|
||||
| 绯红悬挂告示牌 | crimson_hanging_sign | 0 |
|
||||
| 翘曲悬挂告示牌 | warped_hanging_sign | 0 |
|
||||
| 红树林悬挂告示牌 | mangrove_hanging_sign | 0 |
|
||||
| 竹制悬挂告示牌 | bamboo_hanging_sign | 0 |
|
||||
| 樱花悬挂告示牌 | cherry_hanging_sign | 0 |
|
||||
94
mcguide/20-玩法开发/15-自定义游戏内容/1-自定义物品/9-自定义鱼竿.md
Normal file
@@ -0,0 +1,94 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 分钟
|
||||
---
|
||||
|
||||
# 自定义鱼竿
|
||||
|
||||
## 概述
|
||||
|
||||
属于特殊的自定义物品,在支持自定义物品所有特性的基础上,还具有原版鱼竿相关功能,可以自定义鱼线长、鱼线颜色,以及鱼漂,其中鱼漂支持自定义实体
|
||||
|
||||
|
||||
|
||||
## 注册
|
||||
|
||||
1. 与自定义基础物品的注册1-6步相同
|
||||
|
||||
|
||||
1. 在behavior/netease_items_beh的json中添加武器/工具相关的定义,包括:
|
||||
|
||||
custom_item_type为custom_item_type
|
||||
|
||||
一个netease:fishing_hook组件,选填。组件的参数见[json组件](#json组件)
|
||||
|
||||
```json
|
||||
{
|
||||
"minecraft:item": {
|
||||
"description": {
|
||||
"category": "Custom",
|
||||
"identifier": "customshield:test_fishing_rod",
|
||||
"custom_item_type": "fishing_rod"
|
||||
},
|
||||
"components": {
|
||||
"netease:fishing_hook":{
|
||||
"hook_entity":["minecraft:creeper"],//代表投掷出的将会是一个苦力怕实体作为鱼漂,苦力实体无AI。
|
||||
"line_max":50,//代表鱼线可以达到的最长长度(鱼漂与玩家实体的直线距离),超过这个长度后鱼线将会直接断开
|
||||
"line_color":[0.6, 0.5, 0.3, 1.0]//线的颜色和透明度
|
||||
}
|
||||
}
|
||||
},
|
||||
"format_version": "1.10"
|
||||
}
|
||||
```
|
||||
|
||||
## JSON组件
|
||||
|
||||
### 网易components
|
||||
|
||||
* netease:fishing_hook
|
||||
|
||||
| 键 | 类型 | 默认值 | 解释 |
|
||||
| -------- | ---- | --------- | ---------------------------------------------- |
|
||||
| hook_entity | str | | 实体的identify,填入的实体除了无AI以外,支持动画、动画控制器等实体一系列操控 |
|
||||
| line_max | int | 32 | 代表鱼线可以达到的最长长度(鱼漂与玩家实体的直线距离),超过这个长度后鱼线将会直接断开。如果不配置代表和原版鱼线一致为32米 |
|
||||
| line_color | list(rgba) | | 代表鱼线的初始颜色与透明度,如果不配置默认为原版鱼竿黑色 |
|
||||
|
||||
|
||||
## 新增的事件和接口
|
||||
|
||||
### 事件
|
||||
|
||||
* <a href="../../../../mcdocs/1-ModAPI/事件/玩家.html#playerfishingserverevent">PlayerFishingServerEvent</a>
|
||||
|
||||
服务端,钓鱼成功收杆时触发事件
|
||||
|
||||
* <a href="../../../../mcdocs/1-ModAPI/事件/玩家html#playerfishingafterserverevent">PlayerFishingAfterServerEvent</a>
|
||||
|
||||
服务端,钓鱼成功收杆后触发事件
|
||||
|
||||
* <a href="../../../../mcdocs/1-ModAPI/事件/玩家html#playerstartfishingserverevent">PlayerStartFishingServerEvent</a>
|
||||
|
||||
服务端,玩家开始钓鱼事件
|
||||
|
||||
|
||||
### 接口
|
||||
* <a href="../../../../mcdocs/1-ModAPI/接口/玩家/背包.html#getplayerfishitem">GetPlayerFishItem</a>
|
||||
|
||||
服务端接口。获取玩家钓鱼时候的鱼竿物品字典
|
||||
|
||||
|
||||
* <a href="../../../../mcdocs/1-ModAPI/接口/玩家/行为.html#getplayerisfishing">GetPlayerIsFishing</a>
|
||||
|
||||
客户端接口。获取玩家是否在钓鱼
|
||||
|
||||
|
||||
* <a href="../../../../mcdocs/1-ModAPI/接口/玩家/背包.html#getplayerfishhookentity">GetPlayerFishHookEntity</a>
|
||||
|
||||
客户端接口。获取玩家钓鱼时候的鱼漂实体id
|
||||
|
||||
|
||||
## demo解释
|
||||
|
||||
[自定义鱼竿](../../13-模组SDK编程/60-Demo示例.md#CustomFishHookItemMod)中定义了一个自定义鱼竿
|
||||
@@ -169,7 +169,6 @@ time: 分钟
|
||||
指定语言文件键,用于映射鼠标悬停在物品栏和快捷栏中的方块物品上时显示的文本。如果给定的字符串无法解析为本地字符串,则将显示给定的原始字符串。使用需要方块行为的 `format_version`大于等于1.19.60。
|
||||
|
||||
|
||||
|
||||
<span id="netease_portal"></span>
|
||||
|
||||
### netease:portal
|
||||
@@ -197,7 +196,7 @@ time: 分钟
|
||||
| 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。
|
||||
- 微软自定义生物type为"minecraft:entity"中"description"的"identifier"项,可参考[自定义生物文档](../3-自定义生物/01-自定义基础生物.md)及[CustomBlocksMod](../../13-模组SDK编程/60-Demo示例.md#CustomBlocksMod)中的customblocks_test_mobspawner1.json。
|
||||
- 自定义刷怪箱方块的base_block需要设为mob_spawner。
|
||||
|
||||
|
||||
@@ -275,8 +274,6 @@ time: 分钟
|
||||
| ----- | ---- | ------ | ------------------------------------------------------------ |
|
||||
| value | bool | | 必须设置,用于设置在放置其他方块时,如果该位置已有含netease:can_built_over配置的方块,其他方块能否和放置在此方块中 |
|
||||
|
||||
|
||||
|
||||
<span id="netease_tier"></span>
|
||||
|
||||
### netease:tier
|
||||
|
||||
@@ -324,12 +324,18 @@ sidebarDepth: 4
|
||||
| <div style="width:100px">属性</div> | 解释 |
|
||||
| :---------------------------------: | ------------------------------------------------------------ |
|
||||
| recipeId | 合成配方的ID,一般为合成的物品的**identifier**,支持[自定义配方](../5-自定义配方.md) |
|
||||
| recipeShapeId | 配方Id,对应配方Json的identifier字段。 |
|
||||
| tag | 配方tag,对应配方Json的tags字段,可不配置,默认为crafing_table。仅支持工作台、自定义工作台、制图台、切石机配方 |
|
||||
| recipeSize | 合成表显示的大小,用二维浮点数组表示。<br/>该属性系统默认值为 [90.0, 48.0],可以不写。 |
|
||||
| aux | 合成物品的附加值**AuxValue**,该属性可以不写,系统默认值为0(整型)。 |
|
||||
| info | 合成物品的备注文本,显示在物品的下方。如果不写该属性,则无备注,内容文本会自动往上对齐。 |
|
||||
| content | 内容文本,默认值为"",支持格式化文本。文本框大小会自动适应页面,如果文本内容过多将不显示超出页面的文字。 |
|
||||
| contentTextSize | 内容文本的字体大小。<br>该属性系统默认值为**BookConfig.TextSize.content**,数值为**10**(整型),可以不写。 |
|
||||
|
||||
注意:
|
||||
- **recipeId仍然需要配置**
|
||||
- 如果同时配置recipeId、recipeShapeId,则会优先使用recipeShapeId获取配方、如果获取失败,才使用recipeId
|
||||
|
||||
#### 6.实体页
|
||||
|
||||
实体页在json文件中的type属性值为 "**entityPage**",展示的实体会**自动顺时针旋转**,示例在**behavior_pack/customBooks/entry/entityEntry.json**。
|
||||
|
||||
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 时刻都不会同时执行,从而实现了更均匀的性能负载分布。
|
||||
242
mcguide/20-玩法开发/20-物理玩法开发/1-物理的使用指南.md
Normal file
@@ -0,0 +1,242 @@
|
||||
# 物理的使用指南
|
||||
|
||||
## 使用准则与免责声明
|
||||
|
||||
### 使用准则
|
||||
|
||||
1. 仅限第三方用户生成内容(UGC)使用
|
||||
2. 只有创作者创建的自定义实体才能与物理刚体绑定,原版实体无法与PhysX创建的刚体绑定
|
||||
3. 物理身件可以与其他游戏物件(包括原生游戏物件)产生互动,但是原生游戏物件与其他原生游戏物件之间的互动方式及物理碰撞不会被改变
|
||||
4. 当两个碰撞同时发生时,核心游戏的物理引擎具有最高优先级
|
||||
|
||||
只有满足上述条件,您的模组才能符合要求进行上架
|
||||
|
||||
### 免责声明
|
||||
|
||||
物理相关api与特性,可能会在将来调整并且不向前兼容。请随时做好调整的准备
|
||||
|
||||
但是,每次调整都会做出充分的预告和调整内容公告,方便你对您的模组进行最新内容的兼容。
|
||||
|
||||
## 准备工作
|
||||
|
||||
由于我们的物理引擎是用的 NVIDIA PhysX,您可以先前往NVIDIA官网下载PhysX Visual Debugger,方便后续调试。
|
||||
[https://developer.nvidia.com/physx-visual-debugger](https://developer.nvidia.com/physx-visual-debugger)
|
||||

|
||||
## 全局配置
|
||||
|
||||
在使用物理引擎之前,您需要在模组的 behavior_packs 行为包中新增 physx_setting.json 全局配置文件
|
||||

|
||||
文件里面需要设置成
|
||||
```json
|
||||
{
|
||||
"enable": true
|
||||
}
|
||||
```
|
||||
保存后,您的模组可以正常使用 PhysX 物理引擎了。
|
||||
|
||||
## 开始创作
|
||||
|
||||
现在我会通过demo,来向你介绍physx能做的内容
|
||||
|
||||
### 创建自定义刚体
|
||||
|
||||
使用物理内容的之前,您首先需要创建一个新的物理刚体,物理刚体**必须**绑定在`自定义实体`上,且创建刚体的方法只能在 `AddEntityServerEvent` 事件中使用
|
||||
|
||||
```python
|
||||
# 创建一个自定义刚体
|
||||
comp = serverApi.GetEngineCompFactory().CreatePhysx(entityId)
|
||||
comp.CreatePxActor()
|
||||
```
|
||||
现在你已经为这个 entityId 的实体添加了一个物理刚体
|
||||
|
||||
> 注意: 刚体创建数量不得大于 8192, 虽然Physx限制是31767,但是我们需要预留一些刚体阈值给到其他实体和客户端内容
|
||||
> 注意:必须要在 AddEntityServerEvent 事件中创建刚体,否则会报错
|
||||
> 注意:实体必须绑定在 自定义实体上,不得绑定在原版实体上
|
||||
|
||||
### 添加包围盒
|
||||
|
||||
目前这个刚体暂时没有任何功能和属性,为了让它能够正常工作,我们需要给刚体添加一些属性
|
||||
|
||||
首先需要添加包围盒,包围盒是刚体的基本属性,你只有添加了包围盒,才能让刚体与世界实体进行交互
|
||||
|
||||
添加包围盒的方法是 AddBoxGeometry ,参数方法如下
|
||||
```python
|
||||
# localTransform tuple(float,float,float) 盒子中心相对实体原点的偏移
|
||||
# halfX float 表示盒子长度的一半
|
||||
# halfY float 表示盒子高度的一半
|
||||
# halfZ float 表示盒子宽度的一半
|
||||
# staticFriction float 静摩擦系数
|
||||
# dynamicFriction float 动摩擦系数,默认为e 注意:此摩擦力设置为0,并不代表刚体与原生游戏交互也是 0 摩擦力
|
||||
# restitution float 弹性恢复系数,默认为0
|
||||
# eventMask int PxEventMask枚举,用于监听碰撞事件,默认为PxRigidBodyFlag.Null,即不需要碰撞事件
|
||||
# userData None或str 可记录自定义数据,长度不超过20,默认为None
|
||||
comp.AddBoxGeometry((0, 0.9, 0), 0.3, 0.9, 0.3, 0.05, 0.05, 0, PxEventMask.Server | PxEventMask.Found, None)
|
||||
```
|
||||
|
||||
PxEventMask 枚举目前有六个
|
||||
1. PxEventMask.Server 服务端事件
|
||||
2. PxEventMask.Client 客户端事件
|
||||
3. PxEventMask.Lost 结束碰撞事件
|
||||
4. PxEventMask.Found 开始碰撞事件
|
||||
5. PxEventMask.Found_Detail 碰撞事件的详细信息
|
||||
6. PxEventMask.Null 该刚体不附加任何事件
|
||||
|
||||
此时你已经成功为你的刚体创建好了包围盒
|
||||
|
||||
当你启动游戏时,如果你此时提前打开了 PhysX Visual Debugger,那么刚体的包围盒就会显示出来了
|
||||
|
||||

|
||||
|
||||
红色代表世界的原生方块、绿色和黄色代表刚体的包围盒
|
||||

|
||||
|
||||
### 添加约束和运动
|
||||
|
||||
如果你想给刚体添加一些约束,比如刚体的运动锁定某个轴体,您需要添加动态约束
|
||||
|
||||
```python
|
||||
# 下面的方法是规定此刚体只会沿着 X Y Z 轴运动
|
||||
comp.SetRigidDynamicLockFlags(PxRigidDynamicLockFlag.eLOCK_ANGULAR_X | PxRigidDynamicLockFlag.eLOCK_ANGULAR_Y | PxRigidDynamicLockFlag.eLOCK_ANGULAR_Z)
|
||||
```
|
||||
PxRigidDynamicLockFlag 枚举目前有六个
|
||||
1. PxRigidDynamicLockFlag.eLOCK_ANGULAR_X 锁定沿着 X 轴运动
|
||||
2. PxRigidDynamicLockFlag.eLOCK_ANGULAR_Y 锁定沿着 Y 轴运动
|
||||
3. PxRigidDynamicLockFlag.eLOCK_ANGULAR_Z 锁定沿着 Z 轴运动
|
||||
4. PxRigidDynamicLockFlag.eLOCK_LINEAR_X 锁定沿着 X 轴旋转
|
||||
5. PxRigidDynamicLockFlag.eLOCK_LINEAR_Y 锁定沿着 Y 轴旋转
|
||||
6. PxRigidDynamicLockFlag.eLOCK_LINEAR_Z 锁定沿着 Z 轴旋转
|
||||
|
||||
|
||||
如果你希望您的刚体具有运动的属性,你需要将刚体设置为运动学刚体
|
||||
|
||||
那什么叫做有运动的属性?
|
||||
比如你想要手动控制刚体的运动,那么你需要将刚体设置为运动学刚体
|
||||
包括做成刚体风车、刚体传送带等行为
|
||||
|
||||
```python
|
||||
# 目前PxRigdiBodyFlag 仅支持PxRigidBodyFlag.eKINEMATIC
|
||||
comp.SetRigidBodyFlag(PxRigidBodyFlag.eKINEMATIC, True)
|
||||
```
|
||||
|
||||
### AI控制
|
||||
|
||||
利用实体创建刚体,您需要对AI进行调整
|
||||
否则在客户端会出现悬空的情况
|
||||
|
||||
```python
|
||||
comp = serverApi.GetEngineCompFactory().CreateControlAi(entityId)
|
||||
comp.SetBlockControlAi(False)
|
||||
```
|
||||
|
||||
### 做一个简单的风车
|
||||
|
||||
对此我们可以通过上述内容做一个简单的风车,我们计划是配合方块调色板 + 物理引擎来做一个简单的风车
|
||||
|
||||
机械动力的风车是一个比较不错的参考对象
|
||||
|
||||
我们仿照机械动力的风车,来做一个中国版物理引擎的风车
|
||||
|
||||
首先根据上面介绍的内容,我们依次创建刚体,设置包围盒
|
||||
|
||||
但是原版Java版机械动力的风车,可以自由组合方块,所以我们需要一个刚体对应一个方块。目前规划是创建一个长度5格的刚体
|
||||
|
||||
可以做一个for循环
|
||||
|
||||
```python
|
||||
for i in range(2):
|
||||
for j in range(-2,3):
|
||||
comp.AddBoxGeometry((j, 0.5 + i, 0), 0.5, 0.5, 0.5, 0.05, 0.05, 0,
|
||||
PxEventMask.Server | PxEventMask.Client | PxEventMask.Found | PxEventMask.Found_Detail | PxEventMask.Lost,
|
||||
%s,%s,0'%(j, i))
|
||||
```
|
||||
|
||||
此时就会创建一个总长度 5 格的刚体包围盒,并且每个刚体对应一个方块
|
||||
|
||||
因为这个刚体会有旋转的效果,所以我们需要给刚体添加一个运动属性
|
||||
|
||||
```python
|
||||
# 目前PxRigdiBodyFlag 仅支持PxRigidBodyFlag.eKINEMATIC
|
||||
comp.SetRigidBodyFlag(PxRigidBodyFlag.eKINEMATIC, True)
|
||||
```
|
||||
|
||||
因为刚体旋转是通过传入一个四元数并对四元数调整来达到目标的
|
||||
|
||||
所以我们需要创建一个四元数组
|
||||
|
||||
```python
|
||||
# 这里建议用一个成员变量来做存储,方便删除实体后对数据进行调整和删除
|
||||
self.mSkeletons[entityId] = Quaternion(0, 0, 0, 1)
|
||||
```
|
||||
|
||||
因为旋转是一个连续的过程,所以我们需要重写Update方法,以达到每tick刷新我们的旋转数据
|
||||
|
||||
```python
|
||||
# 这里我们对 self.mSkeletons 进行遍历,获取刚刚存储好的四元数,修改的同时传入刚体运动方法
|
||||
for entityId, v in self.mSkeletons.iteritems():
|
||||
# 旋转
|
||||
q = v * Quaternion.AngleAxis(1, Vector3.Up())
|
||||
# 修改变量值
|
||||
self.mSkeletons[entityId] = q
|
||||
# 设置为运动学目标
|
||||
comp = serverApi.GetEngineCompFactory().CreatePhysx(entityId)
|
||||
# 运动
|
||||
comp.SetKinematicTarget(None, q.ToTuple())
|
||||
```
|
||||
|
||||
此时刚体就会每tick旋转角度
|
||||
|
||||
但是目前做的内容仅仅只是对刚体进行了旋转,客户端没有表现,我们还需要用方块调色板对客户端进行调试
|
||||
|
||||
首先创建一个调色板
|
||||
```python
|
||||
dataDict = {'extra': {}, 'void': False, 'actor': {}, 'volume': (1, 5, 2), 'common': {('minecraft:grass_block', 0): [4, 9], ('minecraft:glass', 0): [1, 6], ('minecraft:quartz_block', 0): [3, 8], ('minecraft:white_wool', 0): [0, 5], ('minecraft:oak_planks', 0): [2, 7]}, 'eliminateAir': True}
|
||||
comp = compFactory.CreateBlock(levelId)
|
||||
palette = comp.GetBlankBlockPalette()
|
||||
palette.DeserializeBlockPalette(dataDict)
|
||||
blockGeometryComp = compFactory.CreateBlockGeometry(levelId)
|
||||
geometryName = blockGeometryComp.CombineBlockPaletteToGeometry(palette,"my_block_geometry")
|
||||
```
|
||||
|
||||
然后需要将调色板绑定在实体上,但是绑定刚体是欧拉角,也就是说我们还需要将四元数转成欧拉角
|
||||
|
||||
好在,ModSDK提供了这个简单的方法,物理引擎也有获取客户端刚体的四元数数据
|
||||
|
||||
```python
|
||||
actorRenderComp = compFactory.CreateActorRender(entityId)
|
||||
comp = compFactory.CreatePhysx(entityId)
|
||||
q = Quaternion(comp.GetQuaternion())
|
||||
# AddActorBlockGeometry 在 3.7 新增了一个参数, 会控制先旋转后偏移,还是先偏移后旋转。默认是False
|
||||
# 为了做风车,我们设置为 True,也就是先旋转再偏移
|
||||
actorRenderComp.AddActorBlockGeometry(geometryName, (-2, 0, 0), q.EulerAngles().ToTuple(), 0True)
|
||||
self.mSkeletons.add(entityId)
|
||||
```
|
||||
|
||||
此时刚体的方块调色板就已经绑定在实体上了,但是这个我们查看 PhysX Visual Debugger 时,发现刚体变动了,但是调色板方块没有变化
|
||||
|
||||
所以我们也要对客户端表现进行调整
|
||||
|
||||
同样需要重写 Update 方法,每tick修改方块调色板的旋转角度
|
||||
|
||||
```python
|
||||
def Update(self):
|
||||
for entityId in self.mSkeletons:
|
||||
comp = compFactory.CreatePhysx(entityId)
|
||||
q = comp.GetQuaternion()
|
||||
if q:
|
||||
q = Quaternion(q)
|
||||
actorRenderComp = compFactory.CreateActorRender(entityId)
|
||||
actorRenderComp.SetActorBlockGeometryRotation("my_block_geometry", q.EulerAngles().ToTuple())
|
||||
```
|
||||
|
||||
当全部完成后,就可以做到风车围绕着一个自定义实体进行旋转,然后推动实体进行移动了
|
||||
|
||||
并且你也可以站在这个刚体上,但是站在刚体上,刚体并不会带着玩家一起移动,开发者们可以自行思考解决办法来处理这个问题!
|
||||

|
||||
|
||||
### 思考
|
||||
|
||||
虽然我们现在是在用 Update 的方式去动态的调整刚体旋转和外观旋转
|
||||
|
||||
但是进入游戏后会发现,用此方法来旋转会有一点的顿挫感,虽然影响不是很大,但如果你需要追求细致,可能还不算太完美
|
||||
|
||||
或许还可以通过 `GameRenderTickEvent` 来调整,但是这个方法笔者并没有使用过,所以需要开发者们自行思考研究
|
||||
BIN
mcguide/20-玩法开发/20-物理玩法开发/picture/img.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
mcguide/20-玩法开发/20-物理玩法开发/picture/img_1.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
mcguide/20-玩法开发/20-物理玩法开发/picture/img_2.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
mcguide/20-玩法开发/20-物理玩法开发/picture/img_3.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
mcguide/20-玩法开发/20-物理玩法开发/picture/img_4.png
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
mcguide/20-玩法开发/20-物理玩法开发/picture/img_5.png
Normal file
|
After Width: | Height: | Size: 642 KiB |
239
mcguide/27-手机网络游戏/课程10:使用Spigot开服/15-通过MCSM面板管理服务器.md
Normal file
@@ -0,0 +1,239 @@
|
||||
---
|
||||
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
|
||||
|
||||
**强制要求安装node16+的版本,不然守护进程跑不起来**
|
||||
|
||||
```bash
|
||||
# 下载nodejs
|
||||
cd ~/downloads
|
||||
wget https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xz
|
||||
|
||||
# 创建工作目录并解压
|
||||
mkdir -p ~/apps/node-v16.20.2
|
||||
tar -xJf node-v16.20.2-linux-x64.tar.xz --no-wildcards-match-slash --anchored --exclude */CHANGELOG.md --exclude */LICENSE --exclude */README.md --strip 1 -C ~/apps/node-v16.20.2
|
||||
|
||||
# 添加path变量
|
||||
export PATH=~/apps/node-v16.20.2/bin:$PATH
|
||||
source ~/.bashrc
|
||||
|
||||
# 检查nodejs版本
|
||||
node -v
|
||||
npm -v
|
||||
|
||||
# 至此安装完成
|
||||
```
|
||||
|
||||
#### 2. 守护进程mcsm daemon上传部署
|
||||
|
||||
从github下载压缩包(内容库也已上传)
|
||||
|
||||
<https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_daemon_only_release.tar.gz>
|
||||
|
||||
```bash
|
||||
# 创建mcsm daemon工作目录
|
||||
cd ~
|
||||
mkdir -p ~/mcsm
|
||||
|
||||
# 上传到这个目录(Xftp, FinalShell均可)
|
||||
|
||||
# 解压
|
||||
cd ~/mcsm
|
||||
tar -zxvf mcsmanager_linux_daemon_only_release.tar.gz
|
||||
cd ~/mcsm/mcsmanager
|
||||
|
||||
# 设置 npm 镜像源为国内淘宝源
|
||||
npm config set registry https://registry.npmmirror.com
|
||||
npm config get registry
|
||||
|
||||
# 新增screen
|
||||
screen -S mcsm
|
||||
|
||||
# 安装依赖后部署
|
||||
sh start-daemon.sh
|
||||
```
|
||||
|
||||
#### 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隧道协议转发,然后新增节点即可。
|
||||
|
||||
③ mcsm面板传输文件出现错误
|
||||
|
||||
显示network error
|
||||
|
||||
解决方法:升级daemon为最新版,不要使用3.x的版本
|
||||
|
||||
## 特别鸣谢
|
||||
|
||||
|
||||
教程作者:初云
|
||||
|
||||
灵感和帮助:Soldier
|
||||
|
||||
全过程步骤指导:Gemini3 Pro
|
||||
|
||||
教程参考指南:MCSManager团队
|
||||
|
||||
MCSM常见问题解答:混合、封神、MuFeng、西瓜、星汉
|
||||
|
||||
调试与测试:千阙云庭服务器团队、初云杯服务器团队、风之谷服务器团队
|
||||
|
||||
|
||||
如您在操作过程中有困难,欢迎您随时联系我们\~
|
||||
|
||||
感谢帮助过我们的人,期待网络服环境蒸蒸日上!
|
||||
BIN
mcguide/27-手机网络游戏/课程10:使用Spigot开服/res/mcsmguide/10.png
Normal file
|
After Width: | Height: | Size: 189 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完成事件
|
||||
79
mcguide/27-手机网络游戏/课程12:使用Allay开服/0-Allay部署教程.md
Normal file
@@ -0,0 +1,79 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
---
|
||||
|
||||
# Allay部署教程
|
||||
|
||||
本系列教程将指导您使用Allay搭建一个服务器,安装NetAllay以使用网易独有接口,以及使用WaterdogPE搭建群组服。
|
||||
|
||||
本系列教程主要侧重于网易版相关内容。有关Allay的更多文档,请移步至[AllayMC官方文档站](https://docs.allaymc.org)。
|
||||
|
||||
相关链接:
|
||||
- AllayMC交流群(QQ):1072132791
|
||||
- AllayMC官方文档站:https://docs.allaymc.org
|
||||
- AllayMC插件市场:https://hub.allaymc.org
|
||||
- AllayMC代码仓库:https://github.com/AllayMC/Allay
|
||||
|
||||
## 安装Java
|
||||
|
||||
Allay 需要**Java 21**才能运行。市面上有多种 Java 发行版,但我们推荐以下版本:
|
||||
|
||||
- [**GraalVM**](https://www.graalvm.org/) – 提供更好的性能
|
||||
- [**OpenJDK**](https://adoptium.net/) – 提供更佳的稳定性
|
||||
|
||||
安装后,通过运行以下程序验证 Java 是否正确安装:
|
||||
|
||||
```shell
|
||||
java --version
|
||||
```
|
||||
|
||||
如果 Java 安装正确,您应该能看到没有错误提示的版本输出。
|
||||
|
||||
## 使用AllayLauncher
|
||||
|
||||
[AllayLauncher](https://github.com/AllayMC/AllayLauncher)是一个轻量级、快速的工具(用C++编写),能帮您轻松下载、更新和管理您的Allay实例。
|
||||
|
||||
安装它只需执行一个命令:
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/AllayMC/AllayLauncher/refs/heads/main/scripts/install_windows.ps1").Content
|
||||
```
|
||||
|
||||
Linux:
|
||||
```bash
|
||||
wget -qO- https://raw.githubusercontent.com/AllayMC/AllayLauncher/refs/heads/main/scripts/install_linux.sh | bash
|
||||
```
|
||||
|
||||
## 手动安装Allay
|
||||
|
||||
### 获取Allay核心文件
|
||||
|
||||
请从[GitHub Releases](https://github.com/AllayMC/Allay/releases/latest)页面获取最新稳定版本。您也可以尝试[Nightly Build](https://github.com/AllayMC/Allay/releases/tag/nightly)。
|
||||
|
||||
您应该会得到一个文件,名称如下:
|
||||
```
|
||||
allay-server-<version>-<commit-hash>[-dev]-shaded.jar
|
||||
```
|
||||
|
||||
示例:
|
||||
```
|
||||
allay-server-0.1.0-dev-shaded.jar
|
||||
```
|
||||
|
||||
> `-dev`后缀表示开发版本。
|
||||
|
||||
### 运行服务器
|
||||
|
||||
如果您的系统有图形界面(GUI),只需双击jar文件即可。如果正确安装了Java,会出现类似这样的窗口:
|
||||
|
||||

|
||||
|
||||
如果您在无头服务器(无图形界面)上,使用以下命令启动服务器:
|
||||
```bash
|
||||
java -jar allay-server-*-shaded.jar
|
||||
```
|
||||
|
||||
您会在终端看到同样的启动输出。
|
||||
51
mcguide/27-手机网络游戏/课程12:使用Allay开服/1-启用网易支持.md
Normal file
@@ -0,0 +1,51 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# 启用网易支持
|
||||
|
||||
本文将指导您调整服务器设置以允许网易客户端进服,如果您并不了解如何部署一个Allay服务器,请移步至[Allay部署教程](0-Allay部署教程.md)。
|
||||
|
||||
## 调整`server-settings.yml`
|
||||
|
||||
Allay默认不允许网易客户端进服,需要修改服务器根目录下`server-settings.yml`中的如下配置项:
|
||||
|
||||
```yaml
|
||||
network-settings:
|
||||
# Enable support for NetEase (China) Minecraft clients
|
||||
netease-client-support: true
|
||||
# If set to true, only NetEase clients can join the server
|
||||
# This option only takes effect when netease-client-support is enabled
|
||||
only-allow-netease-client: false
|
||||
```
|
||||
|
||||
您还可以将`only-allow-netease-client`设置为`true`,以阻止国际版客户端进服。
|
||||
|
||||
## 安装NetAllay(可选)
|
||||
|
||||
Allay的API模块默认不提供网易版独有接口,例如PyRpc,商城接口等。如需使用,您需要在服务器上安装[NetAllay](https://github.com/AllayMC/NetAllay)。
|
||||
您需要从Release页面下载NetAllay的jar包并将其放入服务器的`plugins`文件夹内。
|
||||
|
||||
如果您的插件需要调用NetAllay的接口,需要在项目中引入NetAllay作为依赖:
|
||||
```kotlin
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly("org.allaymc:net-allay:<version>")
|
||||
}
|
||||
|
||||
allay {
|
||||
plugin {
|
||||
dependency("NetAllay")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
有关NetAllay的更多内容:
|
||||
|
||||
- 常用接口文档请见[NetAllay常用接口文档](3-NetAllay常用接口文档.md)
|
||||
- 源码与项目仓库请见:https://github.com/AllayMC/NetAllay
|
||||
85
mcguide/27-手机网络游戏/课程12:使用Allay开服/2-使用WaterdogPE搭建群组服.md
Normal file
@@ -0,0 +1,85 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 30分钟
|
||||
---
|
||||
|
||||
# 使用WaterdogPE搭建群组服
|
||||
|
||||
本文将指导您使用WaterdogPE搭建群组服务器,您需要具有群组服部署相关经验。WaterdogPE是一款适用于MCBE的群组服(反代)软件,类似MCJE的BungeeCord以及Velocity。
|
||||
有关更多WaterdogPE的相关文档,您可以移步至其[官方文档站](https://docs.waterdog.dev/books/waterdogpe-setup),本文将侧重于网易相关内容。
|
||||
|
||||
## 构建WaterdogPE
|
||||
|
||||
由于WaterdogPE官方仓库并未提供网易客户端支持,您需要使用[AllayMC的分叉版本](https://github.com/AllayMC/WaterdogPE),请自行构建jar包。
|
||||
|
||||
## 启用网易支持
|
||||
|
||||
WaterdogPE启动后会生成一个`config.yml`配置文件,您需要修改以下配置项以启用网易客户端支持:
|
||||
|
||||
```yaml
|
||||
netease_client_support: true
|
||||
# Optional: only allow NetEase clients to connect
|
||||
only_allow_netease_client: false
|
||||
```
|
||||
|
||||
> 启用网易客户端支持后,所有RakNet v8客户端都将被视为网易客户端。
|
||||
|
||||
## 配置下游服务器
|
||||
|
||||
在`config.yml`中,您需要配置WaterdogPE所代理的下游Allay服务器。以下是一个示例配置:
|
||||
|
||||
```yaml
|
||||
# 下游服务器列表
|
||||
servers:
|
||||
lobby:
|
||||
address: 127.0.0.1:19133
|
||||
public_address: play.myserver.com:19133
|
||||
survival:
|
||||
address: 127.0.0.1:19134
|
||||
|
||||
# 玩家连接时的服务器优先级(玩家进服后默认进入列表中的第一个服务器)
|
||||
priorities:
|
||||
- lobby
|
||||
- survival
|
||||
|
||||
# 强制域名映射(可选)
|
||||
forced_hosts:
|
||||
lobby.myserver.com: lobby
|
||||
```
|
||||
|
||||
其中:
|
||||
- `address`:下游服务器的实际地址和端口
|
||||
- `public_address`:(可选)公开地址,用于玩家直连该子服
|
||||
- `priorities`:玩家进入代理后默认连接的服务器顺序
|
||||
|
||||
## 其他常用配置
|
||||
|
||||
以下是`config.yml`中一些值得关注的配置项:
|
||||
|
||||
```yaml
|
||||
# 代理监听地址与端口
|
||||
host: 0.0.0.0:19132
|
||||
# 最大玩家数
|
||||
max_players: 20
|
||||
|
||||
# 传递玩家真实信息到下游服务器(推荐启用)
|
||||
use_login_extras: true
|
||||
|
||||
# 启用快速转服(玩家在子服之间转移时不会断开连接)
|
||||
fast_transfer: true
|
||||
|
||||
# 压缩等级设置
|
||||
# 上行(代理→客户端),值越高带宽越省但CPU占用越高
|
||||
upstream_compression_level: 7
|
||||
# 下行(代理→子服),本地网络可设为较低值
|
||||
downstream_compression_level: -1
|
||||
```
|
||||
|
||||
> `use_login_extras`启用后,代理会在LoginPacket中附加`Waterdog_IP`(玩家真实IP)和`Waterdog_XUID`(玩家XUID)等信息,方便下游服务器获取玩家的真实连接信息。
|
||||
|
||||
## 配置下游Allay服务器
|
||||
|
||||
下游Allay服务器同样需要启用网易客户端支持,请参考[启用网易支持](1-启用网易支持.md)。
|
||||
|
||||
此外,请确保每个下游Allay服务器监听的端口与WaterdogPE中配置的`address`端口一致。例如,若WaterdogPE中配置了`lobby`服务器地址为`127.0.0.1:19133`,则对应Allay服务器的端口应设置为`19133`。
|
||||
399
mcguide/27-手机网络游戏/课程12:使用Allay开服/3-NetAllay常用接口文档.md
Normal file
@@ -0,0 +1,399 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 30分钟
|
||||
---
|
||||
|
||||
# NetAllay常用接口文档
|
||||
|
||||
本文整理了`NetAllay`项目中最常用、最适合插件开发直接使用的接口,方便您在Allay服务器中调用网易版独有能力,例如PyRpc通信与商城能力。
|
||||
|
||||
如果您尚未安装NetAllay,请先阅读[启用网易支持](1-启用网易支持.md)。
|
||||
|
||||
## 获取NetAllay实例
|
||||
|
||||
调用接口前,先拿到`NetAllay`插件实例:
|
||||
|
||||
```java
|
||||
import org.allaymc.api.server.Server;
|
||||
import org.allaymc.netallay.NetAllay;
|
||||
|
||||
// 方式一:直接获取静态实例
|
||||
NetAllay netAllay = NetAllay.getInstance();
|
||||
|
||||
// 方式二:通过插件管理器获取
|
||||
NetAllay netAllay = (NetAllay) Server.getInstance()
|
||||
.getPluginManager()
|
||||
.getPlugin("NetAllay");
|
||||
```
|
||||
|
||||
## PyRpc事件监听
|
||||
|
||||
### 监听客户端发来的事件
|
||||
|
||||
最常用的入口是`listenForEvent`,用于监听网易客户端发送到服务端的PyRpc事件。
|
||||
|
||||
```java
|
||||
netAllay.listenForEvent(
|
||||
"MyMod",
|
||||
"MySystemCS",
|
||||
"OnButtonClick",
|
||||
(player, data) -> {
|
||||
String buttonId = (String) data.get("buttonId");
|
||||
plugin.getPluginLogger().info("玩家点击了按钮: {}", buttonId);
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
参数说明:
|
||||
|
||||
- `namespace`:命名空间,一般对应客户端Mod命名空间
|
||||
- `systemName`:客户端系统名
|
||||
- `eventName`:事件名
|
||||
- `handler`:回调函数,参数为`Player`和`Map<String, Object>`
|
||||
|
||||
### 取消事件监听
|
||||
|
||||
如果您不再需要某个监听器,可以调用以下接口:
|
||||
|
||||
```java
|
||||
boolean removed = netAllay.unlistenForEvent(namespace, systemName, eventName, handler);
|
||||
|
||||
netAllay.unlistenAllForEvent(namespace, systemName, eventName);
|
||||
```
|
||||
|
||||
其中:
|
||||
|
||||
- `unlistenForEvent`:取消一个具体处理器
|
||||
- `unlistenAllForEvent`:取消某个事件下的全部处理器
|
||||
|
||||
## 向客户端发送PyRpc事件
|
||||
|
||||
### 发送给单个玩家
|
||||
|
||||
```java
|
||||
Map<String, Object> data = new LinkedHashMap<>();
|
||||
data.put("message", "Hello from server!");
|
||||
data.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
boolean success = netAllay.notifyToClient(
|
||||
player,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"ServerMessage",
|
||||
data
|
||||
);
|
||||
```
|
||||
|
||||
该方法返回`boolean`,表示是否发送成功。若玩家不是网易客户端,则会返回`false`。
|
||||
|
||||
### 立即发送
|
||||
|
||||
若您希望不经过缓冲立即下发,可以使用:
|
||||
|
||||
```java
|
||||
boolean success = netAllay.notifyToClientImmediately(
|
||||
player,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"ServerMessage",
|
||||
data
|
||||
);
|
||||
```
|
||||
|
||||
### 发送给多个玩家
|
||||
|
||||
```java
|
||||
int successCount = netAllay.notifyToMultiClients(
|
||||
players,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"Announcement",
|
||||
Map.of("content", "服务器公告")
|
||||
);
|
||||
```
|
||||
|
||||
返回值为成功发送的玩家数量。
|
||||
|
||||
### 发送给附近玩家
|
||||
|
||||
```java
|
||||
var center = player.getControlledEntity().getLocation();
|
||||
|
||||
int count = netAllay.notifyToClientsNearby(
|
||||
null,
|
||||
center,
|
||||
50.0,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"NearbyEvent",
|
||||
Map.of("type", "explosion")
|
||||
);
|
||||
```
|
||||
|
||||
参数中的`except`可用于排除某个玩家;若不需要排除,传`null`即可。
|
||||
|
||||
### 广播到世界、维度或全服
|
||||
|
||||
广播接口统一为`broadcastToAllClient`,但有三个重载版本:
|
||||
|
||||
```java
|
||||
// 广播到指定世界
|
||||
int worldCount = netAllay.broadcastToAllClient(
|
||||
null,
|
||||
world,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"WorldEvent",
|
||||
data
|
||||
);
|
||||
|
||||
// 广播到指定维度
|
||||
int dimensionCount = netAllay.broadcastToAllClient(
|
||||
null,
|
||||
dimension,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"DimensionEvent",
|
||||
data
|
||||
);
|
||||
|
||||
// 广播到整个服务器
|
||||
int serverCount = netAllay.broadcastToAllClient(
|
||||
null,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"GlobalEvent",
|
||||
data
|
||||
);
|
||||
```
|
||||
|
||||
## 工具接口
|
||||
|
||||
### 判断玩家是否为网易客户端
|
||||
|
||||
```java
|
||||
boolean netease = netAllay.isNetEasePlayer(player);
|
||||
```
|
||||
|
||||
### 获取当前注册的事件数量
|
||||
|
||||
```java
|
||||
int count = netAllay.getRegisteredEventCount();
|
||||
```
|
||||
|
||||
## 特殊常量
|
||||
|
||||
### `LOCAL_PLAYER_ENTITY_ID`
|
||||
|
||||
```java
|
||||
int entityId = NetAllay.LOCAL_PLAYER_ENTITY_ID; // -2
|
||||
```
|
||||
|
||||
这个常量表示“接收消息的玩家自己”。常见用法是把实体ID传给客户端时,使用`-2`代表当前玩家自身实体。
|
||||
|
||||
```java
|
||||
netAllay.notifyToClient(
|
||||
player,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"Welcome",
|
||||
Map.of("entityId", NetAllay.LOCAL_PLAYER_ENTITY_ID)
|
||||
);
|
||||
```
|
||||
|
||||
注意:`-2`只能在单播接口`notifyToClient`或`notifyToClientImmediately`中使用,不要在多播或广播接口中使用。
|
||||
|
||||
## 事件数据支持的类型
|
||||
|
||||
`NetAllay`的事件数据类型为`Map<String, Object>`,其中值通常支持以下类型:
|
||||
|
||||
- `null`
|
||||
- `Boolean`
|
||||
- `Integer`、`Long`
|
||||
- `Float`、`Double`
|
||||
- `String`
|
||||
- `byte[]`
|
||||
- `Map<String, Object>`
|
||||
- `List<?>`、`Iterable<?>`
|
||||
|
||||
一个常见示例:
|
||||
|
||||
```java
|
||||
Map<String, Object> data = new LinkedHashMap<>();
|
||||
data.put("title", "测试标题");
|
||||
data.put("count", 1);
|
||||
data.put("extra", Map.of("flag", true));
|
||||
data.put("list", List.of("a", "b", "c"));
|
||||
```
|
||||
|
||||
## 商城接口
|
||||
|
||||
`NetAllay`内置了商城管理器`ShopManager`,用于控制网易商城界面与监听商城事件。
|
||||
|
||||
### 获取商城管理器
|
||||
|
||||
```java
|
||||
var shopManager = netAllay.getShopManager();
|
||||
```
|
||||
|
||||
### 控制商城入口与界面
|
||||
|
||||
```java
|
||||
// 是否启用自定义商城入口
|
||||
netAllay.enableCustomShopEntry(true);
|
||||
|
||||
// 打开商城
|
||||
netAllay.openShop(player);
|
||||
|
||||
// 关闭商城
|
||||
netAllay.closeShop(player);
|
||||
|
||||
// 显示一行提示
|
||||
netAllay.showHint(player, "购买成功");
|
||||
|
||||
// 显示两行提示
|
||||
netAllay.showHint(player, "购买成功", "奖励已发放");
|
||||
```
|
||||
|
||||
这些方法本质上是对`ShopManager`的便捷封装。
|
||||
|
||||
### 监听商城事件
|
||||
|
||||
商城常见事件定义在`ShopEvent`中:
|
||||
|
||||
- `ShopEvent.PLAYER_BUY_ITEM_SUCCESS`:玩家购买成功
|
||||
- `ShopEvent.PLAYER_URGE_SHIP`:玩家催发货
|
||||
- `ShopEvent.CLIENT_LOAD_ADDON_FINISH`:客户端加载Addon完成
|
||||
|
||||
注册示例:
|
||||
|
||||
```java
|
||||
shopManager.listenForShopEvent(ShopEvent.PLAYER_BUY_ITEM_SUCCESS, (player, data) -> {
|
||||
plugin.getPluginLogger().info("玩家 {} 完成了一笔购买", player.getOriginName());
|
||||
});
|
||||
|
||||
shopManager.listenForShopEvent(ShopEvent.PLAYER_URGE_SHIP, (player, data) -> {
|
||||
plugin.getPluginLogger().info("玩家 {} 请求催发货", player.getOriginName());
|
||||
});
|
||||
```
|
||||
|
||||
取消监听:
|
||||
|
||||
```java
|
||||
boolean removed = shopManager.unlistenForShopEvent(ShopEvent.PLAYER_BUY_ITEM_SUCCESS, handler);
|
||||
```
|
||||
|
||||
### 按玩家覆盖商城配置
|
||||
|
||||
如果您希望不同玩家拿到不同的商城参数,可以为玩家设置单独配置:
|
||||
|
||||
```java
|
||||
ShopManager.PlayerShopConfig config = new ShopManager.PlayerShopConfig();
|
||||
config.setGameId("123456");
|
||||
config.setUseCustomShop(true);
|
||||
config.setTestServer(false);
|
||||
config.setCacheTime(1);
|
||||
config.setUid(0L);
|
||||
config.setPlatformUid("");
|
||||
|
||||
shopManager.setPlayerConfig(player, config);
|
||||
```
|
||||
|
||||
获取和移除配置:
|
||||
|
||||
```java
|
||||
ShopManager.PlayerShopConfig config = shopManager.getPlayerConfig(player);
|
||||
shopManager.removePlayerConfig(player);
|
||||
```
|
||||
|
||||
## 配置文件
|
||||
|
||||
NetAllay会在插件目录生成`config.json`。当前源码中的默认配置如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"shop": {
|
||||
"gameId": "",
|
||||
"gameKey": "",
|
||||
"testGameKey": "",
|
||||
"testServer": false,
|
||||
"useCustomShop": false,
|
||||
"cacheTime": 1,
|
||||
"shopServerUrl": "",
|
||||
"webServerUrl": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
其中商城相关字段含义如下:
|
||||
|
||||
- `gameId`:资源数字ID
|
||||
- `gameKey`:正式服签名密钥
|
||||
- `testGameKey`:测试服签名密钥
|
||||
- `testServer`:是否使用测试服模式
|
||||
- `useCustomShop`:是否隐藏默认商城按钮并改为自定义入口
|
||||
- `cacheTime`:商城配置缓存时间,单位为秒
|
||||
- `shopServerUrl`:自定义订单服务地址,可留空
|
||||
- `webServerUrl`:自定义Web服务地址,可留空
|
||||
|
||||
如果您在运行中修改了配置,也可以调用以下接口:
|
||||
|
||||
```java
|
||||
netAllay.reloadConfig();
|
||||
netAllay.saveConfig();
|
||||
```
|
||||
|
||||
## 完整示例
|
||||
|
||||
```java
|
||||
import org.allaymc.api.player.Player;
|
||||
import org.allaymc.netallay.NetAllay;
|
||||
import org.allaymc.netallay.shop.ShopEvent;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public final class DemoService {
|
||||
|
||||
public void register() {
|
||||
NetAllay netAllay = NetAllay.getInstance();
|
||||
|
||||
netAllay.listenForEvent("MyMod", "MySystemCS", "RequestData", (player, data) -> {
|
||||
netAllay.notifyToClient(
|
||||
player,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"ResponseData",
|
||||
Map.of(
|
||||
"success", true,
|
||||
"playerName", player.getOriginName()
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
netAllay.getShopManager().listenForShopEvent(ShopEvent.PLAYER_BUY_ITEM_SUCCESS, (player, data) -> {
|
||||
netAllay.showHint(player, "购买成功", "请及时发货");
|
||||
});
|
||||
}
|
||||
|
||||
public void welcome(Player player) {
|
||||
NetAllay.getInstance().notifyToClient(
|
||||
player,
|
||||
"MyMod",
|
||||
"MySystemSS",
|
||||
"Welcome",
|
||||
Map.of(
|
||||
"entityId", NetAllay.LOCAL_PLAYER_ENTITY_ID,
|
||||
"message", "欢迎来到服务器"
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- `NetAllay`只会向网易客户端发送数据,非网易玩家会被自动跳过
|
||||
- 广播、多播、附近广播时不要使用`NetAllay.LOCAL_PLAYER_ENTITY_ID`
|
||||
- 插件禁用时,建议取消自己注册的事件监听
|
||||
- 单次发送的数据不宜过大,避免发送过大的PyRpc包
|
||||
0
mcguide/27-手机网络游戏/课程12:使用Allay开服/README.md
Normal file
BIN
mcguide/27-手机网络游戏/课程12:使用Allay开服/images/installation-p1.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
@@ -6,33 +6,63 @@ time: 5分钟
|
||||
|
||||
# 组件打包发布
|
||||
|
||||
## 前言
|
||||
|
||||
本文将从MC Studio工具快捷打包 和 手动打包 两个方面介绍组件的打包发布
|
||||
|
||||
## 组件配置
|
||||
|
||||
在组件的右键菜单,选择配置,可以对作品的UUID与版本号进行修改
|
||||
### 配置介绍
|
||||
|
||||
UUID: 代表模组的内容的全局唯一标识符,如果有相同的UUID的组件,会在组件上传审核机审时候报错
|
||||
|
||||
版本号:对应模组内容的迭代版本
|
||||
|
||||
### UUID更新
|
||||
|
||||
在组件的右键菜单,选择配置。可以对作品的UUID与版本号进行修改
|
||||
|
||||

|
||||
|
||||
点击随机UUID,将会自动对所有资源包和行为包的UUID进行随机
|
||||
|
||||
**点击随机UUID,将会自动对所有资源包和行为包的UUID进行随机**
|
||||
选中对应的资源包,右键可以复制其UUID
|
||||
|
||||

|
||||
|
||||
在开发测试阶段,并不需要关注版本号,而当你的组件需要发布到平台,为了让组件上线后能顺利更新,每次发布前需要提升组件版本号,这里你既可以单独升级个别资源包,也可以全选升级所有资源包。
|
||||
### 版本号
|
||||
|
||||
## 组件发布
|
||||

|
||||
|
||||
当你的组件一切准备就绪,就可以在组件的右键菜单里,点击进行发布。
|
||||
在开发测试阶段,并不需要关注版本号,其不会影响你的开发
|
||||
|
||||
发布时会自动选中平台已有的同名组件,并自动勾选更新已有作品,因此请尽量保持作品与平台名称一致。
|
||||
当你的组件需要发布到平台,如果你是第一次发布组件时,会以资源包与行为包**默认的0.0.1版本**进行发布。而之后的每次更新发布前,需要提升组件版本号,根据你更新的内容决定,这里你可以单独升级个别资源包,也可以全选升级所有资源包。
|
||||
|
||||

|
||||
## MC Studio进行快捷打包发布
|
||||
|
||||
点击确定后,我们会对作品进行自检,然后导出必要的文件,并压缩成<名称_时间.zip>的命名格式,上传到开发者平台,并打开浏览器对应链接,你可以在这个页面进一步编辑器组件的详情,最后点击保存。
|
||||
|
||||
## 组件转换
|
||||
|
||||
同时我们还提供了组件间的转换功能,你可以在右键菜单里找到它,将AddOn方便的转换为地图或服务器Mod
|
||||
1. MC Studio提供了组件间的转换功能,你可以在右键菜单里找到它,将AddOn方便的转换为地图或服务器Mod
|
||||
|
||||

|
||||
|
||||
|
||||
2. 当你的组件一切准备就绪,就可以在组件的右键菜单里,点击进行发布,随后会有一个选择界面。
|
||||
|
||||

|
||||
|
||||
- 新建作品:你的开发者平台中没有该作品,这时会创建一个全新的组件
|
||||
|
||||
- 更新已有作品:此时会自动选中平台已有的同名组件,并自动勾选更新已有作品。**当然也可以手动选择其他组件,但是这代表着其他组件的内容将会被本次发布的组件内容覆盖,因此请尽量保持作品与平台中作品名称一致,避免组件上传错误** (可以看到上图中和首页第一张图的组件名称都是叫lobbyGoodsMod2.0)
|
||||
|
||||
3. 点击确定后,MC Studio会对作品进行自检,然后导出必要的文件,并压缩成<名称_时间.zip>的命名格式,上传到开发者平台,并打开浏览器对应链接,你可以在这个页面进一步编辑器组件的详情,最后点击保存。
|
||||
|
||||
## 手动打包发布
|
||||
|
||||
### 检查包体的文件结构与导出
|
||||
|
||||
[课程01.包体的结构和导入](https://mc.163.com/dev/mcmanual/mc-dev/mconline/10-addon%E6%95%99%E7%A8%8B/%E7%AC%AC18%E7%AB%A0%EF%BC%9A%E6%89%93%E5%8C%85%E5%AF%BC%E5%87%BA%E4%BD%A0%E7%9A%84%E4%BD%9C%E5%93%81/%E8%AF%BE%E7%A8%8B01.%E5%8C%85%E4%BD%93%E7%9A%84%E7%BB%93%E6%9E%84%E5%92%8C%E5%AF%BC%E5%85%A5.html?catalog=1)介绍了PC PE中所有组件类型的文件结构与打包,开发者可以进行参考检查自己的文件
|
||||
|
||||
### 发布
|
||||
|
||||
[课程03-组件上架的规范及过审攻略](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/35-%E4%B8%8A%E6%9E%B6%E4%B8%8E%E5%85%A5%E9%A9%BB/%E8%AF%BE%E7%A8%8B04-%E8%AE%A4%E8%AF%86%E4%BD%9C%E5%93%81%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97.html?catalog=1)介绍了如何将打包后组件上传发布,开发者可以进行流程参考
|
||||
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 154 KiB |
BIN
mcguide/30-测试/new_images/zujiandabao/0_1.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
@@ -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 |
@@ -146,7 +146,7 @@
|
||||
|
||||
**模组SDK:** 模组SDK是《我的世界》中国版提供的一套控制游戏内各种元素的Python接口,利用这套接口,能够制作出各种创新好玩的组件。若想要在游戏内实现较为复杂的逻辑,有关 [模组SDK开发文档](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/10-%E6%96%B0%E5%86%85%E5%AE%B9/2-%E6%A8%A1%E7%BB%84SDK/90-1.24%E7%89%88%E6%9C%AC.html?catalog=1)与 [接口文档](https://mc.163.com/dev/mcmanual/mc-dev/mcdocs/1-ModAPI/%E6%8E%A5%E5%8F%A3/%E9%80%9A%E7%94%A8/%E7%B4%A2%E5%BC%95.html?catalog=1)可以提供非常大的帮助。
|
||||
|
||||
**网络游戏开服工具:** 这是由中国版开发组维护的手游版网络游戏服务器集群工具,集成了负载均衡、集群管理、运营指令、多号协作的功能,同时支持完整的原版内容与附加包自定义功能。若您是一位寻求支持完整的原版内容、插件拓展与附加包功能的服主,不妨点击 [网络游戏开服工具常见问题答疑](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/50-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E7%AD%94%E7%96%91/20-%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E5%BC%80%E6%9C%8D%E5%B7%A5%E5%85%B7%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E7%AD%94%E7%96%91.html?catalog=1)与 [网络游戏开服工具课程](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/27-%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/%E8%AF%BE%E7%A8%8B1%EF%BC%9A%E6%88%90%E4%B8%BAApollo%E6%9C%8D%E4%B8%BB%E5%8F%8A%E7%9B%B8%E5%85%B3%E5%87%86%E5%A4%87/%E7%AC%AC1%E8%8A%82%EF%BC%9AApollo%E4%BB%8B%E7%BB%8D.html?catalog=1)看看吧。
|
||||
**网络游戏开服工具:** 这是由中国版开发组维护的手游版网络游戏服务器集群工具,集成了负载均衡、集群管理、运营指令、多号协作的功能,同时支持完整的原版内容与附加包自定义功能。若您是一位寻求支持完整的原版内容、插件拓展与附加包功能的服主,不妨点击 [网络游戏开服工具常见问题答疑](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/50-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E7%AD%94%E7%96%91/20-%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E5%BC%80%E6%9C%8D%E5%B7%A5%E5%85%B7%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E7%AD%94%E7%96%91.html?catalog=1)与 [网络游戏开服工具课程](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%8B1%EF%BC%9A%E6%88%90%E4%B8%BAApollo%E6%9C%8D%E4%B8%BB%E5%8F%8A%E7%9B%B8%E5%85%B3%E5%87%86%E5%A4%87/%E7%AC%AC1%E8%8A%82%EF%BC%9AApollo%E4%BB%8B%E7%BB%8D.html)看看吧。
|
||||
|
||||
|
||||
|
||||
|
||||
788
mcguide/9-规范开发/8-通用设置规范.md
Normal file
@@ -0,0 +1,788 @@
|
||||
---
|
||||
hard: 入门
|
||||
time: 15分钟
|
||||
selection: true
|
||||
---
|
||||
|
||||
# 通用设置接口规范
|
||||
|
||||
欢迎使用由官方牵头,允许开发者通过接口快速注册设置选项的工具。
|
||||
|
||||
下面我们将介绍如何使用通用设置接口。
|
||||
|
||||
由于通用设置接口不更改引擎内容,可不需要跟整包更新,补全库更新后即可使用。
|
||||
|
||||
## 注册通用设置界面
|
||||
|
||||
我们首先需要获取通用设置接口的Comp组件,然后在Comp组件中使用`RegisterSettingInst`方法
|
||||
|
||||
```python
|
||||
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(playerId)
|
||||
|
||||
# 第一个参数必须要填写 ItemID,我们强烈建议您先上传一个模组,获取到ItemID再进行开发。
|
||||
|
||||
# 后面两个参数是为了在 ModPC 中测试开发而引入的参数,在正式服中后面两个参数没有任何作用。
|
||||
|
||||
settingInst = comp.RegisterSettingInst("itemId", "模组1", "textures/ui/abc")
|
||||
```
|
||||
|
||||
由于要传入 itemId,你需要先在开平上传一个模组,获取到 itemId,然后再通过此方法注册
|
||||
|
||||
> 由于页面注册的到的是 Cocos UI 页面,页面里的模组数据都是从开平上传的模组中获取的,所以才需要传入 itemId
|
||||
|
||||
> 由于ModPC不自带 Cocos UI 页面,所以需要传入后面两个参数,以便ModPC使用进行测试
|
||||
|
||||
## 注册控件
|
||||
|
||||
控件是指在设置页面中的设置选项,例如按钮、开关、输入框等
|
||||
|
||||
控件注册允许链式调用
|
||||
|
||||
```python
|
||||
if settingInst:
|
||||
|
||||
# 允许链式调用,添加多个控件
|
||||
|
||||
(settingInst
|
||||
.AddText("text_uid_01", "这是一段文字",5)
|
||||
.AddToggle("toggle_uid_01", "开关按钮", callbackFunction, 1, False)
|
||||
.AddToggle("toggle_uid_02", "开关按钮2", callbackFunction, 3, False)
|
||||
.AddToggle("toggle_uid_03", "开关按钮3", callbackFunction, 4, True)
|
||||
.AddInput("input_uid_01", "输入框", callbackFunction, 2, "神秘")
|
||||
.AddButton("button_uid_01", "按钮", "点击前往设置页面", callback, 2))
|
||||
```
|
||||
|
||||
`callbackFunction`与`callback`是回调函数
|
||||
|
||||
```python
|
||||
def callbackFunction(*args):
|
||||
|
||||
# args1 参数是 key 值,用于获取控件ID
|
||||
# args2 参数是 value 值,用于获取控件的当前值
|
||||
|
||||
if settingInst.GetToggleDefault("toggle_uid_01"):
|
||||
|
||||
#获取 控件1 的默认值,如果是True,则将默认值改成 False,下次打开页面就会显示False了
|
||||
|
||||
# settingInst.SetToggleDefault("toggle_uid_01", False)
|
||||
|
||||
settingInst.SetLockSettingComp("toggle_uid_02", False)
|
||||
|
||||
else:
|
||||
|
||||
# 这里我们判断,如果从 False 改成 True了,我们还会给控件 toggle_uid_02 上锁
|
||||
|
||||
# settingInst.SetToggleDefault("toggle_uid_01", True)
|
||||
|
||||
settingInst.SetLockSettingComp("toggle_uid_02", True)
|
||||
|
||||
def callback(*args):
|
||||
|
||||
# args1 参数是 key 值,用于获取控件ID
|
||||
# args2 参数是 value 值,用于获取控件的当前值
|
||||
|
||||
comp.CloseSettingUI()
|
||||
```
|
||||
|
||||
上述内容完成后您就成功注册了设置界面中的控件,并且可以通过设置页面中的按钮进行调用。
|
||||
|
||||
此时你就可以前往开发者测试服查看效果
|
||||
|
||||

|
||||
|
||||
> 设置页面集束在 暂停菜单 - 模组 中
|
||||
|
||||
我们不限制开发者必须把模组设置做在通用设置界面中,但设置入口一定要在这个界面中,减少玩家寻找模组设置的时间成本。
|
||||
|
||||
您可以只在通用设置界面注册一个按钮,点击按钮可以跳转到你们的设置页面中
|
||||
|
||||
## 疑难解答
|
||||
|
||||
Q1:怎么没有翻页功能?
|
||||
|
||||
A:为了确保与原本UI风格一致,我们没有做翻页功能,而是内置了滚动功能。
|
||||
|
||||
Q2:怎么不能加图片?
|
||||
|
||||
A:为了确保各开发者风格一致,我们没有做图片功能,以免开发者随心所欲添加图片造成设置界面杂乱无章
|
||||
|
||||
Q3:限制有点大,我不想用你们的设置怎么办?
|
||||
|
||||
A:我们不限制开发者使用自己的设置界面,但为了提高玩家体验,减少模组设置学习成本,开发者可以即使不适用官方提供的设置接口,也可以在这个页面注册按钮,允许玩家点击按钮打开开发者自己定义的设置界面中
|
||||
|
||||
## 接口速查
|
||||
|
||||
### CloseSettingUI
|
||||
|
||||
<span style="display:inline;color:#7575f9">客户端</span>
|
||||
|
||||
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
|
||||
|
||||
- 描述
|
||||
|
||||
关闭模组信息界面
|
||||
|
||||
- 参数
|
||||
|
||||
无
|
||||
|
||||
- 返回值
|
||||
|
||||
| <div style="width: 4em">数据类型</div> | 说明 |
|
||||
| :--- | :--- |
|
||||
| bool | 是否关闭成功 |
|
||||
|
||||
- 备注
|
||||
- 该接口在modPC环境下,将是关闭局内json ui
|
||||
|
||||
- 示例
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
levelId = clientApi.GetLevelId()
|
||||
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
|
||||
# 关闭界面
|
||||
result = comp.CloseSettingUI()
|
||||
```
|
||||
|
||||
|
||||
|
||||
### GetSettingInst
|
||||
|
||||
<span style="display:inline;color:#7575f9">客户端</span>
|
||||
|
||||
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
|
||||
|
||||
- 描述
|
||||
|
||||
获取当前模组的通用设置实例
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | <div style="width: 4em">数据类型</div> | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| modNamespace | str | 组件命名空间,需唯一性,仅在开发环境预览使用 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| <div style="width: 4em">数据类型</div> | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 返回实例对象,未注册则返回None |
|
||||
|
||||
- 备注
|
||||
- 请先使用RegisterSettingInst注册,再使用GetSettingInst获取。
|
||||
- 开发环境中,将会获取modNamespace对应的通用设置实例;正式环境中则仅能获取当前模组注册的实例。
|
||||
- 建议不要在__init__的时候就获取实例,过早获取会返回None。
|
||||
|
||||
- 示例
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
levelId = clientApi.GetLevelId()
|
||||
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
|
||||
settingInst = comp.GetSettingInst()
|
||||
if settingInst:
|
||||
settingInst.AddText("text_uid_01", "这是一段文字").AddToggle("toggle_uid_01", "开关按钮", False, callbackFunction)
|
||||
```
|
||||
|
||||
|
||||
|
||||
### OpenSettingUI
|
||||
|
||||
<span style="display:inline;color:#7575f9">客户端</span>
|
||||
|
||||
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
|
||||
|
||||
- 描述
|
||||
|
||||
在模组信息界面中打开设置页面(此操作仅可访问本模组的配置选项)
|
||||
|
||||
- 参数
|
||||
|
||||
无
|
||||
|
||||
- 返回值
|
||||
|
||||
| <div style="width: 4em">数据类型</div> | 说明 |
|
||||
| :--- | :--- |
|
||||
| bool | 是否打开成功 |
|
||||
|
||||
- 备注
|
||||
- 该接口在modPC环境下,将是打开局内json ui
|
||||
|
||||
- 示例
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
levelId = clientApi.GetLevelId()
|
||||
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
|
||||
# 打开界面
|
||||
result = comp.OpenSettingUI()
|
||||
```
|
||||
|
||||
|
||||
|
||||
### RegisterSettingInst
|
||||
|
||||
<span style="display:inline;color:#7575f9">客户端</span>
|
||||
|
||||
method in mod.client.component.neteaseWindowCompClient.NeteaseWindowCompClient
|
||||
|
||||
- 描述
|
||||
|
||||
注册通用设置实例
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | <div style="width: 4em">数据类型</div> | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| modNamespace | str | 组件命名空间,需唯一性,仅在开发环境预览使用 |
|
||||
| modName | str | 组件名字,默认为None,仅在开发环境预览使用 |
|
||||
| iconPath | str | 组件icon图路径,默认为None,仅在开发环境预览使用 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| <div style="width: 4em">数据类型</div> | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 返回实例对象,系统未初始化则返回None |
|
||||
|
||||
- 备注
|
||||
- 每个模组仅能注册一个通用设置实例,重复注册会返回同样的实例。
|
||||
- 建议在UiInitFinished触发时再注册,注册过早会导致注册失败而返回None。
|
||||
- 设置界面的注册是通过Scripts文件夹名称来判断是由哪个模组注册的实例,开发者的Scripts名称需要确保不与其他模组作者的Scripts名称冲突。
|
||||
|
||||
- 示例
|
||||
|
||||
```python
|
||||
import mod.client.extraClientApi as clientApi
|
||||
levelId = clientApi.GetLevelId()
|
||||
comp = clientApi.GetEngineCompFactory().CreateNeteaseWindow(levelId)
|
||||
settingInst = comp.RegisterSettingInst("123456789", "模组1", "textures/ui/abc")
|
||||
if settingInst:
|
||||
settingInst.AddText("text_uid_01", "这是一段文字").AddToggle("toggle_uid_01", "开关按钮", False, callbackFunction)
|
||||
```
|
||||
|
||||
### SettingInst 下的方法
|
||||
|
||||
#### AddText
|
||||
|
||||
添加文本控件。
|
||||
|
||||
```python
|
||||
def AddText(self, key, name, priority=None)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| name | str | 控件的文字描述 |
|
||||
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### AddToggle
|
||||
|
||||
添加开关控件。
|
||||
|
||||
```python
|
||||
def AddToggle(self, key, name, callback, priority=None, default=False)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| name | str | 控件的文字描述 |
|
||||
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
|
||||
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
|
||||
| default | bool | 默认值,默认为False |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### AddSlider
|
||||
|
||||
添加滑动条控件。
|
||||
|
||||
```python
|
||||
def AddSlider(self, key, name, step, callback, priority=None, default=0)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| name | str | 控件的文字描述 |
|
||||
| step | int | 滑动条的最大值,范围:0~step |
|
||||
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
|
||||
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
|
||||
| default | int | 默认值,默认为0 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### AddDropDown
|
||||
|
||||
添加下拉选项控件。
|
||||
|
||||
```python
|
||||
def AddDropDown(self, key, name, options, callback, priority=None, default=None)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| name | str | 控件的文字描述 |
|
||||
| options | list[str] | 下拉选项列表 |
|
||||
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
|
||||
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
|
||||
| default | str或None | 默认选项,该值需在options中 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### AddInput
|
||||
|
||||
添加输入框控件。
|
||||
|
||||
```python
|
||||
def AddInput(self, key, name, callback, priority=None, default="")
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| name | str | 控件的文字描述 |
|
||||
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
|
||||
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
|
||||
| default | str | 默认显示的文本,默认为空字符串 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### AddButton
|
||||
|
||||
添加按钮控件。
|
||||
|
||||
```python
|
||||
def AddButton(self, key, name, buttonText, callback, priority=None)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| name | str | 控件的文字描述 |
|
||||
| buttonText | str | 按钮的文字描述 |
|
||||
| callback | function | 控件的回调函数,定义:`def callback(*args)` |
|
||||
| priority | int或None | 显示顺序优先级,默认根据添加顺序排列 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### GetToggleDefault
|
||||
|
||||
获取开关控件的默认值。
|
||||
|
||||
```python
|
||||
def GetToggleDefault(self, key)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| bool | 开关状态 |
|
||||
|
||||
---
|
||||
|
||||
#### GetInputDefault
|
||||
|
||||
获取输入框的默认输入文本。
|
||||
|
||||
```python
|
||||
def GetInputDefault(self, key)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| str | 输入框的文本 |
|
||||
|
||||
---
|
||||
|
||||
#### GetDropDownDefault
|
||||
|
||||
获取下拉选项控件的默认值。
|
||||
|
||||
```python
|
||||
def GetDropDownDefault(self, key)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| str | 默认选项在列表中的索引 |
|
||||
|
||||
---
|
||||
|
||||
#### GetSliderDefault
|
||||
|
||||
获取滑动条控件的默认值。
|
||||
|
||||
```python
|
||||
def GetSliderDefault(self, key)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| int | 滑块的值 |
|
||||
|
||||
---
|
||||
|
||||
#### GetText
|
||||
|
||||
获取文字控件的文本。
|
||||
|
||||
```python
|
||||
def GetText(self, key)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| str | 显示的文本 |
|
||||
|
||||
---
|
||||
|
||||
#### SetToggleDefault
|
||||
|
||||
设置开关控件的默认值。
|
||||
|
||||
```python
|
||||
def SetToggleDefault(self, key, value)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| value | bool | 开关的值 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### SetInputDefault
|
||||
|
||||
设置输入框控件的默认文本。
|
||||
|
||||
```python
|
||||
def SetInputDefault(self, key, value)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| value | str | 显示的文本 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### SetDropDownDefault
|
||||
|
||||
设置下拉选项控件的默认选项。
|
||||
|
||||
```python
|
||||
def SetDropDownDefault(self, key, option)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| option | str | 选项文字,如文字不在选项列表里,会自动添加到列表 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### SetSliderDefault
|
||||
|
||||
设置滑动条控件的默认值。
|
||||
|
||||
```python
|
||||
def SetSliderDefault(self, key, value)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| value | int | 滑块的值 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### SetButtonText
|
||||
|
||||
设置按钮控件的文字。
|
||||
|
||||
```python
|
||||
def SetButtonText(self, key, value)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| value | str | 显示的文字 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### SetText
|
||||
|
||||
设置文本控件的值。
|
||||
|
||||
```python
|
||||
def SetText(self, key, value)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| value | str | 显示的文本 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### SetLockSettingComp
|
||||
|
||||
设置锁定控件,锁定后无法点击。
|
||||
|
||||
```python
|
||||
def SetLockSettingComp(self, key, is_locked)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
| is_locked | bool | 是否锁定 |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| SettingInst | 当前实例,支持链式调用 |
|
||||
|
||||
---
|
||||
|
||||
#### GetFormatData
|
||||
|
||||
获取当前实例的结构化数据,控件数据根据priority的值升序排序。
|
||||
|
||||
```python
|
||||
def GetFormatData(self)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
无
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| dict | 结构化数据 |
|
||||
|
||||
- 返回格式
|
||||
|
||||
```json
|
||||
{
|
||||
"modId": "str // 模组ID",
|
||||
"name": "str // 名称",
|
||||
"icon": "str // 图标路径",
|
||||
"settings": "list // 设置项列表,按priority升序排序"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### GetSettingsControl
|
||||
|
||||
获取控件的结构化数据。
|
||||
|
||||
```python
|
||||
def GetSettingsControl(self, key)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
| 参数名 | 数据类型 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| key | str | 控件id |
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| dict | 控件的结构化数据 |
|
||||
|
||||
---
|
||||
|
||||
#### GetModId
|
||||
|
||||
获取实例的modId。
|
||||
|
||||
```python
|
||||
def GetModId(self)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
无
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| str | 模组ID |
|
||||
|
||||
---
|
||||
|
||||
#### GetAutoPriority
|
||||
|
||||
获取自动设置的优先级的值。
|
||||
|
||||
```python
|
||||
def GetAutoPriority(self)
|
||||
```
|
||||
|
||||
- 参数
|
||||
|
||||
无
|
||||
|
||||
- 返回值
|
||||
|
||||
| 数据类型 | 说明 |
|
||||
| :--- | :--- |
|
||||
| int | 当前自动优先级的值 |
|
||||
|
||||
- 备注
|
||||
|
||||
当添加控件时,如果不设置优先级,则会自动从0开始设置。优先级会影响控件排列顺序,升序排列。
|
||||
|
||||
BIN
mcguide/9-规范开发/images/image.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
@@ -45,7 +45,7 @@ time: 10分钟
|
||||
{
|
||||
"rolls": 1,
|
||||
"entries": [
|
||||
{“type”: "item", "name": "minecraft:wool","function": [{"function": "set_data","data":15}]}
|
||||
{"type": "item", "name": "minecraft:wool", "function": [{"function": "set_data", "data":15}]}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -8,397 +8,265 @@ time: 20分钟
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
### 作者:
|
||||
|
||||
境界
|
||||
|
||||
## 前言
|
||||
|
||||
包体也被称为Package,它是由开发者将本地的JAVA版资源内容和基岩版资源内容进行压缩打包后的档案。在中国版开发者平台拿到上传的包体后,通过机器审核和人工审核后,包体最终会被推送至公共下载服务器。最后再由玩家下载后压缩包后,经客户端解压才能玩到组件资源。
|
||||
|
||||
在上传至平台前,开发者应确保在本地开发的内容达到了预期的运行效果。并遵照本章的打包方式进行压缩打包,降低机器审核的打回概率或审核时间。
|
||||
在上传至平台前,开发者应确保在**本地开发的内容达到了预期的运行效果。并遵照本章的打包方式进行压缩打包,降低机器审核的打回概率或审核时间**。
|
||||
|
||||
## 认识JAVA包体结构
|
||||
|
||||
### PC地图
|
||||
|
||||
### 认识JAVA包体结构
|
||||
<img src="./images/1_1.jpg" style="zoom:40%; display:block; margin:0 auto;" />
|
||||
|
||||
#### PC地图
|
||||
1. 截图截选了我的世界JAVA版1.12.2游戏客户端生成的世界存档的内容。test文件夹下存放着名为test的世界信息。
|
||||
|
||||
<img src="./images/1_2.jpg" style="zoom:40%; display:block; margin:0 auto;" />
|
||||
|
||||
2. 打开这个客户端可以看到test存档。
|
||||
|
||||

|
||||
<img src="./images/1_3.jpg" style="zoom:40%; display:block; margin:0 auto;" />
|
||||
|
||||
3. 返回到目录的上一级,saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹,其中就有前面提到的test存档。
|
||||
|
||||
<img src="./images/1_4.jpg" style="zoom:40%; display:block; margin:0 auto;" />
|
||||
|
||||
1) 截图截选了我的世界JAVA版1.12.2游戏客户端生成的世界存档的内容。test文件夹下存放着名为test的世界信息。
|
||||
4. 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择地图。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||

|
||||
<img src="./images/1_5.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
5. 点击导入窗体内的+号按钮,直接选择test文件夹后点击选择文件夹。
|
||||
|
||||
<img src="./images/1_6.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2) 打开这个客户端可以看到test存档。
|
||||
6. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的存档文件夹。
|
||||
|
||||

|
||||
<img src="./images/1_7.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
7. 开发者不通过MCSTUDIO而选择自行打包时,请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||
### PC MOD
|
||||
|
||||
3) 返回到目录的上一级,saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹,其中就有前面提到的test存档。
|
||||
<img src="./images/1_8.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
1. 上传平台的MOD文件必须以jar格式作为分发给玩家游玩的标准文件格式。
|
||||
|
||||
<img src="./images/1_9.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择Mod。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||
4) 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择地图。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
5) 点击导入窗体内的+号按钮,直接选择test文件夹后点击选择文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
6) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的存档文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
7) 开发者不通过MCSTUDIO而选择自行打包时,请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
#### PC MOD
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 上传平台的MOD文件必须以jar格式作为分发给玩家游玩的标准文件格式。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择Mod。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||

|
||||
|
||||
|
||||
<img src="./images/1_10.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
3)点击导入窗体内的+号按钮,直接双击或选择jar文件后选打开。
|
||||
|
||||

|
||||
<img src="./images/1_11.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的jar文件。
|
||||
|
||||
<img src="./images/1_12.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的jar文件。
|
||||
<img src="./images/1_13.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
5. 开发者不通过MCSTUDIO而选择自行打包时,请将jar文件放入一个文件夹内,将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
|
||||
|
||||

|
||||
### PC 材质
|
||||
|
||||
<img src="./images/1_14.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1. 截图主要展示JAVA版材质的目录和文件结构。
|
||||
|
||||
5) 开发者不通过MCSTUDIO而选择自行打包时,请将jar文件放入一个文件夹内,将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
|
||||
<img src="./images/1_15.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 直接将材质文件夹内的内容全部选取后右键保存成zip压缩文档。
|
||||
|
||||
<img src="./images/1_16.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
#### PC 材质
|
||||
3. 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择材质。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||

|
||||
<img src="./images/1_17.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4. 点击导入窗体内的+号按钮,直接双击或选择zip文档后选打开。
|
||||
|
||||
<img src="./images/1_18.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1) 截图主要展示JAVA版材质的目录和文件结构。
|
||||
5. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的材质压缩档。
|
||||
|
||||

|
||||
<img src="./images/1_19.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
6. 开发者不通过MCSTUDIO而选择自行打包时,请将材质压缩文档放入一个文件夹内,将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
|
||||
|
||||
### PC 光影
|
||||
|
||||
2) 直接将材质文件夹内的内容全部选取后右键保存成zip压缩文档。
|
||||
<img src="./images/1_20.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
1. 截图主要展示JAVA版光影的内容目录和文件结构。
|
||||
|
||||
<img src="./images/1_21.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 直接将文件夹内的所有文件全部选取后右键保存成zip压缩文档。
|
||||
|
||||
3) 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择材质。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
<img src="./images/1_22.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
3. 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择光影。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||
<img src="./images/1_23.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4. 点击导入窗体内的+号按钮,直接双击或选择zip文档后选打开。
|
||||
|
||||
4) 点击导入窗体内的+号按钮,直接双击或选择zip文档后选打开。
|
||||
<img src="./images/1_24.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
5. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的光影压缩档。
|
||||
|
||||
6. 开发者不通过MCSTUDIO而选择自行打包时,请将光影压缩文档放入一个文件夹内,将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
|
||||
|
||||
### PC 皮肤
|
||||
|
||||
5) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的材质压缩档。
|
||||
<img src="./images/1_25.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
1. 截图主要展示PC皮肤资源支持的文件格式,为结尾png的图片文档。该格式的图片保存着一道透明通道。
|
||||
|
||||
<img src="./images/1_26.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择皮肤。【适用MC版本】选择默认选择全版本即可。
|
||||
|
||||
6) 开发者不通过MCSTUDIO而选择自行打包时,请将材质压缩文档放入一个文件夹内,将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
|
||||
<img src="./images/1_27.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
3. 点击导入窗体内的+号按钮,直接双击或选择png文档后选打开。
|
||||
|
||||
<img src="./images/1_28.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
#### PC 光影
|
||||
4. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的图片文档。
|
||||
|
||||

|
||||
5. 开发者不通过MCSTUDIO而选择自行打包时,请直接通过开发者平台上传皮肤组件源图片文档。
|
||||
|
||||
### PC 玩法
|
||||
|
||||
<img src="./images/1_29.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1) 截图主要展示JAVA版光影的内容目录和文件结构。
|
||||
1. 截图截选了我的世界JAVA版1.12.2游戏客户端生成的地图的内容。test文件夹下存放着名为test的世界信息。命令方块玩法、数据包等是用我的世界JAVA版地图作为承载。
|
||||
|
||||

|
||||
<img src="./images/1_30.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开这个客户端可以看到test存档。
|
||||
|
||||
<img src="./images/1_31.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2) 直接将文件夹内的所有文件全部选取后右键保存成zip压缩文档。
|
||||
3. 返回到目录的上一级,saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹,其中就有前面提到的test存档。
|
||||
|
||||

|
||||
<img src="./images/1_32.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4. 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择玩法。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
|
||||
<img src="./images/1_33.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
3) 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择光影。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
5. 点击导入窗体内的+号按钮,直接选择test文件夹后点击选择文件夹。
|
||||
|
||||

|
||||
<img src="./images/1_34.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
6. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的存档文件夹。
|
||||
|
||||
<img src="./images/1_35.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4) 点击导入窗体内的+号按钮,直接双击或选择zip文档后选打开。
|
||||
7. 开发者不通过MCSTUDIO而选择自行打包时,请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||

|
||||
## 认识基岩版包体结构
|
||||
|
||||
### PE地图
|
||||
|
||||
<img src="./images/1_36.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
5) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的光影压缩档。
|
||||
1. 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。
|
||||
|
||||
6) 开发者不通过MCSTUDIO而选择自行打包时,请将光影压缩文档放入一个文件夹内,将文件夹用7z压缩工具压缩成7z后缀格式的压缩包。再通过开发者平台上传组件资源源文档。
|
||||
<img src="./images/1_38.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开MCSTUDIO,点击作品库后再点击基岩版版组件,分类选择【地图】。若勾选【复制文件到默认文件夹】,MCSTUDIO会将地图完整拷贝一份至C:/MCStudioDownload/work/开发者ID/Cpp/Map下。若不勾选,则不会做出此操作。
|
||||
|
||||
<img src="./images/1_37.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
#### PC 皮肤
|
||||
3. 勾选选项时,点击窗体内的+号。不勾选选项时,点击窗体内的选择按钮。双击存档文件夹或选择文件夹后点击【选择文件夹】按钮。
|
||||
|
||||

|
||||
<img src="./images/1_39.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4. 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品并且作品勾选【复制文件到默认文件夹】,则会系统会将C:/MCStudioDownload/work/开发者ID/Cpp/Map下相应的拷贝文件夹删除。
|
||||
|
||||
<img src="./images/1_40.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1) 截图主要展示PC皮肤资源支持的文件格式,为结尾png的图片文档。该格式的图片保存着一道透明通道。
|
||||
5. 开发者不通过MCSTUDIO而选择自行打包时,请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||

|
||||
### PE 联机地图
|
||||
|
||||
<img src="./images/1_41.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1. 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。联机地图指代可以同时在本地、本地联机、联机大厅上使用的地图资源。
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择皮肤。【适用MC版本】选择默认选择全版本即可。
|
||||
<img src="./images/1_42.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
<img src="./images/1_43.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 若世界存档携带附加包玩法,请确保存档文件夹目录下存有world_behavior_packs.json和world_resource_packs.json文件。其中pack_id对应材质包或行为包manifest内,header下的uuid。version对应manifest内header下的version。若只携带材质包或行为包,可以在world_behavior_packs.json内或world_resource_packs.json将第一个方括号内的内容全部清除。若不携带附加包,则则不需要在存档文件夹下携带此类文件。
|
||||
|
||||
<img src="./images/1_44.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
3) 点击导入窗体内的+号按钮,直接双击或选择png文档后选打开。
|
||||
3. 开发者可以在存档中放置一个server.properties,指定玩家的游戏模式。这样在联机大厅玩这个联机地图时,玩家每次进入都是server.properties文件中设置的游戏模式。更多基岩版多人联机地图的配置设定,请参考网址[https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F](https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)
|
||||
|
||||

|
||||
4. 当前MCSTUDIO暂不支持导入联机大厅地图,请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||
### PE Addon
|
||||
|
||||
<img src="./images/1_45.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
4) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的图片文档。
|
||||
1. 截图截选了我的世界基岩版Addon的内容。Addon又被称作附加包,它由材质包和行为包组成。因此开发者在上架完整的附加包内容(包含附加包和行为包),需依照接下来的规范进行打包上传即可。请注意:上架至中国版平台的附加包中,行为包内必须携带entities文件夹,材质包内必须携带textures文件夹。
|
||||
|
||||
5) 开发者不通过MCSTUDIO而选择自行打包时,请直接通过开发者平台上传皮肤组件源图片文档。
|
||||
<img src="./images/1_46.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
<img src="./images/1_47.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开MCSTUDIO,点击作品库后再点击基岩版版组件。若勾选【复制文件到默认文件夹】,请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档,MCSTUDIO会在导入zip文档后,将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/AddOn下。若不勾选,则直接选择带有行为包或材质包的文件夹即可。最后点击导入即可,之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
|
||||
|
||||
#### PC 玩法
|
||||
3. 若开发者不通过MCSTUDIO而选择自行打包时,请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
|
||||
|
||||

|
||||
### PE 材质
|
||||
|
||||
<img src="./images/1_48.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1. 附加包是行为包和材质包的统称,因此材质包被算入附加包的一种类型。因此开发者在上架完整的材质包内容前,需依照接下来的规范进行打包上传。请注意:上架至中国版平台的材质包内必须携带textures文件夹。
|
||||
|
||||
1) 截图截选了我的世界JAVA版1.12.2游戏客户端生成的地图的内容。test文件夹下存放着名为test的世界信息。命令方块玩法、数据包等是用我的世界JAVA版地图作为承载。
|
||||
<img src="./images/1_49.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
<img src="./images/1_50.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开MCSTUDIO,点击作品库后再点击基岩版版组件,在右上角点击本地导入,分区选择【基岩版作品】,分类选择【皮肤】。若勾选【复制文件到默认文件夹】,请将材质包文件夹右键使用压缩工具压缩成zip文档,MCSTUDIO会在导入zip文档后,将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Material下。若不勾选,则直接选择带有材质包的文件夹即可。最后点击导入即可,之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
|
||||
|
||||
3. 若开发者不通过MCSTUDIO而选择自行打包时,请将材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
|
||||
|
||||
2) 打开这个客户端可以看到test存档。
|
||||
### PE 光影
|
||||
|
||||

|
||||
<img src="./images/1_51.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
1. 光影的内容都被保存在材质包文件夹中,因此在运行机制与打包机制上与材质包类似。因此开发者在上架完整的光影内容前,需依照接下来的规范进行打包上传。请注意:上架至中国版平台的材质包内必须携带textures文件夹。
|
||||
|
||||
<img src="./images/1_52.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
3) 返回到目录的上一级,saves文件夹下则会存放着这个客户端可以启动的所有存档文件夹,其中就有前面提到的test存档。
|
||||
<img src="./images/1_53.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
2. 打开MCSTUDIO,点击作品库后再点击基岩版版组件,在右上角点击本地导入,分区选择【基岩版作品】,分类选择【光影】。若勾选【复制文件到默认文件夹】,请将光影材质包文件夹右键使用压缩工具压缩成zip文档,MCSTUDIO会在导入zip文档后,将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Light下。若不勾选,则直接选择带有光影的材质包文件夹即可。最后点击导入即可,之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
|
||||
|
||||
3. 若开发者不通过MCSTUDIO而选择自行打包时,请将带有光影的材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
|
||||
|
||||
### PE 皮肤
|
||||
|
||||
4) 打开MCSTUDIO,点击作品库后再点击Java版组件。在右上角点击本地导入,【作品分区】选择Java版作品。【作品分类】中选择玩法。【适用MC版本】选择对应存档本版。若支持多个版本可以选择多个相应版本。
|
||||
<img src="./images/1_54.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||

|
||||
1. 截图主要展示PE皮肤资源支持的文件格式,为结尾png的图片文档。该格式的图片保存着一道透明通道。
|
||||
|
||||
<img src="./images/1_55.jpg" style="zoom:40%; display:block; margin:0 auto;"/>
|
||||
|
||||
2. 打开MCSTUDIO,点击作品库后再点击基岩版版组件,在右上角点击本地导入,分区选择【基岩版作品】,分类选择【皮肤】。直接点击+号选择png结尾的皮肤图片即可。
|
||||
|
||||
5) 点击导入窗体内的+号按钮,直接选择test文件夹后点击选择文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
6) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品,也不会影响到最原先的存档文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
7) 开发者不通过MCSTUDIO而选择自行打包时,请将存档文件夹使用7Z压缩工具打包成一个后缀为7z的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
### 认识基岩版包体结构
|
||||
|
||||
#### PE地图
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击基岩版版组件,分类选择【地图】。若勾选【复制文件到默认文件夹】,MCSTUDIO会将地图完整拷贝一份至C:/MCStudioDownload/work/开发者ID/Cpp/Map下。若不勾选,则不会做出此操作。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
3) 勾选选项时,点击窗体内的+号。不勾选选项时,点击窗体内的选择按钮。双击存档文件夹或选择文件夹后点击【选择文件夹】按钮。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
4) 最后点击导入按钮,即可由MCSTUDIO拷贝作品后导入进作品库内,进行后续的测试、发布、配置等操作。若开发者选择删除作品并且作品勾选【复制文件到默认文件夹】,则会系统会将C:/MCStudioDownload/work/开发者ID/Cpp/Map下相应的拷贝文件夹删除。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
5) 开发者不通过MCSTUDIO而选择自行打包时,请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
#### PE 联机地图
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 截图截选了我的世界基岩版1.16.12游戏客户端生成的世界存档的内容。英文数字组合名称的文件夹下存放着该存档的世界信息。联机地图指代可以同时在本地、本地联机、联机大厅上使用的地图资源。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 若世界存档携带附加包玩法,请确保存档文件夹目录下存有world_behavior_packs.json和world_resource_packs.json文件。其中pack_id对应材质包或行为包manifest内,header下的uuid。version对应manifest内header下的version。若只携带材质包或行为包,可以在world_behavior_packs.json内或world_resource_packs.json将第一个方括号内的内容全部清除。若不携带附加包,则则不需要在存档文件夹下携带此类文件。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
3) 开发者可以在存档中放置一个server.properties,指定玩家的游戏模式。这样在联机大厅玩这个联机地图时,玩家每次进入都是server.properties文件中设置的游戏模式。更多基岩版多人联机地图的配置设定,请参考网址[https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F](https://zh.minecraft.wiki/w/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F)
|
||||
|
||||
4) 当前MCSTUDIO暂不支持导入联机大厅地图,请将整个存档文件夹使用任意压缩工具打包成一个后缀为zip的压缩文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
#### PE Addon
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 截图截选了我的世界基岩版Addon的内容。Addon又被称作附加包,它由材质包和行为包组成。因此开发者在上架完整的附加包内容(包含附加包和行为包),需依照接下来的规范进行打包上传即可。请注意:上架至中国版平台的附加包中,行为包内必须携带entities文件夹,材质包内必须携带textures文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击基岩版版组件。若勾选【复制文件到默认文件夹】,请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档,MCSTUDIO会在导入zip文档后,将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/AddOn下。若不勾选,则直接选择带有行为包或材质包的文件夹即可。最后点击导入即可,之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
|
||||
|
||||
3) 若开发者不通过MCSTUDIO而选择自行打包时,请将行为包、材质包全部选取后右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
#### PE 材质
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 附加包是行为包和材质包的统称,因此材质包被算入附加包的一种类型。因此开发者在上架完整的材质包内容前,需依照接下来的规范进行打包上传。请注意:上架至中国版平台的材质包内必须携带textures文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击基岩版版组件,在右上角点击本地导入,分区选择【基岩版作品】,分类选择【皮肤】。若勾选【复制文件到默认文件夹】,请将材质包文件夹右键使用压缩工具压缩成zip文档,MCSTUDIO会在导入zip文档后,将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Material下。若不勾选,则直接选择带有材质包的文件夹即可。最后点击导入即可,之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
|
||||
|
||||
3) 若开发者不通过MCSTUDIO而选择自行打包时,请将材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
#### PE 光影
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 光影的内容都被保存在材质包文件夹中,因此在运行机制与打包机制上与材质包类似。因此开发者在上架完整的光影内容前,需依照接下来的规范进行打包上传。请注意:上架至中国版平台的材质包内必须携带textures文件夹。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击基岩版版组件,在右上角点击本地导入,分区选择【基岩版作品】,分类选择【光影】。若勾选【复制文件到默认文件夹】,请将光影材质包文件夹右键使用压缩工具压缩成zip文档,MCSTUDIO会在导入zip文档后,将一份完整拷贝放至C:/MCStudioDownload/work/开发者ID/Cpp/Light下。若不勾选,则直接选择带有光影的材质包文件夹即可。最后点击导入即可,之后开发者可以在MCSTUDIO进行后续的测试、发布、配置等操作。
|
||||
|
||||
3) 若开发者不通过MCSTUDIO而选择自行打包时,请将带有光影的材质包文件夹右键使用压缩工具压缩成zip文档。再通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
|
||||
#### PE 皮肤
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
1) 截图主要展示PE皮肤资源支持的文件格式,为结尾png的图片文档。该格式的图片保存着一道透明通道。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
2) 打开MCSTUDIO,点击作品库后再点击基岩版版组件,在右上角点击本地导入,分区选择【基岩版作品】,分类选择【皮肤】。直接点击+号选择png结尾的皮肤图片即可。
|
||||
|
||||
3) 若开发者不通过MCSTUDIO而选择自行打包时,请将带有皮肤文件直接通过开发者平台进行上传操作。
|
||||
3. 若开发者不通过MCSTUDIO而选择自行打包时,请将带有皮肤文件直接通过开发者平台进行上传操作。
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
## 先发测试
|
||||
|
||||
2020年6月,Notch将更新代号更改为了Alpha,这意味着游戏进入了正式发行前的测试阶段。同年12月底,更新代号进一步更改为了Beta。一般而言,Alpha意味着游戏的内测,Beta意味着公测,不过在Notch看来这两个阶段好像并无类似区别。Alpha阶段内加入了我们当前熟知的生物群系和下界,Beta阶段进一步加入了村庄、要塞等结构、重构了崭新的创造模式。大家最喜欢用的床也在这一阶段加入游戏。Notch计划加入一种新的维度,被称为天域,但并没有成功实现,这一维度是现在末地的前身。
|
||||
2010年6月,Notch将更新代号更改为了Alpha,这意味着游戏进入了正式发行前的测试阶段。同年12月底,更新代号进一步更改为了Beta。一般而言,Alpha意味着游戏的内测,Beta意味着公测,不过在Notch看来这两个阶段好像并无类似区别。Alpha阶段内加入了我们当前熟知的生物群系和下界,Beta阶段进一步加入了村庄、要塞等结构、重构了崭新的创造模式。大家最喜欢用的床也在这一阶段加入游戏。Notch计划加入一种新的维度,被称为天域,但并没有成功实现,这一维度是现在末地的前身。
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
开发者账号是你发布作品的重要渠道,也是你通过作品获得收益的重要途径。注册一个开发者账号是成为一个开发者的先决条件。现在,跟随我们的步骤,一起注册一个开发者账号吧!
|
||||
|
||||
**注意,本教程已为老教程,注册看房子可以前往以下链接**
|
||||
|
||||
[新开发注册流程](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/12-%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/10-%E6%B3%A8%E5%86%8C%E6%88%90%E4%B8%BA%E5%BC%80%E5%8F%91%E8%80%85.html?catalog=1)
|
||||
|
||||
## 准备
|
||||
|
||||
- 邮箱:你需要准备一个邮箱作为开发者账号的账号名。
|
||||
|
||||