Added PEPS AI. Updated module name. Set all henchmen to have a random race &/or class based name using a custom version of Markshire's Nomeclature scripts, as well as appearance. Set Constructs, Undead, Outsiders & Elementals to not require food or drink. Full compile.
4824 lines
256 KiB
Plaintext
4824 lines
256 KiB
Plaintext
/*//////////////////////////////////////////////////////////////////////////////
|
|
// 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));
|
|
}
|
|
|