Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > 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
serafim
1)герой 1-го уровня, толко что созданый, голый, ни одной вещи в слоте. Какой тут иммун а?

2) "Сам никогда таким извращением не занимался, но здесь главное - перенести из placeables.2da в appearance.2da название модельки (ModelName -> Race). Остальное уже дело техники"

Да название то модельки я перенес. А вот где взять саму палитру. в НВН нет же хаков, откуда можно выковырять эту палитру.
Ilerien
Цитата
герой 1-го уровня, толко что созданый, голый, ни одной вещи в слоте. Какой тут иммун а?
Вот уж не знаю, но по-другому быть не может.
Цитата
А вот где взять саму палитру. в НВН нет же хаков, откуда можно выковырять эту палитру.
Что значит "взять палитру"? Если в 2да прописана новая моделька существа, то её можно поставить любому существу как в кастомной палитре, так и на локации.
serafim
я имею ввиду, откуда взять фалы на цвет "куска грязи", его "форму" 3-д модель? из 2да в 2да я все характеристики которые были перекинул но этого же мало. А так как этот "кусок грязи" стандартная модель НВН, то я не знаю откуда взять эти файлы, ведь в тулсе при создании НПС, который будет выглядеть как кусок грязи- будет писатся и пишется что такая модель не существует.
хух, вроде бы обьяснил smile.gif
Ilerien
Цитата
я имею ввиду, откуда взять фалы на цвет "куска грязи", его "форму" 3-д модель? из 2да в 2да я все характеристики которые были перекинул но этого же мало.
А какая разница? Движок видит эту модельку в стандартных ресурсах игры, назначить её можно хоть сотне кастомных существ или плейсов. По логике никаких проблем с назначением апиаренсу существа модельки, предназначенной изначальной для плейсов, быть не должно, кроме отсутствия анимации и т. д., но это фигня.
Цитата
пишется что такая модель не существует
Не знаю, почему так. В прикрелённом файле пример 2дашки, у меня работает. Переделанный плейс в строке 871.
Кстати, даже в дефолте есть несколько апиаренсов существ, которые используют модельки плейсов (найти можно поиском в appearance.2da по "object").
serafim
ВСе заработало! СПС огромное!
Кусок грязи действительно определяяется нормально, как ты и говорил Илериен. Там просто в 2да-шке нужно было заполнить все данные, даже от фонаря smile.gif

Плейсы удаляються. понял в чем была проблема-- ка оказалось в самом малом и незначительном, неправильно был написан ТЕГ smile.gif

но вот еффект замедления так и неработает smile.gif

ЗЫ: еще вопросик, будьте добры напишите скрипт при которм диалоговая строка появляется только когда выплвнена часть квеста, тоесть в журнале переменная будет стоять или 1 или 2 smile.gif а то я пишу и ничего не получается sad.gif
Ilerien
Neverwinter Script
int StartingConditional()
{
    int nVariable = GetLocalInt(<имя переменной>, <объект, на котором висит локалка - если игрок, говорящий с неписем, то нужно использовать GetPCSpeaker()>);
    return nVariable == 1 || nVariable == 2;
}
Вешать на Text Appears When слот целевой строчки диалога.
Цитата
но вот еффект замедления так и неработает
Посмотри, что вернёт функция GetIsImmune() для игрока и IMMUNITY_TYPE_SLOW, IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE, IMMUNITY_TYPE_PARALYZIS. За правильность написания названий констант не ручаюсь.
Ogneslav
Давно не бывал на этом сайте(
Так приятно снова сюда заглянуть!))))

Вообщем мне тут понадобился скрипт небольшой, если кто напишет буду очень благодарен.
Нужно:
1)Активируем на персонажа(PC), скрипт запоминает ВСЕ его характеристики, заклинания, вещи(вещи не обязательно)... и т.д. Короче делает копию, но НЕ ставит её рядышком(как зеркало в ХотУ), а именно заносит в память, да так, чтобы эта копия не была привязана к моду, а могла позже появляется и в других(конечно если импортировать скрипт)
2)Активируем на себя появляется диалоговое окно, которое показывает кто уже есть и нажатии на нужного ставит его рядом(фракция не важна, просто ставит рядом как NPC)
Вот еще что: если дважды на одного клацнуть - то нужно чтобы они не добавлялись, а заменялись.

Нужно для DMа

Вроде всё, если что непонятно изложил предупредите.
Virake
Цитата(Ilerien @ Jun 9 2009, 23:10) *
Это устаревшая библа, юзай x3_inc_string.

Не догнал. Я говорю ЭТО ИЗ БАЗЫ СКРИПТОВ ГОРОДА МАСТЕРОВ. Или это аналогичная стандартная появилась в x3? В теме было сказано, что этот скрипт "выдран из буржуйского модуля".
Ilerien
Цитата
Или это аналогичная стандартная появилась в x3?
Именно. И намного более удобная.
serafim
Елки -палки!!!!
эти диалоги меня замучили в конец. Вот смотрите:

диалог №1 - хххххх - этот тиалог появляется при первом разговоре (сделано, все ок рабоатет);

диалог №2 - хххххх- этот диалог появляется после первого и дает задание ( сделано, все ок работает);

диалог №3 - хххххх- этот диалог появляется если у героя есть "вещь", ктору нужно принести получив задание от диалога №2. Так же этот диалог дает еще одно задание. тоесть- принесли вещь-- появился диалог -- получил задание. (сделано, все ок работате);

диалог №4 -хххххх- этот диалог появлятся если выполнена часть квеста от диалога №3. тоесть в редакторе журанала бкдет стоять пременная 2 (задание рабито в журнале на три части:1,2,3).
Диалог так же появляется если у героя есть вещь. тоесть идет проверка двух переменных:
а) вещи
б) переменной в редакторе журнала "2".
(сделано, ни хрена не рабоатет);

диалог №5 - ххххх - этот диалог появляется всякий раз когда у героя не выполнено задание или его просто нет, или просто так поболатать.



вот скрипт на диалог №4:

Neverwinter Script
#include "nw_i0_tool"

int StartingConditional()

{

if(GetLocalInt(GetPCSpeaker(), "LOCAL") == 2 &&

HasItem(GetPCSpeaker(), "METLA"))

return TRUE;

return FALSE;

}


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

Ilerien
Ошибка либо в строках (тег, название локалки), либо локалка не становится равной 2. Дебаг в помощь.
Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();

    SendMessageToPC(oPC, IntToString(GetLocalInt(oPC, "LOCAL")));
    SendMessageToPC(oPC, IntToString(HasItem(oPC, "METLA")));

    return GetLocalInt(oPC, "LOCAL") == 2 && HasItem(oPC, "METLA");
}
serafim
да нет локалка становится "2". Двойкой она становится после кастсцены, которая нормально работает, и журнал выдает сообщение, то есть локалка становится "2"-кой. Тег локалки проверял раз 20 тоже все нормально. А диалог не появляется. сегодня вечером попробую то чо ты написал Илериен, спс огромное. good.gif
gennady
Цитата(serafim @ Jun 30 2009, 16:47) *
". Двойкой она становится после кастсцены, которая нормально работает, и журнал выдает сообщение, то есть локалка становится "2"-кой. Тег локалки проверял раз 20 тоже все нормально.

Лучше кинь чего ты там в скрипте написал. Уж не тег ли журнальной записи?
serafim
Да, тег журнальной записи. Я так понял, что не стоило этого было делать? А как тогда обозначить переход состояния переменной с 1 до 2 и так далее, если не через тег журнальной записи в каком-то скрипте?
gennady
Я так и думал... Тут тебе нужна именно локалка об этом событие, вот её и нужно проверять... Журнальную запись по номеру задания не отследить... В диалоги тогда нужно будет проверять правильную локалку, только реши на кого её повесить. Например:
Neverwinter Script
void main()
{
object oPC = GetFirstPC(); // Наш герой

AddJournalQuestEntry("LOCAL_quest", 2, oPC); // журнал 2 запись
SetLocalInt(oPC, "LOCAL" ,2); // Локалка о 2 записи в журнале
}

Теперь проверка в диалоге этого события:
Neverwinter Script
#include "nw_i0_tool"

int StartingConditional()

{
object oPC = GetPCSpeaker(); // Наш герой

if(GetLocalInt(oPC , "LOCAL") == 2 && HasItem(oPC , "METLA"))
return TRUE;
return FALSE;
}
/*
Проверить численное значение локалки на герое LOCAL равное 2
Проверить предмет с тегом METLA
При наличие этих двух составляющих, откроется ветка диалога
*/
serafim
[quote name='gennady' date='Jul 1 2009, 21:20' post='129787']
Я так и думал... Тут тебе нужна именно локалка об этом событие, вот её и нужно проверять... Журнальную запись по номеру задания не отследить... В диалоги тогда нужно будет проверять правильную локалку, только реши на кого её повесить. Например:
Neverwinter Script
void main()
{
object oPC = GetFirstPC(); // Наш герой

AddJournalQuestEntry("LOCAL_quest", 2, oPC); // журнал 2 запись
SetLocalInt(oPC, "LOCAL" ,2); // Локалка о 2 записи в журнале
}


СПС только я непонял три вещи:
1) почему таки журнальная запись не проверяется?
2) куда эвешать этот скрипт? можно пример? Я так понял он должен стоять у меня в каст сцене да? что бы журнальная запись стала "2" и локалка тоже?
3) Обьясните мне сразу что есть локалка? например, вот это -- AddJournalQuestEntry("LOCAL_quest", 2, oPC); // журнал 2 запись -- я понял, а вот это не совсем -- SetLocalInt(oPC, "LOCAL" ,2); // Локалка о 2 записи в журнале. тоесть я непонимаю откуда брать Тег локалки потоум как непонимаю что есть сама локалка. smile.gif

ЗЫ: РЕБЯТА, Я ХОТЕЛ ПОБЛАГОДАРИТЬ ВАС ВСЕХ, КТО ПОМОГАЕТ НАМ НАЧИНАЮЩИМ. НЕ ПОТОМУ КАК ВЫ ТАКИЕ МОЛОДЦЫ,.. И ПРОЧИЕ ДЕФЕРАМБЫ В ВАШУ СТОРОНУ ЛИТЬ НЕ БУДУ. А ПОТОМУ КАК, ЕСТЬ ВЕЩИ, КОТОРЫЕ ТЫ ДЕЛАЕШЬ ИЛИ ХОЧЕШЬ СДЕЛАТЬ, НО, ОТЧАСТИ, НЕ ПОНИМАЕШЬ, И, ХОРОШО, КОГДА ЕСТЬ ЛЮДИ СПООБНЫЕ ТЕБЕ ПОДСКАЗАТЬ И ПОКАЗАТЬ "КАК" И "ЧТО" НУЖНО (Д)СДЕЛАТЬ, ТОГДА И ИНТЕРЕС К РАБОТЕ РАСТЕТ И РАБОТАТЬ СТАНОВИТСЯ ЛЕГЧЕ И ЯСНЕЕ. СПАСИБО ВАМ. (ох, прям на слеЗу потянуло thank_you.gif )
Ilerien
Цитата
1) почему таки журнальная запись не проверяется?
А зачем? smile.gif Журнальная запись - просто информация игроку о квесте, смысловой нагрузки для системы скриптов она не несёт.
Цитата
2) куда эвешать этот скрипт? можно пример? Я так понял он должен стоять у меня в каст сцене да? что бы журнальная запись стала "2" и локалка тоже?
Да, значение локалки изменять в то же время, что и журнальную запись.
Цитата
3) Обьясните мне сразу что есть локалка? например, вот это -- AddJournalQuestEntry("LOCAL_quest", 2, oPC); // журнал 2 запись -- я понял, а вот это не совсем -- SetLocalInt(oPC, "LOCAL" ,2); // Локалка о 2 записи в журнале. тоесть я непонимаю откуда брать Тег локалки потоум как непонимаю что есть сама локалка.
У каждого объекта есть список переменных, который представляет собой ассоциативный массив (строка -> тип (число, строка, etc.)). Иначе говоря, локалка - это навешенная на на объект переменная, обладающая, во-первых, названием (string), во-вторых, значением (какой-либо тип; если используется, к примеру, функция SetLocalInt(), то значение будет типа int). Если данная локалка не была установлена на объект, то её значение считается 0 для GetLocalInt(), 0.0 для GetLocalFloat(), "" (пустая строка) для GetLocalString(), OBJECT_INVALID для GetLocalObject().
Функции SetLocalX(object o, string s, X a), где Х - тип локалки, устанавливают на объекте о (первый аргумент) значение локалки с названием s (второй аргумент) в а (третий аргумент).
Т. е. той локалке нужно присвоить какое-то уникальное название.
serafim
А журнал квестов тоже есть обьектом, то есть локалкой (у нее же то же есть переменные)?
Например, у меня журнальная запись с тегом ybor_sar.
правильно ли будет прописать:

SetLocalInt(oPC, "ybor_sar" ,2);

или журнальная запись не есть локалкой?
Если не есть, тогда что должно писатся под значением Х, где:
SetLocalInt(oPC, "Х" ,2); ????
Ребята, простите за дотошность, но мне легче воспринимать инфу сразу же на примере. СПС
Ilerien
Цитата
А журнал квестов тоже есть обьектом, то есть локалкой (у нее же то же есть переменные)?
Журнал - не объект.
Цитата
Neverwinter Script
SetLocalInt(oPC, "ybor_sar" ,2);
Ты можешь назвать локалку на игроке как угодно. В том числе и так же, как у тебя называется журнальная запись. Главное - потом проверять локалку с тем же названием. Эта строка кода ставит локалку на игроке с названием "ybor_sar" в 2.

Журнал - это вообще фигня. Забудь про запись в журнале, это всего лишь информация игроку. Скрипт твой будет учитывать именно локалку, а уж как ты её назовёшь - твоё дело.
serafim
все теперь понял smile.gif СПС smile.gifсегодня вечером попробую. потом отпишусь.
Mingun
Мне бы хотелось узнать, свойство предмета Ранение (Wounding) является эффектом или нет? Т.е. как оно работает - по схеме - (удар -- скрипт -- эффект Ранения на цели) или это типично движковая функция? Вообщем, можно ли наложить этот эффект без использования оружия? ph34r.gif
Ilerien
Это движковое, эффект нельзя наложить скриптом.
Mingun
Ээх!, такая жалость! swoon.gif А сколько времени она действует и можно ли это как то указать?

Я так подозреваю, что длительность указать нельзя. В таком случае меня интересует, сколько длится эффект, или он снимается ТОЛЬКО лечением?
Ilerien
Указать нельзя. Длительность - надо тестить, так не знаю smile.gif
Virake
Не уверен, но возможно длительность есть в 2da файлах.
Memphis
Доброго времени суток всем! Перейду сразу к делу:
Мне нужно написать несколько скриптов, которыеми я хотел бы обогатить свой мод.

Требуется
-1- Скрипт, который воскрешает монстра или нпц через определенное время. Если возможно, выложить скрипт, который ресает всех монстров на локации после определенного времени и при полной зачистке этой локации.
-2- Скрипт, который создает монстров в определенной локации через небольшой промежуток времени пока живет определенный монстр или нпц (время можно установить).
-3- Скрипт, который заставляет монстра кастовать заклинания не сразу, а через некоторое время. Можноли это привязать к жизням монстра? Например: 100% жизней - моб кастует слепоту, 75% жизней - монстр кастует оглушение и т. д.

Очень прошу написать, можно ли создать такие скрипты!


При создании мода, я обязательно укажу автора скрипта!
ShurikVch
Всем привет!

Знатоки, помогите пожалуйста. Хотелось бы изменить действие заклинаний Magic Fang/Greater Magic Fang так, чтобы их мог применять на себя "превращённый" друид/Shifter. В NWN2 это вроде бы есть, а вот в первом - нет. Я пытался изменить скрипт, но для первого заклинания там только две коротких строчки, а второй скрипт явно - расширение первого.
Lex
ShurikVch, думаю там различие не столько в скрипте, сколько в 2да (разрешение кастовать на разные объекты и в разных состояниях зашито вроде бы там).

Цитата(Memphis @ Sep 18 2009, 14:28) *
-1- Скрипт, который воскрешает монстра или нпц через определенное время. Если возможно, выложить скрипт, который ресает всех монстров на локации после определенного времени и при полной зачистке этой локации.

Можно. и вроде бы где-то на форуме пару раз что-то очень похожее всплывало. Поищи.
Цитата(Memphis @ Sep 18 2009, 14:28) *
-2- Скрипт, который создает монстров в определенной локации через небольшой промежуток времени пока живет определенный монстр или нпц (время можно установить).

Можно. Раньше не встречал, но по сути этот скрипт мало отличается от предыдущего.
Цитата(Memphis @ Sep 18 2009, 14:28) *
-3- Скрипт, который заставляет монстра кастовать заклинания не сразу, а через некоторое время. Можноли это привязать к жизням монстра? Например: 100% жизней - моб кастует слепоту, 75% жизней - монстр кастует оглушение и т. д.

нормально сделать сложно. Если просто вприсать так, как ты написал, монстр будет тупить и скорее всего эти действия будут конфликтовать с его АИ. А если по всем правилам писать АИ.. лучше не надо. По крайней мере на данном этапе. За тебя такое врядли кто будет писать - крайне большой объем работы.
Virake
Цитата(ShurikVch @ Sep 18 2009, 13:35) *
Всем привет!

Знатоки, помогите пожалуйста. Хотелось бы изменить действие заклинаний Magic Fang/Greater Magic Fang так, чтобы их мог применять на себя "превращённый" друид/Shifter. В NWN2 это вроде бы есть, а вот в первом - нет. Я пытался изменить скрипт, но для первого заклинания там только две коротких строчки, а второй скрипт явно - расширение первого.

Для начала переведи, что такое "Magic Fang/Greater Magic Fang".
ShurikVch
Цитата(Virake @ Sep 18 2009, 16:46) *
Для начала переведи, что такое "Magic Fang/Greater Magic Fang".

Волшебный клык и Великий(Большой) волшебный клык

Заклинание делает природное оружие, т. е. когти зубы кулаки и т. д. магическим.
"Превращенный" герой ведь не может использовать инвентарь, но это заклинание позволит его хоть как-то усилить.
Ilerien
Насколько я знаю, в нвне колдовать в полиморфе нельзя.
ShurikVch
Цитата(Ilerien @ Sep 18 2009, 21:45) *
Насколько я знаю, в нвне колдовать в полиморфе нельзя.


Можно зелья пить
Ilerien
Функция DoMagicFang(), библиотека x0_i0_spells. После
Neverwinter Script
object oTarget = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION);
написать
Neverwinter Script
if(GetBaseItemType(GetSpellCastItem()) == BASE_ITEM_POTION)
    oTarget = OBJECT_SELF;
После этого перекомпилировать скрипты этих заклинаний.
Только, вполне возможно, что их нельзя юзать с зелий.
Memphis
Цитата(Lex @ Sep 18 2009, 14:59) *
ShurikVch, думаю там различие не столько в скрипте, сколько в 2да (разрешение кастовать на разные объекты и в разных состояниях зашито вроде бы там).


Можно. и вроде бы где-то на форуме пару раз что-то очень похожее всплывало. Поищи.

Можно. Раньше не встречал, но по сути этот скрипт мало отличается от предыдущего.

нормально сделать сложно. Если просто вприсать так, как ты написал, монстр будет тупить и скорее всего эти действия будут конфликтовать с его АИ. А если по всем правилам писать АИ.. лучше не надо. По крайней мере на данном этапе. За тебя такое врядли кто будет писать - крайне большой объем работы.


спс за ответ!

если не сложно, покажите сам скрипт. просто сам я не умею писать скрипты, а просто копирую их и пытаюсь делать по примеру, но сам мод очень хочется написать, реально мысть глобальная )))

заранее спс за понимание

Автор:::::::::::::::::Milez:::::::::::::::::::::::
:::::::
Jun 29 2003
Еще один спавн. Фишка в том, что респавн существ основан на вероятностом законе, а не на времени, через которое спавн должен происходить. Может кому пригодиться.
Основной скрипт на Heartbeat плейсабла, играющего роль спавна:Neverwinter Script Source
void main()
{
object oSelf=OBJECT_SELF;
object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,P
LAYER_CHAR_IS_PC);
if (!GetIsObjectValid(oPC)) return;
float fActDist=IntToFloat(GetMaxHitPoints()); // расстоЯние, на к-ом должен поЯвитьсЯ игрок от спавна, чтобы тот заработал
if (GetDistanceBetween(oPC,oSelf)>fActDist) return;
int iSpawnDist=GetReflexSavingThrow(oSelf); // макс. расст-ие, на к-ом будут поЯвлЯться сущ-ва
int iSpawnChance=GetWillSavingThrow(oSelf); // вероЯтность поЯвлениЯ существа, %
int iMaxSpawn=GetFortitudeSavingThrow(oSelf); // макс. кол-во сущ-в, поддерживаемых спавном
int iSpawned=GetLocalInt(oSelf,"SpawnedCreatures");
object oMonster;
string sMonster;
float fSpawnAngle;
float fSpawnDist;
vector vSpawnPlace;
location lSpawnLoc;
if (iSpawned<iMaxSpawn) {
if (d100()<=iSpawnChance) {
iSpawned++;
fSpawnDist=IntToFloat(Random(iSpawnDist)+1);
fSpawnAngle=IntToFloat(Random(360));
vSpawnPlace=GetPosition(oSelf);
vSpawnPlace.x+=fSpawnDist*cos(fSpawnAngle);
vSpawnPlace.y+=fSpawnDist*sin(fSpawnAngle);
lSpawnLoc=Location(GetArea(oSelf),vSpawnPlace,IntT
oFloat(Random(360)));
// Здесь вставьте подобным образом список сущ-в, которые будут спавнитьсЯ
switch (Random(2)) {
case 0:
sMonster="nw_skeleton";
break;
case 1:
sMonster="nw_zombie01";
break;
}
oMonster=CreateObject(OBJECT_TYPE_CREATURE,sMonste
r,lSpawnLoc);
SetLocalObject(oMonster,"MySpawner",oSelf);
SetLocalObject(oSelf,"LastMonsterSpawned",oMonster);
}
}
SetLocalInt(oSelf,"SpawnedCreatures",iSpawned);
}



нашел )) только вопросы сразу возникают: с каким игровым объектом это связывать и можноли респаун поставить на время?
Lex
написано же, placeable. Те на любой объект в локации, который удален не будет и который эту локацию не покинет.
чтобы перевести скрипт с вероятности на время, нужно модифицировать эту строку:
Neverwinter Script
if (d100()<=iSpawnChance)

Чтобы проверять время, нужно хранить время последнего спавна и знать текущее время. Разницу сравнивать с периодом спавна. Все крайне просто.
Время лучше всего хранить и сравнивать в игровых минутах, сконвертировав в них текущий день и час. А возможно даже месяц.
Либо заменит время на запуски скрипта (он запускается 1 раз в 6 секунд, примерно.) и сравнивать количество запусков скрипта.
ShurikVch
Спасибо!

И ещё не подскажете, не знаю, по теме ли это, но...

Можно ли в игре воссоздать "Амулет мощных кулаков +N" из настолки? N - в смысле бонус, как например у кинжала +1, но для безоружной атаки.
Дело в том, что снижение повреждений у монстров делает их эффетивно неуязвимыми для атак немагическим оружием. Но как тут быть бедным монахам? scratch_one-s_head.gif Пара несчастных мэфитов заставляют их плакать, призванная суккуба практически непобедима. "Удар Ки" даётся на десятом уровне, но в коротких низкоуровневых модулях до него можно и не докачаться. Брать обычное оружие - существенно снижать боевую эффективность. Волшебная кама? Не всегда доступна, в продаже дорога или вообще отсутствует, и оглушающий кулак с нею не сделаешь. К тому же, может, герой прокачан именно на безоружный бой - фокусировка, крит. и прочее. Перчатки? "Жёлтая роза" не рулит против нежити и демонов. Что же, молиться, чтобы сгенерились "Перчатки Кулака Хин"?
За дельные советы заранее спасибо. thank_you.gif
Ilerien
Геморно, но возможно. В теории - скрипт на надевание амулета, который вешает на печатки атаку/урон, и на снятие, который это дело снимает, но там довольно много подводных камней.
Сделай перчатки +5 и дай чару smile.gif И будет тебе счастье.
ShurikVch
Цитата(Ilerien @ Oct 21 2009, 19:10) *
Сделай перчатки +5

Так ведь у перчаток такой бонус тоже не предусмотрен scratch_one-s_head.gif
Или, в мысле - "Перчатки Кулака Хин +5" unsure.gif
Ilerien
Attack Bonus +5 smile.gif
Lex
это не тоже самое, что бонус +5. Пробивать всякие кожи не будет.
Ilerien
Будет. По логике не должно, но будет.
virus_found
Цитата(Ilerien @ Oct 25 2009, 12:42) *
Будет. По логике не должно, но будет.

Верно.
Bear2312
Помогите,пожалуйста.Надо чтоб при юзании камня,он занимал еще один слот,независимо прибавился или нет,такой-же прибавился,но занял слот.


Neverwinter Script
//////////////////////////////////////////////////

#include "x2_inc_itemprop"

//////////////////////////////////////////////////
//:: Global Constants
//:: These constants can be set to your liking
//::
//:: NOTE:
//::      Do NOT set the constants higher than the
//::      maximum specified otherwise the system
//::      will fail to function correctly.
//////////////////////////////////////////////////

// Use this switch to decide if you want to allow a gem to
// be socketed even if one of the same type is already occupying
// a socket.
// Note: this obviously won't work with haste, keen etc.
// TRUE = Allow stacking  :    FALSE = No stacking
const int STACKABLE_GEMS = TRUE;

// If this switch is set TRUE then stackable gems will share a slot with
// another gem of the same type.
// If set FALSE then gems of the same type will take their own slot if one is available.
// However the gem will still be stacked in either case based on
// the STACKABLE_GEMS switch.
// Ignore this switch if STACKABLE_GEMS is set FALSE.
const int STACKABLE_GEMS_SHARE_SLOT = FALSE;

// Maximum Damage Bonus allowed on a weapon
// Use the dice roll damage DAMAGE_BONUS_* constants
// at the top of this script.
// Minimum allowed is DAMAGE_BONUS_1d4.
// Maximum allowed is DAMAGE_BONUS_2d12.
const int MAX_DAMAGE_BONUS = DAMAGE_BONUS_2d12;

// Maximum Massive Critical allowed on a weapon
// Use the dice roll damage DAMAGE_BONUS_* constants
// at the top of this script.
// Minimum allowed is DAMAGE_BONUS_1d4.
// Maximum allowed is DAMAGE_BONUS_2d12.
const int MAX_MASSIVE_CRITICALS = DAMAGE_BONUS_2d12;

// Maximum Attack Bonus allowed on a weapon
// Do NOT set this higher than 20
const int MAX_ATTACK_BONUS = 6;

// Maximum Enhancement Bonus allowed on a weapon
// Do NOT set this higher than 20
const int MAX_ENHANCEMENT_BONUS = 6;

// Maximum AC Bonus allowed on armour type items
// Do NOT set this higher than 20
const int MAX_AC_BONUS = 6;

// Maximum Damage Resistance allowed on armour type items
// The only values you can use for this to function
// correctly is: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50
const int MAX_DAMAGE_RESISTANCE = 5; // XX/-

// Maximum Regeneration Bonus allowed on armour type items
// Do NOT set this higher than 20
const int MAX_REGENERATION = 6;

// Maximum Ability Bonus allowed on armour type items
// Do NOT set this higher than 12
const int MAX_ABILITY_BONUS = 6;

// Maximum Vampiric allowed on a weapon
// Do NOT set this higher than 20
const int MAX_VAMP_REGEN_BONUS = 6;

// Maximum Saving Throw bonus allowed on armour items
// Do NOT set this higher than 20
const int MAX_SAVING_THROWS = 5;

// Maximum Skill bonus allowed on armour items
// Do NOT set this higher than 50
const int MAX_SKILL_BONUS = 32;

// Maximum Mighty bonus allowed on ranged items
// Do NOT set this higher than 10
const int MAX_MIGHTY = 3;

// Maximum Spell Resistance allowed on armour items
// Do NOT set this higher than 32
const int MAX_SPELL_RESISTANCE = 18;

// Debug mode switch.
const int DEBUG = FALSE;

////////////////////////////////////////////////////////////////////////////////
//:: Declared Functions
//:: Do NOT touch anything below!!!
////////////////////////////////////////////////////////////////////////////////

void SF_Debug(string sDebug);
struct ItemProperty SF_GetItemPropertyToAdd(object oTarget, int nIPType, int nIPSubType, int nIPValue);
int SF_GetNextSpellResistanceValue(int nValue);
int SF_GetIsDamageValid(object oTarget, int nIPType, int nIPSubType);
int SF_GetCurrentDamageValue(int nValue);
int SF_GetDamageValue(int nValue, int nNextValue = TRUE);
int SF_GetNextDamageResistValue(int nValue);
int SF_DamageBonusCostValue(int nCostTableValue);
int SF_DamageResistCostValue(int nCostTableValue);
int SF_GetNumSpellUses(int nValue);
string SF_GetDamageValueString(int nValue);
int SF_GetMatchingCostTableValue(itemproperty ipProp, int nCostTable);
int SF_GetMatchingItemProperty(object oItem, int nType, int nSubType = -1);
int SF_GetIsCorrectItemType(object oPC, object oItem, int nIPType);
int SF_GetMaxBonus(int nIPType);
int SF_GetHasSockets(object oPC, object oTarget);
int SF_GetIsSocketUpgradable(object oPC, object oTarget, int nOldValue);
void SF_DecrementSocket(object oPC, object oItem, object oTarget, int nOldValue);
void SF_SocketGemToItem(object oPC, object oTarget, object oActivated);

////////////////////////////////////////////////////////////////////////////////
//:: Main Functions
//:: Do NOT touch anything below!!!
////////////////////////////////////////////////////////////////////////////////

void SF_Debug(string sDebug) {

    PrintString(sDebug);
    SendMessageToPC(GetFirstPC(), sDebug);
}

struct ItemProperty {int Restriction; int Value; int OldValue; int Damage; itemproperty ItemProp; };
struct ItemProperty SF_GetItemPropertyToAdd(object oTarget, int nIPType, int nIPSubType, int nIPValue) {

    struct ItemProperty IP;
    int nBaseItem = GetBaseItemType(oTarget);

    switch (nIPType) {

        case ITEM_PROPERTY_ABILITY_BONUS: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyAbilityBonus(nIPSubType, IP.Value);
            break;
        }
        case ITEM_PROPERTY_AC_BONUS: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyACBonus(IP.Value);
            break;
        }
        case ITEM_PROPERTY_DAMAGE_BONUS: {

            if (IPGetIsRangedWeapon(oTarget)) { IP.Restriction = 9999; break; }
            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Damage = SF_GetDamageValue(IP.OldValue - 1);
            IP.Value = SF_GetDamageValue(nIPValue + IP.OldValue);
            IP.ItemProp = ItemPropertyDamageBonus(nIPSubType, IP.Value);
            break;
        }
        case ITEM_PROPERTY_DAMAGE_RESISTANCE: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = SF_GetNextDamageResistValue(nIPValue + IP.OldValue);
            IP.ItemProp = ItemPropertyDamageResistance(nIPSubType, IP.Value);
            break;
        }
        case ITEM_PROPERTY_ATTACK_BONUS: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyAttackBonus(IP.Value);
            break;
        }
        case ITEM_PROPERTY_ENHANCEMENT_BONUS: {

            if (IPGetIsRangedWeapon(oTarget) ||
                nBaseItem == BASE_ITEM_GLOVES ||
                nBaseItem == BASE_ITEM_MAGICSTAFF) { IP.Restriction = 9999; break; }
            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyEnhancementBonus(IP.Value);
            break;
        }
        case ITEM_PROPERTY_REGENERATION_VAMPIRIC: {

            if (nBaseItem == BASE_ITEM_GLOVES) { IP.Restriction = 9999; break; }
            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyVampiricRegeneration(IP.Value);
            break;
        }
        case ITEM_PROPERTY_HASTE: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyHaste();
            break;
        }
        case ITEM_PROPERTY_HOLY_AVENGER: {

            if (IPGetIsRangedWeapon(oTarget) ||
                nBaseItem == BASE_ITEM_GLOVES ||
                nBaseItem == BASE_ITEM_MAGICSTAFF)  { IP.Restriction = 9999; break; }
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            IP.ItemProp = ItemPropertyHolyAvenger();
            break;
        }
        case ITEM_PROPERTY_KEEN: {

            if (IPGetIsRangedWeapon(oTarget) ||
                nBaseItem == BASE_ITEM_GLOVES ||
                nBaseItem == BASE_ITEM_MAGICSTAFF)  { IP.Restriction = 9999; break; }
            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyKeen();
            break;
        }
        case ITEM_PROPERTY_MASSIVE_CRITICALS: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Damage = SF_GetDamageValue(IP.OldValue - 1);
            IP.Value = SF_GetDamageValue(nIPValue + IP.OldValue);
            IP.ItemProp = ItemPropertyMassiveCritical(IP.Value);
            break;
        }
        case ITEM_PROPERTY_REGENERATION: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyRegeneration(IP.Value);
            break;
        }
        case ITEM_PROPERTY_SAVING_THROW_BONUS: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyBonusSavingThrow(nIPSubType, IP.Value);
            break;
        }
        case ITEM_PROPERTY_SKILL_BONUS: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertySkillBonus(nIPSubType, IP.Value);
            break;
        }
        case ITEM_PROPERTY_SPELL_RESISTANCE: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = SF_GetNextSpellResistanceValue(nIPValue + IP.OldValue);
            IP.ItemProp =  ItemPropertyBonusSpellResistance(IP.Value);
            break;
        }
        case ITEM_PROPERTY_TRUE_SEEING: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyTrueSeeing();
            break;
        }
        case ITEM_PROPERTY_IMPROVED_EVASION: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyImprovedEvasion();
            break;
        }
        case ITEM_PROPERTY_BONUS_FEAT: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyBonusFeat(nIPSubType);
            break;
        }
        case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyFreeAction();
            break;
        }
        case ITEM_PROPERTY_CAST_SPELL: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyCastSpell(nIPSubType, SF_GetNumSpellUses(nIPValue));
            break;
        }
        case ITEM_PROPERTY_ONHITCASTSPELL: {

            if (!IPGetIsMeleeWeapon(oTarget) &&
                nBaseItem != BASE_ITEM_ARMOR &&
                nBaseItem != BASE_ITEM_GLOVES &&
                nBaseItem != BASE_ITEM_MAGICSTAFF) { IP.Restriction = 9999; break; }
            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyOnHitCastSpell(nIPSubType, nIPValue);
            break;
        }
        case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyBonusLevelSpell(nIPSubType, nIPValue);
            break;
        }
        case ITEM_PROPERTY_UNLIMITED_AMMUNITION: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyUnlimitedAmmo(nIPSubType);
            break;
        }
        case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, nIPSubType);
            if (IP.OldValue == -999) { IP.Restriction = 9998; break; }
            IP.ItemProp = ItemPropertyExtraRangeDamageType(nIPSubType);
            break;
        }
        case ITEM_PROPERTY_MIGHTY: {

            IP.OldValue = SF_GetMatchingItemProperty(oTarget, nIPType, -1);
            if (IP.OldValue < 0) { IP.OldValue = 0; }
            IP.Value = nIPValue + IP.OldValue;
            IP.ItemProp = ItemPropertyMaxRangeStrengthMod(IP.Value);
            break;
        }
    }

    return IP;
}

int SF_GetNextSpellResistanceValue(int nValue) {

    switch (nValue) {

        case -1:
        case 0:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_10; break; }
        case 10:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_12; break; }
        case 12:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_14; break; }
        case 14:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_16; break; }
        case 16:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_18; break; }
        case 18:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_20; break; }
        case 20:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_22; break; }
        case 22:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_24; break; }
        case 24:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_26; break; }
        case 26:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_28; break; }
        case 28:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_30; break; }
        case 30:    { nValue = IP_CONST_SPELLRESISTANCEBONUS_32; break; }
        case 32:    { nValue =  99; break; }
        default:    { nValue = -99; break; }
    }

    return nValue;
}

int SF_GetDamageValue(int nValue, int nNextValue = TRUE) {

    if (nNextValue < 1) { nValue --; }

    switch (nValue) {

        case -1:
        case 0:    { nValue = DAMAGE_BONUS_1d4;  break; }
        case 21:    { nValue = DAMAGE_BONUS_1d6;  break; }
        case 22:    { nValue = DAMAGE_BONUS_1d8;  break; }
        case 23:    { nValue = DAMAGE_BONUS_1d10; break; }
        case 24:    { nValue = DAMAGE_BONUS_1d12; break; }
        case 25:    { nValue = DAMAGE_BONUS_2d4;  break; }
        case 26:    { nValue = DAMAGE_BONUS_2d6;  break; }
        case 27:    { nValue = DAMAGE_BONUS_2d8;  break; }
        case 28:    { nValue = DAMAGE_BONUS_2d10; break; }
        case 29:    { nValue = DAMAGE_BONUS_2d12; break; }
        case 30:    { nValue =  99; break; }
        default:    { nValue = -99; break; }
    }

    return nValue;
}

int SF_GetNextDamageResistValue(int nValue) {

    switch (nValue) {

        case -1:
        case 0:    { nValue = IP_CONST_DAMAGERESIST_5;  break; }
        case 5:    { nValue = IP_CONST_DAMAGERESIST_10; break; }
        case 10:    { nValue = IP_CONST_DAMAGERESIST_15; break; }
        case 15:    { nValue = IP_CONST_DAMAGERESIST_20; break; }
        case 20:    { nValue = IP_CONST_DAMAGERESIST_25; break; }
        case 25:    { nValue = IP_CONST_DAMAGERESIST_30; break; }
        case 30:    { nValue = IP_CONST_DAMAGERESIST_35; break; }
        case 35:    { nValue = IP_CONST_DAMAGERESIST_40; break; }
        case 40:    { nValue = IP_CONST_DAMAGERESIST_45; break; }
        case 45:    { nValue = IP_CONST_DAMAGERESIST_50; break; }
        case 50:    { nValue =  99; break; }
        default:    { nValue = -99; break; }
    }

    return nValue;
}

int SF_DamageBonusCostValue(int nCostTableValue)
{

    switch(nCostTableValue)
    {
        case 1:    { nCostTableValue = 1break; }
        case 2:    { nCostTableValue = 2break; }
        case 3:    { nCostTableValue = 3break; }
        case 4:    { nCostTableValue = 4break; }
        case 5:    { nCostTableValue = 5break; }
        case 6:    { nCostTableValue = 21; break; }// 1d4
        case 7:    { nCostTableValue = 22; break; }// 1d6
        case 8:    { nCostTableValue = 23; break; }// 1d8
        case 9:    { nCostTableValue = 24; break; }// 1d10
        case 10:    { nCostTableValue = 27; break; }// 2d6
        case 11:    { nCostTableValue = 28; break; }// 2d8
        case 12:    { nCostTableValue = 26; break; }// 2d4
        case 13:    { nCostTableValue = 29; break; }// 2d10
        case 14:    { nCostTableValue = 25; break; }// 1d12
        case 15:    { nCostTableValue = 30; break; }// 2d12
        case 16:    { nCostTableValue = 6break; }
        case 17:    { nCostTableValue = 7break; }
        case 18:    { nCostTableValue = 8break; }
        case 19:    { nCostTableValue = 9break; }
        case 20:    { nCostTableValue = 10; break; }
        case 21:    { nCostTableValue = 11; break; }
        case 22:    { nCostTableValue = 12; break; }
        case 23:    { nCostTableValue = 13; break; }
        case 24:    { nCostTableValue = 14; break; }
        case 25:    { nCostTableValue = 15; break; }
        case 26:    { nCostTableValue = 16; break; }
        case 27:    { nCostTableValue = 17; break; }
        case 28:    { nCostTableValue = 18; break; }
        case 29:    { nCostTableValue = 19; break; }
        case 30:    { nCostTableValue = 20; break; }
        default:    { nCostTableValue = -1; break; }
    }
    return nCostTableValue;
}

int SF_DamageResistCostValue(int nCostTableValue)  {

    switch(nCostTableValue)
    {
        case 1:    { nCostTableValue = 5break; }
        case 2:    { nCostTableValue = 10; break; }
        case 3:    { nCostTableValue = 15; break; }
        case 4:    { nCostTableValue = 20; break; }
        case 5:    { nCostTableValue = 25; break; }
        case 6:    { nCostTableValue = 30; break; }
        case 7:    { nCostTableValue = 35; break; }
        case 8:    { nCostTableValue = 40; break; }
        case 9:    { nCostTableValue = 45; break; }
        case 10:    { nCostTableValue = 50; break; }
        default:    { nCostTableValue = -1; break; }
    }

    return nCostTableValue;
}

int SF_SpellResistCostValue(int nCostTableValue) {

    switch (nCostTableValue) {

        case 0:    { nCostTableValue = 10; break; }
        case 1:    { nCostTableValue = 12; break; }
        case 2:    { nCostTableValue = 14; break; }
        case 3:    { nCostTableValue = 16; break; }
        case 4:    { nCostTableValue = 18; break; }
        case 5:    { nCostTableValue = 20; break; }
        case 6:    { nCostTableValue = 22; break; }
        case 7:    { nCostTableValue = 24; break; }
        case 8:    { nCostTableValue = 26; break; }
        case 9:    { nCostTableValue = 28; break; }
        case 10:    { nCostTableValue = 30; break; }
        case 11:    { nCostTableValue = 32; break; }
        default:    { nCostTableValue = -1; break; }
    }

    return nCostTableValue;
}

int SF_GetNumSpellUses(int nValue) {

    switch (nValue) {

        case 1:    { nValue = IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY;  break; }
        case 2:    { nValue = IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY; break; }
        case 3:    { nValue = IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY; break; }
        case 4:    { nValue = IP_CONST_CASTSPELL_NUMUSES_4_USES_PER_DAY; break; }
        case 5:    { nValue = IP_CONST_CASTSPELL_NUMUSES_5_USES_PER_DAY; break; }
        case 6:    { nValue = IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE;  break; }
        default:    { nValue = -1break; }
    }

    return nValue;
}

string SF_GetDamageValueString(int nValue) {

    string sValue = "";

    switch (nValue) {

        case DAMAGE_BONUS_1d4:  { sValue = "1d4"break; }
        case DAMAGE_BONUS_1d6:  { sValue = "1d6"break; }
        case DAMAGE_BONUS_1d8:  { sValue = "1d8"break; }
        case DAMAGE_BONUS_1d10: { sValue = "1d10"break; }
        case DAMAGE_BONUS_1d12: { sValue = "1d12"break; }
        case DAMAGE_BONUS_2d4:  { sValue = "2d4"break; }
        case DAMAGE_BONUS_2d6:  { sValue = "2d6"break; }
        case DAMAGE_BONUS_2d8:  { sValue = "2d8"break; }
        case DAMAGE_BONUS_2d10: { sValue = "2d10"break; }
        case DAMAGE_BONUS_2d12: { sValue = "2d12"break; }
    }

    return sValue;
}

int SF_GetIsItemActivatedValid(object oTarget) {

    int nBaseType = GetBaseItemType(oTarget);

    switch (nBaseType) {

        case BASE_ITEM_AMULET:
        case BASE_ITEM_ARMOR:
        case BASE_ITEM_BASTARDSWORD:
        case BASE_ITEM_BATTLEAXE:
        case BASE_ITEM_BELT:
        case BASE_ITEM_BOOTS:
        case BASE_ITEM_BRACER:
        case BASE_ITEM_CLOAK:
        case BASE_ITEM_CLUB:
        case BASE_ITEM_DAGGER:
        case BASE_ITEM_DIREMACE:
        case BASE_ITEM_DOUBLEAXE:
        case BASE_ITEM_DWARVENWARAXE:
        case BASE_ITEM_GLOVES:
        case BASE_ITEM_GREATAXE:
        case BASE_ITEM_GREATSWORD:
        case BASE_ITEM_HALBERD:
        case BASE_ITEM_HANDAXE:
        case BASE_ITEM_HEAVYCROSSBOW:
        case BASE_ITEM_HEAVYFLAIL:
        case BASE_ITEM_HELMET:
        case BASE_ITEM_KAMA:
        case BASE_ITEM_KATANA:
        case BASE_ITEM_KUKRI:
        case BASE_ITEM_LARGESHIELD:
        case BASE_ITEM_LIGHTCROSSBOW:
        case BASE_ITEM_LIGHTFLAIL:
        case BASE_ITEM_LIGHTHAMMER:
        case BASE_ITEM_LIGHTMACE:
        case BASE_ITEM_LONGBOW:
        case BASE_ITEM_LONGSWORD:
        case BASE_ITEM_MAGICSTAFF:
        case BASE_ITEM_MORNINGSTAR:
        case BASE_ITEM_QUARTERSTAFF:
        case BASE_ITEM_RAPIER:
        case BASE_ITEM_RING:
        case BASE_ITEM_SCIMITAR:
        case BASE_ITEM_SCYTHE:
        case BASE_ITEM_SHORTBOW:
        case BASE_ITEM_SHORTSPEAR:
        case BASE_ITEM_SHORTSWORD:
        case BASE_ITEM_SICKLE:
        case BASE_ITEM_SLING:
        case BASE_ITEM_SMALLSHIELD:
        case BASE_ITEM_TOWERSHIELD:
        case BASE_ITEM_TRIDENT:
        case BASE_ITEM_TWOBLADEDSWORD:
        case BASE_ITEM_WARHAMMER:
        case BASE_ITEM_WHIP: {

            nBaseType = TRUE;
            break;
        }
        default: nBaseType = FALSE;
    }

    return nBaseType;
}

int SF_GetMatchingCostTableValue(itemproperty ipProp, int nCostTable) {

    int nCostTableValue = GetItemPropertyCostTableValue(ipProp);

    switch(nCostTable) {

        /* IPRP_BONUSCOST */
        /* IPRP_MELEECOST */
        /* IPRP_SKILLCOST */
        case 1case 2: case 25:{ nCostTable = nCostTableValue; break; }

        /* IPRP_DAMAGECOST */
        case 4: { nCostTable = SF_DamageBonusCostValue(nCostTableValue); break; }

        /* IPRP_RESISTCOST */
        case 7: { nCostTable = SF_DamageResistCostValue(nCostTableValue); break; }

        /* IPRP_SRCOST */
        case 11: { nCostTable = SF_SpellResistCostValue(nCostTableValue); break; }

        /* DEFAULT COST */
        default: { nCostTable = -999; break; }
    }

    return nCostTable;
}
int SF_GetMatchingItemProperty(object oItem, int nType, int nSubType = -1) {

    itemproperty ipProp = GetFirstItemProperty(oItem);
    int nMatchType; int nMatchSubType;

    // Bug fix - Saving Throws weirdness
    if (nType == 40) { nType = 41; }

    if (DEBUG) {

        SF_Debug("IP Type To Find = " + IntToString(nType));
        SF_Debug("IP Subtype To Find = " + IntToString(nSubType));
    }


    while (GetIsItemPropertyValid(ipProp)) {

        nMatchType = GetItemPropertyType(ipProp);
        nMatchSubType = GetItemPropertySubType(ipProp);

        if (DEBUG) {

            SF_Debug("IP Loop: ");
            SF_Debug("IP Type To Found = " + IntToString(nMatchType));
            SF_Debug("IP Subtype To Found = " + IntToString(nMatchSubType));
        }

        if ((nMatchType == nType && nMatchSubType == nSubType) ||
            nMatchType == nType && nMatchSubType == 65535) {

            nMatchType = SF_GetMatchingCostTableValue(ipProp, GetItemPropertyCostTable(ipProp));

            if (DEBUG) {

                SF_Debug("Matching IP Found!!!");
                SF_Debug("IP Cost Table = " + IntToString(nMatchType));
            }

            return nMatchType;
        }

        ipProp = GetNextItemProperty(oItem);
    }

    return -1;
}

int SF_GetIsCorrectItemType(object oPC, object oTarget, int nIPType) {

    int nBaseItem = GetBaseItemType(oTarget);

    switch(nIPType) {

        case ITEM_PROPERTY_MIGHTY:
        case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE:
        case ITEM_PROPERTY_UNLIMITED_AMMUNITION: {

            if (IPGetIsRangedWeapon(oTarget)) { nBaseItem = TRUE; }

            break;
        }
        case ITEM_PROPERTY_MASSIVE_CRITICALS:
        case ITEM_PROPERTY_ATTACK_BONUS:
        case ITEM_PROPERTY_DAMAGE_BONUS:
        case ITEM_PROPERTY_ENHANCEMENT_BONUS:
        case ITEM_PROPERTY_KEEN:
        case ITEM_PROPERTY_HOLY_AVENGER:
        case ITEM_PROPERTY_ONHITCASTSPELL:
        case ITEM_PROPERTY_REGENERATION_VAMPIRIC: {

            if (IPGetIsMeleeWeapon(oTarget) ||
                nBaseItem == BASE_ITEM_GLOVES ||
                nBaseItem == BASE_ITEM_MAGICSTAFF) { nBaseItem = TRUE; }

            break;
        }
        case ITEM_PROPERTY_ABILITY_BONUS:
        case ITEM_PROPERTY_AC_BONUS:
        case ITEM_PROPERTY_BONUS_FEAT:
        case ITEM_PROPERTY_CAST_SPELL:
        case ITEM_PROPERTY_DAMAGE_REDUCTION:
        case ITEM_PROPERTY_DAMAGE_RESISTANCE:
        case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
        case ITEM_PROPERTY_HASTE:
        case ITEM_PROPERTY_IMPROVED_EVASION:
        case ITEM_PROPERTY_REGENERATION:
        case ITEM_PROPERTY_SAVING_THROW_BONUS:
        case ITEM_PROPERTY_SKILL_BONUS:
        case ITEM_PROPERTY_SPELL_RESISTANCE:
        case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
        case ITEM_PROPERTY_TRUE_SEEING:  {

            if (IPGetIsRangedWeapon(oTarget))  { nBaseItem = TRUE; break; }

            switch (nBaseItem) {

                case BASE_ITEM_AMULET:
                case BASE_ITEM_GLOVES:
                case BASE_ITEM_MAGICSTAFF:
                case BASE_ITEM_ARMOR:
                case BASE_ITEM_BELT:
                case BASE_ITEM_BOOTS:
                case BASE_ITEM_BRACER:
                case BASE_ITEM_CLOAK:
                case BASE_ITEM_HELMET:
                case BASE_ITEM_SMALLSHIELD:
                case BASE_ITEM_TOWERSHIELD:
                case BASE_ITEM_LARGESHIELD:
                case BASE_ITEM_RING: { nBaseItem = TRUE; }
            }
            break;
        }
        default: { nBaseItem = FALSE; break; }
    }

    if (!nBaseItem) {

        FloatingTextStringOnCreature("This type of gem can not be socketed into this type of item.", oPC);
    }

    return nBaseItem;
}

int SF_GetMaxBonus(int nIPType) {

    int nMaxBonus;

    switch (nIPType) {

        // Weapon Bonuses
        case ITEM_PROPERTY_ATTACK_BONUS:            { nMaxBonus = MAX_ATTACK_BONUS; break; }
        case ITEM_PROPERTY_DAMAGE_BONUS:            { nMaxBonus = MAX_DAMAGE_BONUS; break; }
        case ITEM_PROPERTY_ENHANCEMENT_BONUS:      { nMaxBonus = MAX_ENHANCEMENT_BONUS; break; }
        case ITEM_PROPERTY_MASSIVE_CRITICALS:      { nMaxBonus = MAX_MASSIVE_CRITICALS; break; }
        case ITEM_PROPERTY_REGENERATION_VAMPIRIC:  { nMaxBonus = MAX_VAMP_REGEN_BONUS; break; }
        case ITEM_PROPERTY_MIGHTY:                  { nMaxBonus = MAX_MIGHTY; break; }

        // Armour Bonuses
        case ITEM_PROPERTY_ABILITY_BONUS:          { nMaxBonus = MAX_ABILITY_BONUS; break; }
        case ITEM_PROPERTY_AC_BONUS:                { nMaxBonus = MAX_AC_BONUS; break; }
        case ITEM_PROPERTY_DAMAGE_RESISTANCE:      { nMaxBonus = MAX_DAMAGE_RESISTANCE; break; }
        case ITEM_PROPERTY_REGENERATION:            { nMaxBonus = MAX_REGENERATION; break; }
        case ITEM_PROPERTY_SAVING_THROW_BONUS:      { nMaxBonus = MAX_SAVING_THROWS; break; }
        case ITEM_PROPERTY_SKILL_BONUS:            { nMaxBonus = MAX_SKILL_BONUS; break; }
        case ITEM_PROPERTY_SPELL_RESISTANCE:        { nMaxBonus = MAX_SPELL_RESISTANCE; break; }

        default: nMaxBonus = 0;
  }

    return nMaxBonus;
}

int SF_GetHasSockets(object oPC, object oTarget) {

    int nSockets = GetLocalInt(oTarget, "SOCKET_SLOTS");

    FloatingTextStringOnCreature(IntToString(nSockets) + " socket(s) left", oPC);

    return TRUE;
}

void SF_DecrementSocket(object oPC, object oItem, object oTarget, int nOldValue)
{
    int nSockets = GetLocalInt(oTarget, "SOCKET_SLOTS");

    if ((!STACKABLE_GEMS_SHARE_SLOT && STACKABLE_GEMS && nOldValue > 0) || (nOldValue <= 0))
    {
        if (nSockets > 0) { nSockets --; SetLocalInt(oTarget, "SOCKET_SLOTS", nSockets); }
    }

    AssignCommand(oPC, ClearAllActions());
    AssignCommand(oPC, ActionUnequipItem(oTarget));
    DestroyObject(oItem);
    SF_GetHasSockets(oPC, oTarget);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_LOS_HOLY_30), oPC);
}

int SF_GetIsSocketUpgradable(object oPC, object oTarget, int nOldValue)
{
    int nSockets = GetLocalInt(oTarget, "SOCKET_SLOTS");

    if (!STACKABLE_GEMS && nOldValue  && nSockets) {

        FloatingTextStringOnCreature("You can not socket another gem of this type.", oPC);
        return FALSE;
    }
    if (!nSockets && !nOldValue) {

        FloatingTextStringOnCreature("No more sockets left", oPC);
        return FALSE;
    }

    return TRUE;
}

void SF_SocketGemToItem(object oPC, object oTarget, object oGem) {

    int nIPType    = GetLocalInt(oGem, "IP_TYPE");
    int nIPSubType  = GetLocalInt(oGem, "IP_SUBTYPE");
    int nIPValue    = GetLocalInt(oGem, "IP_VALUE");

    struct ItemProperty IP = SF_GetItemPropertyToAdd(oTarget, nIPType, nIPSubType, nIPValue);

    if (!SF_GetIsCorrectItemType(oPC, oTarget, nIPType)) { return; }

    // Restrictions (Keen.. etc obviously won't work for gloves or staffs and so on)
    if (IP.Restriction == 9999) {

        FloatingTextStringOnCreature("This type of gem can not be socketed into this type of item.", oPC);
        return;
    }

    // Item Properties i.e. haste, imp evasion, true seeing... etc should not work if already present
    if (IP.Restriction == 9998) {

        FloatingTextStringOnCreature("Gems of this type do not stack.", oPC);
        return;
    }

    if (!SF_GetIsSocketUpgradable(oPC, oTarget, IP.OldValue)) { return; }

    int nMaxBonus = SF_GetMaxBonus(nIPType);

    if (DEBUG) {

        SF_Debug("Max Allowed Bonus: " + IntToString(nMaxBonus));
    }

    switch (nIPType) {

        case ITEM_PROPERTY_MASSIVE_CRITICALS:
        case ITEM_PROPERTY_DAMAGE_BONUS: {

            if (IP.Damage == nMaxBonus) {

                FloatingTextStringOnCreature("Maximum bonus allowed for this gem type is " + SF_GetDamageValueString(MAX_DAMAGE_BONUS) + ".", oPC);
                return;
            }
            break;
        }

        case ITEM_PROPERTY_DAMAGE_RESISTANCE: {

            if (IP.OldValue + 5 > nMaxBonus) {

                FloatingTextStringOnCreature("Maximum bonus allowed for this gem type is " + IntToString(nMaxBonus) + " /-.", oPC);
                return;
            }
            break;
        }

        default: {

            if (IP.Value > nMaxBonus) {

                FloatingTextStringOnCreature("Maximum bonus allowed for this gem type is " + IntToString(nMaxBonus) + ".", oPC);
                return;
            }
            break;
        }
    }

    IPSafeAddItemProperty(oTarget, IP.ItemProp);
    SF_DecrementSocket(oPC, oGem, oTarget, IP.OldValue);
}
greye
Цитата(Bear2312 @ Dec 2 2009, 08:00) *
Neverwinter Script
// Use this switch to decide if you want to allow a gem to
// be socketed even if one of the same type is already occupying
// a socket.
// Note: this obviously won't work with haste, keen etc.
// TRUE = Allow stacking : FALSE = No stacking
const int STACKABLE_GEMS = TRUE;


Не читал всё, но сразу бросатся в глаза этот фрагмент. Скорее всего если поставить FALSE, то всё будет.
Bear2312
Ставил,непроходит.Или я может что не то делал.Там надо строить модуль каждый раз после правки скрипта,просто компиляция непроходит.
Aiwan
Если компиляция не проходит, значит скрипт не рабочий.
Bear2312
Поставлю вопрос немного иначе.Как сделать чтобы камни с одинаковым тэгом не добавлялись,и если добавляется допустим другой но такого-же типа(+1 энчант на +5 энчант), то эфекты не складывались а заменялось лучшее на худшее?И опять-же надо чтобы при добавлении он ложился в отдельный слот,а не поверх старого.
greye
Т.е. ты хочешь, чтобы получилось примерно так - есть 3 слота, 2 из них заняты одним и тем же типом камня, но работает только самый сильный, а добавить можно только ещё более сильный камень(того же типа, имеется ввиду), причём, он тоже займёт отдельный слот?
Если да, то в функции SF_GetItemPropertyToAdd() стоит заменить строчки типа
Neverwinter Script
IP.Value = IP.OldValue+nIPValue;

на
Neverwinter Script
if (nIPValue <= IP.OldValue)
{
    IP.Restriction = 9990; //Или другое какое-нибудь число.
    break;
}
IP.Value = nIPValue;

Там же надо будет все присваивания типа
Neverwinter Script
IP.Value = <function_name>(nIPValue + IP.OldValue);

заменить на
Neverwinter Script
if (nIPValue <= IP.OldValue)
{
    IP.Restriction = 9990;// То же самое какое-нибудь число.
    break;
}
IP.Value = <function_name>(nIPValue);

А в функции SF_SocketGemToItem() добавить после
Neverwinter Script
if (IP.Restriction == 9998) {

        FloatingTextStringOnCreature("Gems of this type do not stack.", oPC);
        return;
    }

Neverwinter Script
if (IP.Restriction == 9990)//То самое какое-нибудь число.
{
    FloatingTextStringOnCreature("Описание проблемы", oPC);
    return;
}

И всё это сопровождается значением
Neverwinter Script
const int STACKABLE_GEMS_SHARE_SLOT = FALSE;


Лучше сначала скопируй старую функцию, переименуй, сделай в копии изменения и пользуйся ей, если устраивает.
P.S. Ошибок никто не видит?
Azzerrotter
У меня есть несколько вопросов относительно скриптов сам редактор я знаю оч хорошо а вот в скриптах нуб подскижите мне пару скриптов для:
1) Как сделать чтоб люди вокруг говорили когда ты проходиш мимо или кто нибудь рубил дрова стрелял из лука бил тренеровочное чучело?
2) Как сделать чтобы как только ты оказался на определенном участке земли к тебе подошел нпс и начал первым диалог которы нельзя прервать?
3) Как сделать чтобы после твоего диалога с нпс он ушел бы из данной локи в какую нибудь другую локу?
4) И еще если можно опишите мне как сделать компаньена чтобы он следовал за тобой или вернулся назад в место его найма? blush.gif

Приведите скрипты и куда их надо втавлять описывать необязательно

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

Заранее благодарю thank_you.gif
Bear2312
Спасибо.)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.