# 给NPC设置睡觉的床

现在,我们已经有一个任劳任怨并且可以和我们交易的商人啦,但是!商人们只能工作不能休息也太惨了吧?所以我们需要让NPC们和玩家一样拥有自然的作息,而不是一个冷冰冰的NPC,这样也可以一定程度上增加游戏的代入感,让玩家更好的享受乐趣。

8

# 让NPC绑定属于自己的床

每个NPC都要有一个自己的床,不然他们就要开始互相抢床,导致混乱,这就麻烦了。我们只需要在NPC行为里面添加一个行为组件就行了。

"minecraft:dweller": {
    "dwelling_type": "village", //类型
    "dweller_role": "inhabitant", //角色(因为这张地图的NPC都是无职业的,如果想要添加给NPC添加职业,可以参考原版Villager_v2的行为组件)
    "update_interval_base": 20, //基础更新间隔
    "update_interval_variant": 10, //变种更新间隔
    "can_find_poi": true //是否可以寻找poi
}

进入到游戏中试一下,把NPC放在床的附近,当他和床同时发出绿色粒子的时候就成功啦!现在这个床就属于这个NPC了,当然我们玩家还是可以把他的床抢过来。

9

# 让NPC到床上睡觉

现在NPC已经有属于自己的床了,不过他们还不会去睡觉,接下来再加一个行为组件

"minecraft:behavior.sleep": {
    "speed_multiplier": 1.5, //去睡觉时的移动速度倍增
    "sleep_collider_height": 0.3, //睡觉时生物碰撞箱的高度
    "sleep_collider_width": 1.0, //睡觉时生物碰撞箱的宽度
    "sleep_y_offset": 0.6, //睡觉时生物Y轴的偏移量
    "timeout_cooldown": 10.0 //发生意外起床后,再过多长时间可以再次睡觉
}

添加这个行为组件后,生物就会跑去睡觉啦,当然别忘了留下可以移动的行为组件。

这里还有一个小问题,如果我们给生物添加基本的睡觉行为,那么当生物找到床以后不管是白天还是晚上都会一直睡觉,所以我们需要利用事件组件组配合,让NPC只有在晚上的时候才会睡觉。

有关components、events与component_groups三者之间的关系,可以参考往期教程:定义生物行为的三种结构 (opens new window)

首先我们添加一个可以检测时间的组件,分别在白天和晚上触发不同的事件:

"minecraft:scheduler": {
    "min_delay_secs": 0, //最小延迟数
    "max_delay_secs": 10, //最大延迟数
    "scheduled_events" : [ //调度事件
        {
            "filters": { //过滤器(第一个)
                "all_of": [ //满足所有条件
                    { "test": "hourly_clock_time", "operator": ">=", "value": 0 }, //当事件大于等于0时(代表白天开始了)
                    { "test": "hourly_clock_time", "operator": "<", "value": 12000 } //小于12000时(代表白天还没有结束)
                ]
            },
            "event": "minecraft:work" //触发事件"minecraft:work"
        },
        {
            "filters": { //过滤器(第二个)
                "all_of": [ //满足所有条件
                    { "test": "hourly_clock_time", "operator": ">=", "value": 12000 }, //大于等于12000(代表夜晚开始了)
                    { "test": "hourly_clock_time", "operator": "<", "value": 24000 } //小于24000(代表夜晚还没有结束)
                ]
            },
            "event": "minecraft:sleep" //触发事件"minecraft:sleep"
        }
    ]
},

加上这个行为组件后,白天的时候就会触发work的事件,晚上就会触发sleep的事件,接下来添加这两个事件,分别在触发work事件的时候让村民起床,在触发sleep事件的时候让村民睡觉。

"events": { //事件,所有的事件都放在这下面,和components(行为组件)在同一排
    
    "minecraft:sleep": { //当满足过滤器(第二个)时触发的事件
        "remove": { "component_groups": [ "villager_work" ] }, //移除"villager_work"组件组
        "add": { "component_groups": [ "villager_sleep" ] }
    }, //添加"villager_sleep"组件组
    
    "minecraft:work": { //当满足过滤器(第一个)时触发的事件
        "remove": { "component_groups": [ "villager_sleep" ] }, //移除"villager_sleep"组件组
        "add": { "component_groups": [ "villager_work" ] } //添加"villager_work"组件组
    }
}
"component_groups": { //组件组,触发事件后可随意移除和添加一组或多个组
    
    "villager_sleep": { //与事件一起看,当满足过滤器(第二个)时就会添加这个组件组,而这个组件组下只有一个组件,就是去睡觉
        "minecraft:behavior.sleep": {
            "priority": 3,
            "goal_radius": 1.5,
            "speed_multiplier": 1.5,
            "sleep_collider_height": 0.3,
            "sleep_collider_width": 1.0,
            "sleep_y_offset": 0.6,
            "timeout_cooldown": 10.0
        }
    },
    
    "villager_work": { //当满足过滤器(第一个)时就会添加这个组件组,并且移除睡觉的组件组,这时候生物就会起床,现在这个组件组里什么都没有,所以NPC起床后也没什么变化
        
    }
},

把上面的内容添加到NPC的行为文件里以后,我们的商人就会在白天起床,晚上去睡觉啦。进入游戏来看一下实际效果!

10