Gem of the North


  -ОтветитьНовая темаГолосование-

> АИ - искусственный интелект
Sairilias
Отправлено: Dec 19 2006, 03:29 AM
|Цитировать


Group Icon



в общем так: есть скрипт спавна (смотрю дефолтовый, в Джаспер еще не глядел). заглянув туда мы видим что WalkWayPoint отдается мобу сразу же после выставления всех флажков поведения. сама по себе эта функция содержит в себе кучу блоков на поиск поинтов, анализ ближайшего, вычисление следующего (вычисление суффикса), следование к поинту и может чего еще по мелочи. если вникнуть в суть этих блоков (пробовали набросать то что они делают?), то выходит что не так уж и мало для простого оператора берет на себя эта функция.. проверка то поинтов идет не в локации моба, а по всем поинтам модуля.. далее, залезая в скрипт слота на обнаружение видит что при обнаружении / потере ПС моб повторно получает команду на валк. кстати если мобов много, то переотдача команды снова заметна на мобе - он дергается чутка, ну или не чутка, тут уже от системы зависит. в общем вывод - нет ПС в регионе.. на фик он нужен этот валк. в хербите вообще ужасная весчь висит.. если флаг на постоянную анимацию поставлен, переотдача валка будет идти каждые 6 сек.. бррр.. как отключить его? дело в том, что раз получив команду, моб будет выполнять ее постоянно, даже если игрок покинет локу, поэтому вешать на весь хербит и перкептион проверку наличия игрока не выход, блоки валка все равно будут выполнятся.

есть у кого соображения и известные способы устранения этой досадности?


--------------------
"Neverwinter Nights - A world without limits" © Rico

- Мам, а почему король нам всегда консервы присылает? Корову же дешевле!
- Много ты понимаешь в политике, - проворчала Дракониха, выковыривая печеного рыцаря из металлического панциря. © Fael
| PM|
Вверх Вниз
Sairilias
Отправлено: Dec 19 2006, 04:41 AM
|Цитировать


Group Icon



пока нашел только такой выход:
валк в спавне отрубаем (или любое другое раздражающее нас действие).
в перкептионе оставляем (касается валка, но по идее аналогию можно сделать с любым событием).
в хербите делаем такое:
CODE
void main()
{

if (GetLocalString(GetFirstPC(), "REGION")!="RMN")
{// нет
   if (GetLocalInt(OBJECT_SELF, "X")==0)
   return;
   {
   AssignCommand(OBJECT_SELF, ClearAllActions());
   SetLocalInt(OBJECT_SELF, "X", 0);
   }
}
{// да
   if (GetLocalInt(OBJECT_SELF, "X")==0)
   {
   WalkWayPoints();
   SetLocalInt(OBJECT_SELF, "X", 1);
   }
   {}
.....
дальше идет все то что мы хотим в сделать (тело скрипта)
.....
}
}


в итоге получаем что далеко не у всех существ хербит выполняется.
побочный эффект: надо писать отдельный скрипт на хербит для обитателей регионов "REGION", на входе в локации этого региона либо вешать переменную на игрока (что годится для сингла), а для шарда надо при входе игрока в любую локацию региона, вешать на какой нить объект (скажем вейпоинт эту переменную, и считывать ее с этого вейпоинта, также надо обнулять ее если все игроки вышли из локаций региона или на хербите локации оставлять проверку на наличие игроков), добавочный минус - тупить мобы будут первые 6 сек, если игроки все выйдут из игры и зайдут снова, но это время должно компенсироваться коннектом игрока.


--------------------
"Neverwinter Nights - A world without limits" © Rico

- Мам, а почему король нам всегда консервы присылает? Корову же дешевле!
- Много ты понимаешь в политике, - проворчала Дракониха, выковыривая печеного рыцаря из металлического панциря. © Fael
| PM|
Вверх Вниз
Aiwan
Отправлено: Dec 19 2006, 05:38 AM
|Цитировать


*



Вообще, вроде функция WalkWayPoint пашет тока на ближайшие от моба вейпы. Если не стоит на модуле локалка X2_SWITCH_CROSSAREA_WALKWAYPOINTS == TRUE; - (на Modules) тоды ходят по вейпам из локации в локацию. А тут уже выбирать автору, что ему надо.

CODE

