Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 144 145 146 147 >  
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Flaristan
сообщение Jul 26 2013, 05:13
Сообщение #3626


Тролль
****

Класс: Пьяный Мастер
Характер: Chaotic Neutral
Раса: Тварь



Цитата(Gatcuk @ Jul 25 2013, 19:45) *
Друзья, никто не подскажет скрипт для крафтинга через диалог?

Что-то вроде:

Изготовить "предмет" (требует X ресурса, X навыка изготовления брони). Во время проверки навыка имеется X% шанс успеха, в случае провала ингридиенты уничтожаются, но игрок предмет уже не получает.

Меня интересует крафт с проверкой навыков на изготовление брони (Craft Armor), оружия (Craft Weapon), ловушек (Craft trap), зелий (Brew potion) , поясов целителя (Heal), волшебных палочек (Craft wand), свитков (Scribe scroll), отмычек (Open lock), Книг (Lore).

Заранее спасибо (IMG:style_emoticons/kolobok_light/i-m_so_happy.gif)
>>>
Цитата(Flaristan @ Jul 18 2013, 05:30) *
Изучай скрипт-генератор – там есть все подобные функции.

Как создать данный скрипт с помощью скрипт генератора:
1. Запускаем генератор.
2. Choose script type (выберите тип скрипта) -> Normal script (нормальный скрипт).
3. Where is this script called from? (откуда запускается скрипт) -> From a conversation (из диалога).
4. Выбираем из списка арсенала генератора пункт Make an ‘if THIS then THAT condition’ (сделать «если ЭТО, то ТО условие») и жмем SCRIPT (скрипт).
5. Choose your condition (выберите ваше условие) -> Item restriction (требование предмета) -> The following event(s) will happen only if player (данный эвент(ы) случится только если игрок…) -> Has (имеет) -> The item tagged (предмет с тагом…) -> вводим таг предмета (в примере это «tag_of_resurs») -> есть возможность затребовать, чтоб этот предмет был экипирован на теле игрока в указанном слоте – она нам не нужна, не трогаем -> Okay (запилить!).
6. Операцию требования предмета можно повторить, если мы хотим, чтоб ресурсов было больше чем 1, но нам этого не надо, зато у нас есть требование навыка, поэтому все равно жмем еще раз Make an ‘if THIS then THAT condition’ (сделать «если ЭТО, то ТО условие») и жмем SCRIPT.
7. Choose your condition (выберите ваше условие) -> Successful skill check (удачная проверка навыка) -> Skill to check: (проверяемый навык) -> (тут можно ставить тот тип навыка, к которому мы относим крафт этого предмета – в примере это будет «Craft trap», ставим его; к сожалению почему-то в данном списке генератора представлены не все умения, но их можно и вручную в получившемся скрипте потом поменять будет, подсмотрев константы в тулсете или лексиконе) SKILL_CRAFT_TRAP -> Difficulty: (класс сложности; d20 + уровень навыка игрока должен быть равен или быть выше этого значения) -> (тут мы сразу одновременно устанавливаем и % успеха, т.к. чем выше разница требования и броска кубика + навыка игрока – тем меньше у него шансов на успех вплоть до «никаких»; допустим для примера мы создаем хитроумное приспособление которое должно соответствовать работе игрока-мастера не ниже 10 уровня с полностью вкачанным навыком, это около 13 пунктов навыка, добавим возможный бонус от вещей и модификаторов и повысим его до 17 пунктов, а так же установим вероятность создания такого предмета для такого мастера в 50% т.е. добавим еще 10 пунктов от предполагаемого броска кубика и получим в итоге 27, так и пишем) 27 -> Okay (запилить!).
8. Таким образом у нас получилось 2 условия – предмет и сложность крафта, теперь нам нужно описать что произойдет, если у игрока все получится. Выбираем из списка арсенала генератора пункт Give item(s)/XP/gold to PC (дать предмет(ы)/опыт/золото игроку) -> SCRIPT (скрипт) -> ResRef of item to give: (резреф получаемого предмета) -> (вбиваем/копируем сюда резреф того, что должно получиться – в примере это будет «resref_of_result») resref_of_result -> (больше мы ничего игроку не даем, поэтому жмем сразу финальную кнопку «запилить и выйти!») Okay – exit!
9. Итак у нас получается в случае прокидывания DC, игрок получает то, что он собирался скрафтить. На этом мы закрываем второе наше «if THIS then THAT» условие, для чего нажимаем 1 раз кнопку «Finish current if» (закончить текущее «если») -> Just finish (просто закончить; есть варианты еще «наветвить», но нам они тут не нужны).
10. В окошке «Current number of unfinished ‘if’ statements» (текущее число незавершенных «если» условий) видим, как 2 превратилось в 1. У нас осталось еще первое условие - предмета. Наш крафт подразумевает, что этот ресурс тратится при любом варианте, поэтому теперь мы это и осуществим в независимости от прокидываний DC. Выбираем из списка арсенала генератора пункт Take item(s)/XP/gold from PC (взять предмет(ы)/опыт/золото у игрока) -> SCRIPT (скрипт) -> (нам нужно только взять 1 предмет, поэтому мы заполняем лишь соответствующее поле) Tag of the item to take (таг забираемого предмета; у нас в примере это вышеупомянутый «tag_of_resurs») -> tag_of_resurs -> (больше мы ничего у игрока не забираем, поэтому жмем сразу финальную кнопку «запилить и выйти!») Okay – exit!
11. Теперь можно закрыть и 2 условие. Жмем «Finish current if» (закончить текущее «если») -> Just finish (просто закончить).
12. Вот собственно и весь наш скрипт. Больше нам добавить нечего и мы жмем кнопку «Close».
13. Теперь в окошке справа мы видим код нашего скрипта (выглядит кривовато, зато рабочий) – копируем его и помещаем его в нужное место в редакторе диалога (на «совершенные действия»).
14. Наслаждаемся и благодарим Лилака. Генератор можно закрывать.

Вот как выглядит результат:
Neverwinter Script
object oItem;
/*   Script generated by
Lilac Soul's NWN Script Generator, v. 2.3

For download info, please visit:
http://nwvault.ign.com/View.php?view=Other...683&id=625    */


//Put this on action taken in the conversation editor
void main()
{

object oPC = GetPCSpeaker();

if (GetItemPossessedBy(oPC, "tag_of_resurs")!= OBJECT_INVALID)
   {
   if (GetIsSkillSuccessful(oPC, SKILL_CRAFT_TRAP, 27))
      {
      CreateItemOnObject("resref_of_result", oPC);

      }
   oItem = GetItemPossessedBy(oPC, "tag_of_resurs");

   if (GetIsObjectValid(oItem))
      DestroyObject(oItem);

   }
}


Сообщение отредактировал Flaristan - Jul 26 2013, 05:31
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Gatcuk
сообщение Jul 26 2013, 09:49
Сообщение #3627


Level 1


Класс: Паладин
Характер: Neutral Good
Раса: Полуэльф



Огромное спасибо, друг.

Если честно, то я кажется начинаю потихоньку понимать, как это работает. И если можно, я попрошу еще один совет у мастеров. Дело в том что в редакторе я видел несколько предметов, чье предназначение не понял. А точнее: мясо, рыба, чеснок, беладонна. Не знаю, есть ли в игре кулинария (не одного упоминания я так и не обнаружил), но если они бесполезны, может подскажете младшему товарищу (это я) скрипт для того, что бы они расходовались во время отдыха. У меня уже на уме довольно простая, но в то же время интересная экономическая система для шарда. И если бы в нем присутствовали подобные расходники, это бы было очень кстати. (IMG:style_emoticons/kolobok_light/i-m_so_happy.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
arcmag
сообщение Jul 26 2013, 17:26
Сообщение #3628


Level 2
*

Класс: Убийца
Характер: Neutral Evil
Раса: Нежить



Цитата
Если честно, то я кажется начинаю потихоньку понимать, как это работает. И если можно, я попрошу еще один совет у мастеров. Дело в том что в редакторе я видел несколько предметов, чье предназначение не понял. А точнее: мясо, рыба, чеснок, беладонна. Не знаю, есть ли в игре кулинария (не одного упоминания я так и не обнаружил), но если они бесполезны, может подскажете младшему товарищу (это я) скрипт для того, что бы они расходовались во время отдыха. У меня уже на уме довольно простая, но в то же время интересная экономическая система для шарда. И если бы в нем присутствовали подобные расходники, это бы было очень кстати. i-m_so_happy.gif


Я конечно не мастер по скриптам но то что ты просишь по моему весьма просто. Допустим если игрок должен отдыхать в трактире в комнате вешаешь на кровать диалог с опцией "Отдых" которая появится в том случае если в инвентаре будет мясо, рыба ну и тд. При нажатии эти объекты дестроятся и начинается отдых.

На проверку для появления текста нужно повесить



Neverwinter Script
#include "nw_i0_tool"
int StartingConditional()
{
    if(HasItem(GetPCSpeaker(), "ТАГ_ТВОЕГО_ПРЕДМЕТА"))
        return TRUE;
    return FALSE;
}


и на действие при активации диалога


Neverwinter Script
void main()
{
   object oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "ТАГ_ТВОЕГО_ПРЕДМЕТА");
   if(GetIsObjectValid(oItemToTake) != 0){
      DestroyObject(oItemToTake);
      ForceRest(GetPCSpeaker()); // насчет этой строчки я не совсем уверен но помоему она должна активировать отдых
}
}


