Compare commits
14 Commits
1m9d
...
sync-20260
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
707e3a7b2b | ||
|
|
8f48148961 | ||
|
|
e5ecce5841 | ||
|
|
0806b4e69f | ||
|
|
fb17060866 | ||
|
|
8af3e13f2f | ||
|
|
fb9586cf5d | ||
|
|
f105f936e0 | ||
|
|
ec2c7f60b9 | ||
|
|
d977df2dc2 | ||
|
|
31d219956f | ||
|
|
df4bece89b | ||
|
|
77ba105452 | ||
|
|
d68587065c |
@@ -34,6 +34,15 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"doc"
|
"doc"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Nacalpha",
|
||||||
|
"name": "Nacalpha",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/128111367?v=4",
|
||||||
|
"profile": "https://github.com/Nacalpha",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
63
.github/workflows/sync.yml
vendored
Normal file
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
1
.gitignore
vendored
@@ -5,3 +5,4 @@ package.json
|
|||||||
.idea
|
.idea
|
||||||
mcguide/30-测试/video/airperf.mp4
|
mcguide/30-测试/video/airperf.mp4
|
||||||
mcguide/30-测试/video/tracy.mp4
|
mcguide/30-测试/video/tracy.mp4
|
||||||
|
.codemaker/
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ git push --set-upstream origin your-branch-name
|
|||||||
<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/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/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/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>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -157,7 +157,11 @@ def onUpdatePlayerSkinClient(self,args):
|
|||||||
|
|
||||||
为方便开发者测试4D皮肤与模组本身的兼容性,官方在**开发者测试服(手机自测)**提供了测试用4D皮肤,可通过邮件领取
|
为方便开发者测试4D皮肤与模组本身的兼容性,官方在**开发者测试服(手机自测)**提供了测试用4D皮肤,可通过邮件领取
|
||||||
|
|
||||||
**注意:** 请各位开发者更新到3.5测试服,3.4该测试皮肤不会生效
|
**注意:**
|
||||||
|
|
||||||
|
- 请各位开发者更新到3.5测试服,3.4该测试皮肤不会生效
|
||||||
|
|
||||||
|
- 自3.7版本之后,渲染龙包体无法使用4D皮肤。开发者请勿在游戏内视频设置中切换为渲染龙,这将导致断言报错
|
||||||
|
|
||||||
#### MC Studio
|
#### MC Studio
|
||||||
|
|
||||||
|
|||||||
@@ -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中才会正常生效
|
follows_cursor | boolean | false | 控件是否跟随鼠标或手柄指针移动,仅在调用<a href="../../mcdocs/1-ModAPI/接口/自定义UI/通用.html#pushscreen" rel="noopenner"> PushScreen </a>接口创建的UI中才会正常生效
|
||||||
grid_position | array [row, column] | 取决于自身 | 用于设置控件在grid中的位置,这也允许修改原版硬编码网格的特定网格项
|
grid_position | array [row, column] | 取决于自身 | 用于设置控件在grid中的位置,这也允许修改原版硬编码网格的特定网格项
|
||||||
collection_index | int | 取决于自身 | 用于设置控件在集合中的索引
|
collection_index | int | 取决于自身 | 用于设置控件在集合中的索引
|
||||||
|
collection_name | string | | 该控件的集合名称。该控件的值会向子控件传递。该属性仅适用于 工厂、堆叠面板、集合面板、网格。
|
||||||
priority | int | 0 | 该控件的优先级,数字越小优先级越高
|
priority | int | 0 | 该控件的优先级,数字越小优先级越高
|
||||||
layer | int | 0 | 当前控件相对父节点的层级,最终显示层级取决于父节点到该节点的layer之和,较高的层级将会渲染在上层
|
layer | int | 0 | 当前控件相对父节点的层级,最终显示层级取决于父节点到该节点的layer之和,较高的层级将会渲染在上层
|
||||||
alpha | number | 1.0 | 控件的不透明度。取值0.0-1.0。它只会影响UI控件本身,其子控件不受影响。如果希望透明度同时应用于父控件和子控件,请使用propagate_alpha
|
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
|
||||||
|
|
||||||
edit_box是输入框控件,用来输入文字信息,可以获取输入内容,设置输入框内容,触发输入中和输入完成事件,设置最大输入值等。下面的示例展示了一个搜索框的信息。
|
edit_box是输入框控件,用来输入文字信息,可以获取输入内容,设置输入框内容,触发输入中和输入完成事件,设置最大输入值等。下面的示例展示了一个搜索框的信息。
|
||||||
@@ -1767,7 +1787,15 @@ touch_path = scroll_view_path + "/scroll_touch/scroll_view/panel/background_and_
|
|||||||
mouse_path = scroll_view_path + "/scroll_mouse/scroll_view/stack_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
|
### grid
|
||||||
|
|
||||||
@@ -2641,4 +2669,4 @@ def OnRichTextCreateFinishCallback(self):
|
|||||||
|
|
||||||
##### 使用事项
|
##### 使用事项
|
||||||
- 富文本是Python实现的一个复合控件,在生成富文本后会有部分数据缓存在RichTextItem实例中,因此不支持使用clone接口复制已创建完成的富文本,但是clone没有调用过readRichText的富文本是可行的。
|
- 富文本是Python实现的一个复合控件,在生成富文本后会有部分数据缓存在RichTextItem实例中,因此不支持使用clone接口复制已创建完成的富文本,但是clone没有调用过readRichText的富文本是可行的。
|
||||||
- 我们在内部会缓存路径与RichTextItem实例的映射,使用GetRichTextItem接口,传入相同路径返回的RichTextItem实例也会是相同的。
|
- 我们在内部会缓存路径与RichTextItem实例的映射,使用GetRichTextItem接口,传入相同路径返回的RichTextItem实例也会是相同的。
|
||||||
|
|||||||
257
mcguide/20-玩法开发/13-模组SDK编程/2-Python脚本开发/103-3.7版本物品id变更.md
Normal file
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
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)中定义了一个自定义鱼竿
|
||||||
79
mcguide/27-手机网络游戏/课程12:使用Allay开服/0-Allay部署教程.md
Normal file
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
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
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
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
0
mcguide/27-手机网络游戏/课程12:使用Allay开服/README.md
Normal file
BIN
mcguide/27-手机网络游戏/课程12:使用Allay开服/images/installation-p1.png
Normal file
BIN
mcguide/27-手机网络游戏/课程12:使用Allay开服/images/installation-p1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 154 KiB |
788
mcguide/9-规范开发/8-通用设置规范.md
Normal file
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
BIN
mcguide/9-规范开发/images/image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
@@ -45,7 +45,7 @@ time: 10分钟
|
|||||||
{
|
{
|
||||||
"rolls": 1,
|
"rolls": 1,
|
||||||
"entries": [
|
"entries": [
|
||||||
{“type”: "item", "name": "minecraft:wool","function": [{"function": "set_data","data":15}]}
|
{"type": "item", "name": "minecraft:wool", "function": [{"function": "set_data", "data":15}]}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user