第一百五十六章 村庄与掠夺更新后的自定义交易

e······该交易项目specialPrice标签的值

m······原价

C······trading类言论强度

D······minor_negative类言论强度

\\ Minecraft Wiki上的计算公式\\

于是,作者基于这两个公式,通过一些实验,总结出了上面的那个计算公式。

但不管如何,这个错误仍是一个较为严重的错误,因为它已经存在了很长时间,并有许多教程引用了这个公式,影响范围较大。

需要注意的是,上述公式都有涉及到言论系统,但言论系统目前(2022年12月28日)仅仅存在于Java版中,所以上述公式不一定适用于基岩版。

PS: 2022年12月4日,Minecraft Wiki的用户Nickid2018终于将百科的计算公式改了。新的计算公式如下:

e =声望影响的降价+村庄英雄效果影响的降价

y = clamp(m×〔1+a×p〕+e,1,M)

小主,

a······该交易项目demand标签的值

p······价格乘数

e······该交易项目specialPrice标签的值

m······原价

M······村民收购的第一个物品的堆叠上限

这个公式与上面作者自己得出的公式相差不大,但仍有一个可能的问题:

e(specialPrice)的值的计算方式可能有误

要说明为什么有这个问题,我们得先了解一下specialPrice的机制。

当一名玩家打开村民的交易界面时,游戏会计算每个交易项目的实际价格。这时候,游戏会先计算言论和村庄英雄效果的影响,并将它们的值加到每个交易项目的specialPrice标签中。第二步,游戏才会根据demand等其他标签,综合计算出每个交易项目的值。在这个过程中,specialPrice标签会加到计算的值中。第三步,也就是向玩家展示这些交易项目。最后,当玩家关闭村民的交易界面时,游戏会把每个交易项目的specialPrice标签清零。

也就是说,如果要使得交易打折,specialPrice的值必须要为负。

但是,如果根据Minecraft Wiki的计算方式,specialPrice为负的情况只有一种可能:村民对于玩家具有过多的负面言论。而这是不可能的。

当然,我们也别过多纠结这个问题,该改正的总会改正,只不过是时间问题。我们更加需要关心的有两件事情:

1.我们肯定不希望我们自定义的商品价格被随意改变,所以我们该怎么办呢?

2.specialPrice的性质可以弄出什么效果呢?

对于第一个问题,我们的解决方法很简单——仔细观察上面的公式,我们不难发现『p价格乘数』都是一个及其重要的变量。

既然是『乘数』,如果我们把这东西改为0,那问题是不是就解决了?

试一试!当p=0时

e =-〔(5A + B + C - D - 5E)× 0〕-〔((V-1)×0.0625+0.3)×m〕+f

e =-〔((V-1)×0.0625+0.3)×m〕+f

y = clamp(〔a×0×m〕+m -〔((V-1)×0.0625+0.3)×m〕+f, 1 ,M)

y = clamp(m -〔((V-1)×0.0625+0.3)×m〕+f, 1 ,M)

不难发现,就算p=0解决了大多数问题,但村庄英雄效果和specialPrice的原始值仍然会影响到价格。但村庄英雄效果毕竟是很难得到的,specialPrice的原始值又是只能通过命令改变,所以总体上来说影响很小。

总结下来,相比更新之前,我们在新版本中自定义村民交易,还需要注意将价格乘数priceMultiplier设为0.0(有没有一种可能,不设置其实也默认是0)。举个例子:

/summon villager ~~~{VillagerData:{level:6,profession:“minecraft:farmer“},Offers:{Recipes:[{rewardExp:1,maxUses:,buy:{Count:1,id:“minecraft:diamond“},buyB:{Count:10,id:“minecraft:emerald“},sell:{Count:1,id:“minecraft:diamond_sword“,tag:{Enchantments:[{id:“minecraft:sharpness“,lvl:10}]}},priceMultiplier:0.0}]}}

这个例子是我们第一百五十四章的一个旧版例子的新版写法,只不过将暮色森林Mod的幻影骑士战利品换成了普通的钻石。

上面这条指令将会生成一个等级为6的农民,并带有一个『具有15万次使用次数、每次交易返回1点经验值、价格乘数为0.0、能够用1钻石加上10绿宝石买一个附魔有锋利X的钻石剑』的交易项目。

那对于第二个问题呢?

既然游戏在计算specialPrice时会将specialPrice的初始值加上,那么只要控制得当,在玩家打开交易项目之前就更改specialPrice的值,就能做到自定义折扣。

另外,修改specialPrice的值并不会影响到村民给正在交易中的玩家的商品价格。

村庄与掠夺更新后的自定义交易到此就结束了,你现在可以尝试去自定义一个新版本的村民,看看效果如何。

附表:新版本村民历史

Java

1.14——对村民进行了大改

1.14.3/1.14.4——优化

1.15——傻子村民现在没有徽章,村民会被玩家赶下床

1.16——优化

1.16.2——工作站点优化

携带/基岩版

1.10.0——大改

1.11.0——优化

1.13.0——村民现在会在战胜袭击后欢呼

1.16.220——村民现在不再能够穿墙过去睡觉

1.18.10——村民现在会发射烟花火箭庆祝,交易时头顶不会再出现绿宝石图标

1.18.30——优化