All pastes #13374 Raw Edit

darkfire nwscript

public text v1 · immutable
#13374 ·published 2005-06-04 16:49 UTC
rendered paste body
#include "nw_i0_spells"
#include "x2_i0_spells"
#include "x2_inc_spellhook"

void main()
{
    if (!X2PreSpellCastCode())  //for spellhooking
        return;

    int nLevelCap = 10;
    //set to 10 for the better system with 1 additional damage every level until level 10
    //set to 20 for the old system with 1 additional damage every 2 levels until level 20
    //set to 30 for a weaker system with 1 additional damage every 3 levels until level 30

    int nDamType = IP_CONST_DAMAGETYPE_FIRE;
    int nItemEffect = ITEM_VISUAL_FIRE;
    int nVisEffect2 = VFX_IMP_PULSE_FIRE;
    int nVisEffect1 = VFX_IMP_FLAME_M;

    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
    int nCasterLvl = GetCasterLevel(OBJECT_SELF);
    int nDuration = 2 * nCasterLvl;
    int nMetaMagic = GetMetaMagicFeat();
    object oTarget = GetSpellTargetObject();

    if (nMetaMagic == METAMAGIC_EXTEND)
        nDuration = nDuration * 2; //Duration is +100%
    float fDuration = TurnsToSeconds(nDuration);

    if(nCasterLvl > nLevelCap)
        nCasterLvl = nLevelCap;
    nCasterLvl = FloatToInt(nCasterLvl / (IntToFloat(nLevelCap / 10)));

    int nDamConst = 3 + nCasterLvl;     //3 for "variable" damage (1d6), lv for add damage

    if (GetLastSpellCastClass() != CLASS_TYPE_CLERIC)   //if sorc/wiz -> flameweapon
        nDamConst -= 1;   //if wiz/sorc (1d4) -> 2 (1 less than cleric (1d6))

    //see iprp_damagecost.2da (because of bad table setup)
    //const 1-5 = 1-5 damage, const 16-30 = 6-20 damage,  const 6-15 variable damage
    if (nDamConst > 5)
        nDamConst += 10;

    object oMyWeapon;   //replaced original for my little improved check
    if (IPGetIsMeleeWeapon(oTarget))    //is weapon
        oMyWeapon = oTarget;

    else if (GetCreatureSize(oTarget) != CREATURE_SIZE_INVALID)     //is creature
    {
        object oRightWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);

        if (IPGetIsMeleeWeapon(oRightWeapon))   //has melee weapon in hand
            oMyWeapon = oRightWeapon;

        else    //sometimes players unequip weapon just before spell is cast at, this is a fix
        {
            oMyWeapon = GetLastWeaponUsed(oTarget);
            if (!IPGetIsMeleeWeapon(oMyWeapon))     //last weapon is no melee weapon (blind caster?)
                oMyWeapon = OBJECT_INVALID;
        }
    }
    else     //is no creature or player
        oMyWeapon = OBJECT_INVALID;


    if(GetIsObjectValid(oMyWeapon) )
    {
        itemproperty ipLoop=GetFirstItemProperty(oMyWeapon);
        while (GetIsItemPropertyValid(ipLoop))  //because same damage types don`t stack
        {
          if (GetItemPropertyType(ipLoop) == ITEM_PROPERTY_DAMAGE_BONUS)
          {
            if (GetItemPropertyDurationType(ipLoop) == DURATION_TYPE_PERMANENT)
            {
              int nSubType = GetItemPropertySubType(ipLoop);
              if (nSubType == nDamType)   //apply different damage if weapon already has the same
              {
                nDamType = IP_CONST_DAMAGETYPE_ELECTRICAL;
                nItemEffect = ITEM_VISUAL_ELECTRICAL;
                nVisEffect2 = VFX_IMP_PULSE_WIND;
                nVisEffect1 = VFX_IMP_LIGHTNING_S;
              }//if subtype
            }//if permanent
          }//if bonus
        ipLoop=GetNextItemProperty(oMyWeapon);
        }//while

        effect eVis1 = EffectVisualEffect(nVisEffect1);
        effect eVis2 = EffectVisualEffect(nVisEffect2);
        effect eVis = EffectLinkEffects(eVis1 ,eVis2);
        SignalEvent(GetItemPossessor(oMyWeapon), EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));

        if (nDuration>0)
        {
            ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, GetItemPossessor(oMyWeapon));
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, GetItemPossessor(oMyWeapon), fDuration);

            itemproperty ipElemDam = ItemPropertyDamageBonus(nDamType, nDamConst);
            IPSafeAddItemProperty(oMyWeapon, ipElemDam, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);

            itemproperty ipElemVis = ItemPropertyVisualEffect(nItemEffect);
            IPSafeAddItemProperty(oMyWeapon, ipElemVis, fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE);
        }//if duration
    }//if valid
    else
        FloatingTextStrRefOnCreature(83615, OBJECT_SELF);
}//by Master Lexx