From f4068c4eea47e9be5139d78d29186ba157de0e38 Mon Sep 17 00:00:00 2001 From: Dean James Date: Mon, 13 Jan 2020 22:53:30 +0000 Subject: [PATCH 1/4] Added EmpyPopTracker addon. --- addons/EmpyPopTracker/EmpyPopTracker.lua | 339 +++++++++++++++++++++ addons/EmpyPopTracker/README.md | 53 ++++ addons/EmpyPopTracker/nms/README.md | 62 ++++ addons/EmpyPopTracker/nms/alfard.lua | 59 ++++ addons/EmpyPopTracker/nms/apademak.lua | 58 ++++ addons/EmpyPopTracker/nms/azdaja.lua | 37 +++ addons/EmpyPopTracker/nms/briareus.lua | 66 ++++ addons/EmpyPopTracker/nms/bukhis.lua | 59 ++++ addons/EmpyPopTracker/nms/carabosse.lua | 55 ++++ addons/EmpyPopTracker/nms/chloris.lua | 114 +++++++ addons/EmpyPopTracker/nms/cirein-croin.lua | 48 +++ addons/EmpyPopTracker/nms/dragua.lua | 37 +++ addons/EmpyPopTracker/nms/glavoid.lua | 83 +++++ addons/EmpyPopTracker/nms/index.lua | 54 ++++ addons/EmpyPopTracker/nms/isgebind.lua | 37 +++ addons/EmpyPopTracker/nms/itzpapalotl.lua | 59 ++++ addons/EmpyPopTracker/nms/kukulkan.lua | 66 ++++ addons/EmpyPopTracker/nms/orthrus.lua | 58 ++++ addons/EmpyPopTracker/nms/sedna.lua | 48 +++ addons/EmpyPopTracker/nms/sobek.lua | 59 ++++ addons/EmpyPopTracker/nms/ulhuadshi.lua | 48 +++ addons/EmpyPopTracker/readme/demo-full.png | Bin 0 -> 26460 bytes addons/EmpyPopTracker/readme/demo.png | Bin 0 -> 22426 bytes 23 files changed, 1499 insertions(+) create mode 100644 addons/EmpyPopTracker/EmpyPopTracker.lua create mode 100644 addons/EmpyPopTracker/README.md create mode 100644 addons/EmpyPopTracker/nms/README.md create mode 100644 addons/EmpyPopTracker/nms/alfard.lua create mode 100644 addons/EmpyPopTracker/nms/apademak.lua create mode 100644 addons/EmpyPopTracker/nms/azdaja.lua create mode 100644 addons/EmpyPopTracker/nms/briareus.lua create mode 100644 addons/EmpyPopTracker/nms/bukhis.lua create mode 100644 addons/EmpyPopTracker/nms/carabosse.lua create mode 100644 addons/EmpyPopTracker/nms/chloris.lua create mode 100644 addons/EmpyPopTracker/nms/cirein-croin.lua create mode 100644 addons/EmpyPopTracker/nms/dragua.lua create mode 100644 addons/EmpyPopTracker/nms/glavoid.lua create mode 100644 addons/EmpyPopTracker/nms/index.lua create mode 100644 addons/EmpyPopTracker/nms/isgebind.lua create mode 100644 addons/EmpyPopTracker/nms/itzpapalotl.lua create mode 100644 addons/EmpyPopTracker/nms/kukulkan.lua create mode 100644 addons/EmpyPopTracker/nms/orthrus.lua create mode 100644 addons/EmpyPopTracker/nms/sedna.lua create mode 100644 addons/EmpyPopTracker/nms/sobek.lua create mode 100644 addons/EmpyPopTracker/nms/ulhuadshi.lua create mode 100644 addons/EmpyPopTracker/readme/demo-full.png create mode 100644 addons/EmpyPopTracker/readme/demo.png diff --git a/addons/EmpyPopTracker/EmpyPopTracker.lua b/addons/EmpyPopTracker/EmpyPopTracker.lua new file mode 100644 index 000000000..6fd546248 --- /dev/null +++ b/addons/EmpyPopTracker/EmpyPopTracker.lua @@ -0,0 +1,339 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +_addon.name = "Empy Pop Tracker" +_addon.author = "Dean James (Xurion of Bismarck)" +_addon.commands = { "ept", "empypoptracker" } +_addon.version = "2.0.0" + +config = require("config") +res = require("resources") +nm_data = require("nms/index") + +active = false + +local EmpyPopTracker = {} + +local defaults = {} +defaults.text = {} +defaults.text.pos = {} +defaults.text.pos.x = 0 +defaults.text.pos.y = 0 +defaults.text.bg = {} +defaults.text.bg.alpha = 150 +defaults.text.bg.blue = 0 +defaults.text.bg.green = 0 +defaults.text.bg.red = 0 +defaults.text.bg.visible = true +defaults.text.padding = 8 +defaults.text.text = {} +defaults.text.text.font = "Consolas" +defaults.text.text.size = 10 +defaults.tracking = "briareus" +defaults.visible = true + +EmpyPopTracker.settings = config.load(defaults) +EmpyPopTracker.text = require("texts").new(EmpyPopTracker.settings.text, EmpyPopTracker.settings) + +colors = {} +colors.success = "\\cs(100,255,100)" +colors.danger = "\\cs(255,50,50)" +colors.warning = "\\cs(255,170,0)" +colors.close = "\\cr" + +function owns_item(id, items) + local owned = false + + -- Loop maximum 80 times over all slots. 80 indexes are returned for each bag regardless of max capacity. + for i = 1, 80, 1 do + if items.safe[i].id == id or + items.safe2[i].id == id or + items.locker[i].id == id or + items.sack[i].id == id or + items.satchel[i].id == id or + items.inventory[i].id == id or + items.storage[i].id == id then + owned = true + break + end + end + + return owned +end + +function owns_key_item(id, items) + local owned = false + + for _, item_id in pairs(items) do + if item_id == id then + owned = true + break + end + end + + return owned +end + +function item_treasure_pool_count(id, treasure) + local count = 0 + + for _, item in pairs(treasure) do + if item.item_id == id then + count = count + 1 + end + end + + return count +end + +function ucwords(str) + return string.gsub(str, "(%a)([%w_']*)", function(first, rest) + return first:upper() .. rest:lower() + end) +end + +function get_indent(depth) + return string.rep(" ", depth) +end + +function generate_text(data, key_items, items, depth) + local text = depth == 1 and data.name or "" + for _, pop in pairs(data.pops) do + local resource + local item_scope + local owns_pop + local in_pool_count = 0 + local item_identifier = '' + + if pop.type == 'key item' then + resource = res.key_items[pop.id] + owns_pop = owns_key_item(pop.id, key_items) + item_identifier = 'Ж ' + else + resource = res.items[pop.id] + owns_pop = owns_item(pop.id, items) + in_pool_count = item_treasure_pool_count(pop.id, items.treasure) + end + + local pop_name = 'Unknown pop' + if resource then + pop_name = ucwords(resource.en) + end + + --separator line for each top-level mob + if depth == 1 then + text = text .. "\n" + end + + local item_colour + if owns_pop then + item_colour = colors.success + else + item_colour = colors.danger + end + + local pool_notification = '' + if in_pool_count > 0 then + pool_notification = colors.warning .. ' [' .. in_pool_count .. ']' .. colors.close + end + text = text .. "\n" .. get_indent(depth) .. pop.dropped_from.name .. "\n" .. get_indent(depth) .. ' >> ' .. item_colour .. item_identifier .. pop_name .. colors.close .. pool_notification + if pop.dropped_from.pops then + text = text .. generate_text(pop.dropped_from, key_items, items, depth + 1) + end + end + + return text +end + +EmpyPopTracker.add_to_chat = function(message) + if type(message) ~= 'string' then + error('add_to_chat requires the message arg to be a string') + end + + windower.add_to_chat(8, message) +end + +EmpyPopTracker.generate_info = function(nm, key_items, items) + local nm_type = type(nm) + if nm_type ~= 'table' then + error('generate_info requires the nm arg to be a table, but got ' .. nm_type .. ' instead') + end + + local info = { + has_all_kis = true, + text = "" + } + + if nm.pops then + for _, key_item_data in pairs(nm.pops) do + local has_pop_ki = owns_key_item(key_item_data.id, key_items) + + if not has_pop_ki then + info.has_all_kis = false + end + end + end + + info.text = generate_text(nm, key_items, items, 1) + + return info +end + +function find_nms(query) + local matching_nms = {} + local lower_query = query:lower() + for _, nm in pairs(nm_data) do + local result = string.match(nm.name:lower(), '(.*' .. lower_query .. '.*)') + if result then + table.insert(matching_nms, result) + end + end + return matching_nms +end + +windower.register_event("addon command", function(command, ...) + if commands[command] then + commands[command](...) + else + commands.help() + end +end) + +commands = {} + +commands.track = function(...) + local args = {...} + local nm_name = args[1] + local matching_nm_names = find_nms(nm_name) + + if #matching_nm_names == 0 then + EmpyPopTracker.add_to_chat('Unable to find a NM using: "' .. nm_name .. '"') + elseif #matching_nm_names > 1 then + EmpyPopTracker.add_to_chat('"' .. nm_name .. '" matches ' .. #matching_nm_names .. ' NMs. Please be more explicit:') + for key, matching_file_name in pairs(matching_nm_names) do + EmpyPopTracker.add_to_chat(' Match ' .. key .. ': ' .. ucwords(matching_file_name)) + end + else + active = true + EmpyPopTracker.add_to_chat("Now tracking: " .. ucwords(matching_nm_names[1])) + EmpyPopTracker.settings.tracking = matching_nm_names[1] + EmpyPopTracker.update() + commands.show() + end +end +commands.t = commands.track + +commands.hide = function() + active = false + EmpyPopTracker.text:visible(false) + EmpyPopTracker.settings.visible = false + EmpyPopTracker.settings:save() +end + +commands.show = function() + active = true + EmpyPopTracker.text:visible(true) + EmpyPopTracker.settings.visible = true + EmpyPopTracker.settings:save() + EmpyPopTracker.update() +end + +commands.help = function() + EmpyPopTracker.add_to_chat("---Empy Pop Tracker---") + EmpyPopTracker.add_to_chat("Available commands:") + EmpyPopTracker.add_to_chat("//ept t|track briareus - tracks Briareus pops (partial names such as apadem work too!)") + EmpyPopTracker.add_to_chat("//ept hide - hides the UI") + EmpyPopTracker.add_to_chat("//ept show - shows the UI") + EmpyPopTracker.add_to_chat("//ept list - lists all trackable NMs") + EmpyPopTracker.add_to_chat("//ept help - displays this help") +end + +commands.list = function() + EmpyPopTracker.add_to_chat("---Empy Pop Tracker---") + EmpyPopTracker.add_to_chat("Trackable NMs:") + for _, nm in pairs(nm_data) do + EmpyPopTracker.add_to_chat(ucwords(nm.name)) + end +end + +commands.bg = function() + local tracking_nm = nm_data[EmpyPopTracker.settings.tracking] + windower.open_url(tracking_nm.bg_url) +end + +EmpyPopTracker.update = function() + local key_items = windower.ffxi.get_key_items() + local items = windower.ffxi.get_items() + local tracked_nm_data = nm_data[EmpyPopTracker.settings.tracking] + local generated_info = EmpyPopTracker.generate_info(tracked_nm_data, key_items, items) + EmpyPopTracker.text:text(generated_info.text) + if generated_info.has_all_kis then + EmpyPopTracker.text:bg_color(0, 75, 0) + else + EmpyPopTracker.text:bg_color(0, 0, 0) + end + if EmpyPopTracker.settings.visible then + EmpyPopTracker.text:visible(true) + end +end + +windower.register_event('load', function() + if windower.ffxi.get_info().logged_in and EmpyPopTracker.settings.visible then + active = true + EmpyPopTracker.update() + end +end) + +windower.register_event('add item', 'remove item', function() + if active then + EmpyPopTracker.update() + end +end) + +windower.register_event('incoming chunk', function(id) + --0x055: KI update + --0x0D2: Treasure pool addition + --0x0D3: Treasure pool lot/drop + if active and id == 0x055 or id == 0x0D2 or id == 0x0D3 then + EmpyPopTracker.update() + end +end) + +windower.register_event('login', function() + if EmpyPopTracker.settings.visible then + EmpyPopTracker.text:visible(true) + active = true + end +end) + +windower.register_event('logout', function() + EmpyPopTracker.text:visible(false) + active = false +end) + +return EmpyPopTracker diff --git a/addons/EmpyPopTracker/README.md b/addons/EmpyPopTracker/README.md new file mode 100644 index 000000000..3631de1ec --- /dev/null +++ b/addons/EmpyPopTracker/README.md @@ -0,0 +1,53 @@ +# FFXI Empy Pop Tracker + +An FFXI Windower 4 addon that tracks items and key items for popping Empyrean NMs in Abyssea, such as Briareus, Apademak and Sobek. + +![Example of Cirein-croin tracking](readme/demo.png) ![All KIs obtained](readme/demo-full.png) + +Key items are identified by the Zhe (Ж) character. Treasure pool counts for pop items are listed in amber after the item in the format of [3] (assuming 3 of that item in the pool). + +## Load + +`//lua load empypoptracker` + +## Track an NM + +`//ept track glavoid` tracks Glavoid pop items/key items. + +You can also track an NM by typing part of the name, because fuck having to remember how to spell Itzpapalotl: + +`//ept track itz` + +For a full list of trackable NMs, see the nms directory or use the `list` command (see below). + +## Other Commands + +### List Trackable NMs + +`//ept list` + +### Open BG Wiki for NM + +`//ept bg` + +### Hide UI + +`//ept hide` + +### Show UI + +`//ept show` + +### Display Help + +`//ept help` + +## Where is Fistule? + +Fistule is a unique NM when compared to the others. It does not require KIs that can be tracked, so it isn't included with the addon. + +## Contributing + +Notice something not quite right? [Raise an issue](https://github.com/xurion/ffxi-empy-pop-tracker/issues). + +[Pull requests](https://github.com/xurion/ffxi-empy-pop-tracker/pulls) welcome! diff --git a/addons/EmpyPopTracker/nms/README.md b/addons/EmpyPopTracker/nms/README.md new file mode 100644 index 000000000..bad2e262b --- /dev/null +++ b/addons/EmpyPopTracker/nms/README.md @@ -0,0 +1,62 @@ +# NM data + +The data structure for each trackable NM uses a series of nested NM entities. A standard NM entity contains the following data: + +| Key | Type | Required? | Description | +| ------------------- | --------- | --------- | --------------------------------- | +| name | String | Required | Name of the NM | +| bg_url | String | Required | URL of the bgwiki page for the NM | +| pops | Table | Optional | The pop information for the NM | +| pops{}.id | Number | Required | The ID of the item/key item | +| pops{}.type | String | Required | Either "key item" or "item" | +| pops{}.dropped_from | NM Entity | Required | A nested set of NM information | + +A simple example of the above would be: + +```lua +{ + name = "Azdaja", + pops = { { + id = 1531, --Vacant Bugard Eye + type = "key item", + dropped_from = { name = "Deelgeed, Timed (F-9/F-10)" } + } } +} +``` + +A larger example with multiple nested entites: + +```lua +{ + name = "Bukhis", + pops = { { + id = 1508, --Ingrown Taurus Nail + type = "key item", + dropped_from = { + name = "Khalkotaur, Forced (F-4)", + pops = { { + id = 3098, --Gnarled Taurus Horn + type = "item", + dropped_from = { name = "Aestutaur (G-9/G-10)" } + } } + }, { + id = 1509, --Ossified Gargouille Hand + type = "key item", + dropped_from = { + name = "Quasimodo, Forced (F-4)", + pops = { { + id = 3099, --Gargouille Stone + type = "item", + dropped_from = { name = "Gruesome Gargouille (F-10/G-10)" } + } } + } + }, { + id = 1510, --Imbrued Vampyr Fang + type = "key item", + dropped_from = { name = "Lord Varney, Timed (G-10/H-10)" } + } } + } +} +``` + +The main addon file requires the index.lua file which in turn is responsible for requiring and returning data for each nm. diff --git a/addons/EmpyPopTracker/nms/alfard.lua b/addons/EmpyPopTracker/nms/alfard.lua new file mode 100644 index 000000000..88dedb7a2 --- /dev/null +++ b/addons/EmpyPopTracker/nms/alfard.lua @@ -0,0 +1,59 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Alfard", + bg_url = 'https://www.bg-wiki.com/bg/Alfard', + pops = { { + id = 1530, --Venomous hydra fang + type = "key item", + dropped_from = { + name = "Ningishzida, Forced (I-7/I-8)", + pops = { { + id = 3262, --Jaculus Wing + type = "item", + dropped_from = { name = "Jaculus, Timed (I-8)" } + }, { + id = 3261, --Minaruja Skull + type = "item", + dropped_from = { + name = "Minaruja, Forced (I-10)", + pops = { { + id = 3267, --Pursuer's Wing + type = "item", + dropped_from = { name = "Faunus Wyvern (I-9)" } + } } + } + }, { + id = 3268, --High-Quality Wivre Hide + type = "item", + dropped_from = { name = "Glade Wivre (I-8)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/apademak.lua b/addons/EmpyPopTracker/nms/apademak.lua new file mode 100644 index 000000000..f3c37a21e --- /dev/null +++ b/addons/EmpyPopTracker/nms/apademak.lua @@ -0,0 +1,58 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Apademak", + bg_url = 'https://www.bg-wiki.com/bg/Apademak', + pops = { { + id = 1525, --Torn Khimaira Wing + type = "key item", + dropped_from = { + name = "Dhorme Khimaira, Forced (F-7)", + pops = { { + id = 3246, --Snow God Core + type = "item", + dropped_from = { + name = "Upas-Kamuy, Forced (G-5)", + pops = { { + id = 3252, --Gelid Arm + dropped_from = { name = "Snowflake (G-5)" } + } } + } + }, { + id = 3247, --Sisyphus Fragment + type = "item", + dropped_from = { name = "Sisyphus, Timed (F-6/G-6)" } + }, { + id = 3253, --High-quality marid hide + type = "item", + dropped_from = { name = "Olyphant (F-6)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/azdaja.lua b/addons/EmpyPopTracker/nms/azdaja.lua new file mode 100644 index 000000000..28716728a --- /dev/null +++ b/addons/EmpyPopTracker/nms/azdaja.lua @@ -0,0 +1,37 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Azdaja", + bg_url = 'https://www.bg-wiki.com/bg/Azdaja', + pops = { { + id = 1531, --Vacant Bugard Eye + type = "key item", + dropped_from = { name = "Deelgeed, Timed (F-9/F-10)" } + } } +} diff --git a/addons/EmpyPopTracker/nms/briareus.lua b/addons/EmpyPopTracker/nms/briareus.lua new file mode 100644 index 000000000..141f27b64 --- /dev/null +++ b/addons/EmpyPopTracker/nms/briareus.lua @@ -0,0 +1,66 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Briareus", + bg_url = 'https://www.bg-wiki.com/bg/Briareus', + pops = { { + id = 1482, --Dented Gigas Shield + type = "key item", + dropped_from = { + name = "Adamastor, Forced (C-4)", + pops = { { + id = 2894, --Trophy Shield + type = "item", + dropped_from = { name = "Bathyal Gigas (C-5/D-5)" } + } } + } + }, { + id = 1484, --Severed Gigas Collar + type = "key item", + dropped_from = { + name = "Grandgousier, Forced (F-10)", + pops = { { + id = 2896, --Massive Armband + type = "item", + dropped_from = { name = "Demersal Gigas (E-9/F-9)" } + } } + } + }, { + id = 1483, --Warped Gigas Armband + type = "key item", + dropped_from = { + name = "Pantagruel, Forced (F-7)", + pops = { { + id = 2895, --Oversized Sock + type = "item", + dropped_from = { name = "Hadal Gigas (F-6/F-7)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/bukhis.lua b/addons/EmpyPopTracker/nms/bukhis.lua new file mode 100644 index 000000000..4197cc0eb --- /dev/null +++ b/addons/EmpyPopTracker/nms/bukhis.lua @@ -0,0 +1,59 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Bukhis", + bg_url = 'https://www.bg-wiki.com/bg/Bukhis', + pops = { { + id = 1508, --Ingrown Taurus Nail + type = "key item", + dropped_from = { + name = "Khalkotaur, Forced (F-4)", + pops = { { + id = 3098, --Gnarled Taurus Horn + type = "item", + dropped_from = { name = "Aestutaur (G-9/G-10)" } + } } + } + }, { + id = 1509, --Ossified Gargouille Hand + type = "key item", + dropped_from = { + name = "Quasimodo, Forced (F-4)", + pops = { { + id = 3099, --Gargouille Stone + type = "item", + dropped_from = { name = "Gruesome Gargouille (F-10/G-10)" } + } } + } + }, { + id = 1510, --Imbrued Vampyr Fang + type = "key item", + dropped_from = { name = "Lord Varney, Timed (G-10/H-10)" } + } } +} diff --git a/addons/EmpyPopTracker/nms/carabosse.lua b/addons/EmpyPopTracker/nms/carabosse.lua new file mode 100644 index 000000000..7f4c59c86 --- /dev/null +++ b/addons/EmpyPopTracker/nms/carabosse.lua @@ -0,0 +1,55 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Carabosse", + bg_url = 'https://www.bg-wiki.com/bg/Carabosse', + pops = { { + id = 1485, --Pellucid Fly Eye + type = "key item", + dropped_from = { + name = "La Theine Liege, Forced (I-7)", + pops = { { + id = 2897, --Transparent Insect Wing + type = "item", + dropped_from = { name = "Plateau Glider (H-7)" } + } } + } + }, { + id = 1486, --Shimmering Pixie Pinion + type = "key item", + dropped_from = { + name = "Baba Yaga, Forced (H-7)", + pops = { { + id = 2898, --Piceous Scale + type = "item", + dropped_from = { name = "Farfadet (H-7)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/chloris.lua b/addons/EmpyPopTracker/nms/chloris.lua new file mode 100644 index 000000000..7695cd0e0 --- /dev/null +++ b/addons/EmpyPopTracker/nms/chloris.lua @@ -0,0 +1,114 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Chloris", + bg_url = 'https://www.bg-wiki.com/bg/Chloris', + pops = { { + id = 1470, --Gory Scorpion Claw + type = "key item", + dropped_from = { + name = "Hedetet, Forced (F-7)", + pops = { { + id = 2921, --Venomous Scorpion Stinger + type = "item", + dropped_from = { name = "Canyon Scorpion (F-7)" } + }, { + id = 2948, --Acidic Humus + type = "item", + dropped_from = { + name = "Gancanagh, Forced (H-8)", + pops = { { + id = 2920, --Alkaline Humus + type = "item", + dropped_from = { name = "Pachypodium (H-8)" } + } } + } + } } + } + }, { + id = 1469, --Torn Bat Wing + type = "key item", + dropped_from = { + name = "Treble Noctules, Forced (I-9)", + pops = { { + id = 2919, --Bloody Fang + type = "item", + dropped_from = { name = "Blood Bat (I-9)" } + }, { + id = 2947, --Exorcised Skull + type = "item", + dropped_from = { + name = "Cannered Noz, Forced (F-6)", + pops = { { + id = 2918, --Baleful Skull + type = "item", + dropped_from = { name = "Caoineag (F-6)" } + } } + } + } } + } + }, { + id = 1468, --Veinous Hecteyes Eyelid + type = "key item", + dropped_from = { + name = "Ophanim, Forced (G-9)", + pops = { { + id = 2946, --Tarnished Pincer + type = "item", + dropped_from = { + name = "Vetehinen, Forced (H-10)", + pops = { { + id = 2916, --High-quality Limule Pincer + type = "item", + dropped_from = { name = "Gulch Limule (H-10)" } + }, { + id = 2917, --Bloodshot Hecteye + type = "item", + dropped_from = { name = "Beholder (G-9)" } + }, { + id = 2945, --Shriveled Wing + type = "item", + dropped_from = { + name = "Halimede, Forced (G-12)", + pops = { { + id = 2915, --High-quality Clionid Wing + type = "item", + dropped_from = { name = "Gully Clionid (G-12)" } + } } + } + } } + } + } } + } + }, { + id = 1471, --Mossy Adamantoise Shell + type = "key item", + dropped_from = { name = "Chukwa, Timed (F-5)" } + } } +} diff --git a/addons/EmpyPopTracker/nms/cirein-croin.lua b/addons/EmpyPopTracker/nms/cirein-croin.lua new file mode 100644 index 000000000..78354bcd6 --- /dev/null +++ b/addons/EmpyPopTracker/nms/cirein-croin.lua @@ -0,0 +1,48 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Cirein-Croin", + bg_url = 'https://www.bg-wiki.com/bg/Cirein-croin', + pops = { { + id = 1504, --Glistening Orobon Liver + type = "key item", + dropped_from = { + name = "Cep-Kamuy, Forced (F-4)", + pops = { { + id = 3089, --Orobon Cheekmeat + type = "item", + dropped_from = { name = "Ancient Orobon (F-5)" } + } } + } + }, { + id = 1505, --Doffed Poroggo Hat + type = "key item", + dropped_from = { name = "Heqet, Timed (I-6)" } + } } +} diff --git a/addons/EmpyPopTracker/nms/dragua.lua b/addons/EmpyPopTracker/nms/dragua.lua new file mode 100644 index 000000000..c584499ca --- /dev/null +++ b/addons/EmpyPopTracker/nms/dragua.lua @@ -0,0 +1,37 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Dragua", + bg_url = 'https://www.bg-wiki.com/bg/Dragua', + pops = { { + id = 1521, --Bloodied Dragon Ear + type = "key item", + dropped_from = { name = "Hazhdiha, Timed (H-10)" } + } } +} diff --git a/addons/EmpyPopTracker/nms/glavoid.lua b/addons/EmpyPopTracker/nms/glavoid.lua new file mode 100644 index 000000000..067d2a345 --- /dev/null +++ b/addons/EmpyPopTracker/nms/glavoid.lua @@ -0,0 +1,83 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Glavoid", + bg_url = 'https://www.bg-wiki.com/bg/Glavoid', + pops = { { + id = 1473, --Sodden Sandworm Husk + type = "key item", + dropped_from = { name = "Minhocao, Timed (I-6)" } + }, { + id = 1475, --Sticky Gnat Wing + type = "key item", + dropped_from = { name = "Adze, Timed (G-5)" } + }, { + id = 1472, --Fat-lined Cockatrice Skin + type = "key item", + dropped_from = { + name = "Alectryon (H-8)", + pops = { { + id = 2923, --Cockatrice Tailmeat + type = "item", + dropped_from = { name = "Cluckatrice (H-8)" } + }, { + id = 2949, --Quivering Eft Egg + type = "item", + dropped_from = { + name = "Abas, Forced (K-10)", + pops = { { + id = 2922, --Eft Egg + dropped_from = { name = "Canyon Eft (J-10/J-11)" } + } } + } + } } + } + }, { + id = 1474, --Luxuriant manticore mane + type = "key item", + dropped_from = { + name = "Muscaliet, Forced (J-6)", + pops = { { + id = 2925, --Resilient Mane + type = "item", + dropped_from = { name = "Hieracosphinx (J-6)" } + }, { + id = 2950, --Smooth Whisker + type = "item", + dropped_from = { + name = "Tefenet, Forced (G-6)", + pops = { { + id = 2924, --Shocking Whisker + dropped_from = { name = "Jaguarundi (G-6)" } + } } + } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/index.lua b/addons/EmpyPopTracker/nms/index.lua new file mode 100644 index 000000000..9091a466a --- /dev/null +++ b/addons/EmpyPopTracker/nms/index.lua @@ -0,0 +1,54 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +local nms = { + 'alfard', + 'apademak', + 'azdaja', + 'briareus', + 'bukhis', + 'carabosse', + 'chloris', + 'cirein-croin', + 'dragua', + 'glavoid', + 'isgebind', + 'itzpapalotl', + 'kukulkan', + 'orthrus', + 'sedna', + 'sobek', + 'ulhuadshi' +} + +nm_data = {} +for _, nm in pairs(nms) do + nm_data[nm] = require('nms/' .. nm) +end + +return nm_data diff --git a/addons/EmpyPopTracker/nms/isgebind.lua b/addons/EmpyPopTracker/nms/isgebind.lua new file mode 100644 index 000000000..3d5f5ef1e --- /dev/null +++ b/addons/EmpyPopTracker/nms/isgebind.lua @@ -0,0 +1,37 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Isgebind", + bg_url = 'https://www.bg-wiki.com/bg/Isgebind', + pops = { { + id = 1526, --Begrimed Dragon Hide + type = "key item", + dropped_from = { name = "Kur, Timed (I-5/J-5)" } + } } +} diff --git a/addons/EmpyPopTracker/nms/itzpapalotl.lua b/addons/EmpyPopTracker/nms/itzpapalotl.lua new file mode 100644 index 000000000..5e44302d2 --- /dev/null +++ b/addons/EmpyPopTracker/nms/itzpapalotl.lua @@ -0,0 +1,59 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Itzpapalotl", + bg_url = 'https://www.bg-wiki.com/bg/Itzpapalotl', + pops = { { + id = 1488, --Venomous Wamoura Feeler + type = "key item", + dropped_from = { + name = "Granite Borer, Forced (K-10)", + pops = { { + id = 3072, --Withered Cocoon + type = "item", + dropped_from = { name = "Gullycampa (K-10)" } + } } + } + }, { + id = 1490, --Distended Chigoe Abdomen + type = "key item", + dropped_from = { name = "Tunga, Timed (K-10)" } + }, { + id = 1489, --Bulbous crawler cocoon + type = "key item", + dropped_from = { + name = "Blazing Eruca, Forced (J-10)", + pops = { { + id = 3073, --Eruca Egg + type = "item", + dropped_from = { name = "Ignis Eruca (J-10)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/kukulkan.lua b/addons/EmpyPopTracker/nms/kukulkan.lua new file mode 100644 index 000000000..5b1ddcc0b --- /dev/null +++ b/addons/EmpyPopTracker/nms/kukulkan.lua @@ -0,0 +1,66 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Kukulkan", + bg_url = 'https://www.bg-wiki.com/bg/Kukulkan', + pops = { { + id = 1466, --Mucid Ahriman Eyeball + type = "key item", + dropped_from = { + name = "Arimaspi, Forced (K-6)", + pops = { { + id = 2913, --Clouded Lens + type = "item", + dropped_from = { name = "Deep Eye (K-6/K-7)" } + } } + } + }, { + id = 1464, --Tattered Hippogryph Wing + type = "key item", + dropped_from = { + name = "Alkonost, Forced (H-6)", + pops = { { + id = 2912, --Giant Bugard Tusk + type = "item", + dropped_from = { name = "Ypotryll (I-7)" } + } } + } + }, { + id = 1465, --Cracked Wivre Horn + type = "key item", + dropped_from = { + name = "Keratyrannos, Forced (G-6)", + pops = { { + id = 2910, --Armored Dragonhorn + type = "item", + dropped_from = { name = "Mesa Wivre (G-6)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/orthrus.lua b/addons/EmpyPopTracker/nms/orthrus.lua new file mode 100644 index 000000000..ea7a0d817 --- /dev/null +++ b/addons/EmpyPopTracker/nms/orthrus.lua @@ -0,0 +1,58 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Orthrus", + bg_url = 'https://www.bg-wiki.com/bg/Orthrus', + pops = { { + id = 1520, --Steaming cerberus tongue + type = "key item", + dropped_from = { + name = "Amarok, Forced (E-6)", + pops = { { + id = 3231, --Sharabha Hide + type = "item", + dropped_from = { + name = "Sharabha, Forced (G-5)", + pops = { { + id = 3237, + dropped_from = { name = "Dune Manticore (F-5/F-6)" } + } } + } + }, { + id = 3232, --Tiger King Hide + type = "item", + dropped_from = { name = "Ansherekh, Timed (F-8/G-8)" } + }, { + id = 3238, --H.Q. Dhalmel Hide + type = "item", + dropped_from = { name = "Camelopardalis (F-7/G-7)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/sedna.lua b/addons/EmpyPopTracker/nms/sedna.lua new file mode 100644 index 000000000..de3f84d1c --- /dev/null +++ b/addons/EmpyPopTracker/nms/sedna.lua @@ -0,0 +1,48 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Sedna", + bg_url = 'https://www.bg-wiki.com/bg/Sedna', + pops = { { + id = 1512, --Shimmering Pugil Scale + type = "key item", + dropped_from = { name = "Hrosshvalur, Timed (J-6)" } + }, { + id = 1511, --Glossy Sea Monk Sucker + type = "key item", + dropped_from = { + name = "Iku-Turso, Forced (J-7)", + pops = { { + id = 3100, --Moonbeam Clam + type = "item", + dropped_from = { name = "Jasconius (I-7/J-7)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/sobek.lua b/addons/EmpyPopTracker/nms/sobek.lua new file mode 100644 index 000000000..570fd9d51 --- /dev/null +++ b/addons/EmpyPopTracker/nms/sobek.lua @@ -0,0 +1,59 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Sobek", + bg_url = 'https://www.bg-wiki.com/bg/Sobek', + pops = { { + id = 1500, --Molted Peiste Skin + type = "key item", + dropped_from = { name = "Gukumatz, Timed (J-11)" } + }, { + id = 1498, --Bloodstained Bugard Fang + type = "key item", + dropped_from = { + name = "Minax Bugard, Forced (K-10)", + pops = { { + id = 3085, --Bewitching Tusk + type = "item", + dropped_from = { name = "Abyssobugard (J-10/K-11)" } + } } + } + }, { + id = 1499, --Gnarled Lizard Nail + type = "key item", + dropped_from = { + name = "Sirrush, Forced (I-11)", + pops = { { + id = 3086, --Molt Scraps + type = "item", + dropped_from = { name = "Dusk Lizard (J-11)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/nms/ulhuadshi.lua b/addons/EmpyPopTracker/nms/ulhuadshi.lua new file mode 100644 index 000000000..3d2211396 --- /dev/null +++ b/addons/EmpyPopTracker/nms/ulhuadshi.lua @@ -0,0 +1,48 @@ +--[[ +Copyright © 2020, Dean James (Xurion of Bismarck) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Empy Pop Tracker nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Dean James (Xurion of Bismarck) BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + +return { + name = "Ulhuadshi", + bg_url = 'https://www.bg-wiki.com/bg/Ulhuadshi', + pops = { { + id = 1492, --Shriveled Hecteyes Stalk + type = "key item", + dropped_from = { name = "Amun, Timed (H-8/I-9)" } + }, { + id = 1491, --Mucid Worm Segment + type = "key item", + dropped_from = { + name = "Pallid Percy, Forced (J-7)", + pops = { { + id = 3074, --Blanched Silver + type = "item", + dropped_from = { name = "Entozoon (J-7)" } + } } + } + } } +} diff --git a/addons/EmpyPopTracker/readme/demo-full.png b/addons/EmpyPopTracker/readme/demo-full.png new file mode 100644 index 0000000000000000000000000000000000000000..02df409dabe34d3fafaedacf0d13efe53a01c576 GIT binary patch literal 26460 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

