Skip to content

此为我项目 mbler 的子仓库,请了解mbler用法再来文档 mcx可见仓库Github 项目仓库
mcx介绍可见Mcx文档

先简单概括 mcx

mcx可以让你的mcbe行为包不需要复杂的物品、配方等的JSON,还能让你的事件注册不需要繁琐的操作原生和背方法名。
先看示例
mbler.config.json 里面的 script.main 设为 index.js (可选),然后在bp的ascripts文件夹里面 index.js

javascript
import App from "./app.mcx";
import * as Server from "@minecraft/server";
import * as ScriptUi from "@minecraft/server-ui";
import { createApp } from "@mbler/mcx";
createApp(App).mout(SErver, ScriptUi);

app.mcx

<script>
  import Event from "./event.mcx";
  import Component from "./component.mcx";
  // 由于是要编译成静态json的,是个宏,所以不能重复调用
  Component.use();
  // 整个事件里面的事件全部注册,也可以用unsubscibe全部取消,也可以传入对应事件名称操作指定事件
  Event.subscibe();

event.mcx

<Event @after>
  PlayerJoin=eventHandler
</Event>
<script>
  exports.PlayerJoin = function(event) {
    event.player.sendMessage("欢迎进入游戏")
  }
</script>

component.mcx

<Component>
  <items> <!--注册物品-->
    <item id=test>subscribe</item>
  </items>
</Component>
<script>
  import {
    ItemComponent
  } from "@mbler/mcx"
  export.subscribe = new ItemComponent({
    id: "mbler_test:test",
    opt: {
      stacked_by_data: true,
      max_stack_size: true,
      display_name: "测试物品",
      allow_off_hand: true,
      hand_equipped: true,
      foil: true,
      glint: true
    }
  })
</script>

这是一个示例mcx项目,当然还未实现mcx,欢迎代码贡献(mcx在mbler源码目录 lib/mcx

所以...我们该如何写mcx?

首先,因为要用到ast,ast的各种结构手记很麻烦,于是,我选用 typescript 来编写解析器
然后,流程大概就如下

  • 获取入口文件源码
  • 使用babel生成入口文件的ast
  • 遍历ast
  • 静态导入 : 删除节点,把import的源和导入项信息提取到 this.buildCache.import ,export也一样,提取到 this.buildCache.export
  • 将总的ast提取到一个function,然后用babel node的格式在这个ast的开头添加类似 const xxx = ___Module.import(modulePath, __Module.dirname),因为要实现合并,这里大部分直接操作ast生成,内置Module类由template文件夹存储
  • 导出就提取到末尾,例如 __Module.export = ...,后续Module提取导出项
  • Module类的init方法由ast修改,插入类似 this.modules[modulePath / name] = this.HandlerModule(function(__Module){...模块实现})的结构