Gearswap Support Thread

Language: JP EN DE FR
New Items
2023-11-19
users online
Forum » Windower » Support » Gearswap Support Thread
Gearswap Support Thread
First Page 2 3 ... 168 169 170 ... 180 181 182
 
Offline
Posts:
By 2022-05-11 00:37:22
 Undelete | Edit  | Link | Quote | Reply
 
Post deleted by User.
 
Offline
Posts:
By 2022-05-11 00:51:47
 Undelete | Edit  | Link | Quote | Reply
 
Post deleted by User.
 Asura.Cordyfox
Offline
Server: Asura
Game: FFXI
user: Cordyfox
Posts: 71
By Asura.Cordyfox 2022-05-13 10:23:12
Link | Quote | Reply
 
So, I normally use my numpad for weaponskills and it typically works great. But for jobs where I want to be able to use multiple weapons, I'd like to have the keybinds change accordingly. Any suggestions on how to make this actually work? (Attached code is what I currently have and it doesn't work.)
Code
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
    if state.WeaponLock.value == true then
        disable('ranged','ammo')
    else
        enable('ranged','ammo')
    end

    if state.WeaponSet == 'Damage' then
        send_command('bind ^numpad1 input /ws "Rudra\'s Storm" <t>')
        send_command('bind ^numpad2 input /ws "Evisceration" <t>')
        send_command('bind ^numpad3 input /ws "Mandalic Stab" <t>')
        send_command('bind ^numpad4 input /ws "Exenterator" <t>')
        send_command('bind ^numpad5 input /ws "Dancing Edge" <t>')
        send_command('bind ^numpad6 input /ws "Shark Bite" <t>')
        send_command('bind ^numpad7 input /ws "Shadowstitch" <t>')
        send_command('bind ^numpad8 input /ws "Energy Drain" <t>')
        send_command('bind ^numpad9 input /ws "Aeolian Edge" <t>')
    elseif state.WeaponSet == 'Sword' then
        send_command('bind ^numpad1 input /ws "Savage Blade" <t>')
        send_command('bind ^numpad2 input /ws "Flat Blade" <t>')
        send_command('bind ^numpad3 input /ws "Burning Blade" <t>')
        send_command('bind ^numpad9 input /ws "Circle Blade" <t>')
    elseif state.WeaponSet == 'H2H' then
        send_command('bind ^numpad1 input /ws "Asuran Fists" <t>')
        send_command('bind ^numpad2 input /ws "Shoulder Tackle" <t>')
        send_command('bind ^numpad3 input /ws "Backhand Blow" <t>')
        send_command('bind ^numpad9 input /ws "Spinning Attack" <t>')
    end 

    if state.RangedSet == 'Marksmanship' then
        send_command('bind !numpad1 input /ws "Last Stand" <t>')
        send_command('bind !numpad2 input /ws "Heavy Shot" <t>')
    elseif state.RangedSet == 'Archery' then
        send_command('bind !numpad1 input /ws "Empyreal Arrow" <t>')
        send_command('unbind !numpad2')
    elseif state.RangedSet == 'Throwing' or state.RangedSet == 'Melee' then
        send_command('unbind !numpad1')
        send_command('unbind !numpad2')
    end

    check_weaponset()

end
 Bismarck.Radec
Offline
Server: Bismarck
Game: FFXI
user: Radec
Posts: 129
By Bismarck.Radec 2022-05-13 13:00:41
Link | Quote | Reply
 
Probably change "state.WeaponSet" to "state.WeaponSet.value", same for state.RangedSet

Try adding a print(state.WeaponSet) to see what you're comparing to "Damage', 'Sword', etc as a debugging step.
 Asura.Cordyfox
Offline
Server: Asura
Game: FFXI
user: Cordyfox
Posts: 71
By Asura.Cordyfox 2022-05-13 15:04:31
Link | Quote | Reply
 
Bismarck.Radec said: »
Probably change "state.WeaponSet" to "state.WeaponSet.value", same for state.RangedSet

Try adding a print(state.WeaponSet) to see what you're comparing to "Damage', 'Sword', etc as a debugging step.

Oh, duh. That should've been more obvious in retrospect. Now the challenge is getting the keys to remap themselves when I switch sets.

EDIT: Figured it out :) Oh I'm happy with this.
 Asura.Cordyfox
Offline
Server: Asura
Game: FFXI
user: Cordyfox
Posts: 71
By Asura.Cordyfox 2022-05-13 16:24:59
Link | Quote | Reply
 
New problem: despite having...
Code
    if state.WeaponLock.value == true then
        disable('ranged','ammo')
    else
        enable('ranged','ammo')
    end
