#include "inc_loglevel" #include "x2_inc_itemprop" const int CUSTOM_SET_BONUS = 100000; //Space this value out so it wont conflict with future patches. //Consts for the translation of ITEM_PROPERTY_* const names into their value. So these can be defined by name in item prop variables instead of ints. const string SET_PROPERTY_TYPE_ABILITY_BONUS = "ITEM_PROPERTY_ABILITY_BONUS"; const string SET_PROPERTY_TYPE_AC_BONUS = "ITEM_PROPERTY_AC_BONUS"; const string SET_PROPERTY_TYPE_AC_BONUS_VS_ALIGNMENT_GROUP = "ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP"; const string SET_PROPERTY_TYPE_AC_BONUS_VS_DAMAGE_TYPE = "ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE"; const string SET_PROPERTY_TYPE_AC_BONUS_VS_RACIAL_GROUP = "ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP"; const string SET_PROPERTY_TYPE_AC_BONUS_VS_SPECIFIC_ALIGNMENT = "ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT"; const string SET_PROPERTY_TYPE_ADDITIONAL = "ITEM_PROPERTY_ADDITIONAL"; const string SET_PROPERTY_TYPE_ARCANE_SPELL_FAILURE = "ITEM_PROPERTY_ARCANE_SPELL_FAILURE"; const string SET_PROPERTY_TYPE_ATTACK_BONUS = "ITEM_PROPERTY_ATTACK_BONUS"; const string SET_PROPERTY_TYPE_ATTACK_BONUS_VS_ALIGNMENT_GROUP = "ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP"; const string SET_PROPERTY_TYPE_ATTACK_BONUS_VS_RACIAL_GROUP = "ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP"; const string SET_PROPERTY_TYPE_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT = "ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT"; const string SET_PROPERTY_TYPE_BASE_ITEM_WEIGHT_REDUCTION = "ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION"; const string SET_PROPERTY_TYPE_BONUS_FEAT = "ITEM_PROPERTY_BONUS_FEAT"; const string SET_PROPERTY_TYPE_BONUS_SPELL_SLOT_OF_LEVEL_N = "ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N"; const string SET_PROPERTY_TYPE_CAST_SPELL = "ITEM_PROPERTY_CAST_SPELL"; const string SET_PROPERTY_TYPE_DAMAGE_BONUS = "ITEM_PROPERTY_DAMAGE_BONUS"; const string SET_PROPERTY_TYPE_DAMAGE_BONUS_VS_ALIGNMENT_GROUP = "ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP"; const string SET_PROPERTY_TYPE_DAMAGE_BONUS_VS_RACIAL_GROUP = "ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP"; const string SET_PROPERTY_TYPE_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT = "ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT"; const string SET_PROPERTY_TYPE_DAMAGE_REDUCTION = "ITEM_PROPERTY_DAMAGE_REDUCTION"; const string SET_PROPERTY_TYPE_DAMAGE_RESISTANCE = "ITEM_PROPERTY_DAMAGE_RESISTANCE"; const string SET_PROPERTY_TYPE_DAMAGE_VULNERABILITY = "ITEM_PROPERTY_DAMAGE_VULNERABILITY"; const string SET_PROPERTY_TYPE_DARKVISION = "ITEM_PROPERTY_DARKVISION"; const string SET_PROPERTY_TYPE_DECREASED_ABILITY_SCORE = "ITEM_PROPERTY_DECREASED_ABILITY_SCORE"; const string SET_PROPERTY_TYPE_DECREASED_AC = "ITEM_PROPERTY_DECREASED_AC"; const string SET_PROPERTY_TYPE_DECREASED_ATTACK_MODIFIER = "ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER"; const string SET_PROPERTY_TYPE_DECREASED_DAMAGE = "ITEM_PROPERTY_DECREASED_DAMAGE"; const string SET_PROPERTY_TYPE_DECREASED_ENHANCEMENT_MODIFIER = "ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER"; const string SET_PROPERTY_TYPE_DECREASED_SAVING_THROWS = "ITEM_PROPERTY_DECREASED_SAVING_THROWS"; const string SET_PROPERTY_TYPE_DECREASED_SAVING_THROWS_SPECIFIC = "ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC"; const string SET_PROPERTY_TYPE_DECREASED_SKILL_MODIFIER = "ITEM_PROPERTY_DECREASED_SKILL_MODIFIER"; const string SET_PROPERTY_TYPE_ENHANCED_CONTAINER_REDUCED_WEIGHT = "ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT"; const string SET_PROPERTY_TYPE_ENHANCEMENT_BONUS = "ITEM_PROPERTY_ENHANCEMENT_BONUS"; const string SET_PROPERTY_TYPE_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP = "ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP"; const string SET_PROPERTY_TYPE_ENHANCEMENT_BONUS_VS_RACIAL_GROUP = "ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP"; const string SET_PROPERTY_TYPE_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT = "ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT"; const string SET_PROPERTY_TYPE_EXTRA_MELEE_DAMAGE_TYPE = "ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE"; const string SET_PROPERTY_TYPE_EXTRA_RANGED_DAMAGE_TYPE = "ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE"; const string SET_PROPERTY_TYPE_FREEDOM_OF_MOVEMENT = "ITEM_PROPERTY_FREEDOM_OF_MOVEMENT"; const string SET_PROPERTY_TYPE_HASTE = "ITEM_PROPERTY_HASTE"; const string SET_PROPERTY_TYPE_HEALERS_KIT = "ITEM_PROPERTY_HEALERS_KIT"; const string SET_PROPERTY_TYPE_HOLY_AVENGER = "ITEM_PROPERTY_HOLY_AVENGER"; const string SET_PROPERTY_TYPE_IMMUNITY_DAMAGE_TYPE = "ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE"; const string SET_PROPERTY_TYPE_IMMUNITY_MISCELLANEOUS = "ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS"; const string SET_PROPERTY_TYPE_IMMUNITY_SPECIFIC_SPELL = "ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL"; const string SET_PROPERTY_TYPE_IMMUNITY_SPELL_SCHOOL = "ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL"; const string SET_PROPERTY_TYPE_IMMUNITY_SPELLS_BY_LEVEL = "ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL"; const string SET_PROPERTY_TYPE_IMPROVED_EVASION = "ITEM_PROPERTY_IMPROVED_EVASION"; const string SET_PROPERTY_TYPE_KEEN = "ITEM_PROPERTY_KEEN"; const string SET_PROPERTY_TYPE_LIGHT = "ITEM_PROPERTY_LIGHT"; const string SET_PROPERTY_TYPE_MASSIVE_CRITICALS = "ITEM_PROPERTY_MASSIVE_CRITICALS"; const string SET_PROPERTY_TYPE_MATERIAL = "ITEM_PROPERTY_MATERIAL"; const string SET_PROPERTY_TYPE_MIGHTY = "ITEM_PROPERTY_MIGHTY"; const string SET_PROPERTY_TYPE_MIND_BLANK = "ITEM_PROPERTY_MIND_BLANK"; const string SET_PROPERTY_TYPE_MONSTER_DAMAGE = "ITEM_PROPERTY_MONSTER_DAMAGE"; const string SET_PROPERTY_TYPE_NO_DAMAGE = "ITEM_PROPERTY_NO_DAMAGE"; const string SET_PROPERTY_TYPE_ON_HIT_PROPERTIES = "ITEM_PROPERTY_ON_HIT_PROPERTIES"; const string SET_PROPERTY_TYPE_ON_MONSTER_HIT = "ITEM_PROPERTY_ON_MONSTER_HIT"; const string SET_PROPERTY_TYPE_ONHITCASTSPELL = "ITEM_PROPERTY_ONHITCASTSPELL"; const string SET_PROPERTY_TYPE_POISON = "ITEM_PROPERTY_POISON"; const string SET_PROPERTY_TYPE_QUALITY = "ITEM_PROPERTY_QUALITY"; const string SET_PROPERTY_TYPE_REGENERATION = "ITEM_PROPERTY_REGENERATION"; const string SET_PROPERTY_TYPE_REGENERATION_VAMPIRIC = "ITEM_PROPERTY_REGENERATION_VAMPIRIC"; const string SET_PROPERTY_TYPE_SAVING_THROW_BONUS = "ITEM_PROPERTY_SAVING_THROW_BONUS"; const string SET_PROPERTY_TYPE_SAVING_THROW_BONUS_SPECIFIC = "ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC"; const string SET_PROPERTY_TYPE_SKILL_BONUS = "ITEM_PROPERTY_SKILL_BONUS"; const string SET_PROPERTY_TYPE_SPECIAL_WALK = "ITEM_PROPERTY_SPECIAL_WALK"; const string SET_PROPERTY_TYPE_SPELL_RESISTANCE = "ITEM_PROPERTY_SPELL_RESISTANCE"; const string SET_PROPERTY_TYPE_THIEVES_TOOLS = "ITEM_PROPERTY_THIEVES_TOOLS"; const string SET_PROPERTY_TYPE_TRAP = "ITEM_PROPERTY_TRAP"; const string SET_PROPERTY_TYPE_TRUE_SEEING = "ITEM_PROPERTY_TRUE_SEEING"; const string SET_PROPERTY_TYPE_TURN_RESISTANCE = "ITEM_PROPERTY_TURN_RESISTANCE"; const string SET_PROPERTY_TYPE_UNLIMITED_AMMUNITION = "ITEM_PROPERTY_UNLIMITED_AMMUNITION"; const string SET_PROPERTY_TYPE_USE_LIMITATION_ALIGNMENT_GROUP = "ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP"; const string SET_PROPERTY_TYPE_USE_LIMITATION_CLASS = "ITEM_PROPERTY_USE_LIMITATION_CLASS"; const string SET_PROPERTY_TYPE_USE_LIMITATION_RACIAL_TYPE = "ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE"; const string SET_PROPERTY_TYPE_USE_LIMITATION_SPECIFIC_ALIGNMENT = "ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT"; const string SET_PROPERTY_TYPE_USE_LIMITATION_TILESET = "ITEM_PROPERTY_USE_LIMITATION_TILESET"; const string SET_PROPERTY_TYPE_VISUALEFFECT = "ITEM_PROPERTY_VISUALEFFECT"; const string SET_PROPERTY_TYPE_WEIGHT_INCREASE = "ITEM_PROPERTY_WEIGHT_INCREASE"; const string SET_PROPERTY_TYPE_CUSTOM = "CUSTOM_SET_BONUS"; // ItemSetTagTokenizer is used to loop over all the SET_TAG_# props on an item oItem. struct ItemSetTagTokenizer { object oItem; int iSetTagIndex; string sCurrentTag; }; // Struct to pass around all of a creatures equiped items between various functions. struct EquipedItems { object oArms; object oArrows; object oBelt; object oBolts; object oBoots; object oBullets; object oCarmour; object oChest; object oCloak; object oCweaponb; object oCweaponl; object oCweaponr; object oHead; object oLefthand; object oLeftring; object oNeck; object oRighthand; object oRightring; }; // Struct for the return value of the various functions that are used to translate special property strings like _CAST_LEVEL into their value at the correct argument position for the various ItemProperty* constructor functions. struct SetItemPropArguments { int iArgOne; int iArgTwo; int iArgThree; }; // Struct to define the upper and lower bounds of the ints that are passed to the various ItemProperty* constructors. Used for error reporting. struct SetItemPropArgLimits { int iArgOneMin; int iArgOneMax; int iArgTwoMin; int iArgTwoMax; int iArgThreeMin; int iArgThreeMax; int iNotSetArgOneMin; int iNotSetArgTwoMin; int iNotSetArgThreeMin; int iNotSetArgOneMax; int iNotSetArgTwoMax; int iNotSetArgThreeMax; }; int GetItemPropertyConstFromSetPropertyType(string sSetPropertyType); //Function to translate the value of _TYPE props to their int value. string SetItemTagVarName(int iTagNum = 0); //Takes an int iTagNum and creates a properly formated SET_TAG_# string. string GetItemSetTag(object oItem, int iIdx = 0); //Finds the SET_TAG_# value at iIdx struct ItemSetTagTokenizer GetNextSetTag(struct ItemSetTagTokenizer tknizr); //SetTag token looper GetNext function. struct ItemSetTagTokenizer GetFirstSetTag(object oItem); //SetTag token looper GetFirst function. struct EquipedItems GetEquipedItems(object oPC); //Returns all items equiped by oPC int TestItemBelongsToSet(object oItem, string sSetTag); //Returns TRUE if oItem has a SET_TAG_# whoes value equals sSetTag int GetSetTagId(object oItem, string sSetTag); //Gets the # part of the SET_TAG_# variable with value sSetTag int GetNumberOfSetItemsEquiped(struct EquipedItems equipedItems, string sSetTag); //Get the number of items in equipedItems that have at least one SET_TAG_# with value sSetTag //Various functions to get the speical properties from an items local variables so they can be used in the ItemProperties* constructor. struct SetItemPropArguments GetItemPropArgumentsOneArg( object oItem, string sSetBonusPrefix, struct SetItemPropArgLimits ArgLimits, string sSetBonusArgOneSuffix = "_VALUE" ); struct SetItemPropArguments GetItemPropArgumentsTwoArgs( object oItem, string sSetBonusPrefix, struct SetItemPropArgLimits ArgLimits, string sSetBonusArgOneSuffix, string sSetBonusArgTwoSuffix = "_VALUE" ); struct SetItemPropArguments GetItemPropArgumentsThreeArgs( object oItem, string sSetBonusPrefix, struct SetItemPropArgLimits ArgLimits, string sSetBonusArgOneSuffix, string sSetBonusArgTwoSuffix, string sSetBonusArgThreeSuffix = "_VALUE" ); int GetReplaceOrAddProp(object oItem, string sSetBonusPrefix); void RedoSetItemBonuses(object oItem, string sSetTag, int iSetItemsEquiped); //Redo the set bonus sSetTag on a single item oItem to the level iSetItemsEquiped void RedoEquipedSetItemsBonuses(struct EquipedItems equipedItems, string sSetTag, int iSetItemsCount); //Redo the set bounus sSetTag on all equiped items. int GetItemPropertyConstFromSetPropertyType(string sSetPropertyType) { if (SET_PROPERTY_TYPE_ABILITY_BONUS == sSetPropertyType) return ITEM_PROPERTY_ABILITY_BONUS; if (SET_PROPERTY_TYPE_AC_BONUS == sSetPropertyType) return ITEM_PROPERTY_AC_BONUS; if (SET_PROPERTY_TYPE_AC_BONUS_VS_ALIGNMENT_GROUP == sSetPropertyType) return ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP; if (SET_PROPERTY_TYPE_AC_BONUS_VS_DAMAGE_TYPE == sSetPropertyType) return ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE; if (SET_PROPERTY_TYPE_AC_BONUS_VS_RACIAL_GROUP == sSetPropertyType) return ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP; if (SET_PROPERTY_TYPE_AC_BONUS_VS_SPECIFIC_ALIGNMENT == sSetPropertyType) return ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT; if (SET_PROPERTY_TYPE_ADDITIONAL == sSetPropertyType) return ITEM_PROPERTY_ADDITIONAL; if (SET_PROPERTY_TYPE_ARCANE_SPELL_FAILURE == sSetPropertyType) return ITEM_PROPERTY_ARCANE_SPELL_FAILURE; if (SET_PROPERTY_TYPE_ATTACK_BONUS == sSetPropertyType) return ITEM_PROPERTY_ATTACK_BONUS; if (SET_PROPERTY_TYPE_ATTACK_BONUS_VS_ALIGNMENT_GROUP == sSetPropertyType) return ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP; if (SET_PROPERTY_TYPE_ATTACK_BONUS_VS_RACIAL_GROUP == sSetPropertyType) return ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP; if (SET_PROPERTY_TYPE_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT == sSetPropertyType) return ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT; if (SET_PROPERTY_TYPE_BASE_ITEM_WEIGHT_REDUCTION == sSetPropertyType) return ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION; if (SET_PROPERTY_TYPE_BONUS_FEAT == sSetPropertyType) return ITEM_PROPERTY_BONUS_FEAT; if (SET_PROPERTY_TYPE_BONUS_SPELL_SLOT_OF_LEVEL_N == sSetPropertyType) return ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N; if (SET_PROPERTY_TYPE_CAST_SPELL == sSetPropertyType) return ITEM_PROPERTY_CAST_SPELL; if (SET_PROPERTY_TYPE_DAMAGE_BONUS == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_BONUS; if (SET_PROPERTY_TYPE_DAMAGE_BONUS_VS_ALIGNMENT_GROUP == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP; if (SET_PROPERTY_TYPE_DAMAGE_BONUS_VS_RACIAL_GROUP == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP; if (SET_PROPERTY_TYPE_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT; if (SET_PROPERTY_TYPE_DAMAGE_REDUCTION == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_REDUCTION; if (SET_PROPERTY_TYPE_DAMAGE_RESISTANCE == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_RESISTANCE; if (SET_PROPERTY_TYPE_DAMAGE_VULNERABILITY == sSetPropertyType) return ITEM_PROPERTY_DAMAGE_VULNERABILITY; if (SET_PROPERTY_TYPE_DARKVISION == sSetPropertyType) return ITEM_PROPERTY_DARKVISION; if (SET_PROPERTY_TYPE_DECREASED_ABILITY_SCORE == sSetPropertyType) return ITEM_PROPERTY_DECREASED_ABILITY_SCORE; if (SET_PROPERTY_TYPE_DECREASED_AC == sSetPropertyType) return ITEM_PROPERTY_DECREASED_AC; if (SET_PROPERTY_TYPE_DECREASED_ATTACK_MODIFIER == sSetPropertyType) return ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER; if (SET_PROPERTY_TYPE_DECREASED_DAMAGE == sSetPropertyType) return ITEM_PROPERTY_DECREASED_DAMAGE; if (SET_PROPERTY_TYPE_DECREASED_ENHANCEMENT_MODIFIER == sSetPropertyType) return ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER; if (SET_PROPERTY_TYPE_DECREASED_SAVING_THROWS == sSetPropertyType) return ITEM_PROPERTY_DECREASED_SAVING_THROWS; if (SET_PROPERTY_TYPE_DECREASED_SAVING_THROWS_SPECIFIC == sSetPropertyType) return ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC; if (SET_PROPERTY_TYPE_DECREASED_SKILL_MODIFIER == sSetPropertyType) return ITEM_PROPERTY_DECREASED_SKILL_MODIFIER; if (SET_PROPERTY_TYPE_ENHANCED_CONTAINER_REDUCED_WEIGHT == sSetPropertyType) return ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT; if (SET_PROPERTY_TYPE_ENHANCEMENT_BONUS == sSetPropertyType) return ITEM_PROPERTY_ENHANCEMENT_BONUS; if (SET_PROPERTY_TYPE_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP == sSetPropertyType) return ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP; if (SET_PROPERTY_TYPE_ENHANCEMENT_BONUS_VS_RACIAL_GROUP == sSetPropertyType) return ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP; if (SET_PROPERTY_TYPE_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT == sSetPropertyType) return ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT; if (SET_PROPERTY_TYPE_EXTRA_MELEE_DAMAGE_TYPE == sSetPropertyType) return ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE; if (SET_PROPERTY_TYPE_EXTRA_RANGED_DAMAGE_TYPE == sSetPropertyType) return ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE; if (SET_PROPERTY_TYPE_FREEDOM_OF_MOVEMENT == sSetPropertyType) return ITEM_PROPERTY_FREEDOM_OF_MOVEMENT; if (SET_PROPERTY_TYPE_HASTE == sSetPropertyType) return ITEM_PROPERTY_HASTE; if (SET_PROPERTY_TYPE_HEALERS_KIT == sSetPropertyType) return ITEM_PROPERTY_HEALERS_KIT; if (SET_PROPERTY_TYPE_HOLY_AVENGER == sSetPropertyType) return ITEM_PROPERTY_HOLY_AVENGER; if (SET_PROPERTY_TYPE_IMMUNITY_DAMAGE_TYPE == sSetPropertyType) return ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE; if (SET_PROPERTY_TYPE_IMMUNITY_MISCELLANEOUS == sSetPropertyType) return ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS; if (SET_PROPERTY_TYPE_IMMUNITY_SPECIFIC_SPELL == sSetPropertyType) return ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL; if (SET_PROPERTY_TYPE_IMMUNITY_SPELL_SCHOOL == sSetPropertyType) return ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL; if (SET_PROPERTY_TYPE_IMMUNITY_SPELLS_BY_LEVEL == sSetPropertyType) return ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL; if (SET_PROPERTY_TYPE_IMPROVED_EVASION == sSetPropertyType) return ITEM_PROPERTY_IMPROVED_EVASION; if (SET_PROPERTY_TYPE_KEEN == sSetPropertyType) return ITEM_PROPERTY_KEEN; if (SET_PROPERTY_TYPE_LIGHT == sSetPropertyType) return ITEM_PROPERTY_LIGHT; if (SET_PROPERTY_TYPE_MASSIVE_CRITICALS == sSetPropertyType) return ITEM_PROPERTY_MASSIVE_CRITICALS; if (SET_PROPERTY_TYPE_MATERIAL == sSetPropertyType) return ITEM_PROPERTY_MATERIAL; if (SET_PROPERTY_TYPE_MIGHTY == sSetPropertyType) return ITEM_PROPERTY_MIGHTY; if (SET_PROPERTY_TYPE_MIND_BLANK == sSetPropertyType) return ITEM_PROPERTY_MIND_BLANK; if (SET_PROPERTY_TYPE_MONSTER_DAMAGE == sSetPropertyType) return ITEM_PROPERTY_MONSTER_DAMAGE; if (SET_PROPERTY_TYPE_NO_DAMAGE == sSetPropertyType) return ITEM_PROPERTY_NO_DAMAGE; if (SET_PROPERTY_TYPE_ON_HIT_PROPERTIES == sSetPropertyType) return ITEM_PROPERTY_ON_HIT_PROPERTIES; if (SET_PROPERTY_TYPE_ON_MONSTER_HIT == sSetPropertyType) return ITEM_PROPERTY_ON_MONSTER_HIT; if (SET_PROPERTY_TYPE_ONHITCASTSPELL == sSetPropertyType) return ITEM_PROPERTY_ONHITCASTSPELL; if (SET_PROPERTY_TYPE_POISON == sSetPropertyType) return ITEM_PROPERTY_POISON; if (SET_PROPERTY_TYPE_QUALITY == sSetPropertyType) return ITEM_PROPERTY_QUALITY; if (SET_PROPERTY_TYPE_REGENERATION == sSetPropertyType) return ITEM_PROPERTY_REGENERATION; if (SET_PROPERTY_TYPE_REGENERATION_VAMPIRIC == sSetPropertyType) return ITEM_PROPERTY_REGENERATION_VAMPIRIC; if (SET_PROPERTY_TYPE_SAVING_THROW_BONUS == sSetPropertyType) return ITEM_PROPERTY_SAVING_THROW_BONUS; if (SET_PROPERTY_TYPE_SAVING_THROW_BONUS_SPECIFIC == sSetPropertyType) return ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC; if (SET_PROPERTY_TYPE_SKILL_BONUS == sSetPropertyType) return ITEM_PROPERTY_SKILL_BONUS; if (SET_PROPERTY_TYPE_SPECIAL_WALK == sSetPropertyType) return ITEM_PROPERTY_SPECIAL_WALK; if (SET_PROPERTY_TYPE_SPELL_RESISTANCE == sSetPropertyType) return ITEM_PROPERTY_SPELL_RESISTANCE; if (SET_PROPERTY_TYPE_THIEVES_TOOLS == sSetPropertyType) return ITEM_PROPERTY_THIEVES_TOOLS; if (SET_PROPERTY_TYPE_TRAP == sSetPropertyType) return ITEM_PROPERTY_TRAP; if (SET_PROPERTY_TYPE_TRUE_SEEING == sSetPropertyType) return ITEM_PROPERTY_TRUE_SEEING; if (SET_PROPERTY_TYPE_TURN_RESISTANCE == sSetPropertyType) return ITEM_PROPERTY_TURN_RESISTANCE; if (SET_PROPERTY_TYPE_UNLIMITED_AMMUNITION == sSetPropertyType) return ITEM_PROPERTY_UNLIMITED_AMMUNITION; if (SET_PROPERTY_TYPE_USE_LIMITATION_ALIGNMENT_GROUP == sSetPropertyType) return ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP; if (SET_PROPERTY_TYPE_USE_LIMITATION_CLASS == sSetPropertyType) return ITEM_PROPERTY_USE_LIMITATION_CLASS; if (SET_PROPERTY_TYPE_USE_LIMITATION_RACIAL_TYPE == sSetPropertyType) return ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE; if (SET_PROPERTY_TYPE_USE_LIMITATION_SPECIFIC_ALIGNMENT == sSetPropertyType) return ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT; if (SET_PROPERTY_TYPE_USE_LIMITATION_TILESET == sSetPropertyType) return ITEM_PROPERTY_USE_LIMITATION_TILESET; if (SET_PROPERTY_TYPE_VISUALEFFECT == sSetPropertyType) return ITEM_PROPERTY_VISUALEFFECT; if (SET_PROPERTY_TYPE_WEIGHT_INCREASE == sSetPropertyType) return ITEM_PROPERTY_WEIGHT_INCREASE; if (SET_PROPERTY_TYPE_CUSTOM == sSetPropertyType) return CUSTOM_SET_BONUS; return -1; } // SSS EEEE TTTTTT TTTTTT AA GGG V V AA RRRR III AA BBBB L EEEE N N AA M M EEEE GGG EEEE N N EEEE RRRR AA TTTTTT OOO RRRR // S E TT TT A A G V V A A R R I A A B B L E NN N A A MM MM E G E NN N E R R A A TT O O R R // SSS EEE TT TT AAAA G GG V V AAAA RRRR I AAAA BBBB L EEE N N N AAAA M M M EEE G GG EEE N N N EEE RRRR AAAA TT O O RRRR // S E TT TT A A G G V V A A R R I A A B B L E N NN A A M M E G G E N NN E R R A A TT O O R R // SSSS EEEE TT ____ TT A A GGG ____ V A A R RR III A A BBBB LLLL EEEE N N A A M M EEEE GGG EEEE N N EEEE R RR A A TT OOO R RR // ____ ____ string SetItemTagVarName(int iTagNum = 0) { return "SET_TAG_" + IntToString(iTagNum); } string GetItemSetTag(object oItem, int iIdx = 0){ return GetLocalString(oItem, SetItemTagVarName(iIdx)); } struct ItemSetTagTokenizer GetNextSetTag(struct ItemSetTagTokenizer tknizr) { tknizr.sCurrentTag = GetItemSetTag(tknizr.oItem, tknizr.iSetTagIndex); tknizr.iSetTagIndex ++; return tknizr; } struct ItemSetTagTokenizer GetFirstSetTag(object oItem) { struct ItemSetTagTokenizer tknizr; tknizr.oItem = oItem; tknizr.iSetTagIndex = 0; tknizr = GetNextSetTag(tknizr); return tknizr; } // EEEE QQQ U U III PPPP EEEE DDD III TTTTTT EEEE M M U U TTTTTT III L SSS // E Q Q U U I P P E D D I TT E MM MM U U TT I L S // EEE Q Q U U I PPPP EEE D D I TT EEE M M M U U TT I L SSS // E Q QQ U U I P E D D I TT E M M U U TT I L S // EEEE QQQQ UUU III P EEEE DDD III TT EEEE M M UUU TT III LLLL SSSS // Q struct EquipedItems GetEquipedItems(object oPC) { struct EquipedItems equiped; equiped.oArms = GetItemInSlot(INVENTORY_SLOT_ARMS, oPC); equiped.oArrows = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC); equiped.oBelt = GetItemInSlot(INVENTORY_SLOT_BELT, oPC); equiped.oBolts = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC); equiped.oBoots = GetItemInSlot(INVENTORY_SLOT_BOOTS, oPC); equiped.oBullets = GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC); equiped.oCarmour = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC); equiped.oChest = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); equiped.oCloak = GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC); equiped.oCweaponb = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC); equiped.oCweaponl = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC); equiped.oCweaponr = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC); equiped.oHead = GetItemInSlot(INVENTORY_SLOT_HEAD, oPC); equiped.oLefthand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); equiped.oLeftring = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oPC); equiped.oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC); equiped.oRighthand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); equiped.oRightring = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oPC); return equiped; } int TestItemBelongsToSet(object oItem, string sSetTag) { struct ItemSetTagTokenizer sItemSetTagTkn = GetFirstSetTag(oItem); while(sItemSetTagTkn.sCurrentTag != ""){ if(sSetTag == sItemSetTagTkn.sCurrentTag) return TRUE; sItemSetTagTkn = GetNextSetTag(sItemSetTagTkn); } return FALSE; } int GetSetTagId(object oItem, string sSetTag) { struct ItemSetTagTokenizer sItemSetTagTkn = GetFirstSetTag(oItem); while(sItemSetTagTkn.sCurrentTag != ""){ if(sSetTag == sItemSetTagTkn.sCurrentTag) return sItemSetTagTkn.iSetTagIndex - 1; //Will have been incremented by last GetNextSetTag call. sItemSetTagTkn = GetNextSetTag(sItemSetTagTkn); } return -1; //Not found. } int GetNumberOfSetItemsEquiped(struct EquipedItems equipedItems, string sSetTag) { int iSetItemsEquiped = 0; //Check every other item for belonging to the same set if(TestItemBelongsToSet(equipedItems.oArms, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oArrows, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oBelt, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oBolts, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oBoots, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oBullets, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oCarmour, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oChest, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oCloak, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oCweaponb, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oCweaponl, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oCweaponr, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oHead, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oLefthand, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oLeftring, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oNeck, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oRighthand, sSetTag)){ iSetItemsEquiped ++; } if(TestItemBelongsToSet(equipedItems.oRightring, sSetTag)){ iSetItemsEquiped ++; } return iSetItemsEquiped; } // SSS EEEE TTTTTT III TTTTTT EEEE M M PPPP RRRR OOO PPPP M M OOO DDD III FFFF Y Y EEEE RRRR U U TTTTTT III L SSS // S E TT I TT E MM MM P P R R O O P P MM MM O O D D I F Y Y E R R U U TT I L S // SSS EEE TT I TT EEE M M M PPPP RRRR O O PPPP M M M O O D D I FFF Y EEE RRRR U U TT I L SSS // S E TT I TT E M M P R R O O P M M O O D D I F Y E R R U U TT I L S // SSSS EEEE TT III TT EEEE M M P R RR OOO P M M OOO DDD III F Y EEEE R RR UUU TT III LLLL SSSS struct SetItemPropArgLimits DefaultArgLimits ( struct SetItemPropArgLimits limits ) { struct SetItemPropArgLimits defaultLimits; defaultLimits.iArgOneMin = limits.iNotSetArgOneMin ? -2147483648 : limits.iArgOneMin; defaultLimits.iArgTwoMin = limits.iNotSetArgTwoMin ? -2147483648 : limits.iArgTwoMin; defaultLimits.iArgThreeMin = limits.iNotSetArgThreeMin ? -2147483648 : limits.iArgThreeMin; defaultLimits.iArgOneMax = limits.iNotSetArgOneMax ? 2147483647 : limits.iArgOneMax; defaultLimits.iArgTwoMax = limits.iNotSetArgTwoMax ? 2147483647 : limits.iArgTwoMax; defaultLimits.iArgThreeMax = limits.iNotSetArgThreeMax ? 2147483647 : limits.iArgThreeMax; return defaultLimits; } struct SetItemPropArguments GetItemPropArgumentsOneArg( object oItem, string sSetBonusPrefix, struct SetItemPropArgLimits ArgLimits, string sSetBonusArgOneSuffix = "_VALUE" ) { struct SetItemPropArguments args; struct SetItemPropArgLimits limits = DefaultArgLimits(ArgLimits); args.iArgOne = GetLocalInt( oItem, sSetBonusPrefix + sSetBonusArgOneSuffix ); if(args.iArgOne < limits.iArgOneMin || args.iArgOne > limits.iArgOneMax){ error( "ERROR! Set item bonus error, " + GetTag(oItem) + " has an invalid value for '" + sSetBonusArgOneSuffix +"' for bonus " + sSetBonusPrefix + ". Valid value range from " + IntToString(limits.iArgOneMin) + " to " + IntToString(limits.iArgOneMax) ); } return args; } struct SetItemPropArguments GetItemPropArgumentsTwoArgs( object oItem, string sSetBonusPrefix, struct SetItemPropArgLimits ArgLimits, string sSetBonusArgOneSuffix, string sSetBonusArgTwoSuffix = "_VALUE" ) { struct SetItemPropArguments args; struct SetItemPropArgLimits limits = DefaultArgLimits(ArgLimits); args.iArgOne = GetLocalInt( oItem, sSetBonusPrefix + sSetBonusArgOneSuffix ); args.iArgTwo = GetLocalInt( oItem, sSetBonusPrefix + sSetBonusArgTwoSuffix ); if(args.iArgOne < limits.iArgOneMin || args.iArgOne > limits.iArgOneMax){ error( "ERROR! Set item bonus error, " + GetTag(oItem) + " has an invalid value for '" + sSetBonusArgOneSuffix +"' for bonus " + sSetBonusPrefix + ". Valid value range from " + IntToString(limits.iArgOneMin) + " to " + IntToString(limits.iArgOneMax) ); } if(args.iArgTwo < limits.iArgTwoMin || args.iArgTwo > limits.iArgTwoMax){ error( "ERROR! Set item bonus error, " + GetTag(oItem) + " has an invalid value for '" + sSetBonusArgTwoSuffix +"' for bonus " + sSetBonusPrefix + ". Valid value range from " + IntToString(limits.iArgTwoMin) + " to " + IntToString(limits.iArgTwoMax) ); } return args; } struct SetItemPropArguments GetItemPropArgumentsThreeArgs( object oItem, string sSetBonusPrefix, struct SetItemPropArgLimits ArgLimits, string sSetBonusArgOneSuffix, string sSetBonusArgTwoSuffix, string sSetBonusArgThreeSuffix = "_VALUE" ) { struct SetItemPropArguments args; struct SetItemPropArgLimits limits = DefaultArgLimits(ArgLimits); args.iArgOne = GetLocalInt( oItem, sSetBonusPrefix + sSetBonusArgOneSuffix ); args.iArgTwo = GetLocalInt( oItem, sSetBonusPrefix + sSetBonusArgTwoSuffix ); args.iArgThree = GetLocalInt( oItem, sSetBonusPrefix + sSetBonusArgThreeSuffix ); if(args.iArgOne < limits.iArgOneMin || args.iArgOne > limits.iArgOneMax){ error( "ERROR! Set item bonus error, " + GetTag(oItem) + " has an invalid value for '" + sSetBonusArgOneSuffix +"' for bonus " + sSetBonusPrefix + ". Valid value range from " + IntToString(limits.iArgOneMin) + " to " + IntToString(limits.iArgOneMax) ); } if(args.iArgTwo < limits.iArgTwoMin || args.iArgTwo > limits.iArgTwoMax){ error( "ERROR! Set item bonus error, " + GetTag(oItem) + " has an invalid value for '" + sSetBonusArgTwoSuffix +"' for bonus " + sSetBonusPrefix + ". Valid value range from " + IntToString(limits.iArgTwoMin) + " to " + IntToString(limits.iArgTwoMax) ); } if(args.iArgThree < limits.iArgThreeMin || args.iArgThree > limits.iArgThreeMax){ error( "ERROR! Set item bonus error, " + GetTag(oItem) + " has an invalid value for '" + sSetBonusArgTwoSuffix +"' for bonus " + sSetBonusPrefix + ". Valid value range from " + IntToString(limits.iArgThreeMin) + " to " + IntToString(limits.iArgThreeMax) ); } return args; } int GetReplaceOrAddProp(object oItem, string sSetBonusPrefix) { return GetLocalInt(oItem, sSetBonusPrefix + "_REPLACE"); } // RRRR d SSS t BBBB ff t // R R d S t B B f t ii // RRRR eee ddd ooo SSS eee ttt BBBB ooo nnn u u ss eee ss fff u u nnn ccc ttt ooo nnn ss // R R e e d d o o S e e t B B o o n n u u s e e s f u u n n c t ii o o n n s // R RR ee ddd ooo SSSS ee tt BBBB ooo n n uuu ss ee ss f uuu n n ccc tt ii ooo n n ss // Redo the set bonuses on a single item. void RedoSetItemBonuses(object oItem, string sSetTag, int iSetItemsEquiped) { if(!TestItemBelongsToSet(oItem, sSetTag)){ trace("Skipping non set item "+GetTag(oItem)); return; //If this item isn't a part of the set, just drop out of this function. } string sSetItemTagVarName = SetItemTagVarName( GetSetTagId(oItem, sSetTag) ); int iBonusId = 0; string sSetBonusPrefix = sSetItemTagVarName + "_BONUS_" + IntToString(iBonusId); string sSetPropertyBounsType = GetLocalString( oItem, sSetBonusPrefix + "_TYPE" ); trace( "sSetBonusPrefix: " + sSetBonusPrefix ); debug( "Redoing set bonus on " + GetTag(oItem) + " for set " + sSetTag + " at bonus lvl " + IntToString(iSetItemsEquiped) ); while( sSetPropertyBounsType != "" ) { debug("Checking Bonus of type: " + sSetPropertyBounsType); int iSetBonusID = GetLocalInt( oItem, sSetBonusPrefix + "_ID" ); int iSetBounsMinSetItems = GetLocalInt( oItem, sSetBonusPrefix + "_MIN_SET_ITEMS" ); string sCustomSetBonusApplyScript = GetLocalString( oItem, sSetBonusPrefix + "_APPLY_SCRIPT" ); string sCustomSetBonusRemoveScript = GetLocalString( oItem, sSetBonusPrefix + "_REMOVE_SCRIPT" ); int iAllowMultipleProps = FALSE; //Set this to true to use AddItemProperty instead of IPSafeAddItemProp in cases where more than one prop of a type can be added to an item, such as bonus spell slots. int iIgnoreSubType = FALSE; if(iSetItemsEquiped >= iSetBounsMinSetItems){ itemproperty ipNewBonus; int iSetPropertyBonusType = GetItemPropertyConstFromSetPropertyType(sSetPropertyBounsType); struct SetItemPropArgLimits limits; struct SetItemPropArguments args; // Documentation Regex: case (ITEM_PROPERTY_[A-Z_]+) ?:((\n\s+limits\.iArgOneMin = (\d+);)?(\n\s+limits\.iArgOneMax = (\d+);)?(\n\s+limits\.iArgTwoMin = (\d+);)?(\n\s+limits\.iArgTwoMax = (\d+);)?(\n\s+limits.iArgThreeMin = (\d+);)?(\n\s+limits.iArgThreeMax = (\d+);)?(\n.+)+limits,(\n\s+"([A-Z_]+)",?.*)?(\n\s+"([A-Z_]+)",?.*)?(\n\s+"([A-Z_]+)",?.*)?)? switch(iSetPropertyBonusType) { case ITEM_PROPERTY_ABILITY_BONUS: limits.iArgOneMin = 0; limits.iArgOneMax = 5; limits.iArgTwoMin = 1; limits.iArgTwoMax = 12; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ABILITY_BONUS", "_VALUE" ); debug("Adding ITEM_PROPERTY_ABILITY_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAbilityBonus( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); break; case ITEM_PROPERTY_AC_BONUS: limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_VALUE" ); debug("Adding ITEM_PROPERTY_AC_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyACBonus( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP: limits.iArgOneMin = 0; limits.iArgOneMax = 5; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_AC_BONUS_VS_ALIGNMENT_GROUP", "_VALUE" ); debug("Adding ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyACBonusVsAlign( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE: limits.iArgOneMin = 0; limits.iArgOneMax = 13; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_AC_BONUS_VS_DAMAGE_TYPE", "_VALUE" ); debug("Adding ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyACBonusVsDmgType( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP: limits.iArgOneMin = 0; limits.iArgOneMax = 25; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_AC_BONUS_VS_RACIAL_GROUP", "_VALUE" ); debug("Adding ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyACBonusVsRace( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT : limits.iArgOneMin = 0; limits.iArgOneMax = 8; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_AC_BONUS_VS_SPECIFIC_ALIGNMENT", "_VALUE" ); debug("Adding ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyACBonusVsSAlign( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ADDITIONAL : limits.iArgOneMin = 0; limits.iArgOneMax = 1; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_ADDITIONAL" ); debug("Adding ITEM_PROPERTY_ADDITIONAL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAdditional( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_ARCANE_SPELL_FAILURE : limits.iArgOneMin = 0; limits.iArgOneMax = 19; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_ARCANE_SPELL_FAILURE" ); debug("Adding ITEM_PROPERTY_ARCANE_SPELL_FAILURE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyArcaneSpellFailure( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_ATTACK_BONUS : limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_ATTACK_BONUS" ); debug("Adding ITEM_PROPERTY_ATTACK_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAttackBonus( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 5; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ATTACK_BONUS_VS_ALIGNMENT_GROUP", "_VALUE" ); debug("Adding ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAttackBonusVsAlign( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 25; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ATTACK_BONUS_VS_RACIAL_GROUP", "_VALUE" ); debug("Adding ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAttackBonusVsRace( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT : limits.iArgOneMin = 0; limits.iArgOneMax = 8; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT", "_VALUE" ); debug("Adding ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAttackBonusVsSAlign( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION : limits.iArgOneMin = 1; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_BASE_ITEM_WEIGHT_REDUCTION" ); debug("Adding ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyWeightReduction( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_BONUS_FEAT : limits.iArgOneMin = 0; limits.iArgOneMax = 62; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_BONUS_FEAT" ); debug("Adding ITEM_PROPERTY_BONUS_FEAT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyBonusFeat( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N : limits.iArgOneMin = 0; limits.iArgOneMax = 10; limits.iArgTwoMin = 0; limits.iArgTwoMax = 9; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_CLASS", "_BONUS_SPELL_SLOT_OF_LEVEL_N" ); debug("Adding ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyBonusLevelSpell( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_CAST_SPELL : limits.iArgOneMin = 0; limits.iArgOneMax = 410; limits.iArgTwoMin = 1; limits.iArgTwoMax = 13; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_CAST_SPELL", "_USES" ); debug("Adding ITEM_PROPERTY_CAST_SPELL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyCastSpell( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DAMAGE_BONUS : limits.iArgOneMin = 0; limits.iArgOneMax = 13; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_TYPE", "_DAMAGE_BONUS" ); debug("Adding ITEM_PROPERTY_DAMAGE_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageBonus( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 5; limits.iArgTwoMin = 0; limits.iArgTwoMax = 13; limits.iArgThreeMin = 1; limits.iArgThreeMax = 20; args = GetItemPropArgumentsThreeArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_BONUS_VS_ALIGNMENT_GROUP", "_DAMAGE_TYPE", "_DAMAGE_BONUS" ); debug("Adding ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageBonusVsAlign( args.iArgOne, args.iArgTwo, args.iArgThree ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 25; limits.iArgTwoMin = 0; limits.iArgTwoMax = 13; limits.iArgThreeMin = 1; limits.iArgThreeMax = 20; args = GetItemPropArgumentsThreeArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_BONUS_VS_RACIAL_GROUP", "_DAMAGE_TYPE", "_DAMAGE_BONUS" ); debug("Adding ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageBonusVsRace( args.iArgOne, args.iArgTwo, args.iArgThree ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT : limits.iArgOneMin = 0; limits.iArgOneMax = 8; limits.iArgTwoMin = 0; limits.iArgTwoMax = 13; limits.iArgThreeMin = 1; limits.iArgThreeMax = 20; args = GetItemPropArgumentsThreeArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT", "_DAMAGE_TYPE", "_DAMAGE_BONUS" ); debug("Adding ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageBonusVsSAlign( args.iArgOne, args.iArgTwo, args.iArgThree ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DAMAGE_REDUCTION : limits.iArgOneMin = 0; limits.iArgOneMax = 19; limits.iArgTwoMin = 1; limits.iArgTwoMax = 10; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_REDUCTION", "_DAMAGE_SOAK" ); debug("Adding ITEM_PROPERTY_DAMAGE_REDUCTION: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageReduction( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); break; case ITEM_PROPERTY_DAMAGE_RESISTANCE : limits.iArgOneMin = 0; limits.iArgOneMax = 13; limits.iArgTwoMin = 1; limits.iArgTwoMax = 10; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_TYPE", "_DAMAGE_RESISTANCE" ); debug("Adding ITEM_PROPERTY_DAMAGE_RESISTANCE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageResistance( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DAMAGE_VULNERABILITY : limits.iArgOneMin = 0; limits.iArgOneMax = 13; limits.iArgTwoMin = 1; limits.iArgTwoMax = 7; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_DAMAGE_TYPE", "_DAMAGE_VULNERABILITY" ); debug("Adding ITEM_PROPERTY_DAMAGE_VULNERABILITY: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageVulnerability( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DARKVISION : debug("Adding ITEM_PROPERTY_DARKVISION"); ipNewBonus = TagItemProperty( ItemPropertyDarkvision(), sSetBonusPrefix ); break; case ITEM_PROPERTY_DECREASED_ABILITY_SCORE : limits.iArgOneMin = 0; limits.iArgOneMax = 5; limits.iArgTwoMin = 1; limits.iArgTwoMax = 50; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_DECREASED_ABILITY_SCORE", "_MODIFIER" ); debug("Adding ITEM_PROPERTY_DECREASED_ABILITY_SCORE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDecreaseAbility( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DECREASED_AC : limits.iArgOneMin = 0; limits.iArgOneMax = 4; limits.iArgTwoMin = 1; limits.iArgTwoMax = 5; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_MODIFIER", "_DECREASED_AC" ); debug("Adding ITEM_PROPERTY_DECREASED_AC: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDecreaseAC( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); break; case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER : limits.iArgOneMin = 1; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_DECREASED_ATTACK_MODIFIER" ); debug("Adding ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyAttackPenalty( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_DECREASED_DAMAGE : limits.iArgOneMin = 1; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_DECREASED_DAMAGE" ); debug("Adding ITEM_PROPERTY_DECREASED_DAMAGE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamagePenalty( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER : limits.iArgOneMin = 1; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_DECREASED_ENHANCEMENT_MODIFIER" ); debug("Adding ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyEnhancementPenalty( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_DECREASED_SAVING_THROWS : limits.iArgOneMin = 0; limits.iArgOneMax = 15; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_SAVE_VS", "_DECREASED_SAVING_THROWS" ); debug("Adding ITEM_PROPERTY_DECREASED_SAVING_THROWS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyReducedSavingThrowVsX( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC : limits.iArgOneMin = 0; limits.iArgOneMax = 15; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_SAVE_VS", "_DECREASED_SAVING_THROWS_SPECIFIC" ); debug("Adding ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyReducedSavingThrow( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER : limits.iArgOneMin = 0; limits.iArgOneMax = 255; limits.iArgTwoMin = 1; limits.iArgTwoMax = 50; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_SKILL_MODIFIER", "_DECREASED_SKILL_MODIFIER" ); debug("Adding ITEM_PROPERTY_DECREASED_SKILL_MODIFIER: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDecreaseSkill( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT : limits.iArgOneMin = 1; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_ENHANCED_CONTAINER_REDUCED_WEIGHT" ); debug("Adding ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyContainerReducedWeight( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_ENHANCEMENT_BONUS : limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_ENHANCEMENT_BONUS" ); debug("Adding ITEM_PROPERTY_ENHANCEMENT_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyEnhancementBonus( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 5; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP", "_VALUE" ); debug("Adding ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyEnhancementBonusVsAlign( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 25; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ENHANCEMENT_BONUS_VS_RACIAL_GROUP", "_VALUE" ); debug("Adding ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyEnhancementBonusVsRace( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT : limits.iArgOneMin = 0; limits.iArgOneMax = 8; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT", "_VALUE" ); debug("Adding ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyEnhancementBonusVsSAlign( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE : limits.iArgOneMin = 0; limits.iArgOneMax = 13; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_EXTRA_MELEE_DAMAGE_TYPE" ); debug("Adding ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyExtraMeleeDamageType( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE : limits.iArgOneMin = 0; limits.iArgOneMax = 13; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_EXTRA_RANGED_DAMAGE_TYPE" ); debug("Adding ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyExtraRangeDamageType( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT : debug("Adding ITEM_PROPERTY_FREEDOM_OF_MOVEMENT"); ipNewBonus = TagItemProperty( ItemPropertyFreeAction(), sSetBonusPrefix ); break; case ITEM_PROPERTY_HASTE : debug("Adding ITEM_PROPERTY_HASTE"); ipNewBonus = TagItemProperty( ItemPropertyHaste(), sSetBonusPrefix ); break; case ITEM_PROPERTY_HEALERS_KIT : limits.iArgOneMin = 1; limits.iArgOneMax = 12; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_HEALERS_KIT" ); debug("Adding ITEM_PROPERTY_HEALERS_KIT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyHealersKit( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_HOLY_AVENGER : debug("Adding ITEM_PROPERTY_HOLY_AVENGER"); ipNewBonus = TagItemProperty( ItemPropertyHolyAvenger(), sSetBonusPrefix ); break; case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE : limits.iArgOneMin = 0; limits.iArgOneMax = 13; limits.iArgTwoMin = 1; limits.iArgTwoMax = 7; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_IMMUNITY_DAMAGE_TYPE", "_IMMUNE_BONUS" ); debug("Adding ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyDamageImmunity( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS : limits.iArgOneMin = 0; limits.iArgOneMax = 9; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_IMMUNITY_MISCELLANEOUS" ); debug("Adding ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyImmunityMisc( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL : limits.iArgOneMin = 0; limits.iArgOneMax = 187; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_IMMUNITY_SPECIFIC_SPELL" ); debug("Adding ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertySpellImmunitySpecific( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL : limits.iArgOneMin = 0; limits.iArgOneMax = 7; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_IMMUNITY_SPELL_SCHOOL" ); debug("Adding ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertySpellImmunitySchool( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL : limits.iArgOneMin = 1; limits.iArgOneMax = 9; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_IMMUNITY_SPELLS_BY_LEVEL" ); debug("Adding ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyImmunityToSpellLevel( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_IMPROVED_EVASION : debug("Adding ITEM_PROPERTY_IMPROVED_EVASION"); ipNewBonus = TagItemProperty( ItemPropertyImprovedEvasion(), sSetBonusPrefix ); break; case ITEM_PROPERTY_KEEN : debug("Adding ITEM_PROPERTY_KEEN"); ipNewBonus = TagItemProperty( ItemPropertyKeen(), sSetBonusPrefix ); break; case ITEM_PROPERTY_LIGHT : limits.iArgOneMin = 1; limits.iArgOneMax = 4; limits.iArgTwoMin = 0; limits.iArgTwoMax = 6; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_LIGHT", "_COLOR" ); debug("Adding ITEM_PROPERTY_LIGHT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyLight( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); break; case ITEM_PROPERTY_MASSIVE_CRITICALS : limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_MASSIVE_CRITICALS" ); debug("Adding ITEM_PROPERTY_MASSIVE_CRITICALS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyMassiveCritical( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_MATERIAL : limits.iArgOneMin = 0; limits.iArgOneMax = 77; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_MATERIAL" ); debug("Adding ITEM_PROPERTY_MATERIAL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyMaterial( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_MIGHTY : limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_MIGHTY" ); debug("Adding ITEM_PROPERTY_MIGHTY: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyMaxRangeStrengthMod( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_MIND_BLANK : error("Error! Set Property ITEM_PROPERTY_MIND_BLANK cannot be used due to missing constructor!"); break; case ITEM_PROPERTY_MONSTER_DAMAGE : limits.iArgOneMin = 1; limits.iArgOneMax = 57; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_MONSTER_DAMAGE" ); debug("Adding ITEM_PROPERTY_MONSTER_DAMAGE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyMonsterDamage( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_NO_DAMAGE : debug("Adding ITEM_PROPERTY_NO_DAMAGE"); ipNewBonus = TagItemProperty( ItemPropertyNoDamage(), sSetBonusPrefix ); break; case ITEM_PROPERTY_ON_HIT_PROPERTIES : limits.iArgOneMin = 0; limits.iArgOneMax = 25; limits.iArgTwoMin = 0; limits.iArgTwoMax = 6; limits.iArgThreeMin = 0; limits.iArgThreeMax = 255; //TODO: Fix this value to be the maximum of the various consts. args = GetItemPropArgumentsThreeArgs( oItem, sSetBonusPrefix, limits, "_ON_HIT_PROPERTIES", "_SAVE_DC", "_SPECIAL" ); debug("Adding ITEM_PROPERTY_ON_HIT_PROPERTIES: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyOnHitProps( args.iArgOne, args.iArgTwo, args.iArgThree ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_ON_MONSTER_HIT : warn("Set ITEM_PROPERTY_ON_MONSTER_HIT has a know bug, check the lexicon for more info."); limits.iArgOneMin = 0; limits.iArgOneMax = 9; limits.iArgTwoMin = 0; limits.iArgTwoMax = 255; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ON_MONSTER_HIT", "_SPECIAL" ); debug("Adding ITEM_PROPERTY_ON_MONSTER_HIT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyOnMonsterHitProperties( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); break; case ITEM_PROPERTY_ONHITCASTSPELL: limits.iArgOneMin = 0; limits.iArgOneMax = 140; limits.iArgTwoMin = 0; limits.iNotSetArgTwoMax = TRUE; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_ONHITCASTSPELL", "_CAST_LEVEL" ); debug("Adding ITEM_PROPERTY_ONHITCASTSPELL: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyOnHitCastSpell( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); iIgnoreSubType = TRUE; break; case ITEM_PROPERTY_POISON : error("Error! Set Property ITEM_PROPERTY_POISON cannot be used due to missing constructor!"); break; case ITEM_PROPERTY_QUALITY : limits.iArgOneMin = 0; limits.iArgOneMax = 15; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_QUALITY" ); debug("Adding ITEM_PROPERTY_QUALITY: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyQuality( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_REGENERATION : limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_REGENERATION" ); debug("Adding ITEM_PROPERTY_REGENERATION: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyRegeneration( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_REGENERATION_VAMPIRIC : limits.iArgOneMin = 1; limits.iArgOneMax = 20; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_REGENERATION_VAMPIRIC" ); debug("Adding ITEM_PROPERTY_REGENERATION_VAMPIRIC: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyVampiricRegeneration( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_SAVING_THROW_BONUS : limits.iArgOneMin = 0; limits.iArgOneMax = 15; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_SAVE_VS", "_SAVING_THROW_BONUS" ); debug("Adding ITEM_PROPERTY_SAVING_THROW_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyBonusSavingThrowVsX( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC : limits.iArgOneMin = 1; limits.iArgOneMax = 3; limits.iArgTwoMin = 1; limits.iArgTwoMax = 20; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_SAVING_THROW_BONUS_SPECIFIC", "_SAVING_THROW_BONUS" ); debug("Adding ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyBonusSavingThrow( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_SKILL_BONUS : limits.iArgOneMin = 0; limits.iArgOneMax = 255; limits.iArgTwoMin = 1; limits.iArgTwoMax = 50; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_SKILL_BONUS", "_VALUE" ); debug("Adding ITEM_PROPERTY_SKILL_BONUS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertySkillBonus( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_SPECIAL_WALK : limits.iArgOneMin = 0; limits.iArgOneMax = 0; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_SPECIAL_WALK" ); debug("Adding ITEM_PROPERTY_SPECIAL_WALK: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertySpecialWalk( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_SPELL_RESISTANCE : limits.iArgOneMin = 0; limits.iArgOneMax = 11; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_SPELL_RESISTANCE" ); debug("Adding ITEM_PROPERTY_SPELL_RESISTANCE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyBonusSpellResistance( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_THIEVES_TOOLS : limits.iArgOneMin = 1; limits.iArgOneMax = 12; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_THIEVES_TOOLS" ); debug("Adding ITEM_PROPERTY_THIEVES_TOOLS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyThievesTools( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_TRAP : limits.iArgOneMin = 0; limits.iArgOneMax = 3; limits.iArgTwoMin = 1; limits.iArgTwoMax = 11; args = GetItemPropArgumentsTwoArgs( oItem, sSetBonusPrefix, limits, "_VALUE", "_TRAP" ); debug("Adding ITEM_PROPERTY_TRAP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyTrap( args.iArgOne, args.iArgTwo ), sSetBonusPrefix ); break; case ITEM_PROPERTY_TRUE_SEEING : debug("Adding ITEM_PROPERTY_TRUE_SEEING"); ipNewBonus = TagItemProperty( ItemPropertyTrueSeeing(), sSetBonusPrefix ); break; case ITEM_PROPERTY_TURN_RESISTANCE : limits.iArgOneMin = 1; limits.iArgOneMax = 50; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_TURN_RESISTANCE" ); debug("Adding ITEM_PROPERTY_TURN_RESISTANCE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyTurnResistance( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_UNLIMITED_AMMUNITION : limits.iArgOneMin = 1; limits.iArgOneMax = 15; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_UNLIMITED_AMMUNITION" ); debug("Adding ITEM_PROPERTY_UNLIMITED_AMMUNITION: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyUnlimitedAmmo( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP : limits.iArgOneMin = 0; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_USE_LIMITATION_ALIGNMENT_GROUP" ); debug("Adding ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyLimitUseByAlign( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_USE_LIMITATION_CLASS : limits.iArgOneMin = 0; limits.iArgOneMax = 10; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_USE_LIMITATION_CLASS" ); debug("Adding ITEM_PROPERTY_USE_LIMITATION_CLASS: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyLimitUseByClass( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE : limits.iArgOneMin = 0; limits.iArgOneMax = 25; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_USE_LIMITATION_RACIAL_TYPE" ); debug("Adding ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyLimitUseByRace( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT : limits.iArgOneMin = 0; limits.iArgOneMax = 8; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_USE_LIMITATION_SPECIFIC_ALIGNMENT" ); debug("Adding ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyLimitUseBySAlign( args.iArgOne ), sSetBonusPrefix ); if(!GetReplaceOrAddProp(oItem, sSetBonusPrefix)) iAllowMultipleProps = TRUE; break; case ITEM_PROPERTY_USE_LIMITATION_TILESET : error("Error! Set Property ITEM_PROPERTY_USE_LIMITATION_TILESET cannot be used due to missing constructor!"); break; case ITEM_PROPERTY_VISUALEFFECT : limits.iArgOneMin = 0; limits.iArgOneMax = 6; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_VISUALEFFECT" ); debug("Adding ITEM_PROPERTY_VISUALEFFECT: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyVisualEffect( args.iArgOne ), sSetBonusPrefix ); break; case ITEM_PROPERTY_WEIGHT_INCREASE : limits.iArgOneMin = 0; limits.iArgOneMax = 5; args = GetItemPropArgumentsOneArg( oItem, sSetBonusPrefix, limits, "_WEIGHT_INCREASE" ); debug("Adding ITEM_PROPERTY_WEIGHT_INCREASE: " + IntToString(args.iArgOne)); ipNewBonus = TagItemProperty( ItemPropertyWeightIncrease( args.iArgOne ), sSetBonusPrefix ); break; case CUSTOM_SET_BONUS: //Execute custom script on bonus applied. ExecuteScript(sCustomSetBonusApplyScript, GetPCItemLastEquippedBy()); break; default: error("Error! Set property Unrecognized: " + sSetPropertyBounsType); } if(GetIsItemPropertyValid(ipNewBonus)){ //Test for Custom prop applied or error. debug("ITEM PROPERTY TYPE:" + IntToString(GetItemPropertyType(ipNewBonus))); debug("ITEM PROPERTY SUB TYPE:" + IntToString(GetItemPropertySubType(ipNewBonus))); int iAlreadyApplied; itemproperty ipLoop = GetFirstItemProperty(oItem); while(GetIsItemPropertyValid(ipLoop)){ if(GetItemPropertyTag(ipLoop) == sSetBonusPrefix){ iAlreadyApplied = TRUE; break; } ipLoop = GetNextItemProperty(oItem); } if(!iAlreadyApplied){ if(iAllowMultipleProps){ IPSafeAddItemProperty( oItem, ipNewBonus, 0.0, X2_IP_ADDPROP_POLICY_IGNORE_EXISTING, FALSE, iIgnoreSubType ); }else{ IPSafeAddItemProperty( oItem, ipNewBonus, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, iIgnoreSubType ); } } } }else{ if(sCustomSetBonusRemoveScript != ""){ //If there is a custom bonus remove script for this tag, then run it first. ExecuteScript(sCustomSetBonusRemoveScript, GetPCItemLastUnequippedBy()); } itemproperty ipLoop = GetFirstItemProperty(oItem); while(GetIsItemPropertyValid(ipLoop)){ if(GetItemPropertyTag(ipLoop) == sSetBonusPrefix){ debug("Removing Set Property: " + sSetBonusPrefix); RemoveItemProperty(oItem, ipLoop); break; } ipLoop = GetNextItemProperty(oItem); } } iBonusId ++; sSetBonusPrefix = sSetItemTagVarName + "_BONUS_" + IntToString(iBonusId); sSetPropertyBounsType = GetLocalString( oItem, sSetBonusPrefix + "_TYPE" ); } } void RedoEquipedSetItemsBonuses(struct EquipedItems equipedItems, string sSetTag, int iSetItemsCount) { debug("Redoing equiped items set bonuses for set " + sSetTag + " to bonus lvl " + IntToString(iSetItemsCount)); RedoSetItemBonuses(equipedItems.oArms, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oArrows, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oBelt, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oBolts, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oBoots, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oBullets, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oCarmour, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oChest, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oCloak, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oCweaponb, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oCweaponl, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oCweaponr, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oHead, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oLefthand, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oLeftring, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oNeck, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oRighthand, sSetTag, iSetItemsCount); RedoSetItemBonuses(equipedItems.oRightring, sSetTag, iSetItemsCount); }