Jaysyn904 0e9e2c6950 2025/07/18 Update
Added PEPS.
Full compile.
2025-07-18 12:13:13 -04:00

1976 lines
113 KiB
Plaintext

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