添加新的工作模式(中)
约 1582 字大约 5 分钟
2025-11-05
接下来,我们需要为每一种具体的工作模式附加 AI,以便让女仆能够执行我们期望的各项任务。
在这一部分,我们采用了原版 Brain AI 系统。下面将以女仆 AI 为例,简要介绍 Brain AI 系统的工作机制。
一、Brain 简介
女仆的 Brain 主类位于 MaidBrain.java。
1. 日程表(Schedule)
女仆会根据不同的时间段,依据日程表切换不同的活动(Activity),并执行相应的 AI 行为。
女仆支持三种日程表:白班模式、夜班模式 和 全天工作。
工作
执行各类工作模式 AI
06:00 ~ 18:00
娱乐
四处闲逛或使用娱乐方块
18:00 ~ 22:00
睡觉
寻找女仆床休息
22:00 ~ 06:00
工作
执行各类工作模式 AI
18:00 ~ 06:00
睡觉
寻找女仆床休息
06:00 ~ 14:00
娱乐
四处闲逛或使用娱乐方块
14:00 ~ 18:00
工作
全天工作,执行各类工作模式 AI
00:00 ~ 24:00
注意
女仆的日程表通常无需修改,且未开放修改接口。
2. 活动(Activity)
“工作”、“娱乐”、“睡觉”均属于活动(Activity)。此外,女仆在骑乘或被攻击后也会进入不同的活动状态。
每种活动下,女仆会执行一系列关联的 AI 行为:
| 活动名 | 说明 |
|---|---|
Activity.IDLE | 娱乐:闲逛、寻找娱乐方块等 |
Activity.WORK | 工作 执行 IMaidTask#createBrainTasks 方法中的 AI |
Activity.REST | 睡觉:寻找床休息 |
Activity.PANIC | 慌乱:受伤后四处逃窜。 若实现 IMaidTask#enablePanic 可避免工作时进入此状态 |
InitEntities.RIDE_IDLE.get() | 骑乘状态下娱乐,仅执行张望 AI |
InitEntities.RIDE_WORK.get() | 骑乘状态下工作 执行 IMaidTask#createRideBrainTasks 方法中的 AI |
InitEntities.RIDE_REST.get() | 骑乘状态下睡觉,默认无 AI 行为 |
3. 核心活动(Activity.CORE)
Activity.CORE 是所有活动的基础,其 AI 行为在任意活动中都会执行。核心 AI 行为举例:
| 名称 | 说明 |
|---|---|
MaidSwimJumpTask | 水面跳跃 |
MaidBreathAirTask | 氧气不足时寻路至可呼吸位置 |
MaidBreathAirStopTask | 完成呼吸后返回 |
MaidClimbTask | 爬梯子 |
LookAtTargetSink | 看向目标。只要有 AI 设置了 LOOK_TARGET,即会执行 |
MaidPanicTask | 受伤后进入慌乱状态 |
MaidAwaitTask | 检查 WALK_TARGET 是否在范围内,否则清除 |
MaidInteractWithDoor | 与门交互 |
MoveToTargetSink | 寻路至目标。有 WALK_TARGET 时会执行 |
MaidFollowOwnerTask | 跟随主人(Home 模式关闭时) |
MaidFollowOwnerVehicleTask | 玩家骑乘实体时一同跟随,玩家离开实体则女仆也离开 |
MaidHealSelfTask | 血量不足时自动进食回血 |
MaidPickupEntitiesTask | 拾取附近掉落物 |
MaidClearSleepTask | 停止睡觉。用于活动切换时处理残留问题(如进入工作但还躺床上) |
4. 记忆(MemoryModuleType)
许多复杂功能需拆分为多个 AI 行为,通过记忆(MemoryModuleType)来实现数据共享。
以“攻击敌对生物”为例,通常拆分为“寻找目标”、“靠近目标”、“攻击目标”三个行为。“寻找目标”行为需为后两个行为提供共享数据,这正是记忆的作用。
女仆模组默认注册了多个 MemoryModuleType,例如:
| 名称 | 说明 |
|---|---|
PATH | 路径,缓存女仆的寻路路径 |
DOORS_TO_CLOSE | 需关闭的门的坐标,用于 MaidInteractWithDoor |
LOOK_TARGET | 女仆凝视的对象。有数据时会执行 LookAtTargetSink 行为 |
NEAREST_HOSTILE | 最近的敌对生物,主要用于攻击相关 AI |
HURT_BY | 女仆最后一次受到的伤害类型(DamageSource) |
HURT_BY_ENTITY | 女仆最后一次伤害的施加者 |
CANT_REACH_WALK_TARGET_SINCE | 行进目标时的计时,用于超时判断 |
WALK_TARGET | 女仆行进目标。有数据时会执行 MoveToTargetSink 行为 |
ATTACK_TARGET | 女仆打算攻击的对象,用于攻击相关 AI |
ATTACK_COOLING_DOWN | 布尔值,缓存女仆是否处于攻击冷却状态 |
InitEntities.TARGET_POS.get() | 女仆的工作目标点,多用于设置不同的工作目标点 |
MemoryModuleType 不一定需要注册才能使用,但部分 AI 行为会检测注册情况,否则不会启用。
记忆可方便地添加、清除,并支持超时时间设置。
// 设置记忆,无超时时间
maid.getBrain().setMemory(MemoryModuleType.WALK_TARGET, walktarget);
// 设置记忆,超时时间为 100 tick
maid.getBrain().setMemoryWithExpiry(MemoryModuleType.WALK_TARGET, walktarget, 100);
// 清除记忆
maid.getBrain().eraseMemory(MemoryModuleType.WALK_TARGET);
// 获取记忆数据
maid.getBrain().getMemory(MemoryModuleType.WALK_TARGET)此外,Minecraft 提供了便捷工具设置记忆,这些方法位于 net.minecraft.world.entity.ai.behavior.BehaviorUtils:
BehaviorUtils#setWalkAndLookTargetMemories:同时设置WALK_TARGET和LOOK_TARGETBehaviorUtils#lookAtEntity:仅设置LOOK_TARGETBehaviorUtils#lookAtEachOther:让两个生物相互设置LOOK_TARGET
5. 传感器(SensorType)
计算机没有人的感官,要让女仆实时感知周围环境,最佳方式是定时扫描周围生物,为后续 AI 行为提供数据。传感器(SensorType )会定时执行,收集信息并存入 MemoryModuleType。
女仆模组自带以下传感器(默认 20 tick 检索一次):
| 名称 | 说明 |
|---|---|
MAID_NEAREST_LIVING_ENTITY_SENSOR | 检索范围由 IMaidTask#searchDimension 决定。检索结果为 LivingEntity 及其子类,按距离排序。所有生物存入 NEAREST_LIVING_ENTITIES,可见生物存入 NEAREST_VISIBLE_LIVING_ENTITIES |
HURT_BY | 记录女仆最近一次伤害,存入 HURT_BY。若由 LivingEntity 造成,同时存入 HURT_BY_ENTITY |
MAID_HOSTILES_SENSOR | 从 NEAREST_VISIBLE_LIVING_ENTITIES 提取最近的敌对生物,存入 NEAREST_HOSTILE |
MAID_PICKUP_ENTITIES_SENSOR | 每 30 tick 检索,范围由女仆工作范围决定,高度为 4。 所有可拾取实体(默认为物品、箭、经验球、P 点)存入 VISIBLE_PICKUP_ENTITIES |
二、如何自定义女仆的 Brain 数据
如果你想为女仆添加自定义 Brain 数据(如新增 SensorType、注册 MemoryModuleType,或为不同 Activity 添加 AI 行为),可按如下方法操作:
首先,创建一个类继承自 IExtraMaidBrain:
public class CustomExtraMaidBrain implements IExtraMaidBrain {
@Override
public List<MemoryModuleType<?>> getExtraMemoryTypes() {
// 仅作演示,返回空列表
return Collections.emptyList();
}
@Override
public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> getCoreBehaviors() {
// 仅作演示,返回空列表
return Collections.emptyList();
}
}IExtraMaidBrain 提供多个可复写方法,可扩展 SensorType、MemoryModuleType,或为不同 Activity 添加额外 AI 行为。
最后,在 LittleMaidCompat 中注册:
@LittleMaidExtension
public class LittleMaidCompat implements ILittleMaid {
@Override
public void addExtraMaidBrain(ExtraMaidBrainManager manager) {
// 为 Brain 添加自定义内容
manager.addExtraMaidBrain(new CustomExtraMaidBrain());
}
}