// Include for heartbeat // Animations: // Randomwalk normally, or move to nearest ally. int AMBIENT_ANIMATIONS = 1; // These will face nearest ally, and talk or laugh. If no ally then look right/left. int IMMOBILE_AMBIENT_ANIMATIONS = 2; // This is the bird animations. int AMBIENT_ANIMATIONS_AVIAN = 3; // This will make the creatures "group" and sit, and normally talk. int AMBIENT_GROUP_ANIMATIONS = 4; // This will make the creature talk with nearby allies, as to not look dead. // Also, if alone, it will take drinks, and things like that. int IMMOBILE_ANIMATIONS_AND_SOLO = 5; // This is a consitution for just random walking, nothing else. int AMBIENT_ANIMAL_WALKING = 6; // Used for fast buffing int NW_FLAG_FAST_BUFF_ENEMY = 0x04000000; // Tracks day/night. int TRACK_DAY_NIGHT = 0x20000000; // Heartbeat event. int NW_FLAG_HEARTBEAT_EVENT = 0x00100000; // Just a handy string. string AI_ANIMATIONS = "AI_ANIMATIONS"; //AMBIENT ANIMATION COMMANDS // Plays animations! If any set. void PlayAllAnimations(); // Returns True if the specific int is there. int GetSpawnInCondition(int nCondition); // Sets all Spawn in Stuff, as Hexidcimals (like SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET);) void SetSpawnInCondition(int nCondition, int bValid = TRUE); // TRUE if walking waypoints. int GetIsPostOrWalking(object oWalker = OBJECT_SELF); // Advance buff, checked in heartbeat. int TalentAdvancedBuff(float fDistance); // Equip the weapon appropriate to enemy and position void EquipAppropriateWeapons(object oTarget); // Used to set and get conditions. void SetSpawnInCondition(int nCondition, int bValid = TRUE) { int nPlot = GetLocalInt(OBJECT_SELF, "NW_GENERIC_MASTER"); if(bValid == TRUE) { nPlot = nPlot | nCondition; SetLocalInt(OBJECT_SELF, "NW_GENERIC_MASTER", nPlot); } else if (bValid == FALSE) { nPlot = nPlot & ~nCondition; SetLocalInt(OBJECT_SELF, "NW_GENERIC_MASTER", nPlot); } } int GetSpawnInCondition(int nCondition) { int nPlot = GetLocalInt(OBJECT_SELF, "NW_GENERIC_MASTER"); if(nPlot & nCondition) { return TRUE; } return FALSE; } //:://///////////////////////////////////////////// //:: Check for Walkways //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// int GetIsPostOrWalking(object oWalker = OBJECT_SELF) { string sTag = GetTag(oWalker); object oPost = GetWaypointByTag("POST_" + sTag); if(!GetIsObjectValid(oPost)) { oPost = GetWaypointByTag("NIGHT_" + sTag); if(!GetIsObjectValid(oPost)) { oPost = GetWaypointByTag("WP_" + sTag + "_01"); if(!GetIsObjectValid(oPost)) { oPost = GetWaypointByTag("WN_" + sTag + "_01"); if(!GetIsObjectValid(oPost)) { return FALSE; } } } } return TRUE; } /*:://///////////////////////////////////////////// //:: Play Animations //:://///////////////////////////////////////////// This will play one of the 5 animations possible. //:://///////////////////////////////////////////*/ void PlayAnimations() { vector vFrnd; int nRoll; object oFriend = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, OBJECT_SELF, nRoll, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN); int iAnimations = GetLocalInt(OBJECT_SELF, "ANIMATIONS"); switch (iAnimations) { case (1):// AMBIENT_ANIMATIONS { /* Use this animation for all player races and humanoids who are civilized. Monstrous races will wonder about and try to look busy in as non-social manner. */ int iRace = GetRacialType(OBJECT_SELF); if(GetIsPlayableRacialType(OBJECT_SELF) || iRace == RACIAL_TYPE_HUMANOID_GOBLINOID || iRace == RACIAL_TYPE_HUMANOID_REPTILIAN || iRace == RACIAL_TYPE_HUMANOID_ORC) { nRoll = d6(); if(nRoll == 4 || nRoll == 5) { ClearAllActions(); ActionRandomWalk(); } else { if(!GetIsObjectValid(oFriend) || GetIsPC(oFriend) || GetIsDM(oFriend) || IsInConversation(oFriend)) { ClearAllActions(); ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.75); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.75)); } else { if(GetDistanceToObject(oFriend) >= 3.0 && GetDistanceToObject(oFriend) <= 5.0) { ClearAllActions(); ActionMoveToObject(oFriend, FALSE, 2.0); } else if(GetDistanceToObject(oFriend) >= 5.0) { ClearAllActions(); ActionMoveToObject(oFriend, FALSE, 2.0); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING)); } vFrnd = GetPosition(oFriend); SetFacingPoint(vFrnd); } // If we have a valid friend... if(GetIsObjectValid(oFriend)) { nRoll = d4(); ClearAllActions(); if(nRoll == 1) { ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL, 1.0, 6.0); } else if(nRoll == 2) { ActionPlayAnimation(ANIMATION_LOOPING_LISTEN, 1.0, 4.0); } else if(nRoll == 3) { ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING, 1.0, 6.0); } else { ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.75); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.75)); } } } } else { ClearAllActions();// Stop what we are doing. int nRand = d6(); if(nRand == 1) { if(GetDistanceToObject(oFriend) >= 3.0 && GetDistanceToObject(oFriend) <= 10.0) { ActionMoveToObject(oFriend, FALSE, 2.0); vFrnd = GetPosition(oFriend); SetFacingPoint(vFrnd); } } else if(nRand >= 2 && nRand <= 4) { ActionRandomWalk(); } else if(nRand == 5) { ActionPlayAnimation(ANIMATION_LOOPING_GET_MID); } else if(nRand == 6) { ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 6.0); } } break; } case (2):// IMMOBILE_AMBIENT_ANIMATIONS { /* Used for spawned creatures to not look like zombies */ int iRace = GetRacialType(OBJECT_SELF); if(GetIsPlayableRacialType(OBJECT_SELF) || iRace == RACIAL_TYPE_HUMANOID_GOBLINOID || iRace == RACIAL_TYPE_HUMANOID_REPTILIAN || iRace == RACIAL_TYPE_HUMANOID_ORC) { if(!GetIsObjectValid(oFriend) || GetIsPC(oFriend) || GetIsDM(oFriend) || IsInConversation(oFriend)) { if(d2() == 1) { ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.75); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.75)); } else { ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_TIRED, 1.0, 5.0); } } else { if(GetIsObjectValid(oFriend) && GetDistanceToObject(oFriend) <= 3.0) { nRoll = d4(); vFrnd = GetPosition(oFriend); SetFacingPoint(vFrnd); ClearAllActions(); if(nRoll == 1) { ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL, 1.0, 6.0); } else if(nRoll == 2) { ActionPlayAnimation(ANIMATION_LOOPING_LISTEN, 1.0, 5.0); } else if(nRoll == 3) { ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING, 1.0, 6.0); } else { ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.75); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.75)); } } } } break; } case (3):// AMBIENT_ANIMATIONS_AVIAN { /* Uses some wierd things, sadly. Normally, moving away from friend. */ nRoll = d4(); location lFriend; if(GetIsObjectValid(oFriend)) { lFriend = GetLocation(oFriend); } else { lFriend = GetLocation(OBJECT_SELF); } if(nRoll < 4) { ClearAllActions(); ActionMoveAwayFromObject(oFriend, TRUE, 100.0); } else { // wierd one... ClearAllActions(); effect eBird = EffectDisappearAppear(lFriend); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBird, OBJECT_SELF, 4.0); ActionMoveAwayFromObject(oFriend, TRUE, 100.0); } break; } case (4):// AMBIENT_GROUP_ANIMATIONS { /* This will group creatures, if spaced out, for talking and sitting. */ int iRace = GetRacialType(OBJECT_SELF); if(GetIsPlayableRacialType(OBJECT_SELF) || iRace == RACIAL_TYPE_HUMANOID_GOBLINOID || iRace == RACIAL_TYPE_HUMANOID_REPTILIAN || iRace == RACIAL_TYPE_HUMANOID_ORC) { if(!GetIsObjectValid(oFriend) || GetIsPC(oFriend) || GetIsDM(oFriend) || IsInConversation(oFriend)) { if(d2() == 1) { ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.75); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.75)); } else { ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_TIRED, 1.0, 5.0); } } else { if(GetIsObjectValid(oFriend) && GetDistanceToObject(oFriend) <= 20.0) { if(GetDistanceToObject(oFriend) > 4.0) { ClearAllActions(); ActionMoveToObject(oFriend); } else { nRoll = d10(); vFrnd = GetPosition(oFriend); SetFacingPoint(vFrnd); ClearAllActions(); if(nRoll <= 3) { ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL, 1.0, 12.0); } else if(nRoll == 2) { ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING, 1.0, 12.0); } else if(nRoll >= 4) { ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 18.0); } } } } } break; } case (5):// IMMOBILE_ANIMATIONS_AND_SOLO { // These will stay still, perhaps look around, drink, or listen. int iRace = GetRacialType(OBJECT_SELF); if(GetIsPlayableRacialType(OBJECT_SELF) || iRace == RACIAL_TYPE_HUMANOID_GOBLINOID || iRace == RACIAL_TYPE_HUMANOID_REPTILIAN || iRace == RACIAL_TYPE_HUMANOID_ORC) { ClearAllActions(); nRoll = d8(); if(nRoll <= 2) { ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.75); AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.75)); } else if(nRoll == 3) { ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK); } else if(nRoll == 4) { ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_BORED); } else if(nRoll >= 5) { ActionPlayAnimation(ANIMATION_LOOPING_LISTEN, 1.0, 5.5); } } break; } case (6):// AMBIENT_ANIMAL_WALKING { // If there is a person, we will run away. if(d2() == 1 && GetIsObjectValid(oFriend)) { ClearAllActions(); ActionMoveAwayFromObject(oFriend, TRUE, 50.0); } else { // Else random walk if no people ClearAllActions(); ActionRandomWalk(); } break; } }// End switch } //:://///////////////////////////////////////////// //:: Equip Appropriate Weapons //::////////////////////////////////////////////// /* This will use the set weapons, especially good for deul wielding and ranged weapon choosing, and shields! */ //::////////////////////////////////////////////// void EquipAppropriateWeapons(object oTarget) { object oRanged = GetLocalObject(OBJECT_SELF, "DW_RANGED"); int iRanged = GetIsObjectValid(oRanged); if(iRanged && GetItemPossessor(oRanged) != OBJECT_SELF) { DeleteLocalObject(OBJECT_SELF, "DW_RANGED"); iRanged = FALSE; } object oRight = (GetItemInSlot(INVENTORY_SLOT_RIGHTHAND)); if(GetDistanceToObject(oTarget) > 3.0 && iRanged && (oRight != oRanged) && GetIsObjectValid(oTarget)) { ActionEquipItem(oRanged, INVENTORY_SLOT_RIGHTHAND); } else if(GetDistanceToObject(oTarget) <= 3.0 || !GetIsObjectValid(oTarget) || !iRanged) { object oPrimary = GetLocalObject(OBJECT_SELF, "DW_PRIMARY"); int iPrimary = GetIsObjectValid(oPrimary); if(iPrimary && GetItemPossessor(oPrimary) != OBJECT_SELF) { DeleteLocalObject(OBJECT_SELF, "DW_PRIMARY"); iPrimary = FALSE; } object oSecondary = GetLocalObject(OBJECT_SELF, "DW_SECONDARY"); int iSecondary = GetIsObjectValid(oSecondary); if(iPrimary && GetItemPossessor(oSecondary) != OBJECT_SELF) { DeleteLocalObject(OBJECT_SELF, "DW_SECONDARY"); iSecondary = FALSE; } object oShield = GetLocalObject(OBJECT_SELF, "DW_SHIELD"); int iShield = GetIsObjectValid(oShield); if(iPrimary && GetItemPossessor(oShield) != OBJECT_SELF) { DeleteLocalObject(OBJECT_SELF, "DW_SHIELD"); iShield = FALSE; } object oTwoHanded = GetLocalObject(OBJECT_SELF, "DW_TWO_HANDED"); int iTwoHanded = GetIsObjectValid(oTwoHanded); if(iTwoHanded && GetItemPossessor(oTwoHanded) != OBJECT_SELF) { DeleteLocalObject(OBJECT_SELF, "DW_TWO_HANDED"); iTwoHanded = FALSE; } object oLeft = (GetItemInSlot(INVENTORY_SLOT_LEFTHAND)); // Complete change - it will check the slots, if not eqip, then do so. if(iPrimary && (oRight != oPrimary)) { ActionEquipItem(oPrimary, INVENTORY_SLOT_RIGHTHAND); } if(iSecondary && (oLeft != oSecondary)) { ActionEquipItem(oSecondary, INVENTORY_SLOT_LEFTHAND); } else if(!iSecondary && iShield && (oLeft != oShield)) { ActionEquipItem(oShield, INVENTORY_SLOT_LEFTHAND); } if(!iPrimary && iTwoHanded && (oRight != oTwoHanded)) { ActionEquipItem(oTwoHanded, INVENTORY_SLOT_RIGHTHAND); } // If all else fails...TRY most damaging melee weapon. if(!iPrimary && !iTwoHanded) ActionEquipMostDamagingMelee(oTarget, TRUE); } } // FAST BUFF SELF int TalentAdvancedBuff(float fDistance) { object oEnemy = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY); if(GetIsObjectValid(oEnemy)) { if(GetDistanceToObject(oEnemy) <= fDistance) { if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget())) { ClearAllActions(); SpeakString("[AI] " + GetName(OBJECT_SELF) + " [AREA] " + GetName(GetArea(OBJECT_SELF)) + " [Action] Fast Buffing", TALKVOLUME_SILENT_TALK); WriteTimestampedLogEntry("[AI] " + GetName(OBJECT_SELF) + " [AREA] " + GetName(GetArea(OBJECT_SELF)) + " [Action] Fast Buffing"); //Combat Protections if(GetHasSpell(SPELL_PREMONITION)) {ActionCastSpellAtObject(SPELL_PREMONITION, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_GREATER_STONESKIN)) {ActionCastSpellAtObject(SPELL_GREATER_STONESKIN, OBJECT_SELF, METAMAGIC_NONE, 0, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_STONESKIN)) {ActionCastSpellAtObject(SPELL_STONESKIN, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} //Visage Protections if(GetHasSpell(SPELL_SHADOW_SHIELD)) {ActionCastSpellAtObject(SPELL_SHADOW_SHIELD, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_ETHEREAL_VISAGE)) {ActionCastSpellAtObject(SPELL_ETHEREAL_VISAGE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_GHOSTLY_VISAGE)) {ActionCastSpellAtObject(SPELL_GHOSTLY_VISAGE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} //Mantle Protections if(GetHasSpell(SPELL_GREATER_SPELL_MANTLE)) {ActionCastSpellAtObject(SPELL_GREATER_SPELL_MANTLE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SPELL_MANTLE)) {ActionCastSpellAtObject(SPELL_SPELL_MANTLE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_LESSER_SPELL_BREACH)) {ActionCastSpellAtObject(SPELL_LESSER_SPELL_BREACH, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} // Globes if(GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY)) {ActionCastSpellAtObject(SPELL_GLOBE_OF_INVULNERABILITY, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY)) {ActionCastSpellAtObject(SPELL_MINOR_GLOBE_OF_INVULNERABILITY, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} //Misc Protections if(GetHasSpell(SPELL_ELEMENTAL_SHIELD)) {ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELD, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} //Elemental Protections if(GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS)) {ActionCastSpellAtObject(SPELL_PROTECTION_FROM_ELEMENTS, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_RESIST_ELEMENTS)) {ActionCastSpellAtObject(SPELL_RESIST_ELEMENTS, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_ENDURE_ELEMENTS)) {ActionCastSpellAtObject(SPELL_ENDURE_ELEMENTS, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} //Mental Protections if(GetHasSpell(SPELL_MIND_BLANK)) {ActionCastSpellAtObject(SPELL_MIND_BLANK, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_LESSER_MIND_BLANK)) {ActionCastSpellAtObject(SPELL_LESSER_MIND_BLANK, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_CLARITY)) {ActionCastSpellAtObject(SPELL_CLARITY, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} //Summon Ally if(GetHasSpell(SPELL_SUMMON_CREATURE_IX)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_IX, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_VIII)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_VIII, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_VII)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_VII, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_VI)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_VI, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_V)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_V, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_IV)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_IV, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_III)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_III, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_II)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_II, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} else if(GetHasSpell(SPELL_SUMMON_CREATURE_I)) {ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_I, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);} EquipAppropriateWeapons(oEnemy); return TRUE; } } } return FALSE; }