Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
kreon
QUOTE(Lex @ Dec 22 2006, 01:06) [snapback]100728[/snapback]

да, вроде что-то такое я и сделал в итоге - удаление денег перед тем, как удалять тело. Хотя там деньги удалялись сразу при создании, но где-то они опять всплывали.

Они удалялись не у того обьекта. Я перепутал имена. Там три обьекта
Тело - визуальный предмет
Тело - лутовый предмет
Плейс - содердащий лутовое тело. Вот фишка в том что не у того отнимались деньги smile.gif

P.S. А, да, нашёл тот скрипт... Забавно smile.gif
Lex
хм.. толи я сам правил, толи так и было, но там в функции visual_corpse в corpse_inc вот так:
NSS
object oVisual = CopyObject(oPC, lLoc);
AssignCommand(oVisual, TakeGoldFromCreature(GetGold(oVisual), oVisual, TRUE));

и что примечательно - деньги удалялись, я потом проверял. Однако без TakeGoldFromCreature(GetGold(oVisual), oVisual, TRUE); в функциях удаления тела деньги снова появлялись.. правда после перезахода только. Подозреваю там что-то не успевает удалиться.. хз почему

зы: Зик, скрипт corpse_inc, добавь TakeGoldFromCreature(GetGold(oVisual), oVisual, TRUE); в 84 строку, сразу под комментарий // Destroy oVisual. Вот только не помню, почему я сделал добавку только в destroy_corpse_wout_item. Мб потому что другая не используется, или по каким-то еще причинам, я ужо не помню.
kreon
А.. значит тебе давали версию другую, в которой этот баг уже пытались фиксить smile.gif
Насчёт удаления тела - в restoreall
заменить
NSS
if(GetLocalInt(oPC, "HP") <= 0)
на
NSS
if(nHP <= 0)


P.S. Лекс, это тебе Аксель так скрипты раздавал? wacko.gif
P.P.S. Лекс, ты не прав, используется destroy_corpse() при воскрешении.
wout_item это в onacquire
virusman
Гы. Запускать на живом шарде непротестированные скрипты - зло. smile.gif
mamuc
QUOTE
Гы. Запускать на живом шарде непротестированные скрипты - зло. biggrin.gif

причем это зло - неизкоренимое biggrin.gif ..ибо почти всегда получаеться из всего, что - нить так и недотестить blush.gif
r1Stranger
QUOTE(Waromon @ Dec 16 2006, 13:48) [snapback]100572[/snapback]

To r1Stranger, насчет звуков;
- Формат WAV;
- Oбязательно Mono;
Запаковываем все в хак, подключаем выбераем нужные звуки. smile.gif



Спасібо. Запаковывается все я так понімаю с пом. утілы в папке Utils (ілі че то такое). Но как етот хак подключать к нужному моду?? (Просто сохранять в папке хаков? - не помогает. В редакторе пробую создать звук - не находіт) shout.gif
kreon
Запаковываешь в хак, открываешь Edit->Module Properties там закладка Custom Content и добавляешь созданный хак.
r1Stranger
QUOTE(kreon @ Dec 29 2006, 06:46) [snapback]101129[/snapback]

Запаковываешь в хак, открываешь Edit->Module Properties там закладка Custom Content и добавляешь созданный хак.


Спасибо. unsure.gif
Почти все звуки вставляются, но некоторые почему то не играют (хотя и моно, поставлены в палитру). Зависит ли это от того, где их (звуки) вызываешь.Например, хочу засунуть звук в on_levelup, а ничего не играет почему то. Что это может быть??
Slam
NSS
void main()
{

    int nRand = random(5);
    object oNPC = GetObjectByTag("npc_krol");
    string sSpeakStr;

    PlaySound("as_cv_gongring2");
    switch (nRand)
    {
        case 0 : sSpeakStr="Ты что делаешь!?"; break;
        case 1 : sSpeakStr="Прекрати немедленно!"; break;
        case 2 : sSpeakStr="Я всё дядюшке раскажу!"; break;
        case 3 : sSpeakStr="Или ты сам уйдёшь, или я тебе помогу!"; break;
        case 4 : sSpeakStr="465"; break;
    }
    AssignCommand(oNPC, ActionSpeakString(sSpeakStr));
}

temp3.nss(4): ERROR: PARSING VARIABLE LIST
вот... не пойму почему не компилится
Lex
надо
NSS
int nRand = Random(5);


ps: а лучше еще отмечай строку, которую компилятор отметил. Так надежнее
Slam
QUOTE(Lex @ Jan 10 2007, 15:51) [snapback]101993[/snapback]

надо
NSS
int nRand = Random(5);


ps: а лучше еще отмечай строку, которую компилятор отметил. Так надежнее

спасибо! учту
с тулсетом недавно столкнулся, не знал что он на регистр смотрит...
2_advanced
QUOTE(virusman @ Dec 22 2006, 01:30) [snapback]100733[/snapback]

Гы. Запускать на живом шарде непротестированные скрипты - зло. smile.gif

кормир/раурин видел? так что не надо prankster2.gif
Noah
Решился доделать свои наработки, сел опять за первый тул. Через какое место оптимальнее всего запускать имитацию жизнедеятельности неписей? (в смысле онентер или т.П.) всем привет!
kreon
onspawn + onheart + onuserdefined

http://www.city-of-masters.ru/forums/index...?showtopic=1479
r1Stranger
QUOTE(r1Stranger @ Jan 2 2007, 16:06) [snapback]101386[/snapback]

Спасибо. unsure.gif
Почти все звуки вставляются, но некоторые почему то не играют (хотя и моно, поставлены в палитру). Зависит ли это от того, где их (звуки) вызываешь.Например, хочу засунуть звук в on_levelup, а ничего не играет почему то. Что это может быть??

Так никто не подскажет - звуки везде вставляются или это зивисит от того, где их вызываешь?
azathoth
Звуки плохо вставляются на объекты у которых что-то есть в очереди действий. Но вставляются. Играют только не всегда и когда им вздумается. Естественно это зависит от того, где их вызываешь - OBJECT_SELF разный. На levelup это, к примеру, сам модуль. И кто его из матрицы услышит?

зы: AssignCommand(GetPCLevellingUp(), LetTheMusicPlay())
r1Stranger
QUOTE(azathoth @ Jan 28 2007, 00:01) [snapback]103364[/snapback]

Звуки плохо вставляются на объекты у которых что-то есть в очереди действий. Но вставляются. Играют только не всегда и когда им вздумается. Естественно это зависит от того, где их вызываешь - OBJECT_SELF разный. На levelup это, к примеру, сам модуль. И кто его из матрицы услышит?

зы: AssignCommand(GetPCLevellingUp(), LetTheMusicPlay())

Спасибо. Будем с этим воевать. Жалко только звук сам не вставляется в область, как объект.
Lex
QUOTE(r1Stranger @ Jan 29 2007, 14:40) [snapback]103445[/snapback]
Жалко только звук сам не вставляется в область, как объект.

эт почему это? вставляется. Палитра - Sounds.
Один из вариантов работы со звуком (если заранее известна точка, откуда должен быть звук) - расставить их на 0 громкости, а потом в скриптах сделать громкость какую нужно.

пример задачи для такого решения: появление в локации костров или огня в заранее заданных точках, храп спящих НПС в своих комнатах (это было уже даже в древнем Эдвине в 2003 году) и тд.
Shadenuat
Собсн, вопрос - как сделать неснимаемые (а-ля проклятый или личный) вещи (кликаешь - ан нет, не снимается, а-ля БГ и иже с ним).
Я так понял, через OnEqupItem прописывается, идентично OnActivateItem - через тэг. Т.е. когда player одевает, скажем, предмет ring, запускается скрипт ring. Но возможно ли сделать такую команду, чтобы игрок не мог снять предмет со своего перса?
Lex
QUOTE(Shadenuat @ Jan 31 2007, 19:12) [snapback]103640[/snapback]
Но возможно ли сделать такую команду, чтобы игрок не мог снять предмет со своего перса?

нет. Все что возможно, это сделать так, чтобы предмет автоматически одевался обратно, если его снять. Те вся работа будет идти в основном на событии onUnEquipItem. Смотришь, если есть флажок "проклятое" (ну или анализируешь тэг), то одеваешь шмотку обратно. Чтобы точно знать, куда одевать (скажем если кольцо, то одеть можно в 2 разных места), лучше запоминать проклятые вещи еще на этапе первого одевания, записывая тот слот, в который они оделись.

так сделано в ПВ с проклятыми вещами например.
Shadenuat
Thanks, Лекс!
r1Stranger
QUOTE(Lex @ Jan 29 2007, 16:11) [snapback]103448[/snapback]

эт почему это? вставляется. Палитра - Sounds.
Один из вариантов работы со звуком (если заранее известна точка, откуда должен быть звук) - расставить их на 0 громкости, а потом в скриптах сделать громкость какую нужно.

Спасибо. Но в том то и прикол, что точки не известны (поскольку занимаюсь пока только мультиплеером).А в onlevelup звук никаким Макаром не хочет играться, даже через AssignCommand.
DarkManX
Люди, у меня такой вопрос : как сделать чтоб после определённой фразы в разговоре перс переходил в другую местность?
Waromon
NSS
// ActionTakens, в диалоге:
void main()
{
    object oPC  = GetPCSpeaker();
    object oWP = GetObjectByTag("Таг_объекта");

    AssignCommand(oPC , ClearAllActions());
    DelayCommand(0.5, AssignCommand(oPC ,ActionJumpToObject(oWP)));
}


PS:

Хоть на форуме и не так часто, но помню как минимум, три подобные просьбы, поиск бы юзали.

DarkManX
QUOTE(Waromon @ Feb 22 2007, 18:41) [snapback]104855[/snapback]

NSS
// ActionTakens, в диалоге:
void main()
{
    object oPC  = GetPCSpeaker();
    object oWP = GetObjectByTag("Таг_объекта");

    AssignCommand(oPC , ClearAllActions());
    DelayCommand(0.5, AssignCommand(oPC ,ActionJumpToObject(oWP)));
}


PS:

Хоть на форуме и не так часто, но помню как минимум, три подобные просьбы, поиск бы юзали.

благодарчик
Aiwan
В скрипте что тебе привели НПС прыгнет а это некрасиво и неправильно. Он исчезнет на глазах РС (Фууу НВН2!!!)

NSS
void main()
{
    object oPC = GetPCSpeaker(); // Игрок
    object oNpc = OBJECT_SELF; // НПС с которым идет диалог
    object oExit = GetObjectByTag("WP_"); // Вейпоинт

    AssignCommand(oNpc, ClearAllActions()); // Почистим стек команд
    AssignCommand(oNpc, ActionForceMoveToObject(oExit, FALSE, 1.0, 30.0));
    AssignCommand(oNpc, ActionDoCommand(SetCommandable(TRUE, oNpc)));
    DelayCommand(0.2, SetCommandable(FALSE, oNpc)); // Что бы случайно не забыл
}

Waromon
2 Aiwan

Так, там именно игрок должен переместится. Если говорить о "некрасиво и неправильно" то можно добавить черный экран, получится весьма эффектно. smile.gif
r1Stranger
Привет всем.
1.Никто не подскажет как в скриптах прописывать эффект полета или падения, если возможно(по моему в 1м аддоне нвн что то было там с кобольтами)?
2.Можно ли поднять скриптами уровень непися (дать ему опыта - он качнется по умолчанию или нет - а то это как то не проверяемо)? Или только навыки да умения ему выписывать да интеллект наворачивать и развивать?
Lex
1. EffectAppear EffectDisappear, это все что есть по полету (вроде как).
2. Можно. LevelupHenchman (или как-то так, фильтр функций на "Level" посмотри)
r1Stranger
Спасибо.
Только я там имел в виду, что гоблины как то у очень эффектно в колодец прыгали.Но как не лазил по скриптам, что то там глубоко все попрятано. Так думаю может еще кто интересовался.
А скакать через эппеар и дизэппеар по поводу и без повода по локациям мона красиво - ето да.
А по вопросу об опыте неписей я имел в виду, что только ли как хэнчи они качаться могут (то если по идее они независимы, то для прокачки их надо кому либо подчинить, качнуть, а потом назад.), а так просто опыт не могут получать?
Lex
QUOTE(r1Stranger @ Mar 2 2007, 14:50) [snapback]105230[/snapback]
Только я там имел в виду, что гоблины как то у очень эффектно в колодец прыгали.Но как не лазил по скриптам, что то там глубоко все попрятано. Так думаю может еще кто интересовался.

интересовались. Там для этого специальная анимация сделана была. Те повторить это можно, но только 1-в-1, а в других местах не попользовать.
gennady
Вопрос такой. Можно ли сократить код? А то чет некрасиво записано...

