2.6
This commit is contained in:
0
docs/mconline/10-addon教程/第10章:你的第一个MOD/README.md
Normal file
0
docs/mconline/10-addon教程/第10章:你的第一个MOD/README.md
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/2_1.jpg
LFS
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/2_1.jpg
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/3_1.jpg
LFS
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/3_1.jpg
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/4_1.jpg
LFS
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/4_1.jpg
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/4_2.jpg
LFS
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/4_2.jpg
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/6_1.jpg
LFS
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/6_1.jpg
LFS
Normal file
Binary file not shown.
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/7_1.jpg
LFS
Normal file
BIN
docs/mconline/10-addon教程/第10章:你的第一个MOD/images/7_1.jpg
LFS
Normal file
Binary file not shown.
132
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程01.认识MODSDK.md
Normal file
132
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程01.认识MODSDK.md
Normal 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
|
||||
|
||||
函数
|
||||
|
||||
调用函数
|
||||
|
||||
定义函数
|
||||
|
||||
函数的参数
|
||||
|
||||
模块
|
||||
|
||||
使用模块
|
||||
|
||||
面向对象编程
|
||||
|
||||
类和示例
|
||||
|
||||
|
||||
|
||||
#### 为自定义模组添加脚本
|
||||
|
||||
①打开教程附录的示例文件夹,可以看到文件夹内仅包含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内嵌开发者论坛或网页),或者在论坛内尝试寻求他人的帮助。
|
||||
23
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程02.MOD第一步:监听事件.md
Normal file
23
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程02.MOD第一步:监听事件.md
Normal 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的写法进行模仿。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
②在_ init _函数下,将脚本引擎的命名空间和系统名称赋值给两个变量,使用ListenForEvent监听玩家聊天事件,并指定回调函数。回调函数的作用是,每当玩家打出聊天内容时,这个回调函数就会被调用,里面的相关代码就会执行。根据文档的信息可得知,它最后会回传一个包含6个参数的字典。因此在定义回调函数的时候,除了保证第一个参数为对象本身之外,还需要再额外增加一个参数,为了方便理解,我们将第二个参数命名为event。之后在函数体下,我们打印一下这个event,并在游戏内看到最终的效果。
|
||||
|
||||
25
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程03.MOD第二步:创建组件.md
Normal file
25
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程03.MOD第二步:创建组件.md
Normal 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第二步:创建组件
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
|
||||
|
||||
①创建组件前,先来确认一下要实现的功能。由于我们执行的环境是在玩家聊天时,因此可以假定一个目标,我们希望通过取得玩家聊天输入的信息变成玩家名称的前缀。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
②通过获得字典内数据的语法,将玩家ID和聊天内容赋值给两个变量:“player_id”和“message”。其中“player_id”为玩家在世界的唯一ID,也可以理解为是一种身份标识。通常在创建组件的时候,我们要通过MODSDK的接口让某个玩家执行某种操作,就需要在创建组件时传入玩家ID。
|
||||
|
||||
③根据存档可知,服务端上有个设置玩家前缀名称和后缀名称的接口。我们通过创建这个接口,根据代码提示需要传入四个参数,即前缀、前缀字颜色、后缀、后缀字颜色。将“message”传入第一个参数位置,其它三个位置留''空字符串”。
|
||||
|
||||
④最后,将接口执行后回传的执行结果传给“result”变量,并将结果打印在控制台上,在游戏内看到最终的效果。由于主机玩家不会看到自己的名称,开发者可以通过双开客户端的方式来用房客的视角看噢!
|
||||
@@ -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是发送到服务端上。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
③还记得在监听事件的时候需要在第一个参数和第二个参数传入命名空间和系统名吗?并且注册系统的时候,我们就已经为客户端系统和服务端系统命名了,因此在一端上接收另一端的自定义事件,就是用modMain.py内注册系统时写下的命名。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
④在示例中,我们在聊天事件内新增代码,使用条件语句判断聊天信息,传到客户端后让玩家改变自己的人称视角。
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
front:
|
||||
hard: 进阶
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
# MOD第四步:UI与服务端/客户端通信
|
||||
|
||||
|
||||
|
||||
#### 作者:境界
|
||||
|
||||
|
||||
|
||||
#### 什么是UI
|
||||
|
||||
UI是玩家与游戏交互的界面。比如在世界中有许多方块带有特殊的功能,使用这些方块时,游戏会弹出UI交互界面,来引导玩家进行下一步动作。使用MCSTUDIO的界面编辑器可以快速进行界面制作。界面的样式文件最后也会用json的文件格式保存在附加包的资源包中。
|
||||
|
||||
|
||||
|
||||
#### 与客户端/服务端通信
|
||||
|
||||
UI自身也运行在客户端上,因此一般情况下,在UI文件内都可以使用客户端的接口。若需要调用客户端系统的方法,可以使用ClientApi.GetSystem接口来获得客户端系统,同时它会携带NotifyToServer接口,因此也可以直接将UI的数据传送到服务端上。
|
||||
|
||||
26
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程06.简易教程①:击退棒.md
Normal file
26
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程06.简易教程①:击退棒.md
Normal 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。判断玩家手持物品是否是木棒,是则执行接下来的逻辑。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
③我们获得玩家的头部转向,将头部转向转化成方向向量。最后,创建一个Action组件,给予受害者实体一个瞬时的击退效果。进入游戏并查看效果吧!
|
||||
|
||||
28
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程07.简易教程②:传送点.md
Normal file
28
docs/mconline/10-addon教程/第10章:你的第一个MOD/课程07.简易教程②:传送点.md
Normal 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)。
|
||||
|
||||
①我的世界地图面积辽阔,通过模组为玩家提供传送点的功能,可以方便玩家在地图内快速移动。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
②下载示例包在MCStudio中导入进游戏,通过聊天窗口输入“传送点设置”,即可把当前坐标设置为传送点,通过聊天窗口输入“传送点传送”,无论走的多远都可以把自己传送回来。
|
||||
|
||||
|
||||
|
||||
③由于目前中国版尚未支持自定义指令,我们通过监听玩家聊天的信息,来模拟指令效果,并执行玩家标记传送点、管理传送点、传送至传送点的逻辑。在简易教程里,我们只为玩家提供一个传送点,只在一次游戏房间内有效,离开房间后就会消失,并在匹配聊天内容成功后将玩家传送过去。
|
||||
|
||||
Reference in New Issue
Block a user