4 自定义Loot Table


(本章参考了Minecraft 原版模组入门教程 - 战利品表(作者ruhuasiyu))

KubeJS目前能修改全局、方块、实体、猫或村民礼物(村庄英雄Buff)、钓鱼、宝箱战利品表

基本的方法名称如下

事件ID覆盖原有战利品表的方法名称修改战利品表的方法名称

generic.loot_tables

addGeneric

modify

block.loot_tables

addBlock

modifyBlock

entity.loot_tables

addEntity

modifyEntity

gift.loot_tables

addGift

modify

fishing.loot_tables

addFishing

modify

chest.loot_tables

addChest

modify

下面就下面5种的战利品表进行讲解。


0、基本格式

onEvent('事件ID', event => {
  event.覆盖/修改原有战利品表方法名称('物品/实体注册名', table => {
  	//修改内容
  }
  
  //table.clearPools()//清空所有随机池
  //table.clearConditions()//清空条件
  //table.clearFunctions()//清空函数
})

1、方块战利品表(block.loot_tables)

针对方块战利品表,KubeJS提供了很简单的添加单方块掉落物的方法。

onEvent('block.loot_tables', event => {
  event.addSimpleBlock('minecraft:dirt', 'minecraft:red_sand')//覆盖泥土的战利品表并使泥土掉落红沙
  event.addSimpleBlock('minecraft:oak_leaves')//覆盖橡树树叶的战利品表并使橡树树叶在破坏时掉落自身
})

如果你想要实现更复杂的修改,你需要使用随机池。KubeJS提供了一些简写方法,具体见下方例子。

onEvent('block.loot_tables', event => {
  event.addBlock('minecraft:dirt', table => {
    table.addPool(pool => {//新建随机池(覆盖原有的)
      pool.rolls = 1 // 固定值
      // pool.rolls = [4, 6] // 也可写为 {min: 4, max: 6} // 抽奖次数∈[4,6]
      // pool.rolls = {n: 4, p: 0.3} // 二项分布
      //以上两种值的表达方式为值提供器
      pool.addItem('minecraft:dirt')
      //pool.addItem('minecraft:dirt', 40) // 此处40为权重
      //pool.addItem('minecraft:dirt', 40, [4, 8]) // 物品个数∈[4,8]
      // pool.addCondition({json}) //json格式,抽取该物品需要满足的条件,原版数据包格式(具体使用情景详见14.1)
      // pool.addEntry({json})//json格式,项目类别
    })
  })
})

注:修改方块战利品表(而不是覆盖)的示例详见14.1

2、实体战利品表(entity.loot_tables)

onEvent('entity.loot_tables', event => {
  // 覆盖僵尸的战利品表,掉落5个物品(25%概率为胡萝卜,75%为苹果)
  event.addEntity('minecraft:zombie', table => {
    table.addPool(pool => {
      pool.rolls = 5//抽5次奖
      pool.addItem('minecraft:carrot', 1)
      pool.addItem('minecraft:apple', 3)
    })
  })
  
  event.modifyEntity('minecraft:pig', table => {
    table.addPool(pool => {
      // 修改猪的战利品表,使在被玩家杀死时多掉落一个泥土
      // 注:只是修改战利品表。并不会覆盖原有的掉落生/熟猪肉的战利品表
      pool.addItem('minecraft:dirt')
      pool.killedByPlayer()
    })
  })
})

注:对于gift.loot_tablesfishing.loot_tableschest.loot_tables,只能使用addJson(物品注册名, json原版格式)来进行修改

3、常用表达方式

      /*
      	在新建/修改随机池时,还有以下表达方式可用:
      	以下值提供器与上述的表示方法相同
      	pool.enchantRandomly(附魔注册名)// 随机附魔
      	pool.enchantWithLevels(附魔等级(值提供器), 是否为宝藏(布尔值))// 指定等级和是否为宝藏的随机附魔
      	pool.name(name as Text)// 指定名称
      	pool.damage(掉落物耐久值(值提供器))// 修改掉落物耐久值
      	pool.randomChance(掉落概率(double型))// 修改掉落概率
      	pool.randomChanceWithLooting(掉落概率(double型), 倍率(double型))// 使用该表达方式时,抢夺或时运会对掉落物有影响
      	pool.furnaceSmelt()// 使当前随机池掉落的物品掉落形式为经过熔炉烧炼(自动烧炼)
      	pool.killedByPlayer()// 添加条件:实体被玩家杀死才会掉落
      	pool.survivesExplosion()// 添加条件:方块被爆炸破坏时依旧掉落
      	//以上方法也可以用于对Loot Table直接修改(例如table.name(name as Text)),具体使用见14.1
      */