|
Finally releasing this addon; GearInfo
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-03-31 16:47:03
I created this addon over the last couple years with a few friends using it and testing it for me. I no longer play the game but wish to release it to the public.
I'm still adding to the wiki, But please read up on it there before asking questions. I'm probably not going to be checking this forum post so if you have issues etc post them on the GitHub.
There is enough information there to get people started.
I welcome any well constructed critiques and will not reply to trolls.
I hope you enjoy this addon. I'm not the best programmer and im sure people will have a lot of input.
Thanks for reading.
edit:
a quick tl;dr;
The addon tracks your equipped gear in real time, including their augments AND buffs like haste to give you on screen values.
Then if you use it with Gearswap, (read the wiki) you can utilise the information calculated by GI to make gearswap auto change gear based on current haste values, DW equipped, etc. It even auto detects when your moving (and not engaged) and auto equips movement speed peices. This is all done in real time.
This is its intended utility.
some pics;
example pics of it working with my gearswap files and my gearswaps on screen displays:
Useful Links
Things planned with no set date:
The above is in no set order, and I'll only do if i have time. Current priority is bug fixing and helping people understand its use and how to use it.
I really Appreciate everyone's feedback, its been extremely positive and useful. Only having myself and 2 others to test makes finding bugs difficult. With an army of players they have been fast incoming and its great (although i did release a massive load of code change on release. It was bug free for the most part before that lol).
I'm glad everyone is finding it useful. I'll keep working on this for the foreseeable future even though I no longer play.
I don't know if shameless plugs about donations is taboo in this community but if this was one of your though's then you can find a link on the home page of the wiki (however this is not why I'm working on the addon). This project is first and foremost fun for me, if it stops being fun, support will prob die with it ^^.
and finally this is going to be odd but here is a link to my LinkedIn profile. If you are on LinkedIn and wouldnt mind endorsing my codding skills I would highly appreciate it as I am looking for work in the Programming department. Thanks.
Server: Shiva
Game: FFXI
Posts: 357
By Shiva.Berzerk 2018-03-31 16:58:49
Looks very cool, will try it out soon. Thank you for taking the time to make as well as sharing with us!
Bahamut.Dannyl
Server: Bahamut
Game: FFXI
Posts: 1550
By Bahamut.Dannyl 2018-03-31 17:04:20
Quote: parse - Will parse all of your gear in your inventories (including MH) to file.
if this is what I think it is then, i love you
Asura.Cair
VIP
Server: Asura
Game: FFXI
Posts: 246
By Asura.Cair 2018-03-31 17:11:27
Just some constructive feedback. I didn't look at everything, though.
It's entirely possible Lua optimizes this under the hood (probably not), but for example, every time you call check_gear_stp(item), you call item:lower() several times, and you're converting the same string to lowercase again and again to match your result. You also do this with dual wield checking.
In the same file, there a bunch of really really long else chains that simply assign a value based on a string. This would probably be more efficient as lookup tables for values, which would also make adding and changing values much easier.
Overall, the performance hit is probably minor on a single pass, but this kind of thing has the potential to blow up if you're checking a lot of items in a short time.
Cool concept though! Item parsing is hell :)
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-03-31 17:16:53
Just some constructive feedback. I didn't look at everything, though.
It's entirely possible Lua optimizes this under the hood (probably not), but for example, every time you call check_gear_stp(item), you call item:lower() several times, and you're converting the same string to lowercase again and again to match your result. You also do this with dual wield checking.
In the same file, there a bunch of really really long else chains that simply assign a value based on a string. This would probably be more efficient as lookup tables for values, which would also make adding and changing values much easier.
Overall, the performance hit is probably minor on a single pass, but this kind of thing has the potential to blow up if you're checking a lot of items in a short time.
Cool concept though! Item parsing is hell :)
This is one of the reasons i wanted to make the addon public, so that people with good codding practices and knowledge could work on it too, fork the project or just give feedback. I welcome the feedback thankyou.
Asura.Cair
VIP
Server: Asura
Game: FFXI
Posts: 246
By Asura.Cair 2018-03-31 17:23:54
I was trying to type examples but I fatfingered submit.
Code
--Instead of
if x:lower() == a then
elseif x:lower() == b then
end
--you can do
local xl = x:lower()
if xl == a then
elseif xl == b then
end
But if you have a really long chain or just need to assign vals based on a string, it will probably end up better if you do something like:
Code
--Table outside the function scope
local stp_vals = {
['item1'] = 2,
['item2'] = 0,
}
function()
local xl = x:lower()
-- Bit hacky, if the item isn't in the table
-- you get 0, otherwise whatever the lookup was
local stp = stp_vals[xl] or 0
end
Edit: In general, an if-else chain is going to be faster than a table lookup unless it's incredibly lengthy and the typical case will pass through a considerable amount of predicates (eg, it isn't likely that the condition will be true), but it still comes at the cost of readability and edit-ability, imo.
Asura.Darian
Server: Asura
Game: FFXI
Posts: 180
By Asura.Darian 2018-03-31 17:31:44
Rrally cool addon. Keeps me out of spreadsheets. Does it do anything for ws set tp return?
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-03-31 17:35:08
Rrally cool addon. Keeps me out of spreadsheets. Does it do anything for ws set tp return?
if i understand your question correctly yes. you can equip your ws set, use the function //gi save wstp , and it will store the tp return for that ws, then u switch ur gear to your mele set and you will see how many hits you need to hit 1000tp. this apllies to everything from ranged, Duel wilding, single wielding wtc, it even gives values for zanshin if your on SAM
The wiki has all the information regarding this and more. go check it out. ^^
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-03-31 17:45:52
I was trying to type examples but I fatfingered submit.
Code
--Instead of
if x:lower() == a then
elseif x:lower() == b then
end
--you can do
local xl = x:lower()
if xl == a then
elseif xl == b then
end
But if you have a really long chain or just need to assign vals based on a string, it will probably end up better if you do something like:
Code
--Table outside the function scope
local stp_vals = {
['item1'] = 2,
['item2'] = 0,
}
function()
local xl = x:lower()
-- Bit hacky, if the item isn't in the table
-- you get 0, otherwise whatever the lookup was
local stp = stp_vals[xl] or 0
end
Edit: In general, an if-else chain is going to be faster than a table lookup unless it's incredibly lengthy and the typical case will pass through a considerable amount of predicates (eg, it isn't likely that the condition will be true), but it still comes at the cost of readability and edit-ability, imo.
thanks for the tip. ill look into it. but for now it works really well and i dont have the time at home to rewrite major chunks of code. parenthood is kinda hectic and i only just broke my addiction to this game last year lol. so maybe big revamps will be for future versions or for someone to fork / update it themselves and submit. but i do appreciate the time you took to explain the concept, thanks.
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-02 04:41:06
I was trying to type examples but I fatfingered submit.
Code
--Instead of
if x:lower() == a then
elseif x:lower() == b then
end
--you can do
local xl = x:lower()
if xl == a then
elseif xl == b then
end
But if you have a really long chain or just need to assign vals based on a string, it will probably end up better if you do something like:
Code
--Table outside the function scope
local stp_vals = {
['item1'] = 2,
['item2'] = 0,
}
function()
local xl = x:lower()
-- Bit hacky, if the item isn't in the table
-- you get 0, otherwise whatever the lookup was
local stp = stp_vals[xl] or 0
end
Edit: In general, an if-else chain is going to be faster than a table lookup unless it's incredibly lengthy and the typical case will pass through a considerable amount of predicates (eg, it isn't likely that the condition will be true), but it still comes at the cost of readability and edit-ability, imo.
@Asura.Cair
I took your tips and used them, I'm currently working on optimising the way GearInfo parses the "description" of items from the resources. So i created a stand alone version of it called Exporter on my GitHub. Its way more powerful then the one in GearInfo and i think the code is also a lot tidier thanks to your tips. Will incorporate the code to GearInfo soon once I've finished it and I'm satisfied with it.
The addon does need some polish, especially like you said with the string:lower() repetition. So ill work on optimising that when I have time. Kids are off school at the moment so time is none existent lol but i will get round to it. I'm hopping some of my friends that have been using it since day one will come post and leave some of their personal thoughts on the addon. Their testing has been invaluable to find bugs, especially with the buff parsing in places like salvage and Omen that used to cause crazy errors.
Anyway any more feedback from anyone would be super appreciated. i will also be adding more to the Gearswap section of the GearInfo wiki soon.
Server: Bismarck
Game: FFXI
Posts: 148
By Bismarck.Cloudstrafie 2018-04-02 22:58:04
Is there any way to reflect spells? IE brd songs and cor rolls?,Currently testing this out for the most part its awesome as hell thank you very much, But when i add bard/cor buffs its not showing the STP or the RACC, But it does show the Magic haste from Honor/victory march
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-03 04:38:51
Bismarck.Cloudstrafie said: »Is there any way to reflect spells? IE brd songs and cor rolls?,Currently testing this out for the most part its awesome as hell thank you very much, But when i add bard/cor buffs its not showing the STP or the RACC, But it does show the Magic haste from Honor/victory march
Cor rolls is going to be a *** for tracking, but i will be giving it it a whirl eventually, i just need time. indeed right now it only tracks pretty much all sources of haste (except food if there are any) and once i revamp some more of the core code a lot more buffs and specific stats like attack etc will be tracked. Right now the Accuracy calculator is buggy and causes a massive hit to the game system and causes lag, but i haven't figured out why. I recommend just ignoring that one for now.
just a note on the buff tracker for the haste values. it does make some assumptions if the buffs potency is affected by the casters skill. like the potency of haste bubble from geo is assumed. while bard buffs are calculated by the bonus you tell the addon the bard has, it still assumes the bard has capped skill (it is 2018 after all, if your not capped then "git gud" i guess lol). it also tracks "the buff" slow, i specify say buff due to the fact i havnt coded a way to track monsters using abilities / spells that might include slow or slow II.
a lot of the reasons above is why i added a manual way for you to add some of these values, like more Store TP you know you are getting from buffs or food etc. You can use the command //gi stp +##.
edit:
also thank you very much for the kind words, im glad your enjoying it and getting use out of it. You should defo try it with a gearswap lua. look at the wiki for a basic explanation of how to set it up (it will be more in depth eventually) i do have several already written luas that are good to go and work with Gi.
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-03 07:31:39
pushed version '1.6.3.0' to merge string parsing code from Exporter and disabled Accuracy parsing due to code change and the fact it was inaccurate and caused stability issues.
get it here.
once loaded use command //gi parse to refresh your file.
Server: Bismarck
Game: FFXI
Posts: 39
By Bismarck.Norminator 2018-04-03 10:29:50
Hmmm just tried it and it doesnt seen to work for War, I always get the error :
GearInfo/GearInfo.lua:655 attempt to compare number with Nil
Its seen to try to calculated DW when I don't have any, current job is War/Sam.
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-03 10:58:41
Bismarck.Norminator said: »Hmmm just tried it and it doesnt seen to work for War, I always get the error :
GearInfo/GearInfo.lua:655 attempt to compare number with Nil
Its seen to try to calculated DW when I don't have any, current job is War/Sam.
which Version of GearInfo?
edit nevermind, yourt using latest version, i found the issue, and will fix it asap, im assumin you have a strap equipped. gona fix it asap
to clarify, in the resources straps are classed as weapons but do not have a base damage value. due to the new way i parsed the strings etc, i no longer add a value of 0 to items that have no damage, and so the code failed the check.
edit 2,
Fixed gona push new update with the other stuff ive been working on today.
edit 3
update pushed here . Update might need you to run a //gi parse to accomadate changes
Really sorry for the bug. thanks for posting it.
[+]
Valefor.Yandaime
Server: Valefor
Game: FFXI
Posts: 782
By Valefor.Yandaime 2018-04-03 11:29:01
This sounds cool as hell, definitely wanna play around with this
Bahamut.Neb
Server: Bahamut
Game: FFXI
Posts: 189
By Bahamut.Neb 2018-04-03 13:11:41
Do I really want to spend a month redoing my lua's is it worth it people who have tested and used this?
Server: Leviathan
Game: FFXI
Posts: 6052
By Leviathan.Comeatmebro 2018-04-03 13:19:05
Do I really want to spend a month redoing my lua's is it worth it people who have tested and used this? This shouldn't result in you redoing your luas, it is information that is widely available and easily calculated. The job guides already factor this sort of information, it's not changing perception of what sets are best or anything.
It's just a neat tool for people who like to visualize things, not really useful for anyone who knows what they're doing.
[+]
Lakshmi.Buukki
Server: Lakshmi
Game: FFXI
By Lakshmi.Buukki 2018-04-03 13:33:00
Don't use GS, but if for nothing else but the on-screen "DW needed: values as Ninja, it's super useful. Shows your /checkparam and tp/hit as well, which is quite helpful. Much thanks.
By Kilobyte 2018-04-03 13:44:53
Is there a possibility to display DT/PDT/MDT values?
Server: Asura
Game: FFXI
Posts: 196
By Asura.Inuyushi 2018-04-03 13:54:15
Is there a possibility to display DT/PDT/MDT values?
This would be cool as well. I concur.
Valefor.Yandaime
Server: Valefor
Game: FFXI
Posts: 782
By Valefor.Yandaime 2018-04-03 14:02:49
But... why? It’s sooooo gooooood
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-03 14:03:23
Leviathan.Comeatmebro said: »Do I really want to spend a month redoing my lua's is it worth it people who have tested and used this? This shouldn't result in you redoing your luas, it is information that is widely available and easily calculated. The job guides already factor this sort of information, it's not changing perception of what sets are best or anything.
It's just a neat tool for people who like to visualize things, not really useful for anyone who knows what they're doing.
not to claim your wrong but this addon will help you automaticly change sets sets bassed on buffs you currently have. The luas i created have excessive sets based on things like how much DW u need for max attack speed. you can also use it on any other job that doesnt DW to help you generate sets bassed on how much haste you have. by this i mean in situations where all sources of haste are capped, i.e. your ja haste and magic haste, u can actually drop haste from gear because of the overall cap.
I've yet to see any freely available GS luas on any forum track buffs automatically as efficiently as GearInfo does. and to take this further most GS files require you to use toggles to switch your sets for the "correct situation". i created GI to say F*** that to extra toggles.
here are some example of sets constructed for a lua i made for a friend recently that takes many of these things into concideration:
this is from a dnc lua. Notice there are sets define for if u change from DW to single etc. and this is auto updated by GI too.
GI will also auto detect if your moving and tell gearswap to equip move speed gear (usefull if u dont speed hack) and u can auto equip based on situations like when not engaged. I mean maybe someone has written a lua that can do all these things, but ive yet to find it.
Dont get me wrong im not trying to force anyone to try it with my GS luas but im extremely certain anyone who does is gona go "holy ***-a-moly".
ilvl = accuracy tears
dt = damage taken down sets
DW:#~# = sets based on how much DW u need to hit max attack speed
SD = saber dance
Code
sets.engaged = { ammo="Yamarang",
head=Adhemar_head,neck="Asperity Necklace",left_ear="Digni. Earring",right_ear="Brutal Earring",
body=Adhemar_body,hands=Adhemar_hands,left_ring="Epona's Ring",right_ring="Petrov Ring",
back=BackDD,waist="Windbuffet Belt +1",legs=Samnuha_Tights,feet=HercDDFeet}
sets.engaged['Ilvl~118'] = set_combine(sets.engaged, {})
sets.engaged['Ilvl~122'] = set_combine(sets.engaged['Ilvl~118'], {})
sets.engaged['Ilvl~124+'] = set_combine(sets.engaged['Ilvl~122'], {})
sets.engaged.DW = { ammo="Yamarang",
head=Adhemar_head,neck="Asperity Necklace",left_ear="Digni. Earring",right_ear="Brutal Earring",
body=Adhemar_body,hands=Adhemar_hands,left_ring="Epona's Ring",right_ring="Petrov Ring",
back=BackDD,waist="Windbuffet Belt +1",legs=Samnuha_Tights,feet=HercDDFeet}
sets.engaged.DW['Ilvl~118'] = set_combine(sets.engaged.DW, {})
sets.engaged.DW['Ilvl~122'] = set_combine(sets.engaged.DW['Ilvl~118'], {})
sets.engaged.DW['Ilvl~124+'] = set_combine(sets.engaged.DW['Ilvl~122'], {})
-- DT = "Damage taken" ie. hybrid tanking sets
sets.engaged.DT = { ammo="Yamarang",
head=HercDTHead,neck="Warder's Charm +1",left_ear="Digni. Earring",right_ear="Brutal Earring",
body="Meg. Cuirie +2",hands=HercDTHands,left_ring="Vocane Ring",right_ring="Defending Ring",
back="Solemnity Cape",waist="Flume Belt",legs="Mummu kecks +2",feet=HercDTFeet}
sets.engaged['Ilvl~118'].DT = set_combine(sets.engaged.DT , {})
sets.engaged['Ilvl~122'].DT = set_combine(sets.engaged['Ilvl~118'].DT , {})
sets.engaged['Ilvl~124+'].DT = set_combine(sets.engaged['Ilvl~122'].DT , {})
sets.engaged.DW.DT = { ammo="Yamarang",
head=HercDTHead,neck="Warder's Charm +1",left_ear="Digni. Earring",right_ear="Brutal Earring",
body="Meg. Cuirie +2",hands=HercDTHands,left_ring="Vocane Ring",right_ring="Defending Ring",
back="Solemnity Cape",waist="Flume Belt",legs="Mummu kecks +2",feet=HercDTFeet}
sets.engaged.DW['Ilvl~118'].DT = set_combine(sets.engaged.DW.DT , {})
sets.engaged.DW['Ilvl~122'].DT = set_combine(sets.engaged.DW['Ilvl~118'].DT , {})
sets.engaged.DW['Ilvl~124+'].DT = set_combine(sets.engaged.DW['Ilvl~122'].DT , {})
-- SD = "Saber Dance"
sets.engaged['SD'] = set_combine(sets.engaged, {})
sets.engaged['Ilvl~118']['SD'] = set_combine(sets.engaged['SD'], {})
sets.engaged['Ilvl~122']['SD'] = set_combine(sets.engaged['Ilvl~118']['SD'], {})
sets.engaged['Ilvl~124+']['SD'] = set_combine(sets.engaged['Ilvl~122']['SD'], {})
-- AM3 = SPECIFICLY Emperean Aftermath (not relic or mythic or any other, tracked by checking which main hand weapon is equipped)
sets.engaged['AM3'] = set_combine(sets.engaged, {})
sets.engaged['Ilvl~118']['AM3'] = set_combine(sets.engaged['AM3'], {})
sets.engaged['Ilvl~122']['AM3'] = set_combine(sets.engaged['Ilvl~118']['AM3'], {})
sets.engaged['Ilvl~124+']['AM3'] = set_combine(sets.engaged['Ilvl~122']['AM3'], {})
-- Mix of both saber dance and AM3 active
sets.engaged['SD']['AM3'] = set_combine(sets.engaged['AM3'], {})
sets.engaged['Ilvl~118']['SD']['AM3'] = set_combine(sets.engaged['SD']['AM3'], {})
sets.engaged['Ilvl~122']['SD']['AM3'] = set_combine(sets.engaged['Ilvl~118']['SD']['AM3'], {})
sets.engaged['Ilvl~124+']['SD']['AM3'] = set_combine(sets.engaged['Ilvl~122']['SD']['AM3'], {})
----------------------------------------
-- Normal melee group: No Haste (38% DW)
----------------------------------------
sets.engaged.DW['DW: 38'] = set_combine(sets.engaged, {ammo="Yamarang",
head=Adhemar_head,neck="Asperity Necklace",left_ear="Digni. Earring",right_ear="Brutal Earring",
body=Adhemar_body,hands=Adhemar_hands,left_ring="Epona's Ring",right_ring="Petrov Ring",
back=BackDD,waist="Windbuffet Belt +1",legs=Samnuha_Tights,feet=HercDDFeet})
sets.engaged.DW['Ilvl~118']['DW: 38'] = set_combine(sets.engaged.DW['DW: 38'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 38'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 38'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 38'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 38'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 38'] = set_combine(sets.engaged.DW.DT, {})
sets.engaged.DW['Ilvl~118'].DT['DW: 38'] = set_combine(sets.engaged.DW.DT['DW: 38'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 38'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 38'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 38'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 38'], {})
sets.engaged.DW['DW: 38']['SD'] = set_combine(sets.engaged.DW['DW: 38'], {Head=AF_head})
sets.engaged.DW['Ilvl~118']['DW: 38']['SD'] = set_combine(sets.engaged.DW['DW: 38']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 38']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 38']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 38']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 38']['SD'], {})
sets.engaged.DW['DW: 38']['AM3'] = set_combine(sets.engaged.DW['DW: 38'], {Body="Meghanada cuirie +2"})
sets.engaged.DW['Ilvl~118']['DW: 38']['AM3'] = set_combine(sets.engaged.DW['DW: 38']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 38']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 38']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 38']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 38']['AM3'], {})
sets.engaged.DW['DW: 38']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 38'], {Hands=AF_hands})
sets.engaged.DW['Ilvl~118']['DW: 38']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 38']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 38']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 38']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 38']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 38']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
-- Custom melee group: low Haste ('DW: 36-37')
--------------------------------------------
sets.engaged.DW['DW: 36-37'] = set_combine(sets.engaged.DW['DW: 38'], {})
sets.engaged.DW['Ilvl~118']['DW: 36-37'] = set_combine(sets.engaged.DW['DW: 36-37'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 36-37'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 36-37'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 36-37'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 36-37'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 36-37'] = set_combine(sets.engaged.DW.DT['DW: 38'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 36-37'] = set_combine(sets.engaged.DW.DT['DW: 36-37'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 36-37'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 36-37'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 36-37'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 36-37'], {})
sets.engaged.DW['DW: 36-37']['SD'] = set_combine(sets.engaged.DW['DW: 36-37'], {})
sets.engaged.DW['Ilvl~118']['DW: 36-37']['SD'] = set_combine(sets.engaged.DW['DW: 36-37']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 36-37']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 36-37']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 36-37']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 36-37']['SD'], {})
sets.engaged.DW['DW: 36-37']['AM3'] = set_combine(sets.engaged.DW['DW: 36-37'], {})
sets.engaged.DW['Ilvl~118']['DW: 36-37']['AM3'] = set_combine(sets.engaged.DW['DW: 36-37']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 36-37']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 36-37']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 36-37']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 36-37']['AM3'], {})
sets.engaged.DW['DW: 36-37']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 36-37'], {})
sets.engaged.DW['Ilvl~118']['DW: 36-37']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 36-37']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 36-37']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 36-37']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 36-37']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 36-37']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
-- Custom melee group: low Haste ('DW: 34-35')-
--------------------------------------------
sets.engaged.DW['DW: 34-35'] = set_combine(sets.engaged.DW['DW: 36-37'], {})
sets.engaged.DW['Ilvl~118']['DW: 34-35'] = set_combine(sets.engaged.DW['DW: 34-35'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 34-35'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 34-35'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 34-35'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 34-35'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 34-35'] = set_combine(sets.engaged.DW.DT['DW: 36-37'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 34-35'] = set_combine(sets.engaged.DW.DT['DW: 34-35'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 34-35'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 34-35'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 34-35'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 34-35'], {})
sets.engaged.DW['DW: 34-35']['SD'] = set_combine(sets.engaged.DW['DW: 34-35'], {})
sets.engaged.DW['Ilvl~118']['DW: 34-35']['SD'] = set_combine(sets.engaged.DW['DW: 34-35']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 34-35']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 34-35']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 34-35']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 34-35']['SD'], {})
sets.engaged.DW['DW: 34-35']['AM3'] = set_combine(sets.engaged.DW['DW: 34-35'], {})
sets.engaged.DW['Ilvl~118']['DW: 34-35']['AM3'] = set_combine(sets.engaged.DW['DW: 34-35']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 34-35']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 34-35']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 34-35']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 34-35']['AM3'], {})
sets.engaged.DW['DW: 34-35']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 34-35'], {})
sets.engaged.DW['Ilvl~118']['DW: 34-35']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 34-35']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 34-35']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 34-35']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 34-35']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 34-35']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
-- Custom melee group: low Haste ('DW: 31-33')-
--------------------------------------------
sets.engaged.DW['DW: 31-33'] = set_combine(sets.engaged.DW['DW: 34-35'], {})
sets.engaged.DW['Ilvl~118']['DW: 31-33'] = set_combine(sets.engaged.DW['DW: 31-33'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 31-33'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 31-33'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 31-33'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 31-33'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 31-33'] = set_combine(sets.engaged.DW.DT['DW: 34-35'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 31-33'] = set_combine(sets.engaged.DW.DT['DW: 31-33'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 31-33'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 31-33'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 31-33'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 31-33'], {})
sets.engaged.DW['DW: 31-33']['SD'] = set_combine(sets.engaged.DW['DW: 31-33'], {})
sets.engaged.DW['Ilvl~118']['DW: 31-33']['SD'] = set_combine(sets.engaged.DW['DW: 31-33']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 31-33']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 31-33']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 31-33']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 31-33']['SD'], {})
sets.engaged.DW['DW: 31-33']['AM3'] = set_combine(sets.engaged.DW['DW: 31-33'], {})
sets.engaged.DW['Ilvl~118']['DW: 31-33']['AM3'] = set_combine(sets.engaged.DW['DW: 31-33']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 31-33']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 31-33']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 31-33']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 31-33']['AM3'], {})
sets.engaged.DW['DW: 31-33']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 31-33'], {})
sets.engaged.DW['Ilvl~118']['DW: 31-33']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 31-33']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 31-33']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 31-33']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 31-33']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 31-33']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
-- Custom melee group: low Haste ('DW: 28-30')-
--------------------------------------------
sets.engaged.DW['DW: 28-30'] = set_combine(sets.engaged.DW['DW: 31-33'], {})
sets.engaged.DW['Ilvl~118']['DW: 28-30'] = set_combine(sets.engaged.DW['DW: 28-30'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 28-30'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 28-30'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 28-30'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 28-30'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 28-30'] = set_combine(sets.engaged.DW.DT['DW: 31-33'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 28-30'] = set_combine(sets.engaged.DW.DT['DW: 28-30'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 28-30'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 28-30'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 28-30'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 28-30'], {})
sets.engaged.DW['DW: 28-30']['SD'] = set_combine(sets.engaged.DW['DW: 28-30'], {})
sets.engaged.DW['Ilvl~118']['DW: 28-30']['SD'] = set_combine(sets.engaged.DW['DW: 28-30']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 28-30']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 28-30']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 28-30']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 28-30']['SD'], {})
sets.engaged.DW['DW: 28-30']['AM3'] = set_combine(sets.engaged.DW['DW: 28-30'], {})
sets.engaged.DW['Ilvl~118']['DW: 28-30']['AM3'] = set_combine(sets.engaged.DW['DW: 28-30']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 28-30']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 28-30']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 28-30']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 28-30']['AM3'], {})
sets.engaged.DW['DW: 28-30']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 28-30'], {})
sets.engaged.DW['Ilvl~118']['DW: 28-30']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 28-30']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 28-30']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 28-30']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 28-30']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 28-30']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
-- Custom melee group: MidHaste ('DW: 25-27')-
--------------------------------------------
sets.engaged.DW['DW: 25-27'] = set_combine(sets.engaged.DW['DW: 28-30'], {})
sets.engaged.DW['Ilvl~118']['DW: 25-27'] = set_combine(sets.engaged.DW['DW: 25-27'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 25-27'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 25-27'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 25-27'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 25-27'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 25-27'] = set_combine(sets.engaged.DW.DT['DW: 28-30'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 25-27'] = set_combine(sets.engaged.DW.DT['DW: 25-27'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 25-27'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 25-27'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 25-27'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 25-27'], {})
sets.engaged.DW['DW: 25-27']['SD'] = set_combine(sets.engaged.DW['DW: 25-27'], {})
sets.engaged.DW['Ilvl~118']['DW: 25-27']['SD'] = set_combine(sets.engaged.DW['DW: 25-27']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 25-27']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 25-27']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 25-27']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 25-27']['SD'], {})
sets.engaged.DW['DW: 25-27']['AM3'] = set_combine(sets.engaged.DW['DW: 25-27'], {})
sets.engaged.DW['Ilvl~118']['DW: 25-27']['AM3'] = set_combine(sets.engaged.DW['DW: 25-27']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 25-27']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 25-27']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 25-27']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 25-27']['AM3'], {})
sets.engaged.DW['DW: 25-27']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 25-27'], {})
sets.engaged.DW['Ilvl~118']['DW: 25-27']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 25-27']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 25-27']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 25-27']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 25-27']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 25-27']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
-- Custom melee group: High Haste ('DW: 21-24')
---------------------------------------------
sets.engaged.DW['DW: 21-24'] = set_combine(sets.engaged.DW['DW: 25-27'], {})
sets.engaged.DW['Ilvl~118']['DW: 21-24'] = set_combine(sets.engaged.DW['DW: 21-24'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 21-24'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 21-24'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 21-24'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 21-24'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 21-24'] = set_combine(sets.engaged.DW.DT['DW: 25-27'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 21-24'] = set_combine(sets.engaged.DW.DT['DW: 21-24'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 21-24'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 21-24'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 21-24'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 21-24'], {})
sets.engaged.DW['DW: 21-24']['SD'] = set_combine(sets.engaged.DW['DW: 21-24'], {})
sets.engaged.DW['Ilvl~118']['DW: 21-24']['SD'] = set_combine(sets.engaged.DW['DW: 21-24']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 21-24']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 21-24']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 21-24']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 21-24']['SD'], {})
sets.engaged.DW['DW: 21-24']['AM3'] = set_combine(sets.engaged.DW['DW: 21-24'], {})
sets.engaged.DW['Ilvl~118']['DW: 21-24']['AM3'] = set_combine(sets.engaged.DW['DW: 21-24']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 21-24']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 21-24']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 21-24']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 21-24']['AM3'], {})
sets.engaged.DW['DW: 21-24']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 21-24'], {})
sets.engaged.DW['Ilvl~118']['DW: 21-24']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 21-24']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 21-24']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 21-24']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 21-24']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 21-24']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
-- Custom melee group: High Haste ('DW: 20')
---------------------------------------------
sets.engaged.DW['DW: 20'] = set_combine(sets.engaged.DW['DW: 21-24'], {})
sets.engaged.DW['Ilvl~118']['DW: 20'] = set_combine(sets.engaged.DW['DW: 20'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 20'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 20'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 20'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 20'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 20'] = set_combine(sets.engaged.DW.DT['DW: 21-24'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 20'] = set_combine(sets.engaged.DW.DT['DW: 20'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 20'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 20'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 20'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 20'], {})
sets.engaged.DW['DW: 20']['SD'] = set_combine(sets.engaged.DW['DW: 20'], {})
sets.engaged.DW['Ilvl~118']['DW: 20']['SD'] = set_combine(sets.engaged.DW['DW: 20']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 20']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 20']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 20']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 20']['SD'], {})
sets.engaged.DW['DW: 20']['AM3'] = set_combine(sets.engaged.DW['DW: 20'], {})
sets.engaged.DW['Ilvl~118']['DW: 20']['AM3'] = set_combine(sets.engaged.DW['DW: 20']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 20']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 20']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 20']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 20']['AM3'], {})
sets.engaged.DW['DW: 20']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 20'], {})
sets.engaged.DW['Ilvl~118']['DW: 20']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 20']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 20']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 20']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 20']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 20']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
-- Custom melee group: High Haste ('DW: 19')
---------------------------------------------
sets.engaged.DW['DW: 19'] = set_combine(sets.engaged.DW['DW: 20'], {})
sets.engaged.DW['Ilvl~118']['DW: 19'] = set_combine(sets.engaged.DW['DW: 19'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 19'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 19'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 19'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 19'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 19'] = set_combine(sets.engaged.DW.DT['DW: 20'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 19'] = set_combine(sets.engaged.DW.DT['DW: 19'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 19'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 19'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 19'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 19'], {})
sets.engaged.DW['DW: 19']['SD'] = set_combine(sets.engaged.DW['DW: 19'], {})
sets.engaged.DW['Ilvl~118']['DW: 19']['SD'] = set_combine(sets.engaged.DW['DW: 19']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 19']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 19']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 19']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 19']['SD'], {})
sets.engaged.DW['DW: 19']['AM3'] = set_combine(sets.engaged.DW['DW: 19'], {})
sets.engaged.DW['Ilvl~118']['DW: 19']['AM3'] = set_combine(sets.engaged.DW['DW: 19']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 19']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 19']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 19']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 19']['AM3'], {})
sets.engaged.DW['DW: 19']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 19'], {})
sets.engaged.DW['Ilvl~118']['DW: 19']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 19']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 19']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 19']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 19']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 19']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
-- Custom melee group: High Haste ('DW: 16-18')
---------------------------------------------
sets.engaged.DW['DW: 16-18'] = set_combine(sets.engaged.DW['DW: 19'], {})
sets.engaged.DW['Ilvl~118']['DW: 16-18'] = set_combine(sets.engaged.DW['DW: 16-18'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 16-18'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 16-18'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 16-18'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 16-18'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 16-18'] = set_combine(sets.engaged.DW.DT['DW: 19'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 16-18'] = set_combine(sets.engaged.DW.DT['DW: 16-18'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 16-18'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 16-18'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 16-18'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 16-18'], {})
sets.engaged.DW['DW: 16-18']['SD'] = set_combine(sets.engaged.DW['DW: 16-18'], {})
sets.engaged.DW['Ilvl~118']['DW: 16-18']['SD'] = set_combine(sets.engaged.DW['DW: 16-18']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 16-18']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 16-18']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 16-18']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 16-18']['SD'], {})
sets.engaged.DW['DW: 16-18']['AM3'] = set_combine(sets.engaged.DW['DW: 16-18'], {})
sets.engaged.DW['Ilvl~118']['DW: 16-18']['AM3'] = set_combine(sets.engaged.DW['DW: 16-18']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 16-18']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 16-18']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 16-18']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 16-18']['AM3'], {})
sets.engaged.DW['DW: 16-18']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 16-18'], {})
sets.engaged.DW['Ilvl~118']['DW: 16-18']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 16-18']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 16-18']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 16-18']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 16-18']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 16-18']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
-- Custom melee group: High Haste ('DW: 13-15')
---------------------------------------------
sets.engaged.DW['DW: 13-15'] = set_combine(sets.engaged.DW['DW: 16-18'], {})
sets.engaged.DW['Ilvl~118']['DW: 13-15'] = set_combine(sets.engaged.DW['DW: 13-15'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 13-15'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 13-15'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 13-15'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 13-15'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 13-15'] = set_combine(sets.engaged.DW.DT['DW: 16-18'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 13-15'] = set_combine(sets.engaged.DW.DT['DW: 13-15'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 13-15'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 13-15'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 13-15'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 13-15'], {})
sets.engaged.DW['DW: 13-15']['SD'] = set_combine(sets.engaged.DW['DW: 13-15'], {})
sets.engaged.DW['Ilvl~118']['DW: 13-15']['SD'] = set_combine(sets.engaged.DW['DW: 13-15']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 13-15']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 13-15']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 13-15']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 13-15']['SD'], {})
sets.engaged.DW['DW: 13-15']['AM3'] = set_combine(sets.engaged.DW['DW: 13-15'], {})
sets.engaged.DW['Ilvl~118']['DW: 13-15']['AM3'] = set_combine(sets.engaged.DW['DW: 13-15']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 13-15']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 13-15']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 13-15']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 13-15']['AM3'], {})
sets.engaged.DW['DW: 13-15']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 13-15'], {})
sets.engaged.DW['Ilvl~118']['DW: 13-15']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 13-15']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 13-15']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 13-15']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 13-15']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 13-15']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------
-- Custom melee group: High Haste ('DW: 9-12')
---------------------------------------------
sets.engaged.DW['DW: 9-12'] = set_combine(sets.engaged.DW['DW: 13-15'], {})
sets.engaged.DW['Ilvl~118']['DW: 9-12'] = set_combine(sets.engaged.DW['DW: 9-12'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 9-12'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 9-12'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 9-12'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 9-12'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 9-12'] = set_combine(sets.engaged.DW.DT['DW: 13-15'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 9-12'] = set_combine(sets.engaged.DW.DT['DW: 9-12'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 9-12'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 9-12'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 9-12'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 9-12'], {})
sets.engaged.DW['DW: 9-12']['SD'] = set_combine(sets.engaged.DW['DW: 9-12'], {})
sets.engaged.DW['Ilvl~118']['DW: 9-12']['SD'] = set_combine(sets.engaged.DW['DW: 9-12']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 9-12']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 9-12']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 9-12']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 9-12']['SD'], {})
sets.engaged.DW['DW: 9-12']['AM3'] = set_combine(sets.engaged.DW['DW: 9-12'], {})
sets.engaged.DW['Ilvl~118']['DW: 9-12']['AM3'] = set_combine(sets.engaged.DW['DW: 9-12']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 9-12']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 9-12']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 9-12']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 9-12']['AM3'], {})
sets.engaged.DW['DW: 9-12']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 9-12'], {})
sets.engaged.DW['Ilvl~118']['DW: 9-12']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 9-12']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 9-12']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 9-12']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 9-12']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 9-12']['SD']['AM3'], {})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------
-- Custom melee group: Max Haste ('DW: 0-8')
-----------------------------------------
sets.engaged.DW['DW: 0-8'] = set_combine(sets.engaged.DW['DW: 9-12'], {})
sets.engaged.DW['Ilvl~118']['DW: 0-8'] = set_combine(sets.engaged.DW['DW: 0-8'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122']['DW: 0-8'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 0-8'], {head=AF_head,Hands=AF_hands})
sets.engaged.DW['Ilvl~124+']['DW: 0-8'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 0-8'], {body=AF_body,Legs=AF_legs,Feet=AF_feet})
sets.engaged.DW.DT['DW: 0-8'] = set_combine(sets.engaged.DW.DT['DW: 9-12'], {})
sets.engaged.DW['Ilvl~118'].DT['DW: 0-8'] = set_combine(sets.engaged.DW.DT['DW: 0-8'], {Neck="Sanctity Necklace",Right_ear="Zennaroi earring"})
sets.engaged.DW['Ilvl~122'].DT['DW: 0-8'] = set_combine(sets.engaged.DW['Ilvl~118'].DT['DW: 0-8'], {head=AF_head,Body=AF_body})
sets.engaged.DW['Ilvl~124+'].DT['DW: 0-8'] = set_combine(sets.engaged.DW['Ilvl~122'].DT['DW: 0-8'], {})
sets.engaged.DW['DW: 0-8']['SD'] = set_combine(sets.engaged.DW['DW: 0-8'], {})
sets.engaged.DW['Ilvl~118']['DW: 0-8']['SD'] = set_combine(sets.engaged.DW['DW: 0-8']['SD'], {})
sets.engaged.DW['Ilvl~122']['DW: 0-8']['SD'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 0-8']['SD'], {})
sets.engaged.DW['Ilvl~124+']['DW: 0-8']['SD'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 0-8']['SD'], {})
sets.engaged.DW['DW: 0-8']['AM3'] = set_combine(sets.engaged.DW['DW: 0-8'], {})
sets.engaged.DW['Ilvl~118']['DW: 0-8']['AM3'] = set_combine(sets.engaged.DW['DW: 0-8']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 0-8']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 0-8']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 0-8']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 0-8']['AM3'], {})
sets.engaged.DW['DW: 0-8']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 0-8'], {})
sets.engaged.DW['Ilvl~118']['DW: 0-8']['SD']['AM3'] = set_combine(sets.engaged.DW['DW: 0-8']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~122']['DW: 0-8']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~118']['DW: 0-8']['SD']['AM3'], {})
sets.engaged.DW['Ilvl~124+']['DW: 0-8']['SD']['AM3'] = set_combine(sets.engaged.DW['Ilvl~122']['DW: 0-8']['SD']['AM3'], {})
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-03 14:04:51
Kilobyte said: »
Is there a possibility to display DT/PDT/MDT values?
This would be cool as well. I concur.
i can very easily add this as the string parsing updates i added just today will allows me to just plug a stat in and it will pull the numbers from the gear. ill look at adding it for you guys with the option to display or not.
By Kilobyte 2018-04-03 14:23:29
Quote: i can very easily add this as the string parsing updates i added just today will allows me to just plug a stat in and it will pull the numbers from the gear. ill look at adding it for you guys with the option to display or not.
Looking forward to it! Thanks!
Lakshmi.Buukki
Server: Lakshmi
Game: FFXI
By Lakshmi.Buukki 2018-04-03 14:45:02
But... why? It’s sooooo gooooood
Don't know how to, so just stuck with gear sets.
Server: Asura
Game: FFXI
Posts: 196
By Asura.Inuyushi 2018-04-03 14:48:25
I've been reading through this off and on all day and I'm just curious on your last post about GI feeding into to Gearswap. I too use Kinematics and actually have modified it quite extensively to do things such as check if I'm asleep or not, check my hp/mp, etc., etc. So really your stuff isn't that complicated when you break it down. It's just a ton of repetition of sets. Which is amazing, don't let me minimize that, but nothing hard.
What I'm curious is to get GI to talk with Kinematics, all I should have is the "function gearinfo(cmdParams, eventArgs)" correct? With this in, I can then do things like "sets.engaged.DW['Ilvl~124+']['DW: 28-30']['SD']['AM3']" and Kinematics gearswap will equip the correct set based upon GI info? Does GI really read the level of the target?
Thanks!
Leviathan.Kingkitt
Server: Leviathan
Game: FFXI
Posts: 518
By Leviathan.Kingkitt 2018-04-03 14:52:47
But... why? It’s sooooo gooooood
Don't know how to, so just stuck with gear sets.
Should look into ashita, i found xml's to be much cleaner and easier to work with than using luas for gearswap and what not.
Server: Odin
Game: FFXI
Posts: 200
By Odin.Ewellina 2018-04-03 15:01:50
I've been reading through this off and on all day and I'm just curious on your last post about GI feeding into to Gearswap. I too use Kinematics and actually have modified it quite extensively to do things such as check if I'm asleep or not, check my hp/mp, etc., etc. So really your stuff isn't that complicated when you break it down. It's just a ton of repetition of sets. Which is amazing, don't let me minimize that, but nothing hard.
What I'm curious is to get GI to talk with Kinematics, all I should have is the "function gearinfo(cmdParams, eventArgs)" correct? With this in, I can then do things like "sets.engaged.DW['Ilvl~124+']['DW: 28-30']['SD']['AM3']" and Kinematics gearswap will equip the correct set based upon GI info? Does GI really read the level of the target?
Thanks!
it doesnt read ilvl of the mobs no, the ilvl thing is just the naming convention i use for accuracy tears. people might use low medium high instead. i just prefered doin it by ilvl content. which most my friends who use it say it makes more sence to them so i stuck with it.
Also in terms of making GS respond to the values from GI, ud need a bit more code then what u suggest. but in principle yes.
Server: Asura
Game: FFXI
Posts: 196
By Asura.Inuyushi 2018-04-03 15:06:08
Just relogged in and thought you should know that if loading GI at the login screen, it fails to load:
GearInfo: Lua runtime error: gearinfo/Statics.lua:4: attempt to index global 'player' (a nil value). I don't know the fix, but just thought you should know incase this goes to global windower.
I created this addon over the last couple years with a few friends using it and testing it for me. I no longer play the game but wish to release it to the public.
I'm still adding to the wiki, But please read up on it there before asking questions. I'm probably not going to be checking this forum post so if you have issues etc post them on the GitHub.
There is enough information there to get people started.
I welcome any well constructed critiques and will not reply to trolls.
I hope you enjoy this addon. I'm not the best programmer and im sure people will have a lot of input.
Thanks for reading.
edit:
a quick tl;dr;
The addon tracks your equipped gear in real time, including their augments AND buffs like haste to give you on screen values.
Then if you use it with Gearswap, (read the wiki) you can utilise the information calculated by GI to make gearswap auto change gear based on current haste values, DW equipped, etc. It even auto detects when your moving (and not engaged) and auto equips movement speed peices. This is all done in real time.
This is its intended utility.
some pics;
example pics of it working with my gearswap files and my gearswaps on screen displays:
Useful Links
Things planned with no set date:
The above is in no set order, and I'll only do if i have time. Current priority is bug fixing and helping people understand its use and how to use it.
I really Appreciate everyone's feedback, its been extremely positive and useful. Only having myself and 2 others to test makes finding bugs difficult. With an army of players they have been fast incoming and its great (although i did release a massive load of code change on release. It was bug free for the most part before that lol).
I'm glad everyone is finding it useful. I'll keep working on this for the foreseeable future even though I no longer play.
I don't know if shameless plugs about donations is taboo in this community but if this was one of your though's then you can find a link on the home page of the wiki (however this is not why I'm working on the addon). This project is first and foremost fun for me, if it stops being fun, support will prob die with it ^^.
and finally this is going to be odd but here is a link to my LinkedIn profile. If you are on LinkedIn and wouldnt mind endorsing my codding skills I would highly appreciate it as I am looking for work in the Programming department. Thanks.
|
|