|
You Spoony Guide! - A Troubadour's Libretto
Asura.Crevox
Serveur: Asura
Game: FFXI
Posts: 370
By Asura.Crevox 2023-01-29 17:35:10
What do you mean with "priority"? Which songs to cast first, i.e. order? Or do you mean which songs are on average more "important"?
Which are more important to have on and are more useful for DPS/klll speed in general. Not the order.
Serveur: Asura
Game: FFXI
Posts: 486
By Asura.Dexprozius 2023-01-29 17:54:11
That depends entirely on the situation, i.e. what content your tackling and what your party needs based on their gear/capabilities.
Marches are typically your most important, particularly Honor March as its a march/madrigal/and minuet in one. Should you do 2 marches? That depends if they're getting haste from other sources. Geo/Blu/Rdm etc.
Generally, after marches, if your party is all melee focused you can't go wrong with a couple Minuets. Be it 1, 2 or 3 depending on if you have Daurdabla or if you're clarion calling. When you do get Daurdabla and doing 5 songs, sometimes people prefer a different 5th song than Minuet 3 since it's lower attack. Often times that's where you'll sub in a Blade Madrigal if acc is lacking, a Minne V if people are taking hits often, or a Herculean Etude to boost WSD.
I definitely wouldnt consider Madrigal a "staple" and definitely wouldn't rank it in importance over minuet. Brd's main job is to boost the damage of the party, and madrigal should only be used when the evasion of the target(s) requires it. When it's necessary, its Extremely important, but in general play your DD's should be managing their own accuracy.
Also regardless however many songs you can cast, don't forget to neglect the tank and healer. If your inexperienced or slow, bare minimum you should be slapping a defense song on the tank and a ballad on the healer. If you get a little faster during your nitro window, you can start doing 2 Minnes/Mambos on the tank + a ballad or sirvente, then 2 ballads + Minne or Dirge or Paeon on the mage.
Having said this, you also should consider if you're meleeing as well (which you should be), and you may want to pianissimo yourself a madrigal since Brd's stats lack compared to other DDs, especially if you offhand a Centovente. ALSO, if your Tank/Healer are good and dont need as much support, you can make due with giving them just 1 or 2 songs instead of spending all that time buffing them, and instead start DDing sooner to contribute to the kill speed of the group. (this is most notably in sheol C runs, less so in difficult boss fights)
TL;DR, I'd say the answer to your question is more nuanced than a simply hierarchy. However to simplify it, March > Minuet > "Whatever the party needs" would be the order
[+]
By DaneBlood 2023-01-29 22:30:36
Having said this, you also should consider if you're meleeing as well (which you should be)
I cant agree more on this part. once you song are up falling back to crow control with lullaby and DD with /nin /dnc or assistisng the whm on /whm, its important to keep on going pushing the envelope.
This is where you show the difference between a main player of bard and just another mule. If I want 4dd songs and a ballad on the healer only, I can just bring a mule and handle that easily. But falling back to DPS is where you show the true potential of bard.
Carbuncle.Maletaru
Serveur: Carbuncle
Game: FFXI
Posts: 2685
By Carbuncle.Maletaru 2023-01-29 23:04:17
It's also worth noting that if you do all your DD songs with the mage and tank in range and they get NiTro Minuet & March, you will not be able to apply 5 new songs to your WHM and tank. If you put 3 ballads on the WHM, for example, they will just keep replacing each other and not replacing the Minuets.
It's possible to re-apply "dummy" versions of the melee songs to your tank/healer, THEN apply their real songs, but my recommendation is to have the healer and tank go out of range when you do the melee songs, if possible. Then you can apply the 5 songs of your choice to them.
That said, the NiTro window is very stressful some of the time and if your healer can get by with a single Ballad it makes your life a whole lot easier.
Asura.Sechs
Serveur: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2023-01-30 01:04:40
What do you mean with "priority"? Which songs to cast first, i.e. order? Or do you mean which songs are on average more "important"?
Which are more important to have on and are more useful for DPS/klll speed in general. Not the order. Then it's very hard to give you one-answer-to-rule-them-all because it's entirely dependant on the situation.
You asked for DPS, so let's leave aside other generic support songs for mages or tank and let's focus on DPS.
The two most important things you can do as a BRD is capping Haste and Accuracy as those two, when uncapped, are by far the biggest damage increase for your DPS.
Please allow me to elaborate further
Haste
If your party has no other source of haste, you are going to have Honor March and Victory March, those two songs alone will cap melee haste.(it caps at roughly ~43,75 haste)
If your party has other sources of haste (Haste2 from RDM or SMN, or Indihaste from GEO) then Honor March alone will suffice.
If you have Soul Voice active, then even just Haste1 will be enough to cap with only Honor March up.
In these two situation you need only one song slot (HM) to cap haste for your pt.
Accuracy
This is going to depend a lot on the target you're fighting and the accuracy level of your DPS. These days I'd dare say it's hard to find situations where you need TWO madrigals. Most of the time you'll need none because HM also provides some accuracy. But if you find out you really need acc, then in general Blade Madrigal, in addition to HM, will be more than enough, i.e. one song slot.
The rest
The remaining song slots (2-4 depending on the previously discussed situations) will be used for Minuets, which provides a static buff to attack, which will then furtherly multiplied by Att% buffs that your DPSs may or may not have available (Smite job trait, Indi Fury, Berserk, Chaos Roll, Ifrit's Warcy etc).
If you have soulvoice up then most of the time using 3-4 song slots for Minuets is gonna be too much (i.e. above the cap). For these situations you're gonna use at least one Etude song. You need to pick one that will be favoured by your current DPS. In case of conflicting necessities then the best compromise is probably Herculean Etude (STR). Or you may decide to reserve one slot to other specific needs of the current setup, like one Minne for physical defense, Scherzo against very dangerous moves, or something else like a generic Ballad.
In general
It depends a lot on your party/jobs setup but I find the most common combination is 2 Marches and 3 Minuets.
Carbuncle.Maletaru
Serveur: Carbuncle
Game: FFXI
Posts: 2685
By Carbuncle.Maletaru 2023-01-30 11:45:08
Sech's summary is good, only thing I would add is Dirge & Carol, which are huge for certain situations. It really comes down to what your group needs to kill the enemy at hand. Dirge can really help keep hate on the tank, especially for long fights against single mobs, like Odyssey bosses at high vengeance level or W3 Dynamis [D] bosses. It isn't as relevant if your DDs are using magical or hybrid WS, or if they have /DRG to Super Jump their hate away.
Are you seeing now how there isn't just a default set of songs for all situations?
It also depends if you're using CC and have Daurdabla, or if you have Soul Voice up, whether you have a GEO, which GEO buffs they're using, etc. If you have Chaos, Fury, Frailty, Dia 3, and Corrosive Ooze, you'll probably want an Etude or two since attack will easily be capped.
Talk to your party about what they're after, how their accuracy sets are, etc. to determine what the best songs are.
[+]
Phoenix.Capuchin
Serveur: Phoenix
Game: FFXI
Posts: 3628
By Phoenix.Capuchin 2023-01-30 17:37:20
A couple additional points:
1) Marcato (150% song potency for the next ONE song) is an important ability that I sometimes see less experienced BRDs using poorly.
* Remember to use Marcato whenever it's up and it's time to re-sing; meaning every time you sing NiTro songs for a Carnwenhan BRD, and likely every other set of songs for a non-Mythic BRD.
* For Marsyas owners: Marcato should normally be used to power up Honor March, unless you have a very good reason to increase the strength of a different song (see below). Marcato+HM adds Atk+116, Acc+29, and about 8.5% haste. Compare that to using Marcato on Valor Minuet V, which only gains Atk+111 (assuming Song potency +8), and it's obvious that HM is the better call.
* Without Marsyas: You're usually going to be using two Marches that will already cap party haste, so additional potency from Marcato is going to be useless in that situation (same logic applies for situations like when the Bard is doing only one March because another job like a RDM or SMN is also giving Haste II to those who need it and already putting them at capped haste). Therefore, usually your Attack song is the next most important BRD song, so general rule of thumb should be to use Marcato for your highest Minuet, unless you have a very good reason to prioritize something else (see next bullet for some examples).
* On occasion you might consider Marcato for a different song. Party really struggling for accuracy? Marcato Blade Madrigal adds Acc+54 above the normal Acc+108 from a song+8 bard (a bigger Acc buff than Marcato+HM), and you may prefer to prioritize Acc over Atk. Or maybe you're super sure your party is capping attack already from other buffs/debuffs, so you don't need any more Haste OR attack... well, then you might want to Marcato something else like an Etude if you're using one, or if you're using a common March/March/Min/Min, perhaps you save the Marcato for a Ballad on the backline, or to Pianissimo Sirvente or Minne on a tank (or Dirge on a heavy DD), etc. But the point is, those situations are rare - Marcato is usually for Honor March, or Minuet V for non-Aeonic BRDs.
* Re: capped attack. In that situation, stacking even more attack with Marcato Minuet is not adding anything of value. However, I'd strongly advise people to not assume all your DDs are attack capped unless you're ABSOLUTELY POSITIVE that is the case. It can be quite hard to judge, and it is very easy to lose capped attack for some period of time (for example, Dia drops from the mob, a GEO bubble gets destroyed, a Chaos Roll or Minuet gets dispelled, a mob uses a defense boosting TP move, somebody forgets to use Angon/Tachi:Ageha/Full Break, whatever). Erring on the side of adding more attack is the safer call for the vast majority of sitautions.
2) Another common reason to use a Madrigal would be if you have players using low accuracy non-ilevel weapons such as an offhand Magian TP Bonus +1000 weapon (frequent for jobs like THF DNC BLU) or a Kraken Club.
And there ARE still situations where even with lv119 weapons you will need party acc buffs due to evasive mobs. For example, it's pretty standard to use Blade Madrigal as one of your songs for Dyna Divergence wave 3 (even though that's not necessary for most parties in wave 1-2).
[+]
Serveur: Asura
Game: FFXI
Posts: 486
By Asura.Dexprozius 2023-01-30 17:40:08
Carbuncle.Maletaru said: »It's also worth noting that if you do all your DD songs with the mage and tank in range and they get NiTro Minuet & March, you will not be able to apply 5 new songs to your WHM and tank. If you put 3 ballads on the WHM, for example, they will just keep replacing each other and not replacing the Minuets.
It's possible to re-apply "dummy" versions of the melee songs to your tank/healer, THEN apply their real songs, but my recommendation is to have the healer and tank go out of range when you do the melee songs, if possible. Then you can apply the 5 songs of your choice to them.
That said, the NiTro window is very stressful some of the time and if your healer can get by with a single Ballad it makes your life a whole lot easier.
That's partially not true. It just depends how long you let the Minuets decay. In particular, you can sing dummies 1st starting with Marches to get DDs rolling mid buff. Then if you NiTro sing the Minuets 1st, then 2 Marches, you can generally give your PLD 2 Minnes and a Ballad overwriting the Minuets, as they've decayed for maybe 15-20seconds by that point, and then you can Ballad x2 your WHM/SCH.
Realistically the trick is juggling timers, making sure you do your lowest duration ones last to ensure they overwrite. I went a LONG time using the Empyrean legs for Ballad, and found that the Inyanga +2 were much better because at the cost of 1 potency on your Ballads, you're able to more consistently overwrite melee songs on your mages.
If you're trying to do 5 songs on your mages after the 5 songs on your melee, the same principle should apply here, but realistically the mages would want haste too, so you wouldnt really need to do 5 new songs, just 3, maybe 4.
By trinironnie 2023-02-18 16:14:45
Anyone got a BRD lua that allows you to have DD weapons? Switches to carn for songs then back the originial DD weapon ?
By quelthos 2023-02-18 16:58:57
Anyone got a BRD lua that allows you to have DD weapons? Switches to carn for songs then back the originial DD weapon ?
Mine has weapon toggles with windows key + R or E.
windows key + W for weapon lock.
by default it switches to carn to sing unless you weapon lock.
So if you have naegling or other weapons toggled, it will try to switch to carn then back.
Code
-- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
res = require 'resources'
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.SongMode = M{['description']='Song Mode', 'None', 'Placeholder'}
state.Buff['Pianissimo'] = buffactive['pianissimo'] or false
no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
"Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring"}
elemental_ws = S{"Aeolian Edge"}
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
-- Setup vars that are user-dependent. Can override this function in a sidecar file.
function user_setup()
state.OffenseMode:options('Normal')
state.HybridMode:options('Normal')
state.WeaponskillMode:options('Normal')
state.CastingMode:options('Normal', 'Resistant')
state.IdleMode:options('Normal', 'Refresh')
state.LullabyMode = M{['description']='Lullaby Instrument', 'Harp', 'Horn'}
state.Carol = M{['description']='Carol',
'Fire Carol', 'Fire Carol II', 'Ice Carol', 'Ice Carol II', 'Wind Carol', 'Wind Carol II',
'Earth Carol', 'Earth Carol II', 'Lightning Carol', 'Lightning Carol II', 'Water Carol', 'Water Carol II',
'Light Carol', 'Light Carol II', 'Dark Carol', 'Dark Carol II',
}
state.Threnody = M{['description']='Threnody',
'Fire Threnody II', 'Ice Threnody II', 'Wind Threnody II', 'Earth Threnody II',
'Ltng. Threnody II', 'Water Threnody II', 'Light Threnody II', 'Dark Threnody II',
}
state.Etude = M{['description']='Etude', 'Sinewy Etude', 'Herculean Etude', 'Learned Etude', 'Sage Etude',
'Quick Etude', 'Swift Etude', 'Vivacious Etude', 'Vital Etude', 'Dextrous Etude', 'Uncanny Etude',
'Spirited Etude', 'Logical Etude', 'Enchanting Etude', 'Bewitching Etude'}
state.WeaponSet = M{['description']='Weapon Set', 'Mordant', 'Naegling', 'Tauret', 'Rudra'}
state.WeaponLock = M(false, 'Weapon Lock')
-- state.CP = M(false, "Capacity Points Mode")
-- Additional local binds
-- include('Global-Binds.lua') -- OK to remove this line
-- include('Global-GEO-Binds.lua') -- OK to remove this line
-- Adjust this if using the Terpander (new +song instrument)
info.ExtraSongInstrument = 'Daurdabla'
-- How many extra songs we can keep from Daurdabla/Terpander
info.ExtraSongs = 2
--send_command('bind ^` input /ma "Chocobo Mazurka" <me>')
send_command('bind @` gs c cycle LullabyMode')
send_command('bind ^` gs c cycle SongMode')
--send_command('bind !p input /ja "Pianissimo" <me>')
--send_command('bind ^insert gs c cycleback Etude')
--send_command('bind ^delete gs c cycle Etude')
--send_command('bind ^home gs c cycleback Carol')
--send_command('bind ^end gs c cycle Carol')
--send_command('bind ^pageup gs c cycleback Threnody')
--send_command('bind ^pagedown gs c cycle Threnody')
send_command('bind @w gs c toggle WeaponLock')
-- send_command('bind @c gs c toggle CP')
send_command('bind @e gs c cycleback WeaponSet')
send_command('bind @r gs c cycle WeaponSet')
send_command('bind ` tc nearest')
--send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
--send_command('bind ^numpad7 input /ws "Mordant Rime" <t>')
--send_command('bind ^numpad4 input /ws "Evisceration" <t>')
--send_command('bind ^numpad5 input /ws "Rudra\'s Storm" <t>')
--send_command('bind ^numpad1 input /ws "Aeolian Edge" <t>')
select_default_macro_book()
state.Auto_Kite = M(false, 'Auto_Kite')
Haste = 0
DW_needed = 0
DW = false
moving = false
update_combat_form()
determine_haste_group()
end
-- Called when this job file is unloaded (eg: job change)
function user_unload()
send_command('unbind ^`')
send_command('unbind !`')
send_command('unbind ^backspace')
send_command('unbind !insert')
send_command('unbind !delete')
send_command('unbind ^insert')
send_command('unbind ^delete')
send_command('unbind ^home')
send_command('unbind ^end')
send_command('unbind ^pageup')
send_command('unbind ^pagedown')
send_command('unbind @`')
send_command('unbind @w')
send_command('unbind `')
-- send_command('unbind @c')
send_command('unbind @e')
send_command('unbind @r')
send_command('unbind ^numpad7')
send_command('unbind ^numpad4')
send_command('unbind ^numpad5')
send_command('unbind ^numpad1')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Fast cast sets for spells
sets.precast.FC = {
--main="Kali",
head="Nahtirah Hat",
body="Inyanga Jubbah +2",
hands="Leyline Gloves",
legs="Aya. Cosciales +2",
feet="Fili Cothurnes +2",
neck="Baetyl Pendant",
waist="Embla Sash",
left_ear="Loquac. Earring",
right_ear="Etiolation Earring",
left_ring="Kishar Ring",
right_ring="Weather. Ring",
back={ name="Fi Follet Cape +1", augments={'Path: A',}},
}
sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})
sets.precast.FC.Cure = set_combine(sets.precast.FC, {
feet="Kaykaus Boots +1", --0/7
ear2="Mendi. Earring", --0/5
})
sets.precast.FC.BardSong = set_combine(sets.precast.FC, {
--main="Kali",
range="Gjallarhorn",
head="Fili Calot +2", --14
--body="Brioso Justau. +3", --15
--feet="Bihu Slippers +3", --9
})
sets.precast.FC["Honor March"] = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})
sets.precast.FC.SongPlaceholder = set_combine(sets.precast.FC.BardSong, {range=info.ExtraSongInstrument})
sets.precast.FC.Dispelga = set_combine(sets.precast.FC, {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})
-- Precast sets to enhance JAs
sets.precast.JA.Nightingale = {feet="Bihu Slippers +3"}
sets.precast.JA.Troubadour = {body="Bihu Jstcorps. +3"}
sets.precast.JA['Soul Voice'] = {legs="Bihu Cannions +3"}
-- Waltz set (chr and vit)
sets.precast.Waltz = {}
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
-- Default set for any weaponskill that isn't any more specifically defined
sets.precast.WS = {
range={ name="Linos", augments={'Attack+16','Weapon skill damage +3%','Quadruple Attack +2',}},
head="Nyame Helm",
body="Bihu Jstcorps. +3",
hands="Nyame Gauntlets",
legs="Nyame Flanchard",
feet="Nyame Sollerets",
neck="Rep. Plat. Medal",
waist={ name="Sailfi Belt +1", augments={'Path: A',}},
ear1={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
ear2="Ishvara Earring",
left_ring="Epaminondas's Ring",
right_ring="Sroda Ring",
back={ name="Intarabus's Cape", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
}
-- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
head={ name="Blistering Sallet +1", augments={'Path: A',}},
body="Ayanmo Corazza +2",
neck="Fotia Gorget",
right_ear="Mache Earring +1",
left_ring="Begrudging Ring",
right_ring="Hetairoi Ring",
waist="Fotia Belt",
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
})
sets.precast.WS['Mordant Rime'] = set_combine(sets.precast.WS, {
head="Bihu Roundlet +3",
body="Bihu Jstcorps. +3",
hands="Bihu Cuffs +3",
legs="Bihu Cannions +3",
feet="Bihu Slippers +3",
ear1="Regal Earring",
right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
waist="Kentarch Belt +1",
back={ name="Intarabus's Cape", augments={'CHR+20','Accuracy+20 Attack+20','CHR+10','Weapon skill damage +10%',}},
})
sets.precast.WS['Rudra\'s Storm'] = set_combine(sets.precast.WS, {
waist="Kentarch Belt +1",
right_ring="Ilabrat Ring",
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
})
sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS, {
waist="Orpheus's Sash",
neck="Sibyl Scarf",
waist="Orpheus's Sash",
ear2="Friomisi Earring",
right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
back="Izdubar Mantle",
})
sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
})
sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {
})
------------------------------------------------------------------------------------------------
---------------------------------------- Midcast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- General set for recast times.
sets.midcast.FastRecast = sets.precast.FC
sets.midcast.SpellInterrupt = {
ammo="Staunch Tathlum +1", --11
--body="Ros. Jaseran +1", --25
hands=gear.Chironic_WSD_hands, --20
--legs="Querkening Brais" --15
neck="Loricate Torque +1", --5
ear1="Halasz Earring", --5
ear2="Magnetic Earring", --8
ring2="Evanescence Ring", --5
waist="Rumination Sash", --10
}
sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
-- Gear to enhance certain classes of songs.
sets.midcast.Ballad = {legs="Fili Rhingrave +2"}
sets.midcast.Carol = {hands="Mousai Gages +1"}
sets.midcast.Etude = {head="Mousai Turban +1"}
sets.midcast.HonorMarch = {range="Marsyas", hands="Fili Manchettes +2"}
sets.midcast.Lullaby = {body="Fili Hongreline +2"}
sets.midcast.Madrigal = {head="Fili Calot +2"}
sets.midcast.Mambo = {feet="Mou. Crackows +1"}
sets.midcast.March = {hands="Fili Manchettes +2"}
sets.midcast.Minne = {legs="Mou. Seraweels +1"}
sets.midcast.Minuet = {body="Fili Hongreline +2"}
sets.midcast.Paeon = {head="Brioso Roundlet +3",range=info.ExtraSongInstrument} --for singer addon dummy
sets.midcast.Threnody = {body="Mou. Manteel +1"}
sets.midcast['Adventurer\'s Dirge'] = {range="Marsyas", hands="Bihu Cuffs +3"}
sets.midcast['Foe Sirvente'] = {head="Bihu Roundlet +3"}
sets.midcast['Magic Finale'] = {legs="Fili Rhingrave +2"}
sets.midcast["Sentinel's Scherzo"] = {feet="Fili Cothurnes +2"}
sets.midcast["Chocobo Mazurka"] = {range="Marsyas"}
-- For song buffs (duration and AF3 set bonus)
sets.midcast.SongEnhancing = {
main="Carnwenhan",
range="Gjallarhorn",
head="Fili Calot +2",
body="Fili Hongreline +2",
hands="Fili Manchettes +2",
legs="Inyanga Shalwar +2",
feet="Brioso Slippers +3",
neck="Mnbw. Whistle +1",
waist="Flume Belt",
left_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
right_ear="Genmei Earring",
left_ring="Defending Ring",
right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
}
-- For song defbuffs (duration primary, accuracy secondary)
sets.midcast.SongEnfeeble = {
main="Carnwenhan",
sub="Ammurapi Shield",
range="Gjallarhorn",
head="Brioso Roundlet +3",
body="Brioso Justau. +3",
hands="Brioso Cuffs +3",
legs="Inyanga Shalwar +2",
feet="Brioso Slippers +3",
neck="Mnbw. Whistle +1",
ear1="Digni. Earring",
ear2="Regal Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
ring2={name="Stikini Ring +1", bag="wardrobe3"},
waist="Acuity Belt +1",
back="Aurist's Cape +1",
}
-- For song defbuffs (accuracy primary, duration secondary)
sets.midcast.SongEnfeebleAcc = set_combine(sets.midcast.SongEnfeeble, {legs="Brioso Cannions +3"})
-- For Horde Lullaby maxiumum AOE range.
sets.midcast.SongStringSkill = set_combine(sets.midcast.Lullaby, {
body="Brioso Justau. +3",
hands="Inyan. Dastanas +2",
ear1="Gersemi Earring",
ear2="Darkside Earring",
})
-- Placeholder song; minimize duration to make it easy to overwrite.
sets.midcast.SongPlaceholder = set_combine(sets.precast.FC, {range=info.ExtraSongInstrument})
-- Other general spells and classes.
sets.midcast.Cure = {
main="Daybreak", --30
sub="Ammurapi Shield",
head="Kaykaus Mitra +1",
body="Kaykaus Bliaut +1",
hands="Kaykaus Cuffs +1",
legs="Kaykaus Tights +1",
feet="Kaykaus Boots +1",
neck="Incanter's Torque",
waist="Luminary Sash",
left_ear="Mendi. Earring",
right_ear="Meili Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
right_ring="Sirona's Ring",
back="Solemnity Cape",
}
sets.midcast.Curaga = set_combine(sets.midcast.Cure, {
})
sets.midcast.StatusRemoval = {
head="Vanya Hood",
body="Vanya Robe",
legs="Aya. Cosciales +2",
feet="Vanya Clogs",
neck="Incanter's Torque",
ear2="Meili Earring",
ring1="Menelaus's Ring",
ring2="Haoma's Ring",
back=gear.BRD_Song_Cape,
waist="Bishop's Sash",
}
sets.midcast.Cursna = set_combine(sets.midcast.StatusRemoval, {
hands="Hieros Mittens",
neck="Debilis Medallion",
ear1="Beatific Earring",
back="Oretan. Cape +1",
})
sets.midcast['Enhancing Magic'] = {
main="Carnwenhan",
sub="Ammurapi Shield",
head={ name="Telchine Cap", augments={'Enh. Mag. eff. dur. +10',}},
body={ name="Telchine Chas.", augments={'Enh. Mag. eff. dur. +9',}},
hands={ name="Telchine Gloves", augments={'Enh. Mag. eff. dur. +9',}},
legs={ name="Telchine Braconi", augments={'Enh. Mag. eff. dur. +10',}},
feet={ name="Telchine Pigaches", augments={'Enh. Mag. eff. dur. +9',}},
neck="Incanter's Torque",
ear1="Mimir Earring",
ear2="Andoaa Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
ring2={name="Stikini Ring +1", bag="wardrobe3"},
back="Fi Follet Cape +1",
waist="Embla Sash",
}
sets.midcast.Regen = set_combine(sets.midcast['Enhancing Magic'], {head="Inyanga Tiara +2"})
sets.midcast.Haste = sets.midcast['Enhancing Magic']
sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash", back="Grapevine Cape"})
sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget", waist="Siegel Sash"})
sets.midcast.Aquaveil = set_combine(sets.midcast['Enhancing Magic'], {waist="Emphatikos Rope"})
sets.midcast.Protect = set_combine(sets.midcast['Enhancing Magic'], {ring2="Sheltered Ring"})
sets.midcast.Protectra = sets.midcast.Protect
sets.midcast.Shell = sets.midcast.Protect
sets.midcast.Shellra = sets.midcast.Shell
sets.midcast['Enfeebling Magic'] = {
main="Carnwenhan",
sub="Ammurapi Shield",
head="C. Palug Crown",
body="Inyanga Jubbah +2",
hands="Inyan. Dastanas +2",
legs="Inyanga Shalwar +2",
feet="Brioso Slippers +3",
neck="Mnbw. Whistle +1",
ear1="Digni. Earring",
ear2="Vor Earring",
ring1="Kishar Ring",
ring2="Metamor. Ring +1",
waist="Acuity Belt +1",
back="Aurist's Cape +1",
}
sets.midcast.Dispelga = set_combine(sets.midcast['Enfeebling Magic'], {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
range="Gjallarhorn",
head="Nyame Helm",
body="Nyame Mail",
hands="Nyame Gauntlets",
legs="Nyame Flanchard",
feet="Nyame Sollerets",
neck="Elite Royal Collar",
waist="Flume Belt",
left_ear="Tuisto Earring",
right_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
left_ring="Defending Ring",
right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
}
sets.idle.Refresh = set_combine(sets.idle, {
head="Inyanga Tiara +2",
body="Inyanga Jubbah +2",
hands="Inyanga Dastanas +2",
legs="Inyanga Shalwar +2",
feet="Inyanga Crackows +2",
left_ear="Genmei Earring",
right_ear="Etiolation Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
ring2={name="Stikini Ring +1", bag="wardrobe3"},
})
sets.idle.Town = set_combine(sets.idle, {
})
------------------------------------------------------------------------------------------------
---------------------------------------- Defense Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.enmity = set_combine(sets.idle, {
main="Mafic Cudgel",
sub="Genmei Shield",
ammo="Sapience Orb",
head="Halitus Helm",
neck="Unmoving Collar +1",
ear1="Trux Earring",
ear2="Cryptic Earring",
body="Emet Harness +1",
ring1="Supershear Ring",
ring2="Pernicious Ring",
back="Reiki Cloak",
waist="Trance Belt",
legs="Zoar Subligar +1",
})
sets.midcast['Foe Requiem'] = sets.enmity
sets.midcast['Foe Requiem II'] = sets.enmity
sets.midcast['Foe Requiem III'] = sets.enmity
sets.defense.PDT = sets.idle.DT
sets.defense.MDT = sets.idle.DT
sets.Kiting = {feet="Fili Cothurnes +2"}
sets.latent_refresh = {waist="Fucho-no-obi"}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Engaged sets
-- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
-- sets if more refined versions aren't defined.
-- If you create a set with both offense and defense modes, the offense mode should be first.
-- EG: sets.engaged.Dagger.Accuracy.Evasion
sets.engaged = {
range={ name="Linos", augments={'Accuracy+15','"Store TP"+3','DEX+7',}},
--ammo="Coiste Bodhar",
head="Aya. Zucchetto +2", --6
body="Ayanmo Corazza +2", --4
hands="Gazu Bracelets +1", --15
legs="Nyame Flanchard", --5
feet="Nyame Sollerets", --3
neck="Bard's Charm +2",
waist={ name="Kentarch Belt +1", augments={'Path: A',}},
left_ear="Cessance Earring",
right_ear="Telos Earring",
ring1={name="Chirich Ring +1", bag="wardrobe2"},
ring2={name="Chirich Ring +1", bag="wardrobe3"},
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
}
sets.engaged.Acc = set_combine(sets.engaged, {
})
-- * DNC Subjob DW Trait: +15%
-- * NIN Subjob DW Trait: +25%
-- No Magic Haste (74% DW to cap)
sets.engaged.DW = set_combine(sets.engaged, {
ear1="Eabani Earring", --4
waist="Reiki Yotai", --7
})
sets.engaged.DW.Acc = set_combine(sets.engaged.DW, {
})
-- 15% Magic Haste (67% DW to cap)
sets.engaged.DW.LowHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.LowHaste = set_combine(sets.engaged.DW, {
})
-- 30% Magic Haste (56% DW to cap)
sets.engaged.DW.MidHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.MidHaste = set_combine(sets.engaged.DW, {
})
-- 35% Magic Haste (51% DW to cap)
sets.engaged.DW.HighHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.HighHaste = set_combine(sets.engaged.DW, {
})
-- 45% Magic Haste (36% DW to cap)
sets.engaged.DW.MaxHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.MaxHaste.Acc = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.MaxHastePlus = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.MaxHastePlus = set_combine(sets.engaged.DW, {
})
--sets.engaged.Aftermath = set_combine(sets.engaged, {})
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
sets.engaged.Hybrid = {
}
sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
sets.engaged.Acc.DT = set_combine(sets.engaged.Acc, sets.engaged.Hybrid)
sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT = set_combine(sets.engaged.DW.Acc, sets.engaged.Hybrid)
sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.LowHaste = set_combine(sets.engaged.DW.Acc.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.MidHaste = set_combine(sets.engaged.DW.Acc.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.HighHaste = set_combine(sets.engaged.DW.Acc.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.MaxHaste = set_combine(sets.engaged.DW.Acc.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MaxHastePlus = set_combine(sets.engaged.DW.MaxHastePlus, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.MaxHastePlus = set_combine(sets.engaged.DW.Acc.MaxHastePlus, sets.engaged.Hybrid)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
--sets.SongDWDuration = {main="Carnwenhan", sub="Kali"}
sets.buff.Doom = {
--neck="Nicander's Necklace", --20
ring1={name="Eshmun's Ring", bag="wardrobe3"}, --20
ring2={name="Eshmun's Ring", bag="wardrobe4"}, --20
waist="Gishdubar Sash", --10
}
sets.Obi = {waist="Hachirin-no-Obi"}
-- sets.CP = {back="Mecisto. Mantle"}
--sets.Reive = {neck="Ygnas's Resolve +1"}
sets.Mordant = {main="Carnwenhan", sub="Ternion Dagger +1"}
--sets.Twashtar = {main="Twashtar", sub="Taming Sari"}
sets.Rudra = {main="Carnwenhan", sub="Fusetto +2"}
sets.Naegling = {main="Naegling", sub="Fusetto +2"}
sets.Tauret = {main="Tauret", sub="Fusetto +2"}
--sets.Trial = {main="Fusetto +1", sub="Esikuva"}
sets.DefaultShield = {sub="Genmei Shield"}
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 spell.type == 'BardSong' then
--[[ Auto-Pianissimo
if ((spell.target.type == 'PLAYER' and not spell.target.charmed) or (spell.target.type == 'NPC' and spell.target.in_party)) and
not state.Buff['Pianissimo'] then
local spell_recasts = windower.ffxi.get_spell_recasts()
if spell_recasts[spell.recast_id] < 2 then
send_command('@input /ja "Pianissimo" <me>; wait 1.5; input /ma "'..spell.name..'" '..spell.target.name)
eventArgs.cancel = true
return
end
end]]
if spell.name == 'Honor March' then
equip({range="Marsyas"})
end
if string.find(spell.name,'Lullaby') then
if buffactive.Troubadour then
equip({range="Marsyas"})
elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
equip({range="Daurdabla"})
else
--equip({range="Gjallarhorn"})
equip({range="Blurred Harp +1"})
end
end
end
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
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == 'WeaponSkill' then
if elemental_ws:contains(spell.name) then
-- Matching double weather (w/o day conflict).
if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 1.7 yalms.
elseif spell.target.distance < (1.7 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Matching day and weather.
elseif spell.element == world.day_element and spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 8 yalms.
elseif spell.target.distance < (8 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Match day or weather.
elseif spell.element == world.day_element or spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
end
end
end
end
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_midcast(spell, action, spellMap, eventArgs)
if spell.type == 'BardSong' then
-- layer general gear on first, then let default handler add song-specific gear.
local generalClass = get_song_class(spell)
if generalClass and sets.midcast[generalClass] then
equip(sets.midcast[generalClass])
end
state.SongMode:reset() -- reset after each dummy song
if spell.name == 'Honor March' then
equip({range="Marsyas"})
end
if string.find(spell.name,'Lullaby') then
if buffactive.Troubadour then
equip({range="Marsyas"})
elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
equip({range="Daurdabla"})
equip(sets.midcast.SongStringSkill)
else
--equip({range="Gjallarhorn"})
equip({range="Blurred Harp +1"})
end
end
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.type == 'BardSong' then
if player.status ~= 'Engaged' and state.WeaponLock.value == false and (player.sub_job == 'DNC' or player.sub_job == 'NIN') then
equip(sets.SongDWDuration)
end
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
if spell.english:contains('Lullaby') and not spell.interrupted then
get_lullaby_duration(spell)
end
if player.status ~= 'Engaged' and state.WeaponLock.value == false then
check_weaponset()
end
if player.status == 'Engaged' and state.WeaponLock.value == false then
check_weaponset()
end
end
function job_buff_change(buff,gain)
-- if buffactive['Reive Mark'] then
-- if gain then
-- equip(sets.Reive)
-- disable('neck')
-- else
-- enable('neck')
-- end
-- end
if buff == "doom" then
if gain then
equip(sets.buff.Doom)
send_command('@input /p Doomed, please Cursna.')
send_command('@input /item "Holy Water" <me>')
disable('ring1','ring2','waist')
elseif not gain and not player.status == "Dead" and not player.status == "Engaged Dead" then
enable('ring1','ring2','waist')
send_command('input /p Doom removed, Thank you.')
handle_equipping_gear(player.status)
else
enable('ring1','ring2','waist')
send_command('input /p '..player.name..' is no longer Doom Thank you !')
end
end
end
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
if state.WeaponLock.value == true then
disable('main','sub')
else
enable('main','sub')
end
check_weaponset()
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- Called by the 'update' self-command, for common needs.
-- Set eventArgs.handled to true if we don't want automatic equipping of gear.
function job_handle_equipping_gear(playerStatus, eventArgs)
check_gear()
update_combat_form()
determine_haste_group()
check_moving()
end
function job_update(cmdParams, eventArgs)
handle_equipping_gear(player.status)
end
function update_combat_form()
if player.sub_job == 'NIN' then
state.CombatForm:set('DW')
else
state.CombatForm:reset()
end
end
-- Called for direct player commands.
function job_self_command(cmdParams, eventArgs)
if cmdParams[1]:lower() == 'etude' then
send_command('@input /ma '..state.Etude.value..' <stpc>')
elseif cmdParams[1]:lower() == 'carol' then
send_command('@input /ma '..state.Carol.value..' <stpc>')
elseif cmdParams[1]:lower() == 'threnody' then
send_command('@input /ma '..state.Threnody.value..' <stnpc>')
end
gearinfo(cmdParams, eventArgs)
end
-- Modify the default melee set after it was constructed.
--function customize_melee_set(meleeSet)
--if buffactive['Aftermath: Lv.3'] and player.equipment.main == "Carnwenhan" then
--meleeSet = set_combine(meleeSet, sets.engaged.Aftermath)
--end
--check_weaponset()
--return meleeSet
--end
function get_custom_wsmode(spell, action, spellMap)
local wsmode
if state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
wsmode = 'Acc'
end
return wsmode
end
-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
-- if state.CP.current == 'on' then
-- equip(sets.CP)
-- disable('back')
-- else
-- enable('back')
-- end
--if player.sub_job == 'WHM' then
--idleSet = set_combine(idleSet, sets.idle.refresh)
--end
--if player.mpp < 51 then
--idleSet = set_combine(idleSet, sets.idle.refresh)
--end
if state.Auto_Kite.value == true then
idleSet = set_combine(idleSet, sets.Kiting)
end
return idleSet
end
-- Set eventArgs.handled to true if we don't want the automatic display to be run.
function display_current_job_state(eventArgs)
local cf_msg = ''
if state.CombatForm.has_value then
cf_msg = ' (' ..state.CombatForm.value.. ')'
end
local m_msg = state.OffenseMode.value
if state.HybridMode.value ~= 'Normal' then
m_msg = m_msg .. '/' ..state.HybridMode.value
end
local ws_msg = state.WeaponskillMode.value
local c_msg = state.CastingMode.value
local d_msg = 'None'
if state.DefenseMode.value ~= 'None' then
d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
end
local i_msg = state.IdleMode.value
local msg = ''
if state.Kiting.value then
msg = msg .. ' Kiting: On |'
end
add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002).. ' |'
..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002).. ' |'
..string.char(31,060).. ' Magic: ' ..string.char(31,001)..c_msg.. string.char(31,002).. ' |'
..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002).. ' |'
..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002).. ' |'
..string.char(31,002)..msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
-- Determine the custom class to use for the given song.
function get_song_class(spell)
-- Can't use spell.targets:contains() because this is being pulled from resources
if set.contains(spell.targets, 'Enemy') then
if state.CastingMode.value == 'Resistant' then
return 'SongEnfeebleAcc'
else
return 'SongEnfeeble'
end
elseif state.SongMode.value == 'Placeholder' then
return 'SongPlaceholder'
else
return 'SongEnhancing'
end
end
function get_lullaby_duration(spell)
local self = windower.ffxi.get_player()
local troubadour = false
local clarioncall = false
local soulvoice = false
local marcato = false
for i,v in pairs(self.buffs) do
if v == 348 then troubadour = true end
if v == 499 then clarioncall = true end
if v == 52 then soulvoice = true end
if v == 231 then marcato = true end
end
local mult = 1
if player.equipment.range == 'Daurdabla' then mult = mult + 0.3 end -- change to 0.25 with 90 Daur
if player.equipment.range == "Gjallarhorn" then mult = mult + 0.4 end -- change to 0.3 with 95 Gjall
if player.equipment.range == "Marsyas" then mult = mult + 0.5 end
if player.equipment.main == "Carnwenhan" then mult = mult + 0.5 end -- 0.1 for 75, 0.4 for 95, 0.5 for 99/119
if player.equipment.main == "Legato Dagger" then mult = mult + 0.05 end
if player.equipment.main == "Kali" then mult = mult + 0.05 end
if player.equipment.sub == "Kali" then mult = mult + 0.05 end
if player.equipment.sub == "Legato Dagger" then mult = mult + 0.05 end
if player.equipment.neck == "Aoidos' Matinee" then mult = mult + 0.1 end
if player.equipment.neck == "Mnbw. Whistle" then mult = mult + 0.2 end
if player.equipment.neck == "Mnbw. Whistle +1" then mult = mult + 0.3 end
if player.equipment.body == "Fili Hongreline +2" then mult = mult + 0.12 end
if player.equipment.legs == "Inyanga Shalwar +1" then mult = mult + 0.15 end
if player.equipment.legs == "Inyanga Shalwar +2" then mult = mult + 0.17 end
if player.equipment.feet == "Brioso Slippers" then mult = mult + 0.1 end
if player.equipment.feet == "Brioso Slippers +1" then mult = mult + 0.11 end
if player.equipment.feet == "Brioso Slippers +2" then mult = mult + 0.13 end
if player.equipment.feet == "Brioso Slippers +3" then mult = mult + 0.15 end
if player.equipment.hands == 'Brioso Cuffs +1' then mult = mult + 0.1 end
if player.equipment.hands == 'Brioso Cuffs +2' then mult = mult + 0.1 end
if player.equipment.hands == 'Brioso Cuffs +3' then mult = mult + 0.2 end
--JP Duration Gift
if self.job_points.brd.jp_spent >= 1200 then
mult = mult + 0.05
end
if troubadour then
mult = mult * 2
end
if spell.en == "Foe Lullaby II" or spell.en == "Horde Lullaby II" then
base = 60
elseif spell.en == "Foe Lullaby" or spell.en == "Horde Lullaby" then
base = 30
end
totalDuration = math.floor(mult * base)
-- Job Points Buff
totalDuration = totalDuration + self.job_points.brd.lullaby_duration
if troubadour then
totalDuration = totalDuration + self.job_points.brd.lullaby_duration
-- adding it a second time if Troubadour up
end
if clarioncall then
if troubadour then
totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2 * 2)
-- Clarion Call gives 2 seconds per Job Point upgrade. * 2 again for Troubadour
else
totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2)
-- Clarion Call gives 2 seconds per Job Point upgrade.
end
end
if marcato and not soulvoice then
totalDuration = totalDuration + self.job_points.brd.marcato_effect
end
-- Create the custom timer
if spell.english == "Foe Lullaby II" or spell.english == "Horde Lullaby II" then
send_command('@timers c "Lullaby II ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00377.png')
elseif spell.english == "Foe Lullaby" or spell.english == "Horde Lullaby" then
send_command('@timers c "Lullaby ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00376.png')
end
end
function determine_haste_group()
classes.CustomMeleeGroups:clear()
if DW == true then
if DW_needed <= 12 then
classes.CustomMeleeGroups:append('MaxHaste')
elseif DW_needed > 12 and DW_needed <= 21 then
classes.CustomMeleeGroups:append('MaxHastePlus')
elseif DW_needed > 21 and DW_needed <= 27 then
classes.CustomMeleeGroups:append('HighHaste')
elseif DW_needed > 27 and DW_needed <= 31 then
classes.CustomMeleeGroups:append('MidHaste')
elseif DW_needed > 31 and DW_needed <= 42 then
classes.CustomMeleeGroups:append('LowHaste')
elseif DW_needed > 42 then
classes.CustomMeleeGroups:append('')
end
end
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
function check_moving()
if state.DefenseMode.value == 'None' and state.Kiting.value == false then
if state.Auto_Kite.value == false and moving then
state.Auto_Kite:set(true)
elseif state.Auto_Kite.value == true and moving == false then
state.Auto_Kite:set(false)
end
end
end
function check_gear()
if no_swap_gear:contains(player.equipment.left_ring) then
disable("ring1")
else
enable("ring1")
end
if no_swap_gear:contains(player.equipment.right_ring) then
disable("ring2")
else
enable("ring2")
end
end
function check_weaponset()
equip(sets[state.WeaponSet.current])
if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
equip(sets.DefaultShield)
end
end
function customize_melee_set(meleeSet)
check_weaponset()
return meleeSet
end
windower.register_event('zone change',
function()
if no_swap_gear:contains(player.equipment.left_ring) then
enable("ring1")
equip(sets.idle)
end
if no_swap_gear:contains(player.equipment.right_ring) then
enable("ring2")
equip(sets.idle)
end
end
)
By trinironnie 2023-02-19 10:35:20
Anyone got a BRD lua that allows you to have DD weapons? Switches to carn for songs then back the originial DD weapon ?
Mine has weapon toggles with windows key + R or E.
windows key + W for weapon lock.
by default it switches to carn to sing unless you weapon lock.
So if you have naegling or other weapons toggled, it will try to switch to carn then back.
Code
-- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
res = require 'resources'
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.SongMode = M{['description']='Song Mode', 'None', 'Placeholder'}
state.Buff['Pianissimo'] = buffactive['pianissimo'] or false
no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
"Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring"}
elemental_ws = S{"Aeolian Edge"}
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
-- Setup vars that are user-dependent. Can override this function in a sidecar file.
function user_setup()
state.OffenseMode:options('Normal')
state.HybridMode:options('Normal')
state.WeaponskillMode:options('Normal')
state.CastingMode:options('Normal', 'Resistant')
state.IdleMode:options('Normal', 'Refresh')
state.LullabyMode = M{['description']='Lullaby Instrument', 'Harp', 'Horn'}
state.Carol = M{['description']='Carol',
'Fire Carol', 'Fire Carol II', 'Ice Carol', 'Ice Carol II', 'Wind Carol', 'Wind Carol II',
'Earth Carol', 'Earth Carol II', 'Lightning Carol', 'Lightning Carol II', 'Water Carol', 'Water Carol II',
'Light Carol', 'Light Carol II', 'Dark Carol', 'Dark Carol II',
}
state.Threnody = M{['description']='Threnody',
'Fire Threnody II', 'Ice Threnody II', 'Wind Threnody II', 'Earth Threnody II',
'Ltng. Threnody II', 'Water Threnody II', 'Light Threnody II', 'Dark Threnody II',
}
state.Etude = M{['description']='Etude', 'Sinewy Etude', 'Herculean Etude', 'Learned Etude', 'Sage Etude',
'Quick Etude', 'Swift Etude', 'Vivacious Etude', 'Vital Etude', 'Dextrous Etude', 'Uncanny Etude',
'Spirited Etude', 'Logical Etude', 'Enchanting Etude', 'Bewitching Etude'}
state.WeaponSet = M{['description']='Weapon Set', 'Mordant', 'Naegling', 'Tauret', 'Rudra'}
state.WeaponLock = M(false, 'Weapon Lock')
-- state.CP = M(false, "Capacity Points Mode")
-- Additional local binds
-- include('Global-Binds.lua') -- OK to remove this line
-- include('Global-GEO-Binds.lua') -- OK to remove this line
-- Adjust this if using the Terpander (new +song instrument)
info.ExtraSongInstrument = 'Daurdabla'
-- How many extra songs we can keep from Daurdabla/Terpander
info.ExtraSongs = 2
--send_command('bind ^` input /ma "Chocobo Mazurka" <me>')
send_command('bind @` gs c cycle LullabyMode')
send_command('bind ^` gs c cycle SongMode')
--send_command('bind !p input /ja "Pianissimo" <me>')
--send_command('bind ^insert gs c cycleback Etude')
--send_command('bind ^delete gs c cycle Etude')
--send_command('bind ^home gs c cycleback Carol')
--send_command('bind ^end gs c cycle Carol')
--send_command('bind ^pageup gs c cycleback Threnody')
--send_command('bind ^pagedown gs c cycle Threnody')
send_command('bind @w gs c toggle WeaponLock')
-- send_command('bind @c gs c toggle CP')
send_command('bind @e gs c cycleback WeaponSet')
send_command('bind @r gs c cycle WeaponSet')
send_command('bind ` tc nearest')
--send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
--send_command('bind ^numpad7 input /ws "Mordant Rime" <t>')
--send_command('bind ^numpad4 input /ws "Evisceration" <t>')
--send_command('bind ^numpad5 input /ws "Rudra\'s Storm" <t>')
--send_command('bind ^numpad1 input /ws "Aeolian Edge" <t>')
select_default_macro_book()
state.Auto_Kite = M(false, 'Auto_Kite')
Haste = 0
DW_needed = 0
DW = false
moving = false
update_combat_form()
determine_haste_group()
end
-- Called when this job file is unloaded (eg: job change)
function user_unload()
send_command('unbind ^`')
send_command('unbind !`')
send_command('unbind ^backspace')
send_command('unbind !insert')
send_command('unbind !delete')
send_command('unbind ^insert')
send_command('unbind ^delete')
send_command('unbind ^home')
send_command('unbind ^end')
send_command('unbind ^pageup')
send_command('unbind ^pagedown')
send_command('unbind @`')
send_command('unbind @w')
send_command('unbind `')
-- send_command('unbind @c')
send_command('unbind @e')
send_command('unbind @r')
send_command('unbind ^numpad7')
send_command('unbind ^numpad4')
send_command('unbind ^numpad5')
send_command('unbind ^numpad1')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Fast cast sets for spells
sets.precast.FC = {
--main="Kali",
head="Nahtirah Hat",
body="Inyanga Jubbah +2",
hands="Leyline Gloves",
legs="Aya. Cosciales +2",
feet="Fili Cothurnes +2",
neck="Baetyl Pendant",
waist="Embla Sash",
left_ear="Loquac. Earring",
right_ear="Etiolation Earring",
left_ring="Kishar Ring",
right_ring="Weather. Ring",
back={ name="Fi Follet Cape +1", augments={'Path: A',}},
}
sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})
sets.precast.FC.Cure = set_combine(sets.precast.FC, {
feet="Kaykaus Boots +1", --0/7
ear2="Mendi. Earring", --0/5
})
sets.precast.FC.BardSong = set_combine(sets.precast.FC, {
--main="Kali",
range="Gjallarhorn",
head="Fili Calot +2", --14
--body="Brioso Justau. +3", --15
--feet="Bihu Slippers +3", --9
})
sets.precast.FC["Honor March"] = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})
sets.precast.FC.SongPlaceholder = set_combine(sets.precast.FC.BardSong, {range=info.ExtraSongInstrument})
sets.precast.FC.Dispelga = set_combine(sets.precast.FC, {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})
-- Precast sets to enhance JAs
sets.precast.JA.Nightingale = {feet="Bihu Slippers +3"}
sets.precast.JA.Troubadour = {body="Bihu Jstcorps. +3"}
sets.precast.JA['Soul Voice'] = {legs="Bihu Cannions +3"}
-- Waltz set (chr and vit)
sets.precast.Waltz = {}
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
-- Default set for any weaponskill that isn't any more specifically defined
sets.precast.WS = {
range={ name="Linos", augments={'Attack+16','Weapon skill damage +3%','Quadruple Attack +2',}},
head="Nyame Helm",
body="Bihu Jstcorps. +3",
hands="Nyame Gauntlets",
legs="Nyame Flanchard",
feet="Nyame Sollerets",
neck="Rep. Plat. Medal",
waist={ name="Sailfi Belt +1", augments={'Path: A',}},
ear1={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
ear2="Ishvara Earring",
left_ring="Epaminondas's Ring",
right_ring="Sroda Ring",
back={ name="Intarabus's Cape", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
}
-- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
head={ name="Blistering Sallet +1", augments={'Path: A',}},
body="Ayanmo Corazza +2",
neck="Fotia Gorget",
right_ear="Mache Earring +1",
left_ring="Begrudging Ring",
right_ring="Hetairoi Ring",
waist="Fotia Belt",
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
})
sets.precast.WS['Mordant Rime'] = set_combine(sets.precast.WS, {
head="Bihu Roundlet +3",
body="Bihu Jstcorps. +3",
hands="Bihu Cuffs +3",
legs="Bihu Cannions +3",
feet="Bihu Slippers +3",
ear1="Regal Earring",
right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
waist="Kentarch Belt +1",
back={ name="Intarabus's Cape", augments={'CHR+20','Accuracy+20 Attack+20','CHR+10','Weapon skill damage +10%',}},
})
sets.precast.WS['Rudra\'s Storm'] = set_combine(sets.precast.WS, {
waist="Kentarch Belt +1",
right_ring="Ilabrat Ring",
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},
})
sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS, {
waist="Orpheus's Sash",
neck="Sibyl Scarf",
waist="Orpheus's Sash",
ear2="Friomisi Earring",
right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
back="Izdubar Mantle",
})
sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
})
sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {
})
------------------------------------------------------------------------------------------------
---------------------------------------- Midcast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- General set for recast times.
sets.midcast.FastRecast = sets.precast.FC
sets.midcast.SpellInterrupt = {
ammo="Staunch Tathlum +1", --11
--body="Ros. Jaseran +1", --25
hands=gear.Chironic_WSD_hands, --20
--legs="Querkening Brais" --15
neck="Loricate Torque +1", --5
ear1="Halasz Earring", --5
ear2="Magnetic Earring", --8
ring2="Evanescence Ring", --5
waist="Rumination Sash", --10
}
sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
-- Gear to enhance certain classes of songs.
sets.midcast.Ballad = {legs="Fili Rhingrave +2"}
sets.midcast.Carol = {hands="Mousai Gages +1"}
sets.midcast.Etude = {head="Mousai Turban +1"}
sets.midcast.HonorMarch = {range="Marsyas", hands="Fili Manchettes +2"}
sets.midcast.Lullaby = {body="Fili Hongreline +2"}
sets.midcast.Madrigal = {head="Fili Calot +2"}
sets.midcast.Mambo = {feet="Mou. Crackows +1"}
sets.midcast.March = {hands="Fili Manchettes +2"}
sets.midcast.Minne = {legs="Mou. Seraweels +1"}
sets.midcast.Minuet = {body="Fili Hongreline +2"}
sets.midcast.Paeon = {head="Brioso Roundlet +3",range=info.ExtraSongInstrument} --for singer addon dummy
sets.midcast.Threnody = {body="Mou. Manteel +1"}
sets.midcast['Adventurer\'s Dirge'] = {range="Marsyas", hands="Bihu Cuffs +3"}
sets.midcast['Foe Sirvente'] = {head="Bihu Roundlet +3"}
sets.midcast['Magic Finale'] = {legs="Fili Rhingrave +2"}
sets.midcast["Sentinel's Scherzo"] = {feet="Fili Cothurnes +2"}
sets.midcast["Chocobo Mazurka"] = {range="Marsyas"}
-- For song buffs (duration and AF3 set bonus)
sets.midcast.SongEnhancing = {
main="Carnwenhan",
range="Gjallarhorn",
head="Fili Calot +2",
body="Fili Hongreline +2",
hands="Fili Manchettes +2",
legs="Inyanga Shalwar +2",
feet="Brioso Slippers +3",
neck="Mnbw. Whistle +1",
waist="Flume Belt",
left_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
right_ear="Genmei Earring",
left_ring="Defending Ring",
right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
}
-- For song defbuffs (duration primary, accuracy secondary)
sets.midcast.SongEnfeeble = {
main="Carnwenhan",
sub="Ammurapi Shield",
range="Gjallarhorn",
head="Brioso Roundlet +3",
body="Brioso Justau. +3",
hands="Brioso Cuffs +3",
legs="Inyanga Shalwar +2",
feet="Brioso Slippers +3",
neck="Mnbw. Whistle +1",
ear1="Digni. Earring",
ear2="Regal Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
ring2={name="Stikini Ring +1", bag="wardrobe3"},
waist="Acuity Belt +1",
back="Aurist's Cape +1",
}
-- For song defbuffs (accuracy primary, duration secondary)
sets.midcast.SongEnfeebleAcc = set_combine(sets.midcast.SongEnfeeble, {legs="Brioso Cannions +3"})
-- For Horde Lullaby maxiumum AOE range.
sets.midcast.SongStringSkill = set_combine(sets.midcast.Lullaby, {
body="Brioso Justau. +3",
hands="Inyan. Dastanas +2",
ear1="Gersemi Earring",
ear2="Darkside Earring",
})
-- Placeholder song; minimize duration to make it easy to overwrite.
sets.midcast.SongPlaceholder = set_combine(sets.precast.FC, {range=info.ExtraSongInstrument})
-- Other general spells and classes.
sets.midcast.Cure = {
main="Daybreak", --30
sub="Ammurapi Shield",
head="Kaykaus Mitra +1",
body="Kaykaus Bliaut +1",
hands="Kaykaus Cuffs +1",
legs="Kaykaus Tights +1",
feet="Kaykaus Boots +1",
neck="Incanter's Torque",
waist="Luminary Sash",
left_ear="Mendi. Earring",
right_ear="Meili Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
right_ring="Sirona's Ring",
back="Solemnity Cape",
}
sets.midcast.Curaga = set_combine(sets.midcast.Cure, {
})
sets.midcast.StatusRemoval = {
head="Vanya Hood",
body="Vanya Robe",
legs="Aya. Cosciales +2",
feet="Vanya Clogs",
neck="Incanter's Torque",
ear2="Meili Earring",
ring1="Menelaus's Ring",
ring2="Haoma's Ring",
back=gear.BRD_Song_Cape,
waist="Bishop's Sash",
}
sets.midcast.Cursna = set_combine(sets.midcast.StatusRemoval, {
hands="Hieros Mittens",
neck="Debilis Medallion",
ear1="Beatific Earring",
back="Oretan. Cape +1",
})
sets.midcast['Enhancing Magic'] = {
main="Carnwenhan",
sub="Ammurapi Shield",
head={ name="Telchine Cap", augments={'Enh. Mag. eff. dur. +10',}},
body={ name="Telchine Chas.", augments={'Enh. Mag. eff. dur. +9',}},
hands={ name="Telchine Gloves", augments={'Enh. Mag. eff. dur. +9',}},
legs={ name="Telchine Braconi", augments={'Enh. Mag. eff. dur. +10',}},
feet={ name="Telchine Pigaches", augments={'Enh. Mag. eff. dur. +9',}},
neck="Incanter's Torque",
ear1="Mimir Earring",
ear2="Andoaa Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
ring2={name="Stikini Ring +1", bag="wardrobe3"},
back="Fi Follet Cape +1",
waist="Embla Sash",
}
sets.midcast.Regen = set_combine(sets.midcast['Enhancing Magic'], {head="Inyanga Tiara +2"})
sets.midcast.Haste = sets.midcast['Enhancing Magic']
sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash", back="Grapevine Cape"})
sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget", waist="Siegel Sash"})
sets.midcast.Aquaveil = set_combine(sets.midcast['Enhancing Magic'], {waist="Emphatikos Rope"})
sets.midcast.Protect = set_combine(sets.midcast['Enhancing Magic'], {ring2="Sheltered Ring"})
sets.midcast.Protectra = sets.midcast.Protect
sets.midcast.Shell = sets.midcast.Protect
sets.midcast.Shellra = sets.midcast.Shell
sets.midcast['Enfeebling Magic'] = {
main="Carnwenhan",
sub="Ammurapi Shield",
head="C. Palug Crown",
body="Inyanga Jubbah +2",
hands="Inyan. Dastanas +2",
legs="Inyanga Shalwar +2",
feet="Brioso Slippers +3",
neck="Mnbw. Whistle +1",
ear1="Digni. Earring",
ear2="Vor Earring",
ring1="Kishar Ring",
ring2="Metamor. Ring +1",
waist="Acuity Belt +1",
back="Aurist's Cape +1",
}
sets.midcast.Dispelga = set_combine(sets.midcast['Enfeebling Magic'], {main="Daybreak", sub="Ammurapi Shield", waist="Shinjutsu-no-Obi +1"})
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
range="Gjallarhorn",
head="Nyame Helm",
body="Nyame Mail",
hands="Nyame Gauntlets",
legs="Nyame Flanchard",
feet="Nyame Sollerets",
neck="Elite Royal Collar",
waist="Flume Belt",
left_ear="Tuisto Earring",
right_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
left_ring="Defending Ring",
right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
}
sets.idle.Refresh = set_combine(sets.idle, {
head="Inyanga Tiara +2",
body="Inyanga Jubbah +2",
hands="Inyanga Dastanas +2",
legs="Inyanga Shalwar +2",
feet="Inyanga Crackows +2",
left_ear="Genmei Earring",
right_ear="Etiolation Earring",
ring1={name="Stikini Ring +1", bag="wardrobe2"},
ring2={name="Stikini Ring +1", bag="wardrobe3"},
})
sets.idle.Town = set_combine(sets.idle, {
})
------------------------------------------------------------------------------------------------
---------------------------------------- Defense Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.enmity = set_combine(sets.idle, {
main="Mafic Cudgel",
sub="Genmei Shield",
ammo="Sapience Orb",
head="Halitus Helm",
neck="Unmoving Collar +1",
ear1="Trux Earring",
ear2="Cryptic Earring",
body="Emet Harness +1",
ring1="Supershear Ring",
ring2="Pernicious Ring",
back="Reiki Cloak",
waist="Trance Belt",
legs="Zoar Subligar +1",
})
sets.midcast['Foe Requiem'] = sets.enmity
sets.midcast['Foe Requiem II'] = sets.enmity
sets.midcast['Foe Requiem III'] = sets.enmity
sets.defense.PDT = sets.idle.DT
sets.defense.MDT = sets.idle.DT
sets.Kiting = {feet="Fili Cothurnes +2"}
sets.latent_refresh = {waist="Fucho-no-obi"}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Engaged sets
-- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
-- sets if more refined versions aren't defined.
-- If you create a set with both offense and defense modes, the offense mode should be first.
-- EG: sets.engaged.Dagger.Accuracy.Evasion
sets.engaged = {
range={ name="Linos", augments={'Accuracy+15','"Store TP"+3','DEX+7',}},
--ammo="Coiste Bodhar",
head="Aya. Zucchetto +2", --6
body="Ayanmo Corazza +2", --4
hands="Gazu Bracelets +1", --15
legs="Nyame Flanchard", --5
feet="Nyame Sollerets", --3
neck="Bard's Charm +2",
waist={ name="Kentarch Belt +1", augments={'Path: A',}},
left_ear="Cessance Earring",
right_ear="Telos Earring",
ring1={name="Chirich Ring +1", bag="wardrobe2"},
ring2={name="Chirich Ring +1", bag="wardrobe3"},
back={ name="Intarabus's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
}
sets.engaged.Acc = set_combine(sets.engaged, {
})
-- * DNC Subjob DW Trait: +15%
-- * NIN Subjob DW Trait: +25%
-- No Magic Haste (74% DW to cap)
sets.engaged.DW = set_combine(sets.engaged, {
ear1="Eabani Earring", --4
waist="Reiki Yotai", --7
})
sets.engaged.DW.Acc = set_combine(sets.engaged.DW, {
})
-- 15% Magic Haste (67% DW to cap)
sets.engaged.DW.LowHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.LowHaste = set_combine(sets.engaged.DW, {
})
-- 30% Magic Haste (56% DW to cap)
sets.engaged.DW.MidHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.MidHaste = set_combine(sets.engaged.DW, {
})
-- 35% Magic Haste (51% DW to cap)
sets.engaged.DW.HighHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.HighHaste = set_combine(sets.engaged.DW, {
})
-- 45% Magic Haste (36% DW to cap)
sets.engaged.DW.MaxHaste = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.MaxHaste.Acc = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.MaxHastePlus = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.Acc.MaxHastePlus = set_combine(sets.engaged.DW, {
})
--sets.engaged.Aftermath = set_combine(sets.engaged, {})
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
sets.engaged.Hybrid = {
}
sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
sets.engaged.Acc.DT = set_combine(sets.engaged.Acc, sets.engaged.Hybrid)
sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT = set_combine(sets.engaged.DW.Acc, sets.engaged.Hybrid)
sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.LowHaste = set_combine(sets.engaged.DW.Acc.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.MidHaste = set_combine(sets.engaged.DW.Acc.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.HighHaste = set_combine(sets.engaged.DW.Acc.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.MaxHaste = set_combine(sets.engaged.DW.Acc.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MaxHastePlus = set_combine(sets.engaged.DW.MaxHastePlus, sets.engaged.Hybrid)
sets.engaged.DW.Acc.DT.MaxHastePlus = set_combine(sets.engaged.DW.Acc.MaxHastePlus, sets.engaged.Hybrid)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
--sets.SongDWDuration = {main="Carnwenhan", sub="Kali"}
sets.buff.Doom = {
--neck="Nicander's Necklace", --20
ring1={name="Eshmun's Ring", bag="wardrobe3"}, --20
ring2={name="Eshmun's Ring", bag="wardrobe4"}, --20
waist="Gishdubar Sash", --10
}
sets.Obi = {waist="Hachirin-no-Obi"}
-- sets.CP = {back="Mecisto. Mantle"}
--sets.Reive = {neck="Ygnas's Resolve +1"}
sets.Mordant = {main="Carnwenhan", sub="Ternion Dagger +1"}
--sets.Twashtar = {main="Twashtar", sub="Taming Sari"}
sets.Rudra = {main="Carnwenhan", sub="Fusetto +2"}
sets.Naegling = {main="Naegling", sub="Fusetto +2"}
sets.Tauret = {main="Tauret", sub="Fusetto +2"}
--sets.Trial = {main="Fusetto +1", sub="Esikuva"}
sets.DefaultShield = {sub="Genmei Shield"}
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 spell.type == 'BardSong' then
--[[ Auto-Pianissimo
if ((spell.target.type == 'PLAYER' and not spell.target.charmed) or (spell.target.type == 'NPC' and spell.target.in_party)) and
not state.Buff['Pianissimo'] then
local spell_recasts = windower.ffxi.get_spell_recasts()
if spell_recasts[spell.recast_id] < 2 then
send_command('@input /ja "Pianissimo" <me>; wait 1.5; input /ma "'..spell.name..'" '..spell.target.name)
eventArgs.cancel = true
return
end
end]]
if spell.name == 'Honor March' then
equip({range="Marsyas"})
end
if string.find(spell.name,'Lullaby') then
if buffactive.Troubadour then
equip({range="Marsyas"})
elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
equip({range="Daurdabla"})
else
--equip({range="Gjallarhorn"})
equip({range="Blurred Harp +1"})
end
end
end
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
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == 'WeaponSkill' then
if elemental_ws:contains(spell.name) then
-- Matching double weather (w/o day conflict).
if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 1.7 yalms.
elseif spell.target.distance < (1.7 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Matching day and weather.
elseif spell.element == world.day_element and spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 8 yalms.
elseif spell.target.distance < (8 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Match day or weather.
elseif spell.element == world.day_element or spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
end
end
end
end
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_midcast(spell, action, spellMap, eventArgs)
if spell.type == 'BardSong' then
-- layer general gear on first, then let default handler add song-specific gear.
local generalClass = get_song_class(spell)
if generalClass and sets.midcast[generalClass] then
equip(sets.midcast[generalClass])
end
state.SongMode:reset() -- reset after each dummy song
if spell.name == 'Honor March' then
equip({range="Marsyas"})
end
if string.find(spell.name,'Lullaby') then
if buffactive.Troubadour then
equip({range="Marsyas"})
elseif state.LullabyMode.value == 'Harp' and spell.english:contains('Horde') then
equip({range="Daurdabla"})
equip(sets.midcast.SongStringSkill)
else
--equip({range="Gjallarhorn"})
equip({range="Blurred Harp +1"})
end
end
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.type == 'BardSong' then
if player.status ~= 'Engaged' and state.WeaponLock.value == false and (player.sub_job == 'DNC' or player.sub_job == 'NIN') then
equip(sets.SongDWDuration)
end
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
if spell.english:contains('Lullaby') and not spell.interrupted then
get_lullaby_duration(spell)
end
if player.status ~= 'Engaged' and state.WeaponLock.value == false then
check_weaponset()
end
if player.status == 'Engaged' and state.WeaponLock.value == false then
check_weaponset()
end
end
function job_buff_change(buff,gain)
-- if buffactive['Reive Mark'] then
-- if gain then
-- equip(sets.Reive)
-- disable('neck')
-- else
-- enable('neck')
-- end
-- end
if buff == "doom" then
if gain then
equip(sets.buff.Doom)
send_command('@input /p Doomed, please Cursna.')
send_command('@input /item "Holy Water" <me>')
disable('ring1','ring2','waist')
elseif not gain and not player.status == "Dead" and not player.status == "Engaged Dead" then
enable('ring1','ring2','waist')
send_command('input /p Doom removed, Thank you.')
handle_equipping_gear(player.status)
else
enable('ring1','ring2','waist')
send_command('input /p '..player.name..' is no longer Doom Thank you !')
end
end
end
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
if state.WeaponLock.value == true then
disable('main','sub')
else
enable('main','sub')
end
check_weaponset()
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- Called by the 'update' self-command, for common needs.
-- Set eventArgs.handled to true if we don't want automatic equipping of gear.
function job_handle_equipping_gear(playerStatus, eventArgs)
check_gear()
update_combat_form()
determine_haste_group()
check_moving()
end
function job_update(cmdParams, eventArgs)
handle_equipping_gear(player.status)
end
function update_combat_form()
if player.sub_job == 'NIN' then
state.CombatForm:set('DW')
else
state.CombatForm:reset()
end
end
-- Called for direct player commands.
function job_self_command(cmdParams, eventArgs)
if cmdParams[1]:lower() == 'etude' then
send_command('@input /ma '..state.Etude.value..' <stpc>')
elseif cmdParams[1]:lower() == 'carol' then
send_command('@input /ma '..state.Carol.value..' <stpc>')
elseif cmdParams[1]:lower() == 'threnody' then
send_command('@input /ma '..state.Threnody.value..' <stnpc>')
end
gearinfo(cmdParams, eventArgs)
end
-- Modify the default melee set after it was constructed.
--function customize_melee_set(meleeSet)
--if buffactive['Aftermath: Lv.3'] and player.equipment.main == "Carnwenhan" then
--meleeSet = set_combine(meleeSet, sets.engaged.Aftermath)
--end
--check_weaponset()
--return meleeSet
--end
function get_custom_wsmode(spell, action, spellMap)
local wsmode
if state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
wsmode = 'Acc'
end
return wsmode
end
-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
-- if state.CP.current == 'on' then
-- equip(sets.CP)
-- disable('back')
-- else
-- enable('back')
-- end
--if player.sub_job == 'WHM' then
--idleSet = set_combine(idleSet, sets.idle.refresh)
--end
--if player.mpp < 51 then
--idleSet = set_combine(idleSet, sets.idle.refresh)
--end
if state.Auto_Kite.value == true then
idleSet = set_combine(idleSet, sets.Kiting)
end
return idleSet
end
-- Set eventArgs.handled to true if we don't want the automatic display to be run.
function display_current_job_state(eventArgs)
local cf_msg = ''
if state.CombatForm.has_value then
cf_msg = ' (' ..state.CombatForm.value.. ')'
end
local m_msg = state.OffenseMode.value
if state.HybridMode.value ~= 'Normal' then
m_msg = m_msg .. '/' ..state.HybridMode.value
end
local ws_msg = state.WeaponskillMode.value
local c_msg = state.CastingMode.value
local d_msg = 'None'
if state.DefenseMode.value ~= 'None' then
d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
end
local i_msg = state.IdleMode.value
local msg = ''
if state.Kiting.value then
msg = msg .. ' Kiting: On |'
end
add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002).. ' |'
..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002).. ' |'
..string.char(31,060).. ' Magic: ' ..string.char(31,001)..c_msg.. string.char(31,002).. ' |'
..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002).. ' |'
..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002).. ' |'
..string.char(31,002)..msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
-- Determine the custom class to use for the given song.
function get_song_class(spell)
-- Can't use spell.targets:contains() because this is being pulled from resources
if set.contains(spell.targets, 'Enemy') then
if state.CastingMode.value == 'Resistant' then
return 'SongEnfeebleAcc'
else
return 'SongEnfeeble'
end
elseif state.SongMode.value == 'Placeholder' then
return 'SongPlaceholder'
else
return 'SongEnhancing'
end
end
function get_lullaby_duration(spell)
local self = windower.ffxi.get_player()
local troubadour = false
local clarioncall = false
local soulvoice = false
local marcato = false
for i,v in pairs(self.buffs) do
if v == 348 then troubadour = true end
if v == 499 then clarioncall = true end
if v == 52 then soulvoice = true end
if v == 231 then marcato = true end
end
local mult = 1
if player.equipment.range == 'Daurdabla' then mult = mult + 0.3 end -- change to 0.25 with 90 Daur
if player.equipment.range == "Gjallarhorn" then mult = mult + 0.4 end -- change to 0.3 with 95 Gjall
if player.equipment.range == "Marsyas" then mult = mult + 0.5 end
if player.equipment.main == "Carnwenhan" then mult = mult + 0.5 end -- 0.1 for 75, 0.4 for 95, 0.5 for 99/119
if player.equipment.main == "Legato Dagger" then mult = mult + 0.05 end
if player.equipment.main == "Kali" then mult = mult + 0.05 end
if player.equipment.sub == "Kali" then mult = mult + 0.05 end
if player.equipment.sub == "Legato Dagger" then mult = mult + 0.05 end
if player.equipment.neck == "Aoidos' Matinee" then mult = mult + 0.1 end
if player.equipment.neck == "Mnbw. Whistle" then mult = mult + 0.2 end
if player.equipment.neck == "Mnbw. Whistle +1" then mult = mult + 0.3 end
if player.equipment.body == "Fili Hongreline +2" then mult = mult + 0.12 end
if player.equipment.legs == "Inyanga Shalwar +1" then mult = mult + 0.15 end
if player.equipment.legs == "Inyanga Shalwar +2" then mult = mult + 0.17 end
if player.equipment.feet == "Brioso Slippers" then mult = mult + 0.1 end
if player.equipment.feet == "Brioso Slippers +1" then mult = mult + 0.11 end
if player.equipment.feet == "Brioso Slippers +2" then mult = mult + 0.13 end
if player.equipment.feet == "Brioso Slippers +3" then mult = mult + 0.15 end
if player.equipment.hands == 'Brioso Cuffs +1' then mult = mult + 0.1 end
if player.equipment.hands == 'Brioso Cuffs +2' then mult = mult + 0.1 end
if player.equipment.hands == 'Brioso Cuffs +3' then mult = mult + 0.2 end
--JP Duration Gift
if self.job_points.brd.jp_spent >= 1200 then
mult = mult + 0.05
end
if troubadour then
mult = mult * 2
end
if spell.en == "Foe Lullaby II" or spell.en == "Horde Lullaby II" then
base = 60
elseif spell.en == "Foe Lullaby" or spell.en == "Horde Lullaby" then
base = 30
end
totalDuration = math.floor(mult * base)
-- Job Points Buff
totalDuration = totalDuration + self.job_points.brd.lullaby_duration
if troubadour then
totalDuration = totalDuration + self.job_points.brd.lullaby_duration
-- adding it a second time if Troubadour up
end
if clarioncall then
if troubadour then
totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2 * 2)
-- Clarion Call gives 2 seconds per Job Point upgrade. * 2 again for Troubadour
else
totalDuration = totalDuration + (self.job_points.brd.clarion_call_effect * 2)
-- Clarion Call gives 2 seconds per Job Point upgrade.
end
end
if marcato and not soulvoice then
totalDuration = totalDuration + self.job_points.brd.marcato_effect
end
-- Create the custom timer
if spell.english == "Foe Lullaby II" or spell.english == "Horde Lullaby II" then
send_command('@timers c "Lullaby II ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00377.png')
elseif spell.english == "Foe Lullaby" or spell.english == "Horde Lullaby" then
send_command('@timers c "Lullaby ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00376.png')
end
end
function determine_haste_group()
classes.CustomMeleeGroups:clear()
if DW == true then
if DW_needed <= 12 then
classes.CustomMeleeGroups:append('MaxHaste')
elseif DW_needed > 12 and DW_needed <= 21 then
classes.CustomMeleeGroups:append('MaxHastePlus')
elseif DW_needed > 21 and DW_needed <= 27 then
classes.CustomMeleeGroups:append('HighHaste')
elseif DW_needed > 27 and DW_needed <= 31 then
classes.CustomMeleeGroups:append('MidHaste')
elseif DW_needed > 31 and DW_needed <= 42 then
classes.CustomMeleeGroups:append('LowHaste')
elseif DW_needed > 42 then
classes.CustomMeleeGroups:append('')
end
end
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
function check_moving()
if state.DefenseMode.value == 'None' and state.Kiting.value == false then
if state.Auto_Kite.value == false and moving then
state.Auto_Kite:set(true)
elseif state.Auto_Kite.value == true and moving == false then
state.Auto_Kite:set(false)
end
end
end
function check_gear()
if no_swap_gear:contains(player.equipment.left_ring) then
disable("ring1")
else
enable("ring1")
end
if no_swap_gear:contains(player.equipment.right_ring) then
disable("ring2")
else
enable("ring2")
end
end
function check_weaponset()
equip(sets[state.WeaponSet.current])
if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
equip(sets.DefaultShield)
end
end
function customize_melee_set(meleeSet)
check_weaponset()
return meleeSet
end
windower.register_event('zone change',
function()
if no_swap_gear:contains(player.equipment.left_ring) then
enable("ring1")
equip(sets.idle)
end
if no_swap_gear:contains(player.equipment.right_ring) then
enable("ring2")
equip(sets.idle)
end
end
)
Thank you <3
Necro Bump Detected!
[118 days between previous and next post]
Ragnarok.Primex
Serveur: Ragnarok
Game: FFXI
Posts: 229
By Ragnarok.Primex 2023-06-17 11:35:19
It's been a while since I had a BRD alt.
Only know how to utulise daur and ghorn. Aeonic and honor march made my brain hurt.
What's the optimal way to resource manage these 3 instruments.
Nitro 4x songs with Daur and then 4x fresh songs with Ghorn was simple enough. How has aeonic changed this?
sorry I'm really outdated.
Serveur: Asura
Game: FFXI
By Asura.Disclai 2023-06-17 12:00:05
Nitro 4x songs with Daur and then 4x fresh songs with Ghorn was simple enough. How has aeonic changed this?
There is almost never any reason to sing a full suite of dummies. The only situation you want to do that in is if you need to sing full distinct sets of songs on 3+ people, which is rare.
Otherwise, you only ever need to sing 2 dummies with Daurdabla to open up the slots. Sing 2-3 (depending on Clarion) regular, full potency NiTro songs, then 2 dummies, then the final 2 regular songs. This is significantly faster and better, given how time-intensive a lot of endgame content is.
To answer your question, typically the first song I sing is a Marcato'd HM, which will be your longest song even though it's first, because Marcato increases its duration. So you won't have to worry about it ever being overwritten even though it's first.
[+]
By SimonSes 2023-06-17 12:52:07
Going further, it's best to sing songs you want to cast as dummy, not some shitty resist songs or whatever.
So for example if you want honor,madrigal,minuetv,minuetiv just sing minuetv and minuetiv as dummies (less duration gear and with daurdabla). This way you have weaker version of both minuets asap and can use them, instead of having useless dummies. This is especially important when you face a mob with a dispel and try to reapply songs mid fight.
Serveur: Asura
Game: FFXI
Posts: 1408
By Asura.Toralin 2023-06-17 13:26:19
Going further, it's best to sing songs you want to cast as dummy, not some shitty resist songs or whatever.
So for example if you want honor,madrigal,minuetv,minuetiv just sing minuetv and minuetiv as dummies (less duration gear and with daurdabla). This way you have weaker version of both minuets asap and can use them, instead of having useless dummies. This is especially important when you face a mob with a dispel and try to reapply songs mid fight.
What you got against Goblin Gavotte :(
[+]
Siren.Bruno
Serveur: Siren
Game: FFXI
Posts: 398
By Siren.Bruno 2023-06-17 13:29:47
STR+5 on empyrean set bonus!
Ragnarok.Primex
Serveur: Ragnarok
Game: FFXI
Posts: 229
By Ragnarok.Primex 2023-06-17 16:09:50
the SU5 dagger for songs or the mythic?
SU5 DA+4% effect is party-wide or?
By Nariont 2023-06-17 16:35:12
It's just for you, only when main-handing it
Serveur: Asura
Game: FFXI
Posts: 157
By Asura.Sensarity 2023-06-17 17:06:16
the SU5 dagger for songs or the mythic?
SU5 DA+4% effect is party-wide or? Carn for singing. SU5 only affects you and is not worth it because Naegling exists.
[+]
Asura.Sechs
Serveur: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2023-06-17 17:53:10
the SU5 dagger for songs or the mythic?
SU5 DA+4% effect is party-wide or? Carn for singing. SU5 only affects you and is not worth it because Naegling exists. Spoiler: it wouldn't be worth it even if Naegling didn't exist, alas.
|
|