фикс ачивок

This commit is contained in:
2026-07-18 16:54:34 +04:00
parent 698de84762
commit 9fdb7ed718
3 changed files with 207 additions and 0 deletions
@@ -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
end
local wasTraitor = MoonWell_IsTraitor
MoonWell_IsTraitor = MoonWellIsTraitor() and true or false
if wasTraitor ~= MoonWell_IsTraitor and MoonWellAchievementFaction_Refresh then
MoonWellAchievementFaction_Refresh()
end
RefreshFactionIcons()
return true
end
@@ -7,4 +7,5 @@
## DefaultState: Enabled
## X-Hidden: 1
AchievementFactions.lua
MoonWellClient.lua