本帖最后由 乾.坤 于 2015-10-28 19:31 编辑

大家好,我是The Minecraft Lover小组的乾坤,LootTable在43c又有了一些改进,我就来概述一下新的内容以及关于它的具体运用。
首先比较重要的一点是:LootTable现在可通过在存档中增加文件来代替之前修改.jar的做法:

(英文Minecraft Wiki)


(中文Minecraft Wiki,另外说一句,这次中文的Wiki跟进速度比以往快很多,感谢各位翻译者做出的努力)
举个例子:


在上面的路径中,大家可以看到,这些文件都位于地图文件(Test for Loot Table)\data\loot_tables\test 文件夹内,那这些文件就可以在游戏中被读取了:



  1. /summon Zombie ~ ~ ~ {DeathLootTable:test:test1}
复制代码




  1. /blockdata ~ ~1 ~ {LootTable:test:test2}
复制代码


读取的方式详见上面的Wiki截图,还有一点:
命名空间名字可以为minecraft或者是自定义的名字。如果该文件夹的名字为minecraft,minecraft就会用里面的文件来取代.jar的loot_tables里的特定可抢夺物品表(存档/data/loot_tables/minecraft路径等于.jar里的assets/minecraft/loot_tables/,同路径和名字的可抢夺物品表会取代.jar里相对的文件)比如存档里的data/loot_tables/minecraft/entities/zombie.json就会被认作预设的僵尸可抢夺物品表,地图中所有僵尸都会根据该表掉落。而存档里的data/loot_tables/除minecraft以外的命名空间/zombie.json或者是data/loot_tables/minecraft/zombie.json也不会替换掉预设的可抢夺物品表,而是需要用NBT标签来指定实体使用此自定义的可抢夺物品表。
------中文Minecraft Wiki

可见,也可通过修改存档文件达到覆盖.jar掉落表的目的,本文不再赘述。
----------------------------------------------------------------分割线---------------------------------------------------------------------------------
另外还有一些需要引起注意的地方:


这里重点讲一下set_damage(这个中文Wiki还未更新):


其实这个选项也是一个懒人选项,同样提供两种选择,一种是固定数值,一种是范围数值,这个选项用于设定工具的耐久值,值得一提的是,耐久值在此标签内以百分值计算,方便了懒人,1.0代表满耐久,0.0代表无耐久,min和max均为其耐久值的剩余百分比。
还有一点:


functions: 决定了对这个物品进行的特殊举动。如果没有被设置,它将不会被使用。必须顺序排放,比如looting_enchant必须放在set_count之后以正常运作。
-----中文Minecraft Wiki

而这个顺序就是排列表上的功能顺序,可参考SYL的LootTables翻译和实例讲解及Wiki,这里有个错误例子(当时还没更新43c时我编写的):
  1. {
  2.     "pools": [
  3.         {
  4.             "rolls": 3,
  5.             "entries": [
  6.                 {
  7.                                         "type":"item",
  8.                     "name": "minecraft:iron_ingot",
  9.                     "weight": 5,
  10.                     "functions": [
  11.                         {
  12.                             "function": "set_count",
  13.                             "count": {
  14.                                 "min": 1,
  15.                                 "max": 3
  16.                             }
  17.                         },
  18.                         {
  19.                             "function": "looting_enchant",
  20.                             "count": {
  21.                                 "min": 1,
  22.                                 "max": 3
  23.                             }
  24.                         }
  25.                     ]
  26.                 },
  27.         {
  28.                                         "type":"item",
  29.                     "name": "minecraft:diamond_sword",
  30.                     "weight": 1,
  31.                                         "conditions":
  32.                 [
  33.                         {
  34.                                 "condition": "killed_by_player"
  35.                         }
  36.                 ],:
  37.                     "functions": [
  38.                         {
  39.                             "function": "set_count",
  40.                             "count": {
  41.                                 "min": 0,
  42.                                 "max": 1
  43.                             }
  44.                         },
  45.                                                 {        
  46.                                                         "function":"enchant_with_levels",
  47.                                                         "levels":{
  48.                                                                 "min":15,
  49.                                                                 "max":30
  50.                                                         },
  51.                                                         "conditions":[
  52.                                                                 {
  53.                                                                 "condition":"random_chance_with_looting",
  54.                                                                 "chance":0.02,
  55.                                                                 "looting_multiplier":0.02        
  56.                                                                 }
  57.                                                         ]                                                                                                                        
  58.                                                 }
  59.                     ]
  60.                 }
  61.             ]
  62.         }
  63.     ]
  64. }
