尼古拉NPC

尼古拉NPC

NicolaiNPC添加了可自定义的游荡村民,具有可配置的变体、交易和生成。

怪物

NicolaiNPC 为 Minecraft 添加了一个独特的漫游 NPC,具有可自定义的变体、可配置的交易、特殊能力以及自然生成功能。

Nicolai

Nicolai 是一个自定义 NPC,其行为方式与流浪商人相似,但拥有自己独特的个性和机制。Nicolai 比流浪商人更好吗?嗯,他没有羊驼,所以也许……

特性:

  • 自定义村民风格 NPC
  • 可配置变体
  • 可配置交易
  • 自然生成
  • 自定义生成条件
  • 独特能力
  • 自定义动画
  • 自定义音效
  • 自定义死亡掉落物
  • 多人游戏兼容
  • 交易支持模组物品
  • 游戏内配置重载

变体

Nicolai 可以有多种可配置的变体,每种变体都有自己的外观、生成条件和交易池。

变体可以控制:

  • 外观
  • 围裙颜色
  • 生成条件
  • 生命周期
  • 交易池

可以通过 JSON 配置文件创建和修改变体,允许整合包通过复制 default.json 并调整其值来轻松自定义 Nicolai。

更多详情请参阅“配置”部分。

自然生成

Nicolai 可以根据可配置的生成规则在世界各地自然生成。

  • 可配置的生成几率
  • 未成功生成后几率会增加
  • 每个玩家可拥有的 Nicolai 最大数量可配置
  • 玩家越多,生成尝试越频繁
  • 支持不同维度
  • 可配置的生物群系、维度、结构和其他生成条件
  • 可配置的 Nicolai 生命周期

交易

Nicolai 使用 Minecraft 的标准交易系统,允许交易支持原版和模组物品。

每个变体可以有自己的可能交易池,并可配置:

  • 交易选择
  • 交易权重
  • 提供的交易数量
  • 重复交易预防
  • 物品数量
  • 最大交易次数
  • 主要和次要花费

命令

NicolaiNPC 提供了几个用于测试和配置的命令:

  • /nicolaimod reload — 重新加载 Nicolai 配置
  • /nicolaimod list — 列出可用的变体
  • /nicolaimod summon <变体id> — 召唤特定变体
  • /nicolaimod getodds — 在玩家位置显示自然生成概率
  • /nicolaimod dospawnevent — 强制进行一次自然生成尝试
  • /nicolaimod dospawneventhere — 在玩家位置强制进行一次自然生成尝试

配置

变体配置指南:

NicolaiNPC 的设计具有高度可配置性。放置在以下目录中的每个 JSON 文件:

config/nicolainpc/variants/

定义了一个 Nicolai 变体。

默认配置会自动创建为:

config/nicolainpc/variants/default.json

您可以通过复制默认文件并更改其值来创建额外的变体。

每个变体有五个主要部分:

  • id — 变体的唯一标识符
  • appearance — 控制变体的外观
  • spawn — 控制自然生成和变体条件
  • conditions — 控制可能的生成位置
  • trades — 控制变体的可能交易

请参考 default.json 示例来查看总体结构。

null 值意味着忽略限制。也就是说,该规定对任何情况都适用。


"id": "<在此处插入id>" 所有 Nicolai 变体都需要一个唯一的 id。该 id 会在它们生成时显示在名称标签上。因此,'farmer' 的 id 将会生成一个名为 'farmer nicolai' 的 NPC。


"apron_color": "<在此处插入十六进制颜色代码>" 您只能通过提供十六进制颜色代码来控制围裙颜色。默认值是 #000000,会生成黑色围裙。


"enabled": <插入 true/false> 使用这个选项,您可以在不删除 JSON 文件的情况下禁用一个变体。

"bucket": "<插入 common/rare/exotic>" 有三个桶。当触发生成时,会先随机抽取一个桶,然后才选择变体。这些名称应该相对不言自明。将常见变体放入 common 桶,依此类推。

"bucketweight": <插入大于 1 的任何数字> 这决定了在单个桶内选择某个特定变体的几率。权重为 10 的变体被选中的几率是权重为 2 的变体的 5 倍。这仅影响同一桶内变体的选择。

"lifetime": <插入游戏刻计数器> 生命周期决定了 Nicolai 在消失前会存在多长时间。默认值是 48000。这相当于两个 Minecraft 日,也是流浪商人存在的时长。


"dimensions": [插入维度值] 这决定了该变体可以在哪些维度生成。可能的值如:["minecraft:overworld", "minecraft:the_nether"]

