Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Neverwinter Nights Aurora Toolset _ Скрипты для новичков

Автор: Aiwan Aug 23 2005, 17:53

Здесь будут вывешаны самые простые скрипты на которых можно построить новичку свой модуль. Любой пост кроме скрипта с описанием будет считаться спамом и автор получит предупреждение. Всем Мастерам скриптов советую максимально разжевывать куда, как и зачем вставлять код. При этом максимально просто писать код. Этим мы поможем новичкам не только справиться с проблемой, но и понемногу научим понимать код. Сложные скрипты писать в другую тему.


============================
LEX: Беру тему под контроль. Если тут в скриптах или комментариях ошибки, пишу в то же посте, где допущена неточность. Авторам постов обратить внимание на эти ремарки и вносить коррективы по необходимости.
============================


Начем. Самое главное, это начало модуля. Тут все написано, как раздеть игрока, одеть, дать ему денег и отправить дальше. Ставится он на слот модуля OnClientEnter.

NSS
//:://////////////////////////////////////////////
//:: OnEnter  am_mod_enter
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
      Скрипт на вход в модуль при старте.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 22.08.2005
//:://///////////////////////////////////////////
void main()
{
    object oMod = GetModule(); // Наш модуль
    object oPC = GetEnteringObject(); // Того кто вошел

    // Если это не игрок (а ДМ к примеру) или уже было раз, то сделаем возврат
    // скрипта, т.е. дальше он не пойдет.
    if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME"))
      {return;}
      {
      SetLocalInt(oMod, "START_GAME", TRUE); // Что бы сработал только один раз

//--------- Откроем туман над локацией если вам надо. К примеру в городе -------
      ExploreAreaForPlayer(GetObjectByTag("ТАГ_НУЖНОЙ_ЛОКАЦИИ"), oPC);

//--------------- Проводим деноминацию денежных накоплений ---------------------
      AssignCommand(oPC, TakeGoldFromCreature(GetGold(oPC),oPC,TRUE)); // Заберем все денежки

//------------------ Убиваем весь инвентарь ------------------------------------
        object oItem = GetFirstItemInInventory(oPC); // Первый итем в инвентаре
        while(GetIsObjectValid(oItem)) // Пока такой объект существует
        {
            DestroyObject(oItem); // Удаляем его
            oItem = GetNextItemInInventory(oPC); // Берем другой объект...
        }

//------------------ Убиваем всю амуницию -------------------------------------
        int i=0;
        while(i<14) // ПОКА i меньше 14. 14 - это количество всех слот у объекта
        {
        DestroyObject(GetItemInSlot(i, oPC)); //
        i++; // Это значит i увеличится на еденичку от своего значения
            // Было ноль к примеру, станет 1 и т.д.
        }
//------------------------ Создаем предметы ------------------------------------
        // Если вам нужны отдельно каждому классу по несколько предметов, то
        // скопируйте кусок кода еще и измените CLASS_TYPE_ Наведите курсор,
        // нажми F2 и выберите нужное значение константы

//      int Class = GetClassByPosition(1, oPC);
//      switch (Class) // В зависимости от класса
//        {
//          case CLASS_TYPE_BARBARIAN:
//          {
//            CreateItemOnObject("ResRef_Объекта", oPC,1);
//          }
//          case CLASS_TYPE_FIGHTER:
//          {
//            CreateItemOnObject("ResRef_Объекта", oPC,1);
//          }
//        }
        GiveGoldToCreature(oPC, 5000); // Даем золотишко
        CreateItemOnObject("ResRef_Объекта1", oPC, 1);
        CreateItemOnObject("ResRef_Объекта2", oPC, 1);
        CreateItemOnObject("ResRef_Объекта3", oPC, 30);
        // 1 - это количество в стеке, если вам надо 30 стрел, то ставьте там 30

//----------------------  Опознаем предметы  -----------------------------------
        object oItemCr = GetFirstItemInInventory(oPC);
        while(GetIsObjectValid(oItemCr))
            {
            SetIdentified(oItemCr,TRUE);
            oItemCr = GetNextItemInInventory(oPC);
            }

//-------------------- Уровень игрока для игры в модуле ------------------------
      // К примеру нам нужен игрок 5 уровня. Смотрим таблицу уровней и видим,
      // что Level 5 = 10000 xp.
        {
          SetXP(oPC, 10000);
        }

//----------------------  Оденем нашего игрока ---------------------------------
        AssignCommand(oPC, ActionEquipMostEffectiveArmor());

//---------------------------------- END ---------------------------------------
    }
}

Автор: DraX Aug 24 2005, 15:12

Долго думал, какой скрипт написать и решил, что новичкам, в первую очередь, будет интересно узнать вот о чем. Многое замечали, что при разговоре с 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; 
}

Получается, что мы спрашиваем программу была ли переменная "FIRST_TIME" определена. Если нет - то мы даем добро на фразу. Теперь нам осталось сделать совсем ничего - определить эту переменную. Тогда при вызове нашего скрипта, он определит, что переменная определена и выдаст FALSE, т.е. запретит вывод фразы. Но проге надо ж вывести хоть какую то фразу? smile.gif Вот он и опускается на одну строчку вниз. Там нет никаких проверок, поэтому он свободно выводит вторую фразу. Вот скрипт, который нужно прописать в Actions Taken
Neverwinter Script Source
SetLocalInt(OBJECT_SELF, "FIRST_TIME", 1);  /* Присвоели переменной 1 и теперь она уже определена под другим значением
*/

Вот и все. Если хотите больше веток, то меняйте значения переменной соответственно.

ЗЫ: Кстати, вот эти ковычки в скрипте /* */ означают комментарий. Используйте их, чтобы окончательно не заблудиться в том, что вы написали. wink.gif

LEX: PS: это расписано в вопросах и ответах

Автор: -fenix- Aug 24 2005, 15:50

Решил расписать такой скрипт.

Многие наверное хотят сделать у себя в модуле вещь, на подобие "Камня призыва" в 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))); //  собственно
//сам прыжок к порталу
  }
}

Работает это так:
Игрок использует объект и сробатывает скрипт. Для начала скрипт проверяет, тот ли объект был использован? Если тот, то происходит запоминание координат игрока, чистка его акций(очищение всех действий NPC) и сам прыжок к порталу.


