![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3811
|
|
Level 3 ![]() Класс: Клерик Характер: Chaotic Good Раса: Эльф ![]() |
Есть скрипт для НПС, который будетбегать за РС и говорить типа: "Великий воин, последователь Темпуса! Подойди ко мне, базар есть!" Настраивается дистанция. Напирмер, вы отбежали от НПС на 15 метров и все, он успокоился пока вас снова не увидит. И он, этот скрипт, на Perception ставится, да? Или куда-то еще, а дистанция задается произвольно, независимо Perception'а NPC? Сообщение отредактировал Lirulin - Jul 9 2008, 21:48 |
![]()
Сообщение
#3812
|
|
Level 4 ![]() ![]() Класс: Друид Характер: True Neutral Раса: Человек ![]() |
Да, наверно действительно плохо искал.
Спасибо! |
![]()
Сообщение
#3813
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
Опять о триггерах и разговорах. Мы уже когда-то спрашивали тут, что делать с тем, что при 1 хенче реплика есть, при двух - нет=( Но это-то ладно... А как быть, если надо чтобы некоторые хенчи говорили что-то, а другие - нет? Только через их тэги устанавливать, какие говорят нужную фразу, а какие нет?
|
![]()
Сообщение
#3814
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Да
|
![]()
Сообщение
#3815
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
Спасибо! А если хенчи по расе отличаются, то через racial type можно? Или все равно только тэгами?
|
![]() ![]()
Сообщение
#3816
|
|
Level 4 ![]() ![]() Класс: Друид Характер: True Neutral Раса: Человек ![]() |
Я недавно скачал СЕР 2.1 и начал разбираться с системой лошадок, практически во всем разобрался, но 1 вопрос остался, где брать радиальное меню, которое управляет этими лошадками?
|
![]()
Сообщение
#3817
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
|
![]()
Сообщение
#3818
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Очередной дурацкий вопрос из моей коллекции (IMG:style_emoticons/kolobok_light/smile.gif)
Хочу НПС OnSpawn прописать последовательность действий, которую он должен постоянно выполнять - пошел на первый вейп, сделал там что-нибудь, пошел на второй, постоял, пошел на третий, и так далее. Потом так же - обратно. Перешел к одному - действие - ко второму - действие, и т.д. Как пишется анимация, я знаю и напишу. Вопрос в другом - нужно, чтобы НПС делал это все постоянно. Насколько я знаю, скрипт OnSpawn срабатывает только один раз. Как сделать, чтобы он работал постоянно. Вариант OnHeartbeat отпадает - за 6 секунд НПС с такой последовательностью действий не управится. Кам к мне поступить? |
![]()
Сообщение
#3819
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Я бы через хербит делал, только надо воткнуть туда проверку (мы рядом с нужным вейпом? да - делаем то, что надо, идём дальше, нет - выходим).
|
![]()
Сообщение
#3820
|
|
Level 12 ![]() Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] ![]() |
можно вставить в экшен несколько экшенов, в том числе тот, который их вставляет... (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) хз как сказать нормально - чтобы объяснить рекурсию нужно сначала объяснить рекурсию... так что пример:
Neverwinter Script void DoItAgain()
{ SetCommandable(TRUE); ActionMoveToLocation(...); ActionPlayAnimation(...); // ... // и прочие непотребства ActionDoCommand(DoItAgain()); SetCommandable(FALSE); // а это чтобы наш "шатун" не отвлекался на настырного игрока } void main() { // ещё какая-то инициализация по умолчанию // ... DoItAgain(); } Сообщение отредактировал azathoth - Jul 17 2008, 16:00 |
![]()
Сообщение
#3821
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
shadowdweller, Лекса пни. Он это делает на пять с плюсом. (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#3822
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Ну вот... Из трех советов до конца поняла только последний... Дядюшка Айв, не хочу я никого пинать, я хочу сама уметь. (IMG:style_emoticons/kolobok_light/sad.gif) Разжуйте мне, плиз, как для идиота, а? Хотя, почему - "как"? (IMG:style_emoticons/kolobok_light/sad.gif)
azathoth, спасибо (IMG:style_emoticons/kolobok_light/smile.gif) А то, что ты писал - куда ставится? На OnSpawn? И что такое "еще какая-то инициализация по умолчанию"? Это то, что в дефолтном скрипте может стоять? Есть, вообще, какие-то необходимые вещи, которые туда вписываются? С остальным, вроде, понятно более-менее. |
![]()
Сообщение
#3823
|
|
Level 12 ![]() Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] ![]() |
я скрипт не тестировал даже (IMG:style_emoticons/kolobok_light/blum3.gif) предупреждаю, просто показал вариант работы экшанов. Ставится на онСпаун, действительно, в других местах он будет не к месту. "инициализация по умолчанию" - это то что обычно у неписи в онСпаун стоит (много чего там, вроде задания лисниг паттернов использующихся для работы ИИ - наверно ж важно, я такие вещи предпочитаю руками не трогать). можно просто этот скрипт запустить кроме всего прочего.
Neverwinter Script ExecuteScript("nw_c2_default9", OBJECT_SELF); а вообще я бы тоже это через онХатбит бы сделал, т.е. заставляем непись выполнять одно из действий А Б С и т.д., записываем текущее действие (локальная переменная), в следующий запуск соотвественно смотрим переменную, проверяем и дошел ли вообще нпц до вейпойнта и посылаем его выполнять следующее действие. |
![]()
Сообщение
#3824
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Придется пинать Лекса. Жестокие вы люди, господа...
|
![]()
Сообщение
#3825
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
сначала курим (правда там на примере UD скрипта, но логика у него точно такая же как и у HB в данном случае):
http://nwnmod.narod.ru/stat_anim_npc1.htm http://nwnmod.narod.ru/stat_anim_npc2.htm демо-модуль с кузнецами: http://www.wrg.ru/download.php?view.50 потом можно пнуть, только нежно. зы: делайте скидку на время написания, это было давно, некоторые конструкции или подходы уже могли устареть. |
![]()
Сообщение
#3826
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Вот модуль, в нем используется стандартные еванты. Посмотри любого НПС у него в слотах спавна и юзердеф и хертбит стоят мои скрипты. Твоя задача на парне который занимается ковром (в моем модуле он шкипер). Анимацию можешь сама изменить. В принципе, в этом модуле достаточно стандартных действий НПС что бы ты могла оживить весь модуль. Очень внимательно прочитай скрипт am_csp_common - в нем подробно распиано что будет делать НПС в том или ином случае. На НПС надо вешать локалки типа FLAG_RANGED и НПС становится атакующим рейнджером:
Neverwinter Script //================================================== ============================ // Атакующие свойства НПС - устанавливается ТОЛЬКО ОДНО ИЗ НИХ! //================================================== ============================ //-------------------------------------------------------------------------- // Старается атаковать издали, дальнобойным оружием. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_RANGED") == TRUE) {SetCombatCondition(X0_COMBAT_FLAG_RANGED);} //-------------------------------------------------------------------------- // Использует защитные фиты и паррирование //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_DEFENSIVE") == TRUE) {SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);} //-------------------------------------------------------------------------- // Будет невидимым и попытается атаковать, выйдет из невидимости и снова // будет пытаться атаковать. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_AMBUSHER") == TRUE) {SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);} //-------------------------------------------------------------------------- // При атаке убегает //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_COWARDLY") == TRUE) {SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);} Либо стандартные еванты. ЧТо бы НПС замечал игрока, и прочее, надо ему раскомментировать свойства. Например хертбит запускаем так: присваиваем на НПС локалку FLAG_HEARTBEAT == 1 в свойствах на локации. В общем смотри НПС там все расписано с комментариями.. Neverwinter Script //================================================== ============================ // Запускаем стандартные еванты на НПС //================================================== ============================ //-------------------------------------------------------------------------- // Если вы присвоите локальную переменную "FLAG_USER_DEFINED_EVENT" равную // TRUE, то все еванты присвоятся сразу. В противном случае присваивайте // По одному для каждого события. //-------------------------------------------------------------------------- int iUserDef = GetLocalInt(OBJECT_SELF, "FLAG_USER_DEFINED_EVENT"); // * Fire User Defined Event 1001 in the OnHeartbeat if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_HEARTBEAT") == TRUE) {SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);} // * Fire User Defined Event 1002 if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_PERCIEVE") == TRUE) {SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);} ![]() |
![]()
Сообщение
#3827
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Спасибо, Айв!
*Утащила мод, обернулась, не видел ли кто, и пошла ковырять* (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#3828
|
|
Level 3 ![]() Класс: Клерик Характер: Chaotic Good Раса: Эльф ![]() |
Вот помню, что об этом уже спрашивали, но не могу найти, где это было - как организовать проверку на то, наступила ли в игре определенная дата?
Нет. Ставится на юзердеф. Perception срабаатывает и дает сигнал НПС дял скрипта. Надо? Надо, надо! Полезный скрипт лишним не бывает!!! |
![]()
Сообщение
#3829
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Есть функции GetCalendarYear/Month/Day. Соотвественно, нужно проверять
Neverwinter Script if(GetCalendarYear() > <год> || (GetCalendarYear() == <год> && GetCalendarMonth() > <месяц>) || (GetCalendarYear() == <год> && GetCalendarMonth() == <месяц> && GetCalendarDay() >= <день>))
... Сообщение отредактировал Ilerien - Jul 25 2008, 11:13 |
![]()
Сообщение
#3830
|
|
Level 3 ![]() Класс: Клерик Характер: Chaotic Good Раса: Эльф ![]() |
Есть функции GetCalendarYear/Month/Day. Соотвественно, нужно проверять Neverwinter Script if(GetCalendarYear() > <год> || (GetCalendarYear() == <год> && GetCalendarMonth() > <месяц>) || (GetCalendarYear() == <год> && GetCalendarMonth() == <месяц> && GetCalendarDay() >= <день>)) ... Ну вот, а я искал, искал... (учить надо (IMG:style_emoticons/kolobok_light/unsure.gif) ). Спасибо! Пошел делать дальше! |
![]()
Сообщение
#3831
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
У меня вопрос про скрипт который вылажен на "Скрипты для новичков"
И вот в первом скрипте я уже сильно напутал (IMG:style_emoticons/kolobok_light/smile.gif) Цитата CreateItemOnObject("ResRef_cloth025", oPC, 1); Как я понел надаобыло писать так, но почемуто вешь вобше непоевляется в инвинтаре а вот если написать... Цитата CreateItemOnObject("NW_CLOTH024", oPC, 1); если писать только тег, то вещь появляется но не одевается при входе в игру... Вот скрипт попрошу показать где я намудрил (IMG:style_emoticons/kolobok_light/crazy.gif) (я даже самые элементарные скрипты незнаю потому просто вырезаю всё ненужное и надеюсь, что это будит рабтоть (IMG:style_emoticons/kolobok_light/rolleyes.gif) ) Цитата void main()
{ object oMod = GetModule(); object oPC = GetEnteringObject(); if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME")) {return;} { SetLocalInt(oMod, "START_GAME", TRUE); object oItem = GetFirstItemInInventory(oPC); while(GetIsObjectValid(oItem)) { DestroyObject(oItem); oItem = GetNextItemInInventory(oPC); } int i=0; while(i<14) { DestroyObject(GetItemInSlot(i, oPC)); // i++; } CreateItemOnObject("NW_CLOTH027", oPC, 1); object oItemCr = GetFirstItemInInventory(oPC); while(GetIsObjectValid(oItemCr)) { SetIdentified(oItemCr,TRUE); oItemCr = GetNextItemInInventory(oPC); } { SetXP(oPC, 15); } AssignCommand(oPC, ActionEquipMostEffectiveArmor()); } } Сообщение отредактировал Артём - Jul 28 2008, 07:14 |
![]()
Сообщение
#3832
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
Артём, эта функция создает вещи не по тэгу, а по резрефу вещи. Поэтому по стандарту во всех вещах и объектах Биовари тэг = резрефу, чтобы не было путаницы. Чтобы твоя вещь создалась, сделай тэг и резреф одинаковыми. Например: тэг = ait_item_armor, резреф = ait_item_armor (резреф ограничен 16 символами). И не делай такие тэги, иначе быстро запутаешься, что у тебя за вещь, если будешь их просматривать по резрефам.
Так ты не указал, какую именно вещь нужно одеть. Потом, необходима мелкая задержка между созданием и одеванием вещи, потому что функция "CreateItemOnObject" более медленная, чем функция "ActionEquipItem" или "ActionEquipMostEffectiveArmor". Да, вот еще что. Вещи не одеваются на эвенте входа. Они хорошо одеваются на эвенте локации. Сам уже не раз наступал на эти грабли. Попробуй свой скрипт повесить на эвент локации входа. Вот как я одеваю вещи на нового персонажа: Neverwinter Script void ClientGiveClothers(object oPC, float fDelay) { string sClass, sItem; object oClother; // Выдача одежды игроку switch (GetClassByPosition(1, oPC)) { case CLASS_TYPE_BARBARIAN: sClass = "barbarian"; break; case CLASS_TYPE_FIGHTER: sClass = "fighter"; break; case CLASS_TYPE_MONK: sClass = "monk"; break; case CLASS_TYPE_PALADIN: sClass = "paladin"; break; case CLASS_TYPE_RANGER: sClass = "ranger"; break; case CLASS_TYPE_ROGUE: sClass = "rogue"; break; case CLASS_TYPE_BARD: sClass = "bard"; break; case CLASS_TYPE_CLERIC: sClass = "cleric"; break; case CLASS_TYPE_DRUID: sClass = "druid"; break; case CLASS_TYPE_SORCERER: sClass = "sorcerer"; break; case CLASS_TYPE_WIZARD: sClass = "wizard"; break; } if (GetGender(oPC) == GENDER_FEMALE) sItem = "ac_" + sClass + "_f"; else sItem = "ac_" + sClass + "_m"; if (GetItemPossessedBy(oPC, sItem) == OBJECT_INVALID) oClother = CreateItemOnObject(sItem, oPC); if (oClother == OBJECT_INVALID) oClother = GetItemPossessedBy(oPC, sItem); DelayCommand(fDelay, AssignCommand(oPC, ActionEquipItem(oClother, INVENTORY_SLOT_CHEST))); } Задержка fDelay=0.1 секунда. Функция вызывается из общего тела скрипта в конце твоего условия: Neverwinter Script object oPC = GetEnteringObject();
... ClientGiveClothers(oPC, 0.1); Сообщение отредактировал Zirrex - Jul 28 2008, 09:17 |
![]()
Сообщение
#3833
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
Большое спасибо за внятный ответ (IMG:style_emoticons/kolobok_light/good.gif) (IMG:style_emoticons/kolobok_light/smile.gif) сейчас буду пробовать
|
![]()
Сообщение
#3834
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
Артём, поправил твой скрипт. Проверяй. Только не забудь его повесить на событие входа в локацию. Сделай для стартовой локации отдельный скрипт.
Neverwinter Script void main() { object oPC = GetEnteringObject(); object oArea = GetArea(oPC); if (GetIsPC(oPC) == FALSE) return; if (oArea == OBJECT_INVALID) return; if (GetXP(oPC) == FALSE) { // Удаление вещей с персонажа int s; object oSlot; for (s = 0; s < 18; s++) { oSlot = GetItemInSlot(s, oPC); if (GetIsObjectValid(oSlot)) DestroyObject(oSlot); } // Удаление вещей из рюкзака персонажа object oItem = GetFirstItemInInventory(oPC); if (oItem != OBJECT_INVALID) { while (GetIsObjectValid(oItem)) { DestroyObject(oItem); oItem = GetNextItemInInventory(oPC); } } // выдачи вещи object oClother = CreateItemOnObject("NW_CLOTH027", oPC, 1); // установка флага для всех вещей в рюкзаке "Определенные" object oItemCr = GetFirstItemInInventory(oPC); while(GetIsObjectValid(oItemCr)) { SetIdentified(oItemCr, TRUE); oItemCr = GetNextItemInInventory(oPC); } // не проще сразу выдавать определенные вещи? Лишний цикл SetXP(oPC, TRUE); // на персонажа одевается выданная вещь DelayCommand(0.1, AssignCommand(oPC, ActionEquipItem(oClother, INVENTORY_SLOT_CHEST))); // сохранение персонажа DelayCommand(2.0, ExportSingleCharacter(oPC)); } } Переменная не нужна. Дело все том, что если эта система предназначена для шарда, то после рестарта у твоего персонажа снова заберут вещи, выдадут заново вещь, определят ее и дадут персонажу 15 опыта, затерев то значение, которое будет. Простая проверка на 0. Если опыт равен 0, то выполнить условие, если нет, то пропустить. Потом нужно следить, чтобы опыт никогда не был 0. Сообщение отредактировал Zirrex - Jul 28 2008, 22:52 |
![]()
Сообщение
#3835
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Zirrex, а если получится так, что в стартовую локацию придется входить не один раз, а несколько, и каждый раз с бедного игрока будут сдирать одежду и рюкзак ему чистить? (IMG:style_emoticons/kolobok_light/smile.gif) Это я к тому, что, может, стоит переменную повесить на то, входил игрок уже в локу или нет?
У меня работает так: Neverwinter Script #include "nw_i0_tool" void main() { object oEnter = GetEnteringObject(); if (!GetIsPC(oEnter)) return; //вот как раз наша переменная. проверяем, не произошло ли уже это событие int DoOnce = GetLocalInt(oEnter, GetTag(OBJECT_SELF)); // если да - скрипт не сработает, если нет - продолжаем действовать. if (DoOnce==TRUE) return; // устанавливаем переменную, что игрок уже однажды вошел на локацию. SetLocalInt(oEnter, GetTag(OBJECT_SELF), TRUE); // а дальше уже можно чистить инвентарь и проделывать с игроком все, что угодно Заранее извиняюсь, если сморозила глупость (IMG:style_emoticons/kolobok_light/smile.gif) Сообщение отредактировал shadowdweller - Jul 29 2008, 02:04 |
![]() ![]() |
Текстовая версия | Сейчас: 6th August 2025 - 00:11 |