自定义策略 - Junye-666/RideBattleLib_NeoForge_1.21.1 GitHub Wiki

策略系统独立于事件系统,可自定义变身、形态切换、解除与吃瘪过程。

IHenshinStrategy

public interface IHenshinStrategy {
    void performHenshin(Player player, RiderConfig config, ResourceLocation formId);

    void performFormSwitch(Player player, HenshinSessionData data, ResourceLocation newFormId);

    void unHenshin(Player player, HenshinSessionData data);
}

默认实现:DefaultHenshinStrategy.INSTANCE。

注册自定义策略:

RiderConfig config = RiderBuilder.create(RIDER_ID)
        .driver(Items.GOLD_INGOT)
        .slot(SLOT_ID, List.of(Items.IRON_INGOT), true, true)
        .form(FORM_ID)
            .armor(Items.IRON_HELMET, Items.IRON_CHESTPLATE, null, Items.IRON_BOOTS)
        .end()
        .baseForm(FORM_ID)
        .build();

config.setHenshinStrategy(new CustomHenshinStrategy());
RiderRegistry.registerRider(config);

注意事项:

事项 说明
保存快照 自定义 performHenshin 中应调用 HenshinUtils.saveTransformedSnapshot()
同步 修改玩家数据后调用 SyncManager 同步
复用默认 可调用 DefaultHenshinStrategy.INSTANCE
错误处理 失败时避免留下不完整状态

IPenaltyStrategy

public interface IPenaltyStrategy {
    boolean penaltyEnabled();

    float getPenaltyThreshold();

    long getCooldownDuration();

    float getExplosionPower();

    float getKnockBackStrength();

    float getResetHealth();

    boolean shouldTriggerPenalty(Player player);

    void performPenaltyUnhenshin(Player player);

    boolean isInCooldown(Player player);
}

默认实现:DefaultPenaltyStrategy,读取 Config 中的吃瘪配置。

注册自定义吃瘪策略:

RiderConfig config = RiderBuilder.create(RIDER_ID)
        .driver(Items.GOLD_INGOT)
        .slot(SLOT_ID, List.of(Items.IRON_INGOT), true, true)
        .form(FORM_ID)
            .armor(Items.IRON_HELMET, null, null, Items.IRON_BOOTS)
        .end()
        .baseForm(FORM_ID)
        .build();

config.setPenaltyStrategy(new CustomPenaltyStrategy());
RiderRegistry.registerRider(config);