An addon that allows players to easily track and monitor items and key items on-screen. Useful for things such as Abyssea farming where needing multiple key items gets tedious to track. Includes a full UI editor for ease of use. http://ashita.atom0s.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

458 lines
18 KiB

--[[
* ItemWatch - Copyright (c) 2016 atom0s [[email protected]]
*
* This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or send a letter to
* Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
*
* By using ItemWatch, you agree to the above license and its terms.
*
* Attribution - You must give appropriate credit, provide a link to the license and indicate if changes were
* made. You must do so in any reasonable manner, but not in any way that suggests the licensor
* endorses you or your use.
*
* Non-Commercial - You may not use the material (ItemWatch) for commercial purposes.
*
* No-Derivatives - If you remix, transform, or build upon the material (ItemWatch), you may not distribute the
* modified material. You are, however, allowed to submit the modified works back to the original
* ItemWatch project in attempt to have it added to the original project.
*
* You may not apply legal terms or technological measures that legally restrict others
* from doing anything the license permits.
*
* No warranties are given.
]]--
require 'common';
require 'imguidef';
require 'helpers';
----------------------------------------------------------------------------------------------------
-- ListManager Module Table
----------------------------------------------------------------------------------------------------
local ListManager = {};
ListManager.watched_items = {};
ListManager.watched_keys = {};
ListManager.saved_lists = {};
----------------------------------------------------------------------------------------------------
-- func: items_watch_count
-- desc: Returns the total number of item watches.
----------------------------------------------------------------------------------------------------
function ListManager.items_watch_count()
return #ListManager.watched_items;
end
----------------------------------------------------------------------------------------------------
-- func: keys_watch_count
-- desc: Returns the total number of key item watches.
----------------------------------------------------------------------------------------------------
function ListManager.keys_watch_count()
return #ListManager.watched_keys;
end
----------------------------------------------------------------------------------------------------
-- func: total_watch_count
-- desc: Returns the total number of watches.
----------------------------------------------------------------------------------------------------
function ListManager.total_watch_count()
return #ListManager.watched_items + #ListManager.watched_keys;
end
----------------------------------------------------------------------------------------------------
-- func: add_watched_item
-- desc: Adds an item to the watched items list.
----------------------------------------------------------------------------------------------------
function ListManager.add_watched_item(itemid)
-- Ensure this item is unique..
for _, v in pairs(ListManager.watched_items) do
if (v[1] == itemid) then
msg(string.format('Cannot add item %d to the watch list; it is already being watched.', itemid));
return false;
end
end
-- Lookup the item name..
local item = AshitaCore:GetResourceManager():GetItemById(itemid);
if (item == nil or item.Name[0] == nil or string.len(item.Name[0]) < 2) then
msg(string.format('Cannot add item %d to the watch list; it appears to be invalid.', itemid));
return false;
end
-- Add the item to the watch list..
table.insert(ListManager.watched_items, { itemid, item.Name[0] });
msg(string.format('Added \'\30\05%s\30\01\' to the item watch list.', item.Name[0]));
end
----------------------------------------------------------------------------------------------------
-- func: delete_watched_item
-- desc: Deletes an item from the item watch list.
----------------------------------------------------------------------------------------------------
function ListManager.delete_watched_item(itemid)
-- Delete all watched items matching the given itemid..
for x = #ListManager.watched_items, 1, -1 do
if (ListManager.watched_items[x][1] == itemid) then
msg(string.format('Removed \'\30\05%s\30\01\' from the item watch list.', ListManager.watched_items[x][2]));
table.remove(ListManager.watched_items, x);
end
end
end
----------------------------------------------------------------------------------------------------
-- func: clear_watched_items
-- desc: Deletes all items from the item watch list.
----------------------------------------------------------------------------------------------------
function ListManager.clear_watched_items()
ListManager.watched_items = {};
msg('Cleared watched items list.');
end
----------------------------------------------------------------------------------------------------
-- func: add_watched_key
-- desc: Adds a key item to the watched keys list.
----------------------------------------------------------------------------------------------------
function ListManager.add_watched_key(keyid)
-- Ensure this key is unique..
for _, v in pairs(ListManager.watched_keys) do
if (v[1] == keyid) then
msg(string.format('Cannot add key item %d to the watch list; it is already being watched.', keyid));
return false;
end
end
-- Lookup the key item name..
local name = AshitaCore:GetResourceManager():GetString('keyitems', keyid);
if (name == nil or string.len(name) < 2) then
msg(string.format('Cannot add key item %d to the watch list; it appears to be invalid.', keyid));
return false;
end
-- Add the key item to the watch list..
table.insert(ListManager.watched_keys, { keyid, name });
msg(string.format('Added \'\30\05%s\30\01\' to the key item watch list.', name));
end
----------------------------------------------------------------------------------------------------
-- func: delete_watched_key
-- desc: Deletes a key item from the key item watch list.
----------------------------------------------------------------------------------------------------
function ListManager.delete_watched_key(keyid)
-- Delete all watched key items matching the given key item id..
for x = #ListManager.watched_keys, 1, -1 do
if (ListManager.watched_keys[x][1] == keyid) then
msg(string.format('Removed \'\30\05%s\30\01\' from the key item watch list.', ListManager.watched_keys[x][2]));
table.remove(ListManager.watched_keys, x);
end
end
end
----------------------------------------------------------------------------------------------------
-- func: clear_watched_keys
-- desc: Deletes all key items from the key item watch list.
----------------------------------------------------------------------------------------------------
function ListManager.clear_watched_keys()
ListManager.watched_keys = {};
msg('Cleared watched key items list.');
end
----------------------------------------------------------------------------------------------------
-- func: find_items
-- desc: Finds all items with the partial name match.
----------------------------------------------------------------------------------------------------
function ListManager.find_items(name)
local items = {};
for x = 0, 65535 do
local item = AshitaCore:GetResourceManager():GetItemById(x);
if (item ~= nil and item.Name[0] ~= nil and string.len(item.Name[0]) > 1) then
local n = tostring(item.Name[0]):lower();
if (n:contains(name)) then
table.insert(items, { x, item.Name[0] });
end
end
end
return items;
end
----------------------------------------------------------------------------------------------------
-- func: find_keys
-- desc: Finds all key items with the partial name match.
----------------------------------------------------------------------------------------------------
function ListManager.find_keyitems(name)
local keys = {};
for x = 0, 65535 do
local keyname = AshitaCore:GetResourceManager():GetString('keyitems', x);
if (keyname ~= nil and string.len(keyname) > 1) then
keyname = tostring(keyname):lower();
if (keyname:contains(name)) then
table.insert(keys, { x, keyname });
end
end
end
return keys;
end
----------------------------------------------------------------------------------------------------
-- func: refresh_saved_lists
-- desc: Refreshes the saved list table.
----------------------------------------------------------------------------------------------------
function ListManager.refresh_saved_lists()
ListManager.saved_lists = {};
-- Obtain a list of all list files..
local files = ashita.file.get_dir(_addon.path .. '/settings/lists/', '*.lst', false);
if (files == nil) then
msg('Failed to obtain saved lists.');
return;
end
-- Loop the found files and find all .lst files..
for _, v in pairs(files) do
if (v:endswith('.lst')) then
table.insert(ListManager.saved_lists, v);
end
end
end
----------------------------------------------------------------------------------------------------
-- func: save_list_new
-- desc: Saves the current watch data to a new list file.
----------------------------------------------------------------------------------------------------
function ListManager.save_list_new(name)
-- Validate the file name..
if (name == nil or string.len(name) < 2) then
msg('Invalid file name; cannot save new list.');
return;
end
-- Ensure the file does not already exist..
name = name .. '.lst';
if (ashita.file.file_exists(_addon.path .. '/settings/lists/' .. name)) then
msg('Cannot save new list file. File already exists.');
return;
end
-- Build the output json data..
local data = ashita.settings.JSON:encode_pretty({ items = ListManager.watched_items, keys = ListManager.watched_keys });
-- Open the file for writing..
local f = io.open(_addon.path .. '/settings/lists/' .. name, 'w');
if (f == nil) then
msg('Failed to create and open new list file for writing.');
return;
end
-- Save the data to the file..
f:write(data);
f:close();
msg(string.format('Saved the list data to: \'\30\05%s\30\01\'', name));
-- Refresh the saved lists table..
ListManager.refresh_saved_lists();
end
----------------------------------------------------------------------------------------------------
-- func: save_list_existing
-- desc: Saves the current watch data to an existing list file. (Or new if it doesn't exist.)
----------------------------------------------------------------------------------------------------
function ListManager.save_list_existing(index)
-- Validate the index..
if (index < 0 or #ListManager.saved_lists == 0) then
msg('You must select a list from the left!');
msg('If no lists are shown, press the refresh button or save as a new list instead.');
return;
end
-- Get the selected list..
local name = ListManager.saved_lists[index + 1];
if (name == nil) then
msg('Invalid file selected; cannot save new list.');
return;
end
-- Validate the file name..
if (name == nil or string.len(name) < 2) then
msg('Invalid file name; cannot save new list.');
return;
end
-- Build the output json data..
local data = ashita.settings.JSON:encode_pretty({ items = ListManager.watched_items, keys = ListManager.watched_keys });
-- Open the file for writing..
local f = io.open(_addon.path .. '/settings/lists/' .. name, 'w');
if (f == nil) then
msg('Failed to create and open new list file for writing.');
return;
end
-- Save the data to the file..
f:write(data);
f:close();
msg(string.format('Saved the list data to: \'\30\05%s\30\01\'', name));
-- Refresh the saved lists table..
ListManager.refresh_saved_lists();
end
----------------------------------------------------------------------------------------------------
-- func: load_list
-- desc: Loads a list file from disk and populates the managers watch data.
----------------------------------------------------------------------------------------------------
function ListManager.load_list(index)
-- Validate the index..
if (index < 0 or #ListManager.saved_lists == 0) then
msg('You must select a list from the left!');
msg('If no lists are shown, press the refresh button or save a new list instead.');
return;
end
-- Get the selected list..
local name = ListManager.saved_lists[index + 1];
if (name == nil) then
msg('Invalid file selected; cannot load list.');
return;
end
-- Ensure the selected file exists..
if (ashita.file.file_exists(_addon.path .. '/settings/lists/' .. name) == false) then
msg(string.format('Invalid list file; file was not found. \'\30\05%s\30\01\'', name));
return;
end
-- Load the list data..
local data = ashita.settings.load(_addon.path .. '/settings/lists/' .. name);
if (data == nil) then
msg(string.format('Invalid list file; failed to load file data. \'\30\05%s\30\01\'', name));
return;
end
-- Clear the current watch data..
ListManager.watched_items = {};
ListManager.watched_keys = {};
-- Populate the watched items..
if (data.items ~= nil) then
ListManager.watched_items = data.items;
end
-- Populate the watched key items..
if (data.keys ~= nil) then
ListManager.watched_keys = data.keys;
end
msg(string.format('Loaded list file: \'\30\05%s\30\01\'', name));
end
----------------------------------------------------------------------------------------------------
-- func: load_list_merged
-- desc: Loads a list file from disk and merges its data into the managers watch data.
----------------------------------------------------------------------------------------------------
function ListManager.load_list_merged(index)
-- Validate the index..
if (index < 0 or #ListManager.saved_lists == 0) then
msg('You must select a list from the left!');
msg('If no lists are shown, press the refresh button or save a new list instead.');
return;
end
-- Get the selected list..
local name = ListManager.saved_lists[index + 1];
if (name == nil) then
msg('Invalid file selected; cannot load list.');
return;
end
-- Ensure the selected file exists..
if (ashita.file.file_exists(_addon.path .. '/settings/lists/' .. name) == false) then
msg(string.format('Invalid list file; file was not found. \'\30\05%s\30\01\'', name));
return;
end
-- Load the list data..
local data = ashita.settings.load(_addon.path .. '/settings/lists/' .. name);
if (data == nil) then
msg(string.format('Invalid list file; failed to load file data. \'\30\05%s\30\01\'', name));
return;
end
-- Populate the watched items..
if (data.items ~= nil) then
for _, v in pairs(data.items) do
ListManager.add_watched_item(v[1]);
end
end
-- Populate the watched key items..
if (data.keys ~= nil) then
for _, v in pairs(data.keys) do
ListManager.add_watched_key(v[1]);
end
end
msg(string.format('Loaded list file (merged): \'\30\05%s\30\01\'', name));
end
----------------------------------------------------------------------------------------------------
-- func: delete_list
-- desc: Deletes a list file on disk.
----------------------------------------------------------------------------------------------------
function ListManager.delete_list(index)
-- Validate the index..
if (index < 0 or #ListManager.saved_lists == 0) then
msg('You must select a list from the left!');
msg('If no lists are shown, press the refresh button or save a new list instead.');
return;
end
-- Get the selected list..
local name = ListManager.saved_lists[index + 1];
if (name == nil) then
msg('Invalid file selected; cannot delete list.');
return;
end
-- Ensure the selected file exists..
if (ashita.file.file_exists(_addon.path .. '/settings/lists/' .. name) == false) then
msg(string.format('Invalid list file; file was not found. \'\30\05%s\30\01\'', name));
return;
end
-- Delete the file..
os.remove(_addon.path .. '/settings/lists/' .. name);
-- Refresh the saved lists table..
ListManager.refresh_saved_lists();
end
----------------------------------------------------------------------------------------------------
-- func: delete_all_lists
-- desc: Deletes all list files on disk.
----------------------------------------------------------------------------------------------------
function ListManager.delete_all_lists()
-- Obtain a list of all list files..
local files = file:get_dir(_addon.path .. '/settings/lists/');
if (files == nil) then
return;
end
-- Loop the found files and delete all .lst files..
for _, v in pairs(files) do
if (v:endswith('.lst')) then
os.remove(_addon.path .. '/settings/lists/' .. v);
end
end
-- Refresh the saved lists table..
ListManager.refresh_saved_lists();
msg('Deleted all saved lists.');
end
-- Return the module table..
return ListManager;