...in job_state_change, any time I engage a mob (or try to launch a ranged WS, it throws my melee or TH ammo back on ruining it. I'm baffled.
 Kujata.Tetsuiga
Offline
Server: Kujata
Game: FFXI
user: Tetsuiga
Posts: 40
By Kujata.Tetsuiga 2022-05-13 18:45:27
Link | Quote | Reply
 
I'm using Selinrile's GS, I'm trying to set certain songs for a brd to only be cast in dummy mode, would anyone be able to assist me in figuring out how to make this work?

So this line exists, and i figured i could just set like paeon or something to always be those songs

-- Adjust this if using the Terpander (new +song instrument)
info.ExtraSongInstrument = 'Terpander'
-- How many extra songs we can keep from Daurdabla/Terpander
info.ExtraSongs = 1
 Odin.Defiiant
Offline
Server: Odin
Game: FFXI
user: legionn
Posts: 22
By Odin.Defiiant 2022-05-13 18:50:20
Link | Quote | Reply
 
not familiar with Selinrile's GS, but maybe just creating a set for that song?

sets.midcast.Ballad = {}
 Bismarck.Radec
Offline
Server: Bismarck
Game: FFXI
user: Radec
Posts: 129
By Bismarck.Radec 2022-05-13 19:48:52
Link | Quote | Reply
 
Close - make a set for the song that uses the harp, and possibly doesn't include duration gear. For buff songs, Sel GS automatically layers
sets.midcast.SongEffect then sets.midcast.<song type> or sets.midcast.<song name>, so you need to call out the specific slots you want to use dummy gear on rather than just a blank set.

ie

sets.midcast["Army's Paeon II"] = {range="Daurdabla",neck="Loricate",body="Nyame",legs="Nyame"}

or

sets.midcast.Mazurka = set_combine(sets.idle, {range="Daurdabla"})

Repeat for songs or song classes that you want to be dummy mode.
[+]
 Asura.Xpeacekeeper
Offline
Server: Asura
Game: FFXI
Posts: 1
By Asura.Xpeacekeeper 2022-05-15 18:32:59
Link | Quote | Reply
 
hello, is there a rule to equip weapon/shield in the event they are removed, preferably without relying on precast? Sorry if this has been asked already, tried searching first.
 Asura.Yottaxa
Offline
Server: Asura
Game: FFXI
user: Yottaxa
Posts: 134
By Asura.Yottaxa 2022-05-16 03:28:30
Link | Quote | Reply
 
Asura.Xpeacekeeper said: »
hello, is there a rule to equip weapon/shield in the event they are removed, preferably without relying on precast? Sorry if this has been asked already, tried searching first.

Not sure as there may be better ways?, but what I have done is custom logic in my aftercast that always just equips selected weapons. In my case this also takes care of weapon swaps for cor rolls etc. You could also make a custom “oh crap” button that just equips current selected weapon and armors. I actually have these buttons setup too, as a fast way to drop into max dt.

I dont do it, but you could probably setup a custom react for all of the encumbrance / armor knock off abilities? And handle it there, but that seems like more work.
 Sylph.Inro
Offline
Server: Sylph
Game: FFXI
user: Solusek
Posts: 1
By Sylph.Inro 2022-05-18 02:33:49
Link | Quote | Reply
 
Hello, am multi boxing with another addon SendTarget (Github Link) it can help to capture sub target for alt. character without changing the window (you can do //sta "character name" /ma Cure <stpc> or /ma Silence <stnpc> when you are on main character window ), it work completely fine without Gearswap, but once I load gearswap it will stopped me to do the command (text show: "Abort: You haven't learned [Spell/Ability]"). I tried to find out which function in gearswap doing this so I can disable or amend to avoid this problem but my coding skill really not capable to do so :(

can someone please help

ps: am using Selinrile's Gearswap
 Asura.Iamarealgirl
Offline
Server: Asura
Game: FFXI
user: Latravant
Posts: 79
By Asura.Iamarealgirl 2022-05-18 10:27:53
Link | Quote | Reply
 
is there a way to put an auto avatar's favor into my smn
gearswap?
 Asura.Sechs
Online
Server: Asura
Game: FFXI
user: Akumasama
Posts: 9876
By Asura.Sechs 2022-05-24 10:46:49
Link | Quote | Reply
 
I've been having an issue in my luas for the longest time and decided I want to try to fix it.

Check this simplified code:
Code
function status_change(new,old)
	if new == 'Engaged' then
		lock main/sub
	else
		unlock main/sub
	end
end


The code works pretty well if the new status is "Engaged" or "Disengaged".
But I'm getting my char to remain "stuck" (with main/sub locked) if I die instead of disengaging, or if I get warped out of the BC... but this latter event isn't much relevant, the death one is.

So I'm wondering why is it happening?
I'm checking for "engaged". If the new status is engaged then lock, if it's ANYTHING ELSE THAT IS NOT ENGAGED then unlock.
So in theory it should work with every status that's not engaged, and that includes "dead" too.
What am I missing here?
 Bismarck.Radec
Offline
Server: Bismarck
Game: FFXI
user: Radec
Posts: 129
By Bismarck.Radec 2022-05-24 12:40:37
Link | Quote | Reply
 
gearswap's status_change filters out dead (status 2), engaged-dead(status 3), and event(status 4) statuses from triggering a function, if they are either the old or new status.

gearswap.lua:
Code
line 321:
windower.register_event('status change',function(new,old)
    windower.debug('status change '..new)
    if gearswap_disabled or T{2,3,4}:contains(old) or T{2,3,4}:contains(new) then return end
    
    refresh_globals()
    equip_sets('status_change',nil,res.statuses[new].english,res.statuses[old].english)
end)
[+]
 Asura.Sechs
Online
Server: Asura
Game: FFXI
user: Akumasama
Posts: 9876
By Asura.Sechs 2022-05-24 12:49:49
Link | Quote | Reply
 
Ahh that's why then.
I could customize Gearswap.lua but then each new update I would be ***.

Any simple way for me to fix my code? Considering that status_change filters those statuses?
 Bismarck.Radec
Offline
Server: Bismarck
Game: FFXI
user: Radec
Posts: 129
By Bismarck.Radec 2022-05-24 14:13:03
Link | Quote | Reply
 
Something on buff change maybe
Code
function buff_change(buff, gain)
    if player.status == idle and buff == "weakness" and gain then
        unlock
    end
end


It's not perfect (Raise after Mijin doesn't have weakness, for example) but should catch the case of dying while engaged, then getting a raise. Also unlocks you if you're disengaged and get weakness status from a WS though, which may not be intended - another condition on player.tp > x could adjust for that
[+]
Offline
Posts: 40
By quelthos 2022-05-27 03:33:09
Link | Quote | Reply
 
I have sleepmaxduration setup for sleep, sleep2, sleepga
swaps correctly when sleepmaxduration is turned on for sleep2 and sleepga, sleep(sleep1) will not swap to sleepmaxduration gear, only swaps to sets.midcast.sleep gear. Please help
Code
function get_sets()
    mote_include_version = 2

    -- Load and initialize the include file.
    include('Mote-Include.lua')
end


-- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
function job_setup()

    -- state.CP = M(false, "Capacity Points Mode")
    state.Buff.Composure = buffactive.Composure or false
    state.Buff.Saboteur = buffactive.Saboteur or false
    state.Buff.Stymie = buffactive.Stymie 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"}

    enfeebling_magic_acc = S{'Bind', 'Break', 'Dispel', 'Distract', 'Distract II', 'Frazzle',
        'Frazzle II',  'Gravity', 'Gravity II', 'Silence'}
    enfeebling_magic_skill = S{'Distract III', 'Frazzle III', 'Poison II'}
    enfeebling_magic_effect = S{'Dia', 'Dia II', 'Dia III', 'Diaga', 'Blind', 'Blind II'}
    enfeebling_magic_sleep = S{'Sleep', 'Sleep II', 'Sleepga'}

    skill_spells = S{
        'Temper', 'Temper II', 'Enfire', 'Enfire II', 'Enblizzard', 'Enblizzard II', 'Enaero', 'Enaero II',
        'Enstone', 'Enstone II', 'Enthunder', 'Enthunder II', 'Enwater', 'Enwater II'}

    --include('Mote-TreasureHunter')

    -- For th_action_check():
    -- JA IDs for actions that always have TH: Provoke, Animated Flourish
    info.default_ja_ids = S{35, 204}
    -- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
    info.default_u_ja_ids = S{201, 202, 203, 205, 207}

    lockstyleset = 60
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', 'Acc', 'Haste')
    state.HybridMode:options('Normal')
    state.WeaponskillMode:options('Normal')
    state.CastingMode:options('Normal', 'Resistant')
    state.IdleMode:options('Normal')

    state.EnSpell = M{['description']='EnSpell', 'Enfire', 'Enblizzard', 'Enaero', 'Enstone', 'Enthunder', 'Enwater'}
    state.BarElement = M{['description']='BarElement', 'Barfire', 'Barblizzard', 'Baraero', 'Barstone', 'Barthunder', 'Barwater'}
    state.BarStatus = M{['description']='BarStatus', 'Baramnesia', 'Barvirus', 'Barparalyze', 'Barsilence', 'Barpetrify', 'Barpoison', 'Barblind', 'Barsleep'}
    state.GainSpell = M{['description']='GainSpell', 'Gain-STR', 'Gain-INT', 'Gain-AGI', 'Gain-VIT', 'Gain-DEX', 'Gain-MND', 'Gain-CHR'}

    state.WeaponSet = M{['description']='Weapon Set', 'macc', 'sb', 'mws', 'ae', 'cdc', 'blunt', 'nuke'}
    state.WeaponLock = M(false, 'Weapon Lock')
    state.MagicBurst = M(false, 'Magic Burst')
    state.SleepMode = M{['description']='Sleep Mode', 'Normal', 'MaxDuration'}
    state.EnspellMode = M(false, 'Enspell Melee Mode')
    state.NM = M(false, 'NM?')
    -- 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

    --send_command('bind ^` input /ja "Composure" <me>')
    --send_command('bind @t gs c cycle treasuremode')
    send_command('bind ^` gs c toggle MagicBurst')
    send_command('bind @` gs c cycle SleepMode')

    --if player.sub_job == 'SCH' then
        --send_command('bind ^- gs c scholar light')
        --send_command('bind ^= gs c scholar dark')
        --send_command('bind !- gs c scholar addendum')
        --send_command('bind != gs c scholar addendum')
        --send_command('bind ^; gs c scholar speed')
        --send_command('bind ![ gs c scholar aoe')
        --send_command('bind !; gs c scholar cost')
    --end

    --send_command('bind !q input /ma "Temper II" <me>')
    --send_command('bind !w input /ma "Flurry II" <stpc>')
    --send_command('bind !e input /ma "Haste II" <stpc>')
    --send_command('bind !r input /ma "Refresh III" <stpc>')
    --send_command('bind !y input /ma "Phalanx II" <stpc>')
    --send_command('bind !o input /ma "Regen II" <stpc>')
    --send_command('bind !p input /ma "Shock Spikes" <me>')

    --send_command('bind ~numpad7 input /ma "Paralyze II" <t>')
    --send_command('bind ~numpad8 input /ma "Silence" <t>')
    --send_command('bind ~numpad9 input /ma "Blind II" <t>')
    --send_command('bind ~numpad4 input /ma "Poison II" <t>')
    --send_command('bind ~numpad5 input /ma "Slow II" <t>')
    --send_command('bind ~numpad6 input /ma "Addle II" <t>')
    --send_command('bind ~numpad1 input /ma "Distract III" <t>')
    --send_command('bind ~numpad2 input /ma "Frazzle III" <t>')
    --send_command('bind ~numpad3 input /ma "Inundation" <t>')
    --send_command('bind ~numpad0 input /ma "Dia III" <t>')

    --send_command('bind !insert gs c cycleback EnSpell')
    --send_command('bind !delete gs c cycle EnSpell')
    --send_command('bind ^insert gs c cycleback GainSpell')
    --send_command('bind ^delete gs c cycle GainSpell')
    --send_command('bind ^home gs c cycleback BarElement')
    --send_command('bind ^end gs c cycle BarElement')
    --send_command('bind ^pageup gs c cycleback BarStatus')
    --send_command('bind ^pagedown gs c cycle BarStatus')

    --send_command('bind @e gs c cycle EnspellMode')
    --send_command('bind @d gs c toggle NM')
    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 ^numpad7 input /ws "Savage Blade" <t>')
    --send_command('bind ^numpad9 input /ws "Chant du Cygne" <t>')
    --send_command('bind ^numpad4 input /ws "Requiescat" <t>')
    --send_command('bind ^numpad1 input /ws "Sanguine Blade" <t>')
    --send_command('bind ^numpad2 input /ws "Seraph Blade" <t>')

    select_default_macro_book()
    set_lockstyle()

    state.Auto_Kite = M(false, 'Auto_Kite')
    Haste = 0
    DW_needed = 0
    DW = false
    moving = false
    update_combat_form()
end

-- Called when this job file is unloaded (eg: job change)
function user_unload()
    send_command('unbind ^`')
    send_command('unbind @`')
    send_command('unbind !`')
    send_command('unbind ^-')
    send_command('unbind ^=')
    send_command('unbind !-')
    send_command('unbind !=')
    send_command('unbind ^;')
    send_command('unbind ![')
    send_command('unbind !;')
    send_command('unbind !q')
    send_command('unbind !w')
    send_command('unbind !e')
    send_command('unbind !r')
    send_command('unbind !y')
    send_command('unbind !o')
    send_command('unbind !p')
    send_command('unbind @s')
    send_command('unbind @d')
    send_command('unbind @t')

    send_command('unbind ~numpad7')
    send_command('unbind ~numpad8')
    send_command('unbind ~numpad9')
    send_command('unbind ~numpad4')
    send_command('unbind ~numpad5')
    send_command('unbind ~numpad6')
    send_command('unbind ~numpad1')
    send_command('unbind ~numpad2')
    send_command('unbind ~numpad3')
    send_command('unbind ~numpad0')

    send_command('unbind @w')
    send_command('unbind @c')
    send_command('unbind @e')
    send_command('unbind @r')
    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 ^numpad7')
    send_command('unbind ^numpad9')
    send_command('unbind ^numpad4')
    send_command('unbind ^numpad1')
    send_command('unbind ^numpad2')

    send_command('unbind #`')
    send_command('unbind #1')
    send_command('unbind #2')
    send_command('unbind #3')
    send_command('unbind #4')
    send_command('unbind #5')
    send_command('unbind #6')
    send_command('unbind #7')
    send_command('unbind #8')
    send_command('unbind #9')
    send_command('unbind #0')
end

-- Define sets and vars used by this job file.
function init_gear_sets()

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Precast Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    -- Precast sets to enhance JAs
    sets.precast.JA['Chainspell'] = {body="Viti. Tabard +3"}

    -- Fast cast sets for spells
    sets.precast.FC = {
    range=empty,
	ammo="Staunch Tathlum",
	head="Atrophy Chapeau +3", --16
    body={ name="Viti. Tabard +3", augments={'Enhances "Chainspell" effect',}}, --15
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Loricate Torque +1",
    --neck={ name="Dls. Torque +2", augments={'Path: A',}},
    waist="Flume Belt",
    left_ear="Etiolation Earring", --1
    right_ear="Genmei Earring",
    left_ring="Defending Ring",
    right_ring="Gelatinous Ring +1",
    back="Fi Follet Cape +1", --10
        }

    sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})

    sets.precast.FC.Cure = set_combine(sets.precast.FC, {
        })

    sets.precast.FC.Curaga = sets.precast.FC.Cure
    sets.precast.FC['Healing Magic'] = sets.precast.FC.Cure
    sets.precast.FC['Elemental Magic'] = set_combine(sets.precast.FC, {})

    sets.precast.FC.Impact = set_combine(sets.precast.FC, {
    ammo="Sapience Orb",
	head=empty,
    body="Twilight Cloak",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Baetyl Pendant",
    waist="Embla Sash",
    left_ear="Loquac. Earring",
    right_ear="Malignance Earring",
    left_ring="Weather. Ring",
    right_ring="Kishar Ring",
    back="Fi Follet Cape +1",
        })

    sets.precast.FC.Dispelga = set_combine(sets.precast.FC, {main="Daybreak"})
    sets.precast.Storm = set_combine(sets.precast.FC, {})
    sets.precast.FC.Utsusemi = sets.precast.FC.Cure


    ------------------------------------------------------------------------------------------------
    ------------------------------------- Weapon Skill Sets ----------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.precast.WS = {
    ammo="Aurgelmir Orb",
    head={ name="Viti. Chapeau +3", augments={'Enfeebling Magic duration','Magic Accuracy',}},
    body={ name="Viti. Tabard +3", augments={'Enhances "Chainspell" effect',}},
    hands="Atrophy Gloves +3",
    legs="Jhakri Slops +2",
    feet="Jhakri Pigaches +2",
    neck={ name="Dls. Torque +2", augments={'Path: A',}},
    waist={ name="Sailfi Belt +1", augments={'Path: A',}},
    left_ear="Regal Earring",
    right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
    left_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
    right_ring="Epaminondas's Ring",
    back={ name="Sucellos's Cape", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
        }

    sets.precast.WS.Acc = set_combine(sets.precast.WS, {
        })

    sets.precast.WS['Chant du Cygne'] = set_combine(sets.precast.WS, {
    ammo="Yetshila",
    head={ name="Blistering Sallet +1", augments={'Path: A',}},
    body="Ayanmo Corazza +2",
    hands="Malignance Gloves",
    legs={ name="Zoar Subligar +1", augments={'Path: A',}},
    feet="Thereoid Greaves",
    neck="Fotia Gorget",
    waist="Fotia Belt",
    left_ear="Mache Earring +1",
    right_ear="Sherida Earring",
    left_ring="Begrudging Ring",
    right_ring="Ilabrat Ring",
    back={ name="Sucellos's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Crit.hit rate+10',}},
        })

    sets.precast.WS['Chant du Cygne'].Acc = set_combine(sets.precast.WS['Chant du Cygne'], {
        })


    sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
        })

    sets.precast.WS['Savage Blade'].Acc = set_combine(sets.precast.WS['Savage Blade'], {
        })

    sets.precast.WS['Death Blossom'] = sets.precast.WS['Savage Blade']
    sets.precast.WS['Death Blossom'].Acc = sets.precast.WS['Savage Blade'].Acc

    sets.precast.WS['Requiescat'] = set_combine(sets.precast.WS, {
    ammo="Regal Gem",
    head={ name="Viti. Chapeau +3", augments={'Enfeebling Magic duration','Magic Accuracy',}},
    body={ name="Viti. Tabard +3", augments={'Enhances "Chainspell" effect',}},
    hands="Atrophy Gloves +3",
    legs="Jhakri Slops +2",
    feet="Jhakri Pigaches +2",
    neck="Fotia Gorget",
    waist="Fotia Belt",
    left_ear="Regal Earring",
    right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
    left_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
    right_ring="Rufescent Ring",
    back={ name="Sucellos's Cape", augments={'MND+20','Accuracy+20 Attack+20','MND+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Requiescat'].Acc = set_combine(sets.precast.WS['Requiescat'], {
        })

    sets.precast.WS['Sanguine Blade'] = {
    ammo		=	"Pemphredo Tathlum",
    head="Pixie Hairpin +1",
    body={ name="Amalric Doublet +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    hands="Jhakri Cuffs +2",
    legs={ name="Amalric Slops +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    feet={ name="Amalric Nails +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    neck="Baetyl Pendant",
    waist="Orpheus's Sash",
    left_ear="Regal Earring",
    right_ear="Malignance Earring",
    left_ring="Archon Ring",
    right_ring="Epaminondas's Ring",
    back={ name="Sucellos's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','Weapon skill damage +10%',}},
        }

    sets.precast.WS['Seraph Blade'] = set_combine(sets.precast.WS['Sanguine Blade'], {
    ammo		=	"Regal Gem",
    head="C. Palug Crown",
    body={ name="Amalric Doublet +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    hands="Jhakri Cuffs +2",
    legs={ name="Amalric Slops +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    feet={ name="Amalric Nails +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    neck="Baetyl Pendant",
    waist="Orpheus's Sash",
    left_ear="Regal Earring",
    right_ear="Malignance Earring",
    left_ring="Weather. Ring",
    right_ring="Freke Ring",
    back={ name="Sucellos's Cape", augments={'MND+20','Mag. Acc+20 /Mag. Dmg.+20','MND+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS['Seraph Dlade'], {
    ammo		=	"Pemphredo Tathlum",
    head="C. Palug Crown",
    body={ name="Amalric Doublet +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    hands="Jhakri Cuffs +2",
    legs={ name="Amalric Slops +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    feet={ name="Amalric Nails +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    neck="Baetyl Pendant",
    waist="Orpheus's Sash",
    left_ear="Regal Earring",
    right_ear="Malignance Earring",
    left_ring="Freke Ring",
    right_ring="Epaminondas's Ring",
    back={ name="Sucellos's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Black Halo'] = set_combine(sets.precast.WS, {
	    back={ name="Sucellos's Cape", augments={'MND+20','Accuracy+20 Attack+20','MND+10','Weapon skill damage +10%',}},
        })

    sets.precast.WS['Black Halo'].Acc = set_combine(sets.precast.WS['Black Halo'], {
        })


    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Midcast Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.midcast.FastRecast = sets.precast.FC

    sets.midcast.SpellInterrupt = {
        }

    sets.midcast.Utsusemi = sets.midcast.SpellInterrupt

    sets.midcast.Cure = {
    ammo="Regal Gem",
    head={ name="Vanya Hood", augments={'MP+50','"Cure" potency +7%','Enmity-6',}},
    body={ name="Kaykaus Bliaut", augments={'MP+60','"Cure" potency +5%','"Conserve MP"+6',}},
    hands={ name="Kaykaus Cuffs +1", augments={'MP+80','MND+12','Mag. Acc.+20',}},
    legs="Atrophy Tights +3",
    feet={ name="Vanya Clogs", augments={'"Cure" potency +5%','"Cure" spellcasting time -15%','"Conserve MP"+6',}},
    neck="Incanter's Torque",
    waist="Luminary Sash",
    left_ear="Mendi. Earring",
    right_ear="Meili Earring",
    left_ring="Haoma's Ring",
    right_ring="Sirona's Ring",
    back={ name="Sucellos's Cape", augments={'MND+20','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Cure" potency +10%',}},
        }

    sets.midcast.CureWeather = set_combine(sets.midcast.Cure, {
        waist="Hachirin-no-Obi",
        })

    sets.midcast.CureSelf = set_combine(sets.midcast.Cure, {
        waist="Gishdubar Sash", -- (10)
        })

    sets.midcast.Curaga = set_combine(sets.midcast.Cure, {
        ammo="Regal Gem",
        ring1={name="Stikini Ring +1", bag="wardrobe2"},
        ring2={name="Stikini Ring +1", bag="wardrobe3"},
        waist="Luminary Sash",
        })

    sets.midcast.StatusRemoval = {
        head="Vanya Hood",
        body="Vanya Robe",
        legs="Atrophy Tights +3",
        feet="Vanya Clogs",
        neck="Incanter's Torque",
        ear2="Meili Earring",
        ring1="Haoma's Ring",
        ring2="Menelaus's Ring",
        back="Perimede Cape",
        waist="Bishop's Sash",
        }

    sets.midcast.Cursna = set_combine(sets.midcast.StatusRemoval, {
        hands="Hieros Mittens",
        body="Viti. Tabard +3",
        neck="Debilis Medallion",
        ear1="Beatific Earring",
        ring2="Menelaus's Ring",
        back="Oretan. Cape +1",
        })

    sets.midcast['Enhancing Magic'] = {
        --main		=	"Pukulatmuj +1",
        --sub			=	"Forfend +1",
		ammo="Staunch Tathlum",
		head="Befouled Crown",
		body={ name="Viti. Tabard +3", augments={'Enhances "Chainspell" effect',}},
		hands={ name="Viti. Gloves +3", augments={'Enhancing Magic duration',}},
		legs="Atrophy Tights +3",
		feet="Leth. Houseaux +1",
		neck="Incanter's Torque",
		waist="Olympus Sash",
		left_ear="Andoaa Earring",
		right_ear="Mimir Earring",
        left_ring	=	{name="Stikini Ring +1", bag="wardrobe2"},
        right_ring	=	{name="Stikini Ring +1", bag="wardrobe3"},
		back={ name="Ghostfyre Cape", augments={'Enfb.mag. skill +3','Enha.mag. skill +9','Enh. Mag. eff. dur. +20',}},
        }

    sets.midcast.EnhancingDuration = {
        sub		=	"Ammurapi Shield",
		ammo="Staunch Tathlum",
		head="Leth. Chappel +1",
		body={ name="Viti. Tabard +3", augments={'Enhances "Chainspell" effect',}},
		hands="Atrophy Gloves +3",
		legs="Leth. Fuseau +1",
		feet="Leth. Houseaux +1",
		neck={ name="Dls. Torque +2", augments={'Path: A',}},
        waist		=	"Embla Sash",
        left_ear	=	"Andoaa Earring",
        right_ear	=	"Mimir Earring",
        left_ring	=	{name="Stikini Ring +1", bag="wardrobe2"},
        right_ring	=	{name="Stikini Ring +1", bag="wardrobe3"},
		back={ name="Ghostfyre Cape", augments={'Enfb.mag. skill +3','Enha.mag. skill +9','Enh. Mag. eff. dur. +20',}},
        }
    sets.buff.ComposureOther = set_combine(sets.midcast.EnhancingDuration,  {
		head="Leth. Chappel +1",
		body="Lethargy Sayon +1",
		legs="Leth. Fuseau +1",
		feet="Leth. Houseaux +1",
        })
    sets.midcast.EnhancingSkill = set_combine(sets.midcast['Enhancing Magic'], {
        main="Pukulatmuj +1",
        sub			=	"Forfend +1",
        hands="Viti. Gloves +3",
        })

    sets.midcast.Regen = set_combine(sets.midcast.EnhancingDuration, {
        --main="Bolelabunga",
        --sub="Ammurapi Shield",
        --head=gear.Telchine_ENH_head,
        --body=gear.Telchine_ENH_body,
        --hands=gear.Telchine_ENH_hands,
        --legs=gear.Telchine_ENH_legs,
        --feet=gear.Telchine_ENH_feet,
        })

    sets.midcast.Refresh = set_combine(sets.midcast.EnhancingDuration, {
        --head="Amalric Coif +1", -- +1
        body="Atrophy Tabard +3", -- +3
        legs="Leth. Fuseau +1", -- +2
        })

    sets.midcast.RefreshSelf = set_combine(sets.midcast.EnhancingDuration, {
        body="Atrophy Tabard +3", -- +3
        legs="Leth. Fuseau +1", -- +2
		waist="Gishdubar Sash",
        back="Grapevine Cape"
        })

    sets.midcast.Stoneskin = set_combine(sets.midcast.EnhancingSkill, {
		hands="Stone Mufflers",
		legs="Shedir Seraweels",
		neck="Nodens Gorget",
		waist="Siegel Sash",
		left_ear="Earthcry Earring",
        })

    sets.midcast['Phalanx'] =  set_combine(sets.midcast.EnhancingSkill, {
	main="Sakpata's Sword",
    head={ name="Taeon Chapeau", augments={'Crit.hit rate+3','Phalanx +3',}},
    body={ name="Taeon Tabard", augments={'"Fast Cast"+4','Phalanx +3',}},
    hands={ name="Taeon Gloves", augments={'Rng.Acc.+20','Crit.hit rate+1','Phalanx +3',}},
    legs={ name="Taeon Tights", augments={'Crit.hit rate+2','Phalanx +3',}},
    feet={ name="Taeon Boots", augments={'Accuracy+24','"Dual Wield"+5','Phalanx +3',}},
        })
    sets.midcast['Phalanx II'] =  sets.midcast.EnhancingSkill

    sets.midcast.Aquaveil =  set_combine(sets.midcast.EnhancingSkill, {
		legs="Shedir Seraweels",
        })

    sets.midcast.Storm = sets.midcast.EnhancingDuration
    sets.midcast.GainSpell = sets.midcast.EnhancingSkill
    sets.midcast.SpikesSpell = set_combine(sets.midcast.EnhancingDuration, {
	legs="Viti. Tights +3",
	})

    sets.midcast.Protect = set_combine(sets.midcast.EnhancingDuration, {ring2="Sheltered Ring"})
    sets.midcast.Protectra = sets.midcast.Protect
    sets.midcast.Shell = sets.midcast.Protect
    sets.midcast.Shellra = sets.midcast.Shell


     -- Custom spell classes

    sets.midcast.MndEnfeebles = {
	ammo="Regal Gem",
    head={ name="Viti. Chapeau +3", augments={'Enfeebling Magic duration','Magic Accuracy',}},
    body="Atrophy Tabard +3",
    hands={ name="Kaykaus Cuffs +1", augments={'MP+80','MND+12','Mag. Acc.+20',}},
    legs={ name="Chironic Hose", augments={'Mag. Acc.+21 "Mag.Atk.Bns."+21','Enmity-4','Mag. Acc.+15','"Mag.Atk.Bns."+10',}},
    feet={ name="Vitiation Boots +3", augments={'Immunobreak Chance',}},
    neck={ name="Dls. Torque +2", augments={'Path: A',}},
    waist="Luminary Sash",
    left_ear="Regal Earring",
    right_ear="Snotra Earring",
    left_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
    right_ring={name="Stikini Ring +1", bag="wardrobe3"},	
    back={ name="Sucellos's Cape", augments={'MND+20','Mag. Acc+20 /Mag. Dmg.+20','Mag. Acc.+10','"Cure" potency +10%',}},
        }

    sets.midcast.MndEnfeeblesAcc = set_combine(sets.midcast.MndEnfeebles, {
        --main="Crocea Mors",
        --sub="Ammurapi Shield",
        range="Ullr",
        ammo=empty,
        head="Atrophy Chapeau +3",
        waist="Acuity Belt +1",
		back="Aurist's Cape +1",
        })

    sets.midcast.MndEnfeeblesEffect = set_combine(sets.midcast.MndEnfeebles, {
        body="Lethargy Sayon +1",
        })

    sets.midcast.IntEnfeebles = sets.midcast.MndEnfeebles
        

    sets.midcast.IntEnfeeblesAcc = set_combine(sets.midcast.MndEnfeeblesAcc, {
        })

    sets.midcast.IntEnfeeblesEffect = set_combine(sets.midcast.MndEnfeeblesEffect, {
        })

    sets.midcast.SkillEnfeebles = set_combine(sets.midcast.MndEnfeebles, {
		hands="Leth. Gantherots +1",
		legs={ name="Psycloth Lappas", augments={'Mag. Acc.+10','Spell interruption rate down +15%','MND+7',}},
		waist="Rumination Sash",
		right_ear="Vor Earring",
		left_ring	=	{name="Stikini Ring +1", bag="wardrobe2"},
        })

    sets.midcast.Sleep = set_combine(sets.midcast.IntEnfeebles, {
        ring1="Kishar Ring",
        })

    sets.midcast.SleepMaxDuration = set_combine(sets.midcast.Sleep, {
        head="Leth. Chappel +1",
        body="Lethargy Sayon +1",
		hands="Leth. Gantherots +1",
        --hands="Regal Cuffs",
        legs="Leth. Fuseau +1",
        feet="Leth. Houseaux +1",
        })

    sets.midcast.ElementalEnfeeble = sets.midcast.IntEnfeebles
    sets.midcast.Dispelga = set_combine(sets.midcast.IntEnfeebles, {main="Daybreak"})

    sets.midcast['Dark Magic'] = set_combine(sets.midcast.IntEnfeebles, {

        })

    sets.midcast.Drain = set_combine(sets.midcast['Dark Magic'], {
        head="Pixie Hairpin +1",
        --feet="Merlinic Crackows",
        --ear1="Hirudinea Earring",
        ring1="Archon Ring",
        ring2="Evanescence Ring",
        --back="Perimede Cape",
        waist="Fucho-no-obi",
        })

    sets.midcast.Aspir = sets.midcast.Drain
    sets.midcast.Stun = set_combine(sets.midcast['Dark Magic'], {waist="Luminary Sash"})
    sets.midcast['Bio III'] = set_combine(sets.midcast['Dark Magic'], {legs="Viti. Tights +3"})

    sets.midcast['Elemental Magic'] = {
    ammo		=	"Pemphredo Tathlum",
    head="C. Palug Crown",
    body={ name="Amalric Doublet +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    hands="Amalric Gages +1",
    legs={ name="Amalric Slops +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    feet={ name="Amalric Nails +1", augments={'MP+80','Mag. Acc.+20','"Mag.Atk.Bns."+20',}},
    neck="Baetyl Pendant",
    waist="Sacro Cord",
    left_ear="Regal Earring",
    right_ear="Malignance Earring",
    left_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
    right_ring="Freke Ring",
    back={ name="Sucellos's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','"Mag.Atk.Bns."+10',}},
        }

    sets.midcast['Elemental Magic'].Resistant = set_combine(sets.midcast['Elemental Magic'], {
        range="Ullr",
        ammo=empty,
		neck="Sanctity Necklace",
		feet={ name="Vitiation Boots +3", augments={'Immunobreak Chance',}},
        })

    sets.midcast.Impact = set_combine(sets.midcast['Elemental Magic'], {
	head="empty",
    body="Twilight Cloak",
    hands={ name="Kaykaus Cuffs +1", augments={'MP+80','MND+12','Mag. Acc.+20',}},
    legs={ name="Chironic Hose", augments={'Mag. Acc.+21 "Mag.Atk.Bns."+21','Enmity-4','Mag. Acc.+15','"Mag.Atk.Bns."+10',}},
    feet={ name="Vitiation Boots +3", augments={'Immunobreak Chance',}},
    neck={ name="Dls. Torque +2", augments={'Path: A',}},
    waist="Acuity Belt +1",
    right_ear="Snotra Earring",
    left_ear="Malignance Earring",
    left_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
    right_ring="Stikini Ring +1",
    back="Aurist's Cape +1",
        })

    sets.midcast.Utsusemi = sets.midcast.SpellInterrupt

    -- Initializes trusts at iLvl 119
    sets.midcast.Trust = sets.precast.FC

    -- Job-specific buff sets

    sets.buff.Saboteur = {hands="Leth. Gantherots +1"}


    ------------------------------------------------------------------------------------------------
    ----------------------------------------- Idle Sets --------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.idle = {
    ammo="Homiliary",
    head={ name="Viti. Chapeau +3", augments={'Enfeebling Magic duration','Magic Accuracy',}},
    body="Bunzi's Robe",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Loricate Torque +1",
    --neck={ name="Dls. Torque +2", augments={'Path: A',}},
    waist="Flume Belt",
    left_ear="Etiolation Earring",
    right_ear="Genmei Earring",
    left_ring={name="Stikini Ring +1", bag="wardrobe2"},
    right_ring={name="Stikini Ring +1", bag="wardrobe3"},
    back={ name="Sucellos's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        }

    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Defense Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    sets.defense.PDT = sets.idle.DT
    sets.defense.MDT = sets.idle.DT

    sets.magic_burst = {
    head="Ea Hat",
    body="Ea Houppelande",
    hands="Amalric Gages +1", --(6)
    legs="Ea Slops",
    feet="Jhakri Pigaches +2",
    neck="Mizu. Kubikazari",
    left_ring="Mujin Band",
        }

    sets.Kiting = {legs="Carmine Cuisses +1"}
    sets.latent_refresh = {waist="Fucho-no-obi"}


    ------------------------------------------------------------------------------------------------
    ---------------------------------------- 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 = {
    ammo="Aurgelmir Orb",
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Anu Torque",
    waist="Kentarch Belt +1",
    left_ear="Telos Earring",
    right_ear="Sherida Earring",
    left_ring={name="Chirich Ring +1", bag="wardrobe2"},
    right_ring={name="Chirich Ring +1", bag="wardrobe3"},
    back={ name="Sucellos'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, {
        neck="Combatant's Torque",
        })

    sets.engaged.Haste = set_combine(sets.engaged.Acc, {
        })


    -- No Magic Haste (74% DW to cap)
    sets.engaged.DW = {
    ammo="Aurgelmir Orb",
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Anu Torque",
    waist="Reiki Yotai", --7
    left_ear="Telos Earring",
    right_ear="Eabani Earring", --4
    left_ring={name="Chirich Ring +1", bag="wardrobe2"},
    right_ring={name="Chirich Ring +1", bag="wardrobe3"},
    back={ name="Sucellos's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
        } --41

    sets.engaged.DW.Acc = set_combine(sets.engaged.DW, {
        neck="Combatant's Torque",
        })

    sets.engaged.DW.Haste = set_combine(sets.engaged.DW.Acc, {
    right_ear="Suppanomimi", --5
    feet={ name="Taeon Boots", augments={'Accuracy+24','"Dual Wield"+5','Phalanx +3',}}, --9
    back={ name="Sucellos's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dual Wield"+10','Phys. dmg. taken-10%',}},
        })



    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Hybrid Sets -------------------------------------------
    ------------------------------------------------------------------------------------------------




    ------------------------------------------------------------------------------------------------
    ---------------------------------------- Special Sets ------------------------------------------
    ------------------------------------------------------------------------------------------------

    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.macc = {main="Crocea Mors", sub="Ammurapi Shield"}
	sets.sb = {main="Naegling", sub="Machaera +2"}
    sets.mws = {main="Crocea Mors", sub="Daybreak"}
	sets.ae = {main="Tauret", sub="Machaera +2"}
	sets.cdc = {main="Crocea Mors", sub="Demers. Degen +1"}
	sets.blunt = {main="Maxentius", sub="Machaera +2"}
	sets.nuke = {main="Bunzi's Rod", sub="Daybreak"}
	
end

-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------

function job_precast(spell, action, spellMap, eventArgs)
    if spellMap == 'Utsusemi' then
        if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
            cancel_spell()
            add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
            eventArgs.handled = true
            return
        elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
            send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
        end
    end
end

function job_post_precast(spell, action, spellMap, eventArgs)
    if spell.name == 'Impact' then
        equip(sets.precast.FC.Impact)
    end
    if spell.english == "Phalanx II" and spell.target.type == 'SELF' then
        cancel_spell()
        send_command('@input /ma "Phalanx" <me>')
    end
end

-- Run after the default midcast() is done.
-- eventArgs is the same one used in job_midcast, in case information needs to be persisted.
function job_post_midcast(spell, action, spellMap, eventArgs)
    if spell.skill == 'Enhancing Magic' then
        --if classes.NoSkillSpells:contains(spell.english) then
		if not skill_spells:contains(spell.english) then
            equip(sets.midcast.EnhancingDuration)
            if spellMap == 'Refresh' then
                equip(sets.midcast.Refresh)
                if spell.target.type == 'SELF' then
                    equip (sets.midcast.RefreshSelf)
				end
            end
		end
        if skill_spells:contains(spell.english) then
            equip(sets.midcast.EnhancingSkill)
		end
        if spell.english:startswith('Gain') then
            equip(sets.midcast.GainSpell)
		end
        if spell.english == 'Phalanx' then
            equip(sets.midcast['Phalanx'])
		end
        if spell.english == 'Phalanx II' then
            equip(sets.midcast['Phalanx II'])
		end
        if spell.english == 'Aquaveil' then
            equip(sets.midcast.Aquaveil)
		end
        if spell.english == 'Stoneskin' then
            equip(sets.midcast.Stoneskin)
		end
        if spell.english:contains('Spikes') then
            equip(sets.midcast.SpikesSpell)
		end 
        if (spell.target.type == 'PLAYER' or spell.target.type == 'NPC') and buffactive.Composure and spell.english ~= 'Phalanx II' then
            equip(sets.buff.ComposureOther)
		end
    end
    if spellMap == 'Cure' and spell.target.type == 'SELF' then
        equip(sets.midcast.CureSelf)
    end
    if spell.skill == 'Elemental Magic' then
        if state.MagicBurst.value and spell.english ~= 'Death' then
            equip(sets.magic_burst)
            if spell.english == "Impact" then
                equip(sets.midcast.Impact)
            end
        end
        if spell.skill == 'Elemental Magic' or spell.english == "Kaustra" then
            if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
                equip(sets.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(sets.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(sets.Obi)
            end
        end
    end
end

function job_aftercast(spell, action, spellMap, eventArgs)
    if spell.english:contains('Sleep') and not spell.interrupted then
        set_sleep_timer(spell)
    end
    if state.WeaponLock.value == false then
        check_weaponset()
    end
end

-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------

function job_buff_change(buff,gain)
    if buff == "doom" then
        if gain then
            equip(sets.buff.Doom)
            send_command('@input /p Doomed.')
             disable('ring1','ring2','waist')
        else
            enable('ring1','ring2','waist')
            handle_equipping_gear(player.status)
        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','range')
    else
        enable('main','sub','range')
    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()
    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
--function update_combat_form()
    --if DW == true then
     --   state.CombatForm:set('DW')
		--equip(sets.engaged.DW)
    --elseif DW == false then
        --state.CombatForm:reset()
    --end
end


-- Custom spell mapping.
function job_get_spell_map(spell, default_spell_map)
    if spell.action_type == 'Magic' then
        if default_spell_map == 'Cure' or default_spell_map == 'Curaga' then
            if (world.weather_element == 'Light' or world.day_element == 'Light') then
                return 'CureWeather'
            end
        end
        if spell.skill == 'Enfeebling Magic' then
            if enfeebling_magic_skill:contains(spell.english) then
                return "SkillEnfeebles"
            elseif spell.type == "WhiteMagic" then
                if enfeebling_magic_acc:contains(spell.english) and not buffactive.Stymie then
                    return "MndEnfeeblesAcc"
                elseif enfeebling_magic_effect:contains(spell.english) then
                    return "MndEnfeeblesEffect"
                else
                    return "MndEnfeebles"
              end
            elseif spell.type == "BlackMagic" then
                if enfeebling_magic_acc:contains(spell.english) and not buffactive.Stymie then
                    return "IntEnfeeblesAcc"
                elseif enfeebling_magic_effect:contains(spell.english) then
                    return "IntEnfeeblesEffect"
                elseif enfeebling_magic_sleep:contains(spell.english) and ((buffactive.Stymie and buffactive.Composure) or state.SleepMode.value == 'MaxDuration') then
                    return "SleepMaxDuration"
                elseif enfeebling_magic_sleep:contains(spell.english) then
                    return "Sleep"
                else
                    return "IntEnfeebles"
                end
            else
                return "MndEnfeebles"
            end
        end
    end
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 player.mpp < 51 then
        idleSet = set_combine(idleSet, sets.latent_refresh)
    end
    -- if state.CP.current == 'on' then
    --     equip(sets.CP)
    --     disable('back')
    -- else
    --     enable('back')
    -- end

    if state.Auto_Kite.value == true then
       idleSet = set_combine(idleSet, sets.Kiting)
    end

    return idleSet
end


-- Modify the default melee set after it was constructed.
function customize_melee_set(meleeSet)

    return meleeSet
end

-- Set eventArgs.handled to true if we don't want the automatic display to be run.
function display_current_job_state(eventArgs)
    display_current_caster_state()
    eventArgs.handled = true
end

-- Function to display the current relevant user state when doing an update.
-- Return true if display was handled, and you don't want the default info shown.
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.MagicBurst.value then
        msg = ' Burst: On |'
    end
    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.
-------------------------------------------------------------------------------------------------------------------


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 job_self_command(cmdParams, eventArgs)
    if cmdParams[1]:lower() == 'scholar' then
        handle_strategems(cmdParams)
        eventArgs.handled = true
    elseif cmdParams[1]:lower() == 'nuke' then
        handle_nuking(cmdParams)
        eventArgs.handled = true
    elseif cmdParams[1]:lower() == 'enspell' then
        send_command('@input /ma '..state.EnSpell.value..' <me>')
    elseif cmdParams[1]:lower() == 'barelement' then
        send_command('@input /ma '..state.BarElement.value..' <me>')
    elseif cmdParams[1]:lower() == 'barstatus' then
        send_command('@input /ma '..state.BarStatus.value..' <me>')
    elseif cmdParams[1]:lower() == 'gainspell' then
        send_command('@input /ma '..state.GainSpell.value..' <me>')
    end

    gearinfo(cmdParams, eventArgs)
end

-- General handling of strategems in an Arts-agnostic way.
-- Format: gs c scholar <strategem>

function handle_strategems(cmdParams)
    -- cmdParams[1] == 'scholar'
    -- cmdParams[2] == strategem to use

    if not cmdParams[2] then
        add_to_chat(123,'Error: No strategem command given.')
        return
    end
    local strategem = cmdParams[2]:lower()

    if strategem == 'light' then
        if buffactive['light arts'] then
            send_command('input /ja "Addendum: White" <me>')
        elseif buffactive['addendum: white'] then
            add_to_chat(122,'Error: Addendum: White is already active.')
        else
            send_command('input /ja "Light Arts" <me>')
        end
    elseif strategem == 'dark' then
        if buffactive['dark arts'] then
            send_command('input /ja "Addendum: Black" <me>')
        elseif buffactive['addendum: black'] then
            add_to_chat(122,'Error: Addendum: Black is already active.')
        else
            send_command('input /ja "Dark Arts" <me>')
        end
    elseif buffactive['light arts'] or buffactive['addendum: white'] then
        if strategem == 'cost' then
            send_command('input /ja Penury <me>')
        elseif strategem == 'speed' then
            send_command('input /ja Celerity <me>')
        elseif strategem == 'aoe' then
            send_command('input /ja Accession <me>')
        elseif strategem == 'addendum' then
            send_command('input /ja "Addendum: White" <me>')
        else
            add_to_chat(123,'Error: Unknown strategem ['..strategem..']')
        end
    elseif buffactive['dark arts']  or buffactive['addendum: black'] then
        if strategem == 'cost' then
            send_command('input /ja Parsimony <me>')
        elseif strategem == 'speed' then
            send_command('input /ja Alacrity <me>')
        elseif strategem == 'aoe' then
            send_command('input /ja Manifestation <me>')
        elseif strategem == 'addendum' then
            send_command('input /ja "Addendum: Black" <me>')
        else
            add_to_chat(123,'Error: Unknown strategem ['..strategem..']')
        end
    else
        add_to_chat(123,'No arts has been activated yet.')
    end
end

function set_sleep_timer(spell)
    local self = windower.ffxi.get_player()

    if spell.en == "Sleep II" then
        base = 90
    elseif spell.en == "Sleep" or spell.en == "Sleepga" then
        base = 60
    end

    if state.Buff.Saboteur then
        if state.NM.value then
            base = base * 1.25
        else
            base = base * 2
        end
    end

    -- Merit Points Duration Bonus
    base = base + self.merits.enfeebling_magic_duration*6

    -- Relic Head Duration Bonus
    if not ((buffactive.Stymie and buffactive.Composure) or state.SleepMode.value == 'MaxDuration') then
        base = base + self.merits.enfeebling_magic_duration*3
    end

    -- Job Points Duration Bonus
    base = base + self.job_points.rdm.enfeebling_magic_duration

    --Enfeebling duration non-augmented gear total
    gear_mult = 1.40
    --Enfeebling duration augmented gear total
    aug_mult = 1.25
    --Estoquer/Lethargy Composure set bonus
    --2pc = 1.1 / 3pc = 1.2 / 4pc = 1.35 / 5pc = 1.5
    empy_mult = 1 --from sets.midcast.Sleep

    if ((buffactive.Stymie and buffactive.Composure) or state.SleepMode.value == 'MaxDuration') then
        if buffactive.Stymie then
            base = base + self.job_points.rdm.stymie_effect
        end
        empy_mult = 1.35 --from sets.midcast.SleepMaxDuration
    end

    totalDuration = math.floor(base * gear_mult * aug_mult * empy_mult)

    -- Create the custom timer
    if spell.english == "Sleep II" then
        send_command('@timers c "Sleep II ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00259.png')
    elseif spell.english == "Sleep" or spell.english == "Sleepga" then
        send_command('@timers c "Sleep ['..spell.target.name..']" ' ..totalDuration.. ' down spells/00253.png')
    end
    add_to_chat(1, 'Base: ' ..base.. ' Merits: ' ..self.merits.enfeebling_magic_duration.. ' Job Points: ' ..self.job_points.rdm.stymie_effect.. ' Set Bonus: ' ..empy_mult)

end
 Asura.Yottaxa
Offline
Server: Asura
Game: FFXI
user: Yottaxa
Posts: 134
By Asura.Yottaxa 2022-06-11 18:24:22
Link | Quote | Reply
 
I have a dumb question, I think its been answered probably before:
I am not as familiar with modes as the rest of gearswap. I recently moved over to one that uses them for RDM. It has the weapons defined in a set such as:
mainWeapon = M('Vitiation Sword','etc.','etc.','etc.')

The gearswap just usses the toggle command to cycle through them, but I would like to possible have few in game macro button that will directly set them - can you force set the mainWeapon or subWeapon states with a console command? something involving mainWeapon:set(name)?

Thanks for any info.
 Asura.Neviskio
Offline
Server: Asura
Game: FFXI
user: Neviskio
Posts: 115
By Asura.Neviskio 2022-06-11 19:11:46
Link | Quote | Reply
 
Heya been wondering, I remember many years ago some luas had a function to stop you from WSing if the mob moves at the last second, think maybe, and sorry if I'm wrong, that arislan luas used to have that?

Is it a thing anymore? Thanks
 Asura.Buffyslyph
Offline
Server: Asura
Game: FFXI
Posts: 108
By Asura.Buffyslyph 2022-06-11 19:34:35
Link | Quote | Reply
 
Asura.Yottaxa said: »
I have a dumb question, I think its been answered probably before:
I am not as familiar with modes as the rest of gearswap. I recently moved over to one that uses them for RDM. It has the weapons defined in a set such as:
mainWeapon = M('Vitiation Sword','etc.','etc.','etc.')

The gearswap just usses the toggle command to cycle through them, but I would like to possible have few in game macro button that will directly set them - can you force set the mainWeapon or subWeapon states with a console command? something involving mainWeapon:set(name)?

Thanks for any info.
Code
gs c set WeaponMode Naegling
gs c set OffHandWeaponMode Gleti
gs c set RangedWeaponMode Anarchy


or whatever the name is of the mode you want to set.
Offline
Posts: 174
By ryukin182 2022-06-21 23:20:13
Link | Quote | Reply
 
I no longer can find the link to Selindriles discord so I guess this is my best shot. Been using his gearswap for a long time with no issues, but I only recently made Thibron. It is not recognizing the weapon, and refuses to go into tp or ws sets, as the check for sub is "empty". Now it's saying to check line 2269 in the lib/sel-utility which states

function is_dual_wielding()
if ((player.equipment.main and not (player.equipment.sub == 'empty' or player.equipment.sub:contains('Grip') or player.equipment.sub:contains('Strap') or res.items[item_name_to_id(player.equipment.sub)].shield_size))) then
return true
else
return false
end
end
I'm unsure of how to proceed, or make Thibron be recognized and not as empty in the offhand.
 Asura.Bippin
Offline
Server: Asura
Game: FFXI
user: Gunit
Posts: 1074
By Asura.Bippin 2022-06-21 23:47:42
Link | Quote | Reply
 
ryukin182 said: »
I no longer can find the link to Selindriles discord
Its in like everyone of the files

https://discord.gg/TxPZt2nt
Offline
Posts: 40
By quelthos 2022-07-05 03:52:18
Link | Quote | Reply
 
Trying to achieve 4 things
1. equip Mache Earring +1 when engaged and when weapon is Godhands
I did some codes in update_combat_form, and defined sets.god to include the earring but wouldn't work
2. switch to normal tp/engaged earring when swapped to a different weapon other than godhands.
3. equip Anch. Gaiters +3 when engaged and footwork buff is up.
Try to define in update_combat_form as well but wouldn't work..
4. switch back to default tp/engaged gear set after footwork duration ends.

Thanks for the help
Code
-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job.  Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------

-- Initialization function for this job file.
function get_sets()
    mote_include_version = 2
    
    -- Load and initialize the include file.
    include('Mote-Include.lua')
end



-- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
function job_setup()
    state.Buff.Footwork = buffactive.Footwork or false
    state.Buff.Impetus = buffactive.Impetus or false

    state.FootworkWS = M(false, 'Footwork on WS')

    info.impetus_hit_count = 0
    windower.raw_register_event('action', on_action_for_impetus)
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','Tank')
    state.WeaponskillMode:options('Normal')
    state.PhysicalDefenseMode:options('PDT','Hybrid')

    state.WeaponSet = M{['description']='Weapon Set', 'Vere', 'GH', 'Pole'}
	send_command('bind @r gs c cycle WeaponSet')
    send_command('bind @e gs c cycleback WeaponSet')

    update_combat_form()
    update_melee_groups()

end

function user_unload()
    send_command('unbind @r')
    send_command('unbind @e')
end


-- Define sets and vars used by this job file.
function init_gear_sets()
	gear.CritBack = { name="Segomo's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Crit.hit rate+10',}}
	gear.DABack = { name="Segomo's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','"Dbl.Atk."+10',}}

	-- Precast Sets
    
    -- Precast sets to enhance JAs on use
    sets.precast.JA['Hundred Fists'] = {legs="Hes. Hose +3"}
    sets.precast.JA['Boost'] = {hands="Anchor. Gloves +3"}
    sets.precast.JA['Dodge'] = {feet="Anchorite's Gaiters +3"}
    sets.precast.JA['Focus'] = {head="Anchorite's Crown +1"}
    sets.precast.JA['Counterstance'] = {feet="Hes. Gaiters +3"}
    sets.precast.JA['Footwork'] = {feet="Shukuyu Sune-ate"}
    sets.precast.JA['Formless Strikes'] = {body="Hes. Cyclas +3"}
    sets.precast.JA['Mantra'] = {feet="Hes. Gaiters +3"}

    sets.precast.JA['Chi Blast'] = {head={ name="Hes. Crown +3", augments={'Enhances "Penance" effect',}}}

    sets.precast.JA['Chakra'] = {
		ammo="Aurgelmir Orb",
        head="Genmei Kabuto",
		neck="Unmoving Collar +1",
		body="Tatena. Harama. +1",		
		hands="Tatena. Gote +1",
		ring1="Niqmaddu Ring",
		ring2="Gelatinous Ring +1",
		back={ name="Segomo's Mantle", augments={'VIT+20','Accuracy+20 Attack+20','VIT+10','Weapon skill damage +10%',}},
		waist="Caudata Belt",
		legs="Tatena. Haidate +1",
		feet="Tatena. Sune. +1"
		}
	
	sets.precast.JA['Provoke'] = {		
	ammo="Per. Lucky Egg",
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet={ name="Herculean Boots", augments={'Mag. Acc.+10','AGI+8','"Treasure Hunter"+2','Accuracy+13 Attack+13','Mag. Acc.+19 "Mag.Atk.Bns."+19',}},
    waist="Chaac Belt",

	}
	
    -- Waltz set (chr and vit)
    sets.precast.Waltz = {
		ammo="Staunch Tathlum +1",
        head="Mummu Bonnet +2",neck="Unmoving Collar +1",
        body="Passion Jacket",hands=gear.WaltzHands,ring1="Valseur's Ring",ring2="Asklepian Ring",
        back="Moonbeam Cape",waist="Chaac Belt",legs=gear.WaltzLegs,feet=gear.WaltzFeet}
        
    -- Don't need any special gear for Healing Waltz.
    sets.precast.Waltz['Healing Waltz'] = {}

    sets.precast.Step = {waist="Chaac Belt"}
    sets.precast.Flourish1 = {waist="Chaac Belt"}


    -- Fast cast sets for spells
    
    sets.precast.FC = {
    ammo="Sapience Orb",
    head={ name="Herculean Helm", augments={'Mag. Acc.+25','"Fast Cast"+5','MND+4','"Mag.Atk.Bns."+15',}},
    body={ name="Taeon Tabard", augments={'"Fast Cast"+4','Phalanx +3',}},
	hands={ name="Leyline Gloves", augments={'Accuracy+2','Mag. Acc.+5','"Mag.Atk.Bns."+4',}},
    legs={ name="Herculean Trousers", augments={'Mag. Acc.+13','"Fast Cast"+4','INT+9','"Mag.Atk.Bns."+4',}},
    feet={ name="Herculean Boots", augments={'AGI+2','"Fast Cast"+6','Mag. Acc.+5 "Mag.Atk.Bns."+5',}},
    neck="Baetyl Pendant",
	waist="Black Belt",
    left_ear="Loquac. Earring",
    right_ear="Etiolation Earring",
    left_ring="Prolix Ring",
    right_ring="Weather. Ring",
    --back="",
		}

    sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {body="Passion Jacket",neck="Magoraga Beads"})

       
    -- Weaponskill sets

    sets.precast.WS    = {
    ammo="Knobkierrie",
    head="Mpaca's Cap",
    body="Tatena. Harama. +1",
    hands={ name="Adhemar Wrist. +1", augments={'STR+12','DEX+12','Attack+20',}},
    legs={ name="Tatena. Haidate +1", augments={'Path: A',}},
    feet="Mpaca's Boots",
    neck={ name="Mnk. Nodowa +2", augments={'Path: A',}},
    waist="Moonbow Belt +1",
    left_ear="Sherida Earring",
    right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
    left_ring="Niqmaddu Ring",
    right_ring="Gere Ring",
    back={ name="Segomo's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','"Dbl.Atk."+10',}},
	}

    sets.precast.WS['Raging Fists']    = set_combine(sets.precast.WS, {
    body="Adhemar Jacket +1",
	})
    sets.precast.WS['Howling Fist']    = set_combine(sets.precast.WS, {
	})
	
    sets.precast.WS["Victory Smite"]	= set_combine(sets.precast.WS, {
    head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
    body="Mpaca's Doublet",
    hands={ name="Ryuo Tekko +1", augments={'STR+12','DEX+12','Accuracy+20',}},
    legs="Mpaca's Hose",
    right_ear="Odr Earring",
    left_ring="Niqmaddu Ring",
    right_ring="Gere Ring",
    back=gear.CritBack,
	})
	
    sets.precast.WS['Shijin Spiral']   = set_combine(sets.precast.WS, {
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Hes. Hose +3",
    right_ear="Mache Earring +1",
    back={ name="Segomo's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
	})
	
    sets.precast.WS['Tornado Kick']    = set_combine(sets.precast.WS, {
    legs="Mpaca's Hose",
    feet="Anch. Gaiters +3",
	})
	
    sets.precast.WS['Shell Crusher']   = set_combine(sets.precast.WS, {
    ammo="Pemphredo Tathlum",
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Sanctity Necklace",
    waist="Acuity Belt +1",
    left_ear="Digni. Earring",
    right_ear="Crep. Earring",
    left_ring="Stikini Ring +1",
    right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
    back="Sacro Mantle",
	})
    
	--weaponsets
	sets.Vere = {main="Verethragna"}
	sets.GH = {main="Godhands"}
    sets.Pole = {main="Malignance Pole", sub="Flanged Grip"}
   
    -- Midcast Sets
    sets.midcast.FastRecast = {ammo="Sapience Orb",
        head=gear.FCHead,neck="Orunmila's Torque",
        body="Adhemar Jacket +1",hands="Leyline Gloves",ring1="Weather. Ring",ring2="Prolix Ring",
        back="Moonbeam Cape",waist="Black Belt",legs="Rawhide Trousers",feet=gear.FCFeet}
    
	-- Idle sets
    sets.idle = {
    ammo="Crepuscular Pebble",
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
    neck="Bathy Choker +1",
    waist="Moonbow Belt +1",
    left_ear="Etiolation Earring",
    right_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
    left_ring={name="Chirich Ring +1", bag="wardrobe2"},
    right_ring={name="Chirich Ring +1", bag="wardrobe3"},
    back={ name="Segomo's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
		}
    
    -- Defense sets
    sets.defense.PDT = {
		}

    sets.defense.Hybrid = sets.defense.PDT

    sets.defense.MDT = sets.defense.PDT

    sets.Kiting = {feet="Hermes' Sandals"}

    -- Engaged sets
    
    -- Normal melee sets
    sets.engaged = {
    ammo="Coiste Bodhar",
    head="Malignance Chapeau",
    body="Mpaca's Doublet",
    hands="Malignance Gloves",
    legs="Mpaca's Hose",
    feet="Malignance Boots",
    neck={ name="Mnk. Nodowa +2", augments={'Path: A',}},
    waist="Moonbow Belt +1",
    left_ear="Sherida Earring",
    right_ear="Schere Earring",
    left_ring="Niqmaddu Ring",
    right_ring="Gere Ring",
    back={ name="Segomo's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
	}
		
	sets.god = 	{right_ear="Mache Earring +1",}
		
    sets.engaged.Tank = set_combine(sets.engaged, {
    head="Malignance Chapeau",
    body="Malignance Tabard",
    hands="Malignance Gloves",
    legs="Malignance Tights",
    feet="Malignance Boots",
	})
	
        
    -- Quick sets for post-precast adjustments, listed here so that the gear can be Validated.
    sets.engaged.Impetus = set_combine(sets.engaged, {body="Bhikku Cyclas +1"})
    sets.engaged.Tank.Impetus = set_combine(sets.engaged.Tank, {body="Bhikku Cyclas +1"})
    sets.footwork_kick_feet = {feet="Anch. Gaiters +3"}
	sets.impetus_body = {body="Bhikku Cyclas +1", ammo="Coiste Bodhar", right_ear="Schere Earring", back=gear.DABack}	
	sets.YourAskSashSetname  =  {waist="Ask Sash"}
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)
    -- Don't gearswap for weaponskills when Defense is on.
    --if spell.type == 'WeaponSkill' and state.DefenseMode.current ~= 'None' then
        --eventArgs.handled = true
    --end
--end

-- Run after the general precast() is done.
function job_post_precast(spell, action, spellMap, eventArgs)
    if spell.type == 'WeaponSkill' then
        if state.Buff.Impetus and (spell.english == "Ascetic's Fury" or spell.english == "Victory Smite") then
          equip(sets.impetus_body)
		  -- Need 6 hits at capped dDex, or 9 hits if dDex is uncapped, for Tantra to tie or win.
        elseif state.Buff.Footwork and (spell.english == "Dragon's Kick" or spell.english == "Tornado Kick") then
            equip(sets.footwork_kick_feet)
        end
    end
end

--function job_aftercast(spell, action, spellMap, eventArgs)
    --if spell.type == 'WeaponSkill' and not spell.interrupted and state.FootworkWS and state.Buff.Footwork then
        --send_command('cancel Footwork')
    --end
--end

-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------

-- Called when a player gains or loses a buff.
-- buff == buff gained or lost
-- gain == true if the buff was gained, false if it was lost.
function job_buff_change(buff, gain)
	--ask sash
	if buff == 'Boost' then
        if gain then
            equip(sets.YourAskSashSetname)
            disable('waist')
        else
            enable('waist')
        end
    end
    -- Set Footwork as combat form any time it's active and Hundred Fists is not.
    if buff == 'Footwork' and gain and not buffactive['hundred fists'] then
	            equip(sets.footwork_kick_feet)
        --state.CombatForm:set('Footwork')
    elseif buff == "Hundred Fists" and not gain and buffactive.footwork then
	            equip(sets.footwork_kick_feet)
        --state.CombatForm:set('Footwork')
    else
        state.CombatForm:reset()
    end
    
    -- Hundred Fists and Impetus modify the custom melee groups
    if buff == "Hundred Fists" or buff == "Impetus" then
        classes.CustomMeleeGroups:clear()
        
        if (buff == "Hundred Fists" and gain) or buffactive['hundred fists'] then
            classes.CustomMeleeGroups:append('HF')
        end
        
        if (buff == "Impetus" and gain) or buffactive.impetus then
            classes.CustomMeleeGroups:append('Impetus')
        end
    end

    -- Update gear if any of the above changed
    if buff == "Hundred Fists" or buff == "Impetus" or buff == "Footwork" then
        handle_equipping_gear(player.status)
    end
end


-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------

function customize_idle_set(idleSet)
    if player.hpp < 75 then
        idleSet = set_combine(idleSet, sets.ExtraRegen)
    end
    
    return idleSet
end

-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------

function update_combat_form()
    --if buffactive.footwork and not buffactive['hundred fists'] then
        --state.CombatForm:set('Footwork')
    if player.equipment.main == 'Godhands' then
		equip(sets.god)
	else
        state.CombatForm:reset()
    end
end

function update_melee_groups()
    classes.CustomMeleeGroups:clear()
    
    if buffactive['hundred fists'] then
        classes.CustomMeleeGroups:append('HF')
    end
    
    if buffactive.impetus then
        classes.CustomMeleeGroups:append('Impetus')
    end
end


-------------------------------------------------------------------------------------------------------------------
-- Custom event hooks.
-------------------------------------------------------------------------------------------------------------------

-- Keep track of the current hit count while Impetus is up.
function on_action_for_impetus(action)
    if state.Buff.Impetus then
        -- count melee hits by player
        if action.actor_id == player.id then
            if action.category == 1 then
                for _,target in pairs(action.targets) do
                    for _,action in pairs(target.actions) do
                        -- Reactions (bitset):
                        -- 1 = evade
                        -- 2 = parry
                        -- 4 = block/guard
                        -- 8 = hit
                        -- 16 = JA/weaponskill?
                        -- If action.reaction has bits 1 or 2 set, it missed or was parried. Reset count.
                        if (action.reaction % 4) > 0 then
                            info.impetus_hit_count = 0
                        else
                            info.impetus_hit_count = info.impetus_hit_count + 1
                        end
                    end
                end
            elseif action.category == 3 then
                -- Missed weaponskill hits will reset the counter.  Can we tell?
                -- Reaction always seems to be 24 (what does this value mean? 8=hit, 16=?)
                -- Can't tell if any hits were missed, so have to assume all hit.
                -- Increment by the minimum number of weaponskill hits: 2.
                for _,target in pairs(action.targets) do
                    for _,action in pairs(target.actions) do
                        -- This will only be if the entire weaponskill missed or was parried.
                        if (action.reaction % 4) > 0 then
                            info.impetus_hit_count = 0
                        else
                            info.impetus_hit_count = info.impetus_hit_count + 2
                        end
                    end
                end
            end
        elseif action.actor_id ~= player.id and action.category == 1 then
            -- If mob hits the player, check for counters.
            for _,target in pairs(action.targets) do
                if target.id == player.id then
                    for _,action in pairs(target.actions) do
                        -- Spike effect animation:
                        -- 63 = counter
                        -- ?? = missed counter
                        if action.has_spike_effect then
                            -- spike_effect_message of 592 == missed counter
                            if action.spike_effect_message == 592 then
                                info.impetus_hit_count = 0
                            elseif action.spike_effect_animation == 63 then
                                info.impetus_hit_count = info.impetus_hit_count + 1
                            end
                        end
                    end
                end
            end
        end
        
        --add_to_chat(123,'Current Impetus hit count = ' .. tostring(info.impetus_hit_count))
    else
        info.impetus_hit_count = 0
    end
    
end

-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)

    equip(sets[state.WeaponSet.current])

end

send_command('input /macro set 3;input /macro book 12')
    send_command('@wait 5; input /lockstyleset 60')

By ithorien 2022-07-05 15:02:42
Link | Quote | Reply
 
Eek. Been away from this way too long (7 long years) to remember, but I cannot for the life of me get the "auto haste" functions to work from Mote's oldschool LUAs, specifically this piece-
Code
function determine_haste_group()
    -- We have three groups of DW in gear: Hachiya body/legs, Iga head + Patentia Sash, and DW earrings
    
    -- Standard gear set reaches near capped delay with just Haste (77%-78%, depending on HQs)

    -- For high haste, we want to be able to drop one of the 10% groups.
    -- Basic gear hits capped delay (roughly) with:
    -- 1 March + Haste
    -- 2 March
    -- Haste + Haste Samba
    -- 1 March + Haste Samba
    -- Embrava
    
    -- High haste buffs:
    -- 2x Marches + Haste Samba == 19% DW in gear
    -- 1x March + Haste + Haste Samba == 22% DW in gear
    -- Embrava + Haste or 1x March == 7% DW in gear
    
    -- For max haste (capped magic haste + 25% gear haste), we can drop all DW gear.
    -- Max haste buffs:
    -- Embrava + Haste+March or 2x March
    -- 2x Marches + Haste
    
    -- So we want four tiers:
    -- Normal DW
    -- 20% DW -- High Haste
    -- 7% DW (earrings) - Embrava Haste (specialized situation with embrava and haste, but no marches)
    -- 0 DW - Max Haste
    
    classes.CustomMeleeGroups:clear()
    
    if buffactive.embrava and (buffactive.march == 2 or (buffactive.march and buffactive.haste)) then
        classes.CustomMeleeGroups:append('MaxHaste')
    elseif buffactive.march == 2 and buffactive.haste then
        classes.CustomMeleeGroups:append('MaxHaste')
    elseif buffactive.embrava and (buffactive.haste or buffactive.march) then
        classes.CustomMeleeGroups:append('EmbravaHaste')
    elseif buffactive.march == 1 and buffactive.haste and buffactive['haste samba'] then
        classes.CustomMeleeGroups:append('HighHaste')
    elseif buffactive.march == 2 then
        classes.CustomMeleeGroups:append('HighHaste')
    end
end


I have the sets defined as they used to be (don't lol, these are 7 year old gearsets), but it doesn't seem that Haste of any kind is causing any processing and debug isn't helping me get there. For example, working on getting this updated:
Code
sets.engaged.HighHaste = {ammo="Qirmiz Tathlum",
        head="Taeon Chapeau",neck="Moonbeam Nodowa",ear1="Eabani Earring",ear2="Suppanomimi",
        body="Hattori Ningi",hands="Taeon Gloves",ring1="Rajas Ring",ring2="Epona's Ring",
        back="Yokaze Mantle",waist="Patentia Sash",legs="Mochizuki Hakama +1",feet="Mochizuki Kyahan"}


Any pointers?
Offline
Posts: 4
By Solux 2022-07-19 22:24:59
Link | Quote | Reply
 
Heya! Was hoping for help with my new BST lua. I cannot for the life of me figure out how to get Gearswap to interpret /bstpet 1, 2, etc.. as their ability names so it changes gear. My biggest hurdle is that I'm not even certain what is being passed to gearswap when I use the command. I have them mapped for physical, magical, etc... but I can't get it to compare. Worse is the catch-all won't register equipping the Gleti's Breeches, or the TP bonus empyrean. Tried JobAbilites, spell.type = 'Monster', and Precast, Midcast, Pet_Midcast. I'm outta ideas and my lua is in pieces across multiple scratch files awaiting re-assembly. Any help would be appreciated.
 Bahamut.Galakar
Offline
Server: Bahamut
Game: FFXI
user: Galakar
Posts: 172
By Bahamut.Galakar 2022-07-20 02:50:28
Link | Quote | Reply
 
I don't play BST, but maybe how it looks for my SMN will help you solve the issue. First, I make sure that if I use pet action, it doesn't execute midcast action.
Code
function midcast(spell)
	if pet_midaction() then
		return
	end


My pet precast set is also in the midcast function.
Code
if spell.type=='BloodPactWard' or spell.type=='BloodPactRage' then
equip()
end


And this is how my set for pet midcast work. I first call function pet.isvalid in case it dies before executing the spell (I saw that others do not use this step, so maybe it is not needed).
Code
function pet_midcast(spell)
	if pet.isvalid then
		if SpellMaps:contains(spell.name) then
			equip()
		end
	end
end
Offline
Posts: 4
By Solux 2022-07-20 11:41:52
Link | Quote | Reply
 
Edited:
Yeah. Thanks for the help. A little peeved at the moment, but I got this to work. All my problems from 5-6hours of work just vanished today. Apparently the solution to everything was to restart FFXI. Fresh today, logged into BST, and the lua functions as intended. Everything works now, not just the ws and personal job abilites like yesterday - pet stuff is changing etc.. I have no idea what changed between logoff last night and logon this morning. <sigh> Thanks again for your help. Please ignore the below - leaving it in case someone will benefit from the code or something.





Heya^^ thank you for the response.
Gonna take notes for SMN, though for me it isn't really an issue as the ability name is passed with the macro- something like /pet "Predator Claws" <t> - and (spell.english) or (spell.name) can be used with the SpellMaps:contains() to compare searching for "Predator Claws".

Macro-wise for SMN I utilize a line for each Avatar specifying each blood pact since.. well that's all SMN really does. I can throw in a "Cure" or Myrkr on an ability row of the macro book and usually call it good. - this is just how I handle SMN personally when I do play it.

BST on the other hand has more Melee versatility and filling a macro book full of pet moves doesn't seem practical since it negates ability rows, Weapon Skills, etc...
So to allow for more space I use "/bstpet 3 <me>" - or whatever corresponding move I want my pet to do(1-7). The problem I'm having is when this is passed to vanilla gearswap (no includes) whatever is being sent doesn't seem to be a spell name that I can compare to.
Code
function pet_midcast(spell,action)
		if Pet_Phys:contains(spell.english) then
			equip(sets.midcast.JA.Ready.Pet_Phys)
		elseif Pet_Mag:contains(spell.english) then
			equip(sets.midcast.JA.Ready.Pet_Mag)
		elseif Pet_MAcc:contains(spell.english) then
			equip(sets.midcast.JA.Ready.Pet_MAcc)
		elseif Pet_xHit:contains(spell.english) then
			equip(sets.midcast.JA.Ready.Pet_xHit)
		elseif Pet_TPReady:contains(spell.english) then
			equip(sets.midcast.JA.Ready.Pet_TPReady)
		elseif Pet_BuffTP:contains(spell.english) then
			equip(sets.midcast.JA.Ready.Pet_BuffTP)
		else
		end
end


p.s. sorry the code's a mess, the lua is in parts trying to get this to work.
 Phoenix.Tgo
Offline
Server: Phoenix
Game: FFXI
Posts: 1
By Phoenix.Tgo 2022-07-23 23:43:37
Link | Quote | Reply
 
Hi,

I'm having trouble getting my idle set to load on my thief lua. I'm using a modified version of Kinematics thf lua. I also have the treasure hunter mote from him. Whenever I'm in town or not engaged it will not equip my Jute Boots unless I manually switch the treasure hunter mode regardless of what TH mode it was on. Also by default the treasure hunter mode is on tag rather than none. Would anyone be able to help me figure out what's wrong here? Here's my lua:
Code
-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job.  Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------

--[[
    Custom commands:
    gs c cycle treasuremode (set on ctrl-= by default): Cycles through the available treasure hunter modes.
    
    Treasure hunter modes:
        None - Will never equip TH gear
        Tag - Will equip TH gear sufficient for initial contact with a mob (either melee, ranged hit, or Aeolian Edge AOE)
        SATA - Will equip TH gear sufficient for initial contact with a mob, and when using SATA
        Fulltime - Will keep TH gear equipped fulltime
--]]

-- Initialization function for this job file.
function get_sets()
    mote_include_version = 2
    
    -- Load and initialize the include file.
    include('Mote-Include.lua')
end

-- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
function job_setup()
    state.Buff['Sneak Attack'] = buffactive['sneak attack'] or false
    state.Buff['Trick Attack'] = buffactive['trick attack'] or false
    state.Buff['Feint'] = buffactive['feint'] or false
    
    include('Mote-TreasureHunter')

    -- For th_action_check():
    -- JA IDs for actions that always have TH: Provoke, Animated Flourish
    info.default_ja_ids = S{35, 204}
    -- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
    info.default_u_ja_ids = S{201, 202, 203, 205, 207}
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', 'Acc', 'Mod')
    state.HybridMode:options('Normal', 'Evasion', 'PDT')
    state.RangedMode:options('Normal', 'Acc')
    state.WeaponskillMode:options('Normal', 'Acc', 'Mod')
    state.PhysicalDefenseMode:options('Evasion', 'PDT')


    gear.default.weaponskill_neck = "Asperity Necklace"
    gear.default.weaponskill_waist = "Caudata Belt"
    gear.AugQuiahuiz = {name="Quiahuiz Trousers", augments={'Haste+2','"Snapshot"+2','STR+8'}}

    -- Additional local binds
    send_command('bind ^` input /ja "Flee" <me>')
    send_command('bind ^= gs c cycle treasuremode')
    send_command('bind !- gs c cycle targetmode')

    select_default_macro_book()
end

-- Called when this job file is unloaded (eg: job change)
function user_unload()
    send_command('unbind ^`')
    send_command('unbind !-')
end

-- Define sets and vars used by this job file.
function init_gear_sets()
    --------------------------------------
    -- Special sets (required by rules)
    --------------------------------------

    sets.TreasureHunter = {main="Sandung/",
    sub="Thief's Knife/", ammo="Aurgelmir Orb",
    body={ name="Herculean Vest", augments={'Attack+10','Pet: INT+3','"Treasure Hunter"+2',}}, 
	hands="Plun. Armlets +1",
    feet="Skulk. Poulaines",}
    sets.ExtraRegen = {}
    sets.Kiting = {}

    sets.buff['Sneak Attack'] = {hands="Plun. Armlets +1"}

    sets.buff['Trick Attack'] = {}

    -- Actions we want to use to tag TH.
    sets.precast.Step = sets.TreasureHunter
    sets.precast.Flourish1 = sets.TreasureHunter
    sets.precast.JA.Provoke = sets.TreasureHunter


    --------------------------------------
    -- Precast sets
    --------------------------------------

    -- Precast sets to enhance JAs
    sets.precast.JA['Collaborator'] = {}
    sets.precast.JA['Accomplice'] = {}
    sets.precast.JA['Flee'] = { head="Pillager's Bonnet +2",
    legs="Rogue's Culottes",
    feet="Rogue's Poulaines"}
    sets.precast.JA['Hide'] = {}
    sets.precast.JA['Conspirator'] = {} -- {body="Raider's Vest +2"}
    sets.precast.JA['Steal'] = {head="Pillager's Bonnet +2",
    legs="Rogue's Culottes",
    feet="Rogue's Poulaines"}
    sets.precast.JA['Despoil'] = {}
    sets.precast.JA['Perfect Dodge'] = {}
    sets.precast.JA['Feint'] = {} -- {legs="Assassin's Culottes +2"}

    sets.precast.JA['Sneak Attack'] = sets.buff['Sneak Attack']
    sets.precast.JA['Trick Attack'] = sets.buff['Trick Attack']


    -- Waltz set (chr and vit)
    sets.precast.Waltz = {}

    -- Don't need any special gear for Healing Waltz.
    sets.precast.Waltz['Healing Waltz'] = {}


    -- Fast cast sets for spells
    sets.precast.FC = {}

    sets.precast.FC.Utsusemi = set_combine(sets.precast.FC,{})


    -- Ranged snapshot gear
    sets.precast.RA = {ranged="Rogetsurin"}


    -- Weaponskill sets

    -- Default set for any weaponskill that isn't any more specifically defined
    sets.precast.WS =  {
    ammo="Jukukik Feather",
    head={ name="Adhemar Bonnet", augments={'STR+10','DEX+10','Attack+15',}},
    body={ name="Herculean Vest", augments={'Pet: Phys. dmg. taken -1%','Pet: "Subtle Blow"+11','Weapon skill damage +10%','Mag. Acc.+17 "Mag.Atk.Bns."+17',}},
    hands="Meg. Gloves +2",
    legs={name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
    feet={ name="Herculean Boots", augments={'DEX+5','Potency of "Cure" effect received+1%','Weapon skill damage +10%','Mag. Acc.+14 "Mag.Atk.Bns."+14',}},
    neck="Asn. Gorget +1",
    waist="Artful Belt",
    left_ear={ name="Moonshade Earring", augments={'Accuracy+4','TP Bonus +250',}},
    right_ear="Odr Earring",
    left_ring="Karieyh Ring",
    right_ring="Ramuh Ring",
    back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},}

    sets.precast.WS.Acc = set_combine(sets.precast.WS, {})

    -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
    sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {})
    sets.precast.WS['Exenterator'].Acc = set_combine(sets.precast.WS['Exenterator'], {})
    sets.precast.WS['Exenterator'].Mod = set_combine(sets.precast.WS['Exenterator'], {})
    sets.precast.WS['Exenterator'].SA = set_combine(sets.precast.WS['Exenterator'].Mod, {})
    sets.precast.WS['Exenterator'].TA = set_combine(sets.precast.WS['Exenterator'].Mod, {})
    sets.precast.WS['Exenterator'].SATA = set_combine(sets.precast.WS['Exenterator'].Mod, {})

    sets.precast.WS['Dancing Edge'] = set_combine(sets.precast.WS, {})
    sets.precast.WS['Dancing Edge'].Acc = set_combine(sets.precast.WS['Dancing Edge'], {})
    sets.precast.WS['Dancing Edge'].Mod = set_combine(sets.precast.WS['Dancing Edge'], {})
    sets.precast.WS['Dancing Edge'].SA = set_combine(sets.precast.WS['Dancing Edge'].Mod, {})
    sets.precast.WS['Dancing Edge'].TA = set_combine(sets.precast.WS['Dancing Edge'].Mod, {})
    sets.precast.WS['Dancing Edge'].SATA = set_combine(sets.precast.WS['Dancing Edge'].Mod, {})

    sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
	  ammo="Aurgelmir Orb",
    head={ name="Adhemar Bonnet", augments={'STR+10','DEX+10','Attack+15',}},
    body="Pillager's Vest +3",
    hands="Meg. Gloves +2",
    legs="Meg. Chausses +1",
    feet="Meg. Jam. +1",
    neck="Asn. Gorget +1",
    waist="Dynamic Belt",
    left_ear="Suppanomimi",
    right_ear="Allegro Earring",
    left_ring="Epona's Ring",
    right_ring="Solemn Ring",
    back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10',}}})
    sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {})
    sets.precast.WS['Evisceration'].Mod = set_combine(sets.precast.WS['Evisceration'], {})
    sets.precast.WS['Evisceration'].SA = set_combine(sets.precast.WS['Evisceration'].Mod, {})
    sets.precast.WS['Evisceration'].TA = set_combine(sets.precast.WS['Evisceration'].Mod, {})
    sets.precast.WS['Evisceration'].SATA = set_combine(sets.precast.WS['Evisceration'].Mod, {})

    sets.precast.WS["Rudra's Storm"] = set_combine(sets.precast.WS, {
	ammo="Jukukik Feather",
    head={ name="Pillager's Bonnet +2",},
    body={ name="Herculean Vest", augments={'Pet: Phys. dmg. taken -1%','Pet: "Subtle Blow"+11','Weapon skill damage +10%','Mag. Acc.+17 "Mag.Atk.Bns."+17',}},
    hands="Meg. Gloves +2",
    legs="Mummu Kecks +2",
    feet={ name="Herculean Boots", augments={'DEX+5','Potency of "Cure" effect received+1%','Weapon skill damage +10%','Mag. Acc.+14 "Mag.Atk.Bns."+14',}},
    neck="Asn. Gorget +1",
    waist="Artful Belt",
    left_ear={ name="Moonshade Earring", augments={'Accuracy+4','TP Bonus +250',}},
    right_ear="Odr Earring",
    left_ring="Karieyh Ring",
    right_ring="Ramuh Ring",
    back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},})
    sets.precast.WS["Rudra's Storm"].Acc = set_combine(sets.precast.WS["Rudra's Storm"], {})
    sets.precast.WS["Rudra's Storm"].Mod = set_combine(sets.precast.WS["Rudra's Storm"], {})
    sets.precast.WS["Rudra's Storm"].SA = set_combine(sets.precast.WS["Rudra's Storm"].Mod, {})
    sets.precast.WS["Rudra's Storm"].TA = set_combine(sets.precast.WS["Rudra's Storm"].Mod, {})
    sets.precast.WS["Rudra's Storm"].SATA = set_combine(sets.precast.WS["Rudra's Storm"].Mod, {})

    sets.precast.WS["Shark Bite"] = set_combine(sets.precast.WS, {})
    sets.precast.WS['Shark Bite'].Acc = set_combine(sets.precast.WS['Shark Bite'], {})
    sets.precast.WS['Shark Bite'].Mod = set_combine(sets.precast.WS['Shark Bite'], {})
    sets.precast.WS['Shark Bite'].SA = set_combine(sets.precast.WS['Shark Bite'].Mod, {})
    sets.precast.WS['Shark Bite'].TA = set_combine(sets.precast.WS['Shark Bite'].Mod, {})
    sets.precast.WS['Shark Bite'].SATA = set_combine(sets.precast.WS['Shark Bite'].Mod, {})

    sets.precast.WS['Mandalic Stab'] = set_combine(sets.precast.WS, {
	ammo="Jukukik Feather",
    head={ name="Pillager's Bonnet +2",},
    body={ name="Herculean Vest", augments={'Pet: Phys. dmg. taken -1%','Pet: "Subtle Blow"+11','Weapon skill damage +10%','Mag. Acc.+17 "Mag.Atk.Bns."+17',}},
    hands="Meg. Gloves +2",
    legs="Mummu Kecks +2",
    feet={ name="Herculean Boots", augments={'DEX+5','Potency of "Cure" effect received+1%','Weapon skill damage +10%','Mag. Acc.+14 "Mag.Atk.Bns."+14',}},
    neck="Asn. Gorget +1",
    waist="Artful Belt",
    left_ear={ name="Moonshade Earring", augments={'Accuracy+4','TP Bonus +250',}},
    right_ear="Odr Earring",
    left_ring="Karieyh Ring",
    right_ring="Ramuh Ring",
    back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}},})
    sets.precast.WS['Mandalic Stab'].Acc = set_combine(sets.precast.WS['Mandalic Stab'], {})
    sets.precast.WS['Mandalic Stab'].Mod = set_combine(sets.precast.WS['Mandalic Stab'], {})
    sets.precast.WS['Mandalic Stab'].SA = set_combine(sets.precast.WS['Mandalic Stab'].Mod, {})
    sets.precast.WS['Mandalic Stab'].TA = set_combine(sets.precast.WS['Mandalic Stab'].Mod, {})
    sets.precast.WS['Mandalic Stab'].SATA = set_combine(sets.precast.WS['Mandalic Stab'].Mod, {})

    sets.precast.WS['Aeolian Edge'] = {
  
    ammo="Jukukik Feather",
    head="Pill. Bonnet +2",
    body={ name="Herculean Vest", augments={'Pet: Phys. dmg. taken -1%','Pet: "Subtle Blow"+11','Weapon skill damage +10%','Mag. Acc.+17 "Mag.Atk.Bns."+17',}},
    hands={ name="Adhemar Wristbands", augments={'DEX+10','AGI+10','Accuracy+15',}},
    legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
    feet={ name="Herculean Boots", augments={'Accuracy+11 Attack+11','"Triple Atk."+3',}},
    neck="Sanctity Necklace",
    waist="Artful Belt",
    left_ear={ name="Moonshade Earring", augments={'Accuracy+4','TP Bonus +250',}},
    right_ear="Dedition Earring",
    left_ring="Epona's Ring",
    right_ring="Karieyh Ring",
    back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','Weapon skill damage +10%',}}}

    sets.precast.WS['Aeolian Edge'].TH = set_combine(sets.precast.WS['Aeolian Edge'], sets.TreasureHunter)


    --------------------------------------
    -- Midcast sets
    --------------------------------------

    sets.midcast.FastRecast = {}

    -- Specific spells
    sets.midcast.Utsusemi = {}

    -- Ranged gear
    sets.midcast.RA = {ranged="Rogetsurin"}

    sets.midcast.RA.Acc = {}


    --------------------------------------
    -- Idle/resting/defense sets
    --------------------------------------

    -- Resting sets
    sets.resting = {}


    -- Idle sets (default idle set not needed since the other three are defined, but leaving for testing purposes)

    sets.idle = {feet="Jute Boots +1",}

    sets.idle.Town = {feet="Jute Boots +1",}

    sets.idle.Weak = {}


    -- Defense sets

    sets.defense.Evasion = {}

    sets.defense.PDT = {}

    sets.defense.MDT = {}


    --------------------------------------
    -- Melee sets
    --------------------------------------

    -- Normal melee group
    sets.engaged = {main="", sub="", range=empty, ammo="Aurgelmir Orb",
    head={ name="Adhemar Bonnet", augments={'STR+10','DEX+10','Attack+15',}},
    body="Pillager's Vest +3",
    hands={ name="Adhemar Wristbands", augments={'DEX+10','AGI+10','Accuracy+15',}},
    legs= {name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
    feet={ name="Herculean Boots", augments={'Accuracy+11 Attack+11','"Triple Atk."+3',}},
    neck="Assassin's gorget +1",
	waist="Windbuffet Belt +1",
    left_ear="Cessance Earring",
    right_ear="Dedition Earring",
    left_ring="Epona's Ring",
    right_ring="Petrov Ring",
    back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10',}},}
	
	    sets.engaged.Acc = {}
        
    -- Mod set for trivial mobs (Skadi+1)
    sets.engaged.Mod = {}

    -- Mod set for trivial mobs (Thaumas)
    sets.engaged.Mod2 = {}

    sets.engaged.Evasion = {}
    sets.engaged.Acc.Evasion = {} 

    sets.engaged.PDT = {}
    sets.engaged.Acc.PDT = {}

end


-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------

-- Run after the general precast() is done.
function job_post_precast(spell, action, spellMap, eventArgs)
    if spell.english == 'Aeolian Edge' and state.TreasureMode.value ~= 'None' then
        equip(sets.TreasureHunter)
    elseif spell.english=='Sneak Attack' or spell.english=='Trick Attack' or spell.type == 'WeaponSkill' then
        if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
            equip(sets.TreasureHunter)
        end
    end
end

-- Run after the general midcast() set is constructed.
function job_post_midcast(spell, action, spellMap, eventArgs)
    if state.TreasureMode.value ~= 'None' and spell.action_type == 'Ranged Attack' then
        equip(sets.midcast.RA)
    end
end

-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_aftercast(spell, action, spellMap, eventArgs)
    -- Weaponskills wipe SATA/Feint.  Turn those state vars off before default gearing is attempted.
    if spell.type == 'WeaponSkill' and not spell.interrupted then
        state.Buff['Sneak Attack'] = false
        state.Buff['Trick Attack'] = false
        state.Buff['Feint'] = false
    end
end

-- Called after the default aftercast handling is complete.
function job_post_aftercast(spell, action, spellMap, eventArgs)
    -- If Feint is active, put that gear set on on top of regular gear.
    -- This includes overlaying SATA gear.
    check_buff('Feint', eventArgs)
end

-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------

-- Called when a player gains or loses a buff.
-- buff == buff gained or lost
-- gain == true if the buff was gained, false if it was lost.
function job_buff_change(buff, gain)
    if state.Buff[buff] ~= nil then
        if not midaction() then
            handle_equipping_gear(player.status)
        end
    end
end


-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------

function get_custom_wsmode(spell, spellMap, defaut_wsmode)
    local wsmode

    if state.Buff['Sneak Attack'] then
        wsmode = 'SA'
    end
    if state.Buff['Trick Attack'] then
        wsmode = (wsmode or '') .. 'TA'
    end

    return wsmode
end


-- Called any time we attempt to handle automatic gear equips (ie: engaged or idle gear).
function job_handle_equipping_gear(playerStatus, eventArgs)
    -- Check that ranged slot is locked, if necessary
    check_range_lock()

    -- Check for SATA when equipping gear.  If either is active, equip
    -- that gear specifically, and block equipping default gear.
    check_buff('Sneak Attack', eventArgs)
    check_buff('Trick Attack', eventArgs)
end


function customize_idle_set(idleSet)
    if player.hpp < 80 then
        idleSet = set_combine(idleSet, sets.ExtraRegen)
    end

    return idleSet
end


function customize_melee_set(meleeSet)
    if state.TreasureMode.value == 'Fulltime' then
        meleeSet = set_combine(meleeSet, sets.TreasureHunter)
    end

    return meleeSet
end


-- Called by the 'update' self-command.
function job_update(cmdParams, eventArgs)
    th_update(cmdParams, eventArgs)
end

-- Function to display the current relevant user state when doing an update.
-- Return true if display was handled, and you don't want the default info shown.
function display_current_job_state(eventArgs)
    local msg = 'Melee'
    
    if state.CombatForm.has_value then
        msg = msg .. ' (' .. state.CombatForm.value .. ')'
    end
    
    msg = msg .. ': '
    
    msg = msg .. state.OffenseMode.value
    if state.HybridMode.value ~= 'Normal' then
        msg = msg .. '/' .. state.HybridMode.value
    end
    msg = msg .. ', WS: ' .. state.WeaponskillMode.value
    
    if state.DefenseMode.value ~= 'None' then
        msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')'
    end
    
    if state.Kiting.value == true then
        msg = msg .. ', Kiting'
    end

    if state.PCTargetMode.value ~= 'default' then
        msg = msg .. ', Target PC: '..state.PCTargetMode.value
    end

    if state.SelectNPCTargets.value == true then
        msg = msg .. ', Target NPCs'
    end
    
    msg = msg .. ', TH: ' .. state.TreasureMode.value

    add_to_chat(122, msg)

    eventArgs.handled = true
end

-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------

-- State buff checks that will equip buff gear and mark the event as handled.
function check_buff(buff_name, eventArgs)
    if state.Buff[buff_name] then
        equip(sets.buff[buff_name] or {})
        if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
            equip(sets.TreasureHunter)
        end
        eventArgs.handled = true
    end
end


-- Check for various actions that we've specified in user code as being used with TH gear.
-- This will only ever be called if TreasureMode is not 'None'.
-- Category and Param are as specified in the action event packet.
function th_action_check(category, param)
    if category == 2 or -- any ranged attack
        --category == 4 or -- any magic action
        (category == 3 and param == 30) or -- Aeolian Edge
        (category == 6 and info.default_ja_ids:contains(param)) or -- Provoke, Animated Flourish
        (category == 14 and info.default_u_ja_ids:contains(param)) -- Quick/Box/Stutter Step, Desperate/Violent Flourish
        then return true
    end
end


-- Function to lock the ranged slot if we have a ranged weapon equipped.
function check_range_lock()
    if player.equipment.range ~= 'empty' then
        disable('range', 'ammo')
    else
        enable('range', 'ammo')
    end
end


-- Select default macro book on initial load or subjob change.
function select_default_macro_book()
    -- Default macro set/book
    if player.sub_job == 'DNC' then
        set_macro_page(1, 6)
    elseif player.sub_job == 'WAR' then
        set_macro_page(1, 6)
    elseif player.sub_job == 'NIN' then
        set_macro_page(5, 6)
    else
        set_macro_page(1, 6)
    end
end


First Page 2 3 ... 168 169 170 ... 180 181 182
Log in to post.