接口参考
plugin.siren.API.CultivationAPI 是扩展直接调用的门面,有别于它所监听的事件。它共有 262 个公开静态方法,分属 251 个不同的名字(其中 11 个名字被重载),外加一个常量 MENU_NAV_EVENT_KEY。本页把它们逐一列出,并按用途分组;30 个 register* 方法(计入重载为 33 个)及其 23 个 unregister* 对应方法,概括于注册索引,并在注册表中附示例讲解。CultivationConfigs 另有 50 个访问器与 saveAll(),见配置文件。
该类上的一切皆为 static;构造函数是私有的,且它永不被实例化。大多数方法接受每个 Hytale ECS 系统手头已有的那两个参数,下表将其缩写为 accessor, ref:
ComponentAccessor<EntityStore> accessor—— 该实体所在存储的访问器。Ref<EntityStore> ref—— 实体本身。
线程
源码在一处对此有明确说明:事件监听器是在事件所发生玩家的世界线程上同步调用的,而在触碰任何位于另一世界的东西之前,你必须自行切换线程 —— CompletableFuture.runAsync(task, otherWorld)。
下列各项读取自身并无另行记载的线程约定;它们只是经由你所传入的访问器所作的普通组件读取,因此适用的是该访问器自己的线程规则。请从拥有你所读取 Ref 的那个世界线程上调用它们。
注册与监听器的调用则是反方向的例外:它们在任何插件的 setup() 中、以任何加载顺序都是安全的,因为其背后的结构是静态 map 与 CopyOnWriteArrayList,在玩家与模组交互之前无人读取。
组件类型
当你想自行经由 ECS 读写某个 Cultivation 组件,而非使用下方的便捷读取时,向它索取一个 ComponentType。
| 方法 | 返回 | 说明 |
|---|---|---|
getCultivationComponentType() | ComponentType<EntityStore, CultivationComponent> | 境界、阶段与存蓄灵气。 |
getCultivationStateComponentType() | ComponentType<EntityStore, CultivationStateComponent> | 瞬态状态 —— 打坐、仪式进度。 |
getCultivationSettingsComponentType() | ComponentType<EntityStore, CultivationSettingsComponent> | 各玩家的设置,例如状态栏开关。 |
getRaceComponentType() | ComponentType<EntityStore, RaceComponent> | 玩家所择的种族。 |
getSkillTreeComponentType() | ComponentType<EntityStore, SkillTreeComponent> | 已解锁的节点与未花费的点数 —— 见天赋树。 |
getTechniqueComponentType() | ComponentType<EntityStore, TechniqueComponent> | 已习得的功法与冷却 —— 见功法。 |
getSpiritVeinComponentType() | ComponentType<ChunkStore, SpiritVeinComponent> | 区块的灵脉池。注意这一个是 ChunkStore 组件,而非实体组件 —— 见聚灵采气。 |
修炼状态
对玩家阶梯的普通读取。当玩家尚无对应组件时,它们返回 null、0 或人族,而不会抛出异常。当安装了 ProgressionProvider 时,getRealm、getGlobalLevel 与 getQi 由 provider 作答,而 getStage 始终为 null。
CultivationRealm 依次为 BODY_REFINEMENT、QI_CONDENSATION、FOUNDATION_ESTABLISHMENT、GOLDEN_CORE_FORMATION、NASCENT_SOUL、SOUL_FORMATION、VOID_REFINEMENT。CultivationStage 依次为 EARLY、MIDDLE、LATE、PEAK。二者面向玩家的说明都在境界与阶段页。
| 方法 | 返回 | 说明 |
|---|---|---|
getCultivationComponent(accessor, ref) | CultivationComponent | 原始组件;实体没有该组件时返回 null。 |
getCultivationStateComponent(accessor, ref) | CultivationStateComponent | 原始状态组件,或 null。 |
getRaceComponent(accessor, ref) | RaceComponent | 原始种族组件,或 null。 |
getRealm(accessor, ref) | CultivationRealm | 玩家的有效境界 —— 即每一道境界门槛所检验的那个;若其没有 CultivationComponent(例如并非玩家实体)则为 null。在 ProgressionProvider 治下,这是 provider 给出的等价境界。 |
getStage(accessor, ref) | CultivationStage | 玩家所存的子阶段,若其没有 CultivationComponent 则为 null。安装了 ProgressionProvider 时始终为 null,因为替换阶梯只有它自己的 getSubRankLabel。凡涉及数值,请优先使用 getGlobalLevel。 |
getGlobalLevel(accessor, ref) | int | 境界与阶段压平成一个只增不减的数,或已安装 provider 的等级。没有 CultivationComponent 时为 0。 |
getQi(accessor, ref) | float | 通往下一次升级的已存进度 —— 存蓄灵气,或已安装 provider 的进度。没有 CultivationComponent 时为 0。 |
getRace(accessor, ref) | PlayerRace | 玩家当前的种族;尚无 RaceComponent 时默认为人族。绝不为 null。 |
isMeditating(accessor, ref) | boolean | 此刻是否正盘坐打坐。没有状态组件时为 false。 |
getHighestRealmReached(accessor, ref) | int | 玩家永久的最高境界纪录,以 CultivationRealm 序号表示。这是渐进式解锁所读取的、按账号记录的数值:它只会因挣来的进度而上升,绝不会因管理员设定的境界、等级或重置而变动。只读;若账号尚未写入过该纪录,则回落到当前境界。 |
isMaxLevel(accessor, ref) | boolean | 修士是否已处于当前生效的那套进阶体系的顶端。 |
getQiRequiredForNext(accessor, ref) | float | 修士在下一次升级成为可能之前,需要存够的灵气。 |
isReadyForBreakthrough(accessor, ref) | boolean | 是否已存够境界突破所需,只差仪式。 |
isReadyForAdvancement(accessor, ref) | boolean | 是否已存够阶段晋阶所需,只差仪式。 |
驱动进阶
v0.6.1 上述读取的写入一半。其中每一个都走的是模组自己的指令与仪式所用的同一条路径,所以扩展授予灵气时,触发的事件相同,遵从已安装的 ProgressionProvider,并像打坐一样刷新状态栏与排行 —— 而直接伸手去改组件,这些一样也做不到。
存蓄灵气有两种写入:addQi 用于玩家挣来的一切(经过每一道倍率与可取消的 PreQiGainEvent),setQi 则是两者都跳过的管理员路径。若要对一次正在发生的获取重新缩放,请改为挂接 CultivationEvents.onPreQiGain —— 见事件页。
setQi、setRealm 与 setStage 写入的是内置阶梯。在已安装的 ProgressionProvider 治下,它们不会改变修士能看到的任何东西,因为数字归 provider 所有;请改为驱动 provider 自己的接口(addQi 是这里唯一能触及 provider 的写入)。
这些方法全都在调用者所在的线程上运行,且只触碰给定的那一个实体,因此在该实体自己的世界线程上,从系统、指令或交互中调用皆安全。在 tick 系统之内,accessor 必须是该系统的 CommandBuffer,绝不能是裸的 Store。若要对可能身处另一个世界的玩家动手,请先切到他们的世界线程 —— Universe.get().getPlayer(uuid),再取 PlayerRef,再 CompletableFuture.runAsync(..., theirWorld) —— 模组自己的管理工具正是这样做的。
| 方法 | 返回 | 说明 |
|---|---|---|
addQi(accessor, ref, float amount, PlayerRef playerRef) | 授予灵气,与吸收一枚灵核或打坐时一模一样:经过每一道倍率(种族、天赋树、丹药、宗门大殿、阴阳之衡),经过可取消的 PreQiGainEvent,并落入当前所安装的任何进阶体系。playerRef 对非玩家修士可为 null。对没有 CultivationComponent 的实体是空操作。 | |
setQi(accessor, ref, float qi) | 直接设定存蓄灵气,跳过一切倍率与事件 —— 这是 /cultivation admin setqi 的路径,而非玩法路径。凡玩家挣来的,请优先用 addQi。NaN 或无穷值会被忽略,负值夹紧为 0。仅限内置阶梯。它不会让任何人升级;那仍需走打坐仪式。 | |
setRealm(accessor, ref, CultivationRealm realm) | 直接把一名修士置于某境界,并重新施加其属性加成。它不触发突破事件、不运行仪式,因为并未突破过什么。仅限内置阶梯。 | |
setStage(accessor, ref, CultivationStage stage) | 同 setRealm,作用于子阶段。仅限内置阶梯。 | |
completeBreakthrough(accessor, ref, PlayerRef playerRef) | boolean | 立即完成一次境界突破 —— 扣除存蓄灵气、授予天赋点、触发 PreBreakthroughEvent 与 BreakthroughEvent,并播放庆贺 —— 如同仪式刚刚完成。凡扩展提供自己的突破途径(一项任务、一件物品、一次首领击杀),应当调用它。在内置阶梯上,修士须处于巅峰阶段,但不要求存蓄灵气。仅当位阶确实上升时才返回 true。 |
completeAdvancement(accessor, ref, PlayerRef playerRef) | boolean | 同 completeBreakthrough,作用于单次阶段晋阶。在内置阶梯上,修士须不处于巅峰阶段。仅当位阶确实上升时才返回 true。 |
demote(accessor, ref, PlayerRef playerRef, boolean wasBreakthrough) | 施加仪式失败的惩罚:跌落一个阶段(绝不低于当前境界的第一个阶段)并清空存蓄灵气,同时触发降阶事件。wasBreakthrough 只决定发给修士的是哪一条消息。 | |
startMeditating(accessor, ref) | 让一名修士入定打坐,与 /cultivation meditate 完全一致。当元婴正在遁走,或幻境劫、心魔宿敌之战或洗髓之礼正在进行时会被拒绝(并告知玩家缘由);否则会触发可取消的 PreMeditationStartEvent,成功后修士落座、播放姿态动画并触发 MeditationStartEvent。移开仍会取消打坐。已在打坐的修士则不受影响。 | |
tryStartMeditating(accessor, ref) | boolean | 同 startMeditating,但会报告结果。修士此刻正在打坐(包括本就在打坐)时为 true;若他没有修炼状态、元婴正在遁走、幻境劫/心魔宿敌之战/洗髓之礼正在进行,或某个 PreMeditationStartEvent 监听器取消了它,则为 false。所有 false 的情形下,均未改变任何东西。 |
stopMeditating(accessor, ref) | 让修士起身,与 /cultivation meditate 完全一致,包括起身的惩罚。在仪式中途叫停某人,代价等同于他自己走开:突破或晋阶会降一个阶段并散去存蓄灵气,闭关苦修会丧失其收益,飞升或轮回会失败,炼器会作废。若你只想让一个闲坐的打坐者起身,请先检查 isMeditating 与各项仪式读取。 | |
tryStopMeditating(accessor, ref) | boolean | 同 stopMeditating,但会报告结果。修士已不再打坐(包括本就没在打坐)时为 true;若他没有修炼状态,或某个 PreMeditationStopEvent 监听器让他继续坐着,则为 false,此时未改变任何东西,也未施加任何惩罚。 |
activateQiBarrier(accessor, ref, float durationSeconds, float shieldAmount) | 授予一道限时的护体真气 —— 一个吸收池,先于生命值抵扣所受伤害,与内置 qi_barrier 功法所用的是同一原语。会触发常规的施加增益前后事件。 |
天赋树
节点 id 就是 plugin.siren.ECS.SkillTree.SkillTreeRegistry 中的那些 —— 例如 "VITALITY_1"。面向玩家的树形图在天赋树页,点数则按配置页的 Points-Per-Breakthrough 与 Points-Per-Advancement 两键授予。
| 方法 | 返回 | 说明 |
|---|---|---|
getAvailableSkillPoints(accessor, ref) | int | 玩家未花费的天赋树点数;尚无 SkillTreeComponent 时为 0。 |
isNodeUnlocked(accessor, ref, String nodeId) | boolean | 玩家是否已解锁该节点 id(内置 id 见 SkillTreeRegistry,例如 "VITALITY_1")。没有 SkillTreeComponent、或该 id 不匹配任何已解锁节点时为 false。 |
grantSkillPoints(accessor, ref, int points) | 授予未花费的天赋树点数。对没有 SkillTreeComponent 的实体是空操作。 | |
unlockSkillNode(accessor, ref, String nodeId) | boolean | 解锁一个节点,花掉修士的点数,并重新施加该节点所授予的属性修正 —— 与天赋树菜单所走的是同一条路径。节点被解锁则返回 true。 |
grantSkillNode(accessor, ref, String nodeId) | boolean | 不扣点数地授予一个节点,供把节点当作奖励发放、而非售卖的扩展使用。节点被授予则返回 true。 |
世界的灵气
v0.6.1 readSpiritVein 汇报一个区块的灵脉里有什么,既不创建、也不写入任何东西 —— 对从无人到访过的区块,它同样给出真实的答案,因为播种的掷骰是世界种子与区块位置的纯函数。这使地图叠加层或探脉物品成为可能,而无需为玩家路过的每一个区块都播下一条脉。
坐标是区块坐标,而非方块坐标。Hytale 的区块宽 32 个方块,所以请用 ChunkUtil.chunkCoordinate(blockX),而不要除以 16。
| 方法 | 返回 | 说明 |
|---|---|---|
readSpiritVein(World world, int chunkX, int chunkZ) | SpiritVeinManager.VeinReading | 在不触碰的前提下读取一个区块的灵脉:不创建组件,也不写入任何东西。从无人到访过的区块同样能给出真实的答案。是地图叠加层或探脉物品的正确之选。 |
drainSpiritVein(World world, int chunkX, int chunkZ, float amount) | float | 从一个区块的灵脉中抽取灵气;若尚无人触碰过它,会先创建并播种。必须在该世界自己的线程上运行。返回实际抽到多少 —— 灵脉将枯时少于所请求的数量,区块未载入时为 0。 |
getMeditationRegenMultiplier(String world, int chunkX, int chunkZ, UUID player) | float | 覆盖该区块的阵法与洞府,合起来能为这名玩家带来的打坐倍率 —— 聚灵阵或其自己的洞府之内高于 1,护山大阵扼住外人之处则低于 1。 |
向各子系统发问
v0.6.1 宗门、大道、灵兽、洞府与斗法的事件早已存在,却没有任何办法发问 —— 只能监听 SectEvents,却无从问一句「这名玩家在哪个宗门」,等于得把整个注册表另造一份。这些方法补上了这个缺口。宗门与洞府的读取以 UUID 为键,因此对离线玩家同样作答。
| 方法 | 返回 | 说明 |
|---|---|---|
isSectSystemEnabled() | boolean | 宗门是否完全开启(Sects-Enabled)。在任何建立于宗门之上的东西动工之前先问它;为 false 时请退让并说明原因。 |
getSect(UUID player) | Sect | 该玩家所属的宗门,或 null。Sects-Enabled 关闭期间对所有人都答 null;名册仍留在内存中,所以重新开启该系统即可恢复每个宗门。 |
getSectByName(String name) | Sect | 该名字的宗门(不区分大小写),或 null。Sects-Enabled 关闭期间,对任何名字都为 null。 |
getSectQiBonusPercent(UUID player) | float | 该玩家的宗门大殿为其值多少额外灵气百分比,或 0。 |
getSectHolding(String world, int chunkX, int chunkZ) | Sect | 大殿或建筑立于此区块的宗门,或 null。 |
getSectBuildingAllowance(Sect sect) | int | 该宗门在当前等级下可拥有多少座建筑。 |
getSectBuildingType(String typeId) | SectBuildingType | 某 id 所配置的种类;若服主已将其移除则为 null。 |
addSectProgressXp(UUID member, boolean breakthrough) | int | 为一名门人存入共享的宗门进度,与其自己晋阶时完全一样。返回宗门因此升了多少级。 |
getOrCreateDao(accessor, ref) | DaoComponent | 修士的大道组件;若他从未触及大道系统,则会创建。 |
getDaoElement(accessor, ref) | DaoElement | 该修士所择的元素;若他未行任何道则为 null。 |
getPath(accessor, ref) | CultivationPath | 该修士在当前阴阳之衡下的德行之途(正道、魔道或皆非);若他没有大道组件则为 null。 |
getYinPercent(accessor, ref) | float | 该修士的阴性百分比,0(全阳)至 100(全阴)。 |
getKarma(accessor, ref) | float | 该修士的业力 —— 记在他账上、会加重天劫的血债。 |
getTerrainElement(String biomeName) | DaoElement | 某生物群系名所对应的元素;若不对应任何元素则为 null。 |
getGroundDao(String world, int chunkX, int chunkZ) | DaoElement | 该区块的土地迫使修士倾向的元素,或 null —— 涵盖无主之地、没有大道的宗门,以及刻意关闭了大道开关的宗门建筑。 |
getAbode(UUID player) | Dwelling | 该玩家已认领的洞府;没有则为 null。 |
getDwellingAt(String world, int chunkX, int chunkZ) | Dwelling | 圈住该区块的任一洞府(个人的或宗门大殿的),或 null。 |
getDuel(UUID player) | DuelManager.Duel | 该玩家当前所处的斗法,或 null。 |
isDuelLethal(UUID player) v0.11.2 | boolean | 该玩家处于致命斗法(以死亡定胜负,正如挑战者能够选择之前的每一场斗法)时为 true(见斗法)。未在斗法中,或其斗法为非致命时为 false:在非致命斗法中,对手那记会令其丧命的攻击会在任何后续伤害过滤器看到之前被取消,斗法则以其认输告终。可在任何线程安全调用。 |
getFormationTier(Formation formation) | int | 该阵法的品阶,夹紧在 [0, FormationManager.MAX_TIER] 之内。 |
getStrongestTrappingTierAgainst(String world, int chunkX, int chunkZ, UUID player) | int | 该玩家此刻在此区块被困住的最强困仙阵品阶;未被困时为负值。 |
isArrayAltarAvailable() | boolean | AugmentBlocks 内置项是否已解析成功,即本次启动中阵坛的生长、衰减与校准是否生效。 |
伤害类别与元素
v0.11.1 你自己的伤害系统有时需要知道一击属于哪个大道元素 —— 比如要认出一枚道印。plugin.siren.ECS.Dao.DaoElement 枚举上的两个静态方法回答这一问。它们在枚举上,而不在 CultivationAPI 门面上。道印不触发任何事件,所以伤害类别的 id 与它所属的元素,就是扩展能凭借的东西;这些 id 列在道印之下。
| 方法 | 返回 | 说明 |
|---|---|---|
DaoElement.fromDamageCauseId(String damageCauseId) | DaoElement | DamageCause 资产 id 完全吻合的那个元素,或 null。除了各元素自己的伤害类别,它还把原版第 7 版本的 Earth、Water、Wind 与 Lightning 伤害类别映射到相应元素。 |
v0.11.1 DaoElement.fromDamageCause(DamageCause cause) | DaoElement | 一个伤害类别所属的元素:先找完全吻合,再沿它的 Inherits 链向上找(至多 8 级,免得畸形的环路无限循环),否则为 null。道印的伤害类别如 Cultivation_Seal_Metal,继承 Cultivation_Metal,解析为 METAL。只继承泛用 Elemental 的类别什么也解析不到 —— Cultivation_DaoReaction 就是有意如此,免得一次反应引出另一次反应。 |
寿元
寿元是每份存档按在线游玩小时计的预算,与所达过的最高境界挂钩。它在服务器上默认关闭,所以请先调用 isLifespanEnabled()。事件:LifespanEvents。面向玩家的文档:寿元。
| 方法 | 返回 | 说明 |
|---|---|---|
isLifespanEnabled() | boolean | 寿元是否在全服开启。默认关闭。 |
getLifespanBudgetHours(accessor, ref) | float | 这名修士当前的在线游玩小时预算,与其所达过的最高境界挂钩。尚未被追踪则为 0。 |
getLifespanUsedHours(accessor, ref) | float | 自寿元开始追踪他以来,这名修士已在线耗去上述预算的多少小时。 |
getLifespanRemainingHours(accessor, ref) | float | 距凋零所剩的小时数,下限为 0。 |
getLifespanRemainingFraction(accessor, ref) | float | 剩余小时占当前预算的 0..1 比例 —— 全新或尚未被追踪的修士为 1。 |
getLifespanWarnTier(accessor, ref) | int | 当前这轮倒计时中,已显示过的最高警示档位(0..3)。 |
isWithering(accessor, ref) | boolean | 这名修士当前是否处于寿元耗尽之后的凋零宽限状态。 |
getLifespanGraceMinutesRemaining(accessor, ref) | float | 在 Lifespan-Expiry-Action 执行之前所剩的在线宽限分钟数;当前并未凋零则为 0。 |
extendLifespan(accessor, ref, float hours, API.LifespanEvents.ExtendSource source) | float | 在修士当前境界纪录所定的预算之上授予额外小时,仅限 PILL 与 ADMIN 两种来源(突破自带的预算上涨是自动的)。先后触发 PreLifespanExtendEvent 与 LifespanExtendEvent,若这次授予使剩余小时重新大于 0,则解除凋零。返回实际授予的小时数 —— 寿元已关闭、没有组件、或某个监听器取消或归零了这次授予时,为 0。 |
炼体
第二条阶梯,靠挨打而攀。事件:BodyTemperingEvents。面向玩家的文档:炼体。
| 方法 | 返回 | 说明 |
|---|---|---|
getBodyTemperingLevel(accessor, ref) | int | 修士的炼体等级;若尚无则为 BodyTemperingComponent.MIN_LEVEL。 |
getMaxBodyTemperingLevel() | int | 一具身躯可淬炼到的上限,取自配置。 |
getTemperingStage(accessor, ref) | int | 修士的锻体境,0 到 9 —— 纯粹是其炼体等级的函数,尚未淬炼时为 0(默认 Max-Level 下,即等级低于 11)。没有任何东西会将其重置,所以存档一载入它就读得对。 |
getTemperingHealthBonus(accessor, ref) | float | 这名修士当前锻体境所授予的固定最大生命加成。未淬炼时为 0。 |
getBodyTemperingProgress(accessor, ref) | float | 这具身躯在当前等级上走了多远,0..1。在上限处恒为 1。 |
getArmorProtectionScore(accessor, ref) | float | 这个实体此刻披甲到什么程度:赤身为 0,服务器配置所描述的最具防护力的一套为 1。直接从所穿物品上实时读取,对模组护甲与原版护甲一视同仁。 |
getBodyTemperingDamageReduction(accessor, ref) | float | 淬炼过的身躯当前挡开的所受伤害比例,0 到 1,随攀升阶梯的程度与所穿护甲而缩放。炼体关闭时为 0。开启 Endless Leveling 防护交接后,由 EL 施加,而此方法仍报告同一个数字。 |
addBodyTemperingXp(accessor, ref, PlayerRef playerRef, float amount) | int | 直接授予炼体经验,让身躯尽可能升级,并触发与一记真实打击相同的事件。供对「何物淬炼身躯」另有见解的扩展使用。不施加护甲缩放 —— 这是要存入的原始数额。返回升了多少级。 |
器灵
本命兵器之灵(器灵)的读取。除按玩家记录的话语历史外,每个方法都接受所持的 ItemStack。事件:WeaponSpiritEvents。面向玩家的文档:器灵。
| 方法 | 返回 | 说明 |
|---|---|---|
isWeaponSpiritAwakened(ItemStack stack) | boolean | 这件所持武器的器灵一旦苏醒即为 true。 |
getWeaponSpiritLevel(ItemStack stack) | int | 这个器灵当前的等级;尚未苏醒则为 0。 |
getWeaponSpiritBondedTechnique(ItemStack stack) | String | 圆满的器灵借给主人的功法 id;未圆满(或未配置)则为 null。 |
getWeaponSpiritTemperament(ItemStack stack) | WeaponSpiritTemperament | 这个器灵已确定的 WeaponSpiritTemperament(性情);尚未苏醒则为 null。 |
getWeaponSpiritDevotion(ItemStack stack) | float | 器灵当前的忠诚度(0 到 WeaponSpirit-Devotion-Max),已计入衰减 —— 即应展示给玩家的数字。 |
getWeaponSpiritDevotionMax() | float | getWeaponSpiritDevotion 所衡量的配置上限(WeaponSpirit-Devotion-Max)。 |
getWeaponSpiritName(ItemStack stack) | String | 玩家为这个器灵起的名字;从未命名(或未苏醒)则为空。 |
getWeaponSpiritNextPerkLevel(ItemStack stack) | int | 器灵的下一级将解锁 2 至 4 级中的哪一项加成(2 为 WHETTED,3 为 WATCHFUL,4 为 SWIFT);已至 WeaponSpirit-Max-Level 或尚未苏醒时为 0。 |
getWeaponSpiritRecentVoiceLines(UUID player) | List<Message> | 本次会话中发给这名玩家的最近(至多五条)合成话语,最旧的在前。绝不为 null。 |
天道与个人之道
位于元素大道之上的一层:天道的度量、个人之道的开放注册表,以及承载这两者的组件。事件:DaoComprehensionEvents。面向玩家的文档:天道。
| 方法 | 返回 | 说明 |
|---|---|---|
isPersonalDaoSystemEnabled() | boolean | 个人之道系统在配置中是否启用。 |
getHeavenlyDao(accessor, ref) | float | 这名修士原始的天道值,0..Heavenly-Dao-Max。 |
getHeavenlyDaoFraction(accessor, ref) | float | 这名修士的天道占 Heavenly-Dao-Max 的 0..1 比例。 |
getHeavenlyDaoRank(accessor, ref) | HeavenlyDaoRank | 这名修士的天道位阶,依其当前比例确定。 |
getOrCreateDaoComprehension(accessor, ref) | DaoComprehensionComponent | 这名修士的大道领悟组件(天道加上每个个人之道的进度);若他从未触及这一层,则会创建。 |
registerPersonalDao(PersonalDao dao) | 注册一个个人之道。以同一 key 注册两次,后者替换前者。 | |
unregisterPersonalDao(String key) | 撤下先前注册的个人之道 —— 供插件干净地卸载。 | |
getPersonalDaos() | List<PersonalDao> | 每一个已注册的个人之道,按排序序号、再按注册顺序排列。不可修改。 |
getPersonalDao(String key) | PersonalDao | 以此 key 注册的个人之道;无人认领则为 null。 |
getPersonalDaoComprehension(accessor, ref, String key) | float | 这名修士已存入此个人之道的领悟,或 0。 |
isPersonalDaoManifested(accessor, ref, String key) | boolean | 这名修士当前是否已显化此个人之道。 |
addPersonalDaoComprehension(accessor, ref, String key, float amount, PlayerRef playerRef) | 按 key 向一个已注册的个人之道授予领悟(数额为负则为消减)。对未注册的 key 是空操作。 |
功德、赛季与排行
事件:MeritEvents 与 SeasonEvents。面向玩家的文档:功德与赛季循环。
| 方法 | 返回 | 说明 |
|---|---|---|
getMerit(accessor, ref) | float | 修士的功德 —— 与业力并列、却彼此独立的善行账簿。 |
addMerit(accessor, ref, PlayerRef playerRef, float amount) | 面向扩展的原始功德入账(数额为负则为校正):没有事迹、没有冷却、没有软性的道途节流,所以由调用者自行判断数额是否公允。会引发与受限制的获取相同的升位与功法授予后果。 | |
isSeasonEnabled() | boolean | 共享的赛季节律是否开启(Season-Enabled)。凡挂靠在赛季边界上的功能,都应退让并点出该键说明原因,而不要另造第二套时钟。 |
getCurrentSeasonId() | int | 当前正在进行的赛季;赛季从未开始(Season-Enabled 关闭,或第一次 tick 尚未发生)时为 0。请在你自己的 setup() 中询问,而不要等待 SeasonOpenEvent —— 启动时的开幕事件,是在任何扩展注册监听器之前就已触发的。 |
isSeasonChampion(UUID uuid) | boolean | 这个账号截至上一个收官的赛季,是否持有四项赛季魁首(正魔之战、修为、大道精通或宗门)中的任何一项。Season-Enabled 关闭期间始终为 false。 |
getLeaderboardSnapshot() | List<Utils.CultivationLeaderboard.Entry> | 每一行已记录的排名的无序、不可变快照 —— 本服务器见过的每一个修炼过的账号各一行,无论在线与否。专为筛选而建。沙盒存档从不进入其中。 |
经脉损伤与誓言
事件:MeridianEvents 与 OathEvents。面向玩家的文档:经脉损伤与天道誓言。
| 方法 | 返回 | 说明 |
|---|---|---|
hasMeridianInjury(accessor, ref, MeridianInjury injury) | boolean | 这名修士当前是否带有此经脉损伤。 |
getMeridianInjuryMagnitude(accessor, ref, MeridianInjury injury) | float | 此经脉损伤所掷出的强度(0..1);未带有则为 0。 |
getMeridianInjuryRemainingSeconds(accessor, ref, MeridianInjury injury) | float | 此经脉损伤所剩的在线有效秒数;未带有则为 0。 |
getOaths(UUID player) | List<Utils.Oath.Oath> | 当前约束着这名修士的每一道誓言。 |
isDaoHeartFlawed(accessor, ref) | boolean | 这名修士当前是否带有道心破损(背誓的惩罚)。 |
功法
performTechnique 会跑完每一道关卡 —— 系统已启用、该功法已启用、境界解锁、道之相符、灵气消耗、冷却 —— 成功时扣除灵气、盖上冷却戳并运行效果。它对内置功法与你自己注册的功法皆有效,且两种情形下都会触发 TechniqueEvents.PreTechniquePerformEvent 与 TechniquePerformEvent。grantTechnique 是习得的一面:每一个内置来源所走的同一道咽喉,所以扩展自己的授予同样会触发习得前的否决与习得事件。构建一门功法见注册表。
| 方法 | 返回 | 说明 |
|---|---|---|
registerTechnique(String id, String displayName, String nameKey, String descriptionKey, TechniqueRule defaultRule, TechniqueEffect effect) | Technique | 注册一门全新的功法,可经由每一种功法触发器使用。以同一 id 重复注册,返回已有的功法。 |
newTechniqueRule(String id, boolean enabled, boolean daoSpecific, String requiredElement, String elements, String damageType, String unlockRealm, float qiCost, float cooldownSeconds, Object... params) | TechniqueRule | 为你传给 registerTechnique 的 TechniqueRule 提供的便捷构建器。params 是名称与数字交替排列、长度为偶数的列表,你的效果以 context.getParam(key, fallback) 读回。 |
performTechnique(accessor, ref, PlayerRef playerRef, Technique technique) | boolean | 立即施展一门功法,跑完每一道关卡,成功时扣除灵气、盖上冷却戳并运行效果。无论成败玩家都会收到消息。施展成功返回 true,被某道关卡拦下则返回 false。 |
grantTechnique(accessor, ref, PlayerRef playerRef, Technique technique, String messageKey) | boolean | 把一门功法永久写入修士已习得的集合,走的是每个内置来源所用的同一道咽喉 —— 所以扩展自己的授予同样会触发习得前的否决与习得事件。messageKey 是宣告此事的语言键(接受 technique 参数),或 null 表示不作声。若教会了新东西则返回 true。在系统之内,accessor 必须是该系统的 CommandBuffer。 |
registerTechniqueGate(String id, String failureKey, TechniqueGate.Condition condition) | TechniqueGate | 注册一个 TechniqueGate:由另一个模组在运行时提供的条件(「这名玩家此刻是否变成了某个其他模组的生灵形态」)。功法在其 TechniqueRule 上点出它所需的关卡 id。以同一 id 重复注册会替换它。抛出异常的关卡视为通过。 |
registerTechniqueGate(String id, String failureKey, String statusKey, TechniqueGate.Condition condition) | TechniqueGate | 同上,另附你自己的简短状态标签键,用于 /cultivation technique 列表与快捷键界面,取代通用的回退文案。 |
unregisterTechniqueGate(String id) | 撤下一道关卡 —— 供插件干净地卸载。 |
功法境界与快捷键配置组
功法境界与快捷键配置组。一组配置会被导出为一份脱离玩家的、可携带的 TechniquePresetSnapshot,并经由一道过滤导入,只保留接收的修士真正能够施展的功法 —— 快照是一张纸,不是一纸许可。
| 方法 | 返回 | 说明 |
|---|---|---|
registerMasteryStage(MasteryStageRule stage) | boolean | 注册一级额外的功法境界,追加在配置好的阶梯之后。该级被加入则返回 true,阶梯已满则为 false。 |
getMasteryStages() | MasteryStageRule[] | 服务器所配置的功法境界阶梯(至多五级)。 |
getTechniqueMasteryStage(accessor, ref, String techniqueId) | int | 这名修士把某门功法修到了第几级(从 0 起计)。 |
getTechniqueMasteryMultiplier(accessor, ref, String techniqueId) | float | 这名修士对某门功法的境界,施加于其威力之上的倍率。 |
addTechniqueMasteryXp(accessor, ref, PlayerRef playerRef, Technique technique) | 为一门功法存入修习,若这是最后一项未满足的要求则使其晋级 —— 与一次真实施展所走的路径相同。 | |
registerTechniquePresetCap(String key, int cap) | 让扩展提高玩家可保留的快捷键配置组数目(默认 3,上限 8)。以所注册的最高上限为准。请在 shutdown() 中以 unregisterTechniquePresetCap 撤下。 | |
unregisterTechniquePresetCap(String key) | 撤下一次上限提升 —— 供插件干净地卸载。 | |
getMaxTechniquePresets() | int | 玩家此刻可保留多少组快捷键配置:任何扩展所要求的最高值,下限为默认值,上限为封顶值。 |
getTechniquePresetNames(accessor, ref) | List<String> | 这名修士的各组快捷键配置叫什么,按组件所持有的顺序排列 —— 因此名字在此处的下标,就是 exportTechniquePreset 所接受的下标。名字并不唯一。 |
exportTechniquePreset(accessor, ref, int presetIndex) | TechniquePresetSnapshot | 按下标把修士的一组快捷键配置复制出来,成为一份脱离玩家的、可携带的 TechniquePresetSnapshot。若他没有功法组件、或该下标处没有配置,则为 null。 |
exportTechniquePreset(accessor, ref, String presetName) | TechniquePresetSnapshot | 同样的复制,按配置组的名称寻址,匹配时忽略大小写。名字并不唯一,所以返回第一个匹配项。 |
importTechniquePreset(accessor, ref, TechniquePresetSnapshot snapshot, String newName) | TechniquePresetSnapshot.ImportResult | 依据一份快照添加一组快捷键配置,只保留修士真正能施展的功法:在本服务器已注册、已启用、且他已习得。返回一个 ImportResult,含新配置的下标与最终名称、有多少个槽位带有功法,以及因各种原因被拒的功法各有多少。 |
灵兽
已绑定的伙伴,及其所长成的兽技。事件:BeastEvents。注册兽技见注册表。面向玩家的文档:灵兽。
| 方法 | 返回 | 说明 |
|---|---|---|
getBeast(accessor, ref) | SpiritBeastComponent | 玩家所绑定的灵兽;没有则为 null。 |
registerBeastArt(String id, String displayName, String nameKey, String descriptionKey, BeastArtRule defaultRule, BeastArtEffect effect) | BeastArt | 注册一门兽技;若该 id 已被占用,则返回已注册的那一门。兽技属于一个物种:先把它的 id 列入 BeastConfig 中该物种的 Arts,任何生灵才能习得。单是注册,不会把它给任何人。 |
getBeastArts() | Collection<BeastArt> | 每一门已注册的兽技,内置的在前,扩展的按注册顺序在后。 |
getBeastArt(String id) | BeastArt | 此 id 的兽技(对 id 或显示名宽松匹配),或 null。 |
getBeastArtRule(BeastArt art) | BeastArtRule | 服务器对一门兽技的生效规则 —— 其配置条目,否则为其注册的默认值。 |
getKnownBeastArts(accessor, ref) | List<BeastArt> | 这名修士所绑定的灵兽已真正长成的兽技。 |
performBeastArt(accessor, ref, BeastArt art, PlayerRef playerRef) | boolean | 代主人施展其所绑灵兽的某门兽技,跑完模组自己的调用方所跑的每一道关卡(功能已启用、灵兽已召出、兽技已习得且不在冷却、没有扩展否决)。兽技确实施展出去时返回 true。 |
getNextBeastForm(BeastSpecies species) | BeastSpecies | 这只灵兽接下来会进化成的物种;若已是终极形态则为 null。 |
getBeastEvolutionBlockReason(accessor, ref) | String | 这名修士的灵兽此刻为何不能进化,以语言键表示;可以进化则为 null。 |
canBeastBeRidden(accessor, ref) | boolean | 若此刻召出,这名修士的灵兽能否载人。 |
种族、物品与宗门产业
几个小型内容注册表。每一个都在注册表中附示例讲解。
| 方法 | 返回 | 说明 |
|---|---|---|
registerRace(String id, String displayName, String translationKey, CultivationRealm unlockRealm, Supplier<RaceConfig> stats) | PlayerRace | 注册一个全新的种族,玩家修为达到 unlockRealm 后即可选择。以同一 id 重复注册是空操作,返回已有的种族。 |
registerQiAbsorptionItemModifier(String itemId, float multiplier) | 注册或覆写某件物品在打坐玩家当前快捷栏槽位中被持握时所授予的灵脉吸收倍率。 | |
registerSectBuildingType(SectBuildingType type) | 注册一种宗门建筑。服主仍须把它列入 SectConfig,才能决定宗门可否建造;这里只是让该种类为人所知。 | |
registerLifeBoundTrait(LifeBoundTrait trait) | 注册一种本命法宝可以显出的法宝之性。它立刻进入加权掷骰;已绑定的法宝保留其所掷出的。 | |
getLifeBoundTrait(String traitId) | LifeBoundTrait | 此 id 的特质,或 null。 |
getLifeBoundTraitAmount(ItemStack stack, String traitId) | float | 一件具体物品上某命名特质的强度;若该法宝是另一种性,则为 0 —— 所以对任何物品询问任何特质都是安全的。 |
getLifeBoundGrantedTechnique(ItemStack stack) | String | 这件所持法宝此刻借给主人的功法 id,或 null。 |
存档
v0.7.0 对玩家已存修士的读取面。注意这些方法接受的是 Store<EntityStore>,而非 ComponentAccessor。
存档是被观察的,而非被驱动的。门面上刻意没有 switchProfile —— 切换是玩家自己的举动,经由菜单或 /cultivation profile 完成。扩展所能做的,是监听(ProfileEvents,见事件)、让自己按存档维系的状态与之同步,并通过 ProgressionProvider.supportsProfiles()(见编写扩展)昭告它确实这样做了。
| 方法 | 返回 | 说明 |
|---|---|---|
getActiveProfileName(Store<EntityStore> store, Ref<EntityStore> ref) | String | 玩家正在修炼的存档名;若从未创建过则为 ""。任何时候皆可读取 —— 这正是扩展在玩家加入时所需要的,因为那时还没有发生过任何切换。 |
getProfileCount(Store<EntityStore> store, Ref<EntityStore> ref) | int | 这名玩家持有多少份真实(非沙盒)存档。 |
isTestProfileActive(Store<EntityStore> store, Ref<EntityStore> ref) | boolean | 玩家是否身处受权限限制的沙盒存档,其境界是手工设定而非挣来的。凡你自己的模组记录或排名玩家境况之处都值得检查 —— Cultivation 就让沙盒修士不上自己的排行榜。 |
registerProfileCap(String key, int cap) | 让扩展提高玩家可保留的存档数(默认 3,上限 6)。以所注册的最高上限为准,上限回落时不会销毁任何东西。请在 shutdown() 中以 unregisterProfileCap 撤下。 | |
unregisterProfileCap(String key) | 撤下一次上限提升 —— 供插件干净地卸载。 | |
getMaxProfiles() | int | 玩家此刻可保留多少份存档:任何扩展所要求的最高值,下限为默认值,上限为封顶值。 |
称号、旗帜、配色与气息
v0.7.0 一切装饰性的东西。配色、气息或称号的 id 是存在玩家身上的,而非对象本身,所以撤销注册永远安全:无人认领的 id 会回落到默认外观。构建器与示例见注册表。
| 方法 | 返回 | 说明 |
|---|---|---|
registerTitle(CultivationTitle title) | 添加一个玩家可佩戴的装饰称号,加入选择页,以及称号显示的每一处(排行、宗门名册、聊天、头顶名牌)。请在你插件的 setup() 中调用;加载顺序无关紧要。 | |
unregisterTitle(String titleKey) | 移除先前注册的称号 —— 供插件干净地卸载。 | |
getTitles() | List<CultivationTitle> | 每一个已注册的称号,按注册顺序。一份新列表,可放心持有。 |
getTitle(String titleKey) | CultivationTitle | 以此 id 注册的称号,或 null。 |
getTitle(Store<EntityStore> store, Ref<EntityStore> ref) | CultivationTitle | 玩家已佩戴的称号,或 null —— 包括他所择的 id 指向一个已无人注册的称号之时。 |
registerSectBanner(SectBanner banner) | 添加一面宗门可悬挂于其大殿之上的旗帜,加入选择页,以及立于每座已占大殿之上的光柱。请在你插件的 setup() 中调用;加载顺序无关紧要,因为在大殿脉动或宗门打开选择页之前,无人读取该注册表。 | |
unregisterSectBanner(String bannerKey) | 移除先前注册的旗帜 —— 供插件干净地卸载。仍悬挂着它的宗门不会被迁移,也无须迁移:宗门存的是 id,从不存旗帜本身,而对无人认领的 id,getSectBanner 答 null —— 大殿光柱把它读作「用脉品默认」。 | |
getSectBanners() | List<SectBanner> | 每一面已注册的旗帜,按注册顺序。一份新列表,可放心持有。 |
getSectBanner(String bannerKey) | SectBanner | 以此 id 注册的旗帜;无人认领则为 null。 |
registerPalette(CultivationPalette palette) | 添加一种玩家可穿戴的外观,加入选择页与每一次页面构建。请在你插件的 setup() 中调用;加载顺序无关紧要。 | |
unregisterPalette(String paletteKey) | 移除先前注册的配色 —— 供插件干净地卸载。仍穿着它的玩家不会被迁移,也无须迁移:没有任何东西存放配色对象,只存它的 id,而 getPalette(store, ref) 对无人认领的 id 回落到默认。 | |
getPalettes() | List<CultivationPalette> | 每一个已注册的配色,按注册顺序。一份新列表,可放心持有。 |
getPalette(String paletteKey) | CultivationPalette | 此 id 的配色,或 null。 |
getPalette(ComponentAccessor<EntityStore> store, Ref<EntityStore> ref) | CultivationPalette | 玩家所穿的配色,或 null 表示 Cultivation 自己的默认外观(所存 id 指向一个无人注册的配色时也为 null)。解析顺序:已注册的 CultivationPaletteLock 直接胜出,其次是玩家自己的选择,最后才是已注册的 CultivationPaletteDefault。 |
getExplicitPaletteKey(accessor, ref) | String | 玩家实际所存的配色 id,在应用任何锁或默认之前 —— 从未选择过则为 null。 |
resolvePaletteDefault(accessor, ref) | String | 第一个已注册的 CultivationPaletteDefault 为这名玩家点出的键,已对照配色注册表核验;若无一者有意见则为 null。 |
registerPaletteDefault(String key, CultivationPaletteDefault rule) | 注册一条规则,为尚未选择的玩家提供默认外观。是 registerPaletteLock 的软版本:锁会覆盖选择,默认只填补空缺。第一条点出已注册配色的规则胜出。 | |
unregisterPaletteDefault(String key) | 撤下一条默认配色规则 —— 供插件干净地卸载。曾被以其外观绘制的玩家不会被迁移,也无须迁移:从未有东西写入过他们,所以下次构建页面时,他们自然回到 Cultivation 自己的外观。 | |
registerPaletteLock(CultivationPaletteLock lock) | 注册一条可对某些玩家强制指定某配色的规则 —— 比如某个环外大道之根索要自己的袍服 —— 在其生效期间,完全覆盖他们自己的主题选择。请在你插件的 setup() 中调用。 | |
unregisterPaletteLock(CultivationPaletteLock lock) | 移除先前注册的配色锁 —— 供插件干净地卸载。 | |
resolveActivePaletteLock(accessor, ref) | CultivationPaletteLock | 当前正对这名玩家强制指定配色的已注册配色锁,且已解析到一个已存在的已注册配色 —— 若无锁适用,或所有适用的锁都点了一个无人(尚未)注册的配色,则为 null,此时每个调用者都会回落到这名玩家自己的设置,与本接口别处对无人认领的配色 id 的处理完全一样。 |
document(Store<EntityStore> store, Ref<EntityStore> ref, String basePath) | String | 为这名玩家绘制、用来取代 basePath 的文档 —— 其配色对它的变体,或原样的 basePath。请把每一次 commandBuilder.append(...) 都经由它,而不只是根文档。 |
document(CultivationPalette palette, String basePath) | String | 针对一个已查得的配色作同样的解析,适用于要追加许多文档的构建。null 表示默认外观,原样返回 basePath。 |
setPalette(Store<EntityStore> store, Ref<EntityStore> ref, String paletteKey) | boolean | 设定玩家所选的配色并把他的状态栏换回该配色 —— 即设置页主题下拉框所执行的整套流程。该键会被重新核验,而非信任。已应用则返回 true;若他没有设置组件、有配色锁生效、或该键指向一个未注册的配色或未向他开放的配色,则返回 false。 |
registerMeditationAura(CultivationMeditationAura aura) | 添加一种玩家可选的打坐气息,加入选择页,以及每一次生成粒子的打坐 tick、突破仪式与晋阶仪式。 | |
unregisterMeditationAura(String auraKey) | 移除先前注册的打坐气息 —— 供插件干净地卸载。 | |
getMeditationAuras() | List<CultivationMeditationAura> | 每一种已注册的打坐气息,按注册顺序。一份新列表,可放心持有。 |
getMeditationAura(String auraKey) | CultivationMeditationAura | 以此 id 注册的气息,或 null。 |
getMeditationAura(accessor, ref) | CultivationMeditationAura | 玩家所选的气息,或 null 表示他在 Cultivation 自己的粒子之下打坐(所存 id 指向一个无人注册的气息时亦然)。 |
setMeditationAura(Store<EntityStore> store, Ref<EntityStore> ref, String auraKey) | boolean | 设定玩家所选的打坐气息,先重新核验该键。null 或空串则回到内置粒子。已应用则返回 true。 |
registerOffRingRoot(DaoRoot root) | 认领一个环外的 DaoElement 槽位(Cultivation 自带一个,即玩笑性质的 DUCK),为其命名,并可选地覆写相克加成。在被认领之前,该元素保持不可选。 | |
unregisterOffRingRoot(DaoElement element) | 释放先前认领的环外元素 —— 供插件干净地卸载。正行此道的修士不会被迁移;该元素只是重新变得不可选,与服务器关掉的任何其他灵根无异。 | |
getOffRingRoot(DaoElement element) | DaoRoot | 认领此环外元素的灵根;无人认领则为 null。 |
isOffRingRootClaimed(DaoElement element) | boolean | 当前是否有模组认领了此环外元素。 |
常驻修正与属性加成
registerModifierSource 是为一切改变修士是什么的东西而设的钩子 —— 血脉、体质、特殊体质。十八条类型化通道及其组合方式,见注册表。applyStatBonus 是更底层的工具:对玩家的某项引擎属性施加一个带键的固定加成,与天赋树所用的是同一机制。
| 方法 | 返回 | 说明 |
|---|---|---|
registerModifierSource(String key, CultivationModifierSource source) | 注册一个面向玩家的、覆盖 Cultivation 自身各系统的常驻修正 —— 为一切改变修士是什么而非他做什么的东西所设的钩子:血脉、体质、特殊体质。通道及其组合方式见 CultivationModifierSource。 | |
unregisterModifierSource(String key) | 撤下一个修正来源 —— 供插件干净地卸载。 | |
newBonus(String sourceKey, String statKey, float amount, boolean percent) | CultivationBonus | 为 CultivationModifierSource.bonuses 构建一行总览加成。sourceKey 与 statKey 是 server.lang 键;凡有合适的,请沿用 Cultivation 自己的属性键,使你的行能与模组的相加。在 percent 上不一致的行绝不会相加。 |
applyStatBonus(accessor, ref, int statIndex, String key, float amount) | 对玩家的某项引擎属性施加一个带键的固定加成,即天赋树所用的机制。带键:以同一个键再次调用会替换该键的贡献,0 则撤回。这不是治疗 —— 属性池在变化前后保持相同的当前/最大比例。 |
替换阶梯与用词
两个整层接管,完整内容见编写扩展。refreshProgression 是 ProgressionProvider 在背着 Cultivation 改动玩家数字时,每次都要调用的那一个。
| 方法 | 返回 | 说明 |
|---|---|---|
setProgressionProvider(ProgressionProvider provider) | 把整条境界、阶段与灵气的阶梯交给另一个模组,其余每个子系统仍照常在其之上运行。最后注册者胜出,并会记录一条点名双方的警告;null 则交还进阶体系。见编写扩展。 | |
getProgressionProvider() | ProgressionProvider | 已安装的 provider;内置阶梯当家时为 null。 |
refreshProgression(accessor, ref) | 告知 Cultivation 某玩家的进阶数字在它背后变了:重新施加其最大生命修正,刷新状态栏与排行,并重读每一道门槛所检验的境界。provider 每次改动等级时都必须调用它。 | |
setTheme(CultivationTheme newTheme) | 改写模组面向玩家的全套用词。最后注册者胜出;null 恢复 Cultivation 自己的用词。见编写扩展。 | |
getTheme() | CultivationTheme | 已安装的主题;模组使用自己的用词时为 null。 |
菜单、典籍与身份
向共享的导航栏贡献一个页面,向游戏内典籍贡献一篇条目,向身份页贡献一个标签页,或向渐进式解锁贡献一个系统。每一项都在注册表中附示例讲解。
| 方法 | 返回 | 说明 |
|---|---|---|
registerMenuPage(CultivationMenuPage page) | 向每个 Cultivation 菜单所带的导航栏添加一个页面。以已有的 id 注册会替换它 —— 模组也正是以此接管 Cultivation 自己的某一项。 | |
unregisterMenuPage(String pageKey) | 移除先前注册的页面 —— 供插件干净地卸载。 | |
getMenuPages() | List<CultivationMenuPage> | 每一个菜单页,按其在栏上出现的顺序:依 CultivationMenuPage.getSortOrder(),序号相同者再按注册顺序。 |
getMenuPage(String pageKey) | CultivationMenuPage | 以此 id 注册的页面;无人认领则为 null。 |
buildMenuNav(UICommandBuilder commandBuilder, UIEventBuilder eventBuilder, PlayerRef playerRef, String currentPageKey) | 把共享导航栏绘入你页面的 #NavBar 占位处,并让你自己页面的按钮呈禁用状态,以标示玩家身在何处。 | |
buildMenuNav(UICommandBuilder commandBuilder, UIEventBuilder eventBuilder, PlayerRef playerRef, String currentPageKey, Store<EntityStore> store, Ref<EntityStore> ref) | 同一条导航栏,但以观看者所选的配色绘制。请优先用这一个;不带 store 与 ref 的重载总是以默认的绯红与金色绘制。 | |
handleMenuNav(Store<EntityStore> store, Ref<EntityStore> ref, PlayerRef playerRef, String navKey) | 处理一次导航点击,打开它所点名的页面。当事件来自你页面自己的按钮、你的 codec 字段持有 null 时调用是安全的;对玩家无权打开的 id 同样安全。 | |
tryHandleMenuNav(Store<EntityStore> store, Ref<EntityStore> ref, PlayerRef playerRef, String navKey) | boolean | 同 handleMenuNav,但会报告是否打开了某个页面。在会锁定界面的导航绑定中得到 false 时,请自行以 sendUpdate(null, null, false) 应答这次点击,否则客户端会一直停在加载状态。 |
openMenuPage(Store<EntityStore> store, Ref<EntityStore> ref, CustomUIPage page) | 把玩家当前打开的自定义页面换成另一个 —— 菜单页的 onOpen 通常做的就是这个。 | |
registerCodexEntry(CodexEntry entry) | 向游戏内典籍添加一篇条目。请针对读者来写正文,使它能陈述这台服务器的真实数值。以已有的 id 注册会替换它。 | |
unregisterCodexEntry(String entryId) | 移除先前注册的条目 —— 供插件干净地卸载。 | |
getCodexEntries() | List<CodexEntry> | 每一篇条目,依 CodexEntry.getSortOrder() 再按注册顺序排列。分组是调用者的事 —— 见 getCodexCategories()。 |
getCodexEntry(String entryId) | CodexEntry | 以此 id 注册的条目;无人认领则为 null。 |
registerCodexCategory(CodexCategory category) | 向典籍索引添加一个标题。模组自带四个(PATH、SELF、WORLD、CRAFT);归入其中之一,通常好过再添第五个。 | |
unregisterCodexCategory(String categoryId) | 移除一个典籍标题。 | |
getCodexCategories() | List<CodexCategory> | 每一个索引标题,按显示顺序。一份新列表,可放心持有。 |
registerIdentitySection(IdentitySection section) | 在内置的种族与称号两个标签页之后,向身份页添加一个标签页。以已有的 id 注册会替换它。 | |
unregisterIdentitySection(String sectionId) | 移除先前注册的分节 —— 供插件干净地卸载。 | |
getIdentitySections() | List<IdentitySection> | 每一个已注册的分节,依 IdentitySection.getSortOrder() 再按注册顺序排列。可见性是逐玩家的(IdentitySection.isVisible),所以与 getAdminConfigSections() 不同,这里并不过滤 —— 身份页会针对观看者逐节自行核验。 |
getIdentitySection(String sectionId) | IdentitySection | 以此 id 注册的分节;无人认领则为 null。 |
newIdentitySection(String id, Message label, int sortOrder, Consumer<IdentitySectionContext> buildCallback, IdentitySection.ActionHandler actionHandler) | IdentitySection | 由各个部件构建一个 IdentitySection,使贡献一个标签页只需一次调用:一个 id、一个标签、一个排序序号、一个追加你的文档并绑定其动作的构建回调,以及一个动作处理器。 |
newIdentitySection(String id, Message label, int sortOrder, Consumer<IdentitySectionContext> buildCallback) | IdentitySection | 同上,用于没有交互内容的分节(无动作处理器)。 |
registerRevealableSystem(RevealableSystem system) | 添加一个系统,渐进式解锁可将其挡在菜单与典籍之外,直至玩家所达过的最高境界,或某个 unlockedBy/engagedBy 判定,使它变得相关。 | |
unregisterRevealableSystem(String systemId) | 移除先前注册的系统 —— 供插件干净地卸载,或供根本不想让它被隐藏的扩展使用。 | |
getRevealableSystems() | List<RevealableSystem> | 每一个已注册的系统,依 RevealableSystem.getSortOrder() 再按注册顺序排列。一份新列表,可放心持有。 |
getRevealableSystem(String systemId) | RevealableSystem | 以此 id 注册的系统;无人认领则为 null。 |
isSystemRevealed(accessor, ref, String systemId) | boolean | 玩家当前在其菜单与典籍中是否看得见该系统。仅当渐进式解锁正在隐藏它时为 false;对未注册的 id 为 true。 |
v0.11.1 Cultivation 自己的系统与典籍条目,也是经由这些同样的调用注册的。0.11.1 新增的编号 —— 两个渐进式解锁系统 cultivation:daoSeals 与 cultivation:daoDomains,以及四篇典籍条目 —— 列在可显现系统之下。
管理菜单
把你自己的设置与逐玩家的操作放进 /cultivation admin。五种行的类型见注册表。PlayerAdminAction 是一个由你实现的接口;它没有工厂方法。
| 方法 | 返回 | 说明 |
|---|---|---|
registerAdminConfigSection(AdminConfigSection section) | 向管理菜单的配置页添加一组可调的行(并对管理员显示于设置菜单)。以已有的键注册会替换它 —— 扩展也正是以此重排、隐藏或替换 Cultivation 自己的某个分节。 | |
unregisterAdminConfigSection(String sectionKey) | 移除先前注册的分节 —— 供插件干净地卸载。 | |
getAdminConfigSections() | List<AdminConfigSection> | 每一个已注册的分节(Cultivation 自己的也包括在内),按排序序号再按注册顺序排列,当前正自行隐藏的则略去。 |
getAdminConfigSection(String sectionKey) | AdminConfigSection | 以此键注册的分节;无人认领则为 null。 |
newAdminConfigSection(String key, String labelKey, String hintKey, int sortOrder, Runnable save, List<AdminConfigField> fields) | AdminConfigSection | 由各个部件构建一个分节 —— 键、标签与提示语言键、排序序号、保存回调与各行的列表。完整示例见注册表。 |
newAdminConfigField(String key, Message label, DoubleSupplier getter, DoubleConsumer setter) | AdminConfigField | 由 getter 与 setter 构建一行可编辑的小数。请通过 supplier 读取配置,而不是捕获配置对象:重载会替换持有者背后的实例,被捕获的那一个会去编辑一份被丢弃的副本。 |
newAdminIntField(String key, Message label, DoubleSupplier getter, DoubleConsumer setter) | AdminConfigField | 同 newAdminConfigField,但渲染成整数字段 —— 用于计数、等级上限或档位,普通数字行所显示的两位小数在那里只是噪音。 |
newAdminBooleanField(String key, Message label, BooleanSupplier getter, Consumer<Boolean> setter) | AdminConfigField | 一个真正的复选框行,使总开关不必再伪装成 0/1 数字 —— 在它出现之前,Cultivation 自己设置里的每一个布尔值都不得不如此,这也正是其中许多只能在配置文件里改的原因。 |
newAdminChoiceField(String key, Message label, Supplier<List<AdminConfigChoice>> choices, Supplier<String> getter, Consumer<String> setter) | AdminConfigField | 一个基于固定选项集的下拉行,用于任何枚举型的值。choices 每次渲染都会重读;setter 拿到的是所选项的 id,它来自客户端 —— 请重新解析。 |
newAdminTextField(String key, Message label, Supplier<String> getter, Consumer<String> setter) | AdminConfigField | 一个自由文本行。凡合法取值是已知集合,就请改用 newAdminChoiceField —— 下拉框不可能填错。 |
withTooltip(AdminConfigField field, String tooltip) | AdminConfigField | 为任一行添加一句话说明。它是一个普通 String,所以无法翻译;凡须在每种语言下都可读的内容,请放在该行的标签里。 |
adminPageOnly(AdminConfigSection section) | AdminConfigSection | 包裹一个分节,使它只出现在管理页,而不出现在设置菜单 —— 供贡献了好几个装着真正平衡数值的分节的模组使用。 |
registerPlayerAdminAction(PlayerAdminAction action) | 向 /cultivation admin 的玩家页添加一个「下拉框加应用按钮」的行,作用于所选的玩家。PlayerAdminAction 是一个由你实现的接口。它的键必须含有 :;坏键会被拒绝并记录一条警告。 | |
unregisterPlayerAdminAction(String actionKey) | 移除先前注册的操作 —— 供插件干净地卸载。 | |
getPlayerAdminActions() | List<PlayerAdminAction> | 每一个已注册的操作,依 PlayerAdminAction.getSortOrder() 再按注册顺序排列,当前正自行隐藏(PlayerAdminAction.isVisible())的则略去。 |
更新、构建与兼容性检查
扩展可各以一次调用加入的三项相互独立的检查,皆搭载同一条后台线程与服主的 Update-Check-Enabled 开关。皆为失败即放行。清单的格式见注册表。
| 方法 | 返回 | 说明 |
|---|---|---|
registerUpdateCheck(String modId, String displayName, String currentVersion, String manifestUrl, String downloadUrl) | UpdateCheck | 把你的模组放进 Cultivation 的更新检查:你所指的清单会在后台线程上拉取,当已安装版本落后于所发布的版本时,管理员在加入时会被告知。返回该注册项,你可据此读取最近一次检查的结果。 |
registerUpdateCheck(String modId, String displayName, String currentVersion, String manifestUrl) | UpdateCheck | 同上,但不指定下载去处 —— 消息中便只陈述版本。 |
unregisterUpdateCheck(String modId) | 把先前注册的模组从这轮扫描中移除 —— 供插件干净地卸载。 | |
getUpdateChecks() | List<UpdateCheck> | 每一个已注册的模组 —— 包括 Cultivation 自己的注册项,因为那也只是一项普通注册 —— 按注册顺序。 |
getAvailableUpdates() | List<UpdateCheck> | 只含当前已知落后、且未被其清单的 ignore 列表压制的注册项。在第一轮扫描落定(启动后数秒)之前为空。 |
registerBuildCheck(String modId, String displayName, String version, Path jarPath, String manifestUrl) | BuildCheck | 把你的模组放进构建检查:你 jar 的已编译类会被哈希,并与你发布为官方的摘要比对。是检测,而非保护。结论写入控制台与 getBuildStatus(modId)。 |
unregisterBuildCheck(String modId) | 把先前注册的模组从构建检查中移除 —— 供插件干净地卸载。 | |
getBuildChecks() | List<BuildCheck> | 每一个已注册模组的构建检查,按注册顺序。一份新列表,可放心持有。 |
getBuildStatus(String modId) | BuildStatus | 构建检查对某个已注册模组得出的结论;若该 id 下没有注册任何东西,则为 BuildStatus.UNKNOWN。 |
getBuildStatus() | BuildStatus | 构建检查对 Cultivation 自身得出的结论。 |
isOfficialBuild() | boolean | getBuildStatus() 化简成的布尔值。仅在确凿不符时为 false —— 无从检查的构建会被报告为官方 —— 所以它分不清已验证与未知;要知道这一点,请问 getBuildStatus()。 |
registerCompatCheck(String modId, String displayName, String version, String manifestUrl, Consumer<CompatCheck> onVerdict) | CompatCheck | 在兼容性检查中注册一个扩展:其已安装版本被公布为可与哪些 Cultivation 版本共同工作。onVerdict 在该配对解析为 UNKNOWN 之外的任何结果时,于检查自己的守护线程上运行一次;传 null,并改为轮询 getCompatStatus。 |
registerCompatCheck(String modId, String displayName, String version, String manifestUrl) | CompatCheck | 同上,出结论时无事可运行。 |
unregisterCompatCheck(String modId) | 把先前注册的扩展从兼容性检查中移除 —— 供插件干净地卸载。 | |
getCompatChecks() | List<CompatCheck> | 每一个已注册扩展的兼容性检查,按注册顺序。一份新列表,可放心持有。 |
getCompatStatus(String modId) | CompatStatus | 兼容性检查对某个已注册扩展得出的结论;若该 id 下没有注册任何东西,则为 CompatStatus.UNKNOWN —— 这也是第一次检查落定之前的答案,以及任何无法联网的服务器上的答案。 |
宝阁权益
把宝阁中的一件商品,与游戏内发生的某件事绑在一起。见注册表。
| 方法 | 返回 | 说明 |
|---|---|---|
registerStoreBenefit(StoreBenefit benefit) | 向权益同步添加一项可购买的网店权益。投递、缓存、运营方的配置开关与 /cultivation store recheck,都随注册一并而来。 | |
unregisterStoreBenefit(String key) | 移除先前注册的网店权益 —— 供插件干净地卸载。 | |
getStoreBenefits() | List<StoreBenefit> | 每一项已注册的网店权益,按注册顺序。一份新列表,可放心持有。 |
hasStoreBenefit(UUID playerUuid, String productSlug) | boolean | 依最近一次同步,这名玩家是否在网店购买了这件商品。运营方禁用了该系统或该商品时为 false。可从任意线程读取。 |
已安装的模组
v0.6.1 它们各自改变什么,见模组兼容。
| 方法 | 返回 | 说明 |
|---|---|---|
isEndlessLevelingInstalled() | boolean | 是否已安装 Endless Leveling。安装后,Cultivation 把最大生命与输出伤害交给 EL,而不自己施加,因此两套进阶是相加而非相乘 —— 开关见 CultivationConfigs.endlessLeveling()。 |
isPlaceholderApiRegistered() | boolean | Cultivation 的 %cultivation_...% PlaceholderAPI 扩展是否已注册并在应答 —— 即已装有 PAPI,并且它接受了这次注册。 |
isMarriageInstalled() | boolean | 是否已安装 Marriage 模组,双修正以此为门槛。没有它的服务器上为 false,此时 CultivationConfigs.partner() 中的一切都不起作用。 |
配置文件
v0.6.1 plugin.siren.API.CultivationConfigs 让 Cultivation 的 104 份配置文件(连同经 race() 访问的三份种族配置共 107 份)中的 49 份可读可写,使扩展无需导入模组内部,便能问出这台服务器在跑什么。每个访问器返回当前生效的 Config<T> 持有者;race(PlayerRace) 则直接返回该种族的 RaceConfig。
// 读取
boolean daoOn = CultivationConfigs.dao().get().isDaoEnabled();
// 写入 —— 持久化是调用者的事,所以一批编辑只花一次文件写入
var holder = CultivationConfigs.spiritVein();
holder.get().setSpiritVeinRegenPerSecond(2.5f);
holder.save();
一个未经保存而改动的值,在本次会话中是生效的,重启即失;这有时正是你想要的。读取在哪里都安全。写入则可在插件的 setup() 中、也可在任何世界线程上安全进行,条件与 Cultivation 自己的管理菜单写入时相同:这些配置对象是没有跨线程协调的普通可变持有者,所以两个线程争写同一字段,结果是后写者胜,而不会损坏。
一次重载 —— 管理员按下保存,或文件在磁盘上变了 —— 会替换持有者背后的实例,所以被捕获的 DaoConfig 字段会变成一份被丢弃的副本,对它的编辑无处可去。请在使用处写 CultivationConfigs.dao().get().isDaoEnabled()。
若要为某一名玩家或某一刻、而不是整台服务器改一个数,请使用对应的 Pre* 事件(事件)。
| 访问器 | 返回 | 文件 | 内容 |
|---|---|---|---|
cultivation() | Config<CultivationConfig> | Config.json | 经验曲线,以及每级的生命与伤害加成。 |
spiritCores() | Config<SpiritCoreConfig> | Cultivation/SpiritCoreConfig.json | 三档灵核的掉落几率与灵气值。 |
spiritVein() | Config<SpiritVeinConfig> | Cultivation/SpiritVeinConfig.json | 灵脉的播种、回复、抽取、脉品与灵气感知。 |
breakthrough() | Config<BreakthroughConfig> | Cultivation/BreakthroughConfig.json | 突破与晋阶仪式、天劫与心魔劫。 |
bodyTempering() | Config<BodyTemperingConfig> | Cultivation/BodyTemperingConfig.json | 炼体阶梯:它的曲线、护甲如何削弱它,以及它回馈的减伤。 |
skillTree() | Config<SkillTreeConfig> | Cultivation/SkillTreeConfig.json | 天赋点的授予、属性上限与洗点。 |
raceSystem() | Config<RaceSystemConfig> | Cultivation/RaceSystemConfig.json | 跨种族的行为 —— 尤其是管理员的 setrace 是否绕过境界门槛。 |
race(PlayerRace race) | RaceConfig | 每个种族一个文件 | 某个种族自己的属性块。每个已注册的种族都有一份,包括由其他模组经 registerRace 添加的种族。直接返回 RaceConfig 本身,而非持有者。 |
dao() | Config<DaoConfig> | Arts/DaoConfig.json | 元素、漂移、阴阳、德行之途、业力与天候共鸣。 |
daoComprehension() | Config<DaoComprehensionConfig> | Arts/DaoComprehensionConfig.json | 天道、开放的个人之道注册表,以及悟道。 |
technique() | Config<TechniqueConfig> | Arts/TechniqueConfig.json | 功法系统的总开关、快捷键门槛与逐功法的规则覆写。 |
manual() | Config<ManualConfig> | Arts/ManualConfig.json | 可拾取的秘籍及其所传。 |
alchemy() | Config<AlchemyConfig> | Arts/AlchemyConfig.json | 丹药 —— 其效果、时长与蓄存道数。 |
talisman() | Config<TalismanConfig> | Arts/TalismanConfig.json | 符箓 —— 案前仪式、品阶掷骰与符箓境界阶梯。 |
array() | Config<ArrayConfig> | Society/ArrayConfig.json | 传送阵网络:总开关、境界门槛、逐目的地的开关、灵气消耗与冷却模型,以及启用半径。 |
forging() | Config<ForgingConfig> | Arts/ForgingConfig.json | 锻造 —— 锻造台仪式、材料阶梯与品阶掷骰。 |
refinement() | Config<RefinementConfig> | Arts/RefinementConfig.json | 兵器炼器与道亲和淬炼。 |
lifeBound() | Config<LifeBoundConfig> | Arts/LifeBoundConfig.json | 本命法宝 —— 逐物品的武器与护甲成长。 |
weaponSpirit() | Config<WeaponSpiritConfig> | Arts/WeaponSpiritConfig.json | 器灵 —— 本命法宝的苏醒、等级阶梯与羁绊功法。 |
beast() | Config<BeastConfig> | Arts/BeastConfig.json | 灵兽 —— 物种、收服、成长与伙伴职能。 |
breeding() | Config<BreedingConfig> | Arts/BreedingConfig.json | 灵兽繁育 —— 兽栏、双修士仪式与孵化。 |
sect() | Config<SectConfig> | Society/SectConfig.json | 宗门 —— 规模、大殿、加成、邀请与碑文。 |
formation() | Config<FormationConfig> | Society/FormationConfig.json | 阵法 —— 每种阵法的花费与作用。 |
dwelling() | Config<DwellingConfig> | Society/DwellingConfig.json | 洞府、灵泉、维护与闭关。 |
war() | Config<WarConfig> | Society/WarConfig.json | 宗门攻伐与夺脉围攻。 |
duel() | Config<DuelConfig> | Society/DuelConfig.json | 斗法及其赌注。 |
alliance() | Config<AllianceConfig> | Society/AllianceConfig.json | 宗门间邦交:互不侵犯、通商与结盟的阶梯,以及另设的单方世仇表。 |
party() | Config<PartyConfig> | Society/PartyConfig.json | 临时组队系统 —— 最大人数与邀请过期。 |
dungeon() | Config<DungeonConfig> | Society/DungeonConfig.json | 队伍副本:总开关、入口门槛、队伍规模、副本实例资产,以及首领战的阈值与量级。 |
rival() | Config<RivalConfig> | Society/RivalConfig.json | 游历道友 —— 刷新时程、存续时长、最大生命与胜者的奖励。 |
treasure() | Config<TreasureConfig> | Society/TreasureConfig.json | 埋藏的宝藏与遗迹宝库,灵气感知到达精确阶段后方可发现。 |
faction() | Config<FactionConfig> | Society/FactionConfig.json | NPC 门派声望系统 —— 档位、世仇对与对立道途的获取。 |
oath() | Config<OathConfig> | Cultivation/OathConfig.json | 天道誓言的提出与应允,以及背誓的惩罚(灵气损失、业力、道心破损)。 |
partner() | Config<PartnerConfig> | Society/PartnerConfig.json | 双修。除非安装了 Marriage 模组,否则不起作用 —— 见 isMarriageInstalled()。 |
tea() | Config<TeaConfig> | Cultivation/TeaConfig.json | 茶道 —— 回合、时机窗口、草药花费、和谐档位,以及茶会之后的灵气增益。 |
weiqi() | Config<WeiqiConfig> | Society/WeiqiConfig.json | 围棋 —— 总开关、落子与重连的计时,以及一局终了的功德奖励。 |
secretRealm() | Config<SecretRealmConfig> | Society/SecretRealmConfig.json | 秘境,以及飞升方可进入的仙庭层级 —— 时程、时长、灵气倍率、灵兽投放与秘籍掉落加成,外加每一档的天候。 |
dreamTrial() | Config<DreamTrialConfig> | Cultivation/DreamTrialConfig.json | 空镜处的幻境劫 —— 场所锚点、进入门槛、道心拨盘,以及醒梦符的蓄存机制。 |
campaign() | Config<CampaignConfig> | Cultivation/CampaignConfig.json | 叙事战役:总开关、各章的任务链数值,以及每位常驻角色出现的位置。 |
market() | Config<MarketConfig> | Society/MarketConfig.json | 玩家经营的拍卖行,与定期出现的行商 NPC。 |
tide() | Config<TideConfig> | Society/TideConfig.json | 兽潮:自动调度器、预警/来袭/收束各阶段、攻势完整度,以及压制的惩罚或贡献奖励。 |
masterDisciple() | Config<MasterDiscipleConfig> | Society/MasterDiscipleConfig.json | 师徒 —— 提出与应允、受半径限制的灵气加成、传授与突破奖励。 |
qiDeviation() | Config<QiDeviationConfig> | Cultivation/QiDeviationConfig.json | 走火入魔 —— 心魔劫之后缠身的余患,及其惩罚与解法。 |
tournament() | Config<TournamentConfig> | Society/TournamentConfig.json | 宗门论道大会 —— 对阵表规模、魁首奖励,以及手动或自动的开赛节律。 |
celestial() | Config<CelestialConfig> | Cultivation/CelestialConfig.json | 天象 —— 共享调度器,加上灵潮、流星、血月与星陨汇聚。 |
pathWar() | Config<PathWarConfig> | Society/PathWarConfig.json | 正魔之战 —— 正道对魔道的击杀数竞赛:计分、防刷、天裂窗口与称号门槛。 |
season() | Config<SeasonConfig> | Society/SeasonConfig.json | 赛季循环:总开关、赛季时长与英名阁的调参。 |
endlessLeveling() | Config<EndlessLevelingConfig> | Compatibility/EndlessLevelingConfig.json | Cultivation 如何与 Endless Leveling 共享自己所提升的属性。除非安装了 EL,否则不起作用 —— 见 isEndlessLevelingInstalled()。 |
update() | Config<UpdateConfig> | UpdateConfig.json | 服务器是否检查模组更新、多久一次,以及是否在管理员加入时告知。约束每一个经 registerUpdateCheck 注册的模组。 |
webStore() | Config<WebStoreConfig> | WebStoreConfig.json | 宝阁权益同步:xianxia.dev 上的购买是否在此生效、名单多久重读一次,以及重查指令是否可用。 |
saveAll() 把全部 49 个持有者写入磁盘 —— 很少是你想要的,因为只保存你所编辑的那一个更省。v0.11.1 它如今也涵盖了此前跳过的 daoComprehension()、secretRealm() 与 webStore(),以及三份内置种族文件(Race/Human.json、Race/Demon.json、Race/Deity.json)。其他模组经 registerRace 注册的种族仍不在其内:它的数值存放在那个模组自己的文件里,Cultivation 不去写它,而 race(...) 也不是持有者。
104 份配置文件中的另外 55 份没有访问器,所以不属于公开接口。v0.11.2 这 55 份里有十份是新增的:DeathPenaltyConfig、RetainerConfig、AuraPressureConfig、SpiritStoneConfig、StructureConfig、SpiritMineConfig、SwordTombConfig、FallenCaveConfig、TribulationCraterConfig 与 PillFurnaceConfig。v0.11.1 其余较早的 45 份里有六份是 0.11.1 新增的:VeinCompassConfig、VeinTapConfig、DaoSealConfig、DaoDomainConfig、SectArrayConfig 与 BreachRewardConfig。完整清单(新增的十份排在最后):ReincarnationConfig、GrandDaoConfig、MeridianConfig、LifespanConfig、CombatDepthConfig、FistConfig、DaoSealConfig、DaoDomainConfig、VeinCompassConfig、VeinTapConfig、DivinationConfig、HearthConfig、ForageConfig、SolarTermConfig、HerbScatterConfig、MeritConfig、GuardianConfig、SectArrayConfig、SermonConfig、SoulEscapeConfig、RogueConfig、LandConfig、DaoDuelConfig、DaoDuelTournamentConfig、WagerConfig、LegacyConfig、ReclusiveConfig、RetreatConfig、CompassConfig、RevealConfig、DaoInheritanceConfig、GrandTournamentConfig、DepthsConfig、WorldBossConfig、RiftConfig、BreachRewardConfig、HeavenlyRealmConfig、SeaOfConsciousnessConfig、PagodaConfig、BountyConfig、LeaderboardConfig、DaoMasteryConfig、QuestConfig、InnerDemonConfig、CleanseRiteConfig、DeathPenaltyConfig、RetainerConfig、AuraPressureConfig、SpiritStoneConfig、StructureConfig、SpiritMineConfig、SwordTombConfig、FallenCaveConfig、TribulationCraterConfig、PillFurnaceConfig。它们的键见配置各页;需要其中某一份的扩展,只能请服主去编辑该文件。
注册索引
门面上的每一个 register* 方法、它添加什么,以及在哪里讲解。其中 23 个有对应的 unregister*,可在你的 shutdown() 中调用;其余七个 —— registerRace、registerTechnique、registerQiAbsorptionItemModifier、registerBeastArt、registerMasteryStage、registerSectBuildingType 与 registerLifeBoundTrait —— 无法撤下。重复注册同一 id 在任何情形下都是安全的;对种族、功法或兽技,它返回已有的条目而不替换,对其余大多数则是替换。
| 方法 | 所注册的 | 撤下方式 | 章节 |
|---|---|---|---|
registerRace | 一个可玩的种族。 | - | 注册表 |
registerTechnique | 一门可施展的功法。 | - | 注册表 |
registerTechniqueGate(2 个重载) | 功法可要求的一个运行时条件。 | unregisterTechniqueGate | 注册表 |
registerQiAbsorptionItemModifier | 某件持握之物的灵脉吸收倍率。 | - | 注册表 |
registerAdminConfigSection | 管理菜单配置页上的一组可调行。 | unregisterAdminConfigSection | 注册表 |
registerPlayerAdminAction | 管理菜单玩家页上的一个逐玩家行。 | unregisterPlayerAdminAction | 注册表 |
registerIdentitySection | 身份页上位于种族与称号之后的一个标签页。 | unregisterIdentitySection | 注册表 |
registerMenuPage | 每个 Cultivation 菜单所带导航栏上的一个按钮。 | unregisterMenuPage | 注册表 |
registerCodexEntry | 游戏内典籍中的一篇条目。 | unregisterCodexEntry | 注册表 |
registerCodexCategory | 典籍索引中的一个标题。 | unregisterCodexCategory | 注册表 |
registerRevealableSystem | 渐进式解锁可将其隐藏、直至它变得相关的一个系统。 | unregisterRevealableSystem | 注册表 |
registerTitle | 一个装饰性的称号。 | unregisterTitle | 注册表 |
registerSectBanner | 宗门可悬挂于其大殿之上的一面旗帜。 | unregisterSectBanner | 注册表 |
registerPalette | 一套菜单与 HUD 配色。 | unregisterPalette | 注册表 |
registerPaletteDefault | 为尚未选择的玩家挑选配色的一条规则。 | unregisterPaletteDefault | 注册表 |
registerPaletteLock | 对某些玩家强制指定配色的一条规则。 | unregisterPaletteLock | 注册表 |
registerMeditationAura | 一种打坐、突破与晋阶的粒子外观。 | unregisterMeditationAura | 注册表 |
registerOffRingRoot | 对一个环外 DaoElement 槽位的认领。 | unregisterOffRingRoot | 注册表 |
registerPersonalDao | 一个个人之道(经由事迹领悟的一门道)。 | unregisterPersonalDao | 注册表 |
registerBeastArt | 一门伙伴一侧的兽技。 | - | 注册表 |
registerSectBuildingType | 一种宗门建筑。 | - | 注册表 |
registerLifeBoundTrait | 本命法宝可以显出的一种性。 | - | 注册表 |
registerMasteryStage | 功法境界阶梯上额外的一级。 | - | 注册表 |
registerModifierSource | 覆盖 Cultivation 各系统的、逐玩家的常驻修正。 | unregisterModifierSource | 注册表 |
registerStoreBenefit | 与游戏内权益相绑的一件网店商品。 | unregisterStoreBenefit | 注册表 |
registerTechniquePresetCap | 玩家可保留的快捷键配置组数目的更高上限。 | unregisterTechniquePresetCap | 注册表 |
registerProfileCap | 玩家可保留的存档数目的更高上限。 | unregisterProfileCap | 注册表 |
registerUpdateCheck(2 个重载) | 你的模组,加入更新检查。 | unregisterUpdateCheck | 注册表 |
registerBuildCheck | 你的模组,加入构建检查。 | unregisterBuildCheck | 注册表 |
registerCompatCheck(2 个重载) | 你的扩展,加入兼容性检查。 | unregisterCompatCheck | 注册表 |
另有两个注册表不在门面上:天象注册于 CelestialManager.registerEventType,宗门任务计量则经由 MissionManager.creditProgress 记入 —— 两者皆见注册表。