Мировые условия спавна. Мировой спавн. Работа AI и мира.

Booblik

Moderator
[Зам.Боженьки]
Командный игрок
Всем снова приветики. В прошлой статье я упомянул мировые AI. Могу предположить что не все поняли о чём идёт речь. Не знаю насколько я правильно их называю, но как по мне это очень им подходит. Речь идёт, в основном, о спавне монстров через регистрацию их в самом мире (папочка worlds). Начнём с основ.

В мировых спавнах, как и в обычных AI, существует параметр условия. Правда условие в основном идёт с
Please, Вход or Регистрация to view URLs content!
(true или false), поэтому особо играться тут нечем. Выглядит это условие примерно так:

Посмотреть вложение 30

Поскольку сервер использует тэги, то символы  "<" и ">" пишутся в условии HTML-кодом (
Please, Вход or Регистрация to view URLs content!
). В блоке условий можно использовать до 5 условий (но возможно использовать можно больше 5 условий), в условии можно использовать почти все логические операции (кроме операции отрицания "¬"). Зачастую условия используют имя переменной и цифру (0 или 1), но бывают случаи когда условие задаёт не сервер, а мы сами - через AI NPC (отсюда я и называю их мировыми АИшками). Но бывают условия которые создаются автоматически или используют полуавтоматическую составляющую. Например система которая была популярна в версиях 3.х - гварды которые появляются во время разлома. Они имеют полуавтоматическое условие, выглядит это условие так - DirectPortalDest_9. Данное условие можно разбить на 2 части - DirectPortalDest и _9. DirectPortalDest - значение что это портал на выход (от Destination). _9 - номер выходного разлома. Вторая часть, как можно догадаться, может быть любой, главное не запутаться в номерах.

А теперь поговорим более подробно о создании рифта. Для создания рифта нам необходимо 3 файла (4 при условии что нам нужно создать рифт с новой внешностью). Для работы нам необходимы следующие файлы: direct_portal.xml, world.xml начальной локации и world.xml конечной локации (npcs_npcs.xml для нового вида разлома). Файлик direct_portal.xml создаст нам новый пакет входного и выходного разлома. На этом этапе разъяснение нужно только в цифрах.

Посмотреть вложение 31

Красным выделены данные входного разлома - нейм локации и номер в мире (прим. если вы напутали с цифрами, то может произойти так что откроется другой разлом или не откроется вообще). Салатовым выделены данные выходного разлома - нейм локации и номер в мире. Розовым выделены данные по разломам которые появятся, если вы хотите их изменить, то вам необходимо найти подходящий или создать новый в npcs_npcs.xml по аналогии с корейскими разломами. Остальная информация не столь важна для разъяснения, только стоит знать что нейм разлома в этом файле может быть любым, главное чтоб не повторялся.

Далее перейдём к работе с мировыми файлами. Откроем наши файлики и найдём в них блок с разломами, называется он <direct_portals> . По аналогии создадим копию существующего рифта и изменим некоторые данные.

Посмотреть вложение 32

Как уже говорил, нейм может быть любым, главное чтоб не повторялся, это же правило доступно и тут. Второй параметр (weight) не даёт никакой пользы, поэтому ставим туда любое значение. Далее идёт параметр с которым вы можете напутать. В параметр group_id необходимо записать то число, которое стоит в файле direct_portal, но число (если вы используете цифры не по моему совету) должно соответствовать нужному разлому. Опустимся на строчку ниже. Значение start, этот параметр показывает какой тип у разлома - входной (1) или выходной (0). Возвращаемся на строчку выше, если это входной разлом - используем цифру из строчки - <s_group_id> в файле direct_portal, если это выходной разлом - используем цифру из строчки - <d_group_id> в файле direct_portal. Далее меняем координаты и угол (прим. разлом летающий, используйте +2 по оси Z чтоб выглядел как остальные разломы). Угол на офе составляет 360 градусов (-90* из данных графической консоли). Теперь создаём второй разлом, при создании всё тоже самое, нейм, естественно, должен отличаться.

Вот мы создали новый разлом. Теперь мы можем использовать параметр условия на мировом спавне монстра. Но, перед этим, создадим сам спан. Создание спавна является одной и самых сложных моментов на офе. При создании спавна необходимо прописывать данные сразу к нескольким возможным параметрам на NPC. ... но, всё по порядку.

Начнём создавать спавн с шапки, возьмём её с уже существующего моба. При переносе следует обратить внимание на параметры: no_respawn и spawn_country. Первый параметр отвечает за возможность респавна моба, второй же отвечает (теоретически) за спавн под определённым кантри кодом (сс или региональный код), если во втором параметре стоит значение -1 то волноваться не стоит. Далее назовём наш спавн - название произвольно но не повторяющееся. Далее начинается первая часть гемороя - прописывание зоны в которой может находиться моб (прим. если используется параметр <max_chase_time>SP</max_chase_time> на NPC). Если у вас нет больший предпочтений к месту моба и вам нужно чтоб он просто появился по заданным координатам - создайте 4 точки на отдалении примерно 10-15 метров от спавна. Пример как должен выглядеть спавн в игре:

Посмотреть вложение 33

Цифрами помечены углы квадрата, по их координатам я сделал зону NPC. Звёздочка - сам спавн монстра.

Забыл упомянуть один момент. На офе, к одному блоку спавна, может быть привязано сразу несколько зон для спавна, имеют свои индексы начиная с нуля и прописываются так: <move_area_points moveAreaIndex="0"> - число и есть номер спавна.

Далее переходим к следующей части маразма - прописываем координаты спавна всех монстров, но не забывайте что они должны быть внутри прописанной зоны. После координат используется параметр <moveareaindex>0</moveareaindex>, число является номером спавна. Последний параметр - <checksurfacez>134.000000</checksurfacez> предположительно используется для возможного параметра <max_chase_time>SP</max_chase_time>.

Далее переходим к самим спавнам. Если мы создаём условный спавн, то советую и каркас найти соответствующий. думаю вы уже большие, и сами найдёте такой спавн как на скрине выше (map/worlds/df2/world.xml спавн по имени DF2_DirectPortal_Guard_Da_Ae_lv60_G09). Очищаем блок спавна и оставляем только следующее:

Посмотреть вложение 34Посмотреть вложение 35

Либо можете использовать тот же каркас что я и удалил, но это в том случае если вы используете сразу несколько мобов. Пойдём по порядку. В блок условия (condition) пишем наше условие, в нашем случае DirectPortalDest_5==1. Цифру я взял из id в файле direct_portal. Далее пишем нейм монстра и го координаты с углом. Меняем значение параметра <moveareaindex> в координатах, если монстр появляется в другой зоне спавна. Далее углубимся в параметры.

Начнём с параметров времени. На офе, по сравнению с фришкой, есть два параметра времени - спавн и респавн. Так же используется и их погрешность.

Посмотреть вложение 36

Погрешность берётся рандомная т.е. если мы напишем чистый респавн 2 минуты (120 секунд), а погрешность 180 секунд, то это не значит что он появится через 5 минут (300 секунд). При спавне или респавне погрешность берётся рандомная из заданного числа т.е. из 180 секунд может пройти 10, 100 или вовсе 1 секунда, но можно и избежать это, погрешность принимает значение нуля. (прим. после запуска сервера запускается параметр спавна, далее используется параметр респавна). остальные параметры не требуют внимания.

Далее поговорим если вы хотите чтоб появлялся рандомный монстр из 4х. Для этого немного увеличиваем наш блок, дописываем и изменяем некоторые моменты.

Посмотреть вложение 37

Меняем select_prob и ставим туда значение процента ( 1% = 100 у.е.) и дописываем к первому блоку default="true", что бы сервер знал с кого начать, без параметра он не заспавнит.

Получаем что монстр появится при условии что открылся в мире выходной разлом с индексом 5, поэтому если он появляется в другом мире (в котором отсутствует разлом с id 5) то моб не заспавнится.

А теперь объединим всё это, но заменим условие на своё. Для этого меняем AI любого моба и записываем ему значения для мира.

Посмотреть вложение 38

Вставим выше упомянутый блок при смерти монстра. Получившееся AI имеет следующий вид:

Посмотреть вложение 39

Далее изменяем в мире условие DirectPortalDest_5==1 на set-trap==1 (или на ваше любое число). Если AI в таком виде не установила параметр - добавьте по той же основе блок on_killed_by_user. Если после введения нового блока он всё ровно не появился - уберите условие спавна и проверьте спавн монстра при обычных условиях, возможно вы где-то там накосячили. Пример обычного спавна ниже:

Посмотреть вложение 40

Вот так мы познакомились с работой мира и AI, научились прописывать монстра в мир и немного расширили кругозор написания AI.

 
  • Like
Реакции: WeRn
Назад
Верх