Kcapra
Sep 24 2010, 06:54
Спасибо, работает как надо...
denis0k
Sep 24 2010, 08:44
Для шарда промежутки, большие хб, делаются через деление с остатком аптайма на нужный интервал. Аптайм - переменная на модуле, равна времени работы мода в секундах (каждый хб просто аптайм+=6).
Скажем так:
Neverwinter Script
if (nUptime % 120 == 0) // остаток равен нулю, срабатывает раз в 120 секунд
Плюсы - не требует делеев вообще.
Orochi
Sep 24 2010, 20:04
Цитата(Lex @ Sep 23 2010, 16:14)

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

Просто в тругих темах моих вопросов (на которые так и не ответили) дофига.Я решил найти по темам хоть кого то,кто мне поможет
Griffon
Sep 27 2010, 09:04
Если не отвечают - значит не сталкивался никто. Если тебе нужно получить ответ быстро, пиши лучше на
официальном форуме.
denis0k
Sep 27 2010, 09:56
Имхо нвн2 сам по себе тут настолько популярен, что лучше вопросы вообще гуглить

А скрипты искать в разделе нвн1 (хотя бы потому, что скрипты по сути не менялись, и огромные гайды и сборники оттуда сюда никто не переносил).
Нвн1 живёт всего в 2 раза дольше нвн2, однако в его разделе в 3 раза больше топиков и в 4 раза больше постов.
а смысл гуглить.. есть еще русскоязычные форумы по НВН2 где чуть больше чем 2 темы и последний ответ был полгода назад?

я не в плане поглумиться, я просто таких площадок сам не знаю, мне любопытно.
denis0k
Sep 27 2010, 17:11
По-английски гуглить

По очень многим вопросам (не только по нвн или играм вообще) приходится делать именно так, ибо "гайдовых" русских ресурсов довольно мало, да и те забиты как правило переводами чужих работ, причём опять же - переводами неполными (ну вот как тут с доками по нвн2 - часть русские, часть английские уже 4 года как, и никто их уже не переведёт).
Orochi
Sep 28 2010, 15:44
Я то и сам Гуглил тока вот тех ответов которые я ищу я не нахожу.Город мастеров самое лучшее что мне удавалось найти.

(в смысле:найти

)
Kcapra
Sep 28 2010, 15:56
В общем, такая фигня:
накалякал скрипт, чтобы непись говорил, указанные у него в вариэйблах, строки. Создал парочку вайпоинтов, между которыми тот должен ходить. Ходить-то он ходит, а строки не произносит. Если вайпионты удалить - скрипт работает нормально. Нужно, чтобы работало и то, и другое.
Скрипт висит на хартбите Непися.
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
Движок вейпоинтов стандартный? Если да, то там куча действий внутри плюс clearallactions должен быть, ессно всё вместе не работает. Пиши полную систему на ходьбу и разговор.
Можно попробовать выключать на время реплик выполнение функции WalkWayPpoints(), функцией SetWalkCondition(NW_WALK_FLAG_CONSTANT, FALSE), с предварительной очисткой стека действий ClearAction()-ом, если проблема действительно в движке вейпойнтов. (#include "nw_i0_generic")
Также можно мутить с текущей точкой обхода с помощью SetLocalInt(oNPC, "WP_CUR"), где это номер вейпойнта от 0-99 для стандартной системы.
вместо ActionSpeakString используй SpeakString. Дело в том, что пока работает хотьба по точкам, у тебя в стеке акций все время что-то есть и новое туда встанет только если стек почистить. Фразы же можно говорить и минуя стек, через указанную мной функцию. Либо, как сказал Денисок (и это более правильно на самом деле), нужно делать свою систему. Ибо в конечном итоге наверняка упрешься в невозможность расширения в ту или иную сторону.
Kcapra
Sep 29 2010, 10:28
Ясно. Отложу, тогда, на неопределенный срок.
Как, блин, пользоваться функцией return?
К примеру, мне нужно чтобы выполнение скрипта приостановилось до тех пор, пока нпс занят разговором.
Я повесил такой скрипт на OnConversation
Neverwinter Script
void main()
{
ClearAllActions();
BeginConversation();
while (IsInConversation(OBJECT_SELF)) return;
Какие-то функции.
}
Пример на нвн.лексиконе прочитал, понятней не стало.
denis0k
Sep 29 2010, 10:50
Я конечно не силён в диалогах, но я бы разбил скрипт на два. Начинаем диалог твоим скриптом, а в конце диалога запускаем отдельно продолжение. Return вообще не при чём, это ф-я возврата значения с прекращением работы.
Kcapra
Sep 29 2010, 10:59
Цитата(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
Т.е. запаузить в таком случае никак чтоли?
Цитата(Kcapra @ Sep 29 2010, 11:28)

Ясно. Отложу, тогда, на неопределенный срок.
ты все-таки попробуй просто SpeakString поюзать. Имхо должно для твоей ситуации прокатить
опиши подробнее, какой ты скрипт прервать хочешь диалогом. Так, как описано выше - делать бесполезно. Делать в скрипте цикл, ждущий окончания диалога - можно, но имхо ни разу не рационально. Скорее всего есть варианты проще.
зы: я анимацию нормально прерывал диалогом, она сама восстанавливалась, все в пределах одного управляющего скрипта + пары помощников.
Kcapra
Sep 29 2010, 11:34
Пока для теста там функция ActionRandomWalk()
В будущем планируется расписать для каждой группы неписей свое поведение.
SpeakString работает
Хм.. тогда рекомендую (весьма нескромно) вот это почитать:
http://nwnmod.narod.ru/stat_anim_npc2.htmпроблема прерывания диалогом там освещена
Celestial
Sep 30 2010, 01:56
Часть скрипта висит на входе игрока на шард. У него в инвентаре есть итем-паспорт на который все пишется.
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));
denis0k
Sep 30 2010, 07:28
Цитата
Нужно, чтобы, если у него локалка на паспорте стоит 1
Не знаю как там в нвн2, но в нвн1 локалки с итемов случайным образом спадали при перезаходах.
Цитата
GiveGoldToCreature(??????????????, ?????????????, FALSE)
Объект-игрок, Random(501) + 500.
Celestial
Sep 30 2010, 15:13
1.
Цитата
if (HasItem(GetEnteringObject(), "it_playerpassport") == FALSE) GiveGoldToCreature(GetEnteringObject(), Random(501) + 500, FALSE));
Выдает ошибку. Все еще нужна помощь.
2.
Цитата
Не знаю как там в нвн2, но в нвн1 локалки с итемов случайным образом спадали при перезаходах.
В нвн2 как раз, если правильно помню, локалки на итемах сохраняются при перезаходах. Разве нет? Все еще нужна помощь.
Kcapra
Sep 30 2010, 15:30
Цитата(Lex @ Sep 30 2010, 02:40)

Хм.. тогда рекомендую (весьма нескромно) вот это почитать:
http://nwnmod.narod.ru/stat_anim_npc2.htmпроблема прерывания диалогом там освещена
Спасибо за ссылку, статья полезная. С анимациями еще работать не приходилось, чувствую еще майндфак предстоит неслабый
В итоге решил мозгу не парить и добавил скрипт в 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
denis0k
Sep 30 2010, 17:45
Цитата
Выдает ошибку. Все еще нужна помощь.
Какую? Я ж не пророк

