Advertisement
Guest User

Untitled

a guest
Jan 16th, 2022
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 69.03 KB | None | 0 0
  1. -- Original: Motenten / Modified: Arislan
  2. -- Haste/DW Detection Requires Gearinfo Addon
  3.  
  4. -------------------------------------------------------------------------------------------------------------------
  5. -- Keybinds
  6. -------------------------------------------------------------------------------------------------------------------
  7.  
  8. -- Modes: [ F9 ] Cycle Offense Modes
  9. -- [ CTRL+F9 ] Cycle Hybrid Modes
  10. -- [ ALT+F9 ] Cycle Ranged Modes
  11. -- [ WIN+F9 ] Cycle Weapon Skill Modes
  12. -- [ F10 ] Emergency -PDT Mode
  13. -- [ ALT+F10 ] Toggle Kiting Mode
  14. -- [ F11 ] Emergency -MDT Mode
  15. -- [ F12 ] Update Current Gear / Report Current Status
  16. -- [ CTRL+F12 ] Cycle Idle Modes
  17. -- [ ALT+F12 ] Cancel Emergency -PDT/-MDT Mode
  18. -- [ WIN+C ] Toggle Capacity Points Mode
  19. -- [ WIN+` ] Toggle use of Luzaf Ring.
  20. -- [ WIN+Q ] Quick Draw shot mode selector.
  21. --
  22. -- Abilities: [ CTRL+- ] Quick Draw primary shot element cycle forward.
  23. -- [ CTRL+= ] Quick Draw primary shot element cycle backward.
  24. -- [ ALT+- ] Quick Draw secondary shot element cycle forward.
  25. -- [ ALT+= ] Quick Draw secondary shot element cycle backward.
  26. -- [ CTRL+[ ] Quick Draw toggle target type.
  27. -- [ CTRL+] ] Quick Draw toggle use secondary shot.
  28. --
  29. -- [ CTRL+C ] Crooked Cards
  30. -- [ CTRL+` ] Double-Up
  31. -- [ CTRL+X ] Fold
  32. -- [ CTRL+S ] Snake Eye
  33. -- [ CTRL+NumLock ] Triple Shot
  34. -- [ CTRL+Numpad/ ] Berserk
  35. -- [ CTRL+Numpad* ] Warcry
  36. -- [ CTRL+Numpad- ] Aggressor
  37. --
  38. -- Spells: [ WIN+, ] Utsusemi: Ichi
  39. -- [ WIN+. ] Utsusemi: Ni
  40. --
  41. -- Weapons: [ WIN+E/R ] Cycles between available Weapon Sets
  42. -- [ WIN+W ] Toggle Ranged Weapon Lock
  43. --
  44. -- WS: [ CTRL+Numpad7 ] Savage Blade
  45. -- [ CTRL+Numpad8 ] Last Stand
  46. -- [ CTRL+Numpad4 ] Leaden Salute
  47. -- [ CTRL+Numpad5 ] Requiescat
  48. -- [ CTRL+Numpad6 ] Wildfire
  49. -- [ CTRL+Numpad1 ] Aeolian Edge
  50. -- [ CTRL+Numpad2 ] Evisceration
  51. --
  52. -- RA: [ Numpad0 ] Ranged Attack
  53. --
  54. --
  55. -- (Global-Binds.lua contains additional non-job-related keybinds)
  56.  
  57.  
  58. -------------------------------------------------------------------------------------------------------------------
  59. -- Custom Commands (preface with /console to use these in macros)
  60. -------------------------------------------------------------------------------------------------------------------
  61.  
  62. -- gs c qd Uses the currently configured shot on the target, with either <t> or
  63. -- <stnpc> depending on setting.
  64. -- gs c qd t Uses the currently configured shot on the target, but forces use of <t>.
  65. --
  66. -- gs c cycle mainqd Cycles through the available steps to use as the primary shot when using
  67. -- one of the above commands.
  68. -- gs c cycle altqd Cycles through the available steps to use for alternating with the
  69. -- configured main shot.
  70. -- gs c toggle usealtqd Toggles whether or not to use an alternate shot.
  71. -- gs c toggle selectqdtarget Toggles whether or not to use <stnpc> (as opposed to <t>) when using a shot.
  72. --
  73. -- gs c toggle LuzafRing Toggles use of Luzaf Ring on and off
  74.  
  75.  
  76. -------------------------------------------------------------------------------------------------------------------
  77. -- Setup functions for this job. Generally should not be modified.
  78. -------------------------------------------------------------------------------------------------------------------
  79.  
  80. -- Initialization function for this job file.
  81. function get_sets()
  82. mote_include_version = 2
  83.  
  84. -- Load and initialize the include file.
  85. include('Mote-Include.lua')
  86. end
  87.  
  88. -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
  89. function job_setup()
  90. -- QuickDraw Selector
  91. state.Mainqd = M{['description']='Primary Shot', 'Fire Shot', 'Ice Shot', 'Wind Shot', 'Earth Shot', 'Thunder Shot', 'Water Shot'}
  92. state.Altqd = M{['description']='Secondary Shot', 'Fire Shot', 'Ice Shot', 'Wind Shot', 'Earth Shot', 'Thunder Shot', 'Water Shot'}
  93. state.UseAltqd = M(false, 'Use Secondary Shot')
  94. state.SelectqdTarget = M(false, 'Select Quick Draw Target')
  95. state.IgnoreTargetting = M(false, 'Ignore Targetting')
  96.  
  97. state.QDMode = M{['description']='Quick Draw Mode', 'STP', 'Enhance', 'Potency', 'TH'}
  98.  
  99. state.Currentqd = M{['description']='Current Quick Draw', 'Main', 'Alt'}
  100.  
  101. -- Whether to use Luzaf's Ring
  102. state.LuzafRing = M(false, "Luzaf's Ring")
  103. -- Whether a warning has been given for low ammo
  104. state.warned = M(false)
  105.  
  106. no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
  107. "Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring",
  108. "Dev. Bul. Pouch", "Chr. Bul. Pouch", "Liv. Bul. Pouch"}
  109. elemental_ws = S{"Aeolian Edge", "Leaden Salute", "Wildfire"}
  110. no_shoot_ammo = S{"Animikii Bullet", "Hauksbok Bullet"}
  111.  
  112. include('Mote-TreasureHunter')
  113.  
  114. -- For th_action_check():
  115. -- JA IDs for actions that always have TH: Provoke, Animated Flourish
  116. info.default_ja_ids = S{35, 204}
  117. -- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
  118. info.default_u_ja_ids = S{201, 202, 203, 205, 207}
  119.  
  120. define_roll_values()
  121.  
  122. lockstyleset = 7
  123. end
  124.  
  125. -------------------------------------------------------------------------------------------------------------------
  126. -- User setup functions for this job. Recommend that these be overridden in a sidecar file.
  127. -------------------------------------------------------------------------------------------------------------------
  128.  
  129. -- Setup vars that are user-dependent. Can override this function in a sidecar file.
  130. function user_setup()
  131. state.OffenseMode:options('Normal', 'LowAcc', 'MidAcc', 'HighAcc', 'STP')
  132. state.HybridMode:options('Normal', 'DT')
  133. state.RangedMode:options('STP', 'Normal', 'Acc', 'HighAcc', 'Critical')
  134. state.WeaponskillMode:options('Normal', 'Acc')
  135. state.IdleMode:options('Normal', 'DT', 'Refresh')
  136.  
  137. state.WeaponSet = M{['description']='Weapon Set', 'DeathPenalty_M', 'DeathPenalty_R', 'Armageddon_M', 'Armageddon_R', 'Fomalhaut_M', 'Fomalhaut_R', 'Ataktos'}
  138. -- state.CP = M(false, "Capacity Points Mode")
  139. state.WeaponLock = M(false, 'Weapon Lock')
  140.  
  141. gear.RAbullet = "Eminent Bullet"
  142. gear.RAccbullet = "Eminent Bullet"
  143. gear.WSbullet = "Eminent Bullet"
  144. gear.MAbullet = "Eminent Bullet"
  145. gear.QDbullet = "Hauksbok Bullet"
  146. options.ammo_warning_limit = 10
  147.  
  148. -- Additional local binds
  149.  
  150.  
  151. send_command('bind @t gs c cycle treasuremode')
  152. send_command('bind ^` input /ja "Double-up" <me>')
  153. send_command('bind ^c input /ja "Crooked Cards" <me>')
  154. send_command('bind ^s input /ja "Snake Eye" <me>')
  155. send_command('bind ^f input /ja "Fold" <me>')
  156. send_command('bind !` input /ja "Bolter\'s Roll" <me>')
  157. send_command ('bind @` gs c toggle LuzafRing')
  158.  
  159. send_command('bind ^insert gs c cycleback mainqd')
  160. send_command('bind ^delete gs c cycle mainqd')
  161. send_command('bind ^home gs c cycle altqd')
  162. send_command('bind ^end gs c cycleback altqd')
  163. send_command('bind ^pageup gs c toggle selectqdtarget')
  164. send_command('bind ^pagedown gs c toggle usealtqd')
  165.  
  166. -- send_command('bind @c gs c toggle CP')
  167. send_command('bind @q gs c cycle QDMode')
  168. send_command('bind @e gs c cycleback WeaponSet')
  169. send_command('bind @r gs c cycle WeaponSet')
  170. send_command('bind @w gs c toggle WeaponLock')
  171.  
  172. send_command('bind ^numlock input /ja "Triple Shot" <me>')
  173.  
  174. if player.sub_job == 'WAR' then
  175. send_command('bind ^numpad/ input /ja "Berserk" <me>')
  176. send_command('bind ^numpad* input /ja "Warcry" <me>')
  177. send_command('bind ^numpad- input /ja "Aggressor" <me>')
  178. end
  179.  
  180. send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
  181. send_command('bind ^numpad8 input /ws "Last Stand" <t>')
  182. send_command('bind ^numpad4 input /ws "Leaden Salute" <t>')
  183. send_command('bind ^numpad5 input /ws "Requiescat" <t>')
  184. send_command('bind ^numpad6 input /ws "Wildfire" <t>')
  185. send_command('bind ^numpad1 input /ws "Aeolian Edge" <t>')
  186. send_command('bind ^numpad2 input /ws "Evisceration" <t>')
  187.  
  188. send_command('bind %numpad0 input /ra <t>')
  189.  
  190. select_default_macro_book()
  191. set_lockstyle()
  192.  
  193. state.Auto_Kite = M(false, 'Auto_Kite')
  194. Haste = 0
  195. DW_needed = 0
  196. DW = false
  197. moving = false
  198. update_combat_form()
  199. determine_haste_group()
  200. end
  201.  
  202.  
  203. -- Called when this job file is unloaded (eg: job change)
  204. function user_unload()
  205. send_command('unbind ^`')
  206. send_command('unbind ^c')
  207. send_command('unbind ^s')
  208. send_command('unbind ^f')
  209. send_command('unbind !`')
  210. send_command('unbind @t')
  211. send_command('unbind @`')
  212. send_command('unbind ^insert')
  213. send_command('unbind ^delete')
  214. send_command('unbind ^home')
  215. send_command('unbind ^end')
  216. send_command('unbind ^pageup')
  217. send_command('unbind ^pagedown')
  218. send_command('unbind ^,')
  219. -- send_command('unbind @c')
  220. send_command('unbind @q')
  221. send_command('unbind @w')
  222. send_command('unbind @e')
  223. send_command('unbind @r')
  224. send_command('unbind ^numlock')
  225. send_command('unbind ^numpad/')
  226. send_command('unbind ^numpad*')
  227. send_command('unbind ^numpad-')
  228. send_command('unbind ^numpad8')
  229. send_command('unbind ^numpad4')
  230. send_command('unbind ^numpad5')
  231. send_command('unbind ^numpad6')
  232. send_command('unbind ^numpad1')
  233. send_command('unbind ^numpad2')
  234. send_command('unbind numpad0')
  235.  
  236. send_command('unbind #`')
  237. send_command('unbind #1')
  238. send_command('unbind #2')
  239. send_command('unbind #3')
  240. send_command('unbind #4')
  241. send_command('unbind #5')
  242. send_command('unbind #6')
  243. send_command('unbind #7')
  244. send_command('unbind #8')
  245. send_command('unbind #9')
  246. send_command('unbind #0')
  247. end
  248.  
  249. -- Define sets and vars used by this job file.
  250. function init_gear_sets()
  251.  
  252. ------------------------------------------------------------------------------------------------
  253. ---------------------------------------- Precast Sets ------------------------------------------
  254. ------------------------------------------------------------------------------------------------
  255.  
  256. sets.precast.JA['Snake Eye'] = {legs="Lanun Trews +3"}
  257. sets.precast.JA['Wild Card'] = {feet="Lanun Bottes +3"}
  258. sets.precast.JA['Random Deal'] = {body="Lanun Frac +3"}
  259.  
  260. sets.precast.CorsairRoll = {
  261. head="Lanun Tricorne",
  262. hands="Chasseur's Gants +1",
  263. ear2="Etiolation Earring",
  264. neck="Regal Necklace",
  265. body="Malignance Tabard",
  266. ring1="Defending Ring",
  267. ring2="Luzaf's Ring",
  268. back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','Weapon skill damage +10%',}},
  269. legs={ name="Desultor Tassets", augments={'"Phantom Roll" ability delay -5','"Repair" potency +10%',}},
  270. feet="Lanun Bottes +3"
  271. }
  272.  
  273. sets.precast.CorsairRoll.Duration = {main={name="Rostam", bag="wardrobe"}, range="Compensator"}
  274. sets.precast.CorsairRoll.LowerDelay = {back="Gunslinger's Cape"}
  275. sets.precast.CorsairRoll["Caster's Roll"] = set_combine(sets.precast.CorsairRoll, {legs="Chas. Culottes +1"})
  276. sets.precast.CorsairRoll["Courser's Roll"] = set_combine(sets.precast.CorsairRoll, {feet="Chass. Bottes +1"})
  277. sets.precast.CorsairRoll["Blitzer's Roll"] = set_combine(sets.precast.CorsairRoll, {head="Chass. Tricorne +1"})
  278. sets.precast.CorsairRoll["Tactician's Roll"] = set_combine(sets.precast.CorsairRoll, {body="Chasseur's Frac"})
  279. sets.precast.CorsairRoll["Allies' Roll"] = set_combine(sets.precast.CorsairRoll, {hands="Chasseur's Gants +1"})
  280.  
  281. sets.precast.LuzafRing = {ring1="Luzaf's Ring"}
  282. sets.precast.FoldDoubleBust = {hands="Lanun Gants +1"}
  283.  
  284. sets.precast.Waltz = {
  285. body="Passion Jacket",
  286. ring1="Asklepian Ring",
  287. waist="Gishdubar Sash",
  288. }
  289.  
  290. sets.precast.Waltz['Healing Waltz'] = {}
  291.  
  292. sets.precast.FC = {
  293. head="Carmine Mask +1", --14
  294. body=gear.Taeon_FC_body, --9
  295. hands="Leyline Gloves", --8
  296. legs="Rawhide Trousers", --5
  297. feet="Carmine Greaves +1", --8
  298. neck="Orunmila's Torque", --5
  299. ear1="Loquacious Earring", --2
  300. ear2="Enchntr. Earring +1", --2
  301. ring1="Weather. Ring +1", --6(4)
  302. ring2="Kishar Ring", --4
  303. }
  304.  
  305. sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {
  306. body="Passion Jacket",
  307. ring1="Lebeche Ring",
  308. })
  309.  
  310. -- (10% Snapshot from JP Gifts)
  311. sets.precast.RA = {
  312. main={ name="Lanun Knife", augments={'Path: A',}},
  313. sub="Nusku Shield",
  314. range="Molybdosis",
  315. ammo=gear.RAbullet,
  316. head="Chass. Tricorne +1", --0/14
  317. body="Laksa. Frac +2", --14/0
  318. hands={ name="Carmine Fin. Ga. +1", augments={'Rng.Atk.+20','"Mag.Atk.Bns."+12','"Store TP"+6',}},
  319. legs=gear.Adhemar_D_legs, --10/13
  320. feet="Meg. Jam. +2", --10/0
  321. neck="Comm. Charm +2", --4/0
  322. back=gear.COR_SNP_Cape, --10/0
  323. waist="Impulse Belt", --0/5
  324. } --61/32
  325.  
  326. sets.precast.RA.Flurry1 = set_combine(sets.precast.RA, {
  327. body="Laksa. Frac +2", --0/20
  328. }) --47/52
  329.  
  330. sets.precast.RA.Flurry2 = set_combine(sets.precast.RA.Flurry1, {
  331. hands="Carmine Fin. Ga. +1", --8/11
  332. body="Laksa. Frac +2", --0/20
  333. feet="Pursuer's Gaiters", --0/10
  334. }) --32/73
  335.  
  336.  
  337. ------------------------------------------------------------------------------------------------
  338. ------------------------------------- Weapon Skill Sets ----------------------------------------
  339. ------------------------------------------------------------------------------------------------
  340.  
  341. sets.precast.WS = {
  342. ammo=gear.WSbullet,
  343. head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
  344. body="Laksa. Frac +2",
  345. hands="Meg. Gloves +2",
  346. legs={ name="Herculean Trousers", augments={'"Triple Atk."+4','Attack+13',}},
  347. feet={ name="Lanun Bottes +3", augments={'Enhances "Wild Card" effect',}},
  348. neck="Fotia Gorget",
  349. waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  350. left_ear="Ishvara Earring",
  351. right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
  352. left_ring="Epaminondas's Ring",
  353. right_ring="Karieyh Ring +1",
  354. back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
  355. }
  356.  
  357. sets.precast.WS.Acc = set_combine(sets.precast.WS, {
  358. ammo=gear.RAccbullet,
  359. feet="Meg. Jam. +2",
  360. ear1="Beyla Earring",
  361. ear2="Telos Earring",
  362. neck="Iskur Gorget",
  363. ring2="Hajduk Ring +1",
  364. waist="K. Kachina Belt +1",
  365. })
  366.  
  367. sets.precast.WS['Last Stand'] = sets.precast.WS
  368.  
  369. sets.precast.WS['Last Stand'].Acc = set_combine(sets.precast.WS['Last Stand'], {
  370. ammo=gear.RAccbullet,
  371. neck="Iskur Gorget",
  372. ear1="Beyla Earring",
  373. ear2="Telos Earring",
  374. ring2="Hajduk Ring +1",
  375. waist="K. Kachina Belt +1",
  376. })
  377.  
  378. sets.precast.WS['Wildfire'] = {
  379. ammo=gear.MAbullet,
  380. head=gear.Herc_MAB_head,
  381. body="Lanun Frac +3",
  382. hands={ name="Carmine Fin. Ga. +1", augments={'Rng.Atk.+20','"Mag.Atk.Bns."+12','"Store TP"+6',}},
  383. legs="Malignance Tights",
  384. feet="Lanun Bottes +3",
  385. neck="Baetyl Pendant",
  386. ear1="Ishvara Earring",
  387. ear2="Friomisi Earring",
  388. ring1="Dingir Ring",
  389. ring2="Epaminondas's Ring",
  390. back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','Weapon skill damage +10%',}},
  391. waist="Eschan Stone",
  392. }
  393.  
  394. sets.precast.WS['Hot Shot'] = sets.precast.WS['Wildfire']
  395.  
  396. sets.precast.WS['Leaden Salute'] = {
  397. head="Pixie Hairpin +1",
  398. body="Lanun Frac +3",
  399. hands={ name="Carmine Fin. Ga. +1", augments={'Rng.Atk.+20','"Mag.Atk.Bns."+12','"Store TP"+6',}},
  400. legs="Malignance Tights",
  401. feet={ name="Lanun Bottes +3", augments={'Enhances "Wild Card" effect',}},
  402. neck="Baetyl Pendant",
  403. waist="Eschan Stone",
  404. ear1="Friomisi Earring",
  405. ear2="Ishvara Earring",
  406. left_ring="Dingir Ring",
  407. right_ring="Archon Ring",
  408. back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','Weapon skill damage +10%',}},
  409. }
  410.  
  411. sets.precast.WS['Evisceration'] = {
  412. head=gear.Adhemar_B_head,
  413. body="Abnoba Kaftan",
  414. hands="Mummu Wrists +2",
  415. legs="Zoar Subligar +1",
  416. feet="Mummu Gamash. +2",
  417. neck="Fotia Gorget",
  418. ear1="Mache Earring +1",
  419. ear2="Odr Earring",
  420. ring1="Regal Ring",
  421. ring2="Mummu Ring",
  422. back=gear.COR_TP_Cape,
  423. waist="Fotia Belt",
  424. }
  425.  
  426. sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {
  427. head="Meghanada Visor +2",
  428. body=gear.Adhemar_B_body,
  429. legs=gear.Herc_WS_legs,
  430. })
  431.  
  432. sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
  433. head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
  434. body="Laksa. Frac +2",
  435. hands="Meg. Gloves +2",
  436. legs={ name="Herculean Trousers", augments={'"Triple Atk."+4','Attack+13',}},
  437. feet={ name="Lanun Bottes +3", augments={'Enhances "Wild Card" effect',}},
  438. neck="Fotia Gorget",
  439. waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  440. left_ear="Ishvara Earring",
  441. right_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
  442. left_ring="Epaminondas's Ring",
  443. right_ring="Karieyh Ring +1",
  444. back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
  445. })
  446.  
  447. sets.precast.WS['Savage Blade'].Acc = set_combine(sets.precast.WS['Savage Blade'], {
  448. body="Meg. Cuirie +2",
  449. ear2="Telos Earring",
  450. })
  451.  
  452. sets.precast.WS['Swift Blade'] = set_combine(sets.precast.WS, {
  453. head=gear.Adhemar_B_head,
  454. body=gear.Adhemar_B_body,
  455. hands=gear.Adhemar_B_hands,
  456. legs="Meg. Chausses +2",
  457. feet=gear.Herc_TA_feet,
  458. ear1="Cessance Earring",
  459. ear2="Brutal Earring",
  460. ring1="Regal Ring",
  461. ring2="Epona's Ring",
  462. back=gear.COR_WS2_Cape,
  463. })
  464.  
  465. sets.precast.WS['Swift Blade'].Acc = set_combine(sets.precast.WS['Swift Blade'], {
  466. head="Meghanada Visor +2",
  467. hands=gear.Adhemar_A_hands,
  468. ear2="Telos Earring",
  469. })
  470.  
  471. sets.precast.WS['Requiescat'] = set_combine(sets.precast.WS['Swift Blade'], {
  472. hands="Meg. Gloves +2",
  473. ear1="Moonshade Earring",
  474. ear2="Telos Earring",
  475. ring2="Rufescent Ring",
  476. }) --MND
  477.  
  478. sets.precast.WS['Requiescat'].Acc = set_combine(sets.precast.WS['Requiescat'], {
  479. head="Meghanada Visor +2",
  480. ear1="Cessance Earring",
  481. })
  482.  
  483. sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS['Wildfire'], {
  484. ammo=gear.QDbullet,
  485. ear1="Moonshade Earring",
  486. })
  487.  
  488. ------------------------------------------------------------------------------------------------
  489. ---------------------------------------- Midcast Sets ------------------------------------------
  490. ------------------------------------------------------------------------------------------------
  491.  
  492. sets.midcast.FastRecast = sets.precast.FC
  493.  
  494. sets.midcast.SpellInterrupt = {
  495. body=gear.Taeon_Phalanx_body, --10
  496. hands="Rawhide Gloves", --15
  497. legs="Carmine Cuisses +1", --20
  498. feet=gear.Taeon_Phalanx_feet, --10
  499. neck="Loricate Torque +1", --5
  500. ear1="Halasz Earring", --5
  501. ear2="Magnetic Earring", --8
  502. ring2="Evanescence Ring", --5
  503. waist="Rumination Sash", --10
  504. }
  505.  
  506. sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
  507.  
  508. sets.midcast.Cure = {
  509. neck="Incanter's Torque",
  510. ear1="Roundel Earring",
  511. ear2="Mendi. Earring",
  512. ring1="Lebeche Ring",
  513. ring2="Haoma's Ring",
  514. waist="Bishop's Sash",
  515. }
  516.  
  517. sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
  518.  
  519. sets.midcast.CorsairShot = {
  520. ammo=gear.QDbullet,
  521. head=gear.Herc_MAB_head,
  522. body="Lanun Frac +3",
  523. hands="Carmine Fin. Ga. +1",
  524. legs=gear.Herc_MAB_legs,
  525. feet="Lanun Bottes +3",
  526. neck="Baetyl Pendant",
  527. ear1="Crematio Earring",
  528. ear2="Friomisi Earring",
  529. ring1="Dingir Ring",
  530. ring2={name="Fenrir Ring +1", bag="wardrobe4"},
  531. back=gear.COR_WS1_Cape,
  532. waist="Eschan Stone",
  533. }
  534.  
  535. sets.midcast.CorsairShot.STP = {
  536. ammo=gear.QDbullet,
  537. head="Malignance Chapeau",
  538. body="Malignance Tabard",
  539. hands="Malignance Gloves",
  540. legs="Malignance Tights",
  541. feet="Malignance Boots",
  542. neck="Iskur Gorget",
  543. ear1="Dedition Earring",
  544. ear2="Telos Earring",
  545. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  546. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  547. back=gear.COR_RA_Cape,
  548. waist="Kentarch Belt +1",
  549. }
  550.  
  551. sets.midcast.CorsairShot['Light Shot'] = {
  552. ammo=gear.RAccbullet,
  553. head="Laksa. Tricorne +3",
  554. body="Malignance Tabard",
  555. hands="Laksa. Gants +3",
  556. legs="Malignance Tights",
  557. feet="Laksa. Bottes +3",
  558. neck="Comm. Charm +2",
  559. ear1="Enchntr. Earring +1",
  560. ear2="Digni. Earring",
  561. ring1="Dingir Ring",
  562. ring2="Weather. Ring +1",
  563. back=gear.COR_WS1_Cape,
  564. waist="Eschan Stone",
  565. }
  566.  
  567. sets.midcast.CorsairShot['Dark Shot'] = sets.midcast.CorsairShot['Light Shot']
  568. sets.midcast.CorsairShot.Enhance = {body="Mirke Wardecors", feet="Chass. Bottes +1"}
  569.  
  570. -- Ranged gear
  571. sets.midcast.RA = {
  572. ammo=gear.RAbullet,
  573. head="Malignance Chapeau",
  574. body="Malignance Tabard",
  575. hands="Meg. Gloves +2",
  576. legs="Malignance Tights",
  577. feet="Malignance Boots",
  578. neck="Iskur Gorget",
  579. ear1="Dedition Earring",
  580. ear2="Telos Earring",
  581. ring1="Dingir Ring",
  582. ring2="Ilabrat Ring",
  583. back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','Weapon skill damage +10%',}},
  584. waist="Eschan Stone",
  585. }
  586.  
  587. sets.midcast.RA.Acc = set_combine(sets.midcast.RA, {
  588. ammo=gear.RAccbullet,
  589. ear1="Beyla Earring",
  590. ring2="Hajduk Ring +1",
  591. })
  592.  
  593. sets.midcast.RA.HighAcc = set_combine(sets.midcast.RA.Acc, {
  594. legs="Laksa. Trews +3",
  595. ring1="Regal Ring",
  596. waist="K. Kachina Belt +1",
  597. })
  598.  
  599. sets.midcast.RA.Critical = set_combine(sets.midcast.RA, {
  600. head="Meghanada Visor +2",
  601. body="Mummu Jacket +2",
  602. hands="Mummu Wrists +2",
  603. legs="Mummu Kecks +2",
  604. feet="Osh. Leggings +1",
  605. ring1="Begrudging Ring",
  606. ring2="Mummu Ring",
  607. waist="K. Kachina Belt +1",
  608. })
  609.  
  610. sets.midcast.RA.STP = set_combine(sets.midcast.RA, {
  611. ear1="Dedition Earring",
  612. --ring1={name="Chirich Ring +1", bag="wardrobe3"},
  613. --ring2={name="Chirich Ring +1", bag="wardrobe4"},
  614. })
  615.  
  616. sets.TripleShot = {
  617. head="Oshosi Mask +1", --5
  618. body="Chasseur's Frac", --12
  619. hands="Lanun Gants +3",
  620. legs="Osh. Trousers +1", --6
  621. feet="Osh. Leggings +1", --3
  622. } --27
  623.  
  624. sets.TripleShotCritical = {
  625. head="Meghanada Visor +2",
  626. waist="K. Kachina Belt +1",
  627. }
  628.  
  629. sets.TrueShot = {
  630. body="Nisroch Jerkin",
  631. legs="Osh. Trousers +1",
  632. waist="Eschan Stone",
  633. }
  634.  
  635.  
  636. ------------------------------------------------------------------------------------------------
  637. ----------------------------------------- Idle Sets --------------------------------------------
  638. ------------------------------------------------------------------------------------------------
  639.  
  640. sets.resting = {}
  641.  
  642. sets.idle = {
  643. ammo=gear.RAbullet,
  644. head="Malignance Chapeau",
  645. body="Malignance Tabard",
  646. hands={ name="Herculean Gloves", augments={'Accuracy+25','Phys. dmg. taken -2%','STR+8',}},
  647. legs={ name="Carmine Cuisses +1", augments={'Accuracy+12','DEX+12','MND+20',}},
  648. feet="Malignance Boots",
  649. neck={ name="Loricate Torque +1", augments={'Path: A',}},
  650. waist="Flume Belt +1",
  651. left_ear="Infused Earring",
  652. right_ear="Etiolation Earring",
  653. left_ring="Defending Ring",
  654. right_ring="Karieyh Ring +1",
  655. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  656. }
  657.  
  658. sets.idle.DT = set_combine(sets.idle, {
  659. head="Malignance Chapeau", --6/6
  660. body="Malignance Tabard", --9/9
  661. hands="Malignance Gloves", --5/5
  662. legs="Malignance Tights", --7/7
  663. feet="Malignance Boots", --4/4
  664. neck="Warder's Charm +1",
  665. ring1="Purity Ring", --0/4
  666. ring2="Defending Ring", --10/10
  667. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  668. })
  669.  
  670. sets.idle.Refresh = set_combine(sets.idle, {
  671. head=gear.Herc_Idle_head,
  672. --body="Mekosu. Harness",
  673. legs="Rawhide Trousers",
  674. ring1={name="Stikini Ring +1", bag="wardrobe3"},
  675. ring2={name="Stikini Ring +1", bag="wardrobe4"},
  676. })
  677.  
  678. sets.idle.Town = set_combine(sets.idle, {
  679. ammo=gear.MAbullet,
  680. head="Malignance Chapeau",
  681. body="Malignance Tabard",
  682. hands={ name="Herculean Gloves", augments={'Accuracy+25','Phys. dmg. taken -2%','STR+8',}},
  683. legs={ name="Carmine Cuisses +1", augments={'Accuracy+12','DEX+12','MND+20',}},
  684. feet="Malignance Boots",
  685. neck={ name="Loricate Torque +1", augments={'Path: A',}},
  686. waist="Flume Belt +1",
  687. left_ear="Infused Earring",
  688. right_ear="Etiolation Earring",
  689. left_ring="Defending Ring",
  690. right_ring="Karieyh Ring +1",
  691. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  692. })
  693.  
  694.  
  695. ------------------------------------------------------------------------------------------------
  696. ---------------------------------------- Defense Sets ------------------------------------------
  697. ------------------------------------------------------------------------------------------------
  698.  
  699. sets.defense.PDT = sets.idle.DT
  700.  
  701. sets.defense.MDT = {
  702. head="Malignance Chapeau", --6/6
  703. body="Malignance Tabard", --9/9
  704. hands="Malignance Gloves", --5/5
  705. legs="Malignance Tights", --7/7
  706. feet="Malignance Boots", --4/4
  707. neck="Warder's Charm +1",
  708. ear1="Sanare Earring",
  709. ear2="Eabani Earring",
  710. ring1="Purity Ring", --0/4
  711. ring2="Defending Ring", --10/10
  712. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  713. waist="Carrier's Sash",
  714. }
  715.  
  716. sets.Kiting = {legs="Carmine Cuisses +1"}
  717.  
  718.  
  719. ------------------------------------------------------------------------------------------------
  720. ---------------------------------------- Engaged Sets ------------------------------------------
  721. ------------------------------------------------------------------------------------------------
  722.  
  723. -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
  724. -- sets if more refined versions aren't defined.
  725. -- If you create a set with both offense and defense modes, the offense mode should be first.
  726. -- EG: sets.engaged.Dagger.Accuracy.Evasion
  727.  
  728. sets.engaged = {
  729. ammo=gear.RAbullet,
  730. main="Naegling",
  731. sub="Blurred Knife +1",
  732. range={ name="Ataktos", augments={'Delay:+60','TP Bonus +1000',}},
  733. head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
  734. body={ name="Adhemar Jacket +1", augments={'STR+12','DEX+12','Attack+20',}},
  735. hands={ name="Adhemar Wrist. +1", augments={'STR+12','DEX+12','Attack+20',}},
  736. legs={ name="Herculean Trousers", augments={'"Triple Atk."+4','Attack+13',}},
  737. feet={ name="Herculean Boots", augments={'Attack+18','"Triple Atk."+3','AGI+5','Accuracy+15',}},
  738. neck="Clotharius Torque",
  739. waist="Windbuffet Belt +1",
  740. left_ear="Cessance Earring",
  741. right_ear="Telos Earring",
  742. left_ring="Chirich Ring +1",
  743. right_ring="Epona's Ring",
  744. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  745. }
  746.  
  747. sets.engaged.LowAcc = set_combine(sets.engaged, {
  748. head="Dampening Tam",
  749. hands=gear.Adhemar_A_hands,
  750. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  751. neck="Combatant's Torque",
  752. })
  753.  
  754. sets.engaged.MidAcc = set_combine(sets.engaged.LowAcc, {
  755. ear2="Telos Earring",
  756. ring1="Regal Ring",
  757. ring2="Ilabrat Ring",
  758. waist="Kentarch Belt +1",
  759. })
  760.  
  761. sets.engaged.HighAcc = set_combine(sets.engaged.MidAcc, {
  762. head="Carmine Mask +1",
  763. hands="Gazu Bracelet +1",
  764. ear1="Mache Earring +1",
  765. ear2="Odr Earring",
  766. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  767. waist="Olseni Belt",
  768. })
  769.  
  770. sets.engaged.STP = set_combine(sets.engaged, {
  771. head=gear.Herc_STP_head,
  772. feet="Carmine Greaves +1",
  773. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  774. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  775. })
  776.  
  777. -- * DNC Subjob DW Trait: +15%
  778. -- * NIN Subjob DW Trait: +25%
  779.  
  780. -- No Magic Haste (74% DW to cap)
  781. sets.engaged.DW = {
  782. ammo=gear.RAbullet,
  783. head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
  784. body={ name="Adhemar Jacket +1", augments={'STR+12','DEX+12','Attack+20',}},
  785. hands={ name="Adhemar Wrist. +1", augments={'STR+12','DEX+12','Attack+20',}},
  786. legs={ name="Herculean Trousers", augments={'"Triple Atk."+4','Attack+13',}},
  787. feet={ name="Herculean Boots", augments={'Attack+18','"Triple Atk."+3','AGI+5','Accuracy+15',}},
  788. neck="Clotharius Torque",
  789. waist="Windbuffet Belt +1",
  790. left_ear="Telos Earring",
  791. right_ear="Suppanomimi",
  792. left_ring="Chirich Ring +1",
  793. right_ring="Epona's Ring",
  794. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  795. } -- 48%
  796.  
  797. sets.engaged.DW.LowAcc = set_combine(sets.engaged.DW, {
  798. head="Dampening Tam",
  799. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  800. neck="Combatant's Torque",
  801. })
  802.  
  803. sets.engaged.DW.MidAcc = set_combine(sets.engaged.DW.LowAcc, {
  804. hands=gear.Adhemar_A_hands,
  805. ear1="Cessance Earring",
  806. ear2="Telos Earring",
  807. ring1="Regal Ring",
  808. ring2="Ilabrat Ring",
  809. waist="Kentarch Belt +1",
  810. })
  811.  
  812. sets.engaged.DW.HighAcc = set_combine(sets.engaged.DW.MidAcc, {
  813. head="Carmine Mask +1",
  814. hands="Gazu Bracelet +1",
  815. ear1="Mache Earring +1",
  816. ear2="Odr Earring",
  817. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  818. waist="Olseni Belt",
  819. })
  820.  
  821. sets.engaged.DW.STP = set_combine(sets.engaged.DW, {
  822. head=gear.Herc_STP_head,
  823. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  824. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  825. })
  826.  
  827. -- 15% Magic Haste (67% DW to cap)
  828. sets.engaged.DW.LowHaste = {
  829. ammo=gear.RAbullet,
  830. head=gear.Adhemar_B_head,
  831. body=gear.Adhemar_B_body, --6
  832. hands="Floral Gauntlets", --5
  833. legs="Carmine Cuisses +1", --6
  834. feet=gear.Taeon_DW_feet, --9
  835. neck="Iskur Gorget",
  836. ear1="Suppanomimi", --5
  837. ear2="Eabani Earring", --4
  838. ring1="Hetairoi Ring",
  839. ring2="Epona's Ring",
  840. back=gear.COR_TP_Cape,
  841. waist="Reiki Yotai", --7
  842. } -- 42%
  843.  
  844. sets.engaged.DW.LowAcc.LowHaste = set_combine(sets.engaged.DW.LowHaste, {
  845. head="Dampening Tam",
  846. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  847. neck="Combatant's Torque",
  848. })
  849.  
  850. sets.engaged.DW.MidAcc.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, {
  851. hands=gear.Adhemar_A_hands,
  852. ear2="Telos Earring",
  853. ring1="Regal Ring",
  854. ring2="Ilabrat Ring",
  855. waist="Kentarch Belt +1",
  856. })
  857.  
  858. sets.engaged.DW.HighAcc.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, {
  859. head="Carmine Mask +1",
  860. hands="Gazu Bracelet +1",
  861. ear1="Mache Earring +1",
  862. ear2="Odr Earring",
  863. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  864. waist="Olseni Belt",
  865. })
  866.  
  867. sets.engaged.DW.STP.LowHaste = set_combine(sets.engaged.DW.LowHaste, {
  868. head=gear.Herc_STP_head,
  869. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  870. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  871. })
  872.  
  873. -- 30% Magic Haste (56% DW to cap)
  874. sets.engaged.DW.MidHaste = {
  875. ammo=gear.RAbullet,
  876. head=gear.Adhemar_B_head,
  877. body=gear.Adhemar_B_body, --6
  878. hands=gear.Adhemar_B_hands,
  879. legs="Samnuha Tights",
  880. feet=gear.Taeon_DW_feet, --9
  881. neck="Iskur Gorget",
  882. ear1="Suppanomimi", --5
  883. ear2="Eabani Earring", --4
  884. ring1="Hetairoi Ring",
  885. ring2="Epona's Ring",
  886. back=gear.COR_TP_Cape,
  887. waist="Reiki Yotai", --7
  888. } -- 31%
  889.  
  890. sets.engaged.DW.LowAcc.MidHaste = set_combine(sets.engaged.DW.MidHaste, {
  891. head="Dampening Tam",
  892. hands=gear.Adhemar_A_hands,
  893. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  894. neck="Combatant's Torque",
  895. })
  896.  
  897. sets.engaged.DW.MidAcc.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, {
  898. legs="Meg. Chausses +2",
  899. ear2="Telos Earring",
  900. ring1="Regal Ring",
  901. ring2="Ilabrat Ring",
  902. waist="Kentarch Belt +1",
  903. })
  904.  
  905. sets.engaged.DW.HighAcc.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, {
  906. head="Carmine Mask +1",
  907. hands="Gazu Bracelet +1",
  908. legs="Carmine Cuisses +1",
  909. ear1="Mache Earring +1",
  910. ear2="Odr Earring",
  911. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  912. waist="Olseni Belt",
  913. })
  914.  
  915. sets.engaged.DW.STP.MidHaste = set_combine(sets.engaged.DW.MidHaste, {
  916. head=gear.Herc_STP_head,
  917. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  918. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  919. })
  920.  
  921. -- 35% Magic Haste (51% DW to cap)
  922. sets.engaged.DW.HighHaste = {
  923. ammo=gear.RAbullet,
  924. head=gear.Adhemar_B_head,
  925. body=gear.Adhemar_B_body, --6
  926. hands=gear.Adhemar_B_hands,
  927. legs="Samnuha Tights",
  928. feet=gear.Herc_TA_feet,
  929. neck="Iskur Gorget",
  930. ear1="Suppanomimi", --5
  931. ear2="Eabani Earring", --4
  932. ring1="Hetairoi Ring",
  933. ring2="Epona's Ring",
  934. back=gear.COR_TP_Cape,
  935. waist="Reiki Yotai", --7
  936. } -- 27%
  937.  
  938. sets.engaged.DW.LowAcc.HighHaste = set_combine(sets.engaged.DW.HighHaste, {
  939. head="Dampening Tam",
  940. hands=gear.Adhemar_A_hands,
  941. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  942. neck="Combatant's Torque",
  943. })
  944.  
  945. sets.engaged.DW.MidAcc.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, {
  946. legs="Meg. Chausses +2",
  947. ear2="Telos Earring",
  948. ring1="Regal Ring",
  949. ring2="Ilabrat Ring",
  950. waist="Kentarch Belt +1",
  951. })
  952.  
  953. sets.engaged.DW.HighAcc.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, {
  954. head="Carmine Mask +1",
  955. hands="Gazu Bracelet +1",
  956. legs="Carmine Cuisses +1",
  957. ear1="Mache Earring +1",
  958. ear2="Odr Earring",
  959. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  960. waist="Olseni Belt",
  961. })
  962.  
  963. sets.engaged.DW.STP.HighHaste = set_combine(sets.engaged.DW.HighHaste, {
  964. head=gear.Herc_STP_head,
  965. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  966. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  967. })
  968.  
  969. -- 45% Magic Haste (36% DW to cap)
  970. sets.engaged.DW.MaxHaste = {
  971. ammo=gear.RAbullet,
  972. head=gear.Adhemar_B_head,
  973. body=gear.Adhemar_B_body, --6
  974. hands=gear.Adhemar_B_hands,
  975. legs="Samnuha Tights",
  976. feet=gear.Herc_TA_feet,
  977. neck="Iskur Gorget",
  978. ear1="Suppanomimi", --5
  979. ear2="Telos Earring",
  980. ring1="Hetairoi Ring",
  981. ring2="Epona's Ring",
  982. back=gear.COR_TP_Cape,
  983. waist="Windbuffet Belt +1",
  984. } -- 11%
  985.  
  986. sets.engaged.DW.LowAcc.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, {
  987. head="Dampening Tam",
  988. hands=gear.Adhemar_A_hands,
  989. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  990. waist="Kentarch Belt +1",
  991. })
  992.  
  993. sets.engaged.DW.MidAcc.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, {
  994. legs="Meg. Chausses +2",
  995. neck="Combatant's Torque",
  996. ear1="Cessance Earring",
  997. ring1="Regal Ring",
  998. ring2="Ilabrat Ring",
  999. })
  1000.  
  1001. sets.engaged.DW.HighAcc.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, {
  1002. head="Carmine Mask +1",
  1003. hands="Gazu Bracelet +1",
  1004. legs="Carmine Cuisses +1",
  1005. ear1="Mache Earring +1",
  1006. ear2="Odr Earring",
  1007. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  1008. waist="Olseni Belt",
  1009. })
  1010.  
  1011. sets.engaged.DW.STP.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, {
  1012. head=gear.Herc_STP_head,
  1013. feet="Carmine Greaves +1",
  1014. ring1={name="Chirich Ring +1", bag="wardrobe3"},
  1015. ring2={name="Chirich Ring +1", bag="wardrobe4"},
  1016. })
  1017.  
  1018. sets.engaged.DW.MaxHastePlus = set_combine(sets.engaged.DW.MaxHaste, {back=gear.COR_DW_Cape})
  1019. sets.engaged.DW.LowAcc.MaxHastePlus = set_combine(sets.engaged.DW.LowAcc.MaxHaste, {back=gear.COR_DW_Cape})
  1020. sets.engaged.DW.MidAcc.MaxHastePlus = set_combine(sets.engaged.DW.MidAcc.MaxHaste, {back=gear.COR_DW_Cape})
  1021. sets.engaged.DW.HighAcc.MaxHastePlus = set_combine(sets.engaged.DW.HighAcc.MaxHaste, {back=gear.COR_DW_Cape})
  1022. sets.engaged.DW.STP.MaxHastePlus = set_combine(sets.engaged.DW.STP.MaxHaste, {back=gear.COR_DW_Cape})
  1023.  
  1024.  
  1025. ------------------------------------------------------------------------------------------------
  1026. ---------------------------------------- Hybrid Sets -------------------------------------------
  1027. ------------------------------------------------------------------------------------------------
  1028.  
  1029. sets.engaged.Hybrid = {
  1030. head="Malignance Chapeau", --6/6
  1031. body="Malignance Tabard", --9/9
  1032. hands="Malignance Gloves", --5/5
  1033. legs="Malignance Tights", --7/7
  1034. feet="Malignance Boots", --4/4
  1035. }
  1036.  
  1037. sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
  1038. sets.engaged.LowAcc.DT = set_combine(sets.engaged.LowAcc, sets.engaged.Hybrid)
  1039. sets.engaged.MidAcc.DT = set_combine(sets.engaged.MidAcc, sets.engaged.Hybrid)
  1040. sets.engaged.HighAcc.DT = set_combine(sets.engaged.HighAcc, sets.engaged.Hybrid)
  1041. sets.engaged.STP.DT = set_combine(sets.engaged.STP, sets.engaged.Hybrid)
  1042.  
  1043. sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
  1044. sets.engaged.DW.LowAcc.DT = set_combine(sets.engaged.DW.LowAcc, sets.engaged.Hybrid)
  1045. sets.engaged.DW.MidAcc.DT = set_combine(sets.engaged.DW.MidAcc, sets.engaged.Hybrid)
  1046. sets.engaged.DW.HighAcc.DT = set_combine(sets.engaged.DW.HighAcc, sets.engaged.Hybrid)
  1047. sets.engaged.DW.STP.DT = set_combine(sets.engaged.DW.STP, sets.engaged.Hybrid)
  1048.  
  1049. sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
  1050. sets.engaged.DW.LowAcc.DT.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.Hybrid)
  1051. sets.engaged.DW.MidAcc.DT.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.Hybrid)
  1052. sets.engaged.DW.HighAcc.DT.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.Hybrid)
  1053. sets.engaged.DW.STP.DT.LowHaste = set_combine(sets.engaged.DW.STP.LowHaste, sets.engaged.Hybrid)
  1054.  
  1055. sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
  1056. sets.engaged.DW.LowAcc.DT.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.Hybrid)
  1057. sets.engaged.DW.MidAcc.DT.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.Hybrid)
  1058. sets.engaged.DW.HighAcc.DT.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.Hybrid)
  1059. sets.engaged.DW.STP.DT.MidHaste = set_combine(sets.engaged.DW.STP.MidHaste, sets.engaged.Hybrid)
  1060.  
  1061. sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
  1062. sets.engaged.DW.LowAcc.DT.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.Hybrid)
  1063. sets.engaged.DW.MidAcc.DT.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.Hybrid)
  1064. sets.engaged.DW.HighAcc.DT.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.Hybrid)
  1065. sets.engaged.DW.STP.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste.STP, sets.engaged.Hybrid)
  1066.  
  1067. sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
  1068. sets.engaged.DW.LowAcc.DT.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.Hybrid)
  1069. sets.engaged.DW.MidAcc.DT.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.Hybrid)
  1070. sets.engaged.DW.HighAcc.DT.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.Hybrid)
  1071. sets.engaged.DW.STP.DT.MaxHaste = set_combine(sets.engaged.DW.STP.MaxHaste, sets.engaged.Hybrid)
  1072.  
  1073. sets.engaged.DW.DT.MaxHastePlus = set_combine(sets.engaged.DW.MaxHastePlus, sets.engaged.Hybrid)
  1074. sets.engaged.DW.LowAcc.DT.MaxHastePlus = set_combine(sets.engaged.DW.LowAcc.MaxHastePlus, sets.engaged.Hybrid)
  1075. sets.engaged.DW.MidAcc.DT.MaxHastePlus = set_combine(sets.engaged.DW.MidAcc.MaxHastePlus, sets.engaged.Hybrid)
  1076. sets.engaged.DW.HighAcc.DT.MaxHastePlus = set_combine(sets.engaged.DW.HighAcc.MaxHastePlus, sets.engaged.Hybrid)
  1077. sets.engaged.DW.STP.DT.MaxHastePlus = set_combine(sets.engaged.DW.STP.MaxHastePlus, sets.engaged.Hybrid)
  1078.  
  1079.  
  1080. ------------------------------------------------------------------------------------------------
  1081. ---------------------------------------- Special Sets ------------------------------------------
  1082. ------------------------------------------------------------------------------------------------
  1083.  
  1084. sets.buff.Doom = {
  1085. neck="Nicander's Necklace", --20
  1086. ring1={name="Eshmun's Ring", bag="wardrobe3"}, --20
  1087. ring2={name="Eshmun's Ring", bag="wardrobe4"}, --20
  1088. waist="Gishdubar Sash", --10
  1089. }
  1090.  
  1091. sets.FullTP = {ear1="Crematio Earring"}
  1092. sets.Obi = {waist="Hachirin-no-Obi"}
  1093. -- sets.CP = {back="Mecisto. Mantle"}
  1094. --sets.Reive = {neck="Ygnas's Resolve +1"}
  1095.  
  1096. sets.TreasureHunter = {head="Volte Cap", hands=gear.Herc_TH_hands, feet="Volte Boots", waist="Chaac Belt"}
  1097.  
  1098. sets.DeathPenalty_M = {main={name="Rostam", bag="wardrobe3"}, sub="Tauret", ranged="Death Penalty"}
  1099. sets.DeathPenalty_M.Acc = {main={name="Rostam", bag="wardrobe3"}, sub={name="Rostam", bag="wardrobe"}, ranged="Death Penalty"}
  1100. sets.DeathPenalty_R = {main="Lanun Knife", sub="Tauret", ranged="Death Penalty"}
  1101. sets.DeathPenalty_R.Acc = {main="Lanun Knife", sub={name="Rostam", bag="wardrobe"}, ranged="Death Penalty"}
  1102. sets.Armageddon_M = {main="Naegling", sub="Tauret", ranged="Armageddon"}
  1103. sets.Armageddon_M.Acc = {main={name="Rostam", bag="wardrobe3"}, sub={name="Rostam", bag="wardrobe4"}, ranged="Armageddon"}
  1104. sets.Armageddon_R = {main="Lanun Knife", sub="Kustawi +1", ranged="Armageddon"}
  1105. sets.Armageddon_R.Acc = sets.Armageddon_R
  1106. sets.Fomalhaut_M = {main={name="Rostam", bag="wardrobe3"}, sub="Blurred Knife +1", ranged="Fomalhaut"}
  1107. sets.Fomalhaut_M.Acc = {main={name="Rostam", bag="wardrobe3"}, sub="Kustawi +1", ranged="Fomalhaut"}
  1108. sets.Fomalhaut_R = {main="Lanun Knife", sub="Kustawi +1", ranged="Fomalhaut"}
  1109. sets.Fomalhaut_R.Acc = sets.Fomalhaut_R
  1110. sets.Ataktos = {main="Naegling", sub="Blurred Knife +1", ranged="Ataktos"}
  1111. sets.Ataktos.Acc = {main="Naegling", sub="Demers. Degen +1", ranged="Ataktos"}
  1112.  
  1113. sets.DefaultShield = {sub="Nusku Shield"}
  1114.  
  1115. end
  1116.  
  1117.  
  1118. -------------------------------------------------------------------------------------------------------------------
  1119. -- Job-specific hooks for standard casting events.
  1120. -------------------------------------------------------------------------------------------------------------------
  1121.  
  1122. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  1123. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  1124. function job_precast(spell, action, spellMap, eventArgs)
  1125. -- Check that proper ammo is available if we're using ranged attacks or similar.
  1126. if spell.action_type == 'Ranged Attack' or spell.type == 'WeaponSkill' or spell.type == 'CorsairShot' then
  1127. do_bullet_checks(spell, spellMap, eventArgs)
  1128. end
  1129.  
  1130. if spell.english == 'Fold' and buffactive['Bust'] == 2 then
  1131. if sets.precast.FoldDoubleBust then
  1132. equip(sets.precast.FoldDoubleBust)
  1133. eventArgs.handled = true
  1134. end
  1135. end
  1136. if spellMap == 'Utsusemi' then
  1137. if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
  1138. cancel_spell()
  1139. add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
  1140. eventArgs.handled = true
  1141. return
  1142. elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
  1143. send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
  1144. end
  1145. end
  1146. end
  1147.  
  1148. function job_post_precast(spell, action, spellMap, eventArgs)
  1149. if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") then
  1150. if player.status ~= 'Engaged' and state.WeaponLock.value == false then
  1151. equip(sets.precast.CorsairRoll.Duration)
  1152. end
  1153. if state.LuzafRing.value then
  1154. equip(sets.precast.LuzafRing)
  1155. end
  1156. end
  1157. if spell.action_type == 'Ranged Attack' then
  1158. special_ammo_check()
  1159. if flurry == 2 then
  1160. equip(sets.precast.RA.Flurry2)
  1161. elseif flurry == 1 then
  1162. equip(sets.precast.RA.Flurry1)
  1163. end
  1164. elseif spell.type == 'WeaponSkill' then
  1165. if spell.skill == 'Marksmanship' then
  1166. special_ammo_check()
  1167. end
  1168. -- Replace TP-bonus gear if not needed.
  1169. if spell.english == 'Leaden Salute' or spell.english == 'Aeolian Edge' and player.tp > 2900 then
  1170. equip(sets.FullTP)
  1171. end
  1172. if elemental_ws:contains(spell.name) then
  1173. -- Matching double weather (w/o day conflict).
  1174. if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
  1175. equip({waist="Hachirin-no-Obi"})
  1176. -- Target distance under 1.7 yalms.
  1177. elseif spell.target.distance < (1.7 + spell.target.model_size) then
  1178. --equip({waist="Eschan Stone"})
  1179. -- Matching day and weather.
  1180. elseif spell.element == world.day_element and spell.element == world.weather_element then
  1181. equip({waist="Hachirin-no-Obi"})
  1182. -- Target distance under 8 yalms.
  1183. elseif spell.target.distance < (8 + spell.target.model_size) then
  1184. --equip({waist="Eschan Stone"})
  1185. -- Match day or weather.
  1186. elseif spell.element == world.day_element or spell.element == world.weather_element then
  1187. equip({waist="Hachirin-no-Obi"})
  1188. end
  1189. end
  1190. end
  1191. end
  1192.  
  1193. function job_post_midcast(spell, action, spellMap, eventArgs)
  1194. if spell.type == 'CorsairShot' then
  1195. if (spell.english ~= 'Light Shot' and spell.english ~= 'Dark Shot') then
  1196. -- Matching double weather (w/o day conflict).
  1197. if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
  1198. equip({waist="Hachirin-no-Obi"})
  1199. -- Target distance under 1.7 yalms.
  1200. elseif spell.target.distance < (1.7 + spell.target.model_size) then
  1201. --equip({waist="Eschan Stone"})
  1202. -- Matching day and weather.
  1203. elseif spell.element == world.day_element and spell.element == world.weather_element then
  1204. equip({waist="Hachirin-no-Obi"})
  1205. -- Target distance under 8 yalms.
  1206. elseif spell.target.distance < (8 + spell.target.model_size) then
  1207. --equip({waist="Eschan Stone"})
  1208. -- Match day or weather.
  1209. elseif spell.element == world.day_element or spell.element == world.weather_element then
  1210. equip({waist="Hachirin-no-Obi"})
  1211. end
  1212. if state.QDMode.value == 'Enhance' then
  1213. equip(sets.midcast.CorsairShot.Enhance)
  1214. elseif state.QDMode.value == 'TH' then
  1215. equip(sets.midcast.CorsairShot)
  1216. equip(sets.TreasureHunter)
  1217. elseif state.QDMode.value == 'STP' then
  1218. equip(sets.midcast.CorsairShot.STP)
  1219. end
  1220. end
  1221. elseif spell.action_type == 'Ranged Attack' then
  1222. if buffactive['Triple Shot'] then
  1223. equip(sets.TripleShot)
  1224. if buffactive['Aftermath: Lv.3'] and player.equipment.ranged == "Armageddon" then
  1225. equip(sets.TripleShotCritical)
  1226. if (spell.target.distance < (7 + spell.target.model_size)) and (spell.target.distance > (5 + spell.target.model_size)) then
  1227. equip(sets.TrueShot)
  1228. end
  1229. end
  1230. elseif buffactive['Aftermath: Lv.3'] and player.equipment.ranged == "Armageddon" then
  1231. equip(sets.midcast.RA.Critical)
  1232. if (spell.target.distance < (7 + spell.target.model_size)) and (spell.target.distance > (5 + spell.target.model_size)) then
  1233. equip(sets.TrueShot)
  1234. end
  1235. end
  1236. end
  1237. end
  1238.  
  1239. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  1240. function job_aftercast(spell, action, spellMap, eventArgs)
  1241. if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") and not spell.interrupted then
  1242. display_roll_info(spell)
  1243. end
  1244. if spell.english == "Light Shot" then
  1245. send_command('@timers c "Light Shot ['..spell.target.name..']" 60 down abilities/00195.png')
  1246. end
  1247. if player.status ~= 'Engaged' and state.WeaponLock.value == false then
  1248. check_weaponset()
  1249. end
  1250. end
  1251.  
  1252. function job_buff_change(buff,gain)
  1253. -- If we gain or lose any flurry buffs, adjust gear.
  1254. if S{'flurry'}:contains(buff:lower()) then
  1255. if not gain then
  1256. flurry = nil
  1257. --add_to_chat(122, "Flurry status cleared.")
  1258. end
  1259. if not midaction() then
  1260. handle_equipping_gear(player.status)
  1261. end
  1262. end
  1263.  
  1264. -- if buffactive['Reive Mark'] then
  1265. -- if gain then
  1266. -- equip(sets.Reive)
  1267. -- disable('neck')
  1268. -- else
  1269. -- enable('neck')
  1270. -- end
  1271. -- end
  1272.  
  1273. if buff == "doom" then
  1274. if gain then
  1275. equip(sets.buff.Doom)
  1276. --send_command('@input /p Doomed.')
  1277. disable('ring1','ring2','waist')
  1278. else
  1279. enable('ring1','ring2','waist')
  1280. handle_equipping_gear(player.status)
  1281. end
  1282. end
  1283.  
  1284. end
  1285.  
  1286. -- Handle notifications of general user state change.
  1287. function job_state_change(stateField, newValue, oldValue)
  1288. if state.WeaponLock.value == true then
  1289. disable('ranged')
  1290. else
  1291. enable('ranged')
  1292. end
  1293.  
  1294. check_weaponset()
  1295. end
  1296.  
  1297. -------------------------------------------------------------------------------------------------------------------
  1298. -- User code that supplements standard library decisions.
  1299. -------------------------------------------------------------------------------------------------------------------
  1300.  
  1301. -- Called by the 'update' self-command, for common needs.
  1302. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  1303. function job_handle_equipping_gear(playerStatus, eventArgs)
  1304. check_gear()
  1305. update_combat_form()
  1306. determine_haste_group()
  1307. check_moving()
  1308. end
  1309.  
  1310. function job_update(cmdParams, eventArgs)
  1311. handle_equipping_gear(player.status)
  1312. end
  1313.  
  1314. function update_combat_form()
  1315. if DW == true then
  1316. state.CombatForm:set('DW')
  1317. elseif DW == false then
  1318. state.CombatForm:reset()
  1319. end
  1320. end
  1321.  
  1322. -- Modify the default melee set after it was constructed.
  1323. function customize_melee_set(meleeSet)
  1324. check_weaponset()
  1325.  
  1326. return meleeSet
  1327. end
  1328.  
  1329. function get_custom_wsmode(spell, action, spellMap)
  1330. local wsmode
  1331. if spell.skill == 'Marksmanship' then
  1332. if state.RangedMode.value == 'Acc' or state.RangedMode.value == 'HighAcc' then
  1333. wsmode = 'Acc'
  1334. end
  1335. else
  1336. if state.OffenseMode.value == 'Acc' or state.OffenseMode.value == 'HighAcc' then
  1337. wsmode = 'Acc'
  1338. end
  1339. end
  1340.  
  1341. return wsmode
  1342. end
  1343.  
  1344. -- Modify the default idle set after it was constructed.
  1345. function customize_idle_set(idleSet)
  1346. -- if state.CP.current == 'on' then
  1347. -- equip(sets.CP)
  1348. -- disable('back')
  1349. -- else
  1350. -- enable('back')
  1351. -- end
  1352. if state.Auto_Kite.value == true then
  1353. idleSet = set_combine(idleSet, sets.Kiting)
  1354. end
  1355.  
  1356. return idleSet
  1357. end
  1358.  
  1359. -- Handle auto-targetting based on local setup.
  1360. function job_auto_change_target(spell, action, spellMap, eventArgs)
  1361. if spell.type == 'CorsairShot' then
  1362. if state.IgnoreTargetting.value == true then
  1363. state.IgnoreTargetting:reset()
  1364. eventArgs.handled = true
  1365. end
  1366.  
  1367. eventArgs.SelectNPCTargets = state.SelectqdTarget.value
  1368. end
  1369. end
  1370.  
  1371. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  1372. function display_current_job_state(eventArgs)
  1373. local cf_msg = ''
  1374. if state.CombatForm.has_value then
  1375. cf_msg = ' (' ..state.CombatForm.value.. ')'
  1376. end
  1377.  
  1378. local m_msg = state.OffenseMode.value
  1379. if state.HybridMode.value ~= 'Normal' then
  1380. m_msg = m_msg .. '/' ..state.HybridMode.value
  1381. end
  1382.  
  1383. local ws_msg = state.WeaponskillMode.value
  1384.  
  1385. local qd_msg = '(' ..string.sub(state.QDMode.value,1,1).. ')'
  1386.  
  1387. local e_msg = state.Mainqd.current
  1388. if state.UseAltqd.value == true then
  1389. e_msg = e_msg .. '/'..state.Altqd.current
  1390. end
  1391.  
  1392. local d_msg = 'None'
  1393. if state.DefenseMode.value ~= 'None' then
  1394. d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
  1395. end
  1396.  
  1397. local i_msg = state.IdleMode.value
  1398.  
  1399. local msg = ''
  1400. if state.Kiting.value then
  1401. msg = msg .. ' Kiting: On |'
  1402. end
  1403.  
  1404. add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002).. ' |'
  1405. ..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002).. ' |'
  1406. ..string.char(31,060).. ' QD' ..qd_msg.. ': ' ..string.char(31,001)..e_msg.. string.char(31,002).. ' |'
  1407. ..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002).. ' |'
  1408. ..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002).. ' |'
  1409. ..string.char(31,002)..msg)
  1410.  
  1411. eventArgs.handled = true
  1412. end
  1413.  
  1414. -------------------------------------------------------------------------------------------------------------------
  1415. -- Utility functions specific to this job.
  1416. -------------------------------------------------------------------------------------------------------------------
  1417.  
  1418. --Read incoming packet to differentiate between Haste/Flurry I and II
  1419. windower.register_event('action',
  1420. function(act)
  1421. --check if you are a target of spell
  1422. local actionTargets = act.targets
  1423. playerId = windower.ffxi.get_player().id
  1424. isTarget = false
  1425. for _, target in ipairs(actionTargets) do
  1426. if playerId == target.id then
  1427. isTarget = true
  1428. end
  1429. end
  1430. if isTarget == true then
  1431. if act.category == 4 then
  1432. local param = act.param
  1433. if param == 845 and flurry ~= 2 then
  1434. --add_to_chat(122, 'Flurry Status: Flurry I')
  1435. flurry = 1
  1436. elseif param == 846 then
  1437. --add_to_chat(122, 'Flurry Status: Flurry II')
  1438. flurry = 2
  1439. end
  1440. end
  1441. end
  1442. end)
  1443.  
  1444. function determine_haste_group()
  1445. classes.CustomMeleeGroups:clear()
  1446. if DW == true then
  1447. if DW_needed <= 11 then
  1448. classes.CustomMeleeGroups:append('MaxHaste')
  1449. elseif DW_needed > 11 and DW_needed <= 21 then
  1450. classes.CustomMeleeGroups:append('MaxHastePlus')
  1451. elseif DW_needed > 21 and DW_needed <= 27 then
  1452. classes.CustomMeleeGroups:append('HighHaste')
  1453. elseif DW_needed > 27 and DW_needed <= 31 then
  1454. classes.CustomMeleeGroups:append('MidHaste')
  1455. elseif DW_needed > 31 and DW_needed <= 42 then
  1456. classes.CustomMeleeGroups:append('LowHaste')
  1457. elseif DW_needed > 42 then
  1458. classes.CustomMeleeGroups:append('')
  1459. end
  1460. end
  1461. end
  1462.  
  1463. function job_self_command(cmdParams, eventArgs)
  1464. if cmdParams[1] == 'qd' then
  1465. if cmdParams[2] == 't' then
  1466. state.IgnoreTargetting:set()
  1467. end
  1468.  
  1469. local doqd = ''
  1470. if state.UseAltqd.value == true then
  1471. doqd = state[state.Currentqd.current..'qd'].current
  1472. state.Currentqd:cycle()
  1473. else
  1474. doqd = state.Mainqd.current
  1475. end
  1476.  
  1477. send_command('@input /ja "'..doqd..'" <t>')
  1478. end
  1479.  
  1480. gearinfo(cmdParams, eventArgs)
  1481. end
  1482.  
  1483. function gearinfo(cmdParams, eventArgs)
  1484. if cmdParams[1] == 'gearinfo' then
  1485. if type(tonumber(cmdParams[2])) == 'number' then
  1486. if tonumber(cmdParams[2]) ~= DW_needed then
  1487. DW_needed = tonumber(cmdParams[2])
  1488. DW = true
  1489. end
  1490. elseif type(cmdParams[2]) == 'string' then
  1491. if cmdParams[2] == 'false' then
  1492. DW_needed = 0
  1493. DW = false
  1494. end
  1495. end
  1496. if type(tonumber(cmdParams[3])) == 'number' then
  1497. if tonumber(cmdParams[3]) ~= Haste then
  1498. Haste = tonumber(cmdParams[3])
  1499. end
  1500. end
  1501. if type(cmdParams[4]) == 'string' then
  1502. if cmdParams[4] == 'true' then
  1503. moving = true
  1504. elseif cmdParams[4] == 'false' then
  1505. moving = false
  1506. end
  1507. end
  1508. if not midaction() then
  1509. job_update()
  1510. end
  1511. end
  1512. end
  1513.  
  1514. function define_roll_values()
  1515. rolls = {
  1516. ["Corsair's Roll"] = {lucky=5, unlucky=9, bonus="Experience Points"},
  1517. ["Ninja Roll"] = {lucky=4, unlucky=8, bonus="Evasion"},
  1518. ["Hunter's Roll"] = {lucky=4, unlucky=8, bonus="Accuracy"},
  1519. ["Chaos Roll"] = {lucky=4, unlucky=8, bonus="Attack"},
  1520. ["Magus's Roll"] = {lucky=2, unlucky=6, bonus="Magic Defense"},
  1521. ["Healer's Roll"] = {lucky=3, unlucky=7, bonus="Cure Potency Received"},
  1522. ["Drachen Roll"] = {lucky=4, unlucky=8, bonus="Pet Magic Accuracy/Attack"},
  1523. ["Choral Roll"] = {lucky=2, unlucky=6, bonus="Spell Interruption Rate"},
  1524. ["Monk's Roll"] = {lucky=3, unlucky=7, bonus="Subtle Blow"},
  1525. ["Beast Roll"] = {lucky=4, unlucky=8, bonus="Pet Attack"},
  1526. ["Samurai Roll"] = {lucky=2, unlucky=6, bonus="Store TP"},
  1527. ["Evoker's Roll"] = {lucky=5, unlucky=9, bonus="Refresh"},
  1528. ["Rogue's Roll"] = {lucky=5, unlucky=9, bonus="Critical Hit Rate"},
  1529. ["Warlock's Roll"] = {lucky=4, unlucky=8, bonus="Magic Accuracy"},
  1530. ["Fighter's Roll"] = {lucky=5, unlucky=9, bonus="Double Attack Rate"},
  1531. ["Puppet Roll"] = {lucky=3, unlucky=7, bonus="Pet Magic Attack/Accuracy"},
  1532. ["Gallant's Roll"] = {lucky=3, unlucky=7, bonus="Defense"},
  1533. ["Wizard's Roll"] = {lucky=5, unlucky=9, bonus="Magic Attack"},
  1534. ["Dancer's Roll"] = {lucky=3, unlucky=7, bonus="Regen"},
  1535. ["Scholar's Roll"] = {lucky=2, unlucky=6, bonus="Conserve MP"},
  1536. ["Naturalist's Roll"] = {lucky=3, unlucky=7, bonus="Enh. Magic Duration"},
  1537. ["Runeist's Roll"] = {lucky=4, unlucky=8, bonus="Magic Evasion"},
  1538. ["Bolter's Roll"] = {lucky=3, unlucky=9, bonus="Movement Speed"},
  1539. ["Caster's Roll"] = {lucky=2, unlucky=7, bonus="Fast Cast"},
  1540. ["Courser's Roll"] = {lucky=3, unlucky=9, bonus="Snapshot"},
  1541. ["Blitzer's Roll"] = {lucky=4, unlucky=9, bonus="Attack Delay"},
  1542. ["Tactician's Roll"] = {lucky=5, unlucky=8, bonus="Regain"},
  1543. ["Allies' Roll"] = {lucky=3, unlucky=10, bonus="Skillchain Damage"},
  1544. ["Miser's Roll"] = {lucky=5, unlucky=7, bonus="Save TP"},
  1545. ["Companion's Roll"] = {lucky=2, unlucky=10, bonus="Pet Regain and Regen"},
  1546. ["Avenger's Roll"] = {lucky=4, unlucky=8, bonus="Counter Rate"},
  1547. }
  1548. end
  1549.  
  1550. function display_roll_info(spell)
  1551. rollinfo = rolls[spell.english]
  1552. local rollsize = (state.LuzafRing.value and string.char(129,157)) or ''
  1553.  
  1554. if rollinfo then
  1555. add_to_chat(001, string.char(129,115).. ' ' ..string.char(31,210)..spell.english..string.char(31,001)..
  1556. ' : '..rollinfo.bonus.. ' ' ..string.char(129,116).. ' ' ..string.char(129,195)..
  1557. ' Lucky: ' ..string.char(31,204).. tostring(rollinfo.lucky)..string.char(31,001).. ' /' ..
  1558. ' Unlucky: ' ..string.char(31,167).. tostring(rollinfo.unlucky)..string.char(31,002)..
  1559. ' ' ..rollsize)
  1560. end
  1561. end
  1562.  
  1563.  
  1564. -- Determine whether we have sufficient ammo for the action being attempted.
  1565. function do_bullet_checks(spell, spellMap, eventArgs)
  1566. local bullet_name
  1567. local bullet_min_count = 1
  1568.  
  1569. if spell.type == 'WeaponSkill' then
  1570. if spell.skill == "Marksmanship" then
  1571. if spell.english == 'Wildfire' or spell.english == 'Leaden Salute' then
  1572. -- magical weaponskills
  1573. bullet_name = gear.MAbullet
  1574. else
  1575. -- physical weaponskills
  1576. bullet_name = gear.WSbullet
  1577. end
  1578. else
  1579. -- Ignore non-ranged weaponskills
  1580. return
  1581. end
  1582. elseif spell.type == 'CorsairShot' then
  1583. bullet_name = gear.QDbullet
  1584. elseif spell.action_type == 'Ranged Attack' then
  1585. bullet_name = gear.RAbullet
  1586. if buffactive['Triple Shot'] then
  1587. bullet_min_count = 3
  1588. end
  1589. end
  1590.  
  1591. local available_bullets = player.inventory[bullet_name] or player.wardrobe[bullet_name]
  1592.  
  1593. -- If no ammo is available, give appropriate warning and end.
  1594. if not available_bullets then
  1595. if spell.type == 'CorsairShot' and player.equipment.ammo ~= 'empty' then
  1596. add_to_chat(104, 'No Quick Draw ammo left. Using what\'s currently equipped ('..player.equipment.ammo..').')
  1597. return
  1598. elseif spell.type == 'WeaponSkill' and player.equipment.ammo == gear.RAbullet then
  1599. add_to_chat(104, 'No weaponskill ammo left. Using what\'s currently equipped (standard ranged bullets: '..player.equipment.ammo..').')
  1600. return
  1601. else
  1602. add_to_chat(104, 'No ammo ('..tostring(bullet_name)..') available for that action.')
  1603. eventArgs.cancel = true
  1604. return
  1605. end
  1606. end
  1607.  
  1608. -- Don't allow shooting or weaponskilling with ammo reserved for quick draw.
  1609. if spell.type ~= 'CorsairShot' and bullet_name == gear.QDbullet and available_bullets.count <= bullet_min_count then
  1610. add_to_chat(104, 'No ammo will be left for Quick Draw. Cancelling.')
  1611. eventArgs.cancel = true
  1612. return
  1613. end
  1614.  
  1615. -- Low ammo warning.
  1616. if spell.type ~= 'CorsairShot' and state.warned.value == false
  1617. and available_bullets.count > 1 and available_bullets.count <= options.ammo_warning_limit then
  1618. local msg = '***** LOW AMMO WARNING: '..bullet_name..' *****'
  1619. --local border = string.repeat("*", #msg)
  1620. local border = ""
  1621. for i = 1, #msg do
  1622. border = border .. "*"
  1623. end
  1624.  
  1625. add_to_chat(104, border)
  1626. add_to_chat(104, msg)
  1627. add_to_chat(104, border)
  1628.  
  1629. state.warned:set()
  1630. elseif available_bullets.count > options.ammo_warning_limit and state.warned then
  1631. state.warned:reset()
  1632. end
  1633. end
  1634.  
  1635. function special_ammo_check()
  1636. -- Stop if Animikii/Hauksbok equipped
  1637. if no_shoot_ammo:contains(player.equipment.ammo) then
  1638. cancel_spell()
  1639. add_to_chat(123, '** Action Canceled: [ '.. player.equipment.ammo .. ' equipped!! ] **')
  1640. return
  1641. end
  1642. end
  1643.  
  1644. -- Check for various actions that we've specified in user code as being used with TH gear.
  1645. -- This will only ever be called if TreasureMode is not 'None'.
  1646. -- Category and Param are as specified in the action event packet.
  1647. function th_action_check(category, param)
  1648. if category == 2 or -- any ranged attack
  1649. --category == 4 or -- any magic action
  1650. (category == 3 and param == 30) or -- Aeolian Edge
  1651. (category == 6 and info.default_ja_ids:contains(param)) or -- Provoke, Animated Flourish
  1652. (category == 14 and info.default_u_ja_ids:contains(param)) -- Quick/Box/Stutter Step, Desperate/Violent Flourish
  1653. then return true
  1654. end
  1655. end
  1656.  
  1657. function check_moving()
  1658. if state.DefenseMode.value == 'None' and state.Kiting.value == false then
  1659. if state.Auto_Kite.value == false and moving then
  1660. state.Auto_Kite:set(true)
  1661. elseif state.Auto_Kite.value == true and moving == false then
  1662. state.Auto_Kite:set(false)
  1663. end
  1664. end
  1665. end
  1666.  
  1667. function check_gear()
  1668. if no_swap_gear:contains(player.equipment.left_ring) then
  1669. disable("ring1")
  1670. else
  1671. enable("ring1")
  1672. end
  1673. if no_swap_gear:contains(player.equipment.right_ring) then
  1674. disable("ring2")
  1675. else
  1676. enable("ring2")
  1677. end
  1678. if no_swap_gear:contains(player.equipment.waist) then
  1679. disable("waist")
  1680. else
  1681. enable("waist")
  1682. end
  1683. end
  1684.  
  1685. function check_weaponset()
  1686. if state.OffenseMode.value == 'LowAcc' or state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
  1687. equip(sets[state.WeaponSet.current].Acc)
  1688. else
  1689. equip(sets[state.WeaponSet.current])
  1690. end
  1691. if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
  1692. equip(sets.DefaultShield)
  1693. end
  1694. end
  1695.  
  1696. windower.register_event('zone change',
  1697. function()
  1698. if no_swap_gear:contains(player.equipment.left_ring) then
  1699. enable("ring1")
  1700. equip(sets.idle)
  1701. end
  1702. if no_swap_gear:contains(player.equipment.right_ring) then
  1703. enable("ring2")
  1704. equip(sets.idle)
  1705. end
  1706. if no_swap_gear:contains(player.equipment.waist) then
  1707. enable("waist")
  1708. equip(sets.idle)
  1709. end
  1710. end
  1711. )
  1712.  
  1713. -- Select default macro book on initial load or subjob change.
  1714. function select_default_macro_book()
  1715. if player.sub_job == 'DNC' then
  1716. set_macro_page(1, 3)
  1717. else
  1718. set_macro_page(1, 3)
  1719. end
  1720. end
  1721.  
  1722. function set_lockstyle()
  1723. send_command('wait 2; input /lockstyleset ' .. lockstyleset)
  1724. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement