Advertisement
Guest User

Untitled

a guest
Nov 28th, 2016
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.31 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Setup functions for this job. Generally should not be modified.
  3. -- Original LUA by Fenrir.Motenten; edited by Odin.Speedyjim
  4. -------------------------------------------------------------------------------------------------------------------
  5.  
  6. --[[
  7. Custom commands:64
  8.  
  9. Shorthand versions for each strategem type that uses the version appropriate for
  10. the current Arts.
  11. In-game macro: /console gs c scholar xxx
  12.  
  13. Light Arts Dark Arts
  14.  
  15. gs c scholar light Light Arts/Addendum
  16. gs c scholar dark Dark Arts/Addendum
  17. gs c scholar cost Penury Parsimony
  18. gs c scholar speed Celerity Alacrity
  19. gs c scholar aoe Accession Manifestation
  20. gs c scholar power Rapture Ebullience
  21. gs c scholar duration Perpetuance
  22. gs c scholar accuracy Altruism Focalization
  23. gs c scholar enmity Tranquility Equanimity
  24. gs c scholar skillchain Immanence
  25. gs c scholar addendum Addendum: White Addendum: Black
  26. --]]
  27.  
  28.  
  29.  
  30. -- Initialization function for this job file.
  31. function get_sets()
  32. mote_include_version = 2
  33.  
  34. -- Load and initialize the include file.
  35. include('Mote-Include.lua')
  36. include('organizer-lib')
  37. -- Area mapping --
  38. Town = S{"Ru'Lude Gardens","Upper Jeuno","Lower Jeuno","Port Jeuno","Port Windurst","Windurst Waters","Windurst Woods","Windurst Walls","Heavens Tower",
  39. "Port San d'Oria","Northern San d'Oria","Southern San d'Oria","Port Bastok","Bastok Markets","Bastok Mines","Metalworks","Aht Urhgan Whitegate",
  40. "Tavnazian Safehold","Nashmau","Selbina","Mhaura","Norg","Eastern Adoulin","Western Adoulin","Kazham","Heavens Tower"}
  41. end
  42.  
  43. -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
  44. function job_setup()
  45. info.addendumNukes = S{"Stone IV", "Water IV", "Aero IV", "Fire IV", "Blizzard IV", "Thunder IV",
  46. "Stone V", "Water V", "Aero V", "Fire V", "Blizzard V", "Thunder V"}
  47.  
  48. state.Buff['Sublimation: Activated'] = buffactive['Sublimation: Activated'] or false
  49. update_active_strategems()
  50. end
  51.  
  52. -------------------------------------------------------------------------------------------------------------------
  53. -- User setup functions for this job. Recommend that these be overridden in a sidecar file.
  54. -------------------------------------------------------------------------------------------------------------------
  55.  
  56. -- Setup vars that are user-dependent. Can override this function in a sidecar file.
  57. function user_setup()
  58. state.OffenseMode:options('None', 'Normal')
  59. state.CastingMode:options('Normal', 'Resistant')
  60. state.IdleMode:options('Normal', 'PDT')
  61.  
  62. state.MagicBurst = M(false, 'Magic Burst')
  63.  
  64. info.low_nukes = S{"Stone", "Water", "Aero", "Fire", "Blizzard", "Thunder",
  65. "Stone II", "Water II", "Aero II", "Fire II", "Blizzard II", "Thunder II",
  66. "Stone III", "Water III", "Aero III", "Fire III", "Blizzard III", "Thunder III",
  67. "Stone IV", "Water IV", "Aero IV", "Fire IV", "Blizzard IV", "Thunder IV",
  68. "Stone V", "Water V", "Aero V", "Fire V", "Blizzard V", "Thunder V"}
  69. info.mid_nukes = S{}
  70. info.high_nukes = S{}
  71.  
  72. --send_command('bind ` input /ma Stun <t>; wait 0.5; input /p Casting STUN → «¶«<t>«¶«.')
  73. send_command('bind ^` gs c toggle MagicBurst')
  74. send_command('bind !` input /ja "Sublimation" <me>')
  75. send_command('bind ^- gs c scholar light')
  76. send_command('bind ^= gs c scholar dark')
  77. send_command('bind @- gs c scholar cost')
  78. send_command('bind @= gs c scholar power')
  79. send_command('bind delete gs c scholar speed')
  80. send_command('bind Home gs c scholar duration')
  81. send_command('bind End gs c scholar aoe')
  82.  
  83.  
  84. function user_unload()
  85. send_command('unbind `')
  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. send_command('unbind @`')
  93. send_command('unbind @-')
  94. send_command('unbind @=')
  95. send_command('unbind delete')
  96. send_command('unbind end')
  97. send_command('unbind home')
  98. end
  99.  
  100. -- Define sets and vars used by this job file.
  101. function init_gear_sets()
  102. --------------------------------------
  103. -- Start defining the sets
  104. --------------------------------------
  105.  
  106. -- Precast Sets
  107. -- Precast sets to enhance JAs
  108.  
  109. sets.precast.JA['Tabula Rasa'] = {legs="Pedagogy Pants"}
  110. sets.precast.JA['Dark Arts'] = {"Academic's Gown +1"}
  111. sets.precast.JA['Light Arts'] = {"Academic's Pants +1"}
  112.  
  113. organizer_items = {agown="Academic's Gown +1"}
  114.  
  115.  
  116. -- Fast cast sets for spells
  117. -- FC +71%, Quick Magic +10% (cap)
  118. sets.precast.FC = {main=grio_MB,sub="Arbuda Grip",ammo="Incantor Stone",
  119. head="Amalric Coif",neck="Orunmila's Torque",ear1="Enchanter Earring +1",ear2="Loquacious Earring",
  120. body="Anhur Robe",hands="Gendewitha Gages +1",ring1="Weatherspoon Ring",ring2="Prolix Ring",
  121. back="Perimede Cape",waist="Witful Belt",legs="Psycloth Lappas",feet="Merlinic crackows"}
  122.  
  123. sets.precast.FC.Cure = set_combine(sets.precast.FC, {main="Serenity",head="Paean Mitra",ear1="Mendicant's Earring",body="Vanya Robe",hands="Gendewitha Gages +1",back="Pahtli Cape",feet="Vanya Clogs"})
  124. sets.precast.FC.Curaga = sets.precast.FC.Cure
  125. sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})
  126. sets.precast.FC['Elemental Magic'] = set_combine(sets.precast.FC, {neck="Stoicheion Medal",ear1="Barkarole Earring"})
  127. sets.precast.FC.Impact = set_combine(sets.precast.FC['Elemental Magic'], {head=empty,body="Twilight Cloak"})
  128.  
  129. -- Weaponskill sets
  130. -- Default set for any weaponskill that isn't any more specifically defined
  131. sets.precast.WS = {}
  132.  
  133. -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
  134.  
  135. -- Total MP: 2221 (Outside Escha), ???? (Inside Escha)
  136. sets.precast.WS['Myrkr'] = {main="Akademos",sub="Willpower grip",ammo="Ghastly Tathlum +1",
  137. head="Kaabnax Hat",neck="Sanctity Necklace",ear1="Moonshade Earring",ear2="Etiolation Earring",
  138. body="Amalric Doublet",hands="Otomi Gloves",ring1="Mephitas's Ring +1",ring2="Mephitas's Ring",
  139. back="Pahtli Cape",waist="Luminary Sash",legs="Amalric Slops",feet="Medium's Sabots"}
  140.  
  141.  
  142. -- Midcast Sets
  143.  
  144. sets.midcast.FastRecast = {back="Swith Cape +1"}
  145. sets.midcast['Apururu (UC)'] = set_combine(sets.midcast.FastRecast, {body="Apururu Unity Shirt"})
  146.  
  147. -- Cure Sets
  148.  
  149. -- Potency: +51%, Healing Skill: 610 total inc. Light Arts bonus, Enmity: -20, MND: +168, VIT: +87
  150. sets.midcast.Cure = {main="Serenity",sub="Curatio Grip",ammo="Hydrocera",
  151. head="Kaykaus Mitra",neck="Incanter's Torque",ear1="Lifestorm Earring",ear2="Loquacious Earring",
  152. body="Kaykaus Bliaut",hands="Pedagogy Bracers +1",ring1="Haoma's Ring",ring2="Sirona's Ring",
  153. back="Tempered Cape +1",waist="Bishop's Sash",legs="Academic's Pants +1",feet="Vanya Clogs"}
  154.  
  155. -- Potency: +50%, Healing Skill: 562 total inc. Light Arts Bonus, MND: +160, VIT+ 89
  156. sets.midcast.CureWithLightWeather = set_combine(sets.midcast.Cure, {
  157. main="Chatoyant Staff",ear2="Mendicant's Earring",body="Kaykaus Bliaut",hands="Telchine Gloves",back="Twilight Cape",waist="Hachirin-no-Obi"})
  158.  
  159. sets.midcast.Curaga = sets.midcast.Cure
  160.  
  161. sets.midcast.Regen = {main="Bolelabunga",sub="Genmei Shield",ammo="Savant's Treatise",
  162. body="Telchine Chasuble",hands="Telchine Gloves",
  163. head="Arbatel Bonnet +1",neck="Incanter's Torque",ear1="Andoaa Earring",
  164. back="Bookworm's Cape",waist="Cascade Belt",legs="Telchine Braconi",feet="Telchine Pigaches"}
  165.  
  166. -- Enhancing Magic Sets
  167.  
  168. sets.midcast['Enhancing Magic'] = {main=grio_ENH,sub="Arbuda Grip",ammo="Savant's Treatise",
  169. head="Telchine Cap",body="Telchine Chasuble",hands="Telchine Gloves",legs="Telchine Braconi",feet="Telchine Pigaches",
  170. ear1="Andoaa Earring",neck="Incanter's Torque",waist="Cascade Belt"}
  171. sets.midcast.Protect = set_combine(sets.midcast['Enhancing Magic'], {ring1="Sheltered Ring"})
  172. sets.midcast.Shell = set_combine(sets.midcast['Enhancing Magic'], {ring1="Sheltered Ring"})
  173. sets.midcast.Haste = set_combine(sets.midcast.FastRecast, {main=grio_ENH,sub="Arbuda Grip",
  174. head="Telchine Cap",body="Telchine Chasuble",hands="Telchine Gloves",legs="Telchine Braconi",feet="Telchine Pigaches"})
  175.  
  176. sets.midcast.Cursna = {main="Gada",sub="Genmei Shield",
  177. neck="Malison Medallion",body="Vanya Robe",hands="Pedagogy Bracers +1",ring1="Haoma's Ring",ring2="Ephedra Ring",
  178. back="Tempered Cape +1",waist="Bishop's Sash",legs="Academic's Pants +1",feet="Gendewitha Galoshes +1"}
  179.  
  180. sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget", waist="Siegel Sash"})
  181. sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash",feet="Inspirited Boots"})
  182. sets.midcast.Erase = sets.midcast.FastRecast
  183. sets.midcast.Klimaform = sets.midcast.FastRecast
  184.  
  185. -- Custom spell classes
  186. sets.midcast.MndEnfeebles = {main=grio_MB,sub="Mephitis Grip",ammo="Hydrocera",
  187. head=merl_head_MAB,neck="Imbodla Necklace",ear1="Barkarole Earring",ear2="Dignitary's Earring",
  188. body="Vanya Robe",hands="Lurid Mitts",ring1="Vertigo Ring",ring2="Globidonta Ring",
  189. back="Refraction Cape",waist="Luminary Sash",legs=chiro_legs_ENF,feet="Medium's Sabots"}
  190.  
  191. sets.midcast.IntEnfeebles = sets.midcast.MndEnfeebles
  192. sets.midcast.ElementalEnfeeble = sets.midcast.IntEnfeebles
  193. sets.midcast.Kaustra = set_combine(sets.midcast['Elemental Magic'], {head="Pixie Hairpin +1"})
  194.  
  195. sets.midcast['Dark Magic'] = {main="Rubicundity",sub="Genmei Shield",ammo="Hydrocera",
  196. head=merl_head_MAB,neck="Incanter's Torque",ear1="Barkarole Earring",ear2="Dignitary's Earring",
  197. body="Psycloth Vest",hands="Lurid Mitts",ring1="Weatherspoon Ring",ring2="Evanescence Ring",
  198. back="Bookworm's Cape",waist="Fucho-no-obi",legs="Pedagogy Pants",feet="Medium's Sabots"}
  199.  
  200. sets.midcast.Drain = set_combine(sets.midcast['Dark Magic'], {ammo="Incantor Stone",
  201. head="Pixie Hairpin +1",ear1="Hirudinea Earring",ear2="Loquacious Earring",body="Chironic Doublet",hands=merl_hands_AS, waist="Fucho-no-obi", legs=merl_legs_AS,feet="Merlinic crackows"})
  202.  
  203. sets.midcast.Aspir = set_combine(sets.midcast['Dark Magic'], {ammo="Incantor Stone",
  204. head="Pixie Hairpin +1",ear1="Hirudinea Earring",ear2="Loquacious Earring",body="Chironic Doublet",hands=merl_hands_AS, waist="Fucho-no-obi", legs=merl_legs_AS,feet="Merlinic crackows"})
  205.  
  206. sets.midcast.Stun = {main=grio_MB,sub="Arbuda Grip",ammo="Incantor Stone",
  207. head="Pedagogy Mortarboard +1",neck="Orunmila's Torque",ear1="Enchanter Earring +1",ear2="Loquac. Earring",
  208. body="Shango Robe",hands="Gendewitha Gages +1",ring1="Weatherspoon Ring",ring2="Prolix Ring",
  209. back="Swith Cape +1",waist="Ninurta's Sash",legs="Psycloth Lappas",feet="Academic's Loafers +1"}
  210.  
  211. sets.midcast.Stun.Resistant = set_combine(sets.midcast.Stun, {})
  212.  
  213.  
  214. -- Elemental Magic sets are default for handling all-tier nukes.
  215. sets.midcast['Elemental Magic'] = {
  216. main={ name="Akademos", augments={'INT+15','"Mag.Atk.Bns."+15','Mag. Acc.+15',}},
  217. sub="Willpower Grip",
  218. ammo="Impatiens",
  219. head="Jhakri Coronal +1",
  220. body="Jhakri Robe +1",
  221. hands="Jhakri Cuffs +1",
  222. legs="Merlinic Shalwar",
  223. feet="Jhakri Pigaches +1",
  224. neck="Mizu. Kubikazari",
  225. waist="Yamabuki-no-Obi",
  226. left_ear="Calamitous Earring",
  227. right_ear="Friomisi Earring",
  228. left_ring="Mujin Band",
  229. right_ring="Shiva Ring +1",
  230. back={ name="Lugh's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','"Mag.Atk.Bns."+10',}},}
  231.  
  232. --{main="Akademos",sub="Willpower grip",ammo="Pemphredo Tathlum",
  233. --head=merl_head_MAB,neck="Saevus Pendant +1",ear1="Barkarole Earring",ear2="Friomisi Earring",
  234. --body="Merlinic Jubbah",hands=chiro_hands_MAB,ring1="Shiva Ring +1",ring2="Shiva Ring +1",
  235. --back="Toro Cape",waist="Refoccilation Stone",legs=merl_legs_MAB,feet=merl_feet_MAB}
  236. -- sub="Zuuxowu Grip",head="Buremte Hat",body="Witching Robe",hands="Otomi Gloves",back="Bookworm's Cape",waist="Tengu-no-Obi",feet="Amalric Nails"
  237.  
  238. sets.midcast['Elemental Magic'].Resistant = set_combine(sets.midcast['Elemental Magic'], {neck="Sanctity Necklace"})
  239.  
  240. -- Custom refinements for certain nuke tiers (No longer used as of Jan/2016).
  241. sets.midcast['Elemental Magic'].HighTierNuke = sets.midcast['Elemental Magic']
  242. sets.midcast['Elemental Magic'].HighTierNuke.Resistant = sets.midcast['Elemental Magic'].Resistant
  243.  
  244. sets.midcast.Helix = set_combine(sets.midcast['Elemental Magic'], {neck="Sanctity Necklace",back="Bookworm's Cape"})
  245. sets.midcast.Noctohelix = set_combine(sets.midcast.Helix, {head="Pixie Hairpin +1"})
  246. sets.midcast.Luminohelix = set_combine(sets.midcast.Helix, {ring1="Weatherspoon Ring"})
  247.  
  248. sets.midcast.Impact = {main="Akademos",sub="Mephitis Grip",ammo="Hydrocera",
  249. head=empty,neck="Sanctity Necklace",ear1="Barkarole Earring",ear2="Gwati Earring",
  250. body="Twilight Cloak",hands=chiro_hands_MAB,ring1="Weatherspoon Ring",ring2="Sangoma Ring",
  251. back="Refraction Cape",waist="Luminary Sash",legs=chiro_legs_ENF,feet="Medium's Sabots"}
  252.  
  253.  
  254. -- Sets to return to when not performing an action.
  255.  
  256. -- Resting sets
  257. sets.resting = {main="Chatoyant Staff",sub="Mephitis Grip",
  258. head="Amalric coif",neck="Wiglen Gorget",body="Jhakri robe +1",hands="Serpentes Cuffs",
  259. ring1="Sheltered Ring",ring2="Paguroidea Ring",legs="Assiduity Pants +1",feet="Serpentes Sabots"}
  260.  
  261.  
  262. -- Idle sets (default idle set not needed since the other three are defined, but leaving for testing purposes)
  263.  
  264. sets.idle.Town = {main="Akademos",sub="Willpower grip",ammo="Hydrocera",
  265. head=merl_head_MAB,neck="Orunmila's Torque",ear1="Enchanter Earring +1",ear2="Loquacious Earring",
  266. body="Merlinic Jubbah",hands=chiro_hands_REF,ring1="Shiva Ring +1",ring2="Matrimony Ring",
  267. back="Bookworm's Cape",waist="Fucho-no-obi",legs=merl_legs_MAB,feet="Herald's Gaiters"}
  268.  
  269. sets.idle.Field = {main="Bolelabunga",sub="Sors Shield",ammo="Homiliary",
  270. head="Amalric Coif",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Loquacious Earring",
  271. body="Jhakri robe +1",hands=chiro_hands_REF,ring1="Defending Ring",ring2=gear.DarkRing.physical,
  272. back="Umbra Cape",waist="Witful Belt",legs="Assiduity Pants +1",feet="Gendewitha Galoshes +1"}
  273.  
  274. sets.idle.PDT = {main="Bolelabunga",sub="Sors Shield",ammo="Incantor Stone", head="Amalric Coif",
  275. neck="Loricate Torque +1",ear1="Ethereal Earring",ring1="Defending Ring",ring2=gear.DarkRing.physical,
  276. body="Vanya Robe",hands="Gendewitha Gages +1",back="Umbra Cape",feet="Pedagogy Loafers +1"}
  277.  
  278. sets.idle.Weak = sets.idle.Field
  279.  
  280. -- Defense sets
  281.  
  282. sets.defense.PDT = {main="Bolelabunga",sub="Sors Shield",ammo="Incantor Stone",
  283. head="Befouled Crown",neck="Loricate Torque +1",ear1="Ethereal Earring",
  284. body="Gendewitha Bliaut +1",hands="Gendewitha Gages +1",ring1="Defending Ring",ring2=gear.DarkRing.physical,
  285. back="Umbra Cape",legs=chiro_legs_ENF,feet="Gendewitha Galoshes +1"}
  286.  
  287. sets.defense.MDT = {
  288. head=merl_head_MAB,neck="Loricate Torque +1",
  289. body="Pedagogy Gown +1",hands=chiro_hands_MAB,ring1="Defending Ring",ring2="Shadow Ring",
  290. back="Umbra Cape",legs=chiro_legs_ENF,feet="Arbatel Loafers +1"}
  291.  
  292. sets.Kiting = {feet="Herald's Gaiters"}
  293. sets.latent_refresh = {waist="Fucho-no-obi"}
  294.  
  295. -- Engaged sets
  296.  
  297. -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
  298. -- sets if more refined versions aren't defined.
  299. -- If you create a set with both offense and defense modes, the offense mode should be first.
  300. -- EG: sets.engaged.Dagger.Accuracy.Evasion
  301.  
  302. -- Normal melee group
  303. sets.engaged = {}
  304.  
  305.  
  306. -- Buff sets: Gear that needs to be worn to actively enhance a current player buff.
  307. sets.buff['Ebullience'] = {}
  308. sets.buff['Rapture'] = {head="Arbatel Bonnet +1"}
  309. sets.buff['Perpetuance'] = {hands="Arbatel Bracers +1"}
  310. sets.buff['Immanence'] = {hands="Arbatel Bracers +1"}
  311. sets.buff['Penury'] = {legs="Arbatel Pants +1"}
  312. sets.buff['Parsimony'] = {legs="Arbatel Pants +1"}
  313. sets.buff['Celerity'] = {feet="Pedagogy Loafers +1"}
  314. sets.buff['Alacrity'] = {head=merl_head_MAB,feet="Pedagogy Loafers +1"}
  315. sets.buff['Stormsurge'] = {feet="Pedagogy Loafers +1"}
  316. sets.buff['Klimaform'] = {waist="Hachirin-no-Obi",feet="Arbatel Loafers +1"}
  317.  
  318. sets.buff.FullSublimation = {head="Academic's Mortarboard +1",ear1="Savant's Earring",body="Pedagogy Gown +1",neck="Wiglen Gorget",ring1="Sheltered Ring",ring2="Paguroidea Ring"}
  319. sets.buff.PDTSublimation = {head="Academic's Mortarboard +1",ear1="Savant's Earring",body="Pedagogy Gown +1"}
  320.  
  321. sets.magic_burst = {main="Akademos",sub="Willpower grip",
  322. neck="Mizukage-no-Kubikazari",body=merl_body_MB,hands="Amalric Gages",ring1="Mujin Band",legs="Merlinic Shalwar"}
  323. -- Cap: 40%, Cap-breaking: 23% (Gifts: 13%, Mujin: 5%, Amalric Gages: 5%)
  324. -- Akademos: 10%, Mizukage: 10%, Merlinic Body: 10%, Merlinic Legs: 8% = 38%
  325.  
  326. end
  327.  
  328. -------------------------------------------------------------------------------------------------------------------
  329. -- Job-specific hooks for standard casting events.
  330. -------------------------------------------------------------------------------------------------------------------
  331. function refine_various_spells(spell, action, spellMap, eventArgs)
  332. aspirs = S{'Aspir','Aspir II'}
  333. sleeps = S{'Sleep','Sleep II'}
  334. sleepgas = S{'Sleepga'}
  335.  
  336. if not sleepgas:contains(spell.english) and not sleeps:contains(spell.english) and not aspirs:contains(spell.english) then
  337. return
  338. end
  339.  
  340. local newSpell = spell.english
  341. local spell_recasts = windower.ffxi.get_spell_recasts()
  342. local cancelling = 'All '..spell.english..' spells are on cooldown. Cancelling spell casting.'
  343.  
  344. if spell_recasts[spell.recast_id] > 0 then
  345. if aspirs:contains(spell.english) then
  346. if spell.english == 'Aspir' then
  347. add_to_chat(122,cancelling)
  348. eventArgs.cancel = true
  349. return
  350. elseif spell.english == 'Aspir II' then
  351. newSpell = 'Aspir'
  352. end
  353. elseif sleeps:contains(spell.english) then
  354. if spell.english == 'Sleep' then
  355. add_to_chat(122,cancelling)
  356. eventArgs.cancel = true
  357. return
  358. elseif spell.english == 'Sleep II' then
  359. newSpell = 'Sleep'
  360. end
  361. elseif sleepgas:contains(spell.english) then
  362. if spell.english == 'Sleepga' then
  363. add_to_chat(122,cancelling)
  364. eventArgs.cancel = true
  365. return
  366. end
  367. end
  368. end
  369.  
  370. if newSpell ~= spell.english then
  371. send_command('@input /ma "'..newSpell..'" '..tostring(spell.target.raw))
  372. eventArgs.cancel = true
  373. return
  374. end
  375. end
  376.  
  377. function job_precast(spell, action, spellMap, eventArgs)
  378. refine_various_spells(spell, action, spellMap, eventArgs)
  379. if (spell.type:endswith('Magic') or spell.type == "Ninjutsu") then
  380. if buffactive.Silence then
  381. cancel_spell()
  382. send_command('input /item "Echo Drops" <me>')
  383. end
  384. end
  385.  
  386. if spell.english == "Paralyna" and buffactive.Paralyzed then
  387. -- no gear swaps if we're paralyzed, to avoid blinking while trying to remove it.
  388. eventArgs.handled = true
  389. end
  390.  
  391. end
  392.  
  393. -- Run after the general midcast() is done.
  394. function job_post_midcast(spell, action, spellMap, eventArgs)
  395. if spell.action_type == 'Magic' then
  396. apply_grimoire_bonuses(spell, action, spellMap, eventArgs)
  397. end
  398. if spell.skill == 'Elemental Magic' then
  399. if state.MagicBurst.value then
  400. equip(sets.magic_burst)
  401. end
  402. end
  403. if spell.skill == 'Elemental Magic' and spell.element == world.day_element or spell.element == world.weather_element then
  404. equip (sets.midcast['Elemental Magic'],{waist="Hachirin-no-Obi"})
  405. end
  406. end
  407.  
  408. function job_aftercast(spell,action)
  409. if spell.english == 'Sleep' or spell.english == 'Sleepga' then
  410. send_command('@wait 50;input /echo ------- '..spell.english..' is wearing off in 10 seconds -------')
  411. elseif spell.english == 'Sleep II' or spell.english == 'Sleepga II' then
  412. send_command('@wait 80;input /echo ------- '..spell.english..' is wearing off in 10 seconds -------')
  413. elseif spell.english == 'Break' or spell.english == 'Breakga' then
  414. send_command('@wait 20;input /echo ------- '..spell.english..' is wearing off in 10 seconds -------')
  415. end
  416. end
  417.  
  418. -------------------------------------------------------------------------------------------------------------------
  419. -- Job-specific hooks for non-casting events.
  420. -------------------------------------------------------------------------------------------------------------------
  421.  
  422. -- Called when a player gains or loses a buff.
  423. -- buff == buff gained or lost
  424. -- gain == true if the buff was gained, false if it was lost.
  425. function job_buff_change(buff, gain)
  426. if buff == "Sublimation: Activated" then
  427. handle_equipping_gear(player.status)
  428. end
  429. end
  430.  
  431. -- Handle notifications of general user state change.
  432. function job_state_change(stateField, newValue, oldValue)
  433. if stateField == 'Offense Mode' then
  434. if newValue == 'Normal' then
  435. disable('main','sub','range')
  436. else
  437. enable('main','sub','range')
  438. end
  439. end
  440. end
  441.  
  442. -------------------------------------------------------------------------------------------------------------------
  443. -- User code that supplements standard library decisions.
  444. -------------------------------------------------------------------------------------------------------------------
  445.  
  446. -- Custom spell mapping.
  447. function job_get_spell_map(spell, default_spell_map)
  448. if spell.action_type == 'Magic' then
  449. if default_spell_map == 'Cure' or default_spell_map == 'Curaga' then
  450. if world.weather_element == 'Light' then
  451. return 'CureWithLightWeather'
  452. end
  453. elseif spell.skill == 'Enfeebling Magic' then
  454. if spell.type == 'WhiteMagic' then
  455. return 'MndEnfeebles'
  456. else
  457. return 'IntEnfeebles'
  458. end
  459. elseif spell.skill == 'Elemental Magic' then
  460. if info.low_nukes:contains(spell.english) then
  461. return 'LowTierNuke'
  462. elseif info.mid_nukes:contains(spell.english) then
  463. return 'MidTierNuke'
  464. elseif info.high_nukes:contains(spell.english) then
  465. return 'HighTierNuke'
  466. end
  467. end
  468. end
  469. end
  470.  
  471. function customize_idle_set(idleSet)
  472. if state.Buff['Sublimation: Activated'] then
  473. if state.IdleMode.value == 'Normal' then
  474. idleSet = set_combine(idleSet, sets.buff.FullSublimation)
  475. elseif state.IdleMode.value == 'PDT' then
  476. idleSet = set_combine(idleSet, sets.buff.PDTSublimation)
  477. end
  478. end
  479.  
  480. if player.mpp < 51 then
  481. idleSet = set_combine(idleSet, sets.latent_refresh)
  482. end
  483.  
  484. return idleSet
  485. end
  486.  
  487. -- Called by the 'update' self-command.
  488. function job_update(cmdParams, eventArgs)
  489. if cmdParams[1] == 'user' and not (buffactive['light arts'] or buffactive['dark arts'] or
  490. buffactive['addendum: white'] or buffactive['addendum: black']) then
  491. if state.IdleMode.value == 'Stun' then
  492. send_command('@input /ja "Dark Arts" <me>')
  493. else
  494. send_command('@input /ja "Light Arts" <me>')
  495. end
  496. end
  497.  
  498. update_active_strategems()
  499. update_sublimation()
  500. end
  501.  
  502. -- Function to display the current relevant user state when doing an update.
  503. -- Return true if display was handled, and you don't want the default info shown.
  504. function display_current_job_state(eventArgs)
  505. display_current_caster_state()
  506. eventArgs.handled = true
  507. end
  508.  
  509. -------------------------------------------------------------------------------------------------------------------
  510. -- User code that supplements self-commands.
  511. -------------------------------------------------------------------------------------------------------------------
  512.  
  513. -- Called for direct player commands.
  514. function job_self_command(cmdParams, eventArgs,command)
  515. if cmdParams[1]:lower() == 'scholar' then
  516. handle_strategems(cmdParams)
  517. eventArgs.handled = true
  518. end
  519. end
  520.  
  521. -------------------------------------------------------------------------------------------------------------------
  522. -- Utility functions specific to this job.
  523. -------------------------------------------------------------------------------------------------------------------
  524.  
  525. -- Reset the state vars tracking strategems.
  526. function update_active_strategems()
  527. state.Buff['Ebullience'] = buffactive['Ebullience'] or false
  528. state.Buff['Rapture'] = buffactive['Rapture'] or false
  529. state.Buff['Perpetuance'] = buffactive['Perpetuance'] or false
  530. state.Buff['Immanence'] = buffactive['Immanence'] or false
  531. state.Buff['Penury'] = buffactive['Penury'] or false
  532. state.Buff['Parsimony'] = buffactive['Parsimony'] or false
  533. state.Buff['Celerity'] = buffactive['Celerity'] or false
  534. state.Buff['Alacrity'] = buffactive['Alacrity'] or false
  535.  
  536. state.Buff['Klimaform'] = buffactive['Klimaform'] or false
  537. end
  538.  
  539. function update_sublimation()
  540. state.Buff['Sublimation: Activated'] = buffactive['Sublimation: Activated'] or false
  541. end
  542.  
  543. -- Equip sets appropriate to the active buffs, relative to the spell being cast.
  544. function apply_grimoire_bonuses(spell, action, spellMap)
  545. if state.Buff.Perpetuance and spell.type =='WhiteMagic' and spell.skill == 'Enhancing Magic' then
  546. equip(sets.buff['Perpetuance'])
  547. end
  548. if state.Buff.Rapture and (spellMap == 'Cure' or spellMap == 'Curaga') then
  549. equip(sets.buff['Rapture'])
  550. end
  551. if spell.skill == 'Elemental Magic' then --or spellMap ~= 'ElementalEnfeeble'
  552. if state.Buff.Ebullience and spell.english ~= 'Impact' then
  553. equip(sets.buff['Ebullience'])
  554. end
  555. if state.Buff.Immanence then
  556. equip(sets.buff['Immanence'])
  557. end
  558. if state.Buff.Klimaform and spell.skill == "Elemental Magic" and spell.element == world.weather_element then
  559. equip(sets.buff['Klimaform'])
  560. end
  561. end
  562.  
  563. if state.Buff.Penury then equip(sets.buff['Penury']) end
  564. if state.Buff.Parsimony then equip(sets.buff['Parsimony']) end
  565. if state.Buff.Celerity then equip(sets.buff['Celerity']) end
  566. if state.Buff.Alacrity then equip(sets.buff['Alacrity']) end
  567. end
  568.  
  569.  
  570. function display_current_caster_state()
  571. local msg = ''
  572.  
  573. if state.OffenseMode.value ~= 'None' then
  574. msg = msg .. 'Melee'
  575.  
  576. if state.CombatForm.has_value then
  577. msg = msg .. ' (' .. state.CombatForm.value .. ')'
  578. end
  579.  
  580. msg = msg .. ', '
  581. end
  582.  
  583. msg = msg .. 'Idle ['..state.IdleMode.value..'], Casting ['..state.CastingMode.value..']'
  584.  
  585. add_to_chat(122, msg)
  586. local currentStrats = get_current_strategem_count()
  587. local arts
  588. if buffactive['Light Arts'] or buffactive['Addendum: White'] then
  589. arts = 'Light Arts'
  590. elseif buffactive['Dark Arts'] or buffactive['Addendum: Black'] then
  591. arts = 'Dark Arts'
  592. else
  593. arts = 'No Arts Activated'
  594. end
  595. add_to_chat(122, 'Current Available Strategems: ['..currentStrats..'], '..arts..'')
  596. end
  597.  
  598. -- General handling of strategems in an Arts-agnostic way.
  599. -- Format: gs c scholar <strategem>
  600. function handle_strategems(cmdParams)
  601. -- cmdParams[1] == 'scholar'
  602. -- cmdParams[2] == strategem to use
  603. if not cmdParams[2] then
  604. add_to_chat(123,'Error: No strategem command given.')
  605. return
  606. end
  607.  
  608. local currentStrats = get_current_strategem_count()
  609. local newStratCount = currentStrats - 1
  610. local strategem = cmdParams[2]:lower()
  611.  
  612. if currentStrats > 0 and strategem ~= 'light' and strategem ~= 'dark' then
  613. add_to_chat(122, '***Current Charges Available: ['..newStratCount..']***')
  614. elseif currentStrats == 0 then
  615. add_to_chat(122, '***Out of strategems! Canceling...***')
  616. return
  617. end
  618.  
  619. if strategem == 'light' then
  620. if buffactive['light arts'] then
  621. send_command('input /ja "Addendum: White" <me>')
  622. add_to_chat(122, '***Current Charges Available: ['..newStratCount..']***')
  623. elseif buffactive['addendum: white'] then
  624. add_to_chat(122,'Error: Addendum: White is already active.')
  625. elseif buffactive['dark arts'] or buffactive['addendum: black'] then
  626. send_command('input /ja "Light Arts" <me>')
  627. add_to_chat(122, '***Changing Arts! Current Charges Available: ['..currentStrats..']***')
  628. else
  629. send_command('input /ja "Light Arts" <me>')
  630. end
  631. elseif strategem == 'dark' then
  632. if buffactive['dark arts'] then
  633. send_command('input /ja "Addendum: Black" <me>')
  634. add_to_chat(122, '***Current Charges Available: ['..newStratCount..']***')
  635. elseif buffactive['addendum: black'] then
  636. add_to_chat(122,'Error: Addendum: Black is already active.')
  637. elseif buffactive['light arts'] or buffactive['addendum: white'] then
  638. send_command('input /ja "Dark Arts" <me>')
  639. add_to_chat(122, '***Changing Arts! Current Charges Available: ['..currentStrats..']***')
  640. else
  641. send_command('input /ja "Dark Arts" <me>')
  642. end
  643. elseif buffactive['light arts'] or buffactive['addendum: white'] then
  644. if strategem == 'cost' then
  645. send_command('@input /ja Penury <me>')
  646. elseif strategem == 'speed' then
  647. send_command('@input /ja Celerity <me>')
  648. elseif strategem == 'aoe' then
  649. send_command('@input /ja Accession <me>')
  650. elseif strategem == 'power' then
  651. send_command('@input /ja Rapture <me>')
  652. elseif strategem == 'duration' then
  653. send_command('@input /ja Perpetuance <me>')
  654. elseif strategem == 'accuracy' then
  655. send_command('@input /ja Altruism <me>')
  656. elseif strategem == 'enmity' then
  657. send_command('@input /ja Tranquility <me>')
  658. elseif strategem == 'skillchain' then
  659. add_to_chat(122,'Error: Light Arts does not have a skillchain strategem.')
  660. elseif strategem == 'addendum' then
  661. send_command('@input /ja "Addendum: White" <me>')
  662. else
  663. add_to_chat(123,'Error: Unknown strategem ['..strategem..']')
  664. end
  665. elseif buffactive['dark arts'] or buffactive['addendum: black'] then
  666. if strategem == 'cost' then
  667. send_command('@input /ja Parsimony <me>')
  668. elseif strategem == 'speed' then
  669. send_command('@input /ja Alacrity <me>')
  670. elseif strategem == 'aoe' then
  671. send_command('@input /ja Manifestation <me>')
  672. elseif strategem == 'power' then
  673. send_command('@input /ja Ebullience <me>')
  674. elseif strategem == 'duration' then
  675. add_to_chat(122,'Error: Dark Arts does not have a duration strategem.')
  676. elseif strategem == 'accuracy' then
  677. send_command('@input /ja Focalization <me>')
  678. elseif strategem == 'enmity' then
  679. send_command('@input /ja Equanimity <me>')
  680. elseif strategem == 'skillchain' then
  681. send_command('@input /ja Immanence <me>')
  682. elseif strategem == 'addendum' then
  683. send_command('@input /ja "Addendum: Black" <me>')
  684. else
  685. add_to_chat(123,'Error: Unknown strategem ['..strategem..']')
  686. end
  687. else
  688. add_to_chat(123,'No arts has been activated yet.')
  689. end
  690. end
  691.  
  692. function get_current_strategem_count()
  693. local allRecasts = windower.ffxi.get_ability_recasts()
  694. local stratsRecast = allRecasts[231]
  695.  
  696. local maxStrategems = math.floor(player.main_job_level + 10) / 20
  697.  
  698. local fullRechargeTime = 5*33
  699.  
  700. local currentCharges = math.floor(maxStrategems - maxStrategems * stratsRecast / fullRechargeTime)
  701.  
  702. return currentCharges
  703. end
  704. -- Automatically changes Idle gears if you zone in or out of town --
  705. windower.register_event('zone change', function()
  706. status_change(player.status)
  707. if Town:contains(world.zone) then
  708. equip(sets.idle.Town)
  709. else
  710. equip(sets.idle.Field)
  711. end
  712. end)
  713.  
  714. -- Select default macro book on initial load or subjob change.
  715. function select_default_macro_book()
  716. if player.sub_job == 'RDM' then
  717. set_macro_page(1, 2)
  718. elseif player.sub_job == 'BLM' then
  719. set_macro_page(1, 2)
  720. elseif player.sub_job == 'WHM' then
  721. set_macro_page(1, 2)
  722. end
  723. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement