Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Flaristan
Цитата(arcmag @ Jul 18 2013, 07:11) *
Насчет скрипто-геренератора) скачал посмотрел) в принципе штука интересная вот только боюсь с моим английским троишным мне придется оч долго там разбираться и постоянно лазить в переводчик, быть может есть руссификатор к нему?
Русификаторов ее, насколько мне известно - нет и вряд ли появятся в виду нижеследующего.

Если ты собираешься заниматься скриптами, тебе в любом случае придется лазить в переводчик или как минимум запоминать, что то или иное слово в скриптах означает. А в скриптах как правило все команды означают то, что они делают.
Кроме того в скрипт генераторе нечего особо переводить кроме окон с подсказками которые можно и игнорировать попросту, если ты не собираешься изучать все тонкости досконально. Все термины которые там используются взяты из того же тулсета и тебе их так же в любом случае придется запоминать, если ты собираешься с ним много работать.

В любом случае, если даже не учитывать вышеописанного – эта программа стоит возни с ней и переводчиком ради результата который она может дать.
Лично я по ней научился скриптить до того уровня который имею. smile.gif
arcmag
Ну запоминать функции так или иначе все равно придется это я понимаю. Думаю я мог бы писать скрипты, до этого я немного изучал С++ и в принципе необходимую базу знаний имею. У меня проблема именно в том что я знаю пока что слишком мало функций и если допустим такие функции как ActionAttack , GiveGoldToCreature и еще некоторые можно разобрать хотя бы по названию этих функций начать атаку или дать золота, то всякие функции вроде GetAppearanceType или ItemPropertyLight понять труднее.
На данный момент прогресс в изучении уже есть, но пока что этого все еще не достаточно.

Конечно у вас на форуме есть много интересной информации, но она не всегда достаточно доступно объяснена (хотя кое что полезное я все таки иногда нахожу, например смог разобраться как уничтожить вещи в рюкзаке игрока) и не всегда удается найти именно то что нужно мне на данный момент. Допустим я ищу такую функцию отнимала бы уровни у игрока.
Вот есть условие -
если (игрок выше 1лв)
//допустим 12
функция возвращает его лвл с 12-го на 1-й при этом стирая все полученные умения и характеристики возвращая к базовому значению.

здесь я такого пока не нашел, хотя пока что еще не все просмотрел) быть может найду еще.

Со скрипто-генератором конечно понятно что там особо переводить то нечего) главное как я понял правильно указать условие требуемого скрипта, но все таки будь он на русском задача была бы значительно проще. Скорее всего придется тупо на бумажке писать пометки что бы ориентироваться в нем. Как нибудь займусь этим.
Melisse
Neverwinter Script
void SetXP( object oCreature,  int nXpAmount);

Когда уровень снимается автоматом все удаляется: умения, бонусы абилок и навыки
т.е. вам нужно поставить опыт = 1, для первого уровня. Вроде только для игрока юзается.
Для НПС надо юзать
Neverwinter Script
LevelUpHenchman (object oCreature,  int nClass = CLASS_TYPE_INVALID,  int bReadyAllSpells = FALSE,
                               int nPackage = PACKAGE_INVALID);


Описание всех функций на инглише есть в Lexicon 1.69.
Для мало-мальски малого понимания скриптов придется посидеть пару месяцев разбирая их, если не было раньше опыта.
Для меня самым сложным оказалось Struct (структуры), я с трудом уяснила что это и как пользоваться. У каждого свое.




GetAppearanceType используется для смены "шкурки"/"модели" существ, типы берутся из appearance.2da соответственно номеру, т.е. выставите 41 и будет шкурка черного дракона на модели, а свойства/абилки/навыки и умения не поменяются.

ItemProperty это свойства различные предметов, типа +1 бонус зачарования или свет желтый 10 футов и т.д.

Вообщем почитайте тут и тут для просто ознакомления, но там не все
Flaristan
Цитата(arcmag @ Jul 19 2013, 18:17) *
Ну запоминать функции так или иначе все равно придется это я понимаю. Думаю я мог бы писать скрипты, до этого я немного изучал С++ и в принципе необходимую базу знаний имею. У меня проблема именно в том что я знаю пока что слишком мало функций и если допустим такие функции как ActionAttack , GiveGoldToCreature и еще некоторые можно разобрать хотя бы по названию этих функций начать атаку или дать золота, то всякие функции вроде GetAppearanceType или ItemPropertyLight понять труднее.
На данный момент прогресс в изучении уже есть, но пока что этого все еще не достаточно.

Со скрипто-генератором конечно понятно что там особо переводить то нечего) главное как я понял правильно указать условие требуемого скрипта, но все таки будь он на русском задача была бы значительно проще. Скорее всего придется тупо на бумажке писать пометки что бы ориентироваться в нем. Как нибудь займусь этим.
Для того чтобы разобраться со всем функционалом тулсетовского редактора скриптов неплохо подходит лексикон – там все удобно скомпоновано, информативно и кратко расписано и часто дано с примерами + возможно использовать поиск по материалам (кстати WRG его вроде даже частично перевели).
Так же не лишним бывает такое упражнение, как пересмотр всего списка функций редактора вручную с прочтением подписей непосредственно в редакторе.
Однако как для первого, так и для второго показано знание английского.

