|  | 
    Gearswap Support Thread
 
    
        
        
        
            
                
                     Carbuncle.Doryll
                                                    
                                                                            
                                Server: Carbuncle Game: FFXI 
                
			
			By Carbuncle.Doryll 2017-03-06 08:37:09			
			
						
                     
                 Hello ! 
I want change my self_healing midcast set when i'm in a different casting mode. is it possible ? I'm using this rule working correctly : Code  function job_post_midcast(spell, action, spellMap, eventArgs)
    if spellMap == 'Cure' and spell.target.type == 'SELF' and sets.self_healing then
        equip(sets.self_healing)
    end
    -- Apply Divine Caress boosting items as highest priority over other gear, if applicable.
    if spellMap == 'StatusRemoval' and buffactive['Divine Caress'] then
        equip(sets.buff['Divine Caress'])
    end
end
But when i change it for try to have a different self_healing set whit a different CastingMode, the rules break. I tried this, but i think i made typo errors : Code  function job_post_midcast(spell, action, spellMap, eventArgs)
    if spellMap == 'Cure' and spell.target.type == 'SELF' and sets.self_healing and not CastingMode == 'HP' then
        equip(sets.self_healing)
    end
    -- Apply Divine Caress boosting items as highest priority over other gear, if applicable.
    if spellMap == 'StatusRemoval' and buffactive['Divine Caress'] then
        equip(sets.buff['Divine Caress'])
    end
end 
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Sylph Game: FFXI Posts: 184 
                
			
			By Sylph.Subadai 2017-03-06 18:37:07			
			
						
                     
                 Couple questions on send_command() vs. self_command(). I notice some luas use "send_command('gs c set treasuremode none')" and the like; is there any advantage to doing it this way, vs. "self_command('set treasuremode none")? Seems to me that self_command() is more efficient, or at least less typing.
 Second, I could have sworn I saw somewhere that it was recommended to use the @ symbol at the beginning of commands, i.e. "send_command('@exec warp-ring.txt')" What's the reason to do it that way? I tried it with a couple of aliases I set up and it seems to work either with or without.
 
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Bismarck Game: FFXI Posts: 148 
                
			
			By Bismarck.Cloudstrafie 2017-03-23 23:14:04			
			
						
                     
                 Hello,Im trying to figure out if its possible to use 2 items with the same name? Stikini Ring mache Earrings ect Currently its only pulling one of the items into the gear its trying use,any insight would be helpful thank you                                     
            
                
                     Odin.Lygre
                                                    
                                                                            
                                Server: Odin Game: FFXI Posts: 89 
                
			
			By Odin.Lygre 2017-03-24 01:10:06			
			
						
                     
                 will it more harder                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Asura Game: FFXI Posts: 1329 
                
			
			By Asura.Azagarth 2017-03-24 01:12:20			
			
						
                     
                 how would you code for cor rolls? I am wanting to set up sets for xhits based upon 11s etc.                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Sylph Game: FFXI Posts: 184 
                
			
			By Sylph.Subadai 2017-03-24 01:44:33			
			
						
                     
                 Bismarck.Cloudstrafie said: »Hello,Im trying to figure out if its possible to use 2 items with the same name? Stikini Ring mache Earrings ect Currently its only pulling one of the items into the gear its trying use,any insight would be helpful thank youOne way to do it is put them in different bags and use something like the following: Code  sets.midcast['Elemental Magic'] = {
     ring1={name="Shiva Ring", bag="wardrobe2"},
     ring2={name="Shiva Ring", bag="wardrobe3"} } 
                    [+]
                                              
            
                
                     Ragnarok.Fabiano
                                                    
                                                                            
                                Server: Ragnarok Game: FFXI Posts: 154 
                
			
			By Ragnarok.Fabiano 2017-03-25 17:47:02			
			
						
                     
                 anyone knows why it changes to my standart precast/fastcast set in death mode / death idle . everytime i cast random self buffs my mp goes from 2050 to 1550 .                                     
            
            
                
			
			By aesculapius 2017-04-01 00:26:58			
			
						
                     
                 I have a question regarding delay. For whatever reason ring2 for every set I have only sometimes switches. Most of the time it does not and I don't get the effect of my second ring. Does anyone know what could be causing this and how I can fix it?                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Sylph Game: FFXI Posts: 184 
                
			
			By Sylph.Subadai 2017-04-05 14:26:27			
			
						
                     
                 I have a question regarding delay. For whatever reason ring2 for every set I have only sometimes switches. Most of the time it does not and I don't get the effect of my second ring. Does anyone know what could be causing this and how I can fix it?Only thing I can think of, is maybe check to see if the rings in question are always swapped into the same slot; for ex don't put your Petrov Ring in ring1/left_ring in some places and ring2/right_ring in others. Not sure what would happen if a ring is already in ring1 when your script calls for it to swap into ring2. That's just a guess, though.                                     
            
                
                     Shiva.Hiep
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 669 
                
			
			By Shiva.Hiep 2017-04-17 23:38:45			
			
						
                     
                 I need some help. Was wondering if it's possible to have a bind where it switches to a specific casting mode. This is my current casting mode:state.CastingMode:options('Normal','ConserveMP','MACC','MB','MB2')
 
 I'd like a separate casting mode that only has MB and MB2, possibly more in the future for MACCMB.
 
            
            
                
			
			By Aeyela 2017-04-18 05:17:49			
			
						
                     
                 how would you code for cor rolls? I am wanting to set up sets for xhits based upon 11s etc.
Well, buffactive[214] equals the tier of March, 1 or 2. It could be, though I'm just guessing, that buffactive[321] (Samurai Roll) may equal the number of the active roll. This works for most buffs so I see no reason why it shouldn't for rolls.
 I need some help. Was wondering if it's possible to have a bind where it switches to a specific casting mode. This is my current casting mode:state.CastingMode:options('Normal','ConserveMP','MACC','MB','MB2')
 
 I'd like a separate casting mode that only has MB and MB2, possibly more in the future for MACCMB.
The easiest way of controlling casting modes is using a toggle of some kind that will then be used to choose which set to use in midcast. You can make that commands into macros for easy switching. I can give you an example if it helps, but you'll find similar examples in a lot of GearSwaps (SMN, PLD, etc, for handling pet/damage modes.)                                             
                    [+]
                                              
            
                
                     Shiva.Hiep
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 669 
                
			
			By Shiva.Hiep 2017-04-18 07:39:24			
			
						
                     
                 I need some help. Was wondering if it's possible to have a bind where it switches to a specific casting mode. This is my current casting mode:state.CastingMode:options('Normal','ConserveMP','MACC','MB','MB2')
 
 I'd like a separate casting mode that only has MB and MB2, possibly more in the future for MACCMB.
The easiest way of controlling casting modes is using a toggle of some kind that will then be used to choose which set to use in midcast. You can make that commands into macros for easy switching. I can give you an example if it helps, but you'll find similar examples in a lot of GearSwaps (SMN, PLD, etc, for handling pet/damage modes.)[/quote]
 
My current toggle is send_command('bind ^q gs c cycle CastingMode'). What I want if it's possible is to have separate casting mode toggles, one for Normal, ConserveMP, MACC, and a second casting mode toggle for MB, MB2, MACCMB. Thank you for your response!                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 1052 
                
			
			By Shiva.Arislan 2017-04-18 08:06:44			
			
						
                     
                 It's kind of messy to be integrating burst states with casting states, no? 
Create a new state called BurstMode:
 Code  function job_setup()
   state.BurstMode = M{['description']='Magic Burst Mode', 'MB1', 'MB2','MBMacc'}
end
Create some rules in post_midcast to detect for the current MB state, then equip corresponding MB set:
 Code  function job_post_midcast(spell, action, spellMap, eventArgs)
    if spell.skill == 'Elemental Magic' and state.MagicBurst.value and state.BurstMode.value then
        if state.BurstMode.value == "MB2" then
            equip(sets.magic_burst.MB2)
        if state.BurstMode.value == "MBMacc" then
            equip(sets.magic_burst.MBMacc)
        else
            equip(sets.magic_burst.MB1)
        end
    end
end
You're probably going to build in some exceptions for certain spells like Impact.
 
Bind your new cycler:
 Code      send_command('bind ^q gs c cycle BurstMode')
Your casting modes remain independent of all this.
 
My preferred method is to have post_midcast read the current casting mode value to determine which MB set to equip::
 Code  function user_setup()
	state.CastingMode:options('Normal', 'Seidr', 'Resistant')
endCode  function job_post_midcast(spell, action, spellMap, eventArgs)
	if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
		if state.CastingMode.value == "Resistant" then
			equip(sets.magic_burst.Resistant)
		else
			equip(sets.magic_burst)
		end
		if spell.english == "Impact" then
			equip(sets.midcast.Impact)
		end
	end
end
Think it's a bit more elegant w/o a separate toggle and another set of unnecessary states.                                             
                    [+]
                                              
            
                
                     Shiva.Hiep
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 669 
                
			
			By Shiva.Hiep 2017-04-18 09:58:20			
			
						
                     
                 It's kind of messy to be integrating burst states with casting states, no? 
Create a new state called BurstMode:
 Code  function job_setup()
   state.BurstMode = M{['description']='Magic Burst Mode', 'MB1', 'MB2','MBMacc'}
end
Create some rules in post_midcast to detect for the current MB state, then equip corresponding MB set:
 Code  function job_post_midcast(spell, action, spellMap, eventArgs)
    if spell.skill == 'Elemental Magic' and state.MagicBurst.value and state.BurstMode.value then
        if state.BurstMode.value == "MB2" then
            equip(sets.magic_burst.MB2)
        if state.BurstMode.value == "MBMacc" then
            equip(sets.magic_burst.MBMacc)
        else
            equip(sets.magic_burst.MB1)
        end
    end
end
You're probably going to build in some exceptions for certain spells like Impact.
 
Bind your new cycler:
 Code      send_command('bind ^q gs c cycle BurstMode')
Your casting modes remain independent of all this.
 
My preferred method is to have post_midcast read the current casting mode value to determine which MB set to equip::
 Code  function user_setup()
	state.CastingMode:options('Normal', 'Seidr', 'Resistant')
endCode  function job_post_midcast(spell, action, spellMap, eventArgs)
	if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
		if state.CastingMode.value == "Resistant" then
			equip(sets.magic_burst.Resistant)
		else
			equip(sets.magic_burst)
		end
		if spell.english == "Impact" then
			equip(sets.midcast.Impact)
		end
	end
end
Think it's a bit more elegant w/o a separate toggle and another set of unnecessary states.
Just tested my GS using your preferred method and it works beautifully, thank you! Just one more question, but how would I include my MACC casting mode inside the function? I can't seem to figure it out. It's currently this:  Code  		if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
		if state.CastingMode.value == "ConserveMP" then
            equip(sets.magic_burst.ConserveMP)		
        else
            equip(sets.magic_burst)
        end
Would it be close to this?  Code  		if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
		if state.CastingMode.value == "ConserveMP" then
            equip(sets.magic_burst.ConserveMP)
		if state.CastingMode.value == "MACC" then
            equip(sets.magic_burst.MACC)		
        else
            equip(sets.magic_burst)
        end
Not sure what I had to use since or, and, elseif didn't work after equip(sets.magic_burst.ConserveMP).                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 1052 
                
			
			By Shiva.Arislan 2017-04-18 16:26:37			
			
						
                     
                 Just turn the if to elseif: Code  if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
    if state.CastingMode.value == "ConserveMP" then
        equip(sets.magic_burst.ConserveMP)
    elseif state.CastingMode.value == "MACC" then
        equip(sets.magic_burst.MACC)        
    else
        equip(sets.magic_burst)
    end
end 
            
                
                     Shiva.Hiep
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 669 
                
			
			By Shiva.Hiep 2017-04-18 23:21:28			
			
						
                     
                 Works great as usual, thank you very much for your help, much appreciated Arislan.                                     
            
                
                     Fenrir.Dibble
                                                    
                                                                            
                                Server: Fenrir Game: FFXI Posts: 141 
                
			
			By Fenrir.Dibble 2017-04-19 09:49:32			
			
						
                     
                 What's the T do here? Code  T{'Idle','Resting'}:contains(new)
Versus or compared to the S here? Code  S{'Warp','Warp II'}:contains(spell.english)
I'm assuming this was maybe covered in "Special tables " in the Lua section of the GearSwap tutorial?                                     
            
            
                
			
			By Aeyela 2017-04-24 14:33:26			
			
						
                     
                 What's the T do here? Code  T{'Idle','Resting'}:contains(new)
Versus or compared to the S here? Code  S{'Warp','Warp II'}:contains(spell.english)
I'm assuming this was maybe covered in "Special tables " in the Lua section of the GearSwap tutorial?
They're exactly the same thing, unless Windower is using some special implementation of Lua with functionality I'm unaware of.                                     
            
                
                     Fenrir.CaiirVIP 
                                                    
                                                                            
                                Server: Fenrir Game: FFXI Posts: 199 
                
			
			By Fenrir.Caiir 2017-04-24 16:34:24			
			
						
                     
                 They are not exactly the same thing. However, they result in the same thing happening. 
T and S are function calls that both initialize different tables (T will look something like {[1] = 'Idle', [2] = 'Resting'}, where S will look something like {['Warp'] = true, ['Warp II'] = true}) with member function contains that check if the value exists in a table in different ways.
 
The S{} approach should be faster technically, but in practice it probably won't matter too much.                                             
                    [+]
                                              
            
            
                
			
			By Aeyela 2017-04-24 16:45:22			
			
						
                     
                 Interesting. When I dump S{'Warp','Warp II'} it displays the same output as using T{}: {'Warp','Warp II'}. Am I missing something there, or is Lua just compiling them to the same thing when dumping them to the log file?                                     
            
                
                     Leviathan.Vow
                                                    
                                                                            
                                Server: Leviathan Game: FFXI Posts: 125 
                
			
			By Leviathan.Vow 2017-04-24 17:35:50			
			
						
                     
                 If you're using the logger library, they have __tostring metamethods that create identical output.                                             
                    [+]
                                              
            
            
                
			
			By Aeyela 2017-04-25 15:18:21			
			
						
                     
                 Thanks. I am using logger, and that's exactly what's going on. 
I have a query of my own. Is there a way to register an event so long as the event has not already been registered? I'm using CTRL+T to equip Treasure Hunter gear and I want it to add an event that will check which TP set to equip once my TP changes. The problem is, every time I hit CTRL+T the event is registering again. After one Salvage I have 29 events registered and it's causing stuttering when my TP changes. If I mash my bind to add a lot more my FPS begins to deteriorate even when my TP is static.
 
Like Lua, functions in Javascript are first class objects which means we can use the reference to a function in evaluation. Is it possible to do that in GearSwap? I made a work around by having a variable somewhere that was false until the bind is first hit that sets this to true and only binds the event if it's false:
 Code  	elseif command:lower() == 'th' then
		equip(sets.me.th)
		windower.add_to_chat(8,'TH Equipment ON')
		
		if not me.thRegistered then
			windower.register_event('tp change', function()
				doMeleeMode()
			end)
		end
	end
I'm not overly bothered by this (it works) but it's an anti-pattern in design and I'd like to know anyway if this is possible in Windower for future reference!                                     
            
                
                     Fenrir.CaiirVIP 
                                                    
                                                                            
                                Server: Fenrir Game: FFXI Posts: 199 
                
			
			By Fenrir.Caiir 2017-04-25 16:05:11			
			
						
                     
                 windower.register_event() returns a number, so in line with your setup you could just do : Code  
elseif command:lower() == 'th' then
    equip(sets.me.th)
    windower.add_to_chat(8,'TH Equipment ON')
     
    if not me.thRegistered then
        me.thRegistered = windower.register_event('tp change', function()
            doMeleeMode()
        end)
    end
end
I'd probably suggest that instead, you just register the event outside of this function call and just set up a blocking variable in the event itself that you toggle with commands.                                     
            
                
                     Bismarck.Speedyjim
                                                    
                                                                            
                                Server: Bismarck Game: FFXI Posts: 516 
                
			
			By Bismarck.Speedyjim 2017-04-25 18:29:31			
			
						
                     
                 Code  -------------------------------------------------------------------------------------------------------------------
