![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
********************************************************************************
Статьи, ссылки + выжимка из темы "Вопросы новичков, ТОМ 1" + выжимка из темы "Вопросы новичков, ТОМ 2" + выжимка из старых тем. ПОСТИТЬ ЗАПРЕЩЕНО ВСЕМ, КРОМЕ МОДЕРАТОРОВ РАЗДЕЛА. |
![]() |
![]()
Сообщение
#2
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
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. ************************************************** *************************** |
![]() ![]() |
Текстовая версия | Сейчас: 28th April 2025 - 18:54 |