1976 lines
113 KiB
Plaintext
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;
|
|
}
|
|
|