Gearswap Support Thread

Eorzea Time
 
 
 
Language: JP EN FR DE
Version 3.1
New Items
users online
Forum » Windower » Support » Gearswap Support Thread
Gearswap Support Thread
First Page 2 3 ... 188 189
 Ragnarok.Liteholt
Offline
Server: Ragnarok
Game: FFXI
User: Liteholt
Posts: 77
By Ragnarok.Liteholt 2025-11-28 08:25:43
Link | Quote | Reply
 
If you look at some of the other jobs, down at the bottom Sel adds in buff state modifiers.

So if you wanted to have certain pieces of gear equipped when Valiance or Vallation are up, you would stick that in the sets.buff.Valiance and sets.buff.Vallation lines down at the bottom, I expect.
Offline
By Dodik 2025-11-28 09:45:04
Link | Quote | Reply
 
sets.buff.whatever is for gear that should remain equipped for the duration of the buff. Don't put fastcast gear in those sets.
 Asura.Selindrile
Offline
Server: Asura
Game: FFXI
Posts: 98
By Asura.Selindrile 2025-12-03 04:37:49
Link | Quote | Reply
 
Just happened to be looking around on here, and for the record, I didn't have any code specifically for this, I just added it, and I used this name for the set: sets.precast.FC.Inspiration = {}

While technically it could fit well enough in either FC sets or Buff sets, I felt it more fitting in this case next to the normal precast set, as people are likely to set_combine off the base FC set for Inspiration, .buff sets are generally (though not always) usually focused on a single piece of gear or maybe two, that affect a buff, whereas in this case, with all the extra FC from Inspiration one might have, one might want to swap around their entire set.

@Dodik "buff" sets aren't necessarily things that are equipped "for the duration of the buff", they are in some cases, but each sets.buff.whatever follows it's own rules as buff-affecting gear is WILDLY varied, for example:

sets.buff['Burst Affinity'] - Blu nuke midcast
sets.buff['Chain Affinity'] - Blu physical midcast
sets.buff.Diffusion - Blu buff midcast
sets.buff.Doom - all times when doomed
sets.buff.Entrust - casting a indi spell on another player
sets.buff.Impetus - meleeing or using a crit ws

Perhaps I should've done it differently, perhaps sets.buff shouldn't exist at all and they should each be part of their respective aligned actions, but, would be an awkward thing to change now at this point.
[+]
 Quetzalcoatl.Lews
Offline
Server: Quetzalcoatl
Game: FFXI
User: Lews
Posts: 15
By Quetzalcoatl.Lews 2025-12-03 08:43:00
Link | Quote | Reply
 
Seeing Selindrile post (thank you for your hard work on the gearswap file!) reminded me of a question I have had for a while. Does anyone know how to override the weapon states to equip Diamond Aspis for warrior self JAs? I have not been able to figure it out. Ideally, if using Chango or any other combo, it would switch to one-hand weapon and the diamond aspis for job abilities then switch back to previous state - thank you!
[+]
 Asura.Selindrile
Offline
Server: Asura
Game: FFXI
Posts: 98
By Asura.Selindrile 2025-12-05 14:45:54
Link | Quote | Reply
 
Quetzalcoatl.Lews said: »
Seeing Selindrile post (thank you for your hard work on the gearswap file!) reminded me of a question I have had for a while. Does anyone know how to override the weapon states to equip Diamond Aspis for warrior self JAs? I have not been able to figure it out. Ideally, if using Chango or any other combo, it would switch to one-hand weapon and the diamond aspis for job abilities then switch back to previous state - thank you!

Assuming with your statement that you use my GS, it can be handled a few ways, I haven't added any handling myself because I've been dithering over it all this time.

Assuming you don't have weapons in locations where you wouldn't want them to swap in this situation (precast.JA sets without buffs, precast.FC sets) you can just use state.UnlockWeapons.value to swap weapons freely during JA and still have the Weapon set of your choice equipped during idle and engaged.

If you -DO- have weapons in those sets, Tomahawk, some fastcast Weapon for Utsusemi, Max Acc weapon on Dancer steps, this gets a bit complicated in that we'd only want to swap out weapons for a JA that gives buffs, and there are a lot of them, along with a lot that don't, and I don't have a clean way to do a check for "Does this JA produce a buff." and I don't really want a giant entry in the mappings file for this one situation, actually while writing this I just remembered that the resources file tracks which buff JA's apply, and I can use that, though I'd need to either make an exception for 1hr abilities. I'll try to do this tonight, and it will likely be called AspisMode.

Also, if you want quick responses to anything about my GS, myself and many members of my community are happy to help with GS modifications or inquiries at: https://discord.gg/ug6xtvQ
Offline
Posts: 13
By Horovivi 2025-12-05 20:46:26
Link | Quote | Reply
 
Can anyone help me with a code that will auto change my engaged gear sets from single wield to dual wield and vice versa? The lua will change the gear sets but only if I disengage, reload gearswap and reengage. So if I’am dual wielding and mid fight want to equip a shield it make’s the appropriate gear changes. It’s for my Bst lua.
 Asura.Selindrile
Offline
Server: Asura
Game: FFXI
Posts: 98
By Asura.Selindrile 2025-12-08 07:23:59
Link | Quote | Reply
 
Horovivi said: »
Can anyone help me with a code that will auto change my engaged gear sets from single wield to dual wield and vice versa? The lua will change the gear sets but only if I disengage, reload gearswap and reengage. So if I’am dual wielding and mid fight want to equip a shield it make’s the appropriate gear changes. It’s for my Bst lua.

For this kindof thing there's a lot of ways to approach it, the easiest thing would be for us to see your lua so we know what to change. If you want faster assistance the Windower discord has a gearswap-support channel.
 Ragnarok.Lancextrm
Offline
Server: Ragnarok
Game: FFXI
User: Lancextrm
Posts: 8
By Ragnarok.Lancextrm 2025-12-19 12:51:16
Link | Quote | Reply
 
Hello, I just got back playing the game and i'm using my old gear swap data, seems like every time I cast a spell it double casts it and doesn't swap right. says in the log while casting .."Unable to cast spells at this time. how do I fix this?
 Fenrir.Brimstonefox
Online
Server: Fenrir
Game: FFXI
User: Brimstone
Posts: 392
By Fenrir.Brimstonefox 2025-12-19 15:46:11
Link | Quote | Reply
 
You could start by posting your gearswap, seems like something would be triggered twice by the same event, so here's probably some poorly nested code or a duplicate line somewhere.
 Ragnarok.Lancextrm
Offline
Server: Ragnarok
Game: FFXI
User: Lancextrm
Posts: 8
By Ragnarok.Lancextrm 2025-12-19 22:19:05
Link | Quote | Reply
 
Seems to happen to all my gear swap data on all my 3 characters .I'll post my bard gs first and see.

Code
include('organizer-lib')

function get_sets()
  
  
	organizer_items = {}
	
	

	AccIndex = 1
	-- on BRD this is melee acc, not macc
	AccArray = {"LowACC","MidACC","HighACC"}
	timer_reg = {}
	pianissimo_cycle = false
	Armor = 'None'
	Kiting = 'ON'
	Daurdabla = 'OFF' -- Set Default Daurdabla ON or OFF Here --
	Capa = 'OFF' -- Sets Capacity Point+ Mantle --
	maxduration = 'OFF' -- This is debuff max duration (lose a bunch of macc)
	TH = 'OFF' -- Set Default Full TH ON or OFF Here --
	target_distance = 5 -- Set Default Distance Here --
	dyna = 'OFF'

	-- Daurdabla Trigger Songs --
	DaurdSongs = T{'Fowl Aubade', 'Shining Fantasia','Herb Pastoral','Goblin Gavotte', 'Gold Capriccio', 'Chocobo Mazurka', 'Raptor Mazurka'}
	
	Duration_buffs = S{'Haste',  'Refresh', 'Flurry',
						'Firestorm','Sandstorm', 'Rainstorm', 'Windstorm', 'Hailstorm', 'Thunderstorm', 'Aurorastorm', 'Voidstorm'}


	sets.Dyna = {}

	-- Idle Sets --
	sets.Idle = {main="Sangoma",
    sub="Genmei Shield",
    head="Nyame Helm",
    body="Nyame Mail",
    hands="Nyame Gauntlets",
    legs="Assid. Pants +1",
    feet={ name="Chironic Slippers", augments={'Accuracy+8','Accuracy+7 Attack+7','"Refresh"+1',}},
    neck="Twilight Torque",
    waist="Gishdubar Sash",
    left_ear={ name="Moonshade Earring", augments={'MP+25','Latent effect: "Refresh"+1',}},
    right_ear="Ethereal Earring",
    left_ring="Defending Ring",
    right_ring="Vocane ring",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},
}

	sets.Resting = set_combine(sets.Idle,{})

	-- PDT Set --
	sets.PDT = {main="Sangoma",
    sub="Genmei Shield",
    head="Nyame Helm",
    body="Nyame Mail",
    hands="Nyame Gauntlets",
    legs="Nyame Flanchard",
    feet="Nyame Sollerets",
    neck="Twilight Torque",
    waist="Gishdubar Sash",
    left_ear="Genmei Earring",
    right_ear="Ethereal Earring",
    left_ring="Defending Ring",
    right_ring="Vocane ring",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},}

	sets.MDT = set_combine(sets.PDT, {})
	
	sets.TH = {}
			
	
	sets.Precast = {}
	-- Song Precast Set --
	sets.Precast.Song = {main={ name="Kali", augments={'Mag. Acc.+15','String instrument skill +10','Wind instrument skill +10',}},
    sub="Ammurapi Shield",
    head="Fili calot +2",
    body="Inyanga Jubbah +2",
    feet={ name="Bihu Slippers +3", augments={'Enhances "Nightingale" effect',}},
	waist="Embla sash",
    neck="Voltsurge Torque",
    left_ear="Loquac. Earring",
	right_ear="Aoidos's earring",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},}

	-- Fastcast Set --
	sets.Precast.FastCast = {main={ name="Kali", augments={'Mag. Acc.+15','String instrument skill +10','Wind instrument skill +10',}},
    sub="Ammurapi Shield",
    body="Inyanga Jubbah +2",
    neck="Voltsurge Torque",
	waist="Embla sash",
    left_ear="Loquac. Earring",
    left_ring="Lebeche Ring",
    back="Perimede Cape",
	}
	

	-- Cure Precast Set --
	sets.Precast.Cure = set_combine(sets.Precast.FastCast,{back="Pahtli Cape"})

	-- Midcast Base Set --
	
	sets.Midcast = {}

	-- Song Debuff Set --
	sets.Midcast.WindDebuff = {main="Carnwenhan",
    sub="Ammurapi Shield",
	Range="Gjallarhorn",
    head="Fili calot +2",
    body="Mousai manteel +1",
    hands="Fili Manchettes +2",
    legs="Inyanga Shalwar +2",
    feet="Brioso Slippers +3",
    neck="Moonbow Whistle +1",
    waist="Kobo Obi",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},}
	
	sets.Midcast.WindDebuff.Duration = set_combine(sets.Midcast.WindDebuff, {main="Carnwenhan",
    sub="Ammurapi Shield",
	Range="Gjallarhorn",
    head="Fili calot +2",
    body="Mousai manteel +1",
    hands="Fili Manchettes +2",
    legs="Inyanga Shalwar +2",
    feet="Brioso Slippers +3",
    neck="Moonbow Whistle +1",
    waist="Kobo Obi",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},})

	-- Song Buff Set --
	sets.Midcast.WindBuff = {main="Carnwenhan",
    sub="Ammurapi Shield",
	Range="Gjallarhorn",
    head="Fili calot +2",
    body="Fili Hongreline +2",
    hands="Fili Manchettes +2",
    legs="Inyanga Shalwar +2",
    feet="Brioso Slippers +3",
    neck="Moonbow Whistle +1",
    waist="Kobo Obi",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},}

	sets.Midcast.March = {hands="Fili Manchettes +2"}
	sets.Midcast.Minuet = {body="Fili Hongreline +2"}
	sets.Midcast.Madrigal = {head="Fili calot +2", back="Intarabus's Cape"}
	sets.Midcast.Etude = {head="Mousai turban +1"}
	sets.Midcast.Ballad = {legs="Fili Rhingrave +2"}
	sets.Midcast.Scherzo = {feet="Fili Cothurnes +2"}
	sets.Midcast.Carol = {hands="Mousai gages +1"}
	sets.Midcast.Minne = {legs="Mousai seraweels +1"}
	sets.Midcast.Mambo = {feet="Mousai crackows +1"}
	sets.Midcast.Paeon = {head="Brioso roundlet +3"}
	sets.Midcast.Finale = {}
	sets.Midcast.Lullaby = {hands="Brioso cuffs +3"}
	sets.Midcast.Prelude = {back="Intarabus's Cape"}

	-- Cure Set --
	sets.Midcast.Cure = {main="Sangoma",
    sub="Genmei Shield",
    head={ name="Vanya Hood", augments={'MP+50','"Cure" potency +7%','Enmity-6',}},
    body="Vrikodara Jupon",
    hands="Inyan. Dastanas +2",
    legs="Gyve Trousers",
    feet={ name="Chironic Slippers", augments={'Accuracy+8','Accuracy+7 Attack+7','"Refresh"+1',}},
    neck="Nodens Gorget",
    waist="Hachirin-no-Obi",
    left_ear="Gifted Earring",
    right_ear="Loquac. Earring",
    left_ring="Lebeche Ring",
    right_ring="Sirona's Ring",
    back="Solemnity Cape",}

	-- Curaga Set --
	sets.Midcast.Curaga = sets.Midcast.Cure

	-- Haste Set --
	sets.Midcast.Haste = set_combine(sets.Precast.FastCast,{waist="Embla sash",})

	-- Cursna Set --
	sets.Midcast.Cursna = set_combine(sets.Midcast.Haste,{})
			
	sets.Midcast['Enhancing Magic'] = {waist="Embla sash",}

			
	sets.Midcast['Enhancing Magic'].Duration = set_combine(sets.Midcast['Enhancing Magic'], {waist="Embla sash",})
	
	sets.Midcast['Enfeebling Magic'] = sets.Midcast.WindDebuff

	-- JA Sets --
	sets.JA = {}
	sets.JA.Nightingale = {feet="Bihu Slippers +3"}
	sets.JA.Troubadour = {body="Bihu justaucorps +3"}
	sets.JA["Soul Voice"] = {legs="Bihu Cannions +3"}

	-- Waltz --
	sets.Waltz = {}

	-- Melee Sets --
	
    sets.Melee={}	

   sets.WS={}
	
	sets.Melee = {}
	--sets.Melee.MidACC = set_combine(sets.Melee,{
		--left_ear="Zennaroi Earring",
		--left_ring="Chirich Ring",
		--right_ring="Chirich Ring",})
	--sets.Melee.HighACC = set_combine(sets.Melee.MidACC,{})>

	-- WS Base Set --
	--sets.WS = sets.Melee

	sets.WS.Exenterator = sets.WS
	sets.WS.Exenterator.MidACC = set_combine(sets.WS.Exenterator,{})
	sets.WS.Exenterator.HighACC = set_combine(sets.WS.Exenterator.MidACC,{})

	sets.WS.Evisceration = sets.WS
	sets.WS.Evisceration.MidACC = set_combine(sets.WS.Evisceration,{})
	sets.WS.Evisceration.HighACC = set_combine(sets.WS.Evisceration.MidACC,{})

	sets.WS["Mercy Stroke"] = sets.WS
	sets.WS["Mercy Stroke"].MidACC = set_combine(sets.WS["Mercy Stroke"],{})
	sets.WS["Mercy Stroke"].HighACC = set_combine(sets.WS["Mercy Stroke"].MidACC,{})

	sets.WS["Rudra's Storm"] = sets.WS
	sets.WS["Rudra's Storm"].MidACC = set_combine(sets.WS["Rudra's Storm"],{})
	sets.WS["Rudra's Storm"].HighACC = set_combine(sets.WS["Rudra's Storm"].MidACC,{})

	sets.WS["Mordant Rime"] = {main="Carnwenhan",
    sub="Demers. Degen +1",
    range="Gjallarhorn",
    head="Brioso Roundlet +3",
    body={ name="Bihu Jstcorps. +3", augments={'Enhances "Troubadour" effect',}},
    hands="Brioso Cuffs +3",
    legs={ name="Bihu Cannions +3", augments={'Enhances "Soul Voice" effect',}},
    feet={ name="Bihu Slippers +3", augments={'Enhances "Nightingale" effect',}},
    neck="Mnbw. Whistle +1",
    waist="Fotia Belt",
    left_ear="Ishvara Earring",
    right_ear="Brutal Earring",
    left_ring="Petrov Ring",
    right_ring="Hetairoi Ring",
    back={ name="Intarabus's Cape", augments={'CHR+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10','Damage taken-5%',}},
}

	-- Lock Capa Mantle --
	sets.Capa = {
			back="Mecisto. Mantle"}
	
end

function pretarget(spell,action)
end

function precast(spell,action)
	if spell.action_type == 'Magic' then
		if buffactive.silence or spell.target.distance > 16+target_distance then -- Cancel Magic or Ninjutsu or BardSong If You Are Silenced or Out of Range --
			cancel_spell()
			add_to_chat(123, spell.name..' Canceled: [Silenced or Out of Casting Range]')
			return
		else
			if spell.english == "Honor March" then
				equip(set_combine(sets.Precast.Song,{range="Marsyas"}))
			elseif spell.type == 'BardSong' then
				equip(sets.Precast.Song)
			elseif string.find(spell.english,'Cur') and spell.english ~= "Cursna" then
				equip(sets.Precast.Cure)
			elseif string.find(spell.english,'Utsusemi') then
				if buffactive['Copy Image (3)'] or buffactive['Copy Image (4)'] then
					cancel_spell()
					add_to_chat(123, spell.english .. ' Canceled: [3+ Images]')
					return
				else
					equip(sets.Precast.FastCast)
				end
			else
				equip(sets.Precast.FastCast)
			end
		end
	elseif spell.type == "WeaponSkill" then
		if player.status ~= 'Engaged' then -- Cancel WS If You Are Not Engaged. Can Delete It If You Don't Need It --
			cancel_spell()
			add_to_chat(123,'Unable To Use WeaponSkill: [Disengaged]')
			return
		else
			equipSet = sets.WS
			if equipSet[spell.english] then
				equipSet = equipSet[spell.english]
			end
			if equipSet[AccArray[AccIndex]] then
				equipSet = equipSet[AccArray[AccIndex]]
			end
			equip(equipSet)
		end
	elseif spell.type == "JobAbility" then
		if sets.JA[spell.english] then
			equip(sets.JA[spell.english])
		end
	elseif spell.type == "Waltz" then
		refine_waltz(spell,action)
		equip(sets.Waltz)
	elseif spell.english == 'Spectral Jig' and buffactive.Sneak then
		cast_delay(0.2)
		send_command('cancel Sneak')
	end
end

function midcast(spell,action)
	equipSet = {}
	if spell.type:endswith('Magic') or spell.type == 'Ninjutsu' then
		equipSet = sets.Midcast
		if equipSet[spell.english] then
			equipSet = equipSet[spell.english]
		elseif string.find(spell.english,'Cure') then
			equipSet = equipSet.Cure
		elseif string.find(spell.english,'Cura') then
			equipSet = equipSet.Curaga
		elseif spell.english == "Stoneskin" then
			if buffactive.Stoneskin then
				send_command('@wait 2.8;cancel stoneskin')
			end
			equipSet = equipSet.Stoneskin
		elseif spell.english == "Sneak" then
			if spell.target.name == player.name and buffactive['Sneak'] then
				send_command('cancel sneak')
			end
			equipSet = equipSet.Haste
		elseif string.find(spell.english,'Utsusemi') then
			if spell.english == 'Utsusemi: Ichi' and (buffactive['Copy Image'] or buffactive['Copy Image (2)']) then
				send_command('@wait 1.7;cancel Copy Image*')
			end
			equipSet = equipSet.Haste
		elseif spell.english == 'Monomi: Ichi' then
			if buffactive['Sneak'] then
				send_command('@wait 1.7;cancel sneak')
			end
			equipSet = equipSet.Haste
		end
		if Duration_buffs:contains(spell.english) then
				equipSet = sets.Midcast['Enhancing Magic'].Duration
		end
	elseif spell.type == 'BardSong' then
		equip_song_gear(spell)
	end
	equip(equipSet)
	if TH == 'ON' then
		equip(sets.TH)
	end
