![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2536
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Хенч там криво получился хз почему. При переходах между локациями ему надо переприказывать, чтобы шел за тобой. Я хз почему.
|
![]()
Сообщение
#2537
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Milfes @ Sep 15 2006, 16:28) [snapback]91739[/snapback] У меня проблема. Надо что бы когда игрок наступал на тригер к нему подбегал хенчь и начинал разговор, но если хенчь далеко то он подбегает но разговор не начинает. Вот скрипт на он энтаре тригера: NSS void main() { object oPC = GetEnteringObject(); if (!GetIsPC(oPC)) return; if (GetLocalInt(OBJECT_SELF,"ACTIVATED")) return; object oIlirin = GetHenchman(oPC); if (GetTag(oIlirin)!="ilirin01") return; SetLocalInt(oIlirin,"D_LINE",GetLocalInt(OBJECT_SELF,"CONVERSATION_LINE")); SetLocalInt(OBJECT_SELF,"ACTIVATED",TRUE); DestroyObject(OBJECT_SELF,5.0); AssignCommand(oIlirin, ClearAllActions(TRUE)); AssignCommand(oPC, ClearAllActions(TRUE)); SetCutsceneMode(oPC,TRUE); AssignCommand(oIlirin, ActionStartConversation(oPC,"plot_ilitrin01")); } Может кто знает в чём ошибка. ЗЫ так же пробовал что бы хенчь сначала подбегал при момощи ActionMoveToObjecy, а только потом начинал разговор, но всё равно не получается. NSS //::////////////////////////////////////////////// //:: OnEnter am_ten_convr_npc //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Старт диалога с РС. Текст над РС - Name триггера KeyTag - если больше 0, то непись ПОДБЕЖИТ. TR_CONV_[ТАГ_НПС_ДЛЯ_ДИАЛОГА] */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Original idea By: DBColl //:: Created On: 22.04.2005 //::////////////////////////////////////////////// void main() { object oPC = GetEnteringObject(); object oTrig = OBJECT_SELF; string sTag = GetTag(oTrig); // Таг триггера string sNPC = GetStringRight(sTag, (GetStringLength(sTag)- 8)); // Таг НПС object oNPC = GetNearestObjectByTag(sNPC); string sSpeak = GetName(oTrig); // Фраза vector vD = GetPosition(oNPC) - GetPosition(oPC); float fDir = VectorToAngle(vD); int bRun = StringToInt(GetLockKeyTag(oTrig)); if (!GetIsPC(oPC)) return; if (GetLocalInt(oTrig, "HAS_OPERATED")) return; if (!GetIsObjectValid(oNPC)) return; if (GetArea(OBJECT_SELF)!=GetArea(oNPC)) return; if (GetIsEnemy(oNPC, oPC)) return; if (GetObjectType(oNPC)!=OBJECT_TYPE_CREATURE) return; FadeToBlack(oPC, FADE_SPEED_FASTEST); AssignCommand(oPC, ClearAllActions()); AssignCommand(oNPC, ClearAllActions()); SetCutsceneMode(oPC); DelayCommand(0.8, AssignCommand(oPC, SetCameraFacing(fDir, 25.0, 60.0, CAMERA_TRANSITION_TYPE_SNAP))); AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oPC)))); DelayCommand(1.2, FadeFromBlack(oPC, FADE_SPEED_FAST)); DelayCommand(2.0, AssignCommand(oPC, SetCameraFacing(fDir+35.0, 8.0, 50.0, CAMERA_TRANSITION_TYPE_SLOW))); AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPosition(oNPC)))); if (GetDeity(oNPC)!="") { int iAnim = StringToInt(GetDeity(oNPC)); DelayCommand(3.0, AssignCommand(oNPC, ActionPlayAnimation(iAnim, 0.8, 2.0))); } DelayCommand(3.5, AssignCommand(oNPC, SpeakString(sSpeak))); DelayCommand(4.5, AssignCommand(oNPC, ActionForceMoveToObject(oPC, bRun))); DelayCommand(5.5, AssignCommand(oNPC, ActionDoCommand(SetCutsceneMode(oPC, FALSE)))); DelayCommand(6.0, AssignCommand(oNPC, ActionStartConversation(oPC))); //------------------------------------------------------- SetLocalInt(oTrig, "HAS_OPERATED", TRUE); } Работает уже пару лет. Зайди в раздел хеньчмана, там есть заготовка диалога и стрингов. Все бегает все подбегает и прочее. Хеньч сложная системаскриптов. там постоянно чистят акции и прочее, сканит врагов и друзей. NSS //:://////////////////////////////////////////////
//:: Name: am_ten_evt_alish //:: Copyright © 2006 WRG! Team //::////////////////////////////////////////////// /* Скрипт персональных триггеров Алишан Основан на скрипте X2_EVT_TRIGGER */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 02.08.2006 //::////////////////////////////////////////////// #include "x0_i0_common" #include "x2_inc_banter" void main() { object oSelf = OBJECT_SELF; object oTrigger = GetEnteringObject(); object oAlishan = GetObjectByTag("AM_HEN_ALISHAN"); string sLl = GetLocalString(oSelf, "LOCAL_PC_01"); string sL2 = GetLocalString(oSelf, "LOCAL_PC_02"); if(GetMaster(oAlishan) == oTrigger) { // Если РС длаьше 20 метров то возврат. Иначе у BioWare тупо удаляется триггер... if(GetDistanceBetweenLocations(GetLocation(oTrigger), GetLocation(oAlishan)) > 20.0) return; // Локальные переменные на РС при каторых триггер не сработает if(GetLocalInt(oTrigger, sLl) || GetLocalInt(oTrigger, sL2)) { DestroyObject(oSelf); return; } string sTag = GetTag(OBJECT_SELF); AttemptInterjectionOrPopup(OBJECT_SELF, sTag, oTrigger, 0, oAlishan); } } |
![]()
Сообщение
#2538
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Lawful Neutral Раса: Человек ![]() |
Тут дело не в самом скрипте похоже, а в чём-то другом. По идее и скрипт Lеха должен работать.
|
![]()
Сообщение
#2539
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Milfes, ну вроде сказали уже, что похоже дело в хенче, глюкнуло там что-то.
|
![]()
Сообщение
#2540
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Milfes @ Sep 16 2006, 00:43) [snapback]91780[/snapback] Тут дело не в самом скрипте похоже, а в чём-то другом. По идее и скрипт Lеха должен работать. Надо делать вот что: повесить все команды на хеньчмана акциями. Через 0.1 секунду закрыть стек команд, а в конце всех команд повесить ActionDoCommand(Открываем стек команд Хеньчману) и все будет пахать как часы. проверено на разных НПС делающих что-то по скриптам. Ходящих по вейпам, стоящих на поинтах. У них сбиваются акции. Или с рандомно бродящими НПС. |
![]()
Сообщение
#2541
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Lawful Neutral Раса: Человек ![]() |
Огромное спасибо. (IMG:style_emoticons/kolobok_light/thank_you.gif) Помогло.
|
![]()
Сообщение
#2542
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
я сей сабж делал через OnUserDefined o_O
|
![]()
Сообщение
#2543
|
|
Level 2 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Всем добрый вечер. Я в скриптах почти ноль, и поэтому помучавшесь чуть чуть решил написать сюда. В общем мысль такая - есть триггер, игрок на него наступает, NPC говорит фразу (это я сделал сам...) Но после того как игрок сходит с триггера меняется переменная и в следующий раз NPC говорит уже другую фразу. Вот то, что я сам наваял, что то работает, что то нет...
NSS void main() { SetLocalInt(GetPCSpeaker(), "Int_1", 0); object oNPC=GetObjectByTag("SHIP_KONTR"); string sString_1="Текст_1!"; string sString_2="Текст_2!"; if(!(GetLocalInt(GetPCSpeaker(), "Int_1") == 1)) return ActionDoCommand(AssignCommand(oNPC,ActionSpeakString(sString_1))); return ActionDoCommand(AssignCommand(oNPC,ActionSpeakString(sString_2))); } Это на OnEnter триггера NSS void main() { SetLocalInt(GetPCSpeaker(), "Int_1", 1; } Это на OnExit Сообщение отредактировал Diamond - Sep 18 2006, 19:41 |
![]()
Сообщение
#2544
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
эм.. я ничего не понял, если честно...
вот тот скрипт, который ты по идее должен был бы написать: OnEnter триггера NSS void main() { // берем того, кто наступил на триггер (у тебя тут GetPCSpeaker был.. совсем не в тему) object oPC = GetEnteringObject(); // если наступил на триггер не игрок (что более чем реально) if (!GetIsPC(oPC)) return; // выходим из скрипта // теперь берем НПС, который говорит фразу // чтобы унифицировать, тэг НПС храним в локальной переменной NPC_TAG, которая записана на триггере object oNPC = GetNearestObjectByTag(GetLocalString(OBJECT_SELF,"NPC_TAG")); // теперь берем номер строки, которую нам надо сказать (нумерация идет с 0) int nNumber = GetLocalInt(OBJECT_SELF,"NUMBER"); // если номер текущей строки -1 (это означает, что кончились строки) if (nNumber == -1) return; // мы выходим из скрипта // теперь берем саму строчку.. строки это локальные строковые переменные на триггере STRING_0, STRING_1 и тд string sString = GetLocalString(OBJECT_SELF,"STRING_"+IntToString(nNumber)); // увеличивем указатель номера строки на 1. (чтоб в след. раз взять следующую строку) SetLocalInt(OBJECT_SELF,"NUMBER",nNumber++); // если строка не пустая, говорим ее if (sString!="") AssignCommand(oNPC,SpeakString(sString)); // а если пустая, значит строки кончились. Тады ставим указатель на -1 else SetLocalInt(OBJECT_SELF,"NUMBER",-1); } __ таким образом получаем: - ставишь триггер - ставишь в onEnter этот скрипт - в локальную строковую переменную NPC_TAG пишешь тэг нпс (в данном случае у тебя это SHIP_KONTR) - в локальные строковые переменные STRING_0, STRING_1 и тд (скока хочешь, хоть STRING_10000) пишешь нужные тебе фразы. готово. вопросы? |
![]()
Сообщение
#2545
|
|
Level 2 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Всё отлично работает! Спасибо. Еще один маленький вопрос - как сделать задержку между появлениями фраз, а то если ходить по комнате они слишком часто появляются.
|
![]()
Сообщение
#2546
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
DelayCommand ставь.. например так:
AssignCommand(oNPC,DelayCommand(SpeakString(sString))); или ты про то, чтобы он не постоянно говорил, а скажем в след. раз не раньше, чем через 2 минуты. если да, то тут придется скрипт модернизировать. |
![]()
Сообщение
#2547
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
NSS /* ЭТО В НАЧАЛО СКРИПТА */
if(GetLocalInt(OBJECT_SELF, "DELAY") == 1) return; // Если есть локалка DELAY на триггере то он не сработает. /* ЭТО В КОНЕЦ */ SetLocalInt(OBJECT_SELF,"DELAY", 1); // присвоим локалку ожидания float f = IntToFloat(Random(15)+5); // Сделаем плавающей время ожидания сгенерировав случайное число и конвертнув его в float // при этом мы прибавили 5 секунд что бы точно не скзал фразу сразу при выпадении 1 или 0 DelayCommand(f,SetLocalInt(OBJECT_SELF,"DELAY", 0)); // Получаем искомое случайное время задержки. Присваиваем 0 локалке триггер опять работает. |
![]()
Сообщение
#2548
|
|
Level 2 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
QUOTE чтобы он не постоянно говорил, а скажем в след. раз не раньше, чем через 2 минуты. Ну в общем то да, чтобы прошло секуд 25. |
![]()
Сообщение
#2549
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
тады самое эффективное, это временно делать триггер неактивным.
NSS void main()
{ // если заблокирован - выходим if (GetLocalInt(OBECT_SELF,"STOP")) return; // берем того, кто наступил на триггер (у тебя тут GetPCSpeaker был.. совсем не в тему) object oPC = GetEnteringObject(); // если наступил на триггер не игрок (что более чем реально) if (!GetIsPC(oPC)) return; // выходим из скрипта // теперь берем НПС, который говорит фразу // чтобы унифицировать, тэг НПС храним в локальной переменной NPC_TAG, которая записана на триггере object oNPC = GetNearestObjectByTag(GetLocalString(OBJECT_SELF,"NPC_TAG")); // теперь берем номер строки, которую нам надо сказать (нумерация идет с 0) int nNumber = GetLocalInt(OBJECT_SELF,"NUMBER"); // если номер текущей строки -1 (это означает, что кончились строки) if (nNumber == -1) return; // мы выходим из скрипта // теперь берем саму строчку.. строки это локальные строковые переменные на триггере STRING_0, STRING_1 и тд string sString = GetLocalString(OBJECT_SELF,"STRING_"+IntToString(nNumber)); // увеличивем указатель номера строки на 1. (чтоб в след. раз взять следующую строку) SetLocalInt(OBJECT_SELF,"NUMBER",nNumber++); // если строка не пустая, говорим ее if (sString!="") { AssignCommand(oNPC,SpeakString(sString)); // блокируем триггер SetLocalInt(OBJECT_SELF,"STOP",1); // снимаем блокировку через 25с. DelayCommand(25.0,SetLocalInt(OBJECT_SELF,"STOP",0)); } // а если пустая, значит строки кончились. Тады ставим указатель на -1 else SetLocalInt(OBJECT_SELF,"NUMBER",-1); } |
![]()
Сообщение
#2550
|
|
Level 2 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Теперь всё совсем как нужно! Ура!
|
![]()
Сообщение
#2551
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Люди. Как сделать так чтобы каждая раса начинала в разном городе. Типа челове в Человеческом городе. Эльф в эльфийском. и.т.д.
|
![]()
Сообщение
#2552
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Написать простой скрипт, который проверяет расу игрока и кидает того в нужное место:
NSS // Под точкой старта, создаем триггер и на onEnter, вешаем код: void main() { string sRace; object oEnter = GetEnteringObject(); int nRace =GetRacialType(oEnter); int nInt = GetLocalInt(oEnter, "nEnterPlayer"); if (nInt == 1) return; if (GetIsPC(oEnter) == FALSE) return; SetLocalInt(oEnter, "nEnterPlayer", 1); switch (nRace) { case RACIAL_TYPE_DWARF: sRace = "DWARF"; break; case RACIAL_TYPE_GNOME: sRace = "GNOME"; break; case RACIAL_TYPE_HALFELF: sRace = "HALFELF"; break; case RACIAL_TYPE_HALFLING: sRace = "HALFLING"; break; case RACIAL_TYPE_HALFORC: sRace = "HALFORC"; break; case RACIAL_TYPE_HUMAN: sRace = "HUMAN"; break; case RACIAL_TYPE_ELF: sRace = "ELF"; break; } AssignCommand(oEnter, ClearAllActions()); AssignCommand(oEnter, ActionJumpToObject(GetWaypointByTag("WP_"+sRace+""))); } Теперь о его настройке. Для каждой рассы необходимо создать вайпоинт c тэгом: WP_+НАЗВАНИЕ_РАССЫ и разместить в нужном месте. Т.е скажем для людей это будет: WP_HUMAN, который соответственно будет находится в людском городе. Сообщение отредактировал Dik Morris - Sep 22 2006, 09:46 |
![]() ![]()
Сообщение
#2553
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Если честно, то я не въехал. (IMG:style_emoticons/kolobok_light/nea.gif)
Я имею ввиду. Что при создании нового перса он сразу начинается в определённом городе. Если ты написал то что мне надо. То я попробовал чот неправильно. Я давно не создавал все позабывал. Поэтому не ругай меня за мою тупость. |
![]()
Сообщение
#2554
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Кстати, какую-нить расу можно в скрипте не указывать. Тогда ее представитель появется в точке старта. Не поставить ее не получится, так что че ей просто так стоять? (IMG:style_emoticons/kolobok_light/smile.gif)
|
![]()
Сообщение
#2555
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
-fenix-, логично. (IMG:style_emoticons/kolobok_light/smile.gif)
DarkDeivel, QUOTE Что при создании нового перса он сразу начинается в определённом городе именно это и написал. (IMG:style_emoticons/kolobok_light/smile.gif) PS: в скрипте была небольшая ошибка, но я исправил. Читай пост еще раз. И описание. (IMG:style_emoticons/kolobok_light/wink3.gif) |
![]()
Сообщение
#2556
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
ВОт код я повешал. Ты писал
Теперь о его настройке. Для каждой рассы необходимо создать вайпоинт c тэгом: WP_+НАЗВАНИЕ_РАССЫ и разместить в нужном месте. Т.е скажем для людей это будет: WP_HUMAN, который соответственно будет находится в людском городе. А вот WP_HUMAN куданить в скрипте записывать надО?? (IMG:style_emoticons/kolobok_light/biggrin.gif) |
![]()
Сообщение
#2557
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
не в скрипте.
- берешь ЛЮБОЙ вэйпоинт из палитры - ставишь его туда, где будут люди появляться - даешь ему тэг WP_HUMAN дальше по аналогии с другими рассами. что не ясно то? |
![]() ![]()
Сообщение
#2558
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
QUOTE(Lex @ Sep 22 2006, 09:59) [snapback]92436[/snapback] не в скрипте. - берешь ЛЮБОЙ вэйпоинт из палитры - ставишь его туда, где будут люди появляться - даешь ему тэг WP_HUMAN дальше по аналогии с другими рассами. что не ясно то? Всё ясно. Все работает. (IMG:style_emoticons/kolobok_light/declare.gif) |
![]()
Сообщение
#2559
|
|
Level 2 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Пара вопросов по скриптам.
Есть скрипт, который сажает непися на стул (то что запостил в первый раз это был полный бред...) NSS void main() { ActionSit (GetNearestObjectByTag("SIT_STOOL", OBJECT_SELF)); } Но при разговоре с игроком непись ясное дело встаёт. Сам вопрос: как надо поменять скрипт, чтобы после завершения диалога непись опять садился? И ещё вопрос: Что надо поставит на триггер, чтобы когда на него наступит игрок к нему подбегал непись и начинал диалог, но этого бы не происходило пока переменная "Перем" скажем не равна 1? Сообщение отредактировал Diamond - Sep 23 2006, 15:01 |
![]()
Сообщение
#2560
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
NSS if (IsInConversation(OBJECT_SELF)) return; // если разговариваем - выход if (GetIsInCombat(OBJECT_SELF)) return; // если в бою - выход // в остальных случаях садимся ActionSit (GetNearestObjectByTag("SIT_STOOL", OBJECT_SELF)); Этот блок поставить в ХБ скрипт или в ЮД, в ту часть, которая отвечает за ХБ. скрипт для триггера и диалога НПС писали уже раз 100. поищи. |
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 12:47 |