172 lines
7.5 KiB
Plaintext
172 lines
7.5 KiB
Plaintext
|
|
||
|
#include "X0_INC_HENAI"
|
||
|
#include "X2_INC_SUMMSCALE"
|
||
|
#include "X2_INC_SPELLHOOK"
|
||
|
|
||
|
void main()
|
||
|
|
||
|
{
|
||
|
|
||
|
object oTarget;
|
||
|
effect eVFX;
|
||
|
|
||
|
//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(!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 (GetHasEffect(EFFECT_TYPE_DOMINATED, OBJECT_SELF) == TRUE && GetIsEncounterCreature(OBJECT_SELF) == FALSE)
|
||
|
{
|
||
|
SendForHelp();
|
||
|
}
|
||
|
|
||
|
if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))
|
||
|
{
|
||
|
SignalEvent(OBJECT_SELF, EventUserDefined(1001));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Destroy an object (not fully effective until this script ends).
|
||
|
eVFX = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
|
||
|
oTarget = GetObjectByTag("uluhtc2");
|
||
|
DelayCommand(25.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oTarget));
|
||
|
DelayCommand(25.0, DestroyObject(oTarget, 3.0));
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|