Featured image of post 领地

领地

Minecraft 中的“所有权陷阱”

好几 次阅读

好了按照之前的约定,我现在来补上这篇关于领地的文章

事情还要从很久以前说起,重新看服务器的插件列表时发现,里面有一个 cmilib,还有一个 residence,老实说我不太受得了这两个在我的服务器里,说不上为什么,就是觉得碍事,所以开了一个项目叫 ProRegion,目的是完全取代 Residence,核心模型是将领地抽象为一个与空间有关的规则集,将一系列 flag 抽象为一些行为,途径,对象的组合,一个组合就是一条规则,然后使用数据库的 RBAC 模型来管理规则

这个设想在当时是我非常认可的,然后准备让 gemini 开写,结果发现 Brigadier 的命令写起来太麻烦,后来就搁置了,还有一些关于经济系统的细节没搞好

然后现在我再次看到了这两个让我觉得洁癖犯了的插件,于是准备和 gpt 讨论下该怎么处理

在那期间我搞了一个新的工具:BrigadierDSL,这是一个相当伟大的工具,由 claude 编写,它把所有的节点,参数,都做到了零样板代码创建,以及最重要的:可全局复用,不会污染状态和节点树

它现在已经被我整合到我的插件基础库里面了,经过实测非常完美,所以我想,既然 ProRegion 项目卡在命令,那么现在是不是可以考虑用新的 DSL 完全重写命令了,而且因为节点可复用,能省下很多代码

Tsukimirin-2082030121175941607.jpeg


我突然想到一个问题,领地插件从一月开始就存在了,但是,玩家实际用过多少呢?

这个问题一旦被放上来讨论,那么之前的所有想法瞬间立不住脚了

chatgpt:

你原来的重写思路本身没有问题。甚至从软件设计的角度看,它相当漂亮:把硬编码 flag 拆成元行为、对象、来源、状态,再用 RBAC 管理规则,经济也从领地系统里剥离出去。这已经是一个相当完整的 policy engine 了。但问题在于,你的服务器玩家似乎根本没有提出一个值得这个 policy engine 存在的问题。

你自己这几句实际上已经做了一次非常有价值的需求调查:

“除了设置权限和续租以外,有没有用过别的功能?”
“设置权限,有没有设置过传送、交互、容器、放置、破坏以外的权限?”

如果答案长期稳定地是“几乎没有”,那么那些几十个 flag 并不是“潜力尚未被发掘”,而很可能就是产品从来没有真正需要过它们

还不止,续租也是另一个需要重新想的东西,当时为什么设置续租?续租是建立在旧的经济设计上的,为了应对生电的无限产出,消耗端就要设计一个无限消耗的东西,于是领地的租金成了最好的出口

但是,这本身是我想要的吗?现在来看,这是一个很典型的妥协设计,因为 A 需要 B,所以 C 添加了 B 的功能,但现在 A 已经不存在了,C 自然不再需要 B 的功能

我当时其实意识到了这一点,但我还是自己骗自己说,没关系,玩家用不到,我以后会需要的

所以我在上一篇(好像是两篇?)的文章里写了 goodhart 定律之后,我就说,领地的续租,它本身确实有一定价值,但不能用货币来衡量,续租可以改为玩家上线自动续租,如果玩家超过 30 天没有上线,那么领地会被自动清除,嗯,我觉得这样可以

但是我对此依然留有疑问:为什么领地需要其所有者不断上线?领地究竟在保护什么东西?为什么这些东西值得保护?领地,或者说区域保护插件,真的有必要存在吗?

我联想到了之前最大限度借用了原版模型的箱子锁插件,假如说,我不加领地,只加这个箱子锁,可以吗?

chatgpt:

领地插件不是在保护”区域”,而是在保护某种“玩家认为未经同意不该被改变的状态”

最直接的是,玩家的建筑,仓库,农场,不希望别人来动手动脚或者破坏,也不希望被偷窃

然后是资源,箱子物品,村民,机器,收藏品

再往下是“隐私”和“边界”,玩家不希望谁来,不希望自己的空间被冒犯

如果是为了这些需求,其实完全可以有单独的方式来实现它们,但我们为了省心省力,把它们全部打包到了一个叫做“所有权”的东西里面,领地就是在做这个,画一个立方体,然后说这里面的所有东西都是我的

那怎么办,如果我想说有一些东西例外,如果说我希望某些权限例外,怎么做?于是有了权限管理,子领地,领地玩家

但这些概念并不是玩家应该需要的,而且,Minecraft 天然并没有“所有权”的概念,它其实是一个在社会中诞生的概念

chatgpt:

所以真正的问题其实是:

服务器到底有没有必要人为创造“私人空间”这种社会规则?

你不能说因为玩家习惯了领地所以用,这是因果倒置,从需求出发的问法就是我上面说的:如果我去掉领地插件,玩家会遇到哪些问题?

最后这个问题会变成“为什么玩家建造的东西/承认的东西,需要被服务器承认,被服务器认可?”

领地其实就是在告诉玩家,我认可你在这个区域内拥有排他性的权利,除了你以及你明确允许的人,在明确允许的范围内,拥有使用的权利,除此之外,没有人可以使用

哦对了,整理的时候补充一点写作的时候没写上来的东西,所有权在 mc 里其实是一个不自然的概念,这里说过了,它其实是一种“被服务器承认的,对某些对象拥有排他性权限的主张”,但是这个称呼太长了,所以后面我依然还是用“所有权”来指代这个词,他们确实很相似,但深究下去会发现是有不同的

Rocco65B-2086286354141307013.jpeg


我们不妨来重新思考一下这个问题:

“这是我建的,所以它是我的,你不能动”这句话里面,有没有哪些看上去很正常,但如果深究会发现很奇怪的东西?

“这是我建造的”,这是客观事实,一个方块由谁放置,由谁破坏,CP 都可以追踪到

“所以它是我的”,这里就开始奇怪了,举一个边缘例子,我种了一棵树,然后用骨粉催熟,那么这棵树是我的吗?这棵树是我“建造”的吗?

再来一个例子:我探索某个结构,然后把结构炸了,围了起来,那么我能说“这里是我的”吗?

所以“这是我的”实际上是一种社会声明,玩家可以声称任何一样东西属于自己,领地插件的作用就在于,服务器认可,尊重玩家的声明

那么领地插件是否需要,这个问题就变成了“玩家觉得自己的哪些东西需要被尊重和认可?“

chatgpt:

“尊重”不一定要求排他性空间。

比如玩家建了一座雕像。服务器可以承认“这是你的作品,别人不能拆”,但同时允许所有人进入、拍照、在旁边建东西。

这其实非常符合一个公共世界:作品可以属于某个人,但空间不一定属于某个人。

再比如一个玩家拥有一个箱子。你保护的只是“取出物品”的行为,而不需要保护整个房间。

甚至可以进一步出现“共同所有”或者“公共使用”:

某个村庄是玩家 A 建的,但它被定义成公共设施;别人可以进入、使用、甚至修改,但不能恶意破坏。这时候保护的对象不是“不可修改”,而可能是“不可毁灭”。

于是你会发现,传统的 build = false 其实是一个特别粗暴的命题。它把“修改”这个行为全部视为侵犯。

现实是什么样呢?我说这是我家,你可以来,我可以给你泡茶,你可以拉开椅子坐下,但是你不能打开柜子,很简单的例子,但即使是这么简单的例子,在领地的概念里却是无法做到的:它只有 1 和 0,我此前设想的 ProRegion 其实能做到一部分的宽容,但是它依然有不可替代的局限,而且在使用上也更加麻烦

133825615_p0.jpg


我们通常会说玩家的“私有财产”,但它具体包含了什么?能直接使用现实中的“个人财产”概念吗?

chatgpt:

而这里,“私有财产”这个词确实非常诱人,但我不建议直接拿现实世界的个人财产概念套过来。不是因为 Minecraft 里的东西“不真实”,而是因为现实中的财产制度背后有一整套前提,而 Minecraft 服务器并不具备这些前提。

现实中的“所有权”并不是单纯的“这个东西归我”。它通常是一束权利:占有、使用、收益、处分、排除他人、转让、继承等等,而且这种权利最终由法律和国家暴力机器提供保障。你买了一栋房子,并不是因为房子内部有一个叫 owner = 你 的字段,而是整个社会承认你对这栋房屋拥有一组可对抗其他人的权利。

说点难听的话,其实硬要说的话,服务器里的所有东西都归服主所有,玩家只有使用权,甚至连这份使用权都是不受保障的,我可以删除,我可以修改,甚至直接把服务器关了,所以我认为可以得出一个较为激进的结论:Minecraft 服务器中并不存在“所有权”的概念,取而代之的是“对某些对象拥有的,受到服务器认可的排他性控制权”

这其实才是最接近现实模型的所有权概念,你可以说这个房子是我的,但不能说这房子前面的所有空地都是我的(它更像公共空间),可以说房子是我的,但依然允许别人进入,你可以创作一个雕像并说“我是作者”,但这并不意味着雕像自动成为“你的东西”,它依然属于公共空间

如果你去问玩家“你需要领地插件吗”,你毫无疑问地会得到肯定的回答,因为玩家需要保护自己的财产,但如果你换一个问法,“哪些东西你不希望别人动”,这个范围会小得多,可能只是一个建筑(但不包含周围的土地),一个农场(允许进入,但不允许擅自拿取物品),一只宠物等等

而领地把它们粗暴归类为“一个矩形”

我带着宠物离开了这个区域,这个宠物突然就不是我的东西了,玩家肯定会觉得荒唐,但这就是领地的运行逻辑

89348664_p0.png


以上的讨论足以让我们得出“领地插件实际上是将一个复杂的概念简单化,但也让其本身不再成为排他性控制权的代表”,然而事情到这里依然没结束

RIA 是没有领地插件的,哦不对有,但是普通玩家不能设置,普通玩家只能使用箱子锁,从玩家视角来看就等于没有

