Add achievement sniffer
This commit is contained in:
13
FreshShit/AchievementSniffer/event.lua
Normal file
13
FreshShit/AchievementSniffer/event.lua
Normal file
@@ -0,0 +1,13 @@
|
||||
--- PLAYER_TARGET_CHANGED
|
||||
function()
|
||||
local targetGuid = UnitGUID("target")
|
||||
if not targetGuid then return end
|
||||
if not string.match(targetGuid, "Player") then return end
|
||||
local targetName = UnitName("target")
|
||||
if not aura_env.config.recsan and WeakAurasSaved.Cyka.AchievementSniffer[targetName] then return end
|
||||
-- aura_env.Scan(targetName)
|
||||
local canInspect = CanInspect("target", true)
|
||||
if canInspect then
|
||||
SetAchievementComparisonUnit("target")
|
||||
end
|
||||
end
|
9
FreshShit/AchievementSniffer/event2.lua
Normal file
9
FreshShit/AchievementSniffer/event2.lua
Normal file
@@ -0,0 +1,9 @@
|
||||
--- INSPECT_ACHIEVEMENT_READY
|
||||
function()
|
||||
local targetGuid = UnitGUID("target")
|
||||
if not targetGuid then return end
|
||||
if not string.match(targetGuid, "Player") then return end
|
||||
local targetName = UnitName("target")
|
||||
if not aura_env.config.recsan and WeakAurasSaved.Cyka.AchievementSniffer[targetName] then return end
|
||||
aura_env.Scan(targetName)
|
||||
end
|
135
FreshShit/AchievementSniffer/info
Normal file
135
FreshShit/AchievementSniffer/info
Normal file
@@ -0,0 +1,135 @@
|
||||
main achievement frame is AchievementFrame
|
||||
The tabs are
|
||||
AchievementFrameTab1 2 3
|
||||
First is "Achievements", 2nd guild and 3rd statistics
|
||||
Statistics might also be useful but that would be hard to tell, for now
|
||||
|
||||
AchievementFrame > AchievementFrameComparison
|
||||
The comparison frame is AchievementFrameComparisonContainer (N/A)
|
||||
Scroll buttons are AchievementFrameComparisonContainerScrollBarScrollDownButton (scrollDown) and AchievementFrameComparisonContainerScrollBarScrollUpButton (scrollUp)
|
||||
|
||||
The actual individual achievement data is in
|
||||
AchievementFrameComparisonContainerScrollChild (ScrollChild) (not a typo)
|
||||
It has achievements listed as:
|
||||
AchievementFrameComparisonContainerButton1 .. 10
|
||||
Always seems to be 10
|
||||
Scrolling should move 1 new into the view and 1 old out of view
|
||||
|
||||
The buttons themselves represent one row (one achievement)
|
||||
Our achievement is found in
|
||||
AchievementFrameComparisonContainerButton1Player (player)
|
||||
AchievementFrameComparisonContainerButton1Friend (friend)
|
||||
Ours has names while friend has no names
|
||||
So we will have to use names from Player and dates from Friend
|
||||
|
||||
Name, title, is under AchievementFrameComparisonContainerButton1PlayerLabel (label)
|
||||
Friend date achieved is under AchievementFrameComparisonContainerButton1FriendStatus (status)
|
||||
|
||||
We can also get achievement ID from the button frame
|
||||
AchievementFrameComparisonContainerButton1P under the "id" property
|
||||
|
||||
Categories are under
|
||||
AchievementFrameCategories (N/A) > AchievementFrameCategoriesContainer (N/A)
|
||||
|
||||
Structure is the same as AchievementFrameComparisonContainer
|
||||
We have scroll child and scroll up/down
|
||||
Although there's no scrolling so I'm not sure what we scroll
|
||||
Not true - the buttons are categories to be expanded into
|
||||
And clicking one does expand
|
||||
So after we click we have to recalculate their positions
|
||||
|
||||
In AchievementFrameCategoriesContainer we have many buttons which correspond to categories
|
||||
The best way of browsing them that I can see is reading the title of each
|
||||
Since we are only interested in a few
|
||||
AchievementFrameCategoriesContainerButton1 .. n
|
||||
|
||||
The title is the same structure as the achievement title
|
||||
AchievementFrameCategoriesContainerButton1Label (label)
|
||||
Under each button of course
|
||||
|
||||
We can also get the category ID and name from the button frame
|
||||
AchievementFrameCategoriesContainerButton1
|
||||
Under "categoryID" and "name"
|
||||
|
||||
|
||||
[11:20 PM] [Virag's DT]: 23:20:04 INSPECT_ACHIEVEMENT_READY - (2) table: 000001AF07021540
|
||||
Fires when the achievement frame is ready
|
||||
Argument #2 is the GUID of the player
|
||||
None is fired when the frame is closed...
|
||||
I guess we'll have to check each frame we go over
|
||||
|
||||
See
|
||||
canInspect = CanInspect("unit", showError)
|
||||
Arguments:
|
||||
unit - A unit to inspect (string, unitID)
|
||||
showError - True to fire a UI_ERROR_MESSAGE event (causing the default UI to display an error message) if the unit cannot be inspected; otherwise false (boolean)
|
||||
Returns:
|
||||
canInspect - 1 if the unit can be inspected; otherwise nil (1nil)
|
||||
|
||||
Actually nevermind, this seems much easier and simpler:
|
||||
completed, month, day, year = GetAchievementComparisonInfo(achievementID)
|
||||
completed
|
||||
boolean - Returns true/false depending on whether the unit has completed the achievement or not.
|
||||
month
|
||||
number - Month in which the unit has completed the achievement. Returns nil if completed is false.
|
||||
day
|
||||
number - Day of the month in which the unit has completed the achievement. Returns nil if completed is false.
|
||||
year
|
||||
number - Year (two digits, 21st century is assumed) in which the unit has completed the achievement. Returns nil if completed is false.
|
||||
Only accurate after the after SetAchievementComparisonUnit is called and the INSPECT_ACHIEVEMENT_READY event has fired.
|
||||
|
||||
success = SetAchievementComparisonUnit(unit)
|
||||
success
|
||||
boolean - Returns true/false depending on whether the unit is valid.
|
||||
-> INSPECT_ACHIEVEMENT_READY
|
||||
|
||||
522 -- Somebody Likes Me
|
||||
523 -- 5 Exalted Reputations
|
||||
524 -- 10 Exalted Reputations
|
||||
521 -- 15 Exalted Reputations
|
||||
520 -- 20 Exalted Reputations
|
||||
519 -- 25 Exalted Reputations
|
||||
518 -- 30 Exalted Reputations
|
||||
1556 -- 25 Fish
|
||||
1557 -- 50 Fish
|
||||
1558 -- 100 Fish
|
||||
238 -- An Honorable Kill
|
||||
513 -- 100 Honorable Kills
|
||||
515 -- 500 Honorable Kills
|
||||
516 -- 1000 Honorable Kills
|
||||
512 -- 5000 Honorable Kills
|
||||
509 -- 10000 Honorable Kills
|
||||
239 -- 25000 Honorable Kills
|
||||
503 -- 50 Quests Completed
|
||||
504 -- 100 Quests Completed
|
||||
505 -- 250 Quests Completed
|
||||
506 -- 500 Quests Completed
|
||||
507 -- 1000 Quests Completed
|
||||
1017 -- Can I Keep Him?
|
||||
15 -- Plenty of Pets
|
||||
1248 -- Plethora of Pets
|
||||
1250 -- Shop Smart, Shop Pet...Smart
|
||||
2516 -- Lil' Game Hunter
|
||||
5876 -- Petting Zoo
|
||||
11188 -- Broken Isles Explorer
|
||||
11190 -- Broken Isles Pathfinder, Part One
|
||||
11157 -- Loremaster of Legion
|
||||
10763 -- Azsuna Matata
|
||||
10790 -- Vrykul Story, Bro
|
||||
11124 -- Good Suramaritan
|
||||
10059 -- Ain't No Mountain High Enough
|
||||
10698 -- That's Val'sharah Folks!
|
||||
10672 -- Broken Isles Diplomat
|
||||
10665 -- Explore Azsuna
|
||||
10666 -- Explore Val'sharah
|
||||
10667 -- Explore Highmountain
|
||||
10668 -- Explore Stormheim
|
||||
10669 -- Explore Suramar
|
||||
12069 -- Explore Argus
|
||||
2141 -- Stable Keeper
|
||||
2142 -- Filling Up The Barn
|
||||
2143 -- Leading the Cavalry
|
||||
7382 -- Dynamic Duo
|
||||
7383 -- Terrific Trio
|
||||
7384 -- Quintessential Quintet
|
||||
245 -- That Takes Class
|
88
FreshShit/AchievementSniffer/init.lua
Normal file
88
FreshShit/AchievementSniffer/init.lua
Normal file
@@ -0,0 +1,88 @@
|
||||
---@class aura_env
|
||||
---@field achievements table<number, string>
|
||||
---@field Scan fun(playerName: string)
|
||||
|
||||
---@class WeakAurasSaved
|
||||
---@field Cyka table<string, table<string, table<number, string>>>
|
||||
|
||||
if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end
|
||||
if not WeakAurasSaved.Cyka.AchievementSniffer then WeakAurasSaved.Cyka.AchievementSniffer = {} end
|
||||
|
||||
aura_env.achievements = {
|
||||
522, -- Somebody Likes Me
|
||||
523, -- 5 Exalted Reputations
|
||||
524, -- 10 Exalted Reputations
|
||||
521, -- 15 Exalted Reputations
|
||||
520, -- 20 Exalted Reputations
|
||||
519, -- 25 Exalted Reputations
|
||||
518, -- 30 Exalted Reputations
|
||||
1556, -- 25 Fish
|
||||
1557, -- 50 Fish
|
||||
1558, -- 100 Fish
|
||||
238, -- An Honorable Kill
|
||||
513, -- 100 Honorable Kills
|
||||
515, -- 500 Honorable Kills
|
||||
516, -- 1000 Honorable Kills
|
||||
512, -- 5000 Honorable Kills
|
||||
509, -- 10000 Honorable Kills
|
||||
239, -- 25000 Honorable Kills
|
||||
503, -- 50 Quests Completed
|
||||
504, -- 100 Quests Completed
|
||||
505, -- 250 Quests Completed
|
||||
506, -- 500 Quests Completed
|
||||
507, -- 1000 Quests Completed
|
||||
1017, -- Can I Keep Him?
|
||||
15, -- Plenty of Pets
|
||||
1248, -- Plethora of Pets
|
||||
1250, -- Shop Smart, Shop Pet...Smart
|
||||
2516, -- Lil' Game Hunter
|
||||
5876, -- Petting Zoo
|
||||
11188, -- Broken Isles Explorer
|
||||
11190, -- Broken Isles Pathfinder, Part One
|
||||
11157, -- Loremaster of Legion
|
||||
10763, -- Azsuna Matata
|
||||
10790, -- Vrykul Story, Bro
|
||||
11124, -- Good Suramaritan
|
||||
10059, -- Ain't No Mountain High Enough
|
||||
10698, -- That's Val'sharah Folks!
|
||||
10672, -- Broken Isles Diplomat
|
||||
10665, -- Explore Azsuna
|
||||
10666, -- Explore Val'sharah
|
||||
10667, -- Explore Highmountain
|
||||
10668, -- Explore Stormheim
|
||||
10669, -- Explore Suramar
|
||||
12069, -- Explore Argus
|
||||
2141, -- Stable Keeper
|
||||
2142, -- Filling Up The Barn
|
||||
2143, -- Leading the Cavalry
|
||||
7382, -- Dynamic Duo
|
||||
7383, -- Terrific Trio
|
||||
7384, -- Quintessential Quintet
|
||||
245, -- That Takes Class
|
||||
}
|
||||
|
||||
---@param playerName string
|
||||
aura_env.Scan = function(playerName)
|
||||
WeakAurasSaved.Cyka.AchievementSniffer[playerName] = {}
|
||||
for i, aid in ipairs(aura_env.achievements) do
|
||||
local completed, month, day, year = GetAchievementComparisonInfo(aid)
|
||||
local date = ""
|
||||
|
||||
if completed then
|
||||
---@type string
|
||||
local yearstr = "" .. year
|
||||
if year < 100 then yearstr = "20" .. year end
|
||||
|
||||
date = string.format("%04d-%02d-%02d", yearstr, month, day)
|
||||
end
|
||||
|
||||
local data = {
|
||||
id = aid,
|
||||
date = date,
|
||||
completed = completed,
|
||||
}
|
||||
WeakAurasSaved.Cyka.AchievementSniffer[playerName][aid] = data
|
||||
end
|
||||
end
|
||||
|
||||
--/run WeakAurasSaved.Cyka.AchievementSniffer = {}
|
9
FreshShit/AchievementSniffer/scratch.lua
Normal file
9
FreshShit/AchievementSniffer/scratch.lua
Normal file
@@ -0,0 +1,9 @@
|
||||
local year = 20
|
||||
local month = 7
|
||||
local day = 12
|
||||
|
||||
if year < 100 then
|
||||
year = "20" .. year
|
||||
end
|
||||
|
||||
print(string.format("%4d-%02d-%02d", year, month, day))
|
Reference in New Issue
Block a user