|
Gearswoop: A gearswap companion app
By Exclore 2020-09-27 11:14:00
Announcing the beta release of Gearswoop! Gearswoop.com
Gearswoop is a web app that provides a graphical user interface for creating Windower4 gearswap lua files.
Primary Features:
Enter your character's name and job for a very basic gearswap template.
Use gearswap in-game to create a file of your gear, then upload it so you can pick from gear you actually own. (including augments!)
Add sets to the template for specific abilities or spells.
Download a fully functional gearswap file that can be dropped into your gearswap addon folder.
Intended Audience:
In it's beta form the app is only able to create very basic swaps. Advanced users of gearswap will most likely not find this app as useful (yet! please look forward to more advanced features in the future), but the hope is that novice users or players new to using/creating swaps will find this to be much easier than hunting down a random lua file and manually entering their gear.
Planned Features:
Based on feedback from users (like you!) I'll be implementing additional features to make the swaps the app can generate more robust. Some of the ideas I have are:
Modes - ability to set up modes that you can toggle with various keybinds to equip certain sets or combinations of sets when you need them.
Keybinds - ability to create arbitrary keybinds tied to gearswap functionality
Custom Scripts - ability to add custom scripts to the gearswap.
Disclaimers:
As mentioned, this is a beta release: This means that there are bugs, user experience problems, etc. that need to be worked out. I am looking for feedback on the user experience, generated gearswap files, bugs, and any other thoughts you might have on the app.
If you are an expert on a particular job and/or gearswap I'd love to hear from you! The swap templates I'm using are gutted versions of the most common gearswaps used by various guides for each job I could find, but I don't personally play every job. Find that the template swap for RNG is completely unusable because it doesn't include *insert set name here*? Let me know and I'd be happy to adjust it. Keep in mind that I'm trying to strike a balance between the template being simple and usable while still providing enough functionality for users to find it useful.
Asura.Seizan
Server: Asura
Game: FFXI
Posts: 124
By Asura.Seizan 2020-09-27 11:27:57
Do we really need more tools to play ffxi?
(Sorry for being old and grumpy)
Bismarck.Pebbs
Server: Bismarck
Game: FFXI
Posts: 19
By Bismarck.Pebbs 2020-09-27 12:02:11
I actually really like this.
Yes, I am still getting more friends to play this game who are not programmers, but who are quite frankly overwhelmed by barrier to entry for gear swap.
Until V5 Windower has something to handle augmented gear, this is a great way to introduce players to gearswap.
Feedback:
- The gear upload file doesn't always seem to work when uploaded.
- There isn't a privacy policy on the site.
- What are you doing with uploaded files? Or is this all client side?
[+]
By Exclore 2020-09-27 16:05:33
I have noticed some finicky behavior with the gear upload, but I haven't tracked down exactly what has been causing it. (if you have it happen and can hit the F12 key to open the console and shoot me a screenshot of any errors if it happens to you that would be awesome!)
All of the gear upload/processing is done client side and state between visits is maintained by a local cookie- no server side shenanigans going on (yet). May do a login/account/oauth type thing in the near future if people want it.
Because of that I didn't think a privacy policy was needed, but it'd probably be a good idea. Should also probably have a one of those stupid cookie banners since some areas are more picky about cookies than others.
Unicorn.Rufio
Server: Unicorn
Game: FFXI
Posts: 161
By Unicorn.Rufio 2020-09-27 16:19:51
Do we really need more tools to play ffxi?
(Sorry for being old and grumpy)
Let people play the game they pay for however they want. Mind your business.
Server: Sylph
Game: FFXI
Posts: 5
By Sylph.Khirali 2020-09-27 16:23:21
Server: Asura
Game: FFXI
Posts: 415
By Asura.Cambion 2020-09-27 21:25:42
This is kind of already built into gearswap.
1: Manually equip any gear set you desire, in game.
2: //gs export (this sends whatever your wearing, (incl augs) directly to a folder in gearswap)
3: Copy/paste into your lua
4: ???
5: Profit
But anything that helps people understand gearswap better, I support. In fact, just offering the most basic form(skeleton) of a lua will likely be incredibly beneficial as to not overwhelm people.
Having said that... I took a look at the Dnc lua just to see what it had, and I think it's missing too many things that are essential and carries too many toggles that are significantly beyond the target audience.
I wanted to create my own to offer, in attempt to actually be helpful and constructive, but all of my lua's rely on GearInfo for haste/dual wield tiers, and may only complicate things further.
I've given this some thought, and in my personal opinion, people would be better off giving excessive help text and descriptions within a lua, rather than outside as a guide. I've written a gearswap guide twice over the years, and every time I look back on them, I truly feel I would have better served people if I did the following instead:
Go to each job forum, get the most popular and most widely used lua that they all use.
Then, instead of gutting the utility out of it to simplify it for newer people, just go through each section of code and explain exactly what the code represents or does inside the game INSIDE the lua. Then let them decide for themselves if they ever want to touch it.
For those who want a Skeleton Dnc lua, that DOES utilize GearInfo for haste tiers, I just gutted mine, and left a blank template for gear.
Drop in a TP set + Idle Set + WS set, and this will handle 90% of what you need in game. Once you get comfortable, you can add gear sets for any ability you want, start playing with haste tiers, hybrid sets, etc etc. I have SOME things explained and written, but it's not fully comprehensive yet.
I loaded it to make sure it works, emptied 90% of the gear, but left a few swaps in there, just to help people understand what makes sense for a few sets specific to Dnc. The issue with old haste tiers is that they can't decipher Haste1 from Haste2 or Geo Haste, and the combinations of all those hastes can greatly alter what tier you should be in. GearInfo directly reads the game side to tell exactly how much JA, magic, and gear haste you have, as well as DW to properly calculate instantly upon receiving a buff.
Code -- Initialization function for this job file.
function get_sets()
mote_include_version = 2
include('Mote-Include.lua')
end
-- Setup variables that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.Buff['Climactic Flourish'] = buffactive['climactic flourish'] or false
state.MainStep = M{['description']='Main Step', 'Box Step', 'Quickstep', 'Feather Step', 'Stutter Step'}
state.SelectStepTarget = M(false, 'Select Step Target')
state.IgnoreTargetting = M(true, 'Ignore Targetting')
state.ClosedPosition = M(false, 'Closed Position')
lockstyleset = 15
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job.
-------------------------------------------------------------------------------------------------------------------
-- Gear Modes
function user_setup()
state.HybridMode:options('Normal', 'MagEva', 'HIGH', 'MID', 'LOW')
-- Additional Key Binds.
send_command('bind ^` input /ja "Chocobo Jig II" <me>') --Ctrl'~'
send_command('bind !` input /ja "Spectral Jig" <me>') --Alt'~'
send_command('bind f9 gs c cycle OffenseMode') --F9
send_command('bind f10 gs c cycle HybridMode') --F10
send_command('bind f11 gs c cycle mainstep') --F11
send_command('bind ^c input /ja "Contradance" <me>') --Ctrl'C'
send_command('bind ^t input /ja "Trance" <me>') --Ctrl'T'
send_command('bind ^g input /ja "Grand Pas" <me>') --Ctrl'G'
send_command('lua l gearinfo') --If you don't have GearInfo, Haste tiers won't work properly.
select_default_macro_book()
set_lockstyle()
Haste = 0
DW_needed = 0
DW = false
moving = false
update_combat_form()
determine_haste_group()
end
-- Erases the Key Binds above when you switch to another job.
function user_unload()
send_command('unbind ^`')
send_command('unbind !`')
send_command('unbind f11')
send_command('gs enable all')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.JA['No Foot Rise'] = {body="Horos Casaque +3"}
sets.precast.JA['Trance'] = {}
sets.precast.JA['Grand Pas'] = {}
sets.precast.JA['Contradance'] = {}
sets.precast.JA['Saber Dance'] = {}
sets.precast.JA['Fan Dance'] = {}
sets.precast.JA['Presto'] = {}
sets.precast.Waltz = {
head="Anwig Salade",
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --50%
sets.precast.WaltzSelf = {
ammo="Yamarang", --5
head="Mummu Bonnet +2", --0/9R
neck="Etoile Gorget +2", --10
body="Maxixi Casaque +3", --19/8R
hands={ name="Herculean Gloves", augments={'Accuracy+14','"Waltz" potency +11%','DEX+9','Attack+9',}}, --11
ring2="Asklepian Ring", --0/3R
back="Toetapper Mantle", --5
legs="Dashing Subligar", --10
feet="Maxixi Toe shoes +1", --10
} --70/20R
sets.precast.Samba = {}
sets.precast.Jig = {}
sets.precast.Step = {}
sets.precast.Step['Feather Step'] = {}
sets.precast.Flourish1 = {}
sets.precast.Flourish1['Animated Flourish'] = {}
sets.precast.Flourish1['Violent Flourish'] = {}
sets.precast.Flourish1['Desperate Flourish'] = {}
sets.precast.Flourish2 = {}
sets.precast.Flourish2['Reverse Flourish'] = {hands="Macu. Bangles +1",back="Toetapper Mantle"}
sets.precast.Flourish3 = {}
sets.precast.Flourish3['Striking Flourish'] = {}
sets.precast.Flourish3['Climactic Flourish'] = {}
sets.precast.FC = {}
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {body="Passion Jacket",neck="Magoraga Beads"})
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.WS.Critical = {body="Meg. Cuirie +2"}
sets.precast.WS = {}
sets.precast.WS['Exenterator'] = {}
sets.precast.WS['Pyrrhic Kleos'] = {}
sets.precast.WS['Evisceration'] = {}
sets.precast.WS['Shark Bite'] = {}
sets.precast.WS['Aeolian Edge'] = {}
sets.precast.WS['Rudra\'s Storm'] = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.idle = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
sets.idle.Town = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- This is a Set that would only be used when you are NOT Dual Wielding. Most likely Airy Buckler Builds with Fencer as War Sub.
-- There are no haste parameters set for this build, because you wouldn't be juggling DW gear, you would always use the same gear, other than Damage Taken and Accuracy sets which ARE included below.
sets.engaged = {}
------------------------------------------------------------------------------------------------
-------------------------------------- Dual Wield Sets -----------------------------------------
------------------------------------------------------------------------------------------------
-- * DNC Native DW Trait: 30% DW
-- * DNC Job Points DW Gift: 5% DW
-- No Magic Haste (38% DW to cap)
sets.engaged.DW = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 15% Magic Haste (32% DW to cap)
sets.engaged.DW.LowHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 30% Magic Haste (20% DW to cap)
sets.engaged.DW.MidHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 40% Magic Haste (8% DW to cap)
sets.engaged.DW.HighHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
-- 45% Magic Haste (0% DW to cap)
sets.engaged.DW.MaxHaste = {
ammo="",
head="",
neck="",
ear1="",
ear2="",
body="",
hands="",
ring1="",
ring2="",
back="",
waist="",
legs="",
feet="",
}
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
-- Define tiers of Defense Taken. These sets are cycled with the F10 Button.
sets.engaged.DT1 = {ring1="Defending Ring",ring2="Vocane Ring",Neck="Loricate Torque +1"} --23%
sets.engaged.DT2 = {}
sets.engaged.DT3 = {}
sets.engaged.DT4 = {}
-- Shield Base
sets.engaged.LOW = set_combine(sets.engaged, sets.engaged.DT1)
sets.engaged.MID = set_combine(sets.engaged, sets.engaged.DT2)
sets.engaged.HIGH = set_combine(sets.engaged, sets.engaged.DT3)
sets.engaged.MagEva = set_combine(sets.engaged, sets.engaged.DT4)
-- No Haste DW
sets.engaged.DW.LOW = set_combine(sets.engaged.DW, sets.engaged.DT1)
sets.engaged.DW.MID = set_combine(sets.engaged.DW, sets.engaged.DT2)
sets.engaged.DW.HIGH = set_combine(sets.engaged.DW, sets.engaged.DT3)
sets.engaged.DW.MagEva = set_combine(sets.engaged.DW, sets.engaged.DT4)
-- Low Haste DW
sets.engaged.DW.LOW.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT1)
sets.engaged.DW.MID.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.DT4)
-- Mid Haste
sets.engaged.DW.LOW.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.DT4)
-- High Haste
sets.engaged.DW.LOW.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT1)
sets.engaged.DW.MID.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.DT4)
-- Max Haste
sets.engaged.DW.LOW.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT1)
sets.engaged.DW.MID.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT2)
sets.engaged.DW.HIGH.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT3)
sets.engaged.DW.MagEva.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.DT4)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.buff.Doom = {}
sets.buff['Saber Dance'] = {}
sets.buff['Fan Dance'] = {}
sets.buff['Closed Position'] = {}
sets.buff['Climactic Flourish'] = {head="Maculele Tiara +1",body="Meg. Cuirie +2"}
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
-- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
function job_precast(spell, action, spellMap, eventArgs)
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
-- Used to overwrite Moonshade Earring if TP is more than 2750.
if spell.type == 'WeaponSkill' then
if player.tp > 2750 then
equip({ear1 = "Telos Earring"})
end
-- Used to optimize Rudra's Storm when Climactic Flourish is active.
if spell.english == "Rudra's Storm" and buffactive['Climactic Flourish'] then
equip({head="Maculele Tiara +1",ear2="Ishvara Earring",body="Meghanada Cuirie +2",ammo="Charis Feather"})
end
-- If a forced Critical Hit is coming, this prioritizes gear to maximize Crit Dmg
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
end
function job_post_precast(spell, action, spellMap, eventArgs)
if spell.type == "WeaponSkill" then
if state.Buff['Climactic Flourish'] then
equip(sets.buff['Climactic Flourish'])
end
end
--This will detect if you are Waltzing yourself, and if so, equip gear that maximizes 'walts effect received' stats.
if spell.english == "Curing Waltz" or spell.english == "Curing Waltz II" or spell.english == "Curing Waltz III" or spell.english == "Curing Waltz IV" or spell.english == "Curing Waltz V" and spell.target.type == 'SELF' then
equip(sets.precast.WaltzSelf)
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff,gain)
if buff == 'Saber Dance' or buff == 'Climactic Flourish' or buff == 'Fan Dance' then
handle_equipping_gear(player.status)
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
function job_handle_equipping_gear(playerStatus, eventArgs)
update_combat_form()
determine_haste_group()
end
function job_update(cmdParams, eventArgs)
handle_equipping_gear(player.status)
end
function update_combat_form()
if DW == true then
state.CombatForm:set('DW')
elseif DW == false then
state.CombatForm:reset()
end
end
function get_custom_wsmode(spell, spellMap, defaut_wsmode)
local wsmode
return wsmode
end
function customize_idle_set(idleSet)
return idleSet
end
function customize_melee_set(meleeSet)
if state.Buff['Climactic Flourish'] then
meleeSet = set_combine(meleeSet, sets.buff['Climactic Flourish'])
end
return meleeSet
end
-- Handle auto-targetting based on local setup.
function job_auto_change_target(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
if state.IgnoreTargetting.value == true then
state.IgnoreTargetting:reset()
eventArgs.handled = true
end
eventArgs.SelectNPCTargets = state.SelectStepTarget.value
end
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.ClosedPosition.value then
msg = msg .. '[ Closed Position: ON ]'
end
if state.Kiting.value then
msg = msg .. '[ Kiting Mode: ON ]'
end
msg = msg .. '[ '..state.MainStep.current
msg = msg .. ' ]'
add_to_chat(123, msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
function determine_haste_group()
classes.CustomMeleeGroups:clear()
if DW == true then
if DW_needed <= 1 then
classes.CustomMeleeGroups:append('MaxHaste')
elseif DW_needed > 1 and DW_needed <= 9 then
classes.CustomMeleeGroups:append('HighHaste')
elseif DW_needed > 9 and DW_needed <= 21 then
classes.CustomMeleeGroups:append('MidHaste')
elseif DW_needed > 21 and DW_needed <= 38 then
classes.CustomMeleeGroups:append('LowHaste')
elseif DW_needed > 38 then
classes.CustomMeleeGroups:append('')
end
end
end
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'step' then
if cmdParams[2] == 't' then
state.IgnoreTargetting:set()
end
local doStep = ''
if state.UseAltStep.value == true then
doStep = state[state.CurrentStep.current..'Step'].current
state.CurrentStep:cycle()
else
doStep = state.MainStep.current
end
send_command('@input /ja "'..doStep..'" <t>')
end
gearinfo(cmdParams, eventArgs)
end
function gearinfo(cmdParams, eventArgs)
if cmdParams[1] == 'gearinfo' then
if type(tonumber(cmdParams[2])) == 'number' then
if tonumber(cmdParams[2]) ~= DW_needed then
DW_needed = tonumber(cmdParams[2])
DW = true
end
elseif type(cmdParams[2]) == 'string' then
if cmdParams[2] == 'false' then
DW_needed = 0
DW = false
end
end
if type(tonumber(cmdParams[3])) == 'number' then
if tonumber(cmdParams[3]) ~= Haste then
Haste = tonumber(cmdParams[3])
end
end
if type(cmdParams[4]) == 'string' then
if cmdParams[4] == 'true' then
moving = true
elseif cmdParams[4] == 'false' then
moving = false
end
end
if not midaction() then
job_update()
end
end
end
-- If you attempt to use a step, this will automatically use Presto.
function job_pretarget(spell, action, spellMap, eventArgs)
if spell.type == 'Step' then
local allRecasts = windower.ffxi.get_ability_recasts()
local prestoCooldown = allRecasts[236]
if player.main_job_level >= 77 and prestoCooldown < 1 and not buffactive['Presto'] then
cast_delay(1.1)
send_command('input /ja "Presto" <me>')
end
end
-- If you attempt to use Climactic Flourish with less than 4 finishing moves, this will automatically use 'Current Step' and resend Climactic Flourish.
local under4FMs = not buffactive['Finishing Move 4'] and not buffactive['Finishing Move 5'] and not buffactive['Finishing Move (6+)']
local doStep = ''
local doStep = state.MainStep.current
if spell.english == "Climactic Flourish" and under4FMs then
cast_delay(1.9)
send_command('@input /ja "'..doStep..'" <t>')
end
end
-- Automatically loads a Macro Set by: (Pallet,Book)
function select_default_macro_book()
if player.sub_job == 'SAM' then
set_macro_page(1, 5)
elseif player.sub_job == 'WAR' then
set_macro_page(2, 5)
elseif player.sub_job == 'RUN' then
set_macro_page(3, 5)
elseif player.sub_job == 'DRG' then
set_macro_page(5, 5)
elseif player.sub_job == 'BLU' then
set_macro_page(6, 5)
elseif player.sub_job == 'THF' then
set_macro_page(9, 5)
elseif player.sub_job == 'NIN' then
set_macro_page(10, 5)
else
set_macro_page(1, 5)
end
end
function set_lockstyle()
send_command('wait 2; input /lockstyleset ' .. lockstyleset)
end
[+]
Ragnarok.Kogenta
Server: Ragnarok
Game: FFXI
Posts: 214
By Ragnarok.Kogenta 2020-09-28 07:10:18
I actually really like this.
Yes, I am still getting more friends to play this game who are not programmers, but who are quite frankly overwhelmed by barrier to entry for gear swap.
This one million times.
- Some gear description is off template and has some formatting problem, like Odnowa earring +1.
- It would be VERY NICE, but i know it may be a lot of work, to have listed beside the set the actual total stats like haste, accuracy, etc... :D
Good Job OP! Site looks cool and with lot of potential
[+]
Announcing the beta release of Gearswoop! Gearswoop.com
Gearswoop is a web app that provides a graphical user interface for creating Windower4 gearswap lua files.
Primary Features:
Enter your character's name and job for a very basic gearswap template.
Use gearswap in-game to create a file of your gear, then upload it so you can pick from gear you actually own. (including augments!)
Add sets to the template for specific abilities or spells.
Download a fully functional gearswap file that can be dropped into your gearswap addon folder.
Intended Audience:
In it's beta form the app is only able to create very basic swaps. Advanced users of gearswap will most likely not find this app as useful (yet! please look forward to more advanced features in the future), but the hope is that novice users or players new to using/creating swaps will find this to be much easier than hunting down a random lua file and manually entering their gear.
Planned Features:
Based on feedback from users (like you!) I'll be implementing additional features to make the swaps the app can generate more robust. Some of the ideas I have are:
Modes - ability to set up modes that you can toggle with various keybinds to equip certain sets or combinations of sets when you need them.
Keybinds - ability to create arbitrary keybinds tied to gearswap functionality
Custom Scripts - ability to add custom scripts to the gearswap.
Disclaimers:
As mentioned, this is a beta release: This means that there are bugs, user experience problems, etc. that need to be worked out. I am looking for feedback on the user experience, generated gearswap files, bugs, and any other thoughts you might have on the app.
If you are an expert on a particular job and/or gearswap I'd love to hear from you! The swap templates I'm using are gutted versions of the most common gearswaps used by various guides for each job I could find, but I don't personally play every job. Find that the template swap for RNG is completely unusable because it doesn't include *insert set name here*? Let me know and I'd be happy to adjust it. Keep in mind that I'm trying to strike a balance between the template being simple and usable while still providing enough functionality for users to find it useful.
|
|