Гражданский ИИ |
Здравствуйте, гость ( Вход | Регистрация )
Гражданский ИИ |
Oct 5 2012, 22:17
Сообщение
#26
|
|
Тролль Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь |
Я крыс научил находить и подбирать на локации в пределах «видимости» брошенное мясо/приготовленное мясо/оккупировать трупы.
Можно через GetWeight() посчитать вес инвенторя и сравнивать с вычисляемым текущим грузоподъемом НПС от мода силы. P.S.: Только тут можно переборщить и будет куча ненужных багов и несуразностей (типа как в Аркануме открыть запертую дверь? – выложить перед ней монетку: НПС увидит ее и подойдет чтоб взять, открыв перед собой запертую дверь). Сообщение отредактировал Flaristan - Oct 5 2012, 22:21 |
Oct 6 2012, 00:07
Сообщение
#27
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Всё, вставил проверку на силу. Правда теперь после выбрасывания от перегруза тяжелого айтема пнс начинает идти по делам, потом вдруг замечает выброшенный (им же) айтем и с радостным криком "Ой, что я нашел!" бежит к нему. Подбирает его, перегружается, выбрасывает, и всё заново.
Пришлось после выбрасывания вешать на айтем локаль с результатом проверки на вес. Получается, после первого перегруза нпс заранее знают что сколько вокруг весит. Но в целом выглядит нормально, собиратели пустых бутылок занимаются бутылками, а на фулплейты не смотрят. Сообщение отредактировал Anakondar - Oct 6 2012, 00:08 |
Oct 6 2012, 00:56
Сообщение
#28
|
|
Level 19 Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов |
Забавно. Клёвый алгоритм сложности O(n^2) вызывает стопроцентный тми, хотя выполняется за полсекунды (IMG:style_emoticons/kolobok_light/smile.gif) Элементов немного (пока 60, по-хорошему надо 200+), но в скрипте парочка O(n) и один O(n^2) - вылетает на 20й итерации внешнего цикла последнего (IMG:style_emoticons/kolobok_light/smile.gif) Расчёты действительно немаленькие (расстояния, массивы через строковые операции, возведение в степень), но выглядит смешно даже для 2002го.
Завтра перепишу под sql, выкину часть алгоритмов наружу, на трёх O(n) надеюсь заработает и при 200 элементах. |
Oct 6 2012, 01:08
Сообщение
#29
|
|
Level 8 Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг |
Коль пошла такая пьянка, похвастаюсь и я идеями!
-НПС если находится рядом с плесаблами допускающими собирательство (куст Фенберри, грибы и т.д.) подходит к ним, ставит корзинку и собирает грибки! -Если на пути НПС встречается какой-то из уличных светильников - он подходит и зажигает или тушит свет в них соответственно ночью и днем. -Стражник, если рядом с ним "вскрывают" общественный контейнер начинает пристально наблюдать за вскрывающим (как в Леворе вообщемто) -Если нпс бард - то он иногда может играть музыку, другие персонажи пока поисходит эта игра, проходя мимо могут остановится, сесть и послушать баладу. -Если рядом с персонажем есть стул и официантка - то он может сесть и заказать какую-то еду, при этом официантка тоже участвует в этой анимации. хотя конечно это все частные веселушки восновном. Забавно. Клёвый алгоритм сложности O(n^2) вызывает стопроцентный тми, хотя выполняется за полсекунды (IMG:style_emoticons/kolobok_light/smile.gif) Элементов немного (пока 60, по-хорошему надо 200+), но в скрипте парочка O(n) и один O(n^2) - вылетает на 20й итерации внешнего цикла последнего (IMG:style_emoticons/kolobok_light/smile.gif) Расчёты действительно немаленькие (расстояния, массивы через строковые операции, возведение в степень), но выглядит смешно даже для 2002го. Завтра перепишу под sql, выкину часть алгоритмов наружу, на трёх O(n) надеюсь заработает и при 200 элементах. в НВНХ еще нету конструкции подобной "Eval" или "Execute"? Расскажи как имено ты используешь SQL? |
Oct 6 2012, 02:08
Сообщение
#30
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Следующая итерация - заставляю воров нормально воровать, как у ПС так и у НПС. Хотя алгоритм прописал, пока воруют очень неохотно.
|
Oct 6 2012, 07:53
Сообщение
#31
|
|
Level 19 Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов |
Цитата в НВНХ еще нету конструкции подобной "Eval" или "Execute"? Нет. Зато есть плагин, увеличивающий лимит инструкций на скрипт или убирающий ограничение вовсе. На волте даже рекомендуют в 2-4 раза лимит поднимать (дефолт ~130к). Но не очень хочется его привлекать, т.к. сервер однопоточный до мозга костей и подобные скрипты будут его тупо тормозить. Если играл на старых серверах, то мб помнишь, как одновременный сейв 30+ чаров на винт вызывал лаги на пару секунд (IMG:style_emoticons/kolobok_light/smile.gif) Раз уж так выходит, что в кап не влезаю, постараюсь скрипты упростить. Иначе в будущем может быть лагодром. Цитата Расскажи как имено ты используешь SQL? В данном случае немалую нагрузку вызывают 2 вещи - массивы и поиск внутри них во вложенном цикле. Массивов в нвн нет, приходится делать через строку и извлечение/замену подстрок (IMG:style_emoticons/kolobok_light/smile.gif) Я хочу попробовать выкинуть массивы наружу (они и нужны только на расчёт пути, раз в полгода то есть) и заодно организовать поиск минимума внутри за счёт субд.Если и это окажется слишком накладно (к примеру, по какой-то причине субд от нвн не сможет принимать десятки запросов в секунду, что для неё вроде как бы мелочь), придётся думать над отдельным плагином для нвнх, уж на с++ эти расчёты можно сделать как два пальца. |
Oct 6 2012, 10:05
Сообщение
#32
|
|
Тролль Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь |
Пришлось после выбрасывания вешать на айтем локаль с результатом проверки на вес. Получается, после первого перегруза нпс заранее знают что сколько вокруг весит. Но в целом выглядит нормально, собиратели пустых бутылок занимаются бутылками, а на фулплейты не смотрят. Перемудрил – зачем локалки вешать? Просто надо было добавить проверку вещи перед подъемом на массу: если масса содержимого инвентаря + масса обнаруженной на полу близлежащей вещи > максимальной переносимой массы == вещь не трогать, проверять n+1 ближайшую вещь, если она существует; иначе подобрать.Только тогда проще сделать проверки на «нужность» вещей: если вещь на полу лучше того что одето на НПС – подобрать и надеть; если ее можно использовать (бутылки, свитки, палочки и т.д.) – подобрать и использовать в дальнейшем; если соотношение массы вещи и ее цены выгодное и НПС не перегружен – подобрать и сохранить; если вещь дешевая или НПС уже перегружен – подобрать и отнести выкинуть в ближайшую урну/продать торговцу и т.п.. Только все это ненужный перегруз модуля скриптами – если прям так уж хочется собирать с полу вещи, можно создать специальных неписей-сталкеров которые скажем в какую-то часть дня бродят по городу и подбирают всякий хлам, отправляя его сразу в свой магазин, который открывают для игрока осев на своей торговой точке другую часть дня. Или что-то вроде. |
Oct 6 2012, 11:05
Сообщение
#33
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Перемудрил – зачем локалки вешать? Просто надо было добавить проверку вещи перед подъемом на массу: если масса содержимого инвентаря + масса обнаруженной на полу близлежащей вещи > максимальной переносимой массы == вещь не трогать, проверять n+1 ближайшую вещь, если она существует; иначе подобрать. Только тогда проще сделать проверки на «нужность» вещей: если вещь на полу лучше того что одето на НПС – подобрать и надеть; если ее можно использовать (бутылки, свитки, палочки и т.д.) – подобрать и использовать в дальнейшем; если соотношение массы вещи и ее цены выгодное и НПС не перегружен – подобрать и сохранить; если вещь дешевая или НПС уже перегружен – подобрать и отнести выкинуть в ближайшую урну/продать торговцу и т.п.. Только все это ненужный перегруз модуля скриптами – если прям так уж хочется собирать с полу вещи, можно создать специальных неписей-сталкеров которые скажем в какую-то часть дня бродят по городу и подбирают всякий хлам, отправляя его сразу в свой магазин, который открывают для игрока осев на своей торговой точке другую часть дня. Или что-то вроде. Смысл локалок в том, что НПС не знают изначально массу вещи, поэтому подходят и смотрят каждую и либо подбирают, либо вешают локалку. Учти ещё, что у них не бывает перегруза и GetWeight на них всегда возвращает 0. А про магазин - это хорошая идея. И да, воровство всё-таки работает. Просто у меня был детект маленький и я пероятность захотеть воровать поставил пропорционально скилу. На ночь оставил перса в городе. Утром - инвентарь пустой, даже денег нет. Проверил под ДМом - всё у воров. |
Oct 6 2012, 14:38
Сообщение
#34
|
|
Level 8 Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг |
Нет. Зато есть плагин, увеличивающий лимит инструкций на скрипт или убирающий ограничение вовсе. На волте даже рекомендуют в 2-4 раза лимит поднимать (дефолт ~130к). Но не очень хочется его привлекать, т.к. сервер однопоточный до мозга костей и подобные скрипты будут его тупо тормозить. Если играл на старых серверах, то мб помнишь, как одновременный сейв 30+ чаров на винт вызывал лаги на пару секунд (IMG:style_emoticons/kolobok_light/smile.gif) Раз уж так выходит, что в кап не влезаю, постараюсь скрипты упростить. Иначе в будущем может быть лагодром. В данном случае немалую нагрузку вызывают 2 вещи - массивы и поиск внутри них во вложенном цикле. Массивов в нвн нет, приходится делать через строку и извлечение/замену подстрок (IMG:style_emoticons/kolobok_light/smile.gif) Я хочу попробовать выкинуть массивы наружу (они и нужны только на расчёт пути, раз в полгода то есть) и заодно организовать поиск минимума внутри за счёт субд. Если и это окажется слишком накладно (к примеру, по какой-то причине субд от нвн не сможет принимать десятки запросов в секунду, что для неё вроде как бы мелочь), придётся думать над отдельным плагином для нвнх, уж на с++ эти расчёты можно сделать как два пальца. Да я чето тоже сомневаюсь что мускул будет выдавать операции над кучей данных быстро..хотя конечно строкомасивы - тоже не выход.. З.Ы. не подскажешь как этот плагин по лимиту инструкций называется? .. тоже как-то столкнулся с нехваткой когда приходилось анализировать 500 заклинаний и выбирать из них списки по критериям(IMG:style_emoticons/kolobok_light/sad.gif) , думаю для этой задачи можно было чтонибуть улучшить (IMG:style_emoticons/kolobok_light/smile.gif) . Сообщение отредактировал PaiNt - Oct 6 2012, 14:42 |
Oct 6 2012, 15:43
Сообщение
#35
|
|
Level 11 Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North |
NWNX System
|
Oct 6 2012, 17:13
Сообщение
#36
|
|
Level 19 Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов |
А я просто поискал по "tmi" на волте и взял первое попавшееся среди свежего (IMG:style_emoticons/kolobok_light/smile.gif) Там в названии тми есть.
Цитата Да я чето тоже сомневаюсь что мускул будет выдавать операции над кучей данных быстро.. Это как бы его профиль (IMG:style_emoticons/kolobok_light/smile.gif)
|
Oct 6 2012, 20:04
Сообщение
#37
|
|
Level 11 Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов |
Цитата Забавно. Клёвый алгоритм сложности O(n^2) вызывает стопроцентный тми, хотя выполняется за полсекунды Элементов немного (пока 60, по-хорошему надо 200+), но в скрипте парочка O(n) и один O(n^2) - вылетает на 20й итерации внешнего цикла последнего Расчёты действительно немаленькие (расстояния, массивы через строковые операции, возведение в степень), но выглядит смешно даже для 2002го. Завтра перепишу под sql, выкину часть алгоритмов наружу, на трёх O(n) надеюсь заработает и при 200 элементах. Это ты что такое там считаешь? - баллистическую траекторию 50 НПС в стратосфере? (IMG:style_emoticons/kolobok_light/smile.gif) Сообщение отредактировал Melisse - Oct 6 2012, 20:04 |
Oct 6 2012, 21:08
Сообщение
#38
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Как с контейнерами быть? НПС замечают их, подходят, осматривают и открывают. Действие ActionTakeItem не выполняют. Пришлось на контейнеры на OnOpen вешать скрипт на проверку
Код object oUser = GetLastOpenedBy();
if (GetIsObjectValid(oUser) &&!GetIsPC(oUser) &&!GetIsPossessedFamiliar(oUser) &&!GetIsDM(oUser) &&!GetIsDMPossessed(oUser)) {копировать айтемы себе в инвентарь; удалить старые;} |
Oct 6 2012, 23:02
Сообщение
#39
|
|
Level 19 Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов |
Melisse:
Алгоритм Дейкстры для поиска кратчайшего пути по дереву вейпоинтов. При реализации на простых линейных массивах там именно два больших вложенных цикла. Это можно оптимизировать, но нужные структуры данных в нвн просто не сделать (двоичные кучи, фибоначчиевы кучи и т.п.). Не желая рубить с плеча, я перекинул все "массивы" в мускл (заменив 4 массива одной таблицей) и переложил на него же функцию поиска минимального значения по заданным условиям. Результат - никаких тми, скрипт выполняется за 150мс. Для единичного запуска (для каждого нпс раз в несколько игровых часов) это немного. Потестирую эту систему на бОльшем количестве точек и мб перепишу на нвнх без мускла, будет ещё быстрее. Сейчас у меня 2 внешних локации и 1 внутренняя, 63 вейпоинта с 1-6 связями. В городе обычно 2-3 связи, в таверне - паутина из точек (IMG:style_emoticons/kolobok_light/smile.gif) Зачем это нужно? Представь город из 10+ локаций. Берём непися, ставим где угодно и указываем идти куда угодно, хоть через 10 локаций. И он пойдёт (IMG:style_emoticons/kolobok_light/smile.gif) Причём не лбом в стену, а по дорогам, как все нормальные люди. Причём по кратчайшему пути. Нужны лишь вейпоинты, олицетворяющие сеть дорог, и скрипт. Anakondar: Давай всю техническую фигню унесём в соответствующие топики? (IMG:style_emoticons/kolobok_light/smile.gif) |
Oct 6 2012, 23:12
Сообщение
#40
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
denis0k: Главное, чтоб ответ появился, а где - не важно.
|
Oct 6 2012, 23:48
Сообщение
#41
|
|
Level 11 Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов |
Цитата Не желая рубить с плеча, я перекинул все "массивы" в мускл (заменив 4 массива одной таблицей) и переложил на него же функцию поиска минимального значения по заданным условиям. Результат - никаких тми, скрипт выполняется за 150мс. Для единичного запуска (для каждого нпс раз в несколько игровых часов) это немного. MySQL и такое умеет? Я не совсем понимаю... эти страшные названия алгоритмов и куч, ибо у мня образование другой направленности, но мне интересно. (IMG:style_emoticons/kolobok_light/smile.gif) Тебе мускл сразу возвращает все необходимые данные одним запросом, сам поискав - и так для каждого НПС, но запуск всех спавнов при старте модуля = одновременный запрос n-го числа НПС, он справляется? Сообщение отредактировал Melisse - Oct 6 2012, 23:49 |
Oct 7 2012, 01:46
Сообщение
#42
|
|
Level 8 Класс: Псионик Характер: Chaotic Neutral Раса: Хафлинг |
MySQL и такое умеет? Я не совсем понимаю... эти страшные названия алгоритмов и куч, ибо у мня образование другой направленности, но мне интересно. (IMG:style_emoticons/kolobok_light/smile.gif) Тебе мускл сразу возвращает все необходимые данные одним запросом, сам поискав - и так для каждого НПС, но запуск всех спавнов при старте модуля = одновременный запрос n-го числа НПС, он справляется? там наверное такое извращение многоэтажное получается в запросе (IMG:style_emoticons/kolobok_light/smile.gif) . еще поди фильтровать запросы для безопасности. Почему бы стразу не писать плагин, он же всяко будет быстрее работать, мне кажется, чем связка НВН-НВНХ-MySQL-сервер :? Сообщение отредактировал PaiNt - Oct 7 2012, 01:47 |
Oct 7 2012, 03:02
Сообщение
#43
|
|
Level 17 Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX |
Плагин писать сложнее и дольше.
|
Oct 7 2012, 06:38
Сообщение
#44
|
|
Level 19 Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов |
Цитата Тебе мускл сразу возвращает все необходимые данные одним запросом, сам поискав При расчёте минимума по заданному условию - да. Обычный селект может на лету сортировать результат, причём делает это явно оптимально. В отличие от массива через строку, где приходится проверить все элементы. Цитата и так для каждого НПС, но запуск всех спавнов при старте модуля = одновременный запрос n-го числа НПС Вряд ли одновременный, он последовательный (IMG:style_emoticons/kolobok_light/smile.gif) Тем более какая разница, что там раз в 10 часов модуль грузит, они же не в реальном времени в бою это делают.Цитата он справляется Ну справляется же контакт, когда миллион задротов жмёт лайки (IMG:style_emoticons/kolobok_light/smile.gif) Субд очень шустрые, мои 100 запросов в цикле - фигня полная.Цитата Почему бы стразу не писать плагин, он же всяко будет быстрее работать, мне кажется, чем связка НВН-НВНХ-MySQL-сервер :? Во-первых, скачать студию на новый комп - уже дольше, чем переписать под sql (IMG:style_emoticons/kolobok_light/smile.gif) Во-вторых, оптимизационные моменты решаются потом. На старте важно вообще что-то сделать и быстро. Без фанатизма конечно, пути для оптимизации быть должны, но делать её на этапе проектирования - напрасный труд.Идеального нет ничего, можно один этот поиск пути переписывать год. Но это неинтересно (суть-то системы в другом) и бессмысленное - ускорение даже втрое относительно текущего значения ничего не даст (IMG:style_emoticons/kolobok_light/smile.gif) Это происходит реально редко - пусть считается лишь раз, но даже если нпс будет непрерывно ходить туда-сюда по модулю, всё равно время его ходьбы многократно больше времени расчёта. Сообщение отредактировал denis0k - Oct 7 2012, 06:49 |
Oct 7 2012, 09:18
Сообщение
#45
|
|
Level 11 Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов |
А как решается проблема хербита в локация, где нет игрока - он там либо отрубается,либо запускается с большими задержками. Помнится, нпс заходят в дом и все - пока туда не пришел игрок, он не выйдет.
|
Oct 7 2012, 11:13
Сообщение
#46
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Вряд ли одновременный, он последовательный (IMG:style_emoticons/kolobok_light/smile.gif) Ага, следующий не запускается, пока не выполнится предыдущий. Благодаря этому можно устроить нумерацию мобов: модульную локалку-счётчик, инкрементирующуюся при каждом спауне и кричерскую локалку-номер с текущим значением счётчика. Гарантировано все номера будут разные. |
Oct 7 2012, 17:59
Сообщение
#47
|
|
Тролль Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь |
Смысл локалок в том, что НПС не знают изначально массу вещи, поэтому подходят и смотрят каждую и либо подбирают, либо вешают локалку. «Гет вейт» не работает на криттеров как определялка массы всего их инвентаря – он как раз нужен в тех случаях, когда требуется узнать массу вещи.Учти ещё, что у них не бывает перегруза и GetWeight на них всегда возвращает 0. Как с контейнерами быть? НПС замечают их, подходят, осматривают и открывают. Действие ActionTakeItem не выполняют. Пришлось на контейнеры на OnOpen вешать скрипт на проверку Действие «ActionTakeItem» по умолчанию изымает, а не переносит вещь – чтоб описать его в виде транзакции, его нужно использовать через оператор «AssignCommand» для осуществителя транзакции; при этом если осуществитель транзакции не способен взаимодействовать с вещами, использовать вместо него действие «ActionGiveItem» привзянное на объект транзакции с получателем на осуществителе транзакции (конечно при условии что объект транзакции в этом случае может взаимодействовать с вещами):AssignCommand(oTarget, ActionTakeItem(oItem, oObject)); AssignCommand(oObject, ActionGiveItem(oItem, oTarget)). P.S.: Кстати у НПС есть 2 слоя инвенторя: обычный (доступный всем) и служебный (доступный только НПС) – я это не отслеживал, но вполне может так случиться что вещь по умолчанию попадает в служебный и далее существует в игре только для НПС. Однако при транзакции вещей (НПС взял вещь – НПС отдал вещь) это не имеет значения. А как решается проблема хербита в локация, где нет игрока - он там либо отрубается,либо запускается с большими задержками. Помнится, нпс заходят в дом и все - пока туда не пришел игрок, он не выйдет. Просто поставить условие по времени или событийный триггер которые выгоняет НПС из дома. У меня стоят в АИ криттеров аналогичные системы на хеартбите – вроде они работают даже в «свернутом» режиме без игроков в модуле, и криттеры оказываются при появлении игрока там, где им прописано.
Сообщение отредактировал Flaristan - Oct 7 2012, 18:06 |
Oct 7 2012, 21:55
Сообщение
#48
|
|
Level 19 Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов |
Цитата А как решается проблема хербита в локация, где нет игрока Просто - он не используется.
|
Oct 7 2012, 22:27
Сообщение
#49
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Как определить отсутствие игрока в локации?
|
Oct 7 2012, 22:48
Сообщение
#50
|
|
Тролль Класс: Пьяный Мастер Характер: Chaotic Neutral Раса: Тварь |
Берем дверь, ставим на триггер OnOpen:
Код void main(script1) { object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1, -1, -1, -1, -1); object oArea = GetArea(OBJECT_SELF); if ((GetIsObjectValid(oPC))&&(GetArea(oPC) == oArea)) { if (GetIsOpen(OBJECT_SELF)) { DelayCommand(300.0, SetLocked(OBJECT_SELF, FALSE)); } else { return; } } else { ActionCloseDoor(OBJECT_SELF); } } и на OnUnLock: Код void main() { ExecuteScript("script1", OBJECT_SELF); } …в результате получаем дверь, которая будучи однажды открыта кем-либо раз в 5 минут проверяет свое состояние, и в случае если она открыта и игрока нет поблизости – затворяет (при необходимости и запирает) себя и прекращает проверки. Система из моего модуля «антиполтергейст» - всегда раздражали самозакрывающиеся двери на шардах… |
Текстовая версия | Сейчас: 1st November 2024 - 03:08 |