QWC@pfDZ=P^XtlN03liT~${`5pATHe(-Ga*!vb( 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 a0t^65+0Q<)G5p&A0000# literal 0 HcmV?d00001 diff --git a/addons/EmpyPopTracker/readme/demo.png b/addons/EmpyPopTracker/readme/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..db24c678e886cc87643b64ec01bc83a6d62734ce GIT binary patch literal 22426 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

%S})^feiZ?HGl^wWG|Gt6gB;9TL%CT3Ntw8Lx^# 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 literal 0 HcmV?d00001 From db5445aeb69b3f6e70a7285c1d24b985c7c97ea1 Mon Sep 17 00:00:00 2001 From: Dean James Date: Mon, 13 Jan 2020 23:00:26 +0000 Subject: [PATCH 2/4] Added EmpyPopTracker to addons.xml. --- addons/addons.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/addons/addons.xml b/addons/addons.xml index f09c2cb2d..dfc12b02d 100644 --- a/addons/addons.xml +++ b/addons/addons.xml @@ -205,6 +205,13 @@ https://github.com/tehkrizz/Lua/issues http://www.ffxiah.com/player/Bahamut/Krizz + + EmpyPopTracker + Dean James (Xurion of Bismarck) + Tracks items and key items for popping Empyrean NMs in Abyssea, such as Briareus, Apademak and Sobek. + https://github.com/xurion/ffxi-empy-pop-tracker/issues + https://www.ffxiah.com/forum/topic/54376/empyrean-pop-tracker-addon-10-years-late/ + Enemybar mmckee From 1cebfdbb2ce52a37e5d44b0ed6834a5c48eec3eb Mon Sep 17 00:00:00 2001 From: Dean James Date: Mon, 27 Jan 2020 22:50:37 +0000 Subject: [PATCH 3/4] Double quotes to singles. Fixed issue with ucwords where it would return a list. Futureproofed owns_items function. Referencing resources by name. Removed add_to_chat function and moved chat mode to settings. Removed unnecessary validation from generate_info function. Removed BG URL from each data file and inferred URL by NM name. Corrected indent size in data files. PR comments addressed. --- addons/EmpyPopTracker/EmpyPopTracker.lua | 382 ++++++++++----------- addons/EmpyPopTracker/nms/README.md | 83 ++--- addons/EmpyPopTracker/nms/alfard.lua | 53 ++- addons/EmpyPopTracker/nms/apademak.lua | 51 ++- addons/EmpyPopTracker/nms/azdaja.lua | 13 +- addons/EmpyPopTracker/nms/briareus.lua | 71 ++-- addons/EmpyPopTracker/nms/bukhis.lua | 55 +-- addons/EmpyPopTracker/nms/carabosse.lua | 49 ++- addons/EmpyPopTracker/nms/chloris.lua | 155 +++++---- addons/EmpyPopTracker/nms/cirein-croin.lua | 35 +- addons/EmpyPopTracker/nms/dragua.lua | 13 +- addons/EmpyPopTracker/nms/glavoid.lua | 97 +++--- addons/EmpyPopTracker/nms/index.lua | 36 +- addons/EmpyPopTracker/nms/isgebind.lua | 13 +- addons/EmpyPopTracker/nms/itzpapalotl.lua | 57 ++- addons/EmpyPopTracker/nms/kukulkan.lua | 71 ++-- addons/EmpyPopTracker/nms/orthrus.lua | 51 ++- addons/EmpyPopTracker/nms/sedna.lua | 35 +- addons/EmpyPopTracker/nms/sobek.lua | 57 ++- addons/EmpyPopTracker/nms/ulhuadshi.lua | 35 +- 20 files changed, 691 insertions(+), 721 deletions(-) diff --git a/addons/EmpyPopTracker/EmpyPopTracker.lua b/addons/EmpyPopTracker/EmpyPopTracker.lua index 6fd546248..cb11451aa 100644 --- a/addons/EmpyPopTracker/EmpyPopTracker.lua +++ b/addons/EmpyPopTracker/EmpyPopTracker.lua @@ -27,13 +27,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] _addon.name = "Empy Pop Tracker" -_addon.author = "Dean James (Xurion of Bismarck)" -_addon.commands = { "ept", "empypoptracker" } -_addon.version = "2.0.0" +_addon.author = 'Dean James (Xurion of Bismarck)' +_addon.commands = { 'ept', 'empypoptracker' } +_addon.version = '2.0.0' -config = require("config") -res = require("resources") -nm_data = require("nms/index") +config = require('config') +res = require('resources') +nm_data = require('nms/index') active = false @@ -52,288 +52,272 @@ defaults.text.bg.red = 0 defaults.text.bg.visible = true defaults.text.padding = 8 defaults.text.text = {} -defaults.text.text.font = "Consolas" +defaults.text.text.font = 'Consolas' defaults.text.text.size = 10 -defaults.tracking = "briareus" +defaults.tracking = 'briareus' defaults.visible = true +defaults.add_to_chat_mode = 8 EmpyPopTracker.settings = config.load(defaults) -EmpyPopTracker.text = require("texts").new(EmpyPopTracker.settings.text, EmpyPopTracker.settings) +EmpyPopTracker.text = require('texts').new(EmpyPopTracker.settings.text, EmpyPopTracker.settings) colors = {} -colors.success = "\\cs(100,255,100)" -colors.danger = "\\cs(255,50,50)" -colors.warning = "\\cs(255,170,0)" -colors.close = "\\cr" +colors.success = '\\cs(100,255,100)' +colors.danger = '\\cs(255,50,50)' +colors.warning = '\\cs(255,170,0)' +colors.close = '\\cr' function owns_item(id, items) - local owned = false - - -- Loop maximum 80 times over all slots. 80 indexes are returned for each bag regardless of max capacity. - for i = 1, 80, 1 do - if items.safe[i].id == id or - items.safe2[i].id == id or - items.locker[i].id == id or - items.sack[i].id == id or - items.satchel[i].id == id or - items.inventory[i].id == id or - items.storage[i].id == id then - owned = true - break - end + for _, bag in ipairs(items) do + for _, item in ipairs(bag) do + if item.id == id then + return true + end end + end - return owned + return false end function owns_key_item(id, items) - local owned = false + local owned = false - for _, item_id in pairs(items) do - if item_id == id then - owned = true - break - end + for _, item_id in pairs(items) do + if item_id == id then + owned = true + break end + end - return owned + return owned end function item_treasure_pool_count(id, treasure) - local count = 0 + local count = 0 - for _, item in pairs(treasure) do - if item.item_id == id then - count = count + 1 - end + for _, item in pairs(treasure) do + if item.item_id == id then + count = count + 1 end + end - return count + return count end function ucwords(str) - return string.gsub(str, "(%a)([%w_']*)", function(first, rest) - return first:upper() .. rest:lower() - end) + local result = string.gsub(str, '(%a)([%w_\']*)', function(first, rest) + return first:upper() .. rest:lower() + end) + + return result end function get_indent(depth) - return string.rep(" ", depth) + return string.rep(' ', depth) end function generate_text(data, key_items, items, depth) - local text = depth == 1 and data.name or "" - for _, pop in pairs(data.pops) do - local resource - local item_scope - local owns_pop - local in_pool_count = 0 - local item_identifier = '' - - if pop.type == 'key item' then - resource = res.key_items[pop.id] - owns_pop = owns_key_item(pop.id, key_items) - item_identifier = 'Ж ' - else - resource = res.items[pop.id] - owns_pop = owns_item(pop.id, items) - in_pool_count = item_treasure_pool_count(pop.id, items.treasure) - end - - local pop_name = 'Unknown pop' - if resource then - pop_name = ucwords(resource.en) - end - - --separator line for each top-level mob - if depth == 1 then - text = text .. "\n" - end - - local item_colour - if owns_pop then - item_colour = colors.success - else - item_colour = colors.danger - end - - local pool_notification = '' - if in_pool_count > 0 then - pool_notification = colors.warning .. ' [' .. in_pool_count .. ']' .. colors.close - end - text = text .. "\n" .. get_indent(depth) .. pop.dropped_from.name .. "\n" .. get_indent(depth) .. ' >> ' .. item_colour .. item_identifier .. pop_name .. colors.close .. pool_notification - if pop.dropped_from.pops then - text = text .. generate_text(pop.dropped_from, key_items, items, depth + 1) - end + local text = depth == 1 and data.name or '' + for _, pop in pairs(data.pops) do + local resource + local item_scope + local owns_pop + local in_pool_count = 0 + local item_identifier = '' + + if pop.type == 'key item' then + resource = res.key_items[pop.id] + owns_pop = owns_key_item(pop.id, key_items) + item_identifier = 'Ж ' + else + resource = res.items[pop.id] + owns_pop = owns_item(pop.id, items) + in_pool_count = item_treasure_pool_count(pop.id, items.treasure) end - return text -end - -EmpyPopTracker.add_to_chat = function(message) - if type(message) ~= 'string' then - error('add_to_chat requires the message arg to be a string') + local pop_name = 'Unknown pop' + if resource then + pop_name = ucwords(resource.name) end - windower.add_to_chat(8, message) -end + --separator line for each top-level mob + if depth == 1 then + text = text .. '\n' + end -EmpyPopTracker.generate_info = function(nm, key_items, items) - local nm_type = type(nm) - if nm_type ~= 'table' then - error('generate_info requires the nm arg to be a table, but got ' .. nm_type .. ' instead') + local item_colour + if owns_pop then + item_colour = colors.success + else + item_colour = colors.danger end - local info = { - has_all_kis = true, - text = "" - } + local pool_notification = '' + if in_pool_count > 0 then + pool_notification = colors.warning .. ' [' .. in_pool_count .. ']' .. colors.close + end + text = text .. '\n' .. get_indent(depth) .. pop.dropped_from.name .. '\n' .. get_indent(depth) .. ' >> ' .. item_colour .. item_identifier .. pop_name .. colors.close .. pool_notification + if pop.dropped_from.pops then + text = text .. generate_text(pop.dropped_from, key_items, items, depth + 1) + end + end - if nm.pops then - for _, key_item_data in pairs(nm.pops) do - local has_pop_ki = owns_key_item(key_item_data.id, key_items) + return text +end - if not has_pop_ki then - info.has_all_kis = false - end - end +EmpyPopTracker.generate_info = function(nm, key_items, items) + local nm_type = type(nm) + local info = { + has_all_kis = true, + text = '' + } + + if nm.pops then + for _, key_item_data in pairs(nm.pops) do + local has_pop_ki = owns_key_item(key_item_data.id, key_items) + + if not has_pop_ki then + info.has_all_kis = false + end end + end - info.text = generate_text(nm, key_items, items, 1) + info.text = generate_text(nm, key_items, items, 1) - return info + return info end function find_nms(query) - local matching_nms = {} - local lower_query = query:lower() - for _, nm in pairs(nm_data) do - local result = string.match(nm.name:lower(), '(.*' .. lower_query .. '.*)') - if result then - table.insert(matching_nms, result) - end + local matching_nms = {} + local lower_query = query:lower() + for _, nm in pairs(nm_data) do + local result = string.match(nm.name:lower(), '(.*' .. lower_query .. '.*)') + if result then + table.insert(matching_nms, result) end - return matching_nms + end + return matching_nms end -windower.register_event("addon command", function(command, ...) - if commands[command] then - commands[command](...) - else - commands.help() - end +windower.register_event('addon command', function(command, ...) + if commands[command] then + commands[command](...) + else + commands.help() + end end) commands = {} commands.track = function(...) - local args = {...} - local nm_name = args[1] - local matching_nm_names = find_nms(nm_name) - - if #matching_nm_names == 0 then - EmpyPopTracker.add_to_chat('Unable to find a NM using: "' .. nm_name .. '"') - elseif #matching_nm_names > 1 then - EmpyPopTracker.add_to_chat('"' .. nm_name .. '" matches ' .. #matching_nm_names .. ' NMs. Please be more explicit:') - for key, matching_file_name in pairs(matching_nm_names) do - EmpyPopTracker.add_to_chat(' Match ' .. key .. ': ' .. ucwords(matching_file_name)) - end - else - active = true - EmpyPopTracker.add_to_chat("Now tracking: " .. ucwords(matching_nm_names[1])) - EmpyPopTracker.settings.tracking = matching_nm_names[1] - EmpyPopTracker.update() - commands.show() + local args = {...} + local nm_name = args[1] + local matching_nm_names = find_nms(nm_name) + + if #matching_nm_names == 0 then + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Unable to find a NM using: "' .. nm_name .. '"') + elseif #matching_nm_names > 1 then + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '"' .. nm_name .. '" matches ' .. #matching_nm_names .. ' NMs. Please be more explicit:') + for key, matching_file_name in pairs(matching_nm_names) do + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, ' Match ' .. key .. ': ' .. ucwords(matching_file_name)) end + else + active = true + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Now tracking: ' .. ucwords(matching_nm_names[1])) + EmpyPopTracker.settings.tracking = matching_nm_names[1] + EmpyPopTracker.update() + commands.show() + end end commands.t = commands.track commands.hide = function() - active = false - EmpyPopTracker.text:visible(false) - EmpyPopTracker.settings.visible = false - EmpyPopTracker.settings:save() + active = false + EmpyPopTracker.text:visible(false) + EmpyPopTracker.settings.visible = false + EmpyPopTracker.settings:save() end commands.show = function() - active = true - EmpyPopTracker.text:visible(true) - EmpyPopTracker.settings.visible = true - EmpyPopTracker.settings:save() - EmpyPopTracker.update() + active = true + EmpyPopTracker.text:visible(true) + EmpyPopTracker.settings.visible = true + EmpyPopTracker.settings:save() + EmpyPopTracker.update() end commands.help = function() - EmpyPopTracker.add_to_chat("---Empy Pop Tracker---") - EmpyPopTracker.add_to_chat("Available commands:") - EmpyPopTracker.add_to_chat("//ept t|track briareus - tracks Briareus pops (partial names such as apadem work too!)") - EmpyPopTracker.add_to_chat("//ept hide - hides the UI") - EmpyPopTracker.add_to_chat("//ept show - shows the UI") - EmpyPopTracker.add_to_chat("//ept list - lists all trackable NMs") - EmpyPopTracker.add_to_chat("//ept help - displays this help") + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '---Empy Pop Tracker---') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Available commands:') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept track briareus - tracks Briareus pops (partial names such as apadem work too!)') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept hide - hides the UI') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept show - shows the UI') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept list - lists all trackable NMs') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept help - displays this help') end commands.list = function() - EmpyPopTracker.add_to_chat("---Empy Pop Tracker---") - EmpyPopTracker.add_to_chat("Trackable NMs:") - for _, nm in pairs(nm_data) do - EmpyPopTracker.add_to_chat(ucwords(nm.name)) - end + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '---Empy Pop Tracker---') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Trackable NMs:') + for _, nm in pairs(nm_data) do + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, ucwords(nm.name)) + end end commands.bg = function() - local tracking_nm = nm_data[EmpyPopTracker.settings.tracking] - windower.open_url(tracking_nm.bg_url) + local tracking_nm = nm_data[EmpyPopTracker.settings.tracking] + local url = 'https://www.bg-wiki.com/bg/' .. tracking_nm.name + windower.open_url(url) end EmpyPopTracker.update = function() - local key_items = windower.ffxi.get_key_items() - local items = windower.ffxi.get_items() - local tracked_nm_data = nm_data[EmpyPopTracker.settings.tracking] - local generated_info = EmpyPopTracker.generate_info(tracked_nm_data, key_items, items) - EmpyPopTracker.text:text(generated_info.text) - if generated_info.has_all_kis then - EmpyPopTracker.text:bg_color(0, 75, 0) - else - EmpyPopTracker.text:bg_color(0, 0, 0) - end - if EmpyPopTracker.settings.visible then - EmpyPopTracker.text:visible(true) - end + local key_items = windower.ffxi.get_key_items() + local items = windower.ffxi.get_items() + local tracked_nm_data = nm_data[EmpyPopTracker.settings.tracking] + local generated_info = EmpyPopTracker.generate_info(tracked_nm_data, key_items, items) + EmpyPopTracker.text:text(generated_info.text) + if generated_info.has_all_kis then + EmpyPopTracker.text:bg_color(0, 75, 0) + else + EmpyPopTracker.text:bg_color(0, 0, 0) + end + if EmpyPopTracker.settings.visible then + EmpyPopTracker.text:visible(true) + end end windower.register_event('load', function() - if windower.ffxi.get_info().logged_in and EmpyPopTracker.settings.visible then - active = true - EmpyPopTracker.update() - end + if windower.ffxi.get_info().logged_in and EmpyPopTracker.settings.visible then + active = true + EmpyPopTracker.update() + end end) windower.register_event('add item', 'remove item', function() - if active then - EmpyPopTracker.update() - end + if active then + EmpyPopTracker.update() + end end) windower.register_event('incoming chunk', function(id) - --0x055: KI update - --0x0D2: Treasure pool addition - --0x0D3: Treasure pool lot/drop - if active and id == 0x055 or id == 0x0D2 or id == 0x0D3 then - EmpyPopTracker.update() - end + --0x055: KI update + --0x0D2: Treasure pool addition + --0x0D3: Treasure pool lot/drop + if active and id == 0x055 or id == 0x0D2 or id == 0x0D3 then + EmpyPopTracker.update() + end end) windower.register_event('login', function() - if EmpyPopTracker.settings.visible then - EmpyPopTracker.text:visible(true) - active = true - end + if EmpyPopTracker.settings.visible then + EmpyPopTracker.text:visible(true) + active = true + end end) windower.register_event('logout', function() - EmpyPopTracker.text:visible(false) - active = false + EmpyPopTracker.text:visible(false) + active = false end) return EmpyPopTracker diff --git a/addons/EmpyPopTracker/nms/README.md b/addons/EmpyPopTracker/nms/README.md index bad2e262b..720d0a7d4 100644 --- a/addons/EmpyPopTracker/nms/README.md +++ b/addons/EmpyPopTracker/nms/README.md @@ -2,25 +2,24 @@ The data structure for each trackable NM uses a series of nested NM entities. A standard NM entity contains the following data: -| Key | Type | Required? | Description | -| ------------------- | --------- | --------- | --------------------------------- | -| name | String | Required | Name of the NM | -| bg_url | String | Required | URL of the bgwiki page for the NM | -| pops | Table | Optional | The pop information for the NM | -| pops{}.id | Number | Required | The ID of the item/key item | -| pops{}.type | String | Required | Either "key item" or "item" | -| pops{}.dropped_from | NM Entity | Required | A nested set of NM information | +| Key | Type | Required? | Description | +| ------------------- | --------- | --------- | ------------------------------ | +| name | String | Required | Name of the NM | +| pops | Table | Optional | The pop information for the NM | +| pops{}.id | Number | Required | The ID of the item/key item | +| pops{}.type | String | Required | Either "key item" or "item" | +| pops{}.dropped_from | NM Entity | Required | A nested set of NM information | A simple example of the above would be: ```lua { - name = "Azdaja", - pops = { { - id = 1531, --Vacant Bugard Eye - type = "key item", - dropped_from = { name = "Deelgeed, Timed (F-9/F-10)" } - } } + name = 'Azdaja', + pops = { { + id = 1531, --Vacant Bugard Eye + type = 'key item', + dropped_from = { name = 'Deelgeed, Timed (F-9/F-10)' } + } } } ``` @@ -28,34 +27,36 @@ A larger example with multiple nested entites: ```lua { - name = "Bukhis", - pops = { { - id = 1508, --Ingrown Taurus Nail - type = "key item", - dropped_from = { - name = "Khalkotaur, Forced (F-4)", - pops = { { - id = 3098, --Gnarled Taurus Horn - type = "item", - dropped_from = { name = "Aestutaur (G-9/G-10)" } - } } - }, { - id = 1509, --Ossified Gargouille Hand - type = "key item", - dropped_from = { - name = "Quasimodo, Forced (F-4)", - pops = { { - id = 3099, --Gargouille Stone - type = "item", - dropped_from = { name = "Gruesome Gargouille (F-10/G-10)" } - } } - } - }, { - id = 1510, --Imbrued Vampyr Fang - type = "key item", - dropped_from = { name = "Lord Varney, Timed (G-10/H-10)" } + name = 'Bukhis', + pops = { { + id = 1508, --Ingrown Taurus Nail + type = 'key item', + dropped_from = { + name = 'Khalkotaur, Forced (F-4)', + pops = { { + id = 3098, --Gnarled Taurus Horn + type = 'item', + dropped_from = { name = 'Aestutaur (G-9/G-10)' } + } } + }, { + id = 1509, --Ossified Gargouille Hand + type = 'key item', + dropped_from = { + name = 'Quasimodo, Forced (F-4)', + pops = { { + id = 3099, --Gargouille Stone + type = 'item', + dropped_from = { + name = 'Gruesome Gargouille (F-10/G-10)' + } } } - } + } + }, { + id = 1510, --Imbrued Vampyr Fang + type = 'key item', + dropped_from = { name = 'Lord Varney, Timed (G-10/H-10)' } + } } + } } ``` diff --git a/addons/EmpyPopTracker/nms/alfard.lua b/addons/EmpyPopTracker/nms/alfard.lua index 88dedb7a2..689d4ddcc 100644 --- a/addons/EmpyPopTracker/nms/alfard.lua +++ b/addons/EmpyPopTracker/nms/alfard.lua @@ -27,33 +27,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Alfard", - bg_url = 'https://www.bg-wiki.com/bg/Alfard', - pops = { { - id = 1530, --Venomous hydra fang - type = "key item", + name = 'Alfard', + pops = { { + id = 1530, --Venomous hydra fang + type = 'key item', + dropped_from = { + name = 'Ningishzida, Forced (I-7/I-8)', + pops = { { + id = 3262, --Jaculus Wing + type = 'item', + dropped_from = { name = 'Jaculus, Timed (I-8)' } + }, { + id = 3261, --Minaruja Skull + type = 'item', dropped_from = { - name = "Ningishzida, Forced (I-7/I-8)", - pops = { { - id = 3262, --Jaculus Wing - type = "item", - dropped_from = { name = "Jaculus, Timed (I-8)" } - }, { - id = 3261, --Minaruja Skull - type = "item", - dropped_from = { - name = "Minaruja, Forced (I-10)", - pops = { { - id = 3267, --Pursuer's Wing - type = "item", - dropped_from = { name = "Faunus Wyvern (I-9)" } - } } - } - }, { - id = 3268, --High-Quality Wivre Hide - type = "item", - dropped_from = { name = "Glade Wivre (I-8)" } - } } + name = 'Minaruja, Forced (I-10)', + pops = { { + id = 3267, --Pursuer's Wing + type = 'item', + dropped_from = { name = 'Faunus Wyvern (I-9)' } + } } } - } } + }, { + id = 3268, --High-Quality Wivre Hide + type = 'item', + dropped_from = { name = 'Glade Wivre (I-8)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/apademak.lua b/addons/EmpyPopTracker/nms/apademak.lua index f3c37a21e..63315f568 100644 --- a/addons/EmpyPopTracker/nms/apademak.lua +++ b/addons/EmpyPopTracker/nms/apademak.lua @@ -27,32 +27,31 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Apademak", - bg_url = 'https://www.bg-wiki.com/bg/Apademak', - pops = { { - id = 1525, --Torn Khimaira Wing - type = "key item", + name = 'Apademak', + pops = { { + id = 1525, --Torn Khimaira Wing + type = 'key item', + dropped_from = { + name = 'Dhorme Khimaira, Forced (F-7)', + pops = { { + id = 3246, --Snow God Core + type = 'item', dropped_from = { - name = "Dhorme Khimaira, Forced (F-7)", - pops = { { - id = 3246, --Snow God Core - type = "item", - dropped_from = { - name = "Upas-Kamuy, Forced (G-5)", - pops = { { - id = 3252, --Gelid Arm - dropped_from = { name = "Snowflake (G-5)" } - } } - } - }, { - id = 3247, --Sisyphus Fragment - type = "item", - dropped_from = { name = "Sisyphus, Timed (F-6/G-6)" } - }, { - id = 3253, --High-quality marid hide - type = "item", - dropped_from = { name = "Olyphant (F-6)" } - } } + name = 'Upas-Kamuy, Forced (G-5)', + pops = { { + id = 3252, --Gelid Arm + dropped_from = { name = 'Snowflake (G-5)' } + } } } - } } + }, { + id = 3247, --Sisyphus Fragment + type = 'item', + dropped_from = { name = 'Sisyphus, Timed (F-6/G-6)' } + }, { + id = 3253, --High-quality marid hide + type = 'item', + dropped_from = { name = 'Olyphant (F-6)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/azdaja.lua b/addons/EmpyPopTracker/nms/azdaja.lua index 28716728a..b6eb58f1d 100644 --- a/addons/EmpyPopTracker/nms/azdaja.lua +++ b/addons/EmpyPopTracker/nms/azdaja.lua @@ -27,11 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Azdaja", - bg_url = 'https://www.bg-wiki.com/bg/Azdaja', - pops = { { - id = 1531, --Vacant Bugard Eye - type = "key item", - dropped_from = { name = "Deelgeed, Timed (F-9/F-10)" } - } } + name = 'Azdaja', + pops = { { + id = 1531, --Vacant Bugard Eye + type = 'key item', + dropped_from = { name = 'Deelgeed, Timed (F-9/F-10)' } + } } } diff --git a/addons/EmpyPopTracker/nms/briareus.lua b/addons/EmpyPopTracker/nms/briareus.lua index 141f27b64..553350cbd 100644 --- a/addons/EmpyPopTracker/nms/briareus.lua +++ b/addons/EmpyPopTracker/nms/briareus.lua @@ -27,40 +27,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Briareus", - bg_url = 'https://www.bg-wiki.com/bg/Briareus', - pops = { { - id = 1482, --Dented Gigas Shield - type = "key item", - dropped_from = { - name = "Adamastor, Forced (C-4)", - pops = { { - id = 2894, --Trophy Shield - type = "item", - dropped_from = { name = "Bathyal Gigas (C-5/D-5)" } - } } - } - }, { - id = 1484, --Severed Gigas Collar - type = "key item", - dropped_from = { - name = "Grandgousier, Forced (F-10)", - pops = { { - id = 2896, --Massive Armband - type = "item", - dropped_from = { name = "Demersal Gigas (E-9/F-9)" } - } } - } - }, { - id = 1483, --Warped Gigas Armband - type = "key item", - dropped_from = { - name = "Pantagruel, Forced (F-7)", - pops = { { - id = 2895, --Oversized Sock - type = "item", - dropped_from = { name = "Hadal Gigas (F-6/F-7)" } - } } - } - } } + name = 'Briareus', + pops = { { + id = 1482, --Dented Gigas Shield + type = 'key item', + dropped_from = { + name = 'Adamastor, Forced (C-4)', + pops = { { + id = 2894, --Trophy Shield + type = 'item', + dropped_from = { name = 'Bathyal Gigas (C-5/D-5)' } + } } + } + }, { + id = 1484, --Severed Gigas Collar + type = 'key item', + dropped_from = { + name = 'Grandgousier, Forced (F-10)', + pops = { { + id = 2896, --Massive Armband + type = 'item', + dropped_from = { name = 'Demersal Gigas (E-9/F-9)' } + } } + } + }, { + id = 1483, --Warped Gigas Armband + type = 'key item', + dropped_from = { + name = 'Pantagruel, Forced (F-7)', + pops = { { + id = 2895, --Oversized Sock + type = 'item', + dropped_from = { name = 'Hadal Gigas (F-6/F-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/bukhis.lua b/addons/EmpyPopTracker/nms/bukhis.lua index 4197cc0eb..019864b73 100644 --- a/addons/EmpyPopTracker/nms/bukhis.lua +++ b/addons/EmpyPopTracker/nms/bukhis.lua @@ -27,33 +27,34 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Bukhis", - bg_url = 'https://www.bg-wiki.com/bg/Bukhis', - pops = { { - id = 1508, --Ingrown Taurus Nail - type = "key item", + name = 'Bukhis', + pops = { { + id = 1508, --Ingrown Taurus Nail + type = 'key item', + dropped_from = { + name = 'Khalkotaur, Forced (F-4)', + pops = { { + id = 3098, --Gnarled Taurus Horn + type = 'item', + dropped_from = { name = 'Aestutaur (G-9/G-10)' } + } } + } + }, { + id = 1509, --Ossified Gargouille Hand + type = 'key item', + dropped_from = { + name = 'Quasimodo, Forced (F-4)', + pops = { { + id = 3099, --Gargouille Stone + type = 'item', dropped_from = { - name = "Khalkotaur, Forced (F-4)", - pops = { { - id = 3098, --Gnarled Taurus Horn - type = "item", - dropped_from = { name = "Aestutaur (G-9/G-10)" } - } } + name = 'Gruesome Gargouille (F-10/G-10)' } - }, { - id = 1509, --Ossified Gargouille Hand - type = "key item", - dropped_from = { - name = "Quasimodo, Forced (F-4)", - pops = { { - id = 3099, --Gargouille Stone - type = "item", - dropped_from = { name = "Gruesome Gargouille (F-10/G-10)" } - } } - } - }, { - id = 1510, --Imbrued Vampyr Fang - type = "key item", - dropped_from = { name = "Lord Varney, Timed (G-10/H-10)" } - } } + } } + } + }, { + id = 1510, --Imbrued Vampyr Fang + type = 'key item', + dropped_from = { name = 'Lord Varney, Timed (G-10/H-10)' } + } } } diff --git a/addons/EmpyPopTracker/nms/carabosse.lua b/addons/EmpyPopTracker/nms/carabosse.lua index 7f4c59c86..97b0c9c5e 100644 --- a/addons/EmpyPopTracker/nms/carabosse.lua +++ b/addons/EmpyPopTracker/nms/carabosse.lua @@ -27,29 +27,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Carabosse", - bg_url = 'https://www.bg-wiki.com/bg/Carabosse', - pops = { { - id = 1485, --Pellucid Fly Eye - type = "key item", - dropped_from = { - name = "La Theine Liege, Forced (I-7)", - pops = { { - id = 2897, --Transparent Insect Wing - type = "item", - dropped_from = { name = "Plateau Glider (H-7)" } - } } - } - }, { - id = 1486, --Shimmering Pixie Pinion - type = "key item", - dropped_from = { - name = "Baba Yaga, Forced (H-7)", - pops = { { - id = 2898, --Piceous Scale - type = "item", - dropped_from = { name = "Farfadet (H-7)" } - } } - } - } } + name = 'Carabosse', + pops = { { + id = 1485, --Pellucid Fly Eye + type = 'key item', + dropped_from = { + name = 'La Theine Liege, Forced (I-7)', + pops = { { + id = 2897, --Transparent Insect Wing + type = 'item', + dropped_from = { name = 'Plateau Glider (H-7)' } + } } + } + }, { + id = 1486, --Shimmering Pixie Pinion + type = 'key item', + dropped_from = { + name = 'Baba Yaga, Forced (H-7)', + pops = { { + id = 2898, --Piceous Scale + type = 'item', + dropped_from = { name = 'Farfadet (H-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/chloris.lua b/addons/EmpyPopTracker/nms/chloris.lua index 7695cd0e0..78dbaeacc 100644 --- a/addons/EmpyPopTracker/nms/chloris.lua +++ b/addons/EmpyPopTracker/nms/chloris.lua @@ -27,88 +27,87 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Chloris", - bg_url = 'https://www.bg-wiki.com/bg/Chloris', - pops = { { - id = 1470, --Gory Scorpion Claw - type = "key item", + name = 'Chloris', + pops = { { + id = 1470, --Gory Scorpion Claw + type = 'key item', + dropped_from = { + name = 'Hedetet, Forced (F-7)', + pops = { { + id = 2921, --Venomous Scorpion Stinger + type = 'item', + dropped_from = { name = 'Canyon Scorpion (F-7)' } + }, { + id = 2948, --Acidic Humus + type = 'item', dropped_from = { - name = "Hedetet, Forced (F-7)", - pops = { { - id = 2921, --Venomous Scorpion Stinger - type = "item", - dropped_from = { name = "Canyon Scorpion (F-7)" } - }, { - id = 2948, --Acidic Humus - type = "item", - dropped_from = { - name = "Gancanagh, Forced (H-8)", - pops = { { - id = 2920, --Alkaline Humus - type = "item", - dropped_from = { name = "Pachypodium (H-8)" } - } } - } - } } + name = 'Gancanagh, Forced (H-8)', + pops = { { + id = 2920, --Alkaline Humus + type = 'item', + dropped_from = { name = 'Pachypodium (H-8)' } + } } } - }, { - id = 1469, --Torn Bat Wing - type = "key item", + } } + } + }, { + id = 1469, --Torn Bat Wing + type = 'key item', + dropped_from = { + name = 'Treble Noctules, Forced (I-9)', + pops = { { + id = 2919, --Bloody Fang + type = 'item', + dropped_from = { name = 'Blood Bat (I-9)' } + }, { + id = 2947, --Exorcised Skull + type = 'item', dropped_from = { - name = "Treble Noctules, Forced (I-9)", - pops = { { - id = 2919, --Bloody Fang - type = "item", - dropped_from = { name = "Blood Bat (I-9)" } - }, { - id = 2947, --Exorcised Skull - type = "item", - dropped_from = { - name = "Cannered Noz, Forced (F-6)", - pops = { { - id = 2918, --Baleful Skull - type = "item", - dropped_from = { name = "Caoineag (F-6)" } - } } - } - } } + name = 'Cannered Noz, Forced (F-6)', + pops = { { + id = 2918, --Baleful Skull + type = 'item', + dropped_from = { name = 'Caoineag (F-6)' } + } } } - }, { - id = 1468, --Veinous Hecteyes Eyelid - type = "key item", + } } + } + }, { + id = 1468, --Veinous Hecteyes Eyelid + type = 'key item', + dropped_from = { + name = 'Ophanim, Forced (G-9)', + pops = { { + id = 2946, --Tarnished Pincer + type = 'item', dropped_from = { - name = "Ophanim, Forced (G-9)", - pops = { { - id = 2946, --Tarnished Pincer - type = "item", - dropped_from = { - name = "Vetehinen, Forced (H-10)", - pops = { { - id = 2916, --High-quality Limule Pincer - type = "item", - dropped_from = { name = "Gulch Limule (H-10)" } - }, { - id = 2917, --Bloodshot Hecteye - type = "item", - dropped_from = { name = "Beholder (G-9)" } - }, { - id = 2945, --Shriveled Wing - type = "item", - dropped_from = { - name = "Halimede, Forced (G-12)", - pops = { { - id = 2915, --High-quality Clionid Wing - type = "item", - dropped_from = { name = "Gully Clionid (G-12)" } - } } - } - } } - } - } } + name = 'Vetehinen, Forced (H-10)', + pops = { { + id = 2916, --High-quality Limule Pincer + type = 'item', + dropped_from = { name = 'Gulch Limule (H-10)' } + }, { + id = 2917, --Bloodshot Hecteye + type = 'item', + dropped_from = { name = 'Beholder (G-9)' } + }, { + id = 2945, --Shriveled Wing + type = 'item', + dropped_from = { + name = 'Halimede, Forced (G-12)', + pops = { { + id = 2915, --High-quality Clionid Wing + type = 'item', + dropped_from = { name = 'Gully Clionid (G-12)' } + } } + } + } } } - }, { - id = 1471, --Mossy Adamantoise Shell - type = "key item", - dropped_from = { name = "Chukwa, Timed (F-5)" } - } } + } } + } + }, { + id = 1471, --Mossy Adamantoise Shell + type = 'key item', + dropped_from = { name = 'Chukwa, Timed (F-5)' } + } } } diff --git a/addons/EmpyPopTracker/nms/cirein-croin.lua b/addons/EmpyPopTracker/nms/cirein-croin.lua index 78354bcd6..7a8a40af7 100644 --- a/addons/EmpyPopTracker/nms/cirein-croin.lua +++ b/addons/EmpyPopTracker/nms/cirein-croin.lua @@ -27,22 +27,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Cirein-Croin", - bg_url = 'https://www.bg-wiki.com/bg/Cirein-croin', - pops = { { - id = 1504, --Glistening Orobon Liver - type = "key item", - dropped_from = { - name = "Cep-Kamuy, Forced (F-4)", - pops = { { - id = 3089, --Orobon Cheekmeat - type = "item", - dropped_from = { name = "Ancient Orobon (F-5)" } - } } - } - }, { - id = 1505, --Doffed Poroggo Hat - type = "key item", - dropped_from = { name = "Heqet, Timed (I-6)" } - } } + name = 'Cirein-croin', + pops = { { + id = 1504, --Glistening Orobon Liver + type = 'key item', + dropped_from = { + name = 'Cep-Kamuy, Forced (F-4)', + pops = { { + id = 3089, --Orobon Cheekmeat + type = 'item', + dropped_from = { name = 'Ancient Orobon (F-5)' } + } } + } + }, { + id = 1505, --Doffed Poroggo Hat + type = 'key item', + dropped_from = { name = 'Heqet, Timed (I-6)' } + } } } diff --git a/addons/EmpyPopTracker/nms/dragua.lua b/addons/EmpyPopTracker/nms/dragua.lua index c584499ca..aa841e076 100644 --- a/addons/EmpyPopTracker/nms/dragua.lua +++ b/addons/EmpyPopTracker/nms/dragua.lua @@ -27,11 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Dragua", - bg_url = 'https://www.bg-wiki.com/bg/Dragua', - pops = { { - id = 1521, --Bloodied Dragon Ear - type = "key item", - dropped_from = { name = "Hazhdiha, Timed (H-10)" } - } } + name = 'Dragua', + pops = { { + id = 1521, --Bloodied Dragon Ear + type = 'key item', + dropped_from = { name = 'Hazhdiha, Timed (H-10)' } + } } } diff --git a/addons/EmpyPopTracker/nms/glavoid.lua b/addons/EmpyPopTracker/nms/glavoid.lua index 067d2a345..3acf9b513 100644 --- a/addons/EmpyPopTracker/nms/glavoid.lua +++ b/addons/EmpyPopTracker/nms/glavoid.lua @@ -27,57 +27,56 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Glavoid", - bg_url = 'https://www.bg-wiki.com/bg/Glavoid', - pops = { { - id = 1473, --Sodden Sandworm Husk - type = "key item", - dropped_from = { name = "Minhocao, Timed (I-6)" } - }, { - id = 1475, --Sticky Gnat Wing - type = "key item", - dropped_from = { name = "Adze, Timed (G-5)" } - }, { - id = 1472, --Fat-lined Cockatrice Skin - type = "key item", + name = 'Glavoid', + pops = { { + id = 1473, --Sodden Sandworm Husk + type = 'key item', + dropped_from = { name = 'Minhocao, Timed (I-6)' } + }, { + id = 1475, --Sticky Gnat Wing + type = 'key item', + dropped_from = { name = 'Adze, Timed (G-5)' } + }, { + id = 1472, --Fat-lined Cockatrice Skin + type = 'key item', + dropped_from = { + name = 'Alectryon (H-8)', + pops = { { + id = 2923, --Cockatrice Tailmeat + type = 'item', + dropped_from = { name = 'Cluckatrice (H-8)' } + }, { + id = 2949, --Quivering Eft Egg + type = 'item', dropped_from = { - name = "Alectryon (H-8)", - pops = { { - id = 2923, --Cockatrice Tailmeat - type = "item", - dropped_from = { name = "Cluckatrice (H-8)" } - }, { - id = 2949, --Quivering Eft Egg - type = "item", - dropped_from = { - name = "Abas, Forced (K-10)", - pops = { { - id = 2922, --Eft Egg - dropped_from = { name = "Canyon Eft (J-10/J-11)" } - } } - } - } } + name = 'Abas, Forced (K-10)', + pops = { { + id = 2922, --Eft Egg + dropped_from = { name = 'Canyon Eft (J-10/J-11)' } + } } } - }, { - id = 1474, --Luxuriant manticore mane - type = "key item", + } } + } + }, { + id = 1474, --Luxuriant manticore mane + type = 'key item', + dropped_from = { + name = 'Muscaliet, Forced (J-6)', + pops = { { + id = 2925, --Resilient Mane + type = 'item', + dropped_from = { name = 'Hieracosphinx (J-6)' } + }, { + id = 2950, --Smooth Whisker + type = 'item', dropped_from = { - name = "Muscaliet, Forced (J-6)", - pops = { { - id = 2925, --Resilient Mane - type = "item", - dropped_from = { name = "Hieracosphinx (J-6)" } - }, { - id = 2950, --Smooth Whisker - type = "item", - dropped_from = { - name = "Tefenet, Forced (G-6)", - pops = { { - id = 2924, --Shocking Whisker - dropped_from = { name = "Jaguarundi (G-6)" } - } } - } - } } + name = 'Tefenet, Forced (G-6)', + pops = { { + id = 2924, --Shocking Whisker + dropped_from = { name = 'Jaguarundi (G-6)' } + } } } - } } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/index.lua b/addons/EmpyPopTracker/nms/index.lua index 9091a466a..e10a91c5c 100644 --- a/addons/EmpyPopTracker/nms/index.lua +++ b/addons/EmpyPopTracker/nms/index.lua @@ -27,28 +27,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] local nms = { - 'alfard', - 'apademak', - 'azdaja', - 'briareus', - 'bukhis', - 'carabosse', - 'chloris', - 'cirein-croin', - 'dragua', - 'glavoid', - 'isgebind', - 'itzpapalotl', - 'kukulkan', - 'orthrus', - 'sedna', - 'sobek', - 'ulhuadshi' + 'alfard', + 'apademak', + 'azdaja', + 'briareus', + 'bukhis', + 'carabosse', + 'chloris', + 'cirein-croin', + 'dragua', + 'glavoid', + 'isgebind', + 'itzpapalotl', + 'kukulkan', + 'orthrus', + 'sedna', + 'sobek', + 'ulhuadshi' } nm_data = {} for _, nm in pairs(nms) do - nm_data[nm] = require('nms/' .. nm) + nm_data[nm] = require('nms/' .. nm) end return nm_data diff --git a/addons/EmpyPopTracker/nms/isgebind.lua b/addons/EmpyPopTracker/nms/isgebind.lua index 3d5f5ef1e..266c59e4e 100644 --- a/addons/EmpyPopTracker/nms/isgebind.lua +++ b/addons/EmpyPopTracker/nms/isgebind.lua @@ -27,11 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Isgebind", - bg_url = 'https://www.bg-wiki.com/bg/Isgebind', - pops = { { - id = 1526, --Begrimed Dragon Hide - type = "key item", - dropped_from = { name = "Kur, Timed (I-5/J-5)" } - } } + name = 'Isgebind', + pops = { { + id = 1526, --Begrimed Dragon Hide + type = 'key item', + dropped_from = { name = 'Kur, Timed (I-5/J-5)' } + } } } diff --git a/addons/EmpyPopTracker/nms/itzpapalotl.lua b/addons/EmpyPopTracker/nms/itzpapalotl.lua index 5e44302d2..744677a52 100644 --- a/addons/EmpyPopTracker/nms/itzpapalotl.lua +++ b/addons/EmpyPopTracker/nms/itzpapalotl.lua @@ -27,33 +27,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Itzpapalotl", - bg_url = 'https://www.bg-wiki.com/bg/Itzpapalotl', - pops = { { - id = 1488, --Venomous Wamoura Feeler - type = "key item", - dropped_from = { - name = "Granite Borer, Forced (K-10)", - pops = { { - id = 3072, --Withered Cocoon - type = "item", - dropped_from = { name = "Gullycampa (K-10)" } - } } - } - }, { - id = 1490, --Distended Chigoe Abdomen - type = "key item", - dropped_from = { name = "Tunga, Timed (K-10)" } - }, { - id = 1489, --Bulbous crawler cocoon - type = "key item", - dropped_from = { - name = "Blazing Eruca, Forced (J-10)", - pops = { { - id = 3073, --Eruca Egg - type = "item", - dropped_from = { name = "Ignis Eruca (J-10)" } - } } - } - } } + name = 'Itzpapalotl', + pops = { { + id = 1488, --Venomous Wamoura Feeler + type = 'key item', + dropped_from = { + name = 'Granite Borer, Forced (K-10)', + pops = { { + id = 3072, --Withered Cocoon + type = 'item', + dropped_from = { name = 'Gullycampa (K-10)' } + } } + } + }, { + id = 1490, --Distended Chigoe Abdomen + type = 'key item', + dropped_from = { name = 'Tunga, Timed (K-10)' } + }, { + id = 1489, --Bulbous crawler cocoon + type = 'key item', + dropped_from = { + name = 'Blazing Eruca, Forced (J-10)', + pops = { { + id = 3073, --Eruca Egg + type = 'item', + dropped_from = { name = 'Ignis Eruca (J-10)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/kukulkan.lua b/addons/EmpyPopTracker/nms/kukulkan.lua index 5b1ddcc0b..002a1926b 100644 --- a/addons/EmpyPopTracker/nms/kukulkan.lua +++ b/addons/EmpyPopTracker/nms/kukulkan.lua @@ -27,40 +27,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Kukulkan", - bg_url = 'https://www.bg-wiki.com/bg/Kukulkan', - pops = { { - id = 1466, --Mucid Ahriman Eyeball - type = "key item", - dropped_from = { - name = "Arimaspi, Forced (K-6)", - pops = { { - id = 2913, --Clouded Lens - type = "item", - dropped_from = { name = "Deep Eye (K-6/K-7)" } - } } - } - }, { - id = 1464, --Tattered Hippogryph Wing - type = "key item", - dropped_from = { - name = "Alkonost, Forced (H-6)", - pops = { { - id = 2912, --Giant Bugard Tusk - type = "item", - dropped_from = { name = "Ypotryll (I-7)" } - } } - } - }, { - id = 1465, --Cracked Wivre Horn - type = "key item", - dropped_from = { - name = "Keratyrannos, Forced (G-6)", - pops = { { - id = 2910, --Armored Dragonhorn - type = "item", - dropped_from = { name = "Mesa Wivre (G-6)" } - } } - } - } } + name = 'Kukulkan', + pops = { { + id = 1466, --Mucid Ahriman Eyeball + type = 'key item', + dropped_from = { + name = 'Arimaspi, Forced (K-6)', + pops = { { + id = 2913, --Clouded Lens + type = 'item', + dropped_from = { name = 'Deep Eye (K-6/K-7)' } + } } + } + }, { + id = 1464, --Tattered Hippogryph Wing + type = 'key item', + dropped_from = { + name = 'Alkonost, Forced (H-6)', + pops = { { + id = 2912, --Giant Bugard Tusk + type = 'item', + dropped_from = { name = 'Ypotryll (I-7)' } + } } + } + }, { + id = 1465, --Cracked Wivre Horn + type = 'key item', + dropped_from = { + name = 'Keratyrannos, Forced (G-6)', + pops = { { + id = 2910, --Armored Dragonhorn + type = 'item', + dropped_from = { name = 'Mesa Wivre (G-6)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/orthrus.lua b/addons/EmpyPopTracker/nms/orthrus.lua index ea7a0d817..0a48cea5b 100644 --- a/addons/EmpyPopTracker/nms/orthrus.lua +++ b/addons/EmpyPopTracker/nms/orthrus.lua @@ -27,32 +27,31 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Orthrus", - bg_url = 'https://www.bg-wiki.com/bg/Orthrus', - pops = { { - id = 1520, --Steaming cerberus tongue - type = "key item", + name = 'Orthrus', + pops = { { + id = 1520, --Steaming cerberus tongue + type = 'key item', + dropped_from = { + name = 'Amarok, Forced (E-6)', + pops = { { + id = 3231, --Sharabha Hide + type = 'item', dropped_from = { - name = "Amarok, Forced (E-6)", - pops = { { - id = 3231, --Sharabha Hide - type = "item", - dropped_from = { - name = "Sharabha, Forced (G-5)", - pops = { { - id = 3237, - dropped_from = { name = "Dune Manticore (F-5/F-6)" } - } } - } - }, { - id = 3232, --Tiger King Hide - type = "item", - dropped_from = { name = "Ansherekh, Timed (F-8/G-8)" } - }, { - id = 3238, --H.Q. Dhalmel Hide - type = "item", - dropped_from = { name = "Camelopardalis (F-7/G-7)" } - } } + name = 'Sharabha, Forced (G-5)', + pops = { { + id = 3237, + dropped_from = { name = 'Dune Manticore (F-5/F-6)' } + } } } - } } + }, { + id = 3232, --Tiger King Hide + type = 'item', + dropped_from = { name = 'Ansherekh, Timed (F-8/G-8)' } + }, { + id = 3238, --H.Q. Dhalmel Hide + type = 'item', + dropped_from = { name = 'Camelopardalis (F-7/G-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/sedna.lua b/addons/EmpyPopTracker/nms/sedna.lua index de3f84d1c..d6b20f988 100644 --- a/addons/EmpyPopTracker/nms/sedna.lua +++ b/addons/EmpyPopTracker/nms/sedna.lua @@ -27,22 +27,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Sedna", - bg_url = 'https://www.bg-wiki.com/bg/Sedna', - pops = { { - id = 1512, --Shimmering Pugil Scale - type = "key item", - dropped_from = { name = "Hrosshvalur, Timed (J-6)" } - }, { - id = 1511, --Glossy Sea Monk Sucker - type = "key item", - dropped_from = { - name = "Iku-Turso, Forced (J-7)", - pops = { { - id = 3100, --Moonbeam Clam - type = "item", - dropped_from = { name = "Jasconius (I-7/J-7)" } - } } - } - } } + name = 'Sedna', + pops = { { + id = 1512, --Shimmering Pugil Scale + type = 'key item', + dropped_from = { name = 'Hrosshvalur, Timed (J-6)' } + }, { + id = 1511, --Glossy Sea Monk Sucker + type = 'key item', + dropped_from = { + name = 'Iku-Turso, Forced (J-7)', + pops = { { + id = 3100, --Moonbeam Clam + type = 'item', + dropped_from = { name = 'Jasconius (I-7/J-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/sobek.lua b/addons/EmpyPopTracker/nms/sobek.lua index 570fd9d51..f6e22e968 100644 --- a/addons/EmpyPopTracker/nms/sobek.lua +++ b/addons/EmpyPopTracker/nms/sobek.lua @@ -27,33 +27,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Sobek", - bg_url = 'https://www.bg-wiki.com/bg/Sobek', - pops = { { - id = 1500, --Molted Peiste Skin - type = "key item", - dropped_from = { name = "Gukumatz, Timed (J-11)" } - }, { - id = 1498, --Bloodstained Bugard Fang - type = "key item", - dropped_from = { - name = "Minax Bugard, Forced (K-10)", - pops = { { - id = 3085, --Bewitching Tusk - type = "item", - dropped_from = { name = "Abyssobugard (J-10/K-11)" } - } } - } - }, { - id = 1499, --Gnarled Lizard Nail - type = "key item", - dropped_from = { - name = "Sirrush, Forced (I-11)", - pops = { { - id = 3086, --Molt Scraps - type = "item", - dropped_from = { name = "Dusk Lizard (J-11)" } - } } - } - } } + name = 'Sobek', + pops = { { + id = 1500, --Molted Peiste Skin + type = 'key item', + dropped_from = { name = 'Gukumatz, Timed (J-11)' } + }, { + id = 1498, --Bloodstained Bugard Fang + type = 'key item', + dropped_from = { + name = 'Minax Bugard, Forced (K-10)', + pops = { { + id = 3085, --Bewitching Tusk + type = 'item', + dropped_from = { name = 'Abyssobugard (J-10/K-11)' } + } } + } + }, { + id = 1499, --Gnarled Lizard Nail + type = 'key item', + dropped_from = { + name = 'Sirrush, Forced (I-11)', + pops = { { + id = 3086, --Molt Scraps + type = 'item', + dropped_from = { name = 'Dusk Lizard (J-11)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/ulhuadshi.lua b/addons/EmpyPopTracker/nms/ulhuadshi.lua index 3d2211396..ad63f9168 100644 --- a/addons/EmpyPopTracker/nms/ulhuadshi.lua +++ b/addons/EmpyPopTracker/nms/ulhuadshi.lua @@ -27,22 +27,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = "Ulhuadshi", - bg_url = 'https://www.bg-wiki.com/bg/Ulhuadshi', - pops = { { - id = 1492, --Shriveled Hecteyes Stalk - type = "key item", - dropped_from = { name = "Amun, Timed (H-8/I-9)" } - }, { - id = 1491, --Mucid Worm Segment - type = "key item", - dropped_from = { - name = "Pallid Percy, Forced (J-7)", - pops = { { - id = 3074, --Blanched Silver - type = "item", - dropped_from = { name = "Entozoon (J-7)" } - } } - } - } } + name = 'Ulhuadshi', + pops = { { + id = 1492, --Shriveled Hecteyes Stalk + type = 'key item', + dropped_from = { name = 'Amun, Timed (H-8/I-9)' } + }, { + id = 1491, --Mucid Worm Segment + type = 'key item', + dropped_from = { + name = 'Pallid Percy, Forced (J-7)', + pops = { { + id = 3074, --Blanched Silver + type = 'item', + dropped_from = { name = 'Entozoon (J-7)' } + } } + } + } } } From 5eaf5b0bf6e7b91aaf2b5b97910f36c31c2f50b1 Mon Sep 17 00:00:00 2001 From: Dean James Date: Sun, 9 Feb 2020 13:49:40 +0000 Subject: [PATCH 4/4] Switched to pattern matching. Reverted indents to 4 spaces. Commands now handle different cases. --- addons/EmpyPopTracker/EmpyPopTracker.lua | 349 +++++++++++---------- addons/EmpyPopTracker/README.md | 6 +- addons/EmpyPopTracker/nms/README.md | 67 ++-- addons/EmpyPopTracker/nms/alfard.lua | 52 +-- addons/EmpyPopTracker/nms/apademak.lua | 50 +-- addons/EmpyPopTracker/nms/azdaja.lua | 12 +- addons/EmpyPopTracker/nms/briareus.lua | 70 ++--- addons/EmpyPopTracker/nms/bukhis.lua | 56 ++-- addons/EmpyPopTracker/nms/carabosse.lua | 48 +-- addons/EmpyPopTracker/nms/chloris.lua | 152 ++++----- addons/EmpyPopTracker/nms/cirein-croin.lua | 34 +- addons/EmpyPopTracker/nms/dragua.lua | 12 +- addons/EmpyPopTracker/nms/glavoid.lua | 96 +++--- addons/EmpyPopTracker/nms/index.lua | 36 +-- addons/EmpyPopTracker/nms/isgebind.lua | 12 +- addons/EmpyPopTracker/nms/itzpapalotl.lua | 56 ++-- addons/EmpyPopTracker/nms/kukulkan.lua | 70 ++--- addons/EmpyPopTracker/nms/orthrus.lua | 50 +-- addons/EmpyPopTracker/nms/sedna.lua | 34 +- addons/EmpyPopTracker/nms/sobek.lua | 56 ++-- addons/EmpyPopTracker/nms/ulhuadshi.lua | 34 +- 21 files changed, 678 insertions(+), 674 deletions(-) diff --git a/addons/EmpyPopTracker/EmpyPopTracker.lua b/addons/EmpyPopTracker/EmpyPopTracker.lua index cb11451aa..a87bbf5d2 100644 --- a/addons/EmpyPopTracker/EmpyPopTracker.lua +++ b/addons/EmpyPopTracker/EmpyPopTracker.lua @@ -26,7 +26,7 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] -_addon.name = "Empy Pop Tracker" +_addon.name = 'Empy Pop Tracker' _addon.author = 'Dean James (Xurion of Bismarck)' _addon.commands = { 'ept', 'empypoptracker' } _addon.version = '2.0.0' @@ -68,256 +68,259 @@ colors.warning = '\\cs(255,170,0)' colors.close = '\\cr' function owns_item(id, items) - for _, bag in ipairs(items) do - for _, item in ipairs(bag) do - if item.id == id then - return true - end + for _, bag in ipairs(items) do + for _, item in ipairs(bag) do + if item.id == id then + return true + end + end end - end - return false + return false end function owns_key_item(id, items) - local owned = false + local owned = false - for _, item_id in pairs(items) do - if item_id == id then - owned = true - break + for _, item_id in pairs(items) do + if item_id == id then + owned = true + break + end end - end - return owned + return owned end function item_treasure_pool_count(id, treasure) - local count = 0 + local count = 0 - for _, item in pairs(treasure) do - if item.item_id == id then - count = count + 1 + for _, item in pairs(treasure) do + if item.item_id == id then + count = count + 1 + end end - end - return count + return count end function ucwords(str) - local result = string.gsub(str, '(%a)([%w_\']*)', function(first, rest) - return first:upper() .. rest:lower() - end) + local result = string.gsub(str, '(%a)([%w_\']*)', function(first, rest) + return first:upper() .. rest:lower() + end) - return result + return result end function get_indent(depth) - return string.rep(' ', depth) + return string.rep(' ', depth) end function generate_text(data, key_items, items, depth) - local text = depth == 1 and data.name or '' - for _, pop in pairs(data.pops) do - local resource - local item_scope - local owns_pop - local in_pool_count = 0 - local item_identifier = '' - - if pop.type == 'key item' then - resource = res.key_items[pop.id] - owns_pop = owns_key_item(pop.id, key_items) - item_identifier = 'Ж ' - else - resource = res.items[pop.id] - owns_pop = owns_item(pop.id, items) - in_pool_count = item_treasure_pool_count(pop.id, items.treasure) - end - - local pop_name = 'Unknown pop' - if resource then - pop_name = ucwords(resource.name) - end - - --separator line for each top-level mob - if depth == 1 then - text = text .. '\n' - end - - local item_colour - if owns_pop then - item_colour = colors.success - else - item_colour = colors.danger - end - - local pool_notification = '' - if in_pool_count > 0 then - pool_notification = colors.warning .. ' [' .. in_pool_count .. ']' .. colors.close - end - text = text .. '\n' .. get_indent(depth) .. pop.dropped_from.name .. '\n' .. get_indent(depth) .. ' >> ' .. item_colour .. item_identifier .. pop_name .. colors.close .. pool_notification - if pop.dropped_from.pops then - text = text .. generate_text(pop.dropped_from, key_items, items, depth + 1) + local text = depth == 1 and data.name or '' + for _, pop in pairs(data.pops) do + local resource + local item_scope + local owns_pop + local in_pool_count = 0 + local item_identifier = '' + + if pop.type == 'key item' then + resource = res.key_items[pop.id] + owns_pop = owns_key_item(pop.id, key_items) + item_identifier = 'Ж ' + else + resource = res.items[pop.id] + owns_pop = owns_item(pop.id, items) + in_pool_count = item_treasure_pool_count(pop.id, items.treasure) + end + + local pop_name = 'Unknown pop' + if resource then + pop_name = ucwords(resource.name) + end + + --separator line for each top-level mob + if depth == 1 then + text = text .. '\n' + end + + local item_colour + if owns_pop then + item_colour = colors.success + else + item_colour = colors.danger + end + + local pool_notification = '' + if in_pool_count > 0 then + pool_notification = colors.warning .. ' [' .. in_pool_count .. ']' .. colors.close + end + text = text .. '\n' .. get_indent(depth) .. pop.dropped_from.name .. '\n' .. get_indent(depth) .. ' >> ' .. item_colour .. item_identifier .. pop_name .. colors.close .. pool_notification + if pop.dropped_from.pops then + text = text .. generate_text(pop.dropped_from, key_items, items, depth + 1) + end end - end - return text + return text end EmpyPopTracker.generate_info = function(nm, key_items, items) - local nm_type = type(nm) - local info = { - has_all_kis = true, - text = '' - } - - if nm.pops then - for _, key_item_data in pairs(nm.pops) do - local has_pop_ki = owns_key_item(key_item_data.id, key_items) - - if not has_pop_ki then - info.has_all_kis = false - end + local info = { + has_all_kis = true, + text = '' + } + + if nm.pops then + for _, key_item_data in pairs(nm.pops) do + local has_pop_ki = owns_key_item(key_item_data.id, key_items) + + if not has_pop_ki then + info.has_all_kis = false + end + end end - end - info.text = generate_text(nm, key_items, items, 1) + info.text = generate_text(nm, key_items, items, 1) - return info + return info end -function find_nms(query) - local matching_nms = {} - local lower_query = query:lower() - for _, nm in pairs(nm_data) do - local result = string.match(nm.name:lower(), '(.*' .. lower_query .. '.*)') - if result then - table.insert(matching_nms, result) +function find_nms(pattern) + local matching_nms = {} + local lower_pattern = pattern:lower() + for _, nm in pairs(nm_data) do + local nm_name = nm.name:lower() + local result = windower.wc_match(nm_name, lower_pattern) + if result then + table.insert(matching_nms, nm_name) + end end - end - return matching_nms + + return matching_nms end windower.register_event('addon command', function(command, ...) - if commands[command] then - commands[command](...) - else - commands.help() - end + command = command and command:lower() or 'help' + + if commands[command] then + commands[command](...) + else + commands.help() + end end) commands = {} commands.track = function(...) - local args = {...} - local nm_name = args[1] - local matching_nm_names = find_nms(nm_name) - - if #matching_nm_names == 0 then - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Unable to find a NM using: "' .. nm_name .. '"') - elseif #matching_nm_names > 1 then - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '"' .. nm_name .. '" matches ' .. #matching_nm_names .. ' NMs. Please be more explicit:') - for key, matching_file_name in pairs(matching_nm_names) do - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, ' Match ' .. key .. ': ' .. ucwords(matching_file_name)) + local args = {...} + local nm_search_pattern = args[1] + local matching_nm_names = find_nms(nm_search_pattern) + + if #matching_nm_names == 0 then + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Unable to find a NM using: "' .. nm_search_pattern .. '"') + elseif #matching_nm_names > 1 then + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '"' .. nm_search_pattern .. '" matches ' .. #matching_nm_names .. ' NMs. Please be more explicit:') + for key, matching_file_name in pairs(matching_nm_names) do + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, ' Match ' .. key .. ': ' .. ucwords(matching_file_name)) + end + else + active = true + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Now tracking: ' .. ucwords(matching_nm_names[1])) + EmpyPopTracker.settings.tracking = matching_nm_names[1] + EmpyPopTracker.update() + commands.show() end - else - active = true - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Now tracking: ' .. ucwords(matching_nm_names[1])) - EmpyPopTracker.settings.tracking = matching_nm_names[1] - EmpyPopTracker.update() - commands.show() - end end commands.t = commands.track commands.hide = function() - active = false - EmpyPopTracker.text:visible(false) - EmpyPopTracker.settings.visible = false - EmpyPopTracker.settings:save() + active = false + EmpyPopTracker.text:visible(false) + EmpyPopTracker.settings.visible = false + EmpyPopTracker.settings:save() end commands.show = function() - active = true - EmpyPopTracker.text:visible(true) - EmpyPopTracker.settings.visible = true - EmpyPopTracker.settings:save() - EmpyPopTracker.update() + active = true + EmpyPopTracker.text:visible(true) + EmpyPopTracker.settings.visible = true + EmpyPopTracker.settings:save() + EmpyPopTracker.update() end commands.help = function() - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '---Empy Pop Tracker---') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Available commands:') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept track briareus - tracks Briareus pops (partial names such as apadem work too!)') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept hide - hides the UI') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept show - shows the UI') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept list - lists all trackable NMs') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept help - displays this help') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '---Empy Pop Tracker---') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Available commands:') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept track briareus - tracks Briareus pops (search patterns such as apadem* work too!)') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept hide - hides the UI') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept show - shows the UI') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept list - lists all trackable NMs') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '//ept help - displays this help') end commands.list = function() - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '---Empy Pop Tracker---') - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Trackable NMs:') - for _, nm in pairs(nm_data) do - windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, ucwords(nm.name)) - end + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, '---Empy Pop Tracker---') + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, 'Trackable NMs:') + for _, nm in pairs(nm_data) do + windower.add_to_chat(EmpyPopTracker.settings.add_to_chat_mode, ucwords(nm.name)) + end end commands.bg = function() - local tracking_nm = nm_data[EmpyPopTracker.settings.tracking] - local url = 'https://www.bg-wiki.com/bg/' .. tracking_nm.name - windower.open_url(url) + local tracking_nm = nm_data[EmpyPopTracker.settings.tracking] + local url = 'https://www.bg-wiki.com/bg/' .. tracking_nm.name + windower.open_url(url) end EmpyPopTracker.update = function() - local key_items = windower.ffxi.get_key_items() - local items = windower.ffxi.get_items() - local tracked_nm_data = nm_data[EmpyPopTracker.settings.tracking] - local generated_info = EmpyPopTracker.generate_info(tracked_nm_data, key_items, items) - EmpyPopTracker.text:text(generated_info.text) - if generated_info.has_all_kis then - EmpyPopTracker.text:bg_color(0, 75, 0) - else - EmpyPopTracker.text:bg_color(0, 0, 0) - end - if EmpyPopTracker.settings.visible then - EmpyPopTracker.text:visible(true) - end + local key_items = windower.ffxi.get_key_items() + local items = windower.ffxi.get_items() + local tracked_nm_data = nm_data[EmpyPopTracker.settings.tracking] + local generated_info = EmpyPopTracker.generate_info(tracked_nm_data, key_items, items) + EmpyPopTracker.text:text(generated_info.text) + if generated_info.has_all_kis then + EmpyPopTracker.text:bg_color(0, 75, 0) + else + EmpyPopTracker.text:bg_color(0, 0, 0) + end + if EmpyPopTracker.settings.visible then + EmpyPopTracker.text:visible(true) + end end windower.register_event('load', function() - if windower.ffxi.get_info().logged_in and EmpyPopTracker.settings.visible then - active = true - EmpyPopTracker.update() - end + if windower.ffxi.get_info().logged_in and EmpyPopTracker.settings.visible then + active = true + EmpyPopTracker.update() + end end) windower.register_event('add item', 'remove item', function() - if active then - EmpyPopTracker.update() - end + if active then + EmpyPopTracker.update() + end end) windower.register_event('incoming chunk', function(id) - --0x055: KI update - --0x0D2: Treasure pool addition - --0x0D3: Treasure pool lot/drop - if active and id == 0x055 or id == 0x0D2 or id == 0x0D3 then - EmpyPopTracker.update() - end + --0x055: KI update + --0x0D2: Treasure pool addition + --0x0D3: Treasure pool lot/drop + if active and id == 0x055 or id == 0x0D2 or id == 0x0D3 then + EmpyPopTracker.update() + end end) windower.register_event('login', function() - if EmpyPopTracker.settings.visible then - EmpyPopTracker.text:visible(true) - active = true - end + if EmpyPopTracker.settings.visible then + EmpyPopTracker.text:visible(true) + active = true + end end) windower.register_event('logout', function() - EmpyPopTracker.text:visible(false) - active = false + EmpyPopTracker.text:visible(false) + active = false end) return EmpyPopTracker diff --git a/addons/EmpyPopTracker/README.md b/addons/EmpyPopTracker/README.md index 3631de1ec..f674c3c94 100644 --- a/addons/EmpyPopTracker/README.md +++ b/addons/EmpyPopTracker/README.md @@ -1,4 +1,4 @@ -# FFXI Empy Pop Tracker +# FFXI Empyrean Pop Tracker An FFXI Windower 4 addon that tracks items and key items for popping Empyrean NMs in Abyssea, such as Briareus, Apademak and Sobek. @@ -14,9 +14,9 @@ Key items are identified by the Zhe (Ж) character. Treasure pool counts for pop `//ept track glavoid` tracks Glavoid pop items/key items. -You can also track an NM by typing part of the name, because fuck having to remember how to spell Itzpapalotl: +You can also track an NM by using a wildcard pattern, because fuck having to remember how to spell Itzpapalotl: -`//ept track itz` +`//ept track itz*` For a full list of trackable NMs, see the nms directory or use the `list` command (see below). diff --git a/addons/EmpyPopTracker/nms/README.md b/addons/EmpyPopTracker/nms/README.md index 720d0a7d4..d9e9278bd 100644 --- a/addons/EmpyPopTracker/nms/README.md +++ b/addons/EmpyPopTracker/nms/README.md @@ -14,12 +14,12 @@ A simple example of the above would be: ```lua { - name = 'Azdaja', - pops = { { - id = 1531, --Vacant Bugard Eye - type = 'key item', - dropped_from = { name = 'Deelgeed, Timed (F-9/F-10)' } - } } + name = 'Azdaja', + pops = { { + id = 1531, --Vacant Bugard Eye + type = 'key item', + dropped_from = { name = 'Deelgeed, Timed (F-9/F-10)' } + } } } ``` @@ -27,37 +27,38 @@ A larger example with multiple nested entites: ```lua { - name = 'Bukhis', - pops = { { - id = 1508, --Ingrown Taurus Nail - type = 'key item', - dropped_from = { - name = 'Khalkotaur, Forced (F-4)', - pops = { { - id = 3098, --Gnarled Taurus Horn - type = 'item', - dropped_from = { name = 'Aestutaur (G-9/G-10)' } - } } + name = 'Bukhis', + pops = { { + id = 1508, --Ingrown Taurus Nail + type = 'key item', + dropped_from = { + name = 'Khalkotaur, Forced (F-4)', + pops = { { + id = 3098, --Gnarled Taurus Horn + type = 'item', + dropped_from = { name = 'Aestutaur (G-9/G-10)' } + } } + } }, { - id = 1509, --Ossified Gargouille Hand - type = 'key item', - dropped_from = { - name = 'Quasimodo, Forced (F-4)', - pops = { { - id = 3099, --Gargouille Stone - type = 'item', - dropped_from = { - name = 'Gruesome Gargouille (F-10/G-10)' - } - } } - } + id = 1509, --Ossified Gargouille Hand + type = 'key item', + dropped_from = { + name = 'Quasimodo, Forced (F-4)', + pops = { { + id = 3099, --Gargouille Stone + type = 'item', + dropped_from = { + name = 'Gruesome Gargouille (F-10/G-10)' + } + } } + } }, { - id = 1510, --Imbrued Vampyr Fang - type = 'key item', - dropped_from = { name = 'Lord Varney, Timed (G-10/H-10)' } + id = 1510, --Imbrued Vampyr Fang + type = 'key item', + dropped_from = { name = 'Lord Varney, Timed (G-10/H-10)' } } } - } } + ``` The main addon file requires the index.lua file which in turn is responsible for requiring and returning data for each nm. diff --git a/addons/EmpyPopTracker/nms/alfard.lua b/addons/EmpyPopTracker/nms/alfard.lua index 689d4ddcc..ee492fd25 100644 --- a/addons/EmpyPopTracker/nms/alfard.lua +++ b/addons/EmpyPopTracker/nms/alfard.lua @@ -27,32 +27,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Alfard', - pops = { { - id = 1530, --Venomous hydra fang - type = 'key item', - dropped_from = { - name = 'Ningishzida, Forced (I-7/I-8)', - pops = { { - id = 3262, --Jaculus Wing - type = 'item', - dropped_from = { name = 'Jaculus, Timed (I-8)' } - }, { - id = 3261, --Minaruja Skull - type = 'item', + name = 'Alfard', + pops = { { + id = 1530, --Venomous hydra fang + type = 'key item', dropped_from = { - name = 'Minaruja, Forced (I-10)', - pops = { { - id = 3267, --Pursuer's Wing - type = 'item', - dropped_from = { name = 'Faunus Wyvern (I-9)' } - } } + name = 'Ningishzida, Forced (I-7/I-8)', + pops = { { + id = 3262, --Jaculus Wing + type = 'item', + dropped_from = { name = 'Jaculus, Timed (I-8)' } + }, { + id = 3261, --Minaruja Skull + type = 'item', + dropped_from = { + name = 'Minaruja, Forced (I-10)', + pops = { { + id = 3267, --Pursuer's Wing + type = 'item', + dropped_from = { name = 'Faunus Wyvern (I-9)' } + } } + } + }, { + id = 3268, --High-Quality Wivre Hide + type = 'item', + dropped_from = { name = 'Glade Wivre (I-8)' } + } } } - }, { - id = 3268, --High-Quality Wivre Hide - type = 'item', - dropped_from = { name = 'Glade Wivre (I-8)' } - } } - } - } } + } } } diff --git a/addons/EmpyPopTracker/nms/apademak.lua b/addons/EmpyPopTracker/nms/apademak.lua index 63315f568..4ecec8aec 100644 --- a/addons/EmpyPopTracker/nms/apademak.lua +++ b/addons/EmpyPopTracker/nms/apademak.lua @@ -27,31 +27,31 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Apademak', - pops = { { - id = 1525, --Torn Khimaira Wing - type = 'key item', - dropped_from = { - name = 'Dhorme Khimaira, Forced (F-7)', - pops = { { - id = 3246, --Snow God Core - type = 'item', + name = 'Apademak', + pops = { { + id = 1525, --Torn Khimaira Wing + type = 'key item', dropped_from = { - name = 'Upas-Kamuy, Forced (G-5)', - pops = { { - id = 3252, --Gelid Arm - dropped_from = { name = 'Snowflake (G-5)' } - } } + name = 'Dhorme Khimaira, Forced (F-7)', + pops = { { + id = 3246, --Snow God Core + type = 'item', + dropped_from = { + name = 'Upas-Kamuy, Forced (G-5)', + pops = { { + id = 3252, --Gelid Arm + dropped_from = { name = 'Snowflake (G-5)' } + } } + } + }, { + id = 3247, --Sisyphus Fragment + type = 'item', + dropped_from = { name = 'Sisyphus, Timed (F-6/G-6)' } + }, { + id = 3253, --High-quality marid hide + type = 'item', + dropped_from = { name = 'Olyphant (F-6)' } + } } } - }, { - id = 3247, --Sisyphus Fragment - type = 'item', - dropped_from = { name = 'Sisyphus, Timed (F-6/G-6)' } - }, { - id = 3253, --High-quality marid hide - type = 'item', - dropped_from = { name = 'Olyphant (F-6)' } - } } - } - } } + } } } diff --git a/addons/EmpyPopTracker/nms/azdaja.lua b/addons/EmpyPopTracker/nms/azdaja.lua index b6eb58f1d..cb06f668d 100644 --- a/addons/EmpyPopTracker/nms/azdaja.lua +++ b/addons/EmpyPopTracker/nms/azdaja.lua @@ -27,10 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Azdaja', - pops = { { - id = 1531, --Vacant Bugard Eye - type = 'key item', - dropped_from = { name = 'Deelgeed, Timed (F-9/F-10)' } - } } + name = 'Azdaja', + pops = { { + id = 1531, --Vacant Bugard Eye + type = 'key item', + dropped_from = { name = 'Deelgeed, Timed (F-9/F-10)' } + } } } diff --git a/addons/EmpyPopTracker/nms/briareus.lua b/addons/EmpyPopTracker/nms/briareus.lua index 553350cbd..7b2e68d4b 100644 --- a/addons/EmpyPopTracker/nms/briareus.lua +++ b/addons/EmpyPopTracker/nms/briareus.lua @@ -27,39 +27,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Briareus', - pops = { { - id = 1482, --Dented Gigas Shield - type = 'key item', - dropped_from = { - name = 'Adamastor, Forced (C-4)', - pops = { { - id = 2894, --Trophy Shield - type = 'item', - dropped_from = { name = 'Bathyal Gigas (C-5/D-5)' } - } } - } - }, { - id = 1484, --Severed Gigas Collar - type = 'key item', - dropped_from = { - name = 'Grandgousier, Forced (F-10)', - pops = { { - id = 2896, --Massive Armband - type = 'item', - dropped_from = { name = 'Demersal Gigas (E-9/F-9)' } - } } - } - }, { - id = 1483, --Warped Gigas Armband - type = 'key item', - dropped_from = { - name = 'Pantagruel, Forced (F-7)', - pops = { { - id = 2895, --Oversized Sock - type = 'item', - dropped_from = { name = 'Hadal Gigas (F-6/F-7)' } - } } - } - } } + name = 'Briareus', + pops = { { + id = 1482, --Dented Gigas Shield + type = 'key item', + dropped_from = { + name = 'Adamastor, Forced (C-4)', + pops = { { + id = 2894, --Trophy Shield + type = 'item', + dropped_from = { name = 'Bathyal Gigas (C-5/D-5)' } + } } + } + }, { + id = 1484, --Severed Gigas Collar + type = 'key item', + dropped_from = { + name = 'Grandgousier, Forced (F-10)', + pops = { { + id = 2896, --Massive Armband + type = 'item', + dropped_from = { name = 'Demersal Gigas (E-9/F-9)' } + } } + } + }, { + id = 1483, --Warped Gigas Armband + type = 'key item', + dropped_from = { + name = 'Pantagruel, Forced (F-7)', + pops = { { + id = 2895, --Oversized Sock + type = 'item', + dropped_from = { name = 'Hadal Gigas (F-6/F-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/bukhis.lua b/addons/EmpyPopTracker/nms/bukhis.lua index 019864b73..b1926152a 100644 --- a/addons/EmpyPopTracker/nms/bukhis.lua +++ b/addons/EmpyPopTracker/nms/bukhis.lua @@ -27,34 +27,34 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Bukhis', - pops = { { - id = 1508, --Ingrown Taurus Nail - type = 'key item', - dropped_from = { - name = 'Khalkotaur, Forced (F-4)', - pops = { { - id = 3098, --Gnarled Taurus Horn - type = 'item', - dropped_from = { name = 'Aestutaur (G-9/G-10)' } - } } - } - }, { - id = 1509, --Ossified Gargouille Hand - type = 'key item', - dropped_from = { - name = 'Quasimodo, Forced (F-4)', - pops = { { - id = 3099, --Gargouille Stone - type = 'item', + name = 'Bukhis', + pops = { { + id = 1508, --Ingrown Taurus Nail + type = 'key item', dropped_from = { - name = 'Gruesome Gargouille (F-10/G-10)' + name = 'Khalkotaur, Forced (F-4)', + pops = { { + id = 3098, --Gnarled Taurus Horn + type = 'item', + dropped_from = { name = 'Aestutaur (G-9/G-10)' } + } } } - } } - } - }, { - id = 1510, --Imbrued Vampyr Fang - type = 'key item', - dropped_from = { name = 'Lord Varney, Timed (G-10/H-10)' } - } } + }, { + id = 1509, --Ossified Gargouille Hand + type = 'key item', + dropped_from = { + name = 'Quasimodo, Forced (F-4)', + pops = { { + id = 3099, --Gargouille Stone + type = 'item', + dropped_from = { + name = 'Gruesome Gargouille (F-10/G-10)' + } + } } + } + }, { + id = 1510, --Imbrued Vampyr Fang + type = 'key item', + dropped_from = { name = 'Lord Varney, Timed (G-10/H-10)' } + } } } diff --git a/addons/EmpyPopTracker/nms/carabosse.lua b/addons/EmpyPopTracker/nms/carabosse.lua index 97b0c9c5e..ad9aa0079 100644 --- a/addons/EmpyPopTracker/nms/carabosse.lua +++ b/addons/EmpyPopTracker/nms/carabosse.lua @@ -27,28 +27,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Carabosse', - pops = { { - id = 1485, --Pellucid Fly Eye - type = 'key item', - dropped_from = { - name = 'La Theine Liege, Forced (I-7)', - pops = { { - id = 2897, --Transparent Insect Wing - type = 'item', - dropped_from = { name = 'Plateau Glider (H-7)' } - } } - } - }, { - id = 1486, --Shimmering Pixie Pinion - type = 'key item', - dropped_from = { - name = 'Baba Yaga, Forced (H-7)', - pops = { { - id = 2898, --Piceous Scale - type = 'item', - dropped_from = { name = 'Farfadet (H-7)' } - } } - } - } } + name = 'Carabosse', + pops = { { + id = 1485, --Pellucid Fly Eye + type = 'key item', + dropped_from = { + name = 'La Theine Liege, Forced (I-7)', + pops = { { + id = 2897, --Transparent Insect Wing + type = 'item', + dropped_from = { name = 'Plateau Glider (H-7)' } + } } + } + }, { + id = 1486, --Shimmering Pixie Pinion + type = 'key item', + dropped_from = { + name = 'Baba Yaga, Forced (H-7)', + pops = { { + id = 2898, --Piceous Scale + type = 'item', + dropped_from = { name = 'Farfadet (H-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/chloris.lua b/addons/EmpyPopTracker/nms/chloris.lua index 78dbaeacc..df7451eed 100644 --- a/addons/EmpyPopTracker/nms/chloris.lua +++ b/addons/EmpyPopTracker/nms/chloris.lua @@ -27,87 +27,87 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Chloris', - pops = { { - id = 1470, --Gory Scorpion Claw - type = 'key item', - dropped_from = { - name = 'Hedetet, Forced (F-7)', - pops = { { - id = 2921, --Venomous Scorpion Stinger - type = 'item', - dropped_from = { name = 'Canyon Scorpion (F-7)' } - }, { - id = 2948, --Acidic Humus - type = 'item', + name = 'Chloris', + pops = { { + id = 1470, --Gory Scorpion Claw + type = 'key item', dropped_from = { - name = 'Gancanagh, Forced (H-8)', - pops = { { - id = 2920, --Alkaline Humus - type = 'item', - dropped_from = { name = 'Pachypodium (H-8)' } - } } + name = 'Hedetet, Forced (F-7)', + pops = { { + id = 2921, --Venomous Scorpion Stinger + type = 'item', + dropped_from = { name = 'Canyon Scorpion (F-7)' } + }, { + id = 2948, --Acidic Humus + type = 'item', + dropped_from = { + name = 'Gancanagh, Forced (H-8)', + pops = { { + id = 2920, --Alkaline Humus + type = 'item', + dropped_from = { name = 'Pachypodium (H-8)' } + } } + } + } } } - } } - } - }, { - id = 1469, --Torn Bat Wing - type = 'key item', - dropped_from = { - name = 'Treble Noctules, Forced (I-9)', - pops = { { - id = 2919, --Bloody Fang - type = 'item', - dropped_from = { name = 'Blood Bat (I-9)' } - }, { - id = 2947, --Exorcised Skull - type = 'item', + }, { + id = 1469, --Torn Bat Wing + type = 'key item', dropped_from = { - name = 'Cannered Noz, Forced (F-6)', - pops = { { - id = 2918, --Baleful Skull - type = 'item', - dropped_from = { name = 'Caoineag (F-6)' } - } } + name = 'Treble Noctules, Forced (I-9)', + pops = { { + id = 2919, --Bloody Fang + type = 'item', + dropped_from = { name = 'Blood Bat (I-9)' } + }, { + id = 2947, --Exorcised Skull + type = 'item', + dropped_from = { + name = 'Cannered Noz, Forced (F-6)', + pops = { { + id = 2918, --Baleful Skull + type = 'item', + dropped_from = { name = 'Caoineag (F-6)' } + } } + } + } } } - } } - } - }, { - id = 1468, --Veinous Hecteyes Eyelid - type = 'key item', - dropped_from = { - name = 'Ophanim, Forced (G-9)', - pops = { { - id = 2946, --Tarnished Pincer - type = 'item', + }, { + id = 1468, --Veinous Hecteyes Eyelid + type = 'key item', dropped_from = { - name = 'Vetehinen, Forced (H-10)', - pops = { { - id = 2916, --High-quality Limule Pincer - type = 'item', - dropped_from = { name = 'Gulch Limule (H-10)' } - }, { - id = 2917, --Bloodshot Hecteye - type = 'item', - dropped_from = { name = 'Beholder (G-9)' } - }, { - id = 2945, --Shriveled Wing - type = 'item', - dropped_from = { - name = 'Halimede, Forced (G-12)', - pops = { { - id = 2915, --High-quality Clionid Wing + name = 'Ophanim, Forced (G-9)', + pops = { { + id = 2946, --Tarnished Pincer type = 'item', - dropped_from = { name = 'Gully Clionid (G-12)' } - } } - } - } } + dropped_from = { + name = 'Vetehinen, Forced (H-10)', + pops = { { + id = 2916, --High-quality Limule Pincer + type = 'item', + dropped_from = { name = 'Gulch Limule (H-10)' } + }, { + id = 2917, --Bloodshot Hecteye + type = 'item', + dropped_from = { name = 'Beholder (G-9)' } + }, { + id = 2945, --Shriveled Wing + type = 'item', + dropped_from = { + name = 'Halimede, Forced (G-12)', + pops = { { + id = 2915, --High-quality Clionid Wing + type = 'item', + dropped_from = { name = 'Gully Clionid (G-12)' } + } } + } + } } + } + } } } - } } - } - }, { - id = 1471, --Mossy Adamantoise Shell - type = 'key item', - dropped_from = { name = 'Chukwa, Timed (F-5)' } - } } + }, { + id = 1471, --Mossy Adamantoise Shell + type = 'key item', + dropped_from = { name = 'Chukwa, Timed (F-5)' } + } } } diff --git a/addons/EmpyPopTracker/nms/cirein-croin.lua b/addons/EmpyPopTracker/nms/cirein-croin.lua index 7a8a40af7..478c23ffe 100644 --- a/addons/EmpyPopTracker/nms/cirein-croin.lua +++ b/addons/EmpyPopTracker/nms/cirein-croin.lua @@ -27,21 +27,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Cirein-croin', - pops = { { - id = 1504, --Glistening Orobon Liver - type = 'key item', - dropped_from = { - name = 'Cep-Kamuy, Forced (F-4)', - pops = { { - id = 3089, --Orobon Cheekmeat - type = 'item', - dropped_from = { name = 'Ancient Orobon (F-5)' } - } } - } - }, { - id = 1505, --Doffed Poroggo Hat - type = 'key item', - dropped_from = { name = 'Heqet, Timed (I-6)' } - } } + name = 'Cirein-croin', + pops = { { + id = 1504, --Glistening Orobon Liver + type = 'key item', + dropped_from = { + name = 'Cep-Kamuy, Forced (F-4)', + pops = { { + id = 3089, --Orobon Cheekmeat + type = 'item', + dropped_from = { name = 'Ancient Orobon (F-5)' } + } } + } + }, { + id = 1505, --Doffed Poroggo Hat + type = 'key item', + dropped_from = { name = 'Heqet, Timed (I-6)' } + } } } diff --git a/addons/EmpyPopTracker/nms/dragua.lua b/addons/EmpyPopTracker/nms/dragua.lua index aa841e076..456a477b9 100644 --- a/addons/EmpyPopTracker/nms/dragua.lua +++ b/addons/EmpyPopTracker/nms/dragua.lua @@ -27,10 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Dragua', - pops = { { - id = 1521, --Bloodied Dragon Ear - type = 'key item', - dropped_from = { name = 'Hazhdiha, Timed (H-10)' } - } } + name = 'Dragua', + pops = { { + id = 1521, --Bloodied Dragon Ear + type = 'key item', + dropped_from = { name = 'Hazhdiha, Timed (H-10)' } + } } } diff --git a/addons/EmpyPopTracker/nms/glavoid.lua b/addons/EmpyPopTracker/nms/glavoid.lua index 3acf9b513..9beca3c7d 100644 --- a/addons/EmpyPopTracker/nms/glavoid.lua +++ b/addons/EmpyPopTracker/nms/glavoid.lua @@ -27,56 +27,56 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Glavoid', - pops = { { - id = 1473, --Sodden Sandworm Husk - type = 'key item', - dropped_from = { name = 'Minhocao, Timed (I-6)' } - }, { - id = 1475, --Sticky Gnat Wing - type = 'key item', - dropped_from = { name = 'Adze, Timed (G-5)' } - }, { - id = 1472, --Fat-lined Cockatrice Skin - type = 'key item', - dropped_from = { - name = 'Alectryon (H-8)', - pops = { { - id = 2923, --Cockatrice Tailmeat - type = 'item', - dropped_from = { name = 'Cluckatrice (H-8)' } - }, { - id = 2949, --Quivering Eft Egg - type = 'item', + name = 'Glavoid', + pops = { { + id = 1473, --Sodden Sandworm Husk + type = 'key item', + dropped_from = { name = 'Minhocao, Timed (I-6)' } + }, { + id = 1475, --Sticky Gnat Wing + type = 'key item', + dropped_from = { name = 'Adze, Timed (G-5)' } + }, { + id = 1472, --Fat-lined Cockatrice Skin + type = 'key item', dropped_from = { - name = 'Abas, Forced (K-10)', - pops = { { - id = 2922, --Eft Egg - dropped_from = { name = 'Canyon Eft (J-10/J-11)' } - } } + name = 'Alectryon (H-8)', + pops = { { + id = 2923, --Cockatrice Tailmeat + type = 'item', + dropped_from = { name = 'Cluckatrice (H-8)' } + }, { + id = 2949, --Quivering Eft Egg + type = 'item', + dropped_from = { + name = 'Abas, Forced (K-10)', + pops = { { + id = 2922, --Eft Egg + dropped_from = { name = 'Canyon Eft (J-10/J-11)' } + } } + } + } } } - } } - } - }, { - id = 1474, --Luxuriant manticore mane - type = 'key item', - dropped_from = { - name = 'Muscaliet, Forced (J-6)', - pops = { { - id = 2925, --Resilient Mane - type = 'item', - dropped_from = { name = 'Hieracosphinx (J-6)' } - }, { - id = 2950, --Smooth Whisker - type = 'item', + }, { + id = 1474, --Luxuriant manticore mane + type = 'key item', dropped_from = { - name = 'Tefenet, Forced (G-6)', - pops = { { - id = 2924, --Shocking Whisker - dropped_from = { name = 'Jaguarundi (G-6)' } - } } + name = 'Muscaliet, Forced (J-6)', + pops = { { + id = 2925, --Resilient Mane + type = 'item', + dropped_from = { name = 'Hieracosphinx (J-6)' } + }, { + id = 2950, --Smooth Whisker + type = 'item', + dropped_from = { + name = 'Tefenet, Forced (G-6)', + pops = { { + id = 2924, --Shocking Whisker + dropped_from = { name = 'Jaguarundi (G-6)' } + } } + } + } } } - } } - } - } } + } } } diff --git a/addons/EmpyPopTracker/nms/index.lua b/addons/EmpyPopTracker/nms/index.lua index e10a91c5c..9091a466a 100644 --- a/addons/EmpyPopTracker/nms/index.lua +++ b/addons/EmpyPopTracker/nms/index.lua @@ -27,28 +27,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] local nms = { - 'alfard', - 'apademak', - 'azdaja', - 'briareus', - 'bukhis', - 'carabosse', - 'chloris', - 'cirein-croin', - 'dragua', - 'glavoid', - 'isgebind', - 'itzpapalotl', - 'kukulkan', - 'orthrus', - 'sedna', - 'sobek', - 'ulhuadshi' + 'alfard', + 'apademak', + 'azdaja', + 'briareus', + 'bukhis', + 'carabosse', + 'chloris', + 'cirein-croin', + 'dragua', + 'glavoid', + 'isgebind', + 'itzpapalotl', + 'kukulkan', + 'orthrus', + 'sedna', + 'sobek', + 'ulhuadshi' } nm_data = {} for _, nm in pairs(nms) do - nm_data[nm] = require('nms/' .. nm) + nm_data[nm] = require('nms/' .. nm) end return nm_data diff --git a/addons/EmpyPopTracker/nms/isgebind.lua b/addons/EmpyPopTracker/nms/isgebind.lua index 266c59e4e..1fd4de0e6 100644 --- a/addons/EmpyPopTracker/nms/isgebind.lua +++ b/addons/EmpyPopTracker/nms/isgebind.lua @@ -27,10 +27,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Isgebind', - pops = { { - id = 1526, --Begrimed Dragon Hide - type = 'key item', - dropped_from = { name = 'Kur, Timed (I-5/J-5)' } - } } + name = 'Isgebind', + pops = { { + id = 1526, --Begrimed Dragon Hide + type = 'key item', + dropped_from = { name = 'Kur, Timed (I-5/J-5)' } + } } } diff --git a/addons/EmpyPopTracker/nms/itzpapalotl.lua b/addons/EmpyPopTracker/nms/itzpapalotl.lua index 744677a52..371d4ab8c 100644 --- a/addons/EmpyPopTracker/nms/itzpapalotl.lua +++ b/addons/EmpyPopTracker/nms/itzpapalotl.lua @@ -27,32 +27,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Itzpapalotl', - pops = { { - id = 1488, --Venomous Wamoura Feeler - type = 'key item', - dropped_from = { - name = 'Granite Borer, Forced (K-10)', - pops = { { - id = 3072, --Withered Cocoon - type = 'item', - dropped_from = { name = 'Gullycampa (K-10)' } - } } - } - }, { - id = 1490, --Distended Chigoe Abdomen - type = 'key item', - dropped_from = { name = 'Tunga, Timed (K-10)' } - }, { - id = 1489, --Bulbous crawler cocoon - type = 'key item', - dropped_from = { - name = 'Blazing Eruca, Forced (J-10)', - pops = { { - id = 3073, --Eruca Egg - type = 'item', - dropped_from = { name = 'Ignis Eruca (J-10)' } - } } - } - } } + name = 'Itzpapalotl', + pops = { { + id = 1488, --Venomous Wamoura Feeler + type = 'key item', + dropped_from = { + name = 'Granite Borer, Forced (K-10)', + pops = { { + id = 3072, --Withered Cocoon + type = 'item', + dropped_from = { name = 'Gullycampa (K-10)' } + } } + } + }, { + id = 1490, --Distended Chigoe Abdomen + type = 'key item', + dropped_from = { name = 'Tunga, Timed (K-10)' } + }, { + id = 1489, --Bulbous crawler cocoon + type = 'key item', + dropped_from = { + name = 'Blazing Eruca, Forced (J-10)', + pops = { { + id = 3073, --Eruca Egg + type = 'item', + dropped_from = { name = 'Ignis Eruca (J-10)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/kukulkan.lua b/addons/EmpyPopTracker/nms/kukulkan.lua index 002a1926b..d49fbc8ac 100644 --- a/addons/EmpyPopTracker/nms/kukulkan.lua +++ b/addons/EmpyPopTracker/nms/kukulkan.lua @@ -27,39 +27,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Kukulkan', - pops = { { - id = 1466, --Mucid Ahriman Eyeball - type = 'key item', - dropped_from = { - name = 'Arimaspi, Forced (K-6)', - pops = { { - id = 2913, --Clouded Lens - type = 'item', - dropped_from = { name = 'Deep Eye (K-6/K-7)' } - } } - } - }, { - id = 1464, --Tattered Hippogryph Wing - type = 'key item', - dropped_from = { - name = 'Alkonost, Forced (H-6)', - pops = { { - id = 2912, --Giant Bugard Tusk - type = 'item', - dropped_from = { name = 'Ypotryll (I-7)' } - } } - } - }, { - id = 1465, --Cracked Wivre Horn - type = 'key item', - dropped_from = { - name = 'Keratyrannos, Forced (G-6)', - pops = { { - id = 2910, --Armored Dragonhorn - type = 'item', - dropped_from = { name = 'Mesa Wivre (G-6)' } - } } - } - } } + name = 'Kukulkan', + pops = { { + id = 1466, --Mucid Ahriman Eyeball + type = 'key item', + dropped_from = { + name = 'Arimaspi, Forced (K-6)', + pops = { { + id = 2913, --Clouded Lens + type = 'item', + dropped_from = { name = 'Deep Eye (K-6/K-7)' } + } } + } + }, { + id = 1464, --Tattered Hippogryph Wing + type = 'key item', + dropped_from = { + name = 'Alkonost, Forced (H-6)', + pops = { { + id = 2912, --Giant Bugard Tusk + type = 'item', + dropped_from = { name = 'Ypotryll (I-7)' } + } } + } + }, { + id = 1465, --Cracked Wivre Horn + type = 'key item', + dropped_from = { + name = 'Keratyrannos, Forced (G-6)', + pops = { { + id = 2910, --Armored Dragonhorn + type = 'item', + dropped_from = { name = 'Mesa Wivre (G-6)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/orthrus.lua b/addons/EmpyPopTracker/nms/orthrus.lua index 0a48cea5b..16ff706e6 100644 --- a/addons/EmpyPopTracker/nms/orthrus.lua +++ b/addons/EmpyPopTracker/nms/orthrus.lua @@ -27,31 +27,31 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Orthrus', - pops = { { - id = 1520, --Steaming cerberus tongue - type = 'key item', - dropped_from = { - name = 'Amarok, Forced (E-6)', - pops = { { - id = 3231, --Sharabha Hide - type = 'item', + name = 'Orthrus', + pops = { { + id = 1520, --Steaming cerberus tongue + type = 'key item', dropped_from = { - name = 'Sharabha, Forced (G-5)', - pops = { { - id = 3237, - dropped_from = { name = 'Dune Manticore (F-5/F-6)' } - } } + name = 'Amarok, Forced (E-6)', + pops = { { + id = 3231, --Sharabha Hide + type = 'item', + dropped_from = { + name = 'Sharabha, Forced (G-5)', + pops = { { + id = 3237, + dropped_from = { name = 'Dune Manticore (F-5/F-6)' } + } } + } + }, { + id = 3232, --Tiger King Hide + type = 'item', + dropped_from = { name = 'Ansherekh, Timed (F-8/G-8)' } + }, { + id = 3238, --H.Q. Dhalmel Hide + type = 'item', + dropped_from = { name = 'Camelopardalis (F-7/G-7)' } + } } } - }, { - id = 3232, --Tiger King Hide - type = 'item', - dropped_from = { name = 'Ansherekh, Timed (F-8/G-8)' } - }, { - id = 3238, --H.Q. Dhalmel Hide - type = 'item', - dropped_from = { name = 'Camelopardalis (F-7/G-7)' } - } } - } - } } + } } } diff --git a/addons/EmpyPopTracker/nms/sedna.lua b/addons/EmpyPopTracker/nms/sedna.lua index d6b20f988..e2d95077c 100644 --- a/addons/EmpyPopTracker/nms/sedna.lua +++ b/addons/EmpyPopTracker/nms/sedna.lua @@ -27,21 +27,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Sedna', - pops = { { - id = 1512, --Shimmering Pugil Scale - type = 'key item', - dropped_from = { name = 'Hrosshvalur, Timed (J-6)' } - }, { - id = 1511, --Glossy Sea Monk Sucker - type = 'key item', - dropped_from = { - name = 'Iku-Turso, Forced (J-7)', - pops = { { - id = 3100, --Moonbeam Clam - type = 'item', - dropped_from = { name = 'Jasconius (I-7/J-7)' } - } } - } - } } + name = 'Sedna', + pops = { { + id = 1512, --Shimmering Pugil Scale + type = 'key item', + dropped_from = { name = 'Hrosshvalur, Timed (J-6)' } + }, { + id = 1511, --Glossy Sea Monk Sucker + type = 'key item', + dropped_from = { + name = 'Iku-Turso, Forced (J-7)', + pops = { { + id = 3100, --Moonbeam Clam + type = 'item', + dropped_from = { name = 'Jasconius (I-7/J-7)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/sobek.lua b/addons/EmpyPopTracker/nms/sobek.lua index f6e22e968..a9dcaa033 100644 --- a/addons/EmpyPopTracker/nms/sobek.lua +++ b/addons/EmpyPopTracker/nms/sobek.lua @@ -27,32 +27,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Sobek', - pops = { { - id = 1500, --Molted Peiste Skin - type = 'key item', - dropped_from = { name = 'Gukumatz, Timed (J-11)' } - }, { - id = 1498, --Bloodstained Bugard Fang - type = 'key item', - dropped_from = { - name = 'Minax Bugard, Forced (K-10)', - pops = { { - id = 3085, --Bewitching Tusk - type = 'item', - dropped_from = { name = 'Abyssobugard (J-10/K-11)' } - } } - } - }, { - id = 1499, --Gnarled Lizard Nail - type = 'key item', - dropped_from = { - name = 'Sirrush, Forced (I-11)', - pops = { { - id = 3086, --Molt Scraps - type = 'item', - dropped_from = { name = 'Dusk Lizard (J-11)' } - } } - } - } } + name = 'Sobek', + pops = { { + id = 1500, --Molted Peiste Skin + type = 'key item', + dropped_from = { name = 'Gukumatz, Timed (J-11)' } + }, { + id = 1498, --Bloodstained Bugard Fang + type = 'key item', + dropped_from = { + name = 'Minax Bugard, Forced (K-10)', + pops = { { + id = 3085, --Bewitching Tusk + type = 'item', + dropped_from = { name = 'Abyssobugard (J-10/K-11)' } + } } + } + }, { + id = 1499, --Gnarled Lizard Nail + type = 'key item', + dropped_from = { + name = 'Sirrush, Forced (I-11)', + pops = { { + id = 3086, --Molt Scraps + type = 'item', + dropped_from = { name = 'Dusk Lizard (J-11)' } + } } + } + } } } diff --git a/addons/EmpyPopTracker/nms/ulhuadshi.lua b/addons/EmpyPopTracker/nms/ulhuadshi.lua index ad63f9168..38ead1379 100644 --- a/addons/EmpyPopTracker/nms/ulhuadshi.lua +++ b/addons/EmpyPopTracker/nms/ulhuadshi.lua @@ -27,21 +27,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] return { - name = 'Ulhuadshi', - pops = { { - id = 1492, --Shriveled Hecteyes Stalk - type = 'key item', - dropped_from = { name = 'Amun, Timed (H-8/I-9)' } - }, { - id = 1491, --Mucid Worm Segment - type = 'key item', - dropped_from = { - name = 'Pallid Percy, Forced (J-7)', - pops = { { - id = 3074, --Blanched Silver - type = 'item', - dropped_from = { name = 'Entozoon (J-7)' } - } } - } - } } + name = 'Ulhuadshi', + pops = { { + id = 1492, --Shriveled Hecteyes Stalk + type = 'key item', + dropped_from = { name = 'Amun, Timed (H-8/I-9)' } + }, { + id = 1491, --Mucid Worm Segment + type = 'key item', + dropped_from = { + name = 'Pallid Percy, Forced (J-7)', + pops = { { + id = 3074, --Blanched Silver + type = 'item', + dropped_from = { name = 'Entozoon (J-7)' } + } } + } + } } }