Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Nashman
Привет,
пытался уже многими способами сделать но не получилось, помогите!
Ситуация:
- Появляется ПС, на тригере, далее включается КаСцена и начинается разговор с НПС, после того как ПС проговорит определенные фразы, то в зависимости от выбраного диалога ПС и НПС должны пойти в куда-то. При выборе первого варианта в точку А, при выборе второго в точку Б.

ПС: Два дня и 0, жуть! Быть может кто-то поможет..
StalkerDtN
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)));

Если все равно не работает проверяй теги
Nashman
А идет сама проверка какую фразу ПС сказал, а то я что-то не вижу...
Dik Morris
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)

Nashman
Я делал так:
на определенной строке диалога я ставил переменную, но потом не знаю как ее использовать в катсцене, тоесть у меня может быть два варианта а как тогда мне определить конец диалога?
IsInConversation(object OObject) что она должна вернуть если диалог закончен?
Dik Morris
QUOTE(Nashman @ May 16 2006, 14:33) [snapback]81952[/snapback]

тоесть у меня может быть два варианта а как тогда мне определить конец диалога?


А какие проблемы то... ?
Юзай слот ActionTakens и будет тебе счастье... 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.
StalkerDtN
QUOTE(Nashman @ May 16 2006, 16:09) [snapback]81948[/snapback]

А идет сама проверка какую фразу ПС сказал, а то я что-то не вижу...

Хех, Nashman, берешь, просто, на обе ветки диалога ставишь по скрипту. В первом скрипте будет
NSS
object oPoint = GetObjectByTag("POINT_A");

в другом
NSS
object oPoint = GetObjectByTag("POINT_B");
и будет все работать smile.gif

PS: хотя интереснее как предложил Dik Morris
virusman
QUOTE(Nashman @ May 16 2006, 12:33) [snapback]81952[/snapback]

Я делал так:
на определенной строке диалога я ставил переменную, но потом не знаю как ее использовать в катсцене, тоесть у меня может быть два варианта а как тогда мне определить конец диалога?
IsInConversation(object OObject) что она должна вернуть если диалог закончен?

В настройках любого диалога можно установить 2 скрипта: на нормальное завершение диалога и на прерывание (нажатие Esc). Если нужно поставить переменные в каждой ветке - сделай там соответствующие скрипты. А на скрипт завершения диалога можно вешать всё остальное...
gennady
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));
}
Nashman
gennady , спасибо это то, что нужно было, только вопрос:
Как убрать имунитет к замедлению? Если он есть
Dik Morris
gennady
QUOTE
DestroyObject(oByTag); // удалим триггер


ИМХО, стоит ввести небольшую задержку в 0.3, 0.5 - вдруг триггер удалится раньше. 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 ставь игрока.
Aiwan
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);
    }
}


Блин я не совсем вкурил вопрос, но думаю ты разберешься с кодом. Тебе ИММУН надо...
Lex
нееее... Айв, речь совсем не о том.
Вот, нашел в закромах

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);
   }
}
//******************************************************************************
gennady
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>");
Aiwan
Генадий, это просто я сделал для своих тестеров для дебага. Вы можете удалить кусок кода с локалкой:
NSS
if(GetGameDifficulty() == GAME_DIFFICULTY_EASY)
SendMessageToPC(oPC, "<cу >ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.</c>");

Тогда предупреждение будет выдавать только игрокам играющим на сложности EASY. Можете вообще убрать.
Если вы спрашиваете в каком режиме это происходит, то при спавне по умолчанию забанена кнопка F2.
По поводу того что может не работать... Дело в том что написано это на 1.66, соотвесвенно может некоторые функции имеют другие внутренние механизмы движка или их вообще нет. Но это вряд ли, тогда бы не скомпелировался код. Насколько я понимаю, у вас СОУ, соотвественно вы задать локалки или стринги на триггере заранее НЕ МОЖЕТЕ. Значит скрипт настроить нормально вашими средствами нельзя. Ставьте ХОТУ. yes3.gif

2 Лекс. Сенькс, за код, надо библу себе добить будет biggrin.gif
gennady
Спасибо вам Aiwan за ответ. Скрипт конечно не компелировался, пришлось выкинуть все локалки и стринги, и заточить под собственные нужды. Фразу - «ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.», оставил при любом режиме, пусть колбасит игрока, но это немного некорректно, когда этот режим включен. Перейти на 1.66 нет возможности, да и нет необходимости, пока игра не дописана. Поэтому пробовал через эффект, но не нашел оный. Спасибо Лексу за библиотеку. Интересно, никто не делал библиотеку эффектов? Я попытался, описал полторы сотни, работает нормально, но не все еще внес. Если еще подключить библиотеку Лекса, то это облегчит работу по скриптам с эффектами. В общем идея такая:

NSS
// *********** БИБЛИОТЕКА ЭФФЕКТОВ ************    #include "effect_one"

effect e1i = EffectVisualEffect(VFX_FNF_DISPEL);
// Воронка синего тумана 1
effect e2i = EffectVisualEffect(VFX_FNF_DISPEL_DISJUNCTION);
// Воронка синего тумана 2
effect e3i = EffectVisualEffect(VFX_FNF_DISPEL_GREATER);
// Воронка синего тумана 3
effect e4i = EffectVisualEffect(VFX_FNF_IMPLOSION);
// ЖелтаЯ воронка
effect e5i = EffectVisualEffect(VFX_FNF_LOS_EVIL_10);
// НегативнаЯ энергиЯ Красный круг 1
effect e6i = EffectVisualEffect(VFX_FNF_LOS_EVIL_20);
// НегативнаЯ энергиЯ Красный круг 2
effect e7i = EffectVisualEffect(VFX_FNF_LOS_EVIL_30);
// НегативнаЯ энергиЯ Красный круг 3
effect e8i = EffectVisualEffect(VFX_FNF_LOS_HOLY_10);
// круг желтый 1
effect e9i = EffectVisualEffect(VFX_FNF_LOS_HOLY_20);
// круг желтый 2
effect e10i = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
// круг желтый 3
effect e11i = EffectVisualEffect(VFX_FNF_NATURES_BALANCE);
// Зеленый круг животных
effect e12i = EffectVisualEffect(VFX_FNF_PWKILL);
// Красный круг пентаграммы
effect e13i = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_2);
// ФиолетоваЯ спираль и круг
effect e14i = EffectVisualEffect(VFX_FNF_HOWL_MIND);
// Страх синий круг
effect e15i = EffectVisualEffect(VFX_FNF_HOWL_ODD);
// Страх фиолетовый круг
effect e16i = EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY);
// Страх белый круг
  effect e17i = EffectVisualEffect(VFX_IMP_PULSE_FIRE);
