Minecraft 设计思想
卷二 · 游戏设计系统如何互相咬合

命令、数据包与地图

命令方块把运营者变成关卡设计师,数据包是官方承认的数据驱动模组。四种地图类型寄生于同一套物理,而数据驱动的极限,就是模组的起点。

本章命题:官方通过命令方块与数据包承认了「玩家是作者」,却只交出数据、不交出系统;原版与模组的边界之所以被故意模糊,是因为模糊比任何一种清晰都对官方有利。

1问题

多数玩家第一次意识到这层东西的存在,是在某个服务器的出生大厅。大厅装修得光鲜亮丽,走两步触发一段欢迎文字,头顶飘出称号,柜台点一下就完成一笔交易。这些行为在生存模式的规则书里一条都找不到。掀开地板——当然,你掀不开,你只是知道下面有——是一整层嵌在墙里的深色方块。

那叫命令方块:可以理解为「埋进世界里的自动售货机」,满足条件就执行一条指令。指令是游戏自带的控制语句,普通玩家平时接触不到,运营者靠它在后台封人、发奖、调整天气。命令方块做的事,是把这些后台权力变成世界里的物件:埋进地下,接上红石(游戏内的信号系统,见《红石:把物理做成编程》一章),等玩家踩中机关。

另一个场合:你下载一张传遍社区的冒险地图,解压出来是一个存档,里面多出一个装配置文件的文件夹——数据包。游戏加载世界时顺带加载它,不用安装任何第三方程序。

这两类东西的身份很尴尬:它们不是官方设计的内容,官方没设计过这个关卡;也不是模组,它们不改动游戏程序。玩家给它们起了个含糊的名字,叫「原版能跑的东西」。这条含糊的边界不是自然形成的。官方为什么故意不让「原版」和「模组」泾渭分明,地图作者又为什么能把一款采矿游戏改造成解谜、竞技、角色扮演的舞台——是本章要回答的问题。

2原版能做 RPG 吗

先给出一半答案:皮能做,骨很难。

角色扮演游戏需要的东西——数值、对话、任务、商店、头目战——原版工具箱里都有粗糙的对应物。核心是两件:计分板和 NBT。

计分板在 Java 版 1.5 加入1,作用是给每个玩家、每个生物挂一块记分牌:一个名字,一个整数。数字可以随游戏事件自动增减——谁死了、谁捡了什么、谁完成了什么——也可以做四则运算。血量、金钱、等级、任务进度,角色扮演需要的数值,都可以落在某块记分牌上。社区甚至用它造过能算算术的计算器:一块记分牌当显示器,一串指令当运算器。

NBT 是另一件。它是物品和生物身上携带的一捆「行李数据」:一把剑除了是铁剑,还可以带上定制的名字、说明、附魔和耐久。地图作者用行李数据伪造装备品级——这把「锈剑」和那把「圣剑」,在引擎眼里是同一种铁剑,差别全在行李里。

把这两件东西加上指令触发的事件,角色扮演的表层就齐了:村民交易当商店,起了名字的僵尸当头目,聊天栏刷出的彩色文字当对话,记分牌降到零当场倒地。原版角色扮演地图真实存在,数量庞大,精品不少。

但每一项都是假装。血量不是属性,是记分牌;对话不是界面,是聊天栏里的一行行字;头目战不是机制,是一堆「玩家做了某事就执行某指令」的条件反射。单人、慢节奏、作者盯得紧的时候,戏法天衣无缝;玩家一多、节奏一快,毛边就露出来——道具栏一乱,两块记分牌对不上账,扮演当场穿帮。

所以答案是:原版能做角色扮演的样子,做不成角色扮演的系统。这个「样子」和「系统」之间的差,就是后面几节反复出现的裂缝。

3命令方块:运营者变成关卡设计师

命令方块随 2012 年 10 月的 Java 版 1.4.2 发布。Jeb 公布它时给的说法是:这是一个用来扩展冒险模式的新方块2。冒险模式是同年早些时候加入的玩法:玩家不能随手破坏和放置方块,世界从矿场变成布景3。两件事凑在一起,指向很明确——这组功能是为地图作者准备的。

值得追问的是形态:为什么做成一个方块,而不是做一个地图编辑器?至少有三个设计理由。

第一,Minecraft 的素材语言就是方块。把脚本做成方块,它自动继承方块的一切既有语法:可以放置,可以复制,可以被红石信号触发,可以随结构整体打包搬运。不需要新工具,不需要离开游戏,会玩 Minecraft 就会埋命令方块。

第二,作品和存档变成同一样东西。编辑器做出的关卡是工程文件,要经过导出、发布、再被引擎加载;方块做出的关卡就是世界本身,把存档拷走,作品就带走了。Minecraft 的创作发布从来没有「导出」这个动作,命令方块是这条路线的自然延伸。

第三,也是最重要的一点:角色变了。在此之前,指令是运营者的工具,用来管理玩家——封禁捣乱者,调整服务器时间。命令方块让同一套指令变成关卡设计师的道具:运营者的权力从「管玩家」变成「设计玩家会遇到什么」。一条指令可以是给闯入者发一把剑,也可以是清空他脚下的地板。服务器大厅那些「看不见的魔法」,本质上就是运营者转型成作者之后的作品。

代价也要写清。命令方块写复杂逻辑非常痛苦:单个方块只装一条指令,逻辑靠几百个方块首尾相接,嵌套深了,连作者自己都读不懂。2017 年,游戏加入了函数——把一串指令写进普通文本文件,一次调用,整批执行4。名义上这是给命令方块减负,方向上却是把脚本从世界里搬回了文件里:埋在地下的权力,开始向磁盘上的文件迁移。

细节对照:命令方块里的单条指令有长度上限,函数文件里的指令可以更长。把脚本从方块搬进文件,顺带解放了字数。

4数据包:官方温和模组

2018 年 7 月,Java 版 1.13 把上一节的方向变成制度:数据包正式加入游戏,先行于快照 17w43a,初始格式版本为 45。数据包是放进存档目录的一组文件夹,里面可以是函数、战利品表——控制生物死掉掉什么、箱子开出什么——也可以是配方、进度、自定义的世界生成规则。游戏加载世界时顺带加载它;删掉文件夹,一切复原。它的加载与执行模型,在《数据包、资源包与数据驱动》里有完整拆解。

补一句版本差异:命令方块与数据包这条线是 Java 版生态的骨干;基岩版的对应物是行为包加脚本 API,同样官方、同样受限,细节见《Bedrock 作为另一次实现》,本章点到为止。

为什么说数据包是「温和模组」?拿模组生态做对照就清楚了。模组要改动游戏程序,依赖第三方加载器,游戏每次更新都可能集体失效;数据包不改程序,用的是官方格式,出了问题删掉文件夹就能救。温和的代价也写在名字里:它只有数据。它能让已有的方块和生物排出无限组合,却造不出行为上全新的东西。函数看上去像编程——纯文本,一行一条,可以挂在每个游戏刻循环执行——但指令表里没有的动词,它一条也变不出来。

把几个关键工具的入编时间排成一列,能看出一条轨迹:计分板 1.5(2013 年),函数 1.12(2017 年),数据包 1.13(2018 年)。每一步都不是官方先想到的:命令方块为冒险地图作者而生,计分板接住了地图作者对数值系统的需求,函数把命令方块的阵列搬进文本文件,数据包干脆承认——地图就该带上自己的数据。官方一路在追认社区已经形成的做法,这个过程的完整叙事见《模组作为第二作者》。

现在回答贯穿本章的问题:官方为什么要模糊这条边界?因为模糊对它几乎有百利。

对品牌,模糊意味着原版永远可以承诺「不装模组也能玩出花」。原版不是内容的尽头,而是内容的生产资料。对控制,模糊把一部分创作能量从加载器生态拉回官方格式:用官方语法写的地图会跟着版本升级活下去,用模组写的每次更新都要自谋生路。标准在谁手里,格式说了算。对成本,模糊让官方不必真的去造一个模组接口——接口是承诺,承诺兼容,承诺文档,承诺不随便重构引擎。数据包给了「平台」的名声,躲开了「接口」的债务。

数据驱动只重组已有动词

地基数据包只能给已有方块与生物换组合,造不出新行为 → 官方不必为新能力背书,引擎重构不受兼容承诺掣肘 → 代价由作者承担:极限处的需求只能出走去写模组

