Иконка ресурса

Разбор работы существа на примере зомби

Нет прав для скачивания
Версия(и) Minecraft
1.6.4
Здрасьте, выше 1.6.4 я не умею поэтому разбор буду проводить на базе 1.6.4, позже может кто сделает на более новые версии. (задание на трелло висит я не виноват)
Начинать будем с малого. Что же такое это ваше существо в натуре то?
!!!DataWatcher здесь не будет!!!

Существо - это внутриигровой объект, имеющий определенные свойства не
характерные другим объектам таким как блок, и так далее.
На чём всё базируется?:
Существа базируются на главном классе Entity, от него уже отходят ветки:
Entity ->
    EntityLivingBase ->
        EntityLiving ->
            EntityFlying,
            EntityCreature ->
                EntityAgeable,
                EntityMob;

Это базовые классы существ, в которых описаны базовые методы их работы.
Сейчас возьмем за основу существо Зомби, самый простой и самый обычный.
У Зомби как и у всех существ с 'Мозгами', есть AI - Искусственный интеллект кой и является их мозгами.
Все элементы AI хранятся в поле tasks, а добавить свой элемент AI можно через EntityLiving#tasks.addTask, первым аргументом будет идти приоритет вашего элемента интеллекта, а 2-м аргументом сам класс элемента AI, обычно AI обновляются раз в тик в методе EntityLivingBase#onLivingUpdate, при этом вы должны унаследовать метод EntityLivingBase#isAIEnabled и возвращать там true что-бы AI был включён.
1605017592809.png


Далее у зомби имеется навигатор, существо двигается с помощью навигатора, а сам навигатор зависит от AI, поскольку именно в интеллекте устанавливаются пути куда должен пойти зомби!

Ещё дальше у зомби устанавливаются его атрибуты(свойства), т.е. пара примеров:
1 атрибут зомби это максимальная дальность между игроком и зомби после которого он обязательно должен перестать его преследовать, скорость передвижения зомби и урон наносимый зомби по другим существам.
1605017548801.png


Далее по курсу у нас идет метод обновления зомби, выполняемый каждый тик EntityLivingBase#onLivingUpdate.
В нём находится в данном случае код где проверяется есть ли шлем на зомби, и если нету а так-же сейчас дневное время и зомби находится непосредственно без укрытия или не в воде - то он начинает гореть целых 8 секунд!

Так-же у зомби есть свои звуки ходьбы, получения урона, смерти и просто издаваемые им звуки которые проигрываются случайно, методы: playStepSound, getHurtSound, getDeathSound, getLivingSound соответственно.

При смерти зомби оставляет после себя кусочки гнилой плоти, ID предмета после смерти его определяет метод getDropItemId, а так-же редкий дроп как слиток железа, морковь или картофель которые регулирует метод dropRareDrop.
1605017439081.png


Так-же есть невероятно важные методы, которые работают с данными нашего зомби:
writeEntityToNBT - Который отвечает за запись данных зомби в NBT и
readEntityFromNBT - Который эти данные считывает из NBT.

Так-же когда зомби убивает жителя на уровне сложности 2 или более то происходит что?
Верно заражение жителя вследствии чего появляется зомби-житель!
За это отвечает метод onKillEntity, где в классе зомби проверяется уровень сложности, и если уровень сложности равен 2 то зомби может не появится, а на 3 уже он будет обязательно!
1605017415551.png


Так-же зомби-жителя можно вылечить вызвав у зомби-жителя слабость и дав ему золотое яблоко!
У зомби начнется превращение в обычного жителя. А как-же может начаться превращение?
У зомби есть метод interact который отвечает за взаимодействие игрока с зомби, если у зомби-жителя наложен эффект слабости и игрок дает ему золотое яблоко, то начинается перевоплощение!
1605017380204.png


А ещё есть 1 метод, который не даст деспавнится(пропасть) зомби если он начал свое перевоплощение. А как? А вот так! Благодаря магии метода canDespawn который не дает этого сделать если зомби в процессе перевоплощения.
1605017301778.png


Более в зомби нет ничего интересного для новичка(скорее мне лень расписывать вспомогательные методы).

Теперь более важные вопросы, а как-же зарегистрировать своего моба?
Вариант таков!
Java:
int myEntityID = EntityRegistry.findGlobalUniqueEntityId();
EntityRegistry.registerGlobalEntityID(MyEntityClass.class, "mod.myEntity.name", myEntityID);
//5 аргумент - trackingRange, Range на котором Minecraft отправляет трекинг-обновления существу(???)
//6 аргумент - частота отправки трекинг-обновлении существу в тиках
//7 аргумент - при значении true отправляет пакеты движения на клиенты
EntityRegistry.registerModEntity(MyEntityClass.class, "mod.myEntity.name", myEntityID, MyMod.instance, 80, 3, true);
Хочешь зарегистрировать рендер? Не беда, делаем Sided-Proxy и на клиенте регистрируем таким образом:
RenderingRegistry.registerEntityRenderingHandler(MyEntityClass.class, new MyEntityRender());

На этом к сожалению пока-что всё, в будущем если будет время - буду дополнять.
Спасибо за внимание и прочтение.
  • 1605017299137.png
    1605017299137.png
    2.6 KB · Просмотры: 142
Автор
jopi
Скачивания
2
Просмотры
1,080
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя jopi

Сверху