├── 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
--------------------------------------------------------------------------------