Neverwinter Script Source
if(GetTag(oItem)=="Hlam_9" || GetTag(oItem)=="ITM_Kukla" ||
      GetTag(oItem)=="ITM_Necr_Cotel" || GetTag(oItem)=="Hlam_11" ||
      GetTag(oItem)=="Hlam_5" || GetTag(oItem)=="Hlam_4" ||
      GetTag(oItem)=="Hlam_1" || GetTag(oItem)=="Hlam_10" ||
      GetTag(oItem)=="Hlam_8" || GetTag(oItem)=="Hlam_7" || GetTag(oItem)=="Hlam_2")
Aiwan
Neverwinter Script Source
object oItem;
  string sTag = GetTag(oItem);

  if(sTag =="Hlam_9" || sTag =="ITM_Kukla" || sTag =="ITM_Necr_Cotel"
  || sTag =="Hlam_11" || sTag =="Hlam_5" || sTag =="Hlam_4"
  || sTag =="Hlam_1" || sTag=="Hlam_10" || sTag=="Hlam_8"
  || sTag =="Hlam_7" || sTag=="Hlam_2")
Lex
если нет других предметов с тэгом Hlam_* то можно так:
Neverwinter Script Source
object oItem;
  string sTag = GetTag(oItem);

  if(sTag =="ITM_Kukla" || sTag =="ITM_Necr_Cotel" || GetStringLeft(sTag,5) =="Hlam_")
gennady
Спасибо Aiwan, так красивше! Но суть в том, что видел вроде как-то запись методом перечисления…

Lex, идея проверить первые 5 символов интересная, но не данном случае, имеются и другие предметы с подобными тэгами, а тут после кода идет дестрой.

Ну, что ж нет других вариантов, так нет… Буду писать некрасиво biggrin.gif
azathoth
Цитата(gennady @ Mar 31 2007, 13:21) [snapback]106644[/snapback]
Спасибо Aiwan, так красивше! Но суть в том, что видел вроде как-то запись методом перечисления…

В NWScript такого не предусмотрено - это тогда уже через свою "умную" функцию надо делать. Посмотри в базе, я как-то выкладывал инклюд с функциями для инвентаря, работающими со строками-списками.

---
На крайняк можно так:
Neverwinter Script Source
if (FindSubString(" Hlam_9 ITM_Kukla ITM_Necr_Cotel Hlam_11 Hlam_5 Hlam_4 Hlam_1 Hlam_10 Hlam_8 Hlam_7 Hlam_2 ", " " + GetTag(oItem) + " ") >= 0)
{
    ...
}
Aiwan
Цитата(gennady @ Mar 31 2007, 15:21) [snapback]106644[/snapback]
Ну, что ж нет других вариантов, так нет… Буду писать некрасиво

Чем проще написано тем больше шансов что не "вильнет" в сторону. rolleyes.gif
gennady
Цитата(azathoth @ Mar 31 2007, 16:29) [snapback]106656[/snapback]
В NWScript такого не предусмотрено - это тогда уже через свою "умную" функцию надо делать. Посмотри в базе, я как-то выкладывал инклюд с функциями для инвентаря, работающими со строками-списками.


Ясно, инклюду смотрел, но там наворочено… «умным» долго разбирать biggrin.gif… Но вот помню, что видел что-то подходящее. Это как раз самое то!!! yahoo.gif Только почему на крайняк? Проверил, все пашет и не «виляет» wink3.gif

Спасибо, azathoth беру на вооружение. thank_you.gif
Вик Станжер
господа и таварищи, помогите...

никак не могу реализовать... короче чел подходит в зону видимости моба (тег1), и врубается диалог такой-то.
Во время диалога игрока атакуют. как только у него становиться меньше а хитоВ, экран гаснет и его телепортируют на локагия (тег2). Подскажите как и что, плиз...
gennady
Цитата(Вик Станжер @ Apr 16 2007, 21:11) [snapback]107195[/snapback]
господа и таварищи, помогите...

А где сами скрипты? И что там у тебя конкретно не получается?

Все ответы на эти вопросы, можешь и сам найти в базе скриптов или скриптов для новичков biggrin.gif
Aiwan
Цитата(gennady @ Apr 17 2007, 09:10) [snapback]107205[/snapback]
А где сами скрипты? И что там у тебя конкретно не получается?