Так что в любом случае советую лучше учить его – знание в жизни не из ряда бесполезных.

В генераторе среди наложения прочих эффектов доступен стандартный «Negative Level» (проклятие понижения уровня) – если поставить при генерировании галочку «Supernatural», то эффект будет недиспелящимся и не проходящим с отдыхом (так что убрать его можно будет только через аналогичный скрипт обратного толка).
Если задача забрать у игрока опыт размером в уровень перманентно, то, даже не зная скриптов, и это возможно с помощью генератора скриптов, но будет долго и нудно. Нужно составить список условий «if» указывая в них каждый возможный в игре уровень персонажа и в зависимости от него отнимать опыт размером с уровень-тысяч. Ну например если уровень игрока = 10, то отнять у него 10 000 опыта; если уровень = 9, то отнять 9 000 опыта и т.д.. Чтоб снять все уровни, там же можно просто проставить максимум в команде отнятия опыта. Грубо конечно за неимением умений писать более функционально, но будет работать и на одном знании генератора.
arcmag
Опять вопрос) В чем проблема в этом скрипте:

Neverwinter Script
object oPC = GetEnteringObject();

CreateItemOnObject("item", oPC, 1); // Дать броню
CreateItemOnObject("item001", oPC, 1); // Дать меч
CreateItemOnObject("item002", oPC, 1); // Дать лук
CreateItemOnObject("item003", oPC, 1); // Дать Ботинки
CreateItemOnObject("item004", oPC, 99); // Дать стрелы

по идеи он должен выдавать вещи) компилируется все нормально но вот при выполнении почему то выдается только первый предмет) если первым поставить item то даст бронь, если item003 ботинки. А остальные вещи не выдаются зато в чате вылазит желтый текст ошибки - ОШИБКА : ОПУСТОШЕНИЕ СТЕКА. Не могу понять вроде бы все правильно написано.
Aiwan
А нафика жирным весь текст сообщений? Типа выделить, что бы увидили? Тут не секс чат, пиши нормально.
arcmag
Жирный издалека видно rolleyes.gif ) просто по привычке как то уже и внимание на это особо не обращаю обычно на форумах так пишу, уж и забыл почему так начал хех scratch_one-s_head.gif ...
Flaristan
Цитата(arcmag @ Jul 20 2013, 10:00) *
Опять вопрос) В чем проблема в этом скрипте:

Neverwinter Script
object oPC = GetEnteringObject();

CreateItemOnObject("item", oPC, 1); // Дать броню
CreateItemOnObject("item001", oPC, 1); // Дать меч
CreateItemOnObject("item002", oPC, 1); // Дать лук
CreateItemOnObject("item003", oPC, 1); // Дать Ботинки
CreateItemOnObject("item004", oPC, 99); // Дать стрелы

по идеи он должен выдавать вещи) компилируется все нормально но вот при выполнении почему то выдается только первый предмет) если первым поставить item то даст бронь, если item003 ботинки. А остальные вещи не выдаются зато в чате вылазит желтый текст ошибки - ОШИБКА : ОПУСТОШЕНИЕ СТЕКА. Не могу понять вроде бы все правильно написано.
Ошибка как водится там, где она может быть. В таком элементарном скрипте – это одно единственное место: резрефы. smile.gif

Когда искал в тулсете, почему так – обнаружил (или вспомнил) одну довольно странную особенность Авроры: через палитру невозможно открыть свойства объектов, чтоб посмотреть их таги или резрефы; вместо этого доступен вариант «редактировать и копировать», и если в кастомной палитре можно использовать вариант просто «редактировать», то в дефолтной такого варианта нет; таким образом, когда вы пытаетесь посмотреть резреф дефолтного объекта через палитру – вы видите не резреф объекта, а предлагаемый тулсетом новый сгенерированный резреф для его копии, и, разумеется, он будет не валидным (пока вы не создадите эту копию с предлагаемым резрефом в кастомной палитре).

Лечится так - когда смотришь резреф объекта из дефолтной палитры:
- размести его в модуле;
- через свойства объекта посмотри его резреф;
- обратно удали.
arcmag
Цитата
Ошибка как водится там, где она может быть. В таком элементарном скрипте – это одно единственное место: резрефы. smile.gif

Когда искал в тулсете, почему так – обнаружил (или вспомнил) одну довольно странную особенность Авроры: через палитру невозможно открыть свойства объектов, чтоб посмотреть их таги или резрефы; вместо этого доступен вариант «редактировать и копировать», и если в кастомной палитре можно использовать вариант просто «редактировать», то в дефолтной такого варианта нет; таким образом, когда вы пытаетесь посмотреть резреф дефолтного объекта через палитру – вы видите не резреф объекта, а предлагаемый тулсетом новый сгенерированный резреф для его копии, и, разумеется, он будет не валидным (пока вы не создадите эту копию с предлагаемым резрефом в кастомной палитре).

Лечится так - когда смотришь резреф объекта из дефолтной палитры:
- размести его в модуле;
- через свойства объекта посмотри его резреф;
- обратно удали.


Но я использую свои собственные объекты из "кастомной палитры" а не из стандартной) эти объекты я создал сам) нажав на свой объект Edit я вижу его РесРеф после чего вписываю его в функцию) что не так?
Я даже потом попробовал создать копию своего объекта и самостоятельно назначить свой РесРеф) все поставил, ошибка так и осталась 1 предмет выдает остальные игнорит...
Flaristan
Neverwinter Script
void main()
{
object oPC = GetEnteringObject();

CreateItemOnObject("item", oPC, 1);
CreateItemOnObject("item001", oPC, 1);
CreateItemOnObject("item002", oPC, 1);
CreateItemOnObject("item003", oPC, 1);
CreateItemOnObject("item004", oPC, 99);
}
В таком виде скрипт никаких ошибок не содержит. Проверил только что в своем тулсете, создав на резрефы от 1 до 4 по предмету снаряжения, на 5 - стрелы.
Значит проблема либо:
1) не в скрипте;
2) резрефы все же указаны не верно - проверьте еще раз.

P.S.: На всякий случай: резреф - это вот это.

Редактировать его можно только при создании нового "чертежа" в палитру.
arcmag
Да вроде нет) ошибки быть не должно все таки я копирую ресреф (ctrl + c) а не пишу его)
Melisse
Neverwinter Script
CreateItemOnObject("item", oPC, 1);
CreateItemOnObject("item001", oPC, 1);
CreateItemOnObject("item002", oPC, 1);
CreateItemOnObject("item003", oPC, 1);
CreateItemOnObject("item004", oPC, 99);

попробуй убрать цифры
arcmag
Neverwinter Script
object oPC = GetEnteringObject();
CreateItemOnObject("item",oPC);
CreateItemOnObject("item001",oPC);
CreateItemOnObject("item002",oPC);
CreateItemOnObject("item003",oPC);
CreateItemOnObject("item004",oPC);

нее увы не помогло)
блин чтож это за ошибка такая хитрая попалась) вечно у меня все через ж**у блин...
Melisse
Это у вас тулсет кривой значит.

Вот что пишет лексикон:

Neverwinter Script
object CreateItemOnObject(
    string sItemTemplate,
    object oTarget = OBJECT_SELF,
    int nStackSize = 1,
    string sNewTag = ""
);


Parameters
sItemTemplate
The blueprint ResRef string of the item to be created or tag.

oTarget
The inventory where you want the item created. (Default: OBJECT_SELF)

nStackSize
The number of items to be created. (Default: 1)

sNewTag
Sets the tag. If this string is empty (""), it be set to the default tag from the template. (Default: "")

Description
This function creates an item with the template sItemTemplate in oTarget's inventory. If you are creating a custom item, sItemTemplate is the ResRef; if you are creating a standard item, sItemTemplate is the item's tag.
Returns the object that has been created. On error, this returns OBJECT_INVALID. CreateItemOnObject will work on item containers.
Additional notes added for clarification in 1.64 include: If the item created was merged into an existing stack of similar items, the function will return the merged stack object. If the merged stack overflowed, the function will return the overflowed stack that was created.

Remarks
The parameter nStackSize only applies to stackable items (eg. potions). If sItemTemplate refers to a non-stackable item (eg. armor) only 1 item will be created.
CreateItemOnObject has interesting behaviour when called to create a stackable item.
If the oTarget of the command has a stack already existing, the items created will be added to the existing stack, in which case two things can happen:
1. A new stack has to be created to hold some overflow. CreateItemOnObject returns a valid object, the overflowed stack of items (so, not the completly filled up stack)
2. The old stack object does not overflow past 99. No new stack object is created. CreateItemOnObject returns a value thats not equal to OBJECT_INVALID, but, if tested with GetIsObjectValid() will return FALSE.

Known Bugs
This bug will most likely be fixed in version 1.62, and thus only apply to 1.61 and possibly earlier versions as well:
Returns OBJECT_INVALID when the created object is added to an existing stack.
arcmag
Теперь я тоже так думаю) чтож спасибо всем большое кто мне помогал) попробую переустановить нвн на какую нибудь другую версию. Надеюсь поможет... sorry.gif
Да я щас на настольном пк работаю тут версия 1.69 стоит
arcmag
Установил другой нвн все заработало. Огромное спасибо Melisse за ссылку с функциями теперь разбираться стало реально проще и быстрее. i-m_so_happy.gif
Melisse
Цитата
Установил другой нвн все заработало. Огромное спасибо Melisse за ссылку с функциями теперь разбираться стало реально проще и быстрее.

Там далеко не все, остальное придется по лексикону разбирать. Копипасте в переводчик и будет тоже самое почти
Anakondar
Цитата(Melisse @ Jul 18 2013, 20:14) *
Нет, совсем не так.
При 0 всегда будет FALSE, а от -2,147,483,648 до 2,147,483,647, кроме 0 всегда TRUE
иначе говоря FALSE это всегда 0, а TRUE любое кроме 0


Так вопрос-то был
Цитата(arcmag @ Jul 18 2013, 09:11) *
значение переменной (...) может быть только в двух значениях (...) так получается?

И ответ на него
Цитата(Anakondar @ Jul 18 2013, 17:55) *
2. Нет.

а не
Цитата(Melisse @ Jul 18 2013, 09:59) *
2. Да


Значений куча, просто в некоторых частных случаях (условный оператор) некоторые из значений (не нулевые) интерпретируются одинаково. Если же кто-то захочет хранить в переменной целое число и использовать его как число, а не признак истинности, то он сможет это сделать.
Melisse
Anakondar
ок, я не так поняла вопрос
Gatcuk
Добрый день. Я создаю модуль для будущего Шарда (Да, да. Имя нам - легион) и столкнулся с небольшой проблемой. Не подскажете ли скрипт для автоматического закрытия и запирания дверей через определнное время (15 секунд). Это необходимо для реализации системы частной собственности для игроков. Заранее спасибо. i-m_so_happy.gif
gennady
Neverwinter Script
// ЗАКРЫТЬ ДВЕРЬ И ЗАМОК Слот OnOpen
void main()
{
object oDoor = OBJECT_SELF;

DelayCommand(15.0, ActionCloseDoor(oDoor));
SetLocked(oDoor, TRUE);
}
Gatcuk
Спасибо большое. Вместо oDoor вставить теги двери?

// ЗАКРЫТЬ ДВЕРЬ И ЗАМОК Слот OnOpen
void main()
{
object oDoor = OBJECT_SELF;
DelayCommand(15.0, ActionCloseDoor(OBJECT_SELF));
SetLocked(oDoor, TRUE);
}
gennady
Нет, этот скрипт поставить в слот OnOpen двери. Всё! smile.gif
Gatcuk
И еще раз огромное спасибо i-m_so_happy.gif Очень выручили.
Gatcuk
Друзья, никто не подскажет скрипт для крафтинга через диалог?

Что-то вроде:

Изготовить "предмет" (требует X ресурса, X навыка изготовления брони). Во время проверки навыка имеется X% шанс успеха, в случае провала ингридиенты уничтожаются, но игрок предмет уже не получает.

Меня интересует крафт с проверкой навыков на изготовление брони (Craft Armor), оружия (Craft Weapon), ловушек (Craft trap), зелий (Brew potion) , поясов целителя (Heal), волшебных палочек (Craft wand), свитков (Scribe scroll), отмычек (Open lock), Книг (Lore).

Заранее спасибо i-m_so_happy.gif
Flaristan
Цитата(Gatcuk @ Jul 25 2013, 19:45) *
Друзья, никто не подскажет скрипт для крафтинга через диалог?

Что-то вроде:

Изготовить "предмет" (требует X ресурса, X навыка изготовления брони). Во время проверки навыка имеется X% шанс успеха, в случае провала ингридиенты уничтожаются, но игрок предмет уже не получает.

Меня интересует крафт с проверкой навыков на изготовление брони (Craft Armor), оружия (Craft Weapon), ловушек (Craft trap), зелий (Brew potion) , поясов целителя (Heal), волшебных палочек (Craft wand), свитков (Scribe scroll), отмычек (Open lock), Книг (Lore).

Заранее спасибо i-m_so_happy.gif
>>>
Цитата(Flaristan @ Jul 18 2013, 05:30) *
Изучай скрипт-генератор – там есть все подобные функции.

