diff options
Diffstat (limited to 'Data/DefaultContent/Libraries/addons/addons/TreasurePool/TreasurePool.lua')
-rw-r--r-- | Data/DefaultContent/Libraries/addons/addons/TreasurePool/TreasurePool.lua | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/Data/DefaultContent/Libraries/addons/addons/TreasurePool/TreasurePool.lua b/Data/DefaultContent/Libraries/addons/addons/TreasurePool/TreasurePool.lua new file mode 100644 index 0000000..65529ad --- /dev/null +++ b/Data/DefaultContent/Libraries/addons/addons/TreasurePool/TreasurePool.lua @@ -0,0 +1,163 @@ +--[[Copyright © 2019, Kenshi +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 TreasurePool 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 KENSHI 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 = 'TreasurePool' +_addon.author = 'Kenshi' +_addon.version = '2.0' + +require('luau') +texts = require('texts') +packets = require('packets') + +-- Config + +defaults = {} +defaults.display = {} +defaults.display.pos = {} +defaults.display.pos.x = 0 +defaults.display.pos.y = 0 +defaults.display.bg = {} +defaults.display.bg.red = 0 +defaults.display.bg.green = 0 +defaults.display.bg.blue = 0 +defaults.display.bg.alpha = 102 +defaults.display.bg.visible = true +defaults.display.text = {} +defaults.display.text.font = 'Consolas' +defaults.display.text.red = 255 +defaults.display.text.green = 255 +defaults.display.text.blue = 255 +defaults.display.text.alpha = 255 +defaults.display.text.size = 12 + +settings = config.load(defaults) +box = texts.new('${current_string}', settings) + +local items = T{} + +windower.register_event('load', function() + local treasure = windower.ffxi.get_items().treasure + for i = 0, 9 do + if treasure[i] and treasure[i].item_id then + local item = res.items[treasure[i].item_id] and res.items[treasure[i].item_id].en or treasure[i].item_id + local pos = treasure[i].timestamp + i + table.insert(items, {position = pos, index = i, name = item, timestamp = treasure[i].timestamp, + temp = treasure[i].timestamp + 300, lotter = nil, lot = nil}) + end + end + table.sort(items, function(a,b) return a and b and a.position < b.position end) +end) + +windower.register_event('incoming chunk', function(id, data) + if id == 0x0D2 then + local packet = packets.parse('incoming', data) + -- Ignore gil drop + if packet.Item == 0xFFFF then + return + end + -- Double packet and leaving pt fix + for key, value in pairs(items) do + if value and value.index == packet.Index then + if value.timestamp == packet.Timestamp then + return + else + table.remove(items, key) + end + end + end + -- Ignore item 0 packets + if packet.Item == 0 then + return + end + -- Create table + local time_check = packet.Timestamp + 300 + local diff = os.difftime(time_check, os.time()) + local item = res.items[packet.Item] and res.items[packet.Item].en or packet.Item + local pos = packet.Timestamp + packet.Index + if diff <= 300 then + table.insert(items, {position = pos, index = packet.Index, name = item, timestamp = packet.Timestamp, + temp = packet.Timestamp + 300, lotter = nil, lot = nil}) + else + table.insert(items, {position = pos, index = packet.Index, name = item, timestamp = packet.Timestamp, + temp = os.time() + 300, lotter = nil, lot = nil}) + end + -- Sort table + table.sort(items, function(a,b) return a and b and a.position < b.position end) + end + if id == 0x0D3 then + local packet = packets.parse('incoming', data) + for key, value in pairs(items) do + if value.index == packet.Index then + if packet.Drop ~= 0 then + table.remove(items, key) + table.sort(items, function(a,b) return a and b and a.position < b.position end) + else + value.lotter = packet['Highest Lotter Name'] + value.lot = packet['Highest Lot'] + end + end + end + end + if id == 0xB then + items = T{} + end +end) + +windower.register_event('prerender', function() + if items:empty() then + box:hide() + return + end + local current_string = 'Treasure Pool:' + for key, value in pairs(items) do + if value and value.temp then + local diff = os.difftime(value.temp, os.time()) + local timer = os.date('!%M:%S', diff) + if diff >= 0 then + current_string = current_string..'\n['..key..']' + current_string = ( + diff < 60 and + current_string..'\\cs(255,0,0) '..value.name..' → '..timer + or diff > 180 and + current_string..'\\cs(0,255,0) '..value.name..' → '..timer + or + current_string..'\\cs(255,128,0) '..value.name..' → '..timer)..'\\cr' + if value.lotter and value.lot and value.lot > 0 then + current_string = current_string..' | ' + current_string = (current_string..'\\cs(0,255,255)'..value.lotter..': '..value.lot)..'\\cr' + end + else + table.remove(items, key) + end + box:show() + end + end + box.current_string = current_string +end) + +windower.register_event('logout', function() + items = T{} +end) |