Из цикла:
- "Привет ребзя! Хочу сделать свою модельку в НВН, скажите как?"
*Народ пишет пять листов как нарисовать, количество полигонов, вокмехи, тулзы для импорта, ограничения...*
- "Ух ты! Клева!"
Вик Станжер
блин, я плачу за трафик, а от стипендии уже ничего не осталось, не могу я весь формум перерывать.

я не знаю:

- на что вешать скрипт, проверающии здровьие и при ранении телепортирующий.
- я не знаю, как осуществить переход к обхекту на другой карте.

Lex
Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback]
- на что вешать скрипт, проверающии здровьие и при ранении телепортирующий.

так как игрок, проверять только на HeartBeat модуля или в скрипте default (ХБ игрока. Но если мультиплеерный модуль, лучше не использовать в данной ситуации). Ну или на HeartBeat самого НПС, который игрока долбает.

так как можно попасть в просак, если игрок будет убит 1 ударом или как-то еще (есть варианты), то перед таким боем лучше вешать на игрока Immortale флаг (ф-я SetImmortale). Потом проверив ХП (ф-я GetCurrentHitPoints) и определив, что их мало, перемещаем игрока (ф-я ActionJumpToObject), предварительно отчистив стек действий игрока (ф-я ClearAllActions) и задав точку перемещения (ф-я GetObjectByTag). Если пишется в скрипте default - то игрок - просто OBJECT_SELF, если в HeartBeat модуля, то игрока надо определять нужным образом. Зависит уже от ситуации.
да.. не забыть перед боем повесить локалку на игрока (SetLocalInt) о том, что он в сюжетном бою, а в скрипте по проверке ХП и переносе в точку проверять эту локалку (GetLocalInt) с тем, чтобы отсекать ситуации лишние. После перемещения локалку обнулить (SetLocalInt).

Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback]
блин, я плачу за трафик, а от стипендии уже ничего не осталось, не могу я весь формум перерывать.

поиск попробовать можно. А вообще если такая беда, как можно четче формулируйте вопрос. И если пробуете писать сами скрипты, выкладывайте что получается и описание того, где проблема.

зы: просто к людям, которые пробуют сами и что-то не получается отношение другое немного, более... положительное чтоли. А то, что вы уже написали как раз показывает ваши попытки сделать самостоятельно. Ну это так, на заметку.

зыы: а если тупо нужен готовый скрипт с объяснениями, куда его ставить, то это тоже лучше сразу написать. smile.gif Чтобы не было недопонимания.
gennady
Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback]
- я не знаю, как осуществить переход к обхекту на другой карте.

Тогда запиши себе этот скрипт, поможет во многих ситуациях… Имя скрипта должно быть p_universal т.к. я использовал его в скрипте проверки урона и перемещения.
Neverwinter Script Source
//:://////////////////////////////////////////////
//::  ***  УНИВЕРСАЛЬНЫЙ СКРИПТ ПЕРЕМЕЩЕНИЙ  ***
//:: File name: p_universal
//:://////////////////////////////////////////////
// ***** ПЕРЕМЕЩЕНИЕ ГЕРОЯ *****
void JumpFirstPC(object oWP)
{
object oPC = GetFirstPC();
object oSP = GetHenchman(oPC);
object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oPC);
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oPC);
object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC);
object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC);
   AssignCommand(oPC, ClearAllActions());
   AssignCommand(oSP, ClearAllActions());
   AssignCommand(oAnimal, ClearAllActions());
   AssignCommand(oFamiliar, ClearAllActions());
   AssignCommand(oDominated, ClearAllActions());
   AssignCommand(oSummoned, ClearAllActions());
AssignCommand(oPC, JumpToObject(oWP));
AssignCommand(oSP, JumpToObject(oWP));
AssignCommand(oAnimal, JumpToObject(oWP));
AssignCommand(oFamiliar, JumpToObject(oWP));
AssignCommand(oDominated, JumpToObject(oWP));
AssignCommand(oSummoned, JumpToObject(oWP));
}
void main()
{
object oSelf = OBJECT_SELF;
object oPoint = GetWaypointByTag("WP_" + GetTag(oSelf));
object oPC = GetFirstPC();
location lSmoke = GetLocation(oSelf);
effect eSmoke = EffectVisualEffect(VFX_FNF_LOS_NORMAL_10);

if ((GetArea(oPC) == GetArea(oSelf)&& GetDistanceBetween(oPC, oSelf) < 3.0) ||
     GetIsPC(GetEnteringObject()))
  {
   ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eSmoke,lSmoke);
   DelayCommand(0.6, JumpFirstPC(oPoint));
  }
