Вопрос или проблема
Я создаю мод для сервера только на 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 может представлять собой сложную задачу, особенно если вы хотите избежать проблем с регистрацией объектов на сервере. Давайте рассмотрим некоторые подходы, которые могут помочь вам справиться с данной проблемой.
Решение проблемы
-
Использование Fabric API: Убедитесь, что вы используете последнюю версию Fabric API. Некоторые функции, такие как создание рецептов для зелий, могут зависеть от обновлений API.
-
Регистрация зелий: К сожалению, в Minecraft, чтобы создать рецепт для зелья, необходимо зарегистрировать зелье в реестре. Однако это может привести к проблемам для игроков, использующих ванильную версию Minecraft. Один из обходных путей – создание обертки вокруг ваших кастомных эффектов, не меняя прерывающую локализацию предметов.
-
Использование провайдеров данных: Вместо регистрации новых предметов или зелий, вы можете создать поведение зелья через провайдеры данных. Например, определите эффекты вашего зелья в существующих зельях, таких как "Зелье силы" или "Зелье замедления". Это позволит избежать проблем с клиентскими вылетами.
-
Компоненты и система конструкций: Используйте компоненты для создания вашего зелья. Создание нового класса, унаследованного от Item, который включает в себя логику для изменения статуса эффектов при использовании зелья, также может помочь. Вы можете сохранить данные эффектов и затем применять их при использовании зелья.
- Изменение метода создания рецептов: Вместо использования метода
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. Обязательно тестируйте решения на локальном сервере, чтобы удостовериться в их корректной работе.
Если у вас будут дополнительные вопросы или нужны уточнения, пожалуйста, не стесняйтесь спрашивать. Удачи с вашим модом!