Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты: Все вопросы
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights 2 Obsidian Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7
Aiwan
Обычно функция описывается. надо навести на нее курсор и в инфопанели внизу будет описание. Но честно, говоря лучше сделать простую дебаг инклюду и пользоваться. Вы собсвенно что хотите увидеть в дебаге? Дебаг НВН-а это место куда идут все сообщения во время игры. Внизу окно такое растягивается.
audun
Цитата(Aiwan @ Dec 7 2007, 22:39) *
Обычно функция описывается. надо навести на нее курсор и в инфопанели внизу будет описание.


Как ни печально, но описания этих отладочных функций(PrettyDebug,PrettyError) в инфопанели я не нашел.

Цитата
Но честно, говоря лучше сделать простую дебаг инклюду и пользоваться.


Подключать к рабочему скрипту свой отладочный? Зачем писать свой, если есть уже написанные?

Цитата
Вы собсвенно что хотите увидеть в дебаге?


Давайте попробуем по порядку:

Возьмем глобальный скрипт :
Neverwinter Script Source

// ga_influence( int nCompanion, int nChange )
/* This adjusts the influence rating of the companion to the PC ( the players as a whole technically ).
  The influence rating is based on a scale between -100( worst ) and 100( best ). ( 0 being neutral )

  Parameters:
    int nCompanion  = This is the integer value of the companion to adjust. ( See ginc_companions )
    int nChange    = This is the amount to adjust influence by.

    1    Khelgar
    2    Neeshka
    3    Elanee
    4    Qara
    5    Sand
    6    Grobnar
    7    Casavir
    8    Bishop
    9    ShandraJerro
    10    Construct
    11    Zhjaeve
    12    AmmonJerro
    13  Bevil
*/
// FAB 10/4
// ChazM 5/4/05
// BMA 5/5/05 ginc_companions id look up
// BMA-OEI 8/22/05 added companion id table
// ChazM 12/16/05 added bevil
// ChazM 4/18/06 prepped for adding influence indicator
// ChazM 4/25/06 added string ref constants
// ChazM 5/1/06 fixed "temp text" bug.
// EPF 7/10/06 - added debug strings for balance testing
// BMA-OEI 7/10/06 -- Updated to use GetInfluenceByNumber( )
       
#include "kinc_companion"

const int    STRING_REF_LOST_INFLUENCE     = 178842;
const int    STRING_REF_GAINED_INFLUENCE = 178841;

int GetCompanionNameStringRef( int nCompanion )
{
    // companions str refs are 178843 - 178855
    return ( 178842 + nCompanion );
}

void main( int nCompanion, int nChange )
{
    if ( nChange == 0 )
    {
        PrettyError( "ga_influence: companion " + IntToString( nCompanion ) + " no influence change" );
        return;
    }
   
    int nOldInfluence = GetInfluenceByNumber( nCompanion );
    IncInfluenceByNumber( nCompanion, nChange );
    int nNewInfluence = GetInfluenceByNumber( nCompanion );
   
    string sOut;
    int nDelta = nNewInfluence - nOldInfluence; //nChange; // Actual nDelta may not == nChange
    if ( nDelta > 0 )
        sOut = GetStringByStrRef( STRING_REF_GAINED_INFLUENCE );
    else
        sOut = GetStringByStrRef( STRING_REF_LOST_INFLUENCE );

    sOut += " " + GetStringByStrRef( GetCompanionNameStringRef( nCompanion )) + ": " + IntToString( nDelta );
   
    object oPC = ( GetPCSpeaker( )==OBJECT_INVALID?OBJECT_SELF:GetPCSpeaker( ) );
    SendMessageToPC( oPC, sOut );
    PrettyDebug( sOut );
    PrettyDebug( "Total influence with " + GetStringByStrRef( GetCompanionNameStringRef( nCompanion )) + " = " + IntToString( nNewInfluence ));
}


31 строка:
Цитата
// EPF 7/10/06 - added debug strings for balance testing

и далее в теле идут отладочные функции PrettyError и PrettyDebug
Раз авторы их добавлялм ,они ими пользовались.
Значит режим отладки где то должен включаться. Во встроенных функциях этих нет.
Вопросы:
могут эти функции быть только в тулсете, а не в игре?
Возможно ли их как то задействовать в самой игре?
Как вариант , могут ли они после завершения создания модуля удалены из тулсета/игры?
Существует ли в тулсете система отладки скриптов, (которая мне не известна,но может быть известна вам)?