复制代码

而这里就没有按照顺序编写,导致此function失效(注意,格式编写错误会导致全部失效,而function顺序错误仅导致此function失效
还有一个细节补充一下,大部分条件不适用于箱子调用Loot Table,比如killed_by_player,大多数标签无法使用的原因都是因为不存在玩家(生物)攻击箱子这一行为。
=================================分割线============================
就此,一些新版本的特性应该也讲的差不多了,现在来看看如何动手DIY这个神奇的玩意
我先来抛砖引玉:(下面是两段Loot Table代码,大家可以自己玩玩看)
仅适合实体的Loot Table:
  1. {"pools":[{"rolls":{"min":3,"max":3},"entries":[{"type":"item","name":"minecraft:iron_ingot","weight":5,"functions":[{"function":"looting_enchant","count":{"min":1,"max":3}},{"function":"set_count","count":{"min":0,"max":2}}]},{"type":"item","name":"minecraft:diamond_sword","weight":1,"functions":[{"function":"enchant_with_levels","treasure":false,"levels":{"min":20,"max":30},"conditions":[{"condition":"random_chance_with_looting","chance":0.05,"looting_multiplier":0.03}]},{"function":"set_count","count":{"min":1,"max":1}},{"function":"set_damage","damage":{"min":0,"max":0.25}}],"conditions":[{"condition":"killed_by_player","inverse":false}]}]}]}
复制代码





适合箱子的代码(也适用于实体):

  1. {"pools":[{"rolls":{"min":3,"max":5},"entries":[{"type":"item","name":"minecraft:diamond","weight":2,"functions":[{"function":"set_count","count":{"min":1,"max":3}}]},{"type":"item","name":"minecraft:cookie","weight":5},{"type":"item","name":"minecraft:enchanted_book","weight":2,"functions":[{"function":"set_nbt","tag":"{StoredEnchantments:[{lvl:3s,id:35s}]}"}]},{"type":"item","name":"minecraft:iron_pickaxe","weight":3,"functions":[{"function":"enchant_with_levels","treasure":false,"levels":{"min":10,"max":30}},{"function":"set_damage","damage":{"min":0,"max":1}}]},{"type":"item","name":"minecraft:iron_ingot","weight":6}]}]}
复制代码




模拟出了一种自然生成的感觉(虽然比自然生成的好一些233)


具体内容我就不多说了,这两组代码也算是做了一个如何自定义的范例吧。
==========================分割线================================
接下来说说如何给Loot Table添加额外的启动条件:
实体类(玩家杀死实体以后要满足某个与杀和被杀双方无关的Scoreboard的值是否满足条件,不满足就不掉指定物品)
思路:给要被杀死的怪物一个自定义掉落物----探测是否存在这种掉落物----如果存在,即探测分数是否满足条件---若符合条件,则entitydata原掉落物品为想要玩家获得的掉落物(若不符合,则不执行)----杀死原标记掉落物---结束系统

至于箱子也有类似之处,大家可以自己想一想,我就不多说了,接下来做个总结:
Loot Table 作为可被调用的游戏文件,大大简化了地图作者的工作量,而且带来了很多新的看点,例如可以做像雪屋一样的天然建筑(Loot Table和CB配合),当然,Loot Table用途肯定不止于此,我还有很多相关内容没有研究,总之,Loot table前途一片光明,让我们继续期待Mojang的新特性(bug)吧!

=====================分割线================================
感谢好友:@pca006132 @kongbaiyo @syl 等 对我的帮助和建议
以及The Minecraft Lover 小组(@lzs1234 @握地师兄 @10 等)提供的技术支持
感谢各位浏览本帖
来自群组:The Minecraft Lover