Amon_PRC8/_module/nss/ox_on_spell.nss
Jaysyn904 c5cffc37af Initial Commit
Initial Commit [v1.01]
2025-04-03 19:00:46 -04:00

190 lines
7.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Henchmen: On Spell Cast At
//:: NW_CH_ACB
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This determines if the spell just cast at the
target is harmful or not.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Dec 6, 2001
//:://////////////////////////////////////////////
#include "X0_INC_HENAI"
#include "x2_i0_spells"
void main()
{
//OXEN NO INVIS CODE
object oCaster = GetLastSpellCaster();
if (GetLastSpell() == SPELL_IMPROVED_INVISIBILITY || GetLastSpell() == SPELL_INVISIBILITY || GetLastSpell() == SPELL_INVISIBILITY_SPHERE)
{
RemoveSpellEffects(GetLastSpell(), oCaster, OBJECT_SELF);
SendMessageToPC (oCaster, "You may not invis an oxen");
}
//END OXEN NO INVIS CODE
// **************************************
// * CHAPTER 1
// * Player brings back a dead henchmen
// * for the first time
// *
// **************************************
//This should only fire the first time they are raised - when they have
//first been discovered in Undermountain
if (GetLocalInt(OBJECT_SELF, "X2_SavedInUndermountain") == FALSE && GetTag(GetModule()) == "x0_module1")
{
if (GetLastSpell() == SPELL_RAISE_DEAD || GetLastSpell() == SPELL_RESURRECTION)
{
SetLocalInt(OBJECT_SELF, "X2_SavedInUndermountain", 1);
object oPC = oCaster;
if (GetTag(OBJECT_SELF) == "x2_hen_sharwyn")
{
AddJournalQuestEntry("q2sharwyn", 20, oPC);
}
else if (GetTag(OBJECT_SELF) == "x2_hen_tomi")
{
AddJournalQuestEntry("q2tomi", 20, oPC);
}
else if (GetTag(OBJECT_SELF) == "x2_hen_daelan")
{
AddJournalQuestEntry("q2daelan", 20, oPC);
}
if (GetHitDice(oPC) < 15)
{
Reward_2daXP(oPC, 12, TRUE); //600 xp reward if PC is less than 15th level
}
else
{
Reward_2daXP(oPC, 11, TRUE); //200 xp reward if PC is 15th level or higher
}
}
} // special case, first time being raised (if original henches
if(GetLastSpellHarmful())
{
// * GZ Oct 3, 2003
// * Really, the engine should handle this, but hey, this world is not perfect...
// * If I was hurt by my master or the creature hurting me has
// * the same master
// * Then clear any hostile feelings I have against them
// * After all, we're all just trying to do our job here
// * if we singe some eyebrow hair, oh well.
object oMyMaster = GetMaster(OBJECT_SELF);
if ((oMyMaster != OBJECT_INVALID) && (oMyMaster == oCaster || oMyMaster == GetMaster(oCaster) ))
{
ClearPersonalReputation(oCaster, OBJECT_SELF);
ClearAllActions(TRUE);
DelayCommand(1.2, ActionDoCommand(HenchmenCombatRound(OBJECT_INVALID)));
// Send the user-defined event as appropriate
if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_SPELL_CAST_AT));
}
return;
}
SetCommandable(TRUE);
int bAttack = TRUE;
// * AOE Behavior
if (MatchAreaOfEffectSpell(GetLastSpell()) == TRUE)
{
//* GZ 2003-Oct-02 : New AoE Behavior AI
int nAI = (GetBestAOEBehavior(GetLastSpell()));
switch (nAI)
{
case X2_SPELL_AOEBEHAVIOR_DISPEL_L:
case X2_SPELL_AOEBEHAVIOR_DISPEL_N:
case X2_SPELL_AOEBEHAVIOR_DISPEL_M:
case X2_SPELL_AOEBEHAVIOR_DISPEL_G:
case X2_SPELL_AOEBEHAVIOR_DISPEL_C:
bAttack = FALSE;
ActionCastSpellAtLocation(nAI, GetLocation(OBJECT_SELF));
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
break;
case X2_SPELL_AOEBEHAVIOR_FLEE:
ClearActions(CLEAR_NW_C2_DEFAULTB_GUSTWIND);
ActionForceMoveToObject(oCaster, TRUE, 2.0);
ActionMoveToObject(GetMaster(), TRUE, 1.1);
DelayCommand(1.2, ActionDoCommand(HenchmenCombatRound(OBJECT_INVALID)));
bAttack = FALSE;
break;
case X2_SPELL_AOEBEHAVIOR_IGNORE:
// well ... nothing
break;
case X2_SPELL_AOEBEHAVIOR_GUST:
ActionCastSpellAtLocation(SPELL_GUST_OF_WIND, GetLocation(OBJECT_SELF));
ActionDoCommand(SetCommandable(TRUE));
SetCommandable(FALSE);
bAttack = FALSE;
break;
}
}
if(
(!GetIsObjectValid(GetAttackTarget()) &&
!GetIsObjectValid(GetAttemptedSpellTarget()) &&
!GetIsObjectValid(GetAttemptedAttackTarget()) &&
!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)) &&
!GetIsFriend(oCaster)) && bAttack
)
{
SetCommandable(TRUE);
//Shout Attack my target, only works with the On Spawn In setup
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
//Shout that I was attacked
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
HenchmenCombatRound(oCaster);
}
}
// * Make a henchman initiate with the player if they've just been raised or resurrected
else if(GetLastSpell() == SPELL_RAISE_DEAD || GetLastSpell() == SPELL_RESURRECTION)
{
// * restore merchant faction to neutral
SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 100, oCaster);
SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 100, oCaster);
SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 100, oCaster);
ClearPersonalReputation(oCaster, OBJECT_SELF);
AssignCommand(OBJECT_SELF, SurrenderToEnemies());
object oHench = OBJECT_SELF;
AssignCommand(oHench, ClearAllActions(TRUE));
string sFile = GetDialogFileToUse(oCaster);
// * reset henchmen attack state - Oct 28 (BK)
SetAssociateState(NW_ASC_MODE_DEFEND_MASTER, FALSE, oHench);
SetAssociateState(NW_ASC_MODE_STAND_GROUND, FALSE, oHench);
// * Oct 30 - If player previously hired this hench
// * then just have them rejoin automatically
if (GetPlayerHasHired(oCaster, oHench) == TRUE)
{
HireHenchman(oCaster, oHench, TRUE);
}
// * otherwise, they talk
else
{
AssignCommand(oCaster, ActionStartConversation(oHench, sFile));
}
}
}