"biomes": [插入生物群系值] 这决定了该变体可以在哪些生物群系生成。可能的值如:["minecraft:plains", "minecraft:forest"]

"structures": [[插入结构, 插入方块距离]] 这决定了变体生成点需要距离某个结构多近。当列出多个结构时,只需要其中一个在范围内即可满足此要求。建议将限制较低的结构/范围放在前面。可能的值如:[["minecraft:village_plains", 64], ["minecraft:village_desert", 32]]

"minY": <插入生成位置允许的最低高度> 这决定了生成高度的最低范围。值为 30 将阻止此变体在 Y 轴 29 或更低的高度生成。可能的值如:-30

"maxY": <插入生成位置允许的最高高度> 这决定了生成高度的最高范围。值为 30 将阻止此变体在 Y 轴 31 或更高的高度生成。可能的值如:52。

"minLight": <插入生成位置允许的最低光照等级> 这决定了生成位置可接受的最低光照量。值为 3 将阻止此变体在光照等级 2 或更低的位置生成。可能的值如:7。

"maxLight": <插入生成位置允许的最高光照等级> 这决定了生成位置可接受的最高光照量。值为 5 将阻止此变体在光照等级 6 或更高的位置生成。可能的值如:10。

"time": [插入时间范围开始, 插入时间范围结束] 这决定了该变体可以生成的时间范围。一天是 24000 游戏刻。作为参考,日出大约是 1000,正午是 6000,夜晚是 13000,午夜是 18000。若要让此变体在夜晚到第二天正午之间生成,则需要此值:[13000, 6000] 相反,[6000, 13000] 则只会在正午到日落之间生成该变体。

"weather": [插入天气] 这决定了该变体生成所需的天气类型。请注意,雷暴和降雨是不同的天气。如果您希望一个变体在两者期间都能生成,请将两者都包括在内。可能的值如:["clear", "rain"]


"count": <在此处插入交易数量> 这决定了该变体将拥有的交易数量。如果您将其设置为 7,而交易池中只有 7 个可能的交易,那么每次 Nicolai 生成时都会选择所有 7 个。如果池中有 14 个,则会随机选择 7 个。

"allow_duplicates": <插入 true/false> 这决定了一个变体是否可以多次展示同一个交易。如果设置为 true 并且交易数量设置为 7,那么理论上是可能连续 7 次选择同一个交易,即使交易池中有其他交易。


交易池结构:

"weight": <插入大于 0 的数字> 这决定了当变体生成时,某个交易从交易池中被选中的可能性。权重为 10 的交易被选中的可能性是权重为 5 的交易的两倍,是权重为 20 的交易的一半。

"cost": [插入要支付的物品, [数量下限范围, 数量上限范围]] 这决定了第一个栏位支付的物品。根据 Minecraft 交易逻辑,此项不能为空。可能的值如:["minecraft:emerald", [1, 3]]。但如果您不希望数量有范围,另一个有效的条目也可以是 ["minecraft:emerald", 2]。

"cost2": [插入要支付的物品, [数量下限范围, 数量上限范围]] 与常规花费相同,但用于第二个栏位。可以设置为 null 表示没有次要花费。

"result": [插入要获得的物品, [数量下限范围, 数量上限范围]] 这决定了交易中获得的物品。根据 Minecraft 交易逻辑,此项不能为空。

"max_uses": <插入大于 0 的数字> 这决定了一个交易可以被玩家完成多少次,直到交易变灰。设置为 null 以允许无限交易。

default.json 示例

{
    "id": "default",

    "appearance": {
        "apron_color": "#000000"
    },

    "spawn": {
        "enabled": true,
        "bucket": "common",
        "bucketWeight": 1,
        "lifetime": 48000,

        "conditions": {

            "dimensions": null,
            "biomes": null,
            "structures": null,
            "minY": null,
            "maxY": null,
            "minLight": null,
            "maxLight": null,
            "time": null,
            "weather": null

        }
    },

    "trades": {
        "count": 3,
        "allow_duplicates": false,

        "pool": [

            {
                "weight": 10,
                "cost": ["minecraft:emerald", [1, 3]],
                "cost2": null,
                "result": ["minecraft:bread", [8, 15]],
                "max_uses": 3
            },

            {
                "weight": 10,
                "cost": ["minecraft:emerald", [3, 6]],
                "cost2": null,
                "result": ["minecraft:cooked_beef", [9, 18]],
                "max_uses": 3
            },

            {
                "weight": 10,
                "cost": ["minecraft:emerald", [5, 8]],
                "cost2": null,
                "result": ["minecraft:golden_carrot", [10, 20]],
                "max_uses": 3
            }

        ]
    }
}