176 lines
7.8 KiB
Plaintext
176 lines
7.8 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 "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));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|