Собственный гамп книги рун (Custom gump runebook)
Внешний вид
Скрипт для Legnes/Orion Assist. Скрипт позволяет настроить гамп книги рун Rune book, как нужно именно вам.
Автор скрипта: Hotride
// -------- User options --------
// File path to store runebook data
var CustomRunebookFilePath = Orion.CurrentScriptDirPath() + '/runebook_' + Player.Serial() + '.json';
// Gump width
var CustomRunebookWidth = 260;
// Gump height
var CustomRunebookHeight = 400;
// Array of HTML colors ('#ARGB' or 'colorname') for runes background, minimum 1 color
var CustomRunebookBackgroundColors = [ '#0FFFFFFF', '#0F111111' ];
//var CustomRunebookBackgroundColors = [ '#0FFF0000', '#0F00FF00', '#0F0000FF' ];
// Font number (which the client used), used for adaptive text offsets
var CustomRunebookFontIndex = 0;
// -------- Don't touch this options please :) --------
var CustomRunebookSerial = 666;
var CustomRunebookGroupOffset = 100;
var CustomRunebookAddButtonOffset = 1000;
var CustomRunebookRecallButtonOffset = 2000;
var CustomRunebookGateButtonOffset = 3000;
var CustomRunebookMarkButtonOffset = 4000;
var CustomRunebookRemoveButtonOffset = 5000;
var CustomRunebookUpdateNameButtonOffset = 6000;
var DefaultCustomRunebook = { groups: [ { name: "default group", opened: 1, runes: [] } ] };
// Create custom runebook gump
function CustomRunebook()
{
//First initialization
if (!Shared.GetVar('CustomRunebookInitialized', 0))
{
InitializeCustomRunebook(0);
Shared.AddVar('CustomRunebookInitialized', 1);
}
// Create new custom gump
var gump = Orion.CreateCustomGump(CustomRunebookSerial);
// This gump will be no closible by a right mouse click
gump.SetNoClose(true);
// Clear gump contents (for rebuilds)
gump.Clear();
// Set callback function
gump.SetCallback('HandleCustomRunebook');
// Default page must be 1
gump.SetPage(1);
gump.AddPage(1);
// Minimizer
gump.AddButton(4, CustomRunebookWidth / 2 + 20, -19, '0x082D', '0x082D', '0x082D', '0', 0, 2);
gump.AddTooltip('Minimize the gump');
// Background
gump.AddResizepic(0, 0, '0x09D8', CustomRunebookWidth + 26 + 34, CustomRunebookHeight + 36 + 40);
gump.AddText(36, 10, '0', "The Legnes Runebook v1.0");
gump.AddText(36, CustomRunebookHeight + 46, '0', "by Hotride");
// Manage options button
if (CustomRunebookFontIndex == 1)
{
gump.AddResizepic(CustomRunebookWidth - 50, CustomRunebookHeight + 46, '0x24EA', 96, 20, 2, 1);
gump.AddText(CustomRunebookWidth - 42, CustomRunebookHeight + 46, '0', "Manage groups");
}
else
{
gump.AddResizepic(CustomRunebookWidth - 74, CustomRunebookHeight + 46, '0x24EA', 120, 20, 2, 1);
gump.AddText(CustomRunebookWidth - 66, CustomRunebookHeight + 46, '0', "Manage groups");
}
// HTML gump with runes
gump.AddHtmlGump(1, 26, 36, CustomRunebookWidth, CustomRunebookHeight, '0x0BB8', 0);
//Get custom runebook content
var runebook = Shared.GetVar('CustomRunebookData', DefaultCustomRunebook);
// Loop for groups
for (var g = 0; g < runebook.groups.length; g++)
{
gump.Select('htmlgump', 1);
var group = runebook.groups[g];
gump.AddSpoiler(g + CustomRunebookGroupOffset, 0, g * 22, group.opened ? 0 : 1, CustomRunebookWidth - 12, '0x0827', '0x0827', '0x0827', '0x0826', '0x0826', '0x0826');
gump.SetSpoilerText(group.name, '0', '0x0035', '0x0021');
gump.Select('spoiler', g + CustomRunebookGroupOffset);
gump.AddButton(g + CustomRunebookAddButtonOffset, CustomRunebookWidth - 84, 0, '0x099C', '0x099E', '0x099D', '0');
gump.AddText(CustomRunebookWidth - (CustomRunebookFontIndex == 1 ? 164 : 180), -4, '0', "Add new rune");
// Pack group offset
var groupOffset = (g << 24);
var y = 20;
for (var rune = 0; rune < group.runes.length; rune++)
{
gump.AddLine(-18, y - 2, CustomRunebookWidth - 34, y - 2, 'black');
gump.AddText(-18, y, '0', '<img src="gump:0x08DF" width=20 height=20>');
gump.AddHitBox(CustomRunebookRecallButtonOffset + groupOffset + rune, -18, y, 20, 20, 1);
gump.AddTooltip('Recall');
gump.AddText(4, y, '0', '<img src="gump:0x08F3" width=20 height=20>');
gump.AddHitBox(CustomRunebookGateButtonOffset + groupOffset + rune, 4, y, 20, 20, 1);
gump.AddTooltip('Open gate');
gump.AddText(CustomRunebookWidth - 58, y, '0', '<img src="gump:0x08EC" width=20 height=20>');
gump.AddHitBox(CustomRunebookMarkButtonOffset + groupOffset + rune, CustomRunebookWidth - 58, y, 20, 20, 1);
gump.AddTooltip('Mark');
gump.AddBlending(1);
gump.AddColoredPolygone(25, y + 1, CustomRunebookWidth - 84, 20, CustomRunebookBackgroundColors[rune % CustomRunebookBackgroundColors.length]);
gump.AddBlending(0);
gump.AddText(26, y, '0', group.runes[rune].name);
y += 26;
}
//Reset selection to gump and reselect HTML gump
gump.Select('gump');
}
gump.AddPage(2);
// Maximizer
if (CustomRunebookFontIndex == 1)
gump.AddResizepic(0, 0, '0x24EA', 66, 20, 5, 1);
else
gump.AddResizepic(0, 0, '0x24EA', 78, 20, 5, 1);
gump.AddText(8, 1, '0', "Runebook");
// Commit gump changes and update it in client
gump.Update();
}
// Custom runebook gump response handler
function HandleCustomRunebook(_private)
{
var code = CustomGumpResponse.ReturnCode();
var runebook = Shared.GetVar('CustomRunebookData', DefaultCustomRunebook);
// Cache spoilers status
for (var g = 0; g < runebook.groups.length; g++)
{
runebook.groups[g].opened = (CustomGumpResponse.Spoiler(g + CustomRunebookGroupOffset) ? 1 : 0);
}
if (code == 0) // Close the gump (unused now)
{
var gump = Orion.CreateCustomGump(CustomRunebookSerial);
gump.Close();
}
else if (code == 2) // Manage groups
{
Shared.AddVar('CustomRunebookData', runebook);
SaveCustomRunebook(0);
ManageCustomRunebook(0);
}
else if (code == 5) // Maximize the gump
{
var gump = Orion.CreateCustomGump(CustomRunebookSerial);
gump.SetPage(1);
gump.Update();
}
else if (code >= CustomRunebookAddButtonOffset && code < CustomRunebookRecallButtonOffset) // Add rune
{
Orion.Print('Select a recall rune to save it in the runebook.');
//Selected is not a game object
if (Orion.WaitForAddObject('temprune') != 1)
return;
var group = code - CustomRunebookAddButtonOffset;
if (group >= 0 && group < runebook.groups.length)
{
var runeSerial = Orion.GetSerial('temprune');
for (var i = 0; i < runebook.groups[group].runes.length; i++)
{
if (runebook.groups[group].runes[i].serial == runeSerial)
{
Orion.Print('0x0021', 'Rune is already added in this group: #' + (i + 1) + ' ' + runebook.groups[group].runes[i].name);
return;
}
}
Orion.ResetName(runeSerial);
var runeName = Orion.RequestName(runeSerial, 1000);
runebook.groups[group].runes.push({ serial: runeSerial, name: runeName });
Shared.AddVar('CustomRunebookData', runebook);
SaveCustomRunebook(0);
CustomRunebook();
}
}
else
{
// Unpack group offset
var group = (code >> 24) & 0xFF;
if (group >= 0 && group < runebook.groups.length)
{
code = code & 0x00FFFFFF;
if (code >= CustomRunebookRecallButtonOffset && code < CustomRunebookUpdateNameButtonOffset) // Recall/Gate Travel/Mark/Remove/UpdateName
{
var spell = 'Recall';
if (code >= CustomRunebookMarkButtonOffset)
{
spell = 'Mark';
code -= CustomRunebookMarkButtonOffset;
}
else if (code >= CustomRunebookGateButtonOffset)
{
spell = 'Gate Travel';
code -= CustomRunebookGateButtonOffset;
}
else //if (code >= CustomRunebookRecallButtonOffset)
code -= CustomRunebookRecallButtonOffset;
// Unpack rune offset
var rune = code & 0x00FFFFFF;
if (rune >= 0 && rune < runebook.groups[group].runes.length)
{
Orion.Cast(spell, runebook.groups[group].runes[rune].serial);
Shared.AddVar('CustomRunebookData', runebook);
SaveCustomRunebook(0);
}
}
}
}
}
// Create custom runebook manage gump
function ManageCustomRunebook(_private)
{
// Create new custom gump
var gump = Orion.CreateCustomGump(CustomRunebookSerial);
// This gump will be no closible by a right mouse click
gump.SetNoClose(true);
gump.SetPage(0);
// Clear gump contents (for rebuilds)
gump.Clear();
// Set callback function
gump.SetCallback('HandleManageCustomRunebook');
// Background
gump.AddResizepic(0, 0, '0x09D8', CustomRunebookWidth + 26 + 34, CustomRunebookHeight + 36 + 40);
gump.AddText(36, 10, '0', "The Legnes Runebook v1.0");
gump.AddText(36, CustomRunebookHeight + 46, '0', "by Hotride");
if (CustomRunebookFontIndex == 1)
{
gump.AddResizepic(CustomRunebookWidth - 30, 9, '0x24EA', 72, 20, 2, 1);
gump.AddText(CustomRunebookWidth - 22, 9, '0', "Add group");
}
else
{
gump.AddResizepic(CustomRunebookWidth - 40, 9, '0x24EA', 82, 20, 2, 1);
gump.AddText(CustomRunebookWidth - 32, 9, '0', "Add group");
}
// Close editor button
gump.AddResizepic(CustomRunebookWidth / 2 + 4, CustomRunebookHeight + 46, '0x24EA', 46, 20, 3, 1);
gump.AddText(CustomRunebookWidth / 2 + 12, CustomRunebookHeight + 46, '0', "Close");
// HTML gump section
gump.AddHtmlGump(1, 26, 36, CustomRunebookWidth, CustomRunebookHeight, '0x0BB8', 0);
//Get custom runebook content
var runebook = Shared.GetVar('CustomRunebookData', DefaultCustomRunebook);
for (var g = 0; g < runebook.groups.length; g++)
{
gump.Select('htmlgump', 1);
var groups = runebook.groups[g];
gump.AddSpoiler(g + CustomRunebookGroupOffset, 0, g * 22, groups.opened ? 0 : 1, CustomRunebookWidth - 12, '0x0827', '0x0827', '0x0827', '0x0826', '0x0826', '0x0826');
gump.Select('spoiler', g + CustomRunebookGroupOffset);
gump.AddResizepic(0, -14, '0x0BB8', CustomRunebookWidth - 38 - 35, 18);
gump.AddTextEntry(g + CustomRunebookGroupOffset, 3, -15, '0x0035', groups.name, CustomRunebookWidth - 44 - 35, 16);
gump.SetTextEntryPlaceholderText('Group name', '0x0022');
gump.AddTooltip('Group name');
gump.AddButton(g + CustomRunebookGroupOffset, CustomRunebookWidth - 70, - 17, '0x0FB1', '0x0FB2', '0x0FB3', '0');
gump.AddTooltip('Remove this group');
// Pack group offset
var groupOffset = (g << 24);
var y = 10;
for (var rune = 0; rune < groups.runes.length; rune++)
{
gump.AddLine(-19, y - 2, CustomRunebookWidth - 34, y - 2, 'black');
gump.AddButton(CustomRunebookRemoveButtonOffset + groupOffset + rune, -20, y - 2, '0x0FB1', '0x0FB2', '0x0FB3', '0');
gump.AddTooltip('Remove this rune');
gump.AddResizepic(12, y, '0x0BB8', CustomRunebookWidth - 50 - 32, 18);
gump.AddTextEntry(CustomRunebookRecallButtonOffset + groupOffset + rune, 15, y, '0x0052', groups.runes[rune].name, CustomRunebookWidth - 56 - 32, 16);
gump.SetTextEntryPlaceholderText('Rune name');
gump.AddTooltip('Rune name');
gump.AddButton(CustomRunebookUpdateNameButtonOffset + groupOffset + rune, CustomRunebookWidth - 32 - 36, y - 2, '0x0FBA', '0x0FBB', '0x0FBC', '0');
gump.AddTooltip('Update this rune name (rune must be in your pack)');
y += 24;
}
//Reset selection to gump and reselect HTML gump
gump.Select('gump');
}
// Commit gump changes and update it in client
gump.Update();
}
// Manage custom runebook gump response handler
function HandleManageCustomRunebook(_private)
{
var code = CustomGumpResponse.ReturnCode();
var runebook = Shared.GetVar('CustomRunebookData', DefaultCustomRunebook);
var removeGroupIndex = -1;
var neerRebuild = false;
// Cache spoilers statuses and groups/runes names
for (var g = 0; g < runebook.groups.length; g++)
{
// Clicked on remove group button
if (code == g + CustomRunebookGroupOffset)
{
removeGroupIndex = g;
neerRebuild = true;
continue;
}
runebook.groups[g].opened = (CustomGumpResponse.Spoiler(g + CustomRunebookGroupOffset) ? 1 : 0);
runebook.groups[g].name = CustomGumpResponse.Text(g + CustomRunebookGroupOffset);
var groupOffset = (g << 24);
var removeIndex = -1;
for (var rune = 0; rune < runebook.groups[g].runes.length; rune++)
{
// Clicked on remove rune button
if (code == CustomRunebookRemoveButtonOffset + groupOffset + rune)
removeIndex = rune;
// Clicked on remove rune button
else if (code == CustomRunebookUpdateNameButtonOffset + groupOffset + rune)
{
Orion.CancelWaitPrompt();
Orion.WaitPrompt(runebook.groups[g].runes[rune].name);
Orion.UseObject(runebook.groups[g].runes[rune].serial);
}
else
runebook.groups[g].runes[rune].name = CustomGumpResponse.Text(CustomRunebookRecallButtonOffset + groupOffset + rune);
}
if (removeIndex != -1)
{
runebook.groups[g].runes.splice(removeIndex, 1);
neerRebuild = true;
}
}
if (removeGroupIndex != -1)
runebook.groups.splice(removeGroupIndex, 1);
if (code == 2) // Add new group
{
runebook.groups.push({ name: "new group", opened: 1, runes: [] });
Shared.AddVar('CustomRunebookData', runebook);
SaveCustomRunebook(0);
ManageCustomRunebook(0);
return;
}
Shared.AddVar('CustomRunebookData', runebook);
SaveCustomRunebook(0);
if (code == 0 || code == 3) // Close gump
CustomRunebook();
else if (neerRebuild)
ManageCustomRunebook(0);
}
// First initialization for custom runebook gump
function InitializeCustomRunebook(_private)
{
var runebook = Shared.GetVar('CustomRunebookData', DefaultCustomRunebook);
var file = Orion.NewFile();
if (file.Open(CustomRunebookFilePath, true))
{
var temp = JSON.parse(file.ReadAll());
file.Close();
if (temp.groups.length > 0)
runebook = temp;
}
Shared.AddVar('CustomRunebookData', runebook);
}
// Save cached runebook in to the file
function SaveCustomRunebook(_private)
{
var file = Orion.NewFile();
file.Remove(CustomRunebookFilePath);
if (file.Open(CustomRunebookFilePath))
{
file.Write(JSON.stringify(Shared.GetVar('CustomRunebookData', DefaultCustomRunebook)));
file.Close();
}
}