|
Can someone help with my BRD lua please?
By cramerb535 2022-07-07 08:50:51
I am pulling out my remaining hair trying to get this thing to work. I am using Serindrile's luas and for BRD I cannot figure out how to get my Daurdabla to auto swap in while doing dummy songs. I am using for macro line /console gs c set ExtraSongsMode Dummy. I will post my lua below but I have not altered anything within and I have the harp so I am confused why it will not automatically swap.
I hope I am correct in the order of using the macro. So if I start with 2 songs then hit my macro which contains the dummy line and the song I am using should it not equip my harp and cast 3rd song?
Code --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__
-- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____
-- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \
-- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/
-- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\
-- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
--
-- Please do not edit this file! Please do not edit this file! Please do not edit this file!
--
-- Editing this file will cause you to be unable to use Github Desktop to update!
--
-- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and
-- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first.
-- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence.
--
-- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing
-- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important
-- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead.
--
-- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example.
-- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there.
-- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs)
--
-- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them:
-- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what.
-- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character.
-- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character.
--
--
-- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ
-- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium.
--
-- Please do not edit this file! Please do not edit this file! Please do not edit this file!
-- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__
-- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____
-- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \
-- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/
-- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\
-- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job. Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------
--[[
Custom commands:
ExtraSongsMode may take one of three values: None, Dummy, FullLength
You can set these via the standard 'set' and 'cycle' self-commands. EG:
gs c cycle ExtraSongsMode
gs c set ExtraSongsMode Dummy
The Dummy state will equip the bonus song instrument and ensure non-duration gear is equipped.
The FullLength state will simply equip the bonus song instrument on top of standard gear.
Simple macro to cast a dummy Daurdabla song:
/console gs c set ExtraSongsMode Dummy
/ma "Mage's Ballad" <me>
To use a Terpander rather than Daurdabla, set the info.ExtraSongInstrument variable to
'Terpander', and info.ExtraSongs to 1.
--]]
-- Initialization function for this job file.
function get_sets()
-- Load and initialize the include file.
include('Sel-Include.lua')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.ExtraSongsMode = M{['description']='Extra Songs','None','Dummy','DummyLock','FullLength','FullLengthLock'}
-- Whether to use Carn (or song daggers in general) under a certain threshhold even when weapons are locked.
state.CarnMode = M{'Always','300','1000','Never'}
state.Buff['Aftermath: Lv.3'] = buffactive['Aftermath: Lv.3'] or false
state.Buff['Pianissimo'] = buffactive['Pianissimo'] or false
state.Buff['Nightingale'] = buffactive['Nightingale'] or false
state.RecoverMode = M('35%', '60%', 'Always', 'Never')
autows = "Rudra's Storm"
autofood = 'Pear Crepe'
state.AutoSongMode = M(false, 'Auto Song Mode')
update_melee_groups()
init_job_states({"Capacity","AutoRuneMode","AutoTrustMode","AutoNukeMode","AutoWSMode","AutoShadowMode","AutoFoodMode","AutoStunMode","AutoDefenseMode","AutoSongMode",},{"AutoBuffMode","AutoSambaMode","Weapons","OffenseMode","WeaponskillMode","IdleMode","Passive","RuneElement","ExtraSongsMode","CastingMode","CarnMode","TreasureMode",})
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.
-- Set eventArgs.handled to true if we don't want any automatic target handling to be done.
function job_filtered_action(spell, eventArgs)
if spell.type == 'WeaponSkill' then
local available_ws = S(windower.ffxi.get_abilities().weapon_skills)
-- WS 112 is Double Thrust, meaning a Spear is equipped.
if available_ws:contains(32) then
if spell.english == "Rudra's Storm" then
windower.chat.input('/ws "Savage Blade" '..spell.target.raw)
cancel_spell()
eventArgs.cancel = true
end
end
end
end
function job_pretarget(spell, spellMap, eventArgs)
if spell.type == 'BardSong' and not spell.targets.Enemy then
if state.Buff['Pianissimo'] and spell.target.raw == '<t>' and (player.target.type == 'NONE' or spell.target.type == 'MONSTER') then
eventArgs.cancel = true
windower.chat.input('/ma "'..spell.name..'" <stpt>')
elseif spell.target.raw == '<t>' and (player.target.type == 'NONE' or player.target.type == "MONSTER") and not state.Buff['Pianissimo'] then
change_target('<me>')
return
end
end
end
function job_precast(spell, spellMap, eventArgs)
if spell.action_type == 'Magic' then
if spell.english:contains('Honor March') then
equip({range="Marsyas"})
end
if not sets.precast.FC[spell.english] and (spell.type == 'BardSong' and spell.targets.Enemy) then
classes.CustomClass = 'SongDebuff'
end
end
end
function job_filter_precast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' and not spell.targets.Enemy then
local spell_recasts = windower.ffxi.get_spell_recasts()
-- 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
if spell_recasts[spell.recast_id] < 1.5 then
send_command('@input /ja "Pianissimo" <me>; wait 1.1; input /ma "'..spell.name..'" '..spell.target.name)
eventArgs.cancel = true
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, spellMap, eventArgs)
if spell.action_type == 'Magic' then
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
if sets.midcast[generalClass][state.CastingMode.value] then
equip(sets.midcast[generalClass][state.CastingMode.value])
else
equip(sets.midcast[generalClass])
end
end
end
end
end
function job_post_precast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' then
local generalClass = get_song_class(spell)
if state.Buff['Nightingale'] then
-- Replicate midcast in precast for nightingale including layering.
if generalClass and sets.midcast[generalClass] then
if sets.midcast[generalClass][state.CastingMode.value] then
equip(sets.midcast[generalClass][state.CastingMode.value])
else
equip(sets.midcast[generalClass])
end
end
if sets.midcast[spell.english] then
if sets.midcast[spell.english][state.CastingMode.value] then
equip(sets.midcast[spell.english][state.CastingMode.value])
else
equip(sets.midcast[spell.english])
end
elseif sets.midcast[get_spell_map(spell, default_spell_map)] then
if sets.midcast[get_spell_map(spell, default_spell_map)][state.CastingMode.Value]
then equip(sets.midcast[get_spell_map(spell, default_spell_map)][state.CastingMode.Value])
else
equip(sets.midcast[get_spell_map(spell, default_spell_map)])
end
end
if not spell.targets.Enemy and state.ExtraSongsMode.value:contains('FullLength') then
equip(sets.midcast.Daurdabla)
end
end
if state.CarnMode.value ~= 'Never' and (state.CarnMode.value == 'Always' or tonumber(state.CarnMode.value) > player.tp) then
if sets.midcast[generalClass].main and sets.midcast[generalClass].main ~= player.equipment.main then
enable('main')
equip({main=sets.midcast[generalClass].main})
end
if sets.midcast[generalClass].sub and sets.midcast[generalClass].sub ~= player.equipment.sub then
enable('sub')
equip({sub=sets.midcast[generalClass].sub})
end
end
elseif spell.type == 'WeaponSkill' then
local WSset = standardize_set(get_precast_set(spell, spellMap))
local wsacc = check_ws_acc()
if (WSset.ear1 == "Moonshade Earring" or WSset.ear2 == "Moonshade Earring") then
-- Replace Moonshade Earring if we're at cap TP
if get_effective_player_tp(spell, WSset) > 3200 then
if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and sets.AccMaxTP then
equip(sets.AccMaxTP[spell.english] or sets.AccMaxTP)
elseif sets.MaxTP then
equip(sets.MaxTP[spell.english] or sets.MaxTP)
else
end
end
end
end
end
function job_post_midcast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' then
if spell.targets.Enemy then
if sets.midcast[spell.english] then
if sets.midcast[spell.english][state.CastingMode.value] then
equip(sets.midcast[spell.english][state.CastingMode.value])
else
equip(sets.midcast[spell.english])
end
elseif sets.midcast[spellMap] then
if sets.midcast[spellMap][state.CastingMode.value] then
equip(sets.midcast[spellMap][state.CastingMode.value])
else
equip(sets.midcast[spellMap])
end
end
if can_dual_wield and sets.midcast.SongDebuff.DW then
equip(sets.midcast.SongDebuff.DW)
end
else
if can_dual_wield and sets.midcast.SongEffect.DW then
equip(sets.midcast.SongEffect.DW)
end
end
if state.ExtraSongsMode.value:contains('FullLength') then
equip(sets.midcast.Daurdabla)
end
if not state.ExtraSongsMode.value:contains('Lock') then
state.ExtraSongsMode:reset()
end
if state.DisplayMode.value then update_job_states() end
elseif spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then
if state.MagicBurstMode.value ~= 'Off' then equip(sets.MagicBurst) end
if spell.element == world.weather_element or spell.element == world.day_element then
if state.CastingMode.value == 'Fodder' then
if spell.element == world.day_element then
if item_available('Zodiac Ring') then
sets.ZodiacRing = {ring2="Zodiac Ring"}
equip(sets.ZodiacRing)
end
end
end
end
if spell.element == 'Wind' and sets.WindNuke then
equip(sets.WindNuke)
elseif spell.element == 'Ice' and sets.IceNuke then
equip(sets.IceNuke)
end
if state.RecoverMode.value ~= 'Never' and (state.RecoverMode.value == 'Always' or tonumber(state.RecoverMode.value:sub(1, -2)) > player.mpp) then
equip(sets.RecoverMP)
end
end
end
-- Set eventArgs.handled to true if we don't want automatic gear equipping to be done.
function job_aftercast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' and not spell.interrupted then
if state.CarnMode.value ~= 'Never' then
local generalClass = get_song_class(spell)
if sets.midcast[generalClass].main and sets.weapons[state.Weapons.value] then
if sets.weapons[state.Weapons.value].main then
equip({main=sets.weapons[state.Weapons.value].main})
disable('main')
end
if sets.weapons[state.Weapons.value].sub then
equip({sub=sets.weapons[state.Weapons.value].sub})
disable('sub')
end
end
end
elseif spell.skill == 'Elemental Magic' and state.MagicBurstMode.value == 'Single' then
state.MagicBurstMode:reset()
if state.DisplayMode.value then update_job_states() end
end
end
function job_buff_change(buff, gain)
update_melee_groups()
end
function job_get_spell_map(spell, default_spell_map)
if default_spell_map == 'Cure' or default_spell_map == 'Curaga' then
if world.weather_element == 'Light' then
return 'LightWeatherCure'
elseif world.day_element == 'Light' then
return 'LightDayCure'
end
elseif spell.skill == "Enfeebling Magic" then
if spell.english:startswith('Dia') then
return "Dia"
elseif spell.type == "WhiteMagic" or spell.english:startswith('Frazzle') or spell.english:startswith('Distract') then
return 'MndEnfeebles'
else
return 'IntEnfeebles'
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function job_zone_change(new_id,old_id)
state.AutoSongMode:reset()
end
-- Called by the 'update' self-command.
function job_update(cmdParams, eventArgs)
update_melee_groups()
end
-- Modify the default idle set after it was constructed.
function job_customize_idle_set(idleSet)
if buffactive['Sublimation: Activated'] then
if (state.IdleMode.value == 'Normal' or state.IdleMode.value:contains('Sphere')) and sets.buff.Sublimation then
idleSet = set_combine(idleSet, sets.buff.Sublimation)
elseif state.IdleMode.value:contains('DT') and sets.buff.DTSublimation then
idleSet = set_combine(idleSet, sets.buff.DTSublimation)
end
end
if state.IdleMode.value == 'Normal' or state.IdleMode.value:contains('Sphere') then
if player.mpp < 51 then
if sets.latent_refresh then
idleSet = set_combine(idleSet, sets.latent_refresh)
end
if (state.Weapons.value == 'None' or state.UnlockWeapons.value) and idleSet.main then
local main_table = get_item_table(idleSet.main)
if main_table and main_table.skill == 12 and sets.latent_refresh_grip then
idleSet = set_combine(idleSet, sets.latent_refresh_grip)
end
if player.tp > 10 and sets.TPEat then
idleSet = set_combine(idleSet, sets.TPEat)
end
end
end
end
return idleSet
end
-- Function to display the current relevant user state when doing an update.
function display_current_job_state(eventArgs)
display_current_caster_state()
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 spell.targets.Enemy then
return 'SongDebuff'
elseif state.ExtraSongsMode.value:contains('Dummy') then
return 'DaurdablaDummy'
else
return 'SongEffect'
end
end
-- Examine equipment to determine what our current TP weapon is.
function update_melee_groups()
if player.equipment.main then
classes.CustomMeleeGroups:clear()
if player.equipment.main == "Carnwenhan" and state.Buff['Aftermath: Lv.3'] then
classes.CustomMeleeGroups:append('AM')
end
end
end
-- Allow jobs to override this code
function job_self_command(commandArgs, eventArgs)
end
function job_tick()
if check_song() then return true end
if check_buff() then return true end
if check_buffup() then return true end
return false
end
function check_song()
if state.AutoSongMode.value then
if not buffactive.march then
windower.chat.input('/ma "Honor March" <me>')
tickdelay = os.clock() + 2
return true
elseif not buffactive.minuet then
windower.chat.input('/ma "Valor Minuet V" <me>')
tickdelay = os.clock() + 2
return true
elseif not buffactive.madrigal then
windower.send_command('gs c set ExtraSongsMode FullLength;input /ma "Blade Madrigal" <me>')
tickdelay = os.clock() + 2
return true
else
return false
end
else
return false
end
end
function check_buff()
if state.AutoBuffMode.value ~= 'Off' and not data.areas.cities:contains(world.area) then
local spell_recasts = windower.ffxi.get_spell_recasts()
for i in pairs(buff_spell_lists[state.AutoBuffMode.Value]) do
if not buffactive[buff_spell_lists[state.AutoBuffMode.Value][i].Buff] and (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Always' or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Combat' and (player.in_combat or being_attacked)) or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Engaged' and player.status == 'Engaged') or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Idle' and player.status == 'Idle') or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'OutOfCombat' and not (player.in_combat or being_attacked))) and spell_recasts[buff_spell_lists[state.AutoBuffMode.Value][i].SpellID] < spell_latency and silent_can_use(buff_spell_lists[state.AutoBuffMode.Value][i].SpellID) then
windower.chat.input('/ma "'..buff_spell_lists[state.AutoBuffMode.Value][i].Name..'" <me>')
tickdelay = os.clock() + 2
return true
end
end
else
return false
end
end
function check_buffup()
if buffup ~= '' then
local needsbuff = false
for i in pairs(buff_spell_lists[buffup]) do
if not buffactive[buff_spell_lists[buffup][i].Buff] and silent_can_use(buff_spell_lists[buffup][i].SpellID) then
needsbuff = true
break
end
end
if not needsbuff then
add_to_chat(217, 'All '..buffup..' buffs are up!')
buffup = ''
return false
end
local spell_recasts = windower.ffxi.get_spell_recasts()
for i in pairs(buff_spell_lists[buffup]) do
if not buffactive[buff_spell_lists[buffup][i].Buff] and silent_can_use(buff_spell_lists[buffup][i].SpellID) and spell_recasts[buff_spell_lists[buffup][i].SpellID] < spell_latency then
windower.chat.input('/ma "'..buff_spell_lists[buffup][i].Name..'" <me>')
tickdelay = os.clock() + 2
return true
end
end
return false
else
return false
end
end
buff_spell_lists = {
Auto = {--Options for When are: Always, Engaged, Idle, OutOfCombat, Combat
{Name='Refresh', Buff='Refresh', SpellID=109, When='Idle'},
{Name='Phalanx', Buff='Phalanx', SpellID=106, When='Idle'},
{Name='Stoneskin', Buff='Stoneskin', SpellID=54, When='Idle'},
{Name='Blink', Buff='Blink', SpellID=53, When='Idle'},
},
Default = {
{Name='Refresh', Buff='Refresh', SpellID=109, Reapply=false},
{Name='Phalanx', Buff='Phalanx', SpellID=106, Reapply=false},
{Name='Stoneskin', Buff='Stoneskin', SpellID=54, Reapply=false},
{Name='Blink', Buff='Blink', SpellID=53, Reapply=false},
},
}
サーバ: Bahamut
Game: FFXI
Posts: 81
By Bahamut.Spookyfish 2022-07-07 09:47:12
This is the specific BRD.lua, what you're looking to edit should be Name_BRD.lua. If you post that we can help find your issue because nothing should be changed in the BRD.lua.
[+]
サーバ: Bahamut
Game: FFXI
Posts: 462
By Bahamut.Greyfawkz 2022-07-07 09:49:08
What song are you using for dummys? I just set my Paeons to be dummys which requires no extra macros or fiddling around:
sets.midcast.Paeon = set_combine(sets.midcast.SongRecast, {range=info.ExtraSongInstrument}
In your BRD_Gear.lua, is your extra song instrument set to Daurdabla?
info.ExtraSongInstrument = 'Daurdabla'
Asura.Jokes
サーバ: Asura
Game: FFXI
Posts: 182
By Asura.Jokes 2022-07-07 09:57:34
/console gs c cycle ExtraSongsMode is what I use in my macros for dummy songs, and I use Selindrils (and have done for quite a long time).
/console gs c reset ExtraSongsMode is nice to have in non-dummy songs to make sure it's reset and you don't accidentally do a short duration low potency song.
my macro looks like this:
Line 1: /console gs c cycle ExtraSongsMode
Line 2: /ma "army's paeon" <stpt>
Asura.Bippin
サーバ: Asura
Game: FFXI
Posts: 1090
By Asura.Bippin 2022-07-07 10:04:45
There is a link in that lua to a discord to get help...
By cramerb535 2022-07-07 10:16:44
Sorry here is the BRD_gear lua and thanks for taking a look
Code function user_job_setup()
-- Options: Override default values
state.OffenseMode:options('Normal','Acc')
state.HybridMode:options('Normal','DT')
state.CastingMode:options('Normal','Resistant','AoE')
state.IdleMode:options('Normal','NoRefresh','DT')
state.Weapons:options('None','Naegling','Aeneas','DualWeapons','DualNaegling','DualTauret','DualAeolian')
-- Whether to use Carn (or song daggers in general) under a certain threshhold even when weapons are locked.
state.CarnMode = M{'Always','300','1000','Never'}
gear.melee_jse_back = {name="Intarabus's Cape",augments={'Accuracy+20 Attack+20'}}
gear.magic_jse_back = {name="Intarabus's Cape",augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Fast Cast"+10','Damage taken-5%',}}
-- Adjust this if using the Terpander (new +song instrument)
info.ExtraSongInstrument = 'Blurred Harp +1'
-- How many extra songs we can keep from Daurdabla/Terpander
info.ExtraSongs = 1
-- Set this to false if you don't want to use custom timers.
state.UseCustomTimers = M(false, 'Use Custom Timers')
-- Additional local binds
send_command('bind ^` gs c cycle ExtraSongsMode')
send_command('bind !` input /ma "Chocobo Mazurka" <me>')
send_command('bind @` gs c cycle MagicBurstMode')
send_command('bind @f10 gs c cycle RecoverMode')
send_command('bind @f8 gs c toggle AutoNukeMode')
send_command('bind !r gs c weapons None;gs c update')
send_command('bind !q gs c weapons NukeWeapons;gs c update')
send_command('bind ^q gs c weapons Swords;gs c update')
send_command('bind !f7 gs c cycle CarnMode')
select_default_macro_book()
end
function init_gear_sets()
--------------------------------------
-- Start defining the sets
--------------------------------------
-- Weapons sets
sets.weapons.Aeneas = {main="Aeneas",sub="Genmei Shield"}
sets.weapons.DualWeapons = {main="Aeneas",sub="Blurred Knife +1"}
sets.weapons.DualNaegling = {main="Naegling",sub="Blurred Knife +1"}
sets.weapons.Naegling = {main="Naegling",sub="Genmei Shield"}
sets.weapons.DualTauret = {main="Tauret",sub="Blurred Knife +1"}
sets.weapons.DualAeolian = {main="Tauret",sub="Malevolence"}
sets.buff.Sublimation = {waist="Embla Sash"}
sets.buff.DTSublimation = {waist="Embla Sash"}
-- Precast Sets
-- Fast cast sets for spells
sets.precast.FC = {
main={ name="Grioavolr", augments={'Blood Pact Dmg.+6','Pet: VIT+15','Pet: "Mag.Atk.Bns."+24','DMG:+23',}},
sub="Clerisy Strap",
range="Marsyas",
head="Bunzi's Hat",
body="Inyanga Jubbah +1",
hands="Fili Manchettes +1",
legs="Assid. Pants +1",
feet={ name="Bihu Slippers +1", augments={'Enhances "Nightingale" effect',}},
neck="Mizu. Kubikazari",
waist="Witful Belt",
left_ear="Enchntr. Earring +1",
right_ear="Loquac. Earring",
left_ring="Lebeche Ring",
right_ring="Prolix Ring",
back="Atheling Mantle",}
sets.precast.FC.DT = {main=gear.grioavolr_fc_staff,sub="Clerisy Strap +1",ammo="Impatiens",
head="Bunzi's Hat",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring",
body="Inyanga Jubbah +2",hands="Leyline Gloves",ring1="Kishar Ring",ring2="Lebeche Ring",
back=gear.magic_jse_back,waist="Witful Belt",legs="Aya. Cosciales +2",feet="Bihu Slippers +1"}
sets.precast.FC.Cure = set_combine(sets.precast.FC, {feet="Vanya Clogs"})
sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})
sets.precast.FC.Dispelga = set_combine(sets.precast.FC, {main="Daybreak",sub="Genmei Shield"})
sets.precast.FC.BardSong = {main=gear.grioavolr_fc_staff,sub="Clerisy Strap +1",range="Blurred Harp +1",ammo=empty,
head="Bunzi's Hat",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring",
body="Inyanga Jubbah +2",hands="Leyline Gloves",ring1="Kishar Ring",ring2="Lebeche Ring",
back=gear.magic_jse_back,waist="Witful Belt",legs="Aya. Cosciales +2",feet="Bihu Slippers +1"}
sets.precast.FC.SongDebuff = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})
sets.precast.FC.SongDebuff.Resistant = set_combine(sets.precast.FC.BardSong,{range="Blurred Harp +1"})
sets.precast.FC.Lullaby = {range="Marsyas"}
sets.precast.FC.Lullaby.Resistant = {range="Blurred Harp +1"}
sets.precast.FC['Horde Lullaby'] = {range="Marsyas"}
sets.precast.FC['Horde Lullaby'].Resistant = {range="Blurred Harp +1"}
sets.precast.FC['Horde Lullaby'].AoE = {range="Blurred Harp +1"}
sets.precast.FC['Horde Lullaby II'] = {range="Marsyas"}
sets.precast.FC['Horde Lullaby II'].Resistant = {range="Blurred Harp +1"}
sets.precast.FC['Horde Lullaby II'].AoE = {range="Blurred Harp +1"}
sets.precast.FC.Mazurka = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})
sets.precast.FC['Honor March'] = set_combine(sets.precast.FC.BardSong,{range="Marsyas"})
sets.precast.FC.Daurdabla = set_combine(sets.precast.FC.BardSong, {range=info.ExtraSongInstrument})
sets.precast.DaurdablaDummy = sets.precast.FC.Daurdabla
-- Precast sets to enhance JAs
sets.precast.JA.Nightingale = {feet="Bihu Slippers +1"}
sets.precast.JA.Troubadour = {body="Bihu Jstcorps +1"}
sets.precast.JA['Soul Voice'] = {legs="Bihu Cannions +1"}
-- Waltz set (chr and vit)
sets.precast.Waltz = {}
-- Weaponskill sets
-- Default set for any weaponskill that isn't any more specifically defined
sets.precast.WS = {ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Caro Necklace",ear1="Moonshade Earring",ear2="Mache Earring +1",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Ramuh Ring +1",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Grunfeld Rope",legs="Aya. Cosciales +2",feet="Aya. Gambieras +2"}
sets.precast.WS.Acc = {ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Combatant's Torque",ear1="Moonshade Earring",ear2="Mache Earring +1",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Ramuh Ring +1",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Olseni Belt",legs="Aya. Cosciales +2",feet="Aya. Gambieras +2"}
sets.precast.WS['Savage Blade'] = {ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Caro Necklace",ear1="Moonshade Earring",ear2="Ishvara Earring",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Rufescent Ring",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Sailfi Belt +1",legs="Aya. Cosciales +2",feet="Aya. Gambieras +2"}
sets.precast.WS['Aeolian Edge'] = {ammo="Aurgelmir Orb +1",
head="Cath Palug Crown",neck="Baetyl Pendant",ear1="Moonshade Earring",ear2="Friomisi Earring",
body="Chironic Doublet",hands=gear.chironic_enfeeble_hands,ring1="Metamorph Ring +1",ring2="Shiva Ring +1",
back=gear.melee_jse_back,waist="Refoccilation Stone",legs="Gyve Trousers",feet=gear.chironic_nuke_feet}
-- Swap to these on Moonshade using WS if at 3000 TP
sets.MaxTP = {ear1="Ishvara Earring",ear2="Telos Earring",}
sets.AccMaxTP = {ear1="Mache Earring +1",ear2="Telos Earring"}
-- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
-- Midcast Sets
-- General set for recast times.
sets.midcast.FastRecast = {main=gear.grioavolr_fc_staff,sub="Clerisy Strap +1",ammo="Hasty Pinion +1",
head="Bunzi's Hat",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring",
body="Inyanga Jubbah +2",hands="Leyline Gloves",ring1="Kishar Ring",ring2="Lebeche Ring",
back=gear.magic_jse_back,waist="Witful Belt",legs="Aya. Cosciales +2",feet="Bihu Slippers +1"}
-- Gear to enhance certain classes of songs
sets.midcast.Ballad = {legs="Fili Rhingrave +1"}
sets.midcast.Lullaby = {range="Marsyas"}
sets.midcast.Lullaby.Resistant = {range="Blurred Harp +1"}
sets.midcast['Horde Lullaby'] = {range="Marsyas"}
sets.midcast['Horde Lullaby'].Resistant = {range="Blurred Harp +1"}
sets.midcast['Horde Lullaby'].AoE = {range="Blurred Harp +1"}
sets.midcast['Horde Lullaby II'] = {range="Marsyas"}
sets.midcast['Horde Lullaby II'].Resistant = {range="Blurred Harp +1"}
sets.midcast['Horde Lullaby II'].AoE = {range="Blurred Harp +1"}
sets.midcast.Madrigal = {head="Fili Calot +1"}
sets.midcast.Paeon = {}
sets.midcast.March = {hands="Fili Manchettes +1"}
sets.midcast['Honor March'] = set_combine(sets.midcast.March,{range="Marsyas"})
sets.midcast.Minuet = {body="Fili Hongreline +1"}
sets.midcast.Minne = {}
sets.midcast.Carol = {}
sets.midcast["Sentinel's Scherzo"] = {feet="Fili Cothurnes +1"}
sets.midcast['Magic Finale'] = {range="Blurred Harp +1"}
sets.midcast.Mazurka = {range="Marsyas"}
-- For song buffs (duration and AF3 set bonus)
sets.midcast.SongEffect = {main="Kali",sub="Genmei Shield",range="Blurred Harp +1",ammo=empty,
head="Fili Calot +1",neck="Mnbw. Whistle +1",ear1="Enchntr. Earring +1",ear2="Loquac. Earring",
body="Fili Hongreline +1",hands="Inyan. Dastanas +2",ring1="Stikini Ring +1",ring2="Stikini Ring +1",
back=gear.magic_jse_back,waist="Kobo Obi",legs="Inyanga Shalwar +2",feet="Brioso Slippers +2"}
sets.midcast.SongEffect.DW = {main="Kali",sub="Kali"}
-- For song defbuffs (duration primary, accuracy secondary)
sets.midcast.SongDebuff = {main="Kali",sub="Ammurapi Shield",range="Marsyas",ammo=empty,
head="Inyanga Tiara +2",neck="Mnbw. Whistle +1",ear1="Regal Earring",ear2="Digni. Earring",
body="Fili Hongreline +1",hands="Inyan. Dastanas +2",ring1="Metamorph Ring +1",ring2="Stikini Ring +1",
back=gear.magic_jse_back,waist="Acuity Belt +1",legs="Inyanga Shalwar +2",feet="Brioso Slippers +2"}
sets.midcast.SongDebuff.DW = {main="Kali",sub="Kali"}
-- For song defbuffs (accuracy primary, duration secondary)
sets.midcast.SongDebuff.Resistant = {main="Daybreak",sub="Ammurapi Shield",range="Blurred Harp +1",ammo=empty,
head="Inyanga Tiara +2",neck="Mnbw. Whistle +1",ear1="Regal Earring",ear2="Digni. Earring",
body="Inyanga Jubbah +2",hands="Inyan. Dastanas +2",ring1="Metamorph Ring +1",ring2="Stikini Ring +1",
back=gear.magic_jse_back,waist="Acuity Belt +1",legs="Inyanga Shalwar +2",feet="Aya. Gambieras +2"}
-- Song-specific recast reduction
sets.midcast.SongRecast = {main=gear.grioavolr_fc_staff,sub="Clerisy Strap +1",range="Blurred Harp +1",ammo=empty,
head="Bunzi's Hat",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring",
body="Inyanga Jubbah +2",hands="Gendewitha Gages +1",ring1="Kishar Ring",ring2="Prolix Ring",
back=gear.magic_jse_back,waist="Witful Belt",legs="Fili Rhingrave +1",feet="Aya. Gambieras +2"}
sets.midcast.SongDebuff.DW = {}
-- Cast spell with normal gear, except using Daurdabla instead
sets.midcast.Daurdabla = {range=info.ExtraSongInstrument}
-- Dummy song with Daurdabla; minimize duration to make it easy to overwrite.
sets.midcast.DaurdablaDummy = set_combine(sets.midcast.SongRecast, {range=info.ExtraSongInstrument})
-- Other general spells and classes.
sets.midcast.Cure = {main="Serenity",sub="Curatio Grip",ammo="Pemphredo Tathlum",
head="Gende. Caubeen +1",neck="Incanter's Torque",ear1="Gifted Earring",ear2="Mendi. Earring",
body="Kaykaus Bliaut",hands="Kaykaus Cuffs",ring1="Janniston Ring",ring2="Menelaus's Ring",
back="Tempered Cape +1",waist="Luminary Sash",legs="Carmine Cuisses +1",feet="Kaykaus Boots"}
sets.midcast.Curaga = sets.midcast.Cure
sets.Self_Healing = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"}
sets.Cure_Received = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"}
sets.Self_Refresh = {back="Grapevine Cape",waist="Gishdubar Sash"}
sets.midcast['Enhancing Magic'] = {main="Serenity",sub="Fulcio Grip",ammo="Hasty Pinion +1",
head="Telchine Cap",neck="Voltsurge Torque",ear1="Andoaa Earring",ear2="Gifted Earring",
body="Telchine Chas.",hands="Telchine Gloves",ring1="Stikini Ring +1",ring2="Stikini Ring +1",
back=gear.magic_jse_back,waist="Embla Sash",legs="Telchine Braconi",feet="Telchine Pigaches"}
sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget",ear2="Earthcry Earring",waist="Siegel Sash",legs="Shedir Seraweels"})
sets.midcast['Elemental Magic'] = {main="Daybreak",sub="Ammurapi Shield",ammo="Ghastly Tathlum +1",
head="C. Palug Crown",neck="Sanctity Necklace",ear1="Friomisi Earring",ear2="Crematio Earring",
body="Chironic Doublet",hands="Volte Gloves",ring1="Shiva Ring +1",ring2="Shiva Ring +1",
back="Toro Cape",waist="Sekhmet Corset",legs="Gyve Trousers",feet=gear.chironic_nuke_feet}
sets.midcast['Elemental Magic'].Resistant = {main="Daybreak",sub="Ammurapi Shield",ammo="Ghastly Tathlum +1",
head="C. Palug Crown",neck="Sanctity Necklace",ear1="Friomisi Earring",ear2="Crematio Earring",
body="Chironic Doublet",hands="Volte Gloves",ring1="Shiva Ring +1",ring2="Shiva Ring +1",
back="Toro Cape",waist="Yamabuki-no-Obi",legs="Gyve Trousers",feet=gear.chironic_nuke_feet}
sets.midcast.Cursna = set_combine(sets.midcast.Cure, {neck="Debilis Medallion",hands="Hieros Mittens",
back="Oretan. Cape +1",ring1="Haoma's Ring",ring2="Menelaus's Ring",waist="Witful Belt",feet="Vanya Clogs"})
sets.midcast.StatusRemoval = set_combine(sets.midcast.FastRecast, {main=gear.grioavolr_fc_staff,sub="Clemency Grip"})
-- Resting sets
sets.resting = {main="Chatoyant Staff",sub="Umbra Strap",ammo="Staunch Tathlum +1",
head="Bunzi's Hat",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Ethereal Earring",
body="Respite Cloak",hands=gear.chironic_refresh_hands,ring1="Defending Ring",ring2="Dark Ring",
back="Umbra Cape",waist="Flume Belt +1",legs="Assid. Pants +1",feet=gear.chironic_refresh_feet}
sets.idle = {main="Mpaca's Staff",sub="Umbra Strap",ammo="Staunch Tathlum +1",
head="Bunzi's Hat",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Ethereal Earring",
body="Respite Cloak",hands=gear.chironic_refresh_hands,ring1="Stikini Ring +1",ring2="Stikini Ring +1",
back="Umbra Cape",waist="Flume Belt +1",legs="Assid. Pants +1",feet=gear.chironic_refresh_feet}
sets.idle.NoRefresh = {main="Daybreak",sub="Genmei Shield",ammo="Staunch Tathlum +1",
head="Nyame Helm",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring",
body="Nyame Mail",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Shadow Ring",
back="Moonlight Cape",waist="Carrier's Sash",legs="Nyame Flanchard",feet="Fili Cothurnes +1"}
sets.idle.DT = {main="Daybreak",sub="Genmei Shield",ammo="Staunch Tathlum +1",
head="Nyame Helm",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring",
body="Nyame Mail",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Shadow Ring",
back="Moonlight Cape",waist="Carrier's Sash",legs="Nyame Flanchard",feet="Nyame Sollerets"}
-- Defense sets
sets.defense.PDT = {main="Terra's Staff", sub="Umbra Strap",ammo="Staunch Tathlum +1",
head="Nyame Helm",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring",
body="Nyame Mail",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Shadow Ring",
back="Moonlight Cape",waist="Carrier's Sash",legs="Nyame Flanchard",feet="Nyame Sollerets"}
sets.defense.MDT = {main="Terra's Staff", sub="Umbra Strap",ammo="Staunch Tathlum +1",
head="Nyame Helm",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring",
body="Nyame Mail",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Shadow Ring",
back="Moonlight Cape",waist="Carrier's Sash",legs="Nyame Flanchard",feet="Nyame Sollerets"}
sets.Kiting = {feet="Fili Cothurnes +1"}
sets.latent_refresh = {waist="Fucho-no-obi"}
sets.latent_refresh_grip = {sub="Oneiros Grip"}
sets.TPEat = {neck="Chrys. Torque"}
-- 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 = {main="Aeneas",sub="Genmei Shield",ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Asperity Necklace",ear1="Cessance Earring",ear2="Brutal Earring",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Petrov Ring",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Windbuffet Belt +1",legs="Aya. Cosciales +2",feet="Battlecast Gaiters"}
sets.engaged.DT = {main="Aeneas",sub="Genmei Shield",ammo="Aurgelmir Orb +1",
head="Nyame Helm",neck="Loricate Torque +1",ear1="Cessance Earring",ear2="Brutal Earring",
body="Nyame Mail",hands="Nyame Gauntlets",ring1="Petrov Ring",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Windbuffet Belt +1",legs="Nyame Flanchard",feet="Nyame Sollerets"}
sets.engaged.Acc = {main="Aeneas",sub="Genmei Shield",ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Combatant's Torque",ear1="Digni. Earring",ear2="Telos Earring",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Ramuh Ring +1",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Olseni Belt",legs="Aya. Cosciales +2",feet="Aya. Gambieras +2"}
sets.engaged.DW = {main="Aeneas",sub="Blurred Knife +1",ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Asperity Necklace",ear1="Suppanomimi",ear2="Brutal Earring",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Petrov Ring",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Reiki Yotai",legs="Aya. Cosciales +2",feet="Battlecast Gaiters"}
sets.engaged.DW.DT = {main="Aeneas",sub="Blurred Knife +1",ammo="Aurgelmir Orb +1",
head="Nyame Helm",neck="Loricate Torque +1",ear1="Suppanomimi",ear2="Brutal Earring",
body="Nyame Mail",hands="Nyame Gauntlets",ring1="Petrov Ring",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Reiki Yotai",legs="Nyame Flanchard",feet="Nyame Sollerets"}
sets.engaged.DW.Acc = {main="Aeneas",sub="Blurred Knife +1",ammo="Aurgelmir Orb +1",
head="Aya. Zucchetto +2",neck="Combatant's Torque",ear1="Suppanomimi",ear2="Telos Earring",
body="Ayanmo Corazza +2",hands="Aya. Manopolas +2",ring1="Ramuh Ring +1",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Reiki Yotai",legs="Aya. Cosciales +2",feet="Aya. Gambieras +2"}
sets.engaged.DW.Acc.DT = {main="Aeneas",sub="Blurred Knife +1",ammo="Aurgelmir Orb +1",
head="Nyame Helm",neck="Combatant's Torque",ear1="Suppanomimi",ear2="Telos Earring",
body="Ayanmo Corazza +2",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Ilabrat Ring",
back=gear.melee_jse_back,waist="Reiki Yotai",legs="Nyame Flanchard",feet="Nyame Sollerets"}
end
-- Select default macro book on initial load or subjob change.
function select_default_macro_book()
set_macro_page(10, 10)
end
state.Weapons:options('None','Naegling','Aeneas','DualWeapons','DualNaegling','DualTauret','DualAeolian')
autows_list = {['Naegling']='Savage Blade',['Aeneas']="Rudra's Storm",['DualWeapons']="Rudra's Storm",['DualNaegling']='Savage Blade',['DualTauret']='Evisceration',
['DualAeolian']='Aeolian Edge'}
By Spookyfish89 2022-07-07 10:51:35
Code -- Adjust this if using the Terpander (new +song instrument)
info.ExtraSongInstrument = 'Blurred Harp +1'
-- How many extra songs we can keep from Daurdabla/Terpander
info.ExtraSongs = 1
should be;
Code -- 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
as Greyfawkz mentioned above. However, you can forego the dummysongsmode line in your macros by making a line for Paeon I and Paeon II in your name_brd.lua with just range="Daurdabla" like also suggested above.
[+]
I am pulling out my remaining hair trying to get this thing to work. I am using Serindrile's luas and for BRD I cannot figure out how to get my Daurdabla to auto swap in while doing dummy songs. I am using for macro line /console gs c set ExtraSongsMode Dummy. I will post my lua below but I have not altered anything within and I have the harp so I am confused why it will not automatically swap.
I hope I am correct in the order of using the macro. So if I start with 2 songs then hit my macro which contains the dummy line and the song I am using should it not equip my harp and cast 3rd song?
Code --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__
-- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____
-- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \
-- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/
-- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\
-- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
--
-- Please do not edit this file! Please do not edit this file! Please do not edit this file!
--
-- Editing this file will cause you to be unable to use Github Desktop to update!
--
-- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and
-- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first.
-- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence.
--
-- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing
-- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important
-- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead.
--
-- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example.
-- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there.
-- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs)
--
-- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them:
-- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what.
-- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character.
-- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character.
--
--
-- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ
-- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium.
--
-- Please do not edit this file! Please do not edit this file! Please do not edit this file!
-- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__
-- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____
-- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \
-- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/
-- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\
-- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job. Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------
--[[
Custom commands:
ExtraSongsMode may take one of three values: None, Dummy, FullLength
You can set these via the standard 'set' and 'cycle' self-commands. EG:
gs c cycle ExtraSongsMode
gs c set ExtraSongsMode Dummy
The Dummy state will equip the bonus song instrument and ensure non-duration gear is equipped.
The FullLength state will simply equip the bonus song instrument on top of standard gear.
Simple macro to cast a dummy Daurdabla song:
/console gs c set ExtraSongsMode Dummy
/ma "Mage's Ballad" <me>
To use a Terpander rather than Daurdabla, set the info.ExtraSongInstrument variable to
'Terpander', and info.ExtraSongs to 1.
--]]
-- Initialization function for this job file.
function get_sets()
-- Load and initialize the include file.
include('Sel-Include.lua')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.ExtraSongsMode = M{['description']='Extra Songs','None','Dummy','DummyLock','FullLength','FullLengthLock'}
-- Whether to use Carn (or song daggers in general) under a certain threshhold even when weapons are locked.
state.CarnMode = M{'Always','300','1000','Never'}
state.Buff['Aftermath: Lv.3'] = buffactive['Aftermath: Lv.3'] or false
state.Buff['Pianissimo'] = buffactive['Pianissimo'] or false
state.Buff['Nightingale'] = buffactive['Nightingale'] or false
state.RecoverMode = M('35%', '60%', 'Always', 'Never')
autows = "Rudra's Storm"
autofood = 'Pear Crepe'
state.AutoSongMode = M(false, 'Auto Song Mode')
update_melee_groups()
init_job_states({"Capacity","AutoRuneMode","AutoTrustMode","AutoNukeMode","AutoWSMode","AutoShadowMode","AutoFoodMode","AutoStunMode","AutoDefenseMode","AutoSongMode",},{"AutoBuffMode","AutoSambaMode","Weapons","OffenseMode","WeaponskillMode","IdleMode","Passive","RuneElement","ExtraSongsMode","CastingMode","CarnMode","TreasureMode",})
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.
-- Set eventArgs.handled to true if we don't want any automatic target handling to be done.
function job_filtered_action(spell, eventArgs)
if spell.type == 'WeaponSkill' then
local available_ws = S(windower.ffxi.get_abilities().weapon_skills)
-- WS 112 is Double Thrust, meaning a Spear is equipped.
if available_ws:contains(32) then
if spell.english == "Rudra's Storm" then
windower.chat.input('/ws "Savage Blade" '..spell.target.raw)
cancel_spell()
eventArgs.cancel = true
end
end
end
end
function job_pretarget(spell, spellMap, eventArgs)
if spell.type == 'BardSong' and not spell.targets.Enemy then
if state.Buff['Pianissimo'] and spell.target.raw == '<t>' and (player.target.type == 'NONE' or spell.target.type == 'MONSTER') then
eventArgs.cancel = true
windower.chat.input('/ma "'..spell.name..'" <stpt>')
elseif spell.target.raw == '<t>' and (player.target.type == 'NONE' or player.target.type == "MONSTER") and not state.Buff['Pianissimo'] then
change_target('<me>')
return
end
end
end
function job_precast(spell, spellMap, eventArgs)
if spell.action_type == 'Magic' then
if spell.english:contains('Honor March') then
equip({range="Marsyas"})
end
if not sets.precast.FC[spell.english] and (spell.type == 'BardSong' and spell.targets.Enemy) then
classes.CustomClass = 'SongDebuff'
end
end
end
function job_filter_precast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' and not spell.targets.Enemy then
local spell_recasts = windower.ffxi.get_spell_recasts()
-- 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
if spell_recasts[spell.recast_id] < 1.5 then
send_command('@input /ja "Pianissimo" <me>; wait 1.1; input /ma "'..spell.name..'" '..spell.target.name)
eventArgs.cancel = true
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, spellMap, eventArgs)
if spell.action_type == 'Magic' then
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
if sets.midcast[generalClass][state.CastingMode.value] then
equip(sets.midcast[generalClass][state.CastingMode.value])
else
equip(sets.midcast[generalClass])
end
end
end
end
end
function job_post_precast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' then
local generalClass = get_song_class(spell)
if state.Buff['Nightingale'] then
-- Replicate midcast in precast for nightingale including layering.
if generalClass and sets.midcast[generalClass] then
if sets.midcast[generalClass][state.CastingMode.value] then
equip(sets.midcast[generalClass][state.CastingMode.value])
else
equip(sets.midcast[generalClass])
end
end
if sets.midcast[spell.english] then
if sets.midcast[spell.english][state.CastingMode.value] then
equip(sets.midcast[spell.english][state.CastingMode.value])
else
equip(sets.midcast[spell.english])
end
elseif sets.midcast[get_spell_map(spell, default_spell_map)] then
if sets.midcast[get_spell_map(spell, default_spell_map)][state.CastingMode.Value]
then equip(sets.midcast[get_spell_map(spell, default_spell_map)][state.CastingMode.Value])
else
equip(sets.midcast[get_spell_map(spell, default_spell_map)])
end
end
if not spell.targets.Enemy and state.ExtraSongsMode.value:contains('FullLength') then
equip(sets.midcast.Daurdabla)
end
end
if state.CarnMode.value ~= 'Never' and (state.CarnMode.value == 'Always' or tonumber(state.CarnMode.value) > player.tp) then
if sets.midcast[generalClass].main and sets.midcast[generalClass].main ~= player.equipment.main then
enable('main')
equip({main=sets.midcast[generalClass].main})
end
if sets.midcast[generalClass].sub and sets.midcast[generalClass].sub ~= player.equipment.sub then
enable('sub')
equip({sub=sets.midcast[generalClass].sub})
end
end
elseif spell.type == 'WeaponSkill' then
local WSset = standardize_set(get_precast_set(spell, spellMap))
local wsacc = check_ws_acc()
if (WSset.ear1 == "Moonshade Earring" or WSset.ear2 == "Moonshade Earring") then
-- Replace Moonshade Earring if we're at cap TP
if get_effective_player_tp(spell, WSset) > 3200 then
if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and sets.AccMaxTP then
equip(sets.AccMaxTP[spell.english] or sets.AccMaxTP)
elseif sets.MaxTP then
equip(sets.MaxTP[spell.english] or sets.MaxTP)
else
end
end
end
end
end
function job_post_midcast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' then
if spell.targets.Enemy then
if sets.midcast[spell.english] then
if sets.midcast[spell.english][state.CastingMode.value] then
equip(sets.midcast[spell.english][state.CastingMode.value])
else
equip(sets.midcast[spell.english])
end
elseif sets.midcast[spellMap] then
if sets.midcast[spellMap][state.CastingMode.value] then
equip(sets.midcast[spellMap][state.CastingMode.value])
else
equip(sets.midcast[spellMap])
end
end
if can_dual_wield and sets.midcast.SongDebuff.DW then
equip(sets.midcast.SongDebuff.DW)
end
else
if can_dual_wield and sets.midcast.SongEffect.DW then
equip(sets.midcast.SongEffect.DW)
end
end
if state.ExtraSongsMode.value:contains('FullLength') then
equip(sets.midcast.Daurdabla)
end
if not state.ExtraSongsMode.value:contains('Lock') then
state.ExtraSongsMode:reset()
end
if state.DisplayMode.value then update_job_states() end
elseif spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then
if state.MagicBurstMode.value ~= 'Off' then equip(sets.MagicBurst) end
if spell.element == world.weather_element or spell.element == world.day_element then
if state.CastingMode.value == 'Fodder' then
if spell.element == world.day_element then
if item_available('Zodiac Ring') then
sets.ZodiacRing = {ring2="Zodiac Ring"}
equip(sets.ZodiacRing)
end
end
end
end
if spell.element == 'Wind' and sets.WindNuke then
equip(sets.WindNuke)
elseif spell.element == 'Ice' and sets.IceNuke then
equip(sets.IceNuke)
end
if state.RecoverMode.value ~= 'Never' and (state.RecoverMode.value == 'Always' or tonumber(state.RecoverMode.value:sub(1, -2)) > player.mpp) then
equip(sets.RecoverMP)
end
end
end
-- Set eventArgs.handled to true if we don't want automatic gear equipping to be done.
function job_aftercast(spell, spellMap, eventArgs)
if spell.type == 'BardSong' and not spell.interrupted then
if state.CarnMode.value ~= 'Never' then
local generalClass = get_song_class(spell)
if sets.midcast[generalClass].main and sets.weapons[state.Weapons.value] then
if sets.weapons[state.Weapons.value].main then
equip({main=sets.weapons[state.Weapons.value].main})
disable('main')
end
if sets.weapons[state.Weapons.value].sub then
equip({sub=sets.weapons[state.Weapons.value].sub})
disable('sub')
end
end
end
elseif spell.skill == 'Elemental Magic' and state.MagicBurstMode.value == 'Single' then
state.MagicBurstMode:reset()
if state.DisplayMode.value then update_job_states() end
end
end
function job_buff_change(buff, gain)
update_melee_groups()
end
function job_get_spell_map(spell, default_spell_map)
if default_spell_map == 'Cure' or default_spell_map == 'Curaga' then
if world.weather_element == 'Light' then
return 'LightWeatherCure'
elseif world.day_element == 'Light' then
return 'LightDayCure'
end
elseif spell.skill == "Enfeebling Magic" then
if spell.english:startswith('Dia') then
return "Dia"
elseif spell.type == "WhiteMagic" or spell.english:startswith('Frazzle') or spell.english:startswith('Distract') then
return 'MndEnfeebles'
else
return 'IntEnfeebles'
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function job_zone_change(new_id,old_id)
state.AutoSongMode:reset()
end
-- Called by the 'update' self-command.
function job_update(cmdParams, eventArgs)
update_melee_groups()
end
-- Modify the default idle set after it was constructed.
function job_customize_idle_set(idleSet)
if buffactive['Sublimation: Activated'] then
if (state.IdleMode.value == 'Normal' or state.IdleMode.value:contains('Sphere')) and sets.buff.Sublimation then
idleSet = set_combine(idleSet, sets.buff.Sublimation)
elseif state.IdleMode.value:contains('DT') and sets.buff.DTSublimation then
idleSet = set_combine(idleSet, sets.buff.DTSublimation)
end
end
if state.IdleMode.value == 'Normal' or state.IdleMode.value:contains('Sphere') then
if player.mpp < 51 then
if sets.latent_refresh then
idleSet = set_combine(idleSet, sets.latent_refresh)
end
if (state.Weapons.value == 'None' or state.UnlockWeapons.value) and idleSet.main then
local main_table = get_item_table(idleSet.main)
if main_table and main_table.skill == 12 and sets.latent_refresh_grip then
idleSet = set_combine(idleSet, sets.latent_refresh_grip)
end
if player.tp > 10 and sets.TPEat then
idleSet = set_combine(idleSet, sets.TPEat)
end
end
end
end
return idleSet
end
-- Function to display the current relevant user state when doing an update.
function display_current_job_state(eventArgs)
display_current_caster_state()
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 spell.targets.Enemy then
return 'SongDebuff'
elseif state.ExtraSongsMode.value:contains('Dummy') then
return 'DaurdablaDummy'
else
return 'SongEffect'
end
end
-- Examine equipment to determine what our current TP weapon is.
function update_melee_groups()
if player.equipment.main then
classes.CustomMeleeGroups:clear()
if player.equipment.main == "Carnwenhan" and state.Buff['Aftermath: Lv.3'] then
classes.CustomMeleeGroups:append('AM')
end
end
end
-- Allow jobs to override this code
function job_self_command(commandArgs, eventArgs)
end
function job_tick()
if check_song() then return true end
if check_buff() then return true end
if check_buffup() then return true end
return false
end
function check_song()
if state.AutoSongMode.value then
if not buffactive.march then
windower.chat.input('/ma "Honor March" <me>')
tickdelay = os.clock() + 2
return true
elseif not buffactive.minuet then
windower.chat.input('/ma "Valor Minuet V" <me>')
tickdelay = os.clock() + 2
return true
elseif not buffactive.madrigal then
windower.send_command('gs c set ExtraSongsMode FullLength;input /ma "Blade Madrigal" <me>')
tickdelay = os.clock() + 2
return true
else
return false
end
else
return false
end
end
function check_buff()
if state.AutoBuffMode.value ~= 'Off' and not data.areas.cities:contains(world.area) then
local spell_recasts = windower.ffxi.get_spell_recasts()
for i in pairs(buff_spell_lists[state.AutoBuffMode.Value]) do
if not buffactive[buff_spell_lists[state.AutoBuffMode.Value][i].Buff] and (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Always' or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Combat' and (player.in_combat or being_attacked)) or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Engaged' and player.status == 'Engaged') or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'Idle' and player.status == 'Idle') or (buff_spell_lists[state.AutoBuffMode.Value][i].When == 'OutOfCombat' and not (player.in_combat or being_attacked))) and spell_recasts[buff_spell_lists[state.AutoBuffMode.Value][i].SpellID] < spell_latency and silent_can_use(buff_spell_lists[state.AutoBuffMode.Value][i].SpellID) then
windower.chat.input('/ma "'..buff_spell_lists[state.AutoBuffMode.Value][i].Name..'" <me>')
tickdelay = os.clock() + 2
return true
end
end
else
return false
end
end
function check_buffup()
if buffup ~= '' then
local needsbuff = false
for i in pairs(buff_spell_lists[buffup]) do
if not buffactive[buff_spell_lists[buffup][i].Buff] and silent_can_use(buff_spell_lists[buffup][i].SpellID) then
needsbuff = true
break
end
end
if not needsbuff then
add_to_chat(217, 'All '..buffup..' buffs are up!')
buffup = ''
return false
end
local spell_recasts = windower.ffxi.get_spell_recasts()
for i in pairs(buff_spell_lists[buffup]) do
if not buffactive[buff_spell_lists[buffup][i].Buff] and silent_can_use(buff_spell_lists[buffup][i].SpellID) and spell_recasts[buff_spell_lists[buffup][i].SpellID] < spell_latency then
windower.chat.input('/ma "'..buff_spell_lists[buffup][i].Name..'" <me>')
tickdelay = os.clock() + 2
return true
end
end
return false
else
return false
end
end
buff_spell_lists = {
Auto = {--Options for When are: Always, Engaged, Idle, OutOfCombat, Combat
{Name='Refresh', Buff='Refresh', SpellID=109, When='Idle'},
{Name='Phalanx', Buff='Phalanx', SpellID=106, When='Idle'},
{Name='Stoneskin', Buff='Stoneskin', SpellID=54, When='Idle'},
{Name='Blink', Buff='Blink', SpellID=53, When='Idle'},
},
Default = {
{Name='Refresh', Buff='Refresh', SpellID=109, Reapply=false},
{Name='Phalanx', Buff='Phalanx', SpellID=106, Reapply=false},
{Name='Stoneskin', Buff='Stoneskin', SpellID=54, Reapply=false},
{Name='Blink', Buff='Blink', SpellID=53, Reapply=false},
},
}
|
|