Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.17 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Keybinds
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. -- Modes: [ F9 ] Cycle Offense Modes
  6. -- [ CTRL+F9 ] Cycle Hybrid Modes
  7. -- [ ALT+F9 ] Cycle Ranged Modes
  8. -- [ WIN+F9 ] Cycle Weapon Skill Modes
  9. -- [ F10 ] Emergency -PDT Mode
  10. -- [ ALT+F10 ] Toggle Kiting Mode
  11. -- [ F11 ] Emergency -MDT Mode
  12. -- [ F12 ] Update Current Gear / Report Current Status
  13. -- [ CTRL+F12 ] Cycle Idle Modes
  14. -- [ ALT+F12 ] Cancel Emergency -PDT/-MDT Mode
  15. -- [ WIN+C ] Toggle Capacity Points Mode
  16. -- [ WIN+` ] Toggle use of Luzaf Ring.
  17. -- [ WIN+Q ] Quick Draw shot mode selector.
  18. --
  19. -- Abilities: [ CTRL+- ] Quick Draw primary shot element cycle forward.
  20. -- [ CTRL+= ] Quick Draw primary shot element cycle backward.
  21. -- [ ALT+- ] Quick Draw secondary shot element cycle forward.
  22. -- [ ALT+= ] Quick Draw secondary shot element cycle backward.
  23. -- [ CTRL+[ ] Quick Draw toggle target type.
  24. -- [ CTRL+] ] Quick Draw toggle use secondary shot.
  25. --
  26. -- [ CTRL+C ] Crooked Cards
  27. -- [ CTRL+` ] Double-Up
  28. -- [ CTRL+X ] Fold
  29. -- [ CTRL+S ] Snake Eye
  30. -- [ CTRL+NumLock ] Triple Shot
  31. -- [ CTRL+Numpad/ ] Berserk
  32. -- [ CTRL+Numpad* ] Warcry
  33. -- [ CTRL+Numpad- ] Aggressor
  34. --
  35. --
  36. -- Weapons: [ WIN+E ] Cycles between available ranged weapons
  37. -- [ WIN+W ] Toggle Ranged Weapon Lock
  38. --
  39. -- WS: [ CTRL+Numpad7 ] Savage Blade
  40. -- [ CTRL+Numpad8 ] Last Stand
  41. -- [ CTRL+Numpad4 ] Leaden Salute
  42. -- [ CTRL+Numpad6 ] Wildfire
  43. -- [ CTRL+Numpad1 ] Evisceration
  44. -- [ CTRL+Numpad3 ] Exenterator
  45. --
  46. -- RA: [ ALT+Numpad0 ] Ranged Attack
  47. --
  48. --
  49. -- (Global-Binds.lua contains additional non-job-related keybinds)
  50.  
  51.  
  52. -------------------------------------------------------------------------------------------------------------------
  53. -- Custom Commands (preface with /console to use these in macros)
  54. -------------------------------------------------------------------------------------------------------------------
  55.  
  56. -- gs c qd Uses the currently configured shot on the target, with either <t> or
  57. -- <stnpc> depending on setting.
  58. -- gs c qd t Uses the currently configured shot on the target, but forces use of <t>.
  59. --
  60. -- gs c cycle mainqd Cycles through the available steps to use as the primary shot when using
  61. -- one of the above commands.
  62. -- gs c cycle altqd Cycles through the available steps to use for alternating with the
  63. -- configured main shot.
  64. -- gs c toggle usealtqd Toggles whether or not to use an alternate shot.
  65. -- gs c toggle selectqdtarget Toggles whether or not to use <stnpc> (as opposed to <t>) when using a shot.
  66. --
  67. -- gs c toggle LuzafRing Toggles use of Luzaf Ring on and off
  68.  
  69.  
  70. -------------------------------------------------------------------------------------------------------------------
  71. -- Setup functions for this job. Generally should not be modified.
  72. -------------------------------------------------------------------------------------------------------------------
  73.  
  74. -- Initialization function for this job file.
  75. function get_sets()
  76. mote_include_version = 2
  77.  
  78. -- Load and initialize the include file.
  79. include('Mote-Include.lua')
  80. end
  81.  
  82. -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
  83. function job_setup()
  84.  
  85. send_command('alias hw input /item "Holy Water" <me>' )
  86. send_command('alias re input /item "Remedy" <me>' )
  87. send_command('alias ed input /item "Echo Drops" <me>' )
  88. send_command('alias pa input /item "Panacea" <me>' )
  89.  
  90. state.mainweapon = M{['description'] = 'Main Weapon'}
  91. state.mainweapon:options('DP','Evis','Melee')
  92.  
  93. -- QuickDraw Selector
  94. state.Mainqd = M{['description']='Primary Shot', 'Fire Shot', 'Ice Shot', 'Wind Shot', 'Earth Shot', 'Thunder Shot', 'Water Shot'}
  95. state.Altqd = M{['description']='Secondary Shot', 'Fire Shot', 'Ice Shot', 'Wind Shot', 'Earth Shot', 'Thunder Shot', 'Water Shot'}
  96. state.UseAltqd = M(false, 'Use Secondary Shot')
  97. state.SelectqdTarget = M(false, 'Select Quick Draw Target')
  98. state.IgnoreTargetting = M(false, 'Ignore Targetting')
  99.  
  100. state.DualWield = M(false, 'Dual Wield III')
  101. state.QDMode = M{['description']='Quick Draw Mode', 'STP', 'Magic Enhance', 'Magic Attack'}
  102.  
  103. state.Currentqd = M{['description']='Current Quick Draw', 'Main', 'Alt'}
  104.  
  105. -- Whether to use Luzaf's Ring
  106. state.LuzafRing = M(false, "Luzaf's Ring")
  107. -- Whether a warning has been given for low ammo
  108. state.warned = M(false)
  109.  
  110. define_roll_values()
  111.  
  112. end
  113.  
  114. -------------------------------------------------------------------------------------------------------------------
  115. -- User setup functions for this job. Recommend that these be overridden in a sidecar file.
  116. -------------------------------------------------------------------------------------------------------------------
  117.  
  118. -- Setup vars that are user-dependent. Can override this function in a sidecar file.
  119. function user_setup()
  120. state.OffenseMode:options('Normal', 'Acc')
  121. state.HybridMode:options('Normal', 'DT')
  122. state.RangedMode:options('Normal', 'HighAcc', 'Critical')
  123. state.WeaponskillMode:options('Normal', 'Acc')
  124. state.CastingMode:options('Normal', 'Resistant')
  125. state.IdleMode:options('Normal', 'Refresh')
  126.  
  127. state.Gun = M{['description']='Current Gun', 'Death Penalty', 'Fomalhaut', 'Ataktos'}
  128. state.CP = M(false, "Capacity Points Mode")
  129.  
  130. DP_weapons = S{'DP'}
  131. Evis_weapons = S{'Evis'}
  132. SB_weapons = S{'SB'}
  133.  
  134. gear.RAbullet = "Chrono Bullet"
  135. gear.WSbullet = "Chrono Bullet"
  136. gear.MAbullet = "Living Bullet"
  137. gear.QDbullet = "Living Bullet"
  138. options.ammo_warning_limit = 10
  139.  
  140. -- Additional local binds
  141.  
  142. send_command('bind ^` input /ja "Double-up" <me>')
  143. send_command('bind ^c input /ja "Crooked Cards" <me>')
  144. send_command('bind ^s input /ja "Snake Eye" <me>')
  145. send_command('bind ^f input /ja "Fold" <me>')
  146. send_command('bind !` input /ja "Bolter\'s Roll" <me>')
  147. send_command ('bind @` gs c toggle LuzafRing')
  148.  
  149. send_command('bind ^- gs c cycleback mainqd')
  150. send_command('bind ^= gs c cycle mainqd')
  151. send_command('bind !- gs c cycle altqd')
  152. send_command('bind != gs c cycleback altqd')
  153. send_command('bind ^[ gs c toggle selectqdtarget')
  154. send_command('bind ^] gs c toggle usealtqd')
  155.  
  156. send_command('bind @c gs c toggle CP')
  157. send_command('bind @q gs c cycle QDMode')
  158. send_command('bind @e gs c cycle Gun')
  159. send_command('bind @d gs c mainweapon')
  160. send_command('bind @s gs c cycle AutoWSMode')
  161.  
  162. send_command('bind ^numlock input /ja "Triple Shot" <me>')
  163.  
  164. if player.sub_job == 'WAR' then
  165. send_command('bind ^numpad/ input /ja "Berserk" <me>')
  166. send_command('bind ^numpad* input /ja "Warcry" <me>')
  167. send_command('bind ^numpad- input /ja "Aggressor" <me>')
  168. end
  169.  
  170. send_command('bind ^numpad7 input /ws "Savage Blade" <t>')
  171. send_command('bind ^numpad8 input /ws "Last Stand" <t>')
  172. send_command('bind ^numpad4 input /ws "Leaden Salute" <t>')
  173. send_command('bind ^numpad6 input /ws "Wildfire" <t>')
  174. send_command('bind ^numpad1 input /ws "Evisceration" <t>')
  175. send_command('bind ^numpad2 input /ws "Aeolian Edge" <t>')
  176. send_command('bind ^numpad3 input /ws "Exenterator" <t>')
  177.  
  178. send_command('bind !numpad0 input /ra <t>')
  179. update_combat_form()
  180. select_default_macro_book()
  181.  
  182. end
  183.  
  184.  
  185. -- Called when this job file is unloaded (eg: job change)
  186. function user_unload()
  187. send_command('unbind ^`')
  188. send_command('unbind ^c')
  189. send_command('unbind ^s')
  190. send_command('unbind ^f')
  191. send_command('unbind !`')
  192. send_command('unbind @`')
  193. send_command('unbind ^-')
  194. send_command('unbind ^=')
  195. send_command('unbind !-')
  196. send_command('unbind !=')
  197. send_command('unbind ^[')
  198. send_command('unbind ^]')
  199. send_command('unbind ^,')
  200. send_command('unbind @c')
  201. send_command('unbind @q')
  202. send_command('unbind @e')
  203. send_command('unbind @w')
  204. send_command('unbind @d')
  205. send_command('unbind ^numlock')
  206. send_command('unbind ^numpad/')
  207. send_command('unbind ^numpad*')
  208. send_command('unbind ^numpad-')
  209. send_command('unbind ^numpad8')
  210. send_command('unbind ^numpad4')
  211. send_command('unbind ^numpad6')
  212. send_command('unbind ^numpad1')
  213. send_command('unbind ^numpad2')
  214. send_command('unbind ^numpad3')
  215. send_command('unbind !numpad0')
  216.  
  217. send_command('unbind #`')
  218. send_command('unbind #1')
  219. send_command('unbind #2')
  220. send_command('unbind #3')
  221. send_command('unbind #4')
  222. send_command('unbind #5')
  223. send_command('unbind #6')
  224. send_command('unbind #7')
  225. send_command('unbind #8')
  226. send_command('unbind #9')
  227. send_command('unbind #0')
  228. end
  229.  
  230. sets.mainweapon = {}
  231. sets.mainweapon.DP = {
  232. main="Lanun Knife",
  233. sub="Fettering Blade", }
  234.  
  235. sets.mainweapon.Evis = {
  236. main="Lanun Knife",
  237. sub="Blurred Knife +1", }
  238.  
  239. sets.mainweapon.SB = {
  240. main="Hep. Sapara +1",
  241. sub="Blurred Knife +1", }
  242.  
  243. -- Define sets and vars used by this job file.
  244. function init_gear_sets()
  245.  
  246. ------------------------------------------------------------------------------------------------
  247. ---------------------------------------- Precast Sets ------------------------------------------
  248. ------------------------------------------------------------------------------------------------
  249.  
  250. sets.precast.JA['Snake Eye'] = {legs="Lanun Trews +1"}
  251. sets.precast.JA['Wild Card'] = {feet="Lanun Bottes +3"}
  252. sets.precast.JA['Random Deal'] = {body="Lanun Frac +3"}
  253.  
  254. sets.precast.CorsairRoll = {
  255. main="Rostam",
  256. head="Lanun Tricorne +3",
  257. neck="Regal Necklace",
  258. body="Lanun Frac +3",
  259. hands="Chasseur's Gants +1",
  260. feet="Lanun Bottes +3",
  261. waist="Flume Belt",
  262. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Damage taken-5%',}},
  263. }
  264.  
  265. sets.precast.CorsairRoll.Gun = set_combine(sets.precast.CorsairRoll.Engaged, {})
  266. sets.precast.CorsairRoll["Caster's Roll"] = set_combine(sets.precast.CorsairRoll, {legs="Chas. Culottes +1"})
  267. sets.precast.CorsairRoll["Courser's Roll"] = set_combine(sets.precast.CorsairRoll, {feet="Chass. Bottes +1"})
  268. sets.precast.CorsairRoll["Blitzer's Roll"] = set_combine(sets.precast.CorsairRoll, {head="Chass. Tricorne +1"})
  269. sets.precast.CorsairRoll["Tactician's Roll"] = set_combine(sets.precast.CorsairRoll, {body="Chasseur's Frac +1"})
  270. sets.precast.CorsairRoll["Allies' Roll"] = set_combine(sets.precast.CorsairRoll, {hands="Chasseur's Gants +1"})
  271.  
  272. sets.precast.LuzafRing = set_combine(sets.precast.CorsairRoll, {ring1="Luzaf's Ring"})
  273. sets.precast.FoldDoubleBust = {hands="Lanun Gants +3"}
  274.  
  275. sets.precast.Waltz = {
  276. body="Passion Jacket",
  277. neck="Phalaina Locket",
  278. ring1="Asklepian Ring",
  279. waist="Gishdubar Sash",
  280. }
  281.  
  282. sets.precast.Waltz['Healing Waltz'] = {}
  283.  
  284. sets.precast.FC = {
  285. head="Carmine Mask",
  286. neck="Voltsurge Torque",
  287. ear2="Loquacious Earring",
  288. hands="Leyline Gloves",
  289. ring1="Prolix Ring",
  290. ring2="Kishar Ring",
  291. feet="Carmine Greaves +1"
  292. }
  293.  
  294. sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {
  295. body="Passion Jacket",
  296. neck="Magoraga Beads",
  297. ring1="Lebeche Ring",
  298. })
  299.  
  300. -- (10% Snapshot from JP Gifts)
  301. sets.precast.RA = {
  302. ammo=gear.RAbullet,
  303. head="Aurore Beret +1",
  304. neck="Comm. Charm +2",
  305. body="Laksa. Frac +3",
  306. hands="Carmine Fin. Ga. +1",
  307. legs="Laksa. Trews +3",
  308. feet="Meg. Jam. +2",
  309. waist="Impulse Belt",
  310. back={ name="Camulus's Mantle", augments={'"Snapshot"+10',}},
  311. }
  312.  
  313.  
  314. ------------------------------------------------------------------------------------------------
  315. ------------------------------------- Weapon Skill Sets ----------------------------------------
  316. ------------------------------------------------------------------------------------------------
  317.  
  318. sets.precast.WS = {
  319. ammo=gear.WSbullet,
  320. head="Lanun Tricorne +3",
  321. body="Laksa. Frac +3",
  322. hands="Meg. Gloves +2",
  323. legs={ name="Herculean Trousers", augments={'Rng.Acc.+22 Rng.Atk.+22','Weapon skill damage +3%','DEX+5','Rng.Acc.+15','Rng.Atk.+2',}},
  324. feet="Lanun Bottes +3",
  325. neck="Fotia Gorget",
  326. ear1="Moonshade Earring",
  327. ear2="Ishvara Earring",
  328. ring1="Ilabrat Ring",
  329. ring2="Dingir Ring",
  330. back={ name="Camulus's Mantle", augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','AGI+10','Weapon skill damage +10%',}},
  331. waist="Fotia Belt",
  332. }
  333.  
  334. sets.precast.WS.Acc = set_combine(sets.precast.WS, {
  335. ear2="Telos Earring",
  336. ring1="Hajduk Ring +1",
  337. ring2="Cacoethic Ring",
  338. })
  339.  
  340. sets.precast.WS['Last Stand'] = sets.precast.WS
  341.  
  342. sets.precast.WS['Last Stand'].Acc = set_combine(sets.precast.WS['Last Stand'], {
  343. head="Meghanada Visor +2",
  344. ear1="Enervating Earring",
  345. ear2="Telos Earring",
  346. ring1="Hajduk Ring +1",
  347. ring2="Cacoethic Ring",
  348. legs="Laksa. Trews +3",
  349. feet="Meg. Jam. +2",
  350. })
  351.  
  352. sets.precast.WS['Wildfire'] = {
  353. ammo=gear.MAbullet,
  354. head={ name="Herculean Helm", augments={'"Mag.Atk.Bns."+25','Weapon skill damage +4%','INT+9',}},
  355. body="Lanun Frac +3",
  356. hands={ name="Herculean Gloves", augments={'Mag. Acc.+19 "Mag.Atk.Bns."+19','Weapon skill damage +4%','STR+6','Mag. Acc.+2','"Mag.Atk.Bns."+12',}},
  357. legs={ name="Herculean Trousers", augments={'"Mag.Atk.Bns."+25','Weapon skill damage +4%','MND+9','Mag. Acc.+6',}},
  358. feet="Lanun Bottes +3",
  359. neck="Comm. Charm +2",
  360. waist="Eschan Stone",
  361. left_ear="Crematio Earring",
  362. right_ear="Friomisi Earring",
  363. left_ring="Ilabrat Ring",
  364. right_ring="Dingir Ring",
  365. back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','AGI+10','Weapon skill damage +10%',}},
  366. }
  367.  
  368. sets.precast.WS['Hot Shot'] = sets.precast.WS['Wildfire']
  369.  
  370. sets.precast.WS['Leaden Salute'] = set_combine(sets.precast.WS['Wildfire'], {
  371. head="Pixie Hairpin +1",
  372. neck="Comm. Charm +2",
  373. ear1="Moonshade Earring",
  374. ring1="Archon Ring",
  375. waist="Svelt. Gouriz +1",
  376. })
  377.  
  378. sets.precast.WS['Leaden Salute'].FullTP = {ear1="Crematio Earring", waist="Svelt. Gouriz +1"}
  379.  
  380. sets.precast.WS['Evisceration'] = {
  381. head={ name="Herculean Helm", augments={'Attack+21','Weapon skill damage +4%','DEX+10','Accuracy+14',}},
  382. body="Laksa. Frac +3",
  383. hands="Meg. Gloves +2",
  384. legs="Mummu Kecks +2",
  385. feet="Lanun Bottes +3",
  386. neck="Fotia Gorget",
  387. waist="Fotia Belt",
  388. left_ear="Mache Earring +1",
  389. right_ear="Mache Earring +1",
  390. left_ring="Ilabrat Ring",
  391. right_ring="Mummu Ring",
  392. back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
  393. }
  394.  
  395. sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {
  396. head="Meghanada Visor +2",
  397. ear2="Telos Earring",
  398. })
  399.  
  400. sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS,
  401. {head="Lanun Tricorne +3",
  402. hands="Meg. Gloves +2",
  403. legs="Mummu Kecks +2",
  404. })
  405.  
  406. sets.precast.WS['Exenterator'].Acc = set_combine(sets.precast.WS['Exenterator'], {})
  407.  
  408.  
  409. sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, {
  410. head={ name="Herculean Helm", augments={'Accuracy+9','Weapon skill damage +5%','STR+1','Attack+15',}},
  411. hands="Meg. Gloves +2",
  412. legs={ name="Herculean Trousers", augments={'Accuracy+15','Weapon skill damage +4%','STR+9','Attack+6',}},
  413. left_ring="Rufescent Ring",
  414. right_ring="Shukuyu Ring",
  415. back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
  416. waist="Prosilio Belt +1",
  417. })
  418.  
  419. sets.precast.WS['Savage Blade'].Acc = set_combine(sets.precast.WS['Savage Blade'], {
  420. ear2="Telos Earring",
  421. waist="Grunfeld Rope",
  422. })
  423.  
  424. sets.precast.WS['Swift Blade'] = set_combine(sets.precast.WS, {
  425. head={ name="Adhemar Bonnet +1", augments={'STR+12','DEX+12','Attack+20',}},
  426. body={ name="Adhemar Jacket +1", augments={'DEX+12','AGI+12','Accuracy+20',}},
  427. legs={ name="Herculean Trousers", augments={'Accuracy+15','Weapon skill damage +4%','STR+9','Attack+6',}},
  428. feet={ name="Carmine Greaves +1", augments={'Accuracy+12','DEX+12','MND+20',}},
  429. ear1="Cessance Earring",
  430. ear2="Brutal Earring",
  431. left_ring="Petrov Ring",
  432. ring2="Epona's Ring",
  433. back={ name="Camulus's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%',}},
  434. })
  435.  
  436. sets.precast.WS['Swift Blade'].Acc = set_combine(sets.precast.WS['Swift Blade'], {
  437. head="Meghanada Visor +2",
  438. hands="Meg. Gloves +2",
  439. ear2="Telos Earring",
  440. })
  441.  
  442.  
  443. sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS['Wildfire'], {})
  444.  
  445. ------------------------------------------------------------------------------------------------
  446. ---------------------------------------- Midcast Sets ------------------------------------------
  447. ------------------------------------------------------------------------------------------------
  448.  
  449. sets.midcast.FastRecast = sets.precast.FC
  450.  
  451. sets.midcast.SpellInterrupt = {
  452. ear1="Halasz Earring",
  453. hands="Rawhide Gloves",
  454. legs="Carmine Cuisses +1",
  455. ring1="Evanescence Ring",
  456. }
  457.  
  458. sets.midcast.Cure = {
  459. neck="Phalaina Locket",
  460. ring1="Lebeche Ring",
  461. }
  462.  
  463. sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
  464.  
  465. -- Occult Acumen Set
  466. sets.midcast['Dark Magic'] = {
  467. ammo=gear.QDbullet,
  468. head={ name="Herculean Helm", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','"Fast Cast"+2','VIT+10','Mag. Acc.+5','"Mag.Atk.Bns."+14',}},
  469. body="Mummu Jacket +2",
  470. hands={ name="Adhemar Wrist. +1", augments={'AGI+12','Rng.Acc.+20','Rng.Atk.+20',}},
  471. legs={ name="Herculean Trousers", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','DEX+5','Mag. Acc.+14','"Mag.Atk.Bns."+12',}},
  472. feet="Carmine Greaves +1",
  473. neck="Sanctity Necklace",
  474. ear1="Dedition Earring",
  475. ear2="Telos Earring",
  476. ring1="Archon Ring",
  477. ring2="Dingir Ring",
  478. back={ name="Camulus's Mantle", augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','"Store TP"+10',}},
  479. waist="Eschan Stone",
  480. }
  481.  
  482. sets.midcast.CorsairShot = {
  483. ammo=gear.QDbullet,
  484. head={ name="Herculean Helm", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','"Fast Cast"+2','VIT+10','Mag. Acc.+5','"Mag.Atk.Bns."+14',}},
  485. body="Lanun Frac +3",
  486. hands="Carmine Fin. Ga. +1",
  487. legs={ name="Herculean Trousers", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','DEX+5','Mag. Acc.+14','"Mag.Atk.Bns."+12',}},
  488. feet="Lanun Bottes +3",
  489. neck="Comm. Charm +2",
  490. left_ear="Crematio Earring",
  491. ear2="Friomisi Earring",
  492. ring1="Fenrir Ring +1",
  493. ring2="Dingir Ring",
  494. back="Gunslinger's Cape",
  495. waist="Eschan Stone",
  496. }
  497.  
  498. sets.midcast.CorsairShot.STP = {
  499. ammo=gear.QDbullet,
  500. head={ name="Herculean Helm", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','"Fast Cast"+2','VIT+10','Mag. Acc.+5','"Mag.Atk.Bns."+14',}},
  501. body="Mummu Jacket +2",
  502. hands="Carmine Fin. Ga. +1",
  503. legs={ name="Adhemar Kecks +1", augments={'AGI+12','"Rapid Shot"+13','Enmity-6',}},
  504. feet="Carmine Greaves +1",
  505. neck="Iskur Gorget",
  506. ear1="Dedition Earring",
  507. ear2="Telos Earring",
  508. ring1="Petrov Ring",
  509. ring2="Chirich Ring +1",
  510. back={ name="Camulus's Mantle", augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','"Store TP"+10',}},
  511. waist="Yemaya Belt",
  512. }
  513.  
  514. sets.midcast.CorsairShot.Resistant = set_combine(sets.midcast.CorsairShot, {
  515. head={ name="Herculean Helm", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','"Fast Cast"+2','VIT+10','Mag. Acc.+5','"Mag.Atk.Bns."+14',}},
  516. body="Mummu Jacket +2",
  517. hands="Lanun Gants +3",
  518. legs={ name="Herculean Trousers", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','DEX+5','Mag. Acc.+14','"Mag.Atk.Bns."+12',}},
  519. feet="Mummu Gamash. +2",
  520. neck="Sanctity Necklace",
  521. back={ name="Camulus's Mantle", augments={'AGI+20','Mag. Acc+20 /Mag. Dmg.+20','AGI+10','Weapon skill damage +10%',}},
  522. waist="Kwahu Kachina Belt +1",
  523. })
  524.  
  525. sets.midcast.CorsairShot['Light Shot'] = sets.midcast.CorsairShot.Resistant
  526. sets.midcast.CorsairShot['Dark Shot'] = sets.midcast.CorsairShot.Resistant
  527. sets.midcast.CorsairShot.Enhance = {feet="Chass. Bottes +1"}
  528.  
  529. -- Ranged gear
  530. sets.midcast.RA = {
  531. ammo=gear.RAbullet,
  532. head="Meghanada Visor +2",
  533. body="Laksa. Frac +3",
  534. hands={ name="Adhemar Wrist. +1", augments={'AGI+12','Rng.Acc.+20','Rng.Atk.+20',}},
  535. legs={ name="Adhemar Kecks +1", augments={'AGI+12','"Rapid Shot"+13','Enmity-6',}},
  536. feet={ name="Adhe. Gamashes +1", augments={'AGI+12','Rng.Acc.+20','Rng.Atk.+20',}},
  537. neck="Iskur Gorget",
  538. ear1="Enervating Earring",
  539. ear2="Telos Earring",
  540. ring1="Ilabrat Ring",
  541. ring2="Dingir Ring",
  542. back={ name="Camulus's Mantle", augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','Rng.Acc.+10','"Store TP"+10',}},
  543. waist="Yemaya Belt",
  544. }
  545.  
  546. sets.midcast.RA.HighAcc = set_combine(sets.midcast.RA, {
  547. ring1="Cacoethic Ring",
  548. ring2="Hajduk Ring +1",
  549. feet="Meg. Jam. +2",
  550. })
  551.  
  552.  
  553. sets.midcast.RA.Critical = set_combine(sets.midcast.RA, {
  554. head="Meghanada Visor +2",
  555. body="Mummu Jacket +2",
  556. hands="Mummu Wrists +1",
  557. legs="Mummu Kecks +2",
  558. feet="Oshosi Leggings",
  559. ring1="Begrudging Ring",
  560. ring2="Mummu Ring",
  561. waist="Kwahu Kachina Belt +1",
  562. })
  563.  
  564. sets.TripleShot = {
  565. --head="Oshosi Mask",
  566. body="Chasseur's Frac +1",
  567. hands="Lanun Gants +3",
  568. legs="Oshosi Trousers",
  569. feet="Oshosi Leggings",
  570. }
  571.  
  572. sets.TripleShotCritical = {
  573. head="Meghanada Visor +2",
  574. waist="Kwahu Kachina Belt +1",
  575. }
  576.  
  577.  
  578. ------------------------------------------------------------------------------------------------
  579. ----------------------------------------- Idle Sets --------------------------------------------
  580. ------------------------------------------------------------------------------------------------
  581.  
  582. sets.idle = {
  583. ammo=gear.MAbullet,
  584. head="Meghanada Visor +2",
  585. body="Meg. Cuirie +2",
  586. hands="Meg. Gloves +2",
  587. legs={ name="Carmine Cuisses +1", augments={'Accuracy+20','Attack+12','"Dual Wield"+6',}},
  588. feet="Lanun Bottes +3",
  589. --neck="Comm. Charm +2",
  590. neck="Sanctity Necklace",
  591. waist="Flume Belt",
  592. ear1="Infused Earring",
  593. ear2="Odnowa Earring +1",
  594. left_ring="Vocane Ring",
  595. right_ring="Defending Ring",
  596. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Damage taken-5%',}},
  597. }
  598.  
  599. sets.idle.Refresh = set_combine(sets.idle, {
  600. head={ name="Rawhide Mask", augments={'HP+50','Accuracy+15','Evasion+20',}},
  601. hands={ name="Herculean Gloves", augments={'MND+4','Pet: INT+7','"Refresh"+2','Accuracy+14 Attack+14','Mag. Acc.+3 "Mag.Atk.Bns."+3',}},
  602. feet={ name="Herculean Boots", augments={'STR+11','Weapon Skill Acc.+3','"Refresh"+2','Accuracy+6 Attack+6','Mag. Acc.+9 "Mag.Atk.Bns."+9',}},
  603. right_ear="Ethereal Earring",
  604. })
  605.  
  606. ------------------------------------------------------------------------------------------------
  607. ---------------------------------------- Defense Sets ------------------------------------------
  608. ------------------------------------------------------------------------------------------------
  609.  
  610. sets.Kiting = {legs="Carmine Cuisses +1"}
  611.  
  612.  
  613. ------------------------------------------------------------------------------------------------
  614. ---------------------------------------- Engaged Sets ------------------------------------------
  615. ------------------------------------------------------------------------------------------------
  616.  
  617. -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
  618. -- sets if more refined versions aren't defined.
  619. -- If you create a set with both offense and defense modes, the offense mode should be first.
  620. -- EG: sets.engaged.Dagger.Accuracy.Evasion
  621.  
  622. sets.engaged = {
  623. head="Adhemar Bonnet +1",
  624. body="Adhemar Jacket +1",
  625. hands={ name="Adhemar Wrist. +1", augments={'DEX+12','AGI+12','Accuracy+20',}},
  626. legs="Samnuha Tights",
  627. feet={ name="Herculean Boots", augments={'Accuracy+29','"Triple Atk."+4','STR+6',}},
  628. neck="Combatant's Torque",
  629. --neck="Comm. Charm +2",
  630. ear1="Cessance Earring",
  631. ear2="Telos Earring",
  632. ring1="Hetairoi Ring",
  633. ring2="Epona's Ring",
  634. back={ name="Camulus's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Dbl.Atk."+10','Damage taken-5%',}},
  635. waist="Windbuffet Belt +1",
  636. }
  637.  
  638. sets.engaged.DP = set_combine(sets.engaged, {
  639. main="Lanun Knife",
  640. sub="Fettering Blade", })
  641.  
  642.  
  643. sets.engaged.DP.DT = set_combine(sets.engaged.DP, {
  644. head="Meghanada Visor +2",
  645. body="Lanun Frac +3",
  646. left_ring="Vocane Ring",
  647. ring2="Defending Ring",
  648. hands={ name="Herculean Gloves", augments={'Accuracy+25 Attack+25','Phys. dmg. taken -5%','Accuracy+7','Attack+12',}},
  649. })
  650.  
  651. sets.engaged.DP.Acc = set_combine(sets.engaged.DP, {
  652. head={ name="Herculean Helm", augments={'Accuracy+22 Attack+22','"Triple Atk."+4','AGI+1','Accuracy+2',}},
  653. ear1="Cessance Earring",
  654. ear2="Telos Earring",
  655. legs="Carmine Cuisses +1",
  656. left_ring="Cacoethic Ring",
  657. right_ring="Chirich Ring +1",
  658. waist="Kentarch Belt +1",
  659. })
  660.  
  661. sets.engaged.Evis = set_combine(sets.engaged, {
  662. main="Lanun Knife",
  663. sub="Blurred Knife +1", })
  664.  
  665. sets.engaged.Evis.DT = set_combine(sets.engaged.Evis, {
  666. head="Meghanada Visor +2",
  667. body="Lanun Frac +3",
  668. left_ring="Vocane Ring",
  669. ring2="Defending Ring",
  670. hands={ name="Herculean Gloves", augments={'Accuracy+25 Attack+25','Phys. dmg. taken -5%','Accuracy+7','Attack+12',}},
  671. })
  672.  
  673. sets.engaged.Evis.Acc = set_combine(sets.engaged.Evis, {
  674. head={ name="Herculean Helm", augments={'Accuracy+22 Attack+22','"Triple Atk."+4','AGI+1','Accuracy+2',}},
  675. ear1="Cessance Earring",
  676. ear2="Telos Earring",
  677. legs="Carmine Cuisses +1",
  678. left_ring="Cacoethic Ring",
  679. right_ring="Chirich Ring +1",
  680. waist="Kentarch Belt +1",
  681. })
  682.  
  683. sets.engaged.SB = set_combine(sets.engaged, {
  684. main="Hep. Sapara +1",
  685. sub="Blurred Knife +1", })
  686.  
  687. sets.engaged.SB.DT = set_combine(sets.engaged.SB, {
  688. head="Meghanada Visor +2",
  689. body="Lanun Frac +3",
  690. left_ring="Vocane Ring",
  691. ring2="Defending Ring",
  692. hands={ name="Herculean Gloves", augments={'Accuracy+25 Attack+25','Phys. dmg. taken -5%','Accuracy+7','Attack+12',}},
  693. })
  694.  
  695. sets.engaged.SB.Acc = set_combine(sets.engaged.SB, {
  696. head={ name="Herculean Helm", augments={'Accuracy+22 Attack+22','"Triple Atk."+4','AGI+1','Accuracy+2',}},
  697. ear1="Cessance Earring",
  698. ear2="Telos Earring",
  699. legs="Carmine Cuisses +1",
  700. left_ring="Cacoethic Ring",
  701. right_ring="Chirich Ring +1",
  702. waist="Kentarch Belt +1",
  703. })
  704.  
  705. sets.Obi = {waist="Hachirin-no-Obi"}
  706. sets.CP = {back="Mecisto. Mantle"}
  707. --sets.Reive = {neck="Ygnas's Resolve +1"}
  708.  
  709. end
  710.  
  711.  
  712. -------------------------------------------------------------------------------------------------------------------
  713. -- Job-specific hooks for standard casting events.
  714. -------------------------------------------------------------------------------------------------------------------
  715.  
  716. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  717. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  718. function job_precast(spell, action, spellMap, eventArgs)
  719. -- Check that proper ammo is available if we're using ranged attacks or similar.
  720. if spell.action_type == 'Ranged Attack' or spell.type == 'WeaponSkill' or spell.type == 'CorsairShot' then
  721. do_bullet_checks(spell, spellMap, eventArgs)
  722. end
  723.  
  724. -- Gear
  725. if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") then
  726. if player.status ~= 'Engaged' then
  727. equip(sets.precast.CorsairRoll.Gun)
  728. end
  729. if state.LuzafRing.value then
  730. equip(sets.precast.LuzafRing)
  731. end
  732. elseif spell.type == 'CorsairShot' and state.CastingMode.value == 'Resistant' then
  733. classes.CustomClass = 'Acc'
  734. end
  735.  
  736. if spell.english == 'Fold' and buffactive['Bust'] == 2 then
  737. if sets.precast.FoldDoubleBust then
  738. equip(sets.precast.FoldDoubleBust)
  739. eventArgs.handled = true
  740. end
  741. end
  742. if spellMap == 'Utsusemi' then
  743. if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
  744. cancel_spell()
  745. add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
  746. eventArgs.handled = true
  747. return
  748. elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
  749. send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
  750. end
  751. end
  752. end
  753.  
  754. function job_post_precast(spell, action, spellMap, eventArgs)
  755. if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") then
  756. if player.status ~= 'Engaged' then
  757. equip(sets.precast.CorsairRoll.Gun)
  758. end
  759. -- Equip obi if weather/day matches for WS.
  760. elseif spell.type == 'WeaponSkill' then
  761. if spell.english == 'Leaden Salute' then
  762. if world.weather_element == 'Dark' or world.day_element == 'Dark' then
  763. equip(sets.Obi)
  764. end
  765. if player.tp > 2900 then
  766. equip(sets.precast.WS['Leaden Salute'].FullTP)
  767. end
  768. elseif spell.english == 'Wildfire' and (world.weather_element == 'Fire' or world.day_element == 'Fire') then
  769. equip(sets.Obi)
  770. end
  771. end
  772. end
  773.  
  774. function job_post_midcast(spell, action, spellMap, eventArgs)
  775. -- Equip obi if weather/day matches for Quick Draw.
  776. if spell.type == 'CorsairShot' then
  777. if (spell.element == world.day_element or spell.element == world.weather_element) and
  778. (spell.english ~= 'Light Shot' and spell.english ~= 'Dark Shot') then
  779. equip(sets.Obi)
  780. end
  781. if state.QDMode.value == 'Magic Enhance' then
  782. equip(sets.midcast.CorsairShot.Enhance)
  783. elseif state.QDMode.value == 'STP' then
  784. equip(sets.midcast.CorsairShot.STP)
  785. end
  786. elseif spell.action_type == 'Ranged Attack' then
  787. if buffactive['Triple Shot'] then
  788. equip(sets.TripleShot)
  789. end
  790. end
  791. end
  792.  
  793. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  794. function job_aftercast(spell, action, spellMap, eventArgs)
  795. if spell.type == 'CorsairRoll' and not spell.interrupted then
  796. display_roll_info(spell)
  797. end
  798. if spell.english == "Light Shot" then
  799. send_command('@timers c "Light Shot ['..spell.target.name..']" 60 down abilities/00195.png')
  800. end
  801. end
  802.  
  803.  
  804. -- Handle notifications of general user state change.
  805. function job_state_change(stateField, newValue, oldValue)
  806. if state.WeaponLock.value == true then
  807. disable('ranged')
  808. else
  809. enable('ranged')
  810. end
  811. end
  812.  
  813. -------------------------------------------------------------------------------------------------------------------
  814. -- User code that supplements standard library decisions.
  815. -------------------------------------------------------------------------------------------------------------------
  816.  
  817. -- Called by the 'update' self-command, for common needs.
  818. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  819.  
  820.  
  821. -- Modify the default idle set after it was constructed.
  822. function customize_idle_set(idleSet)
  823. if state.Gun.current == 'Death Penalty' then
  824. equip({ranged="Death Penalty"})
  825. elseif state.Gun.current == 'Fomalhaut' then
  826. equip({ranged="Fomalhaut"})
  827. elseif state.Gun.current == 'Ataktos' then
  828. equip({ranged="Ataktos"})
  829. end
  830.  
  831. if state.CP.current == 'on' then
  832. equip(sets.CP)
  833. disable('back')
  834. else
  835. enable('back')
  836. end
  837. return idleSet
  838. end
  839.  
  840. -- Handle auto-targetting based on local setup.
  841. function job_auto_change_target(spell, action, spellMap, eventArgs)
  842. if spell.type == 'CorsairShot' then
  843. if state.IgnoreTargetting.value == true then
  844. state.IgnoreTargetting:reset()
  845. eventArgs.handled = true
  846. end
  847.  
  848. eventArgs.SelectNPCTargets = state.SelectqdTarget.value
  849. end
  850. end
  851.  
  852. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  853. function display_current_job_state(eventArgs)
  854. local msg = ''
  855.  
  856. msg = msg .. '[ Offense/Ranged: '..state.OffenseMode.current
  857.  
  858. if state.HybridMode.value ~= 'Normal' then
  859. msg = msg .. '/' .. state.HybridMode.value
  860. end
  861.  
  862. msg = msg .. '/' ..state.RangedMode.current .. ' ]'
  863.  
  864. if state.WeaponskillMode.value ~= 'Normal' then
  865. msg = msg .. '[ WS: '..state.WeaponskillMode.current .. ' ]'
  866. end
  867.  
  868. if state.DefenseMode.value ~= 'None' then
  869. msg = msg .. '[ Defense: ' .. state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ' ]'
  870. end
  871.  
  872. if state.Kiting.value then
  873. msg = msg .. '[ Kiting Mode: ON ]'
  874. end
  875.  
  876. msg = msg .. '[ *'..state.Mainqd.current
  877.  
  878. if state.UseAltqd.value == true then
  879. msg = msg .. '/'..state.Altqd.current
  880. end
  881.  
  882. msg = msg .. ' ('
  883.  
  884. if state.QDMode.value then
  885. msg = msg .. state.QDMode.current .. ') '
  886. end
  887.  
  888. msg = msg .. ']'
  889.  
  890. add_to_chat(060, msg)
  891.  
  892. eventArgs.handled = true
  893. end
  894.  
  895. function_update_combat_form()
  896. -- Check Weapontype
  897. if DP_weapons:contains(player.equipment.main) then
  898. state.CombatForm:set('DP')
  899. elseif
  900. Evis_weapons:contains(player.equipment.main) then
  901. state.CombatForm:set('Evis')
  902. elseif
  903. SB_weapons:contains(player.equipment.main) then
  904. state.CombatForm:set('SB')
  905. else
  906. state.CombatForm:reset()
  907. end
  908.  
  909. function job_self_command(cmdParams, eventArgs)
  910. command = cmdParams[1]:lower()
  911. if command=='mainweapon' then
  912. enable('main','sub')
  913. mainswap=1
  914. send_command('gs c cycle mainweapon')
  915. end
  916. end
  917.  
  918. function job_update(cmdParams, eventArgs)
  919. update_combat_form()
  920. end
  921.  
  922. -------------------------------------------------------------------------------------------------------------------
  923. -- Utility functions specific to this job.
  924. -------------------------------------------------------------------------------------------------------------------
  925.  
  926.  
  927. function job_self_command(cmdParams, eventArgs)
  928. if cmdParams[1] == 'qd' then
  929. if cmdParams[2] == 't' then
  930. state.IgnoreTargetting:set()
  931. end
  932.  
  933. local doqd = ''
  934. if state.UseAltqd.value == true then
  935. doqd = state[state.Currentqd.current..'qd'].current
  936. state.Currentqd:cycle()
  937. else
  938. doqd = state.Mainqd.current
  939. end
  940.  
  941. send_command('@input /ja "'..doqd..'" <t>')
  942. end
  943.  
  944. end
  945.  
  946.  
  947. function define_roll_values()
  948. rolls = {
  949. ["Corsair's Roll"] = {lucky=5, unlucky=9, bonus="Experience Points"},
  950. ["Ninja Roll"] = {lucky=4, unlucky=8, bonus="Evasion"},
  951. ["Hunter's Roll"] = {lucky=4, unlucky=8, bonus="Accuracy"},
  952. ["Chaos Roll"] = {lucky=4, unlucky=8, bonus="Attack"},
  953. ["Magus's Roll"] = {lucky=2, unlucky=6, bonus="Magic Defense"},
  954. ["Healer's Roll"] = {lucky=3, unlucky=7, bonus="Cure Potency Received"},
  955. ["Drachen Roll"] = {lucky=4, unlucky=8, bonus="Pet Magic Accuracy/Attack"},
  956. ["Choral Roll"] = {lucky=2, unlucky=6, bonus="Spell Interruption Rate"},
  957. ["Monk's Roll"] = {lucky=3, unlucky=7, bonus="Subtle Blow"},
  958. ["Beast Roll"] = {lucky=4, unlucky=8, bonus="Pet Attack"},
  959. ["Samurai Roll"] = {lucky=2, unlucky=6, bonus="Store TP"},
  960. ["Evoker's Roll"] = {lucky=5, unlucky=9, bonus="Refresh"},
  961. ["Rogue's Roll"] = {lucky=5, unlucky=9, bonus="Critical Hit Rate"},
  962. ["Warlock's Roll"] = {lucky=4, unlucky=8, bonus="Magic Accuracy"},
  963. ["Fighter's Roll"] = {lucky=5, unlucky=9, bonus="Double Attack Rate"},
  964. ["Puppet Roll"] = {lucky=3, unlucky=7, bonus="Pet Magic Attack/Accuracy"},
  965. ["Gallant's Roll"] = {lucky=3, unlucky=7, bonus="Defense"},
  966. ["Wizard's Roll"] = {lucky=5, unlucky=9, bonus="Magic Attack"},
  967. ["Dancer's Roll"] = {lucky=3, unlucky=7, bonus="Regen"},
  968. ["Scholar's Roll"] = {lucky=2, unlucky=6, bonus="Conserve MP"},
  969. ["Naturalist's Roll"] = {lucky=3, unlucky=7, bonus="Enh. Magic Duration"},
  970. ["Runeist's Roll"] = {lucky=4, unlucky=8, bonus="Magic Evasion"},
  971. ["Bolter's Roll"] = {lucky=3, unlucky=9, bonus="Movement Speed"},
  972. ["Caster's Roll"] = {lucky=2, unlucky=7, bonus="Fast Cast"},
  973. ["Courser's Roll"] = {lucky=3, unlucky=9, bonus="Snapshot"},
  974. ["Blitzer's Roll"] = {lucky=4, unlucky=9, bonus="Attack Delay"},
  975. ["Tactician's Roll"] = {lucky=5, unlucky=8, bonus="Regain"},
  976. ["Allies' Roll"] = {lucky=3, unlucky=10, bonus="Skillchain Damage"},
  977. ["Miser's Roll"] = {lucky=5, unlucky=7, bonus="Save TP"},
  978. ["Companion's Roll"] = {lucky=2, unlucky=10, bonus="Pet Regain and Regen"},
  979. ["Avenger's Roll"] = {lucky=4, unlucky=8, bonus="Counter Rate"},
  980. }
  981. end
  982.  
  983. function display_roll_info(spell)
  984. rollinfo = rolls[spell.english]
  985. local rollsize = (state.LuzafRing.value and 'Large') or 'Small'
  986.  
  987. if rollinfo then
  988. add_to_chat(104, '[ Lucky: '..tostring(rollinfo.lucky)..' / Unlucky: '..tostring(rollinfo.unlucky)..' ] '..spell.english..': '..rollinfo.bonus..' ('..rollsize..') ')
  989. end
  990. end
  991.  
  992.  
  993. -- Determine whether we have sufficient ammo for the action being attempted.
  994. function do_bullet_checks(spell, spellMap, eventArgs)
  995. local bullet_name
  996. local bullet_min_count = 1
  997.  
  998. if spell.type == 'WeaponSkill' then
  999. if spell.skill == "Marksmanship" then
  1000. if spell.english == 'Wildfire' or spell.english == 'Leaden Salute' then
  1001. -- magical weaponskills
  1002. bullet_name = gear.MAbullet
  1003. else
  1004. -- physical weaponskills
  1005. bullet_name = gear.WSbullet
  1006. end
  1007. else
  1008. -- Ignore non-ranged weaponskills
  1009. return
  1010. end
  1011. elseif spell.type == 'CorsairShot' then
  1012. bullet_name = gear.QDbullet
  1013. elseif spell.action_type == 'Ranged Attack' then
  1014. bullet_name = gear.RAbullet
  1015. if buffactive['Triple Shot'] then
  1016. bullet_min_count = 3
  1017. end
  1018. end
  1019.  
  1020. local available_bullets = player.inventory[bullet_name] or player.wardrobe[bullet_name]
  1021.  
  1022. -- If no ammo is available, give appropriate warning and end.
  1023. if not available_bullets then
  1024. if spell.type == 'CorsairShot' and player.equipment.ammo ~= 'empty' then
  1025. add_to_chat(104, 'No Quick Draw ammo left. Using what\'s currently equipped ('..player.equipment.ammo..').')
  1026. return
  1027. elseif spell.type == 'WeaponSkill' and player.equipment.ammo == gear.RAbullet then
  1028. add_to_chat(104, 'No weaponskill ammo left. Using what\'s currently equipped (standard ranged bullets: '..player.equipment.ammo..').')
  1029. return
  1030. else
  1031. add_to_chat(104, 'No ammo ('..tostring(bullet_name)..') available for that action.')
  1032. eventArgs.cancel = true
  1033. return
  1034. end
  1035. end
  1036.  
  1037. -- Don't allow shooting or weaponskilling with ammo reserved for quick draw.
  1038. if spell.type ~= 'CorsairShot' and bullet_name == gear.QDbullet and available_bullets.count <= bullet_min_count then
  1039. add_to_chat(104, 'No ammo will be left for Quick Draw. Cancelling.')
  1040. eventArgs.cancel = true
  1041. return
  1042. end
  1043.  
  1044. -- Low ammo warning.
  1045. if spell.type ~= 'CorsairShot' and state.warned.value == false
  1046. and available_bullets.count > 1 and available_bullets.count <= options.ammo_warning_limit then
  1047. local msg = '***** LOW AMMO WARNING: '..bullet_name..' *****'
  1048. --local border = string.repeat("*", #msg)
  1049. local border = ""
  1050. for i = 1, #msg do
  1051. border = border .. "*"
  1052. end
  1053.  
  1054. add_to_chat(104, border)
  1055. add_to_chat(104, msg)
  1056. add_to_chat(104, border)
  1057.  
  1058. state.warned:set()
  1059. elseif available_bullets.count > options.ammo_warning_limit and state.warned then
  1060. state.warned:reset()
  1061. end
  1062. end
  1063.  
  1064. -- Select default macro book on initial load or subjob change.
  1065. function select_default_macro_book()
  1066. if player.sub_job == 'DNC' then
  1067. set_macro_page(1, 4)
  1068. elseif player.sub_job == "NIN" then
  1069. set_macro_page(2, 4)
  1070. elseif player.sub_job == "WAR" then
  1071. set_macro_page(3, 4)
  1072. elseif player.sub_job == "RNG" then
  1073. set_macro_page(4, 4)
  1074. elseif player.sub_job == "WHM" then
  1075. set_macro_page(5, 4)
  1076. else
  1077. set_macro_page(1, 4)
  1078. end
  1079. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement