|
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: 1326
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 you One 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')
end Code 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')
end Code 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.Caiir
VIP
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.Caiir
VIP
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
})
end Code function job_post_midcast(spell, action, spellMap, eventArgs)
if spellMap == 'Cure' and spell.target.type == 'SELF' then
equip(sets.midcast.CureSelf)
end
end
Code 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: 694
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.
|
|