------------------------------------------------------------------------------------------------------------------- -- Setup functions for this job. Generally should not be modified. ------------------------------------------------------------------------------------------------------------------- -- Initialization function for this job file. function get_sets() include('organizer-lib') mote_include_version = 2 -- Load and initialize the include file. include('Mote-Include.lua') send_command('wait 1;input /lockstyleset 3') end -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked. function job_setup() indi_timer = '' indi_duration = 269 end ------------------------------------------------------------------------------------------------------------------- -- User setup functions for this job. Recommend that these be overridden in a sidecar file. ------------------------------------------------------------------------------------------------------------------- -- Setup vars that are user-dependent. Can override this function in a sidecar file. function user_setup() state.OffenseMode:options('None', 'Normal','Accuracy') state.CastingMode:options('Normal', 'Resistant') state.IdleMode:options('Normal', 'PDT', 'Craft') lowTierNukes = S{'Stone', 'Water', 'Aero', 'Fire', 'Blizzard', 'Thunder', 'Stone II', 'Water II', 'Aero II', 'Fire II', 'Blizzard II', 'Thunder II', 'Stone III', 'Water III', 'Aero III', 'Fire III', 'Blizzard III', 'Thunder III', 'Stonega', 'Waterga', 'Aeroga', 'Firaga', 'Blizzaga', 'Thundaga', 'Stonega II', 'Waterga II', 'Aeroga II', 'Firaga II', 'Blizzaga II', 'Thundaga II', 'Stonera', 'Thundara', 'Fira', 'Blizzara', 'Aerora', 'Watera'} highTierNukes = S{'Stone IV', 'Water IV', 'Aero IV', 'Fire IV', 'Blizzard IV', 'Thunder IV', 'Stone V', 'Water V', 'Aero V', 'Fire V', 'Blizzard V', 'Thunder V', 'Stonera II', 'Thundara II', 'Fira II', 'Blizzara II', 'Aerora II', 'Watera II'} gear.default.weaponskill_waist = "Fotia Belt" gear.default.obi_waist = "yamabuki-no-obi" gear.default.obi_back = "seshaw Cape" gear.default.obi_ring = "Acumen Ring" select_default_macro_book() send_command('lua l gearinfo') end -- function indi_change(itable,gain) -- if not gain then -- send_command('gh indi') -- end -- end -- Define sets and vars used by this job file. function init_gear_sets() -------------------------------------- -- Precast sets -------------------------------------- -- Precast sets to enhance JAs sets.precast.JA['Bolster'] = {body="Bagua Tunic +3"} sets.precast.JA['Life cycle'] = {body="Geomancy Tunic +3", back="Nantosuelta's cape"} sets.precast.JA['Curative Recantation'] = {hands="Bagua Mitaines +3"} sets.precast.JA['Mending Halation'] = {legs="Bagua Pants +3"} sets.precast.JA['Radial Arcana'] = {feet="Bagua Sandals +3"} sets.precast.JA['Primal Zeal'] = {head="Bagua galero +3"} sets.precast.JA['Cardinal Chant'] = {head="Geomancy galero"} sets.precast.JA['Full Circle'] = {head="Azimuth hood +2"} -- Fast cast sets for spells sets.precast.FC = { head={ name="Amalric Coif +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}}, body="Shango Robe", hands={ name="Bagua Mitaines +3", augments={'Enhances "Curative Recantation" effect',}}, legs="Geomancy Pants +3", feet="Regal Pumps +1", neck="Baetyl Pendant", waist={ name="Shinjutsu-no-Obi +1", augments={'Path: A',}}, left_ear="Etiolation Earring", right_ear="Malignance Earring", left_ring="Kishar Ring", right_ring="Medada's Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Fast Cast"+10',}}} sets.precast.FC.Cure = set_combine(sets.precast.FC) sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC) sets.precast.FC['Elemental Magic'] = set_combine(sets.precast.FC) sets.precast.FC.Impact = set_combine(sets.precast.FC, {head=empty,body="Twilight Cloak"}) -- Weaponskill sets -- Default set for any weaponskill that isn't any more specifically defined sets.precast.WS = {head="Azimuth Hood +2", body={ name="Bagua Tunic +3", augments={'Enhances "Bolster" effect',}}, hands={ name="Bagua Mitaines +3", augments={'Enhances "Curative Recantation" effect',}}, legs={ name="Bagua Pants +3", augments={'Enhances "Mending Halation" effect',}}, feet={ name="Bagua Sandals +3", augments={'Enhances "Radial Arcana" effect',}}, neck="Fotia Gorget", waist="Fotia Belt", left_ear="Ishvara Earring", right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}}, left_ring="Hetairoi Ring", right_ring="Petrov Ring", back="Moonbeam Cape"} -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found. sets.precast.WS['Hexa Strike'] = {} sets.precast.WS['Realmrazer'] = {} sets.precast.WS['Flash Nova'] = {} sets.precast.WS['Black Halo'] = {} sets.precast.WS['Exudation'] = {} sets.precast.WS['Starlight'] = {ear2="Moonshade Earring"} sets.precast.WS['Moonlight'] = {ear2="Moonshade Earring"} -------------------------------------- -- Midcast sets -------------------------------------- -- Base fast recast for spells sets.midcast.FastRecast = {} sets.midcast.Phalanx = {main={ name="Gada", augments={'"Fast Cast"+5','VIT+1','"Mag.Atk.Bns."+20','DMG:+5',}}, sub="Ammurapi Shield", range="Dunna", head="Befouled Crown", body={ name="Telchine Chas.", augments={'Pet: "Regen"+2','Pet: Damage taken -1%',}}, feet="Regal Pumps +1", neck="Incanter's Torque", waist="Olympus Sash", left_ear="Andoaa Earring", right_ear="Mimir Earring", back="Perimede Cape",} sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {head="Amalric Coif +1"}) sets.midcast.Aquaveil = set_combine(sets.midcast['Enhancing Magic'], {head="Amalric Coif +1", waist="Witful belt"}) sets.midcast.Geomancy = {main="Idris", sub="Genmei Shield", range="Dunna", head="Azimuth Hood +2", body={ name="Bagua Tunic +3", augments={'Enhances "Bolster" effect',}}, hands="Geo. Mitaines +3", legs={ name="Bagua Pants +3", augments={'Enhances "Mending Halation" effect',}}, feet="Azimuth Gaiters +2", neck="Incanter's Torque", waist={ name="Shinjutsu-no-Obi +1", augments={'Path: A',}}, left_ear="Mendi. Earring", right_ear="Magnetic Earring", left_ring={ name="Mephitas's Ring +1", augments={'Path: A',}}, right_ring="Stikini Ring +1", back={ name="Lifestream Cape", augments={'Geomancy Skill +6','Indi. eff. dur. +20','Pet: Damage taken -3%',}}} sets.midcast.Geomancy.Indi = set_combine(sets.midcast.Geomancy,{legs="Bagua Pants +3",feet="Azimuth gaiters +1"}) sets.midcast.Cure = {main="Daybreak", sub="Genmei Shield", range="Dunna", head={ name="Vanya Hood", augments={'MP+50','"Fast Cast"+10','Haste+2%',}}, body="Azimuth Coat +2", hands={ name="Telchine Gloves", augments={'Pet: "Regen"+3','Pet: Damage taken -4%',}}, legs="Geomancy Pants +3", feet={ name="Vanya Clogs", augments={'Healing magic skill +20','"Cure" spellcasting time -7%','Magic dmg. taken -3',}}, neck="Incanter's Torque", waist="Luminary Sash", left_ear="Meili Earring", right_ear="Regal Earring", left_ring={ name="Mephitas's Ring +1", augments={'Path: A',}}, right_ring="Naji's Loop", back="Perimede Cape"} sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic']) sets.midcast.Curaga = sets.midcast.Cure sets.midcast.Protectra = {ring1="Sheltered Ring"} sets.midcast.Shellra = {ring1="Sheltered Ring"} -- Custom Spell Classes sets.midcast['Enfeebling Magic'] = {main={ name="Gada", augments={'"Fast Cast"+5','VIT+1','"Mag.Atk.Bns."+20','DMG:+5',}}, sub="Ammurapi Shield", range="Dunna", head="Azimuth Hood +2", body="Azimuth Coat +2", hands="Geo. Mitaines +3", legs="Geomancy Pants +3", feet={ name="Bagua Sandals +3", augments={'Enhances "Radial Arcana" effect',}}, neck="Incanter's Torque", waist="Luminary Sash", left_ear="Vor Earring", right_ear="Malignance Earring", left_ring="Stikini Ring +1", right_ring="Medada's Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Fast Cast"+10',}}} sets.midcast.ElementalEnfeeble = sets.midcast['Enfeebling Magic'] sets.midcast['Dark Magic'] = {main="Idris", sub="Ammurapi Shield", range="Dunna", head="Azimuth Hood +2", body="Geomancy Tunic +3", hands="Geo. Mitaines +3", legs="Geomancy Pants +3", feet="Azimuth Gaiters +2", neck="Incanter's Torque", waist="Luminary Sash", left_ear="Regal Earring", right_ear="Malignance Earring", left_ring="Stikini Ring +1", right_ring="Medada's Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Fast Cast"+10',}}} sets.midcast.Drain = {main="Idris", sub="Ammurapi Shield", range="Dunna", head={ name="Bagua Galero +3", augments={'Enhances "Primeval Zeal" effect',}}, body="Geomancy Tunic +3", hands="Geo. Mitaines +3", legs="Geomancy Pants +3", feet="Azimuth Gaiters +2", neck="Incanter's Torque", waist="Fucho-no-Obi", left_ear="Regal Earring", right_ear="Malignance Earring", left_ring="Stikini Ring +1", right_ring="Evanescence Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Fast Cast"+10',}}} sets.midcast.Aspir = sets.midcast.Drain sets.midcast.Stun = {main="Idris", sub="Ammurapi Shield", range="Dunna", head="Azimuth Hood +2", body="Geomancy Tunic +3", hands="Geo. Mitaines +3", legs="Geomancy Pants +3", feet="Azimuth Gaiters +2", neck="Incanter's Torque", waist="Luminary Sash", left_ear="Regal Earring", right_ear="Malignance Earring", left_ring="Stikini Ring +1", right_ring="Medada's Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Fast Cast"+10',}} } sets.midcast.Bolster = {body="Bagua Tunic +3"} sets.midcast['Life Cycle'] = {body="Geomancy Tunic +3"} sets.midcast['Mending Halation'] = {legs="Bagua Pants +3"} sets.midcast['Radial Arcana'] = {feet="Bagua Sandals +3"} sets.midcast.Bolster.Pet = {body="Bagua Tunic +3"} sets.midcast['Life Cycle'].Pet = {body="Geomancy Tunic +3"} sets.midcast['Mending Halation'].Pet = {legs="Bagua Pants +3"} sets.midcast.Bolster.Pet.Indi = {body="Bagua Tunic +3"} sets.midcast['Life Cycle'].Pet.Indi = {body="Geomancy Tunic +3"} sets.midcast['Mending Halation'].Pet.Indi = {legs="Bagua Pants +3"} -- Elemental Magic sets sets.midcast['Elemental Magic'] = { main="Daybreak", sub="Ammurapi Shield", ammo="Pemphredo Tathlum", head={ name="Bagua Galero +3", augments={'Enhances "Primeval Zeal" effect',}}, body={ name="Bagua Tunic +3", augments={'Enhances "Bolster" effect',}}, hands={ name="Bagua Mitaines +3", augments={'Enhances "Curative Recantation" effect',}}, legs="Geomancy Pants +3", feet={ name="Bagua Sandals +3", augments={'Enhances "Radial Arcana" effect',}}, neck="Baetyl Pendant", waist="Eschan Stone", left_ear="Malignance Earring", right_ear="Regal Earring", left_ring="Metamor. Ring +1", right_ring="Metamor. Ring +1", back={ name="Nantosuelta's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','Magic Damage +10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}}} sets.midcast['Elemental Magic'].Resistant = {} sets.midcast['Elemental Magic'].highTierNukes = set_combine(sets.midcast['Elemental Magic']) sets.midcast.Impact = {main="Daybreak", sub="Ammurapi Shield", ammo="Pemphredo Tathlum", head=empty, body="Twilight Cloak", hands={ name="Bagua Mitaines +3", augments={'Enhances "Curative Recantation" effect',}}, legs="Geomancy Pants +3", feet={ name="Bagua Sandals +3", augments={'Enhances "Radial Arcana" effect',}}, neck="Baetyl Pendant", waist="Eschan Stone", left_ear="Malignance Earring", right_ear="Regal Earring", left_ring="Metamor. Ring +1", right_ring="Metamor. Ring +1", back={ name="Nantosuelta's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','Magic Damage +10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}}} -------------------------------------- -- Idle/resting/defense/etc sets -------------------------------------- -- Resting sets sets.resting = {} -- Idle sets sets.idle = {main="Idris", sub="Genmei Shield", range="Dunna", head="Azimuth Hood +2", body="Azimuth Coat +2", hands="Bagua Mitaines +3", legs="Assid. Pants +1", feet="Geo. Sandals +3", neck="Loricate Torque +1", waist="Plat. Mog. Belt", left_ear="Etiolation Earring", right_ear="Genmei Earring", left_ring="Gelatinous Ring +1", right_ring="Defending Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Pet: "Regen"+10','Pet: Damage taken -5%',}}} sets.idle.PDT = {main="Idris", sub="Genmei Shield", range="Dunna", head="Azimuth Hood +2", body="Geomancy Tunic +3", hands={ name="Bagua Mitaines +3", augments={'Enhances "Curative Recantation" effect',}}, legs="Assid. Pants +1", feet="Geo. Sandals +3", neck="Loricate Torque +1", waist="Plat. Mog. Belt", left_ear="Etiolation Earring", right_ear="Genmei Earring", left_ring="Gelatinous Ring +1", right_ring="Defending Ring", back="Moonbeam Cape"} sets.idle.Craft = {head="Protective Specs.", body="Boneworker's Apn.", hands={ name="Bagua Mitaines +3", augments={'Enhances "Curative Recantation" effect',}}, legs="Assid. Pants +1", feet="Geo. Sandals +3", neck="Bone. Torque", waist="Plat. Mog. Belt", left_ear="Etiolation Earring", right_ear="Genmei Earring", left_ring="Orvail Ring", back="Moonbeam Cape",} -- .Pet sets are for when Luopan is present. sets.idle.Pet = set_combine(sets.Idle, { main="Idris", sub="Genmei Shield", range="Dunna", head={ name="Telchine Cap", augments={'Pet: "Regen"+2','Pet: Damage taken -4%',}}, body="Geomancy Tunic +3", hands="Geo. Mitaines +3", legs={ name="Telchine Braconi", augments={'Pet: "Regen"+2','Pet: Damage taken -1%',}}, feet={ name="Bagua Sandals +3", augments={'Enhances "Radial Arcana" effect',}}, neck="Loricate Torque +1", waist={ name="Shinjutsu-no-Obi +1", augments={'Path: A',}}, left_ear="Etiolation Earring", right_ear="Handler's Earring +1", left_ring="Defending Ring", right_ring="Stikini Ring +1", back={ name="Nantosuelta's Cape", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Pet: "Regen"+10',}}}) sets.idle.PDT.Pet = {main="Idris", sub="Genmei Shield", range="Dunna", head="Azimuth Hood +2", body="Geomancy Tunic +3", hands="Geo. Mitaines +3", legs={ name="Bagua Pants +3", augments={'Enhances "Mending Halation" effect',}}, feet={ name="Bagua Sandals +3", augments={'Enhances "Radial Arcana" effect',}}, neck="Loricate Torque +1", waist="Plat. Mog. Belt", left_ear="Etiolation Earring", right_ear="Handler's Earring +1", left_ring="Stikini Ring +1", right_ring="Defending Ring", back={ name="Nantosuelta's Cape", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Pet: "Regen"+10','Pet: Damage taken -5%',}}} -- .Indi sets are for when an Indi-spell is active. sets.idle.Indi = set_combine(sets.idle, {}) sets.idle.Pet.Indi = set_combine(sets.idle.Pet, {}) sets.idle.PDT.Indi = set_combine(sets.idle.PDT, {}) sets.idle.PDT.Pet.Indi = set_combine(sets.idle.PDT.Pet, {}) sets.idle.Town = sets.idle sets.idle.Weak = sets.idle -- Defense sets sets.defense.PDT = {} sets.defense.MDT = {} sets.Kiting = {feet="Geomancy Sandals +3"} sets.latent_refresh = {waist="Fucho-no-obi"} sets.magic_burst = {} -------------------------------------- -- Engaged sets -------------------------------------- -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous -- sets if more refined versions aren't defined. -- If you create a set with both offense and defense modes, the offense mode should be first. -- EG: sets.engaged.Dagger.Accuracy.Evasion -- Normal melee group sets.engaged = {} sets.engaged.Accuracy = {} -------------------------------------- -- Custom buff sets -------------------------------------- end ------------------------------------------------------------------------------------------------------------------- -- Job-specific hooks for standard casting events. ------------------------------------------------------------------------------------------------------------------- -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done. function job_precast(spell, action, spellMap, eventArgs) if spellMap == 'Cure' or spellMap == 'Curaga' then gear.default.obi_waist = "yamabuki-no-obi" elseif spell.skill == 'Elemental Magic' then gear.default.obi_waist = "yamabuki-no-obi" if state.CastingMode.value == 'Proc' then classes.CustomClass = 'Proc' end end end function sub_job_change() send_command('wait 7;input /lockstyleset 3') end function job_midcast(spell, action, spellMap, eventArgs) if spell.action_type == 'Magic' then -- Default base equipment layer of fast recast. equip(sets.midcast.FastRecast) end end -- Custom spell mapping. function job_get_spell_map(spell, default_spell_map) if spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then if lowTierNukes:contains(spell.english) then return 'lowTierNukes' else return 'highTierNukes' end end end -- Run after the general midcast() is done. function job_post_midcast(spell, action, spellMap, eventArgs) end function job_aftercast(spell, action, spellMap, eventArgs) if not spell.interrupted then if spell.english:startswith('Indi') then if not classes.CustomIdleGroups:contains('Indi') then classes.CustomIdleGroups:append('Indi') end send_command('@timers d "'..indi_timer..'"') indi_timer = spell.english send_command('@timers c "'..indi_timer..'" '..indi_duration..' down spells/00136.png') elseif spell.english == 'Sleep' or spell.english == 'Sleepga' then send_command('@timers c "'..spell.english..' ['..spell.target.name..']" 60 down spells/00220.png') elseif spell.english == 'Sleep II' or spell.english == 'Sleepga II' then send_command('@timers c "'..spell.english..' ['..spell.target.name..']" 90 down spells/00220.png') end elseif not player.indi then classes.CustomIdleGroups:clear() end end ------------------------------------------------------------------------------------------------------------------- -- Job-specific hooks for non-casting events. ------------------------------------------------------------------------------------------------------------------- -- Called when a player gains or loses a buff. -- buff == buff gained or lost -- gain == true if the buff was gained, false if it was lost. function job_buff_change(buff, gain) if player.indi and not classes.CustomIdleGroups:contains('Indi')then classes.CustomIdleGroups:append('Indi') handle_equipping_gear(player.status) elseif classes.CustomIdleGroups:contains('Indi') and not player.indi then classes.CustomIdleGroups:clear() handle_equipping_gear(player.status) end end function job_state_change(stateField, newValue, oldValue) if stateField == 'Offense Mode' then if newValue == 'Accuracy' then disable('main','sub','range') else enable('main','sub','range') end end end ------------------------------------------------------------------------------------------------------------------- -- User code that supplements standard library decisions. ------------------------------------------------------------------------------------------------------------------- function job_get_spell_map(spell, default_spell_map) if spell.action_type == 'Magic' then if spell.skill == 'Enfeebling Magic' then if spell.type == 'WhiteMagic' then return 'MndEnfeebles' else return 'IntEnfeebles' end elseif spell.skill == 'Geomancy' then if spell.english:startswith('Indi') then return 'Indi' end end end end function customize_idle_set(idleSet) if player.mpp < 51 then idleSet = set_combine(idleSet, sets.latent_refresh) end return idleSet end -- Called by the 'update' self-command. function job_update(cmdParams, eventArgs) classes.CustomIdleGroups:clear() if player.indi then classes.CustomIdleGroups:append('Indi') end end -- Function to display the current relevant user state when doing an update. function display_current_job_state(eventArgs) display_current_caster_state() eventArgs.handled = true end function open_coffer() CofferType = "Velkk Coffer" NCoffer = player.inventory[CofferType].count bag = windower.ffxi.get_bag_info(0).count max = windower.ffxi.get_bag_info(0).max spots = max-bag if spots > 0 then add_to_chat(204, '*-*-*-*-*-*-*-*-* [ '..NCoffer..'x '..CofferType..' to open - Inventory('..bag..'/'..max..') ] *-*-*-*-*-*-*-*-*') local nextcommand = "" for i=1, spots do nextcommand = nextcommand .. 'input /item "'..CofferType..'" ; wait 2;' end nextcommand = nextcommand .. 'input //gs c "open"' send_command(nextcommand) else add_to_chat(204, '*-*-*-*-*-*-*-*-* [ Inventory('..bag..'/'..max..') ] *-*-*-*-*-*-*-*-*') end end function self_command(command) if command == 'open' then open_coffer() end end ------------------------------------------------------------------------------------------------------------------- -- Utility functions specific to this job. ------------------------------------------------------------------------------------------------------------------- -- Select default macro book on initial load or subjob change. function select_default_macro_book() set_macro_page(1, 4) end function gearinfo(cmdParams, eventArgs) if cmdParams[1] == 'gearinfo' then if type(cmdParams[4]) == 'string' then if cmdParams[4] == 'true' then moving = true elseif cmdParams[4] == 'false' then moving = false end end if not midaction() then job_update() end end end function check_moving() if state.DefenseMode.value == 'None' and state.Kiting.value == false then if state.Auto_Kite.value == false and moving then state.Auto_Kite:set(true) elseif state.Auto_Kite.value == true and moving == false then state.Auto_Kite:set(false) end end end function check_gear() if no_swap_gear:contains(player.equipment.left_ring) then disable("left_ring") else enable("left_ring") end if no_swap_gear:contains(player.equipment.right_ring) then disable("right_ring") else enable("right_ring") end end