Помощь - Поиск - Пользователи - Календарь
Полная версия: Вопросы новичков
Город Мастеров > РЕДАКТОРЫ > 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, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103
Lex
см
Neverwinter Script
LevelUpHenchman()
shadowdweller
Благодарю, о лаконичнейший! Нашла, прочитала, но как использовать, по прежнему не понимаю pardon.gif
gennady
Цитата(shadowdweller @ Jun 20 2008, 00:54) *
А это как? Можно поподробнее?

Шад, шад, шад... Эх-хе-хей... Начнем с самого начала!

Для начала нужно знать, что уровень его должен быть первым, иначе нам не удастся поднять его под уровень героя. Если вам необходимо поднять уровень, то можно в скрипт спавна добавить повышение или новый класс. Помните, что классы спутников такие же, как и у героя, остальные классы вам также не удастся поднять… Я добавлю еще в этот скрипт фишку, чтобы труп спутника не исчезал. Тогда скрипт смерти, вы можете переписать по своему усмотрению… Сам скрипт:

Neverwinter Script
//:://////////////////////
//:: Слот: OnSpawn
//:://////////////////////
#include "X0_INC_HENAI"
void main()
{
    //User ranged weapons by default if true.
    SetAssociateState(NW_ASC_USE_RANGED_WEAPON, FALSE);
    SetAssociateState(NW_ASC_DISTANCE_2_METERS);
    // Труп не исчезает и будет юзабельным
    SetIsDestroyable(FALSE, TRUE, TRUE);
    int nHenchLevel = GetHitDice(OBJECT_SELF);

    if (nHenchLevel == 1)
    {
      if (GetTag(OBJECT_SELF) == "TAG")
        {
            // Класс воин
        LevelUpHenchman(OBJECT_SELF, CLASS_TYPE_FIGHTER);
            // Класс СВЯЩЕННИК
        LevelUpHenchman(OBJECT_SELF, CLASS_TYPE_CLERIC);
        }
    }
}


Так вот, если ты пробила в спавне своему хенчу бессмертие, то перед дестроем его нужно убрать. Если ты в палитре настраиваешь хенчам уровень, параметры и шмотки и пытаешься базовым скриптом поменять хенчей, то вот тебе скриптик:

Neverwinter Script
void main()
{
object oPC = GetPCSpeaker();
object oSP = OBJECT_SELF;

// Снимаем бессмертие
AssignCommand(oSP, SetIsDestroyable(TRUE, TRUE, TRUE));
//Запускаем базовый скрипт замены хенчей
ExecuteScript("nw_ch_action_17", oSP); // * Henchman levels up
}


Если повышаем уровни хенча только скриптами и в палитре у него стоит первый уровень, то читай ниже...

Чтобы уровни спутника повышались, при повышение уровня героя, нужно в модульные свойства в слот OnPlayerLevelUp, поставить базовый скрипт x1_playerlevelup, или написать свой скрипт поднятия уровня спутника. Чтобы поднять уровень спутника до уровня героя с диалога, нужно написать примерный скрипт:

Neverwinter Script
void main()
  {
    object oPC = GetPCSpeaker();
    object oSP = GetHenchman(oPC);
    int LoPC = GetHitDice(oPC);
    int LoSP = GetHitDice(oSP);

  while (LoPC > LoSP)
  {
  LevelUpHenchman(OBJECT_SELF, CLASS_TYPE_FIGHTER);
  LoSP++;
  }
}
/* Повысить уровень воина до уровня героя */


Так, теперь скрипт с переодеванием и заменой хенчей из палитры… Писал для своего Тузика, т.к. он собачка и класс у него только животное, но вот в отличие от первых Неверских хенчей у него есть возможность открыть инвентарь и кой куда повесить шмотку.

Neverwinter Script
//:://////////////////////////////
//:: УРОВЕНЬ ТУЗИКА
//:: File name: tuzik_level
//:: Created By: Gennady
//:://////////////////////////////
void main()
{
    object oPC = GetPCSpeaker();
    object oSP = OBJECT_SELF;
    object oItem;
    int i;
    int LoPC = GetHitDice(oPC);
    int LoSP = GetHitDice(oSP);
    string sResRef = "dog_tuzik";
    location Loc = GetLocation(oSP);

  if (LoPC > 2) sResRef = "dog_tuzik_1";
  if (LoPC > 4) sResRef = "dog_tuzik_2";
  if (sResRef == GetResRef(oSP))
  {
  AssignCommand(oSP, SpeakString("Гав... Ррууу..."));
  SendMessageToPC(oPC, "<cюa >Тузик грустно лает… Похоже, что сейчас он не может ничему научиться…</c>");
  return;
  }
  object oTuz = CreateObject(OBJECT_TYPE_CREATURE, sResRef, Loc);
  DelayCommand(1.0, AssignCommand(oTuz, SpeakString("Гав... Ррууу...")));
  DelayCommand(1.0, SendMessageToPC(oPC, "<c у >Тузик утвердительно лает. Он может научиться всему, что вы пожелаете.</c>"));
  DelayCommand(1.5, AssignCommand(oTuz, ClearAllActions()));
  object oInv = GetFirstItemInInventory(oSP);
    while(GetIsObjectValid(oInv))
      {
      CopyItem(oInv, oTuz);
      oInv = GetNextItemInInventory(oSP);
      }
  for (i = 0; i < 14; i++)
  {
  oItem = GetItemInSlot(i, oSP);
  if (GetIsObjectValid(oItem))
    {
    object oItemN = CopyItem(oItem, oTuz);
    DelayCommand(1.51, AssignCommand(oTuz, ActionEquipItem(oItemN, i)));
    }
  }
  effect eOne = EffectVisualEffect(VFX_IMP_UNSUMMON);
  DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eOne, oSP));
  AssignCommand(oSP, SetIsDestroyable(TRUE, TRUE, TRUE));
  DestroyObject(oSP, 2.0);
  AssignCommand(oPC, ClearAllActions());
  DelayCommand(0.2, SetCommandable(FALSE, oPC)); // заблокировать очередь
  AssignCommand(oPC, ActionWait(2.5));
  AssignCommand(oPC, ActionDoCommand(AddHenchman(oPC, oTuz))); // Дать нового спутника
  AssignCommand(oPC, ActionDoCommand(SetCommandable(TRUE, oPC))); // разблокировать очередь
}


P.S. В этом скрипте пробито всего 2 повышения уровня… Кому надо пробейте нужное количество… Кстати, Шад, обрати внимание! В этом скрипте перед дестроем я снимаю бессмертие с Тузика, т.к. в спавне пробивал бессмертие… Удачи! smile.gif

Neverwinter Script
int iLev = 1;
  for (iLev = 1; iLev < 14; iLev++)
  {if (LoPC > iLev)  sResRef = "dog_tuzik_"+IntToString(iLev);}


Aiwan
shadowdweller, есть тема по хеньчманам, там заготовка, правила и все скрипты. Все работает как часы. Вот тут.
Aiwan
Neverwinter Script
LevelUpXP1Henchman();
Единственно, эту функцию ставь куда тебе надо и когда надо в скрипт.
Xfans
А можно хенчу задать что именно и как он будет апать? В смысле, например, визарду прокачать умение пользоваться всеми видами оружия, а не что-то касающееся исключительно магии. По умолчанию-то он прокачивает только то, что свойственно его классу.
Ilerien
Нужно ковырять таблички PackFT***.2da (*** - сокращённое название класса). Хенч левелапится согласно стандартному пакаджу.
Xfans
Спасибо! Тем временем возник следующий камень преткновения: нужно, чтобы NPC начинал определенный разговор не при наступании на триггер, а в определенное время (скажем, сутки спустя после предыдущего разговора). Реализуемо ли это и как? Все равно нужно рисовать где-то триггер или просто в конце первого диалога приладить какой-нибудь скрипт на возобновление беседы через сутки?
Ilerien
Легко можно разговор заделеить, вот только начнут они в бою болтать...
Neverwinter Script
DelayCommand(HoursToSeconds(24), <...>);
Xfans
А в течение этих суток они (т.е. PC и тот, с кем он должен говорить) могут беспрепятсвенно бегать где попало и делать все, что вздумается? И ровно через 24 часа начнут разговор №2? Вроде где-то мы видали такое условие If not in combat... Может, его еще сюда приделать?
Ilerien
Ну, ровно через 24 часа и будет новый разговор. Можно заюзать GetIsInCombat(), но тогда разговор совсем потеряется.
shadowdweller
Не мог бы кто-нибудь подсказать мне, где почитать про установку секретных дверей? Желательно, по-русски, в английском лексиконе как-то не очень понятно. Заранее спасибо smile.gif
Ilerien
Я когда-то собирался выложить свою систему потайных дверей, но как-то руки не дошли. sad.gif Могу скинуть и написать по-быстрому документацию wink3.gif
shadowdweller
Ilerien, была бы очень благодарна!
Ilerien
Выкладываю smile.gif В комплекте ерфка и маленький демонстрационный модуль.
azathoth
Цитата
Ну, ровно через 24 часа и будет новый разговор. Можно заюзать GetIsInCombat(), но тогда разговор совсем потеряется.

Neverwinter Script
void TryDialog(object oWith, string sDialog)
{
    if (мы в бою &#092; мертвы, игрок слишком далеко &#092; парализован &#092; окаменел &#092; рестится &#092; ведёт дилог ещё с кем-то и т.д и т.п)
    {
        DelayCommand(15.0, TryDialog(oWith, sDialog)); // попробовать позже
    }
    else // всё ок
    {
        ActionStartConversation(oWith, sDialog); // начать диалог
    }
}

void main()
{
    DelayCommand(HoursToSeconds(24), TryDialog(GetPCSpeaker(), "название следующего диалога"));
}
Xfans
Цитата(azathoth @ Jun 22 2008, 20:48) *
Neverwinter Script
void TryDialog(object oWith, string sDialog)
{
    if (мы в бою &#092; мертвы, игрок слишком далеко &#092; парализован &#092; окаменел &#092; рестится &#092; ведёт дилог ещё с кем-то и т.д и т.п)
    {

Эээ... тупые мы чего-то сегодня! У нас на англ все, так тама вместо "мы в бою" будет "GetIsInСombat". А вот что будет вместо тех циферок (&#092)?
Ilerien
Логическое или
Neverwinter Script
||
shadowdweller
Ilerien, спасибо! Скачала, пытаюсь разобраться. smile.gif
Xfans
Цитата(Ilerien @ Jun 21 2008, 15:37) *
Нужно ковырять таблички PackFT***.2da (*** - сокращённое название класса). Хенч левелапится согласно стандартному пакаджу.

Хмы, у нас нету таких файлов, есть тока pakages вообще, но там все сразу завязано тама как раз и написаны Pack-такой, Pack-сякой. А где сами пэки?

Цитата(Ilerien @ Jun 22 2008, 23:15) *
Логическое или
Neverwinter Script
||

Ага, тока почему-то у тебя это или нормально выглядит, а в том скрипте написано циферками. Это типа несоответствие html-кодов?
Ogneslav
Я тут создавал свой собственный клас и столкнулся с несколькими проблемами. Если кто поможет их развязать буду очень благодарен.

1-когда я попытался написать cls_pres_**** то не смог найти откуда брать нужные параметры, мне нужно требования только друид, человек, 30 лвл.
2-какой программой редактировать dialog.tlk
3-если я добавляю класу фиты, то ни где не могу их взять(использовать) в игре они не отображаются, тоесть отображаются толшько в описании персонажа, а активные скилы ни куда не выносятся, что делать?
4-я пытаюсь создать совершенно новый клас заклинателя, если можно это сделать, то подскажите как, а если нельзя, то скажите как сделать чтобы мой новый класс мог использовать заклинания друида, как сви, в своем меню.

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

P.S. вот еще что где можно взять иконки для класов, в ссылках я не видел.
Xfans
Цитата(Ilerien @ Jun 17 2008, 00:53) *
На заход в модуль. Что с игроком произойдёт - это нужно вписать в блок.
Neverwinter Script
object oPC = GetEnteringObject();
if(GetName(oPC) == "имя")
{
    ApplyEffectToObject(DURATION_TYPE_INSTANT, oPC, SupernaturalEffect(EffectDeath())); // например, эта строчка убьёт игрока с неугодным именем
    BootPC(oPC); //а эта выкинет его из модуля
}

Пиплы! не работает!!! ваще никак! не выкидывает, а на убивание вообще компайлер сохранять такой скрипт не хочет! unsure.gif
Может вся проблема в GetFirstPC?

Цитата(azathoth @ Jun 16 2008, 21:33) *
Neverwinter Script
if (GetName(GetFirstPC()) == "Лорд Нэшер Собственной Персоной")

Имеется ввиду только имя? или вместе с фамилием?
Ilerien
Цитата
Я тут создавал свой собственный клас и столкнулся с несколькими проблемами. Если кто поможет их развязать буду очень благодарен.

1-когда я попытался написать cls_pres_**** то не смог найти откуда брать нужные параметры, мне нужно требования только друид, человек, 30 лвл.
2-какой программой редактировать dialog.tlk
3-если я добавляю класу фиты, то ни где не могу их взять(использовать) в игре они не отображаются, тоесть отображаются толшько в описании персонажа, а активные скилы ни куда не выносятся, что делать?
4-я пытаюсь создать совершенно новый клас заклинателя, если можно это сделать, то подскажите как, а если нельзя, то скажите как сделать чтобы мой новый класс мог использовать заклинания друида, как сви, в своем меню.

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

P.S. вот еще что где можно взять иконки для класов, в ссылках я не видел.

1. Общий уровень чара вроде бы нельзя включить в требования. Можно потребовать определённую базовую атаку.
Код
2DA V2.0                                                      
                                                              
           LABEL       ReqType    ReqParam1       ReqParam2  
0          Human        RACE      6               ****          
1          Druid      CLASS   3               ****    
2          BaseAttack_20       BAB      20      ****    
3          ScriptVar   VAR        <имя переменной>   0

2. Content Editor
3. Поставить OnMenu в 1ку в cls_feat_***
4. Вроде бы только заменить друида, кастомные спелбуки нвн не поддерживает. У меня есть проект кастомного спелбука через фиты, но это страшное извращение, да и непонятно, что делать с метамагией smile.gif
П. С. - Например, нарисовать smile.gif
Цитата
Хмы, у нас нету таких файлов, есть тока pakages вообще, но там все сразу завязано тама как раз и написаны Pack-такой, Pack-сякой. А где сами пэки?
Скачать 2да 1.68, где-то у биоварей валялись.
Цитата
Ага, тока почему-то у тебя это или нормально выглядит, а в том скрипте написано циферками. Это типа несоответствие html-кодов?
Хтмл тут ни при чём wink3.gif
Цитата
Пиплы! не работает!!! ваще никак! не выкидывает, а на убивание вообще компайлер сохранять такой скрипт не хочет!
Может вся проблема в GetFirstPC?
GetName() вернёт строку "имя, пробел, фамилия". Не хочет сохранять, потому что я с ходу не помню порядок аргументов в ApplyEffectToObject(). Значит, нужно так:
Neverwinter Script
ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oPC);
GetFirstPC() ни при чём)
Ogneslav
Цитата
3. Поставить OnMenu в 1ку в cls_feat_***

мдя протупил я.

Цитата
4. Вроде бы только заменить друида, кастомные спелбуки нвн не поддерживает.

тогда как заменить друида, я пробовал, ничего не получилось, вродебы везде гденадо друида ставил и пробовал свои таблицы некоторые писать, такие как cls_spgn_volhv всеравно ничего не вышло. unsure.gif

А вообще спасибо большое!

Цитата
Например, нарисовать


Если можно скажи с помощью какой проги можно такие нарисовать и как их добавить в невер
Ilerien
Цитата
Если можно скажи с помощью какой проги можно такие нарисовать и как их добавить в невер
Paint smile.gif Только потом сохранить формате TGA любой прогой, которая это умеет делать, например, ACDSee. Добавить - ну например сунуть в хак, подключённый к нужному модулю. Или в оверрайд.
Xfans
Цитата(Ilerien @ Jun 23 2008, 21:17) *
Не хочет сохранять, потому что я с ходу не помню порядок аргументов в ApplyEffectToObject().

Теперь он убивает героя, а как с Boot'om быть? Там вроде написано, что надо тока oPC дописать в скобках, а оно не фурычитsad.gif

Убивание ПС нам не подходит, потому что потом можно респауном возродиться и спокойно дальше ходитьsad.gif
Aiwan
Цитата(shadowdweller @ Jun 22 2008, 16:48) *
Не мог бы кто-нибудь подсказать мне, где почитать про установку секретных дверей? Желательно, по-русски, в английском лексиконе как-то не очень понятно. Заранее спасибо

Вот Нажмите для просмотра прикрепленного файла ерефка в ней триггер + дверь в палитру. Скрипт создает плейсебл (любой) на вейпоинте. Дверь как пример. Выглядит так: идет РС и Хеньман, если игра на Изи то хеньчман говорит фразу (настраивается) "помоему тут что -то есть!". Если игрок профукал проверку поиска, то ничего не создается. Если нет, то хеньчман говорит типа посомтри внимательно туда! Тут БАХ трат та та! Куча спелов бум в дымке закла появляется дверь! У игрока над головой текст "Вы увидели потайную деврь!" и хеньчман говорит, но вот видишь! (настраивается). Так можно создать хоть что, хоть дверь, хоть корабль, хоть люк в полу. Сама дверь плейсебловая, но у нее в свойствах есть скрипт, который запускает игрока туда куда ты укажешь в свойствах. Локальный стринг равен месту перемещения. Скрипт создает дверь, а потом запускает любой нужный тебе скрипт на эту новую дверь. Она может открыться или ей мойжно присвоить локальный стринг того поинта, куда будет попадать игрок. Если интересно могу набрасать демо мод, как все работает...

Так же есть система такая же для итемов. Наглядно видно как в монете находятся предметы на песке или в домах, как буд то игрок нашел что то случайно.

Но при этом помощники помогают, подсказывают комментирую найденное...

Вот скрипт на плейсебл дверь.
Neverwinter Script
//:://////////////////////////////////////////////
//:: OnExit  am_pus_used_door
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Скрипт использования PLC_ дверей и люков.
  LocalString "TRANSITION_TARGET" - Таг вейпоинта
  или триггера, куда мы перемещаемся. Если на
  объекте не будет этого стринга, значит он
  просто откроется - закроется при повторном
  использовании.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 08.10.2005
//:://///////////////////////////////////////////
#include "am_inc_common"

void main()
{
    object oPC = GetLastUsedBy();
    string sTarget = GetLocalString(OBJECT_SELF, "TRANSITION_TARGET");
    // sTarget - Это ТАГ объекта, куда мы переместимся
    object oTarget = GetObjectByTag(sTarget); // Сам объект

    if (GetLocked(OBJECT_SELF)) // Если закрыт, то ищем ключ и открываем
    {
        string sKey = GetTrapKeyTag(OBJECT_SELF);
        object oKey = GetItemPossessedBy(oPC, sKey);
        if (sKey != "" && GetIsObjectValid(oKey))
        {
            SetLocked(OBJECT_SELF, FALSE);
        }
        else
            {
              DelayCommand(0.1, PlaySound("as_dr_locked2"));
              return;
            }
    }
    if (GetIsOpen(OBJECT_SELF) && sTarget !="") // Если открыт и есть цель
    {
      AssignCommand(oPC, ClearAllActions());
      if(!GetIsObjectValid(oTarget)) // Если ошиблись с тагом цели
      {
        Debug("<cу  >ВНИМАНИЕ! </c>Не могу найти точку перемещения!");
        AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID));
        DelayCommand(1.0, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE));
        SetLocalInt(OBJECT_SELF, "OPEN", FALSE);
        return;
      }
      DelayCommand(0.7, AssignCommand(oPC, JumpToObject(oTarget)));
      // Следом за игроком отправляем всех помощников
      DelayCommand(1.0, JumpAssociateToObject(oPC, oTarget));
      SetLocalInt(OBJECT_SELF, "OPEN", FALSE);
      DelayCommand(1.5, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE));
      return;
    }
    if (!GetIsOpen(OBJECT_SELF))
    {
        AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID));
        DelayCommand(1.0, ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN));
        SetLocalInt(OBJECT_SELF, "OPEN", TRUE);

    }
    else
        {
            ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE);
            SetLocalInt(OBJECT_SELF, "OPEN", FALSE);
        }
}
Ilerien
Цитата
Теперь он убивает героя, а как с Boot'om быть? Там вроде написано, что надо тока oPC дописать в скобках, а оно не фурычит
Бут, наверное, в сингле не работает smile.gif Можно попробовать
Neverwinter Script
EndGame("");
shadowdweller
Цитата(Aiwan @ Jun 24 2008, 00:11) *
Если интересно могу набрасать демо мод, как все работает...

Интересно. smile.gif А еще интересно, можно ли настроить скрипт так, чтобы дверь появлялась только тогда, когда у игрока в слоте "амулет" надет определенный предмет smile.gif
Ogneslav
Эээ... так ктонибудь знает как заставить новый класс использовать магию друида?

Заранее спасибо.
Aiwan
Цитата(shadowdweller @ Jun 24 2008, 05:45) *
Интересно. А еще интересно, можно ли настроить скрипт так, чтобы дверь появлялась только тогда, когда у игрока в слоте "амулет" надет определенный предмет

Легко. smile.gif Но мне надо будет пару строк внести в общий код. А можно отдельно скрипт написать.
Ilerien
Цитата
Интересно. А еще интересно, можно ли настроить скрипт так, чтобы дверь появлялась только тогда, когда у игрока в слоте "амулет" надет определенный предмет
Легко, могу внести опцию в систему smile.gif Шад, ты спрашивай, если что-то в моих доках непонятно wink3.gif
Цитата
Эээ... так ктонибудь знает как заставить новый класс использовать магию друида?
Насколько я понимаю, можно только убрать друида и вместо него прописать свой класс...
Ogneslav
И снова я!

Я тут покопался и нашел аддон позволяющий развивать 60 уровней, но как его ставить не врублюсь может ктонибудь знает?

P.S. Когда я создаю свой класс он всегда престиж и берется минимум со 2 уровня, в чем проблема?
Ilerien
Цитата
Когда я создаю свой класс он всегда престиж и берется минимум со 2 уровня, в чем проблема?
Возможно, не указывать ссылку на табличку пререквизитов smile.gif Если не поможет - хз, так глубоко в этом направлении не копал.
Xfans
Цитата(Ilerien @ Jun 24 2008, 01:23) *
Бут, наверное, в сингле не работает smile.gif Можно попробовать
Neverwinter Script
EndGame("");

А что ставить в кавычках, которые в скобках? (после EndGame) Название файла модуля? Или имя PC? Или что-то еще?
А про бут мы так почему-то и подумали=)))
Ilerien
"" - это пустая строка. Там реф финального ролика, но в этом случае он нафиг не нужен smile.gif
Xfans
Он конечно нафиг не нужен, но без него компайлер не хочет скрипт сохранять, пришлось титры присобакать. А как мона самим эти титры сделать?
Ilerien
Почему вдруг не хочет? Он проверяет исключительно соответствие типа формального параметра типу фактического, а наличие ролика ему глубоко пофиг. "" - это тоже строка, так что компилироваться должно прекрасно.
Xfans
Значит пустые кавычки мона=)) Гым! А на всякий случай, титры-то ваще мона свои сделать? Вроде, где-то кто-то говорил, что есть специальная прога... или у нас глюки?
Aiwan
Шад, вот демо-мод Нажмите для просмотра прикрепленного файла и все настроено в нем. короче. Иди на магические вспышки. Возьми перса, у которого нет режима обнаружения по умолчанию. На картинках написано как настроить триггеры. Что бы дверь которая появляется (а можно хоть дом плейсебл сделать) была рабочей, ты должна установить заранее вейпоинт и при создании двери просто на нее запустить скрипт присвоения локального стринга равного имени вейпоинта. если лень, то можеш создать сколько надо дверей и в их свойствах сразу указать куда перемещается РС. И закинуть в палитру. В каждом новом триггере пропишешь нужный ресреф двери и все.

