├── data ├── User │ └── Place custom files here.txt ├── common │ └── Place Non-Sel Gearswaps Here.txt ├── Selindrile │ ├── Rename.bat │ ├── Selindrile_Crafting.lua │ ├── Selindrile-Globals.lua │ ├── Selindrile-Items.lua │ ├── Selindrile_Drg_Gear.lua │ ├── Selindrile_Mnk_Gear.lua │ ├── Selindrile_Rng_Gear.lua │ └── Selindrile_Drk_Gear.lua ├── Cheat Sheet.txt ├── DRG.lua ├── THF.lua ├── WAR.lua └── MNK.lua ├── .gitattributes ├── .gitignore ├── libs ├── Snaps-RngHelper_Settings.xml ├── Sel-GlobalItems.lua ├── organizer-lib.lua ├── Sel-MonsterAbilities.lua └── Modes.lua ├── README.md ├── Sel_Elemental_QoL_Shortcuts.txt └── init.txt /data/User/Place custom files here.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/common/Place Non-Sel Gearswaps Here.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /data/Selindrile/Rename.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal enableDelayedExpansion 3 | set /p "string1=Enter the sequence to be replaced : " 4 | set /p "string2=Enter the new sequence : " 5 | for %%F in (*%string1%*.*) do ( 6 | set "filename=%%F" 7 | ren "!filename!" "!filename:%string1%=%string2%!" 8 | ) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # git ls-files --others --exclude-from=.git/info/exclude 2 | # Lines that start with '#' are comments. 3 | 4 | equip_processing.lua 5 | export.lua 6 | flow.lua 7 | gearswap.lua 8 | helper_functions.lua 9 | packet_parsing.lua 10 | readme.md 11 | README.md 12 | refresh.lua 13 | statics.lua 14 | targets.lua 15 | triggers.lua 16 | user_functions.lua 17 | validate.lua 18 | version_history.txt 19 | beta_examples_and_information/* 20 | libs/Mote-* 21 | libs/rev1/* 22 | *_Gear.lua 23 | *_Crafting.lua 24 | *-Items.lua 25 | *-Globals.lua 26 | data/common/* 27 | data/user/* 28 | data/export/* 29 | Snaps-RngHelper_Settings.xml 30 | 31 | 32 | libs/closetCleaner.lua 33 | 34 | Modes.lua 35 | organizer-lib.lua 36 | data/export/* 37 | -------------------------------------------------------------------------------- /libs/Snaps-RngHelper_Settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | default 5 | 6 | 7 | 8 | 0 9 | 1.1 10 | 0 11 | 2.75 12 | 2.25 13 | 2.75 14 | 0 15 | 1.15 16 | 2.75 17 | 2.45 18 | 19 | pummel 20 | Last Stand 21 | 22 | 23 | 24 | 0 25 | 1.1 26 | 0 27 | 2.75 28 | 2.25 29 | 2.75 30 | 0 31 | 1.15 32 | 2.75 33 | 2.45 34 | 35 | pummel 36 | Last Stand 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /data/Selindrile/Selindrile_Crafting.lua: -------------------------------------------------------------------------------- 1 | --Have a Crafting/Gathering Modes state 2 | --Have a Normal/HQ/NQ state 3 | --Watch for gained buffs containing Imagery, if it does, jump to the correct Crafting Mode 4 | --Add Gathering Sets 5 | --[[ 6 | sets.Fishing = {range="Ebisu Fishing Rod",neck="Fisher's Torque",body="Fisherman's Smock",hands="Fsh. Gloves",ring1="Noddy Ring",ring2=="Puffin Ring",waist="Fisher's Rope",legs="Fisherman's Hose",feet="Waders"} 7 | sets.Chocobo = {main="Chocobo Wand",head="Egg Helm",neck="Chocobo Torque",body="Blue Race Silks",hands="Chocobo Gloves",waist="Chocobo Rope",legs="Chocobo Hose",feet="Chocobo Boots"} 8 | sets.Chocobo.skill = {body="S. Blue Race Silks"} 9 | sets.Chocobo.personal = {body="Red Race Silks"} 10 | sets.Chocobo.game = {body="Black Race Silks"} 11 | sets.crafting = {ring1="Craftkeeper's Ring",ring2="Artificer's Ring",back="Shaper's Shawl"} 12 | sets.crafting.HQ = {ring2="Craftmaster's Ring"} 13 | sets.crafting.Alchemy = {main="Caduceus",sub="Brewer's Escutcheon",neck="Alchemst. Torque",body="Alchemist's Smock"} 14 | sets.crafting.Alchemy.NQ = {ring1="Alchemist's Ring"} 15 | sets.crafting.Leathercraft = {neck="Tanner's Torque",sub="Beveler's Escutcheon",body="Tanner's Smock"} 16 | sets.crafting.Leathercraft.NQ = {ring1="Tanner's Ring"} 17 | sets.crafting.Smithing = {neck="Smithy's Torque",sub="Smythe's Escutcheon",body="Blksmith. Smock"} 18 | sets.crafting.Smithing.NQ = {ring1="Smith's Ring"} 19 | sets.crafting.Bonecraft = {neck="Boneworker's Torque",sub="Ossifier's Escutcheon",body="Bonewrk. Smock"} 20 | sets.crafting.Bonecraft.NQ = {ring1="Bonecrafter's Ring"} 21 | sets.crafting.Cooking = {main="Hocho",sub="Chef's Escutcheon",neck="Culin. Torque",body="Culinarian's Smock"} 22 | sets.crafting.Cooking.NQ = {ring1="Chef's Ring"} 23 | sets.crafting.Goldsmithing = {neck="Goldsm. Torque",sub="Toreutic Escutcheon",body="Goldsmith's Smock"} 24 | sets.crafting.Goldsmithing.NQ = {ring1="Goldsmith's Ring"} 25 | sets.crafting.Clothcraft = {neck="Weaver's Torque",sub="Plaiter's Escutcheon",body="Weaver's Smock"} 26 | sets.crafting.Clothcraft.NQ = {ring1="Tailor's Ring"} 27 | sets.crafting.Woodworking = {neck="Carver's Torque",sub="Joiner's Escutcheon",body="Carpenter's Smock"} 28 | sets.crafting.Woodworking.NQ = {ring1="Carpenter's Ring"} 29 | sets.crafting.Synergy = {} 30 | 31 | --Specific items for crafting you may want to use organizer to collect. 32 | sets.items = { 33 | item1="", 34 | item2="", 35 | item3="", 36 | item4="", 37 | item5="", 38 | item6="", 39 | item7="", 40 | item8="", 41 | item9="", 42 | item10="", 43 | } 44 | ]] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 2 | 3 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 4 | 5 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 6 | 7 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 8 | 9 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 10 | 11 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 12 | 13 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 14 | 15 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 16 | 17 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 18 | 19 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 20 | 21 | You will be either ignored or blacklisted if you message multiple times. 22 | 23 | Feel free to send me a way to contact you outside of game,and I'm happy to help, my preferred way of being contacted is Discord, my Stream discord is here: https://discord.gg/ug6xtvQ 24 | 25 | Setting up my Gearswaps and Github updating. 26 | 27 | 0.) DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME. 28 | 29 | 1.) Create a Github account if you don't already have one: https://github.com/join 30 | 31 | 2.) Download Github Desktop if you don't already have it : https://desktop.github.com/ 32 | 33 | 3.) If you don't have Gearswap installed, do so from Windower addons. 34 | 35 | 4.) Take your existing Gearswap folder from inside Windower\Addons and move it to your desktop. 36 | ~~https://www.dropbox.com/s/ib1vvdv5x8g1jql/Move.png?dl=0~~ 37 | 38 | 5.) If you're transitioning to my gearswaps from other gearswaps remove the Gearswap\Data folder 39 | from the old folder, and place it somewhere you can find to help you edit my gearswaps later, 40 | ~~https://www.dropbox.com/s/wquioii9r16oho2/MoveData.png?dl=0~~ 41 | if you're setting up gearswap for the first time you can delete the old Gearswap\Data folder 42 | 43 | 6.) Open Github Desktop and login. (As Admin if your Gearswap Folder is located in Program Files) 44 | ~~https://www.dropbox.com/s/ietq7dpe0obqcor/Github%20As%20Admin.png?dl=0~~ 45 | 46 | 7.) Click File, Clone Repository, click the URL tab, in the Repository box put: Headtatt/GearSwap 47 | in the Local Path box put the location your Gearswap directory was, for example 48 | C:\Program Files\Windower\Addons\Gearswap then click Clone. 49 | 50 | 51 | 8.) Move your old Gearswap folder on the desktop to the same directory as the new one to merge them. 52 | ~~https://www.dropbox.com/s/vd5tqw7mw6t9xa6/Merge%201.png?dl=0~~ 53 | ~~https://www.dropbox.com/s/i602azszzv2fl25/Merge%202.png?dl=0~~ Yes here. 54 | ~~https://www.dropbox.com/s/gtt59xw556l04kd/Merge%203.png?dl=0~~ Yes for all. 55 | ~~https://www.dropbox.com/s/n1myd584muntey3/Merge%204.png?dl=0~~ Skip these files. 56 | Make sure not to overwrite any files, choose skip or "do not replace" for any common files. 57 | 58 | 9.) Inside your Gearswap\Data\ folder, first copy, then rename the "Selindrile" folder once 59 | for each of your characters' names. ~~https://www.dropbox.com/s/wquioii9r16oho2/MoveData.png?dl=0~~ 60 | Rename all the files inside that folder as well, you can use Rename.bat (If it doesn't work 61 | you will have to rename these files manually. 62 | ~~https://www.dropbox.com/s/lpz3t8va77mvh17/Charactername.png?dl=0~~ 63 | 64 | 10.) For full functionality my gearswap and init files do depend on a few other addons that can 65 | be found in your launcher, I'll list them here: Addons: Shortcuts, Cancel, Itemizer. Plugins: Timers, Run 66 | 67 | 11.) To update my gearswaps in the future open up Github Desktop and click the third button (Fetch Origin, then 68 | push the same button again. ~~https://www.dropbox.com/s/zroxiy1e6r3y3cb/Fetch.png?dl=0~~ 69 | 70 | 12.) Optional: If you're new to editing files like this I highly reccomend Notepad++, https://notepad-plus-plus.org/ 71 | and using File: Open Folder as Workspace, and adding your Gearswap\Data folder there. 72 | 73 | 13.) Optional: Obtain Init file (Goes in Windower\Script folder) from: 74 | ~~https://www.dropbox.com/sh/20vy32liub3glxz/AAAiIVHAasFdwCK1SZdZz7d_a?dl=0~~ 75 | https://github.com/Headtatt/Gearswap/blob/main/init.txt 76 | and place it in your Windower\Scripts folder (Rename and keep your 77 | original just in case) 78 | 79 | 14.) Read the Cheat Sheet in your Data Folder, feel free to contact me if there's anything you don't understand but again: 80 | 81 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 82 | 83 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 84 | 85 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 86 | 87 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 88 | 89 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 90 | -------------------------------------------------------------------------------- /Sel_Elemental_QoL_Shortcuts.txt: -------------------------------------------------------------------------------- 1 | Selecting an element: 2 | //gs c set element value Where value is Earth, Fire, Water, Wind, Light, Dark, Blizzard, Thunder 3 | /con gs c set value (for macro ingame) 4 | Can also cycle this, 5 | //gs c cycle element 6 | /con gs c cycle element 7 | 8 | Once that is set you have a number of short cuts that will perform action of the selected element 9 | 10 | Spikes: 11 | //gs c elemental spikes Will cast Blaze/Ice/Shock spikes provided they match the set element 12 | /con gs c elemental spikes 13 | 14 | Enspell: 15 | //gs c elemental enspell Will do enspell matching the selected element 16 | /con gs c elemental enspell 17 | 18 | Weather: 19 | //gs c elemental weather Will cast Klimaform if not up, if up will cast the storm spell matching the set element 20 | /con gs c elemental weather 21 | 22 | Nuke: 23 | //gs c elemental nuke Will cast starting with highest tier to lowest tier the nuke matching set element 24 | /con gs c elemental nuke 25 | 26 | //gs c elemental smallnuke Will cast starting with Tier II down to tier I a nuke matching the set element 27 | /con gs c elemental smallnuke 28 | 29 | //gs c elemental nuke tierX Will cast the nuke matching the tier provided matchign the set element, where tier1, tier2, tier3, tier4, tier5, tier6 are accepted 30 | /con gs c elemental nuke tierX 31 | 32 | //gs c elemental ara Will cast available ara nuke from highest tier to lowest matching the set element 33 | /con gs c elemental ara 34 | 35 | //gs c elemental aga Will cast available aga nuke from highest tier to lowest matching the set element 36 | /con gs c elemental aga 37 | 38 | //gs c elemental helix Will cast the highest available helix spell that matches the set element 39 | /con gs c elemental helix 40 | 41 | Enfeebles: 42 | //gs c elemental enfeeble Will cast the elemental DoT nukes (Burn, Frost, Choke, Rasp, Shock, Drown) or Dia II/Bio II for Light/Dark elemental types 43 | /con gs c elemental enfeeble 44 | 45 | Ninjutsu: 46 | //gs c elemental ninjutsu Will cast starting with highest tier to lowest tier the ninjutsu nuke matching set element 47 | /con gs c elemental ninjutsu 48 | 49 | Scholar Skillchains: 50 | //gs c elemental skillchain1 Will do a level 1 skill chain matching the element set, closing with a tier I helix if available, else the matching tier I spell 51 | /con gs c elemental skillchain1 52 | 53 | //gs c elemental skillchain2 Will do a level 2 skill chain matching the element set, closing with a tier I helix if available, else the matching tier I spell 54 | /con gs c elemental skillchain2 55 | 56 | //gs c elemental skillchain3 Will perform a three step skillchain, level I to level II marching the element set, closing with a helix I if available (only works with Fire) 57 | /con gs c elemental skillchain3 58 | 59 | //gs c elemental skillchain4 Will perform a four step skillchain, meant for objectives only, element set doesn't matter 60 | /con gs c elemental skillchain4 61 | 62 | //gs c elemental skillchain6 Will perform a six step skillchain, meant for objectives only, element set doesn't matter 63 | /con gs c elemental skillchain6 64 | 65 | //gs c elemental wsskillchain Will perform a self skillchain utilizing a WS combined with strategems, only works with staff and club, not all elemental options available 66 | /con gs c elemental wsskillchain 67 | 68 | //gs c elemental endskillchain Will close a skillchain matching the set elemental, will use the Tier I spell for all but Light/Dark 69 | /con gs c elemental endskillchain 70 | 71 | Strategems: 72 | //gs c scholar light Will use Light Arts on first hit, if Light Arts is up, will use Addendum: White 73 | /con gs c scholar light 74 | 75 | //gs c scholar dark Will use Dark Arts on first hit, if Dark Arts is up, will use Addendum: Black 76 | /con gs c scholar dark 77 | 78 | //gs c scholar cost Will use Penury/Parsimony depending on Arts active 79 | /con gs c scholar cost 80 | 81 | //gs c scholar speed Will use Celerity/Alacrity depending on Arts active 82 | /con gs c scholar speed 83 | 84 | //gs c scholar aoe Will use Accession/Manifestation depending on Arts active 85 | /con gs c scholar aoe 86 | 87 | //gs c scholar power Will use Rapture/Ebullience depending on Arts active 88 | /con gs c scholar power 89 | 90 | //gs c scholar duration Will use Perpetuance or give an error message depending on Arts Active 91 | /con gs c scholar duration 92 | 93 | //gs c scholar accuracy Will use Altruism/Focalization depending on Arts active 94 | /con gs c scholar accuracy 95 | 96 | //gs c scholar enmity Will use Tranquility/Equanimity depending on Arts active 97 | /con gs c scholar enmity 98 | 99 | //gs c scholar skillchain Will use Immanence or give an error message depending on Arts Active 100 | /con gs c scholar skillchain 101 | 102 | //gs c scholar addendum Will use Light/Dark Arts depending on Arts active 103 | /con gs c scholar addendum 104 | -------------------------------------------------------------------------------- /libs/Sel-GlobalItems.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 3 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 4 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 5 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 6 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 7 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 8 | -- 9 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 10 | -- 11 | -- Editing this file will cause you to be unable to use Github Desktop to update! 12 | -- 13 | -- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and 14 | -- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first. 15 | -- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence. 16 | -- 17 | -- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing 18 | -- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important 19 | -- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead. 20 | -- 21 | -- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example. 22 | -- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there. 23 | -- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs) 24 | -- 25 | -- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them: 26 | -- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what. 27 | -- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character. 28 | -- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character. 29 | -- 30 | -- 31 | -- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ 32 | -- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium. 33 | -- 34 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 35 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 36 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 37 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 38 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 39 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 40 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 41 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 42 | -- Universal items that are the same for all characters, and logic to determine if some specific items are owned and used. 43 | if not sets.Reive then 44 | if item_owned("Adoulin's Refuge +1") then 45 | sets.Reive = {neck="Adoulin's Refuge +1"} 46 | elseif item_owned("Arciela's Grace +1") then 47 | sets.Reive = {neck="Arciela's Grace +1"} 48 | elseif item_owned("Ygnas's Resolve +1") then 49 | sets.Reive = {neck="Ygnas's Resolve +1"} 50 | else 51 | sets.Reive = {} 52 | end 53 | end 54 | 55 | uses_waltz_legs = false 56 | if sets.precast.Waltz and sets.precast.Waltz.legs then 57 | waltz_legs = standardize_set(sets.precast.Waltz).legs 58 | if (waltz_legs == "Desultor Tassets" or waltz_legs == "Blitzer Poleyn" or waltz_legs == "Tatsumaki Sitagoromo") then 59 | uses_waltz_legs = true 60 | end 61 | end -------------------------------------------------------------------------------- /data/Selindrile/Selindrile-Globals.lua: -------------------------------------------------------------------------------- 1 | --Place for settings and custom functions to work across one characters, all jobs. 2 | latency = .75 3 | 4 | --If this is set to true it will prevent you from casting shadows when you have more up than that spell would generate. 5 | conserveshadows = false 6 | 7 | --Display related settings. 8 | state.DisplayMode = M(true, 'Display Mode') --Set this to false if you don't want to display modes at the bottom of your screen. 9 | --Uncomment the settings below and change the values to edit the display's look. 10 | --displayx = 3 11 | --displayy = 1062 12 | --displayfont = 'Arial' 13 | --displaysize = 12 14 | --displaybold = true 15 | --displaybg = 0 16 | --displaystroke = 2 17 | --displaytransparancy = 192 18 | --state.DisplayColors = { 19 | -- h='\\cs(255, 0, 0)', -- Red for active booleans and non-default modals 20 | -- w='\\cs(255,255,255)', -- White for labels and default modals 21 | -- n='\\cs(192,192,192)', -- White for labels and default modals 22 | -- s='\\cs(96,96,96)' -- Gray for inactive booleans 23 | --} 24 | 25 | --Options for automation. 26 | state.ReEquip = M(true, 'ReEquip Mode') --Set this to false if you don't want to equip your current Weapon set when you aren't wearing any weapons. 27 | state.AutoArts = M(true, 'AutoArts') --Set this to false if you don't want to automatically try to keep up Solace/Arts. 28 | state.AutoLockstyle = M(true, 'AutoLockstyle Mode') --Set this to false if you don't want gearswap to automatically lockstyle on load and weapon change. 29 | state.CancelStoneskin = M(true, 'Cancel Stone Skin') --Set this to false if you don't want to automatically cancel stoneskin when you're slept. 30 | state.SkipProcWeapons = M(true, 'Skip Proc Weapons') --Set this to false if you want to display weapon sets fulltime rather than just Aby/Voidwatch. 31 | state.NotifyBuffs = M(false, 'Notify Buffs') --Set this to true if you want to notify your party when you recieve a specific buff/debuff. (List Below) 32 | 33 | --[[Binds you may want to change. 34 | Bind special characters. 35 | @ = Windows Key 36 | % = Works only when text bar not up. 37 | $ = Works only when text bar is up. 38 | ^ = Control Key 39 | ! = Alt Key 40 | ~ = Shift Key 41 | # = Apps Key 42 | ]] 43 | 44 | send_command('bind !@^f7 gs c toggle AutoWSMode') --Turns auto-ws mode on and off. 45 | send_command('bind !^f7 gs c toggle AutoFoodMode') --Turns auto-ws mode on and off. 46 | send_command('bind f7 gs c cycle Weapons') --Cycle through weapons sets. 47 | send_command('bind @f8 gs c toggle AutoNukeMode') --Turns auto-nuke mode on and off. 48 | send_command('bind ^f8 gs c toggle AutoStunMode') --Turns auto-stun mode off and on. 49 | send_command('bind !f8 gs c toggle AutoDefenseMode') --Turns auto-defense mode off and on. 50 | send_command('bind ^@!f8 gs c toggle AutoTrustMode') --Summons trusts automatically. 51 | send_command('bind @pause gs c cycle AutoBuffMode') --Automatically keeps certain buffs up, job-dependant. 52 | send_command('bind @scrolllock gs c cycle Passive') --Changes offense settings such as accuracy. 53 | send_command('bind f9 gs c cycle OffenseMode') --Changes offense settings such as accuracy. 54 | send_command('bind ^f9 gs c cycle HybridMode') --Changes defense settings for melee such as PDT. 55 | send_command('bind @f9 gs c cycle RangedMode') --Changes ranged offense settings such as accuracy. 56 | send_command('bind !f9 gs c cycle WeaponskillMode') --Changes weaponskill offense settings such as accuracy. 57 | send_command('bind f10 gs c set DefenseMode Physical') --Turns your physical defense set on. 58 | send_command('bind ^f10 gs c cycle PhysicalDefenseMode') --Changes your physical defense set. 59 | send_command('bind !f10 gs c toggle Kiting') --Keeps your kiting gear on.. 60 | send_command('bind f11 gs c set DefenseMode Magical') --Turns your magical defense set on. 61 | send_command('bind ^f11 gs c cycle MagicalDefenseMode') --Changes your magical defense set. 62 | send_command('bind @f11 gs c cycle CastingMode') --Changes your castingmode options such as magic accuracy. 63 | send_command('bind !f11 gs c cycle ExtraMeleeMode') --Adds another set layered on top of your engaged set. 64 | send_command('bind ^f12 gs c cycle ResistDefenseMode') --Changes your resist defense set. 65 | send_command('bind f12 gs c set DefenseMode Resist') --Turns your resist defense set on. 66 | send_command('bind @f12 gs c cycle IdleMode') --Changes your idle mode options such as refresh. 67 | send_command('bind !f12 gs c reset DefenseMode') --Turns your defensive mode off. 68 | send_command('bind ^@!f12 gs reload') --Reloads gearswap. 69 | send_command('bind pause gs c update user') --Runs a quick check to make sure you have the right gear on and checks variables. 70 | send_command('bind ^@!pause gs org') --Runs organizer. 71 | send_command('bind ^@!backspace gs c buffup') --Buffup macro because buffs are love. 72 | send_command('bind ^r gs c weapons Default') --Requips weapons and gear. 73 | send_command('bind ^z gs c toggle Capacity') --Keeps capacity mantle on and uses capacity rings. 74 | send_command('bind ^y gs c toggle AutoCleanupMode') --Uses certain items and tries to clean up inventory. 75 | send_command('bind ^t gs c cycle treasuremode') --Toggles hitting htings with your treasure hunter set. 76 | send_command('bind !t input /target ') --Targets the battle target. 77 | send_command('bind ^o fillmode') --Lets you see through walls. 78 | send_command('bind @m gs c mount Omega') 79 | 80 | NotifyBuffs = S{'doom','petrification'} 81 | 82 | bayld_items = {'Tlalpoloani','Macoquetza','Camatlatia','Icoyoca','Tlamini','Suijingiri Kanemitsu', 83 | 'Zoquittihuitz','Quauhpilli Helm','Chocaliztli Mask','Xux Hat','Quauhpilli Gloves','Xux Trousers', 84 | 'Chocaliztli Boots','Maochinoli','Xiutleato','Hatxiik','Kuakuakait','Azukinagamitsu','Atetepeyorg', 85 | 'Kaquljaan','Ajjub Bow','Baqil Staff','Ixtab','Tamaxchi','Otomi Helm','Otomi Gloves','Kaabnax Hat', 86 | 'Kaabnax Trousers','Ejekamal Mask','Ejekamal Boots','Quiahuiz Helm','Quiahuiz Trousers','Uk\'uxkaj Cap'} 87 | 88 | --[[ List of all Bayld Items. 89 | bayld_items = {'Tlalpoloani','Macoquetza','Camatlatia','Icoyoca','Tlamini','Suijingiri Kanemitsu','Zoquittihuitz', 90 | 'Quauhpilli Helm','Chocaliztli Mask','Xux Hat','Quauhpilli Gloves','Xux Trousers','Chocaliztli Boots','Maochinoli', 91 | 'Hatxiik','Kuakuakait','Azukinagamitsu','Atetepeyorg','Kaquljaan','Ajjub Bow','Baqil Staff','Ixtab','Otomi Helm', 92 | 'Otomi Gloves','Kaabnax Hat','Kaabnax Trousers','Ejekamal Mask','Ejekamal Boots','Quiahuiz Helm','Quiahuiz Trousers', 93 | 'Uk\'uxkaj Cap'} 94 | ]] -------------------------------------------------------------------------------- /data/Selindrile/Selindrile-Items.lua: -------------------------------------------------------------------------------- 1 | --Gearsets your character will use among multiple jobs. 2 | sets.BehemothSuit = {body="Behemoth Suit +1",hands=empty,legs=empty,feet=empty} 3 | sets.Sheltered = {ring2="Sheltered Ring"} 4 | sets.Capacity = {back="Mecisto. Mantle"} 5 | 6 | sets.buff.Doom = {neck="Nicander's Necklace",waist="Gishdubar Sash",ring1="Eshmun's Ring",ring2="Eshmun's Ring"} 7 | sets.TreasureHunter = {head="Wh. Rarab Cap +1",waist="Chaac Belt"} 8 | 9 | sets.precast.Item['Hallowed Water'] = {} 10 | sets.precast.Item['Holy Water'] = {} 11 | 12 | --Augmented items that you'll use among multiple jobs. 13 | 14 | gear.gada_enhancing_club = {name="Gada",augments={'Enh. Mag. eff. dur. +6','STR+3','Mag. Acc.+8','"Mag.Atk.Bns."+17','DMG:+7',}} 15 | gear.gada_healing_club = {name="Gada",augments={'"Cure" potency +9%','Mag. Acc.+11','"Mag.Atk.Bns."+13','DMG:+3',}} 16 | gear.grioavolr_nuke_staff = {name="Grioavolr",augments={'Magic burst dmg.+8%','MP+61','Mag. Acc.+16','"Mag.Atk.Bns."+30','Magic Damage +7',}} 17 | gear.grioavolr_fc_staff = {name="Grioavolr",augments={'"Fast Cast"+7','MP+20','Mag. Acc.+17','"Mag.Atk.Bns."+10','Magic Damage +5',}} 18 | gear.grioavolr_pet_staff = {name="Grioavolr",augments={'Blood Pact Dmg.+8','Pet: STR+10','Pet: Mag. Acc.+19','Pet: "Mag.Atk.Bns."+30',}} 19 | 20 | gear.taeon_pet_body = {name="Taeon Tabard",augments={'Pet: Accuracy+15 Pet: Rng. Acc.+15','Pet: "Dbl. Atk."+4','Pet: Damage taken -4%',}} 21 | gear.taeon_phalanx_body = {name="Taeon Tabard",augments={'Mag. Evasion+15','Spell interruption rate down -10%','Phalanx +3'}} 22 | 23 | gear.chironic_enfeeble_hands = {name="Chironic Gloves",augments={'Mag. Acc.+20 "Mag.Atk.Bns."+20','MND+10','Mag. Acc.+15',}} 24 | gear.chironic_refresh_hands = {name="Chironic Gloves",augments={'"Counter"+4','DEX+4','"Refresh"+2','Accuracy+19 Attack+19','Mag. Acc.+13 "Mag.Atk.Bns."+13',}} 25 | gear.chironic_treasure_feet = {name="Chironic Slippers",augments={'"Occult Acumen"+8','MND+7','"Treasure Hunter"+2',}} 26 | gear.chironic_nuke_feet = {name="Chironic Slippers",augments={'Mag. Acc.+25 "Mag.Atk.Bns."+25','"Drain" and "Aspir" potency +10','CHR+6','"Mag.Atk.Bns."+15',}} 27 | gear.chironic_refresh_feet ={name="Chironic Slippers", augments={'Pet: Attack+23 Pet: Rng.Atk.+23','Pet: Haste+1','"Refresh"+2','Accuracy+10 Attack+10',}} 28 | 29 | gear.herculean_fc_head = {name="Herculean Helm",augments={'"Fast Cast"+6','"Mag.Atk.Bns."+13',}} 30 | gear.herculean_nuke_head = {name="Herculean Helm",augments={'Mag. Acc.+16 "Mag.Atk.Bns."+16','Enmity-3','INT+9','"Mag.Atk.Bns."+13',}} 31 | gear.herculean_phalanx_hands = {name="Herculean Gloves", augments={'INT+6','MND+7','Phalanx +4','Accuracy+10 Attack+10','Mag. Acc.+13 "Mag.Atk.Bns."+13',}} 32 | gear.herculean_treasure_hands = {name="Herculean Gloves", augments={'"Store TP"+7','INT+6','"Treasure Hunter"+2','Accuracy+17 Attack+17','Mag. Acc.+17 "Mag.Atk.Bns."+17',}} 33 | gear.herculean_refresh_hands = {name="Herculean Gloves",augments={'Enmity+2','Pet: "Store TP"+4','"Refresh"+1',}} 34 | gear.herculean_waltz_hands = {name="Herculean Gloves",augments={'Rng.Acc.+16','"Waltz" potency +11%','AGI+1',}} 35 | gear.herculean_waltz_body = {name="Herculean Vest",augments={'Attack+26','"Waltz" potency +11%','AGI+4','Accuracy+5',}} 36 | gear.herculean_wsd_body = {name="Herculean Vest",augments={'Accuracy+11','Weapon skill damage +5%','DEX+7',}} 37 | gear.herculean_wsd_legs = {name="Herculean Trousers",augments={'Weapon skill damage +5%','DEX+8','Accuracy+13','Attack+14',}} 38 | gear.herculean_acc_feet = {name="Herculean Boots",augments={'Accuracy+25 Attack+25','Crit. hit damage +1%','DEX+10','Accuracy+14','Attack+1',}} 39 | gear.herculean_ta_feet = {name="Herculean Boots",augments={'Accuracy+19 Attack+19','"Triple Atk."+4','DEX+5','Accuracy+8','Attack+11',}} 40 | gear.herculean_refresh_feet = {name="Herculean Boots",augments={'CHR+2','MND+6','"Refresh"+2','Accuracy+7 Attack+7',}} 41 | gear.herculean_wsd_feet = {name="Herculean Boots",augments={'Accuracy+23 Attack+23','Weapon skill damage +5%','DEX+10','Accuracy+10','Attack+1',}} 42 | gear.herculean_waltz_feet = {name="Herculean Boots",augments={'Attack+10','"Waltz" potency +10%','AGI+4','Accuracy+9',}} 43 | gear.herculean_nuke_feet = {name="Herculean Boots",augments={'"Mag.Atk.Bns."+23','Rng.Acc.+14','Phalanx +1','Mag. Acc.+15 "Mag.Atk.Bns."+15',}} 44 | 45 | gear.merlinic_nuke_head = {name="Merlinic Hood",augments={'Mag. Acc.+21 "Mag.Atk.Bns."+21','INT+15','Mag. Acc.+3','"Mag.Atk.Bns."+13',}} 46 | gear.merlinic_nuke_body = {name="Merlinic Jubbah",augments={'Mag. Acc.+22 "Mag.Atk.Bns."+22','"Occult Acumen"+4','INT+10','Mag. Acc.+2','"Mag.Atk.Bns."+15',}} 47 | gear.merlinic_occult_body = {name="Merlinic Jubbah",augments={'Mag. Acc.+14','"Occult Acumen"+11','MND+6',}} 48 | gear.merlinic_refresh_hands = {name="Merlinic Dastanas",augments={'Attack+17','Pet: INT+5','"Refresh"+2','Accuracy+11 Attack+11',}} 49 | gear.merlinic_magpact_hands = {name="Merlinic Dastanas",augments={'Pet: Mag. Acc.+27','Blood Pact Dmg.+10','Pet: DEX+8','Pet: "Mag.Atk.Bns."+13',}} 50 | gear.merlinic_physpact_hands = {name="Merlinic Dastanas",augments={'Pet: Accuracy+28 Pet: Rng. Acc.+28','Blood Pact Dmg.+10','Pet: STR+7','Pet: Mag. Acc.+6',}} 51 | gear.merlinic_occult_hands = {name="Merlinic Dastanas",augments={'"Mag.Atk.Bns."+25','"Occult Acumen"+11','CHR+9',}} 52 | gear.merlinic_nuke_feet = {name="Merlinic Crackows",augments={'Mag. Acc.+19 "Mag.Atk.Bns."+19','"Conserve MP"+1','INT+11','Mag. Acc.+3','"Mag.Atk.Bns."+15',}} 53 | gear.merlinic_aspir_feet = {name="Merlinic Crackows",augments={'Mag. Acc.+22 "Mag.Atk.Bns."+22','"Drain" and "Aspir" potency +10','Mag. Acc.+15',}} 54 | gear.merlinic_treasure_feet = {name="Merlinic Crackows",augments={'Accuracy+5','"Snapshot"+2','"Treasure Hunter"+2','Mag. Acc.+11 "Mag.Atk.Bns."+11',}} 55 | gear.merlinic_refresh_feet = {name="Merlinic Crackows",augments={'Pet: DEX+7','Pet: Mag. Acc.+7','"Refresh"+2','Accuracy+20 Attack+20',}} 56 | gear.merlinic_occult_feet = {name="Merlinic Crackows",augments={'"Occult Acumen"+11','INT+8','Mag. Acc.+4',}} 57 | 58 | gear.odyssean_wsd_hands = { name="Odyssean Gauntlets",augments={'Accuracy+26','Weapon skill damage +4%','STR+6','Attack+14',}} 59 | gear.odyssean_stp_legs = {name="Odyssean Cuisses",augments={'Accuracy+28','"Store TP"+6','DEX+9',}} 60 | gear.odyssean_fc_legs = {name="Odyssean Cuisses",augments={'"Fast Cast"+6','"Mag.Atk.Bns."+12',}} 61 | 62 | gear.valorous_magical_wsd_head = {name="Valorous Mask",augments={'"Mag.Atk.Bns."+17','Weapon skill damage +5%','Attack+10',}} 63 | gear.valorous_wsd_head = {name="Valorous Mask",augments={'Accuracy+10 Attack+10','Weapon skill damage +4%','STR+4','Attack+10',}} 64 | gear.valorous_pet_head = {name="Valorous Mask",augments={'Pet: "Mag.Atk.Bns."+25','Pet: "Regen"+3','Pet: INT+14','Pet: Accuracy+2 Pet: Rng. Acc.+2',}} 65 | gear.valorous_pet_body = {name="Valorous Mail",augments={'Pet: "Mag.Atk.Bns."+26','"Dbl.Atk."+3','Pet: INT+8','Pet: Accuracy+13 Pet: Rng. Acc.+13','Pet: Attack+12 Pet: Rng.Atk.+12',}} 66 | gear.valorous_wsd_body = {name="Valorous Mail",augments={'Accuracy+25 Attack+25','Weapon skill damage +4%','Accuracy+10','Attack+12',}} 67 | gear.valorous_wsd_hands = {name="Valorous Mitts",augments={'Accuracy+30','Weapon skill damage +2%','STR+10','Attack+10',}} 68 | gear.valorous_acc_hands = {name="Valorous Mitts",augments={'Accuracy+21 Attack+21','"Store TP"+4','Accuracy+15','Attack+9',}} 69 | gear.valorous_physical_pet_legs = {name="Valor. Hose",augments={'Pet: Attack+29 Pet: Rng.Atk.+29','Pet: "Dbl.Atk."+3 Pet: Crit.hit rate +3','Pet: STR+8','Pet: Accuracy+8 Pet: Rng. Acc.+8',}} 70 | gear.valorous_magical_pet_legs = { name="Valor. Hose",augments={'Pet: "Mag.Atk.Bns."+28','Pet: "Regen"+3','Pet: INT+13','Pet: Attack+2 Pet: Rng.Atk.+2',}} 71 | gear.valorous_magical_pet_feet = {name="Valorous Greaves",augments={'Pet: "Mag.Atk.Bns."+29','Pet: "Dbl.Atk."+1 Pet: Crit.hit rate +1','Pet: INT+9','Pet: Accuracy+1 Pet: Rng. Acc.+1','Pet: Attack+4 Pet: Rng.Atk.+4',}} 72 | gear.valorous_wsd_feet = {name="Valorous Greaves",augments={'Accuracy+25','Weapon skill damage +4%','STR+5',}} -------------------------------------------------------------------------------- /libs/organizer-lib.lua: -------------------------------------------------------------------------------- 1 | -- Organizer library v2 2 | 3 | local org = {} 4 | register_unhandled_command(function(...) 5 | local cmds = {...} 6 | for _,v in ipairs(cmds) do 7 | if S{'organizer','organize','org','o'}:contains(v:lower()) then 8 | org.export_set() 9 | return true 10 | end 11 | end 12 | return false 13 | end) 14 | 15 | 16 | function org.export_set() 17 | if not sets then 18 | windower.add_to_chat(123,'Organizer Library: Cannot export your sets for collection because the table is nil.') 19 | return 20 | elseif not windower.dir_exists(windower.windower_path..'addons/organizer/') then 21 | windower.add_to_chat(123,'Organizer Library: The organizer addon is not installed. Activate it in the launcher.') 22 | return 23 | end 24 | 25 | -- Makes a big table keyed to item resource tables, with values that are 1-based 26 | -- numerically indexed tables of different entries for each of the items from the sets table. 27 | local item_list = org.unpack_names({},'L1',sets,{}) 28 | 29 | local trans_item_list = org.identify_items(item_list) 30 | 31 | for i,v in pairs(trans_item_list) do 32 | trans_item_list[i] = org.simplify_entry(v) 33 | end 34 | 35 | if trans_item_list:length() == 0 then 36 | windower.add_to_chat(123,'Organizer Library: Your sets table is empty.') 37 | return 38 | end 39 | 40 | local flattab = T{} 41 | for name,tab in pairs(trans_item_list) do 42 | for _,info in ipairs(tab) do 43 | flattab:append({id=tab.id,name=tab.name,log_name=tab.log_name,augments=info.augments,count=info.count}) 44 | end 45 | end 46 | 47 | -- See if we have any non-equipment items to drag along 48 | if organizer_items then 49 | local organizer_item_list = org.unpack_names({}, 'L1', organizer_items, {}) 50 | 51 | for _,tab in pairs(org.identify_items(organizer_item_list)) do 52 | count = gearswap.res.items[tab.id].stack 53 | flattab:append({id=tab.id,name=tab.name,log_name=tab.log_name,count=count}) 54 | end 55 | end 56 | 57 | -- At this point I have a table of equipment pieces indexed by the inventory name. 58 | -- I need to make a function that will translate that into a list of pieces in 59 | -- inventory or wardrobe. 60 | -- #trans_item_list[i] = Number of a given item 61 | -- trans_item_list[i].id = item ID 62 | 63 | local ward_ids = {8,10,11,12,13,14,15,16} 64 | local wardrobes = {} 65 | local ward = {} 66 | 67 | for _,id in pairs(ward_ids) do 68 | wardrobes[id] = windower.ffxi.get_items(id) 69 | wardrobes[id].max = windower.ffxi.get_bag_info(id).max 70 | ward[id] = T{} 71 | end 72 | 73 | local inv = T{} 74 | for i,v in ipairs(flattab) do 75 | local found 76 | local ward_id 77 | -- Iterate over the wardrobes and look for gear from the list that is already in wardrobes, then eliminate it from the list 78 | for id,wardrobe in pairs(wardrobes) do 79 | for n,m in ipairs(wardrobe) do 80 | if m.id == v.id and (not v.augments or v.augments and gearswap.extdata.decode(m).augments and gearswap.extdata.compare_augments(v.augments,gearswap.extdata.decode(m).augments)) then 81 | found = n 82 | break 83 | end 84 | end 85 | if found then 86 | ward_id = id 87 | break 88 | end 89 | end 90 | if found then 91 | table.remove(wardrobes[ward_id],found) 92 | ward[ward_id]:append(v) 93 | else 94 | inv:append(v) 95 | end 96 | end 97 | 98 | local inventory_max = windower.ffxi.get_bag_info(0).max 99 | 100 | for id=1,4 do 101 | if #inv > inventory_max and #ward[id] + (#inv-inventory_max) < wardrobes[id].max then 102 | local available = wardrobes[id].max - #ward[id] 103 | local length = math.min(#inv-80,available) 104 | ward:extend(inv:slice(1-length)) 105 | end 106 | end 107 | 108 | if #inv > inventory_max then 109 | windower.add_to_chat(123,'Organizer Library: Your sets table contains too many items.') 110 | return 111 | end 112 | 113 | -- Scan wardrobe, eliminate items from your table that are in wardrobe 114 | -- Scan inventory 115 | 116 | local fi = file.new('../organizer/data/inventory/organizer-lib-file.lua') 117 | fi:write('-- Generated by the Organizer Library ('..os.date()..')\nreturn '..(inv:tovstring({'augments','log_name','name','id','count'}))) 118 | 119 | for _,id in ipairs(ward_ids) do 120 | local fw = file.new('../organizer/data/'..gearswap.res.bags[id].command..'/organizer-lib-file.lua') 121 | fw:write('-- Generated by the Organizer Library ('..os.date()..')\nreturn '..(ward[id]:tovstring({'augments','log_name','name','id','count'}))) 122 | end 123 | 124 | windower.send_command('wait 0.5;org o organizer-lib-file') 125 | end 126 | 127 | function org.simplify_entry(tab) 128 | -- Some degree of this needs to be done in unpack_names or I won't be able to detect when two identical augmented items are equipped. 129 | local output = T{id=tab.id,name=tab.name,log_name=tab.log_name} 130 | local rare = gearswap.res.items[tab.id].flags:contains('Rare') 131 | for i,v in ipairs(tab) do 132 | local handled = false 133 | if v.augment then 134 | v.augments = {v.augment} 135 | v.augment = nil 136 | end 137 | 138 | for n,m in ipairs(output) do 139 | if (not v.bag or v.bag and v.bag == m.bag) and v.slot == m.slot and 140 | (not v.augments or ( m.augments and gearswap.extdata.compare_augments(v.augments,m.augments))) then 141 | output[n].count = math.min(math.max(output[n].count,v.count),gearswap.res.items[tab.id].stack) 142 | handled = true 143 | break 144 | elseif (not v.bag or v.bag and v.bag == m.bag) and v.slot == m.slot and v.augments and not m.augments then 145 | -- v has augments, but there currently exists a matching version of the 146 | -- item without augments in the output table. Replace the entry with the augmented entry 147 | local countmax = math.min(math.max(output[n].count,v.count),gearswap.res.items[tab.id].stack) 148 | output[n] = v 149 | output[n].count = countmax 150 | handled = true 151 | break 152 | elseif rare then 153 | handled = true 154 | break 155 | end 156 | end 157 | if not handled then 158 | output:append(v) 159 | end 160 | 161 | end 162 | return output 163 | end 164 | 165 | function org.identify_items(tab) 166 | local name_to_id_map = {} 167 | local items = windower.ffxi.get_items() 168 | for id,inv in pairs(items) do 169 | if type(inv) == 'table' then 170 | for ind,item in ipairs(inv) do 171 | if type(item) == 'table' and item.id and item.id ~= 0 then 172 | name_to_id_map[gearswap.res.items[item.id][gearswap.language]:lower()] = item.id 173 | name_to_id_map[gearswap.res.items[item.id][gearswap.language..'_log']:lower()] = item.id 174 | end 175 | end 176 | end 177 | end 178 | local trans = T{} 179 | for i,v in pairs(tab) do 180 | local item = name_to_id_map[i:lower()] and table.reassign({},gearswap.res.items[name_to_id_map[i:lower()]]) --and org.identify_unpacked_name(i,name_to_id_map) 181 | if item then 182 | local n = gearswap.res.items[item.id][gearswap.language]:lower() 183 | local ln = gearswap.res.items[item.id][gearswap.language..'_log']:lower() 184 | if not trans[n] then 185 | trans[n] = T{id=item.id, 186 | name=n, 187 | log_name=ln, 188 | } 189 | end 190 | trans[n]:extend(v) 191 | end 192 | end 193 | return trans 194 | end 195 | 196 | function org.unpack_names(ret_tab,up,tab_level,unpacked_table) 197 | for i,v in pairs(tab_level) do 198 | local flag = false 199 | if type(v)=='table' and i ~= 'augments' and not ret_tab[tostring(tab_level[i])] then 200 | ret_tab[tostring(tab_level[i])] = true 201 | unpacked_table, ret_tab = org.unpack_names(ret_tab,i,v,unpacked_table) 202 | elseif i=='name' then 203 | -- v is supposed to be a name, then. 204 | flag = true 205 | elseif type(v) == 'string' and v~='augment' and v~= 'augments' and v~= 'priority' then 206 | -- v is a string that's not any known option of gearswap, so treat it as an item name. 207 | -- I really need to make a set of the known advanced table options and use that instead. 208 | flag = true 209 | end 210 | if flag then 211 | local n = tostring(v):lower() 212 | if not unpacked_table[n] then unpacked_table[n] = {} end 213 | local ind = #unpacked_table[n] + 1 214 | if i == 'name' and gearswap.slot_map[tostring(up):lower()] then -- Advanced Table 215 | unpacked_table[n][ind] = tab_level 216 | unpacked_table[n][ind].count = unpacked_table[n][ind].count or 1 217 | unpacked_table[n][ind].slot = gearswap.slot_map[up:lower()] 218 | elseif gearswap.slot_map[tostring(i):lower()] then 219 | unpacked_table[n][ind] = {slot=gearswap.slot_map[i:lower()],count=1} 220 | end 221 | end 222 | end 223 | return unpacked_table, ret_tab 224 | end 225 | 226 | function org.string_augments(tab) 227 | local aug_str = '' 228 | if tab.augments then 229 | for aug_ind,augment in pairs(tab.augments) do 230 | if augment ~= 'none' then aug_str = aug_str..'['..aug_ind..'] = '..'"'..augment..'",\n' end 231 | end 232 | end 233 | if tab.augment then 234 | if tab.augment ~= 'none' then aug_str = aug_str.."'"..augment.."'," end 235 | end 236 | if aug_str ~= '' then return '{\n'..aug_str..'}' end 237 | end 238 | -------------------------------------------------------------------------------- /init.txt: -------------------------------------------------------------------------------- 1 | keyboard_allowmmf 1 2 | 3 | //Set console variables 4 | console_position 15 50 5 | console_color 255 255 0 0 6 | console_displayactivity 1 7 | console_fadedelay 3500 8 | console_chatopen 1 9 | console_screendir screenshots 10 | 11 | //Set game variables 12 | game_forceambientlight 1 13 | game_ambientlight 255 120 120 120 14 | game_gamma 50 15 | game_allowsetcursorpos 0 16 | game_exittype 1 17 | game_exitprompt 1 18 | game_allowresize 0 19 | 20 | //Set general variables 21 | //showfps 1 22 | // FPS Position - Use -75 1 to position it on the top right corner. 23 | fps_position 5 5 24 | 25 | drawdistance set 10 26 | //Bind keys 27 | //Bind syntax is "bind 28 | // ^ represents control- and ! is alt, eg !1 is alt-1 29 | bind ^@!f9 drawdistance set 10 30 | bind ^@!f10 drawdistance set 1 31 | bind ^@!f1 game_forceambientlight 32 | bind ^@!f11 showfps 33 | bind sysrq screenshot png hide 34 | bind ^sysrq screenshot png 35 | bind ^v paste 36 | 37 | //Sets ConsoleBG Background Position 38 | consolebg position 15 50 39 | consolebg size 1300 310 40 | 41 | // *** ALLIANCE TARGET KEYS *** 42 | // This lets you push Alt+F1-6 and Ctrl+F1-6 to to target Alliance members. 43 | bind ^f1 input /ta 44 | bind ^f2 input /ta 45 | bind ^f3 input /ta 46 | bind ^f4 input /ta 47 | bind ^f5 input /ta 48 | bind ^f6 input /ta 49 | bind !f1 input /ta 50 | bind !f2 input /ta 51 | bind !f3 input /ta 52 | bind !f4 input /ta 53 | bind !f5 input /ta 54 | bind !f6 input /ta 55 | 56 | // Fix Fatfinger Slips 57 | // Prevents changing macrosets when you hit shift because fatfinger. 58 | bind ^~1 ; 59 | bind !~1 ; 60 | bind ^~2 ; 61 | bind !~2 ; 62 | bind ^~3 ; 63 | bind !~3 ; 64 | bind ^~4 ; 65 | bind !~4 ; 66 | bind ^~5 ; 67 | bind !~5 ; 68 | bind ^~6 ; 69 | bind !~6 ; 70 | bind ^~7 ; 71 | bind !~7 ; 72 | bind ^~8 ; 73 | bind !~8 ; 74 | bind ^~9 ; 75 | bind !~9 ; 76 | bind ^~0 ; 77 | bind !~0 ; 78 | 79 | //Prevent healing when not targetting. 80 | bind %h input /lockon; 81 | 82 | //Jumping fun. 83 | //bind %space jump 84 | //bind ^%space jump 85 | //bind !%space jump 86 | //bind %~space jump 87 | 88 | //My own addons, for requestable spells and abilities, downloadable here: https://www.dropbox.com/sh/qz5rb5je202cbu3/AAAxozfBv_8agarM0NCnPTiZa?dl=0 89 | //Requires shortcuts for most functionality. 90 | //lua load Request 91 | //lua load Repeater 92 | //lua load Roller 93 | 94 | //Other addons I found that are quite good 95 | //lua load Gaze_check 96 | //lua load SellNPC 97 | //lua load QuietSparks 98 | //lua load DistanceTParty 99 | //lua load ZetaDistancePlus 100 | //lua load BetterAutoEnterKey 101 | //lua load NagMeNot 102 | //lua load PorterPacker 103 | //lua load HTMB 104 | lua l XiPivot 105 | 106 | //Other binds! 107 | //@ = Windows Key 108 | //% = Works only when text bar not up. 109 | //$ = Works only when text bar is up. 110 | //^ = Control Key 111 | //! = Alt Key 112 | //~ = Shift Key 113 | //# - Apps Key 114 | 115 | //Addon binds. 116 | 117 | //Anchor controls - Can't be force moved. 118 | bind ^@!q lua load anchor 119 | bind @q lua unload anchor 120 | 121 | //Dressup controls - Prevents blinking. 122 | bind ^@!o lua load dressup 123 | bind @o lua unload dressup 124 | 125 | //Zonetimer plugin controls. 126 | bind @t lua unload zonetimer 127 | bind ^@!t lua reload zonetimer 128 | 129 | //Gametime plugin controls. 130 | bind @i lua unload gametime 131 | bind ^@!i lua reload gametime 132 | 133 | //Treasury plugin controls. 134 | bind @r lua unload treasury 135 | bind ^@!r lua reload treasury 136 | 137 | //Aliases mostly for convienience of use on request. 138 | alias uninterruptible gs c toggle Uninterruptible 139 | alias blusets azuresets setlist 140 | alias asets azuresets setlist 141 | alias attack input /attack 142 | alias dummy gs c cycle ExtraSongsMode 143 | alias dummysong gs c cycle ExtraSongsMode;herbpastoral me 144 | alias geo gs c toggle AutoBuffMode;gs c update user 145 | //alias ffxicalc run -runonce "D:/Games/FFXI Tools/FFXI Calculator/FFXICalculator.exe" 146 | //alias calculator run -runonce "C:/Windows/system32/calc.exe" 147 | //alias calc run -runonce "C:/Windows/system32/calc.exe" 148 | //alias lightshot run -runonce "C:/Program Files (x86)/Skillbrains/lightshot/Lightshot.exe" 149 | //alias obs run -runonce "C:/Program Files (x86)/obs-studio/bin/64bit/obs64.exe" 150 | //alias windower run -runonce "D:/Games/FFXI Tools/Windower4Live/Windower.exe" 151 | alias roll roller roll 152 | alias healus lua load healbot;wait 1;hb on 153 | alias quitit lua unload healbot 154 | alias showset gs c showset 155 | alias useitem gs c useitem 156 | 157 | //Mode aliases for ease of use. 158 | alias blockwarp gs c toggle BlockWarp 159 | alias rune gs c cycle RuneElement 160 | alias autows gs c toggle AutoWSMode 161 | alias autofood gs c toggle AutoFoodMode 162 | alias deathmode gs c cycle DeathMode 163 | alias autotank gs c toggle AutoTankMode 164 | alias autonuke gs c toggle AutoNukeMode 165 | alias autoengage gs c toggle AutoEngageMode 166 | alias autostun gs c toggle AutoStunMode 167 | alias autodefense gs c toggle AutoDefenseMode 168 | alias autotrust gs c toggle AutoTrustMode 169 | alias autobuff gs c toggle AutoBuffMode 170 | alias autocleanup gs c toggle AutoCleanupMode 171 | alias autosub gs c toggle AutoSubMode 172 | alias autorune gs c toggle AutoRuneMode 173 | alias autoshoot gs c toggle AutoShootMode 174 | alias changerune gs c toggle RuneElement 175 | alias acc gs c cycle OffenseMode 176 | alias racc gs c cycle RangedMode 177 | alias hybrid gs c cycle HybridMode 178 | alias rangeacc gs c cycle RangedMode 179 | alias wsacc gs c cycle WeaponskillMode 180 | alias pdt gs c set DefenseMode Physical 181 | alias changepdt gs c cycle PhysicalDefenseMode 182 | alias kiting gs c toggle Kiting 183 | alias kite gs c toggle Kiting 184 | alias mdt gs c set DefenseMode Magical 185 | alias changemdt gs c cycle MagicalDefenseMode 186 | alias macc gs c cycle CastingMode 187 | alias meva gs c set DefenseMode Resist 188 | alias changemeva gs c cycle ResistDefenseMode 189 | alias idle gs c cycle IdleMode 190 | alias changeidle gs c cycle IdleMode 191 | alias defoff gs c reset DefenseMode 192 | alias defenseoff gs c reset DefenseMode 193 | alias curecheat gs c curecheat 194 | 195 | //Rune element aliases 196 | alias firerune gs c set RuneElement Ignis; 197 | alias windrune gs c set RuneElement Flabra; 198 | alias airrune gs c set RuneElement Flabra; 199 | alias lightningrune gs c set RuneElement Sulpor; 200 | alias thunderrune gs c set RuneElement Sulpor; 201 | alias lightrune gs c set RuneElement Lux; 202 | alias earthrune gs c set RuneElement Tellus; 203 | alias stonerune gs c set RuneElement Tellus; 204 | alias icerune gs c set RuneElement Gelus; 205 | alias blizzardrune gs c set RuneElement Gelus; 206 | alias waterrune gs c set RuneElement Unda; 207 | alias darkrune gs c set RuneElement Tenebrae; 208 | 209 | --Usable item gearswap command aliases. 210 | alias nexus gs c useitem back Nexus Cape 211 | alias facilityring gs c useitem ring2 Facility Ring 212 | alias capacityring gs c useitem ring2 Capacity Ring 213 | alias warpring gs c useitem ring2 Warp Ring 214 | alias hollaring gs c useitem ring2 Dim. Ring (Holla) 215 | alias demring gs c useitem ring2 Dim. Ring (Dem) 216 | alias mearing gs c useitem ring2 Dim. Ring (Mea) 217 | alias tavring gs c useitem ring2 Tavnazian Ring 218 | alias capacity get "Mecisto. Mantle" satchel;wait 3;gs c set Capacity true 219 | alias behedom gs c useitem head Behe. Masque +1 220 | alias bacon gs c useitem set BehemothSuit 221 | alias reisen gs c useitem head Cumulus Masque +1 222 | alias jeuno gs c useitem head Maat\'s Cap 223 | alias cobra gs c useitem main Cobra Staff 224 | alias ram gs c useitem main Ram Staff 225 | alias republic gs c useitem main Republic Staff 226 | 227 | --Capacity item binds. 228 | bind ^@!z get "Mecisto. Mantle" satchel;get "Capacity Ring" satchel;wait 1;get "Trizek Ring" satchel;wait 1;get "Vocation Ring" satchel;wait 1;get "Facility Ring" satchel 229 | bind ^!z put "Mecisto. Mantle" satchel;put "Capacity Ring" satchel;wait 1;put "Trizek Ring" satchel;wait 1;put "Vocation Ring" satchel;wait 1;put "Facility Ring" satchel;wait 1;put "Guide Beret" satchel 230 | 231 | //General Elementalmode aliases 232 | alias firemode gs c set ElementalMode Fire; 233 | alias windmode gs c set ElementalMode Wind; 234 | alias airmode gs c set ElementalMode Wind; 235 | alias aeromode gs c set ElementalMode Wind; 236 | alias lightningmode gs c set ElementalMode Lightning; 237 | alias thundermode gs c set ElementalMode Lightning; 238 | alias lightmode gs c set ElementalMode Light; 239 | alias earthmode gs c set ElementalMode Earth; 240 | alias stonemode gs c set ElementalMode Earth; 241 | alias icemode gs c set ElementalMode Ice; 242 | alias blizzardmode gs c set ElementalMode Ice; 243 | alias watermode gs c set ElementalMode Water; 244 | alias darkmode gs c set ElementalMode Dark; 245 | alias darknessmode gs c set ElementalMode Dark; 246 | alias nuke gs c elemental nuke 247 | alias smallnuke gs c elemental smallnuke 248 | 249 | //Scholar specific aliases 250 | alias liquefaction gs c set ElementalMode Fire;gs c elemental skillchain1 251 | alias detonation gs c set ElementalMode Wind;gs c elemental skillchain1 252 | alias impaction gs c set ElementalMode Lightning;gs c elemental skillchain1 253 | alias transfixion gs c set ElementalMode Light;gs c elemental skillchain1 254 | alias scission gs c set ElementalMode Earth;gs c elemental skillchain1 255 | alias induration gs c set ElementalMode Ice;gs c elemental skillchain1 256 | alias reverberation gs c set ElementalMode Water;gs c elemental skillchain1 257 | alias compression gs c set ElementalMode Dark;gs c elemental skillchain1 258 | 259 | alias fusion gs c set ElementalMode Fire;gs c elemental skillchain2 260 | alias fragmentation gs c set ElementalMode Lightning;gs c elemental skillchain2 261 | alias gravitation gs c set ElementalMode Earth;gs c elemental skillchain2 262 | alias distortion gs c set ElementalMode Ice;gs c elemental skillchain2 263 | 264 | //Gearup Aliases 265 | 266 | alias gather gs c naked;gs disable all;wait .5;gs org;wait 3;gs c showset 267 | //alias gearup gs c naked;gs disable all;wait .5;put * wardrobe4 all;put storage slip* case all;wait 3;gs c showset 268 | alias geardown gs c naked;gs disable all;wait .5;get * wardrobe4 all; get storage slip* all;wait 3;gs c showset 269 | //alias porter packer repack 270 | //alias getslips get storage slip* all 271 | //alias putslips put storage slip* case all 272 | 273 | //Blockhelp 274 | wait 30;input /blockhelp 275 | 276 | // The below command uncaps FPS to 60. Setting it to 0 uncaps it and setting it to 2 is the default setting of 30. 277 | config FrameRateDivisor 1 278 | 279 | //HD Mods 280 | pivot a XiView -------------------------------------------------------------------------------- /libs/Sel-MonsterAbilities.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 3 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 4 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 5 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 6 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 7 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 8 | -- 9 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 10 | -- 11 | -- Editing this file will cause you to be unable to use Github Desktop to update! 12 | -- 13 | -- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and 14 | -- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first. 15 | -- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence. 16 | -- 17 | -- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing 18 | -- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important 19 | -- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead. 20 | -- 21 | -- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example. 22 | -- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there. 23 | -- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs) 24 | -- 25 | -- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them: 26 | -- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what. 27 | -- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character. 28 | -- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character. 29 | -- 30 | -- 31 | -- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ 32 | -- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium. 33 | -- 34 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 35 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 36 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 37 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 38 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 39 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 40 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 41 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 42 | --Needed for the Stahp module. 43 | 44 | --List of moves to activate cure Received gear on. 45 | 46 | --List of moves to stun. 47 | --Seperated move sets are ones that might want to be pulled out in some situations 48 | 49 | StunAbility = S{"Fulmination","Breakga","Death Scissors","Hell Scissors","Tera Slash", 50 | "Smouldering Swarm","Blackout","Tempestuous Upheaval", "Vespine Hurricane", "Stinger Volley", "Incisive Denouement", 51 | "Incisive Apotheosis","Death","Saurian Swamp","Saurian Slide", "Jungle Wallop", "Velkkan Pygmachia", "Barreling Smash", 52 | "Jungle Hoodoo","Merciless Mauling", "Galumph","Velkkan Ambush", "Rending Deluge", "Riptide Eupnea", "Sundering Snip", 53 | "Impenetrable Carapace", "Viscid Spindrift", "Venom Shower", "Protolithic Puncture", "Aquatic Lance","Pelagic Cleaver", 54 | "Tidal Guillotine", "Mayhem Lantern", "Whirling Inferno","Tarichutoxin", "Calcifying Mist", "Testudo Tremor", 55 | "Batholithic Shell", "Volcanic Stasis", "Tyrannical Blow", "Blistering Roar", "Meteor", "Kaustra", "Amnesic Blast", 56 | "Cruel Joke","Seismostomp","Torpid Glare","Danse Macabre", "Gates of Hades","Just Desserts","Sakra Storm", 57 | "Acheron Flame","No Quarter","Denounce","Naakual's Vengeance","Pestilent Penance","Infernal Deliverance","Malevolent Blessing", 58 | "Empty Salvation","Winds of Oblivion","Bewitching Lantern","Quenching Hammer","Dread Spikes","Yama's Judgment", 59 | "??? Needles","10000 Needles","4000 Needles","Slimy Proposal","Ruthlessness","Stalking Prey","Level 3 Petrify", 60 | "Chymous Reek","Crowning Flatus","Gnash 'n Guttle","Infected Illusion","Dynastic Gravitas","Fulminous Fury","Tartaric Sigil", 61 | } 62 | 63 | --"Raksha: Vengeance","Raksha: Judgment", 64 | 65 | --List of moves to activate physical defense on. 66 | 67 | PhysicalAbility = S{"Ripper Fang","Chomp Rush","Scythe Tail","Cyclotail","Delta Thrust","Spike Flail", 68 | "Head Butt","Tortoise Stomp","Painful Whip","Recoil Dive","Gnash","Deathgnash","Seismic Tail","Big Scissors", 69 | "Megascissors","Drill Branch","Pinecone Bomb","Predator Claws","Mountain Buster","Spinning Dive","Chaotic Strike", 70 | "Volt Strike","Rush","Flaming Crush","Double Punch","Death Scissors","Velkkan Pygmachia","Barreling Smash", 71 | "Merciless Mauling","Galumph","Velkkan Ambush","Cross Reaver","Seismostomp","Pentapeck","Swooping Frenzy", 72 | "From The Skies","Wild Horn","Amnesic Blast","Incensed Pummel","Asuran Claws","Eclipse Bite","Crescent Fang", 73 | "Moonlit Charge","Bone Crunch","Throat Stab","Hell Scissors","Impalement","Deadly Hold","Empty Thrash","View Sync", 74 | "Carousel","Vanity Dive","Quadratic Continuum","??? Needles","10000 Needles","4000 Needles","2000 Needles","1000 Needles", 75 | "Rhinowrecker","Sub-zero Smash","Benthic Typhoon","Diabolic Claw","Barbed Crescent","Jet Stream","Megalith Throw", 76 | } 77 | 78 | --List of moves to activate magical defense on. 79 | 80 | MagicalAbility = S{"Stone III","Stone IV","Stone V","Stone VI","Stonega III","Stonega IV","Stonega V","Stoneja","Quake","Quake II", 81 | "Water III","Water IV","Water V","Water VI","Waterga III","Waterga IV","Waterga V","Waterja","Flood","Flood II", 82 | "Fire III", "Fire IV", "Fire V", "Fire VI","Firaga III","Firaga IV","Firaga V","Firaja","Flare","Flare II", 83 | "Blizzard III","Blizzard IV","Blizzard V","Blizzard VI","Blizzaga III","Blizzaga IV","Blizzaga V","Blizzaja","Freeze","Freeze II", 84 | "Aero III","Aero IV","Aero V","Aero VI","Aeroga III","Aeroga IV","Aeroga V","Aeroja","Tornado","Tornado II","Inferno", 85 | "Thunder III","Thunder IV", "Thunder V","Thunder VI","Thundaga III","Thundaga IV","Thundaga V","Thundaja","Burst","Burst II", 86 | "Earthen Fury","Geocrush", "Wind Blade","Tidal Wave","Grand Fall","Aerial Blast","Judgment Bolt","Meteor Strike","Thunderspark", 87 | "Thunderstorm","Heavenly Strike","Whirling Inferno","Foul Breath","Tetsudo Tremor","Palsynyxis","Leeching Current","Meteor","Comet", 88 | "Venom Shower","Marine Mayhem","Tidal Guillotine","Leafstorm","Ecliptic Meteor","Spirit Absorption", 89 | "Stygian Release","Atramentous Libations","Dragon Breath","Searing Light","Everyone's Grudge","Everyone's Rancor", 90 | "Pain Sync","Backdraft","Radiant Breath","Chaos Breath","Dark Orb","Spectral Floe","Zero Hour","Interference","Flank Opening", 91 | "Hellish Crescendo","Malign Invocation","Shadow Wreck","Stygian Cyclone", 92 | } 93 | 94 | --List of moves to activate resist defense on. 95 | 96 | ResistAbility = S{"Death","Frond Fatale","Atropine Spore","Deracinator","Cruel Joke","Paralyga","Break","Breakga","Bad Breath","Sweet Breath","Torpefying Charge", 97 | "Sleep","Sleepga","Sleepga II","Bindga","Torpid Glare","Danse Macabre","Stalking Prey","Hemocladis","Mayhem Lantern","Absoloute Terror", 98 | "Fulmination","Chilling Roar","Maiden's Virelai","Entice","Psyche Suction","Scream","Fatal Scream","Tepal Twist","Bloom Fouette", 99 | "Petalback Spin","Potted Plant","Tiiimbeeer","Level 3 Petrify","Afflicting Gaze","Beleaguerment","Besieger's Bane","Deathly Diminuendo", 100 | "Enthrall","Shah Mat","Infected Illusion","Impact","Slimy Proposal","Spinning Fin","Nosferatu's Kiss","Ululation","Malevolent Blessing", 101 | } 102 | 103 | AoEAbility = S{"Frond Fatale","Atropine Spore","Deracinator","Cruel Joke","Paralyga","Breakga","Bad Breath","Sweet Breath","Torpefying Charge", 104 | "Sleepga","Sleepga II","Bindga","Torpid Glare","Stalking Prey","Hemocladis","Mayhem Lantern","Cyclotail","Tortoise Stomp", 105 | "Recoil Dive","Seismic Tail","Megascissors","Merciless Mauling","Galumph","Seismostomp","Swooping Frenzy","Wild Horn", 106 | "Stonega III","Stonega IV","Stonega V","Stoneja","Earthen Fury","Zero Hour", 107 | "Waterga III","Waterga IV","Waterga V","Waterja","Tidal Wave","Spike Flail", 108 | "Firaga III","Firaga IV","Firaga V","Firaja","Inferno", 109 | "Blizzaga III","Blizzaga IV","Blizzaga V","Blizzaja","Level 3 Petrify", 110 | "Aeroga III","Aeroga IV","Aeroga V","Aeroja","Aerial Blast","Grand Fall", 111 | "Thundaga III","Thundaga IV","Thundaga V","Thundaja","Judgment Bolt","Thunderspark", 112 | "Whirling Inferno","Foul Breath","Tetsudo Tremor","Leeching Current","Meteor","Venom Shower","Marine Mayhem","Tidal Guillotine", 113 | "Leafstorm","Fulmination","Ecliptic Meteor","Atramentous Libations","Dragon Breath","Searing Light", 114 | "Empty Thrash","View Sync","Carousel","Vanity Dive","Chilling Roar","Scream","Fatal Scream","Tepal Twist","Bloom Fouette", 115 | "Petalback Spin","Potted Plant","Tiiimbeeer","Rhinowrecker","Dark Orb","Spectral Floe","Interference","Beleaguerment", 116 | "Besieger's Bane","Deathly Diminuendo","Enthrall","Flank Opening","Malign Invocation","Shadow Wreck","Shah Mat","Stygian Cyclone", 117 | } 118 | -------------------------------------------------------------------------------- /data/Selindrile/Selindrile_Drg_Gear.lua: -------------------------------------------------------------------------------- 1 | -- Setup vars that are user-dependent. Can override this function in a sidecar file. 2 | function user_job_setup() 3 | -- Options: Override default values 4 | state.OffenseMode:options('Normal','SomeAcc','Acc','FullAcc','Fodder') 5 | state.WeaponskillMode:options('Match','Normal','SomeAcc','Acc','FullAcc','Fodder') 6 | state.HybridMode:options('Normal') 7 | state.PhysicalDefenseMode:options('PDT', 'PDTReraise') 8 | state.MagicalDefenseMode:options('MDT', 'MDTReraise') 9 | state.ResistDefenseMode:options('MEVA') 10 | state.IdleMode:options('Normal', 'PDT','Refresh','Reraise') 11 | state.ExtraMeleeMode = M{['description']='Extra Melee Mode','None'} 12 | state.Weapons:options('Trishula') 13 | state.Passive = M{['description'] = 'Passive Mode','None','MP','Twilight'} 14 | 15 | select_default_macro_book() 16 | 17 | -- Additional local binds 18 | send_command('bind ^` input /ja "Hasso" ') 19 | send_command('bind !` input /ja "Seigan" ') 20 | send_command('bind ^f11 gs c cycle MagicalDefenseMode') 21 | send_command('bind @f7 gs c toggle AutoJumpMode') 22 | send_command('bind @` gs c cycle SkillchainMode') 23 | end 24 | 25 | -- Define sets and vars used by this job file. 26 | function init_gear_sets() 27 | -------------------------------------- 28 | -- Start defining the sets 29 | -------------------------------------- 30 | 31 | -- Precast Sets 32 | -- Precast sets to enhance JAs 33 | sets.precast.JA.Angon = {ammo="Angon"} --hands="Ptero. Fin. G. +1" 34 | sets.precast.JA.Jump = {ammo="Aurgelmir Orb +1", 35 | head="Flam. Zucchetto +2",neck="Ganesha's Mala",ear1="Brutal Earring",ear2="Sherida Earring", 36 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 37 | back="Brigantia's Mantle",waist="Windbuffet Belt +1",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 38 | sets.precast.JA['Ancient Circle'] = {} --legs="Vishap Brais" 39 | sets.precast.JA['High Jump'] = {ammo="Aurgelmir Orb +1", 40 | head="Flam. Zucchetto +2",neck="Ganesha's Mala",ear1="Brutal Earring",ear2="Sherida Earring", 41 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 42 | back="Brigantia's Mantle",waist="Windbuffet Belt +1",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 43 | sets.precast.JA['Soul Jump'] = {ammo="Aurgelmir Orb +1", 44 | head="Flam. Zucchetto +2",neck="Ganesha's Mala",ear1="Brutal Earring",ear2="Sherida Earring", 45 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 46 | back="Brigantia's Mantle",waist="Windbuffet Belt +1",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 47 | sets.precast.JA['Spirit Jump'] = {ammo="Aurgelmir Orb +1", 48 | head="Flam. Zucchetto +2",neck="Ganesha's Mala",ear1="Brutal Earring",ear2="Sherida Earring", 49 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 50 | back="Brigantia's Mantle",waist="Windbuffet Belt +1",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 51 | sets.precast.JA['Super Jump'] = {} 52 | sets.precast.JA['Spirit Link'] = {head="Vishap Armet +1"} --head="Vishap Armet",hands="Lnc. Vmbrc. +2" 53 | sets.precast.JA['Call Wyvern'] = {} --body="Ptero. Mail +1" 54 | sets.precast.JA['Deep Breathing'] = {} --hands="Ptero. Armet +1" 55 | sets.precast.JA['Spirit Surge'] = {} --body="Ptero. Mail +1" 56 | sets.precast.JA['Steady Wing'] = {} 57 | 58 | -- Breath sets 59 | sets.precast.JA['Restoring Breath'] = {back="Brigantia's Mantle"} 60 | sets.precast.JA['Smiting Breath'] = {back="Brigantia's Mantle"} 61 | sets.HealingBreath = {back="Brigantia's Mantle"} 62 | --sets.SmitingBreath = {back="Brigantia's Mantle"} 63 | 64 | -- Fast cast sets for spells 65 | 66 | sets.precast.FC = {ammo="Impatiens", 67 | head="Carmine Mask +1",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring", 68 | body=gear.taeon_pet_body,hands="Leyline Gloves",ring1="Lebeche Ring",ring2="Prolix Ring", 69 | back="Moonlight Cape",waist="Flume Belt +1",legs="Founder's Hose",feet="Carmine Greaves +1"} 70 | 71 | -- Waltz set (chr and vit) 72 | sets.precast.Waltz = {} 73 | 74 | -- Don't need any special gear for Healing Waltz. 75 | sets.precast.Waltz['Healing Waltz'] = {} 76 | 77 | sets.midcast.Cure = {} 78 | 79 | sets.Self_Healing = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"} 80 | sets.Cure_Received = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"} 81 | sets.Self_Refresh = {waist="Gishdubar Sash"} 82 | 83 | -- Midcast Sets 84 | sets.midcast.FastRecast = {ammo="Staunch Tathlum +1", 85 | head="Carmine Mask +1",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring", 86 | body=gear.taeon_pet_body,hands="Leyline Gloves",ring1="Lebeche Ring",ring2="Prolix Ring", 87 | back="Moonlight Cape",waist="Tempus Fugit",legs="Founder's Hose",feet="Carmine Greaves +1"} 88 | 89 | -- Put HP+ gear and the AF head to make healing breath trigger more easily with this set. 90 | sets.midcast.HB_Trigger = set_combine(sets.midcast.FastRecast, {head="Vishap Armet +1"}) 91 | 92 | -- Weaponskill sets 93 | 94 | -- Default set for any weaponskill that isn't any more specifically defined 95 | 96 | sets.precast.WS = {ammo="Knobkierrie", 97 | head="Flam. Zucchetto +2",neck="Fotia Gorget",ear1="Moonshade Earring",ear2="Sherida Earring", 98 | body=gear.valorous_wsd_body,hands="Sulev. Gauntlets +2",ring1="Regal Ring",ring2="Niqmaddu Ring", 99 | back="Brigantia's Mantle",waist="Fotia Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 100 | 101 | sets.precast.WS.SomeAcc = set_combine(sets.precast.WS, {}) 102 | sets.precast.WS.Acc = set_combine(sets.precast.WS, {neck="Shulmanu Collar"}) 103 | sets.precast.WS.FullAcc = set_combine(sets.precast.WS, {neck="Shulmanu Collar"}) 104 | sets.precast.WS.Fodder = set_combine(sets.precast.WS, {}) 105 | 106 | -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found. 107 | sets.precast.WS['Stardiver'] = set_combine(sets.precast.WS, {}) 108 | sets.precast.WS['Stardiver'].SomeAcc = set_combine(sets.precast.WS.Acc, {}) 109 | sets.precast.WS['Stardiver'].Acc = set_combine(sets.precast.WS.Acc, {}) 110 | sets.precast.WS['Stardiver'].Fodder = set_combine(sets.precast.WS.Fodder, {}) 111 | 112 | sets.precast.WS['Drakesbane'] = set_combine(sets.precast.WS, {}) 113 | sets.precast.WS['Drakesbane'].SomeAcc = set_combine(sets.precast.WS.Acc, {}) 114 | sets.precast.WS['Drakesbane'].Acc = set_combine(sets.precast.WS.Acc, {}) 115 | sets.precast.WS['Drakesbane'].Fodder = set_combine(sets.precast.WS.Fodder, {}) 116 | 117 | 118 | 119 | -- Sets to return to when not performing an action. 120 | 121 | -- Resting sets 122 | sets.resting = {} 123 | 124 | -- Idle sets 125 | sets.idle = {ammo="Staunch Tathlum +1", 126 | head="Loess Barbuta +1",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Ethereal Earring", 127 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Defending Ring",ring2="Dark Ring", 128 | back="Shadow Mantle",waist="Flume Belt +1",legs="Carmine Cuisses +1",feet="Amm Greaves"} 129 | 130 | sets.idle.Refresh = {ammo="Staunch Tathlum +1", 131 | head="Jumalik Helm",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Ethereal Earring", 132 | body="Jumalik Mail",hands="Sulev. Gauntlets +2",ring1="Defending Ring",ring2="Dark Ring", 133 | back="Shadow Mantle",waist="Flume Belt +1",legs="Carmine Cuisses +1",feet="Amm Greaves"} 134 | 135 | sets.idle.Weak = set_combine(sets.idle, {head="Twilight Helm",body="Twilight Mail"}) 136 | 137 | sets.idle.Reraise = set_combine(sets.idle, {head="Twilight Helm",body="Twilight Mail"}) 138 | 139 | -- Defense sets 140 | sets.defense.PDT = {ammo="Staunch Tathlum +1", 141 | head="Loess Barbuta +1",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Ethereal Earring", 142 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Gelatinous Ring +1",ring2="Moonlight Ring", 143 | back="Shadow Mantle",waist="Flume Belt +1",legs="Arke Cosc. +1",feet="Amm Greaves"} 144 | 145 | sets.defense.PDTReraise = set_combine(sets.defense.PDT, {head="Twilight Helm",body="Twilight Mail"}) 146 | 147 | sets.defense.MDT = {ammo="Staunch Tathlum +1", 148 | head="Loess Barbuta +1",neck="Warder's Charm +1",ear1="Genmei Earring",ear2="Ethereal Earring", 149 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Gelatinous Ring +1",ring2="Moonlight Ring", 150 | back="Moonlight Cape",waist="Flume Belt +1",legs="Arke Cosc. +1",feet="Amm Greaves"} 151 | 152 | sets.defense.MDTReraise = set_combine(sets.defense.MDT, {head="Twilight Helm",body="Twilight Mail"}) 153 | 154 | sets.defense.MEVA = {ammo="Staunch Tathlum +1", 155 | head="Loess Barbuta +1",neck="Warder's Charm +1",ear1="Genmei Earring",ear2="Ethereal Earring", 156 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Gelatinous Ring +1",ring2="Moonlight Ring", 157 | back="Moonlight Cape",waist="Flume Belt +1",legs="Arke Cosc. +1",feet="Amm Greaves"} 158 | 159 | sets.Kiting = {legs="Carmine Cuisses +1"} 160 | sets.Reraise = {head="Twilight Helm",body="Twilight Mail"} 161 | sets.buff.Doom = set_combine(sets.buff.Doom, {}) 162 | sets.buff.Sleep = {head="Frenzy Sallet"} 163 | 164 | -- Extra defense sets. Apply these on top of melee or defense sets. 165 | sets.passive.MP = {ear2="Ethereal Earring",waist="Flume Belt +1"} 166 | sets.passive.Twilight = {head="Twilight Helm", body="Twilight Mail"} 167 | sets.TreasureHunter = set_combine(sets.TreasureHunter, {}) 168 | 169 | -- Weapons sets 170 | sets.weapons.Trishula = {main="Trishula",sub="Utu Grip"} 171 | 172 | -- Swap to these on Moonshade using WS if at 3000 TP 173 | sets.MaxTP = {ear1="Lugra Earring +1",ear2="Sherida Earring",} 174 | sets.AccMaxTP = {ear1="Mache Earring +1",ear2="Telos Earring"} 175 | sets.AccDayMaxTPWSEars = {ear1="Mache Earring +1",ear2="Telos Earring"} 176 | sets.DayMaxTPWSEars = {ear1="Brutal Earring",ear2="Sherida Earring",} 177 | sets.AccDayWSEars = {ear1="Mache Earring +1",ear2="Telos Earring"} 178 | sets.DayWSEars = {ear1="Moonshade Earring",ear2="Sherida Earring",} 179 | 180 | -- Engaged sets 181 | 182 | -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous 183 | -- sets if more refined versions aren't defined. 184 | -- If you create a set with both offense and defense modes, the offense mode should be first. 185 | -- EG: sets.engaged.Dagger.Accuracy.Evasion 186 | 187 | -- Normal melee group 188 | 189 | sets.engaged = {ammo="Aurgelmir Orb +1", 190 | head="Flam. Zucchetto +2",neck="Shulmanu Collar",ear1="Brutal Earring",ear2="Sherida Earring", 191 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 192 | back="Brigantia's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 193 | sets.engaged.SomeAcc = {ammo="Aurgelmir Orb +1", 194 | head="Flam. Zucchetto +2",neck="Shulmanu Collar",ear1="Brutal Earring",ear2="Sherida Earring", 195 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Regal Ring",ring2="Niqmaddu Ring", 196 | back="Brigantia's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 197 | sets.engaged.Acc = {ammo="Aurgelmir Orb +1", 198 | head="Flam. Zucchetto +2",neck="Shulmanu Collar",ear1="Digni. Earring",ear2="Telos Earring", 199 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Ramuh Ring +1",ring2="Niqmaddu Ring", 200 | back="Brigantia's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 201 | sets.engaged.FullAcc = {ammo="Aurgelmir Orb +1", 202 | head="Flam. Zucchetto +2",neck="Shulmanu Collar",ear1="Mache Earring +1",ear2="Telos Earring", 203 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Ramuh Ring +1",ring2="Ramuh Ring +1", 204 | back="Brigantia's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 205 | sets.engaged.Fodder = {ammo="Aurgelmir Orb +1", 206 | head="Flam. Zucchetto +2",neck="Ganesha's Mala",ear1="Brutal Earring",ear2="Sherida Earring", 207 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 208 | back="Brigantia's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 209 | 210 | sets.engaged.AM = {} 211 | sets.engaged.AM.SomeAcc = {} 212 | sets.engaged.AM.Acc = {} 213 | sets.engaged.AM.FullAcc = {} 214 | sets.engaged.AM.Fodder = {} 215 | 216 | sets.engaged.PDT = {} 217 | sets.engaged.SomeAcc.PDT = {} 218 | sets.engaged.Acc.PDT = {} 219 | sets.engaged.FullAcc.PDT = {} 220 | sets.engaged.Fodder.PDT = {} 221 | 222 | sets.engaged.AM.PDT = {} 223 | sets.engaged.AM.SomeAcc.PDT = {} 224 | sets.engaged.AM.Acc.PDT = {} 225 | sets.engaged.AM.FullAcc.PDT = {} 226 | sets.engaged.AM.Fodder.PDT = {} 227 | 228 | --[[ Melee sets for in Adoulin, which has an extra 2% Haste from Ionis. 229 | 230 | sets.engaged.Adoulin = {} 231 | sets.engaged.Adoulin.SomeAcc = {} 232 | sets.engaged.Adoulin.Acc = {} 233 | sets.engaged.Adoulin.FullAcc = {} 234 | sets.engaged.Adoulin.Fodder = {} 235 | 236 | sets.engaged.Adoulin.AM = {} 237 | sets.engaged.Adoulin.AM.SomeAcc = {} 238 | sets.engaged.Adoulin.AM.Acc = {} 239 | sets.engaged.Adoulin.AM.FullAcc = {} 240 | sets.engaged.Adoulin.AM.Fodder = {} 241 | 242 | sets.engaged.Adoulin.PDT = {} 243 | sets.engaged.Adoulin.SomeAcc.PDT = {} 244 | sets.engaged.Adoulin.Acc.PDT = {} 245 | sets.engaged.Adoulin.FullAcc.PDT = {} 246 | sets.engaged.Adoulin.Fodder.PDT = {} 247 | 248 | sets.engaged.Adoulin.AM.PDT = {} 249 | sets.engaged.Adoulin.AM.SomeAcc.PDT = {} 250 | sets.engaged.Adoulin.AM.Acc.PDT = {} 251 | sets.engaged.Adoulin.AM.FullAcc.PDT = {} 252 | sets.engaged.Adoulin.AM.Fodder.PDT = {} 253 | ]] 254 | 255 | end 256 | 257 | -- Select default macro book on initial load or subjob change. 258 | function select_default_macro_book() 259 | -- Default macro set/book 260 | if player.sub_job == 'WAR' then 261 | set_macro_page(5, 13) 262 | elseif player.sub_job == 'SAM' then 263 | set_macro_page(3, 13) 264 | elseif player.sub_job == 'BLU' then 265 | set_macro_page(2, 13) 266 | else 267 | set_macro_page(5, 13) 268 | end 269 | end -------------------------------------------------------------------------------- /data/Cheat Sheet.txt: -------------------------------------------------------------------------------- 1 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 2 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 3 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 4 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 5 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 6 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 7 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 8 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 9 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 10 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 11 | 12 | Feel free to contact me OUTSIDE of the game though, and I'm happy to help. 13 | 14 | Don't feel disparaged if you can't get it working with this alone a lot of people can't when they're first starting messing with these things. 15 | 16 | My github ( https://github.com/Selindrile/GearSwap ) If you obtained this cheatsheet elsewhere this should have the up to date versions of most everything 17 | of mine, but also PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME. 18 | 19 | My Stream Discord, ( https://discord.gg/ug6xtvQ ) this is the best way to reach me, in the allchat channel or through DM, 20 | alternatively you can connect with me through a messenger (They're linked to my FFXIAH account.) If you're relatively computer savvy, 21 | it shouldn't be too hard, if not, I'm happy to help explain more or answer questions even if you do get it working. 22 | 23 | Again PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME, however feel free to shoot me a way to contact you outside of game, through 24 | the game, and I'm happy to help. 25 | 26 | 27 | For full functionality my gearswap and init files do depend on a few other addons that can be found in your launcher, I'll list them here: 28 | Addons: Shortcuts, Cancel, Itemizer. Plugins: Timers, Run 29 | 30 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 | 32 | To make use of other types of gearswap files along with mine, place them in the common folder, and make sure to 33 | name them Character_Job.lua. 34 | 35 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Macros and More~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 | 37 | [Ctrl+F8] = Toggle auto-stun mode, will attempt to automatically stun a list of moves in your 38 | Windower4\addons\GearSwap\libs\Sel-MonsterAbilities.lua file. 39 | 40 | :Macro: /console gs c toggle AutoStunMode 41 | 42 | [Alt+F8] = Toggles AutoDefenseMode, will attempt to automatically swap into and out of defensive sets for specific moves. 43 | Edit options by copying the tables from Windower4\addons\GearSwap\libs\Sel-MonsterAbilities.lua to relevant user files and editing them there. 44 | 45 | :Macro: /console gs c toggle AutoDefenseMode 46 | 47 | [Win+F8] = Turns on auto nuking on some jobs. 48 | 49 | :Macro: /console gs c toggle AutoNukeMode 50 | 51 | [F9] = Change offense mode. (Usually Engaged, accuracy modes) Fodder (Trash Mobs) sets generally 52 | have more Dual Wield/Multiattack because they don't have to worry about Acc/Atk. 53 | 54 | :Macro: /console gs c cycle OffenseMode 55 | 56 | 57 | [Ctrl+F9] = Change hybrid engaged mode. (Usually defensive modes such as PDT or Evasion, combines with 58 | offense mode to create an engaged with both options if you created it in gearswap. 59 | 60 | :Macro: /console gs c cycle HybridMode 61 | 62 | 63 | [Alt+F9] = Change Weasponskill mode. (Usually accuracy sets to depend on targets.) 64 | 65 | :Macro: /console gs c cycle WeaponskillMode 66 | 67 | 68 | [Win+F9] = Change ranged mode. (Again usually accuracy sets for target's evasion.) This doesn't affect 69 | ranged WS, that's the above. 70 | 71 | :Macro: /console gs c cycle RangedMode 72 | 73 | 74 | [F10] = Somewhat "Lock" a Physical defense set in, only changes some gear for spells and abilities 75 | generally an "OH Shit Button" to be used in response to physical abilites. 76 | 77 | :Macro: /console gs c set DefenseMode Physical 78 | 79 | 80 | [Ctrl+F10] = Change the current Physical defense set, generally things like PDT, Evasion, PDTTwilight 81 | that the above command locks in place. 82 | 83 | :Macro: /console gs c cycle PhysicalDefenseMode 84 | 85 | 86 | [Alt+F10] = Toggle kiting mode. Makes your movement speed items stay in place when in idle/defensive idle 87 | sets, and should also have it likely overwrite any movementspeed reducing slots. 88 | 89 | :Macro: /console gs c toggle Kiting 90 | 91 | 92 | [Win+F7] = Automatic ranged attacks, to change what weaponskill, use //gs c autows while Rnghelper is active 93 | as well as using //gs c toggle autowsmode to turn on and off auto WS during Rnghelper 94 | 95 | :Macro: /console gs c toggle RngHelper 96 | 97 | [Win+F10] = Toggle job specific modes, different depending on jobs some examples: 98 | Also sometimes Ctrl/Alt/Win + Grave/Tilde (` or ~) or even Backspace, Backslash, Delete, Dash or Equals. 99 | 100 | :Macro: 101 | Thf: /console gs c toggle AmbushMode (Equips Ambush gear on TP and non SA/TA WS) 102 | Blu: /console gs c toggle LearningMode (Locks learning gear in at all times.) 103 | Pld/Run: /console gs c toggle TankAutoDefense (Maintains PDT in autodefense instead of leaving defense altogether) 104 | Brd: /console gs c cycle ExtraSongsMode (Your next song plays as a dummy song.) [Ctrl+~] 105 | Blm: /console gs c cycle RecoverMode (Nukes in converts elemental damage to MP gear) 106 | Blm2: /console gs c cycle MagicBurstMode (Single makes your next spell burst, while lock keeps it bursting until you toggle again.) [Win+~] 107 | 108 | 109 | [F11] = Somewhat "Lock" a Magical defense set in, only changes some gear for spells and abilities 110 | generally an "OH Shit Button" to be used in response to magical abilites. 111 | 112 | :Macro: /console gs c set DefenseMode Magical 113 | 114 | 115 | [Ctrl+F11] = Change the current Magical defense set, generally things like MDT, MagicEvasion, MDTTwilight 116 | that the above command locks in place. 117 | 118 | :Macro: /console gs c cycle MagicalDefenseMode 119 | 120 | 121 | 122 | [Alt+F11] = Extra job specific modes, Pld gets extra defense modes, other melee generally get extra 123 | melee modes. 124 | 125 | :Macro: 126 | Pld: /console gs c cycle ExtraDefenseMode 127 | Melees: /console gs c cycle ExtraMeleeMode 128 | 129 | 130 | [Win+F11] = Casting modes, such as resistant, and fodder mobs, and sets for proccing (Low damage, low recast). 131 | 132 | :Macro: /console gs c cycle CastingMode 133 | 134 | 135 | [F12] = Somewhat "Lock" a resistance set in, only changes some gear for spells and abilities 136 | generally an "OH Shit Button" to be used in response to certain abilites. 137 | 138 | :Macro: /console gs c set DefenseMode Resist 139 | 140 | [Ctrl+F12] = Change the current resistdefense set, generally things like MEVA, Charm, Death 141 | that the above command locks in place. 142 | 143 | :Macro: /console gs c cycle ResistDefenseMode 144 | 145 | [Win+F12] = Changes the current idle set, from refresh, regen, PDT, etc. 146 | 147 | :Macro: /console gs c cycle IdleMode 148 | 149 | [Alt+F12] = Unlocks current defense mode. 150 | 151 | :Macro: /console gs c reset DefenseMode 152 | 153 | [Pause/Break] = Displays most current modes and reequips gear appropriate to your status. 154 | 155 | :Macro: /console gs c update user 156 | 157 | [Ctrl+Alt+Win+F12] = Reloads gearswap to reset all the current modes or update changes quickly. 158 | 159 | :Macro: /console gs reload 160 | 161 | [Ctrl+Alt+Win+F1] = Toggles windower lighting setttings. 162 | 163 | :Macro: /console gs c cycle MagicalDefenseMode 164 | 165 | [Ctrl+Alt+Win+Pause/Break] = Runs Organizer to obtain your curren't job's gear as listed in your gearswap file. 166 | 167 | :Macro: /console gs org 168 | 169 | --- Non F-Key combinations. --- 170 | 171 | [Ctrl+T] = Change treasurehunter mode, Tag: Equips TH gear for one hit, Fulltime keeps it on always, SATA for Sneak/Trick Attack. 172 | 173 | :Macro: /console gs c cycle TreasureMode 174 | 175 | 176 | [Alt+T] = Target battle target. (Red mob claimed by party.) 177 | 178 | :Macro: /target 179 | 180 | 181 | [Ctrl+O] = Toggle fillmode. (See through walls/ceiling/floors.) 182 | 183 | :Macro: /console fillmode 184 | 185 | 186 | [Alt+P] = Equip Cure-Potency-Recieved gear for maximizing incoming cures reactively. 187 | 188 | :Macro: /console gs equip sets.Self_Healing 189 | 190 | 191 | [Win+P] = Equip Sheltered equipment for maximizing incoming Protects and Shells. 192 | 193 | :Macro: /console gs equip sets.Sheltered 194 | 195 | [Win+Pause/Break] = Toggles AutoBuffMode which automatically buffs. 196 | 197 | :Macro: /console gs c toggle AutoBuffMode 198 | SubCommand Examples to change options: 199 | //gs c autoindi Focus 200 | //gs c autogeo Malaise 201 | Can change default options in the gearswap job_character_gear file with: 202 | autoindi = 'Focus' 203 | autogeo = 'Malaise' 204 | 205 | 206 | [Ctrl+Win+Alt+F7] = Toggles AutoWSMode for automatic WS. 207 | 208 | :Macro: /console gs c toggle AutoWSMode 209 | SubCommand Examples to change options: 210 | //gs c autows Savage Blade 211 | //gs c autows tp 1250 212 | Can change default options in the gearswap job_character_gear file with: 213 | autows = 'Savage Blade' 214 | autowstp = 1250 215 | 216 | --- Addon and Plugin related combinations. These are in init, but they can be moved elsewhere. --- 217 | 218 | [Ctrl+Alt+Win+?] = Load or reload the Addon or Plugin, the ? is the key specific to the related Addon or Plugin. 219 | [Win+?] = Unload the Addon or Plugin, the ? is the key specific to the related Addon or Plugin (With the exception of Gearswap). 220 | 221 | [G] = Anchor (Prevents you from being knocked back by monster TP moves.) 222 | [Q] = AllSeeingEye (Allows you to see things usually invisible to players.) 223 | [O] = Dressup (Prevents players from blinking with the proper setup.) 224 | [T] = Zonetimer (Keeps track of the amount of time you've spent in a zone, or since you loaded the timer.) 225 | [I] = Gametime (Tracks days of the week and current time at the top of the screen.) 226 | [R] = Treasury (Automatically lots and passes or drops certain items you set.) 227 | [F12] = Gearswap (Reloads to reset all the current modes or update changes quickly.) 228 | 229 | My scripts\init.txt loads Request, which is an addon that can be used to answer player's requests, use it with the Shortcuts addon. 230 | It also loads a few other addons which I've written or found from other sources. 231 | 232 | --- Item Handling --- 233 | 234 | Items are handled by the useitem command, witht he following syntax: 235 | gs c useitem slot item name 236 | 237 | For example: 238 | windower.send_command('bind ^h gs c useitem ring2 Warp Ring') 239 | 240 | As a Macro: 241 | /console gs c useitem ring2 Warp Ring 242 | 243 | [Control + Z] Capacity Mode 244 | Will automatically use capacity items and keep capacity cape on, for this to work it 245 | seems you must keep your capacity items in your inventory or satchel, not in any wardrobe locations. 246 | In the wardrobe they seem to report the wrong times to the function that checks them, don't know why. 247 | 248 | --- Auto Commands --- 249 | Some of my job gearswaps have automatic functions, like auto-enmity for Pld, auto-buffing and auto nuking, often they are 250 | windows +f8 or windows +Pause/Break - These can mostly be changed in Character-Globals.lua. 251 | 252 | :Macro: /console gs c toggle AutoNukeMode 253 | :Macro: /console gs c toggle AutoBuffMode 254 | :Macro: /console gs c toggle AutoTankMode 255 | :Macro: /console gs c toggle AutoReadyMode 256 | :Macro: /console gs c toggle AutoNukeMode 257 | :Macro: /console gs c toggle AutoSubMode 258 | 259 | You may reset some of the choices for automatic modes with commands like the following. 260 | 261 | //gs c autonuke fire5 262 | //gs c autows Savage Blade 263 | //gs c autows tp 1250 264 | //gs c autofood Soy Ramen 265 | 266 | Export Command for editing gearswap. 267 | 268 | //gs export lua OR /console gs export lua 269 | 270 | Creates a file in Gearswap\Data\Export with your current set detailed as a file, useful for 271 | getting specific augments labelled just right in gearswap, either for putting job specific items 272 | at the top of your job_gear lua or for all jobs in your items.lua. 273 | 274 | ----- Elemental handling commands for mages. 275 | :Macro: /console gs c cycle ElementalMode 276 | :Macro: /console gs c elemental [COMMAND] 277 | 278 | Commands: 279 | nuke - Highest Nuke 280 | smallnuke - Tier 2 or 1 nuke. 281 | helix - Elemental Helix 282 | weather - Scholar Weather 283 | skillchain1 - Tier 1 skillchain 284 | skillchain2 - Tier 2 skillchain 285 | skillchain3 - Only works on Fire element, does Liquefaction > Fusion 286 | skillchain4 - 4 Step skillchain for popping Perfidion 287 | skillchain6 - 6 Step Skillchain for popping Pluton (Requires you have a stratagem up and 5 stratagem charges to start) 288 | wsskillchain - Attempts to start skillchain with a weaponskill and finish with a spell (for conserving stratagems). 289 | endskillchain - Attempts to end a skillchain with the current element. 290 | tier1 - Casts a tier 1 spell of that element. 291 | tier2 - Casts a tier 2 spell of that element. 292 | tier3 - Casts a tier 3 spell of that element. 293 | tier4 - Casts a tier 4 spell of that element. 294 | tier5 - Casts a tier 5 spell of that element. 295 | tier6 - Casts a tier 6 spell of that element. 296 | aga - Casts highest available aja/aga spell of that element. 297 | aga1 - Tier 1 aga 298 | aga2 - Tier 2 aga 299 | aga3 - Tier 3 aga 300 | aja - Aja spell 301 | ancientmagic - Burst/Flood/Etc 302 | ancientmagic2 - Burst2/Flood2/Etc 303 | enfeeble - Elemental enfeeble of that element. 304 | bardsong - Threnody of that element (for aby proccing) 305 | ara - Highest ara spell of that element 306 | ara1 - Tier 1 ara 307 | ara2 - Tier 2 ara 308 | ara3 - Tier 3 ara 309 | 310 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 311 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 312 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 313 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 314 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 315 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 316 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 317 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 318 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME 319 | PLEASE DO NOT MESSAGE ME ABOUT ANYTHING THIRD PARTY IN GAME -------------------------------------------------------------------------------- /data/Selindrile/Selindrile_Mnk_Gear.lua: -------------------------------------------------------------------------------- 1 | function user_job_setup() 2 | -- Options: Override default values 3 | state.OffenseMode:options('Normal','Acc','FullAcc') 4 | state.WeaponskillMode:options('Match','Normal','Acc','FullAcc') 5 | state.HybridMode:options('Normal', 'PDT') 6 | state.PhysicalDefenseMode:options('PDT') 7 | state.MagicalDefenseMode:options('MDT') 8 | state.ResistDefenseMode:options('MEVA') 9 | state.Weapons:options('Godhands','Staff','ProcStaff','ProcClub','Barehanded','ProcSword','ProcGreatSword','ProcScythe','ProcPolearm','ProcGreatKatana') 10 | 11 | state.ExtraMeleeMode = M{['description']='Extra Melee Mode', 'None'} 12 | 13 | update_melee_groups() 14 | 15 | -- Additional local binds 16 | send_command('bind ^` input /ja "Boost" ') 17 | send_command('bind !` input /ja "Perfect Counter" ') 18 | send_command('bind ^backspace input /ja "Mantra" ') 19 | send_command('bind @` gs c cycle SkillchainMode') 20 | 21 | select_default_macro_book() 22 | end 23 | 24 | function init_gear_sets() 25 | -------------------------------------- 26 | -- Start defining the sets 27 | -------------------------------------- 28 | 29 | -- Precast Sets 30 | 31 | -- Precast sets to enhance JAs on use 32 | sets.precast.JA['Hundred Fists'] = {legs="Hesychast's Hose +1"} 33 | sets.precast.JA['Boost'] = {} --hands="Anchorite's Gloves +1" 34 | sets.precast.JA['Boost'].OutOfCombat = {} --hands="Anchorite's Gloves +1", Remove Haste and Add Slow Gear. 35 | sets.precast.JA['Dodge'] = {feet="Anchorite's Gaiters +1"} 36 | sets.precast.JA['Focus'] = {head="Anchorite's Crown +1"} 37 | sets.precast.JA['Counterstance'] = {} --feet="Hesychast's Gaiters +1" 38 | sets.precast.JA['Footwork'] = {feet="Shukuyu Sune-Ate"} 39 | sets.precast.JA['Formless Strikes'] = {body="Hesychast's Cyclas"} 40 | sets.precast.JA['Mantra'] = {feet="Mel. Gaiters +2"} --feet="Hesychast's Gaiters +1" 41 | 42 | sets.precast.JA['Chi Blast'] = {} 43 | 44 | sets.precast.JA['Chakra'] = { 45 | head="Dampening Tam", 46 | body="Malignance Tabard",hands="Hesychast's Gloves +1", 47 | legs="Hes. Hose +1",feet="Anch. Gaiters +1"} 48 | 49 | -- Waltz set (chr and vit) 50 | sets.precast.Waltz = {} 51 | 52 | -- Don't need any special gear for Healing Waltz. 53 | sets.precast.Waltz['Healing Waltz'] = {} 54 | 55 | sets.precast.Step = {ammo="Falcon Eye", 56 | head="Malignance Chapeau",neck="Moonbeam Nodowa",ear1="Mache Earring +1",ear2="Telos Earring", 57 | body="Malignance Tabard",hands="Hesychast's Gloves +1",ring1="Ramuh Ring +1",ring2="Ramuh Ring +1", 58 | back="Segomo's Mantle",waist="Olseni Belt",legs="Hiza. Hizayoroi +2",feet="Malignance Boots"} 59 | 60 | sets.precast.Flourish1 = {ammo="Falcon Eye", 61 | head="Malignance Chapeau",neck="Moonbeam Nodowa",ear1="Mache Earring +1",ear2="Telos Earring", 62 | body="Malignance Tabard",hands="Hesychast's Gloves +1",ring1="Ramuh Ring +1",ring2="Ramuh Ring +1", 63 | back="Segomo's Mantle",waist="Olseni Belt",legs="Mummu Kecks +2",feet="Malignance Boots"} 64 | 65 | 66 | -- Fast cast sets for spells 67 | 68 | sets.precast.FC = {ammo="Impatiens", 69 | head=gear.herculean_fc_head,neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring", 70 | body="Dread Jupon",hands="Leyline Gloves",ring2="Lebeche Ring",ring2="Kishar Ring", 71 | legs="Rawhide Trousers"} 72 | 73 | sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads",body="Passion Jacket"}) 74 | 75 | 76 | -- Weaponskill sets 77 | -- Default set for any weaponskill that isn't any more specifically defined 78 | sets.precast.WS = {ammo="Voluspa Tathlum", 79 | head="Adhemar Bonnet +1",neck="Fotia Gorget",ear1="Brutal Earring",ear2="Sherida Earring", 80 | body="Ken. Samue",hands="Adhemar Wrist. +1",ring1="Gere Ring",ring2="Niqmaddu Ring", 81 | back="Segomo's Mantle",waist="Fotia Belt",legs="Hiza. Hizayoroi +2",feet=gear.herculean_ta_feet} 82 | sets.precast.WSAcc = {ammo="Falcon Eye",head="Dampening Tam",neck="Combatant's Torque",ear1="Cessance Earring",ring2="Ramuh Ring +1",body="Malignance Tabard",waist="Olseni Belt",legs="Hiza. Hizayoroi +2",feet="Malignance Boots"} 83 | sets.precast.WSFullAcc = {ammo="Falcon Eye",head="Mummu Bonnet +2",neck="Moonbeam Nodowa",ear1="Mache Earring +1",ear2="Telos Earring",body="Malignance Tabard",hands="Malignance Gloves",ring1="Ramuh Ring +1",ring2="Ramuh Ring +1",waist="Olseni Belt",legs="Hiza. Hizayoroi +2",feet="Malignance Boots"} 84 | sets.precast.WS.Acc = set_combine(sets.precast.WS, sets.precast.WSAcc) 85 | sets.precast.WS.FullAcc = set_combine(sets.precast.WS, sets.precast.WSFullAcc) 86 | 87 | -- Specific weaponskill sets. 88 | 89 | sets.precast.WS['Raging Fists'] = set_combine(sets.precast.WS, {waist="Grunfeld Rope"}) 90 | sets.precast.WS['Howling Fist'] = set_combine(sets.precast.WS, {head="Lilitu Headpiece",body=gear.herculean_wsd_body}) 91 | sets.precast.WS['Asuran Fists'] = set_combine(sets.precast.WS, {waist="Grunfeld Rope"}) 92 | sets.precast.WS["Ascetic's Fury"] = set_combine(sets.precast.WS, {neck="Caro Necklace",body="Abnoba Kaftan",hands="Ryuo Tekko",ring2="Begrudging Ring",waist="Grunfeld Rope",feet=gear.herculean_wsd_feet}) 93 | sets.precast.WS["Victory Smite"] = set_combine(sets.precast.WS, {ear1="Moonshade Earring",body="Abnoba Kaftan",hands="Ryuo Tekko",ring2="Begrudging Ring",legs="Mummu Kecks +2",feet="Mummu Gamash. +2"}) 94 | sets.precast.WS['Shijin Spiral'] = set_combine(sets.precast.WS, {head="Dampening Tam"}) 95 | sets.precast.WS['Dragon Kick'] = set_combine(sets.precast.WS, {waist="Grunfeld Rope"}) 96 | sets.precast.WS['Tornado Kick'] = set_combine(sets.precast.WS, {}) 97 | sets.precast.WS['Spinning Attack'] = set_combine(sets.precast.WS, {waist="Grunfeld Rope"}) 98 | 99 | sets.precast.WS["Raging Fists"].Acc = set_combine(sets.precast.WS["Raging Fists"], sets.precast.WSAcc) 100 | sets.precast.WS["Howling Fist"].Acc = set_combine(sets.precast.WS["Howling Fist"], sets.precast.WSAcc) 101 | sets.precast.WS["Asuran Fists"].Acc = set_combine(sets.precast.WS["Asuran Fists"], sets.precast.WSAcc) 102 | sets.precast.WS["Ascetic's Fury"].Acc = set_combine(sets.precast.WS["Ascetic's Fury"], sets.precast.WSAcc, {head="Mummu Bonnet +2",body="Sayadio's Kaftan",hands="Ryuo Tekko",ring2="Begrudging Ring",legs="Mummu Kecks +2",feet="Mummu Gamash. +2"}) 103 | sets.precast.WS["Victory Smite"].Acc = set_combine(sets.precast.WS["Victory Smite"], sets.precast.WSAcc, {head="Mummu Bonnet +2",ear1="Moonshade Earring",body="Sayadio's Kaftan",hands="Ryuo Tekko",ring2="Begrudging Ring",legs="Mummu Kecks +2",feet="Mummu Gamash. +2"}) 104 | sets.precast.WS["Shijin Spiral"].Acc = set_combine(sets.precast.WS["Shijin Spiral"], sets.precast.WSAcc) 105 | sets.precast.WS["Dragon Kick"].Acc = set_combine(sets.precast.WS["Dragon Kick"], sets.precast.WSAcc) 106 | sets.precast.WS["Tornado Kick"].Acc = set_combine(sets.precast.WS["Tornado Kick"], sets.precast.WSAcc) 107 | 108 | sets.precast.WS["Raging Fists"].FullAcc = set_combine(sets.precast.WS["Raging Fists"], sets.precast.WSFullAcc) 109 | sets.precast.WS["Howling Fist"].FullAcc = set_combine(sets.precast.WS["Howling Fist"], sets.precast.WSFullAcc) 110 | sets.precast.WS["Asuran Fists"].FullAcc = set_combine(sets.precast.WS["Asuran Fists"], sets.precast.WSFullAcc) 111 | sets.precast.WS["Ascetic's Fury"].FullAcc = set_combine(sets.precast.WS["Ascetic's Fury"], sets.precast.WSFullAcc, {head="Mummu Bonnet +2",body="Mummu Jacket +2",hands="Ryuo Tekko",legs="Mummu Kecks +2",feet="Mummu Gamash. +2"}) 112 | sets.precast.WS["Victory Smite"].FullAcc = set_combine(sets.precast.WS["Victory Smite"], sets.precast.WSFullAcc, {head="Mummu Bonnet +2",body="Mummu Jacket +2",hands="Ryuo Tekko",legs="Mummu Kecks +2",feet="Mummu Gamash. +2"}) 113 | sets.precast.WS["Shijin Spiral"].FullAcc = set_combine(sets.precast.WS["Shijin Spiral"], sets.precast.WSFullAcc) 114 | sets.precast.WS["Dragon Kick"].FullAcc = set_combine(sets.precast.WS["Dragon Kick"], sets.precast.WSFullAcc) 115 | sets.precast.WS["Tornado Kick"].FullAcc = set_combine(sets.precast.WS["Tornado Kick"], sets.precast.WSFullAcc) 116 | 117 | sets.precast.WS['Cataclysm'] = {ammo="Ghastly Tathlum +1", 118 | neck="Baetyl Pendant",ear1="Friomisi Earring",ear2="Crematio Earring", 119 | hands="Malignance Gloves",ring1="Shiva Ring +1", 120 | back="Toro Cape",legs="Nahtirah Trousers"} 121 | 122 | -- Swap to these on Moonshade using WS if at 3000 TP 123 | sets.MaxTP = {ear1="Brutal Earring",ear2="Sherida Earring",} 124 | sets.AccMaxTP = {ear1="Mache Earring +1",ear2="Telos Earring"} 125 | 126 | -- Midcast Sets 127 | sets.midcast.FastRecast = {ammo="Staunch Tathlum +1", 128 | head=gear.herculean_fc_head,neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Loquac. Earring", 129 | body="Dread Jupon",hands="Leyline Gloves",ring1="Defending Ring",ring2="Prolix Ring", 130 | back="Moonlight Cape",waist="Black Belt",legs="Nyame Flanchard",feet="Hippo. Socks +1"} 131 | 132 | -- Specific spells 133 | sets.midcast.Utsusemi = set_combine(sets.midcast.FastRecast, {back="Mujin Mantle"}) 134 | 135 | -- Sets to return to when not performing an action. 136 | 137 | -- Resting sets 138 | sets.resting = {body="Hesychast's Cyclas",ring2="Sheltered Ring"} 139 | 140 | 141 | -- Idle sets 142 | sets.idle = {ammo="Staunch Tathlum +1", 143 | head="Nyame Helm",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring", 144 | body="Hiza. Haramaki +2",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Sheltered Ring", 145 | back="Moonlight Cape",waist="Black Belt",legs="Nyame Flanchard",feet="Hippo. Socks +1"} 146 | 147 | -- Defense sets 148 | sets.defense.PDT = {ammo="Eluder's Sachet", 149 | head="Nyame Helm",neck="Loricate Torque +1",ear1="Etiolation Earring",ear2="Sanare Earring", 150 | body="Nyame Mail",hands="Nyame Gauntlets",ring1="Defending Ring",ring2="Warden's Ring", 151 | back="Moonlight Cape",waist="Black Belt",legs="Nyame Flanchard",feet="Nyame Sollerets"} 152 | 153 | sets.defense.MDT = {ammo="Staunch Tathlum +1", 154 | head="Nyame Helm",neck="Warder's Charm +1",ear1="Etiolation Earring",ear2="Sanare Earring", 155 | body="Nyame Mail",hands="Nyame Gauntlets",ring1="Archon Ring",ring2="Shadow Ring", 156 | back="Moonlight Cape",waist="Carrier's Sash",legs="Nyame Flanchard",feet="Nyame Sollerets"} 157 | 158 | sets.defense.MEVA = {ammo="Staunch Tathlum +1", 159 | head="Nyame Helm",neck="Warder's Charm +1",ear1="Etiolation Earring",ear2="Sanare Earring", 160 | body="Nyame Mail",hands="Nyame Gauntlets",ring1="Archon Ring",ring2="Shadow Ring", 161 | back="Moonlight Cape",waist="Carrier's Sash",legs="Nyame Flanchard",feet="Nyame Sollerets"} 162 | 163 | sets.Kiting = {feet="Herald's Gaiters"} 164 | 165 | -- Engaged sets 166 | 167 | -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous 168 | -- sets if more refined versions aren't defined. 169 | -- If you create a set with both offense and defense modes, the offense mode should be first. 170 | -- EG: sets.engaged.Dagger.Accuracy.Evasion 171 | 172 | -- Normal melee sets 173 | sets.engaged = {ammo="Aurgelmir Orb +1", 174 | head="Dampening Tam",neck="Moonbeam Nodowa",ear1="Brutal Earring",ear2="Sherida Earring", 175 | body="Ken. Samue",hands="Adhemar Wrist. +1",ring1="Gere Ring",ring2="Niqmaddu Ring", 176 | back="Segomo's Mantle",waist="Windbuffet Belt +1",legs="Samnuha Tights",feet=gear.herculean_ta_feet} 177 | sets.engaged.Acc = {ammo="Aurgelmir Orb +1", 178 | head="Dampening Tam",neck="Moonbeam Nodowa",ear1="Cessance Earring",ear2="Sherida Earring", 179 | body="Ken. Samue",hands="Adhemar Wrist. +1",ring1="Gere Ring",ring2="Niqmaddu Ring", 180 | back="Segomo's Mantle",waist="Olseni Belt",legs="Malignance Tights",feet="Malignance Boots"} 181 | sets.engaged.FullAcc = {ammo="Falcon Eye", 182 | head="Malignance Chapeau",neck="Moonbeam Nodowa",ear1="Mache Earring +1",ear2="Telos Earring", 183 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Ramuh Ring +1",ring2="Ramuh Ring +1", 184 | back="Segomo's Mantle",waist="Olseni Belt",legs="Malignance Tights",feet="Malignance Boots"} 185 | 186 | -- Defensive melee hybrid sets 187 | sets.engaged.PDT = {ammo="Aurgelmir Orb +1", 188 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Brutal Earring",ear2="Sherida Earring", 189 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Niqmaddu Ring", 190 | back="Moonlight Cape",waist="Windbuffet Belt +1",legs="Malignance Tights",feet="Malignance Boots"} 191 | sets.engaged.Acc.PDT = {ammo="Falcon Eye", 192 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Cessance Earring",ear2="Sherida Earring", 193 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Niqmaddu Ring", 194 | back="Moonlight Cape",waist="Olseni Belt",legs="Malignance Tights",feet="Malignance Boots"} 195 | sets.engaged.FullAcc.PDT = {ammo="Falcon Eye", 196 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Mache Earring +1",ear2="Odr Earring", 197 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Ramuh Ring +1", 198 | back="Moonlight Cape",waist="Olseni Belt",legs="Malignance Tights",feet="Malignance Boots"} 199 | 200 | -- Hundred Fists/Impetus melee set mods 201 | 202 | sets.engaged.HF = set_combine(sets.engaged, {}) 203 | sets.engaged.Acc.HF = set_combine(sets.engaged.Acc, {}) 204 | sets.engaged.FullAcc.HF = set_combine(sets.engaged.FullAcc, {}) 205 | 206 | sets.buff.Doom = set_combine(sets.buff.Doom, {}) 207 | sets.buff.Sleep = {head="Frenzy Sallet"} 208 | sets.buff.Impetus = {body="Bhikku Cyclas +1"} 209 | sets.buff.Footwork = {feet="Shukuyu Sune-Ate"} 210 | sets.buff.Boost = {} --waist="Ask Sash" 211 | 212 | sets.FootworkWS = {feet="Shukuyu Sune-Ate"} 213 | sets.DayIdle = {} 214 | sets.NightIdle = {} 215 | sets.Knockback = {} 216 | sets.TreasureHunter = set_combine(sets.TreasureHunter, {}) 217 | sets.Skillchain = {legs="Ryuo Hakama"} 218 | 219 | -- Weapons sets 220 | sets.weapons.Godhands = {main="Godhands"} 221 | sets.weapons.Barehanded = {main=empty} 222 | sets.weapons.Staff = {main="Malignance Pole",sub="Bloodrain Strap"} 223 | sets.weapons.ProcStaff = {main="Terra's Staff"} 224 | sets.weapons.ProcClub = {main="Mafic Cudgel"} 225 | sets.weapons.ProcSword = {main="Ark Sword",sub=empty} 226 | sets.weapons.ProcGreatSword = {main="Lament",sub=empty} 227 | sets.weapons.ProcScythe = {main="Ark Scythe",sub=empty} 228 | sets.weapons.ProcPolearm = {main="Pitchfork +1",sub=empty} 229 | sets.weapons.ProcGreatKatana = {main="Hardwood Katana",sub=empty} 230 | end 231 | 232 | -- Select default macro book on initial load or subjob change. 233 | function select_default_macro_book() 234 | -- Default macro set/book 235 | if player.sub_job == 'DNC' then 236 | set_macro_page(5, 20) 237 | elseif player.sub_job == 'NIN' then 238 | set_macro_page(4, 20) 239 | elseif player.sub_job == 'THF' then 240 | set_macro_page(6, 20) 241 | elseif player.sub_job == 'RUN' then 242 | set_macro_page(7, 20) 243 | else 244 | set_macro_page(6, 20) 245 | end 246 | end -------------------------------------------------------------------------------- /data/Selindrile/Selindrile_Rng_Gear.lua: -------------------------------------------------------------------------------- 1 | -- Setup vars that are user-dependent. Can override this function in a sidecar file. 2 | function user_job_setup() 3 | state.OffenseMode:options('Normal','Acc') 4 | state.HybridMode:options('Normal','DTLite','DT') 5 | state.RangedMode:options('Normal','Acc','Fodder') 6 | state.WeaponskillMode:options('Match','Normal', 'Acc') 7 | state.IdleMode:options('Normal', 'PDT') 8 | state.Weapons:options('Default','DualWeapons','DualSavageWeapons','DualEviscerationWeapons','DualMagicWeapons','DualMalevolence') 9 | 10 | --Ikenga_vest_bonus = 190 -- It is 190 at R20. Uncomment if you need to manually adjust because you are using below R20 11 | 12 | WeaponType = {['Fail-Not'] = "Bow", 13 | ['Fomalhaut'] = "Gun", 14 | ['Ataktos'] = "Gun", 15 | } 16 | 17 | DefaultAmmo = { 18 | ['Bow'] = {['Default'] = "Eminent Arrow", 19 | ['WS'] = "Eminent Arrow", 20 | ['Acc'] = "Eminent Arrow", 21 | ['Magic'] = "Eminent Arrow", 22 | ['MagicAcc'] = "Eminent Arrow", 23 | ['Unlimited'] = "Hauksbok Arrow", 24 | ['MagicUnlimited'] ="Hauksbok Arrow", 25 | ['MagicAccUnlimited'] ="Hauksbok Arrow"}, 26 | 27 | ['Gun'] = {['Default'] = "Chrono Bullet", 28 | ['WS'] = "Chrono Bullet", 29 | ['Acc'] = "Chrono Bullet", 30 | ['Magic'] = "Orichalc. Bullet", 31 | ['MagicAcc'] = "Orichalc. Bullet", 32 | ['Unlimited'] = "Hauksbok Bullet", 33 | ['MagicUnlimited'] = "Hauksbok Bullet", 34 | ['MagicAccUnlimited'] ="Animikii Bullet"}, 35 | 36 | ['Crossbow'] = {['Default'] = "Eminent Bolt", 37 | ['WS'] = "Eminent Bolt", 38 | ['Acc'] = "Eminent Bolt", 39 | ['Magic'] = "Eminent Bolt", 40 | ['MagicAcc'] = "Eminent Bolt", 41 | ['Unlimited'] = "Hauksbok Bolt", 42 | ['MagicUnlimited'] = "Hauksbok Bolt", 43 | ['MagicAccUnlimited'] ="Hauksbok Bolt"} 44 | } 45 | 46 | gear.tp_ranger_jse_back = {name="Belenus's Cape",augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','"Store TP"+10',}} 47 | gear.wsd_ranger_jse_back = {name="Belenus's Cape",augments={'AGI+20','Rng.Acc.+20 Rng.Atk.+20','Weapon skill damage +10%',}} 48 | gear.snapshot_jse_back = {name="Belenus's Cape",augments={'"Snapshot"+10',}} 49 | 50 | -- Additional local binds 51 | send_command('bind !` input /ra ') 52 | send_command('bind !backspace input /ja "Bounty Shot" ') 53 | send_command('bind @f7 gs c toggle RngHelper') 54 | send_command('bind @` gs c cycle SkillchainMode') 55 | send_command('bind !r gs c weapons MagicWeapons;gs c update') 56 | send_command('bind ^q gs c weapons SingleWeapon;gs c update') 57 | 58 | select_default_macro_book() 59 | 60 | end 61 | 62 | -- Set up all gear sets. 63 | function init_gear_sets() 64 | -------------------------------------- 65 | -- Precast sets 66 | -------------------------------------- 67 | 68 | 69 | 70 | -- Precast sets to enhance JAs 71 | sets.TreasureHunter = set_combine(sets.TreasureHunter, {}) 72 | sets.precast.JA['Bounty Shot'] = set_combine(sets.TreasureHunter, {hands="Amini Glove. +1"}) 73 | sets.precast.JA['Camouflage'] = {body="Orion Jerkin +1"} 74 | sets.precast.JA['Scavenge'] = {feet="Orion Socks +1"} 75 | sets.precast.JA['Shadowbind'] = {hands="Orion Bracers +1"} 76 | sets.precast.JA['Sharpshot'] = {legs="Orion Braccae +3"} 77 | sets.precast.JA['Double Shot'] = {back=gear.tp_ranger_jse_back} 78 | 79 | 80 | -- Fast cast sets for spells 81 | 82 | sets.precast.FC = { 83 | head="Carmine Mask +1",neck="Baetyl Pendant",ear1="Enchntr. Earring +1",ear2="Loquac. Earring", 84 | body="Dread Jupon",hands="Leyline Gloves",ring1="Prolix Ring",ring2="Lebeche Ring", 85 | back="Moonlight Cape",waist="Flume Belt +1",legs="Rawhide Trousers",feet="Carmine Greaves +1"} 86 | 87 | sets.precast.FC.Utsusemi = set_combine(sets.precast.FC, {neck="Magoraga Beads",body="Passion Jacket"}) 88 | 89 | 90 | -- Ranged sets (snapshot) 91 | 92 | sets.precast.RA = { 93 | head="Amini Gapette +1", --7 94 | body="Amini Caban +1",hands="Carmine Fin. Ga. +1",ring1="Crepuscular Ring", --11 95 | back=gear.snapshot_jse_back,waist="Impulse Belt",legs="Orion Braccae +3",feet="Meg. Jam. +2"} --38 96 | 97 | sets.precast.RA.Flurry = set_combine(sets.precast.RA, {}) 98 | sets.precast.RA.Flurry2 = set_combine(sets.precast.RA, {head="Orion Beret +3",waist="Yemaya Belt",legs="Adhemar Kecks +1"}) 99 | 100 | 101 | -- Weaponskill sets 102 | -- Default set for any weaponskill that isn't any more specifically defined 103 | sets.precast.WS = { 104 | head="Orion Beret +3",neck="Fotia Gorget",ear1="Moonshade Earring",ear2="Telos Earring", 105 | body="Meg. Cuirie +2",hands="Meg. Gloves +2",ring1="Regal Ring",ring2="Dingir Ring", 106 | back=gear.wsd_ranger_jse_back,waist="Fotia Belt",legs="Meg. Chausses +2",feet="Meg. Jam. +2"} 107 | 108 | sets.precast.WS.Acc = { 109 | head="Orion Beret +3",neck="Fotia Gorget",ear1="Moonshade Earring",ear2="Telos Earring", 110 | body="Meg. Cuirie +2",hands="Meg. Gloves +2",ring1="Regal Ring",ring2="Dingir Ring", 111 | back=gear.wsd_ranger_jse_back,waist="Fotia Belt",legs="Meg. Chausses +2",feet="Meg. Jam. +2"} 112 | 113 | sets.precast.WS['Wildfire'] = { 114 | head="Orion Beret +3",neck="Baetyl Pendant",ear1="Crematio Earring",ear2="Friomisi Earring", 115 | body="Samnuha Coat",hands="Carmine Fin. Ga. +1",ring1="Regal Ring",ring2="Dingir Ring", 116 | back=gear.wsd_ranger_jse_back,waist="Eschan Stone",legs="Gyve Trousers",feet=gear.herculean_nuke_feet} 117 | 118 | sets.precast.WS['Wildfire'].Acc = { 119 | head="Orion Beret +3",neck="Sanctity Necklace",ear1="Crematio Earring",ear2="Friomisi Earring", 120 | body="Samnuha Coat",hands="Leyline Gloves",ring1="Regal Ring",ring2="Dingir Ring", 121 | back=gear.wsd_ranger_jse_back,waist="Eschan Stone",legs="Gyve Trousers",feet=gear.herculean_nuke_feet} 122 | 123 | sets.precast.WS['Aeolian Edge'] = { 124 | head=gear.herculean_nuke_head,neck="Sanctity Necklace",ear1="Crematio Earring",ear2="Friomisi Earring", 125 | body="Samnuha Coat",hands="Leyline Gloves",ring1="Metamor. Ring +1",ring2="Dingir Ring", 126 | back=gear.wsd_ranger_jse_back,waist="Eschan Stone",legs="Gyve Trousers",feet=gear.herculean_nuke_feet} 127 | 128 | sets.precast.WS['Trueflight'] = { 129 | head="Orion Beret +3",neck="Baetyl Pendant",ear1="Moonshade Earring",ear2="Friomisi Earring", 130 | body="Samnuha Coat",hands="Carmine Fin. Ga. +1",ring1="Regal Ring",ring2="Dingir Ring", 131 | back=gear.wsd_ranger_jse_back,waist="Eschan Stone",legs="Gyve Trousers",feet=gear.herculean_nuke_feet} 132 | 133 | sets.precast.WS['Trueflight'].Acc = { 134 | head="Orion Beret +3",neck="Sanctity Necklace",ear1="Crematio Earring",ear2="Friomisi Earring", 135 | body="Samnuha Coat",hands="Leyline Gloves",ring1="Regal Ring",ring2="Dingir Ring", 136 | back=gear.wsd_ranger_jse_back,waist="Eschan Stone",legs="Gyve Trousers",feet=gear.herculean_nuke_feet} 137 | 138 | -- Swap to these on Moonshade using WS if at 3000 TP 139 | sets.MaxTP = {} 140 | sets.AccMaxTP = {} 141 | 142 | -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found. 143 | 144 | 145 | -------------------------------------- 146 | -- Midcast sets 147 | -------------------------------------- 148 | 149 | -- Fast recast for spells 150 | 151 | sets.midcast.FastRecast = { 152 | head="Carmine Mask +1",neck="Baetyl Pendant",ear1="Enchntr. Earring +1",ear2="Loquac. Earring", 153 | body="Dread Jupon",hands="Leyline Gloves",ring1="Kishar Ring",ring2="Lebeche Ring", 154 | back="Moonlight Cape",waist="Flume Belt +1",legs="Rawhide Trousers",feet="Carmine Greaves +1"} 155 | 156 | -- Ranged sets 157 | 158 | sets.midcast.RA = { 159 | head="Malignance Chapeau",neck="Iskur Gorget",ear1="Enervating Earring",ear2="Telos Earring", 160 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Crepuscular Ring",ring2="Ilabrat Ring", 161 | back=gear.tp_ranger_jse_back,waist="Yemaya Belt",legs="Malignance Tights",feet="Malignance Boots"} 162 | 163 | sets.midcast.RA.Acc = { 164 | head="Malignance Chapeau",neck="Iskur Gorget",ear1="Enervating Earring",ear2="Telos Earring", 165 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Regal Ring",ring2="Ilabrat Ring", 166 | back=gear.tp_ranger_jse_back,waist="Yemaya Belt",legs="Malignance Tights",feet="Malignance Boots"} 167 | 168 | sets.midcast.RA.Fodder = { 169 | head="Malignance Chapeau",neck="Iskur Gorget",ear1="Dedition Earring",ear2="Telos Earring", 170 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Crepuscular Ring",ring2="Ilabrat Ring", 171 | back=gear.tp_ranger_jse_back,waist="Yemaya Belt",legs="Malignance Tights",feet="Malignance Boots"} 172 | 173 | --These sets will overlay based on accuracy level, regardless of other options. 174 | sets.buff.Camouflage = {body="Orion Jerkin +1"} 175 | sets.buff.Camouflage.Acc = {} 176 | sets.buff['Double Shot'] = {back=gear.tp_ranger_jse_back} 177 | sets.buff['Double Shot'].Acc = {} 178 | sets.buff.Barrage = {hands="Orion Bracers +1"} 179 | 180 | sets.Self_Healing = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"} 181 | sets.Cure_Received = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"} 182 | sets.Self_Refresh = {waist="Gishdubar Sash"} 183 | 184 | sets.midcast.Utsusemi = sets.midcast.FastRecast 185 | 186 | -------------------------------------- 187 | -- Idle/resting/defense/etc sets 188 | -------------------------------------- 189 | 190 | -- Sets to return to when not performing an action. 191 | 192 | -- Resting sets 193 | sets.resting = {} 194 | 195 | -- Idle sets 196 | sets.idle = { 197 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Sanare Earring", 198 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Dark Ring", 199 | back="Moonlight Cape",waist="Carrier's Sash",legs="Malignance Tights",feet="Malignance Boots"} 200 | 201 | -- Defense sets 202 | sets.defense.PDT = { 203 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Sanare Earring", 204 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Dark Ring", 205 | back="Moonlight Cape",waist="Flume Belt +1",legs="Malignance Tights",feet="Malignance Boots"} 206 | 207 | sets.defense.MDT = { 208 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Sanare Earring", 209 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Shadow Ring", 210 | back="Moonlight Cape",waist="Carrier's Sash",legs="Malignance Tights",feet="Malignance Boots"} 211 | 212 | sets.defense.MEVA = { 213 | head="Malignance Chapeau",neck="Warder's Charm +1",ear1="Genmei Earring",ear2="Sanare Earring", 214 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Vengeful Ring", 215 | back="Moonlight Cape",waist="Carrier's Sash",legs="Malignance Tights",feet="Malignance Boots"} 216 | 217 | sets.Kiting = {legs="Carmine Cuisses +1"} 218 | sets.DayIdle = {} 219 | sets.NightIdle = {} 220 | sets.BulletPouch = {waist="Chr. Bul. Pouch"} 221 | 222 | -- Weapons sets 223 | sets.weapons.Default = {main="Kustawi +1",sub="Nusku Shield",range="Fomalhaut"} 224 | sets.weapons.DualWeapons = {main="Kustawi +1",sub="Kustawi",range="Fomalhaut"} 225 | sets.weapons.DualSavageWeapons = {main="Naegling",sub="Blurred Knife +1",range="Fomalhaut"} 226 | sets.weapons.DualEviscerationWeapons = {main="Tauret",sub="Blurred Knife +1",range="Fomalhaut"} 227 | sets.weapons.DualMalevolence = {main="Malevolence",sub="Malevolence",range="Fomalhaut"} 228 | sets.weapons.DualMagicWeapons = {main="Tauret",sub="Naegling",range="Fomalhaut"} 229 | 230 | -------------------------------------- 231 | -- Engaged sets 232 | -------------------------------------- 233 | 234 | -- Normal melee group 235 | sets.engaged = { 236 | head="Dampening Tam",neck="Iskur Gorget",ear1="Cessance Earring",ear2="Brutal Earring", 237 | body="Malignance Tabard",hands="Adhemar Wrist. +1",ring1="Epona's Ring",ring2="Petrov Ring", 238 | back=gear.tp_ranger_jse_back,waist="Windbuffet Belt +1",legs="Samnuha Tights",feet=gear.herculean_ta_feet} 239 | 240 | sets.engaged.Acc = { 241 | head="Dampening Tam",neck="Combatant's Torque",ear1="Cessance Earring",ear2="Telos Earring", 242 | body="Malignance Tabard",hands="Adhemar Wrist. +1",ring1="Epona's Ring",ring2="Petrov Ring", 243 | back=gear.tp_ranger_jse_back,waist="Olseni Belt",legs="Samnuha Tights",feet="Malignance Boots"} 244 | 245 | sets.engaged.DTLite = { 246 | head="Malignance Chapeau",neck="Iskur Gorget",ear1="Cessance Earring",ear2="Brutal Earring", 247 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Epona's Ring",ring2="Petrov Ring", 248 | back=gear.tp_ranger_jse_back,waist="Windbuffet Belt +1",legs="Malignance Tights",feet="Malignance Boots"} 249 | 250 | sets.engaged.DT = { 251 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Cessance Earring",ear2="Brutal Earring", 252 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Dark Ring", 253 | back=gear.tp_ranger_jse_back,waist="Windbuffet Belt +1",legs="Malignance Tights",feet="Malignance Boots"} 254 | 255 | sets.engaged.DW = { 256 | head="Dampening Tam",neck="Asperity Necklace",ear1="Cessance Earring",ear2="Brutal Earring", 257 | body="Adhemar Jacket +1",hands="Floral Gauntlets",ring1="Epona's Ring",ring2="Petrov Ring", 258 | back=gear.tp_ranger_jse_back,waist="Windbuffet Belt +1",legs="Samnuha Tights",feet=gear.herculean_ta_feet} 259 | 260 | sets.engaged.DW.DT = { 261 | head="Malignance Chapeau",neck="Loricate Torque +1",ear1="Suppanomimi",ear2="Brutal Earring", 262 | body="Malignance Tabard",hands="Malignance Gloves",ring1="Defending Ring",ring2="Dark Ring", 263 | back=gear.tp_ranger_jse_back,waist="Windbuffet Belt +1",legs="Malignance Tights",feet="Malignance Boots"} 264 | 265 | sets.engaged.DW.Acc = { 266 | head="Dampening Tam",neck="Combatant's Torque",ear1="Digni. Earring",ear2="Telos Earring", 267 | body="Adhemar Jacket +1",hands="Floral Gauntlets",ring1="Ramuh Ring +1",ring2="Ramuh Ring +1", 268 | back=gear.tp_ranger_jse_back,waist="Olseni Belt",legs="Meg. Chausses +2",feet="Malignance Boots"} 269 | 270 | -------------------------------------- 271 | -- Custom buff sets 272 | -------------------------------------- 273 | sets.buff.Doom = set_combine(sets.buff.Doom, {}) 274 | end 275 | 276 | -- Select default macro book on initial load or subjob change. 277 | function select_default_macro_book() 278 | if player.sub_job == 'NIN' then 279 | set_macro_page(1, 19) 280 | elseif player.sub_job == 'DNC' then 281 | set_macro_page(1, 19) 282 | elseif player.sub_job == 'DRG' then 283 | set_macro_page(3, 19) 284 | else 285 | set_macro_page(1, 19) 286 | end 287 | end 288 | -------------------------------------------------------------------------------- /data/DRG.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 3 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 4 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 5 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 6 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 7 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 8 | -- 9 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 10 | -- 11 | -- Editing this file will cause you to be unable to use Github Desktop to update! 12 | -- 13 | -- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and 14 | -- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first. 15 | -- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence. 16 | -- 17 | -- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing 18 | -- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important 19 | -- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead. 20 | -- 21 | -- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example. 22 | -- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there. 23 | -- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs) 24 | -- 25 | -- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them: 26 | -- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what. 27 | -- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character. 28 | -- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character. 29 | -- 30 | -- 31 | -- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ 32 | -- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium. 33 | -- 34 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 35 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 36 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 37 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 38 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 39 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 40 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 41 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 42 | ------------------------------------------------------------------------------------------------------------------- 43 | -- Setup functions for this job. Generally should not be modified. 44 | ------------------------------------------------------------------------------------------------------------------- 45 | 46 | -- Initialization function for this job file. 47 | function get_sets() 48 | -- Load and initialize the include file. 49 | include('Sel-Include.lua') 50 | end 51 | 52 | 53 | -- Setup vars that are user-independent. 54 | function job_setup() 55 | 56 | state.Buff['Aftermath: Lv.3'] = buffactive['Aftermath: Lv.3'] or false 57 | state.Buff['Spirit Surge'] = buffactive['Spirit Surge'] or false 58 | state.Buff.Hasso = buffactive.Hasso or false 59 | state.Buff.Seigan = buffactive.Seigan or false 60 | state.Stance = M{['description']='Stance','Hasso','Seigan','None'} 61 | state.AutoJumpMode = M(false, 'Auto Jump Mode') 62 | state.AutoBondMode = M(true, 'Auto Bond Mode') 63 | 64 | autows = 'Stardiver' 65 | autofood = 'Soy Ramen' 66 | 67 | Breath_HPP = 60 68 | 69 | update_melee_groups() 70 | init_job_states({"Capacity","AutoRuneMode","AutoTrustMode","AutoJumpMode","AutoWSMode","AutoShadowMode","AutoFoodMode","AutoStunMode","AutoDefenseMode",},{"AutoBuffMode","AutoSambaMode","Weapons","OffenseMode","WeaponskillMode","Stance","IdleMode","Passive","RuneElement","TreasureMode",}) 71 | end 72 | 73 | function job_precast(spell, spellMap, eventArgs) 74 | 75 | if spell.type == 'WeaponSkill' and state.AutoBuffMode.value ~= 'Off' then 76 | local abil_recasts = windower.ffxi.get_ability_recasts() 77 | if player.sub_job == 'SAM' and not state.Buff['SJ Restriction'] then 78 | if player.tp > 1850 and abil_recasts[140] < latency then 79 | eventArgs.cancel = true 80 | windower.chat.input('/ja "Sekkanoki" ') 81 | windower.chat.input:schedule(1,'/ws "'..spell.english..'" '..spell.target.raw..'') 82 | tickdelay = os.clock() + 1.25 83 | return 84 | elseif abil_recasts[134] < latency then 85 | eventArgs.cancel = true 86 | windower.chat.input('/ja "Meditate" ') 87 | windower.chat.input:schedule(1,'/ws "'..spell.english..'" '..spell.target.raw..'') 88 | tickdelay = os.clock() + 1.25 89 | return 90 | end 91 | end 92 | elseif spell.action_type == 'Ability' then 93 | if spell.english == 'Restoring Breath' and state.AutoBondMode.value then 94 | local abil_recasts = windower.ffxi.get_ability_recasts() 95 | if pet.isvalid and pet.hpp < 75 and abil_recasts[239] < latency and abil_recasts[149] < latency and spell.target.hpp > 44 then 96 | eventArgs.cancel = true 97 | windower.chat.input('/ja "Spirit Bond" ') 98 | windower.chat.input:schedule(1,'/ja "Restoring Breath" '..spell.target.raw..'') 99 | end 100 | end 101 | end 102 | end 103 | 104 | function job_post_precast(spell, spellMap, eventArgs) 105 | if spell.type == 'WeaponSkill' then 106 | local WSset = standardize_set(get_precast_set(spell, spellMap)) 107 | local wsacc = check_ws_acc() 108 | 109 | if (WSset.ear1 == "Moonshade Earring" or WSset.ear2 == "Moonshade Earring") then 110 | -- Replace Moonshade Earring if we're at cap TP 111 | if get_effective_player_tp(spell, WSset) > 3200 then 112 | if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and sets.AccMaxTP then 113 | equip(sets.AccMaxTP[spell.english] or sets.AccMaxTP) 114 | elseif sets.MaxTP then 115 | equip(sets.MaxTP[spell.english] or sets.MaxTP) 116 | else 117 | end 118 | end 119 | end 120 | elseif spell.type == 'JobAbility' then 121 | if spell.english:endswith('Jump') then 122 | if sets.precast.JA[spell.english] then 123 | if sets.precast.JA[spell.english][state.OffenseMode.value] then 124 | equip(sets.precast.JA[spell.english][state.OffenseMode.value]) 125 | end 126 | end 127 | end 128 | end 129 | end 130 | 131 | -- Run after the default midcast() is done. 132 | -- eventArgs is the same one used in job_midcast, in case information needs to be persisted. 133 | function job_post_midcast(spell, spellMap, eventArgs) 134 | 135 | if spell.action_type == 'Magic' and player.hpp > 25 and player.hpp < Breath_HPP and pet.isvalid then 136 | equip(sets.midcast.HB_Trigger) 137 | end 138 | 139 | end 140 | 141 | -- Runs when a pet initiates an action. 142 | -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done. 143 | function job_pet_midcast(spell, spellMap, eventArgs) 144 | 145 | end 146 | 147 | function job_pet_aftercast(spell, spellMap, eventArgs) 148 | if spell.english == 'Restoring Breath' and state.AutoBondMode.value then 149 | windower.send_command('cancel spirit bond') 150 | end 151 | end 152 | 153 | function job_aftercast(spell, spellMap, eventArgs) 154 | if pet.isvalid then 155 | if (spell.action_type == 'Magic' and player.hpp < Breath_HPP) or spell.english == 'Steady Wing' or spell.english == 'Restoring Breath' then 156 | petWillAct = os.clock() 157 | equip(sets.HealingBreath) 158 | eventArgs.handled = true 159 | elseif spell.english == 'Smiting Breath' and sets.SmitingBreath then 160 | petWillAct = os.clock() 161 | equip(sets.SmitingBreath) 162 | eventArgs.handled = true 163 | end 164 | end 165 | end 166 | 167 | function job_buff_change(buff, gain) 168 | update_melee_groups() 169 | end 170 | 171 | function job_update(cmdParams, eventArgs) 172 | update_melee_groups() 173 | find_breath_hpp() 174 | 175 | if player.sub_job ~= 'SAM' and state.Stance.value ~= "None" then 176 | state.Stance:set("None") 177 | end 178 | end 179 | 180 | function update_melee_groups() 181 | classes.CustomMeleeGroups:clear() 182 | 183 | if data.areas.adoulin:contains(world.area) and buffactive.Ionis then 184 | classes.CustomMeleeGroups:append('Adoulin') 185 | end 186 | 187 | if player.equipment.main and player.equipment.main == "Ryunohige" and state.Buff['Aftermath: Lv.3'] then 188 | classes.CustomMeleeGroups:append('AM') 189 | end 190 | 191 | -- Spirit Surge modifies the custom melee groups 192 | if state.Buff['Spirit Surge'] then 193 | classes.CustomMeleeGroups:append('SpiritSurge') 194 | end 195 | end 196 | 197 | ------------------------------------------------------------------------------------------------------------------- 198 | -- User code that supplements self-commands. 199 | ------------------------------------------------------------------------------------------------------------------- 200 | 201 | -- Called for custom player commands. 202 | function job_self_command(commandArgs, eventArgs) 203 | 204 | end 205 | 206 | function job_tick() 207 | if check_hasso() then return true end 208 | if check_jump() then return true end 209 | if check_buff() then return true end 210 | return false 211 | end 212 | 213 | -- Modify the default melee set after it was constructed. 214 | function job_customize_melee_set(meleeSet) 215 | return meleeSet 216 | end 217 | 218 | function check_hasso() 219 | if player.sub_job == 'SAM' and player.status == 'Engaged' and not (state.Stance.value == 'None' or state.Buff.Hasso or state.Buff.Seigan or state.Buff['SJ Restriction'] or main_weapon_is_one_handed() or silent_check_amnesia()) then 220 | 221 | local abil_recasts = windower.ffxi.get_ability_recasts() 222 | 223 | if state.Stance.value == 'Hasso' and abil_recasts[138] < latency then 224 | windower.chat.input('/ja "Hasso" ') 225 | tickdelay = os.clock() + 1.1 226 | return true 227 | elseif state.Stance.value == 'Seigan' and abil_recasts[139] < latency then 228 | windower.chat.input('/ja "Seigan" ') 229 | tickdelay = os.clock() + 1.1 230 | return true 231 | end 232 | 233 | end 234 | 235 | return false 236 | end 237 | 238 | function check_jump() 239 | if state.AutoJumpMode.value and player.status == 'Engaged' and player.tp < 501 then 240 | 241 | local abil_recasts = windower.ffxi.get_ability_recasts() 242 | 243 | if abil_recasts[166] < latency then 244 | windower.chat.input('/ja "Spirit Jump" ') 245 | tickdelay = os.clock() + 1.1 246 | return true 247 | elseif abil_recasts[167] < latency then 248 | windower.chat.input('/ja "Soul Jump" ') 249 | tickdelay = os.clock() + 1.1 250 | return true 251 | elseif abil_recasts[158] < latency then 252 | windower.chat.input('/ja "Jump" ') 253 | tickdelay = os.clock() + 1.1 254 | return true 255 | elseif abil_recasts[159] < latency then 256 | windower.chat.input('/ja "High Jump" ') 257 | tickdelay = os.clock() + 1.1 258 | return true 259 | elseif pet.isvalid and abil_recasts[162] < latency and pet.tp > 350 then 260 | windower.chat.input('/ja "Spirit Link" ') 261 | tickdelay = os.clock() + 1.1 262 | return true 263 | else 264 | return false 265 | end 266 | end 267 | end 268 | 269 | function check_buff() 270 | if state.AutoBuffMode.value ~= 'Off' and player.in_combat then 271 | 272 | local abil_recasts = windower.ffxi.get_ability_recasts() 273 | 274 | if not pet.isvalid and abil_recasts[163] < latency then 275 | windower.chat.input('/ja "Call Wyvern" ') 276 | tickdelay = os.clock() + 1.1 277 | return true 278 | elseif state.Buff['SJ Restriction'] then 279 | return false 280 | elseif player.sub_job == 'DRK' and not buffactive['Last Resort'] and abil_recasts[87] < latency then 281 | windower.chat.input('/ja "Last Resort" ') 282 | tickdelay = os.clock() + 1.1 283 | return true 284 | elseif player.sub_job == 'WAR' and not buffactive.Berserk and abil_recasts[1] < latency then 285 | windower.chat.input('/ja "Berserk" ') 286 | tickdelay = os.clock() + 1.1 287 | return true 288 | elseif player.sub_job == 'WAR' and not buffactive.Aggressor and abil_recasts[4] < latency then 289 | windower.chat.input('/ja "Aggressor" ') 290 | tickdelay = os.clock() + 1.1 291 | return true 292 | else 293 | return false 294 | end 295 | end 296 | 297 | return false 298 | end 299 | 300 | function find_breath_hpp() 301 | if S{'WHM','BLM','RDM','SMN','BLU','SCH','GEO'}:contains(player.sub_job) then 302 | if sets.midcast.HB_Trigger and (sets.midcast.HB_Trigger.head:contains('Vishap') or sets.midcast.HB_Trigger.head:contains('Drachen')) then 303 | Breath_HPP = 65 304 | else 305 | Breath_HPP = 45 306 | end 307 | elseif S{'PLD','DRK','BRD','NIN','RUN'}:contains(player.sub_job) then 308 | if sets.midcast.HB_Trigger and (sets.midcast.HB_Trigger.head:contains('Vishap') or sets.midcast.HB_Trigger.head:contains('Drachen')) then 309 | Breath_HPP = 45 310 | else 311 | Breath_HPP = 35 312 | end 313 | end 314 | end -------------------------------------------------------------------------------- /data/THF.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 3 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 4 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 5 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 6 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 7 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 8 | -- 9 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 10 | -- 11 | -- Editing this file will cause you to be unable to use Github Desktop to update! 12 | -- 13 | -- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and 14 | -- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first. 15 | -- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence. 16 | -- 17 | -- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing 18 | -- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important 19 | -- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead. 20 | -- 21 | -- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example. 22 | -- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there. 23 | -- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs) 24 | -- 25 | -- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them: 26 | -- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what. 27 | -- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character. 28 | -- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character. 29 | -- 30 | -- 31 | -- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ 32 | -- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium. 33 | -- 34 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 35 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 36 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 37 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 38 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 39 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 40 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 41 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 42 | ------------------------------------------------------------------------------------------------------------------- 43 | -- Setup functions for this job. Generally should not be modified. 44 | ------------------------------------------------------------------------------------------------------------------- 45 | 46 | --[[ 47 | Custom commands: 48 | 49 | gs c cycle treasuremode (set on ctrl-= by default): Cycles through the available treasure hunter modes. 50 | 51 | Treasure hunter modes: 52 | None - Will never equip TH gear 53 | Tag - Will equip TH gear sufficient for initial contact with a mob (either melee, ranged hit, or Aeolian Edge AOE) 54 | SATA - Will equip TH gear sufficient for initial contact with a mob, and when using SATA 55 | Fulltime - Will keep TH gear equipped fulltime 56 | 57 | --]] 58 | 59 | -- Initialization function for this job file. 60 | function get_sets() 61 | -- Load and initialize the include file. 62 | include('Sel-Include.lua') 63 | end 64 | 65 | -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked. 66 | function job_setup() 67 | 68 | state.Buff['Sneak Attack'] = buffactive['Sneak Attack'] or false 69 | state.Buff['Trick Attack'] = buffactive['Trick Attack'] or false 70 | state.Buff['Feint'] = buffactive['Feint'] or false 71 | state.Buff['Aftermath: Lv.3'] = buffactive['Aftermath: Lv.3'] or false 72 | 73 | autows = "Rudra's Storm" 74 | rangedautows = "Last Stand" 75 | autofood = 'Soy Ramen' 76 | 77 | update_melee_groups() 78 | init_job_states({"Capacity","AutoRuneMode","AutoTrustMode","AutoWSMode","AutoShadowMode","AutoFoodMode","AutoStunMode","AutoDefenseMode",},{"AutoBuffMode","AutoSambaMode","Weapons","OffenseMode","WeaponskillMode","IdleMode","Passive","RuneElement","TreasureMode",}) 79 | end 80 | 81 | ------------------------------------------------------------------------------------------------------------------- 82 | -- Job-specific hooks for standard casting events. 83 | ------------------------------------------------------------------------------------------------------------------- 84 | -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done. 85 | -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast. 86 | 87 | function job_filtered_action(spell, eventArgs) 88 | if spell.type == 'WeaponSkill' then 89 | local available_ws = S(windower.ffxi.get_abilities().weapon_skills) 90 | -- WS 112 is Double Thrust, meaning a Spear is equipped. 91 | if available_ws:contains(32) then 92 | if spell.english == "Rudra's Storm" then 93 | windower.chat.input('/ws "Savage Blade" '..spell.target.raw) 94 | cancel_spell() 95 | eventArgs.cancel = true 96 | end 97 | end 98 | end 99 | end 100 | 101 | function job_pretarget(spell, spellMap, eventArgs) 102 | 103 | end 104 | 105 | function job_precast(spell, spellMap, eventArgs) 106 | 107 | end 108 | 109 | function job_post_precast(spell, spellMap, eventArgs) 110 | 111 | if spell.type == 'WeaponSkill' then 112 | if (spell.english == 'Aeolian Edge' or spell.english == 'Cyclone') and state.TreasureMode.value ~= 'None' then 113 | equip(sets.TreasureHunter) 114 | return 115 | end 116 | 117 | local WSset = standardize_set(get_precast_set(spell, spellMap)) 118 | local wsacc = check_ws_acc() 119 | 120 | if (WSset.ear1 == "Moonshade Earring" or WSset.ear2 == "Moonshade Earring") then 121 | -- Replace Moonshade Earring if we're at cap TP 122 | if get_effective_player_tp(spell, WSset) > 3200 then 123 | if wsacc:contains('Acc') and not state.Buff['Sneak Attack'] and not state.Buff['Trick Attack'] and sets.AccMaxTP then 124 | equip(sets.AccMaxTP[spell.english] or sets.AccMaxTP) 125 | elseif sets.MaxTP then 126 | equip(sets.MaxTP[spell.english] or sets.MaxTP) 127 | else 128 | end 129 | end 130 | end 131 | 132 | if state.AmbushMode.value == true and sets.Ambush then 133 | if state.Buff['Sneak Attack'] == false and state.Buff['Trick Attack'] == false then 134 | equip(sets.Ambush) 135 | end 136 | end 137 | end 138 | 139 | if spell.english == 'Sneak Attack' or spell.english == 'Trick Attack' or spell.type == 'WeaponSkill' then 140 | if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then 141 | equip(sets.TreasureHunter) 142 | end 143 | end 144 | 145 | end 146 | 147 | function job_post_midcast(spell, spellMap, eventArgs) 148 | if state.TreasureMode.value ~= 'None' and spell.action_type == 'Ranged Attack' then 149 | equip(sets.TreasureHunter) 150 | end 151 | end 152 | 153 | -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done. 154 | function job_aftercast(spell, spellMap, eventArgs) 155 | -- Weaponskills wipe SATA/Feint. Turn those state vars off before default gearing is attempted. 156 | if spell.type == 'WeaponSkill' and not spell.interrupted then 157 | state.Buff['Sneak Attack'] = false 158 | state.Buff['Trick Attack'] = false 159 | state.Buff['Feint'] = false 160 | end 161 | end 162 | 163 | -- Called after the default aftercast handling is complete. 164 | function job_post_aftercast(spell, spellMap, eventArgs) 165 | -- If Feint is active, put that gear set on on top of regular gear. 166 | -- This includes overlaying SATA gear. 167 | have_buff('Feint', eventArgs) 168 | end 169 | 170 | ------------------------------------------------------------------------------------------------------------------- 171 | -- Job-specific hooks for non-casting events. 172 | ------------------------------------------------------------------------------------------------------------------- 173 | 174 | -- Called when a player gains or loses a buff. 175 | -- buff == buff gained or lost 176 | -- gain == true if the buff was gained, false if it was lost. 177 | function job_buff_change(buff, gain) 178 | update_melee_groups() 179 | end 180 | 181 | 182 | ------------------------------------------------------------------------------------------------------------------- 183 | -- User code that supplements standard library decisions. 184 | ------------------------------------------------------------------------------------------------------------------- 185 | 186 | function get_custom_wsmode(spell, spellMap, defaut_wsmode) 187 | local wsmode 188 | 189 | if state.Buff['Sneak Attack'] then 190 | wsmode = 'SA' 191 | end 192 | if state.Buff['Trick Attack'] then 193 | wsmode = (wsmode or '') .. 'TA' 194 | end 195 | 196 | return wsmode 197 | end 198 | 199 | 200 | -- Called any time we attempt to handle automatic gear equips (ie: engaged or idle gear). 201 | function job_handle_equipping_gear(playerStatus, eventArgs) 202 | -- Check for SATA when equipping gear. If either is active, equip 203 | -- that gear specifically, and block equipping default gear. 204 | have_buff('Sneak Attack', eventArgs) 205 | have_buff('Trick Attack', eventArgs) 206 | end 207 | 208 | 209 | function job_customize_idle_set(idleSet) 210 | return idleSet 211 | end 212 | 213 | -- Modify the default melee set after it was constructed. 214 | function job_customize_melee_set(meleeSet) 215 | 216 | if state.AmbushMode.value == true then 217 | meleeSet = set_combine(meleeSet, sets.Ambush) 218 | end 219 | 220 | if state.TreasureMode.value == 'Fulltime' then 221 | meleeSet = set_combine(meleeSet, sets.TreasureHunter) 222 | end 223 | 224 | return meleeSet 225 | end 226 | 227 | function job_self_command(commandArgs, eventArgs) 228 | 229 | end 230 | 231 | function job_tick() 232 | if check_buff() then return true end 233 | return false 234 | end 235 | 236 | -- Called by the 'update' self-command. 237 | function job_update(cmdParams, eventArgs) 238 | th_update(cmdParams, eventArgs) 239 | update_melee_groups() 240 | end 241 | 242 | -- Function to display the current relevant user state when doing an update. 243 | -- Return true if display was handled, and you don't want the default info shown. 244 | function display_current_job_state(eventArgs) 245 | local msg = 'Melee' 246 | 247 | if state.CombatForm.has_value then 248 | msg = msg .. ' (' .. state.CombatForm.value .. ')' 249 | end 250 | 251 | msg = msg .. ': ' 252 | 253 | msg = msg .. state.OffenseMode.value 254 | if state.HybridMode.value ~= 'Normal' then 255 | msg = msg .. '/' .. state.HybridMode.value 256 | end 257 | msg = msg .. ', WS: ' .. state.WeaponskillMode.value 258 | 259 | if state.DefenseMode.value ~= 'None' then 260 | msg = msg .. ', ' .. 'Defense: ' .. state.DefenseMode.value .. ' (' .. state[state.DefenseMode.value .. 'DefenseMode'].value .. ')' 261 | end 262 | 263 | if state.Kiting.value == true then 264 | msg = msg .. ', Kiting' 265 | end 266 | 267 | if state.PCTargetMode.value ~= 'default' then 268 | msg = msg .. ', Target PC: '..state.PCTargetMode.value 269 | end 270 | 271 | if state.SelectNPCTargets.value == true then 272 | msg = msg .. ', Target NPCs' 273 | end 274 | 275 | msg = msg .. ', TH: ' .. state.TreasureMode.value 276 | 277 | add_to_chat(122, msg) 278 | 279 | eventArgs.handled = true 280 | end 281 | 282 | ------------------------------------------------------------------------------------------------------------------- 283 | -- Utility functions specific to this job. 284 | ------------------------------------------------------------------------------------------------------------------- 285 | 286 | function check_buff() 287 | if state.AutoBuffMode.value ~= 'Off' and not data.areas.cities:contains(world.area) then 288 | if player.in_combat and player.sub_job == 'WAR' then 289 | local abil_recasts = windower.ffxi.get_ability_recasts() 290 | 291 | if not buffactive.Berserk and abil_recasts[1] < latency then 292 | windower.chat.input('/ja "Berserk" ') 293 | tickdelay = os.clock() + 1.1 294 | return true 295 | elseif not buffactive.Aggressor and abil_recasts[4] < latency then 296 | windower.chat.input('/ja "Aggressor" ') 297 | tickdelay = os.clock() + 1.1 298 | return true 299 | end 300 | end 301 | 302 | else 303 | return false 304 | end 305 | end 306 | 307 | -- State buff checks that will equip buff gear and mark the event as handled. 308 | function have_buff(buff_name, eventArgs) 309 | if state.Buff[buff_name] then 310 | equip(sets.buff[buff_name] or {}) 311 | if state.TreasureMode.value == 'SATA' or state.TreasureMode.value == 'Fulltime' then 312 | equip(sets.TreasureHunter) 313 | end 314 | eventArgs.handled = true 315 | end 316 | end 317 | 318 | function update_melee_groups() 319 | if player.equipment.main then 320 | classes.CustomMeleeGroups:clear() 321 | 322 | if player.equipment.main == "Vajra" and state.Buff['Aftermath: Lv.3'] then 323 | classes.CustomMeleeGroups:append('AM') 324 | end 325 | end 326 | end -------------------------------------------------------------------------------- /data/WAR.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 3 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 4 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 5 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 6 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 7 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 8 | -- 9 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 10 | -- 11 | -- Editing this file will cause you to be unable to use Github Desktop to update! 12 | -- 13 | -- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and 14 | -- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first. 15 | -- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence. 16 | -- 17 | -- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing 18 | -- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important 19 | -- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead. 20 | -- 21 | -- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example. 22 | -- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there. 23 | -- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs) 24 | -- 25 | -- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them: 26 | -- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what. 27 | -- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character. 28 | -- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character. 29 | -- 30 | -- 31 | -- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ 32 | -- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium. 33 | -- 34 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 35 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 36 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 37 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 38 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 39 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 40 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 41 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 42 | ------------------------------------------------------------------------------------------------------------------- 43 | -- Setup functions for this job. Generally should not be modified. 44 | ------------------------------------------------------------------------------------------------------------------- 45 | 46 | -- Initialization function for this job file. 47 | function get_sets() 48 | -- Load and initialize the include file. 49 | include('Sel-Include.lua') 50 | end 51 | 52 | -- Setup vars that are user-independent. 53 | function job_setup() 54 | 55 | state.Buff['Brazen Rush'] = buffactive['Brazen Rush'] or false 56 | state.Buff["Warrior's Charge"] = buffactive["Warrior's Charge"] or false 57 | state.Buff['Mighty Strikes'] = buffactive['Mighty Strikes'] or false 58 | state.Buff.Retaliation = buffactive['Retaliation'] or false 59 | state.Buff.Restraint = buffactive['Restraint'] or false 60 | state.Buff['Aftermath'] = buffactive['Aftermath'] or false 61 | state.Buff['Aftermath: Lv.3'] = buffactive['Aftermath: Lv.3'] or false 62 | state.Buff.Hasso = buffactive.Hasso or false 63 | state.Buff.Seigan = buffactive.Seigan or false 64 | state.Stance = M{['description']='Stance','Hasso','Seigan','None'} 65 | 66 | autows = "Ukko's Fury" 67 | autofood = 'Soy Ramen' 68 | 69 | init_job_states({"Capacity","AutoRuneMode","AutoTrustMode","AutoWSMode","AutoShadowMode","AutoFoodMode","AutoStunMode","AutoDefenseMode",},{"AutoBuffMode","AutoSambaMode","Weapons","OffenseMode","WeaponskillMode","Stance","IdleMode","Passive","RuneElement","TreasureMode",}) 70 | end 71 | 72 | ------------------------------------------------------------------------------------------------------------------- 73 | -- Job-specific hooks for standard casting events. 74 | ------------------------------------------------------------------------------------------------------------------- 75 | -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done. 76 | -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast. 77 | 78 | function job_filtered_action(spell, eventArgs) 79 | if spell.type == 'WeaponSkill' then 80 | local available_ws = S(windower.ffxi.get_abilities().weapon_skills) 81 | -- WS 112 is Double Thrust, meaning a Spear is equipped. 82 | if available_ws:contains(48) then 83 | if spell.english == "Upheaval" then 84 | windower.chat.input('/ws "Resolution" '..spell.target.raw) 85 | cancel_spell() 86 | eventArgs.cancel = true 87 | elseif spell.english == "Ukko's Fury" then 88 | send_command('@input /ws "Ground Strike" '..spell.target.raw) 89 | cancel_spell() 90 | eventArgs.cancel = true 91 | end 92 | end 93 | end 94 | end 95 | 96 | function job_precast(spell, spellMap, eventArgs) 97 | if spell.type == 'WeaponSkill' and state.AutoBuffMode.value ~= 'Off' then 98 | local abil_recasts = windower.ffxi.get_ability_recasts() 99 | if player.tp < 2250 and not buffactive['Blood Rage'] and abil_recasts[2] < latency then 100 | eventArgs.cancel = true 101 | windower.chat.input('/ja "Warcry" ') 102 | windower.chat.input:schedule(1,'/ws "'..spell.english..'" '..spell.target.raw..'') 103 | tickdelay = os.clock() + 1.25 104 | return 105 | elseif state.Buff['SJ Restriction'] then 106 | return 107 | elseif player.sub_job == 'SAM' and player.tp > 1850 and abil_recasts[140] < latency then 108 | eventArgs.cancel = true 109 | windower.chat.input('/ja "Sekkanoki" ') 110 | windower.chat.input:schedule(1,'/ws "'..spell.english..'" '..spell.target.raw..'') 111 | tickdelay = os.clock() + 1.25 112 | return 113 | elseif player.sub_job == 'SAM' and abil_recasts[134] < latency then 114 | eventArgs.cancel = true 115 | windower.chat.input('/ja "Meditate" ') 116 | windower.chat.input:schedule(1,'/ws "'..spell.english..'" '..spell.target.raw..'') 117 | tickdelay = os.clock() + 1.25 118 | return 119 | end 120 | end 121 | end 122 | 123 | -- Modify the default melee set after it was constructed. 124 | function job_customize_melee_set(meleeSet) 125 | 126 | if not state.OffenseMode.value:contains('Acc') and state.HybridMode.value == 'Normal' and buffactive['Retaliation'] then 127 | meleeSet = set_combine(meleeSet, sets.buff.Retaliation) 128 | end 129 | 130 | if not state.OffenseMode.value:contains('Acc') and state.HybridMode.value == 'Normal' and buffactive['Restraint'] then 131 | meleeSet = set_combine(meleeSet, sets.buff.Restraint) 132 | end 133 | 134 | return meleeSet 135 | end 136 | 137 | -- Run after the general precast() is done. 138 | function job_post_precast(spell, spellMap, eventArgs) 139 | if spell.type == 'WeaponSkill' then 140 | 141 | local WSset = standardize_set(get_precast_set(spell, spellMap)) 142 | local wsacc = check_ws_acc() 143 | 144 | if (WSset.ear1 == "Moonshade Earring" or WSset.ear2 == "Moonshade Earring") then 145 | -- Replace Moonshade Earring if we're at cap TP 146 | if get_effective_player_tp(spell, WSset) > 3200 then 147 | if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and sets.AccMaxTP then 148 | local AccMaxTPset = standardize_set(sets.AccMaxTP) 149 | 150 | if (AccMaxTPset.ear1:startswith("Lugra Earring") or AccMaxTPset.ear2:startswith("Lugra Earring")) and not classes.DuskToDawn and sets.AccDayMaxTPWSEars then 151 | equip(sets.AccDayMaxTPWSEars[spell.english] or sets.AccDayMaxTPWSEars) 152 | else 153 | equip(sets.AccMaxTP[spell.english] or sets.AccMaxTP) 154 | end 155 | elseif sets.MaxTP then 156 | local MaxTPset = standardize_set(sets.MaxTP) 157 | if (MaxTPset.ear1:startswith("Lugra Earring") or MaxTPset.ear2:startswith("Lugra Earring")) and not classes.DuskToDawn and sets.DayMaxTPWSEars then 158 | equip(sets.DayMaxTPWSEars[spell.english] or sets.DayMaxTPWSEars) 159 | else 160 | equip(sets.MaxTP[spell.english] or sets.MaxTP) 161 | end 162 | else 163 | end 164 | else 165 | if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and (WSset.ear1:startswith("Lugra Earring") or WSset.ear2:startswith("Lugra Earring")) and not classes.DuskToDawn and sets.AccDayWSEars then 166 | equip(sets.AccDayWSEars[spell.english] or sets.AccDayWSEars) 167 | elseif (WSset.ear1:startswith("Lugra Earring") or WSset.ear2:startswith("Lugra Earring")) and not classes.DuskToDawn and sets.DayWSEars then 168 | equip(sets.DayWSEars[spell.english] or sets.DayWSEars) 169 | end 170 | end 171 | elseif (WSset.ear1:startswith("Lugra Earring") or WSset.ear2:startswith("Lugra Earring")) and not classes.DuskToDawn then 172 | if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and sets.AccDayWSEars then 173 | equip(sets.AccDayWSEars[spell.english] or sets.AccDayWSEars) 174 | elseif sets.DayWSEars then 175 | equip(sets.DayWSEars[spell.english] or sets.DayWSEars) 176 | end 177 | end 178 | 179 | if wsacc:contains('Acc') and not buffactive['Sneak Attack'] then 180 | if state.Buff.Charge and state.Buff['Mighty Strikes'] and sets.ACCWSMightyCharge then 181 | equip(sets.ACCWSMightyCharge) 182 | elseif state.Buff.Charge and sets.ACCWSCharge then 183 | equip(sets.ACCWSCharge) 184 | elseif state.Buff['Mighty Strikes'] and sets.ACCWSMighty then 185 | equip(sets.AccWSMighty) 186 | end 187 | else 188 | if state.Buff.Charge and state.Buff['Mighty Strikes'] and sets.WSMightyCharge then 189 | equip(sets.WSMightyCharge) 190 | elseif state.Buff.Charge and sets.WSCharge then 191 | equip(sets.WSCharge) 192 | elseif state.Buff['Mighty Strikes'] and sets.WSMighty then 193 | equip(sets.WSMighty) 194 | end 195 | end 196 | 197 | end 198 | 199 | end 200 | 201 | function job_tick() 202 | if check_hasso() then return true end 203 | if check_buff() then return true end 204 | return false 205 | end 206 | 207 | -- Called by the 'update' self-command. 208 | function job_update(cmdParams, eventArgs) 209 | update_melee_groups() 210 | 211 | if player.sub_job ~= 'SAM' and state.Stance.value ~= "None" then 212 | state.Stance:set("None") 213 | end 214 | end 215 | 216 | function job_aftercast(spell, spellMap, eventArgs) 217 | if not spell.interrupted then 218 | if spell.english == 'Warcry' then 219 | lastwarcry = player.name 220 | end 221 | end 222 | end 223 | 224 | function job_buff_change(buff, gain) 225 | if buff == 'Warcry' then 226 | if gain and windower.ffxi.get_ability_recasts()[2] > 297 then 227 | lastwarcry = player.name 228 | else 229 | lastwarcry = '' 230 | end 231 | end 232 | update_melee_groups() 233 | end 234 | 235 | function update_melee_groups() 236 | if player then 237 | classes.CustomMeleeGroups:clear() 238 | 239 | if data.areas.adoulin:contains(world.area) and buffactive.Ionis then 240 | classes.CustomMeleeGroups:append('Adoulin') 241 | end 242 | 243 | if state.Buff['Brazen Rush'] or state.Buff["Warrior's Charge"] then 244 | classes.CustomMeleeGroups:append('Charge') 245 | end 246 | 247 | if state.Buff['Mighty Strikes'] then 248 | classes.CustomMeleeGroups:append('Mighty') 249 | end 250 | 251 | if (player.equipment.main == "Conqueror" and buffactive['Aftermath: Lv.3']) or ((player.equipment.main == "Bravura" or player.equipment.main == "Ragnarok") and state.Buff['Aftermath']) then 252 | classes.CustomMeleeGroups:append('AM') 253 | end 254 | end 255 | end 256 | 257 | function check_hasso() 258 | if player.sub_job == 'SAM' and player.status == 'Engaged' and not (state.Stance.value == 'None' or state.Buff.Hasso or state.Buff.Seigan or state.Buff['SJ Restriction'] or main_weapon_is_one_handed() or silent_check_amnesia()) then 259 | 260 | local abil_recasts = windower.ffxi.get_ability_recasts() 261 | 262 | if state.Stance.value == 'Hasso' and abil_recasts[138] < latency then 263 | windower.chat.input('/ja "Hasso" ') 264 | tickdelay = os.clock() + 1.1 265 | return true 266 | elseif state.Stance.value == 'Seigan' and abil_recasts[139] < latency then 267 | windower.chat.input('/ja "Seigan" ') 268 | tickdelay = os.clock() + 1.1 269 | return true 270 | else 271 | return false 272 | end 273 | end 274 | 275 | return false 276 | end 277 | 278 | function check_buff() 279 | if state.AutoBuffMode.value ~= 'Off' and player.in_combat then 280 | 281 | local abil_recasts = windower.ffxi.get_ability_recasts() 282 | 283 | if not buffactive.Retaliation and abil_recasts[8] < latency then 284 | windower.chat.input('/ja "Retaliation" ') 285 | tickdelay = os.clock() + 1.1 286 | return true 287 | elseif not buffactive.Restraint and abil_recasts[9] < latency then 288 | windower.chat.input('/ja "Restraint" ') 289 | tickdelay = os.clock() + 1.1 290 | return true 291 | elseif not buffactive['Blood Rage'] and abil_recasts[11] < latency then 292 | windower.chat.input('/ja "Blood Rage" ') 293 | tickdelay = os.clock() + 1.1 294 | return true 295 | elseif not buffactive.Berserk and abil_recasts[1] < latency then 296 | windower.chat.input('/ja "Berserk" ') 297 | tickdelay = os.clock() + 1.1 298 | return true 299 | elseif not buffactive.Aggressor and abil_recasts[4] < latency then 300 | windower.chat.input('/ja "Aggressor" ') 301 | tickdelay = os.clock() + 1.1 302 | return true 303 | else 304 | return false 305 | end 306 | end 307 | 308 | return false 309 | end -------------------------------------------------------------------------------- /data/MNK.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 3 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 4 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 5 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 6 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 7 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 8 | -- 9 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 10 | -- 11 | -- Editing this file will cause you to be unable to use Github Desktop to update! 12 | -- 13 | -- Any changes you wish to make in this file you should be able to make by overloading. That is Re-Defining the same variables or functions in another file, by copying and 14 | -- pasting them to a file that is loaded after the original file, all of my library files, and then job files are loaded first. 15 | -- The last files to load are the ones unique to you. User-Globals, Charactername-Globals, Charactername_Job_Gear, in that order, so these changes will take precedence. 16 | -- 17 | -- You may wish to "hook" into existing functions, to add functionality without losing access to updates or fixes I make, for example, instead of copying and editing 18 | -- status_change(), you can instead use the function user_status_change() in the same manner, which is called by status_change() if it exists, most of the important 19 | -- gearswap functions work like this in my files, and if it's unique to a specific job, user_job_status_change() would be appropriate instead. 20 | -- 21 | -- Variables and tables can be easily redefined just by defining them in one of the later loaded files: autofood = 'Miso Ramen' for example. 22 | -- States can be redefined as well: state.HybridMode:options('Normal','PDT') though most of these are already redefined in the gear files for editing there. 23 | -- Commands can be added easily with: user_self_command(commandArgs, eventArgs) or user_job_self_command(commandArgs, eventArgs) 24 | -- 25 | -- If you're not sure where is appropriate to copy and paste variables, tables and functions to make changes or add them: 26 | -- User-Globals.lua - This file loads with all characters, all jobs, so it's ideal for settings and rules you want to be the same no matter what. 27 | -- Charactername-Globals.lua - This file loads with one character, all jobs, so it's ideal for gear settings that are usable on all jobs, but unique to this character. 28 | -- Charactername_Job_Gear.lua- This file loads only on one character, one job, so it's ideal for things that are specific only to that job and character. 29 | -- 30 | -- 31 | -- If you still need help, feel free to contact me on discord or ask in my chat for help: https://discord.gg/ug6xtvQ 32 | -- !Please do NOT message me in game about anything third party related, though you're welcome to message me there and ask me to talk on another medium. 33 | -- 34 | -- Please do not edit this file! Please do not edit this file! Please do not edit this file! 35 | -- __________.__ ________ __ .__.__ __ __ .__ .__ _____.__.__ 36 | -- \______ | | ____ _____ ______ ____ \______ \ ____ ____ _____/ |_ ____ __| _|___/ |_ _/ |_| |__ |__| ______ _/ ____|__| | ____ 37 | -- | ___| | _/ __ \\__ \ / ____/ __ \ | | \ / _ \ / \ / _ \ __\ _/ __ \ / __ || \ __\ \ __| | \| |/ ___/ \ __\| | | _/ __ \ 38 | -- | | | |_\ ___/ / __ \_\___ \\ ___/ | ` ( <_> ) | | ( <_> | | \ ___// /_/ || || | | | | Y | |\___ \ | | | | |_\ ___/ 39 | -- |____| |____/\___ (____ /____ >\___ > /_______ /\____/ |___| /\____/|__| \___ \____ ||__||__| |__| |___| |__/____ > |__| |__|____/\___ > /\ 40 | -- \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 41 | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 42 | ------------------------------------------------------------------------------------------------------------------- 43 | -- Setup functions for this job. Generally should not be modified. 44 | ------------------------------------------------------------------------------------------------------------------- 45 | 46 | -- Initialization function for this job file. 47 | function get_sets() 48 | -- Load and initialize the include file. 49 | include('Sel-Include.lua') 50 | end 51 | 52 | 53 | -- Setup vars that are user-independent. state.Buff vars initialized here will automatically be tracked. 54 | function job_setup() 55 | 56 | state.Buff['Aftermath: Lv.3'] = buffactive['Aftermath: Lv.3'] or false 57 | state.Buff['Hundred Fists'] = buffactive['Hundred Fists'] or false 58 | state.Buff['Impetus'] = buffactive['Impetus'] or false 59 | state.Buff['Footwork'] = buffactive['Footwork'] or false 60 | state.Buff['Boost'] = buffactive['Boost'] or false 61 | 62 | state.AutoBoost = M(false, 'Auto Boost Mode') 63 | 64 | autows = 'Victory Smite' 65 | autofood = 'Soy Ramen' 66 | 67 | info.impetus_hit_count = 0 68 | --windower.raw_register_event('action', on_action_for_impetus) 69 | update_melee_groups() 70 | init_job_states({"Capacity","AutoRuneMode","AutoTrustMode","AutoWSMode","AutoShadowMode","AutoFoodMode","AutoStunMode","AutoDefenseMode",},{"AutoBuffMode","AutoSambaMode","Weapons","OffenseMode","WeaponskillMode","IdleMode","Passive","RuneElement","TreasureMode",}) 71 | end 72 | 73 | ------------------------------------------------------------------------------------------------------------------- 74 | -- Job-specific hooks for standard casting events. 75 | ------------------------------------------------------------------------------------------------------------------- 76 | -- Set eventArgs.handled to true if we don't want any automatic gear equipping to be done. 77 | -- Set eventArgs.useMidcastGear to true if we want midcast gear equipped on precast. 78 | 79 | function job_filtered_action(spell, eventArgs) 80 | 81 | end 82 | 83 | function job_pretarget(spell, spellMap, eventArgs) 84 | 85 | end 86 | 87 | function job_precast(spell, spellMap, eventArgs) 88 | if spell.type == 'WeaponSkill' and (state.AutoBoost.value or state.AutoBuffMode.value ~= 'Off') then 89 | local abil_recasts = windower.ffxi.get_ability_recasts() 90 | if state.AutoBoost.value and player.sub_job == 'WAR' and abil_recasts[2] < latency then 91 | eventArgs.cancel = true 92 | windower.chat.input('/ja "Warcry" ') 93 | windower.chat.input:schedule(1,'/ws "'..spell.english..'" '..spell.target.raw..'') 94 | tickdelay = os.clock() + 1.25 95 | return 96 | elseif state.AutoBoost.value and abil_recasts[16] < latency then 97 | eventArgs.cancel = true 98 | windower.chat.input('/ja "Boost" ') 99 | windower.chat.input:schedule(2.5,'/ws "'..spell.english..'" '..spell.target.raw..'') 100 | tickdelay = os.clock() + 1.25 101 | return 102 | end 103 | end 104 | end 105 | 106 | -- Run after the general precast() is done. 107 | function job_post_precast(spell, spellMap, eventArgs) 108 | if spell.type == 'WeaponSkill' then 109 | local WSset = standardize_set(get_precast_set(spell, spellMap)) 110 | local wsacc = check_ws_acc() 111 | 112 | if (WSset.ear1 == "Moonshade Earring" or WSset.ear2 == "Moonshade Earring") then 113 | -- Replace Moonshade Earring if we're at cap TP 114 | if get_effective_player_tp(spell, WSset) > 3200 then 115 | if wsacc:contains('Acc') and not buffactive['Sneak Attack'] and sets.AccMaxTP then 116 | equip(sets.AccMaxTP[spell.english] or sets.AccMaxTP) 117 | elseif sets.MaxTP then 118 | equip(sets.MaxTP[spell.english] or sets.MaxTP) 119 | else 120 | end 121 | end 122 | end 123 | 124 | if state.Buff['Impetus'] and (spell.english == "Ascetic's Fury" or spell.english == "Victory Smite") then 125 | if sets.buff.ImpetusWS then 126 | equip(sets.buff.ImpetusWS) 127 | else 128 | equip(sets.buff.Impetus) 129 | end 130 | elseif buffactive.Footwork and (spell.english == "Dragon Kick" or spell.english == "Tornado Kick") then 131 | equip(sets.FootworkWS) 132 | end 133 | elseif spell.english == 'Boost' and not (player.in_combat or being_attacked or player.status == 'Engaged') and sets.precast.JA['Boost'].OutOfCombat then 134 | equip(sets.precast.JA['Boost'].OutOfCombat) 135 | end 136 | end 137 | 138 | function job_aftercast(spell, spellMap, eventArgs) 139 | 140 | end 141 | 142 | ------------------------------------------------------------------------------------------------------------------- 143 | -- Job-specific hooks for non-casting events. 144 | ------------------------------------------------------------------------------------------------------------------- 145 | 146 | -- Called when a player gains or loses a buff. 147 | -- buff == buff gained or lost 148 | -- gain == true if the buff was gained, false if it was lost. 149 | function job_buff_change(buff, gain) 150 | update_melee_groups() 151 | end 152 | 153 | ------------------------------------------------------------------------------------------------------------------- 154 | -- User code that supplements standard library decisions. 155 | ------------------------------------------------------------------------------------------------------------------- 156 | 157 | -- Modify the default melee set after it was constructed. 158 | function job_customize_melee_set(meleeSet) 159 | 160 | if state.OffenseMode.value ~= 'FullAcc' then 161 | if state.Buff['Impetus'] then 162 | meleeSet = set_combine(meleeSet, sets.buff.Impetus) 163 | end 164 | if buffactive.Footwork then 165 | meleeSet = set_combine(meleeSet, sets.buff.Footwork) 166 | end 167 | end 168 | 169 | if state.Buff['Boost'] then 170 | meleeSet = set_combine(meleeSet, sets.buff.Boost) 171 | end 172 | 173 | return meleeSet 174 | end 175 | 176 | function job_customize_defense_set(defenseSet) 177 | return defenseSet 178 | end 179 | 180 | function job_customize_idle_set(idleSet) 181 | if state.Buff['Boost'] and sets.buff.Boost then 182 | idleSet = set_combine(idleSet, sets.buff.Boost) 183 | end 184 | 185 | return idleSet 186 | end 187 | 188 | -- Called by the 'update' self-command. 189 | function job_update(cmdParams, eventArgs) 190 | update_melee_groups() 191 | end 192 | 193 | ------------------------------------------------------------------------------------------------------------------- 194 | -- Utility functions specific to this job. 195 | ------------------------------------------------------------------------------------------------------------------- 196 | 197 | ------------------------------------------------------------------------------------------------------------------- 198 | -- Custom event hooks. 199 | ------------------------------------------------------------------------------------------------------------------- 200 | 201 | --[[ Keep track of the current hit count while Impetus is up. 202 | function on_action_for_impetus(action) 203 | if state.Buff.Impetus then 204 | -- count melee hits by player 205 | if action.actor_id == player.id then 206 | if action.category == 1 then 207 | for _,target in pairs(action.targets) do 208 | for _,action in pairs(target.actions) do 209 | -- Reactions (bitset): 210 | -- 1 = evade 211 | -- 2 = parry 212 | -- 4 = block/guard 213 | -- 8 = hit 214 | -- 16 = JA/weaponskill? 215 | -- If action.reaction has bits 1 or 2 set, it missed or was parried. Reset count. 216 | if (action.reaction % 4) > 0 then 217 | info.impetus_hit_count = 0 218 | else 219 | info.impetus_hit_count = info.impetus_hit_count + 1 220 | end 221 | end 222 | end 223 | elseif action.category == 3 then 224 | -- Missed weaponskill hits will reset the counter. Can we tell? 225 | -- Reaction always seems to be 24 (what does this value mean? 8=hit, 16=?) 226 | -- Can't tell if any hits were missed, so have to assume all hit. 227 | -- Increment by the minimum number of weaponskill hits: 2. 228 | for _,target in pairs(action.targets) do 229 | for _,action in pairs(target.actions) do 230 | -- This will only be if the entire weaponskill missed or was parried. 231 | if (action.reaction % 4) > 0 then 232 | info.impetus_hit_count = 0 233 | else 234 | info.impetus_hit_count = info.impetus_hit_count + 2 235 | end 236 | end 237 | end 238 | end 239 | elseif action.actor_id ~= player.id and action.category == 1 then 240 | -- If mob hits the player, check for counters. 241 | for _,target in pairs(action.targets) do 242 | if target.id == player.id then 243 | for _,action in pairs(target.actions) do 244 | -- Spike effect animation: 245 | -- 63 = counter 246 | -- ?? = missed counter 247 | if action.has_spike_effect then 248 | -- spike_effect_message of 592 == missed counter 249 | if action.spike_effect_message == 592 then 250 | info.impetus_hit_count = 0 251 | elseif action.spike_effect_animation == 63 then 252 | info.impetus_hit_count = info.impetus_hit_count + 1 253 | end 254 | end 255 | end 256 | end 257 | end 258 | end 259 | 260 | --add_to_chat(123,'Current Impetus hit count = ' .. tostring(info.impetus_hit_count)) 261 | else 262 | info.impetus_hit_count = 0 263 | end 264 | 265 | end 266 | ]] 267 | 268 | function job_self_command(commandArgs, eventArgs) 269 | 270 | end 271 | 272 | function job_tick() 273 | if check_buff() then return true end 274 | return false 275 | end 276 | 277 | function check_buff() 278 | if state.AutoBuffMode.value ~= 'Off' and player.in_combat then 279 | local abil_recasts = windower.ffxi.get_ability_recasts() 280 | 281 | if player.hpp < 51 and abil_recasts[15] < latency then 282 | windower.chat.input('/ja "Chakra" ') 283 | tickdelay = os.clock() + 1.1 284 | return true 285 | elseif not buffactive.Impetus and abil_recasts[31] < latency then 286 | windower.chat.input('/ja "Impetus" ') 287 | tickdelay = os.clock() + 1.1 288 | return true 289 | elseif not (buffactive.Aggressor or buffactive.Focus) and abil_recasts[13] < latency then 290 | windower.chat.input('/ja "Focus" ') 291 | tickdelay = os.clock() + 1.1 292 | return true 293 | elseif player.sub_job == 'WAR' and not state.Buff['SJ Restriction'] then 294 | if not buffactive.Berserk and abil_recasts[1] < latency then 295 | windower.chat.input('/ja "Berserk" ') 296 | tickdelay = os.clock() + 1.1 297 | return true 298 | elseif not (buffactive.Aggressor or buffactive.Focus) and abil_recasts[4] < latency then 299 | windower.chat.input('/ja "Aggressor" ') 300 | tickdelay = os.clock() + 1.1 301 | return true 302 | else 303 | return false 304 | end 305 | end 306 | end 307 | 308 | return false 309 | end 310 | 311 | function update_melee_groups() 312 | classes.CustomMeleeGroups:clear() 313 | 314 | if buffactive.footwork and not buffactive['hundred fists'] then 315 | classes.CustomMeleeGroups:append('Footwork') 316 | end 317 | 318 | if player.equipment.main and player.equipment.main == "Glanzfaust" and state.Buff['Aftermath: Lv.3'] then 319 | classes.CustomMeleeGroups:append('AM') 320 | end 321 | 322 | if state.Buff['Hundred Fists'] then 323 | classes.CustomMeleeGroups:append('HF') 324 | end 325 | end -------------------------------------------------------------------------------- /libs/Modes.lua: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------------------------------------------- 2 | -- This include library allows use of specially-designed tables for tracking 3 | -- certain types of modes and state. 4 | -- 5 | -- Usage: include('Modes.lua') 6 | -- 7 | -- Construction syntax: 8 | -- 9 | -- 1) Create a new list of mode values. The first value will always be the default. 10 | -- MeleeMode = M{'Normal', 'Acc', 'Att'} -- Construct as a basic table, using braces. 11 | -- MeleeMode = M('Normal', 'Acc', 'Att') -- Pass in a list of strings, using parentheses. 12 | -- 13 | -- Optional: If constructed as a basic table, and the table contains a key value 14 | -- of 'description', that description will be saved for future reference. 15 | -- If a simple list of strings is passed in, no description will be set. 16 | -- 17 | -- MeleeMode = M{['description']='Melee Mode', 'Normal', 'Acc', 'Att'} 18 | -- 19 | -- 20 | -- 2) Create a boolean mode with a specified default value (note parentheses): 21 | -- UseLuzafRing = M(true) 22 | -- UseLuzafRing = M(false) 23 | -- 24 | -- Optional: A string may be provided that will be used as the mode description: 25 | -- UseLuzafRing = M(false, 'description') 26 | -- UseLuzafRing = M(true, 'description') 27 | -- 28 | -- 29 | -- 3) Create a string mode with a specified default value. Construct with a table: 30 | -- CombatWeapon = M{['description']='Melee Mode', ['string']='Dagger'} 31 | -- CombatWeapon = M{['description']='Melee Mode', ['string']=''} 32 | -- 33 | -- 34 | -- 35 | -- Public information fields (all are case-insensitive): 36 | -- 37 | -- 1) m.description -- Get a text description of the mode table, if it's been set. 38 | -- 2) m.current -- Gets the current mode text value. Booleans will return the strings "on" or "off". 39 | -- 3) m.value -- Gets the current mode value. Booleans will return the boolean values of true or false. 40 | -- 3) m.index -- Gets the current index value, or true/false for booleans. 41 | -- 42 | -- Typically use m.current when using the mode to create a set name, and m.value when 43 | -- testing the mode value in conditional rules. 44 | -- 45 | -- Public class functions: 46 | -- 47 | -- 1) m:describe(str) -- Sets the description for the mode table to the provided string value. 48 | -- 2) m:options(options) -- Redefine the options for a list mode table. Cannot be used on a boolean table. 49 | -- 50 | -- 51 | -- Public mode manipulation functions: 52 | -- 53 | -- 1) m:cycle() -- Cycles through the list going forwards. Acts as a toggle on boolean mode vars. 54 | -- 2) m:cycleback() -- Cycles through the list going backwards. Acts as a toggle on boolean mode vars. 55 | -- 3) m:toggle() -- Toggles a boolean Mode between true and false. 56 | -- 4) m:set(n) -- Sets the current mode value to n. 57 | -- Note: If m is boolean, n can be boolean true/false, or string of on/off/true/false. 58 | -- Note: If m is boolean and no n is given, this forces m to true. 59 | -- 5) m:unset() -- Sets a boolean mode var to false. 60 | -- 6) m:reset() -- Returns the mode var to its default state. 61 | -- 7) m:default() -- Same as reset() 62 | -- 63 | -- All public functions return the current value after completion. 64 | -- 65 | -- 66 | -- Example usage: 67 | -- 68 | -- sets.MeleeMode.Normal = {} 69 | -- sets.MeleeMode.Acc = {} 70 | -- sets.MeleeMode.Att = {} 71 | -- 72 | -- MeleeMode = M{'Normal', 'Acc', 'Att', ['description']='Melee Mode'} 73 | -- MeleeMode:cycle() 74 | -- equip(sets.engaged[MeleeMode.current]) 75 | -- MeleeMode:options('Normal', 'LowAcc', 'HighAcc') 76 | -- >> Changes the option list, but the description stays 'Melee Mode' 77 | -- 78 | -- 79 | -- sets.LuzafRing.on = {ring2="Luzaf's Ring"} 80 | -- sets.LuzafRing.off = {} 81 | -- 82 | -- UseLuzafRing = M(false) 83 | -- UseLuzafRing:toggle() 84 | -- equip(sets.precast['Phantom Roll'], sets.LuzafRing[UseLuzafRing.value]) 85 | ------------------------------------------------------------------------------------------------------------------- 86 | 87 | 88 | _meta = _meta or {} 89 | _meta.M = {} 90 | _meta.M.__class = 'mode' 91 | _meta.M.__methods = {} 92 | 93 | 94 | -- Default constructor for mode tables 95 | -- M{'a', 'b', etc, ['description']='a'} -- defines a mode list, description 'a' 96 | -- M('a', 'b', etc) -- defines a mode list, no description 97 | -- M('a') -- defines a mode list, default 'a' 98 | -- M{['description']='a'} -- defines a mode list, default 'Normal', description 'a' 99 | -- M{} -- defines a mode list, default 'Normal', no description 100 | -- M(false) -- defines a mode boolean, default false, no description 101 | -- M(true) -- defines a mode boolean, default true, no description 102 | -- M(false, 'a') -- defines a mode boolean, default false, description 'a' 103 | -- M(true, 'a') -- defines a mode boolean, default true, description 'a' 104 | -- M() -- defines a mode boolean, default false, no description 105 | function M(t, ...) 106 | local m = {} 107 | m._track = {} 108 | m._track._class = 'mode' 109 | 110 | -- If we're passed a list of strings (that is, the first element is a string), 111 | -- convert them to a table 112 | local args = {...} 113 | if type(t) == 'string' then 114 | t = {[1] = t} 115 | 116 | for ind, val in ipairs(args) do 117 | t[ind+1] = val 118 | end 119 | end 120 | 121 | -- Construct the table that we'll be adding the metadata to 122 | 123 | -- If we have a table of values, it's either a list or a string 124 | if type(t) == 'table' then 125 | -- Save the description, if provided 126 | if t['description'] then 127 | m._track._description = t['description'] 128 | end 129 | 130 | -- If we were given an explicit 'string' field, construct a string mode class. 131 | if t.string and type(t.string) == 'string' then 132 | m._track._type = 'string' 133 | m._track._count = 1 134 | m._track._default = 'defaultstring' 135 | 136 | if t.string then 137 | m['string'] = t.string 138 | m['defaultstring'] = t.string 139 | end 140 | -- Otherwise put together a standard list mode class. 141 | else 142 | m._track._type = 'list' 143 | m._track._invert = {} 144 | m._track._count = 0 145 | m._track._default = 1 146 | 147 | -- Only copy numerically indexed values 148 | for ind, val in ipairs(t) do 149 | m[ind] = val 150 | m._track._invert[val] = ind 151 | m._track._count = ind 152 | end 153 | 154 | if m._track._count == 0 then 155 | m[1] = 'Normal' 156 | m._track._invert['Normal'] = 1 157 | m._track._count = 1 158 | end 159 | end 160 | -- If the first argument is a bool, construct a boolean mode class. 161 | elseif type(t) == 'boolean' or t == nil then 162 | m._track._type = 'boolean' 163 | m._track._count = 2 164 | m._track._default = t or false 165 | m._track._description = args[1] 166 | -- Text lookups for bool values 167 | m[true] = 'on' 168 | m[false] = 'off' 169 | else 170 | -- Construction failure 171 | error("Unable to construct a mode table with the provided parameters.", 2) 172 | end 173 | 174 | -- Initialize current value to the default. 175 | m._track._current = m._track._default 176 | 177 | return setmetatable(m, _meta.M) 178 | end 179 | 180 | -------------------------------------------------------------------------- 181 | -- Metamethods 182 | -- Functions that will be used as metamethods for the class 183 | -------------------------------------------------------------------------- 184 | 185 | -- Handler for __index when trying to access the current mode value. 186 | -- Handles indexing 'current' or 'value' keys. 187 | _meta.M.__index = function(m, k) 188 | if type(k) == 'string' then 189 | local lk = k:lower() 190 | if lk == 'current' then 191 | return m[m._track._current] 192 | elseif lk == 'value' then 193 | if m._track._type == 'boolean' then 194 | return m._track._current 195 | else 196 | return m[m._track._current] 197 | end 198 | elseif lk == 'has_value' then 199 | return _meta.M.__methods.f_has_value(m) 200 | elseif lk == 'default' then 201 | if m._track._type == 'boolean' then 202 | return m._track._default 203 | else 204 | return m[m._track._default] 205 | end 206 | elseif lk == 'description' then 207 | return m._track._description 208 | elseif lk == 'index' then 209 | return m._track._current 210 | elseif m._track[lk] then 211 | return m._track[lk] 212 | elseif m._track['_'..lk] then 213 | return m._track['_'..lk] 214 | else 215 | return _meta.M.__methods[lk] 216 | end 217 | end 218 | end 219 | 220 | -- Tostring handler for printing out the table and its current state. 221 | _meta.M.__tostring = function(m) 222 | local res = '' 223 | if m._track._description then 224 | res = res .. m._track._description .. ': ' 225 | end 226 | 227 | if m._track._type == 'list' then 228 | res = res .. '{' 229 | for k,v in ipairs(m) do 230 | res = res..tostring(v) 231 | if m[k+1] ~= nil then 232 | res = res..', ' 233 | end 234 | end 235 | res = res..'}' 236 | elseif m._track._type == 'string' then 237 | res = res .. 'String' 238 | else 239 | res = res .. 'Boolean' 240 | end 241 | 242 | res = res .. ' ('..tostring(m.Current).. ')' 243 | 244 | -- Debug addition 245 | --res = res .. ' [' .. m._track._type .. '/' .. tostring(m._track._current) .. ']' 246 | 247 | return res 248 | end 249 | 250 | -- Length handler for the # value lookup. 251 | _meta.M.__len = function(m) 252 | return m._track._count 253 | end 254 | 255 | 256 | -------------------------------------------------------------------------- 257 | -- Public methods 258 | -- Functions that can be used as public methods for manipulating the class. 259 | -------------------------------------------------------------------------- 260 | 261 | -- Function to set the table's description. 262 | _meta.M.__methods['describe'] = function(m, str) 263 | if type(str) == 'string' then 264 | m._track._description = str 265 | else 266 | error("Invalid argument type: " .. type(str), 2) 267 | end 268 | end 269 | 270 | -- Function to change the list of options available. 271 | -- Leaves the description intact. 272 | -- Cannot be used on boolean classes. 273 | _meta.M.__methods['options'] = function(m, ...) 274 | if m._track._type ~= 'list' then 275 | error("Can only revise the options list for a list mode class.", 2) 276 | end 277 | 278 | local options = {...} 279 | -- Always include a default option if nothing else is given. 280 | if #options == 0 then 281 | options = {'Normal'} 282 | end 283 | 284 | -- Zero-out existing values and clear the tracked inverted list 285 | -- and member count. 286 | for key,val in ipairs(m) do 287 | m[key] = nil 288 | end 289 | m._track._invert = {} 290 | m._track._count = 0 291 | 292 | -- Insert in new data. 293 | for key,val in ipairs(options) do 294 | m[key] = val 295 | m._track._invert[val] = key 296 | m._track._count = key 297 | end 298 | 299 | m._track._current = m._track._default 300 | end 301 | 302 | 303 | -- Function to test whether the list table contains the specified value. 304 | _meta.M.__methods['contains'] = function(m, str) 305 | if m._track._invert then 306 | if type(str) == 'string' then 307 | return (m._track._invert[str] ~= nil) 308 | else 309 | error("Invalid argument type: " .. type(str), 2) 310 | end 311 | else 312 | error("Cannot test for containment on a " .. m._track._type .. " mode class.", 2) 313 | end 314 | end 315 | 316 | 317 | -------------------------------------------------------------------------- 318 | -- Public methods 319 | -- Functions that will be used as public methods for manipulating state. 320 | -------------------------------------------------------------------------- 321 | 322 | -- Cycle forwards through the list 323 | _meta.M.__methods['cycle'] = function(m) 324 | if m._track._type == 'list' then 325 | m._track._current = (m._track._current % m._track._count) + 1 326 | elseif m._track._type == 'boolean' then 327 | m:toggle() 328 | end 329 | 330 | return m.Current 331 | end 332 | 333 | -- Cycle backwards through the list 334 | _meta.M.__methods['cycleback'] = function(m) 335 | if m._track._type == 'list' then 336 | m._track._current = m._track._current - 1 337 | if m._track._current < 1 then 338 | m._track._current = m._track._count 339 | end 340 | elseif m._track._type == 'boolean' then 341 | m:toggle() 342 | end 343 | 344 | return m.Current 345 | end 346 | 347 | -- Toggle a boolean value 348 | _meta.M.__methods['toggle'] = function(m) 349 | if m._track._type == 'boolean' then 350 | m._track._current = not m._track._current 351 | elseif m._track._type == 'list' then 352 | m._track._current = (m._track._current % m._track._count) + 1 353 | end 354 | 355 | return m.Current 356 | end 357 | 358 | 359 | -- Set the current value 360 | _meta.M.__methods['set'] = function(m, val) 361 | if m._track._type == 'boolean' then 362 | if val == nil then 363 | m._track._current = true 364 | elseif type(val) == 'boolean' then 365 | m._track._current = val 366 | elseif type(val) == 'string' then 367 | val = val:lower() 368 | if val == 'on' or val == 'true' then 369 | m._track._current = true 370 | elseif val == 'off' or val == 'false' then 371 | m._track._current = false 372 | else 373 | error("Unrecognized value: "..tostring(val), 2) 374 | end 375 | else 376 | error("Unrecognized value type: "..type(val), 2) 377 | end 378 | elseif m._track._type == 'list' then 379 | if not val then 380 | error("List variable cannot be set to nil.", 2) 381 | end 382 | if m._track._invert[val] then 383 | m._track._current = m._track._invert[val] 384 | else 385 | local found = false 386 | for v, ind in pairs(m._track._invert) do 387 | if val:lower() == v:lower() then 388 | m._track._current = ind 389 | found = true 390 | break 391 | end 392 | end 393 | 394 | if not found then 395 | error("Unknown mode value: " .. tostring(val), 2) 396 | end 397 | end 398 | elseif m._track._type == 'string' then 399 | if type(val) == 'string' then 400 | m._track._current = 'string' 401 | m.string = val 402 | else 403 | error("Unrecognized value type: "..type(val), 2) 404 | end 405 | end 406 | 407 | return m.Current 408 | end 409 | 410 | 411 | -- Forces a boolean mode to false, or a string to an empty string. 412 | _meta.M.__methods['unset'] = function(m) 413 | if m._track._type == 'boolean' then 414 | m._track._current = false 415 | elseif m._track._type == 'string' then 416 | m._track._current = 'string' 417 | m.string = '' 418 | else 419 | error("Cannot unset a list mode class.", 2) 420 | end 421 | 422 | return m.Current 423 | end 424 | 425 | 426 | -- Reset to the default value 427 | _meta.M.__methods['reset'] = function(m) 428 | m._track._current = m._track._default 429 | 430 | return m.Current 431 | end 432 | 433 | 434 | -- Check to be sure that the mode var has a valid (for its type) value. 435 | -- String vars must be non-empty. 436 | -- List vars must not be empty strings, or the word 'none'. 437 | -- Boolean are always considered valid (can only be true or false). 438 | _meta.M.__methods['f_has_value'] = function(m) 439 | local cur = m.value 440 | if m._track._type == 'string' then 441 | if cur and cur ~= '' then 442 | return true 443 | else 444 | return false 445 | end 446 | elseif m._track._type == 'boolean' then 447 | return true 448 | else 449 | if not cur or cur == '' or cur:lower() == 'none' then 450 | return false 451 | else 452 | return true 453 | end 454 | end 455 | end 456 | 457 | 458 | -------------------------------------------------------------------------------- /data/Selindrile/Selindrile_Drk_Gear.lua: -------------------------------------------------------------------------------- 1 | function user_job_setup() 2 | -- Options: Override default values 3 | state.OffenseMode:options('Normal','SomeAcc','Acc','FullAcc','Fodder') 4 | state.WeaponskillMode:options('Match','Normal','SomeAcc','Acc','FullAcc','Fodder') 5 | state.HybridMode:options('Normal') 6 | state.PhysicalDefenseMode:options('PDT', 'PDTReraise') 7 | state.MagicalDefenseMode:options('MDT', 'MDTReraise') 8 | state.ResistDefenseMode:options('MEVA') 9 | state.IdleMode:options('Normal', 'PDT','Refresh','Reraise') 10 | state.Weapons:options('Montante','Anguta') 11 | state.ExtraMeleeMode = M{['description']='Extra Melee Mode','None'} 12 | state.Passive = M{['description'] = 'Passive Mode','None','MP','Twilight'} 13 | state.DrainSwapWeaponMode = M{'Always','Never','300','1000'} 14 | 15 | -- Additional local binds 16 | send_command('bind ^` input /ja "Hasso" ') 17 | send_command('bind !` input /ja "Seigan" ') 18 | send_command('bind @` gs c cycle SkillchainMode') 19 | 20 | select_default_macro_book() 21 | end 22 | 23 | -- Define sets and vars used by this job file. 24 | function init_gear_sets() 25 | -------------------------------------- 26 | -- Start defining the sets 27 | -------------------------------------- 28 | -- Precast Sets 29 | -- Precast sets to enhance JAs 30 | sets.precast.JA['Diabolic Eye'] = {} 31 | sets.precast.JA['Arcane Circle'] = {} 32 | sets.precast.JA['Souleater'] = {} 33 | sets.precast.JA['Weapon Bash'] = {} 34 | sets.precast.JA['Nether Void'] = {} 35 | sets.precast.JA['Blood Weapon'] = {} 36 | sets.precast.JA['Dark Seal'] = {} 37 | sets.precast.JA['Last Resort'] = {back="Ankou's Mantle"} 38 | 39 | -- Waltz set (chr and vit) 40 | sets.precast.Waltz = {} 41 | 42 | -- Don't need any special gear for Healing Waltz. 43 | sets.precast.Waltz['Healing Waltz'] = {} 44 | 45 | sets.precast.Step = {} 46 | 47 | sets.precast.Flourish1 = {} 48 | 49 | -- Fast cast sets for spells 50 | 51 | sets.precast.FC = {ammo="Impatiens", 52 | head="Carmine Mask +1",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Malignance Earring", 53 | body="Odyss. Chestplate",hands="Leyline Gloves",ring1="Lebeche Ring",ring2="Kishar Ring", 54 | back="Moonlight Cape",waist="Flume Belt +1",legs=gear.odyssean_fc_legs,feet="Odyssean Greaves"} 55 | 56 | sets.precast.FC.Impact = set_combine(sets.precast.FC, {head=empty,body="Twilight Cloak"}) 57 | 58 | -- Midcast Sets 59 | sets.midcast.FastRecast = {ammo="Staunch Tathlum +1", 60 | head="Carmine Mask +1",neck="Voltsurge Torque",ear1="Enchntr. Earring +1",ear2="Malignance Earring", 61 | body="Odyss. Chestplate",hands="Leyline Gloves",ring1="Lebeche Ring",ring2="Kishar Ring", 62 | back="Moonlight Cape",waist="Tempus Fugit",legs=gear.odyssean_fc_legs,feet="Odyssean Greaves"} 63 | 64 | -- Specific spells 65 | 66 | sets.midcast['Dark Magic'] = {ammo="Pemphredo Tathlum", 67 | head="Carmine Mask +1",neck="Erra Pendant",ear1="Digni. Earring",ear2="Malignance Earring", 68 | body="Flamma Korazin +2",hands="Flam. Manopolas +2",ring1="Stikini Ring +1",ring2="Stikini Ring +1", 69 | back="Toro Cape",waist="Eschan Stone",legs="Eschite Cuisses",feet="Flam. Gambieras +2"} 70 | 71 | sets.midcast['Enfeebling Magic'] = {ammo="Pemphredo Tathlum", 72 | head="Carmine Mask +1",neck="Erra Pendant",ear1="Digni. Earring",ear2="Malignance Earring", 73 | body="Flamma Korazin +2",hands="Flam. Manopolas +2",ring1="Stikini Ring +1",ring2="Stikini Ring +1", 74 | back="Toro Cape",waist="Eschan Stone",legs="Flamma Dirs +2",feet="Flam. Gambieras +2"} 75 | 76 | sets.midcast['Dread Spikes'] = set_combine(sets.midcast['Dark Magic'], {}) 77 | sets.midcast.Absorb = set_combine(sets.midcast['Dark Magic'], {back="Ankou's Mantle"}) 78 | 79 | sets.midcast.Stun = {ammo="Pemphredo Tathlum", 80 | head="Carmine Mask +1",neck="Erra Pendant",ear1="Digni. Earring",ear2="Malignance Earring", 81 | body="Flamma Korazin +2",hands="Flam. Manopolas +2",ring1="Stikini Ring +1",ring2="Stikini Ring +1", 82 | back="Toro Cape",waist="Eschan Stone",legs="Eschite Cuisses",feet="Flam. Gambieras +2"} 83 | 84 | sets.midcast.Drain = set_combine(sets.midcast['Dark Magic'], {ring1="Evanescence Ring",ring2="Archon Ring",back="Niht Mantle"}) 85 | 86 | sets.DrainWeapon = {main="Misanthropy",sub="Alber Strap"} 87 | 88 | --sets.AbsorbWeapon = {main="Liberator",sub="Khonsu",range="Ullr",ammo=empty} 89 | --sets.DreadWeapon = {main="Crepuscular Scythe",sub="Utu Grip",} 90 | 91 | sets.midcast.Aspir = sets.midcast.Drain 92 | 93 | sets.midcast.Impact = set_combine(sets.midcast['Dark Magic'], {head=empty,body="Twilight Cloak"}) 94 | 95 | sets.midcast.Cure = {} 96 | 97 | sets.Self_Healing = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"} 98 | sets.Cure_Received = {neck="Phalaina Locket",hands="Buremte Gloves",ring2="Kunaji Ring",waist="Gishdubar Sash"} 99 | sets.Self_Refresh = {waist="Gishdubar Sash"} 100 | 101 | -- Weaponskill sets 102 | -- Default set for any weaponskill that isn't any more specifically defined 103 | sets.precast.WS = {ammo="Knobkierrie", 104 | head="Flam. Zucchetto +2",neck="Fotia Gorget",ear1="Lugra Earring +1",ear2="Moonshade Earring", 105 | body=gear.valorous_wsd_body,hands="Sulev. Gauntlets +2",ring1="Regal Ring",ring2="Niqmaddu Ring", 106 | back="Ankou's Mantle",waist="Fotia Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 107 | 108 | sets.precast.WS.SomeAcc = set_combine(sets.precast.WS, {}) 109 | sets.precast.WS.Acc = set_combine(sets.precast.WS, {}) 110 | sets.precast.WS.FullAcc = set_combine(sets.precast.WS, {neck="Combatant's Torque"}) 111 | sets.precast.WS.Fodder = set_combine(sets.precast.WS, {}) 112 | 113 | -- Specific weaponskill sets. Uses the base set if an appropriate WSMod version isn't found. 114 | sets.precast.WS['Catastrophe'] = set_combine(sets.precast.WS, {}) 115 | sets.precast.WS['Catastrophe'].SomeAcc = set_combine(sets.precast.WS.SomeAcc, {}) 116 | sets.precast.WS['Catastrophe'].Acc = set_combine(sets.precast.WS.Acc, {}) 117 | sets.precast.WS['Catastrophe'].FullAcc = set_combine(sets.precast.WS.FullAcc, {}) 118 | sets.precast.WS['Catastrophe'].Fodder = set_combine(sets.precast.WS.Fodder, {}) 119 | 120 | sets.precast.WS['Torcleaver'] = set_combine(sets.precast.WS, {}) 121 | sets.precast.WS['Torcleaver'].SomeAcc = set_combine(sets.precast.WS.SomeAcc, {}) 122 | sets.precast.WS['Torcleaver'].Acc = set_combine(sets.precast.WS.Acc, {}) 123 | sets.precast.WS['Torcleaver'].FullAcc = set_combine(sets.precast.WS.FullAcc, {}) 124 | sets.precast.WS['Torcleaver'].Fodder = set_combine(sets.precast.WS.Fodder, {}) 125 | 126 | sets.precast.WS['Entropy'] = set_combine(sets.precast.WS, {}) 127 | sets.precast.WS['Entropy'].SomeAcc = set_combine(sets.precast.WS.SomeAcc, {}) 128 | sets.precast.WS['Entropy'].Acc = set_combine(sets.precast.WS.Acc, {}) 129 | sets.precast.WS['Entropy'].FullAcc = set_combine(sets.precast.WS.FullAcc, {}) 130 | sets.precast.WS['Entropy'].Fodder = set_combine(sets.precast.WS.Fodder, {}) 131 | 132 | sets.precast.WS['Resolution'] = set_combine(sets.precast.WS, {}) 133 | sets.precast.WS['Resolution'].SomeAcc = set_combine(sets.precast.WS.SomeAcc, {}) 134 | sets.precast.WS['Resolution'].Acc = set_combine(sets.precast.WS.Acc, {}) 135 | sets.precast.WS['Resolution'].FullAcc = set_combine(sets.precast.WS.FullAcc, {}) 136 | sets.precast.WS['Resolution'].Fodder = set_combine(sets.precast.WS.Fodder, {}) 137 | 138 | -- Sets to return to when not performing an action. 139 | 140 | -- Resting sets 141 | sets.resting = {} 142 | 143 | -- Swap to these on Moonshade using WS if at 3000 TP 144 | sets.MaxTP = {ear1="Lugra Earring +1",ear2="Lugra Earring",} 145 | sets.AccMaxTP = {ear1="Mache Earring +1",ear2="Telos Earring"} 146 | sets.AccDayMaxTPWSEars = {ear1="Mache Earring +1",ear2="Telos Earring"} 147 | sets.DayMaxTPWSEars = {ear1="Ishvara Earring",ear2="Brutal Earring",} 148 | sets.AccDayWSEars = {ear1="Mache Earring +1",ear2="Telos Earring"} 149 | sets.DayWSEars = {ear1="Brutal Earring",ear2="Moonshade Earring",} 150 | 151 | -- Idle sets 152 | 153 | sets.idle = {ammo="Staunch Tathlum +1", 154 | head="Jumalik Helm",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Ethereal Earring", 155 | body="Jumalik Mail",hands="Sulev. Gauntlets +2",ring1="Stikini Ring +1",ring2="Stikini Ring +1", 156 | back="Shadow Mantle",waist="Flume Belt +1",legs="Carmine Cuisses +1",feet="Amm Greaves"} 157 | 158 | sets.idle.PDT = {ammo="Staunch Tathlum +1", 159 | head="Jumalik Helm",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Ethereal Earring", 160 | body="Jumalik Mail",hands="Sulev. Gauntlets +2",ring1="Defending Ring",ring2="Dark Ring", 161 | back="Shadow Mantle",waist="Flume Belt +1",legs="Carmine Cuisses +1",feet="Amm Greaves"} 162 | 163 | sets.idle.Weak = set_combine(sets.idle, {head="Twilight Helm",body="Twilight Mail"}) 164 | 165 | sets.idle.Reraise = set_combine(sets.idle, {head="Twilight Helm",body="Twilight Mail"}) 166 | 167 | -- Defense sets 168 | sets.defense.PDT = {ammo="Staunch Tathlum +1", 169 | head="Loess Barbuta +1",neck="Loricate Torque +1",ear1="Genmei Earring",ear2="Ethereal Earring", 170 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Gelatinous Ring +1",ring2="Moonlight Ring", 171 | back="Shadow Mantle",waist="Flume Belt +1",legs="Sulev. Cuisses +2",feet="Amm Greaves"} 172 | 173 | sets.defense.PDTReraise = set_combine(sets.defense.PDT, {head="Twilight Helm",body="Twilight Mail"}) 174 | 175 | sets.defense.MDT = {ammo="Staunch Tathlum +1", 176 | head="Loess Barbuta +1",neck="Warder's Charm +1",ear1="Genmei Earring",ear2="Ethereal Earring", 177 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Gelatinous Ring +1",ring2="Moonlight Ring", 178 | back="Moonlight Cape",waist="Flume Belt +1",legs="Sulev. Cuisses +2",feet="Amm Greaves"} 179 | 180 | sets.defense.MDTReraise = set_combine(sets.defense.MDT, {head="Twilight Helm",body="Twilight Mail"}) 181 | 182 | sets.defense.MEVA = {ammo="Staunch Tathlum +1", 183 | head="Loess Barbuta +1",neck="Warder's Charm +1",ear1="Genmei Earring",ear2="Ethereal Earring", 184 | body="Tartarus Platemail",hands="Sulev. Gauntlets +2",ring1="Gelatinous Ring +1",ring2="Moonlight Ring", 185 | back="Moonlight Cape",waist="Flume Belt +1",legs="Sulev. Cuisses +2",feet="Amm Greaves"} 186 | 187 | sets.Kiting = {legs="Carmine Cuisses +1"} 188 | sets.passive.Reraise = {head="Twilight Helm",body="Twilight Mail"} 189 | sets.buff.Doom = set_combine(sets.buff.Doom, {}) 190 | sets.buff.Sleep = {head="Frenzy Sallet"} 191 | sets.buff['Dark Seal'] = {} --head="Fallen's Burgeonet +3" 192 | 193 | -- Engaged sets 194 | sets.engaged = {ammo="Aurgelmir Orb +1", 195 | head="Flam. Zucchetto +2",neck="Asperity Necklace",ear1="Brutal Earring",ear2="Cessance Earring", 196 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 197 | back="Ankou's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 198 | sets.engaged.SomeAcc = {ammo="Aurgelmir Orb +1", 199 | head="Flam. Zucchetto +2",neck="Combatant's Torque",ear1="Brutal Earring",ear2="Cessance Earring", 200 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Flamma Ring",ring2="Niqmaddu Ring", 201 | back="Ankou's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 202 | sets.engaged.Acc = {ammo="Aurgelmir Orb +1", 203 | head="Flam. Zucchetto +2",neck="Combatant's Torque",ear1="Digni. Earring",ear2="Telos Earring", 204 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Flamma Ring",ring2="Niqmaddu Ring", 205 | back="Ankou's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 206 | sets.engaged.FullAcc = {ammo="Aurgelmir Orb +1", 207 | head="Flam. Zucchetto +2",neck="Combatant's Torque",ear1="Mache Earring +1",ear2="Telos Earring", 208 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Flamma Ring",ring2="Ramuh Ring +1", 209 | back="Ankou's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 210 | sets.engaged.Fodder = {ammo="Aurgelmir Orb +1", 211 | head="Flam. Zucchetto +2",neck="Asperity Necklace",ear1="Brutal Earring",ear2="Sherida Earring", 212 | body=gear.valorous_wsd_body,hands=gear.valorous_acc_hands,ring1="Petrov Ring",ring2="Niqmaddu Ring", 213 | back="Ankou's Mantle",waist="Ioskeha Belt",legs="Sulev. Cuisses +2",feet="Flam. Gambieras +2"} 214 | --Example sets: 215 | --[[ 216 | sets.engaged.Adoulin = {} 217 | sets.engaged.SomeAcc.Adoulin = {} 218 | sets.engaged.Acc.Adoulin = {} 219 | sets.engaged.FullAcc.Adoulin = {} 220 | sets.engaged.Fodder.Adoulin = {} 221 | 222 | sets.engaged.PDT = {} 223 | sets.engaged.SomeAcc.PDT = {} 224 | sets.engaged.Acc.PDT = {} 225 | sets.engaged.FullAcc.PDT = {} 226 | sets.engaged.Fodder.PDT = {} 227 | 228 | sets.engaged.PDT.Adoulin = {} 229 | sets.engaged.SomeAcc.PDT.Adoulin = {} 230 | sets.engaged.Acc.PDT.Adoulin = {} 231 | sets.engaged.FullAcc.PDT.Adoulin = {} 232 | sets.engaged.Fodder.PDT.Adoulin = {} 233 | 234 | sets.engaged.MDT = {} 235 | sets.engaged.SomeAcc.MDT = {} 236 | sets.engaged.Acc.MDT = {} 237 | sets.engaged.FullAcc.MDT = {} 238 | sets.engaged.Fodder.MDT = {} 239 | 240 | sets.engaged.MDT.Adoulin = {} 241 | sets.engaged.SomeAcc.MDT.Adoulin = {} 242 | sets.engaged.Acc.MDT.Adoulin = {} 243 | sets.engaged.FullAcc.MDT.Adoulin = {} 244 | sets.engaged.Fodder.MDT.Adoulin = {} 245 | 246 | -- Variations for TP weapon and (optional) offense/defense modes. Code will fall back on previous 247 | -- sets if more refined versions aren't defined. 248 | -- If you create a set with both offense and defense modes, the offense mode should be first. 249 | -- EG: sets.engaged.Dagger.Accuracy.Evasion 250 | 251 | -- Liberator melee sets 252 | sets.engaged.Liberator = {} 253 | sets.engaged.Liberator.SomeAcc = {} 254 | sets.engaged.Liberator.Acc = {} 255 | sets.engaged.Liberator.FullAcc = {} 256 | sets.engaged.Liberator.Fodder = {} 257 | 258 | sets.engaged.Liberator.Adoulin = {} 259 | sets.engaged.Liberator.SomeAcc.Adoulin = {} 260 | sets.engaged.Liberator.Acc.Adoulin = {} 261 | sets.engaged.Liberator.FullAcc.Adoulin = {} 262 | sets.engaged.Liberator.Fodder.Adoulin = {} 263 | 264 | sets.engaged.Liberator.AM = {} 265 | sets.engaged.Liberator.SomeAcc.AM = {} 266 | sets.engaged.Liberator.Acc.AM = {} 267 | sets.engaged.Liberator.FullAcc.AM = {} 268 | sets.engaged.Liberator.Fodder.AM = {} 269 | 270 | sets.engaged.Liberator.Adoulin.AM = {} 271 | sets.engaged.Liberator.SomeAcc.Adoulin.AM = {} 272 | sets.engaged.Liberator.Acc.Adoulin.AM = {} 273 | sets.engaged.Liberator.FullAcc.Adoulin.AM = {} 274 | sets.engaged.Liberator.Fodder.Adoulin.AM = {} 275 | 276 | sets.engaged.Liberator.PDT = {} 277 | sets.engaged.Liberator.SomeAcc.PDT = {} 278 | sets.engaged.Liberator.Acc.PDT = {} 279 | sets.engaged.Liberator.FullAcc.PDT = {} 280 | sets.engaged.Liberator.Fodder.PDT = {} 281 | 282 | sets.engaged.Liberator.PDT.Adoulin = {} 283 | sets.engaged.Liberator.SomeAcc.PDT.Adoulin = {} 284 | sets.engaged.Liberator.Acc.PDT.Adoulin = {} 285 | sets.engaged.Liberator.FullAcc.PDT.Adoulin = {} 286 | sets.engaged.Liberator.Fodder.PDT.Adoulin = {} 287 | 288 | sets.engaged.Liberator.PDT.AM = {} 289 | sets.engaged.Liberator.SomeAcc.PDT.AM = {} 290 | sets.engaged.Liberator.Acc.PDT.AM = {} 291 | sets.engaged.Liberator.FullAcc.PDT.AM = {} 292 | sets.engaged.Liberator.Fodder.PDT.AM = {} 293 | 294 | sets.engaged.Liberator.PDT.Adoulin.AM = {} 295 | sets.engaged.Liberator.SomeAcc.PDT.Adoulin.AM = {} 296 | sets.engaged.Liberator.Acc.PDT.Adoulin.AM = {} 297 | sets.engaged.Liberator.FullAcc.PDT.Adoulin.AM = {} 298 | sets.engaged.Liberator.Fodder.PDT.Adoulin.AM = {} 299 | 300 | sets.engaged.Liberator.MDT = {} 301 | sets.engaged.Liberator.SomeAcc.MDT = {} 302 | sets.engaged.Liberator.Acc.MDT = {} 303 | sets.engaged.Liberator.FullAcc.MDT = {} 304 | sets.engaged.Liberator.Fodder.MDT = {} 305 | 306 | sets.engaged.Liberator.MDT.Adoulin = {} 307 | sets.engaged.Liberator.SomeAcc.MDT.Adoulin = {} 308 | sets.engaged.Liberator.Acc.MDT.Adoulin = {} 309 | sets.engaged.Liberator.FullAcc.MDT.Adoulin = {} 310 | sets.engaged.Liberator.Fodder.MDT.Adoulin = {} 311 | 312 | sets.engaged.Liberator.MDT.AM = {} 313 | sets.engaged.Liberator.SomeAcc.MDT.AM = {} 314 | sets.engaged.Liberator.Acc.MDT.AM = {} 315 | sets.engaged.Liberator.FullAcc.MDT.AM = {} 316 | sets.engaged.Liberator.Fodder.MDT.AM = {} 317 | 318 | sets.engaged.Liberator.MDT.Adoulin.AM = {} 319 | sets.engaged.Liberator.SomeAcc.MDT.Adoulin.AM = {} 320 | sets.engaged.Liberator.Acc.MDT.Adoulin.AM = {} 321 | sets.engaged.Liberator.FullAcc.MDT.Adoulin.AM = {} 322 | sets.engaged.Liberator.Fodder.MDT.Adoulin.AM = {} 323 | ]]-- 324 | --Extra Special Sets 325 | 326 | sets.buff.Souleater = {} 327 | sets.buff.Doom = set_combine(sets.buff.Doom, {}) 328 | sets.buff.Sleep = {head="Frenzy Sallet"} 329 | sets.TreasureHunter = set_combine(sets.TreasureHunter, {}) 330 | 331 | -- Weapons sets 332 | sets.weapons.Montante = {main="Montante +1",sub="Utu Grip"} 333 | sets.weapons.Anguta = {main="Anguta",sub="Utu Grip"} 334 | 335 | end 336 | 337 | -- Select default macro book on initial load or subjob change. 338 | function select_default_macro_book() 339 | -- Default macro set/book 340 | if player.sub_job == 'WAR' then 341 | set_macro_page(2, 15) 342 | elseif player.sub_job == 'SAM' then 343 | set_macro_page(3, 15) 344 | elseif player.sub_job == 'DNC' then 345 | set_macro_page(4, 15) 346 | elseif player.sub_job == 'THF' then 347 | set_macro_page(1, 15) 348 | else 349 | set_macro_page(5, 15) 350 | end 351 | end --------------------------------------------------------------------------------