Ставется на событие OnUsed в св-вах портала или в слот "Совершенные действия" на ветке диалога
Neverwinter Script Source
void main()
{
object oActivator = GetLastUsedBy(); // тот ,кто использовал портал (наш игрок)
// если нужно сделать прыжок в диалоге, то закомментируйте строчку выше и              //расскомментируйте строчку ниже
//object oActivator = GetPCSpeaker(); // PC, который разговаривает с объектом

AssignCommand(oActivator, ClearAllActions()); // чистим игроку акции
AssignCommand(oActivator, ActionJumpToLocation(GetLocalLocation(oActivator, "ReturnLocation"))); // прыжок к запомненным ранее координатам
}

Работает это так:
При клике по порталу или при определенной строке в диалоге скрипт чистит акции у игрока и кидает к запомненным координатам.

Автор: DraX Aug 24 2005, 16:32

Неожиданно пришла здравая идея!
Многим может быть полезным генерация хенча (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); // Добавляем хенча тому игроку, с кем говорит
}

4.Заменяем во всех вкладках скриптов у NPC скрипты на nw_ch_ac#, где вместо # пишите цифру или букву из родных скриптов. Это стандартные AI скрипты для всех хенчев.
5.Все, пользуйтесь smile.gif

ЗЫ: А если еще добавить проверочку, о которой я писал выше, что можно сделать еще и красивый диалог. Юзайте biggrin.gif

Автор: Aiwan Aug 25 2005, 08:42

Скрипт закрывает дверь на ночь и открывает ее днем. Ставится на 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);
       }
}


Простые заготовки скриптов для проверок переменных и присвоения значений в ДИАЛОГАХ. Все локалки я присваивал на игрока в диалоге object oPC = GetPCSpeaker();. Если у вас на триггере или еще где, то используйте object oPC = GetFirstPC();. Это берет первого игрока, а в сингле он один и есть. Это верно ДЛЯ ОДИНОЧНОЙ ИГРЫ. Тот кто решит делать шард, поймет сам где и как надо описывать оРС...

ПРИСВАИВАЕМ ПЕРЕМЕННУЮ

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; // Если нет, то ничего не будет.
}


Добавлено в [mergetime]1124950183[/mergetime]
ПРИМЕРЫ СЛОЖНЫХ ПРОВЕРОК.

Данный скрипт сработает ЕСЛИ:
Первая переменная равна 1, Вторая 2, третья 5, четвертая 1.
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;
}


Сложная проверка. Данный скрипт сработает ЕСЛИ:
Первая переменная равна 1 или Вторая равна 2, НО ПРИ ЭТОМ третья равна 5 но НЕ ровна 8.
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;
}

Автор: Dik Morris Aug 25 2005, 10:02

ЗЫ: Небольшое уточнение, в посте DraX’ са.

QUOTE
4.Заменяем во всех вкладках скриптов у NPC скрипты на nw_ch_ac#, где вместо # пишите цифру или букву из родных скриптов. Это стандартные AI скрипты для всех хенчев.

Собственно, вот нужные скрипты (для тех кому лень искать…)
OnBlocked = x0_ch_hen_block
OnDamaged = x0_ch_hen_damage
OnDeath = x0_ch_hen_death
OnConversation = x0_ch_hen_conv
OnDisturbed = x0_ch_hen_distrb
OnCombatRoundEnd = x0_ch_hen_combat
OnHeartbeat = x0_ch_hen_heart
OnPhysicalAttacked = x0_ch_hen_attack
OnPerception = x0_ch_hen_percep
OnRested = x0_ch_hen_rest
OnSpawn = x0_ch_hen_spawn
OnSpellCast = x0_ch_hen_spell
OnUserDefined = x0_ch_hen_usrdef
Данные, скрипты, из хенчманов, 1 аддона. (СоУ)

Автор: -fenix- Aug 25 2005, 19:12

Вот скиптик для сидения на стуле, кушетке, диване, лавке...
Все, что нам нужно - это объект подходящий для сидения.

Скрипт ставется на слот 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 акции
    }
}

}

Действует скрипт очень просто. Сначало проверяется являетсяли кликнувший по стулу PC. Если да, то происходит проверка на занятость стула. Если стул свободен, то PC садится, в противном случае у PC чистятся все акции.

Или кинуть его в первый пост???
Вот немного усложненный скрипт с Камнем призыва. Теперь и для возврата мы будем использовать камень. Мы помещаем два предыдущих скрипта в разные блоки оператора if, а в условие ставим проверку переменной.
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"
        }
}

Рассмотри первое использование.
Если ТАГ использованного объекта правельный, то проверяется лок. переменная. У нас этой переменной еще нет, значит она не может быть ровна 1, поэтому происходит прыжок к объекту(скажем порталу) и установка значения переменной на 1. При повторном использовании проверка переменной дает положительный результат и происходит джамп к запомненым координатам, так же значение переменной устанавливается на 0. Поэтому при следующем использовании нас снова перенесет к порталу...



=============================================
LEX:

QUOTE (-fenix- @ Aug 25 2005, 20:12)
(GetIsObjectValid(oChair)

эта проверка лишняя. Если игрок кликнул на стул, то он не может быть НЕ ВАЛИДНЫМ. (как ты пишешь, правИльным)

поправил

Автор: Aiwan Aug 26 2005, 08:14

Скрипт закрывает дверь автоматически через заданное время. Ставится в слот 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));
}


Простенький скрипт, генерирует у меня книги в шкаф. Все книги должны быть с подобными ResRef-ами. Ваши книги должны быть такого вида: am_it_book001, am_it_book002, am_it_book003...am_it_book050, ... am_it_book100 и т.д. Скрипт надо ставить на OnOpen и на OnDeath шкафа или книжной полки. Присвоив на модуль переменную "ALL_BOOKS_IN_MODULES" вы ее значением указываете количество ваших книг. К примреру 1 меня их 60, значит значение переменной будет 60. На самом шкафу локалка "BOOKS" означает какое количество книг случайно появится в нем. Если присвоить значение 3, то создастся три книги.

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;
}


Ставите на OnEnter важной локации или триггера. И у вас будет автосохранение. К примеру перед важной битвой.
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();
}


Скрипт превращения НПС в страшного Вервольфа. Можно в принципе в любого. Только измените модель POLYMORPH_TYPE_, наведя на нее курсовр и нажав F2 выбрав нужную из списка.

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)); // Командуем: ФАСС!!!
}

Добавлено в 12:05
Забыл wacko.gif Ставится скрипт на OnDamag NPC. Фракцию можно любую нейтральную к игроку.
Добавлено в [mergetime]1125038176[/mergetime]
Скрипт проверяет наличие предмета в инвентаре игрока. Если предмет есть, то появится строка в диалоге.
Neverwinter Script Source
#include "nw_i0_tool"
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    if(!HasItem(oPC, "ТАГ_ПРЕДМЕТА"))
        return FALSE;
    return TRUE;
}

Автор: -fenix- Aug 26 2005, 15:10

Если хотите, чтобы НПС, как только увидеk игрока поприветствовал его, используйте этот скрипт.

Скрипт ставется на слот OnPerception в св-вах НПС

Neverwinter Script Source
void main()
{
object oPercep = GetLastPerceived(); // последний воспринятый объект

// если последний воспринятый объект бял увиден и если он является игроком
if ( GetLastPerceptionSeen() && GetIsPC(oPercep))
    {
    SpeakString("Привет игрок"); // поприветствовать его
// машем нашему герою рукой
    AssignCommand(OBJECT_SELF, PlayAnimation(ANIMATION_FIREFORGET_GREETING));
    }
}

У каждого НПС есть радиус, в котором он видет, как только вы в него зайдете, НПС вас поприветствует. Пока вы остаетесь в этом радиусе, он вам ни чего не скажет, а если выйти и снова зайти, то он снова скажет фразу.
Если вам кажется, что вас замечают слишком близко или далеко, то измените НПС(на котором скрипт) чувствительность. Это делается в св-вах НПС, во закладке "Улучшенные", там в низу есть "Расстояние чувствительности".



Чтобы трупы НПС не исчезали, а оставались и с них можно было собрать инвентарь убитого, надо сделать так.

1) Нужно в св-вах НПС на закладке "Улучшенный" поснимать все галки в разделе "Специальный".
2) Настроить инвентарь НПС. В частности пометить выбрасываемые вещи, вещи, которые после смерти остануться на трупе. Это делается просто, выделяете нужный предмет и ставите\убираете галочку.
3) В палитре размещаемые объекты->секретный объект найти Труп. У него должны быть уникальный ТАГ и РесРеф, так же у него должна стоять галка на инвенторе. Этот объект невидимый и будет нашим инвенторем.
4) Поставить следующий скрипт.


Скрипт ставется на слот OnDeath в св-вах НПС
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);// следующщий слот в инвентаре убитого НПС
    }
}

Добавлено в 16:06
Вы можете общаться с НПС через панель разговора.
Для этого нужны два скрипта.

Скрипт ставится на слот OnSpawn в св-вах НПС
Neverwinter Script Source
void main()
{
object oPC = GetLastSpeaker();//это PC
SetListening(OBJECT_SELF, TRUE);// Даем команду НПС слушать
/*
следующая строчка нужна для сравнения. Как только вы что-то скажите НПС будет сравнивать сказаное с соответствующей строкой.
1 - это порядковый номер фразы, если у вас несколько фраз, то пронумируйте их все.
*/

SetListenPattern(OBJECT_SELF,"Караба-Мураба",1);// устанавливаем образец фразы
}




Скрипт ставится на слот OnConversation в св-вах НПС
Neverwinter Script Source
void main()
{
// если услышаное соответствует фразе под порядковым номером "1" и НПС ее слышет
if (GetListenPatternNumber() == 1 && GetIsListening(OBJECT_SELF))
    {
    SpeakString("Ты сказал верный пароль");// ответ НПС
    }
}

Автор: Aiwan Aug 26 2005, 16:37

СКРИПТЫ БОЛЬШЕ НЕ ПОСТИТЬ. ТОЛЬКО МАСТЕРАМ РАЗРЕШАЮ ПИСАТЬ.

Автор: Aiwan Sep 7 2005, 22:29

Скрипт вешается на 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
}


Автор: Aiwan Sep 18 2005, 21:18

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)); // Что бы случайно не забыл
}

Автор: _kaa_ Sep 19 2005, 09:06

QUOTE (Aiwan @ Sep 18 2005, 21:18)
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: ActionTaken  am_at_npc_exit
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
        NPC уходит на точку и дестроится

   Ставим на диалог с НПС, устанавливаем в локации
   вейпоинт "AM_WP_NPC_EXIT". Если надо что бы НПС
   побежал к точке, то присвоим на поинт локалку
   "RUN".

*/

Весьма полезный скрипт. Можно его чуток доработать, чтобы тег вейпоинта был не всегда одним, а зависел от тега самого моба (или совпадал, или с него начинался).

Автор: Aiwan Sep 19 2005, 11:54

_kaa_ , yes.gif согласен. Может кому нужны несколько точек персонально. Заморочки писать не стал со стрингами и прочим, это новичкам сложно. biggrin.gif
Этот скрипт в отличие от верхнего отправляет НПС на ПЕРСОНАЛЬНЫЙ вейпоинт.

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)); // Что бы случайно не забыл
}


Еще простенький скрипт для описания предметов и ставить точку на локации. Выглядит так: вы подошли к вывеске, нажали использовать ее, у вас высветилась строка над ней и на карте появилась метка с названием гостиницы к примеру. Метка карты должна быть с тегом WP_ADD_MAP_NOTE и быть не дальше чем 5 (Пол квадратика тайла) метров от объекта. Но учтите, вы должны будете написать название на точке, но не ставить галочку Map Note Enebled.

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); // Пометим это
    }
}

А, чуть не забыл! scratch_one-s_head.gif Локальный стринг "DISCRIPTION" - Это в свойствах объекта вписываете GetLocalString с именем DISCRIPTION а вот в строке пишете описание предмета.

 

Автор: Lex Sep 22 2005, 14:44

QUOTE (Lex @ Sep 22 2005, 15:44)
описание - локальный стринг "DISCRIPTION".

есть другой вариант. Описание делаем в описании таблички, а в скрипте делаем
Neverwinter Script Source
AssignCommand(oPC ,ActionExamine(OBJECT_SELF));

Айван: а вот это прикольно. Я не знал. Сенькс.
29.09.Айван: Лекс, это СОВСЕМ ДРУГАЯ ИСТОРИЯ wink.gif Поюзай функцию...


LEX: а я не говорил, что это то же самое. Это просто другой вариант прочтения описания на табличке. Не как текст, что над ней появляется. smile.gif

Автор: Aiwan Oct 2 2005, 14:43

Стандартный скрипт на слот 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));
    }
}

Для верной работы с паузами на вейпоинтах и с передвижением бегом по точкам, надо найти в стандартном скрипте x2_def_heartbeat такие строки и заменить моими ниже.
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 ======================================

Автор: Aiwan Oct 8 2005, 11:07

Проверка Харизмы у игрока. Если она 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;
}


Проверка навыка ОБМАНУТЬ (Bluff). Если удачно, то строка появится, если нет, то не появится.
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());
}


Добавлено в [mergetime]1128759063[/mergetime]
Все эти скрипты можно легко изменить под себя и проверить не харизму, а силу к примеру. И не 16, а 12. Думаю, это легко.

Автор: Aiwan Oct 9 2005, 19:26

Универсальный скрипт, который ставится на люк (Деревянный) и когда РС его открывает и нажимает на него второй раз, то перемещается к объекту с Тагом равным 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);
         }
}

Автор: Aiwan Jan 18 2006, 02:00

Ставим скрипт на OnEnter енкаучера. Делаем его не активным и что бы срабатывал один раз. Дальше все вс скрипте. Указываем условие при котором он будет срабатывать и сколько раз. У меня например если игрок не член банды черных рейдеров. У вас может быть свое.

NSS
//:://////////////////////////////////////////////
//:: OnEnter  am_een_local_on
//:: Copyright © 2006 WRG!
//:://////////////////////////////////////////////
/*
  Включает енкаучер, если на РС нет ни одной
  локальной переменной равной стрингу LOCAL_PC_0X
  float "TIME" - время срабатывания енкаучера
  Локалка "NUMBER" - означает сколько раз сработает.
  Если ее нет, сразу уничтожится.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 04.05.2006
//:://////////////////////////////////////////////

void main()
{
  object oPC = GetEnteringObject();
  object oEnc = OBJECT_SELF;
  object oArea = GetArea(OBJECT_SELF);
  float f = GetLocalFloat(oEnc, "TIME");
  int i = GetLocalInt(oEnc, "NUMBER");
  string sLl = GetLocalString(oEnc, "LOCAL_PC_01"); // Локальные переменные
  string sL2 = GetLocalString(oEnc, "LOCAL_PC_02"); // при каторых енкаучер
  string sL3 = GetLocalString(oEnc, "LOCAL_PC_03"); // не сработает.
  string sL4 = GetLocalString(oEnc, "LOCAL_PC_04");
  string sL5 = GetLocalString(oEnc, "LOCAL_PC_05");
  int iFalse;

  if(!GetIsPC(oPC)) return;
  if(GetLocalInt(oEnc, "FIGHT!")) return; // Енкаучер сработал
  if(sLl=="" && sL2 =="" && sL3=="" && sL4=="" && sL5=="") return;

  if(GetLocalInt(oPC, sLl) || GetLocalInt(oPC, sL2) || GetLocalInt(oPC, sL3)
  || GetLocalInt(oPC, sL4) || GetLocalInt(oPC, sL5))
  {

    return;
  }
  if(i == 0) // Если 0, то отключаем
  {
      // Манчи плачут на взрыд...
      return;
    }
    else if(GetEncounterActive(oEnc) == FALSE)
      {
        if (f == 0.0) f = 600.0; // 10 минут, стандартный респавн
        SetEncounterActive(TRUE);
        DelayCommand(1.0, SetEncounterActive(FALSE, oEnc));
        SetLocalInt(oEnc, "FIGHT!", TRUE);
        // Тут самое интересное. Неактивный енкаучер DelayCommand не исполняет
        // поэтому я попросил это сделать локацию, в котором он стоит. Она вроде
        // как не против...
          SetLocalInt(oEnc, "NUMBER", i-1);
          AssignCommand(oArea, DelayCommand(f, SetLocalInt(oEnc, "FIGHT!", FALSE)));

      }
      else return;
}

Автор: Aiwan Mar 31 2006, 07:09

НПС после нападения становится нейтральным и начинает диалог с РС. В свойствах НПС поставь Immortal галочку. Что бы не убить его с одного удара.

NSS
//------------------------------------------------------------------------------
//  Добавляем на хертбит Нпс.
//------------------------------------------------------------------------------
    object oSelf = OBJECT_SELF;
    object oPC = GetFirstPC(); // Это самое простое. Можно узнать по демагу или ближайший крич
    int iCurHP = GetCurrentHitPoints(oSelf); // Количество поинтов максимум о Нпс
    int iMaxHP = GetMaxHitPoints(oSelf); // Сколько в данный момент
    if(!GetLocalInt(oSelf, "STOP"))
    {
      if (iCurHP < iMaxHP/4) // Четверть нр от общего или меньше
      {
        // Если это враг то меняем ему фракцию на комманера. Если нет, то убери эту строку
        ChangeToStandardFaction(oSelf, STANDARD_FACTION_COMMONER);
        SetLocalInt(oSelf, "STOP", TRUE);
        AssignCommand(oPC, ClearAllActions(TRUE));
        AssignCommand(oSelf, ClearAllActions(TRUE));
        ClearPersonalReputation(oPC, oSelf);
        AssignCommand(oSelf, PlayAnimation(ANIMATION_LOOPING_TALK_PLEADING, 1.0, 5.0));
        DelayCommand(0.3, SetCommandable(FALSE, oPC));
        DelayCommand(1.5, AssignCommand(oSelf, SpeakString("Дядя, простите, я больше так не буду!")));
        /*
        Тут описываешь важнецкие клятвы в верности, слезные истории про трудное дество...
        */

        DelayCommand(5.0, AssignCommand(oSelf, ActionMoveToObject(oPC)));
        DelayCommand(5.4, AssignCommand(oSelf, ActionDoCommand(SetCommandable(TRUE, oPC))));
        DelayCommand(5.6, AssignCommand(oSelf, ActionStartConversation(oPC)));
      }

    }

//------------------------------------------------------------------------------


Появление строки в диалоге Нпс. Строка диалога равна имени ближайшего поинта с тагом WP_STRING. Строка дожна быть в диалоге всегда ОДНА и содержать токен <CUSTOM220>. А содержание = имя вейпоинта.
NSS
//:://////////////////////////////////////////////
//:: Выдает стринг, если НПС рядом с поинтом
//:: Copyright © 2006 WRG!
//:://////////////////////////////////////////////
/*
    Таг нашего поинта. WP_STRING
    <CUSTOM220> - [Имя поинта - строка НПС]
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 17.01.2006
//:://////////////////////////////////////////////
int StartingConditional()
{
  object oWp = GetNearestObjectByTag("WP_STRING"); // Берем ближайший объект с тагом "WP_STRING"
  float fDist = 20.0f; // Расстояние реакции, дальше 20 метров строки не будет
  float fZone = GetDistanceBetween(OBJECT_SELF, oWp); // Дистанция срабатывания
//-------------------------------------------------------
  if(GetIsObjectValid(oWp)) // Если такой объект существует
  {
    if (fDist < fZone) // Если дистанция между Нпс и Поинтом больше установленной 20 м.
      return FALSE; // Строка не появится
      else // в противном случае (ЕЩЕ)
      {
          string sMessage = GetName(oWp); // Стринг sMessage равен имени поинту
          SetCustomToken(220, sMessage); // Установим токен 220 равный этому стрингу
          return TRUE; // Вернем строку функции StartingConditional(). Она покажет ее игроку
      }
    }
    else return FALSE; // Если такого объекта oWp нет, то нечего не появится
}

Автор: Sugo77 May 14 2008, 21:59

А этот скрипт на проверку игрока в другой локации,куда вставлять?Aiwan не указал(

Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
//-------------------------------------------------------
    if (GetTag(GetArea(OBJECT_SELF))=="ТАГ_ЛОКАЦИИ")
        {
        return TRUE;
        }
    return FALSE;
}


В этом скрипте (скрипт для сидения на стуле)при нажатии F7 выдает ошибку в 10,11 пунктах,он неправильный ,исправьте и проверьте его в игре пожалуйста,я тоже хочу его использовать в своем модуле,только этот вариант не работает: sad.gif
Neverwinter Script
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 акции
    }
}

}


Ошибку выдает вот тут AssignCommand(oPC, ActionSit(oChair));


Автор: Aiwan May 15 2008, 18:20

Цитата(Sugo77 @ May 14 2008, 23:59) *
А этот скрипт на проверку игрока в другой локации,куда вставлять?Aiwan не указал(

Функция StartingConditional() ставится ТОЛЬКО В ДИАЛОГАХ.
Цитата(Sugo77 @ May 14 2008, 23:59) *
Ошибку выдает вот тут AssignCommand(oPC, ActionSit(oChair));

Версия НВН?

Автор: Ogneslav Jul 2 2008, 19:09

Товарищи, я бы хотел сделать заклинание glyph of warding(символ охраны) эпическим, тоесть усилить его, в принцыпе это для меня было не сложно, вопрос возник в скриптах, так как я в скриптах не разбираюсь вообще(недавно только самоучитель скачал),
я хочу вас попросить написать мне пример этого скрипта обьяснить где что менять и куда писать потом адрес на скрипт!

Автор: Aiwan Jul 2 2008, 19:24

Вопрос не по этой теме. Задай в теме вопросов по скриптам. На это сообщение отвечать не надо.

Автор: Chiffa Nov 14 2008, 02:09

Да, хороший скрипт, который отправляет непися в точку и уничтожает. А когда неписей много (простая сценка: герой освобождает узников, и они бегут к двери тюрьмы, осыпая героя благодарностями. Писать для каждого непися отдельный скрипт с разными репликами? А если попробовать так:

Neverwinter Script
void main()
{
object oPC = GetFirstPC();
object oNPC = OBJECT_SELF;
object oDE =  GetObjectByTag("DESTR_" +GetTag(oNPC));
object oWP = GetObjectByTag("WP_SPEAK_" + GetTag(oNPC));
string oName = GetName(oWP);
AssignCommand(oNPC,ClearAllActions());
DelayCommand(0.0,ActionPauseConversation());
DelayCommand(1.0, SpeakString(oName));
DelayCommand(1.5,AssignCommand(oNPC, ActionForceMoveToObject(oDE, TRUE)));
DelayCommand(2.0,ActionDoCommand(DestroyObject(oNPC)));
}

Фмшка тут в невидимых объектах с тегами "DESTR_ + тег непися, которого к этому объекту посылаешь, и вейпе "WP_SPEAK_ + тег непися, в имени которого мы пишем все, что нам надо, и неписи бодро эти имена вейпов цитируют перед забегом. Универсальный скрипт, один для всех неписей. Кстати, если уничтожать не надо, а тртебуется просто послать непися в определенной место, с нужной репликой, скрит такой же, только без последней строчки. И невидимый объект я тогда ставлю не "DESTR_" , а "PLACE_", но это уже чтобы не путаться.
Или почти также, но чуть более иначе. К примеру, в моей сказке герой бывает часто (очень часто) озадачен, даже ошарашен. В диалоге появляется строка: "<StartAction>[Присесть. Почесать репу.]</Start>", жмешь не нее, и происходит следующее:
Neverwinter Script
void main()
{
object oPC = GetPCSpeaker();
object oTaget =  GetArea (oPC);
object oWP = GetNearestObjectByTag("WP_SPEAK_" + GetTag(oTaget));
string oName = GetName(oWP);
AssignCommand (oPC, SpeakString(oName));
DelayCommand(0.0,ActionPauseConversation());
DelayCommand(0.1,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_L
OOPING_SIT_CROSS,1.0f,3.0f)));
DelayCommand(0.6,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_F
IREFORGET_PAUSE_SCRATCH_HEAD)));
DelayCommand(1.0,ActionResumeConversation());
}

Герой, понятное дело, тега не имеет (или мы его не знаем?) . Вейп "WP_SPEAK_" привязан, как видим, к местности. То есть с помощью одного скрипта в кажой локации герой может брякнуть что-то эксклюзивное. Что именно - опять таки пишем в имени вейпа. Кстати, к тегу местности можно привязать и реплику непися, если тег самого непися уже использован в другой реплике.
И подобных универсальных скриптов у меня в сказке много. К примеру, непись ведет героя опять же к определенной точке, произнося реплику, открывая дверь "DOOR_ + тег непися (местности)". И т. д., и т. п. Даже скрипт с заменой имени персонажа (с вопроса о нем я впервые вышел на форум "Вопросы новичков") я сделал униврсальным (пришлось много кого переименовывать). И теперь он выглядит так:
Neverwinter Script
void main()
{
void main()
{
object oPC = GetFirstPC();
object oNPC = OBJECT_SELF;
object oSet = GetObjectByTag("SETNAME_" + GetTag(oNPC));
string Ona = GetName(oNPC);
string Oname = GetName(oSet);
DeleteLocalString(oNPC, Ona);
SetName(oNPC,Oname);
}

Потому хотел бы спросить у мастеров совета. Может, я делаю ошибку? Вдруг это стремление к универсальности имеет обратную сторону? Ну, к примеру, движок перегружает или еще какой вред?
Спасибо.

Автор: Ilerien Nov 14 2008, 22:26

Стремление к универсальности в порядке вещей, если есть несколько скриптов, которые делают примерно одно и то же, и есть возможность собрать их в один, не урезая функциональность (возможно, просто с добавлением каких-то объектов типа тех же вейпов либо с привязкой к тегу/рефу/...), то делать это надо smile.gif
Не понял, зачем в последнем скрипте тебе DeleteLocalString(), имя прекрасно поменяется и так smile.gif И лишний мэйн declare.gif

Автор: Chiffa Nov 15 2008, 02:49

Цитата
Не понял, зачем в последнем скрипте тебе DeleteLocalString(), имя прекрасно поменяется и так

Ilerien ты не поверишь - не меняется! И вообще творятся "чудеса" всяческие! У меня три "Невера" - "Шадоу", (собственно, ради ПЛ), мой старый "Хордес" и версия 1.69, свежепропатченная. Так вот, одни и те же скрипты то работают, то нет!. И ладно бы еще в разных версиях. Бывает, что не срабатывают в одной и той же версии, но в разных модах! (К примеру, на "Полигоне" все прекрасно, а копирую в "Сказку" и получаю большую фигу!) И ладно бы еще какие навороты с фильмами или вроде того... Нет, "глючат" детские скрипты проверки ветки диалога и тому подобное. Только один пример, для наглядности. В "совершены действия" диалога ставлю
Neverwinter Script
void main()
{
    object oPC = GetFirstPC();
    object oNpc = GetObjectByTag("NPC_TAG");
SetLocalInt(oNpc, "talked", 1);
}

Или еще проще:
Neverwinter Script
void main()
{
SetLocalInt(OBJECT_SELF, "talked", 1);
}

А потом проверяю, что этот самый "talked" действительно 1, не больше и не меньше:
Neverwinter Script
int StartingConditional()
{
    int iResult;

    iResult = GetLocalInt(GetObjectByTag("NPC_TAG"), "talked") == 1;
    return iResult;
}

Так вот, на "Полигоне" ветка диалога открывается прекрасно, проверял на нескольких неписях неоднократно. А в "Сказке" то же самое, один в один - не работает. И подобных примеров у меня - множество, каждый описывать - никаких форумов не хватит... Может, наши гуру расскажут что-то полезное об этих, так сказать "универсальных" скриптовых глюках? Ну, которые встречаются наиболее часто. Если не совсем по теме просьба, прошу прощения. Но, думаю, такой "ликбез" для новичков будет полезен.
Спасибо
P.S. Дабы не отнимать зря время мастеров, объясню сразу: ошибки с настроиками пользователя, свойствами модуля, подключением хаков - исключены. В "Сказке" и "Полигоне" они абсюлютно идентичны. Причины в чем-то другом...

Автор: Nao May 19 2009, 18:20

Хмм. я тоже придложу два простеньких скрипта для новичков. Возможно вы скажете что они СЛИШКОМ простые, но такие мелочи как мне кажется делают игру более правдоподобной и приятной
Итак


Я называю его "не лезь - убьет". Что-то вроде ловушки, но без спаса на рефлекс и срабатывает ПОСЛЕ разрушение\убийства объекта. Для замены количества\типа урона меняем
DAMAGE_TYPE_SONIC
на
DAMAGE_TYPE_COLD (например)
А циферку 300 в скрипте - на нужное количество урона

Neverwinter Script
void main()
{

object oPC = GetLastKiller();

while (GetIsObjectValid(GetMaster(oPC)))
   {
   oPC=GetMaster(oPC);
   }

if (!GetIsPC(oPC)) return;

int DoOnce = GetLocalInt(oPC, GetTag(OBJECT_SELF));

if (DoOnce==TRUE) return;

SetLocalInt(oPC, GetTag(OBJECT_SELF), TRUE);

effect eEffect;
eEffect = EffectDamage(300, DAMAGE_TYPE_SONIC, DAMAGE_POWER_NORMAL);

ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);

}

Автор: Lex May 20 2009, 08:41

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

Автор: Nao May 21 2009, 18:43

можно заменить альтернативно: ставим урон на 10000 и выбераем божественный урон. Против божественной нет иммунов. Итого выходит:

Neverwinter Script
void main()
{

object oPC = GetLastKiller();

while (GetIsObjectValid(GetMaster(oPC)))
  {
  oPC=GetMaster(oPC);
  }

if (!GetIsPC(oPC)) return;

int DoOnce = GetLocalInt(oPC, GetTag(OBJECT_SELF));

if (DoOnce==TRUE) return;

SetLocalInt(oPC, GetTag(OBJECT_SELF), TRUE);

effect eEffect;
eEffect = EffectDamage(10000, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_NORMAL);

ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC);

}





Ну а это уже собственно с EffectDeath, как заказывалиsmile.gif Без спасов, без ДЦ - просто смерть

Neverwinter Script
void main()
{

object oPC = GetLastKiller();

while (GetIsObjectValid(GetMaster(oPC)))
  {
  oPC=GetMaster(oPC);
  }

if (!GetIsPC(oPC)) return;

object oTarget;
oTarget = oPC;

effect eEffect;
eEffect = EffectDeath();

ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, 60.0f);

}


Да, кстате, если в этой строчке заменить слово Death на любой другой эффект - скрипт будет работать.
eEffect = EffectDeath();
Например если заменить на Curse - будет курсить статы, а если например на Ability Decrease - будет курсить ловкость. Надеюсь кому-то пригодиться

Автор: Lex Aug 18 2010, 11:31

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

Автор: tyrrael Oct 4 2010, 19:20

можно ли зделать так, чтобы войдя в установленую тригером локацию, над игроком появилась надпись секунды на 3. а потом ищезла и не появлялась.Я хочу зделать чёто типо когда я вхожу куданибуть,например в комнату и ГГ говорил например:милая комнатка.

Автор: Deirel Oct 4 2010, 21:21

tyrrael, можно просто сделать так:

Neverwinter Script
void main()
{
    object oPC = GetEnteringObject();  // Существо, которое вошло в триггер
    if (GetIsPC(oPC))  // Проверяем, является ли существо игроком
    {
        AssignCommand(oPC, SpeakString("Милая комнатка!"));  // Пусть игрок скажет фразу
        // Следующая строка удаляет триггер. Она нужна, чтобы в следующий раз игрок ничего не сказал.
        // Если игрок должен говорить каждый раз, как входит в триггер, то строку удаляем :-)
        DestroyObject(OBJECT_SELF); 
    }
}


Скрипт ставится на событие OnEnter триггера.

Автор: tyrrael Oct 6 2010, 22:29

а можете по подробней сказать как зделать чтобы npc тупо ходили по локации днём и ночью шли в свои дома и стояли там до дня а потом опять ходили по городу

Автор: Aiwan Oct 7 2010, 12:03

Цитата(tyrrael @ Oct 7 2010, 01:29) *
а можете по подробней сказать как зделать чтобы npc тупо ходили по локации днём и ночью шли в свои дома и стояли там до дня а потом опять ходили по городу

а еще кушали, какали, ходили на работу, занимались сексом...
Да, мы знаем, как это делать! Подробности в http://www.city-of-masters.ru/forums/index.php?showtopic=1612#, в сообщении №16.

Автор: virus_found Oct 8 2010, 10:39

Цитата(Aiwan @ Oct 7 2010, 12:03) *
а еще кушали, какали, ходили на работу, занимались сексом...
Да, мы знаем, как это делать! Подробности в http://www.city-of-masters.ru/forums/index.php?showtopic=1612#, в сообщении №16.

lol.gif

Автор: Talarasha Jul 30 2011, 18:53

Наверное, многим известно, что к 1.69 галочка "No interrupt", регулирующая, может ли игрок тем или иным образом прервать диалог, перестала работать. Что очень плохо для синглплеерных модулей - зачастую преждевременное прерывание диалога может либо разрушить всю игровую логику, либо нагрузить скриптера кучей лишних проверок. Чтобы этого избежать, можно воспользоваться функционалом катсцен.
Стандартные OnConversation всех NPC в конечном итоге приводят к NW_C2_DEFAULT4, который и надо поменять следующим образом, добавив две строчки (выделены жирным):

Neverwinter Script
//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT4
/*
  Default OnConversation event handler for NPCs.

*/

//:://////////////////////////////////////////////////
//:: Copyright © 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:://////////////////////////////////////////////////

#include "nw_i0_generic"

void main()
{
    // * if petrified, jump out
    if (GetHasEffect(EFFECT_TYPE_PETRIFY, OBJECT_SELF) == TRUE)
    {
        return;
    }

    // * If dead, exit directly.
    if (GetIsDead(OBJECT_SELF) == TRUE)
    {
        return;
    }

    // See if what we just 'heard' matches any of our
    // predefined patterns
    int nMatch = GetListenPatternNumber();
    object oShouter = GetLastSpeaker();

    if (nMatch == -1)
    {
        // Not a match -- start an ordinary conversation
        if (GetCommandable(OBJECT_SELF))
        {
            ClearActions(CLEAR_NW_C2_DEFAULT4_29);
            SetCutsceneMode(GetFirstPC()); //ДОБАВЛЕНО
            BeginConversation();
        }
        else
        // * July 31 2004
        // * If only charmed then allow conversation
        // * so you can have a better chance of convincing
        // * people of lowering prices
        if (GetHasEffect(EFFECT_TYPE_CHARMED) == TRUE)
        {
            ClearActions(CLEAR_NW_C2_DEFAULT4_29);
            SetCutsceneMode(GetFirstPC()); // ДОБАВЛЕНО
            BeginConversation();
        }
    }
    // Respond to shouts from friendly non-PCs only
    else if (GetIsObjectValid(oShouter)
               && !GetIsPC(oShouter)
               && GetIsFriend(oShouter))
    {
        object oIntruder = OBJECT_INVALID;
        // Determine the intruder if any
        if(nMatch == 4)
        {
            oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER");
        }
        else if (nMatch == 5)
        {
            oIntruder = GetLastHostileActor(oShouter);
            if(!GetIsObjectValid(oIntruder))
            {
                oIntruder = GetAttemptedAttackTarget();
                if(!GetIsObjectValid(oIntruder))
                {
                    oIntruder = GetAttemptedSpellTarget();
                    if(!GetIsObjectValid(oIntruder))
                    {
                        oIntruder = OBJECT_INVALID;
                    }
                }
            }
        }

        // Actually respond to the shout
        RespondToShout(oShouter, nMatch, oIntruder);
    }

    // Send the user-defined event if appropriate
    if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE));
    }
}


