Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
mamuc
QUOTE
...Из него выпадает мешок с лутом. Этот мешок будет иметь Таг "BodyBag..."

..вопрос у меня конечно глупый..но , если это лут, то вредный лутовый мешок явно не пустой..может сначала ему инвентарь надо очистить и токо потом самого удалять?
dumbo
если это стандартная биоваровская система трупования-лутования, то mamuc абсолютно прав - нужно удалить все предметы внутри. контэйнер кстати сам исчезнет - можно не удалять yes.gif
Добавлено в [mergetime]1117183200[/mergetime]
контейнеры все так следует удалять, кстати...
Добавлено в [mergetime]1117183269[/mergetime]
ps. 64 - это OBJECT_TYPE_PLACEABLE
Добавлено в [mergetime]1117183943[/mergetime]
до кучи уже... crazy.gif
Neverwinter Script Source
object oBag = GetFirstObjectInArea();
  while (GetIsObjectValid(oBag))
  {
    if (GetHasInventory(oBag) && GetTag(oBag)=="BodyBag")
    {
      object oItem = GetFirstItemInInventory(oBag);
      while (GetIsObjectValid(oItem))
      {
        DestroyObject(oItem);
        oItem = GetNextItemInInventory(oBag);
      }
      //DelayCommand(3.0, DestroyObject(oBag));
    }
    oBag = GetNextObjectInArea();
  }
Лито
QUOTE (dumbo @ May 26 2005, 04:37)
Лито
1. тебя погубят пиво, сигареты, и безответственность в расставлении отступов! yes.gif из-за халатности в правильном форматировании скрипта, ты теряешь визуальное разделение логических блоков. отсюда ошибки. у тебя почти весь скрипт попал под условие "if (GetLevelByClass(CLASS_TYPE_DRUID..." - оттого и не работал. забыл break'и почти во всех case. и уж слишком "раздуплился".. smile.gif

Ах, проклятье swoon.gif Все сделал smile.gif
DBColl
Точно, Айв, ребята правы. Надо пробовать таким методом... Странно, что в ХотУ так коренным образом поменяли лутование... swoon.gif
dumbo
там, кстати, интересный эффект наблюдается - судя по всему, объект таки удаляется сначала, но потом, как-будто бы выяснив, что он набит всякой бякой, он создается заново. это видно даже. yes.gif сначала, скажем, валяются кости скелета, потом они плавно исчезают (удаление), а потом заново проявляется... мешочек! yes.gif
Aiwan
Уря! СПАСИБО! Победил я их.
dumbo ты знаешь, я чистил лут в мешках, но определял так:
Neverwinter Script Source
|| (GetObjectType(oDestr) == 64 && GetTag(oDestr) == "BodyBag"))

Но что то не работало wacko.gif Сделал как ты, через инвентарь, очистились...
Спасибо всем за помощь! good.gif
Возможно выложу для молодежи систему перемещиния со случайными стычками и монстрами. dirol.gif
DBColl
QUOTE (Aiwan @ May 27 2005, 15:16)
dumbo ты знаешь, я чистил лут в мешках, но что то не работало

Ты удалял именно МЕШКИ, а не то, что в мешках. Вот в этом разница.
Лито
Такой вопрос. Взялся изменять спелл Ракетного Шквала Исаака.
Был удивлен тем, что весь спелл работает на одной функции:
Neverwinter Script Source
DoMissileStorm

Собственно мне нужно было сделать спас-бросок по рефлексу.
а в описании функции написано:
Neverwinter Script Source
void DoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_MAGICAL, int nONEHIT = FALSE, int nReflexSave = FALSE)

Значит если я ставлю TRUE в самом конце, по идее должен заработать спас.
Ставлю:
Neverwinter Script Source
DoMissileStorm(2, 20, SPELL_ISAACS_GREATER_MISSILE_STORM,VFX_IMP_MIRV,VFX_IMP_MAGBLUE,DAMAGE_TYPE_MAGICAL,FALSE,TRUE);

При компиляции открывает скрипт NW_I0_GENERIC и выдает ошибку на 98 строке "ОПРЕДЕЛЕНИЕ ФУНКЦИИ, ПРОПУСКАЮЩЕЕ ИМЯ"
Вот так вот black eye.gif
dumbo
Лито
компилится без проблем. видимо, до тебя уже кто-то что-то подправил...
minion
Все вы знаете магические лаборатории. Не раз в игре встречали. Так вот. Я переписал скрипт на 4 ингридиента, которые ложатся в сундук. Но после тестирования появился баг. Работает только первая комбинация 4-ингридиента - заклинание. На всех остальных получаю дамаж. И сообщение неправильная комбинация. В чем прикол????
Lex
эм..а более подробно?
- текст скрипта твой
- что было нужно
- и что собсна не срабатывает, я если честно не догнал
minion
Я бы скинул текст да вот сижу не за своим компом no.gif . Нужно чтобы при определенных ингридиентах в сундуке и при определенном наложенном на него заклинании исчезали ингридиенты и появлялся предмет. Все бы хорошо, но срабатывает только первая комбинация. Никак не могу понять почему. Напихал в скрипт целую кучу тестовых сообщений ,но все равно не нашел где ошибка. Несколько раз проверял yes.gif . При первом удобном случае скину скрипт.
mamuc
мдя..тут без скрипта не разобраться..скрипт в студию! ( и ОЧЕНЬ желательно полный текст, а не отдельные вырезки)
Лито
QUOTE (dumbo @ May 28 2005, 08:49)
Лито
компилится без проблем. видимо, до тебя уже кто-то что-то подправил...

Все сделал, теперь работает yes.gif
Мефистофель
Lex Ваш Скрипт про скелетообразную смерть неработает, блин чтоб я не делал, скелет с ресрефом поставил, ваш скрипт на онДамаге, тоже поставил, неработает. Помогите пожалуйста что нужно исправить.
А и на все слоты ваш скрипт, тоже ставил. Ничего!? dntknw.gif
Добавлено в [mergetime]1117295550[/mergetime]
QUOTE
в свойствах НПС поставь immortale

Lex вот это я не поставил, может поэтому и не работает, можно узнать как это сделать?
Lex
QUOTE (Мефистофель @ May 28 2005, 19:49)
Lex Ваш Скрипт про скелетообразную смерть неработает

работает 100%. Если я выкладываю скрипт, который сам не проверил, я об этом дополнительно сообщаю.
Надо просто сделать все именно так, как я сказал, а именно
QUOTE (Мефистофель @ May 28 2005, 19:49)
в свойствах НПС поставь immortale

Этот момент довольно критичен.

QUOTE (Мефистофель @ May 28 2005, 19:49)
можно узнать как это сделать?

Свойства создания - закладка advansed - флаг immortale (там всего 5 флажков, найти не проблема)
Мефистофель
QUOTE
Свойства создания - закладка advansed - флаг immortale (там всего 5 флажков, найти не проблема)

Дело в том что у меня Тулсет Русский и я незнаю где это.? эх.
Lex
Там всего закладок пшик, найти за 10 минут, если во все тыкаться.

Свойства - Улучшенные - Бессмертие.. наверное так..
Лито
Скрипт с инклюдом суб-рас от Lord of V@MPIRES, не работает unsure.gif
Это тот который в базе скриптов на первой странице.
minion
Вот инклуд как и обещал, ну и сам скрипт, хотя его писать и смысла нет.

Инклуд:
Neverwinter Script Source
//* Array Functions
void SetLokalArrayString (object oidObject, string sVarName, int nVarNum, string nValue);
string GetLocalArrayString (object oidObject, string sVarName, int nVarNum);
void SetLocalArrayInt (object oidObject, string sVarName, int nVarName, int nValue);
int GetLocalArrayInt (object oidObject, string sVarName, int nVarName);
//* Lab Functions
void CreateLabItem (int nSpellID);
int nNumberOfCombos = 5;
void BadResult ()
{
  SpeakString ("Bad Result!!!");
  object oTarget = GetLastSpellCaster ();
  int nDamage = d20*2;
  effect eVis = EffectVisualEffect (VFX_IMP_FLAME_S);
  effect eFire = EffectDamage (nDamage, DAMAGE_TYPE_FIRE);
  DelayCommand (0.6,ApplyEffectToObject (DURATION_TYPE_INSTANT, eFire, oTarget));
  DelayCommand (0.6,ApplyEffectToObject (DURATION_TYPE_INSTANT, eVis, oTarget));
}

