Skip to content

Manager API

「顿悟 Epiphany」提供了一组静态 Manager 类作为公共 API,供其他模组通过 Java 代码与系统交互。

TIP

所有 Manager 方法的玩家参数均为 ServerPlayer

INFO

KubeJS 脚本同样支持Manager API,详情请参见 KubeJS 兼容 章节

AptitudeManager

管理玩家的阅历值和心得点。

查询方法

java
// 获取玩家当前阅历值
long getAptitude(ServerPlayer player)

// 获取玩家当前心得点
int getInsightPoints(ServerPlayer player)

// 获取玩家已消耗的心得点总数
int getTotalInsightPointsSpent(ServerPlayer player)

// 获取玩家下一个心得点的阅历阈值
long getRequiredForNextPoint(ServerPlayer player)

修改方法

java
// 设置阅历值(截断到当前上限)
// 触发 AptitudeChangedEvent
void setAptitude(ServerPlayer player, long value)

// 增加阅历值。超额部分自动转化为心得点
// 触发 AptitudeChangedEvent, AptitudeLevelUpEvent, InsightPointsChangedEvent
void addAptitude(ServerPlayer player, long amount)

// 按 aptitude_gain_multiplier(基础值 + 所有 modifier)增加阅历值
// 缩放结果向下取整;结果小于等于 0 时不增加
void addAptitudeWithMultiplier(ServerPlayer player, long amount)

// 设置心得点数(截断到 >= 0)
// 触发 InsightPointsChangedEvent
void setInsightPoints(ServerPlayer player, int value)

// 增加心得点(结果截断到 >= 0)
// 触发 InsightPointsChangedEvent
void addInsightPoints(ServerPlayer player, int amount)

// 将阅历补充到下一个心得点阈值
// 复用 addAptitude,因此会触发常规阅历与升级事件
// 返回实际增加的阅历值;已达到或超过阈值时返回 0
long fillAptitude(ServerPlayer player)

EpiphanyDataUtils

提供可供其他模组、UI 和命令实现复用的跨系统玩家数据操作。

事件行为

以下重置方法不会触发阅历、心得点或选择事件,与对应的 /epiphany reset 命令保持一致。

java
// 移除所有已应用的模块、心得和已激活顿悟奖励
void removeAllRewards(ServerPlayer player)

// 计算已选模块和已点亮心得应退还的心得点
// 仅查询,不修改玩家数据
int refundInsightCosts(ServerPlayer player, PlayerEpiphanyData data)

// 移除全部奖励和顿悟数据,再恢复初始状态为 SELECTABLE 的条目
// 等价于 /epiphany reset all
void resetAll(ServerPlayer player)

// 清除选择和奖励,但保留阅历并退还已选模块和已点亮心得的消耗
// 随后恢复初始状态为 SELECTABLE 的条目;等价于 /epiphany reset select
void resetSelections(ServerPlayer player)

ModuleManager

管理玩家的模块数据。

查询方法

java
// 模块是否已解锁(可以被选择)
boolean isUnlocked(ServerPlayer player, ResourceLocation moduleId)

// 模块是否已被选择
boolean isSelected(ServerPlayer player, ResourceLocation moduleId)

// 模块是否已完成
boolean isCompleted(ServerPlayer player, ResourceLocation moduleId)

// 玩家当前已选择的模块数量
int getSelectedModuleCount(ServerPlayer player)

// 配置中允许同时选择的模块数量上限
int getMaxSelectedModules()

修改方法

java
// 设置模块解锁状态
// 触发 ModuleUnlockEvent (Pre) 和 ModuleUnlockedEvent (Post)
void setUnlocked(ServerPlayer player, ResourceLocation moduleId, boolean unlocked)

// 选择模块(消耗心得点,检查条件和上限)
// 触发 ModuleSelectEvent (Pre) 和 ModuleSelectedEvent (Post)
// 应用 on_select_reward
void select(ServerPlayer player, ResourceLocation moduleId)

// 完成模块(检查所有心得是否已解锁,授予顿悟槽)
// 触发 ModuleCompleteEvent (Pre) 和 ModuleCompletedEvent (Post)
// 应用 on_complete_reward
void complete(ServerPlayer player, ResourceLocation moduleId)

// 强制选择(忽略消耗和条件)
// 触发 ModuleSelectedEvent (Post)
void forceSelect(ServerPlayer player, ResourceLocation moduleId)

