//:://///////////////////////////////////////////// //:: 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 "X0_INC_HENAI" #include "X2_INC_SUMMSCALE" #include "inc_utility" #include "X2_INC_SPELLHOOK" void main() { //SpawnScriptDebugger(); // Don't do anything if we have have been recently commanded QWE if (GetLocalInt(OBJECT_SELF, "commandstatus")) { return; } // 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(!GetIsFighting(OBJECT_SELF)) { 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)); } } }