Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.66 KB | None | 0 0
  1.  
  2. #include "nw_i0_spells"
  3. #include "x2_i0_spells"
  4.  
  5. #include "x2_inc_spellhook"
  6. #include "util_inc"
  7.  
  8. object GetTargetCreature()
  9. {
  10.     object oTarget = GetSpellTargetObject();
  11.     if (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
  12.         return oTarget;
  13.     else if (GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
  14.         return GetItemPossessor(oTarget);
  15.     else
  16.         return OBJECT_INVALID;
  17. }
  18.  
  19. object GetTargetWeapon()
  20. {
  21.     object oTarget = GetSpellTargetObject();
  22.     object oWeapon;
  23.     if (GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
  24.     {
  25.         oWeapon = oTarget;
  26.     }
  27.     else
  28.     {
  29.         oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
  30.         if (oWeapon == OBJECT_INVALID || !util_IsWeapon(oWeapon))
  31.             oWeapon = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
  32.         if (oWeapon == OBJECT_INVALID || !util_IsWeapon(oWeapon))
  33.             oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oTarget);
  34.         if (oWeapon == OBJECT_INVALID || !util_IsWeapon(oWeapon))
  35.             oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget);
  36.         if (oWeapon == OBJECT_INVALID || !util_IsWeapon(oWeapon))
  37.             oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oTarget);
  38.     }
  39.     if (!util_IsWeapon(oWeapon))
  40.         oWeapon = OBJECT_INVALID;
  41.     return oWeapon;
  42. }
  43.  
  44.  
  45. float GetSpellDuration()
  46. {
  47.     int nSpellID   = GetSpellId();
  48.     int nCasterLvl = GetCasterLevel(OBJECT_SELF);
  49.     int nMetaMagic = GetMetaMagicFeat();
  50.     float fDuration;
  51.  
  52.     switch (nSpellID)
  53.     {
  54.         case SPELL_MAGIC_WEAPON:
  55.         case SPELL_GREATER_MAGIC_WEAPON:
  56.         case SPELL_DARKFIRE:
  57.             fDuration = HoursToSeconds(nCasterLvl); break;
  58.         case SPELL_BLADE_THIRST:
  59.             fDuration = RoundsToSeconds(2*nCasterLvl); break;
  60.         case SPELL_FLAME_WEAPON:
  61.             fDuration = TurnsToSeconds(2*nCasterLvl); break;
  62.         default:
  63.             return 0.0;
  64.     }
  65.  
  66.  
  67.     if (nMetaMagic == METAMAGIC_EXTEND)
  68.         fDuration *= 2;
  69.     return fDuration;
  70. }
  71.  
  72. void  AddGreaterEnhancementEffectToWeapon(object oMyWeapon, float fDuration, int nBonus)
  73. {
  74.    IPSafeAddItemProperty(oMyWeapon,ItemPropertyEnhancementBonus(nBonus), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE);
  75.    return;
  76. }
  77.  
  78. void AddItemEnhancementEffect(object oItem, float fDuration, int nEnhancementBonus)
  79. {
  80.     int nBaseItemType = GetBaseItemType(oItem);
  81.     // Ranged weapons and bracers/gauntlets can only gain attac bonuses
  82.          if (  nBaseItemType == BASE_ITEM_LONGBOW
  83.             || nBaseItemType == BASE_ITEM_HEAVYCROSSBOW
  84.             || nBaseItemType == BASE_ITEM_GLOVES
  85.             || nBaseItemType == BASE_ITEM_SHORTBOW
  86.             || nBaseItemType == BASE_ITEM_SLING
  87.             || nBaseItemType == BASE_ITEM_LIGHTCROSSBOW)
  88.         IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(nEnhancementBonus), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
  89.     // Ranged ammunition can only gain damage bonuses
  90.     else if (  nBaseItemType == BASE_ITEM_ARROW
  91.             || nBaseItemType == BASE_ITEM_BOLT
  92.             || nBaseItemType == BASE_ITEM_BULLET)
  93.         IPSafeAddItemProperty(oItem, ItemPropertyDamageBonus(GetBaseDamageType(oItem), nEnhancementBonus), fDuration, X2_IP_ADDPROP_POLICY_IGNORE_EXISTING, FALSE, TRUE);
  94.     // All other weapons can gain enhancement bonuses
  95.     else if (  nBaseItemType == BASE_ITEM_ARMOR)
  96.         IPSafeAddItemProperty(oItem, ItemPropertyACBonus(nEnhancementBonus), fDuration, X2_IP_ADDPROP_POLICY_IGNORE_EXISTING, FALSE, TRUE);
  97.     // All other weapons can gain enhancement bonuses
  98.     else if (util_IsWeapon(oItem))
  99.         IPSafeAddItemProperty(oItem, ItemPropertyEnhancementBonus(nEnhancementBonus), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
  100. }
  101.  
  102. void AddItemEnergyEffect(object oItem, float fDuration, int nDamageType, int nDamageBonus)
  103. {
  104.     // Abort for non-weapons
  105.     int nBaseItemType = GetBaseItemType(oItem);
  106.     if (util_IsWeapon(oItem) || nBaseItemType == BASE_ITEM_GLOVES)
  107.     {
  108.         // Add the first item property
  109.         IPSafeAddItemProperty(oItem, ItemPropertyDamageBonus(nDamageType, nDamageBonus), fDuration,
  110.                                 X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
  111.  
  112.         int nItemVisual = ITEM_VISUAL_NONE;
  113.         switch (nDamageType)
  114.         {
  115.             case IP_CONST_DAMAGETYPE_ACID:          nItemVisual = ITEM_VISUAL_ACID;         break;
  116.             case IP_CONST_DAMAGETYPE_COLD:          nItemVisual = ITEM_VISUAL_COLD;         break;
  117.             case IP_CONST_DAMAGETYPE_DIVINE:
  118.                 switch (GetAlignmentGoodEvil(oCaster))
  119.                 {
  120.                     case ALIGNMENT_GOOD:            nItemVisual = ITEM_VISUAL_HOLY;       break;
  121.                     case ALIGNMENT_NEUTRAL:         nItemVisual = ITEM_VISUAL_SONIC;      break;
  122.                     case ALIGNMENT_EVIL:            nItemVisual = ITEM_VISUAL_EVIL;       break;
  123.                 }
  124.                 break;
  125.             case IP_CONST_DAMAGETYPE_ELECTRICAL:    nItemVisual = ITEM_VISUAL_ELECTRICAL;   break;
  126.             case IP_CONST_DAMAGETYPE_FIRE:          nItemVisual = ITEM_VISUAL_FIRE;         break;
  127.             case IP_CONST_DAMAGETYPE_MAGICAL:       nItemVisual = ITEM_VISUAL_SONIC;        break;
  128.             case IP_CONST_DAMAGETYPE_NEGATIVE:      nItemVisual = ITEM_VISUAL_EVIL;         break;
  129.             case IP_CONST_DAMAGETYPE_POSITIVE:      nItemVisual = ITEM_VISUAL_HOLY;         break;
  130.             case IP_CONST_DAMAGETYPE_SONIC:         nItemVisual = ITEM_VISUAL_SONIC;        break;
  131.         }
  132.         // Add the item visual only if needed
  133.         if (nItemVisual != ITEM_VISUAL_NONE)
  134.             IPSafeAddItemProperty(oItem, ItemPropertyVisualEffect(nItemVisual), fDuration,
  135.                                     X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
  136.     }
  137. }
  138.  
  139.  
  140. void main()
  141. {
  142.  
  143.     if (!X2PreSpellCastCode())
  144.     {
  145.         // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
  146.         return;
  147.     }
  148.  
  149.     int nSpellID     = GetSpellId();
  150.     object oCaster   = OBJECT_SELF;
  151.     object oCreature = GetTargetCreature();
  152.     object oWeapon   = GetTargetWeapon();
  153.     float fDuration  = GetSpellDuration();
  154.     int nCasterLvl   = GetCasterLevel(oCaster);
  155.  
  156.     if (fDuration <= 0.0 || oWeapon == OBJECT_INVALID)
  157.     {
  158.         FloatingTextStringOnCreature("Your spell did not take hold", oCaster, FALSE);
  159.         return;
  160.     }
  161.  
  162.     //Declare major variables
  163.     effect eVis = EffectVisualEffect(VFX_IMP_SUPER_HEROISM);
  164.     effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
  165.  
  166.     ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCreature);
  167.     ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oCreature, fDuration);
  168.  
  169.     switch (nSpellID)
  170.     {
  171.         case SPELL_MAGIC_WEAPON:
  172.             AddItemEnhancementEffect(oWeapon, fDuration, 1);
  173.         case SPELL_GREATER_MAGIC_WEAPON:
  174.             AddItemEnhancementEffect(oWeapon, fDuration, min(nCasterLvl/3, 3));
  175.         case SPELL_BLADE_THIRST:
  176.             // If we targeted a creature that's dual wielding, apply +2 to both
  177.             if (GetSpellTargetObject() == oCreature &&
  178.                 GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature) == oWeapon &&
  179.                 util_IsWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature)))
  180.             {
  181.                 AddItemEnhancementEffect(oWeapon, fDuration, 2);
  182.                 AddItemEnhancementEffect(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature), fDuration, 2);
  183.             }
  184.             else
  185.             {
  186.                 AddItemEnhancementEffect(oWeapon, fDuration, 3);
  187.             }
  188.             break;
  189.  
  190.         case SPELL_FLAME_WEAPON:
  191.             switch (GetAlignmentLawChaos(oCaster))
  192.             {
  193.                 case ALIGNMENT_LAWFUL:
  194.                     AddItemEnergyEffect(oWeapon, fDuration, IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGEBONUS_1d6);
  195.                     break;
  196.                 case ALIGNMENT_NEUTRAL:
  197.                     AddItemEnergyEffect(oWeapon, fDuration, IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEBONUS_2d4);
  198.                     break;
  199.                 case ALIGNMENT_CHAOTIC:
  200.                     AddItemEnergyEffect(oWeapon, fDuration, IP_CONST_DAMAGETYPE_ACID, IP_CONST_DAMAGEBONUS_1d6);
  201.                     break;
  202.             }
  203.             break;
  204.  
  205.         case SPELL_DARKFIRE:
  206.             switch (GetAlignmentGoodEvil(oCaster))
  207.             {
  208.                 case ALIGNMENT_GOOD:
  209.                     AddItemEnergyEffect(oWeapon, fDuration, IP_CONST_DAMAGETYPE_DIVINE, IP_CONST_DAMAGEBONUS_1d6);
  210.                     break;
  211.                 case ALIGNMENT_NEUTRAL:
  212.                     AddItemEnergyEffect(oWeapon, fDuration, IP_CONST_DAMAGETYPE_DIVINE, IP_CONST_DAMAGEBONUS_1d4);
  213.                     break;
  214.                 case ALIGNMENT_EVIL:
  215.                     AddItemEnergyEffect(oWeapon, fDuration, IP_CONST_DAMAGETYPE_DIVINE, IP_CONST_DAMAGEBONUS_1d6);
  216.                     break;
  217.             }
  218.             break;
  219.  
  220.         default: return;
  221.     }
  222.  
  223.     string sItemName = GetName(oItem);
  224.     if (GetIsObjectValid(oCreature) && oCreature != oCaster)
  225.     {
  226.         DelayCommand(1.0, FloatingTextStringOnCreature("You enchanted " + GetName(oCreature) + "'s " + sItemName, oCaster, FALSE));
  227.         DelayCommand(1.0, FloatingTextStringOnCreature(GetName(oCaster) + " enchanted your " + sItemName, oCreature, FALSE));
  228.     }
  229.     else if (oCreature == oCaster)
  230.         DelayCommand(1.0, FloatingTextStringOnCreature("You enchanted your " + sItemName, oCaster, FALSE));
  231.     else
  232.         DelayCommand(1.0, FloatingTextStringOnCreature("You enchanted the targeted " + sItemName, oCaster, FALSE));
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement