Приветствую, это небольшой гайд о том, как написать свою базу на Forge 1.16.5.
И так, давайте начнём:
1. Установим в нашу idea плагин -
2. После установки выбираем File > New > Project > Minecraft (в самом низу). И настраиваем под себя (Use Mixins обязательно)
3. Настроим наш главный класс, у меня это Extend
@Mod("extend")
public class Extend {
public Extend() {
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
MinecraftForge.EVENT_BUS.register(this);
}
private void setup(final FMLCommonSetupEvent event) {
}
private void doClientStuff(final FMLClientSetupEvent event) {
}
}
ваш главный класс должен выглядить примерно так, но в поле @Mod("ваш
мод") заместо "вашмод", должно быть ваше название мода/чита.
4. Создадим модули и бинд (при нажатии на клавиатуре кнопки вкл/выкл функции):
Первое создадим package modules, в нём создадим enum Category и пропишим код:
public enum Category {
COMBAT,
MOVEMENT,
RENDER,
UTILS,
CLIENT
}
Далее создадим класс Module:
public class Module {
private final String name;
private int binding;
private boolean enable;
private final Category category;
public static Minecraft mc = Minecraft.getInstance();
public Module(String name, Category category, int binding) {
this.name = name;
this.category = category;
this.binding = binding;
}
public String getName() {
return name;
}
public int getBinding() {
return binding;
}
public void setBinding(int binding) {
this.binding = binding;
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
if (enable) {
this.onEnable();
} else {
this.onDisable();
}
}
public Category getCategory() {
return category;
}
public void onEnable() {
mc.player.sendMessage(ITextComponent.nullToEmpty(TextFormatting.GREEN + getName() + TextFormatting.RESET + " was Enabled!"), mc.player.getUUID());
MinecraftForge.EVENT_BUS.register(this);
}
public void onDisable() {
mc.player.sendMessage(ITextComponent.nullToEmpty(TextFormatting.RED + getName() + TextFormatting.RESET + " was Disabled!"), mc.player.getUUID());
MinecraftForge.EVENT_BUS.unregister(this);
}
public void toggle() {
setEnable(! enable);
}
}
Пояснение кода:
name, binding, category и enable - переменные для работы с будущими функциями, название, бинд, категория и т.д.
get...и set... думаю по названиям понятно, что getter (get...) передаёт уже имеющиеся значения, а setter (set...) устанавливает значение.
onEnable и onDisable отвечают за регистрацию вкл и выкл функции, например в моём коде видны строки, которые выводят текст в чат при вкл и выкл функции.
toggle сама реализация того, чтобы при включении функция работала, а при выключении нет.
Думаю с этим закончили, остались Key и ModuleManager.
5. Напишем ModuleManager для инициализации функций:
public class ModuleManager {
public static ArrayList<Module> modules = new ArrayList<>();
public static void list() {
add(new Speed());
add(new NoFall());
}
public static void add(Module m) {
modules.add(m);
}
public static ArrayList<Module> getModules() {
return modules;
}
public static void keyPressed(int key, int action) {
if (action == 1) {
for (Module m : getModules()) {
if (m.getBinding() == key) {
m.toggle();
}
}
}
}
}
опишем что за что отвечает и делает.
ArrayList<Module> создаёт список, который будет хранить наши функции.
public static void list() метод в котором будет инициализировать наши функции.
public static ArrayList<Module> getModules() гетает все наши фукнции.
public static void add(Module m) сокращение чтобы не писать modules.add() мы пишем просто add()
public static void keyPressed(int key, int action) логика нажатия на клавишу и действия при нажатии.
6. Почти конец, остался Key и инициализация всего в гл.классе:
public class Key {
private final Minecraft mc = Minecraft.getInstance();
@SubscribeEvent
public void onKeyPress(InputEvent.KeyInputEvent e) {
if (mc.player != null && mc.level != null && mc.screen == null) {
ModuleManager.keyPressed(e.getKey(), e.getAction());
}
}
}
что делает каждая часть.
@SubscribeEvent ну думаю по названию будет понятно, что это нужно для работы ивентов.
public void onKeyPress(InputEvent.KeyInputEvent e) создаём метод и в параметрах задаём ивент для наших нажатий.
if (mc.player != null && mc.level != null && mc.screen == null) проверки на то чтобы игрок находился в мире или на сервере и чтобы не было открыто настроек и чата.
ModuleManager.keyPressed(e.getKey(), e.getAction()); финальная строчка для работы нажатий, без неё вряд ли бы у вас работали забинженые функции (работали бы, но вкл и выкл вы их не смогли бы).
7. Финал, инициализация всего:
@Mod("extend")
public class Extend {
public Extend() {
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new Key());
ModuleManager.list();
}
private void setup(final FMLCommonSetupEvent event) {
}
private void doClientStuff(final FMLClientSetupEvent event) {
}
}
Думаю тут всем понятно что мы инициализируем Key и ModuleManager.list(); для их работы.
Вот и конец гайда, я бы не сказал что это сложно но, советую немного изучить основы языка программирования Java и основные понятия ООП. В дальнейшем без них будет довольно трудно, да и многих любимый ChatGPT может и не помочь.