Нажмите для просмотра прикрепленного файла

Настройки триггера для плейсеблов. Создаем рандомно на случайной локации. Если как у нас на специальном месте то SECRET_PLC_TR_SEARCH_PLC_DOOR_01 - Таг вейпоинта. Жирным - таг триггера он равен таг поинта (создал в палитре) + таг триггера.
Код
ResRef объекта =  стрингу на триггере PLC_ResRef
Поле триггера KeyTag - сложность проверки скилла:
DC_EASY = 0;
DC_MEDIUM = 1;
DC_HARD = 2;

Имя триггера - фраза над игроком

float "DISTANCE" радиус на котором находим объект или специально на месте объекта "SECRET_PLC_"+[Таг Триггера]

LocalInt "ACTION_MODE_DETECT" == 1 устанавливает свойство триггера, он сработает только когда РС в режиме обнаружения.
специально на месте объекта


Нажмите для просмотра прикрепленного файла

Код
ResRef объекта =  стрингу на триггере CLASS_TYPE_ALL
Если его нет, то создаем для каждого класса свой.
Поле триггера KeyTag - сложность проверки скилла:
DC_EASY = 0;
DC_MEDIUM = 1;
DC_HARD = 2;

Имя триггера - фраза над игроком

float "DISTANCE" радиус на котором находим объект

LocalInt "ACTION_MODE_DETECT" ==1 устанавливает свойство триггера, он сработает только когда РС в режиме обнаружения.


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

Триггер для фраз над игроком проще пареной репы. Читай его описание в свойствах триггера.

Триггер старт диалога с НПС так же. Он работает по принципу таг триггера - TR_CONV_ТАГ_НПС.
Код
Тест над NPC, KeyTag - больше 0 - подбежит. К тагу триггера добавляете таг НПС. Пример: TR_CONV_[ТАГ_НПС]
--------------------------------------------------------------------
Если поле Deity НПС содержит цифру (см внизу), то НПС вроспроизведет анимацию:
5 - Смотрит вдаль
9 - Просить
10 - Ругать
11 - Смех
104 - Салют
107 - Приветствие
108 - Насмешка


