开发者/接口参考·

接口参考

plugin.siren.API.CultivationAPI 的其余部分 —— 扩展直接调用的那些方法,而非它所监听的事件或它所添加的注册表

该类上的一切皆为 static;构造函数是私有的,且它永不被实例化。大多数方法接受每个 Hytale ECS 系统手头已有的那两个参数:

线程

源码在一处对此有明确说明:事件监听器是在事件所发生玩家的世界线程上同步调用的,而在触碰任何位于另一世界的东西之前,你必须自行切换线程 —— CompletableFuture.runAsync(task, otherWorld)

下列各项读取自身并无另行记载的线程约定;它们只是经由你所传入的访问器所作的普通组件读取,因此适用的是该访问器自己的线程规则。请从拥有你所读取 Ref 的那个世界线程上调用它们。

注册与监听器的调用则是反方向的例外:它们在任何插件的 setup() 中、以任何加载顺序都是安全的,因为其背后的结构是静态 map 与 CopyOnWriteArrayList,在玩家与模组交互之前无人读取。

组件类型

当你想自行经由 ECS 读写某个 Cultivation 组件,而非使用下方的便捷读取时,向它索取一个 ComponentType

方法返回说明
CultivationAPI.getCultivationComponentType()ComponentType<EntityStore, CultivationComponent>境界、阶段与存蓄灵气。
CultivationAPI.getCultivationStateComponentType()ComponentType<EntityStore, CultivationStateComponent>瞬态状态 —— 打坐、仪式进度。
CultivationAPI.getCultivationSettingsComponentType()ComponentType<EntityStore, CultivationSettingsComponent>各玩家的设置,例如状态栏开关。
CultivationAPI.getRaceComponentType()ComponentType<EntityStore, RaceComponent>玩家所择的种族
CultivationAPI.getSkillTreeComponentType()ComponentType<EntityStore, SkillTreeComponent>已解锁的节点与未花费的点数 —— 见天赋树
CultivationAPI.getTechniqueComponentType()ComponentType<EntityStore, TechniqueComponent>已习得的功法与冷却 —— 见功法
CultivationAPI.getSpiritVeinComponentType()ComponentType<ChunkStore, SpiritVeinComponent>区块的灵脉池。注意这一个是 ChunkStore 组件,而非实体组件 —— 见聚灵采气

修炼状态

方法返回说明
CultivationAPI.getCultivationComponent(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)CultivationComponent(可为 null)原始组件;实体没有该组件时返回 null
CultivationAPI.getCultivationStateComponent(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)CultivationStateComponent(可为 null)原始状态组件,或 null
CultivationAPI.getRaceComponent(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)RaceComponent(可为 null)原始种族组件,或 null
CultivationAPI.getRealm(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)CultivationRealm(可为 null)玩家当前的境界;若其没有 CultivationComponent(例如并非玩家实体)则为 null
CultivationAPI.getStage(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)CultivationStage(可为 null)玩家当前的子阶段,同样条件下为 null
CultivationAPI.getGlobalLevel(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)int境界与阶段压平成一个只增不减的数。没有 CultivationComponent 时为 0
CultivationAPI.getQi(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)float存蓄灵气 —— 即通往下一子阶段或突破的进度。没有 CultivationComponent 时为 0
CultivationAPI.getRace(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)PlayerRace(绝不为 null)玩家当前的种族;尚无 RaceComponent 时默认为人族。
CultivationAPI.isMeditating(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)boolean此刻是否正盘坐打坐。没有状态组件时为 false

CultivationRealm 依次为 BODY_REFINEMENTQI_CONDENSATIONFOUNDATION_ESTABLISHMENTGOLDEN_CORE_FORMATIONNASCENT_SOULSOUL_FORMATIONVOID_REFINEMENTCultivationStage 依次为 EARLYMIDDLELATEPEAK。二者面向玩家的说明都在境界与阶段页。

门面上没有 setQigrantQi。若要从扩展中改变玩家的存蓄灵气,请挂接 CultivationEvents.onPreQiGain,在那次已经发生的获取上以 event.setAmount(...) 重新缩放 —— 那才是受支持的途径,也正是模组自身的种族、天赋、丹药、宗门与大道倍率所走的同一条路。见事件页

天赋树

方法返回说明
CultivationAPI.getAvailableSkillPoints(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref)int未花费的天赋树点数;尚无 SkillTreeComponent 时为 0
CultivationAPI.isNodeUnlocked(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref, String nodeId)boolean玩家是否已解锁该节点 id。没有 SkillTreeComponent、或该 id 不匹配任何已解锁节点时为 false

节点 id 就是 plugin.siren.ECS.SkillTree.SkillTreeRegistry 中的那些 —— 例如 "VITALITY_1"。面向玩家的树形图在天赋树页,点数则按配置页的 Points-Per-BreakthroughPoints-Per-Advancement 两键授予。

功法

方法返回说明
CultivationAPI.performTechnique(ComponentAccessor<EntityStore> accessor, Ref<EntityStore> ref, PlayerRef playerRef, Technique technique)boolean立即施展一门功法。施展成功返回 true,被某道关卡拦下则返回 false

它会跑完每一道关卡 —— 系统已启用、该功法已启用、境界解锁、道之相符、灵气消耗、冷却 —— 成功时扣除灵气、盖上冷却戳并运行效果。无论成败玩家都会收到消息,或是效果的成功提示,或是失败的缘由。用它把一门功法接到你自己的触发器上:一个按键绑定、另一件物品、或你自己的一个事件。

它对内置功法与你自己注册的功法皆有效,且两种情形下都会触发 TechniqueEvents.PreTechniquePerformEventTechniquePerformEvent。构建一门功法见注册表,面向玩家的列表见功法

存档、称号与配色

<span class="tag">v0.7.0</span> 面向玩家修炼存档与其装饰外观的读取面。注意这些方法接受的是 Store<EntityStore>,而非 ComponentAccessor

方法返回
getActiveProfileName(store, ref)玩家所在存档的名字;在任何存档被创建之前为 ""
getProfileCount(store, ref)玩家所持有的真实(非沙盒)存档数目。
isTestProfileActive(store, ref)玩家此刻是否身处管理员授予的试炼存档沙盒 —— 排行榜与宗门积分皆不将其计入。
getMaxProfiles() · getMaxTechniquePresets()当前生效的上限 —— 任何扩展所注册过的最高值,下限为 3。
getTitle(store, ref)玩家已佩戴的称号,或 null
getSectBanner(String) · getPalette(store, ref)按 id 取一面已注册的旗帜;玩家所选的配色(null 表示默认外观)。

**存档是被观察的,而非被驱动的。**门面上刻意没有 switchProfile —— 切换是玩家自己的举动,经由菜单或 /cultivation profile 完成。扩展所能做的,是监听(ProfileEvents,见事件)、让自己按存档维系的状态与之同步,并通过 ProgressionProvider.supportsProfiles()(见编写扩展)昭告它确实这样做了。

注册

完整内容见注册表

方法返回说明
CultivationAPI.registerRace(String id, String displayName, String translationKey, CultivationRealm unlockRealm, Supplier<RaceConfig> stats)PlayerRace向种族菜单添加一个种族,以 unlockRealm 为门槛。
CultivationAPI.registerTechnique(String id, String displayName, String nameKey, String descriptionKey, TechniqueRule defaultRule, TechniqueEffect effect)Technique添加一门可施展的功法。
CultivationAPI.newTechniqueRule(String id, boolean enabled, boolean daoSpecific, String requiredElement, String elements, String damageType, String unlockRealm, float qiCost, float cooldownSeconds, Object... params)TechniqueRuleregisterTechnique 构建规则。
CultivationAPI.registerQiAbsorptionItemModifier(String itemId, float multiplier)设定某件物品在打坐时的灵脉吸收倍率。
CultivationAPI.registerTitle(CultivationTitle title)向称号页添加一个纯装饰称号。
CultivationAPI.registerSectBanner(SectBanner banner)添加一面宗门可悬挂于其大殿之上的旗帜。
CultivationAPI.registerPalette(CultivationPalette palette)添加一套玩家可选的菜单/HUD 配色。
CultivationAPI.registerProfileCap(String key, int cap) · registerTechniquePresetCap(String key, int cap)上调存档 / 配置组的上限(取最高的注册值)。

另见