Загрузить файлы в «/»
This commit is contained in:
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
## Title: Ade Alts
|
## Title: Ade Alts
|
||||||
## Notes: Alt manager: cooldowns, inventory, bank, gear, professions and missing recipes of all your characters. /ade
|
## Notes: Alt manager: cooldowns, inventory, bank, gear, professions and missing recipes of all your characters. /ade
|
||||||
## Author: Ade
|
## Author: Ade
|
||||||
## Version: 1.2.4
|
## Version: 1.2.5
|
||||||
## SavedVariables: AdeAltsDB, ProfCDTrackerDB
|
## SavedVariables: AdeAltsDB, ProfCDTrackerDB
|
||||||
## OptionalDeps: pfUI, SuperWoW, nampower
|
## OptionalDeps: pfUI, SuperWoW, nampower
|
||||||
core.lua
|
core.lua
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 1.2.5
|
||||||
|
- Item tooltips now show how many of the item your other alts carry (bags / bank, per alt).
|
||||||
|
- Fixed: alt info could be added twice to a tooltip.
|
||||||
|
|
||||||
## 1.2.4
|
## 1.2.4
|
||||||
- Fixed: recipe items whose name differs from the crafted item (e.g. Pattern: Guardian Bracers -> Guardian Leather Bracers) showed no alt info. Recipes are now identified by item id.
|
- Fixed: recipe items whose name differs from the crafted item (e.g. Pattern: Guardian Bracers -> Guardian Leather Bracers) showed no alt info. Recipes are now identified by item id.
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ including those on **other accounts**, and shows it in one window.
|
|||||||
|
|
||||||
- **Profession cooldowns** – Salt Shaker, Transmutes, Mooncloth; "ready" popup at login.
|
- **Profession cooldowns** – Salt Shaker, Transmutes, Mooncloth; "ready" popup at login.
|
||||||
- **Alt list** – level, class icon, sorted by level or name.
|
- **Alt list** – level, class icon, sorted by level or name.
|
||||||
|
- **Item tooltips** show how many of the item your other alts carry (bags / bank).
|
||||||
- **Inventory and bank** of every alt, with each bag and its used/total slots, plus **item search** across all of them.
|
- **Inventory and bank** of every alt, with each bag and its used/total slots, plus **item search** across all of them.
|
||||||
- **Total gold** of all alts.
|
- **Total gold** of all alts.
|
||||||
- **Professions** – skill levels, known and **missing recipes** with required level and source (trainer, vendor, drop, quest...), sortable, with tooltips. Recipe items also show which of your alts can learn them.
|
- **Professions** – skill levels, known and **missing recipes** with required level and source (trainer, vendor, drop, quest...), sortable, with tooltips. Recipe items also show which of your alts can learn them, and every item tooltip shows how many of it your other alts carry.
|
||||||
- **Equipped gear** of every alt.
|
- **Equipped gear** of every alt.
|
||||||
- **Minimap button** – docks into pfUI's addon button panel automatically.
|
- **Minimap button** – docks into pfUI's addon button panel automatically.
|
||||||
- **Settings** – window scale, width, height, background opacity, background colour, cooldown-window opacity.
|
- **Settings** – window scale, width, height, background opacity, background colour, cooldown-window opacity.
|
||||||
@@ -56,6 +57,7 @@ Every alias works the same: `/ade`, `/adealts`, `/pcd`, `/profcd`, `/cdt`.
|
|||||||
| `/ade reset` | Set all cooldowns of the current character to Ready |
|
| `/ade reset` | Set all cooldowns of the current character to Ready |
|
||||||
| `/ade del <name>` | Remove a cached character and ignore it from now on, so chat / shared-file sync cannot bring it back (not the one you are logged in on) |
|
| `/ade del <name>` | Remove a cached character and ignore it from now on, so chat / shared-file sync cannot bring it back (not the one you are logged in on) |
|
||||||
| `/ade unignore <name>` | Stop ignoring a character removed with `del` |
|
| `/ade unignore <name>` | Stop ignoring a character removed with `del` |
|
||||||
|
| `/ade counts` | Turn the "On alts: N" item amounts in item tooltips on / off |
|
||||||
| `/ade chat` | Turn guild / party / raid addon-message sync on or off (**off by default**; SuperWoW file sync is unaffected) |
|
| `/ade chat` | Turn guild / party / raid addon-message sync on or off (**off by default**; SuperWoW file sync is unaffected) |
|
||||||
|
|
||||||
## How data is shared
|
## How data is shared
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ local AA = AdeAlts
|
|||||||
-- Command: /pcd Minimap button: auto-docked by pfUI's addon button panel.
|
-- Command: /pcd Minimap button: auto-docked by pfUI's addon button panel.
|
||||||
|
|
||||||
AA.ADDON = "AdeAlts"
|
AA.ADDON = "AdeAlts"
|
||||||
AA.VERSION = "1.2.4"
|
AA.VERSION = "1.2.5"
|
||||||
AA.PREFIX = "PCDT"
|
AA.PREFIX = "PCDT"
|
||||||
AA.DAY = 86400
|
AA.DAY = 86400
|
||||||
AA.RDATA = {} -- recipe database, filled by the data_*.lua files
|
AA.RDATA = {} -- recipe database, filled by the data_*.lua files
|
||||||
|
|||||||
+147
-35
@@ -31,44 +31,156 @@ local function FindHits(tt)
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function AA.EnhanceTooltip(tt)
|
-- item id of the tooltip (from the item link, or an "ItemID: n" line added by another addon)
|
||||||
if not AA.db or not AA.RIndex or tt.adeDone then return end
|
local function ItemId(tt)
|
||||||
local hits = FindHits(tt)
|
if tt.adeLink then
|
||||||
if not hits then return end
|
local _, _, id = string.find(tt.adeLink, "item:(%d+)")
|
||||||
tt.adeDone = true
|
if id then return tonumber(id) end
|
||||||
local added = false
|
end
|
||||||
for _, h in ipairs(hits) do
|
local name = tt:GetName()
|
||||||
local key = string.lower(h.c[2])
|
for i = 1, tt:NumLines() do
|
||||||
for _, k in ipairs(AA.SortedAlts()) do
|
local fs = getglobal(name .. "TextLeft" .. i)
|
||||||
local ch = AA.db.chars[k]
|
local txt = fs and fs:GetText()
|
||||||
local p = ch and ch.prof and ch.prof[h.prof]
|
local _, _, id = string.find(txt or "", "ItemID: (%d+)")
|
||||||
if p then
|
if id then return tonumber(id) end
|
||||||
if not added then
|
end
|
||||||
tt:AddLine(" ")
|
return nil
|
||||||
tt:AddLine("Ade Alts", 0.2, 1, 0.8)
|
end
|
||||||
added = true
|
|
||||||
end
|
-- how many of the item the other alts carry: total, {{name, class, bags, bank}, ...}
|
||||||
local col = "|cff" .. AA.ClassHex(ch.class)
|
local function CountOnAlts(id)
|
||||||
local label
|
local total, rows = 0, {}
|
||||||
if not p.rec then
|
for _, k in ipairs(AA.SortedAlts()) do
|
||||||
label = "|cff808080" .. h.prof .. " recipes not scanned|r"
|
local c = AA.db.chars[k]
|
||||||
else
|
if c and k ~= AA.myKey then
|
||||||
local has = false
|
local nb, nk = 0, 0
|
||||||
for _, n in ipairs(p.rec) do
|
for _, e in ipairs(c.inv or {}) do if e[1] == id then nb = nb + e[2] end end
|
||||||
if string.lower(n) == key then has = true; break end
|
for _, e in ipairs(c.bank or {}) do if e[1] == id then nk = nk + e[2] end end
|
||||||
end
|
if nb + nk > 0 then
|
||||||
if has then
|
total = total + nb + nk
|
||||||
label = "|cff808080already known|r"
|
table.insert(rows, { c = c, bags = nb, bank = nk })
|
||||||
elseif h.c[3] > (p.r or 0) then
|
|
||||||
label = "|cffff6060needs " .. h.prof .. " " .. h.c[3] .. " (has " .. (p.r or 0) .. ")|r"
|
|
||||||
else
|
|
||||||
label = "|cff40ff40can learn now|r"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
tt:AddDoubleLine(col .. ch.name .. "|r", label)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return total, rows
|
||||||
|
end
|
||||||
|
|
||||||
|
-- item id of the tooltip (item link, or an "ItemID: n" line some addons add)
|
||||||
|
local function TipItemId(tt)
|
||||||
|
if tt.adeLink then
|
||||||
|
local _, _, id = string.find(tt.adeLink, "item:(%d+)")
|
||||||
|
if id then return tonumber(id) end
|
||||||
|
end
|
||||||
|
local name = tt:GetName()
|
||||||
|
for i = 1, tt:NumLines() do
|
||||||
|
local fs = getglobal(name .. "TextLeft" .. i)
|
||||||
|
local txt = fs and fs:GetText()
|
||||||
|
if txt then
|
||||||
|
local _, _, id = string.find(txt, "ItemID: (%d+)")
|
||||||
|
if id then return tonumber(id) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function HasHeader(tt)
|
||||||
|
local name = tt:GetName()
|
||||||
|
for i = 1, tt:NumLines() do
|
||||||
|
local fs = getglobal(name .. "TextLeft" .. i)
|
||||||
|
if fs and fs:GetText() == "Ade Alts" then return true end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CountIn(list, id)
|
||||||
|
if not list then return 0 end
|
||||||
|
for _, e in ipairs(list) do
|
||||||
|
if e[1] == id then return e[2] or 0 end
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function AA.EnhanceTooltip(tt)
|
||||||
|
if not AA.db or not AA.RIndex or tt.adeDone then return end
|
||||||
|
if HasHeader(tt) then tt.adeDone = true; return end
|
||||||
|
local added = false
|
||||||
|
local function header()
|
||||||
|
if not added then
|
||||||
|
tt:AddLine(" ")
|
||||||
|
tt:AddLine("Ade Alts", 0.2, 1, 0.8)
|
||||||
|
added = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 1) recipe items: which alts know / can learn the recipe
|
||||||
|
local hits = FindHits(tt)
|
||||||
|
if hits then
|
||||||
|
local done = {}
|
||||||
|
for _, h in ipairs(hits) do
|
||||||
|
local key = string.lower(h.c[2])
|
||||||
|
if not done[h.prof .. "|" .. key] then
|
||||||
|
done[h.prof .. "|" .. key] = true
|
||||||
|
for _, k in ipairs(AA.SortedAlts()) do
|
||||||
|
local ch = AA.db.chars[k]
|
||||||
|
local p = ch and ch.prof and ch.prof[h.prof]
|
||||||
|
if p then
|
||||||
|
header()
|
||||||
|
local col = "|cff" .. AA.ClassHex(ch.class)
|
||||||
|
local label
|
||||||
|
if not p.rec then
|
||||||
|
label = "|cff808080" .. h.prof .. " recipes not scanned|r"
|
||||||
|
else
|
||||||
|
local has = false
|
||||||
|
for _, n in ipairs(p.rec) do
|
||||||
|
if string.lower(n) == key then has = true; break end
|
||||||
|
end
|
||||||
|
if has then
|
||||||
|
label = "|cff808080already known|r"
|
||||||
|
elseif h.c[3] > (p.r or 0) then
|
||||||
|
label = "|cffff6060needs " .. h.prof .. " " .. h.c[3] .. " (has " .. (p.r or 0) .. ")|r"
|
||||||
|
else
|
||||||
|
label = "|cff40ff40can learn now|r"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
tt:AddDoubleLine(col .. ch.name .. "|r", label)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 2) how many of the item the other alts carry (bags + bank)
|
||||||
|
local id = TipItemId(tt)
|
||||||
|
if id then
|
||||||
|
local rows, total = {}, 0
|
||||||
|
for _, k in ipairs(AA.SortedAlts()) do
|
||||||
|
if k ~= AA.myKey then
|
||||||
|
local ch = AA.db.chars[k]
|
||||||
|
local nb, nk = CountIn(ch.inv, id), CountIn(ch.bank, id)
|
||||||
|
if nb + nk > 0 then
|
||||||
|
table.insert(rows, { ch = ch, b = nb, k = nk })
|
||||||
|
total = total + nb + nk
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if table.getn(rows) > 0 then
|
||||||
|
table.sort(rows, function(x, y) return (x.b + x.k) > (y.b + y.k) end)
|
||||||
|
header()
|
||||||
|
tt:AddDoubleLine("On alts:", "|cffffffff" .. total .. "|r")
|
||||||
|
for i, r in ipairs(rows) do
|
||||||
|
if i > 10 then
|
||||||
|
tt:AddLine(" ... and " .. (table.getn(rows) - 10) .. " more", 0.6, 0.6, 0.6)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
local parts = {}
|
||||||
|
if r.b > 0 then table.insert(parts, "bags " .. r.b) end
|
||||||
|
if r.k > 0 then table.insert(parts, "bank " .. r.k) end
|
||||||
|
tt:AddDoubleLine(" |cff" .. AA.ClassHex(r.ch.class) .. r.ch.name .. "|r", "|cffc0c0c0" .. table.concat(parts, ", ") .. "|r")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
tt.adeDone = true
|
||||||
if added then tt:Show() end
|
if added then tt:Show() end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user