[1.15.2] Улучшаем интеллект своего моба

Привет, всем. Это будет завершающая часть серии статей по созданию новой коровы. Мы создали моба, добавили ему новую модель, а теперь пришла пора улучшить базовый ИИ. Конечная цель такова: можно доить если есть молоко, молоко может быть только после еды (определённое время после), ест сама траву (как овцы) и имеет состояние голода, во время которого молоко производиться не будет. На деле тут всё будет очень просто и часть логики мы просто интегрируем от других мобов, а также добавим несколько важных переменных.

Список уроков

Этот гайд начинаем только после этого:

Ну, сейчас все увидите. Погнали.

Java-часть. Пара новых моментов…

Для начала правим класс GSCowEntity.java. Нам нужно добавить пару глобальных переменных. Как и следует из названий, первая – наличие молока, а вторая – голодная ли корова или нет. Сразу говорю, что можно бы взять вторую не как булеву, а как какое-то число, в зависимости от которого и будет определено голодна корова или сыта. Второй вариант позволяет сделать более гибкую систему питания и выработки молока. К примеру: если корова сыта не менее чем на 50%, то она делает молоко, а иначе хочет есть и не делает. Но я специально упростил модель, чтобы не усложнять :D.

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

Обновим goals сущности:

Тут мы проинициализировали логику поедания травы, а также добавили её в список целей.

Добавляем функцию updateAITasks()

Тут мы синхронизируем внутренний таймер сущности с таймером поедания травы. Именно благодаря этому сущность будет знать когда опускать голову. Иными словами: опускание головы и факт поедания травы не связанны никак, но в зависимости от времени до поедания – срабатывает анимация «питания».

Ещё нам нужно добавить livingTick()

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

С первым думаю всё ясно, а второй рассмотрим подробнее. Условие гласит: если корова не голодна и уже не имеет молоко, то идём к следующим условиям: если она не ребёнок, жива, а также время до молока меньше или равно нулю – говорим му и указываем, что молоко уже есть. Если убрать комментарий со строки this.glowing = hasMilk();, то корова с молоком будет иметь подсветку, тогда как без – нет.

Java-часть. И ещё пара новых моментов…

Далее добавляем такую функцию:

Честно, я имею приблизительное представление о том, что такое id == 10, так как в зависимости от id жители выражают эмоции, а голем может носить цветочек, а если id 40, то это обработка активации тотема бессмертия. Данный код я взял у овцы, так что пока оставим так, все вопросы к ней. Список id и их описаний я не нашёл.

И добавляем пару функций, которые будут участвовать в обработке наклона головы коровы. Я их тоже бессовестно спёр из класса овцы и даже не особо правил, так как анимация меня устраивала. Единственное, что в классе модели нужно будет изменить высоту головы на нашу.

Как и я говорил, в зависимости от внутреннего таймера будет запущена отрисовка анимации, но эти функции будут вызваны не тут, а в классе модели.

Теперь можно добавить функции для более удобной работы с состояниями коровы:

Теперь функции для регистрации параметров коровы, их считывания и записи:

Так же нам нужно добавить функцию eatGrassBonus() которая будет вызвана после поедания травы.

Я делаю проверку до только потому, что корова может есть несколько раз до готовности молока и без проверки таймер будет сброшен после каждого приёма пищи. А так он будет запущен, как только корова перестала быть голодной и пускай дальше делает, что хочет.

В завершение новая версия функции processInteract(), которая обрабатывает применение предметов на сущность.

К условию доения я добавил проверку на наличие молока, а также возможность нажимать на корову палочкой отладки для получения информации о наличии молока, голоде и времени до появления молока.

Полный код нашего чудовища смотрите тут.

Модель

Теперь нужно научить модель отображать новые анимации, а также отображать большое вымя при наличии у коровы молока. Для «живых» анимаций есть специальная функция setLivingAnimations. Одним из параметров выступает наша сущность, что позволит при обновлении учитывать любые изменения моба.

Ну, похоже, что на этом всё. Можно запускать!

Кушает!
Есть молоко
Модель при наличии молока
Модель без молока
«Готовит» молоко

Исходники тут.

One thought on “[1.15.2] Улучшаем интеллект своего моба

Добавить комментарий