Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > 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, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Lex
открой модуль и посмотри монстров в кастомной палитре или на картах, какие там стоят скрипты в слоте onDeath. Если автор модуля писал свои скрипты на экспу, то только туда.
Lordeath
Вроде стандартный
Neverwinter Script
//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT7
/*
  Default OnDeath event handler for NPCs.

  Adjusts killer's alignment if appropriate and
  alerts allies to our death.
*/

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

#include "x2_inc_compon"
#include "x0_i0_spawncond"
#include "give_custom_exp"

void main()
{
    int nClass = GetLevelByClass(CLASS_TYPE_COMMONER);
    int nAlign = GetAlignmentGoodEvil(OBJECT_SELF);
    object oKiller = GetLastKiller();
    give_custom_exp(oKiller, OBJECT_SELF, 0);
    // If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    if(nClass > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        AdjustAlignment(oKiller, ALIGNMENT_EVIL, 5);
    }

    // Call to allies to let them know we're dead
    SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);

    //Shout Attack my target, only works with the On Spawn In setup
    SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(1007));
    }


В скриптах я полный нуб, но думаю мб дело в

#include "x2_inc_compon"
#include "x0_i0_spawncond"
#include "give_custom_exp"

На всякий случай вот "give_custom_exp"
Neverwinter Script
//#include "NW_I0_GENERIC"
//#include "_inc_inventory"
//void main(){}
// Remove this line if Scrotok's corpse code is not used.
//#include "_kb_loot_corpse"


//int  Debug = FALSE;          // Set to TRUE enables several debug lines.
                              // Debug info includes party shares, etc.

//int  Double_EXP = TRUE;      // Set to TRUE enables seeing first the PW
                              // experience followed by Bioware experience.
                              // This is useful to compare values.

float Experience_Slider = 0.42;// This is the percentage that can be adjusted.
                              // This value matches the Bioware slider.
float Exp_Level_Cap = 3.0;    // This is the basic CR cap.

int  Boss_Cap_Method = 3;    // These are mode sets for how bosses are handled
                              // Mode 1:  The CR of the boss is modified.
                              //          The exp cap is left at +8 CR.
                              // Mode 2:  The CR of the boss is left alone.
                              //          The exp cap is raised by the mod.
                              // Mode 3:  The CR of the boss is modified.
                              //          The exp cap is raised by the mod.

float Lower_Exponent = 1.50// This is the exponent that defines how exp
                              // drops off when the CR is lower than player.

float Higher_Exponent = 1.20// This is the exponent that defines how exp
                              // increases whent he CR is higher than player.

float Party_Proximity = 25.0// The distance a party member must be to get a
                              // share of the experience.

float Leveling_Exponent = 1.20;// This exponent defines how fast the exponent is
                              // when determining party shares.
                              // The following is the level difference and
                              // how it relates to shares:
                              // 1.10  at  10 levels difference = 1.63 shares
                              // 1.20  at  10 levels difference = 6.19 shares
                              // 1.30  at  10 levels difference = 13.79 shares

float Familiar_Split = 0.01// The ratio of shares that a familiar or animal
                              // companion receives.

float Henchman_Split = 0.01// The ratio of shares that a henchman or
                              // summoned creature receives.



    //  Absolutely, Positively do not call this function inside another loop
    //  that uses GetNextPC.  This can be used inside GetNextFactionMember().
void SendMessageToParty( object oMember, string sText )
  {

  object oPartyMember = GetFirstPC();
  while( GetIsObjectValid(oPartyMember) )
    {
    if( GetFactionEqual( oPartyMember, oMember ) )
      SendMessageToPC( oPartyMember, sText );
    oPartyMember = GetNextPC();
    }
  }

//  This routine comes from and idea from Tone Eternal.
//  It limits a player from gaining more experience after reaching enough to
//  continue to the next level.  This is not really a bug, but a short-coming
//  of the Bioware code.
//  This function is not used in version 1.4 or higher, but can be installed.


int GetLevel(object oPlayer)
{
    int iXP = GetXP(oPlayer);
    if(iXP < 1000)
        return 1;
    else if(iXP < 3000)
        return 2;
    else if(iXP < 6000)
        return 3;
    else if(iXP < 10000)
        return 4;
    else if(iXP < 15000)
        return 5;
    else if(iXP < 21000)
        return 6;
    else if(iXP < 28000)
        return 7;
    else if(iXP < 36000)
        return 8;
    else if(iXP < 45000)
        return 9;
    else if(iXP < 55000)
        return 10;
    else if(iXP < 66000)
        return 11;
    else if(iXP < 78000)
        return 12;
    else if(iXP < 91000)
        return 13;
    else if(iXP < 105000)
        return 14;
    else if(iXP < 120000)
        return 15;
    else if(iXP < 136000)
        return 16;
    else if(iXP < 153000)
        return 17;
    else if(iXP < 171000)
        return 18;
    else if(iXP < 190000)
        return 19;
    else if(iXP < 210000)
        return 20;
    else if(iXP < 231000)
        return 21;
    else if(iXP < 253000)
        return 22;
    else if(iXP < 276000)
        return 23;
    else if(iXP < 300000)
        return 24;
    else if(iXP < 325000)
        return 25;
    else if(iXP < 351000)
        return 26;
    else if(iXP < 378000)
        return 27;
    else if(iXP < 406000)
        return 28;
    else if(iXP < 435000)
        return 29;
    else if(iXP < 465000)
        return 30;
    else if(iXP < 496000)
        return 31;
    else if(iXP < 528000)
        return 32;
    else if(iXP < 561000)
        return 33;
    else if(iXP < 595000)
        return 34;
    else if(iXP < 630000)
        return 35;
    else if(iXP < 666000)
        return 36;
    else if(iXP < 703000)
        return 37;
    else if(iXP < 741000)
        return 38;
    else if(iXP < 780000)
        return 39;
    else return 40;
}

//  The main routine for giving experience to the player.
//  Created by David Bills.

void give_custom_exp( object oKiller, object oDead, int nCRMod )
{
    // Custom DMG EXP Script (varies slightly on bonuses and penalties)
    // Concept and Original Code By Helznicht
    // Syntax Clean-Up and Area Check Award by Mmealman
    // Major bug rennovation by David Bills.  1-9-03
    // Basic experience for creatures is around Bioware 3%.
    // To adjust this, modify the polynomial equation below.

    if( GetLocalInt( oDead, "AlreadyDyingEXP" ) == 1 )
    {
        DeleteLocalInt(oDead, "AlreadyDyingEXP");
        return;
    }

    // First get all the members of the party
    float LowestLevelMember = 1000.0;
    float HighestLevelMember = -10.0;

    float PartyShares = 0.0;
    float fLevel = 0.0;
    float fCRMod = IntToFloat( nCRMod );

    object oMaster, oHighest, oLowest;

    int bOld;
    int nTotalMembers = 0;
    int flxp1;
    int flxp;

    //check to see if oKiller was summon/familiar.  if so, changes oKiller to summon master.
    oMaster  = GetMaster(oKiller);
    if (GetIsObjectValid(oMaster))
    {
        if (oKiller == GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster)        ||
            oKiller == GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oMaster) ||
            oKiller == GetAssociate(ASSOCIATE_TYPE_DOMINATED, oMaster)      ||
            oKiller == GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oMaster)        ||
            oKiller == GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster)        ||
            oKiller == GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster))
                oKiller = oMaster;

    }


    object oPartyMember = GetFirstFactionMember(oKiller, FALSE );
    while( GetIsObjectValid(oPartyMember) && GetIsPC(oKiller))
    {
        if( GetArea(oKiller) == GetArea(oPartyMember)                      &&
            GetCurrentHitPoints( oPartyMember ) > 0                        &&
            GetDistanceBetween( oKiller, oPartyMember ) < Party_Proximity  )
          {
            nTotalMembers++;

            if( GetIsPC( oPartyMember ) )
                fLevel = IntToFloat( GetLevel( oPartyMember ) );
            else
                fLevel = IntToFloat(GetHitDice( oPartyMember ));
            if( LowestLevelMember > fLevel )
            {
                LowestLevelMember = fLevel;
                oLowest = oPartyMember;
            }
            if( HighestLevelMember < fLevel )
            {
                HighestLevelMember = fLevel;
                oHighest = oPartyMember;
            }
        }
        oPartyMember = GetNextFactionMember(oKiller, FALSE);
    }

    // Now we need to test for the Really low level creatures.
    // They need to be scaled as negative level to function properly.
    float fChallenge = GetChallengeRating( oDead );
    if( fChallenge < 1.0 )
        fChallenge =  1.0 - (( 1.0 - fChallenge ) * 5.0);

    // This is the level difference of the dead to the highest
    fLevel = fChallenge - HighestLevelMember;

    if( Boss_Cap_Method == 1 )
    {
        fLevel += fCRMod;
        if( fLevel >= Exp_Level_Cap )
            fLevel = Exp_Level_Cap;
    }
    else if( Boss_Cap_Method == 2 )
    {
        if( fLevel >= Exp_Level_Cap+fCRMod )
            fLevel = Exp_Level_Cap+fCRMod;
    }
    else
    {
        if( fLevel >= Exp_Level_Cap )
            fLevel = Exp_Level_Cap;
        fLevel += fCRMod;
    }


    //Calculate basic value of kill
    float FinalMonValue = 84.0 * HighestLevelMember + 750;

    // This is the exponential function to match the 3e rules.
    // There is some adjustment here to allow for smooth transitions.
    if( fLevel < 0.0 )
        FinalMonValue = FinalMonValue * pow( Lower_Exponent, fLevel );
    else
        FinalMonValue = FinalMonValue * pow( Higher_Exponent, fLevel );
    FinalMonValue = FinalMonValue * Experience_Slider;
    if( FinalMonValue < 0.0 )
        FinalMonValue = 0.0;

    PartyShares = 1.0;

    int nPenalty;
    if( PartyShares > 0.0 )
    {
        //Determine the value of the Split EXP
        // This is based on shares compared to the lowest member to the heighest.
        int SFEint;

        //Distribute EXP to all PCs in the Party based upon shares.
        float fMonst = GetChallengeRating(oDead);
        int HighestLevel = FloatToInt(HighestLevelMember);

        oPartyMember = GetFirstFactionMember(oKiller, TRUE);
        while ( GetIsObjectValid(oPartyMember) )
        {
          int iLeech =  HighestLevel - GetHitDice(oPartyMember);
            if (GetArea(oKiller) == GetArea(oPartyMember)                      &&
                GetCurrentHitPoints( oPartyMember ) > 0                        &&
                GetDistanceBetween( oKiller, oPartyMember ) < Party_Proximity  &&
                iLeech <= 10 )
            {
                SFEint = FloatToInt( FinalMonValue );

                int nCurLevel;
                if(HighestLevel > GetLevel(oPartyMember)+3)
                {
                    nCurLevel = FloatToInt(HighestLevelMember);
                }
                else
                {
                    nCurLevel = GetLevel(oPartyMember);
                }
                if(nCurLevel <= FloatToInt(fMonst)+3)
                {
                    if(GetLevel(oPartyMember) <= 5)
                        SFEint *= 2;

                    if(SFEint > 500)
                        SFEint = 500;

                    GiveXPToCreature(oPartyMember, SFEint);

                    int iCR = FloatToInt(fMonst);
                    int iGP = d20(1);
                    int iGPT = iGP + iCR*15;
                    if (iGPT < 1)
                    {
                        GiveGoldToCreature(oPartyMember, 1);
                    }
                    else
                    {
                        if(GetLevel(oPartyMember) < 5)
                            iGPT *= 2;
                        GiveGoldToCreature(oPartyMember, iGPT);
                    }
                }
                else
                {
                    GiveGoldToCreature(oPartyMember, 1);
                    GiveXPToCreature(oPartyMember, SFEint);
                }
            }
            oPartyMember = GetNextFactionMember(oKiller, TRUE);
        }
    }
}
Alian REXis
В первом скрипте эту строчку закомментируй:
Neverwinter Script
give_custom_exp(oKiller, OBJECT_SELF, 0);

И перекомпилировать не забудь.
Melisse
Цитата
Вопросец тут назрел =)
Вообщем,есть нпс и у него несколько веток разговора.Как сделать что бы при начале диалога ветка выбиралась случайно?


вариантов много. Можно использовать переменные, можно просто рандом на StartCondition например вешать на "текст появляется при" скрипт
Neverwinter Script
int StartingConditional()
{

    if(Random(2) >= 1)
        return TRUE;

    return FALSE;
}


Вообще способов много. Все описывалось тут на форуме многократно, поищи.

Ilerien
Цитата
Вопросец тут назрел =)
Вообщем,есть нпс и у него несколько веток разговора.Как сделать что бы при начале диалога ветка выбиралась случайно?
Можно что-то типа этого:
1) инициализация диалога, первая ветка - не важно, какой в ней текст (в слот ветки для условных скриптов)
Neverwinter Script
int StartingConditional()
{
    //смотрим, сколько у нас веток в диалоге
    //напрямую это сделать нельзя, так что удобно будет руками (опция advanced - variables) запихать количество веток в локальную переменную на неписе
    int nBranchCount = GetLocalInt(OBJECT_SELF, "nBranchCount");
    //задаём ветку
    SetLocalInt(OBJECT_SELF, "nCurrentBranchNumber", Random(nBranchCount) + 1);
    //выходим из ветки
    return FALSE;
}

2) Скрипты на каждой ветке - достаточно создать столько скриптов, сколько максимально планируется веток в таких диалогах. Скрипты вида:
Neverwinter Script
//номер ветки
const int BRANCH_NUMBER = 1;

int StartingConditional()
{
    //проверяем, совпадает ли выпавший выше рандом с номером ветки
    return GetLocalInt(OBJECT_SELF, "nCurrentBranchNumber") == BRANCH_NUMBER;
}

для каждой ветки - скрипт со своим значением BRANCH_NUMBER (я привёл для первой).
Скрипты помещать в условные слоты каждой ветки (в русском переводе "текст появляется при" *поклон в сторону Мел* smile.gif )
Lordeath
Цитата
В первом скрипте эту строчку закомментируй:

А можно нубу показать как это делается? -)
Как перекомпилировать знаю.
Alian REXis
Вот так smile.gif
Neverwinter Script
//give_custom_exp(oKiller, OBJECT_SELF, 0);

Теперь эта строчка не будет обрабатываться компилятором.
Lordeath
Получилось, спасибо snoozer_17.gif
NorthWest
"//" без кавычек пред любой строкой делают ее комментарием.
NorthWest
Никто не встречал утилиту, которая может очистить модуль от "остатков" подключаемых когда-то хак-паков ? От скриптов, моделей и т.д. чтобы не вылетал тулсет с ошибкой, когда в локации есть что-то чего нет в ресурсах уже.
Я полазил на ваулте - но не нашёл ничего даже приблизительно подобного =\
Zirrex
Если только сделать шаблонный модуль с хаками, экспортировать в него по отдельности локации, и проверять, есть ли в них хаки. Когда с хаками работаешь довольно долго, то потом трудно догадаться, были ли использованы в локациях хаки или нет.

Кстати, при открытии локации, редактор не будет падать, если в локации использованы из хака вещи (возможен сбой, если такие вещи одеты на существо) или объекты. Они лишь не будут отображаться. А вот если в локации задействованы тайлы из хака, то тогда редактор сразу выдаст ошибку и повиснет.

Самый лучший способ, чтобы быстро освободить модуль от хаков, записывать, какие хаки подключаются и что в них входит, чтобы быстро сориентироваться, где ресурсы хака применялись.
Anecdote
Уважаемые мастера , у меня к Вам ваще нубский вопрос: в самом тулсете там где имена локаций и названия монстром вместо шрифтов стоят вертикальные чёрточки , и при входе в игру ( после заставок атари и др) вместо менюшки (начать игру , загрузить ...) ваще чёрный экран и надо наугад попадать в то место , где обычно находится надпись запустить. Помогите , обьясните хотя бы чего у меня нехватает.
З.Ы. Сама игра работает на других компах и со шрифтами всё норм , а у самого с этим разобраться - "таланта" не хватает . Заранее благодарен всем ответившим
2_advanced
тулсет запустить в режиме совместимости - маздай 95 ph34r.gif
последний год только так с ним удавалось работать
Venerium
Вот такой вот вопрос тем кто знает, я создал две локации одна Exterior а другая Interior. На каждой локации есть дверь, как мне их соединить, ну тоесть сделать переход из одной локации в другую ?
VitNWN2
Не знаю, как насчёт первого НВН, но в редакторе НВН2 есть у каждого объекта что-то типа свойств(Properties)...
В этих свойствах объекта есть строка Transitting to и строчка Link Object Type. В Link Object Type выбираешь к примеру вэйпоинт, который поставишь около дверки в которую нужно переместиться. В Transitting to прописываешь тэг этого вэйпойнта. Насчёт того чтобы одна дверь перемещала в другую дверь не помню, поэтому точно сказать не могу как это сделать, да и вообще существует ли такое? Точно не помню... yahoo.gif
Venerium
Я может не так выразился. Щас попробую подругому обьяснить. Я два дня назад начал пробовать создавать свои модули, вот значит, сделал я поляну на ней расставил пару деревьев и волка, и еще поставил дом. Потом создал еще одну локацию Interior ну тоесть внутренее помещение, сделал комнату, поставил там стол и стул. Научите меня как сделать так что бы я открывал дверь в доме и нажимая на темное пространство за ней попадал в комнату которую я создал. Желательно подробно, я только учусь и еще ничего не понимаю в редакторе. И еще такой вопросик, я хочу положить на землю самый простой мечь или дубинку что бы ею мог пользовать герой 1 уровня , подскажите где мне ее взять ?
Lex
про дверь тебе частично правильно сказали. Зайди у любой из 2х дверей в Свойства - Переход местности. Там установи тип места назначения (дверь) и в выпадающем меню выбери локацию места назначения (если выбрал дверь в доме, то тут следует выбрать локацию с домиком). После этого в списке найди нужную дверь. Посмотри чтобы стояла галочка в позиции "в обе стороны". И все.
ВАЖНО: у дверей должен быть разный, УНИКАЛЬНЫЙ тэг. (в свойствах на основной странице). например для твоего случая что-то типа "DOOR_FOREST_TO_HOUSE", "DOOR_HOUSE_TO_FOREST".
(писать тэги большими буквами - устоявшееся старое правило при работе с редактором)

И если только начинаешь работать, внимательно изучи эту тему и особенно Туториал от Айвана
VitNWN2
Цитата
И еще такой вопросик, я хочу положить на землю самый простой мечь или дубинку что бы ею мог пользовать герой 1 уровня , подскажите где мне ее взять ?

Заходишь в Items, там поройся и найди то оружие, которое тебе требуется... На земле оружие будет в виде мешочка...
Griffon
Цитата(Venerium @ Mar 3 2008, 17:36) *
Вот такой вот вопрос тем кто знает, я создал две локации одна Exterior а другая Interior. На каждой локации есть дверь, как мне их соединить, ну тоесть сделать переход из одной локации в другую ?


Вот какие строки тебе нужны.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
VitNWN2
Теперь понял? Или хочешь я видео сниму, как надо делать переход из одной двери в другую? biggrin.gif
Lex
Хватит в теме про Аврору оффтопить про Электрон.
Lordeath
Проблема с опытом решилась только для определенных существ. За "умеренных" и выше, за боссов продолжает выдаваться двойной опыт -)
В смысле 2 раза. Например 120 и сразу же после этого еще 11.
Ilerien
Полный скрипт nw_c2_default7 в студию smile.gif А то щас в этом посте исключительно его верхний кусок.
Lordeath
Странно, скрипт скопировал полностью -)
denis0k
Edit -> Module Properties -> Advanced.
Ползунок XP Scale в ноль.

Довольно сложно случайно сделать двойную выдачу скриптом, причем по разным формулам.
Lordeath
Можете скопировать стандартный скрипт?

Ну мне просто нужно переделать один модуль выложенный на ваулте. Конкретно убрать систему опыта , созданную автором (слишком много экспы дается) и поставить стандартную.
gennady
Lordeath, ну чё ты мучаешь весь форум? Выкинь из этого модуля этот доморощенный скрипт NW_C2_DEFAULT7. Тем самым будет использоваться базовый! Найди своего БОССА и замение в скрипте смерти весь код на вот такой:
Neverwinter Script
//:://////////////////////////////////////////////
//::  SLOT: OnDeath — смерть существа
//:://////////////////////////////////////////////
void main()
{ExecuteScript("nw_c2_default7", OBJECT_SELF);}



Lordeath
Понял в чем ошибка. У разных существ стояли разные скрипты на OnDeath, все ссылались give_cudtom_xp, потому возникали такие траблы. Проблема решена их удалением biggrin.gif Всем спасибо prankster2.gif
Lester
Люди, помогите, я немного туплю: как мне сделать подобие теста? Например, чтоб НПС мне в диалоге задавал вопрос, я отвечал, и в конце мне должно выдать кол-во правильных ответов. Я в программировании немного разбираюсь но до меня немного не дошло как связать диалоги и скрипты. Объясните кто-нить на примере.
gennady
Lester, для этого нужно присвоить локалки за ответы, а в конце их проверить. В диалог мы можем воткнуть 4 вида скриптов:
1. на проверку
2. действие
3. прерывание диалога
4. нормальное завершение диалога

Про редактор диалога советую почитать статейку: http://remmgen.narod.ru/treddialog.html
Lester
Я прочитал уже эту статейку. Но я не могу понять одного: для каждой ветки диалога надо писать ведь свой скрипт, да? А если я создам переменную в одном скрипте, как я смогу потом работать с этой же переменной но только в другой ветке диалога?
Lex
Цитата(Lester @ Mar 12 2008, 00:00) *
как я смогу потом работать с этой же переменной но только в другой ветке диалога?

только если ты ее запомнишь. Те например запишешь в локальные переменные НПС-собеседника через SetLocal*, а в другом скрипте прочитаешь через GetLocal*.
Lordeath
Цитата(gennady @ Feb 17 2008, 15:35) *
1. Опыт удаляем на вкладке Модульные свойства в
панели “Улучшенный”, тут можно задать опыт за уничтожение монстров, и выбрать длительность игрового часа, обычно час равен двум минутам реального времени. Учтите, что чем больше монстр имеет ХР, тем больше получит герой опыта…
2. Нужно повесить на героя локалку о отдыхе. а через определенное время ее снять. Вот для примера простой скриптик отдыха. Отдыхаем 1 час игрового времени и 10 минут реального не сможем воспользоваться отдыхом:

Neverwinter Script
//::///////////////////////////////////////////////
//:: Слот: OnPlayerRest - Модульные свойства
//::///////////////////////////////////////////////

////////   СНЯТЬ ЭФФЕКТЫ И ВЫЛЕЧИТЬ ГЕРОЯ   /////////
void FakeRestore(object oTarget)
{
int nHeal = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget);
effect eHeal = EffectHeal(nHeal);
effect eBad = GetFirstEffect(oTarget);
  while(GetIsEffectValid(eBad))
    {
     RemoveEffect(oTarget, eBad);
     eBad = GetNextEffect(oTarget);
    }
   ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget);
}
/////////////////////////////////////////////////////////////////////////////////////
void main()
{
object oPC = GetFirstPC();
int iTH = GetTimeHour();
int iRest = GetLocalInt(oPC, "REST");

///////////////////////////    START      /////////////////////////////////////
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
  if(iRest==1) // Блокировка отдыха
{
  SendMessageToPC(oPC, "Вы не можете так часто отдыхать!");
  AssignCommand(oPC,ClearAllActions(TRUE));
  return;
}
  SetCommandable(FALSE, oPC); // заблокировать очередь
  DelayCommand(4.0, FadeToBlack(oPC, FADE_SPEED_SLOW)); // Занавес из черного экрана
  DelayCommand(18.0, FadeFromBlack(oPC, FADE_SPEED_SLOW)); // Уберем занавес
}
//////////////////////////////    FINISH    ///////////////////////////////////
if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED)
  {
   iTH = iTH+1;
   SetTime(iTH,0,0,0);
   SendMessageToPC(oPC, "Вы отдыхали 1 час.");
   SetCommandable(TRUE, oPC); // разблокировать очередь
   FakeRestore(oPC); // Если нужно удалить вредные эффекты
   // ВРЕМЯ БЛОКИРОВКИ
   SetLocalInt(GetFirstPC(),"REST",1);
   DelayCommand(600.0, SetLocalInt(GetFirstPC(),"REST",0));
  }
}


Столкнулся с такой проблемой: если бегаешь в партии с другим игроком, то отдыхать можно когда угодно. Не подскажите какэтого избежать?
Ilerien
Neverwinter Script
void main()
{
object oPC = GetFirstPC();
int iTH = GetTimeHour();
int iRest = GetLocalInt(oPC, "REST");
GetFirstPC() надо заменить на GetLastPCRested()

Neverwinter Script
//////////////////////////////    FINISH    ///////////////////////////////////
if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED)
  {
   iTH = iTH+1;
   SetTime(iTH,0,0,0);
   SendMessageToPC(oPC, "Вы отдыхали 1 час.");
   SetCommandable(TRUE, oPC); // разблокировать очередь
   FakeRestore(oPC); // Если нужно удалить вредные эффекты
   // ВРЕМЯ БЛОКИРОВКИ
   SetLocalInt(GetFirstPC(),"REST",1);
   DelayCommand(600.0, SetLocalInt(GetFirstPC(),"REST",0));
  }
}
Здесь смени везде GetFirstPC() на oPC:
Neverwinter Script
SetLocalInt(oPC,"REST",1);
   DelayCommand(600.0, SetLocalInt(oPC,"REST",0));

Честно говоря, идея с установкой времени на ресте мне не нравится. И фиг игроку, а не снятие эффектов wink3.gif
denis0k
Модуль сингловый или онлайновый (тут про пати разговор был)? В онлайне 10-минутный делэй со ссылкой на обжект игрока - маньячество. В лучшем случае на перезаход локалка слетит, в худшем - она останется до рестарта и чар не сможет отдыхать вообще.
virusman
При перезаходе локалка не слетит.
Если шард, то надо ставить локалку с игровым timestamp'ом времени, когда чар последний раз отдыхал, а при последующих рестах её проверять.
Если просто прохождение вдвоём, то это, конечно, не так критично, и блокировку можно вообще убрать.
Ilerien
Цитата
Если шард, то надо ставить локалку с игровым timestamp'ом времени, когда чар последний раз отдыхал, а при последующих рестах её проверять.
Можно ещё на модуль вешать локалку с именем (а лучше ид) чара smile.gif Она точно не слетит.
Casadore
Люди, проконсультируйте по такому вопросу:

Я делаю квест, первая часть квеста проходит как нужно, (Герой получает предмет, потом отдает его), после этого мне нужно чтобы у НПСа, у которого беру квест появлялся другой текст, а то у меня получается, что этот квест можно брать бесконечно... unsure.gif

З.Ы. Просьба не говорить что такое уже было, ищи... перечитать весь форум я прсто не в состоянии.

