summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/position_manager/position_manager.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/position_manager/position_manager.lua')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/position_manager/position_manager.lua194
1 files changed, 194 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/position_manager/position_manager.lua b/Data/BuiltIn/Libraries/lua-addons/addons/position_manager/position_manager.lua
new file mode 100644
index 0000000..4df4123
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/position_manager/position_manager.lua
@@ -0,0 +1,194 @@
+--Copyright © 2020, Lili
+--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 position_manager 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 Lili 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 = 'position_manager'
+_addon.author = 'Lili'
+_addon.version = '2.0.1'
+_addon.command = 'pm'
+
+if not windower.file_exists(windower.windower_path .. '\\plugins\\WinControl.dll') then
+ print('position_manager: error - Please install the WinControl plugin in the launcher.')
+ windower.send_command('lua u position_manager')
+ return
+else
+ print('position_manager: loading WinControl...')
+ windower.send_command('load wincontrol')
+end
+
+local config = require('config')
+
+local default = {
+ x = 0,
+ y = 0,
+ width = -1,
+ height = -1,
+ delay = 0,
+}
+
+local settings = config.load(default)
+
+function get_name(name)
+ if name ~= nil and type(name) ~= 'string' then
+ err('invalid name provided')
+ return false
+ elseif not name then
+ return windower.ffxi.get_player().name
+ elseif name == ':all' then
+ return 'all'
+ end
+ return name
+end
+
+function err(reason)
+ windower.add_to_chat(207, 'position_manager: ERROR - %s.':format(err))
+ show_help()
+ return
+end
+
+function show_help()
+ windower.add_to_chat(207, 'position_manager: Commands:')
+ windower.add_to_chat(207, ' //pm set <x> <y> [name]')
+ windower.add_to_chat(207, ' //pm size <width> <height> [name]')
+ windower.add_to_chat(207, ' //pm delay <seconds> [name]')
+ windower.add_to_chat(207, 'position_manager: See the readme for details.')
+end
+
+function move(settings)
+ if settings.delay > 0 then
+ coroutine.sleep(settings.delay)
+ end
+
+ windower.send_command('wincontrol move %s %s':format(settings.x, settings.y))
+ --print('::wincontrol move %s %s':format(settings.x, settings.y))
+end
+
+function resize(settings)
+ if settings.width == -1 and settings.height == -1 then
+ windower.send_command('wincontrol resize reset')
+ return
+ end
+
+ if settings.delay > 0 then
+ coroutine.sleep(settings.delay)
+ end
+
+ local width = settings.width == -1 and windower.get_windower_settings().ui_x_res or settings.width
+ local height = settings.height == -1 and windower.get_windower_settings().ui_y_res or settings.height
+
+ windower.send_command('wincontrol resize %s %s':format(width, height))
+ --print('::wincontrol resize %s %s':format(width, height))
+end
+
+function handle_commands(cmd, ...)
+ cmd = cmd and cmd:lower()
+
+ if cmd == 'r' then
+ windower.send_command('lua r position_manager')
+ return
+ elseif cmd == 'set' or cmd == 'size' then
+ local arg = {...}
+ local name = get_name(arg[3])
+
+ if not name then
+ return
+ end
+
+ arg[1] = arg[1] == 'default' and -1 or tonumber(arg[1])
+ arg[2] = arg[2] == 'default' and -1 or tonumber(arg[2])
+
+ if arg[1] and arg[2] then
+ if cmd == 'set' then
+ settings.x = arg[1]
+ settings.y = arg[2]
+
+ if settings.x and settings.y then
+ config.save(settings, name)
+ windower.add_to_chat(207, 'position_manager: Position set to %s, %s for %s.':format(settings.x, settings.y, name))
+ else
+ err('invalid position provided.')
+ return false
+ end
+ elseif cmd == 'size' then
+ settings.width = arg[1]
+ settings.height = arg[2]
+
+ if settings.width and settings.height then
+ config.save(settings, name)
+ windower.add_to_chat(207, 'position_manager: Window size set to %s, %s for %s.':format(settings.width, settings.height, name))
+ else
+ err('invalid window size provided.')
+ return false
+ end
+ end
+ else
+ err('invalid arguments provided.')
+ return false
+ end
+
+ if player_name and name:lower() == player_name:lower() then
+ if cmd == 'set' then
+ move(settings)
+ elseif cmd == 'size' then
+ resize(settings)
+ end
+ end
+
+ windower.send_ipc_message(name)
+ return true
+
+ elseif cmd == 'delay' then
+ settings.delay = tonumber(arg[2])
+
+ if settings.delay > 0 then
+ config.save(settings, name)
+ windower.add_to_chat(207, 'position_manager: Delay set to %s for %s.':format(settings.delay, name))
+ else
+ err('invalid delay provided')
+ return false
+ end
+ return true
+
+ elseif cmd ~= 'help' then
+ windower.add_to_chat(207, 'position_manager: %s command not found.':format(cmd))
+ end
+ show_help()
+end
+
+config.register(settings, move)
+config.register(settings, resize)
+
+windower.register_event('addon command', handle_commands)
+
+windower.register_event('load','login','logout', function(name)
+ local player = windower.ffxi.get_player()
+ player_name = player and player.name
+end)
+
+windower.register_event('ipc message', function(msg)
+ if msg == player_name or msg == 'all' then
+ config.reload(settings)
+ end
+end)