Author Sticky: Post Working Scripts Here
Lord Shonsu Posted: Thursday, 04 July 08:15PM
1. Script Name: An updated Henchman Party Healer

2. What it does: This is a much improved version of the script I posted earlier.

3. Notes: The previous version had a bug where the Henchman would only use the "Heal" spell. This one uses all spells correctly. I still don't have it able to use Spontaneous Casting yet so all healing spells that you want it to use must be memorized.

This version also uses the Henchman's HeartBeat event instead of the Module's.

4. The Script itself:


Put this into the Henchman's HeartBeat event:
NWScript:
//::///////////////////////////////////////////////

//:: Associate: Heartbeat

//:: NW_CH_AC1.nss

//:: Copyright (c) 2001 Bioware Corp.

//:://////////////////////////////////////////////

/*

    Move towards master or wait for him

*/

//:://////////////////////////////////////////////

//:: Created By: Preston Watamaniuk

//:: Created On: Nov 21, 2001

//:://////////////////////////////////////////////

//:: 7/3/02 - Lord Shonsu

//:: Added code to make Henchman heal all party

//:: members when they hit 75% Hit Points

//:://////////////////////////////////////////////

#include "NW_I0_GENERIC"

void main()

{

object oPC = GetMaster (OBJECT_SELF);

object oParty = GetFirstFactionMember (oPC, TRUE);

while (GetIsObjectValid (oParty))

{

    int HPMax = GetMaxHitPoints (oParty);

    int HPCurrent =  GetCurrentHitPoints (oParty);

    if(HPCurrent < ((HPMax/4)*3))

    {

       if (GetHasSpell (SPELL_HEAL, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_HEAL, oParty, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_CRITICAL_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_CRITICAL_WOUNDS, oParty, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_SERIOUS_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_SERIOUS_WOUNDS, oParty, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_MODERATE_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_MODERATE_WOUNDS, oParty, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_LIGHT_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_LIGHT_WOUNDS, oParty, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

    }

    oParty = GetNextFactionMember (oPC, TRUE);

}

object oHench = GetFirstFactionMember (oPC, FALSE);

while (GetIsObjectValid (oHench))

{

    int HPMax = GetMaxHitPoints (oHench);

    int HPCurrent =  GetCurrentHitPoints (oHench);

    if(HPCurrent < ((HPMax/4)*3))

    {

       if (GetHasSpell (SPELL_HEAL, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_HEAL, oHench, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_CRITICAL_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_CRITICAL_WOUNDS, oHench, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_SERIOUS_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_SERIOUS_WOUNDS, oHench, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_MODERATE_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_MODERATE_WOUNDS, oHench, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

       if (GetHasSpell (SPELL_CURE_LIGHT_WOUNDS, OBJECT_SELF))

       {

            ActionCastSpellAtObject (SPELL_CURE_LIGHT_WOUNDS, oHench, METAMAGIC_ANY, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);

            return;

       }

    }

    oHench = GetNextFactionMember (oPC, FALSE);

}

    if(!GetAssociateState (NW_ASC_IS_BUSY))

    {

        object oMaster = GetMaster();

        //Seek out and disable undisabled traps

        object oTrap = GetNearestTrapToObject();

        if(GetIsObjectValid(oTrap) && GetDistanceToObject (oTrap) < 15.0 && GetDistanceToObject (oTrap) > 0.0)

        {

            object oTrapSaved = GetLocalObject(OBJECT_SELF, "NW_ASSOCIATES_LAST_TRAP");

            int nTrapDC = GetTrapDisarmDC (oTrap);

            int nSkill = GetSkillRank(SKILL_DISABLE_TRAP);

            nSkill = nSkill + 20 - nTrapDC;

            if(nSkill > 0 && GetSkillRank(SKILL_DISABLE_TRAP) > 0)

            {

                if( GetIsObjectValid (oMaster)

                    && nSkill > 0

                    && !IsInConversation (OBJECT_SELF)

                    && !GetIsInCombat()

                    && GetCurrentAction (OBJECT_SELF) != ACTION_REST

                    && GetCurrentAction (OBJECT_SELF) != ACTION_DISABLETRAP)

                {

                    ClearAllActions();

                    ActionUseSkill (SKILL_DISABLE_TRAP, oTrap);

                    ActionDoCommand (SetCommandable(TRUE));

                    ActionDoCommand (PlayVoiceChat (VOICE_CHAT_TASKCOMPLETE));

                    SetCommandable(FALSE);

                    return;

                }

            }

            else if(oTrap != oTrapSaved && GetSkillRank (SKILL_DISABLE_TRAP) > 0)

            {

                PlayVoiceChat (VOICE_CHAT_CANTDO);

                SetLocalObject (OBJECT_SELF, "NW_ASSOCIATES_LAST_TRAP", oTrap);

            }

        }

        if(GetIsObjectValid (oMaster) &&

            GetCurrentAction (OBJECT_SELF) != ACTION_FOLLOW &&

            GetCurrentAction (OBJECT_SELF) != ACTION_DISABLETRAP &&

            GetCurrentAction (OBJECT_SELF) != ACTION_OPENLOCK &&

            GetCurrentAction (OBJECT_SELF) != ACTION_REST &&

            GetCurrentAction (OBJECT_SELF) != ACTION_ATTACKOBJECT)

        {

            if(

               !GetIsObjectValid (GetAttackTarget()) &&

               !GetIsObjectValid (GetAttemptedSpellTarget()) &&

               !GetIsObjectValid (GetAttemptedAttackTarget()) &&

               !GetIsObjectValid (GetNearestCreature (CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN))

              )

            {

                if (GetDistanceToObject (GetMaster()) > 6.0)

                {

                    if(GetAssociateState (NW_ASC_HAVE_MASTER))

                    {

                        if(!GetIsFighting (OBJECT_SELF))

                        {

                            if(!GetAssociateState (NW_ASC_MODE_STAND_GROUND))

                            {

                                if(GetDistanceToObject (GetMaster()) > GetFollowDistance())

                                {

                                    ClearAllActions();

                                    if(GetAssociateState (NW_ASC_AGGRESSIVE_STEALTH) || GetAssociateState (NW_ASC_AGGRESSIVE_SEARCH))

                                    {

                                         if (GetAssociateState(NW_ASC_AGGRESSIVE_STEALTH))

                                         {

                                            //ActionUseSkill (SKILL_HIDE, OBJECT_SELF);

                                            //ActionUseSkill (SKILL_MOVE_SILENTLY,OBJECT_SELF);

                                         }

                                         if(GetAssociateState (NW_ASC_AGGRESSIVE_SEARCH))

                                         {

                                            ActionUseSkill (SKILL_SEARCH, OBJECT_SELF);

                                         }

                                         MyPrintString("GENERIC SCRIPT DEBUG STRING ********** " + "Assigning Force Follow Command with Search and/or Stealth");

                                         ActionForceFollowObject (oMaster, GetFollowDistance());

                                    }

                                    else

                                    {

                                         MyPrintString ("GENERIC SCRIPT DEBUG STRING ********** " + "Assigning Force Follow Normal");

                                         ActionForceFollowObject (oMaster, GetFollowDistance());

                                         //ActionForceMoveToObject (GetMaster(), TRUE, GetFollowDistance(), 5.0);

                                    }

                                }

                            }

                        }

                    }

                }

                else if(!GetAssociateState (NW_ASC_MODE_STAND_GROUND))

                {

                    if(GetIsObjectValid (oMaster))

                    {

                        if(GetCurrentAction (oMaster) != ACTION_REST)

                        {

                            ClearAllActions();

                            if(GetAssociateState (NW_ASC_AGGRESSIVE_STEALTH) || GetAssociateState (NW_ASC_AGGRESSIVE_SEARCH))

                            {

                                 if(GetAssociateState (NW_ASC_AGGRESSIVE_STEALTH))

                                 {

                                    //ActionUseSkill (SKILL_HIDE, OBJECT_SELF);

                                    //ActionUseSkill (SKILL_MOVE_SILENTLY,OBJECT_SELF);

                                 }

                                 if(GetAssociateState (NW_ASC_AGGRESSIVE_SEARCH))

                                 {

                                    ActionUseSkill (SKILL_SEARCH, OBJECT_SELF);

                                 }

                                 MyPrintString ("GENERIC SCRIPT DEBUG STRING ********** " + "Assigning Force Follow Command with Search and/or Stealth");

                                 ActionForceFollowObject (oMaster, GetFollowDistance());

                            }

                            else

                            {

                                 MyPrintString ("GENERIC SCRIPT DEBUG STRING ********** " + "Assigning Force Follow Normal");

                                 ActionForceFollowObject (oMaster, GetFollowDistance());

                            }

                        }

                    }

                }

            }

            else if(!GetIsObjectValid (GetAttackTarget()) &&

               !GetIsObjectValid (GetAttemptedSpellTarget()) &&

               !GetIsObjectValid (GetAttemptedAttackTarget()) &&

               !GetAssociateState (NW_ASC_MODE_STAND_GROUND))

            {

                //DetermineCombatRound();

            }

        }

        if(GetSpawnInCondition (NW_FLAG_HEARTBEAT_EVENT))

        {

            SignalEvent (OBJECT_SELF, EventUserDefined(1001));

        }

    }

}



_________________
Lord Shonsu - Swordsman of the Seventh