动物吃什么

动物吃什么

使用JSON配置动物繁殖食物和玩家持有的诱饵,支持热重载、KubeJS脚本,以及每个实体的持久覆盖。

农业

动物吃什么

动物吃什么模组允许整合包作者通过简单、可读的 JSON 配置文件自定义动物的繁殖食物和玩家手持的吸引物。

特性

  • 使用 what_animals_eat_food.json 配置繁殖食物。
  • 使用 what_animals_eat_attractant.json 配置玩家手持吸引物。
  • 支持为一种动物配置多种物品。
  • 支持物品 ID、物品标签和 KubeJS 物品堆栈。
  • 服务器启动时自动生成默认配置。
  • 自动将新注册的动物实体追加到现有的 JSON 文件中。
  • 保留现有的实体条目和自定义物品列表。
  • 使用 /reload 应用配置更改。
  • 通过 KubeJS 立即修改规则。
  • 将每实体的覆盖规则存储在持久化的实体 NBT 中。
  • 提供喂食前和喂食后的 KubeJS 事件。
  • 适用于 Minecraft Forge 1.20.1 和 NeoForge 1.21.1。

配置

食物配置:

config/what_animals_eat_food.json

吸引物配置:

config/what_animals_eat_attractant.json

示例:

{
  "minecraft:cow": [
    "minecraft:apple",
    "minecraft:golden_carrot"
  ],
  "minecraft:chicken": [
    "#minecraft:seeds"
  ],
  "*": [
    "minecraft:beetroot"
  ]
}

每个键是一个实体 ID,每个值是一个物品 ID 数组。使用 * 为所有支持的动物定义规则。使用 #tag_id 引用物品标签。

食物规则会替换动物的默认繁殖食物。吸引物规则定义玩家手持哪些物品时动物会跟随他们。

编辑任一 JSON 文件后运行 /reload 即可应用更改,无需重启服务器。

自动配置更新

当服务器启动时,模组会扫描注册的动物实体并检测它们的默认繁殖食物和吸引物。

如果新安装的模组添加了具有可检测默认规则的动物,其实体 ID 将自动以检测到的默认值追加到适当的 JSON 文件中。现有的实体条目和自定义物品列表永远不会被覆盖。

旧的 what_animals_eat.json 和 what_animals_eat-common.toml 文件会在可能的情况下迁移到 what_animals_eat_food.json。

KubeJS 示例

将脚本放在 server_scripts 文件夹中。

更改繁殖食物

// 更改每头牛的繁殖食物。
WhatAnimalsEat.setBreedingFoods(
  'minecraft:cow',
  ['minecraft:apple', 'minecraft:golden_carrot']
)

// 为每头猪添加甜菜根作为额外的繁殖食物。 WhatAnimalsEat.addBreedingFood( 'minecraft:pig', 'minecraft:beetroot' )

更改吸引物

// 更改吸引每头牛的物品。
WhatAnimalsEat.setAttractant(
  'minecraft:cow',
  ['minecraft:apple', 'minecraft:golden_carrot']
)

// 为每头猪添加甜菜根作为吸引物。 WhatAnimalsEat.addAttractant( 'minecraft:pig', 'minecraft:beetroot' )

修改单个实体

传递 event.animal 只会更改被喂食的那个个体实体。覆盖规则存储在实体的持久化 NBT 中,并在世界保存和服务器重启后仍然有效。

WhatAnimalsEatEvents.afterAnimalFed(event => {
  console.log(
    event.player.name +
    ' fed ' +
    event.animal.id +
    ' with ' +
    event.item.id
  )

// 仅更改此个体动物。 WhatAnimalsEat.setBreedingFoods( event.animal, ['minecraft:apple', 'minecraft:golden_carrot'] )

// 仅此个体动物会被甜菜根吸引。 WhatAnimalsEat.setAttractant( event.animal, ['minecraft:beetroot'] ) })

传递实体 ID 字符串会更改该类型的所有实体。传递动物实体对象只会更改该个体实体。

喂食前后事件

WhatAnimalsEatEvents.beforeAnimalFed(event => {
  console.log(
    'Player ' + event.player.name +
    ' is feeding ' + event.animal.id +
    ' with ' + event.item.id
  )

// 必要时取消喂食操作。 // event.cancel() })

WhatAnimalsEatEvents.afterAnimalFed(event => { console.log( 'Player ' + event.player.name + ' fed ' + event.animal.id + ' with ' + event.item.id ) })

喂食事件提供:

  • event.player:正在喂食实体的玩家。
  • event.animal:被喂食的动物。
  • event.item:正在使用的物品。

移除或重置规则

// 从每头猪中移除一种繁殖食物。
WhatAnimalsEat.removeBreedingFood(
  'minecraft:pig',
  'minecraft:carrot'
)

// 重置单个繁殖食物覆盖规则。 WhatAnimalsEat.resetBreedingFoods(event.animal)

// 重置单个吸引物覆盖规则。 WhatAnimalsEat.resetAttractant(event.animal)

// 读取当前生效的规则。 console.log(WhatAnimalsEat.getBreedingFoods('minecraft:cow')) console.log(WhatAnimalsEat.getAttractants('minecraft:cow'))

KubeJS 的更改会立即应用到当前服务器。个体实体覆盖规则存储在持久化的实体 NBT 中,而 JSON 文件包含实体类型的默认规则。