Интенсив Java: Приложения и NeoForge 1.21.1 за 80 дней

Комплексный план обучения программированию на Java 21 с нуля до создания приложений и модов для Minecraft 1.21.1. Курс охватывает настройку среды разработки IntelliJ IDEA [daily.dev](https://app.daily.dev/posts/bypzuv6ni), базовый синтаксис [codegym.cc](https://codegym.cc/ru/quests/lectures) и специфику API NeoForge.

1. Основы Java 21: Синтаксис, переменные и управляющие конструкции (Дни 1-20)

Основы Java 21: Синтаксис, переменные и управляющие конструкции (Дни 1-20)

Добро пожаловать в интенсив. Первые 20 дней посвящены фундаменту языка Java. Без уверенного владения синтаксисом невозможно ни создание Android-приложений, ни разработка модов для Minecraft на NeoForge. Мы сразу ориентируемся на версию Java 21 (LTS), так как именно она является стандартом для Minecraft 1.21.1 и современной индустрии.

Подготовка рабочего окружения

Для написания кода требуются два компонента:

  • JDK 21 (Java Development Kit) — набор инструментов для разработки. Он включает компилятор javac и виртуальную машину JVM.
  • IDE (Integrated Development Environment) — среда разработки. Стандартом де-факто для Java и моддинга является IntelliJ IDEA.
  • !Процесс превращения кода в работающее приложение

    Структура Java-приложения

    Java — объектно-ориентированный язык. Любой код должен находиться внутри класса. Рассмотрим минимальную программу:

    * public class FirstMod: Объявление класса. Имя файла обязано совпадать с именем публичного класса (FirstMod.java). * main: Точка входа. С этого метода начинается выполнение любой программы (будь то консольное приложение или серверная часть). * System.out.println: Команда вывода текста в консоль.

    Переменные и типы данных

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

    Примитивные типы данных

    В Java существует 8 примитивов, которые хранят значения напрямую в стеке памяти. Для моддинга и геймдева наиболее важны следующие:

    | Тип | Размер | Описание | Пример в Minecraft | | :--- | :--- | :--- | :--- | | int | 32 бит | Целое число | ID блока, количество предметов в стаке | | double | 64 бит | Дробное число (высокая точность) | Координаты игрока, здоровье (20.0) | | float | 32 бит | Дробное число (меньшая точность) | Угол поворота камеры, освещение | | boolean | 1 бит | Логическое значение (true/false) | isSprinting (бежит ли игрок) | | char | 16 бит | Один символ Unicode | Символ в чате |

    Ссылочные типы и String

    Тип String не является примитивом. Это класс, хранящий последовательность символов.

    Локальная типизация (var)

    Начиная с Java 10, можно использовать ключевое слово var, если компилятор может сам определить тип данных из правой части выражения. Это делает код чище.

    > Важно: var работает только внутри методов (локальные переменные). Вы не можете использовать var для полей класса (например, характеристик предмета в моде).

    Математические операции в геймдеве

    Написание логики игры часто требует формул. Рассмотрим пример расчета урона с критическим ударом.

    Где — итоговый урон, — базовый урон оружия, — множитель критического урона (например, 0.5 для 50% бонуса).

    В коде это выглядит так:

    Основные операторы: +, -, , / (деление). * % (остаток от деления). Часто используется для циклической смены текстур или анимаций (например, tick % 20 срабатывает раз в секунду при 20 TPS).

    Управляющие конструкции

    Логика мода строится на условиях: "Если игрок нажал ПКМ, то...", "Пока здоровье больше 0, то..."

    Условный оператор if-else

    Switch Expressions (Java 21)

    В старых версиях Java switch был громоздким. В Java 21 мы используем улучшенный синтаксис (Switch Expressions), который позволяет возвращать значения и не требует break.

    Пример определения редкости предмета:

    Это критически важно для NeoForge, где часто приходится перебирать типы блоков или событий.

    Циклы

    Циклы позволяют повторять код. В Minecraft игровой цикл (Game Loop) обновляет мир 20 раз в секунду.

    Цикл for

    Используется, когда известно количество повторений. Например, спавн 5 зомби:

    Цикл while

    Выполняется, пока условие истинно. Опасен возможностью создания бесконечного цикла, что приведет к зависанию игры (крашу).

    !Логика проверки условия перед выполнением действия

    Массивы (Arrays)

    Массив — это контейнер фиксированного размера для хранения данных одного типа. В инвентаре игрока слоты можно представить как массив.

    Итоги

  • Инструментарий: Для разработки под Minecraft 1.21.1 строго необходим JDK 21. IntelliJ IDEA — рекомендуемая среда.
  • Типизация: Java строго типизирована. Используйте примитивы (int, double, boolean) для производительности и объекты (String) для текста. var упрощает чтение кода локально.
  • Логика: Современный switch (Java 14+) значительно сокращает код по сравнению с классическим. Это стандарт для написания обработчиков событий в модах.
  • Циклы: Используйте for для перебора инвентаря или создания групп объектов, и будьте осторожны с while, чтобы не зависнуть в главном потоке игры.
  • 2. Объектно-ориентированное программирование и коллекции Java (Дни 21-40)

    Объектно-ориентированное программирование и коллекции Java (Дни 21-40)

    В предыдущем блоке мы изучили синтаксис, но реальная разработка на Java — это взаимодействие объектов. Minecraft целиком построен на принципах Объектно-Ориентированного Программирования (ООП). Каждый блок, моб или предмет в игре — это объект, созданный по чертежу (классу). В ближайшие 20 дней мы разберем архитектуру приложений и способы хранения групп объектов.

    Философия ООП: Классы и Объекты

    Класс — это шаблон или чертеж. Объект — это конкретный экземпляр, созданный по этому чертежу.

    В контексте NeoForge: * Класс: net.minecraft.world.item.Item (описывает, как ведут себя предметы в целом). * Объект: Items.DIAMOND_SWORD (конкретный предмет в памяти игры).

    !Иерархия наследования: от общего предмета к конкретному мечу

    Четыре столпа ООП в моддинге

    1. Инкапсуляция

    Инкапсуляция скрывает внутреннее состояние объекта и защищает его от некорректного вмешательства. Мы используем модификаторы доступа: * private: Доступно только внутри класса. * protected: Доступно наследникам (важно для моддинга). * public: Доступно всем.

    Пример: Здоровье босса не должно меняться напрямую из другого класса, только через метод получения урона.

    2. Наследование (Inheritance)

    Это механизм, позволяющий создавать новый класс на основе существующего. В NeoForge 90% вашего кода будет наследованием.

    Чтобы создать свой блок, вы не пишете код с нуля. Вы наследуетесь от ванильного класса Block.

    3. Полиморфизм

    Полиморфизм позволяет объектам с одинаковым интерфейсом иметь разную реализацию. В Java это достигается через переопределение методов (@Override).

    Представьте метод use() (использовать). Для еды он восполняет голод, для лука — выпускает стрелу, для зелья — накладывает эффект. Игра вызывает один и тот же метод use(), но результат разный.

    4. Абстракция

    Абстракция позволяет выделить общие характеристики, не вдаваясь в детали реализации. Для этого используются интерфейсы и абстрактные классы.

    Интерфейс — это контракт. Если класс реализует интерфейс IPlantable (можно посадить), он обязан иметь метод получения типа растения, но как именно это растение растет — решает сам класс.

    Математика объектов: Расчет характеристик

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

    Где: * — итоговая эффективная скорость добычи. * — базовая скорость игрока (обычно 1.0). * — множитель инструмента (например, для алмазной кирки). * — уровень зачарования "Эффективность" (Efficiency).

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

    Коллекции (Collections Framework)

    Массивы (Item[] items) неудобны, так как имеют фиксированный размер. В реальных приложениях и модах мы не знаем заранее, сколько предметов будет в инвентаре или сколько мобов заспавнится. Для этого используется Java Collections Framework из пакета java.util.

    List (Списки)

    Интерфейс List гарантирует порядок элементов и допускает дубликаты. Самая частая реализация — ArrayList.

    В Minecraft списки используются повсеместно: список игроков на сервере, список эффектов зелий, история чата.

    Set (Множества)

    Интерфейс Set хранит только уникальные элементы. Порядок не гарантируется (в HashSet).

    Map (Словари / Карты)

    Интерфейс Map хранит пары "Ключ — Значение". Ключи должны быть уникальны. Это основа системы реестров (Registry) в Minecraft.

    !Принцип работы HashMap: поиск значения по уникальному ключу

    Итерация по коллекциям

    Для перебора коллекций используется цикл for-each, который мы изучили ранее. Это работает для всех типов коллекций.

    Итоги

  • ООП — фундамент: Все в Java и Minecraft является объектами. Класс — это чертеж, объект — реализация.
  • Наследование: Ключевое слово extends позволяет создавать свои предметы и блоки на основе ванильных классов NeoForge, не переписывая код с нуля.
  • Инкапсуляция и Полиморфизм: Используйте private для защиты данных и @Override для изменения стандартного поведения методов.
  • Коллекции: Забудьте про массивы, если количество элементов меняется. Используйте ArrayList для списков, HashSet для уникальности и HashMap для хранения пар "ключ-значение".