后期特效与战利品池:同一个箱子的两半
战利品池的权重决定掉落什么,/posteffect 命令决定它给人什么感觉。两者都是数字,在写数据包之前就能核对。
加权战利品池和 /posteffect 命令通常由不同的人写在不同的文件里,而它们出问题的方式如出一辙:数据包发布之前,从来没人核对过那些数字。而这两样东西,提前验证的成本都很低。
战利品池是算术,不是感觉
池中的每个条目都有一个 weight,而任意条目的概率等于它的权重除以该池中所有权重之和。这里没有隐藏的归一化,也没有下限——权重为 0 意味着该条目永远不会被抽中,而权重之和无论等于多少,池的行为方式都一样。真正的陷阱在于混合抽取次数:一个 rolls: 2 的池会采样两次,所以权重占四分之一的条目会出现在大约一半的箱子里,而不是四分之一。
| 条目 | 权重 | 单次抽取中的占比 |
|---|---|---|
| 铁锭 | 20 | 20 ÷ 40 = 50% |
| 金锭 | 12 | 30% |
| 钻石 | 8 | 20% |
再加入一个权重为 40 的条目,上面每个数字都会减半。这就是平衡工作的全部内容,也正是为什么“钻石掉率感觉不对”几乎总是因为你忘了按比例调整某个权重。
战利品表是游戏中较大的注册表家族之一——本站所测量的 26.2 数据中列出了 1355 个——所以一个你无法用数字推理的池,就是一个你永远没法靠手工调完的池。
/posteffect 是一个快照版命令
Java 的 /posteffect 是快照时期的命令,当前的正式版中并不存在,而 Bedrock 则完全没有对应功能。Bedrock 通过资源包和相机抖动系统来处理屏幕染色,所以这里的 Java 教程无法照搬过去。
该命令接受一个效果标识符和一个强度,而强度是浮点数,不是百分比。效果是一个很小的注册表——26.2 数据中只有 40 个——所以标识符列表短到可以手工核对,而不必靠猜。在某些快照版本中,指定一个不存在的效果会静默失败,这是提交之前需要验证的第二个理由。
两者的交汇点
掉落稀有物品的箱子和掉落普通物品的箱子,看起来不该一模一样。先抽取战利品池,得到真实的分布,再选择与玩家实际看到它的频率相匹配的后期特效强度。反过来做,就会得到一个频繁触发的夸张特效,读起来就像噪音。
对于一座城镇建筑来说,这通常意味着给普通池配一个低强度效果,把强效果留给权重最小的那个条目——用的正是你已经算好的那个比例。
在后期特效与战利品工具中构建 /posteffect 命令并抽取加权战利品池。