summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-11-15 13:53:59 +0800
committerchai <chaifix@163.com>2021-11-15 13:53:59 +0800
commit942a030afd348ab2e02eac8054b43e3c3a72ea48 (patch)
treea13459f39a3d2f1b533fbd1b5ab523d7a621f673 /Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua
parente307051a56a54c27f10438fd2025edf61d0dfeed (diff)
*rename
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua859
1 files changed, 859 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua b/Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua
new file mode 100644
index 0000000..19c611b
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/plasmon/plasmon.lua
@@ -0,0 +1,859 @@
+--[[
+plasmon v1.20140530
+
+Copyright (c) 2013, Giuliano Riccio
+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 plasmon 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 Giuliano Riccio 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.
+]]
+
+require('logger')
+config = require('config')
+
+_addon.name = 'plasmon'
+_addon.author = 'Zohno'
+_addon.version = '1.20140530'
+_addon.command = 'plasmon'
+
+tb_name = 'addon:gr:plasmon'
+track = false
+visible = false
+recovery_mode = false
+
+stats = T{}
+stats.plasm = 0
+stats.tot_plasm = 0
+stats.mobs = 0
+stats.tot_mobs = 0
+stats.airlixirs = 0
+stats.tot_airlixirs = 0
+stats.airlixirs1 = 0
+stats.tot_airlixirs1 = 0
+stats.airlixirs2 = 0
+stats.tot_airlixirs2 = 0
+
+defaults = T{}
+defaults.light = false
+defaults.timer = true
+
+defaults.position = T{}
+defaults.position.x = 0
+defaults.position.y = 350
+
+defaults.font = T{}
+defaults.font.family = 'Arial'
+defaults.font.size = 10
+defaults.font.a = 255
+defaults.font.bold = false
+defaults.font.italic = false
+
+defaults.colors = T{}
+defaults.colors.background = T{}
+defaults.colors.background.r = 0
+defaults.colors.background.g = 43
+defaults.colors.background.b = 54
+defaults.colors.background.a = 200
+
+defaults.colors.delve = T{}
+defaults.colors.delve.title = T{}
+defaults.colors.delve.title.r = 220
+defaults.colors.delve.title.g = 50
+defaults.colors.delve.title.b = 47
+
+defaults.colors.delve.label = T{}
+defaults.colors.delve.label.r = 38
+defaults.colors.delve.label.g = 139
+defaults.colors.delve.label.b = 210
+
+defaults.colors.delve.value = T{}
+defaults.colors.delve.value.r = 147
+defaults.colors.delve.value.g = 161
+defaults.colors.delve.value.b = 161
+
+defaults.colors.airlixir = T{}
+defaults.colors.airlixir.title = T{}
+defaults.colors.airlixir.title.r = 220
+defaults.colors.airlixir.title.g = 50
+defaults.colors.airlixir.title.b = 47
+
+defaults.colors.airlixir.label = T{}
+defaults.colors.airlixir.label.r = 42
+defaults.colors.airlixir.label.g = 161
+defaults.colors.airlixir.label.b = 152
+
+defaults.colors.airlixir.value = T{}
+defaults.colors.airlixir.value.r = 147
+defaults.colors.airlixir.value.g = 161
+defaults.colors.airlixir.value.b = 161
+
+settings = config.load(defaults)
+
+-- plugin functions
+
+function parse_options(args)
+ local options = T{}
+
+ while #args > 0 do
+ if not args[1]:match('^-%a') then
+ break
+ end
+
+ local option = args:remove(1):sub(2)
+
+ if args[1] ~= nil and not args[1]:match('^-%a') then
+ options[option] = args:remove(1)
+ else
+ options[option] = true
+ end
+ end
+
+ return options
+end
+
+function test()
+ windower.add_to_chat(148, 'Now permeating the mists surrounding the fracture.')
+ windower.add_to_chat(148, 'You receive 50 corpuscles of mweya plasm.')
+ windower.add_to_chat(121, 'You find an airlixir on the Mob')
+ windower.add_to_chat(148, 'You receive 50 corpuscles of mweya plasm.')
+ windower.add_to_chat(148, 'You receive 50 corpuscles of mweya plasm.')
+ windower.add_to_chat(148, 'You receive 150 corpuscles of mweya plasm.')
+ windower.add_to_chat(148, 'You receive 50 corpuscles of mweya plasm.')
+ windower.add_to_chat(121, 'You find an airlixir on the Mob')
+ windower.add_to_chat(148, 'You receive 500 corpuscles of mweya plasm.')
+ windower.add_to_chat(121, 'You find an airlixir on the Mob')
+ windower.add_to_chat(121, 'You find an airlixir on the Mob')
+ windower.add_to_chat(121, 'You find an airlixir on the Mob')
+ windower.add_to_chat(121, 'You find an airlixir on the Mob')
+ windower.add_to_chat(121, 'You find an airlixir +1 on the Mob')
+ windower.add_to_chat(121, 'You find an airlixir +2 on the Mob')
+ windower.add_to_chat(146, 'Your time has expired for this battle. Now exiting...')
+ show_window()
+end
+
+function start_tracking()
+ reset_stats()
+ log('The Delve has begun!')
+ start_timer()
+
+ track = true
+
+ if recovery_mode then
+ recovery_mode = false
+ end
+
+ if settings.light == false then
+ show_window()
+ end
+end
+
+function stop_tracking()
+ stats.scores = T{}
+ stats.bonuses = T{}
+ track = false
+
+ log('The Delve has ended.')
+ stop_timer()
+ hide_window()
+ show_report()
+end
+
+function start_timer()
+ windower.send_command('timers create Delve 2700 down ../../../addons/plasmon/icon')
+end
+
+function stop_timer()
+ windower.send_command('timers delete Delve')
+end
+
+function refresh_window()
+ if visible == false then
+ return
+ end
+
+ local delve_colors = settings.colors.delve
+ local airlixir_colors = settings.colors.airlixir
+ local text = T{
+ ' \\cs('..delve_colors.title.r..', '..delve_colors.title.g..', '..delve_colors.title.b..')--== DELVE ==--\\cr \n',
+ ' \\cs('..delve_colors.label.r..', '..delve_colors.label.g..', '..delve_colors.label.b..')Plasm:\\cr',
+ ' \\cs('..delve_colors.value.r..', '..delve_colors.value.g..', '..delve_colors.value.b..')'..stats.plasm..'/'..stats.tot_plasm..'\\cr \n',
+ ' \\cs('..delve_colors.label.r..', '..delve_colors.label.g..', '..delve_colors.label.b..')Mobs:\\cr',
+ ' \\cs('..delve_colors.value.r..', '..delve_colors.value.g..', '..delve_colors.value.b..')'..stats.mobs..'/'..stats.tot_mobs..'\\cr \n',
+ ' \\cs('..airlixir_colors.title.r..', '..airlixir_colors.title.g..', '..airlixir_colors.title.b..')--== AIRLIXIRS ==--\\cr \n',
+ ' \\cs('..airlixir_colors.label.r..', '..airlixir_colors.label.g..', '..airlixir_colors.label.b..')Airlixir:\\cr',
+ ' \\cs('..airlixir_colors.value.r..', '..airlixir_colors.value.g..', '..airlixir_colors.value.b..')'..stats.airlixirs..'/'..stats.tot_airlixirs..'\\cr \n',
+ ' \\cs('..airlixir_colors.label.r..', '..airlixir_colors.label.g..', '..airlixir_colors.label.b..')Airlixir +1:\\cr',
+ ' \\cs('..airlixir_colors.value.r..', '..airlixir_colors.value.g..', '..airlixir_colors.value.b..')'..stats.airlixirs1..'/'..stats.tot_airlixirs1..'\\cr \n',
+ ' \\cs('..airlixir_colors.label.r..', '..airlixir_colors.label.g..', '..airlixir_colors.label.b..')Airlixir +2:\\cr',
+ ' \\cs('..airlixir_colors.value.r..', '..airlixir_colors.value.g..', '..airlixir_colors.value.b..')'..stats.airlixirs2..'/'..stats.tot_airlixirs2..'\\cr'
+ }
+
+ windower.text.set_text(tb_name, text:concat(''))
+end
+
+function reset_stats()
+ stats.plasm = 0
+ stats.mobs = 0
+ stats.airlixirs = 0
+ stats.airlixirs1 = 0
+ stats.airlixirs2 = 0
+ refresh_window()
+end
+
+function full_reset_stats()
+ stats.tot_plasm = 0
+ stats.tot_mobs = 0
+ stats.tot_airlixirs = 0
+ stats.tot_airlixirs1 = 0
+ stats.tot_airlixirs2 = 0
+ reset_stats()
+ refresh_window()
+end
+
+function show_window()
+ visible = true
+ windower.text.set_visibility(tb_name, true)
+ refresh_window()
+end
+
+function hide_window()
+ visible = false
+ windower.text.set_visibility(tb_name, false)
+end
+
+function toggle_window()
+ if visible then
+ hide_window()
+ else
+ show_window()
+ end
+end
+
+function show_report()
+ log('[Plasm '..(stats.plasm..'/'..stats.tot_plasm):color(258)..'] [Mobs '..(stats.mobs..'/'..stats.tot_mobs):color(258)..'] [Airlixir '..(stats.airlixirs..'/'..stats.tot_airlixirs):color(258)..' | +1 '..(stats.airlixirs1..'/'..stats.tot_airlixirs1):color(258)..' | +2 '..(stats.airlixirs2..'/'..stats.tot_airlixirs2):color(258)..']')
+end
+
+function initialize()
+ local background = settings.colors.background
+
+ windower.text.create(tb_name)
+ windower.text.set_location(tb_name, settings.position.x, settings.position.y)
+ windower.text.set_bg_color(tb_name, background.a, background.r, background.g, background.b)
+ windower.text.set_color(tb_name, settings.font.a, 147, 161, 161)
+ windower.text.set_font(tb_name, settings.font.family)
+ windower.text.set_font_size(tb_name, settings.font.size)
+ windower.text.set_bold(tb_name, settings.font.bold)
+ windower.text.set_italic(tb_name, settings.font.italic)
+ windower.text.set_text(tb_name, '')
+ windower.text.set_bg_visibility(tb_name, true)
+
+ if windower.ffxi.get_info().zone == 271 or windower.ffxi.get_info().zone == 264 then
+ recovery_mode = true
+ end
+end
+
+function dispose()
+ windower.text.delete(tb_name)
+ windower.send_command('timers delete Delve')
+end
+
+-- windower events
+
+windower.register_event('load', initialize:cond(function() return windower.ffxi.get_info().logged_in end))
+
+windower.register_event('login', initialize)
+
+windower.register_event('logout', 'unload', dispose)
+
+windower.register_event('zone change', stop_tracking:cond(function(_,id) return (id == 271 or id == 264) and track end))
+
+windower.register_event('incoming text', function(original, modified, mode)
+ local match
+
+ original = original:strip_format()
+
+ if track or recovery_mode then
+ if mode == 148 then
+ match = original:match('You receive (%d+) corpuscles of mweya plasm%.')
+
+ if match then
+ if recovery_mode then
+ start_tracking()
+ end
+
+ match = tonumber(match)
+ stats.plasm = stats.plasm + match
+ stats.tot_plasm = stats.tot_plasm + match
+
+ if match % 50 == 0 and match % 500 ~= 0 and match % 750 ~= 0 and match % 10000 ~= 0 then
+ mobs = match / 50
+ else
+ mobs = 1
+ end
+
+ stats.mobs = stats.mobs + mobs
+ stats.tot_mobs = stats.tot_mobs + mobs
+ refresh_window()
+
+ return modified, mode
+ end
+ elseif mode == 121 then
+ match = original:match('You find an airlixir %+1')
+
+ if match then
+ if recovery_mode then
+ start_tracking()
+ end
+
+ stats.airlixirs1 = stats.airlixirs1 + 1
+ stats.tot_airlixirs1 = stats.tot_airlixirs1 + 1
+ refresh_window()
+
+ return modified, mode
+ end
+
+ match = original:match('You find an airlixir %+2')
+
+ if match then
+ if recovery_mode then
+ start_tracking()
+ end
+
+ stats.airlixirs2 = stats.airlixirs2 + 1
+ stats.tot_airlixirs2 = stats.tot_airlixirs2 + 1
+ refresh_window()
+
+ return modified, mode
+ end
+
+ match = original:match('You find an airlixir')
+
+ if match then
+ if recovery_mode then
+ start_tracking()
+ end
+
+ stats.airlixirs = stats.airlixirs + 1
+ stats.tot_airlixirs = stats.tot_airlixirs + 1
+ refresh_window()
+
+ return modified, mode
+ end
+ elseif mode == 146 then
+ match = original:match('Your time has expired for this battle%. Now exiting%.%.%.')
+
+ if match then
+ stop_tracking()
+
+ return modified, mode
+ end
+ end
+ elseif mode > 20 then
+ --mode == 148 or mode == 151 then
+ --old zones
+ match = original:match('Now permeating the mists surrounding the fracture%.')
+ if match then
+ start_tracking()
+
+ return modified, mode
+ end
+
+ --new zones
+ match = original:match('Now permeating the mists surrounding the obscured domain%.')
+ if match then
+ start_tracking()
+
+ return modified, mode
+ end
+ end
+
+ return modified, mode
+end)
+
+windower.register_event('addon command', function(...)
+ local args = T({...})
+
+ if args[1] == nil then
+ windower.send_command('plasmon help')
+ return
+ end
+
+ local cmd = args:remove(1):lower()
+
+ if cmd == 'help' then
+ log(' help -- shows the help text.')
+ log(' test -- fills the chat log with some messages to show how the plugin will work.')
+ log(' reset -- sets current gained plasm, monster kill count and dropped airlixirs to 0.')
+ log(' full-reset -- sets both current and total gained plasm, monster kill count and dropped airlixirs to 0.')
+ log(' show -- shows the tracking window.')
+ log(' hide -- hides the tracking window.')
+ log(' toggle -- toggles the tracking window\'s visibility.')
+ log(' light [<enabled>] -- enables or disables light mode. When enabled, the addon will never show the window and just print a summary in the chat box at the end of the run. If the enabled parameter is not specified, the help text will be shown.')
+ log(' timer [<enabled>] -- enables or disables the timer. When enabled, the addon will start a 45 minutes timer when entering a fracture. If the enabled parameter is not specified, the help text will be shown.')
+ log(' position [[-h]|[-x <x>] [-y <y>]] -- sets the horizontal and vertical position of the window relative to the upper-left corner. If no parameter is specified, the help text will be shown.')
+ log(' font [[-h]|[-f <font>] [-s <size>] [-a <alpha>] [-b [<bold>]] [-i [<italic>]]] -- sets the style of the font used in the window. If the no parameter is specified, the help text will be shown.')
+ log(' color [[-h]|[-o <objects>] [-d] [-r <red>] [-g <green>] [-b <blue>] [-a <alpha>]] -- sets the colors of the various elements present in the addon\'s window. If no parameter is specified, the help text will be shown.')
+ elseif cmd == 'test' then
+ test()
+ elseif cmd == 'reset' then
+ reset_stats()
+ elseif cmd == 'full-reset' then
+ full_reset_stats()
+ elseif cmd == 'show' then
+ show_window()
+ elseif cmd == 'hide' then
+ hide_window()
+ elseif cmd == 'toggle' then
+ toggle_window()
+ elseif cmd == 'light' then
+ if type(args[1]) == 'nil' then
+ log('Enables or disables light mode. When enabled, the addon will never show the window and just print a summary in the chat box at the end of the run. If the enabled parameter is not specified, the help text will be shown.')
+ log('Usage: plasmon light <enabled>')
+ log('Positional arguments:')
+ log(' <enabled> specifies the status of the light mode. "default", "false" or "0" mean disabled. "true" or "1" mean enabled.')
+ else
+ local light
+
+ if args[1] == 'default' then
+ light = defaults.light
+ elseif args[1] == 'true' or args[1] == '1' then
+ light = true
+ elseif args[1] == 'false' or args[1] == '0' then
+ light = false
+ end
+
+ if light == true then
+ hide_window()
+ elseif track == true then
+ show_window()
+ end
+
+ if type(light) ~= "boolean" then
+ error('Please specify a valid status')
+
+ return
+ end
+
+ settings.light = light
+
+ refresh_window()
+ settings:save('all')
+ end
+ elseif cmd == 'timer' then
+ if type(args[1]) == 'nil' then
+ log('Enables or disables the timer. When enabled, the addon will start a 45 minutes timer when entering a fracture. If the enabled parameter is not specified, the help text will be shown.')
+ log('Usage: plasmon timer <enabled>')
+ log('Positional arguments:')
+ log(' <enabled> specifies the status of the timer. "false" or "0" mean disabled. "default", "true" or "1" mean enabled.')
+ else
+ local timer
+
+ if args[1] == 'true' or args[1] == '1' then
+ timer = true
+ elseif args[1] == 'false' or args[1] == '0' then
+ timer = false
+ end
+
+ if args[1] == 'default' then
+ timer = defaults.timer
+ elseif timer == true then
+ start_timer()()
+ elseif track == true then
+ stop_timer()
+ end
+
+ if type(timer) ~= "boolean" then
+ error('Please specify a valid status')
+
+ return
+ end
+
+ settings.timer = timer
+
+ refresh_window()
+ settings:save('all')
+ end
+ else
+ local options = parse_options(args)
+
+ if cmd == 'position' then
+ if options:containskey('h') or options:length() == 0 then
+ log('Sets the horizontal and vertical position of the window relative to the upper-left corner. If the no parameter is specified, the help text will be shown.')
+ log('Usage: plasmon position [[-h]|[-x <x>] [-y <y>]]')
+ log('Optional arguments:')
+ log(' -h shows the help text.')
+ log(' -x <x> specifies the horizontal position of the window.')
+ log(' -y <y> specifies the vertical position of the window.')
+ elseif options:length() > 0 then
+ local x = settings.position.x
+ local y = settings.position.y
+
+ for key, value in pairs(options) do
+ if key == 'x' then
+ if options['x'] == 'default' then
+ x = defaults.position.x
+ else
+ x = tonumber(options['x'])
+
+ if type(x) ~= "number" then
+ error('Please specify a valid horizontal position.')
+
+ return
+ end
+ end
+ elseif key == 'y' then
+ if options['y'] == 'default' then
+ y = defaults.position.y
+ else
+ y = tonumber(options['y'])
+
+ if type(y) ~= "number" then
+ error('Please specify a valid vertical position.')
+
+ return
+ end
+ end
+
+ else
+ error('"'..key..'" is not a recognized parameter')
+
+ return
+ end
+ end
+
+ settings.position.x = x
+ settings.position.y = y
+
+ windower.text.set_location(tb_name, x, y)
+ settings:save('all')
+ log('The window\'s position has been set.')
+ end
+ elseif cmd == 'font' then
+ if options:containskey('h') or options:length() == 0 then
+ log('Sets the style of the font used in the window. If the no parameter is specified, the help text will be shown.')
+ log('Usage: plasmon font [[-h]|[-f <font>] [-s <size>] [-a <alpha>] [-b [<bold>]] [-i [<italic>]]]')
+ log('Optional arguments:')
+ log(' -h shows the help text.')
+ log(' -f <font> specifies the text\'s font.')
+ log(' -s <size> specifies the text\'s size.')
+ log(' -a <alpha> specifies the text\'s transparency. the value must be set between 0 (transparent) and 255 (opaque), inclusive.')
+ log(' -b [<bold>] specifies if the text should be rendered bold. "default", "false" or "0" mean disabled. "true", "1" or no value mean enabled.')
+ log(' -i [<italic>] specifies if the text should be rendered italic. "default", "false" or "0" mean disabled. "true", "1" or no value mean enabled.')
+ elseif options:length() > 0 then
+ local family = settings.font.family
+ local size = settings.font.size
+ local bold = settings.font.bold
+ local italic = settings.font.italic
+ local a = settings.font.a
+
+ for key, value in pairs(options) do
+ if key == 'f' then
+ if options['f'] == 'default' then
+ family = defaults.font.family
+ else
+ family = options['f']
+ end
+ elseif key == 's' then
+ if options['s'] == 'default' then
+ size = defaults.position.size
+ else
+ size = tonumber(options['s'])
+
+ if type(size) ~= "number" then
+ error('Please specify a valid font size.')
+
+ return
+ end
+ end
+ elseif key == 'b' then
+ if options['b'] == 'default' then
+ bold = defaults.position.bold
+ elseif options['b'] == true or options['b'] == '1' or options['b'] == 'true' or options['b'] == 'null' then
+ bold = true
+ elseif options['b'] == '0' or options['b'] == 'false' then
+ bold = false
+ else
+ error('Please specify a valid bold status.')
+
+ return
+ end
+ elseif key == 'i' then
+ if options['i'] == 'default' then
+ italic = defaults.position.italic
+ elseif options['b'] == true or options['i'] == '1' or options['i'] == 'true' or options['i'] == 'null' then
+ italic = true
+ elseif options['i'] == '0' or options['i'] == 'false' then
+ italic = false
+ else
+ error('Please specify a valid italic status.')
+
+ return
+ end
+ elseif key == 'a' then
+ if options['a'] == 'default' then
+ a = defaults.position.a
+ else
+ a = tonumber(options['a'])
+
+ if type(a) ~= "number" then
+ error('Please specify a valid alpha value.')
+
+ return
+ else
+ a = math.min(255, math.max(0, a))
+ end
+ end
+ else
+ error('"'..key..'" is not a recognized parameter')
+
+ return
+ end
+ end
+
+ settings.font.family = family
+ settings.font.size = size
+ settings.font.bold = bold
+ settings.font.italic = italic
+ settings.font.a = a
+
+ windower.text.set_color(tb_name, a, 147, 161, 161)
+ windower.text.set_font(tb_name, family, size)
+ windower.text.set_bold(tb_name, bold)
+ windower.text.set_italic(tb_name, italic)
+ settings:save('all')
+ log('The font\'s style has been set.')
+ end
+ elseif cmd == 'color' then
+ local validObjects = T{
+ 'all', 'background', 'bg', 'title', 'label', 'value',
+ 'plasmon', 'plasmon.title', 'plasmon.label', 'plasmon.value',
+ 'airlixir', 'airlixir.title', 'airlixir.label', 'airlixir.value'
+ }
+
+ if options:containskey('h') or options:length() == 0 then
+ log('Sets the colors of the various elements present in the addon\'s window. If the no parameter is specified, the help text will be shown.')
+ log('Usage: plasmon color [[-h]|[-o <objects>] [-d] [-r <red>] [-g <green>] [-b <blue>] [-a <alpha>]]')
+ log('Optional arguments:')
+ log(' -h shows the help text.')
+ log(' -o <objects> specifies the item/s which will have its/their color changed. If this parameter is missing all the objects will be changed. The accepted values are: "'..validObjects:concat('", "')..'"')
+ log(' -d sets the red, green, blue and alpha values of the specified objects to their default values.')
+ log(' -r <red> specifies the intensity of the red color. The value must be set between 0 and 255, inclusive, where 0 is less intense and 255 is most intense.')
+ log(' -g <green> specifies the intensity of the greencolor. The value must be set between 0 and 255, inclusive, where 0 is less intense and 255 is most intense.')
+ log(' -b <blue> specifies the intensity of the blue color. The value must be set between 0 and 255, inclusive, where 0 is less intense and 255 is most intense.')
+ log(' -a <alpha> specifies the text\'s transparency. The value must be set between 0 (transparent) and 255 (opaque), inclusive.')
+ elseif options:length() > 0 then
+ local r = -1
+ local g = -1
+ local b = -1
+ local a = -1
+ local objects
+
+ if options:containskey('o') then
+ if validObjects:contains(options['o']) then
+ if options['o'] == 'background' or options['o'] == 'bg' then
+ objects = T{'background'}
+ elseif options['o'] == 'title' then
+ objects = T{
+ 'plasmon.title',
+ 'airlixir.title'
+ }
+ elseif options['o'] == 'label' then
+ objects = T{
+ 'plasmon.label',
+ 'airlixir.label'
+ }
+ elseif options['o'] == 'value' then
+ objects = T{
+ 'plasmon.value',
+ 'airlixir.value'
+ }
+ elseif options['o'] == 'plasmon' then
+ objects = T{
+ 'plasmon.title',
+ 'plasmon.label',
+ 'plasmon.value'
+ }
+ elseif options['o'] == 'airlixir' then
+ objects = T{
+ 'airlixir.title',
+ 'airlixir.label',
+ 'airlixir.value'
+ }
+ elseif options['o'] == 'plasmon.title' then
+ objects = T{'plasmon.title'}
+ elseif options['o'] == 'plasmon.label' then
+ objects = T{'plasmon.label'}
+ elseif options['o'] == 'plasmon.value' then
+ objects = T{'plasmon.value'}
+ elseif options['o'] == 'airlixir.title' then
+ objects = T{'airlixir.title'}
+ elseif options['o'] == 'airlixir.label' then
+ objects = T{'airlixir.label'}
+ elseif options['o'] == 'airlixir.value' then
+ objects = T{'airlixir.value'}
+ end
+ else
+ error('Please specify a valid object or set of objects.')
+
+ return
+ end
+ else
+ objects = T{
+ 'background',
+ 'plasmon.title', 'plasmon.label', 'plasmon.value',
+ 'airlixir.title', 'airlixir.label', 'airlixir.value'
+ }
+ end
+
+ if not options:containskey('d') then
+ for key, value in pairs(options) do
+ if key == 'r' then
+ if options['r'] == 'default' then
+ r = -1
+ else
+ r = tonumber(options['r'])
+
+ if type(r) ~= "number" then
+ error('Please specify a valid red value.')
+
+ return
+ else
+ r = math.min(255, math.max(0, r))
+ end
+ end
+ elseif key == 'g' then
+ if options['g'] == 'default' then
+ g = -1
+ else
+ g = tonumber(options['g'])
+
+ if type(g) ~= "number" then
+ error('Please specify a valid green value.')
+
+ return
+ else
+ g = math.min(255, math.max(0, g))
+ end
+ end
+ elseif key == 'b' then
+ if options['b'] == 'default' then
+ b = -1
+ else
+ b = tonumber(options['b'])
+
+ if type(b) ~= "number" then
+ error('Please specify a valid blue value.')
+
+ return
+ else
+ b = math.min(255, math.max(0, b))
+ end
+ end
+ elseif key == 'a' then
+ if options['a'] == 'default' then
+ a = -1
+ else
+ a = tonumber(options['a'])
+
+ if type(a) ~= "number" then
+ error('Please specify a valid alpha value.')
+
+ return
+ else
+ a = math.min(255, math.max(0, a))
+ end
+ end
+ elseif key == 'o' then
+ else
+ error('"'..key..'" is not a recognized parameter.')
+
+ return
+ end
+ end
+ end
+
+ for key, object in pairs(objects) do
+ local indexes = T(object:split('.'))
+
+ if indexes:length() == 2 then
+ if r == -1 then
+ settings.colors[indexes[1]][indexes[2]].r = defaults.colors[indexes[1]][indexes[2]].r
+ else
+ settings.colors[indexes[1]][indexes[2]].r = r
+ end
+
+ if g == -1 then
+ settings.colors[indexes[1]][indexes[2]].g = defaults.colors[indexes[1]][indexes[2]].g
+ else
+ settings.colors[indexes[1]][indexes[2]].g = g
+ end
+
+ if b == -1 then
+ settings.colors[indexes[1]][indexes[2]].b = defaults.colors[indexes[1]][indexes[2]].b
+ else
+ settings.colors[indexes[1]][indexes[2]].b = b
+ end
+ elseif indexes:length() == 1 then
+ if r == -1 then
+ settings.colors[indexes[1]].r = defaults.colors[indexes[1]].r
+ else
+ settings.colors[indexes[1]].r = r
+ end
+
+ if g == -1 then
+ settings.colors[indexes[1]].g = defaults.colors[indexes[1]].g
+ else
+ settings.colors[indexes[1]].g = g
+ end
+
+ if b == -1 then
+ settings.colors[indexes[1]].b = defaults.colors[indexes[1]].b
+ else
+ settings.colors[indexes[1]].b = b
+ end
+
+ if a == -1 then
+ settings.colors[indexes[1]].a = defaults.colors[indexes[1]].a
+ else
+ settings.colors[indexes[1]].a = a
+ end
+
+ windower.text.set_bg_color(
+ tb_name,
+ settings.colors[indexes[1]].a,
+ settings.colors[indexes[1]].r,
+ settings.colors[indexes[1]].g,
+ settings.colors[indexes[1]].b
+ )
+ end
+ end
+
+ refresh_window()
+ settings:save('all')
+ log('The objects\' color has been set.')
+ end
+ else
+ windower.send_command('plasmon help')
+ end
+ end
+end) \ No newline at end of file