Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
Dik Morris
QUOTE
Короче - Отдельно за хенчей, без PC, можно играть? И как энто буит выглядеть в скриптах???

Нет кажется нельзя, можно только за фамильяра.
Aiwan
QUOTE(gennady @ Apr 11 2006, 16:14) [snapback]77311[/snapback]
-fenix-, а если просто кинуть спел лечения от яда?

Дело в том, что ядом может быть поражен РС и в бою с пауком и во время этого же боя стрелой от врага. Чей яд удалять?
QUOTE(Fortesso @ Apr 11 2006, 03:59) [snapback]77267[/snapback]
Отдельно за хенчей, без PC, можно играть? И как энто буит выглядеть в скриптах???

Нельзя. Никак.
Lex
QUOTE(Fortesso @ Apr 11 2006, 14:43) [snapback]77314[/snapback]
Отдельно за хенчей, без PC, можно играть? И как энто буит выглядеть в скриптах???

ну можно в принципе, но кривовато. Игроку поменять внешность, фенотип, сбросить левелы в 0, дать опыта, автолевелап по нужному направлению и вперед. Имя останется правда старым, но и это можно обойти. В диалогах писать не <FullName> а какой-нить токен, который переприсваивать в зависимости от того, кто играет. Но это все кривовато smile.gif Так что лучше забудь.
virusman
Можно. Использовать БД для сохранения почти всех игровых и особенно сюжетных данных (да, тут сложно, но возможно), а после разветвления сюжета попросить игрока перезайти чаром-хенчем, которому уже можно накидать левелы, шмотки и т.д. в соответствии с БД. Можно даже копию оригинального чара игрока сделать для участия в катсценах при игре за хенча.
2_advanced
можно из хенчей сделать прообразы и полиморфить в них без возможности располиморфиться.. drag.gif

ну и изменить полиморф так, чтоб можно было кастовать, использовать предметы и т.п.. drag.gif
в 1.67 появится возможность менять внешний вид, мутировать можно будет smile.gif
prankster2.gif че-то несу какую-то хрень smile.gif
Aiwan
Да бросьте вы стардать. scratch_one-s_head.gif Теоретически ВСЕ можно. И каняшек с фикалиями и полимерфы НПС с мегашкуркой что сменить все статы, функции смены имени и проччеее. Человеку это надо? Нет. Поспасить решили? Интеллектуально smile.gif Марш по мастерским и работать. Трансмутаторы, растудыт вас... biggrin.gif
Elf-Drow
Извиняюсь за глупый вопрос, но можно ли проверить наличие в инвентаре PC определенного кол-ва предметов?
virusman
Айв, человек спросил, можно ли. Я предложил совершенно реальный способ. Непростой - да. Но, например, написать работающий боевой АИ в разы сложнее. А кто-то ведь пишет. Так что не надо так.
*ушёл скриптить дальше*
Lex
QUOTE(Elf-Drow @ Apr 12 2006, 16:07) [snapback]77475[/snapback]
Извиняюсь за глупый вопрос, но можно ли проверить наличие в инвентаре PC определенного кол-ва предметов?

в базе есть + было ну совсем недавно

QUOTE(virusman @ Apr 12 2006, 16:08) [snapback]77476[/snapback]
Так что не надо так.

просто дело в том, что парня интересовал простой способ. А новичку подрубать БД и делать другие описанные тобой операции... малек трудновато. smile.gif
Aiwan
QUOTE(virusman @ Apr 12 2006, 18:08) [snapback]77476[/snapback]
Айв, человек спросил, можно ли. Я предложил совершенно реальный способ. Непростой - да. Но, например, написать работающий боевой АИ в разы сложнее. А кто-то ведь пишет. Так что не надо так.
*ушёл скриптить дальше*

Вирь, зря обижаешься. Я же по отечески smile.gif РАЗ. Во творых, не надо новичу забивать голову. Вот и все. wink3.gif
Kavin
Хотел спросить: есть ли возможность сохранить стек действий создания?..
То есть ему задана очередь действий, но стоит кому-то с ним заговорить или атаковать его - и он останавливается, последовательность прерывается и все...
Можно ли на время разговора или сражения запомнить эту последовательность и потом ее возобновить с прерванной точки?..
[MoF]Darth_Nick
1 действие можно через GetCurrentAction
Zirrex
Kavin, если только после каждого выполненного действия не сохранять переменную. Например, НПС подошел к столу - сохраняем переменную; НПС открыл сундук - сохраняем переменную. Переменная одна, меняется лишь цифра. Если НПС прервали, продолжить с последней переменной. Расписать серию условий по переменным, что если переменная равна тому-то, начать с этого действия. И не важно, что делал НПС, и как далеко отошел от своей цели. Не сохранять новую переменную до тех пор, пока он не выполнит своего задания. Когда НПС начинает идти по второму разу, повторяя свой цикл, сбросить переменную в ноль.

Ради интереса можешь посмотреть скрипты Мораг. У нее все расписано по часам, что если происходит то-то, делать это. Использованы те же условия.
Lex
QUOTE(Kavin @ Apr 19 2006, 22:19) [snapback]78804[/snapback]
То есть ему задана очередь действий, но стоит кому-то с ним заговорить или атаковать его - и он останавливается, последовательность прерывается и все...
Можно ли на время разговора или сражения запомнить эту последовательность и потом ее возобновить с прерванной точки?..

я подробно описывал алгоритм анимации НПС, который включает в себя такие вещи. (прерывание разговором. боем так же, небольшой добавкой в скрипт onEndCombatRaund). Причем там был приведен как сам код, так и подробное описание. Не говоря уже о демо-модуле. Насколько я знаю, ты интересовался этим еще осенью, неужели с тех пор без изменений?
Kavin
Lex, да, с тех пор без изменений. Я тулсет закрыл в декабре, а открыл после этого 9-го апреля.
А в какой теме ты это описывал, не напомнишь?..
ЗЫ.: Про демо-модуль ничего не слышал, правда. scratch_one-s_head.gif
Lex
2 статьи по анимации на старом сайте. Сайт снесли в феврале вроде, а статьи на новый не переехали пока. Когда ты тогда интересовался этим вопросом, я давал линки. Сейчас у мя нет на харде тех материалов.
Dik Morris
Kavin
Статьи есть ЗДЕСЬ


LEX: забыл про народ, уехали оттуда черте когда, а сайт висит. smile.gif) Надеюсь перенесем на сайт статью.
Kavin
Спасибо! Работаю.
Артём
Кто-нибудь может написать скрипт на повышения силы, ловкости и т.д?
Так чтобы это было постаяннао. swoon.gif
Dik Morris
NSS
// Apply eEffect to oTarget.
void ApplyEffectToObject(int nDurationType, effect eEffect, object oTarget, float fDuration=0.0f)

NSS
// Create an Ability Increase effect
// - bAbilityToIncrease: ABILITY_*
effect EffectAbilityIncrease(int nAbilityToIncrease, int nModifyBy)

NSS
// Set the subtype of eEffect to Supernatural and return eEffect.
// (Effects default to magical if the subtype is not set)
// Permanent supernatural effects are not removed by resting
effect SupernaturalEffect(effect eEffect)


1 минус - иконка справа от портрета игрока.
(Хотя это как сказать... Кажется ЗДЕСЬ Lex, предлагал иной способ.)

PS:
QUOTE
Так чтобы это было постаяннао

int DURATION_TYPE_PERMANENT.
Артём
А можит кто-то другой сможыт исправить так чтобы небыло значька.
[/nss]void main()
{
object oTargetPC = GetPCSpeaker();
effect oEffectAbilityIncrease = EffectAbilityIncrease (ABILITY_CONSTITUTION, 1);
ApplyEffectToObject(DURATION_TYPE_ PERMANENT, oEffectAbilityIncrease, oTargetPC);
}

И ещё напишыте пожалуйста скрипт на снятие одежды с героя.
[MoF]Darth_Nick
QUOTE
И ещё напишыте пожалуйста скрипт на снятие одежды с героя.

поиск юзай..
Elf-Drow
Здрасьте, не подскажете как можно в определенный момент, к примеру катсцены, включить воспроизведение музыки? пробовал через звук(обычный, как объект), но он не хочет воспроизводиться. А музыку свою в игру вставлял в формате BMU, как описано в мануале Айвана, но он ее не видит, хотя делал все точно по инструкции. Подсобите, пожалуйста, советом...
Dik Morris
Вкл. боевую музыку:
NSS
// Play the battle music for oArea.
void MusicBattlePlay(object oArea)

Если нужно сменить уже играющею то:
NSS
// Change the background day track for oArea to nTrack.
// - oArea
// - nTrack
void MusicBackgroundChangeDay(object oArea, int nTrack)

Либо:
NSS
// Change the background night track for oArea to nTrack.
// - oArea
// - nTrack
void MusicBackgroundChangeNight(object oArea, int nTrack)

Соответственно с battle точно также.
NSS
// Change the battle track for oArea.
// - oArea
// - nTrack
void MusicBattleChange(object oArea, int nTrack)

QUOTE
музыку свою в игру вставлял в формате BMU, как описано в мануале Айвана, но он ее не видит, хотя делал все точно по инструкции.

Заместо константы TRACK_ , ставь номер своей композиции, из 2da ambietmusic.

QUOTE
А можит кто-то другой сможыт исправить так чтобы небыло значька.

Повторюсь: http://www.wrg.ru/forums/index.php?showtopic=1798

QUOTE
И ещё напишыте пожалуйста скрипт на снятие одежды с героя.

NSS
// Unequip oItem from whatever slot it is currently in.
void ActionUnequipItem(object oItem)
Elf-Drow
А дык через что присваивать Area? Через Location? А Location тода через что?
Dik Morris
QUOTE
А дык через что присваивать Area? Через Location? А Location тода через что?

В зависимости от ситуации.
Например, если ты хочешь сменить трек в текущей локации:
NSS
object oArea = GetArea(OBJECT_SELF);// Т.е oArea - сама лока

Если в какой либо другой:
NSS
object oArea = GetArea(GetObjectBtTag(""));
windhover
Доброго времени суток. У меня возник вопрос, если он глупый, прошу строго не судить - так как это мой первый опыт в написании скриптов.
Решил немного модифицировать скрипт с реакцией гварда на оружие в руках игрока: при виде игрока с оружием в руках, гвард начинает диалог(предлагает заплатить штраф), при отказе платить штраф вызывается следующий скрипт:
CODE

void main()
{
object oPC = GetPCSpeaker();
object OS = OBJECT_SELF;
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);

      if (!GetIsObjectValid(oWeapon)) return;

      DelayCommand(0.30, ActionSpeakString("Может так ты лучше поймешь!"));
      DelayCommand(0.60, ActionUseFeat(FEAT_IMPROVED_DISARM, oPC));
      DelayCommand(1.40, ApplyEffectToObject(1, EffectKnockdown(), oPC, 8.0));
      DelayCommand(0.25, SetStandardFactionReputation(REPUTATION_TYPE_ENEMY, 50, oPC));
      DelayCommand(2.30, ClearAllActions(TRUE));
      DelayCommand(4.30, ActionPickUpItem(oWeapon));
      DelayCommand(7.20, ActionMoveToObject(oPC, FALSE, 1.4));
      DelayCommand(10.0, AssignCommand(OBJECT_SELF, ActionStartConversation(oPC, "dl_afterdisarm")));
}

Ведет он себя абсолютно непредсказуемо. Чаще всего гвард после проведения дизарма остается хостайл и продолжает атаковать игрока.
Подскажите, пожалуйста в чем может быть проблема или скажите хоть куда копать.
Спасибо.

З.Ы.
DelayComand() - это задержка от начала выполнения скрипта или от предыдущего действия?
Lex
QUOTE(windhover @ Apr 26 2006, 02:49) [snapback]79626[/snapback]
DelayComand() - это задержка от начала выполнения скрипта или от предыдущего действия?