// 强制完成(忽略心得检查,授予顿悟槽)
// 触发 ModuleCompletedEvent (Post)
void forceComplete(ServerPlayer player, ResourceLocation moduleId)

// 重置模块(退还心得点,移除奖励)
void resetModule(ServerPlayer player, ResourceLocation moduleId)

// 自动解锁满足条件的 locked 模块
// skipEventDriven:是否跳过轮询
// silent:是否触发 NotificationListener 中的通知消息
void checkAutoUnlock(ServerPlayer player, boolean skipEventDriven, boolean silent)

// 清理注册表中已不存在的 module
void cleanupOrphanedData(ServerPlayer player)

InsightManager

管理玩家的心得状态。

查询方法

java
// 心得是否已被选择
boolean isSelected(ServerPlayer player, ResourceLocation insightId)

// 心得所处的模块是否被选择
boolean isModuleSelected(ServerPlayer player, ResourceLocation insightId)

修改方法

java
// 选择心得(消耗心得点,检查前置条件)
// 触发 InsightSelectEvent (Pre) 和 InsightSelectedEvent (Post)
void select(ServerPlayer player, ResourceLocation insightId, ResourceLocation moduleId)

// 强制选择心得(忽略消耗和前置条件)
void forceSelect(ServerPlayer player, ResourceLocation insightId, ResourceLocation moduleId)

// 重置心得(退还心得点,移除奖励)
void resetInsight(ServerPlayer player, ResourceLocation insightId)

EpiphanyManager

管理玩家的顿悟状态。

查询方法

java
// 顿悟是否已解锁(可以被选择)
boolean isUnlocked(ServerPlayer player, ResourceLocation epiphanyId)

// 顿悟是否已被选择
boolean isSelected(ServerPlayer player, ResourceLocation epiphanyId)

// 玩家已解锁的顿悟槽数量
int getEpiphanySlots(ServerPlayer player)

// 当前已占用的顿悟槽数量
int getUsedEpiphanySlots(ServerPlayer player)

// 配置中允许选择的顿悟数量上限
int getMaxEpiphanySlots()

修改方法

java
// 设置顿悟解锁状态
void setUnlocked(ServerPlayer player, ResourceLocation epiphanyId, boolean unlocked)

// 选择顿悟(检查槽位和条件)
// 触发 EpiphanySelectEvent (Pre) 和 EpiphanySelectedEvent (Post)
void select(ServerPlayer player, ResourceLocation epiphanyId)

// 强制选择(忽略槽位和条件)
void forceSelect(ServerPlayer player, ResourceLocation epiphanyId)

// 重置顿悟
void resetEpiphany(ServerPlayer player, ResourceLocation epiphanyId)

// 清理注册表中已不存在的 Epiphany
void cleanupOrphanedData(ServerPlayer player)

// 自动解锁满足条件的 locked 顿悟
// skipEventDriven:是否跳过轮询
// silent:是否触发 NotificationListener 中的通知消息
void checkAutoUnlock(ServerPlayer player, boolean skipEventDriven, boolean silent)

AptitudeSourceManager

解析数据包定义的阅历来源并发放奖励。

java
// 解析一组行为与目标,但不修改玩家数据
// 返回匹配的奖励及相关解析信息
AptitudeSourceResolver.Resolution resolve(
	ServerPlayer sp, ResourceLocation behaviorId,
	ResourceLocation targetId, @Nullable Registry<?> registry)

// 发放阅历
// behaviorId: 行为 ID(如 mymod:foo)
// targetId: 目标 ID(如被击杀的实体类型)
// registry: targetId 所属的注册表,用于查找 tag。可为 null
boolean grant(
	ServerPlayer sp, ResourceLocation behaviorId,
	ResourceLocation targetId, @Nullable Registry<?> registry)

使用示例:

java
@SubscribeEvent
static void onCustomMobKill(LivingDeathEvent event) {
    if (!(event.getSource().getEntity() instanceof ServerPlayer sp)) return;
    ResourceLocation targetId = BuiltInRegistries.ENTITY_TYPE.getKey(event.getEntity().getType());
    AptitudeSourceManager.grant(
        sp,
        ResourceLocation.fromNamespaceAndPath("mymod", "custom_kill"),
        targetId,
        BuiltInRegistries.ENTITY_TYPE
    );
}