Как создать данный скрипт с помощью скрипт генератора:
1. Запускаем генератор.
2. Choose script type (выберите тип скрипта) -> Normal script (нормальный скрипт).
3. Where is this script called from? (откуда запускается скрипт) -> From a conversation (из диалога).
4. Выбираем из списка арсенала генератора пункт Make an ‘if THIS then THAT condition’ (сделать «если ЭТО, то ТО условие») и жмем SCRIPT (скрипт).
5. Choose your condition (выберите ваше условие) -> Item restriction (требование предмета) -> The following event(s) will happen only if player (данный эвент(ы) случится только если игрок…) -> Has (имеет) -> The item tagged (предмет с тагом…) -> вводим таг предмета (в примере это «tag_of_resurs») -> есть возможность затребовать, чтоб этот предмет был экипирован на теле игрока в указанном слоте – она нам не нужна, не трогаем -> Okay (запилить!).
6. Операцию требования предмета можно повторить, если мы хотим, чтоб ресурсов было больше чем 1, но нам этого не надо, зато у нас есть требование навыка, поэтому все равно жмем еще раз Make an ‘if THIS then THAT condition’ (сделать «если ЭТО, то ТО условие») и жмем SCRIPT.
7. Choose your condition (выберите ваше условие) -> Successful skill check (удачная проверка навыка) -> Skill to check: (проверяемый навык) -> (тут можно ставить тот тип навыка, к которому мы относим крафт этого предмета – в примере это будет «Craft trap», ставим его; к сожалению почему-то в данном списке генератора представлены не все умения, но их можно и вручную в получившемся скрипте потом поменять будет, подсмотрев константы в тулсете или лексиконе) SKILL_CRAFT_TRAP -> Difficulty: (класс сложности; d20 + уровень навыка игрока должен быть равен или быть выше этого значения) -> (тут мы сразу одновременно устанавливаем и % успеха, т.к. чем выше разница требования и броска кубика + навыка игрока – тем меньше у него шансов на успех вплоть до «никаких»; допустим для примера мы создаем хитроумное приспособление которое должно соответствовать работе игрока-мастера не ниже 10 уровня с полностью вкачанным навыком, это около 13 пунктов навыка, добавим возможный бонус от вещей и модификаторов и повысим его до 17 пунктов, а так же установим вероятность создания такого предмета для такого мастера в 50% т.е. добавим еще 10 пунктов от предполагаемого броска кубика и получим в итоге 27, так и пишем) 27 -> Okay (запилить!).
8. Таким образом у нас получилось 2 условия – предмет и сложность крафта, теперь нам нужно описать что произойдет, если у игрока все получится. Выбираем из списка арсенала генератора пункт Give item(s)/XP/gold to PC (дать предмет(ы)/опыт/золото игроку) -> SCRIPT (скрипт) -> ResRef of item to give: (резреф получаемого предмета) -> (вбиваем/копируем сюда резреф того, что должно получиться – в примере это будет «resref_of_result») resref_of_result -> (больше мы ничего игроку не даем, поэтому жмем сразу финальную кнопку «запилить и выйти!») Okay – exit!
9. Итак у нас получается в случае прокидывания DC, игрок получает то, что он собирался скрафтить. На этом мы закрываем второе наше «if THIS then THAT» условие, для чего нажимаем 1 раз кнопку «Finish current if» (закончить текущее «если») -> Just finish (просто закончить; есть варианты еще «наветвить», но нам они тут не нужны).
10. В окошке «Current number of unfinished ‘if’ statements» (текущее число незавершенных «если» условий) видим, как 2 превратилось в 1. У нас осталось еще первое условие - предмета. Наш крафт подразумевает, что этот ресурс тратится при любом варианте, поэтому теперь мы это и осуществим в независимости от прокидываний DC. Выбираем из списка арсенала генератора пункт Take item(s)/XP/gold from PC (взять предмет(ы)/опыт/золото у игрока) -> SCRIPT (скрипт) -> (нам нужно только взять 1 предмет, поэтому мы заполняем лишь соответствующее поле) Tag of the item to take (таг забираемого предмета; у нас в примере это вышеупомянутый «tag_of_resurs») -> tag_of_resurs -> (больше мы ничего у игрока не забираем, поэтому жмем сразу финальную кнопку «запилить и выйти!») Okay – exit!
11. Теперь можно закрыть и 2 условие. Жмем «Finish current if» (закончить текущее «если») -> Just finish (просто закончить).
12. Вот собственно и весь наш скрипт. Больше нам добавить нечего и мы жмем кнопку «Close».
13. Теперь в окошке справа мы видим код нашего скрипта (выглядит кривовато, зато рабочий) – копируем его и помещаем его в нужное место в редакторе диалога (на «совершенные действия»).
14. Наслаждаемся и благодарим Лилака. Генератор можно закрывать.

Вот как выглядит результат:
Neverwinter Script
object oItem;
/*   Script generated by
Lilac Soul's NWN Script Generator, v. 2.3

For download info, please visit:
http://nwvault.ign.com/View.php?view=Other...683&id=625    */


//Put this on action taken in the conversation editor
void main()
{

object oPC = GetPCSpeaker();

if (GetItemPossessedBy(oPC, "tag_of_resurs")!= OBJECT_INVALID)
   {
   if (GetIsSkillSuccessful(oPC, SKILL_CRAFT_TRAP, 27))
      {
      CreateItemOnObject("resref_of_result", oPC);

      }
   oItem = GetItemPossessedBy(oPC, "tag_of_resurs");

   if (GetIsObjectValid(oItem))
      DestroyObject(oItem);

   }
}
Gatcuk
Огромное спасибо, друг.

Если честно, то я кажется начинаю потихоньку понимать, как это работает. И если можно, я попрошу еще один совет у мастеров. Дело в том что в редакторе я видел несколько предметов, чье предназначение не понял. А точнее: мясо, рыба, чеснок, беладонна. Не знаю, есть ли в игре кулинария (не одного упоминания я так и не обнаружил), но если они бесполезны, может подскажете младшему товарищу (это я) скрипт для того, что бы они расходовались во время отдыха. У меня уже на уме довольно простая, но в то же время интересная экономическая система для шарда. И если бы в нем присутствовали подобные расходники, это бы было очень кстати. i-m_so_happy.gif
arcmag
Цитата
Если честно, то я кажется начинаю потихоньку понимать, как это работает. И если можно, я попрошу еще один совет у мастеров. Дело в том что в редакторе я видел несколько предметов, чье предназначение не понял. А точнее: мясо, рыба, чеснок, беладонна. Не знаю, есть ли в игре кулинария (не одного упоминания я так и не обнаружил), но если они бесполезны, может подскажете младшему товарищу (это я) скрипт для того, что бы они расходовались во время отдыха. У меня уже на уме довольно простая, но в то же время интересная экономическая система для шарда. И если бы в нем присутствовали подобные расходники, это бы было очень кстати. i-m_so_happy.gif


Я конечно не мастер по скриптам но то что ты просишь по моему весьма просто. Допустим если игрок должен отдыхать в трактире в комнате вешаешь на кровать диалог с опцией "Отдых" которая появится в том случае если в инвентаре будет мясо, рыба ну и тд. При нажатии эти объекты дестроятся и начинается отдых.