end

function aftercast(spell,action)
	status_change(player.status)
end

function status_change(new,old)
	if Armor == 'PDT' then
		equip(sets.PDT)
		if Kiting == 'ON' then
			equip({feet="Fili Cothurnes +2"})
		end
	elseif Armor == 'MDT' then
		equip(sets.MDT)
		if Kiting == 'ON' then
			equip({feet="Fili Cothurnes +2"})
		end
	elseif new == 'Engaged' then
		equipSet = sets.Melee
		if equipSet[AccArray[AccIndex]] then
			equipSet = equipSet[AccArray[AccIndex]]
		end
		equip(equipSet)
	elseif new == 'Idle' then
		equip(sets.Idle)
		if Kiting == 'ON' then
			equip({feet="Fili Cothurnes +2"})
		end
	elseif new == 'Resting' then
		equip(sets.Resting)
	end
	if Capa == 'ON' then
		equip(sets.Capa)
	end
	if TH == 'ON' then
		equip(sets.TH)
	end
	if dyna == 'ON' then
		equip(sets.Dyna)
	end
end

function buff_change(buff,gain)
	buff = string.lower(buff)
	if buff == 'weakness' then -- Weakness Timer --
		if gain then
			send_command('timers create "Weakness" 300 up')
		else
			send_command('timers delete "Weakness"')
		end
	end
	if not midaction() then
		status_change(player.status)
	end
end

-- In Game: //gs c (command), Macro: /console gs c (command), Bind: gs c (command) --
function self_command(command)
	if command == 'March2' then
		send_command('input /ma "Victory March" <me>')
		add_to_chat(158,'Melee Speed II: [Victory March]')
	elseif command == 'March1' then
		send_command('input /ma "Advancing March" <me>')
		add_to_chat(158,'Melee Speed: [Advancing March]')
	elseif command == 'Minuet5' then
		send_command('input /ma "Valor Minuet V" <me>')
		add_to_chat(158,'Melee Attack: [Valor Minuet V]')
	elseif command == 'Minuet4' then
		send_command('input /ma "Valor Minuet IV" <me>')
		add_to_chat(158,'Melee Attack: [Valor Minuet IV]')
	elseif command == 'Prelude1' then
		send_command('input /ma "Hunter\'s Prelude" <me>')
		add_to_chat(158,'Ranged Accuracy: [Hunter\'s Prelude]')
	elseif command == 'Prelude2' then
		send_command('input /ma "Archer\'s Prelude" <me>')
		add_to_chat(158,'Ranged Accuracy: [Archer\'s Prelude]')
	elseif command == 'Madrigal2' then
		send_command('input /ma "Blade Madrigal" <me>')
		add_to_chat(158,'Melee Accuracy II: [Blade Madrigal]')
	elseif command == 'Madrigal1' then
		send_command('input /ma "Sword Madrigal" <me>')
		add_to_chat(158,'Melee Accuracy: [Sword Madrigal]')
	elseif command == 'Minuet3' then
		send_command('input /ma "Valor Minuet III" <me>')
		add_to_chat(158,'Melee Attack: [Valor Minuet III]')
	elseif command == 'Mazurka' then
		send_command('input /ma "Chocobo Mazurka" <me>')
		add_to_chat(158,'~~~ Mazurka ~~~')
	elseif command == 'Capacity' then -- Capa Back Toggle --
		if Capa == 'ON' then
			Capa = 'OFF'
			add_to_chat(123,'Capacity Mantle: [Unlocked]')
		else
			Capa = 'ON'
			add_to_chat(158,'Capacity Mantle: [Locked]')
		end
		status_change(player.status)
	elseif command == 'PDT' then
		if Armor == 'PDT' then -- PDT Toggle --
			Armor = 'None'
			add_to_chat(123,'PDT Set: [Unlocked]')
		else
			Armor = 'PDT'
			add_to_chat(158,'PDT Set: [Locked]')
		end
		status_change(player.status)
	elseif command == 'MDT' then
		if Armor == 'MDT' then -- MDT Toggle --
			Armor = 'None'
			add_to_chat(123,'MDT Set: [Unlocked]')
		else
			Armor = 'MDT'
			add_to_chat(158,'MDT Set: [Locked]')
		end
		status_change(player.status)
	elseif command == 'Distance' then -- Distance Toggle --
		if player.target.distance then
			target_distance = math.floor(player.target.distance*10)/10
			add_to_chat(158,'Distance: '..target_distance)
		else
			add_to_chat(123,'No Target Selected')
		end
	elseif command == 'Daur' or command == 'Daurdabla' then -- Daurdabla Toggle --
		if Daurdabla == 'ON' then
			Daurdabla = 'OFF'
			add_to_chat(123,'Daurdabla: [OFF]')
		else
			Daurdabla = 'ON'
			add_to_chat(158,'Daurdabla: [ON]')
		end
		status_change(player.status)
	elseif command == 'TH' then -- Full TH Set Toggle --
		if TH == 'ON' then
			TH = 'OFF'
			add_to_chat(123,'Full TH Set: [Unlocked]')
		else
			TH = 'ON'
			add_to_chat(158,'Full TH Set: [Locked]')
		end
		status_change(player.status)
	elseif command == 'duration' then
		if maxduration == 'ON' then
			maxduration = 'OFF'
			add_to_chat(123, 'Max debuff duration: [OFF]')
		else
			maxduration = 'ON'
			add_to_chat(158, 'Max debuff duration: [ON]')
		end
	elseif command == 'Acc' then -- Accuracy Level Toggle --
		AccIndex = (AccIndex % #AccArray) + 1
		status_change(player.status)
		add_to_chat(158,'Accuracy Level: ' .. AccArray[AccIndex])
	elseif command == 'Update' then -- Auto Update Gear Toggle --
		status_change(player.status)
		add_to_chat(158,'Auto Update Gear')
	elseif command == "Dyna" then
		dyna = 'ON'
		add_to_chat(158,'Dyna neck locked')
	elseif command:match('^SC%d$') then
		send_command('//' .. sc_map[command])
	end
end

function equip_song_gear(spell)
	if DaurdSongs:contains(spell.english) then
		equip(set_combine(sets.Precast.Song,{range="Daurdabla"}))
		add_to_chat(158,'Daurdabla: [OFF]')
	else
		if spell.target.type == 'MONSTER' then
			if maxduration == 'ON' then
				equip(sets.Midcast.WindDebuff.Duration)
				if string.find(spell.english,'Lullaby') then equip(sets.Midcast.Lullaby) end
				if string.find(spell.english,'Horde Lullaby') then equip({range="Daurdabla"}) end
			else
				equip(sets.Midcast.WindDebuff)
				if string.find(spell.english,'Finale') then equip(sets.Midcast.Finale) end
				if string.find(spell.english,'Foe Lullaby') then equip(sets.Midcast.Lullaby) end
				if string.find(spell.english,'Horde Lullaby') then equip(set_combine(sets.Midcast.Lullaby, {range="Daurdabla"})) end
			end
		else
			equip(sets.Midcast.WindBuff)
			if string.find(spell.english,'March') then 
				equip(sets.Midcast.March)
				if spell.english == "Honor March" then
					equip({range="Marsyas"})
				end
			end
			if string.find(spell.english,'Minuet') then equip(sets.Midcast.Minuet) end
			if string.find(spell.english,'Madrigal') then equip(sets.Midcast.Madrigal) end
			if string.find(spell.english,'Ballad') then equip(sets.Midcast.Ballad) end
			if string.find(spell.english,'Scherzo') then equip(sets.Midcast.Scherzo) end
			if string.find(spell.english,'Mazurka') then equip(sets.Midcast.Mazurka) end
			if string.find(spell.english,'Etude') then equip(sets.Midcast.Etude) end
			if string.find(spell.english,'Minne') then equip(sets.Midcast.Minne) end
			if string.find(spell.english,'Carol') then equip(sets.Midcast.Carol) end
			if string.find(spell.english,'Mambo') then equip(sets.Midcast.Mambo) end
			if string.find(spell.english,'Paeon') then equip(sets.Midcast.Paeon) end
		end
		if Daurdabla == 'ON' then
			equip({range="Daurdabla"})
		end
	end
end

function refine_waltz(spell,action)
	if spell.type ~= 'Waltz' then
		return
	end

	if spell.name == "Healing Waltz" or spell.name == "Divine Waltz" then
		return
	end

	local newWaltz = spell.english
	local waltzID

	local missingHP

	if spell.target.type == "SELF" then
		missingHP = player.max_hp - player.hp
	elseif spell.target.isallymember then
		local target = find_player_in_alliance(spell.target.name)
		local est_max_hp = target.hp / (target.hpp/100)
		missingHP = math.floor(est_max_hp - target.hp)
	end

	if missingHP ~= nil then
		if player.sub_job == 'DNC' then
			if missingHP < 40 and spell.target.name == player.name then
				add_to_chat(123,'Full HP!')
				cancel_spell()
				return
			elseif missingHP < 150 then
				newWaltz = 'Curing Waltz'
				waltzID = 190
			elseif missingHP < 300 then
				newWaltz = 'Curing Waltz II'
				waltzID = 191
			else
				newWaltz = 'Curing Waltz III'
				waltzID = 192
			end
		else
			return
		end
	end

	local waltzTPCost = {['Curing Waltz'] = 20, ['Curing Waltz II'] = 35, ['Curing Waltz III'] = 50}
	local tpCost = waltzTPCost[newWaltz]

	local downgrade

	if player.tp < tpCost then

		if player.tp < 20 then
			add_to_chat(123, 'Insufficient TP ['..tostring(player.tp)..']. Cancelling.')
			cancel_spell()
			return
		elseif player.tp < 35 then
			newWaltz = 'Curing Waltz'
		elseif player.tp < 50 then
			newWaltz = 'Curing Waltz II'
		end

		downgrade = 'Insufficient TP ['..tostring(player.tp)..']. Downgrading to '..newWaltz..'.'
	end

	if newWaltz ~= spell.english then
		send_command('@input /ja "'..newWaltz..'" '..tostring(spell.target.raw))
		if downgrade then
			add_to_chat(8, downgrade)
		end
		cancel_spell()
		return
	end

	if missingHP > 0 then
		add_to_chat(8,'Trying to cure '..tostring(missingHP)..' HP using '..newWaltz..'.')
	end
end

function find_player_in_alliance(name)
	for i,v in ipairs(alliance) do
		for k,p in ipairs(v) do
			if p.name == name then
				return p
			end
		end
	end
end

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

-- 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, 4)
    elseif player.sub_job == 'RDM' then
        set_macro_page(1, 4)
    elseif player.sub_job == 'WHM' then
        set_macro_page(1, 4)
    else
        set_macro_page(1, 4)
    end
