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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Скрипты: Все вопросы, Алгоритмы, оптимизация, особености и хитрости в скриптинге
Lex
сообщение Apr 2 2006, 19:41
Сообщение #1


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

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



Обсуждение каки-то непонятных моментов в алгоритме, вариантов использования функций, оптимизация скриптов. Тут можно обсудить алгоритмы и особености скриптинга.

>> просьбы написать скрипт не в эту тему, а сюда: Напишите пожалуйста скрипт
>> выкладывать готовые и отлаженные скрипты не в эту тему, а сюда: Готовые скрипты
Тут только вопросы и обсуждение проблем и методов их решения, а так же все непонятки с "должно работать, но не работает".


___

База скриптов (NWN)
Скрипты для новичков (NWN)
Вопросы по скриптам (NWN)
Построение скриптовых сцен (NWN)
Так как скриптинг не сильно изменился, то большая часть вещей, написаная под НВН1 нормально работает и в НВН2. Посмотрите в этих темах, вполне возможно вы найдете интересующую вас информацию.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
14 страниц V  « < 11 12 13 14 >  
Открыть новую тему
Ответов (300 - 324)
Kcapra
сообщение Sep 24 2010, 06:54
Сообщение #301


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Спасибо, работает как надо...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 24 2010, 08:44
Сообщение #302


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

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



Для шарда промежутки, большие хб, делаются через деление с остатком аптайма на нужный интервал. Аптайм - переменная на модуле, равна времени работы мода в секундах (каждый хб просто аптайм+=6).

Скажем так:
Neverwinter Script
if (nUptime % 120 == 0) // остаток равен нулю, срабатывает раз в 120 секунд


Плюсы - не требует делеев вообще.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Orochi
сообщение Sep 24 2010, 20:04
Сообщение #303


Level 3
*

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



Цитата(Lex @ Sep 23 2010, 16:14) *
Не, чувак, все немного не так. Будешь писать не в тему (или в такой же нагловатой манере, как сейчас) - схлопочешь пред.


Я имел в виду что буду стараться искать подходяшие темы для вопросов,а вовсе не хотел кого то оскорбить (IMG:style_emoticons/kolobok_light/unsure.gif)

