/*////////////////////////////////////////////////////////////////////////////// // Script Name: 0i_module //////////////////////////////////////////////////////////////////////////////// Include script for handling event scripts for injecting the systems into a module for either single player or a server. */////////////////////////////////////////////////////////////////////////////// #include "x2_inc_switches" #include "0i_associates" #include "0i_menus" #include "0i_player_target" #include "0i_gui_events" // Add to nw_c2_default9 OnSpawn event script of monsters and int ai_OnMonsterSpawn(object oCreature); // Add to nw_ch_ac9 OnSpawn event script of henchman. void ai_OnAssociateSpawn(object oCreature); // Run all of the players starting scripts. // If oPC is passed as Invalid then it will get the firt PC in the game. void ai_CheckPCStart(object oPC = OBJECT_INVALID); // Checks to see if we should change the monster via Json. int ai_ChangeMonster(object oCreature, object oModule); // Checks to see if we should change the associate via Json. object ai_ChangeAssociate(object oCreature, object oModule); // Sets the events for oCreature that is a Monster while playing Infinite Dungeons. void ai_SetIDMonsterEventScripts(object oCreature); // Sets the events for oCreature that is a monster in while using the PRC and // playing Infinite Dungeons. void ai_SetPRCIDMonsterEventScripts(object oCreature); // Sets the events for oCreature that is an associate while using the PRC. void ai_SetPRCAssociateEventScripts(object oCreature); // Reverts single player monster event scripts back to their default. void ai_ChangeEventScriptsForMonster(object oCreature); // Reverts single player associates event scripts back to their default. void ai_ChangeEventScriptsForAssociate(object oCreature); // If using PRC this will replace some spells with PRC variants. json ai_ReplaceSpellsWithPRCVariants(object oCreature, json jCreature); //****************************************************************************** //********************* Creature event scripts ********************************* //****************************************************************************** int ai_OnMonsterSpawn(object oCreature) { if(GetLocalInt(oCreature, AI_ONSPAWN_EVENT)) return FALSE; SetLocalInt(oCreature, AI_ONSPAWN_EVENT, TRUE); object oModule = GetModule(); int nInfiniteDungeons; int nPRC = GetLocalInt(oModule, AI_USING_PRC); // If you are running a server this will not affect the module. if(!AI_SERVER) { ai_CheckPCStart(); string sModuleName = GetModuleName(); if(sModuleName == "Neverwinter Nights - Infinite Dungeons" || sModuleName == "Infinite Dungeons [PRC8]") { nInfiniteDungeons = TRUE; if(nPRC) ai_SetPRCIDMonsterEventScripts(oCreature); else ai_SetIDMonsterEventScripts(oCreature); // Fix to get plot givers, finishers from getting killed a lot. if(GetLocalString(oCreature, "sConversation") == "id1_plotgiver " || GetLocalString(oCreature, "sConversation") == "id1_plotdest") { ChangeToStandardFaction(oCreature, STANDARD_FACTION_MERCHANT); SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 50, oCreature); } } } // PRC and Infinite dungeons has issues with Ondeath script so we just leave it alone. if(!nPRC && !nInfiniteDungeons) { // We change this script so we can setup permanent summons on/off. string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); SetLocalString(oCreature, "AI_ON_DEATH", sScript); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_c2_7_ondeath"); } if(GetCreatureFlag(oCreature, CREATURE_VAR_IS_INCORPOREAL)) { string sCombatAI = GetLocalString(oCreature, AI_DEFAULT_SCRIPT); if (sCombatAI == "") SetLocalString(oCreature, AI_DEFAULT_SCRIPT, "ai_incorporeal"); } ai_SetListeningPatterns(oCreature); ai_SetCreatureAIScript(oCreature); ai_SetNormalAppearance(oCreature); ai_SetAura(oCreature); SetLocalInt(oCreature, AI_HEAL_IN_COMBAT_LIMIT, AI_MONSTER_HEAL_IN_COMBAT_CHANCE); SetLocalInt(oCreature, AI_HEAL_OUT_OF_COMBAT_LIMIT, AI_MONSTER_HEAL_OUT_COMBAT_CHANCE); int nMonsterHpIncrease = GetLocalInt(oModule, AI_INCREASE_MONSTERS_HP); if(nMonsterHpIncrease) { int nHp = GetMaxHitPoints(oCreature); nHp = (nHp * nMonsterHpIncrease) / 100; effect eHp = EffectTemporaryHitpoints(nHp); eHp = SupernaturalEffect(eHp); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHp, oCreature); } // Check if the monster should change how they search for targets. if(d100() <= GetLocalInt(GetModule(), AI_RULE_AI_DIFFICULTY)) { SetLocalInt(oCreature, AI_RULE_AI_DIFFICULTY, TRUE); } // Do json changes after we have setup the creature. if(ai_ChangeMonster(oCreature, oModule)) return TRUE; return FALSE; } void ai_OnAssociateSpawn(object oCreature) { if(GetLocalInt(oCreature, AI_ONSPAWN_EVENT)) return; SetLocalInt(oCreature, AI_ONSPAWN_EVENT, TRUE); int bPRC = GetLocalInt(GetModule(), AI_USING_PRC); // If you are running a server this will not affect the module. if(!AI_SERVER) { if(bPRC) ai_SetPRCAssociateEventScripts(oCreature); } // PRC has issues with Ondeath script so we just leave it alone. if(!bPRC) { // We change this script so we can setup permanent summons on/off. // If you don't use this you may remove the next three lines. string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); SetLocalString(oCreature, "AI_ON_DEATH", sScript); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_ch_7_ondeath"); } // Initialize Associate modes for basic use. ai_SetListeningPatterns(oCreature); ai_SetNormalAppearance(oCreature); ai_SetAssociateAIScript(oCreature, FALSE); ai_SetAura(oCreature); if(GetLocalInt(GetModule(), AI_RULE_PARTY_SCALE)) ai_CheckXPPartyScale(oCreature); // Bioware summoned shadows are not incorporeal, also set the ai code. if (GetTag(OBJECT_SELF) == "NW_S_SHADOW") { SetLocalInt(OBJECT_SELF, "X2_L_IS_INCORPOREAL", TRUE); SetLocalString(OBJECT_SELF, AI_DEFAULT_SCRIPT, "ai_shadow"); } } void ai_CheckPCStart(object oPC = OBJECT_INVALID) { if(oPC == OBJECT_INVALID) oPC = GetFirstPC(); // There should always be a PC widget. If it doesn't exist then we assume // that the module is being loaded or started. if(!NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI)) { object oModule = GetModule(); // Do PRC check and save variable to the module. if(ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS) != "") SetLocalInt(oModule, AI_USING_PRC, TRUE); ai_SetAIRules(); ai_CheckAssociateData(oPC, oPC, "pc"); ai_StartupPlugins(oPC); ai_SetupPlayerTarget(oPC); ai_SetupModuleGUIEvents(oPC); ai_CreateWidgetNUI(oPC, oPC); ai_SetNormalAppearance(oPC); } } void ai_CopyMonster(object oCreature, object oModule) { // After setting the monster lets see if we should copy it. float fMonsterIncrease = GetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS); if(GetIsEncounterCreature(oCreature) && fMonsterIncrease > 0.0) { int nMonsterIncrease; float fMonsterCounter = GetLocalFloat(oModule, "AI_MONSTER_COUNTER"); fMonsterCounter += fMonsterIncrease; nMonsterIncrease = FloatToInt(fMonsterCounter); if(nMonsterIncrease > 0) { fMonsterCounter = fMonsterCounter - IntToFloat(nMonsterIncrease); } SetLocalFloat(oModule, "AI_MONSTER_COUNTER", fMonsterCounter); while(nMonsterIncrease > 0) { CopyObject(oCreature, GetLocation(oCreature), OBJECT_INVALID, "", TRUE); nMonsterIncrease = nMonsterIncrease - 1; } } } void ai_CreateMonster(json jCreature, location lLocation, object oModule) { //WriteTimestampedLogEntry("0i_module, 181, " + JsonDump(jCreature, 1)); object oCreature = JsonToObject(jCreature, lLocation, OBJECT_INVALID, TRUE); // Lets set the new version as spawned so we skip the initial setup again. SetLocalInt(oCreature, AI_ONSPAWN_EVENT, TRUE); /*if(GetLocalInt(oModule, AI_RULE_CORPSES_STAY)) { SetIsDestroyable(FALSE, FALSE, TRUE, oCreature); SetLootable(oCreature, TRUE); } */ if(AI_DEBUG) ai_Debug("0i_module", "187", GetName(oCreature)); ai_CopyMonster(oCreature, oModule); return; } json ai_SetCompanionSummoning(object oCreature, json jCreature) { if(GetHasFeat(FEAT_SUMMON_FAMILIAR, oCreature, TRUE)) { json jFamiliar = JsonObjectGet(jCreature, "FamiliarName"); jFamiliar = JsonObjectSet(jFamiliar, "value", JsonString("Summoned Familiar")); jCreature = JsonObjectSet(jCreature, "FamiliarName", jFamiliar); jFamiliar = JsonObjectGet(jCreature, "FamiliarType"); jFamiliar = JsonObjectSet(jFamiliar, "value", JsonInt(Random(11))); return JsonObjectSet(jCreature, "FamiliarType", jFamiliar); } if(GetHasFeat(FEAT_ANIMAL_COMPANION , oCreature, TRUE)) { json jCompanion = JsonObjectGet(jCreature, "CompanionName"); jCompanion = JsonObjectSet(jCompanion, "value", JsonString("Summoned Companion")); jCreature = JsonObjectSet(jCreature, "CompanionName", jCompanion); jCompanion = JsonObjectGet(jCreature, "CompanionType"); jCompanion = JsonObjectSet(jCompanion, "value", JsonInt(Random(9))); return JsonObjectSet(jCreature, "CompanionType", jCompanion); } return jCreature; } int ai_ChangeMonster(object oCreature, object oModule) { object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oCreature); // Lets not mess up the cutscenes with silly RULES. if(GetCutsceneMode(oPC)) return FALSE; //float fDistance = GetDistanceBetween(oCreature, oPC); // Looks bad to see creatures wink in and out plus could cause module errors. //if(fDistance != 0.0 && fDistance < AI_RANGE_PERCEPTION) return oCreature; if(IsInConversation(oCreature)) return FALSE; json jCreature = ObjectToJson(oCreature, TRUE); // We now use plugins to mod our monsters. json jMonsterMods = GetLocalJson(oModule, AI_MONSTER_MOD_JSON); if(JsonGetType(jMonsterMods) != JSON_TYPE_NULL) { SetLocalJson(oModule, AI_MONSTER_JSON, jCreature); SetLocalObject(oModule, AI_MONSTER_OBJECT, oCreature); int nIndex; string sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, nIndex)); while(sMonsterMod != "") { ExecuteScript(sMonsterMod, oPC); sMonsterMod = JsonGetString(JsonArrayGet(jMonsterMods, ++nIndex)); } jCreature = GetLocalJson(oModule, AI_MONSTER_JSON); } int nSummon = GetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS) && (GetHasFeat(FEAT_SUMMON_FAMILIAR, oCreature, TRUE)) || GetHasFeat(FEAT_ANIMAL_COMPANION, oCreature, TRUE); int nPercDist = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE) != 11 && GetReputation(oCreature, oPC) < 11; //WriteTimestampedLogEntry(GetName(oCreature) + ": fDistance: " + FloatToString(fDistance, 0, 2) + " nSummon: " + IntToString(nSummon) + // " nPercDist: " + IntToString(nPercDist) + " Reputation: " + IntToString(GetReputation(oCreature, oPC))); if(nSummon || nPercDist) { location lLocation = GetLocation(oCreature); if(nPercDist) { json jPerception = JsonObjectGet(jCreature, "PerceptionRange"); jPerception = JsonObjectSet(jPerception, "value", JsonInt(GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE))); jCreature = JsonObjectSet(jCreature, "PerceptionRange", jPerception); } if(nSummon) jCreature = ai_SetCompanionSummoning(oCreature, jCreature); SetLocalInt(oModule, AI_MONSTER_CHANGED, TRUE); } if(GetLocalInt(oModule, AI_MONSTER_CHANGED)) { SetIsDestroyable(TRUE, FALSE, FALSE, oCreature); location lLocation = GetLocation(oCreature); DestroyObject(oCreature); AssignCommand(oModule, DelayCommand(1.0, ai_CreateMonster(jCreature, lLocation, oModule))); DeleteLocalInt(oModule, AI_MONSTER_CHANGED); return TRUE; } else ai_CopyMonster(oCreature, oModule); DeleteLocalJson(oModule, AI_MONSTER_JSON); DeleteLocalObject(oModule, AI_MONSTER_OBJECT); return FALSE; } // Special event scripts for Infinite Dungeons! void ai_SetIDMonsterEventScripts(object oCreature) { //if(AI_DEBUG) ai_Debug("0i_module", "433", "Changing " + GetName(oCreature) + "'s Infinte Dungeons event scripts."); //********** On Heartbeat ********** string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); if(sScript == "x2_def_heartbeat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else if(sScript == "nw_c2_default1") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_HEARTBEAT SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Perception ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); SetLocalString(oCreature, "AI_ON_NOTICE", sScript); if(sScript == "x2_def_percept") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_id_events"); else if(sScript == "nw_c2_default2") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_NOTICE SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On End Combat Round ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); if(sScript == "x2_def_endcombat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_id_events"); else if(sScript == "nw_c2_default3") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_END_COMBATROUND SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Dialogue ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); if(sScript == "x2_def_onconv") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_id_events"); else if(sScript == "nw_c2_default4") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_DIALOGUE_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Melee Attacked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); if(sScript == "x2_def_attacked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_id_events"); else if(sScript == "nw_c2_default5") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_MELEE_ATTACKED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Damaged ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); if(sScript == "x2_def_ondamage") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_id_events"); else if(sScript == "nw_c2_default6") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_DAMAGED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); // We don't set OnDeath for Infinite Dungeons! //********** On Death ********** //sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); //SetLocalString(oCreature, "AI_ON_DEATH", sScript); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_id_events"); //********** On Disturbed ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); if(sScript == "x2_def_ondisturb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_id_events"); else if(sScript == "nw_c2_default8") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_DISTURBED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); //********** On Rested ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); SetLocalString(oCreature, "AI_ON_RESTED", sScript); if(sScript == "x2_def_rested") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_id_events"); else if(sScript == "nw_c2_defaulta") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_RESTED SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Spell Cast At ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); if(sScript == "x2_def_spellcast") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_id_events"); else if(sScript == "nw_c2_defaultb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_SPELLCASTAT_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Blocked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); if(sScript == "x2_def_onblocked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_id_events"); else if(sScript == "nw_c2_defaulte") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_BLOCKED_BY_DOOR SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); } // Special event scripts for Infinite Dungeons with PRC! void ai_SetPRCIDMonsterEventScripts(object oCreature) { //if(AI_DEBUG) ai_Debug("0i_module", "433", "Changing " + GetName(oCreature) + "'s Infinte Dungeons event scripts for PRC."); //********** On Heartbeat ********** string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); if(sScript == "x2_def_heartbeat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_id_events"); else if(sScript == "nw_c2_default1") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_HEARTBEAT SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Perception ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); SetLocalString(oCreature, "AI_ON_NOTICE", sScript); if(sScript == "x2_def_percept") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_id_events"); else if(sScript == "nw_c2_default2") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_NOTICE SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On End Combat Round ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); if(sScript == "x2_def_endcombat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_id_events"); else if(sScript == "nw_c2_default3") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_END_COMBATROUND SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Dialogue ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); if(sScript == "x2_def_onconv") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_id_events"); else if(sScript == "nw_c2_default4") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_DIALOGUE_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Melee Attacked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); if(sScript == "x2_def_attacked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_id_events"); else if(sScript == "nw_c2_default5") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_MELEE_ATTACKED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Damaged ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); if(sScript == "x2_def_ondamage") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_id_events"); else if(sScript == "nw_c2_default6") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_DAMAGED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); // We don't set OnDeath for PRC or Infinite dungeons. //********** On Death ********** //sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH); //SetLocalString(oCreature, "AI_ON_DEATH", sScript); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "0e_prc_id_events"); //********** On Disturbed ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); if(sScript == "x2_def_ondisturb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_id_events"); else if(sScript == "nw_c2_default8") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_DISTURBED_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); //********** On Rested ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); SetLocalString(oCreature, "AI_ON_RESTED", sScript); if(sScript == "x2_def_rested") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_id_events"); else if(sScript == "nw_c2_defaulta") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_RESTED SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Spell Cast At ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); if(sScript == "x2_def_spellcast") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_id_events"); else if(sScript == "nw_c2_defaultb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_SPELLCASTAT_SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //********** On Blocked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); if(sScript == "x2_def_onblocked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_id_events"); else if(sScript == "nw_c2_defaulte") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_id_events"); else if(sScript == "") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_id_events"); else WriteTimestampedLogEntry("ON_BLOCKED_BY_DOOR SCRIPT ERROR: AI did not capture " + sScript + " script for " + GetName(oCreature) + "."); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); } // Special event scripts for PRC associates! void ai_SetPRCAssociateEventScripts(object oCreature) { //if(AI_DEBUG) ai_Debug("0i_module", "433", "Changing " + GetName(oCreature) + "'s Infinte Dungeons event scripts for PRC."); //********** On Heartbeat ********** string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); SetLocalString(oCreature, "AI_ON_HEARTBEAT", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac1") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "0e_prc_ch_events"); //********** On Perception ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); SetLocalString(oCreature, "AI_ON_NOTICE", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac2") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "0e_prc_ch_events"); //********** On End Combat Round ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); SetLocalString(oCreature, "AI_ON_END_COMBATROUND", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac3") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "0e_prc_ch_events"); //********** On Dialogue ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); SetLocalString(oCreature, "AI_ON_DIALOGUE", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac4") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "0e_prc_ch_events"); //********** On Melee Attacked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); SetLocalString(oCreature, "AI_ON_MELEE_ATTACKED", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac5") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "0e_prc_ch_events"); //********** On Damaged ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); SetLocalString(oCreature, "AI_ON_DAMAGED", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac6") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "0e_prc_ch_events"); //********** On Disturbed ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); SetLocalString(oCreature, "AI_ON_DISTURBED", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_ch_events"); else if(sScript == "nw_ch_ac8") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "0e_prc_ch_events"); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); //********** On Rested ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED); SetLocalString(oCreature, "AI_ON_RESTED", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_ch_events"); else if(sScript == "nw_ch_aca") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "0e_prc_ch_events"); //********** On Spell Cast At ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); SetLocalString(oCreature, "AI_ON_SPELLCASTAT", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_ch_events"); else if(sScript == "nw_ch_acb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "0e_prc_ch_events"); //********** On Blocked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); SetLocalString(oCreature, "AI_ON_BLOCKED_BY_DOOR", sScript); if(sScript == "default") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_ch_events"); else if(sScript == "nw_ch_ace") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "0e_prc_ch_events"); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); if(!GetCommandable(oCreature)) SetCommandable(TRUE, oCreature); } void ai_ChangeEventScriptsForMonster(object oCreature) { //********** On Heartbeat ********** string sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT); if(sScript == "0e_c2_1_hb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "nw_c2_default1"); //********** On Perception ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE); if(sScript == "0e_c2_2_percept") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "nw_c2_default2"); //********** On End Combat Round ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND); if(sScript == "0e_c2_3_endround") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "nw_c2_default3"); //********** On Dialogue ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE); if(sScript == "0e_c2_4_convers") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "nw_c2_default4"); //********** On Melee Attacked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED); if(sScript == "0e_c2_5_phyatked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "nw_c2_default5"); //********** On Damaged ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED); if(sScript == "0e_c2_6_damaged") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "nw_c2_default6"); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "nw_c2_deafult7"); //********** On Disturbed ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED); if(sScript == "0e_c2_8_disturb") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "nw_c2_default8"); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "nw_c2_defaulta"); //********** On Spell Cast At ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT); if(sScript == "0e_c2_b_castat") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "nw_c2_defaultb"); //********** On Blocked ********** sScript = GetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR); if(sScript == "0e_c2_e_blocked") SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "nw_c2_defaulte"); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "nw_c2_defaulte"); } void ai_ChangeEventScriptsForAssociate(object oCreature) { SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "nw_ch_ac1"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_NOTICE, "nw_ch_ac2"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "nw_ch_ac3"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "nw_ch_ac4"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "nw_ch_ac5"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "nw_ch_ac6"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DEATH, "nw_ch_ac7"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "nw_ch_ac8"); //SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_RESTED, "nw_ch_aca"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "nw_ch_acb"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "nw_ch_ace"); SetEventScript(oCreature, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "nw_ch_acd"); }