|
Gearswap Support Thread
Phoenix.Sweden
Server: Phoenix
Game: FFXI
Posts: 13
By Phoenix.Sweden 2022-04-06 12:43:37
Carbuncle.Yiazmaat said: »I constantly get a sel-utility lua error today on blu and it doesnt swap to ws gear for savage blade or black halo, it act as if i was fencing (it work if i use a shield, but not when i dw weapons) and not dw. I tried to copy past the original from github but its useless as ive never modified it. Someone got an idea ?
It says sel utility 2275 attempt to index ? a nil value
I am also getting this error. I think its something to do with checking for dual wield, but I am unsure how to fix it.
Bahamut.Butmunch
Server: Bahamut
Game: FFXI
Posts: 101
By Bahamut.Butmunch 2022-04-06 12:56:33
Asura.Bippin
Server: Asura
Game: FFXI
Posts: 1090
By Asura.Bippin 2022-04-06 13:07:06
Edit: Also this link above is missing a ton of other files that Sel's lua use and can cause other problems/error when using outdated Job.lua
Just FYI Sel's old discord still offers support/help using this repo
https://github.com/Headtatt/Gearswap
Phoenix.Sweden
Server: Phoenix
Game: FFXI
Posts: 13
By Phoenix.Sweden 2022-04-06 13:28:30
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-14 11:53:07
So I've been tryin to edit a friend's lua to add a small thing to it, but I've been unsuccessful so far.
His lua is based off Motenten's stuff.
I tried the line in my own luas and they work, so I'm not sure what I'm doin wrong, but let's get into details.
What I want to do is for his GS lua to perform an action (windower.chat.input or send_command, it's the same) whenever he engages a target.
His job.lua doesn't have the status_change function, that's because it's in the mote-include.lua file.
So I went there and right before the end of the function I added the following lines:
Code if newStatus == 'Engaged' then
send_command('input <command>')
end
Yet whenever he engages, nothing happens.
He says he's correctly overwriting the upddated mote-include.lua I sent him and that he reloaded Gearswap, yet when he engages it doesn't work.
I'm pretty sure the lines I wrote for him are correct so I'm wondering what am I doing wrong here?
I'm not too experienced with mote files so... there must be something I'm missing.
Bismarck.Radec
Server: Bismarck
Game: FFXI
Posts: 148
By Bismarck.Radec 2022-04-14 18:30:13
I'd suggest rolling back to the default mode-include - your change *should* work there, but every so often windower updates will overwrite your mote-_____ files with new ones, when the online ones get updated.
Instead, add your function to his job file like so:
Code function job_status_change(newStatus, oldStatus, eventArgs)
if newStatus == 'Engaged' then
send_command('input <command>')
end
end
Literally "job_status_change", not drk_status_change or anything like that.
As for what's wrong - probably user error? Best guess is if the reloading/overwriting was done correctly there's another "function status_change(..." somewhere that's taking precedence.
[+]
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-15 01:19:22
The thought there's some other function taking precedence hit my mind but I couldn't find anything.
Then again there's so many included files and I haven't really checked every line of each of them.
I'll modify his job file the way you suggested and see if things change, thanks Radec!
First I'll make a test with a simple add_to_chat to see if anything appears on his screen. If that happens then it's a success and I'll modify the line with the //send command he actually needs to activate the relative spell on his mule.
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-15 16:29:17
Just implemented these changes to my friend's lua and they work! Thanks Radec! :-)
[+]
Carbuncle.Yiazmaat
Server: Carbuncle
Game: FFXI
Posts: 165
By Carbuncle.Yiazmaat 2022-04-22 17:42:17
Anyone got an idea to how could i add an autobuffmode function to pup selindrile gearswap like the one from the selindrile war lua ?
I tried to c/p the war autobuffmode function to the pup one, tried to put Cooldown JA with the right ID, but it didnt work.
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-23 19:55:26
So I've tried to create a simple loop with gearswap, with a single command line inside that's something like this (it was a test)
send_command('input /tell Sechs hello!;wait 10;input /tell Sechs goodbye!')
I put this inside a loop and then inside a function, but whenever I launch the function the game hangs up or crashes.
I've tried "repeat/until", "while/do" and "for do" type of loops, but they all produce the same results.
I'm sure I must be doing something wrong but what?
Tried the example line above directly in the console and it works fine, it sends the two tells no problem.
Bismarck.Radec
Server: Bismarck
Game: FFXI
Posts: 148
By Bismarck.Radec 2022-04-23 20:25:06
It's not reading that as
Code
while
hello
wait 10
goodbye
end
but instead,
Code
while
send_some_commands
end
So it loops infinitely with no pauses at all.
Instead, you can do it as
Code
while
windower.send_command(hello)
coroutine.sleep(10)
windower.send_command(goodbye)
end
OR
function job_self_command(cmdParams, eventArgs)
if (some condition to end the loop) and cmdparams == recurse_loop_command then
windower.send_command(hello;wait10;goodbye; gs c recursive_loop_command)
end
end
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-24 05:55:47
I'm gonna try that, but it's strange.
I took inspiration from the multiple commands inside "send_command" from my SMN lua.
I developed this function a long time ago.
Code
function buff_announcer(spell)
local buff_duration = buffs_maps[spell.name] - 10
send_command('wait '..buff_duration..';input /p '..spell.name..' Effect: [WEARING OFF IN 10 SEC.] ;wait 2;input /p '..spell.name..' Effect: [WEARING OFF IN 8 SEC.];wait 2;input /p '..spell.name..' Effect: [WEARING OFF IN 6 SEC.];wait 2;input /p '..spell.name..' Effect: [WEARING OFF IN 4 SEC.];wait 1;input /p '..spell.name..' Effect: [WEARING OFF IN 3 SEC.];wait 1;input /p '..spell.name..' Effect: [WEARING OFF IN 2 SEC.];wait 1;input /p '..spell.name..' Effect: [WEARING OFF IN 1 SEC.];wait 1;input /p '..spell.name..' Effect: [OFF]')
end
Now this doesn't loop of course, it executes only once and I use it for various things, for example to announce Perfect Defense etc.
So taking inspiration from this working function I wanted another one that loops and repeats text messages with a pause until a certain condition is true but, as I mentioned, I couldn't make it work.
I'll try some of things you suggested now!
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-24 06:25:38
hmm, coroutine.sleep(value) is giving me a stack overflow error on line 413 of the user_functions.lua file in the main gearswap folder.
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-24 06:56:26
It seems coroutine.sleep was intentionally disabled by Byrth for several reasons one being because there are other ways to create "pauses" in gearswap.
My question is... how? How else can you create a wait/pause without using coroutine.sleep?
Server: Asura
Game: FFXI
Posts: 71
By Asura.Cordyfox 2022-04-24 07:32:18
So, I recently tried implementing weapon sets based on subjob in my WAR lua, and it worked--for a day.
Code if player.sub_job == 'DRG' or 'WHM' then
state.WeaponSet = M{['description']='Weapon Set','Sword','Axe','GreatAxe','GreatSword','Staff','Scythe','Archery','DMG1','Lance','Club',}
elseif player.sub_job == 'SAM' then
state.WeaponSet = M{['description']='Weapon Set','GreatAxe','GreatSword','Scythe','Lance','Staff',}
elseif player.sub_job == 'NIN' or 'DNC' then
state.WeaponSet = M{['description']='Weapon Set','AxeDW','SwordDW','ClubDW','DaggerDW','GreatAxe',}
else
state.WeaponSet = M{['description']='Weapon Set','GreatAxe','GreatSword','Scythe','Staff','DMG1','Archery','Axe','Lance','Club','Sword',}
end
Since the next time I launched POL, it hasn't worked since and every sub goes back to the /DRG weapon sets. Anyone have any idea why, or have implemented this successfully themselves?
Bahamut.Ayasha
Server: Bahamut
Game: FFXI
Posts: 96
By Bahamut.Ayasha 2022-04-24 12:41:56
Try changing:
Code if player.sub_job == 'DRG' or 'WHM' then
to:
Code if (player.sub_job == 'DRG') or (player.sub_job == 'WHM') then
The code you wrote is read as: if [player.sub_job == 'DRG'] or ['WHM'], not: if player.sub_job == ['DRG' or 'WHM'].
You'll need to do the same for the NIN/DNC one as well.
Hope this works for you.
Asura.Sechs
Server: Asura
Game: FFXI
Posts: 10136
By Asura.Sechs 2022-04-26 06:02:47
It seems coroutine.sleep was intentionally disabled by Byrth for several reasons one being because there are other ways to create "pauses" in gearswap.
My question is... how? How else can you create a wait/pause without using coroutine.sleep? So I guess in the end nobody has an answer for this question?
Put aside coroutine.sleep which has been disabled on purpose, is there no other way to create a "list" of actions you want Gearswap to perform/queue and then put a "pause" of sorts somewhere in between some of the actions of that list?
By quelthos 2022-05-01 00:08:19
My function for leaden/wildfire works just fine, switches between orpheus sash/obi/Eschan Stone(default belt) based on distance/weather, but the same function does not work for corsairshot (Quick Draw). It uses Eschan Stone no matter at what distance. Anyone can take a look and help out?
Thanks!
Code -- Original: Motenten / Modified: Arislan
-- Haste/DW Detection Requires Gearinfo Addon
-------------------------------------------------------------------------------------------------------------------
-- Keybinds
-------------------------------------------------------------------------------------------------------------------
-- Modes: [ F9 ] Cycle Offense Modes
-- [ CTRL+F9 ] Cycle Hybrid Modes
-- [ ALT+F9 ] Cycle Ranged Modes
-- [ WIN+F9 ] Cycle Weapon Skill Modes
-- [ F10 ] Emergency -PDT Mode
-- [ ALT+F10 ] Toggle Kiting Mode
-- [ F11 ] Emergency -MDT Mode
-- [ F12 ] Update Current Gear / Report Current Status
-- [ CTRL+F12 ] Cycle Idle Modes
-- [ ALT+F12 ] Cancel Emergency -PDT/-MDT Mode
-- [ WIN+C ] Toggle Capacity Points Mode
-- [ WIN+` ] Toggle use of Luzaf Ring.
-- [ WIN+Q ] Quick Draw shot mode selector.
--
-- Abilities: [ CTRL+- ] Quick Draw primary shot element cycle forward.
-- [ CTRL+= ] Quick Draw primary shot element cycle backward.
-- [ ALT+- ] Quick Draw secondary shot element cycle forward.
-- [ ALT+= ] Quick Draw secondary shot element cycle backward.
-- [ CTRL+[ ] Quick Draw toggle target type.
-- [ CTRL+] ] Quick Draw toggle use secondary shot.
--
-- [ CTRL+C ] Crooked Cards
-- [ CTRL+` ] Double-Up
-- [ CTRL+X ] Fold
-- [ CTRL+S ] Snake Eye
-- [ CTRL+NumLock ] Triple Shot
-- [ CTRL+Numpad/ ] Berserk
-- [ CTRL+Numpad* ] Warcry
-- [ CTRL+Numpad- ] Aggressor
--
-- Spells: [ WIN+, ] Utsusemi: Ichi
-- [ WIN+. ] Utsusemi: Ni
--
-- Weapons: [ WIN+E/R ] Cycles between available Weapon Sets
-- [ WIN+W ] Toggle Ranged Weapon Lock
--
-- WS: [ CTRL+Numpad7 ] Savage Blade
-- [ CTRL+Numpad8 ] Last Stand
-- [ CTRL+Numpad4 ] Leaden Salute
-- [ CTRL+Numpad5 ] Requiescat
-- [ CTRL+Numpad6 ] Wildfire
-- [ CTRL+Numpad1 ] Aeolian Edge
-- [ CTRL+Numpad2 ] Evisceration
--
-- RA: [ Numpad0 ] Ranged Attack
--
--
-- (Global-Binds.lua contains additional non-job-related keybinds)
-------------------------------------------------------------------------------------------------------------------
-- Custom Commands (preface with /console to use these in macros)
-------------------------------------------------------------------------------------------------------------------
-- gs c qd Uses the currently configured shot on the target, with either <t> or
-- <stnpc> depending on setting.
-- gs c qd t Uses the currently configured shot on the target, but forces use of <t>.
--
-- gs c cycle mainqd Cycles through the available steps to use as the primary shot when using
-- one of the above commands.
-- gs c cycle altqd Cycles through the available steps to use for alternating with the
-- configured main shot.
-- gs c toggle usealtqd Toggles whether or not to use an alternate shot.
-- gs c toggle selectqdtarget Toggles whether or not to use <stnpc> (as opposed to <t>) when using a shot.
--
-- gs c toggle LuzafRing Toggles use of Luzaf Ring on and off
-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job. Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------
-- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
-- QuickDraw Selector
state.Mainqd = M{['description']='Primary Shot', 'Fire Shot', 'Ice Shot', 'Wind Shot', 'Earth Shot', 'Thunder Shot', 'Water Shot'}
state.Altqd = M{['description']='Secondary Shot', 'Fire Shot', 'Ice Shot', 'Wind Shot', 'Earth Shot', 'Thunder Shot', 'Water Shot'}
state.UseAltqd = M(false, 'Use Secondary Shot')
state.SelectqdTarget = M(false, 'Select Quick Draw Target')
state.IgnoreTargetting = M(false, 'Ignore Targetting')
state.QDMode = M{['description']='Quick Draw Mode', 'STP', 'Enhance', 'Potency', 'TH'}
state.Currentqd = M{['description']='Current Quick Draw', 'Main', 'Alt'}
-- Whether to use Luzaf's Ring
state.LuzafRing = M(false, "Luzaf's Ring")
-- Whether a warning has been given for low ammo
state.warned = M(false)
no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
"Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring",
"Dev. Bul. Pouch", "Chr. Bul. Pouch", "Liv. Bul. Pouch"}
elemental_ws = S{"Aeolian Edge", "Leaden Salute", "Wildfire"}
no_shoot_ammo = S{"Animikii Bullet", "Hauksbok Bullet"}
include('Mote-TreasureHunter')
-- For th_action_check():
-- JA IDs for actions that always have TH: Provoke, Animated Flourish
info.default_ja_ids = S{35, 204}
-- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
info.default_u_ja_ids = S{201, 202, 203, 205, 207}
define_roll_values()
lockstyleset = 1
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
-- Setup vars that are user-dependent. Can override this function in a sidecar file.
function user_setup()
state.OffenseMode:options('Normal', 'SW')
state.HybridMode:options('Normal')
state.RangedMode:options('Normal')
state.WeaponskillMode:options('Normal')
state.IdleMode:options('Normal')
state.WeaponSet = M{['description']='Weapon Set', 'DeathPenalty_M', 'Ataktos', 'Fomalhaut_M', 'Fomalhaut_R', 'AE' , 'AE2'}
-- state.CP = M(false, "Capacity Points Mode")
state.WeaponLock = M(false, 'Weapon Lock')
--gear.RAbullet = "Bronze Bullet"
gear.RAbullet = "Chrono Bullet"
gear.RAccbullet = "Chrono Bullet"
gear.WSbullet = "Chrono Bullet"
gear.MAbullet = "Living Bullet"
gear.QDbullet = "Hauksbok Bullet"
options.ammo_warning_limit = 10
-- Additional local binds
--include('Global-Binds.lua') -- OK to remove this line
--include('Global-GEO-Binds.lua') -- OK to remove this line
--send_command('bind @t gs c cycle treasuremode')
--send_command('bind ^` input /ja "Double-up" <me>')
--send_command('bind ^c input /ja "Crooked Cards" <me>')
--send_command('bind ^s input /ja "Snake Eye" <me>')
--send_command('bind ^f input /ja "Fold" <me>')
--send_command('bind !` input /ja "Bolter\'s Roll" <me>')
send_command ('bind @` gs c toggle LuzafRing')
--send_command('bind ^insert gs c cycleback mainqd')
--send_command('bind ^delete gs c cycle mainqd')
--send_command('bind ^home gs c cycle altqd')
--send_command('bind ^end gs c cycleback altqd')
--send_command('bind ^pageup gs c toggle selectqdtarget')
--send_command('bind ^pagedown gs c toggle usealtqd')
-- send_command('bind @c gs c toggle CP')
--send_command('bind @q gs c cycle QDMode')
--send_command('bind @e gs c cycleback WeaponSet')
send_command('bind @r gs c cycle WeaponSet')
send_command('bind @w gs c toggle WeaponLock')
--send_command('bind ^numlock input /ja "Triple Shot" <me>')
--if player.sub_job == 'WAR' then
-- send_command('bind ^numpad/ input /ja "Berserk" <me>')
-- send_command('bind ^numpad* input /ja "Warcry" <me>')
-- send_command('bind ^numpad- input /ja "Aggressor" <me>')
--end
--send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
--send_command('bind ^numpad8 input /ws "Last Stand" <t>')
--send_command('bind ^numpad4 input /ws "Leaden Salute" <t>')
--send_command('bind ^numpad5 input /ws "Requiescat" <t>')
--send_command('bind ^numpad6 input /ws "Wildfire" <t>')
--send_command('bind ^numpad1 input /ws "Aeolian Edge" <t>')
--send_command('bind ^numpad2 input /ws "Evisceration" <t>')
--send_command('bind %numpad0 input /ra <t>')
--state.Auto_Kite = M(false, 'Auto_Kite')
--Haste = 0
--DW_needed = 0
--DW = false
--moving = false
--update_combat_form()
--determine_haste_group()
end
-- Called when this job file is unloaded (eg: job change)
function user_unload()
send_command('unbind ^`')
send_command('unbind ^c')
send_command('unbind ^s')
send_command('unbind ^f')
send_command('unbind !`')
send_command('unbind @t')
send_command('unbind @`')
send_command('unbind ^insert')
send_command('unbind ^delete')
send_command('unbind ^home')
send_command('unbind ^end')
send_command('unbind ^pageup')
send_command('unbind ^pagedown')
send_command('unbind ^,')
send_command('unbind @c')
send_command('unbind @q')
send_command('unbind @w')
send_command('unbind @e')
send_command('unbind @r')
send_command('unbind ^numlock')
send_command('unbind ^numpad/')
send_command('unbind ^numpad*')
send_command('unbind ^numpad-')
send_command('unbind ^numpad8')
send_command('unbind ^numpad4')
send_command('unbind ^numpad5')
send_command('unbind ^numpad6')
send_command('unbind ^numpad1')
send_command('unbind ^numpad2')
send_command('unbind numpad0')
send_command('unbind #`')
send_command('unbind #1')
send_command('unbind #2')
send_command('unbind #3')
send_command('unbind #4')
send_command('unbind #5')
send_command('unbind #6')
send_command('unbind #7')
send_command('unbind #8')
send_command('unbind #9')
send_command('unbind #0')
end
-- Define sets and vars used by this job file.
function init_gear_sets()
------------------------------------------------------------------------------------------------
---------------------------------------- Precast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.JA['Snake Eye'] = {legs="Lanun Trews +3"}
sets.precast.JA['Wild Card'] = {feet="Lanun Bottes +3"}
sets.precast.JA['Random Deal'] = {body="Lanun Frac +3"}
sets.precast.CorsairRoll = {
head={ name="Lanun Tricorne", augments={'Enhances "Winning Streak" effect',}},
body="Malignance Tabard",
hands="Chasseur's Gants +1",
legs={ name="Desultor Tassets", augments={'"Phantom Roll" ability delay -5','"Sic" and "Ready" ability delay -5',}},
feet="Malignance Boots",
neck="Regal Necklace",
waist="Flume Belt",
left_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
right_ear="Genmei Earring",
left_ring="Defending Ring",
right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
}
sets.precast.CorsairRoll.Duration = {main={name="Rostam", bag="wardrobe"}, range="Compensator"}
sets.precast.CorsairRoll.LowerDelay = {back="Gunslinger's Cape"}
sets.precast.CorsairRoll["Caster's Roll"] = set_combine(sets.precast.CorsairRoll, {legs="Chas. Culottes +1"})
sets.precast.CorsairRoll["Courser's Roll"] = set_combine(sets.precast.CorsairRoll, {feet="Chass. Bottes +1"})
sets.precast.CorsairRoll["Blitzer's Roll"] = set_combine(sets.precast.CorsairRoll, {head="Chass. Tricorne +1"})
sets.precast.CorsairRoll["Tactician's Roll"] = set_combine(sets.precast.CorsairRoll, {body="Nvrch. Frac +2"})
sets.precast.CorsairRoll["Allies' Roll"] = set_combine(sets.precast.CorsairRoll, {hands="Chasseur's Gants +1"})
sets.precast.LuzafRing = {ring1="Luzaf's Ring"}
sets.precast.FoldDoubleBust = {hands="Lanun Gants +3"}
sets.precast.Waltz = {
body="Passion Jacket",
ring1="Asklepian Ring",
waist="Gishdubar Sash",
}
sets.precast.Waltz['Healing Waltz'] = {}
sets.precast.FC = {
head={ name="Herculean Helm", augments={'Mag. Acc.+25','"Fast Cast"+5','MND+4','"Mag.Atk.Bns."+15',}},
body={ name="Taeon Tabard", augments={'"Fast Cast"+4','Phalanx +3',}},
hands={ name="Leyline Gloves", augments={'Accuracy+2','Mag. Acc.+5','"Mag.Atk.Bns."+4',}},
legs={ name="Herculean Trousers", augments={'Mag. Acc.+13','"Fast Cast"+4','INT+9','"Mag.Atk.Bns."+4',}},
feet="Carmine Greaves",
neck="Baetyl Pendant",
waist="Flume Belt",
left_ear="Loquac. Earring",
right_ear="Etiolation Earring",
left_ring="Kishar Ring",
right_ring="Weather. Ring",
back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
}
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {
body="Passion Jacket",
neck="Magoraga Beads",
})
-- (10% Snapshot from JP Gifts)
sets.precast.RA = {
ammo=gear.RAbullet,
head="Chasseur's Tricorne +1", --0/14
body="Laksa. Frac +3", --0/20
--body="Oshosi Vest +1", --14/0
hands="Carmine Fin. Ga. +1", --8/11
legs="Adhemar Kecks",
--legs=gear.Adhemar_D_legs, --10/13
feet="Meg. Jam. +2", --10/0
neck="Comm. Charm +2", --4/0
back={ name="Camulus's Mantle", augments={'"Snapshot"+10',}},
waist="Yemaya Belt", --0/5
} --61/32
sets.precast.RA.Flurry1 = set_combine(sets.precast.RA, {
--body="Laksa. Frac +3", --0/20
}) --47/52
sets.precast.RA.Flurry2 = set_combine(sets.precast.RA.Flurry1, {
hands="Carmine Fin. Ga. +1", --8/11
--feet="Pursuer's Gaiters", --0/10
}) --32/73
------------------------------------------------------------------------------------------------
------------------------------------- Weapon Skill Sets ----------------------------------------
------------------------------------------------------------------------------------------------
sets.precast.WS = {
head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
body="Laksa. Frac +3",
hands="Meg. Gloves +2",
legs="Meg. Chausses +2",
feet="Lanun Bottes +3",
neck="Comm. Charm +2",
waist={ name="Sailfi Belt +1", augments={'Path: A',}},
left_ear="Ishvara Earring",
right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
left_ring="Epaminondas's Ring",
right_ring={ name="Metamor. Ring +1", augments={'Path: A',}},
back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
}
sets.precast.WS.Acc = set_combine(sets.precast.WS, {
})
sets.precast.WS['Last Stand'] = {
ammo=gear.WSbullet,
head="Meghanada Visor +2",
body="Laksa. Frac +3",
hands="Meg. Gloves +2",
legs="Meg. Chausses +2",
feet="Lanun Bottes +3",
neck="Fotia Gorget",
waist="Fotia Belt",
left_ear="Ishvara Earring",
right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
left_ring="Epaminondas's Ring",
right_ring="Dingir Ring",
back={ name="Camulus's Mantle", augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','Weapon skill damage +10%',}},
}
sets.precast.WS['Last Stand'].Acc = set_combine(sets.precast.WS['Last Stand'], {
})
sets.precast.WS['Wildfire'] = {
ammo=gear.MAbullet,
head={ name="Herculean Helm", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','Crit. hit damage +1%','MND+10','"Mag.Atk.Bns."+11',}},
body="Lanun Frac +3",
hands={ name="Carmine Fin. Ga. +1", augments={'Rng.Atk.+20','"Mag.Atk.Bns."+12','"Store TP"+6',}},
legs={ name="Herculean Trousers", augments={'"Mag.Atk.Bns."+24','AGI+9','Mag. Acc.+11 "Mag.Atk.Bns."+11',}},
feet="Lanun Bottes +3",
neck="Comm. Charm +2",
--neck="Baetyl Pendant",
waist="Eschan Stone",
left_ear="Friomisi Earring",
right_ear="Ishvara Earring",
left_ring="Epaminondas's Ring",
right_ring="Dingir Ring",
back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','AGI+10','Weapon skill damage +10%',}},
}
sets.precast.WS['Hot Shot'] = sets.precast.WS['Wildfire']
sets.precast.WS['Leaden Salute'] = set_combine(sets.precast.WS['Wildfire'], {
head="Pixie Hairpin +1",
right_ear="Moonshade Earring",
left_ring="Archon Ring",
})
sets.precast.WS['Evisceration'] = {
head={ name="Blistering Sallet +1", augments={'Path: A',}},
body="Meg. Cuirie +2",
hands="Mummu Wrists +2",
legs="Mummu Kecks +2",
feet="Mummu Gamash. +2",
neck="Fotia Gorget",
waist="Fotia Belt",
left_ear="Odr Earring",
right_ear="Mache Earring +1",
left_ring="Begrudging Ring",
right_ring="Mummu Ring",
back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
}
sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {
})
sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
})
sets.precast.WS['Savage Blade'].Acc = set_combine(sets.precast.WS['Savage Blade'], {
})
sets.precast.WS['Swift Blade'] = set_combine(sets.precast.WS, {
})
sets.precast.WS['Swift Blade'].Acc = set_combine(sets.precast.WS['Swift Blade'], {
})
sets.precast.WS['Requiescat'] = set_combine(sets.precast.WS['Swift Blade'], {
}) --MND
sets.precast.WS['Requiescat'].Acc = set_combine(sets.precast.WS['Requiescat'], {
})
sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS['Wildfire'], {
})
------------------------------------------------------------------------------------------------
---------------------------------------- Midcast Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.midcast.FastRecast = sets.precast.FC
sets.midcast.SpellInterrupt = {
body=gear.Taeon_Phalanx_body, --10
hands="Rawhide Gloves", --15
legs="Carmine Cuisses +1", --20
feet=gear.Taeon_Phalanx_feet, --10
neck="Loricate Torque +1", --5
ear1="Halasz Earring", --5
ear2="Magnetic Earring", --8
ring2="Evanescence Ring", --5
waist="Rumination Sash", --10
}
sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
sets.midcast.Cure = {
neck="Incanter's Torque",
ear1="Roundel Earring",
ear2="Mendi. Earring",
ring1="Lebeche Ring",
ring2="Haoma's Ring",
waist="Bishop's Sash",
}
sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
sets.midcast.CorsairShot = {
ammo=gear.QDbullet,
head={ name="Herculean Helm", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','Crit. hit damage +1%','MND+10','"Mag.Atk.Bns."+11',}},
body="Lanun Frac +3",
hands={ name="Carmine Fin. Ga. +1", augments={'Rng.Atk.+20','"Mag.Atk.Bns."+12','"Store TP"+6',}},
legs={ name="Herculean Trousers", augments={'"Mag.Atk.Bns."+23','Weapon skill damage +3%',}},
feet="Lanun Bottes +3",
neck="Baetyl Pendant",
waist="Eschan Stone",
left_ear="Friomisi Earring",
right_ear="Ishvara Earring",
left_ring="Epaminondas's Ring",
right_ring="Dingir Ring",
back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','AGI+10','Weapon skill damage +10%',}},
}
sets.midcast.CorsairShot.STP = sets.midcast.CorsairShot
sets.midcast.CorsairShot['Light Shot'] = set_combine(sets.midcast.CorsairShot, {
ammo=gear.QDbullet,
left_ring="Weather. Ring",
})
sets.midcast.CorsairShot['Dark Shot'] = set_combine(sets.midcast.CorsairShot, {
ammo=gear.QDbullet,
head="Pixie Hairpin +1",
left_ring="Archon Ring",
})
sets.midcast.CorsairShot.Enhance = sets.midcast.CorsairShot
-- Ranged gear
sets.midcast.RA = {
ammo=gear.RAbullet,
head="Malignance Chapeau",
body="Malignance Tabard",
hands="Malignance Gloves",
legs="Malignance Tights",
feet="Malignance Boots",
neck="Iskur Gorget",
waist="Yemaya Belt",
left_ear="Telos Earring",
right_ear="Enervating Earring",
left_ring="Ilabrat Ring",
right_ring="Dingir Ring",
back={ name="Camulus's Mantle", augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','Rng.Acc.+10','"Store TP"+10',}},
}
sets.midcast.RA.Acc = set_combine(sets.midcast.RA, {
})
sets.midcast.RA.HighAcc = set_combine(sets.midcast.RA.Acc, {
})
sets.midcast.RA.Critical = set_combine(sets.midcast.RA, {
})
sets.midcast.RA.STP = set_combine(sets.midcast.RA, {
})
sets.TripleShot = set_combine(sets.midcast.RA, {
--head="Oshosi Mask +1", --5
--body="Chasseur's Frac +1", --12
--hands="Lanun Gants +3",
--legs="Osh. Trousers +1", --6
--feet="Osh. Leggings +1", --3
}) --27
sets.TripleShotCritical = {
}
sets.TrueShot = {
body="Nisroch Jerkin",
legs="Osh. Trousers +1",
}
------------------------------------------------------------------------------------------------
----------------------------------------- Idle Sets --------------------------------------------
------------------------------------------------------------------------------------------------
sets.resting = {}
sets.idle = {
ammo=gear.RAbullet,
head="Malignance Chapeau",
body="Malignance Tabard",
hands="Malignance Gloves",
legs="Malignance Tights",
feet="Malignance Boots",
--neck="Comm. Charm +2",
neck="Bathy Choker +1",
waist="Flume Belt",
left_ear="Etiolation Earring",
right_ear={ name="Odnowa Earring +1", augments={'Path: A',}},
left_ring={name="Chirich Ring +1", bag="wardrobe2"},
right_ring={name="Chirich Ring +1", bag="wardrobe3"},
back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
}
sets.idle.DT = set_combine(sets.idle, {
})
sets.idle.Refresh = set_combine(sets.idle, {
})
sets.idle.Town = set_combine(sets.idle, {
})
------------------------------------------------------------------------------------------------
---------------------------------------- Defense Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.defense.PDT = sets.idle.DT
sets.defense.MDT = {
}
sets.Kiting = {legs="Carmine Cuisses +1"}
------------------------------------------------------------------------------------------------
---------------------------------------- Engaged Sets ------------------------------------------
------------------------------------------------------------------------------------------------
-- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
-- sets if more refined versions aren't defined.
-- If you create a set with both offense and defense modes, the offense mode should be first.
-- EG: sets.engaged.Dagger.Accuracy.Evasion
sets.engaged = {
ammo=gear.RAbullet,
head="Malignance Chapeau",
body="Malignance Tabard",
hands="Malignance Gloves",
legs="Malignance Tights",
feet="Malignance Boots",
neck="Comm. Charm +2",
neck="Iskur Gorget",
waist="Reiki Yotai",
left_ear="Telos Earring",
right_ear="Eabani Earring",
ring1={name="Chirich Ring +1", bag="wardrobe2"},
ring2={name="Chirich Ring +1", bag="wardrobe3"},
back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
}
sets.engaged.SW = set_combine(sets.engaged, {
waist="Kentarch Belt +1",
right_ear="Cessance Earring",
})
sets.engaged.LowAcc = set_combine(sets.engaged, {
})
sets.engaged.MidAcc = set_combine(sets.engaged.LowAcc, {
})
sets.engaged.HighAcc = set_combine(sets.engaged.MidAcc, {
})
sets.engaged.STP = set_combine(sets.engaged, {
})
-- * DNC Subjob DW Trait: +15%
-- * NIN Subjob DW Trait: +25%
-- No Magic Haste (74% DW to cap)
sets.engaged.DW = set_combine(sets.engaged, {
waist="Reiki Yotai",
right_ear="Eabani Earring",
}) -- 48%
sets.engaged.DW.LowAcc = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.MidAcc = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.HighAcc = set_combine(sets.engaged.DW, {
})
sets.engaged.DW.STP = set_combine(sets.engaged.DW, {
})
-- 15% Magic Haste (67% DW to cap)
sets.engaged.DW.LowHaste = {
} -- 42%
sets.engaged.DW.LowAcc.LowHaste = set_combine(sets.engaged.DW.LowHaste, {
})
sets.engaged.DW.MidAcc.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, {
})
sets.engaged.DW.HighAcc.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, {
})
sets.engaged.DW.STP.LowHaste = set_combine(sets.engaged.DW.LowHaste, {
})
-- 30% Magic Haste (56% DW to cap)
sets.engaged.DW.MidHaste = {
} -- 31%
sets.engaged.DW.LowAcc.MidHaste = set_combine(sets.engaged.DW.MidHaste, {
})
sets.engaged.DW.MidAcc.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, {
})
sets.engaged.DW.HighAcc.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, {
})
sets.engaged.DW.STP.MidHaste = set_combine(sets.engaged.DW.MidHaste, {
})
-- 35% Magic Haste (51% DW to cap)
sets.engaged.DW.HighHaste = {
} -- 27%
sets.engaged.DW.LowAcc.HighHaste = set_combine(sets.engaged.DW.HighHaste, {
})
sets.engaged.DW.MidAcc.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, {
})
sets.engaged.DW.HighAcc.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, {
})
sets.engaged.DW.STP.HighHaste = set_combine(sets.engaged.DW.HighHaste, {
})
sets.engaged.DW.LowAcc.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, {
})
sets.engaged.DW.MidAcc.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, {
})
sets.engaged.DW.HighAcc.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, {
})
sets.engaged.DW.STP.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, {
})
sets.engaged.DW.MaxHastePlus = set_combine(sets.engaged.DW.MaxHaste, {back=gear.COR_DW_Cape})
sets.engaged.DW.LowAcc.MaxHastePlus = set_combine(sets.engaged.DW.LowAcc.MaxHaste, {back=gear.COR_DW_Cape})
sets.engaged.DW.MidAcc.MaxHastePlus = set_combine(sets.engaged.DW.MidAcc.MaxHaste, {back=gear.COR_DW_Cape})
sets.engaged.DW.HighAcc.MaxHastePlus = set_combine(sets.engaged.DW.HighAcc.MaxHaste, {back=gear.COR_DW_Cape})
sets.engaged.DW.STP.MaxHastePlus = set_combine(sets.engaged.DW.STP.MaxHaste, {back=gear.COR_DW_Cape})
------------------------------------------------------------------------------------------------
---------------------------------------- Hybrid Sets -------------------------------------------
------------------------------------------------------------------------------------------------
sets.engaged.Hybrid = {
head="Malignance Chapeau", --6/6
body="Malignance Tabard", --9/9
hands="Malignance Gloves", --5/5
legs="Malignance Tights", --7/7
feet="Malignance Boots", --4/4
}
sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
sets.engaged.LowAcc.DT = set_combine(sets.engaged.LowAcc, sets.engaged.Hybrid)
sets.engaged.MidAcc.DT = set_combine(sets.engaged.MidAcc, sets.engaged.Hybrid)
sets.engaged.HighAcc.DT = set_combine(sets.engaged.HighAcc, sets.engaged.Hybrid)
sets.engaged.STP.DT = set_combine(sets.engaged.STP, sets.engaged.Hybrid)
sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
sets.engaged.DW.LowAcc.DT = set_combine(sets.engaged.DW.LowAcc, sets.engaged.Hybrid)
sets.engaged.DW.MidAcc.DT = set_combine(sets.engaged.DW.MidAcc, sets.engaged.Hybrid)
sets.engaged.DW.HighAcc.DT = set_combine(sets.engaged.DW.HighAcc, sets.engaged.Hybrid)
sets.engaged.DW.STP.DT = set_combine(sets.engaged.DW.STP, sets.engaged.Hybrid)
sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.LowAcc.DT.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.MidAcc.DT.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.HighAcc.DT.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.STP.DT.LowHaste = set_combine(sets.engaged.DW.STP.LowHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.LowAcc.DT.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.MidAcc.DT.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.HighAcc.DT.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.STP.DT.MidHaste = set_combine(sets.engaged.DW.STP.MidHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.LowAcc.DT.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.MidAcc.DT.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.HighAcc.DT.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.Hybrid)
sets.engaged.DW.STP.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste.STP, sets.engaged.Hybrid)
sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.LowAcc.DT.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.MidAcc.DT.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.HighAcc.DT.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.STP.DT.MaxHaste = set_combine(sets.engaged.DW.STP.MaxHaste, sets.engaged.Hybrid)
sets.engaged.DW.DT.MaxHastePlus = set_combine(sets.engaged.DW.MaxHastePlus, sets.engaged.Hybrid)
sets.engaged.DW.LowAcc.DT.MaxHastePlus = set_combine(sets.engaged.DW.LowAcc.MaxHastePlus, sets.engaged.Hybrid)
sets.engaged.DW.MidAcc.DT.MaxHastePlus = set_combine(sets.engaged.DW.MidAcc.MaxHastePlus, sets.engaged.Hybrid)
sets.engaged.DW.HighAcc.DT.MaxHastePlus = set_combine(sets.engaged.DW.HighAcc.MaxHastePlus, sets.engaged.Hybrid)
sets.engaged.DW.STP.DT.MaxHastePlus = set_combine(sets.engaged.DW.STP.MaxHastePlus, sets.engaged.Hybrid)
------------------------------------------------------------------------------------------------
---------------------------------------- Special Sets ------------------------------------------
------------------------------------------------------------------------------------------------
sets.buff.Doom = {
neck="Nicander's Necklace", --20
ring1={name="Eshmun's Ring", bag="wardrobe3"}, --20
ring2={name="Eshmun's Ring", bag="wardrobe4"}, --20
waist="Gishdubar Sash", --10
}
sets.FullTP = {
right_ear="Hermetic Earring",
}
sets.Obi = {waist="Hachirin-no-Obi"}
-- sets.CP = {back="Mecisto. Mantle"}
--sets.Reive = {neck="Ygnas's Resolve +1"}
sets.TreasureHunter = {head="Volte Cap", hands=gear.Herc_TH_hands, feet="Volte Boots", waist="Chaac Belt"}
sets.trial = {main="Esikuva", sub="Norgish Dagger", ranged="Death Penalty"}
sets.DeathPenalty_M = {main="Naegling", sub="Tauret", ranged="Death Penalty"}
sets.DeathPenalty_M.Acc = {main={name="Rostam", bag="wardrobe3"}, sub={name="Rostam", bag="wardrobe"}, ranged="Death Penalty"}
sets.DeathPenalty_R = {main="Lanun Knife", sub="Tauret", ranged="Death Penalty"}
sets.DeathPenalty_R.Acc = {main="Lanun Knife", sub={name="Rostam", bag="wardrobe"}, ranged="Death Penalty"}
sets.Armageddon_M = {main="Naegling", sub="Tauret", ranged="Armageddon"}
sets.Armageddon_M.Acc = {main={name="Rostam", bag="wardrobe3"}, sub={name="Rostam", bag="wardrobe4"}, ranged="Armageddon"}
sets.Armageddon_R = {main="Lanun Knife", sub="Kustawi +1", ranged="Armageddon"}
sets.Armageddon_R.Acc = sets.Armageddon_R
sets.Fomalhaut_M = {main="Naegling", sub="Demers. Degen +1", ranged="Fomalhaut"}
sets.Fomalhaut_M.Acc = {main={name="Rostam", bag="wardrobe3"}, sub="Kustawi +1", ranged="Fomalhaut"}
sets.Fomalhaut_R = {main="Kustawi +1", sub="Nusku Shield", ranged="Fomalhaut"}
sets.Fomalhaut_R.Acc = sets.Fomalhaut_R
sets.Ataktos = {main="Naegling", sub="Demers. Degen +1", ranged="Anarchy +2"}
sets.Ataktos.Acc = {main="Naegling", sub="Demers. Degen +1", ranged="Ataktos"}
sets.AE = {main="Tauret", sub="Demers. Degen +1", ranged="Anarchy +2"}
sets.AE2 = {main="Tauret", sub="Demers. Degen +1", ranged="Death Penalty"}
sets.DefaultShield = {sub="Nusku Shield"}
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)
-- Check that proper ammo is available if we're using ranged attacks or similar.
if spell.action_type == 'Ranged Attack' or spell.type == 'WeaponSkill' or spell.type == 'CorsairShot' then
do_bullet_checks(spell, spellMap, eventArgs)
end
if spell.english == 'Fold' and buffactive['Bust'] == 2 then
if sets.precast.FoldDoubleBust then
equip(sets.precast.FoldDoubleBust)
eventArgs.handled = true
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
end
function job_post_precast(spell, action, spellMap, eventArgs)
if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") then
if player.status ~= 'Engaged' and state.WeaponLock.value == false then
equip(sets.precast.CorsairRoll.Duration)
end
if state.LuzafRing.value then
equip(sets.precast.LuzafRing)
end
end
if spell.action_type == 'Ranged Attack' then
special_ammo_check()
if flurry == 2 then
equip(sets.precast.RA.Flurry2)
elseif flurry == 1 then
equip(sets.precast.RA.Flurry1)
end
elseif spell.type == 'WeaponSkill' then
if spell.skill == 'Marksmanship' then
special_ammo_check()
end
-- Replace TP-bonus gear if not needed.
--if spell.english == 'Leaden Salute' or spell.english == 'Aeolian Edge' and player.tp > 2900 then
--equip(sets.FullTP)
--end
if elemental_ws:contains(spell.name) then
-- Matching double weather (w/o day conflict).
if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 1.7 yalms.
elseif spell.target.distance < (1.7 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Matching day and weather.
elseif spell.element == world.day_element and spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 8 yalms.
elseif spell.target.distance < (8 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Match day or weather.
elseif spell.element == world.day_element or spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
end
end
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.type == 'CorsairShot' then
if (spell.english ~= 'Light Shot' and spell.english ~= 'Dark Shot') then
-- Matching double weather (w/o day conflict).
if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 1.7 yalms.
elseif spell.target.distance < (1.7 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Matching day and weather.
elseif spell.element == world.day_element and spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
-- Target distance under 8 yalms.
elseif spell.target.distance < (8 + spell.target.model_size) then
equip({waist="Orpheus's Sash"})
-- Match day or weather.
elseif spell.element == world.day_element or spell.element == world.weather_element then
equip({waist="Hachirin-no-Obi"})
end
if state.QDMode.value == 'Enhance' then
equip(sets.midcast.CorsairShot.Enhance)
elseif state.QDMode.value == 'TH' then
equip(sets.midcast.CorsairShot)
equip(sets.TreasureHunter)
elseif state.QDMode.value == 'STP' then
equip(sets.midcast.CorsairShot.STP)
end
end
elseif spell.action_type == 'Ranged Attack' then
if buffactive['Triple Shot'] then
equip(sets.TripleShot)
if buffactive['Aftermath: Lv.3'] and player.equipment.ranged == "Armageddon" then
equip(sets.TripleShotCritical)
if (spell.target.distance < (7 + spell.target.model_size)) and (spell.target.distance > (5 + spell.target.model_size)) then
equip(sets.TrueShot)
end
end
elseif buffactive['Aftermath: Lv.3'] and player.equipment.ranged == "Armageddon" then
equip(sets.midcast.RA.Critical)
if (spell.target.distance < (7 + spell.target.model_size)) and (spell.target.distance > (5 + spell.target.model_size)) then
equip(sets.TrueShot)
end
end
end
end
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_aftercast(spell, action, spellMap, eventArgs)
if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") and not spell.interrupted then
display_roll_info(spell)
end
if spell.english == "Light Shot" then
send_command('@timers c "Light Shot ['..spell.target.name..']" 60 down abilities/00195.png')
end
if player.status ~= 'Engaged' and state.WeaponLock.value == false then
check_weaponset()
end
end
function job_buff_change(buff,gain)
-- If we gain or lose any flurry buffs, adjust gear.
if S{'flurry'}:contains(buff:lower()) then
if not gain then
flurry = nil
--add_to_chat(122, "Flurry status cleared.")
end
if not midaction() then
handle_equipping_gear(player.status)
end
end
-- if buffactive['Reive Mark'] then
-- if gain then
-- equip(sets.Reive)
-- disable('neck')
-- else
-- enable('neck')
-- end
-- end
if buff == "doom" then
if gain then
equip(sets.buff.Doom)
--send_command('@input /p Doomed.')
disable('ring1','ring2','waist')
else
enable('ring1','ring2','waist')
handle_equipping_gear(player.status)
end
end
end
-- Handle notifications of general user state change.
function job_state_change(stateField, newValue, oldValue)
if state.WeaponLock.value == true then
disable('ranged')
else
enable('ranged')
end
check_weaponset()
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- Called by the 'update' self-command, for common needs.
-- Set eventArgs.handled to true if we don't want automatic equipping of gear.
function job_handle_equipping_gear(playerStatus, eventArgs)
check_gear()
update_combat_form()
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
-- Modify the default melee set after it was constructed.
function customize_melee_set(meleeSet)
check_weaponset()
return meleeSet
end
function get_custom_wsmode(spell, action, spellMap)
local wsmode
if spell.skill == 'Marksmanship' then
if state.RangedMode.value == 'Acc' or state.RangedMode.value == 'HighAcc' then
wsmode = 'Acc'
end
else
if state.OffenseMode.value == 'Acc' or state.OffenseMode.value == 'HighAcc' then
wsmode = 'Acc'
end
end
return wsmode
end
-- Handle auto-targetting based on local setup.
function job_auto_change_target(spell, action, spellMap, eventArgs)
if spell.type == 'CorsairShot' then
if state.IgnoreTargetting.value == true then
state.IgnoreTargetting:reset()
eventArgs.handled = true
end
eventArgs.SelectNPCTargets = state.SelectqdTarget.value
end
end
-- Set eventArgs.handled to true if we don't want the automatic display to be run.
function display_current_job_state(eventArgs)
local cf_msg = ''
if state.CombatForm.has_value then
cf_msg = ' (' ..state.CombatForm.value.. ')'
end
local m_msg = state.OffenseMode.value
if state.HybridMode.value ~= 'Normal' then
m_msg = m_msg .. '/' ..state.HybridMode.value
end
local ws_msg = state.WeaponskillMode.value
local qd_msg = '(' ..string.sub(state.QDMode.value,1,1).. ')'
local e_msg = state.Mainqd.current
if state.UseAltqd.value == true then
e_msg = e_msg .. '/'..state.Altqd.current
end
local d_msg = 'None'
if state.DefenseMode.value ~= 'None' then
d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
end
local i_msg = state.IdleMode.value
local msg = ''
if state.Kiting.value then
msg = msg .. ' Kiting: On |'
end
add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002).. ' |'
..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002).. ' |'
..string.char(31,060).. ' QD' ..qd_msg.. ': ' ..string.char(31,001)..e_msg.. string.char(31,002).. ' |'
..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002).. ' |'
..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002).. ' |'
..string.char(31,002)..msg)
eventArgs.handled = true
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
--Read incoming packet to differentiate between Haste/Flurry I and II
windower.register_event('action',
function(act)
--check if you are a target of spell
local actionTargets = act.targets
playerId = windower.ffxi.get_player().id
isTarget = false
for _, target in ipairs(actionTargets) do
if playerId == target.id then
isTarget = true
end
end
if isTarget == true then
if act.category == 4 then
local param = act.param
if param == 845 and flurry ~= 2 then
--add_to_chat(122, 'Flurry Status: Flurry I')
flurry = 1
elseif param == 846 then
--add_to_chat(122, 'Flurry Status: Flurry II')
flurry = 2
end
end
end
end)
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == 'qd' then
if cmdParams[2] == 't' then
state.IgnoreTargetting:set()
end
local doqd = ''
if state.UseAltqd.value == true then
doqd = state[state.Currentqd.current..'qd'].current
state.Currentqd:cycle()
else
doqd = state.Mainqd.current
end
send_command('@input /ja "'..doqd..'" <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
function define_roll_values()
rolls = {
["Corsair's Roll"] = {lucky=5, unlucky=9, bonus="Experience Points"},
["Ninja Roll"] = {lucky=4, unlucky=8, bonus="Evasion"},
["Hunter's Roll"] = {lucky=4, unlucky=8, bonus="Accuracy"},
["Chaos Roll"] = {lucky=4, unlucky=8, bonus="Attack"},
["Magus's Roll"] = {lucky=2, unlucky=6, bonus="Magic Defense"},
["Healer's Roll"] = {lucky=3, unlucky=7, bonus="Cure Potency Received"},
["Drachen Roll"] = {lucky=4, unlucky=8, bonus="Pet Magic Accuracy/Attack"},
["Choral Roll"] = {lucky=2, unlucky=6, bonus="Spell Interruption Rate"},
["Monk's Roll"] = {lucky=3, unlucky=7, bonus="Subtle Blow"},
["Beast Roll"] = {lucky=4, unlucky=8, bonus="Pet Attack"},
["Samurai Roll"] = {lucky=2, unlucky=6, bonus="Store TP"},
["Evoker's Roll"] = {lucky=5, unlucky=9, bonus="Refresh"},
["Rogue's Roll"] = {lucky=5, unlucky=9, bonus="Critical Hit Rate"},
["Warlock's Roll"] = {lucky=4, unlucky=8, bonus="Magic Accuracy"},
["Fighter's Roll"] = {lucky=5, unlucky=9, bonus="Double Attack Rate"},
["Puppet Roll"] = {lucky=3, unlucky=7, bonus="Pet Magic Attack/Accuracy"},
["Gallant's Roll"] = {lucky=3, unlucky=7, bonus="Defense"},
["Wizard's Roll"] = {lucky=5, unlucky=9, bonus="Magic Attack"},
["Dancer's Roll"] = {lucky=3, unlucky=7, bonus="Regen"},
["Scholar's Roll"] = {lucky=2, unlucky=6, bonus="Conserve MP"},
["Naturalist's Roll"] = {lucky=3, unlucky=7, bonus="Enh. Magic Duration"},
["Runeist's Roll"] = {lucky=4, unlucky=8, bonus="Magic Evasion"},
["Bolter's Roll"] = {lucky=3, unlucky=9, bonus="Movement Speed"},
["Caster's Roll"] = {lucky=2, unlucky=7, bonus="Fast Cast"},
["Courser's Roll"] = {lucky=3, unlucky=9, bonus="Snapshot"},
["Blitzer's Roll"] = {lucky=4, unlucky=9, bonus="Attack Delay"},
["Tactician's Roll"] = {lucky=5, unlucky=8, bonus="Regain"},
["Allies' Roll"] = {lucky=3, unlucky=10, bonus="Skillchain Damage"},
["Miser's Roll"] = {lucky=5, unlucky=7, bonus="Save TP"},
["Companion's Roll"] = {lucky=2, unlucky=10, bonus="Pet Regain and Regen"},
["Avenger's Roll"] = {lucky=4, unlucky=8, bonus="Counter Rate"},
}
end
function display_roll_info(spell)
rollinfo = rolls[spell.english]
local rollsize = (state.LuzafRing.value and string.char(129,157)) or ''
if rollinfo then
add_to_chat(001, string.char(129,115).. ' ' ..string.char(31,210)..spell.english..string.char(31,001)..
' : '..rollinfo.bonus.. ' ' ..string.char(129,116).. ' ' ..string.char(129,195)..
' Lucky: ' ..string.char(31,204).. tostring(rollinfo.lucky)..string.char(31,001).. ' /' ..
' Unlucky: ' ..string.char(31,167).. tostring(rollinfo.unlucky)..string.char(31,002)..
' ' ..rollsize)
end
end
-- Determine whether we have sufficient ammo for the action being attempted.
function do_bullet_checks(spell, spellMap, eventArgs)
local bullet_name
local bullet_min_count = 1
if spell.type == 'WeaponSkill' then
if spell.skill == "Marksmanship" then
if spell.english == 'Wildfire' or spell.english == 'Leaden Salute' then
-- magical weaponskills
bullet_name = gear.MAbullet
else
-- physical weaponskills
bullet_name = gear.WSbullet
end
else
-- Ignore non-ranged weaponskills
return
end
elseif spell.type == 'CorsairShot' then
bullet_name = gear.QDbullet
elseif spell.action_type == 'Ranged Attack' then
bullet_name = gear.RAbullet
if buffactive['Triple Shot'] then
bullet_min_count = 3
end
end
local available_bullets = player.inventory[bullet_name] or player.wardrobe[bullet_name]
-- If no ammo is available, give appropriate warning and end.
if not available_bullets then
if spell.type == 'CorsairShot' and player.equipment.ammo ~= 'empty' then
add_to_chat(104, 'No Quick Draw ammo left. Using what\'s currently equipped ('..player.equipment.ammo..').')
return
elseif spell.type == 'WeaponSkill' and player.equipment.ammo == gear.RAbullet then
add_to_chat(104, 'No weaponskill ammo left. Using what\'s currently equipped (standard ranged bullets: '..player.equipment.ammo..').')
return
else
add_to_chat(104, 'No ammo ('..tostring(bullet_name)..') available for that action.')
eventArgs.cancel = true
return
end
end
-- Don't allow shooting or weaponskilling with ammo reserved for quick draw.
if spell.type ~= 'CorsairShot' and bullet_name == gear.QDbullet and available_bullets.count <= bullet_min_count then
add_to_chat(104, 'No ammo will be left for Quick Draw. Cancelling.')
eventArgs.cancel = true
return
end
-- Low ammo warning.
if spell.type ~= 'CorsairShot' and state.warned.value == false
and available_bullets.count > 1 and available_bullets.count <= options.ammo_warning_limit then
local msg = '***** LOW AMMO WARNING: '..bullet_name..' *****'
--local border = string.repeat("*", #msg)
local border = ""
for i = 1, #msg do
border = border .. "*"
end
add_to_chat(104, border)
add_to_chat(104, msg)
add_to_chat(104, border)
state.warned:set()
elseif available_bullets.count > options.ammo_warning_limit and state.warned then
state.warned:reset()
end
end
function special_ammo_check()
-- Stop if Animikii/Hauksbok equipped
if no_shoot_ammo:contains(player.equipment.ammo) then
cancel_spell()
add_to_chat(123, '** Action Canceled: [ '.. player.equipment.ammo .. ' equipped!! ] **')
return
end
end
-- Check for various actions that we've specified in user code as being used with TH gear.
-- This will only ever be called if TreasureMode is not 'None'.
-- Category and Param are as specified in the action event packet.
function th_action_check(category, param)
if category == 2 or -- any ranged attack
--category == 4 or -- any magic action
(category == 3 and param == 30) or -- Aeolian Edge
(category == 6 and info.default_ja_ids:contains(param)) or -- Provoke, Animated Flourish
(category == 14 and info.default_u_ja_ids:contains(param)) -- Quick/Box/Stutter Step, Desperate/Violent Flourish
then return true
end
end
function check_gear()
if no_swap_gear:contains(player.equipment.left_ring) then
disable("ring1")
else
enable("ring1")
end
if no_swap_gear:contains(player.equipment.right_ring) then
disable("ring2")
else
enable("ring2")
end
if no_swap_gear:contains(player.equipment.waist) then
disable("waist")
else
enable("waist")
end
end
function check_weaponset()
if state.OffenseMode.value == 'LowAcc' or state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
equip(sets[state.WeaponSet.current].Acc)
else
equip(sets[state.WeaponSet.current])
end
if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
equip(sets.DefaultShield)
end
end
windower.register_event('zone change',
function()
if no_swap_gear:contains(player.equipment.left_ring) then
enable("ring1")
equip(sets.idle)
end
if no_swap_gear:contains(player.equipment.right_ring) then
enable("ring2")
equip(sets.idle)
end
if no_swap_gear:contains(player.equipment.waist) then
enable("waist")
equip(sets.idle)
end
end
)
send_command('input /macro set 3;input /macro book 10')
send_command('@wait 5; input /lockstyleset 99')
Bismarck.Xurion
Server: Bismarck
Game: FFXI
Posts: 694
By Bismarck.Xurion 2022-05-01 04:38:18
Your Corsairshot logic is in the midcast, but it needs to be in the precast function, similar to WS.
Server: Asura
Game: FFXI
Posts: 71
By Asura.Cordyfox 2022-05-01 11:56:05
Try changing:
Code if player.sub_job == 'DRG' or 'WHM' then
to:
Code if (player.sub_job == 'DRG') or (player.sub_job == 'WHM') then
The code you wrote is read as: if [player.sub_job == 'DRG'] or ['WHM'], not: if player.sub_job == ['DRG' or 'WHM'].
You'll need to do the same for the NIN/DNC one as well.
Hope this works for you.
That makes a lot of sense in retrospect. Thank you.
By quelthos 2022-05-01 17:17:53
Your Corsairshot logic is in the midcast, but it needs to be in the precast function, similar to WS.
Thanks can you clarify which line needs changing?
By quelthos 2022-05-01 17:22:49
Your Corsairshot logic is in the midcast, but it needs to be in the precast function, similar to WS.
I changed line 903 from
function job_post_midcast(spell, action, spellMap, eventArgs)
to
function job_post_precast(spell, action, spellMap, eventArgs)
but still doesn't work, will not use orpheus sash when in melee range.
By quelthos 2022-05-01 17:42:13
Your Corsairshot logic is in the midcast, but it needs to be in the precast function, similar to WS.
I changed line 903 from
function job_post_midcast(spell, action, spellMap, eventArgs)
to
function job_post_precast(spell, action, spellMap, eventArgs)
but still doesn't work, will not use orpheus sash when in melee range.
I fixed it, I changed midcast.corsairshot sets into precast.corsairshot sets and now it works
Thanks!
By Jetackuu 2022-05-01 18:01:45
Just out of pure curiosity, what is the modify date on the version of the plugin everyone has?
Mine's showing v 1.4.4.4 with a date of 11/16/2020
(Just redownloaded it)
my old version was showing the same version # but a modify date of 12/20/2020
I'm definitely not working properly, it won't sync any item updates since the FEB update, at all.
By Vaerix 2022-05-02 20:34:17
How do I go about adding Sroda Necklace for a WHM mote lua? There is a "BarElement" is there "BarAilment"? or something of the likes?
You could add a set before gear that declares bar status spells as a group and then use that as the reference for your gear set, it's in my Blu gearswap at the start and I'll update this post as soon as I'm at my computer if you don't find it before then.
Server: Asura
Game: FFXI
Posts: 176
By Asura.Yottaxa 2022-05-11 00:23:58
Is anyone using priorities in their lua? I’ve been working on a new lua and noticed that it doesn’t swap the gear in order of what I put as priority.
I am pretty sure they go in order from high to low. Did you perhaps do it backwards? Your not supposed to need to, but any set I have that has priorities I have had to do all pieces of the set. Which is why when I use them I just use the hp’s of the piece. You can also use the same priority twice or more, in which case I think it sorts top to down left to right. (Not sure on last part)
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.
|
|