添加新的工作模式(上)
约 1124 字大约 4 分钟
2025-11-05
女仆可以完成各种各样的工作,这也是女仆模组最为核心的功能。为此,我们设计了一套功能全面的 API,方便第三方模组拓展并添加新的工作模式。
工作模式基于原版全新的 Brain AI 系统,这套 AI 系统功能丰富、性能优越,并且让编写复杂 AI 变得更加便捷。后续章节中,我们会详细介绍这套系统的原理与实践。
一、注册一个新的工作模式
工作模式的基础接口是 IMaidTask,这个接口适用于大多数普通工作模式。此外,还有 IAttackTask(用于攻击型任务)、IFarmTask(用于种田相关任务)、IRangedAttackTask(用于远程攻击任务)等专用接口。
下面以继承 IMaidTask 的工作模式为例,演示如何自定义一个任务:
public class CustomTask implements IMaidTask {
// 任务 ID,用于区分不同的任务
private static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(Example.MOD_ID, "custom_task");
// 任务图标,这里使用苹果作为示例
private static final ItemStack ICON = Items.APPLE.getDefaultInstance();
// 获取任务的 ID
@Override
public ResourceLocation getUid() {
return UID;
}
// 获取任务的图标
@Override
public ItemStack getIcon() {
return ICON;
}
// 获取女仆在该任务时的音效,可以为 null
@Override
@Nullable
public SoundEvent getAmbientSound(EntityMaid maid) {
return null;
}
// 创建女仆 AI,通过 Minecraft 原版的 BehaviorControl 实现
@Override
public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createBrainTasks(EntityMaid maid) {
// 返回一个空的任务列表,表示没有自定义 AI 行为
return List.of();
}
}然后,在 LittleMaidCompat 里注册该工作模式:
@LittleMaidExtension
public class LittleMaidCompat implements ILittleMaid {
// 注册女仆工作任务的方法
@Override
public void addMaidTask(TaskManager manager) {
// 添加自定义任务
manager.add(new CustomTask());
}
}当然,别忘了为你的工作模式添加语言文件。语言文件的 key 以你前面设定的任务 ID 转换而来:
{
"task.example.custom_task": "Custom Task",
"task.example.custom_task.desc": "Custom Task Desc"
}现在,打开游戏,进入女仆的工作模式切换界面,你就能看到自定义的工作模式啦!
二、设置更多内容
有关 AI 实现的细节我们会在后续章节介绍。这里先简单说明下 IMaidTask 接口中的其他常用方法:
boolean isEnable(EntityMaid maid)
判断当前 Task 是否可用。
当某些工作模式需要女仆满足特定条件才能解锁时,可以通过该方法控制。
当返回 false 时,对应任务会在界面上呈现为灰色锁定状态,无法切换。即使曾经切换过该模式,重进存档后也会自动重置为空闲模式。
boolean enableLookAndRandomWalk(EntityMaid maid)
控制女仆在当前模式下是否启用随机乱逛乱看。
默认情况下,女仆未执行工作时会四处闲逛,但部分模式下可能不适合。返回 true 可禁用乱逛功能。
boolean enablePanic(EntityMaid maid)
是否启用慌乱 AI。
默认女仆受伤后会乱跑,但有些模式(如攻击或灭火)下应禁止此行为。
boolean enableEating(EntityMaid maid)
是否启用吃饭 AI。
默认女仆在工作模式下也会进食,但某些特殊模式下可能要禁用。
boolean workPointTask(EntityMaid maid)
是否为拥有“工作点”的 task。
例如钓鱼时需要坐在坐垫或者船上。那么到休息时间时,女仆会主动离开坐垫/船,具体行为由这里的返回值控制。
List<Pair<String, Predicate<EntityMaid>>> getConditionDescription(EntityMaid maid)
获取额外的条件提示文本。
当某些工作模式需要特定条件才能执行时,用于给予玩家提示。String 为语言文件的 key,Predicate<EntityMaid> 为条件判断。满足条件时,提示会以绿色显示,不满足时为红色。例如:
List<Pair<String, Predicate<EntityMaid>>> getEnableConditionDesc(EntityMaid maid)
与上一个方法类似,但仅在任务被锁定(isEnable 返回 false)时显示提示文本。
MenuProvider getTaskInfoGuiProvider(EntityMaid maid)
暂未启用的扩展功能。
boolean canSitInJoy(EntityMaid maid, String joyType)
一般无需修改,属于设计缺陷的遗留 API。
AABB searchDimension(EntityMaid maid)
获取搜索范围的辅助方法。
float searchRadius(EntityMaid maid)
获取搜索半径,主要用于远程攻击等任务,用于设定不同的攻击范围。
另外,IMaidTask 接口还有许多其他方法,我们将在后续章节中详细介绍。
