|
The Last Dance II: The Show Must Go On
Leviathan.Katriina
Serveur: Leviathan
Game: FFXI
Posts: 860
By Leviathan.Katriina 2019-02-12 17:17:37
Given all I've just said the only thing that remains in favour of Twashtar OH for Terps MH is the lower delay?
Can a slightly lower delay alone contribute to over 168 melee DPS? Seems a lot :x
211 vs 176 delay.. of course it does!
And its only 3% ahead of Sari, for the reasons mentioned before.
But from a pure PK at 1K perspective, Sari is ahead!
I ruled out the drop in skill btw, because in capped situations it wouldn't matter.
Speaking of which... Katriina the last version present in the spreadsheet node has the may 2018 as latest version. Might want to update that node, or you can ask me/chiaia if you cannot.
I believe its the same one on google drive? haven't touched it since the AM3 fix, and Terp across hits update.
By SimonSes 2019-02-12 22:39:51
All without success.
If I use Divine Waltz 2, and don't have the TP or the cooldown to do it, I want to downgrade to Divine Waltz.
2 days ago I switched to Selindrile Gearwap.
Now I don't know if this is the problem for only his gs or Motente's too, but this:
if spell_recasts[262] < 1
checks as positive even when Divine Waltz II is on cooldown.
Serveur: Asura
Game: FFXI
Posts: 732
By Asura.Lunafreya 2019-02-13 07:54:15
Would like to discuss PK and maybe someone can explain the damage calculation(s) because I am terrible at that sort of thing. Also, apologies if this specific thing has been discussed before.
I replaced my adhemar hands +1 (str/dex/atk path) with bangles +3 last night and was surprised to see that it felt like my average PK damage was lower than before. This was on normal enemies during Omen card farming.
Now this could be normal variance and I didn't log any damage and calculate an actual average so I could be totally off base here. But it made me look at the two pieces side by side and I kind of don't understand why you would use the bangles over adhemar in the first place.
Bangles:
21 STR
45 DEX
48 Accuracy
35 Attack
10 WSD
Adhemar +1:
27 STR
56 DEX
32 Accuracy
20 Attack
4 Triple Attack
You gain 10 WSD, 16 accuracy, and 15 attack but lose 6 STR, 11 DEX, and 4 Triple Attack. Why are the Af hands considered better for PK? Is it as simple as the 10 WSD does more for the first hit of the WS than the extra STR/DEX/TA does for all hits on average?
And if the WSD is that much of a difference, why wouldn't we use Horos Legs +3 over Samnuha? >.>;
By Nariont 2019-02-13 08:07:00
Its dex/str/multi attack for pk luna, wsd is very poor on pk since its a 5~ hit, maybe you were thinking wsd applied to all hits?
Leviathan.Katriina
Serveur: Leviathan
Game: FFXI
Posts: 860
By Leviathan.Katriina 2019-02-13 08:10:50
This was discussed before, not sure how close it can be now, no one did a peer review.[Page 43]
Why every set I see for Pyrrhic uses AF+3 gloves? 10% WSD only works for first hit, so it shouldn't be that strong for 5-8 hits WS. So just for overall high acc(especially with Regal ring)/att/str/dex?
Wouldn't Adhemar +1 win? Assuming path B it's +11DEX, +6STR, -10.5(25.5acc with Regal ring), -12att, +4% TA, -10%WSD. Isn't Adhemar a clear winner when acc/att isn't a problem?
EDIT: Adhemar gloves also has +7sTP. sTP isn't that valuable for WSs, but it's also an additional small advantage on 5-8 hits WS.
Leviathan.Katriina said: »Why every set I see for Pyrrhic uses AF+3 gloves?
I’m sure that there are others who can answer this way better than me but I tried to do some rough calculations to see your proposal:
Pyrrhic Kleos is a 4 hit with fTP of 1.75
1.75x4=7 [Before multi-hits]
Add belt/neck:
1.95x4=7.8
Factoring Multihits:
BiS PK has [ 29DA 10 TA ]
100x0.1=10
10x2=20+100=120
100-10=90
90x0.29=26.1+120=146.1 attacks
1.461 AVG attacks of a 46.1% chance of getting a proc of multihit attack with 1.95 fTP
For the sake of making this easy I will add a constant of (1.95x46.1%) to the overall fTP(0.9)
Will also exclude offhand (too minuscule to even worry about it)...
Total fTP= 7.8+0.9=8.7 with BiS
Now let’s see if you increase TA by 4 using Adhemar Hands HQ
[29 DA 14TA]
100x0.14=14
14x2=28+100=128
100-14=86
86x0.29=24.9+128=152.9 attacks
1.529AVG attacks of a 52.9% chance of getting a proc of multihit attack with 1.95 fTP
For the sake of making this easy I will add a constant of (1.95x52.9%) to the overall fTP(1.03)
Total fTP= 7.8+1.03=8.8 with Adhemar Hands
8.8-8.7=0.1 increase in fTP
By swapping to Adhemar you lose 10% wsd from AF3 Hands in exchange for 0.1 in total fTP which is not recommended imo [I could be missing something here and a better explanation can be done by others]
Cross referenced it to Spreadsheet [post update]:
PK With AF+3 Hands= 19677 and DPS=5148.171
PK With Adhemar +1= 19941 and DPS=5206.947
Adhemar +1 leads by 2% in capped situations.[Adhemar +1 is Path B]
If you only have Path A then its going to lead by 0.03%
[+]
Serveur: Asura
Game: FFXI
Posts: 732
By Asura.Lunafreya 2019-02-13 08:15:15
Its dex/str/multi attack for pk luna, wsd is very poor on pk since its a 5~ hit, maybe you were thinking wsd applied to all hits?
Yea this is exactly why I was thinking Adhe > Maxixi! But almost every set you see recommends the maxixi hands >.>;
Leviathan.Katriina said: »This was discussed before, not sure how close it can be now, no one did a peer review.[Page 43]
Why every set I see for Pyrrhic uses AF+3 gloves? 10% WSD only works for first hit, so it shouldn't be that strong for 5-8 hits WS. So just for overall high acc(especially with Regal ring)/att/str/dex?
Wouldn't Adhemar +1 win? Assuming path B it's +11DEX, +6STR, -10.5(25.5acc with Regal ring), -12att, +4% TA, -10%WSD. Isn't Adhemar a clear winner when acc/att isn't a problem?
EDIT: Adhemar gloves also has +7sTP. sTP isn't that valuable for WSs, but it's also an additional small advantage on 5-8 hits WS.
Leviathan.Katriina said: »Why every set I see for Pyrrhic uses AF+3 gloves?
I’m sure that there are others who can answer this way better than me but I tried to do some rough calculations to see your proposal:
Pyrrhic Kleos is a 4 hit with fTP of 1.75
1.75x4=7 [Before multi-hits]
Add belt/neck:
1.95x4=7.8
Factoring Multihits:
BiS PK has [ 29DA 10 TA ]
100x0.1=10
10x2=20+100=120
100-10=90
90x0.29=26.1+120=146.1 attacks
1.461 AVG attacks of a 46.1% chance of getting a proc of multihit attack with 1.95 fTP
For the sake of making this easy I will add a constant of (1.95x46.1%) to the overall fTP(0.9)
Will also exclude offhand (too minuscule to even worry about it)...
Total fTP= 7.8+0.9=8.7 with BiS
Now let’s see if you increase TA by 4 using Adhemar Hands HQ
[29 DA 14TA]
100x0.14=14
14x2=28+100=128
100-14=86
86x0.29=24.9+128=152.9 attacks
1.529AVG attacks of a 52.9% chance of getting a proc of multihit attack with 1.95 fTP
For the sake of making this easy I will add a constant of (1.95x52.9%) to the overall fTP(1.03)
Total fTP= 7.8+1.03=8.8 with Adhemar Hands
8.8-8.7=0.1 increase in fTP
By swapping to Adhemar you lose 10% wsd from AF3 Hands in exchange for 0.1 in total fTP which is not recommended imo [I could be missing something here and a better explanation can be done by others]
Of course...if I had gone back another 5 pages or so I would have found it myself xD
Interesting though. I think I am going to do some testing today with both and get some general averages.
Edit:
Leviathan.Katriina said:
Cross referenced it to Spreadsheet [post update]:
PK With AF+3 Hands= 19677 and DPS=5148.171
PK With Adhemar +1= 19941 and DPS=5206.947
Adhemar +1 leads by 2% in capped situations.[Adhemar +1 is Path B]
If you only have Path A then its going to lead by 0.03%
So it is better! Only makes sense =p Time to update the guide!
Leviathan.Katriina
Serveur: Leviathan
Game: FFXI
Posts: 860
By Leviathan.Katriina 2019-02-13 09:46:27
Only if you get another pair with Path B [with the current prices you should], guide already updated!
Serveur: Asura
Game: FFXI
Posts: 732
By Asura.Lunafreya 2019-02-13 09:59:21
Oh yeah mine are already path B :D thanks, Kat!
By SimonSes 2019-02-13 10:40:21
Ok so, this took tons of time >.>
Nothing was working correctly in previous one actually, so I also fixed Curing Waltzes.
First of all code, then TL;DR for those who are interested..
Code local waltz_tp_cost = {['Curing Waltz'] = 200, ['Curing Waltz II'] = 350, ['Curing Waltz III'] = 500, ['Curing Waltz IV'] = 650, ['Curing Waltz V'] = 800, ['Divine Waltz'] = 400, ['Divine Waltz II'] = 800, }
-- Utility function for automatically adjusting the waltz spell being used to match HP needs and TP limits.
-- Handle spell changes before attempting any precast stuff.
function refine_waltz(spell, spellMap, eventArgs)
if spell.type ~= 'Waltz' then
return
elseif player.tp < 150 then
add_to_chat(123, 'Abort: Insufficient TP ['..tostring(player.tp)..'] to waltz.')
eventArgs.cancel = true
return
end
-- Don't modify anything for Healing Waltz
if spell.english == "Healing Waltz" then -- or spell.english == "Divine Waltz" or spell.english == "Divine Waltz II" then
return
end
local newWaltz = spell.english
local waltzID
local missingHP
-- If curing ourself, get our exact missing HP
if spell.target.type == "SELF" then
missingHP = player.max_hp - player.hp
-- If curing someone in our alliance, we can estimate their missing HP
elseif spell.target.isallymember then
local target = find_player_in_alliance(spell.target.name)
local est_max_hp = target.hp / (target.hpp/100)
missingHP = math.floor(est_max_hp - target.hp)
if buffactive['Contradance'] then
missingHP = missingHP / 2
end
end
-- If we have an estimated missing HP value, we can adjust the preferred tier used.
if missingHP ~= nil then
if player.main_job == 'DNC' then
if spell.english == "Divine Waltz" or spell.english == "Divine Waltz II" then
local abil_recasts = windower.ffxi.get_ability_recasts()
if spell.english == "Divine Waltz II" and abil_recasts[190] < 1 and player.tp > 800 then
add_to_chat(122,'DII')
newWaltz = 'Divine Waltz II'
waltzID = 262
elseif abil_recasts[225] < 1 and player.tp > 400 then
add_to_chat(122,'why this is added to chat two times?')
newWaltz = 'Divine Waltz'
waltzID = 195
else
add_to_chat(122,'Cant do Divine')
eventArgs.cancel = true
return
end
else
local abil_recasts = windower.ffxi.get_ability_recasts()
if missingHP < 40 and spell.target.name == player.name then
-- Not worth curing yourself for so little.
-- Don't block when curing others to allow for waking them up.
add_to_chat(122,'Full HP!')
eventArgs.cancel = true
return
elseif missingHP < 200 then
if abil_recasts[217] < 1 and player.tp > 200 then
newWaltz = 'Curing Waltz'
waltzID = 190
elseif abil_recasts[186] < 1 and player.tp > 350 then
newWaltz = 'Curing Waltz II'
waltzID = 191
elseif abil_recasts[187] < 1 and player.tp > 500 then
newWaltz = 'Curing Waltz III'
waltzID = 192
elseif abil_recasts[188] < 1 and player.tp > 650 then
newWaltz = 'Curing Waltz IV'
waltzID = 193
end
elseif missingHP < 600 then
if abil_recasts[186] < 1 and player.tp > 350 then
newWaltz = 'Curing Waltz II'
waltzID = 191
elseif abil_recasts[187] < 1 and player.tp > 500 then
newWaltz = 'Curing Waltz III'
waltzID = 192
elseif abil_recasts[188] < 1 and player.tp > 650 then
newWaltz = 'Curing Waltz IV'
waltzID = 193
elseif abil_recasts[217] < 1 and player.tp > 200 then
newWaltz = 'Curing Waltz'
waltzID = 190
end
elseif missingHP < 1100 then
if abil_recasts[187] < 1 and player.tp > 500 then
newWaltz = 'Curing Waltz III'
waltzID = 192
elseif abil_recasts[188] < 1 and player.tp > 650 then
newWaltz = 'Curing Waltz IV'
waltzID = 193
elseif abil_recasts[189] < 1 and player.tp > 800 then
newWaltz = 'Curing Waltz V'
waltzID = 311
elseif abil_recasts[186] < 1 and player.tp > 350 then
newWaltz = 'Curing Waltz II'
waltzID = 191
elseif abil_recasts[217] < 1 and player.tp > 200 then
newWaltz = 'Curing Waltz'
waltzID = 190
end
elseif missingHP < 1500 then
if abil_recasts[188] < 1 and player.tp > 650 then
newWaltz = 'Curing Waltz IV'
waltzID = 193
elseif abil_recasts[187] < 1 and player.tp > 500 then
newWaltz = 'Curing Waltz III'
waltzID = 192
elseif abil_recasts[189] < 1 and player.tp > 800 then
newWaltz = 'Curing Waltz V'
waltzID = 311
elseif abil_recasts[186] < 1 and player.tp > 350 then
newWaltz = 'Curing Waltz II'
waltzID = 191
elseif abil_recasts[217] < 1 and player.tp > 200 then
newWaltz = 'Curing Waltz'
waltzID = 190
end
else
if abil_recasts[189] < 1 and player.tp > 800 then
newWaltz = 'Curing Waltz V'
waltzID = 311
elseif abil_recasts[188] < 1 and player.tp > 650 then
newWaltz = 'Curing Waltz IV'
waltzID = 1193
elseif abil_recasts[187] < 1 and player.tp > 500 then
newWaltz = 'Curing Waltz III'
waltzID = 192
elseif abil_recasts[186] < 1 and player.tp > 350 then
newWaltz = 'Curing Waltz II'
waltzID = 191
elseif abil_recasts[217] < 1 and player.tp > 200 then
newWaltz = 'Curing Waltz'
waltzID = 190
end
end
end
elseif player.sub_job == 'DNC' then
if missingHP < 40 and spell.target.name == player.name then
-- Not worth curing yourself for so little.
-- Don't block when curing others to allow for waking them up.
add_to_chat(122,'Full HP!')
eventArgs.cancel = true
return
elseif missingHP < 150 then
newWaltz = 'Curing Waltz'
waltzID = 190
elseif missingHP < 300 then
newWaltz = 'Curing Waltz II'
waltzID = 191
else
newWaltz = 'Curing Waltz III'
waltzID = 192
end
else
-- Not dnc main or sub; bail out
return
end
end
local tpCost = waltz_tp_cost[newWaltz]
if newWaltz ~= spell.english then
send_command('@input /ja "'..newWaltz..'" '..tostring(spell.target.raw))
eventArgs.cancel = true
return
end
if missingHP and missingHP > 0 then
add_to_chat(122,'Trying to cure '..tostring(missingHP)..' HP using '..newWaltz..'.')
end
end
You also need to add one line to different function. It's on very beginning so I will only paste that (rest of the function stays the same)
Code function check_recast(spell, spellMap, eventArgs)
if spell.action_type == 'Ability' and spell.type ~= 'WeaponSkill' then
if spell.recast_id == 190 or spell.recast_id == 225 or spell.recast_id == 217 or spell.recast_id == 186 or spell.recast_id == 187 or spell.recast_id == 188 or spell.recast_id == 189 then return false end
Now TL;DR
1. ID for waltzes and their recast ID are different.
2. There is function "check recast", which prevent using ability on recast even just to trigger some function to change it for different ja, so I needed to disable that cancelling for all Waltzes, so function "refine waltz" could be triggered by them even when they are currently on cooldown.
3. Even after 5 hours of testing I can't *** figure out why text added to chat with "Divine Waltz" is added 2 times, but I don't really care, because whole functionality works correctly. Maybe I will go back to this some day.
Serveur: Asura
Game: FFXI
Posts: 7
By Asura.Celious 2019-02-13 16:58:57
I'm new to DNC, and I'm trying to understand Closed Position a bit better. Do I need to be directly in front of the monster to gain the benefits (face-to-face in description makes be think this), or can I be off to the side and little bit? (Thinking like staying in the frontal cone if the mob)
In addition, is it worth swapping to a pair Herc Boots with 4% TA augmented onto them for when it's unsafe to be in front of the mob? My current Horos Shoes are only +1, but I'm working on +2ing them soon, so I'm not sure if store TP on the shoes out ranks TA on Herc Boots for DNC.
Thanks!
By SimonSes 2019-02-13 17:43:07
I'm new to DNC, and I'm trying to understand Closed Position a bit better. Do I need to be directly in front of the monster to gain the benefits (face-to-face in description makes be think this), or can I be off to the side and little bit? (Thinking like staying in the frontal cone if the mob)
In addition, is it worth swapping to a pair Herc Boots with 4% TA augmented onto them for when it's unsafe to be in front of the mob? My current Horos Shoes are only +1, but I'm working on +2ing them soon, so I'm not sure if store TP on the shoes out ranks TA on Herc Boots for DNC.
Thanks!
As far as I understand it, imagine that mob you are fighting is MNK (unless it's really a monk :P) and being face-to-face means you can be a little off to sides, but not enough to not let him counter you.
Leviathan.Katriina
Serveur: Leviathan
Game: FFXI
Posts: 860
By Leviathan.Katriina 2019-02-14 01:16:29
There was a test done on overwhelm angle, in SAM forum [Page 89,90], and it showed its around 45 degrees from the axis of symmetry to the mob, and depending on the size of the model, it can range between 85-90 degrees total.
Midgardsormr.Lowclock said: »Went and tested and it's a 90 degree cone if anyone was wondering.
E: The way windower and/or the game reports facing and position of models makes measuring it a little iffy. I tested by using the TP return when using reforged relic body, and sometimes the reported angle where overwhelm works would be a little higher or lower, depending on things like model size, position, and heading. I guess if you really cared you could probably safely call it always at least 85 degrees, but I imagine SE probably intends it to be 90.
I believe that "Closed Position" operates the same way, same as "Sonic Thrust" or any Conal TP move if that helps.
If you really want to test it out yourself, call a tank trust, pull a mob, face the mob, then hit it with a single dagger naked without "multi hit", and only Relic Feet Equipped with 5/5 "Closed Position", and check TP return, keep moving away from center checking angles until the TP return becomes lower, there is your range.
In addition, is it worth swapping to a pair Herc Boots with 4% TA augmented onto them for when it's unsafe to be in front of the mob?
Yes, its worth it, I personally do that on Monk types and during Conal TP moves from mobs, with a simple macro swap.
Also, Relic +3 Feet is the one we are talking about being BiS atm, if you don't have it, stick with Herc until you finish it.
[+]
Serveur: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2019-02-14 04:06:56
Even after 5 hours of testing I can't *** figure out why text added to chat with "Divine Waltz" is added 2 times, but I don't really care, because whole functionality works correctly. Maybe I will go back to this some day.
I assume because both 'spells' are being triggered/attempted in the single use of the ability.
So the text is added to the chat:
Once when you use Divine Waltz II (but fails)
and then again upon the auto-downgrade to Divine Waltz (success)
but... I'm not sure that makes logical code sense?
Either way, change:
if spell.english == "Divine Waltz II" or spell.english == "Divine Waltz" then
to
if spell.english == "Divine Waltz II" then
and the double text will no longer occur. Since we don't ever need to adjust Divine Waltz, it shouldn't matter to delete it. Just to be safe I added it with the 'Healing Waltz' line above it:
-- Don't modify anything for Healing Waltz or Divine Waltz
if spell.english == "Healing Waltz" or spell.english == "Divine Waltz" then
return
end
this way all bases are covered.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Just as feedback, first and foremost I would like to say thank you, I truly appreciate your time and effort.
The bad news, is that it wasn't entirely working for me. Divine Downgrade worked, but I lost functionality of Waltz 5>4>3>2>1 downgrades based on hp. I do not have a function check_recast(spell, spellMap, eventArgs)
anywhere in Mote utility, or my lua, so I assume this is the root of the cause. I tried putting it in, to no avail. I believe you stated you don't use Mote's Gearswap anymore, so this is likely entirely on my end and not yours.
I'm only sharing this, so that (IF) others who run into the same issue know they aren't alone. There's a very strong chance this is user error on MY part, so I'm going to wait for some others to chime in on whether it works for them or not.
However, due to all the footwork you've done, I was able to hack apart your code and re-write it in a format that works for Me (or Mote maybe?) So in the event I am not an outlier, I can share that if people would like. As of my current testing, my alteration is fully functional, I'll push it to the limits tomorrow.
Again, I appreciate everything you've done and I hope to hear back from some others with their results soon. Most likely I just screwed up. Thanks again!
Serveur: Asura
Game: FFXI
Posts: 7
By Asura.Celious 2019-02-14 08:22:34
Leviathan.Katriina said: »There was a test done on overwhelm angle, in SAM forum [Page 89,90], and it showed its around 45 degrees from the axis of symmetry to the mob, and depending on the size of the model, it can range between 85-90 degrees total.
Midgardsormr.Lowclock said: »Went and tested and it's a 90 degree cone if anyone was wondering.
E: The way windower and/or the game reports facing and position of models makes measuring it a little iffy. I tested by using the TP return when using reforged relic body, and sometimes the reported angle where overwhelm works would be a little higher or lower, depending on things like model size, position, and heading. I guess if you really cared you could probably safely call it always at least 85 degrees, but I imagine SE probably intends it to be 90.
I believe that "Closed Position" operates the same way, same as "Sonic Thrust" or any Conal TP move if that helps.
If you really want to test it out yourself, call a tank trust, pull a mob, face the mob, then hit it with a single dagger naked without "multi hit", and only Relic Feet Equipped with 5/5 "Closed Position", and check TP return, keep moving away from center checking angles until the TP return becomes lower, there is your range.
In addition, is it worth swapping to a pair Herc Boots with 4% TA augmented onto them for when it's unsafe to be in front of the mob?
Yes, its worth it, I personally do that on Monk types and during Conal TP moves from mobs, with a simple macro swap.
Also, Relic +3 Feet is the one we are talking about being BiS atm, if you don't have it, stick with Herc until you finish it.
Thanks so much for the info! Looks like I'll stick to the Herc boots for!
Asura.Bikpik
Serveur: Asura
Game: FFXI
Posts: 17
By Asura.Bikpik 2019-02-14 12:25:54
Does anyone have an updated lua that they could share please?
[+]
Serveur: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2019-02-14 14:42:32
Does anyone have an updated lua that they could share please?
Here's mine: Code -- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
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.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")
lockstyleset = 1
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
-- Gear Modes
function user_setup()
state.OffenseMode:options('Normal', 'LowAcc', 'MidAcc', 'HighAcc')
state.HybridMode:options('Normal', 'HIGH', 'MID', 'LOW')
state.WeaponskillMode:options('Normal', 'Acc')
-- 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 @c gs c toggle CP') --WindowKey'C'
send_command('bind @r gs c toggle Warp') --WindowKey'R'
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 !-')
send_command('unbind ^=')
send_command('unbind f11')
send_command('unbind @c')
send_command('unbind @r')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
-------------------------------------- Sub Job Specific ----------------------------------------
------------------------------------------------------------------------------------------------
----------------- /War ---------------
sets.precast.JA['Provoke'] = sets.Enmity
----------------- /Run ---------------
sets.precast.JA['Vallation'] = sets.Enmity
sets.midcast.Flash = sets.Enmity
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.Enmity = {head="Highwing Helm",neck="Unmoving Collar +1",hands="Kurys Gloves",ear2="Friomisi Earring",ring1="Petrov Ring",body="Emet Harness +1",legs="Samnuha Tights",feet="Ahosi Leggings"}
sets.precast.JA['No Foot Rise'] = {body="Horos Casaque +3"}
sets.precast.JA['Trance'] = {head="Horos Tiara +3"}
sets.precast.Waltz = {ammo="Yamarang", --5
head="Anwig Salade",
neck="Unmoving Collar +1",
lear="Handler's Earring",
body="Maxixi Casaque +3", --17
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
ring1="Asklepian Ring",
ring2="Carbuncle Ring",
back="Toetapper Mantle", --5
waist="Aristo Belt",
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --58%
sets.precast.WaltzSelf = set_combine(sets.precast.Waltz, {ring1="Asklepian Ring"})
sets.precast.Waltz['Healing Waltz'] = {}
sets.precast.Samba = {head="Maxixi Tiara +1",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 +2"}
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",body="Horos Casaque +3",waist="Eschan Stone",feet="Horos Toe Shoes +3",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="Impatiens",ear2="Loquacious Earring"}
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads"})
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.WS = {
ammo="Ginsen",
head="Adhemar Bonnet +1",
neck="Asperity Necklace",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="Rawhide Vest",
hands={ name="Herculean Gloves", augments={'Accuracy+25 Attack+25','"Triple Atk."+3','STR+4','Accuracy+11','Attack+12',}},
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="Ginsen",
head="Adhemar Bonnet +1",
neck="Fotia Gorget",
ear1="Brutal Earring",
ear2="Sherida Earring",
body="Rawhide Vest",
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="Ginsen",
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="Meg. Cuirie +2",
hands="Mummu Wrists +2",
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="Epona'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="Charis Feather",
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="Epona'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",
body="Samnuha Coat",
hands="Leyline Gloves",
legs={ name="Herculean Trousers", augments={'"Mag.Atk.Bns."+23','Enmity-3','STR+13','Mag. Acc.+11',}},
feet={ name="Herculean Boots", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','Enmity-3','INT+1','Mag. Acc.+9','"Mag.Atk.Bns."+8',}},
neck="Sanctity Necklace",
waist="Eschan Stone",
left_ear="Friomisi Earring",
right_ear="Hecate's Earring",
left_ring="Acumen Ring",
right_ring="Ilabrat 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"})
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 = sets.midcast.SpellInterrupt
sets.precast.Waltz.Enmity = sets.Enmity
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
ammo="Yamarang",
head="Horos Tiara +3",
neck="Loricate Torque +1", --6DT
ear1="Odnowa Earring",
ear2="Odnowa Earring +1",
body="Horos Casaque +3", --6PDT
hands={ name="Herculean Gloves", augments={'Phys. dmg. taken -5%','Accuracy+15','Attack+6',}}, --7PDT
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="Yamarang",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="Telos Earring",
ear2="Sherida Earring",
body="Maxixi Casaque +3",
hands="Adhemar Wrist. +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="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="Ginsen",
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="Ginsen",
head="Adhemar Bonnet +1",
neck="Etoile Gorget +2",
ear1="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','"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="Charis Feather",
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="Charis Feather",
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="Ginsen",
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%
------------------------------------------------------------------------------------------------
--------------------------------------- Accuracy Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Define three tiers of Accuracy. These sets are cycled with the F9 Button to increase accuracy in stages as desired.
sets.engaged.Acc1 = {head="Horos Tiara +3"}
sets.engaged.Acc2 = {head="Horos Tiara +3",legs="Mummu Kecks +2",ammo="Yamarang"}
sets.engaged.Acc3 = {head="Horos Tiara +3",legs="Mummu Kecks +2",ammo="Yamarang",waist="Eschan Stone",body="Horos Casaque +3"}
-- 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. DT1-21%, DT2-34%, DT3-50%
sets.engaged.DT1 = {body="Horos Casaque +3",ring1="Defending Ring",legs="Mummu Kecks +2"}
sets.engaged.DT2 = {body="Horos Casaque +3",ring1="Defending Ring",legs="Mummu Kecks +2",neck="Loricate Torque +1",ring2="Vocane Ring"}
sets.engaged.DT3 = {body="Horos Casaque +3",ring1="Defending Ring",legs="Mummu Kecks +2",neck="Loricate Torque +1",ring2="Vocane Ring",back="Moonbeam Cape",waist="Flume Belt +1",head="Horos Tiara +3",hands={ name="Herculean Gloves", augments={'Phys. dmg. taken -5%','Accuracy+15','Attack+6',}},ear1="Odnowa Earring",ear2="Odnowa Earring +1"}
-- 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)
-- 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)
-- 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)
-- 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)
-- 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)
-- 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)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- sets.buff.Doom = {}
-- sets.buff['Saber Dance'] = {legs="Horos Tights +3"}
-- sets.buff['Fan Dance'] = {hands="Horos Bangles +1"}
-- 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"}
sets.CP = {back="Mecisto. Mantle"}
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({right_ear="Ishvara Earring"})
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
if spell.type=='Waltz' and spell.target.type == 'SELF' then
equip(sets.precast.WaltzSelf)
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.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
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.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
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 prestoCooldown > 16 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 == 'BLU' then
set_macro_page(4, 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
Serveur: Asura
Game: FFXI
Posts: 732
By Asura.Lunafreya 2019-02-15 13:50:49
Solo CPing on some Apex Bats in Outer RaKaz and I am finding that a 4 step darkness (Shark Bite > PK > Evis > Rudra) is a pretty consistent way to kill these quick when Climactic is down...when clim is available it's just the usual old climactic 3 step.
Anyone got some Shark Bite sets?I threw together the following really quickly:
ItemSet 365134
All the herc is dex/acc/atk/wsd. Dex/acc/atk/wsd mantle.
It seems pretty good but wondering if there are improvements to be made. It's basically the non-Clim Rudra set but with Fotia's.
Serveur: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2019-02-16 13:15:25
Likely depends on your buffs/food, but I tossed it into the spreadsheet and found the following upgrades:
Caro Necklace (Assuming Etoile Gorget Aug is not an option)
Grunfeld Rope
Floestone
Moonshade Earring
Ramuh+1 can be replaced in this order:
Regal > Epam... > Apate > Eponas > Rajas > Ramuh+1
Horos Body +3 (I tested against 15Dex 20acc/20att 5%WSD Herc Augs, Horos won by a noticeable amount)
Horos Tiara +3 (Same as above)
**Herc Feet** have to be 15Dex, 5% WSD, and 20/20 acc/att to beat Horos Feet +3, so if you already have that, congrats. If not, I wouldn't chase the augs as the dmg was negligible between them. (7 total(not DPS) Dmg on the WS)
You said solo, so I assumed Haste 2, double march, double mad from trusts, against Apex Bats. I tested with Sublime Sushi and Red Curry Bun, results were the same, but margins did change. These tests were with Terp/Sari but without AM3, if that alters things for you.
[+]
By SimonSes 2019-02-16 13:56:56
Herc can't be 5%WSD and 15DEX without DM augment. Max is 4%/+15DEx or 5%/+10DEX.
Serveur: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2019-02-16 20:40:29
With this months Ambuscade I decided to make a new Dual Wield cape, and try to optimize every haste tier. I didn't find anything on the Dnc Community guide, so I just tried to optimize what I could with the DPS Sheets. The following are 99% optimized. There's a few Dual Wield scenarios where Adhemar Jacket +1 will come out on top, but it was marginal and not worth the ~25m it cost on my server, when Maculele is so easy to get. I ignored Regal Ring as well. The DPS drop from NQ, +1, and +2 Etoile Gorget are minimal. Like... really minimal. NQ to +2 with Augs are three (3) DPS. Obviously this comes into play in Acc scenarios, where all these tests were done on Apex Bats and Capped Acc, with Red Curry Bun, Hume, /Sam. However, Anu and Caro Torque would be the step down from NQ Gorget, but at 500k for the NQ, I'd recommend you just grab that.
Anywho, here's what I have, if anyone is looking for some Haste Tier Help. These are all based on Master, so an extra 5% Dual Wield is accounted for. Aeneas/Sari (capped)
0% Haste - Nothing
ItemSet 365154
Cape is 20acc/20att, 30Dex, 10 Dual Wield
15% Haste - Haste1
ItemSet 365155
Cape is 20acc/20att, 30Dex, 10 Dual Wield
30% Haste - Haste2 or March+Haste1
ItemSet 365156
Cape is 20acc/20att, 30Dex, 10 Double Attack
40% Haste - Haste2 + Samba
ItemSet 365157
Cape is 20acc/20att, 30Dex, 10 Double Attack
Capped Haste - Haste2 + Samba + March
ItemSet 365163
Cape is 20acc/20att, 30Dex, 10 Double Attack
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2019-02-16 21:11:22
AF+3 tiara has 8 DW, you can probably get more efficient swaps than the emp body
Leviathan.Katriina
Serveur: Leviathan
Game: FFXI
Posts: 860
By Leviathan.Katriina 2019-02-17 02:13:27
When/if one needed to cap delay in situations where Haste Samba isn't an option, can't get Haste II or Marches, and/or you're weak/zombi, you should probably use this set:
ItemSet 359603
*Cape with DW 10
*Hands with 15 DEX/STR+30 ACC/ATT+ 4DW
With only Haste Samba:
ItemSet 359606
*Cape with DW 10
With Trusts and Haste Samba:
ItemSet 365170
*Cape with STP 10
I can't think of any other sets for capping delay in the current game meta, so its probably going to be these three sets.
Serveur: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2019-02-17 03:23:47
AF+3 tiara has 8 DW, you can probably get more efficient swaps than the emp body
There wasn't a way to make it work without Adhemar Jacket, which is what I was trying to avoid, but for the sake of min/max I've updated the lower 2 sets. I get different results than Katriina, but not sure why.
A lot of this months VD Ambuscade v1 had me sitting in these low haste scenarios, so I've just been trying to optimize them. Sometimes you get a haste, sometimes you can have samba, but sometimes I'm just trying to have enough HP to survive Kibosh and riding Fan Dance.
Additionally I spent a lot of time solo Farming Ahi Dahaka for Ebani Earring this week and he wipes buffs constantly where I kept ending up in these odd haste scenarios where I knew I was sacrificing DPS. In order to kill him in the 30 min window I couldn't afford to give up much damage. The lua already handles it all, it was silly not to min/max the gear.
Ramuh.Austar
Serveur: Ramuh
Game: FFXI
Posts: 10481
By Ramuh.Austar 2019-02-17 09:26:20
you can also augment herc set for dual wield if you need to.
Serveur: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2019-02-23 23:37:51
Solved:
Code 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
Asura.Sechs
Serveur: Asura
Game: FFXI
Posts: 10087
By Asura.Sechs 2019-02-24 13:52:31
Anybody mind sharing their Waltz sets? I'm recently considering the idea of removing the Subligar.
By SimonSes 2019-02-24 13:56:46
Anybody mind sharing their Waltz sets? I'm recently considering the idea of removing the Subligar.
Dashing subligar? Why? >.> Its the last piece i would consider to drop. Free blink is great.
[+]
Asura.Sechs
Serveur: Asura
Game: FFXI
Posts: 10087
By Asura.Sechs 2019-02-24 17:03:59
Dashing subligar? Why? >.> Its the last piece i would consider to drop. Free blink is great. Because:
1) Inventory+1
2) I don't need the Waltz potency+ anymore
3) I can use other items with more CHR/VIT
4) Blink is fine but I don't really need it when I'm doin group content with my LS
Sooo... yeah, kinda considering the idea of removing it from my set :x
|
|