Цитата
Дебаг НВН-а это место куда идут все сообщения во время игры.
Внизу окно такое растягивается.


Мы говорим об окне сообщений, или о чем то другом?

В режиме DebugMode 0 все сообщения в игре отправляются в окно сообщений, в частности строка :
Цитата
SendMessageToPC( oPC, sOut );

А при включенном режиме DebugMode 1 некоторые команды ,например showfps выводятся просто на экран. Значит стандартный вывод
можно менять?
А вэтих строках получается , что выводится 3 сообщения:
Цитата
SendMessageToPC( oPC, sOut ); // вывод в окно сообщений
PrettyDebug( sOut ); // повторение той же строки не понятно куда
PrettyDebug("Total influence with " + GetStringByStrRef(GetCompanionNameStringRef(nCompa
ion)) + " = " + IntToString(nNewInfluence));
// и вывод третьей строки с отладочной информацией


Вот и все же хотелось бы узнать как режим включить если это возможно,
и как сделать такой вывод отладки во время игры(с возможностью отключения конечно) как в своих скриптах,так и в оригинальных(раз уж функции там уже прописаны).
Как вариант ,как выводить просто текст на экран в любом произвольном месте,накладывая на игру, возможно ли это?
Zmeika
Здравствуйте уважаемые мастера!
Вот, скопилась целая порция вопросов.

1. Относительно точек приложения скриптов. Пока вижу, что их можно вешать на эвенты (события) из выпадающих списков в пропертях для модуля, для локации, для NPC кажется... И для каждого случая этот набор событий похоже фиксирован. Можно ли его расширить? Можно ли сделать обработку событий с клавиатуры, например? И как можно использовать событие UserDefinеdEvent?

2. Пожалуйста, посоветуйте, каким образом лучше и проще делать информационную печать в скрипте? Например, чтобы без перехода в отладочный режим можно было видеть - вызвался ли скрипт и с какими данными вызвался. Другими словами есть ли тут аналог функции printf?

3. В готовом игровом модуле nv2 - туториал (это нулевой акт) обнаружила заюзанный скрипт на onRest. Скрипт не принадлежал этому модулю, а был взят из длинного выпадающего списка готовых скриптов. Без проблем загрузила энтот чужой скрипт в редактор, изменила, скомпилила - после чего запущенный модуль вполне себе воспринял эти изменения. И догадываюсь, что если перекомпилить остальные модули, которые его используют, то с ними будет тож самое....
Вопрос - а где все эти готовые скрипты живут на уровне исходных текстов? По другим модулям разложены что ли? Или есть где-то для них общее место?

Lex
Цитата(Zmeika @ Dec 24 2007, 15:27) *
1. Относительно точек приложения скриптов. Пока вижу, что их можно вешать на эвенты (события) из выпадающих списков в пропертях для модуля, локации, для NPC кажется... И для каждого случая этот набор событий похоже фиксирован. Можно ли его расширить? Можно ли сделать обработку событий с клавиатуры, например? И как можно использовать событие UserDefinеdEvent?

можно расширить (см систему SSS AC на нашем сайте, как вариант). Другое дело что насколько оно вам необходимо?
С клавиатурой.. так как вы описали - нельзя. Но можно сделать обработку написанного в чат текста. Разбиралось много раз для НВН1, возможно годится для НВН2. Надо экспериментировать.

Цитата(Zmeika @ Dec 24 2007, 15:27) *
2. Пожалуйста, посоветуйте, каким образом лучше и проще делать информационную печать в скрипте? Например, чтобы без перехода в отладочный режим можно было видеть - вызвался ли скрипт и с какими данными вызвался. Другими словами есть ли тут аналог функции printf?

я пользуюсь SendMessageToPC - она выдает текст в игровой лог. Мне удобнее в режиме онлайн отслеживать происходящее, чем потом читать текстовой файл с логами. Хотя факт - в таком файле больше полезной инфы относительно некорректной работы скриптов.. например при проблеме с памятью или кэшэм.

Цитата(Zmeika @ Dec 24 2007, 15:27) *
. В готовом игровом модуле nv2 - туториал (это нулевой акт) обнаружила заюзанный скрипт на onRest. Скрипт не принадлежал этому модулю, а был взят из длинного выпадающего списка готовых скриптов. Без проблем загрузила энтот чужой скрипт в редактор, изменила, скомпилила - после чего запущенный модуль вполне себе воспринял эти изменения. И догадываюсь, что если перекомпилить остальные модули, которые его используют, то с ними будет тож самое....

не совсем. дело в том, что все стандартные скрипты живут в ресурсах игры. Если скрипт меняется - он перекачовывает в модуль. Соотв изменив стандартный скрипт, вы изменили его лишь для данного модуля. Все остальные модули будут работать как работали, сколько бы вы их не перекомпиливали.
Zmeika
Цитата(Lex @ Dec 24 2007, 18:06) *
можно расширить (см систему SSS AC на нашем сайте, как вариант). Другое дело что насколько оно вам необходимо?

Пока не знаю. Мне нужно засечь момент, когда солнышко заходит, причем точное время заката (в часах) известно. Такое ощущение, что только на onHeartBeat проверку по времени суток вешать. Пока не уверена, что это оправдано. sad.gif Правда, с другой стороны оч может быть, что сама игра определяет ход небес по этому же самому таймеру

Цитата(Lex @ Dec 24 2007, 18:06) *
я пользуюсь SendMessageToPC - она выдает текст в игровой лог. Мне удобнее в режиме онлайн отслеживать происходящее, чем потом читать текстовой файл с логами. Хотя факт - в таком файле больше полезной инфы относительно некорректной работы скриптов..

ага, мне тоже так удобно, уже подключила, спасип

Цитата(Lex @ Dec 24 2007, 18:06) *
дело в том, что все стандартные скрипты живут в ресурсах игры. Если скрипт меняется - он перекачовывает в модуль. Соотв изменив стандартный скрипт, вы изменили его лишь для данного модуля. Все остальные модули будут работать как работали, сколько бы вы их не перекомпиливали.

Странно, у меня не перекочевывается. Остается на прежнем месте в исправленном состоянии, и все другие модули начинают видеть исправленную версию. Правда, перкомпиляцию не пробовала...
azathoth
так и хочется сказать "не знаю как там у вас в нвн2, а в нвн1 было так..." smile.gif

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

в общем сначала игруха ищет нужный ресурс в папке override (удобно для патчей-хотфиксов-дебагов)
потом в кампейне
потом в модуле (хотя логичнее было бы сначала в модуле, а потом в кампейне)
потом в ресурсах игры.
Kirald
Блин хочу написать скрипт для простейшего квеста и не могу sad.gif scratch_one-s_head.gif ктонибудь помогите. хочу поставить локальную переменную ИНТ под названием "deathwolf"
Код
void main()
  {
  SetLocalInt(OBJECT_SELF, "deathWolf", 0);
  }


уверен что делаю что то не так после постановки в нужный слот (Респаун) НПС ставлю скрипт волку

Код
void main()
  {
  SetLocalInt(OBJECT_SELF, "deathWolf", 2);
  }


создаю диалог
Код
Переменная не работает----------------------\
                                             убей волка (deathwolf = 0)-----------------\
                                                                                         молодец (deathwolf = 2)

Плиз ПОМАГИТЕ help.gif help.gif help.gif А то я уже с ума схожу crazy.gif prankster2.gif
Lex
проблема у тебя в том, что ты ставишь 2 локалки, а не 1, как ты думаешь.
Ибо deathWolf у НПС и deathWolf у волка - 2 совершенно разные локалки. Мысль ясна? Чтобы это была одна локалка, тебе в скрипте волка (кстати почему в Респаун ты поставил скрипт? А не в Death?) написать не
Neverwinter Script Source
SetLocalInt( OBJECT_SELF, "deathWolf", 2 );

а
Neverwinter Script Source
SetLocalInt( GetObjectByTag( "Тэг НПС, который выдает квест" ), "deathWolf", 2 );

Я тебе в соседней теме не зря советовал использовать SetGlobal*/GetGlobal. Самое незамороченное решение, подходящее для начала smile.gif
Edwin
QUOTE
я пользуюсь SendMessageToPC - она выдает текст в игровой лог. Мне удобнее в режиме онлайн отслеживать происходящее, чем потом читать текстовой файл с логами. Хотя факт - в таком файле больше полезной инфы относительно некорректной работы скриптов.. например при проблеме с памятью или кэшэм.


Небольшой оффтоп, про какой именно кэш идет речь?
Kirald
Arigato Спасибо Mersi Thenx кое что понял щас попробую rolleyes.gif
Lex
Цитата(Edwin @ Jan 3 2008, 08:45) *
про какой именно кэш идет речь?

спроси у шардовиков, я от них это слышал, сам этим логом не пользуюсь smile.gif
virusman
Я тоже не понял, что за кэш и память и как они выводятся в лог.
Lex
ну раз даже вирь не знает, значит я перепутал НВН с другим приложением smile.gif сам я натыкался только на переполнение стека, деление на 0 и какие-то ошибки с памятью (слово memory было smile.gif )
Edwin
Ну если про память еще можно понять (сегментейшен фолт, хоть ни в каких логах ее ессесно не будет), то про кеш меня ввело в ступор, т.к. кеш абсолютно прозрачен для людей и управляется только хардвэйром. Даже через ассамблер в него не влезть.
virusman
Цитата(Edwin @ Jan 3 2008, 13:42) *
Ну если про память еще можно понять (сегментейшен фолт, хоть в логах ее не будет), то про кеш меня ввело в ступор, т.к. кеш абсолютно прозрачен для людей и управляется только хардвэйром. Даже через ассамблер в него не влезть.
Кэшей много разных, и в НВНе есть кэш (2da, скриптов и ресурсов), но в лог инфа о нём не выводится (даже через DummyLog).
Ошибки стека в скриптах, TMI, деление на ноль - да, бывает, но это тоже в лог не идёт, насколько я помню.
Lex
Цитата(virusman @ Jan 3 2008, 13:58) *
Ошибки стека в скриптах, TMI, деление на ноль - да, бывает, но это тоже в лог не идёт, насколько я помню.

в НВН1 вроде идет и в лог файл и в лог в игре. А иначе очень странный лог получается, никакой инфы по ошибкам? smile.gif А вот в НВН2 мб и не идет, я лог-файлом тут и подавно не пользуюсь.

зы: что-то мы с оффтопом перебрали, пора завязывать ph34r.gif
Edwin
А в обычном компиляторе у тебя много информации об ошибках во время экзекуции? stderr, try-catch и руки - все что надо для отладки. Ффс.....
dumbo
Цитата(Edwin @ Jan 3 2008, 13:42) *
кеш абсолютно прозрачен для людей и управляется только хардвэйром. Даже через ассамблер в него не влезть.
prefetch/prefetchw/prefetchnta/prefetcht0(1,2) whistle3.gif
Edwin
Ок, про асм я загнул. Можно. Но ненужно, т.к. этим вероятнее всего пользуются только в написании мега симуляторов и софта для посадки шаттлов.
Lex
Цитата(Edwin @ Jan 3 2008, 17:51) *
софта для посадки шаттлов.

тады уж Бурана, ибо только он садился на автопилоте, Шаттлы - вручную.

завязываем асм, компиляторы и дебагеры. тема не про это. Если хочется всетаки об этом - выделю вам отдельный топик smile.gif А то что выше почищу завтра, чтобы не пугать скриптеров smile.gif
azathoth
Есть очень удобная такая вещь: SetGlobalXXX, но только вот когда переменных становится много, то некоторые почему-то тупо игнорируются sad.gif другие можно продолжать добавлять unknw.gif зависимости он имён переменных или их количества установить не удалось, то после 200 начинает корявить, то 5000 спокойно держит. так что предупреждаю и спрашиваю: кто нибудь сталкивался и как с этим бороться?

зы: а чего тема не прикреплена?
Lex
у меня пока наверное около 100 глобалок - никаких глюков ниразу не видел.

Цитата(azathoth @ Jan 14 2008, 01:10) *
зы: а чего тема не прикреплена?

тады тут пол раздела будет прикреплено smile.gif
Ragdaj
Интересует возможность создания весьма специфического скрипта... Дело в том, что на мой взгляд в НВН2 сильно не хватает возможности взаимодействия объктов между собой (из инвентаря с окружающей средой). Диалоговый вариант не устраивает, так как с ним не построишь нормальных головоломок - если тебе уже очевидный путь предоставляют в качестве варианта.

И так - можно ли сделать следующее:

при перетаскивании вещи из инвентаря на какой нибудь объект происходило "событие" - открывался диалог, или ещё что - это уже детали.

На вскидку - перетаскиваем факел из инвентаря на стог сена - стог сена заменяется костром (первое пришедшее в голову)
Lex
Цитата(Ragdaj @ Jan 20 2008, 22:44) *
На вскидку - перетаскиваем факел из инвентаря на стог сена - стог сена заменяется костром (первое пришедшее в голову)

лучше тыкнуть в стог сена, если есть факел в руке - зажечь. Если нужен выбор - предоставлять выбор. или диалогом или гуи окном.

с предметами и объектами "взаимодействие" возможно в принципе, но это лишний не очень нужный гемор. Самый простой вариант - положить в инвентарь. Скажем положить в стог сена факел - загорится.
Ragdaj
со стогом сена - это лишь пример, чтоб описать, что нужно... существуют куча вариантов использования - верёвок, воды, денег ну и т.д. и т.п. - так что интересует именно такой вариант... но если в принципе возможно - то буду искать.

"Если нужен выбор - предоставлять выбор. или диалогом или гуи окном." в том то и проблема - что предоставляешь выбор, а не делаешь возможность сделать это игроку. Чтоб он сказал " о, я сам догадался!"

Добавлено через 6 минут

хотя - идея сделать объекты помещаемыми в руку и проверку на то ли есть в руки при взаимодействие - самый простой вариант...

спасибо.
azathoth
можно добавить предмету "особое свойство" по типу Unique Power или его самого, тогда им можно будет действовать на всё подряд, а уже скриптами проверять и отпускать ядовитые комментарии, когда игрок будет действовать на стог сена неположеными солью и перцем.

однако, игроки не оценят. <_<

--

У SetGlobalXXX тип возвращаемого значения - int (в смысле булеан), что должно наводить на определённые мысли...
Jadent
Возможно ли как-то эмулировать событие OnClick для существ?

Или чтобы OnConversation запускался сразу издалека (не заставляя игрока подбегать вплотную к НПЦ).
gennady
Цитата(Jadent @ Mar 24 2008, 17:54) *
Возможно ли как-то эмулировать событие OnClick для существ?

Для этого есть по крайней мере 3 варианта:
1. Скрипт OnEnter триггера
2. Скрипт OnHeartbeat НПС или плейса
3. Скрипт OnPerception НПС
Lex
Цитата(gennady @ Mar 25 2008, 11:41) *
Для этого есть по крайней мере 3 варианта:
1. Скрипт OnEnter триггера
2. Скрипт OnHeartbeat НПС или плейса
3. Скрипт OnPerception НПС

ни одно из этих не подходит под вариант onClick.
Цитата(Jadent @ Mar 24 2008, 17:54) *
Или чтобы OnConversation запускался сразу издалека (не заставляя игрока подбегать вплотную к НПЦ).

вот в эту сторону можно попробовать подумать, но думаю дистанция разговора зашита в движок.
Griffon
Цитата(Lex @ Mar 25 2008, 12:39) *
Цитата(Jadent @ Mar 24 2008, 17:54)
Или чтобы OnConversation запускался сразу издалека (не заставляя игрока подбегать вплотную к НПЦ).

вот в эту сторону можно попробовать подумать, но думаю дистанция разговора зашита в движок.


а разве возможность перебрасывать РС в место диалога с НПС отменили?
Jadent
Цитата(Griffon @ Mar 31 2008, 13:00) *
а разве возможность перебрасывать РС в место диалога с НПС отменили?
Диалоги меня в данном случае вообще не интересуют, вопрос был о скриптах.
Keeper
Нужна функция, возвращающая школу, на которой специализируется Маг (General, e.t.c.).

Еще вопрос:
Как расширить возможности функции EffectPolymorph()? Для ее функционирования нужно знать ID крича в которого происходит превращение. Оные указаны константами типа POLYMORPH_TYPE_*. Их довольно мало. К примеру, я хочу превратить Духа волка в Тень. Как это сделать?
azathoth
Цитата
Как расширить возможности функции EffectPolymorph()? Для ее функционирования нужно знать ID крича в которого происходит превращение. Оные указаны константами типа POLYMORPH_TYPE_*. Их довольно мало. К примеру, я хочу превратить Духа волка в Тень. Как это сделать?

