Advertisement
bongarippa

DNC

Oct 26th, 2017 (edited)
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.43 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Setup functions for this job. Generally should not be modified.
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. --[[
  6. Custom commands:
  7.  
  8. gs c step
  9. Uses the currently configured step on the target, with either <t> or <stnpc> depending on setting.
  10. gs c step t
  11. Uses the currently configured step on the target, but forces use of <t>.
  12.  
  13.  
  14. Configuration commands:
  15.  
  16. gs c cycle mainstep
  17. Cycles through the available steps to use as the primary step when using one of the above commands.
  18.  
  19. gs c cycle altstep
  20. Cycles through the available steps to use for alternating with the configured main step.
  21.  
  22. gs c toggle usealtstep
  23. Toggles whether or not to use an alternate step.
  24.  
  25. gs c toggle selectsteptarget
  26. Toggles whether or not to use <stnpc> (as opposed to <t>) when using a step.
  27. --]]
  28.  
  29.  
  30. -- Initialization function for this job file.
  31. function get_sets()
  32. include('organizer-lib')
  33. mote_include_version = 2
  34.  
  35. -- Load and initialize the include file.
  36. include('Mote-Include.lua')
  37. end
  38.  
  39.  
  40. -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
  41. function job_setup()
  42. state.Buff['Climactic Flourish'] = buffactive['climactic flourish'] or false
  43.  
  44. state.MainStep = M{['description']='Main Step', 'Box Step', 'Quickstep', 'Feather Step', 'Stutter Step'}
  45. state.AltStep = M{['description']='Alt Step', 'Quickstep', 'Feather Step', 'Stutter Step', 'Box Step'}
  46. state.UseAltStep = M(false, 'Use Alt Step')
  47. state.SelectStepTarget = M(false, 'Select Step Target')
  48. state.IgnoreTargetting = M(false, 'Ignore Targetting')
  49.  
  50. state.CurrentStep = M{['description']='Current Step', 'Main', 'Alt'}
  51. state.SkillchainPending = M(false, 'Skillchain Pending')
  52.  
  53. determine_haste_group()
  54. end
  55.  
  56. -------------------------------------------------------------------------------------------------------------------
  57. -- User setup functions for this job. Recommend that these be overridden in a sidecar file.
  58. -------------------------------------------------------------------------------------------------------------------
  59.  
  60. -- Setup vars that are user-dependent. Can override this function in a sidecar file.
  61. function user_setup()
  62. state.OffenseMode:options('Normal', 'Acc', 'Fodder')
  63. state.HybridMode:options('Normal', 'Evasion', 'PDT')
  64. state.WeaponskillMode:options('Normal', 'Acc', 'Fodder')
  65. state.PhysicalDefenseMode:options('Evasion', 'PDT')
  66.  
  67.  
  68. gear.default.weaponskill_neck = "Asperity Necklace"
  69. gear.default.weaponskill_waist = "Caudata Belt"
  70. gear.AugQuiahuiz = {name="Quiahuiz Trousers", augments={'Haste+2','"Snapshot"+2','STR+8'}}
  71.  
  72. -- Additional local binds
  73. send_command('bind ^= gs c cycle mainstep')
  74. send_command('bind != gs c cycle altstep')
  75. send_command('bind ^- gs c toggle selectsteptarget')
  76. send_command('bind !- gs c toggle usealtstep')
  77. send_command('bind ^` input /ja "Chocobo Jig" <me>')
  78. send_command('bind !` input /ja "Chocobo Jig II" <me>')
  79.  
  80. select_default_macro_book()
  81. end
  82.  
  83.  
  84. -- Called when this job file is unloaded (eg: job change)
  85. function user_unload()
  86. send_command('unbind ^`')
  87. send_command('unbind !`')
  88. send_command('unbind ^=')
  89. send_command('unbind !=')
  90. send_command('unbind ^-')
  91. send_command('unbind !-')
  92. end
  93.  
  94.  
  95. -- Define sets and vars used by this job file.
  96. function init_gear_sets()
  97. --------------------------------------
  98. -- Start defining the sets
  99. --------------------------------------
  100.  
  101. -- Precast Sets
  102.  
  103. -- Precast sets to enhance JAs
  104.  
  105. sets.precast.JA['No Foot Rise'] = {body="Horos Casaque"}
  106.  
  107. sets.precast.JA['Trance'] = {head="Horos Tiara"}
  108.  
  109.  
  110. -- Waltz set (chr and vit)
  111. sets.precast.Waltz = {ammo="Yamarang",
  112. head={ name="Uk'uxkaj Cap", augments={'Phys. dmg. taken -2%','Magic dmg. taken -2%','DEX+8',}},
  113. body="Meg. Cuirie +2",
  114. hands="Meg. Gloves +2",
  115. legs={ name="Herculean Trousers", augments={'Attack+30','Phys. dmg. taken -4%','STR+6','Accuracy+9',}},
  116. feet={ name="Herculean Boots", augments={'Attack+20','AGI+2','"Refresh"+1','Accuracy+12 Attack+12','Mag. Acc.+7 "Mag.Atk.Bns."+7',}},
  117. neck="Unmoving Collar +1",
  118. waist="Chaac Belt",
  119. left_ear="Handler's Earring +1",
  120. right_ear="Odnowa Earring +1",
  121. left_ring="Regal Ring",
  122. right_ring="Titan Ring",
  123. back="Iximulew Cape"}
  124.  
  125. -- Don't need any special gear for Healing Waltz.
  126. sets.precast.Waltz['Healing Waltz'] = {}
  127.  
  128. sets.precast.Samba = {head="Dancer's Tiara"}
  129.  
  130. sets.precast.Jig = {feet="Dancer's Shoes"}
  131.  
  132. sets.precast.Step = {head={ name="Herculean Helm", augments={'Pet: INT+10','Pet: Attack+19 Pet: Rng.Atk.+19','"Treasure Hunter"+2','Accuracy+13 Attack+13','Mag. Acc.+13 "Mag.Atk.Bns."+13',}},
  133. legs={ name="Herculean Trousers", augments={'Pet: Mag. Acc.+11','Attack+8','"Treasure Hunter"+2','Accuracy+15 Attack+15',}},
  134. waist="Chaac Belt"}
  135. sets.precast.Step['Feather Step'] = {feet="Charis Shoes +2"}
  136.  
  137. sets.precast.Flourish1 = {}
  138. sets.precast.Flourish1['Violent Flourish'] = {} -- magic accuracy
  139. sets.precast.Flourish1['Desperate Flourish'] = {} -- acc gear
  140.  
  141. sets.precast.Flourish2 = {}
  142. sets.precast.Flourish2['Reverse Flourish'] = {hands="Charis Bangles +2"}
  143.  
  144. sets.precast.Flourish3 = {}
  145. sets.precast.Flourish3['Striking Flourish'] = {body="Charis Casaque +2"}
  146. sets.precast.Flourish3['Climactic Flourish'] = {head="Charis Tiara +2"}
  147.  
  148. -- Fast cast sets for spells
  149.  
  150. sets.precast.FC = {}
  151.  
  152. sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads"})
  153.  
  154.  
  155. -- Weaponskill sets
  156. -- Default set for any weaponskill that isn't any more specifically defined
  157. sets.precast.WS = {ammo="C. Palug Stone",
  158. head={ name="Herculean Helm", augments={'Accuracy+25','Weapon skill damage +4%','DEX+2','Attack+6',}},
  159. body={ name="Herculean Vest", augments={'Accuracy+8 Attack+8','Weapon skill damage +3%','STR+9','Accuracy+8','Attack+14',}},
  160. hands="Meg. Gloves +2",
  161. legs={ name="Herculean Trousers", augments={'Attack+28','Crit. hit damage +3%','DEX+12','Accuracy+3',}},
  162. feet={ name="Herculean Boots", augments={'Attack+21','Crit. hit damage +3%','STR+10','Accuracy+9',}},
  163. neck="Fotia Gorget",
  164. waist="Fotia Belt",
  165. left_ear="Odr Earring",
  166. right_ear="Sherida Earring",
  167. left_ring="Ilabrat Ring",
  168. right_ring="Regal Ring",
  169. back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','"Dbl.Atk."+10',}}}
  170. sets.precast.WS.Acc = set_combine(sets.precast.WS, {})
  171.  
  172. -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
  173. sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {})
  174. sets.precast.WS['Exenterator'].Acc = set_combine(sets.precast.WS['Exenterator'], {})
  175. sets.precast.WS['Exenterator'].Fodder = set_combine(sets.precast.WS['Exenterator'], {})
  176.  
  177. sets.precast.WS['Pyrrhic Kleos'] = set_combine(sets.precast.WS, {hands="Iuitl Wristbands"})
  178. sets.precast.WS['Pyrrhic Kleos'].Acc = set_combine(sets.precast.WS.Acc, {hands="Iuitl Wristbands"})
  179.  
  180. sets.precast.WS['Evisceration'] = set_combine(sets.precast.WS, {
  181. legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  182. feet={ name="Herculean Boots", augments={'Accuracy+27','"Triple Atk."+4','MND+8','Attack+15',}}})
  183. sets.precast.WS['Evisceration'].Acc = set_combine(sets.precast.WS['Evisceration'], {})
  184.  
  185. sets.precast.WS["Rudra's Storm"] = set_combine(sets.precast.WS, {})
  186. sets.precast.WS["Rudra's Storm"].Acc = set_combine(sets.precast.WS["Rudra's Storm"], {
  187. legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  188. feet={ name="Herculean Boots", augments={'Accuracy+27','"Triple Atk."+4','MND+8','Attack+15',}}})
  189.  
  190. sets.precast.WS['Aeolian Edge'] = {}
  191.  
  192. sets.precast.Skillchain = {}
  193.  
  194.  
  195. -- Midcast Sets
  196.  
  197. sets.midcast.FastRecast = {}
  198.  
  199. -- Specific spells
  200. sets.midcast.Utsusemi = {}
  201.  
  202.  
  203. -- Sets to return to when not performing an action.
  204.  
  205. -- Resting sets
  206. sets.resting = {}
  207. sets.ExtraRegen = {}
  208.  
  209.  
  210. -- Idle sets
  211.  
  212. sets.idle = {ammo="Staunch Tathlum +1",
  213. head={ name="Adhemar Bonnet", augments={'HP+80','Attack+10','Phys. dmg. taken -3',}},
  214. body="Meg. Cuirie +2",
  215. hands="Meg. Gloves +2",
  216. legs={ name="Herculean Trousers", augments={'Attack+30','Phys. dmg. taken -4%','STR+6','Accuracy+9',}},
  217. feet="Skd. Jambeaux +1",
  218. neck="Loricate Torque +1",
  219. waist="Plat. Mog. Belt",
  220. left_ear="Infused Earring",
  221. right_ear="Genmei Earring",
  222. left_ring="Defending Ring",
  223. right_ring="Paguroidea Ring",
  224. back="Moonbeam Cape"}
  225.  
  226. sets.idle.Town = set_combine(sets.idle, {
  227. body={ name="Adhemar Jacket", augments={'DEX+10','AGI+10','Accuracy+15',}},
  228. hands={ name="Leyline Gloves", augments={'Accuracy+15','Mag. Acc.+15','"Mag.Atk.Bns."+15','"Fast Cast"+3',}},
  229. legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}}})
  230.  
  231. sets.idle.Weak = {}
  232.  
  233. -- Defense sets
  234.  
  235. sets.defense.Evasion = {}
  236.  
  237. sets.defense.PDT = {}
  238.  
  239. sets.defense.MDT = {}
  240.  
  241. sets.Kiting = {}
  242.  
  243. -- Engaged sets
  244.  
  245. -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
  246. -- sets if more refined versions aren't defined.
  247. -- If you create a set with both offense and defense modes, the offense mode should be first.
  248. -- EG: sets.engaged.Dagger.Accuracy.Evasion
  249.  
  250. -- Normal melee group
  251. sets.engaged = {ammo="Yamarang",
  252. head={ name="Adhemar Bonnet +1", augments={'DEX+12','AGI+12','Accuracy+20',}},
  253. body={ name="Herculean Vest", augments={'Accuracy+22','"Triple Atk."+4','DEX+5','Attack+11',}},
  254. hands={ name="Adhemar Wrist. +1", augments={'DEX+12','AGI+12','Accuracy+20',}},
  255. legs={ name="Samnuha Tights", augments={'STR+10','DEX+10','"Dbl.Atk."+3','"Triple Atk."+3',}},
  256. feet={ name="Herculean Boots", augments={'Accuracy+27','"Triple Atk."+4','MND+8','Attack+15',}},
  257. neck="Anu Torque",
  258. waist="Reiki Yotai",
  259. left_ear="Suppanomimi",
  260. right_ear="Sherida Earring",
  261. left_ring="Gere Ring",
  262. right_ring="Epona's Ring",
  263. back={ name="Senuna's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','"Dbl.Atk."+10',}}}
  264.  
  265. sets.engaged.Fodder = {}
  266. sets.engaged.Fodder.Evasion = {}
  267.  
  268. sets.engaged.Acc = {}
  269. sets.engaged.Evasion = {}
  270. sets.engaged.PDT = {}
  271. sets.engaged.Acc.Evasion = {}
  272. sets.engaged.Acc.PDT = {}
  273.  
  274. -- Custom melee group: High Haste (2x March or Haste)
  275. sets.engaged.HighHaste = set_combine(sets.engaged, {})
  276.  
  277. sets.engaged.Fodder.HighHaste = {}
  278. sets.engaged.Fodder.Evasion.HighHaste = {}
  279.  
  280. sets.engaged.Acc.HighHaste = {}
  281. sets.engaged.Evasion.HighHaste = {}
  282. sets.engaged.Acc.Evasion.HighHaste = {}
  283. sets.engaged.PDT.HighHaste = {}
  284. sets.engaged.Acc.PDT.HighHaste = {}
  285.  
  286.  
  287. -- Custom melee group: Max Haste (2x March + Haste)
  288. sets.engaged.MaxHaste = {}
  289.  
  290. -- Getting Marches+Haste from Trust NPCs, doesn't cap delay.
  291. sets.engaged.Fodder.MaxHaste = set_combine(sets.engaged,{})
  292. sets.engaged.Fodder.Evasion.MaxHaste = {}
  293.  
  294. sets.engaged.Acc.MaxHaste = {}
  295. sets.engaged.Evasion.MaxHaste = {}
  296. sets.engaged.Acc.Evasion.MaxHaste = {}
  297. sets.engaged.PDT.MaxHaste = {}
  298. sets.engaged.Acc.PDT.MaxHaste = {}
  299.  
  300.  
  301.  
  302. -- Buff sets: Gear that needs to be worn to actively enhance a current player buff.
  303. sets.buff['Saber Dance'] = {legs="Horos Tights"}
  304. sets.buff['Climactic Flourish'] = {head="Charis Tiara +2"}
  305. end
  306.  
  307.  
  308. -------------------------------------------------------------------------------------------------------------------
  309. -- Job-specific hooks for standard casting events.
  310. -------------------------------------------------------------------------------------------------------------------
  311.  
  312. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  313. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  314. function job_precast(spell, action, spellMap, eventArgs)
  315. --auto_presto(spell)
  316. end
  317.  
  318.  
  319. function job_post_precast(spell, action, spellMap, eventArgs)
  320. if spell.type == "WeaponSkill" then
  321. if state.Buff['Climactic Flourish'] then
  322. equip(sets.buff['Climactic Flourish'])
  323. end
  324. if state.SkillchainPending.value == true then
  325. equip(sets.precast.Skillchain)
  326. end
  327. end
  328. end
  329.  
  330.  
  331. -- Return true if we handled the aftercast work. Otherwise it will fall back
  332. -- to the general aftercast() code in Mote-Include.
  333. function job_aftercast(spell, action, spellMap, eventArgs)
  334. if not spell.interrupted then
  335. if spell.english == "Wild Flourish" then
  336. state.SkillchainPending:set()
  337. send_command('wait 5;gs c unset SkillchainPending')
  338. elseif spell.type:lower() == "weaponskill" then
  339. state.SkillchainPending:toggle()
  340. send_command('wait 6;gs c unset SkillchainPending')
  341. end
  342. end
  343. end
  344.  
  345. -------------------------------------------------------------------------------------------------------------------
  346. -- Job-specific hooks for non-casting events.
  347. -------------------------------------------------------------------------------------------------------------------
  348.  
  349. -- Called when a player gains or loses a buff.
  350. -- buff == buff gained or lost
  351. -- gain == true if the buff was gained, false if it was lost.
  352. function job_buff_change(buff,gain)
  353. -- If we gain or lose any haste buffs, adjust which gear set we target.
  354. if S{'haste','march','embrava','haste samba'}:contains(buff:lower()) then
  355. determine_haste_group()
  356. handle_equipping_gear(player.status)
  357. elseif buff == 'Saber Dance' or buff == 'Climactic Flourish' then
  358. handle_equipping_gear(player.status)
  359. end
  360. end
  361.  
  362.  
  363. function job_status_change(new_status, old_status)
  364. if new_status == 'Engaged' then
  365. determine_haste_group()
  366. end
  367. end
  368.  
  369.  
  370. -------------------------------------------------------------------------------------------------------------------
  371. -- User code that supplements standard library decisions.
  372. -------------------------------------------------------------------------------------------------------------------
  373.  
  374. -- Called by the default 'update' self-command.
  375. function job_update(cmdParams, eventArgs)
  376. determine_haste_group()
  377. end
  378.  
  379.  
  380. function customize_idle_set(idleSet)
  381. if player.hpp < 80 and not areas.Cities:contains(world.area) then
  382. idleSet = set_combine(idleSet, sets.ExtraRegen)
  383. end
  384.  
  385. return idleSet
  386. end
  387.  
  388. function customize_melee_set(meleeSet)
  389. if state.DefenseMode.value ~= 'None' then
  390. if buffactive['saber dance'] then
  391. meleeSet = set_combine(meleeSet, sets.buff['Saber Dance'])
  392. end
  393. if state.Buff['Climactic Flourish'] then
  394. meleeSet = set_combine(meleeSet, sets.buff['Climactic Flourish'])
  395. end
  396. end
  397.  
  398. return meleeSet
  399. end
  400.  
  401. -- Handle auto-targetting based on local setup.
  402. function job_auto_change_target(spell, action, spellMap, eventArgs)
  403. if spell.type == 'Step' then
  404. if state.IgnoreTargetting.value == true then
  405. state.IgnoreTargetting:reset()
  406. eventArgs.handled = true
  407. end
  408.  
  409. eventArgs.SelectNPCTargets = state.SelectStepTarget.value
  410. end
  411. end
  412.  
  413.  
  414. -- Function to display the current relevant user state when doing an update.
  415. -- Set eventArgs.handled to true if display was handled, and you don't want the default info shown.
  416. function display_current_job_state(eventArgs)
  417. local msg = 'Melee'
  418.  
  419. if state.CombatForm.has_value then
  420. msg = msg .. ' (' .. state.CombatForm.value .. ')'
  421. end
  422.  
  423. msg = msg .. ': '
  424.  
  425. msg = msg .. state.OffenseMode.value
  426. if state.HybridMode.value ~= 'Normal' then
  427. msg = msg .. '/' .. state.HybridMode.value
  428. end
  429. msg = msg .. ', WS: ' .. state.WeaponskillMode.value
  430.  
  431. if state.DefenseMode.value ~= 'None' then
  432. msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')'
  433. end
  434.  
  435. if state.Kiting.value then
  436. msg = msg .. ', Kiting'
  437. end
  438.  
  439. msg = msg .. ', ['..state.MainStep.current
  440.  
  441. if state.UseAltStep.value == true then
  442. msg = msg .. '/'..state.AltStep.current
  443. end
  444.  
  445. msg = msg .. ']'
  446.  
  447. if state.SelectStepTarget.value == true then
  448. steps = steps..' (Targetted)'
  449. end
  450.  
  451. add_to_chat(122, msg)
  452.  
  453. eventArgs.handled = true
  454. end
  455.  
  456.  
  457. -------------------------------------------------------------------------------------------------------------------
  458. -- User self-commands.
  459. -------------------------------------------------------------------------------------------------------------------
  460.  
  461. -- Called for custom player commands.
  462. function job_self_command(cmdParams, eventArgs)
  463. if cmdParams[1] == 'step' then
  464. if cmdParams[2] == 't' then
  465. state.IgnoreTargetting:set()
  466. end
  467.  
  468. local doStep = ''
  469. if state.UseAltStep.value == true then
  470. doStep = state[state.CurrentStep.current..'Step'].current
  471. state.CurrentStep:cycle()
  472. else
  473. doStep = state.MainStep.current
  474. end
  475.  
  476. send_command('@input /ja "'..doStep..'" <t>')
  477. end
  478. end
  479.  
  480. -------------------------------------------------------------------------------------------------------------------
  481. -- Utility functions specific to this job.
  482. -------------------------------------------------------------------------------------------------------------------
  483.  
  484. function determine_haste_group()
  485. -- We have three groups of DW in gear: Charis body, Charis neck + DW earrings, and Patentia Sash.
  486.  
  487. -- For high haste, we want to be able to drop one of the 10% groups (body, preferably).
  488. -- High haste buffs:
  489. -- 2x Marches + Haste
  490. -- 2x Marches + Haste Samba
  491. -- 1x March + Haste + Haste Samba
  492. -- Embrava + any other haste buff
  493.  
  494. -- For max haste, we probably need to consider dropping all DW gear.
  495. -- Max haste buffs:
  496. -- Embrava + Haste/March + Haste Samba
  497. -- 2x March + Haste + Haste Samba
  498.  
  499. classes.CustomMeleeGroups:clear()
  500.  
  501. if buffactive.embrava and (buffactive.haste or buffactive.march) and buffactive['haste samba'] then
  502. classes.CustomMeleeGroups:append('MaxHaste')
  503. elseif buffactive.march == 2 and buffactive.haste and buffactive['haste samba'] then
  504. classes.CustomMeleeGroups:append('MaxHaste')
  505. elseif buffactive.embrava and (buffactive.haste or buffactive.march or buffactive['haste samba']) then
  506. classes.CustomMeleeGroups:append('HighHaste')
  507. elseif buffactive.march == 1 and buffactive.haste and buffactive['haste samba'] then
  508. classes.CustomMeleeGroups:append('HighHaste')
  509. elseif buffactive.march == 2 and (buffactive.haste or buffactive['haste samba']) then
  510. classes.CustomMeleeGroups:append('HighHaste')
  511. end
  512. end
  513.  
  514.  
  515. -- Automatically use Presto for steps when it's available and we have less than 3 finishing moves
  516. function auto_presto(spell)
  517. if spell.type == 'Step' then
  518. local allRecasts = windower.ffxi.get_ability_recasts()
  519. local prestoCooldown = allRecasts[236]
  520. local under3FMs = not buffactive['Finishing Move 3'] and not buffactive['Finishing Move 4'] and not buffactive['Finishing Move 5']
  521.  
  522. if player.main_job_level >= 77 and prestoCooldown < 1 and under3FMs then
  523. cast_delay(1.1)
  524. send_command('@input /ja "Presto" <me>')
  525. end
  526. end
  527. end
  528.  
  529.  
  530. -- Select default macro book on initial load or subjob change.
  531. function select_default_macro_book()
  532. -- Default macro set/book
  533. if player.sub_job == 'WAR' then
  534. set_macro_page(1, 9)
  535. elseif player.sub_job == 'NIN' then
  536. set_macro_page(1, 9)
  537. elseif player.sub_job == 'SAM' then
  538. set_macro_page(1, 9)
  539. else
  540. set_macro_page(1, 9)
  541. end
  542. end
  543.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement