![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#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 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); } Потому хотел бы спросить у мастеров совета. Может, я делаю ошибку? Вдруг это стремление к универсальности имеет обратную сторону? Ну, к примеру, движок перегружает или еще какой вред? Спасибо. |
![]() ![]() |
Текстовая версия | Сейчас: 27th April 2025 - 07:15 |