/*////////////////////////////////////////////////////////////////////////////// // Script Name: 0i_menus //////////////////////////////////////////////////////////////////////////////// Include script for handling NUI menus. */////////////////////////////////////////////////////////////////////////////// #include "0i_nui" #include "0i_associates" // Maximum number of Plugins allowed on the players widget. const int WIDGET_MAX_PLUGINS = 5; // Set one of the BTN_* "Widget" bitwise constants on oPlayer to bValid. void ai_SetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE); // Return if nButton is set on oPlayer. Uses the BTN_* "Widget" bitwise constants. int ai_GetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType); // Set one of the BTN_AI_* bitwise constants on oPlayer to bValid. void ai_SetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE); // Return if nButton is set on oPlayer. Uses the BTN_AI_* "Widget" bitwise constants. int ai_GetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType); // Set one of the BTN2_AI_* bitwise constants on oPlayer to bValid. void ai_SetAIButton2(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE); // Return if nButton is set on oPlayer. Uses the BTN2_AI_* "Widget" bitwise constants. int ai_GetAIButton2(object oPlayer, int nButton, object oAssociate, string sAssociateType); // Creates the json array required to build a companion drop down box for // Animal Companions or Familiars. // sCompanion2da should be either "hen_companion" or "hen_familiar". json ai_CreateCompanionJson(object oPC, string sCompanion2da); // Return any Metamagic or Domain attributes to place on a spell icon image. string ai_GetSpellIconAttributes(object oCaster, int nMetaMagic, int nDomain); // Creates the AI options menu. void ai_CreateAIMainNUI(object oPC); // Creates the AI options menu. void ai_CreateAssociateCommandNUI(object oPC, object oAssociate); // Creates an associates AI NUI. void ai_CreateAssociateAINUI(object oPC, object oAssociate); // Creates a widget for the player or associate. void ai_CreateWidgetNUI(object oPC, object oAssociate); // Creates the Loot filter menu. void ai_CreateLootFilterNUI(object oPC, object oAssociate); // Creates the Plugin Manager menu. void ai_CreatePluginNUI(object oPC); // Creates the Spell menu that selects the spells to go on the Spell Widget. void ai_CreateQuickWidgetSelectionNUI(object oPC, object oAssociate); // Creates the Spell menu that lets the player to select the associates castable spells. void ai_CreateSpellMemorizationNUI(object oPC, object oAssociate); // Creates the spell description menu so a player can see what a spell does. // If nSpell > 0 then use that value for the spells description. void ai_CreateDescriptionNUI(object oPC, json jSpell, int nSpell = 0); string ai_GetRandomTip() { int nRoll; if(AI_SERVER) nRoll = Random(26); else nRoll = Random(46); return Get2DAString("ai_messages", "Text", nRoll); } void ai_SetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE) { int nWidgetButtons = GetLocalInt(oAssociate, sWidgetButtonsVarname); json jButtons = ai_GetAssociateDbJson(oPlayer, sAssociateType, "buttons"); if(bOn) nWidgetButtons = nWidgetButtons | nButton; else nWidgetButtons = nWidgetButtons & ~nButton; SetLocalInt(oAssociate, sWidgetButtonsVarname, nWidgetButtons); jButtons = JsonArraySet(jButtons, 0, JsonInt(nWidgetButtons)); ai_SetAssociateDbJson(oPlayer, sAssociateType, "buttons", jButtons); } int ai_GetWidgetButton(object oPlayer, int nButton, object oAssociate, string sAssociateType) { // This is the DM access switch that uses the same bitwise as the players // to control what widget buttons they can use. if(ai_GetDMWAccessButton(nButton)) return FALSE; int nWidgetButtons = GetLocalInt(oAssociate, sWidgetButtonsVarname); return nWidgetButtons & nButton; } void ai_SetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType, int bOn = TRUE) { int nAIButtons = GetLocalInt(oAssociate, sAIButtonsVarname); json jButtons = ai_GetAssociateDbJson(oPlayer, sAssociateType, "buttons"); if(bOn) nAIButtons = nAIButtons | nButton; else nAIButtons = nAIButtons & ~nButton; SetLocalInt(oAssociate, sAIButtonsVarname, nAIButtons); jButtons = JsonArraySet(jButtons, 1, JsonInt(nAIButtons)); ai_SetAssociateDbJson(oPlayer, sAssociateType, "buttons", jButtons); } int ai_GetAIButton(object oPlayer, int nButton, object oAssociate, string sAssociateType) { // This is the DM access switch that uses the same bitwise as the players // to control what AI widget buttons they can use. if(ai_GetDMAIAccessButton(nButton)) return FALSE; int nAIButtons = GetLocalInt(oAssociate, sAIButtonsVarname); return nAIButtons & nButton; } json ai_CreateAIScriptJson(object oPC) { json jScript = JsonArrayInsert(JsonArray(), NuiComboEntry("", 0)); int nNth = 1; string sScript = ResManFindPrefix("ai_a_", RESTYPE_NCS, nNth); while(sScript != "") { jScript = JsonArrayInsert(jScript, NuiComboEntry(sScript, nNth)); sScript = ResManFindPrefix("ai_a_", RESTYPE_NCS, ++nNth); } return jScript; } json ai_CreateCompanionJson(object oPC, string sCompanion2da) { int nCnt, nMaxRowCount = Get2DARowCount(sCompanion2da); string sName; json jCompanion = JsonArray(); while(nCnt < nMaxRowCount) { sName = GetStringByStrRef(StringToInt(Get2DAString(sCompanion2da, "STRREF", nCnt))); jCompanion = JsonArrayInsert(jCompanion, NuiComboEntry(sName, nCnt++)); } return JsonArrayInsert(jCompanion, NuiComboEntry("Random", nCnt)); } string ai_GetSpellIconAttributes(object oCaster, int nMetaMagic, int nDomain) { string sAttributeText; if(nMetaMagic != METAMAGIC_ANY && nMetaMagic != METAMAGIC_NONE) { if(nMetaMagic == METAMAGIC_EXTEND) sAttributeText = "X"; if(nMetaMagic == METAMAGIC_EMPOWER) sAttributeText = "P"; if(nMetaMagic == METAMAGIC_MAXIMIZE) sAttributeText = "M"; if(nMetaMagic == METAMAGIC_QUICKEN) sAttributeText = "Q"; if(nMetaMagic == METAMAGIC_SILENT) sAttributeText = "I"; if(nMetaMagic == METAMAGIC_STILL) sAttributeText = "T"; } else sAttributeText = ""; if(nDomain > 0) sAttributeText += "D"; return sAttributeText; } void ai_CreateAIMainNUI(object oPC) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); int nMonsterAI = (ResManGetAliasFor("ai_default", RESTYPE_NCS) != ""); int nAssociateAI = (ResManGetAliasFor("ai_a_default", RESTYPE_NCS) != ""); string sText = " [Single player]"; if(AI_SERVER) sText = " [Server]"; // ************************************************************************* Width / Height // Row 1 ******************************************************************* 500 / 73 json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateLabel(jRow, PHILOS_VERSION + sText, "lbl_version ", 510.0f, 20.0f, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 ******************************************************************* 500 / 101 jRow = CreateLabel(JsonArray(), "", "lbl_ai_info", 510.0f, 20.0f, NUI_HALIGN_CENTER); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 ******************************************************************* 500 / 129 jRow = CreateButton(JsonArray(), "Plugin Manager", "btn_plugin_manager", 120.0f, 20.0f, -1.0, "btn_plugin_manager_tooltip"); if(nAssociateAI) jRow = CreateButtonSelect(jRow, "Associate Widgets", "btn_toggle_assoc_widget", 140.0f, 20.0f, "btn_assoc_widget_tooltip"); jRow = CreateButtonSelect(jRow, "Action Ghost Mode", "btn_action_ghost", 160.0f, 20.0f, "btn_action_ghost_tooltip"); jRow = CreateButtonSelect(jRow, "Effect Icons", "btn_effect_icon", 100.0f, 20.0f, "btn_effect_icon_tooltip"); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 4 ******************************************************************* 500 / 157 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateLabel(jRow, "MODULE RULES", "lbl_ai_rules", 200.0f, 20.0f, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); float fHeight = 157.0; // Row 5 ******************************************************************* 500 / --- (28) // Make the AI options a Group. json jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_max_henchman", 2, FALSE, 30.0f, 20.0f, "txt_max_henchman_tooltip"); jGroupRow = CreateLabel(jGroupRow, "Max number of henchmen that is allowed in your party.", "lbl_max_hench", 416.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_max_henchman_tooltip"); json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow)); jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_xp_scale", 3, FALSE, 40.0f, 20.0f, "txt_xp_scale_tooltip"); jGroupRow = CreateLabel(jGroupRow, "Modules experience scale.", "lbl_xp_scale", 175.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_xp_scale_tooltip"); jGroupRow = CreateCheckBox(jGroupRow, " scale to party.", "chbx_party_scale", 150.0, 20.0, "chbx_party_scale_tooltip"); jGroupRow = CreateButton(jGroupRow, "Default", "btn_default_xp", 70.0f, 20.0f, -1.0, "btn_default_xp_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); fHeight += 78.0; if(nMonsterAI || nAssociateAI) { jGroupRow = CreateCheckBox(JsonArray(), " Creatures will use advanced combat movement.", "chbx_advanced_movement", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Use item level restrictions for creatures [Default is off].", "chbx_ilr", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Creatures can use the skill Use Magic Device.", "chbx_umd", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Creatures can use Healing kits.", "chbx_use_healingkits", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Moral checks, wounded creatures may flee during combat.", "chbx_moral", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateLabel(JsonArray(), " Spells the AI will not use:", "lbl_restrict_spells", 190.0, 20.0, NUI_HALIGN_LEFT); jGroupRow = CreateCheckBox(jGroupRow, " Darkness", "chbx_darkness", 90.0, 20.0, "chbx_darkness_tooltip"); jGroupRow = CreateCheckBox(jGroupRow, " Dispels", "chbx_dispels", 90.0, 20.0, "chbx_dispels_tooltip"); jGroupRow = CreateCheckBox(jGroupRow, " Time Stop", "chbx_timestop", 90.0, 20.0, "chbx_timestop_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); fHeight += 196.0; } if(nMonsterAI) { jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_ai_difficulty", 3, FALSE, 40.0f, 20.0f, "txt_ai_difficulty_tooltip"); jGroupRow = CreateLabel(jGroupRow, "% chance monsters will attack the weakest target.", "lbl_ai_difficulty", 406.0f, 20.0f, NUI_HALIGN_LEFT, 0, -1.0, "txt_ai_difficulty_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_perception_distance", 2, FALSE, 35.0f, 20.0f, "txt_perception_distance_tooltip"); jGroupRow = CreateLabel(jGroupRow, "meters is the distance a monster can respond to allies.", "lbl_perception_distance", 411.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "txt_perception_distance_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Monsters can prebuff before combat starts.", "chbx_buff_monsters", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Monsters can use summons before combat starts.", "chbx_buff_summons", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Monsters can use tactics (ambush, defensive, flanker, etc).", "chbx_ambush_monsters", 450.0, 20.0); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateLabel(JsonArray(), "Add ", "lbl_inc_enc", 30.0, 20.0, NUI_HALIGN_LEFT, 0, -1.0); jGroupRow = CreateTextEditBox(jGroupRow, "sPlaceHolder", "txt_inc_enc", 4, FALSE, 55.0f, 20.0f, "txt_inc_enc_tooltip"); jGroupRow = CreateLabel(jGroupRow, "monsters per spawned encounter monster.", "lbl_inc_enc", 357.0, 20.0, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0, "txt_inc_enc_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateTextEditBox(JsonArray(), "sPlaceHolder", "txt_inc_hp", 3, FALSE, 40.0f, 20.0f, "txt_inc_hp_tooltip"); jGroupRow = CreateLabel(jGroupRow, "% increase in all monster's hitpoints.", "lbl_inc_hp", 406.0, 20.0, NUI_HALIGN_LEFT); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateLabel(JsonArray(), "***** WARNING! The options below may break the module! *****", "lbl_warning", 450.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "chbx_warning_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Monsters can wander upto ", "chbx_wander", 220.0, 20.0, "chbx_warning_tooltip"); jGroupRow = CreateTextEditBox(jGroupRow, "sPlaceHolder", "txt_wander_distance", 2, FALSE, 35.0f, 20.0f, "chbx_warning_tooltip"); jGroupRow = CreateLabel(jGroupRow, "meters and ", "lbl_wander_distance", 80.0f, 20.0f, NUI_HALIGN_LEFT, NUI_VALIGN_MIDDLE, 0.0, "chbx_warning_tooltip"); jGroupRow = CreateCheckBox(jGroupRow, "open doors.", "chbx_open_doors", 100.0, 20.0, "chbx_warning_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Monsters can summon companions.", "chbx_companions", 450.0, 20.0, "chbx_warning_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Summoned associates to remain after masters death.", "chbx_perm_assoc", 450.0, 20.0, "chbx_warning_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateCheckBox(JsonArray(), " Make enemy corpses remain.", "chbx_corpses_stay", 450.0, 20.0, "chbx_warning_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); jGroupRow = CreateLabel(JsonArray(), "", "lbl_perc_dist", 450.0f, 20.0f, NUI_HALIGN_LEFT, 0, 0.0, "lbl_perc_dist_tooltip"); jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow)); fHeight += 336.0; } jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol))); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Get the window location to restore it from the database. json jLocations = ai_GetAssociateDbJson(oPC, "pc", "locations"); jLocations = JsonObjectGet(jLocations, AI_MAIN_NUI); float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); // Set the Layout of the window. json jLayout = NuiCol(jCol); string sName = GetName(oPC); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int nToken = SetWindow(oPC, jLayout, AI_MAIN_NUI, sName + " PEPS Main Menu", fX, fY, 534.0f, fHeight, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Save the associate to the nui for use in 0e_nui json jData = JsonArray(); jData = JsonArrayInsert(jData, JsonString(ObjectToString(oPC))); NuiSetUserData(oPC, nToken, jData); object oModule = GetModule(); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Set all binds, events, and watches. // Row 1 - Version label. // Row 2 int nUsing; // Check the monster AI. string sLocation = ResManGetAliasFor("ai_default", RESTYPE_NCS); if(sLocation != "") { nUsing = TRUE; string sLocation = ResManGetAliasFor("nw_c2_default1", RESTYPE_NCS); if(sLocation != "OVERRIDE:" && sLocation != "PATCH:peps" && sLocation != "DEVELOPMENT:") nUsing = FALSE; if(nUsing) sText = "Monster AI working"; else sText = "Monster AI not working"; } else sText = "Monster AI not loaded"; // Check the associate AI. sLocation = ResManGetAliasFor("ai_a_default", RESTYPE_NCS); if(sLocation != "") { nUsing = TRUE; string sLocation = ResManGetAliasFor("nw_ch_ac1", RESTYPE_NCS); if(sLocation != "OVERRIDE:" && sLocation != "PATCH:peps" && sLocation != "DEVELOPMENT:") nUsing = FALSE; if(nUsing) sText += ", Associate AI working"; else sText += ", Associate AI not working"; } else sText += ", Associate AI not loaded"; // Check for PRC. sLocation = ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS); if(sLocation != "") sText += ", PRC loaded."; else { // Check the player AI. sLocation = ResManGetAliasFor("xx_pc_1_hb", RESTYPE_NCS); if(sLocation != "") sText += ", Player AI loaded."; else sText += ", Player AI not loaded."; } NuiSetBind(oPC, nToken, "lbl_ai_info_label", JsonString(sText)); // Row 3 NuiSetBind(oPC, nToken, "btn_plugin_manager_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_plugin_manager_tooltip", JsonString(" Manages external executable scripts.")); if(nAssociateAI) { NuiSetBind(oPC, nToken, "btn_toggle_assoc_widget_event", JsonBool(TRUE)); int bWidgetOn = !ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, OBJECT_INVALID, "pc"); NuiSetBind(oPC, nToken, "btn_toggle_assoc_widget", JsonBool(bWidgetOn)); NuiSetBind(oPC, nToken, "btn_assoc_widget_tooltip", JsonString(" Turns On/Off all associate widgets.")); } int bActionGhost = ai_GetAIMode(oPC, AI_MODE_ACTION_GHOST); NuiSetBind(oPC, nToken, "btn_action_ghost", JsonBool (bActionGhost)); NuiSetBind(oPC, nToken, "btn_action_ghost_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_action_ghost_tooltip", JsonString(" Allows associates to move through creatures while in command mode.")); int bEffectIcon = ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT); NuiSetBind(oPC, nToken, "btn_effect_icon", JsonBool (bEffectIcon)); NuiSetBind(oPC, nToken, "btn_effect_icon_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_effect_icon_tooltip", JsonString(" When on sends effect icon reports to the chat screen.")); // Row 3 Label for AI RULES // Row 4 NuiSetBind(oPC, nToken, "txt_max_henchman", JsonString(IntToString(GetLocalInt(oModule, AI_RULE_MAX_HENCHMAN)))); NuiSetBindWatch (oPC, nToken, "txt_max_henchman", TRUE); NuiSetBind(oPC, nToken, "txt_max_henchman_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_max_henchman_tooltip", JsonString(" Set max number of henchman allowed (1-12).")); NuiSetBind(oPC, nToken, "txt_xp_scale", JsonString(IntToString(GetModuleXPScale()))); NuiSetBindWatch (oPC, nToken, "txt_xp_scale", TRUE); NuiSetBind(oPC, nToken, "txt_xp_scale_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_xp_scale_tooltip", JsonString(" Set the modules XP scale (0 - 200) Normal D&D is 10.")); NuiSetBind(oPC, nToken, "chbx_party_scale_check", JsonBool(GetLocalInt(oModule, AI_RULE_PARTY_SCALE))); NuiSetBindWatch(oPC, nToken, "chbx_party_scale_check", TRUE); NuiSetBind(oPC, nToken, "chbx_party_scale_event", JsonBool(TRUE)); 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 + ").")); NuiSetBind(oPC, nToken, "btn_default_xp_event", JsonBool(TRUE)); sText = IntToString(GetLocalInt(oModule, AI_RULE_DEFAULT_XP_SCALE)); NuiSetBind(oPC, nToken, "btn_default_xp_tooltip", JsonString(" Reset the Modules XP to (" + sText + ").")); NuiSetBind(oPC, nToken, "chbx_warning_tooltip", JsonString(" ** This will break some modules! ** See Readme for issues!")); if(nMonsterAI) { NuiSetBind(oPC, nToken, "txt_ai_difficulty", JsonString(IntToString(GetLocalInt(oModule, AI_RULE_AI_DIFFICULTY)))); NuiSetBindWatch(oPC, nToken, "txt_ai_difficulty", TRUE); NuiSetBind(oPC, nToken, "txt_ai_difficulty_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_buff_monsters_check", JsonBool(GetLocalInt(oModule, AI_RULE_BUFF_MONSTERS))); NuiSetBindWatch(oPC, nToken, "chbx_buff_monsters_check", TRUE); NuiSetBind(oPC, nToken, "chbx_buff_monsters_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_buff_summons_check", JsonBool(GetLocalInt(oModule, AI_RULE_PRESUMMON))); NuiSetBindWatch(oPC, nToken, "chbx_buff_summons_check", TRUE); NuiSetBind(oPC, nToken, "chbx_buff_summons_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_ambush_monsters_check", JsonBool(GetLocalInt(oModule, AI_RULE_AMBUSH))); NuiSetBindWatch(oPC, nToken, "chbx_ambush_monsters_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ambush_monsters_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_companions_check", JsonBool(GetLocalInt(oModule, AI_RULE_SUMMON_COMPANIONS))); NuiSetBindWatch(oPC, nToken, "chbx_companions_check", TRUE); NuiSetBind(oPC, nToken, "chbx_companions_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_perm_assoc_check", JsonBool(GetLocalInt(oModule, AI_RULE_PERM_ASSOC))); string sModuleName = GetModuleName(); if(!GetLocalInt(oModule, AI_USING_PRC) && (sModuleName != "Neverwinter Nights - Infinite Dungeons" || sModuleName != "Infinite Dungeons [PRC8]")) { NuiSetBindWatch(oPC, nToken, "chbx_perm_assoc_check", TRUE); NuiSetBind(oPC, nToken, "chbx_perm_assoc_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_corpses_stay_check", JsonBool(GetLocalInt(oModule, AI_RULE_CORPSES_STAY))); NuiSetBindWatch(oPC, nToken, "chbx_corpses_stay_check", TRUE); NuiSetBind(oPC, nToken, "chbx_corpses_stay_event", JsonBool(TRUE)); } NuiSetBind(oPC, nToken, "txt_perception_distance", JsonString(FloatToString(GetLocalFloat(oModule, AI_RULE_PERCEPTION_DISTANCE), 0, 0))); NuiSetBindWatch(oPC, nToken, "txt_perception_distance", TRUE); NuiSetBind(oPC, nToken, "txt_perception_distance_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_perception_distance_tooltip", JsonString(" Range [10 to 60 meters] from the player.")); NuiSetBindWatch(oPC, nToken, "lbl_perc_dist", TRUE); int nPercDist = GetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE); if(nPercDist < 8 || nPercDist > 11) { nPercDist = 11; SetLocalInt(oModule, AI_RULE_MON_PERC_DISTANCE, 11); } if(nPercDist == 8) sText = " Monster perception: Short [10 Sight / 10 Listen]"; else if(nPercDist == 9) sText = " Monster perception: Medium [20 Sight / 20 Listen]"; else if(nPercDist == 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)); NuiSetBind(oPC, nToken, "lbl_perc_dist_tooltip", JsonString(" Use the mouse wheel to change values.")); int bWander = GetLocalInt(oModule, AI_RULE_WANDER); NuiSetBind(oPC, nToken, "chbx_wander_check", JsonBool(bWander)); NuiSetBindWatch(oPC, nToken, "chbx_wander_check", TRUE); NuiSetBind(oPC, nToken, "chbx_wander_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_wander_distance", JsonString(FloatToString(GetLocalFloat(oModule, AI_RULE_WANDER_DISTANCE), 0, 0))); NuiSetBindWatch(oPC, nToken, "txt_wander_distance", TRUE); NuiSetBind(oPC, nToken, "txt_wander_distance_event", JsonBool(bWander)); NuiSetBind(oPC, nToken, "chbx_open_doors_check", JsonBool(GetLocalInt(oModule, AI_RULE_OPEN_DOORS))); NuiSetBindWatch(oPC, nToken, "chbx_open_doors_check", TRUE); NuiSetBind(oPC, nToken, "chbx_open_doors_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_open_doors_tooltip", JsonString(" This allows monsters to open doors to hunt you down!")); NuiSetBind(oPC, nToken, "txt_inc_enc_tooltip", JsonString(" Spawns one extra monster per counter above 1. Adds value to counter per encounter monster spawned.")); NuiSetBind(oPC, nToken, "txt_inc_enc", JsonString(FloatToString(GetLocalFloat(oModule, AI_INCREASE_ENC_MONSTERS), 0, 2))); NuiSetBindWatch(oPC, nToken, "txt_inc_enc", TRUE); NuiSetBind(oPC, nToken, "txt_inc_enc_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_inc_hp", JsonString(IntToString(GetLocalInt(oModule, AI_INCREASE_MONSTERS_HP)))); NuiSetBindWatch(oPC, nToken, "txt_inc_hp", TRUE); NuiSetBind(oPC, nToken, "txt_inc_hp_event", JsonBool(TRUE)); } if(nMonsterAI || nAssociateAI) { NuiSetBind(oPC, nToken, "chbx_moral_check", JsonBool(GetLocalInt(oModule, AI_RULE_MORAL_CHECKS))); NuiSetBindWatch (oPC, nToken, "chbx_moral_check", TRUE); NuiSetBind(oPC, nToken, "chbx_moral_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_advanced_movement_check", JsonBool(GetLocalInt(oModule, AI_RULE_ADVANCED_MOVEMENT))); NuiSetBindWatch (oPC, nToken, "chbx_advanced_movement_check", TRUE); NuiSetBind(oPC, nToken, "chbx_advanced_movement_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_ilr_check", JsonBool(GetLocalInt(oModule, AI_RULE_ILR))); NuiSetBindWatch (oPC, nToken, "chbx_ilr_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ilr_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_umd_check", JsonBool(GetLocalInt(oModule, AI_RULE_ALLOW_UMD))); NuiSetBindWatch (oPC, nToken, "chbx_umd_check", TRUE); NuiSetBind(oPC, nToken, "chbx_umd_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_use_healingkits_check", JsonBool(GetLocalInt(oModule, AI_RULE_HEALERSKITS))); NuiSetBindWatch (oPC, nToken, "chbx_use_healingkits_check", TRUE); NuiSetBind(oPC, nToken, "chbx_use_healingkits_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_darkness_check", JsonBool(ai_SpellRestricted(SPELL_DARKNESS))); NuiSetBindWatch (oPC, nToken, "chbx_darkness_check", TRUE); NuiSetBind(oPC, nToken, "chbx_darkness_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_darkness_tooltip", JsonString(" AI will not use the Darkness spell in combat.")); NuiSetBind(oPC, nToken, "chbx_dispels_check", JsonBool(ai_SpellRestricted(SPELL_DISPEL_MAGIC))); NuiSetBindWatch (oPC, nToken, "chbx_dispels_check", TRUE); NuiSetBind(oPC, nToken, "chbx_dispels_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_dispels_tooltip", JsonString(" AI will not use any of the Dispel spells in combat.")); NuiSetBind(oPC, nToken, "chbx_timestop_check", JsonBool(ai_SpellRestricted(SPELL_TIME_STOP))); NuiSetBindWatch (oPC, nToken, "chbx_timestop_check", TRUE); NuiSetBind(oPC, nToken, "chbx_timestop_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_timestop_tooltip", JsonString(" AI will not use the Time Stop spell in combat.")); } } void ai_CreateAssociateCommandNUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); int bRight, bLeft; int bIsPC = ai_GetIsCharacter(oAssociate); int bUsingPCAI = ResManGetAliasFor("xx_pc_1_hb", RESTYPE_NCS) != ""; int bUsingHenchAI = ResManGetAliasFor("nw_ch_ac1", RESTYPE_NCS) != ""; float fHeight = 73.0; // ************************************************************************* Width / Height // Row 1 ******************************************************************* 500 / 73 json jRow = JsonArray(); json jCol = JsonArray(); // If all the AI buttons are blocked then don't load the menu. if(GetLocalInt(GetModule(), sDMAIAccessVarname) != 203423743) { if(bIsPC) { if(bUsingPCAI || !AI_SERVER) { if(bUsingPCAI) { jRow = CreateButton(jRow, "AI Menu", "btn_ai_menu", 232.0, 20.0, -1.0, "btn_ai_menu_tooltip"); } if(!AI_SERVER) { jRow = CreateButton(jRow, "Main Menu", "btn_main_menu", 232.0, 20.0, -1.0, "btn_main_menu_tooltip"); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } } else { if(bUsingHenchAI) { jRow = CreateButton(jRow, "AI Menu", "btn_ai_menu", 232.0, 20.0, -1.0, "btn_ai_menu_tooltip"); } jRow = CreateButtonSelect(jRow, "", "btn_widget_onoff", 232.0, 20.0, "btn_widget_onoff_tooltip"); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } } // Row 2 ******************************************************************* 500 / 101 jRow = JsonArray(); jRow = CreateButtonSelect(jRow, "Lock Widget", "btn_widget_lock", 154.0, 20.0, "btn_widget_lock_tooltip"); jRow = CreateButton(jRow, "Copy Settings", "btn_copy_settings", 154.0, 20.0, -1.0, "btn_copy_settings_tooltip"); jRow = CreateButtonSelect(jRow, "Vertical Widget", "btn_vertical_widget", 154.0, 20.0, "btn_vertical_widget_tooltip"); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 ******************************************************************* 500 / 129 bRight = !ai_GetDMWAccessButton(BTN_CMD_ACTION); bLeft = !ai_GetDMWAccessButton(BTN_CMD_GUARD); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "", "btn_cmd_action", 200.0, 20.0, -1.0, "btn_cmd_action_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_action", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "", "btn_cmd_guard", 200.0, 20.0, -1.0, "btn_cmd_guard_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_guard", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 4 ******************************************************************* 500 / 157 jRow = JsonArray(); bRight = !ai_GetDMWAccessButton(BTN_CMD_HOLD); bLeft = !ai_GetDMWAccessButton(BTN_CMD_ATTACK); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "", "btn_cmd_hold", 200.0, 20.0, -1.0, "btn_cmd_hold_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_hold", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "", "btn_cmd_attack", 200.0, 20.0, -1.0, "btn_cmd_attack_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_attack", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 5 ******************************************************************* 500 / 213 bRight = !ai_GetDMWAccessButton(BTN_CMD_FOLLOW); bLeft = !ai_GetDMAIAccessButton(BTN_AI_FOLLOW_TARGET); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "", "btn_cmd_follow", 200.0, 20.0, -1.0, "btn_cmd_follow_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_follow", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Select follow target", "btn_follow_target", 200.0, 20.0, -1.0, "btn_follow_target_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_follow_target", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 6 ******************************************************************* 500 / 185 if(bIsPC) { bRight = !ai_GetDMWAccessButton(BTN_CMD_SEARCH); bLeft = !ai_GetDMWAccessButton(BTN_CMD_STEALTH); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "All Search Mode", "btn_cmd_search", 200.0, 20.0, -1.0, "btn_cmd_search_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_search", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "All Stealth Mode", "btn_cmd_stealth", 200.0, 20.0, -1.0, "btn_cmd_stealth_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_stealth", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } } // Row 7 ******************************************************************* 500 / 241 bRight = !ai_GetDMWAccessButton(BTN_CMD_AI_SCRIPT); bLeft = !ai_GetDMWAccessButton(BTN_CMD_PLACE_TRAP); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Combat Tactics", "btn_cmd_ai_script", 200.0, 20.0, -1.0, "btn_cmd_ai_script_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_ai_script", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Place a Trap", "btn_cmd_place_trap", 200.0, 20.0, -1.0, "btn_cmd_place_trap_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cmd_place_trap", 25.0, 20.0); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 8 ******************************************************************* 500 / --- int bMemorize = ai_GetIsSpellCaster(oAssociate); int bSpellbook = ai_GetIsSpellBookRestrictedCaster(oAssociate); bRight = !ai_GetDMWAccessButton(BTN_CMD_SPELL_WIDGET); bLeft = !ai_GetDMWAccessButton(BTN_DM_CMD_MEMORIZE); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Set Quick Widget", "btn_quick_widget", 200.0, 20.0, -1.0, "btn_quick_widget_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_quick_widget", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) // Memorizes their spells. { if(bMemorize == 2 && bSpellbook) { jRow = CreateButton(jRow, "Memorize Spells", "btn_spell_memorize", 114.0, 20.0, -1.0, "btn_spell_memorize_tooltip"); jRow = CreateButton(jRow, "Known Spells", "btn_spell_known", 110.0, 20.0, -1.0, "btn_spell_known_tooltip"); } else if(bMemorize == 2) { jRow = CreateButton(jRow, "Set Memorize Spells", "btn_spell_memorize", 200.0, 20.0, -1.0, "btn_spell_memorize_tooltip"); jRow = CreateLabel(jRow, "", "blank_label_1", 25.0, 20.0); } else if(bSpellbook && !ai_GetIsCharacter(oAssociate)) { jRow = CreateButton(jRow, "Set Known Spells", "btn_spell_known", 200.0, 20.0, -1.0, "btn_spell_known_tooltip"); jRow = CreateLabel(jRow, "", "blank_label_1", 25.0, 20.0); } } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 9 ******************************************************************* 500 / 269 bRight = !ai_GetDMWAccessButton(BTN_BUFF_SHORT); bLeft = !ai_GetDMWAccessButton(BTN_BUFF_LONG); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Cast Short Buff spells", "btn_buff_short", 200.0, 20.0, -1.0, "btn_buff_short_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_buff_short", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Cast Long Buff spells", "btn_buff_long", 200.0, 20.0, -1.0, "btn_buff_long_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_buff_long", 25.0, 20.0); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 10 ******************************************************************* 500 / 297 bRight = !ai_GetDMWAccessButton(BTN_BUFF_ALL); bLeft = !ai_GetDMWAccessButton(BTN_BUFF_REST); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Cast All Buff spells", "btn_buff_all", 200.0, 20.0, -1.0, "btn_buff_all_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_buff_all", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Buff after resting", "btn_buff_rest", 200.0, 20.0, -1.0, "btn_buff_rest_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_buff_rest", 25.0, 20.0); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 11 ******************************************************************* 500 / 325 bRight = !ai_GetDMWAccessButton(BTN_CMD_JUMP_TO); bLeft = !ai_GetDMWAccessButton(BTN_CMD_GHOST_MODE); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "", "btn_jump_to", 200.0, 20.0, -1.0, "btn_jump_to"); jRow = CreateCheckBox(jRow, "", "chbx_jump_to", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Ghost Mode", "btn_ghost_mode", 200.0, 20.0, -1.0, "btn_ghost_mode_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_ghost_mode", 25.0, 20.0); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 12 ****************************************************************** 500 / 353 bRight = !ai_GetDMWAccessButton(BTN_CMD_CAMERA); bLeft = !ai_GetDMWAccessButton(BTN_CMD_INVENTORY); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Toggle Camera Focus", "btn_camera", 200.0, 20.0, -1.0, "btn_camera_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_camera", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Open/Close Inventory", "btn_inventory", 200.0, 20.0, -1.0, "btn_inventory_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_inventory", 25.0, 20.0); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 13 ******************************************************************* 500 / --- int bFamiliar = GetHasFeat(FEAT_SUMMON_FAMILIAR, oAssociate, TRUE); if(!ai_GetDMWAccessButton(BTN_CMD_FAMILIAR) && bFamiliar) { jRow = JsonArray(); jRow = CreateLabel(jRow, "", "lbl_familiar_type", 225.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateLabel(jRow, "", "lbl_familiar_name", 225.0, 20.0); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; // Row 14 ******************************************************************* 500 / --- jRow = JsonArray(); jRow = CreateCombo(jRow, ai_CreateCompanionJson(oPC, "hen_familiar"), "cmb_familiar", 200.0, 20.0); jRow = CreateCheckBox(jRow, "", "chbx_familiar", 25.0, 20.0); jRow = CreateTextEditBox(jRow, "txtbox", "txt_familiar_name", 50, FALSE, 178.0, 20.0); jRow = CreateButton(jRow, "", "btn_familiar_name", 55.0, 20.0); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 15 ******************************************************************* 500 / --- int bCompanion = GetHasFeat(FEAT_ANIMAL_COMPANION, oAssociate, TRUE); if(!ai_GetDMWAccessButton(BTN_CMD_COMPANION) && bCompanion) { jRow = JsonArray(); jRow = CreateLabel(jRow, "", "lbl_companion_type", 225.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateLabel(jRow, "", "lbl_companion_name", 225.0, 20.0); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; // Row 16 ******************************************************************* 500 / --- jRow = JsonArray(); jRow = CreateCombo(jRow, ai_CreateCompanionJson(oPC, "hen_companion"), "cmb_companion", 200.0, 20.0); jRow = CreateCheckBox(jRow, "", "chbx_companion", 25.0, 20.0); jRow = CreateTextEditBox(jRow, "txtbox", "txt_companion_name", 50, FALSE, 178.0, 20.0); jRow = CreateButton(jRow, "", "btn_companion_name", 55.0, 20.0); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; } // Row 17+ ****************************************************************** 500 / --- string sAssociateType = ai_GetAssociateType(oPC, oAssociate); json jPCPlugins; if(bIsPC) { jPCPlugins = ai_UpdatePluginsForPC(oPC); // Set the plugins the player can use. int nIndex; string sButton, sName; json jPlugin = JsonArrayGet(jPCPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { jRow = JsonArray(); sButton = IntToString(nIndex); sName = JsonGetString(JsonArrayGet(jPlugin, 2)); jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 200.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0, "chbx_plugin_tooltip"); jRow = JsonArrayInsert(jRow, NuiSpacer()); jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); if(JsonGetType(jPlugin) != JSON_TYPE_NULL) { sButton = IntToString(nIndex); sName = JsonGetString(JsonArrayGet(jPlugin, 2)); jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 200.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0, "chbx_plugin_tooltip"); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } else { // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; break; } jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); } } // Row 18 ****************************************************************** 500 / --- jRow = JsonArray(); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateLabel(jRow, "", "lbl_info_1", 475.0, 20.0, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight = fHeight + 28.0; // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_COMMAND_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } // Set the Layout of the window. json jLayout = NuiCol(jCol); string sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_COMMAND_NUI, sName + " Command Menu", fX, fY, 500.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Get which buttons are activated. int bAIWidgetLock = ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType); int bCmdAction = ai_GetWidgetButton(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType); int bCmdGuard = ai_GetWidgetButton(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType); int bCmdHold = ai_GetWidgetButton(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType); int bCmdSearch = ai_GetWidgetButton(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType); int bCmdStealth = ai_GetWidgetButton(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType); int bCmdAttack = ai_GetWidgetButton(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType); int bCmdFollow = ai_GetWidgetButton(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType); int bFollowTarget = ai_GetAIButton(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType); int bCmdAIScript = ai_GetWidgetButton(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType); int bCmdPlacetrap = ai_GetWidgetButton(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType); int bSpellWidget = ai_GetWidgetButton(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType); int bBuffRest = ai_GetWidgetButton(oPC, BTN_BUFF_REST, oAssociate, sAssociateType); int bBuffShort = ai_GetWidgetButton(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType); int bBuffLong = ai_GetWidgetButton(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType); int bBuffAll = ai_GetWidgetButton(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType); int bJumpTo = ai_GetWidgetButton(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType); int bGhostMode = ai_GetWidgetButton(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType); int bCamera = ai_GetWidgetButton(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType); int bInventory = ai_GetWidgetButton(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType); int bBtnFamiliar = ai_GetWidgetButton(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType); int bBtnCompanion = ai_GetWidgetButton(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType); int bVertical = ai_GetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType); // Save the associate to the nui for use in 0e_nui json jData = JsonArray(); jData = JsonArrayInsert(jData, JsonString(ObjectToString(oAssociate))); NuiSetUserData(oPC, nToken, jData); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Set all binds, events, and watches. string sText; // Row 1 // If all the AI buttons are blocked then don't load the menu. if(GetLocalInt(GetModule(), sDMAIAccessVarname) != 203423743) { if(bIsPC) { if(bUsingPCAI) { NuiSetBind(oPC, nToken, "btn_ai_menu_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_ai_menu_tooltip", JsonString(" " + sName + " AI options")); } NuiSetBind(oPC, nToken, "btn_copy_settings_event", JsonBool (TRUE)); sText = " Copy AI and command settings for one creature to others."; NuiSetBind(oPC, nToken, "btn_copy_settings_tooltip", JsonString(sText)); if(!AI_SERVER) { NuiSetBind(oPC, nToken, "btn_main_menu_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_main_menu_tooltip", JsonString(" Module Options")); } } else { if(bUsingHenchAI) { NuiSetBind(oPC, nToken, "btn_ai_menu_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_ai_menu_tooltip", JsonString(" " + sName + " AI options")); } NuiSetBind(oPC, nToken, "btn_copy_settings_event", JsonBool (TRUE)); sText = " Copy AI and command settings for one creature to others."; NuiSetBind(oPC, nToken, "btn_copy_settings_tooltip", JsonString(sText)); string sText2; if(ai_GetWidgetButton(oPC, BTN_WIDGET_OFF, oAssociate, sAssociateType)) { sText = "Off"; sText2 = "on"; NuiSetBind(oPC, nToken, "btn_widget_onoff", JsonBool(FALSE)); } else { sText = "On"; sText2 = "off"; NuiSetBind(oPC, nToken, "btn_widget_onoff", JsonBool(TRUE)); } NuiSetBind(oPC, nToken, "btn_widget_onoff_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_widget_onoff_label", JsonString("Widget " + sText)); NuiSetBind(oPC, nToken, "btn_widget_onoff_tooltip", JsonString( " Turn " + sName + " widget " + sText2)); } } // Row 2 NuiSetBind(oPC, nToken, "btn_widget_lock_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_widget_lock", JsonBool(bAIWidgetLock)); NuiSetBind(oPC, nToken, "btn_widget_lock_tooltip", JsonString( " Locks " + sName + " widget to the current location.")); NuiSetBind(oPC, nToken, "btn_widget_size_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_widget_size_tooltip", JsonString( " Adjusts the size of " + sName + " widget buttons")); NuiSetBind(oPC, nToken, "btn_vertical_widget_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_vertical_widget", JsonBool(bVertical)); NuiSetBind(oPC, nToken, "btn_vertical_widget_tooltip", JsonString( " " + sName + " widget will display vertically")); // Row 3 NuiSetBind(oPC, nToken, "chbx_cmd_action_check", JsonBool (bCmdAction)); NuiSetBindWatch(oPC, nToken, "chbx_cmd_action_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_action_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_action_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "chbx_cmd_guard_check", JsonBool (bCmdGuard)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_guard_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_guard_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_guard_event", JsonBool (TRUE)); // Row 4 NuiSetBind(oPC, nToken, "chbx_cmd_hold_check", JsonBool (bCmdHold)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_hold_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_hold_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_hold_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "chbx_cmd_attack_check", JsonBool (bCmdAttack)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_attack_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_attack_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_attack_event", JsonBool (TRUE)); // Row 5 NuiSetBind(oPC, nToken, "chbx_cmd_follow_check", JsonBool (bCmdFollow)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_follow_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_follow_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_follow_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "chbx_follow_target_check", JsonBool (bFollowTarget)); NuiSetBindWatch (oPC, nToken, "chbx_follow_target_check", TRUE); NuiSetBind(oPC, nToken, "chbx_follow_target_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_follow_target_event", JsonBool (TRUE)); // Row 6 if(bIsPC) { NuiSetBind(oPC, nToken, "chbx_cmd_search_check", JsonBool (bCmdSearch)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_search_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_search_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_search_event", JsonBool (TRUE)); if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_SEARCH)) sText = " leave "; else sText = " enter "; NuiSetBind(oPC, nToken, "btn_cmd_search_tooltip", JsonString(" Everyone" + sText + "search mode")); NuiSetBind(oPC, nToken, "chbx_cmd_stealth_check", JsonBool (bCmdStealth)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_stealth_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_stealth_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_stealth_event", JsonBool (TRUE)); if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_STEALTH)) sText = " leave "; else sText = " enter "; NuiSetBind(oPC, nToken, "btn_cmd_stealth_tooltip", JsonString(" Everyone" + sText + "stealth mode")); } // Command labels if(bIsPC) sText = " All "; else sText = " "; NuiSetBind(oPC, nToken, "btn_cmd_action_label", JsonString(sText + "Action")); NuiSetBind(oPC, nToken, "btn_cmd_guard_label", JsonString(sText + "Guard Mode")); NuiSetBind(oPC, nToken, "btn_cmd_hold_label", JsonString(sText + "Hold Mode")); NuiSetBind(oPC, nToken, "btn_cmd_attack_label", JsonString(sText + "Normal Mode")); NuiSetBind(oPC, nToken, "btn_cmd_follow_label", JsonString(sText + "Follow Mode")); NuiSetBind(oPC, nToken, "btn_follow_target_label", JsonString(" Follow Target")); float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); string sRange = FloatToString(fRange, 0, 0); if(bIsPC) { sText = " All associates"; NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode")); } else { sText = " " + GetName(oAssociate); NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode [" + sRange + " meters]")); } NuiSetBind(oPC, nToken, "btn_cmd_action_tooltip", JsonString(sText + " do actions")); NuiSetBind(oPC, nToken, "btn_cmd_guard_tooltip", JsonString(sText + " enter guard mode")); NuiSetBind(oPC, nToken, "btn_cmd_hold_tooltip", JsonString(sText + " enter hold mode")); NuiSetBind(oPC, nToken, "btn_cmd_attack_tooltip", JsonString(sText + " enter normal mode")); object oTarget = GetLocalObject(oAssociate, AI_FOLLOW_TARGET); string sTarget; if(oTarget != OBJECT_INVALID) sTarget = GetName(oTarget); else { if(ai_GetIsCharacter(oAssociate)) sTarget = "nobody"; else sTarget = GetName(oPC); } NuiSetBind(oPC, nToken, "btn_follow_target_tooltip", JsonString(" " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]")); // Row 7 NuiSetBind(oPC, nToken, "chbx_cmd_ai_script_check", JsonBool (bCmdAIScript)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_ai_script_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_ai_script_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_ai_script_event", JsonBool (TRUE)); sText = " Using normal tactics"; if(ResManGetAliasFor("ai_a_default", RESTYPE_NCS) != "") { string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); if(sScript == "ai_a_ambusher") sText = " Ambusher: Attacks from a hidden position"; else if(sScript == "ai_a_flanker") sText = " Flanker: Attacks enemies engaged with allies"; else if(sScript == "ai_a_peaceful") sText = " Peaceful: Avoids attacking any enemies if possible"; else if(sScript == "ai_a_defensive") sText = " Defensive: Attacks then uses Expertise/Parry"; else if(sScript == "ai_a_ranged") sText = " Ranged: Attacks from range as much as possible"; else if(sScript == "ai_a_cntrspell") sText = " Counter Spell: Tries to counter enemy spells"; } else { if(GetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, oAssociate)) sText = "Using ambush tactics"; else if(GetCombatCondition(X0_COMBAT_FLAG_COWARDLY, oAssociate)) sText = "Using coward tactics"; else if(GetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, oAssociate)) sText = "Using defensive tactics"; else if(GetCombatCondition(X0_COMBAT_FLAG_RANGED, oAssociate)) sText = "Using ranged tactics"; } NuiSetBind(oPC, nToken, "btn_cmd_ai_script_tooltip", JsonString(sText)); if(GetSkillRank(SKILL_SET_TRAP, oAssociate, TRUE) > 0) { NuiSetBind(oPC, nToken, "chbx_cmd_place_trap_check", JsonBool (bCmdPlacetrap)); NuiSetBindWatch (oPC, nToken, "chbx_cmd_place_trap_check", TRUE); NuiSetBind(oPC, nToken, "chbx_cmd_place_trap_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_place_trap_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_place_trap_tooltip", JsonString ( " Place a trap at the location selected")); } // Row 8 NuiSetBind(oPC, nToken, "btn_quick_widget_event", JsonBool(TRUE)); NuiSetBind (oPC, nToken, "btn_quick_widget_tooltip", JsonString( " Add/Remove abilities and spells from creatures widget")); NuiSetBind(oPC, nToken, "chbx_quick_widget_check", JsonBool (bSpellWidget)); NuiSetBindWatch (oPC, nToken, "chbx_quick_widget_check", TRUE); NuiSetBind(oPC, nToken, "chbx_quick_widget_event", JsonBool(TRUE)); if(bMemorize == 2) // Memorizes their spells. { NuiSetBind(oPC, nToken, "btn_spell_memorize_event", JsonBool(TRUE)); NuiSetBind (oPC, nToken, "btn_spell_memorize_tooltip", JsonString( " Change memorized spell list.")); } if(bSpellbook) // Change known spells. { NuiSetBind(oPC, nToken, "btn_spell_known_event", JsonBool(TRUE)); NuiSetBind (oPC, nToken, "btn_spell_known_tooltip", JsonString( " Change known spell list.")); } // Row 9 NuiSetBind(oPC, nToken, "chbx_buff_short_check", JsonBool (bBuffShort)); NuiSetBindWatch (oPC, nToken, "chbx_buff_short_check", TRUE); NuiSetBind(oPC, nToken, "chbx_buff_short_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_short_event", JsonBool (TRUE)); NuiSetBind (oPC, nToken, "btn_buff_short_tooltip", JsonString ( " Buff the party with short duration spells")); NuiSetBind(oPC, nToken, "chbx_buff_long_check", JsonBool (bBuffLong)); NuiSetBindWatch (oPC, nToken, "chbx_buff_long_check", TRUE); NuiSetBind(oPC, nToken, "chbx_buff_long_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_long_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_buff_long_tooltip", JsonString ( " Buff the party with long duration spells")); // Row 10 NuiSetBind(oPC, nToken, "chbx_buff_all_check", JsonBool (bBuffAll)); NuiSetBindWatch (oPC, nToken, "chbx_buff_all_check", TRUE); NuiSetBind(oPC, nToken, "chbx_buff_all_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_all_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_buff_all_tooltip", JsonString ( " Buff the party with all our defensive spells")); if(!bIsPC && ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS) == "") { NuiSetBind(oPC, nToken, "chbx_buff_rest_check", JsonBool (bBuffRest)); NuiSetBindWatch (oPC, nToken, "chbx_buff_rest_check", TRUE); NuiSetBind(oPC, nToken, "chbx_buff_rest_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_rest_event", JsonBool (TRUE)); if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) sText = " [On] Turn buffing after resting off"; else sText = " [Off] Turn buffing after resting on"; NuiSetBind (oPC, nToken, "btn_buff_rest_tooltip", JsonString (sText)); } // Row 11 NuiSetBind(oPC, nToken, "chbx_jump_to_check", JsonBool(bJumpTo)); NuiSetBindWatch (oPC, nToken, "chbx_jump_to_check", TRUE); NuiSetBind(oPC, nToken, "chbx_jump_to_event", JsonBool(TRUE)); sText = GetName(oPC); if(oPC == oAssociate) sName = "everyone"; else sName = GetName(oAssociate); NuiSetBind(oPC, nToken, "btn_jump_to_label", JsonString("Jump to " + sText)); NuiSetBind(oPC, nToken, "btn_jump_to_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_jump_to_tooltip", JsonString ( " Jump " + sName + " to " + sText)); NuiSetBind(oPC, nToken, "chbx_ghost_mode_check", JsonBool (bGhostMode)); NuiSetBindWatch (oPC, nToken, "chbx_ghost_mode_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ghost_mode_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_ghost_mode_event", JsonBool (TRUE)); sText = "On"; if(ai_GetAIMode(oAssociate, AI_MODE_GHOST)) sText = "Off"; NuiSetBind(oPC, nToken, "btn_ghost_mode_tooltip", JsonString ( " Turn " + sText + " clipping through creatures for " + GetName(oAssociate))); // Row 12 NuiSetBind(oPC, nToken, "chbx_camera_check", JsonBool (bCamera)); NuiSetBindWatch (oPC, nToken, "chbx_camera_check", TRUE); NuiSetBind(oPC, nToken, "chbx_camera_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString ( " Toggle camera view for " + sName)); NuiSetBind(oPC, nToken, "chbx_inventory_check", JsonBool (bInventory)); NuiSetBindWatch (oPC, nToken, "chbx_inventory_check", TRUE); NuiSetBind(oPC, nToken, "chbx_inventory_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString ( " Open " + sName + " inventory")); // Row 13 & 14 if(bFamiliar) { NuiSetBind(oPC, nToken, "chbx_familiar_check", JsonBool(bBtnFamiliar)); NuiSetBindWatch (oPC, nToken, "chbx_familiar_check", TRUE); NuiSetBind(oPC, nToken, "chbx_familiar_event", JsonBool(TRUE)); int nFamiliar = GetFamiliarCreatureType(oAssociate); NuiSetBind(oPC, nToken, "cmb_familiar_selected", JsonInt(nFamiliar)); string sFamiliarName = GetFamiliarName(oAssociate); NuiSetBind(oPC, nToken, "txt_familiar_name", JsonString(sFamiliarName)); if(!bIsPC) { NuiSetBind(oPC, nToken, "lbl_familiar_type_label", JsonString("Change familiar type")); NuiSetBind(oPC, nToken, "lbl_familiar_name_label", JsonString("Change familiar name")); NuiSetBind(oPC, nToken, "cmb_familiar_event", JsonBool(TRUE)); NuiSetBindWatch(oPC, nToken, "cmb_familiar_selected", TRUE); NuiSetBind(oPC, nToken, "txt_familiar_name_event", JsonBool(TRUE)); NuiSetBindWatch(oPC, nToken, "txt_familiar_name", TRUE); NuiSetBind(oPC, nToken, "btn_familiar_name_label", JsonString("Save")); } else { NuiSetBind(oPC, nToken, "lbl_familiar_type_label", JsonString("Familiar type")); NuiSetBind(oPC, nToken, "lbl_familiar_name_label", JsonString("Familiar name")); } } // Row 15 & 16 if(bCompanion) { NuiSetBind(oPC, nToken, "chbx_companion_check", JsonBool(bBtnCompanion)); NuiSetBindWatch (oPC, nToken, "chbx_companion_check", TRUE); NuiSetBind(oPC, nToken, "chbx_companion_event", JsonBool(TRUE)); int nCompanion = GetAnimalCompanionCreatureType(oAssociate); NuiSetBind(oPC, nToken, "cmb_companion_selected", JsonInt(nCompanion)); string sCompanionName = GetAnimalCompanionName(oAssociate); NuiSetBind(oPC, nToken, "txt_companion_name", JsonString(sCompanionName)); if(!bIsPC) { NuiSetBind(oPC, nToken, "lbl_companion_type_label", JsonString("Change Companion type")); NuiSetBind(oPC, nToken, "lbl_companion_name_label", JsonString("Change Companion name")); NuiSetBind(oPC, nToken, "cmb_companion_event", JsonBool(TRUE)); NuiSetBindWatch(oPC, nToken, "cmb_companion_selected", TRUE); NuiSetBind(oPC, nToken, "txt_companion_name_event", JsonBool(TRUE)); NuiSetBindWatch(oPC, nToken, "txt_companion_name", TRUE); NuiSetBind(oPC, nToken, "btn_companion_name_label", JsonString("Save")); } else { NuiSetBind(oPC, nToken, "lbl_companion_type_label", JsonString("Companion type")); NuiSetBind(oPC, nToken, "lbl_companion_name_label", JsonString("Companion name")); } } if(bIsPC) { // Row 17+ int nIndex, bWidget; string sButton, sText; json jPlugin = JsonArrayGet(jPCPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { sButton = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_event", JsonBool(TRUE)); bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); if(bWidget < 3) { NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_check", JsonBool(bWidget)); NuiSetBindWatch (oPC, nToken, "chbx_plugin_" + sButton + "_check", TRUE); NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_event", JsonBool(TRUE)); } sText = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_tooltip", JsonString(sText)); jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); } NuiSetBind(oPC, nToken, "chbx_plugin_tooltip", JsonString(" Adds the plugin to your widget.")); } // Row 18 sText = ai_GetRandomTip(); NuiSetBind(oPC, nToken, "lbl_info_1_label", JsonString(sText)); } void ai_CreateAssociateAINUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); int bRight, bLeft; float fHeight = 45.0; // ************************************************************************* Width / Height int bIsPC = ai_GetIsCharacter(oAssociate); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); json jRow = JsonArray(); json jCol = JsonArray(); // Row 1 ******************************************************************* 500 / 73 // If all the AI buttons are blocked then don't load the menu. if(bIsPC) { bRight = GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028; if(!AI_SERVER || bRight) { // If all the Command buttons are blocked then don't load the menu. if(bRight) { jRow = CreateButton(jRow, "Command Menu", "btn_command_menu", 200.0, 20.0, -1.0, "btn_command_menu_tooltip"); jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(!AI_SERVER) { CreateButton(jRow, "Main Menu", "btn_main_menu", 200.0, 20.0, -1.0, "btn_main_menu_tooltip"); CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } } // Row 2 ******************************************************************* 500 / 73 bRight = !ai_GetDMAIAccessButton(BTN_AI_LOOT); if(bRight || !bIsPC) { jRow = JsonArray(); if(!bIsPC) { jRow = CreateButton(jRow, "Command Menu", "btn_command_menu", 200.0, 20.0, -1.0, "btn_command_menu_tooltip"); jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bRight) { jRow = CreateButton(jRow, "Loot Filter", "btn_loot_filter", 200.0, 20.0); jRow = CreateLabel(jRow, "", "blank_label_2", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 3 ******************************************************************* 500 / 101 bRight = !ai_GetDMAIAccessButton(BTN_AI_FOR_PC); bLeft = !ai_GetDMAIAccessButton(BTN_AI_REDUCE_SPEECH); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Player AI On/Off", "btn_ai", 200.0, 20.0, -1.0, "btn_ai_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_ai", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Reduce Speech", "btn_quiet", 200.0, 20.0, -1.0, "btn_quiet_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_quiet", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 4 ******************************************************************* 500 / 129 bRight = !ai_GetDMAIAccessButton(BTN_AI_USE_RANGED); bLeft = !ai_GetDMAIAccessButton(BTN_AI_STOP_WEAPON_EQUIP); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Ranged Combat", "btn_ranged", 200.0, 20.0, -1.0, "btn_ranged_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_ranged", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Equip Best Weapons", "btn_equip_weapon", 200.0, 20.0, -1.0, "btn_equip_weapon_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_equip_weapon", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 5 ******************************************************************* 500 / 157 bRight = !ai_GetDMAIAccessButton(BTN_AI_USE_SEARCH); bLeft = !ai_GetDMAIAccessButton(BTN_AI_USE_STEALTH); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Search Mode", "btn_search", 200.0, 20.0, -1.0, "btn_search_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_search", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Stealth Mode", "btn_stealth", 200.0, 20.0, -1.0, "btn_stealth_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_stealth", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 6 ******************************************************************* 500 / 185 bRight = !ai_GetDMAIAccessButton(BTN_AI_OPEN_DOORS); bLeft = !ai_GetDMAIAccessButton(BTN_AI_REMOVE_TRAPS); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Open Door Mode", "btn_open_door", 200.0, 20.0, -1.0, "btn_open_door_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_open_door", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Disarm Traps Mode", "btn_traps", 200.0, 20.0, -1.0, "btn_traps_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_traps", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 7 ******************************************************************* 500 / 213 bRight = !ai_GetDMAIAccessButton(BTN_AI_PICK_LOCKS); bLeft = !ai_GetDMAIAccessButton(BTN_AI_BASH_LOCKS); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Pick Locks Mode", "btn_pick_locks", 200.0, 20.0, -1.0, "btn_pick_locks_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_pick_locks", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Bash Mode", "btn_bash_locks", 200.0, 20.0, -1.0, "btn_bash_locks_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_bash_locks", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 8 ******************************************************************* 500 / 241 bRight = !ai_GetDMAIAccessButton(BTN_AI_MAGIC_LEVEL); bLeft = !ai_GetDMAIAccessButton(BTN_AI_NO_SPONTANEOUS); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Magic usage level", "btn_magic_level", 200.0, 20.0f, -1.0, "btn_magic_level_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_magic_level", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Cleric Spontaneous Casting", "btn_spontaneous", 200.0, 20.0, -1.0, "btn_spontaneous_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_spontaneous", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 9 ******************************************************************* 500 / 269 bRight = !ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_USE); bLeft = !ai_GetDMAIAccessButton(BTN_AI_NO_MAGIC_ITEM_USE); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Use Magic", "btn_magic", 200.0, 20.0, -1.0, "btn_magic_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_magic", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Use Magic Items", "btn_magic_items", 200.0, 20.0, -1.0, "btn_magic_items_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_magic_items", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 10 ****************************************************************** 500 / 297 bRight = !ai_GetDMAIAccessButton(BTN_AI_DEF_MAGIC_USE); bLeft = !ai_GetDMAIAccessButton(BTN_AI_OFF_MAGIC_USE); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Use Defensive Magic Only", "btn_def_magic", 200.0, 20.0, -1.0, "btn_def_magic_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_def_magic", 25.0, 20.0f); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Use Offensive Magic Only", "btn_off_magic", 200.0, 20.0, -1.0, "btn_off_magic_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_off_magic", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 11 ****************************************************************** 500 / 325 bRight = !ai_GetDMAIAccessButton(BTN_AI_HEAL_OUT); bLeft = !ai_GetDMAIAccessButton(BTN_AI_HEAL_IN); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Heal % Out of Combat", "btn_heal_out", 200.0, 20.0, -1.0, "btn_heal_out_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_heal_out", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Heal % in Combat", "btn_heal_in", 200.0, 20.0, -1.0, "btn_heal_in_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_heal_in", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 12 ****************************************************************** 500 / 353 bRight = !ai_GetDMAIAccessButton(BTN_AI_STOP_SELF_HEALING); bLeft = !ai_GetDMAIAccessButton(BTN_AI_STOP_PARTY_HEALING); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Self Healing", "btn_heals_onoff", 200.0, 20.0, -1.0, "btn_heals_onoff_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_heals_onoff", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Party Healing", "btn_healp_onoff", 200.0, 20.0, -1.0, "btn_healp_onoff_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_healp_onoff", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 13 ****************************************************************** 500 / 391 bRight = !ai_GetDMAIAccessButton(BTN_AI_STOP_CURE_SPELLS); bLeft = !ai_GetDMAIAccessButton(BTN_AI_LOOT); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Cast Cure Spells", "btn_cure_onoff", 200.0, 20.0, -1.0, "btn_cure_onoff_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_cure_onoff", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { if(sAssociateType != "summons" && sAssociateType != "dominated") { jRow = CreateButton(jRow, "Auto Looting", "btn_loot", 200.0, 20.0, -1.0, "btn_loot_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_loot", 25.0, 20.0); } } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 14 ****************************************************************** 500 / --- bRight = !ai_GetDMAIAccessButton(BTN_AI_IGNORE_ASSOCIATES); bLeft = !ai_GetDMAIAccessButton(BTN_AI_IGNORE_TRAPS); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { jRow = CreateButton(jRow, "Ignore Associates", "btn_ignore_assoc", 200.0, 20.0, -1.0, "btn_ignore_assoc_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_ignore_assoc", 25.0, 20.0); } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { jRow = CreateButton(jRow, "Ignore floor Traps", "btn_ignore_traps", 200.0, 20.0, -1.0, "btn_ignore_traps_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_ignore_traps", 25.0, 20.0); } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 15 ****************************************************************** 500 / --- bRight = !ai_GetDMAIAccessButton(BTN_AI_PERC_RANGE); bLeft = FALSE; //!ai_GetDMAIAccessButton(BTN_AI_PERC_RANGE); if(bRight || bLeft) { jRow = JsonArray(); if(bRight) { if(GetAssociateType(oAssociate) == ASSOCIATE_TYPE_HENCHMAN) { jRow = CreateButton(jRow, "Perception Range", "btn_perc_range", 200.0, 20.0, -1.0, "btn_perc_range_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_perc_range", 25.0, 20.0); } } jRow = JsonArrayInsert(jRow, NuiSpacer()); if(bLeft) { } jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 16 ****************************************************************** 500 / --- bRight = !ai_GetDMWAccessButton(BTN_CMD_AI_SCRIPT); if(bRight) { jRow = JsonArray(); jRow = CreateButton(jRow, "Set Current AI:", "btn_ai_script", 175.0f, 20.0f, -1.0, "btn_ai_script_tooltip"); jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_ai_script", 16, FALSE, 145.0f, 20.0f, "txt_ai_script_tooltip"); jRow = CreateCombo(jRow, ai_CreateAIScriptJson(oPC), "cmb_ai_script", 146.0, 20.0); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } // Row 17 ****************************************************************** 500 / --- jRow = JsonArray(); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateLabel(jRow, "", "lbl_info", 475.0, 20.0, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } // Set the Layout of the window. json jLayout = NuiCol(jCol); string sText, sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_NUI, sName + " AI Menu", fX, fY, 500.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Get which buttons are activated. int bAI = ai_GetAIButton(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType); int bReduceSpeech = ai_GetAIButton(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType); int bRanged = ai_GetAIButton(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType); int bEquipWeapons = ai_GetAIButton(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType); int bSearch = ai_GetAIButton(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType); int bStealth = ai_GetAIButton(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType); int bOpenDoors = ai_GetAIButton(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType); int bTraps = ai_GetAIButton(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType); int bPickLocks = ai_GetAIButton(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType); int bBashLocks = ai_GetAIButton(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType); int bMagicLevel = ai_GetAIButton(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType); int bSpontaneous = ai_GetAIButton(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType); int bNoMagic = ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType); int bNoMagicItems = ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType); int bDefMagic = ai_GetAIButton(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType); int bOffMagic = ai_GetAIButton(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType); int bHealOut = ai_GetAIButton(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType); int bHealIn = ai_GetAIButton(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType); int bSelfHealOnOff = ai_GetAIButton(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType); int bPartyHealOnOff = ai_GetAIButton(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType); int bCureOnOff = ai_GetAIButton(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType); int bIgnoreAssociates = ai_GetAIButton(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType); int bIgnoreTraps = ai_GetAIButton(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType); int bLoot = ai_GetAIButton(oPC, BTN_AI_LOOT, oAssociate, sAssociateType); int bPercRange = ai_GetAIButton(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType); // Save the associate to the nui for use in 0e_nui json jData = JsonArray(); jData = JsonArrayInsert(jData, JsonString(ObjectToString(oAssociate))); NuiSetUserData(oPC, nToken, jData); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Set all binds, events, and watches. // Row 1 // If all the AI buttons are blocked then don't load the menu. if(bIsPC) { bRight = GetLocalInt(GetModule(), sDMWidgetAccessVarname) != 7340028; if(!AI_SERVER || bRight) { // If all the Command buttons are blocked then don't load the menu. if(bRight) { NuiSetBind(oPC, nToken, "btn_command_menu_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_command_menu_tooltip", JsonString(" " + sName + " Command options")); } if(!AI_SERVER) { NuiSetBind(oPC, nToken, "btn_main_menu_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_main_menu_tooltip", JsonString(" Module Options")); } fHeight += 28.0; } } // Row 2 if(!bIsPC) { NuiSetBind(oPC, nToken, "btn_command_menu_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_command_menu_tooltip", JsonString(" " + sName + " Command options")); } NuiSetBind(oPC, nToken, "btn_loot_filter_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_loot_filter", JsonInt(TRUE)); // Row 3 // Only activate ai on/off if this is for the pc. if(bIsPC && ResManGetAliasFor("prc_ai_fam_percp", RESTYPE_NCS) == "") { NuiSetBind(oPC, nToken, "chbx_ai_check", JsonBool(bAI)); NuiSetBindWatch (oPC, nToken, "chbx_ai_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ai_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_ai_event", JsonBool(TRUE)); if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") sText = " AI On"; else sText = " AI Off"; NuiSetBind(oPC, nToken, "btn_ai_tooltip", JsonString(sText)); } NuiSetBind(oPC, nToken, "chbx_quiet_check", JsonBool(bReduceSpeech)); NuiSetBindWatch (oPC, nToken, "chbx_quiet_check", TRUE); NuiSetBind(oPC, nToken, "chbx_quiet_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_quiet_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) sText = " Reduced Speech On"; else sText = " Reduces Speech Off"; NuiSetBind (oPC, nToken, "btn_quiet_tooltip", JsonString(sText)); // Row 4 NuiSetBind(oPC, nToken, "chbx_ranged_check", JsonBool(bRanged)); NuiSetBindWatch(oPC, nToken, "chbx_ranged_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ranged_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_ranged_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) sText = " Ranged Off"; else sText = " Ranged On"; NuiSetBind (oPC, nToken, "btn_ranged_tooltip", JsonString(sText)); NuiSetBind(oPC, nToken, "chbx_equip_weapon_check", JsonBool(bEquipWeapons)); NuiSetBindWatch(oPC, nToken, "chbx_equip_weapon_check", TRUE); NuiSetBind(oPC, nToken, "chbx_equip_weapon_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_equip_weapon_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF)) sText = " Equiping Best Weapons Off"; else sText = " Equiping Best Weapons On"; NuiSetBind (oPC, nToken, "btn_equip_weapon_tooltip", JsonString(sText)); // Row 5 if(GetRacialType(oAssociate) != RACIAL_TYPE_ELF) { NuiSetBind(oPC, nToken, "chbx_search_check", JsonBool(bSearch)); NuiSetBindWatch (oPC, nToken, "chbx_search_check", TRUE); NuiSetBind(oPC, nToken, "chbx_search_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_search_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) sText = " Search mode On"; else sText = " Search mode Off"; NuiSetBind (oPC, nToken, "btn_search_tooltip", JsonString(sText)); } NuiSetBind(oPC, nToken, "chbx_stealth_check", JsonBool(bStealth)); NuiSetBindWatch(oPC, nToken, "chbx_stealth_check", TRUE); NuiSetBind(oPC, nToken, "chbx_stealth_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_stealth_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) sText = " Stealth mode On"; else sText = " Stealth mode Off"; NuiSetBind (oPC, nToken, "btn_stealth_tooltip", JsonString(sText)); // Row 6 string sRange = FloatToString(GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE), 0, 0); NuiSetBind(oPC, nToken, "chbx_open_door_check", JsonBool(bOpenDoors)); NuiSetBindWatch (oPC, nToken, "chbx_open_door_check", TRUE); NuiSetBind(oPC, nToken, "chbx_open_door_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_open_door_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_OPEN_DOORS)) sText = " Open Doors On [" + sRange + " meters]"; else sText = " Open Doors Off [" + sRange + " meters]"; NuiSetBind (oPC, nToken, "btn_open_door_tooltip", JsonString(sText)); sRange = FloatToString(GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE), 0, 0); NuiSetBind(oPC, nToken, "chbx_traps_check", JsonBool(bTraps)); NuiSetBindWatch (oPC, nToken, "chbx_traps_check", TRUE); NuiSetBind(oPC, nToken, "chbx_traps_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_traps_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS)) sText = " Disable Traps On [" + sRange + " meters]"; else sText = " Disable Traps Off [" + sRange + " meters]"; NuiSetBind (oPC, nToken, "btn_traps_tooltip", JsonString(sText)); // Row 7 sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); NuiSetBind(oPC, nToken, "chbx_pick_locks_check", JsonBool(bPickLocks)); NuiSetBindWatch(oPC, nToken, "chbx_pick_locks_check", TRUE); NuiSetBind(oPC, nToken, "chbx_pick_locks_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_pick_locks_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS)) sText = " Pick locks On [" + sRange + " meters]"; else sText = " Pick Locks Off [" + sRange + " meters]"; NuiSetBind (oPC, nToken, "btn_pick_locks_tooltip", JsonString(sText)); NuiSetBind(oPC, nToken, "chbx_bash_locks_check", JsonBool(bBashLocks)); NuiSetBindWatch(oPC, nToken, "chbx_bash_locks_check", TRUE); NuiSetBind(oPC, nToken, "chbx_bash_locks_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_bash_locks_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) sText = " Bash On [" + sRange + " meters]"; else sText = " Bash Off [" + sRange + " meters]"; NuiSetBind (oPC, nToken, "btn_bash_locks_tooltip", JsonString(sText)); // Row 8 string sMagic = IntToString(GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT)); NuiSetBind(oPC, nToken, "chbx_magic_level_check", JsonBool(bMagicLevel)); NuiSetBindWatch (oPC, nToken, "chbx_magic_level_check", TRUE); NuiSetBind(oPC, nToken, "chbx_magic_level_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_level_event", JsonBool(TRUE)); NuiSetBind (oPC, nToken, "btn_magic_level_tooltip", JsonString(" Magic level [" + sMagic + "]")); sText = " Spontaneous casting On"; if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_SPONTANEOUS_CURE)) sText = " Spontaneous casting Off"; NuiSetBind(oPC, nToken, "chbx_spontaneous_check", JsonBool(bSpontaneous)); NuiSetBindWatch (oPC, nToken, "chbx_spontaneous_check", TRUE); NuiSetBind(oPC, nToken, "chbx_spontaneous_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_spontaneous_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_spontaneous_tooltip", JsonString(sText)); // Row 9 if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC)) sText = " Magic Off"; else sText = " Magic On"; NuiSetBind(oPC, nToken, "chbx_magic_check", JsonBool(bNoMagic)); NuiSetBindWatch (oPC, nToken, "chbx_magic_check", TRUE); NuiSetBind(oPC, nToken, "chbx_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_tooltip", JsonString(sText)); if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) sText = " Magic Items Off"; else sText = " Magic Items On"; NuiSetBind(oPC, nToken, "chbx_magic_items_check", JsonBool(bNoMagicItems)); NuiSetBindWatch (oPC, nToken, "chbx_magic_items_check", TRUE); NuiSetBind(oPC, nToken, "chbx_magic_items_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_items_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_items_tooltip", JsonString(sText)); // Row 10 if(ai_GetMagicMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) sText = " Defensive Magic On"; else sText = " Defensive Magic Off"; NuiSetBind(oPC, nToken, "chbx_def_magic_check", JsonBool (bDefMagic)); NuiSetBindWatch (oPC, nToken, "chbx_def_magic_check", TRUE); NuiSetBind(oPC, nToken, "chbx_def_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_def_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_def_magic_tooltip", JsonString(sText)); if(ai_GetMagicMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) sText = " Offensive Magic On"; else sText = " Offensive Magic Off"; NuiSetBind(oPC, nToken, "chbx_off_magic_check", JsonBool(bOffMagic)); NuiSetBindWatch (oPC, nToken, "chbx_off_magic_check", TRUE); NuiSetBind(oPC, nToken, "chbx_off_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_off_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_off_magic_tooltip", JsonString(sText)); // Row 11 int nHeal = GetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT); NuiSetBind(oPC, nToken, "chbx_heal_out_check", JsonBool(bHealOut)); NuiSetBindWatch (oPC, nToken, "chbx_heal_out_check", TRUE); NuiSetBind(oPC, nToken, "chbx_heal_out_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_heal_out_event", JsonBool(TRUE)); sText = " Will heal at or below [" + IntToString(nHeal) + "%] health out of combat"; NuiSetBind(oPC, nToken, "btn_heal_out_tooltip", JsonString(sText)); nHeal = GetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT); NuiSetBind(oPC, nToken, "chbx_heal_in_check", JsonBool(bHealIn)); NuiSetBindWatch (oPC, nToken, "chbx_heal_in_check", TRUE); NuiSetBind(oPC, nToken, "chbx_heal_in_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_heal_in_event", JsonBool (TRUE)); sText = " Will heal at or below [" + IntToString(nHeal) + "%] health in combat"; NuiSetBind(oPC, nToken, "btn_heal_in_tooltip", JsonString(sText)); // Row 12 NuiSetBind(oPC, nToken, "chbx_heals_onoff_check", JsonBool(bSelfHealOnOff)); NuiSetBindWatch (oPC, nToken, "chbx_heals_onoff_check", TRUE); NuiSetBind(oPC, nToken, "chbx_heals_onoff_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_heals_onoff_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF)) sText = " Self healing Off"; else sText = " Self healing On"; NuiSetBind(oPC, nToken, "btn_heals_onoff_tooltip", JsonString(sText)); NuiSetBind(oPC, nToken, "chbx_healp_onoff_check", JsonBool(bPartyHealOnOff)); NuiSetBind(oPC, nToken, "chbx_healp_onoff_event", JsonBool(TRUE)); NuiSetBindWatch (oPC, nToken, "chbx_healp_onoff_check", TRUE); NuiSetBind(oPC, nToken, "btn_healp_onoff_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF)) sText = " Party healing Off"; else sText = " Party healing On"; NuiSetBind(oPC, nToken, "btn_healp_onoff_tooltip", JsonString(sText)); // Row 13 NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(sText)); NuiSetBind(oPC, nToken, "chbx_cure_onoff_check", JsonBool(bCureOnOff)); NuiSetBind(oPC, nToken, "chbx_cure_onoff_event", JsonBool(TRUE)); NuiSetBindWatch (oPC, nToken, "chbx_cure_onoff_check", TRUE); NuiSetBind(oPC, nToken, "btn_cure_onoff_event", JsonBool(TRUE)); if(ai_GetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF)) sText = " Cast Cure Spells Off"; else sText = " Cast Cure Spells On"; NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(sText)); if(sAssociateType != "summons" && sAssociateType != "dominated") { sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE), 0, 0); if(ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS)) sText = " Looting On [" + sRange + " meters]"; else sText = " Looting Off [" + sRange + " meters]"; NuiSetBind(oPC, nToken, "chbx_loot_check", JsonBool(bLoot)); NuiSetBindWatch (oPC, nToken, "chbx_loot_check", TRUE); NuiSetBind(oPC, nToken, "chbx_loot_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_loot_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_loot_tooltip", JsonString(sText)); } // Row 14 NuiSetBind(oPC, nToken, "chbx_ignore_assoc_check", JsonBool(bIgnoreAssociates)); NuiSetBindWatch(oPC, nToken, "chbx_ignore_assoc_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ignore_assoc_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_ignore_assoc_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) sText = " Ignore Enemy Associates On"; else sText = " Ignore Enemy Associates Off"; NuiSetBind (oPC, nToken, "btn_ignore_assoc_tooltip", JsonString(sText)); NuiSetBind(oPC, nToken, "chbx_ignore_traps_check", JsonBool(bIgnoreTraps)); NuiSetBindWatch(oPC, nToken, "chbx_ignore_traps_check", TRUE); NuiSetBind(oPC, nToken, "chbx_ignore_traps_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_ignore_traps_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS)) sText = " Ignore Floor Traps On"; else sText = " Ignore Floor Traps Off"; NuiSetBind (oPC, nToken, "btn_ignore_traps_tooltip", JsonString(sText)); // Row 15 if(!bIsPC) { int nRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU"); if(nRange < 8 || nRange > 11) { nRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION); SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION + "_MENU", nRange); } if(nRange == 8) sText = " Perception Range Short [10 meters Sight / 10 meters Listen]"; else if(nRange == 9) sText = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; else if(nRange == 10) sText = " Perception Range Long [35 meters Sight / 20 meters Listen]"; else sText = " Perception Range Default [20 meters Sight / 20 meters Listen]"; NuiSetBind(oPC, nToken, "chbx_perc_range_check", JsonBool(bPercRange)); NuiSetBindWatch (oPC, nToken, "chbx_perc_range_check", TRUE); NuiSetBind(oPC, nToken, "chbx_perc_range_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_perc_range_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_perc_range_tooltip", JsonString(sText)); } // Row 16 string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); if(sScript == "") sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); NuiSetBind(oPC, nToken, "btn_ai_script_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_ai_script_tooltip", JsonString(" Sets " + GetName(oAssociate) + " to use the ai script in the text box.")); NuiSetBind(oPC, nToken, "txt_ai_script_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_ai_script", JsonString(sScript)); NuiSetBind(oPC, nToken, "txt_ai_script_tooltip", JsonString(" Associate AI scripts must start with ai_a_")); NuiSetBind(oPC, nToken, "cmb_ai_script_event", JsonBool(TRUE)); NuiSetBindWatch(oPC, nToken, "cmb_ai_script_selected", TRUE); // Row 17 sText = ai_GetRandomTip(); NuiSetBind (oPC, nToken, "lbl_info_label", JsonString(sText)); } void ai_SetWidgetBinds(object oPC, object oAssociate, string sAssociateType, int nToken, string sName) { int bBool, bIsPC = ai_GetIsCharacter(oAssociate); string sText, sRange, sHeal; // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Set the buttons to show events. NuiSetBind(oPC, nToken, "btn_open_main_image", JsonString(GetPortraitResRef(oAssociate) + "s")); NuiSetBind(oPC, nToken, "btn_open_main_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_open_main_tooltip", JsonString(" " + sName + " widget menu")); if(bIsPC) sText = " All associates"; else sText = " " + GetName(oAssociate); if(ai_GetWidgetButton(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_action_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_action_tooltip", JsonString(sText + " do actions")); } if(ai_GetWidgetButton(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_guard_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_guard_tooltip", JsonString(sText + " enter guard mode")); bBool = ai_GetAIMode(oAssociate, AI_MODE_DEFEND_MASTER); NuiSetBind(oPC, nToken, "btn_cmd_guard_encouraged", JsonBool(bBool)); } if(ai_GetWidgetButton(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_hold_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_hold_tooltip", JsonString(sText + " enter hold mode")); bBool = ai_GetAIMode(oAssociate, AI_MODE_STAND_GROUND); NuiSetBind(oPC, nToken, "btn_cmd_hold_encouraged", JsonBool(bBool)); } if(ai_GetWidgetButton(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_attack_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_attack_tooltip", JsonString(sText + " enter normal mode")); if(!bIsPC) { if(!ai_GetAIMode(oAssociate, AI_MODE_DEFEND_MASTER) && !ai_GetAIMode(oAssociate, AI_MODE_STAND_GROUND) && !ai_GetAIMode(oAssociate, AI_MODE_FOLLOW)) bBool = TRUE; else bBool = FALSE; if(!bIsPC) NuiSetBind(oPC, nToken, "btn_cmd_attack_encouraged", JsonBool(bBool)); } } if(ai_GetWidgetButton(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_follow_event", JsonBool(TRUE)); float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); string sRange = FloatToString(fRange, 0, 0); if(bIsPC) { sText = " All associates"; NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode")); } else { sText = " " + GetName(oAssociate); NuiSetBind(oPC, nToken, "btn_cmd_follow_tooltip", JsonString(sText + " enter follow mode [" + sRange + " meters]")); } bBool = ai_GetAIMode(oAssociate, AI_MODE_FOLLOW); if(!bIsPC) NuiSetBind(oPC, nToken, "btn_cmd_follow_encouraged", JsonBool(bBool)); } if(ai_GetAIButton(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_follow_target_event", JsonBool(TRUE)); object oTarget = GetLocalObject(oAssociate, AI_FOLLOW_TARGET); string sTarget; if(oTarget != OBJECT_INVALID) sTarget = GetName(oTarget); else { if(ai_GetIsCharacter(oAssociate)) sTarget = "nobody"; else sTarget = GetName(oPC); } float fRange = GetLocalFloat(oAssociate, AI_FOLLOW_RANGE) + StringToFloat(Get2DAString("appearance", "PREFATCKDIST", GetAppearanceType(oAssociate))); string sRange = FloatToString(fRange, 0, 0); NuiSetBind(oPC, nToken, "btn_follow_target_tooltip", JsonString(" " + GetName(oAssociate) + " following " + sTarget + " [" + sRange + " meters]")); } if(ai_GetWidgetButton(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_search_event", JsonBool(TRUE)); if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_SEARCH)) sText = " leave "; else sText = " enter "; NuiSetBind(oPC, nToken, "btn_cmd_search_tooltip", JsonString(" Everyone" + sText + "search mode")); } if(ai_GetWidgetButton(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_stealth_event", JsonBool(TRUE)); if(ai_GetAIMode(oPC, AI_MODE_AGGRESSIVE_STEALTH)) sText = " leave "; else sText = " enter "; NuiSetBind(oPC, nToken, "btn_cmd_stealth_tooltip", JsonString(" Everyone" + sText + "stealth mode")); } if(ai_GetWidgetButton(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType)) { sText = " Default tactics: Using the creatures base AI script"; string sIcon = "ir_scommand"; if(ResManGetAliasFor("0e_ch_1_hb", RESTYPE_NCS) != "") { string sScript = GetLocalString(oAssociate, AI_COMBAT_SCRIPT); if(sScript == "ai_a_ambusher") { sText = " Ambusher: Attacks from a hidden position"; sIcon = "ir_rogue"; } else if(sScript == "ai_a_flanker") { sText = " Flanker: Attacks enemies engaged with allies"; sIcon = "ir_invite"; } else if(sScript == "ai_a_peaceful") { sText = " Peaceful: Avoids attacking any enemies if possible"; sIcon = "ir_ignore"; } else if(sScript == "ai_a_defensive") { sText = " Defensive: Attacks then uses Expertise/Parry"; sIcon = "ir_knockdwn"; } else if(sScript == "ai_a_ranged") { sText = " Ranged: Attacks from range as much as possible"; sIcon = "ir_ranger"; } else if(sScript == "ai_a_cntrspell") { sText = " Counter Spell: Tries to counter enemy spells"; sIcon = "ir_dcaster"; } } else { if(GetCombatCondition(X0_COMBAT_FLAG_AMBUSHER, oAssociate)) sText = "Using ambush tactics"; if(GetCombatCondition(X0_COMBAT_FLAG_COWARDLY, oAssociate)) sText = "Using coward tactics"; if(GetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE, oAssociate)) sText = "Using defensive tactics"; if(GetCombatCondition(X0_COMBAT_FLAG_RANGED, oAssociate)) sText = "Using ranged tactics"; } NuiSetBind(oPC, nToken, "btn_cmd_ai_script_image", JsonString(sIcon)); NuiSetBind(oPC, nToken, "btn_cmd_ai_script_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_ai_script_tooltip", JsonString(sText)); } if(ai_GetWidgetButton(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cmd_place_trap_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_cmd_place_trap_tooltip", JsonString(" Place a trap at the location selected")); } if(ai_GetWidgetButton(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_buff_short_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_short_tooltip", JsonString(" Buff the party with short duration spells")); } if(ai_GetWidgetButton(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_buff_long_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_long_tooltip", JsonString(" Buff the party with long duration spells")); } if(ai_GetWidgetButton(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_buff_all_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_buff_all_tooltip", JsonString(" Buff the party with all our defensive spells")); } if(ai_GetWidgetButton(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_jump_to_event", JsonBool(TRUE)); sText = GetName(oPC); if(oPC == oAssociate) sName = "everyone"; else sName = GetName(oAssociate); NuiSetBind(oPC, nToken, "btn_jump_to_tooltip", JsonString(" Jump " + sName + " to " + sText)); } if(ai_GetWidgetButton(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_ghost_mode_event", JsonBool (TRUE)); sText = "On"; if(ai_GetAIMode(oAssociate, AI_MODE_GHOST)) sText = "Off"; NuiSetBind(oPC, nToken, "btn_ghost_mode_tooltip", JsonString ( " Turn " + sText + " clipping through creatures for " + GetName(oAssociate))); } if(ai_GetWidgetButton(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_camera_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_camera_tooltip", JsonString(" Toggle camera view for " + sName)); } if(ai_GetWidgetButton(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_inventory_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_inventory_tooltip", JsonString(" Open " + sName + " inventory")); } if(ai_GetWidgetButton(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_familiar_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_familiar_tooltip", JsonString(" Summon " + sName + " familiar.")); } if(ai_GetWidgetButton(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_companion_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_companion_tooltip", JsonString(" Open " + sName + " Animal Companion.")); } if(ai_GetWidgetButton(oPC, BTN_BUFF_REST, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_buff_rest_event", JsonBool(TRUE)); if(ai_GetMagicMode(oAssociate, AI_MAGIC_BUFF_AFTER_REST)) sText = " Turn buffing after resting off"; else sText = " Turn buffing after resting on."; NuiSetBind(oPC, nToken, "btn_buff_rest_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_ai_event", JsonBool(TRUE)); if(GetEventScript(oAssociate, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT) == "xx_pc_1_hb") sText = " AI [On] Turn off"; else sText = " AI [Off] Turn on"; NuiSetBind(oPC, nToken, "btn_ai_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_quiet_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_DO_NOT_SPEAK)) sText = " Reduced Speech On"; else sText = " Reduced Speech Off"; NuiSetBind(oPC, nToken, "btn_quiet_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_ranged_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_STOP_RANGED)) sText = " Ranged Off"; else sText = " Ranged On"; NuiSetBind(oPC, nToken, "btn_ranged_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_equip_weapon_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_EQUIP_WEAPON_OFF)) sText = " Equiping Best Weapons Off"; else sText = " Equiping Best Weapons On"; NuiSetBind(oPC, nToken, "btn_equip_weapon_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_search_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_SEARCH)) sText = " Search On"; else sText = " Search Off"; NuiSetBind(oPC, nToken, "btn_search_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_stealth_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_AGGRESSIVE_STEALTH)) sText = " Stealth On"; else sText = " Stealth Off"; NuiSetBind(oPC, nToken, "btn_stealth_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType)) { sRange = FloatToString(GetLocalFloat(oAssociate, AI_OPEN_DOORS_RANGE), 0, 0); NuiSetBind(oPC, nToken, "btn_open_door_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_OPEN_DOORS)) sText = " Open Doors On [" + sRange + " meters]"; else sText = " Open Doors Off [" + sRange + " meters]"; NuiSetBind(oPC, nToken, "btn_open_door_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType)) { sRange = FloatToString(GetLocalFloat(oAssociate, AI_TRAP_CHECK_RANGE), 0, 0); NuiSetBind(oPC, nToken, "btn_traps_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_DISARM_TRAPS)) sText = " Disable Traps On [" + sRange + " meters]"; else sText = " Disable Traps Off [" + sRange + " meters]"; NuiSetBind(oPC, nToken, "btn_traps_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType)) { sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); NuiSetBind(oPC, nToken, "btn_pick_locks_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_PICK_LOCKS)) sText = " Pick locks On [" + sRange + " meters]"; else sText = " Pick Locks Off [" + sRange + " meters]"; NuiSetBind(oPC, nToken, "btn_pick_locks_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType)) { sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOCK_CHECK_RANGE), 0, 0); NuiSetBind(oPC, nToken, "btn_bash_locks_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_BASH_LOCKS)) sText = " Bash On [" + sRange + " meters]"; else sText = " Bash Off [" + sRange + " meters]"; NuiSetBind(oPC, nToken, "btn_bash_locks_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_magic_level_event", JsonBool(TRUE)); string sMagic = IntToString(GetLocalInt(oAssociate, AI_DIFFICULTY_ADJUSTMENT)); NuiSetBind(oPC, nToken, "btn_magic_level_tooltip", JsonString(" Magic Level [" + sMagic + "]")); } if(ai_GetAIButton(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType)) { string sCasting = " Spontaneous casting On"; if(ai_GetMagicMode(oAssociate, AI_MAGIC_NO_SPONTANEOUS_CURE)) sCasting = " Spontaneous casting Off"; NuiSetBind(oPC, nToken, "btn_spontaneous_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_spontaneous_tooltip", JsonString(sCasting)); } if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType)) { if(ai_GetAIMode(oAssociate, AI_MAGIC_NO_MAGIC)) sText = " Magic Off"; else sText = " Magic On"; NuiSetBind(oPC, nToken, "btn_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType)) { if(ai_GetAIMode(oAssociate, AI_MAGIC_NO_MAGIC_ITEMS)) sText = " Magic Items Off"; else sText = " Magic Items On"; NuiSetBind(oPC, nToken, "btn_magic_items_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_magic_items_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType)) { if(ai_GetAIMode(oAssociate, AI_MAGIC_DEFENSIVE_CASTING)) sText = " Defensive Magic On"; else sText = " Defensive Magic Off"; NuiSetBind(oPC, nToken, "btn_def_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_def_magic_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType)) { if(ai_GetAIMode(oAssociate, AI_MAGIC_OFFENSIVE_CASTING)) sText = " Offensive Magic On"; else sText = " Offensive Magic Off"; NuiSetBind(oPC, nToken, "btn_off_magic_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_off_magic_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_heal_out_event", JsonBool(TRUE)); sHeal = IntToString(GetLocalInt(oAssociate, AI_HEAL_OUT_OF_COMBAT_LIMIT)); sText = " Will heal at or below [" + sHeal + "%] health out of combat"; NuiSetBind(oPC, nToken, "btn_heal_out_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_heal_in_event", JsonBool(TRUE)); sHeal = IntToString(GetLocalInt(oAssociate, AI_HEAL_IN_COMBAT_LIMIT)); sText = " Will heal at or below [" + sHeal + "%] health in combat"; NuiSetBind(oPC, nToken, "btn_heal_in_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_heals_onoff_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_SELF_HEALING_OFF)) sText = " Self healing Off"; else sText = " Self healing On"; NuiSetBind(oPC, nToken, "btn_heals_onoff_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_healp_onoff_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_PARTY_HEALING_OFF)) sText = " Party healing Off"; else sText = " Party healing On"; NuiSetBind(oPC, nToken, "btn_healp_onoff_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_cure_onoff_event", JsonBool(TRUE)); if(ai_GetMagicMode(oAssociate, AI_MAGIC_CURE_SPELLS_OFF)) sText = " Cast Cure Spells Off"; else sText = " Cast Cure Spells On"; NuiSetBind(oPC, nToken, "btn_cure_onoff_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_LOOT, oAssociate, sAssociateType)) { sRange = FloatToString(GetLocalFloat(oAssociate, AI_LOOT_CHECK_RANGE), 0, 0); string sLoot = " Looting Off [" + sRange + " meters]"; if(ai_GetAIMode(oAssociate, AI_MODE_PICKUP_ITEMS)) sLoot = " Looting On [" + sRange + " meters]"; NuiSetBind(oPC, nToken, "btn_loot_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_loot_tooltip", JsonString(sLoot)); } if(ai_GetAIButton(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_ignore_assoc_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_ASSOCIATES)) sText = " Ignore Enemy Associates On"; else sText = " Ignore Enemy Associates Off"; NuiSetBind(oPC, nToken, "btn_ignore_assoc_tooltip", JsonString(sText)); } if(ai_GetAIButton(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_ignore_traps_event", JsonBool(TRUE)); if(ai_GetAIMode(oAssociate, AI_MODE_IGNORE_TRAPS)) sText = " Ignore Floor Traps On"; else sText = " Ignore Floor Traps Off"; NuiSetBind(oPC, nToken, "btn_ignore_traps_tooltip", JsonString(sText)); } json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); if(ai_GetAIButton(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType)) { int nRange = GetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION); if(nRange < 8 || nRange > 11) { nRange = 11; SetLocalInt(oAssociate, AI_ASSOCIATE_PERCEPTION, 11); jAIData = JsonArraySet(jAIData, 7, JsonInt(11)); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } if(nRange == 8) sText = " Perception Range Short [10 meters Sight / 10 meters Listen]"; if(nRange == 9) sText = " Perception Range Medium [20 meters Sight / 20 meters Listen]"; if(nRange == 10) sText = " Perception Range Long [35 meters Sight / 20 meters Listen]"; else sText = " Perception Range Default [20 meters Sight / 20 meters Listen]"; NuiSetBind(oPC, nToken, "btn_perc_range_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_perc_range_tooltip", JsonString(sText)); } if(bIsPC) { int nIndex, bWidget; string sButton, sName, sText, sScript; json jPCPlugins = ai_UpdatePluginsForPC(oPC); json jPlugin = JsonArrayGet(jPCPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); if(bWidget) { sButton = IntToString(nIndex); sScript = JsonGetString(JsonArrayGet(jPlugin, 0)); if(ResManGetAliasFor(sScript, RESTYPE_NCS) == "") { sText = " " + sScript + " not found by ResMan!"; } else sName = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); NuiSetBind(oPC, nToken, "btn_exe_plugin_" + sButton + "_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_exe_plugin_" + sButton + "_tooltip", JsonString(sName)); } jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); } } if(ai_GetWidgetButton(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType)) { NuiSetBind(oPC, nToken, "btn_update_widget_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_update_widget_tooltip", JsonString(" Updates Quick Use Widget")); json jSpell, jSpells = JsonArrayGet(jAIData, 10); json jWidget = JsonArrayGet(jSpells, 2); object oItem; if(JsonGetType(jWidget) != JSON_TYPE_NULL) { int nLevel, nSpell, nIndex, nClass, nMetaMagic, nDomain, nSubSpell, nFeat; string sSpellIcon, sMetaMagicText, sSubSpell, sClass, sIndex; while(nIndex < 10) { jSpell = JsonArrayGet(jWidget, nIndex); if(JsonGetType(jSpell) != JSON_TYPE_NULL) { sIndex = IntToString(nIndex); nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); if(nClass == -1) // This is an Item. { string sBaseName; sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); if(nSpell == SPELL_HEALINGKIT) { sName = "Healer's Kit +" + IntToString(nIprpSubType); sSpellIcon = "isk_heal"; sBaseName = "Healer's Kit"; } else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || nBaseItemType == BASE_ITEM_SCROLL || nBaseItemType == BASE_ITEM_SPELLSCROLL) { sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); sBaseName = "Scroll"; } else { if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || nBaseItemType == BASE_ITEM_MAGICWAND || nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); int nUses = ai_GetItemUses(oItem, nIprpSubType); if(nUses) { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); if(nUses == 999) sText = "Unlimited"; else sText = IntToString(nUses); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); } else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } else { nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); if(nFeat) // This is a feat. { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); sSpellIcon = ""; if(nSpell) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } if(sSpellIcon == "" || sSpellIcon == "IR_USE") { sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); sSpellIcon = Get2DAString("feat", "ICON", nFeat); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); if(GetHasFeat(nFeat, oAssociate)) { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); } else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } else // This is a spell. { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); if(GetSpellUsesLeft(oAssociate, nClass, nSpell, nMetaMagic, nDomain)) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); } else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } } } else break; ++nIndex; } while(nIndex < 20) { jSpell = JsonArrayGet(jWidget, nIndex); if(JsonGetType(jSpell) != JSON_TYPE_NULL) { sIndex = IntToString(nIndex); nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); if(nClass == -1) // This is an Item. { oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); if(oItem != OBJECT_INVALID) { string sBaseName; sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); if(nSpell == SPELL_HEALINGKIT) { sName = "Healer's Kit +" + IntToString(nIprpSubType); sSpellIcon = "isk_heal"; sBaseName = "Healer's Kit"; } else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || nBaseItemType == BASE_ITEM_SCROLL || nBaseItemType == BASE_ITEM_SPELLSCROLL) { sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); sBaseName = "Scroll"; } else { if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || nBaseItemType == BASE_ITEM_MAGICWAND || nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); int nUses = ai_GetItemUses(oItem, nIprpSubType); if(nUses) { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); if(nUses == 999) sText = "Unlimited"; else sText = IntToString(nUses); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); } else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } else jWidget = JsonArrayDel(jWidget, nIndex--); } else if(nFeat) // This is a feat. { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); sSpellIcon = ""; if(nSpell) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } if(sSpellIcon == "" || sSpellIcon == "IR_USE") { sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); sSpellIcon = Get2DAString("feat", "ICON", nFeat); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); if(GetHasFeat(nFeat, oAssociate)) { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); } else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } else // This is a spell. { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); //SendMessageToPC(oPC, GetName(oAssociate) + " nSpell: " + IntToString(nSpell) + // " nClass: " + IntToString(nClass) + " nMetaMagic: " + IntToString(nMetaMagic) + // " nDomain: " + IntToString(nDomain) + " nLevel: " + IntToString(nLevel)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); sSubSpell = Get2DAString("spells", "Master", nSpell); if(sSubSpell != "") nSpell = StringToInt(sSubSpell); if(nDomain == -1 || GetSpellUsesLeft(oAssociate, nClass, nSpell, nMetaMagic, nDomain)) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); if(nDomain == -1) NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); else { sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); } } else NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } } else break; ++nIndex; } } } } void ai_CreateWidgetNUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); if(sAssociateType == "") return; int bAIWidgetLock = ai_GetWidgetButton(oPC, BTN_WIDGET_LOCK, oAssociate, sAssociateType); int bVertical = ai_GetWidgetButton(oPC, BTN_WIDGET_VERTICAL, oAssociate, sAssociateType); float fButtons; // ************************************************************************* Width / Height // Row 1 (buttons)********************************************************** // Setup the main associate button to use their portrait. json jButton = NuiEnabled(NuiId (NuiButtonImage(NuiBind("btn_open_main_image")), "btn_open_main"), NuiBind("btn_open_main_event")); jButton = NuiWidth(jButton, 35.0); jButton = NuiHeight(jButton, 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind ("btn_open_main_tooltip")); jButton = NuiImageRegion(jButton, NuiRect(0.0, 0.0, 32.0, 35.0)); json jRow = JsonArrayInsert(JsonArray(), jButton); if(ai_GetWidgetButton(oPC, BTN_CMD_ACTION, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_action", "btn_cmd_action", 35.0f, 35.0f, 0.0, "btn_cmd_action_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_GUARD, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_guard", "btn_cmd_guard", 35.0f, 35.0f, 0.0, "btn_cmd_guard_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_HOLD, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_standground", "btn_cmd_hold", 35.0f, 35.0f, 0.0, "btn_cmd_hold_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_ATTACK, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_attacknearest", "btn_cmd_attack", 35.0f, 35.0f, 0.0, "btn_cmd_attack_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_FOLLOW, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_follow", "btn_cmd_follow", 35.0f, 35.0f, 0.0, "btn_cmd_follow_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_FOLLOW_TARGET, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_dmchat", "btn_follow_target", 35.0f, 35.0f, 0.0, "btn_follow_target_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_SEARCH, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ife_foc_search", "btn_cmd_search", 35.0f, 35.0f, 0.0, "btn_cmd_search_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_STEALTH, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ife_foc_hide", "btn_cmd_stealth", 35.0f, 35.0f, 0.0, "btn_cmd_stealth_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_AI_SCRIPT, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "", "btn_cmd_ai_script", 35.0f, 35.0f, 0.0, "btn_cmd_ai_script_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_PLACE_TRAP, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_settrap", "btn_cmd_place_trap", 35.0f, 35.0f, 0.0, "btn_cmd_place_trap_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_BUFF_SHORT, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_cantrips", "btn_buff_short", 35.0f, 35.0f, 0.0, "btn_buff_short_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_BUFF_LONG, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_cast", "btn_buff_long", 35.0f, 35.0f, 0.0, "btn_buff_long_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_BUFF_ALL, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_level789", "btn_buff_all", 35.0f, 35.0f, 0.0, "btn_buff_all_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_BUFF_REST, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_rest", "btn_buff_rest", 35.0f, 35.0f, 0.0, "btn_buff_rest_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_JUMP_TO, oAssociate, sAssociateType)) { string sImage; if(oPC == oAssociate) sImage = "dm_jumpall"; else sImage = "dm_jump"; jRow = CreateButtonImage(jRow, sImage, "btn_jump_to", 35.0f, 35.0f, 0.0, "btn_jump_to_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_GHOST_MODE, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "dm_limbo", "btn_ghost_mode", 35.0f, 35.0f, 0.0, "btn_ghost_mode_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_CAMERA, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_examine", "btn_camera", 35.0f, 35.0f, 0.0, "btn_camera_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_INVENTORY, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_pickup", "btn_inventory", 35.0f, 35.0f, 0.0, "btn_inventory_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_FAMILIAR, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ife_familiar", "btn_familiar", 35.0f, 35.0f, 0.0, "btn_familiar_tooltip"); fButtons += 1.0; } if(ai_GetWidgetButton(oPC, BTN_CMD_COMPANION, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ife_animal", "btn_companion", 35.0f, 35.0f, 0.0, "btn_companion_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_FOR_PC, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "dm_ai", "btn_ai", 35.0f, 35.0f, 0.0, "btn_ai_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_REDUCE_SPEECH, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_movsilent", "btn_quiet", 35.0f, 35.0f, 0.0, "btn_quiet_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_USE_RANGED, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_archer", "btn_ranged", 35.0f, 35.0f, 0.0, "btn_ranged_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_STOP_WEAPON_EQUIP, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "dm_takeitem", "btn_equip_weapon", 35.0f, 35.0f, 0.0, "btn_equip_weapon_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_USE_SEARCH, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_search", "btn_search", 35.0f, 35.0f, 0.0, "btn_search_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_USE_STEALTH, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_hide", "btn_stealth", 35.0f, 35.0f, 0.0, "btn_stealth_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_OPEN_DOORS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_open", "btn_open_door", 35.0f, 35.0f, 0.0, "btn_open_door_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_REMOVE_TRAPS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_distrap", "btn_traps", 35.0f, 35.0f, 0.0, "btn_traps_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_PICK_LOCKS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_olock", "btn_pick_locks", 35.0f, 35.0f, 0.0, "btn_pick_locks_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_BASH_LOCKS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_bash", "btn_bash_locks", 35.0f, 35.0f, 0.0, "btn_bash_locks_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_MAGIC_LEVEL, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "dm_control", "btn_magic_level", 35.0f, 35.0f, 0.0, "btn_magic_level_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_NO_SPONTANEOUS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_xability", "btn_spontaneous", 35.0f, 35.0f, 0.0, "btn_spontaneous_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_USE, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_cntrspell", "btn_magic", 35.0f, 35.0f, 0.0, "btn_magic_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_NO_MAGIC_ITEM_USE, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_moreattacks", "btn_magic_items", 35.0f, 35.0f, 0.0, "btn_magic_items_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_DEF_MAGIC_USE, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_orisons", "btn_def_magic", 35.0f, 35.0f, 0.0, "btn_def_magic_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_OFF_MAGIC_USE, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_metamagic", "btn_off_magic", 35.0f, 35.0f, 0.0, "btn_off_magic_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_HEAL_OUT, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "isk_heal", "btn_heal_out", 35.0f, 35.0f, 0.0, "btn_heal_out_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_HEAL_IN, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "dm_heal", "btn_heal_in", 35.0f, 35.0f, 0.0, "btn_heal_in_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_STOP_SELF_HEALING, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_heal", "btn_heals_onoff", 35.0f, 35.0f, 0.0, "btn_heals_onoff_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_STOP_PARTY_HEALING, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_party", "btn_healp_onoff", 35.0f, 35.0f, 0.0, "btn_healp_onoff_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_STOP_CURE_SPELLS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_accept", "btn_cure_onoff", 35.0f, 35.0f, 0.0, "btn_cure_onoff_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_LOOT, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_barter", "btn_loot", 35.0f, 35.0f, 0.0, "btn_loot_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_IGNORE_ASSOCIATES, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_ignore", "btn_ignore_assoc", 35.0f, 35.0f, 0.0, "btn_ignore_assoc_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_IGNORE_TRAPS, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_abort", "btn_ignore_traps", 35.0f, 35.0f, 0.0, "btn_ignore_traps_tooltip"); fButtons += 1.0; } if(ai_GetAIButton(oPC, BTN_AI_PERC_RANGE, oAssociate, sAssociateType)) { jRow = CreateButtonImage(jRow, "ir_dmchat", "btn_perc_range", 35.0f, 35.0f, 0.0, "btn_perc_range_tooltip"); fButtons += 1.0; } int bIsPC = ai_GetIsCharacter(oAssociate); if(bIsPC) { json jPCPlugins = ai_UpdatePluginsForPC(oPC); // Plug in buttons ***************************************************** int nIndex, bWidget; string sIcon, sButton; json jPlugin = JsonArrayGet(jPCPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { bWidget = JsonGetInt(JsonArrayGet(jPlugin, 1)); if(bWidget == 1) { sIcon = JsonGetString(JsonArrayGet(jPlugin, 3)); sButton = IntToString(nIndex); jRow = CreateButtonImage(jRow, sIcon, "btn_exe_plugin_" + sButton, 35.0f, 35.0f, 0.0, "btn_exe_plugin_" + sButton + "_tooltip"); fButtons += 1.0; } jPlugin = JsonArrayGet(jPCPlugins, ++nIndex); } } float fHeight, fWidth; if(bAIWidgetLock) { fWidth = 50.0f; fHeight = 50.0; } else if(bVertical) { fWidth = 88.0f; fHeight = 55.0f; } else { fWidth = 55.0f; fHeight = 88.0f; } // Quick Widget. int nIndex, nSpell, nLevel, nMetaMagic; float fQuickWidgetColumns; string sClass, sLevel, sIndex; object oItem; json jSpell; json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); json jSpells = JsonArrayGet(jAIData, 10); json jWidget = JsonArrayGet(jSpells, 2); json jCol = JsonArray(); if(ai_GetWidgetButton(oPC, BTN_CMD_SPELL_WIDGET, oAssociate, sAssociateType) && JsonGetLength(jWidget) > 0) { // Row 2 (Widget Row 1)************************************************* if(JsonGetType(jWidget) != JSON_TYPE_NULL) { fQuickWidgetColumns += 1.0; int bAdd; float fSpellButtons; json jButton, jRectangle, jMetaMagic, jDrawList; // Add row to the column. if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); jRow = CreateButtonImage(JsonArray(), "ir_back", "btn_update_widget", 35.0f, 35.0f, 0.0, "btn_update_widget_tooltip"); //CreateLabel(jRow, "", "blank_label", 35.0, 35.0, 0, 0, 0.0); while(nIndex < 10) { bAdd = TRUE; jSpell = JsonArrayGet(jWidget, nIndex); if(JsonGetType(jSpell) != JSON_TYPE_NULL) { if(JsonGetInt(JsonArrayGet(jSpell, 1)) == -1) { oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); if(oItem == OBJECT_INVALID) { bAdd = FALSE; jWidget = JsonArrayDel(jWidget, nIndex--); jSpells = JsonArrayInsert(jSpells, jWidget, 2); jAIData = JsonArrayInsert(jAIData, jSpells, 10); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } } if(bAdd) { sIndex = IntToString(nIndex); jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_widget_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); fSpellButtons += 1.0; } } else break; ++nIndex; } if(fSpellButtons > fButtons) fButtons = fSpellButtons; // Row 3 (Widget Row 2)************************************************* if(nIndex > 9 && JsonGetLength(jWidget) > 10) { fQuickWidgetColumns += 1.0; // Add row to the column. if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); jRow = CreateLabel(JsonArray(), "", "blank_label", 35.0, 35.0, 0, 0, 0.0); while(nIndex < 20) { jSpell = JsonArrayGet(jWidget, nIndex); if(JsonGetType(jSpell) != JSON_TYPE_NULL) { if(JsonGetInt(JsonArrayGet(jSpell, 1)) == -1) { oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); if(oItem == OBJECT_INVALID) { bAdd = FALSE; jWidget = JsonArrayDel(jWidget, nIndex--); jSpells = JsonArrayInsert(jSpells, jWidget, 2); jAIData = JsonArrayInsert(jAIData, jSpells, 10); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } } if(bAdd) { sIndex = IntToString(nIndex); jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_widget_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); fSpellButtons += 1.0; } } else break; ++nIndex; } } } // Add the row to the column. if(nIndex > 0) { if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); } } else { // Add the row to the column. if(bVertical) jCol = JsonArrayInsert(jCol, NuiCol(jRow)); else jCol = JsonArrayInsert(jCol, NuiRow(jRow)); } float fScale = GetPlayerDeviceProperty(oPC, PLAYER_DEVICE_PROPERTY_GUI_SCALE) / 100.0; float fButtonScale; // 1.1 = 2.5 2.0 = 6.0 Ranges we need for scales to work correctly. if(fScale > 1.0) fButtonScale = (fScale - 1.1) / (2.0 - 1.1) * 3.5 + 2.5; else fButtonScale = 1.0; if(fButtons > 0.0f) { if(bVertical) fWidth = fWidth + fButtons * 35.0f + fButtons * fButtonScale; else fWidth = fWidth + fButtons * 35.0f; } if(fQuickWidgetColumns > 0.0f) { if(bVertical) fHeight = fHeight + fQuickWidgetColumns * 39.0f; else fHeight = fHeight + fQuickWidgetColumns * 39.0f + fQuickWidgetColumns * fButtonScale; } // Get the window location to restore it from the database. json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); //SendMessageToPC(oPC, "0i_menu, 2124, sAssociateType: " + sAssociateType + " jLocations: " + JsonDump(jLocations, 1)); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { ai_SetupAssociateData(oPC, oAssociate, sAssociateType); jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); } jLocations = JsonObjectGet(jLocations, sAssociateType + AI_WIDGET_NUI); float fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); float fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); // Keeps the widgets from bunching up in the top corner. if(fY == 0.0 && fX == 0.0) { if(sAssociateType == "pc") fY = 1.0; else if(sAssociateType == "familiar") fY = 96.0 * fScale; else if(sAssociateType == "companion") fY = 192.0 * fScale; else if(sAssociateType == "summons") fY = 288.0 * fScale; else if(sAssociateType == "dominated") fY = 384.0 * fScale; else { int nIndex = 1; string sAssociateName = GetName(oAssociate); while(nIndex < AI_MAX_HENCHMAN) { if(sAssociateName == GetName(GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex))) { fY = (88.0 + 88.0 * IntToFloat(nIndex - 1)); break; } nIndex++; } } fY = fY * fScale; } if(bAIWidgetLock) { fX += 4.0f; // GUI scales are a mess, I just figured them out per scale to keep the widget from moving. if(fScale == 1.0) fY += 37.0; else if(fScale == 1.1) fY += 38.0; else if(fScale == 1.2) fY += 40.0; else if(fScale == 1.3) fY += 42.0; else if(fScale == 1.4) fY += 43.0; else if(fScale == 1.5) fY += 45.0; else if(fScale == 1.6) fY += 47.0; else if(fScale == 1.7) fY += 48.0; else if(fScale == 1.8) fY += 50.0; else if(fScale == 1.9) fY += 52.0; else if(fScale == 2.0) fY += 54.0; } // Set the layout of the window. json jLayout; int nToken, bBool; string sHeal, sText, sRange; string sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; if(bVertical) { jLayout = NuiRow(jCol); if(bAIWidgetLock) nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, "AI Widget", fX, fY, fHeight, fWidth, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui"); else nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, sName + " Widget", fX, fY, fHeight, fWidth, FALSE, FALSE, FALSE, TRUE, TRUE, "0e_nui"); } else { jLayout = NuiCol(jCol); if(bAIWidgetLock) nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, "AI Widget", fX, fY, fWidth, fHeight, FALSE, FALSE, FALSE, TRUE, FALSE, "0e_nui"); else nToken = SetWindow(oPC, jLayout, sAssociateType + AI_WIDGET_NUI, sName + " Widget", fX, fY, fWidth, fHeight, FALSE, FALSE, FALSE, TRUE, TRUE, "0e_nui"); } // Save the associate to the nui. json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); NuiSetUserData(oPC, nToken, jData); ai_SetWidgetBinds(oPC, oAssociate, sAssociateType, nToken, sName); } json ai_CreateLootFilterRow(json jRow, string sLabel, int nIndex) { string sIndex = IntToString(nIndex); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateTextEditBox(jRow, "plc_hold", "txt_gold_" + sIndex, 9, FALSE, 90.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateCheckBox(jRow, sLabel, "chbx_" + sIndex, 200.0, 20.0); return JsonArrayInsert(jRow, NuiSpacer()); } void ai_SetupLootElements(object oPC, object oAssociate, int nToken, int nLootBit, int nIndex) { string sIndex = IntToString(nIndex); int bLoot = ai_GetLootFilter(oAssociate, nLootBit); NuiSetBind(oPC, nToken, "chbx_" + sIndex + "_check", JsonBool(bLoot)); NuiSetBindWatch (oPC, nToken, "chbx_" + sIndex + "_check", TRUE); NuiSetBind(oPC, nToken, "chbx_" + sIndex + "_event", JsonBool(TRUE)); string sGold = IntToString(GetLocalInt(oAssociate, AI_MIN_GOLD_ + sIndex)); NuiSetBind(oPC, nToken, "txt_gold_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_gold_" + sIndex, JsonString(sGold)); NuiSetBindWatch (oPC, nToken, "txt_gold_" + sIndex, TRUE); } void ai_CreateLootFilterNUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); // ************************************************************************* Width / Height // Row 1 ******************************************************************* 318 / 73 int bIsPC = ai_GetIsCharacter(oAssociate); json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateCheckBox(jRow, "Give all loot to the player", "chbx_give_loot", 200.0, 20.0, "chbx_give_loot_tooltip"); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 *************************************************************** 388 / 101 jRow = JsonArray(); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateTextEditBox(jRow, "plc_hold", "txt_max_weight", 9, FALSE, 50.0, 20.0, "txt_max_weight_tooltip"); jRow = CreateLabel(jRow, "Maximum Weight to pickup", "lbl_weight", 200.0, 20.0, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 *************************************************************** 388 / 129 jRow = JsonArray(); jRow = CreateButton(jRow, "Set All", "btn_set_all", 110.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateButton(jRow, "Clear All", "btn_clear_all", 110.0, 20.0); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 4 *************************************************************** 388 / 157 jRow = JsonArray(); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateLabel(jRow, "Minimum Gold", "lbl_min_gold", 100.0, 20.0, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateLabel(jRow, "Items to Pickup", "lbl_pickup", 140.0, 20.0, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 5 *************************************************************** 388 / 185 jRow = ai_CreateLootFilterRow(JsonArray(), "Plot items", 2); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 6 *************************************************************** 388 / 213 jRow = ai_CreateLootFilterRow(JsonArray(), "Armor", 3); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 7 *************************************************************** 388 / 241 jRow = ai_CreateLootFilterRow(JsonArray(), "Belts", 4); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 8 *************************************************************** 388 / 269 jRow = ai_CreateLootFilterRow(JsonArray(), "Boots", 5); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 9 *************************************************************** 388 / 297 jRow = ai_CreateLootFilterRow(JsonArray(), "Cloaks", 6); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 10 *************************************************************** 388 / 325 jRow = ai_CreateLootFilterRow(JsonArray(), "Gems", 7); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 11 *************************************************************** 388 / 353 jRow = ai_CreateLootFilterRow(JsonArray(), "Gloves and Bracers", 8); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 12 *************************************************************** 388 / 381 jRow = ai_CreateLootFilterRow(JsonArray(), "Headgear", 9); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 13 *************************************************************** 388 / 409 jRow = ai_CreateLootFilterRow(JsonArray(), "Jewelry", 10); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 14 *************************************************************** 388 / 437 jRow = ai_CreateLootFilterRow(JsonArray(), "Miscellaneous items", 11); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 15 *************************************************************** 388 / 465 jRow = ai_CreateLootFilterRow(JsonArray(), "Potions", 12); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 16 *************************************************************** 388 / 493 jRow = ai_CreateLootFilterRow(JsonArray(), "Scrolls", 13); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 17 *************************************************************** 388 / 521 jRow = ai_CreateLootFilterRow(JsonArray(), "Shields", 14); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 18 *************************************************************** 388 / 549 jRow = ai_CreateLootFilterRow(JsonArray(), "Wands, Rods, and Staves", 15); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 19 ************************************************************** 388 / 577 jRow = ai_CreateLootFilterRow(JsonArray(), "Weapons", 16); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 20 ************************************************************** 388 / 605 jRow = ai_CreateLootFilterRow(JsonArray(), "Arrows", 17); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 21 ************************************************************** 388 / 633 jRow = ai_CreateLootFilterRow(JsonArray(), "Bolts", 18); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 22 ************************************************************** 388 / 661 jRow = ai_CreateLootFilterRow(JsonArray(), "Bullets", 19); jCol = JsonArrayInsert(jCol, NuiRow(jRow)); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_LOOTFILTER_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } // Set the Layout of the window. json jLayout = NuiCol(jCol); string sText, sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_LOOTFILTER_NUI, sName + " Loot Filter", fX, fY, 318.0, 673.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Save the associate to the nui. json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); NuiSetUserData(oPC, nToken, jData); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Set all binds, events, and watches. // Row 1 int bGiveLoot = ai_GetLootFilter(oAssociate, AI_LOOT_GIVE_TO_PC); NuiSetBind(oPC, nToken, "chbx_give_loot_check", JsonBool (bGiveLoot)); NuiSetBindWatch (oPC, nToken, "chbx_give_loot_check", TRUE); NuiSetBind(oPC, nToken, "chbx_give_loot_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "chbx_give_loot_tooltip", JsonString( " Check this to make henchman give any loot picked up to the player.")); // Row 2 int nWeight = GetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT); if(nWeight == 0) { nWeight = 200; SetLocalInt(oAssociate, AI_MAX_LOOT_WEIGHT, nWeight); } NuiSetBind(oPC, nToken, "txt_max_weight_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_max_weight", JsonString(IntToString(nWeight))); NuiSetBindWatch (oPC, nToken, "txt_max_weight", TRUE); NuiSetBind(oPC, nToken, "txt_max_weight_tooltip", JsonString(" Max weighted item you will pickup from 1 to 1,000")); // Row 3 NuiSetBind(oPC, nToken, "btn_set_all_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_set_all", JsonInt(TRUE)); NuiSetBind(oPC, nToken, "btn_clear_all_event", JsonBool (TRUE)); NuiSetBind(oPC, nToken, "btn_clear_all", JsonInt(TRUE)); // Row 4 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_PLOT, 2); // Row 5 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_ARMOR, 3); // Row 6 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BELTS, 4); // Row 7 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BOOTS, 5); // Row 8 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_CLOAKS, 6); // Row 9 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_GEMS, 7); // Row 10 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_GLOVES, 8); // Row 11 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_HEADGEAR, 9); // Row 12 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_JEWELRY, 10); // Row 13 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_MISC, 11); // Row 14 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_POTIONS, 12); // Row 15 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_SCROLLS, 13); // Row 16 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_SHIELDS, 14); // Row 17 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_WANDS_RODS_STAVES, 15); // Row 18 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_WEAPONS, 16); // Row 19 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_ARROWS, 17); // Row 20 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BOLTS, 18); // Row 21 ai_SetupLootElements(oPC, oAssociate, nToken, AI_LOOT_BULLETS, 19); } void ai_CreateCopySettingsNUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); // ************************************************************************* Width / Height // Row 1 ******************************************************************* 244 / 73 string sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; json jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateLabel(jRow, "Copy settings to", "lbl_paste", 220.0, 20.0, NUI_HALIGN_CENTER); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 ******************************************************************* 244 / 101 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "All Associates", "btn_paste_all", 220.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 2 ******************************************************************* 244 / 129 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "Familiar", "btn_paste_familiar", 220.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 ******************************************************************* 244 / 157 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "Companion", "btn_paste_companion", 220.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 4 ******************************************************************* 244 / 185 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "Summons", "btn_paste_summons", 220.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 5 ******************************************************************* 244 / 213 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "Dominated", "btn_paste_dominated", 220.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 5+ ****************************************************************** 244 / 241 float fHeight = 241.0; int nIndex; string sAssocName; object oAssoc; for(nIndex = 1; nIndex < AI_MAX_HENCHMAN; nIndex++) { oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oAssoc != OBJECT_INVALID) { sAssocName = GetName(oAssoc); if(GetStringRight(sAssocName, 1) == "s") sAssocName = sAssocName + "'"; else sAssocName = sAssocName + "'s"; jRow = CreateButton(JsonArray(), sAssocName, "btn_paste_henchman" + IntToString(nIndex), 220.0, 20.0); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; } else break; } string sAssociateType = ai_GetAssociateType(oPC, oAssociate); // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_COPY_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } // Set the Layout of the window. json jLayout = NuiCol(jCol); int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_COPY_NUI, sName + " Copy Settings Menu", fX, fY, 244.0, fHeight + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Save the associate to the nui. json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); NuiSetUserData(oPC, nToken, jData); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Set all binds, events, and watches. // Row 1 NuiSetBind(oPC, nToken, "btn_paste_all_event", JsonBool (TRUE)); oAssoc = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); NuiSetBind(oPC, nToken, "btn_paste_familiar_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); oAssoc = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); NuiSetBind(oPC, nToken, "btn_paste_companion_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); NuiSetBind(oPC, nToken, "btn_paste_summons_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); oAssoc = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); NuiSetBind(oPC, nToken, "btn_paste_dominated_event", JsonBool(oAssoc != oAssociate && oAssoc != OBJECT_INVALID)); for(nIndex = 1; nIndex < AI_MAX_HENCHMAN; nIndex++) { oAssoc = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex); if(oAssoc != OBJECT_INVALID) { NuiSetBind(oPC, nToken, "btn_paste_henchman" + IntToString(nIndex) + "_event", JsonBool(oAssoc != oAssociate)); } else break; } } void ai_CreatePluginNUI(object oPC) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); int nIndex, nButton; string sButton; // Row 1 ******************************************************************* 500 / 73 json jRow = CreateButton(JsonArray(), "Load Plugins", "btn_load_plugins", 150.0f, 20.0f, -1.0, "btn_load_plugins_tooltip"); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateButton(jRow, "Load Monster Mods", "btn_load_m_mods", 150.0f, 20.0f, -1.0, "btn_load_m_mods_tooltip"); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateButton(jRow, "Check All", "btn_check_plugins", 80.0f, 20.0f, -1.0, "btn_check_plugins_tooltip"); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateButton(jRow, "Clear All", "btn_clear_plugins", 80.0f, 20.0f, -1.0, "btn_clear_plugins_tooltip"); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 ******************************************************************* 500 / 101 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "Add Plugin", "btn_add_plugin", 150.0f, 20.0f); jRow = JsonArrayInsert(jRow, NuiSpacer()); jRow = CreateTextEditBox(jRow, "sPlaceHolder", "txt_plugin", 16, FALSE, 310.0f, 20.0f, "txt_plugin_tooltip"); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); float fHeight = 101.0; // Row 3+ ****************************************************************** 500 / --- json jPlugins = ai_GetAssociateDbJson(oPC, "pc", "plugins"); nIndex = 0; json jPlugin = JsonArrayGet(jPlugins, nIndex); string sName; while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { sButton = IntToString(nIndex); jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "Remove Plugin", "btn_remove_plugin_" + sButton, 150.0f, 20.0f); jRow = JsonArrayInsert(jRow, NuiSpacer()); sName = JsonGetString(JsonArrayGet(jPlugin, 2)); jRow = CreateButton(jRow, sName, "btn_plugin_" + sButton, 290.0f, 20.0f, -1.0, "btn_plugin_" + sButton + "_tooltip"); jRow = CreateCheckBox(jRow, "", "chbx_plugin_" + sButton, 25.0, 20.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); fHeight += 28.0; jPlugin = JsonArrayGet(jPlugins, ++nIndex); } // Get the window location to restore it from the database. json jLocations = ai_GetAssociateDbJson(oPC, "pc", "locations"); float fX, fY; jLocations = JsonObjectGet(jLocations, AI_PLUGIN_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } // Set the Layout of the window. json jLayout = NuiCol(jCol); sName = GetName(oPC); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int nToken = SetWindow(oPC, jLayout, AI_PLUGIN_NUI, sName + " PEPS Plugin Manager", fX, fY, 500.0f, fHeight + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Save the associate to the nui for use in 0e_nui json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oPC))); NuiSetUserData(oPC, nToken, jData); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Row 1 NuiSetBind(oPC, nToken, "btn_load_plugins_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_load_plugins_tooltip", JsonString(" Load all known PEPS plugins that are in the game files.")); NuiSetBind(oPC, nToken, "btn_load_m_mods_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_load_m_mods_tooltip", JsonString(" Load all known PEPS monster mods that are in the game files.")); NuiSetBind(oPC, nToken, "btn_check_plugins_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_check_plugins_tooltip", JsonString(" Add all plugins to the players widget.")); NuiSetBind(oPC, nToken, "btn_clear_plugins_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_clear_plugins_tooltip", JsonString(" Remove all plugins from the players widget.")); // Row 2 NuiSetBind(oPC, nToken, "btn_add_plugin_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_plugin_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "txt_plugin_tooltip", JsonString(" Enter an executable script name.")); // Row 3+ nIndex = 0; int bCheck; string sText; jPlugin = JsonArrayGet(jPlugins, nIndex); while(JsonGetType(jPlugin) != JSON_TYPE_NULL) { sButton = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_remove_plugin_" + sButton + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_event", JsonBool(TRUE)); bCheck = JsonGetInt(JsonArrayGet(jPlugin, 1)); if(bCheck < 3) { NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_check", JsonBool(bCheck)); NuiSetBind(oPC, nToken, "chbx_plugin_" + sButton + "_event", JsonBool(TRUE)); NuiSetBindWatch (oPC, nToken, "chbx_plugin_" + sButton + "_check", TRUE); } sText = " " + JsonGetString(JsonArrayGet(jPlugin, 2)); NuiSetBind(oPC, nToken, "btn_plugin_" + sButton + "_tooltip", JsonString(sText)); jPlugin = JsonArrayGet(jPlugins, ++nIndex); } } int ai_SpellNotInList(int nSpell, json jSpellArray) { int nMaxArray = JsonGetLength(jSpellArray); int nIndex; while(nIndex < nMaxArray) { if(nSpell == JsonGetInt(JsonArrayGet(JsonArrayGet(jSpellArray, nIndex), 0))) return FALSE; nIndex++; } return TRUE; } json ai_CheckItemAbilities(json jQuickListArray, object oCreature, object oItem, json jSpell_Icon, json jSpell_Text, int bEquiped = FALSE) { // We have established that we can use the item if it is equiped. if(!bEquiped && !ai_CheckIfCanUseItem(oCreature, oItem)) return jQuickListArray; int nPerDay, nCharges, nUses, bSaveTalent, nBaseItemType; int nIprpSubType, nSpell, nLevel, nIPType, nIndex; string sSpellIcon, sSpellName; itemproperty ipProp = GetFirstItemProperty(oItem); json jSpell; // Lets skip this if there are no properties. if(!GetIsItemPropertyValid(ipProp)) return jQuickListArray; // Check for cast spell property and add them to the talent list. while(GetIsItemPropertyValid(ipProp)) { nIPType = GetItemPropertyType(ipProp); if(nIPType == ITEM_PROPERTY_CAST_SPELL) { bSaveTalent = TRUE; // Get how they use the item (charges or uses per day). nUses = GetItemPropertyCostTableValue(ipProp); if(nUses > 1 && nUses < 7) { nCharges = GetItemCharges(oItem); if((nUses == IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE && nCharges < 1) || (nUses == IP_CONST_CASTSPELL_NUMUSES_2_CHARGES_PER_USE && nCharges < 2) || (nUses == IP_CONST_CASTSPELL_NUMUSES_3_CHARGES_PER_USE && nCharges < 3) || (nUses == IP_CONST_CASTSPELL_NUMUSES_4_CHARGES_PER_USE && nCharges < 4) || (nUses == IP_CONST_CASTSPELL_NUMUSES_5_CHARGES_PER_USE && nCharges < 5)) bSaveTalent = FALSE; } else if(nUses > 7 && nUses < 13) { nPerDay = GetItemPropertyUsesPerDayRemaining(oItem, ipProp); if(AI_DEBUG) ai_Debug("0i_talents", "1676", "Item uses: " + IntToString(nPerDay)); if(nPerDay == 0) bSaveTalent = FALSE; } if(bSaveTalent) { // SubType is the ip spell index for iprp_spells.2da nIprpSubType = GetItemPropertySubType(ipProp); nSpell = StringToInt(Get2DAString("iprp_spells", "SpellIndex", nIprpSubType)); nBaseItemType = GetBaseItemType(oItem); if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || nBaseItemType == BASE_ITEM_SCROLL || nBaseItemType == BASE_ITEM_SPELLSCROLL) { sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); sSpellName = ai_StripColorCodes(GetName(oItem)); nUses = GetNumStackedItems(oItem); } else { if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || nBaseItemType == BASE_ITEM_POTIONS) { sSpellName = ai_StripColorCodes(GetName(oItem)); nUses = GetNumStackedItems(oItem); } else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || nBaseItemType == BASE_ITEM_MAGICWAND || nBaseItemType == FEAT_CRAFT_WAND) { sSpellName = ai_StripColorCodes(GetName(oItem)); nUses = nCharges; } else { sSpellName = ai_StripColorCodes(GetName(oItem)) + ": "; sSpellName += GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); if(nCharges) nUses = nCharges; else nUses = nPerDay; } sSpellIcon = Get2DAString("spells", "iConResRef", nSpell); } jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); jSpell = JsonArrayInsert(jSpell, JsonInt(-1)); // Class is set to -1 for items jSpell = JsonArrayInsert(jSpell, JsonInt(nUses)); jSpell = JsonArrayInsert(jSpell, JsonInt(nBaseItemType)); jSpell = JsonArrayInsert(jSpell, JsonInt(nIprpSubType)); jSpell = JsonArrayInsert(jSpell, JsonString(GetObjectUUID(oItem))); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); } } else if(nIPType == ITEM_PROPERTY_HEALERS_KIT) { // Must also have ranks in healing kits. if(GetSkillRank(SKILL_HEAL, oCreature) > 0) { jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString("isk_heal")); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(ai_StripColorCodes(GetName(oItem)))); json jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(SPELL_HEALINGKIT)); jSpell = JsonArrayInsert(jSpell, JsonInt(-1)); // Class is set to -1 for items jSpell = JsonArrayInsert(jSpell, JsonInt(GetNumStackedItems(oItem))); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jSpell = JsonArrayInsert(jSpell, JsonInt(GetItemPropertyCostTableValue(ipProp))); jSpell = JsonArrayInsert(jSpell, JsonString(GetObjectUUID(oItem))); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); } } nIndex++; ipProp = GetNextItemProperty(oItem); } SetLocalJson(oCreature, "JSPELL_ICON", jSpell_Icon); SetLocalJson(oCreature, "JSPELL_NAME", jSpell_Text); return jQuickListArray; } void ai_CreateQuickWidgetSelectionNUI(object oPC, object oAssociate) { string sAssociateType = ai_GetAssociateType(oPC, oAssociate); // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); json jRow = JsonArray(); // Row 1 Classes************************************************************ 414 / 88 int nClass, nLevel, nIndex; string sIndex, sClassIcon, sLevelIcon; for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClass = GetClassByPosition(nIndex, oAssociate); if(nClass != CLASS_TYPE_INVALID) { // This saves the class position in the button id so we can get it later. sIndex = IntToString(nIndex); sClassIcon = Get2DAString("classes", "Icon", nClass); jRow = CreateButtonImage(jRow, sClassIcon, "btn_class_" + sIndex, 35.0f, 35.0f, 0.0, "btn_class_" + sIndex + "_tooltip"); } } jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 (Levels) ********************************************************** 414 / 131 jRow = CreateButtonImage(JsonArray(), "", "btn_level_11" , 35.0f, 35.0f, 0.0, "btn_level_11_tooltip"); jRow = CreateButtonImage(jRow, "", "btn_level_10" , 35.0f, 35.0f, 0.0, "btn_level_10_tooltip"); for(nIndex = 0; nIndex <= 9; nIndex++) { // This saves the level in the button id so we can get it later. sIndex = IntToString(nIndex); jRow = CreateButtonImage(jRow, "", "btn_level_" + sIndex, 35.0f, 35.0f, 0.0, "btn_level_" + sIndex + "_tooltip"); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 (Spell List)******************************************************* 414 / 433 json jButton = JsonArray(); jButton = NuiButton(NuiBind("text_spell")); jButton = NuiId(jButton, "btn_text_spell"); json jRectangle = NuiRect(4.0, 4.0, 27.0, 27.0); json jDrawList = JsonArrayInsert(JsonArray(), NuiDrawListImage(JsonBool(TRUE), NuiBind("icon_spell"), jRectangle, JsonInt(NUI_ASPECT_FILL), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE))); jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_text")); jDrawList = JsonArrayInsert(jDrawList, jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); json jListTemplate = JsonArrayInsert(JsonArray(), NuiListTemplateCell(jButton, 345.0, FALSE)); json jInfo = NuiButtonImage(JsonString("gui_cg_qstn_mark")); jInfo = NuiId(jInfo, "btn_info_spell"); jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jInfo, 35.0, FALSE)); jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiList(jListTemplate, NuiBind("icon_spell"), 35.0), 282.0)); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 4 (Widget Label)***************************************************** 414 / 461 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateLabel(jRow, "Quick Widget List", "lbl_quick_list", 150.0, 20.0, 0, 0, 0.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 5 (Widget row 1)***************************************************** 414 / 504 jRow = JsonArray(); for(nIndex = 0; nIndex < 10; nIndex++) { // This saves the index location in the json jWidget in the button id for later use. sIndex = IntToString(nIndex); json jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_widget_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 6 (Widget row 2)***************************************************** 414 / 543 jRow = JsonArray(); for(nIndex = 10; nIndex < 20; nIndex++) { // This saves the index location in the json jWidget in the button id for later use. sIndex = IntToString(nIndex); json jButton = NuiButtonImage(NuiBind("btn_widget_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_widget_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_widget_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_widget_" + sIndex + "_tooltip")); json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_QUICK_WIDGET_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } // Set the Layout of the window. json jLayout = NuiCol(jCol); string sText, sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_QUICK_WIDGET_NUI, sName + " Quick Widget Menu", fX, fY, 414.0, 543.0 + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Set the Layout of the window. // Save the associate to the nui for use in 0e_nui json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); json jSpells; json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); // Temporary fix for error! :/ if(JsonGetLength(jAIData) == 0) { ai_CheckAssociateData(oPC, oAssociate, sAssociateType, TRUE); jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(10)); jAIData = JsonArrayInsert(jAIData, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); nLevel = 10; } if(JsonGetLength(jAIData) == 9) { jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(10)); jSpells = JsonArrayInsert(jSpells, JsonArray()); jAIData = JsonArrayInsert(jAIData, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); nLevel = 10; } else { jSpells = JsonArrayGet(jAIData, 10); if(JsonGetLength(jSpells) == 0) { jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(10)); jSpells = JsonArrayInsert(jSpells, JsonArray()); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); nLevel = 10; } else { nClass = JsonGetInt(JsonArrayGet(jSpells, 0)); nLevel = JsonGetInt(JsonArrayGet(jSpells, 1)); } } if(nClass < 1 || nClass > AI_MAX_CLASSES_PER_CHARACTER) nClass = 1; nClass = GetClassByPosition(nClass, oAssociate); // Row 1 & 2 Class & Level int nSpellLevel, nLevelIndex, nClassIndex, nMaxSpellLevel; string sClass, sLevel, sLevelImage, sLevelIndex; NuiSetBind(oPC, nToken, "btn_level_11_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_11_tooltip", JsonString(" Item Powers")); NuiSetBind(oPC, nToken, "btn_level_11_image", JsonString("ir_attack")); NuiSetBind(oPC, nToken, "btn_level_10_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_10_tooltip", JsonString(" Special Abilities")); NuiSetBind(oPC, nToken, "btn_level_10_image", JsonString("dm_god")); for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClassIndex = GetClassByPosition(nIndex, oAssociate); if(nClassIndex != CLASS_TYPE_INVALID) { sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClassIndex))); sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_tooltip", JsonString(" " + sClass)); if(nClass == nClassIndex) { if(StringToInt(Get2DAString("classes", "SpellCaster", nClass))) { int nClassLevel = GetLevelByClass(nClass, oAssociate); string sSpellsGained = Get2DAString("classes", "SpellGainTable", nClass); int nMaxSpellLevel = StringToInt(Get2DAString(sSpellsGained, "NumSpellLevels", nClassLevel - 1)); for(nLevelIndex = 0; nLevelIndex <= 9; nLevelIndex++) { sLevelIndex = IntToString(nLevelIndex); if(nLevelIndex < nMaxSpellLevel) { NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(TRUE)); if(nLevelIndex == 0) sLevelImage = "ir_cantrips"; else if(nLevelIndex < 7)sLevelImage = "ir_level" + sLevelIndex; else sLevelImage = "ir_level789"; NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_image", JsonString(sLevelImage)); if(nLevelIndex == 0) sLevel = " Cantrips"; else if(nLevelIndex == 1) sLevel = " First level"; else if(nLevelIndex == 2) sLevel = " Second level"; else if(nLevelIndex == 3) sLevel = " Third level"; else if(nLevelIndex == 4) sLevel = " Fourth level"; else if(nLevelIndex == 5) sLevel = " Fifth level"; else if(nLevelIndex == 6) sLevel = " Sixth level"; else if(nLevelIndex == 7) sLevel = " Seventh level"; else if(nLevelIndex == 8) sLevel = " Eighth level"; else if(nLevelIndex == 9) sLevel = " Ninth level"; NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_tooltip", JsonString(" " + sLevel)); } else { NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(FALSE)); } } NuiSetBind(oPC, nToken, "btn_level_" + IntToString(nLevel) + "_encouraged", JsonBool(TRUE)); } // Default to the abilities tab since they are not a caster. else { if(nLevel < 10) nLevel = 10; for(nLevelIndex = 0; nLevelIndex <= 9; nLevelIndex++) { sLevelIndex = IntToString(nLevelIndex); NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "btn_level_" + sLevelIndex + "_event", JsonBool(FALSE)); } NuiSetBind(oPC, nToken, "btn_level_10_encouraged", JsonBool(TRUE)); } NuiSetBind(oPC, nToken, "btn_class_" + IntToString(nClass) + "_encouraged", JsonBool(TRUE)); } } } // Row 3 Items/Abilities/Skills/Spells int nSpell, nMetaMagic, nDomain, nSubSpell, nSubSpellIndex; int nSpellSlot, nCounter, nMax2daRow, nFeat; string sSpellIcon, sSpellName, sMetaMagicText, sClassFeats, sSubSpellIndex; object oItem; json jQuickListArray = JsonArray(); json jSpell; json jSpell_Icon = JsonArray(); json jSpell_Text = JsonArray(); SetLocalJson(oAssociate, "JSPELL_ICON", jSpell_Icon); SetLocalJson(oAssociate, "JSPELL_NAME", jSpell_Text); json jMetaMagic_Text = JsonArray(); // Item powers if(nLevel == 11) { string sSlots; // Cycle through all the creatures inventory items. oItem = GetFirstItemInInventory(oAssociate); while(oItem != OBJECT_INVALID) { if(GetIdentified(oItem)) { // Does the item need to be equiped to use its powers? sSlots = Get2DAString("baseitems", "EquipableSlots", GetBaseItemType(oItem)); if(sSlots == "0x00000") { jQuickListArray = ai_CheckItemAbilities(jQuickListArray, oAssociate, oItem, jSpell_Icon, jSpell_Text, FALSE); jSpell_Icon = GetLocalJson(oAssociate, "JSPELL_ICON"); jSpell_Text = GetLocalJson(oAssociate, "JSPELL_NAME"); WriteTimestampedLogEntry("0i_menus, 3643, oAssociate: " + GetName(oAssociate) + " jSpell_Text: " + JsonDump(jSpell_Text, 4)); } } oItem = GetNextItemInInventory(oAssociate); } int nSlot; // Cycle through all the creatures equiped items. oItem = GetItemInSlot(nSlot, oAssociate); while(nSlot < 11) { if(oItem != OBJECT_INVALID) { jQuickListArray = ai_CheckItemAbilities(jQuickListArray, oAssociate, oItem, jSpell_Icon, jSpell_Text, TRUE); jSpell_Icon = GetLocalJson(oAssociate, "JSPELL_ICON"); jSpell_Text = GetLocalJson(oAssociate, "JSPELL_NAME"); } oItem = GetItemInSlot(++nSlot, oAssociate); } oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oAssociate); if(oItem != OBJECT_INVALID) { jQuickListArray = ai_CheckItemAbilities(jQuickListArray, oAssociate, oItem, jSpell_Icon, jSpell_Text, TRUE); jSpell_Icon = GetLocalJson(oAssociate, "JSPELL_ICON"); jSpell_Text = GetLocalJson(oAssociate, "JSPELL_NAME"); } DeleteLocalJson(oAssociate, "JSPELL_ICON"); DeleteLocalJson(oAssociate, "JSPELL_NAME"); } // Special abilities and skills. else if(nLevel == 10) { for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClassIndex = GetClassByPosition(nIndex, oAssociate); if(nClassIndex != CLASS_TYPE_INVALID) { nCounter = 0; sClassFeats = Get2DAString("classes", "FeatsTable", nClassIndex); nMax2daRow = Get2DARowCount(sClassFeats); while(nCounter < nMax2daRow) { if(Get2DAString(sClassFeats, "OnMenu", nCounter) != "0") { nFeat = StringToInt(Get2DAString(sClassFeats, "FeatIndex", nCounter)); if(GetHasFeat(nFeat, oAssociate, TRUE)) { // Check for subfeats. nSpell = StringToInt(Get2DAString("feat", "SPELLID", nFeat)); nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell1", nSpell)); //SendMessageToPC(oPC, "nFeat: " + IntToString(nFeat) + // " nSpell: " + IntToString(nSpell) + // " nSubSpell: " + IntToString(nSubSpell)); if(nSubSpell) { for(nSubSpellIndex = 1; nSubSpellIndex <= 5; nSubSpellIndex++) { sSubSpellIndex = IntToString(nSubSpellIndex); nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell" + sSubSpellIndex, nSpell)); //SendMessageToPC(oPC, " nSpell: " + IntToString(nSpell) + // " nSubSpell: " + IntToString(nSubSpell)); if(nSubSpell != 0) { sSpellIcon = Get2DAString("spells", "iConResRef", nSubSpell); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSubSpell))); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(nSubSpell)); jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jSpell = JsonArrayInsert(jSpell, JsonInt(255)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jSpell = JsonArrayInsert(jSpell, JsonInt(nFeat)); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); } } } else if((nFeat < 71 || nFeat > 81)) { sSpellIcon = Get2DAString("feat", "ICON", nFeat); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jSpell = JsonArrayInsert(jSpell, JsonInt(255)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jSpell = JsonArrayInsert(jSpell, JsonInt(nFeat)); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); } } } nCounter++; } } } // Used in the execution script to get the special abilities. //jData = JsonArrayInsert(jData, jQuickListArray); } else // Anything else is for spells. { // Search all memorized spells for the spell. //SendMessageToPC(oPC, GetName(oAssociate) + " nClass: " + IntToString(nClass) + // " nLevelSelected: " + IntToString(nLevel) + // " nMemorizesSpells: " + Get2DAString("classes", "MemorizesSpells", nClass)); if(Get2DAString("classes", "MemorizesSpells", nClass) == "1") { int nMaxSlot = GetMemorizedSpellCountByLevel(oAssociate, nClass, nLevel); while(nSpellSlot < nMaxSlot) { nSpell = GetMemorizedSpellId(oAssociate, nClass, nLevel, nSpellSlot); if(nSpell != -1 && ai_SpellNotInList(nSpell, jQuickListArray)) { nMetaMagic = GetMemorizedSpellMetaMagic(oAssociate, nClass, nLevel, nSpellSlot); nDomain = GetMemorizedSpellIsDomainSpell(oAssociate, nClass, nLevel, nSpellSlot); // Check for subspells. nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell1", nSpell)); if(nSubSpell) { for(nSubSpellIndex = 1; nSubSpellIndex < 6; nSubSpellIndex++) { sSubSpellIndex = IntToString(nSubSpellIndex); nSubSpell = StringToInt(Get2DAString("spells", "SubRadSpell" + sSubSpellIndex, nSpell)); if(nSubSpell && ai_SpellNotInList(nSubSpell, jQuickListArray)) { sSpellIcon = Get2DAString("spells", "IconResRef", nSubSpell); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSubSpell))); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); jMetaMagic_Text = JsonArrayInsert(jMetaMagic_Text, JsonString(sMetaMagicText)); jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(nSubSpell)); jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); jSpell = JsonArrayInsert(jSpell, JsonInt(nMetaMagic)); jSpell = JsonArrayInsert(jSpell, JsonInt(nDomain)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); } } } else { sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); jMetaMagic_Text = JsonArrayInsert(jMetaMagic_Text, JsonString(sMetaMagicText)); jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); jSpell = JsonArrayInsert(jSpell, JsonInt(nMetaMagic)); jSpell = JsonArrayInsert(jSpell, JsonInt(nDomain)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); //SendMessageToPC(oPC, "nSpell: " + IntToString(nSpell) + // " sSpellIcon: " + sSpellIcon + // " sSpellName: " + sSpellName+ // " nMaxSlot: " + IntToString(nMaxSlot) + // " nSpellSlot: " + IntToString(nSpellSlot)); } } ++nSpellSlot; } } // Non-memorized spells. else { int nMaxSlot = GetKnownSpellCount(oAssociate, nClass, nLevel); while(nSpellSlot < nMaxSlot) { nSpell = GetKnownSpellId(oAssociate, nClass, nLevel, nSpellSlot); if(nSpell != -1)// && ai_SpellNotInList(nSpell, jQuickListArray)) { sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); jSpell = JsonArray(); jSpell = JsonArrayInsert(jSpell, JsonInt(nSpell)); jSpell = JsonArrayInsert(jSpell, JsonInt(nClass)); jSpell = JsonArrayInsert(jSpell, JsonInt(nLevel)); jSpell = JsonArrayInsert(jSpell, JsonInt(255)); jSpell = JsonArrayInsert(jSpell, JsonInt(0)); jQuickListArray = JsonArrayInsert(jQuickListArray, jSpell); } ++nSpellSlot; } } } NuiSetBind(oPC, nToken, "icon_spell", jSpell_Icon); NuiSetBind(oPC, nToken, "text_spell", jSpell_Text); NuiSetBind(oPC, nToken, "metamagic_text", jMetaMagic_Text); jData = JsonArrayInsert(jData, jQuickListArray); NuiSetUserData(oPC, nToken, jData); // Row 4 Quick widget list label. // Row 5 Quick widget List 1 json jWidget = JsonArrayGet(jSpells, 2); nIndex = 0; while(nIndex < 10) { jSpell = JsonArrayGet(jWidget, nIndex); sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); if(JsonGetType(jSpell) != JSON_TYPE_NULL) { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); if(nClass == -1) // This is an Item. { string sBaseName; sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); if(nSpell == SPELL_HEALINGKIT) { sName = "Healer's Kit +" + IntToString(nIprpSubType); sSpellIcon = "isk_heal"; sBaseName = "Healer's Kit"; } else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || nBaseItemType == BASE_ITEM_SCROLL || nBaseItemType == BASE_ITEM_SPELLSCROLL) { sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); sBaseName = "Scroll"; } else { if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || nBaseItemType == BASE_ITEM_MAGICWAND || nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); int nUses = ai_GetItemUses(oItem, nIprpSubType); if(nUses) { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); if(nUses == 999) sText = "Unlimited"; else sText = IntToString(nUses); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); } } else if(nFeat) // This is a feat. { sSpellIcon = ""; if(nSpell) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } if(sSpellIcon == "" || sSpellIcon == "IR_USE") { sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); sSpellIcon = Get2DAString("feat", "ICON", nFeat); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); } else // This is a spell. { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); nDomain = JsonGetInt(JsonArrayGet(jSpell, 4)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); } } else { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } ++nIndex; } if(nIndex < 10) return; // Row 6 Quick widget List2 while(nIndex < 20) { jSpell = JsonArrayGet(jWidget, nIndex); sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); if(JsonGetType(jSpell) != JSON_TYPE_NULL) { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); if(nClass == -1) // This is an Item. { string sBaseName; sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); int nBaseItemType = JsonGetInt(JsonArrayGet(jSpell, 3)); int nIprpSubType = JsonGetInt(JsonArrayGet(jSpell, 4)); if(nSpell == SPELL_HEALINGKIT) { sName = "Healer's Kit +" + IntToString(nIprpSubType); sSpellIcon = "isk_heal"; sBaseName = "Healer's Kit"; } else if(nBaseItemType == BASE_ITEM_ENCHANTED_SCROLL || nBaseItemType == BASE_ITEM_SCROLL || nBaseItemType == BASE_ITEM_SPELLSCROLL) { sSpellIcon = Get2DAString("iprp_spells", "Icon", nIprpSubType); sBaseName = "Scroll"; } else { if(nBaseItemType == BASE_ITEM_ENCHANTED_POTION || nBaseItemType == BASE_ITEM_POTIONS) sBaseName = "Potion"; else if(nBaseItemType == BASE_ITEM_ENCHANTED_WAND || nBaseItemType == BASE_ITEM_MAGICWAND || nBaseItemType == FEAT_CRAFT_WAND) sBaseName = "Wand"; else sBaseName = ai_StripColorCodes(GetName(GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); int nUses = ai_GetItemUses(oItem, nIprpSubType); if(nUses) { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(TRUE)); if(nUses == 999) sText = "Unlimited"; else sText = IntToString(nUses); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sBaseName + " / " + sText + ")")); } } else if(nFeat) // This is a feat. { sSpellIcon = ""; if(nSpell) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); } if(sSpellIcon == "" || sSpellIcon == "IR_USE") { sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); sSpellIcon = Get2DAString("feat", "ICON", nFeat); } NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName)); } else // This is a spell. { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); nLevel = JsonGetInt(JsonArrayGet(jSpell, 2)); nMetaMagic = JsonGetInt(JsonArrayGet(jSpell, 3)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevel) + ")")); sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nMetaMagic, nDomain); NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); } } else { NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); NuiSetBind(oPC, nToken, "btn_widget_" + sIndex + "_event", JsonBool(FALSE)); } ++nIndex; } } void ai_CreateSpellMemorizationNUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); json jRow = JsonArray(); // Row 1 Classes************************************************************ 414 / 73 int nClass, bCaster, nIndex; string sIndex, sClassIcon, sLevelIcon; for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClass = GetClassByPosition(nIndex, oAssociate); if(nClass != CLASS_TYPE_INVALID) { if(StringToInt(Get2DAString("classes", "MemorizesSpells", nClass))) { // This saves the class position in the button id so we can get it later. sIndex = IntToString(nIndex); sClassIcon = Get2DAString("classes", "Icon", nClass); jRow = CreateButtonImage(jRow, sClassIcon, "btn_class_" + sIndex, 35.0f, 35.0f, 0.0, "btn_class_" + sIndex + "_tooltip"); } } } jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 (Levels) ********************************************************** 414 / 116 jRow = JsonArray(); for(nIndex = 0; nIndex <= 9; nIndex++) { // This saves the level in the button id so we can get it later. sIndex = IntToString(nIndex); jRow = CreateButtonImage(jRow, "", "btn_level_" + sIndex, 35.0f, 35.0f, 0.0, "btn_level_" + sIndex + "_tooltip"); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 (Spell List)******************************************************* 414 / 398 json jButton = JsonArray(); jButton = NuiButton(NuiBind("text_spell")); jButton = NuiId(jButton, "btn_text_spell"); json jRectangle = NuiRect(4.0, 4.0, 27.0, 27.0); json jDrawList = JsonArrayInsert(JsonArray(), NuiDrawListImage(JsonBool(TRUE), NuiBind("icon_spell"), jRectangle, JsonInt(NUI_ASPECT_FILL), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE))); //jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_text")); //jDrawList = JsonArrayInsert(jDrawList, jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); json jListTemplate = JsonArrayInsert(JsonArray(), NuiListTemplateCell(jButton, 275.0, FALSE)); json jInfo = NuiButtonImage(JsonString("gui_cg_qstn_mark")); jInfo = NuiId(jInfo, "btn_info_spell"); jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jInfo, 35.0, FALSE)); jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiList(jListTemplate, NuiBind("icon_spell"), 35.0), 282.0)); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 4 (Widget Label)***************************************************** 414 / 426 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); CreateLabel(jRow, "Memorized Spell List", "lbl_spell_list", 150.0, 20.0, 0, 0, 0.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 5 (Memorize slots)*************************************************** 414 / 469 // Get the class and level selected from the database. int nClassSelected, nLevelSelected; json jSpells; json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); // Temporary fix for error! :/ if(JsonGetLength(jAIData) == 0) { ai_CheckAssociateData(oPC, oAssociate, sAssociateType, TRUE); jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); } if(JsonGetLength(jAIData) == 9) { jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(0)); jAIData = JsonArrayInsert(jAIData, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } else { jSpells = JsonArrayGet(jAIData, 10); if(JsonGetType(jSpells) == JSON_TYPE_NULL) { jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(0)); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } else { nClassSelected = JsonGetInt(JsonArrayGet(jSpells, 0)); nLevelSelected = JsonGetInt(JsonArrayGet(jSpells, 1)); } } // If we left the Quick Use widget on Special Abilities (10) or Items (11) goto level 0 if(nLevelSelected == 10 || nLevelSelected == 11) { nLevelSelected = 0; jSpells = JsonArraySet(jSpells, 1, JsonInt(0)); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } if(nClassSelected < 1 || nClassSelected > AI_MAX_CLASSES_PER_CHARACTER) nClassSelected = 1; nClass = GetClassByPosition(nClassSelected, oAssociate); int nMaxMemorizationSlots = GetMemorizedSpellCountByLevel(oAssociate, nClass, nLevelSelected); jRow = JsonArray(); for(nIndex = 0; nIndex < nMaxMemorizationSlots; nIndex++) { // This saves the index location of the spell in the list. sIndex = IntToString(nIndex); json jButton = NuiButtonImage(NuiBind("btn_memorized_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_memorized_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_memorized_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_memorized_" + sIndex + "_tooltip")); //json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); //jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); //jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_SPELL_MEMORIZE_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } string sText, sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; // Set the Layout of the window. json jLayout = NuiCol(jCol); int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_SPELL_MEMORIZE_NUI, sName + " Spell Memorization Menu", fX, fY, 375.0, 504.0 + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Set the Layout of the window. // Save the associate to the nui for use in 0e_nui json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Row 1 & 2 Class & Level int nSpellLevel, nIndexLevel, nMaxSpellLevel; string sClass, sLevel, sLevelImage, sIndexLevel; for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClass = GetClassByPosition(nIndex, oAssociate); if(nClass != CLASS_TYPE_INVALID) { bCaster = StringToInt(Get2DAString("classes", "SpellCaster", nClass)); if(bCaster) { sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_tooltip", JsonString(" " + sClass)); if(nClassSelected == nIndex) { int nClassLevel = GetLevelByClass(nClass, oAssociate); string sSpellsGained = Get2DAString("classes", "SpellGainTable", nClass); int nMaxSpellLevel = StringToInt(Get2DAString(sSpellsGained, "NumSpellLevels", nClassLevel - 1)); for(nIndexLevel = 0; nIndexLevel <= 9; nIndexLevel++) { sIndexLevel = IntToString(nIndexLevel); if(nIndexLevel < nMaxSpellLevel) { if(nIndexLevel == 0) sLevelImage = "ir_cantrips"; else if(nIndexLevel < 7)sLevelImage = "ir_level" + sIndexLevel; else sLevelImage = "ir_level789"; if(nIndexLevel == 0) sLevel = " Cantrips"; else if(nIndexLevel == 1) sLevel = " First level"; else if(nIndexLevel == 2) sLevel = " Second level"; else if(nIndexLevel == 3) sLevel = " Third level"; else if(nIndexLevel == 4) sLevel = " Fourth level"; else if(nIndexLevel == 5) sLevel = " Fifth level"; else if(nIndexLevel == 6) sLevel = " Sixth level"; else if(nIndexLevel == 7) sLevel = " Seventh level"; else if(nIndexLevel == 8) sLevel = " Eighth level"; else if(nIndexLevel == 9) sLevel = " Ninth level"; NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_tooltip", JsonString(" " + sLevel)); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString(sLevelImage)); } else { NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(FALSE)); } } NuiSetBind(oPC, nToken, "btn_level_" + IntToString(nLevelSelected) + "_encouraged", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_class_" + IntToString(nClassSelected) + "_encouraged", JsonBool(TRUE)); } } } } // Row 3 Spells int nSpellSlot, nSpell, nMetamagic; json jSpell; json jWidget = JsonArrayGet(jSpells, 2); nClass = GetClassByPosition(nClassSelected, oAssociate); string sSpellIcon, sSpellName, sMetaMagicText; json jSpellArray = JsonArray(); json jSpell_Icon = JsonArray(); json jSpell_Text = JsonArray(); json jMetaMagic_Text = JsonArray(); // List the spells they know from their spellbook. if(Get2DAString("classes", "SpellbookRestricted", nClass) == "1") { int nMaxSpells = GetKnownSpellCount(oAssociate, nClass, nLevelSelected); //WriteTimestampedLogEntry("Maxspells: " + IntToString(nMaxSpells) + // " nClass: " + IntToString(nClass) + // " nLevelSelected: " + IntToString(nLevelSelected)); while(nSpellSlot < nMaxSpells) { nSpell = GetKnownSpellId(oAssociate, nClass, nLevelSelected, nSpellSlot); if(nSpell != -1) { jSpellArray = JsonArrayInsert(jSpellArray, JsonInt(nSpell)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); //SendMessageToPC(oPC, "SpellBook: nSpell: " + IntToString(nSpell) + // " sSpellIcon: " + sSpellIcon + // " sSpellName: " + sSpellName+ // " nMaxSpells: " + IntToString(nMaxSpells) + // " nSpellSlot: " + IntToString(nSpellSlot)); //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, nClass, nLevelSelected, nSpellSlot); //jMetaMagic_Text = JsonArrayInsert(jMetaMagic_Text, JsonString(sMetaMagicText)); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); } ++nSpellSlot; } } // List the spells from the spells.2da file (they get to choose from them all!). else { string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass); int nMaxSpells = Get2DARowCount("spells"); while(nSpell < nMaxSpells) { sLevel = Get2DAString("spells", sSpellTableColumn, nSpell); if(sLevel != "") { if(StringToInt(sLevel) == nLevelSelected) { jSpellArray = JsonArrayInsert(jSpellArray, JsonInt(nSpell)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); } } ++nSpell; } } jData = JsonArrayInsert(jData, jSpellArray); NuiSetUserData(oPC, nToken, jData); NuiSetBind(oPC, nToken, "icon_spell", jSpell_Icon); NuiSetBind(oPC, nToken, "text_spell", jSpell_Text); NuiSetBind(oPC, nToken, "metamagic_text", jMetaMagic_Text); // Row 4 Spell memorized list label. // Row 5 Spell memorized List int nMetaMagic, nDomain; nIndex = 0; while(nIndex < nMaxMemorizationSlots) { sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(TRUE)); if(GetMemorizedSpellId(oAssociate, nClass, nLevelSelected, nIndex) > -1) { nSpell = GetMemorizedSpellId(oAssociate, nClass, nLevelSelected, nIndex); sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); //nMetaMagic = 255; //nDomain = 0; sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString(sSpellIcon)); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_tooltip", JsonString(" " + sName + " (" + sClass + " / " + IntToString(nLevelSelected) + ")")); //sMetaMagicText = ai_GetSpellIconAttributes(oAssociate, -1, -1, -1, nMetaMagic, nDomain); //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString(sMetaMagicText)); } else { NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_image", JsonString("ctl_cg_btn_splvl")); //NuiSetBind(oPC, nToken, "metamagic_" + sIndex + "_text", JsonString("")); NuiSetBind(oPC, nToken, "btn_memorized_" + sIndex + "_event", JsonBool(FALSE)); } ++nIndex; } } void ai_CreateSpellKnownNUI(object oPC, object oAssociate) { // Set window to not save until it has been created. SetLocalInt (oPC, AI_NO_NUI_SAVE, TRUE); DelayCommand (2.0, DeleteLocalInt (oPC, AI_NO_NUI_SAVE)); string sAssociateType = ai_GetAssociateType(oPC, oAssociate); json jRow = JsonArray(); // Row 1 Classes************************************************************ 414 / 73 int nClass, bCaster, nIndex; string sIndex, sClassIcon, sLevelIcon; for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClass = GetClassByPosition(nIndex, oAssociate); if(nClass != CLASS_TYPE_INVALID) { if(StringToInt(Get2DAString("classes", "SpellbookRestricted", nClass))) { // This saves the class position in the button id so we can get it later. sIndex = IntToString(nIndex); sClassIcon = Get2DAString("classes", "Icon", nClass); jRow = CreateButtonImage(jRow, sClassIcon, "btn_class_" + sIndex, 35.0f, 35.0f, 0.0, "btn_class_" + sIndex + "_tooltip"); } } } jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 2 (Levels) ********************************************************** 414 / 116 jRow = JsonArray(); for(nIndex = 0; nIndex <= 9; nIndex++) { // This saves the level in the button id so we can get it later. sIndex = IntToString(nIndex); jRow = CreateButtonImage(jRow, "", "btn_level_" + sIndex, 35.0f, 35.0f, 0.0, "btn_level_" + sIndex + "_tooltip"); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 3 (Spell List)******************************************************* 414 / 398 json jButton = JsonArray(); jButton = NuiButton(NuiBind("text_spell")); jButton = NuiId(jButton, "btn_text_spell"); json jRectangle = NuiRect(4.0, 4.0, 27.0, 27.0); json jDrawList = JsonArrayInsert(JsonArray(), NuiDrawListImage(JsonBool(TRUE), NuiBind("icon_spell"), jRectangle, JsonInt(NUI_ASPECT_FILL), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_MIDDLE))); //jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_text")); //jDrawList = JsonArrayInsert(jDrawList, jMetaMagic); jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); json jListTemplate = JsonArrayInsert(JsonArray(), NuiListTemplateCell(jButton, 275.0, FALSE)); json jInfo = NuiButtonImage(JsonString("gui_cg_qstn_mark")); jInfo = NuiId(jInfo, "btn_info_spell"); jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jInfo, 35.0, FALSE)); jRow = JsonArrayInsert(JsonArray(), NuiHeight(NuiList(jListTemplate, NuiBind("icon_spell"), 35.0), 282.0)); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 4 (Widget Label)***************************************************** 414 / 426 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); CreateLabel(jRow, "Known Spell List", "lbl_spell_list", 150.0, 20.0, 0, 0, 0.0); jRow = JsonArrayInsert(jRow, NuiSpacer()); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Row 5 (Memorize slots)*************************************************** 414 / 469 // Get the class and level selected from the database. int nClassSelected, nLevelSelected; json jSpells; json jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); // Temporary fix for error! :/ if(JsonGetLength(jAIData) == 0) { ai_CheckAssociateData(oPC, oAssociate, sAssociateType, TRUE); jAIData = ai_GetAssociateDbJson(oPC, sAssociateType, "aidata"); } if(JsonGetLength(jAIData) == 9) { jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(0)); jAIData = JsonArrayInsert(jAIData, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } else { jSpells = JsonArrayGet(jAIData, 10); if(JsonGetType(jSpells) == JSON_TYPE_NULL) { jSpells = JsonArray(); jSpells = JsonArrayInsert(jSpells, JsonInt(1)); jSpells = JsonArrayInsert(jSpells, JsonInt(0)); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } else { nClassSelected = JsonGetInt(JsonArrayGet(jSpells, 0)); nLevelSelected = JsonGetInt(JsonArrayGet(jSpells, 1)); } } // If we left the Quick Use widget on Special Abilities (10) or Items (11) goto level 0 if(nLevelSelected == 10 || nLevelSelected == 11) { nLevelSelected = 0; jSpells = JsonArraySet(jSpells, 1, JsonInt(0)); jAIData = JsonArraySet(jAIData, 10, jSpells); ai_SetAssociateDbJson(oPC, sAssociateType, "aidata", jAIData); } if(nClassSelected < 1 || nClassSelected > AI_MAX_CLASSES_PER_CHARACTER) nClassSelected = 1; nClass = GetClassByPosition(nClassSelected, oAssociate); jRow = JsonArray(); for(nIndex = 0; nIndex < 10; nIndex++) { // This saves the index location of the spell in the list. sIndex = IntToString(nIndex); json jButton = NuiButtonImage(NuiBind("btn_known_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_known_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_known_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_known_" + sIndex + "_tooltip")); //json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); //jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); //jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Do the second row. jRow = JsonArray(); for(nIndex = 10; nIndex < 20; nIndex++) { // This saves the index location of the spell in the list. sIndex = IntToString(nIndex); json jButton = NuiButtonImage(NuiBind("btn_known_" + sIndex + "_image")); jButton = NuiEnabled(jButton, NuiBind("btn_known_" + sIndex + "_event")); jButton = NuiId(jButton, "btn_known_" + sIndex); jButton = NuiWidth(NuiHeight(jButton, 35.0), 35.0); jButton = NuiMargin(jButton, 0.0); jButton = NuiTooltip(jButton, NuiBind("btn_known_" + sIndex + "_tooltip")); //json jRectangle = NuiRect(4.0, 4.0, 10.0, 10.0); //json jMetaMagic = NuiDrawListText(JsonBool(TRUE), NuiColor(255, 255, 0), jRectangle, NuiBind("metamagic_" + sIndex + "_text")); //jDrawList = JsonArrayInsert(JsonArray(), jMetaMagic); //jButton = NuiDrawList(jButton, JsonBool(TRUE), jDrawList); jRow = JsonArrayInsert(jRow, jButton); } // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Get the window location to restore it from the database. float fX, fY; json jLocations = ai_GetAssociateDbJson(oPC, sAssociateType, "locations"); jLocations = JsonObjectGet(jLocations, sAssociateType + AI_SPELL_KNOWN_NUI); if(JsonGetType(jLocations) == JSON_TYPE_NULL) { fX = -1.0; fY = -1.0; } else { fX = JsonGetFloat(JsonObjectGet(jLocations, "x")); fY = JsonGetFloat(JsonObjectGet(jLocations, "y")); } string sText, sName = GetName(oAssociate); if(GetStringRight(sName, 1) == "s") sName = sName + "'"; else sName = sName + "'s"; // Set the Layout of the window. json jLayout = NuiCol(jCol); int nToken = SetWindow(oPC, jLayout, sAssociateType + AI_SPELL_KNOWN_NUI, sName + " Spell Known Menu", fX, fY, 375.0, 539.0 + 12.0, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); // Set the Layout of the window. // Save the associate to the nui for use in 0e_nui json jData = JsonArrayInsert(JsonArray(), JsonString(ObjectToString(oAssociate))); // Set event watches for save window location. NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE); // Row 1 & 2 Class & Level int nSpellLevel, nIndexLevel, nMaxSpellLevel, nClassLevel; string sClass, sLevel, sLevelImage, sIndexLevel, sSpellsGained; for(nIndex = 1; nIndex <= AI_MAX_CLASSES_PER_CHARACTER; nIndex++) { nClass = GetClassByPosition(nIndex, oAssociate); if(nClass != CLASS_TYPE_INVALID) { bCaster = StringToInt(Get2DAString("classes", "SpellbookRestricted", nClass)); if(bCaster) { sClass = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass))); sIndex = IntToString(nIndex); NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_class_" + sIndex + "_tooltip", JsonString(" " + sClass)); if(nClassSelected == nIndex) { nClassLevel = GetLevelByClass(nClass, oAssociate); sSpellsGained = Get2DAString("classes", "SpellGainTable", nClass); nMaxSpellLevel = StringToInt(Get2DAString(sSpellsGained, "NumSpellLevels", nClassLevel - 1)); for(nIndexLevel = 0; nIndexLevel <= 9; nIndexLevel++) { sIndexLevel = IntToString(nIndexLevel); if(nIndexLevel < nMaxSpellLevel) { if(nIndexLevel == 0) sLevelImage = "ir_cantrips"; else if(nIndexLevel < 7)sLevelImage = "ir_level" + sIndexLevel; else sLevelImage = "ir_level789"; if(nIndexLevel == 0) sLevel = " Cantrips"; else if(nIndexLevel == 1) sLevel = " First level"; else if(nIndexLevel == 2) sLevel = " Second level"; else if(nIndexLevel == 3) sLevel = " Third level"; else if(nIndexLevel == 4) sLevel = " Fourth level"; else if(nIndexLevel == 5) sLevel = " Fifth level"; else if(nIndexLevel == 6) sLevel = " Sixth level"; else if(nIndexLevel == 7) sLevel = " Seventh level"; else if(nIndexLevel == 8) sLevel = " Eighth level"; else if(nIndexLevel == 9) sLevel = " Ninth level"; NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_tooltip", JsonString(" " + sLevel)); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString(sLevelImage)); } else { NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_image", JsonString("ctl_cg_btn_splvl")); NuiSetBind(oPC, nToken, "btn_level_" + sIndexLevel + "_event", JsonBool(FALSE)); } } NuiSetBind(oPC, nToken, "btn_level_" + IntToString(nLevelSelected) + "_encouraged", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "btn_class_" + IntToString(nClassSelected) + "_encouraged", JsonBool(TRUE)); } } } } // Row 3 Spells int nSpellSlot, nSpell, nMetamagic; json jSpell; json jWidget = JsonArrayGet(jSpells, 2); nClass = GetClassByPosition(nClassSelected, oAssociate); string sSpellIcon, sSpellName, sMetaMagicText; json jSpellArray = JsonArray(); json jSpell_Icon = JsonArray(); json jSpell_Text = JsonArray(); json jMetaMagic_Text = JsonArray(); // List the spells from the spells.2da file (they get to choose from them all!). string sSpellTableColumn = Get2DAString("classes", "SpellTableColumn", nClass); int nMaxSpells = Get2DARowCount("spells"); while(nSpell < nMaxSpells) { sLevel = Get2DAString("spells", sSpellTableColumn, nSpell); if(sLevel != "") { if(StringToInt(sLevel) == nLevelSelected) { jSpellArray = JsonArrayInsert(jSpellArray, JsonInt(nSpell)); sSpellIcon = Get2DAString("spells", "IconResRef", nSpell); sSpellName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); jSpell_Icon = JsonArrayInsert(jSpell_Icon, JsonString(sSpellIcon)); jSpell_Text = JsonArrayInsert(jSpell_Text, JsonString(sSpellName)); } } ++nSpell; } jData = JsonArrayInsert(jData, jSpellArray); NuiSetUserData(oPC, nToken, jData); NuiSetBind(oPC, nToken, "icon_spell", jSpell_Icon); NuiSetBind(oPC, nToken, "text_spell", jSpell_Text); NuiSetBind(oPC, nToken, "metamagic_text", jMetaMagic_Text); // Row 4 Spell known list label. // Row 5 Spell known List int nMetaMagic, nDomain, nMaxKnownSlots; json jClassList = GetLocalJson(oAssociate, AI_CLASS_LIST_JSON); if(JsonGetType(jClassList) == JSON_TYPE_NULL) { jClassList = ObjectToJson(oAssociate); jClassList = GffGetList(jClassList, "ClassList"); SetLocalJson(oAssociate, AI_CLASS_LIST_JSON, jClassList); } // Get the correct class array. nIndex = 0; json jClass = JsonArrayGet(jClassList, nIndex); while(JsonGetInt(GffGetInt(jClass, "Class")) != nClass) { jClass = JsonArrayGet(jClassList, ++nIndex); } json jKnownList = GffGetList(jClass, "KnownList" + IntToString(nLevelSelected)); string sSpellKnownTable = Get2DAString("classes", "SpellKnownTable", nClass); if(sSpellKnownTable != "") nMaxKnownSlots = StringToInt(Get2DAString(sSpellKnownTable, "SpellLevel" + IntToString(nLevelSelected), nClassLevel - 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(nLevelSelected) + ")")); //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; } } void ai_CreateDescriptionNUI(object oPC, json jSpell, int nSpell = 0) { // Row 1 ******************************************************************* 500 / 469 json jRow = CreateImage(JsonArray(), "", "spell_icon", NUI_ASPECT_FIT, NUI_HALIGN_CENTER, NUI_VALIGN_MIDDLE, 40.0, 40.0); jRow = CreateTextBox(jRow, "spell_text", 380.0, 400.0, FALSE, NUI_SCROLLBARS_Y); // Add row to the column. json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow)); // Row 1 ******************************************************************* 500 / 522 jRow = JsonArrayInsert(JsonArray(), NuiSpacer()); jRow = CreateButton(jRow, "OK", "btn_ok", 150.0f, 45.0f); // Add row to the column. jCol = JsonArrayInsert(jCol, NuiRow(jRow)); // Set the Layout of the window. json jLayout = NuiCol(jCol); string sName, sIcon, sDescription; int nFeat, nDescription; int nClass; if(nSpell) nClass = 0; else { nSpell = JsonGetInt(JsonArrayGet(jSpell, 0)); nClass = JsonGetInt(JsonArrayGet(jSpell, 1)); } if(nClass == -1) { if(nSpell == SPELL_HEALINGKIT) { sName = "Healer's Kit"; sIcon = "isk_heal"; sDescription = GetStringByStrRef(1720); } else { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sIcon = Get2DAString("spells", "IconResRef", nSpell); nDescription = StringToInt(Get2DAString("spells", "SpellDesc", nSpell)); if(nDescription) sDescription = GetStringByStrRef(nDescription); else { object oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); sDescription = GetDescription(oItem); } } } else { nFeat = JsonGetInt(JsonArrayGet(jSpell, 5)); if(nFeat) { if(nSpell) { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sIcon = Get2DAString("spells", "IconResRef", nSpell); } else { sName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))); sIcon = Get2DAString("feat", "ICON", nFeat); } sDescription = GetStringByStrRef(StringToInt(Get2DAString("feat", "DESCRIPTION", nFeat))); } else { sName = GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell))); sIcon = Get2DAString("spells", "IconResRef", nSpell); nDescription = StringToInt(Get2DAString("spells", "SpellDesc", nSpell)); if(nDescription) sDescription = GetStringByStrRef(nDescription); else { object oItem = GetObjectByUUID(JsonGetString(JsonArrayGet(jSpell, 5))); sDescription = GetDescription(oItem); } } } int nToken = SetWindow(oPC, jLayout, AI_SPELL_DESCRIPTION_NUI, sName, -1.0, -1.0, 460.0f, 537.0 + 12.0f, FALSE, FALSE, TRUE, FALSE, TRUE, "0e_nui"); json jData = JsonArray(); jData = JsonArrayInsert(jData, JsonString(ObjectToString(oPC))); NuiSetUserData(oPC, nToken, jData); // Row 1 NuiSetBind(oPC, nToken, "spell_icon_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "spell_icon_image", JsonString(sIcon)); NuiSetBind(oPC, nToken, "spell_text_event", JsonBool(TRUE)); NuiSetBind(oPC, nToken, "spell_text", JsonString(sDescription)); // Row 2 NuiSetBind(oPC, nToken, "btn_ok_event", JsonBool(TRUE)); }