Перейти к содержимому

ConsumableChemicals

Библиотечный мод добавляет функциональность для отслеживания химических веществ у игрока.

Fabric
Загрузчики
Fabric
Скачиваний на Modrinth
1,3 тыс.
Подписчиков на Modrinth
3
версий
14
Обновлён
25 октября 202625 окт.
Опубликован
в 2024
Это библиотека — она нужна другим модам и сама ничего не добавляет в игру

Коротко о моде

Библиотека — нужна другим модам
Работает на Fabric
Для Minecraft 1.20–1.21.1
Нужен и в игре, и на сервере
Последняя версия — 1.21.1+2.1.0+build.62 от 25 октября 2026
Нужен Fabric API
Где нужен
В игреобязателенНа сервереобязателен

Нужен и в игре, и на сервере

Версии игры1.20–1.21.1
Описание переведено автоматическиПоказать оригинал (EN)

ПРИМЕЧАНИЕ

Вам не нужно скачивать этот мод отдельно, так как моды, которые от него зависят, должны встраивать его в себя. Эта страница в основном нужна для ссылок на руководства и просмотра последних версий

Consumable Chemicals — это библиотечный мод, предоставляющий функционал для добавления химических веществ в игру, которые можно отслеживать у игрока

Дополнительные возможности

  • Команда /chemicals для установки, получения и изменения уровня химических веществ у игрока

Версия для Forge?

Нет, у меня нет времени, усидчивости и мотивации изучать совершенно новый загрузчик модов

Модпаки?

Полностью разрешено, если вы укажете меня в титрах и дадите ссылку на страницу этого мода на Modrinth или GitHub.

Использование

Настройка Gradle

build.gradle

repositories {
    maven { url = "https://pluto-mod-maven.web.app/maven" }
}

dependencies {
    include(modImplementation("ml.pluto7073:chemicals:${minecraft_version}+${chemicals_version}"))
}

gradle.properties

chemicals_version=SEE_MODRINTH_FOR_VERSIONS

Создание ChemicalHandler

При создании Chemical Handler вы можете либо создать свой с нуля, расширив ConsumableChemicalHandler, либо выбрать один из трёх готовых абстрактных обработчиков ниже:

HalfLifeChemicalHandler

Количество химического вещества экспоненциально уменьшается у игрока с использованием периода полураспада в тиках, указанного в конструкторе

LinearChemicalHandler

Определённое количество химического вещества удаляется у игрока каждый тик, пока количество не достигнет нуля

StaticChemicalHandler

Любое потреблённое химическое вещество остаётся у игрока, пока не будет достигнуто максимальное количество (если указано) или пока игрок не умрёт. Можно определить пользовательское действие для момента достижения этого максимума

Пример

В этом примере мы будем использовать HalfLifeChemicalHandler

Допустим, мы хотим, чтобы у нашего химического вещества был период полураспада 5 минут, или 6000 тиков. Это даст нам следующий код

public class ExampleHandler extends HalfLifeChemicalHandler {

    public ExampleHandler() {
        super(6000); // 5 минут * 60 сек/мин * 20 тиков/сек
    }

}

Если вы используете готовый абстрактный обработчик, то нужно реализовать только один метод. getEffectsForAmount()

(Если вы расширяете ConsumableChemicalHandler, то вам также нужно реализовать tickPlayer(), который должен обрабатывать химическое вещество каждый тик, в большинстве случаев удаляя небольшое количество, пока оно не закончится)

Он принимает float количества и текущий Level. Он должен возвращать список экземпляров эффектов мобов (например, Невидимость), которые должны быть у игрока с таким количеством химического вещества.

В этом примере допустим, мы хотим, чтобы у игрока был Спешка I, если у него больше 10 единиц этого химического вещества, и Замедление III, если у него больше 50.

public class ExampleHandler extends HalfLifeChemicalHandler {

    [...]

    @Override
    public Collection<MobEffectInstance> getEffectsForAmount(float amount, Level level) {
        ArrayList<MobEffectInstance> effects = new ArrayList<>();
        if (amount >= 10) {
            effects.add(new MobEffectInstance(MobEffects.DIG_SPEED, 600));
        }
        if (amount >= 50) {
            effects.add(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 600, 2));
        }
        return effects;
    }

}

Регистрация ChemicalHandler

После создания класса обработчика его нужно зарегистрировать.

Это можно сделать с помощью Registry.register(Chemicals.REGISTRY, ID, HANDLER), и это следует делать при инициализации мода, как и любую другую регистрацию.

Пример

ExampleHandler.java

public class ExampleHandler extends HalfLifeChemicalHandler {

    public static final ExampleHandler INSTANCE = new ExampleHandler();

    [...]

    public static void init() {
        Registry.register(Chemicals.REGISTRY, new ResourceLocation("modid", "example_chemical"), INSTANCE);
    }

}

`ExampleMod.java`
```java
public class ExampleMod implements ModInitializer {

    @Override
    public void onInitialize() {
        ExampleHandler.init();
    }

}

Добавление химикатов в еду

Вы только что добавили свой химикат в игру! Вы можете использовать команду /chemicals, чтобы изменить уровень химикатов у игрока и проверить его, но теперь вам нужен внутриигровой способ употребить ваш химикат. Самый простой способ — добавить его в экземпляр FoodProperties. В билдер FoodProperties добавлен новый метод для добавления химиката в еду. Он принимает ResourceLocation, представляющий химикат (или сам ChemicalHandler), и количество.

ExampleItems.java

public class ExampleItems {

    public static final FoodProperties CHEMICAL_FOOD = new FoodProperties.Builder()
            .alwaysEat()
            .fast()
            .addChemical(ExampleChemical.INSTANCE, 5f)
            .build();

    public static final Item CHEMICAL_PILL = new Item(new Item.Properties().food(CHEMICAL_FOOD));

    public static void init() {
        Registry.register(BuiltInRegistries.ITEM, new ResourceLocation("modid", "chemical_pill"), CHEMICAL_PILL);
    }

}

ExampleMod.java

public class ExampleMod implements ModInitializer {

    @Override
    public void onInitialize() {
        [...]
        ExampleItems.init(); // Предметы должны регистрироваться после химикатов
    }

}

Добавление химикатов в еду в 1.20.5+

В 1.20.5+ данные о еде управляются компонентами предметов. Химикаты теперь тоже добавляются к предметам через компонент ChemicalMap.COMPONENT_TYPE с ID chemicals:chemicals.

Если вы хотите добавить химикаты к существующей еде или питьевому предмету вроде зелья прямо в игре, это можно сделать простой командой.

/give @s minecraft:cooked_beef[chemicals:chemicals={"modid:example_chemical":100}]

Команда выше выдаёт нам кусок стейка со 100 единицами нашего примера химиката, который будет добавлен игроку при употреблении.

Пример химической таблетки

Если вы хотите, чтобы кастомный предмет в моде имел по умолчанию определённое количество химиката, как в примере выше для 1.20.4 и ранее, вы можете использовать компонент ChemicalMap.COMPONENT_TYPE и ChemicalMap.Builder при регистрации предмета.

    public static final FoodProperties CHEMICAL_FOOD = new FoodProperties.Builder()
            .alwaysEat().fast().build(); // Наши данные о еде без химикатов

    public static final Item CHEMICAL_PILL = new Item(new Item.Properties().food(CHEMICAL_FOOD)
            .component(ChemicalMap.COMPONENT_TYPE, new ChemicalMap.Builder().add(EXAMPLE_CHEMICAL, 10).build()));

    public static void init() {
        Registry.register(BuiltInRegistries.ITEM, new ResourceLocation("modid", "chemical_pill"), CHEMICAL_PILL);
    }

Этот пример даёт нам предмет химической таблетки с 10 единицами нашего примера химиката по умолчанию.

Более сложные химические предметы

Если у вас есть предмет, который может содержать переменное количество химиката, например, через NBT-данные, лучше всего реализовать ChemicalContaining в вашем классе предмета. У него есть один метод, getChemicalContent(), который принимает ResourceLocation химиката и ItemStack. Он должен вычислить количество указанного химиката в этом стаке и вернуть его.

В этом примере все химикаты в этом предмете хранятся в объекте Chemicals в NBT предмета

ExampleItem.java

public class ExampleItem extends Item implements ChemicalContaining {

    public ExampleItem(Properties properties) {
        super(properties);
    }

    @Override
    public float getChemicalContent(ResourceLocation id, ItemStack stack) {
        CompoundTag chemicals = stack.getOrCreateTagElement("Chemicals");
        if (chemicals.contains(id.toString())) {
            return chemicals.getFloat(id.toString());
        }
        return 0;
    }

}

Частые вопросы

Как установить ConsumableChemicals?

Установите Fabric под свою версию Minecraft, скачайте ConsumableChemicals под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.

Для каких версий Minecraft есть ConsumableChemicals?

У ConsumableChemicals есть сборки для Minecraft 1.20–1.21.1.

Нужен ли ConsumableChemicals на сервере?

Нужен и в игре, и на сервере

Лицензия и источник
MIT Licenseможно свободно использовать и распространять с указанием автора
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее