фикс ачивок
This commit is contained in:
@@ -0,0 +1,202 @@
|
|||||||
|
-- The MoonWell Achievement.dbc intentionally exposes both faction variants.
|
||||||
|
-- Restore the 3.3.5a client-side faction filter and make traitors use the
|
||||||
|
-- opposite faction. IDs come from the stock ruRU build 12340 DBC.
|
||||||
|
|
||||||
|
local achievementFaction = {}
|
||||||
|
|
||||||
|
local function AddFaction(ids, faction)
|
||||||
|
for id in string.gmatch(ids, "%d+") do
|
||||||
|
achievementFaction[tonumber(id)] = faction
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
AddFaction([[
|
||||||
|
33 34 35 37 41 58 202 203 206 220 225 230 246 388 433 434 435 436 437 438
|
||||||
|
439 440 441 442 470 471 472 473 604 610 611 612 613 614 701 707 709 711 713
|
||||||
|
764 899 907 908 942 948 963 966 969 970 1012 1022 1023 1024 1028 1029 1030
|
||||||
|
1034 1035 1038 1040 1151 1167 1169 1172 1184 1189 1191 1192 1255 1262 1279
|
||||||
|
1466 1563 1656 1676 1678 1681 1684 1686 1692 1697 1707 1737 1752 1757 1762
|
||||||
|
1782 2016 2144 2194 2419 2421 2536 2760 2761 2762 2763 2764 2770 2777 2778
|
||||||
|
2779 2780 2781 2782 2797 2817 3356 3478 3556 3576 3580 3596 3676 3846 3851
|
||||||
|
3856 3857 4156 4296 4298 4436 4784 4786
|
||||||
|
]], "Alliance")
|
||||||
|
|
||||||
|
AddFaction([[
|
||||||
|
224 259 443 444 445 446 447 448 449 450 451 452 453 454 468 469 593 603 615
|
||||||
|
616 617 618 619 700 706 708 710 712 714 762 763 873 901 909 926 943 965 967
|
||||||
|
968 971 1005 1006 1011 1025 1026 1027 1031 1032 1033 1036 1037 1039 1041
|
||||||
|
1164 1168 1170 1173 1175 1203 1251 1252 1271 1272 1273 1274 1280 1356 1357
|
||||||
|
1358 1359 1360 1502 1657 1677 1680 1682 1683 1685 1691 1693 1698 1783 1784
|
||||||
|
2017 2145 2192 2195 2200 2420 2476 2497 2537 2765 2766 2767 2768 2769 2771
|
||||||
|
2776 2783 2784 2785 2786 2787 2788 2798 2816 3357 3557 3577 3581 3597 3656
|
||||||
|
3677 3778 3957 4079 4176 4177 4256 4297 4437 4785 4790
|
||||||
|
]], "Horde")
|
||||||
|
|
||||||
|
local NativeGetAchievementInfo = GetAchievementInfo
|
||||||
|
local NativeGetCategoryNumAchievements = GetCategoryNumAchievements
|
||||||
|
local NativeGetLatestCompletedAchievements = GetLatestCompletedAchievements
|
||||||
|
local NativeGetTrackedAchievements = GetTrackedAchievements
|
||||||
|
local NativeGetNumCompletedAchievements = GetNumCompletedAchievements
|
||||||
|
local NativeGetTotalAchievementPoints = GetTotalAchievementPoints
|
||||||
|
|
||||||
|
local categoryCache = {}
|
||||||
|
local summaryCache = {}
|
||||||
|
|
||||||
|
local function GetDisplayFaction()
|
||||||
|
local faction = UnitFactionGroup("player")
|
||||||
|
if MoonWell_IsTraitor then
|
||||||
|
if faction == "Alliance" then
|
||||||
|
return "Horde"
|
||||||
|
elseif faction == "Horde" then
|
||||||
|
return "Alliance"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return faction
|
||||||
|
end
|
||||||
|
|
||||||
|
local function IsAchievementVisible(id, faction)
|
||||||
|
local requiredFaction = achievementFaction[id]
|
||||||
|
return not requiredFaction or not faction or requiredFaction == faction
|
||||||
|
end
|
||||||
|
|
||||||
|
local function BuildCategory(categoryID, showAll)
|
||||||
|
local faction = GetDisplayFaction()
|
||||||
|
local key = tostring(categoryID) .. ":" .. tostring(showAll and 1 or 0)
|
||||||
|
.. ":" .. tostring(faction) .. ":" .. tostring(MoonWell_IsTraitor)
|
||||||
|
local cached = categoryCache[key]
|
||||||
|
if cached then
|
||||||
|
return cached
|
||||||
|
end
|
||||||
|
|
||||||
|
local nativeCount = NativeGetCategoryNumAchievements(categoryID, showAll)
|
||||||
|
local indices = {}
|
||||||
|
local completed = 0
|
||||||
|
|
||||||
|
for nativeIndex = 1, nativeCount do
|
||||||
|
local id, _, _, isCompleted = NativeGetAchievementInfo(categoryID, nativeIndex)
|
||||||
|
if id and IsAchievementVisible(id, faction) then
|
||||||
|
indices[#indices + 1] = nativeIndex
|
||||||
|
if isCompleted then
|
||||||
|
completed = completed + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
cached = { indices = indices, completed = completed }
|
||||||
|
categoryCache[key] = cached
|
||||||
|
return cached
|
||||||
|
end
|
||||||
|
|
||||||
|
function GetCategoryNumAchievements(categoryID, showAll)
|
||||||
|
local category = BuildCategory(categoryID, showAll)
|
||||||
|
return #category.indices, category.completed
|
||||||
|
end
|
||||||
|
|
||||||
|
function GetAchievementInfo(idOrCategory, achievementIndex)
|
||||||
|
if achievementIndex == nil then
|
||||||
|
return NativeGetAchievementInfo(idOrCategory)
|
||||||
|
end
|
||||||
|
|
||||||
|
local category = BuildCategory(idOrCategory, false)
|
||||||
|
local nativeIndex = category.indices[achievementIndex]
|
||||||
|
if not nativeIndex then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
return NativeGetAchievementInfo(idOrCategory, nativeIndex)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function BuildSummary()
|
||||||
|
local faction = GetDisplayFaction()
|
||||||
|
local key = tostring(faction) .. ":" .. tostring(MoonWell_IsTraitor)
|
||||||
|
local cached = summaryCache[key]
|
||||||
|
if cached then
|
||||||
|
return cached
|
||||||
|
end
|
||||||
|
|
||||||
|
local total, completed = NativeGetNumCompletedAchievements()
|
||||||
|
local points = NativeGetTotalAchievementPoints()
|
||||||
|
local statisticFlag = ACHIEVEMENT_FLAGS_STATISTIC or 0x00000001
|
||||||
|
local hiddenFlag = ACHIEVEMENT_FLAGS_HIDDEN or 0x00000002
|
||||||
|
|
||||||
|
for id, requiredFaction in pairs(achievementFaction) do
|
||||||
|
if faction and requiredFaction ~= faction then
|
||||||
|
local _, _, achievementPoints, isCompleted, _, _, _, _, flags =
|
||||||
|
NativeGetAchievementInfo(id)
|
||||||
|
if flags and bit.band(flags, statisticFlag) == 0 then
|
||||||
|
local isHidden = bit.band(flags, hiddenFlag) ~= 0
|
||||||
|
if not isHidden or isCompleted then
|
||||||
|
total = total - 1
|
||||||
|
end
|
||||||
|
if isCompleted then
|
||||||
|
completed = completed - 1
|
||||||
|
points = points - (achievementPoints or 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
cached = { total = total, completed = completed, points = points }
|
||||||
|
summaryCache[key] = cached
|
||||||
|
return cached
|
||||||
|
end
|
||||||
|
|
||||||
|
function GetNumCompletedAchievements()
|
||||||
|
local summary = BuildSummary()
|
||||||
|
return summary.total, summary.completed
|
||||||
|
end
|
||||||
|
|
||||||
|
function GetTotalAchievementPoints()
|
||||||
|
return BuildSummary().points
|
||||||
|
end
|
||||||
|
|
||||||
|
local function FilterAchievementIDs(getter)
|
||||||
|
local faction = GetDisplayFaction()
|
||||||
|
local source = { getter() }
|
||||||
|
local filtered = {}
|
||||||
|
for i = 1, #source do
|
||||||
|
if IsAchievementVisible(source[i], faction) then
|
||||||
|
filtered[#filtered + 1] = source[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return unpack(filtered)
|
||||||
|
end
|
||||||
|
|
||||||
|
if NativeGetLatestCompletedAchievements then
|
||||||
|
function GetLatestCompletedAchievements()
|
||||||
|
return FilterAchievementIDs(NativeGetLatestCompletedAchievements)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if NativeGetTrackedAchievements then
|
||||||
|
function GetTrackedAchievements()
|
||||||
|
return FilterAchievementIDs(NativeGetTrackedAchievements)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function MoonWellAchievementFaction_Refresh()
|
||||||
|
categoryCache = {}
|
||||||
|
summaryCache = {}
|
||||||
|
if AchievementFrame and AchievementFrame:IsShown() then
|
||||||
|
if AchievementFrameCategories_Update then
|
||||||
|
AchievementFrameCategories_Update()
|
||||||
|
end
|
||||||
|
if AchievementFrameAchievements_ForceUpdate then
|
||||||
|
AchievementFrameAchievements_ForceUpdate()
|
||||||
|
elseif AchievementFrameAchievements_Update then
|
||||||
|
AchievementFrameAchievements_Update()
|
||||||
|
end
|
||||||
|
if AchievementFrameSummary_Update then
|
||||||
|
AchievementFrameSummary_Update()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local events = CreateFrame("Frame")
|
||||||
|
events:RegisterEvent("ACHIEVEMENT_EARNED")
|
||||||
|
events:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
events:RegisterEvent("UNIT_FACTION")
|
||||||
|
events:SetScript("OnEvent", function(self, event, unit)
|
||||||
|
if event ~= "UNIT_FACTION" or unit == "player" then
|
||||||
|
MoonWellAchievementFaction_Refresh()
|
||||||
|
end
|
||||||
|
end)
|
||||||
@@ -50,7 +50,11 @@ local function ReadNativeGameMode()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local wasTraitor = MoonWell_IsTraitor
|
||||||
MoonWell_IsTraitor = MoonWellIsTraitor() and true or false
|
MoonWell_IsTraitor = MoonWellIsTraitor() and true or false
|
||||||
|
if wasTraitor ~= MoonWell_IsTraitor and MoonWellAchievementFaction_Refresh then
|
||||||
|
MoonWellAchievementFaction_Refresh()
|
||||||
|
end
|
||||||
RefreshFactionIcons()
|
RefreshFactionIcons()
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,4 +7,5 @@
|
|||||||
## DefaultState: Enabled
|
## DefaultState: Enabled
|
||||||
## X-Hidden: 1
|
## X-Hidden: 1
|
||||||
|
|
||||||
|
AchievementFactions.lua
|
||||||
MoonWellClient.lua
|
MoonWellClient.lua
|
||||||
|
|||||||
Reference in New Issue
Block a user