Необходимо также поменять стандартный скрипт выхода из диалога nw_walk_wp, чтобы отменить повешанную ранее катсцену:
Neverwinter Script
#include "NW_I0_GENERIC"

void main()
{
    DelayCommand(1.2f,SetCutsceneMode(GetFirstPC(),FALSE));
    WalkWayPoints();
}

Задержка в 1.2f здесь необязательна, но избавляет от резкого рывка камеры по выходу из диалога.
По такому же принципу меняются и все другие скрипты. Например, скрипт для размещаемых объектов x0_startconv:
Neverwinter Script
void main()
{
    SetCutsceneMode(GetFirstPC());
    ActionStartConversation(GetLastUsedBy());
}

Автор: ReZkiy Aug 28 2011, 14:31

Послушайте,пожалуйста.
Мой случай происходит дома у НПС.Мне нужно,что бы этот 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);


}

Проверял!Работает!

Цитата(ReZkiy @ Aug 28 2011, 16:29) *
Послушайте,пожалуйста.
Мой случай происходит дома у НПС.Мне нужно,что бы этот NPC подбежал и сам начал разговор.
Мне не нужен весь скрипт,только часть.Вот я например - сделал триггер,когда герой на него наступает,над НПС появляется текст "Оу,к нам гости!",он подбегает ко мне и тупо стоит.А мне нужно,что бы появилась панель разговора.Как это осуществить?

П.С. Aiwan,спасибо за руководство игроделу.Помогает несказанно.

Вот скрипт,который я позаимствовал у "Bioware Corp.",предварительно отредактировав.
Здесь наш НПС сидит на полу и сфокусирован на любом обьекте перед ним,просто нужно его создать и указать TAG в скрипте.

Neverwinter Script
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);
   

}


Проверял!Работает!


Автор: wirTUS Aug 28 2011, 18:06

1) Извиняюсь за оффтоп
2) Эта тема не для задавания вопросов, но публикации скриптов, которые могут помочь новичкам для
3) Ответ - посмотри на лексиконе (http://nwnlexicon.com) материал по ActionStartConversation - это процедура (по лексикону - функция) начала разговора. Так же там имеет смысл посмотреть Function Category - Conversation. А так же имеет смысл просто туда заглядывать, архиполезный материал у них там, хех
4) Написал бы в ЛС/ICQ, но первое пока не доступно ReZkiy, второе же не указано в профиле. Еще раз извиняюсь за оффтоп

Автор: ReZkiy Aug 28 2011, 18:48

Цитата(wirTUS @ Aug 28 2011, 21:06) *
1) Извиняюсь за оффтоп
2) Эта тема не для задавания вопросов, но публикации скриптов, которые могут помочь новичкам для
3) Ответ - посмотри на лексиконе (http://nwnlexicon.com) материал по ActionStartConversation - это процедура (по лексикону - функция) начала разговора. Так же там имеет смысл посмотреть Function Category - Conversation. А так же имеет смысл просто туда заглядывать, архиполезный материал у них там, хех
4) Написал бы в ЛС/ICQ, но первое пока не доступно ReZkiy, второе же не указано в профиле. Еще раз извиняюсь за оффтоп