那么没有领地插件,RIA 是不是有很多破坏行为呢

我不知道,但据我到现在的观察来看,完全没有

这其实再次印证了“所有权是一个社会概念”,因为在这里玩家并不需要使用领地,“所有权”依然存在,被承认

我还想起之前搬迁基地的时候,有一个玩家突然过来,然后翻了一下我的箱子,虽然这让我感觉很不舒服,但我至少相信 ta 不会偷东西,我现在还记得这个感受,所以我觉得完全地去除领地插件也不是合适的方案,我需要的可能是一种介于箱子锁和领地之间的东西

事实上的安全感制度上的安全感不是同一种东西。RIA 里我不用担心建筑被破坏,因为我相信社区,相信管理组,相信 CP,但是这并不代表破坏不会发生

而在我服里,玩家不用担心建筑被破坏,因为别人做不到,别人即使想破坏也破坏不了

后者带来的安全感在一个很隐秘的层次上是要更高的,两种模式可以被概括为“强社区信任 + 弱技术保障”和“弱社区信任 + 强技术保障”

这两种方案并不是哪个更好,因为从反面来想会得到相反的结论:

“我的东西没有被破坏,即使它可以被破坏,因此看出社区的成员都非常尊重我(我的所有权被社区承认)”

“我的东西没有被破坏,因为有领地,但我不确定有没有人想破坏我的东西(我的所有权被服务器承认)”

综合来看这两种方案都有自己的特点

那么,有没有一种中间形态呢,既让自己的劳动被社区承认,同时也被服务器所承认

我还没有想到这个中间形态应该是什么样的,而且准确的说法它不叫“中间形态”,而是结合了两个方案的优点的结合形态

在对话后面我还真的想出了一个方案:依然保留圈地,但圈地的作用不再是限定区域保护范围,而是向所有来到这里的人说一句“这里是 xxx 的地方”或者什么玩家自定义的话,然后不再做任何事情

这其实就是让服务器承认玩家的所有权主张,但是否被尊重,被执行,依然看社区本身,社区如果承认,那么就承认,如果社区不承认,那么服务器也不会干涉社区的决定

当时这个方案被我否决了,我总觉得它差点意思,后来我说,那么算了,插件其实不应该干涉游戏内的任何行为,区域保护插件完全没有必要存在,然后说,用类似于消息方块,玩家走上去或者右键一下会发送消息,然后又想到展示实体插件,发现它其实可以被展示实体所替代,那么连这都不需要了

149409008_p0.jpg


我们一直在讨论的,其实是 Minecraft 里面,如何表达”所有权“和保护“所有权”,但问题就在于,Minecraft 其实根本没有这种概念,玩家想要的其实只是尊重与边界而已,而不是“所有权”,但这两者很容易被混淆


我们还可以进一步讨论一下 CoreProtect 到底在做什么

尽管这是我自己的想法,但我觉得 coreprotect 表达出来的原则其实简单得可怕:只记录,不评价;cp 记录一切,但不会对你说“你不该这么做”,它没有尝试告诉你“这片地方是谁的”,它只是记录了谁在什么地方做了什么,它完全没有涉及“所有权”的概念,“所有权”只是我们基于历史和行为趋势总结出的:

这片区域似乎有 xxx 经常活动,而很少有其他人;

到这里为止都是对的,问题在后半句人为的推论:

所以这片区域应该是属于 xxx 的

有一个反例可以精确描述:玩家出门探索了一个结构,然后把这片结构炸了,或是触发了某些机关,让结构面目全非

这时候,“这片区域似乎有 xxx 经常活动,而很少有其他人”,是正确的,但后半段呢?我们能因此说明“这片区域属于他”吗,很显然不行

这也是我在前面举过的反例,我们能从 CoreProtect 的记录中推断出“区域的所有权”吗?可以推断,但这种推断是无效的,人类非常容易从大量事实中自动寻找,创建一个模式:这里长期有 xxx 的活动

但下一句话就有问题:所以这里是 xxx 的,就有问题,一个插件如果使用了这种模式来“推断”所有权,那么它就是有问题的,它不是在寻找规律,而是在自己发明一套所有权制度,通过 cp 记录来推断所有权不叫“智能算法”,而是一个暴政的机器

而 CP 最高明的一点就在于,它拒绝这么做

它拒绝替管理者整理数据,归纳数据,然后告诉管理者:这里是 xxx 的地盘,xxx 在这里疑似有恶意破坏行为,是否需要一键回滚,它只是把数据摆在你面前,让你自己判断

这就是”只记录,不评价“原则

这个讨论还可以延伸出一条:历史本身不产生所有权

这和我之前说的“所有权是从社会契约中诞生的”是类似的

所有权是被手动,人为创建出来的,箱子锁不是发现一个已有的所有权,而是自己创造了一个所有权

箱子锁,还是圈地插件,其实都只是在说一件事情:这里似乎对某个人很重要,它需要被尊重,被承认,但我们不能说“某个人拥有这里”,这需要明确的约定/制度来完成,而不是被发现的