Во-первых, там кажется лишняя скобка в конце. Во-вторых, в нвн1 у GiveGoldToCreature было 2 параметра, у тебя - 3 (нвн2 нет, чтобы проверить).
Цитата
В нвн2 как раз, если правильно помню, локалки на итемах сохраняются при перезаходах. Разве нет? Все еще нужна помощь.
Ну официально они и в нвн1 сохраняются. Только иногда пропадают. Причём не со всех итемов и не у всех чаров, но всё равно очень ненадёжно. Кстати, проверь и там лишнюю скобку
Celestial
Sep 30 2010, 19:32
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);
Благодаря ДебагСерверу обнаружил проблему (простая скриптовая переменная резетилась при каждом хартбите)
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));
}
Теперь ходит, я рад
Orochi
Oct 10 2010, 15:09
Я до сих пор не могу разобраться как сделать проверку на диалог.Помогите кто нить.Каой скрипт для этого нужен.Мне над чтоб Непись не болтал с тобой пога ты не поговорил с другим Неписем.
noooox
Jan 20 2011, 13:36
У меня небольшая загвоздка.Помогите пажалуйста.Сделал я квест.В котором игроку надо принести нпс клыки болотного волка.И все там получилось.Только вот не пойму как сделать чтобы надо было отдать нпс не один клык а 10 штук этих клыков?
В диалоге я поставил скрипт чтоб нпс проверял итэм в рюкзаке игрока и тогда продолжаеться диалог по завершаюшей ветке квеста.Скрипт называеться gc_check_item.Он стандартный в тулсете.
Merkuta
Jan 20 2011, 15:22
noooox
Используй gc_item_count.
noooox
Jan 21 2011, 02:52
Большое спасибо.Все работает.Подскажишь? как сделать чтоб фонарные столбы в одной локации или во всем модуле ночью работали а днем выключались.Может скрипт какой в свойства каждого фонарика запихнуть?
Цитата(noooox @ Jan 21 2011, 04:52)

Большое спасибо.Все работает.Подскажишь? как сделать чтоб фонарные столбы в одной локации или во всем модуле ночью работали а днем выключались.Может скрипт какой в свойства каждого фонарика запихнуть?
Посмотри в базе скриптов. Есть такой скрипт. Правда, под НВН1...
anybit
Jan 29 2011, 18:14
Подскажите команду, чтоб дать гг крылья и и убрать)
Типо гг был ангелом, затем ему отрезали крылья....))))
kiruhs
Jan 29 2011, 19:40
Цитата(anybit @ Jan 29 2011, 17:14)

Подскажите команду, чтоб дать гг крылья и и убрать)
Типо гг был ангелом, затем ему отрезали крылья....))))
Это в НВН1. Может в НВН2 то же самое
Neverwinter Script
void SetCreatureWingType(int nWingType, object oCreature=OBJECT_SELF)
Lorendroll
Mar 20 2011, 01:02
Мне нужно в скрипте получить позицию, которую игрок выберет левым кликом мышки.
Как я видел, есть две функции возвращающие указанную игроком позицию:
1) GetItemActivatedTargetLocation
2) GetSpellTargetLocation
То есть игрока нужно либо заставить активировать айтем с уникальным свойством, вызывающим скрипт, либо заставить его скастовать спелл. Но ни то ни другое действие не может быть вызвано из скрипта. Так как ActionCastSpellAtObject или ActionCastSpellAtLocation требуют определенного аргумента для вызова, а мне нужно как раз получить это значение.
Как можно выйти из этой ситуации? Есть идея написать кастомный фит, вызывающий нужный кастомный спелл, вызывающий нужный скрипт, получающий нужное значение

Но похоже фит можно вызвать тоже только на определенный объект... Может быть есть выход при помощи custom GUI?
Подозреваю что можно извернуться с UIObject_Input_ActionTargetScript. Но как? Повесить невидимую кнопку на весь экран игрока?
Orochi
Jul 22 2011, 17:28
Кто нибудь знает скрипт на появление панели выбора команды как в SoZ?
noooox
Aug 21 2011, 07:54
Какой скрипт можно поставить на проверку диалога который запускаеться 1 раз каждые сутки.Например в 8:00 утра.Суть такова.Делаю эдакое героическое приключение как в mmorpg.Вот и надо чтоб игрок мог его посешать каждые сутки.
noooox
Aug 22 2011, 18:13
И еше каким скриптом можно телепортировать объекты в пределах локации,ну например сушества,визуальный объект,итэмы?
Lorendroll
Sep 14 2011, 21:14
noooox,
1) ставить на персонажа переменную с пометкой о дате/времени взятия квеста, а потом проверять её значение и сверять с текущей датой/временем. Довольно нетривиальная задача для начинающего.
2) тоже надо писать свой скрипт где воспользоваться функциями ActionJumpToLocation в случае работы с персонажем, или CopyObject а затем DestroyObject оригинал в случае с иными типами объектов.
PS: по вопросам тулсета обращайтесь в icq, смогу оперативнее помочь
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.