от начала
QUOTE(windhover @ Apr 26 2006, 02:49) [snapback]79626[/snapback]
Чаще всего гвард после проведения дизарма остается хостайл и продолжает атаковать игрока.

ну ессно. Ты ж его заставляешь применить фит, который расценивается как атака. Смена отношения между РС и хостайлами не ясна.
Если уж на то пошло, то тебе надо такое:
- отчистить стеки акций у обоих участников
- (тут можно поставить TemporaryEnemy)
- применить фит дизарм
- наложить кнок
- с небольшой задержкой после дизарма очищай персональные отношения, можешь насильно поставить нейтрал
- запускай диалог. Но учти, что после боя требуется время.

как вариант - выкинуть дизарм. Те анимашка (быстрый взмах рукой.. скажем ANIMATION_LOOPING_TALK_FORCEFUL), эффект кнока, копирование оружия на землю и удаление из руки. Подбор и диалог сразу.

windhover
QUOTE(Lex @ Apr 26 2006, 02:53) [snapback]79629[/snapback]

как вариант - выкинуть дизарм. Те анимашка (быстрый взмах рукой.. скажем ANIMATION_LOOPING_TALK_FORCEFUL), эффект кнока, копирование оружия на землю и удаление из руки. Подбор и диалог сразу.

Спасибо большое, вариант без дизарма действителшьно лучше, так как стража тоже иногда "1" бросает =)
Еще один глупый вопрос: если скрипт вызывается из диалога, ClearAllActions(TRUE) у кого очистит стэк акций?

P.S. простите, поправил.. Mozilla чегойто... unsure.gif unsure.gif
Lex
QUOTE(Aiwan @ Apr 26 2006, 19:32) [snapback]79700[/snapback]
Еще один глупый вопрос: если скрипт вызывается из диалога, ClearAllActions(TRUE) у кого очистит стэк акций?

в диалоге если не указываешь объект, или указываешь OBJECT_SELF, то это относится к НПС, с которым разговариваешь. Тут это особо не нужно (я про отчистку), но лучше подстраховаться и ввести в правило: что-то делаешь с Игроком/Неписью - отчисть его стек, если это возможно. (бывают случаи когда стек наоборот чистить не нужно, но эт другая история)
Talarasha
Добрый день smile.gif. Не особо разбираюсь в скриптах - все познания ограничиваются установкой локальных переменных, созданием монстров и эффектами, поэтому частенько заглядываю сюда в поисках готовых примеров. Долго искал, но не смог обнаружить, как сделать:
1.Вызов приживалы (спутника, существа у магов и колдунов), вызов элементалей и планаров доступным только в определенных областях и с наличием определенных предметов в инвентаре.
2.Предмет, вызывающий определенное существо сроком на 6 минут, после чего его использование становится невозможным на 12 минут.
Буду очень признателен, если кто-нибудь окажется достаточно терпеливым и объяснит мне, как это сделать smile.gif.
Dik Morris
QUOTE
2.Предмет, вызывающий определенное существо сроком на 6 минут, после чего его использование становится невозможным на 12 минут.

В закрытой локации, поставь готового NPC.
Поскольку конкретно ничего не сказано о:
QUOTE
после чего его использование становится невозможным

Я сделал так что NPC, после истечении 6 минут, прыгает на нужный вайпоин.
(Скажем, в той же закрытой локе)

На onActivateItem в мод. св-вах:
NSS
void main()
{
  object oPC = GetItemActivator(); // Игрок;
  object oNPC = GetObjectByTag(""); // Таг вызываемого NPC;
  object oWP = GetObjectByTag(""); // Таг "домашнего" вейпа;
  object oItem = GetItemActivated(); // Активируемый предмет;

     if (GetTag(oItem) == "") // Здесь укажи таг oItem ;
      {
        if (GetLocalInt(oPC, "Local") == FALSE)
         {
            SetLocalInt(oPC,"Local", 1);
            DelayCommand(1200.0, SetLocalInt(oPC,"Local",0));
            effect eVisual = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_FIRE);
            DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPC));

            DelayCommand(0.7, AssignCommand(oNPC, ClearAllActions(TRUE)));
            DelayCommand(1.0, AssignCommand(oNPC, ActionJumpToObject(oPC)));

            DelayCommand(599.7, AssignCommand(oNPC, ClearAllActions(TRUE)));
            DelayCommand(600.0, AssignCommand(oNPC, ActionJumpToObject(oWP)));

           
         }

        if (GetLocalInt(oPC, "Local") == TRUE)
         FloatingTextStringOnCreature("Нужное время еще не пришло.", oPC);
      }
}

