![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#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 |
![]()
Сообщение
#3836
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
Спасибо обоим (IMG:style_emoticons/kolobok_light/smile.gif)
Что то меня эти скрипты пугают, не берусь их учить, только лазию и ПОРОШАЙНИЧЯЮ да и варую чюжые скрипты (IMG:style_emoticons/kolobok_light/crazy.gif) |
![]()
Сообщение
#3837
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
shadowdweller, а это еще почему? Такая система работает уже несколько лет, и ничего с бедного игрока не сдирали. Переменная стирается рестартом, а игрок входит на шард всегда через стартовую локацию, поэтому твоя правка бесполезна. Достаточно двух строк:
Neverwinter Script void main() { ... if (GetXP(oPC) == FALSE) { SetXP(oPC, TRUE); } } Даже если игрок и не покинет эту локацию сразу, а перезайдет на ней, то он останется ровно с тем, что ему дали. Если уж говорить о полной надежности, то персонажу игрока нужно выдавать вещь, на которую сохранять стартовую переменную и потом ее проверять вместе со значением опыта. Одно условие может быть FALSE, оба - сомневаюсь. Сообщение отредактировал Zirrex - Jul 29 2008, 09:12 |
![]()
Сообщение
#3838
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Zirrex, ну, если о шарде речь - тогда совсем другое дело. Я-то сингл имела в виду. (IMG:style_emoticons/kolobok_light/smile.gif) Причем, я так боялась, что это будет каждый раз происходить, что в моде на стартовую локацию можно только один раз зайти, если вышел - все, не вернешься (IMG:style_emoticons/kolobok_light/biggrin.gif)
|
![]()
Сообщение
#3839
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
shadowdweller, а причем тут одиночная игра? Там еще проще. Можно всегда сохранить статус игры. Потом, именно в одиночной игре подобные скрипты вешаются на события модуля, а не локации, чтобы, как ты описала выше, не было подобных эксцессов.
|
![]()
Сообщение
#3840
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
Вопрос есть скрипт который позволяет не сбивать действия? К примеру у меня НПС посли диалога идёт в указанное место, но при попытке поговорить с ним ВСЁ он стоит ступором и несоберается выполнять задоный скрипт.
P.S Надеюсь я не сильно много задают вопросов? С таким темпом могу быстро вам надоесть (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#3841
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Тебе нужно в хербите НПС ставить проверку GetDistanceToObject(бла,бла) >=1.0 до объекта куда нужно и если он не там пинать его командой AssignCommand(<НПС>, ActionMoveToObject(бла)); ну и соответсвующие проверки на - болтает ли, дерется, идет ли
что-то типа такого: Neverwinter Script ....
if(GetLocalInt(...)==...)это ты в диалоге вешаешь...а в хербите если есть локалка запуститься следующие { oObject = <твоя точка назначения> if(!GetIsInCombat(OBJECT_SELF) && !IsInConversation(OBJECT_SELF)) { if(GetDistanceToObject(oObject)>=1.5) { AssignCommand(OBJECT_SELF, ActionMoveToObject(oObject)); } } } .... Сообщение отредактировал Melisse - Jul 29 2008, 22:43 |
![]()
Сообщение
#3842
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
А можно как нибудь поподробней для чайника. можно целый скрипт?
|
![]()
Сообщение
#3843
|
|
Level 11 ![]() Класс: Волшебник Характер: Neutral Good Раса: Фея NWN: Скриптинг [PW] Край Лесов ![]() |
Берешь с слота OnHerbit у НПС скрипт и в самом начале пишешь:
Neverwinter Script if(GetLocalInt(OBJECT_SELF,"QUEST")==TRUE) { object oObject = GetObjectByTag("СЮДА ТЭГ ОБЪЕКТА, К КОТОРОМУ НАДО ИДТИ"); if(!GetIsInCombat(OBJECT_SELF) && !IsInConversation(OBJECT_SELF)) { if(GetDistanceToObject(oObject)>1.0) { AssignCommand(OBJECT_SELF, ActionMoveToObject(oObject)); } else DeleteLocalInt(OBJECT_SELF,"QUEST"); } } и в диалоге на в тот скрипт что заставляет НПС идти к точке назначения вставь Neverwinter Script SetLocalInt(OBJECT_SELF,"QUEST",TRUE); должно сработать Сообщение отредактировал Melisse - Jul 30 2008, 08:08 |
![]()
Сообщение
#3844
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Neutral Good Раса: Человек ![]() |
Спасибо сейчас буду тыкать (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#3845
|
|
Level 2 ![]() Класс: Оборотень Характер: True Neutral Раса: Эльф ![]() |
Куча вопросов по реализации некоторых идей =)
Буду благодарен если мне подскажут как все сделать или кинут ссылку где это описано. 1. Появление разных рас в разных местах при первом заходе в модуль. То есть например эльфы начинают в одной локации, а люди в другой. 2. Видел в каком то модуле что была настроена рассовая агрессия. Тк модуль будет ориентирован на мультиплеер нужно сделать так чтобы союз одних рас был агрессивен по отношению к союзу других. 3. Еще хотел бы узнать как реализовать отдельный респаун каждого союза в своем городе. 4. Начисление опыта и золота за убийство игрока. ну например по формуле lvl убитого игрока x 50 , если если убитый игрок на 5 уровней ниже то опыт и золтто не дается. Фух, пока все, надеюсь что сильные скриптеры мира сего помогут =) |
![]() ![]() |
Текстовая версия | Сейчас: 10th August 2025 - 22:46 |