Скрипты для новичков, Самые простые скрипты с описанием |
Здравствуйте, гость ( Вход | Регистрация )
Скрипты для новичков, Самые простые скрипты с описанием |
Aug 23 2005, 17:53
Сообщение
#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 --------------------------------------- } } |
Jul 30 2011, 18:53
Сообщение
#2
|
|
Level 6 Класс: Маг Характер: Lawful Evil Раса: Нежить |
Наверное, многим известно, что к 1.69 галочка "No interrupt", регулирующая, может ли игрок тем или иным образом прервать диалог, перестала работать. Что очень плохо для синглплеерных модулей - зачастую преждевременное прерывание диалога может либо разрушить всю игровую логику, либо нагрузить скриптера кучей лишних проверок. Чтобы этого избежать, можно воспользоваться функционалом катсцен.
Стандартные OnConversation всех NPC в конечном итоге приводят к NW_C2_DEFAULT4, который и надо поменять следующим образом, добавив две строчки (выделены жирным): Neverwinter Script //::////////////////////////////////////////////////// //:: NW_C2_DEFAULT4 /* Default OnConversation event handler for NPCs. */ //::////////////////////////////////////////////////// //:: Copyright © 2002 Floodgate Entertainment //:: Created By: Naomi Novik //:: Created On: 12/22/2002 //::////////////////////////////////////////////////// #include "nw_i0_generic" void main() { // * if petrified, jump out if (GetHasEffect(EFFECT_TYPE_PETRIFY, OBJECT_SELF) == TRUE) { return; } // * If dead, exit directly. if (GetIsDead(OBJECT_SELF) == TRUE) { return; } // See if what we just 'heard' matches any of our // predefined patterns int nMatch = GetListenPatternNumber(); object oShouter = GetLastSpeaker(); if (nMatch == -1) { // Not a match -- start an ordinary conversation if (GetCommandable(OBJECT_SELF)) { ClearActions(CLEAR_NW_C2_DEFAULT4_29); SetCutsceneMode(GetFirstPC()); //ДОБАВЛЕНО BeginConversation(); } else // * July 31 2004 // * If only charmed then allow conversation // * so you can have a better chance of convincing // * people of lowering prices if (GetHasEffect(EFFECT_TYPE_CHARMED) == TRUE) { ClearActions(CLEAR_NW_C2_DEFAULT4_29); SetCutsceneMode(GetFirstPC()); // ДОБАВЛЕНО BeginConversation(); } } // Respond to shouts from friendly non-PCs only else if (GetIsObjectValid(oShouter) && !GetIsPC(oShouter) && GetIsFriend(oShouter)) { object oIntruder = OBJECT_INVALID; // Determine the intruder if any if(nMatch == 4) { oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER"); } else if (nMatch == 5) { oIntruder = GetLastHostileActor(oShouter); if(!GetIsObjectValid(oIntruder)) { oIntruder = GetAttemptedAttackTarget(); if(!GetIsObjectValid(oIntruder)) { oIntruder = GetAttemptedSpellTarget(); if(!GetIsObjectValid(oIntruder)) { oIntruder = OBJECT_INVALID; } } } } // Actually respond to the shout RespondToShout(oShouter, nMatch, oIntruder); } // Send the user-defined event if appropriate if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE)); } } Необходимо также поменять стандартный скрипт выхода из диалога nw_walk_wp, чтобы отменить повешанную ранее катсцену: Neverwinter Script #include "NW_I0_GENERIC" void main() { DelayCommand(1.2f,SetCutsceneMode(GetFirstPC(),FALSE)); WalkWayPoints(); } Задержка в 1.2f здесь необязательна, но избавляет от резкого рывка камеры по выходу из диалога. По такому же принципу меняются и все другие скрипты. Например, скрипт для размещаемых объектов x0_startconv: Neverwinter Script void main()
{ SetCutsceneMode(GetFirstPC()); ActionStartConversation(GetLastUsedBy()); } Сообщение отредактировал Talarasha - Jul 30 2011, 18:54 |
Текстовая версия | Сейчас: 7th June 2024 - 02:14 |