void SetupLab ()
{
  SetLocalString (GetModule(), "NW_MYCHESTTAG", "M3Q1LABCHEST");
  //* M3Q1LABCHEST - тег сундука с ингридиентами
  int nComboNumber = 1;
  for (nComboNumber = 1; nComboNumber <= nNumberOfCombos; nComboNumber++)
      {
      switch (nComboNumber)
      {
        case 1:
        SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_MELFS_ACID_ARROW);
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC12");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC09");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_IT_MRING004);
        break;
        case 2:
        SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_MAGEARMOR);
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC12");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC10");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_IT_MNECK015);
        break;
        case 3:
        SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_ENERVATION);
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC11");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC08");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, M3Q1A09LABROBE);
        break;
        case 4:
        SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_FEEBLEMIND);
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC06");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC06");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_WMGST005);
        break;
        case 5:
        SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_STONESKIN);
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC14");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC06");
        SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_IT_MBOOTS004);
        break;
      }
      }
}

int GetSpellPosition (int nSpellID)
{
  int i;
  int nMatch = -1;
  for (i = 1; i <= nNumberOfCombos; i++)
  {
      if (GetLocalArrayInt(OBJECT_SELF, "NW_COMBO_SPELL", i) == nSpellID)
      {
      nMatch = i;
      }
  }
  return nMatch;
}

int GetCombo (int SpellID)
{
  string sReagent1, sReagent2;
  object oItem = GetFirstItemInInventory ();
  int i = 0;
  int nArrayPosition = -1;
  object oDeleteItem1, oDeleteItem2;
  while (bValid == TRUE)
  {
      i = i + 1;
      if (i == 1)
      {
        sReagent1 = GetTag (oItem);
        oDeleteItem1 = oItem;
      }
      if (i == 2)
      {
        sReagent2 = GetTag (oItem);
        oDeleteItem2 = oItem;
      }
      oItem = GetNextItemInInventory ();
      bValid = GetIsObjectValid (oItem);
      if (i>2)
        bValid = FALSE;
  }
  if ((i<=0)||(i>=3))
  {
      nArrayPosition = -1;
  }
  else
  {
      nArrayPosition = GetSpellPosition (nSpellID);
      if (nArrayPosition != -1)
      {
        string sArrayReagent1 = GetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nArrayPosition);
        string sArrayReagent2 = GetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nArrayPosition);
        if ((sArrayReagent1 == sReagent1 || sArrayReagent1 == sReagent2) && (sArrayReagent2 == sReagent1 || sArrayReagent2 == sReagent2))
        {
            DestroyObject (oDeleteItem1);
            DestroyObject (oDeleteItem2);
            return nArrayPosition;
        }
        else
        {
            nArrayPosition = -1;
        }
      }
  }
  return nArrayPosition;
}

void CreateLabItem (int nSpellID)
{
  int nCombo = GetCombo (nSpellID);
  string sItem = GetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nCombo);
  if (sItem == "")
  {
      nCombo = -1;
  }
  if (nCombo != -1)
  {
      SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nCombo, "");
      CreateItemOnObject (sItem);
      ApplyEffectToObject (DURATION_TYPE_INSTANT, EffectVisualEffect (VFX_IMP_MAGICAL_VISION), GetLastSpellCaster());
  }
  else
  {
      BadResult ();
  }
}

string GetLacalArrayString (object oidObject, string sVarName, int nVarNum)
{
  string sFullVarName = sVarName + IntToString (nVarNum);
  return GetLocalString (oidObject, sFullVarName);
}
void SetLacalArrayString (object oidObject, string sVarName, int nVarNum, string nValue)
{
  string sFullVarName = sVarName + IntToString (nVarNum);
  SetLocalString (oidObject, sFullVarName, nValue);
}
int GetLacalArrayInt (object oidObject, string sVarName, int nVarNum)
{
  string sFullVarName = sVarName + IntToString (nVarNum);
  return GetLocalInt (oidObject, sFullVarName);
}
void SetLacalArrayInt (object oidObject, string sVarName, int nVarNum, int nValue)
{
  string sFullVarName = sVarName + IntToString (nVarNum);
  SetLocalString (oidObject, sFullVarName, nValue);
}

Вот весь инклуд
Добавлено в [mergetime]1117378792[/mergetime]
В самом скрипте инклуд обозван как LabItemsCreate.
Сначала выполняется функция SetupLab ()
Потом определяю спелл который кастовали на сундук и выполняю функцию CreateLabItem

Сорри что не привожу текст. Его пришлось пол дня восстанавливать. Кто-то кривыми руками случайно стер.

Добавлено в [mergetime]1117378957[/mergetime]
Еще вопрос по функции GetLastSpellCaster
А если к примеру возможен ли такой вариант что в один момент кастовать спелл на объеке будут двое. Что тогда может произойти. Хотя бы теоритически?
Aiwan
Помоему вот твои два ингредиента в этой функции. А ты насовал туда четыре. помоему тебе надо вписать еще для двух. Но я могу ошибиться...
Neverwinter Script Source
int GetCombo (int SpellID)
{
  string sReagent1, sReagent2;

mamuc
QUOTE
Я переписал скрипт на 4 ингридиента, которые ложатся в сундук.


...ну и где это видно, что переписано на 4 инградиента..в твоем скрипте( или вероятнее всего скрипте-основе) их всего 2... и проверка условий идет по этим 2 инградиентам..так что, если у тебя рецепты неотличаются особо началом, то и выполняться соотв будет первый рецепт удолетворяющий условие... но все это гадание на кофейной гуще, ибо именно самого скрипта на 4 инградиента не видно( тут только инклюд на 2)

.. и кстати, что по идее ты хочешь получить из void SetupLab () ?
из того что тут написано должно получиться, что в любом случае получаешь один и тот же результат biggrin.gif
с циклом for ... ты упорно перебираешь все возможные 5 вариантов пока получаешь последний yes.gif ..всегда yes.gif
Лито
QUOTE (Lex @ May 20 2005, 22:22)
Через стоимость вещи вроде можно определить уровень. Где-то кто-то расписывал табличку такую. Сравнивай потом с уровнем игрока и все.

Где именно? Через поиск ничего не нашел. sad.gif
Archangel
Здрастеся, дорогие форумчане. Меня интересует возможно ли написать такой скрипт(сам я даже примерно непредставляю с чего начать(а не... вру... знаю... с void main() lol.gif )):
когда наступает ночь на экране повляется табличка с произвольной надписью, она держиться определенное время, или пока игрок не нажмет ОК, а потом у игрока отнимается половина жизней.
Есть идеи? this.gif
Лито
Archangel, есть идея, ставь на хартбит игрока или модуля скрипт который будет проверять время суток(день-ночь). Если ночь, то начинается диалог(который будет за табличку). drag.gif
Ну еще сделай локалку чтобы ночью диалог не начинался каждые 6 секунд smile.gif
Мефистофель
Спасибо Лекс, но возникли некоторые неполадки, дело в том что скелет, после смерти непися, долго появляется, и эффект смери не работает, скелет нападает на ПК.
Добавлено в [mergetime]1117488620[/mergetime]
Спецефический вопрос. Если играть за друида, то ПК может превращатся в жевотных, дак вот, скажите можно ли, также поменять ПК только ранне задуманным NPC?
minion
Я выложил вариант с двумя ингридиентами так как он проще. Но и в не мчто-то не работает.
Функция SetupLab () создает своебразный массив по номеру комбинации. Допустим если было кастованр заклинание из первой комбинации, то имеем в переменной nComboNumber = 1. А в массиве под этим номером уже читаем сами ингридиенты и то что должно получиться.
mamuc в каком именно цикле for?
Aiwan
Minion, ты можешь перепутать FALSE и TRUE и не будет пахать ничего. Сделай фукцию Debug и впиши ее после каждого действия в код. Пусть она выводит тебе мессаги, что сделано и что происходит. Так гадать можно до второго пришествия. Увидишь что и как, сам найдешь ошибку. У меян при входе в мод все пестрит мессагами, кто где пукнул, выдохнул у меян все пишет в дебаг.

2 Архангел. Табличку кроме панели смерти прилепить нельзя.
Archangel
QUOTE
Archangel, есть идея, ставь на хартбит игрока или модуля скрипт который будет проверять время суток(день-ночь). Если ночь, то начинается диалог(который будет за табличку). 
Ну еще сделай локалку чтобы ночью диалог не начинался каждые 6 секунд 

QUOTE
2 Архангел. Табличку кроме панели смерти прилепить нельзя.

Ладно, спасибо. Че-нить придумаем... wink.gif
mamuc
QUOTE
Я выложил вариант с двумя ингридиентами так как он проще. Но и в не мчто-то не работает.
Функция SetupLab () создает своебразный массив по номеру комбинации. Допустим если было кастованр заклинание из первой комбинации, то имеем в переменной nComboNumber = 1. А в массиве под этим номером уже читаем сами ингридиенты и то что должно получиться.
mamuc в каком именно цикле for?


в SetupLab () .
..сначало напишу как у тебя работает по тому , что написано сейчас
1) устатнавливаешь int nComboNumber = 1;
2) запускаешь цыкл for для того же nComboNumber с 1 до 5 (nNumberOfCombos = 5) ...таким образом цыкл работает 5 раз
3) в цыкле у тебя токо один свич для того самого бедного nComboNumber , где в зависимости от значения создает твой "своебразный массив по номеру комбинации"...усе это срабатывает 5 раз каждый раз присваивается знач масива и в итоге ты получаешь в своем масиве ВСЕГДА то что присваиваешь, когда
nComboNumber=5, поскольку это действие присвоения в SetupLab () выполняеться последним

