local GetTime = QuestHelper_GetTime QuestHelper_File["manager_achievement.lua"] = "4.0.1.$svnversion$" QuestHelper_Loadtime["manager_achievement.lua"] = GetTime() local AchievementDB -- 0 is a monster kill, asset is the monster ID --X 1 is winning PvP objectives in a thorough manner (holding all bases, controlling all flags) --X 7 is weapon skill, asset is probably a skill ID of some sort --X 8 is another achievement, asset is achievement ID --X 9 is completing quests globally --X 10 is completing a daily quest every day --X 11 is completing quests in specific areas --X 14 is completing daily quests -- 27 is a quest, asset is quest ID --X 28 is getting a spell cast on you, asset is a spell ID --X 29 is casting a spell (often crafting), asset is a spell ID --X 30 is PvP objectives (flags, assaulting, defending) --X 31 is PvP kills in battleground PvP locations --X 32 is winning ranked arena matches in specific locations (asset is probably a location ID) --X 34 is the Squashling (owning a specific pet?), asset is the spell ID --X 35 is PvP kills while under the influence of something --X 36 is acquiring items (soulbound), asset is an item ID --X 37 is winning arenas --X 41 is eating or drinking a specific item, asset is item ID --X 42 is fishing things up, asset is item ID -- 43 is exploration, asset is a location ID? --X 45 is purchasing 7 bank slots --X 46 is exalted rep, asset is presumably some kind of faction ID --X 47 is 5 reputations to exalted --X 49 is equipping items, asset is a slot ID (quality is presumably encoded into flags) --X 52 is killing specific classes of player --X 53 is kill-a-given-race, asset is race ID? -- 54 is using emotes on targets, asset ID is likely the emote ID --X 56 is being a wrecking ball in Alterac Valley --X 62 is getting gold from quest rewards --X 67 is looting gold -- 68 is reading books -- 70 is killing players in world PvP locations -- 72 is fishing things from schools or wreckage --X 73 is killing Mal'Ganis on Heroic. Why? Who can say. --X 75 is obtaining mounts -- 109 is fishing, either in general or in specific locations -- 110 is casting spells on specific targets, asset ID is the spell ID --X 112 is learning cooking recipes --X 113 is honorable kills local achievement_type_blacklist = {} for _, v in pairs({1, 7, 8, 9, 10, 11, 14, 28, 29, 30, 31, 32, 34, 35, 36, 37, 41, 42, 46, 47, 49, 52, 53, 56, 62, 67, 73, 75, 112, 113}) do achievement_type_blacklist[v] = true end local achievement_list = {} --local crittypes = {} --QuestHelper_ZorbaForgotToRemoveThis = {} local qhdinfo = false local qhdinfodump = {} local function qhadumpy() for k, v in pairs(qhdinfodump) do local ct = 0 local some for tk, tv in pairs(v) do ct = ct + 1 some = tk end QuestHelper:TextOut(string.format("%d: %d, %s", k, ct, some)) end end local function registerAchievement(id) --if db.achievements[id] then return end QuestHelper: Assert(id) if id < 0 then return end -- stupid underachiever local _, title, _, complete = GetAchievementInfo(id) --QuestHelper:TextOut(string.format("Registering %d (%s)", id, title)) local prev = GetPreviousAchievement(id) local record = false --[[ db.achievements[id] = { previous = prev, compete = complete, name = title, criterialist = {} } local dbi = db.achievements[id] ]] if prev then registerAchievement(prev) end local critcount = GetAchievementNumCriteria(id) if critcount == 0 then record = true end for i = 1, critcount do local crit_name, crit_type, crit_complete, crit_quantity, crit_reqquantity, _, _, crit_asset, _, crit_id = GetAchievementCriteriaInfo(id, i) if qhdinfo and not achievement_type_blacklist[crit_type] then if not qhdinfodump[crit_type] then qhdinfodump[crit_type] = {} end qhdinfodump[crit_type][title .. " --- " .. crit_name] = true end --[[ table.insert(dbi.criterialist, crit_id) ass ert (not db.criteria[crit_id]) crittypes[crit_type] = (crittypes[crit_type] or 0) + 1]] if not achievement_type_blacklist[crit_type] then record = true end --[[ db.criteria[crit_id] = { name = crit_name, type = crit_type, complete = crit_complete, progress = crit_quantity, progress_total = crit_reqquantity, asset = crit_asset, }]] end if record then achievement_list[id] = true end end local function createAchievementList() for _, catid in pairs(GetCategoryList()) do for d = 1, GetCategoryNumAchievements(catid) do --if GetAchievementInfo(catid, d) == 2557 then print("loading tffs") end --if GetAchievementInfo(catid, d) == 1312 then print("loading otot") end registerAchievement(GetAchievementInfo(catid, d), db) ----[[ assert(AchievementDB.achievements[2557]) ]] ----[[ assert(AchievementDB.achievements[1312]) ]] -- what what end end end qh_cal = createAchievementList local achievement_stop_time = 0 local GetAchievementInfo = GetAchievementInfo local GetAchievementNumCriteria = GetAchievementNumCriteria local GetAchievementCriteriaInfo = GetAchievementCriteriaInfo local function retrieveAchievement(id, db) QH_Timeslice_Yield() local _, _, _, complete = GetAchievementInfo(id) --QuestHelper:TextOut(string.format("Registering %d (%s)", id, title)) db.achievements[id] = QuestHelper:CreateTable("collect_achievement achievement") db.achievements[id].complete = complete local dbi = db.achievements[id] local critcount = GetAchievementNumCriteria(id) QuestHelper: Assert(critcount, "critcount nil " .. tostring(id)) --QuestHelper:TextOut(string.format("%d criteria", crit)) for i = 1, critcount do QuestHelper: Assert(not db.criteria[crit_id]) local _, _, crit_complete, crit_quantity, crit_reqquantity, _, _, _, _, crit_id = GetAchievementCriteriaInfo(id, i) db.criteria[crit_id] = QuestHelper:CreateTable("collect_achievement criteria") db.criteria[crit_id].complete = crit_complete db.criteria[crit_id].progress = crit_quantity db.criteria[crit_id].parent = id end end local function getAchievementDB() local db = {} db.achievements = {} db.criteria = {} local ct = 0 for k in pairs(achievement_list) do retrieveAchievement(k, db) ct = ct + 1 end --QuestHelper: TextOut(tostring(ct)) return db end local registered = {} local prescan = {} function QH_AchievementManagerRegister(funky) -- I am imagining "funky" being said in the same tone of voice that "spicy" is in Puzzle Pirates table.insert(registered, funky) end function QH_AchievementManagerRegister_Prescan(funky) table.insert(prescan, funky) end local updating = false local updating_continue = false local function ScanAchievements() while updating_continue do updating_continue = false for _, v in ipairs(prescan) do v() end local old = AchievementDB local new = getAchievementDB() for _, v in ipairs(registered) do v(old, new) end AchievementDB = new for k, v in pairs(old.achievements) do QuestHelper:ReleaseTable(v) end for k, v in pairs(old.criteria) do QuestHelper:ReleaseTable(v) end end updating = false end local function OnEvent() --print("oe", updating, AchievementDB) if not updating and AchievementDB then --print("cutea") QH_Timeslice_Add(ScanAchievements, "criteria") updating = true end updating_continue = true end --qhaach = OnEvent QH_Event("CRITERIA_UPDATE", OnEvent) QH_Event("ACHIEVEMENT_EARNED", OnEvent) function QH_AchievementManagerRegister_Poke() OnEvent() end function QH_AchievementManager_Init() createAchievementList() AchievementDB = getAchievementDB() -- 'coz we're lazy ----[[ assert(AchievementDB.achievements[2556]) ]] ----[[ assert(AchievementDB.achievements[2557]) ]] ----[[ assert(AchievementDB.achievements[1312]) ]] -- what what for _, v in ipairs(registered) do -- basically initting everything linked to this v(AchievementDB, AchievementDB) end end if QuestHelper_File["manager_achievement.lua"] == "Development Version" then -- woop woop woop -- runnin' around like a headless chicken -- collidin' with walls -- fallin' over backwards, waving arms wildly -- little bit of drool -- you know how it goes local the_data local function eatAchievement(id) local _, title, _, complete = GetAchievementInfo(id) --QuestHelper:TextOut(string.format("Registering %d (%s)", id, title)) local prev = GetPreviousAchievement(id) local record = false if prev then registerAchievement(prev) end local critcount = GetAchievementNumCriteria(id) the_data[id] = {name = title} for i = 1, critcount do local _, crit_type, _, _, _, _, _, crit_asset, _, crit_id = GetAchievementCriteriaInfo(id, i) table.insert(the_data[id], {cid = crit_id, type = crit_type, asset = crit_asset}) end end function dump_the_data_zorba_needs() the_data = {} QuestHelper_Errors.achievement_cruft = the_data for _, catid in pairs(GetCategoryList()) do for d = 1, GetCategoryNumAchievements(catid) do eatAchievement(GetAchievementInfo(catid, d)) end end end function dump_crits(id) local critcount = GetAchievementNumCriteria(id) print(string.format("%d criteria (%s)", critcount, tostring(achievement_list[id]))) for i = 1, critcount do local _, crit_type = GetAchievementCriteriaInfo(id, i) print(string.format("%d: %d", i, crit_type)) end end end