![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2276
|
|
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
QUOTE(DarkDeivel @ May 24 2006, 15:44) [snapback]82630[/snapback] В игре максимум 20 лвл. Как сделать чтобы был максимальный 100. Если скрипт скажите плиз. начнем с того, что "в игре" уже давно(начиная с hotu) левел-кап для игроков - 40. это зашито в движок. чтобы сделать больше 40 нужно делать довольно нетривиальную систему, суть которой - куча скриптов + custom 2da + nwnx + leto. забудь вобщем. во всяком случае до тех пор, пока не повысишь свой скилл в нвн-строительстве на несколько порядков. (IMG:style_emoticons/kolobok_light/pardon.gif) |
![]()
Сообщение
#2277
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Ну все, блин, здаюсь. Все перепробывал(наверно не все, раз пишу сюда). Мне надо, чтобы можно было заговорить с дверью, чтобы одна ветка появлялась вслучае определенного предмета в инвенатре, чтобы после отдачи этого предмета двери, дверь уничтажалась. ух, все.
|
![]()
Сообщение
#2278
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
В диалоге делай проверку, на определенный предмет. (Используя скрипт визард)
Разрушай дверь либо дестроем, либо нужным эффектом. NSS // Text Appears When int StartingConditional() { if (GetItemPossessor(GetObjectByTag("таг_айтема")) == GetPCSpeaker()) {return TRUE;} return FALSE; } NSS // ActionTakens
void main(){DestroyObject(OBJECT_SELF);} Сообщение отредактировал Dik Morris - May 28 2006, 09:00 |
![]()
Сообщение
#2279
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
как не странно, но визардский скрипт мне немного другое дал, поэтому я припер сюды
|
![]()
Сообщение
#2280
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Этот скрипт не имеет особых различий с визардским, там используется фун-ция HasItem, которая схожа с GetItemPossessor.
PS: просто в HasItem, есть проверка на валидность объекта. (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#2281
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Chaotic Neutral Раса: Полуэльф ![]() |
Lex спасибо за помощь!Советую всем строителям добавить в локи триги с бонусами и т.П.Разнобразие боя!Теперь по делу,проблема слeдующая:в катсцене я сажу npc на стул(ActionSit),далее npc с него не встает,(а он должен идти на wp1) даже если стул убить!Катсцена становится вечной.Как сделать чтоб npc встал и пошел.
Сообщение отредактировал Noah - May 28 2006, 23:19 |
![]()
Сообщение
#2282
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
NSS SetCutsceneMode(oPC, TRUE); DelayCommand(1.0f, AssignCommand(oNPC, ClearAllActions(TRUE))); DelayCommand(1.1f AssignCommand(oNPC, ActionMoveToObject(GetObjectByTag("wp1")))); DelayCommand(3.0f, SetCutsceneMode(oPC, FALSE)); 1 строка - катсцена 2 - очистить стек (встанет со стула) 3 - пойдет к обьекту с тегом wp1 4 - конец катсцены |
![]()
Сообщение
#2283
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
..::SERGO::.., не пользуйся визардовскими скриптами, как правило, они пишут не совсем то, что хотелось бы, и часто в них больше мусора, чем нужного кода. Стоит учиться самому писать скрипты.
|
![]()
Сообщение
#2284
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Noah, тебе неплохо было бы прочесть мои статьи по авроре, я там разбирал такой аспект, как акция и просто действие. Возможно твой НПС выполняет не акцию сидения, а воспроизводит анимацию но не как акцию. И он может седеть так оооочень долго.
|
![]()
Сообщение
#2285
|
|
Level 5 ![]() ![]() Класс: Убийца Характер: Chaotic Neutral Раса: Полуэльф ![]() |
Спасибо,теперь она встает.Айван,кинь ссылку на статьи,я с этого и начинал скриптинг,но мог что-то пропустить.А нет ли анимаций сидячим нпс?
|
![]()
Сообщение
#2286
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
http://download.wrg.ru/public_wrg/toolset/...ra_tutorial.exe
QUOTE(Noah @ May 30 2006, 00:41) [snapback]83142[/snapback] А нет ли анимаций сидячим нпс? Вот скрипт, думаю разберешься. NSS //::////////////////////////////////////////////// //:: OnUserDefaine am_cud_sit //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Скрипт садит НПС на стул или на землю. SIT_CHAIR - таг стула для сидения. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 07.07.2005 //::///////////////////////////////////////////// void main() { object oPC = GetFirstPC(); if (GetIsDead(OBJECT_SELF)==TRUE) return; // Если он помер, то пусть молчит if (GetArea(OBJECT_SELF)!=GetArea(oPC)) return; if (GetLocalInt(OBJECT_SELF, "STOP")) return; // Отключаем если нам это надо if (GetIsInCombat(OBJECT_SELF)) return; if (IsInConversation(OBJECT_SELF)) return; int nEvent = GetUserDefinedEventNumber(); //=========================== HEARTBEAT EVENT ================================== if (nEvent == EVENT_HEARTBEAT) // Сигнал поступает с HeartBeat слота. { //------------------------------------------------------------------------------ if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CROSS") == TRUE) { if (GetLocalInt(OBJECT_SELF, "DISTURBED")) return; ClearAllActions(); SetLocalInt(OBJECT_SELF, "DISTURBED", TRUE); ActionMoveToLocation(GetLocalLocation(OBJECT_SELF, "initLoc")); ActionDoCommand(SetFacing(GetLocalFloat(OBJECT_SELF, "initFacing"))); ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.9); return; } //------------------------------------------------------------------------------ if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CHAIR") == TRUE) { if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CHAIR") == 2) return; if (GetCurrentAction() == ACTION_SIT) return; if (GetCurrentAction() == ACTION_MOVETOPOINT) return; object oChair = GetNearestObjectByTag("SIT_CHAIR"); if (GetIsObjectValid(oChair)) { ClearAllActions(); ActionSit(oChair); ActionDoCommand(SetLocalLocation(OBJECT_SELF, "initFacing", GetLocation(OBJECT_SELF))); } } } //============================= DIALOGUE EVENT ================================= if (nEvent == EVENT_DIALOGUE) // Стандартный сигнал { SetLocalInt(OBJECT_SELF, "DISTURBED", FALSE); } //============================= PERCIEVE EVENT ================================= if (nEvent == EVENT_PERCEIVE) // Стандартный сигнал { if (GetIsPC(GetLastPerceived())) { SetLocalInt(OBJECT_SELF, "DISTURBED", FALSE); } } //========================== END COMBAT ROUND EVENT ============================ if (nEvent == EVENT_END_COMBAT_ROUND) // Стандартный сигнал { SetLocalInt(OBJECT_SELF, "DISTURBED", FALSE); } //------------------------------------------------------------------------------ } Скрипт ставится на слот UserDef |
![]()
Сообщение
#2287
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(Noah @ May 29 2006, 22:41) [snapback]83142[/snapback] А нет ли анимаций сидячим нпс? Если я правильно понял вопрос, то вам нужна дополнительная анимация сидящим персам? Недавно этот вопрос обсуждался, читайте статью Лекса ЗДЕСЬ. Если задействована ActionSit, то наложение анимации поднимет перса со стула. Можно совместить с ANIMATION_LOOPING_SIT_CHAIR кое-что из анимаций, но вот стул под перса не подставишь (или я это тупо делал). А вот на CROSS, можно все свободно вешать. Вот простой скрипт на ХБ-ит перса. Если нужно, чтобы перс смотрел в определенную сторону, то задайте точку "V_ + тэг перса." NSS void main() { object oWay = GetWaypointByTag("V_" + GetTag(OBJECT_SELF)); vector vFace = GetPosition(oWay); if(GetArea(GetFirstPC()) != GetArea(OBJECT_SELF)) return; // если ПС нет локе if (!IsInConversation(OBJECT_SELF)) { SetFacingPoint(vFace); switch (Random(3)+1) { case 1: if(Random(100) >= 50) ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS); else ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK); break; case 2: if(Random(100) >= 50) ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD); else ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK); break; case 3: if(Random(100) >= 50 && GetAbilityScore(OBJECT_SELF, ABILITY_INTELLIGENCE) >= 17) ActionPlayAnimation(ANIMATION_FIREFORGET_READ); else { if (GetGender(OBJECT_SELF)==GENDER_MALE) PlaySound("as_pl_yawningm1"); else PlaySound("as_pl_yawningf1"); ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD); } break; } ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 6.0); } } /* Персонаж сидит на земле, пьет и чешет голову. Если интеллект выше 17, то еще и читает. Слот HB */ Спасибо метрам за подсказку! Учту в дальнейшем. (IMG:style_emoticons/kolobok_light/thank_you.gif) Сообщение отредактировал gennady - Jun 1 2006, 12:41 |
![]()
Сообщение
#2288
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
gennady, есть смысл добавить проверку РС в локации. Что бы НПС все это делал только если в локации есть игрок.
|
![]()
Сообщение
#2289
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(Aiwan @ Jun 1 2006, 09:23) [snapback]83448[/snapback] gennady, есть смысл добавить проверку РС в локации. Что бы НПС все это делал только если в локации есть игрок. Aiwan, если можно киньте оную. Вообще я подметил, что ХБ начинает работать в определенном радиусе от героя, или я не прав? Тут у меня назрел вопрос по скриптам на OnSpawn, ведь насколько я понял локалки в вышеприведенном вами скрипте, вешаются именно там. Просто у меня было несколько проколов. Все работает 10-20 раз, а на тридцатом, бах висяк! Пришлось переписать и бросить все ХБ, т.к. с сюжетным персам это непозволительно. Теперь трижды думаю, стоит ли ставить что на OnSpawn. Непонятно…, или это только у меня такие приколы? (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) |
![]()
Сообщение
#2290
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(gennady @ Jun 1 2006, 12:49) [snapback]83468[/snapback] Вообще я подметил, что ХБ начинает работать в определенном радиусе от героя, или я не прав? хб работают везде, во всех локациях. Но там, где нет игрока - чуть медленнее (бывает 7-8-9 секунд 1 такт) NSS // если игрок не в одной локе с НПС - выйти из скрипта
if( GetArea(GetFirstPC())!=GetArea(OBJECT_SELF)) return; |
![]()
Сообщение
#2291
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(gennady @ Jun 1 2006, 14:49) [snapback]83468[/snapback] Тут у меня назрел вопрос по скриптам на OnSpawn, ведь насколько я понял локалки в вышеприведенном вами скрипте, вешаются именно там. Просто у меня было несколько проколов. Все работает 10-20 раз, а на тридцатом, бах висяк! Пришлось переписать и бросить все ХБ, т.к. с сюжетным персам это непозволительно. Ни разу не произошло ни одного сбоя. (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) приведи код скрипта сюда. |
![]()
Сообщение
#2292
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(Aiwan @ Jun 1 2006, 22:15) [snapback]83524[/snapback] Ни разу не произошло ни одного сбоя. приведи код скрипта сюда. Коды как мои, так и базовые, в том числе Леворовские. Неверский я видно тупо использовал, ребята спавнили перса в процессе игры, у меня же перс при загрузке уже находился в локе. Т.ч. есть рифы, и о них надо помнить. Да, забыл, были банальные баги при раздачи уровня. (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Доморощенный код (последний баг, сработал 50/50, стал только сюжетным) NSS void main() { DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectPetrify()), OBJECT_SELF)); DelayCommand(1.5, SetPlotFlag(OBJECT_SELF, TRUE)); // сюжет } os_died (кусок кода из скрипта Левора, стоял полный код) NSS void main() { SetLocalInt(OBJECT_SELF, "SPAWNED_DEAD", 1); SetIsDestroyable(FALSE, FALSE, FALSE); effect eDeath = EffectDeath(); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF); } nw_c2_j_assvict1 (базовый неверский код) NSS #include "NW_I0_GENERIC"
void main() { SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT); SetListeningPatterns(); // Goes through and sets up which shouts the NPC will listen to. WalkWayPoints(); // Optional Parameter: void WalkWayPoints(int nRun = FALSE, float fPause = 1.0) // 1. Looks to see if any Way Points in the module have the tag "WP_" + NPC TAG + "_0X", if so walk them // 2. If the tag of the Way Point is "POST_" + NPC TAG the creature will return this way point after // combat. } |
![]()
Сообщение
#2293
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Команда Делей не всегда корректно, а скажем почти всегда неккоректно работает с OBJECT_SELF. Делай так:
NSS object oSelf = OBJECT_SELF; NSS void main() { object oNpc = OBJECT_SELF; SetIsDestroyable(FALSE,FALSE,FALSE); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(TRUE,TRUE), oNpc); } Вообще не рекомендую тереть скрипты спавновские полностью, если НПС должен что то делать. Если он мертвый то три. Код выше. |
![]()
Сообщение
#2294
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Делай лучше вообще не использовать в спауне, как раз всякие баги и 50/50 и вылезают.
Особенно, когда мод грузится, при загрузке лок либо нет такого, либо баги реже/меньше, но при загрузке мода 100% бяки вылезают. |
![]()
Сообщение
#2295
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
Возникла следующая проблема:
На одну из ветвей диалога вешаю вот такой скрипт: NSS const float SND_DURATION=5.0; void main() { ClearAllActions(); ActionWait(1.5); ActionDoCommand(PlaySound("sound_2")); ActionWait(SND_DURATION); ActionStartConversation(GetPCSpeaker(), "dialog_name", FALSE, FALSE); } По идее, NPC должен чуть подождать (1.5 сек), проиграть звук, а потом начать диалог. А он ждет 5 секунд (SND_DURATION), а затем начинает диалог и параллельно проигрывает звук. Где у меня неправильно?.. |
![]()
Сообщение
#2296
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
NSS const float SND_DURATION=5.0; void main() { ClearAllActions(); DelayCommand(1.5, ActionDoCommand(PlaySound("sound_2"))); DelayCommand(SND_DURATION+1.5, ActionStartConversation(GetPCSpeaker(), "dialog_name", FALSE, FALSE)); } Ждет полторы секунды, играет звук, ждет 5 секунд, начинает диалог. |
![]()
Сообщение
#2297
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
kreon, прикинь - не работает!
А вот что написано в лексиконе: QUOTE This might not be an actual bug, but though PlaySound isn't an action (you don't get the little yellow square on the screen), if you assign a PlaySound to someone, it will wait for their current action queue to finish before playing. Сейчас буду извращаться на тему... |
![]()
Сообщение
#2298
|
|
Level 8 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Дракон NWN: Скриптинг [PW] ![]() |
Гмм.. ща тоже чего-нить попробую... Я думал что ошибка в ActionWait(), т.к. действия воспроизведения звука не вейтятся вроде...
. А, идея повяилась... Сделать SetCommandable(FALSE) (нечего будет ждать), воспроизвести звук и потом дать команду диалога. Сообщение отредактировал kreon - Jun 2 2006, 20:47 |
![]()
Сообщение
#2299
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
Итак, злобно извратившись, я добился того, чего хотел.
Вот так: Родительский скрипт: NSS void main() { object oSelf=OBJECT_SELF; ClearAllActions(); DelayCommand(1.5, PlaySound("sound_1")); DelayCommand(1.5, ExecuteScript("play1", oSelf)); } Скрипт play1: NSS const float SND_DURATION=3.0;
void main() { ActionWait(SND_DURATION); ActionStartConversation(GetPCSpeaker(), "dialog_1", FALSE, FALSE); } Сообщение отредактировал Kavin - Jun 2 2006, 20:56 |
![]()
Сообщение
#2300
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
а нафига так то?
NSS void main() { ClearAllActions(); DelayCommand(1.5, PlaySound("sound_1")); ActionWait(SND_DURATION + 1.5); ActionStartConversation(GetPCSpeaker(), "dialog_1", FALSE, FALSE); } те звук через делей, остальное в стек. ну или взять вариант Креона и выкинуть там ActionDoCommand, ибо в том варианте под задержкой он нафиг не нужен. В стек стремно по 1 причине - можно сбить. Поэтому можно подстраховаться и стек закрыть (IMG:style_emoticons/kolobok_light/smile.gif) |
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 18:07 |