что бы работало так как ты описал SetupLab () должен быть с параметром nComboNumber, и цыкл там совсем ненужен, должен токо свич остатся....
короче- с исправлениями должна выглядеть примерно так
Neverwinter Script Source
void SetupLab (int nComboNumber)
{
  SetLocalString (GetModule(), "NW_MYCHESTTAG", "M3Q1LABCHEST");
  //* M3Q1LABCHEST - тег сундука с ингридиентами
      switch (nComboNumber)
      {
        case 1:
            SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_MELFS_ACID_ARROW);
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC12");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC09");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_IT_MRING004);
        break;
        case 2:
            SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_MAGEARMOR);
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC12");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC10");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_IT_MNECK015);
        break;
        case 3:
            SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_ENERVATION);
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC11");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC08");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, M3Q1A09LABROBE);
        break;
        case 4:
            SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_FEEBLEMIND);
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC06");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC06");
            SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_WMGST005);
        break;
        case 5:
             SetLocalArrayInt (OBJECT_SELF, "NW_COMBO_SPELL", nComboNumber, SPELL_STONESKIN);
             SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT1", nComboNumber, "NW_IT_MSMLMISC14");
             SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REAGENT2", nComboNumber, "NW_IT_MSMLMISC06");
             SetLocalArrayString (OBJECT_SELF, "NW_COMBO_REWARD", nComboNumber, NW_IT_MBOOTS004);
        break;
      }
}

..я конечно еще рекомендовал бы вместо SetLocalArrayInt ,SetLocalArrayString использовать структуры ...это гораздо удобнее ( и короче в записи тоже) ИМХО yes.gif
вот примерно так...(это кроме всего дает возможность вообще обходиться без навешивания лишних локальных на плейс)
Neverwinter Script Source
struct stRec
{
    int spell;
    string req1;
    string req2;
    string rez;
};


struct stRec SetupLab(int nComboNumber)
{
    struct stRec stR;
    if (!nComboNumber) return stR;
    switch (nComboNumber)
    {
        case 1:
            stR.spell = SPELL_MELFS_ACID_ARROW;
            stR.req1 = "NW_IT_MSMLMISC12";
            stR.req2 = "NW_IT_MSMLMISC09";           
            stR.rez = "****";
            // kstati v sozdanii rezultata nuzhen resref, a ne tag itema
            // ( i resref obichno pishetsa strokovimi bukvami)
            break;
        case 2:
            stR.spell = SPELL_MAGEARMOR;
            stR.req1 = "NW_IT_MSMLMISC12";
            stR.req2 = "NW_IT_MSMLMISC10";           
            stR.rez = "****";
            break;
        // i tak dalee       
    }
    return stR;
}
DBColl
Народ, объясните плиз мне, как переопределить ряд стандартных спеллов? Что такое спеллхук и че с ним делать?..
В этом я совсем профан... ph34r.gif pardon.gif

Проясните плз... только пошагово. Можно и кратко, но по шагам. А также о зависимостях между 2да-хами и скритами спеллов.
dumbo
QUOTE (Лито @ May 30 2005, 14:18)
QUOTE (Lex @  May 20 2005, 22:22)
Через стоимость вещи вроде можно определить уровень. Где-то кто-то расписывал табличку такую. Сравнивай потом с уровнем игрока и все.

Где именно? Через поиск ничего не нашел. sad.gif

нарисовал тут на досуге:
1. dmb_inc_ilr:
Neverwinter Script Source
void Read2DA()
{
  int nRow;
  string sDA;
  // можно на модуль, можно на плэйс какой-нибудь...
  object oStore = GetModule();
  for (nRow = 0; nRow < 60; nRow++) {
    sDA = Get2DAString("itemvalue", "MAXSINGLEITEMVALUE", nRow);
    if (sDA == "") break;
    SetLocalInt(oStore, "ILR_"+IntToString(nRow+1), StringToInt(sDA));
  }
}

