· 10 years ago · Sep 13, 2016, 12:04 AM
1---- Lygre's BLM.lua
2---- VERSION 1.1.2
3-- This is lua is built using Mote's modified includes,
4-- which you can find in my GearSwap/libs folder here: https://github.com/Lygre/addons/tree/mac-blm/GearSwap/libs
5
6---- Macro/Keybind/Toggles/SelfCommands you may need
7-- Magic Burst: /console gs c toggle MagicBurst
8-- AF Body: /console gs c toggle ConsMP
9-- AOE for auto nuke: /console gs c toggle AOE
10--- This is makes the nuke() function use AOE nukes or not
11-- Element for auto nuke: /console gs c element (Earth, Wind, Ice, Fire, Water, Lightning) - case sensitive
12--- Selects an element for nuke() to use
13-- Auto Nuke: /console gs c nuke
14-- Death Mode: /console gs c toggle DeatCast
15--- Saved Death Mode toggle for last
16--- This one toggle will handle everything for Death
17--- This includes idle/engaged, casting other spells/self-buffs
18--- The only other thing you have to do is the Magic Burst toggle,
19--- as it decides whether the handler will put your Death-specific MB set on over your
20--- regular one.
21--- It also remembers what casting mode you were in when you turned Death Mode on
22--- and return to it upon exiting Death Mode
23
24-------------------------------------------------------------------------------------------------------------------
25-- Setup functions for this job. Generally should not be modified.
26-------------------------------------------------------------------------------------------------------------------
27
28-- Initialization function for this job file.
29function get_sets()
30 mote_include_version = 2
31
32 -- Load and initialize the include file.
33 include('Mote-Include.lua')
34 include('organizer-lib')
35
36end
37
38
39-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
40
41-------------------------------------------------------------------------------------------------------------------
42-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
43-------------------------------------------------------------------------------------------------------------------
44
45-- Setup vars that are user-dependent. Can override this function in a sidecar file.
46function job_setup()
47 state.OffenseMode:options('None', 'Locked')
48 state.CastingMode:options('Normal', 'Mid', 'Resistant', 'CMP','DeatMB')
49 state.IdleMode:options('Normal', 'PDT')
50
51 MagicBurstIndex = 0
52 state.MagicBurst = M(false, 'Magic Burst')
53 state.ConsMP = M(false, 'AF Body')
54 state.DeatCast = M(false, 'Death Mode')
55 element_table = L{'Earth','Wind','Ice','Fire','Water','Lightning'}
56 state.AOE = M(false, 'AOE')
57
58 lowTierNukes = S{'Stone', 'Water', 'Aero', 'Fire', 'Blizzard', 'Thunder',
59 'Stone II', 'Water II', 'Aero II', 'Fire II', 'Blizzard II', 'Thunder II',
60 'Stone III', 'Water III', 'Aero III', 'Fire III', 'Blizzard III', 'Thunder III',
61 'Stonega', 'Waterga', 'Aeroga', 'Firaga', 'Blizzaga', 'Thundaga',
62 'Stonega II', 'Waterga II', 'Aeroga II', 'Firaga II', 'Blizzaga II', 'Thundaga II'}
63
64 degrade_array = {
65 ['Fire'] = {'Fire','Fire II','Fire III','Fire IV','Fire V','Fire VI'},
66 ['Firega'] = {'Firaga','Firaga II','Firaga III','Firaja'},
67 ['Ice'] = {'Blizzard','Blizzard II','Blizzard III','Blizzard IV','Blizzard V','Blizzard VI'},
68 ['Icega'] = {'Blizzaga','Blizzaga II','Blizzaga III','Blizzaja'},
69 ['Wind'] = {'Aero','Aero II','Aero III','Aero IV','Aero V','Aero VI'},
70 ['Windga'] = {'Aeroga','Aeroga II','Aeroga III','Aeroja'},
71 ['Earth'] = {'Stone','Stone II','Stone III','Stone IV','Stone V','Stone VI'},
72 ['Earthga'] = {'Stonega','Stonega II','Stonega III','Stoneja'},
73 ['Lightning'] = {'Thunder','Thunder II','Thunder III','Thunder IV','Thunder V','Thunder VI'},
74 ['Lightningga'] = {'Thundaga','Thundaga II','Thundaga III','Thundaja'},
75 ['Water'] = {'Water', 'Water II','Water III', 'Water IV','Water V','Water VI'},
76 ['Waterga'] = {'Waterga','Waterga II','Waterga III','Waterja'},
77 ['Aspirs'] = {'Aspir','Aspir II','Aspir III'},
78 ['Sleepgas'] = {'Sleepga','Sleepga II'}
79 }
80 -- Additional local binds
81 -- Additional local binds
82 send_command('bind f9 gs c cycle CastingMode')
83 send_command('bind !` gs c toggle MagicBurst')
84 send_command('bind ^` gs c toggle ConsMP')
85 send_command('bind @` gs c toggle DeatCast')
86 send_command('bind f10 gs c cycle IdleMode')
87
88 send_command('bind !k input /klimaform')
89
90
91 send_command('bind !p input //send inamorata /follow Diaboli')
92 --Melee Ina
93
94 send_command('bind !] input //send inamorata /indifocus')
95 send_command('bind ![ input //send inamorata /geolanguor bt')
96 send_command('bind !L input //send inamorata /dia2 bt')
97
98 --Magic Ina
99 send_command('bind ^] input //send inamorata /indiacumen')
100 send_command('bind ^[ input //send inamorata /geomalaise bt')
101 send_command('bind !L input //send inamorata /dia2 bt')
102
103 --Def Ina
104 send_command('bind @] input //send inamorata /indiattunement')
105 send_command('bind @[ input //send inamorata /geovex bt')
106 send_command('bind !L input //send inamorata /dia2 bt')
107
108 --Augments
109 gear.nuke_cape = { name="Taranus's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','"Mag.Atk.Bns."+10',}}
110 gear.FC_cape = { name="Taranus's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','"Fast Cast"+10',}}
111
112 gear.aspir_head = {name= ""}
113 gear.aspir_body = {name="Amalric Doublet"}
114 gear.aspir_hands = {name="Amalric Gages"}
115 gear.aspir_legs = {name="Amalric Slops"}
116 gear.aspir_feet = { name="Merlinic Crackows", augments={'Mag. Acc.+22 "Mag.Atk.Bns."+22','"Occult Acumen"+3','INT+6','Mag. Acc.+10','"Mag.Atk.Bns."+5',}}
117
118 gear.fc_head = { name="Merlinic Hood", augments={'"Mag.Atk.Bns."+30','"Fast Cast"+5','Mag. Acc.+4',}}
119 gear.fc_feet = { name="Merlinic Crackows", augments={'Mag. Acc.+7','"Fast Cast"+6','CHR+5','"Mag.Atk.Bns."+3',}}
120
121 gear.nuke_head ={ name="Merlinic Hood", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','Magic burst mdg.+11%','INT+2','Mag. Acc.+1','"Mag.Atk.Bns."+12',}}
122 gear.nuke_body = {name="Merlinic Jubbah"}
123 gear.nuke_hands = { name="Amalric Gages"}
124 gear.nuke_legs={ name="Merlinic Shalwar", augments={'Mag. Acc.+25 "Mag.Atk.Bns."+25','Magic dmg. taken -4%','INT+3','Mag. Acc.+9',}}
125 gear.nuke_feet = { name="Jhakri Pigaches +1"}
126
127 gear.burst_head ={ name="Merlinic Hood", augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','Magic burst mdg.+11%','INT+2','Mag. Acc.+1','"Mag.Atk.Bns."+12',}}
128 gear.burst_body = {name = "Merlinic Jubbah"}
129 gear.burst_hands = {name="Amalric Gages"}
130 gear.burst_legs = { name="Merlinic Shalwar", augments={'Mag. Acc.+25 "Mag.Atk.Bns."+25','Magic dmg. taken -4%','INT+3','Mag. Acc.+9',}}
131 gear.burst_feet = { name="Jhakri Pigaches +1"}
132
133
134 organizer_items = {aeonic="Khatvanga"}
135 select_default_macro_book()
136end
137
138-- Called when this job file is unloaded (eg: job change)
139function user_unload()
140 send_command('unbind ^`')
141 send_command('unbind @`')
142end
143
144
145-- Define sets and vars used by this job file.
146function init_gear_sets()
147 --------------------------------------
148 -- Start defining the sets
149 --------------------------------------
150
151 ---- Precast Sets ----
152
153 -- Precast sets to enhance JAs
154 sets.precast.JA['Mana Wall'] = {back="Taranus's cape",feet="Wicce Sabots +1"}
155
156 sets.precast.JA.Manafont = {body="Sorcerer's Coat +2"}
157
158 -- equip to maximize HP (for Tarus) and minimize MP loss before using convert
159 sets.precast.JA.Convert = {}
160
161
162 -- Fast cast sets for spells
163
164 sets.precast.FC = {
165 main={ name="Lathi", augments={'INT+15','"Mag.Atk.Bns."+15','Mag. Acc.+15',}},
166 sub="Niobid Strap",
167 ammo="Sapience Orb",
168 head={ name="Merlinic Hood", augments={'"Mag.Atk.Bns."+30','"Fast Cast"+5','Mag. Acc.+4',}},
169 body="Shango Robe",
170 hands={ name="Merlinic Dastanas", augments={'"Fast Cast"+6','CHR+9','"Mag.Atk.Bns."+12',}},
171 legs={ name="Psycloth Lappas", augments={'MP+80','Mag. Acc.+15','"Fast Cast"+7',}},
172 feet={ name="Merlinic Crackows", augments={'Mag. Acc.+7','"Fast Cast"+6','CHR+5','"Mag.Atk.Bns."+3',}},
173 neck="Baetyl Pendant",
174 waist="Witful Belt",
175 left_ear="Enchntr. Earring +1",
176 right_ear="Loquac. Earring",
177 left_ring="Rahab Ring",
178 right_ring="Weather. Ring",
179 back="Perimede Cape",
180 }
181
182 sets.precast.FC['Enhancing Magic'] = set_combine(sets.precast.FC, {waist="Siegel Sash"})
183 sets.precast.FC['Enfeebling Magic'] = sets.precast.FC
184 sets.precast.FC['Elemental Magic'] = set_combine(sets.precast.FC, {ear1="Barkarole earring"})
185 sets.precast.FC['Healing Magic'] = set_combine(sets.precast.FC, {body="Heka's Kalasiris",legs="Doyen pants", back="Pahtli Cape"})
186
187
188 --Death sets
189 -- Default Idle set while Death Mode is on
190 sets.DeatCastIdle = {
191 main="Grioavolr",
192 sub="Niobid Strap",
193 ammo="Ghastly Tathlum +1",
194 head="Pixie Hairpin +1",
195 neck="Loricate Torque +1",
196 ear1="Barkaro. Earring",
197 ear2="Etiolation Earring",
198 body="Amalric Doublet",
199 hands="Amalric Gages",
200 ring1="Dark Ring",
201 ring2="Defending Ring",
202 back="Bane Cape",
203 waist="Fucho-no-obi",
204 legs="Amalric Slops",
205 feet="Amalric Nails"
206 }
207 -- Default FC set when Death Mode is on and no matching DeatMB subtable is found for specific spell
208 ---More specific FC sets under Death Mode could be implemented, but I really saw no point.
209 sets.precast.FC.DeatMB = {
210 main="Grioavolr",
211 sub="Niobid Strap",
212 ammo="Ghastly Tathlum +1",
213 head="Amalric Coif",
214 neck="Baetyl Pendant",
215 ear1="Etiolation Earring",
216 ear2="Loquacious Earring",
217 body="Shango Robe",
218 hands="Otomi Gloves",
219 ring1="Mephitas's Ring +1",
220 ring2="Weatherspoon Ring",
221 back=gear.FC_cape,
222 waist="Witful Belt",
223 legs="Psycloth Lappas",
224 feet="Amalric Nails"
225 }
226 -- Base midcast table for actually casting 'Death'
227 sets.midcast['Death'] = {}
228 -- Set to be imposed on top of above base Death set when Death Mode and Magic Burst Mode are both on
229 sets.MB_death = {
230 main="Grioavolr",
231 sub="Niobid Strap",
232 ammo="Strobilus",
233 head="Pixie Hairpin +1",
234 neck="Mizu. Kubikazari",
235 ear1="Barkaro. Earring",
236 ear2="Static Earring",
237 body="Amalric Doublet",
238 hands="Amalric Gages",
239 ring1="Mephitas's Ring +1",
240 ring2="Archon Ring",
241 back=gear.nuke_cape,
242 waist="Hachirin-No-Obi",
243 legs="Amalric Slops",
244 feet="Amalric Nails"
245 }
246
247 -- Weaponskill sets
248 -- Default set for any weaponskill that isn't any more specifically defined
249 sets.precast.WS = {}
250 -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
251 sets.precast.WS['Myrkr'] = {
252 ammo="Ghastly Tathlum +1",
253 head="Amalric Coif",
254 neck="Sanctity Necklace",
255 ear1="Etiolation Earring",
256 ear2="Moonshade Earring",
257 body="Amalric Doublet",
258 hands="Otomi Gloves",
259 ring1="Metamorph Ring",
260 ring2="Mephitas's Ring +1",
261 back="Bane Cape",
262 waist="Shinjutsu-no-obi",
263 legs="Amalric Slops",
264 feet="Amalric Nails"}
265
266 ---- Midcast Sets ----
267 sets.midcast.FastRecast = {
268 ammo="",
269 head="Amalric Coif",
270 neck="",
271 ear1="Etiolation Earring",
272 ear2="Loquacious Earring",
273 body="Shango Robe",
274 hands="Merlinic Dastanas",
275 ring1="Rahab Ring",
276 ring2="Weatherspoon Ring",
277 back="Bane Cape",
278 waist="Witful Belt",
279 legs="Psycloth Lappas",
280 feet="Merlinic Crackows"}
281
282 sets.midcast['Healing Magic'] = {main="",sub="",
283 head="Vanya Hood", neck="Nodens Gorget", ear1="", ear2="Loquacious Earring",
284 body="Vanya Robe", hands="Telchine Gloves", ring1="", ring2="",
285 back="Pahtli Cape", waist="" , legs="Gyve Trousers", feet=""}
286
287 sets.midcast['Enhancing Magic'] = {main="", sub="", ammo="",
288 head="Befouled Crown", neck="Incanter's Torque", ear1="", ear2="",
289 body="", hands="", ring1="", ring2="",
290 back="",waist="",legs="",feet=""}
291
292 sets.midcast.Refresh = set_combine(sets.midcast['Enhancing Magic'], {waist="Gishdubar Sash"})
293 sets.midcast.Haste = {}
294 sets.midcast.Phalanx = {}
295 sets.midcast.Aquaveil = {}
296 sets.midcast.Stoneskin = set_combine(sets.midcast['Enhancing Magic'], {neck="Nodens Gorget", waist="Siegel Sash"})
297
298 sets.midcast['Enfeebling Magic'] = {
299 main={ name="Lathi", augments={'INT+15','"Mag.Atk.Bns."+15','Mag. Acc.+15',}},
300 sub="Niobid Strap",
301 ammo="Plumose Sachet",
302 head="Befouled Crown",
303 body="Vanya Robe",
304 hands={ name="Amalric Gages", augments={'INT+10','Mag. Acc.+15','"Mag.Atk.Bns."+15',}},
305 legs={ name="Psycloth Lappas", augments={'MP+80','Mag. Acc.+15','"Fast Cast"+7',}},
306 feet={ name="Medium's Sabots", augments={'MP+45','MND+9','"Conserve MP"+5','"Cure" potency +4%',}},
307 neck="Incanter's Torque",
308 waist="Luminary Sash",
309 left_ear="Barkaro. Earring",
310 right_ear="Hermetic Earring",
311 right_ring="Weather. Ring",
312 back={ name="Taranus's Cape", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','INT+10','"Mag.Atk.Bns."+10',}},
313 }
314
315 sets.midcast['Enfeebling Magic'].Mid = set_combine(sets.midcast['Enfeebling Magic'],{})
316 sets.midcast['Enfeebling Magic'].Resistant = set_combine(sets.midcast['Enfeebling Magic'].Mid, { })
317 sets.midcast.ElementalEnfeeble = sets.midcast['Enfeebling Magic']
318
319 sets.midcast['Dark Magic'] = {
320 ammo="Plumose Sachet",
321 head="Amalric Coif",
322 neck="Incanter's Torque", --+10--
323 ear1="Etiolation Earring",
324 ear2="Loquacious Earring",
325 body="Shango Robe", --+15--
326 hands="Arch. Gloves",
327 ring1="Rahab Ring",
328 ring2="",
329 back="Bane Cape", --+2--
330 waist="Witful Belt",
331 legs="Psycloth Lappas",
332 feet="Merlinic Crackows"}
333
334 sets.midcast.Drains = set_combine(sets.midcast['Dark Magic'], {main="Lathi", sub="Niobid Strap", ammo="Ghastly Tathlum +1",
335 head="Pixie Hairpin +1", neck="Incanter's Torque", ear2="Friomisi Earring", ear1="Barkaro. Earring",
336 body="Amalric Doublet", hands="Amalric Gages", ring1="Archon Ring", ring2="Evanescence Ring",
337 back="Bane Cape",waist="Fucho-no-obi",legs="Amalric Slops",feet="Merlinic Crackows"})
338
339 sets.midcast.Aspirs = sets.midcast.Drains
340 sets.midcast.Stun = {}
341
342 -- Elemental Magic sets
343
344 sets.midcast['Elemental Magic'] = {
345 main="Lathi",
346 sub="Niobid Strap",
347 ammo="Ghastly Tathlum +1",
348 head=gear.nuke_head,
349 neck="Saevus Pendant +1",
350 ear1="Barkaro. Earring",
351 ear2="Friomisi Earring",
352 body=gear.nuke_body,
353 hands=gear.nuke_hands,
354 ring1="Shiva Ring +1",
355 ring2="Shiva Ring +1",
356 back=gear.nuke_cape,
357 waist="Refoccilation Stone",
358 legs=gear.nuke_legs,
359 feet=gear.nuke_feet,
360 }
361
362 sets.midcast['Elemental Magic'].Mid = set_combine(sets.midcast['Elemental Magic'], {
363 main="Lathi",
364 sub="Niobid Strap",
365 ammo="Ghastly Tathlum +1",
366 head="Jhakri Coronal +1",
367 neck="Sanctity Necklace",
368 ear1="Barkaro. Earring",
369 ear2="Hermetic Earring",
370 body=gear.nuke_body,
371 hands="Amalric Gages",
372 ring1="Shiva Ring +1",
373 ring2="Shiva Ring +1",
374 back=gear.nuke_cape,
375 waist="Refoccilation Stone",
376 legs=gear.nuke_legs,
377 feet=gear.nuke_feet
378 })
379
380 sets.midcast['Elemental Magic'].Resistant = set_combine(sets.midcast['Elemental Magic'].Mid, {neck="Sanctity Necklace"})
381 sets.midcast['Elemental Magic'].CMP = set_combine(sets.midcast['Elemental Magic'], {})
382
383 sets.midcast['Elemental Magic'].HighTierNuke = set_combine(sets.midcast['Elemental Magic'], {})
384 sets.midcast['Elemental Magic'].HighTierNuke.Mid = set_combine(sets.midcast['Elemental Magic'].HighTierNuke, {})
385 sets.midcast['Elemental Magic'].HighTierNuke.Resistant = set_combine(sets.midcast['Elemental Magic'].HighTierNuke.Mid, {})
386 sets.midcast['Elemental Magic'].HighTierNuke.CMP = set_combine(sets.midcast['Elemental Magic'].HighTierNuke, {})
387
388 sets.midcast.Impact = {head=empty,body="Twilight Cloak"}
389
390 --Death Midcast subtables
391 ---The foremost set for each magic skill exists to fall back on while Death Mode is on, and no more specifically defined set
392 ---exists for the spell
393 ----To add more specific sets, as seen below on line 163, define a specific set for either the spell's name or corresponding spellMap
394 ----(This set can be the empty set '{}', if you don't care to use it outside of Death Mode or something)
395 ----e.g. sets.midcast.Tornado = {}
396 ----Then define another set subtable, e.g. sets.midcast.Tornado.DeatMB = {what-have-you}
397 sets.midcast.FastRecast.DeatMB = sets.precast.FC.DeatMB
398
399 ---Death Enhancing Magic
400 sets.midcast['Enhancing Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
401 ----Death Refresh specific
402 sets.midcast.Refresh.DeatMB = set_combine(sets.midcast['Enhancing Magic'].DeatMB, {head="Amalric Coif"})
403
404 ---Death Enfeebling Magic
405 sets.midcast['Enfeebling Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
406
407 ---Death Dark Magic
408 sets.midcast['Dark Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
409 ----Death Aspirs spellMap specific
410 sets.midcast.Aspirs.DeatMB = set_combine(sets.precast.FC.DeatMB, {})
411
412 ---Death Elemental Magic
413 sets.midcast['Elemental Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
414
415 ---Death Healing Magic
416 sets.midcast['Healing Magic'].DeatMB = set_combine(sets.precast.FC.DeatMB, {})
417
418 --Set to be overlaid on top of the default midcast set for the spell you're casting when Magic Burst mode is toggled on
419 --(excluding when Death Mode is on.[see: sets.MB_death])
420 sets.magic_burst = {
421 ammo="Ghastly Tathlum +1",
422 head=gear.burst_head, --11%
423 body=gear.burst_body,
424 hands=gear.burst_hands, --5% break
425 legs=gear.nuke_legs,
426 feet=gear.burst_feet, --5%
427 neck="Mizu. Kubikazari", --10%
428 waist="Refoccilation Stone",
429 ear1="Barkaro. Earring",
430 ear2="Static Earring", --5%
431 left_ring="Mujin Band", --5% break
432 right_ring="Locus Ring",
433 back=gear.nuke_cape -- 5%
434 }
435
436 --Set to be equipped when Day/Weather match current spell element
437 sets.Obi = {waist='Hachirin-no-Obi'}
438
439 -- Resting sets
440 sets.resting = {main="",ammo="",
441 head="Orvail Corona +1",neck="Eidolon Pendant", ear1="", ear2="",
442 body="Jhakri Robe +1",hands="",ring1="Angha Ring",ring2="Paguroidea Ring",
443 back="Felicitas Cape +1", waist="Austerity Belt +1",legs="Menhit Slacks",feet=""}
444
445 -- Idle sets
446 -- Normal refresh idle set
447 sets.idle = {main="Lathi",
448 sub="Niobid Strap",
449 ammo="Brigantia Pebble",
450 head="Befouled Crown",
451 neck="Loricate Torque +1", --6%--
452 ear1="Etiolation Earring",
453 ear2="Infused Earring",
454 body="Witching Robe",
455 hands="Hagondes Cuffs +1", --4%--
456 ring1="Defending Ring", --3%--
457 ring2="Dark Ring", --2%--
458 back="Umbra Cape", --6%--
459 waist="Fucho-no-obi",
460 legs="Assid. Pants +1",
461 feet="Herald's Gaiters"
462 }
463
464 -- Idle mode that keeps PDT gear on, but doesn't prevent normal gear swaps for precast/etc.
465 sets.idle.PDT = {
466 ammo="Brigantia Pebble",
467 head="Hagondes Hat +1", --3%--
468 neck="Loricate Torque +1", --6%--
469 ear1="Etiolation Earring",
470 ear2="Infused Earring",
471 body="Hagondes Coat +1", --4%--
472 hands="Hagondes Cuffs +1", --4%--
473 ring1="Defending Ring", --10%--
474 ring2="Dark Ring", --3%--
475 back="Umbra Cape", --6%--
476 waist="",
477 legs="Hagondes Pants +1", --3%--
478 feet="Hag. Sabots +1"} --4%--}
479
480 -- Town gear.
481 sets.idle.Town = sets.idle
482
483 sets.TreasureHunter = {waist="Chaac Belt"}
484
485 -- Set for Conserve MP toggle, puts AF body on
486 sets.ConsMP = {body="Spaekona's coat +1"}
487
488 -- Defense sets
489 sets.defense.PDT = {}
490
491 sets.defense.MDT = {}
492
493 sets.Kiting = {feet="Herald's gaiters"}
494
495 sets.latent_refresh = {waist="Fucho-no-obi"}
496
497 -- Buff sets: Gear that needs to be worn to actively enhance a current player buff.
498
499 sets.buff['Mana Wall'] = {back="Taranus's cape",feet="Wicce Sabots +1"}
500
501 -- Engaged sets
502
503 -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
504 -- sets if more refined versions aren't defined.
505 -- If you create a set with both offense and defense modes, the offense mode should be first.
506 -- EG: sets.engaged.Dagger.Accuracy.Evasion
507
508 -- Normal melee group
509 --!!!!!Commented out until I make rule to handle engaged set during death mode (will use customize_melee_set)
510 --[[sets.engaged = {}]]
511
512end
513-------------------------------------------------------------------------------------------------------------------
514-- Job-specific hooks for standard casting events.
515-------------------------------------------------------------------------------------------------------------------
516
517-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
518-- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
519
520function job_precast(spell, action, spellMap, eventArgs)
521 enable('feet','back')
522 if state.DeatCast.value then
523 if spell.action_type == 'Magic' then
524 classes.CustomClass = 'DeatMB'
525 end
526 elseif spell.type == 'BlackMagic' and spell.target.type == 'MONSTER' then
527 refine_various_spells(spell, action, spellMap, eventArgs)
528 end
529 --elseif player.sub_job =='SCH' then
530 --if spell.action_type == 'Magic' then
531 --equipSet = (setscombine(sets.precast.FC, {back=gear.fc_cape}))
532 --end
533end
534
535function job_post_precast(spell, action, spellMap, eventArgs)
536 if state.DeatCast.value then
537 return
538 elseif spell.english == "Impact" then
539 equip({head=empty,body="Twilight Cloak"})
540 elseif spellMap == 'Cure' or spellMap == 'Curaga' then
541 gear.default.obi_waist = "Hachirin-no-obi"
542 end
543end
544
545-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
546function job_midcast(spell, action, spellMap, eventArgs)
547 if state.DeatCast.value then
548 if spell.action_type == 'Magic' then
549 if spell.english == 'Death' then
550 equip(sets.midcast['Death'])
551 else
552 classes.CustomClass = 'DeatMB'
553 state.CastingMode:set('DeatMB')
554 end
555 end
556 end
557end
558
559function job_post_midcast(spell, action, spellMap, eventArgs)
560 if spell.action_type == 'Magic' and state.MagicBurst.value then
561 if state.DeatCast.value then
562 if spell.english == 'Death' then
563 equip(sets.MB_death)
564 elseif spell.skill == 'Elemental Magic' then
565 if state.MagicBurst.value and sets.magic_burst then
566 local equipSet = sets.magic_burst
567 if equipSet[spell.english] then
568 equipSet = equipSet[spell.english]
569 end
570 if equipSet[spellMap] then
571 equipSet = equipSet[spellMap]
572 end
573 if equipSet[state.CastingMode.value] then
574 equipSet = equipSet[state.CastingMode.value]
575 end
576 equip(equipSet)
577 end
578 end
579 elseif spell.skill == 'Elemental Magic' then
580 if state.MagicBurst.value and sets.magic_burst then
581 local equipSet = sets.magic_burst
582 if equipSet[spell.english] then
583 equipSet = equipSet[spell.english]
584 end
585 if equipSet[spellMap] then
586 equipSet = equipSet[spellMap]
587 end
588 if equipSet[state.CastingMode.value] then
589 equipSet = equipSet[state.CastingMode.value]
590 end
591 equip(equipSet)
592 end
593 end
594 end
595 if spell.element == world.day_element or spell.element == world.weather_element then
596 if string.find(spell.english,'helix') then
597 equip(sets.midcast.Helix)
598 else
599 equip(sets.Obi)
600 end
601 end
602 if spell.skill == 'Elemental Magic' and state.ConsMP.value and not state.DeatCast.value then
603 equip(sets.ConsMP)
604 end
605end
606
607function job_aftercast(spell, action, spellMap, eventArgs)
608 -- Lock feet after using Mana Wall.
609 if buffactive['Mana Wall'] and not state.DeatCast.value then
610 enable('feet','back')
611 equip(sets.buff['Mana Wall'])
612 disable('feet','back')
613 end
614 if not spell.interrupted then
615 if spell.english == "Sleep II" or spell.english == "Sleepga II" then -- Sleep II Countdown --
616 send_command('wait 60;input /echo Sleep Effect: [WEARING OFF IN 30 SEC.];wait 15;input /echo Sleep Effect: [WEARING OFF IN 15 SEC.];wait 10;input /echo Sleep Effect: [WEARING OFF IN 5 SEC.]')
617 elseif spell.english == "Sleep" or spell.english == "Sleepga" then -- Sleep & Sleepga Countdown --
618 send_command('wait 30;input /echo Sleep Effect: [WEARING OFF IN 30 SEC.];wait 15;input /echo Sleep Effect: [WEARING OFF IN 15 SEC.];wait 10;input /echo Sleep Effect: [WEARING OFF IN 5 SEC.]')
619 elseif spell.english == "Break" then -- Break Countdown --
620 send_command('wait 25;input /echo Break Effect: [WEARING OFF IN 5 SEC.]')
621 elseif spell.english == "Paralyze" then -- Paralyze Countdown --
622 send_command('wait 115;input /echo Paralyze Effect: [WEARING OFF IN 5 SEC.]')
623 elseif spell.english == "Slow" then -- Slow Countdown --
624 send_command('wait 115;input /echo Slow Effect: [WEARING OFF IN 5 SEC.]')
625 end
626 end
627
628end
629
630function nuke(spell, action, spellMap, eventArgs)
631 if player.target.type == 'MONSTER' then
632 if state.AOE.value then
633 send_command('input /ma "'..degrade_array[element_table:append('ga')][#degrade_array[element_table:append('ga')]]..'" '..tostring(player.target.name))
634 else
635 send_command('input /ma "'..degrade_array[element_table][#degrade_array[element_table]]..'" '..tostring(player.target.name))
636 end
637 else
638 add_to_chat(5,'A Monster is not targetted.')
639 end
640end
641
642function job_self_command(commandArgs, eventArgs)
643 if commandArgs[1] == 'element' then
644 if commandArgs[2] then
645 if element_table:contains(commandArgs[2]) then
646 element_table = commandArgs[2]
647 add_to_chat(5, 'Current Nuke element ['..element_table..']')
648 else
649 add_to_chat(5,'Incorrect Element value')
650 return
651 end
652 else
653 add_to_chat(5,'No element specified')
654 end
655 elseif commandArgs[1] == 'nuke' then
656 nuke()
657 end
658end
659
660
661function refine_various_spells(spell, action, spellMap, eventArgs)
662 local aspirs = S{'Aspir','Aspir II','Aspir III'}
663 local sleeps = S{'Sleep','Sleep II'}
664 local sleepgas = S{'Sleepga','Sleepga II'}
665
666 local newSpell = spell.english
667 local spell_recasts = windower.ffxi.get_spell_recasts()
668 local cancelling = 'All '..spell.english..' spells are on cooldown. Cancelling spell casting.'
669
670 local spell_index
671
672 if spell_recasts[spell.recast_id] > 0 then
673 if spell.skill == 'Elemental Magic' then
674 local ele = tostring(spell.element):append('ga')
675 --local ele2 = string.sub(ele,1,-2)
676 if table.find(degrade_array[ele],spell.name) then
677 spell_index = table.find(degrade_array[ele],spell.name)
678 if spell_index > 1 then
679 newSpell = degrade_array[ele][spell_index - 1]
680 add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
681 send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
682 eventArgs.cancel = true
683 end
684 else
685 spell_index = table.find(degrade_array[spell.element],spell.name)
686 if spell_index > 1 then
687 newSpell = degrade_array[spell.element][spell_index - 1]
688 add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
689 send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
690 eventArgs.cancel = true
691 end
692 end
693 elseif aspirs:contains(spell.name) then
694 spell_index = table.find(degrade_array['Aspirs'],spell.name)
695 if spell_index > 1 then
696 newSpell = degrade_array['Aspirs'][spell_index - 1]
697 add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
698 send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
699 eventArgs.cancel = true
700 end
701 elseif sleepgas:contains(spell.name) then
702 spell_index = table.find(degrade_array['Sleepgas'],spell.name)
703 if spell_index > 1 then
704 newSpell = degrade_array['Sleepgas'][spell_index - 1]
705 add_to_chat(8,spell.name..' Canceled: ['..player.mp..'/'..player.max_mp..'MP::'..player.mpp..'%] Casting '..newSpell..' instead.')
706 send_command('@input /ma '..newSpell..' '..tostring(spell.target.raw))
707 eventArgs.cancel = true
708 end
709 end
710 end
711end
712
713-------------------------------------------------------------------------------------------------------------------
714-- Job-specific hooks for non-casting events.
715-------------------------------------------------------------------------------------------------------------------
716
717
718-- Called when a player gains or loses a buff.
719-- buff == buff gained or lost
720-- gain == true if the buff was gained, false if it was lost.
721function job_buff_change(buff, gain)
722 -- Unlock feet when Mana Wall buff is lost.
723 if buff == "Mana Wall" and not gain then
724 enable('feet','back')
725 handle_equipping_gear(player.status)
726 end
727 if buff == "Commitment" and not gain then
728 equip({ring2="Capacity Ring"})
729 if player.equipment.right_ring == "Capacity Ring" then
730 disable("ring2")
731 else
732 enable("ring2")
733 end
734 end
735end
736
737-- Handle notifications of general user state change.
738function job_state_change(stateField, newValue, oldValue)
739 if stateField == 'Offense Mode' then
740 if newValue == 'Locked' then
741 disable('main','sub','range')
742 else
743 enable('main','sub','range')
744 end
745 end
746 if stateField == 'Death Mode' then
747 if newValue == true then
748 state.OffenseMode:set('Locked')
749 predeathcastmode = state.CastingMode.value
750 --[[Insert 'equip(<set consisting of Death weapon and sub, to have them automatically lock when changing into Death mode>)']]
751 elseif newValue == false then
752 state.CastingMode:set(predeathcastmode)
753 end
754 end
755end
756
757
758-------------------------------------------------------------------------------------------------------------------
759-- User code that supplements standard library decisions.
760-------------------------------------------------------------------------------------------------------------------
761--[[function job_update(cmdParams, eventArgs)
762 job_display_current_state(eventArgs)
763 eventArgs.handled = true
764end]]
765
766function display_current_job_state(eventArgs)
767 eventArgs.handled = true
768 local msg = ''
769
770 if state.OffenseMode.value ~= 'None' then
771 msg = msg .. 'Combat ['..state.OffenseMode.value..']'
772
773 if state.CombatForm.has_value then
774 msg = msg .. ' (' .. state.CombatForm.value .. ')'
775 end
776 msg = msg .. ', '
777 end
778 --[[if state.HybridMode.value ~= 'Normal' then
779 msg = msg .. '/' .. state.HybridMode.value
780 end]]
781
782 msg = msg .. 'Casting ['..state.CastingMode.value..'], Idle ['..state.IdleMode.value..']'
783
784 if state.MagicBurst.value then
785 msg = msg .. ', MB [ON]'
786 else
787 msg = msg .. ', MB [OFF]'
788 end
789 if state.ConsMP.value then
790 msg = msg .. ', AF Body [ON]'
791 else
792 msg = msg .. ', AF Body [OFF]'
793 end
794 if state.DeatCast.value then
795 msg = msg .. ', Death Mode [ON]'
796 else
797 msg = msg .. ', Death Mode [OFF]'
798 end
799 if state.DefenseMode.value ~= 'None' then
800 msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')'
801 end
802
803 if state.Kiting.value then
804 msg = msg .. ', Kiting [ON]'
805 end
806
807 if state.PCTargetMode.value ~= 'default' then
808 msg = msg .. ', Target PC: '..state.PCTargetMode.value
809 end
810
811 if state.SelectNPCTargets.value == true then
812 msg = msg .. ', Target NPCs'
813 end
814
815 add_to_chat(122, msg)
816end
817
818-- Custom spell mapping.
819function job_get_spell_map(spell, default_spell_map)
820 if spell.skill == 'Elemental Magic' and default_spell_map ~= 'ElementalEnfeeble' then
821 if lowTierNukes:contains(spell.english) then
822 return 'LowTierNuke'
823 else
824 return 'HighTierNuke'
825 end
826 end
827end
828
829-- Modify the default idle set after it was constructed.
830--- This is where I handle Death Mode Idle set construction, rather than weave it into the Idle state var
831function customize_idle_set(idleSet)
832 if state.DeatCast.value then
833 idleSet = set_combine(idleSet, sets.DeatCastIdle)
834 end
835 if player.mpp < 51 then
836 idleSet = set_combine(idleSet, sets.latent_refresh)
837 end
838 if buffactive['Mana Wall'] then
839 idleSet = set_combine(idleSet, sets.buff['Mana Wall'])
840 end
841 return idleSet
842end
843--- This is where I handle Death Mode Melee set modifications
844function customize_melee_set(meleeSet)
845 if state.DeatCast.value then
846 meleeSet = set_combine(meleeSet, sets.DeatCastIdle)
847 end
848 if buffactive['Mana Wall'] then
849 meleeSet = set_combine(meleeSet, sets.buff['Mana Wall'])
850 end
851 return meleeSet
852end
853
854
855-------------------------------------------------------------------------------------------------------------------
856-- Utility functions specific to this job.
857-------------------------------------------------------------------------------------------------------------------
858
859-- Select default macro book on initial load or subjob change.
860function select_default_macro_book()
861 set_macro_page(1, 15)
862end