diff --git a/.gitignore b/.gitignore
index dba7df0..8550474 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,5 @@ package-lock.json
package.json
.DS_Store
.idea
+mcguide/30-测试/video/airperf.mp4
+mcguide/30-测试/video/tracy.mp4
diff --git a/mcguide/20-玩法开发/15-自定义游戏内容/9-自定义指令.md b/mcguide/20-玩法开发/15-自定义游戏内容/9-自定义指令.md
index 2a2956f..074b405 100644
--- a/mcguide/20-玩法开发/15-自定义游戏内容/9-自定义指令.md
+++ b/mcguide/20-玩法开发/15-自定义游戏内容/9-自定义指令.md
@@ -57,7 +57,7 @@ selection: true
|format_version|str||格式版本,请填写0.0.1|
|name|str||指令名称,例如gamemode|
|description|str||指令描述,也支持在语言文件(例如zh_CN.lang)中定义|
- |permission_level|str|game_directors|权限等级,可选game_directors、admin、host、owner、any,具体含义如下
game_directors:任何操作员都可以运行此命令,包括命令方块
admin:任何操作员都可以运行此命令,但命令方块不能
host:任何服务器主机都可以运行此命令
owner:只有专用服务器可以运行此命令
any:任何人都可以运行此命令|
+ |permission_level|str|权限等级,可选game_directors、admin、host、owner、any,具体含义如下
game_directors:任何操作员都可以运行此命令,包括命令方块
admin:任何操作员都可以运行此命令,但命令方块不能
host:任何服务器主机都可以运行此命令
owner:只有专用服务器可以运行此命令
any:任何人都可以运行此命令|
- args是一个包含object的列表,定义指令的参数。每个object都代表一个参数,object的顺序决定指令参数的输入顺序,每个object的参数说明如下
@@ -124,4 +124,4 @@ selection: true
/explode ~~8~ 3 false
让发送对象爆炸,爆炸范围为3,破坏方块,产生火焰
/explode @s 3 true true
-```
+```
\ No newline at end of file
diff --git a/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md b/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md
index 82fded9..a065349 100644
--- a/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md
+++ b/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md
@@ -92,30 +92,32 @@ playerId = clientApi.GetLocalPlayerId()
ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_create_flying", 0)
ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_elytra_flying", 0)
-# key为需要监听的attr名称,value为需要设置的对应Molang变量名称
-queryDict = {
- "playerIsFlying": "query.mod.ysm_is_flying",
- "playerIsElytraFlying": "query.mod.ysm_is_elytra_flying"
-}
-
-# 根据queryDict自动配置监听,简化代码
-def CreateAttrCallBack(bindQuery):
- def _eventFuckCallBack(args):
- ClientComp.CreateQueryVariable(args["entityId"]).Set(bindQuery, args["newValue"])
- return _eventFuckCallBack
-
class PlayerActionClientSystem(ClientSystem):
def __init__(self, namespace, systemName):
ClientSystem.__init__(self, namespace, systemName)
# 注册本地玩家的属性值变化回调函数
- for attr, query in queryDict.items():
- ClientComp.CreateModAttr(playerId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
+ modAttr = ClientComp.CreateModAttr(playerId)
+ modAttr.RegisterUpdateFunc("playerIsCreateFlying", self.PlayerCreateFlyStateChanged)
+ modAttr.RegisterUpdateFunc("playerIsElytraFlying", self.PlayerElytraFlyStateChanged)
def OnAddPlayerAOIClient(self, args):
"""玩家加入游戏或进入视野时触发,注册属性值变化回调"""
pId = args["playerId"]
- for attr, query in queryDict.items():
- ClientComp.CreateModAttr(pId).RegisterUpdateFunc(attr, CreateAttrCallBack(query))
+ modAttr = ClientComp.CreateModAttr(pId)
+ modAttr.RegisterUpdateFunc("playerIsCreateFlying", self.PlayerCreateFlyStateChanged)
+ modAttr.RegisterUpdateFunc("playerIsElytraFlying", self.PlayerElytraFlyStateChanged)
+
+ def PlayerCreateFlyStateChanged(self, args):
+ """创造飞行状态变化回调"""
+ molangVar = args["newValue"] # 属性变化后的值
+ pId = args["entityId"] # 属性变化对应的实体Id
+ ClientComp.CreateQueryVariable(pId).Set("query.mod.ysm_is_create_flying", molangVar)
+
+ def PlayerElytraFlyStateChanged(self, args):
+ """鞘翅飞行状态变化回调"""
+ molangVar = args["newValue"] # 属性变化后的值
+ pId = args["entityId"] # 属性变化对应的实体Id
+ ClientComp.CreateQueryVariable(pId).Set("query.mod.ysm_is_elytra_flying", molangVar)
```
### 工作流程说明
diff --git a/mcguide/27-手机网络游戏/课程11:使用Nukkit开服/0-Nukkit开服教程.md b/mcguide/27-手机网络游戏/课程11:使用Nukkit开服/0-Nukkit开服教程.md
new file mode 100644
index 0000000..9f254fb
--- /dev/null
+++ b/mcguide/27-手机网络游戏/课程11:使用Nukkit开服/0-Nukkit开服教程.md
@@ -0,0 +1,103 @@
+---
+front:
+hard: 入门
+time: 60分钟
+---
+
+# Nukkit部署教程
+
+## 前言
+本文默认认为你了解过Nukkit 或者 通过Waterdogpe + Nukkit搭建过第三方服务器。
+
+## 准备阶段
+1. 准备Java版本,建议Java版本为Java17及以上版本
+2. 准备NukkitMOT分支,NukkitMOT原作者已将中国版打包到github主分支内 https://github.com/MemoriesOfTime/Nukkit-MOT
+> 目前仅支持接入Nukkit-MOT,其他分支可自行通过参考NukkitMOT源码进行对接
+3. 准备 WaterDogPE 代理服务端。
+
+
+## WaterDogPE
+### config.yml 的配置
+
+需要修改以下参数,其他配置根据情况自行修改
+```yaml
+
+# ....
+
+netease_client: true # 启用 netease 客户端的支持
+online_mode: true
+# 开发测试阶段,需要改为false,否则会提示需要 minecraft验证
+# 发布阶段时,需要改为true,之后只能用网易手机客户端连接才能进入
+listener:
+ # .....
+
+ host: 0.0.0.0:19132 # waterdogpe 代理端的IP和端口 。官方提供的机器19132端口可能会被占用,根据实际情况更改
+ priorites: # 按顺序配置,第一个是玩家进入时默认在的服务器。 一般为大厅服
+ - lobby1
+
+ # .....
+servers: # 子服务器的连接ID配置,如大厅服、游戏服等等。如子服务器不在同一台机器,则需要写具体的ip。
+ lobby1:
+ address: 127.0.0.1:19133
+ public_address: play.myserver.com:19133
+ server_type: bedrock
+
+
+permissions: # 权限配置,一般用于配置管理员的权限,用于测试、调试。仅通过名字识别,建议发布阶段去掉,改为用插件实现相关调试功能
+ 玩家id:
+ - waterdog.player.transfer
+ - waterdog.player.list
+ - waterdog.command.server
+
+```
+
+### 装载客户端模组
+
+当通过waterdogpe代理后,需要将客户端模组存放在waterdogpe 根目录下的 packs 文件夹中,不要存放在NukkitMOT根目录
+> 除非你仅通过NukkitMOT单端开服 否则waterdogpe 会自动将nukkit模组加载数据包拦截
+
+> 但如果关闭waterdogpe的资源包功能,Nukkit数据包依然会被waterdogpe拦截而无法正常进入游戏
+
+确保 config.yml 已启用资源包
+```yaml
+enable_packs: true # 必须打开
+overwrite_client_packs: true # 按需
+force_server_packs: true # 按需
+```
+
+### 模组打包格式
+
+waterdogpe 仅支持 zip和mcpack包,不支持文件夹。
+可以将行为包、资源包都存放在packs目录中。
+目前仅支持 manifest.json ,不支持 pack_manifest.json
+
+zip打包格式为: 压缩包一级目录下就是 manifest.json,不要额外套一层文件夹
+
+
+## Nukkit-MOT
+
+nukkit社区的插件
+https://cloudburstmc.org/resources/categories/nukkit-plugins.1/
+
+### server.properties 配置
+
+为了确保Nukkit-MOT正常接入中国版,您需要调整一些配置
+```properties
+xbox-auth=off
+netease-client-support=on
+only-allow-netease-client=on
+```
+
+### 模组装载
+
+如果使用 waterdogpe 代理,则需要将模组放在 waterdogpe 目录,而非Nukkit目录
+如果仅适用Nukkit,则将行为包合资源包都放在Nukkit目录下有关 netease的文件里
+
+### NukkitMaster插件
+
+NukkitMaster相当于Spigot服的SpigotMaster,内置封装了PyRPC、订单接口、消息收发等功能,API和使用方法和SpigotMaster一样。
+
+
+### 自定义物品、方块和实体
+
+Nukkit-MOT本身已经支持自定义物品、方块、实体的功能,可以参考[官方文档](https://www.nukkit-mot.com/zh/docs/tutorial-extras/custom/custom_item)
diff --git a/mcguide/27-手机网络游戏/课程11:使用Nukkit开服/1-NukkitMasterAPI文档.md b/mcguide/27-手机网络游戏/课程11:使用Nukkit开服/1-NukkitMasterAPI文档.md
new file mode 100644
index 0000000..2a2872f
--- /dev/null
+++ b/mcguide/27-手机网络游戏/课程11:使用Nukkit开服/1-NukkitMasterAPI文档.md
@@ -0,0 +1,277 @@
+---
+front:
+hard: 入门
+time: 60分钟
+---
+
+# NukkitMaster文档
+
+## 准备阶段
+
+在部署Nukkit服务器之前,您需要阅读一下NukkitMaster的API来进行基本的ModSDK通信与商业化内容接入。
+NukkitMaster需要安装在Nukkit-MOT服务端中。
+
+> 需要注意: NukkitMaster是基于Nukkit-MOT分支进行开发的。Nukkit官方服务端版本无法兼容。
+
+> 如果您需要使用其他分支的Nukkit,您可以自行反编译NukkitMaster
+
+> NukkitMOT分支开源地址: https://github.com/MemoriesOfTime/Nukkit-MOT
+
+## 插件配置
+
+```yaml
+# 服务器id(开发者平台中的资源数字id)
+game_id: ""
+# 正式服务器key(开发者平台中的签名信息)
+game_key: ""
+# 测试服务器key(开发者平台中的签名信息)
+test_game_key: ""
+
+# 是否是测试服
+test_server: false
+
+# 是否使用自定义商城(false表示使用官方提供的商城功能)
+custom_shop: false
+
+
+# 订单服务器地址(一般不用填,保持""即可)
+shop_server_url: ""
+# web服务器地址(一般不用填,保持""即可)
+web_server_url: ""
+```
+
+NukkitMaster插件会在 `plugins/NukkitMaster` 下生成 `config.yml` ,需要将服务器的相关数据进行配置,订单API才能生效。
+其中`gameid`、`rawkey`、`test rawkey`是必须要填写的。
+`test_server`需要根据服务器部署情况进行修改,这个值会影响NukkitMaster插件使用的是正式服url还是测试服url
+`custom_shop` 和 [商业化流程](https://mc.163.com/dev/mcmanual/mc-dev/mcguide/27-%E6%89%8B%E6%9C%BA%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F/%E8%AF%BE%E7%A8%8B9%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%BA%BF/%E7%AC%AC3%E8%8A%82%EF%BC%9A%E5%95%86%E4%B8%9A%E5%8C%96%E6%93%8D%E4%BD%9C.html?key=use_custom_shop&docindex=1&type=0) 中 use custom shop 功能同理
+`shop_server_url`、`web_server_url`为预留配置,目前不需要修改,默认即可
+
+## API
+
+### `public void enableCustomShopEntry(boolean useCustomShop)`
+开启商城插件的入口,该功能已经在NukkitMaster中集成,可修改NukkitMaster的`config.yml`文件。
+参数: `useCustomShop` —— 是否使用自定义商城入口,为false时,则使用官方商城入口
+
+### `public void openShop(Player player)`
+打开指定玩家商城界面 注意:该接口需要使用商城插件,并修改config.yml的`custom_shop`为true。
+参数: `player` —— 玩家
+
+### `public void closeShop(Player player)`
+关闭指定玩家商城界面 注意:该接口需要使用商城插件,并修改config.yml的`custom_shop`为true。
+参数: `player` —— 玩家
+
+### `public void getPlayerOrderList(Player player, FutureCallback