Вот простой скрипт am_exe_door_001 который мы запустили после создания двери. там может быть что угодно...
Neverwinter Script
//:://////////////////////////////////////////////
//:: OnSpawn  am_exe_door_001
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Дверь в склеп. Секретная. Присваиваем место
  перемещения при создании двери скриптом.

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 26.09.2005
//:://////////////////////////////////////////////

void main()
{
  object oSelf = OBJECT_SELF;
  SetLocalString(oSelf, "TRANSITION_TARGET", "AM_EXIT_DOOR_002");
}


В ствойствах двери создаваемой посмотри локалки. поймешь как работает эта дверь.
shadowdweller
Ilerien, Aiwan, спасибо! thank_you.gif Коврыяю демки. никогда не думала, что это настолько сложно...

Ilerien, комментарии обязательно поднадобятся, вот только сформулирую. Так-то, в принципе, понятно, для чего и как. Но сама никогда не напишу такого, конечно. smile.gif Интересно, что ты плейс создаешь на Invisible Object... А если я захочу, чтобы дверь никуда не исчезала после ухода игрока (делаю сингл), мне просто с хартбита у резрефа снять скрипт, и все? Или закомментить строки эти просто в скрипте?

Айв, амулет от поноса и дракон на водопое - сила-вещь! Кстати, игроку с прокачанным поиском интереснее там ходить smile.gif

Вообще, я попробую соединить все и посмотреть, что получится. Спасибо еще раз!
Ilerien
Цитата
Интересно, что ты плейс создаешь на Invisible Object... А если я захочу, чтобы дверь никуда не исчезала после ухода игрока (делаю сингл), мне просто с хартбита у резрефа снять скрипт, и все? Или закомментить строки эти просто в скрипте?
Если ты закомментишь уничтожение двери, то каждый раз будет создаваться новая на том же месте. Можно убрать скрипт из хб видимой двери - тогда скрипт создания будет думать, что она есть.
Н-да, система делалась для PW smile.gif
shadowdweller
А еще такой вопрос - обязательно такой сложный скрипт писать на проверку надетого предмета у игрока или можно воспользоваться стандартным условием? Я просто скрипт у Айва посмотрела и жутко впечатлилась. Ключевое слово - жутко. smile.gif
Ilerien
Neverwinter Script
if(GetTag(GetItemInSlot(oPC, <...>)) == "<...>")

этого хватит smile.gif
shadowdweller
Ilerien,
Neverwinter Script
if
(GetTag(GetItemInSlot(oPC, INVENTORY_SLOT_NECK)) == "Branzuletko")
return TRUE;
return FALSE;

Так? И в начале скрипта его ставить, и потом выполнение?
Lirulin
Установил я патч 1.68, и сразу же полезли вопросы! Почему на некоторых NPC плащи не отображаются совсем? Причем на PC той же расы отображаются... Может и на NPC'ей как-то можно "надеть" их, скриптами, или через 2da (что, подозреваю, более вероятно)?
Ilerien
Цитата
Так? И в начале скрипта его ставить, и потом выполнение?
Neverwinter Script
//::///////////////////////////////////////////////
//:: Name: Heartbeat Secret Door Script (Invisible Object)
//:: FileName: il_scdoor_hb
//:: Copyright © 2007 Gem of the North Team
//:://////////////////////////////////////////////
/*
    Creates, if object have found, 2 binded doors
*/

//:://////////////////////////////////////////////
//:: Created By: Ilerien Phoenix
//:: Created On: 20.10.2007
//:://////////////////////////////////////////////


