summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/azureSets
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/azureSets')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/azureSets/Readme.md42
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/azureSets/azuresets.lua298
2 files changed, 340 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/azureSets/Readme.md b/Data/BuiltIn/Libraries/lua-addons/addons/azureSets/Readme.md
new file mode 100644
index 0000000..9e2d25b
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/azureSets/Readme.md
@@ -0,0 +1,42 @@
+**Author:** Ricky Gall
+**Version:** 1.24
+**Description:**
+Addon to make setting blue spells easier. Currently only works as blu main.
+
+**Abbreviations:** aset, azureset
+
+**Commands:**
+ 1. //aset removeall - Unsets all spells.
+ 2. //aset spellset <setname> [ClearFirst|PreserveTraits] -- Set (setname)'s spells,
+ optional parameter: ClearFirst or PreserveTraits: overrides
+ setting to clear spells first or remove individually,
+ preserving traits where possible. Default: use settings or
+ preservetraits if settings not configured.
+ 3. //aset set <setname> [ClearFirst|PreserveTraits] -- Same as spellset
+ 4. //aset add &lt;slot&gt; &lt;spell&gt; -- Set (spell) to slot (slot (number)).
+ 5. //aset save &lt;setname&gt; -- Saves current spellset as (setname).
+ 6. //aset currentlist -- Lists currently set spells.
+ 7. //aset setlist -- Lists all spellsets.
+ 8. //aset spelllist &lt;setname&gt; -- List spells in (setname)
+ 9. //aset help --Shows this menu.
+
+**Changes:**
+v1.23 - v1.24
+ * Changed default spellset method to preserve traits.
+ * Added setting for setmethod to either PresereTraits or ClearFirst.
+ * Added setting for setspeed. Wait time between each spell being set. Faster timing
+ may result in multiple attempts at setting the spell and could lead to
+ increased total set time. Default: 0.65 seconds.
+
+v1.15 - v1.22
+ * Fixed spells that were missing
+ * Recoded for 4.1
+
+v1.1 - v1.15
+ * Added spellset listing
+ * Added listing a given set's spells
+ * Added default VW sets (VW1 and VW2) which include Wind, Thunder, Light, Dark and Fire, Ice, Water, Earth (respectively)
+ * Added //aset list into the help menu given in game (it worked before but i forgot to include it)
+
+v1.0 - v1.1
+ * Fixed issue with saving sets.
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/azureSets/azuresets.lua b/Data/BuiltIn/Libraries/lua-addons/addons/azureSets/azuresets.lua
new file mode 100644
index 0000000..41bab29
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/azureSets/azuresets.lua
@@ -0,0 +1,298 @@
+--[[
+Copyright (c) 2013, Ricky Gall
+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 azureSets 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 The Addon's Contributors 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 = 'AzureSets'
+_addon.version = '1.23'
+_addon.author = 'Nitrous (Shiva)'
+_addon.commands = {'aset','azuresets','asets'}
+
+require('tables')
+require('strings')
+require('logger')
+config = require('config')
+files = require('files')
+res = require('resources')
+chat = require('chat')
+
+defaults = {}
+defaults.setmode = 'PreserveTraits'
+defaults.setspeed = 0.65
+defaults.spellsets = {}
+defaults.spellsets.default = T{}
+defaults.spellsets.vw1 = T{slot01='Firespit', slot02='Heat Breath', slot03='Thermal Pulse', slot04='Blastbomb',
+slot05='Infrasonics', slot06='Frost Breath', slot07='Ice Break', slot08='Cold Wave',
+slot09='Sandspin', slot10='Magnetite Cloud', slot11='Cimicine Discharge', slot12='Bad Breath',
+slot13='Acrid Stream', slot14='Maelstrom', slot15='Corrosive Ooze', slot16='Cursed Sphere',
+slot17='Awful Eye'
+}
+defaults.spellsets.vw2 = T{slot01='Hecatomb Wave', slot02='Mysterious Light', slot03='Leafstorm', slot04='Reaving Wind',
+slot05='Temporal Shift', slot06='Mind Blast', slot07='Blitzstrahl', slot08='Charged Whisker',
+slot09='Blank Gaze', slot10='Radiant Breath', slot11='Light of Penance', slot12='Actinic Burst',
+slot13='Death Ray', slot14='Eyes On Me', slot15='Sandspray'
+}
+
+settings = config.load(defaults)
+
+function initialize()
+ spells = res.spells:type('BlueMagic')
+ get_current_spellset()
+end
+
+windower.register_event('load', initialize:cond(function() return windower.ffxi.get_info().logged_in end))
+
+windower.register_event('login', initialize)
+
+windower.register_event('job change', initialize:cond(function(job) return job == 16 end))
+
+function set_spells(spellset, setmode)
+ if windower.ffxi.get_player()['main_job_id'] ~= 16 --[[and windower.ffxi.get_player()['sub_job_id'] ~= 16]] then
+ error('Main job not set to Blue Mage.')
+ return
+ end
+ if settings.spellsets[spellset] == nil then
+ error('Set not defined: '..spellset)
+ return
+ end
+ if is_spellset_equipped(settings.spellsets[spellset]) then
+ log(spellset..' was already equipped.')
+ return
+ end
+
+ log('Starting to set '..spellset..'.')
+ if setmode:lower() == 'clearfirst' then
+ remove_all_spells()
+ set_spells_from_spellset:schedule(settings.setspeed, spellset, 'add')
+ elseif setmode:lower() == 'preservetraits' then
+ set_spells_from_spellset(spellset, 'remove')
+ else
+ error('Unexpected setmode: '..setmode)
+ end
+end
+
+function is_spellset_equipped(spellset)
+ return S(spellset):map(string.lower) == S(get_current_spellset())
+end
+
+function set_spells_from_spellset(spellset, setPhase)
+ local setToSet = settings.spellsets[spellset]
+ local currentSet = get_current_spellset()
+
+ if setPhase == 'remove' then
+ -- Remove Phase
+ for k,v in pairs(currentSet) do
+ if not setToSet:contains(v:lower()) then
+ setSlot = k
+ local slotToRemove = tonumber(k:sub(5, k:len()))
+
+ windower.ffxi.remove_blue_magic_spell(slotToRemove)
+ --log('Removed spell: '..v..' at #'..slotToRemove)
+ set_spells_from_spellset:schedule(settings.setspeed, spellset, 'remove')
+ return
+ end
+ end
+ end
+ -- Did not find spell to remove. Start set phase
+ -- Find empty slot:
+ local slotToSetTo
+ for i = 1, 20 do
+ local slotName = 'slot%02u':format(i)
+ if currentSet[slotName] == nil then
+ slotToSetTo = i
+ break
+ end
+ end
+
+ if slotToSetTo ~= nil then
+ -- We found an empty slot. Find a spell to set.
+ for k,v in pairs(setToSet) do
+ if not currentSet:contains(v:lower()) then
+ if v ~= nil then
+ local spellID = find_spell_id_by_name(v)
+ if spellID ~= nil then
+ windower.ffxi.set_blue_magic_spell(spellID, tonumber(slotToSetTo))
+ --log('Set spell: '..v..' ('..spellID..') at: '..slotToSetTo)
+ set_spells_from_spellset:schedule(settings.setspeed, spellset, 'add')
+ return
+ end
+ end
+ end
+ end
+ end
+
+ -- Unable to find any spells to set. Must be complete.
+ log(spellset..' has been equipped.')
+ windower.send_command('@timers c "Blue Magic Cooldown" 60 up')
+end
+
+function find_spell_id_by_name(spellname)
+ for spell in spells:it() do
+ if spell['english']:lower() == spellname:lower() then
+ return spell['id']
+ end
+ end
+ return nil
+end
+
+function set_single_spell(setspell,slot)
+ if windower.ffxi.get_player()['main_job_id'] ~= 16 --[[and windower.ffxi.get_player()['sub_job_id'] ~= 16]] then return nil end
+
+ local tmpTable = T(get_current_spellset())
+ for key,val in pairs(tmpTable) do
+ if tmpTable[key]:lower() == setspell then
+ error('That spell is already set.')
+ return
+ end
+ end
+ if tonumber(slot) < 10 then slot = '0'..slot end
+ --insert spell add code here
+ for spell in spells:it() do
+ if spell['english']:lower() == setspell then
+ --This is where single spell setting code goes.
+ --Need to set by spell id rather than name.
+ windower.ffxi.set_blue_magic_spell(spell['id'], tonumber(slot))
+ windower.send_command('@timers c "Blue Magic Cooldown" 60 up')
+ tmpTable['slot'..slot] = setspell
+ end
+ end
+ tmpTable = nil
+end
+
+function get_current_spellset()
+ if windower.ffxi.get_player().main_job_id ~= 16 then return nil end
+ return T(windower.ffxi.get_mjob_data().spells)
+ -- Returns all values but 512
+ :filter(function(id) return id ~= 512 end)
+ -- Transforms them from IDs to lowercase English names
+ :map(function(id) return spells[id].english:lower() end)
+ -- Transform the keys from numeric x or xx to string 'slot0x' or 'slotxx'
+ :key_map(function(slot) return 'slot%02u':format(slot) end)
+end
+
+function remove_all_spells(trigger)
+ windower.ffxi.reset_blue_magic_spells()
+ notice('All spells removed.')
+end
+
+function save_set(setname)
+ if setname == 'default' then
+ error('Please choose a name other than default.')
+ return
+ end
+ local curSpells = T(get_current_spellset())
+ settings.spellsets[setname] = curSpells
+ settings:save('all')
+ notice('Set '..setname..' saved.')
+end
+
+function delete_set(setname)
+ if settings.spellsets[setname] == nil then
+ error('Please choose an existing spellset.')
+ return
+ end
+ settings.spellsets[setname] = nil
+ settings:save('all')
+ notice('Deleted '..setname..'.')
+end
+
+function get_spellset_list()
+ log("Listing sets:")
+ for key,_ in pairs(settings.spellsets) do
+ if key ~= 'default' then
+ local it = 0
+ for i = 1, #settings.spellsets[key] do
+ it = it + 1
+ end
+ log("\t"..key..' '..settings.spellsets[key]:length()..' spells.')
+ end
+ end
+end
+
+function get_spellset_content(spellset)
+ log('Getting '..spellset..'\'s spell list:')
+ settings.spellsets[spellset]:print()
+end
+
+windower.register_event('addon command', function(...)
+ if windower.ffxi.get_player()['main_job_id'] ~= 16 --[[and windower.ffxi.get_player()['sub_job_id'] ~= 16]] then
+ error('You are not on (main) Blue Mage.')
+ return nil
+ end
+ local args = T{...}
+ if args ~= nil then
+ local comm = table.remove(args,1):lower()
+ if comm == 'removeall' then
+ remove_all_spells('trigger')
+ elseif comm == 'add' then
+ if args[2] ~= nil then
+ local slot = table.remove(args,1)
+ local spell = args:sconcat()
+ set_single_spell(spell:lower(),slot)
+ end
+ elseif comm == 'save' then
+ if args[1] ~= nil then
+ save_set(args[1])
+ end
+ elseif comm == 'delete' then
+ if args[1] ~= nil then
+ delete_set(args[1])
+ end
+ elseif comm == 'spellset' or comm == 'set' then
+ if args[1] ~= nil then
+ set_spells(args[1], args[2] or settings.setmode)
+ end
+ elseif comm == 'currentlist' then
+ get_current_spellset():print()
+ elseif comm == 'setlist' then
+ get_spellset_list()
+ elseif comm == 'spelllist' then
+ if args[1] ~= nil then
+ get_spellset_content(args[1])
+ end
+ elseif comm == 'help' then
+ local helptext = [[AzureSets - Command List:')
+ 1. removeall - Unsets all spells.
+ 2. spellset <setname> [ClearFirst|PreserveTraits] -- Set (setname)'s spells,
+ optional parameter: ClearFirst or PreserveTraits: overrides
+ setting to clear spells first or remove individually,
+ preserving traits where possible. Default: use settings or
+ preservetraits if settings not configured.
+ 3. set <setname> (clearfirst|preservetraits) -- Same as spellset
+ 4. add <slot> <spell> -- Set (spell) to slot (slot (number)).
+ 5. save <setname> -- Saves current spellset as (setname).
+ 6. delete <setname> -- Delete (setname) spellset.
+ 7. currentlist -- Lists currently set spells.
+ 8. setlist -- Lists all spellsets.
+ 9. spelllist <setname> -- List spells in (setname)
+ 10. help --Shows this menu.]]
+ for _, line in ipairs(helptext:split('\n')) do
+ windower.add_to_chat(207, line..chat.controls.reset)
+ end
+ end
+ end
+end)