void LookUpWalkWayPoints()
{
   // check if the module enables area transitions for walkwaypoints
   int bCrossAreas = (GetLocalInt(GetModule(),"X2_SWITCH_CROSSAREA_WALKWAYPOINTS") == TRUE);

   SetLocalInt(OBJECT_SELF, "WP_CUR", -1);

   string sTag = "WP_" + GetTag(OBJECT_SELF) + "_";

   int nNth=1;
   object oWay;

   if (!bCrossAreas)
   {
       oWay = GetNearestObjectByTag(sTag + GetWaypointSuffix(nNth));
   }
   else
   {
      oWay = GetObjectByTag(sTag + GetWaypointSuffix(nNth));
   }
   if (!GetIsObjectValid(oWay)) {
       if (!bCrossAreas)
       {
           oWay = GetNearestObjectByTag("POST_" + GetTag(OBJECT_SELF));
       }
       else
       {
           oWay = GetObjectByTag("POST_" + GetTag(OBJECT_SELF));
       }
       if (GetIsObjectValid(oWay)) {
           // no waypoints but a post
           SetLocalInt(OBJECT_SELF, "WP_NUM", 1);
           SetLocalObject(OBJECT_SELF, "WP_1", oWay);
       } else {
           // no waypoints or post
           SetLocalInt(OBJECT_SELF, "WP_NUM", -1);
       }
   } else {
       // look up and store all the waypoints
       while (GetIsObjectValid(oWay)) {
           SetLocalObject(OBJECT_SELF, "WP_" + IntToString(nNth), oWay);
           nNth++;
           if (!bCrossAreas)
           {
               oWay = GetNearestObjectByTag(sTag + GetWaypointSuffix(nNth));
           }
           else
           {
               oWay = GetObjectByTag(sTag + GetWaypointSuffix(nNth));
           }
       }
       nNth--;
       SetLocalInt(OBJECT_SELF, "WP_NUM", nNth);
   }


Это сообщение отредактировал Aiwan - Dec 19 2006, 05:41 AM
| PM| Email Poster|
Вверх Вниз
Sairilias
Отправлено: Dec 19 2006, 06:49 PM
|Цитировать


Group Icon



естественно эта локалка дается модулю по входу в него, сразу же, иначе НПС не будут просто выходить из своих домов на улицу и заходить в них.

испытания прошли успешно, хербит рубит все действия у мобов если условие проверки игрока не выполняется. главное его правильно задать. можно сверять местонахождение игрока с известным значением и при переходах из области в область записывать это значение на игрока, тогда скрипт надо будет писать отдельно для всех НПС одного города, можно сделать скрипт универсальным - сверять локальную переменную игрока с локальной переменной моба, но тогда надо в тулсете каждому жителю города указывать эту переменную (прописка своеобразная), вроде муторно. но ведь жители города как правило делаются друг из друга клонированием, так что и этот метод прост. для шарда сложнее так как там как я слышал нарушение связи и вылет игрока не считается выходом из локации, поэтому ставить счетчик не выход. остается только проверять местонахождение каждого игрока и раздавать сигналы соответсвующим городам, но я думаю проверять на хербите местоположение пускай даже 40 игроков легче чем проверять все условия хербита и выполнять все его инструкции для нескольких сотен НПС. получаем, что в модуле допустим с 500 неписями, выполнять анимацию будут только несколько десятков мобов того города / местности, где находится игрок (игроки). поскольку остальная местность - не города, то и мобов по умолчанию там изначально нет, они там спавнятся при активации энкаунчера (это для шарда). значит им менять вставлять эту проверку в хербит необязательно (можно, но смысла почти нет - умрет либо игрок, либо моб, остальные варианты редки).
для сингла единичные мобы в дикой местности сильно не съедят ресурсов своей анимацией, хотя при желании можно и им отключать хербит

Это сообщение отредактировал Sairilias - Dec 19 2006, 07:08 PM


--------------------
"Neverwinter Nights - A world without limits" © Rico

- Мам, а почему король нам всегда консервы присылает? Корову же дешевле!
- Много ты понимаешь в политике, - проворчала Дракониха, выковыривая печеного рыцаря из металлического панциря. © Fael
| PM|
Вверх Вниз
dumbo
Отправлено: Dec 19 2006, 11:04 PM
|Цитировать


*



хм. может я недопонял чего-то...
первая строчка дефолтных хб и перс:
CODE
if (GetAILevel() == AI_LEVEL_VERY_LOW) return;


т.е. когда в локе никого из игроков нет, до "гуляния" дело и не дойдет.
| PM| Email Poster|
Вверх Вниз
Sairilias
Отправлено: Dec 20 2006, 12:32 AM
|Цитировать


Group Icon



если ставить АИ на минимум скрипт хербита выполняться дальше не будет вообще. "Х" у меня используется для проверки было ли прерывание команд и был ли запуск валка, который у меня отключен в спавне. уровень АИ тут ничем не поможет. если НПС понизить уровень АИ до минимума, гулять в локации где нет игрока он все равно будет, потому что валк ему уже будет задан и будет выполняться пока не будет прервана процедура. так что насильно прерывать анимацию все равно придется если хочется съэкономить ресурсы. а если не отключать в спавне валк, и анимацию, то все равно какой АИ будет у моба.

вот если отрубить анимацию в спавне и включать ее в хербите, то да. понижение АИ даст результат - хербит не будет выполняться, но не даст прерывания исполнения уже запущенной профедуры. а если игрок будет в городе, то в этом случае будет все время переотдача команды играть анимацию и гулять снова, что нам не надо.

Это сообщение отредактировал Sairilias - Dec 20 2006, 01:16 AM


--------------------
"Neverwinter Nights - A world without limits" © Rico

- Мам, а почему король нам всегда консервы присылает? Корову же дешевле!
- Много ты понимаешь в политике, - проворчала Дракониха, выковыривая печеного рыцаря из металлического панциря. © Fael
| PM|
Вверх Вниз
dumbo
Отправлено: Dec 20 2006, 02:51 AM
|Цитировать


*



целью является "негуляние", когда нет игроков? - тогда так:
вместо той строки, что я уже приводил, вписать такое:
CODE

if (GetAILevel() == AI_LEVEL_VERY_LOW)
{
 ClearAllActions(TRUE); // заодно и драться не будут без "болельщиков"...;)
 return;
}

чисто теоретически. на практике могут тоже проявиться, наверное, косяки...

QUOTE (Sairilias)

если НПС понизить уровень АИ до минимума, гулять в локации где нет игрока он все равно будет

есть с этим АИ один "тонкий" момент: игра его сама переключает в зависимости от условий.

ps. так как я не уверен, что игра умеет отличать ДМа от игрока в данном случае(при переключении АИ), то лучше для проверки включить лог в файл в WalkWayPoints...
| PM| Email Poster|
Вверх Вниз
Sairilias
Отправлено: Dec 20 2006, 03:10 AM
|Цитировать


Group Icon



если привязывать хербит к уровню АИ, то все равно что-то должно фиксировать выход игрока из города и менять этот АИ мобу, поскольку присваивать каждому НПС отдельно уровень АИ муторно, то лучше сделать это в этом же хербите первой операцией, в итоге получаем что моб будет проверять есть ли игрок, менять себе уровень АИ, и уже в зависимости от уровня либо выполнять дальнейшие действия или ничего не делать, проще тогда сразу просто проверять наличие игрока и не трогать АИ, тем более если он меняется игрой при загадочных обстоятельствах.
далее, если мы будем чистить акции (мобы в городах по любому не пострадают, по идее там нет мобов враждебных друг другу фракций), но прерванные функции требуется запустить при появлении игрока, надо в другой ветке условия писать их старт (иначе старт выполнения анимации будет выполнен при обнаружении игрока - скрипт перкептион, но тогда иногда мобы будут тупить - чек на обнаружение если не прокинут). делать старт функций анимации так же как и с чисткой акций каждые 6 сек не желательно, при большом количестве жителей в городах они могут начать дергаться, поэтому проверка был ли запуск все равно нужна.
ДМа от игрока можно отличать, ДМ не является игроком, и есть спец функция: GetIsDM(object);


--------------------
"Neverwinter Nights - A world without limits" © Rico

- Мам, а почему король нам всегда консервы присылает? Корову же дешевле!
- Много ты понимаешь в политике, - проворчала Дракониха, выковыривая печеного рыцаря из металлического панциря. © Fael
| PM|
Вверх Вниз
dumbo
Отправлено: Dec 20 2006, 10:42 AM
|Цитировать


*



QUOTE (Sairilias)
тем более если он меняется игрой при загадочных обстоятельствах

никаких загадочных обстоятельств. нет игрока в локе - AI_LEVEL_VERY_LOW(0), есть игрок - AI_LEVEL_LOW(1), драка - AI_LEVEL_NORMAL(2)...

QUOTE (Sairilias)
ДМа от игрока можно отличать, ДМ не является игроком, и есть спец функция: GetIsDM(object);

QUOTE (dumbo)
я не уверен, что игра умеет отличать ДМа от игрока в данном случае(при переключении АИ)


сий длинный тред побудил меня к небольшому тесту: включил логгинг аи и walkway. результат: когда игрока нет в локе, неписи сами останавливаются в течение одного раунда. как-раз благодаря той строчке, которую я привел в первом моем посте в этом треде...

за сим разрешите откланяться... ph34r.gif
| PM| Email Poster|
Вверх Вниз
Sairilias
Отправлено: Dec 20 2006, 12:14 PM
|Цитировать


Group Icon



у меня тест был попроще и понадежнее, пара точек, сигнальный триггер. НПС беззаботно шастал по нему не желая останавливаться. оно и понятно, без чистки акций он и не должен останавливаться, пусть даже будет перманентно отупевшим. если включать чистку акций, надо на другую ветку вешать запуск валка (иначе это будет происходить при визуальном контакте с НПС), если АИ поднимется на прежний уровень, без вторичной проверки получится переототдача валка каждые 6 сек снова, чего мне не нужно. получается что для желаемого результата скрипт хербита менять все равно придется, и все таки с двумя проверками.
но я все равно не пойму как поможет проверка на АИ когда придется сделать город, он в любом случае получается на нескольких локациях. так как запуск АИ будет происходить только если НПС окажется в одной локации с игроком, и отключаться если игрок выбежал из локации. тогда НПС не смогут перемечаться между локациями. будет игрок стоять на площади допустим, а торговцы не выбегут на площадь утром, жители не выйдут из домов, пока игрок каждого не навестит в их жилищах.


--------------------
"Neverwinter Nights - A world without limits" © Rico

- Мам, а почему король нам всегда консервы присылает? Корову же дешевле!
- Много ты понимаешь в политике, - проворчала Дракониха, выковыривая печеного рыцаря из металлического панциря. © Fael
| PM|
Вверх Вниз
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы -ОтветитьНовая темаГолосование-