Added PEPS AI. Updated module name. Set all henchmen to have a random race &/or class based name using a custom version of Markshire's Nomeclature scripts, as well as appearance. Set Constructs, Undead, Outsiders & Elementals to not require food or drink. Full compile.
339 lines
17 KiB
Plaintext
339 lines
17 KiB
Plaintext
/*//////////////////////////////////////////////////////////////////////////////
|
|
// Script Name: pi_buffing
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
Executable plug in script for Philos Module Extentions.
|
|
|
|
Database structure:
|
|
Name(string) Tag(String) Spells(Json)
|
|
Tag: Widget - 0 = x position, 1 = y position, 2 = On/Off, 3 = Locked
|
|
Tag: List (string) set to the list number selected 1,2,3, or 4.
|
|
Tag: List# is the list of spells for List number 1,2,3, or 4.
|
|
|
|
UI to save a players buff spells to be cast after resting.
|
|
*///////////////////////////////////////////////////////////////////////////////
|
|
#include "0i_nui"
|
|
const int BUFF_MAX_SPELLS = 50;
|
|
const string FB_NO_MONSTER_CHECK = "FB_NO_MONSTER_CHECK";
|
|
|
|
// Does startup check if the game has just been loaded.
|
|
int StartingUp(object oPC);
|
|
// Creates the table and initializes if it needs to.
|
|
void CheckBuffDataAndInitialize(object oPlayer, string sTag);
|
|
// sDataField should be one of the data fields for that table.
|
|
// sData is the string data to be saved.
|
|
void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag);
|
|
// sDataField should be one of the data fields for the table.
|
|
// Returns a string of the data stored.
|
|
string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag);
|
|
// sDataField should be one of the data fields for that table.
|
|
// jData is the json data to be saved.
|
|
void SetBuffDatabaseJson(object oPlayer, string sDataField, json jData, string sTag);
|
|
// sDataField should be one of the data fields for the table.
|
|
// Returns a string of the data stored.
|
|
json GetBuffDatabaseJson(object oPlayer, string sDataField, string sTag);
|
|
// Creates the widget for buffing.
|
|
void PopupWidgetBuffGUIPanel(object oPC);
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
// Check to make sure the database is setup before we do anything.
|
|
CheckBuffDataAndInitialize(oPC, "menudata");
|
|
json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata");
|
|
if(JsonGetType(JsonArrayGet(jMenuData, 0)) == JSON_TYPE_NULL)
|
|
{
|
|
jMenuData = JsonArrayInsert(JsonArray(), JsonString("list1")); // 0 Spell List #
|
|
jMenuData = JsonArrayInsert(jMenuData, JsonFloat(0.0)); // 1 Main menu X pos.
|
|
jMenuData = JsonArrayInsert(jMenuData, JsonFloat(GetGUIHeightMiddle(oPC, 257.0))); // 2 Main menu Y pos.
|
|
jMenuData = JsonArrayInsert(jMenuData, JsonBool(FALSE)); // 3 Widget on/off
|
|
jMenuData = JsonArrayInsert(jMenuData, JsonBool(FALSE)); // 4 Widget Locked
|
|
jMenuData = JsonArrayInsert(jMenuData, JsonFloat(10.0)); // 5 Widget X pos.
|
|
jMenuData = JsonArrayInsert(jMenuData, JsonFloat(10.0)); // 6 Widget Y pos.
|
|
SetBuffDatabaseJson(oPC, "spells", jMenuData, "menudata");
|
|
}
|
|
if(StartingUp(oPC)) return;
|
|
// Row 1 (Buttons) ********************************************************* 83
|
|
json jRow = CreateButtonSelect(JsonArray(), "Save", "btn_save", 60.0f, 30.0f, "btn_save_tooltip");
|
|
CreateButton(jRow, "Clear", "btn_clear", 60.0f, 30.0f, -1.0, "btn_clear_tooltip");
|
|
CreateButton(jRow, "Buff", "btn_buff", 60.0f, 30.0f, -1.0, "btn_buff_tooltip");
|
|
CreateButtonSelect(jRow, "List 1", "btn_list1", 60.0f, 30.0f);
|
|
CreateButtonSelect(jRow, "List 2", "btn_list2", 60.0f, 30.0f);
|
|
CreateButtonSelect(jRow, "List 3", "btn_list3", 60.0f, 30.0f);
|
|
CreateButtonSelect(jRow, "List 4", "btn_list4", 60.0f, 30.0f);
|
|
// Add the row to the column.
|
|
json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow));
|
|
// Row 2 (Buttons) ********************************************************* 121
|
|
jRow = JsonArrayInsert(JsonArray(), NuiSpacer());
|
|
jRow = CreateCheckBox(jRow, "Buff Widget", "buff_widget", 110.0, 30.0f, "buff_widget_tooltip");
|
|
jRow = CreateCheckBox(jRow, "Lock Widget", "lock_buff_widget", 110.0, 30.0f, "lock_buff_widget_tooltip");
|
|
if(!AI_SERVER)
|
|
{
|
|
jRow = CreateCheckBox(jRow, "Don't Check for Monsters", "chbx_no_monster_check", 200.0, 30.0f, "chbx_no_monster_check_tooltip");
|
|
}
|
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
|
// Add the row to the column.
|
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
|
// Row 4 (List of Spells) ************************************************** 164
|
|
// Create the button template for the List.
|
|
jRow = JsonArray();
|
|
string sList = JsonGetString(JsonArrayGet(jMenuData, 0));
|
|
int nCntr, nIndex;
|
|
string sCntr, sIndex;
|
|
json jSpell;
|
|
CheckBuffDataAndInitialize(oPC, sList);
|
|
json jSpells = GetBuffDatabaseJson(oPC, "spells", sList);
|
|
while(nCntr <= BUFF_MAX_SPELLS)
|
|
{
|
|
jSpell = JsonArrayGet(jSpells, nCntr);
|
|
if(JsonGetType(jSpell) != JSON_TYPE_NULL)
|
|
{
|
|
sIndex = IntToString(nIndex++);
|
|
jRow = CreateButtonImage(jRow, "", "btn_spell_" + sIndex, 35.0, 35.0, 0.0, "btn_spell_" + sIndex + "_tooltip");
|
|
}
|
|
nCntr++;
|
|
}
|
|
// Add the row to the column.
|
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
|
// Get the window location to restore it from the database.
|
|
float fWidth = IntToFloat(nIndex) * 39;
|
|
if(fWidth < 470.0) fWidth = 470.0;
|
|
float fX = JsonGetFloat(JsonArrayGet(jMenuData, 1));
|
|
float fY = JsonGetFloat(JsonArrayGet(jMenuData, 2));
|
|
if(fX == 0.0f && fY == 0.0f)
|
|
{
|
|
fX = 0.0f;
|
|
fY = GetGUIHeightMiddle(oPC, 257.0);
|
|
}
|
|
// Set the layout of the window.
|
|
json jLayout = NuiCol(jCol);
|
|
int nToken = SetWindow(oPC, jLayout, "plbuffwin", "Fast Buffing Spells",
|
|
fX, fY, fWidth, 164.0, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_buffing");
|
|
// Set the elements to show events.
|
|
int nSelected = GetEventScript(oPC, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT) == "pc_savebuffs";
|
|
NuiSetBind(oPC, nToken, "btn_save", JsonBool(nSelected));
|
|
NuiSetBind(oPC, nToken, "btn_save_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_save_tooltip", JsonString(" Saves any spells cast on you or your associates."));
|
|
NuiSetBind(oPC, nToken, "btn_clear", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_clear_event", JsonBool (TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_clear_tooltip", JsonString(" Clears the current list of all saved spells."));
|
|
NuiSetBind(oPC, nToken, "btn_buff", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_buff_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_buff_tooltip", JsonString(" Casts the current list of saved spells."));
|
|
if(sList == "list1") NuiSetBind (oPC, nToken, "btn_list1", JsonBool (TRUE));
|
|
else NuiSetBind(oPC, nToken, "btn_list1", JsonBool(FALSE));
|
|
NuiSetBind(oPC, nToken, "btn_list1_event", JsonBool(TRUE));
|
|
if(sList == "list2") NuiSetBind (oPC, nToken, "btn_list2", JsonBool (TRUE));
|
|
else NuiSetBind(oPC, nToken, "btn_list2", JsonBool(FALSE));
|
|
NuiSetBind(oPC, nToken, "btn_list2_event", JsonBool(TRUE));
|
|
if(sList == "list3") NuiSetBind (oPC, nToken, "btn_list3", JsonBool (TRUE));
|
|
else NuiSetBind(oPC, nToken, "btn_list3", JsonBool(FALSE));
|
|
NuiSetBind(oPC, nToken, "btn_list3_event", JsonBool(TRUE));
|
|
if(sList == "list4") NuiSetBind (oPC, nToken, "btn_list4", JsonBool (TRUE));
|
|
else NuiSetBind (oPC, nToken, "btn_list4", JsonBool(FALSE));
|
|
NuiSetBind(oPC, nToken, "btn_list4_event", JsonBool(TRUE));
|
|
int nValue = JsonGetInt(JsonArrayGet(jMenuData, 3));
|
|
NuiSetBind(oPC, nToken, "buff_widget_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "buff_widget_check", JsonBool(nValue));
|
|
NuiSetBindWatch(oPC, nToken, "buff_widget_check", TRUE);
|
|
string sText = " Creates a set of 4 buttons on the screen for quick buffing.";
|
|
NuiSetBind(oPC, nToken, "buff_widget_tooltip", JsonString(sText));
|
|
nValue = JsonGetInt(JsonArrayGet(jMenuData, 4));
|
|
NuiSetBind(oPC, nToken, "lock_buff_widget_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "lock_buff_widget_check", JsonBool(nValue));
|
|
NuiSetBindWatch(oPC, nToken, "lock_buff_widget_check", TRUE);
|
|
sText = " Locks the buffing widget in place reducing its size.";
|
|
NuiSetBind(oPC, nToken, "lock_buff_widget_tooltip", JsonString(sText));
|
|
if(!AI_SERVER)
|
|
{
|
|
NuiSetBind(oPC, nToken, "chbx_no_monster_check_event", JsonBool(TRUE));
|
|
nValue = GetLocalInt(oPC, FB_NO_MONSTER_CHECK);
|
|
NuiSetBind(oPC, nToken, "chbx_no_monster_check_check", JsonBool(nValue));
|
|
NuiSetBindWatch(oPC, nToken, "chbx_no_monster_check_check", TRUE);
|
|
sText = " Turns on/off checks for nearby monsters.";
|
|
NuiSetBind(oPC, nToken, "chbx_no_monster_check_tooltip", JsonString(sText));
|
|
}
|
|
// Create buttons with spells listed.
|
|
int nSpell, nClass, nLevel, nMetamagic, nDomain;
|
|
string sName, sTargetName, sResRef;
|
|
nCntr = 0;
|
|
nIndex = 0;
|
|
while(nCntr <= BUFF_MAX_SPELLS)
|
|
{
|
|
jSpell = JsonArrayGet(jSpells, nCntr);
|
|
if(JsonGetType(jSpell) != JSON_TYPE_NULL)
|
|
{
|
|
nSpell = JsonGetInt(JsonArrayGet(jSpell, 0));
|
|
nClass = JsonGetInt(JsonArrayGet(jSpell, 1));
|
|
nLevel = JsonGetInt(JsonArrayGet(jSpell, 2));
|
|
nMetamagic = JsonGetInt(JsonArrayGet(jSpell, 3));
|
|
nDomain = JsonGetInt(JsonArrayGet(jSpell, 4));
|
|
sTargetName = JsonGetString(JsonArrayGet(jSpell, 5));
|
|
sResRef = Get2DAString("spells", "IconResRef", nSpell);
|
|
sName = " " + GetStringByStrRef(StringToInt(Get2DAString("spells", "Name", nSpell)));
|
|
sName += " (" + GetStringByStrRef(StringToInt(Get2DAString("classes", "Short", nClass)));
|
|
sName += " / " + IntToString (nLevel);
|
|
if(nMetamagic > 0)
|
|
{
|
|
if(nMetamagic == METAMAGIC_EMPOWER) sName += " / Empowered";
|
|
else if(nMetamagic == METAMAGIC_EXTEND) sName += " / Extended";
|
|
else if(nMetamagic == METAMAGIC_MAXIMIZE) sName += " / Maximized";
|
|
else if(nMetamagic == METAMAGIC_QUICKEN) sName += " / Quickened";
|
|
else if(nMetamagic == METAMAGIC_SILENT) sName += " / Silent";
|
|
else if(nMetamagic == METAMAGIC_STILL) sName += " / Still";
|
|
}
|
|
if(nDomain > 0) sName += " / Domain";
|
|
sName += ") " + sTargetName;
|
|
sIndex = IntToString(nIndex++);
|
|
NuiSetBind(oPC, nToken, "btn_spell_" + sIndex + "_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_spell_" + sIndex + "_image", JsonString(sResRef));
|
|
NuiSetBind(oPC, nToken, "btn_spell_" + sIndex + "_tooltip", JsonString(sName));
|
|
}
|
|
nCntr++;
|
|
}
|
|
NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE);
|
|
}
|
|
int StartingUp(object oPC)
|
|
{
|
|
if(GetLocalInt(oPC, AI_ADD_PLUGIN))
|
|
{
|
|
json jPlugin = JsonArray();
|
|
jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_buffing"));
|
|
jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE));
|
|
jPlugin = JsonArrayInsert(jPlugin, JsonString("Quick Buff"));
|
|
jPlugin = JsonArrayInsert(jPlugin, JsonString("dm_appear"));
|
|
json jPlugins = GetLocalJson(oPC, AI_JSON_PLUGINS);
|
|
jPlugins = JsonArrayInsert(jPlugins, jPlugin);
|
|
SetLocalJson(oPC, AI_JSON_PLUGINS, jPlugin);
|
|
SetLocalInt(oPC, AI_PLUGIN_SET, TRUE);
|
|
return TRUE;
|
|
}
|
|
if(!GetLocalInt(oPC, AI_STARTING_UP)) return FALSE;
|
|
json jMenuData = GetBuffDatabaseJson(oPC, "spells", "menudata");
|
|
int bWidgetOn = JsonGetInt(JsonArrayGet(jMenuData, 3));
|
|
if(bWidgetOn)
|
|
{
|
|
PopupWidgetBuffGUIPanel(oPC);
|
|
ai_SendMessages("Buffing widget has been created.", AI_COLOR_YELLOW, oPC);
|
|
}
|
|
return TRUE;
|
|
}
|
|
void CreateBuffDataTable(object oPlayer)
|
|
{
|
|
sqlquery sql = SqlPrepareQueryObject(oPlayer,
|
|
"CREATE TABLE IF NOT EXISTS BUFF_TABLE (" +
|
|
"name TEXT, " +
|
|
"tag TEXT, " +
|
|
"spells TEXT, " +
|
|
"PRIMARY KEY(name, tag));");
|
|
SqlStep(sql);
|
|
}
|
|
void CheckBuffDataAndInitialize(object oPlayer, string sTag)
|
|
{
|
|
string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE)));
|
|
string sQuery = "SELECT name FROM sqlite_master WHERE type ='table' AND name=@tableName;";
|
|
sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindString (sql, "@tableName", "BUFF_TABLE");
|
|
if(!SqlStep (sql)) CreateBuffDataTable(oPlayer);
|
|
sQuery = "SELECT name FROM BUFF_TABLE Where name = @name AND tag = @tag;";
|
|
sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindString(sql, "@name", sName);
|
|
SqlBindString(sql, "@tag", sTag);
|
|
if(!SqlStep(sql))
|
|
{
|
|
sQuery = "INSERT INTO BUFF_TABLE(name, tag, spells) " +
|
|
"VALUES (@name, @tag, @spells);";
|
|
sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindString(sql, "@name", sName);
|
|
SqlBindString(sql, "@tag", sTag);
|
|
SqlBindJson(sql, "@spells", JsonArray());
|
|
SqlStep(sql);
|
|
}
|
|
}
|
|
void SetBuffDatabaseString(object oPlayer, string sDataField, string sData, string sTag)
|
|
{
|
|
string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE)));
|
|
string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;";
|
|
sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindString(sql, "@data", sData);
|
|
SqlBindString(sql, "@name", sName);
|
|
SqlBindString(sql, "@tag", sTag);
|
|
SqlStep(sql);
|
|
}
|
|
string GetBuffDatabaseString(object oPlayer, string sDataField, string sTag)
|
|
{
|
|
string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE)));
|
|
string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;";
|
|
sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindString(sql, "@name", sName);
|
|
SqlBindString(sql, "@tag", sTag);
|
|
if(SqlStep(sql)) return SqlGetString(sql, 0);
|
|
else return "";
|
|
}
|
|
void SetBuffDatabaseJson (object oPlayer, string sDataField, json jData, string sTag)
|
|
{
|
|
string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE)));
|
|
string sQuery = "UPDATE BUFF_TABLE SET " + sDataField + " = @data WHERE name = @name AND tag = @tag;";
|
|
sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindJson(sql, "@data", jData);
|
|
SqlBindString(sql, "@name", sName);
|
|
SqlBindString(sql, "@tag", sTag);
|
|
SqlStep(sql);
|
|
}
|
|
json GetBuffDatabaseJson(object oPlayer, string sDataField, string sTag)
|
|
{
|
|
string sName = ai_RemoveIllegalCharacters(ai_StripColorCodes(GetName(oPlayer, TRUE)));
|
|
string sQuery = "SELECT " + sDataField + " FROM BUFF_TABLE WHERE name = @name AND tag = @tag;";
|
|
sqlquery sql = SqlPrepareQueryObject(oPlayer, sQuery);
|
|
SqlBindString(sql, "@name", sName);
|
|
SqlBindString(sql, "@tag", sTag);
|
|
if(SqlStep(sql)) return SqlGetJson(sql, 0);
|
|
else return JsonArray();
|
|
}
|
|
void PopupWidgetBuffGUIPanel(object oPC)
|
|
{
|
|
// Set window to not save until it has been created.
|
|
SetLocalInt(oPC, AI_NO_NUI_SAVE, TRUE);
|
|
DelayCommand(0.5f, DeleteLocalInt (oPC, AI_NO_NUI_SAVE));
|
|
// Row 1 (buttons)**********************************************************
|
|
json jRow = JsonArray();
|
|
CreateButtonImage(jRow, "ir_level1", "btn_one", 35.0f, 35.0f, 0.0);
|
|
CreateButtonImage(jRow, "ir_level2", "btn_two", 35.0f, 35.0f, 0.0);
|
|
CreateButtonImage(jRow, "ir_level3", "btn_three", 35.0f, 35.0f, 0.0);
|
|
CreateButtonImage(jRow, "ir_level4", "btn_four", 35.0f, 35.0f, 0.0);
|
|
// Add the row to the column.
|
|
json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow));
|
|
json jWidget = GetBuffDatabaseJson(oPC, "spells", "menudata");
|
|
int bAIBuffWidgetLock = JsonGetInt(JsonArrayGet(jWidget, 4));
|
|
// Get the window location to restore it from the database.
|
|
float fX = JsonGetFloat(JsonArrayGet(jWidget, 5));
|
|
float fY = JsonGetFloat(JsonArrayGet(jWidget, 6));
|
|
if(fX == 0.0f && fY == 0.0f)
|
|
{
|
|
fX = 10.0f;
|
|
fY = 10.0f;
|
|
}
|
|
if(bAIBuffWidgetLock)
|
|
{
|
|
fX = fX + 4.0f;
|
|
fY = fY + 45.0f;
|
|
}
|
|
// Set the layout of the window.
|
|
json jLayout = NuiCol (jCol);
|
|
int nToken;
|
|
if(bAIBuffWidgetLock) nToken = SetWindow(oPC, jLayout, "widgetbuffwin", "Fast Buff Widget", fX, fY, 160.0, 62.0, FALSE, FALSE, FALSE, TRUE, FALSE, "pe_buffing");
|
|
else nToken = SetWindow(oPC, jLayout, "widgetbuffwin", "Fast Buff Widget", fX, fY, 160.0, 95.0, FALSE, FALSE, FALSE, TRUE, TRUE, "pe_buffing");
|
|
// Set event watches for window inspector and save window location.
|
|
//NuiSetBindWatch(oPC, nToken, "collapsed", TRUE);
|
|
NuiSetBindWatch(oPC, nToken, "window_geometry", TRUE);
|
|
// Set the buttons to show events.
|
|
//NuiSetBind (oPC, nToken, "btn_one", JsonBool (TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_one_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_two", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_two_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_three", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_three_event", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_four", JsonBool(TRUE));
|
|
NuiSetBind(oPC, nToken, "btn_four_event", JsonBool(TRUE));
|
|
}
|
|
|