end

 Bismarck.Radec
Offline
Server: Bismarck
Game: FFXI
User: Radec
Posts: 179
By Bismarck.Radec 2025-12-20 07:39:18
Link | Quote | Reply
 
Long shot, do you have both of Shortcuts and Rolltracker loaded?

Intermittently I'd have that issue, but with emotes doubling up (/hurray, etc) possibly depending on which addon loaded first.

Try unloading rolltracker. If the doubling stops, play with the load order for those two addons, or anything else you have loaded that uses the "outgoing text" event.
 Ragnarok.Lancextrm
Offline
Server: Ragnarok
Game: FFXI
User: Lancextrm
Posts: 8
By Ragnarok.Lancextrm 2025-12-20 09:33:44
Link | Quote | Reply
 
I just tried, didn't work, even reloaded gear swap
Offline
By Shichishito 2025-12-29 21:57:29
Link | Quote | Reply
 
The important part is the EnchantmentLockMode, I just left the RangeWeaponLockMode part for context as its mentioned inside the Enchantment section.

The Hoxne Ampulla swap works but for some reason PrishBoots, ReraiseRing, WarpRing and TeleportMea ring all don't swap to their respective items. Any idea where I'm failing (other than life)? I put the /echos in there to verify whether the condition checks get triggered and they do, all /echos get thru, just the swaps do not happen.
Code
function user_setup()
    -- Locks or unlocks slots depending on desired enchantment
    state.EnchantmentLockMode = M{['description']='Enchantment Mode', 'None','HoxneAmpulla', 'PrisheBoots',
    'ReraiseRing', 'WarpRing', 'TeleportMea'}
end


function init_gear_sets()
    -- EnchantmentMode sets
    sets.HoxneAmpulla = {range=empty,ammo="Hoxne Ampulla"}
    sets.PrisheBoots = {feet="Prishe's Boots +1"}
    sets.ReraiseRing = {ring2="Reraise Ring"}
    sets.WarpRing = {ring1="Warp Ring"}
    sets.TeleportMea = {ring1="Dimensional Ring (Mea)"}
end


function job_buff_change(buff, gain)    
    -- Hoxne Ampulla logic
    if buff == "enchantment" then
        if gain then
            windower.send_command('@input /echo Hoxne Ampulla enchantment is now active, Gil getting tossed.')
            disable('range','ammo')
        else
            enable('range','ammo')
            windower.send_command('@input /echo Hoxne Ampulla enchantment inactive')
        end
    end
end


function job_state_change(stateField, newValue, oldValue)
    -- RangeWeaponLockMode
    -- Called range and ammo slots are locked by toggling ^@w (control + windows button + w)
    if state.RangeWeaponLockMode.value == "RangeNone" then
        enable('range','ammo')
        equip(sets.RangeNone)
    elseif state.RangeWeaponLockMode.value == "JinxDiscus" then
        enable('range','ammo')
        equip(sets.JinxDiscus)
        disable('range','ammo')
    elseif state.RangeWeaponLockMode.value == "RangeEmpty" then
        enable('range','ammo')
        equip(sets.RangeEmpty)
        disable('range','ammo')
    end

