TCDCommons — это библиотека API для модификации Minecraft, которая включает собственную систему GUI, различные события и хуки для игры, а также утилиты, которые могут быть полезны разработчикам модов. Основная цель этого API — помочь оптимизировать и ускорить разработку модов, а также избежать повторного написания одного и того же кода для каждого мода, которому необходимо выполнять похожие действия. Обратите внимание, что, поскольку этот мод является библиотекой, он может не предлагать полезные фронтенд-функции для пользователя.
Моды, использующие этот API
Этот API-мод в основном используется TheCSDev для разработки Better Statistics Screen.
Функции API
Клиентская часть
- Система GUI: Уникальная, удобная для пользователя система UI, которая стремится быть улучшением по сравнению с ванильной системой GUI с точки зрения настройки и гибкости.
- HUD-экраны: Эта функция позволяет отображать
Screen
ы на внутриигровом HUD для визуального улучшения. Обратите внимание, что эти HUDScreen
ы предназначены только для отображения и не могут взаимодействовать с пользовательским вводом.
Общая часть
- Авто-конфигурационная система: Упростите создание JSON-файлов конфигурации для вашего мода с помощью этой системы. Она автоматически сериализует поля примитивных типов, определенных в конфигурационном
Class
е, при сохранении и загрузке конфигов. - Система событий: Позволяет вам отслеживать различные внутриигровые события. Также позволяет определять пользовательские события для вашего мода, которые другие моды могут отслеживать.
- Хуки: Получите легкий доступ к различным компонентам игры с помощью этих хуков.
- Сетевое взаимодействие: Этот API поставляется с собственной сетью пользовательских полезных нагрузок, позволяя другим модам общаться в обоих направлениях C2S и S2C по сетевому протоколу игры.
- Утилиты: Воспользуйтесь рядом утилит, включая различные интерфейсы, перечисления, типы исключений, IO-утилиты, многопоточность и многое другое. Одна из таких утилит — система кэширования, которая позволяет модам выполнять асинхронные операции для получения/загрузки ресурсов и их кэширования.
Простое введение в систему GUI
С системой GUI вы можете создавать собственные меню GUI более простым способом, который позволяет больше настройки и гибкости.
В ванильной системе GUI мы используем Screen
ы. В системе GUI этого API мы используем то, что называется TScreen
ами.
Все компоненты GUI, включая TScreen
ы и виджеты GUI, можно найти в следующем пакете: io.github.thecsdev.tcdcommons.api.client.gui
.
Ниже мы создадим пример реализации TScreen
с простой кнопкой, которая выполняет действие при нажатии:
import io.github.thecsdev.tcdcommons.api.client.gui.screen.TScreen;
import io.github.thecsdev.tcdcommons.api.client.gui.widget.TButtonWidget;
import net.minecraft.text.Text;
public final class ExampleTScreen extends TScreen
{
t/*
t * `super` принимает аргумент `Text` для заголовка экрана
t */
tpublic ExampleTScreen() { super(Text.literal("Пример TScreen")); }
t
t/*
t * Здесь экран инициализирует свои GUI-элементы.
t * Мы добавим виджет кнопки здесь.
t */
tprotected final @Override void init()
t{
tt//создаем кнопку и центруем ее на экране
ttfinal var button = new TButtonWidget(
ttt(getWidth() / 2) - 50, //X-позиция кнопки. мы центрируем ее
ttt(getHeight() / 2) - 10, //Y-позиция кнопки. мы центрируем ее
ttt100, //ширина кнопки
ttt20 //высота кнопки
tt);
tt
tt//определяем текст для кнопки
ttbutton.setText(Text.literal("Нажми меня"));
tt
tt//теперь давайте сделаем что-то, когда кнопка нажата
ttbutton.setOnClick(btn ->
tt{
ttt//выводим простое сообщение в консоль
ttt//когда кнопка нажата
tttSystem.out.println("Hello World!");
tt});
tt
tt//и, наконец, добавим кнопку на экран
ttaddChild(button);
t}
}
Теперь нам нужно открыть экран и показать его пользователю. Для этого мы используем MinecraftClient#setScreen(Screen)
(на Fabric), и мы используем TScreen#getAsScreen()
для получения ссылки на Screen
. Таким образом, наш окончательный код будет выглядеть так:
final var tscreen = new ExampleTScreen();
final var screen = tscreen.getAsScreen();
MinecraftClient.getInstance().setScreen(screen);
Простое введение в систему событий
Система событий позволяет вам не только отслеживать различные события, уже предоставленные этим API, но также создавать и вызывать свои собственные пользовательские события.
Ниже приведен пример того, как вы можете создать свое собственное событие, зарегистрировать и отменить регистрацию слушателей, а также вызвать событие:
import io.github.thecsdev.tcdcommons.api.event.TEvent;
import io.github.thecsdev.tcdcommons.api.event.TEventFactory;
public final class ExampleEvents
{
t/*
t * Вот как мы создаем пользовательское событие с помощью этого API.
t * Обратите внимание, что эта система событий похожа на систему событий Architectury API,
t * но с некоторыми изменениями и дополнениями для большей гибкости.
t */
tpublic static final TEvent<Runnable> eSomething = TEventFactory.createLoop();
t
tpublic static final void registerAndUnregisterListener()
t{
tt//сначала мы определяем слушатель, который будет вызван при вызове события
ttfinal Runnable listener = () -> { System.out.println("Событие было вызвано."); };
tt
tt//затем, вот как мы можем зарегистрировать его
tteSomething.register(listener);
tt
tt//и затем, вот как мы можем отменить его регистрацию
tteSomething.unregister(listener);
t}
t
tpublic static final void invokeEvent()
t{
tt//мы вызываем событие, получая "вызыватель",
tt//и вызывая основную функцию функционального интерфейса
tt//(в случае Runnable, основная функция — `run`)
tteSomething.invoker().run();
t}
}