Files
2025-08-25 18:36:29 +08:00

8.7 KiB
Raw Permalink Blame History

front, hard, time
front hard time
进阶 20分钟

认识MODSDK

作者:境界

什么是Mod

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

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

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

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

Mod是如何工作的

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

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

开发环境搭建

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

Python安装需要进入Python官网下载选择Python2的版本【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的下面这些页面跟着上面的示例代码来了解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内嵌开发者论坛或网页或者在论坛内尝试寻求他人的帮助。