Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
2 страниц V   1 2 >  
Ответить в эту темуОткрыть новую тему
> Скрипты для новичков, Самые простые скрипты с описанием
Aiwan
сообщение Aug 23 2005, 17:53
Сообщение #1


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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


============================
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
Сообщение #2


Level 3
*

Класс: Паладин
Характер: Chaotic Evil
Раса: Человек



Долго думал, какой скрипт написать и решил, что новичкам, в первую очередь, будет интересно узнать вот о чем. Многое замечали, что при разговоре с 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, т.е. запретит вывод фразы. Но проге надо ж вывести хоть какую то фразу? :) Вот он и опускается на одну строчку вниз. Там нет никаких проверок, поэтому он свободно выводит вторую фразу. Вот скрипт, который нужно прописать в Actions Taken
Neverwinter Script Source
SetLocalInt(OBJECT_SELF, "FIRST_TIME", 1);  /* Присвоели переменной 1 и теперь она уже определена под другим значением
*/

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

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

LEX: PS: это расписано в вопросах и ответах
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Aug 24 2005, 15:50
Сообщение #3


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



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

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

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

Сообщение отредактировал -fenix- - Aug 24 2005, 19:42
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DraX
сообщение Aug 24 2005, 16:32
Сообщение #4


Level 3
*

Класс: Паладин
Характер: Chaotic Evil
Раса: Человек



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

ЗЫ: А если еще добавить проверочку, о которой я писал выше, что можно сделать еще и красивый диалог. Юзайте :D
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Aug 25 2005, 08:42
Сообщение #5


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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


Вечно меняющийся
Иконки Групп

Класс: Монах
Характер: True Neutral
Раса: Человек
NWN: Скриптинг [Sn]



ЗЫ: Небольшое уточнение, в посте 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 аддона. (СоУ)

Сообщение отредактировал Aiwan - Sep 22 2005, 19:11
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Aug 25 2005, 19:12
Сообщение #7


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



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

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

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

поправил

Сообщение отредактировал -fenix- - Aug 26 2005, 09:17
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Aug 26 2005, 08:14
Сообщение #8


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Скрипт закрывает дверь автоматически через заданное время. Ставится в слот 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
Забыл %) Ставится скрипт на 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
Сообщение #9


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [Sn]



Если хотите, чтобы НПС, как только увиде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("Ты сказал верный пароль");// ответ НПС
    }
}


Сообщение отредактировал -fenix- - Aug 26 2005, 17:04
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Aug 26 2005, 16:37
Сообщение #10


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



СКРИПТЫ БОЛЬШЕ НЕ ПОСТИТЬ. ТОЛЬКО МАСТЕРАМ РАЗРЕШАЮ ПИСАТЬ.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Sep 7 2005, 22:29
Сообщение #11


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Скрипт вешается на 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
Сообщение #12


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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
Сообщение #13


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



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

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

*/

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

Сообщение отредактировал _kaa_ - Sep 19 2005, 09:21
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Sep 19 2005, 11:54
Сообщение #14


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



_kaa_ , :yes: согласен. Может кому нужны несколько точек персонально. Заморочки писать не стал со стрингами и прочим, это новичкам сложно. :D
Этот скрипт в отличие от верхнего отправляет НПС на ПЕРСОНАЛЬНЫЙ вейпоинт.
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: Локальный стринг "DISCRIPTION" - Это в свойствах объекта вписываете GetLocalString с именем DISCRIPTION а вот в строке пишете описание предмета.
Прикрепленные файлы
Прикрепленный файл  add_map.jpg ( 26.9 килобайт ) Кол-во скачиваний: 10
 
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 22 2005, 14:44
Сообщение #15


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

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

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


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

Сообщение отредактировал Lex - Oct 2 2005, 15:05
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Oct 2 2005, 14:43
Сообщение #16


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Стандартный скрипт на слот 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
Сообщение #17


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Проверка Харизмы у игрока. Если она 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
Сообщение #18


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Ставим скрипт на 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
Сообщение #20


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



НПС после нападения становится нейтральным и начинает диалог с РС. В свойствах НПС поставь 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
Сообщение #21


Level 3
*

Класс: Монах
Характер: Lawful Good
Раса: Эльф



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

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


В этом скрипте (скрипт для сидения на стуле)при нажатии F7 выдает ошибку в 10,11 пунктах,он неправильный ,исправьте и проверьте его в игре пожалуйста,я тоже хочу его использовать в своем модуле,только этот вариант не работает: (IMG:style_emoticons/kolobok_light/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));



Сообщение отредактировал Sugo77 - May 14 2008, 22:06
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение May 15 2008, 18:20
Сообщение #22


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

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

Версия НВН?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ogneslav
сообщение Jul 2 2008, 19:09
Сообщение #23


Level 4
**

Класс: Друид
Характер: True Neutral
Раса: Человек



Товарищи, я бы хотел сделать заклинание glyph of warding(символ охраны) эпическим, тоесть усилить его, в принцыпе это для меня было не сложно, вопрос возник в скриптах, так как я в скриптах не разбираюсь вообще(недавно только самоучитель скачал),
я хочу вас попросить написать мне пример этого скрипта обьяснить где что менять и куда писать потом адрес на скрипт!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 2 2008, 19:24
Сообщение #24


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Вопрос не по этой теме. Задай в теме вопросов по скриптам. На это сообщение отвечать не надо.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 14 2008, 02:09
Сообщение #25


Level 6
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Человек



Да, хороший скрипт, который отправляет непися в точку и уничтожает. А когда неписей много (простая сценка: герой освобождает узников, и они бегут к двери тюрьмы, осыпая героя благодарностями. Писать для каждого непися отдельный скрипт с разными репликами? А если попробовать так:
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);
}

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

2 страниц V   1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 20:16