Скрипты, Все вопросы и ответы по скриптам |
Здравствуйте, гость ( Вход | Регистрация )
Скрипты, Все вопросы и ответы по скриптам |
Jun 2 2006, 21:15
Сообщение
#2301
|
|
Level 8 Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ |
Lex, попробовал - не сработало. Если верить лексикону, то получается, что PlaySound() не выполняется до тех пор, пока в стеке что-то есть. Глюк биоваревский. Т.е. очередь действий кончилась - начался звук.
Поэтому нужно делать так, чтобы PlaySound срабатывал, когда стек пуст, а затем он начинал заполняться. Разница в доли секунды получится, и глазу юзера будет незаметна. |
Jun 6 2006, 16:35
Сообщение
#2302
|
|
Level 3 Класс: Паладин Характер: Lawful Good Раса: Человек |
NSS void ANIMATION(object oD) { int A=0; float T,S; switch (Random(8)+1) { case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break; case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break; case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break; case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; } if (A==0) return; AssignCommand(oD,PlayAnimation(A,S,T)); } void DIALOG(object oD1,object oD2) { string s1="",s2=""; string ya = GetName(GetObjectByTag("ya")); switch (Random(30)) { case 0: s1="×òî ìû òåïåðü äåëàòü-òî áóäåì?";s2=" Íåçíàé! Âðåìÿ ïîêàæåò...";break; case 1: s1="À ó íàñ åñòü ÷å ïîåñòü òî, à?";s2="Ñõîäèì â òàâåðíó, òàì äîëæíû áûòü áîè, íàâåðíÿêà ìîíåòêè òî ïîñûïÿòñÿ íà çåìëþ, õåõå...";break; case 2: s1="Ó ìåíÿ â æèâîòå óð÷èò";s2="Òàê ñõîäè, ïîåøü, ñòàðóøêà äðÿõëàÿ ìîÿ!";break; case 3: s1="À íàøà äî÷êà íàâåðíî æèâåò ñ÷àñòëèâîé æèçíü...";s2="Ïðèøåë áû ÿ äîìîé íà ïÿòü ìèíóò ðàíüøå, ÿ áû èç Ñàí÷åçà âñþ äóðü òî âûáèë!! Ýõ ÿ åìó...";break; } AssignCommand(oD1,SpeakString(s1)); AssignCommand(oD2,DelayCommand(5.0,SpeakString(s2))); } void main() { object oPC = GetFirstPC(); if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; object oD1 = GetNearestObjectByTag("oldman1"); object oD2 = GetNearestObjectByTag("oldwoman1"); if (GetIsInCombat(oD1)) return; if (GetIsInCombat(oD2)) return; if ( (IsInConversation(oD1)) || (IsInConversation(oD2)) ) return; if (GetDistanceToObject(oPC)>10.0) return; AssignCommand(oD1,SetFacingPoint(GetPosition(oD2))); AssignCommand(oD2,SetFacingPoint(GetPosition(oD1))); DIALOG(oD1,oD2); ANIMATION(oD1); ANIMATION(oD2); } Два вопроса. 1 - почему не составляется(хотя в игре все ОК) 2 - почему НПСы болтают вроде бы, но не слова не появляется!? PS 1 - при английских словах все ОК 2 - при английских словах такаяже лажа(IMG:style_emoticons/kolobok_light/sad.gif) |
Jun 6 2006, 17:04
Сообщение
#2303
|
|
Вечно меняющийся Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] |
1.
Избавляйся от маленькой буквы я, либо ставь патч от dumbo. NSS ... "Избавл"+ya+"йся" ... 2. Ты точно указал таги NPC ? Сообщение отредактировал Dik Morris - Jun 6 2006, 17:06 |
Jun 6 2006, 17:11
Сообщение
#2304
|
|
Level 5 Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
QUOTE(..::SERGO::.. @ Jun 6 2006, 17:35) [snapback]83853[/snapback] switch (Random(30)) а кейса 4. У тебя вероятность 4 к 30 что раз в 6 секунд они что-то скажут. + смотри, там же стоит проверка на дистанцию: те если игрок далеко, то фраз видно не будет. ЗЫ: хм.. лучше поменять очередность.. анимация, потом проверка на дистанцию, потом слова. Так реалистичнее |
Jun 7 2006, 06:37
Сообщение
#2305
|
|
Level 9 Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага |
QUOTE(..::SERGO::.. @ Jun 6 2006, 17:35) [snapback]83853[/snapback] Два вопроса. 1 - почему не составляется(хотя в игре все ОК) 2 - почему НПСы болтают вроде бы, но не слова не появляется!? PS 1 - при английских словах все ОК 2 - при английских словах такаяже лажа SERGO, у тебя не правильно составлены стринги. Смотри как надо, и правь последнею строку сам. Если скрипт стоял на ХБ перса, то скрипт поэтому и не работал, он написан у тебя для работы с третьего перса. Маленький совет: копируй скрипт при русском шрифте в обоих редакторах, как в редакторе скриптов, так и в текстовом редакторе, должен стоять русский шрифт. NSS void ANIMATION(object oD)
{ int A=0; float T,S; switch (Random(5)+1) { case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break; case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break; case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break; case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; } if (A==0) return; AssignCommand(oD,PlayAnimation(A,S,T)); } void DIALOG(object oD1,object oD2) { string s1="",s2=""; string ya = GetName(GetObjectByTag("ya")); switch (Random(30)) { case 0: s1="Что мы теперь делать-то будем? ";s2="Не знаю! Врем"+ya+" покажет…";break; case 1: s1="А у нас есть че поесть-то, а? ";s2="Сходим в таверну, там должны быть бои, навер"+ya+"ка монетки-то посып"+ya+"тс"+ya+" на землю, хе-хе…";break; case 2: s1="У мен"+ya+" в животе урчит… ";s2="Так сходи, поешь, старуха др"+ya+"хла"+ya+" мо"+ya+"!";break; case 3: s1="А наша дочка наверно живет счастливой жизнью… ";s2="Пришел бы Я домой на пЯть минут раньше, Я бы из Санчеса всю дурь то выбил!! Эх Я ему…";break; } AssignCommand(oD1,SpeakString(s1)); AssignCommand(oD2,DelayCommand(5.0,SpeakString(s2))); } void main() { object oPC = GetFirstPC(); if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; object oD1 = GetNearestObjectByTag("oldman1"); object oD2 = OBJECT_SELF; if (GetIsInCombat(oD1)) return; if (GetIsInCombat(oD2)) return; if (IsInConversation(oD1) || IsInConversation(oD2)) return; if (GetDistanceToObject(oPC)>10.0) return; AssignCommand(oD1,SetFacingPoint(GetPosition(oD2))); AssignCommand(oD2,SetFacingPoint(GetPosition(oD1))); DIALOG(oD1,oD2); ANIMATION(oD1); ANIMATION(oD2); } Сообщение отредактировал gennady - Jun 7 2006, 15:17 |
Jun 7 2006, 12:04
Сообщение
#2306
|
|
Level 3 Класс: Паладин Характер: Lawful Good Раса: Человек |
QUOTE object oD2 = OBJECT_SELF; Так я же ставил на "ХБ невидимого обьекта между ними" Не пашет, все есть, токо слов не видно(IMG:style_emoticons/kolobok_light/sad.gif) |
Jun 7 2006, 14:35
Сообщение
#2307
|
|
Level 5 Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
QUOTE(gennady @ Jun 7 2006, 07:37) [snapback]83894[/snapback] Если скрипт стоял на ХБ перса, то скрипт поэтому и не работал, он написан у тебя для работы с третьего перса он написан для стороннего контроллера и на его (контроллера) ХБ и стоит. QUOTE(..::SERGO::.. @ Jun 7 2006, 13:04) [snapback]83897[/snapback] Не пашет, все есть, токо слов не видно я тебе сказал, в чем дело скорее всего. У тебя 4 пары фраз? Ну так ставь Рандом(5) а не 30. ____ кстати делай фразы покороче. Большие объемы текста выглядят не очень. QUOTE(gennady @ Jun 7 2006, 07:37) [snapback]83894[/snapback] if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; // Эта проверка здесь лишнЯЯ. Есть проверка дистанции… не лишняя. Проверка дистанции, если игрок не в локации, даст -1.0, а это меньше 10. Так что проверка на своем месте. Тем более читай выше (поставить проверку дистанции после анимации, но до текста) __ ЗЫ: у меня в Тсурле этот скрипт и его модификации различные пашут без проболем. Если проблема не в том, что я написал выше, у тебя верные тэги и условия соблюдены, в ХБ неписей ничего сбивающего не стоит, то я хз, почему у тебя не работает. |
Jun 7 2006, 14:51
Сообщение
#2308
|
|
Level 9 Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага |
QUOTE(..::SERGO::.. @ Jun 7 2006, 13:04) [snapback]83897[/snapback] Так я же ставил на "ХБ невидимого обьекта между ними" Не пашет, все есть, токо слов не видно У меня скрипт пахал на ХБ перса, по скрипту я понял, что у тебя он стоял на невидимом объекте, для данного скрипта он в принципе лишний. Можешь вернуть NSS object oD2 = GetNearestObjectByTag("oldwoman1"); Будет усё пахать, только правильно настрой свойства невидимого объекта. Поставь галку - сюжет Убери галку - статик Убери галку – используемый Но может и глючить, желательно все же ставить «используемый», т.ч. лучше выкидай этот объект. Проверка дистанции, если игрок не в локации, даст -1.0, а это меньше 10. Точно, Лекс прав. Ну, и голова! Сообщение отредактировал gennady - Jun 7 2006, 15:14 |
Jun 7 2006, 14:59
Сообщение
#2309
|
|
Level 5 Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
можно просто без галки статик, у меня все контроллеры такие. Используемый - не обязательно совершенно. Не глючит при этом никогда.
|
Jun 8 2006, 10:59
Сообщение
#2310
|
|
Level 3 Класс: Паладин Характер: Lawful Good Раса: Человек |
АА! в задницу все! (IMG:style_emoticons/kolobok_light/declare.gif) Можно ли это заточить только под одного персонажа(типа торговца, который выкрикивает весь день)
|
Jun 8 2006, 11:35
Сообщение
#2311
|
|
Вечно меняющийся Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] |
NSS void ANIMATION(object oD)
{ int A=0; float T,S; switch (Random(5)+1) { case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break; case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break; case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break; case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break; } if (A==0) return; AssignCommand(oD,PlayAnimation(A,S,T)); } void DIALOG(object oD1) { string s1=""; string ya = GetName(GetObjectByTag("ya")); switch (Random(4)+1) { case 1: s1="text"; break; case 2: s1="text"; break; case 3: s1="text"; break; case 4: s1="text"; break; } AssignCommand(oD1,SpeakString(s1)); } void main() { object oPC = GetFirstPC(); if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; object oD2 = OBJECT_SELF; if (GetIsInCombat(oD2)) return; if (IsInConversation(oD2)) return; if (GetDistanceToObject(oPC)>10.0) return; DIALOG(oD2); ANIMATION(oD2); } Сообщение отредактировал Dik Morris - Jun 8 2006, 11:40 |
Jun 8 2006, 13:11
Сообщение
#2312
|
|
Level 3 Класс: Волшебник Характер: Neutral Evil Раса: Человек |
NSS void main() { object oPC = OBJECT_SELF; if ((GetLevelByClass(CLASS_TYPE_PALEMASTER, oPC)>0)) { int nLevel = GetLevelByClass(CLASS_TYPE_PALEMASTER, OBJECT_SELF); effect eSummon; float fDelay = 3.0; int nDuration = nLevel; if (nLevel >= 7) eSummon = EffectSummonCreature("NW_S_DOOMKGHT",VFX_FNF_SUMMON_UNDEAD); else eSummon = EffectSummonCreature("NW_S_GHAST",VFX_FNF_SUMMON_UNDEAD); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, GetSpellTargetLocation(), HoursToSeconds(nDuration)); } Привожу скипт для объяснения ситуации, сам скрипт работает, но у меня проблемы вот с чем. Хочется внести своего самона, ну например чтобы при 10 лвлах ПМа вылезал Командир Дум Найтов. Когда я ставлю его со стандартным его тегом, он вылезает, однако на нем нету скриптов хенчмана(или как их правильно назвать), поэтому управлять им не возможно. Я добавляю ему их, меняю таг, соответствено он перемещается из стандартных монстров, в сделаных мной, и когда я добавляю его в этот скрипт вместо командира вылезает голый дварф с 1 хп и без имени, мобы на него не реагируют (IMG:style_emoticons/kolobok_light/declare.gif) Объясните пожалуйста как с этим быть. P.S. Если запостил не в тот раздел, прошу прощения, пока еще не разобрался с форумом. Сообщение отредактировал Mandrake - Jun 8 2006, 13:25 |
Jun 8 2006, 16:05
Сообщение
#2313
|
|
Level 5 Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
все, что тебе нужно это указать резреф твоего ДумКнайта в функции EffectSummonCreature. (резреф, не тэг. Это важно.) те что-то такое
NSS void main()
{ object oPC = OBJECT_SELF; if ((GetLevelByClass(CLASS_TYPE_PALEMASTER, oPC)>0)) { int nLevel = GetLevelByClass(CLASS_TYPE_PALEMASTER, OBJECT_SELF); string sSummon; float fDelay = 3.0; int nDuration = nLevel; if (nLevel >= 10) // с 10 левела твой командир sSummon = "твой резреф"; else if (nLevel >= 7) // с 7 по 10 просто думкнайт sSummon = "NW_S_DOOMKGHT"; else // до 7го гаст. sSummon = "NW_S_GHAST"; ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectSummonCreature(sSummon,VFX_FNF_SUMMON_UNDEAD), GetSpellTargetLocation(), HoursToSeconds(nDuration)); } |
Jun 8 2006, 20:02
Сообщение
#2314
|
|
Level 3 Класс: Волшебник Характер: Neutral Evil Раса: Человек |
Огромное спасибо (IMG:style_emoticons/kolobok_light/thank_you.gif) Теперь все стало работать. Я просто думал раз стандартные мобы указаны через тэги, то и мои должны быть через них (IMG:style_emoticons/kolobok_light/smile.gif)
|
Jun 8 2006, 20:06
Сообщение
#2315
|
|
Level 5 Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
у стандартных совпадаюи тэги и рефы. Тебе тоже стоит делать, чтобы совпадали. Обычно правило такое: реф маленькими буквами, тэг - большими. (и одинаковые по содержанию)
|
Jun 8 2006, 20:16
Сообщение
#2316
|
|
Level 3 Класс: Волшебник Характер: Neutral Evil Раса: Человек |
Спасибо, запомню.
|
Jun 9 2006, 11:29
Сообщение
#2317
|
|
Лорд AxisTown'a Класс: Монах Характер: Lawful Good Раса: Дварф NWN: Маппинг |
(IMG:style_emoticons/kolobok_light/biggrin.gif)
QUOTE у стандартных совпадаюи тэги и рефы. Тебе тоже стоит делать, чтобы совпадали. Обычно правило такое: реф маленькими буквами, тэг - большими. (и одинаковые по содержанию) добавлю и я свои 5 юаней (IMG:style_emoticons/kolobok_light/biggrin.gif) ..а еще лучше -делай кустомные итемы с одинаковым, полностью совпадающим, тэгом и ресрефом( оба маленькими латинскими буквами и не длинее 16 симболов) - тогда не прийдеться задумываться при всяких сравнениях, созданиях и проч (IMG:style_emoticons/kolobok_light/yes3.gif) |
Jun 9 2006, 20:07
Сообщение
#2318
|
|
Level 3 Класс: Волшебник Характер: Neutral Evil Раса: Человек |
Еще один вопрос, я теме для новичков просил помочь, но наверное не заметили там. Если не трудно, просьба помочь. Ситуация такая, хочу в своем модуле создать локации что-то типа "Дом Теней", где мобы были бы ШД. Соотвествено нужно на onSpawn, onHeartbeet и onCombatRoundEnd поставить скрипты. Я руководствуясь логикой сделал нечто подобное(скрипт на комбат раунд энд):
NSS object oTarget = OBJECT_SELF; object oEnemy = GetLastAttacker(); if (GetStealthMode(oTarget) == STEALTH_MODE_DISABLED) { ActionMoveAwayFromObject(oEnemy, TRUE, 10.0f); AssignCommand(oTarget, UseStealthMode()); DelayCommand(5.2,AssignCommand(oTarget, ActionWait(3.0))); DelayCommand(7.1, AssignCommand(oTarget, ActionAttack(oEnemy))); } Это один из вариантов, я пробывал ставить ClearAllActions() в начале, я пробывал и без отбегания от объекта, но не выходит (IMG:style_emoticons/kolobok_light/aggressive.gif) Чего я смог достичь, так это только того чтобы моб уходил в хайд при виде игрока, а потом атаковал. А также во время атаки он как бы уходить в хайд пытался, но сразу же атаковал. В общем полная неразбериха. (IMG:style_emoticons/kolobok_light/vava.gif) Помогите пожалуйста разобраться с ситуацией, может кто работал с подобными скриптами или же может я не с теми функциями работаю. Буду весьма признателен. P.S. Есть задумка, что нужно как то делать, чтобы в конце каждого раунда моб из режима атаки переходил в состояние покоя, т.к. когда я становлюсь для него не видимым он выполняет задание отбежать от меня на 10 метров =) |
Jun 9 2006, 20:33
Сообщение
#2319
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Что то я не понял. (IMG:style_emoticons/kolobok_light/unknw.gif) Mandrake, видишь ли, кроме твоих скриптов работает тонна скриптов биовар, это надо учитывать. Опиши финальную задачу. ЗАЧЕМ ТЕБЕ ЭТО. Опиши задачу конкретно от А до Я. Что делает НПС, что РС.
|
Jun 9 2006, 21:05
Сообщение
#2320
|
|
Level 3 Класс: Волшебник Характер: Neutral Evil Раса: Человек |
Хорошо.
Задача РС понятно, убить НПС =) Мне это нужно, чтобы разнообразить деятельность мобов, а также воплатить в реальность задумку о териториях, скажем домах или лесах, где приключенца ждали бы хайдеры(ну скажем дом теней, действующие персонажи: души бывших убийц, игрок попав в такой дом должен быть все время готов нарваться на ловушку, встретиться врага появляющегося из тени и т.д.) К самому главному, задача НПС. Я не хочу удалять скрипты биоварей из выше указаных мной ситуациях,я просто хочу добавить к ним следующие вещи. Задачи НПС которые мне хочется воплоить в жизнь. 1. Спаун в хайде 2. В случае обнаружения игрока также атака из хайда 3. Во время боя после сника уход обратно в режим хайда, для реалистичности, чтобы нпс отбегал на расстояние и как бы на бегу пропадал, ну это так опционально, достаточно, чтобы просто после 1го сника он опять ушел в хайд. 4. После допустим убийста игрока, опять уход в хайд и продолжать жить дальнейшей жизнью. Надеюсь теперь мои мысли понятны (IMG:style_emoticons/kolobok_light/unsure.gif) |
Jun 10 2006, 03:42
Сообщение
#2321
|
|
Level 12 Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] |
-- AssignCommand(oTarget, UseStealthMode()); не заставляет НПС входить в хайд
кстати, вот что он делает: NSS // If stealth mode is active, turn on the appropriate skills. void UseStealthMode() { // SetActionMode(OBJECT_SELF,ACTION_MODE_STEALTH,TRUE); } попробуй NSS void ActionUseSkill(int nSkill, object oTarget, int nSubSkill=0, object oItemUsed=OBJECT_INVALID ) -- ActionMoveAwayFromObject(oEnemy, TRUE, 10.0f); - если игрок последует за монстром (а это наверняка так и будет), то экшн может не завершиться, и следующий экшн (по, собственно, уходу в хайд) не начаться. попробуй NSS АctionMoveAwayFromLocation(GetLocation(GetLastAttacker()), TRUE, 10.0f); -- QUOTE 1. Спаун в хайде хайд при спауне. |
Jun 10 2006, 09:07
Сообщение
#2322
|
|
Level 9 Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага |
QUOTE(Mandrake @ Jun 9 2006, 21:07) [snapback]84280[/snapback] Еще один вопрос, я теме для новичков просил помочь, но наверное не заметили там. Если не трудно, просьба помочь. Ситуация такая, хочу в своем модуле создать локации что-то типа "Дом Теней", где мобы были бы ШД. Соотвествено нужно на onSpawn, onHeartbeet и onCombatRoundEnd поставить скрипты. Я руководствуясь логикой сделал нечто подобное(скрипт на комбат раунд энд): Если я правильно вас понял, то вам нужна подлая атака из невидимого положения, по типу скрытых атак Baldur’s Gate. Завалялось тут у меня пара скриптов… Один на OnSpawn, другой на ХБ персонажа, начально персонаж фракции «Простолюдин». на OnSpawn NSS // *** ТЕНЕВАЯ АТАКА *** OnSpawn void main() { object oTarget = OBJECT_SELF; effect eCUT = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCUT, oTarget); } на ХБ персонажа NSS // *** ТЕНЕВАЯ АТАКА *** // Снимаем эффект void DelEffectOnPC(object oObject) { effect eOne = GetFirstEffect(oObject); while (GetIsEffectValid(eOne)) { RemoveEffect(oObject, eOne); eOne = GetNextEffect(oObject); } } // Генерируем случайную точку location CreateRandomLocation(object oTarget, float fRadius, int bOnLine = TRUE) { if(!bOnLine) fRadius=IntToFloat(Random(FloatToInt(fRadius))); float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget))); float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget))); float fRndomAngle=IntToFloat(Random(360)); location lNEW=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadius*sin(fRndomAngle)),360.0); return lNEW; } //::///////////////////////////////////////////// void main() { object oPC = GetFirstPC(); object oTarget = OBJECT_SELF; if (GetDistanceBetween(oPC, oTarget) > 10.0) return; else if (GetLocalInt(oTarget, "ATTACK") == 0) { location lFree = CreateRandomLocation(oTarget, 5.0); // Генерим точку в радиусе 5 метров effect eCUT = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); effect eDamage = EffectDamage(GetCurrentHitPoints(oPC)/7); ChangeToStandardFaction(oTarget, STANDARD_FACTION_HOSTILE); // Менaем фракцию на враждебный; AssignCommand(oTarget, ClearAllActions(TRUE)); AssignCommand(oTarget, ActionJumpToObject(oPC, TRUE)); DelayCommand(1.0, AssignCommand(oTarget, ActionAttack(oPC))); DelayCommand(1.0, DelEffectOnPC(oTarget)); // Снимаем эффект DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC)); // Наносим удар DelayCommand(1.5, SendMessageToPC(oPC, "<cу >ВАМ НАНЕСЛИ ПОДЛЫЙ УДАР</c>")); DelayCommand(2.0, AssignCommand(oPC, ActionAttack(oTarget))); DelayCommand(9.0, SurrenderToEnemies()); // Снимаем атаку //DelayCommand(9.3, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), oTarget)); DelayCommand(9.3, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eCUT, oTarget)); DelayCommand(9.5, AssignCommand(oTarget, ActionMoveToLocation(lFree, TRUE))); SetLocalInt(oTarget,"ATTACK", 1); DelayCommand(18.5, SetLocalInt(oTarget,"ATTACK", 0)); } } Если хотите, то можете поставить другую невидимость, по своему вкусу. Сообщение отредактировал gennady - Jun 10 2006, 09:09 |
Jun 10 2006, 09:11
Сообщение
#2323
|
|
Миловидный Бегрюссунг Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени |
Mandrake, не поверишь (IMG:style_emoticons/kolobok_light/smile.gif) ВСЕ ЭТО ДААВНО НАПИСАНО БИОВАР и работает. Если тебе не в лом, глянь мой скрипт спавна. Могу тут поместить. Настрой его по уму, не поленись прочти комменты. И все о чем ты мечтаешь будет работать. Патрулирование в хайде по точкам, атака из хайда. И прочее. Я его где-то уже выкладывал, но этот я малость доработал.
NSS //:://///////////////////////////////////////////// //:: 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 //::////////////////////////////////////////////// //-------------------------------------------------------------------------- // Запускает скрипты на объект при локальном стринге //-------------------------------------------------------------------------- string sRunScript = GetLocalString(OBJECT_SELF, "RUN_SCRIPT"); if(sRunScript!="") { ExecuteScript(sRunScript, OBJECT_SELF); } //============================================================================== // Стандартные еванты скрипта 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);} //============================================================================== // Добавляем свои настройки для персональных нужд. //============================================================================== //-------------------------------------------------------------------------- // Создаем автоматически группы разговаривающих рандомно НПС, используя // библиотеку SlavaZ-а. Теперь создавая поинты фразы, учитывайте, что группы // НПС будут Speaker+Локалтьная переменная "FLAG_WP_SPEAK". Если // Она будет ровна 3, то значение (Value) строки на Waypoint с именем // "NAME_wp_speak" должны начинаться с Speaker3. Читайте мануал Славы... //-------------------------------------------------------------------------- int iSpeaker = GetLocalInt(OBJECT_SELF, "FLAG_WP_SPEAK"); if (iSpeaker >= 1) // Если локалка равна 1 или больше, то... { /* Присвоим этого НПС к группе Speaker+локалка "FLAG_WP_SPEAK" */ SetLocalString(OBJECT_SELF, "SpeakGroup", "Speaker"+(IntToString(iSpeaker))); } //-------------------------------------------------------------------------- // Садим на стул или закрываем стэк команд. + UserDefained скрипт сидения. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CHAIR") == TRUE) { SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT); ActionSit(GetNearestObjectByTag("SIT_CHAIR")); } if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CHAIR") == 2) { ActionSit(GetNearestObjectByTag("SIT_CHAIR")); SetCommandable(FALSE); } //-------------------------------------------------------------------------- // Садим НПС на землю. + UserDefained скрипт сидения. //-------------------------------------------------------------------------- if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CROSS") == TRUE) { SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT); SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT); SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.9); } //-------------------------------------------------------------------------- // Присваиваем НПС координаты, что бы он стоял лицом в одном направлении. //-------------------------------------------------------------------------- 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)); } } В слоте хертбит ищем функцию: NSS // If we have the 'constant' waypoints flag set, walk to the next // waypoint. else if ( GetWalkCondition(NW_WALK_FLAG_CONSTANT) ) { WalkWayPoints(); } Заменяем на это: NSS //======================== 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 ====================================== И все. Настрой и сохрани скрипты с другими именами, не правь стандартные. Некоторые строки тебе не нужны. Например деления на спекеров, сидение и прочее. Это надо мне. Думаю выкинешь сам. Локалки вешаются в редакторе на НПС. |
Jun 10 2006, 10:43
Сообщение
#2324
|
|
Level 3 Класс: Волшебник Характер: Neutral Evil Раса: Человек |
azathoth, gennady спасибо большое, сейчас буду примеряться (IMG:style_emoticons/kolobok_light/smile.gif)
Aiwan, спасибо и тебе большое. (IMG:style_emoticons/kolobok_light/thank_you.gif) Насчет Биоварей скажу, что пока не научился полностью понимать ими написаное, поэтому в большинстве случаев стараюсь придумать уже давно придуманое (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Добавил: Поизучал я твой спаун скрипт Aiwan, действительно все что хотел по поводу хайдеров сделал (IMG:style_emoticons/kolobok_light/good.gif) Тут мой пытливый ум решил поэксперементировать дальше и у меня возникли кое какие наблюдения. 1. Это с так называемыми гвардами, которые в режиме поиска. Они когда видят меня почему то не сбрасывают режим, а как инвалиды медлено в мою сторону ползут. Режим естестсвенно скидывается после попадания по мне, т.е. будуч магом можно запросто порхать даже без хаста вокруг них и пулять спелами =) 2. Это теже гварды, которые не возвращаются к режиму поиска после атаки. 3. Это хайдеры, которые идут медлено в хайде к тебе, если ты их атакуешь из лука или спелами(допустим у игрока трусинг или же высокий спот\листен) (IMG:style_emoticons/kolobok_light/vava.gif) Подскажите пожалуйста, чего я в очередной раз не увидел или пропустил и как эти глюки у мобов исправить (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Сообщение отредактировал Mandrake - Jun 10 2006, 12:47 |
Jun 13 2006, 10:00
Сообщение
#2325
|
|
Level 19 Класс: Обыватель Характер: True Neutral Раса: Дварф NWN: Контент |
Скажите пожалуйста, можно ли выдать фиты персу (и будут ли они работать) без выполнения всех требований к фиту?
|
Текстовая версия | Сейчас: 17th January 2025 - 01:47 |