![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2086
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
NSS void main() (IMG:style_emoticons/kolobok_light/prankster2.gif) { object oPC = GetEnteringObject(); if(GetIsDM(oPC)) // дм { //...проверка по ключам/IP/спец итему и т.п.. - для извращенцев } else if(GetPlotFlag(oPC)) // может злобный ДМ в квесте повесит плот на игрока, а тот вылетит/перезайдет { SetPlotFlag(oPC, 0); BootPC(oPC); } else if(!GetXP(oPC)) // новый чар или тупящий нуб с софтом { SetXP(oPC, 1); BootPC(oPC); } else // плеер.. { } } QUOTE поставить чек на локу не на локу!
|
![]()
Сообщение
#2087
|
|
Level 6 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить NWN: Скриптинг [PW] ![]() |
да там по разному можно, главное суть
Ссылка, по которой вы попали на эту страницу является «мертвой» или удаленной. Сообщение отредактировал [MoF]Darth_Nick - Mar 24 2006, 04:01 |
![]()
Сообщение
#2088
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
NSS // в не_пвп все ПЦ дружелюбны (IMG:style_emoticons/kolobok_light/blum3.gif)
object oPC = OBJECT_SELF; object oTarget = GetSpellTargetObject(); if(GetIsReactionTypeFriendly(oPC, oTarget)) return; |
![]()
Сообщение
#2089
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
Привет,
Обясните плс. (долбался долго...честно), как сделать невидимую дверь, я уже спрашивал и по способу, какой мне посоветовали у меня (IMG:style_emoticons/kolobok_light/sad.gif) . Нужно так, вы заходите в локу, разговариваете с НПС, а после вы уже видите дверь..... |
![]()
Сообщение
#2090
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
создавать на вейпоинте объект двери после определенных действий (или варианта в диалоге) игрока
а если дверь еще необходимо найти, то можно создать триггер, он_ентер которого будет запускать (перезапуск если GetIsInSubArea(...) ) каждые 6 сек. проверки на серч, при удачной - появляется дверь на триггере примеры: nw_o2_detectdoor - древний вариант x2_**_secretdoor - ХоА вариант с хертбитами.. лучше написать что-то своё если для шарда делается |
![]()
Сообщение
#2091
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(2_advanced @ Mar 24 2006, 18:01) [snapback]73968[/snapback] Привет, Обясните плс. (долбался долго...честно), как сделать невидимую дверь, я уже спрашивал и по способу, какой мне посоветовали у меня . Нужно так, вы заходите в локу, разговариваете с НПС, а после вы уже видите дверь..... В диалоге вызови потайную дверь из стандартной палитры скриптом…, тогда точка перемещения будет иметь тег ”DST_DOOR_SEC_1”. NSS void main() { object oWP = GetWaypointByTag("WP_XXX");// точка вызова двери location Loc = GetLocation(oWP); object oDoor = CreateObject(OBJECT_TYPE_PLACEABLE, "x0_sec_door1", Loc, TRUE, "DOOR_SEC_1"); // Объект дверь } Можно сделать и свою синьку двери, но нужно повесить на слот OnUsed скрипт перемещения (x0_o2_use_wdoor), или можно взять скрипт Айва из базы скриптов для новичков, или можешь воспользоваться моей версией. Если хочешь использовать секретный триггер, то вот краткая справка: Секретный объект Триггер содержит в названии ResRef объкта, который появится. Точка, где появится объект LOC_+Тег триггера. Тег точки перемещения DST_+Тег триггера. NSS //:://////////////////////////////////////////////
/* УНИВЕРСАЛЬНЫЙ СКРИПТ ПЕРЕМЕЩЕНИЙ ГЕРОЯ */ //::////////////////////////////////////////////// void JumpFirstPC(object oWP) { object oPC = GetFirstPC(); object oSP = GetHenchman(oPC); object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oPC); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oPC); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC); AssignCommand(oPC, ClearAllActions()); AssignCommand(oSP, ClearAllActions()); AssignCommand(oAnimal, ClearAllActions()); AssignCommand(oFamiliar, ClearAllActions()); AssignCommand(oDominated, ClearAllActions()); AssignCommand(oSummoned, ClearAllActions()); AssignCommand(oPC, JumpToObject(oWP)); AssignCommand(oSP, JumpToObject(oWP)); AssignCommand(oAnimal, JumpToObject(oWP)); AssignCommand(oFamiliar, JumpToObject(oWP)); AssignCommand(oDominated, JumpToObject(oWP)); AssignCommand(oSummoned, JumpToObject(oWP)); } void main() { object oPC = GetFirstPC(); object oSP = GetHenchman(oPC); object oPoint = GetWaypointByTag("TP_" + GetTag(OBJECT_SELF)); if (!(GetLocked(OBJECT_SELF) == TRUE)) // если замок открыт { DelayCommand(0.1, ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN)); DelayCommand(2.6, JumpFirstPC(oPoint)); // перемещаем всю компанию DelayCommand(6.6, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE)); } else { AssignCommand(OBJECT_SELF, SpeakString("Замок закрыт")); int nSkill = 20 + GetSkillRank(SKILL_OPEN_LOCK, oSP); if (nSkill >= GetLockUnlockDC(OBJECT_SELF)) // если спутник может открыть замок AssignCommand(oSP, SpeakString("Попробуй открыть, не получитсЯ Я сам открою!")); else AssignCommand(oSP, SpeakString("Мне не осилить этот замок…")); } } // помещать в слот OnUsed OnEnter OnClick OnAreaTransitionClick //Перемещение героя и спутников для размещаемых объектов Сообщение отредактировал gennady - Mar 27 2006, 09:01 |
![]()
Сообщение
#2092
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Вот код скрипта. Вешаешь на триггер на OnEnter, на триггере вешаешь локальные стринги PLC_ResRef == ресрефу твоей создаваемой двери. Можешь серетный шкаф даже, любой предмет PLC_ и когда РС наступит на триггер, то произойдет проверка его ДС в случае успеха, выдаст ему дверь или еще что. Можешь наложить на твою дверь все что надо скриптом, напиши скрипт и присвой на триггер стрингом RUN_SCRIPT. Имя триггера - стринг над РС. Типа, О! Я нашел дверь! Так же хеньчманы боолтают и указывают что надо тут быть внимательным.
NSS //:://////////////////////////////////////////////
//:: OnEnter am_ten_searh_plc //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* ПРИ УСПЕШНОЙ ПРОВЕРКЕ СКИЛА ПОИСК, СОЗДАЕМ PLC. ResRef создаваемого объекта равен локальному стрингу "PLC_ResRef". Создаем рандомно на случайной локации или специально на месте объекта "SECRET_PLC_"+[Таг Триггера] Поле триггера KeyTag - сложность проверки скилла: DC_EASY = 0; DC_MEDIUM = 1; DC_HARD = 2; Локалка "ACTION_MODE_DETECT" устанавливает свойство триггера, он сработает только когда РС в режиме обнаружения. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 02.01.2006 С новым Годом! //::///////////////////////////////////////////// #include "nw_i0_tool" /* Функция рандомной локации, написана Баалом. */ location CreateRandomLocation(object oTarget, float fRadius, int bOnLine = TRUE) { if(!bOnLine) fRadius=IntToFloat(Random(FloatToInt(fRadius))); float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget))); float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget))); float fRndomAngle=IntToFloat(Random(360)); location lNEW=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadius*sin(fRndomAngle)),360.0); return lNEW; } void main() { object oPC = GetEnteringObject(); object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC); object oSelf = OBJECT_SELF; string sMessage = GetName(oSelf); // Сообщение при обнаружении предмета string sHench1 = GetLocalString(oSelf, "HENCHMAN_string_1"); string sHench2 = GetLocalString(oSelf, "HENCHMAN_string_2"); string sHench3 = GetLocalString(oSelf, "HENCHMAN_string_3"); string sHench4 = GetLocalString(oSelf, "HENCHMAN_string_4"); string sHench5 = GetLocalString(oSelf, "HENCHMAN_string_5"); int iDC = StringToInt(GetLockKeyTag(oSelf)); // Сложность проверки скилла if(!GetIsPC(oPC)||GetIsInCombat(oPC)||GetLocalInt(oSelf, "DEACTIVATED")) return; if(!GetActionMode(oPC, ACTION_MODE_DETECT) && GetLocalInt(oSelf, "ACTION_MODE_DETECT")) { if (GetIsObjectValid(oHench)) // Хеньчман нас предупреждает, что тут что-то есть { if(!GetLocalInt(oSelf, "HENCHMAN_SPEAK")) { SetLocalInt(oSelf, "HENCHMAN_SPEAK", TRUE); DelayCommand(0.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_SEARCH))); DelayCommand(0.21, AssignCommand(oHench, SpeakString(sHench1))); } } if(GetGameDifficulty() == GAME_DIFFICULTY_EASY || !GetLocalInt(GetModule(), "DEBAG_PC")) SendMessageToPC(oPC, "<cу >ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.</c>"); return; } SetLocalInt(oSelf, "DEACTIVATED", TRUE); string sResRef = GetLocalString(oSelf, "PLC_ResRef"); // Объект создаваемый float f = GetLocalFloat(oSelf, "DISTANCE"); // Расстояние от РС для находки if(f==0.0) f = 5.0; // Если нет, то по умолчанию 5 метров радиус location lLoc = CreateRandomLocation(oPC, f); object oPlc = GetNearestObjectByTag("SECRET_PLC_"+GetTag(oSelf)); // Если конкретное место string sNewTag; if(oPlc != OBJECT_INVALID) { lLoc = GetLocation(oPlc); sNewTag = GetTag(oPlc); } if(AutoDC(iDC, SKILL_SEARCH, oPC)) { if(sResRef != "") { effect eEffect = EffectVisualEffect(VFX_FNF_DISPEL); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eEffect, lLoc, 4.0); object oNewPlc = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lLoc,0,sNewTag); string sRunScript = GetLocalString(oSelf, "RUN_SCRIPT"); if(sRunScript!="") DelayCommand(2.0, ExecuteScript(sRunScript, oNewPlc)); AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_LOOKHERE)); if(sMessage == "Объект + [Текст над РС]") sMessage = ""; AssignCommand(oPC, SpeakString(sMessage)); SendMessageToPC(oPC, "<c у >Вы обнаружили секретный объект.</c>"); AssignCommand(oPC, ClearAllActions()); AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPositionFromLocation(lLoc)))); DelayCommand(0.3, SetCommandable(FALSE, oPC)); DelayCommand(2.0, SetCommandable(TRUE, oPC)); if (GetIsObjectValid(oHench)) { AssignCommand(oHench, ClearAllActions()); AssignCommand(oHench, SetFacingPoint(GetPositionFromLocation(lLoc))); if(GetLocalInt(oSelf, "HENCHMAN_SPEAK")) { DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_THANKS))); DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench2))); } else { DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_YES))); DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench3))); } } } else { // Если мы забыли написать ResRef предметов, то ошибка SendMessageToPC(oPC, "<cу >ОШИБКА!</c> Не могу создать объект. Нет ResRef-а!"); } } else { if(GetLocalInt(oSelf, "HENCHMAN_SPEAK")) { AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_CANTDO)); AssignCommand(oPC, SpeakString("Ты ошибаешься. Я ничего не нахожу.")); DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_YES))); DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench4))); DelayCommand(6.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_BADIDEA))); DelayCommand(6.21, AssignCommand(oHench, SpeakString(sHench5))); } } } |
![]()
Сообщение
#2093
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
NSS const string _DOOR_RES = "x0_sec_tdoor1";
void chk() { location lWP = GetLocalLocation(OBJECT_SELF, "_DOOR"); if(GetDistanceBetweenLocations(lWP, GetLocation(OBJECT_SELF)) < 1.0f) { object oDoor = CreateObject(OBJECT_TYPE_PLACEABLE, _DOOR_RES, lWP); ActionResumeConversation(); // возобновляет диалог с того места, где остановился } else { if(GetCurrentAction() != ACTION_MOVETOPOINT) ActionMoveToLocation(lWP); DelayCommand(3.0f, chk()); } } void main() { object oWP = GetWaypointByTag(GetTag(OBJECT_SELF)); // тег вейпоинта = тегу НПС if(GetIsObjectValid(oWP)) { ActionPauseConversation(); // прервать диалог до момента создания двери SetLocalLocation(OBJECT_SELF, "_DOOR", GetLocation(oWP)); // можно возвращать НПС на место после диалога.. SetLocalLocation(OBJECT_SELF, "_ORIG", GetLocation(OBJECT_SELF)); AssignCommand(OBJECT_SELF, chk()); } else { // ... } } |
![]()
Сообщение
#2094
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
Привет,
Впринципе, почти понял. Пока только один вопрос: - после содания этой двери, мне нужно на onAreaTransitionClick скрипт поставить. Я подумал так, мне нужно создать свою дверь мастером с этим самым скриптом, а потом именно ее вызывать? Извините за идиотизм :-\ |
![]()
Сообщение
#2095
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Nashman @ Mar 28 2006, 01:52) [snapback]74726[/snapback] после содания этой двери, мне нужно на onAreaTransitionClick скрипт поставить. нет, у этой двери нет такой штуки (areatransition это та голубенькая фигулина, на которую кликаешь при переходе меж дверьми). Так что у этой двери на onUse Дверь сделать, чтобы в палитре была. скриптом ее в нужном месте создавать. |
![]()
Сообщение
#2096
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
Привет,
Лекс, ты уж меня извени, но у меня есть такая штука, сначала идет она. За ответ спасибо, эжжто то, что мне не хватало, тоесть проэкту (IMG:style_emoticons/kolobok_light/smile.gif) .. |
![]()
Сообщение
#2097
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Скрипт на такую дверь есть в разделе скриптов новичков.
|
![]() ![]()
Сообщение
#2098
|
|
Level 1 Класс: Варвар Характер: True Neutral Раса: Полуорк ![]() |
Превед Кросавчеги. Я вернулся , ну вы чо не рады что ли . Ну и ладно ! У меня вопрос , а не подскажет мне кто-нибудь как сделать так чтобы монстрятник при появлении в локе летел к месту где находится твой перс .
|
![]()
Сообщение
#2099
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Ставь точку спавна в том месте где перс может появиться. Или рядом.
|
![]()
Сообщение
#2100
|
|
Level 1 Класс: Волшебник Характер: Chaotic Neutral Раса: Полуэльф ![]() |
Всем Превед!
У меня вопрос: как присвоить нпс'у новый диалог с помощью скрипта. Фишка в том, что старый диалог весьма велик и изобилует скриптами. Новый по размерам не меньше, и тоже с кучей скриптов(20-30 штук). Ставить лок. пременную на все ветки диалога - можно замучиться. Искал что-то вроде "setdialog" - ничего не нашел. Помогите! |
![]()
Сообщение
#2101
|
|
Level 6 ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить NWN: Скриптинг [PW] ![]() |
в OnConversation нпс есть абзац:
NSS if (GetCommandable(OBJECT_SELF)) { ClearActions(CLEAR_NW_C2_DEFAULT4_29); BeginConversation(); } ставиш проверку на локалки и изменяеш аргументы ф-ции..к примеру: NSS if (GetCommandable(OBJECT_SELF)) { ClearActions(CLEAR_NW_C2_DEFAULT4_29); if(GetLocalInt(OBJECT_SELF,"SSS") == 1) BeginConversation("dlg1",oShouter); else BeginConversation("dlg2",oShouter); } еще надо прикрутить проверку на таг или индивидуальный скрипт для нпс Сообщение отредактировал [MoF]Darth_Nick - Mar 30 2006, 09:50 |
![]()
Сообщение
#2102
|
|
Level 8 ![]() ![]() ![]() Класс: Теневой Танцор Характер: True Neutral Раса: Эльф ![]() |
Благодарим, еще вопрос, я пытался сделать генерацию книг, как в Проклятии Левора, как описывал Айван, но ничего не вышло. Пытался долго и муторно, по-моему это довольно непростой скрипт. И еще, локалка это LocalInt в переменных?
|
![]()
Сообщение
#2103
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Там надо сделать одну книгу и потом копу/едит делать все остальные. Все там работает.
|
![]()
Сообщение
#2104
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Еще раз увижу ПРЕВЕД или КРАСАВЧЕГИ - влеплю пред. Юзверей с одним сообщением забаню.
|
![]()
Сообщение
#2105
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Вот работающий скрипт из моего мода ПВ.
Создаешь предмет с тагом и РесРефом AM_ITM_BOOK001. Потом Копу/едит делаешь себе сколько надо, например 25 штук. Дальше. Открываешь свойства модуля и в адвансед, присваиваешь локальную переменную ALL_BOOKS_IN_MODULES равную 25. На шкафу вешай переменную BOOKS равную столько, сколько тебе нужно книг в шкафу при открытии. Не повесишь будет одна. И все. NSS //::////////////////////////////////////////////// //:: OnOpen am_pop_bookshelf //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Скрипт генирирует книги в инвентарь шкафа. Локальная переменная "BOOKS" на объекте означает количество генерируемых книг. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 23.07.2005 //::///////////////////////////////////////////// void main() { //------------------------------------------------------------------------- // Количество книг в палитре. Присваиваем на модуль "ALL_BOOKS_IN_MODULES" //------------------------------------------------------------------------- int iBook = GetLocalInt(GetModule(), "ALL_BOOKS_IN_MODULES"); int iNum = GetLocalInt(OBJECT_SELF, "BOOKS"); // Сколько создаем в шкафу if (GetLocalInt(OBJECT_SELF, "HAS_OPERATED")) // Сработает один раз { return; } while(iNum >= 1) // Пока количество создаваемых книг больше или равно 1. { //------------------------------------------------------------------------- // Кстати... У меня ResRef-ы am_itm_book001 ... am_itm_book021, поэтому // я извратился немного, лень было переделать книги... Но так проще создать // много одинаковых книг, цифры сами генерятся редактором, вы только // создаете первую, а дальше Изменить/Сохранить и все. //------------------------------------------------------------------------- int i = Random(iBook)+1; // Гененрируем случайную унигу string sN = "0"; string sNN = "0"; if (i >=100) {sNN ="";} if (i >=10) {sN ="";} object oBook = CreateItemOnObject("am_it_book"+sNN+sN+IntToString(i)); iNum--; //Создали одну книгу. Отняли от количества еденичку... } SetLocalInt(OBJECT_SELF,"HAS_OPERATED",TRUE); // Запомним что уже сработал } QUOTE(Elf-Drow @ Mar 30 2006, 17:49) [snapback]75275[/snapback] И еще, локалка это LocalInt в переменных? Да. |
![]()
Сообщение
#2106
|
|
Level 3 ![]() Класс: Тайный Лучник Характер: Chaotic Good Раса: Эльф ![]() |
Суть:
Есть N обьектов с одинаковыми тэгами. и есть обьект с тегом в конце "00". Нужно сделать: 1) на месте обьекта появляется костерчик, обьет исчезает. (первый 00) 2) загорается ближайший к нему из N обьектов, обьет исчезает. 3) загорается следующий и так далее.. КОД: NSS void main() { int iN; location lLoc; object oFire = GetObjectByTag("PLC_DRM_F00"); if (GetLocalInt(OBJECT_SELF, "Counter") == 1) return; else SetLocalInt(OBJECT_SELF, "Counter", 2); while (oFire != OBJECT_INVALID || iN < 10) { lLoc = GetLocation(oFire); DestroyObject(oFire, 0.0f); oFire = GetNearestObjectByTag("PLC_DRM_F01", GetNearestObjectByTag("PLC_DRM_FR", OBJECT_SELF)); CreateObject(OBJECT_TYPE_PLACEABLE, "plc_flamelarge", lLoc, FALSE, "PLC_DRM_FR"); iN ++; } } ! Счетчик юзания триггера отключен специально! Результаты работы: при первом нахождении на триггер: 1) загорается обьект "..00" 1 костром. 2) загорается соседний 9 кострами. конец. при повторном нахождении горит соседний 10 кострами.. Спрашивается.. "Какого **ра?" (IMG:style_emoticons/kolobok_light/biggrin.gif) |
![]()
Сообщение
#2107
|
|
Level 8 ![]() ![]() ![]() Класс: Теневой Танцор Характер: True Neutral Раса: Эльф ![]() |
Пара вопросов по скриптам, приведенным в Проклятии Левора.
1 - Какой скрипт нужен и куда его ставить, чтобы НПС говорили фразы, то есть названия вейпоинтов, находящихся вокруг них ( Говорящие НПС в Проклятии) 2 - Как ваша команда создала такой шедевр как карта? Создание моделей в 3D-MAX, а затем вставка в игру? Диалог, а затем скрипт с появляющейся картинкой и отправление к месту назначения? И как вы сделали, что бой по дороге может быть на случайной миле, т.е. Там на 11, 23, хоть на какой? Заранее благодарю. |
![]()
Сообщение
#2108
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
1. Строка дожна быть в диалоге всегда ОДНА и содержать токен <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 нет, то нечего не появится } 2. Карта и ее скрипты очень сложны. Не берись пока за это. Созреешь до сложных скриптов поговорим. |
![]()
Сообщение
#2109
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
А чего ты хотел? БЕРЕМ БЛИЖАЙШИЙ и насилуем его девять раз. (IMG:style_emoticons/kolobok_light/smile.gif) Тебе надо брать все объекты и перебирать по параметрам свои костры.
Нужен скрипт на факела-костры-жаровние? Вот мой скрипт запускается ExecuteScript на локацию. Суть такая. Создаешь два объекта один горящий, другой потухший. На этих объектах в палитре вешаешь стриги ResRef-ы объектов что создаем вместо существующего. Например на плейсе AM_PLS_TORCH_ON стринг NEW_ResRef будет равен am_pls_torchoff. И на оборот. Годится скрипт для чего хошь. Днем объект создается, ночью дестроится. Вешай на вход в локацию. Или на хертбит с проверкой в локации ли РС. NSS //:://////////////////////////////////////////////
//:: OnEnter am_exe_torch_del //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* ВКЛЮЧАЕМ ОГОНЬ ФАКЕЛОВ И ЗВУК К НИМ НОЧЬЮ. Таг факела = "AM_PLS_TORCH_OFF". Он должен быть с в палитре с моделью факела без амбиент анимации. Именно его и надо расставить в локации. Иначе будет свет от факела гореть над ним. Его ResRef "am_pls_torchoff" Таг горящего факела = "AM_PLS_TORCH_ON" ResRef "am_pls_torchon" Звуковой объект ставим рядом с факелом, помните его таг ДОЛЖЕН БЫТЬ УНИКАЛЬНЫМ ВО ВСЕМ МОДУЛЕ. Иначе не сработает. К примеру таг моего звука, равен тагу триггера плюс порядковый номер, начиная с еденицы: AM_SOUND_TORTCH_(порядковый номер = i). Расставляйте на локации факела и звуки рядом. "NEW_ResRef" Локальный стринг ResRef-а объекта, который создаем на месте этого. Все готово! LocalInt "AREA_TORCH_ON_OFF" - запускает на локацию. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 08.06.2005 //::///////////////////////////////////////////// void main() { int i=1; // Первый порядковый номер тага звука float f=0.5; // Задержка дестроя string sSound = GetTag(OBJECT_SELF); // Приравнял таг Локации к звуовому object oTorch = GetFirstObjectInArea(OBJECT_SELF); object oSound = GetObjectByTag(sSound+IntToString(i)); // Звуковой объект effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_20); // Свет факела int nEvent = GetUserDefinedEventNumber(); //======================= USERDEINE EVENT 1000 ================================= if (GetIsDay() || GetIsDawn()) //---------------------------------- ДЕНЬ -------------------------------------- { while (GetIsObjectValid(oTorch)) { if (GetTag(oTorch) == "AM_PLS_TORCH_ON" && !GetLocalInt(oTorch, "DO")) /* Проверяем все объекты на локации, берем с нужным тегом и без локальной переменной, что с объектом уже выключен. */ { string sResRef = GetLocalString(oTorch, "NEW_ResRef"); SetLocalInt(oTorch, "DO", TRUE); DestroyObject(oTorch, f); CreateObject(OBJECT_TYPE_PLACEABLE,sResRef, GetLocation(oTorch)); f=f+0.2; // Сделай паузу! } if (GetIsObjectValid(oSound)) { DebugObject(oSound); SoundObjectStop(oSound); // Выключаем звук i++; // Присвоим объекту звука таг на единицу больше } oSound = GetObjectByTag(sSound+IntToString(i)); oTorch = GetNextObjectInArea(OBJECT_SELF); } return; } //======================= USERDEINE EVENT 3000 ================================= else if (GetIsNight() || GetIsDusk()) //----------------------------- НОЧЬ ------------------------------------------- { while (GetIsObjectValid(oTorch)) { if (GetTag(oTorch) == "AM_PLS_TORCH_OFF" && !GetLocalInt(oTorch, "DO")) { string sResRef = GetLocalString(oTorch, "NEW_ResRef"); SetLocalInt(oTorch, "DO", TRUE); DestroyObject(oTorch, f); object oTorchNew = CreateObject(OBJECT_TYPE_PLACEABLE,sResRef, GetLocation(oTorch)); DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oTorchNew)); f=f+0.2; // Сделай паузу! } if (GetIsObjectValid(oSound)) { DebugObject(oSound); SoundObjectPlay(oSound); // Включаем звук i++; // Присвоим объекту звука таг на единицу больше } oSound = GetObjectByTag(sSound+IntToString(i)); oTorch = GetNextObjectInArea(OBJECT_SELF); } } } |
![]()
Сообщение
#2110
|
|
Level 8 ![]() ![]() ![]() Класс: Теневой Танцор Характер: True Neutral Раса: Эльф ![]() |
Знаешь, Айван, вроде вы в Проклятии сделали так, чтобы Геркан был с героем одной расы, то есть ты гном он гном, ты эльф он эльф. Но это не работает! Я играю за эльфа, но Геркан у меня гном!
|
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 23:19 |