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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Вопросы и Ответы по Toolsetу
Lex
сообщение Jan 22 2005, 00:00
Сообщение #1


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

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



********************************************************************************
Статьи, ссылки + выжимка из темы "Вопросы новичков, ТОМ 1" + выжимка из темы "Вопросы новичков, ТОМ 2" + выжимка из старых тем.


ПОСТИТЬ ЗАПРЕЩЕНО ВСЕМ, КРОМЕ МОДЕРАТОРОВ РАЗДЕЛА.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Lemegeton
сообщение Mar 18 2005, 19:18
Сообщение #2


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

Класс: Монах
Характер: Lawful Good
Раса: Человек
NWN: Контент



ВОПРОС
Как сделать так, чтобы доступ в локацию был ограничен по левелу? То есть 3 левел еще может туда попасть а 4 уже нет?

ОТВЕТЫ
На OnEnter триггера ставится следующий скрипт. Этот скрипт всех других НЕ ПУСТИТ в локу. Монстров и прочее. Отредактировать под собственные нужды.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//::
//:://////////////////////////////////////////////
/*

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 31.12.2004
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject();
  object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC);
  object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC);
  object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC);
  object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
  object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC);
  object oJamp = GetTransitionTarget(OBJECT_SELF);
  int level =  GetLevelByClass(GetClassByPosition(1,oPC),oPC);
  level = level + GetLevelByClass(GetClassByPosition(2,oPC),oPC);
  level = level + GetLevelByClass(GetClassByPosition(3,oPC),oPC);

  if (GetIsPC(oPC) && level<4)
  {
  AssignCommand(oPC, JumpToObject(oJamp));
  AssignCommand(oAnimal, JumpToObject(oJamp));
  AssignCommand(oDominated, JumpToObject(oJamp));
  AssignCommand(oFamiliar, JumpToObject(oJamp));
  AssignCommand(oHenchman, JumpToObject(oJamp));
  AssignCommand(oSummoned, JumpToObject(oJamp));
  }
}



*****************************************************************************

ВОПРОС
Нет, я все таки не понимаю, как сделать тоже самое, но не с триггером или дверью, а с плэйсиблом?

ОТВЕТЫ
NPC по объекту кликнуть НЕ МОЖЕТ. Поэтому проверка на переход непися или PC - не нужна. Хенчи и прочие соратники движутся за игроком, в основном, по ActionForceFollowObject(oPC, 5.0, 15.0). И, следовательно, переходят за PC через 15 секунд, если тот дальше, чем 5 метров от них.
На OnUsed предмета ставится скрипт:
Neverwinter Script Source
void main()
{
    object oPC = GetLastUsedBy();
    if (!GetIsPC(oPC))
        return;
    if (GetHitDice(oPC) >= 4)
        return;    
    AssignCommand(oPC, JumpToObject(GetObjectByTag("тэг_точки_назначения")));  
}



*****************************************************************************

ВОПРОС
У меня в модуле, при перезаходе в него, восстонавливаются хит поинты и заклинания, а как сделать так, чтобы этого не происходило, и все запоминалось?

ОТВЕТЫ
Скрипт для сохранения здоровья и спеллов при перезаходе:
событие OnClientEnter модуля:

Neverwinter Script Source
//by _Kaa_ 20.05.30
#include "nw_o0_itemmaker"
void main()
{
object oPC = GetEnteringObject();
object oStore = GetModule(); 
string sStoreName = GetName(oPC)+GetPCPlayerName(oPC); // =[PC name] + [login name]
SetLocalString(oPC,"HP_MyIdString",sStoreName);
int iSavedHP = GetLocalInt(oStore,sStoreName);
if (iSavedHP != 0)
{
effect efDamage = EffectDamage(GetMaxHitPoints(oPC)-iSavedHP,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT,efDamage,oPC);
}

int k,j,nSpells;
for (k=1; k < 510; k++)
{
nSpells = GetLocalArrayInt(oStore,sStoreName+"_spells",k);
if (nSpells)
  for (j=0; j <= GetHasSpell(k,oPC)-nSpells; j++) DecrementRemainingSpellUses(oPC, k);
}
}




OnClientLeave

Neverwinter Script Source
//by _Kaa_ 20.05.30
#include "nw_o0_itemmaker"
void main()
{
object oPC = GetExitingObject();
object oStore = GetModule();
string sStoreName = GetLocalString(oPC,"HP_MyIdString");
SetLocalInt(oStore, sStoreName, GetCurrentHitPoints(oPC));
int k,nSpells;
for (k=1;k<400;k++)
{
nSpells = GetHasSpell(k,oPC);
if (nSpells)
  SetLocalArrayInt(oStore,sStoreName+"_spells",k,nSpells);
}
}


*****************************************************************************

ВОПРОС
Как "выпотрошить" файл с расширением .hak для того, что бы его компоненты пошли в Оверрайд?

ОТВЕТЫ
В папке с игрой есть папка utils, а в ней утилита от BioWare для работы с hak-файлами. Называется nwhak.exe.

*****************************************************************************

ВОПРОС
Как с помощю скриптов создавать визуальные (и только визуальные) эффекты заклинаний?

ОТВЕТЫ
С начала, надо объявить переменную, содержащую эффект:
Neverwinter Script Source
effect eXXX = EffectVisualEffect(int, int);

А затем, использовать функцию, применяющю эффект на объекте или на местности:
Neverwinter Script Source
ApplyEffectAtLocation(int, eXXX, location, float);

или
Neverwinter Script Source
ApplyEffectToObject(int, eXXX, object, float);


Так же, существует возможность применять "липовые" заклинания. Они не наносят повреждений, а в остальном, действуют, как настоящие:
Neverwinter Script Source
ActionCastFakeSpellAtLocation(int, location, int);

или
Neverwinter Script Source
ActionCastFakeSpellAtObject(int, object, int);


*****************************************************************************

ВОПРОС
Как открыть модуль, созданный в более поздней версии тулсета?

ОТВЕТЫ
Предварительно создать копию модуля и использовать только на свой страх и риск!

Качаем NWN Packer http://nwvault.ign.com/Files/other/data/1026158289668.shtml
Качаем GFF Editor http://nwvault.ign.com/Files/other/data/1054162676171.shtml

Открываем модуль NWN Packer'ом. Выдергиваем module.ifo
Сохраняем этот файл где нибудь на жестком диске.
Не закрывая NWN Packer, запускаем GFF Editor.
Открываем в нем наш module.ifo.
Открываем списочек и ищем Mod_MinGameVer
Видим там.. Ну я например сейчас вижу 1.62
Меняем на ту версию какую нам надо. Сохраняем module.ifo.
Закрываем GFF Editor. И перетаскиваем только что сохраненный нами module.ifo в еще не закрытый нами модуль в NWN Packer'е. Он спрашивает заменить файл? Отвечаем да, и сохраняем модуль - вуаля!


*****************************************************************************

ВОПРОС
Как увеличить дальность обзора?

ОТВЕТЫ
edit -> area properties -> visual -> customize environment
Можно поставить 500-1000, но тогда сильно увеличится затрата ресурсов игрой (лагать будет).

Можно убрать и полностью. Но в этом случае будет заметна "граница" модуля. Там где заканчиваются тайлы и начинается серая "пустота".

Это достигается расширением "сферы" тумана, до 300-350 фунтов и управляется только через MOD-файл непосредственно "вскрытый" редактором.


*****************************************************************************

ВОПРОС
Здраствуйте, я вот тут захотел сделать простейший стационарный квест, но в этом я полный 0.
1) Как сделать чтобы при первом разгооре игрока с НПС показывался первый диалог;
2) После первого разговора включался второй диалог;
3) Как сделать проверку на наличие предмета у игрока? Например ели у игрока есть например ключ ему включался определеный диалог (тоесть вот смотри пункт 2, идет второй диалог. и там спрашивають.ты добыл ключ? говориш да, и делаеться проверка на наличие)
4) После того как квест выполнен включался следующий диалог


ОТВЕТЫ
Делается очень легко - с пмощью Локальных переменных...

Как ты мог догадатсья, полистав словарик или просто почитав надписи в тулсете при создании конверсейшна:
TextAppearsWhen - значит "Текст появляется когда..." и там нужно выбрать скрипт. Это значит что в скрипте задаются условия появления. (кстати там есть визард)
ActionTaken - значит "Предпринимаемое действие" (или типа того), то есть - что-то происходит после того как игрко выбрал этот ответ в диалоге, или НПЦ вышел на ветку с этим скриптом... Тут опять же есть визард.
Визард (Wizard) - помощник создания простых скриптов, отображается как шапочка...

Итак, теперь рассказываю подробнее...
Мы создаем все три ветки (для данного примера):

- Привет, игрок
-- Привет, нпц!
- Есть ключ?
-- Есть (проверка)
-- Нету
- Молодец, ты справился с квестом! Терь вали отсюдова!

На первом диалоге (Привет, игрок) вешаем скрипт проверки локальной переменной, например назовем её - quest_prog (quest progress). Для этого можно использовать визард (пока в плане скриптинга обьяснять не буду - запустите визард, посмотрите на код и надеюсь все поймете) - визард в TextAppearsWhen (ТекстПоявляетсяКогда) - и там выбираем Local Variable, выбираем: int (числовая переменная, целая (не дробная)), пишем название переменной (q_prog), is less than (меньше чем), constant int (заданное число), 1.
Далее на продолжении первого диалога ("привет, нпц!") вешаем скрипт (можно опять же визардом) на создании переменной q_prog и задачи ей числа 1. Set Local Variable (Задать локальную переменную), int, q_prog, constant int, 1.
Теперь переходим к второй ветке диалога (есть ключ?) - надпись будет высвечиваться если q_prog равно 1. (Думай разберешься как сделать проверку ), ну а на ответе: (Есть) - делать првоерку на ключ... Опять же визардом: Item in Inventory и там вписываем тэг вещицы (лучше писать не попамяти - акопировать и вставлять...). Ну и Action Taken - присваиваем q_prog значение 2.
И последнюю ветку вешаем првоерку, если q_prog равен 2.

Раз стат квест - значит надо выдать награду. Выдавать награду можно опять же через ActionTaken (Give Rewards)... Примечание: если хочешь наградить вещью - то там надо вписывать ResRef вещит, а не тэг.

Кстати попутно с квестом можно вести запись в дневнике (закладочка - Others... там думаю разберешься)
ПРИМЕЧАНИЕ №1: Локальные переменные - остаюстя на игроке, так что в следущем квесте не используй переменную q_prog...
ПРИМЕЧАНИЕ №2: Если хорошо подумаете - то сможете это все еще оптимизирвоать и улучшить... (хоят бы для повышения переменной - не обязательно использоват ьнесколько разных скриптов )


*****************************************************************************

ВОПРОС
Как после конца квеста сделать так, что бы NPC исчезал (уходил)?

ОТВЕТЫ
Скрипт ставится на Action Taken того элемента разговора, после которого NPC должен изчезнуть.
Neverwinter Script Source
void main()
{
object oExit = GetNearestObjectByTag("WP_EXIT");
// куда бежим, хоть в другую локу, реалестичней, т.к. побежит в двери
object oNPC = OBJECT_SELF; //сам тот кто бежит
AssignCommand(oNPC, ClearAllActions()); // забудь все что не успел сделать!
AssignCommand(oNPC, ActionForceMoveToObject(oExit, FALSE, 1.0, 25.0));
// FALSE можно поменть на TRUE и тогда непись побежит, скорость 1.0,
// если застЯл то через 25 сек прыгнет в точку
AssignCommand(oNPC, ActionDoCommand(DestroyObject(oNPC)));
//Сепука, будет только если дошел до точки oExit
DelayCommand(0.3, SetCommandable(FALSE, oNPC));
// Борьба с ретроградной амнезией - забиваем стек команд.
// Теперь он точно сделает себе харакири
}


WP_EXIT - объект, к которому пойдет (побежит) NPC. Чаще всего, на краю локации.

*****************************************************************************

ВОПРОС
Как сделать чтобы при заходе игрока на триггер NPC начинал диалог?

ОТВЕТЫ
Neverwinter Script Source
void main()
{
    object oPC = GetEnteringObject(); // Тот идиот что встал на триггер
    if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGERED") == 1)
        return;
// Если это был не игрок, а кто то еще (матрица рулит), или он уже
// наступал в это дерьмо один раз, то скрипт не сработает
    object oNPC = GetNearestObjectByTag("ТАГ_НПС");
//  Тот придурок что должен сказать ПРИВЕТ!
    AssignCommand(oPC, ClearAllActions());
    AssignCommand(oNPC, ClearAllActions());
    AssignCommand(oNPC, SpeakString("Эй, придурок! Я к тебе обращаюсь!"));
//  Использую не ActionSpeakString, что бы НПС говорил фразу делаЯ что велено дальше
    AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPosition(oNPC))));
//  Повернем мордой лица РС к НПС
    AssignCommand(oPC, ActionSpeakString("Ну, ванючка! Держись!"));
//  Тут наоборот, жду когда повернетсЯ и ТОГДА ответит
    AssignCommand(oNPC, ActionForceMoveToObject(oPC, FALSE, 1.0, 15.0));
    AssignCommand(oNPC, ActionStartConversation(oPC));
    AssignCommand(oNPC, ActionDoCommand(SetCommandable(TRUE, oNPC)));
// Убедительно просим оНПС подойти к РС и сказать что велено! И не ЗАБЫТЬ!
    DelayCommand(0.3, SetCommandable(FALSE, oNPC)); // типа что бы не забыл
    SetLocalInt(OBJECT_SELF, "TRIGGERED", 1); // Запомним что это ужо было
}


*****************************************************************************

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

ОТВЕТЫ

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Copyright © 2005 WRG! Team
//:://////////////////////////////////////////////
/*  OnEnter - Триггера, скрипт создает секретную
    дверь если у вас в кармане плотовый предмет

  WP_DOOR - Вейпоинт на которм создаем дверь
  потайную из палитры.
  sDoorResRef - ResRef Скрытой двери,  нужно
  создать ее в палитре или использовать готовую
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan  aiwan@yandex.ru
//:: Created On: 12.01.2005
//:://////////////////////////////////////////////

void main()
{
    object oPC = GetEnteringObject();
    object oSecretItem = GetItemPossessedBy(oPC, "ТАГ_СЕКРЕТНОГО_ОБЪЕКТА");
    // Этот объект ДОЛЖЕН лежать у РС в кармане
    object oWP = GetNearestObjectByTag("WP_DOOR");
    location lLoc = GetLocation(oWP);
    if (!GetIsPC(oPC) || !GetIsObjectValid(oSecretItem) || GetLocalInt(OBJECT_SELF, "DOOR_SECRET"))
      {return;}
    // if (GetIsPC(oPC)) // Можно воткнуть проверку еще чего-нибудь...
      {
      SetLocalInt(OBJECT_SELF, "DOOR_SECRET", TRUE);
      AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_LOOKHERE));
      object oSecretDoor = CreateObject(OBJECT_TYPE_PLACEABLE, "sDoorResRef", lLoc, TRUE);
      // Тута можно красЯвый спелл какой воткнуть, звук или исчо чаво нить.
      }
}


Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Copyright © 2005 WRG! Team
//:://////////////////////////////////////////////
/*
Ставим на onUsed  потайной двери из вашей палитры
  WP_DISTANCE - Универсальный Вейпоинт с именем
  равным ТАГ-у нашей точки перемещениЯ. А это может
  быть ТАГ двери, Триггера, Вейпоинта...
*/