Простите за оффтоп,danila_alekseevich@mail.ru.Спасибо,с твоей помощью разобрался!У тебя есть готовые модули?Или пробники?Присылай,я посмотрю.Сам пока только втянулся в процесс,мой модуль еще в ранней стадии.Извиняюсь за оффтоп.

Автор: ReZkiy Aug 30 2011, 10:42

Мастера!Подскажите пожалуйста,что нужно в этой ситуации:
Я сделал внешне эффект заклинания на пещере некроманта.(Увядание,только эффект)
Что нужно делать,что бы этот эффект исчезал после смерти некроманта???

Автор: ReZkiy Aug 31 2011, 15:37

Если кому нужно: Мой личный скрипт мертвого.

Neverwinter Script
//::///////////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 12/08/2011
//::///////////////////////////////////////////////////
void main()
{
    KillAndReplaceDecorative(OBJECT_SELF);
}

Автор: Talarasha Sep 3 2011, 09:25

Цитата
Если кому нужно: Мой личный скрипт мертвого.

Твой "личный скрипт" не содержит ничего, кроме вызова несуществующей функции. Он ничего не сделает и даже не скомпилируется. Подозреваю, что вызов ты просто стащил с чужого модуля, а реализацию (или содержащий ее инклюд) выписать не догадался scratch_one-s_head.gif.
Цитата
Подскажите пожалуйста,что нужно в этой ситуации:

На OnDeath-событие некроманта надо вставить конструкцию по поиску и удалению нужного эффекта. Эффект ищется перебором всех доступных (пока GetIsEffectValid() текущего эффекта выдает истину), удаление делается функцией RemoveEffect() (она работает не только для creature). Пример можно посмотреть в лексиконе: http://www.nwnlexicon.com/compiled/function.removeeffect.html.

Автор: ReZkiy Sep 3 2011, 14:05

Цитата(Talarasha @ Sep 3 2011, 12:25) *
Твой "личный скрипт" не содержит ничего, кроме вызова несуществующей функции. Он ничего не сделает и даже не скомпилируется. Подозреваю, что вызов ты просто стащил с чужого модуля, а реализацию (или содержащий ее инклюд) выписать не догадался scratch_one-s_head.gif.

На OnDeath-событие некроманта надо вставить конструкцию по поиску и удалению нужного эффекта. Эффект ищется перебором всех доступных (пока GetIsEffectValid() текущего эффекта выдает истину), удаление делается функцией RemoveEffect() (она работает не только для creature). Пример можно посмотреть в лексиконе: http://www.nwnlexicon.com/compiled/function.removeeffect.html.

Зачем мне воровать?У меня есть у кого спросить.У меня он работает.ОТЛИЧНО работает.Почти все термины,переменные,образцы - английский язык.Если его перевести для себя все - нужно только уметь соединять правильно,поэтому я очень долго мучаюсь даже с простыми наборами...

ЗАБЫЛ!Слот OnSpawn - вот куда подходит моя муть.

Автор: Talarasha Sep 3 2011, 15:08

Цитата
ЗАБЫЛ!Слот OnSpawn - вот куда подходит моя муть.

Возьми любого NPC и выставь в этот слот свой скрипт, как он написан. Увидишь, что он не работает. По очень простой причине не работает - потому что это просто ничего не значащий набор букв до тех пор, пока в скрипт не добавлена реализация этой функции напрямую или инклюдом. Конкретно у тебя используется вызов ф-ции из инклюда x0_i0_corpses, автор Naomi Novik, и без подключения этого инклюда скрипт не будет компилироваться.

Реализацию ф-ции интересующиеся могут посмотреть там же. Суть ее отличия - убийство таргета без учета "plot"-флага.

Цитата
Почти все термины,переменные,образцы - английский язык.Если его перевести для себя все - нужно только уметь соединять правильно,поэтому я очень долго мучаюсь даже с простыми наборами...

Складываются в вижу слова не, смысл предложение.

Автор: ReZkiy Sep 4 2011, 12:50

Цитата(Talarasha @ Sep 3 2011, 18:08) *
Возьми любого NPC и выставь в этот слот свой скрипт, как он написан. Увидишь, что он не работает. По очень простой причине не работает - потому что это просто ничего не значащий набор букв до тех пор, пока в скрипт не добавлена реализация этой функции напрямую или инклюдом. Конкретно у тебя используется вызов ф-ции из инклюда x0_i0_corpses, автор Naomi Novik, и без подключения этого инклюда скрипт не будет компилироваться.

Реализацию ф-ции интересующиеся могут посмотреть там же. Суть ее отличия - убийство таргета без учета "plot"-флага.


Складываются в вижу слова не, смысл предложение.


Какая версия Невервинтера у тебя?Ъ
У меня работает,когда компливировал он мне выдал "Ошибка!Файл существует с данным содержанием существует!Заменить?"я и заменил.У меня работает.

Автор: greye Sep 4 2011, 13:36

Цитата(ReZkiy @ Sep 3 2011, 14:05) *
ЗАБЫЛ!Слот OnSpawn - вот куда подходит моя муть.

Цитата(ReZkiy @ Sep 4 2011, 12:50) *
У меня работает.

А по каким признакам ты определил, что это работает? rolleyes.gif

Автор: ReZkiy Sep 6 2011, 13:09

Цитата(greye @ Sep 4 2011, 16:36) *
А по каким признакам ты определил, что это работает? rolleyes.gif

Дохлый валяется.

Люди!А можно сделать так,что бы в трактире НПС сидел на указанной точке (WayPoint)а то когда лавку делаешь,там и столы и стулья уже есть,но пустые и сесть на них нельзя.Вопрос - На кой черт они там стоят если на них не сядешь???

Автор: denis0k Sep 6 2011, 16:35

Цитата
А можно сделать так,что бы в трактире НПС сидел на указанной точке (WayPoint)а то когда лавку делаешь,там и столы и стулья уже есть,но пустые и сесть на них нельзя.
В месте посадки создаётся невидимый плейс со скриптом стула. Скрипт стула тут раз 100 думаю выкладывали.

Автор: ReZkiy Sep 6 2011, 20:04

Цитата(denis0k @ Sep 6 2011, 19:35) *
В месте посадки создаётся невидимый плейс со скриптом стула. Скрипт стула тут раз 100 думаю выкладывали.

Спасибо!!!

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)