// Огненный импульсный круг
  effect e18i = EffectVisualEffect(VFX_IMP_PULSE_COLD);
// синий импульсный круг

// ***********  ИНТЕРЕСНЫЕ  **********
effect e19i = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);
// ГолубаЯ  звезда под ногами
effect e20i = EffectVisualEffect(VFX_FNF_WORD);
// БольшаЯ желтаЯ звезда под ногами
effect e21i = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL);
// Врата Призыва синий луч
effect e22i = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
// Врата Призыва огненный взрыв
effect e23i = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES);
// Девка
effect e24i = EffectVisualEffect(VFX_FNF_WEIRD);
// Змей двуглавый
effect e25i = EffectVisualEffect(VFX_IMP_DISPEL);
// Голубое облако
  effect e26 = EffectVisualEffect(VFX_DUR_PROT_PREMONITION);
// Глазастое синее облако

// ***********  ВЗРЫВНЫЕ  **********
effect e27i = EffectVisualEffect(VFX_FNF_FIREBALL);
// Большой огненный взрыв
effect e28i = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_ACID);
// Взрыв газа зеленый
effect e29i = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_EVIL);
// Взрыв газа красный
effect e30i = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_FIRE);
// Огненный взрыв
effect e31i = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_GREASE);
// Взрыв газа черный
effect e32i = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_MIND);
// Взрыв газа синий
effect e33i = EffectVisualEffect(VFX_FNF_BLINDDEAF);
// Большой серебристый взрыв
effect e34i = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_NATURE);
// Взрыв газа болотный
effect e35i = EffectVisualEffect(VFX_FNF_LOS_NORMAL_10);
// Звуковой взрыв 1
effect e36i = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
// Звуковой взрыв 2
effect e37i = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30);
// Звуковой взрыв 3
effect e38i = EffectVisualEffect(VFX_FNF_SOUND_BURST);
// Большой звуковой взрыв
effect e39i = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1);
// Серебристый взрыв
effect e40i = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD);
// Серебристый малый взрыв и голос страха
effect e41i = EffectVisualEffect(VFX_COM_CHUNK_RED_LARGE);
// Большой взрыв красные кости
effect e42i = EffectVisualEffect(VFX_COM_CHUNK_RED_MEDIUM);
// взрыв красные кости
effect e43i = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
// взрыв красные кости
effect e44i = EffectVisualEffect(VFX_COM_CHUNK_GREEN_MEDIUM);
// Взрыв зеленые кости
effect e45i = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL);
// Взрыв зеленые кости
effect e46i = EffectVisualEffect(VFX_COM_CHUNK_YELLOW_MEDIUM);
// Взрыв желтые кости
effect e47i = EffectVisualEffect(VFX_COM_CHUNK_YELLOW_SMALL);
// Взрыв желтые кости
effect e48i = EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM);
// Взрыв костей нежить
effect e49i = EffectVisualEffect(VFX_COM_HIT_ACID);
// Малый зеленый взрыв
effect e50i = EffectVisualEffect(VFX_COM_HIT_FIRE);
// МалаЯ огненнаЯ вспышка
effect e51i = EffectVisualEffect(VFX_DUR_CALTROPS);
// Взрыв ежиков

// ***********  ЗАКЛИНАНИЕ  ***********
effect e52i = EffectVisualEffect(VFX_FNF_HORRID_WILTING);
// Увeдание Аб-ма
effect e53i = EffectVisualEffect(VFX_FNF_ICESTORM);
// Ледeной шторм
effect e54i = EffectVisualEffect(VFX_FNF_METEOR_SWARM);
// Метеорный дождь
effect e55i = EffectVisualEffect(VFX_FNF_FIRESTORM);
// Огненный шторм
effect e56i = EffectVisualEffect(VFX_FNF_TIME_STOP);
// Часы
effect e57 = EffectVisualEffect(VFX_DUR_BIGBYS_CLENCHED_FIST);
// Рука Бигли
effect e58 = EffectVisualEffect(VFX_DUR_BIGBYS_CRUSHING_HAND);
// Захват Бигли
effect e59 = EffectVisualEffect(VFX_DUR_BIGBYS_INTERPOSING_HAND);
// Вращ рука Бигли
effect e60 = EffectVisualEffect(VFX_DUR_WEB);
// Паутина удержание
effect e61 = EffectVisualEffect(VFX_DUR_WEB_MASS);
// Паутина удержание под ногами
effect e62 = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
// Кожа кора
effect e63 = EffectVisualEffect(VFX_DUR_PETRIFY);
// КаменнаЯ кожа
effect e64 = EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR);
// ЧернаЯ кожа
effect e65 = EffectVisualEffect(VFX_DUR_GHOSTLY_PULSE);
// Теневой режим
effect e66 = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE);
// Призрачный вид
  effect e67 = EffectVisualEffect(VFX_DUR_ETHEREAL_VISAGE);
// Фиолетовый вид
  effect e68 = EffectVisualEffect(VFX_DUR_BLUR);
// Телесное мерцание
effect e69i = EffectVisualEffect(VFX_FNF_SCREEN_BUMP);
// Толчки 1
effect e70i = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE);
// Толчки 2
effect e71i = EffectVisualEffect(VFX_IMP_KNOCK);
// ПульсирующаЯ голубаЯ звезда  (взлом замка)