Сообщение отредактировал arcmag - Jul 26 2013, 17:46
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Jul 26 2013, 18:38
Сообщение #3629


Level 11
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



Цитата
ForceRest(GetPCSpeaker()); // насчет этой строчки я не совсем уверен но помоему она должна активировать отдых

не,... сам процесс не активируется, но используется на персонаже "сила отдыха", т.е. эффект как-будто персонаж отдохнул. Если нужно заставить именно отдыхать, то там есть актион вроде, типа ActionRest

Neverwinter Script
if(GetIsObjectValid(oItemToTake) != 0)

тут можно и не делать сравнение а просто if(GetIsObjectValid(oItemToTake))

Сообщение отредактировал Melisse - Jul 26 2013, 18:38
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Gatcuk
сообщение Jul 27 2013, 09:25
Сообщение #3630


Level 1


Класс: Паладин
Характер: Neutral Good
Раса: Полуэльф



Спасибо большое. А это будет работать если в локации стоит запрет на отдых?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Jul 27 2013, 12:29
Сообщение #3631


Level 11
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



Ну если вы делаете скриптово и не нужно нажимать кнопку отдыха на панели GUI, то ActionRest может и работает, ForceRest точно.

Сообщение отредактировал Melisse - Jul 27 2013, 12:30
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
arcmag
сообщение Jul 27 2013, 13:09
Сообщение #3632


Level 2
*

Класс: Убийца
Характер: Neutral Evil
Раса: Нежить



Подскажите в чем ошибка? Хочу сделать простой такой скрипт который срабатывал бы при приближении игрока на определенное расстояние к существу чтобы тот из нейтрального состояния переходил во враждебное и крикнул бы что нибудь вроде "Тебе нельзя здесь находиться!"

Хочу повесить такой скрипт на гоблина, но не могу понять на какую ячейку вешать этот скрипт

Neverwinter Script
void main()
{
object oPC = GetLastDisturbed(); // вот с этой строчкой у меня тоже сомнения) я честно говоря не понял как называется функция для получения последнего объекта вошедшего в зону видимости ну или чего то подобного.
if(GetDistanceBetween(oPC,OBJECT_SELF)<10.0){  //проверяем расстояние между объектами
AssignCommand(OBJECT_SELF,ActionAttack(oPC)); 
AssignCommand(OBJECT_SELF,ActionSpeakString("Тебе нельзя здесь находиться!"));
}
}