Просто в тругих темах моих вопросов (на которые так и не ответили) дофига.Я решил найти по темам хоть кого то,кто мне поможет (IMG:style_emoticons/kolobok_light/unsure.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Griffon
сообщение Sep 27 2010, 09:04
Сообщение #304


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

Класс: Страж Тьмы
Характер: True Neutral
Раса: Человек
МАСТЕР D&D



Если не отвечают - значит не сталкивался никто. Если тебе нужно получить ответ быстро, пиши лучше на официальном форуме.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 27 2010, 09:56
Сообщение #305


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

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



Имхо нвн2 сам по себе тут настолько популярен, что лучше вопросы вообще гуглить (IMG:style_emoticons/kolobok_light/smile.gif) А скрипты искать в разделе нвн1 (хотя бы потому, что скрипты по сути не менялись, и огромные гайды и сборники оттуда сюда никто не переносил).

Нвн1 живёт всего в 2 раза дольше нвн2, однако в его разделе в 3 раза больше топиков и в 4 раза больше постов.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 27 2010, 14:05
Сообщение #306


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

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



а смысл гуглить.. есть еще русскоязычные форумы по НВН2 где чуть больше чем 2 темы и последний ответ был полгода назад? (IMG:style_emoticons/kolobok_light/smile.gif)
я не в плане поглумиться, я просто таких площадок сам не знаю, мне любопытно.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 27 2010, 17:11
Сообщение #307


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

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



По-английски гуглить (IMG:style_emoticons/kolobok_light/smile.gif) По очень многим вопросам (не только по нвн или играм вообще) приходится делать именно так, ибо "гайдовых" русских ресурсов довольно мало, да и те забиты как правило переводами чужих работ, причём опять же - переводами неполными (ну вот как тут с доками по нвн2 - часть русские, часть английские уже 4 года как, и никто их уже не переведёт).
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Orochi
сообщение Sep 28 2010, 15:44
Сообщение #308


Level 3
*

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



Я то и сам Гуглил тока вот тех ответов которые я ищу я не нахожу.Город мастеров самое лучшее что мне удавалось найти. (IMG:style_emoticons/kolobok_light/rolleyes.gif) (в смысле:найти (IMG:style_emoticons/kolobok_light/ph34r.gif) )
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Sep 28 2010, 15:56
Сообщение #309


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



В общем, такая фигня:
накалякал скрипт, чтобы непись говорил, указанные у него в вариэйблах, строки. Создал парочку вайпоинтов, между которыми тот должен ходить. Ходить-то он ходит, а строки не произносит. Если вайпионты удалить - скрипт работает нормально. Нужно, чтобы работало и то, и другое.
Скрипт висит на хартбите Непися.
Neverwinter Script
void main()

{
if(GetLocalInt(OBJECT_SELF, "script_fired"))  return;
    {
        SetLocalInt(OBJECT_SELF, "script_fired", TRUE);
        float fInterval = GetLocalFloat(OBJECT_SELF, "interval");
        int n=(GetLocalInt(OBJECT_SELF, "amount"));
        DelayCommand((n*fInterval), DeleteLocalInt(OBJECT_SELF, "script_fired"));
        if ((GetLocalString(OBJECT_SELF, "string1")) != ""){AssignCommand(OBJECT_SELF, (ActionSpeakString(GetLocalString(OBJECT_SELF, "string1"))));}
        if ((GetLocalString(OBJECT_SELF, "string2")) != ""){AssignCommand(OBJECT_SELF, (ActionWait(fInterval)));
                            AssignCommand(OBJECT_SELF, (ActionSpeakString(GetLocalString(OBJECT_SELF, "string2"))));}
        if ((GetLocalString(OBJECT_SELF, "string3")) != ""){AssignCommand(OBJECT_SELF, (ActionWait(fInterval)));
                            AssignCommand(OBJECT_SELF, (ActionSpeakString(GetLocalString(OBJECT_SELF, "string3"))));}
        if ((GetLocalString(OBJECT_SELF, "string4")) != ""){AssignCommand(OBJECT_SELF, (ActionWait(fInterval)));
                            AssignCommand(OBJECT_SELF, (ActionSpeakString(GetLocalString(OBJECT_SELF, "string4"))));}
        if ((GetLocalString(OBJECT_SELF, "string5")) != ""){AssignCommand(OBJECT_SELF, (ActionWait(fInterval)));
                            AssignCommand(OBJECT_SELF, (ActionSpeakString(GetLocalString(OBJECT_SELF, "string5"))));}
    }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 28 2010, 18:15
Сообщение #310


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

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



Движок вейпоинтов стандартный? Если да, то там куча действий внутри плюс clearallactions должен быть, ессно всё вместе не работает. Пиши полную систему на ходьбу и разговор.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
PaiNt
сообщение Sep 29 2010, 02:37
Сообщение #311


Level 8
***

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



Можно попробовать выключать на время реплик выполнение функции WalkWayPpoints(), функцией SetWalkCondition(NW_WALK_FLAG_CONSTANT, FALSE), с предварительной очисткой стека действий ClearAction()-ом, если проблема действительно в движке вейпойнтов. (#include "nw_i0_generic")

Также можно мутить с текущей точкой обхода с помощью SetLocalInt(oNPC, "WP_CUR"), где это номер вейпойнта от 0-99 для стандартной системы.

Сообщение отредактировал PaiNt - Sep 29 2010, 02:42
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 29 2010, 09:22
Сообщение #312


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

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



вместо ActionSpeakString используй SpeakString. Дело в том, что пока работает хотьба по точкам, у тебя в стеке акций все время что-то есть и новое туда встанет только если стек почистить. Фразы же можно говорить и минуя стек, через указанную мной функцию. Либо, как сказал Денисок (и это более правильно на самом деле), нужно делать свою систему. Ибо в конечном итоге наверняка упрешься в невозможность расширения в ту или иную сторону.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Sep 29 2010, 10:28
Сообщение #313


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Ясно. Отложу, тогда, на неопределенный срок.

Как, блин, пользоваться функцией return?
К примеру, мне нужно чтобы выполнение скрипта приостановилось до тех пор, пока нпс занят разговором.
Я повесил такой скрипт на OnConversation
Neverwinter Script
void main()
{
    ClearAllActions();
    BeginConversation();
              while (IsInConversation(OBJECT_SELF)) return;
              Какие-то функции.
}


Пример на нвн.лексиконе прочитал, понятней не стало.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 29 2010, 10:50
Сообщение #314


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

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



Я конечно не силён в диалогах, но я бы разбил скрипт на два. Начинаем диалог твоим скриптом, а в конце диалога запускаем отдельно продолжение. Return вообще не при чём, это ф-я возврата значения с прекращением работы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Sep 29 2010, 10:59
Сообщение #315


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Цитата(denis0k @ Sep 29 2010, 15:50) *
Я конечно не силён в диалогах, но я бы разбил скрипт на два. Начинаем диалог твоим скриптом, а в конце диалога запускаем отдельно продолжение.

Я именно этого и хотел избежать.

Цитата
Return вообще не при чём, это ф-я возврата значения с прекращением работы.

Цитата
In the case of void functions, return statements are optional, but can still be used to prematurely halt execution


Т.е. запаузить в таком случае никак чтоли? (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif)

Сообщение отредактировал Kcapra - Sep 29 2010, 11:02
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 29 2010, 11:06
Сообщение #316


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

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



Цитата(Kcapra @ Sep 29 2010, 11:28) *
Ясно. Отложу, тогда, на неопределенный срок.

ты все-таки попробуй просто SpeakString поюзать. Имхо должно для твоей ситуации прокатить

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

зы: я анимацию нормально прерывал диалогом, она сама восстанавливалась, все в пределах одного управляющего скрипта + пары помощников.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Sep 29 2010, 11:34
Сообщение #317


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Пока для теста там функция ActionRandomWalk()

В будущем планируется расписать для каждой группы неписей свое поведение.

SpeakString работает

Сообщение отредактировал Kcapra - Sep 29 2010, 11:56
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 29 2010, 21:40
Сообщение #318


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

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



Хм.. тогда рекомендую (весьма нескромно) вот это почитать: http://nwnmod.narod.ru/stat_anim_npc2.htm
проблема прерывания диалогом там освещена
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Celestial
сообщение Sep 30 2010, 01:56
Сообщение #319


Level 14
****

Класс: Обыватель
Характер: Lawful Neutral
Раса: Эльф



Часть скрипта висит на входе игрока на шард. У него в инвентаре есть итем-паспорт на который все пишется.

1. Коллеги, посмотрите, пож, в чем проблема в строчке? Нужно, чтобы, если у него локалка на паспорте стоит 1, то в журнале открывался квест в стадии 1:

if (GetLocalInt(it_playerpassport,"goharbeetle") == 1) AddJournalQuestEntry("beetlequest", 1, GetEnteringObject(), FALSE, FALSE, FALSE));


2. Подскажите, что вставить вместо вопросиков, чтобы генерилось случайное количество голда в инвентаре от 500 до 1000 монет:

if (HasItem(GetEnteringObject(), "it_playerpassport") == FALSE) GiveGoldToCreature(??????????????, ?????????????, FALSE));

Сообщение отредактировал Celestial - Sep 30 2010, 02:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 30 2010, 07:28
Сообщение #320


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

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



Цитата
Нужно, чтобы, если у него локалка на паспорте стоит 1
Не знаю как там в нвн2, но в нвн1 локалки с итемов случайным образом спадали при перезаходах.
Цитата
GiveGoldToCreature(??????????????, ?????????????, FALSE)
Объект-игрок, Random(501) + 500.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Celestial
сообщение Sep 30 2010, 15:13
Сообщение #321


Level 14
****

Класс: Обыватель
Характер: Lawful Neutral
Раса: Эльф



1.
Цитата
if (HasItem(GetEnteringObject(), "it_playerpassport") == FALSE) GiveGoldToCreature(GetEnteringObject(), Random(501) + 500, FALSE));

Выдает ошибку. Все еще нужна помощь.

2.
Цитата
Не знаю как там в нвн2, но в нвн1 локалки с итемов случайным образом спадали при перезаходах.

В нвн2 как раз, если правильно помню, локалки на итемах сохраняются при перезаходах. Разве нет? Все еще нужна помощь.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Sep 30 2010, 15:30
Сообщение #322


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Цитата(Lex @ Sep 30 2010, 02:40) *
Хм.. тогда рекомендую (весьма нескромно) вот это почитать: http://nwnmod.narod.ru/stat_anim_npc2.htm
проблема прерывания диалогом там освещена

Спасибо за ссылку, статья полезная. С анимациями еще работать не приходилось, чувствую еще майндфак предстоит неслабый (IMG:style_emoticons/kolobok_light/crazy.gif)
В итоге решил мозгу не парить и добавил скрипт в OnConversationEnd()

Написал ходилку по вайпоинтам (пока простую, затем буду усложнять)

Neverwinter Script
void main()
{
int nW; object oWP;
    if (GetLocalInt (OBJECT_SELF,"RUNONCE") != 1)
        {nW=1; SetLocalInt(OBJECT_SELF,"RUNONCE",1);}
    oWP=GetWaypointByTag("wWP_"+GetTag(OBJECT_SELF)+"_0"+IntToString(nW));
    if (GetIsObjectValid(oWP)==TRUE)
        {SpeakString("Объект найден, его тэг = "+GetTag(oWP)+" nW= "+IntToString(nW));
        if (GetCurrentAction(OBJECT_SELF)==ACTION_INVALID)
        {ActionMoveToLocation(GetLocation(oWP));
        nW+=1;}
        if (GetLocation(OBJECT_SELF)==GetLocation(oWP))
            {ClearAllActions();
            ActionDoCommand(ExecuteScript("wWP_"+GetTag(OBJECT_SELF), OBJECT_SELF));}
        }
    else SpeakString("Объект не найден. nW= "+IntToString(nW));
}


Проблема в алгоритме присвоения и увелечения переменной nW, только не понимаю где именно.
(приходит на первый вэйпоинт и говорит что Объект не наден и nW=0) все, вроде бы, логично.

EDIT: в локации 4 вэйпоинта с тэгами wWP_c_human_01, wWP_c_human_02, wWP_c_human_03, wWP_c_human_04

EDIT2: Ах, да скрипт висит на хартбите непися с тэгом c_human

Сообщение отредактировал Kcapra - Sep 30 2010, 17:28
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 30 2010, 17:45
Сообщение #323


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

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



Цитата
Выдает ошибку. Все еще нужна помощь.
Какую? Я ж не пророк (IMG:style_emoticons/kolobok_light/smile.gif) Во-первых, там кажется лишняя скобка в конце. Во-вторых, в нвн1 у GiveGoldToCreature было 2 параметра, у тебя - 3 (нвн2 нет, чтобы проверить).
Цитата
В нвн2 как раз, если правильно помню, локалки на итемах сохраняются при перезаходах. Разве нет? Все еще нужна помощь.
Ну официально они и в нвн1 сохраняются. Только иногда пропадают. Причём не со всех итемов и не у всех чаров, но всё равно очень ненадёжно. Кстати, проверь и там лишнюю скобку (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Celestial
сообщение Sep 30 2010, 19:32
Сообщение #324


Level 14
****

Класс: Обыватель
Характер: Lawful Neutral
Раса: Эльф



1. Спасибо, Дэн, все заработало, как убрал скобку. В нвн2 три параметра. Кому понадобиться, правильный вариант ниже:
Цитата
if (HasItem(GetEnteringObject(), "it_playerpassport") == FALSE) GiveGoldToCreature(GetEnteringObject(), Random(501) + 500, FALSE);


2. Убрал скобку, но все равно выдает ошибку ("oTarget"):
Цитата
if (GetLocalInt(it_playerpassport,"goharbeetle") == 1) AddJournalQuestEntry("beetlequest", 1, GetEnteringObject(), FALSE, FALSE, FALSE);
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Kcapra
сообщение Oct 1 2010, 13:42
Сообщение #325


Level 9
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Благодаря ДебагСерверу обнаружил проблему (простая скриптовая переменная резетилась при каждом хартбите)
Neverwinter Script
void main()
{
int nW=GetLocalInt(OBJECT_SELF, "nW"); object oWP;
    if (GetLocalInt (OBJECT_SELF,"RUNONCE") != 1)
        {SetLocalInt(OBJECT_SELF, "nW", 1); SetLocalInt(OBJECT_SELF,"RUNONCE",1);}
    oWP=GetWaypointByTag("wWP_"+GetTag(OBJECT_SELF)+"_0"+IntToString(nW));
    if (GetIsObjectValid(oWP)==TRUE)
        {SpeakString("Объект найден, его тэг = "+GetTag(oWP)+" nW= "+IntToString(nW));
        if (GetCurrentAction(OBJECT_SELF)==ACTION_INVALID)
        {ActionMoveToLocation(GetLocation(oWP));
        nW++;
        SetLocalInt(OBJECT_SELF, "nW", nW);}
        if (GetLocation(OBJECT_SELF)==GetLocation(oWP))
            {ClearAllActions();
            ActionDoCommand(ExecuteScript("wWP_"+GetTag(OBJECT_SELF), OBJECT_SELF));}
        }
    else SpeakString("Объект не найден. nW= "+IntToString(nW));
}

Теперь ходит, я рад (IMG:style_emoticons/kolobok_light/prankster2.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

14 страниц V  « < 11 12 13 14 >
Ответить в эту темуОткрыть новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 13th May 2025 - 02:16