MMD_PRC8/_module/nss/pi_henchmen.nss
Jaysyn904 d77404f157 2025/07/15 Update
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.
2025-07-15 22:19:46 -04:00

210 lines
11 KiB
Plaintext

/*//////////////////////////////////////////////////////////////////////////////
// Script Name: pi_henchmen
////////////////////////////////////////////////////////////////////////////////
Executable plug in script for Philos Module Extentions.
UI to save a players as Henchmen.
*///////////////////////////////////////////////////////////////////////////////
#include "pinc_henchmen"
// Does startup check if the game has just been loaded.
int StartingUp(object oPC);
// Inserts base classes to an array for a combo box.
json JArrayInsertBaseClasses();
void main()
{
object oPC = OBJECT_SELF;
if(StartingUp(oPC)) return;
// 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) ********************************************************* 775 / 73
json jRow = CreateButtonSelect(JsonArray(), "Party 1", "btn_party1", 90.0f, 20.0f);
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Party 2", "btn_party2", 90.0f, 20.0f);
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Party 3", "btn_party3", 90.0f, 20.0f);
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Party 4", "btn_party4", 90.0f, 20.0f);
jRow = CreateButtonSelect(jRow, "Party 5", "btn_party5", 90.0f, 20.0f);
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Party 6", "btn_party6", 90.0f, 20.0f);
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Party 7", "btn_party7", 90.0f, 20.0f);
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Party 8", "btn_party8", 90.0f, 20.0f);
// Add the row to the column.
json jCol = JsonArrayInsert(JsonArray(), NuiRow(jRow));
// Row 2 (Options)********************************************************** 775 / 101
jRow = CreateButton(JsonArray(), "Clear Party", "btn_clear_party", 120.0f, 20.0f, -1.0, "btn_clear_party_tooltip");
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButton(jRow, "Party Join", "btn_join_party", 120.0f, 20.0f, -1.0, "btn_join_party_tooltip");
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButtonSelect(jRow, "Create NPC Henchman", "btn_npc_henchman", 200.0f, 20.0f, "btn_npc_henchman_tooltip");
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButton(jRow, "Save Party", "btn_save_party", 120.0f, 20.0f, -1.0, "btn_save_party_tooltip");
jRow = JsonArrayInsert(jRow, NuiSpacer());
jRow = CreateButton(jRow, "Remove Party", "btn_remove_party", 120.0f, 20.0f, -1.0, "btn_remove_party_tooltip");
// Add the row to the column.
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
// Row 3 (Names and List titles) ******************************************* 775 / 124
jRow = CreateLabel(JsonArray(), "", "lbl_save_char", 150.0, 15.0, 0, 0);
jRow = CreateLabel(jRow, "", "lbl_save_list", 200.0, 15.0, 0, 0);
jRow = CreateLabel(jRow, "In game party", "lbl_game_list", 200.0, 15.0, 0, 0);
jRow = CreateLabel(jRow, "", "lbl_game_char", 150.0, 15.0, 0, 0);
// Add the row to the column.
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
// Row 4 (List Characters) ************************************************* 775 / 488 (364)
// Saved Characters for Party #
// ***** Adding character saved group next to the button list **************
json jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer());
jGroupRow = CreateImage(jGroupRow, "", "img_saved_portrait", NUI_ASPECT_EXACTSCALED, NUI_HALIGN_CENTER, NUI_VALIGN_TOP, 128.0, 200.0, 0.0);
jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer());
json jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow));
jGroupRow = CreateLabel(JsonArray(), "", "lbl_saved_stats", 150.0, 15.0, 0, 0, 0.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jGroupRow = CreateLabel(JsonArray(), "", "lbl_saved_classes", 150.0, 15.0, 0, 0, 0.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jGroupRow = CreateButton(JsonArray(), "", "btn_saved_join", 75.0, 20.0);
jGroupRow = CreateButton(jGroupRow, "Remove", "btn_saved_remove", 75.0, 20.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
//jGroupRow = JsonArray();
//CreateButton(jGroupRow, "Edit", "btn_saved_edit", 150.0, 20.0);
//jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jRow = JsonArrayInsert(JsonArray(), NuiGroup(NuiCol(jGroupCol)));
// Create the button template for the List.
json jButton = NuiId(NuiButton(NuiBind ("btns_saved_char")), "btn_saved_char");
json jList = JsonArrayInsert(JsonArray (), NuiListTemplateCell(jButton, 170.0, TRUE));
// Create the list with the template.
jRow = CreateList(jRow, jList, "btns_saved_char", 25.0, 200.0, 325.0);
// Current Characters.
// Create the button template for the List.
jButton = NuiId(NuiButton(NuiBind ("btns_cur_char")), "btn_cur_char");
jList = JsonArrayInsert(JsonArray (), NuiListTemplateCell(jButton, 170.0, TRUE));
// Create the list with the template.
jRow = CreateList(jRow, jList, "btns_cur_char", 25.0, 200.0, 325.0);
// ***** Adding character current group next to the button list ************
jGroupRow = JsonArrayInsert(JsonArray(), NuiSpacer());
jGroupRow = CreateImage(jGroupRow, "", "img_cur_portrait", NUI_ASPECT_EXACTSCALED, NUI_HALIGN_CENTER, NUI_VALIGN_TOP, 128.0, 200.0, 0.0);
jGroupRow = JsonArrayInsert(jGroupRow, NuiSpacer());
jGroupCol = JsonArrayInsert(JsonArray(), NuiRow(jGroupRow));
jGroupRow = CreateLabel(JsonArray(), "", "lbl_cur_stats", 150.0, 15.0, 0, 0, 0.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jGroupRow = CreateLabel(JsonArray(), "", "lbl_cur_classes", 150.0, 15.0, 0, 0, 0.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jGroupRow = CreateButton(JsonArray(), "", "btn_cur_save", 75.0, 20.0);
jGroupRow = CreateButton(jGroupRow, "Remove", "btn_cur_remove", 75.0, 20.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jGroupRow = CreateButton(JsonArray(), "Edit", "btn_cur_edit", 150.0, 20.0);
jGroupCol = JsonArrayInsert(jGroupCol, NuiRow(jGroupRow));
jRow = JsonArrayInsert(jRow, NuiGroup(NuiCol(jGroupCol)));
// Add the row to the column.
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
// Set the layout of the window.
json jLayout = NuiCol(jCol);
// Get the window location to restore it from the database.
CheckHenchmanDataAndInitialize(oPC, "0");
json jData = GetHenchmanDbJson(oPC, "henchman", "0");
json jGeometry = JsonObjectGet(jData, "henchman_nui");
float fX = JsonGetFloat(JsonObjectGet(jGeometry, "x"));
float fY = JsonGetFloat(JsonObjectGet(jGeometry, "y"));
if(fX == 0.0 && fY == 0.0)
{
fX = -1.0;
fY = -1.0;
}
string sName = GetName(oPC);
if(GetStringRight(sName, 1) == "s") sName = sName + "'";
else sName = sName + "'s";
int nToken = SetWindow (oPC, jLayout, "henchman_nui", sName + " party",
fX, fY, 775.0, 488.0, FALSE, FALSE, TRUE, FALSE, TRUE, "pe_henchmen");
// Lets set MaxHenchman here.
if(GetMaxHenchmen() < 6) SetMaxHenchmen(6);
// Setup watch for saving location.
NuiSetBindWatch (oPC, nToken, "window_geometry", TRUE);
// Set the elements to show events.
NuiSetBind(oPC, nToken, "btn_save_pc_event", JsonBool (TRUE));
NuiSetBind(oPC, nToken, "btn_current_party_event", JsonBool (TRUE));
string sParty = GetHenchmanDbString(oPC, "henchname", "0");
if(sParty == "")
{
SetHenchmanDbString(oPC, "henchname", "1", "0");
sParty = "1";
}
// Set the party # buttons.
int nIndex;
string sIndex;
for(nIndex = 1; nIndex < 9; nIndex++)
{
sIndex = IntToString(nIndex);
if(sParty == sIndex) NuiSetBind(oPC, nToken, "btn_party" + sIndex, JsonBool(TRUE));
else NuiSetBind(oPC, nToken, "btn_party" + sIndex, JsonBool(FALSE));
NuiSetBind(oPC, nToken, "btn_party" + sIndex + "_event", JsonBool (TRUE));
}
NuiSetBind(oPC, nToken, "btn_npc_henchman_event", JsonBool(TRUE));
string sText = " Select a creature to copy and have them join you.";
NuiSetBind(oPC, nToken, "btn_npc_henchman_tooltip", JsonString(sText));
// ********** Saved Henchman in party # *********
nIndex = 0;
int nSlot, nMaxHenchman = AI_MAX_HENCHMAN + 1;
json jButtons = JsonArray();
string sFirstHenchman, sButtonText;
json jNPCs, jNPC;
// Add saved party members from sParty to the button list.
while(nIndex < nMaxHenchman)
{
sIndex = IntToString(nIndex);
sButtonText = GetHenchmanDbString(oPC, "henchname", sParty + sIndex);
if(sButtonText != "")
{
jButtons = JsonArrayInsert(jButtons, JsonString(sButtonText));
SetHenchmanDbString(oPC, "slot", sParty + IntToString(nSlot++), sParty + sIndex);
}
nIndex++;
}
// Add the buttons to the list.
NuiSetBind(oPC, nToken, "btns_saved_char", jButtons);
// Set up button lables for henchman.
NuiSetBind(oPC, nToken, "lbl_save_list_label", JsonString("Party Save " + sParty));
AddSavedCharacterInfo(oPC, nToken, sParty);
// ********** Current Party *********
NuiSetBind(oPC, nToken, "btn_current_party", JsonBool(TRUE));
NuiSetBind(oPC, nToken, "btn_clear_party", JsonBool(FALSE));
NuiSetBind(oPC, nToken, "lbl_save_char", JsonBool(TRUE));
// Set up button labels for henchman.
NuiSetBind(oPC, nToken, "btn_join_save_label", JsonString("Save"));
nIndex = 0;
jButtons = JsonArray();
object oPartyMember, oCharacter = OBJECT_INVALID;
// Add current party members to the button list.
while(nIndex < AI_MAX_HENCHMAN)
{
if(nIndex == 0) oPartyMember = oPC;
else oPartyMember = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC, nIndex);
if(oPartyMember != OBJECT_INVALID) jButtons = JsonArrayInsert(jButtons, JsonString(GetName(oPartyMember)));
else break;
nIndex++;
}
// Add the buttons to the list.
NuiSetBind(oPC, nToken, "btns_cur_char", jButtons);
AddCurrentCharacterInfo(oPC, nToken, sParty);
}
int StartingUp(object oPC)
{
if(GetLocalInt(oPC, AI_ADD_PLUGIN))
{
json jPlugin = JsonArray();
jPlugin = JsonArrayInsert(jPlugin, JsonString("pi_henchmen"));
jPlugin = JsonArrayInsert(jPlugin, JsonInt(FALSE));
jPlugin = JsonArrayInsert(jPlugin, JsonString("Henchmen Menu"));
jPlugin = JsonArrayInsert(jPlugin, JsonString("dm_creator"));
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;
return TRUE;
}