-------------------------------------------------------------------------------------------------------------------
-- Setup functions for this job. Generally should not be modified.
-------------------------------------------------------------------------------------------------------------------
-- Initialization function for this job file.
function get_sets()
mote_include_version = 2
-- Load and initialize the include file.
include('Mote-Include.lua')
include('organizer-lib')
end
-- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked.
function job_setup()
state.Buff.Migawari = buffactive.migawari or false
state.Buff.Yonin = buffactive.Yonin or false
state.Buff.Innin = buffactive.Innin or false
state.Buff.Futae = buffactive.Futae or false
state.Buff.Sange = buffactive.Sange or false
state.warned = M(true)
end
-------------------------------------------------------------------------------------------------------------------
-- User setup functions for this job. Recommend that these be overridden in a sidecar file.
-------------------------------------------------------------------------------------------------------------------
-- Setup vars that are user-dependent. Can override this function in a sidecar file.
function user_setup()
state.OffenseMode:options('Melee', 'Acc')
state.WeaponskillMode:options('Normal')
state.CastingMode:options('Normal', 'Resistant')
state.IdleMode:options('Normal')
state.MagicBurst = M(true, 'Magic Burst')
gear.DakenShuriken = "Togakushi shuriken"
gear.RAShuriken = "Happo Shuriken"
options.ammo_warning_limit = 15
gear.MovementFeet = { name="Danzo Sune-ate"}
gear.DayFeet = "Danzo Sune-ate"
gear.NightFeet = "Hachiya kyahan +1"
select_movement_feet()
select_default_macro_book()
end
-- Define sets and vars used by this job file.
function init_gear_sets()
--------------------------------------
-- Precast sets
--------------------------------------
-- Precast sets to enhance JAs
sets.precast.JA['Futae'] = { hands="Hattori tekko +1"}
sets.precast.JA['Sange'] = { body="Mochizuki chainmail +1"}
sets.precast.JA['Mijin Gakure'] = { legs="Mochizuki hakama +1"}
sets.precast.JA['Provoke'] = { ammo="Sapience Orb",
neck="Unmoving Collar",
waist="Kasiri Belt",
ear1="Cryptic Earring",
--ear2="Trux Earring",
body="Emet Harness +1",
--hands="Kurys gloves",
ring1="Provocare Ring",
ring2="Supershear Ring",
back="Fravashi Mantle",
--legs="Obatala subligar",
feet="Mochi. Kyahan +1"}
-- Waltz set (chr and vit)
sets.precast.Waltz = {}
-- Fast cast sets for spells
sets.precast.FC = { ammo="Sapience Orb",
neck="Voltsurge torque",
head="Herculean helm",
ear1="Enchanter earring +1",
ear2="Etiolation earring",
body="Dread jupon",
hands="Leyline gloves",
ring1="Weatherspoon ring",
ring2="Prolix Ring",
legs="Gyve Trousers"}
sets.precast.FC.Utsusemi = set_combine(sets.precast.FC,
{neck="Magoraga beads",
body="Mochizuki chainmail +1",
feet="Hattori kyahan +1",
back="Mujin Mantle"})
-- Snapshot for ranged
sets.precast.RA = { ammo=gear.RAShuriken,
head="Taeon chapeau",
body="Pursuer's doublet",
hands="Manibozho gloves",
legs="Adhemar kecks",
feet="Adhemar gamashes"}
-- Ninjutsu
sets.precast.ElementalNinjutsu = set_combine(sets.precast.FC,
{neck="Incanter's torque",
head="Hachiya hatsuburi +1",
waist="Cimmerian Sash",
ear1="Ninjutsu Earring",
ear2="Stealth Earring",
feet="Mochizuki kyahan +1",
back="Mujin Mantle"})
-- Weaponskill sets
-- Default set for any weaponskill that isn't any more specifically defined
sets.precast.WS = { --ammo="Seething bomblet +1",
neck="Fotia gorget",
waist="Fotia belt",
ear1="Ishvara Earring",
ear2="Moonshade Earring",
ring1="Rajas Ring",
ring2="Rufescent Ring",
back="Yokaze mantle"}
-- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found.
sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
neck="Deviant necklace",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Leyline gloves",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
waist="Eschan Stone",
legs="Gyve trousers",
feet="Hachiya kyahan +1"})
-- [[Blade: Rin]] Modifiers: STR:60% ; DEX:60% Equipment: Aligned with light equipment (Light Gorget & Light Belt).
sets.precast.WS['Blade: Rin'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Herculean Trousers",
feet="Herculean Boots"})
-- [[Blade: Retsu]] Modifiers: STR:20% ; DEX:60% Equipment: Aligned with soil equipment (Soil Gorget & Soil Belt).
sets.precast.WS['Blade: Retsu'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Herculean Trousers",
feet="Herculean Boots"})
-- [[Blade: Teki]] Modifiers: STR:30% ; INT:30% Equipment: Aligned with aqua equipment (Aqua Gorget & Aqua Belt).
sets.precast.WS['Blade: Teki'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
neck="Deviant necklace",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Leyline gloves",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
waist="Eschan Stone",
legs="Gyve trousers",
feet="Hachiya kyahan +1"})
-- [[Blade: To]] Modifiers: STR:30% ; INT:30% Equipment: Aligned with snow/breeze equipment (Snow/Breeze Gorget & Snow/Breeze Belt).
sets.precast.WS['Blade: To'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
neck="Deviant necklace",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Leyline gloves",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
waist="Eschan Stone",
legs="Gyve trousers",
feet="Hachiya kyahan +1"})
-- [[Blade: Chi]] Modifiers: STR:30% ; INT:30% Equipment: Aligned with thunder/light equipment (Thunder/Light Gorget & Thunder/Light Belt).
sets.precast.WS['Blade: Chi'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
neck="Deviant necklace",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Leyline gloves",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
waist="Eschan Stone",
legs="Gyve trousers",
feet="Hachiya kyahan +1"})
-- [[Blade: Ei]] Modifiers: STR:40% ; INT:40% Equipment: Aligned with shadow equipment (Shadow Gorget & Shadow Belt).
sets.precast.WS['Blade: Ei'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
neck="Deviant necklace",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Leyline gloves",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
waist="Eschan Stone",
legs="Gyve trousers",
feet="Hachiya kyahan +1"})
-- [[Blade: Jin]] Modifiers: STR:30% ; DEX:30% Equipment: Aligned with breeze/thunder equipment (Breeze/Thunder Gorget & Breeze/Thunder Belt).
sets.precast.WS['Blade: Jin'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Herculean Trousers",
feet="Herculean Boots"})
-- [[Blade: Ten]] Modifiers: STR:30% ; DEX:30% Equipment: Aligned with shadow/soil equipment (Shadow/Soil Gorget & Shadow/Soil Belt).
sets.precast.WS['Blade: Ten'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Herculean Trousers",
feet="Herculean Boots"})
-- [[Blade: Yu]] Modifiers: DEX:40% ; INT:40% Equipment: Aligned with aqua/soil equipment (Aqua/Soil Gorget & Aqua/Soil Belt).
sets.precast.WS['Blade: Yu'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
neck="Deviant necklace",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Leyline gloves",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
waist="Eschan Stone",
legs="Gyve trousers",
feet="Hachiya kyahan +1"})
-- [[Blade: Shun]] Modifiers: DEX:73~85%, depending on merit points ugrades. Equipment: Aligned with flame/thunder/light equipment (Flame/Thunder/Light Gorget & Flame/Thunder/Light Belt).
sets.precast.WS['Blade: Shun'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Gyve Trousers",
feet="Pursuer's Gaiters"})
-- [[Blade: Hi]] Modifiers: AGI:80% Equipment: Aligned with shadow/soil equipment (Shadow/Soil Gorget & Shadow/Soil Belt).
sets.precast.WS['Blade: Hi'] = set_combine(sets.precast.WS,{
head="Pursuer's Beret",
body="Hattori Ningi +1",
hands="Pursuer's Cuffs",
ring1="Garuda ring +1",
ring2="Garuda ring +1",
legs="Adhemar Kecks",
feet="Pursuer's Gaiters"})
-- [[Blade: Ku]] Modifiers: STR:30% ; DEX:30% Equipment: Aligned with shadow/soil/light equipment (Shadow/Soil/Light Gorget & Shadow/Soil/Light Belt).
sets.precast.WS['Blade: Ku'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Herculean Trousers",
feet="Herculean Boots"})
-- [[Blade: Kamu]] Modifiers: STR:60% ; INT:60% Equipment: Aligned with shadow/thunder/breeze equipment (Shadow/Thunder/Breeze Gorget & Shadow/Thunder/Breeze Belt).
sets.precast.WS['Blade: Kamu'] = set_combine(sets.precast.WS,{
head="Herculean Helm",
body="Hattori Ningi +1",
hands="Herculean Gloves",
legs="Mochizuki hakama +1",
feet="Herculean Boots"})
--------------------------------------
-- Midcast sets
--------------------------------------
-- Day Weather Bonus
sets.midcast.Bonus = {ring1="Zodiac ring",
waist="Hachirin-no-Obi"}
sets.midcast.FastRecast = { ammo="Sapience Orb",
neck="Voltsurge torque",
head="Herculean helm",
ear1="Enchanter earring +1",
ear2="Etiolation earring",
body="Dread jupon",
hands="Leyline gloves",
ring1="Weatherspoon ring",
legs="Gyve Trousers"}
sets.midcast.Utsusemi = set_combine(sets.precast.FC,
{neck="Magoraga beads",
body="Mochizuki chainmail +1",
feet="Hattori kyahan +1"})
sets.midcast.ElementalNinjutsu = { --ammo="Seething bomblet +1"
neck="Deviant necklace",
waist="Eschan stone",
head="Mochizuki hatsuburi +1",
ear1="Friomisi earring",
ear2="Crematio earring",
body="Samnuha coat",
hands="Hattori tekko +1",
ring1="Fenrir ring +1",
ring2="Fenrir ring +1",
back="Toro Cape",
legs="Gyve trousers",
feet="Adhemar gamashes"}
sets.midcast.ElementalNinjutsu.Resistant = set_combine(sets.midcast.ElementalNinjutsu, {
ammo="Hydrocera",
neck="Voltsurge torque",
head="Hachiya hatsuburi +1",
ear1="Gwati earring",
ear2="Enchanter earring +1",
hands="Leyline gloves",
ring1="Weatherspoon ring",
ring2="Sangoma Ring",
back="Yokaze mantle",
legs="Mochizuki hakama +1",
feet="Pursuer's gaiters"})
sets.midcast.NinjutsuDebuff = sets.midcast.ElementalNinjutsu.Resistant
sets.midcast.NinjutsuBuff = sets.precast.ElementalNinjutsu
sets.midcast.RA = { ammo=gear.RAShuriken,
neck="Erudition Necklace",
waist="Eschan stone",
head="Naga Somen",
ear2="Enervating earring",
body="Pursuer's doublet",
hands="Hachiya tekko +1",
ring1="Paqichikaji Ring",
ring2="Hajduk ring",
back="Yokaze mantle",
legs="Adhemar Kecks",
feet="Pursuer's gaiters"}
--------------------------------------
-- Idle/resting/defense/etc sets
--------------------------------------
-- Resting sets
sets.resting = { head="Herculean Helm",
body="Emet Harness +1",
hands="Umuthi Gloves",
legs="Herculean Trousers",
feet="Herculean Boots",
neck="Bathy Choker +1",
waist="Flume Belt",
ear1="Infused Earring",
ear2="Hibern. Earring",
ring1="Sheltered Ring",
ring2="Paguroidea Ring",
back="Solemnity Cape"}
-- Idle sets
sets.idle = set_combine(sets.resting,{
feet=gear.MovementFeet})
sets.idle.Town = { ammo=gear.DakenShuriken,
main="Aizushintogo",
sub="Aizushintogo",
neck="Fotia gorget",
waist="Fotia belt",
head="Hattori Zukin +1",
ear1="Ishvara Earring",
ear2="Moonshade Earring",
body="Hattori Ningi +1",
hands="Hattori Tekko +1",
ring1="Garuda ring +1",
ring2="Garuda ring +1",
back="Yokaze mantle",
legs="Hattori Hakama +1",
feet=gear.MovementFeet}
-- Defense sets
sets.defense.PDT = set_combine(sets.resting,{
ring1="Gelatinous ring",
ring2="Patricius ring",
neck="Twilight torque",
ear2="Colossus's earring"})
sets.defense.MDT = set_combine(sets.resting,
{head="Dampening tam",
neck="Twilight torque",
ear1="Merman's earring",
ear2="Etiolation earring",
ring1="Yacuruna ring",
ring2="Yacuruna ring",
waist="Flax sash"})
sets.Kiting = { feet=gear.MovementFeet}
--------------------------------------
-- Engaged sets
--------------------------------------
-- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous
-- sets if more refined versions aren't defined.
-- If you create a set with both offense and defense modes, the offense mode should be first.
-- EG: sets.engaged.Dagger.Accuracy.Evasion
-- Normal melee group
sets.engaged.Melee = { ammo=gear.DakenShuriken,
head="Adhemar Bonnet",
neck="Clotharius torque",
ear1="Eabani earring",
ear2="Suppanomimi",
body="Samnuha coat",
hands="Herculean Gloves",
ring1="Epona's ring",
ring2="Oneiros Ring",
back="Bleating Mantle",
waist="Windbuffet belt +1",
legs="Herculean Trousers",
feet="Herculean Boots"}
sets.engaged.Acc = set_combine(sets.engaged.Melee,{
head="Dampening tam",
neck="Ej necklace",
ear2="Steelflash earring",
ear1="Zennaroi earring",
ring1="Supershear ring",
ring2="Patricius ring",
back="Yokaze mantle",
waist="Olseni belt"})
organizer_items = { food="Sublime Sushi",
tooolbaginoshishinofuda="Toolbag (Ino)",
tooolbagchonofuda="Toolbag (Cho)",
tooolbagshikanofuda="Toolbag (Shika)",
inoshishinofuda="Inoshishinofuda",
shikanofuda="Shikanofuda",
chonofuda="Chonofuda",
togashuriken="Togakushi shuriken",
happoshuriken="Happo shuriken",
Extraboots="Danzo Sune-ate"}
--------------------------------------
-- Custom buff sets
--------------------------------------
sets.buff.Migawari = { body="Hattori ningi +1"}
sets.buff.Yonin = { legs="Hattori hakama +1"}
sets.buff.Innin = { head="Hattori zukin +1"}
sets.buff.Futae = { hands="Hattori tekko +1"}
sets.buff.Sange = set_combine(sets.midcast.RA, {
body="Mochizuki chainmail +1"})
sets.magic_burst = { main="Ochu",
sub="Ochu",
ear1="Static earring",
body="Samnuha coat",
ring1="Locus ring",
ring2="Mujin Band"}
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for standard casting events.
-------------------------------------------------------------------------------------------------------------------
function job_precast(spell, action, spellMap, eventArgs)
if player.tp > 1000 then
disable('main','sub')
if spell.action_type == 'Ranged Attack' then
state.CombatWeapon:set(player.equipment.range)
end
if spell.action_type == 'Ranged Attack' then
do_shuriken_checks(spell, action, spellMap, eventArgs)
end
end
end
-- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
function job_midcast(spell, action, spellMap, eventArgs)
if spell.skill == 'ElementalNinjutsu' and (spell.element == world.weather_element or spell.element == world.day_element) then
equip(sets.midcast.Bonus)
end
end
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
equip(sets.magic_burst)
end
end
function job_aftercast(spell, action, spellMap, eventArgs)
if player.tp < 1000 then
enable('main','sub')
elseif not spell.interrupted then
if spell.skill == 'Elemental Magic' and state.MagicBurst.value then
state.MagicBurst:reset()
elseif spell.english == 'Kurayami: Ichi' or spell.english == 'Kurayami: Ni' then
send_command('@wait 55;input /echo ------- '..spell.english..'(Blind) is wearing off in 5 seconds -------')
elseif spell.english == 'Hojo: Ichi' or spell.english == 'Hojo: Ni' then
send_command('@wait 55;input /echo ------- '..spell.english..'(Slow) is wearing off in 5 seconds -------')
elseif spell.english == 'Dokumori: Ichi' then
send_command('@wait 55;input /echo ------- '..spell.english..'(Poison) is wearing off in 5 seconds -------')
elseif spell.english == 'Jubaku: Ichi' then
send_command('@wait 55;input /echo ------- '..spell.english..'(Paralyze) is wearing off in 5 seconds -------')
elseif spell.english == 'Aisha: Ichi' then
send_command('@wait 125;input /echo ------- '..spell.english..'(Attack Down) is wearing off in 5 seconds -------')
elseif spell.english == 'Yurin: Ichi' then
send_command('@wait 125;input /echo ------- '..spell.english..'(Inhibit TP) is wearing off in 5 seconds -------')
elseif spell.english == "Migawari: Ichi" then
state.Buff.Migawari = true
elseif spell.english == "Yonin" then
state.Buff.Yonin = true
elseif spell.english == "Innin" then
state.Buff.Innin = true
elseif spell.english == "Sange" then
state.Buff.Sange = true
elseif spell.english == "Futae" then
state.Buff.Futae = true
end
end
end
-------------------------------------------------------------------------------------------------------------------
-- Job-specific hooks for non-casting events.
-------------------------------------------------------------------------------------------------------------------
function job_buff_change(buff, gain)
if buff == "Migawari" then
if gain then
equip(sets.buff.Migawari)
disable('body')
else
enable('body')
end
elseif buff == "Yonin" then
if gain then
equip(sets.buff.Yonin)
disable('legs')
else
enable('legs')
end
elseif buff == "Innin" then
if gain then
equip(sets.buff.Innin)
disable('head')
else
enable('head')
end
elseif buff == "Sange" then
if gain then
equip(sets.buff.Sange)
disable('ammo')
else
enable('ammo')
end
elseif buff == "Futae" then
if gain then
equip(sets.buff.Futae)
disable('hands')
else
enable('hands')
end
end
end
function job_status_change(new_status, old_status)
if new_status == 'Idle' then
select_movement_feet()
end
end
-------------------------------------------------------------------------------------------------------------------
-- User code that supplements standard library decisions.
-------------------------------------------------------------------------------------------------------------------
-- Get custom spell maps
function job_get_spell_map(spell, default_spell_map)
if spell.skill == "Ninjutsu" then
if not default_spell_map then
if spell.target.type == 'SELF' then
return 'NinjutsuBuff'
else
return 'NinjutsuDebuff'
end
end
end
end
-- Modify the default idle set after it was constructed.
function customize_idle_set(idleSet)
if state.Buff.Migawari then
idleSet = set_combine(idleSet, sets.buff.Migawari)
end
if state.Buff.Yonin then
idleSet = set_combine(idleSet, sets.buff.Yonin)
end
if state.Buff.Innin then
idleSet = set_combine(idleSet, sets.buff.Innin)
end
if state.Buff.Sange then
idleSet = set_combine(idleSet, sets.buff.Sange)
end
if state.Buff.Futae then
idleSet = set_combine(idleSet, sets.buff.Futae)
end
return idleSet
end
-- Modify the default melee set after it was constructed.
function customize_melee_set(meleeSet)
if state.Buff.Migawari then
meleeSet = set_combine(meleeSet, sets.buff.Migawari)
end
if state.Buff.Yonin then
meleeSet = set_combine(meleeSet, sets.buff.Yonin)
end
if state.Buff.Innin then
meleeSet = set_combine(meleeSet, sets.buff.Innin)
end
if state.Buff.Sange then
meleeSet = set_combine(meleeSet, sets.buff.Sange)
end
return meleeSet
end
-- Called by the default 'update' self-command.
function job_update(cmdParams, eventArgs)
select_movement_feet()
end
-------------------------------------------------------------------------------------------------------------------
-- Utility functions specific to this job.
-------------------------------------------------------------------------------------------------------------------
function select_movement_feet()
if world.time >= 17*60 or world.time < 7*60 then
gear.MovementFeet.name = gear.NightFeet
else
gear.MovementFeet.name = gear.DayFeet
end
end
function do_shuriken_checks(spell, spellMap, eventArgs)
local shuriken_name
local shuriken_min_count = 1
if spell.action_type == 'Ranged Attack' then
shuriken_name = gear.RAShuriken
end
local available_shurikens = player.inventory[shuriken_name] or player.wardrobe[shuriken_name]
-- If no ammo is available, give appropriate warning and end.
if not available_shurikens then
if spell.action_type == 'Ranged Attack' and player.equipment.ammo == gear.RAShuriken then
add_to_chat(104, 'No Shuriken ammo left.')
return
else
add_to_chat(104, 'No ammo ('..tostring(shuriken_name)..') available for that action.')
eventArgs.cancel = true
return
end
end
-- Low ammo warning.
if spell.action_type == 'Ranged Attack' and state.warned.value == false
and available_shurikens.count > 1 and available_shurikens.count <= options.ammo_warning_limit then
local msg = '***** LOW AMMO WARNING: '..shuriken_name..' *****'
--local border = string.repeat("*", #msg)
local border = ""
for i = 1, #msg do
border = border .. "*"
end
add_to_chat(104, border)
add_to_chat(104, msg)
add_to_chat(104, border)
state.warned:set()
elseif available_shurikens.count > options.ammo_warning_limit and state.warned then
state.warned:reset()
end
end
-- Select default macro book on initial load or subjob change.
function select_default_macro_book()
set_macro_page(1, 2)
end