добавить желаемые в .2da таблицы. или использовать функцию SetCreatureAppearanceType.
Keeper
Цитата(azathoth @ Apr 23 2008, 20:06) *
добавить желаемые в .2da таблицы. или использовать функцию SetCreatureAppearanceType.

Огромное спасибо! Пойду творить далее. А что по первому пункту?

Закончил писать скрипт для посоха обращения в нежить. Все бы было хорошо, если бы не... если бы не проскакивало за секунду без каких-либо визуальных спецэффектов.
Собственно, вопросы:
1. Почему нет эффектов?
2. Как сделать паузу в выполнении скрипта?
3. Как передать получившееся существо игроку на всегда/на время/не дать создать армию?
Вот скрипт, сыренький, так что не пинайте. Вешается на онитемактивэйт модуля:
Neverwinter Script
object oPC = GetItemActivator();
  object oItem = GetItemActivated();
  object oTarget = GetItemActivatedTarget();
  location lTargetLocation = GetItemActivatedTargetLocation();
  string sPCName = GetName(oPC);
  string sTargetName = GetName(oTarget);
 
  void ItemActivatedPaleStaff();
    string PALE_STAFF_TAG = "EK_STAFF_001";
    int PALE_STAFF_HIT_VS_REFLEX = d20() + 2 * GetAbilityModifier(ABILITY_DEXTERITY, oPC);
    int PALE_STAFF_HIT_VS_FORTITUDE = d20() + 2 * GetAbilityModifier(ABILITY_INTELLIGENCE, oPC);
    int PALE_STAFF_HIT_VS_WILL = d20() + 2 * GetAbilityModifier(ABILITY_WISDOM, oPC);
    float PALE_STAFF_CAST_TIME = 60.0;
    effect PALE_STAFF_POLYMORPH_VISUAL = EffectVisualEffect(VFX_IMP_POLYMORPH);
    effect PALE_STAFF_POLYMORPH_TYPE_1 = EffectPolymorph(POLYMORPH_TYPE_ZOMBIE, TRUE);
 
void main()
{
  if (oItem == GetObjectByTag(PALE_STAFF_TAG))
  {
    ItemActivatedPaleStaff();
  }
}

