Files
netease-modsdk-wiki/docs/wiki/1-Mod脚本开发/1-快速入门Mod开发.md
2025-03-19 00:32:40 +08:00

7.0 KiB
Raw Blame History

🚀 快速入门我的世界 Mod 开发

::: warning ⚠️ 接下来需要 Python2 基础知识 如果你不熟悉 Python 的这些概念(变量、函数、类等),或是还没有安装 Python2 环境,可以先学习 Python 官方教程 :::

1. 创建你的 Addons

::: details 什么是 Addons Addons 是基岩版的玩法与内容扩展的载体分为行为包Behavior Pack和资源包Resource Pack两部分。

在中国版的行为包中,我们可以使用 Python2 编写 Mod 脚本,实现自定义的复杂游戏逻辑。 :::

我们一般推荐使用 MCStudio 来创建你的 AddonsMod

  • 左侧切换到 作品库 > 基岩版组件 标签页
  • 顶部切换到 附加包 标签页
  • 点击右上角 新建 按钮,选择 空白附加包入门预设脚本模板
  • 输入 作品名称、命名空间 等信息,点击 启动编辑 启动 MCStudio 编辑器(但是暂时没什么用),也可以点击 仅新建 来创建。

2. 创建基础 Mod 框架

AddonsMod创建完毕后你可以在 MC Studio 中,找到你刚刚创建的 Addons点击 更多 > 打开目录,即可在资源管理器中找到和打开 Addons 文件夹。

接着,你可以使用任何代码编辑器打开这个 Addons 文件夹。

可以使用 VS Code也可以使用 PyCharm 等用于 Python 的 IDE集成开发环境 的缩写)。

::: code-group

Addons                     # Addons 根目录
├── resource_pack/         # 基岩版材质包MCStudio创建时会自动生成后缀这是没问题的
│   ├── manifest.json      # 材质包描述文件
│   └── textures/          # 材质文件目录(目前用不到)
│       ├── blocks/
│       └── items/
├── behavior_pack/         # 基岩版行为包MCStudio创建时会自动生成后缀这是没问题的
│   ├── manifest.json      # 行为包描述文件
│   ├── myScript/          # Mod脚本目录这个目录名字随便起
│   │   ├── modMain.py
│   │   ├── MyServerSystem.py  # ServerSystem你也可以随意放在任何子目录但是需要在modMain.py中正确注册
│   │   └── MyClientSystem.py  # ClientSystem你也可以随意放在任何子目录但是需要在modMain.py中正确注册

:::

ModPython逻辑位于 行为包 (Behavior Pack简称BP) 中的 脚本目录,这里我们取名为 myScript,当然你想你可以随便取名。

::: code-group

from mod.common.mod import Mod
import mod.server.extraServerApi as serverApi
import mod.client.extraClientApi as clientApi

# 通过Mod.Binding注明这个class是Mod的主入口。
@Mod.Binding(name="MyFirstMod", version="1.0")  # Mod名称(name)可以随便取,但是需要唯一且用于下方注册系统和后续注册事件监听。
class MyFirstMod:  # 这个类名可以随便取
    @Mod.InitServer()
    def serverInit(self):  # 这个方法名可以随便取,因为已经通过@Mod.InitServer()注明是服务端的初始化方法
        serverApi.RegisterSystem("MyFirstMod", "MyServerSystem", "myScript.MyServerSystem.MyServerSystem")
        print("MyFirstMod 服务端已加载!")  # print打印的内容将输出在MCStudio的 日志与调试工具 中

    @Mod.InitClient()
    def clientInit(self):  # 这个方法名可以随便取,因为已经通过@Mod.InitClient()注明是客户端的初始化方法
        clientApi.RegisterSystem("MyFirstMod", "MyClientSystem", "myScript.MyClientSystem.MyClientSystem")
        print("MyFirstMod 客户端已加载!")  # print打印的内容将输出在MCStudio的 日志与调试工具 中

:::

::: code-group

from server.extraServerApi import serverApi

ServerSystem = serverApi.GetServerSystemCls()

# 继承 ServerSystem 类,表示这是一个 服务端System
class MyServerSystem(ServerSystem):

    def __init__(self):
        super(MyServerSystem, self).__init__()
        print("MyServerSystem Hello World!")  # print打印的内容将输出在MCStudio的 日志与调试工具 中

:::

::: code-group

# 本教程中,我们还暂时用不到 ClientSystem但是我们可以先创建好
from client.extraClientApi import clientApi

ClientSystem = clientApi.GetClientSystemCls()

# 继承 ClientSystem 类,表示这是一个 客户端System
class MyClientSystem(ClientSystem):

    def __init__(self):
        super(MyClientSystem, self).__init__()
        print("MyClientSystem Hello World!")

:::

BOOM就这么简单

::: tip 💡 为什么需要这些System 不太理解为什么需要这些System来阅读进一步的解释吧为什么是System :::

3. 运行你的Mod

  • 保存你的代码
  • 在 MCStudio 中找到此 Addons鼠标划上去后点击 开发测试 按钮
  • 选择一个合适的游戏版本(一般为最新)
  • 填写相关测试名称和测试地图的配置,点击 开始 按钮
  • 等待游戏启动,你会在 脚本与测试工具 看到 MyFirstMod 服务端已加载!MyFirstMod 客户端已加载! 的输出

::: details 🤔 常见问题

  • 如果你没有看到期望的输出,可以在 脚本与测试工具 中查看日志,看看有没有报错
  • 如果没有任何报错,你需要检查你的 脚本目录 及以下的各级目录中,是否有__init__.py文件,如果没有,可以手动创建一个空文件
  • 再次检查后,可以尝试重启游戏(右侧 测试存档记录 :::

4. 实现简单功能

🧪 小功能:右键方块,获得钻石

::: code-group

from server.extraServerApi import serverApi

ServerSystem = serverApi.GetServerSystemCls()

# 继承 ServerSystem 类,表示这是一个 服务端System
class MyServerSystem(ServerSystem):
    def __init__(self):
        super(MyServerSystem, self).__init__()
        # 监听玩家使用方块事件 
        self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "ServerBlockUseEvent", self, self.onBlockUse)

    def onBlockUse(self, args):
        # 从事件的参数中获得玩家ID
        playerId = args["playerId"]
        # 生成获取一个引擎的ItemComponent
        itemComp = serverApi.GetEngineCompFactory().CreateItem(playerId)
        # 向玩家背包中放入一个钻石
        itemComp.SpawnItemToPlayerInv({
            "itemName": "minecraft:diamond",
            "count": 1
        })

:::

::: tip 🔌 使用到的相关API

太棒了!赶快进入游戏,右键点击任意方块,你将获得一个钻石!