AptitudeFormula

阅历计算公式类。目前只实现了线性运算,计划加入更多公式支持。 公式:

required=Config.baseAptitudeCap+(totalSpent+insightPoints)×Config.aptitudeCapGrowth \text{required} = \text{Config.baseAptitudeCap} + (\text{totalSpent} + \text{insightPoints}) \times \text{Config.aptitudeCapGrowth}

java
// 计算获得下一个心得点所需的阅历值
// totalSpent: 已消耗心得点总数
// insightPoints: 当前可用心得点数
// 返回: 所需阅历值
long calcRequiredAptitude(long totalSpent, int insightPoints)

处理模式

所有 Manager 方法遵循统一的流程:

1. player.getData(AttachmentType) → 获取当前数据
2. 创建新的不可变数据记录(with* 方法)
3. player.setData(AttachmentType, newData) → 持久化 + 自动同步到客户端
4. NeoForge.EVENT_BUS.post(Event) → 触发事件

INFO

PlayerEpiphanyData 是不可变 record,所有修改通过 with*() 方法返回新实例。

方法总表

Manager方法描述返回
AptitudeManagergetAptitude当前阅历long
AptitudeManagergetInsightPoints可用心得点int
AptitudeManagergetTotalInsightPointsSpent累计已花费心得点int
AptitudeManagergetRequiredForNextPoint下一心得点的阅历阈值long
AptitudeManagersetAptitude设置阅历void
AptitudeManageraddAptitude增加阅历,溢出部分自动转心得点void
AptitudeManageraddAptitudeWithMultiplier按玩家阅历获取倍率增加阅历void
AptitudeManagersetInsightPoints直接覆盖可用心得点(不改 totalSpent)void
AptitudeManageraddInsightPoints增加或扣除心得点,结果不低于 0void
AptitudeManagerfillAptitude补充阅历至下一心得点阈值long
EpiphanyDataUtilsremoveAllRewards移除全部已应用奖励void
EpiphanyDataUtilsrefundInsightCosts计算选择消耗的心得点退款int
EpiphanyDataUtilsresetAll全量重置玩家顿悟数据void
EpiphanyDataUtilsresetSelections保留阅历并重置选择void
ModuleManagerisUnlocked模块是否已解锁boolean
ModuleManagerisSelected模块是否已选boolean
ModuleManagerisCompleted模块是否已完成boolean
ModuleManagergetSelectedModuleCount当前已选模块数量int
ModuleManagergetMaxSelectedModules同时选择模块的配置上限int
ModuleManagersetUnlocked设置解锁状态void
ModuleManagerselect选择模块void
ModuleManagerforceSelect强制选择void
ModuleManagercomplete完成模块void
ModuleManagerforceComplete强制完成void
ModuleManagerresetModule重置模块void
ModuleManagercheckAutoUnlock扫描自动解锁 LOCKED 且 condition 满足的模块void
ModuleManagercleanupOrphanedData清理注册表中已不存在的 modulevoid
InsightManagerisSelected心得是否已点亮boolean
InsightManagerisModuleSelected心得所属模块是否已选boolean
InsightManagerselect选择心得void
InsightManagerforceSelect强制选择void
InsightManagerresetInsight重置心得void
EpiphanyManagerisUnlocked顿悟是否已解锁boolean
EpiphanyManagerisSelected顿悟是否已激活boolean
EpiphanyManagergetEpiphanySlots已解锁顿悟槽数量int
EpiphanyManagergetUsedEpiphanySlots已占用顿悟槽数量int
EpiphanyManagergetMaxEpiphanySlots可选择顿悟的配置上限int
EpiphanyManagersetUnlocked设置解锁状态void
EpiphanyManagerselect激活顿悟void
EpiphanyManagerforceSelect强制激活void
EpiphanyManagerresetEpiphany重置顿悟void
EpiphanyManagercheckAutoUnlock扫描自动解锁 LOCKED 且 condition 满足的顿悟void
EpiphanyManagercleanupOrphanedData清理注册表中已不存在的 epiphanyvoid
AptitudeSourceManagergrant发放阅历boolean
AptitudeSourceManagerresolve纯查询某 behavior+target 的奖励Resolution
AptitudeFormulacalcRequiredAptitude计算获得下一心得点所需阅历long