//
// Check ability to talk
//
int bh_able_to_talk(object oNPC)
{
if (GetHasEffect(EFFECT_TYPE_CONFUSED, oNPC) || GetHasEffect(EFFECT_TYPE_DOMINATED, oNPC) ||
GetHasEffect(EFFECT_TYPE_PETRIFY, oNPC) || GetHasEffect(EFFECT_TYPE_PARALYZE, oNPC) ||
GetHasEffect(EFFECT_TYPE_STUNNED, oNPC) || GetHasEffect(EFFECT_TYPE_FRIGHTENED, oNPC))
return FALSE;
if (IsInConversation(oNPC)) return FALSE;
if (GetIsInCombat(oNPC)) return FALSE;
if (GetCommandable(oNPC) == FALSE) return FALSE;
if (GetStealthMode(oNPC) == STEALTH_MODE_ACTIVATED) return FALSE;
return TRUE;
}
// Force conversation
// This prevents Henchman AI from cancelling actions.
// If NPC is a henchman and conversation is not possible at present, add to message queue.
void bhForceTalk(object oNPC, object oPC, int nRun, string sConversation, int nJump, int nStealth=FALSE)
{
float fRange = 15.0;
if (GetLocalInt(oPC, "join" + GetTag(oNPC)))
{
fRange = 10.0;
if (!bh_able_to_talk(oNPC)|| !bh_able_to_talk(oPC))
{
bh_store_talk(oNPC, sConversation);
return;
}
}
if (nStealth && !bh_able_to_talk(oPC)) return;
SetCommandable(TRUE, oNPC);
ClearAllActions(TRUE);
AssignCommand(oPC, ClearAllActions(TRUE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneImmobilize(), oPC, 2.0);
if ((GetArea(oNPC) != GetArea(oPC))
|| (GetDistanceBetween(oPC, oNPC) > fRange))
{
if (nJump)
ActionJumpToLocation(GetLocation(oPC));
else
ActionMoveToObject(oPC, nRun, fRange);
}
ActionStartConversation(oPC, sConversation, FALSE, FALSE);
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
}