//::////////////////////////////////////////////////// //:: X0_CH_HEN_CONV /* OnDialogue event handler for henchmen/associates. This is used by the Cohorts for the PRC to trigger a generic henchman conversation */ //::////////////////////////////////////////////////// //:: Copyright (c) 2002 Floodgate Entertainment //:: Created By: Naomi Novik //:: Created On: 01/05/2003 //::////////////////////////////////////////////////// #include "prc_alterations" #include "inc_dynconv" #include "x0_inc_henai" #include "x0_i0_henchman" //* GeorgZ - Put in a fix for henchmen talking even if they are petrified int AbleToTalk(object oSelf) { if (PRCGetHasEffect(EFFECT_TYPE_CONFUSED, oSelf) || PRCGetHasEffect(EFFECT_TYPE_DOMINATED, oSelf) || PRCGetHasEffect(EFFECT_TYPE_PETRIFY, oSelf) || PRCGetHasEffect(EFFECT_TYPE_PARALYZE, oSelf) || PRCGetHasEffect(EFFECT_TYPE_STUNNED, oSelf) || PRCGetHasEffect(EFFECT_TYPE_FRIGHTENED, oSelf) ) { return FALSE; } return TRUE; } void main() { // * XP2, special handling code for interjections // * This script only fires if someone inits with me. // * with that in mind, I am now clearing any interjections // * that the character might have on themselves. if (GetLocalInt(GetModule(), "X2_L_XP2") == TRUE) { SetLocalInt(OBJECT_SELF, "X2_BANTER_TRY", 0); SetHasInterjection(GetMaster(OBJECT_SELF), FALSE); SetLocalInt(OBJECT_SELF, "X0_L_BUSY_SPEAKING_ONE_LINER", 0); SetOneLiner(FALSE, 0); } object oShouter = GetLastSpeaker(); // int i = GetLocalInt(OBJECT_SELF, sAssociateMasterConditionVarname); // SendMessageToPC(GetFirstPC(), IntToHexString(i)); if (GetIsHenchmanDying() == TRUE) { return; } object oMaster = GetMaster(); int nMatch = GetListenPatternNumber(); object oIntruder; if (nMatch == -1) { // * September 2 2003 // * Added the GetIsCommandable check back in so that // * Henchman cannot be interrupted when they are walking away if (GetCommandable(OBJECT_SELF) == TRUE && AbleToTalk(OBJECT_SELF) && (GetCurrentAction() != ACTION_OPENLOCK)) { //SetCommandable(TRUE); ClearActions(CLEAR_X0_CH_HEN_CONV_26); //PRC CHANGE //BeginConversation("prc_cohort"); //use a dynamic conversation instead // Make sure we're not already inside the dynconvo if(!GetLocalInt(OBJECT_SELF, "PRC_InCohortConvoMarker")) { SetLocalInt(OBJECT_SELF, "PRC_InCohortConvoMarker", TRUE); StartDynamicConversation("prc_cohort_convo", oShouter, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, TRUE, FALSE, OBJECT_SELF); } //PRC CHANGE } } else { // listening pattern matched if (GetIsObjectValid(oMaster)) { // we have a master, only listen to them // * Nov 2003 - Added an AbleToTalk, so that henchmen // * do not respond to orders when 'frozen' if (GetIsObjectValid(oShouter) && oMaster == oShouter && AbleToTalk(OBJECT_SELF)) { SetCommandable(TRUE); bkRespondToHenchmenShout(oShouter, nMatch, oIntruder); } } // we don't have a master, behave in default way else if (GetIsObjectValid(oShouter) && !GetIsPC(oShouter) && GetIsFriend(oShouter)) { object oIntruder = OBJECT_INVALID; // Determine the intruder if any if(nMatch == 4) { oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER"); } else if (nMatch == 5) { oIntruder = GetLastHostileActor(oShouter); if(!GetIsObjectValid(oIntruder)) { oIntruder = GetAttemptedAttackTarget(); if(!GetIsObjectValid(oIntruder)) { oIntruder = GetAttemptedSpellTarget(); } } } // Actually respond to the shout RespondToShout(oShouter, nMatch, oIntruder); } } // Signal user-defined event if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE)); } }