QUOTE
1.Вызов приживалы (спутника, существа у магов и колдунов), вызов элементалей и планаров доступным только в определенных областях и с наличием определенных предметов в инвентаре.

Это можно сделать, немного модернизировав вышеприведенный код, т.е добавить проверку на айтемы, локи и т.п...
Talarasha
Премного благодарен smile.gif.
virusman
Есть гостиница, в ней - разные комнаты. В некоторых есть окна, во всех есть различные источники искусственного освещения.
Нужно сделать естественное освещение, т.е. с наступлением дня и ночи менять тайловое освещение в тех комнатах, в которых есть окна.
Но поскольку просто так скриптами границы комнаты не определишь (насколько я знаю), есть вопрос: Как, по-вашему, наиболее удобно/эффективно обозначать расположение тайлов комнаты для скрипта? Можно, конечно, и в скрипт коррдинаты каждого тайла запихнуть, но это как-то не очень. Повторюсь: ВСЕ тайлы менять не надо, только определённые комнаты.
mefist
Недавно сел за редактор и никак не могу понять следующие вещи.

Как приказать NPC двигаться в точку? И как назначить эту точку?

При генерации вещей в сундуках, они выбратся из указанного уровня вещей. А можно ли редактировать эти самые уровни? Например, при генерации золота на высоком уровне получается около 20 золотых, а мне нужно примерно 1000-3000. И можно как-то сделать, чтобы они генерировались из заданного мной списка вещей?
Dik Morris
mefist
Для начала прочитай FAQ по тулсету - отпадет много вопросов. ЗДЕСЬ ~ 4mb

QUOTE
Как приказать NPC двигаться в точку?

С помощью фун-ции:
NSS
void ActionMoveToObject(
    object oTarget,
    int bRun = FALSE,
    float fRange = 1.0f
);

QUOTE
И как назначить эту точку?

WayPoints Wizard.
QUOTE
И можно как-то сделать, чтобы они генерировались из заданного мной списка вещей?

Например так:
NSS
void main()
{
  // OnOpen сундука
    object oPC = GetLastOpenedBy();

    if (GetLocalInt(OBJECT_SELF,"Open") == 0)
     {
      SetLocalInt(OBJECT_SELF,"Open",TRUE);

      if (GetHitDice(oPC) == 1)
         CreateItemOnObject("ResRef_itema", OBJECT_SELF);        

      if (GetHitDice(oPC) == 2)
         CreateItemOnObject("ResRef_itema", OBJECT_SELF);

      if (GetHitDice(oPC) == 2)
         CreateItemOnObject("ResRef_itema", OBJECT_SELF);
    // 3, 4, 5 левелы и т.д...
         }
}
azathoth
QUOTE(virusman @ Apr 29 2006, 15:15) [snapback]80129[/snapback]
Но поскольку просто так скриптами границы комнаты не определишь (насколько я знаю), есть вопрос: Как, по-вашему, наиболее удобно/эффективно обозначать расположение тайлов комнаты для скрипта?


в 1.67 есть что-то вроде GetAreaSize(), но близко не смотрел. Для обозначения тайлов удобнее всего ставить вэйпоинты, и по их координатам определять, что за тайл.

Почему-то когда пыталася сделать нечто подобное, то ничего не было видно, пока не выйдешь и снова не зайдешь в область. RecalculateStaticLighting() не помогает. Похоже цвет вделанных в тайлы факелов считается статическими данными, т.е. считываются один раз при заходе в область, а RecalculateStaticLighting пересчитывает карту теней, учитывая статические данные о свете и свет плейсов. Кажется по этой же причине нельзя создавать звуки скриптами. Хотя, может быть просто что-то криво делал wacko.gif
mefist
Спасибо. А можно все-таки менять границы категорий при генерации вещей? Например, при генерации золота категории high создается около 20 золота, а мне нужно, допустим, около 1000. Или есть какая-то другая альтернатива? С деньгами то проще, их можно делать через рандом, а вот с вещами мне что-то ничего в голову не приходит.

