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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 133 134 135 136 137 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Laajin
сообщение Oct 26 2010, 15:35
Сообщение #3351


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



while состоит:

1. Условие, определяющее, будет ли выполняться тело цикла. Это условие записывается после слова while и может быть произвольным арифметическим выражением, в котором должен быть хотя бы один из операторов ==, !=, <, >, <=, >= .
2. Тело цикла, состоящее из одной или нескольких инструкций. (в примере выше опущено =))
3. Инструкции, изменяющие значения переменных, входящих в проверяемое условие. Если бы этой инструкции не было, то значение переменной не менялось бы и проверяемое условие всегда было бы истинным, что привело бы к бесконечному циклу. (если оно, конечно, изначально цикл запустился хотя бы раз)

Сообщение отредактировал Laajin - Oct 26 2010, 15:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
greye
сообщение Oct 26 2010, 16:22
Сообщение #3352


Level 7
**

Класс: Некромант
Характер: True Neutral
Раса: Нежить



Цитата(Laajin @ Oct 26 2010, 16:19) *
сколько занимался нвн то
Neverwinter Script
int nNum;
while(nNum < 10)
{
nNum++;
}

всегда работало

Так ты здесь и не проверяешь возвращаемое значение операции. Как я сказал, значение переменной изменится, но в выражении будет использоваться старое значение. Проверь:
Neverwinter Script
int nNum = 0;
    if (nNum++ == 0) {
        SendMessageToPC(GetFirstPC(), "Greye is right.");
    } else {
        SendMessageToPC(GetFirstPC(), "Greye is wrong.");
    }

    if (++nNum == 1) {
        SendMessageToPC(GetFirstPC(), "Greye is wrong.");
    } else {
        SendMessageToPC(GetFirstPC(), "Greye is right again.");
    }


Сообщение отредактировал greye - Oct 26 2010, 16:24
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Oct 26 2010, 16:28
Сообщение #3353


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



Цитата
bern
Скажите, как можно добавить +1 или другое число к переменной, учитывая ее текущее значение, а не устанавливая конкретное значение? И можно ли через скрипт добавить запись в дневник?

все же мне думается я верно ответил

greye
если ты имеешь ввиду обновление переменной сразу - то да. Тогда я просто не понял в чем я не прав, но для bern разницы я думаю не много - суть одна - число увеличится.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
greye
сообщение Oct 26 2010, 16:29
Сообщение #3354


Level 7
**

Класс: Некромант
Характер: True Neutral
Раса: Нежить



Переменная в скрипте - да, увеличится, а вот значение локальной переменной на объекте - нет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Oct 26 2010, 16:32
Сообщение #3355


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



о_О
ну....ладно, нет так нет, у меня короче

Сообщение отредактировал Laajin - Oct 26 2010, 16:32
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Oct 26 2010, 17:06
Сообщение #3356


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

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



Цитата(Talarasha @ Oct 26 2010, 13:07) *
TAG - тэг журнальной ветки, # - номер записи, oPC - игрок, на которого вешать, можно например GetPCSpeaker() - если в диалоге. Проверка номера ветки делается через локальную переменную:
Neverwinter Script
GetLocalInt(oPC, "NW_JOURNAL_ENTRYTAG")

Нужно только помнить, что имя переменной формируется методом NW_JOURNAL_ENTRY+TAG, т.е. первая часть так и остается, а вместо TAG пишем тэг журнальной ветки.

связывать журнальную запись и имя переменной именно таким методом не обязательно, к слову. Можно выбрать конструкцию попроще.

Цитата(Laajin @ Oct 26 2010, 15:19) *
сколько занимался нвн то

Neverwinter Script
int nNum;

while(nNum < 10)
{



nNum++;
}


всегда работало

По поводу присовения локальной переменной и вообще про nNum++ greye прав. А в приведенном тобой примере немного другая ситуация. И она не входит в противоречие с действительностью.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Oct 26 2010, 17:53
Сообщение #3357


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



Neverwinter Script
int nNum = GetLocalInt(.... , ".....");

SetLocalInt(.... , ".....", nNum++);


nNum++ это тоже самое что nNum+1
следовательно не вижу особой разницы для bern
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
bern
сообщение Oct 26 2010, 18:35
Сообщение #3358


Level 2
*

Класс: Ученик Дракона
Характер: Chaotic Neutral
Раса: Человек



Всем спасибо! Буду пробовать разные варианты если что. Laajin, спасибо за полезные ссылки, нужно будет покопаться. Также посмотреть скрипты из готовых модов - отличная идея.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Talarasha
сообщение Oct 26 2010, 19:55
Сообщение #3359


