/*////////////////////////////////////////////////////////////////////////////// Script Name: 0e_nui Programmer: Philos //////////////////////////////////////////////////////////////////////////////// Menu event script sEvent: close, click, mousedown, mouseup, watch (if bindwatch is set). /*////////////////////////////////////////////////////////////////////////////// #include "nw_inc_gff" #include "x0_i0_assoc" #include "0i_menus" #include "0i_player_target" // Save a window ID to the database. void ai_SaveWindowLocation(object oPC, int nToken, string sAssociateType, string sWindowID); // Sets the Widget Buttons state to sElem Checkbox state. void ai_SetWidgetButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem); // Flips an AI Buttons state to sElem Checkbox state. void ai_SetAIButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem); // Flips the flag for the loot filter to sElem Checkbox state. void ai_SetLootFilterToCheckbox(object oPC, object oAssociate, int nFilterBit, int nToken, string sElem); // Sets an associates companion type. Cannot set companion for a player! void ai_SetCompanionType(object oPC, object oAssociate, int nToken, int nCompanionType); // Sets an associates companion name. Cannot set companion for a player! void ai_SetCompanionName(object oPC, object oAssociate, int nToken, int nCompanionType); // Sets an associates AI script via a combo box. void ai_SetAIScript(object oPC, object oAssociate, int nToken); // Increments/Decrements the Perception Range use variable for the AI. void ai_PercRangeIncrement(object oPC, object oAssociate, int nIncrement, string sAssociateType, int nToken); // Saves an associates perception range changed on the button. void ai_Perc_Range(object oPC, object oAssociate, int nToken, string sAssociateType); // Changes Perception Distance Rule for monsters. void ai_RulePercDistInc(object oPC, object oModule, int nIncrement, int nToken); // Adds a spell to a json AI restricted spell list then returns jRules. // bRestrict = TRUE will add to the list FALSE will remove it from the list. json ai_AddRestrictedSpell(json jRules, int nSpell, int bRestrict = TRUE); // Turns on oAssociate AI, Setting all event scripts. void ai_TurnOn(object oPC, object oAssociate, string sAssociateType); // Turns off oAssociate AI, Setting all event scripts. void ai_TurnOff(object oPC, object oAssociate, string sAssociateType); // Adds a henchman back into the players party. object ai_AddHenchman(object oPC, json jHenchman, location lLocation, int nFamiliar, int nCompanion); void ai_SaveWindowLocation(object oPC, int nToken, string sAssociateType, string sWindowID) { json jGeometry = NuiGetBind(oPC, nToken, "window_geometry"); float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x")); float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y")); json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); if(JsonGetType(jLocations) == JSON_TYPE_NULL) jLocations = JsonObject(); json jWindow = JsonObjectGet(jLocations, sWindowID); if(JsonGetType(jWindow) == JSON_TYPE_NULL) jWindow = JsonObject(); jWindow = JsonObjectSet(jWindow, "x", JsonFloat(fX)); jWindow = JsonObjectSet(jWindow, "y", JsonFloat(fY)); jLocations = JsonObjectSet(jLocations, sWindowID, jWindow); //SendMessageToPC(oPC, "0e_nui, 52, sAssociateType: " + sAssociateType + // " sWindowID: " + sWindowID + // " jLocations: " + JsonDump(jLocations, 1)); ai_SetAssociateDbJson(oPC, sAssociateType, "locations", jLocations); } void ai_ToggleAssociateWidgetOnOff(object oPC, int nToken, object oAssociate, string sAssociateType) { string sText, sText2, sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int bWidget = !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType); ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType, bWidget); NuiSetBind(oPC, nToken, "btn_widget_onoff", JsonBool (!bWidget)); if(bWidget) { sText = "on"; sText2 = "Off"; IsWindowClosed(oPC, sAssociateType + AI_WIDGET_NUI); } else { sText = "off"; sText2 = "On"; ai_CreateWidgetNUI(oPC, oAssociate); } NuiSetBind(oPC, nToken, "btn_widget_onoff_label", JsonString("Widget " + sText2)); NuiSetBind(oPC, nToken, "btn_widget_onoff_tooltip", JsonString(" Turn " + sName + " widget " + sText)); } void main() { object oPC = NuiGetEventPlayer(); int nToken = NuiGetEventWindow(); string sEvent = NuiGetEventType(); string sElem = NuiGetEventElement(); int nIndex = NuiGetEventArrayIndex(); string sWndId = NuiGetWindowId(oPC, nToken); //SendMessageToPC(oPC, "0e_nui , 64 sWndId: " + sWndId + " sEvent: " + sEvent + " sElem: " + sElem + // " nToken: " + IntToString(nToken) + " nIndex: " + IntToString(nIndex) + // " oPC: " + GetName(oPC)); // Get if the menu has an associate attached. json jData = NuiGetUserData(oPC, nToken); object oAssociate = StringToObject(JsonGetString(JsonArrayGet(jData, 0))); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); if(!ai_GetIsCharacter(oAssociate) && !GetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE") && (oAssociate == OBJECT_INVALID || GetMaster(oAssociate) != oPC)) { ai_SendMessages("This creature is no longer in your party!", AI_COLOR_RED, oPC); DelayCommand(0.0, NuiDestroy(oPC, nToken)); return; } if(sAssociateType == "") return; //************************************************************************** // Watch to see if the window moves and save. if(sElem == "window_geometry" && sEvent == "watch") { if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; // If the widget is locked then don't save. if(sWndId == sAssociateType + AI_WIDGET_NUI && ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType)) return; ai_SaveWindowLocation(oPC, nToken, sAssociateType, sWndId); return; } //************************************************************************** // Main AI events. if(sWndId == AI_MAIN_NUI) { //if(GetLocalInt(oPC, AI_NO_NUI_SAVE)) return; if(sEvent == "click") { if(sElem == "btn_plugin_manager") { DelayCommand(0.0, NuiDestroy(oPC, nToken)); ai_CreatePluginNUI(oPC); } else if(sElem == "btn_action_ghost") { // We set ghost mode differently for each AI. if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) == "") { if(GetLocalInt(oPC, sGhostModeVarname)) { DeleteLocalInt(oPC, sGhostModeVarname); ai_SendMessages("Action Ghost mode is turned off when using commands.", AI_COLOR_YELLOW, oPC); object oAssociate; int nIndex; for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) { oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oAssociate != OBJECT_INVALID) { ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); DeleteLocalInt(oAssociate, sGhostModeVarname); } } for(nIndex = 2; nIndex < 6; nIndex++) { oAssociate = GetAssociate(nIndex, oPC); if(oAssociate != OBJECT_INVALID) { ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); DeleteLocalInt(oAssociate, sGhostModeVarname); } } } else { SetLocalInt(oPC, sGhostModeVarname, TRUE); ai_SendMessages("Action Ghost mode is turned on when using commands.", AI_COLOR_YELLOW, oPC); } } else { if(ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST)) { ai_SetAIMode(oPC, AI_MODE_ACTION_GHOST, FALSE); ai_SendMessages("Action Ghost mode is turned off when using commands.", AI_COLOR_YELLOW, oPC); object oAssociate; int nIndex; for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) { oAssociate = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oAssociate != OBJECT_INVALID && !ai_GetAIMode(oAssociate, AI_MODE_GHOST)) { ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); DeleteLocalInt(oAssociate, sGhostModeVarname); } } for(nIndex = 2; nIndex < 6; nIndex++) { oAssociate = GetAssociate(nIndex, oPC); if(oAssociate != OBJECT_INVALID && !ai_GetAIMode(oAssociate, AI_MODE_GHOST)) { ai_RemoveASpecificEffect(oAssociate, EFFECT_TYPE_CUTSCENEGHOST); DeleteLocalInt(oAssociate, sGhostModeVarname); } } } else { ai_SetAIMode(oPC, AI_MODE_ACTION_GHOST); ai_SendMessages("Action Ghost mode is turned on when using commands.", AI_COLOR_YELLOW, oPC); } aiSaveAssociateModesToDb(oPC, oPC); } } else if(sElem == "btn_toggle_assoc_widget") { int bWidgetOff = !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oPC, "pc"); string sAssocType; ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oPC, "pc", bWidgetOff); object oAssoc = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); if(oAssoc != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); else ai_CreateWidgetNUI(oPC, oAssoc); } oAssoc = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); if(oAssoc != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); else ai_CreateWidgetNUI(oPC, oAssoc); } oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); if(oAssoc != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); else ai_CreateWidgetNUI(oPC, oAssoc); } oAssoc = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); if(oAssoc != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType, bWidgetOff); if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); else ai_CreateWidgetNUI(oPC, oAssoc); } int nIndex; object oHenchman; for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) { oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oHenchman != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oHenchman); ai_SetWidgetButton(oPC, BTN_WIDGET_OFF, oHenchman, sAssocType, bWidgetOff); if(bWidgetOff) IsWindowClosed(oPC, sAssocType + AI_WIDGET_NUI); else ai_CreateWidgetNUI(oPC, oHenchman); } } } else if(sElem == "btn_effect_icon") { if(ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT)) { ai_SetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT, FALSE); ai_SendMessages("All effect icons will be reported in a menu at the top of the screen.", AI_COLOR_YELLOW, oPC); } else { ai_SetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT); ai_SendMessages("All effect icons will be reported in the chat screen.", AI_COLOR_YELLOW, oPC); } aiSaveAssociateModesToDb(oPC, oPC); } if(sElem == "btn_default_xp") { int nDefaultXP = GetLocalInt(GetModule(), AI_RULE_DEFAULT_XP_SCALE); SetModuleXPScale(nDefaultXP); NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(IntToString(nDefaultXP))); } } if(sEvent == "watch") { string sPreElem = GetStringLeft(sElem, 4); if(sPreElem == "txt_") { object oModule = GetModule(); json jRules = ai_GetCampaignDbJson("rules"); string sText = JsonGetString(NuiGetBind(oPC, nToken, sElem)); if(sElem == "txt_max_henchman") { int nMaxHenchmen = StringToInt(sText); if(nMaxHenchmen < 1) nMaxHenchmen = 1; if(nMaxHenchmen > 12) { nMaxHenchmen = 12; ai_SendMessages("The maximum henchmen for this mod is 12!", AI_COLOR_RED, oPC); } SetMaxHenchmen(nMaxHenchmen); SetLocalInt(oModule, AI_RULE_MAX_HENCHMAN, nMaxHenchmen); jRules = JsonObjectSet(jRules, AI_RULE_MAX_HENCHMAN, JsonInt(nMaxHenchmen)); ai_SendMessages("Maximum henchmen has been changed to " + IntToString(nMaxHenchmen), AI_COLOR_YELLOW, oPC); } else if(sElem == "txt_ai_difficulty") { int nChance = StringToInt(sText); if(nChance < 0) nChance = 0; else if(nChance > 100) nChance = 100; SetLocalInt(oModule, AI_RULE_AI_DIFFICULTY, nChance); jRules = JsonObjectSet(jRules, AI_RULE_AI_DIFFICULTY, JsonInt(nChance)); } else if(sElem == "txt_perception_distance") { float fDistance = StringToFloat(sText); if(fDistance < 10.0) fDistance = 10.0; else if(fDistance > 60.0) fDistance = 60.0; SetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE, fDistance); jRules = JsonObjectSet(jRules, AI_RULE_PERCEPTION_DISTANCE, JsonFloat(fDistance)); } else if(sElem == "txt_inc_enc") { float fNumber = StringToFloat(sText); if(fNumber < 0.0) fNumber = 0.0; else if(fNumber > 9.0) fNumber = 9.0; SetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS, fNumber); jRules = JsonObjectSet(jRules, AI_INCREASE_ENC_MONSTERS, JsonFloat(fNumber)); } else if(sElem == "txt_inc_hp") { int nNumber = StringToInt(sText); if(nNumber < 0) nNumber = 0; else if(nNumber > 100) nNumber = 100; SetLocalInt(oModule, AI_INCREASE_MONSTERS_HP, nNumber); jRules = JsonObjectSet(jRules, AI_INCREASE_MONSTERS_HP, JsonInt(nNumber)); } else if(sElem == "txt_wander_distance") { float fDistance = StringToFloat(sText); if(fDistance < 0.0) fDistance = 0.0; else if(fDistance > 99.0) fDistance = 99.0; SetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE, fDistance); jRules = JsonObjectSet(jRules, AI_RULE_WANDER_DISTANCE, JsonFloat(fDistance)); } else if(sElem == "txt_xp_scale") { int nNumber = StringToInt(sText); if(nNumber < 0) nNumber = 0; else if(nNumber > 200) nNumber = 200; SetModuleXPScale(nNumber); return; } ai_SetCampaignDbJson("rules", jRules); } else if(sPreElem == "chbx") { object oModule = GetModule(); int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); json jRules = ai_GetCampaignDbJson("rules"); if(sElem == "chbx_moral_check") { SetLocalInt(oModule, AI_RULE_MORAL_CHECKS, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_MORAL_CHECKS, JsonInt(bCheck)); } else if(sElem == "chbx_buff_monsters_check") { SetLocalInt(oModule, AI_RULE_BUFF_MONSTERS, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_BUFF_MONSTERS, JsonInt(bCheck)); } else if(sElem == "chbx_buff_summons_check") { SetLocalInt(oModule, AI_RULE_PRESUMMON, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_PRESUMMON, JsonInt(bCheck)); } else if(sElem == "chbx_ambush_monsters_check") { SetLocalInt(oModule, AI_RULE_AMBUSH, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_AMBUSH, JsonInt(bCheck)); } else if(sElem == "chbx_companions_check") { SetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_SUMMON_COMPANIONS, JsonInt(bCheck)); } else if(sElem == "chbx_advanced_movement_check") { SetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_ADVANCED_MOVEMENT, JsonInt(bCheck)); } else if(sElem == "chbx_ilr_check") { SetLocalInt(oModule, AI_RULE_ILR, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_ILR, JsonInt(bCheck)); } else if(sElem == "chbx_umd_check") { SetLocalInt(oModule, AI_RULE_ALLOW_UMD, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_ALLOW_UMD, JsonInt(bCheck)); } else if(sElem == "chbx_use_healingkits_check") { SetLocalInt(oModule, AI_RULE_HEALERSKITS, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_HEALERSKITS, JsonInt(bCheck)); } else if(sElem == "chbx_perm_assoc_check") { SetLocalInt(oModule, AI_RULE_PERM_ASSOC, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_PERM_ASSOC, JsonInt(bCheck)); } else if(sElem == "chbx_corpses_stay_check") { SetLocalInt(oModule, AI_RULE_CORPSES_STAY, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_CORPSES_STAY, JsonInt(bCheck)); } else if(sElem == "chbx_wander_check") { SetLocalInt(oModule, AI_RULE_WANDER, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_WANDER, JsonInt(bCheck)); NuiSetBind(oPC, nToken, "txt_wander_distance_event", JsonBool(bCheck)); } else if(sElem == "chbx_open_doors_check") { SetLocalInt(oModule, AI_RULE_OPEN_DOORS, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_OPEN_DOORS, JsonInt(bCheck)); } else if(sElem == "chbx_party_scale_check") { if(bCheck) { SetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP, GetModuleXPScale()); ai_CheckXPPartyScale(oPC); } else { SetModuleXPScale(GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE)); } SetLocalInt(oModule, AI_RULE_PARTY_SCALE, bCheck); jRules = JsonObjectSet(jRules, AI_RULE_PARTY_SCALE, JsonInt(bCheck)); string sText = IntToString(GetLocalInt(oModule, AI_BASE_PARTY_SCALE_XP)); NuiSetBind(oPC, nToken, "chbx_party_scale_tooltip", JsonString(" PEPS adjusts your XP based on party size from (" + sText + ").")); sText = IntToString(GetModuleXPScale()); NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(sText)); } else if(sElem == "chbx_darkness_check") { if(bCheck) { jRules = ai_AddRestrictedSpell(jRules, SPELL_DARKNESS); jRules = ai_AddRestrictedSpell(jRules, 159); jRules = ai_AddRestrictedSpell(jRules, SPELLABILITY_AS_DARKNESS); jRules = ai_AddRestrictedSpell(jRules, 688); // WildShape_Darkness } else { jRules = ai_AddRestrictedSpell(jRules, SPELL_DARKNESS, FALSE); jRules = ai_AddRestrictedSpell(jRules, 159, FALSE); jRules = ai_AddRestrictedSpell(jRules, SPELLABILITY_AS_DARKNESS, FALSE); jRules = ai_AddRestrictedSpell(jRules, 688, FALSE); // WildShape_Darkness } } else if(sElem == "chbx_dispels_check") { if(bCheck) { jRules = ai_AddRestrictedSpell(jRules, SPELL_LESSER_DISPEL); jRules = ai_AddRestrictedSpell(jRules, SPELL_DISPEL_MAGIC); jRules = ai_AddRestrictedSpell(jRules, SPELL_GREATER_DISPELLING); jRules = ai_AddRestrictedSpell(jRules, SPELL_MORDENKAINENS_DISJUNCTION); } else { jRules = ai_AddRestrictedSpell(jRules, SPELL_LESSER_DISPEL, FALSE); jRules = ai_AddRestrictedSpell(jRules, SPELL_DISPEL_MAGIC, FALSE); jRules = ai_AddRestrictedSpell(jRules, SPELL_GREATER_DISPELLING, FALSE); jRules = ai_AddRestrictedSpell(jRules, SPELL_MORDENKAINENS_DISJUNCTION, FALSE); } } else if(sElem == "chbx_timestop_check") { if(bCheck) jRules = ai_AddRestrictedSpell(jRules, SPELL_TIME_STOP); else jRules = ai_AddRestrictedSpell(jRules, SPELL_TIME_STOP, FALSE); } ai_SetCampaignDbJson("rules", jRules); } } else if(sEvent == "mousescroll") { float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); if(nMouseScroll == 1.0) // Scroll up { // Follow range is only changed on non-pc's if(sElem == "lbl_perc_dist") ai_RulePercDistInc(oPC, GetModule(), 1, nToken); } else if(nMouseScroll == -1.0) // Scroll down { // Follow range is only changed on non-pc's if(sElem == "lbl_perc_dist") ai_RulePercDistInc(oPC, GetModule(), -1, nToken); } } return; } //************************************************************************** // Associate Command events. if(sWndId == sAssociateType + AI_COMMAND_NUI) { if(sEvent == "click") { if(sElem == "btn_ai_menu") { DelayCommand(0.0, NuiDestroy(oPC, nToken)); ai_CreateAssociateAINUI(oPC, oAssociate); } if(sElem == "btn_vertical_widget") { int bVertical = !ai_GetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType); ai_SetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType, bVertical); if(oPC == oAssociate || (oPC != oAssociate && !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType))) { DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } } else if(sElem == "btn_main_menu") { if(ai_GetIsCharacter(oAssociate)) ai_CreateAIMainNUI(oPC); } else if(sElem == "btn_widget_onoff") { ai_ToggleAssociateWidgetOnOff(oPC, nToken, oAssociate, sAssociateType); } else if(sElem == "btn_widget_lock") { int bLocked = !ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType); ai_SetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType, bLocked); if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType) || oPC == oAssociate) { DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } } else if(sElem == "btn_copy_settings") { ai_CreateCopySettingsNUI(oPC, oAssociate); } else if(sElem == "btn_cmd_action") ai_Action(oPC, oAssociate); else if(sElem == "btn_cmd_guard") ai_DoCommand(oPC, oAssociate, 1); else if(sElem == "btn_cmd_hold") ai_DoCommand(oPC, oAssociate, 3); else if(sElem == "btn_cmd_search") ai_DoCommand(oPC, oAssociate, 5); else if(sElem == "btn_cmd_stealth") ai_DoCommand(oPC, oAssociate, 6); else if(sElem == "btn_cmd_attack") ai_DoCommand(oPC, oAssociate, 4); else if(sElem == "btn_cmd_follow") ai_DoCommand(oPC, oAssociate, 2); else if(sElem == "btn_follow_target") ai_FollowTarget(oPC, oAssociate); else if(sElem == "btn_cmd_ai_script") ai_AIScript(oPC, oAssociate, sAssociateType, nToken); else if(sElem == "btn_cmd_place_trap") ai_HavePCPlaceTrap(oPC, oAssociate); else if(sElem == "btn_quick_widget") { DelayCommand(0.0, NuiDestroy(oPC, nToken)); ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate); } else if(sElem == "btn_spell_memorize") { DelayCommand(0.0, NuiDestroy(oPC, nToken)); ai_CreateSpellMemorizationNUI(oPC, oAssociate); } else if(sElem == "btn_spell_known") { DelayCommand(0.0, NuiDestroy(oPC, nToken)); ai_CreateSpellKnownNUI(oPC, oAssociate); } else if(sElem == "btn_buff_short") { ai_Buff_Button(oPC, oAssociate, 2, sAssociateType); DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); } else if(sElem == "btn_buff_long") { ai_Buff_Button(oPC, oAssociate, 3, sAssociateType); DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); } else if(sElem == "btn_buff_all") { ai_Buff_Button(oPC, oAssociate, 1, sAssociateType); DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); } else if(sElem == "btn_buff_rest") ai_Buff_Button(oPC, oAssociate, 0, sAssociateType); else if(sElem == "btn_jump_to") ai_JumpToPC(oPC, oAssociate); else if(sElem == "btn_ghost_mode") ai_GhostMode(oPC, oAssociate, nToken, sAssociateType); else if(sElem == "btn_camera") ai_ChangeCameraView(oPC, oAssociate); else if(sElem == "btn_inventory") ai_OpenInventory(oAssociate, oPC); else if(sElem == "btn_familiar_name") ai_SetCompanionName(oPC, oAssociate, nToken, ASSOCIATE_TYPE_FAMILIAR); else if(sElem == "btn_companion_name") ai_SetCompanionName(oPC, oAssociate, nToken, ASSOCIATE_TYPE_ANIMALCOMPANION); else if(GetStringLeft(sElem, 11) == "btn_plugin_") ai_Plugin_Execute(oPC, sElem); } else if(sEvent == "watch") { if(sElem == "txt_familiar_name") { string sName = JsonGetString(NuiGetBind(oPC, nToken, sElem)); if(sName != "") NuiSetBind(oPC, nToken, "btn_familiar_name_event", JsonBool(TRUE)); else NuiSetBind(oPC, nToken, "btn_familiar_name_event", JsonBool(FALSE)); } if(GetStringLeft(sElem, 12) == "chbx_plugin_" && GetStringRight(sElem, 6) == "_check") { int nIndex = StringToInt(GetSubString(sElem, 12, 1)); json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); json jPlugin = JsonArrayGet(jPlugins, nIndex); int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); jPlugin = JsonArraySet(jPlugin, 1, JsonBool(bCheck)); jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); } else if(sElem == "chbx_buff_rest_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_REST, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_action_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_guard_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_hold_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_search_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_stealth_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_attack_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_follow_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_ai_script_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cmd_place_trap_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_quick_widget_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_follow_target_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_buff_short_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_buff_long_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_buff_all_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_jump_to_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_ghost_mode_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_camera_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_inventory_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_familiar_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_companion_check") ai_SetWidgetButtonToCheckbox(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "cmb_familiar_selected") ai_SetCompanionType(oPC, oAssociate, nToken, ASSOCIATE_TYPE_FAMILIAR); else if(sElem == "cmb_companion_selected") ai_SetCompanionType(oPC, oAssociate, nToken, ASSOCIATE_TYPE_ANIMALCOMPANION); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } else if(sEvent == "mousescroll") { float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); if(nMouseScroll == 1.0) // Scroll up { // Follow range is only changed on non-pc's if(sElem == "btn_cmd_follow" && oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); } else if(nMouseScroll == -1.0) // Scroll down { // Follow range is only changed on non-pc's if(sElem == "btn_cmd_follow" && oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); } } return; } //************************************************************************** // Associate AI events. if(sWndId == sAssociateType + AI_NUI) { if(sEvent == "click") { if(sElem == "btn_command_menu") { DelayCommand(0.0, NuiDestroy(oPC, nToken)); ai_CreateAssociateCommandNUI(oPC, oAssociate); } if(sElem == "btn_main_menu") { if(ai_GetIsCharacter(oAssociate)) ai_CreateAIMainNUI(oPC); } else if(sElem == "btn_loot_filter") { ai_CreateLootFilterNUI(oPC, oAssociate); } else if(sElem == "btn_ai") { if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") ai_TurnOff(oPC, oAssociate, sAssociateType); else ai_TurnOn(oPC, oAssociate, sAssociateType); } else if(sElem == "btn_quiet") ai_ReduceSpeech(oPC, oAssociate, sAssociateType); else if(sElem == "btn_ranged") AssignCommand(oAssociate, ai_Ranged(oPC, oAssociate, sAssociateType)); else if(sElem == "btn_equip_weapon") ai_EquipWeapons(oPC, oAssociate, sAssociateType); else if(sElem == "btn_search") ai_Search(oPC, oAssociate, sAssociateType); else if(sElem == "btn_stealth") ai_Stealth(oPC, oAssociate, sAssociateType); else if(sElem == "btn_open_door") ai_OpenDoor(oPC, oAssociate, sAssociateType); else if(sElem == "btn_traps") ai_Traps(oPC, oAssociate, sAssociateType); else if(sElem == "btn_pick_locks") ai_Locks(oPC, oAssociate, sAssociateType, 1); else if(sElem == "btn_bash_locks") ai_Locks(oPC, oAssociate, sAssociateType, 2); else if(sElem == "btn_magic") ai_UseMagic(oPC, oAssociate, sAssociateType); else if(sElem == "btn_magic_items") ai_UseMagicItems(oPC, oAssociate, sAssociateType); else if(sElem == "btn_def_magic") ai_UseOffensiveMagic(oPC, oAssociate, TRUE, FALSE, sAssociateType); else if(sElem == "btn_off_magic") ai_UseOffensiveMagic(oPC, oAssociate, FALSE, TRUE, sAssociateType); else if(sElem == "btn_spontaneous") ai_Spontaneous(oPC, oAssociate, sAssociateType); else if(sElem == "btn_heals_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 1); else if(sElem == "btn_healp_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 2); else if(sElem == "btn_cure_onoff") ai_Cure_OnOff(oPC, oAssociate, sAssociateType); else if(sElem == "btn_loot") ai_Loot(oPC, oAssociate, sAssociateType); else if(sElem == "btn_ignore_assoc") ai_Ignore_Associates(oPC, oAssociate, sAssociateType); else if(sElem == "btn_ignore_traps") ai_Ignore_Traps(oPC, oAssociate, sAssociateType); else if(sElem == "btn_perc_range") ai_Perc_Range(oPC, oAssociate, nToken, sAssociateType); else if(sElem == "btn_ai_script") ai_SaveAIScript(oPC, oAssociate, nToken); } else if(sEvent == "watch") { SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); if(sElem == "chbx_ai_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_quiet_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_ranged_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_equip_weapon_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_search_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_stealth_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_open_door_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_traps_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_pick_locks_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_bash_locks_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_magic_level_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_spontaneous_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_magic_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_magic_items_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_def_magic_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_off_magic_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_heal_out_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_heal_in_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_heals_onoff_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_healp_onoff_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_cure_onoff_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_loot_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_LOOT, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_ignore_assoc_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_ignore_traps_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "chbx_perc_range_check") ai_SetAIButtonToCheckbox(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType, nToken, sElem); else if(sElem == "cmb_ai_script_selected") ai_SetAIScript(oPC, oAssociate, nToken); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } else if(sEvent == "mousescroll") { float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); if(nMouseScroll == 1.0) // Scroll up { if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, 1, sAssociateType, nToken); } else if(nMouseScroll == -1.0) // Scroll down { if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, -1, sAssociateType, nToken); } } return; } //************************************************************************** // Associate Widget events. if(sWndId == sAssociateType + AI_WIDGET_NUI) { if(sEvent == "click") { if(sElem == "btn_open_main") { // If all the Command buttons are blocked then don't load the menu. if(GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028) { if(IsWindowClosed(oPC, sAssociateType + AI_COMMAND_NUI)) { ai_CreateAssociateCommandNUI(oPC, oAssociate); } IsWindowClosed(oPC, sAssociateType + AI_NUI); IsWindowClosed(oPC, sAssociateType + AI_LOOTFILTER_NUI); IsWindowClosed(oPC, sAssociateType + AI_COPY_NUI); IsWindowClosed(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); IsWindowClosed(oPC, sAssociateType + AI_SPELL_MEMORIZE_NUI); IsWindowClosed(oPC, sAssociateType + AI_SPELL_KNOWN_NUI); if(ai_GetIsCharacter(oAssociate)) { IsWindowClosed(oPC, AI_MAIN_NUI); IsWindowClosed(oPC, AI_PLUGIN_NUI); } } } else if(sElem == "btn_ai") { if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") { ai_TurnOff(oPC, oAssociate, sAssociateType); } else ai_TurnOn(oPC, oAssociate, sAssociateType); } else if(sElem == "btn_quiet") ai_ReduceSpeech(oPC, oAssociate, sAssociateType); else if(sElem == "btn_ranged") AssignCommand(oAssociate, ai_Ranged(oPC, oAssociate, sAssociateType)); else if(sElem == "btn_equip_weapon") ai_EquipWeapons(oPC, oAssociate, sAssociateType); else if(sElem == "btn_search") ai_Search(oPC, oAssociate, sAssociateType); else if(sElem == "btn_stealth") ai_Stealth(oPC, oAssociate, sAssociateType); else if(sElem == "btn_open_door") ai_OpenDoor(oPC, oAssociate, sAssociateType); else if(sElem == "btn_traps") ai_Traps(oPC, oAssociate, sAssociateType); else if(sElem == "btn_pick_locks") ai_Locks(oPC, oAssociate, sAssociateType, 1); else if(sElem == "btn_bash_locks") ai_Locks(oPC, oAssociate, sAssociateType, 2); else if(sElem == "btn_magic_minus") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); else if(sElem == "btn_magic_plus") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); else if(sElem == "btn_magic") ai_UseMagic(oPC, oAssociate, sAssociateType); else if(sElem == "btn_magic_items") ai_UseMagicItems(oPC, oAssociate, sAssociateType); else if(sElem == "btn_def_magic") ai_UseOffensiveMagic(oPC, oAssociate, TRUE, FALSE, sAssociateType); else if(sElem == "btn_off_magic") ai_UseOffensiveMagic(oPC, oAssociate, FALSE, TRUE, sAssociateType); else if(sElem == "btn_cure_onoff") ai_Cure_OnOff(oPC, oAssociate, sAssociateType); else if(sElem == "btn_loot") ai_Loot(oPC, oAssociate, sAssociateType); else if(sElem == "btn_ignore_assoc") ai_Ignore_Associates(oPC, oAssociate, sAssociateType); else if(sElem == "btn_ignore_traps") ai_Ignore_Traps(oPC, oAssociate, sAssociateType); else if(sElem == "btn_perc_range") ai_Perc_Range(oPC, oAssociate, nToken, sAssociateType); else if(sElem == "btn_spontaneous") ai_Spontaneous(oPC, oAssociate, sAssociateType); else if(sElem == "btn_buff_short") { ai_Buff_Button(oPC, oAssociate, 2, sAssociateType); DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); } else if(sElem == "btn_buff_long") { ai_Buff_Button(oPC, oAssociate, 3, sAssociateType); DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); } else if(sElem == "btn_buff_all") { ai_Buff_Button(oPC, oAssociate, 1, sAssociateType); DelayCommand(6.0, ai_UpdateAssociateWidget(oPC, oAssociate)); } else if(sElem == "btn_buff_rest") ai_Buff_Button(oPC, oAssociate, 0, sAssociateType); else if(sElem == "btn_jump_to") ai_JumpToPC(oPC, oAssociate); else if(sElem == "btn_ghost_mode") ai_GhostMode(oPC, oAssociate, nToken, sAssociateType); else if(sElem == "btn_camera") ai_ChangeCameraView(oPC, oAssociate); else if(sElem == "btn_inventory") ai_OpenInventory(oAssociate, oPC); else if(sElem == "btn_familiar") { if(GetHasFeat(FEAT_SUMMON_FAMILIAR, oAssociate)) { DecrementRemainingFeatUses(oAssociate, FEAT_SUMMON_FAMILIAR); SummonFamiliar(oAssociate); } } else if(sElem == "btn_companion") { if(GetHasFeat(FEAT_ANIMAL_COMPANION, oAssociate)) { DecrementRemainingFeatUses(oAssociate, FEAT_ANIMAL_COMPANION); SummonAnimalCompanion(oAssociate); } } else if(sElem == "btn_heals_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 1); else if(sElem == "btn_healp_onoff") ai_Heal_OnOff(oPC, oAssociate, sAssociateType, 2); else if(sElem == "btn_cmd_action") ai_Action(oPC, oAssociate); else if(sElem == "btn_cmd_guard") ai_DoCommand(oPC, oAssociate, 1); else if(sElem == "btn_cmd_hold") ai_DoCommand(oPC, oAssociate, 3); else if(sElem == "btn_cmd_search") ai_DoCommand(oPC, oAssociate, 5); else if(sElem == "btn_cmd_stealth") ai_DoCommand(oPC, oAssociate, 6); else if(sElem == "btn_cmd_attack") ai_DoCommand(oPC, oAssociate, 4); else if(sElem == "btn_cmd_follow") ai_DoCommand(oPC, oAssociate, 2); else if(sElem == "btn_cmd_ai_script") ai_AIScript(oPC, oAssociate, sAssociateType, nToken); else if(sElem == "btn_cmd_place_trap") ai_HavePCPlaceTrap(oPC, oAssociate); else if(sElem == "btn_follow_target") ai_FollowTarget(oPC, oAssociate); else if(sElem == "btn_update_widget") ai_UpdateAssociateWidget(oPC, oAssociate); else if(GetStringLeft(sElem, 15) == "btn_exe_plugin_") ai_Plugin_Execute(oPC, sElem); else if(GetStringLeft(sElem, 11) == "btn_widget_") ai_SelectWidgetSpellTarget(oPC, oAssociate, sElem); } if(sEvent == "mousescroll") { float nMouseScroll = JsonGetFloat(JsonObjectGet(JsonObjectGet(NuiGetEventPayload(), "mouse_scroll"), "y")); if(nMouseScroll == 1.0) // Scroll up { if(sElem == "btn_cmd_follow" && oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, 1, sAssociateType); else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, 5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, 1.0, sAssociateType); else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, 1, sAssociateType, -1); } if(nMouseScroll == -1.0) // Scroll down { if(sElem == "btn_cmd_follow" && oPC != oAssociate) ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_follow_target") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_magic_plus") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); if(sElem == "btn_magic_level") ai_MagicIncrement(oPC, oAssociate, -1, sAssociateType); else if(sElem == "btn_pick_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_bash_locks") ai_LockRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_traps") ai_TrapRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_open_door") ai_OpenDoorIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_heal_out") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_OUT_OF_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_heal_in") ai_Heal_Button(oPC, oAssociate, -5, AI_HEAL_IN_COMBAT_LIMIT, sAssociateType); else if(sElem == "btn_loot") ai_LootRangeIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(sElem == "btn_perc_range") ai_PercRangeIncrement(oPC, oAssociate, -1, sAssociateType, -1); } } if(sEvent == "mousedown") { int nMouseButton = JsonGetInt(JsonObjectGet(NuiGetEventPayload(), "mouse_btn")); if(nMouseButton == NUI_MOUSE_BUTTON_RIGHT) { AssignCommand(oPC, PlaySound("gui_button")); if(sElem == "btn_open_main") { // If all the AI buttons are blocked then don't load the menu. if(GetLocalInt(GetModule(), sDMAIAccessVarname) != 203423743) { if(IsWindowClosed(oPC, sAssociateType + AI_NUI)) { ai_CreateAssociateAINUI(oPC, oAssociate); } } IsWindowClosed(oPC, sAssociateType + AI_COMMAND_NUI); IsWindowClosed(oPC, sAssociateType + AI_LOOTFILTER_NUI); IsWindowClosed(oPC, sAssociateType + AI_COPY_NUI); IsWindowClosed(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); IsWindowClosed(oPC, sAssociateType + AI_SPELL_MEMORIZE_NUI); IsWindowClosed(oPC, sAssociateType + AI_SPELL_KNOWN_NUI); if(ai_GetIsCharacter(oAssociate)) { IsWindowClosed(oPC, AI_MAIN_NUI); IsWindowClosed(oPC, AI_PLUGIN_NUI); } } else if(sElem == "btn_follow_range") ai_FollowIncrement(oPC, oAssociate, -1.0, sAssociateType); else if(GetStringLeft(sElem, 11) == "btn_widget_") { if(GetStringLength(sElem) == 13) nIndex = StringToInt(GetStringRight(sElem, 2)); else nIndex = StringToInt(GetStringRight(sElem, 1)); json jAIData = ai_GetAssociateDbJson(oPC, ai_GetAssociateType(oPC, oAssociate), "aidata"); json jSpells = JsonArrayGet(jAIData, 10); json jWidget = JsonArrayGet(jSpells, 2); json jSpell = JsonArrayGet(jWidget, nIndex); ai_CreateDescriptionNUI(oPC, jSpell); } } } return; } //************************************************************************** // Associate Loot events. if(sWndId == sAssociateType + AI_LOOTFILTER_NUI) { if(sEvent == "click") { if(sElem == "btn_set_all") { SetLocalInt(oPC, "AI_BLOCK_CHECKS", TRUE); SetLocalInt(oAssociate, sLootFilterVarname, 65535); int nIndex; for(nIndex = 2; nIndex < 20; nIndex++) { NuiSetBind(oPC, nToken, "chbx_" + IntToString(nIndex) + "_check", JsonBool (TRUE)); } json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); jLootFilter = JsonArraySet(jLootFilter, 1, JsonInt(65535)); ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); DelayCommand(1.0, DeleteLocalInt(oPC, "AI_BLOCK_CHECKS")); } else if(sElem == "btn_clear_all") { SetLocalInt(oPC, "AI_BLOCK_CHECKS", TRUE); SetLocalInt(oAssociate, sLootFilterVarname, 0); int nIndex; for(nIndex = 2; nIndex < 20; nIndex++) { NuiSetBind(oPC, nToken, "chbx_" + IntToString(nIndex) + "_check", JsonBool (FALSE)); } json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); jLootFilter = JsonArraySet(jLootFilter, 1, JsonInt(0)); ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); DelayCommand(1.0, DeleteLocalInt(oPC, "AI_BLOCK_CHECKS")); } } else if(sEvent == "watch") { if(GetStringLeft(sElem, 5) == "chbx_") { if(GetLocalInt(oPC, "AI_BLOCK_CHECKS")) return; if(sElem == "chbx_give_loot_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_GIVE_TO_PC, nToken, sElem); else if(sElem == "chbx_2_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_PLOT, nToken, sElem); else if(sElem == "chbx_3_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_ARMOR, nToken, sElem); else if(sElem == "chbx_4_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BELTS, nToken, sElem); else if(sElem == "chbx_5_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BOOTS, nToken, sElem); else if(sElem == "chbx_6_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_CLOAKS, nToken, sElem); else if(sElem == "chbx_7_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_GEMS, nToken, sElem); else if(sElem == "chbx_8_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_GLOVES, nToken, sElem); else if(sElem == "chbx_9_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_HEADGEAR, nToken, sElem); else if(sElem == "chbx_10_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_JEWELRY, nToken, sElem); else if(sElem == "chbx_11_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_MISC, nToken, sElem); else if(sElem == "chbx_12_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_POTIONS, nToken, sElem); else if(sElem == "chbx_13_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_SCROLLS, nToken, sElem); else if(sElem == "chbx_14_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_SHIELDS, nToken, sElem); else if(sElem == "chbx_15_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_WANDS_RODS_STAVES, nToken, sElem); else if(sElem == "chbx_16_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_WEAPONS, nToken, sElem); else if(sElem == "chbx_17_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_ARROWS, nToken, sElem); else if(sElem == "chbx_18_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BOLTS, nToken, sElem); else if(sElem == "chbx_19_check") ai_SetLootFilterToCheckbox(oPC, oAssociate, AI_LOOT_BULLETS, nToken, sElem); json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); int nLootFilter = GetLocalInt(oAssociate, sLootFilterVarname); jLootFilter = JsonArraySet(jLootFilter, 1, JsonInt(nLootFilter)); ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); } else if(GetStringLeft(sElem, 4) == "txt_") { if(sElem == "txt_max_weight") { int nMaxWeight = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, sElem))); if(nMaxWeight > 1000) nMaxWeight = 1000; if(nMaxWeight < 1) nMaxWeight = 1; SetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT, nMaxWeight); json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); jLootFilter = JsonArraySet(jLootFilter, 0, JsonInt(nMaxWeight)); ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); return; } if(GetStringLeft(sElem, 9) == "txt_gold_") { int nAmount = StringToInt(JsonGetString(NuiGetBind(oPC, nToken, sElem))); int nIndex; if(GetStringLength(sElem) == 11) nIndex = StringToInt(GetStringRight(sElem, 2)); else nIndex = StringToInt(GetStringRight(sElem, 1)); SetLocalInt(oAssociate, AI_MIN_GOLD_ + IntToString(nIndex), nAmount); json jLootFilter = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); jLootFilter = JsonArraySet(jLootFilter, nIndex, JsonInt(nAmount)); ai_SetAssociateDbJson(oPC, sAssociateType, "lootfilters", jLootFilter); } } } return; } //************************************************************************** // Associate Paste events. if(sWndId == sAssociateType + AI_COPY_NUI) { if(sEvent == "click") { int nIndex, nAssociateType = GetAssociateType(oAssociate); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); object oAssoc; string sAssocType; json jModes = ai_GetAssociateDbJson(oPC, sAssociateType, "modes"); json jButtons = ai_GetAssociateDbJson(oPC, sAssociateType, "buttons"); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jLootFilters = ai_GetAssociateDbJson(oPC, sAssociateType, "lootfilters"); string sCombatScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); string sDefaultScript = GetLocalString(oAssociate, AI_DEFAULT_SCRIPT); if(sElem == "btn_paste_all") { // Check all non-henchman associates. for(nIndex = 2; nIndex < 6; nIndex++) { if(nAssociateType != nIndex) { oAssoc = GetAssociate(nIndex, oPC); sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); if(oAssoc != OBJECT_INVALID) { // Clear the creatures Perception distance so we can // repopulate the local variables. SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); ai_CheckAssociateData(oPC, oAssoc, sAssocType); if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) { DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); } } } } // Check all of our henchman. for(nIndex = 1; nIndex <= AI_MAX_HENCHMAN; nIndex++) { oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oAssoc != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); // Clear the creatures Perception distance so we can // repopulate the local variables. SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); ai_CheckAssociateData(oPC, oAssoc, sAssocType); if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) { DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); } } else break; } ai_SendMessages(GetName(oAssociate) + "'s settings have been copied to all associates.", AI_COLOR_GREEN, oPC); return; } else if(GetStringLeft(sElem, 18) == "btn_paste_henchman") { int nIndex = StringToInt(GetStringRight(sElem, 1)); oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oAssoc != OBJECT_INVALID) { sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); // Clear the creatures Perception distance so we can // repopulate the local variables. SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); ai_CheckAssociateData(oPC, oAssoc, sAssocType); if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) { DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); } ai_SendMessages(GetName(oAssociate) + "'s settings have been copied to " + GetName(oAssoc) + ".", AI_COLOR_GREEN, oPC); } return; } else if(sElem == "btn_paste_familiar") nIndex = ASSOCIATE_TYPE_FAMILIAR; else if(sElem == "btn_paste_companion") nIndex = ASSOCIATE_TYPE_ANIMALCOMPANION; else if(sElem == "btn_paste_summons") nIndex = ASSOCIATE_TYPE_SUMMONED; else if(sElem == "btn_paste_dominated") nIndex = ASSOCIATE_TYPE_DOMINATED; if(nIndex > 1 && nIndex < 6) { oAssoc = GetAssociate(nIndex, oPC); sAssocType = ai_GetAssociateType(oPC, oAssoc); ai_SetAssociateDbJson(oPC, sAssocType, "modes", jModes); ai_SetAssociateDbJson(oPC, sAssocType, "buttons", jButtons); ai_SetAssociateDbJson(oPC, sAssocType, "aidata", jAIData); ai_SetAssociateDbJson(oPC, sAssocType, "lootfilters", jLootFilters); SetLocalString(oAssoc, AI_COMBAT_SCRIPT, sCombatScript); SetLocalString(oAssoc, AI_DEFAULT_SCRIPT, sDefaultScript); if(oAssoc != OBJECT_INVALID) { // Clear the creatures Perception distance so we can // repopulate the local variables. SetLocalFloat(oAssoc, AI_ASSOC_PERCEPTION_DISTANCE, 0.0); ai_CheckAssociateData(oPC, oAssoc, sAssocType); if(!ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssoc, sAssocType)) { DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssocType + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssoc)); } ai_SendMessages(GetName(oAssociate) + "'s settings have been copied to " + GetName(oAssoc) + ".", AI_COLOR_GREEN, oPC); } } } return; } //************************************************************************** // Plugins events. if(sWndId == AI_PLUGIN_NUI) { if(sEvent == "click") { if(sElem == "btn_load_plugins") { json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_buffing"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_forcerest"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_henchmen"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_crafting"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_mod_set"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_debug"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "pi_test"); ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreatePluginNUI(oPC)); } if(sElem == "btn_load_m_mods") { json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); jPlugins = ai_Plugin_Add(oPC, jPlugins, "mm_prc_spells"); ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreatePluginNUI(oPC)); } if(sElem == "btn_check_plugins") { json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); int nIndex; json jPlugin = JsonArrayGet(jPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { if(JsonGetInt(JsonArrayGet(jPlugin, 1)) < 3) { jPlugin = JsonArraySet(jPlugin, 1, JsonBool(TRUE)); jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); } jPlugin = JsonArrayGet(jPlugins, ++nIndex); } ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreatePluginNUI(oPC)); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); } if(sElem == "btn_clear_plugins") { json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); int nIndex; json jPlugin = JsonArrayGet(jPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { if(JsonGetInt(JsonArrayGet(jPlugin, 1)) < 3) { jPlugin = JsonArraySet(jPlugin, 1, JsonBool(FALSE)); jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); } jPlugin = JsonArrayGet(jPlugins, ++nIndex); } ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreatePluginNUI(oPC)); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); } else if(sElem == "btn_add_plugin") { string sScript = JsonGetString(NuiGetBind (oPC, nToken, "txt_plugin")); json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); jPlugins = ai_Plugin_Add(oPC, jPlugins, sScript); ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreatePluginNUI(oPC)); } else if(GetStringLeft(sElem, 18) == "btn_remove_plugin_") { int nIndex = StringToInt(GetStringRight(sElem, 1)); json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); jPlugins = JsonArrayDel(jPlugins, nIndex); ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreatePluginNUI(oPC)); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); } else if(GetStringLeft(sElem, 11) == "btn_plugin_") ai_Plugin_Execute(oPC, sElem); } else if(sEvent == "watch") { if(GetStringLeft(sElem, 12) == "chbx_plugin_" && GetStringRight(sElem, 6) == "_check") { int nIndex = StringToInt(GetSubString(sElem, 12, 1)); json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); json jPlugin = JsonArrayGet(jPlugins, nIndex); int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); jPlugin = JsonArraySet(jPlugin, 1, JsonBool(bCheck)); jPlugins = JsonArraySet(jPlugins, nIndex, jPlugin); ai_SetAssociateDbJson(oPC, "pc", "plugins", jPlugins); DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, "pc" + AI_WIDGET_NUI))); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oPC)); } } return; } //************************************************************************** // Quick Use Widget events. if(sWndId == sAssociateType + AI_QUICK_WIDGET_NUI) { if(sEvent == "click") { if(GetStringLeft(sElem, 10) == "btn_class_") // Changes the class. { string sClassPosition = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); jSpells = JsonArraySet(jSpells, 0, JsonInt(StringToInt(sClassPosition))); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); } else if(GetStringLeft(sElem, 10) == "btn_level_") // Changes the level. { string sLevel; if(GetStringLength(sElem) == 12) sLevel = GetStringRight(sElem, 2); else sLevel = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); jSpells = JsonArraySet(jSpells, 1, JsonInt(StringToInt(sLevel))); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); } else if(sElem == "btn_text_spell") // Adds abilities to quick use widget. { json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); json jWidget = JsonArrayGet(jSpells, 2); if(JsonGetType(jWidget) == JSON_TYPE_NULL) { jWidget = JsonArray(); if(JsonGetLength(jSpells) == 2) jSpells = JsonArrayInsert(jSpells, JsonArray()); } if(JsonGetLength(jWidget) < 20) { json jData = NuiGetUserData(oPC, nToken); json jQuickListArray = JsonArrayGet(jData, 1); json jSpell = JsonArrayGet(jQuickListArray, nIndex); jWidget = JsonArrayInsert(jWidget, jSpell); jSpells = JsonArraySet(jSpells, 2, jWidget); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); } else ai_SendMessages("The quick widget can only have 20 abilities or spells!", AI_COLOR_RED, oPC); } else if(sElem == "btn_info_spell") { json jQuickListArray = JsonArrayGet(jData, 1); json jSpell = JsonArrayGet(jQuickListArray, nIndex); ai_CreateDescriptionNUI(oPC, jSpell); } else if(GetStringLeft(sElem, 11) == "btn_widget_") { string sIndex; if(GetStringLength(sElem) == 13) sIndex = GetStringRight(sElem, 2); else sIndex = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); json jWidget = JsonArrayGet(jSpells, 2); jWidget = JsonArrayDel(jWidget, StringToInt(sIndex)); jSpells = JsonArraySet(jSpells, 2, jWidget); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateQuickWidgetSelectionNUI(oPC, oAssociate)); } } else if(sEvent == "close") { int nUIToken = NuiFindWindow(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); if(nUIToken) { DelayCommand(0.0, NuiDestroy(oPC, nUIToken)); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } } return; } //************************************************************************** // Spell Memorization events. if(sWndId == sAssociateType + AI_SPELL_MEMORIZE_NUI) { if(sEvent == "click") { if(GetStringLeft(sElem, 10) == "btn_class_") // Changes the class. { string sClassPosition = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); jSpells = JsonArraySet(jSpells, 0, JsonInt(StringToInt(sClassPosition))); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateSpellMemorizationNUI(oPC, oAssociate)); } else if(GetStringLeft(sElem, 10) == "btn_level_") // Changes the level. { string sLevel = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); jSpells = JsonArraySet(jSpells, 1, JsonInt(StringToInt(sLevel))); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateSpellMemorizationNUI(oPC, oAssociate)); } else if(sElem == "btn_text_spell") // Adds spell to memorization. { json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); json jSpellArray = JsonArrayGet(jData, 1); int nMaxMemorizationSlot = GetMemorizedSpellCountByLevel(oAssociate, nClass, nLevel); int nSlot, nSpell; while(nSlot < nMaxMemorizationSlot) { if(GetMemorizedSpellId(oAssociate, nClass, nLevel, nSlot) == -1) { nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); SetMemorizedSpell(oAssociate, nClass, nLevel, nSlot, nSpell, FALSE); //NuiDestroy(oPC, nToken); //ai_CreateSpellMemorizationNUI(oPC, oAssociate); string sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); string sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); string sIndex = IntToString(nSlot); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); return; } nSlot++; } if(nSlot >= nMaxMemorizationSlot) ai_SendMessages("All spell memorization slots are full!", AI_COLOR_RED, oPC); } else if(sElem == "btn_info_spell") { json jSpellArray = JsonArrayGet(jData, 1); int nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); ai_CreateDescriptionNUI(oPC, JsonArray(), nSpell); } else if(GetStringLeft(sElem, 14) == "btn_memorized_") { json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); string sIndex = GetStringRight(sElem, 1); ClearMemorizedSpell(oAssociate, nClass, nLevel, StringToInt(sIndex)); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_tooltip", JsonString("")); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(FALSE)); //NuiDestroy(oPC, nToken); //ai_CreateSpellMemorizationNUI(oPC, oAssociate); } } else if(sEvent == "close") { int nUIToken = NuiFindWindow(oPC, sAssociateType + AI_QUICK_WIDGET_NUI); if(nUIToken) { DelayCommand(0.0, NuiDestroy(oPC, nUIToken)); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } } return; } //************************************************************************** // Spell Known events. if(sWndId == sAssociateType + AI_SPELL_KNOWN_NUI) { if(sEvent == "click") { if(GetStringLeft(sElem, 10) == "btn_class_") // Changes the class. { string sClassPosition = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); jSpells = JsonArraySet(jSpells, 0, JsonInt(StringToInt(sClassPosition))); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateSpellKnownNUI(oPC, oAssociate)); } else if(GetStringLeft(sElem, 10) == "btn_level_") // Changes the level. { string sLevel = GetStringRight(sElem, 1); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); jSpells = JsonArraySet(jSpells, 1, JsonInt(StringToInt(sLevel))); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateSpellKnownNUI(oPC, oAssociate)); } else if(sElem == "btn_text_spell") // Adds spell to known list. { json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); json jSpellArray = JsonArrayGet(jData, 1); int nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); // Get the correct class array. int bAddList, nClassIndex = 0; json jClass = JsonArrayGet(jClassList, nClassIndex); while(JsonGetInt(GffGetInt(jClass, "Class")) != nClass) { jClass = JsonArrayGet(jClassList, ++nClassIndex); } string sLevel = IntToString(nLevel); json jSpell, jKnownList = GffGetList(jClass, "KnownList" + sLevel); if(JsonGetType(jKnownList) == JSON_TYPE_NULL) { bAddList = TRUE; jKnownList = JsonArray(); } int nMaxKnownSlots, nSlot; string sSpellKnownTable = Get2DAString("classes", "SpellKnownTable", nClass); if(sSpellKnownTable != "") nMaxKnownSlots = StringToInt(Get2DAString(sSpellKnownTable, "SpellLevel" + sLevel, GetLevelByClass(nClass, oAssociate) - 1)); else nMaxKnownSlots = 20; while(nSlot < nMaxKnownSlots) { jSpell = JsonArrayGet(jKnownList, nSlot); if(JsonGetType(jSpell) == JSON_TYPE_NULL) { jSpell = GffAddWord(JsonObject(), "Spell", nSpell); jSpell = JsonObjectSet(jSpell, "__struct_id", JsonInt(3)); jKnownList = JsonArrayInsert(jKnownList, jSpell); string sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); string sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); string sIndex = IntToString(nSlot); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + sLevel + ")")); SetLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE", TRUE); break; } else if(JsonGetInt(GffGetWord(jSpell, "Spell")) == nSpell) { string sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); ai_SendMessages(sName + " is already in the known spell list!", AI_COLOR_RED, oPC); return; } nSlot++; } if(nSlot >= nMaxKnownSlots) { ai_SendMessages("All known spell slots are full!", AI_COLOR_RED, oPC); return; } if(bAddList) jClass = GffAddList(jClass, "KnownList" + sLevel, jKnownList); else jClass = GffReplaceList(jClass, "KnownList" + sLevel, jKnownList); jClassList = JsonArraySet(jClassList, nClassIndex, jClass); SetLocalJson(oAssociate, AI_CLASS_LIST_JSON, jClassList); } else if(sElem == "btn_info_spell") { json jSpellArray = JsonArrayGet(jData, 1); int nSpell = JsonGetInt(JsonArrayGet(jSpellArray, nIndex)); ai_CreateDescriptionNUI(oPC, JsonArray(), nSpell); } else if(GetStringLeft(sElem, 10) == "btn_known_") // Remove a known spell. { json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); int nClass = GetClassByPosition(JsonGetInt(JsonArrayGet(jSpells, 0)), oAssociate); int nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); string sIndex = GetStringRight(sElem, 1); // Check to see if there is a spell in this slot. string sImageName = JsonGetString(NuiGetBind(oPC, nToken, "btn_known_" + sIndex + "_image")); if(sImageName == "ctl_cg_btn_splvl") return; json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); // Get the correct class array. int nClassIndex = 0; json jClass = JsonArrayGet(jClassList, nClassIndex); while(JsonGetInt(GffGetInt(jClass, "Class")) != nClass) { jClass = JsonArrayGet(jClassList, ++nClassIndex); } string sLevel = IntToString(nLevel); json jKnownList = GffGetList(jClass, "KnownList" + sLevel); jKnownList = JsonArrayDel(jKnownList, StringToInt(sIndex)); jClass = GffReplaceList(jClass, "KnownList" + sLevel, jKnownList); jClassList = JsonArraySet(jClassList, nClassIndex, jClass); SetLocalJson(oAssociate, AI_CLASS_LIST_JSON, jClassList); SetLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE", TRUE); // Relist all known spells so they match the index. int nMaxKnownSlots, nSpell; string sName, sSpellIcon, sClass = IntToString(nClass); string sSpellKnownTable = Get2DAString("classes", "SpellKnownTable", nClass); json jSpell; if(sSpellKnownTable != "") nMaxKnownSlots = StringToInt(Get2DAString(sSpellKnownTable, "SpellLevel" + IntToString(nLevel), GetLevelByClass(nClass, oAssociate) - 1)); else nMaxKnownSlots = 20; nIndex = 0; while(nIndex < 20) { sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(TRUE)); if(nIndex < nMaxKnownSlots) { jSpell = JsonArrayGet(jKnownList, nIndex); if(JsonGetType(jSpell) == JSON_TYPE_NULL) { NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" Empty known spell slot")); } else { nSpell = JsonGetInt(GffGetWord(jSpell, "Spell")); sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); //nMetaMagic = 255; //nDomain = 0; sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, -1, -1, -1, nMetaMagic, nDomain); //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); } } else { NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); NuiSetBind(oPC, nToken, "btn_known_" + sIndex + "_event", JsonBool(FALSE)); } ++nIndex; } } } else if(sEvent == "close") { if(GetLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE")) { RemoveHenchman(oPC, oAssociate); json jHenchman = ObjectToJson(oAssociate, TRUE); json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); jHenchman = GffReplaceList(jHenchman, "ClassList", jClassList); location lLocation = GetLocation(oAssociate); int nFamiliar, nCompanion; object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; AssignCommand(oAssociate, SetIsDestroyable(TRUE, FALSE, FALSE)); DestroyObject(oAssociate); oAssociate = ai_AddHenchman(oPC, jHenchman, lLocation, nFamiliar, nCompanion); DeleteLocalInt(oAssociate, "AI_KNOWN_SPELL_CHANGE"); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); } } return; } //************************************************************************** // Spell Description events. if(sWndId == AI_SPELL_DESCRIPTION_NUI) { if(sEvent == "click" && sElem == "btn_ok") DelayCommand(0.0, NuiDestroy(oPC, nToken)); } //************************************************************************** // Effect Icon NUI events. if(sWndId == AI_EFFECT_ICON_NUI) { if(sEvent == "click") { if(GetStringLeft(sElem, 18) == "btn_remove_effect_") { int nEffectIndex = StringToInt(GetStringRight(sElem, GetStringLength(sElem) - 18)); json jEffectID = JsonArrayGet(jData, 2); string sEffectLinkID = JsonGetString(JsonArrayGet(jEffectID, nEffectIndex)); int nIndex; effect eEffect = GetFirstEffect(oPC); while(GetIsEffectValid(eEffect)) { if(GetEffectLinkId(eEffect) == sEffectLinkID) { RemoveEffect(oPC, eEffect); int nEffectIconToken = NuiFindWindow(oPC, AI_EFFECT_ICON_NUI); if(nEffectIconToken) DelayCommand(0.0, NuiDestroy(oPC, nEffectIconToken)); } nIndex++; eEffect = GetNextEffect(oPC); } } } else if(sEvent == "mousedown") { AssignCommand(oPC, PlaySound("gui_button")); DelayCommand(0.0, NuiDestroy(oPC, nToken)); } } } void ai_SetWidgetButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem) { int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); ai_SetWidgetButton(oPC, nButton, oAssociate, sAssociateType, bCheck); } void ai_SetAIButtonToCheckbox(object oPC, int nButton, object oAssociate, string sAssociateType, int nToken, string sElem) { int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); ai_SetAIButton(oPC, nButton, oAssociate, sAssociateType, bCheck); } void ai_SetLootFilterToCheckbox(object oPC, object oAssociate, int nFilterBit, int nToken, string sElem) { int bCheck = JsonGetInt(NuiGetBind(oPC, nToken, sElem)); ai_SetLootFilter(oAssociate, nFilterBit, bCheck); } void ai_AddAssociate(object oPC, int nToken, json jAssociate, location lLocation, int nFamiliar, int nCompanion, int nRange = 0) { object oAssociate = JsonToObject(jAssociate, lLocation, OBJECT_INVALID, TRUE); //ChangeToStandardFaction(oAssociate, STANDARD_FACTION_COMMONER); //SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 50, oAssociate); //SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 50, oAssociate); //SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 50, oAssociate); //SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 0, oAssociate); AddHenchman(oPC, oAssociate); DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); DelayCommand(0.0, NuiDestroy(oPC, nToken)); DelayCommand(0.1, ai_CreateWidgetNUI(oPC, oAssociate)); if(nRange) SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, nRange); if(nFamiliar) SummonFamiliar(oAssociate); if(nCompanion) SummonAnimalCompanion(oAssociate); } void ai_SetCompanionType(object oPC, object oAssociate, int nToken, int nAssociateType) { if(ai_GetIsCharacter(oAssociate)) return; SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); int nSelection; // Need to remove the henchman before we copy them to keep factions correct. ai_FireHenchman(oPC, oAssociate); json jAssociate = ObjectToJson(oAssociate, TRUE); if(nAssociateType == ASSOCIATE_TYPE_FAMILIAR) { nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_familiar_selected")); jAssociate = GffReplaceInt(jAssociate, "FamiliarType", nSelection); } else if(nAssociateType == ASSOCIATE_TYPE_ANIMALCOMPANION) { nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_companion_selected")); jAssociate = GffReplaceInt(jAssociate, "CompanionType", nSelection); } //ai_Debug("0e_nui", "916", JsonDump(jAssociate, 1)); location lLocation = GetLocation(oAssociate); int nFamiliar, nCompanion; object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; SetIsDestroyable(TRUE, FALSE, FALSE, oAssociate); DestroyObject(oAssociate); DelayCommand(0.1, ai_AddAssociate(oPC, nToken, jAssociate, lLocation, nFamiliar, nCompanion)); } void ai_SetCompanionName(object oPC, object oAssociate, int nToken, int nAssociateType) { if(ai_GetIsCharacter(oAssociate)) return; SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); string sAssociateType; string sName; // Need to remove the henchman before we copy them to keep factions correct. ai_FireHenchman(oPC, oAssociate); json jAssociate = ObjectToJson(oAssociate, TRUE); if(nAssociateType == ASSOCIATE_TYPE_FAMILIAR) { sName = JsonGetString(NuiGetBind(oPC, nToken, "txt_familiar_name")); jAssociate = GffReplaceString(jAssociate, "FamiliarName", sName); } else if(nAssociateType == ASSOCIATE_TYPE_ANIMALCOMPANION) { sAssociateType = "txt_companion_name"; sName = JsonGetString(NuiGetBind(oPC, nToken, "txt_companion_name")); jAssociate = GffReplaceString(jAssociate, "FamiliarName", sName); } location lLocation = GetLocation(oAssociate); int nFamiliar, nCompanion; object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; SetIsDestroyable(TRUE, FALSE, FALSE, oAssociate); DestroyObject(oAssociate); DelayCommand(0.1, ai_AddAssociate(oPC, nToken, jAssociate, lLocation, nFamiliar, nCompanion)); } void ai_SetAIScript(object oPC, object oAssociate, int nToken) { int nSelection = JsonGetInt(NuiGetBind(oPC, nToken, "cmb_ai_script_selected")); if(nSelection == 0) return; string sScript = sScript = ResManFindPrefix("ai_a_", RESTYPE_NCS, nSelection); NuiSetBind(oPC, nToken, "txt_ai_script", JsonString(sScript)); string sOldScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); if(sScript != sOldScript) { SetLocalString(oAssociate, AI_COMBAT_SCRIPT, sScript); SetLocalString(oAssociate, AI_DEFAULT_SCRIPT, sScript); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); if(JsonGetType(JsonArrayGet(jAIData, 8)) == JSON_TYPE_NULL) jAIData = JsonArrayInsert(jAIData, JsonString(sScript)); else jAIData = JsonArraySet(jAIData, 8, JsonString(sScript)); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); ai_SendMessages(GetName(oAssociate) + " is now using " + sScript + " AI script!", AI_COLOR_GREEN, oPC); } else ai_SendMessages(GetName(oAssociate) + " is already using this script! Did not change AI script.", AI_COLOR_RED, oPC); } void ai_PercRangeIncrement(object oPC, object oAssociate, int nIncrement, string sAssociateType, int nToken) { int nAdjustment = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU"); nAdjustment += nIncrement; if(nAdjustment < 8 || nAdjustment > 11) return; SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU", nAdjustment); json jAssociate = ObjectToJson(oAssociate, TRUE); int nHenchPercRange = JsonGetInt(GffGetByte(jAssociate, "PerceptionRange")); string sText, sInfo; if(nAdjustment == nHenchPercRange) { if(nAdjustment == 8) sText = " Perception Range Short [10 meters Sight / 10 meters Listen]"; else if(nAdjustment == 9) sText = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; else if(nAdjustment == 10) sText = " Perception Range Long [35 meters Sight / 20 meters Listen]"; else sText = " Perception Range Default [20 meters Sight / 20 meters Listen]"; sInfo = " "; } else { if(nAdjustment == 8) sText = " !!! Click the Perception Range button to set to short range !!!"; else if(nAdjustment == 9) sText = " !!! Click the Perception Range button to set to medium range !!!"; else if(nAdjustment == 10) sText = " !!! Click the Perception Range button to set to long range !!!"; else sText = " !!! Click the Perception Range button to set to the default range !!!"; sInfo = sText; } ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_perc_range_tooltip", sText); if(nToken > -1) NuiSetBind (oPC, nToken, "lbl_info_label", JsonString(sInfo)); } void ai_Perc_Range(object oPC, object oAssociate, int nToken, string sAssociateType) { if(ai_GetIsCharacter(oAssociate)) return; SetLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE", TRUE); int nBtnPercRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU"); string sText, sText2; float fRange = 20.0; if(nBtnPercRange == 8) { sText = "short"; sText2 = " Perception Range Short [10 meters Sight / 10 meters Listen]"; fRange = 10.0; } else if(nBtnPercRange == 9) { sText = "medium"; sText2 = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; } else if(nBtnPercRange == 10) { sText = "long"; sText2 = " Perception Range Long [35 meters Sight / 20 meters Listen]"; fRange = 35.0; } else if(nBtnPercRange == 11) { sText = "default"; sText2 = " Perception Range Default [20 meters Sight / 20 meters Listen]"; } SetLocalFloat(oAssociate, AI_ASSOC_PERCEPTION_DISTANCE, fRange); SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, nBtnPercRange); json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); jAIData = JsonArraySet(jAIData, 7, JsonInt(nBtnPercRange)); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); // Need to remove the henchman before we copy them to keep factions correct. ai_FireHenchman(oPC, oAssociate); json jAssociate = ObjectToJson(oAssociate, TRUE); int nHenchPercRange = JsonGetInt(GffGetByte(jAssociate, "PerceptionRange")); if(nBtnPercRange == nHenchPercRange) { ai_SendMessages(GetName(oAssociate) + " already has this perception set.", AI_COLOR_YELLOW, oPC); AddHenchman(oPC, oAssociate); DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); return; } DelayCommand(0.0, NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_NUI))); ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_perc_range_tooltip", sText2); ai_SendMessages(GetName(oAssociate) + " has updated their perception range to " + sText + ".", AI_COLOR_YELLOW, oPC); location lLocation = GetLocation(oAssociate); jAssociate = GffReplaceByte(jAssociate, "PerceptionRange", nBtnPercRange); int nFamiliar, nCompanion; object oCompanion = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oAssociate); if(oCompanion != OBJECT_INVALID) nFamiliar = TRUE; oCompanion = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oAssociate); if(oCompanion != OBJECT_INVALID) nCompanion = TRUE; SetIsDestroyable(TRUE, FALSE, FALSE, oAssociate); DestroyObject(oAssociate); DelayCommand(0.1, ai_AddAssociate(oPC, nToken, jAssociate, lLocation, nFamiliar, nCompanion, nBtnPercRange)); } void ai_RulePercDistInc(object oPC, object oModule, int nIncrement, int nToken) { int nAdjustment = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE) + nIncrement; if(nAdjustment < 8 || nAdjustment > 11) return; SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, nAdjustment); string sText; if(nAdjustment == 8) sText = " Monster perception: Short [10 Sight / 10 Listen]"; else if(nAdjustment == 9) sText = " Monster perception: Medium [20 Sight / 20 Listen]"; else if(nAdjustment == 10) sText = " Monster perception: Long [35 Sight / 20 Listen]"; else sText = " Monster perception: Default [Monster's default values]"; NuiSetBind(oPC, nToken, "lbl_perc_dist_label", JsonString(sText)); json jRules = ai_GetCampaignDbJson("rules"); jRules = JsonObjectSet(jRules, AI_RULE_MON_PERC_DISTANCE, JsonInt(nAdjustment)); ai_SetCampaignDbJson("rules", jRules); } json ai_AddRestrictedSpell(json jRules, int nSpell, int bRestrict = TRUE) { object oModule = GetModule(); json jRSpells = GetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS); if(JsonGetType(jRSpells) == JSON_TYPE_NULL) jRSpells = JsonArray(); int nIndex, nMaxIndex = JsonGetLength(jRSpells); if(bRestrict) { while(nIndex < nMaxIndex) { if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) return jRules; nIndex++; } jRSpells = JsonArrayInsert(jRSpells, JsonInt(nSpell)); } else { while(nIndex < nMaxIndex) { if(JsonGetInt(JsonArrayGet(jRSpells, nIndex)) == nSpell) { jRSpells = JsonArrayDel(jRSpells, nIndex); break; } nIndex++; } } SetLocalJson(oModule, AI_RULE_RESTRICTED_SPELLS, jRSpells); return JsonObjectSet(jRules, AI_RULE_RESTRICTED_SPELLS, jRSpells); } void ai_TurnOn(object oPC, object oTarget, string sAssociateType) { ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ai_tooltip", " AI On"); ai_SendMessages("AI turned on for " + GetName(oTarget) + ".", AI_COLOR_YELLOW, oPC); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "xx_pc_1_hb"); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_NOTICE, "xx_pc_2_percept"); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "xx_pc_3_endround"); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "xx_pc_4_convers"); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "xx_pc_5_phyatked"); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "xx_pc_6_damaged"); //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DEATH, ""); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "xx_pc_8_disturb"); //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_RESTED, ""); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "xx_pc_b_castat"); SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "xx_pc_e_blocked"); //SetEventScript(oTarget, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); // This sets the script for the PC to run AI based on class. ai_SetAssociateAIScript(oTarget, FALSE); // Set so PC can hear associates talking in combat. ai_SetListeningPatterns(oTarget); } void ai_TurnOff(object oPC, object oAssociate, string sAssociateType) { ai_UpdateToolTipUI(oPC, sAssociateType + AI_NUI, sAssociateType + AI_WIDGET_NUI, "btn_ai_tooltip", " AI Off"); ai_SendMessages("AI Turned off for " + GetName(oAssociate) + ".", AI_COLOR_YELLOW, oPC); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_NOTICE, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DAMAGED, ""); //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DEATH, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_DISTURBED, ""); //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, ""); //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_RESTED, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, ""); SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, ""); //SetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, ""); DeleteLocalInt(oAssociate, "AI_I_AM_BEING_HEALED"); DeleteLocalString(oAssociate, "AIScript"); ai_ClearCreatureActions(); } object ai_AddHenchman(object oPC, json jHenchman, location lLocation, int nFamiliar, int nCompanion) { jHenchman = GffReplaceResRef(jHenchman, "ScriptSpawn", ""); object oHenchman = JsonToObject(jHenchman, lLocation, OBJECT_INVALID, TRUE); AddHenchman(oPC, oHenchman); DeleteLocalInt(oPC, "AI_IGNORE_NO_ASSOCIATE"); string sAssociateType = ai_GetAssociateType(oPC, oHenchman); NuiDestroy(oPC, NuiFindWindow(oPC, sAssociateType + AI_WIDGET_NUI)); if(nFamiliar) SummonFamiliar(oHenchman); if(nCompanion) SummonAnimalCompanion(oHenchman); return oHenchman; }