# 认识MODSDK

# 作者:境界

# 什么是Mod

原生的AddOn方式可以改变很多原版游戏内容,以及添加自定义的游戏内容,但一般无法实现一些较复杂的逻辑,比如右键自定义方块时,会给予物品。这就需要使用脚本来实现了。

在我的世界中国版中,我们使用python来编写mod脚本。

开花组用MODSDK封装了很多的游戏事件与组件,游戏事件是指游戏内触发了某个操作或达到某一种条件(例如玩家右键了自定义方块),可以通知到我们的代码,进而实现我们的逻辑。组件是我们封装好的游戏引擎接口,可以用来设置或获取某些数据(例如操作玩家背包、放置方块),或者执行一些特殊的功能。

脚本开发就是一个监听事件与调用组件的过程,配合自己的逻辑来实现很酷的玩法。想要了解当下最新的事件和接口文档,请翻阅官方文档网址

# Mod是如何工作的

MOD加载时与附加包类似,存在着服务端运行和客户端单独运行的内容,因此在MOD文档中也清晰地分离了服务端和客户端各自的事件和接口。我们常见的,如玩家的血量、饥饿、饱和度等信息,以及世界上分布的生物,它们所在的坐标、行为、属性等,都属于公共资源的范畴,即它们会放在服务端上运行,每当玩家需要使用到这些数据时,再由客户端向服务端请求后获得这些数据。因此,生成一个实体生物的接口会在服务端上使用,因为它是公共资源,它是同步的。而生成一种特效的接口则在客户端上使用,因为就像原版粒子资源放在资源包,即客户端上运行的道理类似,某些粒子只有在一名玩家达到某个条件时才会显示,亦或是这样的资源在不同的玩家面前都有不同的表现。

因此常有玩家会说,联机房间开启时,某些#模组的表现不再像单人游玩时那么稳定。其中一个原因便是房主会同时承担客户端和服务端的计算压力,又会不断接受其他房间内玩家请求数据的压力。这与单人游玩需要的数据传输量有着天壤之别,并且服务端和客户端传输时需要网络通信,当房主的网络环境与其他联机成员的环境相差较大时,也容易造成成员卡顿而体验不佳。因此,优化的任务永远是摆在所有开发者面前最重要的大关。能够优化的越好,触达的玩家自然也越多,模组的受众也会越来越多!

# 开发环境搭建

开发环境搭建主要分为两个,一个是Python的安装,一个是工具的安装。前者可以理解为MOD工作需要一个编程语言环境,就像我的世界PC JAVA版在运行前一定要安装JAVA语言环境一样。后者可以理解为生产环境的搭建,即需要一系列配套的工具进行MOD的编程作业。

Python安装需要进入Python官网下载,选择Python2的版本【https://www.python.org/downloads/ (opens new window)】。同时根据自己电脑是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 (opens new window)的下面这些页面,跟着上面的示例代码来了解python:

第一个Python程序

使用文本编辑器

Python基础

数据类型和变量

条件判断和循环

使用dict

函数

调用函数

定义函数

函数的参数

模块

使用模块

面向对象编程

类和示例

# 为自定义模组添加脚本

①打开教程附录的示例文件夹,可以看到文件夹内仅包含Beh(Behavior)行为包的内容。在中国版我的世界中,必须注意:在行为包内添加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内嵌开发者论坛或网页),或者在论坛内尝试寻求他人的帮助。