Level 6
**

Класс: Маг
Характер: Lawful Evil
Раса: Нежить



Цитата
связывать журнальную запись и имя переменной именно таким методом не обязательно, к слову. Можно выбрать конструкцию попроще.

Запрашиваю подробную инфу. Пошарил по форуму, видел лишь реализацию связкой "добавить запись"+"установить переменную о том, что добавили записи", затем "проверить переменную с записи". Это то, что имелось ввиду или в дебрях NSS от меня прячутся реально клевые ништяки?

Сообщение отредактировал Talarasha - Oct 26 2010, 20:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Oct 26 2010, 20:34
Сообщение #3360


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Цитата
nNum++ это тоже самое что nNum+1
Ты не прав, есть разница в возвращаемом значении. Результаты выполнения SetLocalInt(.... , ".....", nNum++) и SetLocalInt(.... , ".....", nNum + 1) будут существенно различны.
Вообще, не имея опыта в программировании, лучше этими не пользоваться значениями, возвращаемыми операторами присваивания и инкрементирования/декрементирования, - это приводит к долгим и муторным поискам ошибок с точностью до единицы.

Сообщение отредактировал Ilerien - Oct 26 2010, 21:31
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Oct 26 2010, 20:52
Сообщение #3361


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



мне уже даже интересно - в чем различие будет в данном примере? - тогда уж объясни
я прекрасно понимаю что вообще nNum++ nNum+1 отличаются, но в данном примере разве не произойдет увеличение на 1, при установки локалки?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
greye
сообщение Oct 26 2010, 21:26
Сообщение #3362


Level 7
**

Класс: Некромант
Характер: True Neutral
Раса: Нежить



Цитата(Laajin @ Oct 26 2010, 21:52) *
я прекрасно понимаю что вообще nNum++ nNum+1 отличаются, но в данном примере разве не произойдет увеличение на 1, при установки локалки?

Не произойдёт. SetLocalInt поставит то значение, которое указано третьим параметром. nNum + 1 честно посчитается и локалка выставится в nNum + 1, а значение самого nNum не изменится.nNum++ вернёт nNum, поэтому локалка станет nNum, а сам nNum увеличится на единицу.

Так как мне всё равно нечего делать: представим, что наша переменная nNum это ящик. У ящика есть некоторый вес, который можно регистрировать весами (в качестве весов возьмём значение локальной переменной после SetLocalInt). nNum + 1 это как положить на весы этот ящик и _рядом_ ещё один брусок. ++nNumber это как сначала положить брусок _внутрь_ ящик, а потом взвесить. nNum++ это сначала взвесить ящик без бруска, а потом положить брусок внутрь.

Сообщение отредактировал greye - Oct 26 2010, 21:36
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Oct 26 2010, 22:03
Сообщение #3363


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



Все верно. Поставил нвн и проверил сам.

Neverwinter Script
int nNum = GetLocalInt(.... , ".....");

SetLocalInt(.... , ".....", nNum++);

в этом случае действительно не произойдет увеличение, а вот
в это случае
Neverwinter Script
int nNum = GetLocalInt(.... , ".....");
nNum++;
SetLocalInt(.... , ".....", nNum);

уже произойдет.

Спасибо, такой нюанс, а сцукО.

Сообщение отредактировал Laajin - Oct 26 2010, 22:04
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Oct 26 2010, 22:18
Сообщение #3364


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

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



