快速开始 - Junye-666/RideBattleLib_NeoForge_1.21.1 GitHub Wiki

快速开始:ExampleBasicPack

1.3.3 推荐通过 IRiderPack 组织骑士。
下面示例与 ExampleBasicPack 保持一致:一个基础形态、一个强化形态、一个暂停/继续处理器,以及一个服务端分发处理器。

1. 创建骑士 Pack

public class ExampleBasicPack implements IRiderPack {

    public static final ResourceLocation RIDER_ID = rl("test_alpha");
    public static final ResourceLocation FORM_BASE = rl("alpha_base_form");
    public static final ResourceLocation FORM_POWER = rl("alpha_powered_form");
    public static final ResourceLocation CORE_SLOT = rl("core_slot");
    public static final ResourceLocation ENERGY_SLOT = rl("energy_slot");
    public static final ResourceLocation SKILL_ID = rl("test_skill");

    private static ResourceLocation rl(String path) {
        return ResourceLocation.fromNamespaceAndPath(RideBattleLib.MODID, path);
    }

    @Override
    public ResourceLocation riderId() {
        return RIDER_ID;
    }

    public static final FormConfig BASE_FORM = FormBuilder.create(FORM_BASE)
            .armor(Items.IRON_HELMET, Items.IRON_CHESTPLATE, null, Items.IRON_BOOTS)
            .requiredItem(CORE_SLOT, Items.IRON_INGOT)
            .triggerType(TriggerType.KEY)
            .attribute(Attributes.MAX_HEALTH, 8.0, AttributeModifier.Operation.ADD_VALUE)
            .attribute(Attributes.MOVEMENT_SPEED, 0.1, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)
            .effect(MobEffects.NIGHT_VISION, 0)
            .effect(MobEffects.DIG_SPEED, 1)
            .shouldPause(true)
            .grantedItem(Items.IRON_SWORD)
            .grantedItem(Items.SHIELD)
            .allowsEmptyDriver(false)
            .build();

    public static final FormConfig POWER_FORM = FormBuilder.create(FORM_POWER)
            .armor(Items.GOLDEN_HELMET, Items.GOLDEN_CHESTPLATE, null, Items.GOLDEN_BOOTS)
            .triggerType(TriggerType.AUTO)
            .attribute(Attributes.MAX_HEALTH, 12.0, AttributeModifier.Operation.ADD_VALUE)
            .attribute(Attributes.MOVEMENT_SPEED, 0.2, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)
            .effect(MobEffects.DAMAGE_BOOST, 0)
            .effect(MobEffects.NIGHT_VISION, 0)
            .requiredItem(CORE_SLOT, Items.GOLD_INGOT)
            .auxRequiredItem(ENERGY_SLOT, Items.REDSTONE)
            .grantedItem(Items.NETHERITE_SWORD)
            .skill(SKILL_ID, 20)
            .build();

    @Override
    public void registerCommon() {
        RiderBuilder.create(RIDER_ID)
                .driver(Items.IRON_LEGGINGS)
                .auxDriver(Items.BRICK)
                .slot(CORE_SLOT, List.of(Items.IRON_INGOT, Items.GOLD_INGOT), true, true)
                .auxSlot(ENERGY_SLOT, List.of(Items.REDSTONE, Items.GLOWSTONE_DUST, Items.APPLE), true, false)

                .form(BASE_FORM)
                .form(POWER_FORM)

                .baseForm(FORM_BASE)
                .allowDynamicForms(false)
                .buildAndRegister();

        ServerRiderDispatcher.register(new PauseResumeHandler());
    }
}

2. 在主模组构造器中注册 Pack

1.3.3 中,骑士 Pack 推荐在模组主线构造器里注册。
RiderPackRegistry.initCommon() 会由 RideBattleLib 在 FMLCommonSetupEvent 中自动调用,客户端 initClient() 也会由 RideBattleLib 客户端入口自动调用。

@Mod("yourmod")
public class YourMod {

    public YourMod(IEventBus modEventBus, ModContainer modContainer) {
        RiderPackRegistry.register(new ExampleBasicPack());
        // RiderPackRegistry.register(new ExampleDynamicPack());
    }
}

3. 暂停变身处理器

shouldPause(true) 的形态会进入等待状态,需要外部调用 completeHenshin 或 completeIn。

private static final class PauseResumeHandler implements IRiderServerHandler {

    @Override
    public ResourceLocation riderId() {
        return ExampleBasicPack.RIDER_ID;
    }

    @Override
    public void onHenshinPre(HenshinEvent.Pre event) {
        if (ExampleBasicPack.FORM_BASE.equals(event.getFormId())) {
            RideBattleAPI.completeIn(44, event.getPlayer());
        }
    }

    @Override
    public void onSwitchPre(FormSwitchEvent.Pre event) {
        if (ExampleBasicPack.FORM_POWER.equals(event.getOldFormId())) {
            event.getPlayer().displayClientMessage(
                    Component.literal("从金形态切换时会出现在物品栏上方的字"),
                    true
            );
        }

        if (ExampleBasicPack.FORM_BASE.equals(event.getNewFormId())) {
            RideBattleAPI.completeIn(44, event.getPlayer());
        }
    }
}

4. 游戏内测试

  1. 获取铁护腿并装备到腿部,作为主驱动器。
  2. 获取砖块并装备到副手,作为辅助驱动器。
  3. 手持铁锭右键,将物品插入 core_slot。
  4. 按下 G 键触发驱动器。
  5. 基础形态会因 shouldPause(true) 暂停,随后由处理器在 44 ticks 后完成变身。
  6. 按下 V 键解除变身。
  7. 手持红石并满足金锭条件后,可触发强化形态。