Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
		
			
				
	
	
		
			184 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | |
| //:: 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
 | |
| //:: Updated On: Jul 25, 2003 - Georg Zoeller
 | |
| //:://////////////////////////////////////////////
 | |
| #include "prc_alterations"
 | |
| #include "X0_INC_HENAI"
 | |
| #include "X2_INC_SUMMSCALE"
 | |
| 
 | |
| #include "X2_INC_SPELLHOOK"
 | |
| void main()
 | |
| {
 | |
|     // checks NPC ammo and refills if they are empty.
 | |
|     object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, OBJECT_SELF);
 | |
|     if( GetBaseItemType(oItem) == BASE_ITEM_THROWINGAXE )
 | |
|     {
 | |
|         if( GetItemStackSize(oItem) < 50)
 | |
|         {
 | |
|             SetItemStackSize(oItem, 50);
 | |
|             //FloatingTextStringOnCreature("Stack Size set to 50", OBJECT_SELF, TRUE);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     //SpawnScriptDebugger();
 | |
| 
 | |
|     // GZ: Fallback for timing issue sometimes preventing epic summoned creatures from leveling up to their master's level.
 | |
|     // There is a timing issue with the GetMaster() function not returning the fof a creature
 | |
|     // immediately after spawn. Some code which might appear to make no sense has been added
 | |
|     // to the nw_ch_ac1 and x2_inc_summon files to work around this
 | |
|     // This code is only run at the first hearbeat
 | |
|     int nLevel =SSMGetSummonFailedLevelUp(OBJECT_SELF);
 | |
|     if (nLevel != 0)
 | |
|     {
 | |
|         int nRet;
 | |
|         if (nLevel == -1) // special shadowlord treatment
 | |
|         {
 | |
|           SSMScaleEpicShadowLord(OBJECT_SELF);
 | |
|         }
 | |
|         else if  (nLevel == -2)
 | |
|         {
 | |
|           SSMScaleEpicFiendishServant(OBJECT_SELF);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             nRet = SSMLevelUpCreature(OBJECT_SELF, nLevel, CLASS_TYPE_INVALID);
 | |
|             if (nRet == FALSE)
 | |
|             {
 | |
|                 WriteTimestampedLogEntry("WARNING - nw_ch_ac1:: could not level up " + GetTag(OBJECT_SELF) + "!");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // regardless if the actual levelup worked, we give up here, because we do not
 | |
|         // want to run through this script more than once.
 | |
|         SSMSetSummonLevelUpOK(OBJECT_SELF);
 | |
|     }
 | |
| 
 | |
|     // Check if concentration is required to maintain this creature
 | |
|     X2DoBreakConcentrationCheck();
 | |
| 
 | |
|     object oMaster = GetMaster();
 | |
|     if(!GetAssociateState(NW_ASC_IS_BUSY))
 | |
|     {
 | |
| 
 | |
|         //Seek out and disable undisabled traps
 | |
|         object oTrap = GetNearestTrapToObject();
 | |
|         if (bkAttemptToDisarmTrap(oTrap) == TRUE) return ; // succesful trap found and disarmed
 | |
| 
 | |
|         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 (GetIsObjectValid(oMaster) == TRUE)
 | |
|                 {
 | |
|                     if(GetDistanceToObject(oMaster) > 6.0)
 | |
|                     {
 | |
|                         if(GetAssociateState(NW_ASC_HAVE_MASTER))
 | |
|                         {
 | |
|                             if(!PRCGetIsFighting())
 | |
|                             {
 | |
|                                 if(!GetAssociateState(NW_ASC_MODE_STAND_GROUND))
 | |
|                                 {
 | |
|                                     if(GetDistanceToObject(GetMaster()) > GetFollowDistance())
 | |
|                                     {
 | |
|                                         ClearActions(CLEAR_NW_CH_AC1_49);
 | |
|                                         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)
 | |
|                         {
 | |
|                             ClearActions(CLEAR_NW_CH_AC1_81);
 | |
|                             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 I am dominated, ask for some help
 | |
|         if (PRCGetHasEffect(EFFECT_TYPE_DOMINATED, OBJECT_SELF) == TRUE && GetIsEncounterCreature(OBJECT_SELF) == FALSE)
 | |
|         {
 | |
|             SendForHelp();
 | |
|         }
 | |
| 
 | |
|         if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))
 | |
|         {
 | |
|             SignalEvent(OBJECT_SELF, EventUserDefined(1001));
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |