既然我们已经理解了JSON的大致格式,也就是文件夹格式。那么,就开始进入/loot的最难点:战利品表。
————第一段:战利品表的大致内容
既然战利品表是JSON表,那么肯定也像文件夹一样有一个最开始的用来存储的硬盘。但是我们先不了解硬盘叫啥名,我们先了解装载着硬盘的电脑叫什么名。
这台电脑,大家都叫他:根标签。
所有JSON表都是由一个根标签开始的。这个根标签不是一个数字,也不是一个字母,而是:
啥都不是。
其实根标签就是大括号那外面那部分。
.........
那么既然了解了电脑叫啥名,接着就开始了解这台电脑的硬盘叫啥了。
这台电脑里,插着两个硬盘。
为什么只插着两个硬盘呢?
因为——这就没了。
那么就开始吧。
这两个硬盘,估计大家都很熟悉。
它们分别是:
T盘——type 盘
P盘——pools 盘
首先,type,也就是类型。T盘就是——类型盘。
pools,这个单词会比较陌生,但那是相对于英语课上没认真听的同学。在英文中,他的意思是——水塘、水坑(等等,还有一个s复数)。
等等,这和战利品表有啥关系?
西湖,从某种意义上来讲,它是一片很广阔的水塘。而它有一个名字:西湖。
水塘,从某种意义上来讲,它和西湖同类,所以,它也有名字。
Mojang给它取了一个名字——随机池
哎,是不是忽然就感觉疑问都烟消云散了?没错,pools,在这里是随机池的意思。
但为何不是Random pool(随机池)呢?这就得问Mojang它们自己了。
或者去找Notch也行[滑稽]。
当然,既然搞清楚了硬盘是什么用的,接下来就来看看它们底下的文件夹了。
type的内容比较少,我们先从它入手。
————第二段:type——种类
你可以选择你要使用哪种类型的战利品。当然这可不是填空题,这是一道选择题。
(不得不说这内容还真的少)
所以type的内容不是少不少的问题,是因为内容必须我们自己填!
那么我们可以选择创建以下的类型:
empty——没有任何的战利品
entity——实体的掉落物
block——方块的掉落物
chest——宝箱
fishing——钓鱼钓上来的东西
advancement_reward——游戏进度(成就)奖励
generic——我都不选
那么该怎么创建呢?
比如:
{“type“:“entity“}
就像这样子。
为什么不加中括号?
就只有一层而已,干嘛要加?
当然接下来请你听好了,因为接下来——
pools 盘——10MB/256G
————第三段:pools
首先,让我们创建一个文件夹(随机池):
{“pools“:[{}]}
看到那大括号了没有,那就是我们创建的文件夹(随机池)。
然后,就开始添加一些文件夹(或者是文件)了。
——第三段第一节:设置抽奖次数
首先,既然是随机池,那么我们就得搞清楚,我们要抽几次奖。
如果不弄的话可能会发生你想给一个玩家搞一个十连抽(要不要充钱?),但是却搞成了100连抽.......
为了防止这种情况,我们先添加一个叫做rolls的文件(注意是文件):
{“pools“:[{“rolls“:}]}
然后填上你想要抽几次奖,OK完事了。
但是为了方便大家理解,我们得为自己出一道应用题(等等,为何突然数学课化?):
怎么实现一次十连抽,并且奖品有:铁锭,随机010个;钻石,随机02个;煤炭,随机030个。
我们已经知道了怎么设置为十连抽,也就是:
{“pools“:[{“rolls“:10}]}
那么接下来,就该设置战利品了。
——第三段第二节:设置战利品
现在,请在这个随机池文件夹下添加一个文件夹,取名叫:entries。
然后打开这个文件夹:
{“pools“:[{“rolls:10,“entries“:}]}
接着,我们设置第一个战利品:铁锭。
{“pools“:[{“rolls“:10,“entries“:[{}]}]}
既然是铁锭,那么它的种类就是物品,也就是:
type=item。
所以我们在铁锭这个文件夹里面创建第一个文件:type(种类)。
我们在这个可执行文件里写上:item。
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“}]}]}
就像这样。
设置完种类,就开始设置物品。
也就是:name。
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:““}]}]}
但可不是直接在name里面写铁锭啊,这里是不认中文的。所以,我们就填铁锭的英文,也就是物品id:
iron_ingot
写进去:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“}]}]}
现在,我们就实现了,十连抽,每抽一次必定抽到一个铁锭。
但是我们得搞随机,所以我们要:添加一个新的文件夹。
而这个文件夹,叫做function。
——第三段第三节:随机选择
等等,函数?
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:
}]}]}]}
我们打开这个函数文件夹(突然高大上)。
既然是函数文件夹,里面添加一个文件,也是函数文件:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:““}]}]}]}
那么为什么要添加这个函数文件呢?答:用来执行。
执行的函数有很多种,而这里我们需要用到:
set_unt——设置物品的堆叠数量
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“}]}]}]}
接下来,我们添加一个新的文件夹:unt,用于决定物品的数量。
但是,注意,unt必须写在function的后面才能执行。
为何?因为function就是用来作为执行这个unt的开关。
所以,哪有先执行后按开关的?
就像绑匪一样,哪有绑匪先撕票后提条件的?
(好像历史上有哎)
当然,unt不止可以是文件夹,也可以是文件。
当unt是文件时,就是设置为一个具体的数量;是文件夹时,就是设置一个随机的范围。
那么:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“,“unt“:{}}]}]}]}
既然是取一个范围,那么必然有最大值和最小值,也就是:
min——最小值
max——最大值
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“,“unt“:{“min“:,“max“:}}]}]}]}
然后让我们看一下题目,毕竟审题更重要[滑稽]:
怎么实现一次十连抽,并且奖品有:铁锭,随机010个;钻石,随机02个;煤炭,随机030个?
随机010,也就是最小值0,最大值10。填入:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:10}}]}]}]}
OK,铁锭完事。
接下来,就是钻石和煤炭了。
照着铁锭的模版做:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:10}}]},{“type“:“item“,“name“:“diamond“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:2}}]},{“type“:“item“,“name“:“al“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:2}}]}]}]}
作者不禁感叹:这串代码真长。
(作者程序猿同化程度:10%)
——第三段第四节:更加细致的随机选择
但是,这只是战利品表的冰山一角。接下来,我们稍微改一下题目:
怎么实现一次十连抽,并且奖品有:铁锭,随机010个;钻石,随机02个(有75%的机率为0);煤炭,随机030个?
之前我们弄出来的自定义战利品,数量获得的机率都是相等的。也就是说,铁锭010个,每个数量的获得机率都是十一分之一。
估计有的人就会想到:或许可以在unt这个文件夹继续设置呢?
答案是:不行。
但是,当你被上帝困住的时候,上帝虽然关上了门,但是——打开了窗。
同理,当你被Mojang困住的时候,Mojang虽然也关上了门,但是你发现,这个房子,它没有墙壁。
如果一次不能解决掉,那就分几次解决掉。
Mojang给了我们一个方法:weight。
现在,我们把钻石这部分单独扣出来讲。
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“diamond“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:2}}]}]}]}
我们把75%和25%分开成两个:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“diamond“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:0}}]},{“type“:“item“,“name“:“diamond“,“function“:[{“function“:“set_unt“,“unt“:{“min“:1,“max“:2}}]}]}]}
此时,这两个都会被选择,但是我们必须要改变成只选择一个。
所以我们就要使用刚才的:weight。
在这两个战利品文件夹里都创建叫weight的文件:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“diamond“,“weight“:,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:0}}]},{“type“:“item“,“name“:“diamond“,“weight“:,“function“:[{“function“:“set_unt“,“unt“:{“min“:1,“max“:2}}]}]}]}
看到那两个weight文件了没?没看到?好吧,这里的单词确实挺多的。
为了更好的讲解,这里就揪出来75%的那一串:
{“rolls“:10,“entries“:[{“type“:“item“,“name“:“diamond“,“weight“:,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:0}}]}
看到了没?还没看到?听说最近有一个品牌的眼镜特别不错,要不要去买一个?
那么weight到底是干啥的呢?
答:设置选择到这个战利品的机率。
当然,没写这个的战利品就不会参与其中,所以这个weight文件只管有它的战利品。
那么怎么设置呢?
当然是填数字啦!
既然是75%的机率,所以就填啦!
等等,不可以用小数!
那么就填75啦!
然后25%的那个weight就填25。
这样子,就完美的实现了题目的要求。
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:10}}]},{“type“:“item“,“name“:“diamond“,“weight“:75,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:0}}]},{“type“:“item“,“name“:“diamond“,“weight“:25,“function“:[{“function“:“set_unt“,“unt“:{“min“:1,“max“:2}}]},{“type“:“item“,“name“:“al“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:2}}]}]}]}
但是谁说weight一定要用百分比来算了?
实际上,weight是这样算的:
选择概率=这个战利品的值/所有考虑的战利品的总和值
这是一个分数啊!
当然,为了方便这并没有什么错的。
但是,这个没有墙壁的房子,有个天花板。你打算走出这个房子,但是你忽然发现——天花板是沙子做成的。
然后沙子就掉了下来,To Be ntinued。
.........
.........
但是你很快就发现,这个沙子,只有一层。
如果用weight的话,这样子只有一个物品可以这么做。
但是,刚才说过,一次不行就分开。
等等,这都被拆分成好几个战利品了,另一个物品肯定不能这么做。
但是,答案是:可以。但是有一个条件:必须要在一个新的命令方块里面。
所以,可以将物品分开在几个命令方块里进行十连抽啊!
Mojang是良心的,它肯定也考虑到了这一点,所以,我们也可以采用Mojang给出的方法:
一个方法,未必全面,但许多个方法结合在一起,并有所取舍,就全面了。
Mojang给出的方法是:children。
等等,这个单词怎么这么熟悉?
children,en,复数,这不就是........孩子们?
等等,先冷静,刚才的池塘,意思是随机池,所以这个孩子们,肯定是别的意思。
我们暂且先不考虑这是什么意思,先看看战利品的种类,除了item,还有什么:
tag——物品标签
loot_table——以另一个战利品表生成物品
group——选择一项
alternatives——从列表里选择一个子项
sequence——选择子项,直到有一个子项无法选择为止
dynamic——生成方块的掉落物
empty——啥都木有
而Mojang给我们的方法,就是:group。
这个类别,是干啥的呢?
实际上,group,就是将同一种类的战利品结合起来一起选择,但是只选择1项。
等等,这不就是我们要找的吗?
但是,选择group,name可以不写(实际上写了会报错),weight也可以不写,但children,就必须要写了。
实际上,children在这的意思不是“孩子们”,而是“战利品们”。
不得不佩服Mojang的想象力啊,children都能曲解成战利品们,怪不得Minecraft这么火[滑稽
doge]。
那么,children这个文件夹肯定就是用来集合战利品的了。
OK,既然搞清楚了,那么,开用!
我们这次将钻石集合在一起,为:
{“pools“:[{“rolls“:10,“entries“:[{“type“:“item“,“name“:“iron_ingot“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:10}}]},{“type“:“group“,“children“:[{“type“:“item“,“name“:“diamond“,“weight“:75,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:0}}]},{“type“:“item“,“name“:“diamond“,“weight“:25,“function“:[{“function“:“set_unt“,“unt“:{“min“:1,“max“:2}]}]}]},{“type“:“item“,“name“:“al“,“function“:[{“function“:“set_unt“,“unt“:{“min“:0,“max“:2}}]}]}]}
这样子,我们把钻石集合在一个战利品内的children文件夹算,方便多了,就是内容更多了,看得更头昏眼花了。
(忽然担心命令方块能不能存下去)
等等,那岂不是,可以在一个group类的战利品文件夹里面继续group,然后再接着group,那岂不是........
禁止套娃!
——第三段第五节:官方战利品表
实际上,Minecraft也有很多自带的战利品表(不然宝箱里的东西哪里来的)。Mojang是良心的,所以也给了我们使用官方渠道的战利品表的方法。
首先,让我们创建一个2连抽的随机池,以及一个空的战利品文件夹:
{“pools“:[{“rolls“:2,“entries“:[{}]}]}
而既然要使用官方渠道的战利品表,就得把种类改成:loot_table。
{“pools“:[{“rolls“:2,“entries“:[{“type“:“loot_table“}]}]}
那么设置完了,就得填写要使用的战利品表了。
让我们创建一个name文件:
{“pools“:[{“rolls“:2,“entries“:[{“type“:“loot_table“,“name“:““}]}]}
接下来,就开始选择你想要的战利品表了。
但是官方的战利品表多了去了,这里只选择其中一个:
loot_tables/blocks/blue_bed
这是什么呢?
首先,loot是战利品,tables是桌子的意思,所以loot tables是战利品桌?
好吧,这次实在是搞不懂Mojang的意思了,估计也就只有Mojang知道这是什么意思。
但blocks就好理解了吧,就是很多方块,在这里的意思是:方块的掉落物。
接着就好办了,既然是方块的掉落物,那么blue_bed就是一个方块了。
其实很简单,到/give指令上去查一下,OK这是蓝床,那么这个战利品表就是挖掘蓝色的床所掉落的物品:蓝床。
由于篇幅的限制,如果把官方的全部战利品表搬过来,估计本章字数都破万了。所以不搬为妙。
但是实际上这一章到这里已经4000多字了。
具体的战利品表的话,到QQ群里去看,作者有发。
至于为什么不发评论区.......
都说了这么长,就文档存得下了。
——第三段第六节:更神奇的抽奖次数设定
实际上,rolls不止是一定抽奖次数,和unt一样,rolls还可以随机选择抽奖次数:
{“pools“:[{“rolls“:
}]}
和unt一样,rolls的随机选择抽奖次数也有最大值(max)和最小值(min),比如设置抽奖次数在16:
{“pools“:[{“rolls“:[“max“:6,“min“:1]}]}
但是,神奇的Mojang,还给了我们一个更神奇的抽奖次数设定。
从古至今,欧皇这一词一直都存在着,古有朱棣三战三遇妖风,今有老外宅家天降陨石,欧气,这一词,也就成为运气的另一种说法。
而,在Minecraft Java版,Mojang估计也想让玩家体验体验欧皇的感觉(采钻掉岩浆,掉头遇小绿。撒腿向前跑,小白影里看。暗处射一箭,惯性掉岩浆。看着You did,删档重新来。),于是在Minecraft中加入了一个神奇的状态效果:幸运。
说实话作者也不知道幸运在Minecraft有啥用(钓鱼钓上一大堆钻石?还是莲叶?),但是在指令里面是有点用的。
比如战利品表的:bonus_rolls(额外抽奖次数)。
这是怎么算的呢?首先你需要给出一个值,比如6:
{“pools“:[{“rolls“:[“max“:6,“min“:1],“bonus_rolls“:6}]}
然后,额外的抽奖次数是这么算的:
额外的抽奖次数=(向下取整)幸运值x给出的数字
(如果欧皇来临,会......)
但是幸运效果在生存里好像只有在版本的几个快照里才能通过制箭师获得,而且获得的还是幸运之箭。
当然,和rolls一样,bonus_rolls也是可以随机的,当然随机获得的数也是要跟幸运值相乘的。比如:
{“pools“:[{“rolls“:[“max“:6,“min“:1],“bonus_rolls“:[“min“:1,“max“:10]}]}
但是如果你认为这一章就到此为止的话你就错了,大错特错。
因为接下来,作者将会讲:
条件
——第三段第七节:条件
因为条件太复杂,这里就先抽几个简单的讲。
当然,首先还是要创建一个条件文件夹:
{“pools“:[{“ndition“
}]}
现在,让我们创建第一个条件。
{“pools“:[{“ndition“[{}]}]}
在条件里最简单的,莫过于random_chance条件。
random_chance条件的作用是:随机生成一个0~1内的数,并检测是否小于给出的数,如果随机数小于指定数则成功。
这就像百分比,你给出的数越大,机率就越大(当然绝对不会超过100%)。
那就使用这个条件试试看:
{“pools“:[{“ndition“:[{“ndition“:“random_chance“}]}]}
这个条件里面必须有一个条件文件,写上random_chance。然后是写random_chance的参数:chance。这里作者假设为0.6(60%)。
{“pools“:[{“ndition“:[{“ndition“:“random_chance“,“chance“:0.6}]}]}
OK,这样子,这个随机池就有60%的机率执行。
当然,不止是随机池,设置战利品时也可以使用,设置函数时还可以使用,比如:
{“pools“:[{“ndition“:[{“ndition“:“random_chance“,“chance“:0.6}],“rolls“:1,“entries“:[{“type“:“item“,“name“:“diamond“,“ndition“:[{“ndition“:“random_chance“,“chance“:0.6}],“functions“:[{“function“:“set_unt“,“unt“:{“min“:1,“max“:7},“ndition“:[{“ndition“:“random_chance“,“chance“:0.6}]}]}
这样子,这个随机池有60%的机率启用,然后战利品又只有60%的机率获得,并且函数又只有60%的机率启动。如果三者都启动,那么机率为:60%x60%x60%=21.6%
不得不说这机率还挺大的。
——第四段:结束语
这一章终于要结束了,说实话,这是目前这本书内容最多的一章,但是,仍然只讲了战利品表的一半。如果全部讲完,估计本章字数都在向1万字狂奔了。作者省略的一部分,打算以后慢慢讲完,因为这一部分以后估计还会再次接触。
战利品表很牛,真的很牛,如果完全利用,作用甚至可以搞出类似于MOD的操作。因为战利品表就是Minecraft自带的玩法修改器,玩家可以自己修改玩法,来使自己获得自己规定的战利品。
战利品表其优势主要体现在以下几个方面:
1.抽奖。
地图。
3.自定义生存。
4.服务器玩法。
当然,个人认为抽奖方面会比较常用,因为真的特别好用。
如果你是基岩版玩家,想在基岩版搞个抽奖,估计十天半个月都搞不定。
因为如果不使用战利品表,使用传统的方法抽奖,建造者很苦,做出来的成品又不一定好。
所以.......战利品表这里的优势就突出来了。
这里作者说一下,迷你世界虽然也有自带的修改器,很好用,对吧。
其实,迷你世界的修改器≈我的世界的指令。
只不过迷你世界把它做得更简单,适合小学生;我的世界把它做得更高大上,适合成年人。
当然,这里可没有引战的意思。
但实际上,战利品表修改器和NBT修改器那比起来,简直是没法比。
作者相信,如果黑客来玩MC,MC的指令估计就会.......
OK这一章就到这里了,喜欢的可以投个推荐,点个收藏,然后再到书友圈打个卡。