5类型寄生:地图类型如何骑在同一物理上

在数据包之前,地图作者手里只有方块和越来越强的指令。回看十几年的社区地图,会发现一个耐人寻味的事实:解谜、竞技、生存挑战、角色扮演,类型截然不同,物理完全同一。没有一张地图改过引擎,它们只是给同一套动词——走、挖、放、合成、躲开怪物——换了目标。寄生,指的就是这种关系:不改宿主,只改宿主行为的意义。

5.1冒险地图

冒险地图是把 Minecraft 当舞台用的地图。它依赖 1.3.1 加入的冒险模式:玩家不能自由破坏与放置方块,除非手里的物品被明确允许,作者的布景因此不会被一镐子拆掉3。这个类型比游戏模式更老:2011 年前后社区已经在传抄自制地图,那时没有任何强制手段,作者只能在一开头写一句「请不要破坏方块」,靠玩家自觉。冒险模式把这份自觉变成引擎规则——官方追认社区实践,这是典型的一例。物理系统在冒险地图里也换了角色:苦力怕的爆炸不再是生存威胁,而是剧情里的一场伏击;红石机关不再是自动化工具,而是密室的锁。

5.2CTM:通关纪念碑

CTM(Complete the Monument,通关纪念碑)由 Vechs 的 Super Hostile 系列确立。规则一句话:在地形凶险的自定义世界里找齐十六种颜色的羊毛和几块稀有方块,放进一座「胜利纪念碑」。它寄生的是生存模式的目标函数:怪物压力、资源匮乏、探索风险原样保留,作者甚至用原版地形生成的手法手工布置区域,专门在补给点旁边设伏击。变的只有终点——打败末影龙的游戏目标,被换成一张建筑验收清单。玩家做的事和生存模式一模一样,心跳的理由完全不同。

5.3解谜地图

解谜地图把玩家的动词本身变成谜面。为什么这扇门打不开?该把哪三样东西摆进合成格?这座机关的信号时序怎么对上?在生存模式里属于工程知识的东西——放置规则、信号时序、光的明暗——在这里被反转为谜题。冒险模式在解谜地图里比在任何类型里都关键:谜题成立的前提是不许绕路。生存模式下,再精巧的谜题也挡不住一镐头挖穿墙。

5.4RPG 地图

角色扮演地图寄生得最深。它不满足于换目标,还要在动词集合之外模拟一整套系统:记分板当属性,村民交易当商店,命名生物当头目,聊天栏刷字当对话。前面说过,每一项都是假装。也正因为如此,它是四种类型里最依赖指令技术、也最容易穿帮的一种——它对原版的要求已经贴着数据驱动的天花板。天花板在哪里,下一节说。

地图的大脑藏在哪里

拆别人的存档是玩家圈的一门显学:把地图打开,飞到玩家永远不会走到的地方——虚空之上,或地底深处——通常能找到一个塞满命令方块的房间,几百上千个方块排成阵列,全图的剧情、奖励、机关都从这里发号施令。这个「大脑密室」不是哪位作者的发明,而是社区自然形成的行规:逻辑要集中,要藏在玩家走不到的坐标上。出生大厅地板下那一层,就是它露出地面的影子。

6极限:何时必须写出新系统

数据驱动的极限不是玄学,可以逐条列出。

第一类:新动词。数据包不能改变玩家怎么移动、怎么交互。你想给玩家一个抓钩、一段冲刺、一次时间倒流——凡是「多出一个动作」的需求,都在指令表之外。社区当然会假装:用隐身的实体拉着玩家移动,每个游戏刻修正一次位置,看起来像抓钩。但那是每一刻都在运行的补偿表演,不是动词,性能和手感迟早一起崩。

第二类:新界面。玩家看得到的屏幕只有那几个:物品栏、聊天栏、容器。数据包做不出真正的菜单。作者的对策是拿容器界面凑合——给格子里的物品改名,一枚「下一页」的纸,点一下翻到下一箱。能用,但一眼假,而且脆:一次版本更新改了容器的行为,全图的菜单跟着失效。