-- (Original: Motenten / Modified: Arislan)
-------------------------------------------------------------------------------------------------------------------
--[[	Custom Features:
		Rune Selector		Cycle through available runes and trigger with a single macro [Ctl-`]
		Knockback Mode		Equips knockback prevention gear (Ctl-[)
		Death Mode			Equips death prevention gear (Ctl-])
		Auto. Doom			Automatically equips cursna received gear on doom status
		Capacity Pts. Mode	Capacity Points Mode Toggle [WinKey-C]
		Reive Detection		Automatically equips Reive bonus gear
		Auto. Lockstyle		Automatically locks specified equipset on file load
--]]
-------------------------------------------------------------------------------------------------------------------
-- 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')
	include('organizer-lib')
end
-- Setup vars that are user-independent.
function job_setup()
	-- /BLU Spell Maps
	blue_magic_maps = {}
	blue_magic_maps.Enmity = S{'Blank Gaze', 'Geist Wall', 'Jettatura', 'Soporific',
		'Poison Breath', 'Blitzstrahl', 'Sheep Song', 'Chaotic Eye', 'Stinking Gas'}
	blue_magic_maps.Cure = S{'Wild Carrot', 'Pollen'}
	blue_magic_maps.Buffs = S{'Cocoon', 'Refueling'}
	rayke_duration = 35
	gambit_duration = 92
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.  Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
function user_setup()
	state.OffenseMode:options('Normal', 'MidAcc', 'HighAcc', 'MaxAcc') -- 'STP', 
	state.WeaponskillMode:options('Normal', 'Acc')
	state.HybridMode:options('Normal', 'PDT')
	state.CastingMode:options('Normal', 'Resistant')
	state.IdleMode:options('Normal', 'DT', 'Refresh', 'Regen')
	state.PhysicalDefenseMode:options('PDT', 'HP', 'Magic')
	state.MagicalDefenseMode:options('MDT', 'Status')
	
	state.WeaponLock = M(false, 'Weapon Lock')	
	state.Knockback = M(false, 'Knockback')
	state.Death = M(false, "Death Resistance")
	state.CP = M(false, "Capacity Points Mode")
	state.Runes = M{['description']='Runes', "Ignis", "Gelus", "Flabra", "Tellus", "Sulpor", "Unda", "Lux", "Tenebrae"}
	
	send_command('bind ` input /ma "Flash" <t>')
	send_command('bind ^` input //gs c rune')
	send_command('bind !` input /ja "Vivacious Pulse" <me>')
	send_command('bind @` input /ma "Stun" <t>')
	send_command('bind ^- gs c cycleback Runes')
	send_command('bind ^= gs c cycle Runes')
	send_command('bind !f11 gs c cycle MagicalDefenseMode')
	send_command('bind ^[ gs c toggle Knockback')
	send_command('bind ^] gs c toggle Death')
	send_command('bind ^\ gs c toggle Charm')
	send_command('bind !q input /ma "Temper" <me>')
	send_command('bind delete input /ws "Resolution" <t>')
	send_command('bind end input /ws "Dimidiation" <t>')
	if player.sub_job == 'BLU' then
		send_command('bind home input /ma "Cocoon" <me>')
	elseif player.sub_job == 'WAR' then
		send_command('bind home input /ja "Defender" <me>')
	elseif player.sub_job == 'DRK' then
		send_command('bind home input /ja "Last Resort" <me>')
	elseif player.sub_job == 'SAM' then
		send_command('bind home input /ja "Hasso" <me>')
	end
	
	send_command('bind !f9 gs c toggle WeaponLock')
	send_command('bind @c gs c toggle CP')
	send_command('bind ^f11 gs c toggle Kiting')
	
	select_default_macro_book()
	set_lockstyle()
	
	target_distance = 5.5 -- Set Default Distance Here --
end
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 delete')
	send_command('unbind end')
	send_command('unbind home')
	send_command('unbind ^delete')
	send_command('unbind ^end')
	send_command('unbind ^home')
	send_command('unbind !delete')
	send_command('unbind !end')
	send_command('unbind !home')
	send_command('unbind @delete')
	send_command('unbind @end')
	send_command('unbind @home')
	send_command('unbind !q')
	send_command('unbind !p')
	send_command('unbind @c')
	send_command('unbind !f9')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
	--------------------------------------
	-- Start defining the sets
	--------------------------------------
	
	-- Organizer: weapons
	organizer_items = {"Aettir","Zulfiqar","Refined Grip +1","Utu Grip"}
	
	-- Enmity set
	sets.Enmity = {ammo="Iron Gobbet",
		head="Halitus Helm",neck="Unmoving Collar",ear1="Trux Earring",ear2="Friomisi Earring",
		body="Emet Harness +1",hands="Kurys Gloves",ring1="Petrov Ring",ring2="Begrudging Ring",
		back=run_HP,waist="Sulla Belt",legs="Eri. Leg Guards +1",feet="Erilaz Greaves +1"}
	-- Precast sets to enhance JAs
	sets.precast.JA['Vallation'] = set_combine(sets.Enmity, {body="Runeist Coat +1",legs="Futhark Trousers +1",back=run_HP})
	sets.precast.JA['Valiance'] = sets.precast.JA['Vallation']
	sets.precast.JA['Pflug'] = set_combine(sets.Enmity, {feet="Runeist Bottes +1"})
	sets.precast.JA['Battuta'] = set_combine(sets.Enmity, {head="Futhark Bandeau +1"})
	sets.precast.JA['Liement'] = set_combine(sets.Enmity, {body="Futhark Coat +1"})
	sets.precast.JA['Lunge'] = {ammo="Seeth. Bomblet +1",
		head=herc_head_MAB,neck="Sanctity Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
		body="Samnuha Coat",hands="Leyline Gloves",ring1="Shiva Ring +1",ring2="Shiva Ring +1",
		back="Toro Cape",waist="Eschan Stone",legs=gear.Herc_MAB_legs,feet=gear.Herc_MAB_feet}
	sets.precast.JA['Swipe'] = sets.precast.JA['Lunge']
	sets.precast.JA['Gambit'] = {hands="Runeist Mitons +1"}
	sets.precast.JA['Rayke'] = {feet="Futhark Boots"}
	sets.precast.JA['Elemental Sforzo'] = set_combine(sets.Enmity, {body="Futhark Coat +1"})
	sets.precast.JA['Swordplay'] = set_combine(sets.Enmity, {hands="Futhark Mitons"})
	sets.precast.JA['Embolden'] = set_combine(sets.Enmity, {back="Evasionist's Cape"})
	sets.precast.JA['Vivacious Pulse'] = set_combine(sets.Enmity, {head="Erilaz Galea +1",neck="Incanter's Torque",ring1="Globidonta Ring",waist="Bishop's Sash",legs="Rune. Trousers +2"})
	sets.precast.JA['One For All'] = set_combine(sets.Enmity, {})
	sets.precast.JA['Provoke'] = sets.Enmity
	
	sets.precast.Waltz = {}
	sets.precast.Waltz['Healing Waltz'] = {}
	-- Fast cast sets for spells
	sets.precast.FC = {
		head="Carmine Mask",neck="Orunmila's Torque",ear1="Enchanter Earring +1",ear2="Loquacious Earring",
		body="Dread Jupon",hands="Leyline Gloves",ring1="Prolix Ring",ring2="Rahab Ring", 
		back=run_HP,waist="Ninurta's Sash",legs="Rawhide Trousers",feet="Carmine Greaves"}	
		-- Sapience Orb
	sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {legs="Futhark Trousers +1",waist="Siegel Sash"})
	sets.precast.FC.Cure = set_combine(sets.precast.FC, {ammo="Impatiens",ear2="Mendi. Earring"})
	sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {ammo="Impatiens",neck="Magoraga Beads"})
	-- Weaponskill sets
	sets.precast.WS = {ammo="Knobkierrie",
		head="Adhemar Bonnet",neck="Fotia Gorget",ear1="Moonshade Earring",ear2="Brutal earring",
		body=herc_body_TA,hands="Meghanada Gloves +2",ring1="Shukuyu Ring",ring2="Epona's Ring",
		back=run_DA,waist="Fotia Belt",legs="Samnuha Tights",feet=herc_feet_TA}
	sets.precast.WS.Acc = set_combine(sets.precast.WS, {ear2="Telos Earring",legs="Meg. Chausses +1"})
	sets.precast.WS['Resolution'] = set_combine(sets.precast.WS, {
		head="Adhemar Bonnet",ear2="Sherida Earring",body="Adhemar Jacket",hands=herc_hands_TA,legs=herc_legs_STRTA,feet=herc_feet_STRCRIT})	
		-- Adhemar Jacket 
	sets.precast.WS['Resolution'].Acc = set_combine(sets.precast.WS['Resolution'], {
		head="Dampening Tam",ear2="Telos Earring",ring1="Rufescent Ring",
		legs="Meg. Chausses +1",feet=herc_feet_ACC})
	
	sets.precast.WS['Dimidiation'] = set_combine(sets.precast.WS, {
		ear2="Sherida Earring",body="Adhemar Jacket",ring1="Ilabrat Ring",
		waist="Fotia Belt",legs="Lustratio Subligar +1",feet="Lustratio Leggings +1"})
	sets.precast.WS['Dimidiation'].Acc = set_combine(sets.precast.WS['Dimidiation'], {
		hands="Meghanada Gloves +2",ring1="Ramuh Ring +1",ring2="Ramuh Ring +1"})
	sets.precast.WS['Herculean Slash'] = sets.precast.JA['Lunge']
	sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {ammo="Floestone",
	    head=herc_head_STRWSD,neck="Caro Necklace",ear1="Moonshade Earring",ear2="Ishvara Earring",
	    body=herc_body_STRWSD,hands=herc_hands_STRWSD,ring1="Rufescent Ring",ring2="Shukuyu Ring",
		waist="Prosilio Belt +1",legs=herc_legs_STRWSD,feet=herc_feet_STRWSD})
	sets.precast.WS['Sanguine Blade'] = set_combine(sets.precast.Lunge, {head="Pixie Hairpin +1",ear1="Moonshade Earring"})
	sets.precast.WS['True Strike']= sets.precast.WS['Resolution']
	sets.precast.WS['Judgment'] = sets.precast.WS['Savage Blade']
	sets.precast.WS['Black Halo'] = sets.precast.WS['Savage Blade']
	sets.precast.WS['Flash Nova'] = sets.precast.Lunge
	--------------------------------------
	-- Midcast Sets
	--------------------------------------
	
	sets.midcast.FastRecast = sets.precast.FC
	sets.midcast.SpellInterrupt = {ammo="Impatiens",ring1="Evanescence Ring",legs="Carmine Cuisses +1"}
	sets.midcast.Cure = {ammo="Staunch Tathlum",
		head=herc_head_DT,neck="Loricate Torque +1",ear1="Roundel Earring",ear2="Mendi. Earring",
		body="Vrikodara Jupon",hands="Buremte Gloves",ring1="Defending Ring",ring2="Gelatinous Ring +1",
		back="Solemnity Cape",waist="Gishdubar Sash",legs="Eri. Leg Guards +1",feet="Skaoi Boots"}
	sets.midcast['Enhancing Magic'] = {
		head="Carmine Mask",hands="Runeist Mitons +1",legs="Carmine Cuisses +1",
		neck="Incanter's Torque",ear2="Andoaa Earring"}
		--ring1="Stikini Ring",ring2="Stikini Ring",waist="Olympus Sash"
	sets.midcast.EnhancingDuration = {head="Erilaz Galea +1",legs="Futhark Trousers +1"}
	sets.midcast['Phalanx'] = set_combine(sets.midcast['Enhancing Magic'], {head="Futhark Bandeau +1"})
	sets.midcast['Regen'] = set_combine(sets.midcast['Enhancing Magic'], {head="Runeist Bandeau +1"})
	sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash"})
	sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {})
	sets.midcast.Protect = set_combine(sets.midcast.EnhancingDuration, {ring2="Sheltered Ring"})
	sets.midcast.Shell = sets.midcast.Protect
	sets.midcast['Divine Magic'] = {neck="Incanter's Torque",waist="Bishop's Sash",legs="Rune. Trousers +2"} --ring1="Stikini Ring",ring2="Stikini Ring",
	sets.midcast.Flash = sets.Enmity
	sets.midcast.Foil = set_combine(sets.Enmity, {head="Erilaz Galea +1",legs="Futhark Trousers +1"})
	sets.midcast.Diaga = sets.Enmity
	sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
	sets.midcast['Blue Magic'] = {}
	sets.midcast['Blue Magic'].Enmity = sets.Enmity
	sets.midcast['Blue Magic'].Cure = sets.midcast.Cure
	sets.midcast['Blue Magic'].Buff = sets.midcast['Enhancing Magic']
	
	--------------------------------------
	-- Idle/resting/defense/etc sets
	--------------------------------------
	sets.idle = {ammo="Homiliary",
		head="Rawhide Mask",neck="Loricate Torque +1",ear1="Odnowa Earring",ear2="Odnowa Earring +1",
		body="Runeist Coat +1",hands=herc_hands_REF,ring1="Defending Ring",ring2="Gelatinous Ring +1",
		back="Evasionist's Cape",waist="Flume Belt",legs="Carmine Cuisses +1",feet="Erilaz Greaves +1"}
	-- PDT: 20% | DT: 24
	sets.idle.DT = set_combine(sets.idle, {body="Futhark Coat +1",hands=herc_hands_DT})
	sets.idle.Refresh = set_combine(sets.idle, {legs="Rawhide Trousers"})
	sets.idle.Regen = set_combine(sets.idle.DT, {neck="Sanctity Necklace",ring1="Paguroidea Ring",ring2="Sheltered Ring"})
	
	sets.idle.Town = set_combine(sets.idle, {head="Runeist Bandeau +1"})
	sets.idle.Weak = sets.idle.DT
	sets.Kiting = {legs="Carmine Cuisses +1"}
	--------------------------------------
	-- Defense sets
	--------------------------------------
	sets.defense.PDT = {ammo="Staunch Tathlum",
		head=herc_head_DT,neck="Loricate Torque +1", ear1="Ethereal Earring",ear2="Odnowa Earring +1",
		body="Erilaz Surcoat +1",hands=herc_hands_DT,ring1="Defending Ring",ring2="Gelatinous Ring +1",
		back=run_HP,waist="Flume Belt",legs="Eri. Leg Guards +1",feet="Erilaz Greaves +1"}
	-- DT: Head 4, Neck 6, Hands 4, Ring 10, TOTAL: 24% 	
	-- PDT: Hands 2, Ring 7, Waist 4, Legs 7, Feet 5, TOTAL: 25%
	
	sets.defense.MDT = {ammo="Staunch Tathlum",
		head=herc_head_DT,neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring",
		body="Futhark Coat +1",hands=herc_hands_DT,ring1="Defending Ring",ring2="Shadow Ring",
		back="Engulfer Cape +1",waist="Flume Belt",legs="Eri. Leg Guards +1",feet="Erilaz Greaves +1"}
		
	sets.defense.Magic = {ammo="Staunch Tathlum",
		head=herc_head_DT,neck="Warder's Charm +1",ear1="Etiolation Earring",ear2="Odnowa Earring +1",
		body="Runeist Coat +1",hands=herc_hands_DT,ring1="Defending Ring",ring2="Shadow Ring",
		back="Reiki Cloak",waist="Flume Belt",legs="Eri. Leg Guards +1",feet="Erilaz Greaves +1"}	
	sets.defense.Status = {ammo="Staunch Tathlum", 
		head=herc_head_DT_head,neck="Loricate Torque +1",ear1="Hearty Earring",ear2="Odnowa Earring +1", 
		body="Runeist Coat +1",hands="Erilaz Gauntlets +1",ring1="Defending Ring",ring2="Gelatinous Ring +1",
		back="Evasionist's Cape",waist="Flume Belt",legs="Rune. Trousers +2",feet="Erilaz Greaves +1"}
	
	sets.defense.HP = {ammo="Staunch Tathlum", 
		head="Erilaz Galea +1",neck="Loricate Torque +1",ear1="Odnowa Earring",ear2="Odnowa Earring +1",
		body="Erilaz Surcoat +1",hands="Runeist Mitons +1",ring1="Defending Ring",ring2="Gelatinous Ring +1", 
		back="Reiki Cloak",waist="Flume Belt",legs="Eri. Leg Guards +1",feet="Erilaz Greaves +1"}
	sets.defense.Critical = {}
	--sets.defense.Knockback = {back="Repulse Mantle"}
	sets.defense.Death = {body="Samnuha Coat",ring1="Warden's Ring"}
	--------------------------------------
	-- Engaged sets
	--------------------------------------
	
	-- Accuracy: 1029
	sets.engaged = {ammo="Ginsen",
		head="Adhemar Bonnet",neck="Anu Torque",ear2="Sherida Earring",ear1="Telos Earring",
		body=herc_body_TA,hands=herc_hands_TA,ring1="Petrov Ring",ring2="Epona's Ring",
		back=run_TP,waist="Windbuffet Belt +1",legs="Samnuha Tights",feet=herc_feet_TA}
	-- Accuracy: 1056
	sets.engaged.MidAcc = set_combine(sets.engaged, {neck="Combatant's Torque",hands="Adhemar Wristbands"})
	-- Accuracy: 1112
	sets.engaged.HighAcc = set_combine(sets.engaged.MidAcc, {ammo="Falcon Eye",waist="Ioskeha Belt",legs="Carmine Cuisses +1"})
	-- Accuracy: 1215
	sets.engaged.MaxAcc = set_combine(sets.engaged.HighAcc, {
		head="Carmine Mask",ear1="Dignitary's Earring",
		body=herc_body_ACC,ring1="Ramuh Ring +1",ring2="Ramuh Ring +1",
		feet=herc_feet_ACC})
		-- Kentarch Belt +1
	sets.engaged.STP = sets.engaged
		
	-- Accuracy: Aettir 1202 | Zulfiqar: 1169 	
	sets.engaged.PDT = {ammo="Seething Bomblet +1",
    head="Meghanada Visor +1",neck="Loricate Torque +1",ear1="Sherida Earring",ear2="Telos Earring",
    body="Meghanada Cuirie +1",hands="Meghanada Gloves +2",ring1="Defending Ring",ring2="Patricius Ring",
	back=run_TP,waist="Ioskeha Belt",legs="Meghanada Chausses +1",feet=herc_feet_PDT}
	-- Custom buff sets
	--sets.buff.Doom = {ring1="Saida Ring",ring2="Saida Ring",waist="Gishdubar Sash"}
	sets.buff['Embolden'] = {back="Evasionist's Cape",head="Erilaz Galea +1",legs=" Futhark Trousers +1"}
	sets.CP = {back="Mecisto. Mantle"}
	sets.Reive = {neck="Arciela's Grace +1"}
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
function job_pretarget(spell,action)
    if spell.type == "WeaponSkill" and player.status == 'Engaged' and spell.target.distance > target_distance then -- Cancel WS If You Are Out Of Range --
       cancel_spell()
       add_to_chat(123, spell.name..' Canceled: [Out of Range]')
       return
    end
end	
function job_precast(spell, action, spellMap, eventArgs)
	if spell.english == 'Lunge' then
		local abil_recasts = windower.ffxi.get_ability_recasts()
		if abil_recasts[spell.recast_id] > 0 then
			send_command('input /jobability "Swipe" <t>')
			add_to_chat(122, '***Lunge Aborted: Timer on Cooldown -- Downgrading to Swipe.***')
			eventArgs.cancel = true
			return
		end
	end
	if spell.english == 'Valiance' then
		local abil_recasts = windower.ffxi.get_ability_recasts()
		if abil_recasts[spell.recast_id] > 0 then
			send_command('input /jobability "Vallation" <me>')
			eventArgs.cancel = true
			return
		end
	end	
	if spellMap == 'Utsusemi' then
		if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
			cancel_spell()
			add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
			eventArgs.handled = true
			return
		elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
			send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
		end
	end
	if (spell.type:endswith('Magic') or spell.type == "Ninjutsu" or spell.type == "Geomancy") then
	   if buffactive.Silence then
		cancel_spell()
		send_command('input /item "Echo Drops" <me>')
       end
    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.english == 'Lunge' or spell.english == 'Swipe' then
		local obi = get_obi(get_rune_obi_element())
		if obi then
			equip({waist=obi})
		end
	end
	if spell.skill == 'Enhancing Magic' and classes.NoSkillSpells:contains(spell.english) then
		equip(sets.midcast.EnhancingDuration)
	end	
	-- If DefenseMode is active, apply that gear over midcast
	-- choices.  Precast is allowed through for fast cast on
	-- spells, but we want to return to def gear before there's
	-- time for anything to hit us.
	-- Exclude Job Abilities from this restriction, as we probably want
	-- the enhanced effect of whatever item of gear applies to them,
	-- and only one item should be swapped out.
	if state.DefenseMode.value ~= 'None' and spell.type ~= 'JobAbility' then
		handle_equipping_gear(player.status)
		eventArgs.handled = true
	end
	if buffactive['Reive Mark'] and spell.type == 'WeaponSkill' then
		equip(sets.Reive)
	end
end
function job_aftercast(spell, action, spellMap, eventArgs)
	if spell.name == 'Rayke' and not spell.interrupted then
		send_command('@timers c "Rayke ['..spell.target.name..']" '..rayke_duration..' down spells/00136.png')
		send_command('wait '..rayke_duration..';input /p <bstar><bstar><bstar> <ldangle> Rayke: OFF <rdangle> <bstar><bstar><bstar> <call21>;')
	elseif spell.name == 'Gambit' and not spell.interrupted then
		send_command('@timers c "Gambit ['..spell.target.name..']" '..gambit_duration..' down spells/00136.png')
		send_command('wait '..gambit_duration..';input /p <bstar><bstar><bstar> <ldangle> Gambit: OFF <rdangle> <bstar><bstar><bstar> <call21>;')
	end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
-- Called when the player's status changes.
function job_state_change(field, new_value, old_value)
	classes.CustomDefenseGroups:clear()
	classes.CustomDefenseGroups:append(state.Knockback.current)
	classes.CustomDefenseGroups:append(state.Death.current)
	classes.CustomMeleeGroups:clear()
	classes.CustomMeleeGroups:append(state.Knockback.current)
	classes.CustomMeleeGroups:append(state.Death.current)
end
function job_buff_change(buff,gain)
	-- If we gain or lose any haste buffs, adjust which gear set we target.
	--Embolden cape lock--
    if buff == 'Embolden' then
        if gain then 
            disable('head','legs','back')
            equip({head="Erilaz Galea +1",legs="Futhark Trousers +1",back="Evasionist's Cape"})
            add_to_chat(158,'[Embolden] ON -- Back Locked')
        else
            enable('head','legs','back')
            add_to_chat(123,'[Embolden] OFF -- Back Unlocked')
            status_change(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')
	else
		enable('main','sub')
	end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- 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.Knockback.value == true then
		idleSet = set_combine(idleSet, sets.defense.Knockback)
		end
	if state.Death.value == true then
		idleSet = set_combine(idleSet, sets.defense.Death)
		end
	if state.CP.current == 'on' then
		equip(sets.CP)
		disable('back')
	else
		enable('back')
	end
	return idleSet
end
-- Modify the default melee set after it was constructed.
function customize_melee_set(meleeSet)
	if state.Knockback.value == true then
		meleeSet = set_combine(meleeSet, sets.defense.Knockback)
		end
	if state.Death.value == true then
		meleeSet = set_combine(meleeSet, sets.defense.Death)
		end
	return meleeSet
end
function customize_defense_set(defenseSet)
	if state.Knockback.value == true then
		defenseSet = set_combine(defenseSet, sets.defense.Knockback)
		end
	if state.Death.value == true then
		defenseSet = set_combine(defenseSet, sets.defense.Death)
		end
	return defenseSet
end
-- Function to display the current relevant user state when doing an update.
-- Set eventArgs.handled to true if display was handled, and you don't want the default info shown.
function display_current_job_state(eventArgs)
	local msg = '[ Melee'
	
	if state.CombatForm.has_value then
		msg = msg .. ' (' .. state.CombatForm.value .. ')'
	end
	
	msg = msg .. ': '
	
	msg = msg .. state.OffenseMode.value
	if state.HybridMode.value ~= 'Normal' then
		msg = msg .. '/' .. state.HybridMode.value 
	end
	msg = msg .. ' ][ WS: ' .. state.WeaponskillMode.value .. ' ]'
	
	if state.DefenseMode.value ~= 'None' then
		msg = msg .. '[ Defense: ' .. state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ' ]'
	end
	
	if state.Knockback.value == true then
		msg = msg .. '[ Knockback: ON ]'
	end
	
	if state.Death.value == true then
		msg = msg .. '[ Death: ON ]'
	end
	if state.Kiting.value then
		msg = msg .. '[ Kiting Mode: ON ]'
	end
	
	msg = msg .. '[ *Rune: '..state.Runes.current .. '* ]'
	
	add_to_chat(050, msg)
	eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- General hooks for other events.
-------------------------------------------------------------------------------------------------------------------
function job_get_spell_map(spell, default_spell_map)
	if spell.skill == 'Blue Magic' then
		for category,spell_list in pairs(blue_magic_maps) do
			if spell_list:contains(spell.english) then
				return category
			end
		end
	end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements self-commands.
-------------------------------------------------------------------------------------------------------------------
function job_self_command(cmdParams, eventArgs)
	if cmdParams[1]:lower() == 'rune' then
		send_command('@input /ja '..state.Runes.value..' <me>')
	end
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
-- Select default macro book on initial load or subjob change.
function get_rune_obi_element()
	weather_rune = buffactive[elements.rune_of[world.weather_element] or '']
	day_rune = buffactive[elements.rune_of[world.day_element] or '']
	
	local found_rune_element
	
	if weather_rune and day_rune then
		if weather_rune > day_rune then
			found_rune_element = world.weather_element
		else
			found_rune_element = world.day_element
		end
	elseif weather_rune then
		found_rune_element = world.weather_element
	elseif day_rune then
		found_rune_element = world.day_element
	end
	
	return found_rune_element
end
function get_obi(element)
	if element and elements.obi_of[element] then
		return (player.inventory[elements.obi_of[element]] or player.wardrobe[elements.obi_of[element]]) and elements.obi_of[element]
	end
end
-- Select default macro book on initial load or subjob change.
function select_default_macro_book()
	-- Default macro set/book: (set, book)
	if player.sub_job == 'BLU' then
		set_macro_page(2, 11)
	else
		set_macro_page(1, 11)
	end
end
function set_lockstyle()
	send_command('wait 6;input /lockstyleset 10')
end
I can't seem to get my lua to equip my Enhancing Duration gear while Embolden is active. Code I tried is on line 442. Any help is appreciated.                                     
            
                
                     Shiva.Hiep
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 669 
                
			
			By Shiva.Hiep 2017-04-27 18:00:57			
			
						
                     
                 I need some help making some self-cure sets but not sure about the functions. Would anyone know how to make a function for self-cures and another one that works under light weather?                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Shiva Game: FFXI Posts: 1052 
                
			
			By Shiva.Arislan 2017-04-27 23:05:53			
			
						
                     
                 Code  function init_gear_sets()
    sets.midcast.CureWeather = set_combine(sets.midcast.Cure, {
        main="Chatoyant Staff",
        waist="Hachirin-no-Obi",
        --etc
        })
    sets.midcast.CureSelf = set_combine(sets.midcast.Cure, 
        hands="Buremte Gloves", -- (13)
        neck="Phalaina Locket", -- 4(4)
        ring2="Asklepian Ring", -- (3)
        waist="Gishdubar Sash", -- (10)
        --etc
        })
