Advertisement
Falkirk

PUP lua

Dec 29th, 2017
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 18.35 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Initialization function that defines sets and variables to be used.
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. -- IMPORTANT: Make sure to also get the Mote-Include.lua file (and its supplementary files) to go with this.
  6.  
  7. -- Initialization function for this job file.
  8. function get_sets()
  9.   mote_include_version = 2
  10.   -- Load and initialize the include file.
  11.   include('Mote-Include.lua')
  12. end
  13.  
  14.  
  15. -- Setup vars that are user-independent.
  16. function job_setup()
  17.     -- List of pet weaponskills to check for
  18.     petWeaponskills = S{"Slapstick", "Knockout", "Magic Mortar",
  19.         "Chimera Ripper", "String Clipper",  "Cannibal Blade", "Bone Crusher", "String Shredder",
  20.         "Arcuballista", "Daze", "Armor Piercer", "Armor Shatterer"}
  21.    
  22.     -- Map automaton heads to combat roles
  23.     petModes = {
  24.         ['Harlequin Head'] = 'Melee',
  25.         ['Sharpshot Head'] = 'Ranged',
  26.         ['Valoredge Head'] = 'Tank',
  27.         ['Stormwaker Head'] = 'Magic',
  28.         ['Soulsoother Head'] = 'Heal',
  29.         ['Spiritreaver Head'] = 'Nuke'
  30.         }
  31.  
  32.     -- Subset of modes that use magic
  33.     magicPetModes = S{'Nuke','Heal','Magic'}
  34.    
  35.     -- Var to track the current pet mode.
  36.     state.PetMode = M{['description']='Pet Mode', 'None', 'Melee', 'Ranged', 'Tank', 'Magic', 'Heal', 'Nuke'}
  37.     update_pet_mode()
  38.  
  39.     -- Display Mode Info as on-screen Text
  40.     DisplayModeInfo = 'true'
  41.     TextBoxX = 950
  42.     TextBoxY = 47
  43.     TextSize = 10
  44.     display_mode_info()
  45. end
  46.  
  47.  
  48. -- Setup vars that are user-dependent.  Can override this function in a sidecar file.
  49. function user_setup()
  50.     -- Options: Override default values
  51.     state.OffenseMode:options('Normal', 'MedAcc', 'HighAcc')
  52.     state.HybridMode:options('Normal', 'Hybrid')
  53.     state.WeaponskillMode:options('Normal', 'WSMedAcc', 'WSHighAcc')
  54.     state.CastingMode:options('Normal')
  55.     state.IdleMode:options('Normal', 'Reraise', 'Regen', 'Refresh')
  56.     state.RestingMode:options('Normal')
  57.     state.PhysicalDefenseMode:options('PetPDT', 'PDT')
  58.     state.MagicalDefenseMode:options('MDTShell', 'PetMDT')
  59.  
  60.     -- 'Out of Range' distance; WS will auto-cancel
  61.     target_distance = 7
  62.  
  63.     -- Default maneuvers 1, 2, 3 and 4 for each pet mode.
  64.     defaultManeuvers = {
  65.         ['Melee'] = {'Fire Maneuver', 'Thunder Maneuver', 'Wind Maneuver', 'Light Maneuver'},
  66.         ['Ranged'] = {'Wind Maneuver', 'Fire Maneuver', 'Thunder Maneuver', 'Light Maneuver'},
  67.         ['Tank'] = {'Earth Maneuver', 'Dark Maneuver', 'Light Maneuver', 'Wind Maneuver'},
  68.         ['Magic'] = {'Ice Maneuver', 'Light Maneuver', 'Dark Maneuver', 'Earth Maneuver'},
  69.         ['Heal'] = {'Light Maneuver', 'Dark Maneuver', 'Water Maneuver', 'Earth Maneuver'},
  70.         ['Nuke'] = {'Ice Maneuver', 'Dark Maneuver', 'Light Maneuver', 'Earth Maneuver'}
  71.     }
  72.  
  73.     send_command('@wait 5;input /lockstyleset 20')
  74. end
  75.  
  76. -- Called when this job file is unloaded (eg: job change)
  77. function file_unload()
  78.     if binds_on_unload then
  79.         binds_on_unload()
  80.     end
  81.  
  82.     -- Removes any Text Info Boxes
  83.     send_command('text PDTModeText delete')
  84.     send_command('text AccuracyText delete')
  85. end
  86.  
  87.  
  88. -- Define sets used by this job file.
  89. function init_gear_sets()
  90.  
  91.     Pet_PDT_head = "Anwig Salade"
  92.     Pet_PDT_body = {name="Taeon Tabard", augments={'Pet: Mag. Evasion+22','Pet: "Regen"+3','Pet: Damage taken -4%',}}
  93.     Pet_PDT_hands = {name="Taeon Gloves", augments={'Pet: Mag. Evasion+25','Pet: "Regen"+3','Pet: Damage taken -4%',}}
  94.     Pet_PDT_legs = "Foire Churidars +3"
  95.     Pet_PDT_feet = {name="Taeon Boots", augments={'Pet: Mag. Evasion+22','Pet: "Regen"+3','Pet: Damage taken -4%',}}
  96.     Pet_PDT_back = {name="Visucius's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Pet: "Regen"+10',}}
  97.  
  98.     Pet_Melee_head = {name="Herculean Helm", augments={'Pet: Accuracy+25 Pet: Rng. Acc.+25','Pet: "Dbl. Atk."+3','Pet: Attack+15 Pet: Rng.Atk.+15',}}
  99.     Pet_Melee_body = {name="Herculean Vest", augments={'Pet: Accuracy+30 Pet: Rng. Acc.+30','Pet: "Dbl. Atk."+4','Pet: Attack+10 Pet: Rng.Atk.+10',}}
  100.     Pet_Melee_hands = {name="Herculean Gloves", augments={'Pet: Accuracy+29 Pet: Rng. Acc.+29','Pet: "Dbl. Atk."+3','Pet: STR+10','Pet: "Mag.Atk.Bns."+10',}}
  101.     Pet_Melee_legs = {name="Herculean Trousers", augments={'Pet: Accuracy+30 Pet: Rng. Acc.+30','Pet: "Store TP"+9','Pet: Attack+10 Pet: Rng.Atk.+10',}}
  102.     Pet_Melee_feet = "Naga Kyahan"
  103.     Pet_Melee_back = {name="Visucius's Mantle", augments={'Pet: Acc.+20 Pet: R.Acc.+20 Pet: Atk.+20 Pet: R.Atk.+20','Accuracy+20 Attack+20','Pet: Haste+10',}}
  104.  
  105.     Hybrid_head = {name="Taeon Chapeau", augments={'Accuracy+24','Pet: "Regen"+3','Pet: Damage taken -4%',}}
  106.  
  107.     Enmity_back = {name="Visucius's Mantle", augments={'Enmity+10',}}
  108.  
  109.     sets.PetEnmity = {head="Heyoka Cap",ear1="Rimeice Earring",ear2="Domesticator's Earring",
  110.         body="Heyoka Harness",hands="Heyoka Mittens",
  111.         legs="Heyoka Subligar +1",feet="Heyoka Leggings"}
  112.  
  113.     -- PRECAST GEAR SETS
  114.     sets.precast.JA['Tactical Switch'] = {feet="Cirque Scarpe +2"}
  115.     sets.precast.JA['Overdrive'] = {body="Pitre Tobe +1"}
  116.     sets.precast.JA['Ventriloquy'] = {legs="Pitre Churidars +1"}
  117.     sets.precast.JA['Role Reversal'] = {feet="Pitre Babouches +1"}
  118.     sets.precast.JA['Repair'] = {main="Nibiru Sainti",ear1="Guignol Earring",ear2="Pratik Earring",body="Foire Tobe +1",feet="Foire Babouches +3"}
  119.     sets.precast.JA.Maneuver = {main="Midnights",neck="Buffoon's Collar +1",body="Cirque Farsetto +2",hands="Foire Dastanas +3",
  120.         back="Visucius's Mantle"}
  121.  
  122.     sets.precast.JA.Provoke = {main="Nibiru Sainti",
  123.         neck="Unmoving Collar +1",ear1="Trux Earring",ear2="Cryptic Earring",
  124.         body="Passion Jacket",hands="Kurys Gloves",ring1="Provocare Ring",ring2="Eihwaz Ring",
  125.         back=Enmity_back,legs="Obatala Subligar",feet="Rager Ledelsens +1"}
  126.  
  127.     sets.precast.Step = {}
  128.     sets.precast.Step['Box Step'] = {
  129.         neck="Ziel Charm",ear1="Choreia Earring",
  130.         body="Thaumas Coat",ring1="Rajas Ring",ring2="Oneiros Annulet",
  131.         back="Visucius's Mantle"}
  132.  
  133.     sets.precast.Flourish1 = {}
  134.     sets.precast.Flourish1['Violent Flourish'] = {legs="Iuitl Tights",feet="Iuitl Gaiters"}
  135.  
  136.     -- CURING/DIVINE WALTZ
  137.     sets.precast.Waltz = {
  138.         head="Whirlpool Mask",ear1="Roundel Earring",
  139.         body="Otronif Harness",hands="Otronif Gloves",ring1="Spiral Ring",
  140.         back="Iximulew Cape",legs="Nahtirah Trousers",feet="Thurandaut Boots +1"}
  141.        
  142.     -- FAST CAST PRECAST GEAR
  143.     sets.precast.FC = {head="Haruspex Hat",ear2="Loquacious Earring",hands="Thaumas Gloves"}
  144.     sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads"})
  145.  
  146.     -- WEAPONSKILL SETS
  147.     -- Default set for any weaponskill that isn't more specifically defined:
  148.     sets.precast.WS = {
  149.         head="Lilitu Headpiece",neck="Fotia Gorget",ear1="Moonshade Earring",ear2="Brutal Earring",
  150.         body="Rawhide Vest",hands="Pitre Dastanas +1",ring1="Ifrit Ring +1",ring2="Spiral Ring",
  151.         back="Rancorous Mantle",waist="Fotia Belt",legs="Foire Churidars +3",feet="Foire Babouches +3"}
  152.  
  153.     -- Specific weaponskill sets:
  154.     sets.precast.WS['Victory Smite'] = set_combine(sets.precast.WS, {neck="Rancor Collar",ear1="Brutal Earring",ear2="Moonshade Earring",
  155.         waist="Thunder Belt"})
  156.  
  157.     -- MIDCAST SETS
  158.     sets.midcast.FastRecast = {
  159.         head="Taeon Chapeau",ear1="Enchanter Earring +1",ear2="Loquacious Earring",
  160.         body="Taeon Tabard",hands="Regimen Mittens",ring1="Prolix Ring",ring2="Defending Ring",
  161.         legs="Taeon Tights",feet="Taeon Boots"}
  162.        
  163.     -- PET MIDCAST SETS
  164.     sets.midcast.Pet.Cure = {legs="Foire Churidars +3"}
  165.  
  166.     -- sets.midcast.Pet.Weaponskill = {head="Karagoz Cappello",hands="Cirque Guanti +2",back="Visucius's Cape",
  167.     --  legs="Cirque Pantaloni +2"}
  168.    
  169.     -- RESTING SETS
  170.     sets.resting = {head="Foire Taj +1",neck="Wiglen Gorget",
  171.         ring1="Sheltered Ring",ring2="Paguroidea Ring"}
  172.  
  173.     -- DEFENSE SETS
  174.     sets.defense.PDT = {
  175.         range="Animator P +1",ammo="Automat. Oil +3",
  176.         head="Uk'uxkaj Cap",neck="Loricate Torque +1",ear1="Genmei Earring",
  177.         body="Otronif Harness +1",hands="Kurys Gloves",ring1="Patricius Ring",ring2="Defending Ring",
  178.         back="Umbra Cape",waist="Resolute Belt",legs="Otronif Brais +1",feet="Otronif Boots +1"}
  179.  
  180.     sets.defense.PetPDT = {main="Condemners",
  181.         range="Animator P +1",ammo="Automat. Oil +3",
  182.         head=Pet_PDT_head,neck="Shepherd's Chain",ear1="Rimeice Earring",ear2="Enmerkar Earring",
  183.         body=Pet_PDT_body,hands=Pet_PDT_hands,ring1="Thurandaut Ring +1",ring2="Overbearing Ring",
  184.         back=Pet_PDT_back,waist="Isa Belt",legs=Pet_PDT_legs,feet=Pet_PDT_feet}
  185.  
  186.     sets.defense.MDTShell = {
  187.         range="Animator P +1",ammo="Automat. Oil +3",
  188.         head="Uk'uxkaj Cap",neck="Loricate Torque +1",ear1="Sanare Earring",ear2="Etiolation Earring",
  189.         body="Otronif Harness +1",hands="Otronif Gloves",ring1="Shadow Ring",ring2="Defending Ring",
  190.         back="Solemnity Cape",waist="Resolute Belt",legs="Otronif Brais +1",feet="Otronif Boots +1"}
  191.  
  192.     sets.Kiting = {feet="Hermes' Sandals"}
  193.  
  194.     -- IDLE SET
  195.     sets.idle = {range="Animator P +1",ammo="Automat. Oil +3",
  196.         head="Pitre Taj +1",neck="Bathy Choker +1",ear1="Infused Earring",ear2="Dawn Earring",
  197.         body="Otronif Harness +1",hands="Garden Bangles",ring1="Sheltered Ring",ring2="Paguroidea Ring",
  198.         back=Pet_PDT_back,waist="Isa Belt",legs=Pet_PDT_legs,feet="Hermes' Sandals"}
  199.  
  200.     -- PET IDLE SET (eg: pet regen gear)
  201.     sets.idle.Pet = {range="Animator P +1",ammo="Automat. Oil +3",
  202.         head="Pitre Taj +1",neck="Empath Necklace",ear1="Rimeice Earring",ear2="Domesticator's Earring",
  203.         body=Pet_PDT_body,hands=Pet_PDT_hands,ring1="Paguroidea Ring",ring2="Sheltered Ring",
  204.         back=Pet_PDT_back,waist="Isa Belt",legs=Pet_PDT_legs,feet="Hermes' Sandals"}
  205.  
  206.     sets.idle.Pet.Engaged = {main="Ohtas",range="Animator P +1",ammo="Automat. Oil +3",
  207.         head="Heyoka Cap",neck="Shulmanu Collar",ear1="Rimeice Earring",ear2="Domesticator's Earring",
  208.         body="Heyoka Harness",hands="Heyoka Mittens",ring1="Varar Ring +1",ring2="Varar Ring +1",
  209.         back=Pet_Melee_back,waist="Incarnation Sash",legs="Heyoka Subligar +1",feet="Heyoka Leggings"}
  210.  
  211.     --sets.AutomatonWS = {
  212.     --  head="Karagoz Capello",neck="Empath Necklace",ear1="Ruby Earring",ear2="Domesticator's Earring",
  213.     --  body="Pitre Tobe +1",hands=Pet_Melee_hands,ring1="Thurandaut Ring +1",ring2="Angel's Ring",
  214.     --  back="Visucius's Mantle",waist="Incarnation Sash",legs=Pet_Melee_legs,feet=Pet_Melee_feet}
  215.  
  216.     -- ENGAGED SETS
  217.     sets.engaged = {
  218.         head="Lilitu Headpiece",neck="Clotharius Torque",ear1="Trux Earring",ear2="Brutal Earring",
  219.         body="Herculean Vest",hands="Herculean Gloves",ring1="Rajas Ring",ring2="Epona's Ring",
  220.         back="Visucius's Mantle",waist="Windbuffet Belt +1",legs="Herculean Trousers",feet="Otronif Boots +1"}
  221. end
  222.  
  223. -------------------------------------------------------------------------------------------------------------------
  224. -- Job-specific hooks that are called to process player actions at specific points in time.
  225. -------------------------------------------------------------------------------------------------------------------
  226.  
  227. -- Called when player is about to perform an action
  228. function job_precast(spell, action, spellMap, eventArgs)
  229.     if spell.english == 'Activate' then
  230.         local abil_recasts = windower.ffxi.get_ability_recasts()
  231.         if abil_recasts[spell.recast_id] > 0 then
  232.             send_command('input /ja "Deus Ex Automata" <me>')
  233.             add_to_chat(28, 'Activate timer is not ready - Using [Deus Ex Automata]!')
  234.             eventArgs.cancel = true
  235.             return
  236.         end
  237.         job_update()
  238.     end
  239.  
  240.     if spell.type == "WeaponSkill" and spell.target.distance > target_distance then
  241.         cancel_spell()
  242.         add_to_chat(123, spell.name..' Canceled: [Out of Range]')
  243.         handle_equipping_gear(player.status)
  244.         return
  245.     end
  246. end
  247.  
  248. -- Called when pet is about to perform an action
  249. function job_pet_midcast(spell, action, spellMap, eventArgs)
  250.     --if petWeaponskills:contains(spell.english) then
  251.     --    classes.CustomClass = "Weaponskill"
  252.     --end
  253.  
  254.     if spell.english == 'Provoke' then
  255.         send_command('timers c "Strobe:Provoke" 30 up abilities/00002.png')
  256.     elseif spell.english == 'Flash' then
  257.         send_command('timers c "Flashbulb:Flash" 45 up abilities/00002.png')
  258.     end
  259.  
  260.     --handle_equipping_gear(player.status)
  261. end
  262.  
  263. function job_pet_aftercast(spell, action, spellMap, eventArgs)
  264.     eventArgs.handled = true
  265. end
  266.  
  267. -------------------------------------------------------------------------------------------------------------------
  268. -- Customization hook for idle sets.
  269. -------------------------------------------------------------------------------------------------------------------
  270.  
  271. function customize_idle_set(idleSet)
  272.     return idleSet
  273. end
  274.  
  275. -------------------------------------------------------------------------------------------------------------------
  276. -- General hooks for other game events.
  277. -------------------------------------------------------------------------------------------------------------------
  278. function job_buff_change(buff, gain)
  279.     if buff == 'Wind Maneuver' then
  280.         handle_equipping_gear(player.status)
  281.     end
  282. end
  283.  
  284. -- Called when a player gains or loses a pet.
  285. function job_pet_change(pet, gain)
  286.     update_pet_mode()
  287. end
  288.  
  289. -- Called when the pet's status changes.
  290. function job_pet_status_change(newStatus, oldStatus)
  291.     if newStatus == 'Engaged' or newStatus == 'Idle' then
  292.         handle_equipping_gear(player.status)
  293.     end
  294. end
  295.  
  296. -------------------------------------------------------------------------------------------------------------------
  297. -- User code that supplements self-commands.
  298. -------------------------------------------------------------------------------------------------------------------
  299.  
  300. -- Called any time we attempt to handle automatic gear equips (ie: engaged or idle gear).
  301. function job_handle_equipping_gear(playerStatus, eventArgs)    
  302.     if player.equipment.back == 'Mecisto. Mantle' or player.equipment.back == 'Aptitude Mantle' or player.equipment.back == 'Aptitude Mantle +1' or player.equipment.back == 'Nexus Cape' then
  303.         disable('back')
  304.     else
  305.         enable('back')
  306.     end
  307. end
  308.  
  309. -- Called for custom player commands.
  310. function job_self_command(cmdParams, eventArgs)
  311.     if cmdParams[1]:lower() == 'gearhandle' then
  312.         handle_equipping_gear(player.status)
  313.     end
  314. end
  315.  
  316.  
  317. -- Called by the 'update' self-command, for common needs.
  318. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  319. function job_update(cmdParams, eventArgs)
  320.     update_pet_mode()
  321.     update_display_mode_info()
  322. end
  323.  
  324.  
  325. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  326. function display_current_job_state(eventArgs)
  327.     local msg = 'Melee'
  328.    
  329.     if state.CombatForm.has_value then
  330.         msg = msg .. ' (' .. state.CombatForm.value .. ')'
  331.     end
  332.    
  333.     msg = msg .. ': '
  334.    
  335.     msg = msg .. state.OffenseMode.value
  336.     if state.HybridMode.value ~= 'Normal' then
  337.         msg = msg .. '/' .. state.HybridMode.value
  338.     end
  339.     msg = msg .. ', WS: ' .. state.WeaponskillMode.value
  340.    
  341.     if state.DefenseMode.value ~= 'None' then
  342.         msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')'
  343.     end
  344.    
  345.     if state.Kiting.value then
  346.         msg = msg .. ', Kiting'
  347.     end
  348.  
  349.     add_to_chat(122, msg)
  350.  
  351.     eventArgs.handled = true
  352.  
  353.     display_pet_status()
  354. end
  355.  
  356.  
  357. -------------------------------------------------------------------------------------------------------------------
  358. -- Utility functions specific to this job.
  359. -------------------------------------------------------------------------------------------------------------------
  360.  
  361. -- Get the pet mode value based on the equipped head of the automaton.
  362. -- Returns nil if pet is not valid.
  363. function get_pet_mode()
  364.     if pet.isvalid then
  365.         return petModes[pet.head] or 'None'
  366.     else
  367.         return 'None'
  368.     end
  369. end
  370.  
  371. -- Update state.PetMode, as well as functions that use it for set determination.
  372. function update_pet_mode()
  373.     state.PetMode:set(get_pet_mode())
  374.     update_custom_groups()
  375. end
  376.  
  377. -- Update custom groups based on the current pet.
  378. function update_custom_groups()
  379.     classes.CustomIdleGroups:clear()
  380.     if pet.isvalid then
  381.         classes.CustomIdleGroups:append(state.PetMode.value)
  382.     end
  383. end
  384.  
  385. -- Display current pet status.
  386. function display_pet_status()
  387.     if pet.isvalid then
  388.     local petInfoString = pet.name..' ['..pet.head..']: '..tostring(pet.status)..'  TP='..tostring(pet.tp)..'  HP%='..tostring(pet.hpp)
  389.  
  390.     if magicPetModes:contains(state.PetMode) then
  391.         petInfoString = petInfoString..'  MP%='..tostring(pet.mpp)
  392.     end
  393.  
  394.     --add_to_chat(122,petInfoString)
  395.     end
  396. end
  397.  
  398. function display_mode_info()
  399.     if DisplayModeInfo == 'true' then
  400.         send_command('text AccuracyText create Acc. Mode: Normal')
  401.         send_command('text AccuracyText pos '..TextBoxX..' '..TextBoxY..'')
  402.         send_command('text AccuracyText size '..TextSize..'')
  403.         TextBoxY = TextBoxY + (TextSize + 6)
  404.         send_command('text PDTModeText create PDT Mode: PetPDT')
  405.         send_command('text PDTModeText pos '..TextBoxX..' '..TextBoxY..'')
  406.         send_command('text PDTModeText size '..TextSize..'')
  407.     end
  408. end
  409.  
  410. function update_display_mode_info()
  411.     if DisplayModeInfo == 'true' then
  412.         send_command('text AccuracyText text Acc. Mode: '..state.OffenseMode.value..'')
  413.         send_command('text PDTModeText text PDT Mode: '..state.PhysicalDefenseMode.value..'')
  414.     end
  415. end
  416.  
  417. windower.raw_register_event('action',function (act)
  418.     local actor = windower.ffxi.get_mob_by_id(act.actor_id)    
  419.     local self = windower.ffxi.get_player()
  420.     local target_count = act.target_count
  421.     local category = act.category  
  422.     local param = act.param
  423.     local recast = act.recast  
  424.     local targets = act.targets
  425.     local primarytarget = windower.ffxi.get_mob_by_id(targets[1].id)
  426.     local valid_target = act.valid_target
  427.     local pet = windower.ffxi.get_mob_by_target('pet')
  428.     -- print(actor.name,category,param)
  429.     --[[
  430.     [1945] = {id=1945,en="Provoke",ja="挑発"},
  431.     [1946] = {id=1946,en="Shock Absorber",ja="S.アブソーバー"},
  432.     [1947] = {id=1947,en="Flashbulb",ja="フラッシュバルブ"},
  433.     ]]
  434.     if actor and pet and actor.id == pet.id and (param == 1944 or param == 1945 or param == 1947) then
  435.         windower.send_command('lua c gearswap c gearhandle')
  436.     end
  437. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement