Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Aiwan
2GoDoom воткни в начало и будет меньше проблем.
Neverwinter Script Source
//    if (GetArea(OBJECT_SELF)!=GetArea(GetNearestPC())) {return;}
      /*  Проверка для игры несколькими игроками. Разкомментируйте
        если вы собираетесь провести здесь партию. */

    if (GetArea(OBJECT_SELF)!=GetArea(GetFirstPC())) {return;}
    /* Работает это для одиночного режима игры. Так проще и быстрее. */
Scaled
Пиветсвую всех.
На досуге решил спросить:
1. Обьясните плз, если не трудно, на примере мне функцию float
2. Не знаю где спросить - как можно добавить свой спецэффект заклинания, такое вообще можно?
3. Не помню, потом спрошу yes.gif
mamuc
QUOTE
Обьясните плз, если не трудно, на примере мне функцию float


float это не функция, а тип чисел с плавающей точкой ( 0.5-это число типа флоат, 3-число типа int)есть функции преобразующие числа одного типа в другой ( FloatToInt например) в скриптах весьма важно какими числами и переменными пользуешся и что за число(какого типа) получается в результате вычислений.
DBColl
QUOTE (Scaled @ Jun 8 2005, 05:31)
2. Не знаю где спросить - как можно добавить свой спецэффект заклинания, такое вообще можно?

Можно, если хорошо знаком с 3DMax'ом и MDL-плагином. Тема достаточно сложная.
Yuri
Народ, подскажите начинающему мейкеру.
Проблема такая.
Перс появляется в таверне в начале модуля. Модуль снгл будет порядка 5-го уровня. Нужно чтобы не пришел броневик или слабак, - баланс нужен. Раздеть и вычистить инвентарь могу. Рядом сундук поставить для одевания в шмотки соотв. уровню - все это делается. Но вот, нужен скрипт: если он ниже 5-го добавить экспы - тоже вроде не сложно, а вот как если он будет 20-го до пятого сделать? Вариант как в Леворе "Вы уже где-то были" - не очень нравится.
Pather
Ответ Yuri: Есть функция, называющаяся,кажется SetXP. Она меняет асболютное количество экспы у PC и может снять уровни, если экспы станет меньше. Так что, делаешь SetXP(oPC, 10000) и он становиться 5 уровня.
Добавлено в [mergetime]1118293160[/mergetime]
Не подскажете, как можно ограничить выбор класса/скиллов/фитов при левелянии? Скажем разрешить брать уровень класса, только если игрок нашел тренера для этого класса?
Aiwan
Попробуй на слот OnPlayerLevelUP модуля воткнуть проверку. Какую тебе самому решать. Нет ее, долой уровень назад.
minion
mamuc Еще вопрос: я читал, что любой предмет может вместить до 75 строк скрипта. Теперь у меня появились сомнения. Вдруг мой скрипт вылезет за эти рамки, что тогда делать?

QUOTE
и можно сделать так что бы обойтись и без поля int num; (неиспользовать)


А как ты тогда придлагаешь мне различать комбинации с 3 и 4 ингридиентами?
dumbo
minion
плохо читал. скрипт не имеет ограничений по объему. а речь шла об action queue - она вмещает максимум 75 акций.
minion
dumbo А-а-а-а! Спасибо что объяснил. И правда не внимательно прочитал! sorry.gif Остался еще один вопрос!
Pather
minion
Насчет 75 строк ты, наверно, перепутал. Есть ограничение 75 действий в очереди команд. Скажем, если ты приказал персу скастовать подряд на себя 10 разных спеллов, то иконки этих действий выстроятся в левом верхнем углу и он их по очереди выполнит. То же самое, когда ты даешь объекту команду через скрипт. И вот их очередь не может превышать 75.

Никаких ограничений на размер скриптов для предмета нет.
minion
Pather
Спасибо это я уже понял. Вот кто бы мне второй вопрос по скрипту ответил. mamuc предложил, но его пока нет. Может кто еще знает?
mamuc
ммм я вроде уже написал ,каким образом следовалобы это делать в общих чертах...
пожалуй напишу кокретный пример:
предположим что тот инклюд где ты определил структуру и написал SetupLab(nComboNumber) назыветься
craftspell_inc, тогда на OnClose сундука надо будет повесить примерно такой скрипт проверки наличия компонентов и , при успешной проверки, уничтожение компонентов и создание результата
Neverwinter Script Source
#include "craftspell_inc"

int CheckComponent(object oBox,struct stRec stR)
{
    int C1,C2,C3,C4;
    while (GetIsObjectValid(oItem))
    {
        if (GetTag(oItem)==stR.req1) C1 = TRUE;
        if (stR.req2=="" || GetTag(oItem)==stR.req2) C2 = TRUE;
        if (stR.req3=="" || GetTag(oItem)==stR.req3) C3 = TRUE;
        if (stR.req4=="" || GetTag(oItem)==stR.req4) C4 = TRUE;
        oItem = GetNextItemInInventory(oBox);
    }
    if (C1&&C2&&C3&&C4) return TRUE;
    return FALSE;
}


void main()
{
    object oBox = OBJECT_SELF;
    object oItem = GetFirstItemInInventory(oBox);
    if (!GetIsObjectValid(oItem)) return;
    int nComboNumber;
    // zdesj zadajesh tebe nuzhnim sposobom  znachenije nComboNumber
    // chtobi mozhno bilo bi vzjatj iz include craftspell_inc
    // strukturu skomponentami i rezuljtatom
    struct stRec stR;
    stR = SetupLab(nComboNumber);
    if(CheckComponent(oBox, stR))
    {
        oItem = GetFirstItemInInventory(oBox);
        while (GetIsObjectValid(oItem))
        {
            if (GetTag(oItem)==stR.req1) DestroyObject(oItem);
            if (GetTag(oItem)==stR.req2) DestroyObject(oItem);
            if (GetTag(oItem)==stR.req3) DestroyObject(oItem);
            if (GetTag(oItem)==stR.req4) DestroyObject(oItem);
            oItem = GetNextItemInInventory(oBox);
        }
        CreateItemOnObject(stR.rez,oBox);
    }
}

п.с. поскольку я человек ленивый, то за основу взял скрипт из соседней темы написаный Лехсом yes.gif

как видишь количество компонентов в рецепте здесь не используеться
minion
mamuc Спасибо! все супер! good.gif Но это все будет работать, если ингридиенты просто положить в сундук. А если мне надо что бы при кастовании определенного спелла?
Все равно спасибо за пример. Им я тоже воспользуюсь! good.gif
mamuc
QUOTE
А если мне надо что бы при кастовании определенного спелла?

ну тогда надо будет смодифицировать этот скрипт не ставить его наOnClose сундука,а пустить его через спеллхук например ..про спеллхук тут есть весьма подробно обьясненнопросто полистай темы и почитай
Scaled
javascript:ins("mamuc")
То есть проще говоря float - это дробное число.
А на примере какого-нибудь скрипта, а то я не очень сооброжу важность этого

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

Да вот еще хотел спросить: вот есть скрипт такой проверка простейшая наличия 1000 монет у игрока, основаный на if и else
как привизать его к диалогу,чтобы при наличии попадать на одну ветьв диалога, а при отсутствии на другую?
Tiger Greyhawk
1.
QUOTE (Scaled @ Jun 11 2005, 05:41)
То есть проще говоря float - это дробное число. А на примере какого-нибудь скрипта, а то я не очень сооброжу важность этого

в разных функциях используются разные числа. Если функция использует float, то именно число с
плавующей точкой и надо писать: void ActionMoveToObject(object oMoveTo, int bRun=FALSE, float fRange=1.0f). Т.е. : ActionMoveToObject(oWP, FALSE, 2.5); крич подойдет на расстояние 2.5 метра до oWP.
А если int, то именно int и надо void JumpToObject(object oToJumpTo, int nWalkStraightLineToPoint=1)
Т.е. JumpToObject(oWP, 3); крич "прыгнет" к третьему oWP по счету от предмета с которого запустился скрипт... здесь же не может быть 3.5 по счету предмет...
2.
QUOTE (Scaled @ Jun 11 2005, 05:41)
Обьясните как замкнуть диалог, т. е. когда есть в диалоге некое главное меню и после рассказа одной истории происхдит возвращение в начало, ан е выход из диалога.

на фразе, на которую надо "послать" диалог нажимаешь правую кнопку мышки и выбираешь "копировать", а на той, с которой надо послать нажимаешь "связать".


З.Ы. Лекс или Лем, в вопросах и ответах я не нашел этого dntknw.gif

3.
QUOTE (Scaled @ Jun 11 2005, 05:41)
Да вот еще хотел спросить: вот есть скрипт такой проверка простейшая наличия 1000 монет у игрока, основаный на if и else как привизать его к диалогу,чтобы при наличии попадать на одну ветьв диалога, а при отсутствии на другую?



QUOTE (Lex @ Feb 12 2005, 23:02)
ВОПРОС Есть диалог, в котором должно быть две ветки. Первая, в случае истинности условия, вторая в случае его ложности. Объясните поподробнее, куда должен вставляться скрипт и как его писать. (условие - наличие оружие в руках героя).

ОТВЕТЫ Ставишь один лишь скрипт на TextAppearsWhen в первой ветке. Neverwinter Script Source int StartingConditional() { object oPC = GetPCSpeaker(); if (GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) != OBJECT_INVALID){ // оружие в руке return FALSE; } return TRUE; }

Лито
Вот такая проблема. Не умею работать с DataBase, но необходимо сохранить стринг(сохранить его так, чтобы он пережил рестарт.)
Вот скрипт-инклюд:
Neverwinter Script Source
//##############################
//##############################

void SendMessageToAllPlayers( string sMessage );

void SendMessageToAll( string sMessage );

void CheckAccount( object oPC );

//##############################

void SendMessageToAllPlayers( string sMessage )
{
object oPlayer = GetFirstPC();
while( GetIsObjectValid( oPlayer ) )
  {
  SendMessageToPC( oPlayer, sMessage );
  oPlayer = GetNextPC();
  }
}

void SendMessageToAll( string sMessage )
{
SendMessageToAllDMs( sMessage );
SendMessageToAllPlayers( sMessage );
}

void CheckAccount( object oPC )
{
object oStore = "IPaddress";
string sStoreName = GetPCIPAddress( oPC );
string sAccount = GetCampaignString( oStore, sStoreName );

if( ( sAccount != GetPCPlayerName( oPC ) ) && ( sAccount != "" ) )
  {
  string sMessage = GetName( oPC ) + ". " + "Зафиксирована смена аккаунта. " + sAccount + " -> " + GetPCPlayerName( oPC );
  SendMessageToAll( sMessage );
  }
SetCampaignString( oStore, sStoreName, GetPCPlayerName( oPC ) );

}

Тестирую на Windows-сервере. До рестарта смену аккаунта засекает, после нет. dntknw.gif
minion
mamuc К примеру поставитть его на ОнСпеллКастедЭт? И как я предложил с самого начала отслеживать кастуемый спелл и затем проверять к какому комбо он подходит. Пошел работать. Позже выложу что у меня получилось.
Мефистофель
Ребят от чистого сердца прошу, помогите мне.
Постараюсь объяснить на пальцах. У меня задумка, Игрок входит в дом, пройдётся по нему посмотрит всё и пойдёт обратно, а дверь закрылась как так? И попытается найти выход, и тут попадется ему странная полка он отодвинет её и найдёт потайной путь в подземелье.
А теперь по русски. Мне нужно чтобы ПК вошел в локу и Дверь закрылась, и открыть её можно было бы, только определённым ключом, если ПК кликнет на дверь то начнётся разговор, с самим собой, и. Только после этого можно будет использовать полку, и поговорить с ней. Я понимаю скрипт сложный. Но самому мне не справится. dntknw.gif
minion
Для начала на событие локации ОнЭнтер повесь скрипт, который закроет дверь. На ОнЮзед двери повесь скрипт, который будет выполняться один раз. Т.е. запускать сам диалог. Следующая часть скрипта должна проверять на наличие ключа в рюкзаке. Если такого нет то сказать что дверь закрыта. Если есть то отпирать дверь и дестроить ключ. Вроде так.
Добавлено в [mergetime]1118514915[/mergetime]
На ОнЭнтер Вешаешь что-то типа:
Neverwinter Script Source
void main ()
{
  object oDoor = GetObjectByTag ("sdes` pewew` tag dveri");
  ActionCloseDoor (oDoor);
  SetLocked (oDoor, TRUE);
}

Добавлено в [mergetime]1118515322[/mergetime]
На ОнЮзед вешаешь что-то типа:
Neverwinter Script Source
void main ()
{
  int iDoOnce = 0;
  if (iDoOnce != 1)
  {
      \\ сдесь начинаешь говорить с ПС
      iDoOnce = 1;
      \\ и создаешь свою полку
  }
  \\сдесь проверяешь наличие ключа
}
Мефистофель
minion Насчёт первого скрипта я понел.
А вот насчёт второго, извени но обсалютно ничего, я просто скрипты плохо знаю.
minion
вот примерный скрипт:
Neverwinter Script Source
void ActionCreateObject (string sCreature, location lLoc)
{
    CreateObject(OBJECT_TYPE_PLACEABLE, sCreature, lLoc);
}

int PlayerHasItem(object oPC, string s)
{
    return  GetIsObjectValid(GetItemPossessedBy(oPC, s));
}

void main()
{
    object oPC = GetEnteringObject ();
    object oDoor = GetObjectByTag ("zdes piwew tag dveri")
    string sPolka = "zdes piwew resref polki, kotoruu sozdaem";
    location locPolka = GetLocation (GetWaypointByTag ("zdes piwew tag triggera mesta gde budet polka"))
    if (GetLocalInt (oPC, "DoOnce") == 0)
    {
        ActionStartConversation (oPC, "zdes piwew resref dialoga");
        ActionCreateObject (sPolka, locPolka);
        SetLocalInt (oPC, "DoOnce", 1); //teper dialog budet rabotat odin raz
    }
    //teper proveryaem nali4ie klu4a
    if (PlayerHasItem (oPC, "zdes piwew tag klu4a kotorim otkrivaetsya dver"))
    {
        SetLocked (oDoor, FALSE);
        ActionOpenDoor (oDoor);
        DestroyObject (GetObjectByTag ("zdes piwew tag klu4a"));
    }
    else
    {
        AssignCommand (oPC, SpeakString ("Sorry!! The door is locked!"));
    }

}
-fenix-
У меня такой вопросик. Если нужно сделать кутсцену в самом начале модуля, типа это сон герою снится, то как быть с запуском скрипта. Тут говорили, что на онэнтер локи скрипты ставить не льзя, они глючить будут. А если в начале скрипта черный экран сделать секунды на 3, это прокатит?
minion
Не знаю у меня висит на ОнЭнтер и работает нормально.
Я дописал свой скрипт!!! Огромное спасибо за помощь Aiwanу и отдельное спасибо mamucу. Теперь все готово и работает. Вот скрипт.
Этот кусок обзываем как spell_items_0
Neverwinter Script Source
struct stRec
{
    string req1;
    string req2;
    string req3;
    string req4;
    string req5;
    string rez;
};//sozdaem structuru dlya kombinacij

struct stRec SetupLab (int nSpellID)
{
    struct stRec stR;
    switch (nSpellID)
    {
        case 115:    //kislotnaya strela melfa
            stR.req1 = "NW_IT_MSMLMISC12"// bolotnaya yagoda
            stR.req2 = "NW_IT_MSMLMISC09"// glaz rakwasa
            stR.req3 = "NW_IT_MSMLMISC10"// yazik slaada
            stR.req4 = "NW_IT_MSMLMISK08"// bruho ognennogo guka
            stR.rez = "NW_IT_MRING004";    // to 4to hotim polu4it
            break;
        case 107:                          // volwebnaya raketa
            stR.req1 = "NW_IT_MSMLMISC12";
            stR.req2 = "NW_IT_MSMLMISC10";
            stR.req3 = "NW_IT_MSMLMISK14";//4erep gorgul`i
            stR.rez = "NW_IT_MBOOTS004";
            break;
    }
    return stR;
}

int CheckOneItem (string sItem, struct stRec strItem)
{
    if ((sItem == "") || (sItem == strItem.req1) || (sItem == strItem.req2) || (sItem == strItem.req3) || (sItem == strItem.req4) || (sItem == strItem.req5))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

int CheckFirstItem (string sItem, struct stRec strItem)
{
    if ((sItem == strItem.req1) || (sItem == strItem.req2) || (sItem == strItem.req3) || (sItem == strItem.req4) || (sItem == strItem.req5))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

int CheckComponent (struct stRec stR, object oBox)
{
    int C1,C2,C3,C4,C5;
    object oItem = GetFirstItemInInventory (oBox);
    while (GetIsObjectValid (oItem))
    {
        if (CheckFirstItem (GetTag(oItem), stR)) C1 = TRUE;
        if (CheckOneItem (GetTag(oItem), stR)) C2 = TRUE;
        if (CheckOneItem (GetTag(oItem), stR)) C3 = TRUE;
        if (CheckOneItem (GetTag(oItem), stR)) C4 = TRUE;
        if (CheckOneItem (GetTag(oItem), stR)) C5 = TRUE;
        oItem = GetNextItemInInventory (oBox);
    }
    if (C1&&C2&&C3&&C4&&C5) return TRUE;
    return FALSE;
// proveryaet sootvetstvuet li to 4to mi pologili v sunduk s kombinaciej

void BadResult ()
{
    object oPC = GetLastSpellCaster ();
    int nDamage = d20() * 2;
    effect eVis = EffectVisualEffect (VFX_IMP_FLAME_S);
    effect eDam = EffectDamage (nDamage, DAMAGE_TYPE_FIRE);
    DelayCommand (0.6, ApplyEffectToObject (DURATION_TYPE_INSTANT, eVis, oPC));
    DelayCommand (0.6, ApplyEffectToObject (DURATION_TYPE_INSTANT, eDam, oPC));
// esli ne sootvetstvuet nanosim povregdeniya

void CreateLabItem (int nCastedSpell)
{
    struct stRec stR;
    stR = SetupLab (nCastedSpell);
    if(CheckComponent(stR, OBJECT_SELF))
    {
        object oItem = GetFirstItemInInventory(OBJECT_SELF);
        while (GetIsObjectValid(oItem))
        {
            DestroyObject(oItem); // uni4togaem ob`ekti
            oItem = GetNextItemInInventory(OBJECT_SELF);
        }
        CreateItemOnObject(stR.rez);
    }
    else
    {
        BadResult ();
    }
}  // sozdaem vew,

вот основной скрипт
Neverwinter Script Source
#include "spell_items_0"
void main()
{
    CreateLabItem (GetLastSpell ());
}

Aiwan и mamuc good.gif good.gif good.gif
Мефистофель
Куча вопросов, блин. Вы уж простите. Но помогите. biggrin.gif
1.Как использовать функцию AktionAttak.
2. У Тулсете есть специальные триггеры битвы. Называется «Раскрасить Встретившихся». Дак вот как мне задать точку, чтобы именно от туда появлялись монстры.
3. Дайте, пожалуйста, скриптик, чтобы если Уничтожено 4 объекта с определенными Тегами. То строка в диалоге появится, если нет то нет.
-fenix-
2Мефистофель

1.
void ActionAttack(object oAttackee, int bPassive=FALSE)

object - это объект, на который будет происходить атака.
int bPassive - атака в пассивном (если стоит TRUE) или в активном режиме (если стоит FALSE)

2.
Цитата из Aurora Toolset Айвана. Прочитай его.
QUOTE

Если оставить наш encounter нарисованным на локации в виде большой области, то монстры
появятся по всему периметру. Если вам необходимо, чтобы нападение произошло из заданной
точки, то нужно нажать на очерченный encounter правой кнопкой мыши и выбрать пункт "Add
spawn point" (Рис. 46). Появится стрелка, указывающая на черный треугольник, этот
треугольник и будет точкой spawn'а монстров. Точек spawn'а может быть несколько, сделайте
их и перетащите мышкой в нужное место.
Рис. 46.
Важно! При точках spawn'а монстры будут появляться лицом в ту сторону, в которую
направлена самая маленькая сторона, являющаяся основанием равнобедренного
треугольника. И монстры будут появляться только из той точки, которая находится
перед наступившим на область encounter'а объектом (NPC, PC). Выглядит это так: вы
делаете encounter и ставите три точки spawn'а в разные стороны. С какой бы стороны вы
не подошли, противник всегда будет появляться в точке перед вами.
И еще один слот – OnExhausted. Он срабатывает, если вы выбрали опцию "Single-Shot
spawn" и в локации исчезли все противники.


Мефистофель
2-fenix-
Спасиб, а вот готовый скрипт про атаку взгянуть, можно а то я так ничё не понимаю.
-fenix-
2Мефистофель

3.

На OnDeath челов ставим это.

Neverwinter Script Source
void main()
{
  object oChel = GetObjectByTag ("Тег чела с кем базарить");

  SetLocalInt(oChel, "Первый чел, Второй, Третий, четвертый", 1);
}


А на проверку фразы это

Neverwinter Script Source
int StartingConditional()
{
    if(GetLocalInt(OBJECT_SELF, "Первый чел") == 1 &&

    GetLocalInt(OBJECT_SELF, "Второй чел") == 1 &&

    GetLocalInt(OBJECT_SELF, "Третий чел") == 1 &&

    GetLocalInt(OBJECT_SELF, "Четвертый чел") == 1)
        {
        return TRUE;
        }
    return FALSE;
}


Добавлено в [mergetime]1118684998[/mergetime]
QUOTE
Спасиб, а вот готовый скрипт про атаку взгянуть, можно а то я так ничё не понимаю.


Вот переделка скрипта на разговор

Neverwinter Script Source
void main()
{
  if(GetLocalInt(OBJECT_SELF, "Первый чел") == 1 &&

    GetLocalInt(OBJECT_SELF, "Второй чел") == 1 &&

    GetLocalInt(OBJECT_SELF, "Третий чел") == 1 &&

    GetLocalInt(OBJECT_SELF, "Четвертый чел") == 1)
    {
    ActionAttack(GetPCSpeaker(), False);
    }
}


Если все эти локальные переменные равны 1, то Чел будет атаковать заговорившего PC в активном режиме(а, что это значет ХЗ).

З.Ы Объясните, что значат эти режимы ПЛИЗЗЗ.
Scaled
Приветствую всех.

Как сделать в модуле, чтобы встреча спавнилась только ночью или только днем?
mamuc
Neverwinter Script Source
if (GetIsDay())
    {
          // i tut to chto nado delatj dnem
          //dlja nochi  pohozhe
    }
Lex
Том III находится тут
Lex
Том II находится тут
Scaled
Маmuc

Это понятно, я не знаю как активизировать эту размещаемую встречу.
Добавлено в [mergetime]1118828800[/mergetime]
Вот наступает ночь и встреча должна работать, а когда пиходит день - нет. Как это сделать?
Добавлено в [mergetime]1118828896[/mergetime]
Я хочу понять как активизировать встречу.

Во спросил yes.gif
DBColl
Scaled

Цитирую из Lexicon'а:
QUOTE

SetEncounterActive(int, object)

Sets an encounter to active or inactive.

void SetEncounterActive(int bNewValue, object oEncounter = OBJECT_SELF);



Parameters

bNewValue
TRUE if the encounter is active, otherwise FALSE.

oEncounter
The encounter to set active or inactive. (Default: OBJECT_SELF)



Description

Set oEncounter's active state to nNewValue.
When an encounter is exhausted it will set itself to be "not active".
If your encounter is set for "Continuous" respawns, it will reset itself to "active" each time the Respawn Time lapses.
If you want to use the SetEncounterActive function to control exactly when the encounter is active then you need to use the "Single Shot" setting on the encounter.



Remarks

From Victor Morales:
I have tried the SetEncounterActive function to spawn creatures at different times of the day. For example, I only wanted the undead in a cemetery to spawn if it was nighttime.
If the encounter active flag is set to FALSE to begin with (in the encounter GUI window when the encounter is created) then the SetEncounterActive function will spawn them properly the first time. It seems that the creatures are set to spawn before the OnEnter event is checked for validity. In addition, once the active flag is set it won't revert until the next time the encounter is triggered.
So I would have undead that would spawn at night properly, but once they spawned - if the time changed to day they would spawn at least one more time during daylight hours. Then the trigger would work properly again.
I tried to make it reset the active flag to active OnEnter, then the creatures would spawn, and to reset it to inactive OnExit. However, that didn't work either and the behavior stayed the same.
You can draw a trigger around the encounter and call this function from OnEnter of that trigger instead as a workaround.
dumbo
Scaled
общий смысл цитаты из лексикона сводится к тому, что если хочешь нормально управлять encounter'ом, то рисуй вокруг него триггер, и в OnEnter оного производи необходимые тебе действия. т.е. в твоем случае в OnEnter окружающего encounter триггера нужно вписать:
Neverwinter Script Source
void main()
{
  object oEnc = GetObjectByTag("тэг encounter'а");
  SetEncounterActive(GetIsNight(), oEnc);
}

ps. чтобы не париться с вырисовыванием триггера, проще нарисовать такой же по форме, но чуть больше по размерам и расположить encounter внутри этого триггера.

pss. тэг подправил.. ведь "dd_night_enc" могут и не понять. smile.gif
DBColl
dumbo
Совсем не обязательно вырисовывать внешний управляющий триггер. Достаточно эти функции юзать на самом Encounter в его OnEnter. wink.gif

Ночной.
Neverwinter Script Source
void main()
{
  SetEncounterActive(GetIsNight(), OBJECT_SELF);
}


Не ночной.
Neverwinter Script Source
void main()
{
  SetEncounterActive(!GetIsNight(), OBJECT_SELF);
}

Добавлено в [mergetime]1118833521[/mergetime]
ЗЫ. Такая схема вполне успешно ведет себя в Леворе. Так что ремарка от Виктора Моралеса ошибочна. pardon.gif
dumbo
DBColl
веришь-нет: еще до чтения ремарки проверил именно путем внедрения в OnEnter SetEncounterActive(GetIsNight()) - не ра-бо-та-ет. посмотрел на поведение, и мысли закрались о том, что он выплевывает крич либо до запуска OnEnter, либо просто после прогона OnEnter не проверяет active флаг. после увиденного пошел читать подробнее и в обнаруженной ремарке нашел подтверждение своих мыслей... smile.gif
видимо, у вас там что-то еще приделано... dntknw.gif
DBColl
QUOTE (dumbo @ Jun 15 2005, 14:15)
не ра-бо-та-ет. посмотрел на поведение, и мысли закрались о том, что он выплевывает крич либо до запуска OnEnter, либо просто после прогона OnEnter не проверяет active флаг. после увиденного пошел читать подробнее и в обнаруженной ремарке нашел подтверждение своих мыслей...видимо, у вас там что-то еще приделано...

Нет, все именно так, как я сказал. Просто там надо мутить как-то с настройками САМОГО ЭНКАУНТЕРА. Я помню, долго бился с этим вопросом и в итоге нашел именно то положение настроек (active, continued и тп), при котором такая схема заработала. wink.gif Хотя не исключаю, что что-то в энкаунтерах могло быть пофиксено в ХотУ, потому что Левор, как известно, делался на СоУ и именно ТАМ все работало.
dumbo
DBColl
прочитал описание еще раз smile.gif в настройках поставил Single Shot, Active сбросил - вот теперь все правильно работает с SetEncounterActive(GetIsNight()) в OnEnter encounter'a... wink.gif
-fenix-
В функции

Neverwinter Script Source
void ActionAttack(object oAttackee, int bPassive=FALSE)


FALSE и TRUE - это атака в пассивном и активном режиме, а что эти режимы подразумевают, как их понимать.
dumbo
-fenix-
пассивный режим означает то, что атакующий не будет бежать к атакуемому. если у него будет только оружие ближнего боя, то он будет курить бамбук. иначе постреляет.
-fenix-
Люди просветите, что в функциях делает это - int Reserved1(), int Reserved2...int Reserved85(), это ваще за чем?
dumbo
-fenix-
непонятно, откуда ты это выкопал - в скриптах биоваров такого нет. обычно, такого рода имена встречаются в параметрах функций, полях структур, и делается это для того, чтобы впоследствии не менялся размер структуры, формат вызова функции - резервируется для возможного будущего использования. применимо к именам функций, да еще и в "своих скриптах", это выглядит как-то так... покажи кусок скрипта, где ты это нашел, и расскажи где ты его(этот скрипт) нашел.

ps. в результате прений и мега-флуда(ныне почившего) было выяснено: функции ReservedXX были введены в xp1(SoU) и заменены в xp2(HotU) на группу функций типа itemproperty и функции работы с ними.
-fenix-
Тут вот особо продвинутые люди создают собственные функции, не подскажет ли кто из них как это делать?

Или тут так не объяснить? Тогда хоть скажите с помощью каких прог(иль в самом тулсете), я тогда сам буду ковыряться(без тупых вопросов не обойтисьbiggrin.gif).
Friedrich
QUOTE=-fenix-, Jun 17 2005, 11:24]Тут вот особо продвинутые люди создают собственные функции, не подскажет ли кто из них как это делать?[/QUOTE]
Если это "тупой вопрос", то
функции объявляются следующим образом:
<тип возвращаемого значения> <имя функции>(<список параметров>)
{
<тело функции, т.е. тут описано, собственно то что эта функция делает.>
}

Пример:
Neverwinter Script Source
//[NSS]
// Вот функция kill. Она ничего не возвращает, поэтому
// типом возвращаемого значения будет void
// Функция имеет два аргумента:
// object oVictim - это тот кого мы собираемся кильнуть
// int nVis - константа визуального эффекта, которым будет
// сопровождаться смерть несчастного.
void kill(object oVictim, int nVis=VFX_IMP_DEATH)
{
  effect eVis = EffectVisualEffect(nVis); 
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oVictim);
  ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oVictim);
}

// Вот функция hasItem, она проверяет наличие предмета с тегом sTagItem
// В инвентаре объекта oInventory
// Вернет TRUE если предмет есть, а иначе - FALSE
int hasItem(object oInventory, string sItemTag)
{
  return GetIsObjectValid(GetItemPossessedBy(oInventory, sItemTag));
}

// вот функция main - главная функция скрипта.
// С нее начинается выполнения сценария и из нее вызываются
// все остальные функции. Эта функция убет нарушителя, если
// тот наступит куда не следует, не имея соответствующего
// аусвайса!
void main()
{
  object oIntruder = GetEnteringObject();
  if(!hasItem(oIntruder, "Ausweis"))
  {
    kill(oIntruder);
  }
}


Добавлено в [mergetime]1119003303[/mergetime]
QUOTE (-fenix- @ Jun 17 2005, 11:24)
Скриптер проекта

swoon.gif
Если, вдруг имелось ввиду, как делать движковые функции, то сомневаюсь, что тут тебе кто-нить поможет (*слегка косится на Думбо*).
Хотя особо продвидуные наверное могут и не такое. Сделали ведь, говорять, какие-то умельцы SetName.
-fenix-
Friedrich
Я ни этот вопрос имел ввиду тупым. Я имел ввиду, что есле это трудно объяснить тут, то намекните и я сам буду разбераться, задавая попутно тупые вопросы.

А пользоваться этими функциями так ?
Neverwinter Script Source
void kill(object oVictim, int nVis=VFX_IMP_DEATH)
{
  effect eVis = EffectVisualEffect(nVis);
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oVictim);
  ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oVictim);

}

void main()
{
object oPC = GetPCSpeaker();

kill(oPC, VFX_IMP_DEATH);

}


их надо объявлять в каждом скрипте.

QUOTE
Если, вдруг имелось ввиду, как делать движковые функции, то сомневаюсь, что тут тебе кто-нить поможет

Было бы интересно, но я до этого еще не дорос smile.gif

QUOTE
Скриптер проекта

это к чему???

И еще вопросы
1) Есть в НвН массивы или какие - нибудь условия со счетчиком(как в паскале for) или их делать с помощью while?
2) Есть в НвН метки(как в паскале label)?
3) просветите, что такое инклюд и как его юзать.

Почему столько вопросов? Потому что у меня наконец появилось время для того, что бы заняться изучением НвН'овского скриптинга по человечески. !!!НАКОНЕЦ!!!

Вот скачал сейчас два томика smile.gif скриптов, веселый вечер у меня намечается.
Friedrich
Феникс, лексикон посмотреть не судьба? Или с аглицким вообще никак? Даже если никак, то все равно посмотреть на досуге будет не вредно.

А ежели в чего-то Паскале шаришь, то я чего-то не понимаю твоих вопросов про функуии. Все точно также. Если есть есть какой-то кусок кода, который требуется регулярно выполнять, или он просто содержит какие-либо логически связанные действия или вычисления, то их целесообразно отделить от основной программы в отдельный блок - функцию или процедуру (void-функции - это считай как процедуры). Пользываться самописными функциями затем можно как стандартными.