int GetILR(object oItem)
{
  object oStore = GetModule();
  int bIdentified = GetIdentified(oItem);
  if (!bIdentified) SetIdentified(oItem, TRUE);
  int nGP = GetGoldPieceValue(oItem);
  SetIdentified(oItem, bIdentified);
  int nLevel = 1;
  while (nLevel < 60 &&
        GetLocalInt(oStore, "ILR_"+IntToString(nLevel)) < nGP)
    nLevel++;
  return nLevel;
}

2. в OnModuleLoad:
Neverwinter Script Source
#include "dmb_inc_ilr"
void main() {
  Read2DA();
  ...

3. пользовать по усмотрению. например, в OnPlayerEquipItem:
Neverwinter Script Source
#include "dmb_inc_ilr"
void main() {
  object oPC = GetPCItemLastEquippedBy();
  object oItem = GetPCItemLastEquipped();
  int nLevel = GetILR(oItem);
  if (nLevel > GetHitDice(oPC))
  {
    SendMessageToPC(oPC, "Для ношения этой вещи требуется "+
                        IntToString(nLevel)+" уровень");
      // закрываем окно инвентаря, ибо его плющит...
      OpenInventory(oPC, oPC);
      OpenInventory(oPC, oPC);
      AssignCommand(oPC, ActionUnequipItem(oItem));
      return;
  }
  ...


ps. особо не проверялось, посему ежели что - пишите...
Добавлено в [mergetime]1117537069[/mergetime]
DBColl
по spell-hook'ам - ТУТ

основная зависимость скриптов спеллов от 2да'х - в spells.2da в колонке ImpactScript прописаны их имена.. smile.gif или ты про что-то другое?
DBColl
QUOTE (dumbo @ May 31 2005, 13:28)
DBColl по spell-hook'ам - ТУТ

основная зависимость скриптов спеллов от 2да'х - в spells.2da в колонке ImpactScript прописаны их имена..или ты про что-то другое?

Да, я про это. Спасибо, почитаю wink.gif. good.gif
Lex
QUOTE (Мефистофель @ May 31 2005, 01:21)
Спасибо Лекс, но возникли некоторые неполадки, дело в том что скелет, после смерти непися, долго появляется, и эффект смери не работает, скелет нападает на ПК.

так тебе это и надо было, нет?
Или надо чтобы скелет на земле валялся? Тогда при его создании ставь SetIsDestroyable(FALSE,FALSE); и накладывай эффект смерти EffectDeath() через ApplyEffectToObject()
Мефистофель
QUOTE
так тебе это и надо было, нет?
Или надо чтобы скелет на земле валялся? Тогда при его создании ставь SetIsDestroyable(FALSE,FALSE); и накладывай эффект смерти EffectDeath() через ApplyEffectToObject()

Не лекс, эффекты ты прописал, но они не работают!? Мне надо было чтобы скелет мгновенно, появился за место НПК, как это было в ХотУ, я и сам эффекты накладывал, всё кампилилось, но не работало! во как.
Наверное я уже достал..Понимаю
Lex
те он появляется, а тот НПС еще дергается? Так местами там поменяй функции анимации и создания скелета..
dumbo
Мефистофель
ну и задачку ты себе нашел! crazy.gif
на OnDamage вешать эту анимацию не очень хорошо, потому как есть всякая нехорошая магия, которая убивает сразу. если смотреть в торону OnDeath, то при смерти движок с довольно большой вероятностью успевает до вызова скрипта навесить анимацию падения - отследить это без мазы, поэтому часто начальная часть анимации пропадает. хотя и в OnDamage могут убить в лежачем положении(кнок)... вобщем, сделать так, чтоб это работало всегда красиво и правильно невозможно, так что вешай вот это на OnDeath и смирись yes.gif
Neverwinter Script Source
void main()
{
  object oNPC = OBJECT_SELF;
  if (GetLocalInt(oNPC,"DEATH")) return;
  SetLocalInt(oNPC,"DEATH",TRUE);
  ClearAllActions(TRUE);
  SetImmortal(oNPC,TRUE);
  SetIsDestroyable(FALSE);
  SetAILevel(oNPC, AI_LEVEL_VERY_LOW); // stop nw_c2_default1 and 2
  float fT = 0.0, fSpasm1 = 2.0, fSpasm2 = 1.0, fDestroy = 5.0;
  DelayCommand(fT+=0.01,ApplyEffectToObject(DURATION_TYPE_PERMANENT,
                        EffectResurrection(),oNPC));
  DelayCommand(fT+=0.01,ApplyEffectToObject(DURATION_TYPE_PERMANENT,
                        EffectHeal(30),oNPC));
  DelayCommand(fT+=0.10,PlayAnimation(ANIMATION_LOOPING_SPASM, 1.0, fSpasm1));
  DelayCommand(fT+=fSpasm1,SetCreatureAppearanceType(oNPC,
                          APPEARANCE_TYPE_SKELETON_COMMON));
  DelayCommand(fT+=0.01,PlayAnimation(ANIMATION_LOOPING_SPASM, 1.5, fSpasm2));
  DelayCommand(fT+=fSpasm2,SetImmortal(oNPC,FALSE));
  DelayCommand(fT+=0.01,ApplyEffectToObject(DURATION_TYPE_INSTANT,
                        EffectDeath(),oNPC));
  DelayCommand(fT+=fDestroy,SetIsDestroyable(TRUE));
}

также, на все остальные слоты лучше навесить врапперы типа:
Neverwinter Script Source
void main()
{
  if (!GetLocalInt(OBJECT_SELF,"DEATH"))
    ExecuteScript("nw_c2_default5", OBJECT_SELF);
}

вызываемый скрипт для каждого слота, естественно, свой. критичны 1,2,3,5,6,8,b... короче, проще все сделать. crazy.gif

ps. после "чуть-чуть подумать" переделал все, посему пришлось прибегнуть к редактированию поста... blush.gif
minion
mamuc У меня тут появилась немного другая идея, но раз ты предложил решенте проблемы то я сначала рассмотрю твое. Спасибо за помощь. good.gif
Если будут еще вопросы, то непременно об этом сообщу.
Aiwan У меня и стаяли дебаги везде. Вот только я все равно не мог понять в чем баг. yes.gif Но все равно спасибо.
Garou
В нормальном состоянии в игре кнопкой (Esc) можно прервать любой диалог, есть ли возможность вставив скрипт в () запретить прерывание (Уж больно ответственный момент в игре) диалога? Как выглядит этот скрипт?
Lex
Над этим бились очень долго сингловики. Выход нашли такой:
в начале диалога такое сделать (те в скрипте onDialog у НПС добавить строку)
Neverwinter Script Source
SetCutsceneMode(GetPCSpeaker(),TRUE); // вот не помню, катит тут такое определение игрока или нет

а в конце
Neverwinter Script Source
SetCutsceneMode(GetPCSpeaker(),FALSE);
Garou
Попробую. Спасsmile.gif
minion
mamuc А если я хочу, чтобы на одном спелле висело 3 ингридиента, а на другом допустим 4, то я могу сделать так:
Neverwinter Script Source
struct stRec
{
    string req1;
    string req2;
    string req3;
    string req4;
    string rez;
    int num;
};

struct stRec SetupLab(int nSpellID)
{
    struct stRec stR;
    switch (nSpellID)
    {
        case SPELL_MELFS_ACID_ARROW:
            stR.req1 = "NW_IT_MSMLMISC12";
            stR.req2 = "NW_IT_MSMLMISC09";
            stR.req3 = "****";
            stR.req4 = "****";         
            stR.rez = "****";
            stR.num = 4; // число ингридиентов
            break;
        case SPELL_MAGEARMOR:
            stR.req1 = "NW_IT_MSMLMISC12";
            stR.req2 = "NW_IT_MSMLMISC10";
            stR.req3 = "****";         
            stR.rez = "****";
            stR.num = 3;
            break;
        // пример для 2 спеллов     
    }
    return stR;
}


Т.е. сначала я определяю кастуемый спелл, а потом вызываю SetupLab (кастуемый спелл). Или мне надо сделать по другому?
Archangel
Неподскажите, что тут неправильно:
Neverwinter Script Source
DelayCommand(2.2, AssignCommand(oPC, SetCameraFacing(CAMERA_MODE_STIFF_CHASE_CAMERA)));

Мдя... наверно тут написана полная охинея. crazy.gif Че-то плоховато я разбираюсь с изменением режима камер. swoon.gif
minion
Archangelэ А что должно произойти по твоей задумке? А то не совсем понятно.
Добавлено в [mergetime]1117987770[/mergetime]
по тому что у тебя написано камера закрепится за игроком без возможности поворота.
Archangel
QUOTE
Archangelэ А что должно произойти по твоей задумке? А то не совсем понятно.

Должен поменятся режим камеры. От вида "сверху" к виду "со спины".
Добавлено в [mergetime]1117988024[/mergetime]
QUOTE
по тому что у тебя написано камера закрепится за игроком без возможности поворота.

Мне невожна возможность поворота. У мня КутСцена. Так что камера должна быть статичной.
minion
Как я написа камера по константе у тебя происходит закрепление камеры за игроком.
И для смены режима камеры используй
Neverwinter Script Source
void SetCameraMode(
    object oPlayer,
    int nCameraMode
);

Сама комманда с параметрами.
Мефистофель
А помойму, нодо просто, джампить РС в другую точку и задать градусы.
Сделай обычный переход камеры от высоты, до спины, задав градусы положения. например 90.0, 6.0 50. вид с высока. и плавно переместив камеру градусами 90.0, 0.0, 79. вид со спины.
dumbo
QUOTE (Анамиэль @ Jun 6 2005, 16:55)
Можно ли сделать так,чтобы НПС сидел в кресле,но так чтобы с ним было возможно ведение диалога?

насчет того, что непись должен встать для каких либо действий мы уже прояснили. теперь пару мелких скриптиков для реализации "сидоков".
1. создаем плэйс стула(static). тэг ему прописываем например CHAIR_01.
2. создаем непися. навешиваем на него локалку-string(правый клик на неписе-Variables(Переменные)) с именем Chair и значением = тэг стула, куда он должен садиться. т.е. в нашем случае "CHAIR_01".
3. в слот OnHeartBit неписю пишем скрипт:
Neverwinter Script Source
void main()
{
  if (GetAILevel() == AI_LEVEL_VERY_LOW) return;
  ExecuteScript("nw_c2_default1", OBJECT_SELF);
  if (!IsInConversation(OBJECT_SELF) &&
      !GetIsInCombat() &&
      GetCurrentAction() != ACTION_SIT)
    ExecuteScript("dd_sit",OBJECT_SELF);
}

4. в OnSpawn:
Neverwinter Script Source
void main()
{
  ExecuteScript("nw_c2_default9", OBJECT_SELF);
  ExecuteScript("dmb_sit", OBJECT_SELF);
}

5. собственно, сам dmb_sit:
Neverwinter Script Source
void main()
{
  int nIndex = 0;
  object oChair = OBJECT_INVALID;
  string sChairTag = GetLocalString(OBJECT_SELF, "Chair");
  if (sChairTag!="") {
    oChair = GetObjectByTag(sChairTag);
  }
  else
  {
    for (nIndex = 1; nIndex < 10; nIndex++) {
      oChair = GetNearestObject(OBJECT_TYPE_PLACEABLE, OBJECT_SELF, nIndex);
      if (!GetIsObjectValid(oChair)) break;
      if (FindSubString(GetStringUpperCase(GetTag(oChair)), "CHAIR")!=-1 &&
          !GetIsObjectValid(GetSittingCreature(oChair))) {
          nIndex = 0;
          break;
      }
    }
  }
  if (nIndex==0 && GetIsObjectValid(oChair)) ActionSit(oChair);
}


все. теперь непись при появлении будет сразу садиться на стул и усаживаться туда после разговора/драки. если на непися не вешать локалку с тэгом стула, то он поищет любой рядом стоящий стул для восседания.
ps. только сейчас, заметив в своем тестовом модуле, как мимо проносится девочка и водружает свою пятую точку на сундук, решил чутка подправить... blush.gif
mamuc
то minion
да можноpardon.gif
только не забудь вместо **** поставить для stR.req3 ,stR.req4 тэги необходимых компонентов, а stR.rez - ресреф создаваемого итема biggrin.gif yes.gif

и можно сделать так что бы обойтись и без поля int num; (неиспользовать)
..ведь в другом скрипте ты наверняка будешь делать проверку наличия компонентов для соотв крафта ...и там поставить условие типа если , скажем stR.req4=="" ( то есть пустой, не используется) то наличие компонента ( пустого компонента pardon.gif) есть.. pardon.gif
но это уже так на любителя..можно иделать стакой структурой как ты создал pardon.gif
2GoDoom
dumbo, все круто... но вот одна недоработочка - если таких неписей (которые хотят сест ьпосидеть) будет куча - то буит жутко тормозить (из-за хертбита) тем более, что помимо "садящихся" неписей ест ьи другие скрипты.
Поэтому, имхо, лучше переписать этот скрипт под юзердейфайнед...
К тому же можно будет сразу делать проверку на то - сидит он или нет, и если нет - то скрипт вапще не выполялся (прерывался, не идя по следущим веткам) wink.gif

З.Ы.
Имхо так нада делать... но, возможно, я ошибаюсь?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.