From fece5d41488dd47ad931611db6ff9c8c3a49c970 Mon Sep 17 00:00:00 2001 From: Lacustat Date: Sun, 1 Nov 2026 09:51:50 +0100 Subject: [PATCH] 0.1.218: Mail: Posteingang in 7er-Paketen mit Ladebalken (Absturz bei viel Post) Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_016onJCSHLwhs9udhC9ZLzk9 --- Freewood-OctoWoW-Mail.toc | 2 +- Locales.lua | 4 ++++ Mail.lua | 46 +++++++++++++++++++++++++++++++++++++-- MailUI.lua | 30 +++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/Freewood-OctoWoW-Mail.toc b/Freewood-OctoWoW-Mail.toc index 20d55d1..ae43227 100644 --- a/Freewood-OctoWoW-Mail.toc +++ b/Freewood-OctoWoW-Mail.toc @@ -3,7 +3,7 @@ ## Notes: Own mailbox window: open all or selected mails safely, recent recipients, mailing lists with automatic sending, multi-item mails, gold surplus and cash on delivery. ## Notes-deDE: Eigenes Briefkasten-Fenster: alles oder Ausgewähltes sicher öffnen, letzte Empfänger, Mailinglisten mit Automatik, mehrere Items, Gold-Überschuss und Nachnahme. ## Author: Lacustat -## Version: 0.1.217 +## Version: 0.1.218 ## Dependencies: Freewood-OctoWoW-Core ## OptionalDeps: Freewood-OctoWoW-Creator, Freewood-OctoWoW-Brett diff --git a/Locales.lua b/Locales.lua index b913ea2..759a590 100644 --- a/Locales.lua +++ b/Locales.lua @@ -22,6 +22,8 @@ FW:AddLocale("enUS", { MAIL_SELECT_ALL = "Select all", MAIL_SELECT_NONE = "Select none", MAIL_INBOX_EMPTY = "The inbox is empty.", + MAIL_LOADING = "Fetching mail ... %d / %d", + MAIL_LOADING_WAIT = "The mail is still being fetched. Please wait a moment.", MAIL_ROW_GOLD = "Gold: %s", MAIL_ROW_COD = "Cash on delivery: %s (not taken)", MAIL_ROW_LETTER = "Letter only (not touched)", @@ -177,6 +179,8 @@ FW:AddLocale("deDE", { MAIL_SELECT_ALL = "Alle auswählen", MAIL_SELECT_NONE = "Keine auswählen", MAIL_INBOX_EMPTY = "Der Posteingang ist leer.", + MAIL_LOADING = "Post wird geholt ... %d / %d", + MAIL_LOADING_WAIT = "Die Post wird noch geholt. Bitte einen Moment warten.", MAIL_ROW_GOLD = "Gold: %s", MAIL_ROW_COD = "Nachnahme: %s (wird nicht genommen)", MAIL_ROW_LETTER = "Nur ein Brief (bleibt unberührt)", diff --git a/Mail.lua b/Mail.lua index 5b9d37f..f0f6b27 100644 --- a/Mail.lua +++ b/Mail.lua @@ -230,11 +230,49 @@ end ------------------------------------------------------------------------ -- Liste der Briefe: { i, sender, subject, money, cod, days, hasItem, itemName, itemTex, itemCount, sig, key, take, why } +-- Grosse Postfaecher werden in Haeppchen eingelesen (wie die Seiten des Spiels: 7 je Schritt, mit Pause), sonst haengt der Client. +local CHUNK, LOAD_GAP = 7, 0.45 + +local function InboxCount() + if not GetInboxNumItems then return 0 end + local ok, n = pcall(GetInboxNumItems) + return (ok and tonumber(n)) or 0 +end +Mail.InboxCount = InboxCount + +-- Rueckgabe: laedt noch?, geladen, gesamt +function Mail.Loading() + local n = InboxCount() + if n <= CHUNK then return false, n, n end + local L = math.min(n, Mail.loadedN or CHUNK) + return L < n, L, n +end + +function Mail:StartLoader() + if not self.loader then + self.loader = CreateFrame("Frame") + local acc = 0 + self.loader:SetScript("OnUpdate", function(f, elapsed) + acc = acc + (elapsed or 0) + if acc < LOAD_GAP then return end + acc = 0 + if not Mail.open then f:Hide() return end + local loading = Mail.Loading() + if loading then + Mail.loadedN = (Mail.loadedN or CHUNK) + CHUNK + FW:Fire("MAIL_INBOX_CHANGED") + end + if not Mail.Loading() then f:Hide() FW:Fire("MAIL_INBOX_CHANGED") end + end) + end + if Mail.Loading() then self.loader:Show() else self.loader:Hide() end +end + function Mail.ReadInbox() local list = {} if not GetInboxNumItems then return list end - local ok, n = pcall(GetInboxNumItems) - n = (ok and tonumber(n)) or 0 + local n = InboxCount() + if n > CHUNK then n = math.min(n, Mail.loadedN or CHUNK) end local seen = {} for i = 1, n do local ok1, _, _, sender, subject, money, cod, days, hasItem, wasRead, wasReturned, _, canReply = pcall(GetInboxHeaderInfo, i) @@ -541,6 +579,7 @@ end -- onlySelected: nur angehakte Briefe function Mail:StartOpen(onlySelected) if self.busy or not self.open then return false end + if Mail.Loading() then Say(FW.L.MAIL_LOADING_WAIT) return false end local only if onlySelected then only = {} @@ -1005,6 +1044,8 @@ function Mail:OnMailShow() self.gen = self.gen + 1 self.boardTries, self.boardAutoAt, self.boardSending = 0, nil, nil self.selected = {} + self.loadedN = CHUNK + self:StartLoader() self:ApplyReplace() Trace("Briefkasten geoeffnet") if self.Replacing() then FW:Fire("MAIL_WINDOW_SHOW") end @@ -1023,6 +1064,7 @@ end function Mail:OnInboxUpdate() if self.run then self.run.updated = true end + if self.open and Mail.Loading() and (not self.loader or not self.loader:IsShown()) then self:StartLoader() end FW:Fire("MAIL_INBOX_CHANGED") end diff --git a/MailUI.lua b/MailUI.lua index eabe4f9..372d4cf 100644 --- a/MailUI.lua +++ b/MailUI.lua @@ -317,6 +317,28 @@ local function BuildInbox(parent) f.scroll:SetPoint("TOPLEFT", f, "TOPLEFT", 0, -70) f.scroll:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 0, 36) f.scroll:SetWidth(LIST_W) + -- Ladebalken ueber dem Postfach, solange grosse Postfaecher in Haeppchen geholt werden + f.load = CreateFrame("Frame", nil, f) + f.load:SetPoint("TOPLEFT", f, "TOPLEFT", 0, -70) + f.load:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 0, 36) + f.load:SetWidth(LIST_W) + f.load:SetFrameLevel((f.scroll:GetFrameLevel() or 1) + 20) + f.load:EnableMouse(true) + f.load.bg = f.load:CreateTexture(nil, "BACKGROUND") + f.load.bg:SetAllPoints(f.load) + f.load.bg:SetColorTexture(0.02, 0.02, 0.04, 0.82) + f.load.text = UI.CreateLabel(f.load, "", { size = 12, color = "goldLight", justify = "CENTER" }) + f.load.text:SetPoint("CENTER", f.load, "CENTER", 0, 14) + f.load.track = f.load:CreateTexture(nil, "ARTWORK") + f.load.track:SetPoint("CENTER", f.load, "CENTER", 0, -8) + f.load.track:SetWidth(LIST_W - 40) + f.load.track:SetHeight(10) + f.load.track:SetColorTexture(0.15, 0.13, 0.08, 1) + f.load.fill = f.load:CreateTexture(nil, "OVERLAY") + f.load.fill:SetPoint("LEFT", f.load.track, "LEFT", 0, 0) + f.load.fill:SetHeight(10) + f.load.fill:SetColorTexture(0.9, 0.7, 0.25, 1) + f.load:Hide() f.empty = UI.CreateLabel(f.scroll.child, T("MAIL_INBOX_EMPTY"), { size = 12, color = "textDim" }) f.empty:SetPoint("TOPLEFT", f.scroll.child, "TOPLEFT", 4, -6) @@ -546,6 +568,14 @@ local function BuildInbox(parent) end function f.Refresh() + local loading, done, total = Mail.Loading() + if loading then + f.load.text:SetText(string.format(T("MAIL_LOADING"), done, total)) + f.load.fill:SetWidth(math.max(1, (LIST_W - 40) * done / math.max(total, 1))) + f.load:Show() + else + f.load:Hide() + end local list = Mail.ReadInbox() local busy = Mail.busy local takeable = 0