ConsumableChemicals
Библиотечный мод добавляет функциональность для отслеживания химических веществ у игрока.
- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 1,3 тыс.
- Подписчиков на Modrinth
- 3
- версий
- 14
- Обновлён
- 25 октября 202625 окт.
- Опубликован
- в 2024
Коротко о моде
Нужен и в игре, и на сервере
ПРИМЕЧАНИЕ
Вам не нужно скачивать этот мод отдельно, так как моды, которые от него зависят, должны встраивать его в себя. Эта страница в основном нужна для ссылок на руководства и просмотра последних версий
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 на сервере?
Нужен и в игре, и на сервере