1. Всё же неплохо сначала проверять, а потом советовать (IMG:style_emoticons/kolobok_light/smile.gif)
2. Ну вы ещё часов 12 поспорьте, чему равно ++nNum++, строя разные теории и аналогии, но не утруждая себя запустить на 3 минуты тулсет (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Oct 26 2010, 23:04
Сообщение #3365


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

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Оператор n++ заменяет выражение n=n+1, но вот от его положения зависит то, будет ли это выполняться до выражения, где он фигурирует или нет.
Neverwinter Script
x = ++n;
эквивалентно
Neverwinter Script
n = n+1;
x = n;
,

Neverwinter Script
x = n++;
Эквивалентно
Neverwinter Script
x = n;
n = n+1;

Для самого n результат одинаковый, для выражения, в котором оно участвует - нет.
Как обычно, напомню, что всё это, и многое другое, описано в Лексиконе. Чем догадываться, лучше один раз прочитать.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lukas Addon
сообщение Oct 26 2010, 23:49
Сообщение #3366


Level 2
*

Класс: Волшебник
Характер: True Neutral
Раса: Эльф



Нужно наложить EffectDazed() на монаха 20+ уровня .... но вылетает что у него иммунитет. как побороть?
это для системы смерти, после превращения в светлячка, чтобы персонаж не мог никого атаковать иначе спадет полиморф.


Прошу помогите.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
PaiNt
сообщение Oct 27 2010, 04:10
Сообщение #3367


Level 8
***

Класс: Псионик
Характер: Chaotic Neutral
Раса: Хафлинг



Цитата(Lukas Addon @ Oct 27 2010, 06:49) *
Нужно наложить EffectDazed() на монаха 20+ уровня .... но вылетает что у него иммунитет. как побороть?
это для системы смерти, после превращения в светлячка, чтобы персонаж не мог никого атаковать иначе спадет полиморф.


Прошу помогите.

Забей на даз. В НВНХ можно отловить события выбора атаки и каста.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lukas Addon
сообщение Oct 27 2010, 07:16
Сообщение #3368


Level 2
*

Класс: Волшебник
Характер: True Neutral
Раса: Эльф



спасибо. А можно пример отлова события атаки?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Oct 27 2010, 07:35
Сообщение #3369


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Цитата
Забей на даз. В НВНХ можно отловить события выбора атаки и каста.
Ты бы сначала спросил, может, для сингла нужно, а ты NWNX предлагаешь (IMG:style_emoticons/kolobok_light/smile.gif)
Цитата
спасибо. А можно пример отлова события атаки?
Ридми для плагина. Но это работает только в мультиплеере. Строго говоря, для сингла есть расширение, но я не ковырял его функционал.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Oct 27 2010, 09:15
Сообщение #3370


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

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



Цитата(Talarasha @ Oct 26 2010, 20:55) *
Запрашиваю подробную инфу. Пошарил по форуму, видел лишь реализацию связкой "добавить запись"+"установить переменную о том, что добавили записи", затем "проверить переменную с записи". Это то, что имелось ввиду или в дебрях NSS от меня прячутся реально клевые ништяки?

я просто имел ввиду что переменная не обязательно должна быть вида NW_JOURNAL_[ENTRYTAG]. Имя переменной с журналом связывается скриптером, а не системой. Соотв. он волен выбирать то, как она (переменная) будет называться. Использовать в имени переменной журнальный идентификатор - это удобно. А вот "NW_JOURNAL" можно и сократить немного. Речь только об этом.

скажем у нас была такая система:
Q_<quest_name>_<id> - переменная
<quest_name> - журнальная запись
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lukas Addon
сообщение Oct 27 2010, 09:19
Сообщение #3371


Level 2
*

Класс: Волшебник
Характер: True Neutral
Раса: Эльф



как раз нужно для мультиплеера. спасибо за подсказки буду разбираться.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Talarasha
сообщение Oct 27 2010, 10:49
Сообщение #3372


Level 6
**

Класс: Маг
Характер: Lawful Evil
Раса: Нежить



Цитата(Lex @ Oct 27 2010, 09:15) *
я просто имел ввиду что переменная не обязательно должна быть вида NW_JOURNAL_[ENTRYTAG]. Имя переменной с журналом связывается скриптером, а не системой. Соотв. он волен выбирать то, как она (переменная) будет называться. Использовать в имени переменной журнальный идентификатор - это удобно. А вот "NW_JOURNAL" можно и сократить немного. Речь только об этом.

скажем у нас была такая система:
Q_<quest_name>_<id> - переменная
<quest_name> - журнальная запись

(IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Тащем-то, имя переменной связывается с журналом как раз системой. Выполнив команду AddJournalQuestEntry("CHAPTER1", 10, oPC, TRUE, TRUE);, на персонажа системой повесится целочисленная переменная NW_JOURNAL_ENTRYCHAPTER1 со значением 10. Соответственно и обратится к ней можно только таким образом. Шаблон насколько мне известно вшитый, поэтому я не представляю, как можно обратиться по, например, Q_<quest_name>_<id>. Откуда игра знать-то будет, что это - переменная журнала? Ниоткуда. Поэтому я предполагаю, что у вас таки использовалась ненужная дополнительная переменная. Для проверки, попробуй два таких скрипта на рычаге:
Neverwinter Script
void main()
{
    object oPC = GetLastUsedBy();
    AddJournalQuestEntry("CHAPTER1", 10, oPC, TRUE, TRUE);
    if(GetLocalInt(oPC, "NW_JOURNAL_ENTRYCHAPTER1") == 10)
  {
         AddJournalQuestEntry("CHAPTER1", 20, oPC, TRUE, TRUE);
  }
}


Neverwinter Script
void main()
{
    object oPC = GetLastUsedBy();
    AddJournalQuestEntry("CHAPTER1", 10, oPC, TRUE, TRUE);
    if(GetLocalInt(oPC, "ENTRYCHAPTER1") == 10)
    {
         AddJournalQuestEntry("CHAPTER1", 20, oPC, TRUE, TRUE);
    }
}

(журнал CHAPTER1, записи 10 и 20)
Первый скрипт выполнится и выставит журнал последовательно в 10 и в 20. Второй скрипт - только в 10. Можешь подставлять в GetLocalInt что угодно, никогда он не выполнится, потому что имя переменной журнала установлено системой.

Сообщение отредактировал Talarasha - Oct 27 2010, 10:50
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Oct 27 2010, 12:27
Сообщение #3373


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

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



Хы, не знал. Надо глянуть в 1.32 был ли такой функционал (с переменной), если да, то ДБКолл недоглядел, когда писал для ПЛ/ПВ квестовую систему, потому что мы заводили свою переменную. (IMG:style_emoticons/kolobok_light/smile.gif) Все это было внутри библы, а снаружи осталось несколько функций, с ними и работали.


зы: кто там спрашивает периодически, сколько скрипты изучать? я вот спустя почти 10 лет что-то новое узнаю иногда, как сейчас (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Laajin
сообщение Oct 27 2010, 13:51
Сообщение #3374


Level 5
**

Класс: Пьяный Мастер
Характер: Chaotic Good
Раса: Человек



Цитата
зы: кто там спрашивает периодически, сколько скрипты изучать? я вот спустя почти 10 лет что-то новое узнаю иногда, как сейчас smile.gif

вот и я аналогично)

Talarasha
NW_JOURNAL_ENTRYCHAPTER1 имеет какие-то связи с AddJournalQuestEntry("CHAPTER1 ", 10, oPC, TRUE, TRUE); - я правильно понял?
Нвн уже удалил, так что не проверить

Сообщение отредактировал Laajin - Oct 27 2010, 13:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Talarasha
сообщение Oct 27 2010, 14:40
Сообщение #3375


Level 6
**

Класс: Маг
Характер: Lawful Evil
Раса: Нежить



Цитата
Talarasha
NW_JOURNAL_ENTRYCHAPTER1 имеет какие-то связи с AddJournalQuestEntry("CHAPTER1 ", 10, oPC, TRUE, TRUE); - я правильно понял?
Нвн уже удалил, так что не проверить

Имеет, имеет. Функцию AJQE можно представить в следующем виде:
Neverwinter Script
void AddJournalQuestEntry(string szPlotID, int nState, object oCreature, int bAllPartyMembers=TRUE, int bAllPlayers=FALSE, int bAllowOverrideHigher=FALSE)
{
    AddEntry();
    SetLocalInt(object oCreature,"NW_JOURNAL_ENTRY"+szPlotID,nState);
    // (для наглядности опущены проверки bAllPartyMembers, bAllPlayers и bAllowOverrideHigher)
}

Где AddEntry(); - какой-то системный функционал по обновлению журнала. Но этим функционалом функция AJQE не заканчивается, она еще и вешает переменную для получения доступа к журналу. Просто это в отличие от AddEntry(); визуально не определяется, поэтому не совсем очевидно, но повсевместно используется в скриптах оригинальной кампании. А работа с журналом по типу:
Neverwinter Script
AddJournalQuestEntry("TAG",#,oPC,TRUE,TRUE);
SetLocalInt(oPC,"Q1_TAG_ID",#);
if(GetLocalInt(),"Q1_TAG_ID") == #)
{
    AddJournalQuestEntry("TAG",#+1,oPC,TRUE,TRUE);
    SetLocalInt(oPC,"Q1_TAG_ID",#+1);
}

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

Цитата
зы: кто там спрашивает периодически, сколько скрипты изучать? я вот спустя почти 10 лет что-то новое узнаю иногда, как сейчас

На мой взгляд, гораздо, гораздо меньше. Года должно хватить всем. Главное ведь не выучить названия и функционал всех-всех функций, а понять принцип, систему. Как только понял - все, дальше все задачи под силу, нужно только представлять, что хочешь. Поэтому владеющим C вообще ничего учить не надо, зашел и кодь, функции - вот они все. Вышеприведенная фишка - это просто недосмотр со стороны разрабов, которые не упомянули про это в описании AJQE.

Сообщение отредактировал Talarasha - Oct 27 2010, 14:57
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 133 134 135 136 137 > » 
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 20:58