void ItemActivatedPaleStaff()
{
  if (GetIsObjectValid(oTarget) == FALSE)
  {
    SendMessageToPC(oPC, "<color=red>Некорректная цель для обращения в нежить!</color>");
    return;
  }
  if (GetLocalInt(oTarget, "Undeadable") < 1 || GetPolymorphLocked(oTarget) == TRUE)
  {
    SendMessageToPC(oPC, "<color=red>Выбранная цель не может быть обращена в нежить!</color>");
    return;
  }
  if (GetIsDead(oTarget) == TRUE)
  {
    SendMessageToPC(oPC, "<color=red>Цель мертва, прежде чем обратить в нежить, ее нужно оживить!</color>");
    return;
  }
 

  if (GetReflexSavingThrow(oTarget) > PALE_STAFF_HIT_VS_REFLEX)
  {
    SendMessageToPC(oPC, "<color=blue>"+sPCName+" бросок "+IntToString(PALE_STAFF_HIT_VS_REFLEX)+" против класса сложности "+IntToString(GetReflexSavingThrow(oTarget))+" "+IntToString(GetReflexSavingThrow(oTarget))+" > "+IntToString(PALE_STAFF_HIT_VS_REFLEX)+" *провал*</color>");
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectBeam(VFX_BEAM_BLACK, oPC, BODY_NODE_CHEST, TRUE), oTarget);
    return;
  }
  SendMessageToPC(oPC, "<color=blue>"+sPCName+" бросок "+IntToString(PALE_STAFF_HIT_VS_REFLEX)+" против класса сложности "+IntToString(GetReflexSavingThrow(oTarget))+" "+IntToString(GetReflexSavingThrow(oTarget))+" <= "+IntToString(PALE_STAFF_HIT_VS_REFLEX)+" *успех*</color>");
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_BLACK, oPC, BODY_NODE_CHEST), oTarget, PALE_STAFF_CAST_TIME);
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oPC, PALE_STAFF_CAST_TIME);
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oTarget, PALE_STAFF_CAST_TIME);
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSpellImmunity(), oTarget, PALE_STAFF_CAST_TIME);
  ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageImmunityIncrease(DAMAGE_TYPE_ALL, 100), oTarget, PALE_STAFF_CAST_TIME);
 
  DelayCommand(PALE_STAFF_CAST_TIME/3, ActionWait(0.0));
 
  if (GetFortitudeSavingThrow(oTarget) > PALE_STAFF_HIT_VS_FORTITUDE)
  {
    SendMessageToPC(oPC, "<color=blue>"+sPCName+" бросок "+IntToString(PALE_STAFF_HIT_VS_FORTITUDE)+" против класса сложности "+IntToString(GetFortitudeSavingThrow(oTarget))+" "+IntToString(GetFortitudeSavingThrow(oTarget))+" > "+IntToString(PALE_STAFF_HIT_VS_FORTITUDE)+" *провал*</color>");
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_DUR_CONE_EVIL), oTarget);
    RemoveEffect(oTarget, EffectBeam(VFX_BEAM_BLACK, oPC, BODY_NODE_CHEST));
    RemoveEffect(oPC, EffectCutsceneParalyze());
    RemoveEffect(oTarget, EffectCutsceneParalyze());
    RemoveEffect(oTarget, EffectSpellImmunity());
    RemoveEffect(oTarget,EffectDamageImmunityIncrease(
DAMAGE_TYPE_ALL, 100));
    return;
  }
  SendMessageToPC(oPC, "<color=blue>"+sPCName+" бросок "+IntToString(PALE_STAFF_HIT_VS_FORTITUDE)+" против класса сложности "+IntToString(GetFortitudeSavingThrow(oTarget))+" "+IntToString(GetFortitudeSavingThrow(oTarget))+" <= "+IntToString(PALE_STAFF_HIT_VS_FORTITUDE)+" *успех*</color>");
  if (GetLocalInt(oTarget, "Undeadable") == 1)
  {
    ApplyEffectToObject(DURATION_TYPE_INSTANT, PALE_STAFF_POLYMORPH_VISUAL, oTarget);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, PALE_STAFF_POLYMORPH_TYPE_1, oTarget);
  }
 
  DelayCommand(PALE_STAFF_CAST_TIME/3, ActionWait(0.0));
 
  if (GetWillSavingThrow(oTarget) > PALE_STAFF_HIT_VS_WILL)
  {
    SendMessageToPC(oPC, "<color=blue>"+sPCName+" бросок "+IntToString(PALE_STAFF_HIT_VS_WILL)+" против класса сложности "+IntToString(GetWillSavingThrow(oTarget))+" "+IntToString(GetWillSavingThrow(oTarget))+" > "+IntToString(PALE_STAFF_HIT_VS_WILL)+" *провал*</color>");
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_DUR_CONE_EVIL), oTarget);
    RemoveEffect(oTarget, EffectBeam(VFX_BEAM_BLACK, oPC, BODY_NODE_CHEST));
    RemoveEffect(oPC, EffectCutsceneParalyze());
    RemoveEffect(oTarget, EffectCutsceneParalyze());
    RemoveEffect(oTarget, EffectSpellImmunity());
    RemoveEffect(oTarget,EffectDamageImmunityIncrease(
DAMAGE_TYPE_ALL, 100));
    return;
  }
  SendMessageToPC(oPC, "<color=blue>"+sPCName+" бросок "+IntToString(PALE_STAFF_HIT_VS_WILL)+" против класса сложности "+IntToString(GetWillSavingThrow(oTarget))+" "+IntToString(GetWillSavingThrow(oTarget))+" <= "+IntToString(PALE_STAFF_HIT_VS_WILL)+" *успех*</color>");
  ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_BEAM_MIND), oTarget);
  ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneDominated(), oTarget);
}
azathoth
Функции возвращающей школу не знаю.

объявление переменных вне функции (тем более вперемешку с декларацией функции) - это ахтунг. ИМХО.

Единственное что могу сказать - функция задержки DelayCommand(...), у тебя Delaится Action, а экшн привязан к объекту OBJECT_SELF по умолчанию, не факт, что в отдельной функции он будет тот, что ты хочешь. А самое главное - экшын экшыном, но строчки вне него будут всё равно будут выполнены все сразу в любом случае - то есть сначала сработает скрипт, а затем будут выполняться действия (в т.ч. со своими "кусочками скрипта"). Так что определись, задержку между "чем" и "чем" ты хочешь - и второе заDelay.
Keeper
Спасибо!
Хочу, что бы все выполнялось в том порядке, в каком идет в теле скрипта. Значит, надо весь скрипт расписать по секундам в DelayCommand?