И еще вопрос, как сделать чтобы в диалоге учавствали сразу несколько NPC?
Aiwan
QUOTE(mefist @ Apr 30 2006, 00:16) [snapback]80189[/snapback]
И еще вопрос, как сделать чтобы в диалоге учавствали сразу несколько NPC?

Читайте мой мануал с сайта. Очень много чего написано.
mefist
Ты про Цикл "Aurora Toolset"? я что-то там этого не нашел. Не мог бы дать ссылку?
Aiwan
Посомтри в теме ссылок здесь в это разделе. Там как раз мой мануал есть в PDF.
Aiwan
А вы знаете, что енкаучеры не удаляются smile.gif Я вот не шмог удалить... pardon.gif Кто шмог?
gennady
QUOTE(Aiwan @ May 4 2006, 19:10) [snapback]80757[/snapback]

А вы знаете, что енкаучеры не удаляются smile.gif Я вот не шмог удалить... pardon.gif Кто шмог?

Aiwan, я тоже не смог, но можно запретить после определенного события. Устроит?
NSS
void main()
{
object oPC = GetFirstPC();
AssignCommand(oPC, SetEncounterActive(FALSE, GetObjectByTag("VOLKI")));
}
// Удалить встречу с монстрами
Aiwan
gennady, спасибо. У меня оно так и работает. Но бывает случай, когда енкаучер уже совсем не нужен. Раньше я ставил удалить. А вот недавно понял что не удаляется. Это гораздо обломнее узнать после выхода модуля... Я просто молодежи писал скрипт на срабатывание енкаучера по локалке. Вот его переписал заново. Енкаучер должен быть неактивен и срабатывать только один раз в настройках.

NSS
//:://////////////////////////////////////////////
//:: OnEnter  am_een_local_on
//:: Copyright © 2006 WRG!
//:://////////////////////////////////////////////
/*
  Включает енкаучер, если на РС нет ни одной
  локальной переменной равной стрингу LOCAL_PC_0X
  float "TIME" - время срабатывания енкаучера
  Локалка "NUMBER" - означает сколько раз сработает.
  Если ее нет, сразу уничтожится.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 04.05.2006
//:://////////////////////////////////////////////
#include "am_inc_debug"

void main()
{
  object oPC = GetEnteringObject();
  object oEnc = OBJECT_SELF;
  object oArea = GetArea(OBJECT_SELF);
  float f = GetLocalFloat(oEnc, "TIME");
  int i = GetLocalInt(oEnc, "NUMBER");
  string sLl = GetLocalString(oEnc, "LOCAL_PC_01"); // Локальные переменные
  string sL2 = GetLocalString(oEnc, "LOCAL_PC_02"); // при каторых енкаучер
  string sL3 = GetLocalString(oEnc, "LOCAL_PC_03"); // не сработает.
  string sL4 = GetLocalString(oEnc, "LOCAL_PC_04");
  string sL5 = GetLocalString(oEnc, "LOCAL_PC_05");
  int iFalse;

  if(!GetIsPC(oPC)) return;
  if(GetLocalInt(oEnc, "FIGHT!")) return; // Енкаучер сработал
  if(sLl=="" && sL2 =="" && sL3=="" && sL4=="" && sL5=="") return;

  if(GetLocalInt(oPC, sLl) || GetLocalInt(oPC, sL2) || GetLocalInt(oPC, sL3)
  || GetLocalInt(oPC, sL4) || GetLocalInt(oPC, sL5))
  {
    Debug("Енкаучер '"+GetName(oEnc)+"' не сработает, т.к. переменные триггера и РС совпали.");
    return;
  }
  if(i == 0) // Если 0, то отключаем
  {
      Debug("Отключаем енкаучер. Манчи плачут на взрыд...");
      // Манчи плачут на взрыд...
      return;
    }
    else if(GetEncounterActive(oEnc) == FALSE)
      {
        if (f == 0.0) f = 600.0; // 10 минут, стандартный респавн
        SetEncounterActive(TRUE);
        DelayCommand(1.0, SetEncounterActive(FALSE, oEnc));
        SetLocalInt(oEnc, "FIGHT!", TRUE);
        // Тут самое интересное. Неактивный енкаучер DelayCommand не исполняет
        // поэтому я попросил это сделать локацию, в котором он стоит. Она вроде
        // как не против...
          SetLocalInt(oEnc, "NUMBER", i-1);
          Debug("Енкаучер сработает еще ["+IntToString(GetLocalInt(oEnc, "NUMBER"))+"] раз. ");
          AssignCommand(oArea, DelayCommand(f, SetLocalInt(oEnc, "FIGHT!", FALSE)));

      }
      else return;
}
gennady
QUOTE(Aiwan @ May 8 2006, 10:27) [snapback]81091[/snapback]
Но бывает случай, когда енкаучер уже совсем не нужен.


Тогда проще написать скрипт встреч на обычный триггер, и если нужно, то удалять этот триггер. Как раз недавно писал такой скрипт, может кому пригодится.

NSS
//:://////////////////////////////////////////////
//:: Created By: Gennady
//:: Created On:27.04.2006
//:://////////////////////////////////////////////
void main()
{
object oPC = GetEnteringObject();
object oSelf = OBJECT_SELF;
object oPlc = GetNearestObjectByTag("LOC_"+GetTag(oSelf));
location lLoc = GetLocation(oPlc);
string sResRef = GetName(oSelf); // Объект создаваемый
string sNewTag = GetTag(oSelf);  // Тег созданиЯ
int iN = StringToInt(GetLockKeyTag(oSelf)); // Количество созданий
int iNN = StringToInt(sNewTag); // Количество встреч
int iNM = 0;
effect eEffect1 = EffectVisualEffect(VFX_IMP_LIGHTNING_M);
effect eEffect2 = EffectVisualEffect(VFX_IMP_DISPEL);

if(!GetIsPC(oPC)||GetLocalInt(oSelf, "DEACTIVATED")) return;
{
  while (iN != iNM)
  {
   if (GetIsObjectValid(oPlc))
   CreateObject(OBJECT_TYPE_CREATURE, sResRef, lLoc,TRUE,sNewTag);
   else
   CreateObject(OBJECT_TYPE_CREATURE, sResRef, GetLocation(oSelf),TRUE,sNewTag);
   iNM++;
  }
if (GetIsObjectValid(oPlc))
{
  ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect1, GetLocation(oPlc));
  DelayCommand(1.5, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect2, GetLocation(oPlc)));
}
else
{
  ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect1, GetLocation(oSelf));
  DelayCommand(1.5, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect2, GetLocation(oSelf)));
}
   if (sNewTag == "1")
  {
    DelayCommand(0.2, SetLocalInt(oSelf, "DEACTIVATED", TRUE));
   DestroyObject(oSelf, 2.0);
  }
   else
   {
    DelayCommand(0.2, SetLocalInt(oSelf, "DEACTIVATED", TRUE));
    DelayCommand(1000.0, SetLocalInt(oSelf, "DEACTIVATED", FALSE));
    if (iNN < 1) return;
    SetLocalInt(oSelf, "NUM", GetLocalInt(oSelf, "NUM") + 1);
    if (GetLocalInt(oSelf, "NUM") >= iNN)
    DestroyObject(oSelf, 2.0);
   }
}
}
/*            Встреча
  Триггер содержит в названии ResRef объкта, который появится.
  Точка, где появится объект LOC_+Тег триггера, если точки нет - то к триггеру.
  Поле триггера KeyTag - Количество созданий
  Если тег триггера 1, то встреча только один раз, если другой,
  то повтор через 1000 секунд, если цифра, то это количество встреч.
*/
Aiwan
Если бы все было так просто.... pardon.gif Триггер залудить это две секунды. Даже если взять в расчет уровень игрока и потом спавнить НПС или монстров. Но ваш триггер громадный дизбаланс... Вы это поймете когда запустите в модуль игрокоы с уровнем 5-10 примерно.
Lex
Триггер проигрывает энкаунтеру в:
- гибкости и легкости настройки (добавить, удалить из листа, уникальный спавн и прочее)
- спавн на энкаунтерах сбалансированный, по CR, а на триггерах нет.
а выигрыш только в том, что его можно удалить.
сомнительные преимущества триггера smile.gif
Don_Beavis
Глупый нубский вопрос rolleyes.gif . Как поднять максимальное кол-во опыта, получаемое при убийстве моба и как сделать так, что бы в пати опыт резался не по полам(в случае если патя из двух человек), а процентов на 10, и что бы сумоны не жрали экспу. Заранее спасибо smile.gif
Aiwan
1. Ставим уровень игры Изи. Открываем вкладку в свойствах модуля в Адвантес:
QUOTE

