战利品列表 1.20 Fabric 长线教程计划
本篇教程的视频
本篇教程的源代码
GitHub地址:TutorialMod-LootTable-1.20.1
本篇教程目标
- 理解
战利品列表
文件基本格式
- 学会为模组方块添加
战利品列表
(掉落物
)
查看源文件
战利品列表的话,我们就不用去看源代码
了,不过得去看看原版的那些数据文件
这里我们就到外部库
中去找,外部库我在本系列的第一篇中就讲过
数据文件是在data下
面的,它下面有像advancement进度
、dimension维度
、recipe配方
、loot table战利品列表
、tag标签
等等各种各样的数据文件
本期教程我们就来看看原版的战利品列表文件,不过,在它下面,我们可以发现它又分为了archaeology考古
、blocks方块
、chests箱子
、entities实体
和gameplay游戏玩法
这几个
考古
的话,就是那些可疑的沙子
刷出来的战利品列表
箱子
则为各种遗迹
、各种结构
中随机生成的箱子中的物品
游戏玩法
上,比如钓鱼
、猪灵交易
等各种玩法生成的战利品
我们还是来看方块
的,以oak_planks
橡木木板为例,我们找到它
1 | { |
我们来看一下它的结构
type
是这个战利品列表的类型,方块一般就是minecraft:block
pools
是池
,里面就是掉落的物品,一般是一个
或者多个
物品;它里面的entries
就是掉落物,
这里掉落的是橡木木板
,type
是抽取项类型
,item
是生成单一
物品堆栈,name
是物品的名称;rolls
是抽取次数
,一般就抽一次
,所以是1.0
;bonus_rolls
是额外抽取次数
,一般就是0.0
,它是受玩家幸运值
(如时运
,钓鱼中的话还有海之眷顾
)影响,会增加额外抽取次数;conditions
是掉落物生成的条件,游戏中常规是生存模式
下或者是被爆炸
破坏,会生成掉落物,
因为我们一般在创造模式下破坏方块,是不会有掉落物的
整个pools
,简单一点,其实就是我们抽卡游戏中的那个卡池
,
只是这里如果只有一个物品,掉落概率为100%
random_sequence
是随机序列,一般就是文件名,这里就是oak_planks
基本的战利品列表就这些参数,不过还有更复杂的
我们再来看看copper_ore
铜矿石的
1 | { |
它中间的pools
比橡木木板的长得多了,我们分开来看
1 | { |
这是其中一个,其实我们如果不理解这一堆是啥,但是看到enchantment
和silk_touch
应该就知道了
silk_touch
就是精准采集
附魔,match_tool
是匹配工具
conditions
中的predicate
是谓词,它是用于判定某些对象或参数是否满足某种特性或条件的,这里就是附魔类型及其等级的条件
所以合起来,这个就是当我们用附有精准采集
的工具采集铜矿石是,掉落的不是粗铜,而是铜矿石本身
alternatives
是一个复合抽取项
中的抽取项类型,满足指定条件则会从列表中选择第一个
满足条件的子项,
这个列表指的是所有复合抽取项都展开之后的,这里会有铜矿石
和粗铜
,当采集工具不是附有精准采集
时,
铜矿石会从列表中剔除
,所以掉落的是粗铜;反之,因为抽取的第一个满足条件的,所以掉落的是铜矿石
我们再来看第二个,粗铜
的
1 | { |
这里多了functions
,这是物品修饰器,用于对抽取的物品进行一些修饰,比如修改物品的堆叠数量
它这里分了3
个部分,我们一个个来看
第一个是修饰物品掉落时的数量
,最大会掉落5
个,最小2
个,所以掉落数量是2~5
个
第二个是附魔
修饰器,enchantment是附魔类型,这里就是时运
,formula
是附魔公式,
其实这个也是按照玩家是否使用带有时运的工具来采集,修改最终掉落的数量
第三个是爆炸
修饰器,用于爆炸时掉落物的数量,爆炸时掉落物数量会衰减
,甚至可能没了
其他的参数可以到Wiki上查看,
这里就不再赘述了,可以研究的东西很多很多
编写战利品表
那么现在,我们就可以来编写我们自己的战利品表了
我们要在resources
文件夹下创建data/<modid>/loot_tables/blocks
文件夹,
文件夹的结构就和原版的一致
ICE ETHER BLOCK
1 | { |
ICE ETHER ORE
1 | { |
原本这个矿石的,应该也是要写成和铜矿石一样的,不过还是忘记了,我们在未来的数据生成
中再讲好了
RAW ICE ETHER BLOCK
1 | { |
测试
好,现在我们可以进入游戏测试一下了
很快,你就发现问题(如果你是完全按照我的教程来的),当我们挖掘ICE ETHER BLOCK
时,发现破坏很慢
,完了还没有掉落物
而另外两个可以正常掉落
现在,我们回过头来看看方块的注册
1 | public static final Block ICE_ETHER_BLOCK = register("ice_ether_block", new Block(AbstractBlock.Settings.copy(Blocks.STONE))); |
ICE ETHER BLOCK
是直接复制了STONE
的属性,其中就有一个requireTool
属性,它表示方块需要什么工具才能被破坏
而现在,我们并没有指定什么工具可以来破坏ICE ETHER BLOCK
,自然它破坏起来就很慢,因为什么东西都不是符合它的工具,同时战利品列表也不符合,就没有掉落物
Tag
这里我们就要看到另外一个东西,Tag
虽然关于Tag
教程在后面,不过我们这里还是简单介绍一下
Tag
是标签
,可以用来给方块
、物品
等东西归类
,方便一些方法上的判断,未来我们会详细地讲解
现在,我们溜到data/minecraft/tags/blocks
文件夹下,我们可以发现,有一个mineable
文件夹,
往下翻,还有needs_stone_tool
、needs_iron_tool
、needs_diamond_tool
这三个json
文件
mineable
里面又分了axe
、pickaxe
、shovel
、hoe
四个json
文件,
我们可以看到STONE
在pickaxe.json
中
不过,外面的三个文件中没有它
另外,再看到DIAMOND ORE
,它既在pickaxe.json
中,又在needs_iron_tool.json
中
结合起来,不难理解,石头
是必须要镐子
才能开采,不过任意等级
的都可以,而钻石矿
,必须用铁质
及以上的镐子才能开采
那么,mineable
中的,是指定方块可以被哪种工具挖掘,而`needs开头的,是指定方块需要什么等级的工具才能被挖掘
如果needs
开头的文件中,没有指定方块,那么就表示任意等级的工具都可以挖掘,最低木质
的就可以挖掘
编写Tag
现在,我们就可以来编写我们自己的Tag
了
值得注意的是,这个tag的命名空间只能是minecraft
,如果把它放在我们模组的命名空间下,是不会生效的
我们在data
下创建minecraft/tags/blocks
文件夹,然后创建mineable
文件夹,再创建pickaxe.json
文件,
外面再创建一个needs_iron_tool.json
文件
接下来我们往pickaxe.json
中写入以下内容
1 | { |
ICE ETHER ORE
在注册中我也加上了requireTool
,所以这里我们也写上
values
就是指定这个Tag包含的方块,这里我们指定了ICE ETHER BLOCK
和ICE ETHER ORE
replace
表示是否替换原版已有的Tag
,false
表示不替换,true
表示替换,当然我们不能把原版的换掉,不然原版的都失效了
接下来,我们往needs_iron_tool.json
中写入以下内容
1 | { |
这里我们指定了ICE ETHER ORE
,表示ICE ETHER ORE
需要铁质
及以上的镐子才能被挖掘
好,现在文件再一次进入游戏测试,发现ICE ETHER BLOCK
和ICE ETHER ORE
都可以正常破坏了,
而且掉落物也正常了