И еще 1 проблема, почему то вдруг компилятор наотрез отказыватся воспринимать русский язык. Он попросту даже не печатается в нем. В английской раскладке все нормально а вот как только перехожу на русский клавиатура как будто пропадает только пробел и печатается. Пробовал взять и написать текст на русском в блокноте а потом скопировать но компилятор начал ругаться неожиданно на букву Я хотя раньше все было нормально, даже в коментариях выявляет ее как ошибку...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Jul 27 2013, 19:59
Сообщение #3633


Level 11
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



Вешайте в OnHeartbeat
что-то типа такого
Neverwinter Script
void main()
{
   // Игрок (живой)
   object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF,1,
                                                              CREATURE_TYPE_IS_ALIVE, TRUE);
   // Найден?
   int bValue = GetIsObjectValid(oPC);

   // Найден и дистанция меньше 10м
  if(bValue && GetDistanceBetween(OBJECT_SELF, oPC) < 10.0f)
   {
        // НПЦ не дерется
        if(!GetIsInCombat() )
        {
             ClearAllActions();// Чистим стэк действий
             AdjustReputation(oPC, OBJECT_SELF, -100);// Репутацию к игроку скинем в враждебность (можно и не делать)
       
             SpeakString("Тебе нельзя здесь находиться!"); // Произносим фразу

             ActionAttack(oPC, FALSE); // Атакуем
         }
    }
}



Цитата
И еще 1 проблема, почему то вдруг компилятор наотрез отказыватся воспринимать русский язык. Он попросту даже не печатается в нем. В английской раскладке все нормально а вот как только перехожу на русский клавиатура как будто пропадает только пробел и печатается. Пробовал взять и написать текст на русском в блокноте а потом скопировать но компилятор начал ругаться неожиданно на букву Я хотя раньше все было нормально, даже в коментариях выявляет ее как ошибку...

Надо поставить патч Дамбо. Правда я не знаю что там с win 7 и дальше, у меня XP SP3 на стационаре и Vista на буке, т.к. они давно очень куплены.
Еще надо в тулсете в редакторе скриптов изменить шрифт на Courer вроде, чтобы буквы показывало,
а чтобы в игре отражались русские буквы нужно в папку override, в каталоге с игрой, кинуть эти шрифты/или эти шрифты

Сообщение отредактировал Melisse - Jul 27 2013, 22:53
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
arcmag
сообщение Jul 27 2013, 20:51
Сообщение #3634


Level 2
*

Класс: Убийца
Характер: Neutral Evil
Раса: Нежить



Да дело не в том что у меня шрифт коряво отображается. Такая проблема уже была Courer шрифт поставил и все нормально стало. У меня проблема в другом, я просто не могу ничего по русским напечатать просто жму клавиши русской раскладки а компилятор их игнорирует хотя клавиатуру видит цифры и пробелы печатает, переключаюсь на англискую клаву английский текст печатает нормально.
Хотя еще недавно этой проблемы не было. Что произошло вдруг я так и не понял.

Сообщение отредактировал arcmag - Jul 27 2013, 20:52
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 27 2013, 23:15
Сообщение #3635


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Через ini пропиши тулсету шрифт Courier New Cyr, выбор кириллицы через настройки у меня например не работает.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
arcmag
сообщение Jul 28 2013, 11:14
Сообщение #3636


Level 2
*

Класс: Убийца
Характер: Neutral Evil
Раса: Нежить



А можно пожалуйста по подробнее как это сделать? Как прописать через этот ini ?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 28 2013, 15:26
Сообщение #3637


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



В nwtoolset.ini есть кусок типа:
Цитата
[Script]
FontName=Courier New
Надо дописать Cyr к шрифту.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
arcmag
сообщение Jul 28 2013, 19:20
Сообщение #3638


Level 2
*

Класс: Убийца
Характер: Neutral Evil
Раса: Нежить



Дописал увы не помогло. Наверное придется сносить НВН и заново устанавливать, патчить и тд) эххх сколько гемора (IMG:style_emoticons/kolobok_light/cray.gif)

Кстати а почему когда я пытаюсь загрузить картинку изображение у меня выводится "Загруженный файл слишком большой"? 36кб это много? А сколько он должен весить тогда?

Сообщение отредактировал arcmag - Jul 28 2013, 19:24
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jul 29 2013, 04:49
Сообщение #3639


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



1 кб. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 30 2013, 07:27
Сообщение #3640


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Ну есть ещё вариант кодовые таблицы в реестре винды переправить. Правда делал я это последний раз для какого-нить пятого фотошопа в доисторической винде, так что подобное решение придётся погуглить самому. Суть - таблицы cp1252 и cp1250 (для верности) сослать на файл cp1251, чтоб всегда была кириллица.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virusman
сообщение Jul 31 2013, 00:03
Сообщение #3641


Level 17
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Человек
NWN: Скриптинг [PW]
Axistown SR 1.9
NWNX



Я где-то выкладывал .reg-файл для этого.
Вот, собственно:
http://www.city-of-masters.ru/forums/index...st&p=120513
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
arcmag
сообщение Jul 31 2013, 20:10
Сообщение #3642


Level 2
*

Класс: Убийца
Характер: Neutral Evil
Раса: Нежить



Цитата
Я где-то выкладывал .reg-файл для этого.
Вот, собственно:
http://www.city-of-masters.ru/forums/index...st&p=120513


А что этот файл должен делать то? Я его скачал cp1252_fix запустил подтвердил комп перезагрузил. Ничего собственно не изменилось к сожалению

Цитата
Похоже, что проблема с отображением русских букв довольно часто встречается. Хотелось бы её всё-таки решить.
У кого есть такой баг, напишите:
1. Какая версия Windows
2. Какая версия NWN
3. NWN с русской локализацией или нет?
4. Тулсет английский?
5. Если сломалось после определённого момента, то опишите, после чего перестали отображаться русские буквы.
6. Где-нибудь в тулсете русский язык отображается или нет?


1) Windows XP SP 3
2) Была 1.66 пропатчил до 1.69
3) Да перевод на русский поставил
4) Тулсет тоже русский
5) После чего сам не помню) помню лишь то что в сами файлы НВН я не лазил ничего не редактировал и не удалял, в тулсете что то делал но все действия не помню в основном со скриптами копался.
6) Русский язык корректно отображается во всем тулсете но в компиляторе он почему то он именно не печатается если взять и скопировать фразу на русском и вставить в тулсет то он вполне корректно отображается. И еще на букву Я начал ругаться хотя раньше такого никогда не было .

Сообщение отредактировал arcmag - Jul 31 2013, 20:11
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Jul 31 2013, 22:36
Сообщение #3643


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



6) Патч dumbo.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Flaristan
сообщение Sep 5 2013, 18:31
Сообщение #3644


Тролль
****

Класс: Пьяный Мастер
Характер: Chaotic Neutral
Раса: Тварь



Если кто-то знает тонкости работы эвента "OnPlayerUnEquipItem" - в чем может быть загвоздка в скрипте подобного типа:..
Neverwinter Script
void main()
{
object oPC = GetPCItemLastUnequippedBy();
object oItem = GetPCItemLastUnequipped();
effect eEffect;

eEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eEffect))
      {
      if ((GetEffectType(eEffect) == EFFECT_TYPE_SKILL_INCREASE) || (GetEffectType(eEffect) == EFFECT_TYPE_SKILL_DECREASE))
         {
         RemoveEffect(oPC, eEffect);
         }
      eEffect = GetNextEffect(oPC);
      }

if (oItem == ...)
   {
   eEffect = EffectSkillIncrease(SKILL_..., ...);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
   }
}
Естественно вместо точек конкретные данные/условия. Суть загвоздки в том, что не срабатывает цикл снятия эффектов; причем на эвенте "OnPlayerEquipItem" подобный скрипт срабатывает нормально.

Сообщение отредактировал Flaristan - Sep 5 2013, 18:31
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Sep 5 2013, 19:22
Сообщение #3645


Level 11
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



Вообще не знаю вроде все правильно.Вот пример из лексикона, согласно которому все нормально
Neverwinter Script
//Remove blindness from the PC
effect eLoop=GetFirstEffect(oPC);

while (GetIsEffectValid(eLoop))
   {
   if (GetEffectType(eLoop)==EFFECT_TYPE_BLINDNESS)
         RemoveEffect(oPC, eLoop);

   eLoop=GetNextEffect(oPC);
   }
}


имхо, на мой взгляд посимпатичнее было сделать так

Neverwinter Script
eEffect = GetFirstEffect(oPC);
     while (GetIsEffectValid(eEffect))
      {
         int nType = GetEffectType(eEffect);
         if (nType == EFFECT_TYPE_SKILL_INCREASE ||
             nType == EFFECT_TYPE_SKILL_DECREASE)
         {
                RemoveEffect(oPC, eEffect);
         }
      
         eEffect = GetNextEffect(oPC);
      }


Если тебе необходимо снять конкретный тип эффекта, которые у персонажа появился при надевании конкретно типа итема
То лучше делать фишку через проверку того кто эффект создал.
т.е. при налоениие эффекта ты пишешь AssignCommand(oSets, ApplyEffect(bla-bla, oPC));
естественно оSets в данном случае просто объект, который отвечает за эффекты от сетов (это из библиотеки системы сетов)
А при снятии - просто проверяешь, что эффекты созданы сетами и удаляешь их:
Neverwinter Script
object oSets = GetObjectByTag("SETS");
    effect eEff = GetFirstEffect(oPC);
    while (GetIsEffectValid(eEff))
    {
        if (GetEffectCreator(eEff) == oSets)
        {
            RemoveEffect(oPC, eEff);
        }

        eEff = GetNextEffect(oPC);
    }



а при надевании в кастомной функции уже прописываешь проверки и все такое. Система сетов есть на ваулте - если интересно поищи.

Сообщение отредактировал Melisse - Sep 5 2013, 19:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Flaristan
сообщение Sep 7 2013, 00:04
Сообщение #3646


Тролль
****

Класс: Пьяный Мастер
Характер: Chaotic Neutral
Раса: Тварь



Сеты это все-таки немного другое – у меня эффект добавляется при использовании не уникального итема: для придания большей актуальности режиму парирования в игре, я ввел дополнительно базовое значение в +10 парирования (подобно базовым +10 брони на теле) персонажам использующим любые комбинации не дистантного оружия без использования щитов, а так же используя факел. Помимо того факел (любой) у меня сам по себе в игре дает дополнительные бонусы и пенальти.
В общем эвенты «снять/одеть» работают в НВН не совсем корректно, и при использовании такого большого числа условий - постоянно возникают разнообразные баги в т.ч. по мере попыток их решения. Во время тестов у меня создалось впечатление, что у эвента «снять» нарушена причинноследственная связь – при снятии предмета, похоже, что для скрипта расчетным состоянием персонажа является состояние до его снятия (при котором естественно, что предмет еще находится на теле, хотя скрипт срабатывает именно от того, что мы его сняли). Хотя до конца я так и не понял их принцип работы.

В общем последний более менее рабочий вариант у меня был такой:..
Neverwinter Script
//(этот скрипт идет под номером 3)
//сначала очищаем все бонусы и пенальти
eEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eEffect))
      {
      if ((GetEffectType(eEffect) == EFFECT_TYPE_SKILL_INCREASE)
         || (GetEffectType(eEffect) == EFFECT_TYPE_SKILL_DECREASE))
         {
         RemoveEffect(oPC, eEffect);
         }
      eEffect = GetNextEffect(oPC);
      }

//если у персонажа есть оружие в правой руке и оно не дистантное...
if ( (GetIsObjectValid (GetItemInSlot (INVENTORY_SLOT_RIGHTHAND, oPC) ) )
  && (!GetWeaponRanged (GetItemInSlot (INVENTORY_SLOT_RIGHTHAND, oPC) ) ) )
   {
//...и если у персонажа нету щита в левой руке - получаем бонус парирования
   if ( (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) != BASE_ITEM_SMALLSHIELD)
     && (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) != BASE_ITEM_LARGESHIELD)
     && (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) != BASE_ITEM_TOWERSHIELD) )
      {
      eEffect = EffectSkillIncrease(SKILL_PARRY, 10);
      eEffect = SupernaturalEffect(eEffect);
      ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
      }
   }
   else
   {
//в противном случае дополнительно проверяем нет ли в левой руке факела и если есть - так же даем этот бонус
   if (GetBaseItemType (GetItemInSlot (INVENTORY_SLOT_LEFTHAND, oPC) ) == BASE_ITEM_TORCH)
      {
      eEffect = EffectSkillIncrease(SKILL_PARRY, 10);
      eEffect = SupernaturalEffect(eEffect);
      ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
      }
   }

//если персонаж имеет факел в левой руке - он так же получает отдельные бонусы и пенальти от его ношения
if (GetBaseItemType (GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC) ) == BASE_ITEM_TORCH)
   {
   eEffect = EffectSkillIncrease(SKILL_SPOT, 10);
   eEffect = SupernaturalEffect(eEffect);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);

   eEffect = EffectSkillDecrease(SKILL_HIDE, 10);
   eEffect = SupernaturalEffect(eEffect);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);

   eEffect = EffectSkillDecrease(SKILL_ANIMAL_EMPATHY, 10);
   eEffect = SupernaturalEffect(eEffect);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);
   }
…скрипт (в теории) универсально подходящий как для события «снять» так и для «одеть» (т.к. он проверяет полное состояние экипировки и назначает результирующие бонусы, зачистив все предварительно). Однако в отличие от эвента «одеть» - эвент «снять» его переваривает неудовлетворительно.

Как удалось решить обойти проблему:..
Neverwinter Script
//скрипт 1
void main()
{
object oPC = GetPCItemLastEquippedBy();

if (!GetIsPC(oPC))
return;

DelayCommand(0.5, ExecuteScript("3", oPC));
}

//скрипт 2
void main()
{
object oPC = GetPCItemLastUnequippedBy();

if (!GetIsPC(oPC))
return;

DelayCommand(0.5, ExecuteScript("3", oPC));
}
...т.к. последняя версия этих скриптов была приведена к универсальной – запихал ее отдельным скриптом и на события «снял/одел» просто назначил запуск ее как активную проверку, запускающуюся от лица персонажа стартовавшего эвент.

Сообщение отредактировал Flaristan - Sep 7 2013, 00:21
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 8 2013, 10:52
Сообщение #3647


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Делал сеты таким же макаром - работало без нареканий.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Flaristan
сообщение Sep 8 2013, 16:45
Сообщение #3648


Тролль
****

Класс: Пьяный Мастер
Характер: Chaotic Neutral
Раса: Тварь



Таким же макаром в смысле через проверки эффектора или через доп скрипт?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Sep 9 2013, 07:34
Сообщение #3649


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Один скрипт на equip, второй - unequip, в каждом одна и та же проверка на надетые итемы и эффекты на персонаже. Никаких костылей.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Flaristan
сообщение Sep 9 2013, 20:41
Сообщение #3650


Тролль
****

Класс: Пьяный Мастер
Характер: Chaotic Neutral
Раса: Тварь



Когда я только факел делал и предмет был указан по тагу – все работало отлично. Чехарда началась, когда место тагов заняли более универсальные типы итемов.
Но костыль проблему с нарушением причинно-следственной связи устраняет и на том ладно.

Сообщение отредактировал Flaristan - Sep 9 2013, 20:44
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 144 145 146 147 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29th March 2024 - 02:50