Приспособьте ползунок так, чтобы снимать тот опыт, который герой автоматически получит в течение игры:

0% - опыт должен быть присужден или вручную, или же по сценарию.
100% - стандартные вознаграждения опыта, основанные на таблице НН.
2000% - 20 x стандартный награды опыта
Chimeric
Ситуация: у всех NPC в OnConversation стоит

NSS
оbject oPC = GetFirstPC();

SetCutsceneMode(oPC, TRUE);

ActionStartConversation(oPC, "", FALSE, TRUE);


После чего они начинают свой разговор в режиме катсцены. Штука, однако, в том, что при таком режиме не работает то, что вроде бы должно. Например, нужно сделать так, чтобы трое неписей напали на нас и окончился режим катсцены. Ставил вот что на последнюю реплику:


NSS
void main()
{

object oPC = GetPCSpeaker();
object oTarget;

SetCutsceneMode(oPC, FALSE);


oTarget = GetObjectByTag("1");

DelayCommand(0.2, SetIsTemporaryEnemy(oPC, oTarget));

DelayCommand(0.2, ActionAttack(oPC));

oTarget = GetObjectByTag("2");

DelayCommand(0.2, SetIsTemporaryEnemy(oPC, oTarget));

DelayCommand(0.2, AssignCommand(oTarget, ActionAttack(oPC)));

oTarget = GetObjectByTag("3");

DelayCommand(0.2, SetIsTemporaryEnemy(oPC, oTarget));

DelayCommand(0.2, AssignCommand(oTarget, ActionAttack(oPC)));

}


Откладываю команды чуть-чуть, чтобы сначала выйти из фильма. Получается черт знает что, точнее, и того не выходит. Между прочим, пытался менять местами в TemporaryEnemy oPC и oTarget. Не помогает.

Или вот еще. Когда начинается разговор в том же режиме, то ставлю на первую реплику игрока следующее, чтобы к нему повернулись:

NSS
void main()
{

object oPC = GetPCSpeaker();

AssignCommand(GetObjectByTag("1"), SetFacingPoint(GetPosition(oPC)));

DelayCommand(0.5, AssignCommand(GetObjectByTag("2"), SetFacingPoint(GetPosition(oPC))));
DelayCommand(0.5, AssignCommand(GetObjectByTag("2"), ActionPlayAnimation(ANIMATION_FIREFORGET_SPASM)));

DelayCommand(1.2, AssignCommand(GetObjectByTag("3"), SetFacingPoint(GetPosition(oPC))));
DelayCommand(1.6, AssignCommand(GetObjectByTag("3"), ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD)));

}


Не работает. И еще какая-то странность. Тот скрипт выше, с которым полагается начинать драку, все же позволяет мне выйти из разговора и режима фильма. Правда, никто не нападает. Зато если потом обычным порядком напасть на тех NPC, то есть выбрать меч в меню, то все тут же переходит в режим фильма и драка уже разыгрывается как в театре - без интерфейса, без урона (раз все стали Plot) и без конца. Кто-нибудь может это объяснить?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.