Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -------------------------------------------------------------------------------------------------------------------
- -- Setup functions for this job. Generally should not be modified.
- -------------------------------------------------------------------------------------------------------------------
- -- Also, you'll need the Shortcuts addon to handle the auto-targetting of the custom pact commands.
- --[[
- Custom commands:
- gs c petweather
- Automatically casts the storm appropriate for the current avatar, if possible.
- gs c siphon
- Automatically run the process to: dismiss the current avatar; cast appropriate
- weather; summon the appropriate spirit; Elemental Siphon; release the spirit;
- and re-summon the avatar.
- Will not cast weather you do not have access to.
- Will not re-summon the avatar if one was not out in the first place.
- Will not release the spirit if it was out before the command was issued.
- gs c pact [PactType]
- Attempts to use the indicated pact type for the current avatar.
- PactType can be one of:
- cure
- curaga
- buffOffense
- buffDefense
- buffSpecial
- debuff1
- debuff2
- sleep
- nuke2
- nuke4
- bp70
- bp75 (merits and lvl 75-80 pacts)
- astralflow
- --]]
- -- Initialization function for this job file.
- function get_sets()
- Campestres = {}
- Campestres.FC = { name="Campestres's Cape", augments={'Pet: M.Acc.+20 Pet: M.Dmg.+20','Eva.+20 /Mag. Eva.+20','Pet: Magic Damage+10','"Fast Cast"+10',}}
- Campestres.TP = { name="Campestres's Cape", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Eva.+20 /Mag. Eva.+20','Pet: Accuracy+10 Pet: Rng. Acc.+10','Pet: Haste+10',}}
- MerlinicHands = {}
- MerlinicHands.Phys = { name="Merlinic Dastanas", augments={'Pet: Attack+13 Pet: Rng.Atk.+13','Blood Pact Dmg.+9','Pet: INT+7','Pet: Mag. Acc.+5','Pet: "Mag.Atk.Bns."+6',}}
- MerlinicHands.Mag = { name="Merlinic Dastanas", augments={'Pet: "Mag.Atk.Bns."+25','Blood Pact Dmg.+2','Pet: Mag. Acc.+7',}}
- mote_include_version = 2
- -- Load and initialize the include file.
- include('Mote-Include.lua')
- end
- -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
- function job_setup()
- state.Buff["Avatar's Favor"] = buffactive["Avatar's Favor"] or false
- state.Buff["Astral Conduit"] = buffactive["Astral Conduit"] or false
- spirits = S{"LightSpirit", "DarkSpirit", "FireSpirit", "EarthSpirit", "WaterSpirit", "AirSpirit", "IceSpirit", "ThunderSpirit"}
- avatars = S{"Carbuncle", "Fenrir", "Diabolos", "Ifrit", "Titan", "Leviathan", "Garuda", "Shiva", "Ramuh", "Odin", "Alexander", "Cait Sith"}
- magicalRagePacts = S{
- 'Inferno','Earthen Fury','Tidal Wave','Aerial Blast','Diamond Dust','Judgment Bolt','Searing Light','Howling Moon','Ruinous Omen',
- 'Fire II','Stone II','Water II','Aero II','Blizzard II','Thunder II',
- 'Fire IV','Stone IV','Water IV','Aero IV','Blizzard IV','Thunder IV',
- 'Thunderspark','Meteorite','Nether Blast',
- 'Holy Mist','Lunar Bay','Night Terror','Level ? Holy'}
- hybridPacts = S{
- 'Burning Strike','Flaming Crush',
- }
- enticersRagePacts = S{
- 'Impact','Heavenly Strike','Wind Blade','Geocrush','Thunderstorm','Meteor Strike','Grand Fall'
- }
- enticersWardPacts = S{
- 'Healing Ruby II','Whispering Wind','Healing Ruby','Spring Water'
- }
- pacts = {}
- pacts.cure = {['Carbuncle']='Healing Ruby'}
- pacts.curaga = {['Carbuncle']='Healing Ruby II', ['Garuda']='Whispering Wind', ['Leviathan']='Spring Water'}
- pacts.buffoffense = {['Carbuncle']='Glittering Ruby', ['Ifrit']='Crimson Howl', ['Garuda']='Hastega', ['Ramuh']='Rolling Thunder',
- ['Fenrir']='Ecliptic Growl'}
- pacts.buffdefense = {['Carbuncle']='Shining Ruby', ['Shiva']='Frost Armor', ['Garuda']='Aerial Armor', ['Titan']='Earthen Ward',
- ['Ramuh']='Lightning Armor', ['Fenrir']='Ecliptic Howl', ['Diabolos']='Noctoshield', ['Cait Sith']='Reraise II'}
- pacts.buffspecial = {['Ifrit']='Inferno Howl', ['Garuda']='Fleet Wind', ['Titan']='Earthen Armor', ['Diabolos']='Dream Shroud',
- ['Carbuncle']='Soothing Ruby', ['Fenrir']='Heavenward Howl', ['Cait Sith']='Raise II'}
- pacts.debuff1 = {['Shiva']='Diamond Storm', ['Ramuh']='Shock Squall', ['Leviathan']='Tidal Roar', ['Fenrir']='Lunar Cry',
- ['Diabolos']='Pavor Nocturnus', ['Cait Sith']='Eerie Eye'}
- pacts.debuff2 = {['Shiva']='Sleepga', ['Leviathan']='Slowga', ['Fenrir']='Lunar Roar', ['Diabolos']='Somnolence'}
- pacts.sleep = {['Shiva']='Sleepga', ['Diabolos']='Nightmare', ['Cait Sith']='Mewing Lullaby'}
- pacts.nuke2 = {['Ifrit']='Fire II', ['Shiva']='Blizzard II', ['Garuda']='Aero II', ['Titan']='Stone II',
- ['Ramuh']='Thunder II', ['Leviathan']='Water II'}
- pacts.nuke4 = {['Ifrit']='Fire IV', ['Shiva']='Blizzard IV', ['Garuda']='Aero IV', ['Titan']='Stone IV',
- ['Ramuh']='Thunder IV', ['Leviathan']='Water IV', ['Fenrir']='Impact'}
- pacts.bp70 = {['Ifrit']='Flaming Crush', ['Shiva']='Rush', ['Garuda']='Predator Claws', ['Titan']='Mountain Buster',
- ['Ramuh']='Chaotic Strike', ['Leviathan']='Spinning Dive', ['Carbuncle']='Meteorite', ['Fenrir']='Eclipse Bite',
- ['Diabolos']='Nether Blast',['Cait Sith']='Regal Scratch'}
- pacts.bp75 = {['Ifrit']='Meteor Strike', ['Shiva']='Heavenly Strike', ['Garuda']='Wind Blade', ['Titan']='Geocrush',
- ['Ramuh']='Thunderstorm', ['Leviathan']='Grand Fall', ['Carbuncle']='Holy Mist', ['Fenrir']='Lunar Bay',
- ['Diabolos']='Night Terror', ['Cait Sith']='Level ? Holy'}
- pacts.astralflow = {['Ifrit']='Inferno', ['Shiva']='Diamond Dust', ['Garuda']='Aerial Blast', ['Titan']='Earthen Fury',
- ['Ramuh']='Judgment Bolt', ['Leviathan']='Tidal Wave', ['Carbuncle']='Searing Light', ['Fenrir']='Howling Moon',
- ['Diabolos']='Ruinous Omen', ['Cait Sith']="Altana's Favor"}
- -- Wards table for creating custom timers
- wards = {}
- -- Base duration for ward pacts.
- wards.durations = {
- ['Crimson Howl'] = 60, ['Earthen Armor'] = 60, ['Inferno Howl'] = 60, ['Heavenward Howl'] = 60,
- ['Rolling Thunder'] = 120, ['Fleet Wind'] = 120,
- ['Shining Ruby'] = 180, ['Frost Armor'] = 180, ['Lightning Armor'] = 180, ['Ecliptic Growl'] = 180,
- ['Glittering Ruby'] = 180, ['Hastega'] = 180, ['Noctoshield'] = 180, ['Ecliptic Howl'] = 180,
- ['Dream Shroud'] = 180,
- ['Reraise II'] = 3600
- }
- -- Icons to use when creating the custom timer.
- wards.icons = {
- ['Earthen Armor'] = 'spells/00299.png', -- 00299 for Titan
- ['Shining Ruby'] = 'spells/00043.png', -- 00043 for Protect
- ['Dream Shroud'] = 'spells/00304.png', -- 00304 for Diabolos
- ['Noctoshield'] = 'spells/00106.png', -- 00106 for Phalanx
- ['Inferno Howl'] = 'spells/00298.png', -- 00298 for Ifrit
- ['Hastega'] = 'spells/00358.png', -- 00358 for Hastega
- ['Rolling Thunder'] = 'spells/00104.png', -- 00358 for Enthunder
- ['Frost Armor'] = 'spells/00250.png', -- 00250 for Ice Spikes
- ['Lightning Armor'] = 'spells/00251.png', -- 00251 for Shock Spikes
- ['Reraise II'] = 'spells/00135.png', -- 00135 for Reraise
- ['Fleet Wind'] = 'abilities/00074.png', --
- }
- -- Flags for code to get around the issue of slow skill updates.
- wards.flag = false
- wards.spell = ''
- 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()
- --F9 Toggles between Avatar Idle and TPing sets while engaged
- state.OffenseMode:options('Pet Priority', 'Normal')
- --Ctrl F12 Toggles Idle modes
- --NOTE: having an avatar takes priority over normal "PDT" set
- state.IdleMode:options('Normal', 'Avatar PDT', 'PDT')
- gear.perp_staff = {name="Nirvana"}
- select_default_macro_book()
- send_command('wait 2; input /lockstyleset 7')
- add_to_chat (55, 'You are on '..('SMN '):color(204)..''..('btw. '):color(55)..''..('Macros set!'):color(121))
- end
- -- Define sets and vars used by this job file.
- function init_gear_sets()
- --------------------------------------
- -- Precast Sets
- --------------------------------------
- -- Precast sets to enhance JAs
- sets.precast.JA['Astral Flow'] = {head="Glyphic Horn +1"}
- sets.precast.JA['Elemental Siphon'] = {
- main={ name="Kirin's Pole", augments={'DMG:+24','Summoning magic skill +12',}},
- sub="Vox Grip",
- ammo="Esper Stone +1",
- head="Convoker's Horn +2",
- body="Beck. Doublet +1",
- hands="Lamassu Mitts +1",
- legs="Beck. Spats +1",
- feet="Beck. Pigaches +1",
- neck="Caller's Pendant",
- right_ear="Smn. Earring",
- back="Conveyance Cape",
- waist="Summoning Belt",
- left_ring="Fervor Ring",
- right_ring="Evoker's Ring",
- }
- sets.precast.JA['Mana Cede'] = {hands="Beck. Bracers +1"}
- -- Pact delay reduction gear
- -- BP Delay per tier: max -15
- -- BP Delay Max: -(?)30 or is it 30 delay plus JP bonus?
- -- Stack skill otherwise for Favor tiers
- sets.precast.BloodPactWard = set_combine(sets.precast.JA['Elemental Siphon'], {
- -- -7 II
- ammo="Sancus Sachet +1",
- head="Beckoner's Horn +1",
- -- -2 II
- body="Glyphic Doublet +1",
- -- -6
- hands="Glyphic Bracers +1",
- -- -6
- legs="Glyphic Spats +1",
- -- Path D Apogee feet could go here for +15 skill
- -- -3
- back="Samanisi Cape",
- })
- sets.precast.BloodPactRage = set_combine(sets.precast.BloodPactWard,{})
- -- Fast cast sets for spells
- sets.precast.FC = {
- ammo="Impatiens",
- neck="Voltsurge Torque",
- ear1 = "Etiolation Earring",
- right_ear="Loquac. Earring",
- body="Vrikodara Jupon",
- ring1="Kishar Ring",
- ring2="Lebeche Ring",
- back=Campestres.FC,
- waist="Witful Belt",
- }
- sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {
- head="Umuthi Hat",
- waist="Siegel Sash"
- })
- sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {
- feet="Inspirited Boots",
- })
- -- Weaponskill sets
- -- Default set for any weaponskill that isn't any more specifically defined
- sets.precast.WS = {
- neck="Fotia Gorget",
- waist="Fotia Belt"
- }
- -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
- sets.precast.WS['Myrkr'] = {}
- -- Should focus M.ACC to stick Def down
- sets.precast.WS['Garland of Bliss'] = set_combine(sets.precast.WS, {
- main="Nirvana",
- head="Vanya Hood",
- body="Con. Doublet +2",
- hands="Glyphic Bracers +1",
- legs="Gyve Trousers",
- feet="Convo. Pigaches +2",
- neck="Fotia Gorget",
- waist="Fotia Belt",
- left_ear="Hecate's Earring",
- right_ear="Friomisi Earring",
- left_ring="Karieyh Ring",
- right_ring="Strendu Ring",
- })
- -- sets.precast.BloodPactRage = {
- -- left_ring={"Varar Ring", bag="wardrobe3"},
- -- right_ring={"Varar Ring", bag="wardrobe4"},
- -- }
- --------------------------------------
- -- Midcast sets
- --------------------------------------
- sets.midcast.FastRecast = {}
- sets.midcast.Cure = {
- head="Vanya Hood",
- body="Vrikodara Jupon",
- legs="Gyve Trousers",
- feet="Medium's Sabots",
- back="Solemnity Cape",
- neck="Colossus's Torque",
- left_ear="Gifted Earring",
- right_ear="Roundel Earring",
- ring2="Lebeche Ring",
- }
- sets.midcast.Stoneskin = {
- neck="Stone Gorget",
- ear1="Earthcry Earring",
- waist="Siegel Sash"
- }
- sets.midcast['Elemental Magic'] = {}
- sets.midcast['Dark Magic'] = {}
- -- Avatar pact sets. All pacts are Ability type.
- -- Triggers on Enhancing/Healing BPS
- sets.midcast.Pet.BloodPactWard = {
- main="Nirvana",
- sub="Vox Grip",
- ammo="Sancus Sachet +1",
- head="Convoker's Horn +2",
- body="Beck. Doublet +1",
- hands="Lamassu Mitts +1",
- legs="Beck. Spats +1",
- feet="Apogee Pumps",
- neck="Caller's Pendant",
- waist="Summoning Belt",
- left_ear="Etiolation Earring",
- right_ear="Smn. Earring",
- left_ring="Fervor Ring",
- right_ring="Evoker's Ring",
- back="Conveyance Cape",
- }
- sets.midcast.Pet.DebuffBloodPactWard = {
- main="Nirvana",
- sub="Vox Grip",
- ammo="Sancus Sachet +1",
- head="Convoker's Horn +2",
- body="Con. Doublet +2",
- hands="Lamassu Mitts +1",
- legs="Helios Spats",
- feet="Convo. Pigaches +2",
- neck="Caller's Pendant",
- waist="Incarnation Sash",
- left_ear="Enmerkar Earring",
- right_ear="Smn. Earring",
- left_ring="Tali'ah Ring",
- right_ring="Evoker's Ring",
- back="Conveyance Cape",
- }
- sets.midcast.Pet.DebuffBloodPactWard.Acc = sets.midcast.Pet.DebuffBloodPactWard
- sets.midcast.Pet.TPBloodPactWard = set_combine(sets.midcast.Pet.DebuffBloodPactWard, {
- legs="Enticer's Pants"
- })
- sets.midcast.Pet.PhysicalBloodPactRage = {
- main="Nirvana",
- sub="Elan Strap",
- ammo="Sancus Sachet +1",
- head="Convoker's Horn +2",
- body="Con. Doublet +2",
- hands=MerlinicHands.Phys,
- legs="Enticer's Pants",
- feet="Convo. Pigaches +2",
- neck="Shulmanu Collar",
- waist="Incarnation Sash",
- left_ear="Gelos Earring",
- right_ear="Esper Earring",
- back=Campestres.TP,
- left_ring="Varar Ring",
- right_ring="Varar Ring",
- -- left_ring={"Varar Ring",bag="wardrobe3",priority=2},
- -- right_ring={"Varar Ring",bag="wardrobe4",priority=1},
- }
- sets.midcast.Pet.PhysicalBloodPactRage.Acc = sets.midcast.Pet.PhysicalBloodPactRage
- --"Hybrid" BP TP bonus and Crit Hit Rate help to spike damage
- sets.midcast.Pet.HybridBloodPactRage = set_combine(sets.midcast.Pet.PhysicalBloodPactRage, {
- legs="Enticer's Pants"
- })
- sets.midcast.Pet.MagicalBloodPactRage = {
- main="Nirvana",
- sub="Elan Strap",
- ammo="Sancus Sachet +1",
- head="Glyphic Horn +1",
- body="Con. Doublet +2",
- hands=MerlinicHands.Mag,
- legs="Apogee Slacks",
- feet="Apogee Pumps",
- neck="Adad Amulet",
- waist="Incarnation Sash",
- left_ear="Gelos Earring",
- right_ear="Esper Earring",
- back=Campestres.FC,
- left_ring="Varar Ring",
- right_ring="Varar Ring",
- -- left_ring={"Varar Ring",bag="wardrobe3",priority=2},
- -- right_ring={"Varar Ring",bag="wardrobe4",priority=1},
- }
- sets.midcast.Pet.MagicalBloodPactRage.Acc = sets.midcast.Pet.MagicalBloodPactRage
- sets.midcast.Pet.TPMagicalBloodPactRage = set_combine(sets.midcast.Pet.MagicalBloodPactRage, {
- legs="Enticer's Pants"
- })
- -- Spirits cast magic spells, which can be identified in standard ways.
- sets.midcast.Pet.WhiteMagic = {legs="Glyphic Spats +1"}
- sets.midcast.Pet['Elemental Magic'] = set_combine(sets.midcast.Pet.BloodPactRage, {})
- sets.midcast.Pet['Elemental Magic'].Resistant = {}
- --------------------------------------
- -- Idle/resting/defense/etc sets
- --------------------------------------
- -- Resting sets
- sets.resting = {
- main=gear.Staff.HMP,
- head="Beckoner's Horn +1",
- body="Shomonjijoe +1",
- hands="Serpentes Cuffs",
- legs="Nares Trews",
- feet="Serpentes Sabots",
- neck="Eidolon Pendant +1",
- waist="Austerity Belt",
- left_ear="Magnetic Earring",
- right_ear="Moonshade Earring",
- }
- -- Idle sets
- sets.idle = {
- main="Nirvana",
- sub="Oneiros Grip",
- ammo="Sancus Sachet +1",
- head="Beckoner's Horn +1",
- body="Shomonjijoe +1",
- hands="Asteria Mitts +1",
- legs="Assiduity Pants +1",
- feet="Herald's Gaiters",
- neck="Sanctity Necklace",
- waist="Incarnation Sash",
- ear1="Etiolation Earring",
- ear2="Moonshade Earring",
- ring1="Defending Ring",
- ring2="Evoker's Ring",
- back=Campestres.TP,
- }
- sets.idle.PDT = {
- main="Nirvana",
- sub="Oneiros Strap",
- ammo="Staunch Tathlum",
- head="Convoker's Horn +2",
- neck="Twilight Torque",
- ear1="Etiolation Earring",
- body="Udug Jacket",
- hands="Beck. Bracers +1",
- ring1="Defending Ring",
- ring2="Gelatinous Ring +1",
- back="Solemnity Cape",
- legs="Assiduity Pants +1",
- feet="Battlecast Gaiters",
- }
- sets.idle.Avatar = {
- main="Nirvana",
- sub="Oneiros Grip",
- ammo="Sancus Sachet +1",
- head="Convoker's Horn +2",
- body="Shomonjijoe +1",
- hands="Asteria Mitts +1",
- legs="Assid. Pants +1",
- feet="Convo. Pigaches +2",
- neck="Caller's Pendant",
- waist="Incarnation Sash",
- left_ear="Enmerkar Earring",
- right_ear="Moonshade Earring",
- right_ring="Evoker's Ring",
- back=Campestres.TP,
- }
- sets.idle.PDT.Avatar = set_combine(sets.idle.Avatar, {
- ear2="Evans Earring",
- body="Udug Jacket",
- waist="Lucidity Sash"
- })
- sets.idle.Spirit = {
- main="Nirvana",
- sub="Vox Grip",
- ammo="Sancus Sachet +1",
- head="Convoker's Horn +2",
- body="Beck. Doublet +1",
- hands="Lamassu Mitts +1",
- legs="Assid. Pants +1",
- feet="Apogee Pumps",
- neck="Caller's Pendant",
- waist="Incarnation Sash",
- left_ear="Smn. Earring",
- right_ear="Moonshade Earring",
- left_ring="Fervor Ring",
- right_ring="Evoker's Ring",
- back="Conveyance Cape",
- }
- sets.idle.Town = {}
- -- Favor uses Caller's Horn instead of Convoker's Horn for refresh
- sets.idle.Avatar.Favor = {
- head="Beckoner's Horn +1",
- ear1="Smn. Earring",
- }
- sets.idle.Avatar.Melee = {
- ear1="Enmerkar Earring",
- body="Glyphic Doublet +1",
- hands="Glyphic Bracers +1",
- ring1="Varar Ring",
- waist="Incarnation Sash",
- legs="Enticer's Pants",
- feet="Tali'ah Crackows +2",
- }
- -- Caller's Bracer's halve the perp cost after other costs are accounted for.
- -- Using -10 (Gridavor, ring, Conv.feet), standard avatars would then cost 5, halved to 2.
- -- We can then use Hagondes Coat and end up with the same net MP cost, but significantly better defense.
- -- Weather is the same, but we can also use the latent on the pendant to negate the last point lost.
- -- perp costs (favor cost):
- -- spirits: 7
- -- carby/cait sith: 11(13) (5/6 with mitts)
- -- fenrir: 13(15)
- -- others: 15(18)
- -- avatar's favor: +20% cost.
- -- Max useful -perp gear is 1 less than the perp cost (can't be reduced below 1)
- -- Aim for -14 perp, and refresh in other slots.
- sets.perp = {}
- sets.perp.Day = set_combine(sets.idle.Avatar, {hands="Beck. Bracers +1"})
- sets.perp.Weather = set_combine(sets.idle.Avatar, {
- neck="Caller's Pendant",
- hands="Beck. Bracers +1"
- })
- -- Carby: Mitts+Conv.feet = 1/tick perp. Everything else should be +refresh
- sets.perp.Carbuncle = set_combine(sets.idle.Avatar, {hands="Asteria Mitts +1"})
- sets.perp['Cait Sith'] = set_combine(sets.perp.Carbuncle, {hands="Lamassu Mitts +1"})
- -- Diabolos's Rope doesn't gain us anything at this time
- --sets.perp.Diabolos = {waist="Diabolos's Rope"}
- sets.perp.Alexander = sets.midcast.Pet.BloodPactWard
- sets.perp.staff_and_grip = {main=gear.perp_staff,sub="Oneiros Grip"}
- -- Defense sets
- sets.defense = {}
- sets.defense.PDT = {
- main="Nirvana",
- sub="Oneiros Strap",
- ammo="Staunch Tathlum",
- head="Convoker's Horn +2",
- neck="Twilight Torque",
- ear1="Etiolation Earring",
- body="Udug Jacket",
- hands="Beck. Bracers +1",
- ring1="Defending Ring",
- ring2="Gelatinous Ring +1",
- back="Solemnity Cape",
- legs="Assiduity Pants +1",
- feet="Battlecast Gaiters",
- }
- sets.defense.MDT = set_combine(sets.defense.PDT, {})
- sets.Kiting = {feet="Herald's Gaiters"}
- sets.latent_refresh = {
- grip = "Oneiros Grip",
- waist="Fucho-no-obi"
- }
- --------------------------------------
- -- Engaged sets
- --------------------------------------
- -- Normal melee group
- sets.engaged['Normal'] = set_combine(sets.idle.Avatar, {
- neck="Shulmanu Collar",
- ear1="Brutal Earring",
- ring1="Petrov Ring",
- ring2="Rajas Ring",
- waist="Windbuffet Belt +1",
- feet="Tali'ah Crackows +2"
- })
- sets.engaged['Pet Priority'] = set_combine(sets.idle.Avatar, {})
- 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.
- -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
- function job_precast(spell, action, spellMap, eventArgs)
- if state.Buff['Astral Conduit'] and pet_midaction() then
- eventArgs.handled = true
- end
- end
- function job_midcast(spell, action, spellMap, eventArgs)
- if state.Buff['Astral Conduit'] and pet_midaction() then
- eventArgs.handled = true
- end
- end
- -- Runs when pet completes an action.
- function job_pet_aftercast(spell, action, spellMap, eventArgs)
- if not spell.interrupted and spell.type == 'BloodPactWard' and spellMap ~= 'DebuffBloodPactWard' then
- wards.flag = true
- wards.spell = spell.english
- send_command('wait 4; gs c reset_ward_flag')
- 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 state.Buff[buff] ~= nil then
- handle_equipping_gear(player.status)
- elseif storms:contains(buff) then
- handle_equipping_gear(player.status)
- end
- end
- -- Called when the player's pet's status changes.
- -- This is also called after pet_change after a pet is released. Check for pet validity.
- function job_pet_status_change(newStatus, oldStatus, eventArgs)
- if pet.isvalid and not midaction() and not pet_midaction() and (newStatus == 'Engaged' or oldStatus == 'Engaged') then
- handle_equipping_gear(player.status, newStatus)
- end
- end
- -- Called when a player gains or loses a pet.
- -- pet == pet structure
- -- gain == true if the pet was gained, false if it was lost.
- function job_pet_change(petparam, gain)
- classes.CustomIdleGroups:clear()
- if gain then
- if avatars:contains(pet.name) then
- classes.CustomIdleGroups:append('Avatar')
- elseif spirits:contains(pet.name) then
- classes.CustomIdleGroups:append('Spirit')
- end
- else
- select_default_macro_book('reset')
- end
- end
- --Way to track Pet TP from source:
- --https://www.ffxiah.com/forum/topic/47688/summoner-gearswap-yep-another-one-p/2/
- pet_tp = 0
- --Fix missing Pet.TP field by getting the packets from the fields lib
- packets = require('packets')
- function update_pet_tp(id,data)
- if id == 0x068 then
- pet_tp = 0
- local update = packets.parse('incoming', data)
- pet_tp = update["Pet TP"]
- windower.send_command('lua c gearswap c pet_tp '..pet_tp)
- end
- end
- id = windower.raw_register_event('incoming chunk', update_pet_tp)
- --Locks Main/sub/range/ammo to keep Aftermath or building TP towards Aftermath
- function job_precast(spell, action, spellMap, eventArgs)
- if spell.type == 'BloodPact' then
- enable('main', 'sub', 'range', 'ammo')
- elseif buffactive["Aftermath: Lv.1"] or buffactive["Aftermath: Lv.2"] or buffactive["Aftermath: Lv.3"] or player.tp > 1000 then
- disable('main', 'sub', 'range', 'ammo')
- elseif not buffactive["Aftermath: Lv.1"] or buffactive["Aftermath: Lv.2"]or buffactive["Aftermath: Lv.3"] and player.tp < 1000 then
- enable('main', 'sub', 'range', 'ammo')
- else
- enable('main', 'sub', 'range', 'ammo')
- end
- end
- -------------------------------------------------------------------------------------------------------------------
- -- User code that supplements standard library decisions.
- -------------------------------------------------------------------------------------------------------------------
- -- Custom spell mapping.
- function job_get_spell_map(spell)
- if spell.type == 'BloodPactRage' then
- if enticersRagePacts:contains(spell.english) and spell.english ~= 'Impact' and pet_tp > 1400 then
- equip({left_ring=empty})
- equip({right_ring=empty})
- return 'MagicalBloodPactRage'
- elseif enticersRagePacts:contains(spell.english) then
- equip({left_ring=empty})
- equip({right_ring=empty})
- return 'TPMagicalBloodPactRage'
- elseif hybridPacts:contains(spell.english) then
- equip({left_ring=empty})
- equip({right_ring=empty})
- return 'HybridBloodPactRage'
- elseif magicalRagePacts:contains(spell.english) then
- equip({left_ring=empty})
- equip({right_ring=empty})
- return 'MagicalBloodPactRage'
- else
- equip({left_ring=empty})
- equip({right_ring=empty})
- return 'PhysicalBloodPactRage'
- end
- elseif spell.type == 'BloodPactWard' and spell.target.type == 'MONSTER' then
- return 'DebuffBloodPactWard'
- elseif spell.type=='BloodPactWard' and enticersWardPacts:contains(spell.english) then
- return 'TPBloodPactWard'
- end
- end
- -- Modify the default idle set after it was constructed.
- function customize_idle_set(idleSet)
- if pet.isvalid then
- if pet.element == world.day_element then
- idleSet = set_combine(idleSet, sets.perp.Day)
- end
- if pet.element == world.weather_element then
- idleSet = set_combine(idleSet, sets.perp.Weather)
- end
- if sets.perp[pet.name] then
- idleSet = set_combine(idleSet, sets.perp[pet.name])
- end
- gear.perp_staff.name = elements.perpetuance_staff_of[pet.element]
- if gear.perp_staff.name and (player.inventory[gear.perp_staff.name] or player.wardrobe[gear.perp_staff.name]) then
- idleSet = set_combine(idleSet, sets.perp.staff_and_grip)
- end
- if state.Buff["Avatar's Favor"] and avatars:contains(pet.name) then
- idleSet = set_combine(idleSet, sets.idle.Avatar.Favor)
- end
- if pet.status == 'Engaged' then
- idleSet = set_combine(idleSet, sets.idle.Avatar.Melee)
- end
- end
- if player.mpp < 51 then
- idleSet = set_combine(idleSet, sets.latent_refresh)
- end
- return idleSet
- end
- -- Called by the 'update' self-command, for common needs.
- -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
- function job_update(cmdParams, eventArgs)
- classes.CustomIdleGroups:clear()
- if pet.isvalid then
- if avatars:contains(pet.name) then
- classes.CustomIdleGroups:append('Avatar')
- elseif spirits:contains(pet.name) then
- classes.CustomIdleGroups:append('Spirit')
- end
- end
- end
- -- Set eventArgs.handled to true if we don't want the automatic display to be run.
- function display_current_job_state(eventArgs)
- end
- -------------------------------------------------------------------------------------------------------------------
- -- User self-commands.
- -------------------------------------------------------------------------------------------------------------------
- -- Called for custom player commands.
- function job_self_command(cmdParams, eventArgs)
- if cmdParams[1]:lower() == 'petweather' then
- handle_petweather()
- eventArgs.handled = true
- elseif cmdParams[1]:lower() == 'siphon' then
- handle_siphoning()
- eventArgs.handled = true
- elseif cmdParams[1]:lower() == 'pact' then
- handle_pacts(cmdParams)
- eventArgs.handled = true
- elseif cmdParams[1] == 'reset_ward_flag' then
- wards.flag = false
- wards.spell = ''
- eventArgs.handled = true
- end
- end
- -------------------------------------------------------------------------------------------------------------------
- -- Utility functions specific to this job.
- -------------------------------------------------------------------------------------------------------------------
- -- Cast the appopriate storm for the currently summoned avatar, if possible.
- function handle_petweather()
- if player.sub_job ~= 'SCH' then
- add_to_chat(122, "You can not cast storm spells")
- return
- end
- if not pet.isvalid then
- add_to_chat(122, "You do not have an active avatar.")
- return
- end
- local element = pet.element
- if element == 'Thunder' then
- element = 'Lightning'
- end
- if S{'Light','Dark','Lightning'}:contains(element) then
- add_to_chat(122, 'You do not have access to '..elements.storm_of[element]..'.')
- return
- end
- local storm = elements.storm_of[element]
- if storm then
- send_command('@input /ma "'..elements.storm_of[element]..'" <me>')
- else
- add_to_chat(123, 'Error: Unknown element ('..tostring(element)..')')
- end
- end
- -- Custom uber-handling of Elemental Siphon
- function handle_siphoning()
- if areas.Cities:contains(world.area) then
- add_to_chat(122, 'Cannot use Elemental Siphon in a city area.')
- return
- end
- local siphonElement
- local stormElementToUse
- local releasedAvatar
- local dontRelease
- -- If we already have a spirit out, just use that.
- if pet.isvalid and spirits:contains(pet.name) then
- siphonElement = pet.element
- dontRelease = true
- -- If current weather doesn't match the spirit, but the spirit matches the day, try to cast the storm.
- if player.sub_job == 'SCH' and pet.element == world.day_element and pet.element ~= world.weather_element then
- if not S{'Light','Dark','Lightning'}:contains(pet.element) then
- stormElementToUse = pet.element
- end
- end
- -- If we're subbing /sch, there are some conditions where we want to make sure specific weather is up.
- -- If current (single) weather is opposed by the current day, we want to change the weather to match
- -- the current day, if possible.
- elseif player.sub_job == 'SCH' and world.weather_element ~= 'None' then
- -- We can override single-intensity weather; leave double weather alone, since even if
- -- it's partially countered by the day, it's not worth changing.
- if get_weather_intensity() == 1 then
- -- If current weather is weak to the current day, it cancels the benefits for
- -- siphon. Change it to the day's weather if possible (+0 to +20%), or any non-weak
- -- weather if not.
- -- If the current weather matches the current avatar's element (being used to reduce
- -- perpetuation), don't change it; just accept the penalty on Siphon.
- if world.weather_element == elements.weak_to[world.day_element] and
- (not pet.isvalid or world.weather_element ~= pet.element) then
- -- We can't cast lightning/dark/light weather, so use a neutral element
- if S{'Light','Dark','Lightning'}:contains(world.day_element) then
- stormElementToUse = 'Wind'
- else
- stormElementToUse = world.day_element
- end
- end
- end
- end
- -- If we decided to use a storm, set that as the spirit element to cast.
- if stormElementToUse then
- siphonElement = stormElementToUse
- elseif world.weather_element ~= 'None' and (get_weather_intensity() == 2 or world.weather_element ~= elements.weak_to[world.day_element]) then
- siphonElement = world.weather_element
- else
- siphonElement = world.day_element
- end
- local command = ''
- local releaseWait = 0
- if pet.isvalid and avatars:contains(pet.name) then
- command = command..'input /pet "Release" <me>;wait 1.1;'
- releasedAvatar = pet.name
- releaseWait = 10
- end
- if stormElementToUse then
- command = command..'input /ma "'..elements.storm_of[stormElementToUse]..'" <me>;wait 4;'
- releaseWait = releaseWait - 4
- end
- if not (pet.isvalid and spirits:contains(pet.name)) then
- command = command..'input /ma "'..elements.spirit_of[siphonElement]..'" <me>;wait 4;'
- releaseWait = releaseWait - 4
- end
- command = command..'input /ja "Elemental Siphon" <me>;'
- releaseWait = releaseWait - 1
- releaseWait = releaseWait + 0.1
- if not dontRelease then
- if releaseWait > 0 then
- command = command..'wait '..tostring(releaseWait)..';'
- else
- command = command..'wait 1.1;'
- end
- command = command..'input /pet "Release" <me>;'
- end
- if releasedAvatar then
- command = command..'wait 1.1;input /ma "'..releasedAvatar..'" <me>'
- end
- send_command(command)
- end
- -- Handles executing blood pacts in a generic, avatar-agnostic way.
- -- cmdParams is the split of the self-command.
- -- gs c [pact] [pacttype]
- function handle_pacts(cmdParams)
- if areas.Cities:contains(world.area) then
- add_to_chat(122, 'You cannot use pacts in town.')
- return
- end
- if not pet.isvalid then
- add_to_chat(122,'No avatar currently available. Returning to default macro set.')
- select_default_macro_book('reset')
- return
- end
- if spirits:contains(pet.name) then
- add_to_chat(122,'Cannot use pacts with spirits.')
- return
- end
- if not cmdParams[2] then
- add_to_chat(123,'No pact type given.')
- return
- end
- local pact = cmdParams[2]:lower()
- if not pacts[pact] then
- add_to_chat(123,'Unknown pact type: '..tostring(pact))
- return
- end
- if pacts[pact][pet.name] then
- if pact == 'astralflow' and not buffactive['astral flow'] then
- add_to_chat(122,'Cannot use Astral Flow pacts at this time.')
- return
- end
- -- Leave out target; let Shortcuts auto-determine it.
- send_command('@input /pet "'..pacts[pact][pet.name]..'"')
- else
- add_to_chat(122,pet.name..' does not have a pact of type ['..pact..'].')
- end
- end
- -- Event handler for updates to player skill, since we can't rely on skill being
- -- correct at pet_aftercast for the creation of custom timers.
- windower.raw_register_event('incoming chunk',
- function (id)
- if id == 0x62 then
- if wards.flag then
- create_pact_timer(wards.spell)
- wards.flag = false
- wards.spell = ''
- end
- end
- end)
- -- Function to create custom timers using the Timers addon. Calculates ward duration
- -- based on player skill and base pact duration (defined in job_setup).
- function create_pact_timer(spell_name)
- -- Create custom timers for ward pacts.
- if wards.durations[spell_name] then
- local ward_duration = wards.durations[spell_name]
- if ward_duration < 181 then
- local skill = player.skills.summoning_magic
- if skill > 300 then
- skill = skill - 300
- if skill > 200 then skill = 200 end
- ward_duration = ward_duration + skill
- end
- end
- local timer_cmd = 'timers c "'..spell_name..'" '..tostring(ward_duration)..' down'
- if wards.icons[spell_name] then
- timer_cmd = timer_cmd..' '..wards.icons[spell_name]
- end
- send_command(timer_cmd)
- end
- end
- -- Select default macro book on initial load or subjob change.
- function select_default_macro_book(reset)
- if reset == 'reset' then
- -- lost pet, or tried to use pact when pet is gone
- end
- -- Default macro set/book
- set_macro_page(1, 8)
- end
Add Comment
Please, Sign In to add comment