diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/barfiller')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_bg.png | bin | 0 -> 12234 bytes | |||
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png | bin | 0 -> 2814 bytes | |||
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/barfiller/barfiller.lua | 147 | ||||
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/barfiller/moon.png | bin | 0 -> 1061 bytes | |||
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/barfiller/statics.lua | 312 |
5 files changed, 459 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_bg.png b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_bg.png Binary files differnew file mode 100644 index 0000000..72a79f9 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_bg.png diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png Binary files differnew file mode 100644 index 0000000..fb8e329 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/barfiller.lua b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/barfiller.lua new file mode 100644 index 0000000..2a67a06 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/barfiller.lua @@ -0,0 +1,147 @@ +--[[ BSD License Disclaimer + Copyright © 2015, Morath86 + 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 BarFiller 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 Morath86 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 = 'BarFiller' +_addon.author = 'Morath' +_addon.version = '0.2.5' +_addon.commands = {'bf','barfiller'} +_addon.language = 'english' + +-- Windower Libs +config = require('config') +file = require('files') +packets = require('packets') +texts = require('texts') +images = require('images') + +-- BarFiller Libs +require('statics') + +settings = config.load(defaults) +config.save(settings) + +background_image = images.new(settings.Images.Background) +foreground_image = images.new(settings.Images.Foreground) +rested_bonus_image = images.new(settings.Images.RestedBonus) + +exp_text = texts.new(settings.Texts.Exp) + +debug = false +ready = false +chunk_update = false + +windower.register_event('load',function() + if windower.ffxi.get_info().logged_in then + initialize() + end +end) + +windower.register_event('login',function() + initialize() +end) + +windower.register_event('logout',function() + hide() +end) + +windower.register_event('addon command',function(command, ...) + local commands = {...} + local first_cmd = (command or 'help'):lower() + if approved_commands[first_cmd] and #commands >= approved_commands[first_cmd].n then + if first_cmd == 'clear' or first_cmd == 'c' then + initialize() + elseif first_cmd == 'visible' or first_cmd == 'v' then + if ready then hide() else show() end + elseif first_cmd == 'reload' or first_cmd == 'r' then + windower.add_to_chat(8,'BarFiller successfully reloaded.') + windower.send_command('lua r barfiller;') + elseif first_cmd == 'unload' or first_cmd == 'u' then + windower.send_command('lua u barfiller;') + windower.add_to_chat(8,'BarFiller successfully unloaded.') + elseif first_cmd == 'help' or first_cmd == 'h' then + display_help() + end + else + display_help() + end +end) + +windower.register_event('incoming chunk',function(id,org,modi,is_injected,is_blocked) + if is_injected then return end + if ready then + -- Thanks to smd111 for Packet parsing + local packet_table = packets.parse('incoming', org) + if id == 0x2D then + exp_msg(packet_table['Param 1'],packet_table['Message']) + elseif id == 0x61 then + xp.current = packet_table['Current EXP'] + xp.total = packet_table['Required EXP'] + xp.tnl = xp.total - xp.current + chunk_update = true + end + end +end) + +windower.register_event('prerender',function() + if ready and chunk_update then + local old_width = foreground_image:width() + local new_width = calc_new_width() + + -- Thanks to Iryoku for the logic on smooth animations + if new_width ~= nil and new_width > 0 then + if old_width < new_width then + local last_update = 0 + local x = old_width + math.ceil(((new_width - old_width) * 0.1)) + foreground_image:size(x, settings.Images.Foreground.Size.Height) + if debug then print(old_width, x, new_width) end + + local now = os.clock() + if now - last_update > 0.5 then + update_strings() + last_update = now + end + elseif old_width >= new_width then + foreground_image:size(new_width, settings.Images.Foreground.Size.Height) + chunk_update = false + if debug then print(chunk_update) end + end + end + end +end) + +windower.register_event('level up', function(level) + update_strings() +end) + +windower.register_event('level down', function(level) + update_strings() +end) + +windower.register_event('zone change', function(new_id,old_id) + mog_house() +end) diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/moon.png b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/moon.png Binary files differnew file mode 100644 index 0000000..c7a119b --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/moon.png diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/statics.lua b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/statics.lua new file mode 100644 index 0000000..f15aa8b --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/statics.lua @@ -0,0 +1,312 @@ +--[[ BSD License Disclaimer + Copyright © 2015, Morath86 + 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 BarFiller 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 Morath86 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. +]] + +defaults = {} +defaults.Images = {} +defaults.Images.Background = {} +defaults.Images.Background.Pos = {} +defaults.Images.Background.Pos.X = 164 +defaults.Images.Background.Pos.Y = 6 +defaults.Images.Background.Visible = true +defaults.Images.Background.Texture = {} +defaults.Images.Background.Texture.Path = windower.addon_path..'bar_bg.png' +defaults.Images.Background.Texture.Fit = true +defaults.Images.Background.Color = {} +defaults.Images.Background.Color.Alpha = 255 +defaults.Images.Background.Color.Red = 255 +defaults.Images.Background.Color.Green = 255 +defaults.Images.Background.Color.Blue = 255 +defaults.Images.Background.Size = {} +defaults.Images.Background.Size.Height = 5 +defaults.Images.Background.Size.Width = 472 +defaults.Images.Background.Repeatable = {} +defaults.Images.Background.Repeatable.X = 1 +defaults.Images.Background.Repeatable.Y = 1 +defaults.Images.Background.Draggable = false +defaults.Images.Foreground = {} +defaults.Images.Foreground.Pos = {} +defaults.Images.Foreground.Pos.X = 166 +defaults.Images.Foreground.Pos.Y = 6 +defaults.Images.Foreground.Visible = true +defaults.Images.Foreground.Texture = {} +defaults.Images.Foreground.Texture.Path = windower.addon_path..'bar_fg.png' +defaults.Images.Foreground.Texture.Fit = false +defaults.Images.Foreground.Color = {} +defaults.Images.Foreground.Color.Alpha = 255 +defaults.Images.Foreground.Color.Red = 255 +defaults.Images.Foreground.Color.Green = 255 +defaults.Images.Foreground.Color.Blue = 255 +defaults.Images.Foreground.Size = {} +defaults.Images.Foreground.Size.Height = 5 +defaults.Images.Foreground.Size.Width = 1 +defaults.Images.Foreground.Repeatable = {} +defaults.Images.Foreground.Repeatable.X = 1 +defaults.Images.Foreground.Repeatable.Y = 1 +defaults.Images.Foreground.Draggable = false +defaults.Images.RestedBonus = {} +defaults.Images.RestedBonus.Pos = {} +defaults.Images.RestedBonus.Pos.X = 636 +defaults.Images.RestedBonus.Pos.Y = 6 +defaults.Images.RestedBonus.Visible = true +defaults.Images.RestedBonus.Texture = {} +defaults.Images.RestedBonus.Texture.Path = windower.addon_path..'moon.png' +defaults.Images.RestedBonus.Texture.Fit = true +defaults.Images.RestedBonus.Color = {} +defaults.Images.RestedBonus.Color.Alpha = 255 +defaults.Images.RestedBonus.Color.Red = 255 +defaults.Images.RestedBonus.Color.Green = 255 +defaults.Images.RestedBonus.Color.Blue = 255 +defaults.Images.RestedBonus.Size = {} +defaults.Images.RestedBonus.Size.Height = 32 +defaults.Images.RestedBonus.Size.Width = 32 +defaults.Images.RestedBonus.Repeatable = {} +defaults.Images.RestedBonus.Repeatable.X = 1 +defaults.Images.RestedBonus.Repeatable.Y = 1 +defaults.Images.RestedBonus.Draggable = false +defaults.Texts = {} +defaults.Texts.Exp = {} +defaults.Texts.Exp.Pos = {} +defaults.Texts.Exp.Pos.X = 159 +defaults.Texts.Exp.Pos.Y = 13 +defaults.Texts.Exp.Background = {} +defaults.Texts.Exp.Background.Alpha = 0 +defaults.Texts.Exp.Background.Red = 0 +defaults.Texts.Exp.Background.Green = 0 +defaults.Texts.Exp.Background.Blue = 0 +defaults.Texts.Exp.Background.Visible = false +defaults.Texts.Exp.Flags = {} +defaults.Texts.Exp.Flags.Right = false +defaults.Texts.Exp.Flags.Bottom = false +defaults.Texts.Exp.Flags.Bold = false +defaults.Texts.Exp.Flags.Draggable = false +defaults.Texts.Exp.Flags.Italic = false +defaults.Texts.Exp.Padding = 0 +defaults.Texts.Exp.Text = {} +defaults.Texts.Exp.Text.Size = 10 +defaults.Texts.Exp.Text.Font = 'Montserrat' +defaults.Texts.Exp.Text.Fonts = {'Ubuntu Mono', 'sans-serif'} +defaults.Texts.Exp.Text.Alpha = 255 +defaults.Texts.Exp.Text.Red = 253 +defaults.Texts.Exp.Text.Green = 252 +defaults.Texts.Exp.Text.Blue = 250 +defaults.Texts.Exp.Text.Stroke = {} +defaults.Texts.Exp.Text.Stroke.Width = 1 +defaults.Texts.Exp.Text.Stroke.Alpha = 127 +defaults.Texts.Exp.Text.Stroke.Red = 136 +defaults.Texts.Exp.Text.Stroke.Green = 97 +defaults.Texts.Exp.Text.Stroke.Blue = 18 +defaults.ShowDetails = {} +defaults.ShowDetails.MainJob = true +defaults.ShowDetails.SubJob = true +defaults.ShowDetails.Level = true +defaults.ShowDetails.ExperiencePoints = true +defaults.ShowDetails.ToNextLevel = true +defaults.ShowDetails.Percent = true +defaults.ShowDetails.Rate = true + +approved_commands = S{ + 'clear','c', + 'visible','v', + 'reload','r', + 'unload','u', + 'help','h' +} + +approved_commands = { + clear={n=0},c={n=0}, + visible={n=0},v={n=0}, + reload={n=0},r={n=0}, + unload={n=0},u={n=0}, + help={n=0},h={n=0} +} + +function load_images() + background_image:pos(settings.Images.Background.Pos.X, settings.Images.Background.Pos.Y) + background_image:path(settings.Images.Background.Texture.Path) + background_image:repeat_xy(settings.Images.Background.Repeatable.X, settings.Images.Background.Repeatable.Y) + background_image:draggable(settings.Images.Background.Draggable) + background_image:show() + + foreground_image:pos(settings.Images.Foreground.Pos.X, settings.Images.Foreground.Pos.Y) + foreground_image:path(settings.Images.Foreground.Texture.Path) + foreground_image:fit(settings.Images.Foreground.Texture.Fit) + foreground_image:draggable(settings.Images.Foreground.Draggable) + foreground_image:show() + + rested_bonus_image:pos(settings.Images.RestedBonus.Pos.X, settings.Images.RestedBonus.Pos.Y) + rested_bonus_image:visible(settings.Images.RestedBonus.Visible) + rested_bonus_image:path(settings.Images.RestedBonus.Texture.Path) + rested_bonus_image:draggable(settings.Images.RestedBonus.Draggable) + mog_house() + + position_images() +end + +function load_text_box() + exp_text:pos(settings.Texts.Exp.Pos.X, settings.Texts.Exp.Pos.Y) + exp_text:bg_alpha(settings.Texts.Exp.Background.Alpha) + exp_text:bg_visible(settings.Texts.Exp.Background.Visible) + exp_text:font(settings.Texts.Exp.Text.Font, unpack(settings.Texts.Exp.Text.Fonts)) + exp_text:size(settings.Texts.Exp.Text.Size) + exp_text:color(settings.Texts.Exp.Text.Red, settings.Texts.Exp.Text.Green, settings.Texts.Exp.Text.Blue) + exp_text:stroke_alpha(settings.Texts.Exp.Text.Stroke.Alpha) + exp_text:stroke_color(settings.Texts.Exp.Text.Stroke.Red, settings.Texts.Exp.Text.Stroke.Green, + settings.Texts.Exp.Text.Stroke.Blue) + exp_text:stroke_width(settings.Texts.Exp.Text.Stroke.Width) + + exp_text:show() +end + +function initialize() + xp = { + registry = {}, + total = 0, + rate = 0, + current = 0, + tnl = 0 + } + player = { + job = '', + sub = '', + lvl = '', + exp = '', + tnl = '', + phr = '', + pct = '' + } + load_images() + load_text_box() + calc_new_width() + update_strings() + ready = true +end + +function update_strings() + info = windower.ffxi.get_player() + player.job = string.upper(info.main_job) + player.sub = (info.sub_job and '('..string.lower(info.sub_job)..') ' or '(---) ') + player.lvl = 'Lv'..info.main_job_level..' ' + player.exp = 'EXP '..xp.current..'/'..xp.total..' ' + player.tnl = '('..xp.tnl..') ' + player.pct = (xp.total > 0 and math.floor((xp.current / xp.total) * 100)..'% ' or '0% ') + player.phr = 'EXP/hr '..string.format('%.1f',math.floor(xp.rate/100)/10)..'k' + exp_text:clear() + if settings.ShowDetails.MainJob then exp_text:append(player.job) end + if settings.ShowDetails.SubJob then exp_text:append(player.sub) else exp_text:append(' ') end + if settings.ShowDetails.Level then exp_text:append(player.lvl) end + if settings.ShowDetails.ExperiencePoints then exp_text:append(player.exp) end + if settings.ShowDetails.ToNextLevel then exp_text:append(player.tnl) end + if settings.ShowDetails.Percent then exp_text:append(player.pct) end + if settings.ShowDetails.Rate then exp_text:append(player.phr) end +end + +function display_help() + windower.add_to_chat(8,_addon.name..' v'.._addon.version..': Command Listing') + windower.add_to_chat(8,' (c)lear - Resets EXP counter') + windower.add_to_chat(8,' (v)isible - Toggles visibility') + windower.add_to_chat(8,' (u)nload - Disables BarFiller') + windower.add_to_chat(8,' (r)eload - Reloads BarFiller') +end + +function exp_msg(val,msg) + local t = os.clock() + if msg == 8 or msg == 105 then + xp.registry[t] = (xp.registry[t] or 0) + val + xp.current = math.min(xp.current + val,55999) + if xp.current > xp.tnl then + xp.current = xp.current - xp.tnl + end + chunk_update = true + end +end + +function analyze_points_table(tab) + local t = os.clock() + local running_total = 0 + local maximum_timestamp = 29 + for ts,points in pairs(tab) do + local time_diff = t - ts + if t - ts > 600 then + tab[ts] = nil + else + running_total = running_total + points + if time_diff > maximum_timestamp then + maximum_timestamp = time_diff + end + end + end + + local rate + if maximum_timestamp == 29 then + rate = 0 + else + rate = math.floor((running_total/maximum_timestamp)*3600) + end + + return rate +end + +function calc_new_width() + if xp.current > 0 and xp.total > 0 then + local calc = math.floor((xp.current / xp.total) * 468) + xp.rate = analyze_points_table(xp.registry) + return calc + end +end + +function position_images() + local x = windower.get_windower_settings().x_res / 2 - settings.Images.Background.Size.Width / 2 + + background_image:pos(x, settings.Images.Background.Pos.Y) + foreground_image:pos(x + 2, settings.Images.Foreground.Pos.Y) + rested_bonus_image:pos(x + settings.Images.Background.Size.Width, settings.Images.Background.Pos.Y - 6) +end + +function position_text() + exp_text:pos((background_image:pos_x() - 6), (background_image:pos_y() + 4)) +end + +function hide() + background_image:hide() + foreground_image:hide() + rested_bonus_image:hide() + exp_text:hide() + ready = false +end + +function show() + background_image:show() + foreground_image:show() + mog_house() + exp_text:show() + ready = true +end + +function mog_house() + return (windower.ffxi.get_info().mog_house and rested_bonus_image:show() or rested_bonus_image:hide()) +end |