Здесь будут вывешаны самые простые скрипты на которых можно построить новичку свой модуль. Любой пост кроме скрипта с описанием будет считаться спамом и автор получит предупреждение. Всем Мастерам скриптов советую максимально разжевывать куда, как и зачем вставлять код. При этом максимально просто писать код. Этим мы поможем новичкам не только справиться с проблемой, но и понемногу научим понимать код. Сложные скрипты писать в другую тему.
============================
LEX: Беру тему под контроль. Если тут в скриптах или комментариях ошибки, пишу в то же посте, где допущена неточность. Авторам постов обратить внимание на эти ремарки и вносить коррективы по необходимости.
============================
Начем. Самое главное, это начало модуля. Тут все написано, как раздеть игрока, одеть, дать ему денег и отправить дальше. Ставится он на слот модуля OnClientEnter.
Долго думал, какой скрипт написать и решил, что новичкам, в первую очередь, будет интересно узнать вот о чем. Многое замечали, что при разговоре с NPC (Non-Playing Character, т.е. любой персонаж, кроме игроков) при первой встрече он может вас приветствовать, а при второй - молчать. Так вот, делается сее творение тоже с помощью скриптов. Для начала создаете диалог с двумя ветками от корня (что NPC будет говорить вначале и что после). В первой ветке во вкладке Text Appears When (эта вкладка указывает на то, что фраза будет произнесена, только если скрипт, написанный в этой вкладке, выполняется) напишите следующий скрипт.
Neverwinter Script Source |
int StartingConditional() { // Вводим переменную nResult. Она должна принять значения TRUE или FALSE (Да или Нет) int nResult; /* GetLocalInt - возвращает программе заначение переменной с именем "FIRST_TIME", которая была присвоена объекту OBJECT_SELF (в данном случае - самому себе) Спрашиваем, если такая переменная еще не вводилась (т.е. равна 0), что переменной nResult присвоить TRUE(Да). В противном случае, присвоить nResult FALSE(Нет) */ nResult = GetLocalInt(OBJECT_SELF, "FIRST_TIME") == 0; // Возвращаем программе значение. Если TRUE(Да), то фраза произносится; если // FALSE(Нет) - то нет. return nResult; } |
Neverwinter Script Source |
SetLocalInt(OBJECT_SELF, "FIRST_TIME", 1); /* Присвоели переменной 1 и теперь она уже определена под другим значением */ |
Решил расписать такой скрипт.
Многие наверное хотят сделать у себя в модуле вещь, на подобие "Камня призыва" в NWN.
Что нам нужно:
1) Итем, который будет выполнять роль телепортера, скажем, камень призыва, ему нужно добавить св-во "Вызвать заклинание: Только собственное питание [бесконечно использовано]" - так называется в русской версии. Его таг должен быть уникальным!
2) Объект, к которому будет осуществляться телепортация, скажем портал. Его таг то же должен быть уникальным!
Вот и все, теперь скрипты:
Ставется на событие OnActivateItem в модульных св-вах
Neverwinter Script Source |
void main() { object oActivator = GetItemActivator(); // это активатор объекта(наш PC) object oActivated = GetItemActivated(); // это активируемый объект (камень) object oTarget = GetObjectByTag("ТАГ ПОРТАЛА"); // наш портал if ("ТАГ КАМНЯ" == GetTag(oActivated)) // проверка. Нужный ли объект использован { SetLocalLocation(oActivator, "ReturnLocation", GetLocation(oActivator)); // запоминаем //координаты игрока перед прыжком AssignCommand(oActivator, ClearAllActions()); // чистим игроку акции AssignCommand(oActivator, ActionJumpToLocation(GetLocation(oTarget))); // собственно //сам прыжок к порталу } } |
Neverwinter Script Source |
void main() { object oActivator = GetLastUsedBy(); // тот ,кто использовал портал (наш игрок) // если нужно сделать прыжок в диалоге, то закомментируйте строчку выше и //расскомментируйте строчку ниже //object oActivator = GetPCSpeaker(); // PC, который разговаривает с объектом AssignCommand(oActivator, ClearAllActions()); // чистим игроку акции AssignCommand(oActivator, ActionJumpToLocation(GetLocalLocation(oActivator, "ReturnLocation"))); // прыжок к запомненным ранее координатам } |
Неожиданно пришла здравая идея!
Многим может быть полезным генерация хенча (henchman - NPC, который помогает тебе во всем). Вот как этого можно добиться.
1.Создаем любого NPC на карте.
2.Добавляем к нему диалог, типа такого: "Привет, Вася. Хощ, буду твоим помощьником?"-"Хочу"-"Хех, все"
3.Далее, в том месте, где NPC говорит, что он уже присоединился к вам, во вкладке Action Taken напишите следующий коротенький скриптик
Neverwinter Script Source |
if(GetLocalInt(OBJECT_SELF, "HENCHED") != TRUE) // Проверка, что присоединяется один раз { SetLocalInt(OBJECT_SELF, "HENCHED", TRUE); // Вот и установка AddHenchman(GetPCSpeaker(), OBJECT_SELF); // Добавляем хенча тому игроку, с кем говорит } |
Скрипт закрывает дверь на ночь и открывает ее днем. Ставится на OnEnter триггера. Триггер чертится максимально близко к двери. Игрок наступает на триггер и идет ппроверка с работой скрипта, значит триггер надо чертить немного больше чем ширина-длина двери, что бы манчи не добежали пока скрипт не сработал. В идеале не больше тайла на которм стоит дверь. Вот сам код:
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnEnter am_ten_door_d_n //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Триггер закрыв. двери ночью и открыв. днем/утром */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 20.04.2005 //::////////////////////////////////////////////// void main() { object oDoor = GetNearestObject(OBJECT_TYPE_DOOR); int iLock = GetLocalInt(oDoor, "LOCKED_NIGHT"); if ((GetIsNight()&&iLock==TRUE)||(GetIsDay()||GetIsDawn()&&iLock==FALSE)) { return; } if (GetIsNight()) { SetLocked(oDoor, TRUE); SetLocalInt(oDoor, "LOCKED_NIGHT", TRUE); return; } if (GetIsDay()||GetIsDawn() && iLock == TRUE) { SetLocked(oDoor, FALSE); SetLocalInt(oDoor, "LOCKED_NIGHT", FALSE); } } |
Neverwinter Script Source |
void main() { object oPC = GetPCSpeaker(); // object oPC = GetFirstPC(); // - так будет работать на любом месте для сингла SetLocalInt(oPC, "ПЕРЕМЕННАЯ ОДЫН", 1); SetLocalInt(oPC, "ПЕРЕМЕННАЯ ДВА", 1); } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Описание переменной квеста //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Описание самого квеста, если нужно. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 15.04.2005 //::////////////////////////////////////////////// int StartingConditional() { object oPC = GetPCSpeaker(); int iQuest = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ОДЫН"); //------------------------------------------------------- if (iQuest == 1) // Если локалка равна еденице. // if (iQuest == 5) // Если локалка равна пяти и т.д. // if (iQuest != 5) // Если локалка НЕ равна пяти и т.д. { return TRUE; // Возврат ИСТИНА, т.е. старт диалога } return FALSE; // В противном случае отбой } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Описание переменной квеста //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Описание самого квеста, если нужно. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 15.04.2005 //::////////////////////////////////////////////// int StartingConditional() { object oPC = GetPCSpeaker(); int iQuest1 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ОДЫН"); int iQuest2 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ДВА"); //------------------------------------------------------- if (iQuest1 == 1 || iQuest2 == 2 ) // Если есть ИЛИ та ИЛИ другая локалка // if (iQuest1 == 1 && iQuest2 == 2 ) // Если есть И та И другая локалка // if (iQuest1 == 1 && iQuest2 != 2 ) // Если есть ПЕРВАЯ, НО НЕТ второй локалки // if (iQuest1 != 1 && iQuest2 != 2 ) // Если НЕТ первой и НЕТ второй локалки // if (iQuest1 != 1 || iQuest2 != 2 ) // Если НЕТ первой или НЕТ второй локалки { return TRUE; // Возврат ИСТИНА, т.е старт диалога } return FALSE; // Если нет, то ничего не будет. } |
Neverwinter Script Source |
int StartingConditional() { object oPC = GetPCSpeaker(); int iQuest1 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ОДЫН"); int iQuest2 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ДВА"); int iQuest3 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ТРЫ"); int iQuest4 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ЧАТЫРЕ"); //------------------------------------------------------- if (iQuest1 == 1 || iQuest2 == 2 || iQuest3 == 5 || iQuest4 == 1 ) { return TRUE; } return FALSE; } |
Neverwinter Script Source |
int StartingConditional() { object oPC = GetPCSpeaker(); int iQuest1 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ОДЫН"); int iQuest2 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ДВА"); int iQuest3 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ТРЫ"); int iQuest4 = GetLocalInt(oPC, "ПЕРЕМЕННАЯ ЧАТЫРЕ"); //------------------------------------------------------- if ((iQuest1 == 3 || iQuest2 == 2) && (iQuest3 == 5 && iQuest3 != 8) ) { return TRUE; } return FALSE; } |
ЗЫ: Небольшое уточнение, в посте DraX’ са.
QUOTE |
4.Заменяем во всех вкладках скриптов у NPC скрипты на nw_ch_ac#, где вместо # пишите цифру или букву из родных скриптов. Это стандартные AI скрипты для всех хенчев. |
Вот скиптик для сидения на стуле, кушетке, диване, лавке...
Все, что нам нужно - это объект подходящий для сидения.
Скрипт ставется на слот OnUsed в св-вах объекта
Neverwinter Script Source |
void main() { object oPC = GetLastUsedBy(); // последний, кто использовал объект (кликнул по нему) object oChair = OBJECT_SELF; // стул if (GetIsPC(oPC)) // если использовавший является PC { // если на стуле ни кто не сидит if (!GetIsObjectValid(GetSittingCreature(oChair))) { AssignCommand(oPC, ActionSit(oChair)); // разрешаем PC сесть } // если стул занят объектом (уже кто-то сидит) else if (GetIsObjectValid(GetSittingCreature(oChair))) { AssignCommand(oPC, ClearAllActions()); // чистим PC акции } } } |
Neverwinter Script Source |
void main() { object oActivator = GetItemActivator(); object oActivated = GetItemActivated(); object oTarget = GetObjectByTag("ТАГ ПОРТАЛА"); if ("ТАГ КАМНЯ" == GetTag(oActivated)) if (GetLocalInt(oActivated, "USED") == 1) // проверка переменной { AssignCommand(oActivator, ClearAllActions()); AssignCommand(oActivator, ActionJumpToLocation(GetLocalLocation(oActivator, "ReturnLocation"))); SetLocalInt(oActivated, "USED", 0); // установка переменной на "0" } else { SetLocalLocation(oActivator, "ReturnLocation", GetLocation(oActivator)); // запоминаем координаты игрока перед прыжком AssignCommand(oActivator, ClearAllActions()); AssignCommand(oActivator, ActionJumpToLocation(GetLocation(oTarget))); SetLocalInt(oActivated, "USED", 1); // установка переменной на "1" } } |
QUOTE (-fenix- @ Aug 25 2005, 20:12) |
(GetIsObjectValid(oChair) |
Скрипт закрывает дверь автоматически через заданное время. Ставится в слот OnOpen двери.
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnOpen am_dop_close //:: Copyright © 2005 WRG! www.wrg.ru //::////////////////////////////////////////////// /* Универсальный скрипт для всех дверей. LocalFloat "DOOR_CLOSE_FLOAT" - время задержки. По умолчанию это 15 секунд. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 08.08.2005 //::////////////////////////////////////////////// void main() { object oDoor = OBJECT_SELF; // Наша дверь object oPC = GetLastOpenedBy(); // Тот кто последний использовал float f = GetLocalFloat(oDoor, "DOOR_CLOSE_FLOAT"); // Пауза if (f==0.0) // Значит ее нет на объекте { f = 15.0; // Присвоим ей значение 15 сек. } AssignCommand(oDoor, ClearAllActions()); AssignCommand(oDoor, ActionWait(f)); AssignCommand(oDoor, ActionCloseDoor(oDoor)); } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnOpen am_pop_bookshelf //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Скрипт генирирует книги в инвентарь шкафа. Локальная переменная "BOOKS" на объекте означает количество генерируемых книг. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 23.07.2005 //::///////////////////////////////////////////// void main() { //------------------------------------------------------------------------- // Количество книг в палитре. Присваиваем на модуль "ALL_BOOKS_IN_MODULES" //------------------------------------------------------------------------- int iBook = GetLocalInt(GetModule(), "ALL_BOOKS_IN_MODULES"); int iNum = GetLocalInt(OBJECT_SELF, "BOOKS"); // Сколько создаем в шкафу if (GetLocalInt(OBJECT_SELF, "HAS_OPERATED")) // Сработает один раз { return; } while(iNum >= 1) // Пока количество создаваемых книг больше или равно 1. { //------------------------------------------------------------------------- // Кстати... У меня ResRef-ы am_itm_book001 ... am_itm_book021, поэтому // я извратился немного, лень было переделать книги... Но так проще создать // много одинаковых книг, цифры сами генерятся редактором, вы только // создаете первую, а дальше Изменить/Сохранить и все. //------------------------------------------------------------------------- int i = Random(iBook)+1; // Гененрируем случайную унигу string sN = "0"; string sNN = "0"; if (i >=100) {sNN ="";} if (i >=10) {sN ="";} object oBook = CreateItemOnObject("am_it_book"+sNN+sN+IntToString(i)); iNum--; //Создали одну книгу. Отняли от количества еденичку... } SetLocalInt(OBJECT_SELF,"HAS_OPERATED",TRUE); // Запомним что уже сработал } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Проверка Тага локации //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 09.08.2005 //::////////////////////////////////////////////// int StartingConditional() { object oPC = GetPCSpeaker(); //------------------------------------------------------- if (GetTag(GetArea(OBJECT_SELF))=="ТАГ_ЛОКАЦИИ") { return TRUE; } return FALSE; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Copyright © 2004 WRG! www.wrg.ru //:: OnEnter OBJECT //::////////////////////////////////////////////// /* СКРИПТ АВТОСОХРАНЕНИЯ ПРИ ВХОДЕ В НОВУЮ ЛОКАЦИЮ */ //::////////////////////////////////////////////// //:: Created By: Aiwan Aiwan@e-mail.ru //:: Created On: 21.03.2004 //::////////////////////////////////////////////// void main() { object oPC = GetEnteringObject(); if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "SAVE_DO")) {return;} SetLocalInt(OBJECT_SELF, "SAVE_DO", TRUE); DoSinglePlayerAutoSave(); } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Превращение НПС в оборотня //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Сделайте НПС "Immortal", т.е. не убиваемым. Смените модель на простого горожанина или старичка еле передвигающегося. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: не помню.... давно было //::////////////////////////////////////////////// void main() { effect eMind = EffectVisualEffect(VFX_COM_BLOOD_CRT_GREEN); // Зеленая кровь effect eShape = EffectPolymorph(POLYMORPH_TYPE_WEREWOLF); // Модель Вервольфа object oPC = GetLastDamager(); //Кто последний нанес повреждения object oNpc = OBJECT_SELF; // Наш НПС // Если напал на НПС не игрок или уже скрипт сработал ... if (!GetIsPC(oPC) || GetLocalInt(oNpc, "WERWOLF_YES")) {return;} // то возврат SetLocalInt(oNpc, "WERWOLF_YES", TRUE); // Иначе каждый удар = превращению ChangeToStandardFaction(oNpc, STANDARD_FACTION_HOSTILE); // Меняем фракцию AssignCommand(oNpc, ClearAllActions()); // Чистим стек команд ApplyEffectToObject(DURATION_TYPE_INSTANT, eShape, oNpc); // Крови добавим ApplyEffectToObject(DURATION_TYPE_INSTANT, eMind, oNpc); // Трах! Тибедах! Тибедох! // Мы ж могли убить этого НПС с одного удара, уберем его неуязвимомсть SetImmortal(oNpc, FALSE); AssignCommand(oNpc, ActionAttack(oPC, FALSE)); // Командуем: ФАСС!!! } |
Neverwinter Script Source |
#include "nw_i0_tool" int StartingConditional() { object oPC = GetPCSpeaker(); if(!HasItem(oPC, "ТАГ_ПРЕДМЕТА")) return FALSE; return TRUE; } |
Если хотите, чтобы НПС, как только увидеk игрока поприветствовал его, используйте этот скрипт.
Скрипт ставется на слот OnPerception в св-вах НПС
Neverwinter Script Source |
void main() { object oPercep = GetLastPerceived(); // последний воспринятый объект // если последний воспринятый объект бял увиден и если он является игроком if ( GetLastPerceptionSeen() && GetIsPC(oPercep)) { SpeakString("Привет игрок"); // поприветствовать его // машем нашему герою рукой AssignCommand(OBJECT_SELF, PlayAnimation(ANIMATION_FIREFORGET_GREETING)); } } |
Neverwinter Script Source |
void main() { object oNPC = OBJECT_SELF; // наш умерший НПС string sResRef = "РесРеф трупа";// наш труп в палитре string sTag = GetTag(oNPC);// Получаем ТАГ убитого НПС location lLoc = GetLocation(oNPC);// Получаем локацию, в которой умер НПС // создаем невидимый объект, для переброски в него инвентаря убитого object oTrup = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lLoc, TRUE, sTag); SetIsDestroyable(FALSE);// чтоб тело убитого НПС не исчезало object oItem = GetFirstItemInInventory(oNPC);// первый объект в инвентаре убитого НПС while (GetIsObjectValid(oItem))// если объект правильный { if (GetDroppableFlag(oItem))// Проверяем выбрасываемый ли объект CopyObject(oItem, lLoc, oTrup);// копируем DestroyObject(oItem);// удаляем oItem = GetNextItemInInventory(oNPC);// следующий объект в инвентаре убитого НПС } int i = 0;// устанавливаем i на 0 oItem = GetItemInSlot(i,oNPC); // нулевой слот в инвентаре убитого НПС while (i<=13)// i не должно быть больше 13 { if (GetDroppableFlag(oItem))// Проверяем выбрасываемый ли объект CopyObject(oItem, lLoc, oTrup);// копируем DestroyObject(oItem);// удаляем i++;// увеличиваем i на еденицу oItem = GetItemInSlot(i,oNPC);// следующщий слот в инвентаре убитого НПС } } |
Neverwinter Script Source |
void main() { object oPC = GetLastSpeaker();//это PC SetListening(OBJECT_SELF, TRUE);// Даем команду НПС слушать /* следующая строчка нужна для сравнения. Как только вы что-то скажите НПС будет сравнивать сказаное с соответствующей строкой. 1 - это порядковый номер фразы, если у вас несколько фраз, то пронумируйте их все. */ SetListenPattern(OBJECT_SELF,"Караба-Мураба",1);// устанавливаем образец фразы } |
Neverwinter Script Source |
void main() { // если услышаное соответствует фразе под порядковым номером "1" и НПС ее слышет if (GetListenPatternNumber() == 1 && GetIsListening(OBJECT_SELF)) { SpeakString("Ты сказал верный пароль");// ответ НПС } } |
СКРИПТЫ БОЛЬШЕ НЕ ПОСТИТЬ. ТОЛЬКО МАСТЕРАМ РАЗРЕШАЮ ПИСАТЬ.
Скрипт вешается на OnEnter триггера. Переходим в следующий модуль.
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); // Кто вошел на триггер if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") || GetIsInCombat(oPC)) return; // Если не игрок, или уже наступал, или идет бой то возврат SetLocalInt(OBJECT_SELF, "TRIGGER", TRUE); ActionDoCommand(DoSinglePlayerAutoSave()); // Автосейв, на случай пожарный ActionDoCommand(StartNewModule("имя_модуля")); // НО БЕЗ РАСШИРЕНИЯ! *.mod } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: ActionTaken am_at_npc_exit //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* NPC уходит на точку и дестроится Ставим на диалог с НПС, устанавливаем в локации вейпоинт "AM_WP_NPC_EXIT". Если надо что бы НПС побежал к точке, то присвоим на поинт локалку "RUN". */ //::///////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 20.09.2005 //::///////////////////////////////////////////// void main() { object oPC = GetPCSpeaker(); // Игрок object oNpc = OBJECT_SELF; // НПС с которым идет диалог object oExit = GetNearestObjectByTag("AM_WP_NPC_EXIT"); // Вейпоинт int iRun = FALSE; // Параметр определяющий скорость НПС // Если в локации нет вейпоинта, то НПС скажет что некуда бежать if (GetArea(oExit)!=GetArea(oNpc)) { AssignCommand(oNpc, SpeakString("Нет вейпоинта в этой локации!")); return; } if(GetLocalInt(oExit, "RUN")) { iRun = TRUE; // Если присвоить локалку "RUN" на поинт, то он побежит. } AssignCommand(oNpc, ClearAllActions()); // Почистим стек команд AssignCommand(oNpc, ActionForceMoveToObject(oExit, iRun, 1.0, 30.0)); AssignCommand(oNpc, ActionDoCommand(DestroyObject(oNpc))); DelayCommand(0.5, SetCommandable(FALSE, oNpc)); // Что бы случайно не забыл } |
QUOTE (Aiwan @ Sep 18 2005, 21:18) | ||
|
_kaa_ , согласен. Может кому нужны несколько точек персонально. Заморочки писать не стал со стрингами и прочим, это новичкам сложно.
Этот скрипт в отличие от верхнего отправляет НПС на ПЕРСОНАЛЬНЫЙ вейпоинт.
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: ActionTaken am_at_npcwp_exit //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* NPC уходит на персональный вейпоинт, таг которого равен AM_WP_ESC_ плюс таг НПС и дестроится на ней. Ставим на диалог с НПС, устанавливаем в локации вейпоинт AM_WP_ESC_[ТАГ_НПС]. Если надо что бы НПС побежал к точке, то присвоим на поинт локалку "RUN". */ //::///////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 20.09.2005 //::///////////////////////////////////////////// void main() { object oPC = GetPCSpeaker(); // Игрок object oNpc = OBJECT_SELF; // НПС с которым идет диалог string sTag = GetTag(oNpc); // Таг НПС object oExit = GetNearestObjectByTag("AM_WP_ESC_"+sTag); // Вейпоинт int iRun = FALSE; // Параметр определяющий скорость НПС // Если в локации нет вейпоинта, то НПС скажет что некуда бежать if (!GetIsObjectValid(oExit)||(GetArea(oExit)!=GetArea(oNpc))) { AssignCommand(oNpc, SpeakString("Нет вейпоинта, или он не в этой этой локации!")); return; } if(GetLocalInt(oExit, "RUN")) { iRun = TRUE; // Если присвоить локалку "RUN" на поинт, то он побежит. } AssignCommand(oNpc, ClearAllActions()); // Почистим стек команд AssignCommand(oNpc, ActionForceMoveToObject(oExit, iRun, 1.0, 30.0)); AssignCommand(oNpc, ActionDoCommand(DestroyObject(oNpc))); DelayCommand(0.5, SetCommandable(FALSE, oNpc)); // Что бы случайно не забыл } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnUsed am_pus_sigh_spk //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Простенький скрипт при нажатии на объект выдает описание - локальный стринг "DISCRIPTION". Так же активирует метку на карте, но Вейпоинт должен стоять не дальше 5 метров от объекта. Его таг "WP_ADD_MAP_NOTE". */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 23.07.2005 //::///////////////////////////////////////////// void main() { object oPC = GetLastUsedBy(); object oWPmap = GetNearestObjectByTag("WP_ADD_MAP_NOTE"); string sMessage = GetLocalString(OBJECT_SELF, "DISCRIPTION"); //------------------------------------------------------------------------------ SpeakString(sMessage); // Описание предмета стрингом if(!GetLocalInt(OBJECT_SELF, "MAPNOTE")) { if (GetIsObjectValid(oWPmap) && GetDistanceBetween(oWPmap, OBJECT_SELF) <= 5.0) // Если есть метка такая и она не дальше 5 метров { SetMapPinEnabled(oWPmap, TRUE); // Активируем метку карты } SetLocalInt(OBJECT_SELF, "MAPNOTE", TRUE); // Пометим это } } |
QUOTE (Lex @ Sep 22 2005, 15:44) |
описание - локальный стринг "DISCRIPTION". |
Neverwinter Script Source |
AssignCommand(oPC ,ActionExamine(OBJECT_SELF)); |
Стандартный скрипт на слот OnSpawn НПС. Данный скрипт позволяет тонко настроить свойства НПС. Главное, один раз ВНИМАТЕЛЬНО прочитайте комментарии. Все локальные переменные ствятся в тулсете заранее.
Neverwinter Script Source |
//:://///////////////////////////////////////////// //:: Name x2_def_spawn //:: Copyright © 2001 Bioware Corp. //::////////////////////////////////////////////// /* Default On Spawn script 2003-07-28: Georg Zoeller: If you set a ninteger on the creature named "X2_USERDEFINED_ONSPAWN_EVENTS" The creature will fire a pre and a post-spawn event on itself, depending on the value of that variable 1 - Fire Userdefined Event 1510 (pre spawn) 2 - Fire Userdefined Event 1511 (post spawn) 3 - Fire both events */ //::////////////////////////////////////////////// //:: Created By: Keith Warner, Georg Zoeller //:: Created On: June 11/03 //::////////////////////////////////////////////// const int EVENT_USER_DEFINED_PRESPAWN = 1510; const int EVENT_USER_DEFINED_POSTSPAWN = 1511; #include "x0_i0_anims" #include "x0_i0_treasure" #include "x2_inc_switches" void main() { // User defined OnSpawn event requested? int nSpecEvent = GetLocalInt(OBJECT_SELF,"X2_USERDEFINED_ONSPAWN_EVENTS"); // Pre Spawn Event requested if (nSpecEvent == 1 || nSpecEvent == 3 ) { SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN )); } /* Fix for the new golems to reduce their number of attacks */ int nNumber = GetLocalInt(OBJECT_SELF,CREATURE_VAR_NUMBER_OF_ATTACKS); if (nNumber >0 ) { SetBaseAttackBonus(nNumber); } //::====================== Add By Aiwan / WRG! Team / ========================== //::////////////////////////////////////////////// //:: OnSpawn am_csp_common //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Добавляем стандартные свойства НПС, модифицируя скрипт NW_C2_DEFAULT9. КОММЕНТАРИИ Каждому свойству принадлежит локальная переменная, которую необходимо установить на НПС в редакторе. Все они начинаются на "FLAG_+Спавн_Свойство_НПС" Далее... * Если на модуль повесить LocalInt "X2_SWITCH_CROSSAREA_WALKWAYPOINTS" равную TRUE; то все НПС ходят по вейпам из локации в локацию. В противном случае только по вейпоинтам в одной локации. * Если повесить на дневной пост POST_ или ночной пост NIGHT_ локальную переменную LocalInt "X2_L_WAYPOINT_SETFACING" равную TRUE, то НПС становится лицом в сторну вепоинта. И возвращется в ту сторону даже после диалога/боя. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Original idea By: DBColl //:: Created On: 06.07.2005 //::////////////////////////////////////////////// //============================================================================== // Стандартные еванты скрипта NW_C2_DEFAULT9 //============================================================================== if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_STEALTH) == TRUE) {SetSpawnInCondition(NW_FLAG_STEALTH);} if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_SEARCH) == TRUE) {SetSpawnInCondition(NW_FLAG_SEARCH);} if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT_IMMOBILE) == TRUE) {SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);} if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT) == TRUE) {SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);} //-------------------------------------------------------------------------- // НПС ходит скрытно, когда выполняется WalkWaypoints(). Хорошо для убийц. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_STEALTH") == TRUE) {SetSpawnInCondition(NW_FLAG_STEALTH);} //-------------------------------------------------------------------------- // То же самое, только в режиме поиска. Хорошо для стражи. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_SEARCH") == TRUE) {SetSpawnInCondition(NW_FLAG_SEARCH);} //-------------------------------------------------------------------------- // НПС появится используя "EffectAppear", т.е. Свалится с неба. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_APPEAR_ANIMATION") == TRUE) {SetSpawnInCondition(NW_FLAG_APPEAR_SPAWN_IN_ANIMATION);} //-------------------------------------------------------------------------- // НПС будет постоянно воспроизводить анимацию, даже если игрок уйдет из его // поля зрения. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_CONSTANT") == TRUE) {SetSpawnInCondition(NW_ANIM_FLAG_CONSTANT);} //-------------------------------------------------------------------------- // Цивилизованные творения взаимодействуют с placeables в их области, что // имеют таг "NW_INTERACTIVE" //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_CIVILIZED") == TRUE) {SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);} //-------------------------------------------------------------------------- // НПС с бродячей анимацией ходят бродят по городу часто возвращаясь в свой // SPAWN пункт, арену в которой они спавнятся (желательно внутреннюю) и // которая содержит один из тагов: "NW_HOME", "NW_TAVERN", "NW_SHOP" //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_CLOSE_RANGE") == TRUE) {SetAnimationCondition(NW_ANIM_FLAG_IS_MOBILE_CLOSE_RANGE);} //-------------------------------------------------------------------------- // При наступлении ночи, запускает скрипт сна на НПС. Имя скрипта вешается // на модуль, как LocalString "X2_S_SLEEP_AT_NIGHT_SCRIPT" равное имени // скрипта "имя_скрипта_на_ночь". //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_SLEEPING_AT_NIGHTT") == TRUE) {SetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT);} //-------------------------------------------------------------------------- // НПС поднимает тревогу, сообщит при атаке всем не враждебным НПС. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_WARNINGS") == TRUE) {SetSpawnInCondition(NW_FLAG_SET_WARNINGS);} //-------------------------------------------------------------------------- // Ходит на ночные/дневные поинты. Днем ходит по стандартным поинтам, ночью // "WN_" + NPC Tag + "_##. Ночной пост - "NIGHT_" + NPC tag. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_DAY_NIGHT_POSTING") == TRUE) {SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);} //-------------------------------------------------------------------------- // НПС болтает с дружественными НПС, воспроизводит анимацию, эмитирует // оживление и активность. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_IMMOBILE_ANIMATIONS") == TRUE) {SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);} //-------------------------------------------------------------------------- // Почти то же что и выше, за исключением того, что НПС бродит по округе. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_AMBIENT_ANIMATIONS") == TRUE) {SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);} //============================================================================== // Атакующие свойства НПС - устанавливается ТОЛЬКО ОДНО ИЗ НИХ! //============================================================================== //-------------------------------------------------------------------------- // Старается атаковать издали, дальнобойным оружием. //-------------------------------------------------------------------------- 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);} //============================================================================== // Защитныеые свойства НПС - устанавливается ТОЛЬКО ОДНО ИЗ НИХ! //============================================================================== //-------------------------------------------------------------------------- // НПС Убегает в точку и возвращается через короткое время позже. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_ESCAPE_RETURN") == TRUE) {SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);} //-------------------------------------------------------------------------- // Убегает в точку и не возвращается. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_ESCAPE_LEAVE") == TRUE) {SetSpawnInCondition(NW_FLAG_ESCAPE_LEAVE);} //-------------------------------------------------------------------------- // Телепортируется в безопасность и не возвращается. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_TELEPORT_LEAVE") == TRUE) {SetSpawnInCondition(NW_FLAG_TELEPORT_LEAVE);} //-------------------------------------------------------------------------- // Телепортируется в безопасность и возвращается через короткое время. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_TELEPORT_RETURN") == TRUE) {SetSpawnInCondition(NW_FLAG_TELEPORT_RETURN);} //============================================================================== // Добавляем свои настройки для персональных нужд. //============================================================================== //-------------------------------------------------------------------------- // Присваиваем НПС координаты, что бы он стоял лицом в одном направлении. //-------------------------------------------------------------------------- if (GetLocalFloat(OBJECT_SELF,"initFacing") == 0.0) { location loc = GetLocation(OBJECT_SELF); SetLocalFloat(OBJECT_SELF, "initFacing", GetFacingFromLocation(loc)); SetLocalLocation(OBJECT_SELF, "initLoc", loc); } //============================================================================== // Запускаем стандартные еванты на НПС //============================================================================== //-------------------------------------------------------------------------- // Если вы присвоите локальную переменную "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);} // * Fire User Defined Event 1003 if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_END_COMBAT_ROUND") == TRUE) {SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT);} // * Fire User Defined Event 1004 if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_ON_DIALOGUE") == TRUE) {SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);} // * Fire User Defined Event 1005 if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_ATTACK") == TRUE) {SetSpawnInCondition(NW_FLAG_ATTACK_EVENT);} // * Fire User Defined Event 1006 if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_DAMAGED") == TRUE) {SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);} // * Fire User Defined Event 1007 (Считается ненадежным BioWare) if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_DEATH") == TRUE) {SetSpawnInCondition(NW_FLAG_DEATH_EVENT);} // * Fire User Defined Event 1008 if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_DISTURBED") == TRUE) {SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT);} // * Fire User Defined Event if (iUserDef==TRUE || GetLocalInt(OBJECT_SELF, "FLAG_SPELL_CAST_AT") == TRUE) {SetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT);} //-------------------------------------------------------------------------- // Создает небольшую сумму сокровища в инвентаре //-------------------------------------------------------------------------- if ((GetLocalInt(GetModule(), "X2_L_NOTREASURE") == FALSE) && (GetLocalInt(OBJECT_SELF, "X2_L_NOTREASURE") == FALSE) ) { CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF); } //-------------------------------------------------------------------------- SetListeningPatterns(); //-------------------------------------------------------------------------- // nRun - если нужно что бы стражник бегал или ждал на поинтах больше чем по // умолчанию, то присвойте нужные значения на OBJECT_SELF. // LocalInt "FLAG_WALK_RUN" - равная TRUE, заставит НПС бегать по точкам. // LocalFloat "FLAG_WALK_PAUSE" - время паузы на поинтах. По умолчанию f1.0 // Для верной работы надо править еще эту функцию на HertBeat скрипте и в // после завершения диалога с НПС. Иначе все настройки будут по умолчанию // после первого боя или диалога. //-------------------------------------------------------------------------- int nRun = GetLocalInt(OBJECT_SELF, "FLAG_WALK_RUN"); float fPause = GetLocalFloat(OBJECT_SELF, "FLAG_WALK_PAUSE"); if (fPause == 0.0f) { fPause = 1.0f; } WalkWayPoints(nRun, fPause); //=========================== End Aiwan's Edition ============================== //Post Spawn event requeste if (nSpecEvent == 2 || nSpecEvent == 3) { SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN)); } } |
Neverwinter Script Source |
// If we have the 'constant' waypoints flag set, walk to the next // waypoint. else if ( GetWalkCondition(NW_WALK_FLAG_CONSTANT) ) { WalkWayPoints(); } |
Neverwinter Script Source |
//======================== Add By Aiwan / WRG! Team / ========================== // Если НПС ходит по вейпоинтам, то он отправится на следующий. //-------------------------------------------------------------------------- // nRun - если нужно что бы стражник бегал или ждал на поинтах больше чем по // умолчанию, то присвойте нужные значения на OBJECT_SELF. // LocalInt "FLAG_WALK_RUN" - равная TRUE, заставит НПС бегать по точкам. // LocalFloat "FLAG_WALK_PAUSE" - время паузы на поинтах. По умолчанию f1.0 //------------------------------------------------------------------------- else if ( GetWalkCondition(NW_WALK_FLAG_CONSTANT) ) { int nRun = GetLocalInt(OBJECT_SELF, "FLAG_WALK_RUN"); float fPause = GetLocalFloat(OBJECT_SELF, "FLAG_WALK_PAUSE"); if (fPause == 0.0f) // Значит ее нет на объекте { fPause = 1.0f; // Присвоим паузу по умолчанию 1.0 секунду } WalkWayPoints(nRun, fPause); } //=================================== End ====================================== |
Проверка Харизмы у игрока. Если она 16 или больше, то стартует диалог.
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Проверка харизмы игрока >= 16 //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 18.09.2005 //::////////////////////////////////////////////// int StartingConditional() { if(GetAbilityScore(GetPCSpeaker(), ABILITY_CHARISMA) >= 16) return TRUE; return FALSE; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Возвращает строку диалога для ПАЛАДИНА //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 24.05.2005 //::///////////////////////////////////////////// int StartingConditional() { object oPC = GetPCSpeaker(); return GetLevelByClass(CLASS_TYPE_PALADIN,oPC)>0; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Проверка наличия скила ОЦЕНКИ ВЕЩЕЙ //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 24.09.2005 //::////////////////////////////////////////////// int StartingConditional() { if(GetHasSkill(SKILL_APPRAISE, GetPCSpeaker())) return TRUE; return FALSE; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Проверка навыка ОБМАНУТЬ HARD //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 18.09.2005 //::////////////////////////////////////////////// #include "nw_i0_tool" int StartingConditional() { if(AutoDC(DC_HARD, SKILL_BLUFF, GetPCSpeaker())) return TRUE; return FALSE; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Проверяет время. Утро, День. //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 03.10.2005 //::////////////////////////////////////////////// int StartingConditional() { if (GetIsDay() || GetIsDawn()) { return TRUE; } return FALSE; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Проверяет время. Вечер, Ночь. //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 03.10.2005 //::////////////////////////////////////////////// int StartingConditional() { if (GetIsNight() || GetIsDusk()) { return TRUE; } return FALSE; } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Даем игроку золота //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 18.09.2005 //::////////////////////////////////////////////// void main() { GiveGoldToCreature(GetPCSpeaker(), 250); } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Добавляем ALIGNMENT_GOOD игроку //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 18.09.2005 //::////////////////////////////////////////////// void main() { AdjustAlignment(GetPCSpeaker(), ALIGNMENT_GOOD, 2); } |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: Даем партии ХР //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 18.09.2005 //::////////////////////////////////////////////// #include "nw_i0_tool" void main() { RewardPartyXP(150, GetPCSpeaker()); } |
Универсальный скрипт, который ставится на люк (Деревянный) и когда РС его открывает и нажимает на него второй раз, то перемещается к объекту с Тагом равным LocalString "TRANSITION_TARGET" на этом люке. Если вам перемещаться не надо, то люк будет просто, открываться-закрываться.
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnExit am_pus_used_trap //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Скрипт использования PLC_ люков. LocalString "TRANSITION_TARGET" - Таг вейпоинта или триггера, куда мы перемещаемся. Если на объекте не будет этого стринга, значит он просто откроется - закроется при повторном использовании. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 08.10.2005 //::///////////////////////////////////////////// /* Эта функция отправляет помощников следом за игроком. На тот случай, если точка куда надо отправиться стоит совсем рядом. Тогда хеньчман не телепортируется. */ void JumpAssociateToObject(object oPC, object oToJumpTo) { object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); if(oAnimal != OBJECT_INVALID) AssignCommand(oAnimal, JumpToObject(oToJumpTo)); if(oDominated != OBJECT_INVALID) AssignCommand(oDominated, JumpToObject(oToJumpTo)); if(oFamiliar != OBJECT_INVALID) AssignCommand(oFamiliar, JumpToObject(oToJumpTo)); if(oSummoned != OBJECT_INVALID) AssignCommand(oSummoned, JumpToObject(oToJumpTo)); int i = 1; object oHenchman = GetHenchman(oPC, i); while(oHenchman != OBJECT_INVALID) { AssignCommand(oHenchman, JumpToObject(oToJumpTo)); i++; oHenchman = GetHenchman(oPC, i); } } /* Это основной код */ void main() { object oPC = GetLastUsedBy(); string sTarget = GetLocalString(OBJECT_SELF, "TRANSITION_TARGET"); // sTarget - Это ТАГ объекта, куда мы переместимся object oTarget = GetObjectByTag(sTarget); // Сам объект if (GetLocked(OBJECT_SELF)) // Если закрыт, то ищем ключ и открываем { string sKey = GetTrapKeyTag(OBJECT_SELF); object oKey = GetItemPossessedBy(oPC, sKey); if (sKey != "" && GetIsObjectValid(oKey)) { SetLocked(OBJECT_SELF, FALSE); } else { DelayCommand(0.1, PlaySound("as_dr_locked2")); return; } } if (GetIsOpen(OBJECT_SELF) && sTarget !="") // Если открыт и есть цель { AssignCommand(oPC, ClearAllActions()); if(!GetIsObjectValid(oTarget)) // Если ошиблись с тагом цели { SendMessageToPC(oPC, "<cу >ВНИМАНИЕ! </c>Не могу найти точку перемещения!"); AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_GET_LOW, 0.5, 2.0)); DelayCommand(2.0, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE)); SetLocalInt(OBJECT_SELF, "OPEN", FALSE); return; } AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_GET_LOW, 0.5, 2.0)); DelayCommand(1.5, AssignCommand(oPC, JumpToObject(oTarget))); // Следом за игроком отправляем всех помощников DelayCommand(1.7, JumpAssociateToObject(oPC, oTarget)); DelayCommand(2.0, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE)); SetLocalInt(OBJECT_SELF, "OPEN", FALSE); return; } if (!GetIsOpen(OBJECT_SELF)) { AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW)); DelayCommand(1.0, ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN)); SetLocalInt(OBJECT_SELF, "OPEN", TRUE); } else { ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE); SetLocalInt(OBJECT_SELF, "OPEN", FALSE); } } |
Ставим скрипт на OnEnter енкаучера. Делаем его не активным и что бы срабатывал один раз. Дальше все вс скрипте. Указываем условие при котором он будет срабатывать и сколько раз. У меня например если игрок не член банды черных рейдеров. У вас может быть свое.
НПС после нападения становится нейтральным и начинает диалог с РС. В свойствах НПС поставь Immortal галочку. Что бы не убить его с одного удара.
А этот скрипт на проверку игрока в другой локации,куда вставлять?Aiwan не указал(
Товарищи, я бы хотел сделать заклинание glyph of warding(символ охраны) эпическим, тоесть усилить его, в принцыпе это для меня было не сложно, вопрос возник в скриптах, так как я в скриптах не разбираюсь вообще(недавно только самоучитель скачал),
я хочу вас попросить написать мне пример этого скрипта обьяснить где что менять и куда писать потом адрес на скрипт!
Вопрос не по этой теме. Задай в теме вопросов по скриптам. На это сообщение отвечать не надо.
Да, хороший скрипт, который отправляет непися в точку и уничтожает. А когда неписей много (простая сценка: герой освобождает узников, и они бегут к двери тюрьмы, осыпая героя благодарностями. Писать для каждого непися отдельный скрипт с разными репликами? А если попробовать так:
Стремление к универсальности в порядке вещей, если есть несколько скриптов, которые делают примерно одно и то же, и есть возможность собрать их в один, не урезая функциональность (возможно, просто с добавлением каких-то объектов типа тех же вейпов либо с привязкой к тегу/рефу/...), то делать это надо
Не понял, зачем в последнем скрипте тебе DeleteLocalString(), имя прекрасно поменяется и так И лишний мэйн
Хмм. я тоже придложу два простеньких скрипта для новичков. Возможно вы скажете что они СЛИШКОМ простые, но такие мелочи как мне кажется делают игру более правдоподобной и приятной
Итак
Я называю его "не лезь - убьет". Что-то вроде ловушки, но без спаса на рефлекс и срабатывает ПОСЛЕ разрушение\убийства объекта. Для замены количества\типа урона меняем
DAMAGE_TYPE_SONIC
на
DAMAGE_TYPE_COLD (например)
А циферку 300 в скрипте - на нужное количество урона
первый скрипт убрал, тк в НВН2 есть стандартный более гибкий скрипт по сдвигу элаймента, использующий параметры.
по второму: если нужно убийство игрока, лучше использовать не повреждения, а EffectDeath. А то у игрока может быть больше хитов или быть 100% имун на какой-то тип урона.
можно заменить альтернативно: ставим урон на 10000 и выбераем божественный урон. Против божественной нет иммунов. Итого выходит:
в первом посте темы указано, для чего она создана и что сюда писать. Вопросы - в других темах.
можно ли зделать так, чтобы войдя в установленую тригером локацию, над игроком появилась надпись секунды на 3. а потом ищезла и не появлялась.Я хочу зделать чёто типо когда я вхожу куданибуть,например в комнату и ГГ говорил например:милая комнатка.
tyrrael, можно просто сделать так:
а можете по подробней сказать как зделать чтобы npc тупо ходили по локации днём и ночью шли в свои дома и стояли там до дня а потом опять ходили по городу
Наверное, многим известно, что к 1.69 галочка "No interrupt", регулирующая, может ли игрок тем или иным образом прервать диалог, перестала работать. Что очень плохо для синглплеерных модулей - зачастую преждевременное прерывание диалога может либо разрушить всю игровую логику, либо нагрузить скриптера кучей лишних проверок. Чтобы этого избежать, можно воспользоваться функционалом катсцен.
Стандартные OnConversation всех NPC в конечном итоге приводят к NW_C2_DEFAULT4, который и надо поменять следующим образом, добавив две строчки (выделены жирным):
Послушайте,пожалуйста.
Мой случай происходит дома у НПС.Мне нужно,что бы этот NPC подбежал и сам начал разговор.
Мне не нужен весь скрипт,только часть.Вот я например - сделал триггер,когда герой на него наступает,над НПС появляется текст "Оу,к нам гости!",он подбегает ко мне и тупо стоит.А мне нужно,что бы появилась панель разговора.Как это осуществить?
П.С. Aiwan,спасибо за руководство игроделу.Помогает несказанно.
Вот скрипт,который я позаимствовал у "Bioware Corp.",предварительно отредактировав.
Здесь наш НПС сидит на полу и сфокусирован на любом обьекте перед ним,просто нужно его создать и указать TAG в скрипте.
void main()
{
int nAnim = ANIMATION_LOOPING_SIT_CROSS;
object oFocus = GetNearestObjectByTag([ТAG=на котором сфокусирован НПС]);
SetLocalObject(OBJECT_SELF, "FOCUS", oFocus);
SetLocalInt(OBJECT_SELF, "ANIMATED", nAnim);
ActionPlayAnimation(nAnim, 1.0, 9999.9);
}
Проверял!Работает!
1) Извиняюсь за оффтоп
2) Эта тема не для задавания вопросов, но публикации скриптов, которые могут помочь новичкам для
3) Ответ - посмотри на лексиконе (http://nwnlexicon.com) материал по ActionStartConversation - это процедура (по лексикону - функция) начала разговора. Так же там имеет смысл посмотреть Function Category - Conversation. А так же имеет смысл просто туда заглядывать, архиполезный материал у них там, хех
4) Написал бы в ЛС/ICQ, но первое пока не доступно ReZkiy, второе же не указано в профиле. Еще раз извиняюсь за оффтоп
Мастера!Подскажите пожалуйста,что нужно в этой ситуации:
Я сделал внешне эффект заклинания на пещере некроманта.(Увядание,только эффект)
Что нужно делать,что бы этот эффект исчезал после смерти некроманта???
Если кому нужно: Мой личный скрипт мертвого.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)