![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2691
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(gennady @ Apr 17 2007, 09:10) [snapback]107205[/snapback] А где сами скрипты? И что там у тебя конкретно не получается? Из цикла: - "Привет ребзя! Хочу сделать свою модельку в НВН, скажите как?" *Народ пишет пять листов как нарисовать, количество полигонов, вокмехи, тулзы для импорта, ограничения...* - "Ух ты! Клева!" |
![]()
Сообщение
#2692
|
|
Level 2 ![]() Класс: Теневой Танцор Характер: Chaotic Neutral Раса: Человек ![]() |
блин, я плачу за трафик, а от стипендии уже ничего не осталось, не могу я весь формум перерывать.
я не знаю: - на что вешать скрипт, проверающии здровьие и при ранении телепортирующий. - я не знаю, как осуществить переход к обхекту на другой карте. |
![]()
Сообщение
#2693
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback] - на что вешать скрипт, проверающии здровьие и при ранении телепортирующий. так как игрок, проверять только на HeartBeat модуля или в скрипте default (ХБ игрока. Но если мультиплеерный модуль, лучше не использовать в данной ситуации). Ну или на HeartBeat самого НПС, который игрока долбает. так как можно попасть в просак, если игрок будет убит 1 ударом или как-то еще (есть варианты), то перед таким боем лучше вешать на игрока Immortale флаг (ф-я SetImmortale). Потом проверив ХП (ф-я GetCurrentHitPoints) и определив, что их мало, перемещаем игрока (ф-я ActionJumpToObject), предварительно отчистив стек действий игрока (ф-я ClearAllActions) и задав точку перемещения (ф-я GetObjectByTag). Если пишется в скрипте default - то игрок - просто OBJECT_SELF, если в HeartBeat модуля, то игрока надо определять нужным образом. Зависит уже от ситуации. да.. не забыть перед боем повесить локалку на игрока (SetLocalInt) о том, что он в сюжетном бою, а в скрипте по проверке ХП и переносе в точку проверять эту локалку (GetLocalInt) с тем, чтобы отсекать ситуации лишние. После перемещения локалку обнулить (SetLocalInt). Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback] блин, я плачу за трафик, а от стипендии уже ничего не осталось, не могу я весь формум перерывать. поиск попробовать можно. А вообще если такая беда, как можно четче формулируйте вопрос. И если пробуете писать сами скрипты, выкладывайте что получается и описание того, где проблема. зы: просто к людям, которые пробуют сами и что-то не получается отношение другое немного, более... положительное чтоли. А то, что вы уже написали как раз показывает ваши попытки сделать самостоятельно. Ну это так, на заметку. зыы: а если тупо нужен готовый скрипт с объяснениями, куда его ставить, то это тоже лучше сразу написать. (IMG:style_emoticons/kolobok_light/smile.gif) Чтобы не было недопонимания. |
![]()
Сообщение
#2694
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback] - я не знаю, как осуществить переход к обхекту на другой карте. Тогда запиши себе этот скрипт, поможет во многих ситуациях… Имя скрипта должно быть p_universal т.к. я использовал его в скрипте проверки урона и перемещения. Neverwinter Script Source //::////////////////////////////////////////////// //:: *** УНИВЕРСАЛЬНЫЙ СКРИПТ ПЕРЕМЕЩЕНИЙ *** //:: File name: p_universal //::////////////////////////////////////////////// // ***** ПЕРЕМЕЩЕНИЕ ГЕРОЯ ***** 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 oSelf = OBJECT_SELF; object oPoint = GetWaypointByTag("WP_" + GetTag(oSelf)); object oPC = GetFirstPC(); location lSmoke = GetLocation(oSelf); effect eSmoke = EffectVisualEffect(VFX_FNF_LOS_NORMAL_10); if ((GetArea(oPC) == GetArea(oSelf)&& GetDistanceBetween(oPC, oSelf) < 3.0) || GetIsPC(GetEnteringObject())) { ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eSmoke,lSmoke); DelayCommand(0.6, JumpFirstPC(oPoint)); } else AssignCommand(GetEnteringObject(), ClearAllActions()); } // Точка перемещения содержит WP_+Тег объекта Цитата(Вик Станжер @ Apr 17 2007, 13:15) [snapback]107220[/snapback] - на что вешать скрипт, проверающии здровьие и при ранении телепортирующий. И где скрипт? (IMG:style_emoticons/kolobok_light/biggrin.gif) Если нет, то попробуй повесить на перса, с которым будет драться герой, вот этот скрипт… Neverwinter Script Source //::////////////////////////////////////////////////// //:: Прекращение атаки //:: Слот: OnCombatRoundEnd //::////////////////////////////////////////////////// void main() { object oPC = GetFirstPC(); object oSelf = OBJECT_SELF; object oNPC = GetFirstObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE); int iMXP = GetMaxHitPoints(oPC)-10; // Настрой нужную величину… int iCXP = GetCurrentHitPoints(oPC); if (iMXP > iCXP) //Урон не менее 10 пунктов от мах { while (GetIsObjectValid(oNPC)) // Все существа в радиусе 30 метров { if(GetIsInCombat(oNPC)) { AssignCommand(oNPC, SurrenderToEnemies()); // Прекратим атаку AssignCommand(oNPC, ClearAllActions(TRUE)); } oNPC = GetNextObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE); } AssignCommand(oPC, SpeakString("Я сдаюсь... Прекратим бой!")); DelayCommand(1.5, ExecuteScript("p_universal", oSelf)); // Перемещение к точке WP_+Тег объекта } } P.S. Лекс правильно подметил о возможной смерти героя т.ч. учти это, в моем скрипте это не пробито… Но тут уже совсем другая история и другие варианты. Дерзай! Сообщение отредактировал gennady - Apr 17 2007, 14:17 |
![]()
Сообщение
#2695
|
|
Level 2 ![]() Класс: Теневой Танцор Характер: Chaotic Neutral Раса: Человек ![]() |
спасибо... все вроде пошло....
А то с начало перепутал названия скриптов и возникала такая ситуация: Выбегает хакер на площадку, там менты его должны повезать. А они к нему подходят и говорят: память отформатированна. Нуждаемся в переустановке операционной системы. (IMG:style_emoticons/kolobok_light/biggrin.gif) да и еще... на он перспейшен моба подвешен скрипт void main() { AssignCommand(GetObjectByTag("ag"), ActionStartConversation(GetFirstPC(), "sosed", FALSE, TRUE)); } при вхождении в зону видимости стоящего он должен вызывать диалог... но моб сломя голову несется через всю карту к игроку. что не так? я вообще правильно понял, что онперспейшен - это обнаружение? |
![]()
Сообщение
#2696
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Вик, описание эвента из NWN Lexicon'a:
Цитата The script attached to this event will fire whenever another creature perceives another creature or PC. Common uses of this script include having the creature yell a battle cry, greet the PC, or run away. Далее, если диалог должен начинать тот NPC, в эвенте которого стоит данный скрипт, то строка: Neverwinter Script Source AssignCommand(GetObjectByTag("ag") - совсем не обязательна, кстати, не используй в данном случае, фун-цию: GetFirstPC(), лучше ограничиться, скажем: GetLastPerceived и проверять - игрок ли, последний увиденный и собственно видит ли его NPC. Скрипт будет таким: Neverwinter Script Source void main() { object oPC = GetLastPerceived(); if (GetIsPC(oPC)) { if (GetLastPerceptionSeen()) { ClearAllActions(); ActionMoveToObject(oPC); ActionStartConversation(oPC, "sosed"); } } } PS: для надежности, что-бы NPC никто не сбил по пути, можно выключить его стэк-комманд (естественно на время, до выполнения задачи). Функция: SetCommandable. Сообщение отредактировал Dik Morris - Apr 17 2007, 18:15 |
![]()
Сообщение
#2697
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Вик Станжер @ Apr 17 2007, 15:15) [snapback]107220[/snapback] блин, я плачу за трафик, а от стипендии уже ничего не осталось, не могу я весь формум перерывать. А я что, не плачу? ВОт уезжал было +800 рублей, не было меня месяц (минус) -650. (IMG:style_emoticons/kolobok_light/vava.gif) Кто мой траф выкачал? Суппорт разводит руками... Цитата(Вик Станжер @ Apr 17 2007, 15:15) [snapback]107220[/snapback] - я не знаю, как осуществить переход к обхекту на другой карте. Это есть в мануале моем. Я это разбирал. Скачай прочти, много вопросов отпадет. Я потратил месяц времени оформил для новичков. Цитата(Dik Morris @ Apr 17 2007, 21:14) [snapback]107232[/snapback] PS: для надежности, что-бы NPC никто не сбил по пути, можно выключить его стэк-комманд (естественно на время, до выполнения задачи). И добавь локалку на то что бы НПС не бегал к РС каждый раз когда увидит. Кстати в базе скриптов есть мой скрипт который говорит НПС подойти к РС и начать диалог когда он его увидит. Вешается это дело на юзер деф через сигнал хертбита. Вот код: Neverwinter Script Source //::////////////////////////////////////////////// //:: OnUserDefined am_cud_talk_away //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* НПС ходит за игроком, хочет сказать ему что-то важное. Игрок может отойти на fDist метров и НПС перестанет его преследовать. Если присвоить на объект локальную "RUN" == TRUE то побежит к игроку. Если присвоить локалку "ALL_DISTANCE", то будет преследовать игрока на всей локации. Float fDist "DISTANCE" расстояние на котором НПС реагирует на игрока. По умолчанию равно 10 метрам. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 14.10.2005 //::///////////////////////////////////////////// void main() { object oSelf = OBJECT_SELF; object oPC = GetFirstPC(); // Только для сингла int nEvent = GetUserDefinedEventNumber(); if (GetArea(OBJECT_SELF)!=GetArea(oPC)) return; if (GetIsDead(OBJECT_SELF)==TRUE) return; // Если он помер, то пусть молчит if (GetLocalInt(OBJECT_SELF, "START_CONVERSATION") == FALSE) return; if (GetIsEnemy(oPC, OBJECT_SELF) == TRUE) return; //========================== HEARTBEAT EVENT ================================= if (nEvent == EVENT_HEARTBEAT) // Стандартный сигнал User Defined Event 1001 { // Если поставим эту локалку, то НПС будет преследовать игрока везде в локации if (!GetLocalInt(oSelf, "ALL_DISTANCE")) { float fDist = GetLocalFloat(oSelf, "DISTANCE"); // Расстояние реакции if(fDist == 0.0) {fDist=10.0;} // Если нет значения, то оно ровно 10 метрам // Если игрок дальше fDist метров, то ничего не будет. Будет стоять и ждать if (GetDistanceBetween(oPC, oSelf)> fDist) { AssignCommand(oSelf, ClearAllActions()); // Debug("Игрок отошел дальше "+FloatToString(fDist)+" метров."); return; } } // Если бой, идет разговор то возврат if (GetIsInCombat(oPC) || GetIsInCombat(oSelf) || IsInConversation(oPC)) { return; } // Если нет переменной для повтора if (GetLocalInt(oSelf, "REPEAT") == FALSE) { int iRun = FALSE; // iRun = TRUE - бежит к игроку if (GetLocalInt(oSelf, "RUN")) iRun = TRUE; // Присвоим переменную повтора SetLocalInt(oSelf, "REPEAT", TRUE); AssignCommand(oSelf, ClearAllActions()); ActionDoCommand(SetFacingPoint(GetPosition(oPC))); AssignCommand(oSelf, ActionMoveToObject(oPC, iRun, 2.0)); AssignCommand(oSelf, ActionStartConversation(oPC)); // Обнулим ее через 20 секунд, можно увеличить или уменьшить DelayCommand(20.0, SetLocalInt(oSelf, "REPEAT", FALSE)); // Случайные фразы string s1 = GetLocalString(oSelf, "String1"); string s2 = GetLocalString(oSelf, "String2"); string s3 = GetLocalString(oSelf, "String3"); string s4 = GetLocalString(oSelf, "String4"); string s5 = GetLocalString(oSelf, "String5"); switch(Random(5)) { case 0: if(s1!=""){SpeakString(s1+GetName(oPC)+"!"); break;} case 1: if(s2!=""){SpeakString(s2); break;} case 2: if(s3!=""){SpeakString(s3); break;} case 3: if(s4!=""){SpeakString(s4); break;} case 4: if(s5!=""){SpeakString(s5); break;} } } } //------------------------------------------------------------------------------ } Этот скрипт вешай на любую пустую строку НПС желательно самую верхнюю. В начале диалога он отключит все слокалки на НПС и он не станет бегать за РС все время (IMG:style_emoticons/kolobok_light/smile.gif) Neverwinter Script Source //::////////////////////////////////////////////// //:: Отключает "START_CONVERSATION" на НПС //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* НПС ходит за игроком, хочет сказать ему что-то важное. Игрок может отойти на 10 метров и НПС перестанет его преследовать. Если присвоить на объект локальную "RUN" == TRUE то побежит к игроку. Если присвоить локалку "ALL_DISTANCE", то будет преследовать игрока на всей локации. */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 18.09.2005 //::////////////////////////////////////////////// int StartingConditional() { if (GetLocalInt(OBJECT_SELF, "START_CONVERSATION")) { SetLocalInt(OBJECT_SELF, "START_CONVERSATION", FALSE); // Отключаем SetLocalInt(OBJECT_SELF, "RUN", FALSE); // Ходит пешком if(GetCommandable(GetPCSpeaker())==FALSE) { SetCommandable(TRUE, GetPCSpeaker()); // Если РС закрыт стек команд } } return FALSE; } Надеюсь ты знаешь как запустить это: Neverwinter Script Source if (nEvent == EVENT_HEARTBEAT) // Стандартный сигнал User Defined Event 1001
|
![]()
Сообщение
#2698
|
|
Level 2 ![]() Класс: Теневой Танцор Характер: Chaotic Neutral Раса: Человек ![]() |
Цитата Neverwinter Script Source //::////////////////////////////////////////////////// //:: Прекращение атаки //:: Слот: OnCombatRoundEnd //::////////////////////////////////////////////////// void main() { object oPC = GetFirstPC(); object oSelf = OBJECT_SELF; object oNPC = GetFirstObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE); int iMXP = GetMaxHitPoints(oPC)-10; // Настрой нужную величину… int iCXP = GetCurrentHitPoints(oPC); if (iMXP > iCXP) //Урон не менее 10 пунктов от мах { while (GetIsObjectValid(oNPC)) // Все существа в радиусе 30 метров { if(GetIsInCombat(oNPC)) { AssignCommand(oNPC, SurrenderToEnemies()); // Прекратим атаку AssignCommand(oNPC, ClearAllActions(TRUE)); } oNPC = GetNextObjectInShape(SHAPE_SPHERE, 30.0, GetLocation(oPC), TRUE); } AssignCommand(oPC, SpeakString("Я сдаюсь... Прекратим бой!")); DelayCommand(1.5, ExecuteScript("p_universal", oSelf)); // Перемещение к точке WP_+Тег объекта } } лишнии раз убеждаюсь, что туп как пробка... или это от экзаменов? куды вставлять тег объекта адреса назначения????? базу изучаю.... |
![]()
Сообщение
#2699
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Не все так просто. Скорее всего кое -кто будет лупить по РС. Ты скажи нормальным языком что ты хочешь реализовать. Подробно. У меня есть скрипты прекращающиен атаки при определенных хитах как у РС так и у НПС. Опиши задачу.
|
![]()
Сообщение
#2700
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Цитата(Вик Станжер @ Apr 18 2007, 15:53) [snapback]107283[/snapback] лишнии раз убеждаюсь, что туп как пробка... или это от экзаменов? куды вставлять тег объекта адреса назначения????? Aiwan, скрипт рабочий, не раз проверенный… Ну, все равно открывай свою кубышку глянем, что у тебя там припасено и поучимся (IMG:style_emoticons/kolobok_light/biggrin.gif) P.S. Лексу отправил… Вик Станжер, все просто, возьми тэг перса с которым будет драться герой т.е. на которого ты повесишь этот скрипт. Добавь перед тэгом «WP_» например: тэг перса PERS_3, тогда точка к которой джампанется герой будет: WP_PERS_3 Neverwinter Script Source DelayCommand(1.5, ExecuteScript("p_universal", oSelf)); // Перемещение к точке WP_+Тег объекта Да, еще учти, что перемещение будет если будет рукопашная схватка, в скрипте перемещения пробито расстояние между объектами не более 3 метров. Если этого не нужно, то запиши проще, заменив эту строку на этот код: Neverwinter Script Source AssignCommand(oPC, ClearAllActions(TRUE)); object oPoint = GetWaypointByTag("ТЭГ ТОЧКИ ПЕРЕМЕЩЕНИЯ"); AssignCommand(oPC, JumpToObject(oPoint)); Это хорошо если точка в другой области, а если в этой же, то лучше, так как я записал. Иначе у тебя вся команда героя останется на месте… |
![]()
Сообщение
#2701
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Я потер библы и вставил функции прям в тело скрипта. А так сам скрипт небольшой. Ну конечно он учитывает много врагов, их помощников, твоих помщников и животных в общем всех участников разборки. Кто помнит МОнету Судьбы так происходит разборка с Метханом и с Халифом на плане Воздуха.
Neverwinter Script Source //::////////////////////////////////////////////// //:: OnUserDefaine am_cud_methan //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* Стандартный UserDefaine скрипт */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 09.07.2005 //::///////////////////////////////////////////// //#include "am_inc_battle" //#include "am_inc_common" //#include "am_inc_cutscene" int GetIsAssociate(object oMaster, object oAssociate) { object oMaster = GetMaster(oAssociate); if(oMaster != OBJECT_INVALID) { return TRUE; } return FALSE; } void ClearAllPersonalReputation(object oMaster, object oSource=OBJECT_SELF, int iClearAllActions = FALSE) { object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oMaster); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oMaster); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster); if(iClearAllActions = TRUE) AssignCommand(oMaster,ClearAllActions(TRUE)); ClearPersonalReputation(oMaster, oSource); if(oAnimal != OBJECT_INVALID) { if(iClearAllActions = TRUE) AssignCommand(oAnimal,ClearAllActions(TRUE)); ClearPersonalReputation(oAnimal, oSource); } if(oDominated != OBJECT_INVALID) { if(iClearAllActions = TRUE) AssignCommand(oDominated,ClearAllActions(TRUE)); ClearPersonalReputation(oDominated, oSource); } if(oFamiliar != OBJECT_INVALID) { if(iClearAllActions = TRUE) AssignCommand(oFamiliar,ClearAllActions(TRUE)); ClearPersonalReputation(oFamiliar, oSource); } if(oSummoned != OBJECT_INVALID) { if(iClearAllActions = TRUE) AssignCommand(oSummoned,ClearAllActions(TRUE)); ClearPersonalReputation(oSummoned, oSource); } int i = 1; object oHenchman = GetHenchman(oMaster, i); while(oHenchman != OBJECT_INVALID) { if(iClearAllActions = TRUE) AssignCommand(oHenchman,ClearAllActions(TRUE)); ClearPersonalReputation(oHenchman, oSource); i++; oHenchman = GetHenchman(oMaster, i); } } void FreezeCompanion(object oPlayers, int bVanish=FALSE) { effect eAssociate = EffectCutsceneParalyze(); effect eInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); int i = 1; object oHench = GetHenchman(oPlayers, i); while(oHench != OBJECT_INVALID) { AssignCommand(oHench, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAssociate, oHench)); if(bVanish==TRUE){ AssignCommand(oHench, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInv, oHench));} i++; oHench = GetHenchman(oPlayers, i); } object oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPlayers); if (oCompanion != OBJECT_INVALID) { AssignCommand(oCompanion, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAssociate, oCompanion)); if(bVanish==TRUE){ AssignCommand(oCompanion, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInv, oCompanion));} } object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPlayers); if (oFamiliar != OBJECT_INVALID) { AssignCommand(oFamiliar, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAssociate, oFamiliar)); if(bVanish==TRUE){ AssignCommand(oFamiliar, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInv, oFamiliar));} } object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPlayers); if (oSummon != OBJECT_INVALID) { AssignCommand(oSummon, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAssociate, oSummon)); if(bVanish==TRUE){ AssignCommand(oSummon, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInv, oSummon));} } object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPlayers); if (oDominated != OBJECT_INVALID) { AssignCommand(oDominated, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAssociate, oDominated)); if(bVanish==TRUE){ AssignCommand(oDominated, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eInv, oDominated));} } } void RemoveingBadEffectForCut(object oCreature) { effect eBad = GetFirstEffect(oCreature); while(GetIsEffectValid(eBad)) { if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_DEAF || GetEffectType(eBad) == EFFECT_TYPE_PARALYZE || GetEffectType(eBad) == EFFECT_TYPE_POISON || GetEffectType(eBad) == EFFECT_TYPE_SLOW || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL) { RemoveEffect(oCreature, eBad); } eBad = GetNextEffect(oCreature); } //Fire cast spell at event for the specified target SignalEvent(oCreature, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE)); } void CutsceneOn(object oPlayers) { if(GetCutsceneMode(oPlayers) == FALSE) { RemoveingBadEffectForCut(oPlayers); SetLocalInt(oPlayers, "CUTSCENEMOD", TRUE); SetCutsceneMode(oPlayers, TRUE); } } void ChangeEnemyToNetral(object oPlayer, object oNetral) { object oArea = GetArea(oPlayer); object oEnemy = GetFirstObjectInArea(oArea); object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPlayer); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPlayer); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPlayer); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPlayer); effect eEffect = EffectVisualEffect(VFX_IMP_UNSUMMON); while (GetIsObjectValid(oEnemy)) { if (GetIsEnemy(oPlayer,oEnemy)) { /* //------------------------------------------------------------------------------ // Если пойдет что-то не так. Будут жалобы игроков, то помощников НПС буду удалять... //------------------------------------------------------------------------------ int iNum = 1; while(iNum < 6) { object oAssociate = GetAssociate(iNum, oEnemy); if(GetIsObjectValid(oAssociate)) { ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oAssociate); DestroyObject(oAssociate, 0.5); } iNum++; } */ //----------------------- Обработка помощников игрока -------------------------// if(oAnimal != OBJECT_INVALID) { AssignCommand(oAnimal,ClearAllActions(TRUE)); ClearPersonalReputation(oAnimal,oEnemy);} if(oDominated != OBJECT_INVALID){ AssignCommand(oDominated,ClearAllActions(TRUE)); ClearPersonalReputation(oDominated,oEnemy);} if(oFamiliar != OBJECT_INVALID){ AssignCommand(oFamiliar,ClearAllActions(TRUE)); ClearPersonalReputation(oFamiliar,oEnemy);} if(oSummoned != OBJECT_INVALID){ AssignCommand(oSummoned,ClearAllActions(TRUE)); ClearPersonalReputation(oSummoned,oEnemy);} int i = 1; object oHench = GetHenchman(oPlayer, i); while(oHench != OBJECT_INVALID) { AssignCommand(oHench,ClearAllActions(TRUE)); ClearPersonalReputation(oHench,oEnemy); i++; oHench = GetHenchman(oPlayer, i); } AssignCommand(oEnemy,ClearAllActions(TRUE)); ClearPersonalReputation(oPlayer,oEnemy); ChangeFaction(oEnemy,oNetral); } oEnemy = GetNextObjectInArea(oArea); } } void main() { int nEvent = GetUserDefinedEventNumber(); object oPC = GetFirstPC(); object oSelf = OBJECT_SELF; object oAlishan = GetObjectByTag("AM_HEN_ALISHAN"); object oNeytral = GetObjectByTag("GLOBAL_TRUE_NEUTRAL"); if (GetIsDead(OBJECT_SELF)==TRUE) return; // Если он помер, то пусть молчит if (GetArea(OBJECT_SELF)!=GetArea(GetFirstPC())) return; if (GetImmortal(OBJECT_SELF) == FALSE) return; if(!GetLocalInt(oSelf, "METHAN_BATTLE_PC")) return; //=========================== HEARTBEAT EVENT ================================== if (nEvent == EVENT_HEARTBEAT) // Сигнал поступает User Defined Event 1001 { int iCurHP = GetCurrentHitPoints(oSelf); // Количество поинтов максимум о Нпс if(!GetLocalInt(oSelf, "HIT_POINTS")) { if (iCurHP <= 15) { CutsceneOn(oPC); FreezeCompanion(oPC); SetLocalInt(oSelf, "HIT_POINTS", TRUE); SetLocalInt(oSelf, "REPEAT", TRUE); AssignCommand(oPC, ClearAllActions(TRUE)); AssignCommand(oSelf, ClearAllActions(TRUE)); AssignCommand(oAlishan, ClearAllActions(TRUE)); ChangeEnemyToNetral(oPC, oNeytral); ClearAllPersonalReputation(oPC, oSelf, TRUE); if(GetIsAssociate(oPC, oAlishan)) ClearAllPersonalReputation(oAlishan, oSelf, TRUE); AssignCommand(oSelf, ActionDoCommand(SetFacingPoint(GetPosition(oPC)))); DelayCommand(1.0, AssignCommand(oSelf, PlayVoiceChat(VOICE_CHAT_DEATH))); DelayCommand(1.01, AssignCommand(oSelf, SpeakString("Пощади, "+GetName(oPC)+"!!!"))); DelayCommand(1.4, AssignCommand(oSelf, PlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 4.0))); DelayCommand(1.5, RemoveingBadEffectForCut(oPC)); DelayCommand(2.0, RemoveingBadEffectForCut(oSelf)); DelayCommand(3.0, AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_TALK_FORCEFUL, 1.0, 4.0))); DelayCommand(3.5, AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_TALKTOME))); DelayCommand(3.51, AssignCommand(oPC, SpeakString("Вставай! Будь мужчиной!"))); } } else { if (GetIsInCombat(oPC) || GetIsInCombat(oSelf) || IsInConversation(oPC)) { if(GetIsAssociate(oPC, oAlishan) && GetIsInCombat(oAlishan)) { AssignCommand(oAlishan, ClearAllActions(TRUE)); ClearAllPersonalReputation(oAlishan, oSelf, TRUE); ChangeEnemyToNetral(oAlishan, oNeytral); } ChangeEnemyToNetral(oPC, oNeytral); // РС или НПС занят, что то мешает им поговорить. return; } else if (GetLocalInt(oSelf, "REPEAT")==TRUE) { object oItem1 = GetItemPossessedBy(oSelf, "AM_ITM_SHIELS012"); AssignCommand(oSelf, ClearAllActions()); AssignCommand(oSelf, ActionForceMoveToObject(oPC, FALSE, 1.0, 15.0)); AssignCommand(oSelf, ActionStartConversation(oPC)); AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf, "METHAN_BATTLE_PC", FALSE))); AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf,"REPEAT", FALSE))); AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf,"HIT_POINTS", FALSE))); // Если Метхан не смог подойти и поговорить, напомним об этом } } } //------------------------------------------------------------------------------ } А вот этот скрипт простой и он был описан в скриптах для новичков. Нахер я им все писал не пойму там никто не ходит... НПС после нападения становится нейтральным и начинает диалог с РС. В свойствах НПС поставь Immortal галочку. Что бы не убить его с одного удара. Neverwinter Script Source //------------------------------------------------------------------------------ // Добавляем на хертбит Нпс. //------------------------------------------------------------------------------ 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))); } } //------------------------------------------------------------------------------ |
![]() ![]()
Сообщение
#2702
|
|
Level 4 ![]() ![]() Класс: Ученик Дракона Характер: Lawful Good Раса: Человек ![]() |
Помогите пожалуйста начинающему скриптеру!
Как сделать два скрипта: 1. чтобы из инвентаря игрока при разговоре исчезали все вещи, и ОДЕВАЛИСЬ новые 2. как сделать чтобы после смерти игрок попадал в определённую область без вещей, а его труп оставался на месте с вещами ПС. Есть ли какие нибудь учебники по скриптингу для Тулсета? |
![]()
Сообщение
#2703
|
|
Level 6 ![]() ![]() Класс: Варвар Характер: Chaotic Good Раса: Полуорк ![]() |
Не подскажите ли:
Есть у меня куча квестов (например). Есть андроп предмет в инвентаре перса, который разумеется дается ему при входе. На этом предмете переменные (q1, q2, q3 и т.д.) со значением "0". При выполнении квеста, "0" в этих переменных меняется на "1". Как правильно пользоваться SetLocalInt и GetLocalInt в данном случае? |
![]()
Сообщение
#2704
|
|
Level 4 ![]() ![]() Класс: Некромант Характер: Chaotic Evil Раса: Нежить ![]() |
Хм, запустил бы скрипт визард - да поглядел как там это реализовано. (IMG:style_emoticons/kolobok_light/wink3.gif)
Непосредственно по вопросу: значение "0" устанавливать необязательно, по умолчанию, оно ведь равно -1. А вообще, читай мануал.... разбирайся... там это разжевано... полистай форум, погляди... 100% помню, где-то в недрах была такая тема... 2GoDoom расписывал как делать простейший квест... в общем ищи. (IMG:style_emoticons/kolobok_light/wink3.gif) Ох, не заметил предыдущего вопроса. 2 Epsilon: 1) Есть такая тема: Скрипты для новичков. Там реализовано удаление вещей... одевание сделай сам... все просто. 2) Опять же было не раз, и не два, и даже не три. Навскидку: помню подобное в модуле по Диабле, качай демку, смотри. Зачем код приводить... форум то не резиновый. (IMG:style_emoticons/kolobok_light/wink3.gif) Сообщение отредактировал Waromon - May 1 2007, 21:06 |
![]() ![]()
Сообщение
#2705
|
|
Level 4 ![]() ![]() Класс: Ученик Дракона Характер: Lawful Good Раса: Человек ![]() |
Посмотрел тот форум, я знаю все тамошние скрипты кроме того с вещичками, но мне всё равно необходим чистый скрипт о котором я уже писал, для модуля мне ещё необходимы 2 группы скриптов: тот который оставляет труп игрока вместе с вещами на месте гибели и создает нового с иными вещами, и скрипт который я сейчас сам составляю: чтобы можно было в разговоре войсками двигать, ну в смысле воевать. Помогите мне с первым нужным скриптом, или хотябы тип проверок и действий скажите
Хотя можно и скачать, только скажите где |
![]()
Сообщение
#2706
|
|
Level 2 ![]() Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
Представляю на суд общественности свой небольшой скрипт, точнее два.
Что они делают: Если кто играл в Готику 1,2, тот сразу поймёт НПС дерётся с ПС, но не убивает его, а оставляет в бессознательном состояние на некоторое время и забирает его текущее оружие и вещи. Естественно, если выигрывает ПС, то всё происходит также, только наоборот :) Ну это скрипты должены делать в идеале... У меня же всё гораздо хуже... Некоторые вопросы уже есть в комментариях... плюс ко всему, у меня, когда выигрывает НПС, он начинает говорить и делать часть вещей по два раза (это видимо из-за того, что всё висит на комбатраунде... не знаю как поправить) Буду очень благодарен, если вы поможите решить эти вопросы. Ну и если можно, то оптимизировать его маленько :) ЗЫ: Это мой третий в жизни скрипт, так что не судите строго; я его делал около 6 часов... :) Сообщение отредактировал Slam - May 15 2007, 14:25 |
![]()
Сообщение
#2707
|
|
Level 1 Класс: Друид Характер: Lawful Good Раса: Эльф ![]() |
дорогие форумцы! Помогите пожалуйста. Я только-только начал разбираться со скриптами.
Не подскажете текст скрипта,который сделает так,что PC появиться в начальной области в положении "лежа" или ,хотя бы ,"сидя на полу" |
![]()
Сообщение
#2708
|
|
Level 9 ![]() Класс: Друид Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] Амен ![]() |
volchonok, все просто. На Эвент локации (OnEnter) ставишь следующий скрипт:
Neverwinter Script Source void main() { object oPC = GetEnteringObject(); // Если хочешь лежа, то замени на ANIMATION_LOOPING_DEAD_BACK AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0)); } Если хочешь, что персонаж уже сидел, когда у тебя загрузится локация, то этот же скрипт поставь на эвент модуля (OnClientEnter). Сообщение отредактировал Zirrex - May 9 2007, 23:10 |
![]()
Сообщение
#2709
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Slam, вспоминая свой третий скрипт… вобщем посидишь еще пару часов и сам все конечно раскопаешь (IMG:style_emoticons/kolobok_light/biggrin.gif) ! Просто хочу указать на некоторые ляпы, которые бросаются в глаза.
В первом скрипте подключение инклюды совершенно не нужно… Во втором скрипте в проверкеЖ Neverwinter Script Source if (iCurPCHP < 2) // Если НПС выиграл ты дважды чистишь акции у НПС, отсекая и паузу, и анимацию и подход к герою… Как вернуть начальную фракцию НПС, да ты тут все сам уже ответил, когда менял ему эту самую фракцию. Теперь просто возьми другого перса с аналогичной фракцией, и верни своего НПСа в эту фракцию. Чтобы НПС вернуть в начальную точку, нужно определить эту самую точку, у тебя это нужно вставить в 1 скрипт: Neverwinter Script Source SetLocalLocation(oNPC, "Return_LOC", GetLocation(oNPC)); Тогда во втором эта локация будет определятся так: Neverwinter Script Source location Loc = GetLocalLocation(oNPC, "Return_LOC"); Вообще идея интересная, но мне кажется, что ее лучше реализовывать через проверку урона, который нанес герой НПСу в определенную отсечку времени… Slam, Цитата(Epsilon @ May 10 2007, 05:30) [snapback]107994[/snapback] Gennady, я умею ставить этот эффект, вписывать его в скрипты. Так что повторяю тот вопрос который я задал позже: можно ли менять их текстуры? Есть четыре основных флаго и ещё два подобных, а мне нужны 8 флагов с текстурами плейсеблов стягов или флагов. Лекс же уже ответил… есть только ЧЕТЫРЕ флага!!! Это все, что есть в эффектах, и не стоит эффекты путать с плейсами. Плейсы носить на руках НПСы еще не научились (IMG:style_emoticons/kolobok_light/biggrin.gif) . |
![]()
Сообщение
#2710
|
|
Level 2 ![]() Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
Цитата(gennady @ May 10 2007, 07:37) [snapback]107996[/snapback] Как вернуть начальную фракцию НПС, да ты тут все сам уже ответил, когда менял ему эту самую фракцию. Теперь просто возьми другого перса с аналогичной фракцией, и верни своего НПСа в эту фракцию. этот способ я естественно знаю :) а есть ли другой? т.к. будет не очень удобно если другого перса с аналогичной фракцией в локе не будет Цитата(gennady @ May 10 2007, 07:37) [snapback]107996[/snapback] Чтобы НПС вернуть в начальную точку, нужно определить эту самую точку, у тебя это нужно вставить в 1 скрипт: Neverwinter Script Source SetLocalLocation(oNPC, "Return_LOC", GetLocation(oNPC)); Тогда во втором эта локация будет определятся так: Neverwinter Script Source location Loc = GetLocalLocation(oNPC, "Return_LOC"); и как я сам не догадался... Цитата(gennady @ May 10 2007, 07:37) [snapback]107996[/snapback] Вообще идея интересная, но мне кажется, что ее лучше реализовывать через проверку урона, который нанес герой НПСу в определенную отсечку времени… а вот это я не понял |
![]()
Сообщение
#2711
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Цитата(Epsilon @ May 11 2007, 13:10) [snapback]108055[/snapback] Кстати, как пишеться функция появления обьекта на н-ном расстоянии от игрока относително его самого, в смысле без триггеров и вейпов? В НВН есть функции работы с векторами и координатами. Школьных знаний по геометрии хватит чтобы сделать все что нужно. Цитата(Epsilon @ May 11 2007, 13:10) [snapback]108055[/snapback] Ранее было сказано, что обьекты нелзя привязывать к игрокам, а бедь можно присвоить координаты игрока или его части и поворот к определённому обьекту. ниче не понял. Объекты при желании можно привязать к игроку, правда тут важно что имеется ввиду под словом "привязать". |
![]()
Сообщение
#2712
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Slam, ты немного перепутал…
Neverwinter Script Source object oFaction = GetObjectByTag("temp_enemy"); //Тэг НПСа с нужной нам фракцией (обязательно должен быть в области) Это так определяется объект в модуле, т.е. в любой локации. В области, объект записывается так: Neverwinter Script Source object oFaction = GetNearestObjectByTag("temp_enemy",); // Get the nth Object nearest to oTarget that has sTag as its tag. // * Return value on error: OBJECT_INVALID object GetNearestObjectByTag(string sTag, object oTarget=OBJECT_SELF, int nNth=1) // string sTag – это тэг объекта // object oTarget=OBJECT_SELF – это объект относительно которого мы определяем наш ближайший с тэгом sTag. По умолчанию он равен OBJECT_SELF, т.е. с кого мы читаем скрипт. // int nNth=1 – это порядковый номер, используется при подсчете объектов с одинаковы тэгом, а распределяются номера, в зависимости он расстояния от объекта отчета… Объект отчета, по определению не может быть ближайшим объектом! Вот подсчет урона на НПС, записан на локалку. При каждом ударе по НПС будет прибавлять инт этой локалки, равный нанесенному урону. Жаль на герое не проверить так урон, но можно пробить их в одном скрипте, чего-либо да насчитает, а потом сравнить локалки и посмотреть, кто победил (IMG:style_emoticons/kolobok_light/biggrin.gif) . Neverwinter Script Source //:: СЛОТ: OnDamaged void main() { object oSelf = OBJECT_SELF; int Uron = GetLocalInt(oSelf, "SUM_XP"); int iMaxHit = GetMaxHitPoints(oSelf); int iCurHit = GetCurrentHitPoints(oSelf); int iX = iMaxHit - (iCurHit+Uron); SetLocalInt(oSelf, "SUM_XP", GetLocalInt(oSelf, "SUM_XP") + iX); // Урон } P.S. Вообще не зря Aiwan писал скрипт остановки боя, ведь мы не знаем с кем в компании будет герой, а его команда смажет тебе всю сцену. Так что смотри верхний скрипт на этой странице, или мой на пред идущей. А всю последующею сценку, лучше кинуть на невидимый плейс, и послав туда в определенное время сигнал, обыгрывать все с этого плейса. Ведь так легко сбить команды которые ты даешь НПС и герою, да если у него еще свита, то… Сообщение отредактировал gennady - May 11 2007, 13:37 |
![]()
Сообщение
#2713
|
|
Level 1 Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
всем привет. у меня несколько вопросов:
1. можно ли сделать переход в новый модуль, не в точку старта, а в указанное место? пока что я позаимствовал только: Neverwinter Script Source void main() { object oPC = GetEnteringObject(); // Кто вошел на триггер if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "TRIGGER") || GetIsInCombat(oPC)) return; // Если не игрок, или уже наступал, или идет бой то возврат SetLocalInt(OBJECT_SELF, "TRIGGER", TRUE); ActionDoCommand(DoSinglePlayerAutoSave()); // Автосейв, на случай пожарный ActionDoCommand(StartNewModule("имя_модуля")); // НО БЕЗ РАСШИРЕНИЯ! *.mod } но это немного не то. 2. следом возникает вопрос: можно ли возвращаться в предыдущий модуль, чтобы пройденные квесты не обнулялись? буду весьма признателен за оказанную помощь) |
![]()
Сообщение
#2714
|
|
Level 2 ![]() Класс: Убийца Характер: Neutral Evil Раса: Человек ![]() |
Цитата(gennady @ May 11 2007, 14:35) [snapback]108066[/snapback] ну с тэгом нпс, у которого берется фракция я не напутал, суть в том, что можно сделать закрытую локу и там его поставить; а если брать ближайшего, то тогда придется в каждой локе, где будет дуэль ставить этого нпс и прятать его куда-нить :) А смысл считать урон НПС? я что-то не пойму... А можешь дать ссылку на этот пост Айвана, может пригодится С хенчмена игрока же другая история, я думаю в модуле делать эту фишку как дуэль 1х1, таким образом хенчменов буду морозить и всё... какие проблемы возникли: 1. не знаю как возвращать "родную" фракцию НПС, т.е. мне нужна функция типа записывает текующу фракцию НПС в локалку, а потом восстанавливает 2. когда ПС выигрывает, не получается сделать, чтобы НПС после того как проснулся, вернулся бы на свою старую позицию и повернулся лицом, куда смотрел раньше (см. коменты) 3. иногда такой глюк, у ПС здоровье =1, но он не может попасть по НПС и поэтому ф-ция не выполняется 4. НПС чаще всего не атакуюет, пока его не ударишь... Если есть какие-то идеи по оптимизации, поделитесь пожалуйста :) ЗЫ: спасибо всем, кто принимал участие в разработке sss debug system за замечательный инклуд с системой дебага Сообщение отредактировал Slam - May 15 2007, 14:24 |
![]()
Сообщение
#2715
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Цитата(Slam @ May 11 2007, 21:47) [snapback]108083[/snapback] 1. не знаю как возвращать "родную" фракцию НПС, т.е. мне нужна функция типа записывает текующу фракцию НПС в локалку, а потом восстанавливает Да, не парься ты с этими фракциями, и чисткой персональной репы! Есть же функция SurrenderToEnemies(): Neverwinter Script Source if(GetIsInCombat(oNPC)) { AssignCommand(oNPC, SurrenderToEnemies()); AssignCommand(oNPC, ClearAllActions(TRUE)); } Цитата(Slam @ May 11 2007, 21:47) [snapback]108083[/snapback] 2. когда ПС выигрывает, не получается сделать, чтобы НПС после того как проснулся, вернулся бы на свою старую позицию и повернулся лицом, куда смотрел раньше (см. коменты) Смотри внимательней, что ты делаешь! У тебя врубается функция подхода к локации, а через секунду ты пытаешься повернуть НПС. Так не прокатит! Не думаю, что секунды хватит НПС чтобы вернуться на свою локацию, попробуй через строй акций: Neverwinter Script Source float fFas =GetLocalFloat(oNPC, "FacingPoint"); ActionWait(fNPCKnockdownTime + 2.0); AssignCommand(oNPC,_ActionMoveToLocation(Loc)); AssignCommand(oNPC, ActionDoCommand(DelayCommand(0.3, SetFacing(fFas)))); Цитата(Slam @ May 11 2007, 21:47) [snapback]108083[/snapback] 3. иногда такой глюк, у ПС здоровье =1, но он не может попасть по НПС и поэтому ф-ция не выполняется О чем я тебе сразу и сказал, лучше через урон в определенное время… Тем более если это все не в режиме кат сцены, то ты не даешь шанса НПС… Цитата(Slam @ May 11 2007, 21:47) [snapback]108083[/snapback] 4. НПС чаще всего не атакуюет, пока его не ударишь... Почисть пред этим акции НПС. Плюс сделай аналогичную атаку и для Героя, пусть тоже атакует НПС! |
![]() ![]() |
Текстовая версия | Сейчас: 19th June 2025 - 17:25 |