事件系统进阶 - Junye-666/RideBattleLib_NeoForge_1.21.1 GitHub Wiki

RideBattleLib中存在几个特殊事件,提供更高的扩展性及与其它模组的兼容性

FindRiderConfigEvent

此事件允许在搜索RiderConfig时插入其他逻辑,可与其它模组进行联动,比如:

与 Curios API 联动(饰品槽位)

Curios API 允许将驱动器装备在饰品槽位,而非原版盔甲槽位。FindRiderConfigEvent则允许你在系统默认从RiderConfig注册的槽位寻找驱动器前插入自定义搜索逻辑

@SubscribeEvent
public static void onFindConfig(FindRiderConfigEvent event) {
    Player player = event.getPlayer();
    // 检查 Curios 槽位中是否有驱动器
    Optional<ItemStack> found = CuriosApi.getCuriosHelper()
        .findEquippedCurio(ModItems.DRIVER.get(), player)
        .map(SlotResult::stack);
    
    if (found.isPresent()) {
        // 强制指定骑士配置
        event.setConfig(MyRider.CONFIG);
    }
}

注意:在此处调用event.setCanceled(true)会使玩家变身失败,谨慎调用

FormOverrideEvent

此事件在变身前匹配形态时强制修改匹配形态的覆盖,可通过状态检查实现相当于形态琐的功能

可实现如检测玩家物品栏中是否有特殊物品实现特殊情况的变身(比如持有某个物品能变身唯心形态)

Player player = event.getPlayer();

        // 1. 检查玩家物品栏是否含有特殊物品(下界合金锭)
        boolean hasSpecialItem = false;
        for (ItemStack stack : player.getInventory().items) {
            if (!stack.isEmpty() && stack.is(Items.NETHERITE_INGOT)) {
                hasSpecialItem = true;
                break;
            }
        }

        // 2. 如果存在,强制覆盖形态
        if (hasNetherite) {
            // 自定义强化形态 ID
            ResourceLocation overrideForm = 
                ResourceLocation.fromNamespaceAndPath("mymod", "super_form");

            // 设置覆盖形态(会替换掉原本匹配的形态)
            event.overrideForm(overrideForm);
        }
    }

注意:在此处调用event.setCanceled(true)会直接中止变身,返回null,谨慎调用

⚠️ **GitHub.com Fallback** ⚠️