![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Здесь будут вывешаны самые простые скрипты на которых можно построить новичку свой модуль. Любой пост кроме скрипта с описанием будет считаться спамом и автор получит предупреждение. Всем Мастерам скриптов советую максимально разжевывать куда, как и зачем вставлять код. При этом максимально просто писать код. Этим мы поможем новичкам не только справиться с проблемой, но и понемногу научим понимать код. Сложные скрипты писать в другую тему.
============================ LEX: Беру тему под контроль. Если тут в скриптах или комментариях ошибки, пишу в то же посте, где допущена неточность. Авторам постов обратить внимание на эти ремарки и вносить коррективы по необходимости. ============================ Начем. Самое главное, это начало модуля. Тут все написано, как раздеть игрока, одеть, дать ему денег и отправить дальше. Ставится он на слот модуля OnClientEnter. NSS //:://////////////////////////////////////////////
//:: OnEnter am_mod_enter //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Скрипт на вход в модуль при старте. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 22.08.2005 //::///////////////////////////////////////////// void main() { object oMod = GetModule(); // Наш модуль object oPC = GetEnteringObject(); // Того кто вошел // Если это не игрок (а ДМ к примеру) или уже было раз, то сделаем возврат // скрипта, т.е. дальше он не пойдет. if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME")) {return;} { SetLocalInt(oMod, "START_GAME", TRUE); // Что бы сработал только один раз //--------- Откроем туман над локацией если вам надо. К примеру в городе ------- ExploreAreaForPlayer(GetObjectByTag("ТАГ_НУЖНОЙ_ЛОКАЦИИ"), oPC); //--------------- Проводим деноминацию денежных накоплений --------------------- AssignCommand(oPC, TakeGoldFromCreature(GetGold(oPC),oPC,TRUE)); // Заберем все денежки //------------------ Убиваем весь инвентарь ------------------------------------ object oItem = GetFirstItemInInventory(oPC); // Первый итем в инвентаре while(GetIsObjectValid(oItem)) // Пока такой объект существует { DestroyObject(oItem); // Удаляем его oItem = GetNextItemInInventory(oPC); // Берем другой объект... } //------------------ Убиваем всю амуницию ------------------------------------- int i=0; while(i<14) // ПОКА i меньше 14. 14 - это количество всех слот у объекта { DestroyObject(GetItemInSlot(i, oPC)); // i++; // Это значит i увеличится на еденичку от своего значения // Было ноль к примеру, станет 1 и т.д. } //------------------------ Создаем предметы ------------------------------------ // Если вам нужны отдельно каждому классу по несколько предметов, то // скопируйте кусок кода еще и измените CLASS_TYPE_ Наведите курсор, // нажми F2 и выберите нужное значение константы // int Class = GetClassByPosition(1, oPC); // switch (Class) // В зависимости от класса // { // case CLASS_TYPE_BARBARIAN: // { // CreateItemOnObject("ResRef_Объекта", oPC,1); // } // case CLASS_TYPE_FIGHTER: // { // CreateItemOnObject("ResRef_Объекта", oPC,1); // } // } GiveGoldToCreature(oPC, 5000); // Даем золотишко CreateItemOnObject("ResRef_Объекта1", oPC, 1); CreateItemOnObject("ResRef_Объекта2", oPC, 1); CreateItemOnObject("ResRef_Объекта3", oPC, 30); // 1 - это количество в стеке, если вам надо 30 стрел, то ставьте там 30 //---------------------- Опознаем предметы ----------------------------------- object oItemCr = GetFirstItemInInventory(oPC); while(GetIsObjectValid(oItemCr)) { SetIdentified(oItemCr,TRUE); oItemCr = GetNextItemInInventory(oPC); } //-------------------- Уровень игрока для игры в модуле ------------------------ // К примеру нам нужен игрок 5 уровня. Смотрим таблицу уровней и видим, // что Level 5 = 10000 xp. { SetXP(oPC, 10000); } //---------------------- Оденем нашего игрока --------------------------------- AssignCommand(oPC, ActionEquipMostEffectiveArmor()); //---------------------------------- END --------------------------------------- } } |
![]()
Сообщение
#2
|
|||||
Level 3 ![]() Класс: Паладин Характер: Chaotic Evil Раса: Человек ![]() |
Долго думал, какой скрипт написать и решил, что новичкам, в первую очередь, будет интересно узнать вот о чем. Многое замечали, что при разговоре с NPC (Non-Playing Character, т.е. любой персонаж, кроме игроков) при первой встрече он может вас приветствовать, а при второй - молчать. Так вот, делается сее творение тоже с помощью скриптов. Для начала создаете диалог с двумя ветками от корня (что NPC будет говорить вначале и что после). В первой ветке во вкладке Text Appears When (эта вкладка указывает на то, что фраза будет произнесена, только если скрипт, написанный в этой вкладке, выполняется) напишите следующий скрипт.
Получается, что мы спрашиваем программу была ли переменная "FIRST_TIME" определена. Если нет - то мы даем добро на фразу. Теперь нам осталось сделать совсем ничего - определить эту переменную. Тогда при вызове нашего скрипта, он определит, что переменная определена и выдаст FALSE, т.е. запретит вывод фразы. Но проге надо ж вывести хоть какую то фразу? :) Вот он и опускается на одну строчку вниз. Там нет никаких проверок, поэтому он свободно выводит вторую фразу. Вот скрипт, который нужно прописать в Actions Taken
Вот и все. Если хотите больше веток, то меняйте значения переменной соответственно. ЗЫ: Кстати, вот эти ковычки в скрипте /* */ означают комментарий. Используйте их, чтобы окончательно не заблудиться в том, что вы написали. ;) LEX: PS: это расписано в вопросах и ответах |
||||
![]()
Сообщение
#3
|
|||||
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Решил расписать такой скрипт. Многие наверное хотят сделать у себя в модуле вещь, на подобие "Камня призыва" в NWN. Что нам нужно: 1) Итем, который будет выполнять роль телепортера, скажем, камень призыва, ему нужно добавить св-во "Вызвать заклинание: Только собственное питание [бесконечно использовано]" - так называется в русской версии. Его таг должен быть уникальным! 2) Объект, к которому будет осуществляться телепортация, скажем портал. Его таг то же должен быть уникальным! Вот и все, теперь скрипты: Ставется на событие OnActivateItem в модульных св-вах
Работает это так: Игрок использует объект и сробатывает скрипт. Для начала скрипт проверяет, тот ли объект был использован? Если тот, то происходит запоминание координат игрока, чистка его акций(очищение всех действий NPC) и сам прыжок к порталу. Ставется на событие OnUsed в св-вах портала или в слот "Совершенные действия" на ветке диалога
Работает это так: При клике по порталу или при определенной строке в диалоге скрипт чистит акции у игрока и кидает к запомненным координатам. Сообщение отредактировал -fenix- - Aug 24 2005, 19:42 |
||||
![]()
Сообщение
#4
|
|||
Level 3 ![]() Класс: Паладин Характер: Chaotic Evil Раса: Человек ![]() |
Неожиданно пришла здравая идея! Многим может быть полезным генерация хенча (henchman - NPC, который помогает тебе во всем). Вот как этого можно добиться. 1.Создаем любого NPC на карте. 2.Добавляем к нему диалог, типа такого: "Привет, Вася. Хощ, буду твоим помощьником?"-"Хочу"-"Хех, все" 3.Далее, в том месте, где NPC говорит, что он уже присоединился к вам, во вкладке Action Taken напишите следующий коротенький скриптик
4.Заменяем во всех вкладках скриптов у NPC скрипты на nw_ch_ac#, где вместо # пишите цифру или букву из родных скриптов. Это стандартные AI скрипты для всех хенчев. 5.Все, пользуйтесь :) ЗЫ: А если еще добавить проверочку, о которой я писал выше, что можно сделать еще и красивый диалог. Юзайте :D |
||
![]()
Сообщение
#5
|
|||||||||||||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Скрипт закрывает дверь на ночь и открывает ее днем. Ставится на OnEnter триггера. Триггер чертится максимально близко к двери. Игрок наступает на триггер и идет ппроверка с работой скрипта, значит триггер надо чертить немного больше чем ширина-длина двери, что бы манчи не добежали пока скрипт не сработал. В идеале не больше тайла на которм стоит дверь. Вот сам код:
Простые заготовки скриптов для проверок переменных и присвоения значений в ДИАЛОГАХ. Все локалки я присваивал на игрока в диалоге object oPC = GetPCSpeaker();. Если у вас на триггере или еще где, то используйте object oPC = GetFirstPC();. Это берет первого игрока, а в сингле он один и есть. Это верно ДЛЯ ОДИНОЧНОЙ ИГРЫ. Тот кто решит делать шард, поймет сам где и как надо описывать оРС... ПРИСВАИВАЕМ ПЕРЕМЕННУЮ
ПРОВЕРКА В ДИАЛОГЕ НА НАЧАЛО СТРОКИ
ПРОВЕРКА НЕСКОЛЬКИХ ПЕРЕМЕННЫХ
Добавлено в [mergetime]1124950183[/mergetime] ПРИМЕРЫ СЛОЖНЫХ ПРОВЕРОК. Данный скрипт сработает ЕСЛИ: Первая переменная равна 1, Вторая 2, третья 5, четвертая 1.
Сложная проверка. Данный скрипт сработает ЕСЛИ: Первая переменная равна 1 или Вторая равна 2, НО ПРИ ЭТОМ третья равна 5 но НЕ ровна 8.
|
||||||||||||
![]()
Сообщение
#6
|
|||
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
ЗЫ: Небольшое уточнение, в посте DraX’ са.
Собственно, вот нужные скрипты (для тех кому лень искать…) OnBlocked = x0_ch_hen_block OnDamaged = x0_ch_hen_damage OnDeath = x0_ch_hen_death OnConversation = x0_ch_hen_conv OnDisturbed = x0_ch_hen_distrb OnCombatRoundEnd = x0_ch_hen_combat OnHeartbeat = x0_ch_hen_heart OnPhysicalAttacked = x0_ch_hen_attack OnPerception = x0_ch_hen_percep OnRested = x0_ch_hen_rest OnSpawn = x0_ch_hen_spawn OnSpellCast = x0_ch_hen_spell OnUserDefined = x0_ch_hen_usrdef Данные, скрипты, из хенчманов, 1 аддона. (СоУ) Сообщение отредактировал Aiwan - Sep 22 2005, 19:11 |
||
![]()
Сообщение
#7
|
|||||||
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Вот скиптик для сидения на стуле, кушетке, диване, лавке... Все, что нам нужно - это объект подходящий для сидения. Скрипт ставется на слот OnUsed в св-вах объекта
Действует скрипт очень просто. Сначало проверяется являетсяли кликнувший по стулу PC. Если да, то происходит проверка на занятость стула. Если стул свободен, то PC садится, в противном случае у PC чистятся все акции. Или кинуть его в первый пост??? Вот немного усложненный скрипт с Камнем призыва. Теперь и для возврата мы будем использовать камень. Мы помещаем два предыдущих скрипта в разные блоки оператора if, а в условие ставим проверку переменной.
Рассмотри первое использование. Если ТАГ использованного объекта правельный, то проверяется лок. переменная. У нас этой переменной еще нет, значит она не может быть ровна 1, поэтому происходит прыжок к объекту(скажем порталу) и установка значения переменной на 1. При повторном использовании проверка переменной дает положительный результат и происходит джамп к запомненым координатам, так же значение переменной устанавливается на 0. Поэтому при следующем использовании нас снова перенесет к порталу... ============================================= LEX:
эта проверка лишняя. Если игрок кликнул на стул, то он не может быть НЕ ВАЛИДНЫМ. (как ты пишешь, правИльным) поправил Сообщение отредактировал -fenix- - Aug 26 2005, 09:17 |
||||||
![]()
Сообщение
#8
|
|||||||||||||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Скрипт закрывает дверь автоматически через заданное время. Ставится в слот OnOpen двери.
Простенький скрипт, генерирует у меня книги в шкаф. Все книги должны быть с подобными ResRef-ами. Ваши книги должны быть такого вида: am_it_book001, am_it_book002, am_it_book003...am_it_book050, ... am_it_book100 и т.д. Скрипт надо ставить на OnOpen и на OnDeath шкафа или книжной полки. Присвоив на модуль переменную "ALL_BOOKS_IN_MODULES" вы ее значением указываете количество ваших книг. К примреру 1 меня их 60, значит значение переменной будет 60. На самом шкафу локалка "BOOKS" означает какое количество книг случайно появится в нем. Если присвоить значение 3, то создастся три книги.
Скрипт проверки локации в диалоге. К примеру вы хотите что бы в одной локации НПС что -то сказл по поводу местонахождения, в другой локации другое.
Ставите на OnEnter важной локации или триггера. И у вас будет автосохранение. К примеру перед важной битвой.
Скрипт превращения НПС в страшного Вервольфа. Можно в принципе в любого. Только измените модель POLYMORPH_TYPE_, наведя на нее курсовр и нажав F2 выбрав нужную из списка.
Добавлено в 12:05 Забыл %) Ставится скрипт на OnDamag NPC. Фракцию можно любую нейтральную к игроку. Добавлено в [mergetime]1125038176[/mergetime] Скрипт проверяет наличие предмета в инвентаре игрока. Если предмет есть, то появится строка в диалоге.
|
||||||||||||
![]()
Сообщение
#9
|
|||||||||
Level 19 ![]() Класс: Воин Характер: Lawful Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Если хотите, чтобы НПС, как только увидеk игрока поприветствовал его, используйте этот скрипт. Скрипт ставется на слот OnPerception в св-вах НПС
У каждого НПС есть радиус, в котором он видет, как только вы в него зайдете, НПС вас поприветствует. Пока вы остаетесь в этом радиусе, он вам ни чего не скажет, а если выйти и снова зайти, то он снова скажет фразу. Если вам кажется, что вас замечают слишком близко или далеко, то измените НПС(на котором скрипт) чувствительность. Это делается в св-вах НПС, во закладке "Улучшенные", там в низу есть "Расстояние чувствительности". Чтобы трупы НПС не исчезали, а оставались и с них можно было собрать инвентарь убитого, надо сделать так. 1) Нужно в св-вах НПС на закладке "Улучшенный" поснимать все галки в разделе "Специальный". 2) Настроить инвентарь НПС. В частности пометить выбрасываемые вещи, вещи, которые после смерти остануться на трупе. Это делается просто, выделяете нужный предмет и ставите\убираете галочку. 3) В палитре размещаемые объекты->секретный объект найти Труп. У него должны быть уникальный ТАГ и РесРеф, так же у него должна стоять галка на инвенторе. Этот объект невидимый и будет нашим инвенторем. 4) Поставить следующий скрипт. Скрипт ставется на слот OnDeath в св-вах НПС
Добавлено в 16:06 Вы можете общаться с НПС через панель разговора. Для этого нужны два скрипта. Скрипт ставится на слот OnSpawn в св-вах НПС
Скрипт ставится на слот OnConversation в св-вах НПС
Сообщение отредактировал -fenix- - Aug 26 2005, 17:04 |
||||||||
![]()
Сообщение
#10
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
СКРИПТЫ БОЛЬШЕ НЕ ПОСТИТЬ. ТОЛЬКО МАСТЕРАМ РАЗРЕШАЮ ПИСАТЬ.
|
![]()
Сообщение
#11
|
|||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Скрипт вешается на OnEnter триггера. Переходим в следующий модуль.
|
||
![]()
Сообщение
#12
|
|||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
|
||
![]()
Сообщение
#13
|
|||||
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Весьма полезный скрипт. Можно его чуток доработать, чтобы тег вейпоинта был не всегда одним, а зависел от тега самого моба (или совпадал, или с него начинался). Сообщение отредактировал _kaa_ - Sep 19 2005, 09:21 |
||||
![]()
Сообщение
#14
|
|||||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
_kaa_ , :yes: согласен. Может кому нужны несколько точек персонально. Заморочки писать не стал со стрингами и прочим, это новичкам сложно. :D Этот скрипт в отличие от верхнего отправляет НПС на ПЕРСОНАЛЬНЫЙ вейпоинт.
Еще простенький скрипт для описания предметов и ставить точку на локации. Выглядит так: вы подошли к вывеске, нажали использовать ее, у вас высветилась строка над ней и на карте появилась метка с названием гостиницы к примеру. Метка карты должна быть с тегом WP_ADD_MAP_NOTE и быть не дальше чем 5 (Пол квадратика тайла) метров от объекта. Но учтите, вы должны будете написать название на точке, но не ставить галочку Map Note Enebled.
А, чуть не забыл! :scratch: Локальный стринг "DISCRIPTION" - Это в свойствах объекта вписываете GetLocalString с именем DISCRIPTION а вот в строке пишете описание предмета.
Прикрепленные файлы
|
||||
![]()
Сообщение
#15
|
|||||
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
есть другой вариант. Описание делаем в описании таблички, а в скрипте делаем
Айван: а вот это прикольно. Я не знал. Сенькс. 29.09.Айван: Лекс, это СОВСЕМ ДРУГАЯ ИСТОРИЯ ;) Поюзай функцию... LEX: а я не говорил, что это то же самое. Это просто другой вариант прочтения описания на табличке. Не как текст, что над ней появляется. :) Сообщение отредактировал Lex - Oct 2 2005, 15:05 |
||||
![]()
Сообщение
#16
|
|||||||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Стандартный скрипт на слот OnSpawn НПС. Данный скрипт позволяет тонко настроить свойства НПС. Главное, один раз ВНИМАТЕЛЬНО прочитайте комментарии. Все локальные переменные ствятся в тулсете заранее.
Для верной работы с паузами на вейпоинтах и с передвижением бегом по точкам, надо найти в стандартном скрипте x2_def_heartbeat такие строки и заменить моими ниже.
|
||||||
![]()
Сообщение
#17
|
|||||||||||||||||||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Проверка Харизмы у игрока. Если она 16 или больше, то стартует диалог.
Если у игрока есть класс паладина, то появится такая строка.
Если у игрока есть скилл Оценки вещей, то появится строка, на которой стоит скрипт.
Проверка навыка ОБМАНУТЬ (Bluff). Если удачно, то строка появится, если нет, то не появится.
Дает опыт для всей партии игрока.
Добавлено в [mergetime]1128759063[/mergetime] Все эти скрипты можно легко изменить под себя и проверить не харизму, а силу к примеру. И не 16, а 12. Думаю, это легко. |
||||||||||||||||||
![]()
Сообщение
#18
|
|||
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Универсальный скрипт, который ставится на люк (Деревянный) и когда РС его открывает и нажимает на него второй раз, то перемещается к объекту с Тагом равным LocalString "TRANSITION_TARGET" на этом люке. Если вам перемещаться не надо, то люк будет просто, открываться-закрываться.
|
||
![]()
Сообщение
#19
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Ставим скрипт на OnEnter енкаучера. Делаем его не активным и что бы срабатывал один раз. Дальше все вс скрипте. Указываем условие при котором он будет срабатывать и сколько раз. У меня например если игрок не член банды черных рейдеров. У вас может быть свое.
NSS //:://////////////////////////////////////////////
//:: OnEnter am_een_local_on //:: Copyright © 2006 WRG! //::////////////////////////////////////////////// /* Включает енкаучер, если на РС нет ни одной локальной переменной равной стрингу LOCAL_PC_0X float "TIME" - время срабатывания енкаучера Локалка "NUMBER" - означает сколько раз сработает. Если ее нет, сразу уничтожится. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 04.05.2006 //::////////////////////////////////////////////// void main() { object oPC = GetEnteringObject(); object oEnc = OBJECT_SELF; object oArea = GetArea(OBJECT_SELF); float f = GetLocalFloat(oEnc, "TIME"); int i = GetLocalInt(oEnc, "NUMBER"); string sLl = GetLocalString(oEnc, "LOCAL_PC_01"); // Локальные переменные string sL2 = GetLocalString(oEnc, "LOCAL_PC_02"); // при каторых енкаучер string sL3 = GetLocalString(oEnc, "LOCAL_PC_03"); // не сработает. string sL4 = GetLocalString(oEnc, "LOCAL_PC_04"); string sL5 = GetLocalString(oEnc, "LOCAL_PC_05"); int iFalse; if(!GetIsPC(oPC)) return; if(GetLocalInt(oEnc, "FIGHT!")) return; // Енкаучер сработал if(sLl=="" && sL2 =="" && sL3=="" && sL4=="" && sL5=="") return; if(GetLocalInt(oPC, sLl) || GetLocalInt(oPC, sL2) || GetLocalInt(oPC, sL3) || GetLocalInt(oPC, sL4) || GetLocalInt(oPC, sL5)) { return; } if(i == 0) // Если 0, то отключаем { // Манчи плачут на взрыд... return; } else if(GetEncounterActive(oEnc) == FALSE) { if (f == 0.0) f = 600.0; // 10 минут, стандартный респавн SetEncounterActive(TRUE); DelayCommand(1.0, SetEncounterActive(FALSE, oEnc)); SetLocalInt(oEnc, "FIGHT!", TRUE); // Тут самое интересное. Неактивный енкаучер DelayCommand не исполняет // поэтому я попросил это сделать локацию, в котором он стоит. Она вроде // как не против... SetLocalInt(oEnc, "NUMBER", i-1); AssignCommand(oArea, DelayCommand(f, SetLocalInt(oEnc, "FIGHT!", FALSE))); } else return; } |
![]()
Сообщение
#20
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
НПС после нападения становится нейтральным и начинает диалог с РС. В свойствах НПС поставь Immortal галочку. Что бы не убить его с одного удара.
NSS //------------------------------------------------------------------------------ // Добавляем на хертбит Нпс. //------------------------------------------------------------------------------ object oSelf = OBJECT_SELF; object oPC = GetFirstPC(); // Это самое простое. Можно узнать по демагу или ближайший крич int iCurHP = GetCurrentHitPoints(oSelf); // Количество поинтов максимум о Нпс int iMaxHP = GetMaxHitPoints(oSelf); // Сколько в данный момент if(!GetLocalInt(oSelf, "STOP")) { if (iCurHP < iMaxHP/4) // Четверть нр от общего или меньше { // Если это враг то меняем ему фракцию на комманера. Если нет, то убери эту строку ChangeToStandardFaction(oSelf, STANDARD_FACTION_COMMONER); SetLocalInt(oSelf, "STOP", TRUE); AssignCommand(oPC, ClearAllActions(TRUE)); AssignCommand(oSelf, ClearAllActions(TRUE)); ClearPersonalReputation(oPC, oSelf); AssignCommand(oSelf, PlayAnimation(ANIMATION_LOOPING_TALK_PLEADING, 1.0, 5.0)); DelayCommand(0.3, SetCommandable(FALSE, oPC)); DelayCommand(1.5, AssignCommand(oSelf, SpeakString("Дядя, простите, я больше так не буду!"))); /* Тут описываешь важнецкие клятвы в верности, слезные истории про трудное дество... */ DelayCommand(5.0, AssignCommand(oSelf, ActionMoveToObject(oPC))); DelayCommand(5.4, AssignCommand(oSelf, ActionDoCommand(SetCommandable(TRUE, oPC)))); DelayCommand(5.6, AssignCommand(oSelf, ActionStartConversation(oPC))); } } //------------------------------------------------------------------------------ Появление строки в диалоге Нпс. Строка диалога равна имени ближайшего поинта с тагом WP_STRING. Строка дожна быть в диалоге всегда ОДНА и содержать токен <CUSTOM220>. А содержание = имя вейпоинта. NSS //:://////////////////////////////////////////////
//:: Выдает стринг, если НПС рядом с поинтом //:: Copyright © 2006 WRG! //::////////////////////////////////////////////// /* Таг нашего поинта. WP_STRING <CUSTOM220> - [Имя поинта - строка НПС] */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 17.01.2006 //::////////////////////////////////////////////// int StartingConditional() { object oWp = GetNearestObjectByTag("WP_STRING"); // Берем ближайший объект с тагом "WP_STRING" float fDist = 20.0f; // Расстояние реакции, дальше 20 метров строки не будет float fZone = GetDistanceBetween(OBJECT_SELF, oWp); // Дистанция срабатывания //------------------------------------------------------- if(GetIsObjectValid(oWp)) // Если такой объект существует { if (fDist < fZone) // Если дистанция между Нпс и Поинтом больше установленной 20 м. return FALSE; // Строка не появится else // в противном случае (ЕЩЕ) { string sMessage = GetName(oWp); // Стринг sMessage равен имени поинту SetCustomToken(220, sMessage); // Установим токен 220 равный этому стрингу return TRUE; // Вернем строку функции StartingConditional(). Она покажет ее игроку } } else return FALSE; // Если такого объекта oWp нет, то нечего не появится } |
![]()
Сообщение
#21
|
|
Level 3 ![]() Класс: Монах Характер: Lawful Good Раса: Эльф ![]() |
А этот скрипт на проверку игрока в другой локации,куда вставлять?Aiwan не указал(
Neverwinter Script int StartingConditional() { object oPC = GetPCSpeaker(); //------------------------------------------------------- if (GetTag(GetArea(OBJECT_SELF))=="ТАГ_ЛОКАЦИИ") { return TRUE; } return FALSE; } В этом скрипте (скрипт для сидения на стуле)при нажатии F7 выдает ошибку в 10,11 пунктах,он неправильный ,исправьте и проверьте его в игре пожалуйста,я тоже хочу его использовать в своем модуле,только этот вариант не работает: (IMG:style_emoticons/kolobok_light/sad.gif) Neverwinter Script void main() { object oPC = GetLastUsedBy(); // последний, кто использовал объект (кликнул по нему) object oChair = OBJECT_SELF; // стул if (GetIsPC(oPC)) // если использовавший является PC { // если на стуле ни кто не сидит if (!GetIsObjectValid(GetSittingCreature(oChair))) { AssignCommand(oPC, ActionSit(oChair)); // разрешаем PC сесть } // если стул занят объектом (уже кто-то сидит) else if (GetIsObjectValid(GetSittingCreature(oChair))) { AssignCommand(oPC, ClearAllActions()); // чистим PC акции } } } Ошибку выдает вот тут AssignCommand(oPC, ActionSit(oChair)); Сообщение отредактировал Sugo77 - May 14 2008, 22:06 |
![]()
Сообщение
#22
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
|
![]() ![]()
Сообщение
#23
|
|
Level 4 ![]() ![]() Класс: Друид Характер: True Neutral Раса: Человек ![]() |
Товарищи, я бы хотел сделать заклинание glyph of warding(символ охраны) эпическим, тоесть усилить его, в принцыпе это для меня было не сложно, вопрос возник в скриптах, так как я в скриптах не разбираюсь вообще(недавно только самоучитель скачал),
я хочу вас попросить написать мне пример этого скрипта обьяснить где что менять и куда писать потом адрес на скрипт! |
![]()
Сообщение
#24
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Вопрос не по этой теме. Задай в теме вопросов по скриптам. На это сообщение отвечать не надо.
|
![]()
Сообщение
#25
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Да, хороший скрипт, который отправляет непися в точку и уничтожает. А когда неписей много (простая сценка: герой освобождает узников, и они бегут к двери тюрьмы, осыпая героя благодарностями. Писать для каждого непися отдельный скрипт с разными репликами? А если попробовать так:
Neverwinter Script void main() { object oPC = GetFirstPC(); object oNPC = OBJECT_SELF; object oDE = GetObjectByTag("DESTR_" +GetTag(oNPC)); object oWP = GetObjectByTag("WP_SPEAK_" + GetTag(oNPC)); string oName = GetName(oWP); AssignCommand(oNPC,ClearAllActions()); DelayCommand(0.0,ActionPauseConversation()); DelayCommand(1.0, SpeakString(oName)); DelayCommand(1.5,AssignCommand(oNPC, ActionForceMoveToObject(oDE, TRUE))); DelayCommand(2.0,ActionDoCommand(DestroyObject(oNPC))); } Фмшка тут в невидимых объектах с тегами "DESTR_ + тег непися, которого к этому объекту посылаешь, и вейпе "WP_SPEAK_ + тег непися, в имени которого мы пишем все, что нам надо, и неписи бодро эти имена вейпов цитируют перед забегом. Универсальный скрипт, один для всех неписей. Кстати, если уничтожать не надо, а тртебуется просто послать непися в определенной место, с нужной репликой, скрит такой же, только без последней строчки. И невидимый объект я тогда ставлю не "DESTR_" , а "PLACE_", но это уже чтобы не путаться. Или почти также, но чуть более иначе. К примеру, в моей сказке герой бывает часто (очень часто) озадачен, даже ошарашен. В диалоге появляется строка: "<StartAction>[Присесть. Почесать репу.]</Start>", жмешь не нее, и происходит следующее: Neverwinter Script void main() { object oPC = GetPCSpeaker(); object oTaget = GetArea (oPC); object oWP = GetNearestObjectByTag("WP_SPEAK_" + GetTag(oTaget)); string oName = GetName(oWP); AssignCommand (oPC, SpeakString(oName)); DelayCommand(0.0,ActionPauseConversation()); DelayCommand(0.1,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_L OOPING_SIT_CROSS,1.0f,3.0f))); DelayCommand(0.6,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_F IREFORGET_PAUSE_SCRATCH_HEAD))); DelayCommand(1.0,ActionResumeConversation()); } Герой, понятное дело, тега не имеет (или мы его не знаем?) . Вейп "WP_SPEAK_" привязан, как видим, к местности. То есть с помощью одного скрипта в кажой локации герой может брякнуть что-то эксклюзивное. Что именно - опять таки пишем в имени вейпа. Кстати, к тегу местности можно привязать и реплику непися, если тег самого непися уже использован в другой реплике. И подобных универсальных скриптов у меня в сказке много. К примеру, непись ведет героя опять же к определенной точке, произнося реплику, открывая дверь "DOOR_ + тег непися (местности)". И т. д., и т. п. Даже скрипт с заменой имени персонажа (с вопроса о нем я впервые вышел на форум "Вопросы новичков") я сделал униврсальным (пришлось много кого переименовывать). И теперь он выглядит так: Neverwinter Script void main() { void main() { object oPC = GetFirstPC(); object oNPC = OBJECT_SELF; object oSet = GetObjectByTag("SETNAME_" + GetTag(oNPC)); string Ona = GetName(oNPC); string Oname = GetName(oSet); DeleteLocalString(oNPC, Ona); SetName(oNPC,Oname); } Потому хотел бы спросить у мастеров совета. Может, я делаю ошибку? Вдруг это стремление к универсальности имеет обратную сторону? Ну, к примеру, движок перегружает или еще какой вред? Спасибо. |
![]() ![]() |
Текстовая версия | Сейчас: 28th April 2025 - 01:04 |