--------------------------- RELEVANT PART STARTS HERE ---------------------------
    -- EnchantmentLockMode
    -- Locks slots depend on desired enchantment by toggling @e (Windows button + e)
    if state.EnchantmentLockMode.value == "HoxneAmpulla" then
        enable('range','ammo')
        equip(sets.HoxneAmpulla)
		disable('range','ammo')
        send_command('wait 6;input /item "Hoxne Ampulla" <me>')
        
        if state.RangeWeaponLockMode.value ~= "RangeNone" then
            windower.send_command('@input /echo RangeWeaponLockMode toggle only available if EnchantmentLockMode is not "HoxneAmpulla"')
        end
    
    elseif state.EnchantmentLockMode.value == "PrisheBoots" then
        enable('feet')
        equip(sets.PrisheBoots)
        windower.send_command('@input /echo TPBoots')
        --send_command('wait 6;input /item "Prish'"s Boots +1" '<me>')
    elseif state.EnchantmentLockMode.value == "ReraiseRing" then
        enable('ring2')
        equip(sets.ReraiseRing)
        windower.send_command('@input /echo Reraise Ring')
        --send_command('wait 31;input /item "Prish'"s Boots +1" '<me>')
    elseif state.EnchantmentLockMode.value == "WarpRing" then
        enable('ring1')
        equip(sets.WarpRing)
        windower.send_command('@input /echo Warp Ring')
        --send_command('wait 9;input /item "Warp Ring" '<me>')
    elseif state.EnchantmentLockMode.value == "TeleportMea" then
        enable('ring1')
        equip(sets.TeleportMea)
        windower.send_command('@input /echo TeleportMea Ring')
        --send_command('wait 9;input /item "Dimensional Ring (Mea)" '<me>')
        
    end

end


I also attempted to move the items out of wardrobes into main inventory cause I read enchantment items can cause trouble when stored in wardrobes but it didn't help.
Offline
Posts: 9
By Umberto 2026-01-12 00:01:36
Link | Quote | Reply
 
Hey all,

I'm having this strange issue where //gs disable waist refuses to work. If I type it in then gearswap will say it's disabled but my equipment changes continue to go through. This is the only piece of gear that swaps after being disabled, I've tested it on all other pieces of equipment and it functions properly EXCEPT on the waist slot???

I can't for the life of me figure out where this is going wrong. I've attached my gearswap. If anyone is able to offer any insight or assistance it's greatly appreciated!

EDIT: I just noticed now that it's also happening with body & legs & feet?! I'm so lost as to why //gs disable only works with certain pieces and not others...

Thank you
Code
-------------------------------------------------------------------------------------------------------------------
--  Keybinds
-------------------------------------------------------------------------------------------------------------------

--				[ F9 ]              Cycle Offense modes
--              [ CTRL+F9 ]         Cycle Hybrid modes
--              [ WIN+F9 ]          Cycle Weapon Skill modes
--              [ F10 ]             Emergency DT mode
--              [ ALT+F10 ]         Toggle Kiting mode
--              [ F11 ]             Emergency MEVA mode
--              [ CTRL+F11 ]        Cycle Casting modes
--              [ F12 ]             Update current gear / Report current status
--              [ CTRL+F12 ]        Cycle Idle modes
--              [ ALT+F12 ]         Cancel Emergency mode

--				[ WIN+E/R ]         Cycles between Melee Weapons
--              [ WIN+W ]           Toggle Weapon Lock

--              [ WIN+` ]           Toggle Treasure Hunter mode
--              [ ALT+` ]           Toggle Magic Burst mode

-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job.
-------------------------------------------------------------------------------------------------------------------

-- Initialization function for this job file.
function get_sets()
    mote_include_version = 2
    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['Sublimation: Activated'] = buffactive['Sublimation: Activated'] or false

	no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)"}
	
	degrade_array = {
        ['Aspirs'] = {'Aspir','Aspir II'}
        }
	
	-- Physical WS mappings.
	physical_ws = S{"Combo", "Shoulder Tackle", "One Inch Punch", "Backhand Blow", "Raging Fists", "Spinning Attack", "Howling Fist", "Dragon Kick",
		"Asuran Fists", "Tornado Kick", "Shijin Spiral", "Final Heaven", "Victory Smite", "Ascetic's Fury", "Stringing Pummel", "Maru Kala",
		"Wasp Sting", "Shadowstitch", "Viper Bite", "Dancing Edge", "Shark Bite", "Evisceration", "Exenterator", "Mercy Stroke", "Rudra's Storm",
		"Mandalic Stab", "Mordant Rime", "Pyrrhic Kleos", "Ruthless Stroke", "Fast Blade", "Flat Blade", "Circle Blade", "Vorpal Blade", "Swift Blade",
		"Savage Blade", "Requiescat", "Knights of Round", "Chant du Cygne", "Death Blossom", "Expiacion", "Imperator", "Hard Slash", "Power Slash",
		"Shockwave", "Crescent Moon", "Sickle Moon", "Spinning Slash", "Ground Strike", "Resolution", "Scourge", "Torcleaver", "Dimidation", "Fimbulvetr",
		"Raging Axe", "Smash Axe", "Gale Axe", "Avalanche Axe", "Spinning Axe", "Rampage", "Calamity", "Mistral Axe", "Decimation", "Bora Axe",
		"Ruinator", "Onslaught", "Blitz", "Slice", "Nightmare Scythe", "Spinning Scythe", "Vorpal Scythe", "Guillotine", "Cross Reaper", "Sprial Hell",
		"Entropy", "Catastrophe", "Quietus", "Insurgency", "Origin", "Double Thrust", "Leg Sweep", "Penta Thrust", "Vorpal Thrust", "Skewer",
		"Wheeling Thrust", "Impulse Drive", "Sonic Thrust", "Stardiver", "Geirskogul", "Camlann's Torment", "Drakesbane", "Diarmuid", "Blade: Rin",
		"Blade: Retsu", "Blade: Jin", "Blade: Ten", "Blade: Ku", "Blade: Shun", "Blade: Metsu", "Blade: Hi", "Blade: Kamu", "Zesho Meppo", "Tachi: Enpi",
		"Tachi: Hobaku", "Tachi: Yukikaze", "Tachi: Gekko", "Tachi: Kasha", "Tachi: Ageha", "Tachi: Shoha", "Tachi: Kaiten", "Tachi: Fudo", "Tachi: Rana",
		"Tachi: Mumei", "Brainshaker", "Starlight", "Moonlight", "Skullbreaker", "True Strike", "Judgment", "Hexa Strike", "Black Halo", "Realmrazer",
		"Randgrith", "Dagan", "Mystic Boon", "Exudation", "Dagda", "Heavy Swing", "Shell Crusher", "Full Swing", "Spirit Taker", "Retribution",
		"Shattersoul", "Gate of Tartarus", "Myrkr", "Oshala", "Piercing Arrow", "Dulling Arrow", "Sidewinder", "Blast Arrow", "Arching Arrow",
		"Empyreal Arrow", "Refulgent Arrow", "Apex Arrow", "Namas Arrow", "Jishnu's Radiance", "Sarv", "Split Shot", "Sniper Shot", "Slug Shot",
		"Blast Shot", "Heavy Shot", "Detonator", "Numbing Shot", "Last Stand", "Coronach", "Terminus", "Slapstick", "String Clipper", "Chimera Ripper",
		"Knockout", "Cannibal Blade", "Bone Crusher", "String Shredder", "Arcuballista", "Daze", "Armor Piercer", "Armor Shatterer"}
	
	-- Elemental & Hybrid WS mappings.
    elemental_ws = S{"Gust Slash", "Cyclone", "Energy Steal", "Energy Drain", "Aeolian Edge", "Burning Blade", "Red Lotus Blade", "Shining Blade",
		"Seraph Blade", "Spirits Within", "Sanguine Blade", "Atonement", "Frostbite", "Freezebite", "Herculean Slash", "Cloudsplitter", "Primal Rend",
		"Dark Harvest", "Shadow of Death", "Infernal Scythe", "Thunder Thrust", "Raiden Thrust", "Blade: Teki", "Blade: To", "Blade: Chi", "Blade: Ei",
		"Blade: Yu", "Tachi: Goten", "Tachi: Kagero", "Tachi: Jinpu", "Tachi: Koki", "Shining Strike", "Seraph Strike", "Flash Nova", "Rock Crusher",
		"Earth Crusher", "Starburst", "Sunburst", "Cataclysm", "Vidohunir", "Garland of Bliss", "Omniscience", "Flaming Arrow", "Hot Shot", "Wildfire",
		"Trueflight", "Leaden Salute", "Magic Mortar"}

    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 = 14
end

-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------

-- Setup vars that are user-dependent.
function user_setup()
    state.OffenseMode:options('NORMAL', 'ACC')
    state.HybridMode:options('NORMAL', 'DT')
    state.WeaponskillMode:options('NORMAL', 'MAX')
	state.PhysicalDefenseMode:options("DT")
    state.MagicalDefenseMode:options("MEVA")
    state.CastingMode:options('NORMAL', 'SIRD')
    state.IdleMode:options('NORMAL', 'REFRESH', 'REGEN', 'AMINON')
	
	state.WeaponSet = M{['description']='Weapon Set', 'Idris', "Maxentius"}
    state.WeaponLock = M(false, 'Weapon Lock')
	
    state.MagicBurst = M(false, 'Magic Burst')
	
	-- Additional local binds.
    send_command('bind @` gs c cycle treasuremode')
    send_command('bind !` gs c toggle MagicBurst')
	
	send_command('bind @w gs c toggle WeaponLock')
    send_command('bind @e gs c cycleback WeaponSet')
    send_command('bind @r gs c cycle WeaponSet')

    select_default_macro_book()
    set_lockstyle()
	
	-- Gearinfo functions.
    state.Auto_Kite = M(false, 'Auto_Kite')
    Haste = 0
    DW_needed = 0
    DW = false
    moving = false
    update_combat_form()
    determine_haste_group()
	
	-- WS out of range cancel distance.	
	target_distance = 6
end

-- Called when this job file is unloaded (eg: job change).
function user_unload()
	send_command('clearbinds')
	send_command('lua u GearInfo')
end

-------------------------------------------------------------------------------------------------------------------
-- Define sets and vars used by this job file.
-------------------------------------------------------------------------------------------------------------------

function init_gear_sets()

	------------------------------------------------------------------------------------------------
	---------------------------------------- Gear Variables ----------------------------------------
	------------------------------------------------------------------------------------------------

	gear.nantosueltaPET = {name="Nantosuelta's Cape", augments={'VIT+20','Eva.+20 /Mag. Eva.+20','Mag. Evasion+10','Pet: "Regen"+10','Pet: "Regen"+5',}}
	gear.nantosueltaNUKE = {name="Nantosuelta's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','"Mag.Atk.Bns."+10','Pet: Phys. dmg. taken-10%',}}

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

    sets.precast.JA['Bolster'] = {waist="Bagua Tunic +3"}
	
	sets.precast.JA['Full Circle'] = {waist="Azimuth Hood +3"}
	
	sets.precast.JA['Life Cycle'] = {body="Geomancy Tunic +3", back=gear.nantosueltaPET}
	
	sets.precast.JA['Mending Halation'] = {waist="Bagua Pants +3"}
	
	sets.precast.JA['Radial Arcana'] = {waist="Bagua Sandals +3"}
	
	sets.precast.JA['Concentric Pulsa'] = {waist="Bagua Galero +3"}
	
	sets.precast.JA['Sublimation'] = {waist="Embla Sash"}
	
	sets.precast.Waltz = {
		ammo="Yamarang",
		head="Mummu Bonnet +2",
		neck="Loricate Torque +1",
		ear1="Odnowa Earring +1",
		ear2="Etiolation Earring",
		body="Passion Jacket",
		hands="Slither Gloves +1",
		ring1="Valseur's Ring",
		ring2="Asklepian Ring",
		back=gear.rosmertaFC,
		waist="Platinum Moogle Belt",
		legs="Dashing Subligar",
		feet="Rawhide Boots",
        }

    sets.precast.Waltz['Healing Waltz'] = set_combine(sets.idle, {legs="Dashing Subligar"})

    sets.precast.FC = {
        main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Amalric Coif +1",
		neck="Incanter's Torque", 
		ear1="Malignance Earring", 
		ear2="Odnowa Earring +1",	
		body="Agwu's Robe",
        hands="Agwu's Gages",
		ring1="Murky Ring",
        ring2="Defending Ring",
		back="Lifestream Cape", 
		waist="Shinjutsu-no-Obi +1",
		legs="Bagua Pants +3",
        feet="Azimuth Gaiters +3",
		}
		
	sets.precast.FC.SIRD = {
        main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Amalric Coif +1",
		neck="Incanter's Torque", 
		ear1="Malignance Earring", 
		ear2="Odnowa Earring +1",	
		body="Agwu's Robe",
        hands="Agwu's Gages",
		ring1="Murky Ring",
        ring2="Defending Ring",
		back="Lifestream Cape", 
		waist="Shinjutsu-no-Obi +1",
		legs="Bagua Pants +3",
        feet="Azimuth Gaiters +3",
		}
		
	sets.precast.FC.Utsusemi = sets.precast.FC

    sets.precast.FC.Impact = set_combine(sets.precast.FC, {head=empty, body="Crepuscular Cloak"})
	
    sets.precast.FC['Dispelga'] = set_combine(sets.precast.FC, {main="Daybreak", sub="Ammurapi Shield"})

	------------------------------------------------------------------------------------------------
	---------------------------------------- Weapon Skill Sets -------------------------------------
	------------------------------------------------------------------------------------------------
	
    sets.precast.WS = {
        head="Nyame Helm",
		neck="Null Loop",
		ear1="Moonshade Earring",
        ear2="Regal Earring",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Prosilio Belt +1",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }

    sets.precast.WS.MAX = {
        head="Nyame Helm",
		neck="Null Loop",
		ear1="Moonshade Earring",
        ear2="Regal Earring",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Fotia Belt",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }
		
	sets.precast.WS['Black Halo'] = {
        head="Nyame Helm",
		neck="Null Loop",
		ear1="Moonshade Earring",
        ear2="Regal Earring",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Prosilio Belt +1",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }
		
	sets.precast.WS['Black Halo'].MAX = {
        head="Nyame Helm",
		neck="Null Loop",
		ear1="Moonshade Earring",
        ear2="Regal Earring",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Fotia Belt",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }
		
	sets.precast.WS['Judgement'] = {
        head="Nyame Helm",
		neck="Null Loop",
		ear1="Moonshade Earring",
        ear2="Regal Earring",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Prosilio Belt +1",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }
		
	sets.precast.WS['Judgement'].MAX = {
        head="Nyame Helm",
		neck="Null Loop",
		ear1="Moonshade Earring",
        ear2="Regal Earring",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Fotia Belt",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }
		
	sets.precast.WS['Exudation'] = {
        head="Nyame Helm",
		neck="Fotia Gorget",
		ear1="Regal Earring",
        ear2="Dominance Earring +1",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Fotia Belt",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }
		
	sets.precast.WS['Exudation'].MAX = {
        head="Nyame Helm",
		neck="Fotia Gorget",
		ear1="Regal Earring",
        ear2="Dominance Earring +1",
        body="Nyame Mail",
        hands="Nyame Gauntlets",
        ring1="Cornelia's Ring",
		ring2="Epaminondas's Ring",
        back="Alabaster Mantle",
        waist="Fotia Belt",
		legs="Nyame Flanchard",
        feet="Nyame Sollerets",
        }		

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

    sets.midcast.FastRecast = sets.precast.FC
	
	sets.midcast.SIRD = sets.precast.FC.SIRD
	
	sets.midcast.Utsusemi = sets.precast.FC.Utsusemi
	
    sets.midcast.Cure = {    
        main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Hydrocera",
        head="Vanya Hood",
		neck="Incanter's Torque", 
		ear1="Meili Earring", 
		ear2="Mendicant's Earring", 	
		body="Vrikodara Jupon",
        hands="Telchine Gloves",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Oretania's Cape +1", 
		waist="Luminary Sash", 
		legs="Vanya Slops",
        feet="Vanya Clogs",
		}
		
	sets.midcast.Cure.SIRD = {    
        main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Hydrocera",
        head="Vanya Hood",
		neck="Incanter's Torque", 
		ear1="Meili Earring", 
		ear2="Mendicant's Earring", 	
		body="Vrikodara Jupon",
        hands="Telchine Gloves",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Oretania's Cape +1", 
		waist="Luminary Sash", 
		legs="Vanya Slops",
        feet="Vanya Clogs",
		}	
		
	sets.midcast.CureSelf = {    
        main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Hydrocera",
        head="Vanya Hood",
		neck="Incanter's Torque", 
		ear1="Meili Earring", 
		ear2="Mendicant's Earring", 	
		body="Vrikodara Jupon",
        hands="Telchine Gloves",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Oretania's Cape +1", 
		waist="Luminary Sash", 
		legs="Vanya Slops",
        feet="Vanya Clogs",
		}
		
	sets.midcast.CureSelf.SIRD = {    
        main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Hydrocera",
        head="Vanya Hood",
		neck="Incanter's Torque", 
		ear1="Meili Earring", 
		ear2="Mendicant's Earring", 	
		body="Vrikodara Jupon",
        hands="Telchine Gloves",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Oretania's Cape +1", 
		waist="Luminary Sash", 
		legs="Vanya Slops",
        feet="Vanya Clogs",
		}	

    sets.midcast.Curaga = {    
        main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Hydrocera",
        head="Vanya Hood",
		neck="Incanter's Torque", 
		ear1="Meili Earring", 
		ear2="Mendicant's Earring", 	
		body="Vrikodara Jupon",
        hands="Telchine Gloves",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Oretania's Cape +1", 
		waist="Luminary Sash", 
		legs="Vanya Slops",
        feet="Vanya Clogs",
		}
		
	sets.midcast.Curaga.SIRD = {    
        main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Hydrocera",
        head="Vanya Hood",
		neck="Incanter's Torque", 
		ear1="Meili Earring", 
		ear2="Mendicant's Earring", 	
		body="Vrikodara Jupon",
        hands="Telchine Gloves",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Oretania's Cape +1", 
		waist="Luminary Sash", 
		legs="Vanya Slops",
        feet="Vanya Clogs",
		}	

    sets.midcast.StatusRemoval = sets.precast.FC
	
	sets.midcast.Geomancy = {
        main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Bagua Charm +2", 
		ear1="Etiolation Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET, 
		waist="Isa Belt",
		legs="Agwu's Slops",
        feet="Bagua Sandals +3",
		}

	-- Extra Indi-duration when skill is 900+.
	sets.midcast.Geomancy.Indi = {
        main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Bagua Charm +2", 
		ear1="Etiolation Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back="Lifestream Cape", 
		waist="Isa Belt",
		legs="Bagua Pants +3",
        feet="Azimuth Gaiters +3",
		}

    sets.midcast['Enhancing Magic'] = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Amalric Coif +1",
		neck="Incanter's Torque", 
		ear1="Mimir Earring", 
		ear2="Andoaa Earring",	
		body="Agwu's Robe",
        hands="Agwu's Gages",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back="Fi Follet Cape +1", 
		waist="Embla Sash",
		legs="Bagua Pants +3",
        feet="Azimuth Gaiters +3",
		}

    sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {head="Amalric Coif +1", back="Grapevine Cape"})
	
	sets.midcast.RefreshSelf = set_combine(sets.midcast['Enhancing Magic'], {head="Amalric Coif +1", waist="Olympus Sash", back="Grapevine Cape"})

    sets.midcast['Aquaveil'] = set_combine(sets.midcast['Enhancing Magic'], {head="Amalric Coif +1", hands="Regal Cuffs",})

    sets.midcast['Enfeebling Magic'] = {
		main="Daybreak",
        sub="Ammurapi Shield",
        ammo="Pemphredo Tathlum",
        head="Geomancy Galero +3",
		neck="Incanter's Torque", 
		ear1="Malignance Earring", 
		ear2="Regal Earring",	
		body="Geomancy Tunic +3",
        hands="Regal Cuffs",
		ring1="Kishar Ring",
        ring2="Stikini Ring +1",
		back="Aurist's Cape +1", 
		waist="Luminary Sash",
		legs="Geomancy Pants +3",
        feet="Geomancy Sandals +3",
		}
		
	sets.midcast['Dispelga'] = set_combine(sets.midcast['Enfeebling Magic'], {main="Daybreak", sub="Ammurapi Shield"})	

    sets.midcast.Aspir = {
		main="Idris",
        sub="Ammurapi Shield",
        range="Dunna",
        head="Agwu's Cap",
		neck="Erra Pendant", 
		ear1="Malignance Earring", 
		ear2="Azimuth Earring +1",	
		body="Agwu's Robe",
        hands="Agwu's Gages",
		ring1="Kishar Ring",
        ring2="Stikini Ring +1",
		back="Aurist's Cape +1", 
		waist="Acuity Belt +1",
		legs="Geomancy Pants +3",
        feet="Agwu's Pigaches",
		}

	sets.midcast['Absorb-TP'] = {
		main="Idris",
        sub="Ammurapi Shield",
        range="Dunna",
        head="Agwu's Cap",
		neck="Erra Pendant", 
		ear1="Malignance Earring", 
		ear2="Azimuth Earring +1",	
		body="Agwu's Robe",
        hands="Agwu's Gages",
		ring1="Kishar Ring",
        ring2="Stikini Ring +1",
		back="Aurist's Cape +1", 
		waist="Acuity Belt +1",
		legs="Geomancy Pants +3",
        feet="Agwu's Pigaches",
		}

    sets.midcast['Elemental Magic'] = {
		main="Bunzi's Rod",
        sub="Ammurapi Shield",
        ammo="Ghastly Tathlum +1",
        head="Agwu's Cap",
		neck="Sibyl Scarf", 
		ear1="Malignance Earring", 
		ear2="Regal Earring",	
		body="Azimuth Coat +3",
        hands="Agwu's Gages",
		ring1="Metamorph Ring +1",
        ring2="Freke Ring",
		back=gear.nantosueltaNUKE,
		waist="Acuity Belt +1",
		legs="Azimuth Tights +3",
        feet="Agwu's Pigaches",
		}

	sets.MagicBurst = {
		main="Bunzi's Rod",
        sub="Ammurapi Shield",
        ammo="Ghastly Tathlum +1",
        head="Agwu's Cap",
		neck="Sibyl Scarf", 
		ear1="Malignance Earring", 
		ear2="Regal Earring",	
		body="Azimuth Coat +3",
        hands="Agwu's Gages",
		ring1="Mujin Band",
        ring2="Freke Ring",
		back=gear.nantosueltaNUKE,
		waist="Acuity Belt +1",
		legs="Azimuth Tights +3",
        feet="Agwu's Pigaches",
		}
		
    sets.midcast.Impact = {
		main="Bunzi's Rod",
        sub="Ammurapi Shield",
        ammo="Ghastly Tathlum +1",
        head=empty,
		neck="Sibyl Scarf", 
		ear1="Malignance Earring", 
		ear2="Regal Earring",	
		body="Crepuscular Cloak",
        hands="Agwu's Gages",
		ring1="Metamorph Ring +1",
        ring2="Freke Ring",
		back="Aurist's Cape +1",
		waist="Acuity Belt +1",
		legs="Azimuth Tights +3",
        feet="Agwu's Pigaches",
		}
		
	sets.midcast.ImpactMB = {
		main="Bunzi's Rod",
        sub="Ammurapi Shield",
        ammo="Ghastly Tathlum +1",
        head=empty,
		neck="Sibyl Scarf", 
		ear1="Malignance Earring", 
		ear2="Regal Earring",	
		body="Crepuscular Cloak",
        hands="Agwu's Gages",
		ring1="Metamorph Ring +1",
        ring2="Freke Ring",
		back="Aurist's Cape +1",
		waist="Acuity Belt +1",
		legs="Azimuth Tights +3",
        feet="Agwu's Pigaches",
		}
	
	------------------------------------------------------------------------------------------------
	---------------------------------------- Engaged Sets ------------------------------------------
	------------------------------------------------------------------------------------------------

    sets.engaged = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Null Masque",
		neck="Null Loop", 
		ear1="Dedition Earring", 
		ear2="Telos Earring",	
		body="Nyame Mail",
        hands="Gazu Bracelets +1",
		ring1="Chirich Ring +1",
        ring2="Chirich Ring +1",
		back="Null Shawl",
		waist="Windbuffet Belt +1",
		legs="Nyame Flanchard",
        feet="Azimuth Gaiters +3",
		}

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

    sets.engaged.Hybrid = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Null Masque",
		neck="Null Loop", 
		ear1="Dedition Earring", 
		ear2="Telos Earring",	
		body="Adamantite Armor",
        hands="Gazu Bracelets +1",
		ring1="Chirich Ring +1",
        ring2="Chirich Ring +1",
		back="Null Shawl",
		waist="Windbuffet Belt +1",
		legs="Nyame Flanchard",
        feet="Azimuth Gaiters +3",
		}

	sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)

	------------------------------------------------------------------------------------------------
	---------------------------------------- Defense Sets ------------------------------------------
	------------------------------------------------------------------------------------------------
	
	sets.defense.DT = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}
		
	sets.defense.MEVA = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Defending Ring",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}	
	
	sets.idle.Weak = sets.defense.DT
	
	------------------------------------------------------------------------------------------------
	---------------------------------------- Idle Sets ---------------------------------------------
	------------------------------------------------------------------------------------------------	

    sets.idle = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}
		
	sets.idle.Pet = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}
		
	sets.idle.REFRESH = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Stikini Ring +1",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}
		
	sets.idle.REFRESH = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Chirich Ring +1",
        ring2="Chirich Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}

	sets.idle.AMINON = {
		main="Maxentius",
        sub="Genmei Shield",
        range="Dunna",
        head="Null Masque",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Adamantite Armor",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}

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

	sets.Kiting = {ring2="Shneddick Ring +1"}

	-- TP overflow swaps for extra damage.
	sets.midcast.ExtraWSDMG = {ear1="Ishvara Earring"}
	sets.midcast.ExtraMAB = {ear1="Crematio Earring"}
	
	-- Refresh swap when latent met.
	sets.LatentRefresh = {waist="Fucho-no-Obi"}

	sets.buff.Doom = {
        neck="Nicander's Necklace", 
        ring1="Purity Ring",
        ring2="Blenmot's Ring +1",
        waist="Gishdubar Sash", 
        }
		
	-- Emergency set toggle for status effects.	
	sets.EmergencyDT = {
		main="Idris",
        sub="Genmei Shield",
        range="Dunna",
        head="Azimuth Hood +3",
		neck="Loricate Torque +1", 
		ear1="Alabaster Earring", 
		ear2="Odnowa Earring +1",	
		body="Shamash Robe",
        hands="Geomancy Mitaines +3",
		ring1="Murky Ring",
        ring2="Stikini Ring +1",
		back=gear.nantosueltaPET,
		waist="Isa Belt",
		legs="Nyame Flanchard",
        feet="Bagua Sandals +3",
		}	
		
	sets.TreasureHunter = {
		body="Volte Jupon",
		waist="Chaac Belt",
		legs="Volte Hose",
		feet="Volte Boots",
		}			

    sets.buff.FullSublimation = {waist="Embla Sash"}
	
 	------------------------------------------------------------------------------------------------
	---------------------------------------- Weapon Sets -------------------------------------------
	------------------------------------------------------------------------------------------------   
	
    sets.Idris = {main="Idris"}
    sets.Maxentius = {main="Maxentius"}
	
	sets.DefaultShield = {sub="Genmei Shield"}
end

function job_precast(spell, action, spellMap, eventArgs)
	-- Will degrade Aspir based on available recast timers.
    if spell.name:startswith('Aspir') then
        refine_various_spells(spell, action, spellMap, eventArgs)
    end
	
	-- Will stop utsusemi from being cast if 3 shadows or more.
    if spellMap == 'Utsusemi' then
        if buffactive['Copy Image'] or buffactive['Copy Image (2)'] then 
			send_command('cancel Copy Image*')
		elseif buffactive['Copy Image (3)'] then
            cancel_spell()
            add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
            eventArgs.handled = true
            return
        end
    end
	
	-- Cancels WS usage if target is out of range specified by value far above.
	if spell.type == "WeaponSkill" and spell.target.distance > target_distance then
        cancel_spell()
        add_to_chat(123, spell.name..' Canceled: [Out of Range]')
        handle_equipping_gear(player.status)
        return
    end
end

function job_post_precast(spell, action, spellMap, eventArgs)
	-- Mapping for Impact precast.
	if spell.name == 'Impact' then
        equip(sets.precast.FC.Impact)
    end
	
	-- Replace TP-bonus gear if not needed.
	if spell.type == 'WeaponSkill' then
		if elemental_ws:contains(spell.name) then
			if player.tp > 2750 then
				equip(sets.midcast.ExtraMAB)
			end
		end
		if physical_ws:contains(spell.name) then
			if player.tp > 2750 then
				equip(sets.midcast.ExtraWSDMG)
			end
		end
		
		-- Equip Obi or Sash for WS depending on weather/day matching.
        if elemental_ws:contains(spell.name) then
            -- Matching double weather (w/o day conflict).
            if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
                equip({waist="Hachirin-no-Obi"})
            -- Target distance under 1.7 yalms.
            elseif spell.target.distance < (1.7 + spell.target.model_size) then
                equip({waist="Orpheus's Sash"})
            -- Matching day and weather.
            elseif spell.element == world.day_element and spell.element == world.weather_element then
                equip({waist="Hachirin-no-Obi"})
            -- Target distance under 8 yalms.
            elseif spell.target.distance < (8 + spell.target.model_size) then
                equip({waist="Orpheus's Sash"})
            -- Match day or weather.
            elseif spell.element == world.day_element or spell.element == world.weather_element then
                equip({waist="Hachirin-no-Obi"})
            end
        end
	end
end

function job_post_midcast(spell, action, spellMap, eventArgs)
	-- Equips gearset to midcast Impact.
    if spell.skill == 'Elemental Magic' then
		if spell.english == "Impact" then
                equip(sets.midcast.Impact)
        end
		-- Equips gearset to Magic Burst.
        if state.MagicBurst.value then
            equip(sets.MagicBurst)
            if spell.english == "Impact" then
                equip(sets.midcast.ImpactMB)
            end
        end
	end
	
	-- Changes Cure set if self curing.
    if spellMap == 'Cure' and spell.target.type == 'SELF' then
        equip(sets.midcast.CureSelf)
    end
	
	-- Equips Obi or Sash if the correct day or weather matches Elemental Magic and if correct distance.
    if spell.skill == 'Elemental Magic' then
        if (spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element])) and spellMap ~= 'Helix' then
            equip({waist="Hachirin-no-Obi"})
        -- Target distance under 1.7 yalms.
        elseif spell.target.distance < (1.7 + spell.target.model_size) then
            equip({waist="Orpheus's Sash"})
        -- Matching day and weather.
		elseif (spell.element == world.day_element and spell.element == world.weather_element) then
            equip({waist="Hachirin-no-Obi"})
        -- Target distance under 8 yalms.
        elseif spell.target.distance < (8 + spell.target.model_size) then
            equip({waist="Orpheus's Sash"})
        -- Match day or weather.
		elseif (spell.element == world.day_element or spell.element == world.weather_element) then
            equip({waist="Hachirin-no-Obi"})
        end
    end
	
	-- Handles Refresh on self.
    if spell.skill == 'Enhancing Magic' then
		equip(sets.midcast['Enhancing Magic'])
		if spellMap == 'Refresh' then
			equip(sets.midcast.Refresh)
			if spell.target.type == 'SELF' then
				equip (sets.midcast.RefreshSelf)
			end
		end
    end
end	

function job_aftercast(spell, action, spellMap, eventArgs)
	-- Check weapon sets based on toggles.
    if player.status ~= 'Engaged' and state.WeaponLock.value == false then
        check_weaponset()
    end
end

function job_buff_change(buff,gain)
	-- Adjust gear based on Doom debuff.
    if buff == "doom" then
        if gain then
			doom_active = true
            equip(sets.buff.Doom)
            send_command('@input /p Doomed.')
            disable('neck', 'ring1', 'ring2', 'waist')
        else
			doom_active = false
            enable('neck', 'ring1', 'ring2', 'waist')
            handle_equipping_gear(player.status)
        end
    end
	
	if not midaction() then
        handle_equipping_gear(player.status)
    end
	
	-- Warns part when Charmed is on/off.
	if buff == "charm" then
        if gain then
            send_command('@input /p Charmed.')
        else
			send_command('@input /p Charm is now off.')
        end
    end
	
	-- Handles Sublimation gear.
    if buff == "Sublimation: Activated" then
        handle_equipping_gear(player.status)
    end
end

-------------------------------------------------------------------------------------------------------------------
-- Weapon Functions.
-------------------------------------------------------------------------------------------------------------------

-- Sets Weapon Sets based on toggles.
function check_weaponset()
    if (player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC') then
        equip(set_combine(sets[state.WeaponSet.current], sets.DefaultShield))
    elseif player.sub_job == 'NIN' and player.sub_job_level < 10 or player.sub_job == 'DNC' and player.sub_job_level < 20 then
        equip(set_combine(sets[state.WeaponSet.current], sets.DefaultShield))
    else
        equip(sets[state.WeaponSet.current])
    end
end

-- Sets Weapon Lock based on toggles.
function job_state_change(stateField, newValue, oldValue)
    if state.WeaponLock.value == true then
        disable('main')
		disable('sub')
    else
        enable('main')
		enable('sub')
    end

    check_weaponset()
end

-------------------------------------------------------------------------------------------------------------------
-- Code for Melee sets.
-------------------------------------------------------------------------------------------------------------------

-- Handles Gearinfo.
function job_handle_equipping_gear(playerStatus, eventArgs)
    check_gear()
    update_combat_form()
    determine_haste_group()
    check_moving()
end

function job_update(cmdParams, eventArgs)
    handle_equipping_gear(player.status)
	th_update(cmdParams, eventArgs)
    update_sublimation()
end

-- Determines Dual Wield melee set.
function update_combat_form()
    if DW == true then
        state.CombatForm:set('DW')
    elseif DW == false then
        state.CombatForm:reset()
    end
end

function customize_melee_set(meleeSet)
	if buffactive['Terror'] or buffactive['Petrification'] or buffactive['Stun'] or buffactive['Sleep'] then
		meleeSet = sets.EmergencyDT
	end

    check_weaponset()
    return meleeSet
end

function customize_idle_set(idleSet)
    if buffactive['Terror'] or buffactive['Petrification'] or buffactive['Stun'] or buffactive['Sleep'] then
		idleSet = sets.EmergencyDT
	end

    if state.Buff['Sublimation: Activated'] then
        idleSet = set_combine(idleSet, sets.buff.FullSublimation)
    end
	
    if player.mpp < 51 and state.IdleMode.value == 'Normal' then
        idleSet = set_combine(idleSet, sets.LatentRefresh)
    end
	
    if state.Auto_Kite.value == true then
       idleSet = set_combine(idleSet, sets.Kiting)
    end
	
	check_weaponset()
    return idleSet
end

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

-- Determines Haste Group / Melee set for Gear Info.
function determine_haste_group()
    classes.CustomMeleeGroups:clear()
    if DW == true then
        if DW_needed <= 11 then
            classes.CustomMeleeGroups:append('MaxHaste')
        elseif DW_needed > 11 and DW_needed <= 21 then
            classes.CustomMeleeGroups:append('HighHaste')
        elseif DW_needed > 21 and DW_needed <= 27 then
            classes.CustomMeleeGroups:append('MidHaste')
        elseif DW_needed > 27 and DW_needed <= 37 then
            classes.CustomMeleeGroups:append('LowHaste')
        elseif DW_needed > 37 then
            classes.CustomMeleeGroups:append('')
        end
    end
end

-- Gear Info functions.
function job_self_command(cmdParams, eventArgs)
    gearinfo(cmdParams, eventArgs)
end

function gearinfo(cmdParams, eventArgs)
    if cmdParams[1] == 'gearinfo' then
        if type(tonumber(cmdParams[2])) == 'number' then
            if tonumber(cmdParams[2]) ~= DW_needed then
            DW_needed = tonumber(cmdParams[2])
            DW = true
            end
        elseif type(cmdParams[2]) == 'string' then
            if cmdParams[2] == 'false' then
                DW_needed = 0
                DW = false
            end
        end
        if type(tonumber(cmdParams[3])) == 'number' then
            if tonumber(cmdParams[3]) ~= Haste then
                Haste = tonumber(cmdParams[3])
            end
        end
        if type(cmdParams[4]) == 'string' then
            if cmdParams[4] == 'true' then
                moving = true
            elseif cmdParams[4] == 'false' then
                moving = false
            end
        end
        if not midaction() then
            job_update()
        end
    end
end

-- Handles detection for Sublimation.
function update_sublimation()
    state.Buff['Sublimation: Activated'] = buffactive['Sublimation: Activated'] or false
end

-- Downgrades Aspir if necessary due to recast times.
function refine_various_spells(spell, action, spellMap, eventArgs)
    local newSpell = spell.english
    local spell_recasts = windower.ffxi.get_spell_recasts()
    local cancelling = 'All '..spell.english..' are on cooldown. Cancelling.'

    local spell_index

    if spell_recasts[spell.recast_id] > 0 then
        if spell.name:startswith('Aspir') then
            spell_index = table.find(degrade_array['Aspirs'],spell.name)
            if spell_index > 1 then
                newSpell = degrade_array['Aspirs'][spell_index - 1]
                send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
                eventArgs.cancel = true
            end
        end
    end
end

-- Sets combat form to Dual or Single Wield.
function update_offense_mode()
    if (player.sub_job == 'NIN' and player.sub_job_level > 9) or (player.sub_job == 'DNC' and player.sub_job_level > 19) then
        state.CombatForm:set('DW')
    else
        state.CombatForm:reset()
    end
end

-- Toggles movement speed based on character movement.
function check_moving()
    if state.DefenseMode.value == 'None'  and state.Kiting.value == false then
        if state.Auto_Kite.value == false and moving then
            state.Auto_Kite:set(true)
        elseif state.Auto_Kite.value == true and moving == false then
            state.Auto_Kite:set(false)
        end
    end
end

-- Check for various actions that we've specified in user code as being used with TH gear.
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

-- Handles no swap gear priority.
function check_gear()
	if doom_active then return end
    if no_swap_gear:contains(player.equipment.left_ring) then
        disable("ring1")
    else
        enable("ring1")
    end
    if no_swap_gear:contains(player.equipment.right_ring) then
        disable("ring2")
    else
        enable("ring2")
    end
end

-- Resets no swap gear upon zone change.
windower.register_event('zone change',
    function()
		if doom_active then return end
        if no_swap_gear:contains(player.equipment.left_ring) then
            enable("ring1")
            equip(sets.idle)
        end
        if no_swap_gear:contains(player.equipment.right_ring) then
            enable("ring2")
            equip(sets.idle)
        end
    end
)

-- Select default macro book on initial load or subjob change.
function select_default_macro_book()
    -- Default macro set/book
    if player.sub_job == 'RDM' then
        set_macro_page(1, 11)
    elseif player.sub_job == 'SCH' then
        set_macro_page(2, 11)
    elseif player.sub_job == 'WHM' then
        set_macro_page(3, 11)
	elseif player.sub_job == 'BLM' then
        set_macro_page(4, 11)
    else
        set_macro_page(5, 11)
    end
end

function set_lockstyle()
    send_command('wait 75; input /lockstyleset ' .. lockstyleset)
end
 Fenrir.Brimstonefox
Online
Server: Fenrir
Game: FFXI
User: Brimstone
Posts: 392
By Fenrir.Brimstonefox 2026-01-12 10:05:33
Link | Quote | Reply
 
you have enable('neck', 'ring1', 'ring2', 'waist') (if not doomed) (line 1030), that will override stuff at the command line (job_buff_change).

Few other places in your code enable() is called.
Offline
Posts: 9
By Umberto 2026-01-12 10:23:56
Link | Quote | Reply
 
Fenrir.Brimstonefox said: »
you have enable('neck', 'ring1', 'ring2', 'waist') (if not doomed) (line 1030), that will override stuff at the command line (job_buff_change).

Few other places in your code enable() is called.

Thank you but I'm suspecting this is not entirely the issue because while it does call for the waist specifically it doesn't explain why also the body, legs & feet are refusing to disable.

The only set that uses specifically these 4 pieces (body, waist, legs, feet) is my TreasureHunter set but I don't see see why that would overwrite a //gs disable?
Offline
Posts: 9
By Umberto 2026-01-12 10:40:55
Link | Quote | Reply
 
Umberto said: »
Fenrir.Brimstonefox said: »
you have enable('neck', 'ring1', 'ring2', 'waist') (if not doomed) (line 1030), that will override stuff at the command line (job_buff_change).

Few other places in your code enable() is called.

Thank you but I'm suspecting this is not entirely the issue because while it does call for the waist specifically it doesn't explain why also the body, legs & feet are refusing to disable.

The only set that uses specifically these 4 pieces (body, waist, legs, feet) is my TreasureHunter set but I don't see see why that would overwrite a //gs disable?

I just tried commenting out the TreasureHunter set & now I can //gs disable the waist, legs, body, feet properly! However now I also no longer have a working TH toggle. This has isolated the issue but I'm lost now as to why this specific set is overriding //gs disable? If anyone could offer any insight or advice it'd be greatly appreciated!

Below is what I commented out from the GS posted.
sets.TreasureHunter = {
body="Volte Jupon",
waist="Chaac Belt",
legs="Volte Hose",
feet="Volte Boots",
}
 Fenrir.Brimstonefox
Online
Server: Fenrir
Game: FFXI
User: Brimstone
Posts: 392
By Fenrir.Brimstonefox 2026-01-12 10:54:53
Link | Quote | Reply
 
Check the includes, likely in libs/Mote-TreasureHunter.lua you have:
Code
-- Set locked TH flag to false, and enable relevant gear slots.
function unlock_TH()
    state.th_gear_is_locked = false
    local slots = T{}
    for slot,item in pairs(sets.TreasureHunter) do
        slots:append(slot)
    end
    enable(slots)
    send_command('gs c update auto')
end


That comment might explain a more nature way to avoid this.

The point being in the main or any includes if you have enable(<slot>) it will override //gs disable <slot> if it gets to that section of code.
Offline
Posts: 9
By Umberto 2026-01-12 10:59:30
Link | Quote | Reply
 
Fenrir.Brimstonefox said: »
Check the includes, likely in libs/Mote-TreasureHunter.lua you have:
Code
-- Set locked TH flag to false, and enable relevant gear slots.
function unlock_TH()
    state.th_gear_is_locked = false
    local slots = T{}
    for slot,item in pairs(sets.TreasureHunter) do
        slots:append(slot)
    end
    enable(slots)
    send_command('gs c update auto')
end


That comment might explain a more nature way to avoid this.

The point being in the main or any includes if you have enable(<slot>) it will override //gs disable <slot> if it gets to that section of code.

So if I were to do the following small edit on the Mote TreasureHunter would this theoretically fix my //gs disable issue but also leave my TH functions/toggles intact?
--enable(slots)
--send_command('gs c update auto')

Thank you so much for the guidance thus far!
 Fenrir.Brimstonefox
Online
Server: Fenrir
Game: FFXI
User: Brimstone
Posts: 392
By Fenrir.Brimstonefox 2026-01-12 11:10:48
Link | Quote | Reply
 
Just commenting out the enable should do it. (remember there's others scattered in the other file too).

Although many of these are paired in a manner such that something in the code disables it for a period (such as when doomed) and renables it when doom is gone so you can keep the gear that helps curnsa on full time and the rest of the gear still swaps. So if you only comment out the enable when using these files its possible other slots become disabled with certain actions permanently.

If you comment out both the enable and disable its likely that some gear may not work at all because it will switch to it but some other action will happen causing it to change again before the reason the gear got put on happens (th buff, doom removal etc..).

Typically I'm only disabling something temporarily for a brief time. So I just either unload gearswap or comment out a function to full time the gear. If you're getting rank points on something or doing an experiment this tends to work. In your case if its just one slot you care about comment that out of the TH gear for the moment, otherwise if its more consistent/fluid create a 2nd variable to control the enable/disable code and you can set that in tandem with your code.
Offline
Posts: 9
By Umberto 2026-01-12 11:23:41
Link | Quote | Reply
 
I think I'm getting the idea of what I need to do. I tried commenting out the enable on the mote file but now it won't take me out of TH gear and leaves those slots disabled, as one would expect.

I'm going to have to experiment with rules and functions to try and get the best of both worlds which is what I'm after. Going to try and tackle this one by going back to the drawing board.

The functions I'm trying to achieve behind this is that in all of my GS's (I posted GEO just as an example) the following issues are happening.

1. COR GS is not allowing no_swap_gear to equip bullet pouches without reverting back to idle set waist (due to TH enable rule)
2. DOOM sets across all jobs is not equipping Gisdubar sash (again due to the TH rule override).
3. PLD SAM WAR & BST GS are not equipping Crepuscular Mail when RR set is toggled due to TH set enabling Volte Harness

Really appreciate your help with isolating the problem, I think now that at least I know what's causing it I can try to fix this with a bunch of trial and error!
First Page 2 3 ... 188 189