// ***********  ЛУЧИ  ***********
effect e72i = EffectVisualEffect(VFX_FNF_SUNBEAM);
// Большой желтый луч
effect e73i = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_FIRE);
// Огненный луч
effect e74i = EffectVisualEffect(VFX_IMP_HEALING_X);
// Синий луч
effect e75i = EffectVisualEffect(VFX_IMP_LIGHTNING_M);
// Молнии луч

// ***********  ПОД НОГАМИ  ***********
effect e76i = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
// Доспехи супер героЯ
effect e77 = EffectVisualEffect(VFX_DUR_ANTI_LIGHT_10);
// Чернота под ногами (тьма)
effect e78 = EffectVisualEffect(VFX_DUR_ELEMENTAL_SHIELD);
// Огненный круг под ногами
effect e79 = EffectVisualEffect(VFX_DUR_SPELLTURNING);
// Синий круг под ногами
effect e80 = EffectVisualEffect(VFX_DUR_FREEDOM_OF_MOVEMENT);
// Зеленый круг под ногами
effect e81i = EffectVisualEffect(VFX_COM_SPARKS_PARRY);
// Искры у ног
effect e82i = EffectVisualEffect(VFX_IMP_LIGHTNING_S);
// Малый взрыв электричества под ногами
effect e83 = EffectVisualEffect(VFX_DUR_TENTACLE);
// Черные нити
effect e84 = EffectVisualEffect(VFX_DUR_ENTANGLE);
// Папоротник
effect e85i = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
// Пар
effect e86 = EffectVisualEffect(VFX_DUR_FLAG_BLUE);
// Флаг синий
effect e87 = EffectVisualEffect(VFX_DUR_FLAG_GOLD);
// Флаг фиолетовый
effect e88 = EffectVisualEffect(VFX_DUR_FLAG_PURPLE);
// Флаг желтый
effect e89 = EffectVisualEffect(VFX_DUR_FLAG_RED);
// Флаг красный

// ***********  У ГОЛОВЫ  ***********
effect e90 = EffectVisualEffect(VFX_DUR_BARD_SONG);
// Музыка и ноты
effect e91i = EffectVisualEffect(VFX_IMP_DOOM);
// Гроза над головой
effect e92i = EffectVisualEffect(VFX_IMP_HEAD_ACID);
// Зеленый взрыв над головой
effect e93i = EffectVisualEffect(VFX_IMP_HEAD_COLD);
// Голубой взрыв над головой
effect e94i = EffectVisualEffect(VFX_IMP_HEAD_ELECTRICITY);
// Электрический взрыв над головой
effect e95i = EffectVisualEffect(VFX_IMP_HEAD_EVIL);
// Красный взрыв над головой
effect e96i = EffectVisualEffect(VFX_IMP_HEAD_FIRE);
// Огненный взрыв над головой
effect e97i = EffectVisualEffect(VFX_IMP_HEAD_HEAL);
// Сине-желтый взрыв над головой
effect e98i = EffectVisualEffect(VFX_IMP_HEAD_HOLY);
// Желтый взрыв над головой
effect e99i = EffectVisualEffect(VFX_IMP_HEAD_MIND);
// Фиолетовый взрыв над головой
effect e100i = EffectVisualEffect(VFX_IMP_HEAD_NATURE);
// Желто-зеленый взрыв над головой
effect e101i = EffectVisualEffect(VFX_COM_HIT_FIRE);
// Малый oгненный взрыв у головы
effect e102i = EffectVisualEffect(VFX_COM_BLOOD_SPARK_LARGE);
// Радужные брызги у головы
effect e103i = EffectVisualEffect(VFX_COM_BLOOD_SPARK_MEDIUM);
// Радужные брызги
effect e104i = EffectVisualEffect(VFX_COM_BLOOD_CRT_RED);
// Красный шар взрыв у головы
effect e105i = EffectVisualEffect(VFX_COM_BLOOD_CRT_YELLOW);
// Желтый шар взрыв у головы
effect e106i = EffectVisualEffect(VFX_IMP_STUN);
// Ледeной взрыв над головой
effect e107i = EffectVisualEffect(VFX_IMP_HEALING_G);
// Маг радужное облако
effect e108 = EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT);
// Замешательство облако
effect e109 = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
// Замешательство птички
effect e110 = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED);
// Замешательство нимб голубой
effect e111 = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);
// Страх
effect e112 = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
// Замешательство спираль
effect e113 = EffectVisualEffect(VFX_DUR_PARALYZED);
// Замешательство круг кинжалов

