xRejectedx

WAR Lua

Mar 21st, 2021 (edited)
2,280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 21.38 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- WAR Lua by Rejected
  3. -- Thanks for all the hard work by Motenten and Arislan.
  4. -- This Lua is my own combination of their work and various custom functions.
  5. -- Movement Detection Requires Gearinfo Addon
  6. --
  7. --
  8. -- TODO:
  9. -- Roll Tracking (Fighter's and SAM Roll)
  10. -------------------------------------------------------------------------------------------------------------------
  11.  
  12. -------------------------------------------------------------------------------------------------------------------
  13. --  Keybinds
  14. -------------------------------------------------------------------------------------------------------------------
  15.  
  16. --  Modes:      [ F9 ]              Cycle Offense Modes
  17. --              [ CTRL+F9 ]         Cycle Hybrid Modes
  18. --              [ WIN+F9 ]          Cycle Weapon Skill Modes
  19. --              [ F10 ]             Emergency PDT Mode
  20. --              [ ALT+F10 ]         Toggle Kiting Mode
  21. --              [ F11 ]             Emergency -MDT Mode
  22. --              [ F12 ]             Update Current Gear / Report Current Status
  23. --              [ CTRL+F12 ]        Cycle Idle Modes
  24. --              [ ALT+F12 ]         Cancel Emergency -PDT/-MDT Mode
  25. --              [ WIN+C ]           Toggle Capacity Points Mode
  26. --              [ WIN+T ]           Cycle Treasure Hunter Mode
  27. --              [ WIN+E ]           Cycle Weapon Set Back
  28. --              [ WIN+R ]           Cycle Weapon Set Forward
  29. --              [ WIN+P ]           Toggle Pause Mode (Turns off automatic gear swaps for testing, using equip sets.whatever, etc.)
  30.  
  31. -------------------------------------------------------------------------------------------------------------------
  32. -- Initialization function for this job file.
  33. -------------------------------------------------------------------------------------------------------------------
  34.  
  35. -- Gear Include File (Not required.)
  36. include('Rejected-gear.lua')
  37.  
  38. function get_sets()
  39.     mote_include_version = 2
  40.     -- Load and initialize the include file.
  41.     include('Mote-Include.lua')
  42.     include('organizer-lib')
  43. end
  44.  
  45. -------------------------------------------------------------------------------------------------------------------
  46. -- Setup vars that are user-independent.
  47. -------------------------------------------------------------------------------------------------------------------
  48.  
  49. function job_setup()   
  50.     --Your Main + Sub Weapon Sets. Add new sets here and define below (sets.Montante etc.)
  51.     state.WeaponSet = M{['description']='Weapon Set', 'Montante', 'Reikiono', 'Naegling'}
  52.     state.WeaponLock = M(false, 'Weapon Lock')
  53.    
  54.     --CP Mode
  55.     state.CP = M(false, "Capacity Points Mode")
  56.    
  57.     --Pause Mode
  58.     state.Pause = M(false, "Pause Mode")
  59.  
  60.     --Buffs we have gearsets for
  61.     state.Buff.Berserk = buffactive.berserk or false
  62.     state.Buff.Retaliation = buffactive.retaliation or false
  63.    
  64.     --Weaponskills we DO NOT want Gavialis Helm with
  65.     wsList = S{'Savage Blade', 'Impulse Drive', 'Torcleaver', 'Upheaval'}
  66.    
  67.     --Gear we DO NOT want automatically taken off (currently only supports commonly used rings, can use pause mode for all other slots)
  68.     no_swap_gear = S{"Warp Ring", "Dim. Ring (Dem)", "Dim. Ring (Holla)", "Dim. Ring (Mea)", "Trizek Ring", "Endorsement Ring", "Echad Ring", "Facility Ring", "Capacity Ring", "Emporox's Ring"}
  69.  
  70.     --TH Rules
  71.     include('Mote-TreasureHunter')
  72.  
  73.     --Your Lockstyle Set Number
  74.     lockstyleset = 13
  75. end
  76.  
  77. -------------------------------------------------------------------------------------------------------------------
  78. -- Setup vars that are user-dependent.  Can override this function in a sidecar file.
  79. -------------------------------------------------------------------------------------------------------------------
  80.  
  81. function user_setup()
  82.     -- Options: Override default values
  83.     state.OffenseMode:options('Normal', 'MidAcc', 'FullAcc')
  84.     state.WeaponskillMode:options('Normal', 'MidAcc', 'FullAcc')
  85.     state.HybridMode:options('Normal', 'Hybrid')
  86.     state.CastingMode:options('Normal')
  87.     state.IdleMode:options('Normal', 'Regen', 'Weak')
  88.     state.RestingMode:options('Normal')
  89.     state.PhysicalDefenseMode:options('PDT', 'Reraise')
  90.     state.MagicalDefenseMode:options('MDT')
  91.    
  92.     --Auto Kite (Auto Move Speed Gear)
  93.     state.Auto_Kite = M(false, 'Auto_Kite')  
  94.     moving = false
  95.    
  96.     -- Additional Local Binds
  97.     send_command('bind @t gs c cycle treasuremode')
  98.     send_command('bind @w gs c toggle WeaponLock')
  99.     send_command('bind @c gs c toggle CP')  
  100.     send_command('bind @e gs c cycleback WeaponSet')
  101.     send_command('bind @r gs c cycle WeaponSet')
  102.     send_command('bind @p gs c toggle Pause')
  103.    
  104.     --Macro Book and Lockstyle
  105.     select_default_macro_book()
  106.     set_lockstyle()
  107. end
  108.  
  109. -------------------------------------------------------------------------------------------------------------------
  110. -- Called when this job file is unloaded (eg: job change)
  111. -------------------------------------------------------------------------------------------------------------------
  112.  
  113. function file_unload()
  114.     send_command('unbind @t')
  115.     send_command('unbind @w')
  116.     send_command('unbind @c')
  117.     send_command('unbind @e')
  118.     send_command('unbind @r')
  119.     send_command('unbind @p')
  120. end
  121.  
  122. -------------------------------------------------------------------------------------------------------------------
  123. -- Define sets and vars used by this job file.
  124. -------------------------------------------------------------------------------------------------------------------
  125.  
  126. function init_gear_sets()
  127.     sets.WSDayBonus                         = { head = "Gavialis Helm" }
  128.     sets.TreasureHunter                     = { ammo = "Per. Lucky Egg", waist = "Chaac Belt" }
  129.     sets.reive                              = { neck = "Ygnas's Resolve +1"}
  130.     sets.Organizer                          = { }
  131.  
  132. -------------------------------------------------------------------------------------------------------------------
  133. -- Precast Sets
  134. -------------------------------------------------------------------------------------------------------------------
  135.  
  136.     -- Job Abilities
  137.     sets.precast.JA['Blood Rage']           = { body = WAREmpy.Body }
  138.     sets.precast.JA['Provoke']              = set_combine(sets.TreasureHunter, { hands = WARAF.Hands })
  139.     sets.precast.JA['Berserk']              = { body = WARAF.Body, hands = WARRelic.Hands, back = Cichols.TP, feet = WARRelic.Feet}
  140.     sets.precast.JA['Warcry']               = { head = WARRelic.Head }
  141.     sets.precast.JA['Mighty Strikes']       = { head = WARRelic.Head }
  142.     sets.precast.JA['Retaliation']          = { hands = WARAF.Hands, feet = WAREmpy.Feet }
  143.     sets.precast.JA['Aggressor']            = { head = WARAF.Head, body = WARRelic.Body }
  144.     sets.precast.JA['Restraint']            = { hands = WAREmpy.Hands }
  145.     sets.precast.JA['Warrior\'s Charge']    = { legs = WARRelic.Legs }
  146.     sets.precast.JA['Tomahawk']             = { ammo = "Thr. Tomahawk", legs = WARRelic.Legs }
  147.  
  148.     -- Waltz (CHR and VIT)
  149.     sets.precast.Waltz = { }
  150.  
  151.     -- Fast Cast
  152.     sets.precast.FC = { }
  153.    
  154.     -- Utsusemi
  155.     sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, { neck="Magoraga Beads" })
  156.  
  157.     -- Ranged Attacks
  158.     sets.precast.RA = { }
  159.  
  160. -------------------------------------------------------------------------------------------------------------------
  161. -- Midcast Sets
  162. -------------------------------------------------------------------------------------------------------------------
  163.  
  164.     sets.midcast.FastRecast = { }
  165.    
  166.     -- Utsusemi
  167.     sets.midcast.Utsusemi = { }
  168.  
  169.     -- Ranged Attacks
  170.     sets.midcast.RA = { }
  171.  
  172. -------------------------------------------------------------------------------------------------------------------
  173. -- Weaponskill Sets
  174. -------------------------------------------------------------------------------------------------------------------
  175.  
  176.     -- General Set
  177.     sets.precast.WS = { }
  178.     sets.precast.WS.MidAcc = set_combine(sets.precast.WS, { })
  179.     sets.precast.WS.FullAcc = set_combine(sets.precast.WS.MidAcc, { })
  180.    
  181.     --Great Sword  
  182.     sets.precast.WS['Resolution'] = { }
  183.     sets.precast.WS['Resolution'].MidAcc = set_combine(sets.precast.WS['Resolution'], { })
  184.     sets.precast.WS['Resolution'].FullAcc = set_combine(sets.precast.WS['Resolution'].MidAcc, { })
  185.    
  186.     --Great Axe
  187.     sets.precast.WS['Upheaval'] = set_combine(sets.precast.WS, { })
  188.     sets.precast.WS['Upheaval'].MidAcc = set_combine(sets.precast.WS['Upheaval'], { })
  189.     sets.precast.WS['Upheaval'].FullAcc = set_combine(sets.precast.WS['Upheaval'].MidAcc, { })
  190.    
  191.     sets.precast.WS['Ukko\'s Fury'] = set_combine(sets.precast.WS, { })
  192.     sets.precast.WS['Ukko\'s Fury'].MidAcc = set_combine(sets.precast.WS['Ukko\'s Fury'], { })
  193.     sets.precast.WS['Ukko\'s Fury'].FullAcc = set_combine(sets.precast.WS['Ukko\'s Fury'].MidAcc, { })
  194.  
  195.     --Polearm
  196.     sets.precast.WS['Stardiver'] = set_combine(sets.precast.WS, { })
  197.     sets.precast.WS['Stardiver'].MidAcc = set_combine(sets.precast.WS['Stardiver'], { })
  198.     sets.precast.WS['Stardiver'].FullAcc = set_combine(sets.precast.WS['Stardiver'].MidAcc, { })
  199.    
  200.     sets.precast.WS['Impulse Drive'] = set_combine(sets.precast.WS, { })
  201.     sets.precast.WS['Impulse Drive'].MidAcc = set_combine(sets.precast.WS['Impulse Drive'], { })
  202.     sets.precast.WS['Impulse Drive'].FullAcc = set_combine(sets.precast.WS['Impulse Drive'].MidAcc, { })
  203.    
  204.     --Sword
  205.     sets.precast.WS['Savage Blade'] = set_combine(sets.precast.WS, { })
  206.     sets.precast.WS['Savage Blade'].MidAcc = set_combine(sets.precast.WS['Savage Blade'], { })
  207.     sets.precast.WS['Savage Blade'].FullAcc = set_combine(sets.precast.WS['Savage Blade'].MidAcc, { })
  208.    
  209.     sets.precast.WS['Sanguine Blade'] = set_combine(sets.precast.WS, { })
  210.     sets.precast.WS['Sanguine Blade'].MidAcc = set_combine(sets.precast.WS['Sanguine Blade'], { })
  211.     sets.precast.WS['Sanguine Blade'].FullAcc = set_combine(sets.precast.WS['Sanguine Blade'].MidAcc, { })
  212.  
  213.     sets.precast.WS['Requiscat'] = set_combine(sets.precast.WS, { })
  214.     sets.precast.WS['Requiscat'].MidAcc = set_combine(sets.precast.WS['Requiscat'], { })
  215.     sets.precast.WS['Requiscat'].FullAcc = set_combine(sets.precast.WS['Requiscat'].MidAcc, { })
  216.  
  217.     --Axe
  218.     sets.precast.WS['Decimation'] = set_combine(sets.precast.WS, { })
  219.     sets.precast.WS['Decimation'].MidAcc = set_combine(sets.precast.WS['Decimation'], { })
  220.     sets.precast.WS['Decimation'].FullAcc = set_combine(sets.precast.WS['Decimation'].MidAcc, { })
  221.  
  222.     sets.precast.WS['Cloudsplitter'] = set_combine(sets.precast.WS, { })
  223.     sets.precast.WS['Cloudsplitter'].MidAcc = set_combine(sets.precast.WS['Cloudsplitter'], { })
  224.     sets.precast.WS['Cloudsplitter'].FullAcc = set_combine(sets.precast.WS['Cloudsplitter'].MidAcc, { })
  225.  
  226. -------------------------------------------------------------------------------------------------------------------
  227. -- Idle sets
  228. -------------------------------------------------------------------------------------------------------------------
  229.  
  230.     sets.idle.Town = { }
  231.    
  232.     sets.idle.Field = set_combine(sets.idle.Town, { })
  233.  
  234.     sets.idle.Regen = set_combine(sets.idle.Field, { })
  235.  
  236.     -- Twilight goes here
  237.     sets.idle.Weak = set_combine(sets.idle.Field, { })
  238.  
  239. -------------------------------------------------------------------------------------------------------------------
  240. -- Defense sets
  241. -------------------------------------------------------------------------------------------------------------------
  242.  
  243.     sets.defense.PDT = { }
  244.    
  245.     sets.defense.Reraise = sets.idle.Weak
  246.  
  247.     sets.defense.MDT = set_combine(sets.defense.PDT, { })
  248.  
  249. -------------------------------------------------------------------------------------------------------------------
  250. -- Engaged Sets
  251. -------------------------------------------------------------------------------------------------------------------
  252.  
  253.     sets.engaged = { } 
  254.     sets.engaged.MidAcc = set_combine(sets.engaged, { })
  255.     sets.engaged.FullAcc = set_combine(sets.engaged.MidAcc, { })
  256.  
  257.     sets.engaged.Reraise = set_combine(sets.engaged, { })
  258.  
  259. -------------------------------------------------------------------------------------------------------------------
  260. -- Hybrid Sets
  261. -------------------------------------------------------------------------------------------------------------------    
  262.  
  263.     sets.Hybrid = { }
  264.     sets.Hybrid.MidAcc = { }
  265.     sets.Hybrid.FullAcc = { }
  266.  
  267.     sets.engaged.Hybrid = sets.Hybrid
  268.     sets.engaged.MidAcc.Hybrid = sets.Hybrid.MidAcc
  269.     sets.engaged.FullAcc.Hybrid = sets.Hybrid.FullAcc
  270.    
  271. -------------------------------------------------------------------------------------------------------------------
  272. -- Utility Sets
  273. -------------------------------------------------------------------------------------------------------------------
  274.    
  275.     --Buffs
  276.     sets.buff.Berserk       = { }
  277.     sets.buff.Retaliation   = { }
  278.    
  279.     --Debuffs
  280.     sets.Doom = { }
  281.    
  282.     sets.EmergencyDT = { }
  283.  
  284.     sets.Kiting      = { }
  285.  
  286.     sets.Reraise     = { }
  287.    
  288.     sets.resting     = { }
  289.    
  290.     sets.CP          = { }
  291.  
  292. -------------------------------------------------------------------------------------------------------------------
  293. -- Weapon Sets
  294. -------------------------------------------------------------------------------------------------------------------
  295.  
  296.     sets.Montante    = {main="Montante +1", sub="Bloodrain Strap"}
  297.     sets.Reikiono    = {main="Reikiono", sub ="Bloodrain Strap"}
  298.     sets.Naegling    = {main="Naegling", sub="Blurred Shield +1"}  
  299.  
  300. end
  301.  
  302. -------------------------------------------------------------------------------------------------------------------
  303. -- Job-specific hooks for standard casting events.
  304. -------------------------------------------------------------------------------------------------------------------
  305.  
  306. function job_precast(spell, action, spellMap, eventArgs)
  307. end
  308.  
  309. function job_post_precast(spell, action, spellMap, eventArgs)
  310.     -- Make sure abilities using head gear don't swap
  311.     if spell.type:lower() == 'weaponskill' then
  312.         -- handle Gavialis Helm
  313.         if is_sc_element_today(spell) then
  314.             if wsList:contains(spell.english) then
  315.                 -- do nothing
  316.             else
  317.                 equip(sets.WSDayBonus)
  318.             end
  319.         end
  320.         -- Use SOA neck piece for WS in rieves
  321.         if buffactive['Reive Mark'] then
  322.             equip(sets.reive)
  323.         end
  324.     end
  325. end
  326.  
  327. -- Check if we need Gavialis Helm
  328.  function is_sc_element_today(spell)
  329.     if spell.type ~= 'WeaponSkill' then
  330.         return
  331.     end
  332.  
  333.    local weaponskill_elements = S{}:
  334.     union(skillchain_elements[spell.skillchain_a]):
  335.     union(skillchain_elements[spell.skillchain_b]):
  336.     union(skillchain_elements[spell.skillchain_c])
  337.  
  338.     if weaponskill_elements:contains(world.day_element) then
  339.         return true
  340.     else
  341.         return false
  342.     end
  343.  
  344. end
  345.  
  346. function job_midcast(spell, action, spellMap, eventArgs)
  347. end
  348.  
  349. -- Run after the default midcast() is done.
  350. function job_post_midcast(spell, action, spellMap, eventArgs)
  351.     if (state.HybridMode.current == 'Hybrid' and state.PhysicalDefenseMode.current == 'Reraise') then
  352.         equip(sets.Reraise)
  353.     end
  354.     if state.Buff.Berserk and not state.Buff.Retaliation then
  355.         equip(sets.buff.Berserk)
  356.     end
  357. end
  358.  
  359. function job_aftercast(spell, action, spellMap, eventArgs)
  360.     if state.Buff[spell.english] ~= nil then
  361.         state.Buff[spell.english] = not spell.interrupted or buffactive[spell.english]
  362.     end
  363.     if player.status ~= 'Engaged' and state.WeaponLock.value == false then
  364.         check_weaponset()
  365.     end
  366. end
  367.  
  368. function job_post_aftercast(spell, action, spellMap, eventArgs)
  369. end
  370.  
  371. -------------------------------------------------------------------------------------------------------------------
  372. -- Customization hooks for idle and melee sets, after they've been automatically constructed.
  373. -------------------------------------------------------------------------------------------------------------------
  374.  
  375. function job_handle_equipping_gear(status, eventArgs)
  376.     check_gear()
  377.     check_moving()
  378. end
  379.  
  380. -- Modify the default idle set after it was constructed.
  381. function customize_idle_set(idleSet)
  382.     if buffactive['Terror'] or buffactive['Petrification'] or buffactive['Stun'] or buffactive['Sleep'] then
  383.         idleSet = sets.EmergencyDT
  384.     end
  385.     if state.Pause.current == 'on' then
  386.         idleSet = { } --leave this empty
  387.         state.Auto_Kite:set(false)
  388.     end
  389.     if state.CP.current == 'on' then
  390.         equip(sets.CP)
  391.         disable('back')
  392.     else
  393.         enable('back')
  394.     end
  395.     if state.Auto_Kite.value == true then
  396.        idleSet = set_combine(idleSet, sets.Kiting)
  397.     end
  398.     return idleSet
  399. end
  400.  
  401. function job_self_command(cmdParams, eventArgs)
  402.     gearinfo(cmdParams, eventArgs)
  403. end
  404.  
  405. -- Gearinfo Hooks
  406. function gearinfo(cmdParams, eventArgs)
  407.     if cmdParams[1] == 'gearinfo' then
  408.         if type(cmdParams[4]) == 'string' then
  409.             if cmdParams[4] == 'true' then
  410.                 moving = true
  411.             elseif cmdParams[4] == 'false' then
  412.                 moving = false
  413.             end
  414.         end
  415.         if not midaction() then
  416.             job_update()
  417.         end
  418.     end
  419. end
  420.  
  421. function check_moving()
  422.     if state.DefenseMode.value == 'None'  and state.Kiting.value == false then
  423.         if state.Auto_Kite.value == false and moving then
  424.             state.Auto_Kite:set(true)
  425.         elseif state.Auto_Kite.value == true and moving == false then
  426.             state.Auto_Kite:set(false)
  427.         end
  428.     end
  429. end
  430.  
  431. -- Modify the default melee set after it was constructed.
  432. function customize_melee_set(meleeSet)
  433.     if buffactive['Terror'] or buffactive['Petrification'] or buffactive['Stun'] or buffactive['Sleep']  then
  434.         meleeSet = sets.EmergencyDT
  435.     end
  436.     if state.TreasureMode.value == 'Fulltime' then
  437.         meleeSet = set_combine(meleeSet, sets.TreasureHunter)
  438.     end
  439.     if state.Pause.current == 'on' then
  440.         meleeSet = { } --leave this empty
  441.         state.Auto_Kite:set(false)
  442.     end
  443.     if state.CP.current == 'on' then
  444.         meleeSet = set_combine(meleeSet, sets.CP)
  445.     end
  446.     if state.Buff.Berserk and not state.Buff.Retaliation then
  447.         meleeSet = set_combine(meleeSet, sets.buff.Berserk)
  448.     end
  449.     check_weaponset()
  450.     return meleeSet
  451. end
  452.  
  453. function check_buff(buff_name, eventArgs)
  454.     if state.Buff[buff_name] then
  455.         equip(sets.buff[buff_name] or {})
  456.         if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
  457.             equip(sets.TreasureHunter)
  458.         end
  459.         eventArgs.handled = true
  460.     end
  461. end
  462.  
  463. -------------------------------------------------------------------------------------------------------------------
  464. -- General hooks for other events.
  465. -------------------------------------------------------------------------------------------------------------------
  466.  
  467. -- Called when the player's status changes.
  468. function job_status_change(newStatus, oldStatus, eventArgs)
  469.     if newStatus == "Engaged" then
  470.         if buffactive.Berserk and not state.Buff.Retaliation then
  471.             equip(sets.buff.Berserk)
  472.         end
  473.     end
  474. end
  475.  
  476. -- Called when a player gains or loses a buff.
  477. function job_buff_change(buff, gain)
  478.     if state.Buff[buff] ~= nil then
  479.         handle_equipping_gear(player.status)
  480.     end
  481.     if buff == "Berserk" then
  482.         if gain and not buffactive['Retaliation'] then
  483.             equip(sets.buff.Berserk)
  484.         else
  485.             if not midaction() then
  486.                 handle_equipping_gear(player.status)
  487.             end
  488.         end
  489.     end
  490. end
  491.  
  492. function job_state_change(stateField, newValue, oldValue)
  493.     if state.WeaponLock.value == true then
  494.         disable('main','sub')
  495.     else
  496.         enable('main','sub')
  497.     end
  498.  
  499.     check_weaponset()
  500. end
  501.  
  502. -------------------------------------------------------------------------------------------------------------------
  503. -- User code that supplements self-commands.
  504. -------------------------------------------------------------------------------------------------------------------
  505.  
  506. function job_update(cmdParams, eventArgs)
  507.     handle_equipping_gear(player.status)
  508. end
  509.  
  510. -------------------------------------------------------------------------------------------------------------------
  511. -- Utility functions specific to this job.
  512. -------------------------------------------------------------------------------------------------------------------
  513.  
  514. function check_gear()
  515.     if no_swap_gear:contains(player.equipment.left_ring) then
  516.         disable("ring1")
  517.     else
  518.         enable("ring1")
  519.     end
  520.     if no_swap_gear:contains(player.equipment.right_ring) then
  521.         disable("ring2")
  522.     else
  523.         enable("ring2")
  524.     end
  525. end
  526.  
  527. function check_weaponset()
  528.     equip(sets[state.WeaponSet.current])
  529.     if player.sub_job ~= 'NIN' and player.sub_job ~= 'DNC' then
  530.        equip(sets.DefaultShield)
  531.     end
  532. end
  533.  
  534. windower.register_event('zone change',
  535.     function()
  536.         if no_swap_gear:contains(player.equipment.left_ring) then
  537.             enable("ring1")
  538.             equip(sets.idle.Town)
  539.         end
  540.         if no_swap_gear:contains(player.equipment.right_ring) then
  541.             enable("ring2")
  542.             equip(sets.idle.Town)
  543.         end
  544.     end
  545. )
  546.  
  547. function select_default_macro_book()
  548.     -- Default macro set/book
  549.     if player.sub_job == 'DNC' then
  550.         set_macro_page(1, 8)
  551.     elseif player.sub_job == 'SAM' then
  552.         set_macro_page(1, 8)
  553.     else
  554.         set_macro_page(1, 8)
  555.     end
  556. end
  557.  
  558. function set_lockstyle()
  559.     send_command('wait 2; input /lockstyleset ' .. lockstyleset)
  560. end
Add Comment
Please, Sign In to add comment