From 9fdb7ed718b9a2e393aa3dc5025743169754e011 Mon Sep 17 00:00:00 2001 From: sindoring Date: Sat, 18 Jul 2026 16:54:34 +0400 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MoonWellClient/AchievementFactions.lua | 202 ++++++++++++++++++ .../AddOns/MoonWellClient/MoonWellClient.lua | 4 + .../AddOns/MoonWellClient/MoonWellClient.toc | 1 + 3 files changed, 207 insertions(+) create mode 100644 src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/AchievementFactions.lua diff --git a/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/AchievementFactions.lua b/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/AchievementFactions.lua new file mode 100644 index 0000000..c9b719a --- /dev/null +++ b/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/AchievementFactions.lua @@ -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) diff --git a/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.lua b/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.lua index d6a917a..a904d4d 100644 --- a/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.lua +++ b/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.lua @@ -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 diff --git a/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.toc b/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.toc index e7ac2b3..a859797 100644 --- a/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.toc +++ b/src/Data/ruRU/patch-ruRU-5/Interface/AddOns/MoonWellClient/MoonWellClient.toc @@ -7,4 +7,5 @@ ## DefaultState: Enabled ## X-Hidden: 1 +AchievementFactions.lua MoonWellClient.lua