endCode  function job_post_midcast(spell, action, spellMap, eventArgs)
    if spellMap == 'Cure' and spell.target.type == 'SELF' then
        equip(sets.midcast.CureSelf)
    end
endCode  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
    end
end 
            
                
                     Bismarck.Xurion
                                                    
                                                                            
                                Server: Bismarck Game: FFXI Posts: 696 
                
			
			By Bismarck.Xurion 2017-04-28 03:32:17			
			
						
                     
                 Is there a way to tell GS to unequip an item? Something like: Code  
    sets.no_gear = {
        head = "",
        neck = "",
        ear1 = "",
        ear2 = "",
        body = "",
        hands = "",
        ring1 = "",
        ring2 = "",
        back = "",
        waist = "",
        legs = "",
        feet = ""
    }
I tried the above but nope.                                     
            
                
                    
                    
                    
                                                            
                                                    
                                                                            
                                Server: Sylph Game: FFXI Posts: 184 
                
			
			By Sylph.Subadai 2017-04-28 04:43:59			
			
						
                     
                 Is there a way to tell GS to unequip an item? 
I think this might work (you can also use the command //gs equip naked but that will unequip everything including weapon):
 Code  
    sets.no_gear = {
        head = empty,
        neck = empty,
        ear1 = empty,
        ear2 = empty,
        body = empty,
        hands = empty,
        ring1 = empty,
        ring2 = empty,
        back = empty,
        waist = empty,
        legs = empty,
        feet = empty
    }
 
    
    
        
        Just looking for someone to explain this addon a bit for me. It looks like it is an alternative to Spellcast. 
 Is it going to be replacing Spellcast? In which ways is it better or worse. I don't know any programming but I've slowly learned more and more about spellcast and the 'language' used in gearswap is confusing to me.
 
 It says it uses packets so it potentially could be more detectable? but does that also eliminate any lag that spellcast may encounter?
 
 I plan on redoing my PUP xml to include pet casting sets thanks to the new addon petschool. I'm just not sure if it's worth it to just wait until gearswap gets more popular or to go ahead and do it in spellcast.
 
 If anyone could give me more info I'd greatly appreciate it.
 |  |