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.
** 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.
-- 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/
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.
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
** 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?
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.
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.
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.
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…
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.
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.
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.
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.
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 >.>
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.
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]
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.
** 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.
-- 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/