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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
147 страниц V  « < 126 127 128 129 130 > »   
Ответить в эту темуОткрыть новую тему
> Скрипты, Все вопросы и ответы по скриптам
Memphis
сообщение Sep 18 2009, 14:28
Сообщение #3176


Level 1


Класс: Паладин
Характер: Lawful Good
Раса: Человек



Доброго времени суток всем! Перейду сразу к делу:
Мне нужно написать несколько скриптов, которыеми я хотел бы обогатить свой мод.

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

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


При создании мода, я обязательно укажу автора скрипта!
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ShurikVch
сообщение Sep 18 2009, 14:35
Сообщение #3177


Level 1


Класс: Волшебник
Характер: Chaotic Neutral
Раса: Человек



Всем привет!

Знатоки, помогите пожалуйста. Хотелось бы изменить действие заклинаний Magic Fang/Greater Magic Fang так, чтобы их мог применять на себя "превращённый" друид/Shifter. В NWN2 это вроде бы есть, а вот в первом - нет. Я пытался изменить скрипт, но для первого заклинания там только две коротких строчки, а второй скрипт явно - расширение первого.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Sep 18 2009, 14:59
Сообщение #3178


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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
сообщение Sep 18 2009, 15:46
Сообщение #3179


Level 5
**

Класс: Некромант
Характер: Chaotic Evil
Раса: Человек



Цитата(ShurikVch @ Sep 18 2009, 13:35) *
Всем привет!

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

Для начала переведи, что такое "Magic Fang/Greater Magic Fang".
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ShurikVch
сообщение Sep 18 2009, 16:43
Сообщение #3180


Level 1


Класс: Волшебник
Характер: Chaotic Neutral
Раса: Человек



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

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

Заклинание делает природное оружие, т. е. когти зубы кулаки и т. д. магическим.
"Превращенный" герой ведь не может использовать инвентарь, но это заклинание позволит его хоть как-то усилить.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Sep 18 2009, 20:45
Сообщение #3181


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Насколько я знаю, в нвне колдовать в полиморфе нельзя.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ShurikVch
сообщение Sep 19 2009, 20:04
Сообщение #3182


Level 1


Класс: Волшебник
Характер: Chaotic Neutral
Раса: Человек



Цитата(Ilerien @ Sep 18 2009, 21:45) *
Насколько я знаю, в нвне колдовать в полиморфе нельзя.


Можно зелья пить
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Sep 20 2009, 01:22
Сообщение #3183


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Функция DoMagicFang(), библиотека x0_i0_spells. После
Neverwinter Script
object oTarget = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION);
написать
Neverwinter Script
if(GetBaseItemType(GetSpellCastItem()) == BASE_ITEM_POTION)
    oTarget = OBJECT_SELF;
После этого перекомпилировать скрипты этих заклинаний.
Только, вполне возможно, что их нельзя юзать с зелий.

Сообщение отредактировал Ilerien - Sep 20 2009, 16:05
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Memphis
сообщение Sep 21 2009, 22:20
Сообщение #3184


Level 1


Класс: Паладин
Характер: Lawful Good
Раса: Человек



