Advertisement
bongarippa

SalTHF

Nov 16th, 2023
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.13 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Setup functions for this job. Generally should not be modified.
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. --[[
  6. Custom commands:
  7. gs c cycle treasuremode (set on ctrl-= by default): Cycles through the available treasure hunter modes.
  8.  
  9. Treasure hunter modes:
  10. None - Will never equip TH gear
  11. Tag - Will equip TH gear sufficient for initial contact with a mob (either melee, ranged hit, or Aeolian Edge AOE)
  12. SATA - Will equip TH gear sufficient for initial contact with a mob, and when using SATA
  13. Fulltime - Will keep TH gear equipped fulltime
  14. --]]
  15.  
  16. -- Initialization function for this job file.
  17. function get_sets()
  18. include('organizer-lib')
  19. mote_include_version = 2
  20.  
  21. -- Load and initialize the include file.
  22. include('Mote-Include.lua')
  23. end
  24.  
  25. -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
  26. function job_setup()
  27. state.Buff['Sneak Attack'] = buffactive['sneak attack'] or false
  28. state.Buff['Trick Attack'] = buffactive['trick attack'] or false
  29. state.Buff['Feint'] = buffactive['feint'] or false
  30.  
  31. include('Mote-TreasureHunter')
  32.  
  33. -- For th_action_check():
  34. -- JA IDs for actions that always have TH: Provoke, Animated Flourish
  35. info.default_ja_ids = S{35, 204}
  36. -- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
  37. info.default_u_ja_ids = S{201, 202, 203, 205, 207}
  38. end
  39.  
  40. -------------------------------------------------------------------------------------------------------------------
  41. -- User setup functions for this job. Recommend that these be overridden in a sidecar file.
  42. -------------------------------------------------------------------------------------------------------------------
  43.  
  44. -- Setup vars that are user-dependent. Can override this function in a sidecar file.
  45. function user_setup()
  46. state.OffenseMode:options('Normal', 'Acc', 'High Acc', 'Mod')
  47. state.HybridMode:options('Normal', 'Evasion', 'PDT')
  48. state.RangedMode:options('Normal', 'Acc')
  49. state.WeaponskillMode:options('Normal', 'Acc', 'Mod')
  50. state.PhysicalDefenseMode:options('Evasion', 'PDT')
  51.  
  52.  
  53.  
  54. -- Additional local binds
  55. send_command('bind ^` input /ja "Flee" <me>')
  56. send_command('bind ^= gs c cycle treasuremode')
  57. send_command('bind !- gs c cycle targetmode')
  58.  
  59. select_default_macro_book()
  60. end
  61.  
  62. -- Called when this job file is unloaded (eg: job change)
  63. function user_unload()
  64. send_command('unbind ^`')
  65. send_command('unbind !-')
  66. end
  67.  
  68. -- Define sets and vars used by this job file.
  69. function init_gear_sets()
  70. --------------------------------------
  71. -- Special sets (required by rules)
  72. --------------------------------------
  73.  
  74. sets.TreasureHunter = {hands={ name="Plun. Armlets +1", augments={'Enhances "Perfect Dodge" effect',}},
  75. feet="Skulk. Poulaines +1",
  76. waist="Chaac Belt"}
  77. sets.ExtraRegen = {}
  78. sets.Kiting = {feet="Jute Boots +1"}
  79.  
  80. sets.AE = {}
  81.  
  82. sets.buff['Sneak Attack'] = {}
  83.  
  84. sets.buff['Trick Attack'] = {}
  85.  
  86. -- Actions we want to use to tag TH.
  87. sets.precast.Step = sets.TreasureHunter
  88. sets.precast.Flourish1 = sets.TreasureHunter
  89. sets.precast.JA.Provoke = sets.TreasureHunter
  90.  
  91.  
  92. --------------------------------------
  93. -- Precast sets
  94. --------------------------------------
  95.  
  96. -- Precast sets to enhance JAs
  97. sets.precast.JA['Collaborator'] = {head="Raider's Bonnet +2"}
  98. sets.precast.JA['Accomplice'] = {head="Raider's Bonnet +2"}
  99. sets.precast.JA['Flee'] = {feet="Rogue's Poulaines"}
  100. sets.precast.JA['Hide'] = {body="Pillager's Vest +1"}
  101. sets.precast.JA['Conspirator'] = {} -- {body="Raider's Vest +2"}
  102. sets.precast.JA['Steal'] = {hands="Pillager's Armlets"}
  103. sets.precast.JA['Despoil'] = {legs="Raider's Culottes +2",feet="Raider's Poulaines +2"}
  104. sets.precast.JA['Perfect Dodge'] = {hands="Plun. Armlets +1"}
  105. sets.precast.JA['Feint'] = {} -- {legs="Assassin's Culottes +2"}
  106.  
  107. sets.precast.JA['Sneak Attack'] = sets.buff['Sneak Attack']
  108. sets.precast.JA['Trick Attack'] = sets.buff['Trick Attack']
  109.  
  110.  
  111. -- Waltz set (chr and vit)
  112. sets.precast.Waltz = {}
  113.  
  114. -- Don't need any special gear for Healing Waltz.
  115. sets.precast.Waltz['Healing Waltz'] = {}
  116.  
  117.  
  118. -- Fast cast sets for spells
  119. sets.precast.FC = {
  120. }
  121.  
  122. sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads"})
  123.  
  124.  
  125. -- Ranged snapshot gear
  126. sets.precast.RA = {}
  127.  
  128.  
  129. -- Weaponskill sets
  130.  
  131. -- Default set for any weaponskill that isn't any more specifically defined
  132. sets.precast.WS = {ammo="Yetshila",
  133. head="Pill. Bonnet +3",
  134. body="Abnoba Kaftan",
  135. hands="Meg. Gloves +2",
  136. legs={ name="Lustr. Subligar +1", augments={'Accuracy+20','DEX+8','Crit. hit rate+3%',}},
  137. feet={ name="Herculean Boots", augments={'Attack+27','Weapon skill damage +4%',}},
  138. neck="Caro Necklace",
  139. waist="Fotia Belt",
  140. left_ear={ name="Moonshade Earring", augments={'Attack+4','TP Bonus +250',}},
  141. right_ear="Sherida Earring",
  142. left_ring="Ilabrat Ring",
  143. right_ring="Regal Ring",
  144. back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','Weapon skill damage +10%',}}
  145. }
  146. sets.precast.WS.Acc = set_combine(sets.precast.WS,{})
  147.  
  148. -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
  149. sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {})
  150. sets.precast.WS['Exenterator'].Acc = set_combine(sets.precast.WS['Exenterator'], {})
  151. sets.precast.WS['Exenterator'].Mod = set_combine(sets.precast.WS['Exenterator'], {})
  152. sets.precast.WS['Exenterator'].SA = set_combine(sets.precast.WS['Exenterator'], {})
  153. sets.precast.WS['Exenterator'].TA = set_combine(sets.precast.WS['Exenterator'].SA, {})
  154. sets.precast.WS['Exenterator'].SATA = set_combine(sets.precast.WS['Exenterator'].SA, {})
  155.  
  156. sets.precast.WS['Dancing Edge'] = set_combine(sets.precast.WS, {})
  157. sets.precast.WS['Dancing Edge'].Acc = set_combine(sets.precast.WS['Dancing Edge'], {})
  158. sets.precast.WS['Dancing Edge'].Mod = set_combine(sets.precast.WS['Dancing Edge'], {})
  159. sets.precast.WS['Dancing Edge'].SA = set_combine(sets.precast.WS['Dancing Edge'], {})
  160. sets.precast.WS['Dancing Edge'].TA = set_combine(sets.precast.WS['Dancing Edge'].SA, {})
  161. sets.precast.WS['Dancing Edge'].SATA = set_combine(sets.precast.WS['Dancing Edge'].SA, {})
  162.  
  163. sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {})
  164. sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {})
  165. sets.precast.WS['Evisceration'].Mod = set_combine(sets.precast.WS['Evisceration'], {})
  166. sets.precast.WS['Evisceration'].SA = set_combine(sets.precast.WS['Evisceration'], {})
  167. sets.precast.WS['Evisceration'].TA = set_combine(sets.precast.WS['Evisceration'].SA, {})
  168. sets.precast.WS['Evisceration'].SATA = set_combine(sets.precast.WS['Evisceration'].SA, {})
  169.  
  170. sets.precast.WS["Rudra's Storm"] = set_combine(sets.precast.WS, {})
  171. sets.precast.WS["Rudra's Storm"].Acc = set_combine(sets.precast.WS["Rudra's Storm"], {})
  172. sets.precast.WS["Rudra's Storm"].Mod = set_combine(sets.precast.WS["Rudra's Storm"], {})
  173. sets.precast.WS["Rudra's Storm"].SA = set_combine(sets.precast.WS["Rudra's Storm"], {})
  174. sets.precast.WS["Rudra's Storm"].TA = set_combine(sets.precast.WS["Rudra's Storm"].SA, {})
  175. sets.precast.WS["Rudra's Storm"].SATA = set_combine(sets.precast.WS["Rudra's Storm"].SA, {})
  176.  
  177. sets.precast.WS["Shark Bite"] = set_combine(sets.precast.WS, {})
  178. sets.precast.WS['Shark Bite'].Acc = set_combine(sets.precast.WS['Shark Bite'], {})
  179. sets.precast.WS['Shark Bite'].Mod = set_combine(sets.precast.WS['Shark Bite'], {})
  180. sets.precast.WS['Shark Bite'].SA = set_combine(sets.precast.WS['Shark Bite'], {})
  181. sets.precast.WS['Shark Bite'].TA = set_combine(sets.precast.WS['Shark Bite'].SA, {})
  182. sets.precast.WS['Shark Bite'].SATA = set_combine(sets.precast.WS['Shark Bite'].SA, {})
  183.  
  184. sets.precast.WS['Mandalic Stab'] = set_combine(sets.precast.WS, {ammo="C. Palug Stone"})
  185. sets.precast.WS['Mandalic Stab'].Acc = set_combine(sets.precast.WS['Mandalic Stab'], {})
  186. sets.precast.WS['Mandalic Stab'].Mod = set_combine(sets.precast.WS['Mandalic Stab'], {})
  187. sets.precast.WS['Mandalic Stab'].SA = set_combine(sets.precast.WS['Mandalic Stab'], {})
  188. sets.precast.WS['Mandalic Stab'].TA = set_combine(sets.precast.WS['Mandalic Stab'].SA, {})
  189. sets.precast.WS['Mandalic Stab'].SATA = set_combine(sets.precast.WS['Mandalic Stab'].SA, {})
  190.  
  191.  
  192. sets.precast.WS['Aeolian Edge'] = set_combine(sets.AE, {})
  193.  
  194. --sets.precast.WS['Aeolian Edge'].TH = set_combine(sets.AE, sets.TreasureHunter)--
  195.  
  196.  
  197. --------------------------------------
  198. -- Midcast sets
  199. --------------------------------------
  200.  
  201. sets.midcast.FastRecast = {}
  202.  
  203. -- Specific spells
  204. sets.midcast.Utsusemi = {}
  205.  
  206. -- Ranged gear
  207. sets.midcast.RA = {}
  208.  
  209. sets.midcast.RA.Acc = {}
  210.  
  211.  
  212. --------------------------------------
  213. -- Idle/resting/defense sets
  214. --------------------------------------
  215.  
  216. -- Resting sets
  217. sets.resting = {}
  218.  
  219.  
  220. -- Idle sets (default idle set not needed since the other three are defined, but leaving for testing purposes)
  221.  
  222. sets.idle = {ammo="Yamarang",
  223. head={ name="Adhemar Bonnet", augments={'DEX+10','AGI+10','Accuracy+15',}},
  224. body="Meg. Cuirie +2",
  225. hands="Meg. Gloves +2",
  226. legs="Meg. Chausses +2",
  227. feet="Jute Boots +1",
  228. neck="Anu Torque",
  229. waist="Reiki Yotai",
  230. left_ear="Suppanomimi",
  231. right_ear="Sherida Earring",
  232. left_ring="Defending Ring",
  233. right_ring="Moonbeam Ring",
  234. back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','"Store TP"+10','Phys. dmg. taken-10%',}},}
  235.  
  236. sets.idle.Weak = {}
  237.  
  238.  
  239. -- Defense sets
  240.  
  241. sets.defense.Evasion = set_combine(sets.engaged, {})
  242.  
  243. sets.defense.PDT = {}
  244.  
  245. sets.defense.MDT = {}
  246.  
  247.  
  248. --------------------------------------
  249. -- Melee sets
  250. --------------------------------------
  251.  
  252. -- Normal melee group
  253. sets.engaged = {ammo="Yamarang",
  254. head={ name="Adhemar Bonnet", augments={'DEX+10','AGI+10','Accuracy+15',}},
  255. body={ name="Adhemar Jacket", augments={'DEX+10','AGI+10','Accuracy+15',}},
  256. hands={ name="Herculean Gloves", augments={'Accuracy+11','"Triple Atk."+4','AGI+8','Attack+8',}},
  257. legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  258. feet={ name="Herculean Boots", augments={'Accuracy+22 Attack+22','"Triple Atk."+3',}},
  259. neck="Lissome Necklace",
  260. waist="Reiki Yotai",
  261. left_ear="Telos Earring",
  262. right_ear="Sherida Earring",
  263. left_ring="Epona's Ring",
  264. right_ring="Hetairoi Ring",
  265. back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','"Store TP"+10',}}}
  266.  
  267. sets.engaged.Acc = set_combine(sets.engaged, {})
  268.  
  269. sets.engaged.HighAcc = set_combine(sets.engaged.Acc, {})
  270.  
  271. -- Mod set for Haste 2 Only
  272. sets.engaged.Mod = set_combine(sets.engaged, {})
  273.  
  274. -- Mod set for no haste
  275. sets.engaged.Mod2 = set_combine(sets.engaged.Mod, {left_ear="Suppanomimi"})
  276.  
  277. sets.engaged.Evasion = {}
  278. sets.engaged.Acc.Evasion = {}
  279.  
  280. sets.engaged.PDT = {ammo="Yamarang",
  281. head={ name="Adhemar Bonnet", augments={'DEX+10','AGI+10','Accuracy+15',}},
  282. body="Meg. Cuirie +2",
  283. hands="Meg. Gloves +2",
  284. legs="Meg. Chausses +2",
  285. feet={ name="Herculean Boots", augments={'Accuracy+22 Attack+22','"Triple Atk."+3',}},
  286. neck="Anu Torque",
  287. waist="Reiki Yotai",
  288. left_ear="Suppanomimi",
  289. right_ear="Sherida Earring",
  290. left_ring="Defending Ring",
  291. right_ring="Moonbeam Ring",
  292. back={ name="Toutatis's Cape", augments={'DEX+20','Accuracy+20 Attack+20','"Store TP"+10','Phys. dmg. taken-10%',}},}
  293. sets.engaged.Acc.PDT = {}
  294.  
  295. end
  296.  
  297.  
  298. -------------------------------------------------------------------------------------------------------------------
  299. -- Job-specific hooks for standard casting events.
  300. -------------------------------------------------------------------------------------------------------------------
  301.  
  302. -- Run after the general precast() is done.
  303. function job_post_precast(spell, action, spellMap, eventArgs)
  304. if spell.english == 'Aeolian Edge' and state.TreasureMode.value ~= 'None' then
  305. equip(sets.TreasureHunter)
  306. elseif spell.english=='Sneak Attack' or spell.english=='Trick Attack' or spell.type == 'WeaponSkill' then
  307. if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
  308. equip(sets.TreasureHunter)
  309. end
  310. end
  311. end
  312.  
  313. -- Run after the general midcast() set is constructed.
  314. function job_post_midcast(spell, action, spellMap, eventArgs)
  315. if state.TreasureMode.value ~= 'None' and spell.action_type == 'Ranged Attack' then
  316. equip(sets.TreasureHunter)
  317. end
  318. end
  319.  
  320. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  321. function job_aftercast(spell, action, spellMap, eventArgs)
  322. -- Weaponskills wipe SATA/Feint. Turn those state vars off before default gearing is attempted.
  323. if spell.type == 'WeaponSkill' and not spell.interrupted then
  324. state.Buff['Sneak Attack'] = false
  325. state.Buff['Trick Attack'] = false
  326. state.Buff['Feint'] = false
  327. end
  328. end
  329.  
  330. -- Called after the default aftercast handling is complete.
  331. function job_post_aftercast(spell, action, spellMap, eventArgs)
  332. -- If Feint is active, put that gear set on on top of regular gear.
  333. -- This includes overlaying SATA gear.
  334. check_buff('Feint', eventArgs)
  335. end
  336.  
  337. -------------------------------------------------------------------------------------------------------------------
  338. -- Job-specific hooks for non-casting events.
  339. -------------------------------------------------------------------------------------------------------------------
  340.  
  341. -- Called when a player gains or loses a buff.
  342. -- buff == buff gained or lost
  343. -- gain == true if the buff was gained, false if it was lost.
  344. function job_buff_change(buff, gain)
  345. if state.Buff[buff] ~= nil then
  346. if not midaction() then
  347. handle_equipping_gear(player.status)
  348. end
  349. end
  350. end
  351.  
  352.  
  353. -------------------------------------------------------------------------------------------------------------------
  354. -- User code that supplements standard library decisions.
  355. -------------------------------------------------------------------------------------------------------------------
  356.  
  357. function get_custom_wsmode(spell, spellMap, defaut_wsmode)
  358. local wsmode
  359.  
  360. if state.Buff['Sneak Attack'] then
  361. wsmode = 'SA'
  362. end
  363. if state.Buff['Trick Attack'] then
  364. wsmode = (wsmode or '') .. 'TA'
  365. end
  366.  
  367. return wsmode
  368. end
  369.  
  370.  
  371. -- Called any time we attempt to handle automatic gear equips (ie: engaged or idle gear).
  372. function job_handle_equipping_gear(playerStatus, eventArgs)
  373. -- Check that ranged slot is locked, if necessary
  374. check_range_lock()
  375.  
  376. -- Check for SATA when equipping gear. If either is active, equip
  377. -- that gear specifically, and block equipping default gear.
  378. check_buff('Sneak Attack', eventArgs)
  379. check_buff('Trick Attack', eventArgs)
  380. end
  381.  
  382.  
  383. function customize_idle_set(idleSet)
  384. if player.hpp < 80 then
  385. idleSet = set_combine(idleSet, sets.ExtraRegen)
  386. end
  387.  
  388. return idleSet
  389. end
  390.  
  391.  
  392. function customize_melee_set(meleeSet)
  393. if state.TreasureMode.value == 'Fulltime' then
  394. meleeSet = set_combine(meleeSet, sets.TreasureHunter)
  395. end
  396.  
  397. return meleeSet
  398. end
  399.  
  400.  
  401. -- Called by the 'update' self-command.
  402. function job_update(cmdParams, eventArgs)
  403. th_update(cmdParams, eventArgs)
  404. end
  405.  
  406. -- Function to display the current relevant user state when doing an update.
  407. -- Return true if display was handled, and you don't want the default info shown.
  408. function display_current_job_state(eventArgs)
  409. local msg = 'Melee'
  410.  
  411. if state.CombatForm.has_value then
  412. msg = msg .. ' (' .. state.CombatForm.value .. ')'
  413. end
  414.  
  415. msg = msg .. ': '
  416.  
  417. msg = msg .. state.OffenseMode.value
  418. if state.HybridMode.value ~= 'Normal' then
  419. msg = msg .. '/' .. state.HybridMode.value
  420. end
  421. msg = msg .. ', WS: ' .. state.WeaponskillMode.value
  422.  
  423. if state.DefenseMode.value ~= 'None' then
  424. msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')'
  425. end
  426.  
  427. if state.Kiting.value == true then
  428. msg = msg .. ', Kiting'
  429. end
  430.  
  431. if state.PCTargetMode.value ~= 'default' then
  432. msg = msg .. ', Target PC: '..state.PCTargetMode.value
  433. end
  434.  
  435. if state.SelectNPCTargets.value == true then
  436. msg = msg .. ', Target NPCs'
  437. end
  438.  
  439. msg = msg .. ', TH: ' .. state.TreasureMode.value
  440.  
  441. add_to_chat(122, msg)
  442.  
  443. eventArgs.handled = true
  444. end
  445.  
  446. -------------------------------------------------------------------------------------------------------------------
  447. -- Utility functions specific to this job.
  448. -------------------------------------------------------------------------------------------------------------------
  449.  
  450. -- State buff checks that will equip buff gear and mark the event as handled.
  451. function check_buff(buff_name, eventArgs)
  452. if state.Buff[buff_name] then
  453. equip(sets.buff[buff_name] or {})
  454. if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
  455. equip(sets.TreasureHunter)
  456. end
  457. eventArgs.handled = true
  458. end
  459. end
  460.  
  461.  
  462. -- Check for various actions that we've specified in user code as being used with TH gear.
  463. -- This will only ever be called if TreasureMode is not 'None'.
  464. -- Category and Param are as specified in the action event packet.
  465. function th_action_check(category, param)
  466. if category == 2 or -- any ranged attack
  467. --category == 4 or -- any magic action
  468. (category == 3 and param == 30) or -- Aeolian Edge
  469. (category == 6 and info.default_ja_ids:contains(param)) or -- Provoke, Animated Flourish
  470. (category == 14 and info.default_u_ja_ids:contains(param)) -- Quick/Box/Stutter Step, Desperate/Violent Flourish
  471. then return true
  472. end
  473. end
  474.  
  475.  
  476. -- Function to lock the ranged slot if we have a ranged weapon equipped.
  477. function check_range_lock()
  478. if player.equipment.range ~= 'empty' then
  479. disable('range', 'ammo')
  480. else
  481. enable('range', 'ammo')
  482. end
  483. end
  484.  
  485.  
  486. -- Select default macro book on initial load or subjob change.
  487. function select_default_macro_book()
  488. -- Default macro set/book
  489. if player.sub_job == 'DNC' then
  490. set_macro_page(2, 11)
  491. elseif player.sub_job == 'WAR' then
  492. set_macro_page(2, 11)
  493. elseif player.sub_job == 'NIN' then
  494. set_macro_page(2, 11)
  495. else
  496. set_macro_page(2, 11)
  497. end
  498. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement