Перейти к содержанию

Собственный гамп книги рун (Custom gump runebook)

Материал из Wiki Legnes
Версия от 17:28, 9 декабря 2024; Support (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Скрипт для 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();
	}
}