summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/autocontrol/autocontrol.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/autocontrol/autocontrol.lua')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/autocontrol/autocontrol.lua305
1 files changed, 305 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/autocontrol/autocontrol.lua b/Data/BuiltIn/Libraries/lua-addons/addons/autocontrol/autocontrol.lua
new file mode 100644
index 0000000..3c0d51c
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/autocontrol/autocontrol.lua
@@ -0,0 +1,305 @@
+--[[
+Copyright © 2013, 2014, 2020 Ricky Gall, Nifim
+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 <addon name> 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 <your name> 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 = 'autocontrol'
+_addon.version = '2.0.5'
+_addon.author = 'Nitrous (Shiva)'
+_addon.commands = {'autocontrol','acon'}
+
+require('tables')
+require('strings')
+require('logger')
+require('sets')
+res = require('resources')
+config = require('config')
+files = require('files')
+chat = require('chat')
+
+defaults = {}
+defaults.bg = {}
+defaults.bg.red = 0
+defaults.bg.blue = 0
+defaults.bg.green = 0
+defaults.pos = {}
+defaults.pos.x = 400
+defaults.pos.y = 300
+defaults.text = {}
+defaults.text.red = 255
+defaults.text.green = 255
+defaults.text.blue = 255
+defaults.text.font = 'Consolas'
+defaults.text.size = 10
+defaults.autosets = T{}
+defaults.autosets.default = T{ }
+defaults.AutoActivate = true
+defaults.AutoDeusExAutomata = false
+defaults.maneuvertimers = true
+defaults.burdentracker = true
+
+settings = config.load(defaults)
+
+burden_hud = require('burdometer') -- has to be loaded after settings are parsed.
+require("autoabils")
+recast_ids = {}
+recast_ids.deactivate = res.job_abilities:with('english', 'Deactivate').recast_id
+recast_ids.activate = res.job_abilities:with('english', 'Activate').recast_id
+recast_ids.deusex = res.job_abilities:with('english', 'Deus Ex Automata').recast_id
+
+petlessZones = S{50,235,234,224,284,233,70,257,251,14,242,250,226,245,
+ 237,249,131,53,252,231,236,246,232,240,247,243,223,248,230,
+ 26,71,244,239,238,241,256,257}
+
+function initialize()
+ local player = windower.ffxi.get_player()
+ if not player then
+ windower.send_command('@wait 5;lua i autocontrol initialize')
+ return
+ end
+
+ mjob_id = player.main_job_id
+ atts = res.items:category('Automaton')
+
+ local playermob = windower.ffxi.get_mob_by_index(player.index)
+ while(playermob == nil) do
+ coroutine.sleep(1)
+ playermob = windower.ffxi.get_mob_by_index(player.index)
+ end
+
+ if mjob_id == 18 then
+ if playermob.pet_index then
+ if settings.burdentracker then
+ burden_hud:show()
+ end
+ end
+ end
+end
+
+windower.register_event('load', 'login', initialize)
+
+function attach_set(autoset)
+ if windower.ffxi.get_player().main_job_id ~= 18 or not settings.autosets[autoset] then
+ return
+ end
+ if settings.autosets[autoset]:map(string.lower):equals(get_current_autoset():map(string.lower)) then
+ log('The '..autoset..' set is already equipped.')
+ return
+ end
+
+ local playermob = windower.ffxi.get_mob_by_index(windower.ffxi.get_player().index)
+ if playermob.pet_index and playermob.pet_index ~= 0 then
+ local recast = windower.ffxi.get_ability_recasts()[recast_ids.deactivate]
+ if recast == 0 then
+ windower.send_command('input /pet "Deactivate" <me>')
+ log('Deactivating ' .. windower.ffxi.get_mjob_data().name .. '.')
+ windower.send_command('@wait 2;lua i autocontrol attach_set '..autoset)
+ elseif recast then
+ error('Deactivate on cooldown wait ' .. (recast / 60) .. ' seconds and try again')
+ end
+ else
+ windower.ffxi.reset_attachments()
+ log('Starting to equip '..autoset..' to '..windower.ffxi.get_mjob_data().name..'.')
+ set_attachments_from_autoset(autoset, 'head')
+ end
+end
+
+function set_attachments_from_autoset(autoset,slot)
+ if slot == 'head' then
+ local tempHead = settings.autosets[autoset].head:lower()
+ if tempHead then
+ for att in atts:it() do
+ if att.name:lower() == tempHead and att.id > 5000 then
+ windower.ffxi.set_attachment(att.id)
+ break
+ end
+ end
+ end
+ coroutine.schedule(set_attachments_from_autoset:prepare(autoset, 'frame'), 0.5)
+ elseif slot == 'frame' then
+ local tempFrame = settings.autosets[autoset].frame:lower()
+ if tempFrame then
+ for att in atts:it() do
+ if att.name:lower() == tempFrame and att.id > 5000 then
+ windower.ffxi.set_attachment(att.id)
+ break
+ end
+ end
+ end
+ coroutine.schedule(set_attachments_from_autoset:prepare(autoset, '1'), 0.5)
+ else
+ local tempname = settings.autosets[autoset]['slot' .. tostring(slot):zfill(2)]:lower()
+ if tempname then
+ for att in atts:it() do
+ if att.name:lower() == tempname and att.id > 5000 then
+ windower.ffxi.set_attachment(att.id, tonumber(slot))
+ break
+ end
+ end
+ end
+
+ if tonumber(slot) < 12 then
+ coroutine.schedule(set_attachments_from_autoset:prepare(autoset, slot + 1), 0.5)
+ else
+ log(windower.ffxi.get_mjob_data().name..' has been equipped with the '..autoset..' set.')
+ if petlessZones:contains(windower.ffxi.get_info().zone) then
+ return
+ else
+ local recasts = windower.ffxi.get_ability_recasts()
+ if settings.AutoActivate and recasts[recast_ids.activate] == 0 then
+ windower.send_command('input /ja "Activate" <me>')
+ elseif settings.AutoDeusExAutomata and recasts[recast_ids.deusex] == 0 then
+ log('Activate is down, using Deus Ex Automata instead.')
+ windower.send_command('input /ja "Deus Ex Automata" <me>')
+ elseif settings.AutoActivate and settings.AutoDeusExAutomata then
+ log('Activate and Deus Ex Automata timers were not ready.')
+ elseif settings.AutoActivate then
+ log('Activate timer was not ready.')
+ elseif settings.AutoDeusExAutomata then
+ log('Deus Ex Automata timer was not ready.')
+ end
+ end
+ end
+ end
+end
+
+function get_current_autoset()
+ if windower.ffxi.get_player().main_job_id == 18 then
+ local autoTable = T{}
+ local mjob_data = windower.ffxi.get_mjob_data()
+ local tmpTable = mjob_data.attachments
+ for i = 1, 12 do
+ local t = ''
+ if tmpTable[i] then
+ if i < 10 then
+ t = '0'
+ end
+ autoTable['slot' .. tostring(i):zfill(2)] = atts[tmpTable[i]].name:lower()
+ end
+ end
+ autoTable.head = atts[mjob_data.head].name:lower()
+ autoTable.frame = atts[mjob_data.frame].name:lower()
+ return autoTable
+ end
+end
+
+function save_set(setname)
+ if setname == 'default' then
+ error('Please choose a name other than default.')
+ return
+ end
+
+ settings.autosets[setname] = get_current_autoset()
+ config.save(settings, 'all')
+ notice('Set '..setname..' saved.')
+end
+
+function get_autoset_list()
+ log('Listing sets:')
+ for key,_ in pairs(settings.autosets) do
+ if key ~= 'default' then
+ log('\t' .. key .. ': ' .. (settings.autosets[key]:length()-2) .. ' attachments.')
+ end
+ end
+end
+
+function get_autoset_content(autoset)
+ log('Getting '..autoset..'\'s attachment list:')
+ settings.autosets[autoset]:vprint()
+end
+
+windower.register_event('addon command', function(comm, ...)
+ if windower.ffxi.get_player().main_job_id ~= 18 then
+ error('You are not on Puppetmaster.')
+ return
+ end
+
+ local args = L{...}
+ comm = comm or 'help'
+
+ if comm == 'saveset' then
+ if args[1] then
+ save_set(args[1])
+ end
+ elseif comm == 'add' then
+ if args[2] then
+ local slot = table.remove(args,1)
+ local attach = args:sconcat()
+ add_attachment(attach,slot)
+ end
+ elseif comm == 'equipset' then
+ if args[1] then
+ attach_set(args[1])
+ end
+ elseif comm == 'setlist' then
+ get_autoset_list()
+ elseif comm == 'attlist' then
+ if args[1] then
+ get_autoset_content(args[1])
+ end
+ elseif comm == 'list' then
+ get_current_autoset():vprint()
+ elseif comm == "maneuvertimers" or comm == "mt" then
+ maneuvertimers = not maneuvertimers
+ elseif S{'fonttype','fontsize','pos','bgcolor','txtcolor'}:contains(comm) then
+ if comm == 'fonttype' then burden_hud:font(args[1])
+ elseif comm == 'fontsize' then burden_hud:size(args[1])
+ elseif comm == 'pos' then burden_hud:pos(args[1], args[2])
+ elseif comm == 'bgcolor' then burden_hud:bgcolor(args[1], args[2], args[3])
+ elseif comm == 'txtcolor' then burden_hud:color(args[1], args[2], args[3])
+ end
+ config.save(settings, 'all')
+ elseif comm == 'show' then burden_hud:show()
+ elseif comm == 'hide' then burden_hud:hide()
+ elseif comm == 'settings' then
+ log('BG: R: '..settings.bg.red..' G: '..settings.bg.green..' B: '..settings.bg.blue)
+ log('Font: '..settings.text.font..' Size: '..settings.text.size)
+ log('Text: R: '..settings.text.red..' G: '..settings.text.green..' B: '..settings.text.blue)
+ log('Position: X: '..settings.pos.x..' Y: '..settings.pos.y)
+ else
+ log('Autosets command list:')
+ log(' 1. help - Brings up this menu.')
+ log(' 2. setlist - list all saved automaton sets.')
+ log(' 3. saveset <setname> - saves <setname> to your settings.')
+ log(' 4. equipset <setname> - equips <setname> to your automaton.')
+ log(' 5. attlist <setname> - gets the attachment list for <setname>')
+ log(' 6. list - gets the list of currently equipped attachments.')
+ log(' 7. maneuvertimers - Toggles showing maneuver timers on/off.')
+ log('The following all correspond to the burden tracker:')
+ log(' fonttype <name> | fontsize <size> | pos <x> <y>')
+ log(' bgcolor <r> <g> <b> | txtcolor <r> <g> <b>')
+ log(' settings - shows current settings')
+ log(' show/hide - toggles visibility of the tracker so you can make changes.')
+ end
+end)
+
+windower.register_event("job change", function(main_job_id)
+ if main_job_id == 18 and settings.burdentracker then
+ burden_hud:show()
+ else
+ burden_hud:hide()
+ end
+end)