Начнём с основного правила АИшек на офе - "На офе нет новых аишек и быть не может". Но правило рушится если вы знаете как зацепить на сервер новую ДЛЛльку, а для тех кто не умеет - читаем далее...
Как я уже сказал: на офе нельзя создать новую AI, можно лишь изменить старую. Для изменения существующих АИ советую использовать тестовые файлики с ними
Посмотреть вложение 24
...но перед редактированием желательно всё же проверить на каких монстрах закреплена данная АИ, во избежании краха игровых функций. Если все найденные монстры имеют имена по типу Test_monster_ldf5_under_var_5 то можно смело брать его АИ и использовать для своих жестоких целей.
АИ на офе достают из нескольких блоков, почти как на джаве. Сам блок АИ имеет открывающий и закрывающий тег npc_ai_pattern всё что вне этого тега выдаст ошибку при запуске серверов. Далее, в этом теге, идёт тег name, догадаться для чего он не сложно. Далее идёт нашего всё - само действие NPC. В теге event_handlers располагаются, так называемые, события. Событий в этом теге может быть большое количество, некоторые из них и функционал к ним приложен ниже:
Далее рассмотрим возможное содержимое в наших событиях. Есть негласное правило которое вам может рассказать сервер если его слишком сильно насиловать как делал это я - некоторые события не будут использоваться монстром если они находятся не в своём блоке событий. Наглядный пример: если расположить действие give_item_by_user_indicator в блок on_message то он вряд ли что-то вам даст . Перед тем как вы поймёте шутку - распишу что к чему.
В данном случае give_item_by_user_indicator - Позволяет выдать указанный предмет игроку с которым говорит и использует примерно так
Из кода мы получаем следующее:
Подведём итоги это недошутки - некоторые команды должны писаться только в определённом блоке событий (event_handlers). В данном случае он будет разумно использоваться в блоке on_talked_by_user где я его собственно нашёл и находил.
Но не всё так легко как могло показаться (чтоб ему сдохнуть)... В АИ предусмотрена система приоритета. Для чего она? Хм, интересный вопрос, давайте подумаем вместе. Предположим мы рассматриваем АИ некоторого огромного босса, например АИ Гипериона. Как вы могли догадаться, после каждого события и действия проходит некоторая задержка, предположим на Гиперионе условие которое звучит по типу следующего: Если моё здоровье опустилось до 50% от общего значения - использовать призыв монстров по координатам; Если моё здоровье опустилось на 50% от общего значения - использовать умение с индексом 5 на цель которая имеет наивысшую агрессию среди целителей. Повторюсь, условие взято из голов, прям так он не делает. Как вы думаете: какое из условий сработает первее, спавн или умение? Вот тут играет роль система приоритета, в коде оно выглядит вот так: <priority>7</priority> и располагается в блоке pattern. Задав в наше условие значение приоритета - система самы выберет что ей использоваться в первую очередь, а что во вторую.
Но что-то я забрёл далеко вперёд. Думаю у вас будет вопрос что такое pattern и с чем его едят. Данный тег просто ограничивает команды. На примере не буду приводить устную АИ моба, скажу следующее: на монстрах нет функции использования скилов в рандомном порядке, на офе все скилы прописаны для каждого моба отдельно. Если у моба 5 умений которыми он пользуется, то как ему использовать их пока его бьёт даэв? Очень просто! Напишем в событии боя (on_battle_timer) что он должен использовать (гипотетически) скилы с 0 до 4 по порядку. Для этого задействуем таймеры боя и пускай монстр использует все скилы на перса в порядке их прописи на самом мобе. Но добавить просто таймер не даст никаких плодов. Для этого необходимо разбить нашу АИ на блоки, разделив их тегом pattern...и не стоит забывать что бы используем событие боя. В итоге мы получаем АИ по типу следующего:
Посмотреть вложение 25
С точки зрения сервера - это полное Г а не АИ НПЦ. Добавим ему шапку о которой я говорил в самом начале. И получим следующее:
Посмотреть вложение 26
С точки зрения сервера стало получше, но недостаточно для меня, я ведь хочу чтоб моб что-то делал, а не просто стоял и бил автой. Добавим в блок pattern наши действия, а именно использование умений. Возьмём те же условия: у нас 5 умений, а враг даэв. Но стоит помнить одну бяку с умениями - отсчёт умений начинается с 0, а не с 1 как у всех нормальных людей. И добавим сразу же значение приоритета (его повторять нежелательно).
Посмотреть вложение 27
Был бы я сервером - я бы послал разраба на 3 буквы.... в блоке pattern необходимо использовать ещё два блока: блок условия (conditions) и блок выполнения (actions). И давайте познакомимся с ещё одним овощем. Его зовут категория использования (action_category), ходит он всегда с грустным лицом PLANNED, трогать эту парочку не надо, пускай посидят у нас в коде. И позовём на огонёк тег комментария (comment), мало ли чего хотим не забыть или подписать (Русские буквы вышли из чата).
Посмотреть вложение 28
Теперь у нас АИ достойная сервера, но не достойная моба. Теперь необходимо подарить нашей АИшечке выбор - добавим условие. Думаю будем использовать значение таймера и значение НР своего или врага. У нас 5 блоков, в которые мы можем прикрепить условие. Давайте в первый блок добавим условие: если моё здоровье составляет 90% от общего значения. Во второй блок поставим двойное условие: если у меня здоровье в интервале от 80% до 50% и полностью заполнен таймер 0. Оставшиеся блоки пустим на обычные таймеры. Если составить код дословно, думаю ничего не получится...... добавим блок событий on_enter_attack_state и напишем там заполнение таймера 1...предположим на 30 секунд (3000 единиц). Некоторые пояснения: поскольку второе условие более расплывчатое, то давайте ему поставим самозаполняющийся таймер (выделено красным). Получается что он будет использовать умение пока условие его здоровья истинное.
В результате мы получаем рабочий скрипт для нашего моба:
Правда я немного отклонился от первоначального условия... Полученная АИшечка имеет следующее описание:
При условии что я вошёл в состоянии атаки заполнить таймер 0 на 15 секунд и таймер 1 на 30 секунд. Если моё здоровье составляет меньше 90% - использовать умение 0 на цель. Если таймер 0 заполнен и моё здоровье в пределах 50-80% от общего НР - использовать умение 1 и заполнить таймер 0 на 10 секунд. Если таймер 1 заполнен - использовать умение 2 и заполнить таймер 2 на 10 секунд. Если таймер 2 заполнен - использовать умение 3 и заполнить таймер 3 на 10 секунд. Если таймер 3 заполнен - использовать умение 4 и заполнить таймер 1 на 10 секунд. После чего идёт повторение выделенного блока до бесконечности.
Вот так мы создали простого моба. Если поковыряться в коде то на версию 4.6 можно добавить вручную систему Вторжения Бритры (с некоторыми поправками), создать новый данж по аналогии Сокровищницы Триллируна или многое другое.
За время работы с офф сервером я нашёл и описал много моментов в АИ. Ради тестов я создал полностью автономную систему Вторжения бритры с тем самым дропом "один для каждого" с некоторыми эффектами и сообщениями, я создал развлекательный ивент по типу итема Dead branch из игры Ragnarok (призвать рандомного моба через использование итема), и на письме создал данж который работает с АИ монстров и АИ мира с выбором сложности в самом данже.
Если разберётесь с малым - сожете достигнуть высшего.
Всем спасибо, надеюсь поняли что я написал в данной статье.
Как я уже сказал: на офе нельзя создать новую AI, можно лишь изменить старую. Для изменения существующих АИ советую использовать тестовые файлики с ними
Посмотреть вложение 24
...но перед редактированием желательно всё же проверить на каких монстрах закреплена данная АИ, во избежании краха игровых функций. Если все найденные монстры имеют имена по типу Test_monster_ldf5_under_var_5 то можно смело брать его АИ и использовать для своих жестоких целей.
АИ на офе достают из нескольких блоков, почти как на джаве. Сам блок АИ имеет открывающий и закрывающий тег npc_ai_pattern всё что вне этого тега выдаст ошибку при запуске серверов. Далее, в этом теге, идёт тег name, догадаться для чего он не сложно. Далее идёт нашего всё - само действие NPC. В теге event_handlers располагаются, так называемые, события. Событий в этом теге может быть большое количество, некоторые из них и функционал к ним приложен ниже:
- on_wake_up - когда появился
- on_attacked - когда получает атаку
- on_spelled - разговор или использование
- on_die - когда умер
- on_despawn - когда задеспавнился
- on_gauge_begin - начало измерения
- on_gauge_stop - окончание измерения
- on_idle_timer -
- on_message - когда видит сообщение
- on_killed_by_user - убит игроком
- on_enter_attack_state - когда вошёл в состояние атаки
- on_talked_by_user - начало разговора с игроком
- on_sense_friend_killed_by_user - если убили друга в радиусе видимости
Далее рассмотрим возможное содержимое в наших событиях. Есть негласное правило которое вам может рассказать сервер если его слишком сильно насиловать как делал это я - некоторые события не будут использоваться монстром если они находятся не в своём блоке событий. Наглядный пример: если расположить действие give_item_by_user_indicator в блок on_message то он вряд ли что-то вам даст . Перед тем как вы поймёте шутку - распишу что к чему.
В данном случае give_item_by_user_indicator - Позволяет выдать указанный предмет игроку с которым говорит и использует примерно так
Please,
Вход
or
Регистрация
to view spoiler content!
Из кода мы получаем следующее:
- receiver - цель (игрок который разговаривает с NPC)
- item_id - нейм предмета который он выдаст
- min и max - диапазон количества выдаваемых итемов
Подведём итоги это недошутки - некоторые команды должны писаться только в определённом блоке событий (event_handlers). В данном случае он будет разумно использоваться в блоке on_talked_by_user где я его собственно нашёл и находил.
Но не всё так легко как могло показаться (
Но что-то я забрёл далеко вперёд. Думаю у вас будет вопрос что такое pattern и с чем его едят. Данный тег просто ограничивает команды. На примере не буду приводить устную АИ моба, скажу следующее: на монстрах нет функции использования скилов в рандомном порядке, на офе все скилы прописаны для каждого моба отдельно. Если у моба 5 умений которыми он пользуется, то как ему использовать их пока его бьёт даэв? Очень просто! Напишем в событии боя (on_battle_timer) что он должен использовать (гипотетически) скилы с 0 до 4 по порядку. Для этого задействуем таймеры боя и пускай монстр использует все скилы на перса в порядке их прописи на самом мобе. Но добавить просто таймер не даст никаких плодов. Для этого необходимо разбить нашу АИ на блоки, разделив их тегом pattern...и не стоит забывать что бы используем событие боя. В итоге мы получаем АИ по типу следующего:
Посмотреть вложение 25
С точки зрения сервера - это полное Г а не АИ НПЦ. Добавим ему шапку о которой я говорил в самом начале. И получим следующее:
Посмотреть вложение 26
С точки зрения сервера стало получше, но недостаточно для меня, я ведь хочу чтоб моб что-то делал, а не просто стоял и бил автой. Добавим в блок pattern наши действия, а именно использование умений. Возьмём те же условия: у нас 5 умений, а враг даэв. Но стоит помнить одну бяку с умениями - отсчёт умений начинается с 0, а не с 1 как у всех нормальных людей. И добавим сразу же значение приоритета (его повторять нежелательно).
Посмотреть вложение 27
Был бы я сервером - я бы послал разраба на 3 буквы.... в блоке pattern необходимо использовать ещё два блока: блок условия (conditions) и блок выполнения (actions). И давайте познакомимся с ещё одним овощем. Его зовут категория использования (action_category), ходит он всегда с грустным лицом PLANNED, трогать эту парочку не надо, пускай посидят у нас в коде. И позовём на огонёк тег комментария (comment), мало ли чего хотим не забыть или подписать (Русские буквы вышли из чата).
Посмотреть вложение 28
Теперь у нас АИ достойная сервера, но не достойная моба. Теперь необходимо подарить нашей АИшечке выбор - добавим условие. Думаю будем использовать значение таймера и значение НР своего или врага. У нас 5 блоков, в которые мы можем прикрепить условие. Давайте в первый блок добавим условие: если моё здоровье составляет 90% от общего значения. Во второй блок поставим двойное условие: если у меня здоровье в интервале от 80% до 50% и полностью заполнен таймер 0. Оставшиеся блоки пустим на обычные таймеры. Если составить код дословно, думаю ничего не получится...... добавим блок событий on_enter_attack_state и напишем там заполнение таймера 1...предположим на 30 секунд (3000 единиц). Некоторые пояснения: поскольку второе условие более расплывчатое, то давайте ему поставим самозаполняющийся таймер (выделено красным). Получается что он будет использовать умение пока условие его здоровья истинное.
В результате мы получаем рабочий скрипт для нашего моба:
Please,
Вход
or
Регистрация
to view spoiler content!
Правда я немного отклонился от первоначального условия... Полученная АИшечка имеет следующее описание:
При условии что я вошёл в состоянии атаки заполнить таймер 0 на 15 секунд и таймер 1 на 30 секунд. Если моё здоровье составляет меньше 90% - использовать умение 0 на цель. Если таймер 0 заполнен и моё здоровье в пределах 50-80% от общего НР - использовать умение 1 и заполнить таймер 0 на 10 секунд. Если таймер 1 заполнен - использовать умение 2 и заполнить таймер 2 на 10 секунд. Если таймер 2 заполнен - использовать умение 3 и заполнить таймер 3 на 10 секунд. Если таймер 3 заполнен - использовать умение 4 и заполнить таймер 1 на 10 секунд. После чего идёт повторение выделенного блока до бесконечности.
Вот так мы создали простого моба. Если поковыряться в коде то на версию 4.6 можно добавить вручную систему Вторжения Бритры (с некоторыми поправками), создать новый данж по аналогии Сокровищницы Триллируна или многое другое.
За время работы с офф сервером я нашёл и описал много моментов в АИ. Ради тестов я создал полностью автономную систему Вторжения бритры с тем самым дропом "один для каждого" с некоторыми эффектами и сообщениями, я создал развлекательный ивент по типу итема Dead branch из игры Ragnarok (призвать рандомного моба через использование итема), и на письме создал данж который работает с АИ монстров и АИ мира с выбором сложности в самом данже.
Если разберётесь с малым - сожете достигнуть высшего.
Всем спасибо, надеюсь поняли что я написал в данной статье.