summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/barfiller
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/barfiller')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_bg.pngbin0 -> 12234 bytes
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.pngbin0 -> 2814 bytes
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/barfiller/barfiller.lua147
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/barfiller/moon.pngbin0 -> 1061 bytes
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/barfiller/statics.lua312
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
new file mode 100644
index 0000000..72a79f9
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_bg.png
Binary files differ
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png
new file mode 100644
index 0000000..fb8e329
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/bar_fg.png
Binary files differ
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
new file mode 100644
index 0000000..c7a119b
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/barfiller/moon.png
Binary files differ
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