Advertisement
suteru

Suteru's COR 7/5

Jul 5th, 2015
1,952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 24.30 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Setup functions for this job.  Generally should not be modified.
  3. -------------------------------------------------------------------------------------------------------------------
  4.  
  5. --[[
  6.     gs c toggle luzafring -- Toggles use of Luzaf Ring on and off
  7.    
  8.     Offense mode is melee or ranged.  Used ranged offense mode if you are engaged
  9.     for ranged weaponskills, but not actually meleeing.
  10.     Acc on offense mode (which is intended for melee) will currently use .Acc weaponskill
  11.     mode for both melee and ranged weaponskills.  Need to fix that in core.
  12. --]]
  13.  
  14.  
  15. -- Initialization function for this job file.
  16. function get_sets()
  17.     mote_include_version = 2
  18.    
  19.     -- Load and initialize the include file.
  20.     include('Mote-Include.lua')
  21. end
  22.  
  23. -- Setup vars that are user-independent.  state.Buff vars initialized here will automatically be tracked.
  24. function job_setup()
  25.     -- Whether to use Luzaf's Ring
  26.     state.LuzafRing = M(false, "Luzaf's Ring")
  27.     -- Detect Triple Shot
  28.     state.Buff['Triple Shot'] = buffactive['Triple Shot'] or false
  29.     -- Whether a warning has been given for low ammo
  30.     state.warned = M(false)
  31.     state.Obi = 'ON' -- Turn Default Obi ON or OFF Here --
  32.  
  33.     define_roll_values()
  34. end
  35.  
  36. -------------------------------------------------------------------------------------------------------------------
  37. -- User setup functions for this job.  Recommend that these be overridden in a sidecar file.
  38. -------------------------------------------------------------------------------------------------------------------
  39.  
  40. -- Setup vars that are user-dependent.  Can override this function in a sidecar file.
  41. function user_setup()
  42.     state.OffenseMode:options('Ranged', 'Melee', 'Acc')
  43.     state.RangedMode:options('Normal', 'Acc')
  44.     state.WeaponskillMode:options('Normal', 'Acc', 'Att', 'Mod')
  45.     state.CastingMode:options('Normal', 'Resistant')
  46.     state.IdleMode:options('Normal', 'PDT', 'Refresh')
  47.  
  48.     gear.RAbullet = "Adlivun Bullet"
  49.     gear.WSbullet = "Eminent Bullet"
  50.     gear.MAbullet = "Bronze Bullet"
  51.     gear.QDbullet = "Animikii Bullet"
  52.     gear.WScape = {name="Gunslinger's Cape", augments={'"Mag.Atk.Bns."+5','Enmity-1','"Phantom Roll" ability delay -1','Weapon skill damage +4%'}}
  53.     gear.PRcape = {name="Gunslinger's Cape", augments={'"Mag.Atk.Bns."+1','Enmity-2','"Phantom Roll" ability delay -5'}}
  54.     options.ammo_warning_limit = 15
  55.  
  56.  
  57.     -- Additional local binds
  58. end
  59.  
  60.  
  61. -- Called when this job file is unloaded (eg: job change)
  62. function user_unload()
  63. end
  64.  
  65. -- Define sets and vars used by this job file.
  66. function init_gear_sets()
  67.     --------------------------------------
  68.     -- Start defining the sets
  69.     --------------------------------------
  70.    
  71.     -- Precast Sets
  72.  
  73.     -- Precast sets to enhance JAs
  74.    
  75.     sets.precast.JA['Triple Shot'] = {body="Chasseur's Frac +1"}
  76.     sets.precast.JA['Snake Eye'] = {legs="Lanun Culottes +1"}
  77.     sets.precast.JA['Wild Card'] = {feet="Lanun Bottes +1"}
  78.     sets.precast.JA['Random Deal'] = {body="Lanun Frac +1"}
  79.    
  80.         sets.Obi = {}
  81.     sets.Obi.Thunder = {waist='Hachirin-no-Obi'}
  82.     sets.Obi.Water = {waist='Hachirin-no-Obi'}
  83.     sets.Obi.Fire = {waist='Hachirin-no-Obi'}
  84.     sets.Obi.Ice = {waist='Hachirin-no-Obi'}
  85.     sets.Obi.Wind = {waist='Hachirin-no-Obi'}
  86.     sets.Obi.Earth = {waist='Hachirin-no-Obi'}
  87.     sets.Obi.Light = {waist='Hachirin-no-Obi'}
  88.     sets.Obi.Dark = {waist='Hachirin-no-Obi'}
  89.  
  90.    
  91.     sets.precast.CorsairRoll = {head="Lanun Tricorne +1",hands="Chasseur's Gants +1", ring2="Barataria Ring", legs="Desultor Tassets", back=gear.PRcape}
  92.    
  93.     sets.precast.CorsairRoll["Caster's Roll"] = set_combine(sets.precast.CorsairRoll, {legs="Chas. Culottes +1"})
  94.     sets.precast.CorsairRoll["Courser's Roll"] = set_combine(sets.precast.CorsairRoll, {feet="Chass. Bottes +1"})
  95.     sets.precast.CorsairRoll["Blitzer's Roll"] = set_combine(sets.precast.CorsairRoll, {head="Chass. Tricorne +1"})
  96.     sets.precast.CorsairRoll["Tactician's Roll"] = set_combine(sets.precast.CorsairRoll, {body="Chasseur's Frac +1"})
  97.     sets.precast.CorsairRoll["Allies' Roll"] = set_combine(sets.precast.CorsairRoll, {hands="Chasseur's Gants +1"})
  98.    
  99.     sets.precast.LuzafRing = {ring1="Luzaf's Ring"}
  100.     sets.precast.FoldDoubleBust = {hands="Chasseur's Gants +1"}
  101.    
  102.     sets.precast.CorsairShot = {head="Blood Mask"}
  103.    
  104.  
  105.     -- Waltz set (chr and vit)
  106.     sets.precast.Waltz = {
  107.         head="Whirlpool Mask",
  108.         body="Iuitl Vest",hands="Iuitl Wristbands",
  109.         legs="Nahtirah Trousers",feet="Iuitl Gaiters +1"}
  110.        
  111.     -- Don't need any special gear for Healing Waltz.
  112.     sets.precast.Waltz['Healing Waltz'] = {}
  113.  
  114.     -- Fast cast sets for spells
  115.    
  116.     sets.precast.FC = {head="Haruspex Hat",ear2="Loquacious Earring",hands="Thaumas Gloves",ring1="Prolix Ring"}
  117.  
  118.     sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads"})
  119.  
  120.  
  121.     sets.precast.RA = {ammo=gear.RAbullet,
  122.         head="Pursuer's Beret",neck="Ocachi Gorget",ear1="Volley Earring",ear2="Clearview Earring",
  123.         body="Pursuer's Doublet",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Haverton Ring",
  124.         back=gear.WScape,waist="Impulse Belt",legs="Chas. Culottes +1",feet="Scopuli Nails +1"}
  125.  
  126.        
  127.     -- Weaponskill sets
  128.     -- Default set for any weaponskill that isn't any more specifically defined
  129.     sets.precast.WS = {
  130.         head="Lanun Tricorne +1",neck=gear.ElementalGorget,ear1="Steelflash Earring",ear2="Bladeborn Earring",
  131.         body="Lanun Frac +1",hands="Taeon Gloves",ring1="Stormsoul Ring",ring2="Garuda Ring",
  132.         back="Amemet Mantle +1",waist=gear.ElementalBelt,legs="Lanun Culottes +1",feet="Lanun Bottes +1"}
  133.  
  134.  
  135.     -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
  136.     sets.precast.WS['Evisceration'] = sets.precast.WS
  137.  
  138.     sets.precast.WS['Exenterator'] = set_combine(sets.precast.WS, {legs="Nahtirah Trousers"})
  139.  
  140.     sets.precast.WS['Requiescat'] = set_combine(sets.precast.WS, {legs="Nahtirah Trousers"})
  141.  
  142.     sets.precast.WS['Last Stand'] = {ammo=gear.WSbullet,
  143.         head="Lanun Tricorne +1",neck=gear.ElementalGorget,ear1="Moonshade Earring",ear2="Clearview Earring",
  144.         body="Pursuer's Doublet",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Garuda Ring",
  145.         back="Buquwik Cape",waist=gear.ElementalBelt,legs="Lanun Culottes +1",feet="Scopuli Nails +1"}
  146.  
  147.     sets.precast.WS['Last Stand'].Acc = {ammo=gear.WSbullet,
  148.         head="Lanun Tricorne +1",neck=gear.ElementalGorget,ear1="Moonshade Earring",ear2="Clearview Earring",
  149.         body="Pursuer's Doublet",hands="Pursuer's Cuffs",ring1="Rajas Ring",ring2="Garuda Ring",
  150.         back=gear.WScape,waist=gear.ElementalBelt,legs="Lanun Culottes +1",feet="Scopuli Nails +1"}
  151.  
  152.     sets.precast.WS['Wildfire'] = {ammo=gear.MAbullet,
  153.         head="Fugacity Beret +1",neck="Deviant Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
  154.         body="Rawhide Vest",hands="Pursurer's Cuffs",ring1="Arvina Ringlet +1",ring2=gear.ElementalRing,
  155.         back=gear.WScape,waist=gear.ElementalObi,legs="Shned. Tights +1",feet="Lanun Bottes +1"}
  156.  
  157.     sets.precast.WS['Wildfire'].Brew = {ammo=gear.MAbullet,
  158.         head="Fugacity Beret +1",neck="Deviant Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
  159.         body="Rawhide Vest",hands="Pursurer's Cuffs",ring1="Arvina Ringlet +1",ring2=gear.ElementalRing,
  160.         back=gear.WScape,waist=gear.ElementalObi,legs="Shned. Tights +1",feet="Lanun Bottes +1"}
  161.    
  162.     sets.precast.WS['Leaden Salute'] = {ammo=gear.MAbullet,
  163.         head="Pixie Hairpin +1",neck="Deviant Necklace",ear1="Moonshade Earring",ear2="Friomisi Earring",
  164.         body="Rawhide Vest",hands="Pursurer's Cuffs",ring1=gear.ElementalRing,ring2="Archon Ring",
  165.         back=gear.WScape,waist=gear.ElementalObi,legs="Shned. Tights +1",feet="Lanun Bottes +1"}
  166.        
  167.     sets.precast.WS['Aeolian Edge'] = {ammo=gear.QDbullet,
  168.         head="Fugacity Beret +1",neck="Deviant Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
  169.         body="Lanun Frac +1",hands="Thur. Gloves +1",ring1="Fenrir Ring +1",ring2=gear.ElementalRing,
  170.         back=gear.WScape,waist=gear.ElementalObi,legs="Shned. Tights +1",feet="Lanun Bottes +1"}
  171.    
  172.    
  173.     -- Midcast Sets
  174.     sets.midcast.FastRecast = {
  175.         head="Whirlpool Mask",
  176.         body="Iuitl Vest",hands="Iuitl Wristbands",
  177.         legs="Manibozho Brais",feet="Iuitl Gaiters +1"}
  178.        
  179.     -- Specific spells
  180.     sets.midcast.Utsusemi = sets.midcast.FastRecast
  181.  
  182.     sets.midcast.CorsairShot = {ammo=gear.QDbullet,
  183.         head="Blood Mask",neck="Deviant Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
  184.         body="Rawhide Vest",hands="Taeon Gloves",ring1="Fenrir Ring +1",ring2=gear.ElementalRing,
  185.         back=gear.WScape,waist=gear.ElementalObi,legs="Shned. Tights +1",feet="Chass. Bottes +1"}
  186.  
  187.     sets.midcast.CorsairShot.Acc = {ammo=gear.QDbullet,
  188.         head="Blood Mask",neck="Deviant Necklace",ear1="Lifestorm Earring",ear2="Psystorm Earring",
  189.         body="Chasseur's Frac +1",hands="Chasseur's Gants +1",ring1="Garuda Ring",ring2=gear.ElementalRing,
  190.         back=gear.WScape,waist=gear.ElementalObi,legs="Shned. Tights +1",feet="Chass. Bottes +1"}
  191.  
  192.     sets.midcast.CorsairShot['Light Shot'] = {ammo=gear.QDbullet,
  193.         head="Blood Mask",neck="Deviant Necklace",ear1="Lifestorm Earring",ear2="Psystorm Earring",
  194.         body="Chasseur's Frac +1",hands="Thur. Gloves +1",ring1="Stormsoul Ring",ring2="Garuda Ring",
  195.         back=gear.WScape,waist=gear.ElementalObi,legs="Lanun Culottes +1",feet="Chass. Bottes +1"}
  196.  
  197.     sets.midcast.CorsairShot['Dark Shot'] = sets.midcast.CorsairShot['Light Shot']
  198.  
  199.  
  200.     -- Ranged gear
  201.     sets.midcast.RA = {ammo=gear.RAbullet,
  202.         head="Pursuer's Beret",neck="Ocachi Gorget",ear1="Volley Earring",ear2="Clearview Earring",
  203.         body="Pursuer's Doublet",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Haverton Ring",
  204.         back=gear.WScape,waist="Impulse Belt",legs="Chas. Culottes +1",feet="Scopuli Nails +1"}
  205.        
  206.     sets.midcast.TS = {ammo=gear.RAbullet,
  207.         head="Chass. Tricorne +1",neck="Ocachi Gorget",ear1="Volley Earring",ear2="Clearview Earring",
  208.         body="Chasseur's Frac +1",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Haverton Ring",
  209.         back=gear.WScape,waist="Impulse Belt",legs="Chas. Culottes +1",feet="Scopuli Nails +1"}
  210.  
  211.     sets.midcast.RA.Acc = {ammo=gear.RAbullet,
  212.         head="Chass. Tricorne +1",neck="Iqabi Necklace",ear1="Volley Earring",ear2="Clearview Earring",
  213.         body="Chasseur's Frac +1",hands="Buremte Gloves",ring1="Hajduk Ring",ring2="Haverton Ring",
  214.         back=gear.WScape,waist="Eschan Stone",legs="Lanun Culottes +1",feet="Scopuli Nails +1"}
  215.    
  216.  
  217.  
  218.    
  219.     -- Sets to return to when not performing an action.
  220.    
  221.     -- Resting sets
  222.     sets.resting = {neck="Wiglen Gorget",ring1="Sheltered Ring",ring2="Paguroidea Ring"}
  223.    
  224.  
  225.     -- Idle sets
  226.     sets.idle = {ammo=gear.RAbullet,
  227.         head="Chass. Tricorne +1",neck="Deviant Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
  228.         body="Mekosu. Harness",hands="Pursuer's Cuffs",ring1="Rajas Ring",ring2="Haverton Ring",
  229.         back=gear.WScape,waist="Eschan Stone",legs="Lanun Culottes +1",feet="Lanun Bottes +1"}
  230.  
  231.     sets.idle.Town = {ammo=gear.QDbullet,
  232.         head="Chass. Tricorne +1",neck="Deviant Necklace",ear1="Novio Earring",ear2="Friomisi Earring",
  233.         body="Pursuer's Doublet",hands="Pursuer's Cuffs",ring1="Rajas Ring",ring2="Haverton Ring",
  234.         back=gear.WScape,waist="Eschan Stone",legs="Chas. Culottes +1",feet="Chass. Bottes +1"}
  235.        
  236.  
  237.     -- Defense sets
  238.     sets.defense.PDT = {
  239.         head="Fugacity Beret +1",neck="Twilight Torque",
  240.         body="Lanun Frac +1",hands="Taeon Gloves",ring1="Jelly Ring",ring2="Archonm Ring",
  241.         back="Iximulew Cape",waist="Flume Belt",legs="Chas. Culottes +1",feet="Lanun Bottes +1"}
  242.  
  243.     sets.defense.MDT = {
  244.     head="Fugacity Beret +1",neck="Twilight Torque",
  245.         body="Lanun Frac +1",hands="Taeon Gloves",ring1="Minerva's Ring",ring2="Archonm Ring",
  246.         back="Shadow Mantle",waist="Flume Belt",legs="Chas. Culottes +1",feet="Chass. Bottes +1"}
  247.    
  248.  
  249.     sets.Kiting = {feet="Skadi's Jambeaux +1"}
  250.     -- buff sets
  251.      sets.buff['Triple Shot'] = {body="Chasseur's Frac +1"}
  252.     -- Engaged sets
  253.  
  254.     -- Variations for TP weapon and (optional) offense/defense modes.  Code will fall back on previous
  255.     -- sets if more refined versions aren't defined.
  256.     -- If you create a set with both offense and defense modes, the offense mode should be first.
  257.     -- EG: sets.engaged.Dagger.Accuracy.Evasion
  258.    
  259.     -- Normal melee group
  260.     sets.engaged.Melee = {ammo=gear.RAbullet,
  261.         head="Taeon Chapeau",neck="Iqabi Necklace",ear1="Steelflash Earring",ear2="Bladeborn Earring",
  262.         body="Mekosu. Harness",hands="Chasseur's Gants +1",ring1="Rajas Ring",ring2="Mars's Ring",
  263.         back="Bleating Mantle",waist="Windbuffet Belt",legs="Taeon Tights",feet="Lanun Bottes +1"}
  264.    
  265.     sets.engaged.Acc = {ammo=gear.RAbullet,
  266.         head="Ejekamal Mask",neck="Iqabi Necklace",ear1="Steelflash Earring",ear2="Bladeborn Earring",
  267.         body="Mekosu. Harness",hands="Chasseur's Gants +1",ring1="Rajas Ring",ring2="Mars's Ring",
  268.         back="Bleating Mantle",waist="Windbuffet Belt",legs="Kaabnax Trousers",feet="Lanun Bottes +1"}
  269.  
  270.     sets.engaged.Melee.DW = {ammo=gear.RAbullet,
  271.         head="Taeon Chapeau",neck="Iqabi Necklace",ear1="Steelflash Earring",ear2="Suppanomimi",
  272.         body="Lanun Frac +1",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Mars's Ring",
  273.         back="Bleating Mantle",waist="Windbuffet Belt",legs="Taeon Tights",feet="Lanun Bottes +1"}
  274.  
  275.     sets.engaged.Acc.DW = {ammo=gear.RAbullet,
  276.         head="Ejekamal Mask",neck="Iqabi Necklace",ear1="Steelflash Earring",ear2="Suppanomimi",
  277.         body="Lanun Frac +1",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Mars's Ring",
  278.         back="Bleating Mantle",waist="Windbuffet Belt",legs="Kaabnax Trousers",feet="Lanun Bottes +1"}
  279.  
  280.     sets.engaged.Ranged = {ammo=gear.RAbullet,
  281.         head="Pursuer's Beret. Tricorne +1",neck="Ocachi Gorget",ear1="Clearview Earring",ear2="Volley Earring",
  282.         body="Pursuer's Doublet",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Haverton Ring",
  283.         back=gear.WScape,waist="Impulse Belt",legs="Chas. Culottes +1",feet="Scopuli Nails +1"}
  284.        
  285.     sets.engaged.TS = {ammo=gear.RAbullet,
  286.         head="Chass. Tricorne +1",neck="Ocachi Gorget",ear1="Clearview Earring",ear2="Volley Earring",
  287.         body="Chasseur's Frac +1",hands="Lanun Gants +1",ring1="Rajas Ring",ring2="Haverton Ring",
  288.         back=gear.WScape,waist="Impulse Belt",legs="Chas. Culottes +1",feet="Scopuli Nails +1"}
  289. end
  290.  
  291. -------------------------------------------------------------------------------------------------------------------
  292. -- Job-specific hooks for standard casting events.
  293. -------------------------------------------------------------------------------------------------------------------
  294.  
  295. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  296. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  297. function job_precast(spell, action, spellMap, eventArgs)
  298.     -- Check that proper ammo is available if we're using ranged attacks or similar.
  299.     if spell.action_type == 'Ranged Attack' or spell.type == 'WeaponSkill' or spell.type == 'CorsairShot' then
  300.         do_bullet_checks(spell, spellMap, eventArgs)
  301.     end
  302.     -- Define proper defaults for weaponskills that use obis
  303.     if spell.english == 'Leaden Salute' then
  304.         gear.default.obi_waist = "Eschan Stone"
  305.         gear.default.obi_ring = "Arvina Ringlet +1"
  306.     elseif spell.english == 'Wildfire' then
  307.         gear.default.obi_waist = "Eschan Stone"
  308.         gear.default.obi_ring = "Garuda Ring"
  309.     elseif spell.type == 'CorsairShot' then
  310.         gear.default.obi_waist = "Eschan Stone"
  311.         gear.default.obi_ring = "Fenrir Ring +1"
  312.     end
  313.     -- gear sets
  314.     if (spell.type == 'CorsairRoll' or spell.english == "Double-Up") and state.LuzafRing.value then
  315.         equip(sets.precast.LuzafRing)
  316.     elseif spell.type == 'CorsairShot' and state.CastingMode.value == 'Resistant' then
  317.         classes.CustomClass = 'Acc'
  318.     elseif spell.english == 'Fold' and buffactive['Bust'] == 2 then
  319.         if sets.precast.FoldDoubleBust then
  320.             equip(sets.precast.FoldDoubleBust)
  321.             eventArgs.handled = true
  322.         end
  323.     end
  324. end
  325.  
  326.  
  327. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  328. function job_aftercast(spell, action, spellMap, eventArgs)
  329.     if spell.type == 'CorsairRoll' and not spell.interrupted then
  330.         display_roll_info(spell)
  331.     end
  332. end
  333.  
  334. -------------------------------------------------------------------------------------------------------------------
  335. -- User code that supplements standard library decisions.
  336. -------------------------------------------------------------------------------------------------------------------
  337.  
  338. -- Return a customized weaponskill mode to use for weaponskill sets.
  339. -- Don't return anything if you're not overriding the default value.
  340. function get_custom_wsmode(spell, spellMap, default_wsmode)
  341.     if buffactive['Transcendancy'] then
  342.         return 'Brew'
  343.     end
  344. end
  345.  
  346.  
  347. -- Called by the 'update' self-command, for common needs.
  348. -- Set eventArgs.handled to true if we don't want automatic equipping of gear.
  349. function job_update(cmdParams, eventArgs)
  350.     if newStatus == 'Engaged' and player.equipment.main == 'Chatoyant Staff' then
  351.         state.OffenseMode:set('Ranged')
  352.     end
  353. end
  354. function job_self_command(cmdParams, eventArgs)
  355.     if command == 'coffer' then
  356.         cycle = 0
  357.         invCount = windower.ffxi.get_bag_info(0).count
  358.         if invCount == 80 then
  359.             add_to_chat(140,'Inv. full. Ending cycle')
  360.         elseif player.inventory["Velkk Coffer"] then
  361.             send_command('input /item "Velkk Coffer"')
  362.             cycle = 1
  363.         else
  364.             add_to_chat(140,'No Coffers found in inv.')
  365.             send_command('findall Velkk Coffer')
  366.         end
  367.         if cycle == 1 then
  368.             send_command('wait 2;gc c coffer')
  369.         end
  370.     end
  371. end
  372.  
  373. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  374. function display_current_job_state(eventArgs)
  375.     local msg = ''
  376.    
  377.     msg = msg .. 'Off.: '..state.OffenseMode.current
  378.     msg = msg .. ', Rng.: '..state.RangedMode.current
  379.     msg = msg .. ', WS.: '..state.WeaponskillMode.current
  380.     msg = msg .. ', QD.: '..state.CastingMode.current
  381.  
  382.     if state.DefenseMode.value ~= 'None' then
  383.         local defMode = state[state.DefenseMode.value ..'DefenseMode'].current
  384.         msg = msg .. ', Defense: '..state.DefenseMode.value..' '..defMode
  385.     end
  386.    
  387.     if state.Kiting.value then
  388.         msg = msg .. ', Kiting'
  389.     end
  390.    
  391.     if state.PCTargetMode.value ~= 'default' then
  392.         msg = msg .. ', Target PC: '..state.PCTargetMode.value
  393.     end
  394.  
  395.     if state.SelectNPCTargets.value then
  396.         msg = msg .. ', Target NPCs'
  397.     end
  398.  
  399.     msg = msg .. ', Roll Size: ' .. (state.LuzafRing.value and 'Large') or 'Small'
  400.    
  401.     add_to_chat(122, msg)
  402.  
  403.     eventArgs.handled = true
  404. end
  405.  
  406.  
  407. -------------------------------------------------------------------------------------------------------------------
  408. -- Utility functions specific to this job.
  409. -------------------------------------------------------------------------------------------------------------------
  410.  
  411. function define_roll_values()
  412.     rolls = {
  413.         ["Corsair's Roll"]   = {lucky=5, unlucky=9, bonus="Experience Points"},
  414.         ["Ninja Roll"]       = {lucky=4, unlucky=8, bonus="Evasion"},
  415.         ["Hunter's Roll"]    = {lucky=4, unlucky=8, bonus="Accuracy"},
  416.         ["Chaos Roll"]       = {lucky=4, unlucky=8, bonus="Attack"},
  417.         ["Magus's Roll"]     = {lucky=2, unlucky=6, bonus="Magic Defense"},
  418.         ["Healer's Roll"]    = {lucky=3, unlucky=7, bonus="Cure Potency Received"},
  419.         ["Puppet Roll"]      = {lucky=4, unlucky=8, bonus="Pet Magic Accuracy/Attack"},
  420.         ["Choral Roll"]      = {lucky=2, unlucky=6, bonus="Spell Interruption Rate"},
  421.         ["Monk's Roll"]      = {lucky=3, unlucky=7, bonus="Subtle Blow"},
  422.         ["Beast Roll"]       = {lucky=4, unlucky=8, bonus="Pet Attack"},
  423.         ["Samurai Roll"]     = {lucky=2, unlucky=6, bonus="Store TP"},
  424.         ["Evoker's Roll"]    = {lucky=5, unlucky=9, bonus="Refresh"},
  425.         ["Rogue's Roll"]     = {lucky=5, unlucky=9, bonus="Critical Hit Rate"},
  426.         ["Warlock's Roll"]   = {lucky=4, unlucky=8, bonus="Magic Accuracy"},
  427.         ["Fighter's Roll"]   = {lucky=5, unlucky=9, bonus="Double Attack Rate"},
  428.         ["Drachen Roll"]     = {lucky=3, unlucky=7, bonus="Pet Accuracy"},
  429.         ["Gallant's Roll"]   = {lucky=3, unlucky=7, bonus="Defense"},
  430.         ["Wizard's Roll"]    = {lucky=5, unlucky=9, bonus="Magic Attack"},
  431.         ["Dancer's Roll"]    = {lucky=3, unlucky=7, bonus="Regen"},
  432.         ["Scholar's Roll"]   = {lucky=2, unlucky=6, bonus="Conserve MP"},
  433.         ["Bolter's Roll"]    = {lucky=3, unlucky=9, bonus="Movement Speed"},
  434.         ["Caster's Roll"]    = {lucky=2, unlucky=7, bonus="Fast Cast"},
  435.         ["Courser's Roll"]   = {lucky=3, unlucky=9, bonus="Snapshot"},
  436.         ["Blitzer's Roll"]   = {lucky=4, unlucky=9, bonus="Attack Delay"},
  437.         ["Tactician's Roll"] = {lucky=5, unlucky=8, bonus="Regain"},
  438.         ["Allies's Roll"]    = {lucky=3, unlucky=10, bonus="Skillchain Damage"},
  439.         ["Miser's Roll"]     = {lucky=5, unlucky=7, bonus="Save TP"},
  440.         ["Companion's Roll"] = {lucky=2, unlucky=10, bonus="Pet Regain and Regen"},
  441.         ["Avenger's Roll"]   = {lucky=4, unlucky=8, bonus="Counter Rate"},
  442.         ["Runeist's Roll"]   = {lucky=4, unlucky=8, bonus="Magic Evasion"},
  443.     }
  444. end
  445.  
  446. function display_roll_info(spell)
  447.     rollinfo = rolls[spell.english]
  448.     local rollsize = (state.LuzafRing.value and 'Large') or 'Small'
  449.  
  450.     if rollinfo then
  451.         add_to_chat(104, spell.english..' provides a bonus to '..rollinfo.bonus..'.  Roll size: '..rollsize)
  452.         add_to_chat(104, 'Lucky roll is '..tostring(rollinfo.lucky)..', Unlucky roll is '..tostring(rollinfo.unlucky)..'.')
  453.     end
  454. end
  455.  
  456.  
  457. -- Determine whether we have sufficient ammo for the action being attempted.
  458. function do_bullet_checks(spell, spellMap, eventArgs)
  459.     local bullet_name
  460.     local bullet_min_count = 1
  461.    
  462.     if spell.type == 'WeaponSkill' then
  463.         if spell.skill == "Marksmanship" then
  464.             if spell.element == 'None' then
  465.                 -- physical weaponskills
  466.                 bullet_name = gear.WSbullet
  467.             else
  468.                 -- magical weaponskills
  469.                 bullet_name = gear.MAbullet
  470.             end
  471.         else
  472.             -- Ignore non-ranged weaponskills
  473.             return
  474.         end
  475.     elseif spell.type == 'CorsairShot' then
  476.         bullet_name = gear.QDbullet
  477.     elseif spell.action_type == 'Ranged Attack' then
  478.         bullet_name = gear.RAbullet
  479.         if buffactive['Triple Shot'] then
  480.             bullet_min_count = 3
  481.         end
  482.     end
  483.    
  484.     local available_bullets = player.inventory[bullet_name] or player.wardrobe[bullet_name]
  485.    
  486.     -- If no ammo is available, give appropriate warning and end.
  487.     if not available_bullets then
  488.         if spell.type == 'CorsairShot' and player.equipment.ammo ~= 'empty' then
  489.             add_to_chat(104, 'No Quick Draw ammo left.  Using what\'s currently equipped ('..player.equipment.ammo..').')
  490.             return
  491.         elseif spell.type == 'WeaponSkill' and player.equipment.ammo == gear.RAbullet then
  492.             add_to_chat(104, 'No weaponskill ammo left.  Using what\'s currently equipped (standard ranged bullets: '..player.equipment.ammo..').')
  493.             return
  494.         else
  495.             add_to_chat(104, 'No ammo ('..tostring(bullet_name)..') available for that action.')
  496.             eventArgs.cancel = true
  497.             return
  498.         end
  499.     end
  500.    
  501.     if spell.type == 'CorsairShot' and player.inventory["Trump Card"] and player.inventory["Trump Card"].count < 10 then
  502.             add_to_chat(104, 'Low on trump cards!')
  503.     end
  504.    
  505.    
  506.     -- Don't allow shooting or weaponskilling with ammo reserved for quick draw.
  507.     if spell.type ~= 'CorsairShot' and bullet_name == gear.QDbullet and available_bullets.count <= bullet_min_count then
  508.         add_to_chat(104, 'No ammo will be left for Quick Draw.  Cancelling.')
  509.         eventArgs.cancel = true
  510.         return
  511.     end
  512.    
  513.     -- Low ammo warning.
  514.     if spell.type ~= 'CorsairShot' and state.warned.value == false
  515.         and available_bullets.count > 1 and available_bullets.count <= options.ammo_warning_limit then
  516.         local msg = '*****  LOW AMMO WARNING: '..bullet_name..' *****'
  517.         --local border = string.repeat("*", #msg)
  518.         local border = ""
  519.         for i = 1, #msg do
  520.             border = border .. "*"
  521.         end
  522.        
  523.         add_to_chat(104, border)
  524.         add_to_chat(104, msg)
  525.         add_to_chat(104, border)
  526.  
  527.         state.warned:set()
  528.     elseif available_bullets.count > options.ammo_warning_limit and state.warned then
  529.         state.warned:reset()
  530.     end
  531. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement