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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Скрипты для новичков, Самые простые скрипты с описанием
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 ---------------------------------------
    }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Talarasha
сообщение Jul 30 2011, 18:53
Сообщение #2


Level 6
**

Класс: Маг
Характер: Lawful Evil
Раса: Нежить



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

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

*/

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

#include "nw_i0_generic"

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

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

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

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

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

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


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

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

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


Сообщение отредактировал Talarasha - Jul 30 2011, 18:54
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме
- Aiwan   Скрипты для новичков   Aug 23 2005, 17:53
- - DraX   Долго думал, какой скрипт написать и решил, что но...   Aug 24 2005, 15:12
- - -fenix-   Решил расписать такой скрипт. Многие наверное хот...   Aug 24 2005, 15:50
- - DraX   Неожиданно пришла здравая идея! Многим может б...   Aug 24 2005, 16:32
- - Aiwan   Скрипт закрывает дверь на ночь и открывает ее днем...   Aug 25 2005, 08:42
- - Dik Morris   ЗЫ: Небольшое уточнение, в посте DraX’ са. QUOTE 4...   Aug 25 2005, 10:02
- - -fenix-   Вот скиптик для сидения на стуле, кушетке, диване,...   Aug 25 2005, 19:12
- - Aiwan   Скрипт закрывает дверь автоматически через заданно...   Aug 26 2005, 08:14
- - -fenix-   Если хотите, чтобы НПС, как только увидеk игрока п...   Aug 26 2005, 15:10
- - Aiwan   СКРИПТЫ БОЛЬШЕ НЕ ПОСТИТЬ. ТОЛЬКО МАСТЕРАМ РАЗРЕША...   Aug 26 2005, 16:37
- - Aiwan   Скрипт вешается на OnEnter триггера. Переходим в с...   Sep 7 2005, 22:29
- - Aiwan   Neverwinter Script Source//:://///////////////////...   Sep 18 2005, 21:18
- - _kaa_   QUOTE (Aiwan @ Sep 18 2005, 21:18) Neverwinte...   Sep 19 2005, 09:06
- - Aiwan   _kaa_ , согласен. Может кому нужны несколько то...   Sep 19 2005, 11:54
- - Lex   QUOTE (Lex @ Sep 22 2005, 15:44)описание - л...   Sep 22 2005, 14:44
- - Aiwan   Стандартный скрипт на слот OnSpawn НПС. Данный скр...   Oct 2 2005, 14:43
- - Aiwan   Проверка Харизмы у игрока. Если она 16 или больше,...   Oct 8 2005, 11:07
- - Aiwan   Универсальный скрипт, который ставится на люк (Дер...   Oct 9 2005, 19:26
- - Aiwan   Ставим скрипт на OnEnter енкаучера. Делаем его не ...   Jan 18 2006, 02:00
- - Aiwan   НПС после нападения становится нейтральным и начин...   Mar 31 2006, 07:09
- - Sugo77   А этот скрипт на проверку игрока в другой локации,...   May 14 2008, 21:59
- - Aiwan   Цитата(Sugo77 @ May 14 2008, 23:59) А это...   May 15 2008, 18:20
- - Ogneslav   Товарищи, я бы хотел сделать заклинание glyph of w...   Jul 2 2008, 19:09
- - Aiwan   Вопрос не по этой теме. Задай в теме вопросов по с...   Jul 2 2008, 19:24
- - Chiffa   Да, хороший скрипт, который отправляет непися в то...   Nov 14 2008, 02:09
- - Ilerien   Стремление к универсальности в порядке вещей, если...   Nov 14 2008, 22:26
- - Chiffa   ЦитатаНе понял, зачем в последнем скрипте тебе Del...   Nov 15 2008, 02:49
- - Nao   Хмм. я тоже придложу два простеньких скрипта для н...   May 19 2009, 18:20
- - Lex   первый скрипт убрал, тк в НВН2 есть стандартный бо...   May 20 2009, 08:41
- - Nao   можно заменить альтернативно: ставим урон на 10000...   May 21 2009, 18:43
- - Lex   в первом посте темы указано, для чего она создана ...   Aug 18 2010, 11:31
- - tyrrael   можно ли зделать так, чтобы войдя в установленую т...   Oct 4 2010, 19:20
- - Deirel   tyrrael, можно просто сделать так: Neverwinter S...   Oct 4 2010, 21:21
- - tyrrael   а можете по подробней сказать как зделать чтобы np...   Oct 6 2010, 22:29
- - Aiwan   Цитата(tyrrael @ Oct 7 2010, 01:29) а мож...   Oct 7 2010, 12:03
|- - virus_found   Цитата(Aiwan @ Oct 7 2010, 12:03) а еще к...   Oct 8 2010, 10:39
- - Talarasha   Наверное, многим известно, что к 1.69 галочка ...   Jul 30 2011, 18:53
- - ReZkiy   Послушайте,пожалуйста. Мой случай происходит дома ...   Aug 28 2011, 14:31
- - wirTUS   1) Извиняюсь за оффтоп 2) Эта тема не для задавани...   Aug 28 2011, 18:06
|- - ReZkiy   Цитата(wirTUS @ Aug 28 2011, 21:06) 1) Из...   Aug 28 2011, 18:48
- - ReZkiy   Мастера!Подскажите пожалуйста,что нужно в этой...   Aug 30 2011, 10:42
- - ReZkiy   Если кому нужно: Мой личный скрипт мертвого. Neve...   Aug 31 2011, 15:37
- - Talarasha   ЦитатаЕсли кому нужно: Мой личный скрипт мертвого....   Sep 3 2011, 09:25
|- - ReZkiy   Цитата(Talarasha @ Sep 3 2011, 12:25) Тво...   Sep 3 2011, 14:05
- - Talarasha   ЦитатаЗАБЫЛ!Слот OnSpawn - вот куда подходит м...   Sep 3 2011, 15:08
|- - ReZkiy   Цитата(Talarasha @ Sep 3 2011, 18:08) Воз...   Sep 4 2011, 12:50
- - greye   Цитата(ReZkiy @ Sep 3 2011, 14:05) ЗАБЫЛ...   Sep 4 2011, 13:36
|- - ReZkiy   Цитата(greye @ Sep 4 2011, 16:36) А по ка...   Sep 6 2011, 13:09
- - denis0k   ЦитатаА можно сделать так,что бы в трактире НПС си...   Sep 6 2011, 16:35
- - ReZkiy   Цитата(denis0k @ Sep 6 2011, 19:35) В мес...   Sep 6 2011, 20:04


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

 



Текстовая версия Сейчас: 7th June 2024 - 02:14