BioWare Aurora Neverwinter Nights Toolset (На русском языке от Aiwan) Далее ответы на некоторые распространенные вопросы. (могут быть пересечения с тутором)
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как пользоваться хаками?
<span style='color:red'>
ОТВЕТЫ</span>
Тема по хакам 1Тема по хакам 2В том же резделе еще про них есть.
1) Кидай хак в папку haks.
2) В модуле в свойствах найди закладку, посвященную хакам (Custom Content).
3) Подключи нужный тебе хак и работай.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
CreateObject(...); - создает по Blueprint ResRef или по тэгу?
<span style='color:red'>
ОТВЕТЫ</span>
CreateObject(...); - создает по Blueprint ResRef
Создавать можно только итемы, NPC, плейсы, магазины и вейпоинты.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать чтоб гадкая маленькая буковка "я" не делала ошибки в скриптах?
<span style='color:red'>
ОТВЕТЫ</span>
Neverwinter Script
//================ Буква Я в стрингах (Автор Lex) ============================
string ya = GetName(GetWaypointByTag("YA")); // "+ya+" - так ее использовать
//================ Буква Я в стрингах (Автор Lex) ============================
DelayCommand(5.0, SpeakString("Да. Ключика у теб"+ya+" нет."));
Для работы этой схемы необходимо, чтобы в модуле был waypoint с tagом "YA" и именем "я"
--------------------------------------------------
в скриптах я делаю так:
- пишу сначала весь тест, какой должен быть в скрипте с буквами я.
- запускаю find and replace и меняю я на "+ya+"
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Для того чтобы садиться на стулья скрипт нужен?
<span style='color:red'>
ОТВЕТЫ</span>
Да. ActionSit(object oChair); на OnUsed стула.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
В упор не могу найти в палитре стойку бара (или что-то вроде). Облазил все, что можно, но всеже нигде нету. Не ужели ее в стандартной палитре нету?
<span style='color:red'>
ОТВЕТЫ</span>
Нет, но можно составить стойку из квадратных столов. Составляешь в ряд, и получается стойка.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Есть диалог, в котором должно быть две ветки. Первая, в случае истинности условия, вторая в случае его ложности. Объясните поподробнее, куда должен вставляться скрипт и как его писать.
(условие - наличие оружие в руках героя).
<span style='color:red'>
ОТВЕТЫ</span>
Ставишь один лишь скрипт на TextAppearsWhen в первой ветке.
Neverwinter Script
int StartingConditional()
{
object oPC = GetPCSpeaker();
if (GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) != OBJECT_INVALID){
// оружие в руке
return FALSE;
}
return TRUE;
}
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
У меня есть охранник в таверне, он предупреждает о том, что оружием размахивать нельзя. У всех НПС и предметов, onDamaged висит скрипт действий - менять факцию дебошира на хостайл, но это не логично: он ведь не напал ни на кого лично. Он просто чуть-чуть побуянил. Как поступить? Если его факцию выставить хостайлом по отношению с гардом, то остальные ПС могут обидится - они то не причем.. Что делать: Делать отдельную факцию для дебоширов или есть другой способ? Проблемма с тем, что если PC обидит гарда (сломав стул, напав на НПС), то другой РС зашедший в таверну, тоже получит от тролля в носяру.
<span style='color:red'>
ОТВЕТЫ</span>
Сделай в таверне фракцию, чтобы каждый из коммонеров был друг к другу нейтрален.
--------------------------------------------------
Делай гардов обсалютно нейтральными ко всем кроме друг друга и если ты напал на кого-то из посетителей, то вешай через он OnDamaged на оРС локалку а у гардов проверяй ее на OnPerception.
Можно стереть ее через часик, типа оттаял и спеак стринг типа: "А, это ты, ну входи...входи..."
--------------------------------------------------
Для этого существует PersonalReputation... Хотя... проще наверное действительно, как написано выше. Если, охранник обижается, то на нем ставится переменная: OBJECT_SELF - охранник, oPC - игрок, на которого обиделся.
Neverwinter Script
SetLocalObject(OBJECT_SELF, ObjectToString(oPC), oPC);
и сразу за ней
Neverwinter Script
DelayCommand(240.0, SetLocalObject(OBJECT_SELF, ObjectToString(oPC), OBJECT_INVALID)); // 4 минуты реального времени (2 часа игрового)
// Это чтобы "стиралась" репутация через 4 минуты...
Ну а в OnPerception ставишь типа:
Neverwinter Script
if (GetLocalObject(OBJECT_SELF, ObjectToString(oSeen)) == oSeen)
{
ClearAllActions();
SpeakString("Вандал! Банзай!");
ActionAttack(oSeen);
// и тд..
}
else
{
SpeakString("Проходи, присаживайсЯ.");
}
ЗЫ. Этa "система" не претендует на звание отработаной и отлаженой. В нее надо еще вносить и вносить. Это лишь каркас.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
И как сделать чтоб Визуал эффект был без звука?
<span style='color:red'>
ОТВЕТЫ</span>
Отредактировав соответствующий 2da. Скриптами нельзя.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Есть ли возможность открыть аврору без установленной игры?
<span style='color:red'>
ОТВЕТЫ</span>
Заходишь на nwnights.ru и качаешь там тулсет-бета 240 метров с гаком. Но это будет уже не полноценный редактор.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Есть какой нибудь учебничек для начинающих?
<span style='color:red'>
ОТВЕТЫ</span>
1. Статьи у нас на сайте (на русском).
2. NWN Lexicon (на инглише).
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Можно ли сделать так, чтобы при создании персонажа вместо ПБ кидались кубики (как по AD&D).
<span style='color:red'>
ОТВЕТЫ</span>
Для однопользовательской игры можно сначало создать персонажа, а потом руками отредактировать его характеристики, самостоятельно эмулируя броски кубиков. Для редактирования можно воспользоваться программой LETO, которую можно найти на ваулте.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Можно ли персонажу крылья прикрутить или что-нибудь такой супер-клёвое как у монстров?
<span style='color:red'>
ОТВЕТЫ</span>
Это можно сделать редактором LETO.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Можно ли поменять экран при загрузке модуля или локации?
<span style='color:red'>
ОТВЕТЫ</span>
Можно, редактированием loadscreens.2da. Есть утила специальная на ваульте, которая делает в нужном формате этот скрин.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать чтоб корабль плыл (ковер-самолет летал, повозка ездила и т.д.)?
<span style='color:red'>
ОТВЕТЫ</span>
Для этого необходимо переделать плейс (placeable) корабля в крича (creature). Тогда этим объектом можно будет управлять с помощью процедуры ActionMoveToObject(). Однако, по воде передвигать корабль всё равно не получится, т.к. по воде нельзя двигаться вообще - это запрещено движком.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Можно ли в Aurora Toolse'ере изменить или создать свою систему боя и создать новые классы? Или если можно другой прогой то скажите плиз какой.
<span style='color:red'>
ОТВЕТЫ</span>
Систему боя скорее всего нельзя...
А вот классы вполне можно. Но не программой, а ручками, поковыряв и дополнив некоторые 2da-файлы (classes.2da, ссылка на тему 2да ТАБЛИЦЫ в начале поста)
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
как правильно управлятся с освещением в Toolset'е?
<span style='color:red'>
ОТВЕТЫ</span>
Делай так: выбери работу с тайлами в тулсете и выдели комнату, нажав Del и зажав левой кнопкой выбери группу тайлов заключающую в себя весь периметр. Дальше нажми правой кнопкой мыши и выбери свойства. Там будут опции овещения тайлов (палитра квадратиков). Она содержит общий свет, отражение, свет факелов и их отражение. Вот возьми и окрась темным светом в одной комнате и светлым в другой. Один цвет это общий оттенок, другой вроде как отражение.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать так, чтобы игрок мог подниматься выше 40 уровня.
<span style='color:red'>
ОТВЕТЫ</span>
Никак.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Когда локацию делаешь, теги и ресрефы менять абсолютно на все плейсеблы?
<span style='color:red'>
ОТВЕТЫ</span>
Нет. Все зависит от того, будешь ли ты использовать эти (что находятся в локации) объекты из скриптов. Если да, то лучше сделать им уникальный тэг.
поменать резреф объекта, что стоит в локе все равно нельзя.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Нужно ли все, что есть в локации добавлять в палитру?
<span style='color:red'>
ОТВЕТЫ</span>
Нет, не обязательно. Кастомная палитра сделана для 2-х целей:
1. Ты планируешь делать из скрипта CreateObject данного объекта.
2. Для удобства заполнения других лок (если вломы юзать Ctrl+C, Ctrl+V).
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Можно ли добавить плейсеблы из хака в палитру скопом?
<span style='color:red'>
ОТВЕТЫ</span>
Нет. Плэйсы появятся при добавлении хака только в Appearance (model view). Для того, чтобы юзать плэйс в модуле, ему впервую очередь нужен уникальный ResRef и собсна описание модели в этом ресрефе. Потому и делается все ручками.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Где в модульных свойствах прописано с какими вещами и количеством голда будет появляться игрок впервые вошедший в модуль?
<span style='color:red'>
ОТВЕТЫ</span>
Это делается не в модульных свойствах, а в скрипте на событии OnClientEnter (в свойствах модуля):
Neverwinter Script
void main()
{
object oPC = GetEnteringObject();
if (GetLocalInt(oPC, "ENTERING_ONCE") == 0)
{
GiveGoldToCreature(oPC, 1000); // даст 1000 "зелени"
CreateItemOnObject("resref_item", oPC, количество); // вроде так... функция эта, но могу ошибаться в параметрах.
SetLocalInt(oPC, "ENTERING_ONCE", 1);
}
}
PS. Вполне допускаю, что это не самый правильный скрипт для шарда, потому как значение "первый-непервый раз" лучше хранить в БД, а не на чаре.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать так, чтобы дверь закрывалась сама после открытия?
<span style='color:red'>
ОТВЕТЫ</span>
Neverwinter Script
void main()
{
DelayCommand(14.9,ClearAllActions()); // Через 15 секунд
DelayCommand(15.0,ActionCloseDoor(OBJECT_SELF)); // захлопнет дверь
DelayCommand(20.0,SetLocked(OBJECT_SELF, TRUE)); // и закроет дверь на ключ через 20 сек
}
**************************************************
*****************************
<span style='color:red'>
ВОПРОС</span>
Как сделать так, чтобы отдыхать можно было только в определенных зонах?
<span style='color:red'>
ОТВЕТЫ</span>
1. рисуем тригер и растягиваем его во всю комнату, где можно будет отдыхать.
на OnEnter тригера вешаем скрипт:
Neverwinter Script
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC)) return;
SetLocalInt(oPC, "REST_ALLOWED", 1);
}
на OnExit:
Neverwinter Script
void main()
{
object oPC = GetExitingObject();
if (!GetIsPC(oPC)) return;
SetLocalInt(oPC, "REST_ALLOWED", 0);
}
идем в скрипт на OnPlayerRest и в самом начале скрипта добавляем проверку:
Neverwinter Script
object oPC = GetLastPCRested();
if(GetLocalInt(oPC, "REST_ALLOWED") !=1) AssignCommand(oPC, ClearAllActions());
теперь игрок сможет отдыхать только если он находиться внутри специального тригера
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как у непися сделать диалог, зависящий от расы, класса и пола? Например, девушку приветствует одним образом, девушку-воина другим, эльфа-мага -- третьим, и так далее..
<span style='color:red'>
ОТВЕТЫ</span>
Вариант 1: Через токены.
Neverwinter Script
SetCustomToken(int,string);
int номер кастомного токена, а string это собсна текст.
ПРИМЕР:
SetCustomToken(100,"эльфийка"). потом в диалоге написать:
"Привет, <CUSTOM100>"
А в игре будет так:
"Привет, эльфийка"
Если вы эти токены хотите определить и не менять (те создать свой набор и пользоваться ими в диалогах) то удобнее всего оформить их создание при загрузке модуля.
Вариант 2: выбираешь опцию text appears when, туда ставишь скрипт проверки на рассу/класс/пол и пишешь соответствующий диалог.
Единственное неудобство - приходится писать много разных вариантов для обоих полов каждой расы.
пример скрипта:
Neverwinter Script
int StartingConditional()
{
int iPassed = 0; // Число iPassed равно нулю
if(GetLevelByClass(CLASS_TYPE_FIGHTER, GetPCSpeaker()) >= 1)
// если уровень класса воин у говорЯщего РС больше или равен единички то
iPassed = 1; // ТО число iPassed равно единицы
// а то что снизу это уровнение как бы с сокращением. Вверху это как бы записи:
// пусть Х=тому то У= тому то бла бла а внизу в чистом виде y=x+z
// Если число iPassed равно нулю, то ничего не произойдет и ...
if(iPassed == 0)
return FALSE;
// возврат (return) ЛОЖЬ (FALSE), то есть скрипт не вернется в самый верх
// к функции int StartingConditional() и не прикажет ей начать диалог с
// персонажем показав именно ЭТУ строку удовлетворЯющую ее запросам
return TRUE;
// Это второе условие, т.е. скрипт как бы пробежал по коду и если iPassed = 1;
// то он даже не опустится к return FALSE; так как у нас единичка и он сразу
// побежит читать что еще там ниже. А ниже "return TRUE;" что значит возврат
// ИСТИНА, и он типа: ОПА! И запускает функцию ктороая быстренько тормозит
// пролетающую проверку движком по всем корневым строкам НПС сверху вниз
}
ставим этот скрипт на в слоте text appears when на той строке, где у нас ветка для воинов.
Скрипты такого рода делаются ScriptWizardом. Только не забудте удалить русские буквы "я" в комментариях, если у вас русская версия НВН
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как заставить НПС говорить подругому в диалоге если игрок уже с ним 1 раз поговорил.
<span style='color:red'>
ОТВЕТЫ</span>
Скриптами.
1. d_st_firsttalk
Neverwinter Script
void main()
{
SetLocalInt(OBJECT_SELF,"FirstTalk",TRUE);
}
2. d_ch_firsttalk
Neverwinter Script
int StartingConditional()
{
return GetLocalInt(OBJECT_SELF,"FirstTalk");
}
Ставим скрипт 1 в том месте диалога (в закладку Actions), после прохождения которого НПС будет "знать" игрока и в след. диалоге уже говорить с ним как с знакомым. (например после того, как игрок представился)
Ставим скрипт 2 на той ветке, которая должна быть, если НПС знает игрока. (в закладке text appears when)
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Вобщем нужен скрипт, чтоб в разговоре при фразе например: "Я слаб, вылечи меня" с перса снимались все вредные эффекты, полностью востанавливалисб хитпоинты и было это бесплатно...
<span style='color:red'>
ОТВЕТЫ</span>
Вешаешь как действие на ветке диалога. Лечит все ХП и снимает эффекты.
Neverwinter Script
#include "nw_i0_plot"
void main()
{
object oPC = GetPCSpeaker();
int iHP =GetMaxHitPoints();
effect eHeal = EffectHeal (iHP);
effect eHealVis = EffectVisualEffect (VFX_IMP_HEALING_X);
ActionCastFakeSpellAtLocation(SPELL_HEALING_CIRCLE
,GetLocation(oPC));
DelayCommand (2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,eHeal,o
PC));
DelayCommand (2.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eHeal
Vis,oPC,10.0));
DelayCommand (2.0, RemoveEffects(oPC));
}
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать так, чтоы у NPC с самого начала было не максимальное количество здоровья? Чтобы NPC был раненый.
<span style='color:red'>
ОТВЕТЫ</span>
В слот OnSpawn добавить такой код:
Neverwinter Script
object oNPC = OBJECT_SELF;
int iD = 30; // Величина повреждений
effect eDamage = EffectDamage(iD);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,
oNPC);
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
В НВН ХотУ у хенчей можно просмотреть инвентарь из радиального меню. А у простых НПС которые к тебе присоединяются - нельзя. Как сделать чтобы это стало возможным?
<span style='color:red'>
ОТВЕТЫ</span>
поставить НПСу скрипты хенчшей. (важен именно скрипт onConversation. Там подключается библиотека, где прописаны все реакции на радиальное меню, ведь это на самом деле слова, сказанные шепотом)
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
напишите полный скрипт с объяснением, как перепрыгуть NPC`у в другую локацию
<span style='color:red'>
ОТВЕТЫ</span>
Neverwinter Script
...
objectoHome = GetObjectByTag("mn_Portal");
location lHome = GetLocation(oHome);
JumpToLocation(lHome);
...
Существует объект с тэгом mn_portal. Это любой размещаемый объект, можно (и желательно) WayPoint (точка пути). Объект может быть размещен где угодно. Даже на другой зоне (area).
Во-первых получаем сам объект:
Тип данных object хранит объект (на самом деле лишь ссылку на него, но это не важно).
object oHome = GetObjectByTag("mn_Portal");
Функция GetObjectByTag возвращает "ссылку" на объект с тэгом, заданным параметром.
В данном случае мы передаем тэг объекта "mn_portal" (string) получаем объект с тэгом "mn_portal" (object).
Во вторых получаем координаты объекта:
location lHome = GetLocation(oHome);
Тип данных location хранит координаты (и много чего другого).
Функция GetLocation возвращает координаты объекта, заданного параметром.
В данном случае, параметром является объект с тэгом "mn_portal" (object), и получаем полные координаты размещаемого объекта (location).
В-третьих совершаем само перемещение:
JumpToLocation(lHome);
Функция JumpToLocation перемещает объект OBJECT_SELF (в основном это будет PC) в место как можно ближе к координатам, указаным в параметре. Т.е. если в точке приземления будет стол, то перс окажется рядом со столом. Если точка перемещения окажется слишком близко, объект перемещения может просто сделать шаг.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Есть НПС у которого диалог. Игрок может выбрать что ответить, а может просто нажать "Esc" и диалог убереться. Как отследить что игрок снимает диалог?
<span style='color:red'>
ОТВЕТЫ</span>
Последняя вкладка в диалог эдиторе там типа события End Normal и End Abort...
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
В тулсете под палитрой есть чекбокс "Show Plot". Если на нем поставить галочку появляется Plot Wizard, Non Plot Wizard. Что это такое и с чем его едят?
<span style='color:red'>
ОТВЕТЫ</span>
Это для того, чтобы писать простые (принеси, убей) квесты визардом. Никогда не пользовался, хотя разобраться, вроде разобрался с ним. Ничего сложного.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как игровому персу присобачить какиенибудь крылья, или хвост?
<span style='color:red'>
ОТВЕТЫ</span>
Скриптами никак, наверное. Это рассовый признак. Те 2да файлы.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
А вот у меня вопрос не по скриптам , я создал предмет у торговца (еда) но у него она стоит 1gp как сделать так чтобы она стоила 10?
<span style='color:red'>
ОТВЕТЫ</span>
Стоимость товара у торговца зависит от многого. В основном, от процентной наценки торговца и от умения персонажа торговаться.
Но и у предмета есть стоимость (в самой первой вкладке в свойствах предмета, слева-сверху). Она зависит от предмета (точнее, от того, как она прописана на предмет в файле 2da ), но есть и параметр Дополнительной стоимости (вроде непосредственной и необоснованной наценки) он расположен как раз под "зарядами" на той же самой первой вкладке. Увеличь ее на сколько нужно.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать скрипт чтобы охранники злого города атаковали и тд?
<span style='color:red'>
ОТВЕТЫ</span>
добавка к стандартному скрипту onPerception:
Neverwinter Script
object oPC = GetLastPerceived();
int iSeen = GetLastPerceptionSeen();
int PCAL = GetAlignmentGoodEvil(oPC);
if (GetIsPC(oPC))
{
if (iSeen)
{
if (PCAL!=ALIGNMENT_EVIL)
DetermineCombatRound(oPC);
}
}
Это для охраны злого города. Остальное по аналогии.
Есть минусы, ессно. Но суть ясна.
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как сделать так, чтобы гварды атаковали всех у кого нет определенного предмета?
<span style='color:red'>
ОТВЕТЫ</span>
добавка к стандартному скрипту onPerception::
Neverwinter Script
object oPC = GetLastPerceived();
int iSeen = GetLastPerceptionSeen();
int ITM = HasItem(oPC,"TAG_OF_ITEM");
if (GetIsPC(oPC))
{
if (iSeen)
{
if (!ITM)
DetermineCombatRound(oPC);
}
}
Для работы этого куска кода надо добавить в начале скрипта, до void main() вот это : #include "nw_i0_plot"
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как реализовать респаун вещей в сундуках по времени(шмотка фиксовая сундук бессмертный)?
<span style='color:red'>
ОТВЕТЫ</span>
в закрытой локации ставим creature и ставим в слот onSpawn такой скрипт:
Neverwinter Script
void main()
{
object oChest = GetObjectByTag("YOUR_PLOT_CHEST");
object oItem = GetFirstItemInInventory(oChest);
while GetIsObjectValid(oItem) // отчистка сундука от всего, что в нем есть
{
DestroyObject(oItem);
oItem = GetNextItemInInventory(oChest);
}
CreateItemOnObject("TAG_OF_ITEM",oChest,1); // создание фикс. вещи
ExecuteScript(600.0,"spw_chestmaster"); // через 600 секунд повторить.
}
**************************************************
******************************
<span style='color:red'>
ВОПРОС</span>
Как увеличить опыт за убийство мобов?
<span style='color:red'>
ОТВЕТЫ</span>
1. В настройках модуля есть XP Scale. Подвигай ее.
2. За то, сколько игрок получает экспы при убийстве моба отвечает его (моба) CR. Чем он выше, тем экспы больше. Закладка Advansed в свойствах модуля.
3. в Скрипте onDeath для мобов написать свою систему дачи экспы. XP Scale тогда надо выставить на 0.
**************************************************
***************************