На проверку для появления текста нужно повесить



Neverwinter Script
#include "nw_i0_tool"
int StartingConditional()
{
    if(HasItem(GetPCSpeaker(), "ТАГ_ТВОЕГО_ПРЕДМЕТА"))
        return TRUE;
    return FALSE;
}


и на действие при активации диалога


Neverwinter Script
void main()
{
   object oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "ТАГ_ТВОЕГО_ПРЕДМЕТА");
   if(GetIsObjectValid(oItemToTake) != 0){
      DestroyObject(oItemToTake);
      ForceRest(GetPCSpeaker()); // насчет этой строчки я не совсем уверен но помоему она должна активировать отдых
}
}
Melisse
Цитата
ForceRest(GetPCSpeaker()); // насчет этой строчки я не совсем уверен но помоему она должна активировать отдых

не,... сам процесс не активируется, но используется на персонаже "сила отдыха", т.е. эффект как-будто персонаж отдохнул. Если нужно заставить именно отдыхать, то там есть актион вроде, типа ActionRest

Neverwinter Script
if(GetIsObjectValid(oItemToTake) != 0)

тут можно и не делать сравнение а просто if(GetIsObjectValid(oItemToTake))
Gatcuk
Спасибо большое. А это будет работать если в локации стоит запрет на отдых?
Melisse
Ну если вы делаете скриптово и не нужно нажимать кнопку отдыха на панели GUI, то ActionRest может и работает, ForceRest точно.
arcmag
Подскажите в чем ошибка? Хочу сделать простой такой скрипт который срабатывал бы при приближении игрока на определенное расстояние к существу чтобы тот из нейтрального состояния переходил во враждебное и крикнул бы что нибудь вроде "Тебе нельзя здесь находиться!"

Хочу повесить такой скрипт на гоблина, но не могу понять на какую ячейку вешать этот скрипт

Neverwinter Script
void main()
{
object oPC = GetLastDisturbed(); // вот с этой строчкой у меня тоже сомнения) я честно говоря не понял как называется функция для получения последнего объекта вошедшего в зону видимости ну или чего то подобного.
if(GetDistanceBetween(oPC,OBJECT_SELF)<10.0){  //проверяем расстояние между объектами
AssignCommand(OBJECT_SELF,ActionAttack(oPC)); 
AssignCommand(OBJECT_SELF,ActionSpeakString("Тебе нельзя здесь находиться!"));
}
}


И еще 1 проблема, почему то вдруг компилятор наотрез отказыватся воспринимать русский язык. Он попросту даже не печатается в нем. В английской раскладке все нормально а вот как только перехожу на русский клавиатура как будто пропадает только пробел и печатается. Пробовал взять и написать текст на русском в блокноте а потом скопировать но компилятор начал ругаться неожиданно на букву Я хотя раньше все было нормально, даже в коментариях выявляет ее как ошибку...
Melisse
Вешайте в OnHeartbeat
что-то типа такого
Neverwinter Script
void main()
{
   // Игрок (живой)
   object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF,1,
                                                              CREATURE_TYPE_IS_ALIVE, TRUE);
   // Найден?
   int bValue = GetIsObjectValid(oPC);

   // Найден и дистанция меньше 10м
  if(bValue && GetDistanceBetween(OBJECT_SELF, oPC) < 10.0f)
   {
        // НПЦ не дерется
        if(!GetIsInCombat() )
        {
             ClearAllActions();// Чистим стэк действий
             AdjustReputation(oPC, OBJECT_SELF, -100);// Репутацию к игроку скинем в враждебность (можно и не делать)
       
             SpeakString("Тебе нельзя здесь находиться!"); // Произносим фразу

             ActionAttack(oPC, FALSE); // Атакуем
         }
    }
}



Цитата
И еще 1 проблема, почему то вдруг компилятор наотрез отказыватся воспринимать русский язык. Он попросту даже не печатается в нем. В английской раскладке все нормально а вот как только перехожу на русский клавиатура как будто пропадает только пробел и печатается. Пробовал взять и написать текст на русском в блокноте а потом скопировать но компилятор начал ругаться неожиданно на букву Я хотя раньше все было нормально, даже в коментариях выявляет ее как ошибку...

Надо поставить патч Дамбо. Правда я не знаю что там с win 7 и дальше, у меня XP SP3 на стационаре и Vista на буке, т.к. они давно очень куплены.
Еще надо в тулсете в редакторе скриптов изменить шрифт на Courer вроде, чтобы буквы показывало,
а чтобы в игре отражались русские буквы нужно в папку override, в каталоге с игрой, кинуть эти шрифты/или эти шрифты
arcmag
Да дело не в том что у меня шрифт коряво отображается. Такая проблема уже была Courer шрифт поставил и все нормально стало. У меня проблема в другом, я просто не могу ничего по русским напечатать просто жму клавиши русской раскладки а компилятор их игнорирует хотя клавиатуру видит цифры и пробелы печатает, переключаюсь на англискую клаву английский текст печатает нормально.
Хотя еще недавно этой проблемы не было. Что произошло вдруг я так и не понял.
denis0k
Через ini пропиши тулсету шрифт Courier New Cyr, выбор кириллицы через настройки у меня например не работает.
arcmag
А можно пожалуйста по подробнее как это сделать? Как прописать через этот ini ?
denis0k
В nwtoolset.ini есть кусок типа:
Цитата
[Script]
FontName=Courier New
Надо дописать Cyr к шрифту.
arcmag
Дописал увы не помогло. Наверное придется сносить НВН и заново устанавливать, патчить и тд) эххх сколько гемора cray.gif

Кстати а почему когда я пытаюсь загрузить картинку изображение у меня выводится "Загруженный файл слишком большой"? 36кб это много? А сколько он должен весить тогда?
Aiwan
1 кб. biggrin.gif
denis0k
Ну есть ещё вариант кодовые таблицы в реестре винды переправить. Правда делал я это последний раз для какого-нить пятого фотошопа в доисторической винде, так что подобное решение придётся погуглить самому. Суть - таблицы cp1252 и cp1250 (для верности) сослать на файл cp1251, чтоб всегда была кириллица.
virusman
Я где-то выкладывал .reg-файл для этого.
Вот, собственно:
http://www.city-of-masters.ru/forums/index...st&p=120513
arcmag
Цитата
Я где-то выкладывал .reg-файл для этого.
Вот, собственно:
http://www.city-of-masters.ru/forums/index...st&p=120513


А что этот файл должен делать то? Я его скачал cp1252_fix запустил подтвердил комп перезагрузил. Ничего собственно не изменилось к сожалению

Цитата
Похоже, что проблема с отображением русских букв довольно часто встречается. Хотелось бы её всё-таки решить.
У кого есть такой баг, напишите:
1. Какая версия Windows
2. Какая версия NWN
3. NWN с русской локализацией или нет?
4. Тулсет английский?
5. Если сломалось после определённого момента, то опишите, после чего перестали отображаться русские буквы.
6. Где-нибудь в тулсете русский язык отображается или нет?


1) Windows XP SP 3
2) Была 1.66 пропатчил до 1.69
3) Да перевод на русский поставил
4) Тулсет тоже русский
5) После чего сам не помню) помню лишь то что в сами файлы НВН я не лазил ничего не редактировал и не удалял, в тулсете что то делал но все действия не помню в основном со скриптами копался.
6) Русский язык корректно отображается во всем тулсете но в компиляторе он почему то он именно не печатается если взять и скопировать фразу на русском и вставить в тулсет то он вполне корректно отображается. И еще на букву Я начал ругаться хотя раньше такого никогда не было .
denis0k
6) Патч dumbo.
Flaristan
Если кто-то знает тонкости работы эвента "OnPlayerUnEquipItem" - в чем может быть загвоздка в скрипте подобного типа:..
Neverwinter Script
void main()
{
object oPC = GetPCItemLastUnequippedBy();
object oItem = GetPCItemLastUnequipped();
effect eEffect;

eEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eEffect))
      {
      if ((GetEffectType(eEffect) == EFFECT_TYPE_SKILL_INCREASE) || (GetEffectType(eEffect) == EFFECT_TYPE_SKILL_DECREASE))
         {
         RemoveEffect(oPC, eEffect);
         }
      eEffect = GetNextEffect(oPC);
      }

if (oItem == ...)
   {
   eEffect = EffectSkillIncrease(SKILL_..., ...);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
   }
}
Естественно вместо точек конкретные данные/условия. Суть загвоздки в том, что не срабатывает цикл снятия эффектов; причем на эвенте "OnPlayerEquipItem" подобный скрипт срабатывает нормально.
Melisse
Вообще не знаю вроде все правильно.Вот пример из лексикона, согласно которому все нормально
Neverwinter Script
//Remove blindness from the PC
effect eLoop=GetFirstEffect(oPC);

while (GetIsEffectValid(eLoop))
   {
   if (GetEffectType(eLoop)==EFFECT_TYPE_BLINDNESS)
         RemoveEffect(oPC, eLoop);

   eLoop=GetNextEffect(oPC);
   }
}


имхо, на мой взгляд посимпатичнее было сделать так

Neverwinter Script
eEffect = GetFirstEffect(oPC);
     while (GetIsEffectValid(eEffect))
      {
         int nType = GetEffectType(eEffect);
         if (nType == EFFECT_TYPE_SKILL_INCREASE ||
             nType == EFFECT_TYPE_SKILL_DECREASE)
         {
                RemoveEffect(oPC, eEffect);
         }
      
         eEffect = GetNextEffect(oPC);
      }


Если тебе необходимо снять конкретный тип эффекта, которые у персонажа появился при надевании конкретно типа итема
То лучше делать фишку через проверку того кто эффект создал.
т.е. при налоениие эффекта ты пишешь AssignCommand(oSets, ApplyEffect(bla-bla, oPC));
естественно оSets в данном случае просто объект, который отвечает за эффекты от сетов (это из библиотеки системы сетов)
А при снятии - просто проверяешь, что эффекты созданы сетами и удаляешь их:
Neverwinter Script
object oSets = GetObjectByTag("SETS");
    effect eEff = GetFirstEffect(oPC);
    while (GetIsEffectValid(eEff))
    {
        if (GetEffectCreator(eEff) == oSets)
        {
            RemoveEffect(oPC, eEff);
        }

        eEff = GetNextEffect(oPC);
    }



а при надевании в кастомной функции уже прописываешь проверки и все такое. Система сетов есть на ваулте - если интересно поищи.
Flaristan
Сеты это все-таки немного другое – у меня эффект добавляется при использовании не уникального итема: для придания большей актуальности режиму парирования в игре, я ввел дополнительно базовое значение в +10 парирования (подобно базовым +10 брони на теле) персонажам использующим любые комбинации не дистантного оружия без использования щитов, а так же используя факел. Помимо того факел (любой) у меня сам по себе в игре дает дополнительные бонусы и пенальти.
В общем эвенты «снять/одеть» работают в НВН не совсем корректно, и при использовании такого большого числа условий - постоянно возникают разнообразные баги в т.ч. по мере попыток их решения. Во время тестов у меня создалось впечатление, что у эвента «снять» нарушена причинноследственная связь – при снятии предмета, похоже, что для скрипта расчетным состоянием персонажа является состояние до его снятия (при котором естественно, что предмет еще находится на теле, хотя скрипт срабатывает именно от того, что мы его сняли). Хотя до конца я так и не понял их принцип работы.

В общем последний более менее рабочий вариант у меня был такой:..
Neverwinter Script
//(этот скрипт идет под номером 3)
//сначала очищаем все бонусы и пенальти
eEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eEffect))
      {
      if ((GetEffectType(eEffect) == EFFECT_TYPE_SKILL_INCREASE)
         || (GetEffectType(eEffect) == EFFECT_TYPE_SKILL_DECREASE))
         {
         RemoveEffect(oPC, eEffect);
         }
      eEffect = GetNextEffect(oPC);
      }

//если у персонажа есть оружие в правой руке и оно не дистантное...
if ( (GetIsObjectValid (GetItemInSlot (INVENTORY_SLOT_RIGHTHAND, oPC) ) )
  && (!GetWeaponRanged (GetItemInSlot (INVENTORY_SLOT_RIGHTHAND, oPC) ) ) )
   {
//...и если у персонажа нету щита в левой руке - получаем бонус парирования
   if ( (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) != BASE_ITEM_SMALLSHIELD)
     && (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) != BASE_ITEM_LARGESHIELD)
     && (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) != BASE_ITEM_TOWERSHIELD) )
      {
      eEffect = EffectSkillIncrease(SKILL_PARRY, 10);
      eEffect = SupernaturalEffect(eEffect);
      ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
      }
   }
   else
   {
//в противном случае дополнительно проверяем нет ли в левой руке факела и если есть - так же даем этот бонус
   if (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) == BASE_ITEM_TORCH)
      {
      eEffect = EffectSkillIncrease(SKILL_PARRY, 10);
      eEffect = SupernaturalEffect(eEffect);
      ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
      }
   }

//если персонаж имеет факел в левой руке - он так же получает отдельные бонусы и пенальти от его ношения
if (GetBaseItemType (GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC) ) == BASE_ITEM_TORCH)
   {
   eEffect = EffectSkillIncrease(SKILL_SPOT, 10);
   eEffect = SupernaturalEffect(eEffect);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);

   eEffect = EffectSkillDecrease(SKILL_HIDE, 10);
   eEffect = SupernaturalEffect(eEffect);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);

   eEffect = EffectSkillDecrease(SKILL_ANIMAL_EMPATHY, 10);
   eEffect = SupernaturalEffect(eEffect);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
   }
…скрипт (в теории) универсально подходящий как для события «снять» так и для «одеть» (т.к. он проверяет полное состояние экипировки и назначает результирующие бонусы, зачистив все предварительно). Однако в отличие от эвента «одеть» - эвент «снять» его переваривает неудовлетворительно.

Как удалось решить обойти проблему:..
Neverwinter Script
//скрипт 1
void main()
{
object oPC = GetPCItemLastEquippedBy();

if (!GetIsPC(oPC))
return;

DelayCommand(0.5, ExecuteScript("3", oPC));
}

//скрипт 2
void main()
{
object oPC = GetPCItemLastUnequippedBy();

if (!GetIsPC(oPC))
return;

DelayCommand(0.5, ExecuteScript("3", oPC));
}
...т.к. последняя версия этих скриптов была приведена к универсальной – запихал ее отдельным скриптом и на события «снял/одел» просто назначил запуск ее как активную проверку, запускающуюся от лица персонажа стартовавшего эвент.
denis0k
Делал сеты таким же макаром - работало без нареканий.
Flaristan
Таким же макаром в смысле через проверки эффектора или через доп скрипт?
denis0k
Один скрипт на equip, второй - unequip, в каждом одна и та же проверка на надетые итемы и эффекты на персонаже. Никаких костылей.
Flaristan
Когда я только факел делал и предмет был указан по тагу – все работало отлично. Чехарда началась, когда место тагов заняли более универсальные типы итемов.
Но костыль проблему с нарушением причинно-следственной связи устраняет и на том ладно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.