跳到主要内容

0 脚本系统概论

欢迎你来到模块 3:脚本系统的学习!在模块 1 中,我们已经学习过了命令;而模块 2,我们又学习了附加包的相关知识。从这一节开始,我们将系统学习 Minecraft 的脚本系统(Scripts),前面所学习过的东西,都会成为我们学习脚本的基础。

在学习脚本之前,我们必须先搞清楚几个问题:

什么是脚本系统?

脚本系统是 Minecraft 所内置的一种功能,你可以通过在计算机领域常用的两种编程语言——JavaScript 和 Python,结合官方所给出的 API 实现各种复杂功能。

为什么我们需要脚本?命令和数据驱动还不够吗?

答案是——确实不够。如果读者使用命令和数据驱动开发,就会发现这两个系统各自有各自的局限性。

  • 脚本仍处于快速发展阶段,而命令已几乎停更。读者可以回忆一下,自 1.19.50 以来应该没有加过什么重要命令,或对重要命令做出很多修改吧?从 1.19.50 以来的更新日志便不难看出,微软现如今开发的侧重点,就在脚本上!每次的更新,脚本都能占到 1/3 甚至 1/2 的篇幅!这就直接导致了脚本开放的接口远远多于命令。脚本内置各种各样的事件,比如实体受伤时、恢复生命时、使用物品时、和方块交互时这些游戏关键节点,很多都会触发游戏回传的事件,我们就可以在这些事件中执行各种各样的复杂逻辑。不仅如此,我们还可以通过调用游戏内各种类的接口实现很多纯命令阶段所意想不到的功能,比如给予玩家一个同时带自定义名称、lore、附魔和物品锁定的物品 —— 不用说命令了,就算结合/loot和战利品表也无法实现。
  • 脚本基于计算机领域主流的编程语言编写,灵活度远远高于命令和数据驱动。那可是 JavaScript 和 Python 啊!内置了各种各样的数据处理方法和各种编程语言的功能的正经编程语言!包括面向对象编程、函数、类、数据处理等十分灵活而强大的方法。如果读者系统性地学习过一门编程语言(比如 C 语言),应该十分清楚命令的写法是高度受限的。至于数据驱动,虽然也处于快速更新状态,然而因为不能自定义逻辑,这导致在面对更复杂的逻辑的时候,仍然会感到力不从心。
  • 脚本的效率也要高于命令。事实上命令的执行效率是很低的,在进行复杂逻辑处理的时候,命令的处理速度往往要比给定了成熟接口的脚本慢得多(因为基岩版对命令的优化并不好,某些相似功能执行的时候二者甚至可能相差几十毫秒!),这导致命令往往托不起过大的逻辑需求。
  • 脚本还能够完全平替命令系统!是的,脚本可以直接执行命令!

然而,纵使脚本相比命令有如此多的优势,在实际应用时仍然应该按需应用。

学习脚本需要面临哪些问题?

凡事都有两面性。吹完之后自然该说说我们即将面临的问题了:

  • 学习门槛高。相比于命令系统游戏内即可见效,脚本系统的一大问题在于学习门槛非常高 —— 因为我们即将面对的是两门非常成熟的编程语言 JavaScript 和 Python,那么它们的语法问题就是我们不得不关注的重要问题。可以说,对这两门编程语言的了解程度将很大程度上影响我们的代码质量和功能实现。
  • API 高度复杂。首先,我们必须明确,国际版的脚本和中国版并不互通。国际版使用的是基于 JavaScript(ES 6) 的 ScriptAPI,而中国版使用的是基于 Python 2 的 ModAPI。对于同时兼顾国际版和中国版的开发者来说,就必须学习两套脚本。而这两套脚本的基本运行逻辑又非常不一样。如果读者见过微软和网易分别给出的文档就会发现,从它们给出的文档很难找到学习的切入点。如果读者只学习国际版或中国版,那么只学习一套脚本便足矣。

本模块,你将学习到……

综上,我们即将面对的是一个非常灵活的功能,用它可以帮助我们实现各种高度复杂的逻辑。我们将会学习到:

  • JavaScript 和 Python 的基础语法
  • 如何在各种各样的事件触发时执行代码?
  • 如何通过各种各样的脚本接口实现功能?
  • 如何自定义数据驱动物品、方块的组件?
  • 如何自定义命令(是的,你可以通过脚本自定义命令!)?
  • 等等……