//:://////////////////////////////////////////////
//:: Использован частично код: Robert Babiak
//:: Created By: Aiwan  aiwan@yandex.ru
//:: Created On: 12.01.2005
//:://////////////////////////////////////////////
void SendCreature(object dCreature, object dDist)
{
    if(dCreature!= OBJECT_INVALID)
    {
        AssignCommand(dCreature, ClearAllActions());
        AssignCommand(dCreature, ActionJumpToObject(dDist,FALSE));
    }
}

void main()
{
    object oPC = GetLastUsedBy();
    object wDist = GetNearestObjectByTag("WP_DISTANCE");
// Вейп, с ИМЕНЕМ того объекта куда прыгнем ДВЕРЬ, ТРИГГЕР, ВЕЙПОИНТ
    object sDist = GetObjectByTag(GetName(wDist));
// ИМЯ нашего вейпоинта равно ТАГ-у того объекта куда прыгнем
    object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC);
    object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC);
    object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC);
    object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
    object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC);
    if (!GetLocked(OBJECT_SELF))
    {
        if (GetIsOpen(OBJECT_SELF))
        {
            AssignCommand(oPC, ActionJumpToObject(sDist, FALSE));
            SendCreature(oAnimal, sDist);
            SendCreature(oDominated, sDist);
            SendCreature(oFamiliar, sDist);
            SendCreature(oHenchman, sDist);
            SendCreature(oSummoned, sDist);
            PlayAnimation(ANIMATION_PLACEABLE_CLOSE);
            DestroyObject(OBJECT_SELF, 2.0); // Секретную дверь убить после...
        } else
        {
            PlayAnimation(ANIMATION_PLACEABLE_OPEN);
        }
    }
}


*****************************************************************************

ВОПРОС
Можно ли запускать один скрипт из другого? И как?

ОТВЕТЫ

Можно:
Neverwinter Script Source
ExecuteScript(string sScript, object oTarget)

Где sScript - имя исполняемого скрипта, а oTarget - объект, от лица которого скрипт будет запускаться. Этот объект в запускаемом скрипте будет OBJECT_SELF.


*****************************************************************************

ВОПРОС

ОТВЕТЫ

*****************************************************************************

ВОПРОС

ОТВЕТЫ

*****************************************************************************

ВОПРОС

ОТВЕТЫ

*****************************************************************************

Сообщение отредактировал Lemegeton - Mar 18 2005, 21:07
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме


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

 



Текстовая версия Сейчас: 19th April 2024 - 22:54