Damienlunas

tchara_thf.lua

Jul 8th, 2026
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.82 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. -- [ WIN+F9 ] Cycle Weapon Skill Modes
  11. -- [ F10 ] Emergency -PDT Mode
  12. -- [ ALT+F10 ] Toggle Kiting Mode
  13. -- [ F11 ] Emergency -MDT Mode
  14. -- [ F12 ] Update Current Gear / Report Current Status
  15. -- [ CTRL+F12 ] Cycle Idle Modes
  16. -- [ ALT+F12 ] Cancel Emergency -PDT/-MDT Mode
  17. -- [ CTRL+` ] Cycle Treasure Hunter Mode
  18. -- [ WIN+C ] Toggle Capacity Points Mode
  19. --
  20. -- Abilities: [ ALT+` ] Flee
  21. -- [ CTRL+Numpad/ ] Berserk
  22. -- [ CTRL+Numpad* ] Warcry
  23. -- [ CTRL+Numpad- ] Aggressor
  24. -- [ CTRL+Numpad0 ] Sneak Attack
  25. -- [ CTRL+Numpad. ] Trick Attack
  26. --
  27. -- Spells: [ WIN+, ] Utsusemi: Ichi
  28. -- [ WIN+. ] Utsusemi: Ni
  29. --
  30. -- WS: [ CTRL+Numpad7 ] Exenterator
  31. -- [ CTRL+Numpad8 ] Mandalic Stab
  32. -- [ CTRL+Numpad4 ] Evisceration
  33. -- [ CTRL+Numpad5 ] Rudra's Storm
  34. -- [ CTRL+Numpad1 ] Aeolian Edge
  35. --
  36. --
  37. -- (Global-Binds.lua contains additional non-job-related keybinds)
  38.  
  39.  
  40. -------------------------------------------------------------------------------------------------------------------
  41. -- Custom Commands (preface with /console to use these in macros)
  42. -------------------------------------------------------------------------------------------------------------------
  43.  
  44. -- gs c cycle treasuremode (set on ctrl-= by default): Cycles through the available treasure hunter modes.
  45. --
  46. -- TH Modes: None Will never equip TH gear
  47. -- Tag Will equip TH gear sufficient for initial contact with a mob (either melee,
  48. --
  49. -- SATA - Will equip TH gear sufficient for initial contact with a mob, and when using SATA
  50. -- Fulltime - Will keep TH gear equipped fulltime
  51.  
  52.  
  53. -------------------------------------------------------------------------------------------------------------------
  54. -- Setup functions for this job. Generally should not be modified.
  55. -------------------------------------------------------------------------------------------------------------------
  56.  
  57. -- Initialization function for this job file.
  58. function get_sets()
  59. mote_include_version = 2
  60.  
  61. -- Load and initialize the include file.
  62. include('Mote-Include.lua')
  63. end
  64.  
  65.  
  66. -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
  67. function job_setup()
  68. state.Buff['Sneak Attack'] = buffactive['sneak attack'] or false
  69. state.Buff['Trick Attack'] = buffactive['trick attack'] or false
  70. state.Buff['Feint'] = buffactive['feint'] or false
  71.  
  72. no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)",
  73. "Trizek Ring", "Echad Ring", "Facility Ring", "Capacity Ring"}
  74.  
  75. include('Mote-TreasureHunter')
  76.  
  77. -- For th_action_check():
  78. -- JA IDs for actions that always have TH: Provoke, Animated Flourish
  79. info.default_ja_ids = S{35, 204}
  80. -- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
  81. info.default_u_ja_ids = S{201, 202, 203, 205, 207}
  82.  
  83. state.Ambush = M(false, 'Ambush')
  84. -- state.CP = M(false, "Capacity Points Mode")
  85.  
  86. lockstyleset = 2
  87. end
  88.  
  89. -------------------------------------------------------------------------------------------------------------------
  90. -- User setup functions for this job. Recommend that these be overridden in a sidecar file.
  91. -------------------------------------------------------------------------------------------------------------------
  92.  
  93. -- Setup vars that are user-dependent. Can override this function in a sidecar file.
  94. function user_setup()
  95. state.OffenseMode:options('Normal', 'LowAcc', 'MidAcc', 'HighAcc', 'STP')
  96. state.HybridMode:options('Normal', 'DT')
  97. state.RangedMode:options('Normal', 'Acc')
  98. state.WeaponskillMode:options('Normal', 'Acc', 'LowBuff')
  99. state.IdleMode:options('Normal', 'DT', 'Refresh')
  100.  
  101. -- Additional local binds
  102. --include('Global-Binds.lua') -- OK to remove this line
  103. --include('Global-GEO-Binds.lua') -- OK to remove this line
  104.  
  105. send_command('bind ^` gs c cycle treasuremode')
  106.  
  107. send_command('bind numpad5 fillmode')
  108. send_command('lua load gearinfo')
  109. --send_command('bind !` input /ja "Flee" <me>')
  110. --send_command('bind %numpad0 gs c toggle Ambush')
  111.  
  112. -- send_command('bind @c gs c toggle CP')
  113.  
  114. --send_command('bind ^numlock input /ja "Assassin\'s Charge" <me>')
  115.  
  116.  
  117.  
  118. set_lockstyle()
  119.  
  120. state.Auto_Kite = M(false, 'Auto_Kite')
  121. Haste = 0
  122. DW_needed = 0
  123. DW = false
  124. moving = false
  125. update_combat_form()
  126. determine_haste_group()
  127. end
  128.  
  129.  
  130. -- Called when this job file is unloaded (eg: job change)
  131. function user_unload()
  132. end
  133.  
  134.  
  135. -- Define sets and vars used by this job file.
  136. function init_gear_sets()
  137.  
  138. ------------------------------------------------------------------------------------------------
  139. ---------------------------------------- Precast Sets ------------------------------------------
  140. ------------------------------------------------------------------------------------------------
  141.  
  142. sets.TreasureHunter = {
  143. --head=gear.Herc_TH_head, --2
  144. --hands="Plun. Armlets +3", --4
  145. --feet="Skulk. Poulaines +1", --3
  146. --waist="Chaac Belt", --1
  147. }
  148.  
  149. sets.buff['Sneak Attack'] = {}
  150. sets.buff['Trick Attack'] = {}
  151.  
  152. -- Actions we want to use to tag TH.
  153. sets.precast.Step = sets.TreasureHunter
  154. sets.precast.Flourish1 = sets.TreasureHunter
  155. sets.precast.JA.Provoke = sets.TreasureHunter
  156.  
  157.  
  158. ------------------------------------------------------------------------------------------------
  159. ---------------------------------------- Precast Sets ------------------------------------------
  160. ------------------------------------------------------------------------------------------------
  161.  
  162. -- Precast sets to enhance JAs
  163. --[[
  164. sets.precast.JA['Accomplice'] = {head="Skulker's Bonnet +1"}
  165. sets.precast.JA['Aura Steal'] = {head="Plun. Bonnet +3"}
  166. sets.precast.JA['Collaborator'] = set_combine(sets.TreasureHunter, {head="Skulker's Bonnet +1"})
  167. sets.precast.JA['Flee'] = {feet="Pill. Poulaines +3"}
  168. sets.precast.JA['Hide'] = {body="Pillager's Vest +3"}
  169. sets.precast.JA['Conspirator'] = set_combine(sets.TreasureHunter, {body="Skulker's Vest +1"})
  170. ]]
  171. sets.precast.JA['Steal'] = {
  172. head="Rogue\'s Bonnet",
  173. }
  174. --[[
  175. sets.precast.JA['Despoil'] = {ammo="Barathrum", legs="Skulk. Culottes +1", feet="Skulk. Poulaines +1"}
  176. sets.precast.JA['Perfect Dodge'] = {hands="Plun. Armlets +3"}
  177. sets.precast.JA['Feint'] = {legs="Plun. Culottes +3"}
  178. --sets.precast.JA['Sneak Attack'] = sets.buff['Sneak Attack']
  179. --sets.precast.JA['Trick Attack'] = sets.buff['Trick Attack']
  180. ]]
  181. sets.precast.Waltz = {
  182. head="Mummu bonnet +2",
  183. body="Mummu Jacket +2",
  184. hands="Mummu Wrists +2",
  185. legs="SV Loincloth +1",
  186. feet="Meg. Jam. +2",
  187. ring1="Meghanada Ring",
  188. ring2="Mummu Ring",
  189. waist="Corsette",
  190. }
  191.  
  192. sets.precast.Waltz['Healing Waltz'] = {}
  193.  
  194. sets.precast.FC = {
  195. --[[
  196. ammo="Sapience Orb",
  197. head=gear.Herc_MAB_head, --7
  198. body=gear.Taeon_FC_body, --9
  199. hands="Leyline Gloves", --8
  200. legs="Rawhide Trousers", --5
  201. feet=gear.Herc_MAB_feet, --2
  202. neck="Orunmila's Torque", --5
  203. ear1="Loquacious Earring", --2
  204. ear2="Enchntr. Earring +1", --2
  205. ring2="Weather. Ring +1", --6(4)
  206. ]]
  207. }
  208.  
  209. sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {
  210. --[[
  211. body="Passion Jacket",
  212. ring1="Lebeche Ring",
  213. ]]
  214. })
  215.  
  216. ------------------------------------------------------------------------------------------------
  217. ------------------------------------- Weapon Skill Sets ----------------------------------------
  218. ------------------------------------------------------------------------------------------------
  219.  
  220. sets.precast.WS = {
  221. head="Meghanada Visor +1",
  222. body="Meg. Cuirie +2",
  223. hands="SV Gauntlets +1",
  224. legs="Meg. Chausses +2",
  225. feet="Meg. Jam. +2",
  226. neck="Asperity Necklace",
  227. ear1="Ishvara Earring",
  228. ear2="Grit Earring",
  229. ring1="Dagaz Ring",
  230. ring2="Meghanada Ring",
  231. back="Bleating Mantle",
  232. waist="Sailfi Belt +1",
  233. } -- default set
  234.  
  235. sets.precast.WS.Acc = set_combine(sets.precast.WS, {
  236. --[[
  237. ammo="Voluspa Tathlum",
  238. ear2="Telos Earring",
  239. ]]
  240. })
  241.  
  242. sets.precast.WS.Critical = {
  243. body="Meg. Cuirie +2",
  244. --[[
  245. ammo="Yetshila +1",
  246. head="Pill. Bonnet +3",
  247. ]]
  248. }
  249.  
  250. sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {
  251. --[[
  252. head="Plun. Bonnet +3",
  253. body=gear.Adhemar_B_body,
  254. legs="Meg. Chausses +2",
  255. feet="Meg. Jam. +2",
  256. ear1="Sherida Earring",
  257. ear2="Skulk. Earring +1",
  258. ring2="Ilabrat Ring",
  259. ]]
  260. })
  261.  
  262. sets.precast.WS['Exenterator'].Acc = set_combine(sets.precast.WS['Exenterator'], {
  263. --[[
  264. head="Dampening Tam",
  265. ]]
  266. })
  267.  
  268. sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
  269. body="Meg. Cuirie +2",
  270. hands="Mummu Wrists +2",
  271. legs="SV Loincloth +1",
  272. feet="Meg. Jam. +2",
  273. neck="Asperity Necklace",
  274. ear1="Ishvara Earring",
  275. ear2="Grit Earring",
  276. ring1="Dagaz Ring",
  277. ring2="Meghanada Ring",
  278. back="Bleating Mantle",
  279. waist="Sailfi Belt +1",
  280. --[[
  281. ammo="Yetshila +1",
  282. head="Blistering Sallet +1",
  283. body="Pillager's Vest +3",
  284. hands=gear.Adhemar_B_hands,
  285. legs="Zoar Subligar +1",
  286. feet=gear.Adhemar_B_feet,
  287. ear1="Odr Earring",
  288. ring1="Regal Ring",
  289. ring2="Begrudging Ring",
  290. back=gear.THF_WS2_Cape,
  291. ]]
  292. })
  293.  
  294. sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {
  295. --[[
  296. ammo="Voluspa Tathlum",
  297. legs="Pill. Culottes +3",
  298. ]]
  299. })
  300.  
  301. sets.precast.WS['Rudra\'s Storm'] = set_combine(sets.precast.WS, {
  302. --[[
  303. ammo="Aurgelmir Orb +1",
  304. neck="Asn. Gorget +2",
  305. ear1="Sherida Earring",
  306. waist="Kentarch Belt +1",
  307. ]]
  308. })
  309.  
  310. sets.precast.WS['Rudra\'s Storm'].Acc = set_combine(sets.precast.WS['Rudra\'s Storm'], {
  311. --[[
  312. ammo="Voluspa Tathlum",
  313. ear2="Telos Earring",
  314. waist="Grunfeld Rope",
  315. ]]
  316. })
  317.  
  318. sets.precast.WS['Mandalic Stab'] = sets.precast.WS["Rudra's Storm"]
  319. sets.precast.WS['Mandalic Stab'].Acc = sets.precast.WS["Rudra's Storm"].Acc
  320.  
  321. sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS, {
  322. --[[
  323. ammo="Ghastly Tathlum +1",
  324. head="Nyame Helm",
  325. body="Nyame Mail",
  326. hands="Nyame Gauntlets",
  327. legs="Nyame Flanchard",
  328. feet="Nyame Sollerets",
  329. neck="Baetyl Pendant",
  330. ear1="Friomisi Earring",
  331. ring1="Epaminondas's Ring",
  332. ring2="Cornelia's Ring",
  333. back="Argocham. Mantle",
  334. waist="Orpheus's Sash",
  335. ]]
  336. })
  337.  
  338. sets.precast.WS['Asuran Fists'] = set_combine(sets.precast.WS['Exenterator'], {
  339. --[[
  340. hands=gear.Adhemar_B_hands,
  341. feet="Plun. Poulaines +3",
  342. ring2="Gere Ring"
  343. ]]
  344. })
  345.  
  346. ------------------------------------------------------------------------------------------------
  347. ---------------------------------------- Midcast Sets ------------------------------------------
  348. ------------------------------------------------------------------------------------------------
  349.  
  350. sets.midcast.FastRecast = sets.precast.FC
  351.  
  352. sets.midcast.SpellInterrupt = {
  353. --[[
  354. ammo="Staunch Tathlum +1", --11
  355. body=gear.Taeon_Phalanx_body, --10
  356. hands="Rawhide Gloves", --15
  357. legs=gear.Taeon_Phalanx_legs, --10
  358. feet=gear.Taeon_Phalanx_feet, --10
  359. neck="Loricate Torque +1", --5
  360. ear1="Halasz Earring", --5
  361. ear2="Magnetic Earring", --8
  362. ring2="Evanescence Ring", --5
  363. ]]
  364. }
  365.  
  366. sets.midcast.Utsusemi = sets.midcast.SpellInterrupt
  367.  
  368.  
  369. ------------------------------------------------------------------------------------------------
  370. ----------------------------------------- Idle Sets --------------------------------------------
  371. ------------------------------------------------------------------------------------------------
  372.  
  373. sets.resting = {}
  374.  
  375. sets.idle = {
  376. head="Meghanada Visor +1",
  377. body="Meg. Cuirie +2",
  378. hands="Meghanada Gloves",
  379. legs="Meg. Chausses +2",
  380. feet="Jute Boots +1",
  381. neck="Asperity Necklace",
  382. ear1="Suppanomimi",
  383. ear2="Eabani Earring",
  384. ring1="Meghanada Ring",
  385. ring2="Jubilee Ring",
  386. back="Invisible Mantle",
  387. waist="Cetl Belt",
  388. }
  389.  
  390. sets.idle.DT = set_combine(sets.idle, {
  391. head="Meghanada Visor +1",
  392. body="SV Separates +1",
  393. hands="SV Gauntlets +1",
  394. legs="SV Loincloth +1",
  395. feet="SV Gaiters +1",
  396. ring1="Meghanada Ring",
  397. ring2="Jubilee Ring",
  398. ear1="Suppanomimi",
  399. ear2="Eabani Earring",
  400. back="Invisible Mantle",
  401. waist="Cetl Belt",
  402. })
  403.  
  404. sets.idle.Refresh = set_combine(sets.idle, {
  405. --[[
  406. ring1={name="Stikini Ring +1", bag="wardrobe5"},
  407. ring2={name="Stikini Ring +1", bag="wardrobe6"},
  408. ]]
  409. })
  410.  
  411.  
  412. sets.idle.Town = set_combine(sets.idle, {
  413. ring1="Warp Ring",
  414. })
  415.  
  416. ------------------------------------------------------------------------------------------------
  417. ---------------------------------------- Defense Sets ------------------------------------------
  418. ------------------------------------------------------------------------------------------------
  419.  
  420. sets.defense.PDT = sets.idle.DT
  421. sets.defense.MDT = sets.idle.DT
  422.  
  423. sets.Kiting = {feet="Jute Boots +1"}
  424.  
  425.  
  426. ------------------------------------------------------------------------------------------------
  427. ---------------------------------------- Engaged Sets ------------------------------------------
  428. ------------------------------------------------------------------------------------------------
  429.  
  430. -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
  431. -- sets if more refined versions aren't defined.
  432. -- If you create a set with both offense and defense modes, the offense mode should be first.
  433. -- EG: sets.engaged.Dagger.Accuracy.Evasion
  434.  
  435. sets.engaged = {
  436. head="Meghanada Visor +1",
  437. body="Meg. Cuirie +2",
  438. hands="SV Gauntlets +1",
  439. legs="Meg. Chausses +2",
  440. feet="SV Gaiters +1",
  441. neck="Asperity Necklace",
  442. ear1="Mache Earring",
  443. ear2="Grit Earring",
  444. ring1="Mouflon Ring",
  445. ring2="Meghanada Ring",
  446. back="Bleating Mantle",
  447. waist="Sailfi belt +1"
  448. }
  449.  
  450. sets.engaged.LowAcc = set_combine(sets.engaged, {
  451.  
  452. })
  453.  
  454. sets.engaged.MidAcc = set_combine(sets.engaged.LowAcc, {
  455.  
  456. })
  457.  
  458. sets.engaged.HighAcc = set_combine(sets.engaged.MidAcc, {
  459.  
  460. })
  461.  
  462. sets.engaged.STP = set_combine(sets.engaged, {
  463.  
  464. })
  465.  
  466. -- * THF Native DW Trait: 25% DW
  467. -- * THF Job Points DW Gift: 5% DW
  468.  
  469. -- No Magic Haste (74% DW to cap)
  470. sets.engaged.DW = { --3 Boomerang
  471. waist="Sailfi belt +1",
  472. head="Meghanada Visor +1",
  473. body="Meg. Cuirie +2",
  474. hands="SV Gauntlets +1",
  475. legs="Meg. Chausses +2",
  476. feet="SV Gaiters +1",
  477. neck="Asperity Necklace",
  478. ear1="Suppanomimi", --5
  479. ear2="Eabani Earring", --4
  480. ring1="Mouflon Ring",
  481. ring2="Meghanada Ring",
  482. back="Bleating Mantle"
  483. } -- 15%
  484.  
  485. sets.engaged.DW.LowAcc = set_combine(sets.engaged.DW, {
  486.  
  487. })
  488.  
  489. sets.engaged.DW.MidAcc = set_combine(sets.engaged.DW.LowAcc, {
  490.  
  491. })
  492.  
  493. sets.engaged.DW.HighAcc = set_combine(sets.engaged.DW.MidAcc, {
  494.  
  495. })
  496.  
  497. sets.engaged.DW.STP = set_combine(sets.engaged.DW, {
  498.  
  499. })
  500.  
  501. -- 15% Magic Haste (67% DW to cap)
  502. sets.engaged.DW.LowHaste = {
  503.  
  504. }
  505.  
  506. sets.engaged.DW.LowAcc.LowHaste = set_combine(sets.engaged.DW.LowHaste, {
  507.  
  508. })
  509.  
  510. sets.engaged.DW.MidAcc.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, {
  511.  
  512. })
  513.  
  514. sets.engaged.DW.HighAcc.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, {
  515.  
  516. })
  517.  
  518. sets.engaged.DW.STP.LowHaste = set_combine(sets.engaged.DW.LowHaste, {
  519.  
  520. })
  521.  
  522. -- 30% Magic Haste (56% DW to cap)
  523. sets.engaged.DW.MidHaste = {
  524.  
  525. } -- 26%
  526.  
  527. sets.engaged.DW.LowAcc.MidHaste = set_combine(sets.engaged.DW.MidHaste, {
  528.  
  529. })
  530.  
  531. sets.engaged.DW.MidAcc.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, {
  532.  
  533. })
  534.  
  535. sets.engaged.DW.HighAcc.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, {
  536.  
  537. })
  538.  
  539. sets.engaged.DW.STP.MidHaste = set_combine(sets.engaged.DW.MidHaste, {
  540.  
  541. })
  542.  
  543. -- 35% Magic Haste (51% DW to cap)
  544. sets.engaged.DW.HighHaste = {
  545.  
  546. } -- 22%
  547.  
  548. sets.engaged.DW.LowAcc.HighHaste = set_combine(sets.engaged.DW.HighHaste, {
  549.  
  550. })
  551.  
  552. sets.engaged.DW.MidAcc.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, {
  553.  
  554. })
  555.  
  556. sets.engaged.DW.HighAcc.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, {
  557.  
  558. })
  559.  
  560. sets.engaged.DW.STP.HighHaste = set_combine(sets.engaged.DW.HighHaste, {
  561.  
  562. })
  563.  
  564. -- 45% Magic Haste (36% DW to cap)
  565. sets.engaged.DW.MaxHaste = {
  566.  
  567. } -- 5%
  568.  
  569. sets.engaged.DW.LowAcc.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, {
  570.  
  571. })
  572.  
  573. sets.engaged.DW.MidAcc.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, {
  574.  
  575. })
  576.  
  577. sets.engaged.DW.HighAcc.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, {
  578.  
  579. })
  580.  
  581. sets.engaged.DW.STP.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, {
  582.  
  583. })
  584.  
  585. ------------------------------------------------------------------------------------------------
  586. ---------------------------------------- Hybrid Sets -------------------------------------------
  587. ------------------------------------------------------------------------------------------------
  588.  
  589. sets.engaged.Hybrid = {
  590. body="SV Separates +1", --9/9
  591. hands="SV Gauntlets +1", --5/5
  592. legs="SV Loincloth +1", --5/5
  593. }
  594.  
  595. sets.engaged.DT = set_combine(sets.engaged, sets.engaged.Hybrid)
  596. sets.engaged.LowAcc.DT = set_combine(sets.engaged.LowAcc, sets.engaged.Hybrid)
  597. sets.engaged.MidAcc.DT = set_combine(sets.engaged.MidAcc, sets.engaged.Hybrid)
  598. sets.engaged.HighAcc.DT = set_combine(sets.engaged.HighAcc, sets.engaged.Hybrid)
  599. sets.engaged.STP.DT = set_combine(sets.engaged.STP, sets.engaged.Hybrid)
  600.  
  601. sets.engaged.DW.DT = set_combine(sets.engaged.DW, sets.engaged.Hybrid)
  602. sets.engaged.DW.LowAcc.DT = set_combine(sets.engaged.DW.LowAcc, sets.engaged.Hybrid)
  603. sets.engaged.DW.MidAcc.DT = set_combine(sets.engaged.DW.MidAcc, sets.engaged.Hybrid)
  604. sets.engaged.DW.HighAcc.DT = set_combine(sets.engaged.DW.HighAcc, sets.engaged.Hybrid)
  605. sets.engaged.DW.STP.DT = set_combine(sets.engaged.DW.STP, sets.engaged.Hybrid)
  606.  
  607. sets.engaged.DW.DT.LowHaste = set_combine(sets.engaged.DW.LowHaste, sets.engaged.Hybrid)
  608. sets.engaged.DW.LowAcc.DT.LowHaste = set_combine(sets.engaged.DW.LowAcc.LowHaste, sets.engaged.Hybrid)
  609. sets.engaged.DW.MidAcc.DT.LowHaste = set_combine(sets.engaged.DW.MidAcc.LowHaste, sets.engaged.Hybrid)
  610. sets.engaged.DW.HighAcc.DT.LowHaste = set_combine(sets.engaged.DW.HighAcc.LowHaste, sets.engaged.Hybrid)
  611. sets.engaged.DW.STP.DT.LowHaste = set_combine(sets.engaged.DW.STP.LowHaste, sets.engaged.Hybrid)
  612.  
  613. sets.engaged.DW.DT.MidHaste = set_combine(sets.engaged.DW.MidHaste, sets.engaged.Hybrid)
  614. sets.engaged.DW.LowAcc.DT.MidHaste = set_combine(sets.engaged.DW.LowAcc.MidHaste, sets.engaged.Hybrid)
  615. sets.engaged.DW.MidAcc.DT.MidHaste = set_combine(sets.engaged.DW.MidAcc.MidHaste, sets.engaged.Hybrid)
  616. sets.engaged.DW.HighAcc.DT.MidHaste = set_combine(sets.engaged.DW.HighAcc.MidHaste, sets.engaged.Hybrid)
  617. sets.engaged.DW.STP.DT.MidHaste = set_combine(sets.engaged.DW.STP.MidHaste, sets.engaged.Hybrid)
  618.  
  619. sets.engaged.DW.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste, sets.engaged.Hybrid)
  620. sets.engaged.DW.LowAcc.DT.HighHaste = set_combine(sets.engaged.DW.LowAcc.HighHaste, sets.engaged.Hybrid)
  621. sets.engaged.DW.MidAcc.DT.HighHaste = set_combine(sets.engaged.DW.MidAcc.HighHaste, sets.engaged.Hybrid)
  622. sets.engaged.DW.HighAcc.DT.HighHaste = set_combine(sets.engaged.DW.HighAcc.HighHaste, sets.engaged.Hybrid)
  623. sets.engaged.DW.STP.DT.HighHaste = set_combine(sets.engaged.DW.HighHaste.STP, sets.engaged.Hybrid)
  624.  
  625. sets.engaged.DW.DT.MaxHaste = set_combine(sets.engaged.DW.MaxHaste, sets.engaged.Hybrid)
  626. sets.engaged.DW.LowAcc.DT.MaxHaste = set_combine(sets.engaged.DW.LowAcc.MaxHaste, sets.engaged.Hybrid)
  627. sets.engaged.DW.MidAcc.DT.MaxHaste = set_combine(sets.engaged.DW.MidAcc.MaxHaste, sets.engaged.Hybrid)
  628. sets.engaged.DW.HighAcc.DT.MaxHaste = set_combine(sets.engaged.DW.HighAcc.MaxHaste, sets.engaged.Hybrid)
  629. sets.engaged.DW.STP.DT.MaxHaste = set_combine(sets.engaged.DW.STP.MaxHaste, sets.engaged.Hybrid)
  630.  
  631.  
  632. ------------------------------------------------------------------------------------------------
  633. ---------------------------------------- Special Sets ------------------------------------------
  634. ------------------------------------------------------------------------------------------------
  635.  
  636. sets.buff['Ambush'] = {
  637. --body="Plunderer's Vest +3"
  638. }
  639.  
  640. sets.buff.Doom = {
  641.  
  642. }
  643.  
  644. --sets.Reive = {neck="Ygnas's Resolve +1"}
  645. -- sets.CP = {back="Mecisto. Mantle"}
  646.  
  647. end
  648.  
  649.  
  650. -------------------------------------------------------------------------------------------------------------------
  651. -- Job-specific hooks for standard casting events.
  652. -------------------------------------------------------------------------------------------------------------------
  653.  
  654. -- Run after the general precast() is done.
  655. function job_post_precast(spell, action, spellMap, eventArgs)
  656. if spellMap == 'Utsusemi' then
  657. if buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)'] then
  658. cancel_spell()
  659. add_to_chat(123, '**!! '..spell.english..' Canceled: [3+ IMAGES] !!**')
  660. eventArgs.handled = true
  661. return
  662. elseif buffactive['Copy Image'] or buffactive['Copy Image (2)'] then
  663. send_command('cancel 66; cancel 444; cancel Copy Image; cancel Copy Image (2)')
  664. end
  665. end
  666. if spell.english=='Sneak Attack' or spell.english=='Trick Attack' then
  667. if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
  668. equip(sets.TreasureHunter)
  669. end
  670. end
  671. if spell.type == "WeaponSkill" then
  672. if state.Buff['Sneak Attack'] == true or state.Buff['Trick Attack'] == true then
  673. equip(sets.precast.WS.Critical)
  674. end
  675. end
  676. --[[
  677. if spell.type == 'WeaponSkill' then
  678. if spell.english == 'Aeolian Edge' then
  679. -- Matching double weather (w/o day conflict).
  680. if spell.element == world.weather_element and (get_weather_intensity() == 2 and spell.element ~= elements.weak_to[world.day_element]) then
  681. equip({waist="Hachirin-no-Obi"})
  682. end
  683. end
  684. end
  685. ]]
  686. end
  687.  
  688. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  689. function job_aftercast(spell, action, spellMap, eventArgs)
  690. -- Weaponskills wipe SATA/Feint. Turn those state vars off before default gearing is attempted.
  691. if spell.type == 'WeaponSkill' and not spell.interrupted then
  692. state.Buff['Sneak Attack'] = false
  693. state.Buff['Trick Attack'] = false
  694. state.Buff['Feint'] = false
  695. end
  696. end
  697.  
  698. -- Called after the default aftercast handling is complete.
  699. function job_post_aftercast(spell, action, spellMap, eventArgs)
  700. -- If Feint is active, put that gear set on on top of regular gear.
  701. -- This includes overlaying SATA gear.
  702. check_buff('Feint', eventArgs)
  703. end
  704.  
  705. -------------------------------------------------------------------------------------------------------------------
  706. -- Job-specific hooks for non-casting events.
  707. -------------------------------------------------------------------------------------------------------------------
  708.  
  709. -- Called when a player gains or loses a buff.
  710. -- buff == buff gained or lost
  711. -- gain == true if the buff was gained, false if it was lost.
  712. function job_buff_change(buff,gain)
  713.  
  714. if buffactive['Reive Mark'] then
  715. if gain then
  716. equip(sets.Reive)
  717. --disable('neck')
  718. else
  719. enable('neck')
  720. end
  721. end
  722. if buff == "doom" then
  723. if gain then
  724. equip(sets.buff.Doom)
  725. send_command('@input /echo Doomed!')
  726. --disable('ring1','ring2','waist')
  727. else
  728. enable('ring1','ring2','waist')
  729. handle_equipping_gear(player.status)
  730. end
  731. end
  732. if not midaction() then
  733. handle_equipping_gear(player.status)
  734. end
  735. end
  736.  
  737.  
  738. -------------------------------------------------------------------------------------------------------------------
  739. -- User code that supplements standard library decisions.
  740. -------------------------------------------------------------------------------------------------------------------
  741.  
  742. -- Called by the 'update' self-command, for common needs.
  743. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  744. function job_handle_equipping_gear(playerStatus, eventArgs)
  745. check_gear()
  746. update_combat_form()
  747. determine_haste_group()
  748. check_moving()
  749.  
  750. -- Check for SATA when equipping gear. If either is active, equip
  751. -- that gear specifically, and block equipping default gear.
  752. check_buff('Sneak Attack', eventArgs)
  753. check_buff('Trick Attack', eventArgs)
  754. end
  755.  
  756. function job_update(cmdParams, eventArgs)
  757. handle_equipping_gear(player.status)
  758. th_update(cmdParams, eventArgs)
  759. end
  760.  
  761. function update_combat_form()
  762. if DW == true then
  763. state.CombatForm:set('DW')
  764. elseif DW == false then
  765. state.CombatForm:reset()
  766. end
  767. end
  768.  
  769. function get_custom_wsmode(spell, action, spellMap)
  770. local wsmode
  771. if state.OffenseMode.value == 'MidAcc' or state.OffenseMode.value == 'HighAcc' then
  772. wsmode = 'Acc'
  773. end
  774.  
  775. --if state.Buff['Sneak Attack'] then
  776. -- wsmode = 'SA'
  777. --end
  778. --if state.Buff['Trick Attack'] then
  779. -- wsmode = (wsmode or '') .. 'TA'
  780. --end
  781.  
  782. return wsmode
  783. end
  784.  
  785. function customize_idle_set(idleSet)
  786. -- if state.CP.current == 'on' then
  787. -- equip(sets.CP)
  788. -- disable('back')
  789. -- else
  790. -- enable('back')
  791. -- end
  792. if state.Auto_Kite.value == true then
  793. idleSet = set_combine(idleSet, sets.Kiting)
  794. end
  795.  
  796. return idleSet
  797. end
  798.  
  799. function customize_melee_set(meleeSet)
  800. if state.Ambush.value == true then
  801. meleeSet = set_combine(meleeSet, sets.buff['Ambush'])
  802. end
  803. if state.TreasureMode.value == 'Fulltime' then
  804. meleeSet = set_combine(meleeSet, sets.TreasureHunter)
  805. end
  806.  
  807. return meleeSet
  808. end
  809.  
  810. -- Function to display the current relevant user state when doing an update.
  811. -- Return true if display was handled, and you don't want the default info shown.
  812. function display_current_job_state(eventArgs)
  813. local cf_msg = ''
  814. if state.CombatForm.has_value then
  815. cf_msg = ' (' ..state.CombatForm.value.. ')'
  816. end
  817.  
  818. local m_msg = state.OffenseMode.value
  819. if state.HybridMode.value ~= 'Normal' then
  820. m_msg = m_msg .. '/' ..state.HybridMode.value
  821. end
  822.  
  823. local ws_msg = state.WeaponskillMode.value
  824.  
  825. local d_msg = 'None'
  826. if state.DefenseMode.value ~= 'None' then
  827. d_msg = state.DefenseMode.value .. state[state.DefenseMode.value .. 'DefenseMode'].value
  828. end
  829.  
  830. local i_msg = state.IdleMode.value
  831.  
  832. local msg = ''
  833. if state.TreasureMode.value ~= 'None' then
  834. msg = msg .. ' TH: ' ..state.TreasureMode.value.. ' |'
  835. end
  836. if state.Kiting.value then
  837. msg = msg .. ' Kiting: On |'
  838. end
  839.  
  840. add_to_chat(002, '| ' ..string.char(31,210).. 'Melee' ..cf_msg.. ': ' ..string.char(31,001)..m_msg.. string.char(31,002).. ' |'
  841. ..string.char(31,207).. ' WS: ' ..string.char(31,001)..ws_msg.. string.char(31,002).. ' |'
  842. ..string.char(31,004).. ' Defense: ' ..string.char(31,001)..d_msg.. string.char(31,002).. ' |'
  843. ..string.char(31,008).. ' Idle: ' ..string.char(31,001)..i_msg.. string.char(31,002).. ' |'
  844. ..string.char(31,002)..msg)
  845.  
  846. eventArgs.handled = true
  847. end
  848.  
  849.  
  850. -------------------------------------------------------------------------------------------------------------------
  851. -- Utility functions specific to this job.
  852. -------------------------------------------------------------------------------------------------------------------
  853.  
  854. function determine_haste_group()
  855. classes.CustomMeleeGroups:clear()
  856. if DW == true then
  857. if DW_needed <= 6 then
  858. classes.CustomMeleeGroups:append('MaxHaste')
  859. elseif DW_needed > 6 and DW_needed <= 22 then
  860. classes.CustomMeleeGroups:append('HighHaste')
  861. elseif DW_needed > 22 and DW_needed <= 26 then
  862. classes.CustomMeleeGroups:append('MidHaste')
  863. elseif DW_needed > 26 and DW_needed <= 37 then
  864. classes.CustomMeleeGroups:append('LowHaste')
  865. elseif DW_needed > 37 then
  866. classes.CustomMeleeGroups:append('')
  867. end
  868. end
  869. end
  870.  
  871. function job_self_command(cmdParams, eventArgs)
  872. gearinfo(cmdParams, eventArgs)
  873. end
  874.  
  875. function gearinfo(cmdParams, eventArgs)
  876. if cmdParams[1] == 'gearinfo' then
  877. if type(tonumber(cmdParams[2])) == 'number' then
  878. if tonumber(cmdParams[2]) ~= DW_needed then
  879. DW_needed = tonumber(cmdParams[2])
  880. DW = true
  881. end
  882. elseif type(cmdParams[2]) == 'string' then
  883. if cmdParams[2] == 'false' then
  884. DW_needed = 0
  885. DW = false
  886. end
  887. end
  888. if type(tonumber(cmdParams[3])) == 'number' then
  889. if tonumber(cmdParams[3]) ~= Haste then
  890. Haste = tonumber(cmdParams[3])
  891. end
  892. end
  893. if type(cmdParams[4]) == 'string' then
  894. if cmdParams[4] == 'true' then
  895. moving = true
  896. elseif cmdParams[4] == 'false' then
  897. moving = false
  898. end
  899. end
  900. if not midaction() then
  901. job_update()
  902. end
  903. end
  904. end
  905.  
  906.  
  907. -- Automatically use Presto for steps when it's available and we have less than 3 finishing moves
  908. --[[
  909. function job_pretarget(spell, action, spellMap, eventArgs)
  910. if spell.type == 'Step' then
  911. local allRecasts = windower.ffxi.get_ability_recasts()
  912. local prestoCooldown = allRecasts[236]
  913. local under3FMs = not buffactive['Finishing Move 3'] and not buffactive['Finishing Move 4'] and not buffactive['Finishing Move 5']
  914.  
  915. if player.main_job_level >= 77 and prestoCooldown < 1 and under3FMs then
  916. cast_delay(1.1)
  917. send_command('input /ja "Presto" <me>')
  918. end
  919. end
  920. end
  921. ]]
  922.  
  923. -- State buff checks that will equip buff gear and mark the event as handled.
  924. function check_buff(buff_name, eventArgs)
  925. if state.Buff[buff_name] then
  926. equip(sets.buff[buff_name] or {})
  927. if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
  928. equip(sets.TreasureHunter)
  929. end
  930. eventArgs.handled = true
  931. end
  932. end
  933.  
  934.  
  935. -- Check for various actions that we've specified in user code as being used with TH gear.
  936. -- This will only ever be called if TreasureMode is not 'None'.
  937. -- Category and Param are as specified in the action event packet.
  938. function th_action_check(category, param)
  939. if category == 2 or -- any ranged attack
  940. --category == 4 or -- any magic action
  941. (category == 3 and param == 30) or -- Aeolian Edge
  942. (category == 6 and info.default_ja_ids:contains(param)) or -- Provoke, Animated Flourish
  943. (category == 14 and info.default_u_ja_ids:contains(param)) -- Quick/Box/Stutter Step, Desperate/Violent Flourish
  944. then return true
  945. end
  946. end
  947.  
  948. function check_moving()
  949. if state.DefenseMode.value == 'None' and state.Kiting.value == false then
  950. if state.Auto_Kite.value == false and moving then
  951. state.Auto_Kite:set(true)
  952. elseif state.Auto_Kite.value == true and moving == false then
  953. state.Auto_Kite:set(false)
  954. end
  955. end
  956. end
  957.  
  958. function check_gear()
  959. if no_swap_gear:contains(player.equipment.left_ring) then
  960. disable("ring1")
  961. else
  962. enable("ring1")
  963. end
  964. if no_swap_gear:contains(player.equipment.right_ring) then
  965. disable("ring2")
  966. else
  967. enable("ring2")
  968. end
  969. end
  970.  
  971. windower.register_event('zone change',
  972. function()
  973. if no_swap_gear:contains(player.equipment.left_ring) then
  974. enable("ring1")
  975. equip(sets.idle)
  976. end
  977. if no_swap_gear:contains(player.equipment.right_ring) then
  978. enable("ring2")
  979. equip(sets.idle)
  980. end
  981. end
  982. )
  983.  
  984. -- Select default macro book on initial load or subjob change.
  985. function select_default_macro_book()
  986. -- Default macro set/book
  987. if player.sub_job == 'DNC' then
  988. set_macro_page(1, 1)
  989. elseif player.sub_job == 'WAR' then
  990. set_macro_page(2, 1)
  991. elseif player.sub_job == 'NIN' then
  992. set_macro_page(3, 1)
  993. else
  994. set_macro_page(1, 1)
  995. end
  996. end
  997.  
  998. function set_lockstyle()
  999. send_command('wait 2; input /lockstyleset 2' .. lockstyleset)
  1000. end
  1001.  
Advertisement
Add Comment
Please, Sign In to add comment