SirenHytale
本节页面
  1. 修真
  2. 开服指南
  3. 接口总览

Cultivation 接口

Cultivation 为其他 Hytale 模组提供了一套公开的集成面:plugin.siren.API.CultivationAPI,外加同一包下的五十三个 *Events 类。它是本模组有意保持稳定的形态 —— 请优先使用它,而非直接伸手去碰 CultivationManager、Cultivation 或那些 ECS 组件,因为后者随时可能在版本之间变动。

你可以用它做四件事:

  • 读取玩家的修炼状态 —— 境界、阶段、全局等级、存蓄灵气、种族、打坐状态、天赋点、已解锁节点,以及从宗门到寿元的每一个子系统的状态。见接口参考。
  • 注册与内置内容行为完全一致的新内容 —— 一个种族、一门功法、一项灵气吸收物品修正、一个称号、一面宗门旗帜、一套配色、一个菜单页、一篇典籍条目、一项更新或兼容性检查。register* 方法共三十个。见注册表。
  • 监听(并重新调参,或否决)遍及模组各子系统的 391 个事件。见事件。
  • 替换模组的一整个层次 —— 进阶阶梯本身、它的全套用词,或两者兼有 —— 而其余每个子系统仍照常在其之上运行。此为 0.5.0 新增;见编写扩展。

本页所记载的是 Cultivation 0.11.2 时的接口。凡是在 0.5.0 之后才出现的方法或事件,描述它的那一页都会注明版本。

源码已公开。每一个公开接口类连同其 javadoc,都在 github.com/SirenHytale/Cultivation-API —— 同处还有一份自动生成的每个事件的参考、一个完整的示例扩展,以及一份写给 AI 编程助手的说明。那些源码中的 javadoc 才是权威的约定;本站是带你走一遍的向导。

将 Cultivation 引入你的项目

Cultivation 0.11.2 面向 Hytale Update 7 构建,针对 Server API 0.7.2 编译,其清单声明 ServerVersion: >=0.7.2 <0.8.0 —— v0.11.1 0.11.0 针对 0.7.0-pre.5.1 构建,声明的是 >=0.7.0-pre.0 <0.8.0;0.11.1 把这个下限提到了 0.7.2,0.11.2 沿用不变。它以 Java 25 为目标,因此针对它编译的扩展也需如此。Cultivation 不在公共 Maven 仓库中:请先把发行的 jar 安装进你的本地仓库,再以 provided 作用域依赖它,且绝不要把它打包(shade)进你自己的 jar。服务器加载的是真正的 Cultivation jar,若类路径上有两份 plugin.siren.Cultivation,两份会各自得到一个静态插件实例 —— 于是每一次注册调用都会落进无人读取的那一份,悄无声息。

mvn install:install-file -Dfile=Cultivation-0.11.2.jar -DgroupId=plugin.siren -DartifactId=Cultivation -Dversion=0.11.2 -Dpackaging=jar

Maven pom.xml:

<properties>
    <maven.compiler.source>25</maven.compiler.source>
    <maven.compiler.target>25</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<repositories>
    <repository>
        <id>hytale-release</id>
        <url>https://maven.hytale.com/release</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.hypixel.hytale</groupId>
        <artifactId>Server</artifactId>
        <version>0.7.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>plugin.siren</groupId>
        <artifactId>Cultivation</artifactId>
        <version>0.11.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

然后在你的 Hytale manifest.json 中声明它。Cultivation 自己的清单将自身发布为 group Siren、name Cultivation,因此依赖 id 是 Siren:Cultivation。请声明第一个包含你所调用之物的版本作下限:针对本 jar 构建的扩展用 >=0.11.2,因为这些页面上凡标有 v0.11.2 的东西(PreDeathPenaltyEvent、DeathPenaltyAppliedEvent、SectVeinAscendedEvent 与 CultivationAPI.isDuelLethal)在它之前并不存在,凡标有 v0.11.1 的东西(其中就有 DaoDomainEvents 与 SectArrayEvents)在 0.11.1 之前同样不存在。随 0.11.0 发布的官方扩展仍声明 >=0.11.0。你自己的 ServerVersion 请取与 Cultivation 相同的形态:

"ServerVersion": ">=0.7.2 <0.8.0",
"Dependencies": {
  "Siren:Cultivation": ">=0.11.2"
}

清单中的版本范围接受完整的 semver 区间,而不只是一个下限 —— ">=0.11.2 <0.12.0" 会让引擎在你的一行代码运行之前,就拒绝让你的扩展对着该区间之外的任何 Cultivation 加载。若你更愿意仅在 Cultivation 恰好已安装时才集成,请改把同样的条目放进 "OptionalDependencies",并让每一处对 plugin.siren 类的引用都置于守卫之后,使这些类在缺少它时永不加载。关于在两个 jar 都已发布之后、用来修正某个搭配的公开兼容性名单,见模组兼容。

入口点

一切都是静态的。CultivationAPI 有一个私有构造函数,永不被实例化 —— 你直接在类上调用它:

import plugin.siren.API.CultivationAPI;
import plugin.siren.ECS.Realms.CultivationRealm;

CultivationRealm realm = CultivationAPI.getRealm(accessor, ref);
float qi = CultivationAPI.getQi(accessor, ref);

这些读取方法一律接受一个 ComponentAccessor<EntityStore> 与一个 Ref<EntityStore> —— 正是每个 Hytale ECS 系统手头已有的那一对。凡是读取组件的方法,在玩家尚未拥有该组件时都返回 null(或 0,或 Human),因此一个刚进服的新玩家绝不会引发异常。

监听器与注册表的调用,在你自己插件的 setup() 中,相对于 Cultivation 自身的 setup() 无论何种加载顺序都是安全的。注册表是普通的静态 map,监听器列表则是 CopyOnWriteArrayList;在玩家真正与模组交互之前,二者都不会被读取,而那已远在每个插件加载完毕之后。

你的第一个监听器

其模式是:以 CultivationEvents.onPreX(...) 在事情发生之前更改或否决它,以 CultivationEvents.onX(...) 在其落定之后收到告知。二者都接受一个该事件类型的 java.util.function.Consumer,因此一个 lambda 就够了:

import com.hypixel.hytale.server.core.universe.PlayerRef;
import plugin.siren.API.CultivationEvents;
import plugin.siren.ECS.Realms.CultivationRealm;

public final class MyCultivationHooks {

    public static void register(){
        // 让踏入金丹期的那一跃,所耗存蓄灵气翻倍。
        CultivationEvents.onPreBreakthrough(event -> {
            if(event.toRealm() == CultivationRealm.GOLDEN_CORE_FORMATION){
                event.setQiCost(event.qiCost() * 2.0F);
            }
        });

        // 直接回绝最后一个境界。
        CultivationEvents.onPreBreakthrough(event -> {
            if(event.toRealm() == CultivationRealm.VOID_REFINEMENT){
                event.setCancelled(true);
            }
        });

        // 事情真正发生之后再作反应 —— 此时组件已显示新的境界。
        CultivationEvents.onBreakthrough(event -> {
            if(event.player() != null){
                recordAscension(event.player(), event.newRealm());
            }
        });
    }

    private static void recordAscension(PlayerRef player, CultivationRealm realm){
        // 你自己的记账逻辑
    }
}

在你插件的 setup() 中调用 MyCultivationHooks.register()。这里刻意没有反注册 —— 监听器的生命周期就是服务器的生命周期,正合插件「加载一次、常驻不去」的方式。

公开仓库里的完整示例 examples/ExampleAddon,针对真实的 0.11.1 jar 与 0.7.2 服务器编译通过。它的 CultivationHooks.java 里有 0.11.1 的各个钩子:registerDaoDomains() 在战事窗口期间缩短高阶位道域的持续时间,并记录它的展开、崩塌与交锋;registerSectArrays() 把一次宗门大阵升起的贡献点代价减半,并记录它的升起与结束;registerVetoes() 则是前置事件否决的所在,其中包括拒绝 /cultivation meditate abort。

各页导览

页面涵盖
事件五十四个 *Events 类中的全部 391 个事件,按子系统分组:各自何时触发、能否取消、暴露什么,以及适用的加锁与线程规则。
注册表全部 30 个 register* 方法 —— 种族、功法及其关卡、菜单页、典籍条目、更新/构建/兼容性检查、配色、气息、称号、旗帜、常驻修正、宝阁权益、各项上限 —— 以及它们所用的公开类型。
接口参考CultivationAPI 的全部 262 个方法(按类别分组),以及 50 个 CultivationConfigs 访问器。
编写扩展ProgressionProvider(你需实现的每一个方法,附完整示例)、CultivationTheme 与 AdminConfigSection —— 替换阶梯、替换用词,以及添加你自己的管理设置。

这些钩子所依托的各系统,其面向玩家的文档位于本站主体:境界与阶段、聚灵采气、大道、功法、宗门、宗门攻伐、阵法、洞府、斗法与灵兽。事件允许你重新调整的每一个数值,在配置页都有一份面向服主的对应项,其中大多数也在指令页有所映照。