// ***********  ПРОЧИЕ  ***********
effect e114i = EffectVisualEffect(VFX_FNF_PWSTUN);
// КраснаЯ спираль
effect e115 = EffectVisualEffect(VFX_DUR_PARALYZE_HOLD);
// БольшаЯ белаЯ спираль
effect e116 = EffectVisualEffect(VFX_DUR_AURA_COLD);
// Аура голубаЯ
effect e117i = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY);
// ОгненнаЯ спираль
effect e118i = EffectVisualEffect(VFX_IMP_HEALING_L);
// Фонтан голубой спиральный
effect e119i = EffectVisualEffect(VFX_IMP_HEALING_M);
// Малый столб света
effect e120i = EffectVisualEffect(VFX_IMP_HEALING_S);
// МалаЯ голубаЯ спираль
effect e121 = EffectVisualEffect(VFX_DUR_DARKNESS);
// МалаЯ тьма
effect e122 = EffectVisualEffect(VFX_DUR_GLOBE_INVULNERABILITY);
// Маг сфера
effect e123 = EffectVisualEffect(VFX_DUR_GLOBE_MINOR);
// ПризрачнаЯ маг сфера
effect e124 = EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE);
// Маг рваннаЯ сфера
effect e125 = EffectVisualEffect(VFX_DUR_PROTECTION_EVIL_MAJOR);
// Красный дождь
effect e126 = EffectVisualEffect(VFX_DUR_PROTECTION_EVIL_MINOR);
// Малый красный дождь
effect e127 = EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MAJOR);
// Желтый дождь
effect e128 = EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MINOR);
// Малый желтый дождь
effect e129 = EffectVisualEffect(VFX_DUR_SANCTUARY);
// БольшаЯ синеЯ спираль
effect e130 = EffectVisualEffect(VFX_DUR_PROTECTION_ELEMENTS);
// Желтый маг дождь
effect e131 = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_15);
// Свет желтый
effect e132 = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_15);
// Свет белый
effect e133 = EffectVisualEffect(VFX_DUR_LIGHT_RED_15);
// Свет красный
effect e134 = EffectVisualEffect(VFX_DUR_LIGHT_BLUE_15);
// Свет голубой
effect e135 = EffectPetrify();
// Окаменение - статуЯ
effect e136 = EffectAppear();
// Прыжок с неба
effect e137 = EffectDisappear();
// Прыжок в небо и уничтожение объекта
effect e138 = EffectCharmed();
// Эффект зачаровывает цель - (не может говорить)
effect e139 = EffectCutsceneParalyze();
// Эффект парализации
effect e140 = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
// ПолнаЯ невидимость
effect e141i = EffectDeath();
// Эффект смерти
effect e142 = EffectHaste();
// Эффект ускорение
effect e143 = EffectEntangle();
// Эффект запутывание
effect e144i = EffectResurrection();
// Эффект воскрешениe
effect e145 = EffectSleep();
// Эффект сон
effect e146 = EffectVisualEffect(VFX_IMP_SLEEP);
// Эффект сон
effect e147 = EffectSlow();
// Эффект замедление - цель затормаживает на 50%
effect e148 = EffectCurse(3,3,3,3,3);
// ПРОКЛЯТИЕ
//**************************
//=============== НАЛОЖИТЬ ЭФФЕКТ ==============================================
void EffectOnPC(object oObject, effect eOne, float iTime, int iNUM)
{
location lEffect = GetLocation(oObject);
if (iNUM == 1) ApplyEffectToObject(DURATION_TYPE_INSTANT, eOne, oObject);
if (iNUM == 2) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eOne, oObject, iTime);
if (iNUM == 3) ApplyEffectToObject(DURATION_TYPE_PERMANENT, eOne, oObject);
if (iNUM == 4) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eOne), oObject, iTime);
if (iNUM == 5) ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(eOne), oObject);
if (iNUM == 6) ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eOne, lEffect);
}
//=============== СНЯТЬ ВСЕ ЭФФЕКТЫ ============================================
void DelEffectOnPC(object oObject)
{
effect eOne = GetFirstEffect(oObject);
while (GetIsEffectValid(eOne))
{
  RemoveEffect(oObject, eOne);
  eOne = GetNextEffect(oObject);
}
}
//=============== СНЯТЬ ЭФФЕКТ =================================================
void DelOneEffectOnPC(object oObject, int iOne)
{
effect eEffect = GetFirstEffect(oObject);
while (GetIsEffectValid(eEffect))
{
  if (GetEffectType(eEffect) == iOne)
  RemoveEffect(oObject, eEffect);
  eEffect = GetNextEffect(oObject);
}
//  int iOne -  EFFECT_TYPE_...
}


Эффекты сгруппировал по визуальному восприятию, если кого не устраивает описание, пишите свое. Если после номера эффекта стоит «i» - то этот эффект только «INSTANT» (может где и ошибся, извиняйте).
Noah
Привет!Пытаюсь сделать триггер для повышения навыка(любого),типа вы скрылись в тени бонус к hide+6,а когда выидешь,чтобы бонус исчезал. Кроме того нужно чтоб бонусы не складывались.Кто знает как напишите.
Lex
Триггер скиловой модификации. Для всех, и игрока и НПС.
(по аналогии можно сделать и модификацую атаки, АС и прочее)

lx_ten_skillmod - на ентер триггера

NSS
void main()
{
int mod = GetLocalInt(OBJECT_SELF,"MOD");
if (mod == 0) return;
object oPC = GetEnteringObject();
int skill = GetLocalInt(OBJECT_SELF,"SKILL");

string Comment = GetName(OBJECT_SELF);
effect eEffect;
if (mod > 0)
    {
    eEffect = SupernaturalEffect(EffectSkillIncrease(skill,mod));
    }
else
    {
    eEffect = SupernaturalEffect(EffectSkillDecrease(skill,-mod));
    }
if (GetLocalInt(OBJECT_SELF,"MSG"))
    SendMessageToPC(oPC,"*"+Comment+"*");
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eEffect,oPC);
}




lx_tex_skillmod на экзит триггера
NSS
#include "inc_effects" // библа написана выше на пару постов
void main()
{
int mod = GetLocalInt(OBJECT_SELF,"MOD");
if (mod == 0) return;
object oPC = GetExitingObject();
int TYPE = 0;
if (mod > 0)
    {
    TYPE = EFFECT_TYPE_SKILL_INCREASE;
    }
else
    {
    TYPE = EFFECT_TYPE_SKILL_DECREASE;
    }
E_DeleteSpecificEffect(oPC,OBJECT_SELF,TYPE,SUBTYPE_SUPERNATURAL,DURATION_TYPE_PERMANENT);
}


делаем триггер, ставим эти 2 скрипта в слоты. Вешаем локалки
MOD, которая хранит значение модификации. Модификация может быть как положительной так и отрицательной.
MSG Это флаг того, будет ли выдаваться игроку сообщение (сообщение при входе это имя триггера).
SKILL номер скила, который меняется

int SKILL_ANIMAL_EMPATHY = 0;
int SKILL_CONCENTRATION = 1;
int SKILL_DISABLE_TRAP = 2;
int SKILL_DISCIPLINE = 3;
int SKILL_HEAL = 4;
int SKILL_HIDE = 5;
int SKILL_LISTEN = 6;
int SKILL_LORE = 7;
int SKILL_MOVE_SILENTLY = 8;
int SKILL_OPEN_LOCK = 9;
int SKILL_PARRY = 10;
int SKILL_PERFORM = 11;
int SKILL_PERSUADE = 12;
int SKILL_PICK_POCKET = 13;
int SKILL_SEARCH = 14;
int SKILL_SET_TRAP = 15;
int SKILL_SPELLCRAFT = 16;
int SKILL_SPOT = 17;
int SKILL_TAUNT = 18;
int SKILL_USE_MAGIC_DEVICE = 19;
int SKILL_APPRAISE = 20;
int SKILL_TUMBLE = 21;
int SKILL_CRAFT_TRAP = 22;
int SKILL_BLUFF = 23;
int SKILL_INTIMIDATE = 24;
int SKILL_CRAFT_ARMOR = 25;
int SKILL_CRAFT_WEAPON = 26;
Kavin
Создаю скрипт для овцы, которая ночью должна баиньки ложиться.
Имеется следующая проблема: после пробуждения овца не желает выполнять действия, определенные ей как Action через скрипт.

NSS
//Событие, отправляющее овцу поближе к пастуху и укладывающее ее спать.
if (nEvent==EVENT_S_SLEEP)
    {
    if (GetLocalInt(oSelf, "int_EVENT")==EVENT_S_SLEEP)
        return;
    SetLocalInt(oSelf, "int_EVENT", EVENT_S_SLEEP);
    float fDist=(Random(8)+1)*1.0;
    ActionMoveToObject(oPastuh, FALSE, fDist);
    effect eSleep=EffectSleep();
    ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSleep, oSelf));
};

//Событие, которое "будит" овцу.
if (nEvent==EVENT_S_WAKEUP)
    {
    SetLocalInt(oSelf, "int_EVENT", EVENT_S_WAKEUP);
    //Снимаем эффект сна.
    effect eEffect=GetFirstEffect(oSelf);
    while (GetIsEffectValid(eEffect))
        {
        if (GetEffectType(eEffect)==EFFECT_TYPE_SLEEP)
            RemoveEffect(oSelf, eEffect);
        eEffect=GetNextEffect(oSelf);
        };
    ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));
    };

//Событие, которое заставляет овцу шляться по локации (типа пастись).
if (nEvent==EVENT_S_WALK)
    {
    SetLocalInt(oSelf, "int_EVENT", EVENT_S_WALK);
    ClearAllActions();
    location lWalkTo=RandomLocation(oPastuh, 20.0, FALSE);
    ActionMoveToLocation(lWalkTo, FALSE);
    ActionWait(3.0);
    ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));
    };


При таком раскладе команд событие EVENT_S_WALK после пробуждения не наступает ВООБЩЕ.
Т.е. строка "ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));" не срабатывает.
Пробовал менять код вот так:
NSS
//Событие, которое "будит" овцу.
if (nEvent==EVENT_S_WAKEUP)
    {
    SetLocalInt(oSelf, "int_EVENT", EVENT_S_WAKEUP);
    //Снимаем эффект сна.
    SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK));
    effect eEffect=GetFirstEffect(oSelf);
    while (GetIsEffectValid(eEffect))
        {
        if (GetEffectType(eEffect)==EFFECT_TYPE_SLEEP)
            RemoveEffect(oSelf, eEffect);
        eEffect=GetNextEffect(oSelf);
        };
    };

При этом овца вскакивает после сна, пробегает до заданной location, а потом опять застывает и стоит.
Т.е. строка "ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));" опять-таки не срабатывает, но на этот раз в событии EVENT_S_WALK.
ClearAllActions() в разных местах не помогает.
Что делать?..

.......................................

Блин, понял сам, в чем дело. Все симптомы навели на то, что блокирован стек действий персонажа. А посему исправил код вот так:
NSS
if (nEvent==EVENT_S_WAKEUP)
    {
    SetLocalInt(oSelf, "int_EVENT", EVENT_S_WAKEUP);
    effect eEffect=GetFirstEffect(oSelf);
    while (GetIsEffectValid(eEffect))
        {
        if (GetEffectType(eEffect)==EFFECT_TYPE_SLEEP)
            RemoveEffect(oSelf, eEffect);
        eEffect=GetNextEffect(oSelf);
        };
    SetCommandable(TRUE, oSelf);//Разблокируем командный стек.
    ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));
    };

Все заработало. Ларчик просто открывался... Но как-то странно. Это что, глюк движка?..
..::SERGO::..
Тут такая трабла. Перс при заходе в модуль ничего не одевает, но все вещи есть в инвентаре, и он может все носить!
NSS
void main()
{
object oMod = GetModule();
object oPC = GetEnteringObject();

if (!GetIsPC(oPC) || GetLocalInt(oMod, "START_GAME"))
       {return;}
       {
       SetLocalInt(oMod, "START_GAME", TRUE); //Only one use!
     TakeGoldFromCreature(GetGold(oPC),oPC,TRUE); //Get All Money
       object oItem = GetFirstItemInInventory(oPC); //Take off the hole inventory!
        while(GetIsObjectValid(oItem)) //If there is an object
        {
            DestroyObject(oItem);  //Destroy it
            oItem = GetNextItemInInventory(oPC); //Next object!
        }
        int i=0;//destory amunition
        while(i<14)
        {
        DestroyObject(GetItemInSlot(i, oPC));
        i++;
        }
          GiveGoldToCreature(oPC, 3000);  //GiveGold
         CreateItemOnObject("LO", oPC, 1);  //Objects
         CreateItemOnObject("DO", oPC, 1);
         CreateItemOnObject("HO", oPC, 1);
         CreateItemOnObject("MO", oPC, 1);
         CreateItemOnObject("AO", oPC, 72);
         object oItemCr = GetFirstItemInInventory(oPC);
         while(GetIsObjectValid(oItemCr))
             {
             SetIdentified(oItemCr,TRUE);
             oItemCr = GetNextItemInInventory(oPC);
             }
             AssignCommand(oPC, ActionEquipMostEffectiveArmor());//Put on everything
       }
}


LEX: перенес в соот. тему. Но вообще ты должен сам понимать, что скрипты больше пары строк это уже не по скриптам вопрос, а не для новичков.

По теме: одевая с задержкой и отчисть стек акций до этого. У тебя мб просто шмотки создаться не успевают. И оденется не все, а только армор.
LokiJ_Tzn
Кто-нить знает, как можно сделать, чтобы труп, остающийся после смерти создания, реагировал на щелчок по нему мышью иначе, чем обычно? (не открывал лут, а исполнял какой-нить скрипт)
Dik Morris
LokiJ_Tzn

Имхо, лучше сделать проще - после смерти NPC создавать невидимый плейс и уже ему вешать на onUsed нужный скрипт.


..::SERGO::..

Попробуй ввести задержку на создание предметов, например так:
NSS
// Перед началом оснв. фун-ции: (тобишь void main())
void ActionCreateItem(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)
{
    CreateItemOnObject(sItemTemplate, oTarget, nStackSize);
}

Работает аналогично CreateItemOnObject(""), но может ставиться в очередь действий или делей.

QUOTE
Перс при заходе в модуль ничего не одевает


Одевается только одежда, для оружия можно юзать, ActionEquipMostDamagingMelee и ActionEquipMostDamagingRanged.
LokiJ_Tzn
QUOTE(Dik Morris @ May 23 2006, 16:27) [snapback]82548[/snapback]

LokiJ_Tzn

Имхо, лучше сделать проще - после смерти NPC создавать невидимый плейс и уже ему вешать на onUsed нужный скрипт.



Спасибо, я уже разобрался smile.gif посидел ночью и модифицировал x0_i0_corpse, чтоб он создавал кастомный плейс невидимого объекта вместо лутабельного трупа.
Это для скиннинга smile.gif
DarkDeivel
В игре максимум 20 лвл. Как сделать чтобы был максимальный 100. Если скрипт скажите плиз. declare.gif
kreon
2DarkDeivel: это тебе это читать надо smile.gif
dumbo
QUOTE(DarkDeivel @ May 24 2006, 15:44) [snapback]82630[/snapback]
В игре максимум 20 лвл. Как сделать чтобы был максимальный 100. Если скрипт скажите плиз.

начнем с того, что "в игре" уже давно(начиная с hotu) левел-кап для игроков - 40. это зашито в движок. чтобы сделать больше 40 нужно делать довольно нетривиальную систему, суть которой - куча скриптов + custom 2da + nwnx + leto.
забудь вобщем. во всяком случае до тех пор, пока не повысишь свой скилл в нвн-строительстве на несколько порядков. pardon.gif
..::SERGO::..
Ну все, блин, здаюсь. Все перепробывал(наверно не все, раз пишу сюда). Мне надо, чтобы можно было заговорить с дверью, чтобы одна ветка появлялась вслучае определенного предмета в инвенатре, чтобы после отдачи этого предмета двери, дверь уничтажалась. ух, все.
Dik Morris
В диалоге делай проверку, на определенный предмет. (Используя скрипт визард)
Разрушай дверь либо дестроем, либо нужным эффектом.

NSS
// Text Appears When
int StartingConditional()
{
   if (GetItemPossessor(GetObjectByTag("таг_айтема")) == GetPCSpeaker())
     {return TRUE;}

    return FALSE;
}

NSS
// ActionTakens
void main(){DestroyObject(OBJECT_SELF);}
..::SERGO::..
как не странно, но визардский скрипт мне немного другое дал, поэтому я припер сюды
Dik Morris
Этот скрипт не имеет особых различий с визардским, там используется фун-ция HasItem, которая схожа с GetItemPossessor.

PS: просто в HasItem, есть проверка на валидность объекта. smile.gif
Noah
Lex спасибо за помощь!Советую всем строителям добавить в локи триги с бонусами и т.П.Разнобразие боя!Теперь по делу,проблема слeдующая:в катсцене я сажу npc на стул(ActionSit),далее npc с него не встает,(а он должен идти на wp1) даже если стул убить!Катсцена становится вечной.Как сделать чтоб npc встал и пошел.
kreon
NSS
SetCutsceneMode(oPC, TRUE);
DelayCommand(1.0f, AssignCommand(oNPC, ClearAllActions(TRUE)));
DelayCommand(1.1f AssignCommand(oNPC, ActionMoveToObject(GetObjectByTag("wp1"))));
DelayCommand(3.0f, SetCutsceneMode(oPC, FALSE));

1 строка - катсцена
2 - очистить стек (встанет со стула)
3 - пойдет к обьекту с тегом wp1
4 - конец катсцены
Zirrex
..::SERGO::.., не пользуйся визардовскими скриптами, как правило, они пишут не совсем то, что хотелось бы, и часто в них больше мусора, чем нужного кода. Стоит учиться самому писать скрипты.
Aiwan
Noah, тебе неплохо было бы прочесть мои статьи по авроре, я там разбирал такой аспект, как акция и просто действие. Возможно твой НПС выполняет не акцию сидения, а воспроизводит анимацию но не как акцию. И он может седеть так оооочень долго.
Noah
Спасибо,теперь она встает.Айван,кинь ссылку на статьи,я с этого и начинал скриптинг,но мог что-то пропустить.А нет ли анимаций сидячим нпс?
Aiwan
http://download.wrg.ru/public_wrg/toolset/...ra_tutorial.exe


QUOTE(Noah @ May 30 2006, 00:41) [snapback]83142[/snapback]
А нет ли анимаций сидячим нпс?

Вот скрипт, думаю разберешься.
NSS
//:://////////////////////////////////////////////
//:: OnUserDefaine  am_cud_sit
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Скрипт садит НПС на стул или на землю.
    SIT_CHAIR - таг стула для сидения.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 07.07.2005
//:://///////////////////////////////////////////


void main()
{
  object oPC = GetFirstPC();
  if (GetIsDead(OBJECT_SELF)==TRUE) return; // Если он помер, то пусть молчит
  if (GetArea(OBJECT_SELF)!=GetArea(oPC)) return;
  if (GetLocalInt(OBJECT_SELF, "STOP")) return; // Отключаем если нам это надо
  if (GetIsInCombat(OBJECT_SELF))  return;
  if (IsInConversation(OBJECT_SELF)) return;
  int nEvent = GetUserDefinedEventNumber();
//=========================== HEARTBEAT EVENT ==================================
if (nEvent == EVENT_HEARTBEAT) // Сигнал поступает с HeartBeat слота.
  {
//------------------------------------------------------------------------------
  if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CROSS") == TRUE)
      {
      if (GetLocalInt(OBJECT_SELF, "DISTURBED")) return;

          ClearAllActions();
          SetLocalInt(OBJECT_SELF, "DISTURBED", TRUE);
          ActionMoveToLocation(GetLocalLocation(OBJECT_SELF, "initLoc"));
          ActionDoCommand(SetFacing(GetLocalFloat(OBJECT_SELF, "initFacing")));
          ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.9);
          return;
      }
//------------------------------------------------------------------------------
  if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CHAIR") == TRUE)
      {
      if (GetLocalInt(OBJECT_SELF, "FLAG_SIT_CHAIR") == 2)
          return;

    if (GetCurrentAction() == ACTION_SIT) return;
    if (GetCurrentAction() == ACTION_MOVETOPOINT) return;

          object oChair = GetNearestObjectByTag("SIT_CHAIR");
          if (GetIsObjectValid(oChair))
          {
              ClearAllActions();
              ActionSit(oChair);
              ActionDoCommand(SetLocalLocation(OBJECT_SELF, "initFacing", GetLocation(OBJECT_SELF)));
          }
      }
  }
//============================= DIALOGUE EVENT =================================
  if (nEvent == EVENT_DIALOGUE)  // Стандартный сигнал
    {
      SetLocalInt(OBJECT_SELF, "DISTURBED", FALSE);
    }
//============================= PERCIEVE EVENT =================================
  if (nEvent == EVENT_PERCEIVE)  // Стандартный сигнал
    {
    if (GetIsPC(GetLastPerceived()))
      {
        SetLocalInt(OBJECT_SELF, "DISTURBED", FALSE);
      }
    }
//========================== END COMBAT ROUND EVENT ============================
  if (nEvent == EVENT_END_COMBAT_ROUND)  // Стандартный сигнал
    {
    SetLocalInt(OBJECT_SELF, "DISTURBED", FALSE);
    }
//------------------------------------------------------------------------------
}


Скрипт ставится на слот UserDef
gennady
QUOTE(Noah @ May 29 2006, 22:41) [snapback]83142[/snapback]
А нет ли анимаций сидячим нпс?


Если я правильно понял вопрос, то вам нужна дополнительная анимация сидящим персам? Недавно этот вопрос обсуждался, читайте статью Лекса ЗДЕСЬ.
Если задействована ActionSit, то наложение анимации поднимет перса со стула. Можно совместить с ANIMATION_LOOPING_SIT_CHAIR кое-что из анимаций, но вот стул под перса не подставишь (или я это тупо делал). А вот на CROSS, можно все свободно вешать. Вот простой скрипт на ХБ-ит перса. Если нужно, чтобы перс смотрел в определенную сторону, то задайте точку "V_ + тэг перса."

NSS
void main()
{
  object oWay = GetWaypointByTag("V_" + GetTag(OBJECT_SELF));
  vector vFace = GetPosition(oWay);
if(GetArea(GetFirstPC()) != GetArea(OBJECT_SELF)) return; // если ПС нет локе
if (!IsInConversation(OBJECT_SELF))
  {
   SetFacingPoint(vFace);
   switch (Random(3)+1)
   {
    case 1:
    if(Random(100) >= 50)
    ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS);
    else
    ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK);
    break;
    case 2:
    if(Random(100) >= 50)
    ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);
    else
    ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK);
    break;
    case 3:
    if(Random(100) >= 50 && GetAbilityScore(OBJECT_SELF, ABILITY_INTELLIGENCE) >= 17)
    ActionPlayAnimation(ANIMATION_FIREFORGET_READ);
    else
    {
     if (GetGender(OBJECT_SELF)==GENDER_MALE)
     PlaySound("as_pl_yawningm1");
     else
     PlaySound("as_pl_yawningf1");
     ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);
    }
    break;
   }
   ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 6.0);
  }
}
/* Персонаж сидит на земле, пьет и чешет голову.
Если интеллект выше 17, то еще и читает. Слот HB */


Спасибо метрам за подсказку! Учту в дальнейшем. thank_you.gif
Aiwan
gennady, есть смысл добавить проверку РС в локации. Что бы НПС все это делал только если в локации есть игрок.
gennady

QUOTE(Aiwan @ Jun 1 2006, 09:23) [snapback]83448[/snapback]
gennady, есть смысл добавить проверку РС в локации. Что бы НПС все это делал только если в локации есть игрок.


Aiwan, если можно киньте оную. Вообще я подметил, что ХБ начинает работать в определенном радиусе от героя, или я не прав? Тут у меня назрел вопрос по скриптам на OnSpawn, ведь насколько я понял локалки в вышеприведенном вами скрипте, вешаются именно там. Просто у меня было несколько проколов. Все работает 10-20 раз, а на тридцатом, бах висяк! Пришлось переписать и бросить все ХБ, т.к. с сюжетным персам это непозволительно. Теперь трижды думаю, стоит ли ставить что на OnSpawn. Непонятно…, или это только у меня такие приколы? scratch_one-s_head.gif
Lex
QUOTE(gennady @ Jun 1 2006, 12:49) [snapback]83468[/snapback]
Вообще я подметил, что ХБ начинает работать в определенном радиусе от героя, или я не прав?

хб работают везде, во всех локациях. Но там, где нет игрока - чуть медленнее (бывает 7-8-9 секунд 1 такт)
NSS
// если игрок не в одной локе с НПС - выйти из скрипта
if( GetArea(GetFirstPC())!=GetArea(OBJECT_SELF)) return;
Aiwan
QUOTE(gennady @ Jun 1 2006, 14:49) [snapback]83468[/snapback]
Тут у меня назрел вопрос по скриптам на OnSpawn, ведь насколько я понял локалки в вышеприведенном вами скрипте, вешаются именно там. Просто у меня было несколько проколов. Все работает 10-20 раз, а на тридцатом, бах висяк! Пришлось переписать и бросить все ХБ, т.к. с сюжетным персам это непозволительно.

Ни разу не произошло ни одного сбоя. scratch_one-s_head.gif приведи код скрипта сюда.
gennady

QUOTE(Aiwan @ Jun 1 2006, 22:15) [snapback]83524[/snapback]
Ни разу не произошло ни одного сбоя. приведи код скрипта сюда.


Коды как мои, так и базовые, в том числе Леворовские. Неверский я видно тупо использовал, ребята спавнили перса в процессе игры, у меня же перс при загрузке уже находился в локе. Т.ч. есть рифы, и о них надо помнить. Да, забыл, были банальные баги при раздачи уровня. scratch_one-s_head.gif

Доморощенный код (последний баг, сработал 50/50, стал только сюжетным)
NSS
void main()
{
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_PERMANENT,
SupernaturalEffect(EffectPetrify()), OBJECT_SELF));
DelayCommand(1.5, SetPlotFlag(OBJECT_SELF, TRUE)); // сюжет
}


os_died (кусок кода из скрипта Левора, стоял полный код)
NSS
void main()
{
    SetLocalInt(OBJECT_SELF, "SPAWNED_DEAD", 1);
    SetIsDestroyable(FALSE, FALSE, FALSE);
    effect eDeath = EffectDeath();
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);
}


nw_c2_j_assvict1 (базовый неверский код)
NSS
#include "NW_I0_GENERIC"
void main()
{
    SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); 
    SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);
    SetListeningPatterns();    // Goes through and sets up which shouts  the NPC will listen to.
    WalkWayPoints();          // Optional Parameter: void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
                              // 1. Looks to see if any Way Points in the module have the tag "WP_" + NPC TAG + "_0X", if so walk them
                              // 2. If the tag of the Way Point is  "POST_" + NPC TAG the creature will return this way point after
                              //    combat.
}
Aiwan
Команда Делей не всегда корректно, а скажем почти всегда неккоректно работает с OBJECT_SELF. Делай так:
NSS
object oSelf = OBJECT_SELF;


NSS
void main()
{
    object oNpc = OBJECT_SELF;
    SetIsDestroyable(FALSE,FALSE,FALSE);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(TRUE,TRUE), oNpc);
}

Вообще не рекомендую тереть скрипты спавновские полностью, если НПС должен что то делать. Если он мертвый то три. Код выше.
-fenix-
Делай лучше вообще не использовать в спауне, как раз всякие баги и 50/50 и вылезают.
Особенно, когда мод грузится, при загрузке лок либо нет такого, либо баги реже/меньше, но при загрузке мода 100% бяки вылезают.
Kavin
Возникла следующая проблема:
На одну из ветвей диалога вешаю вот такой скрипт:
NSS
const float SND_DURATION=5.0;

void main()
{
ClearAllActions();
ActionWait(1.5);
ActionDoCommand(PlaySound("sound_2"));
ActionWait(SND_DURATION);
ActionStartConversation(GetPCSpeaker(), "dialog_name", FALSE, FALSE);

}

По идее, NPC должен чуть подождать (1.5 сек), проиграть звук, а потом начать диалог.
А он ждет 5 секунд (SND_DURATION), а затем начинает диалог и параллельно проигрывает звук. Где у меня неправильно?..
kreon
NSS
const float SND_DURATION=5.0;

void main()
{
ClearAllActions();
DelayCommand(1.5, ActionDoCommand(PlaySound("sound_2")));
DelayCommand(SND_DURATION+1.5, ActionStartConversation(GetPCSpeaker(), "dialog_name", FALSE, FALSE));
}

Ждет полторы секунды, играет звук, ждет 5 секунд, начинает диалог.
Kavin
kreon, прикинь - не работает!
А вот что написано в лексиконе:
QUOTE
This might not be an actual bug, but though PlaySound isn't an action (you don't get the little yellow square on the screen), if you assign a PlaySound to someone, it will wait for their current action queue to finish before playing.


Сейчас буду извращаться на тему...
kreon
Гмм.. ща тоже чего-нить попробую... Я думал что ошибка в ActionWait(), т.к. действия воспроизведения звука не вейтятся вроде...
.
А, идея повяилась... Сделать SetCommandable(FALSE) (нечего будет ждать), воспроизвести звук и потом дать команду диалога.
Kavin
Итак, злобно извратившись, я добился того, чего хотел.
Вот так:

Родительский скрипт:
NSS
void main()
{
object oSelf=OBJECT_SELF;

ClearAllActions();
DelayCommand(1.5, PlaySound("sound_1"));
DelayCommand(1.5, ExecuteScript("play1", oSelf));

}


Скрипт play1:
NSS
const float SND_DURATION=3.0;

void main()
{
ActionWait(SND_DURATION);
ActionStartConversation(GetPCSpeaker(), "dialog_1", FALSE, FALSE);
}
Lex
а нафига так то?
NSS
void main()
{
ClearAllActions();
DelayCommand(1.5, PlaySound("sound_1"));
ActionWait(SND_DURATION + 1.5);
ActionStartConversation(GetPCSpeaker(), "dialog_1", FALSE, FALSE);
}

те звук через делей, остальное в стек.
ну или взять вариант Креона и выкинуть там ActionDoCommand, ибо в том варианте под задержкой он нафиг не нужен.
В стек стремно по 1 причине - можно сбить. Поэтому можно подстраховаться и стек закрыть smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.