This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -0,0 +1,132 @@
---
front:
hard: 进阶
time: 20分钟
---
# 认识MODSDK
#### 作者:境界
#### 什么是Mod
原生的AddOn方式可以改变很多原版游戏内容以及添加自定义的游戏内容但一般无法实现一些较复杂的逻辑比如右键自定义方块时会给予物品。这就需要使用脚本来实现了。
在我的世界中国版中我们使用python来编写mod脚本。
开花组用MODSDK封装了很多的游戏事件与组件游戏事件是指游戏内触发了某个操作或达到某一种条件例如玩家右键了自定义方块可以通知到我们的代码进而实现我们的逻辑。组件是我们封装好的游戏引擎接口可以用来设置或获取某些数据例如操作玩家背包、放置方块或者执行一些特殊的功能。
脚本开发就是一个监听事件与调用组件的过程,配合自己的逻辑来实现很酷的玩法。想要了解当下最新的事件和接口文档,请翻阅<a href="../../../mcdocs/1-ModAPI/接口/通用/索引.html" rel="noopenner">官方文档网址</a>。
#### Mod是如何工作的
MOD加载时与附加包类似存在着服务端运行和客户端单独运行的内容因此在MOD文档中也清晰地分离了服务端和客户端各自的事件和接口。我们常见的如玩家的血量、饥饿、饱和度等信息以及世界上分布的生物它们所在的坐标、行为、属性等都属于公共资源的范畴即它们会放在服务端上运行每当玩家需要使用到这些数据时再由客户端向服务端请求后获得这些数据。因此生成一个实体生物的接口会在服务端上使用因为它是公共资源它是同步的。而生成一种特效的接口则在客户端上使用因为就像原版粒子资源放在资源包即客户端上运行的道理类似某些粒子只有在一名玩家达到某个条件时才会显示亦或是这样的资源在不同的玩家面前都有不同的表现。
因此常有玩家会说,联机房间开启时,某些#模组的表现不再像单人游玩时那么稳定。其中一个原因便是房主会同时承担客户端和服务端的计算压力,又会不断接受其他房间内玩家请求数据的压力。这与单人游玩需要的数据传输量有着天壤之别,并且服务端和客户端传输时需要网络通信,当房主的网络环境与其他联机成员的环境相差较大时,也容易造成成员卡顿而体验不佳。因此,优化的任务永远是摆在所有开发者面前最重要的大关。能够优化的越好,触达的玩家自然也越多,模组的受众也会越来越多!
#### 开发环境搭建
开发环境搭建主要分为两个一个是Python的安装一个是工具的安装。前者可以理解为MOD工作需要一个编程语言环境就像我的世界PC JAVA版在运行前一定要安装JAVA语言环境一样。后者可以理解为生产环境的搭建即需要一系列配套的工具进行MOD的编程作业。
Python安装需要进入Python官网下载选择Python2的版本【[https://www.python.org/downloads/](https://www.python.org/downloads/)】。同时根据自己电脑是64位还是32位选择下载安装文件安装时需要选择将python添加到环境变量中其余按照提示点下一步即可。
生产环境需要配置生产工具集成开发环境IDE可以很好帮助我们编写代码对于python来说pycharm与vscode都是很不错的IDE这里我们以pycharm为例。进入pycharm的官网下载页选择Community版本下载然后按照提示点下一步安装即可。
Mod SDK补全可以允许代码编辑器根据上下文自动补全输入内容。
在MCSTUDIO->编辑器->关卡编辑器环境中点击菜单栏【工具】→【安装1.22.0 stable补全库】即可自动安装若提示报错请重点检查是否将python添加到环境变量中了。
#### Python入门
python是一门很容易入门的编程语言没有接触过python的开发者可以先浏览[https://www.liaoxuefeng.com/wiki/897692888725344](https://www.liaoxuefeng.com/wiki/897692888725344)的下面这些页面跟着上面的示例代码来了解python
第一个Python程序
使用文本编辑器
Python基础
数据类型和变量
条件判断和循环
使用dict
函数
调用函数
定义函数
函数的参数
模块
使用模块
面向对象编程
类和示例
#### 为自定义模组添加脚本
①打开教程附录的示例文件夹可以看到文件夹内仅包含BehBehavior行为包的内容。在中国版我的世界中必须注意在行为包内添加entities文件夹才能被识别为行为包即使所有格式正确的话没有这个文件夹也会识别失败。
②除了entities文件夹外有一个叫做TutorialStepOneScripts的文件夹它用来放所有MOD脚本的文件。其中一个行为包可以放置多个脚本文件夹但必须以xxxScripts为结束。
③在文件夹内新建一个modMain.py文件它被视为模组的入口文件。目前无法由开发者决定入口文件的名称因此这属于必须遵循的规范。并且在文件夹内还需要新建一个__init__.py的文件这是为了让这个文件夹变成一个可以被脚本引擎导入的模块。如果有按照之前推荐的python线上教程跟着学的话会在学到一定程度后理解这一点如果还没学到就仅记这一点在模组文件夹和它的子文件夹内都需要新建这么一个__init__.py文件。
④使用任何一种文本编辑器或者IDE打开文件可以看到里面的代码内容它们此时的功能只会在游戏加载时输出日志到控制台上额外的介绍会在下一个部分。
⑤将TutorialModBeh这个文件夹用zip进行压缩导入进MCSTUDIO看看吧
#### 脚本结构
①紧接着在TutorialBeh文件夹内看第二个脚本文件夹即TutorialStepTwoScripts。
②与TutorialStepTwoScripts文件夹不同的是在这里我们正式加入了两个自己的文件一个是用来作为服务端系统的ServerSys.py另一个是用来作为客户端系统的ClientSys.py。前者代码逻辑只会运行在服务端后者的代码逻辑只会运行在客户端。也请开发者不要在客户端导入服务端的接口反之亦然这会造成模组运行不正常的风险。
③ServerSys可由开发者自创一个新类在没有学习到面向对象的环节时可以简单理解为自创一个系统入口这个入口是个类。它需要继承官方系统类才能使用MODSDK的接口监听游戏内的事件。ClientSys亦然。我们将打印信息搬到两个系统类里在之后打开游戏时正常运行下会在控制台打印这两个信息。
④回到modMain.py内我们在上方通过MODSDK提供的代码提示包导入了两个新模块。将服务端模块命名为ServerApi将客户端模块命名为ClientApi并在服务端的入口函数内注册了xxxSys.py内的系统类。我们MOD的工作逻辑也将会在那里进行。
#### 命名建议
为了方便开发者们统一书写规范,避免不必要的冲突风险。开花组建议采用团队名称[Scripts]例如SDKTeamTestScripts来规范每个脚本目录文件夹的名称。
#### 如何调试
Mod代码目前不支持断点调试因此只能通过在不同的地方打Log来调试代码。打Log可以使用 print 也可以使用 logging模块后面阅读AwesomeMod时会看到。Log会显示在”脚本测试日志“窗口中脚本的Log最好加上特殊的前缀方便查找。
推荐使用mod_log模块打印日志。
目前Mod代码支持热更新调试在运行游戏进行开发测试时增加删除修改相关本地Python文件后回到Studio或者编辑器界面Studio会自动热更新修改的内容并在”脚本测试日志“窗口中提示“正在重新加载相关的Python模块”。
#### 开始行动吧
首先阅读系统简介事件简介组件简介然后从modMain.py入手阅读TutorialMod的代码与注释。
完全理解后在服务端事件以及服务端组件中找几个自己感兴趣的尝试添加到mod里看能不能生效吧
掌握了事件与组件的用法后,可以从官方示例里寻找自己感兴趣的示例模组进行练习,或者继续研习开发者教程。
熟悉了modsdk的用法后可以继续阅读这个网站的“高级特性”“面向对象编程”“常用内建模块”有助于使用python编写出更复杂的玩法逻辑。
遇到自身没法解决的问题时及时和官方沟通反馈可通过MC Studio内嵌开发者论坛或网页或者在论坛内尝试寻求他人的帮助。

View File

@@ -0,0 +1,23 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/2_1.b074023e.jpg
hard: 进阶
time: 15分钟
---
# MOD第一步监听事件
#### 作者:境界
①在示例目录下新建TutorialStepThree目录根据StepTwo的写法进行模仿。
![](./images/2_1.jpg)
②在_ init _函数下将脚本引擎的命名空间和系统名称赋值给两个变量使用ListenForEvent监听玩家聊天事件并指定回调函数。回调函数的作用是每当玩家打出聊天内容时这个回调函数就会被调用里面的相关代码就会执行。根据文档的信息可得知它最后会回传一个包含6个参数的字典。因此在定义回调函数的时候除了保证第一个参数为对象本身之外还需要再额外增加一个参数为了方便理解我们将第二个参数命名为event。之后在函数体下我们打印一下这个event并在游戏内看到最终的效果。

View File

@@ -0,0 +1,25 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/3_1.795ccf68.jpg
hard: 进阶
time: 15分钟
---
# MOD第二步创建组件
#### 作者:境界
①创建组件前,先来确认一下要实现的功能。由于我们执行的环境是在玩家聊天时,因此可以假定一个目标,我们希望通过取得玩家聊天输入的信息变成玩家名称的前缀。
![](./images/3_1.jpg)
②通过获得字典内数据的语法将玩家ID和聊天内容赋值给两个变量“player_id”和“message”。其中“player_id”为玩家在世界的唯一ID也可以理解为是一种身份标识。通常在创建组件的时候我们要通过MODSDK的接口让某个玩家执行某种操作就需要在创建组件时传入玩家ID。
③根据存档可知服务端上有个设置玩家前缀名称和后缀名称的接口。我们通过创建这个接口根据代码提示需要传入四个参数即前缀、前缀字颜色、后缀、后缀字颜色。将“message”传入第一个参数位置其它三个位置留''空字符串”。
④最后将接口执行后回传的执行结果传给“result”变量并将结果打印在控制台上在游戏内看到最终的效果。由于主机玩家不会看到自己的名称开发者可以通过双开客户端的方式来用房客的视角看噢

View File

@@ -0,0 +1,30 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/4_1.ca250d44.jpg
hard: 进阶
time: 20分钟
---
# MOD第三步服务端与客户端通信
#### 作者:境界
①由于服务端和客户端属于两个不同的容器,对应支持的接口也各有不同。常有开发者问如何在服务端上使用客户端的方法,或者客户端上使用服务端的方法,但这实际上是行不通的,因为两个容器都各自有自己的轨道,为了让轨道之间可以产生合作,这就需要用到通信了。
②通信即是让服务端或者客户端将需要对方需要用到的数据以Python的基本数据类型进行包装服务端通过NotifyToClient、BroadcastToAllClient客户端通过NotifyToServer来传递。其中BroadcastToAllClient是广播到所有玩家客户端上NotifyToClient是发送给一名指定的客户端玩家NotifyToServer是发送到服务端上。
![](./images/4_1.jpg)
③还记得在监听事件的时候需要在第一个参数和第二个参数传入命名空间和系统名吗并且注册系统的时候我们就已经为客户端系统和服务端系统命名了因此在一端上接收另一端的自定义事件就是用modMain.py内注册系统时写下的命名。
![](./images/4_2.jpg)
④在示例中,我们在聊天事件内新增代码,使用条件语句判断聊天信息,传到客户端后让玩家改变自己的人称视角。

View File

@@ -0,0 +1,24 @@
---
front:
hard: 进阶
time: 10分钟
---
# MOD第四步UI与服务端/客户端通信
#### 作者:境界
#### 什么是UI
UI是玩家与游戏交互的界面。比如在世界中有许多方块带有特殊的功能使用这些方块时游戏会弹出UI交互界面来引导玩家进行下一步动作。使用MCSTUDIO的界面编辑器可以快速进行界面制作。界面的样式文件最后也会用json的文件格式保存在附加包的资源包中。
#### 与客户端/服务端通信
UI自身也运行在客户端上因此一般情况下在UI文件内都可以使用客户端的接口。若需要调用客户端系统的方法可以使用ClientApi.GetSystem接口来获得客户端系统同时它会携带NotifyToServer接口因此也可以直接将UI的数据传送到服务端上。

View File

@@ -0,0 +1,26 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/6_1.3bed48ba.jpg
hard: 进阶
time: 20分钟
---
# 简易教程①:击退棒
#### 作者:境界
击退棒示例包下载:[下载示例包](https://g79.gdl.netease.com/guidedemo-case10.zip)。
①在看到一些竞技性的MC小游戏玩法或者一些整蛊搞笑的模组时我们常常能看到一种赋予了木棒超高击退效果的玩法。我们现在就来复刻一下吧
②根据文档可知脚本引擎存在一个玩家攻击实体事件。首先我们监听一下这个事件并获取被伤害的实体ID。判断玩家手持物品是否是木棒是则执行接下来的逻辑。
![](./images/6_1.jpg)
③我们获得玩家的头部转向将头部转向转化成方向向量。最后创建一个Action组件给予受害者实体一个瞬时的击退效果。进入游戏并查看效果吧

View File

@@ -0,0 +1,28 @@
---
front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/7_1.2616ac65.jpg
hard: 进阶
time: 15分钟
---
# 简易教程②:传送点
#### 作者:境界
传送点示例包下载:下载[示例包](https://g79.gdl.netease.com/guidedemo-case10.zip)。
①我的世界地图面积辽阔,通过模组为玩家提供传送点的功能,可以方便玩家在地图内快速移动。
![](./images/7_1.jpg)
②下载示例包在MCStudio中导入进游戏通过聊天窗口输入“传送点设置”即可把当前坐标设置为传送点通过聊天窗口输入“传送点传送”无论走的多远都可以把自己传送回来。
③由于目前中国版尚未支持自定义指令,我们通过监听玩家聊天的信息,来模拟指令效果,并执行玩家标记传送点、管理传送点、传送至传送点的逻辑。在简易教程里,我们只为玩家提供一个传送点,只在一次游戏房间内有效,离开房间后就会消失,并在匹配聊天内容成功后将玩家传送过去。