第三类:真正的自定义机制。一台有燃料、有热量、有加工进度的机器,一种会自己流动的新液体——这些需要自己的状态和自己的每刻逻辑。用函数去模拟,等于把游戏重新实现一遍,复杂度每涨一点,成本翻倍地涨。

用一个多人场景把三类极限凑齐。假设你想在自己的服务器上做一个八人实时对战小游戏:玩家排队等候,凑满自动开局,分成两队,打完结算,败者回到队列,中途有人掉线还要补位。这个需求没有一个字能写成战利品表或配方——它不是数据,是系统:有自己的状态机(等待、匹配、进行、结算),有跨玩家共享的状态,有自己的生命周期。用计分板硬写当然也可以:几百个函数互相调用,改一行,崩三处。服务器插件——Bukkit、Spigot 一脉的生态——存在的理由,就是替你写这一部分。

所以判定信号有四条,中两条就该停手:

一是动词信号:你发现自己在用三个已有动词拼一个不存在的动作,而且这个拼凑需要每个游戏刻都运行。

二是界面信号:你需要的交互有了输入、确认、状态三要素,聊天栏的一行行字开始承载超过一屏的流程。

三是状态信号:你需要的状态要跨玩家、跨场次、要持久保存、有自己的生命周期。记分牌是给个体挂数字的,不是状态机。

四是规模信号:函数数以百计,调用关系已经没人能在脑子里画全,改动的验证成本超过了新增内容的成本。

四条中两条,你写的东西在性质上已经不是地图,而是寄生在地图格式里的软件。此时正确的做法不是硬撑,而是换工具:把状态和逻辑写成插件或模组,把剧情和数值留给数据层。数据包和模组不是竞品,是分工。

最后回到官方。写作的此刻,官方没有提供过真正的模组接口:不能注册新的方块行为,不能添加新的界面,不能触碰渲染。数据包停在数据层,是官方刻意停下的。于是极限处的作者只有两条路:把设计削足适履塞回数据层,或者跨出官方边界去写模组,把作品的命运交回给加载器生态。原版与模组之间那条含糊的边界,到这里反而看清楚了:模糊不是给作者的自由,是官方没有接口时的缓冲带。

7这一章留下什么

  • 爱好者:你玩过的每一张地图,都是作者用官方给的动词排出的一场戏;下次在虚空里撞见塞满命令方块的密室,那是地图的大脑。
  • 开发者:能抄走的是分层的判断——数据驱动做内容、系统兜底做机制,以及「把作者工具做成世界内可复制的对象」这一手;抄不走的是模糊边界的底气,它靠官方对格式与更新节奏的垄断撑着,普通团队没有这个位置,发布前就必须把接口想清楚。

注释

  1. minecraft.wiki,《Scoreboard》,社区维基条目(2026 年 9 月访问);计分板经快照 13w04a 加入、随 Java 版 1.5 发布,队伍功能见于 13w05a;见 https://minecraft.wiki/w/Scoreboard 。 ↩

  2. minecraft.wiki,《Command Block》,社区维基条目(2026 年 9 月访问);命令方块经快照 12w32a 加入、随 Java 版 1.4.2 发布(2012 年 10 月);Jeb 在 2012 年 7 月 27 日的推文中称该方块为扩展冒险模式而造;见 https://minecraft.wiki/w/Command_Block 。 ↩

  3. minecraft.wiki,《Adventure》,社区维基条目(2026 年 9 月访问);冒险模式经快照 12w22a 加入、随 Java 版 1.3.1 发布,条目注明其「为玩家自制的地图而设,限制了 Minecraft 的部分玩法」;见 https://minecraft.wiki/w/Adventure 。 ↩ ↩2

  4. minecraft.wiki,《Function (Java Edition)》,社区维基条目(2026 年 9 月访问);函数于 Java 版 1.12 预发布版 1 加入,快照 17w43a 起移入数据包;见 https://minecraft.wiki/w/Function_(Java_Edition) 。 ↩

  5. minecraft.wiki,《Data pack》,社区维基条目(2026 年 9 月访问);数据包经快照 17w43a 加入、随 Java 版 1.13(2018 年 7 月)正式发布,初始格式版本为 4;见 https://minecraft.wiki/w/Data_pack 。 ↩

On this page