MMD_PRC8/_module/nss/pi_buffing.nss

339 lines
17 KiB
Plaintext
Raw Normal View History

/*//////////////////////////////////////////////////////////////////////////////
// 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));
}