void main()
{
    object oSelf = OBJECT_SELF;
    string sTag = GetTag(oSelf);
    string sLetter = GetStringRight(sTag, 1);
    if(sLetter == "a")
        sLetter = "b";
    else
        sLetter = "a";
    int bShown = GetLocalInt(oSelf, "Shown");
    if(bShown)
        return;
    bShown = GetLocalInt(GetObjectByTag(GetStringLeft(sTag, GetStringLength(sTag) - 1) + sLetter), "Shown");
    if(bShown)
        return;
    //declare major variables
    string sCreatedDoorTag = "";
    float fSearchDist = IntToFloat(GetReflexSavingThrow(oSelf));
    int nDifficulty = GetWillSavingThrow(oSelf);
    int nLockDC = GetFortitudeSavingThrow(oSelf);
    int nSkillSearch = -50;
    int nCounter = 1;
    int nSkill;
    object oNearestCreature = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE);
    int bDoneSearch = 0;
    int bDone = 0;
    int bNeedDetectMode = GetLocalInt(oSelf, "IL_SCDOOR_DETECTION_NEED_ACTION_MODE");
    int bNeedLock = GetLocalInt(oSelf, "IL_SCDOOR_LOCK_DOOR");
    float fDist;
    object oDoor;
    object oSearcher;
    object oComp;
    location lLoc;
    string sFirstTag = "il_scdoor_c";

    while (!bDone && !bDoneSearch && GetIsObjectValid(oNearestCreature))
    {
        if(GetIsObjectValid(GetMaster(oNearestCreature)) || GetIsPC(oNearestCreature) || GetIsDMPossessed(oNearestCreature))
        {
            // what is the distance of the PC to the door location
            fDist = GetDistanceBetween(oSelf, oNearestCreature);

            if (fDist <= fSearchDist)
            {
                if (LineOfSightObject(oSelf, oNearestCreature) && (!bNeedDetectMode || GetActionMode(oNearestCreature, ACTION_MODE_DETECT)) && GetTag(GetItemInSlot(oPC, INVENTORY_SLOT_NECK)) == "Branzuletko")
                {
                    nSkill = GetSkillRank(SKILL_SEARCH, oNearestCreature);
                    if((nSkill + 20 >= nDifficulty) && (nSkill + d20() >= nDifficulty))
                    {
                        bDone = 1;
                        oSearcher = oNearestCreature;
                    }
                }
            }
            else
                // If there is no one in the search radius, don't continue to search
                // for the best skill.
                bDoneSearch = 1;
        }
        nCounter = nCounter + 1;
        oNearestCreature = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oSelf ,nCounter);
    }//the secret door is founded

    if(bDone)
    {
        sCreatedDoorTag = sFirstTag + GetStringRight(sTag, 4);//tag is, for example, "il_scdoor_c_1_a"
        lLoc = GetLocation(oSelf);
        oDoor = CreateObject(OBJECT_TYPE_PLACEABLE, sFirstTag, lLoc, TRUE, sCreatedDoorTag);
        SetLockUnlockDC(oDoor, nLockDC);
        if(bNeedLock)
            SetLocked(oDoor, TRUE);
        if(GetIsObjectValid(oDoor))
        {
            PlayVoiceChat(VOICE_CHAT_LOOKHERE, oSearcher);
            sLetter = GetStringRight(sTag, 1);
            if(sLetter == "a")
                sLetter = "b";
            else
                sLetter = "a";
            sCreatedDoorTag = GetStringLeft(sFirstTag + GetStringRight(sTag, 4), GetStringLength(sFirstTag) + 3) + sLetter;
            oComp = GetObjectByTag(GetStringLeft(sTag, GetStringLength(sTag) - 1) + sLetter);
            lLoc = GetLocation(oComp);
            nLockDC = GetFortitudeSavingThrow(oComp);
            SetLockUnlockDC(oComp, nLockDC);
            bNeedLock = GetLocalInt(oSelf, "IL_SCDOOR_LOCK_DOOR");
            if(bNeedLock)
                SetLocked(oComp, TRUE);
            oDoor = CreateObject(OBJECT_TYPE_PLACEABLE, sFirstTag, lLoc, TRUE, sCreatedDoorTag);
            SetLocalInt(oSelf, "Shown", 1);
        }
    }
}

Вчитался в скрипт - омг, там можно столько оптимизировать smile.gif
Заодно нашёл одну кривость wacko.gif
Новая версия: Нажмите для просмотра прикрепленного файла smile.gif
Xfans
Цитата(Lirulin @ Jun 26 2008, 10:23) *
Почему на некоторых NPC плащи не отображаются совсем? Причем на PC той же расы отображаются... Может и на NPC'ей как-то можно "надеть" их, скриптами, или через 2da (что, подозреваю, более вероятно)?

Ой! У нас тоже странная фигня с этими плащами - в тулсете эльфам они на уши надеваются! Мы даже испугались, что у них головы пропали! А на других, значит, вовсе не надеваются?
Ilerien
Это бага 1.68, в 1.69 пофиксили.
Xfans
Цитата(Ilerien @ Jun 26 2008, 17:38) *
Это бага 1.68, в 1.69 пофиксили.

Ясно! А 1.69 вроде еще только на стадии проверки? Или уже все, можно качать и пользоваться?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.