Graff46 598 Опубликовано 9 Июля 2016 Данные схемы не являются законченной работой, в них есть недостатки и упущения, которые появляются в большей степени из-за моего не самого лучшего понимания механики организации логики и приемов её программирования, я лишь задал идею и призываю всех модостроителей развивать данную работу и не жадничать делая для себя, а делится со всеми. Данная работа предназначена в основном для начинающих модмейкеров! Не надо мне говорить, что это нужно сделать через SDK или ACDC. Когда я начинал заниматься модмейкерством, то передо мной, как и перед всеми начинающими модмейкерами наверно, встало много проблем, которые решались различными методами, иногда эти методы были, откровенно говоря костылями по принципу лишь бы работало. Одной из таких проблем было создание новой логики для персонажей. Большинство схем логики требуют наличия точек путей расставляемых в SDK или средствами ACDC. Заниматься конвертированием локаций, расстановкой элементов с последующей перекомпиляцией ИИ, представлялось как страшный сон, спавн точек путей через ACDC был легче, но были свои отрицательные нюансы с их настройкой. Поэтому вовсю шли костыли начиная от повсеместного использования "всеми любимой" схемы remark, со своими "плюсами" заканчивая использованием схемы follower, а в качестве лидера спавнился мертвый NPC с сидом, прозрачной 3D моделью и без шейпов, жуткое извращение, но результат давало в виде привязанного к точке сталкера, даже с задаваемыми анимками. Тогда я решил, раз точки пути нужны для определения координат или направления, то почему бы нам не забыть про эти точки (ведь главное координаты - цифры), и найти другой способ передать координаты. Покопавшись с скриптах схем логики и ничего толком не поняв, но как говорит один из моих преподавателей в ВУЗе: "Интуитивно понятно", и кое что для себя я наметил: почему бы не передавать координаты прямо из файла с логикой NPC? Но попытки что то сделать были тщетны, единственное я смог на основе схемы follower сделать свою схему для следования NPC за Актером. Прошло много лет, я окончил техникум, армия, в ВУЗ-е я поднатаскал себя в программировании и вернулся к задаче с логикой, в результате я представлю Вам две схемы логики, которые не требуют точек путей, а по функциональности не уступают остальным. Схемы логики на вертексах Описание: Данные схемы были созданы для того, что бы создавать сложные схемы поведения НПС без необходимости редактирования all.spawn. Нужно учесть, что эти схемы созданы из схемы remark, поэтому они не корректно себя ведут в качестве работ в гулагах (но хорошо ведут себя в скриптовых смартах). Данные схемы вполне самодостаточны и применимы, но имеют ряд недостатков нуждающихся в правках и улучшениях; например эти схемы работают только в пределах локации. Список схем с коротким описанием: stander -- НПС стоит на заданном месте, может играть анимацию или набор анимаций, pointer -- старый аналог stander'а, не рекомендуется к использованию, выложен для просмотра кода, workman -- Схема для работы НПС в скриптовых смарт-террейнах, описан в разделе скриптовых смарт-террейнов, sputnik -- НПС следует за другим игровым объектом, в том числе ГГ + доп. ф-ции, beggar -- НПС передвигается по пути состощему из вертексов + масса ф-ций; remark -- Добавлен параметр "cell" в котором указываем координаты точки в которую будет смотреть НПС, не используй вместе с target Поля схем: stander: Переделан из remark'a и follower'a (xr_attendant.script) [stander] lv = ; Левел вертекс в который стремится НПС (обязателен) extns = ;радиус в котором точка считается достигнутой по дефолту 1.4 snd_anim_sync = ; смотри в remark anim_walk = ; anim_run = ; anim_sprint = ; смотри в Схеме follower snd = ;смотри в remark anim = ;смотри в remark, НЕ ПРИМЕНЯТЬ ВМЕСТЕ С ANIM_SET anim_set = sit_ass(120),hello_wpn, eat_bread(80);НЕ ПРИМЕНЯТЬ ВМЕСТЕ С ANIM, задает набор анимаций для проигрования в виде "имяАнимации(времяАнимацииВСек),...", время в скобках можно не указывать, тогда оно будет = 60сек, работает в цикле по кругу. tips = ;смотри в remark tips_sender = ;смотри в remark anim_reset = ;смотри в remark target = ;смотри в remark + можно писать sstor НПС'а (см. скрипт nt.script),НЕ ПРИМЕНЯТЬ ВМЕСТЕ С CELL cell = 123.67,567.98,456,000 ; координаты точки (x,y,z) куда смотреть НПС'у, НЕ ПРИМЕНЯТЬ ВМЕСТЕ С TARGET first_run = true ; true\false Будет ли НПС бысро бежать к точке работы при 1-й загрузке схемы. По умолчанию - true sputnik: Переделан из follower (xr_attendant.script) [sputnik] anim_walk = ; anim_run = ; anim_sprint = ; formation_line = ; distance = ; snd = ; tips = ; tips_sender = ; ; все предыдущие поля смотри в схеме follower target = ; задаётся аналогично как в stander, только это объект к которому будет стремится НПС (ОБЯЗАТЕЛЬНЫЙ параметр) anim = ; аналогично remark, как только будет с лидером (не бежать за ним) anim_set = ; аналогично stander, как только будет с лидером (не бежать за ним) anim_reset = ; аналогично remark, как только будет с лидером (не бежать за ним) cell = ; аналогично stander, как только будет с лидером (не бежать за ним) beggar: Переделан из follower (xr_attendant.script) и remark'a Задаём пути из левел-вертексов для beggar'а: В файле array_ways.script создаём (объявляем) локальную таблицу (переменную с приравненной таблицей) (имя таблице лучше дать осмысленное но не длинное). В таблице делаем вложенные безымянные массивы, столько - сколько у Вас вертексов в пути, каждый массив заполняем так: -й элемент - сам левел вертекс, -й элемент - время в секундах которое НПС будет "удержан" в вертексе, прежде чем пойдёт в следующий, -й элемент - анимация в вертексе (когда НПС "удержан"); Теперь важен только 1-й пареметр (левел вертекс), остальные по требованию. Пример: //-- Массивы с левел вертаксами для путей. Graff46. local tst = { {402917, 2, "eat_vodka"}, {432591, 2, "eat_vodka"} } local zab_kill_pat_sm = { {446046, 0, "wait"}, {445985, 0, "wait"}, {362295, 0, "wait"}, {355863, 0, "wait"} } Поля схемы: [beggar] snd_anim_sync = ; snd = ; anim = ; tips = ; tips_sender = ; target = ; ;Всё что выше аналогично remark'у name_way = ; имя таблицы из array_ways.script, в которой нужный путь loop = true\false; идти ли в 1-й вертекс по оконнчании пути anim_walk = ; аналогично follower'у anim_run = ; аналогично follower'у anim_sprint = ; аналогично follower'у formation_line = ; аналогично follower'у distance = ; аналогично stander'у cell = ; аналогично stander'у first_run = false ; true\false Будет ли НПС бысро бежать к точке работы при 1-й загрузке схемы. По умолчанию - false. Включать рекомендую для патрульных неспеша ходящих по лагерю. near_lv = true ; true\false Будет ли НПС идти не в 1-ю точку пути, а в ближайшую точку пути от места где находится НПС. По умолчанию true. Настройка логики от Икстрима: https://yadi.sk/d/hq6qthWt9m2RC *Скрипты логики нужно подключить в modules.script !!! Ссылка на репозиторий моей СКВ (может глючить) Новая ссыль - https://yadi.sk/d/zZq-Y9K3eq1VoA 1 1 7 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 13 Июля 2016 (изменено) Я доделал схему stander, Называется она beggar теперь NPC будет ходить от одной точки к другой, есть возможность останавливаться в точках на задаваемое кол-во времени для анимаций. У секции появились новые дополнительные поля (ДОПОЛНИТЕЛЬНЫЕ, старые поля из stander ни куда не делись) и дополнительный скрипт. Начну с полей:name_way - имя пути (пути создаются из точек, будет описано далее).loop - задавать false или true. Это зацикливание, приходя в последнюю точку пути дядька NPC пойдет снова к первой точке и так до бесконечности будет ходить. По умолчанию стоит false. Я говорил про дополнительный скрипт. Это array_ways.script он нужен что бы из точек создать путь и еще пару полезных вещей.Вот так он выглядит: -- Массивы с левел вертаксами для путей. Graff46. -- от сюда local test = { {72776, 20, "eat_vodka"}, {42603, 10, "hands_up"}, {29109, 15, "eat_vodka"} } -- до сюда, добавляем свои массивы путей по вертексам local tbl = { -- сюда добавляем [имя = ваш массив] my_test = test } ------------------------------ function main (a) return tbl[a] end У нас тут таблица и два вложенных массива. Карта вложений: (таблица tbl) содержит (массив test) содержит (3 безымянных массива) в которых по( 3 элемента). Добавляем свой путь:Пляшем от таблицы tbl, создаем в ней запись ключ-значение, где ключ - это имя будущего пути (в примере это my_test), а значение - массив (или ссылка на него, как в примере), назовём его "массив точек" (в примере это test). А в "массиве точек" создаем, как в примере (не выносим! не делаем ссылок и тд.) безымянный массивы, массивов этих должно быть столько - столько у Вас точек в пути. А теперь тут внимание, заполняем эти безымянные массивы: первый элемент - это левел вертекс (число). Первый элемент обязательный, остальные нет. Второй элемент - это время в секундах, на которое NPC будет останавливаться, попадая в эту точку и проигрывать анимацию (по умолч. wait (стоит) ). Третий элемент - это имя анимации которую будет проигрывать NPC простаивая под таймером в этой точке. Если Вы не зададите таймер, то NPC будет просто ходить от точки к точке без остановок. [smart_terrains] none = true [logic] active = beggar [beggar] name_way = my_test loop = false extns = 5 anim = hands_up target = nil P.S. Если NPC неистово тупит в точках - увеличите\создайте число в поле extns ~ 3 - 5 СсылкаПриму любую помощь от опытных скриптеров. В данный момент работаю над полностью скриптовыми подобиями смарт_террейнов.Прошу в шапку данное. Изменено 13 Июля 2016 пользователем Graff46 1 2 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 2 Августа 2016 (изменено) В чем преимущество по сравнению с оригинальными методами? Смарт террайн в Сталкере это объект наследованный от зон, как рестриктор и смарт это спавн объект который нужно спавнить через ACDC или СДК, и кроме смарта есть понятие как гулаг, гулаг это заселение, вообще долго объяснять, но эти конструкции достаточно сложны. Скриптовый смарт это вообще не объект игрового мира, это некий код который организует логику неписей исходя из условий, он объединил в себе ф-ции смарт-террейнов и гулагов при этом упростив собственный код. Смарты и гулаги решают некую задачу в игре, скриптовый смарт также решает эту задачу гораздо проще и без ограничений на позицию НПС. Это прошу в шапку (в конец, самый низ) Изменено 2 Августа 2016 пользователем Graff46 2 1 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 3 Августа 2016 что можно парсить значения из конфига или написать в каком либо скрипте аналог вэйпоинта и уже использовать его в схемах?Про чтение из конфигов, я такое увидел в первый раз в работе по улучшению логики вертолетов, и то после своей работы. Запись данных прямо в секции - вот какую цель я ставил для себя, а в схеме беггар, создаются пути для движения НП из таблицы с левел вертаксами. Если кому то нравится возиться с файлами, Notepad++ и справочник по ф-ям и классам класс ini_file, и пишите код, тем более сделать передачу данных из одного места в другое возможностями Lua не сложно, но нужно ли... но разве отменили скриптовый спавн с правкой\заполнением нет-пакета Работайте с нэт-пакетами, мне удобней было, что бы дешево и сердито эффективно. Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 4 Августа 2016 А планируется какая-нибудь утилита для автоматического пересчета вертексов при изменении аи-сетки?Нет не планируется, если Вы меняете АИ сетку, то наверно имеете возможность расставить вэй-поинты без труда. Насколько я понял, это типа костыля для ленивых. В шапке написано по этому поводу. Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 29 Ноября 2016 Новая ссылка. Прошу в шапку. @Kirgudu, Просто новая правленная версия логики, скриптовые смарты в другой теме. Кстати информацию о скриптовых смартах из шапки можно убрать. Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 19 Августа 2017 Репозиторий со скриптами http://mytest.royal-webhost.tk/main.html#urlrepo=d/542lmtpa3M9rGd Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 21 Октября 2017 Ссылка на репозиторий моей СКВ (может глючить) 1 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 18 Декабря 2017 (изменено) Доработы схемы логики: Для схемы stander добавлены новые ф-ции - ключи в секциях: irst_run = true ; true\false Будет ли НПС бысро бежать к точке работы при 1-й загрузке схемы. По умолчанию - true Для схемы beggar добавлены новые ф-ции - ключи в секциях: first_run = false ; true\false Будет ли НПС бысро бежать к точке работы при 1-й загрузке схемы. По умолчанию - false. Включать рекомендую для патрульных неспеша ходящих по лагерю. near_lv = true ; true\false Будет ли НПС идти не в 1-ю точку пути, а в ближайшую точку пути от места где находится НПС (При 1-ой загрузке схемы). По умолчанию true. Ссылка в шапке и тут. Изменено 18 Декабря 2017 пользователем Graff46 2 1 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 23 Февраля 2018 Доработан портал "СиКВер", функционирует на вполне приемлемом уровне. Репозиторий скриптовых смартов и скриптовых схем логики разбит на два репозитория (в старом репозитории размещены ссылки на новые репозитории). В новой версии скриптовых схем логики исправлены ряд ошибок и проведена оптимизация кода... Несмотря на исправления проекту требуется помощь опытных программистов. Ссылка на репозиторий. Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 22 Марта 2018 (изменено) Исправлен\доработан скрипт схемы "Спутник". + Версии открыты, можно корректно скачивать... Ссылка Изменено 22 Марта 2018 пользователем Graff46 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 25 Марта 2018 Написана ф-ция позволяющая спавнить НПС в указанных точках путей (для равномерного распределения НПС на пути, что бы не толпились одной кучей в 1 точке) + доработана схема "Спутник". В ближайшее время ожидайте новую версию репозитория. Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 2 Апреля 2018 (изменено) Спавн НПС на пути. При задании путей для схемы beggar, НПС часто неравномерно распределяются на пути (толпой ходят от точки к точки и тд.)... Спавн на пути позволяет спавнить НПС(ов) в каждой точке пути отдельно. Для спавна на пути нужно написать таблицу распределения - где ключи таблицы это порядковый номер точки в пути, а значение это секция НПС, или таблица, где 1-й элемент это секция НПС, а второе значение - число: кол-во НПС которое заспавниться в данной точке. * Нельзя делать индексы в таблице распределения превышающие длину таблицы пути (Если у вас в пути 5 точек, то индексы в таблице распределения <= 5)! Таблицу распределения можно составить и передать в ф-цию в качестве аргумента или сделать её 7-ым элементом в таблице точки пути. ( {1090062, 0, "wait", nil, 3198, {run='sprint', anim_sprint='sprint'}, {'esc_novice'}} ) Ф-ция спавна на пути: array_ways.spawn_on_path(path, levelName, rtable) --// path это имя пути (имя таблицы) --// levelName - Системное имя локации (указать если не заполнен 5 элемент хоть у одной таблицы точек пути) --// rtable - Таблица распределения (указать если не заполнен 7 элемент хоть у одной таблицы точек пути) Ссылка на новую версию репозитория Изменено 2 Апреля 2018 пользователем Graff46 1 Поделиться этим сообщением Ссылка на сообщение
Graff46 598 Опубликовано 4 Ноября 2018 СКВ упала. Вот прямая ссылка *В шапку бы... Поделиться этим сообщением Ссылка на сообщение