Спасибо.
Белатрис
Нажми на нужную строку текста, во вкладке "Текс появляется при..." кликай по красной шляпе, в появившемся окне ставь галочку напротив "Локальная переменная". Дальше, напротив int, пиши имя переменной(начинать только с букв(англ.), запиши его где-нибудь, если слишком большое и напротив "постоянный" ставь 0. Теперь кликай по кнопке добавить, вводи имя скрипта, "Закончить".
В соседней вкладке "Совершенные действия" жми снова на шляпу, "Установить локальные переменные", вперед, вводи имя переменной напротив int, а ниже ставь 1, далее, имя, закончить. Усё.
Topik
Как вы думаете, сейчас актуально или даже интересно будет создать модуль на Авроре. Просто я год создавал модуль, а тут вышел второй НВН. Что делать? unsure.gif
Lex
Цитата(Topik @ Mar 15 2008, 17:09) *
Просто я год создавал модуль, а тут вышел второй НВН. Что делать?

НВН2 вышел год назад, гдеж ты был целый год?

имхо сингл на НВН1 - не актуально и интересно очень очень небольшому количеству игроков. Если есть возможность - переноси на НВН2 (скрипты и диалоги почти без изменений, а вот локи и предметы переделать придется с 0 почти). В НВН2 ситуация конечно тоже не фонтан, но к нему хоть какой-то интерес проявляется обычными игроками.
Talarasha
Такой вопрос. При подходе к какому-либо дружественному NPC на близкое расстояние он отползает в сторону, давая пройти. Как заставить NPC стоять на месте и никуда не бегать? Появилось в HotU, в оригинальных модулях NWN все NPC стоят нормально и никуда не уползают.
Lex
правильно что появилось, это избавляет от случаев, когда НПС закрывает проход или дверь. Убрать вроде как нельзя обычными методами.
Talarasha
На вкус и цвет товарища нет. Мне например не нравится и я вообще не могу предпологать ситуации, когда игрок пинает NPC по всей карте.
Ilerien
Как вариант, поставить на этом месте вейпоинт, к которому непись будет каждый раз возвращаться.
Lex
Цитата(Talarasha @ Mar 16 2008, 13:57) *
Мне например не нравится и я вообще не могу предпологать ситуации, когда игрок пинает NPC по всей карте.

если тебе надо запретить возможность "вытолкать" так НПС, то тады сделай ему поинт POST_[Тэг НПС]. Если стандартные скрипты не трогал, то НПС будет на этой точке стоять. Если НПС толкнуть, он в течении 6 сек вернется на точку.

по поводу вкуса и цвета, тут дело не в том, нравится или нет, а в том, что это нормальное решение разработчиков, которые хотят защититься от того, что игрок случайно или намеренно сделает невозможным переход в важную по сюжету зону (НПС заблокирует дверь например). Что приведет к прерыванию игры и откату на сейв. Те сделано оно не с бухты барахты.
Talarasha
Цитата
по поводу вкуса и цвета, тут дело не в том, нравится или нет, а в том, что это нормальное решение разработчиков, которые хотят защититься от того, что игрок случайно или намеренно сделает невозможным переход в важную по сюжету зону (НПС заблокирует дверь например). Что приведет к прерыванию игры и откату на сейв. Те сделано оно не с бухты барахты.

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

Цитата
если тебе надо запретить возможность "вытолкать" так НПС, то тады сделай ему поинт POST_[Тэг НПС]. Если стандартные скрипты не трогал, то НПС будет на этой точке стоять. Если НПС толкнуть, он в течении 6 сек вернется на точку.

За это спасибо, не конфетка конечно, но хоть что-то.

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

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

Цитата
если тебе надо запретить возможность "вытолкать" так НПС, то тады сделай ему поинт POST_[Тэг НПС]. Если стандартные скрипты не трогал, то НПС будет на этой точке стоять. Если НПС толкнуть, он в течении 6 сек вернется на точку.

За это спасибо, не конфетка конечно, но хоть что-то.
Lex
Цитата(Talarasha @ Mar 17 2008, 09:02) *
у меня вряд ли возникнет

а разработчики не о тебе заботятся, а о всех игроках сразу. Значит были жалобы на такие затыки, раз в последующих версиях это ввели.

Цитата(Talarasha @ Mar 17 2008, 09:02) *
А вот их ползнанье серьезно напрягает.

у меня кстати часто бывали случаи, когда их ставишь и они не отползают. ХЗ почему, но вызывать такой эффект по желанию у меня не получилось.
Lester
Народ, выручайте опять) Как мне сделать так, чтоб значение переменной (интовой иль стринговой) отображалось в диалоге. Например: я говорю с НПС, отвечаю на вопросы и в конце опроса НПС мне выдает: "Вы набрали [переменная] балов" ? И еще вопрос, как сделать чтоб переход от ветки к ветке в диалоге был не по порядку, а иногда "перепрыгивал" несколько веток, в зависимости от ответа?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.