CoPaP Forum Index CoPaP
 A community of linked Neverwinter Nights worlds. 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 
 RegisterRegister   Log inLog in 
The time now is Sun Oct 20, 2019 12:00 pm
All times are UTC - 5
View posts since last visit
View unanswered posts
 Forum index » General Forums » Scripters and Coders' Forum
Fix for Weird, Wail, Phantasmal Killer Ignoring Imm and Will
Post new topic   Reply to topic View previous topicView next topic
Page 1 of 1 [1 Post]  
Author Message
Arkonswrath
Ambassador: Hala


Joined: 26 May 2004
Posts: 451
 Fix for Weird, Wail, Phantasmal Killer Ignoring Imm and Will

The following code updates were put in and tested on Hala and proven to be working.

This is the code for Wail that makes it respect Death Immunity

Code:
case SPELL_WAIL_OF_THE_BANSHEE:
        //::///////////////////////////////////////////////
        //:: Wail of the Banshee
        //:: NW_S0_WailBansh
        //:: Copyright (c) 2001 Bioware Corp.
        //:://////////////////////////////////////////////
        //
        // * You emit a terrible scream that kills enemy creatures who hear it
        // * The spell affects up to one creature per caster level. Creatures
        // * closest to the point of origin are affected first.
        //
        //:://////////////////////////////////////////////
        //:: Last Updated By: Aloro
        //::                    Added creation of death variable.  Removed visual effects.
        //::                  Doug Noel - July 28, 2004
        //::                    Added to Avlis spellhook script.
        //:://////////////////////////////////////////////
        {
        //Declare major variables
        effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
        effect eLink = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES);
        location lCenter = lTarget;
        int iCount = 1;
        float fDelay, fTargetDistance;

        //Apply the FNF VFX impact
        ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eLink, GetSpellTargetLocation());
        //Get the closet target from the spell target location

        if (!GetIsObjectValid(oTarget))
          oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, GetSpellTargetLocation(), iCount);
        while (iCount < iLevel)
        {
            lTarget = GetLocation(oTarget);
            //Get the distance of the target from the center of the effect
            fDelay = GetRandomDelay(3.0, 4.0);//
            fTargetDistance = GetDistanceBetweenLocations(lCenter, lTarget);
            //Check that the current target is valid and closer than 10.0m
            if(GetIsObjectValid(oTarget) && fTargetDistance <= 10.0)
            {
                if(!GetIsFriend(oTarget) && !GetIsReactionTypeFriendly(oTarget))
                {
                    //Fire cast spell at event for the specified target
                    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_WAIL_OF_THE_BANSHEE));
                    //Make SR check
                    //Don't do anything if the target has death immunity
                    if(GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH) == TRUE)
                    {
                    }
                    if(GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH) == FALSE)
                    {
                    if(!MyResistSpell(OBJECT_SELF, oTarget)) //, 0.1))
                    {
                        //Make a fortitude save to avoid death
                        if(!MySavingThrow(SAVING_THROW_FORT, oTarget, iSpellDC, SAVING_THROW_TYPE_DEATH)) //, OBJECT_SELF, 3.0))
                        {
                            //Apply the delay VFX impact and death effect
                            SetLocalInt(oTarget, "InDying", TRUE);
                            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
                            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget)); // no delay
                        }
                    }
                    }
                }
            }
            else
            {
                //Kick out of the loop
                iCount = iLevel;
            }
            //Increment the count of creatures targeted
            iCount++;
            //Get the next closest target in the spell target location.
            oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lCenter, iCount);
        }

        SetModuleOverrideSpellScriptFinished();
        break;
        }




Here is the code for Phantasmal Killer to make it respect Imm Mind/Fear and accept the Will save as it should.

Code:
        case SPELL_PHANTASMAL_KILLER:

        //::///////////////////////////////////////////////
        //:: Phantasmal Killer
        //:: NW_S0_PhantKill
        //:://////////////////////////////////////////////
        //
        // * Target of the spell must make 2 saves or die.
        //
        //:://////////////////////////////////////////////
        //:: Last Updated By: Aloro
        //:: - Added variable for death quests and to prevent server-hopping
        //::   when dead.  Removed visual effects.
        //:: Doug Noel - July 27, 2004
        //:: - Added to Avlis spellhook script.
        //:: Doug Noel - February 26, 2005 (v 1.5.1)
        //:: - Changed to only work on creatures.  Will no longer work on any
        //::   object that can be targeted.
        //:://////////////////////////////////////////////
        {
        //Declare major variables
        int iDamage = d6(3);
        effect eVis = EffectVisualEffect(VFX_IMP_SONIC);
        if(!GetIsReactionTypeFriendly(oTarget) && GetObjectType(oTarget) == OBJECT_TYPE_CREATURE) //Creatures Only - DN 2/26/05
        {
            //Fire cast spell at event for the specified target
            SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_PHANTASMAL_KILLER));
            //Make an SR check
            if(!MyResistSpell(OBJECT_SELF, oTarget))
             {
             if ( !GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) &&
                  !GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR))
               {
                //Make a Will save
                if (!MySavingThrow(SAVING_THROW_WILL,  oTarget, iSpellDC, SAVING_THROW_TYPE_MIND_SPELLS))
                {
                    //Make a Fort save
                    if (MySavingThrow(SAVING_THROW_FORT, oTarget, iSpellDC,SAVING_THROW_TYPE_DEATH))
                    {
                         //Check for metamagic
                         if (GetWasMetamagicFeatUsed(iMeta, METAMAGIC_MAXIMIZE))
                            iDamage = 18;
                         if (GetWasMetamagicFeatUsed(iMeta, METAMAGIC_EMPOWER))
                            iDamage = FloatToInt( IntToFloat(iDamage) * 1.5 );
                         //Set the damage property
                         effect eLink = EffectDamage(iDamage, DAMAGE_TYPE_MAGICAL);
                         //Apply the damage effect and VFX impact
                         ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
                         ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
                    }
                    else
                    {
                     // * I failed BOTH saving throws. Now I die.
                     if(GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR) == TRUE){}
                     if(GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR) == FALSE)
                       {
                         if(GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) == FALSE)
                         //Apply the death effect and VFX impact
                         SetLocalInt(oTarget, "InDying", TRUE);
                         ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget);
                       }
                    }
                  }
               }
            }
        }

        SetModuleOverrideSpellScriptFinished();
        break;
        }


And last but not least, Here is the code to make Weird respect Imm Mind/Fear and respect the Will save.

Code:
        case SPELL_WEIRD:
        //::///////////////////////////////////////////////
        //:: Weird
        //:: NW_S0_Weird
        //:: Copyright (c) 2001 Bioware Corp.
        //:://////////////////////////////////////////////
        //
        // * All enemies in LOS of the spell must make 2 saves or die.
        //
        //:://////////////////////////////////////////////
        //:: Last Updated By: Aloro
        //::                    Added creation of death variable.  Removed visual effects.
        //::                  Doug Noel - July 28, 2004
        //::                    Added to Avlis spellhook script.
        //:://////////////////////////////////////////////
        {
        //Declare major variables
        effect eVis = EffectVisualEffect(VFX_IMP_SONIC);
        effect eLink = EffectVisualEffect(VFX_FNF_WEIRD);
        float fDelay;
        int iDamage;

        //Apply the FNF VFX impact
        ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eLink, GetSpellTargetLocation());
        //Get the first target in the spell area
        oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetSpellTargetLocation(), TRUE);
        while (GetIsObjectValid(oTarget))
        {
            //Make a faction check
            if(!GetIsFriend(oTarget))
            {
                   fDelay = GetRandomDelay(3.0, 4.0);
                   //Fire cast spell at event for the specified target
                   SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_WEIRD));
                   //Make an SR Check
                   if(!MyResistSpell(OBJECT_SELF, oTarget, fDelay))
                   {
                     if ( !GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) &&
                          !GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR))
                      {
                        if(GetHitDice(oTarget) >= 4)
                        {
                            //Make a Will save against mind-affecting
                            if(!MySavingThrow(SAVING_THROW_WILL, oTarget, iSpellDC, SAVING_THROW_TYPE_MIND_SPELLS, OBJECT_SELF, fDelay))
                            {
                                //Make a fortitude save against death
                                if(MySavingThrow(SAVING_THROW_FORT, oTarget, iSpellDC, SAVING_THROW_TYPE_DEATH, OBJECT_SELF, fDelay))
                                {
                                    //Roll damage
                                    iDamage = d6(3);
                                    //Make metamagic check
                                    if (GetWasMetamagicFeatUsed(iMeta, METAMAGIC_MAXIMIZE))
                                        iDamage = 18;
                                    if (GetWasMetamagicFeatUsed(iMeta, METAMAGIC_EMPOWER))
                                        iDamage = FloatToInt( IntToFloat(iDamage) * 1.5 );
                                    //Set damage effect
                                    eLink = EffectDamage(iDamage, DAMAGE_TYPE_MAGICAL);
                                    //Apply VFX Impact and damage effect
                                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
                                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget));
                                }
                                else
                                {
                                    //Apply VFX impact and death effect
                                    //DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget));
                                    SetLocalInt(oTarget, "InDying", TRUE);
                                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
                                }
                            }
                        }
                        else
                        {
                         // * I failed BOTH saving throws. Now I die.
                         if(GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR) == TRUE){}
                         if(GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR) == FALSE)
                          {
                            if(GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) == FALSE)
                           {
                            //Apply VFX impact and death effect
                            eVis = EffectVisualEffect(VFX_IMP_DEATH);
                            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
                            SetLocalInt(oTarget, "InDying", TRUE);
                            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
                            }
                          }
                        }
                   }
                }
            }
            //Get next target in spell area
            oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetSpellTargetLocation(), TRUE);
        }

        SetModuleOverrideSpellScriptFinished();
        break;
        }


PostPosted: Sun Jan 15, 2006 9:27 pm
 View user's profile Send private message
Reply with quote Back to top 
Display posts from previous:   Sort by:   
Page 1 of 1 [1 Post]  
Post new topic   Reply to topic View previous topicView next topic
 Forum index » General Forums » Scripters and Coders' Forum
Jump to:  

You can post new topics in this forum
You can reply to topics in this forum
You can edit your posts in this forum
You can delete your posts in this forum
You can vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
[ Time: 0.3854s ][ Queries: 11 (0.3340s) ][ GZIP on - Debug on ]