![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#2241
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Lex @ May 14 2006, 04:52) [snapback]81710[/snapback] object oTrg=OBJECT_SELF; - лишнее Пять юаней. Во многих сложных системах или при использовании актионов и прочих функций OBJECT_SELF может не работать корректно. Это даже в комментах лексекона есть. Рекомендую использовать только в простых не сложных скриптах иначе будете искать причину того что действие не сработало очень долго... Биовар в скриптах ХоТУ почти везеде юзает object oSelf = OBJECT_SELF; |
![]()
Сообщение
#2242
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
QUOTE оСПРАВИЛ - работает, но почему компилятор не выдавал ошибку? Компилятор ошибку видит, скорее всего, ты просто забыл скомпилировать скрипт. (IMG:style_emoticons/kolobok_light/smile.gif) |
![]()
Сообщение
#2243
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
хз я F7 жал, это ж компилятор?
|
![]()
Сообщение
#2244
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Да это, но я повторюсь ошибку компилятор ВИДИТ, ради интиреса попробуй скомпилировать тот скрипт еще раз.
|
![]()
Сообщение
#2245
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Aiwan @ May 14 2006, 11:11) [snapback]81718[/snapback] Пять юаней. Во многих сложных системах или при использовании актионов и прочих функций OBJECT_SELF может не работать корректно. Это даже в комментах лексекона есть. Рекомендую использовать только в простых не сложных скриптах иначе будете искать причину того что действие не сработало очень долго... Биовар в скриптах ХоТУ почти везеде юзает object oSelf = OBJECT_SELF; я с этим не спорю, но в написанном выше скрипте - триггер только для локалки - все равно написано там OBJECT_SELF так что в том конкретном скрипте лишнее. Что я и написал. |
![]()
Сообщение
#2246
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Леш, неужели ты решил что я твой код правлю? (IMG:style_emoticons/kolobok_light/crazy.gif) Я еще с ума не сошел. Дружище, просто пять юаней это пять юаней! (IMG:style_emoticons/kolobok_light/pardon.gif)
|
![]()
Сообщение
#2247
|
|
Level 8 ![]() ![]() ![]() Класс: Паладин Характер: Lawful Good Раса: Полуэльф ПОДМАСТЕРЬЕ ![]() |
Посоветуйте, пожалуйста, как сделать так, чтобы в стек действий попало условие. Именно чтобы строка "if ...." выполнилась ПОСЛЕ окончания действия ActionMoveToObject()/
|
![]()
Сообщение
#2248
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Можно попробовать так,
NSS void ActionTemp()
{ if( // Нужная проверка и т.д... { // <...> } } void main() { // <...> ActionDoCommand(ActionTemp()); // <...> } Сообщение отредактировал Dik Morris - May 14 2006, 19:53 |
![]() ![]()
Сообщение
#2249
|
|
Level 3 ![]() Класс: Паладин Характер: Lawful Good Раса: Человек ![]() |
Скажите а можно изменить расу. Вот я хочу поменять полуорков на Ракшисов. Как это сделать? И если это скрипт тонапишите пожалуйста. (IMG:style_emoticons/kolobok_light/nea.gif)
|
![]()
Сообщение
#2250
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
|
![]()
Сообщение
#2251
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
Привет,
пытался уже многими способами сделать но не получилось, помогите! Ситуация: - Появляется ПС, на тригере, далее включается КаСцена и начинается разговор с НПС, после того как ПС проговорит определенные фразы, то в зависимости от выбраного диалога ПС и НПС должны пойти в куда-то. При выборе первого варианта в точку А, при выборе второго в точку Б. ПС: Два дня и 0, жуть! Быть может кто-то поможет.. |
![]()
Сообщение
#2252
|
|
Level 5 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [Sn] ![]() |
QUOTE(Nashman @ May 16 2006, 06:09) [snapback]81934[/snapback] Появляется ПС, на тригере, далее включается КаСцена и начинается разговор с НПС под точкой появления ПС рисуем триггер, на его onEnter вешаем скрипт NSS object oPC = GetEnteringObject(); object oNPC = GetObjectByTag("TAGNPC"); if (!GetIsPC(oPC)) return; SetCutsceneMode(oPC); if (GetPlotFlag(oPC)) SetPlotFlag(oPC, FALSE); // на всякий случай, чтобы ПС не становился в режим бога AssignCommand(oPC, ActionStartConversation(oNPC, "dialog")); QUOTE(Nashman @ May 16 2006, 06:09) [snapback]81934[/snapback] При выборе первого варианта в точку А, при выборе второго в точку Б. На варианте выбора NSS object oPoint = GetObjectByTag("POINT_A"); // тоже и с поинтом Б object oNPC = OBJECT_SELF; object oPC = GetLastSpeaker(); AssignCommand(oNPC, ActionMoveToObject(oPoint)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectSlow(), oPC); // просто, чтобы не бегал DelayCommand(2.0f, AssignCommand(oPC , ActionMoveToObject(oPoint))); Если все равно не работает проверяй теги Сообщение отредактировал StalkerDtN - May 16 2006, 04:10 |
![]()
Сообщение
#2253
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
А идет сама проверка какую фразу ПС сказал, а то я что-то не вижу...
|
![]()
Сообщение
#2254
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
Nashman
Тогда ставь локальные переменные на игрока, потом проверяй в скрипте. NSS // Set oObject's local integer variable sVarName to nValue void SetLocalInt(object oObject, string sVarName, int nValue) NSS // Get oObject's local integer variable sVarName // * Return value on error: 0 int GetLocalInt(object oObject, string sVarName) |
![]()
Сообщение
#2255
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
Я делал так:
на определенной строке диалога я ставил переменную, но потом не знаю как ее использовать в катсцене, тоесть у меня может быть два варианта а как тогда мне определить конец диалога? IsInConversation(object OObject) что она должна вернуть если диалог закончен? |
![]()
Сообщение
#2256
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
QUOTE(Nashman @ May 16 2006, 14:33) [snapback]81952[/snapback] тоесть у меня может быть два варианта а как тогда мне определить конец диалога? А какие проблемы то... ? Юзай слот ActionTakens и будет тебе счастье... (IMG:style_emoticons/kolobok_light/smile.gif) PS: QUOTE IsInConversation
This function returns TRUE or FALSE based on the conversation state of the target. Use this function to conditionally execute behavior based on the target's conversation status. Сообщение отредактировал Dik Morris - May 16 2006, 11:49 |
![]()
Сообщение
#2257
|
|
Level 5 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [Sn] ![]() |
QUOTE(Nashman @ May 16 2006, 16:09) [snapback]81948[/snapback] А идет сама проверка какую фразу ПС сказал, а то я что-то не вижу... Хех, Nashman, берешь, просто, на обе ветки диалога ставишь по скрипту. В первом скрипте будет NSS object oPoint = GetObjectByTag("POINT_A"); в другом NSS object oPoint = GetObjectByTag("POINT_B"); и будет все работать (IMG:style_emoticons/kolobok_light/smile.gif) PS: хотя интереснее как предложил Dik Morris |
![]()
Сообщение
#2258
|
|
Level 17 ![]() Класс: Волшебник Характер: Neutral Good Раса: Человек NWN: Скриптинг [PW] Axistown SR 1.9 NWNX ![]() |
QUOTE(Nashman @ May 16 2006, 12:33) [snapback]81952[/snapback] Я делал так: на определенной строке диалога я ставил переменную, но потом не знаю как ее использовать в катсцене, тоесть у меня может быть два варианта а как тогда мне определить конец диалога? IsInConversation(object OObject) что она должна вернуть если диалог закончен? В настройках любого диалога можно установить 2 скрипта: на нормальное завершение диалога и на прерывание (нажатие Esc). Если нужно поставить переменные в каждой ветке - сделай там соответствующие скрипты. А на скрипт завершения диалога можно вешать всё остальное... Сообщение отредактировал virusman - May 16 2006, 14:34 |
![]()
Сообщение
#2259
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
Nashman, все очень просто. Для начала запустим кат сценку:
NSS void main() { object oNPC = GetObjectByTag("PERS"); object oPC = GetEnteringObject(); if (!GetIsPC(oPC)) return; AssignCommand(oPC, ClearAllActions()); AssignCommand(oNPC, ClearAllActions()); SetCutsceneMode(oPC, TRUE); DelayCommand(0.1,AssignCommand(oPC, SetCameraFacing(330.0, 15.0, 50.0, CAMERA_TRANSITION_TYPE_MEDIUM))); DelayCommand(1.0,AssignCommand(oNPC,ActionForceMoveToObject(oPC, FALSE))); DelayCommand(7.0, AssignCommand(oNPC, ActionStartConversation(oPC))); } Запустили диалог перса. Идем дальше, есть один нюанс: убери все скрипты, в панели редактора диалога, на вкладке «Текущий Файл», и включи галку «Прекращение увеличения», для того, чтобы не мотало камеру. Затем присвой переменные на ветки диалога. У тебя в модуле должны уже быть такие на определение последовательности диалога. Ели нет, то сделай. Пример: NSS SetLocalInt(GetPCSpeaker(),"D1_"+GetTag(OBJECT_SELF), 1); SetLocalInt(GetPCSpeaker(),"D2_"+GetTag(OBJECT_SELF), 1); Дальше работает один скрипт на обе ветви диалога. В зависимости от выбранной ветви в диалоге, персы идут к нужной точке. NSS void main()
{ object oPoint1 = GetObjectByTag("POINT_A"); object oPoint2 = GetObjectByTag("POINT_B"); object oNPC = OBJECT_SELF; object oPC = GetPCSpeaker(); object oByTag = GetObjectByTag("Nashman_TRIGER"); AssignCommand(oPC, ClearAllActions()); AssignCommand(oNPC, ClearAllActions()); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oPC, 10.0); // просто, чтобы не бегал if(GetLocalInt(GetPCSpeaker(), "D1_"+GetTag(OBJECT_SELF)) == 1) { AssignCommand(oNPC, ActionMoveToObject(oPoint1)); AssignCommand(oPC, ActionMoveToObject(oPoint1)); } if(GetLocalInt(GetPCSpeaker(), "D2_"+GetTag(OBJECT_SELF)) == 1) { AssignCommand(oNPC, ActionMoveToObject(oPoint2)); AssignCommand(oPC, ActionMoveToObject(oPoint2)); } DestroyObject(oByTag); // удалим триггер DelayCommand(10.0, SetCutsceneMode(oPC, FALSE)); } Сообщение отредактировал gennady - May 16 2006, 14:40 |
![]()
Сообщение
#2260
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
gennady , спасибо это то, что нужно было, только вопрос:
Как убрать имунитет к замедлению? Если он есть |
![]()
Сообщение
#2261
|
|
Вечно меняющийся ![]() Класс: Монах Характер: True Neutral Раса: Человек NWN: Скриптинг [Sn] ![]() |
gennady
QUOTE DestroyObject(oByTag); // удалим триггер ИМХО, стоит ввести небольшую задержку в 0.3, 0.5 - вдруг триггер удалится раньше. (IMG:style_emoticons/kolobok_light/smile.gif) Nashman Если не ошибаюсь, то стандартными средствами игроку никак нельзя получить иммунитет к замедлению, т.е его можно только наложить на игрока, соответственно можно удалить, например так: NSS void RemoveEffectImmunity(object oCreature){ effect eEffect = GetFirstEffect(oCreature); while (GetEffectType(eEffect) == EFFECT_TYPE_IMMUNITY){ eEffect = GetNextEffect(oCreature); if (GetIsEffectValid(eEffect)){ RemoveEffect(oCreature, eEffect);}}} PS: код ставь перед основной фун-цией. (void main() ), заместо oCreature ставь игрока. Сообщение отредактировал Dik Morris - May 16 2006, 18:14 |
![]()
Сообщение
#2262
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
QUOTE(Nashman @ May 16 2006, 20:06) [snapback]81970[/snapback] Как убрать имунитет к замедлению? Если он есть Вот тебе функция. Узнай есть ли на нем такой эффект и убери. Уберешь так: NSS RemoveTypeEffect(oPC, EFFECT_TYPE_SLOW); NSS // УДАЛЯЕМ ВЫБРАННЫЙ ТИП ЕФФЕКТОВ iType(EFFECT_TYPE_ ) НА ОБЪЕКТЕ oCreature void RemoveTypeEffect(object oCreature, int iType); void RemoveTypeEffect(object oCreature, int iType) { effect eEffect = GetFirstEffect(oCreature); while(GetIsEffectValid(eEffect)) { if (GetEffectType(eEffect) == iType) { RemoveEffect(oCreature, eEffect); } eEffect = GetNextEffect(oCreature); } } Блин я не совсем вкурил вопрос, но думаю ты разберешься с кодом. Тебе ИММУН надо... |
![]()
Сообщение
#2263
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
нееее... Айв, речь совсем не о том.
Вот, нашел в закромах NSS //******************************************************************************
// inc_effects // Effects Library // Lex, -=WRG!=- Team 2004 //****************************************************************************** // удаление всех эффектор по длительности (DURATION_TYPE) void E_DeleteEffectsByDuration(object oObject, int nDuration); // удаление всех эффектов, наложенных oCreator'ом void E_DeleteEffectsByCreator(object oObject, object oCreator); // удаление всех эффектов определенного типа (EFFECT_TYPE_*) void E_DeleteEffectsByType(object oObject, int nType); // удаление всех эффектов определенного подтипа (SUBTYPE_*) void E_DeleteEffectsBySubType(object oObject, int nSubType); // удаление особого эффекта, соотв. всем параметрам (создатель, длительность, тип, подтип) // nAllEffects = TRUE - будут удалены все эффекты, попадающие под условия. FALSE - только первый void E_DeleteSpecificEffect(object oObject, object oCreator = OBJECT_INVALID,int nEffectType = -1,int nEffectSubType = -1,int nEffectDurationType = -1, int nAllEffects = FALSE); //****************************************************************************** void E_DeleteEffectsByDuration(object oObject, int nDuration) { effect eOE = GetFirstEffect(oObject); while (GetIsEffectValid(eOE)) { if (GetEffectDurationType(eOE)==nDuration) { RemoveEffect(oObject,eOE); } eOE = GetNextEffect(oObject); } } //****************************************************************************** void E_DeleteEffectsByCreator(object oObject, object oCreator) { effect eOE = GetFirstEffect(oObject); while (GetIsEffectValid(eOE)) { if (GetEffectCreator(eOE)==oCreator) { RemoveEffect(oObject,eOE); } eOE = GetNextEffect(oObject); } } //****************************************************************************** void E_DeleteEffectsByType(object oObject, int nType) { effect eOE = GetFirstEffect(oObject); while (GetIsEffectValid(eOE)) { if (GetEffectType(eOE)==nType) { RemoveEffect(oObject,eOE); } eOE = GetNextEffect(oObject); } } //****************************************************************************** void E_DeleteEffectsBySubType(object oObject, int nSubType) { effect eOE = GetFirstEffect(oObject); while (GetIsEffectValid(eOE)) { if (GetEffectSubType(eOE)==nSubType) { RemoveEffect(oObject,eOE); } eOE = GetNextEffect(oObject); } } //****************************************************************************** void E_DeleteSpecificEffect(object oObject, object oCreator = OBJECT_INVALID,int nEffectType = -1,int nEffectSubType = -1,int nEffectDurationType = -1, int nAllEffects = FALSE) { effect eEffect = GetFirstEffect(oObject); int PassCreator = (oCreator==OBJECT_INVALID); int PassEffectType = (nEffectType==-1); int PassEffectSubType = (nEffectSubType==-1); int EffectDurationType = (nEffectDurationType==-1); while (GetIsEffectValid(eEffect)) { if ((GetEffectCreator(eEffect)==oCreator)||(PassCreator)) { if ((GetEffectType(eEffect)==nEffectType)||(PassEffectType)) { if ((GetEffectSubType(eEffect)==nEffectSubType)||(PassEffectSubType)) { if ((GetEffectDurationType(eEffect)==nEffectDurationType)||(EffectDurationType)) { RemoveEffect(oObject,eEffect); if (!nAllEffects) return; } } } } eEffect = GetNextEffect(oObject); } } //****************************************************************************** |
![]()
Сообщение
#2264
|
|
Level 9 ![]() Класс: Обыватель Характер: Lawful Good Раса: Человек NWN: Модмейкер Рыцарская Сага ![]() |
QUOTE(Dik Morris @ May 16 2006, 18:34) [snapback]81977[/snapback] ИМХО, стоит ввести небольшую задержку в 0.3, 0.5 - вдруг триггер удалится раньше. Дик, задержка не нужна - триггер уже свое отработал. Первый скрипт стоит на триггере, а второй в диалоге перса, и последние команды идут из стека этого перса. Вопрос к Aivan. Вы недавно приводили интересный скрипт секретного объекта. На версии 1.32, проверка локалки не работает, пробовал подобрать проверку на эффект GetEffectType(), не смог подобрать нужный. Замучили буквоеды! Так какая включается локалка в режиме обнаружения, или какой налагается эффект замедления на героя? NSS if(GetGameDifficulty() == GAME_DIFFICULTY_EASY || !GetLocalInt(GetModule(), "DEBAG_PC"))
SendMessageToPC(oPC, "<cу >ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.</c>"); |
![]()
Сообщение
#2265
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Генадий, это просто я сделал для своих тестеров для дебага. Вы можете удалить кусок кода с локалкой:
NSS if(GetGameDifficulty() == GAME_DIFFICULTY_EASY) SendMessageToPC(oPC, "<cу >ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.</c>"); Тогда предупреждение будет выдавать только игрокам играющим на сложности EASY. Можете вообще убрать. Если вы спрашиваете в каком режиме это происходит, то при спавне по умолчанию забанена кнопка F2. По поводу того что может не работать... Дело в том что написано это на 1.66, соотвесвенно может некоторые функции имеют другие внутренние механизмы движка или их вообще нет. Но это вряд ли, тогда бы не скомпелировался код. Насколько я понимаю, у вас СОУ, соотвественно вы задать локалки или стринги на триггере заранее НЕ МОЖЕТЕ. Значит скрипт настроить нормально вашими средствами нельзя. Ставьте ХОТУ. (IMG:style_emoticons/kolobok_light/yes3.gif) 2 Лекс. Сенькс, за код, надо библу себе добить будет (IMG:style_emoticons/kolobok_light/biggrin.gif) |
![]() ![]() |
Текстовая версия | Сейчас: 29th April 2025 - 23:17 |