![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#3686
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Neverwinter Script void main()
{ object oPC = GetEnteringObject(); object oHench = GetHenchman(oPC); if(GetIsObjectValid(oHench) && GetIsPC(oPC)) { AssignCommand(oHench, SpeakString("<слова хенча>")); DelayCommand(0.5f, AssignCommand(oPC, SpeakString("<слова игрока>"))); } //Дебаг: выведет имена хенчей от 1 до 20 (чтоб уж наверняка) в лог игроку, можно поэкспериментировать с этой штукой, юзая сейв/лоад и всё такое int i; for(i = 1; i <= 20; i++) SendMessageToPC(oPC, "Henchman №" + IntToString(i) + ": " + GetName(GetHenchman(oPC, i))); } Сообщение отредактировал Ilerien - Jun 18 2008, 16:42 |
![]()
Сообщение
#3687
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
Neverwinter Script //Дебаг: выведет имена хенчей от 1 до 20 (чтоб уж наверняка) в лог игроку, можно поэкспериментировать с этой штукой, юзая сейв/лоад и всё такое Ну что ж, поэкспериментируем! Только вот где взять 20 хенчей? Их всего-то 14, и то не весь же зоопарк сразу нанимать=))))) Вот еще одна фиговина. Мы не можем понять, почему визуальный эффект не проявляется никак? Neverwinter Script object oPlayer = GetPCSpeaker(); void main() { DestroyObject(OBJECT_SELF); { object oBoss1 = CreateObject(OBJECT_TYPE_CREATURE, "alienhunter", GetLocation(GetNearestObjectByTag("WP_alienhunter"))); DelayCommand(1.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectV isualEffect(VFX_FNF_ELECTRIC_EXPLOSION),oBoss1)); DelayCommand(1.3,ActionDoCommand(SetFacingPoint(GetPosition(oPlaye r)))); DelayCommand(1.5,AssignCommand(oBoss1,SetFacingPoint(GetPosition(OBJECT_SELF)))); } } Там один объект исчезает, на его месте возникает другой. Должен бы с эффектом, но он просто вылазит и все! А ПС вообще на него внимания не обращает. Чем ему этот новый объект не нравится, не поймем. Помогите, плиз! |
![]()
Сообщение
#3688
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата Ну что ж, поэкспериментируем! Только вот где взять 20 хенчей? Их всего-то 14, и то не весь же зоопарк сразу нанимать=))))) Да не важно, сколько их будет, эта штука отловит номер каждого хенча (IMG:style_emoticons/kolobok_light/smile.gif) Цитата Должен бы с эффектом, но он просто вылазит и все! Neverwinter Script void main() { DestroyObject(OBJECT_SELF); object oPlayer = GetPCSpeaker(); object oBoss1 = CreateObject(OBJECT_TYPE_CREATURE, "alienhunter", GetLocation(GetNearestObjectByTag("WP_alienhunter"))); DelayCommand(1.0, AssignCommand(GetModule(), ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectV isualEffect(VFX_FNF_ELECTRIC_EXPLOSION),oBoss1))); DelayCommand(1.3, ActionDoCommand(SetFacingPoint(GetPosition(oPlaye r)))); // не понял смысла этой строчки (IMG:style_emoticons/kolobok_light/smile.gif) DelayCommand(1.5, AssignCommand(oBoss1, SetFacingPoint(GetPosition(OBJECT_SELF)))); // и этой тоже... } Что мы сделали? Перекинули заделеенные команды на модуль. В старом варианте объект убивался, а после этого через некоторое время он пытался выполнить функцию ApplyEffectToObject. Любая скриптовая команда выполняется определённым объектом, а когда этого объекта в природе уже нет, команда не выполняется. Сообщение отредактировал Ilerien - Jun 18 2008, 22:40 |
![]()
Сообщение
#3689
|
|
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [PW] Gem of the North Край Лесов ![]() |
GetAssociate() мы и пробовали. GetHenchman() скорее всего просто морда к GetAssociate(), смысла нет разводить зоопарк одинаковых функций в движке. Жаль хистори крякнулась после очередного отключения света, нашел бы логи (IMG:style_emoticons/kolobok_light/smile.gif)
Кстати, тот эксперимент надо проводить и сразу после взятия хенчей, и после пары операций удаления-взятия. |
![]()
Сообщение
#3690
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
Да не важно, сколько их будет, эта штука отловит номер каждого хенча (IMG:style_emoticons/kolobok_light/smile.gif) Neverwinter Script void main() { ... DelayCommand(1.3, ActionDoCommand(SetFacingPoint(GetPosition(oPlaye r)))); // не понял смысла этой строчки (IMG:style_emoticons/kolobok_light/smile.gif) DelayCommand(1.5, AssignCommand(oBoss1, SetFacingPoint(GetPosition(OBJECT_SELF)))); // и этой тоже... } Что мы сделали? Перекинули заделеенные команды на модуль. В старом варианте объект убивался, а после этого через некоторое время он пытался выполнить функцию ApplyEffectToObject. Любая скриптовая команда выполняется определённым объектом, а когда этого объекта в природе уже нет, команда не выполняется. Смысел этих двух строчек в том, что игрок и объект новый отворачиваются друг от друга, а надо чтобы лицом к лицу (точнее лицом к морде=)))). Если на новоявленный объект строка срабатывает, то вот РС-зараза заканчивает диалог с предыдущим существом, а потом поворачивается боком или спиной (в зависимости от своего желания видимо) к новому объекту. А за объяснения про то, что скрипт относится к старому объекту - спасибо! Были подозрения на этот счет, но мы не поняли, как поменять тогда. Теперь пойдем пробовать=))))) |
![]()
Сообщение
#3691
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Что мы сделали? Перекинули заделеенные команды на модуль. В старом варианте объект убивался, а после этого через некоторое время он пытался выполнить функцию ApplyEffectToObject. Ой-ли! Чтобы перекинуть команды на модуль, нужно пробить сразу ассинг, а потом только делай... Иначе Делай остается за объектом сельф... Второй нюанс. Если кидаешь вектор поворота на модуль, то GetPosition(OBJECT_SELF) чез 1.5 секунд уже не существует... Нужно вектор пробить сразу. Третий нюанс. Желательно еффекты сразу задавать, а не совать их в функцию, т.к. могут быть баги на некоторых эффектах, особенно на смерть... Четвертый нюанс. Если пишем большой скрипт на дестроющемся НПС, то лучше кинуть сигнал и через OnUserDefined там все пробить. Тогда не нужно пробивать команды на модуль, или еще кого... Вот как примерно должен выглядеть твой скрипт: Neverwinter Script void main()
{ DestroyObject(OBJECT_SELF); object oPlayer = GetPCSpeaker(); object oMod = GetModule(); object oBoss1 = CreateObject(OBJECT_TYPE_CREATURE, "alienhunter", GetLocation(GetNearestObjectByTag("WP_alienhunter"))); effect eVis = EffectVisualEffect(VFX_FNF_ELECTRIC_EXPLOSION); vector vFace = GetPosition(OBJECT_SELF); AssignCommand(oMod, DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oBo ss1))); AssignCommand(oMod, DelayCommand(1.3, AssignCommand(oBoss1, SetFacingPoint(vFace)))); AssignCommand(oMod, DelayCommand(1.5, AssignCommand(oPlayer, SetFacingPoint(GetPosition(oBoss1))))); AssignCommand(oMod, DelayCommand(1.5, AssignCommand(oBoss1, SpeakString("Я родилсЯ!")))); } |
![]()
Сообщение
#3692
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Цитата Ой-ли! Чтобы перекинуть команды на модуль, нужно пробить сразу ассинг, а потом только делай... Иначе Делай остается за объектом сельф... По логике делей сразу выполнится объектом, до завершения скрипта и срабатывания DestroyObject. Надо тестить, мб ты и прав (IMG:style_emoticons/kolobok_light/wink3.gif)
Сообщение отредактировал Ilerien - Jun 19 2008, 14:46 |
![]()
Сообщение
#3693
|
|
Level 12 ![]() Класс: Оборотень Характер: Chaotic Neutral Раса: Нежить NWN: Скриптинг [Sn] ![]() |
Цитата По логике делей сразу выполнится объектом конечно выполнится (IMG:style_emoticons/kolobok_light/smile.gif) и установит задержку, только вот велики шансы на то, что эта задержка пропадёт вместе с объектом (IMG:style_emoticons/kolobok_light/wink3.gif) подпишусь под каждым словом gennady, кроме одного - OnUserDefined даже биоварями признаётся глючным. Оно хоть и прекрасно работает в большнистве случаев, но лучше обойтись. |
![]()
Сообщение
#3694
|
|
Level 3 ![]() Класс: Клерик Характер: Chaotic Good Раса: Эльф ![]() |
А как вообще быть, если object'ов несколько? По-моему, компиллятор это не любит, ругается=) Матом=) Как правильно задать двум разным объектам в пределах одного скрипта разные действия? Когда я попробовал механически соединять два скрипта, все object'ы выписав в начале, у меня выходил фиг!=(
|
![]()
Сообщение
#3695
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Если ты про переменные, то хоть сколько. Не знаю, сколько максимально памяти движок выделяет под локальные переменные скрипта, но обжектов можно напихать под завязку.
Цитата конечно выполнится и установит задержку, только вот велики шансы на то, что эта задержка пропадёт вместе с объектом Логично (IMG:style_emoticons/kolobok_light/smile.gif) Потестю - расскажу (IMG:style_emoticons/kolobok_light/wink3.gif)
Сообщение отредактировал Ilerien - Jun 19 2008, 18:11 |
![]()
Сообщение
#3696
|
|
Level 3 ![]() Класс: Клерик Характер: Chaotic Good Раса: Эльф ![]() |
Вопрос № следующий:
как это Neverwinter Script ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDa mage(GetCurrentHitPoints(oPlayer)/2),oPlayer,0.5f); преобразовать, чтоб забирало не половину жизни, а скажем... 90%. Или еще сколько-нить этих процентов. |
![]()
Сообщение
#3697
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Neverwinter Script ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(FloatToInt(GetCurrentHitPoints(oPlaye Можно было и самому догадаться...
r) * 0.9)), oPlayer);//не понял, зачем тут длительность, всё равно эффект мгновенный Сообщение отредактировал Ilerien - Jun 19 2008, 18:48 |
![]()
Сообщение
#3698
|
|
Level 3 ![]() Класс: Клерик Характер: Chaotic Good Раса: Эльф ![]() |
Гр-р-р...=(( Иногда все тупят. Но это не мешает мне сказать спасибо=)
|
![]()
Сообщение
#3699
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
Знаете чего, пиплы! Вы супер! Спасибо вам всем за то, что даете много вариантов и объясняете для нас, ньюбов, чего к чему! Мы знакомы всего неделю, а уже прогресс виден. Сами даже чего-то понимаем и делаем=)))))
|
![]()
Сообщение
#3700
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Все еще надеюсь левелапнуть своего хенчмена.
Надо копаться, пробовать разные варианты (IMG:style_emoticons/kolobok_light/smile.gif) 1. Убрать скриптово плот и иммортал флаги. 2. Перекинуть дестрой на модуль: assigncommand(getmodule(), destroy...). 3. Попробовать отложенное удаление через пару секунд. Вот это не проходит ни в какую. Не работает, хоть убейся. 4. Кардинально - не удалять, а именно апать и переодевать. А это как? Можно поподробнее? |
![]()
Сообщение
#3701
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
см
Neverwinter Script LevelUpHenchman()
|
![]()
Сообщение
#3702
|
|
Level 9 ![]() Класс: Вор Характер: Chaotic Good Раса: Эльф МАСТЕР Переводов ![]() |
Благодарю, о лаконичнейший! Нашла, прочитала, но как использовать, по прежнему не понимаю (IMG:style_emoticons/kolobok_light/pardon.gif)
|
![]()
Сообщение
#3703
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
А это как? Можно поподробнее? Шад, шад, шад... Эх-хе-хей... Начнем с самого начала! Для начала нужно знать, что уровень его должен быть первым, иначе нам не удастся поднять его под уровень героя. Если вам необходимо поднять уровень, то можно в скрипт спавна добавить повышение или новый класс. Помните, что классы спутников такие же, как и у героя, остальные классы вам также не удастся поднять… Я добавлю еще в этот скрипт фишку, чтобы труп спутника не исчезал. Тогда скрипт смерти, вы можете переписать по своему усмотрению… Сам скрипт: Neverwinter Script //::////////////////////// //:: Слот: OnSpawn //::////////////////////// #include "X0_INC_HENAI" void main() { //User ranged weapons by default if true. SetAssociateState(NW_ASC_USE_RANGED_WEAPON, FALSE); SetAssociateState(NW_ASC_DISTANCE_2_METERS); // Труп не исчезает и будет юзабельным SetIsDestroyable(FALSE, TRUE, TRUE); int nHenchLevel = GetHitDice(OBJECT_SELF); if (nHenchLevel == 1) { if (GetTag(OBJECT_SELF) == "TAG") { // Класс воин LevelUpHenchman(OBJECT_SELF, CLASS_TYPE_FIGHTER); // Класс СВЯЩЕННИК LevelUpHenchman(OBJECT_SELF, CLASS_TYPE_CLERIC); } } } Так вот, если ты пробила в спавне своему хенчу бессмертие, то перед дестроем его нужно убрать. Если ты в палитре настраиваешь хенчам уровень, параметры и шмотки и пытаешься базовым скриптом поменять хенчей, то вот тебе скриптик: Neverwinter Script void main() { object oPC = GetPCSpeaker(); object oSP = OBJECT_SELF; // Снимаем бессмертие AssignCommand(oSP, SetIsDestroyable(TRUE, TRUE, TRUE)); //Запускаем базовый скрипт замены хенчей ExecuteScript("nw_ch_action_17", oSP); // * Henchman levels up } Если повышаем уровни хенча только скриптами и в палитре у него стоит первый уровень, то читай ниже... Чтобы уровни спутника повышались, при повышение уровня героя, нужно в модульные свойства в слот OnPlayerLevelUp, поставить базовый скрипт x1_playerlevelup, или написать свой скрипт поднятия уровня спутника. Чтобы поднять уровень спутника до уровня героя с диалога, нужно написать примерный скрипт: Neverwinter Script void main() { object oPC = GetPCSpeaker(); object oSP = GetHenchman(oPC); int LoPC = GetHitDice(oPC); int LoSP = GetHitDice(oSP); while (LoPC > LoSP) { LevelUpHenchman(OBJECT_SELF, CLASS_TYPE_FIGHTER); LoSP++; } } /* Повысить уровень воина до уровня героя */ Так, теперь скрипт с переодеванием и заменой хенчей из палитры… Писал для своего Тузика, т.к. он собачка и класс у него только животное, но вот в отличие от первых Неверских хенчей у него есть возможность открыть инвентарь и кой куда повесить шмотку. Neverwinter Script //::////////////////////////////// //:: УРОВЕНЬ ТУЗИКА //:: File name: tuzik_level //:: Created By: Gennady //::////////////////////////////// void main() { object oPC = GetPCSpeaker(); object oSP = OBJECT_SELF; object oItem; int i; int LoPC = GetHitDice(oPC); int LoSP = GetHitDice(oSP); string sResRef = "dog_tuzik"; location Loc = GetLocation(oSP); if (LoPC > 2) sResRef = "dog_tuzik_1"; if (LoPC > 4) sResRef = "dog_tuzik_2"; if (sResRef == GetResRef(oSP)) { AssignCommand(oSP, SpeakString("Гав... Ррууу...")); SendMessageToPC(oPC, "<cюa >Тузик грустно лает… Похоже, что сейчас он не может ничему научиться…</c>"); return; } object oTuz = CreateObject(OBJECT_TYPE_CREATURE, sResRef, Loc); DelayCommand(1.0, AssignCommand(oTuz, SpeakString("Гав... Ррууу..."))); DelayCommand(1.0, SendMessageToPC(oPC, "<c у >Тузик утвердительно лает. Он может научиться всему, что вы пожелаете.</c>")); DelayCommand(1.5, AssignCommand(oTuz, ClearAllActions())); object oInv = GetFirstItemInInventory(oSP); while(GetIsObjectValid(oInv)) { CopyItem(oInv, oTuz); oInv = GetNextItemInInventory(oSP); } for (i = 0; i < 14; i++) { oItem = GetItemInSlot(i, oSP); if (GetIsObjectValid(oItem)) { object oItemN = CopyItem(oItem, oTuz); DelayCommand(1.51, AssignCommand(oTuz, ActionEquipItem(oItemN, i))); } } effect eOne = EffectVisualEffect(VFX_IMP_UNSUMMON); DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eOne, oSP)); AssignCommand(oSP, SetIsDestroyable(TRUE, TRUE, TRUE)); DestroyObject(oSP, 2.0); AssignCommand(oPC, ClearAllActions()); DelayCommand(0.2, SetCommandable(FALSE, oPC)); // заблокировать очередь AssignCommand(oPC, ActionWait(2.5)); AssignCommand(oPC, ActionDoCommand(AddHenchman(oPC, oTuz))); // Дать нового спутника AssignCommand(oPC, ActionDoCommand(SetCommandable(TRUE, oPC))); // разблокировать очередь } P.S. В этом скрипте пробито всего 2 повышения уровня… Кому надо пробейте нужное количество… Кстати, Шад, обрати внимание! В этом скрипте перед дестроем я снимаю бессмертие с Тузика, т.к. в спавне пробивал бессмертие… Удачи! (IMG:style_emoticons/kolobok_light/smile.gif) Neverwinter Script int iLev = 1; for (iLev = 1; iLev < 14; iLev++) {if (LoPC > iLev) sResRef = "dog_tuzik_"+IntToString(iLev);} |
![]()
Сообщение
#3704
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
shadowdweller, есть тема по хеньчманам, там заготовка, правила и все скрипты. Все работает как часы. Вот тут.
|
![]()
Сообщение
#3705
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Neverwinter Script LevelUpXP1Henchman(); Единственно, эту функцию ставь куда тебе надо и когда надо в скрипт.
|
![]()
Сообщение
#3706
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
А можно хенчу задать что именно и как он будет апать? В смысле, например, визарду прокачать умение пользоваться всеми видами оружия, а не что-то касающееся исключительно магии. По умолчанию-то он прокачивает только то, что свойственно его классу.
|
![]()
Сообщение
#3707
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Нужно ковырять таблички PackFT***.2da (*** - сокращённое название класса). Хенч левелапится согласно стандартному пакаджу.
Сообщение отредактировал Ilerien - Jun 21 2008, 14:39 |
![]()
Сообщение
#3708
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
Спасибо! Тем временем возник следующий камень преткновения: нужно, чтобы NPC начинал определенный разговор не при наступании на триггер, а в определенное время (скажем, сутки спустя после предыдущего разговора). Реализуемо ли это и как? Все равно нужно рисовать где-то триггер или просто в конце первого диалога приладить какой-нибудь скрипт на возобновление беседы через сутки?
|
![]()
Сообщение
#3709
|
|
Level 11 ![]() Класс: Волшебник Характер: Lawful Evil Раса: Эльф NWN: Скриптинг [PW] Gem of the North ![]() |
Легко можно разговор заделеить, вот только начнут они в бою болтать...
Neverwinter Script DelayCommand(HoursToSeconds(24), <...>);
|
![]()
Сообщение
#3710
|
|
Level 3 ![]() Класс: Обыватель Характер: Neutral Good Раса: Человек ![]() |
А в течение этих суток они (т.е. PC и тот, с кем он должен говорить) могут беспрепятсвенно бегать где попало и делать все, что вздумается? И ровно через 24 часа начнут разговор №2? Вроде где-то мы видали такое условие If not in combat... Может, его еще сюда приделать?
|
![]() ![]() |
Текстовая версия | Сейчас: 3rd August 2025 - 07:52 |