|
Updated DPS Sheet and LUAs - (DNC 9/27/2020)
サーバ: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2020-09-27 22:17:33
DPS Sheet
First, here is an up to date DPS sheet for anyone to copy if they like. PLEASE be aware, all of the Buff Values are based on TRUSTS. It's easier to update the buff values to whatever you want, than for me to copy over all the updated gear sets. This sheet has all current relevant gear that I'm aware of for Dnc. I eliminated a ton of stuff that was outdated to clean up the 'Gear' tab, with plenty of blanks for anyone to input whatever items (or custom augmented gear) as they desire.
You shouldn't need to request to edit. To keep the original file clean (so multiple people aren't screwing with the same sheet) go to 'File' and select 'Make Copy'. This will give you your own copy of the spreadsheet to customize, input your own Augmented gear, and do with as you please.
https://docs.google.com/spreadsheets/d/1GR2XcweDPqimAN2LqKLU1W8hfUbQNjA-foU3iPnLKec/edit?usp=sharing
** If you want to test Tauret DPS, you need to do 2 things:
1: In the 'Gear' tab, go to Cell AL20 (Custom Crit %) and input 19%. This is the average expected from 0tp to 1000tp, divided by 2, as it only works in a single hand. This is a close but rough, estimate.
2: In the 'Data' tab, go to Cell E211 (Relic Bonus) and manually force 150%.
This should give you the 50% WSD + 19% Crit Rate from a Tauret, for fairly accurate DPS calculations.
Skeleton LUA
Here is a Skeleton Dancer Lua, with nearly everything stripped down. I left a full blank gear set in, so you can see exactly what to fill IF you want. I believe all Job Abilities are in there, but left blank, so that you don't have to customize them if you don't want. They will work, and just not swap anything currently.
You can toss a TP, WS, and Idle set into this lua, and cover 90% of a Dancer's needs without touching anything else. But it has a lot more utility if you get comfortable/confident with gearswap down the road.
Code -- Initialization function for this job file.
function get_sets()
mote_include_version = 2
include('Mote-Include.lua')
end
-- Setup variables that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.Buff['Climactic Flourish'] = buffactive['climactic flourish'] or false
state.MainStep = M{['description']='Main Step', 'Box Step', 'Quickstep', 'Feather Step', 'Stutter Step'}
state.SelectStepTarget = M(false, 'Select Step Target')
state.IgnoreTargetting = M(true, 'Ignore Targetting')
state.ClosedPosition = M(false, 'Closed Position')
lockstyleset = 15
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
-- Gear Modes
function user_setup()
state.HybridMode:options('Normal', 'MagEva', 'HIGH', 'MID', 'LOW')
-- Additional Key Binds.
send_command('bind ^` input /ja "Chocobo Jig II" <me>') --Ctrl'~'
send_command('bind !` input /ja "Spectral Jig" <me>') --Alt'~'
send_command('bind f9 gs c cycle OffenseMode') --F9
send_command('bind f10 gs c cycle HybridMode') --F10
send_command('bind f11 gs c cycle mainstep') --F11
send_command('bind ^c input /ja "Contradance" <me>') --Ctrl'C'
send_command('bind ^t input /ja "Trance" <me>') --Ctrl'T'
send_command('bind ^g input /ja "Grand Pas" <me>') --Ctrl'G'
send_command('lua l gearinfo') --If you don't have GearInfo, Haste tiers won't work properly.
select_default_macro_book()
set_lockstyle()
Haste = 0
DW_needed = 0
DW = false
moving = false
update_combat_form()
determine_haste_group()
end
-- Erases the Key Binds above when you switch to another job.
function user_unload()
send_command('unbind ^`')
send_command('unbind !`')
send_command('unbind f11')
send_command('gs enable all')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.JA['No Foot Rise'] = {body="Horos Casaque +3"}
sets.precast.JA['Trance'] = {}
sets.precast.JA['Grand Pas'] = {}
sets.precast.JA['Contradance'] = {}
sets.precast.JA['Saber Dance'] = {}
sets.precast.JA['Fan Dance'] = {}
sets.precast.JA['Presto'] = {}
sets.precast.Waltz = {
head="Anwig Salade",
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --50%
sets.precast.WaltzSelf = {
ammo="Yamarang", --5
head="Mummu Bonnet +2", --0/9R
neck="Etoile Gorget +2", --10
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
ring2="Asklepian Ring", --0/3R
back="Toetapper Mantle", --5
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --70/20R
sets.precast.Samba = {}
sets.precast.Jig = {}
sets.precast.Step = {}
sets.precast.Step['Feather Step'] = {}
sets.precast.Flourish1 = {}
sets.precast.Flourish1['Animated Flourish'] = {}
sets.precast.Flourish1['Violent Flourish'] = {}
sets.precast.Flourish1['Desperate Flourish'] = {}
sets.precast.Flourish2 = {}
sets.precast.Flourish2['Reverse Flourish'] = {hands="Macu. Bangles +1",back="Toetapper Mantle"}
sets.precast.Flourish3 = {}
sets.precast.Flourish3['Striking Flourish'] = {}
sets.precast.Flourish3['Climactic Flourish'] = {}
sets.precast.FC = {}
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {body="Passion Jacket",neck="Magoraga Beads"})
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.WS.Critical = {body="Meg. Cuirie +2"}
sets.precast.WS = {}
sets.precast.WS['Exenterator'] = {}
sets.precast.WS['Pyrrhic Kleos'] = {}
sets.precast.WS['Evisceration'] = {}
sets.precast.WS['Shark Bite'] = {}
sets.precast.WS['Aeolian Edge'] = {}
sets.precast.WS['Rudra\'s Storm'] = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
sets.idle.Town = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- This is a Set that would only be used when you are NOT Dual Wielding. Most likely Airy Buckler Builds with Fencer as War Sub.
-- There are no haste parameters set for this build, because you wouldn't be juggling DW gear, you would always use the same gear, other than Damage Taken and Accuracy sets which ARE included below.
sets.engaged = {}
------------------------------------------------------------------------------------------------
-------------------------------------- Dual Wield Sets -----------------------------------------
------------------------------------------------------------------------------------------------
-- * DNC Native DW Trait: 30% DW
-- * DNC Job Points DW Gift: 5% DW
-- No Magic Haste (38% DW to cap)
sets.engaged.DW = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 15% Magic Haste (32% DW to cap)
sets.engaged.DW.LowHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 30% Magic Haste (20% DW to cap)
sets.engaged.DW.MidHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 40% Magic Haste (8% DW to cap)
sets.engaged.DW.HighHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 45% Magic Haste (0% DW to cap)
sets.engaged.DW.MaxHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
-- Define tiers of Defense Taken. These sets are cycled with the F10 Button.
sets.engaged.DT1 = {ring1="Defending Ring",ring2="Vocane Ring",Neck="Loricate Torque +1"} --23%
sets.engaged.DT2 = {}
sets.engaged.DT3 = {}
sets.engaged.DT4 = {}
-- Shield Base
sets.engaged.LOW = set_combine(sets.engaged, sets.engaged.DT1)
sets.engaged.MID = set_combine(sets.engaged, sets.engaged.DT2)
sets.engaged.HIGH = set_combine(sets.engaged, sets.engaged.DT3)
sets.engaged.MagEva = set_combine(sets.engaged, sets.engaged.DT4)
-- No Haste DW
sets.engaged.DW.LOW = set_combine(sets.engaged.DW, sets.engaged.DT1)
sets.engaged.DW.MID = set_combine(sets.engaged.DW, sets.engaged.DT2)
sets.engaged.DW.HIGH = set_combine(sets.engaged.DW, sets.engaged.DT3)
sets.engaged.DW.MagEva = set_combine(sets.engaged.DW, sets.engaged.DT4)
-- Low Haste DW
sets.engaged.DW.LOW.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT1)
sets.engaged.DW.MID.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT4)
-- Mid Haste
sets.engaged.DW.LOW.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT4)
-- High Haste
sets.engaged.DW.LOW.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT1)
sets.engaged.DW.MID.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT4)
-- Max Haste
sets.engaged.DW.LOW.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT4)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.buff.Doom = {}
sets.buff['Saber Dance'] = {}
sets.buff['Fan Dance'] = {}
sets.buff['Closed Position'] = {}
sets.buff['Climactic Flourish'] = {head="Maculele Tiara +1",body="Meg. Cuirie +2"}
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 spellMap == 'Utsusemi' then
if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
cancel_spell()
add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
eventArgs.handled = true
return
elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
end
end
-- Used to overwrite Moonshade Earring if TP is more than 2750.
if spell.type == 'WeaponSkill' then
if player.tp > 2750 then
equip({ear1 = "Telos Earring"})
end
-- Used to optimize Rudra's Storm when Climactic Flourish is active.
if spell.english == "Rudra's Storm" and buffactive['Climactic Flourish'] then
equip({head="Maculele Tiara +1",ear2="Ishvara Earring",body="Meghanada Cuirie +2",ammo="Charis Feather"})
end
-- If a forced Critical Hit is coming, this prioritizes gear to maximize Crit Dmg
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == "WeaponSkill" then
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
--This will detect if you are Waltzing yourself, and if so, equip gear that maximizes 'walts effect received' stats.
if spell.english == "Curing Waltz" or spell.english == "Curing Waltz II" or spell.english == "Curing Waltz III" or spell.english == "Curing Waltz IV" or spell.english == "Curing Waltz V" and spell.target.type == 'SELF' then
equip(sets.precast.WaltzSelf)
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff,gain)
if buff == 'Saber Dance' or buff == 'Climactic Flourish' or buff == 'Fan Dance' then
handle_equipping_gear(player.status)
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function job_handle_equipping_gear(playerStatus, eventArgs)
update_combat_form()
determine_haste_group()
end
function job_update(cmdParams, eventArgs)
handle_equipping_gear(player.status)
end
function update_combat_form()
if DW == true then
state.CombatForm:set('DW')
elseif DW == false then
state.CombatForm:reset()
end
end
function get_custom_wsmode(spell, spellMap, defaut_wsmode)
local wsmode
return wsmode
end
function customize_idle_set(idleSet)
return idleSet
end
function customize_melee_set(meleeSet)
if state.Buff['Climactic Flourish'] then
meleeSet = set_combine(meleeSet, sets.buff['Climactic Flourish'])
end
return meleeSet
end
-- Handle auto-targetting based on local setup.
function job_auto_change_target(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
if state.IgnoreTargetting.value == true then
state.IgnoreTargetting:reset()
eventArgs.handled = true
end
eventArgs.SelectNPCTargets = state.SelectStepTarget.value
end
end
-- Function to display the current relevant user state when doing an update.
-- Set eventArgs.handled to true if display was handled, and you don't want the default info shown.
function display_current_job_state(eventArgs)
local msg = '[ Melee'
if state.CombatForm.has_value then
msg = msg .. ' (' .. state.CombatForm.value .. ')'
end
msg = msg .. ': '
msg = msg .. state.OffenseMode.value
if state.HybridMode.value ~= 'Normal' then
msg = msg .. '/' .. state.HybridMode.value
end
msg = msg .. ' ][ WS: ' .. state.WeaponskillMode.value .. ' ]'
if state.DefenseMode.value ~= 'None' then
msg = msg .. '[ Defense: ' .. state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ' ]'
end
if state.ClosedPosition.value then
msg = msg .. '[ Closed Position: ON ]'
end
if state.Kiting.value then
msg = msg .. '[ Kiting Mode: ON ]'
end
msg = msg .. '[ '..state.MainStep.current
msg = msg .. ' ]'
add_to_chat(123, msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
function determine_haste_group()
classes.CustomMeleeGroups:clear()
if DW == true then
if DW_needed <= 1 then
classes.CustomMeleeGroups:append('MaxHaste')
elseif DW_needed > 1 and DW_needed <= 9 then
classes.CustomMeleeGroups:append('HighHaste')
elseif DW_needed > 9 and DW_needed <= 21 then
classes.CustomMeleeGroups:append('MidHaste')
elseif DW_needed > 21 and DW_needed <= 38 then
classes.CustomMeleeGroups:append('LowHaste')
elseif DW_needed > 38 then
classes.CustomMeleeGroups:append('')
end
end
end
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'step' then
if cmdParams[2] == 't' then
state.IgnoreTargetting:set()
end
local doStep = ''
if state.UseAltStep.value == true then
doStep = state[state.CurrentStep.current..'Step'].current
state.CurrentStep:cycle()
else
doStep = state.MainStep.current
end
send_command('@input /ja "'..doStep..'" <t>')
end
gearinfo(cmdParams, eventArgs)
end
function gearinfo(cmdParams, eventArgs)
if cmdParams[1] == 'gearinfo' then
if type(tonumber(cmdParams[2])) == 'number' then
if tonumber(cmdParams[2]) ~= DW_needed then
DW_needed = tonumber(cmdParams[2])
DW = true
end
elseif type(cmdParams[2]) == 'string' then
if cmdParams[2] == 'false' then
DW_needed = 0
DW = false
end
end
if type(tonumber(cmdParams[3])) == 'number' then
if tonumber(cmdParams[3]) ~= Haste then
Haste = tonumber(cmdParams[3])
end
end
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
-- If you attempt to use a step, this will automatically use Presto.
function job_pretarget(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
local allRecasts = windower.ffxi.get_ability_recasts()
local prestoCooldown = allRecasts[236]
if player.main_job_level >= 77 and prestoCooldown < 1 and not buffactive['Presto'] then
cast_delay(1.1)
send_command('input /ja "Presto" <me>')
end
end
-- If you attempt to use Climactic Flourish with less than 4 finishing moves, this will automatically use 'Current Step' and resend Climactic Flourish.
local under4FMs = not buffactive['Finishing Move 4'] and not buffactive['Finishing Move 5'] and not buffactive['Finishing Move (6+)']
local doStep = ''
local doStep = state.MainStep.current
if spell.english == "Climactic Flourish" and under4FMs then
cast_delay(1.9)
send_command('@input /ja "'..doStep..'" <t>')
end
end
-- Automatically loads a Macro Set by: (Pallet,Book)
function select_default_macro_book()
if player.sub_job == 'SAM' then
set_macro_page(1, 5)
elseif player.sub_job == 'WAR' then
set_macro_page(2, 5)
elseif player.sub_job == 'RUN' then
set_macro_page(3, 5)
elseif player.sub_job == 'DRG' then
set_macro_page(5, 5)
elseif player.sub_job == 'BLU' then
set_macro_page(6, 5)
elseif player.sub_job == 'THF' then
set_macro_page(9, 5)
elseif player.sub_job == 'NIN' then
set_macro_page(10, 5)
else
set_macro_page(1, 5)
end
end
function set_lockstyle()
send_command('wait 2; input /lockstyleset ' .. lockstyleset)
end
Gear Info (Haste Tier and DW handling)
Understand, both of these luas depend on GearInfo to work, as the old haste tiers are ineffective in today's world with so many forms of haste all around us, while still needing to juggle Dual Wield as a Dancer. The addon can be found/explained here:
https://www.ffxiah.com/forum/topic/52145/finally-releasing-this-addon-gearinfo/
サーバ: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2020-09-27 22:18:26
Full LUA
If you want the entire eye-bleeding lua, here is my current full blown gearswap for Dancer. I would only recommend this for career Dancers, or people already comfortable with GearSwap, but it has all kinds of toggles and gadgets built into it, including 4 Tiers of Dmg Taken, 4 tiers of Acc, WS Acc modes, Weapon Swaps, Step Swaps, Treasure Hunter, Warp, Capacity, Dynamis gear locks, a full blown enmity casting mode, and all kinds of sub job specifics built in.
You can steal bits and pieces from this one, as you find a need, and add them to the skeleton lua down the road.
Code -- Initialization function for this job file.
function get_sets()
mote_include_version = 2
include('Mote-Include.lua')
end
-- Setup variables that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.Buff['Climactic Flourish'] = buffactive['climactic flourish'] or false
state.Buff['Sneak Attack'] = buffactive['sneak attack'] or false
state.MainStep = M{['description']='Main Step', 'Box Step', 'Quickstep', 'Feather Step', 'Stutter Step'}
state.AltStep = M{['description']='Alt Step', 'Quickstep', 'Feather Step', 'Stutter Step', 'Box Step'}
state.UseAltStep = M(false, 'Use Alt Step')
state.SelectStepTarget = M(false, 'Select Step Target')
state.IgnoreTargetting = M(true, 'Ignore Targetting')
state.ClosedPosition = M(false, 'Closed Position')
state.CombatWeapon = M{['description']='Weapon', 'Normal', 'AnusTwat', 'TauretTwat', 'TwatCento'}
state.CurrentStep = M{['description']='Current Step', 'Main', 'Alt'}
-- state.SkillchainPending = M(false, 'Skillchain Pending')
state.CP = M(false, "Capacity Points Mode")
state.Warp = M(false, "Warp Mode")
state.MP = M(false, "Mana Mode")
state.Neck = M(false, "Neck Mode")
state.Dynamis = M(false, "Dynamis Mode")
state.TH = M(false, "Treasure Hunter")
lockstyleset = 15
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
-- Gear Modes
function user_setup()
state.OffenseMode:options('Normal', 'LowAcc', 'MidAcc', 'HighAcc')
state.HybridMode:options('Normal', 'MagEva', 'HIGH', 'MID', 'LOW')
state.WeaponskillMode:options('Normal', 'Acc')
state.CastingMode:options('Normal', 'Enmity')
state.IdleMode:options('Normal', 'Turms', 'Regen')
-- Additional Key Binds.
send_command('bind ^` input /ja "Chocobo Jig II" <me>') --Ctrl'~'
send_command('bind !` input /ja "Spectral Jig" <me>') --Alt'~'
send_command('bind f9 gs c cycle OffenseMode') --F9
send_command('bind ^f9 gs c cycle WeaponSkillMode') --Ctrl'F9'
send_command('bind f10 gs c cycle HybridMode') --F10
send_command('bind f11 gs c cycle mainstep') --F11
send_command('bind ^f12 gs c cycle IdleMode') --Ctrl'F12'
send_command('bind @c gs c toggle CP') --WindowKey'C'
send_command('bind @r gs c toggle Warp') --WindowKey'R'
send_command('bind @m gs c toggle MP') --Windowkey'M'
send_command('bind @d gs c toggle Dynamis') --Windowkey'D'
send_command('bind @t gs c toggle TH') --Windowkey'T'
send_command('bind @w gs c cycle CombatWeapon') --Windowkey'W'
send_command('bind @e gs c cycle CastingMode') --WindowKey'E'
send_command('lua l gearinfo') --If you don't have GearInfo, Haste tiers won't work properly.
send_command('bind ^c input /ja "Contradance" <me>') --Ctrl'C'
send_command('bind ^t input /ja "Trance" <me>') --Ctrl'T'
send_command('bind ^g input /ja "Grand Pas" <me>') --Ctrl'G'
send_command('bind !numpad1 input /ws "Exenterator" <t>')
send_command('bind !numpad2 input /ws "Pyrrhic Kleos" <t>')
send_command('bind !numpad3 input /ws "Evisceration" <t>')
send_command('bind !numpad4 input /ws "Rudra\'s Storm" <t>')
send_command('bind !numpad9 input /ws "Aeolian Edge" <t>')
select_default_macro_book()
set_lockstyle()
Haste = 0
DW_needed = 0
DW = false
moving = false
update_combat_form()
determine_haste_group()
end
-- Erases the Key Binds above when you switch to another job.
function user_unload()
send_command('unbind ^`')
send_command('unbind !`')
send_command('unbind !-')
send_command('unbind ^=')
send_command('unbind f11')
send_command('unbind @c')
send_command('unbind @r')
send_command('unbind @m')
send_command('unbind @e')
send_command('unbind @d')
send_command('unbind ^numpad1')
send_command('unbind ^numpad2')
send_command('unbind ^numpad3')
send_command('unbind ^numpad4')
send_command('unbind ^numpad9')
send_command('gs enable all')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.Enmity = {
ammo="Sapience Orb", --2
head="Halitus Helm", --8
neck="Unmoving Collar +1", --10
hands="Kurys Gloves", --9
ear1="Cryptic Earring", --4
ear2="Friomisi Earring", --2
ring2="Begrudging Ring", --5
ring1="Eihwaz Ring", --5
body="Emet Harness +1", --10
waist="Sulla Belt", --3
back={ name="Senuna's Mantle", augments={'Eva.+20 /Mag. Eva.+20','Mag. Evasion+10','Enmity+10','Phys. dmg. taken-10%',}}, --10
legs="Zoar Subligar +1", --6
feet="Ahosi Leggings", --7
} --81
sets.Jump = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="Horos Casaque +3",
hands="Adhemar Wrist. +1",
ring1="Hetairoi Ring",
ring2="Epona's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Windbuffet Belt +1",
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
}
sets.precast.JA['No Foot Rise'] = {body="Horos Casaque +3"}
sets.precast.JA['Trance'] = {head="Horos Tiara +3"}
sets.precast.JA['Grand Pas'] = {}
sets.precast.JA['Contradance'] = {}
sets.precast.JA['Saber Dance'] = {}
sets.precast.JA['Fan Dance'] = {}
sets.precast.JA['Presto'] = {}
sets.precast.Waltz = {
ammo="Staunch Tathlum +1",
head="Anwig Salade",
neck="Loricate Torque +1",
ear1="",
ear2="",
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
ring2="Vocane Ring",
ring1="Defending Ring",
back="Moonbeam Cape",
waist="Flume Belt +1",
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --50%
sets.precast.WaltzSelf = {
ammo="Yamarang", --5
head="Mummu Bonnet +2", --0/9R
neck="Etoile Gorget +2", --10
ear1="",
ear2="",
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
ring2="Asklepian Ring", --0/3R
ring1="Defending Ring",
back="Toetapper Mantle", --5
waist="Flume Belt +1",
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --70/20R
sets.precast.Samba = {head="Maxixi Tiara +2",back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}}}
sets.precast.Jig = {feet="Maxixi Toe shoes +1",legs="Horos Tights +3"}
sets.precast.Step = {ammo="Yamarang",neck="Etoile Gorget +2",waist="Eschan Stone",hands="Maxixi Bangles +3",back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},feet="Horos T. Shoes +3"}
sets.precast.Step['Feather Step'] = set_combine(sets.precast.Step, {})
sets.precast.Flourish1 = {}
sets.precast.Flourish1['Animated Flourish'] = sets.Enmity
sets.precast.Flourish1['Violent Flourish'] = {ammo="Yamarang",head="Malignance Chapeau",body="Horos Casaque +3",hands="Malignance Gloves",waist="Eschan Stone",feet="Malignance Boots",neck="Etoile Gorget +2"}
sets.precast.Flourish1['Desperate Flourish'] = {}
sets.precast.Flourish2 = {}
sets.precast.Flourish2['Reverse Flourish'] = {hands="Macu. Bangles +1",back="Toetapper Mantle"}
sets.precast.Flourish3 = {}
sets.precast.Flourish3['Striking Flourish'] = {body="Macu. Casaque +1"}
sets.precast.Flourish3['Climactic Flourish'] = {head="Maculele Tiara +1"}
sets.precast.FC = {
ammo="Sapience Orb", --2
head={ name="Herculean Helm", augments={'Mag. Acc.+11 "Mag.Atk.Bns."+11','"Fast Cast"+6','STR+5','"Mag.Atk.Bns."+12',}}, --13
neck="Orunmila's Torque", --5
Ear1="Etiolation Earring", --1
Ear2="Loquacious Earring", --2
Body="Taeon Tabard", --9
Hands="Leyline Gloves", --8
Ring1="", --Rahab Ring --2
Ring2="Prolix Ring", --2
back={ name="Senuna's Mantle", augments={'"Fast Cast"+10',}}, --10
Waist="",
legs={ name="Herculean Trousers", augments={'"Mag.Atk.Bns."+3','"Fast Cast"+6','Mag. Acc.+10',}}, --6
feet={ name="Herculean Boots", augments={'"Fast Cast"+5',}}, --5
} --65
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {body="Passion Jacket",neck="Magoraga Beads"})
------------------------------------------------------------------------------------------------
-------------------------------------- Sub Job Specific ----------------------------------------
------------------------------------------------------------------------------------------------
----------------- /Sam ---------------
sets.precast.JA['Meditate'] = {}
sets.precast.JA['Third Eye'] = {}
sets.precast.JA['Sekkanoki'] = {}
sets.precast.JA['Warding Circle'] = {}
----------------- /War ---------------
sets.precast.JA['Provoke'] = {}
----------------- /Run ---------------
sets.precast.JA['Vallation'] = {}
sets.midcast.Flash = {}
----------------- /Pld ---------------
sets.precast.JA['Holy Circle'] = {}
sets.precast.JA['Sentinel'] = {}
----------------- /Blu ---------------
sets.midcast['Blue Magic'] = {}
----------------- /Drg ---------------
sets.precast.JA['Jump'] = sets.Jump
sets.precast.JA['High Jump'] = sets.Jump
------------------------------------------------------------------------------------------------
---------------------------------------- Enmity Mode -------------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.JA['No Foot Rise'].Enmity = set_combine(sets.Enmity, sets.precast.JA['No Foot Rise'])
sets.precast.JA['Trance'].Enmity = set_combine(sets.Enmity, sets.precast.JA['Trance'])
sets.precast.JA['Grand Pas'].Enmity = set_combine(sets.Enmity, sets.precast.JA['Grand Pas'])
sets.precast.JA['Contradance'].Enmity = set_combine(sets.Enmity, sets.precast.JA['Contradance'])
sets.precast.JA['Saber Dance'].Enmity = set_combine(sets.Enmity, sets.precast.JA['Saber Dance'])
sets.precast.JA['Fan Dance'].Enmity = set_combine(sets.Enmity, sets.precast.JA['Fan Dance'])
sets.precast.JA['Presto'].Enmity = set_combine(sets.Enmity, sets.precast.JA['Presto'])
sets.precast.Waltz.Enmity = {
ammo="Sapience Orb", --2
head="Anwig Salade",
neck="Unmoving Collar +1", --10
ear1="Cryptic Earring", --4
ear2="Friomisi Earring", --2
body="Maxixi Casaque +3", --19/8POT
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11POT
ring2="Begrudging Ring", --5
ring1="Eihwaz Ring", --5
back={ name="Senuna's Mantle", augments={'Eva.+20 /Mag. Eva.+20','Mag. Evasion+10','Enmity+10','Phys. dmg. taken-10%',}}, --10
waist="Sulla Belt", --3
legs="Dashing Subligar", --10POT
feet="Maxixi Toe shoes +1", --10POT
} --50POT 41Enm
sets.precast.WaltzSelf.Enmity = set_combine(sets.precast.Waltz.Enmity, {head="Mummu Bonnet +2",ring2="Asklepian Ring"}) --0/9R
sets.precast.Samba.Enmity = set_combine(sets.Enmity, sets.precast.Samba)
sets.precast.Jig.Enmity = set_combine(sets.Enmity, sets.precast.Jig)
sets.precast.Step.Enmity = set_combine(sets.Enmity, sets.precast.Step)
sets.precast.Step['Feather Step'].Enmity = set_combine(sets.Enmity, sets.precast.Step['Feather Step'])
sets.precast.Flourish1.Enmity = set_combine(sets.Enmity, sets.precast.Flourish1)
sets.precast.Flourish1['Animated Flourish'].Enmity = set_combine(sets.Enmity, sets.precast.Flourish1['Animated Flourish'])
sets.precast.Flourish1['Violent Flourish'].Enmity = set_combine(sets.Enmity, sets.precast.Flourish1['Violent Flourish'])
sets.precast.Flourish1['Desperate Flourish'].Enmity = set_combine(sets.Enmity, sets.precast.Flourish1['Desperate Flourish'])
sets.precast.Flourish2.Enmity = set_combine(sets.Enmity, sets.precast.Flourish2)
sets.precast.Flourish2['Reverse Flourish'].Enmity = set_combine(sets.Enmity, sets.precast.Flourish2['Reverse Flourish'])
sets.precast.Flourish3.Enmity = set_combine(sets.Enmity, sets.precast.Flourish3)
sets.precast.Flourish3['Striking Flourish'].Enmity = set_combine(sets.Enmity, sets.precast.Flourish3['Striking Flourish'])
sets.precast.Flourish3['Climactic Flourish'].Enmity = set_combine(sets.Enmity, sets.precast.Flourish3['Climactic Flourish'])
----------------- /Sam ---------------
sets.precast.JA['Meditate'].Enmity = sets.Enmity
sets.precast.JA['Third Eye'].Enmity = sets.Enmity
sets.precast.JA['Sekkanoki'].Enmity = sets.Enmity
sets.precast.JA['Warding Circle'].Enmity = sets.Enmity
----------------- /War ---------------
sets.precast.JA['Provoke'].Enmity = sets.Enmity
----------------- /Run ---------------
sets.precast.JA['Vallation'].Enmity = sets.Enmity
sets.midcast.Flash.Enmity = sets.Enmity
----------------- /Pld ---------------
sets.precast.JA['Holy Circle'].Enmity = sets.Enmity
sets.precast.JA['Sentinel'].Enmity = sets.Enmity
----------------- /Blu ---------------
sets.midcast['Blue Magic'].Enmity = sets.Enmity
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.WS = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Asperity Necklace",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="",
hands="Maxixi Bangles +3",
ring2="Epona's Ring",
ring1="Ilabrat Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Fotia Belt",
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
}
sets.precast.WS['Exenterator'] = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Fotia Gorget",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="",
hands="Maxixi Bangles +3",
ring2="Epona's Ring",
ring1="Ilabrat Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Fotia Belt",
legs="Samnuha Tights",
feet="Horos Toe Shoes +3",
}
sets.precast.WS['Pyrrhic Kleos'] = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Fotia Gorget",
left_ear="Moonshade Earring",
right_ear="Sherida Earring",
body="Horos Casaque +3",
hands="Adhemar Wristbands +1",
ring2="Epona's Ring",
ring1="Ilabrat Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Fotia Belt",
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
}
sets.precast.WS['Evisceration'] = {
ammo="Charis Feather",
head="Adhemar Bonnet +1",
neck="Fotia Gorget",
left_ear="Moonshade Earring",
right_ear="Sherida Earring",
body="Adhemar Jacket +1",
hands="Adhemar Wristbands +1",
ring2="Epona's Ring",
ring1="Mummu Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Fotia Belt",
legs="Lustratio Subligar",
feet={ name="Herculean Boots", augments={'Attack+29','Crit.hit rate+5','STR+2',}}
}
sets.precast.WS['Shark Bite'] = {
ammo="Charis Feather",
head="Horos Tiara +3",
body="Horos Casaque +3",
hands="Maxixi Bangles +3",
legs="Horos Tights +3",
feet="Horos Toe Shoes +3",
neck="Etoile Gorget +2",
waist="Grunfeld Rope",
left_ear="Moonshade Earring",
right_ear="Sherida Earring",
ring2="Epaminondas's Ring",
ring1="Ilabrat Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
}
sets.precast.WS['Rudra\'s Storm'] = {
ammo="Aurgelmir Orb +1",
head="Horos Tiara +3",
body="Horos Casaque +3",
hands="Maxixi Bangles +3",
legs="Horos Tights +3",
feet={ name="Herculean Boots", augments={'Attack+29','Weapon skill damage +5%','DEX+8','Accuracy+7',}},
neck="Etoile Gorget +2",
waist="Grunfeld Rope",
left_ear="Moonshade Earring",
right_ear="Sherida Earring",
ring2="Epaminondas's Ring",
ring1="Ilabrat Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
}
sets.precast.WS['Aeolian Edge'] = {
ammo="Pemphredo Tathlum",
head={ name="Herculean Helm", augments={'"Mag.Atk.Bns."+25','Crit. hit damage +1%','INT+3',}},
body={ name="Samnuha Coat", augments={'Mag. Acc.+13','"Mag.Atk.Bns."+14','"Fast Cast"+3','"Dual Wield"+4',}},
hands="Leyline Gloves",
legs={ name="Herculean Trousers", augments={'"Mag.Atk.Bns."+23','"Fast Cast"+4',}},
feet={ name="Herculean Boots", augments={'"Mag.Atk.Bns."+25','Weapon skill damage +4%',}},
neck="Sanctity Necklace",
waist="Eschan Stone",
left_ear="Friomisi Earring",
right_ear="Hecate's Earring",
left_ring="Acumen Ring",
right_ring="Epaminondas's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
}
sets.precast.WS.Critical = {body="Meg. Cuirie +2"}
--------------------------------------- Accuracy Mode ------------------------------------------
sets.precast.WS.Acc = set_combine(sets.precast.WS, {ammo="Yamarang",neck="Etoile Gorget +2"})
sets.precast.WS['Exenterator'].Acc = set_combine(sets.precast.WS['Exenterator'], {ammo="Yamarang",neck="Etoile Gorget +2"})
sets.precast.WS['Pyrrhic Kleos'].Acc = set_combine(sets.precast.WS['Pyrrhic Kleos'], {ammo="Yamarang",neck="Etoile Gorget +2"})
sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {ammo="Yamarang",neck="Etoile Gorget +2"})
sets.precast.WS['Shark Bite'].Acc = set_combine(sets.precast.WS['Shark Bite'], {ammo="Yamarang",neck="Etoile Gorget +2",waist="Fotia Belt"})
sets.precast.WS['Rudra\'s Storm'].Acc = set_combine(sets.precast.WS['Rudra\'s Storm'], {ammo="Yamarang",neck="Etoile Gorget +2",waist="Fotia Belt"})
------------------------------------------------------------------------------------------------
---------------------------------------- Midcast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.midcast.FastRecast = sets.precast.FC
sets.midcast.SpellInterrupt = {}
sets.midcast.Utsusemi = {}
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
ammo="Yamarang",
head="Malignance Chapeau", --6DT
neck="Loricate Torque +1", --6DT
ear1="Odnowa Earring",
ear2="Odnowa Earring +1",
body="Horos Casaque +3", --6PDT
hands="Malignance Gloves", --5DT
ring2="Vocane Ring", --7DT
ring1="Defending Ring", --10DT
back="Moonbeam Cape", --5DT
waist="Flume Belt +1", --4PDT
legs="Mummu Kecks +2", --5DT
feet="Tandava Crackows",
} --33DT 17PDT =50% Physical, 50% Magical with Shell V
sets.idle.Town = {
ammo="Aurgelmir Orb +1",
head="Malignance Chapeau",
neck="Etoile Gorget +2",
ear1="Telos Earring",
ear2="Sherida Earring",
body="Maxixi Casaque +3",
hands="Malignance Gloves",
ring2="Epaminondas's Ring",
ring1="Gere Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Windbuffet Belt +1",
legs="Horos Tights +3",
feet="Tandava Crackows",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- This is a Set that would only be used when you are NOT Dual Wielding. Most likely Airy Buckler Builds with Fencer as War Sub.
-- There are no haste parameters set for this build, because you wouldn't be juggling DW gear, you would always use the same gear, other than Damage Taken and Accuracy sets which ARE included below.
sets.engaged = {
}
------------------------------------------------------------------------------------------------
-------------------------------------- Dual Wield Sets -----------------------------------------
------------------------------------------------------------------------------------------------
-- * DNC Native DW Trait: 30% DW
-- * DNC Job Points DW Gift: 5% DW
-- No Magic Haste (38% DW to cap)
sets.engaged.DW = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
left_ear="Eabani Earring", --4
right_ear="Suppanomimi", --5
body="Maculele Casaque +1", --11
hands="Adhemar Wrist. +1",
ring1="Hetairoi Ring",
ring2="Epona's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dual Wield"+10',}}, --10
waist="Reiki Yotai", --7
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
} -- 37%
-- 15% Magic Haste (32% DW to cap)
sets.engaged.DW.LowHaste = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="Eabani Earring", --4
right_ear="Suppanomimi", --5
body="Adhemar Jacket +1", --6
hands="Adhemar Wrist. +1",
ring1="Hetairoi Ring",
ring2="Epona's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dual Wield"+10',}}, --10
waist="Reiki Yotai", --7
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
} -- 32%
-- 30% Magic Haste (20% DW to cap)
sets.engaged.DW.MidHaste = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="Brutal Earring", --"Eabani Earring"--4
ear2="Sherida Earring",
body="Maculele Casaque +1", --11
hands="Adhemar Wrist. +1",
ring1="Hetairoi Ring",
ring2="Epona's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Reiki Yotai", --7
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
} -- 18%
-- 40% Magic Haste (8% DW to cap)
sets.engaged.DW.HighHaste = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="Horos Casaque +3",
hands="Adhemar Wrist. +1",
ring1="Hetairoi Ring",
ring2="Epona's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Reiki Yotai", --7
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
} -- 7% Gear
-- 45% Magic Haste (0% DW to cap)
sets.engaged.DW.MaxHaste = {
ammo="Aurgelmir Orb +1",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="Horos Casaque +3",
hands="Adhemar Wrist. +1",
ring1="Hetairoi Ring",
ring2="Epona's Ring",
back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dbl.Atk."+10',}},
waist="Windbuffet Belt +1",
legs="Samnuha Tights",
feet="Horos Toe Shoes +3"
} -- 0% --1220Acc
------------------------------------------------------------------------------------------------
--------------------------------------- Accuracy Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Define three tiers of Accuracy. These sets are cycled with the F9 Button to increase accuracy in stages as desired.
--Max Haste Base 1220Acc
sets.engaged.Acc1 = {head="Horos Tiara +3"} --1267 Acc
sets.engaged.Acc2 = {head="Horos Tiara +3",ammo="Yamarang",hands="Malignance Gloves",} --1294Acc
sets.engaged.Acc3 = {head="Horos Tiara +3",ammo="Yamarang",hands="Malignance Gloves",body="Horos Casaque +3",legs="Mummu Khecks +2",feet="Horos Toe Shoes +3"} --1321Acc legs="Malignance Tights"
-- Base Shield
sets.engaged.LowAcc = set_combine(sets.engaged, sets.engaged.Acc1)
sets.engaged.MidAcc = set_combine(sets.engaged, sets.engaged.Acc2)
sets.engaged.HighAcc = set_combine(sets.engaged, sets.engaged.Acc3)
-- Base DW 1138Acc
sets.engaged.DW.LowAcc = set_combine(sets.engaged.DW, sets.engaged.Acc1) --1185Acc
sets.engaged.DW.MidAcc = set_combine(sets.engaged.DW, sets.engaged.Acc2) --1222Acc
sets.engaged.DW.HighAcc = set_combine(sets.engaged.DW, sets.engaged.Acc3) --1292Acc
-- LowHaste DW 1138Acc
sets.engaged.DW.LowAcc.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Acc1) --1185Acc
sets.engaged.DW.MidAcc.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Acc2) --1222Acc
sets.engaged.DW.HighAcc.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Acc3) --1292Acc
-- MidHaste DW 1133Acc
sets.engaged.DW.LowAcc.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Acc1) --1180Acc
sets.engaged.DW.MidAcc.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Acc2) --1217Acc
sets.engaged.DW.HighAcc.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Acc3) --1288Acc
-- HighHaste DW 1133Acc
sets.engaged.DW.LowAcc.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Acc1) --1180Acc
sets.engaged.DW.MidAcc.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Acc2) --1217Acc
sets.engaged.DW.HighAcc.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Acc3) --1288Acc
-- HighHaste DW 1178Acc
sets.engaged.DW.LowAcc.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.LowAcc) --1225Acc
sets.engaged.DW.MidAcc.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.MidAcc) --1269Acc
sets.engaged.DW.HighAcc.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.HighAcc) --1288Acc
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
-- Define three tiers of Defense Taken. These sets are cycled with the F10 Button.
sets.engaged.DT1 = {ring1="Defending Ring",ring2="Vocane Ring",Neck="Loricate Torque +1"} --23% --Horos Body 6%
sets.engaged.DT2 = {ring1="Defending Ring",ring2="Vocane Ring",Neck="Loricate Torque +1",body="Horos Casaque +3",back={ name="Senuna's Mantle", augments={'Eva.+20 /Mag. Eva.+20','Mag. Evasion+10','Enmity+10','Phys. dmg. taken-10%',}},} --39%
sets.engaged.DT3 = {ring1="Defending Ring",ring2="Vocane Ring",Neck="Loricate Torque +1",back="Moonbeam Cape",waist="Flume Belt +1",ear1="Odnowa Earring",ear2="Odnowa Earring +1",ammo="Staunch Tathlum +1",head="Malignance Chapeau"} --47% --M.Body+3 = 50 Or Aug Odnowa
sets.engaged.DT4 = {head="Malignance Chapeau",body="Turms Harness",hands="Malignance Gloves",legs="Turms Subligar",feet="Malignance Boots",back={ name="Senuna's Mantle", augments={'Eva.+20 /Mag. Eva.+20','Mag. Evasion+10','Enmity+10','Phys. dmg. taken-10%',}},ammo="Yamarang",neck="Warder's Charm",ring1="Defending Ring",ear1="Odnowa Earring",ear2="Odnowa Earring +1"} --51
--body="Malignance Tabard",legs="Malignance Tights"
-- Shield Base
sets.engaged.LOW = set_combine(sets.engaged, sets.engaged.DT1)
sets.engaged.LowAcc.LOW = set_combine(sets.engaged.LowAcc, sets.engaged.DT1)
sets.engaged.MidAcc.LOW = set_combine(sets.engaged.MidAcc, sets.engaged.DT1)
sets.engaged.HighAcc.LOW = set_combine(sets.engaged.HighAcc, sets.engaged.DT1)
sets.engaged.MID = set_combine(sets.engaged, sets.engaged.DT2)
sets.engaged.LowAcc.MID = set_combine(sets.engaged.LowAcc, sets.engaged.DT2)
sets.engaged.MidAcc.MID = set_combine(sets.engaged.MidAcc, sets.engaged.DT2)
sets.engaged.HighAcc.MID = set_combine(sets.engaged.HighAcc, sets.engaged.DT2)
sets.engaged.HIGH = set_combine(sets.engaged, sets.engaged.DT3)
sets.engaged.LowAcc.HIGH = set_combine(sets.engaged.LowAcc, sets.engaged.DT3)
sets.engaged.MidAcc.HIGH = set_combine(sets.engaged.MidAcc, sets.engaged.DT3)
sets.engaged.HighAcc.HIGH = set_combine(sets.engaged.HighAcc, sets.engaged.DT3)
sets.engaged.MagEva = set_combine(sets.engaged, sets.engaged.DT4)
sets.engaged.LowAcc.MagEva = set_combine(sets.engaged.LowAcc, sets.engaged.DT4)
sets.engaged.MidAcc.MagEva = set_combine(sets.engaged.MidAcc, sets.engaged.DT4)
sets.engaged.HighAcc.MagEva = set_combine(sets.engaged.HighAcc, sets.engaged.DT4)
-- No Haste DW
sets.engaged.DW.LOW = set_combine(sets.engaged.DW, sets.engaged.DT1)
sets.engaged.DW.LowAcc.LOW = set_combine(sets.engaged.DW.LowAcc, sets.engaged.DT1)
sets.engaged.DW.MidAcc.LOW = set_combine(sets.engaged.DW.MidAcc, sets.engaged.DT1)
sets.engaged.DW.HighAcc.LOW = set_combine(sets.engaged.DW.HighAcc, sets.engaged.DT1)
sets.engaged.DW.MID = set_combine(sets.engaged.DW, sets.engaged.DT2)
sets.engaged.DW.LowAcc.MID = set_combine(sets.engaged.DW.LowAcc, sets.engaged.DT2)
sets.engaged.DW.MidAcc.MID = set_combine(sets.engaged.DW.MidAcc, sets.engaged.DT2)
sets.engaged.DW.HighAcc.MID = set_combine(sets.engaged.DW.HighAcc, sets.engaged.DT2)
sets.engaged.DW.HIGH = set_combine(sets.engaged.DW, sets.engaged.DT3)
sets.engaged.DW.LowAcc.HIGH = set_combine(sets.engaged.DW.LowAcc, sets.engaged.DT3)
sets.engaged.DW.MidAcc.HIGH = set_combine(sets.engaged.DW.MidAcc, sets.engaged.DT3)
sets.engaged.DW.HighAcc.HIGH = set_combine(sets.engaged.DW.HighAcc, sets.engaged.DT3)
sets.engaged.DW.MagEva = set_combine(sets.engaged.DW, sets.engaged.DT4)
sets.engaged.DW.LowAcc.MagEva = set_combine(sets.engaged.DW.LowAcc, sets.engaged.DT4)
sets.engaged.DW.MidAcc.MagEva = set_combine(sets.engaged.DW.MidAcc, sets.engaged.DT4)
sets.engaged.DW.HighAcc.MagEva = set_combine(sets.engaged.DW.HighAcc, sets.engaged.DT4)
-- Low Haste DW
sets.engaged.DW.LOW.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT1)
sets.engaged.DW.LowAcc.LOW.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.DT1)
sets.engaged.DW.MidAcc.LOW.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.DT1)
sets.engaged.DW.HighAcc.LOW.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.DT1)
sets.engaged.DW.MID.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT2)
sets.engaged.DW.LowAcc.MID.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.DT2)
sets.engaged.DW.MidAcc.MID.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.DT2)
sets.engaged.DW.HighAcc.MID.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT3)
sets.engaged.DW.LowAcc.HIGH.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.DT3)
sets.engaged.DW.MidAcc.HIGH.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.DT3)
sets.engaged.DW.HighAcc.HIGH.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT4)
sets.engaged.DW.LowAcc.MagEva.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.DT4)
sets.engaged.DW.MidAcc.MagEva.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.DT4)
sets.engaged.DW.HighAcc.MagEva.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.DT4)
-- Mid Haste
sets.engaged.DW.LOW.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT1)
sets.engaged.DW.LowAcc.LOW.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.DT1)
sets.engaged.DW.MidAcc.LOW.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.DT1)
sets.engaged.DW.HighAcc.LOW.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT2)
sets.engaged.DW.LowAcc.MID.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.DT2)
sets.engaged.DW.MidAcc.MID.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.DT2)
sets.engaged.DW.HighAcc.MID.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT3)
sets.engaged.DW.LowAcc.HIGH.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.DT3)
sets.engaged.DW.MidAcc.HIGH.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.DT3)
sets.engaged.DW.HighAcc.HIGH.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT4)
sets.engaged.DW.LowAcc.MagEva.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.DT4)
sets.engaged.DW.MidAcc.MagEva.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.DT4)
sets.engaged.DW.HighAcc.MagEva.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.DT4)
-- High Haste
sets.engaged.DW.LOW.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT1)
sets.engaged.DW.LowAcc.LOW.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.DT1)
sets.engaged.DW.MidAcc.LOW.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.DT1)
sets.engaged.DW.HighAcc.LOW.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.DT1)
sets.engaged.DW.MID.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT2)
sets.engaged.DW.LowAcc.MID.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.DT2)
sets.engaged.DW.MidAcc.MID.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.DT2)
sets.engaged.DW.HighAcc.MID.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT3)
sets.engaged.DW.LowAcc.HIGH.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.DT3)
sets.engaged.DW.MidAcc.HIGH.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.DT3)
sets.engaged.DW.HighAcc.HIGH.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT4)
sets.engaged.DW.LowAcc.MagEva.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.DT4)
sets.engaged.DW.MidAcc.MagEva.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.DT4)
sets.engaged.DW.HighAcc.MagEva.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.DT4)
-- Max Haste
sets.engaged.DW.LOW.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.LowAcc.LOW.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.MidAcc.LOW.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.HighAcc.LOW.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.LowAcc.MID.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.MidAcc.MID.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.HighAcc.MID.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.LowAcc.HIGH.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.MidAcc.HIGH.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.HighAcc.HIGH.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT4)
sets.engaged.DW.LowAcc.MagEva.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.DT4)
sets.engaged.DW.MidAcc.MagEva.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.DT4)
sets.engaged.DW.HighAcc.MagEva.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.DT4)
------------------------------------------------------------------------------------------------
---------------------------------------- Weapon Sets -------------------------------------------
------------------------------------------------------------------------------------------------
sets.AnusTwat = {main="Aeneas",sub="Twashtar"}
sets.TauretTwat = {main="Tauret",sub="Twashtar"}
sets.TwatCento = {main="Twashtar",sub="Centovente"}
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- sets.buff.Doom = {}
-- sets.buff['Saber Dance'] = {legs="Horos Tights +3"}
-- sets.buff['Fan Dance'] = {hands="Horos Bangles +3"}
-- sets.buff['Closed Position'] = {feet="Horos T. Shoes +3"}
sets.buff['Climactic Flourish'] = {head="Maculele Tiara +1",body="Meg. Cuirie +2"}
sets.Warp = {ring1="Dim. Ring (Holla)",ring2="Warp Ring",ear1="Reraise Earring",}
sets.CP = {back="Mecisto. Mantle"}
sets.MP = {Ear2="Ethereal Earring",Waist="Flume Belt +1",}
sets.Neck = {neck="Uggalepih Necklace",}
sets.Dynamis = {Neck="Etoile Gorget +2",feet="Malignance Boots",}
sets.TH = {main="Taming Sari",head="White Rarab Cap +1",feet={ name="Herculean Boots", augments={'"Mag.Atk.Bns."+23','MND+5','"Treasure Hunter"+1','Mag. Acc.+17 "Mag.Atk.Bns."+17',}},sub="Taming Sari",}
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 spellMap == 'Utsusemi' then
if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
cancel_spell()
add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
eventArgs.handled = true
return
elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
end
end
-- Used to overwrite Moonshade Earring if TP is more than 2750.
if spell.type == 'WeaponSkill' then
if player.tp > 2750 then
equip({left_ear = "Telos Earring"})
end
-- Used to optimize Rudra's Storm when Climactic Flourish is active.
if spell.english == "Rudra's Storm" and buffactive['Climactic Flourish'] then
equip({head="Maculele Tiara +1",right_ear="Ishvara Earring",body="Meghanada Cuirie +2",ammo="Charis Feather"})
end
-- Test Section to combine functions
if state.Buff['Sneak Attack'] == true then
equip(sets.precast.WS.Critical)
end
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == "WeaponSkill" then
if state.Buff['Sneak Attack'] == true then
equip(sets.precast.WS.Critical)
end
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
if spell.english == "Curing Waltz" or spell.english == "Curing Waltz II" or spell.english == "Curing Waltz III" or spell.english == "Curing Waltz IV" or spell.english == "Curing Waltz V" and spell.target.type == 'SELF' then
if state.CastingMode.value == 'Enmity' then
equip(sets.precast.WaltzSelf.Enmity)
else
equip(sets.precast.WaltzSelf)
end
end
end
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_aftercast(spell, action, spellMap, eventArgs)
-- Weaponskills wipe SATA. Turn those state vars off before default gearing is attempted.
if spell.type == 'WeaponSkill' and not spell.interrupted then
state.Buff['Sneak Attack'] = false
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff,gain)
if buff == 'Saber Dance' or buff == 'Climactic Flourish' or buff == 'Fan Dance' then
handle_equipping_gear(player.status)
end
if buff == "doom" then
if gain then
equip(sets.buff.Doom)
send_command('@input /echo Doomed.')
disable()
else
enable()
handle_equipping_gear(player.status)
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function job_handle_equipping_gear(playerStatus, eventArgs)
update_combat_form()
determine_haste_group()
end
function job_update(cmdParams, eventArgs)
handle_equipping_gear(player.status)
end
function update_combat_form()
if DW == true then
state.CombatForm:set('DW')
elseif DW == false then
state.CombatForm:reset()
end
end
function get_custom_wsmode(spell, spellMap, defaut_wsmode)
local wsmode
if state.Buff['Sneak Attack'] then
wsmode = 'SA'
end
return wsmode
end
function customize_idle_set(idleSet)
if state.CombatWeapon.value == 'AnusTwat' then
idleSet = set_combine(idleSet, sets.AnusTwat)
end
if state.CombatWeapon.value == 'TauretTwat' then
idleSet = set_combine(idleSet, sets.TauretTwat)
end
if state.CombatWeapon.value == 'TwatCento' then
idleSet = set_combine(idleSet, sets.TwatCento)
end
if state.CP.current == 'on' then
equip(sets.CP)
disable('back')
else
enable('back')
end
if state.Warp.current == 'on' then
equip(sets.Warp)
disable('ring1')
disable('ring2')
disable('ear1')
else
enable('ring1')
enable('ring2')
enable('ear1')
end
if state.MP.current == 'on' then
equip(sets.MP)
disable('Waist')
disable('Ear2')
else
enable('Waist')
enable('Ear2')
end
if state.TH.current == 'on' then
equip(sets.TH)
disable('Feet')
disable('Head')
else
enable('Feet')
enable('Head')
end
if state.Dynamis.current == 'on' then
equip(sets.Dynamis)
disable('Neck')
disable('Feet')
else
enable('Neck')
disable('Feet')
end
return idleSet
end
function customize_melee_set(meleeSet)
if state.Buff['Climactic Flourish'] then
meleeSet = set_combine(meleeSet, sets.buff['Climactic Flourish'])
end
if state.CombatWeapon.value == 'AnusTwat' then
meleeSet = set_combine(meleeSet, sets.AnusTwat)
end
if state.CombatWeapon.value == 'TauretTwat' then
meleeSet = set_combine(meleeSet, sets.TauretTwat)
end
if state.CombatWeapon.value == 'TwatCento' then
meleeSet = set_combine(meleeSet, sets.TwatCento)
end
if state.CP.current == 'on' then
equip(sets.CP)
disable('back')
else
enable('back')
end
if state.Warp.current == 'on' then
equip(sets.Warp)
disable('ring1')
disable('ring2')
else
enable('ring1')
enable('ring2')
end
if state.MP.current == 'on' then
equip(sets.MP)
disable('Waist')
disable('Ear2')
else
enable('Waist')
enable('Ear2')
end
if state.TH.current == 'on' then
equip(sets.TH)
disable('Feet')
disable('Head')
else
enable('Feet')
enable('Head')
end
if state.Dynamis.current == 'on' then
equip(sets.Dynamis)
disable('Neck')
else
enable('Neck')
end
return meleeSet
end
-- Handle auto-targetting based on local setup.
function job_auto_change_target(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
if state.IgnoreTargetting.value == true then
state.IgnoreTargetting:reset()
eventArgs.handled = true
end
eventArgs.SelectNPCTargets = state.SelectStepTarget.value
end
end
-- Function to display the current relevant user state when doing an update.
-- Set eventArgs.handled to true if display was handled, and you don't want the default info shown.
function display_current_job_state(eventArgs)
local msg = '[ Melee'
if state.CombatForm.has_value then
msg = msg .. ' (' .. state.CombatForm.value .. ')'
end
msg = msg .. ': '
msg = msg .. state.OffenseMode.value
if state.HybridMode.value ~= 'Normal' then
msg = msg .. '/' .. state.HybridMode.value
end
msg = msg .. ' ][ WS: ' .. state.WeaponskillMode.value .. ' ]'
if state.DefenseMode.value ~= 'None' then
msg = msg .. '[ Defense: ' .. state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ' ]'
end
if state.ClosedPosition.value then
msg = msg .. '[ Closed Position: ON ]'
end
if state.Kiting.value then
msg = msg .. '[ Kiting Mode: ON ]'
end
msg = msg .. '[ '..state.MainStep.current
if state.UseAltStep.value == true then
msg = msg .. '/'..state.AltStep.current
end
msg = msg .. ' ]'
add_to_chat(123, msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
function determine_haste_group()
classes.CustomMeleeGroups:clear()
if DW == true then
if DW_needed <= 1 then
classes.CustomMeleeGroups:append('MaxHaste')
elseif DW_needed > 1 and DW_needed <= 9 then
classes.CustomMeleeGroups:append('HighHaste')
elseif DW_needed > 9 and DW_needed <= 21 then
classes.CustomMeleeGroups:append('MidHaste')
elseif DW_needed > 21 and DW_needed <= 38 then
classes.CustomMeleeGroups:append('LowHaste')
elseif DW_needed > 38 then
classes.CustomMeleeGroups:append('')
end
end
end
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'step' then
if cmdParams[2] == 't' then
state.IgnoreTargetting:set()
end
local doStep = ''
if state.UseAltStep.value == true then
doStep = state[state.CurrentStep.current..'Step'].current
state.CurrentStep:cycle()
else
doStep = state.MainStep.current
end
send_command('@input /ja "'..doStep..'" <t>')
end
gearinfo(cmdParams, eventArgs)
end
function gearinfo(cmdParams, eventArgs)
if cmdParams[1] == 'gearinfo' then
if type(tonumber(cmdParams[2])) == 'number' then
if tonumber(cmdParams[2]) ~= DW_needed then
DW_needed = tonumber(cmdParams[2])
DW = true
end
elseif type(cmdParams[2]) == 'string' then
if cmdParams[2] == 'false' then
DW_needed = 0
DW = false
end
end
if type(tonumber(cmdParams[3])) == 'number' then
if tonumber(cmdParams[3]) ~= Haste then
Haste = tonumber(cmdParams[3])
end
end
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
-- If you attempt to use a step, this will automatically use Presto.
function job_pretarget(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
local allRecasts = windower.ffxi.get_ability_recasts()
local prestoCooldown = allRecasts[236]
if player.main_job_level >= 77 and prestoCooldown < 1 and not buffactive['Presto'] then
cast_delay(1.1)
send_command('input /ja "Presto" <me>')
end
end
-- If you attempt to use Climactic Flourish with less than 4 finishing moves, this will automatically use 'Current Step' and resend Climactic Flourish.
local under4FMs = not buffactive['Finishing Move 4'] and not buffactive['Finishing Move 5'] and not buffactive['Finishing Move (6+)']
local doStep = ''
local doStep = state.MainStep.current
if spell.english == "Climactic Flourish" and under4FMs then
cast_delay(1.9)
send_command('@input /ja "'..doStep..'" <t>')
end
end
-- Automatically loads a Macro Set by: (Pallet,Book)
function select_default_macro_book()
if player.sub_job == 'SAM' then
set_macro_page(1, 5)
elseif player.sub_job == 'WAR' then
set_macro_page(2, 5)
elseif player.sub_job == 'RUN' then
set_macro_page(3, 5)
elseif player.sub_job == 'DRG' then
set_macro_page(5, 5)
elseif player.sub_job == 'BLU' then
set_macro_page(6, 5)
elseif player.sub_job == 'THF' then
set_macro_page(9, 5)
elseif player.sub_job == 'NIN' then
set_macro_page(10, 5)
else
set_macro_page(1, 5)
end
end
function set_lockstyle()
send_command('wait 2; input /lockstyleset ' .. lockstyleset)
end
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2020-09-27 22:28:03
In the 'Gear' tab, go to Cell AL20 (Custom Crit %) and input 19%. This is the average expected from 0tp to 1000tp, divided by 2, as it only works in a single hand. This is a close but rough, estimate. would be slightly more accurate to take your average tp return and your average ws instead of 0 and 1000 if wsing at 1000, especially so if you are holding to higher values
By SimonSes 2020-09-28 03:26:41
This is not how you share link to sheet. You need to go to File>Share>GetLink change to Anyone with link - Viewer. Copy link and post.
Current link leads to page that let you ask for request to edit.
** If you want to test Tauret DPS, you need to do 2 things:
1: In the 'Gear' tab, go to Cell AL20 (Custom Crit %) and input 19%. This is the average expected from 0tp to 1000tp, divided by 2, as it only works in a single hand. This is a close but rough, estimate.
2: In the 'Data' tab, go to Cell E211 (Relic Bonus) and manually force 150%.
This should give you the 50% WSD + 19% Crit Rate from a Tauret, for fairly accurate DPS calculations.
Why not simply make it change automatically when you equip Tauret?
サーバ: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2020-09-28 11:20:20
Current link leads to page that let you ask for request to edit.
Fixed, I think.
Why not simply make it change automatically when you equip Tauret?
If you add the Crit % to the weapon, it will be calculated into the WS data as well, which is not accurate. Manually putting it only into the Custom line for 'TP' will prevent that, only apply the Crit % to the TP phase, and won't alter WS damage.
Adding 50% WSD to the Weapon in 'Gear List', will only add about ~1000dmg to the WS Damage. Adding it to the WS Custom line, results in the same. I don't know why, but based on everything I've read here and the Thf forums, the above method is the best work around. I asked on both Dnc and Thf forums for the best handing of Tauret and this was the answer I got.
I do not fully comprehend the back end of DPS sheets, it is my ASSumption that WSD in the sheet is only calculated to effect the first hit of a WS, whereas Tauret applies to all hits.
If you have a fix, by all means, please share.
By malakef 2020-09-28 12:51:50
I think he is saying just add some IF statements to the crit calculations. It’s very similar to how the Charis is set up and leaves it cleaner for swapping back and forth.
Also I hate how the PDif is done here and it actually won’t account for PD limit increase from malignance, or anything outside the JSE neck, if you wanted to see what it did for WS and melee damage. It’s also independently calculate 2 times when it should just reference the first time.
Pyrrhic cleos has mistakenly been added to only give 45% WSD when it’s actually 49.5% because of multiplicative properties.
Should probably be noted that the defense down on the setup page in cell N4 is outside of frailty use which is calculated later. It’s working properly but I really wouldn’t have set it up that way but to each there own.
[+]
サーバ: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2020-09-28 13:03:36
I think he is saying just add some IF statements to the crit calculations. It’s very similar to how the Charis is set up and leaves it cleaner for swapping back and forth.
Also I hate how the PDif is done here and it actually won’t account for PD limit increase from malignance, or anything outside the JSE neck, if you wanted to see what it did for WS and melee damage. It’s also independently calculate 2 times when it should just reference the first time.
Pyrrhic cleos has mistakenly been added to only give 45% WSD when it’s actually 49.5% because of multiplicative properties.
Should probably be noted that the defense down on the setup page in cell N4 is outside of frailty use which is calculated later. It’s working properly but I really wouldn’t have set it up that way but to each there own.
First and foremost, thank you for the helpful insight.
Having said that, I'll be honest with you, a lot of this is over my head. I'm just trying to offer some up to date help, as the only DPS sheet you can reasonably locate for Dnc is multiple years old. People regularly ask for an updated sheet in the big thread, but no one ever answers. I didn't create this, I've just updated it, so anything on the back end, is truly beyond me. I apologize for that.
If you know how to fix/correct it, please feel free, send me the link to the new version, and I will update the OP with your link.
By malakef 2020-10-15 08:53:56
Ok so I had a bit of time a few days ago to work on it some. I really need another day or two cause I keep finding issues but it’s probably at a decent point now. Updated sheet can be found https://docs.google.com/spreadsheets/d/1I83cojrh7PCpdkF_FlJoGgYVV7MwKyt3ldGzORMcpTU/edit?usp=sharing. You will need to download a copy of it. This was done intentionally so this version doesn’t get random updates by people.
List of some changes below:
PDIF changed from base 3.25 to 3.45
PDIL now calculates for JSE Necks AND any additional gear like malignance
Smite bonus was applying when /war, however smite is only for 2 handed or H2H weapons…
Occasionally deal triple damage was still only doing *2.. someone changed the label but not the formula at some point
In addition, I have changed this to ODX (occasionally deals x ) where the x values and percent procs are now set on the gear tabs by weapon. This means besides twash, Setan (A) dagger works now and will work for future weapons that may have a similar mechanic. This also means you no longer need to manually add it in but it is currently set to the 1k value of the AM which is more likely the case anyways. It also may falsely assume you use rudra’s with twash but that seems a safe assumption for now.
Augmented Terpsichore had 2 flaws, first was it showed only 45% WSD instead of 49.5%, and second it wasn’t having mythic aftermath applied even when you selected the option. Both have been fixed.
Tauret now calculates 19% crit rate during TP phase when in MAIN hand only and zero added during WS phase. In addition the 50% bonus damage to Evisceration is now calculating. We can argue over the 19%. I don’t care it’s a simple fix for me.
Follow up Attack mechanic has been added properly (don’t get me started on how this was in there before…) and Column added to gear list for future items to have it. This means Setan (B) now works. FUA is ONLY functional main hand. I don’t think anything exist in offhand for FUA anyways but if it does I’d have to adjust.
I have reworked the formula for REMA bonus to instead of being a crap ton of nested if statements to now do look ups based on the weapon. All you the user need do is fill out the stats on the gear list, like any other stat, if we get any new weapons like these.
Building flourish was only giving the acc and/or attack boost but not the WSD from JP. This has now been fixed.
Sub DRG has been added as an option and the associated +7% WSD is functional.
Fencer build seems to be functional but I didn’t mess with it a ton.
Someone should probably take time and confirm all the stats on the gear list tab. Found a couple of mistypes and missing stats (kentarch belt didn’t have its acc listed for instance) for some items but didn’t go over them closely just a cursory glance at some things.
Bunch of other crap I stopped keeping track of. The longer I’m in the sheet the more I find and I have ran out of time for the moment. This is the problem with multiple people editing over the years with various levels of understanding both with excel and with game formulas. Just because you know how to add Cell A + cell B doesn’t mean you know excel…
[+]
Quetzalcoatl.Langly
サーバ: Quetzalcoatl
Game: FFXI
Posts: 684
By Quetzalcoatl.Langly 2020-10-15 09:17:39
I was going to double check some of your work but Google Sheets doesn't display some fields correctly (if at all), and when exported, Excel has a fit and says nearly ~everything~ is improperly referenced or misspelled.
Sorry. *shrugs*
By malakef 2020-10-15 09:21:03
Yeah I forget google sheets is dumb like that sometimes. Hold on a sec.
Ok this should force it as an excel file rather than a google sheets file....
https://drive.google.com/file/d/1rJBZhHnjrArveEhE2SbJU0WMiGzFNcZX/view?usp=sharing
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2020-10-15 11:01:04
FUA is definitely wrong.
By SimonSes 2020-10-15 11:49:46
Follow up Attack mechanic has been added properly (don’t get me started on how this was in there before…)
Maybe lets get started how it was there before lol
Why I think it was simply calculated by adding 0.5 attack per round? This implementation would be good, if you have no Quadruple attack in gear while dual wielding, because then it wouldn't properly calculate rounds with 2x QA proc. So right implementation should be fixed +0.5 attack per round, but with check added for 8hit rounds limit when you have QA.
Current implementation in sheet is totally wrong, because its based on MA proc. For example if you manually add enough DA or TA to get 100% of them, you get no increase of attack per round with 50% FUA. 50% FUA is always +0.5 attack per round, regardless of MA proc.
By malakef 2020-10-15 11:56:08
Oh then maybe it’s my misunderstanding. Based on what little info is out there it appears that FUA is checked last and if something else went off it doesn’t happen. But it seems it always gives an additional attack chance at the stated percent instead? Up until 8 hits anyways?
Edit. Ok I reverted the FUA calc mostly to how it was, at least in functionality. It still needs a tweak to check for 8 hits and then accuracy applied but I’ll get to that later.
By SimonSes 2020-10-15 16:08:54
Oh then maybe it’s my misunderstanding. Based on what little info is out there it appears that FUA is checked last and if something else went off it doesn’t happen. But it seems it always gives an additional attack chance at the stated percent instead? Up until 8 hits anyways?
Edit. Ok I reverted the FUA calc mostly to how it was, at least in functionality. It still needs a tweak to check for 8 hits and then accuracy applied but I’ll get to that later.
It's checked last, but its checked always. The only thing that blocks it is 8hit per round limit.
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2020-10-15 16:11:39
its checked before any offhand procs, so nothing blocks it.
By SimonSes 2020-10-15 16:18:13
its checked before any offhand procs, so nothing blocks it.
Oh, didnt know that. That being said, there is still conflict there. QA+FOA+QA will produce 9 hits and will be cut to 8, which should be included in avg per hit calculation. DNC is still easier to handle here, than MNK or NIN with their kick attack and Daken >.>
Ramuh.Austar
サーバ: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2020-10-15 16:20:38
yes, but it would be easier to just add the 0.5 to mainhand and then modify the formula for offhand to account for FUA procs
By SimonSes 2020-10-15 16:35:40
yes, but it would be easier to just add the 0.5 to mainhand and then modify the formula for offhand to account for FUA procs
I think currently in most spreadsheets it is exactly just +0.5 to main hand, but without changing the formula for offhand. Which result in slightly better performance than it should if you have QA.
By malakef 2020-10-15 17:21:58
Yeah and the reason the spreadsheets do that is because of how they were set up ages ago. It sounds like an easy fix but there is a probability table, sort of, that is referenced for hits on a WS and it’s so baked into the formulas it’s not fun to change it around. I did a version that semi does this but if you didn’t know and just looked at the table it would be odd so I’m keeping that back for now. We are currently getting around this in the avg rounds to WS cell in the melee tab by creating a unique formula for just FUA weapons. It’s not perfect but it’s reasonable which is all we really get out of DPS spreadsheets anyways (the whole averages of averages problem).
Austar’s solution would work but requires more rework of existing formulas and logic. I can get to it eventually but depends when I get free time.
Necro Bump Detected!
[212 days between previous and next post]
サーバ: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2021-05-15 16:16:21
Nvm. Had to go through some link hoops outside of Dnc forum, but Simon has an updated DPS Sheet here, with Gleti, Nyame, updated Feb 2021:
https://docs.google.com/spreadsheets/d/1gs90pbRsmja6H7CzRT2GYWAW0J9dKlgrOcumH-oaXGk/edit#gid=1448206331
DPS Sheet
First, here is an up to date DPS sheet for anyone to copy if they like. PLEASE be aware, all of the Buff Values are based on TRUSTS. It's easier to update the buff values to whatever you want, than for me to copy over all the updated gear sets. This sheet has all current relevant gear that I'm aware of for Dnc. I eliminated a ton of stuff that was outdated to clean up the 'Gear' tab, with plenty of blanks for anyone to input whatever items (or custom augmented gear) as they desire.
You shouldn't need to request to edit. To keep the original file clean (so multiple people aren't screwing with the same sheet) go to 'File' and select 'Make Copy'. This will give you your own copy of the spreadsheet to customize, input your own Augmented gear, and do with as you please.
https://docs.google.com/spreadsheets/d/1GR2XcweDPqimAN2LqKLU1W8hfUbQNjA-foU3iPnLKec/edit?usp=sharing
** If you want to test Tauret DPS, you need to do 2 things:
1: In the 'Gear' tab, go to Cell AL20 (Custom Crit %) and input 19%. This is the average expected from 0tp to 1000tp, divided by 2, as it only works in a single hand. This is a close but rough, estimate.
2: In the 'Data' tab, go to Cell E211 (Relic Bonus) and manually force 150%.
This should give you the 50% WSD + 19% Crit Rate from a Tauret, for fairly accurate DPS calculations.
Skeleton LUA
Here is a Skeleton Dancer Lua, with nearly everything stripped down. I left a full blank gear set in, so you can see exactly what to fill IF you want. I believe all Job Abilities are in there, but left blank, so that you don't have to customize them if you don't want. They will work, and just not swap anything currently.
You can toss a TP, WS, and Idle set into this lua, and cover 90% of a Dancer's needs without touching anything else. But it has a lot more utility if you get comfortable/confident with gearswap down the road.
Code -- Initialization function for this job file.
function get_sets()
mote_include_version = 2
include('Mote-Include.lua')
end
-- Setup variables that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.Buff['Climactic Flourish'] = buffactive['climactic flourish'] or false
state.MainStep = M{['description']='Main Step', 'Box Step', 'Quickstep', 'Feather Step', 'Stutter Step'}
state.SelectStepTarget = M(false, 'Select Step Target')
state.IgnoreTargetting = M(true, 'Ignore Targetting')
state.ClosedPosition = M(false, 'Closed Position')
lockstyleset = 15
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
-- Gear Modes
function user_setup()
state.HybridMode:options('Normal', 'MagEva', 'HIGH', 'MID', 'LOW')
-- Additional Key Binds.
send_command('bind ^` input /ja "Chocobo Jig II" <me>') --Ctrl'~'
send_command('bind !` input /ja "Spectral Jig" <me>') --Alt'~'
send_command('bind f9 gs c cycle OffenseMode') --F9
send_command('bind f10 gs c cycle HybridMode') --F10
send_command('bind f11 gs c cycle mainstep') --F11
send_command('bind ^c input /ja "Contradance" <me>') --Ctrl'C'
send_command('bind ^t input /ja "Trance" <me>') --Ctrl'T'
send_command('bind ^g input /ja "Grand Pas" <me>') --Ctrl'G'
send_command('lua l gearinfo') --If you don't have GearInfo, Haste tiers won't work properly.
select_default_macro_book()
set_lockstyle()
Haste = 0
DW_needed = 0
DW = false
moving = false
update_combat_form()
determine_haste_group()
end
-- Erases the Key Binds above when you switch to another job.
function user_unload()
send_command('unbind ^`')
send_command('unbind !`')
send_command('unbind f11')
send_command('gs enable all')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.JA['No Foot Rise'] = {body="Horos Casaque +3"}
sets.precast.JA['Trance'] = {}
sets.precast.JA['Grand Pas'] = {}
sets.precast.JA['Contradance'] = {}
sets.precast.JA['Saber Dance'] = {}
sets.precast.JA['Fan Dance'] = {}
sets.precast.JA['Presto'] = {}
sets.precast.Waltz = {
head="Anwig Salade",
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --50%
sets.precast.WaltzSelf = {
ammo="Yamarang", --5
head="Mummu Bonnet +2", --0/9R
neck="Etoile Gorget +2", --10
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
ring2="Asklepian Ring", --0/3R
back="Toetapper Mantle", --5
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --70/20R
sets.precast.Samba = {}
sets.precast.Jig = {}
sets.precast.Step = {}
sets.precast.Step['Feather Step'] = {}
sets.precast.Flourish1 = {}
sets.precast.Flourish1['Animated Flourish'] = {}
sets.precast.Flourish1['Violent Flourish'] = {}
sets.precast.Flourish1['Desperate Flourish'] = {}
sets.precast.Flourish2 = {}
sets.precast.Flourish2['Reverse Flourish'] = {hands="Macu. Bangles +1",back="Toetapper Mantle"}
sets.precast.Flourish3 = {}
sets.precast.Flourish3['Striking Flourish'] = {}
sets.precast.Flourish3['Climactic Flourish'] = {}
sets.precast.FC = {}
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {body="Passion Jacket",neck="Magoraga Beads"})
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.WS.Critical = {body="Meg. Cuirie +2"}
sets.precast.WS = {}
sets.precast.WS['Exenterator'] = {}
sets.precast.WS['Pyrrhic Kleos'] = {}
sets.precast.WS['Evisceration'] = {}
sets.precast.WS['Shark Bite'] = {}
sets.precast.WS['Aeolian Edge'] = {}
sets.precast.WS['Rudra\'s Storm'] = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
sets.idle.Town = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- This is a Set that would only be used when you are NOT Dual Wielding. Most likely Airy Buckler Builds with Fencer as War Sub.
-- There are no haste parameters set for this build, because you wouldn't be juggling DW gear, you would always use the same gear, other than Damage Taken and Accuracy sets which ARE included below.
sets.engaged = {}
------------------------------------------------------------------------------------------------
-------------------------------------- Dual Wield Sets -----------------------------------------
------------------------------------------------------------------------------------------------
-- * DNC Native DW Trait: 30% DW
-- * DNC Job Points DW Gift: 5% DW
-- No Magic Haste (38% DW to cap)
sets.engaged.DW = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 15% Magic Haste (32% DW to cap)
sets.engaged.DW.LowHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 30% Magic Haste (20% DW to cap)
sets.engaged.DW.MidHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 40% Magic Haste (8% DW to cap)
sets.engaged.DW.HighHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 45% Magic Haste (0% DW to cap)
sets.engaged.DW.MaxHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
-- Define tiers of Defense Taken. These sets are cycled with the F10 Button.
sets.engaged.DT1 = {ring1="Defending Ring",ring2="Vocane Ring",Neck="Loricate Torque +1"} --23%
sets.engaged.DT2 = {}
sets.engaged.DT3 = {}
sets.engaged.DT4 = {}
-- Shield Base
sets.engaged.LOW = set_combine(sets.engaged, sets.engaged.DT1)
sets.engaged.MID = set_combine(sets.engaged, sets.engaged.DT2)
sets.engaged.HIGH = set_combine(sets.engaged, sets.engaged.DT3)
sets.engaged.MagEva = set_combine(sets.engaged, sets.engaged.DT4)
-- No Haste DW
sets.engaged.DW.LOW = set_combine(sets.engaged.DW, sets.engaged.DT1)
sets.engaged.DW.MID = set_combine(sets.engaged.DW, sets.engaged.DT2)
sets.engaged.DW.HIGH = set_combine(sets.engaged.DW, sets.engaged.DT3)
sets.engaged.DW.MagEva = set_combine(sets.engaged.DW, sets.engaged.DT4)
-- Low Haste DW
sets.engaged.DW.LOW.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT1)
sets.engaged.DW.MID.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT4)
-- Mid Haste
sets.engaged.DW.LOW.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT4)
-- High Haste
sets.engaged.DW.LOW.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT1)
sets.engaged.DW.MID.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT4)
-- Max Haste
sets.engaged.DW.LOW.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT4)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.buff.Doom = {}
sets.buff['Saber Dance'] = {}
sets.buff['Fan Dance'] = {}
sets.buff['Closed Position'] = {}
sets.buff['Climactic Flourish'] = {head="Maculele Tiara +1",body="Meg. Cuirie +2"}
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 spellMap == 'Utsusemi' then
if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
cancel_spell()
add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
eventArgs.handled = true
return
elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
end
end
-- Used to overwrite Moonshade Earring if TP is more than 2750.
if spell.type == 'WeaponSkill' then
if player.tp > 2750 then
equip({ear1 = "Telos Earring"})
end
-- Used to optimize Rudra's Storm when Climactic Flourish is active.
if spell.english == "Rudra's Storm" and buffactive['Climactic Flourish'] then
equip({head="Maculele Tiara +1",ear2="Ishvara Earring",body="Meghanada Cuirie +2",ammo="Charis Feather"})
end
-- If a forced Critical Hit is coming, this prioritizes gear to maximize Crit Dmg
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == "WeaponSkill" then
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
--This will detect if you are Waltzing yourself, and if so, equip gear that maximizes 'walts effect received' stats.
if spell.english == "Curing Waltz" or spell.english == "Curing Waltz II" or spell.english == "Curing Waltz III" or spell.english == "Curing Waltz IV" or spell.english == "Curing Waltz V" and spell.target.type == 'SELF' then
equip(sets.precast.WaltzSelf)
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff,gain)
if buff == 'Saber Dance' or buff == 'Climactic Flourish' or buff == 'Fan Dance' then
handle_equipping_gear(player.status)
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function job_handle_equipping_gear(playerStatus, eventArgs)
update_combat_form()
determine_haste_group()
end
function job_update(cmdParams, eventArgs)
handle_equipping_gear(player.status)
end
function update_combat_form()
if DW == true then
state.CombatForm:set('DW')
elseif DW == false then
state.CombatForm:reset()
end
end
function get_custom_wsmode(spell, spellMap, defaut_wsmode)
local wsmode
return wsmode
end
function customize_idle_set(idleSet)
return idleSet
end
function customize_melee_set(meleeSet)
if state.Buff['Climactic Flourish'] then
meleeSet = set_combine(meleeSet, sets.buff['Climactic Flourish'])
end
return meleeSet
end
-- Handle auto-targetting based on local setup.
function job_auto_change_target(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
if state.IgnoreTargetting.value == true then
state.IgnoreTargetting:reset()
eventArgs.handled = true
end
eventArgs.SelectNPCTargets = state.SelectStepTarget.value
end
end
-- Function to display the current relevant user state when doing an update.
-- Set eventArgs.handled to true if display was handled, and you don't want the default info shown.
function display_current_job_state(eventArgs)
local msg = '[ Melee'
if state.CombatForm.has_value then
msg = msg .. ' (' .. state.CombatForm.value .. ')'
end
msg = msg .. ': '
msg = msg .. state.OffenseMode.value
if state.HybridMode.value ~= 'Normal' then
msg = msg .. '/' .. state.HybridMode.value
end
msg = msg .. ' ][ WS: ' .. state.WeaponskillMode.value .. ' ]'
if state.DefenseMode.value ~= 'None' then
msg = msg .. '[ Defense: ' .. state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ' ]'
end
if state.ClosedPosition.value then
msg = msg .. '[ Closed Position: ON ]'
end
if state.Kiting.value then
msg = msg .. '[ Kiting Mode: ON ]'
end
msg = msg .. '[ '..state.MainStep.current
msg = msg .. ' ]'
add_to_chat(123, msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
function determine_haste_group()
classes.CustomMeleeGroups:clear()
if DW == true then
if DW_needed <= 1 then
classes.CustomMeleeGroups:append('MaxHaste')
elseif DW_needed > 1 and DW_needed <= 9 then
classes.CustomMeleeGroups:append('HighHaste')
elseif DW_needed > 9 and DW_needed <= 21 then
classes.CustomMeleeGroups:append('MidHaste')
elseif DW_needed > 21 and DW_needed <= 38 then
classes.CustomMeleeGroups:append('LowHaste')
elseif DW_needed > 38 then
classes.CustomMeleeGroups:append('')
end
end
end
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'step' then
if cmdParams[2] == 't' then
state.IgnoreTargetting:set()
end
local doStep = ''
if state.UseAltStep.value == true then
doStep = state[state.CurrentStep.current..'Step'].current
state.CurrentStep:cycle()
else
doStep = state.MainStep.current
end
send_command('@input /ja "'..doStep..'" <t>')
end
gearinfo(cmdParams, eventArgs)
end
function gearinfo(cmdParams, eventArgs)
if cmdParams[1] == 'gearinfo' then
if type(tonumber(cmdParams[2])) == 'number' then
if tonumber(cmdParams[2]) ~= DW_needed then
DW_needed = tonumber(cmdParams[2])
DW = true
end
elseif type(cmdParams[2]) == 'string' then
if cmdParams[2] == 'false' then
DW_needed = 0
DW = false
end
end
if type(tonumber(cmdParams[3])) == 'number' then
if tonumber(cmdParams[3]) ~= Haste then
Haste = tonumber(cmdParams[3])
end
end
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
-- If you attempt to use a step, this will automatically use Presto.
function job_pretarget(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
local allRecasts = windower.ffxi.get_ability_recasts()
local prestoCooldown = allRecasts[236]
if player.main_job_level >= 77 and prestoCooldown < 1 and not buffactive['Presto'] then
cast_delay(1.1)
send_command('input /ja "Presto" <me>')
end
end
-- If you attempt to use Climactic Flourish with less than 4 finishing moves, this will automatically use 'Current Step' and resend Climactic Flourish.
local under4FMs = not buffactive['Finishing Move 4'] and not buffactive['Finishing Move 5'] and not buffactive['Finishing Move (6+)']
local doStep = ''
local doStep = state.MainStep.current
if spell.english == "Climactic Flourish" and under4FMs then
cast_delay(1.9)
send_command('@input /ja "'..doStep..'" <t>')
end
end
-- Automatically loads a Macro Set by: (Pallet,Book)
function select_default_macro_book()
if player.sub_job == 'SAM' then
set_macro_page(1, 5)
elseif player.sub_job == 'WAR' then
set_macro_page(2, 5)
elseif player.sub_job == 'RUN' then
set_macro_page(3, 5)
elseif player.sub_job == 'DRG' then
set_macro_page(5, 5)
elseif player.sub_job == 'BLU' then
set_macro_page(6, 5)
elseif player.sub_job == 'THF' then
set_macro_page(9, 5)
elseif player.sub_job == 'NIN' then
set_macro_page(10, 5)
else
set_macro_page(1, 5)
end
end
function set_lockstyle()
send_command('wait 2; input /lockstyleset ' .. lockstyleset)
end
Gear Info (Haste Tier and DW handling)
Understand, both of these luas depend on GearInfo to work, as the old haste tiers are ineffective in today's world with so many forms of haste all around us, while still needing to juggle Dual Wield as a Dancer. The addon can be found/explained here:
https://www.ffxiah.com/forum/topic/52145/finally-releasing-this-addon-gearinfo/
|
|