Можно ли создать зелье с несколькими эффектами и добавить его в рецепт варки без регистрации зелья?

Вопрос или проблема

Я создаю мод для сервера только на Fabric 1.21.1, который добавляет пользовательские зелья с ванильными эффектами.
Мне не удалось создать рецепт без регистрации предметов/зельев, что приводит к выбросу ванильных игроков при столкновении с предметом, а игроки на Fabric не могут присоединиться.

Сначала я пытался зарегистрировать рецепт зелья с помощью builder.registerPotionRecipe(), но это принимает RegistryEntry<Potion>, а не Potion, который я создал.
Затем я начал использовать builder.registerItemRecipe(), но это привело к тому, что сервер не стартовал.
Регистрация предмета или зелья приводила к тому, что ванильные клиенты выбрасывались при встрече с предметом в игре, а игроки на Fabric не могли присоединиться, потому что у клиента отсутствует регистрация.
Я увидел, что рецепт варки существует, так как смог положить изумрудный блок в ячейку ингредиентов, и станция варки начала работать.

    @Override
    public void onInitializeServer() {
        ArrayList<StatusEffectInstance> ЭФФЕКТЫ_БОГАТОГО_ЗЕЛЬЯ = new ArrayList<>();
        ЭФФЕКТЫ_БОГАТОГО_ЗЕЛЬЯ.add(new StatusEffectInstance(StatusEffects.HERO_OF_THE_VILLAGE, 480, 5));
        ЭФФЕКТЫ_БОГАТОГО_ЗЕЛЬЯ.add(new StatusEffectInstance(StatusEffects.LUCK, 480, 3));
        Item БОГАТОЕ_ЗЕЛЬЕ = new Item(new Item.Settings().component(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent(Optional.empty(),Optional.empty(), ЭФФЕКТЫ_БОГАТОГО_ЗЕЛЬЯ)));

        Item НИЧЕГО_ЗЕЛЬЕ = new Item(new Item.Settings().component(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent(Potions.AWKWARD)));
            FabricBrewingRecipeRegistryBuilder.BUILD.register(builder -> {
                builder.registerItemRecipe(
                        НИЧЕГО_ЗЕЛЬЕ,
                        Items.EMERALD_BLOCK,
                        БОГАТОЕ_ЗЕЛЬЕ
                );
            });
    }
[17:10:46] [main/ERROR] (Minecraft) Не удалось запустить сервер Minecraft
 java.lang.IllegalStateException: Некоторые навязчивые хранители не были зарегистрированы: [Reference{null=[unregistered]}, Reference{null=[unregistered]}]
    at net.minecraft.registry.SimpleRegistry.freeze(SimpleRegistry.java:359) ~[minecraft-common-c2b31d572c-1.21.1-net.fabricmc.yarn.1_21_1.1.21.1+build.3-v2.jar:?]
    at net.minecraft.registry.Registries.freezeRegistries(Registries.java:264) ~[minecraft-common-c2b31d572c-1.21.1-net.fabricmc.yarn.1_21_1.1.21.1+build.3-v2.jar:?]
    at net.minecraft.registry.Registries.bootstrap(Registries.java:248) ~[minecraft-common-c2b31d572c-1.21.1-net.fabricmc.yarn.1_21_1.1.21.1+build.3-v2.jar:?]
    at net.minecraft.server.Main.handler$zhp000$fabric-registry-sync-v0$afterModInit(Main.java:1547) ~[minecraft-common-c2b31d572c-1.21.1-net.fabricmc.yarn.1_21_1.1.21.1+build.3-v2.jar:?]
    at net.minecraft.server.Main.main(Main.java:111) [minecraft-common-c2b31d572c-1.21.1-net.fabricmc.yarn.1_21_1.1.21.1+build.3-v2.jar:?]
    at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480) [fabric-loader-0.16.5.jar:?]
    at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.16.5.jar:?]
    at net.fabricmc.loader.impl.launch.knot.KnotServer.main(KnotServer.java:23) [fabric-loader-0.16.5.jar:?]
    at net.fabricmc.devlaunchinjector.Main.main(Main.java:86) [dev-launch-injector-0.2.1+build.8.jar:?]

Ответ или решение

Создание кастомных зелий с множеством эффектов в модах для Minecraft с использованием Fabric может представлять собой сложную задачу, особенно если вы хотите избежать проблем с регистрацией объектов на сервере. Давайте рассмотрим некоторые подходы, которые могут помочь вам справиться с данной проблемой.

Решение проблемы

  1. Использование Fabric API: Убедитесь, что вы используете последнюю версию Fabric API. Некоторые функции, такие как создание рецептов для зелий, могут зависеть от обновлений API.

  2. Регистрация зелий: К сожалению, в Minecraft, чтобы создать рецепт для зелья, необходимо зарегистрировать зелье в реестре. Однако это может привести к проблемам для игроков, использующих ванильную версию Minecraft. Один из обходных путей – создание обертки вокруг ваших кастомных эффектов, не меняя прерывающую локализацию предметов.

  3. Использование провайдеров данных: Вместо регистрации новых предметов или зелий, вы можете создать поведение зелья через провайдеры данных. Например, определите эффекты вашего зелья в существующих зельях, таких как "Зелье силы" или "Зелье замедления". Это позволит избежать проблем с клиентскими вылетами.

  4. Компоненты и система конструкций: Используйте компоненты для создания вашего зелья. Создание нового класса, унаследованного от Item, который включает в себя логику для изменения статуса эффектов при использовании зелья, также может помочь. Вы можете сохранить данные эффектов и затем применять их при использовании зелья.

  5. Изменение метода создания рецептов: Вместо использования метода registerPotionRecipe(), создайте новый тип исходящего зелья через registerItemRecipe(), но используйте существующий предмет как сырье. Это поможет избежать ненужной регистрации.

Пример кода

Вот пример, как можно реализовать вышеописанные подходы:

@Override
public void onInitializeServer() {
    ArrayList<StatusEffectInstance> richPotionEffects = new ArrayList<>();
    richPotionEffects.add(new StatusEffectInstance(StatusEffects.HERO_OF_THE_VILLAGE, 480, 5));
    richPotionEffects.add(new StatusEffectInstance(StatusEffects.LUCK, 480, 3));

    // Используйте стандартное зелье в качестве основного элемента
    Item BASE_POTION = Potions.AWKWARD; // Или выберите другое существующее зелье

    // Регистрируем рецепт с использованием базового зелья
    FabricBrewingRecipeRegistryBuilder.BUILD.register(builder -> {
        builder.registerItemRecipe(
            BASE_POTION,
            Items.EMERALD_BLOCK,
            new CustomPotionItem(new Item.Settings().component(DataComponentTypes.POTION_CONTENTS, new PotionContentsComponent(Optional.empty(), Optional.empty(), richPotionEffects)))
        );
    });
}

Заключение

Следуя вышеуказанным шагам, вы сможете внедрить кастомные зелья в мод без необходимости сталкиваться с проблемами, возникающими у игроков, использующих ванильную версию игры. Этот подход также облегчит поддержку вашего мода в будущих обновлениях Minecraft. Обязательно тестируйте решения на локальном сервере, чтобы удостовериться в их корректной работе.

Если у вас будут дополнительные вопросы или нужны уточнения, пожалуйста, не стесняйтесь спрашивать. Удачи с вашим модом!

Оцените материал
Добавить комментарий

Капча загружается...