Guest User

FFXI NIN LUA

a guest
May 18th, 2025
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 74.28 KB | Source Code | 0 0
  1. -------------------------------------------------------------------------------------------------------------------
  2. -- Initialization function that defines sets and variables to be used.
  3. -------------------------------------------------------------------------------------------------------------------
  4. send_command('input //send @all lua l superwarp')
  5. send_command('input //lua l porterpacker')
  6. include('organizer-lib')
  7. include('Modes.lua')
  8. --For Some reason enabling these lines crashes windower
  9. --include('packets.lua')
  10. --packets = require('packets')
  11.  
  12. organizer_items = {
  13.     Consumables={"Panacea","Echo Drops","Holy Water", "Remedy","Antacid","Silent Oil","Prisim Powder","Reraiser","Hi-Reraiser"},
  14.     NinjaTools={"Shihei","Inoshishinofuda","Shikanofuda","Chonofuda", "Toolbag (Shihe)", "Toolbag (Ino)", "Toolbag (Shika)", "Toolbag (Cho)"},
  15.     Food={"Grape Daifuku","Rolanberry Daifuku", "Red Curry Bun","Om. Sandwich","Miso Ramen"},
  16.     Bullets={"Happo Shuriken", "Hap. Sh. Pouch"},
  17. }
  18.  
  19. PortTowns= S{"Mhaura","Selbina","Rabao","Norg"}
  20.  
  21. function get_sets()
  22.     mote_include_version = 2
  23.     include('Mote-Include.lua')
  24.     require('vectors')
  25.  
  26. end
  27.  
  28. function get_gear()
  29.     send_command('wait 3;input //gs org')
  30.     add_to_chat(8,'REMEMBER TO REPACK GEAR')
  31. end
  32.  
  33. -- Setup vars that are user-independent.
  34. function job_setup()
  35.     state.Buff.Migawari = buffactive.migawari or false
  36.     state.Buff.Doomed = buffactive.doomed or false
  37.     state.Buff.Sange = buffactive.Sange or false
  38.     state.Buff.Yonin = buffactive.Yonin or false
  39.     state.Buff.Innin = buffactive.Innin or false
  40.     state.Buff.Futae = buffactive.Futae or false
  41.  
  42.     include('Mote-TreasureHunter')
  43.     state.TreasureMode:set('None')
  44.     state.HasteMode = M{['description']='Haste Mode', 'Haste I', 'Haste II'}
  45.     state.MarchMode = M{['description']='March Mode', 'Trusts', '3', '7', 'Honor'}
  46.     state.GeoMode = M{['description']='Geo Haste', 'Trusts', 'Dunna', 'Idris'}
  47.  
  48.     select_ammo()
  49.  
  50.     gear.RegularAmmo = 'Seki Shuriken'
  51.     gear.SangeAmmo = 'Happo Shuriken'
  52.     gear.MovementFeet = {name="Danzo Sune-ate"}
  53.     gear.DayFeet = "Danzo Sune-ate"
  54.     gear.NightFeet = "Hachiya Kyahan +1"
  55.     gear.ElementalObi = {name="Hachirin-no-Obi"}
  56.     gear.default.obi_waist = "Orpheus Sash"
  57.    
  58.     update_combat_form()
  59.     ninbuff_status()
  60.     stance_status()
  61.  
  62.     state.warned = M(false)
  63.     options.ammo_warning_limit = 25
  64.     -- For th_action_check():
  65.     -- JA IDs for actions that always have TH: Provoke, Animated Flourish
  66.     info.default_ja_ids = S{35, 204}
  67.     -- Unblinkable JA IDs for actions that always have TH: Quick/Box/Stutter Step, Desperate/Violent Flourish
  68.     info.default_u_ja_ids = S{201, 202, 203, 205, 207}
  69.     get_gear()
  70.  
  71. end
  72.  
  73. -- Setup vars that are user-dependent.  Can override this function in a sidecar file.
  74. function user_setup()
  75.     windower.register_event('time change', time_change)
  76.     -- Options: Override default values
  77.     state.OffenseMode:options ('Normal', 'ACC')
  78.     state.RangedMode:options('Normal', 'Acc')
  79.     state.WeaponskillMode:options('Normal', 'MAXBUFF')
  80.     state.HybridMode:options('Normal', 'Hybrid', 'TANK', 'CRIT','Subtle')
  81.     state.CastingMode:options('Normal','Burst')
  82.     state.IdleMode:options('Normal','Recover','DT','Buff')
  83.     mainweapon={}
  84.     subWeapon={}
  85.     state.mainWeapon = M('Heishi Shorinken','Gokotai','Tauret','Naegling','Hachimonji','Karambit')
  86.     state.subWeapon = M('Yagyu Darkblade','Kunimitsu','Tsuru','Uzura +2',"Gleti's Knife",'Bloodrain Strap','') 
  87.    
  88.     -- Defensive Sets
  89.     state.PhysicalDefenseMode:options('PDT')
  90.     state.MagicalDefenseMode:options('MDT')
  91.     -- Binds
  92.    
  93.     send_command('bind numpad0 input /ja provoke <t>')
  94.     send_command('bind numpad1 gs c KatanaMode')
  95.     send_command('bind numpad2 gs c GktMode')
  96.     send_command('bind numpad3 gs c SwordMode')
  97.     send_command('bind numpad4 gs c cycle CastingMode')
  98.     send_command('bind numpad5 gs c cycle WeaponskillMode')
  99.     send_command('bind numpad6 gs c cycle IdleMode')
  100.     send_command('bind numpad7 gs c cycle OffenseMode')
  101.     send_command('bind numpad9 gs c cycle RangedMode')
  102.  
  103.     send_command('bind numpad8 gs c cycle HybridMode')
  104.  
  105.     send_command('bind numpad/ gs c cycle mainWeapon')
  106.     send_command('bind numpad* gs c cycle subWeapon')
  107.     send_command('bind numpad- gs c cycle HasteMode')
  108.     send_command('bind numpad+ gs c cycle MarchMode')
  109.  
  110.     send_command('unbind ^r')
  111.  
  112.    
  113.    
  114.     select_movement_feet()
  115.     select_default_macro_book()
  116.     use_UI = true
  117.     hud_x_pos = 1515    --important to update these if you have a smaller screen
  118.     hud_y_pos = 300     --important to update these if you have a smaller screen
  119.     hud_draggable = true
  120.     hud_font_size = 9
  121.     hud_transparency = 200 -- a value of 0 (invisible) to 255 (no transparency at all)
  122.     hud_font = 'Impact'
  123.     setupTextWindow()
  124.    
  125.     stance = "No Stance"
  126.     stance_status()
  127.     send_command('wait 10;input /lockstyleset 8')  
  128. end
  129.  
  130. function file_unload()
  131.     send_command('unbind ^[')
  132.     send_command('unbind ![')
  133.     send_command('unbind ^=')
  134.     send_command('unbind !=')
  135.     send_command('unbind @f9')
  136.     send_command('unbind @[')
  137.     send_command('unbind `')
  138.     send_command('unbind numpad7')
  139.     send_command('unbind numpad9')
  140.     send_command('unbind numpad5')
  141.     send_command('unbind numpad8')
  142.     send_command('unbind numpad4')
  143.     send_command('unbind numpad1')
  144.     send_command('unbind numpad2')
  145.     send_command('unbind numpad3')
  146.     send_command('unbind numpad/')
  147.     send_command('unbind numpad*')
  148.     send_command('unbind numpad-')
  149.     send_command('unbind numpad+')
  150. end
  151.  
  152. -- Define sets and vars used by this job file.
  153. -- sets.engaged[state.CombatForm][state.CombatWeapon][state.OffenseMode][state.HybridMode][classes.CustomMeleeGroups] (any number)
  154. -- Ninjutsu tips
  155. -- To stick Slow (Hojo) lower earth resist with Raiton: Ni
  156. -- To stick poison (Dokumori) or Attack down (Aisha) lower water resist with Katon: Ni
  157. -- To stick paralyze (Jubaku) lower ice resistence with Huton: Ni
  158. function init_gear_sets()
  159.     --------------------------------------
  160.     -- Augments
  161.     --------------------------------------
  162.     Andartia = {}
  163.     Andartia.DA     = {name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}}
  164.     Andartia.STP    = {name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10',}}
  165.     Andartia.AGIWS  = {name="Andartia's Mantle", augments={'AGI+20','Accuracy+20 Attack+20','AGI+10','Weapon skill damage +10%',}}
  166.     Andartia.DEXWS  = {name="Andartia's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%','Phys. dmg. taken-10%',}}
  167.     Andartia.STRWS  = {name="Andartia's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%','Phys. dmg. taken-10%',}}
  168.     Andartia.MAB    = {name="Andartia's Mantle", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','Magic Damage +10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}}
  169.     Andartia.FC     = {name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}}
  170.  
  171.     --------------------------------------
  172.     -- Job Abilties
  173.     --------------------------------------
  174.     sets.precast.JA['Mijin Gakure'] = {legs="Mochi. Hakama +3"}
  175.     sets.precast.JA['Futae'] = {hands="Hattori Tekko +1"}
  176.     sets.precast.JA['Sange'] = {ammo="Happo Shuriken",body="Mochi. Chainmail +3"}
  177.    
  178.     sets.precast.JA['Provoke'] = --{waist="Chaac Belt", ammo="Per. Lucky egg", head = "Wh. Rarab Cap +1", feet="Volte Boots"}
  179.    
  180.     {
  181.         ammo="Sapience Orb",
  182.         head="Nyame Helm",
  183.         body="Emet Harness +1",
  184.         hands="Kurys Gloves",
  185.         legs="Zoar Subligar +1",
  186.         feet={ name="Mochi. Kyahan +3", augments={'Enh. Ninj. Mag. Acc/Cast Time Red.',}},
  187.         neck={ name="Unmoving Collar +1", augments={'Path: A',}},
  188.         waist="Trance Belt",
  189.         left_ear="Cryptic Earring",
  190.         right_ear="Friomisi Earring",
  191.         left_ring="Supershear Ring", --+5
  192.         right_ring="Eihwaz Ring", --+5
  193.         back="Reiki Cloak"
  194.     }
  195.     sets.midcast.Flash = set_combine(sets.precast.JA['Provoke'], {})
  196.  
  197.     -- Waltz (chr and vit)
  198.     sets.precast.Waltz = {}
  199.        
  200.     -- Don't need any special gear for Healing Waltz.
  201.     sets.precast.Waltz['Healing Waltz'] = {}
  202.  
  203.     -- Set for acc on steps, since Yonin can drop acc
  204.     sets.precast.Step = {} 
  205.     sets.precast.Flourish1 = set_combine(sets.precast.Step, {waist="Chaac Belt"})
  206.     sets.midcast["Apururu (UC)"] = {}
  207.  
  208.     --------------------------------------
  209.     -- Utility Sets for rules below
  210.     --------------------------------------
  211.     sets.TreasureHunter = {waist="Chaac Belt", ammo="Per. Lucky egg", head = "Wh. Rarab Cap +1", feet="Volte Boots"}
  212.     sets.WSDayBonus     = {}
  213.     sets.BrutalLugra    = {ear1="Lugra Earring +1",     ear2="Brutal Earring"}
  214.     sets.BrutalTrux     = {ear1="Trux Earring",         ear2="Brutal Earring"}
  215.     sets.BrutalMoon     = {ear1="Moonshade Earring",    ear2="Brutal Earring"}
  216.     sets.IshvaraMoon    = {ear1="Moonshade Earring",    ear2="Ishvara Earring"}
  217.     sets.LugraMoon      = {ear1="Moonshade Earring",    ear2="Lugra Earring +1"}
  218.     sets.DualLugra      = {ear1="Lugra Earring +1",     ear2="Brutal Earring"}
  219.     sets.IshvaraCessance= {ear1="Ishvara Earring",      ear2="Brutal Earring"}
  220.     sets.IshvaraBrutal  = {ear1="Ishvara Earring",      ear2="Brutal Earring"}
  221.    
  222.     sets.RegularAmmo    = {ammo=gear.RegularAmmo}
  223.     sets.SangeAmmo      = {ammo=gear.SangeAmmo}
  224.  
  225.     --------------------------------------
  226.     -- Ranged
  227.     --------------------------------------
  228.     -- Snapshot for ranged
  229.     sets.precast.RA = {ammo="Happo Shuriken",waist="Chaac Belt", ammo="Per. Lucky egg", head = "Wh. Rarab Cap +1", feet="Volte Boots"}
  230.    
  231.     sets.midcast.RA = {
  232.         ammo="Happo Shuriken",
  233.         head="Malignance Chapeau",
  234.         body="Malignance Tabard",
  235.         hands="Malignance Gloves",
  236.         legs="Malignance Tights",
  237.         feet="Malignance Boots",
  238.         neck="Sanctity Necklace",
  239.         waist="Reiki Yotai",
  240.         left_ear="Crep. Earring",
  241.         right_ear="Telos Earring",
  242.         left_ring="Hajduk Ring",
  243.         right_ring="Paqichikaji Ring",
  244.         back=Andartia.DEXWS
  245.     }
  246.     sets.midcast.RA.Acc = set_combine(sets.midcast.RA, {})
  247.     sets.midcast.RA.TH = set_combine(sets.midcast.RA, sets.TreasureHunter)
  248.  
  249.     ----------------------------------
  250.     -- Casting
  251.     ----------------------------------
  252.     -- Precasts
  253.     sets.precast.FC = {
  254.         ammo="Sapience Orb",                                                                                            --+2
  255.         head={ name="Herculean Helm", augments={'Mag. Acc.+11','"Fast Cast"+5','MND+8','"Mag.Atk.Bns."+14',}},          --+12
  256.         body={ name="Adhemar Jacket +1", augments={'HP+105','"Fast Cast"+10','Magic dmg. taken -4',}},                  --+10
  257.         hands={ name="Leyline Gloves", augments={'Accuracy+14','Mag. Acc.+13','"Mag.Atk.Bns."+13','"Fast Cast"+2',}},   --+7/8
  258.         legs={ name="Herculean Trousers", augments={'"Fast Cast"+5','INT+1','"Mag.Atk.Bns."+8',}},                      --+5/6
  259.         feet={ name="Herculean Boots", augments={'Mag. Acc.+23','"Fast Cast"+6','MND+1',}},                             --+6
  260.         neck="Orunmila's Torque",                                                                                       --+5
  261.         waist="Svelt. Gouriz +1",                                                                                       --+0
  262.         left_ear="Enchntr. Earring +1",                                                                                 --+2           
  263.         right_ear="Loquac. Earring",                                                                                    --+2
  264.         left_ring="Rahab Ring",                                                                                         --+2
  265.         right_ring="Kishar Ring",                                                                                       --+4
  266.         back={ name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}}, -- +10
  267.     }
  268.    
  269.     sets.precast.FC.ElementalNinjutsuSan = set_combine(sets.precast.FC, {})
  270.    
  271.     --[Alternative Utsusemi fast casting Sets]
  272.  
  273.     sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {body="Mochi. Chainmail +3", neck="Magoraga Beads", left_ring="Weatherspoon Ring",})
  274.    
  275.     -- Midcasts
  276.     -- FastRecast (A set to end in when no other specific set is built to reduce recast time)
  277.     sets.midcast.FastRecast = {
  278.         ammo="Sapience Orb",
  279.         head={ name="Herculean Helm", augments={'Mag. Acc.+11','"Fast Cast"+5','MND+8','"Mag.Atk.Bns."+14',}},
  280.         body={ name="Adhemar Jacket +1", augments={'HP+105','"Fast Cast"+10','Magic dmg. taken -4',}},
  281.         hands={ name="Leyline Gloves", augments={'Accuracy+14','Mag. Acc.+13','"Mag.Atk.Bns."+13','"Fast Cast"+2',}},
  282.         legs={ name="Herculean Trousers", augments={'"Fast Cast"+5','INT+1','"Mag.Atk.Bns."+8',}},
  283.         feet={ name="Herculean Boots", augments={'Mag. Acc.+23','"Fast Cast"+6','MND+1',}},
  284.         neck="Orunmila's Torque",
  285.         waist="Svelt. Gouriz +1",
  286.         left_ear="Enchntr. Earring +1",
  287.         right_ear="Loquac. Earring",
  288.         left_ring="Weatherspoon Ring",
  289.         right_ring="Kishar Ring",
  290.         back={ name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}},
  291.     }
  292.  
  293.     -- Magic Accuracy Focus
  294.     sets.midcast.Ninjutsu = {
  295.         ammo="Yamarang",
  296.         head="Hachiya Hatsu. +3",
  297.         body="Malignance Tabard",
  298.         hands="Malignance Gloves",
  299.         legs="Malignance Tights",
  300.         feet="Malignance Boots",
  301.         neck="Incanter's Torque",
  302.         waist="Eschan Stone",
  303.         left_ear="Gwati Earring", --get digni earring you lazy fuck
  304.         right_ear="Hattori Earring +1",
  305.         left_ring   = {name="Stikini Ring +1", bag="wardrobe2"},
  306.         right_ring  = {name="Stikini Ring +1", bag="wardrobe7"},
  307.         back= Andartia.MAB
  308.     }
  309.    
  310.     -- Any ninjutsu cast on self - Recast Time Focus - Effects items that dont scale with Ninjutsu Skill, but not utsusemi
  311.     sets.midcast.SelfNinjutsu = {
  312.         ammo="Yamarang",
  313.         head="Malignance Chapeau",
  314.         body="Malignance Tabard",
  315.         hands="Malignance Gloves",
  316.         legs="Malignance Tights",
  317.         feet="Malignance Boots",
  318.         neck={ name="Bathy Choker +1", augments={'Path: A',}},
  319.         waist="Svelt. Gouriz +1",
  320.         left_ear="Infused Earring",
  321.         right_ear="Eabani Earring",
  322.         left_ring="Hizamaru Ring",
  323.         right_ring="Gelatinous Ring +1",
  324.         back={ name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}},
  325.     }
  326.    
  327.     sets.midcast.Utsusemi = set_combine(sets.midcast.FastRecast, {feet="Hattori Kyahan +3"})
  328.     --Migawari Scales with Skill. Migawari + Pieces Do nothing if you arent wearing them when you are hit
  329.     sets.midcast.Migawari = set_combine(sets.midcast.SelfNinjutsu, {
  330.         head="Hachiya Hatsu. +3",
  331.         feet="Mochi. Kyahan +3",
  332.         neck="Incanter's Torque",
  333.         left_ring   = {name="Stikini Ring +1", bag="wardrobe2"},
  334.         right_ring  = {name="Stikini Ring +1", bag="wardrobe7"},       
  335.         back=Andartia.FC
  336.     })
  337.  
  338.     -- Nuking Ninjutsu (skill & magic attack) - Scales Ton line spells
  339.     sets.midcast.ElementalNinjutsu = {
  340.         ammo="Ghastly Tathlum +1",
  341.         head={ name="Mochi. Hatsuburi +3", augments={'Enhances "Yonin" and "Innin" effect',}},
  342.         body="Nyame Mail",
  343.         hands="Nyame Gauntlets",
  344.         legs="Nyame Flanchard",
  345.         feet={ name="Mochi. Kyahan +3", augments={'Enh. Ninj. Mag. Acc/Cast Time Red.',}},
  346.         neck="Sibyl Scarf",
  347.         waist="Orpheus's Sash",
  348.         left_ear="Friomisi Earring",
  349.         right_ear="Hecate's Earring",
  350.         left_ring="Shiva Ring +1",
  351.         right_ring="Dingir Ring",
  352.         back={ name="Andartia's Mantle", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','Magic Damage +10','"Mag.Atk.Bns."+10','Phys. dmg. taken-10%',}},
  353.     }
  354.  
  355.     --Ni spells benefit from Higher INT and Magic damage
  356.     sets.midcast.ElementalNinjutsu.Burst        = set_combine(sets.midcast.ElementalNinjutsu,           {    
  357.         --body={ name="Samnuha Coat", augments={'Mag. Acc.+15','"Mag.Atk.Bns."+15','"Fast Cast"+5','"Dual Wield"+5',}},
  358.         --neck="Warder's Charm +1",
  359.         left_ring="Mujin Band",
  360.         })
  361.     --San Spells Benefit from Higher MAB
  362.     sets.midcast.ElementalNinjutsuSan           = set_combine(sets.midcast.ElementalNinjutsu,           {right_ring="Metamorph Ring +1",})
  363.     sets.midcast.ElementalNinjutsuSan.Burst     = set_combine(sets.midcast.ElementalNinjutsuSan,        {
  364.         --body={ name="Samnuha Coat", augments={'Mag. Acc.+15','"Mag.Atk.Bns."+15','"Fast Cast"+5','"Dual Wield"+5',}},
  365.         left_ring="Mujin Band",
  366.         right_ring="Metamorph Ring +1",
  367.         })
  368.        
  369.     -- Effusions
  370.     sets.precast.Effusion = {}
  371.     sets.precast.Effusion.Lunge = sets.midcast.ElementalNinjutsu
  372.     sets.precast.Effusion.Swipe = sets.midcast.ElementalNinjutsu
  373.  
  374.     ----------------------------------
  375.     -- Idle Sets
  376.     ----------------------------------
  377.     sets.idle = {}
  378.     sets.idle.Normal = {   
  379.         ammo="Yamarang",
  380.         head="Malignance Chapeau",
  381.         body="Mpaca's Doublet",
  382.         hands="Malignance Gloves",
  383.         legs="Mpaca's Hose",
  384.         feet="Malignance Boots",
  385.         neck={ name="Bathy Choker +1", augments={'Path: A',}},
  386.         waist="Svelt. Gouriz +1",
  387.         left_ear="Infused Earring",
  388.         right_ear="Eabani Earring",
  389.         left_ring="Hizamaru Ring",
  390.         right_ring="Gelatinous Ring +1",
  391.         back={ name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}},
  392.     }
  393.     sets.idle.Recover = {
  394.         ammo="Staunch Tathlum +1",
  395.         head="Rao Kabuto +1",
  396.         body="Hiza. Haramaki +2",
  397.         hands="Rao Kote +1",
  398.         legs="Malignance Tights",
  399.         feet="Rao Sune-Ate +1",
  400.         neck={ name="Bathy Choker +1", augments={'Path: A',}},
  401.         waist="Flume Belt",
  402.         left_ear="Infused Earring",
  403.         right_ear="Eabani Earring",
  404.         left_ring="Chirich Ring +1",
  405.         right_ring="Chirich Ring +1",
  406.         back={ name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}},
  407.     }
  408.     sets.idle.DT = {
  409.         ammo="Staunch Tathlum +1",
  410.         head="Nyame Helm",
  411.         body="Nyame Mail",
  412.         hands="Nyame Gauntlets",
  413.         legs="Nyame Flanchard",
  414.         feet="Nyame Sollerets",
  415.         neck="Warder's Charm +1",
  416.         waist="Carrier's Sash",
  417.         left_ear="Tuisto Earring",
  418.         right_ear="Odnowa Earring +1",
  419.         left_ring="Defending Ring",
  420.         right_ring="Shadow Ring",
  421.         back="Moonbeam Cape",  
  422.     }
  423.     sets.idle.Buff = {
  424.         ammo="Yamarang",
  425.         head={ name="Taeon Chapeau", augments={'Attack+10','"Triple Atk."+2','Phalanx +3',}},
  426.         body={ name="Taeon Tabard", augments={'Accuracy+5','"Fast Cast"+3','Phalanx +3',}},
  427.         hands={ name="Taeon Gloves", augments={'Phalanx +2',}},
  428.         legs={ name="Taeon Tights", augments={'Phalanx +3',}},
  429.         feet={ name="Taeon Boots", augments={'Phalanx +2',}},
  430.         neck={ name="Bathy Choker +1", augments={'Path: A',}},
  431.         waist="Gishdubar Sash",
  432.         left_ear="Infused Earring",
  433.         right_ear="Eabani Earring",
  434.         left_ring="Sheltered Ring",
  435.         right_ring={ name="Gelatinous Ring +1", augments={'Path: A',}},
  436.         back={ name="Andartia's Mantle", augments={'HP+60','Eva.+20 /Mag. Eva.+20','Evasion+9','"Fast Cast"+10','Phys. dmg. taken-10%',}},
  437.     }  
  438.     ----------------------------------
  439.     -- full Defense sets for react and other things
  440.     ----------------------------------
  441.     -- 51% PDT + Nullification(Mantle)
  442.     sets.defense.PDT = {
  443.         ammo="Staunch Tathlum +1",
  444.         head="Malignance Chapeau",
  445.         body="Malignance Tabard",
  446.         hands="Malignance Gloves",
  447.         legs="Malignance Tights",
  448.         feet="Malignance Boots",
  449.         neck="Loricate Torque +1",
  450.         waist="Flume Belt",
  451.         left_ear="Tuisto Earring",
  452.         right_ear="Odnowa Earring +1",
  453.         left_ring="Defending Ring",
  454.         right_ring="Warden's Ring",
  455.         back=Andartia.DA
  456.     }
  457.  
  458.     -- 25% MDT + Absorb + Nullification + MEva
  459.     sets.defense.PEVA = {
  460.         ammo="Staunch Tathlum +1",
  461.         head="Mpaca's Cap",
  462.         body="Mpaca's Doublet",
  463.         hands="Mpaca's Gloves",
  464.         legs="Mpaca's Hose",
  465.         feet="Mpaca's Boots",
  466.         neck="Loricate Torque +1",
  467.         waist="Flume Belt",
  468.         left_ear="Tuisto Earring",
  469.         right_ear="Odnowa Earring +1",
  470.         left_ring="Defending Ring",
  471.         right_ring="Warden's Ring",
  472.         back=Andartia.DA   
  473.     }
  474.        
  475.     sets.MEva = {
  476.         ammo="Staunch Tathlum +1",
  477.         head="Nyame Helm",
  478.         body="Nyame Mail",
  479.         hands="Nyame Gauntlets",
  480.         legs="Nyame Flanchard",
  481.         feet="Hachi. Kyahan +1",
  482.         neck={ name="Unmoving Collar +1", augments={'Path: A',}},
  483.         waist="Carrier's Sash",
  484.         left_ear="Tuisto Earring",
  485.         right_ear="Odnowa Earring +1",
  486.         left_ring="Defending Ring",
  487.         right_ring="Warden's Ring",
  488.         back="Moonbeam Cape",
  489.     }
  490.    
  491.     sets.Death = set_combine(sets.MEva, {left_ring="Warden's Ring"})
  492.     sets.Resist = set_combine(sets.MEva, {})
  493.     sets.Resist.Stun = set_combine(sets.MEva, {})
  494.     sets.DayMovement = {feet="Danzo Sune-ate"}
  495.     sets.NightMovement = {feet="Hachiya Kyahan +1"}
  496.  
  497.     --------------------------------------------------------------------
  498.     -- Generic Armor Sets used for Micromanaging Haste DW ACC and DT tiers
  499.     --------------------------------------------------------------------
  500.     -- All DW DA STP Capes should have 10 PDT. 21 MDT/DT is needed to cap, 40 PDT is needed to cap with cape. use a +5 DT Cape with D Ring instead of gelatinous, and malignance body if worried about no Shell V
  501.     sets.TANK={
  502.         head = "Malignance Chapeau",    --6  DT |16 PDT - 6  MDT
  503.         body = "Mpaca's Doublet",       --10 PDT|26 PDT - 6  MDT
  504.         hands= "Malignance Gloves",     --5  DT |31 PDT - 11 MDT
  505.         legs = "Malignance Tights",     --7  DT |38 PDT - 18 MDT
  506.         feet = "Malignance Boots",      --4  DT |42 PDT - 22 MDT
  507.         right_ring="Gelatinous Ring +1" --7  PDT|49 PDT - 21 MDT
  508.     }
  509.     sets.Hybrid={
  510.         head = "Malignance Chapeau",    --6  DT |16 PDT - 6  MDT
  511.         body = "Mpaca's Doublet",       --10 PDT|26 PDT - 6  MDT
  512.         hands= "Mpaca's Gloves",        --8  PDT|34 PDT - 6 MDT
  513.         legs = "Malignance Tights",     --7  DT |38 PDT - 13 MDT
  514.         feet = "Malignance Boots",      --4  DT |42 PDT - 17 MDT
  515.     }
  516.     sets.CRIT={
  517.         head={ name="Blistering Sallet +1", augments={'Path: A',}},
  518.         body={ name="Mpaca's Doublet", augments={'Path: A',}},
  519.         hands="Ken. Tekko +1",
  520.         legs={ name="Mpaca's Hose", augments={'Path: A',}},
  521.         feet="Ken. Sune-Ate +1",
  522.         left_ring="Lehko's Ring",  
  523.     }
  524.     ----------------------------------
  525.     --Generic Accuracy Sets
  526.     ----------------------------------
  527.     --[[ACC Guidelines Before Food(AfterFood) - Content
  528.         Normal: 1000 (1100) - casual/solo
  529.         Low:    1100 (1200) - Omen bosses, Geas Fete T3
  530.         Mid:    1200 (1300) - VD Ambuscade (normal Month), Wave 3 Dyna D
  531.         High:   1300 (1400) - Helms, VD Ambuscade (Hard month)
  532.     Buff tiers assume No external buffs. Lower the tier if recieving madrigals or hunters.]]
  533.    
  534.     -- NIN is not hurting for ACC Gear right now. Chirich swaps put most sets in the 1200 range natively.
  535.     sets.ACC ={
  536.         left_ring   = {name="Chirich Ring +1", bag="wardrobe2"},
  537.         right_ring  = {name="Chirich Ring +1", bag="wardrobe7"},   
  538.     }
  539.     sets.Subtle = {
  540.    
  541.     }
  542.  
  543.     ----------------------------------
  544.     --DW SETS
  545.     ----------------------------------     
  546.     --[[Use DW Sets to cap haste. if you are missing pieces from these sets, or have downgraded pieces, you can change out the slot with a new piece of gear.
  547.         just be sure to balance the T12,T22,T32,T39 sets to match as close as possible to the required DW]]
  548.     sets.dw={}
  549.         sets.dw.head = {head     = "Ryuo Somen +1"}     --+9
  550.         sets.dw.body = {body     = "Mochi. Chainmail +3"} --+9
  551.         sets.dw.legs = {legs     = "Mochi. Hakama +3"}  --+10
  552.         sets.dw.feet = {feet     = "Hiza. Sune-Ate +2"} --+8
  553.         sets.dw.ear1 = {left_ear = "Suppanomimi"}       --+5
  554.         sets.dw.ear2 = {right_ear= "Eabani Earring"}    --+4
  555.         sets.dw.waist= {waist    = "Reiki Yotai"}       --+7   
  556.         sets.dw.back = {back     = { name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','DEX+10','"Dual Wield"+10','Phys. dmg. taken-10%',}},} -- +10DW
  557.         sets.dw.t12  = set_combine(sets.dw.waist,sets.dw.ear1,{}) --Need 12 total DW
  558.         sets.dw.t22  = set_combine(sets.dw.waist,sets.dw.ear1,sets.dw.back, {})--Need 22 Total DW
  559.         sets.dw.t32  = set_combine(sets.dw.waist,sets.dw.ear1,sets.dw.back, sets.dw.body, {})--32 DW To cap
  560.         sets.dw.t35  = set_combine(sets.dw.waist,sets.dw.ear1,sets.dw.back, sets.dw.body, {})--Special 0 haste Hybrid Join, gets 35 DW, 50 dt
  561.         sets.dw.t39A = set_combine(sets.dw.waist,sets.dw.ear1,sets.dw.ear2, sets.dw.back, sets.dw.body, {})--Special 0 haste Hybrid Join, gets 35 DW, 50 dt
  562.         sets.dw.t39  = set_combine(sets.dw.waist,sets.dw.ear1,sets.dw.ear2, sets.dw.back, sets.dw.head, sets.dw.body, {})--39 DW To cap
  563.     ----------------------------------
  564.     -- No Haste - Requires 39 total DW to cap. use sets.dw.t39 as primary set join
  565.     ---------------------------------- 
  566.     sets.engaged = set_combine(sets.dw.t39, {
  567.         neck        = "Ninja Nodowa +2",
  568.         right_ear   = "Telos Earring",
  569.         left_ring   = "Gere Ring",
  570.         right_ring  = "Epona's Ring",
  571.         hands       = { name="Adhemar Wrist. +1", augments={'STR+12','DEX+12','Attack+20',}},
  572.         legs        = "Samnuha Tights",
  573.         feet        = "Malignance Boots",
  574.     })
  575.     ----------------------------------
  576.     -- No Haste SetVariants
  577.     ----------------------------------
  578.     --Accuracy Variants
  579.     sets.engaged.ACC        = set_combine(sets.engaged, sets.ACC, sets.dw.t39, {})
  580.     sets.engaged.Hybrid     = set_combine(sets.engaged, sets.hybrid, sets.dw.t35, {left_ring="Defending Ring"})
  581.     sets.engaged.ACC.Hybrid = set_combine(sets.engaged, sets.ACC, sets.hybrid, sets.dw.t35, {left_ring="Defending Ring"})
  582.     sets.engaged.TANK       = set_combine(sets.engaged, sets.TANK, sets.dw.t39A, {left_ring="Defending Ring"})
  583.     sets.engaged.ACC.TANK   = set_combine(sets.engaged, sets.ACC, sets.TANK, sets.dw.t39A, {left_ring="Defending Ring"})
  584.     sets.engaged.CRIT       = set_combine(sets.engaged, sets.CRIT, sets.dw.t39A, {})
  585.     sets.engaged.ACC.CRIT   = set_combine(sets.engaged, sets.ACC, sets.CRIT, sets.dw.t39A, {})
  586.     sets.engaged.Subtle     = set_combine(sets.engaged, sets.Subtle, sets.dw.t39A, {})
  587.     sets.engaged.ACC.Subtle = set_combine(sets.engaged, sets.ACC, sets.Subtle, sets.dw.t39A, {})   
  588.     ----------------------------------
  589.     -- Kannagi
  590.     ----------------------------------
  591.     sets.engaged.Kannagi = {}
  592.     sets.engaged.Kannagi.AM3 = {}
  593.  
  594.     ----------------------------------
  595.     -- GKT
  596.     ----------------------------------
  597.  
  598.     sets.engaged.GKT = {
  599.         head="Malignance Chapeau",
  600.         body="Malignance Tabard",
  601.         hands="Malignance Gloves",
  602.         legs="Malignance Tights",
  603.         feet="Malignance Boots",
  604.         neck={name="Ninja Nodowa +2", augments={'Path: A',}},
  605.         waist="Reiki Yotai",
  606.         left_ear="Telos Earring",
  607.         right_ear="Dedition Earring",
  608.         left_ring   = "Lehko's Ring",
  609.         right_ring  = {name="Chirich Ring +1", bag="wardrobe7"},
  610.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
  611.     }
  612.     sets.engaged.H2H = {
  613.         head={ name="Mpaca's Cap", augments={'Path: A',}},
  614.         body={ name="Mpaca's Doublet", augments={'Path: A',}},
  615.         hands={ name="Mpaca's Gloves", augments={'Path: A',}},
  616.         legs={ name="Mpaca's Hose", augments={'Path: A',}},
  617.         feet={ name="Mpaca's Boots", augments={'Path: A',}},
  618.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  619.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  620.         left_ear={name="Mache Earring +1",bag="wardrobe2"},
  621.         right_ear={name="Mache Earring +1",bag="wardrobe7"},
  622.         left_ring="Gere Ring",
  623.         right_ring="Epona's Ring",
  624.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  625.     }
  626.  
  627.  
  628.  --[[Set Build order: [Melee Set] > [Accuracy set] > [DW Sets] > [DT Set] > [Custom Sets]
  629.     * DW > ACC- Most DW Gear has native acc, so stack it after ACC gear to prevent mis-equips
  630.     * Stack DT Last to prevent DT overwrites. Current DT Set keeps 43% PDT and 50% MDT under shell 5 at all times.
  631.     Use 10PDT Capes over 5 DT Capes. 5DT capes are for Malignanceless noobs.]] 
  632.    
  633.     --------------------------------------------------------------------
  634.     -- MaxHaste Sets (0%DW Needed)
  635.     --------------------------------------------------------------------
  636.     -- DW Total in Gear: 0 DW / 1 DW Needed to Cap Delay Reduction
  637.    
  638.     sets.engaged.MaxHaste = {
  639.         head="Malignance Chapeau",
  640.         body={ name="Tatena. Harama. +1", augments={'Path: A',}},
  641.         hands="Malignance Gloves",
  642.         legs="Samnuha Tights",
  643.         feet="Malignance Boots",
  644.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  645.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  646.         left_ear="Telos Earring",
  647.         right_ear="Dedition Earring",
  648.         left_ring="Gere Ring",
  649.         right_ring="Epona's Ring",
  650.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Accuracy+10','"Store TP"+10','Phys. dmg. taken-10%',}},
  651.     }
  652.    
  653.  
  654.     sets.engaged.ACC.MaxHaste       = set_combine(sets.engaged.MaxHaste, sets.ACC   , {})
  655.     sets.engaged.Hybrid.MaxHaste    = set_combine(sets.engaged.MaxHaste, sets.hybrid, {})
  656.     sets.engaged.ACC.Hybrid.MaxHaste= set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.hybrid, {})
  657.     sets.engaged.TANK.MaxHaste      = set_combine(sets.engaged.MaxHaste, sets.TANK, {})
  658.     sets.engaged.ACC.TANK.MaxHaste  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.TANK, {})
  659.     sets.engaged.CRIT.MaxHaste      = set_combine(sets.engaged.MaxHaste, sets.CRIT, {})
  660.     sets.engaged.ACC.CRIT.MaxHaste  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.CRIT, {})
  661.     sets.engaged.Subtle.MaxHaste    = set_combine(sets.engaged.MaxHaste, sets.Subtle, {})
  662.     sets.engaged.ACC.Subtle.MaxHaste= set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.Subtle, {}) 
  663.     ----------------------------------
  664.     -- 35% Haste (~10-12%DW Needed)
  665.     ----------------------------------
  666.     -- DW Total in Gear: 12 DW / 12 DW Needed to Cap Delay Reduction
  667.     sets.engaged.Haste_35           = set_combine(sets.engaged.MaxHaste, sets.dw.t12, {})
  668.     sets.engaged.ACC.Haste_35       = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.dw.t12, {})
  669.     sets.engaged.Hybrid.Haste_35    = set_combine(sets.engaged.MaxHaste, sets.dw.t12, sets.hybrid, {})
  670.     sets.engaged.ACC.Hybrid.Haste_35= set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.hybrid,sets.dw.t12, {})
  671.     sets.engaged.TANK.Haste_35      = set_combine(sets.engaged.MaxHaste, sets.dw.t12, sets.TANK  , {})
  672.     sets.engaged.ACC.TANK.Haste_35  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.TANK  ,sets.dw.t12, {})
  673.     sets.engaged.CRIT.Haste_35      = set_combine(sets.engaged.MaxHaste, sets.dw.t12, sets.CRIT  , {})
  674.     sets.engaged.ACC.CRIT.Haste_35  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.CRIT  ,sets.dw.t12, {})
  675.     sets.engaged.Subtle.Haste_35        = set_combine(sets.engaged.MaxHaste, sets.dw.t12, sets.Subtle    , {})
  676.     sets.engaged.ACC.Subtle.Haste_35    = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.Subtle    ,sets.dw.t12, {})
  677.    
  678.     ----------------------------------
  679.     -- 30% Haste (~21-22%DW Needed)
  680.     ----------------------------------
  681.     -- DW Total in Gear: 21 DW / 21 DW Needed to Cap Delay Reduction
  682.     -- DW DT Sets CANT cap DW in this haste tier Without sacrificing DT. If you want to override a piece of DT Gear, simply include it. (Use DW Head, Ear2, and Waist if dropping malignance for DT)
  683.     -- Use DW Cape
  684.     sets.engaged.Haste_30           = set_combine(sets.engaged.MaxHaste, sets.dw.t22, {})
  685.     sets.engaged.ACC.Haste_30       = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.dw.t22, {})
  686.     sets.engaged.Hybrid.Haste_30    = set_combine(sets.engaged.MaxHaste, sets.hybrid, sets.dw.t22, {})
  687.     sets.engaged.ACC.Hybrid.Haste_30= set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.hybrid, sets.dw.t22, {})
  688.     sets.engaged.TANK.Haste_30      = set_combine(sets.engaged.MaxHaste, sets.TANK  , sets.dw.t22, {})
  689.     sets.engaged.ACC.TANK.Haste_30  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.TANK, sets.dw.t22, {})
  690.     sets.engaged.CRIT.Haste_30      = set_combine(sets.engaged.MaxHaste, sets.CRIT  , sets.dw.t22, {})
  691.     sets.engaged.ACC.CRIT.Haste_30  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.CRIT, sets.dw.t22, {})
  692.     sets.engaged.Subtle.Haste_30        = set_combine(sets.engaged.MaxHaste, sets.Subtle    , sets.dw.t22, {})
  693.     sets.engaged.ACC.Subtle.Haste_30    = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.Subtle, sets.dw.t22, {})
  694.     ----------------------------------
  695.     -- 15% Haste (~32%DW Needed)
  696.     ----------------------------------
  697.     -- DW Total in Gear: 32 DW / 32 DW Needed to Cap Delay Reduction
  698.     sets.engaged.Haste_15           = set_combine(sets.engaged.MaxHaste, sets.dw.t32, {})
  699.     sets.engaged.ACC.Haste_15       = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.dw.t32, {})
  700.     sets.engaged.Hybrid.Haste_15    = set_combine(sets.engaged.MaxHaste, sets.hybrid, sets.dw.t32, {})
  701.     sets.engaged.ACC.Hybrid.Haste_15= set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.hybrid, sets.dw.t32,  {})
  702.     sets.engaged.TANK.Haste_15      = set_combine(sets.engaged.MaxHaste, sets.TANK  , sets.dw.t32, {})
  703.     sets.engaged.ACC.TANK.Haste_15  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.TANK  , sets.dw.t32,  {})
  704.     sets.engaged.CRIT.Haste_15      = set_combine(sets.engaged.MaxHaste, sets.CRIT  , sets.dw.t32, {})
  705.     sets.engaged.ACC.CRIT.Haste_15  = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.CRIT  , sets.dw.t32,  {})
  706.     sets.engaged.Subtle.Haste_15        = set_combine(sets.engaged.MaxHaste, sets.Subtle    , sets.dw.t32, {})
  707.     sets.engaged.ACC.Subtle.Haste_15    = set_combine(sets.engaged.MaxHaste, sets.ACC   , sets.Subtle    , sets.dw.t32,  {})   
  708.     ----------------------------------
  709.     -- Weaponskills (General)
  710.     ----------------------------------
  711.     sets.precast.WS = {
  712.         ammo = "Coiste Bodhar",
  713.         head="Hachiya Hatsu. +3",
  714.         body="Nyame Mail",
  715.         hands="Nyame Gauntlets",
  716.         legs={ name="Mochi. Hakama +3", augments={'Enhances "Mijin Gakure" effect',}},
  717.         feet="Hattori Kyahan +3",
  718.         neck="Fotia Gorget",
  719.         waist="Fotia Belt",
  720.         left_ear="Lugra Earring +1",
  721.         right_ear="Moonshade Earring",
  722.         left_ring="Regal Ring",
  723.         right_ring="Epaminondas's Ring",
  724.         back=Andartia.DEXWS
  725.     }
  726.    
  727.     sets.precast.WS.MAXBUFF = set_combine(sets.precast.WS, {})
  728.    
  729.     -- Specific weaponskill sets.  Uses the base set if an appropriate WSMod version isn't found.
  730.     sets.precast.WS['Blade: Hi']        = set_combine(sets.precast.WS, {
  731.         ammo="Yetshila +1",
  732.         head="Hachiya Hatsu. +3",
  733.         body={ name="Mpaca's Doublet", augments={'Path: A',}},
  734.         hands={ name="Nyame Gauntlets", augments={'Path: B',}},
  735.         legs={ name="Nyame Flanchard", augments={'Path: B',}},
  736.         feet="Hattori Kyahan +3",
  737.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  738.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  739.         left_ear="Ishvara Earring",
  740.         right_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  741.         left_ring="Lehko's Ring",
  742.         right_ring="Regal Ring",
  743.         back={ name="Andartia's Mantle", augments={'AGI+20','Accuracy+20 Attack+20','AGI+10','Weapon skill damage +10%','Damage taken-5%',}},
  744.     })
  745.     sets.precast.WS['Blade: Hi'].MAXBUFF    = {
  746.         ammo="Yetshila +1",
  747.         head="Hachiya Hatsu. +3",
  748.         body="Nyame Mail",
  749.         hands={ name="Nyame Gauntlets", augments={'Path: B',}},
  750.         legs={ name="Nyame Flanchard", augments={'Path: B',}},
  751.         feet="Hattori Kyahan +3",
  752.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  753.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  754.         left_ear="Ishvara Earring",
  755.         right_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  756.         left_ring="Lehko's Ring",
  757.         right_ring="Regal Ring",
  758.         back={ name="Andartia's Mantle", augments={'AGI+20','Accuracy+20 Attack+20','AGI+10','Weapon skill damage +10%','Damage taken-5%',}},
  759.     }  
  760.     sets.precast.WS['Blade: Ten']       ={
  761.         ammo="Seething Bomblet +1",
  762.         head="Mpaca's Cap",
  763.         body="Nyame Mail",
  764.         hands="Nyame Gauntlets",
  765.         legs="Nyame Flanchard",
  766.         feet="Hattori Kyahan +3",
  767.         neck="Rep. Plat. Medal",
  768.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  769.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  770.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  771.         left_ring="Regal Ring",
  772.         right_ring="Gere Ring",
  773.         back={ name="Andartia's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%','Phys. dmg. taken-10%',}},
  774.     }
  775.     sets.precast.WS['Blade: Ten'].MAXBUFF = set_combine(sets.precast.WS['Blade: Ten'], {
  776.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  777.         left_ring="Epaminondas's Ring",
  778.     })
  779.     sets.precast.WS['Blade: Jin']       = {
  780.         ammo="Yetshila +1",
  781.         head={ name="Blistering Sallet +1", augments={'Path: A',}},
  782.         body={ name="Mpaca's Doublet", augments={'Path: A',}},
  783.         hands={ name="Mpaca's Gloves", augments={'Path: A',}},
  784.         legs={ name="Mochi. Hakama +3", augments={'Enhances "Mijin Gakure" effect',}},
  785.         feet={ name="Mpaca's Boots", augments={'Path: A',}},
  786.         neck="Fotia Gorget",
  787.         waist="Fotia Belt",
  788.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  789.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  790.         left_ring="Lehko's Ring",
  791.         right_ring="Ilabrat Ring",
  792.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  793.     }
  794.     sets.precast.WS['Blade: Jin'].MAXBUFF = set_combine(sets.precast.WS['Blade: Jin'],{})
  795.     sets.precast.WS['Blade: Kamu']      = {
  796.     -- NEEDS SRODA RING, Hattori Earring +1
  797.         ammo="Crepuscular Pebble",
  798.         head={ name="Mpaca's Cap", augments={'Path: A',}},
  799.         body={ name="Nyame Mail", augments={'Path: B',}},
  800.         hands={ name="Nyame Gauntlets", augments={'Path: B',}},
  801.         legs={ name="Nyame Flanchard", augments={'Path: B',}},
  802.         feet={ name="Nyame Sollerets", augments={'Path: B',}},
  803.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  804.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  805.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  806.         right_ear="Brutal Earring",
  807.         left_ring="Gere Ring",
  808.         right_ring="Regal Ring",
  809.         back={ name="Andartia's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%','Phys. dmg. taken-10%',}},
  810.     }
  811.     sets.precast.WS['Blade: Kamu'].MAXBUFF  = set_combine(sets.precast.WS['Blade: Kamu'], {})  
  812.     sets.precast.WS['Blade: Metsu']     = set_combine(sets.precast.WS['Blade: Ten'], {})
  813.     sets.precast.WS['Blade: Metsu'].MAXBUFF = set_combine(sets.precast.WS['Blade: Metsu'], {})
  814.     sets.precast.WS['Blade: Shun'] = {
  815.         ammo={ name="Coiste Bodhar", augments={'Path: A',}},
  816.         head={ name="Mpaca's Cap", augments={'Path: A',}},
  817.         body="Malignance Tabard",
  818.         hands={ name="Adhemar Wrist. +1", augments={'STR+12','DEX+12','Attack+20',}},
  819.         legs={ name="Mpaca's Hose", augments={'Path: A',}},
  820.         feet="Hattori Kyahan +3",
  821.         neck="Fotia Gorget",
  822.         waist="Fotia Belt",
  823.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  824.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  825.         left_ring="Gere Ring",
  826.         right_ring="Regal Ring",
  827.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  828.     }
  829.     sets.precast.WS['Blade: Shun'].MAXBUFF ={
  830.         ammo="Crepuscular Pebble",
  831.         head="Ken. Jinpachi +1",
  832.         body="Malignance Tabard",
  833.         hands="Malignance Gloves",
  834.         legs={ name="Mpaca's Hose", augments={'Path: A',}},
  835.         feet="Hattori Kyahan +3",
  836.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  837.         waist="Fotia Belt",
  838.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  839.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  840.         left_ring="Gere Ring",
  841.         right_ring="Regal Ring",
  842.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  843.     }
  844.     sets.precast.WS['Blade: Ku'] = {
  845.         ammo={ name="Coiste Bodhar", augments={'Path: A',}},
  846.         head={ name="Mpaca's Cap", augments={'Path: A',}},
  847.         body={ name="Nyame Mail", augments={'Path: B',}},
  848.         hands={ name="Mochizuki Tekko +3", augments={'Enh. "Ninja Tool Expertise" effect',}},
  849.         legs={ name="Nyame Flanchard", augments={'Path: B',}},
  850.         feet={ name="Mpaca's Boots", augments={'Path: A',}},
  851.         neck="Fotia Gorget",
  852.         waist="Fotia Belt",
  853.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  854.         right_ear="Brutal Earring",
  855.         left_ring="Regal Ring",
  856.         right_ring="Gere Ring",
  857.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  858.     }
  859.     sets.precast.WS['Blade: Ku'].MAXBUFF = set_combine(sets.precast.WS['Blade: Ku'], {
  860.         hands="Malignance Gloves",
  861.         legs="Mpaca's Hose",
  862.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  863.     }) 
  864.     sets.precast.WS['Blade: Chi'] = set_combine(sets.precast.WS, {
  865.         ammo="Seething Bomblet +1",
  866.         head={ name="Mochi. Hatsuburi +3", augments={'Enhances "Yonin" and "Innin" effect',}},
  867.         body="Nyame Mail",
  868.         hands="Nyame Gauntlets",
  869.         legs="Nyame Flanchard",
  870.         feet="Nyame Sollerets",
  871.         neck="Fotia Gorget",
  872.         waist="Orpheus's Sash",
  873.         left_ear="Lugra Earring +1",
  874.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  875.         left_ring="Gere Ring",
  876.         right_ring="Epaminondas's Ring",
  877.         back=Andartia.STRWS,
  878.     })
  879.     sets.precast.WS['Blade: To'] = sets.precast.WS['Blade: Chi']
  880.     sets.precast.WS['Blade: Teki'] = sets.precast.WS['Blade: Chi']
  881.     sets.precast.WS['Blade: Ei'] = {
  882.         ammo="Seething Bomblet +1",
  883.         head="Pixie Hairpin +1",
  884.         body="Nyame Mail",
  885.         hands="Nyame Gauntlets",
  886.         legs={ name="Mochi. Hakama +3", augments={'Enhances "Mijin Gakure" effect',}},
  887.         feet="Nyame Sollerets",
  888.         neck="Sibyl Scarf",
  889.         waist="Orpheus's Sash",
  890.         left_ear="Friomisi Earring",
  891.         right_ear="Hecate's Earring",
  892.         left_ring="Epaminondas's Ring",
  893.         right_ring="Archon Ring",
  894.         back={ name="Andartia's Mantle", augments={'INT+20','Mag. Acc+20 /Mag. Dmg.+20','Magic Damage +10','"Mag.Atk.Bns."+10',}}, 
  895.     }
  896.     sets.precast.WS['Blade: Yu'] = {
  897.         ammo="Ghastly Tathlum +1",
  898.         head="Mochi. Hatsuburi +3",
  899.         neck="Sibyl Scarf",
  900.         ear1="Moonshade Earring",
  901.         ear2="Lugra Earring +1",
  902.         body="Nyame Mail",
  903.         hands="Nyame Gauntlets",
  904.         ring1="Epaminondas's Ring",
  905.         ring2="Shiva Ring +1",
  906.         waist="Orpheus's Sash",
  907.         legs="Nyame Flanchard",
  908.         feet="Nyame Sollerets",
  909.         back=Andartia.MAB--DEXWS(alt needs testing)
  910.     }
  911.     sets.precast.WS['Aeolian Edge'] = set_combine(sets.precast.WS['Blade: Yu'],{})
  912.     sets.precast.WS['Evisceration'] = {
  913.         ammo="Yetshila +1",
  914.         head={ name="Blistering Sallet +1", augments={'Path: A',}},
  915.         body={ name="Mpaca's Doublet", augments={'Path: A',}},
  916.         hands={ name="Mpaca's Gloves", augments={'Path: A',}},
  917.         legs={ name="Mpaca's Hose", augments={'Path: A',}},
  918.         feet={ name="Mpaca's Boots", augments={'Path: A',}},
  919.         neck="Fotia Gorget",
  920.         waist="Fotia Belt",
  921.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  922.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  923.         left_ring="Lehko's Ring",
  924.         right_ring="Gere Ring",
  925.         back={ name="Andartia's Mantle", augments={'DEX+20','Accuracy+20 Attack+20','Attack+10','"Dbl.Atk."+10','Phys. dmg. taken-10%',}},
  926.     }
  927.     sets.precast.WS['Evisceration'].MAXBUFF = {
  928.         neck="Ninja Nodowa +2",
  929.     }
  930.     -- USE MACC FOR AGEHA TO STICK DEBUFF. NOT USED FOR DAMAGE EVER.
  931.     sets.precast.WS['Tachi: Ageha'] = set_combine(sets.precast.WS,{
  932.         ammo="Yamarang",
  933.         head="Mpaca's Cap",
  934.         body="Malignance Tabard",
  935.         hands="Malignance Gloves",
  936.         legs="Malignance Tights",
  937.         feet="Hattori Kyahan +3",
  938.         neck="Sanctity Necklace",
  939.         waist="Eschan Stone",
  940.         left_ear="Telos Earring",
  941.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  942.         left_ring="Stikini Ring +1",
  943.         right_ring="Stikini Ring +1",
  944.         back=Andartia.DEXWS
  945.     })
  946.    
  947.     sets.precast.WS['Tachi: Gekko'] = set_combine(sets.precast.WS['Blade: Ten'], {})
  948.     sets.precast.WS['Tachi: Kasha'] = set_combine(sets.precast.WS['Blade: Ten'], {})
  949.     sets.precast.WS['Tachi: Jinpu'] = set_combine(sets.precast.WS['Blade: Chi'],{})
  950.     sets.precast.WS['Tachi: Koki'] = set_combine(sets.precast.WS['Blade: Chi'],{})
  951.     sets.precast.WS['Tachi: Kagero'] = set_combine(sets.precast.WS['Blade: Chi'],{})
  952.     sets.precast.WS['Tachi: Goten'] = set_combine(sets.precast.WS['Blade: Chi'],{})
  953.     sets.precast.WS['Tachi: Jinpu'].MAXBUFF = set_combine(sets.precast.WS['Blade: Chi'].MAXBUFF,{})
  954.     sets.precast.WS['Tachi: Koki'].MAXBUFF = set_combine(sets.precast.WS['Blade: Chi'].MAXBUFF,{})
  955.     sets.precast.WS['Tachi: Kagero'].MAXBUFF = set_combine(sets.precast.WS['Blade: Chi'].MAXBUFF,{})
  956.     sets.precast.WS['Tachi: Goten'].MAXBUFF = set_combine(sets.precast.WS['Blade: Chi'].MAXBUFF,{})
  957.    
  958.     sets.precast.WS['Asuran Fists'] = {
  959.         ammo="Crepuscular Pebble",
  960.         head={ name="Mochi. Hatsuburi +3", augments={'Enhances "Yonin" and "Innin" effect',}},
  961.         body={ name="Mochi. Chainmail +3", augments={'Enhances "Sange" effect',}},
  962.         hands={ name="Mochizuki Tekko +3", augments={'Enh. "Ninja Tool Expertise" effect',}},
  963.         legs={ name="Mochi. Hakama +3", augments={'Enhances "Mijin Gakure" effect',}},
  964.         feet={ name="Mochi. Kyahan +3", augments={'Enh. Ninj. Mag. Acc/Cast Time Red.',}},
  965.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  966.         waist="Fotia Belt",
  967.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  968.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  969.         left_ring="Ilabrat Ring",
  970.         right_ring="Gere Ring",
  971.         back={ name="Andartia's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%','Phys. dmg. taken-10%',}},
  972.     }
  973.     sets.precast.WS['Raging Fists'] = {
  974.         ammo="Crepuscular Pebble",
  975.         head={ name="Mpaca's Cap", augments={'Path: A',}},
  976.         body={ name="Nyame Mail", augments={'Path: B',}},
  977.         hands={ name="Nyame Gauntlets", augments={'Path: B',}},
  978.         legs={ name="Mochi. Hakama +3", augments={'Enhances "Mijin Gakure" effect',}},
  979.         feet="Hattori Kyahan +3",
  980.         neck={ name="Ninja Nodowa +2", augments={'Path: A',}},
  981.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  982.         left_ear={ name="Lugra Earring +1", augments={'Path: A',}},
  983.         right_ear={ name="Moonshade Earring", augments={'"Mag.Atk.Bns."+4','TP Bonus +250',}},
  984.         left_ring="Ilabrat Ring",
  985.         right_ring="Gere Ring",
  986.         back={ name="Andartia's Mantle", augments={'STR+20','Accuracy+20 Attack+20','STR+10','Weapon skill damage +10%','Phys. dmg. taken-10%',}},
  987.     }
  988.     sets.precast.WS['Savage Blade'] = {
  989.         ammo = "Seething Bomblet +1",
  990.         head="Mpaca's Cap",
  991.         body="Nyame Mail",
  992.         hands="Nyame Gauntlets",
  993.         legs="Nyame Flanchard",
  994.         feet="Hattori Kyahan +3",
  995.         neck="Rep. Plat. Medal",
  996.         waist={ name="Sailfi Belt +1", augments={'Path: A',}},
  997.         left_ear="Lugra Earring +1",
  998.         right_ear="Moonshade Earring",
  999.         left_ring="Regal Ring",
  1000.         right_ring="Gere Ring",
  1001.         back=Andartia.DEXWS
  1002.     }  
  1003.     sets.precast.WS['Savage Blade'].MAXBUFF = set_combine(sets.precast.WS['Savage Blade'],{
  1004.         neck="Ninja Nodowa +2",
  1005.         head="Hachiya Hatsu. +3",
  1006.         right_ring="Epaminondas's Ring",
  1007.     })
  1008.     sets.precast.WS['Sanguine Blade'] = set_combine(sets.precast.WS['Blade: Ei'], {})
  1009.     sets.WSDayBonus = {head="Gavialis Helm"}
  1010. end
  1011.  
  1012. -------------------------------------------------------------------------------------------------------------------
  1013. -- Job-specific hooks that are called to process player actions at specific points in time.
  1014. -------------------------------------------------------------------------------------------------------------------
  1015. function job_pretarget(spell, action, spellMap, eventArgs)
  1016.     if state.Buff[spell.english] ~= nil then
  1017.         state.Buff[spell.english] = true
  1018.     end
  1019.     if (spell.type:endswith('Magic') or spell.type == "Ninjutsu") and buffactive.silence then
  1020.         cancel_spell()
  1021.         send_command('input /item "Echo Drops" <me>')
  1022.     end
  1023. end
  1024. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  1025. -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast.
  1026. function job_precast(spell, action, spellMap, eventArgs)
  1027.     if spell.skill == "Ninjutsu" and spell.target.type:lower() == 'self' and spellMap ~= "Utsusemi" then
  1028.         if spell.english == "Migawari" then
  1029.             classes.CustomClass = "Migawari"
  1030.         else
  1031.             classes.CustomClass = "SelfNinjutsu"
  1032.         end
  1033.     end
  1034. -- Cancel Sneak before reapplying spectral jig
  1035.     -- if spell.name == 'Spectral Jig' and buffactive.sneak then
  1036.         -- send_command('cancel 71')
  1037.     -- end
  1038. --Cancel Utsusemi Shadows during casting lower tier utsusemi spells. prevents re-casting utsusemi with more than 4 shadows remaining to prevent overbuffing
  1039.     if spell.name == 'Utsusemi: Ichi' then
  1040.         if buffactive['Copy Image'] or buffactive['Copy Image (2)'] or buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)']  then
  1041.             send_command('cancel 66; cancel 444; cancel 445; cancel 446; cancel Copy Image; cancel Copy Image (2); cancel Copy Image (3);cancel Copy Image (4+)')
  1042. --[[debug   add_to_chat(123, '**!!CASTING UTSUSEMI: ICHI - REMOVING EXISTING SHADOWS!!**')]]
  1043.         end
  1044.     elseif spell.name == 'Utsusemi: Ni' then
  1045.         if buffactive['Copy Image'] or buffactive['Copy Image (2)'] or buffactive['Copy Image (3)'] or buffactive['Copy Image (4+)']  then
  1046.             send_command('cancel 66; cancel 444; cancel 445; cancel 446; cancel Copy Image; cancel Copy Image (2); cancel Copy Image (3);cancel Copy Image (4+)')
  1047. --[[debug   add_to_chat(123, '**!!CASTING UTSUSEMI: NI - REMOVING EXISTING SHADOWS!!**')]]
  1048.         end
  1049.     end
  1050. end
  1051.  
  1052. function job_post_precast(spell, action, spellMap, eventArgs)
  1053.     -- Ranged Attacks
  1054.     if spell.action_type == 'Ranged Attack' and state.OffenseMode ~= 'LowAcc' then
  1055.         equip(sets.SangeAmmo)
  1056.     end
  1057.    
  1058.     -- Protection for lag
  1059.     if spell.name == 'Sange' and player.equipment.ammo == gear.RegularAmmo then
  1060.         state.Buff.Sange = false
  1061.         eventArgs.cancel = true
  1062.     end
  1063.  
  1064.     if spell.type == 'WeaponSkill' then
  1065.         if spell.english == 'Blade: Shun' then
  1066.             if world.day_element == 'Fire' or world.day_element == 'Thunder' or world.day_element == 'Wind' or world.day_element == 'Light' then
  1067.                 equip(sets.WSDayBonus)
  1068.            end
  1069.         elseif spell.english == 'Blade: Ku' then
  1070.             if world.day_element == 'Earth' or world.day_element == 'Light' or world.day_element == 'Dark' then
  1071.                 equip(sets.WSDayBonus)
  1072.            end
  1073.         elseif spell.english == 'Blade: Jin' then
  1074.             if world.day_element == 'Thunder' or world.day_element == 'Wind' then
  1075.                 equip(sets.WSDayBonus)
  1076.            end
  1077.         elseif spell.english == 'Exenterator' then
  1078.             if world.day_element == 'Earth' or world.day_element == 'Thunder' or world.day_element == 'Wind' then
  1079.                 equip(sets.WSDayBonus)
  1080.            end
  1081.         elseif spell.english == 'Evisceration' then
  1082.             if world.day_element == 'Earth' or world.day_element == 'Light' or world.day_element == 'Dark' then
  1083.                 equip(sets.WSDayBonus)
  1084.            end
  1085.         end
  1086.     end
  1087.  
  1088.  
  1089. end
  1090.  
  1091. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  1092. function job_midcast(spell, action, spellMap, eventArgs)
  1093.  
  1094. end
  1095.  
  1096. -- Run after the general midcast() is done.
  1097. -- eventArgs is the same one used in job_midcast, in case information needs to be persisted.
  1098. function job_post_midcast(spell, action, spellMap, eventArgs)
  1099.     if state.Buff.Futae and spellMap == 'ElementalNinjutsu' then
  1100.          equip(sets.precast.JA['Futae'])
  1101.     end
  1102. end
  1103.  
  1104. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  1105. function job_aftercast(spell, action, spellMap, eventArgs)
  1106.     if midaction() then
  1107.         return
  1108.     end
  1109.     -- Aftermath timer creation
  1110.     aw_custom_aftermath_timers_aftercast(spell)
  1111.     stance_status()
  1112.  
  1113. end
  1114.  
  1115. -------------------------------------------------------------------------------------------------------------------
  1116. -- Customization hooks for idle and melee sets, after they've been automatically constructed.
  1117. -------------------------------------------------------------------------------------------------------------------
  1118. -- Called before the Include starts constructing melee/idle/resting sets.
  1119. -- Can customize state or custom melee class values at this point.
  1120. -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done.
  1121. function job_handle_equipping_gear(playerStatus, eventArgs)
  1122.     local lockables = T{'Mamool Ja Earring', 'Aptitude Mantle', 'Nexus Cape', 'Aptitude Mantle +1', 'Warp Ring', 'Vocation Ring', 'Reraise Earring', 'Capacity Ring', 'Trizek Ring', 'Echad Ring', 'Facility Ring', 'Dim. Ring (Holla)', 'Dim. Ring (Dem)', 'Dim. Ring (Mea)'}
  1123.     local watch_slots = T{'lear','rear','ring1','ring2','back','head'}
  1124.  
  1125.     -- for _,v in pairs(watch_slots) do
  1126.         -- if lockables:contains(player.equipment[v]) then
  1127.             -- disable(v)
  1128.             -- if has_charges(player.equipment[v]) and (not is_enchant_ready(player.equipment[v])) then
  1129.                 -- enable(v)
  1130.             -- end
  1131.         -- else
  1132.             -- enable(v)
  1133.         -- end
  1134.     -- end
  1135. ninbuff_status()
  1136. stance_status()
  1137. tool_counter()
  1138. validateTextInformation()
  1139. end
  1140.  
  1141. -- Modify the default idle set after it was constructed.
  1142. function customize_idle_set(idleSet)
  1143.     if state.HybridMode.value == 'DT' then
  1144.         if state.Buff.Migawari then
  1145.             idleSet = set_combine(idleSet, sets.buff.Migawari)
  1146.         else
  1147.             idleSet = set_combine(idleSet, sets.idle.PDT)
  1148.         end
  1149.     else
  1150.         idleSet = idleSet
  1151.     end
  1152.     if moving then
  1153.         idleSet=set_combine(idleSet, {feet=gear.MovementFeet.name})
  1154.     end
  1155.     return idleSet
  1156. end
  1157.  
  1158. -- Modify the default melee set after it was constructed.
  1159. function customize_melee_set(meleeSet)
  1160.     meleeSet = set_combine(meleeSet, select_ammo())
  1161.     if state.TreasureMode.value == 'Fulltime' then
  1162.         meleeSet = set_combine(meleeSet, sets.TreasureHunter)
  1163.     end
  1164.     if player.equipment.main == 'Kannagi' then
  1165.         if buffactive['Aftermath: Lv.3'] then
  1166.             meleeSet = set_combine(meleeSet, sets.engaged.Kannagi.AM3)
  1167.         end
  1168.     end
  1169.     return meleeSet
  1170. end
  1171.  
  1172. -------------------------------------------------------------------------------------------------------------------
  1173. -- General hooks for other events.
  1174. -------------------------------------------------------------------------------------------------------------------
  1175. -- Called when a player gains or loses a buff.
  1176. -- buff == buff gained or lost
  1177. -- gain == true if the buff was gained, false if it was lost.
  1178. function job_buff_change(buff, gain)
  1179.     if state.Buff[buff] ~= nil then
  1180.         if not midaction() then
  1181.             handle_equipping_gear(player.status)
  1182.         end
  1183.     end
  1184.     if (buff == 'Innin' and gain or buffactive['Innin']) then
  1185.         state.CombatForm:set('Innin')
  1186.         if not midaction() then
  1187.             handle_equipping_gear(player.status)
  1188.         end
  1189.     else
  1190.         state.CombatForm:reset()
  1191.         if not midaction() then
  1192.             handle_equipping_gear(player.status)
  1193.         end
  1194.     end
  1195.  
  1196.     -- If we gain or lose any haste buffs, adjust which gear set we target.
  1197.     if S{'haste', 'march', 'mighty guard', 'embrava', 'haste samba', 'geo-haste', 'indi-haste'}:contains(buff:lower()) then
  1198.         determine_haste_group()
  1199.         if not midaction() then
  1200.             handle_equipping_gear(player.status)
  1201.         end
  1202.     end
  1203.  
  1204.  
  1205. end
  1206.  
  1207. function ninbuff_status()
  1208.     if buffactive['Copy Image'] then
  1209.         shadows='1 Shadow'
  1210.     elseif buffactive['Copy Image (2)'] then
  1211.         shadows='2 Shadows'
  1212.     elseif buffactive['Copy Image (3)'] then
  1213.         shadows='3 Shadows'
  1214.     elseif buffactive['Copy Image (4+)'] then
  1215.         shadows='4 Shadows'
  1216.     else
  1217.         shadows='No Shadows'
  1218.     end
  1219.    
  1220.     if buffactive['Migawari'] then
  1221.         migawari='Active'
  1222.     else
  1223.         migawari='Inactive'
  1224.     end
  1225. end
  1226.  
  1227. function job_status_change(newStatus, oldStatus, eventArgs)
  1228.     if newStatus == 'Engaged' then
  1229.         update_combat_form()
  1230.     end
  1231. select_weapons()
  1232. end
  1233.  
  1234. function stance_status()
  1235.  
  1236.     if buffactive['Innin'] then
  1237.         stance = 'Innin'
  1238.     elseif buffactive['Yonin'] then
  1239.         stance = 'Yonin'
  1240.     else
  1241.         stance = 'No Stance'
  1242.     end
  1243. end
  1244. -------------------------------------------------------------------------------------------------------------------
  1245. -- User code that supplements self-commands.
  1246. -------------------------------------------------------------------------------------------------------------------
  1247. -- Called by the default 'update' self-command.
  1248. function job_update(cmdParams, eventArgs)
  1249.     select_weapons()
  1250.     select_ammo()
  1251.     select_movement_feet()
  1252.     determine_haste_group()
  1253.     update_combat_form()
  1254.     th_update(cmdParams, eventArgs)
  1255.     tool_counter()
  1256.     validateTextInformation()
  1257.     stance_status()
  1258. end
  1259.  
  1260. -------------------------------------------------------------------------------------------------------------------
  1261. -- Facing ratio
  1262. -------------------------------------------------------------------------------------------------------------------
  1263. function facing_away(spell)
  1264.     if spell.target.type == 'MONSTER' then
  1265.         local dir = V{spell.target.x, spell.target.y} - V{player.x, player.y}
  1266.         local heading = V{}.from_radian(player.facing)
  1267.         local angle = V{}.angle(dir, heading):degree():abs()
  1268.         if angle > 90 then
  1269.             add_to_chat(8, 'Aborting... angle > 90')
  1270.             return true
  1271.         else
  1272.             return false
  1273.         end
  1274.     end
  1275. end
  1276. -------------------------------------------------------------------------------------------------------------------
  1277. -- Utility functions specific to this job.
  1278. -------------------------------------------------------------------------------------------------------------------
  1279. -- State buff checks that will equip buff gear and mark the event as handled.
  1280. function check_buff(buff_name, eventArgs)
  1281.     if state.Buff[buff_name] then
  1282.         equip(sets.buff[buff_name] or {})
  1283.         if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then
  1284.             equip(sets.TreasureHunter)
  1285.         end
  1286.         eventArgs.handled = true
  1287.     end
  1288. end
  1289.  
  1290. -- Check for various actions that we've specified in user code as being used with TH gear.
  1291. -- This will only ever be called if TreasureMode is not 'None'.
  1292. -- Category and Param are as specified in the action event packet.
  1293. function th_action_check(category, param)
  1294.     if category == 2 or -- any ranged attack
  1295.         --category == 4 or -- any magic action
  1296.         (category == 3 and param == 30) or -- Aeolian Edge
  1297.         (category == 6 and info.default_ja_ids:contains(param)) or -- Provoke, Animated Flourish
  1298.         (category == 14 and info.default_u_ja_ids:contains(param)) -- Quick/Box/Stutter Step, Desperate/Violent Flourish
  1299.         then
  1300.             return true
  1301.     end
  1302. end
  1303.  
  1304. function select_movement_feet()
  1305.     if world.time >= (17*60) or world.time < (7*60) then
  1306.         gear.MovementFeet.name = gear.NightFeet
  1307.     else
  1308.         gear.MovementFeet.name = gear.DayFeet
  1309.     end
  1310. end
  1311.  
  1312. function determine_haste_group()
  1313.     classes.CustomMeleeGroups:clear()
  1314.    
  1315.     h = 0
  1316.     -- Spell Haste 15/30
  1317.     if buffactive[33] then
  1318.         if state.HasteMode.value == 'Haste I' then
  1319.             h = h + 15
  1320.         elseif state.HasteMode.value == 'Haste II' then
  1321.             h = h + 30
  1322.         end
  1323.     end
  1324.     -- Geo Haste 29/35/40 (assumes dunna and idris have 900 skill)
  1325.     if buffactive[580] then
  1326.         if state.GeoMode.value == 'Trusts' then
  1327.             h = h + 29.9
  1328.         elseif state.GeoMode.value == 'Dunna' then
  1329.             h = h + 35.4
  1330.         elseif state.GeoMode.value == 'Idris' then
  1331.             h = h + 40
  1332.         end
  1333.     end
  1334.     -- Mighty Guard 15
  1335.     if buffactive[604] then
  1336.         h = h + 15
  1337.     end
  1338.     -- Embrava 25.9
  1339.     if buffactive.embrava then
  1340.         h = h + 25.9
  1341.     end
  1342.     -- March(es)
  1343.     if buffactive.march then
  1344.         if state.MarchMode.value == 'Honor' then
  1345.             if buffactive.march == 2 then
  1346.                 h = h + 27 + 16
  1347.             elseif buffactive.march == 1 then
  1348.                 h = h + 16
  1349.             elseif buffactive.march == 3 then
  1350.                 h = h + 27 + 17 + 16
  1351.             end
  1352.         elseif state.MarchMode.value == 'Trusts' then
  1353.             if buffactive.march == 2 then
  1354.                 h = h + 26
  1355.             elseif buffactive.march == 1 then
  1356.                 h = h + 16
  1357.             elseif buffactive.march == 3 then
  1358.                 h = h + 27 + 17 + 16
  1359.             end
  1360.         elseif state.MarchMode.value == '7' then
  1361.             if buffactive.march == 2 then
  1362.                 h = h + 27 + 17
  1363.             elseif buffactive.march == 1 then
  1364.                 h = h + 27
  1365.             elseif buffactive.march == 3 then
  1366.                 h = h + 27 + 17 + 16
  1367.             end
  1368.         elseif state.MarchMode.value == '3' then
  1369.             if buffactive.march == 2 then
  1370.                 h = h + 13.5 + 20.6
  1371.             elseif buffactive.march == 1 then
  1372.                 h = h + 20.6
  1373.             elseif buffactive.march == 3 then
  1374.                 h = h + 27 + 17 + 16
  1375.             end
  1376.         end
  1377.     end
  1378.  
  1379.     -- Determine CustomMeleeGroups
  1380.     if h >= 15 and h < 30 then
  1381.         classes.CustomMeleeGroups:append('Haste_15')
  1382.         add_to_chat('Haste Group: 15% -- From Haste Total: '..h)
  1383.     elseif h >= 30 and h < 35 then
  1384.         classes.CustomMeleeGroups:append('Haste_30')
  1385.         add_to_chat('Haste Group: 30% -- From Haste Total: '..h)
  1386.     elseif h >= 35 and h < 40 then
  1387.         classes.CustomMeleeGroups:append('Haste_35')
  1388.         add_to_chat('Haste Group: 35% -- From Haste Total: '..h)
  1389.     elseif h >= 40 then
  1390.         classes.CustomMeleeGroups:append('MaxHaste')
  1391.         add_to_chat('Haste Group: Max -- From Haste Total: '..h)
  1392.     end
  1393. end
  1394.  
  1395. -- Handle notifications of general user state change.
  1396. function job_state_change(stateField, newValue, oldValue)
  1397.  
  1398. end
  1399.  
  1400. -- Creating a custom spellMap, since Mote capitalized absorbs incorrectly
  1401. function job_get_spell_map(spell, default_spell_map)
  1402.     if spell.type == 'Trust' then
  1403.         return 'Trust'
  1404.     end
  1405. end
  1406.  
  1407. -- Set eventArgs.handled to true if we don't want the automatic display to be run.
  1408. function display_current_job_state(eventArgs)
  1409.     local msg = ''
  1410.     msg = msg .. 'Offense: '..state.OffenseMode.current
  1411.  
  1412.     if state.CombatWeapon.value == 'Kannagi' or state.CombatWeapon.value == 'GKT' then
  1413.         msg = msg..' --'..state.CombatWeapon.value..'-- '
  1414.     end
  1415.    
  1416.     if state.DefenseMode.value ~= 'None' then
  1417.         local defMode = state[state.DefenseMode.value ..'DefenseMode'].current
  1418.         msg = msg .. ', Defense: '..state.DefenseMode.value..' '..defMode
  1419.     end
  1420.     if state.HasteMode.value ~= 'Normal' then
  1421.         msg = msg .. ', Haste: '..state.HasteMode.current
  1422.     end
  1423.     if state.MarchMode.value ~= 'Normal' then
  1424.         msg = msg .. ', March Mode: '..state.MarchMode.current
  1425.     end
  1426.     if state.RangedMode.value ~= 'Normal' then
  1427.         msg = msg .. ', Rng: '..state.RangedMode.current
  1428.     end
  1429.     if state.Kiting.value then
  1430.         msg = msg .. ', Kiting'
  1431.     end
  1432.     if state.PCTargetMode.value ~= 'default' then
  1433.         msg = msg .. ', Target PC: '..state.PCTargetMode.value
  1434.     end
  1435.     if state.SelectNPCTargets.value then
  1436.         msg = msg .. ', Target NPCs'
  1437.     end
  1438.     add_to_chat(123, msg)
  1439.     eventArgs.handled = true
  1440. end
  1441.  
  1442. -- Call from job_precast() to setup aftermath information for custom timers.
  1443. function aw_custom_aftermath_timers_precast(spell)
  1444.     if spell.type == 'WeaponSkill' then
  1445.         info.aftermath = {}
  1446.  
  1447.         local empy_ws = "Blade: Hi"
  1448.  
  1449.         info.aftermath.weaponskill = empy_ws
  1450.         info.aftermath.duration = 0
  1451.  
  1452.         info.aftermath.level = math.floor(player.tp / 1000)
  1453.         if info.aftermath.level == 0 then
  1454.             info.aftermath.level = 1
  1455.         end
  1456.  
  1457.         if spell.english == empy_ws and player.equipment.main == 'Kannagi' then
  1458.             -- nothing can overwrite lvl 3
  1459.             if buffactive['Aftermath: Lv.3'] then
  1460.                 return
  1461.             end
  1462.             -- only lvl 3 can overwrite lvl 2
  1463.             if info.aftermath.level ~= 3 and buffactive['Aftermath: Lv.2'] then
  1464.                 return
  1465.             end
  1466.  
  1467.             -- duration is based on aftermath level
  1468.             info.aftermath.duration = 30 * info.aftermath.level
  1469.         end
  1470.     end
  1471. end
  1472.  
  1473. -- Call from job_aftercast() to create the custom aftermath timer.
  1474. function aw_custom_aftermath_timers_aftercast(spell)
  1475.     -- prevent gear being locked when it's currently impossible to cast
  1476.     if not spell.interrupted and spell.type == 'WeaponSkill' and
  1477.         info.aftermath and info.aftermath.weaponskill == spell.english and info.aftermath.duration > 0 then
  1478.  
  1479.         local aftermath_name = 'Aftermath: Lv.'..tostring(info.aftermath.level)
  1480.         send_command('timers d "Aftermath: Lv.1"')
  1481.         send_command('timers d "Aftermath: Lv.2"')
  1482.         send_command('timers d "Aftermath: Lv.3"')
  1483.         send_command('timers c "'..aftermath_name..'" '..tostring(info.aftermath.duration)..' down abilities/aftermath'..tostring(info.aftermath.level)..'.png')
  1484.  
  1485.         info.aftermath = {}
  1486.     end
  1487. end
  1488.  
  1489. function select_ammo()
  1490.     if state.Buff.Sange then
  1491.         return sets.SangeAmmo
  1492.     else
  1493.         return sets.RegularAmmo
  1494.     end
  1495. end
  1496.  
  1497. function select_weapons()
  1498.     if player.equipment.main ~= state.mainWeapon.current then
  1499.         equip({Main=state.mainWeapon.current,sub=state.subWeapon.current})
  1500.     end
  1501.     if player.equipment.sub ~= state.subWeapon.current then
  1502.         equip({Main=state.mainWeapon.current,sub=state.subWeapon.current})
  1503.     end
  1504.  
  1505. end
  1506.  
  1507. function update_combat_form()
  1508.     --if state.Buff.Innin then
  1509.     --  state.CombatForm:set('Innin')
  1510.     --end
  1511.     --if player.equipment.main == 'Kannagi' then
  1512.     --  state.CombatWeapon:set('Kannagi')
  1513.     if player.equipment.main == 'Beryllium Tachi' then
  1514.         state.CombatWeapon:set('GKT')  
  1515.     elseif player.equipment.main == "Hachimonji" then
  1516.         state.CombatWeapon:set('GKT')
  1517.     elseif player.equipment.main == "Karambit" then
  1518.         state.CombatWeapon:set('H2H')
  1519.     else
  1520.         state.CombatWeapon:reset()
  1521.     end
  1522. end
  1523. function job_self_command(cmdParams, eventArgs)
  1524.     if cmdParams[1] == 'GktMode' then
  1525.         state.mainWeapon:set('Hachimonji')
  1526.         state.subWeapon:set('Bloodrain strap')
  1527.         state.CombatWeapon:set('GKT')  
  1528.         select_weapons()
  1529.         setupTextWindow()
  1530.         update_combat_form()
  1531.     elseif cmdParams[1] == 'KatanaMode' then
  1532.         state.mainWeapon:set('Heishi Shorinken')
  1533.         state.subWeapon:set('Yagyu Darkblade')
  1534.         state.CombatWeapon:reset()
  1535.         select_weapons()
  1536.         setupTextWindow()
  1537.         update_combat_form()
  1538.     elseif cmdParams[1] == 'SwordMode' then
  1539.         state.mainWeapon:set('Naegling')
  1540.         state.subWeapon:set("Uzura +2")
  1541.         state.CombatWeapon:reset()
  1542.         select_weapons()
  1543.         setupTextWindow()
  1544.         update_combat_form()
  1545.     elseif cmdParams[1] == 'runspeed' then
  1546.         runspeed:toggle()
  1547.         updateRunspeedGear(runspeed.value)
  1548.     end
  1549.  
  1550. end
  1551.  
  1552. -- Select default macro book on initial load or subjob change.
  1553. function select_default_macro_book()
  1554.     -- Default macro set/book
  1555.     if player.sub_job == 'DNC' then
  1556.         set_macro_page(1, 8)
  1557.     elseif player.sub_job == 'THF' then
  1558.         set_macro_page(1, 8)
  1559.     else
  1560.         set_macro_page(1, 8)
  1561.     end
  1562. end
  1563.  
  1564. --NIN_HUD--
  1565. --------------------------------------------------------------------------------------------------------------
  1566. -- HUD STUFF
  1567. --------------------------------------------------------------------------------------------------------------
  1568. require('logger')
  1569. require('tables')
  1570. require('strings')
  1571. --global tool placeholder
  1572. shihei  = {}
  1573. inoshi  = {}
  1574. chono   = {}
  1575. shika   = {}
  1576. happo   = {}
  1577. stance  = {}
  1578. shadows = {}
  1579. Migiwari = {}
  1580. --global colors
  1581. color={}
  1582. color.red       ='(255,0,0)'
  1583. color.yellow    ='(0,255,0)'
  1584. color.blue      ='(0,0,255)'
  1585. color.white     ='(255,255,255)'
  1586. color.black     ='(0,0,0)'
  1587. color.grey      ='(175,175,175)'
  1588. color.ltred     ='(255,125,125)'
  1589. color.ltblue    ='(125,125,255)'
  1590. color.ltyellow  ='(125,255,125)'
  1591.  
  1592.  
  1593. function tool_counter()
  1594.  
  1595.     local inv = windower.ffxi.get_items(0) -- get main inventory
  1596.    
  1597.     shihei.count = 0
  1598.     shihei.id = 1179
  1599.    
  1600.     inoshi.count = 0
  1601.     inoshi.id = 2971
  1602.    
  1603.     chono.count = 0
  1604.     chono.id = 2973
  1605.    
  1606.     shika.count = 0
  1607.     shika.id = 2972
  1608.    
  1609.     happo.count = 0
  1610.     happo.id = 21353
  1611.    
  1612.     for b,v in ipairs(inv) do
  1613.         if v.id == shihei.id then
  1614.             shihei.count = shihei.count + v.count
  1615.         elseif v.id == inoshi.id then
  1616.             inoshi.count = inoshi.count + v.count
  1617.         elseif v.id == chono.id then
  1618.             chono.count = chono.count + v.count
  1619.         elseif v.id == shika.id then
  1620.             shika.count = shika.count + v.count
  1621.         elseif v.id == happo.id then
  1622.             happo.count = happo.count + v.count
  1623.         end
  1624.     end
  1625. --[[
  1626. Debug Viewer
  1627.     windower.add_to_chat(8,'shihei:' ..shihei.count)
  1628.     windower.add_to_chat(8,'inoshi:' ..inoshi.count)
  1629.     windower.add_to_chat(8,'chono:' ..chono.count)
  1630.     windower.add_to_chat(8,'shika:' ..shika.count)
  1631.     windower.add_to_chat(8,'happo:' ..happo.count)
  1632. ]]
  1633. end
  1634.  
  1635.  
  1636. const_on = "\\cs(32, 255, 32)ON\\cr"
  1637. const_off = "\\cs(255, 32, 32)OFF\\cr"
  1638.  
  1639. hud_x_pos_og = hud_x_pos
  1640. hud_y_pos_og = hud_y_pos
  1641. hud_font_size_og = hud_font_size
  1642. hud_padding_og = hud_padding
  1643. hud_transparency_og = hud_transparency
  1644.  
  1645. MB_Window = 0
  1646. time_start = 0
  1647. hud_padding = 10
  1648.  
  1649. -- Standard Mode
  1650. hub_mode_std = [[\cs(204, 0, 0)KeyBinds    \cs(255, 115, 0)GS Info: \cr              
  1651.         \cs(175, 125, 225)${KB_C_MH}\cs(0, 150, 175)Main:\cr \cs(125,255,125)${player_current_mainweapon|Kannagi}
  1652.         \cs(175, 125, 225)${KB_C_OH}\cs(0, 150, 175)Sub:\cr \cs(125,255,125)  ${player_current_subweapon|Kannagi}
  1653.         \cs(175, 125, 225)${KB_Idle_M}\cs(0, 150, 175)Idle Mode:\cr         ${player_current_idle}
  1654.         \cs(175, 125, 225)${KB_Melee_M}\cs(0, 150, 175)Melee Mode:\cr     ${player_current_melee}
  1655.         \cs(175, 125, 225)${KB_WS_M}\cs(0, 150, 175)WS Mode:\cr            ${player_current_ws}
  1656.         \cs(175, 125, 225)${KB_PDT_M}\cs(0, 150, 175)Hybrid Mode:\cr    ${player_current_Hybrid}
  1657.         \cs(175, 125, 225)${KB_RA_M}\cs(0, 150, 175)Ranged Mode:\cr  ${player_current_Ranged}
  1658.         \cs(175, 125, 225)${KB_CAST_M}\cs(0, 150, 175)Casting Mode:\cr  ${player_current_casting}
  1659.         \cs(175, 125, 225)${KB_Haste_M}\cs(0, 150, 175)Haste Mode:\cr       ${player_current_Haste}
  1660.         \cs(175, 125, 225)${KB_March_M}\cs(0, 150, 175)March Mode:\cr     ${player_current_March}
  1661.         \cs(204, 0, 0)Item    \cs(255, 115, 0)                            Count: \cr    
  1662.         \cs(255, 150, 0)   Shihei:\cr \cs${shihei_color}                            ${Shihei_Left}
  1663.         \cs(255, 150, 0)   Inoshinofuda:\cr \cs${ino_color}            ${inoshi_Left}
  1664.         \cs(255, 150, 0)   Shikanofuda:\cr \cs${shika_color}              ${shika_left}
  1665.         \cs(255, 150, 0)   Chonofuda:\cr \cs${chono_color}                  ${chono_left}
  1666.         \cs(255, 150, 0)   Happo Shuriken:\cr \cs${happo_color}      ${happo_left}
  1667.         \cs(204, 0, 0)Job Info\cs(255, 115, 0)                           Detail: \cr    
  1668.         \cs(255, 150, 200)   Stance:\cr \cs${stance_color}                            ${stance_value}
  1669.         \cs(255, 150, 200)   Shadows:\cr \cs${shadow_color}                       ${shadow_value}
  1670.         \cs(255, 150, 200)   Migiwari:\cr \cs${migawari_color}                        ${migawari_value}
  1671. ]]
  1672.  
  1673.  
  1674.  
  1675. -- init style
  1676. hub_mode = hub_mode_std
  1677. hub_options = hub_options_std
  1678. hub_job = hub_job_std
  1679. hub_battle = hub_battle_std
  1680.  
  1681. KB = {}
  1682. KB['KB_C_MH']   = '   (NUM /)         '
  1683. KB['KB_C_OH']   = '   (NUM *)          '
  1684. KB['KB_Idle_M'] = '   (NUM 6)         '
  1685. KB['KB_Melee_M']= '   (NUM 7)         '
  1686. KB['KB_WS_M']   = '   (NUM 5)        '
  1687. KB['KB_PDT_M']  = '   (NUM 8)        '
  1688. KB['KB_RA_M']   = '   (NUM 9)        '
  1689. KB['KB_CAST_M'] = '   (NUM 4)        '
  1690. KB['KB_Haste_M']= '   (NUM -)         '
  1691. KB['KB_March_M']= '   (NUM +)        '
  1692.  
  1693.  
  1694.  
  1695. function validateTextInformation()
  1696.    
  1697.     local stancecolor   ={}
  1698.     local shiheicolor   ={}
  1699.     local inocolor      ={}
  1700.     local chonocolor    ={}
  1701.     local shikacolor    ={}
  1702.     local happocolor    ={}
  1703.     local shadowcolor   ={}
  1704.     local migawaricolor ={}
  1705.  
  1706.    
  1707.     if stance == "No Stance"    then
  1708.         stancecolor = color.grey
  1709.     elseif stance == "Innin" then
  1710.         stancecolor = color.ltblue
  1711.     elseif stance == "Yonin"    then
  1712.         stancecolor = color.ltred
  1713.     else
  1714.         stancecolor=color.white
  1715.     end
  1716.  
  1717.     if shihei.count ~= nil then
  1718.         if shihei.count == 0 then
  1719.             shiheicolor = color.red
  1720.         elseif shihei.count <= 20 then
  1721.             shiheicolor = color.ltred
  1722.         elseif shihei.count <= 50 then
  1723.             shiheicolor = color.ltyellow
  1724.         else
  1725.             shiheicolor = color.white
  1726.         end
  1727.     else
  1728.         shiheicolor = color.white
  1729.     end
  1730.     if inoshi.count ~= nil then    
  1731.         if inoshi.count == 0 then
  1732.             inocolor = color.red
  1733.         elseif inoshi.count <= 20 then
  1734.             inocolor = color.ltred
  1735.         elseif inoshi.count <= 50 then
  1736.             inocolor = color.ltyellow
  1737.         else
  1738.             inocolor = color.white
  1739.         end
  1740.     else
  1741.         inocolor = color.white
  1742.     end
  1743.     if  shika.count ~= nil then
  1744.         if shika.count == 0 then
  1745.             shikacolor = color.red
  1746.         elseif shika.count <= 20 then
  1747.             shikacolor = color.ltred
  1748.         elseif shika.count <= 50 then
  1749.             shikacolor = color.ltyellow
  1750.         else
  1751.             shikacolor = color.white
  1752.         end
  1753.     else
  1754.         shikacolor = color.white
  1755.     end
  1756.    
  1757.     if chono.count ~= nil then
  1758.         if chono.count == 0 then
  1759.             chonocolor = color.red
  1760.         elseif chono.count <= 20 then
  1761.             chonocolor = color.ltred
  1762.         elseif chono.count <= 50 then
  1763.             chonocolor = color.ltyellow
  1764.         else
  1765.             chonocolor = color.white
  1766.         end
  1767.     else
  1768.         chonocolor = color.white
  1769.     end
  1770.    
  1771.     if happo.count ~=nil then
  1772.         if happo.count == 0 then
  1773.             happocolor = color.red
  1774.         elseif happo.count <= 20 then
  1775.             happocolor = color.ltred
  1776.         elseif happo.count <= 50 then
  1777.             happocolor = color.ltyellow
  1778.         else
  1779.             happocolor = color.white
  1780.         end
  1781.     else
  1782.         happocolor = color.white
  1783.     end
  1784.  
  1785.     if shadows =='1 Shadow' then
  1786.         shadowcolor=color.ltred
  1787.     elseif shadows=='2 Shadows' then
  1788.         shadowcolor=color.ltyellow
  1789.     elseif shadows=='3 Shadows' then
  1790.         shadowcolor=color.ltgreen
  1791.     elseif shadows=='4 Shadows' then
  1792.         shadowcolor=color.ltblue
  1793.     elseif shadows=='No Shadows' then
  1794.         shadowcolor=color.red
  1795.     else
  1796.         shadowcolor=color.white
  1797.     end
  1798.    
  1799.     if migawari=='Active' then
  1800.         migawaricolor=color.ltblue
  1801.     elseif migawari=='Inactive' then
  1802.         migawaricolor=color.red
  1803.     else
  1804.         migawaricolor=color.white
  1805.     end
  1806.  
  1807.  
  1808.     --Mode Information
  1809.     main_text_hub.player_current_idle =  state.IdleMode.current
  1810.     main_text_hub.player_current_melee =  state.OffenseMode.current
  1811.     main_text_hub.player_current_ws =  state.WeaponskillMode.current
  1812.     main_text_hub.player_current_mainweapon = state.mainWeapon.current
  1813.     main_text_hub.player_current_subweapon = state.subWeapon.current
  1814.     main_text_hub.player_current_Hybrid = state.HybridMode.current
  1815.     main_text_hub.player_current_Ranged = state.RangedMode.current 
  1816.     main_text_hub.player_current_casting = state.CastingMode.current
  1817.     main_text_hub.player_current_Haste = state.HasteMode.value
  1818.     main_text_hub.player_current_March = state.MarchMode.current    
  1819.    
  1820.     --inventory counts
  1821.     main_text_hub.Shihei_Left=shihei.count
  1822.     main_text_hub.inoshi_Left=inoshi.count
  1823.     main_text_hub.chono_left=chono.count
  1824.     main_text_hub.shika_left=shika.count
  1825.     main_text_hub.happo_left=happo.count
  1826.    
  1827.     --job details
  1828.     main_text_hub.stance_value=stance
  1829.     main_text_hub.shadow_value=shadows
  1830.     main_text_hub.migawari_value=migawari
  1831.    
  1832.     main_text_hub.stance_color=stancecolor
  1833.     main_text_hub.shihei_color=shiheicolor
  1834.     main_text_hub.ino_color=inocolor
  1835.     main_text_hub.chono_color=chonocolor
  1836.     main_text_hub.shika_color=shikacolor
  1837.     main_text_hub.happo_color=happocolor
  1838.     main_text_hub.shadow_color=shadowcolor
  1839.     main_text_hub.migawari_color=migawaricolor
  1840.  
  1841. end
  1842.  
  1843. function setupTextWindow()
  1844.  
  1845.     local default_settings = {}
  1846.     default_settings.pos = {}
  1847.     default_settings.pos.x = hud_x_pos
  1848.     default_settings.pos.y = hud_y_pos
  1849.    
  1850.     default_settings.bg = {}
  1851.     default_settings.bg.alpha = hud_transparency
  1852.     default_settings.bg.red = 30
  1853.     default_settings.bg.green = 20
  1854.     default_settings.bg.blue = 55
  1855.     default_settings.bg.visible = true
  1856.    
  1857.     default_settings.flags = {}
  1858.     default_settings.flags.right = false
  1859.     default_settings.flags.bottom = false
  1860.     default_settings.flags.bold = true
  1861.     default_settings.flags.draggable = hud_draggable
  1862.     default_settings.flags.italic = false
  1863.    
  1864.     default_settings.padding = hud_padding
  1865.    
  1866.     default_settings.text = {}
  1867.     default_settings.text.size = hud_font_size
  1868.     default_settings.text.font = hud_font
  1869.     default_settings.text.fonts = {}
  1870.     default_settings.text.alpha = 255
  1871.     default_settings.text.red = 147
  1872.     default_settings.text.green = 161
  1873.     default_settings.text.blue = 161
  1874.    
  1875.     default_settings.text.stroke = {}
  1876.     default_settings.text.stroke.width = 1
  1877.     default_settings.text.stroke.alpha = 255
  1878.     default_settings.text.stroke.red = 0
  1879.     default_settings.text.stroke.green = 0
  1880.     default_settings.text.stroke.blue = 0
  1881.  
  1882.     --Creates the initial Text Object will use to create the different sections in
  1883.     if not (main_text_hub == nil) then
  1884.         texts.destroy(main_text_hub)
  1885.     end
  1886.     main_text_hub = texts.new('', default_settings, default_settings)
  1887.  
  1888.     --Appends the different sections to the main_text_hub
  1889.     texts.append(main_text_hub, hub_mode)
  1890.     texts.update(main_text_hub, KB)
  1891.     --We then do a quick validation
  1892.     validateTextInformation()
  1893.  
  1894.     --Finally we show this to the user
  1895.     main_text_hub:show()
  1896.    
  1897. end
  1898. --[AUTO MOVEMENT SPEED LOGIC]
  1899.  
  1900. runspeed = M(false)
  1901. mov = {counter=0}
  1902. if player and player.index and windower.ffxi.get_mob_by_index(player.index) then
  1903.     mov.x = windower.ffxi.get_mob_by_index(player.index).x
  1904.     mov.y = windower.ffxi.get_mob_by_index(player.index).y
  1905.     mov.z = windower.ffxi.get_mob_by_index(player.index).z
  1906. end
  1907. moving = false
  1908.  
  1909. windower.raw_register_event('prerender',function()
  1910.     mov.counter = mov.counter + 1;
  1911.     if mov.counter>10 then
  1912.         local pl = windower.ffxi.get_mob_by_index(player.index)
  1913.         if pl and pl.x and mov.x then
  1914.             local movement = math.sqrt( (pl.x-mov.x)^2 + (pl.y-mov.y)^2 + (pl.z-mov.z)^2 ) > 0.1
  1915.             if movement and not moving then
  1916.                 send_command('gs c runspeed')
  1917.                 moving = true
  1918.             elseif not movement and moving then
  1919.                 send_command('gs c runspeed')
  1920.                 moving = false
  1921.             end
  1922.         end
  1923.  
  1924.         if pl and pl.x then
  1925.             mov.x = pl.x
  1926.             mov.y = pl.y
  1927.             mov.z = pl.z
  1928.         end
  1929.         mov.counter = 0
  1930.     end
  1931. end)
  1932.  
  1933. function updateRunspeedGear()  
  1934.     handle_equipping_gear(player.status, pet.status)
  1935. end
Add Comment
Please, Sign In to add comment