Цитата(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
сообщение Sep 27 2009, 02:28
Сообщение #3185


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



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

Чтобы проверять время, нужно хранить время последнего спавна и знать текущее время. Разницу сравнивать с периодом спавна. Все крайне просто.
Время лучше всего хранить и сравнивать в игровых минутах, сконвертировав в них текущий день и час. А возможно даже месяц.
Либо заменит время на запуски скрипта (он запускается 1 раз в 6 секунд, примерно.) и сравнивать количество запусков скрипта.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ShurikVch
сообщение Oct 21 2009, 10:47
Сообщение #3186


Level 1


Класс: Волшебник
Характер: Chaotic Neutral
Раса: Человек



Спасибо!

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

Можно ли в игре воссоздать "Амулет мощных кулаков +N" из настолки? N - в смысле бонус, как например у кинжала +1, но для безоружной атаки.
Дело в том, что снижение повреждений у монстров делает их эффетивно неуязвимыми для атак немагическим оружием. Но как тут быть бедным монахам? (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif) Пара несчастных мэфитов заставляют их плакать, призванная суккуба практически непобедима. "Удар Ки" даётся на десятом уровне, но в коротких низкоуровневых модулях до него можно и не докачаться. Брать обычное оружие - существенно снижать боевую эффективность. Волшебная кама? Не всегда доступна, в продаже дорога или вообще отсутствует, и оглушающий кулак с нею не сделаешь. К тому же, может, герой прокачан именно на безоружный бой - фокусировка, крит. и прочее. Перчатки? "Жёлтая роза" не рулит против нежити и демонов. Что же, молиться, чтобы сгенерились "Перчатки Кулака Хин"?
За дельные советы заранее спасибо. (IMG:style_emoticons/kolobok_light/thank_you.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Oct 21 2009, 18:10
Сообщение #3187


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Геморно, но возможно. В теории - скрипт на надевание амулета, который вешает на печатки атаку/урон, и на снятие, который это дело снимает, но там довольно много подводных камней.
Сделай перчатки +5 и дай чару (IMG:style_emoticons/kolobok_light/smile.gif) И будет тебе счастье.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
ShurikVch
сообщение Oct 22 2009, 11:43
Сообщение #3188


Level 1


Класс: Волшебник
Характер: Chaotic Neutral
Раса: Человек



Цитата(Ilerien @ Oct 21 2009, 19:10) *
Сделай перчатки +5

Так ведь у перчаток такой бонус тоже не предусмотрен (IMG:style_emoticons/kolobok_light/scratch_one-s_head.gif)
Или, в мысле - "Перчатки Кулака Хин +5" (IMG:style_emoticons/kolobok_light/unsure.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Oct 23 2009, 21:13
Сообщение #3189


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Attack Bonus +5 (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Oct 25 2009, 01:40
Сообщение #3190


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

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



это не тоже самое, что бонус +5. Пробивать всякие кожи не будет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilerien
сообщение Oct 25 2009, 12:42
Сообщение #3191


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

Класс: Волшебник
Характер: Lawful Evil
Раса: Эльф
NWN: Скриптинг [PW]
Gem of the North



Будет. По логике не должно, но будет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
virus_found
сообщение Oct 25 2009, 14:38
Сообщение #3192


Отверженный
****

Класс: Теневой Танцор
Характер: Neutral Good
Раса: Баатезу



Цитата(Ilerien @ Oct 25 2009, 12:42) *
Будет. По логике не должно, но будет.

Верно.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Bear2312
сообщение Dec 2 2009, 08:00
Сообщение #3193


Level 2
*

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



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


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);
}
Причины изменения: Используй тег NSS
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
greye
сообщение Dec 2 2009, 21:10
Сообщение #3194


Level 7
**

Класс: Некромант
Характер: True Neutral
Раса: Нежить



Цитата(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
сообщение Dec 3 2009, 02:16
Сообщение #3195


Level 2
*

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



Ставил,непроходит.Или я может что не то делал.Там надо строить модуль каждый раз после правки скрипта,просто компиляция непроходит.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Dec 3 2009, 08:18
Сообщение #3196


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

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



Если компиляция не проходит, значит скрипт не рабочий.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Bear2312
сообщение Dec 5 2009, 05:29
Сообщение #3197


Level 2
*

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



Поставлю вопрос немного иначе.Как сделать чтобы камни с одинаковым тэгом не добавлялись,и если добавляется допустим другой но такого-же типа(+1 энчант на +5 энчант), то эфекты не складывались а заменялось лучшее на худшее?И опять-же надо чтобы при добавлении он ложился в отдельный слот,а не поверх старого.

Сообщение отредактировал Bear2312 - Dec 5 2009, 05:34
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
greye
сообщение Dec 5 2009, 12:02
Сообщение #3198


Level 7
**

Класс: Некромант
Характер: True Neutral
Раса: Нежить



Т.е. ты хочешь, чтобы получилось примерно так - есть 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. Ошибок никто не видит?

Сообщение отредактировал greye - Dec 5 2009, 12:13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Azzerrotter
сообщение Dec 6 2009, 11:08
Сообщение #3199


Level 2
*

Класс: Воин
Характер: True Neutral
Раса: Эльф



У меня есть несколько вопросов относительно скриптов сам редактор я знаю оч хорошо а вот в скриптах нуб подскижите мне пару скриптов для:
1) Как сделать чтоб люди вокруг говорили когда ты проходиш мимо или кто нибудь рубил дрова стрелял из лука бил тренеровочное чучело?
2) Как сделать чтобы как только ты оказался на определенном участке земли к тебе подошел нпс и начал первым диалог которы нельзя прервать?
3) Как сделать чтобы после твоего диалога с нпс он ушел бы из данной локи в какую нибудь другую локу?
4) И еще если можно опишите мне как сделать компаньена чтобы он следовал за тобой или вернулся назад в место его найма? (IMG:style_emoticons/kolobok_light/blush.gif)

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

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

Заранее благодарю (IMG:style_emoticons/kolobok_light/thank_you.gif)

Сообщение отредактировал Aiwan - Dec 6 2009, 12:02
Причины изменения: Перенес сообщение в нужную тему.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Bear2312
сообщение Dec 7 2009, 04:43
Сообщение #3200


Level 2
*

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



Спасибо.)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

147 страниц V  « < 126 127 128 129 130 > » 
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 5th May 2024 - 15:55