-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
function get_sets()
mote_include_version = 2
-- Load and initialize the include file
include('Xathe-Include')
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
function user_setup()
state.OffenseMode:options('Normal', 'Acc')
state.WeaponskillMode:options('Normal', 'Acc')
state.HybridMode:options('Normal', 'DT')
-- Additional local binds
send_command('bind %` gs c cycle HybridMode')
set_lockstyle()
toggle_display()
end
function user_unload()
send_command('unbind %`')
end
function init_gear_sets()
-- Precast sets
sets.precast.JA['Dark Seal'] = {head="Fall. Burgeonet +1"}
sets.precast.JA['Last Resort'] = {back="Ankou's Mantle", feet="Fall. Sollerets +1"}
sets.precast.JA['Nether Void'] = {legs="Heath. Flanchard +1"}
sets.precast.FC_Base = { -- 50
head="Carmine Mask +1", --14
neck="Voltsurge Torque", -- 4
ear2="Loquac. Earring", -- 2
body="Odyss. Chestplate", -- 5
hands="Leyline Gloves", -- 5
ring2="Weather. Ring", -- 5
back=Ankou.FC, -- 10
legs="Eschite Cuisses" -- 5
}
sets.precast.QuickMagic = { -- 7
ammo="Impatiens", -- 2
ring1="Lebeche Ring", -- 2
ring2="Weather. Ring" -- 3
}
sets.precast.FC = set_combine(sets.precast.FC_Base, sets.precast.QuickMagic)
-- Midcast sets
sets.midcast['Dark Magic'] = {
ammo="Pemphredo Tathlum",
head="Carmine Mask +1",
neck="Erra Pendant", -- 10
ear2="Digni. Earring",
body="Carm. Sc. Mail +1", -- 16
hands="Fall. Fin. Gaunt. +2", -- 16
ring1="Evanescence Ring", -- 10
ring2="Stikini Ring", -- 5
back="Niht Mantle", -- 10
legs="Fall. Flanchard +3", -- 18
feet="Ratri Sollerets"
}
sets.midcast.Absorb = set_combine(sets.midcast['Dark Magic'], {
hands="Pavor Gauntlets",
ring2="Kishar Ring",
back="Chuparrosa Mantle"
})
gear.default.obi_waist = "Austerity Belt +1"
sets.midcast.Aspir = set_combine(sets.midcast['Dark Magic'], {
ear1="Hirudinea Earring",
ring2="Archon Ring",
waist=gear.ElementalObi
})
sets.midcast.Drain = sets.midcast.Aspir
sets.midcast['Dread Spikes'] = { -- 2933
head="Odyssean Helm",
body="Heath. Cuirass +1",
hands="Flam. Manopolas +2",
ring2="Moonlight Ring",
back="Moonbeam Cape",
legs="Flamma Dirs +1",
feet="Ratri Sollerets"
}
sets.midcast.Endark = set_combine(sets.midcast['Dark Magic'], {legs="Eschite Cuisses"})
-- Idle sets
sets.idle = {
main="Caladbolg",
sub="Utu Grip",
ammo="Ginsen",
head="Sulevia's Mask +2",
neck="Loricate Torque +1",
ear1="Brutal Earring",
ear2="Cessance Earring",
body="Sulevia's Plate. +1",
hands="Sulev. Gauntlets +2",
ring1="Defending Ring",
ring2="Moonlight Ring",
back=Ankou.DA,
waist="Flume Belt +1",
legs="Carmine Cuisses +1",
feet="Sulev. Leggings +2"
}
sets.Kiting = {legs="Carmine Cuisses +1"}
-- Defense sets
sets.DT_Base = { -- 39
head="Sulevia's Mask +2", -- 6
neck="Loricate Torque +1", -- 6
hands="Sulev. Gauntlets +2", -- 5
ring1="Defending Ring", -- 10
ring2="Moonlight Ring", -- 5
back=Ankou.DA, -- [10]
legs="Sulev. Cuisses +2" -- 7
}
sets.defense.PDT = set_combine(sets.DT_Base, {body="Sulevia's Plate. +1", feet="Sulev. Leggings +2"}) -- 50
sets.defense.MDT = sets.defense.PDT
-- Engaged sets
sets.engaged = set_combine(sets.idle, {
head="Flam. Zucchetto +2",
neck="Abyssal Beads +1",
body=Valorous.Body.DA,
hands="Flam. Manopolas +2",
ring1="Hetairoi Ring",
ring2="Niqmaddu Ring",
waist="Ioskeha Belt +1",
legs=Odyssean.Legs.DA,
feet="Flam. Gambieras +2"
})
sets.engaged.Acc = set_combine(sets.engaged, { -- 86 (1236)
ammo="Seeth. Bomblet +1", -- 8
ear1="Telos Earring", -- 10
body="Emicho Haubert +1", -- 23
hands="Emi. Gauntlets +1", -- 8
ring1="Flamma Ring", -- 12
legs="Flamma Dirs +1" -- 25
})
-- Weaponskill sets
sets.precast.WS = set_combine(sets.engaged, {
ammo="Knobkierrie",
head=Odyssean.Head.WSD,
ear1="Ishvara Earring",
ear2="Brutal Earring",
body="Ignominy Cuirass +3",
hands=Odyssean.Hands.WSD,
ring1="Regal Ring",
back=Ankou.WSD,
legs="Fall. Flanchard +3",
feet="Sulev. Leggings +2"
})
sets.precast.WS.Acc = set_combine(sets.precast.WS, { -- 106 (1175)
head="Flam. Zucchetto +2", -- 21
ear1="Telos Earring", -- 10
ear2="Ishvara Earring",
hands="Emi. Gauntlets +1" -- 46
})
sets.precast.WS['Resolution'] = set_combine(sets.precast.WS, {
head="Flam. Zucchetto +2",
ear1="Brutal Earring",
ear2="Ishvara Earring",
hands="Sulev. Gauntlets +2",
waist="Soil Belt",
feet="Flam. Gambieras +2"
})
sets.precast.WS['Resolution'].Acc = set_combine(sets.precast.WS.Acc, {
ear2="Brutal Earring",
hands="Sulev. Gauntlets +2",
waist="Soil Belt",
feet="Flam. Gambieras +2"
})
sets.precast.WS['Torcleaver'] = set_combine(sets.precast.WS, {waist="Light Belt"})
sets.precast.WS['Torcleaver'].Acc = set_combine(sets.precast.WS.Acc, {waist="Light Belt"})
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
function job_precast(spell, action, spellMap, eventArgs)
if spell.type == 'WeaponSkill' and range_check(spell) then
print_message('Canceled %s (Too Far)':format(spell.name), 167)
eventArgs.cancel = true
end
if spell.name == 'Torcleaver' and dynamis_zone() then
eventArgs.handled = true
end
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == 'WeaponSkill' and moonshade_ws(spell) then
equip({ear2="Moonshade Earring"})
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.name == 'Drain III' then
if buffactive['Dark Seal'] then
if buffactive['Nether Void'] and player.tp < 600 and not buffactive['Aftermath: Lv.3'] then
equip({main="Dacnomania"})
end
equip({head="Fall. Burgeonet +1"})
end
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
if not buffactive['Last Resort'] then
if windower.ffxi.get_ability_recasts()[87] == 0 and spell.name ~= 'Last Resort' then
print_message('Last Resort is ready!', 167)
elseif not buffactive.Hasso and spell.name ~= 'Hasso' and player.sub_job == 'SAM' then
print_message('Hasso is inactive!', 167)
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff, gain, eventArgs)
local name = buff:lower()
if disables:contains(name) then
if gain then
equip(sets.defense.PDT)
elseif not has_any_buff_of(disables) then
handle_equipping_gear(player.status)
end
elseif name == 'aftermath: lv.3' then
if gain then
send_command('timers c "Aftermath: Lv.3" 180')
print_message('==== Aftermath: Lv.3 Gained ====')
end
elseif name == 'blood weapon' then
if not gain then
enable('main')
equip({main="Caladbolg"})
send_command('cancel souleater')
end
elseif name == 'last resort' or name == 'hasso' then
if not gain and not buffactive.Hasso then
print_message('Hasso is inactive!', 167)
end
end
end
function job_state_change(stateField, newValue, oldValue)
update_display()
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function customize_melee_set(meleeSet)
if buffactive['Blood Weapon'] and buffactive['Souleater'] and player.max_hp > 8000 then
meleeSet = set_combine(meleeSet, {main="Dacnomania"})
end
if state.HybridMode.value == 'DT' then
meleeSet = set_combine(meleeSet, sets.DT_Base)
end
if state.Kiting.value then
meleeSet = set_combine(meleeSet, sets.Kiting)
end
return meleeSet
end
function display_current_job_state(eventArgs)
print_message('Refreshed gear.')
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements self-commands.
-------------------------------------------------------------------------------------------------------------------
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'dac' then
equip({main="Dacnomania"})
disable('main')
print_message('Locked %s %s':format('Dacnomania':color(258), 'to main.':color(207)))
elseif cmdParams[1] == 'raetic' then
equip({main="Raetic Algol +1"})
disable('main')
print_message('Locked %s %s':format('Raetic Algol +1':color(258), 'to main.':color(207)))
elseif cmdParams[1] == 'dyna' then
handle_equipping_gear(player.status)
print_message('Forcing gear update.', 167)
end
end