else
AssignCommand(GetEnteringObject(), ClearAllActions());
}
// Точка перемещения содержит WP_+Тег объекта


Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback]
- на что вешать скрипт, проверающии здровьие и при ранении телепортирующий.

И где скрипт? biggrin.gif Если нет, то попробуй повесить на перса, с которым будет драться герой, вот этот скрипт…
Neverwinter Script Source
//:://////////////////////////////////////////////////
//:: Прекращение атаки
//:: Слот: OnCombatRoundEnd
//:://////////////////////////////////////////////////
void main()
{
   object oPC = GetFirstPC();
   object oSelf = OBJECT_SELF;
   object oNPC = GetFirstObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE);
   int iMXP = GetMaxHitPoints(oPC)-10; // Настрой нужную величину…
   int iCXP = GetCurrentHitPoints(oPC);

  if (iMXP > iCXP) //Урон не менее 10 пунктов от мах
  {
   while (GetIsObjectValid(oNPC))  // Все существа в радиусе 30 метров
   {
    if(GetIsInCombat(oNPC))
    {
     AssignCommand(oNPC, SurrenderToEnemies()); // Прекратим атаку
     AssignCommand(oNPC, ClearAllActions(TRUE));
    }
    oNPC = GetNextObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE);
   }
   AssignCommand(oPC, SpeakString("Я сдаюсь... Прекратим бой!"));
   DelayCommand(1.5, ExecuteScript("p_universal", oSelf)); // Перемещение к точке WP_+Тег объекта
  }
}

P.S. Лекс правильно подметил о возможной смерти героя т.ч. учти это, в моем скрипте это не пробито… Но тут уже совсем другая история и другие варианты. Дерзай!
Вик Станжер
спасибо... все вроде пошло....
А то с начало перепутал названия скриптов и возникала такая ситуация:

Выбегает хакер на площадку, там менты его должны повезать. А они к нему подходят и говорят: память отформатированна. Нуждаемся в переустановке операционной системы. biggrin.gif



да и еще...

на он перспейшен моба подвешен скрипт

void main()
{
AssignCommand(GetObjectByTag("ag"), ActionStartConversation(GetFirstPC(), "sosed", FALSE, TRUE));
}

при вхождении в зону видимости стоящего он должен вызывать диалог... но моб сломя голову несется через всю карту к игроку. что не так? я вообще правильно понял, что онперспейшен - это обнаружение?
Dik Morris
Вик, описание эвента из NWN Lexicon'a:
Цитата
The script attached to this event will fire whenever another creature perceives another creature or PC. Common uses of this script include having the creature yell a battle cry, greet the PC, or run away.


Далее, если диалог должен начинать тот NPC, в эвенте которого стоит данный скрипт, то строка:
Neverwinter Script Source
AssignCommand(GetObjectByTag("ag")

- совсем не обязательна, кстати, не используй в данном случае, фун-цию: GetFirstPC(), лучше ограничиться, скажем: GetLastPerceived и проверять - игрок ли, последний увиденный и собственно видит ли его NPC.
Скрипт будет таким:

Neverwinter Script Source
void main()
{
object oPC = GetLastPerceived();

if (GetIsPC(oPC))
{
if (GetLastPerceptionSeen())
  {
  ClearAllActions();
  ActionMoveToObject(oPC);
  ActionStartConversation(oPC, "sosed");
  }

}
}


PS: для надежности, что-бы NPC никто не сбил по пути, можно выключить его стэк-комманд (естественно на время, до выполнения задачи).
Функция: SetCommandable.
Aiwan
Цитата(Вик Станжер @ Apr 17 2007, 15:15) [snapback]107220[/snapback]
блин, я плачу за трафик, а от стипендии уже ничего не осталось, не могу я весь формум перерывать.

А я что, не плачу? ВОт уезжал было +800 рублей, не было меня месяц (минус) -650. vava.gif Кто мой траф выкачал? Суппорт разводит руками...
Цитата(Вик Станжер @ Apr 17 2007, 15:15) [snapback]107220[/snapback]
- я не знаю, как осуществить переход к обхекту на другой карте.

Это есть в мануале моем. Я это разбирал. Скачай прочти, много вопросов отпадет. Я потратил месяц времени оформил для новичков.
Цитата(Dik Morris @ Apr 17 2007, 21:14) [snapback]107232[/snapback]
PS: для надежности, что-бы NPC никто не сбил по пути, можно выключить его стэк-комманд (естественно на время, до выполнения задачи).

И добавь локалку на то что бы НПС не бегал к РС каждый раз когда увидит. Кстати в базе скриптов есть мой скрипт который говорит НПС подойти к РС и начать диалог когда он его увидит. Вешается это дело на юзер деф через сигнал хертбита. Вот код:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnUserDefined  am_cud_talk_away
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    НПС ходит за игроком, хочет сказать ему
    что-то важное. Игрок может отойти на fDist
    метров и НПС перестанет его преследовать.
    Если присвоить на объект локальную "RUN"
    == TRUE то побежит к игроку. Если присвоить
    локалку "ALL_DISTANCE", то будет преследовать
    игрока на всей локации. Float fDist "DISTANCE"
    расстояние на котором НПС реагирует на игрока.
    По умолчанию равно 10 метрам.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 14.10.2005
//:://///////////////////////////////////////////
void main()
{
   object oSelf = OBJECT_SELF;
   object oPC = GetFirstPC(); // Только для сингла
   int nEvent = GetUserDefinedEventNumber();
   if (GetArea(OBJECT_SELF)!=GetArea(oPC)) return;
   if (GetIsDead(OBJECT_SELF)==TRUE) return; // Если он помер, то пусть молчит
   if (GetLocalInt(OBJECT_SELF, "START_CONVERSATION") == FALSE) return;
   if (GetIsEnemy(oPC, OBJECT_SELF) == TRUE) return;
//========================== HEARTBEAT EVENT  =================================
  if (nEvent == EVENT_HEARTBEAT)  // Стандартный сигнал User Defined Event 1001
  {
    // Если поставим эту локалку, то НПС будет преследовать игрока везде в локации
     if (!GetLocalInt(oSelf, "ALL_DISTANCE"))
     {
      float fDist = GetLocalFloat(oSelf, "DISTANCE"); // Расстояние реакции
      if(fDist == 0.0) {fDist=10.0;} // Если нет значения, то оно ровно 10 метрам
     // Если игрок дальше fDist метров, то ничего не будет. Будет стоять и ждать
      if (GetDistanceBetween(oPC, oSelf)> fDist)
       {
          AssignCommand(oSelf, ClearAllActions());
         // Debug("Игрок отошел дальше "+FloatToString(fDist)+" метров.");
          return;
       }
      }
      // Если бой, идет разговор то возврат
      if (GetIsInCombat(oPC) || GetIsInCombat(oSelf) || IsInConversation(oPC))
      {
         return;
      }
    // Если нет переменной для повтора
    if (GetLocalInt(oSelf, "REPEAT") == FALSE)
     {
        int iRun = FALSE;
        // iRun = TRUE - бежит к игроку
        if (GetLocalInt(oSelf, "RUN")) iRun = TRUE;
        // Присвоим переменную повтора
        SetLocalInt(oSelf, "REPEAT", TRUE);
        AssignCommand(oSelf, ClearAllActions());
        ActionDoCommand(SetFacingPoint(GetPosition(oPC)));
        AssignCommand(oSelf, ActionMoveToObject(oPC, iRun, 2.0));
        AssignCommand(oSelf, ActionStartConversation(oPC));
        // Обнулим ее через 20 секунд, можно увеличить или уменьшить
        DelayCommand(20.0, SetLocalInt(oSelf, "REPEAT", FALSE));
        // Случайные фразы
        string s1 = GetLocalString(oSelf, "String1");
        string s2 = GetLocalString(oSelf, "String2");
        string s3 = GetLocalString(oSelf, "String3");
        string s4 = GetLocalString(oSelf, "String4");
        string s5 = GetLocalString(oSelf, "String5");
        switch(Random(5))
          {
            case 0: if(s1!=""){SpeakString(s1+GetName(oPC)+"!"); break;}
            case 1: if(s2!=""){SpeakString(s2); break;}
            case 2: if(s3!=""){SpeakString(s3); break;}
            case 3: if(s4!=""){SpeakString(s4); break;}
            case 4: if(s5!=""){SpeakString(s5); break;}
          }
      }
  }
//------------------------------------------------------------------------------
}


Этот скрипт вешай на любую пустую строку НПС желательно самую верхнюю. В начале диалога он отключит все слокалки на НПС и он не станет бегать за РС все время smile.gif
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Отключает "START_CONVERSATION" на НПС
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    НПС ходит за игроком, хочет сказать ему
    что-то важное. Игрок может отойти на 10
    метров и НПС перестанет его преследовать.
    Если присвоить на объект локальную "RUN"
    == TRUE то побежит к игроку. Если присвоить
    локалку "ALL_DISTANCE", то будет преследовать
    игрока на всей локации.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 18.09.2005
//:://////////////////////////////////////////////

int StartingConditional()
{
   if (GetLocalInt(OBJECT_SELF, "START_CONVERSATION"))
   {
      SetLocalInt(OBJECT_SELF, "START_CONVERSATION", FALSE); // Отключаем
      SetLocalInt(OBJECT_SELF, "RUN", FALSE); // Ходит пешком
      if(GetCommandable(GetPCSpeaker())==FALSE)
      {
          SetCommandable(TRUE, GetPCSpeaker()); // Если РС закрыт стек команд
      }
    }
  return FALSE;
}


Надеюсь ты знаешь как запустить это:
Neverwinter Script Source
if (nEvent == EVENT_HEARTBEAT)  // Стандартный сигнал User Defined Event 1001
Вик Станжер
Цитата
Neverwinter Script Source
//:://////////////////////////////////////////////////
//:: Прекращение атаки
//:: Слот: OnCombatRoundEnd
//:://////////////////////////////////////////////////
void main()
{
object oPC = GetFirstPC();
object oSelf = OBJECT_SELF;
object oNPC = GetFirstObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE);
int iMXP = GetMaxHitPoints(oPC)-10; // Настрой нужную величину…
int iCXP = GetCurrentHitPoints(oPC);

if (iMXP > iCXP) //Урон не менее 10 пунктов от мах
{
while (GetIsObjectValid(oNPC)) // Все существа в радиусе 30 метров
{
if(GetIsInCombat(oNPC))
{
AssignCommand(oNPC, SurrenderToEnemies()); // Прекратим атаку
AssignCommand(oNPC, ClearAllActions(TRUE));
}
oNPC = GetNextObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE);
}
AssignCommand(oPC, SpeakString("Я сдаюсь... Прекратим бой!"));
DelayCommand(1.5, ExecuteScript("p_universal", oSelf)); // Перемещение к точке WP_+Тег объекта
}

}