Насчет ахтунга - там, если ты не заметил, везде ахтунг - добьюсь работоспособности и оформлю по человечески, заодно оптимизирую.
Lorendroll
Хочу наложить на игрока визуальный эффект такого же типа как накладываются во вкладке "Аppearance (visual effect)" в свойствах существа, а там указаны такие названия как fx_will_o_wisp и подобные, которые не обозначены в глобальных переменных. Возможно ли это? Задача в том чтобы превратить игрока в виспа, при том что SetAppearanceType с APPEARANCE_TYPE_WILL_O_WISP не работает - нет в НВН2 соотвтетсвующей модели, она перекочевала в визуальные эффекты... То есть выход один - превратить игрока в невидимку и наложить на него эффект виспа, который есть только как FX_*, а не VFX_* эффект...
nitx
как сделать реакцию на фразу в чат канала (от плеера)? Только скрипт повесить не в пределах восприятия 1нпц, а на всю локу.
virusman
В 1.69 будет соответствующее событие.
А пока - либо воисами (см. DMFI), либо NWNX Chat (если шард).
nitx
я про нвн2. А нельзя увеличить область восприятия нпс (именно события OnConversation), и поставить его например за пределы локи? Ну или сделать его невидимым для плеера, пробовал ставить апиренс - none и script hidden, так в игре вобще как будето его нету, скрипты так тож неработают.
virusman
Посмотри DMFI, там должны быть невидимые воисы.
Zmeika
Можно ли на ходу поменять свойство для уже существующего предмета?
Нужно у готового предмета установить (временно!) свойство из серии Activate, чтобы у предмета появлялась иконка "активировать" и срабатывал нужный скрипт по тэгу. В исходном предмете такого свойства нет. Мне нужно, чтобы оно появилось, и начал срабатывать скрипт.

Временное изменение иконки у предмета - тоже интересует.
Вышла из ситуации временно создавая новый предмет по другому шаблону и незаметно подменяя им старый. Но неудобно это. aggressive.gif

Lex
свойство можно.
иконку низя.
Zmeika
а какой функцией можно свойство поменять или установить? Хотя бы примерно, как называется?
Lex
AddItemProperty
соотв есть или Remove или Delete или какой-нить другой Destroy этой самой ItemProperty.
Zmeika
AddItemProperty - работает, спасибо!
Правда, почему-то не работает SetDescription для того же самого предмета. Т.е. свойство - появляется, а описание остается прежним.

Вопрос - можно ли подменять скрипты так же, как диалоги или 2da таблицы, помещая новые компиляции в override? У меня пока не вышло - если есть два скрипта с одинаковым названием, и при этом один находится в моде, другой в override, то в игре берется версия из мода. А хочется, чтобы наоборот.
virusman
Цитата(Zmeika @ Jun 5 2008, 17:05) *
AddItemProperty - работает, спасибо!
Правда, почему-то не работает SetDescription для того же самого предмета. Т.е. свойство - появляется, а описание остается прежним.
1.69?
Zmeika
версия 1.12
свойство и описание устанавливается в скрипте на взятие предмета (_aq)
Lex
Цитата(Zmeika @ Jun 5 2008, 16:05) *
Вопрос - можно ли подменять скрипты так же, как диалоги или 2da таблицы, помещая новые компиляции в override? У меня пока не вышло - если есть два скрипта с одинаковым названием, и при этом один находится в моде, другой в override, то в игре берется версия из мода. А хочется, чтобы наоборот.

можно. Класть в оверрайд нужно скомпилированный скрипт, те nsc. А не nss.
Zmeika
Цитата(Lex @ Jun 5 2008, 16:42) *
Класть в оверрайд нужно скомпилированный скрипт, те nsc. А не nss.

Э, так само собой. smile.gif У меня там новые и nss и ncs, но все же срабатывал ncs старый (из мода). Правда, проверяла я запуская мод прямо из тулсета, может это сыграло какую роль... Но по-любому отлично, что в принципе - можно. Тогда, вероятно это у меня где-то косяк.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.