Чтобы не переписывать одни и те же функции в разных скриптах, их можно объединять в библиотеки - инклюды (Биоварские инклюды обычно называится nw_i0_* или x*_inc_*, нп: nw_i0_generic).

Директивой #include "filename" при компиляции соотыетствующий файл будет добавлен к основному скрипту. Инклюд не должен содержать функии main.

Далее,
1) циклы в НВСкрипте конечно есть:
int i;
for (i = 0; i < 5; i++)
{
// statements ...
// this loop will cycle i as 0, 1, 2, 3, and 4
}
Аналог for i:=0 to 4 do
или н.п.:
for(i = 4; i >= 0; i--){}
аналог: for i:= 4 downto 0 do

while (expression) { statement; }
выполняется, пока expression истинно. Как в паскале, в общем.

do {statement;} while(expression); Как repeat ... until, только выполняется пока условие истинно.

2) Меток и goto естественно нету, т.к. они есть атрибут "дурного стиля программирования" (или фортрана). biggrin.gif

3) Массивов как таковых нету, но если очень нужно - то их можно симулировать с помощью локалок по принципу:
Имя локалки = имя массива + номер ячейки. См. биоварский инклюд nw_o0_itemmaker

Еще советую почитать, хотя-бы книжечку по Си, которую тут Айван где-то выкладывал (на предмет синтаксиса). Хотя это не обязательно, Лексикону тебе за глаза хватит.
-fenix-
QUOTE
Феникс, лексикон посмотреть не судьба? Или с аглицким вообще никак? Даже если никак, то все равно посмотреть на досуге будет не вредно.


Да. С англицким вообще никак, но лексикон скачал и ковыряю его потихоньку с помощью сократа и лингво. sad.gif

У меня просто раньше времени не было разбераться в НвН скриптах, экзамены и все такое. Все, что увидел мельком, это if и локалки, их пока и юзал. Про циклы с пост и предусловием в статьях нашел, а про for и label нигде не написано, вот и спросил есть ли таковые. Спсибо за ответы good.gif

И новый вопросик

Перевод Валео ни кто не заканчивал?
Aiwan
QUOTE (-fenix- @ Jun 18 2005, 16:17)
Перевод Валео ни кто не заканчивал?

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