лишнии раз убеждаюсь, что туп как пробка... или это от экзаменов? куды вставлять тег объекта адреса назначения?????

базу изучаю....
Aiwan
Не все так просто. Скорее всего кое -кто будет лупить по РС. Ты скажи нормальным языком что ты хочешь реализовать. Подробно. У меня есть скрипты прекращающиен атаки при определенных хитах как у РС так и у НПС. Опиши задачу.
gennady
Цитата(Вик Станжер @ Apr 18 2007, 15:53) [snapback]107283[/snapback]
лишнии раз убеждаюсь, что туп как пробка... или это от экзаменов? куды вставлять тег объекта адреса назначения?????

Aiwan, скрипт рабочий, не раз проверенный… Ну, все равно открывай свою кубышку глянем, что у тебя там припасено и поучимся biggrin.gif
P.S. Лексу отправил…

Вик Станжер, все просто, возьми тэг перса с которым будет драться герой т.е. на которого ты повесишь этот скрипт. Добавь перед тэгом «WP_» например: тэг перса PERS_3, тогда точка к которой джампанется герой будет: WP_PERS_3
Neverwinter Script Source
DelayCommand(1.5, ExecuteScript("p_universal", oSelf)); // Перемещение к точке WP_+Тег объекта

Да, еще учти, что перемещение будет если будет рукопашная схватка, в скрипте перемещения пробито расстояние между объектами не более 3 метров.
Если этого не нужно, то запиши проще, заменив эту строку на этот код:
Neverwinter Script Source
AssignCommand(oPC, ClearAllActions(TRUE));
object oPoint = GetWaypointByTag("ТЭГ ТОЧКИ ПЕРЕМЕЩЕНИЯ");
AssignCommand(oPC, JumpToObject(oPoint));

Это хорошо если точка в другой области, а если в этой же, то лучше, так как я записал. Иначе у тебя вся команда героя останется на месте…


Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.