32 Commits
Author SHA1 Message Date
Brues 721ecce59d Remove RegisterNewModule call for loothistory 2026-07-13 00:32:21 -05:00
Brues 73b409fb88 Route slash registration through pfUI.api.RegisterSlashCommand
The RegisterSlashCommand helper in api/api.lua was effectively unused
(only macrotweak called it); every other command hand-rolled the
SLASH_*/SlashCmdList pair. Convert the existing manual registrations to
the helper with force=true, preserving the current always-bind behavior
while centralizing the pattern behind one code path (and its _G. and
conflict-check handling).

Left as-is: pfUI.lua's /rl, /pfui, /gm (registered before api.lua
defines the helper) and the vendored libs' debug commands.
2026-07-13 00:06:20 -05:00
Brues 0665764610 cleanup 2026-07-12 15:22:57 -05:00
Brues 3faf06141f Skin Arena Frame 2026-07-12 14:49:17 -05:00
Brues 0c06401ec4 Simplify GUI toggle logic 2026-07-12 14:14:38 -05:00
Brues c68e48111d Remove libtooltip 2026-07-12 14:01:25 -05:00
Brues 6936fd894b Replace unusable tooltip scan with C_PlayerInfo.CanUseItem
The libtipscan approach scanned each bag/bank item's tooltip for red
text, then had to carve out broken (0-durability) items since those also
color red. C_PlayerInfo.CanUseItem checks item requirements directly
(proficiency, level, class/race, skill/spell/rep) and ignores item
state, so broken-but-equippable gear is never flagged and the durability
exclusion drops out entirely. Bank slots resolve through
C_Container.GetContainerItemID(-1, slot) instead of the inventory-slot
workaround the scanner needed.
2026-07-12 13:48:36 -05:00
Brues b5277ea457 These modules aren't new anymore 2026-07-11 16:04:58 -05:00
Brues 63f0dcbf7a Use GetInventoryItemID instead of parsing link 2026-07-11 13:18:48 -05:00
Brues 0344bff471 cleanup 2026-07-11 12:59:33 -05:00
Brues 1510969105 Unused strings 2026-07-11 12:57:07 -05:00
Brues 6e7361c543 Removed redundant compare.basestats setting
Just disable the module if you don't want stat comparison
2026-07-11 12:43:15 -05:00
Brues 2e20a03cbd Restore Inspect UI frame skin
removed during the tbc purge
2026-07-11 12:36:03 -05:00
Brues 7389c241a4 using GetSpellInfo with just a spell id is dangerous
Handful of addons will polyfill their own GetSpellInfo that only accept (bookSlot, bookType) so it's only safe to use C_Spell.GetSpellInfo with just a spell id
2026-07-11 09:47:46 -05:00
Brues fb5230828c Add Loot History module
A pfUI-native group-loot roll history window built on ClassicAPI's
C_LootHistory backport, adapted from the anniversary Blizzard reference.

- Movable/scrollable window (ESC-closable, Clear button) listing rolled
  items; each row expands to per-player rolls.
- Item icon/name/quality rendered via the !!!ClassicAPI Item mixin
  (Item:CreateFromItemLink + ContinueOnItemLoad), so uncached items load
  asynchronously and repaint their row.
- Winner shown on the collapsed row (name/roll/roll-type) and marked in the
  expanded list with a checkmark left of the name (matches the reference).
- Expansion state keys on the stable rollID; events (FULL_UPDATE /
  ROLL_CHANGED / ROLL_COMPLETE) drive a rebuild while shown, and re-attach
  the scroll child so a growing list scrolls without a /reload.
- Toggle via /loothistory or /lh; optional auto-show on new rolls behind
  loothistory.autoshow (default off).
2026-07-11 00:02:31 -05:00
Brues 7aee348a70 Bump min version to 1.6.4 2026-07-10 20:27:16 -05:00
Brues 2a5f480839 Show addon dependencies in tooltip
Add display of required and optional addon dependencies to the addons tooltip. Introduce AddDependencyLines helper in modules/addons.lua which lists dependencies with color coding: green for loaded, yellow for present but unloaded, and red for missing (uses new T["Missing"]). Store dependency arrays on addon frames (adeps / aoptdeps) using GetAddOnDependencies and C_AddOns.GetAddOnOptionalDependencies. Add translation keys 'Dependencies', 'Optional Dependencies', and 'Missing' to env/translations_enUS.lua.
2026-07-10 20:26:05 -05:00
Brues 23d1ab840c Show sell value in tooltip when merchant hidden
When the MerchantFrame is not shown, display the item's total vendor sell value on the tooltip. Adds a guard to call SetTooltipMoney(frame, sell * count) if sell > 0 so stacked items show their combined sell price.
2026-07-10 13:23:52 -05:00
Brues 13a08b0ea3 Restore hooksecurefunc 2026-07-09 23:01:52 -05:00
Brues a2177fbf49 Restore HookScript 2026-07-09 22:55:26 -05:00
Brues 9cd83e90ad Added GetNoNameObject debugging 2026-07-09 22:31:58 -05:00
Brues 9bcc11e64f removed tbc logic 2026-07-09 22:26:32 -05:00
Brues acab272ec0 Generalize vendor price display across all tooltip types
Replace the single GameTooltip hook with a comprehensive hooking system that displays vendor prices across 17+ tooltip methods, including loot, quests, bags, mail, auctions, trades, merchants, and crafting. This ensures players see vendor prices consistently regardless of where they view items.
2026-07-09 22:05:25 -05:00
Brues 61c2f996fa Revert on-swing queue color when the ability is cancelled
Pressing Esc (or re-pressing) to cancel a queued Heroic Strike / Cleave /
Maul left the swing bar stuck in its queued color. The color is set on the
on-swing press and only cleared on nampower's ON_SWING_QUEUE_POPPED, which
fires solely when a queued-behind on-swing resolves; nampower's cancel path
touches no on-swing state and emits no event, so the flag never cleared.

Reconcile the event flag against the client's IsCurrentAction, which it does
clear on cancel: ReconcileQueued drops the flag once the client has confirmed
the ability as current and then stops showing it (the true->false transition).
It only acts once current has been seen, so a nampower-initiated cast the
client never flags as current keeps its color until its own pop/resolve --
preserving the reason the event-driven path exists.

RebuildQueueSlotCache now caches Maul slots and runs for druids, and no longer
bails in event mode so the caches stay fresh for reconciliation.
2026-07-09 19:45:17 -05:00
Brues 59ce6d9e74 Use a single shared frame for HookAddonOrVariable
Every HookAddonOrVariable call created its own lurker frame with three
event registrations. Share one frame across all hooks: they accumulate
in a pending list the single OnEvent handler walks, firing and dropping
each whose addon/variable is available, and unregistering events once the
list empties.

Behavior is preserved and slightly hardened: foundConfig now persists on
the shared frame (set on VARIABLES_LOADED and PLAYER_ENTERING_WORLD, both
of which imply config is ready), so a hook registered after config load
fires immediately if its addon is already loaded rather than waiting for
the next event.
2026-07-09 17:54:09 -05:00
Brues 967487e283 Utilizing ClassicAPI 1.6.0
commit d63057474083aa67fda2aa28ee6301334ffc4fdf
Author: Brues <5278969+brues-code@users.noreply.github.com>
Date:   Mon Jul 6 00:59:17 2026 -0500

    Use C_Map.GetMapOverlays instead of hardcoded pfMapOverlayData

    ClassicAPI's C_Map.GetMapOverlays reads WorldMapOverlay.dbc directly and
    returns the full overlay list for a zone (explored + unexplored) — the
    data vanilla's GetMapOverlayInfo withholds. mapreveal now iterates it
    straight (named fields: textureName/texturePath/width/height/offsets),
    dropping unpack_hash and the pfMapOverlayData tables entirely.

    Also fixes the explored-check: it compared the full texture path against
    GetMapOverlayInfo's bare-name keys, so the magnifying glass never
    suppressed on explored overlays. Now matches on the bare name.

    Removes ~870 lines of hand-measured overlay data (base + Turtle).

commit ad12c8209a80cd1211fe08e83f7013d24b5efd2d
Author: Brues <5278969+brues-code@users.noreply.github.com>
Date:   Sun Jul 5 23:45:09 2026 -0500

    utilize HookScript from ClassicAPI
2026-07-09 00:56:06 -05:00
Brues ab11096b01 Show on-swing queue color on every HS/Cleave/Maul press
The SPELL_CAST_EVENT hook only called SetQueuedKind, but the queued
color path is gated behind S.useSpellQueueEvent. Nampower fires
SPELL_CAST_EVENT on the actual HS/Cleave/Maul press (not just the
rarer ON_SWING_QUEUED), so flip the event-driven flag there. The
queued color now shows even when the client IsCurrentAction state
does not reflect a natively-queued on-swing ability.
2026-07-08 10:34:45 -05:00
Brues 0402db380a logically sort Castbar options 2026-07-08 09:47:13 -05:00
Brues 68fe7e22db Split castbar config into General/Player/Target/Focus subcategories
The castbar options were one long list. Break them into four subentries
under the Castbar parent (matching the Settings/Actionbar layout):
General (fonts, colors, texture, disable-blizzard) plus one page each for
Player, Target, and Focus. Drops the now-redundant per-unit header rows.
2026-07-07 16:31:56 -05:00
Brues a93e9f530c Add spell name & timer text alignment options for unit frame castbars
Adds per-unit (player/target/focus) dropdowns to align the castbar
spell name (left text) and cast timer (right text) Left/Center/Right.
Both share a castbaralign dropdown; defaults preserve current behavior
(name LEFT, timer RIGHT). Applied at castbar creation, so takes effect
on /reload like the other castbar options.
2026-07-07 16:26:48 -05:00
Brues 3be0585039 Don't let the pet bar dodge reposition the stance bar during unlock
The pet bar force-shows in unlock mode, and its OnShow/OnHide dodge
handlers re-anchor the stance bar above the pet bar. That yanked the
stance bar off its real position while unlocking (dodging a pet bar
that isn't actually active), so it appeared to vanish and only returned
when unlock ended. Skip the dodge re-anchor while unlock is active so
the stance bar stays put and can be positioned.
2026-07-07 13:02:05 -05:00
Brues ee7c729bcb remove select 2026-07-07 09:16:33 -05:00
79 changed files with 1134 additions and 1344 deletions
+50 -22
View File
@@ -548,36 +548,54 @@ end
-- 'script' [string] the handler to hook -- 'script' [string] the handler to hook
-- 'func' [function] the function that should be added -- 'func' [function] the function that should be added
function HookScript(f, script, func) function HookScript(f, script, func)
local prev = f:GetScript(script) f:HookScript(script, func)
f:SetScript(script, function(a1,a2,a3,a4,a5,a6,a7,a8,a9) end
if prev then prev(a1,a2,a3,a4,a5,a6,a7,a8,a9) end
func(a1,a2,a3,a4,a5,a6,a7,a8,a9) function hooksecurefunc(tbl, name, func)
end) if type(tbl) == "string" then tbl, name, func = _G, tbl, name end
if not tbl or type(tbl[name]) ~= "function" then return end
return _G.hooksecurefunc(tbl, name, func)
end end
-- [ HookAddonOrVariable ] -- [ HookAddonOrVariable ]
-- Sets a function to be called automatically once an addon gets loaded -- Sets a function to be called automatically once an addon gets loaded
-- 'addon' [string] addon or variable name -- 'addon' [string] addon or variable name
-- 'func' [function] function that should run -- 'func' [function] function that should run
function pfUI.api.HookAddonOrVariable(addon, func) do
local lurker = CreateFrame("Frame", nil) local lurker
lurker.func = func local pending = {}
lurker:RegisterEvent("ADDON_LOADED")
lurker:RegisterEvent("VARIABLES_LOADED") local function ProcessPending()
lurker:RegisterEvent("PLAYER_ENTERING_WORLD") if not lurker.foundConfig then return end
lurker:SetScript("OnEvent",function() for i = table.getn(pending), 1, -1 do
-- only run when config is available local hook = pending[i]
if event == "ADDON_LOADED" and not this.foundConfig then if IsAddOnLoaded(hook.addon) or _G[hook.addon] then
return hook.func()
elseif event == "VARIABLES_LOADED" then table.remove(pending, i)
this.foundConfig = true end
end
if table.getn(pending) == 0 then
lurker:UnregisterAllEvents()
end
end
function pfUI.api.HookAddonOrVariable(addon, func)
if not lurker then
lurker = CreateFrame("Frame", nil)
lurker:SetScript("OnEvent", function()
if event == "VARIABLES_LOADED" or event == "PLAYER_ENTERING_WORLD" then
this.foundConfig = true
end
ProcessPending()
end)
end end
if IsAddOnLoaded(addon) or _G[addon] then table.insert(pending, { addon = addon, func = func })
this:func() lurker:RegisterEvent("ADDON_LOADED")
this:UnregisterAllEvents() lurker:RegisterEvent("VARIABLES_LOADED")
end lurker:RegisterEvent("PLAYER_ENTERING_WORLD")
end) ProcessPending()
end
end end
-- [ QueueFunction ] -- [ QueueFunction ]
@@ -1559,6 +1577,16 @@ end
-- 'arg1' [string] -- 'arg1' [string]
-- return object -- return object
function pfUI.api.GetNoNameObject(frame, objtype, layer, arg1, arg2) function pfUI.api.GetNoNameObject(frame, objtype, layer, arg1, arg2)
-- A nil/non-frame parent otherwise dies on frame:GetRegions()/:GetChildren()
-- below, and the traceback stops here — useless, since all callers share this
-- line. pfUI shadows Lua's `error` (dropping the level arg and not throwing),
-- so fold the caller frame in via debugstack to name the offending skin, then
-- bail so we don't fall through and crash on frame:GetRegions() anyway.
if type(frame) ~= "table" or not frame.GetRegions then
error("GetNoNameObject: invalid parent frame\n" .. debugstack(2, 3, 0))
return
end
local arg1 = arg1 and gsub(arg1, "([%+%-%*%(%)%?%[%]%^])", "%%%1") local arg1 = arg1 and gsub(arg1, "([%+%-%*%(%)%?%[%]%^])", "%%%1")
local arg2 = arg2 and gsub(arg2, "([%+%-%*%(%)%?%[%]%^])", "%%%1") local arg2 = arg2 and gsub(arg2, "([%+%-%*%(%)%?%[%]%^])", "%%%1")
+9 -1
View File
@@ -196,6 +196,8 @@ function pfUI:LoadConfig()
pfUI:UpdateConfig("loot", nil, "rollannounce", "0") pfUI:UpdateConfig("loot", nil, "rollannounce", "0")
pfUI:UpdateConfig("loot", nil, "raritytimer", "1") pfUI:UpdateConfig("loot", nil, "raritytimer", "1")
pfUI:UpdateConfig("loothistory", nil, "autoshow", "0")
pfUI:UpdateConfig("unitframes", nil, "disable", "0") pfUI:UpdateConfig("unitframes", nil, "disable", "0")
pfUI:UpdateConfig("unitframes", nil, "pastel", "1") pfUI:UpdateConfig("unitframes", nil, "pastel", "1")
pfUI:UpdateConfig("unitframes", nil, "custom", "0") pfUI:UpdateConfig("unitframes", nil, "custom", "0")
@@ -714,9 +716,11 @@ function pfUI:LoadConfig()
pfUI:UpdateConfig("castbar", "player", "txtleftoffy", "0") pfUI:UpdateConfig("castbar", "player", "txtleftoffy", "0")
pfUI:UpdateConfig("castbar", "player", "showlag", "0") pfUI:UpdateConfig("castbar", "player", "showlag", "0")
pfUI:UpdateConfig("castbar", "player", "showrank", "0") pfUI:UpdateConfig("castbar", "player", "showrank", "0")
pfUI:UpdateConfig("castbar", "player", "mergetradeskill", "1") pfUI:UpdateConfig("castbar", "player", "mergetradeskill", "0")
pfUI:UpdateConfig("castbar", "player", "txtrightoffx", "0") pfUI:UpdateConfig("castbar", "player", "txtrightoffx", "0")
pfUI:UpdateConfig("castbar", "player", "txtrightoffy", "0") pfUI:UpdateConfig("castbar", "player", "txtrightoffy", "0")
pfUI:UpdateConfig("castbar", "player", "namealign", "LEFT")
pfUI:UpdateConfig("castbar", "player", "timealign", "RIGHT")
pfUI:UpdateConfig("castbar", "target", "hide_pfui", "0") pfUI:UpdateConfig("castbar", "target", "hide_pfui", "0")
pfUI:UpdateConfig("castbar", "target", "width", "-1") pfUI:UpdateConfig("castbar", "target", "width", "-1")
pfUI:UpdateConfig("castbar", "target", "height", "-1") pfUI:UpdateConfig("castbar", "target", "height", "-1")
@@ -729,6 +733,8 @@ function pfUI:LoadConfig()
pfUI:UpdateConfig("castbar", "target", "showrank", "0") pfUI:UpdateConfig("castbar", "target", "showrank", "0")
pfUI:UpdateConfig("castbar", "target", "txtrightoffx", "0") pfUI:UpdateConfig("castbar", "target", "txtrightoffx", "0")
pfUI:UpdateConfig("castbar", "target", "txtrightoffy", "0") pfUI:UpdateConfig("castbar", "target", "txtrightoffy", "0")
pfUI:UpdateConfig("castbar", "target", "namealign", "LEFT")
pfUI:UpdateConfig("castbar", "target", "timealign", "RIGHT")
pfUI:UpdateConfig("castbar", "focus", "hide_pfui", "0") pfUI:UpdateConfig("castbar", "focus", "hide_pfui", "0")
pfUI:UpdateConfig("castbar", "focus", "width", "-1") pfUI:UpdateConfig("castbar", "focus", "width", "-1")
pfUI:UpdateConfig("castbar", "focus", "height", "-1") pfUI:UpdateConfig("castbar", "focus", "height", "-1")
@@ -741,6 +747,8 @@ function pfUI:LoadConfig()
pfUI:UpdateConfig("castbar", "focus", "showrank", "0") pfUI:UpdateConfig("castbar", "focus", "showrank", "0")
pfUI:UpdateConfig("castbar", "focus", "txtrightoffx", "0") pfUI:UpdateConfig("castbar", "focus", "txtrightoffx", "0")
pfUI:UpdateConfig("castbar", "focus", "txtrightoffy", "0") pfUI:UpdateConfig("castbar", "focus", "txtrightoffy", "0")
pfUI:UpdateConfig("castbar", "focus", "namealign", "LEFT")
pfUI:UpdateConfig("castbar", "focus", "timealign", "RIGHT")
pfUI:UpdateConfig("castbar", nil, "use_unitfonts", "0") pfUI:UpdateConfig("castbar", nil, "use_unitfonts", "0")
pfUI:UpdateConfig("tooltip", nil, "position", "chat") pfUI:UpdateConfig("tooltip", nil, "position", "chat")
+3 -5
View File
@@ -569,7 +569,7 @@ end
-- 'frame' [frame] the modelframe that should be used -- 'frame' [frame] the modelframe that should be used
function pfUI.api.EnableClickRotate(frame) function pfUI.api.EnableClickRotate(frame)
frame:EnableMouse(true) frame:EnableMouse(true)
HookScript(frame, "OnUpdate", function() frame:HookScript("OnUpdate", function()
if this.rotate then if this.rotate then
local x,_ = GetCursorPosition() local x,_ = GetCursorPosition()
if this.curx > x then if this.curx > x then
@@ -582,14 +582,14 @@ function pfUI.api.EnableClickRotate(frame)
end end
end) end)
HookScript(frame, "OnMouseDown", function() frame:HookScript("OnMouseDown", function()
if arg1 == "LeftButton" then if arg1 == "LeftButton" then
this.rotate = true this.rotate = true
this.curx, this.cury = GetCursorPosition() this.curx, this.cury = GetCursorPosition()
end end
end) end)
HookScript(frame, "OnMouseUp", function() frame:HookScript("OnMouseUp", function()
this.rotate, this.curx, this.cury = nil, nil, nil this.rotate, this.curx, this.cury = nil, nil, nil
end) end)
end end
@@ -615,7 +615,6 @@ function pfUI.api.SetHighlight(frame, cr, cg, cb)
frame.rr, frame.rg, frame.rb, frame.ra = GetStringColor(pfUI_config.appearance.border.color) frame.rr, frame.rg, frame.rb, frame.ra = GetStringColor(pfUI_config.appearance.border.color)
if not frame.pfEnterLeave then if not frame.pfEnterLeave then
if not frame.HookScript then frame.HookScript = HookScript end
local enter, leave = frame:GetScript("OnEnter"), frame:GetScript("OnLeave") local enter, leave = frame:GetScript("OnEnter"), frame:GetScript("OnLeave")
if enter then if enter then
@@ -844,7 +843,6 @@ function pfUI.api.SkinScrollbar(frame, always)
-- always show parent frame -- always show parent frame
if always then if always then
RunOOC(function() RunOOC(function()
if not parent.HookScript then parent.HookScript = HookScript end
parent:HookScript("OnHide", function() this:Show() end) parent:HookScript("OnHide", function() this:Show() end)
end) end)
end end
+6 -14
View File
@@ -19,10 +19,9 @@ function pfUI.uf.ClearGuidTracking()
end end
-- slash command to toggle unitframe test mode -- slash command to toggle unitframe test mode
_G.SLASH_PFTEST1, _G.SLASH_PFTEST2 = "/pftest", "/pfuftest" pfUI.api.RegisterSlashCommand("PFTEST", { "/pftest", "/pfuftest" }, function()
_G.SlashCmdList.PFTEST = function()
pfUI.uf.showall = not pfUI.uf.showall pfUI.uf.showall = not pfUI.uf.showall
end end, true)
-- HoT buff indicators that need name verification because their icons are -- HoT buff indicators that need name verification because their icons are
-- reused by other spells. Maps icon (lowercased) → expected aura name + -- reused by other spells. Maps icon (lowercased) → expected aura name +
@@ -778,8 +777,7 @@ function pfUI.uf:UpdateConfig()
invert_v * (i-1-row*perrow)*(multiply*default_border + f.config.buffsize + 1), invert_v * (i-1-row*perrow)*(multiply*default_border + f.config.buffsize + 1),
invert_h * (row*(multiply*default_border + f.config.buffsize + 1) + (multiply*default_border + 1))) invert_h * (row*(multiply*default_border + f.config.buffsize + 1) + (multiply*default_border + 1)))
f.buffs[i]:SetWidth(f.config.buffsize) f.buffs[i]:SetSize(f.config.buffsize, f.config.buffsize)
f.buffs[i]:SetHeight(f.config.buffsize)
-- Create CD frame if it doesn't exist -- Create CD frame if it doesn't exist
if not f.buffs[i].cd then if not f.buffs[i].cd then
@@ -808,11 +806,7 @@ function pfUI.uf:UpdateConfig()
-- immediately show/hide existing cooldown text -- immediately show/hide existing cooldown text
if f.buffs[i].cd.pfCooldownText then if f.buffs[i].cd.pfCooldownText then
if cooldown_text == 1 then f.buffs[i].cd.pfCooldownText:SetShown(cooldown_text == 1)
f.buffs[i].cd.pfCooldownText:Show()
else
f.buffs[i].cd.pfCooldownText:Hide()
end
end end
f.buffs[i].id = i f.buffs[i].id = i
@@ -3020,9 +3014,7 @@ end
-- ============================================================================ -- ============================================================================
-- Slash Commands for Stats Frame -- Slash Commands for Stats Frame
-- ============================================================================ -- ============================================================================
_G.SLASH_PFUISTATS1 = "/pfuistats" pfUI.api.RegisterSlashCommand("PFUISTATS", { "/pfuistats", "/ufstats" }, function(msg)
_G.SLASH_PFUISTATS2 = "/ufstats"
_G.SlashCmdList["PFUISTATS"] = function(msg)
msg = string.lower(msg or "") msg = string.lower(msg or "")
if not pfUI.uf.stats then if not pfUI.uf.stats then
@@ -3074,4 +3066,4 @@ _G.SlashCmdList["PFUISTATS"] = function(msg)
end end
end end
end end
end end, true)
-11
View File
@@ -28,17 +28,6 @@ ACTIONBAR_SECURE_TEMPLATE_BUTTON = nil
UNITFRAME_SECURE_TEMPLATE = nil UNITFRAME_SECURE_TEMPLATE = nil
--[[ Vanilla API Extensions ]]-- --[[ Vanilla API Extensions ]]--
-- Safe post-hook helper. The global `hooksecurefunc` belongs to ClassicAPI
-- (its C implementation); this wrapper only adds pfUI's missing-target guard:
-- ClassicAPI errors when target[name] isn't a function, whereas a lot of our
-- call sites hook optional/late-loaded frames and rely on a silent no-op.
-- Normalizes the string form, skips when the target is absent, then delegates
-- to the C version (uncapped args, callback-pcall, taint parity).
function pfUI.hooksecurefunc(tbl, name, func)
if type(tbl) == "string" then tbl, name, func = _G, tbl, name end
if not tbl or type(tbl[name]) ~= "function" then return end
return _G.hooksecurefunc(tbl, name, func)
end
do -- GetItemInfo do -- GetItemInfo
local name, link, rarity, minlevel, itype, isubtype, stack local name, link, rarity, minlevel, itype, isubtype, stack
-55
View File
@@ -2417,58 +2417,3 @@ pfSellData = {
[23725]=2600, [23727]=2600, [23728]=2600, [23743]=11, [24071]=393470, [24101]=400000, [23725]=2600, [23727]=2600, [23728]=2600, [23743]=11, [24071]=393470, [24101]=400000,
[24102]=400000, [24222]=221054, [24231]=211, [24232]=900, [24281]=1210, [24282]=18250, [24102]=400000, [24222]=221054, [24231]=211, [24232]=900, [24281]=1210, [24282]=18250,
[24283]=152345, [24358]=365815 } [24283]=152345, [24358]=365815 }
pfMapOverlayData = {
["Alterac"] = {"CHILLWINDPOINT:308:250:660:261", "CORRAHNSDAGGER:173:277:411:391", "CRUSHRIDGEHOLD:269:230:339:167:283:0", "DALARAN:277:283:39:275", "DANDREDSFOLD:273:224:282:0", "GALLOWSCORNER:183:185:415:287", "GAVINSNAZE:140:161:235:486", "GROWLESSCAVE:175:156:327:382", "LORDAMEREINTERNMENTCAMP:315:255:55:413", "MISTYSHORE:204:268:207:139", "RUINSOFALTERAC:252:249:274:201", "RAVENHOLDTMANOR:217:165:737:452", "SOFERASNAZE:241:312:469:311", "STRAHNBRAD:355:289:555:110", "THEHEADLAND:142:187:325:481", "THEUPLANDS:219:183:470:84",},
["AlteracValley"] = {"DUNBALDAR:254:228:356:18:3299:3318", "FROSTWOLFKEEP:220:278:408:382:3299:3318", "ICEBLOODGARRISON:286:288:343:179:3299:3318",},
["Arathi"] = {"BOULDERFISTHALL:190:214:442:371", "BOULDERGOR:222:214:244:167", "CIRCLEOFEASTBINDING:140:213:568:125", "CIRCLEOFINNERBINDING:186:164:302:321", "CIRCLEOFOUTERBINDING:149:137:429:301", "CIRCLEOFWESTBINDING:156:189:152:71", "DABYRIESFARMSTEAD:160:171:482:197", "FALDIRSCOVE:247:197:180:428", "FARWELLSTEAD:112:128:267:31", "GOSHEKFARM:208:177:539:284", "HAMMERFALL:182:235:665:128:318:0", "NORTHFOLDMANOR:202:205:204:119", "REFUGEPOINT:157:189:380:214", "RUINSOFZULRASAZ:160:160:346:29", "STROMGARDEKEEP:220:213:122:295", "THANDOLSPAN:175:198:369:424", "THORADINSWALL:173:225:103:148", "WITHERBARKVILLAGE:197:194:566:339", "WILDTUSKVILLAGE:183:102:379:145",},
["Ashenvale"] = {"ASTRANAAR:190:173:281:259", "BOUGHSHADOW:140:190:862:157", "FALLENSKYLAKE:219:190:555:433:432:0", "FELFIREHILL:241:244:720:349", "FIRESCARSHRINE:153:161:194:332", "FORESTSONG:162:142:817:232", "IRISLAKE:185:190:401:226", "LAKEFALATHIM:115:181:138:144", "MAESTRASPOST:198:290:216:46", "MYSTRALLAKE:262:228:363:354:420:2359", "NIGHTRUN:212:244:604:263:431:0", "RAYNEWOODRETREAT:165:235:527:243", "SATYRNAAR:163:172:702:230", "THEHOWLINGVALE:196:172:471:147", "THERUINSOFSTARDUST:141:135:268:382", "THESHRINEOFAESSINA:205:179:113:268", "THEZORAMSTRAND:228:235:26:33", "THISTLEFURVILLAGE:243:184:210:164", "WARSONGLUMBERCAMP:185:146:804:319",},
["Aszhara"] = {"BAYOFSTORMS:257:285:486:208", "BITTERREACHES:231:173:651:46", "FORLORNRIDGE:210:247:198:373", "HALDARRENCAMPMENT:191:138:83:339", "JAGGEDREEF:556:153:373:9", "LAKEMENNAR:301:184:302:437", "LEGASHENCAMPMENT:224:131:484:49", "RAVENCRESTMONUMENT:227:115:559:506", "RUINSOFELDARATH:251:268:246:228", "SHADOWSONGSHRINE:213:170:43:428", "SOUTHRIDGEBEACH:355:207:397:360", "TEMPLEOFARKKORAN:177:187:689:160", "THALASSIANBASECAMP:224:144:507:126", "THERUINEDREACHES:384:116:403:549", "THESHATTEREDSTRAND:148:199:412:202", "TIMBERMAWHOLD:209:194:258:175", "TOWEROFELDARA:107:145:824:114", "URSOLAN:219:212:327:94", "VALORMOK:201:158:93:236",},
["Badlands"] = {"AGMONDSEND:249:256:354:396", "ANGORFORTRESS:186:241:327:101", "APOCRYPHANSREST:251:195:20:315", "CAMPBOFF:195:207:506:361", "CAMPCAGG:247:205:15:432:347:0", "CAMPKOSH:214:211:556:56", "CRYSTALLINEPINNACLE:140:155:609:337", "DUSTWINDGULCH:229:190:506:216", "HAMMERTOESDIGSITE:185:177:455:131", "KARGATH:232:245:0:154", "LETHLORRAVINE:344:395:627:173", "MIRAGEFLATS:276:229:153:387", "REDBRANDSDIGSITE:325:155:496:454", "RUINSOFCORTHAN:210:200:203:124", "SCALEBANERIDGE:205:179:751:142", "THEDUSTBOWL:253:266:166:203", "THEMAKERSTERRACE:230:172:399:16:1517:0", "VALLEYOFFANGS:215:215:358:265",},
["Balor"] = {"BILGERATCOMPOUND:174:141:323:76", "CROAKINGPLATEAU:371:154:397:201", "GRAHANESTATE:93:116:306:392", "GULLWINGWRECKAGE:110:105:221:34", "LANGSTONORCHARD:102:129:410:346", "RUINSOFBREEZEHAVEN:163:141:450:256", "SCURRYINGTHICKET:144:158:283:161", "SIOUTPOST:175:232:597:389", "SORROWMORELAKE:174:140:303:277", "STORMBREAKERPOINT:243:197:583:212", "STORMREAVERSPIRE:151:119:491:429", "STORMWROUGHTCASTLE:202:166:458:332", "TREACHEROUSCRAGS:243:171:381:457", "VANDERFARMSTEAD:146:140:330:372", "WINDROCKCLIFFS:192:279:256:303",},
["Barrens"] = {"AGAMAGOR:183:173:348:242", "ANCHORSEDGE:118:83:690:300", "BAELMODAN:120:123:435:482", "BLACKTHORNRIDGE:140:123:340:465", "BOULDERLODEMINE:109:105:560:0", "BRAMBLESCAR:112:152:446:304", "CAMPTAURAJO:130:113:370:355", "DREADMISTPEAK:121:93:423:68", "FARWATCHPOST:85:152:572:58", "FIELDOFGIANTS:194:137:363:410", "GROLDOMFARM:112:107:499:67", "HONORSSTAND:128:128:306:130", "LUSHWATEROASIS:160:169:372:186", "NORTHWATCHFOLD:134:107:533:310", "RAPTORGROUNDS:101:99:512:299", "RATCHET:116:118:556:190", "RAZORFENDOWNS:137:106:414:562", "RAZORFENKRAUL:116:123:345:539", "THECROSSROADS:142:140:436:127", "THEDRYHILLS:185:134:324:36", "THEFORGOTTENPOOLS:104:116:391:120", "THEMERCHANTCOAST:80:123:584:249", "THEMORSHANRAMPART:118:91:418:0", "THESLUDGEFEN:153:113:463:0", "THESTAGNANTOASIS:147:126:484:211", "THORNHILL:128:120:502:123",},
["BlackstoneIsland"] = {"BLACKASHCOALPITS:303:474:209:178", "BLACKASHMINE:251:204:397:222", "GAZZIKSWORKSHOP:329:247:439:403", "RUSTGATELUMBERYARD:217:245:551:241", "RUSTGATERIDGE:396:226:372:360", "THEWATERHOLE:386:239:382:43", "VENTURECOSLUMS:270:192:498:129",},
["BlastedLands"] = {"ALTAROFSTORMS:169:142:318:141", "DARKPORTAL:254:208:460:265", "DREADMAULHOLD:200:171:351:21", "DREADMAULPOST:228:183:370:204", "GARRISONARMORY:155:192:480:15", "NETHERGARDEKEEP:169:178:567:35", "RISEOFTHEDEFILER:150:131:414:131", "SERPENTSCOIL:211:155:510:148", "THETAINTEDSCAR:370:438:220:184",},
["BurningSteppes"] = {"ALTAROFSTORMS:215:210:41:114", "BLACKROCKMOUNTAIN:249:272:178:104", "BLACKROCKPASS:259:299:597:285", "BLACKROCKSTRONGHOLD:232:258:342:120", "DRACODAR:405:309:61:262", "DREADMAULROCK:203:214:717:174", "MORGANSVIGIL:287:265:715:311", "PILLAROFASH:313:261:382:289", "RUINSOFTHAURISSAN:258:275:521:105", "TERRORWINGPATH:271:296:730:52",},
["Darkshore"] = {"AMETHARAN:163:178:340:323", "AUBERDINE:134:179:323:191", "BASHALARAN:153:171:379:199", "CLIFFSPRINGRIVER:205:161:391:112:445:0", "GROVEOFTHEANCIENTS:180:138:314:436", "REMTRAVELSEXCAVATION:148:164:245:504", "RUINSOFMATHYSTRA:176:205:519:3", "THEMASTERSGLAIVE:146:139:346:529", "TOWEROFALTHALAXX:142:159:484:110",},
["DeadwindPass"] = {"DEADMANSCROSSING:368:353:257:81:2938:0", "KARAZHAN:287:234:277:342", "THEVICE:254:257:433:305",},
["Desolace"] = {"ETHELRETHOR:189:237:318:68", "GELKISVILLAGE:181:235:300:433", "KODOGRAVEYARD:253:237:396:251", "KOLKARVILLAGE:206:208:615:221", "KORMEKSHUT:156:147:562:187", "MAGRAMVILLAGE:182:272:606:373", "MANNOROCCOVEN:270:271:408:385", "NIJELSPOINT:188:246:561:0", "RANAZJARISLE:88:89:248:11", "SARGERON:274:237:632:38", "SHADOWBREAKRAVINE:190:181:698:454", "SHADOWPREYVILLAGE:215:218:175:395", "TETHRISARAN:185:137:440:0", "THUNDERAXEFORTRESS:174:207:455:108", "VALLEYOFSPEARS:234:274:217:221",},
["DunMorogh"] = {"AMBERSTILLRANCH:105:104:582:288", "ANVILMAR:209:159:167:414:77:0", "BREWNALLVILLAGE:94:102:263:256", "CHILLBREEZEVALLEY:160:113:281:304", "COLDRIDGEPASS:134:123:300:387", "FROSTMANEHOLD:112:118:225:291", "GNOMERAGON:158:176:178:164", "GOLBOLARQUARRY:144:149:619:301", "HELMSBEDLAKE:131:153:706:284:716:0", "ICEFLOWLAKE:117:167:286:173", "IRONFORGE:291:187:414:166", "IRONFORGEAIRFIELDS:213:233:582:100", "KHARANOS:175:186:397:296:189:0", "MISTYPINEREFUGE:117:155:507:224", "NORTHERNGATEOUTPOST:115:155:766:177", "RUGFORDSMOUNTAINREST:199:114:739:406", "SHIMMERRIDGE:115:173:355:169", "SOUTHERNGATEOUTPOST:113:106:800:284", "THEGRIZZLEDDEN:178:155:321:328", "THETUNDRIDHILLS:135:115:531:328",},
["Durotar"] = {"DRYGULCHRAVINE:139:134:438:92:410:0", "ECHOISLES:175:236:561:432", "KOLKARCRAG:131:96:426:487", "ORGRIMMAR:427:150:251:0", "RAZORHILL:188:207:445:182", "RAZORMANEGROUNDS:196:202:318:204", "SENJINVILLAGE:133:167:485:398", "SKULLROCK:118:79:469:51", "SPARKWATERPORT:122:134:522:94", "THUNDERRIDGE:156:174:341:72", "TIRAGARDEKEEP:160:148:477:300", "VALLEYOFTRIALS:186:184:370:335",},
["Duskwood"] = {"ADDLESSTEAD:255:231:67:353", "BRIGHTWOODGROVE:191:315:520:131", "DARKSHIRE:291:259:644:173:576:0", "MANORMISTMANTLE:174:150:668:134", "RAVENHILL:166:115:117:317", "RAVENHILLCEMETARY:323:276:99:165:243:0", "THEDARKENEDBANK:886:184:105:44", "THEHUSHEDBANK:136:306:29:143", "THEROTTINGORCHARD:231:210:549:380", "THEYORGENFARMSTEAD:211:235:403:393", "TRANQUILGARDENSCEMETARY:204:196:692:363", "TWILIGHTGROVE:327:384:314:99", "VULGOLOGREMOUND:231:266:259:365",},
["Dustwallow"] = {"ALCAZISLAND:176:179:671:29", "BACKBAYWETLANDS:384:243:248:196", "BRACKENWALLVILLAGE:264:264:239:2:507:0", "THEDENOFFLAME:246:235:264:320", "THERAMOREISLE:214:187:542:232", "THEWYRMBOG:263:229:372:387", "WITCHHILL:230:311:431:1:518:0", "WESTHAVENHOLLOW:166:149:603:428",},
["EasternPlaguelands"] = {"BLACKWOODLAKE:217:221:451:207", "CORINSCROSSING:153:146:544:373", "CROWNGUARDTOWER:193:152:299:408", "DARROWSHIRE:195:167:316:497", "EASTWALLTOWER:164:143:600:250", "FORLORNSUMMIT:192:185:64:225", "LAKEMERELDAR:240:164:543:469", "LIGHTSHOPECHAPEL:165:238:721:304", "NORTHDALE:172:191:628:135", "NORTHPASSTOWER:228:178:465:118", "PESTILENTSCAR:189:241:416:349", "PLAGUEWOOD:346:258:178:92", "QUELLITHIENLODGE:216:136:430:44", "STRATHOLME:227:189:202:15", "TERRORDALE:175:129:86:137", "THEFUNGALVALE:202:199:277:267", "THEINFECTISSCAR:183:262:628:298", "THEMARRISSTEAD:182:194:164:367", "THENOXIOUSGLADE:211:202:730:172", "THEUNDERCROFT:171:136:178:484", "THONDRORILRIVER:210:348:12:235", "TYRSHAND:201:159:724:475", "ZULMASHAR:189:152:621:36",},
["Elwynn"] = {"BRACKWELLPUMPKINPATCH:222:223:592:431", "CRYSTALLAKE:196:192:435:345", "EASTVALELOGGINGCAMP:237:190:713:339", "FARGODEEPMINE:238:230:247:438:63:64", "FORESTSEDGE:242:335:132:333:120:0", "GOLDSHIRE:219:199:261:280", "JERODSLANDING:206:212:437:445", "NORTHSHIREVALLEY:237:244:390:154", "RIDGEPOINTTOWER:287:207:710:445", "STONECAIRNLAKE:278:230:601:203", "STORMWIND:452:392:21:3", "TOWEROFAZORA:232:226:561:303:54:0",},
["Felwood"] = {"BLOODVENOMFALLS:225:132:297:269", "DEADWOODVILLAGE:162:129:415:539", "EMERALDSANCTUARY:171:150:411:436", "FELPAWVILLAGE:224:138:489:0:1769:0", "IRONTREEWOODS:200:203:426:60", "JADEFIREGLEN:151:145:339:469", "JADEFIRERUN:181:159:338:35", "JAEDENAR:236:122:275:333", "MORLOSARAN:129:151:503:515", "RUINSOFCONSTELLAS:224:142:303:387", "SHATTERSCARVALE:218:186:315:130", "TALONBRANCHGLADE:145:130:554:97",},
["Feralas"] = {"CAMPMOJACHE:146:148:694:238", "CHIMAERAROOSTVALE:106:150:785:321", "DIREMAUL:214:180:461:208", "DREAMBOUGH:141:122:459:0", "FERALSCARVALE:103:104:491:335", "FRAYFEATHERHIGHLANDS:101:163:485:391", "GORDUNNIOUTPOST:154:128:697:148", "GRIMTOTEMCOMPOUND:110:186:630:172", "ISLEOFDREAD:205:285:197:381", "LOWERWILDS:214:152:756:204", "ONEIROS:101:103:499:74", "RUINSOFISILDIEN:179:241:547:326", "RUINSOFRAVENWIND:178:149:310:0", "SARDORISLE:167:168:216:241", "THEFORGOTTENCOAST:132:316:409:258", "THETWINCOLOSSALS:278:235:323:78", "THEWRITHINGDEEP:214:205:625:305:2519:0",},
["Gillijim"] = {"DEEPTIDESANCTUM:204:117:199:512", "DISTILLERYISLE:90:69:234:216", "FAELONSFOLLY:108:103:331:304", "GILLIJIMSTRAND:108:324:641:160", "JADEMINE:141:149:500:256", "KALKORPOINT:123:115:421:210", "KAZONISLAND:194:113:432:51", "MAULOGGPOST:137:227:512:401", "MAULOGGREFUGE:231:132:615:465", "RUINSOFZULRAZAR:215:136:369:384", "SILVERCOAST:245:184:311:386", "SILVERSANDBAR:47:128:256:398", "SOUTHSEASANDBAR:125:172:178:63", "TANGLEWOOD:135:188:576:297", "ZULRAZAR:137:168:375:282",},
["Gilneas"] = {"BLACKTHORNSCAMP:160:163:32:171", "BROLOKMOUND:140:120:467:349", "DAWNSTONEMINE:130:144:292:155", "FREYSHEARKEEP:72:70:624:405", "GILNEASCITY:295:242:89:105", "GLAYMORESTEAD:140:127:483:129", "GREYMANESWATCH:119:158:580:311", "HOLLOWWEBCEMETARY:180:167:215:395", "HOLLOWWEBWOODS:171:118:341:452", "NORTHGATETOWER:130:137:397:172", "OLDROCKPASS:155:165:290:37", "RAVENSHIRE:194:237:472:431", "RAVENWOODKEEP:253:174:496:494", "ROSEWICKPLANTATION:134:140:331:155", "RUINSOFGREYSHIRE:192:144:230:260", "SHADEMORETAVERN:117:120:279:336", "SOUTHMIREORCHARD:202:133:302:354", "STILLWARDCHURCH:213:166:471:220", "THEDRYROCKMINE:129:127:145:262", "THEDRYROCKPIT:230:217:69:295", "THEGREYMANEWALL:131:173:412:48", "THEOVERGROWNACRE:134:154:390:269",},
["GrimReaches"] = {"BAGGOTHSRAMPART:112:113:399:238", "BARLEYCRESTFARMSTEAD:116:88:499:222", "BRANGARSFOLLY:108:123:568:33", "DUNKITHAS:137:95:470:329", "EASTRIDGEOUTPOST:166:107:374:165", "GETHKAR:118:124:444:84", "GROLDANSEXCAVATION:125:117:567:231", "LAKEKITHAS:217:150:481:270", "RUINSOFSTOLGAZKEEP:134:146:366:53", "SALGAZMINES:150:119:535:380", "SHATTERBLADEPOST:186:130:512:126", "SLATEBEARDSFORGE:136:99:457:404", "THEGRIMHOLLOW:288:200:396:463", "THEHIGHPASS:97:141:409:315", "ZARMGETHPOINT:143:76:405:16", "ZARMGETHSTRONGHOLD:120:150:487:17",},
["Hilsbrad"] = {"AZURELOADMINE:146:174:188:288", "DARROWHILL:173:132:426:164", "DUNGAROK:225:257:644:305", "DURNHOLDEKEEP:367:347:614:82", "EASTERNSTRAND:208:301:537:350", "HILLSBRADFIELDS:282:257:211:166", "NETHANDERSTEAD:190:215:554:249", "PURGATIONISLE:120:94:111:485", "SOUTHPOINTTOWER:271:207:11:203", "SOUTHSHORE:219:245:423:213", "TARRENMILL:195:291:524:9", "WESTERNSTRAND:272:139:215:377",},
["Hinterlands"] = {"AERIEPEAK:240:195:20:250", "AGOLWATHA:188:180:382:173", "HIRIWATHA:201:118:188:314", "JINTHAALOR:223:277:514:338", "PLAGUEMISTRAVINE:124:203:170:158", "QUELDANILLODGE:168:181:248:194", "SERADANE:260:263:519:25", "SHADRAALOR:181:170:247:394", "SHAOLWATHA:265:190:580:247", "SKULKROCK:148:133:520:241", "THEALTAROFZUL:186:153:382:371", "THECREEPINGRUIN:168:157:417:268", "THEOVERLOOKCLIFFS:153:299:702:309", "THERASAZTRAILS:118:133:210:381", "VALORWINDLAKE:153:160:329:309",},
["Hyjal"] = {"BARKSKINPLATEAU:207:167:390:297", "BARKSKINVILLAGE:502:293:417:346", "BLEAKHOLLOWCRATER:297:335:401:20", "CIRCLEOFPOWER:277:331:203:63", "DARKHOLLOWPASS:214:237:342:389", "NORDANAAR:139:146:778:118", "NORDRASSILGLADE:418:408:578:0", "RUINSOFTELENNAS:165:193:141:236", "THEEMERALDGATEWAY:309:244:109:353", "ZULHATHA:191:210:3:194",},
["Icepoint"] = {"KANEQNUUN:512:430:237:129",},
["Lapidis"] = {"BRIGHTCOAST:298:213:237:246", "CAELANSREST:147:111:517:230", "CROWNISLAND:140:95:512:33", "GORDOSHHEIGHTS:253:243:256:89", "HAZURRIGLADE:87:82:486:306", "SHANKSREEF:207:90:446:109", "THEROCK:74:72:687:149", "TOWEROFLAPIDIS:203:118:487:175", "WALLOWINGCOAST:240:184:505:326", "ZULHAZU:227:178:348:407",},
["LochModan"] = {"GRIZZLEPAWRIDGE:262:343:326:325", "IRONBANDSEXCAVATIONSITE:321:294:491:276", "MOGROSHSTRONGHOLD:287:265:558:61", "NORTHGATEPASS:195:273:143:24:925:0", "SILVERSTREAMMINE:201:243:247:25", "STONESPLINTERVALLEY:226:255:230:363", "STONEWROUGHTDAM:260:149:354:23", "THEFARSTRIDERLODGE:162:182:741:298", "THELOCH:288:380:367:99", "THELSAMAR:243:205:225:214", "VALLEYOFKINGS:166:224:123:382",},
["Moonglade"] = {"LAKEELUNEARA:530:484:256:101:2361:0",},
["Moonwhisper"] = {"ANSHESRESPITE:170:120:398:81", "ANCESTRALGROUNDS:164:82:295:88", "BLACKROOTHOLD:162:137:495:465", "BLACKROOTVILLAGE:224:143:411:525", "FOULHEARTSANCTUM:157:149:496:232", "GROVEOFTHEMOON:152:146:464:347", "LUNARCLAWDEN:84:60:674:376", "MARASETHIL:96:94:640:417", "MOONHOOFRETREAT:172:144:419:167", "MOONHOOFVILLAGE:163:157:570:188", "MOONSILKHOLLOW:125:114:577:458", "MOROGAIVILLAGE:133:127:571:372", "NARVALISPOINT:162:139:503:118", "RUINSOFNENDIS:183:130:584:275", "STARSHARDCRADLE:122:109:334:121", "TYRANDAS:158:169:580:61", "VYSNAGOSASREST:163:102:420:8",},
["Mulgore"] = {"BAELDUNDIGSITE:175:151:269:227", "BLOODHOOFVILLAGE:236:182:378:311", "PALEMANEROCK:102:183:315:317", "RAVAGEDCARAVAN:110:100:482:269", "REDCLOUDMESA:436:231:285:437:221:0", "REDROCKS:154:138:522:92", "SUNTAILPASS:129:116:533:18", "THEGOLDENPLAINS:184:217:441:91", "THEROLLINGPLAINS:231:166:536:369", "THEVENTURECOMINE:187:204:549:251", "THUNDERBLUFF:254:217:264:70", "THUNDERHORNWATERWELL:118:137:384:248", "WILDMANEWATERWELL:152:111:299:10", "WINDFURYRIDGE:182:119:405:2", "WINTERHOOFWATERWELL:144:107:470:379",},
["Northwind"] = {"ABBEYGARDENS:250:224:512:33", "AMBERSHIRE:234:215:334:278", "AMBERWOODKEEP:243:205:187:308", "BLACKROCKBREACH:255:201:721:222", "BRISTLEWHISKERCAVERN:197:185:568:232", "CINDERFALLPASS:229:229:733:348", "CRAWFORDWINERY:160:222:513:285", "CRYSTALFALLS:320:205:627:464", "GRIMMENLAKE:218:210:550:352", "MERCHANTSHIGHROAD:353:249:256:420", "NORTHRIDGEPOINT:298:314:349:31", "NORTHWINDLOGGINGCAMP:224:185:258:171", "RUINSOFBIRKHAVEN:180:208:645:116", "SHERWOODQUARRY:293:287:702:1", "STILLHEARTPORT:174:155:116:217", "TOWEROFMAGILOU:181:223:189:169", "WITCHCOVEN:147:162:257:81",},
["Redridge"] = {"ALTHERSMILL:222:260:407:134", "GALARDELLVALLEY:234:240:661:168:96:0", "LAKEEVERSTILL:522:260:140:249", "LAKERIDGEHIGHWAY:411:274:196:341", "LAKESHIRE:325:179:92:204", "REDRIDGECANYONS:345:232:132:79:98:0", "RENDERSCAMP:264:248:284:4:998:0", "RENDERSVALLEY:453:248:491:365", "REDWALLKEEP:162:110:830:466", "STONEWATCH:243:289:507:221:999:0", "STONEWATCHFALLS:308:200:601:325", "THREECORNERS:360:337:0:288",},
["SearingGorge"] = {"BLACKCHARCAVE:264:224:84:371", "DUSTFIREVALLEY:446:355:428:11", "FIREWATCHRIDGE:385:413:95:39", "GRIMSILTDIGSITE:292:210:501:306", "TANNERCAMP:292:215:552:413", "THECAULDRON:414:310:257:178", "THESEAOFCINDERS:345:273:256:395",},
["Silithus"] = {"HIVEASHI:431:276:305:34:3426:0", "HIVEREGAL:469:335:262:333:3427:0", "HIVEZORA:343:424:117:188", "SOUTHWINDVILLAGE:346:348:519:83:3077:0", "THECRYSTALVALE:285:274:121:31", "THESCARABWALL:271:145:125:523:2741:0", "TWILIGHTBASECAMP:297:238:355:206:3097:2739",},
["Silverpine"] = {"AMBERMILL:204:210:512:279", "BERENSPERIL:206:146:508:433", "DEEPELEMMINE:127:143:484:274", "FENRISISLE:234:187:593:88:232:0", "MALDENSORCHARD:228:138:479:9:239:0", "NORTHTIDESHOLLOW:152:104:337:141", "OLSENSFARTHING:128:152:401:267", "PYREWOODVILLAGE:122:108:405:456", "SHADOWFANGKEEP:185:131:380:373", "THEDEADFIELD:141:134:419:82", "THEDECREPITFERRY:144:156:475:160", "THEGREYMANEWALL:175:185:398:465", "THESEPULCHER:193:135:360:184", "THESHININGSTRAND:225:192:475:27:227:0", "THESKITTERINGDARK:160:165:302:18",},
["StonetalonMountains"] = {"AMANIALOR:504:252:8:5", "BAELHARDUL:357:252:512:257", "BLACKSANDOILFIELDS:504:504:8:5", "BOULDERSLIDERAVINE:90:76:586:547", "BRAMBLETHORNPASS:382:359:512:257", "BROKENCLIFFMINE:252:504:260:5", "CAMPAPARAJE:222:100:670:552", "GRIMTOTEMPOST:146:77:675:519", "MALAKAJIN:137:86:662:562", "MIRKFALLONLAKE:504:504:260:5", "POWDERTOWN:252:252:260:257", "SISHIRCANYON:252:264:512:257", "STONETALONPEAK:258:252:260:5", "SUNROCKRETREAT:504:252:260:257", "THECHARREDVALE:252:308:260:257", "THEEARTHENRING:504:252:260:257", "VENTURECOMPANYCAMP:252:504:260:5", "WEBWINDERPATH:256:324:512:256", "WINDSHEARCRAG:256:256:512:256:1277:0",},
["Stranglethorn"] = {"BALALRUINS:83:65:245:101", "BALIAMAHRUINS:100:133:376:133", "BLOODSAILCOMPOUND:154:163:201:291", "BOOTYBAY:137:125:207:435:312:0", "CRYSTALVEINMINE:111:114:350:280", "GROMGOLBASECAMP:101:98:265:137", "JAGUEROISLE:132:107:319:498", "KALAIRUINS:86:89:303:93", "KURZENSCOMPOUND:141:139:394:5", "LAKENAZFERITI:124:120:332:60", "MISTVALEVALLEY:120:116:283:372", "MIZJAHRUINS:93:102:315:133", "MOSHOGGOGREMOUND:123:168:435:96", "NEKMANIWELLSPRING:80:102:215:365", "NESINGWARYSEXPEDITION:128:98:274:29", "REBELCAMP:164:86:289:0", "RUINSOFABORAZ:87:87:356:340", "RUINSOFJUBUWAL:100:105:312:304", "RUINSOFZULKUNDA:113:132:201:8", "RUINSOFZULMAMWE:162:122:397:213", "THEARENA:186:176:241:194", "THEVILEREEF:177:160:159:98", "VENTURECOBASECAMP:96:120:391:66", "WILDSHORE:151:175:237:431", "ZIATAJAIRUINS:127:120:364:231", "ZULGURUB:230:213:489:12", "ZUULDAIARUINS:103:105:160:47",},
["SwampOfSorrows"] = {"FALLOWSANCTUARY:348:292:501:0", "ITHARIUSSCAVE:230:232:0:270", "MISTYREEDSTRAND:250:664:752:0:1978:0", "MISTYVALLEY:211:179:29:148", "POOLOFTEARS:280:256:576:227", "SORROWMURK:199:351:734:128", "SPLINTERSPEARJUNCTION:258:222:138:245", "STAGALBOG:328:238:561:386", "STONARD:343:303:287:244", "SORROWGUARDKEEP:220:174:0:266", "THEHARBORAGE:216:187:182:157", "THESHIFTINGMIRE:303:221:294:118",},
["Tanaris"] = {"ABYSSALSANDS:194:159:376:207", "BROKENPILLAR:93:165:481:243", "CAVERNSOFTIME:139:132:567:262", "DUNEMAULCOMPOUND:186:127:337:298", "EASTMOONRUINS:143:130:405:355", "GADGETZAN:156:149:430:102", "LANDSENDBEACH:184:148:456:514", "LOSTRIGGERCOVE:141:173:635:230", "NOONSHADERUINS:129:191:530:43", "SANDSORROWWATCH:175:157:311:111", "SOUTHBREAKSHORE:192:151:510:304", "SOUTHMOONRUINS:185:196:324:366", "STEAMWHEEDLEPORT:136:129:599:86", "SLICKWICKOILRIG:237:181:129:436", "THEGAPINGCHASM:198:188:458:380", "THENOXIOUSLAIR:155:180:265:209", "THISTLESHRUBVALLEY:166:234:217:294", "VALLEYOFTHEWATCHERS:125:115:311:470", "WATERSPRINGFIELD:145:164:516:177", "ZALASHJISDEN:90:127:619:157", "ZULFARRAK:191:166:265:5",},
["TelAbim"] = {"BIXXLESSTOREHOUSE:300:127:368:178", "HIGHVALERISE:191:187:468:248", "TAZZOSSHACK:229:232:453:391", "TELCOBASECAMP:184:183:342:440", "THEDERELICTCAMP:165:205:364:273", "THEJAGGEDISLES:313:256:385:16",},
["Teldrassil"] = {"BANETHILHOLLOW:136:191:392:289", "DARNASSUS:294:252:110:251", "DOLANAAR:170:119:469:327", "GNARLPINEHOLD:230:158:316:417", "LAKEALAMETH:237:163:445:388", "POOLSOFARLITHRIEN:125:180:337:314", "RUTTHERANVILLAGE:110:91:504:548", "SHADOWGLEN:198:201:504:164", "STARBREEZEVILLAGE:153:175:588:303", "THEORACLEGLADE:150:223:279:135", "URSANHEIGHTS:229:154:243:423", "WELLSPRINGLAKE:166:245:383:98:265:0",},
["ThalassianHighlands"] = {"ALAHTHALAS:470:276:429:38", "ANASTERIANPARK:229:219:385:256", "BRINTHILIEN:180:211:395:450", "FELSTRIDERRETREAT:201:207:165:428", "ISLEOFETERNALAUTUMN:204:167:236:117", "RUINSOFNASHALARAN:249:266:36:151", "SILVERSUNMINE:208:189:288:373", "THEFARSTRIDE:230:199:212:255", "THELASTRUNESTONE:179:203:507:379",},
["ThousandNeedles"] = {"CAMPETHOK:289:300:7:1:2237:0", "DARKCLOUDPINNACLE:189:182:267:138", "FREEWINDPOST:193:173:366:273", "HIGHPERCH:178:174:39:164", "SPLITHOOFCRAG:193:175:400:203", "THEGREATLIFT:191:163:213:78", "THESCREECHINGCANYON:240:231:187:206", "THESHIMMERINGFLATS:312:355:612:308", "WINDBREAKCANYON:225:213:501:249",},
["Tirisfal"] = {"AGAMANDMILLS:244:191:342:148", "BALNIRFARMSTEAD:179:153:639:335", "BRIGHTWATERLAKE:176:280:598:143", "BRILL:121:144:540:305", "BULWARK:184:169:712:374", "COLDHEARTHMANOR:136:125:479:328", "CRUSADEROUTPOST:154:121:701:293", "DEATHKNELL:210:186:236:337", "GARRENSHAUNT:148:199:507:154", "GLENSHIRE:163:161:157:393:5033:5039", "MONASTARY:175:157:762:139:161:0", "NIGHTMAREVALE:209:151:370:355", "RUINSOFLORDAERON:299:216:469:370", "SCARLETWATCHPOST:141:223:701:113", "SOLLIDENFARMSTEAD:225:138:247:259", "STEEPCLIFFPORT:121:120:5:350", "STILLWATERPOND:168:123:401:279", "THECORINTHFARMSTEAD:116:152:73:402:5041:0", "THEWHISPERINGFOREST:243:175:86:263:5035:0", "VENOMWEBVALE:199:183:776:225",},
["UngoroCrater"] = {"FIREPLUMERIDGE:277:258:377:185", "GOLAKKAHOTSPRINGS:299:334:133:158", "IRONSTONEPLATEAU:276:281:588:69", "LAKKARITARPITS:553:255:170:13", "TERRORRUN:333:275:166:375", "THEMARSHLANDS:295:341:568:247", "THESLITHERINGSCAR:326:260:378:403",},
["WesternPlaguelands"] = {"CAERDARROW:158:150:608:421", "DALSONSTEARS:209:138:388:271", "DARROWMERELAKE:359:261:510:348", "FELSTONEFIELD:149:119:306:315", "GAHRRONSWITHERING:165:191:527:257", "HEARTHGLEN:331:280:312:20", "NORTHRIDGELUMBERCAMP:205:168:390:170", "RUINSOFANDORHOL:275:219:265:360", "SORROWHILL:290:201:360:467", "THEBULWARK:216:172:143:300", "THEWEEPINGCAVE:148:192:572:203", "THEWRITHINGHAUNT:159:177:457:329", "THONDRORILRIVER:193:326:597:94",},
["Westfall"] = {"ALEXSTONFARMSTEAD:275:182:220:274", "DEMONTSPLACE:166:155:226:391", "FURLBROWSPUMPKINFARM:186:191:399:24", "GOLDCOASTQUARRY:194:241:234:113", "JANGOLODEMINE:185:187:323:44", "MOONBROOK:208:174:317:349:919:0", "SALDEANSFARM:191:184:478:119", "SENTINELHILL:161:210:461:259", "THEDAGGERHILLS:235:149:349:430", "THEDEADACRE:164:213:542:267", "THEDUSTPLAINS:260:204:538:393", "THEJANSENSTEAD:143:183:498:6", "THEMOLSENFARM:199:180:342:161", "WESTFALLLIGHTHOUSE:306:161:171:482",},
["Wetlands"] = {"ANGERFANGENCAMPMENT:196:150:364:241", "BLACKCHANNELMARSH:213:173:95:260", "BLUEGILLMARSH:195:165:111:157", "DIREFORGEHILL:233:225:515:128", "DUNMODR:173:147:419:42", "DUNAGRATH:222:190:97:335", "GRIMBATOL:317:331:623:242:1037:0", "HAWKSVIGIL:170:162:264:353", "IRONBEARDSTOMB:165:156:368:135", "MENETHILHARBOR:156:116:27:321", "MOSSHIDEFEN:215:224:539:277", "RAPTORRIDGE:159:115:640:191", "SALTSPRAYGLEN:170:214:254:58", "SUNDOWNMARSH:265:212:113:100", "THEGREENBELT:153:209:473:143", "THELGANROCK:207:165:478:383:836:0", "WHELGARSEXCAVATIONSITE:172:156:264:224",},
["Winterspring"] = {"DARKWHISPERGORGE:247:191:452:447", "EVERLOOK:151:189:516:114", "FROSTFIREHOTSPRINGS:226:124:231:180", "FROSTSABERROCK:240:172:375:11", "FROSTWHISPERGORGE:184:144:531:383", "ICETHISTLEHILLS:116:155:617:247", "LAKEKELTHERIL:203:176:409:205", "MAZTHORIL:174:169:499:265", "OWLWINGTHICKET:149:127:600:348", "STARFALLVILLAGE:174:148:399:143", "THEHIDDENGROVE:162:174:562:33", "TIMBERMAWPOST:223:112:235:248", "WINTERFALLVILLAGE:133:120:622:163",},
}
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["deDE"] = {
["Combat Timer"] = nil, ["Combat Timer"] = nil,
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = nil,
["Components"] = nil, ["Components"] = nil,
["Config UI Settings"] = nil, ["Config UI Settings"] = nil,
["Configuration"] = nil, ["Configuration"] = nil,
+13 -1
View File
@@ -19,6 +19,7 @@ pfUI_translation["enUS"] = {
["Align Chat Windows"] = nil, ["Align Chat Windows"] = nil,
["Aligned Position"] = nil, ["Aligned Position"] = nil,
["All messages will be forwarded to:"] = nil, ["All messages will be forwarded to:"] = nil,
["All players passed"] = nil,
["Alt-Click Action"] = nil, ["Alt-Click Action"] = nil,
["Always Allow Drag Via Shift Key"] = nil, ["Always Allow Drag Via Shift Key"] = nil,
["Always Show"] = nil, ["Always Show"] = nil,
@@ -119,6 +120,7 @@ pfUI_translation["enUS"] = {
["Chat Bubble Transparency"] = nil, ["Chat Bubble Transparency"] = nil,
["Chat Default Brackets"] = nil, ["Chat Default Brackets"] = nil,
["Class"] = nil, ["Class"] = nil,
["Clear"] = nil,
["Clear Rolls"] = nil, ["Clear Rolls"] = nil,
["Click Action"] = nil, ["Click Action"] = nil,
["Click Casting"] = nil, ["Click Casting"] = nil,
@@ -138,7 +140,6 @@ pfUI_translation["enUS"] = {
["Combat Timer"] = nil, ["Combat Timer"] = nil,
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = nil,
["Components"] = nil, ["Components"] = nil,
["Config UI Settings"] = nil, ["Config UI Settings"] = nil,
["Configuration"] = nil, ["Configuration"] = nil,
@@ -195,6 +196,7 @@ pfUI_translation["enUS"] = {
["Deficit"] = nil, ["Deficit"] = nil,
["Delete profile"] = nil, ["Delete profile"] = nil,
["Delete / Reset"] = nil, ["Delete / Reset"] = nil,
["Dependencies"] = nil,
["Descending"] = nil, ["Descending"] = nil,
["Description Font"] = nil, ["Description Font"] = nil,
["Description Font Size"] = nil, ["Description Font Size"] = nil,
@@ -477,6 +479,7 @@ pfUI_translation["enUS"] = {
["Look & Feel"] = nil, ["Look & Feel"] = nil,
["Loot"] = nil, ["Loot"] = nil,
["Loot & Spam"] = nil, ["Loot & Spam"] = nil,
["Loot History"] = nil,
["Macro Text Color"] = nil, ["Macro Text Color"] = nil,
["Macro Text Size"] = nil, ["Macro Text Size"] = nil,
["Main Actionbar"] = nil, ["Main Actionbar"] = nil,
@@ -499,6 +502,7 @@ pfUI_translation["enUS"] = {
["Menu Font Size"] = nil, ["Menu Font Size"] = nil,
["Messages are no longer forwarded to:"] = nil, ["Messages are no longer forwarded to:"] = nil,
["Middle Mouse Button"] = nil, ["Middle Mouse Button"] = nil,
["Missing"] = nil,
["Minimap"] = nil, ["Minimap"] = nil,
["Minimap Panel"] = nil, ["Minimap Panel"] = nil,
["Minimap Size (|cffffaaaaExperimental|r)"] = nil, ["Minimap Size (|cffffaaaaExperimental|r)"] = nil,
@@ -552,6 +556,7 @@ pfUI_translation["enUS"] = {
["Only Show Own Debuffs (|cffffaaaaExperimental|r)"] = nil, ["Only Show Own Debuffs (|cffffaaaaExperimental|r)"] = nil,
["Only Show Target Castbar"] = nil, ["Only Show Target Castbar"] = nil,
["On State Change"] = nil, ["On State Change"] = nil,
["Optional Dependencies"] = nil,
["Options"] = nil, ["Options"] = nil,
["Orientation"] = nil, ["Orientation"] = nil,
["Other Panel: Minimap"] = nil, ["Other Panel: Minimap"] = nil,
@@ -645,6 +650,7 @@ pfUI_translation["enUS"] = {
["Resting"] = nil, ["Resting"] = nil,
["Reveal Unexplored Areas"] = nil, ["Reveal Unexplored Areas"] = nil,
["Switch to current zone"] = nil, ["Switch to current zone"] = nil,
["Retrieving item information..."] = nil,
["Right"] = nil, ["Right"] = nil,
["Right Actionbar"] = nil, ["Right Actionbar"] = nil,
["Right Anchor"] = nil, ["Right Anchor"] = nil,
@@ -750,6 +756,9 @@ pfUI_translation["enUS"] = {
["Show Totems Indicators"] = nil, ["Show Totems Indicators"] = nil,
["Shrink & Return"] = nil, ["Shrink & Return"] = nil,
["Size"] = nil, ["Size"] = nil,
["Spell Name Alignment"] = nil,
["Spell Name X Offset"] = nil,
["Spell Name Y Offset"] = nil,
["Skin"] = nil, ["Skin"] = nil,
["Skins"] = nil, ["Skins"] = nil,
["Slow"] = nil, ["Slow"] = nil,
@@ -798,6 +807,9 @@ pfUI_translation["enUS"] = {
["Threshold To Trust Health Estimation"] = nil, ["Threshold To Trust Health Estimation"] = nil,
["Time"] = nil, ["Time"] = nil,
["Timer"] = nil, ["Timer"] = nil,
["Timer Alignment"] = nil,
["Timer X Offset"] = nil,
["Timer Y Offset"] = nil,
["Time Remaining"] = nil, ["Time Remaining"] = nil,
["Timer In Minutes"] = nil, ["Timer In Minutes"] = nil,
["Timestamp Brackets"] = nil, ["Timestamp Brackets"] = nil,
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["esES"] = {
["Combat Timer"] = "Temporizador de combate", ["Combat Timer"] = "Temporizador de combate",
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = "Comparar estadísticas bases de objetos",
["Components"] = "Componentes", ["Components"] = "Componentes",
["Config UI Settings"] = nil, ["Config UI Settings"] = nil,
["Configuration"] = "Configuración", ["Configuration"] = "Configuración",
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["frFR"] = {
["Combat Timer"] = "Chronomètre de combat", ["Combat Timer"] = "Chronomètre de combat",
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = "Compare les stats de base d'un objet",
["Components"] = "Composants", ["Components"] = "Composants",
["Config UI Settings"] = nil, ["Config UI Settings"] = nil,
["Configuration"] = "Configuration", ["Configuration"] = "Configuration",
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["koKR"] = {
["Combat Timer"] = "전투 타이머", ["Combat Timer"] = "전투 타이머",
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = nil,
["Components"] = nil, ["Components"] = nil,
["Config UI Settings"] = nil, ["Config UI Settings"] = nil,
["Configuration"] = "구성", ["Configuration"] = "구성",
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["ruRU"] = {
["Combat Timer"] = "Таймер боя", ["Combat Timer"] = "Таймер боя",
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = "Сравнивать базовые характеристики предмета",
["Components"] = "Компоненты", ["Components"] = "Компоненты",
["Config UI Settings"] = "Настройка параметров пользовательского интерфейса", ["Config UI Settings"] = "Настройка параметров пользовательского интерфейса",
["Configuration"] = "Конфигурация", ["Configuration"] = "Конфигурация",
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["zhCN"] = {
["Combat Timer"] = "战斗计时器", ["Combat Timer"] = "战斗计时器",
["Combopoint Height"] = "连击点高度", ["Combopoint Height"] = "连击点高度",
["Combopoint Width"] = "连击点宽度", ["Combopoint Width"] = "连击点宽度",
["Compare Item Base Stats"] = "基于属性的装备对比",
["Components"] = "组件", ["Components"] = "组件",
["Config UI Settings"] = "界面设置", ["Config UI Settings"] = "界面设置",
["Configuration"] = "配置", ["Configuration"] = "配置",
-1
View File
@@ -138,7 +138,6 @@ pfUI_translation["zhTW"] = {
["Combat Timer"] = "戰鬥計時器", ["Combat Timer"] = "戰鬥計時器",
["Combopoint Height"] = nil, ["Combopoint Height"] = nil,
["Combopoint Width"] = nil, ["Combopoint Width"] = nil,
["Compare Item Base Stats"] = "基於屬性的裝備對比",
["Components"] = "組件", ["Components"] = "組件",
["Config UI Settings"] = nil, ["Config UI Settings"] = nil,
["Configuration"] = "配置", ["Configuration"] = "配置",
-1
View File
@@ -4,7 +4,6 @@
<Include file="..\libs\libdebuff.lua"/> <Include file="..\libs\libdebuff.lua"/>
<Include file="..\libs\librange.lua"/> <Include file="..\libs\librange.lua"/>
<Include file="..\libs\libunitscan.lua"/> <Include file="..\libs\libunitscan.lua"/>
<Include file="..\libs\libtooltip.lua"/>
<Include file="..\libs\libhealth.lua"/> <Include file="..\libs\libhealth.lua"/>
<Include file="..\libs\libtotem.lua"/> <Include file="..\libs\libtotem.lua"/>
<Include file="..\libs\libthrottle.lua"/> <Include file="..\libs\libthrottle.lua"/>
+1
View File
@@ -78,4 +78,5 @@
<Include file="..\modules\unitxp.lua"/> <Include file="..\modules\unitxp.lua"/>
<Include file="..\modules\bgscore.lua"/> <Include file="..\modules\bgscore.lua"/>
<Include file="..\modules\equipmentmanager.lua"/> <Include file="..\modules\equipmentmanager.lua"/>
<Include file="..\modules\loothistory.lua"/>
</Ui> </Ui>
+1
View File
@@ -1,5 +1,6 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/"> <Ui xmlns="http://www.blizzard.com/wow/ui/">
<Include file="..\skins\blizzard\character.lua"/> <Include file="..\skins\blizzard\character.lua"/>
<Include file="..\skins\blizzard\inspect.lua"/>
<Include file="..\skins\blizzard\spellbook.lua"/> <Include file="..\skins\blizzard\spellbook.lua"/>
<Include file="..\skins\blizzard\friends.lua"/> <Include file="..\skins\blizzard\friends.lua"/>
<Include file="..\skins\blizzard\talents.lua"/> <Include file="..\skins\blizzard\talents.lua"/>
+7 -8
View File
@@ -511,8 +511,7 @@ function libpredict:ParseComm(sender, msg)
local unit = senderUnit() local unit = senderUnit()
if not unit then return end if not unit then return end
local startMs = select(4, C_Spell.UnitCastingInfo(unit)) local _, _, _, startMs, endMs = C_Spell.UnitCastingInfo(unit)
local endMs = select(5, C_Spell.UnitCastingInfo(unit))
if not startMs or not endMs then return end if not startMs or not endMs then return end
time = (endMs - startMs) / 1000 time = (endMs - startMs) / 1000
elseif msgtype == 1 then elseif msgtype == 1 then
@@ -523,8 +522,7 @@ function libpredict:ParseComm(sender, msg)
target = {strsplit(":", string.sub(msg,9, -1))} target = {strsplit(":", string.sub(msg,9, -1))}
local unit = senderUnit() local unit = senderUnit()
if not unit then return end if not unit then return end
local startMs = select(4, C_Spell.UnitCastingInfo(unit)) local _, _, _, startMs, endMs = C_Spell.UnitCastingInfo(unit)
local endMs = select(5, C_Spell.UnitCastingInfo(unit))
if not startMs or not endMs then return end if not startMs or not endMs then return end
time = (endMs - startMs) / 1000 time = (endMs - startMs) / 1000
end end
@@ -899,7 +897,7 @@ local INSTANT_HOT_COOLDOWN = 1.0 -- 1 Sekunde Cooldown (GCD ist 1.5s)
local pendingHots = {} local pendingHots = {}
-- Gather Data by User Actions -- Gather Data by User Actions
pfUI.hooksecurefunc("CastSpell", function(id, bookType) hooksecurefunc("CastSpell", function(id, bookType)
if not libpredict.sender.enabled then return end if not libpredict.sender.enabled then return end
local effect, rank = libspell.GetSpellInfo(id, bookType) local effect, rank = libspell.GetSpellInfo(id, bookType)
if not effect then return end if not effect then return end
@@ -952,7 +950,7 @@ pfUI.hooksecurefunc("CastSpell", function(id, bookType)
end end
end) end)
pfUI.hooksecurefunc("CastSpellByName", function(effect, target) hooksecurefunc("CastSpellByName", function(effect, target)
if not libpredict.sender.enabled then return end if not libpredict.sender.enabled then return end
local effect, rank = libspell.GetSpellInfo(effect) local effect, rank = libspell.GetSpellInfo(effect)
if not effect then return end if not effect then return end
@@ -1016,13 +1014,14 @@ pfUI.hooksecurefunc("CastSpellByName", function(effect, target)
end end
end) end)
pfUI.hooksecurefunc("UseAction", function(slot, target, selfcast) hooksecurefunc("UseAction", function(slot, target, selfcast)
if not libpredict.sender.enabled then return end if not libpredict.sender.enabled then return end
if not IsCurrentAction(slot) then return end if not IsCurrentAction(slot) then return end
local kind, id = GetActionInfo(slot) local kind, id = GetActionInfo(slot)
local effect, rank local effect, rank
if kind == "spell" then if kind == "spell" then
effect, rank = GetSpellInfo(id) local spellInfo = C_Spell.GetSpellInfo(id)
effect, rank = spellInfo.name, spellInfo.rank
elseif kind == "macro" then elseif kind == "macro" then
effect, rank = GetMacroSpell(id) effect, rank = GetMacroSpell(id)
end end
-59
View File
@@ -1,59 +0,0 @@
-- load pfUI environment
setfenv(1, pfUI:GetEnvironment())
--[[ libtooltip ]]--
-- A pfUI library that provides additional GameTooltip information.
--
-- libtooltip:GetItemID()
-- returns the itemID of the current GameTooltip
-- `nil` when no item is displayed
--
-- libtooltip:GetItemLink()
-- returns the itemLink of the current GameTooltip
-- `nil` when no item is displayed
--
-- libtooltip:GetItemCount()
-- returns the item count (bags) of the current GameTooltip
-- `nil` when no item is displayed
-- return instantly when another libtooltip is already active
if pfUI.api.libtooltip then return end
local libtooltip = CreateFrame("Frame" , "pfLibTooltip", GameTooltip)
libtooltip:SetScript("OnShow", function()
if this:GetParent():HasItem() then
libtooltip.itemName, libtooltip.itemLink, libtooltip.itemID = this:GetParent():GetItem()
end
end)
libtooltip:SetScript("OnHide", function()
this.itemID = nil
this.itemLink = nil
this.itemCount = nil
this.itemName = nil
end)
-- core functions
libtooltip.GetItemID = function(self)
if not libtooltip.itemLink then return end
if not libtooltip.itemID then
libtooltip.itemID = C_Item.GetItemInfoInstant(libtooltip.itemLink)
end
return libtooltip.itemID
end
libtooltip.GetItemLink = function(self)
return libtooltip.itemLink
end
libtooltip.GetItemCount = function(self)
return libtooltip.itemCount
end
pfUI.api.libtooltip = libtooltip
pfUI.hooksecurefunc(GameTooltip, "SetBagItem", function(self, container, slot)
_, libtooltip.itemCount = GetContainerItemInfo(container, slot)
end)
+7 -6
View File
@@ -228,8 +228,8 @@ pfUI.libdebuff_spell_go_hooks["libtotem"] = function(spellId)
-- use pending name/icon if available (set by CastSpellByName hook), else GetSpellInfo -- use pending name/icon if available (set by CastSpellByName hook), else GetSpellInfo
local name = active[slot].pending_name local name = active[slot].pending_name
local icon = active[slot].pending_icon local icon = active[slot].pending_icon
if not name and GetSpellInfo then if not name then
name = GetSpellInfo(spellId) name = C_Spell.GetSpellName(spellId)
end end
active[slot].name = name active[slot].name = name
active[slot].duration = data.duration active[slot].duration = data.duration
@@ -241,14 +241,14 @@ pfUI.libdebuff_spell_go_hooks["libtotem"] = function(spellId)
end end
-- Hook CastSpellByName to store pending name/icon per slot -- Hook CastSpellByName to store pending name/icon per slot
pfUI.hooksecurefunc("CastSpellByName", function(effect, target) hooksecurefunc("CastSpellByName", function(effect, target)
local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(effect) local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(effect)
if not name then return end if not name then return end
libtotem:CheckAddQueue(name, rank, icon, spellId) libtotem:CheckAddQueue(name, rank, icon, spellId)
end) end)
-- Hook CastSpell to store pending name/icon per slot -- Hook CastSpell to store pending name/icon per slot
pfUI.hooksecurefunc("CastSpell", function(id, bookType) hooksecurefunc("CastSpell", function(id, bookType)
if not id or not bookType then return end if not id or not bookType then return end
if bookType ~= BOOKTYPE_SPELL and bookType ~= BOOKTYPE_PET then return end if bookType ~= BOOKTYPE_SPELL and bookType ~= BOOKTYPE_PET then return end
local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(id, bookType) local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(id, bookType)
@@ -259,13 +259,14 @@ end)
-- Hook UseAction. GetActionInfo + GetMacroSpell give us the spellID -- Hook UseAction. GetActionInfo + GetMacroSpell give us the spellID
-- directly for both spell-action and macro-action slots, so the -- directly for both spell-action and macro-action slots, so the
-- tooltip-scan fallback (and the "no spellId available" caveat) goes away. -- tooltip-scan fallback (and the "no spellId available" caveat) goes away.
pfUI.hooksecurefunc("UseAction", function(slot, target, selfcast) hooksecurefunc("UseAction", function(slot, target, selfcast)
if not IsCurrentAction(slot) then return end if not IsCurrentAction(slot) then return end
local kind, id = GetActionInfo(slot) local kind, id = GetActionInfo(slot)
local name, rank, spellID local name, rank, spellID
if kind == "spell" then if kind == "spell" then
spellID = id spellID = id
name, rank = GetSpellInfo(id) local spellInfo = C_Spell.GetSpellInfo(id)
name, rank = spellInfo.name, spellInfo.rank
elseif kind == "macro" then elseif kind == "macro" then
name, rank, spellID = GetMacroSpell(id) name, rank, spellID = GetMacroSpell(id)
end end
+3 -2
View File
@@ -335,8 +335,7 @@ pfUI:RegisterModule("actionbar", function ()
local slfcast = C.bars.altself == "1" and IsAltKeyDown() and true or self.slfcast local slfcast = C.bars.altself == "1" and IsAltKeyDown() and true or self.slfcast
slfcast = C.bars.rightself == "1" and arg1 and arg1 == "RightButton" and true or slfcast slfcast = C.bars.rightself == "1" and arg1 and arg1 == "RightButton" and true or slfcast
self.slfcast = nil self.slfcast = nil
if ( C.bars.keydown == "1" and keystate == "down" and not drag_active ) or (C.bars.keydown == "0" and keystate == "up" or drag_active ) or self.bar == 11 or mouse then
if ( pfUI_config.bars.keydown == "1" and keystate == "down" and not drag_active ) or (pfUI_config.bars.keydown == "0" and keystate == "up" or drag_active ) or self.bar == 11 or mouse then
if self.bar == 11 then if self.bar == 11 then
CastShapeshiftForm(self.id) CastShapeshiftForm(self.id)
elseif grid == 1 then elseif grid == 1 then
@@ -1356,6 +1355,7 @@ pfUI:RegisterModule("actionbar", function ()
-- make stance bar dodge by default -- make stance bar dodge by default
bars[i]:SetScript("OnShow", function() bars[i]:SetScript("OnShow", function()
if pfUI.unlock and pfUI.unlock:IsShown() then return end
if bars[11] and bars[11]:IsShown() then if bars[11] and bars[11]:IsShown() then
bars[11]:ClearAllPoints() bars[11]:ClearAllPoints()
bars[11]:SetPoint("BOTTOM", bars[12], "TOP", 0, 3*border) bars[11]:SetPoint("BOTTOM", bars[12], "TOP", 0, 3*border)
@@ -1365,6 +1365,7 @@ pfUI:RegisterModule("actionbar", function ()
-- restore old stance bar position -- restore old stance bar position
bars[i]:SetScript("OnHide", function() bars[i]:SetScript("OnHide", function()
if pfUI.unlock and pfUI.unlock:IsShown() then return end
if bars[11] and bars[11]:IsShown() then if bars[11] and bars[11]:IsShown() then
bars[11]:ClearAllPoints() bars[11]:ClearAllPoints()
bars[11]:SetPoint("BOTTOM", bars[6], "TOP", 0, 3*border) bars[11]:SetPoint("BOTTOM", bars[6], "TOP", 0, 3*border)
+1 -2
View File
@@ -440,6 +440,5 @@ pfUI:RegisterModule("addonbuttons", function ()
pfUI.addonbuttons:UpdateConfig() pfUI.addonbuttons:UpdateConfig()
_G.SLASH_PFABP1, _G.SLASH_PFABP2 = "/abp", "/pfabp" pfUI.api.RegisterSlashCommand("PFABP", { "/abp", "/pfabp" }, ManualAddOrRemove, true)
_G.SlashCmdList.PFABP = ManualAddOrRemove
end) end)
+19
View File
@@ -217,6 +217,21 @@ pfUI:RegisterModule("addons", function ()
pfUI.addons.list:RegisterEvent("PLAYER_ENTERING_WORLD") pfUI.addons.list:RegisterEvent("PLAYER_ENTERING_WORLD")
pfUI.addons.list:SetHeight(GetNumAddOns() * 25 + 26) pfUI.addons.list:SetHeight(GetNumAddOns() * 25 + 26)
local function AddDependencyLines(header, deps)
if not deps or table.getn(deps) == 0 then return end
GameTooltip:AddLine(" ")
GameTooltip:AddLine(header .. ":", .2, 1, .8)
for _, dep in ipairs(deps) do
if IsAddOnLoaded(dep) then
GameTooltip:AddLine(" " .. dep, .5, 1, .5)
elseif C_AddOns.DoesAddOnExist(dep) then
GameTooltip:AddLine(" " .. dep, 1, .82, 0)
else
GameTooltip:AddLine(" " .. dep .. " (" .. T["Missing"] .. ")", 1, .4, .4)
end
end
end
local function AddonOnEnter() local function AddonOnEnter()
this:SetBackdropBorderColor(1,1,1,.08) this:SetBackdropBorderColor(1,1,1,.08)
@@ -231,6 +246,8 @@ pfUI:RegisterModule("addons", function ()
end end
GameTooltip:AddLine(this.anote, .75,.75,.75,1) GameTooltip:AddLine(this.anote, .75,.75,.75,1)
AddDependencyLines(T["Dependencies"], this.adeps)
AddDependencyLines(T["Optional Dependencies"], this.aoptdeps)
GameTooltip:SetWidth(180) GameTooltip:SetWidth(180)
GameTooltip:Show() GameTooltip:Show()
end end
@@ -272,6 +289,8 @@ pfUI:RegisterModule("addons", function ()
frame.anote = anote frame.anote = anote
frame.aauthor = aauthor frame.aauthor = aauthor
frame.aversion = aversion frame.aversion = aversion
frame.adeps = { GetAddOnDependencies(i) } -- required (.toc Dependencies)
frame.aoptdeps = { C_AddOns.GetAddOnOptionalDependencies(i) } -- optional (.toc OptionalDeps)
frame:SetWidth(340) frame:SetWidth(340)
frame:SetHeight(25) frame:SetHeight(25)
+3 -3
View File
@@ -193,7 +193,7 @@ pfUI:RegisterModule("castbar", function ()
cb.bar.left:SetFontObject(GameFontWhite) cb.bar.left:SetFontObject(GameFontWhite)
cb.bar.left:SetTextColor(1,1,1,1) cb.bar.left:SetTextColor(1,1,1,1)
cb.bar.left:SetFont(font, font_size, "OUTLINE") cb.bar.left:SetFont(font, font_size, "OUTLINE")
cb.bar.left:SetJustifyH("left") cb.bar.left:SetJustifyH(C.castbar[unitstr].namealign or "LEFT")
-- text right -- text right
cb.bar.right = cb.bar:CreateFontString("Status", "DIALOG", "GameFontNormal") cb.bar.right = cb.bar:CreateFontString("Status", "DIALOG", "GameFontNormal")
@@ -204,7 +204,7 @@ pfUI:RegisterModule("castbar", function ()
cb.bar.right:SetFontObject(GameFontWhite) cb.bar.right:SetFontObject(GameFontWhite)
cb.bar.right:SetTextColor(1,1,1,1) cb.bar.right:SetTextColor(1,1,1,1)
cb.bar.right:SetFont(font, font_size, "OUTLINE") cb.bar.right:SetFont(font, font_size, "OUTLINE")
cb.bar.right:SetJustifyH("right") cb.bar.right:SetJustifyH(C.castbar[unitstr].timealign or "RIGHT")
cb.bar.lag = cb.bar:CreateTexture(nil, "OVERLAY") cb.bar.lag = cb.bar:CreateTexture(nil, "OVERLAY")
cb.bar.lag:SetPoint("TOPRIGHT", cb.bar, "TOPRIGHT", 0, 0) cb.bar.lag:SetPoint("TOPRIGHT", cb.bar, "TOPRIGHT", 0, 0)
@@ -490,7 +490,7 @@ pfUI:RegisterModule("castbar", function ()
-- (the config knob is read at event time so toggling takes effect on the -- (the config knob is read at event time so toggling takes effect on the
-- next craft without a /reload). DoTradeSkill is synchronous; the server -- next craft without a /reload). DoTradeSkill is synchronous; the server
-- roundtrip to SPELLCAST_START gives us plenty of time after this hook. -- roundtrip to SPELLCAST_START gives us plenty of time after this hook.
pfUI.hooksecurefunc("DoTradeSkill", function(index, num) hooksecurefunc("DoTradeSkill", function(index, num)
if pfUI.castbar.player then if pfUI.castbar.player then
pfUI.castbar.player.pendingTradeskillCount = tonumber(num) or 1 pfUI.castbar.player.pendingTradeskillCount = tonumber(num) or 1
end end
+2 -2
View File
@@ -24,7 +24,7 @@ pfUI:RegisterModule("chat", function ()
end end
end end
pfUI.hooksecurefunc("UnitPopup_OnClick", function(self) hooksecurefunc("UnitPopup_OnClick", function(self)
if this.value == "IGNORE_PLAYER" then if this.value == "IGNORE_PLAYER" then
AddIgnore(_G[UIDROPDOWNMENU_INIT_MENU].name) AddIgnore(_G[UIDROPDOWNMENU_INIT_MENU].name)
end end
@@ -449,7 +449,7 @@ pfUI:RegisterModule("chat", function ()
end end
end end
pfUI.hooksecurefunc("FCF_SaveDock", pfUI.chat.RefreshChat) hooksecurefunc("FCF_SaveDock", pfUI.chat.RefreshChat)
if C.chat.global.tabmouse == "1" then if C.chat.global.tabmouse == "1" then
pfUI.chat.mouseovertab = CreateFrame("Frame") pfUI.chat.mouseovertab = CreateFrame("Frame")
+1 -1
View File
@@ -136,5 +136,5 @@ pfUI:RegisterModule("cooldown", function ()
-- vanilla does not have a cooldown frame type, so we hook the -- vanilla does not have a cooldown frame type, so we hook the
-- regular SetTimer function that each one is calling. -- regular SetTimer function that each one is calling.
pfUI.hooksecurefunc("CooldownFrame_SetTimer", SetCooldown) hooksecurefunc("CooldownFrame_SetTimer", SetCooldown)
end) end)
+4 -6
View File
@@ -88,7 +88,7 @@ pfUI:RegisterModule("eqcompare", function ()
local prevMerchant = ShoppingTooltip1.SetMerchantCompareItem local prevMerchant = ShoppingTooltip1.SetMerchantCompareItem
local function SetMerchantCompareItem(self, index, compareItem) local function SetMerchantCompareItem(self, index, compareItem)
if C.tooltip.compare.basestats == "1" and compareItem == 1 then if compareItem == 1 then
ShowCompareItem(nil, GetMerchantItemLink(index), 1) ShowCompareItem(nil, GetMerchantItemLink(index), 1)
return false return false
end end
@@ -97,7 +97,7 @@ pfUI:RegisterModule("eqcompare", function ()
local prevAuction = ShoppingTooltip1.SetAuctionCompareItem local prevAuction = ShoppingTooltip1.SetAuctionCompareItem
local function SetAuctionCompareItem(self, type, index, compareItem) local function SetAuctionCompareItem(self, type, index, compareItem)
if C.tooltip.compare.basestats == "1" and compareItem == 1 then if compareItem == 1 then
ShowCompareItem(nil, GetAuctionItemLink(type, index), 1) ShowCompareItem(nil, GetAuctionItemLink(type, index), 1)
return false return false
end end
@@ -132,15 +132,13 @@ pfUI:RegisterModule("eqcompare", function ()
local function makeHook(getter) local function makeHook(getter)
return function(tooltip, arg1, arg2, arg3) return function(tooltip, arg1, arg2, arg3)
if C.tooltip.compare.basestats == "1" then ShowCompareItem(tooltip, getter(arg1, arg2, arg3))
ShowCompareItem(tooltip, getter(arg1, arg2, arg3))
end
end end
end end
local function HookTooltip(tooltip) local function HookTooltip(tooltip)
for setter, getter in pairs(TooltipHooks) do for setter, getter in pairs(TooltipHooks) do
pfUI.hooksecurefunc(tooltip, setter, makeHook(getter)) hooksecurefunc(tooltip, setter, makeHook(getter))
end end
end end
+2 -2
View File
@@ -940,10 +940,10 @@ pfUI:RegisterModule("equipmentmanager", function()
-- Tie popout visibility to the EM sidecar. They appear when the -- Tie popout visibility to the EM sidecar. They appear when the
-- sidecar opens, hide when it closes, and the flyout closes too. -- sidecar opens, hide when it closes, and the flyout closes too.
HookScript(frame, "OnShow", function() frame:HookScript("OnShow", function()
for _, b in ipairs(popoutButtons) do b:Show() end for _, b in ipairs(popoutButtons) do b:Show() end
end) end)
HookScript(frame, "OnHide", function() frame:HookScript("OnHide", function()
for _, b in ipairs(popoutButtons) do b:Hide() end for _, b in ipairs(popoutButtons) do b:Hide() end
if flyout then flyout:Hide() end if flyout then flyout:Hide() end
end) end)
+1 -2
View File
@@ -25,8 +25,7 @@ pfUI:RegisterModule("farmmode", function ()
Minimap_ZoomOut() Minimap_ZoomOut()
end end
_G.SLASH_PFFARMMAP1, _G.SLASH_PFFARMMAP2 = "/farm", "/farmmode" pfUI.api.RegisterSlashCommand("PFFARMMAP", { "/farm", "/farmmode" }, ToggleFarmMode, true)
_G.SlashCmdList.PFFARMMAP = ToggleFarmMode
pfUI.farmmap = CreateFrame("Minimap", "pfFarmMap", UIParent) pfUI.farmmap = CreateFrame("Minimap", "pfFarmMap", UIParent)
pfUI.farmmap:Hide() pfUI.farmmap:Hide()
+6 -9
View File
@@ -30,8 +30,7 @@ end)
-- /focusname is pfUI-specific because the engine has no name→GUID -- /focusname is pfUI-specific because the engine has no name→GUID
-- lookup for off-screen units — we resolve via a short target-swap. -- lookup for off-screen units — we resolve via a short target-swap.
SLASH_PFFOCUSNAME1, SLASH_PFFOCUSNAME2 = '/focusname', '/pffocusname' pfUI.api.RegisterSlashCommand("PFFOCUSNAME", { '/focusname', '/pffocusname' }, function(msg)
function SlashCmdList.PFFOCUSNAME(msg)
if msg == "" then return end if msg == "" then return end
local prevGUID = UnitGUID("target") local prevGUID = UnitGUID("target")
@@ -61,10 +60,9 @@ function SlashCmdList.PFFOCUSNAME(msg)
else else
ClearTarget() ClearTarget()
end end
end end, true)
SLASH_PFCASTFOCUS1, SLASH_PFCASTFOCUS2 = '/castfocus', '/pfcastfocus' pfUI.api.RegisterSlashCommand("PFCASTFOCUS", { '/castfocus', '/pfcastfocus' }, function(msg)
function SlashCmdList.PFCASTFOCUS(msg)
local focusGUID = UnitGUID("focus") local focusGUID = UnitGUID("focus")
if not focusGUID or focusGUID == "0x0000000000000000" then if not focusGUID or focusGUID == "0x0000000000000000" then
UIErrorsFrame:AddMessage(SPELL_FAILED_BAD_TARGETS, 1, 0, 0) UIErrorsFrame:AddMessage(SPELL_FAILED_BAD_TARGETS, 1, 0, 0)
@@ -105,10 +103,9 @@ function SlashCmdList.PFCASTFOCUS(msg)
else else
TargetLastTarget() TargetLastTarget()
end end
end end, true)
SLASH_PFSWAPFOCUS1, SLASH_PFSWAPFOCUS2 = '/swapfocus', '/pfswapfocus' pfUI.api.RegisterSlashCommand("PFSWAPFOCUS", { '/swapfocus', '/pfswapfocus' }, function(msg)
function SlashCmdList.PFSWAPFOCUS(msg)
local targetGUID = UnitGUID("target") local targetGUID = UnitGUID("target")
local oldFocusGUID = UnitGUID("focus") local oldFocusGUID = UnitGUID("focus")
@@ -118,4 +115,4 @@ function SlashCmdList.PFSWAPFOCUS(msg)
TargetUnit(oldFocusGUID) TargetUnit(oldFocusGUID)
end end
end end
end end, true)
+2 -2
View File
@@ -150,7 +150,7 @@ pfUI:RegisterSkin("Friends", function ()
end end
-- set positions -- set positions
pfUI.hooksecurefunc("WhoList_Update", function() hooksecurefunc("WhoList_Update", function()
for i = 1, WHOS_TO_DISPLAY do for i = 1, WHOS_TO_DISPLAY do
local level = _G["WhoFrameButton"..i.."Level"] local level = _G["WhoFrameButton"..i.."Level"]
level:ClearAllPoints() level:ClearAllPoints()
@@ -231,7 +231,7 @@ pfUI:RegisterSkin("Friends", function ()
end end
-- set positions -- set positions
pfUI.hooksecurefunc("GuildStatus_Update", function() hooksecurefunc("GuildStatus_Update", function()
for i = 1, GUILDMEMBERS_TO_DISPLAY do for i = 1, GUILDMEMBERS_TO_DISPLAY do
local level = _G["GuildFrameButton"..i.."Level"] local level = _G["GuildFrameButton"..i.."Level"]
level:ClearAllPoints() level:ClearAllPoints()
+1 -1
View File
@@ -86,7 +86,7 @@ pfUI:RegisterModule("gm", function ()
-- pet dropdown -- pet dropdown
-- table.insert(UnitPopupMenus["PET"], "GM_HEADER") -- table.insert(UnitPopupMenus["PET"], "GM_HEADER")
pfUI.hooksecurefunc("UnitPopup_OnClick", function() hooksecurefunc("UnitPopup_OnClick", function()
local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU] local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU]
local button = this.value local button = this.value
local unit = dropdownFrame.unit local unit = dropdownFrame.unit
+31 -32
View File
@@ -912,6 +912,11 @@ pfUI:RegisterModule("gui", function ()
"1:" .. T["1 Decimal (2.1)"], "1:" .. T["1 Decimal (2.1)"],
"2:" .. T["2 Decimals (2.14)"], "2:" .. T["2 Decimals (2.14)"],
}, },
["castbaralign"] = {
"LEFT:" .. T["Left"],
"CENTER:" .. T["Center"],
"RIGHT:" .. T["Right"],
},
["orientation"] = { ["orientation"] = {
"HORIZONTAL:" .. T["Horizontal"], "HORIZONTAL:" .. T["Horizontal"],
"VERTICAL:" .. T["Vertical"], "VERTICAL:" .. T["Vertical"],
@@ -2754,76 +2759,70 @@ pfUI:RegisterModule("gui", function ()
CreateConfig(nil, T["Show Movement Speed"], C.tooltip, "movespeed", "checkbox") CreateConfig(nil, T["Show Movement Speed"], C.tooltip, "movespeed", "checkbox")
CreateConfig(nil, T["Custom Transparency"], C.tooltip, "alpha") CreateConfig(nil, T["Custom Transparency"], C.tooltip, "alpha")
CreateConfig(nil, T["Status Bar Texture"], C.tooltip.statusbar, "texture", "dropdown", pfUI.gui.dropdowns.uf_bartexture) CreateConfig(nil, T["Status Bar Texture"], C.tooltip.statusbar, "texture", "dropdown", pfUI.gui.dropdowns.uf_bartexture)
CreateConfig(nil, T["Compare Item Base Stats"], C.tooltip.compare, "basestats", "checkbox") CreateConfig(nil, T["Always Show Item Comparison"], C.tooltip.compare, "showalways", "checkbox")
local showAlways = CreateConfig(nil, T["Always Show Item Comparison"], C.tooltip.compare, "showalways", "checkbox")
local function gate()
local on = C.tooltip.compare.basestats == "1"
if on then
showAlways.input:Enable()
showAlways.caption:SetTextColor(1, 1, 1)
else
showAlways.input:Disable()
showAlways.caption:SetTextColor(0.5, 0.5, 0.5)
end
end
gate()
pfUI.events:RegisterCallback("config:changed", function(_, cat, key)
if cat == C.tooltip.compare and key == "basestats" then gate() end
end, "eqcompare-showalways-gate")
CreateConfig(nil, T["Always Show Extended Vendor Values"], C.tooltip.vendor, "showalways", "checkbox") CreateConfig(nil, T["Always Show Extended Vendor Values"], C.tooltip.vendor, "showalways", "checkbox")
CreateConfig(U["questitem"], T["Show Related Quest On Questitems"], C.tooltip.questitem, "showquest", "checkbox") CreateConfig(U["questitem"], T["Show Related Quest On Questitems"], C.tooltip.questitem, "showquest", "checkbox")
CreateConfig(U["questitem"], T["Show Required Questitem Count"], C.tooltip.questitem, "showcount", "checkbox") CreateConfig(U["questitem"], T["Show Required Questitem Count"], C.tooltip.questitem, "showcount", "checkbox")
end) end)
CreateGUIEntry(T["Castbar"], nil, function() CreateGUIEntry(T["Castbar"], T["General"], function()
CreateConfig(nil, T["Use Unit Fonts"], C.castbar, "use_unitfonts", "checkbox") CreateConfig(nil, T["Use Unit Fonts"], C.castbar, "use_unitfonts", "checkbox")
CreateConfig(nil, T["Casting Color"], C.appearance.castbar, "castbarcolor", "color") CreateConfig(nil, T["Casting Color"], C.appearance.castbar, "castbarcolor", "color")
CreateConfig(nil, T["Channeling Color"], C.appearance.castbar, "channelcolor", "color") CreateConfig(nil, T["Channeling Color"], C.appearance.castbar, "channelcolor", "color")
CreateConfig(nil, T["Castbar Texture"], C.appearance.castbar, "texture", "dropdown", pfUI.gui.dropdowns.uf_bartexture) CreateConfig(nil, T["Castbar Texture"], C.appearance.castbar, "texture", "dropdown", pfUI.gui.dropdowns.uf_bartexture)
CreateConfig(nil, T["Disable Blizzard Castbar"], C.castbar.player, "hide_blizz", "checkbox") CreateConfig(nil, T["Disable Blizzard Castbar"], C.castbar.player, "hide_blizz", "checkbox")
end)
CreateConfig(nil, T["Player Castbar"], nil, nil, "header") CreateGUIEntry(T["Castbar"], T["Player"], function()
CreateConfig(nil, T["Disable Player Castbar"], C.castbar.player, "hide_pfui", "checkbox") CreateConfig(nil, T["Disable Player Castbar"], C.castbar.player, "hide_pfui", "checkbox")
CreateConfig(nil, T["Castbar Width"], C.castbar.player, "width") CreateConfig(nil, T["Castbar Width"], C.castbar.player, "width")
CreateConfig(nil, T["Castbar Height"], C.castbar.player, "height") CreateConfig(nil, T["Castbar Height"], C.castbar.player, "height")
CreateConfig(nil, T["Show Spell Icon"], C.castbar.player, "showicon", "checkbox") CreateConfig(nil, T["Show Spell Icon"], C.castbar.player, "showicon", "checkbox")
CreateConfig(nil, T["Show Spell Name"], C.castbar.player, "showname", "checkbox") CreateConfig(nil, T["Show Spell Name"], C.castbar.player, "showname", "checkbox")
CreateConfig(nil, T["Spell Name Alignment"], C.castbar.player, "namealign", "dropdown", pfUI.gui.dropdowns.castbaralign)
CreateConfig(nil, T["Spell Name X Offset"], C.castbar.player, "txtleftoffx")
CreateConfig(nil, T["Spell Name Y Offset"], C.castbar.player, "txtleftoffy")
CreateConfig(nil, T["Show Timer"], C.castbar.player, "showtimer", "checkbox") CreateConfig(nil, T["Show Timer"], C.castbar.player, "showtimer", "checkbox")
CreateConfig(nil, T["Left Text X Offset"], C.castbar.player, "txtleftoffx") CreateConfig(nil, T["Timer Alignment"], C.castbar.player, "timealign", "dropdown", pfUI.gui.dropdowns.castbaralign)
CreateConfig(nil, T["Left Text Y Offset"], C.castbar.player, "txtleftoffy") CreateConfig(nil, T["Timer X Offset"], C.castbar.player, "txtrightoffx")
CreateConfig(nil, T["Timer Y Offset"], C.castbar.player, "txtrightoffy")
CreateConfig(nil, T["Show Lag"], C.castbar.player, "showlag", "checkbox") CreateConfig(nil, T["Show Lag"], C.castbar.player, "showlag", "checkbox")
CreateConfig(nil, T["Show Rank"], C.castbar.player, "showrank", "checkbox") CreateConfig(nil, T["Show Rank"], C.castbar.player, "showrank", "checkbox")
CreateConfig(nil, T["Merge Tradeskill Casts"], C.castbar.player, "mergetradeskill", "checkbox") CreateConfig(nil, T["Merge Tradeskill Casts"], C.castbar.player, "mergetradeskill", "checkbox")
CreateConfig(nil, T["Right Text X Offset"], C.castbar.player, "txtrightoffx") end)
CreateConfig(nil, T["Right Text Y Offset"], C.castbar.player, "txtrightoffy")
CreateConfig(nil, T["Target Castbar"], nil, nil, "header") CreateGUIEntry(T["Castbar"], T["Target"], function()
CreateConfig(nil, T["Disable Target Castbar"], C.castbar.target, "hide_pfui", "checkbox") CreateConfig(nil, T["Disable Target Castbar"], C.castbar.target, "hide_pfui", "checkbox")
CreateConfig(nil, T["Castbar Width"], C.castbar.target, "width") CreateConfig(nil, T["Castbar Width"], C.castbar.target, "width")
CreateConfig(nil, T["Castbar Height"], C.castbar.target, "height") CreateConfig(nil, T["Castbar Height"], C.castbar.target, "height")
CreateConfig(nil, T["Show Spell Icon"], C.castbar.target, "showicon", "checkbox") CreateConfig(nil, T["Show Spell Icon"], C.castbar.target, "showicon", "checkbox")
CreateConfig(nil, T["Show Spell Name"], C.castbar.target, "showname", "checkbox") CreateConfig(nil, T["Show Spell Name"], C.castbar.target, "showname", "checkbox")
CreateConfig(nil, T["Spell Name Alignment"], C.castbar.target, "namealign", "dropdown", pfUI.gui.dropdowns.castbaralign)
CreateConfig(nil, T["Spell Name X Offset"], C.castbar.target, "txtleftoffx")
CreateConfig(nil, T["Spell Name Y Offset"], C.castbar.target, "txtleftoffy")
CreateConfig(nil, T["Show Timer"], C.castbar.target, "showtimer", "checkbox") CreateConfig(nil, T["Show Timer"], C.castbar.target, "showtimer", "checkbox")
CreateConfig(nil, T["Left Text X Offset"], C.castbar.target, "txtleftoffx") CreateConfig(nil, T["Timer Alignment"], C.castbar.target, "timealign", "dropdown", pfUI.gui.dropdowns.castbaralign)
CreateConfig(nil, T["Left Text Y Offset"], C.castbar.target, "txtleftoffy") CreateConfig(nil, T["Timer X Offset"], C.castbar.target, "txtrightoffx")
CreateConfig(nil, T["Timer Y Offset"], C.castbar.target, "txtrightoffy")
CreateConfig(nil, T["Show Lag"], C.castbar.target, "showlag", "checkbox") CreateConfig(nil, T["Show Lag"], C.castbar.target, "showlag", "checkbox")
CreateConfig(nil, T["Show Rank"], C.castbar.target, "showrank", "checkbox") CreateConfig(nil, T["Show Rank"], C.castbar.target, "showrank", "checkbox")
CreateConfig(nil, T["Right Text X Offset"], C.castbar.target, "txtrightoffx") end)
CreateConfig(nil, T["Right Text Y Offset"], C.castbar.target, "txtrightoffy")
CreateConfig(nil, T["Focus Castbar"], nil, nil, "header") CreateGUIEntry(T["Castbar"], T["Focus"], function()
CreateConfig(nil, T["Disable Focus Castbar"], C.castbar.focus, "hide_pfui", "checkbox") CreateConfig(nil, T["Disable Focus Castbar"], C.castbar.focus, "hide_pfui", "checkbox")
CreateConfig(nil, T["Castbar Width"], C.castbar.focus, "width") CreateConfig(nil, T["Castbar Width"], C.castbar.focus, "width")
CreateConfig(nil, T["Castbar Height"], C.castbar.focus, "height") CreateConfig(nil, T["Castbar Height"], C.castbar.focus, "height")
CreateConfig(nil, T["Show Spell Icon"], C.castbar.focus, "showicon", "checkbox") CreateConfig(nil, T["Show Spell Icon"], C.castbar.focus, "showicon", "checkbox")
CreateConfig(nil, T["Show Spell Name"], C.castbar.focus, "showname", "checkbox") CreateConfig(nil, T["Show Spell Name"], C.castbar.focus, "showname", "checkbox")
CreateConfig(nil, T["Spell Name Alignment"], C.castbar.focus, "namealign", "dropdown", pfUI.gui.dropdowns.castbaralign)
CreateConfig(nil, T["Spell Name X Offset"], C.castbar.focus, "txtleftoffx")
CreateConfig(nil, T["Spell Name Y Offset"], C.castbar.focus, "txtleftoffy")
CreateConfig(nil, T["Show Timer"], C.castbar.focus, "showtimer", "checkbox") CreateConfig(nil, T["Show Timer"], C.castbar.focus, "showtimer", "checkbox")
CreateConfig(nil, T["Left Text X Offset"], C.castbar.focus, "txtleftoffx") CreateConfig(nil, T["Timer Alignment"], C.castbar.focus, "timealign", "dropdown", pfUI.gui.dropdowns.castbaralign)
CreateConfig(nil, T["Left Text Y Offset"], C.castbar.focus, "txtleftoffy") CreateConfig(nil, T["Timer X Offset"], C.castbar.focus, "txtrightoffx")
CreateConfig(nil, T["Timer Y Offset"], C.castbar.focus, "txtrightoffy")
CreateConfig(nil, T["Show Lag"], C.castbar.focus, "showlag", "checkbox") CreateConfig(nil, T["Show Lag"], C.castbar.focus, "showlag", "checkbox")
CreateConfig(nil, T["Show Rank"], C.castbar.focus, "showrank", "checkbox") CreateConfig(nil, T["Show Rank"], C.castbar.focus, "showrank", "checkbox")
CreateConfig(nil, T["Right Text X Offset"], C.castbar.focus, "txtrightoffx")
CreateConfig(nil, T["Right Text Y Offset"], C.castbar.focus, "txtrightoffy")
end) end)
CreateGUIEntry(T["Chat"], nil, function() CreateGUIEntry(T["Chat"], nil, function()
-1
View File
@@ -2,7 +2,6 @@
-- Announces Innervate casts via raid/party/battleground chat -- Announces Innervate casts via raid/party/battleground chat
-- Registers AURA_CAST events directly - zero polling, pure event-driven -- Registers AURA_CAST events directly - zero polling, pure event-driven
pfUI:RegisterNewModule("innervatecall", "Innervate Callout", "DRUID")
pfUI:RegisterModule("innervatecall", function () pfUI:RegisterModule("innervatecall", function ()
-- Requires Nampower for AURA_CAST events -- Requires Nampower for AURA_CAST events
if not GetNampowerVersion then return end if not GetNampowerVersion then return end
+1 -1
View File
@@ -41,7 +41,7 @@ pfUI:RegisterModule("itemcount", function ()
end end
end) end)
pfUI.hooksecurefunc("SetItemRef", function() hooksecurefunc("SetItemRef", function()
if ItemRefTooltip:HasItem() then if ItemRefTooltip:HasItem() then
local _, _, id = ItemRefTooltip:GetItem() local _, _, id = ItemRefTooltip:GetItem()
if id then AddCounts(ItemRefTooltip, id) end if id then AddCounts(ItemRefTooltip, id) end
+2 -2
View File
@@ -392,7 +392,7 @@ pfUI:RegisterModule("loot", function ()
end end
pfUI.loot:RemoveMasterlootMenus() -- remove then add to ensure no duplicate menus pfUI.loot:RemoveMasterlootMenus() -- remove then add to ensure no duplicate menus
pfUI.loot:AddMasterLootMenus() pfUI.loot:AddMasterLootMenus()
pfUI.hooksecurefunc("UnitPopup_OnClick",function() hooksecurefunc("UnitPopup_OnClick",function()
local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU] local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU]
if not dropdownFrame then return end if not dropdownFrame then return end
local button = this.value local button = this.value
@@ -405,7 +405,7 @@ pfUI:RegisterModule("loot", function ()
end end
end end
end) end)
pfUI.hooksecurefunc("UnitPopup_HideButtons",function() hooksecurefunc("UnitPopup_HideButtons",function()
local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU] local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU]
local unit = dropdownFrame.unit local unit = dropdownFrame.unit
local name = dropdownFrame.name local name = dropdownFrame.name
+388
View File
@@ -0,0 +1,388 @@
pfUI:RegisterModule("loothistory", function ()
local rawborder, border = GetBorderSize()
-- Layout
local ITEM_H, PLAYER_H = 24, 18
local ITEM_W, PLAYER_W = 350, 330
-- rollType constants returned by C_LootHistory.GetPlayerInfo (0/1/2; vanilla
-- has no disenchant roll).
local ROLL_PASS, ROLL_NEED, ROLL_GREED = 0, 1, 2
local ROLL_TEX = {
[ROLL_NEED] = "Interface\\Buttons\\UI-GroupLoot-Dice-Up",
[ROLL_GREED] = "Interface\\Buttons\\UI-GroupLoot-Coin-Up",
[ROLL_PASS] = "Interface\\Buttons\\UI-GroupLoot-Pass-Up",
}
local WINMARK = "Interface\\Buttons\\UI-CheckBox-Check"
local QUESTIONMARK = "Interface\\Icons\\INV_Misc_QuestionMark"
local function ClassColor(class)
local c = class and RAID_CLASS_COLORS[class]
if c then return c.r, c.g, c.b end
return 1, 1, 1
end
-- Paint an item row's icon/name/quality from a loaded Item mixin.
local function RenderItemVisual(f, item)
local r, g, b = 1, 1, 1
local qc = item:GetItemQualityColor()
if qc then r, g, b = qc.r, qc.g, qc.b end
f.icon:SetTexture(item:GetItemIcon())
f.iconbg:SetBackdropBorderColor(r, g, b, 1)
f.name:SetText(item:GetItemName() or UNKNOWN)
f.name:SetTextColor(r, g, b)
end
local function ShowRetrieving(f)
f.icon:SetTexture(QUESTIONMARK)
f.iconbg:SetBackdropBorderColor(1, .3, .3, 1)
f.name:SetText(T["Retrieving item information..."])
f.name:SetTextColor(1, .3, .3)
end
-- expansion state keyed on the stable rollID (survives ring-index shifts)
local expanded = {}
-- ==========================================================================
-- Window
-- ==========================================================================
pfUI.loothistory = CreateFrame("Frame", "pfLootHistory", UIParent)
pfUI.loothistory:SetFrameStrata("DIALOG")
pfUI.loothistory:SetSize(380, 490)
pfUI.loothistory:SetPoint("CENTER", 0, 0)
pfUI.loothistory:SetMovable(true)
pfUI.loothistory:EnableMouse(true)
pfUI.loothistory:RegisterForDrag("LeftButton")
pfUI.loothistory:SetScript("OnDragStart", function() this:StartMoving() end)
pfUI.loothistory:SetScript("OnDragStop", function() this:StopMovingOrSizing() end)
pfUI.loothistory:Hide()
CreateBackdrop(pfUI.loothistory, nil, true, .75)
CreateBackdropShadow(pfUI.loothistory)
tinsert(UISpecialFrames, "pfLootHistory")
pfUI.loothistory.caption = pfUI.loothistory:CreateFontString("Status", "LOW", "GameFontNormal")
pfUI.loothistory.caption:SetFont(pfUI.font_default, C.global.font_size + 4, "OUTLINE")
pfUI.loothistory.caption:SetTextColor(.2, 1, .8, 1)
pfUI.loothistory.caption:SetPoint("TOP", 0, -10)
pfUI.loothistory.caption:SetText(T["Loot History"])
-- close button
pfUI.loothistory.close = CreateFrame("Button", nil, pfUI.loothistory)
pfUI.loothistory.close:SetPoint("TOPRIGHT", -border*2, -border*2)
CreateBackdrop(pfUI.loothistory.close)
pfUI.loothistory.close:SetSize(15, 15)
pfUI.loothistory.close.texture = pfUI.loothistory.close:CreateTexture("pfLootHistoryClose")
pfUI.loothistory.close.texture:SetTexture(pfUI.media["img:close"])
pfUI.loothistory.close.texture:SetPoint("TOPLEFT", pfUI.loothistory.close, "TOPLEFT", 4, -4)
pfUI.loothistory.close.texture:SetPoint("BOTTOMRIGHT", pfUI.loothistory.close, "BOTTOMRIGHT", -4, 4)
pfUI.loothistory.close.texture:SetVertexColor(1, .25, .25, 1)
pfUI.loothistory.close:SetScript("OnEnter", function()
CreateBackdrop(pfUI.loothistory.close)
pfUI.loothistory.close.backdrop:SetBackdropBorderColor(1, .25, .25, 1)
end)
pfUI.loothistory.close:SetScript("OnLeave", function() CreateBackdrop(pfUI.loothistory.close) end)
pfUI.loothistory.close:SetScript("OnClick", function() pfUI.loothistory:Hide() end)
-- clear button
pfUI.loothistory.clear = CreateFrame("Button", nil, pfUI.loothistory, "UIPanelButtonTemplate")
SkinButton(pfUI.loothistory.clear)
pfUI.loothistory.clear:SetSize(60, 16)
pfUI.loothistory.clear:SetPoint("TOPLEFT", 10, -8)
pfUI.loothistory.clear:SetText(T["Clear"])
pfUI.loothistory.clear:SetScript("OnClick", function() C_LootHistory.Clear() end)
-- scroll frame
pfUI.loothistory.scroll = CreateScrollFrame("pfLootHistoryScroll", pfUI.loothistory)
pfUI.loothistory.scroll:SetSize(360, 440)
pfUI.loothistory.scroll:SetPoint("BOTTOM", 0, 10)
pfUI.loothistory.scroll.backdrop = CreateFrame("Frame", nil, pfUI.loothistory.scroll)
pfUI.loothistory.scroll.backdrop:SetFrameLevel(1)
pfUI.loothistory.scroll.backdrop:SetPoint("TOPLEFT", pfUI.loothistory.scroll, "TOPLEFT", -5, 5)
pfUI.loothistory.scroll.backdrop:SetPoint("BOTTOMRIGHT", pfUI.loothistory.scroll, "BOTTOMRIGHT", 5, -5)
CreateBackdrop(pfUI.loothistory.scroll.backdrop, nil, true)
local list = CreateScrollChild("pfLootHistoryList", pfUI.loothistory.scroll)
pfUI.loothistory.list = list
-- ==========================================================================
-- Frame pools
-- ==========================================================================
local itemFrames = {}
local usedPlayers, freePlayers = {}, {}
local FullUpdate -- forward declaration (toggle handlers call it)
local function CreateItemFrame()
local f = CreateFrame("Button", nil, list)
f:SetSize(ITEM_W, ITEM_H)
f:SetBackdrop(pfUI.backdrop_hover)
f:SetBackdropBorderColor(1, 1, 1, .04)
f:EnableMouse(1)
-- expand / collapse toggle
f.toggle = CreateFrame("Button", nil, f)
f.toggle:SetSize(14, 14)
f.toggle:SetPoint("LEFT", 4, 0)
f.toggle:SetScript("OnClick", function()
local id = f.rollID
if id then expanded[id] = not expanded[id]; FullUpdate() end
end)
-- icon + quality-colored border
f.iconbg = CreateFrame("Frame", nil, f)
f.iconbg:SetSize(ITEM_H - 8, ITEM_H - 8)
f.iconbg:SetPoint("LEFT", f.toggle, "RIGHT", 4, 0)
CreateBackdrop(f.iconbg, nil, true)
f.icon = f.iconbg:CreateTexture(nil, "ARTWORK")
f.icon:SetPoint("TOPLEFT", f.iconbg, "TOPLEFT", 2, -2)
f.icon:SetPoint("BOTTOMRIGHT", f.iconbg, "BOTTOMRIGHT", -2, 2)
f.icon:SetTexCoord(.08, .92, .08, .92)
-- winner block (right side, shown for decided rolls)
f.winicon = f:CreateTexture(nil, "OVERLAY")
f.winicon:SetSize(14, 14)
f.winicon:SetPoint("RIGHT", f, "RIGHT", -6, 0)
f.winroll = f:CreateFontString("Status", "OVERLAY", "GameFontNormal")
f.winroll:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
f.winroll:SetPoint("RIGHT", f.winicon, "LEFT", -2, 0)
f.winroll:SetTextColor(1, 1, 1, 1)
f.winname = f:CreateFontString("Status", "OVERLAY", "GameFontNormal")
f.winname:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
f.winname:SetPoint("RIGHT", f.winroll, "LEFT", -4, 0)
f.winname:SetJustifyH("RIGHT")
-- item name (leaves room on the right for the winner block)
f.name = f:CreateFontString("Status", "OVERLAY", "GameFontNormal")
f.name:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
f.name:SetPoint("LEFT", f.iconbg, "RIGHT", 5, 0)
f.name:SetPoint("RIGHT", f, "RIGHT", -100, 0)
f.name:SetJustifyH("LEFT")
f:SetScript("OnEnter", function()
this:SetBackdropBorderColor(1, 1, 1, .08)
if this.itemLink then
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
GameTooltip:SetHyperlink(this.itemLink)
GameTooltip:Show()
end
end)
f:SetScript("OnLeave", function()
this:SetBackdropBorderColor(1, 1, 1, .04)
GameTooltip:Hide()
end)
f:SetScript("OnClick", function()
local id = this.rollID
if id then expanded[id] = not expanded[id]; FullUpdate() end
end)
return f
end
local function CreatePlayerFrame()
local f = CreateFrame("Frame", nil, list)
f:SetSize(PLAYER_W, PLAYER_H)
-- name is indented to leave room for the winner checkmark on its left
f.name = f:CreateFontString("Status", "OVERLAY", "GameFontNormal")
f.name:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
f.name:SetPoint("LEFT", 20, 0)
f.name:SetJustifyH("LEFT")
f.rollicon = f:CreateTexture(nil, "OVERLAY")
f.rollicon:SetSize(16, 16)
f.rollicon:SetPoint("RIGHT", -4, 0)
f.rolltext = f:CreateFontString("Status", "OVERLAY", "GameFontNormal")
f.rolltext:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
f.rolltext:SetPoint("RIGHT", f.rollicon, "LEFT", -3, 0)
f.rolltext:SetTextColor(1, 1, 1, 1)
-- winner checkmark, just left of the player name (matches reference)
f.winmark = f:CreateTexture(nil, "OVERLAY")
f.winmark:SetSize(16, 16)
f.winmark:SetTexture(WINMARK)
f.winmark:SetPoint("RIGHT", f.name, "LEFT", -1, 0)
return f
end
local function RecycleAllPlayers()
for i = 1, table.getn(usedPlayers) do
local pf = usedPlayers[i]
pf:Hide()
table.insert(freePlayers, pf)
end
usedPlayers = {}
end
local function GetPlayerFrame()
local pf = table.remove(freePlayers) or CreatePlayerFrame()
table.insert(usedPlayers, pf)
return pf
end
local function SetToggleTexture(toggle, isExpanded)
if isExpanded then
toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up")
toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-Down")
else
toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down")
end
end
-- ==========================================================================
-- Rendering
-- ==========================================================================
local function UpdateItemFrame(f, i)
local rollID, itemLink, numPlayers, isDone, winnerIdx = C_LootHistory.GetItem(i)
f.rollID = rollID
f.itemIdx = i
f.itemLink = itemLink
f.numPlayers = numPlayers or 0
f.isDone = isDone
local isExpanded = rollID and expanded[rollID]
SetToggleTexture(f.toggle, isExpanded)
-- Item icon/name/quality via the ClassicAPI Item mixin. When the item
-- isn't cached yet, show a placeholder and re-paint this row from the
-- ContinueOnItemLoad callback (guarded on rollID: rows are pooled, so the
-- callback must no-op if the row has since been reused for another roll).
local item = itemLink and Item:CreateFromItemLink(itemLink)
if item and not item:IsItemEmpty() then
if item:IsItemDataCached() then
RenderItemVisual(f, item)
else
ShowRetrieving(f)
local pending = rollID
item:ContinueOnItemLoad(function()
if f.rollID == pending then RenderItemVisual(f, item) end
end)
end
else
ShowRetrieving(f)
end
-- winner summary only on a decided, collapsed row
if isDone and not isExpanded then
if winnerIdx then
local wname, wclass, wrollType, wroll = C_LootHistory.GetPlayerInfo(i, winnerIdx)
f.winicon:SetTexture(ROLL_TEX[wrollType] or ROLL_TEX[ROLL_NEED])
f.winicon:Show()
if wroll and wroll > 0 then f.winroll:SetText(wroll) else f.winroll:SetText("") end
f.winroll:Show()
f.winname:SetText(wname or UNKNOWN)
f.winname:SetTextColor(ClassColor(wclass))
f.winname:Show()
else
-- nobody won: everyone passed
f.winicon:SetTexture(ROLL_TEX[ROLL_PASS])
f.winicon:Show()
f.winroll:SetText("")
f.winroll:Show()
f.winname:SetText(T["All players passed"])
f.winname:SetTextColor(1, .4, .4)
f.winname:Show()
end
else
f.winicon:Hide()
f.winroll:Hide()
f.winname:Hide()
end
end
local function RenderPlayerFrame(pf, name, class, rollType, roll, isWinner)
pf.name:SetText(name or UNKNOWN)
pf.name:SetTextColor(ClassColor(class))
pf.rollicon:SetTexture(ROLL_TEX[rollType] or ROLL_TEX[ROLL_PASS])
if roll and roll > 0 then pf.rolltext:SetText(roll) else pf.rolltext:SetText("") end
if isWinner then pf.winmark:Show() else pf.winmark:Hide() end
end
-- A player row is worth showing while the roll is undecided (see everyone),
-- or afterwards only if they actually rolled or it's you (hide the passers'
-- noise on a decided roll) — mirrors Blizzard's ShouldDisplayPlayer.
local function ShouldDisplayPlayer(isDone, roll, isMe)
return isMe or (roll and roll > 0) or not isDone
end
function FullUpdate()
if not pfUI.loothistory:IsShown() then return end
RecycleAllPlayers()
local num = C_LootHistory.GetNumItems()
local y = -2
for i = 1, num do
local f = itemFrames[i] or CreateItemFrame()
itemFrames[i] = f
UpdateItemFrame(f, i)
f:ClearAllPoints()
f:SetPoint("TOPLEFT", list, "TOPLEFT", 4, y)
f:Show()
y = y - ITEM_H - 2
if f.rollID and expanded[f.rollID] then
for p = 1, f.numPlayers do
local name, class, rollType, roll, isWinner, isMe = C_LootHistory.GetPlayerInfo(i, p)
if ShouldDisplayPlayer(f.isDone, roll, isMe) then
local pf = GetPlayerFrame()
RenderPlayerFrame(pf, name, class, rollType, roll, isWinner)
pf:ClearAllPoints()
pf:SetPoint("TOPLEFT", list, "TOPLEFT", 22, y)
pf:Show()
y = y - PLAYER_H
end
end
y = y - 2
end
end
for i = num + 1, table.getn(itemFrames) do
itemFrames[i]:Hide()
end
-- Resize the scroll child and re-attach it: SetHeight alone on a
-- SetAllPoints'd child doesn't make the ScrollFrame recompute its scroll
-- range, so a dynamically-grown list wouldn't scroll until a /reload.
list:SetHeight(math.max(1, -y + 2))
pfUI.loothistory.scroll:SetScrollChild(list)
pfUI.loothistory.scroll:UpdateScrollState()
end
pfUI.loothistory:SetScript("OnShow", function() FullUpdate() end)
-- ==========================================================================
-- Events
-- ==========================================================================
local events = CreateFrame("Frame")
events:RegisterEvent("LOOT_HISTORY_FULL_UPDATE")
events:RegisterEvent("LOOT_HISTORY_ROLL_CHANGED")
events:RegisterEvent("LOOT_HISTORY_ROLL_COMPLETE")
events:SetScript("OnEvent", function()
-- auto-show on a new roll opening / completing, if enabled
if C.loothistory.autoshow == "1"
and (event == "LOOT_HISTORY_FULL_UPDATE" or event == "LOOT_HISTORY_ROLL_COMPLETE")
and not pfUI.loothistory:IsShown() then
pfUI.loothistory:Show() -- OnShow runs FullUpdate
return
end
FullUpdate() -- no-op while hidden
end)
-- ==========================================================================
-- Slash command
-- ==========================================================================
local function Toggle()
pfUI.loothistory:SetShown(not pfUI.loothistory:IsShown())
end
pfUI.api.RegisterSlashCommand("PFLOOTHISTORY", { "/loothistory", "/pfloothistory" }, Toggle, true)
end)
+4 -4
View File
@@ -54,7 +54,7 @@ pfUI:RegisterModule("map", function ()
if not this.hooked then if not this.hooked then
this.hooked = true this.hooked = true
HookScript(WorldMapFrame, "OnShow", function() WorldMapFrame:HookScript("OnShow", function()
-- customize -- customize
this:EnableKeyboard(false) this:EnableKeyboard(false)
this:EnableMouseWheel(1) this:EnableMouseWheel(1)
@@ -66,7 +66,7 @@ pfUI:RegisterModule("map", function ()
pfOrigSetMapToCurrentZone() pfOrigSetMapToCurrentZone()
end) end)
HookScript(WorldMapFrame, "OnMouseWheel", function() WorldMapFrame:HookScript("OnMouseWheel", function()
if IsShiftKeyDown() then if IsShiftKeyDown() then
alpha = clamp(WorldMapFrame:GetAlpha() + arg1/10, 0.1, 1.0) alpha = clamp(WorldMapFrame:GetAlpha() + arg1/10, 0.1, 1.0)
WorldMapFrame:SetAlpha(alpha) WorldMapFrame:SetAlpha(alpha)
@@ -91,11 +91,11 @@ pfUI:RegisterModule("map", function ()
SaveMovable(this, true) SaveMovable(this, true)
end) end)
HookScript(WorldMapFrame, "OnDragStart", function() WorldMapFrame:HookScript("OnDragStart", function()
WorldMapFrame:StartMoving() WorldMapFrame:StartMoving()
end) end)
HookScript(WorldMapFrame, "OnDragStop",function() WorldMapFrame:HookScript("OnDragStop",function()
WorldMapFrame:StopMovingOrSizing() WorldMapFrame:StopMovingOrSizing()
SaveMovable(this, true) SaveMovable(this, true)
end) end)
+4 -4
View File
@@ -125,13 +125,13 @@ pfUI:RegisterModule("mapcolors", function ()
-- WorldMap -- WorldMap
Initialize('WorldMap') Initialize('WorldMap')
pfUI.hooksecurefunc('WorldMapButton_OnUpdate', function() hooksecurefunc('WorldMapButton_OnUpdate', function()
if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end
UpdateUnitFrames('WorldMap') UpdateUnitFrames('WorldMap')
end) end)
if C.appearance.worldmap.colornames == "1" then if C.appearance.worldmap.colornames == "1" then
pfUI.hooksecurefunc('WorldMapUnit_OnEnter', function() hooksecurefunc('WorldMapUnit_OnEnter', function()
if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end
UpdateUnitColors('WorldMap', WorldMapTooltip) UpdateUnitColors('WorldMap', WorldMapTooltip)
end) end)
@@ -141,13 +141,13 @@ pfUI:RegisterModule("mapcolors", function ()
HookAddonOrVariable("Blizzard_BattlefieldMinimap", function() HookAddonOrVariable("Blizzard_BattlefieldMinimap", function()
Initialize('BattlefieldMinimap') Initialize('BattlefieldMinimap')
pfUI.hooksecurefunc('BattlefieldMinimap_OnUpdate', function() hooksecurefunc('BattlefieldMinimap_OnUpdate', function()
if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end
UpdateUnitFrames('BattlefieldMinimap') UpdateUnitFrames('BattlefieldMinimap')
end) end)
if C.appearance.worldmap.colornames == "1" then if C.appearance.worldmap.colornames == "1" then
pfUI.hooksecurefunc('BattlefieldMinimapUnit_OnEnter', function() hooksecurefunc('BattlefieldMinimapUnit_OnEnter', function()
if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end if ( this.tick or .5) > GetTime() then return else this.tick = GetTime() + .5 end
UpdateUnitColors('BattlefieldMinimap', GameTooltip) UpdateUnitColors('BattlefieldMinimap', GameTooltip)
end) end)
+33 -70
View File
@@ -30,25 +30,6 @@ pfUI:RegisterModule("mapreveal", function ()
pfUI.mapreveal:UpdateConfig() pfUI.mapreveal:UpdateConfig()
end) end)
local function unpack_hash(prefix, hash)
local _, stored_prefix, textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY, name
_, _, stored_prefix, textureName, textureWidth, textureHeight, offsetX, offsetY = string.find(hash, "^([|]?)([^:]+):([^:]+):([^:]+):([^:]+):([^:]+)")
if (not textureName or not offsetY) then
return
end
if (offsetY) then
_, _, mapPointX, mapPointY = string.find(hash,"^[|]?[^:]+:[^:]+:[^:]+:[^:]+:[^:]+:([^:]+):([^:]+)")
end
if (not mapPointY) then
mapPointX = 0 mapPointY = 0
end
if (stored_prefix ~= "|") then
name = textureName
textureName = string.format("%s%s",prefix,textureName)
end
return textureName, textureWidth + 0, textureHeight + 0, offsetX + 0, offsetY + 0, mapPointX + 0, mapPointY + 0, name
end
local explores = {} local explores = {}
local explorecaches = {} local explorecaches = {}
local alreadyknown = {} -- per-zone accumulator: { [zone] = { [texName] = true } } local alreadyknown = {} -- per-zone accumulator: { [zone] = { [texName] = true } }
@@ -88,13 +69,6 @@ pfUI:RegisterModule("mapreveal", function ()
end end
end end
-- overlay data with lazy init
local overlayData = setmetatable(pfMapOverlayData, {__index = function(t,k)
local v = {}
rawset(t,k,v)
return v
end})
local function pfWorldMapFrame_Update() local function pfWorldMapFrame_Update()
-- clear stale caches -- clear stale caches
for k in pairs(explorecaches) do explorecaches[k] = nil end for k in pairs(explorecaches) do explorecaches[k] = nil end
@@ -108,7 +82,6 @@ pfUI:RegisterModule("mapreveal", function ()
local mapFileName = GetMapInfo() local mapFileName = GetMapInfo()
if not mapFileName then mapFileName = "World" end if not mapFileName then mapFileName = "World" end
local prefix = string.format("Interface\\WorldMap\\%s\\", mapFileName)
local numOverlays = GetNumMapOverlays() local numOverlays = GetNumMapOverlays()
-- accumulate explored overlays per zone (never clear, only add) -- accumulate explored overlays per zone (never clear, only add)
@@ -123,12 +96,18 @@ pfUI:RegisterModule("mapreveal", function ()
-- hide explore icons -- hide explore icons
for _, frame in pairs(explores) do frame:Hide() end for _, frame in pairs(explores) do frame:Hide() end
local zoneData = overlayData[mapFileName] -- ClassicAPI: full overlay list for the viewed zone (explored + unexplored),
-- read straight from WorldMapOverlay.dbc. Replaces the hand-measured pfMapOverlayData.
local zoneData = C_Map.GetMapOverlays() or {}
local textureCount = 0 local textureCount = 0
for i, hash in ipairs(zoneData) do for i, overlay in ipairs(zoneData) do
local textureName, textureWidth, textureHeight, offsetX, offsetY, mapPointX, mapPointY, name = unpack_hash(prefix, hash) local name = overlay.textureName -- bare, e.g. "DRYGULCHRAVINE"
if not textureName then break end local textureName = overlay.texturePath -- full engine path (for SetTexture)
local textureWidth = overlay.textureWidth
local textureHeight = overlay.textureHeight
local offsetX = overlay.offsetX
local offsetY = overlay.offsetY
-- explore magnifying glass icon -- explore magnifying glass icon
explores[i] = explores[i] or CreateFrame("Frame", nil, WorldMapDetailFrame) explores[i] = explores[i] or CreateFrame("Frame", nil, WorldMapDetailFrame)
@@ -146,6 +125,8 @@ pfUI:RegisterModule("mapreveal", function ()
explore.tex:SetTexCoord(.08, .92, .08, .92) explore.tex:SetTexCoord(.08, .92, .08, .92)
explore.tex:SetAllPoints() explore.tex:SetAllPoints()
-- `alreadyknown` stores the FULL paths GetMapOverlayInfo returns,
-- so compare with the full path, not the bare name.
if C.appearance.worldmap.mapexploration == "1" and not zoneKnown[string.upper(textureName)] then if C.appearance.worldmap.mapexploration == "1" and not zoneKnown[string.upper(textureName)] then
explore.tex:SetTexture("Interface\\WorldMap\\WorldMap-MagnifyingGlass") explore.tex:SetTexture("Interface\\WorldMap\\WorldMap-MagnifyingGlass")
explore:Show() explore:Show()
@@ -155,49 +136,31 @@ pfUI:RegisterModule("mapreveal", function ()
-- render overlay texture tiles on BORDER draw layer -- render overlay texture tiles on BORDER draw layer
-- Blizzard's explored overlays on ARTWORK draw on top of BORDER -- Blizzard's explored overlays on ARTWORK draw on top of BORDER
--
-- overlay.tiles is pre-resolved by ClassicAPI: per-tile file /
-- draw size / texcoords / canvas position, with Octo's data
-- quirks (sliver columns the DBC rect rounds away, foreign tiles
-- appended to the number sequence, upscaled re-exports) already
-- disambiguated from the actual BLP dimensions. No 256px grid
-- math here — deriving the grid from textureWidth/Height is
-- exactly what shears quirky overlays (e.g. Icepoint's Kaneq'nuun).
if C.appearance.worldmap.mapreveal == "1" then if C.appearance.worldmap.mapreveal == "1" then
local numH = math.ceil(textureWidth / 256) for _, tile in ipairs(overlay.tiles) do
local numV = math.ceil(textureHeight / 256) textureCount = textureCount + 1
local texPixW, texFileW, texPixH, texFileH local tex = pfGetOverlay(textureCount)
for j = 1, numV do tex:SetWidth(tile.width)
if j < numV then tex:SetHeight(tile.height)
texPixH = 256 tex:SetTexCoord(0, tile.texCoordX, 0, tile.texCoordY)
texFileH = 256 tex:ClearAllPoints()
else tex:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", tile.offsetX, -tile.offsetY)
texPixH = mod(textureHeight, 256) tex:SetTexture(tile.file)
if texPixH == 0 then texPixH = 256 end
texFileH = 16
while texFileH < texPixH do texFileH = texFileH * 2 end
end
for k = 1, numH do explorecaches[name] = explorecaches[name] or {}
textureCount = textureCount + 1 explorecaches[name][tex] = true
local tex = pfGetOverlay(textureCount)
if k < numH then tex:SetVertexColor(r,g,b,a)
texPixW = 256 tex:Show()
texFileW = 256
else
texPixW = mod(textureWidth, 256)
if texPixW == 0 then texPixW = 256 end
texFileW = 16
while texFileW < texPixW do texFileW = texFileW * 2 end
end
tex:SetWidth(texPixW)
tex:SetHeight(texPixH)
tex:SetTexCoord(0, texPixW/texFileW, 0, texPixH/texFileH)
tex:ClearAllPoints()
tex:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", offsetX + 256*(k-1), -(offsetY + 256*(j-1)))
tex:SetTexture(string.format("%s%s", textureName, ((j-1)*numH + k)))
explorecaches[name] = explorecaches[name] or {}
explorecaches[name][tex] = true
tex:SetVertexColor(r,g,b,a)
tex:Show()
end
end end
end end
end end
-1
View File
@@ -1,4 +1,3 @@
pfUI:RegisterNewModule("marktracking", "Mark Tracker")
pfUI:RegisterModule("marktracking", function () pfUI:RegisterModule("marktracking", function ()
-- Requires mark1-mark8 unit tokens (Turtle WoW / Nampower) -- Requires mark1-mark8 unit tokens (Turtle WoW / Nampower)
if not UnitExists("mark1") and not UnitExists("mark8") then if not UnitExists("mark1") and not UnitExists("mark8") then
+1 -1
View File
@@ -58,7 +58,7 @@ pfUI:RegisterModule("minimap", function ()
pfUI.minimap:UpdateConfig() pfUI.minimap:UpdateConfig()
pfUI.hooksecurefunc("ToggleMinimap", function() hooksecurefunc("ToggleMinimap", function()
if pfUI.farmmap and pfUI.farmmap:IsShown() then if pfUI.farmmap and pfUI.farmmap:IsShown() then
Minimap:Hide() Minimap:Hide()
return return
+2 -3
View File
@@ -1,6 +1,5 @@
pfUI:RegisterModule("mouseover", function () pfUI:RegisterModule("mouseover", function ()
_G.SLASH_PFCAST1, _G.SLASH_PFCAST2 = "/pfcast", "/pfmouse" pfUI.api.RegisterSlashCommand("PFCAST", { "/pfcast", "/pfmouse" }, function(msg)
function SlashCmdList.PFCAST(msg)
local func = pfUI.api.TryMemoizedFuncLoadstringForSpellCasts(msg) local func = pfUI.api.TryMemoizedFuncLoadstringForSpellCasts(msg)
local unit = "mouseover" local unit = "mouseover"
@@ -30,5 +29,5 @@ pfUI:RegisterModule("mouseover", function ()
if restore_target then TargetUnit(unit) end if restore_target then TargetUnit(unit) end
func() func()
if restore_target then TargetLastTarget() end if restore_target then TargetLastTarget() end
end end, true)
end) end)
+1 -1
View File
@@ -695,7 +695,7 @@ end
end end
end end
HookScript(nameplate.original.healthbar, "OnValueChanged", nameplates.OnValueChanged) nameplate.original.healthbar:HookScript("OnValueChanged", nameplates.OnValueChanged)
-- adjust sizes and scaling of the nameplate -- adjust sizes and scaling of the nameplate
nameplate:SetScale(UIParent:GetScale()) nameplate:SetScale(UIParent:GetScale())
+2 -4
View File
@@ -150,9 +150,7 @@ pfUI:RegisterModule("nampower", function ()
-- /disenchantall slash command (DisenchantAll is Nampower-provided) -- /disenchantall slash command (DisenchantAll is Nampower-provided)
if DisenchantAll then if DisenchantAll then
_G.SLASH_PFDISENCHANTALL1 = "/disenchantall" pfUI.api.RegisterSlashCommand("PFDISENCHANTALL", { "/disenchantall", "/dea" }, function(msg)
_G.SLASH_PFDISENCHANTALL2 = "/dea"
SlashCmdList["PFDISENCHANTALL"] = function(msg)
-- DisenchantAll(itemIdOrName | quality, [includeSoulbound]). -- DisenchantAll(itemIdOrName | quality, [includeSoulbound]).
-- Quality is a string keyword ("greens", "blues", "purples", or pipe- -- Quality is a string keyword ("greens", "blues", "purples", or pipe-
-- combined). Numbers are interpreted as item IDs, not quality levels. -- combined). Numbers are interpreted as item IDs, not quality levels.
@@ -161,7 +159,7 @@ pfUI:RegisterModule("nampower", function ()
local target = tonumber(arg) or arg local target = tonumber(arg) or arg
DisenchantAll(target) DisenchantAll(target)
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: DisenchantAll(" .. tostring(target) .. ")") DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: DisenchantAll(" .. tostring(target) .. ")")
end end, true)
end end
-- Druid Secondary Mana Bar -- Druid Secondary Mana Bar
+1 -1
View File
@@ -141,7 +141,7 @@ pfUI:RegisterModule("player", function ()
end end
end end
pfUI.hooksecurefunc("UnitPopup_OnClick", function() hooksecurefunc("UnitPopup_OnClick", function()
local button = this.value local button = this.value
if button == "RESET_INSTANCES_FIX" then if button == "RESET_INSTANCES_FIX" then
StaticPopup_Show("CONFIRM_RESET_INSTANCES") StaticPopup_Show("CONFIRM_RESET_INSTANCES")
+1 -1
View File
@@ -95,7 +95,7 @@ pfUI:RegisterModule("questitem", function ()
-- itemref tooltip (chat link clicks): hooksecurefunc runs after SetItemRef -- itemref tooltip (chat link clicks): hooksecurefunc runs after SetItemRef
-- populates ItemRefTooltip, so we just read the item back out of the tooltip -- populates ItemRefTooltip, so we just read the item back out of the tooltip
-- instead of re-parsing the "item:NNN" out of the link string. -- instead of re-parsing the "item:NNN" out of the link string.
pfUI.hooksecurefunc("SetItemRef", function() hooksecurefunc("SetItemRef", function()
if IsModifierKeyDown() then return end if IsModifierKeyDown() then return end
if ItemRefTooltip:HasItem() then if ItemRefTooltip:HasItem() then
local _, _, id = ItemRefTooltip:GetItem() local _, _, id = ItemRefTooltip:GetItem()
+1 -1
View File
@@ -164,7 +164,7 @@ pfUI:RegisterModule("raid", function ()
end end
end end
pfUI.hooksecurefunc("UnitPopup_OnClick", function() hooksecurefunc("UnitPopup_OnClick", function()
local dropdownFrame = UIDROPDOWNMENU_INIT_MENU and _G[UIDROPDOWNMENU_INIT_MENU] local dropdownFrame = UIDROPDOWNMENU_INIT_MENU and _G[UIDROPDOWNMENU_INIT_MENU]
if not dropdownFrame then return end if not dropdownFrame then return end
local button = this.value local button = this.value
+138 -15
View File
@@ -1,13 +1,11 @@
pfUI:RegisterModule("sellvalue", function () pfUI:RegisterModule("sellvalue", function ()
local function AddVendorPrices(frame, id, count) local function AddVendorPrices(frame, id, count)
if not id then return end if not id then return end
-- Sell price comes from the engine (item DBC); buy price from pfSellData
-- (curated vendor data, since vendor purchase prices aren't a static field).
local sell = C_Item.GetItemSellPriceByID(id) or 0 local sell = C_Item.GetItemSellPriceByID(id) or 0
local buy = pfSellData[id] local buy = pfSellData[id]
if sell == 0 and not buy then return end if sell == 0 and not buy then return end
if C.tooltip.vendor.showalways == "1" or IsShiftKeyDown() then if C.tooltip.vendor.showalways == "1" or IsShiftKeyDown() then
frame:AddLine(" ") frame:AddLine(" ")
if sell > 0 then if sell > 0 then
@@ -25,26 +23,151 @@ pfUI:RegisterModule("sellvalue", function ()
frame:AddDoubleLine(T["Buy"] .. ":", CreateGoldString(buy), 1, 1, 1) frame:AddDoubleLine(T["Buy"] .. ":", CreateGoldString(buy), 1, 1, 1)
end end
end end
elseif not MerchantFrame:IsShown() and sell > 0 then
SetTooltipMoney(frame, sell * count)
end end
frame:Show() frame:Show()
end end
pfUI.sellvalue = CreateFrame("Frame", "pfGameTooltip", GameTooltip) hooksecurefunc("SetItemRef", function()
pfUI.sellvalue:SetScript("OnShow", function()
if GameTooltip:HasItem() then
local _, _, id = GameTooltip:GetItem()
if id then
local count = tonumber(libtooltip:GetItemCount()) or 1
AddVendorPrices(GameTooltip, id, math.max(count, 1))
end
end
end)
pfUI.hooksecurefunc("SetItemRef", function()
if IsModifierKeyDown() then return end if IsModifierKeyDown() then return end
if ItemRefTooltip:HasItem() then if ItemRefTooltip:HasItem() then
local _, _, id = ItemRefTooltip:GetItem() local _, _, id = ItemRefTooltip:GetItem()
if id then AddVendorPrices(ItemRefTooltip, id, 1) end if id then AddVendorPrices(ItemRefTooltip, id, 1) end
end end
end) end)
local TooltipHooks = {
SetLootRollItem = {
id = GetLootRollItemID,
count = function(slot)
local _, _, count = GetLootRollItemInfo(slot)
return count
end
},
SetLootItem = {
id = GetLootSlotItemID,
count = function(slot)
local _, _, count = GetLootSlotInfo(slot)
return count
end
},
SetQuestLogItem = {
id = GetQuestLogItemID,
count = function(type, index)
local itemCount, _;
if type == "choice" then
_, _, itemCount = GetQuestLogChoiceInfo(index);
else
_, _, itemCount = GetQuestLogRewardInfo(index)
end
return itemCount
end,
},
SetQuestItem = {
id = GetQuestItemID,
count = function(type, index)
local _, _, count = GetQuestItemInfo(type, index);
return count
end,
},
SetHyperlink = { id = C_Item.GetItemInfoInstant },
SetBagItem = {
id = C_Container.GetContainerItemID,
count = function(container, slot)
local _, count = GetContainerItemInfo(container, slot)
return count
end,
},
SetInboxItem = {
id = GetInboxItemID,
count = function(index)
local _, _, _, count = GetInboxItem(index)
return count
end,
},
SetSendMailItem = {
id = function()
local _, id = GetSendMailItemLink()
return id
end,
count = function()
local _, _, count = GetSendMailItem()
return count
end,
},
SetInventoryItem = { id = GetInventoryItemID },
SetTradeSkillItem = {
id = function(skillIndex, reagentIndex)
if reagentIndex then
return GetTradeSkillReagentItemID(skillIndex, reagentIndex)
else
return GetTradeSkillItemID(skillIndex)
end
end,
count = function(skillIndex, reagentIndex)
if reagentIndex then
local _, _, itemCount = GetTradeSkillReagentInfo(skillIndex, reagentIndex)
return itemCount
else
return GetTradeSkillNumMade(skillIndex)
end
end,
},
SetAuctionItem = {
id = GetAuctionItemLink,
count = function(viewType, index)
local _, _, count = GetAuctionItemInfo(viewType, index)
return count
end,
},
SetAuctionSellItem = { id = GetAuctionSellItemLink },
SetTradePlayerItem = {
id = GetTradePlayerItemLink,
count = function(id)
local _, _, count = GetTradePlayerItemInfo(id)
return count
end,
},
SetTradeTargetItem = {
id = GetTradeTargetItemLink,
count = function(id)
local _, _, count = GetTradeTargetItemInfo(id)
return count
end,
},
SetMerchantItem = {
id = GetMerchantItemID,
count = function(index)
local _, _, _, itemCount = GetMerchantItemInfo(index)
return itemCount
end
},
SetCraftItem = {
id = function(recipeIndex, reagentIndex)
return GetCraftReagentItemID(recipeIndex, reagentIndex)
end
},
SetBuybackItem = {
id = C_MerchantFrame.GetBuybackItemID,
count = function(slotIndex)
local _, _, _, itemCount = GetBuybackItemInfo(slotIndex)
return itemCount
end
}
}
local function makeHook(entry)
return function(tooltip, arg1, arg2, arg3)
AddVendorPrices(tooltip, entry.id(arg1, arg2, arg3), entry.count and entry.count(arg1, arg2, arg3) or 1)
end
end
local function HookTooltip(tooltip)
for setter, entry in pairs(TooltipHooks) do
hooksecurefunc(tooltip, setter, makeHook(entry))
end
end
HookTooltip(GameTooltip)
end) end)
+2 -3
View File
@@ -389,9 +389,8 @@ pfUI:RegisterModule("share", function ()
end) end)
end end
_G.SLASH_PFEXPORT1, _G.SLASH_PFEXPORT2, _G.SLASH_PFEXPORT3 = "/export", "/import", "/share" pfUI.api.RegisterSlashCommand("PFEXPORT", { "/export", "/import", "/share" }, function(msg, editbox)
function SlashCmdList.PFEXPORT(msg, editbox)
f:Show() f:Show()
end end, true)
end end
end) end)
+2 -2
View File
@@ -51,12 +51,12 @@ pfUI:RegisterModule("skin", function ()
DurabilityFrame.SetPoint = function() return end DurabilityFrame.SetPoint = function() return end
if C.appearance.cd.blizzard == "1" then if C.appearance.cd.blizzard == "1" then
pfUI.hooksecurefunc("PaperDollItemSlotButton_Update", function() hooksecurefunc("PaperDollItemSlotButton_Update", function()
local cooldown = _G[this:GetName().."Cooldown"] local cooldown = _G[this:GetName().."Cooldown"]
if cooldown then cooldown.pfCooldownType = "BLIZZARD" end if cooldown then cooldown.pfCooldownType = "BLIZZARD" end
end) end)
pfUI.hooksecurefunc("SpellButton_UpdateButton", function() hooksecurefunc("SpellButton_UpdateButton", function()
local cooldown = _G[this:GetName().."Cooldown"] local cooldown = _G[this:GetName().."Cooldown"]
if cooldown then cooldown.pfCooldownType = "BLIZZARD" end if cooldown then cooldown.pfCooldownType = "BLIZZARD" end
end) end)
+3 -3
View File
@@ -10,7 +10,7 @@ pfUI:RegisterModule("socialmod", function ()
end end
end) end)
do -- add colors to guild list do -- add colors to guild list
pfUI.hooksecurefunc("GuildStatus_Update", function() hooksecurefunc("GuildStatus_Update", function()
local playerzone = GetRealZoneText() local playerzone = GetRealZoneText()
local off = FauxScrollFrame_GetOffset(GuildListScrollFrame) local off = FauxScrollFrame_GetOffset(GuildListScrollFrame)
for i=1, GUILDMEMBERS_TO_DISPLAY, 1 do for i=1, GUILDMEMBERS_TO_DISPLAY, 1 do
@@ -70,7 +70,7 @@ pfUI:RegisterModule("socialmod", function ()
end end
do -- add colors to friend list do -- add colors to friend list
pfUI.hooksecurefunc("FriendsList_Update", function() hooksecurefunc("FriendsList_Update", function()
if GetNumFriends() == 0 then return end if GetNumFriends() == 0 then return end
local playerzone = GetRealZoneText() local playerzone = GetRealZoneText()
@@ -123,7 +123,7 @@ pfUI:RegisterModule("socialmod", function ()
end end
do -- add colors to who list do -- add colors to who list
pfUI.hooksecurefunc("WhoList_Update", function() hooksecurefunc("WhoList_Update", function()
local num, max = GetNumWhoResults() local num, max = GetNumWhoResults()
local off = FauxScrollFrame_GetOffset(WhoListScrollFrame) local off = FauxScrollFrame_GetOffset(WhoListScrollFrame)
+4 -7
View File
@@ -2,8 +2,7 @@
-- https://github.com/balakethelock/SuperWoW -- https://github.com/balakethelock/SuperWoW
-- DLL Status Check Command (always available) -- DLL Status Check Command (always available)
SLASH_PFDLLSTATUS1 = "/pfdll" pfUI.api.RegisterSlashCommand("PFDLLSTATUS", { "/pfdll" }, function()
SlashCmdList["PFDLLSTATUS"] = function()
local chat = DEFAULT_CHAT_FRAME local chat = DEFAULT_CHAT_FRAME
chat:AddMessage("|cff33ffccpfUI|r: DLL Status Check") chat:AddMessage("|cff33ffccpfUI|r: DLL Status Check")
@@ -43,7 +42,7 @@ SlashCmdList["PFDLLSTATUS"] = function()
else else
chat:AddMessage(" |cffff0000Target frame|r: NOT found") chat:AddMessage(" |cffff0000Target frame|r: NOT found")
end end
end end, true)
pfUI:RegisterModule("superwow", function () pfUI:RegisterModule("superwow", function ()
if SetAutoloot and SpellInfo and not SUPERWOW_VERSION then if SetAutoloot and SpellInfo and not SUPERWOW_VERSION then
@@ -173,12 +172,10 @@ pfUI:RegisterModule("superwow", function ()
end end
-- Add slash command for clickthrough toggle -- Add slash command for clickthrough toggle
_G.SLASH_PFCLICKTHROUGH1 = "/clickthrough" pfUI.api.RegisterSlashCommand("PFCLICKTHROUGH", { "/clickthrough", "/ct" }, function()
_G.SLASH_PFCLICKTHROUGH2 = "/ct"
SlashCmdList["PFCLICKTHROUGH"] = function()
local enabled = pfUI.api.ToggleClickthrough() local enabled = pfUI.api.ToggleClickthrough()
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Clickthrough mode " .. (enabled and "|cff00ff00enabled|r" or "|cffff0000disabled|r")) DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: Clickthrough mode " .. (enabled and "|cff00ff00enabled|r" or "|cffff0000disabled|r"))
end end, true)
end end
end) end)
+39 -6
View File
@@ -1,4 +1,3 @@
pfUI:RegisterNewModule("swingtimer", "Swing Timer")
pfUI:RegisterModule("swingtimer", function () pfUI:RegisterModule("swingtimer", function ()
local rawborder, border = GetBorderSize() local rawborder, border = GetBorderSize()
@@ -28,9 +27,10 @@ pfUI:RegisterModule("swingtimer", function ()
pendingCastSpellId = nil, pendingCastSpellId = nil,
mhFrozenAt = nil, mhFrozenAt = nil,
hsQueued = false, cleaveQueued = false, maulQueued = false, hsQueued = false, cleaveQueued = false, maulQueued = false,
hsSeenCurrent = false, cleaveSeenCurrent = false, maulSeenCurrent = false,
isWarrior = false, isWarrior = false,
isDruid = false, isDruid = false,
cachedHSSlots = {}, cachedCleaveSlots = {}, cachedHSSlots = {}, cachedCleaveSlots = {}, cachedMaulSlots = {},
useSpellQueueEvent = false, useSpellQueueEvent = false,
swingThrottle = 0, swingThrottle = 0,
onSwingCache = {}, onSwingCache = {},
@@ -416,17 +416,20 @@ pfUI:RegisterModule("swingtimer", function ()
S.hsQueued = (kind == "hs") S.hsQueued = (kind == "hs")
S.cleaveQueued = (kind == "cleave") S.cleaveQueued = (kind == "cleave")
S.maulQueued = (kind == "maul") S.maulQueued = (kind == "maul")
S.hsSeenCurrent, S.cleaveSeenCurrent, S.maulSeenCurrent = false, false, false
end end
local function RebuildQueueSlotCache() local function RebuildQueueSlotCache()
if not S.isWarrior or not sw_hsqueue or S.useSpellQueueEvent then return end if not sw_hsqueue then return end
S.cachedHSSlots = {} S.cachedHSSlots = {}
S.cachedCleaveSlots = {} S.cachedCleaveSlots = {}
S.cachedMaulSlots = {}
if not (S.isWarrior or S.isDruid) then return end
for slot = 1, 120 do for slot = 1, 120 do
local kind, id = GetActionInfo(slot) local kind, id = GetActionInfo(slot)
local name local name
if kind == "spell" then if kind == "spell" then
name = GetSpellInfo(id) name = C_Spell.GetSpellName(id)
elseif kind == "macro" then elseif kind == "macro" then
name = GetMacroSpell(id) name = GetMacroSpell(id)
end end
@@ -434,6 +437,8 @@ pfUI:RegisterModule("swingtimer", function ()
table.insert(S.cachedHSSlots, slot) table.insert(S.cachedHSSlots, slot)
elseif name == CLEAVE_NAME then elseif name == CLEAVE_NAME then
table.insert(S.cachedCleaveSlots, slot) table.insert(S.cachedCleaveSlots, slot)
elseif name == MAUL_NAME then
table.insert(S.cachedMaulSlots, slot)
end end
end end
end end
@@ -445,9 +450,30 @@ pfUI:RegisterModule("swingtimer", function ()
return false return false
end end
-- Reconcile a stale event-driven queue flag against the client's current
-- action. Not every de-queue emits a SPELL_QUEUE pop — pressing Esc or
-- re-pressing to cancel an on-swing spell doesn't — so the flag alone stays
-- set. IsCurrentAction, which the client clears on cancel, is the reconciling
-- signal, but only after it has confirmed the ability as current at least once
-- (`seen`): a nampower-initiated cast may never flip IsCurrentAction, and must
-- keep its color until its own pop/resolve rather than be cleared early.
-- Returns the updated (queued, seen).
local function ReconcileQueued(queued, slots, seen)
if not queued then return false, false end
if CheckQueuedAction(slots) then return true, true end
if seen then return false, false end -- was current, now gone -> cancelled
return true, false -- never confirmed current -> keep
end
local function IsHSOrCleaveQueued() local function IsHSOrCleaveQueued()
if not sw_hsqueue or not S.isWarrior then return false, false end if not sw_hsqueue or not S.isWarrior then return false, false end
if S.useSpellQueueEvent then return S.hsQueued, S.cleaveQueued end if S.useSpellQueueEvent then
S.hsQueued, S.hsSeenCurrent =
ReconcileQueued(S.hsQueued, S.cachedHSSlots, S.hsSeenCurrent)
S.cleaveQueued, S.cleaveSeenCurrent =
ReconcileQueued(S.cleaveQueued, S.cachedCleaveSlots, S.cleaveSeenCurrent)
return S.hsQueued, S.cleaveQueued
end
return CheckQueuedAction(S.cachedHSSlots), CheckQueuedAction(S.cachedCleaveSlots) return CheckQueuedAction(S.cachedHSSlots), CheckQueuedAction(S.cachedCleaveSlots)
end end
@@ -526,6 +552,10 @@ pfUI:RegisterModule("swingtimer", function ()
-- HS/Cleave color -- HS/Cleave color
local curR, curG, curB = mhDefaultR, mhDefaultG, mhDefaultB local curR, curG, curB = mhDefaultR, mhDefaultG, mhDefaultB
if sw_hsqueue then if sw_hsqueue then
if S.isDruid and S.useSpellQueueEvent then
S.maulQueued, S.maulSeenCurrent =
ReconcileQueued(S.maulQueued, S.cachedMaulSlots, S.maulSeenCurrent)
end
if S.maulQueued and S.isDruid then if S.maulQueued and S.isDruid then
curR, curG, curB = 1.0, 0.55, 0.0 -- orange for druid maul queue curR, curG, curB = 1.0, 0.55, 0.0 -- orange for druid maul queue
elseif S.isWarrior then elseif S.isWarrior then
@@ -780,7 +810,10 @@ pfUI:RegisterModule("swingtimer", function ()
-- SPELL_CAST_EVENT hook: HS/Cleave/Maul queue tracking -- SPELL_CAST_EVENT hook: HS/Cleave/Maul queue tracking
pfUI.libdebuff_spell_cast_hooks = pfUI.libdebuff_spell_cast_hooks or {} pfUI.libdebuff_spell_cast_hooks = pfUI.libdebuff_spell_cast_hooks or {}
pfUI.libdebuff_spell_cast_hooks["swingtimer"] = function(success, spellId) pfUI.libdebuff_spell_cast_hooks["swingtimer"] = function(success, spellId)
SetQueuedKind(ClassifyOnSwingSpell(spellId)) local kind = ClassifyOnSwingSpell(spellId)
if not kind then return end
S.useSpellQueueEvent = true
SetQueuedKind(kind)
end end
+7 -7
View File
@@ -267,7 +267,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
SW_BarFrame1_Selector:Hide() SW_BarFrame1_Selector:Hide()
-- let user select mode by clicking the title -- let user select mode by clicking the title
HookScript(SW_BarFrame1_Title, "OnMouseUp", function() SW_BarFrame1_Title:HookScript("OnMouseUp", function()
local page = SW_Settings and SW_Settings.BarFrames and SW_Settings.BarFrames.SW_BarFrame1 and SW_Settings.BarFrames.SW_BarFrame1.Selected local page = SW_Settings and SW_Settings.BarFrames and SW_Settings.BarFrames.SW_BarFrame1 and SW_Settings.BarFrames.SW_BarFrame1.Selected
if page then if page then
local target = (arg1 == "LeftButton") and (page + 1) or (arg1 == "RightButton") and (page - 1) local target = (arg1 == "LeftButton") and (page + 1) or (arg1 == "RightButton") and (page - 1)
@@ -530,7 +530,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
end end
-- replace wim class colors with pfUI ones -- replace wim class colors with pfUI ones
pfUI.hooksecurefunc("WIM_InitClassProps", function() hooksecurefunc("WIM_InitClassProps", function()
for class in pairs(PFUI_CLASS_COLORS) do for class in pairs(PFUI_CLASS_COLORS) do
local wimclass = _G[format("WIM_LOCALIZED_%s",class)] local wimclass = _G[format("WIM_LOCALIZED_%s",class)]
local colorstr = "|c" .. PFUI_CLASS_COLORS[class].colorStr local colorstr = "|c" .. PFUI_CLASS_COLORS[class].colorStr
@@ -547,7 +547,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
btnClose:SetWidth(13) btnClose:SetWidth(13)
btnClose:SetHeight(13) btnClose:SetHeight(13)
end end
pfUI.hooksecurefunc("WIM_Icon_DropDown_Update", function() hooksecurefunc("WIM_Icon_DropDown_Update", function()
for i=1,_G.WIM_MaxMenuCount do for i=1,_G.WIM_MaxMenuCount do
local btn = _G["WIM_ConversationMenuTellButton"..i] local btn = _G["WIM_ConversationMenuTellButton"..i]
if i==1 and btn:IsEnabled() == 0 then return end if i==1 and btn:IsEnabled() == 0 then return end
@@ -729,7 +729,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
SkinScrollbar(WIM_HelpScrollFrameScrollBar) SkinScrollbar(WIM_HelpScrollFrameScrollBar)
end end
pfUI.hooksecurefunc("WIM_WindowOnShow", function() hooksecurefunc("WIM_WindowOnShow", function()
if this.backdrop then return end -- already skinned if this.backdrop then return end -- already skinned
local windowname = this:GetName() local windowname = this:GetName()
@@ -904,7 +904,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
end end
-- trigger the event whenever SuperMacro got an update -- trigger the event whenever SuperMacro got an update
pfUI.hooksecurefunc("SM_UpdateActionSpell", function() hooksecurefunc("SM_UpdateActionSpell", function()
for slot=1,120 do pfUI.bars.update[slot] = true end for slot=1,120 do pfUI.bars.update[slot] = true end
end) end)
end) end)
@@ -922,7 +922,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
pfUI.bars.skip_macro = true pfUI.bars.skip_macro = true
-- send clevermacro events to pfUI actionbars -- send clevermacro events to pfUI actionbars
pfUI.hooksecurefunc("ActionButton_OnEvent", function(event) hooksecurefunc("ActionButton_OnEvent", function(event)
events(this, event) events(this, event)
end) end)
end) end)
@@ -944,7 +944,7 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
if pfUI.eqcompare then if pfUI.eqcompare then
pfUI.eqcompare.HookTooltip(AtlasLootTooltip) pfUI.eqcompare.HookTooltip(AtlasLootTooltip)
HookScript(AtlasLootTooltip, "OnHide", function() AtlasLootTooltip:HookScript("OnHide", function()
ShoppingTooltip1:Hide() ShoppingTooltip1:Hide()
ShoppingTooltip2:Hide() ShoppingTooltip2:Hide()
end) end)
+6 -6
View File
@@ -3,8 +3,7 @@ pfUI:RegisterModule("tooltip", function ()
pfUI.tooltip = CreateFrame('Frame', "pfTooltip", GameTooltip) pfUI.tooltip = CreateFrame('Frame', "pfTooltip", GameTooltip)
pfUI.tooltip.anchorframe = CreateFrame('Frame', "pfTooltipAnchor", UIParent) pfUI.tooltip.anchorframe = CreateFrame('Frame', "pfTooltipAnchor", UIParent)
pfUI.tooltip.anchorframe:SetWidth(128) pfUI.tooltip.anchorframe:SetSize(128, 72)
pfUI.tooltip.anchorframe:SetHeight(72)
pfUI.tooltip.anchorframe:SetPoint("TOP", UIParent, "TOP", 0, -50) pfUI.tooltip.anchorframe:SetPoint("TOP", UIParent, "TOP", 0, -50)
pfUI.tooltip.anchorframe:Hide() pfUI.tooltip.anchorframe:Hide()
UpdateMovable(pfUI.tooltip.anchorframe) UpdateMovable(pfUI.tooltip.anchorframe)
@@ -30,8 +29,8 @@ pfUI:RegisterModule("tooltip", function ()
-- create mouse follow frame -- create mouse follow frame
if not tooltip.cursor then if not tooltip.cursor then
tooltip.cursor = CreateFrame("Frame", nil, UIParent) tooltip.cursor = CreateFrame("Frame", nil, UIParent)
tooltip.cursor:SetWidth(tonumber(C.tooltip.cursoroffset) * 2) local size = tonumber(C.tooltip.cursoroffset) * 2
tooltip.cursor:SetHeight(tonumber(C.tooltip.cursoroffset) * 2) tooltip.cursor:SetSize(size, size)
tooltip.cursor:SetScript("OnUpdate", function() tooltip.cursor:SetScript("OnUpdate", function()
-- throttle - cursor following doesn't need to be every frame -- throttle - cursor following doesn't need to be every frame
if (this.tick or 0) > GetTime() then return end if (this.tick or 0) > GetTime() then return end
@@ -172,8 +171,9 @@ pfUI:RegisterModule("tooltip", function ()
local unit = pfUI.tooltip:GetUnit() local unit = pfUI.tooltip:GetUnit()
if unit == "none" then if unit == "none" then
-- process item tooltips -- process item tooltips
if C.tooltip.itemid == "1" and libtooltip:GetItemID() then if C.tooltip.itemid == "1" and GameTooltip:HasItem() then
GameTooltip:AddLine(T["ItemID"] .. ": " .. libtooltip:GetItemID(), .25,.5,1) local _, _, itemID = GameTooltip:GetItem()
GameTooltip:AddLine(T["ItemID"] .. ": " .. itemID, .25,.5,1)
GameTooltip:Show() GameTooltip:Show()
end end
+42 -841
View File
@@ -65,14 +65,14 @@ pfUI:RegisterModule("turtle-wow", function ()
HookAddonOrVariable("GroupFrame", function() HookAddonOrVariable("GroupFrame", function()
-- After Turtle's own init, hide frames if pfUI handles them -- After Turtle's own init, hide frames if pfUI handles them
pfUI.hooksecurefunc("GroupFrame_Toggle", function() hooksecurefunc("GroupFrame_Toggle", function()
if pfUIHandlesGroupOrRaid() then if pfUIHandlesGroupOrRaid() then
DisableTurtleGroupFrames() DisableTurtleGroupFrames()
end end
end) end)
-- After every group/raid update, re-hide if pfUI handles them -- After every group/raid update, re-hide if pfUI handles them
pfUI.hooksecurefunc("GroupFrame_Update", function() hooksecurefunc("GroupFrame_Update", function()
if pfUIHandlesGroupOrRaid() then if pfUIHandlesGroupOrRaid() then
DisableTurtleGroupFrames() DisableTurtleGroupFrames()
end end
@@ -295,40 +295,58 @@ pfUI:RegisterModule("turtle-wow", function ()
local initialized = false local initialized = false
HookAddonOrVariable("Blizzard_InspectUI", function() HookAddonOrVariable("Blizzard_InspectUI", function()
pfUI.hooksecurefunc("InspectFrame_Show", function() hooksecurefunc("InspectFrame_Show", function()
-- break if theres nothing left to do -- break if theres nothing left to do
if initialized then return end if initialized then return end
-- adjust ui positions local _, border = GetBorderSize()
-- adjust the inspect frame's Talents tab
SkinTab(InspectFrameTab3) SkinTab(InspectFrameTab3)
InspectFrameTab3:ClearAllPoints() InspectFrameTab3:ClearAllPoints()
InspectFrameTab3:SetPoint("LEFT", InspectFrameTab2, "RIGHT", GetBorderSize()*2 + 1, 0) InspectFrameTab3:SetPoint("LEFT", InspectFrameTab2, "RIGHT", border*2 + 1, 0)
TWTalentFrameTab1:SetPoint("TOPLEFT", TWTalentFrameScrollFrame, "TOPLEFT", 2, TWTalentFrameTab1:GetHeight() + 4)
-- reload text position -- reload text position
InspectFrameTab3:Hide() InspectFrameTab3:Hide()
InspectFrameTab3:Show() InspectFrameTab3:Show()
-- skin inspect window elements -- the talent tree frame is created lazily; skin it once it exists
StripTextures(InspectTalentsFrame) if TWTalentFrame then
StripTextures(TWTalentFrameScrollFrame) StripTextures(InspectTalentsFrame)
SkinScrollbar(TWTalentFrameScrollFrameScrollBar) StripTextures(TWTalentFrame)
for i = 1, 3 do StripTextures(TWTalentFrameScrollFrame)
SkinTab(_G["TWTalentFrameTab"..i]) SkinScrollbar(TWTalentFrameScrollFrameScrollBar)
end
-- skin each talent button -- skin + position the talent-tree tabs
for i = 1, (MAX_NUM_TALENTS or 100) do for i = 1, 3 do
local talent = _G["TWTalentFrameTalent" .. i] local tab = _G["TWTalentFrameTab"..i]
if talent then if tab then
StripTextures(talent) SkinTab(tab)
SkinButton(talent, nil, nil, nil, _G["TWTalentFrameTalent" .. i .. "IconTexture"]) tab:ClearAllPoints()
_G["TWTalentFrameTalent" .. i .. "Rank"]:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE") local lastTab = _G["TWTalentFrameTab"..(i-1)]
if lastTab then
tab:SetPoint("LEFT", lastTab, "RIGHT", border*2 + 1, 0)
else
tab:SetPoint("TOPLEFT", TWTalentFrameScrollFrame, "TOPLEFT", 2, tab:GetHeight() + 4)
end
end
end end
end
-- only run once -- skin each talent button
initialized = true for i = 1, (MAX_NUM_TALENTS or 100) do
local talent = _G["TWTalentFrameTalent"..i]
if talent then
StripTextures(talent)
SkinButton(talent, nil, nil, nil, _G["TWTalentFrameTalent"..i.."IconTexture"])
local rank = _G["TWTalentFrameTalent"..i.."Rank"]
if rank then
rank:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
end
end
end
-- only run once the talent frame has actually been skinned
initialized = true
end
end) end)
end) end)
end end
@@ -355,823 +373,6 @@ pfUI:RegisterModule("turtle-wow", function ()
end end
end) end)
-- add turtle-wow overlay values
-- coordinates from paokkerkir/ShaguTweaks-extras, measured for TurtleWoW 1.18.1
pfMapOverlayData = {
["Durotar"] = {
"DRYGULCHRAVINE:139:134:438:92",
"ECHOISLES:175:236:561:432",
"KOLKARCRAG:131:96:426:487",
"ORGRIMMAR:427:150:251:0",
"RAZORHILL:188:207:445:182",
"RAZORMANEGROUNDS:196:202:318:204",
"SENJINVILLAGE:133:167:485:398",
"SKULLROCK:118:79:469:51",
"SparkwaterPort:122:134:522:94",
"THUNDERRIDGE:156:174:341:72",
"TIRAGARDEKEEP:160:148:477:300",
"VALLEYOFTRIALS:186:184:370:335",
},
["Mulgore"] = {
"BAELDUNDIGSITE:175:151:269:227",
"BLOODHOOFVILLAGE:236:182:378:311",
"PALEMANEROCK:102:183:315:317",
"RAVAGEDCARAVAN:110:100:482:269",
"REDCLOUDMESA:436:231:285:437",
"REDROCKS:154:138:522:92",
"SuntailPass:129:116:533:18",
"THEGOLDENPLAINS:184:217:441:91",
"THEROLLINGPLAINS:231:166:536:369",
"THEVENTURECOMINE:187:204:549:251",
"THUNDERBLUFF:254:217:264:70",
"THUNDERHORNWATERWELL:118:137:384:248",
"WILDMANEWATERWELL:152:111:299:10",
"WINDFURYRIDGE:182:119:405:2",
"WINTERHOOFWATERWELL:144:107:470:379",
},
["Barrens"] = {
"AGAMAGOR:183:173:348:242",
"AnchorsEdge:118:83:690:300",
"BAELMODAN:120:123:435:482",
"BLACKTHORNRIDGE:140:123:340:465",
"BOULDERLODEMINE:109:105:560:0",
"BRAMBLESCAR:112:152:446:304",
"CAMPTAURAJO:130:113:370:355",
"DREADMISTPEAK:121:93:423:68",
"FARWATCHPOST:85:152:572:58",
"FIELDOFGIANTS:194:137:363:410",
"GROLDOMFARM:112:107:499:67",
"HONORSSTAND:128:128:306:130",
"LUSHWATEROASIS:160:169:372:186",
"NORTHWATCHFOLD:134:107:533:310",
"RAPTORGROUNDS:101:99:512:299",
"RATCHET:116:118:556:190",
"RAZORFENDOWNS:137:106:414:562",
"RAZORFENKRAUL:116:123:345:539",
"THECROSSROADS:142:140:436:127",
"THEDRYHILLS:185:134:324:36",
"THEFORGOTTENPOOLS:104:116:391:120",
"THEMERCHANTCOAST:80:123:584:249",
"THEMORSHANRAMPART:118:91:418:0",
"THESLUDGEFEN:153:113:463:0",
"THESTAGNANTOASIS:147:126:484:211",
"THORNHILL:128:120:502:123",
},
["Alterac"] = {
"CHILLWINDPOINT:308:250:660:261",
"CORRAHNSDAGGER:173:277:411:391",
"CRUSHRIDGEHOLD:269:230:339:167",
"DALARAN:277:283:39:275",
"DANDREDSFOLD:273:224:282:0",
"GALLOWSCORNER:183:185:415:287",
"GAVINSNAZE:140:161:235:486",
"GROWLESSCAVE:175:156:327:382",
"LORDAMEREINTERNMENTCAMP:315:255:55:413",
"MISTYSHORE:204:268:207:139",
"RUINSOFALTERAC:252:249:274:201",
"RavenholdtManor:217:165:737:452",
"SOFERASNAZE:241:312:469:311",
"STRAHNBRAD:355:289:555:110",
"THEHEADLAND:142:187:325:481",
"THEUPLANDS:219:183:470:84",
},
["Arathi"] = {
"BOULDERFISTHALL:190:214:442:371",
"BOULDERGOR:222:214:244:167",
"CIRCLEOFEASTBINDING:140:213:568:125",
"CIRCLEOFINNERBINDING:186:164:302:321",
"CIRCLEOFOUTERBINDING:149:137:429:301",
"CIRCLEOFWESTBINDING:156:189:152:71",
"DABYRIESFARMSTEAD:160:171:482:197",
"FALDIRSCOVE:247:197:180:428",
"FarwellStead:112:128:267:31",
"GOSHEKFARM:208:177:539:284",
"HAMMERFALL:182:235:665:128",
"NORTHFOLDMANOR:202:205:204:119",
"REFUGEPOINT:157:189:380:214",
"RuinsOfZulRasaz:160:160:346:29",
"STROMGARDEKEEP:220:213:122:295",
"THANDOLSPAN:175:198:369:424",
"THORADINSWALL:173:225:103:148",
"WITHERBARKVILLAGE:197:194:566:339",
"WildtuskVillage:183:102:379:145",
},
["Badlands"] = {
"AGMONDSEND:249:256:354:396",
"ANGORFORTRESS:186:241:327:101",
"APOCRYPHANSREST:251:195:20:315",
"CAMPBOFF:195:207:506:361",
"CAMPCAGG:247:205:15:432",
"CAMPKOSH:214:211:556:56",
"CrystallinePinnacle:140:155:609:337",
"DUSTWINDGULCH:229:190:506:216",
"HAMMERTOESDIGSITE:185:177:455:131",
"KARGATH:232:245:0:154",
"LETHLORRAVINE:344:395:627:173",
"MIRAGEFLATS:276:229:153:387",
"RedbrandsDigsite:325:155:496:454",
"RuinsOfCorthan:210:200:203:124",
"ScalebaneRidge:205:179:751:142",
"THEDUSTBOWL:253:266:166:203",
"THEMAKERSTERRACE:230:172:399:16",
"VALLEYOFFANGS:215:215:358:265",
},
["BlastedLands"] = {
"ALTAROFSTORMS:169:142:318:141",
"DARKPORTAL:254:208:460:265",
"DREADMAULHOLD:200:171:351:21",
"DREADMAULPOST:228:183:370:204",
"GARRISONARMORY:155:192:480:15",
"NETHERGARDEKEEP:169:178:567:35",
"RISEOFTHEDEFILER:150:131:414:131",
"SERPENTSCOIL:211:155:510:148",
"THETAINTEDSCAR:370:438:220:184",
},
["Tirisfal"] = {
"AGAMANDMILLS:244:191:342:148",
"BALNIRFARMSTEAD:179:153:639:335",
"BRIGHTWATERLAKE:176:280:598:143",
"BRILL:121:144:540:305",
"BULWARK:184:169:712:374",
"COLDHEARTHMANOR:136:125:479:328",
"CRUSADEROUTPOST:154:121:701:293",
"DEATHKNELL:210:186:236:337",
"GARRENSHAUNT:148:199:507:154",
"GLENSHIRE:163:161:157:393",
"MONASTARY:175:157:762:139",
"NIGHTMAREVALE:209:151:370:355",
"RUINSOFLORDAERON:299:216:469:370",
"SCARLETWATCHPOST:141:223:701:113",
"SOLLIDENFARMSTEAD:225:138:247:259",
"STEEPCLIFFPORT:121:120:5:350",
"STILLWATERPOND:168:123:401:279",
"THECORINTHFARMSTEAD:116:152:73:402",
"THEWHISPERINGFOREST:243:175:86:263",
"VENOMWEBVALE:199:183:776:225",
},
["Silverpine"] = {
"AMBERMILL:204:210:512:279",
"BERENSPERIL:206:146:508:433",
"DEEPELEMMINE:127:143:484:274",
"FENRISISLE:234:187:593:88",
"MALDENSORCHARD:228:138:479:9",
"NORTHTIDESHOLLOW:152:104:337:141",
"OLSENSFARTHING:128:152:401:267",
"PYREWOODVILLAGE:122:108:405:456",
"SHADOWFANGKEEP:185:131:380:373",
"THEDEADFIELD:141:134:419:82",
"THEDECREPITFERRY:144:156:475:160",
"THEGREYMANEWALL:175:185:398:465",
"THESEPULCHER:193:135:360:184",
"THESHININGSTRAND:225:192:475:27",
"THESKITTERINGDARK:160:165:302:18",
},
["WesternPlaguelands"] = {
"CAERDARROW:158:150:608:421",
"DALSONSTEARS:209:138:388:271",
"DARROWMERELAKE:359:261:510:348",
"FELSTONEFIELD:149:119:306:315",
"GAHRRONSWITHERING:165:191:527:257",
"HEARTHGLEN:331:280:312:20",
"NORTHRIDGELUMBERCAMP:205:168:390:170",
"RUINSOFANDORHOL:275:219:265:360",
"SORROWHILL:290:201:360:467",
"THEBULWARK:216:172:143:300",
"THEWEEPINGCAVE:148:192:572:203",
"THEWRITHINGHAUNT:159:177:457:329",
"THONDRORILRIVER:193:326:597:94",
},
["EasternPlaguelands"] = {
"BLACKWOODLAKE:217:221:451:207",
"CORINSCROSSING:153:146:544:373",
"CROWNGUARDTOWER:193:152:299:408",
"DARROWSHIRE:195:167:316:497",
"EASTWALLTOWER:164:143:600:250",
"ForlornSummit:192:185:64:225",
"LAKEMERELDAR:240:164:543:469",
"LIGHTSHOPECHAPEL:165:238:721:304",
"NORTHDALE:172:191:628:135",
"NORTHPASSTOWER:228:178:465:118",
"PESTILENTSCAR:189:241:416:349",
"PLAGUEWOOD:346:258:178:92",
"QUELLITHIENLODGE:216:136:430:44",
"STRATHOLME:227:189:202:15",
"TERRORDALE:175:129:86:137",
"THEFUNGALVALE:202:199:277:267",
"THEINFECTISSCAR:183:262:628:298",
"THEMARRISSTEAD:182:194:164:367",
"THENOXIOUSGLADE:211:202:730:172",
"THEUNDERCROFT:171:136:178:484",
"THONDRORILRIVER:210:348:12:235",
"TYRSHAND:201:159:724:475",
"ZULMASHAR:189:152:621:36",
},
["Hilsbrad"] = {
"AZURELOADMINE:146:174:188:288",
"DARROWHILL:173:132:426:164",
"DUNGAROK:225:257:644:305",
"DURNHOLDEKEEP:367:347:614:82",
"EASTERNSTRAND:208:301:537:350",
"HILLSBRADFIELDS:282:257:211:166",
"NETHANDERSTEAD:190:215:554:249",
"PURGATIONISLE:120:94:111:485",
"SOUTHPOINTTOWER:271:207:11:203",
"SOUTHSHORE:219:245:423:213",
"TARRENMILL:195:291:524:9",
"WESTERNSTRAND:272:139:215:377",
},
["Hinterlands"] = {
"AERIEPEAK:240:195:20:250",
"AGOLWATHA:188:180:382:173",
"HIRIWATHA:201:118:188:314",
"JINTHAALOR:223:277:514:338",
"PLAGUEMISTRAVINE:124:203:170:158",
"QUELDANILLODGE:168:181:248:194",
"SERADANE:260:263:519:25",
"SHADRAALOR:181:170:247:394",
"SHAOLWATHA:265:190:580:247",
"SKULKROCK:148:133:520:241",
"THEALTAROFZUL:186:153:382:371",
"THECREEPINGRUIN:168:157:417:268",
"THEOVERLOOKCLIFFS:153:299:702:309",
"TheRasazTrails:118:133:210:381",
"VALORWINDLAKE:153:160:329:309",
},
["DunMorogh"] = {
"AMBERSTILLRANCH:105:104:582:288",
"ANVILMAR:209:159:167:414",
"BREWNALLVILLAGE:94:102:263:256",
"CHILLBREEZEVALLEY:160:113:281:304",
"COLDRIDGEPASS:134:123:300:387",
"FROSTMANEHOLD:112:118:225:291",
"GNOMERAGON:158:176:178:164",
"GOLBOLARQUARRY:144:149:619:301",
"HELMSBEDLAKE:131:153:706:284",
"ICEFLOWLAKE:117:167:286:173",
"IRONFORGE:291:187:414:166",
"IronforgeAirfields:213:233:582:100",
"KHARANOS:175:186:397:296",
"MISTYPINEREFUGE:117:155:507:224",
"NORTHERNGATEOUTPOST:115:155:766:177",
"RugfordsMountainRest:199:114:739:406",
"SHIMMERRIDGE:115:173:355:169",
"SOUTHERNGATEOUTPOST:113:106:800:284",
"THEGRIZZLEDDEN:178:155:321:328",
"THETUNDRIDHILLS:135:115:531:328",
},
["SearingGorge"] = {
"BLACKCHARCAVE:264:224:84:371",
"DUSTFIREVALLEY:446:355:428:11",
"FIREWATCHRIDGE:385:413:95:39",
"GRIMSILTDIGSITE:292:210:501:306",
"TANNERCAMP:292:215:552:413",
"THECAULDRON:414:310:257:178",
"THESEAOFCINDERS:345:273:256:395",
},
["BurningSteppes"] = {
"ALTAROFSTORMS:215:210:41:114",
"BLACKROCKMOUNTAIN:249:272:178:104",
"BLACKROCKPASS:259:299:597:285",
"BLACKROCKSTRONGHOLD:232:258:342:120",
"DRACODAR:405:309:61:262",
"DREADMAULROCK:203:214:717:174",
"MORGANSVIGIL:287:265:715:311",
"PILLAROFASH:313:261:382:289",
"RUINSOFTHAURISSAN:258:275:521:105",
"TERRORWINGPATH:271:296:730:52",
},
["Elwynn"] = {
"BRACKWELLPUMPKINPATCH:222:223:592:431",
"CRYSTALLAKE:196:192:435:345",
"EASTVALELOGGINGCAMP:237:190:713:339",
"FARGODEEPMINE:238:230:247:438",
"FORESTSEDGE:242:335:132:333",
"GOLDSHIRE:219:199:261:280",
"JERODSLANDING:206:212:437:445",
"NORTHSHIREVALLEY:237:244:390:154",
"RIDGEPOINTTOWER:287:207:710:445",
"STONECAIRNLAKE:278:230:601:203",
"STORMWIND:452:392:21:3",
"TOWEROFAZORA:232:226:561:303",
},
["DeadwindPass"] = {
"DEADMANSCROSSING:368:353:257:81",
"KARAZHAN:287:234:277:342",
"THEVICE:254:257:433:305",
},
["Duskwood"] = {
"ADDLESSTEAD:255:231:67:353",
"BRIGHTWOODGROVE:191:315:520:131",
"DARKSHIRE:291:259:644:173",
"MANORMISTMANTLE:174:150:668:134",
"RAVENHILL:166:115:117:317",
"RAVENHILLCEMETARY:323:276:99:165",
"THEDARKENEDBANK:886:184:105:44",
"THEHUSHEDBANK:136:306:29:143",
"THEROTTINGORCHARD:231:210:549:380",
"THEYORGENFARMSTEAD:211:235:403:393",
"TRANQUILGARDENSCEMETARY:204:196:692:363",
"TWILIGHTGROVE:327:384:314:99",
"VULGOLOGREMOUND:231:266:259:365",
},
["LochModan"] = {
"GRIZZLEPAWRIDGE:262:343:326:325",
"IRONBANDSEXCAVATIONSITE:321:294:491:276",
"MOGROSHSTRONGHOLD:287:265:558:61",
"NORTHGATEPASS:195:273:143:24",
"SILVERSTREAMMINE:201:243:247:25",
"STONESPLINTERVALLEY:226:255:230:363",
"STONEWROUGHTDAM:260:149:354:23",
"THEFARSTRIDERLODGE:162:182:741:298",
"THELOCH:288:380:367:99",
"THELSAMAR:243:205:225:214",
"VALLEYOFKINGS:166:224:123:382",
},
["Redridge"] = {
"ALTHERSMILL:222:260:407:134",
"GALARDELLVALLEY:234:240:661:168",
"LAKEEVERSTILL:522:260:140:249",
"LAKERIDGEHIGHWAY:411:274:196:341",
"LAKESHIRE:325:179:92:204",
"REDRIDGECANYONS:345:232:132:79",
"RENDERSCAMP:264:248:284:4",
"RENDERSVALLEY:453:248:491:365",
"RedwallKeep:162:110:830:466",
"STONEWATCH:243:289:507:221",
"STONEWATCHFALLS:308:200:601:325",
"THREECORNERS:360:337:0:288",
},
["Stranglethorn"] = {
"BALALRUINS:83:65:245:101",
"BALIAMAHRUINS:100:133:376:133",
"BLOODSAILCOMPOUND:154:163:201:291",
"BOOTYBAY:137:125:207:435",
"CRYSTALVEINMINE:111:114:350:280",
"GROMGOLBASECAMP:101:98:265:137",
"JAGUEROISLE:132:107:319:498",
"KALAIRUINS:86:89:303:93",
"KURZENSCOMPOUND:141:139:394:5",
"LAKENAZFERITI:124:120:332:60",
"MISTVALEVALLEY:120:116:283:372",
"MIZJAHRUINS:93:102:315:133",
"MOSHOGGOGREMOUND:123:168:435:96",
"NEKMANIWELLSPRING:80:102:215:365",
"NESINGWARYSEXPEDITION:128:98:274:29",
"REBELCAMP:164:86:289:0",
"RUINSOFABORAZ:87:87:356:340",
"RUINSOFJUBUWAL:100:105:312:304",
"RUINSOFZULKUNDA:113:132:201:8",
"RUINSOFZULMAMWE:162:122:397:213",
"THEARENA:186:176:241:194",
"THEVILEREEF:177:160:159:98",
"VENTURECOBASECAMP:96:120:391:66",
"WILDSHORE:151:175:237:431",
"ZIATAJAIRUINS:127:120:364:231",
"ZULGURUB:230:213:489:12",
"ZUULDAIARUINS:103:105:160:47",
},
["SwampOfSorrows"] = {
"FALLOWSANCTUARY:348:292:501:0",
"ITHARIUSSCAVE:230:232:0:270",
"MISTYREEDSTRAND:250:664:752:0",
"MISTYVALLEY:211:179:29:148",
"POOLOFTEARS:280:256:576:227",
"SORROWMURK:199:351:734:128",
"SPLINTERSPEARJUNCTION:258:222:138:245",
"STAGALBOG:328:238:561:386",
"STONARD:343:303:287:244",
"SorrowguardKeep:220:174:0:266",
"THEHARBORAGE:216:187:182:157",
"THESHIFTINGMIRE:303:221:294:118",
},
["Westfall"] = {
"ALEXSTONFARMSTEAD:275:182:220:274",
"DEMONTSPLACE:166:155:226:391",
"FURLBROWSPUMPKINFARM:186:191:399:24",
"GOLDCOASTQUARRY:194:241:234:113",
"JANGOLODEMINE:185:187:323:44",
"MOONBROOK:208:174:317:349",
"SALDEANSFARM:191:184:478:119",
"SENTINELHILL:161:210:461:259",
"THEDAGGERHILLS:235:149:349:430",
"THEDEADACRE:164:213:542:267",
"THEDUSTPLAINS:260:204:538:393",
"THEJANSENSTEAD:143:183:498:6",
"THEMOLSENFARM:199:180:342:161",
"WESTFALLLIGHTHOUSE:306:161:171:482",
},
["Wetlands"] = {
"ANGERFANGENCAMPMENT:196:150:364:241",
"BLACKCHANNELMARSH:213:173:95:260",
"BLUEGILLMARSH:195:165:111:157",
"DIREFORGEHILL:233:225:515:128",
"DUNMODR:173:147:419:42",
"DunAgrath:222:190:97:335",
"GRIMBATOL:317:331:623:242",
"HawksVigil:170:162:264:353",
"IRONBEARDSTOMB:165:156:368:135",
"MENETHILHARBOR:156:116:27:321",
"MOSSHIDEFEN:215:224:539:277",
"RAPTORRIDGE:159:115:640:191",
"SALTSPRAYGLEN:170:214:254:58",
"SUNDOWNMARSH:265:212:113:100",
"THEGREENBELT:153:209:473:143",
"THELGANROCK:207:165:478:383",
"WHELGARSEXCAVATIONSITE:172:156:264:224",
},
["Teldrassil"] = {
"BANETHILHOLLOW:136:191:392:289",
"DARNASSUS:294:252:110:251",
"DOLANAAR:170:119:469:327",
"GNARLPINEHOLD:230:158:316:417",
"LAKEALAMETH:237:163:445:388",
"POOLSOFARLITHRIEN:125:180:337:314",
"RUTTHERANVILLAGE:110:91:504:548",
"SHADOWGLEN:198:201:504:164",
"STARBREEZEVILLAGE:153:175:588:303",
"THEORACLEGLADE:150:223:279:135",
"UrsanHeights:229:154:243:423",
"WELLSPRINGLAKE:166:245:383:98",
},
["Darkshore"] = {
"AMETHARAN:163:178:340:323",
"AUBERDINE:134:179:323:191",
"BASHALARAN:153:171:379:199",
"CLIFFSPRINGRIVER:205:161:391:112",
"GROVEOFTHEANCIENTS:180:138:314:436",
"REMTRAVELSEXCAVATION:148:164:245:504",
"RUINSOFMATHYSTRA:176:205:519:3",
"THEMASTERSGLAIVE:146:139:346:529",
"TOWEROFALTHALAXX:142:159:484:110",
},
["Ashenvale"] = {
"ASTRANAAR:190:173:281:259",
"BOUGHSHADOW:140:190:862:157",
"FALLENSKYLAKE:219:190:555:433",
"FELFIREHILL:241:244:720:349",
"FIRESCARSHRINE:153:161:194:332",
"ForestSong:162:142:817:232",
"IRISLAKE:185:190:401:226",
"LAKEFALATHIM:115:181:138:144",
"MAESTRASPOST:198:290:216:46",
"MYSTRALLAKE:262:228:363:354",
"NIGHTRUN:212:244:604:263",
"RAYNEWOODRETREAT:165:235:527:243",
"SATYRNAAR:163:172:702:230",
"THEHOWLINGVALE:196:172:471:147",
"THERUINSOFSTARDUST:141:135:268:382",
"THESHRINEOFAESSINA:205:179:113:268",
"THEZORAMSTRAND:228:235:26:33",
"THISTLEFURVILLAGE:243:184:210:164",
"WARSONGLUMBERCAMP:185:146:804:319",
},
["ThousandNeedles"] = {
"CAMPETHOK:289:300:7:1",
"DARKCLOUDPINNACLE:189:182:267:138",
"FREEWINDPOST:193:173:366:273",
"HIGHPERCH:178:174:39:164",
"SPLITHOOFCRAG:193:175:400:203",
"THEGREATLIFT:191:163:213:78",
"THESCREECHINGCANYON:240:231:187:206",
"THESHIMMERINGFLATS:312:355:612:308",
"WINDBREAKCANYON:225:213:501:249",
},
["StonetalonMountains"] = {
"AMANIALOR:504:252:8:5",
"BAELHARDUL:357:252:512:257",
"BLACKSANDOILFIELDS:504:504:8:5",
"BOULDERSLIDERAVINE:90:76:586:547",
"BRAMBLETHORNPASS:382:359:512:257",
"BROKENCLIFFMINE:252:504:260:5",
"CAMPAPARAJE:222:100:670:552",
"GRIMTOTEMPOST:146:77:675:519",
"MALAKAJIN:137:86:662:562",
"MIRKFALLONLAKE:504:504:260:5",
"POWDERTOWN:252:252:260:257",
"SISHIRCANYON:252:264:512:257",
"STONETALONPEAK:258:252:260:5",
"SUNROCKRETREAT:504:252:260:257",
"THECHARREDVALE:252:308:260:257",
"THEEARTHENRING:504:252:260:257",
"VENTURECOMPANYCAMP:252:504:260:5",
"WEBWINDERPATH:256:324:512:256",
"WINDSHEARCRAG:256:256:512:256",
},
["Desolace"] = {
"ETHELRETHOR:189:237:318:68",
"GELKISVILLAGE:181:235:300:433",
"KODOGRAVEYARD:253:237:396:251",
"KOLKARVILLAGE:206:208:615:221",
"KORMEKSHUT:156:147:562:187",
"MAGRAMVILLAGE:182:272:606:373",
"MANNOROCCOVEN:270:271:408:385",
"NIJELSPOINT:188:246:561:0",
"RANAZJARISLE:88:89:248:11",
"SARGERON:274:237:632:38",
"SHADOWBREAKRAVINE:190:181:698:454",
"SHADOWPREYVILLAGE:215:218:175:395",
"TETHRISARAN:185:137:440:0",
"THUNDERAXEFORTRESS:174:207:455:108",
"VALLEYOFSPEARS:234:274:217:221",
},
["Feralas"] = {
"CAMPMOJACHE:146:148:694:238",
"ChimaeraRoostVale:106:150:785:321",
"DIREMAUL:214:180:461:208",
"DREAMBOUGH:141:122:459:0",
"FERALSCARVALE:103:104:491:335",
"FRAYFEATHERHIGHLANDS:101:163:485:391",
"GORDUNNIOUTPOST:154:128:697:148",
"GRIMTOTEMCOMPOUND:110:186:630:172",
"ISLEOFDREAD:205:285:197:381",
"LOWERWILDS:214:152:756:204",
"ONEIROS:101:103:499:74",
"RUINSOFISILDIEN:179:241:547:326",
"RUINSOFRAVENWIND:178:149:310:0",
"SARDORISLE:167:168:216:241",
"THEFORGOTTENCOAST:132:316:409:258",
"THETWINCOLOSSALS:278:235:323:78",
"THEWRITHINGDEEP:214:205:625:305",
},
["Dustwallow"] = {
"ALCAZISLAND:176:179:671:29",
"BACKBAYWETLANDS:384:243:248:196",
"BRACKENWALLVILLAGE:264:264:239:2",
"THEDENOFFLAME:246:235:264:320",
"THERAMOREISLE:214:187:542:232",
"THEWYRMBOG:263:229:372:387",
"WITCHHILL:230:311:431:1",
"WesthavenHollow:166:149:603:428",
},
["Tanaris"] = {
"ABYSSALSANDS:194:159:376:207",
"BROKENPILLAR:93:165:481:243",
"CAVERNSOFTIME:139:132:567:262",
"DUNEMAULCOMPOUND:186:127:337:298",
"EASTMOONRUINS:143:130:405:355",
"GADGETZAN:156:149:430:102",
"LANDSENDBEACH:184:148:456:514",
"LOSTRIGGERCOVE:141:173:635:230",
"NOONSHADERUINS:129:191:530:43",
"SANDSORROWWATCH:175:157:311:111",
"SOUTHBREAKSHORE:192:151:510:304",
"SOUTHMOONRUINS:185:196:324:366",
"STEAMWHEEDLEPORT:136:129:599:86",
"SlickwickOilRig:237:181:129:436",
"THEGAPINGCHASM:198:188:458:380",
"THENOXIOUSLAIR:155:180:265:209",
"THISTLESHRUBVALLEY:166:234:217:294",
"VALLEYOFTHEWATCHERS:125:115:311:470",
"WATERSPRINGFIELD:145:164:516:177",
"ZALASHJISDEN:90:127:619:157",
"ZULFARRAK:191:166:265:5",
},
["Aszhara"] = {
"BAYOFSTORMS:257:285:486:208",
"BITTERREACHES:231:173:651:46",
"FORLORNRIDGE:210:247:198:373",
"HALDARRENCAMPMENT:191:138:83:339",
"JAGGEDREEF:556:153:373:9",
"LAKEMENNAR:301:184:302:437",
"LEGASHENCAMPMENT:224:131:484:49",
"RAVENCRESTMONUMENT:227:115:559:506",
"RUINSOFELDARATH:251:268:246:228",
"SHADOWSONGSHRINE:213:170:43:428",
"SOUTHRIDGEBEACH:355:207:397:360",
"TEMPLEOFARKKORAN:177:187:689:160",
"THALASSIANBASECAMP:224:144:507:126",
"THERUINEDREACHES:384:116:403:549",
"THESHATTEREDSTRAND:148:199:412:202",
"TIMBERMAWHOLD:209:194:258:175",
"TOWEROFELDARA:107:145:824:114",
"URSOLAN:219:212:327:94",
"VALORMOK:201:158:93:236",
},
["Felwood"] = {
"BLOODVENOMFALLS:225:132:297:269",
"DEADWOODVILLAGE:162:129:415:539",
"EMERALDSANCTUARY:171:150:411:436",
"FELPAWVILLAGE:224:138:489:0",
"IRONTREEWOODS:200:203:426:60",
"JADEFIREGLEN:151:145:339:469",
"JADEFIRERUN:181:159:338:35",
"JAEDENAR:236:122:275:333",
"MORLOSARAN:129:151:503:515",
"RUINSOFCONSTELLAS:224:142:303:387",
"SHATTERSCARVALE:218:186:315:130",
"TALONBRANCHGLADE:145:130:554:97",
},
["UngoroCrater"] = {
"FIREPLUMERIDGE:277:258:377:185",
"GOLAKKAHOTSPRINGS:299:334:133:158",
"IRONSTONEPLATEAU:276:281:588:69",
"LAKKARITARPITS:553:255:170:13",
"TERRORRUN:333:275:166:375",
"THEMARSHLANDS:295:341:568:247",
"THESLITHERINGSCAR:326:260:378:403",
},
["Moonglade"] = {
"LAKEELUNEARA:530:484:256:101",
},
["Silithus"] = {
"HIVEASHI:431:276:305:34",
"HIVEREGAL:469:335:262:333",
"HIVEZORA:343:424:117:188",
"SOUTHWINDVILLAGE:346:348:519:83",
"THECRYSTALVALE:285:274:121:31",
"THESCARABWALL:271:145:125:523",
"TWILIGHTBASECAMP:297:238:355:206",
},
["Winterspring"] = {
"DARKWHISPERGORGE:247:191:452:447",
"EVERLOOK:151:189:516:114",
"FROSTFIREHOTSPRINGS:226:124:231:180",
"FROSTSABERROCK:240:172:375:11",
"FROSTWHISPERGORGE:184:144:531:383",
"ICETHISTLEHILLS:116:155:617:247",
"LAKEKELTHERIL:203:176:409:205",
"MAZTHORIL:174:169:499:265",
"OWLWINGTHICKET:149:127:600:348",
"STARFALLVILLAGE:174:148:399:143",
"THEHIDDENGROVE:162:174:562:33",
"TIMBERMAWPOST:223:112:235:248",
"WINTERFALLVILLAGE:133:120:622:163",
},
["AlteracValley"] = {
"DUNBALDAR:254:228:356:18",
"FROSTWOLFKEEP:220:278:408:382",
"ICEBLOODGARRISON:286:288:343:179",
},
["Hyjal"] = {
"BARKSKINPLATEAU:207:167:390:297",
"BARKSKINVILLAGE:502:293:417:346",
"BLEAKHOLLOWCRATER:297:335:401:20",
"CIRCLEOFPOWER:277:331:203:63",
"DARKHOLLOWPASS:214:237:342:389",
"NORDANAAR:139:146:778:118",
"NORDRASSILGLADE:418:408:578:0",
"RUINSOFTELENNAS:165:193:141:236",
"THEEMERALDGATEWAY:309:244:109:353",
"ZULHATHA:191:210:3:194",
},
["Lapidis"] = {
"BRIGHTCOAST:298:213:237:246",
"CAELANSREST:147:111:517:230",
"CROWNISLAND:140:95:512:33",
"GORDOSHHEIGHTS:253:243:256:89",
"HAZURRIGLADE:87:82:486:306",
"SHANKSREEF:207:90:446:109",
"THEROCK:74:72:687:149",
"TOWEROFLAPIDIS:203:118:487:175",
"WALLOWINGCOAST:240:184:505:326",
"ZULHAZU:227:178:348:407",
},
["Gillijim"] = {
"DEEPTIDESANCTUM:204:117:199:512",
"DISTILLERYISLE:90:69:234:216",
"FAELONSFOLLY:108:103:331:304",
"GILLIJIMSTRAND:108:324:641:160",
"JADEMINE:141:149:500:256",
"KALKORPOINT:123:115:421:210",
"KAZONISLAND:194:113:432:51",
"MAULOGGPOST:137:227:512:401",
"MAULOGGREFUGE:231:132:615:465",
"RUINSOFZULRAZAR:215:136:369:384",
"SILVERCOAST:245:184:311:386",
"SILVERSANDBAR:47:128:256:398",
"SOUTHSEASANDBAR:125:172:178:63",
"TANGLEWOOD:135:188:576:297",
"ZULRAZAR:137:168:375:282",
},
["TelAbim"] = {
"BIXXLESSTOREHOUSE:300:127:368:178",
"HIGHVALERISE:191:187:468:248",
"TAZZOSSHACK:229:232:453:391",
"TELCOBASECAMP:184:183:342:440",
"THEDERELICTCAMP:165:205:364:273",
"THEJAGGEDISLES:313:256:385:16",
},
["Gilneas"] = {
"BLACKTHORNSCAMP:160:163:32:171",
"BROLOKMOUND:140:120:467:349",
"DAWNSTONEMINE:130:144:292:155",
"FREYSHEARKEEP:72:70:624:405",
"GILNEASCITY:295:242:89:105",
"GLAYMORESTEAD:140:127:483:129",
"GREYMANESWATCH:119:158:580:311",
"HOLLOWWEBCEMETARY:180:167:215:395",
"HOLLOWWEBWOODS:171:118:341:452",
"NORTHGATETOWER:130:137:397:172",
"OLDROCKPASS:155:165:290:37",
"RAVENSHIRE:194:237:472:431",
"RAVENWOODKEEP:253:174:496:494",
"ROSEWICKPLANTATION:134:140:331:155",
"RUINSOFGREYSHIRE:192:144:230:260",
"SHADEMORETAVERN:117:120:279:336",
"SOUTHMIREORCHARD:202:133:302:354",
"STILLWARDCHURCH:213:166:471:220",
"THEDRYROCKMINE:129:127:145:262",
"THEDRYROCKPIT:230:217:69:295",
"THEGREYMANEWALL:131:173:412:48",
"THEOVERGROWNACRE:134:154:390:269",
},
["Icepoint"] = {
"KANEQNUUN:512:430:237:129",
},
["BlackstoneIsland"] = {
"BLACKASHCOALPITS:303:474:209:178",
"BLACKASHMINE:251:204:397:222",
"GAZZIKSWORKSHOP:329:247:439:403",
"RUSTGATELUMBERYARD:217:245:551:241",
"RUSTGATERIDGE:396:226:372:360",
"THEWATERHOLE:386:239:382:43",
"VENTURECOSLUMS:270:192:498:129",
},
["ThalassianHighlands"] = {
"ALAHTHALAS:470:276:429:38",
"ANASTERIANPARK:229:219:385:256",
"BRINTHILIEN:180:211:395:450",
"FELSTRIDERRETREAT:201:207:165:428",
"ISLEOFETERNALAUTUMN:204:167:236:117",
"RUINSOFNASHALARAN:249:266:36:151",
"SILVERSUNMINE:208:189:288:373",
"THEFARSTRIDE:230:199:212:255",
"THELASTRUNESTONE:179:203:507:379",
},
["GrimReaches"] = {
"BAGGOTHSRAMPART:112:113:399:238",
"BARLEYCRESTFARMSTEAD:116:88:499:222",
"BRANGARSFOLLY:108:123:568:33",
"DUNKITHAS:137:95:470:329",
"EASTRIDGEOUTPOST:166:107:374:165",
"GETHKAR:118:124:444:84",
"GROLDANSEXCAVATION:125:117:567:231",
"LAKEKITHAS:217:150:481:270",
"RUINSOFSTOLGAZKEEP:134:146:366:53",
"SALGAZMINES:150:119:535:380",
"SHATTERBLADEPOST:186:130:512:126",
"SLATEBEARDSFORGE:136:99:457:404",
"THEGRIMHOLLOW:288:200:396:463",
"THEHIGHPASS:97:141:409:315",
"ZARMGETHPOINT:143:76:405:16",
"ZARMGETHSTRONGHOLD:120:150:487:17",
},
["Balor"] = {
"BILGERATCOMPOUND:174:141:323:76",
"CROAKINGPLATEAU:371:154:397:201",
"GRAHANESTATE:93:116:306:392",
"GULLWINGWRECKAGE:110:105:221:34",
"LANGSTONORCHARD:102:129:410:346",
"RUINSOFBREEZEHAVEN:163:141:450:256",
"SCURRYINGTHICKET:144:158:283:161",
"SIOUTPOST:175:232:597:389",
"SORROWMORELAKE:174:140:303:277",
"STORMBREAKERPOINT:243:197:583:212",
"STORMREAVERSPIRE:151:119:491:429",
"STORMWROUGHTCASTLE:202:166:458:332",
"TREACHEROUSCRAGS:243:171:381:457",
"VANDERFARMSTEAD:146:140:330:372",
"WINDROCKCLIFFS:192:279:256:303",
},
["Northwind"] = {
"ABBEYGARDENS:250:224:512:33",
"AMBERSHIRE:234:215:334:278",
"AMBERWOODKEEP:243:205:187:308",
"BLACKROCKBREACH:255:201:721:222",
"BRISTLEWHISKERCAVERN:197:185:568:232",
"CINDERFALLPASS:229:229:733:348",
"CRAWFORDWINERY:160:222:513:285",
"CRYSTALFALLS:320:205:627:464",
"GRIMMENLAKE:218:210:550:352",
"MERCHANTSHIGHROAD:353:249:256:420",
"NORTHRIDGEPOINT:298:314:349:31",
"NORTHWINDLOGGINGCAMP:224:185:258:171",
"RUINSOFBIRKHAVEN:180:208:645:116",
"SHERWOODQUARRY:293:287:702:1",
"STILLHEARTPORT:174:155:116:217",
"TOWEROFMAGILOU:181:223:189:169",
"WITCHCOVEN:147:162:257:81",
},
["Moonwhisper"] = {
"AnShesRespite:170:120:398:81",
"AncestralGrounds:164:82:295:88",
"BlackrootHold:162:137:495:465",
"BlackrootVillage:224:143:411:525",
"FoulheartSanctum:157:149:496:232",
"GroveOfTheMoon:152:146:464:347",
"LunarclawDen:84:60:674:376",
"MarasEthil:96:94:640:417",
"MoonhoofRetreat:172:144:419:167",
"MoonhoofVillage:163:157:570:188",
"MoonsilkHollow:125:114:577:458",
"MoroGaiVillage:133:127:571:372",
"NarvalisPoint:162:139:503:118",
"RuinsOfNendis:183:130:584:275",
"StarshardCradle:122:109:334:121",
"Tyrandas:158:169:580:61",
"VysnagosasRest:163:102:420:8",
},
}
-- add turtle-wow sell values -- add turtle-wow sell values
pfSellData = { pfSellData = {
+2 -3
View File
@@ -352,8 +352,7 @@ pfUI:RegisterModule("unitxp", function ()
end end
-- Debug command to test UnitXP indicators -- Debug command to test UnitXP indicators
_G.SLASH_PFUNITXP1 = "/pfunitxp" pfUI.api.RegisterSlashCommand("PFUNITXP", { "/pfunitxp" }, function()
SlashCmdList["PFUNITXP"] = function()
local chat = DEFAULT_CHAT_FRAME local chat = DEFAULT_CHAT_FRAME
chat:AddMessage("|cff33ffccpfUI|r: UnitXP Indicator Debug") chat:AddMessage("|cff33ffccpfUI|r: UnitXP Indicator Debug")
@@ -387,5 +386,5 @@ pfUI:RegisterModule("unitxp", function ()
else else
chat:AddMessage(" Target frame: |cffff0000NOT found|r") chat:AddMessage(" Target frame: |cffff0000NOT found|r")
end end
end end, true)
end) end)
+10 -25
View File
@@ -4,8 +4,6 @@ pfUI:RegisterModule("unusable", function ()
pfUI.unusable = {} pfUI.unusable = {}
local scanner = libtipscan:GetScanner("unusable")
local durability = string.gsub(DURABILITY_TEMPLATE, "%%[^%s]+", "(.+)")
local r, g, b, a = strsplit(",", C.appearance.bags.unusable_color) local r, g, b, a = strsplit(",", C.appearance.bags.unusable_color)
function pfUI.unusable:UpdateSlot(bag, slot) function pfUI.unusable:UpdateSlot(bag, slot)
@@ -13,40 +11,27 @@ pfUI:RegisterModule("unusable", function ()
if not pfUI.bags[bag] then return end if not pfUI.bags[bag] then return end
if not pfUI.bags[bag].slots[slot] then return end if not pfUI.bags[bag].slots[slot] then return end
-- add button shortcuts
local frame = pfUI.bags[bag].slots[slot].frame
local name = frame:GetName()
-- return on empty buttons -- return on empty buttons
local frame = pfUI.bags[bag].slots[slot].frame
if not frame.hasItem then return end if not frame.hasItem then return end
-- set the proper tooltip method -- C_PlayerInfo.CanUseItem is the "is this red in the tooltip" gate:
if bag == BANK_CONTAINER then -- proficiency, required level, class/race, skill/spell/rep. It checks
scanner:SetInventoryItem("player", 39+slot) -- *requirements* only, so a broken (0-durability) item still reads as
else -- usable -- no durability-line exclusion needed like the old scanner.
scanner:SetBagItem(bag, slot) local itemID = C_Container.GetContainerItemID(bag, slot)
if itemID and not C_PlayerInfo.CanUseItem(itemID) then
_G.SetItemButtonTextureVertexColor(frame, r, g, b, a)
end end
-- check for red color in tooltip
local red = scanner:Color(RED_FONT_COLOR)
if not red then return end
-- check for broken items
local left = scanner:Line(red)
local _, _, broken = string.find(left, durability, 1)
if broken then return end
-- update button vertex color
_G.SetItemButtonTextureVertexColor(frame, r, g, b, a)
end end
-- update on regular pfUI button updates -- update on regular pfUI button updates
pfUI.hooksecurefunc(pfUI.bag, "UpdateSlot", function(self, bag, slot) hooksecurefunc(pfUI.bag, "UpdateSlot", function(self, bag, slot)
pfUI.unusable:UpdateSlot(bag, slot) pfUI.unusable:UpdateSlot(bag, slot)
end) end)
-- update on bank frame itemlock updates -- update on bank frame itemlock updates
pfUI.hooksecurefunc("BankFrameItemButton_UpdateLock", function() hooksecurefunc("BankFrameItemButton_UpdateLock", function()
pfUI.unusable:UpdateSlot(-1, this:GetID()) pfUI.unusable:UpdateSlot(-1, this:GetID())
end) end)
end) end)
+2 -6
View File
@@ -5,11 +5,7 @@ end
SLASH_PFUI1 = '/pfui' SLASH_PFUI1 = '/pfui'
function SlashCmdList.PFUI(msg, editbox) function SlashCmdList.PFUI(msg, editbox)
if pfUI.gui:IsShown() then pfUI.gui:SetShown(not pfUI.gui:IsShown())
pfUI.gui:Hide()
else
pfUI.gui:Show()
end
end end
SLASH_GM1, SLASH_GM2 = '/gm', '/support' SLASH_GM1, SLASH_GM2 = '/gm', '/support'
@@ -27,7 +23,7 @@ do
-- ClassicAPI dependency check. -- ClassicAPI dependency check.
-- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus -- pfUI relies pervasively on the modern C_* / SuperWoW / nameplate / focus
-- API surface that ClassicAPI polyfills, so presence is required. -- API surface that ClassicAPI polyfills, so presence is required.
local PFUI_CLASSIC_API_MIN = 10511 -- (X*10000 + Y*100 + Z) local PFUI_CLASSIC_API_MIN = 10605 -- (X*10000 + Y*100 + Z)
local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN local PFUI_CLASSIC_API_LATEST = PFUI_CLASSIC_API_MIN
local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI" local PFUI_CLASSIC_API_WEBSITE = "https://github.com/brues-code/ClassicAPI"
local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest" local PFUI_CLASSIC_API_LATEST_URL = PFUI_CLASSIC_API_WEBSITE .. "/releases/latest"
+5 -5
View File
@@ -12,7 +12,7 @@ pfUI:RegisterSkin("Auctionhouse", function ()
SkinArrowButton(AuctionsNextPageButton, "right", 18) SkinArrowButton(AuctionsNextPageButton, "right", 18)
end end
pfUI.hooksecurefunc("AuctionFrame_OnShow", function() hooksecurefunc("AuctionFrame_OnShow", function()
AuctionFrame:ClearAllPoints() AuctionFrame:ClearAllPoints()
AuctionFrame:SetPoint("TOPLEFT", 10, -104) AuctionFrame:SetPoint("TOPLEFT", 10, -104)
end) end)
@@ -76,7 +76,7 @@ pfUI:RegisterSkin("Auctionhouse", function ()
item:SetPoint("LEFT", 2, 0) item:SetPoint("LEFT", 2, 0)
end end
end end
pfUI.hooksecurefunc("AuctionFrameBrowse_Update", function() hooksecurefunc("AuctionFrameBrowse_Update", function()
for i = 1, NUM_BROWSE_TO_DISPLAY do for i = 1, NUM_BROWSE_TO_DISPLAY do
HandleIcon(_G["BrowseButton"..i.."Item"], _G["BrowseButton"..i.."ItemIconTexture"]) HandleIcon(_G["BrowseButton"..i.."Item"], _G["BrowseButton"..i.."ItemIconTexture"])
end end
@@ -145,7 +145,7 @@ pfUI:RegisterSkin("Auctionhouse", function ()
item:ClearAllPoints() item:ClearAllPoints()
item:SetPoint("LEFT", 2, 0) item:SetPoint("LEFT", 2, 0)
end end
pfUI.hooksecurefunc("AuctionFrameBid_Update", function() hooksecurefunc("AuctionFrameBid_Update", function()
for i = 1, NUM_BIDS_TO_DISPLAY do for i = 1, NUM_BIDS_TO_DISPLAY do
HandleIcon(_G["BidButton"..i.."Item"], _G["BidButton"..i.."ItemIconTexture"]) HandleIcon(_G["BidButton"..i.."Item"], _G["BidButton"..i.."ItemIconTexture"])
end end
@@ -191,14 +191,14 @@ pfUI:RegisterSkin("Auctionhouse", function ()
item:ClearAllPoints() item:ClearAllPoints()
item:SetPoint("LEFT", 2, 0) item:SetPoint("LEFT", 2, 0)
end end
pfUI.hooksecurefunc("AuctionFrameAuctions_Update", function() hooksecurefunc("AuctionFrameAuctions_Update", function()
for i = 1, NUM_AUCTIONS_TO_DISPLAY do for i = 1, NUM_AUCTIONS_TO_DISPLAY do
HandleIcon(_G["AuctionsButton"..i.."Item"], _G["AuctionsButton"..i.."ItemIconTexture"]) HandleIcon(_G["AuctionsButton"..i.."Item"], _G["AuctionsButton"..i.."ItemIconTexture"])
end end
end) end)
SkinButton(AuctionsItemButton) SkinButton(AuctionsItemButton)
pfUI.hooksecurefunc("AuctionSellItemButton_OnEvent", function() hooksecurefunc("AuctionSellItemButton_OnEvent", function()
if event ~= "NEW_AUCTION_UPDATE" then return end if event ~= "NEW_AUCTION_UPDATE" then return end
HandleIcon(AuctionsItemButton, AuctionsItemButton:GetNormalTexture()) HandleIcon(AuctionsItemButton, AuctionsItemButton:GetNormalTexture())
end) end)
+2 -2
View File
@@ -15,11 +15,11 @@ pfUI:RegisterSkin("Battlefield Minimap", function ()
BattlefieldMinimapTabText:ClearAllPoints() BattlefieldMinimapTabText:ClearAllPoints()
BattlefieldMinimapTabText:SetPoint("CENTER", 0, 0) BattlefieldMinimapTabText:SetPoint("CENTER", 0, 0)
HookScript(BattlefieldMinimap, "OnShow", function() BattlefieldMinimap:HookScript("OnShow", function()
BattlefieldMinimapTab:Hide() BattlefieldMinimapTab:Hide()
end) end)
pfUI.hooksecurefunc("BattlefieldMinimap_ShowOpacity", function() hooksecurefunc("BattlefieldMinimap_ShowOpacity", function()
OpacityFrame:ClearAllPoints() OpacityFrame:ClearAllPoints()
OpacityFrame:SetPoint("TOPRIGHT", "BattlefieldMinimap", "TOPLEFT", -2*border, 0) OpacityFrame:SetPoint("TOPRIGHT", "BattlefieldMinimap", "TOPLEFT", -2*border, 0)
end) end)
+23 -5
View File
@@ -4,7 +4,25 @@ pfUI:RegisterSkin("Character", function ()
-- Honor Tab -- Honor Tab
StripTextures(HonorFrame) StripTextures(HonorFrame)
StripTextures(ArenaFrame) if ArenaFrame then
StripTextures(ArenaFrame)
for _, frame in pairs({'Arena', 'Honor'}) do
for i = 1, 2 do
local tab = _G[frame.."FrameTab"..i]
local lastTab = _G[frame.."FrameTab"..(i-1)]
if lastTab and lastTab:IsShown() then
tab:ClearAllPoints()
tab:SetPoint("LEFT", lastTab, "RIGHT", border*2 + 1, 0)
end
SkinTab(tab)
end
end
for i = 1, 3 do
local team = _G["ArenaFrameTeam"..i]
StripTextures(team)
CreateBackdrop(team)
end
end
HonorFrameProgressBar:SetStatusBarTexture(pfUI.media["img:bar"]) HonorFrameProgressBar:SetStatusBarTexture(pfUI.media["img:bar"])
CreateBackdrop(HonorFrameProgressBar) CreateBackdrop(HonorFrameProgressBar)
@@ -136,18 +154,18 @@ pfUI:RegisterSkin("Character", function ()
end end
end end
pfUI.hooksecurefunc("CharacterFrame_OnShow", function() hooksecurefunc("CharacterFrame_OnShow", function()
RefreshCharacterSlots() RefreshCharacterSlots()
RefreshPetPosition() RefreshPetPosition()
end) end)
pfUI.hooksecurefunc("PaperDollItemSlotButton_Update", function() hooksecurefunc("PaperDollItemSlotButton_Update", function()
if this:GetParent() == PaperDollFrame then if this:GetParent() == PaperDollFrame then
RefreshCharacterSlot(this) RefreshCharacterSlot(this)
end end
end) end)
pfUI.hooksecurefunc("PetTab_Update", RefreshPetPosition) hooksecurefunc("PetTab_Update", RefreshPetPosition)
StripTextures(PaperDollFrame) StripTextures(PaperDollFrame)
StripTextures(CharacterAttributesFrame) StripTextures(CharacterAttributesFrame)
@@ -270,7 +288,7 @@ pfUI:RegisterSkin("Character", function ()
-- the FactionStanding text from `bar.standingText` on mouseout, so we -- the FactionStanding text from `bar.standingText` on mouseout, so we
-- stash our augmented text there too — otherwise hovering a bar strips -- stash our augmented text there too — otherwise hovering a bar strips
-- the "(N)" suffix off. -- the "(N)" suffix off.
pfUI.hooksecurefunc("ReputationFrame_Update", function() hooksecurefunc("ReputationFrame_Update", function()
if C.character.reputation.repRequired ~= "1" then return end if C.character.reputation.repRequired ~= "1" then return end
local offset = FauxScrollFrame_GetOffset(ReputationListScrollFrame) local offset = FauxScrollFrame_GetOffset(ReputationListScrollFrame)
for i = 1, NUM_FACTIONS_DISPLAYED do for i = 1, NUM_FACTIONS_DISPLAYED do
+2 -2
View File
@@ -150,7 +150,7 @@ pfUI:RegisterSkin("Friends", function ()
end end
-- set positions -- set positions
pfUI.hooksecurefunc("WhoList_Update", function() hooksecurefunc("WhoList_Update", function()
for i = 1, WHOS_TO_DISPLAY do for i = 1, WHOS_TO_DISPLAY do
local level = _G["WhoFrameButton"..i.."Level"] local level = _G["WhoFrameButton"..i.."Level"]
level:ClearAllPoints() level:ClearAllPoints()
@@ -231,7 +231,7 @@ pfUI:RegisterSkin("Friends", function ()
end end
-- set positions -- set positions
pfUI.hooksecurefunc("GuildStatus_Update", function() hooksecurefunc("GuildStatus_Update", function()
for i = 1, GUILDMEMBERS_TO_DISPLAY do for i = 1, GUILDMEMBERS_TO_DISPLAY do
local level = _G["GuildFrameButton"..i.."Level"] local level = _G["GuildFrameButton"..i.."Level"]
level:ClearAllPoints() level:ClearAllPoints()
+2 -2
View File
@@ -24,11 +24,11 @@ pfUI:RegisterSkin("Gossip and Quest", function ()
QuestRewardItemHighlightBG:SetTexture(1,1,1,.2) QuestRewardItemHighlightBG:SetTexture(1,1,1,.2)
QuestRewardItemHighlightBG:SetAllPoints() QuestRewardItemHighlightBG:SetAllPoints()
pfUI.hooksecurefunc("QuestFrameItems_Update", function() hooksecurefunc("QuestFrameItems_Update", function()
QuestRewardItemHighlight:Hide() QuestRewardItemHighlight:Hide()
end) end)
pfUI.hooksecurefunc("QuestRewardItem_OnClick", function() hooksecurefunc("QuestRewardItem_OnClick", function()
if this.type == "choice" then if this.type == "choice" then
QuestRewardItemHighlight:SetAllPoints(this.backdrop) QuestRewardItemHighlight:SetAllPoints(this.backdrop)
QuestRewardItemHighlight:Show() QuestRewardItemHighlight:Show()
+193
View File
@@ -0,0 +1,193 @@
local slots = {
"HeadSlot",
"NeckSlot",
"ShoulderSlot",
"BackSlot",
"ChestSlot",
"ShirtSlot",
"TabardSlot",
"WristSlot",
"HandsSlot",
"WaistSlot",
"LegsSlot",
"FeetSlot",
"Finger0Slot",
"Finger1Slot",
"Trinket0Slot",
"Trinket1Slot",
"MainHandSlot",
"SecondaryHandSlot",
"RangedSlot",
}
pfUI:RegisterSkin("Inspect", function ()
local rawborder, border = GetBorderSize()
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
HookAddonOrVariable("Blizzard_InspectUI", function()
local cache = {}
CreateBackdrop(InspectFrame, nil, nil, .75)
CreateBackdropShadow(InspectFrame)
InspectFrame.backdrop:SetPoint("TOPLEFT", 10, -10)
InspectFrame.backdrop:SetPoint("BOTTOMRIGHT", -30, 72)
InspectFrame:SetHitRectInsets(10,30,10,72)
EnableMovable("InspectFrame", "Blizzard_InspectUI", INSPECTFRAME_SUBFRAMES)
SkinCloseButton(InspectFrameCloseButton, InspectFrame.backdrop, -6, -6)
InspectFrame:DisableDrawLayer("ARTWORK")
InspectNameText:ClearAllPoints()
InspectNameText:SetPoint("TOP", InspectFrame.backdrop, "TOP", 0, -10)
-- Turtle WoW has up to 4 inspect tabs: Character, Honor, Arena, Talents
for i = 1, 4 do
local tab = _G["InspectFrameTab"..i]
if tab then
local lastTab = _G["InspectFrameTab"..(i-1)]
tab:ClearAllPoints()
if lastTab then
tab:SetPoint("LEFT", lastTab, "RIGHT", border*2 + 1, 0)
else
tab:SetPoint("TOPLEFT", InspectFrame.backdrop, "BOTTOMLEFT", bpad, -(border + (border == 1 and 1 or 2)))
end
SkinTab(tab)
end
end
do -- Character Tab
StripTextures(InspectPaperDollFrame)
EnableClickRotate(InspectModelFrame)
local rotL = InspectModelRotateLeftButton or InspectModelFrameRotateLeftButton
if rotL then rotL:Hide() end
local rotR = InspectModelRotateRightButton or InspectModelFrameRotateRightButton
if rotR then rotR:Hide() end
for _, slot in pairs(slots) do
local frame = _G["Inspect"..slot]
StripTextures(frame)
CreateBackdrop(frame)
SetAllPointsOffset(frame.backdrop, frame, 0)
HandleIcon(frame.backdrop, _G["Inspect"..slot.."IconTexture"])
local funce = frame:GetScript("OnEnter")
frame:SetScript("OnEnter", function()
local bid = this:GetID()
if not GetInventoryItemLink(InspectFrame.unit, this:GetID()) and this.hasItem then
GameTooltip:SetOwner(this, "ANCHOR_TOPRIGHT")
GameTooltip:SetHyperlink("item:"..cache[bid]["id"])
GameTooltip:Show()
else
funce()
end
end)
end
local function ColorSlot(slot, id, itemID, vslot)
local item = Item:CreateFromItemID(itemID)
if item:IsItemEmpty() then return end
item:ContinueOnItemLoad(function()
if not InspectFrame.unit then return end
if GetInventoryItemID(InspectFrame.unit, id) ~= itemID then return end
local quality = item:GetItemQuality()
if not quality then return end
local r, g, b = GetItemQualityColor(quality)
slot.backdrop:SetBackdropBorderColor(r, g, b)
if ShaguScore then
if not slot.scoreText then
slot.scoreText = slot:CreateFontString(nil, "OVERLAY", "GameFontNormal")
slot.scoreText:SetFont(pfUI.font_default, 12, "OUTLINE")
slot.scoreText:SetPoint("TOPRIGHT", 0, 0)
end
local itemLevel = ShaguScore.Database[itemID] or 0
local score = ShaguScore:Calculate(vslot, quality, itemLevel)
if score and score > 0 then
slot.scoreText:SetText(score)
slot.scoreText:SetTextColor(r, g, b)
else
slot.scoreText:SetText("")
end
end
end)
end
local function UpdateSlots()
if not InspectFrame.unit then return end
local guild, title = GetGuildInfo(InspectFrame.unit)
if guild then
InspectGuildText:SetPoint("TOP", InspectLevelText, "BOTTOM", 0, -1)
InspectGuildText:SetText(format(TEXT(GUILD_TITLE_TEMPLATE), title, guild))
InspectGuildText:Show()
else
InspectGuildText:SetText("")
InspectGuildText:Hide()
end
for _, vslot in pairs(slots) do
local id = GetInventorySlotInfo(vslot)
local itemID = GetInventoryItemID(InspectFrame.unit, id)
local slot = _G["Inspect" .. vslot]
if itemID then
ColorSlot(slot, id, itemID, vslot)
elseif not slot.hasItem then
-- genuinely empty slot: reset to a plain backdrop
CreateBackdrop(slot)
SetAllPointsOffset(slot.backdrop, slot, 0)
if slot.scoreText then
slot.scoreText:SetText("")
end
end
end
end
hooksecurefunc("InspectPaperDollItemSlotButton_Update", function(button)
local bid = button:GetID()
local itemID = GetInventoryItemID(InspectFrame.unit, bid)
if itemID then
cache[bid] = cache[bid] or {}
cache[bid]["id"] = itemID
cache[bid]["tex"] = GetInventoryItemTexture(InspectFrame.unit, button:GetID())
cache[bid]["count"] = GetInventoryItemCount(InspectFrame.unit, button:GetID())
cache[bid]["name"] = UnitName(InspectFrame.unit)
elseif cache[bid] and UnitName(InspectFrame.unit) == cache[bid].name then
-- restore cache information
SetItemButtonTexture(button, cache[bid]["tex"])
SetItemButtonCount(button, cache[bid]["count"])
button.hasItem = 1
end
UpdateSlots()
end)
end
do -- Honor Tab
StripTextures(InspectHonorFrame)
if InspectArenaFrame then
StripTextures(InspectArenaFrame)
for i = 1, 3 do
local team = _G["InspectArenaFrameTeam"..i]
StripTextures(team)
CreateBackdrop(team)
end
end
CreateBackdrop(InspectHonorFrameProgressBar)
InspectHonorFrameProgressBar:SetStatusBarTexture(pfUI.media["img:bar"])
InspectHonorFrameProgressBar:SetHeight(24)
end
-- NOTE: Turtle WoW's Talent tab (InspectTalentsFrame / TWTalentFrame) is
-- skinned in modules/turtle-wow.lua, which activates once this skin is
-- registered (it gates on pfUI.skin["Inspect"]).
end)
end)
+1 -1
View File
@@ -86,7 +86,7 @@ pfUI:RegisterSkin("Books", function ()
ItemTextScrollFrameScrollBarScrollDownButton.Hide = function(self) self:Disable() end ItemTextScrollFrameScrollBarScrollDownButton.Hide = function(self) self:Disable() end
local first local first
HookScript(ItemTextFrame, "OnShow", function() ItemTextFrame:HookScript("OnShow", function()
if not first then -- it is necessary to update the scrollbar when you first open the frame if not first then -- it is necessary to update the scrollbar when you first open the frame
ItemTextScrollFrameScrollBar:Show() ItemTextScrollFrameScrollBar:Show()
ItemTextScrollFrameScrollBar:Hide() ItemTextScrollFrameScrollBar:Hide()
+2 -2
View File
@@ -12,7 +12,7 @@ pfUI:RegisterSkin("Mailbox", function ()
StripTextures(SendMailPackageButton) StripTextures(SendMailPackageButton)
SkinButton(SendMailPackageButton, nil, nil, nil, nil, true) SkinButton(SendMailPackageButton, nil, nil, nil, nil, true)
pfUI.hooksecurefunc("SendMailFrame_Update", function() hooksecurefunc("SendMailFrame_Update", function()
HandleIcon(SendMailPackageButton, SendMailPackageButton:GetNormalTexture()) HandleIcon(SendMailPackageButton, SendMailPackageButton:GetNormalTexture())
local _, itemID = GetSendMailItemLink() local _, itemID = GetSendMailItemLink()
@@ -62,7 +62,7 @@ pfUI:RegisterSkin("Mailbox", function ()
do -- OpenMailFrame do -- OpenMailFrame
SkinButton(OpenMailPackageButton, nil, nil, nil, OpenMailPackageButtonIconTexture) SkinButton(OpenMailPackageButton, nil, nil, nil, OpenMailPackageButtonIconTexture)
pfUI.hooksecurefunc("InboxFrame_OnClick", function(index) hooksecurefunc("InboxFrame_OnClick", function(index)
local _, itemID = GetInboxItemLink(index) local _, itemID = GetInboxItemLink(index)
if itemID then if itemID then
local quality = C_Item.GetItemQualityByID(itemID) local quality = C_Item.GetItemQualityByID(itemID)
+2 -2
View File
@@ -6,7 +6,7 @@ pfUI:RegisterSkin("Merchant", function ()
if MerchantGuildBankRepairButton then -- tbc if MerchantGuildBankRepairButton then -- tbc
SkinButton(MerchantGuildBankRepairButton, nil, nil, nil, MerchantGuildBankRepairButtonIcon) SkinButton(MerchantGuildBankRepairButton, nil, nil, nil, MerchantGuildBankRepairButtonIcon)
MerchantGuildBankRepairButtonIcon:SetTexCoord(.59, .82, .06, .54) MerchantGuildBankRepairButtonIcon:SetTexCoord(.59, .82, .06, .54)
pfUI.hooksecurefunc("MerchantFrame_UpdateRepairButtons", function() hooksecurefunc("MerchantFrame_UpdateRepairButtons", function()
MerchantGuildBankRepairButton:ClearAllPoints() MerchantGuildBankRepairButton:ClearAllPoints()
MerchantGuildBankRepairButton:SetPoint("RIGHT", MerchantBuyBackItemItemButton, "LEFT", -14, 0) MerchantGuildBankRepairButton:SetPoint("RIGHT", MerchantBuyBackItemItemButton, "LEFT", -14, 0)
MerchantRepairAllButton:ClearAllPoints() MerchantRepairAllButton:ClearAllPoints()
@@ -56,7 +56,7 @@ pfUI:RegisterSkin("Merchant", function ()
moneyFrame:SetPoint("BOTTOMLEFT", itemButton, "BOTTOMRIGHT", 5, 1) moneyFrame:SetPoint("BOTTOMLEFT", itemButton, "BOTTOMRIGHT", 5, 1)
end end
pfUI.hooksecurefunc("MerchantFrame_UpdateMerchantInfo", function() hooksecurefunc("MerchantFrame_UpdateMerchantInfo", function()
if MerchantFrame.selectedTab == 1 then if MerchantFrame.selectedTab == 1 then
for i = 3, 11, 2 do for i = 3, 11, 2 do
_G["MerchantItem"..i]:ClearAllPoints() _G["MerchantItem"..i]:ClearAllPoints()
+5 -5
View File
@@ -11,7 +11,7 @@ pfUI:RegisterSkin("Options - New", function ()
CreateBackdropShadow(OptionsFrame) CreateBackdropShadow(OptionsFrame)
EnableMovable(OptionsFrame) EnableMovable(OptionsFrame)
HookScript(OptionsFrame, "OnShow", function() OptionsFrame:HookScript("OnShow", function()
this:ClearAllPoints() this:ClearAllPoints()
this:SetPoint("CENTER", 0, 0) this:SetPoint("CENTER", 0, 0)
end) end)
@@ -109,13 +109,13 @@ pfUI:RegisterSkin("Options - New", function ()
local color = PFUI_CLASS_COLORS[class] local color = PFUI_CLASS_COLORS[class]
SetHighlight(btn, color.r, color.g, color.b) SetHighlight(btn, color.r, color.g, color.b)
btn:SetFont(pfUI.font_default, pfUI_config.global.font_size, "OUTLINE") btn:SetFont(pfUI.font_default, pfUI_config.global.font_size, "OUTLINE")
HookScript(btn, "OnMouseDown", function() btn:HookScript("OnMouseDown", function()
StripTextures(this, true) StripTextures(this, true)
this:SetBackdrop(pfUI.backdrop) this:SetBackdrop(pfUI.backdrop)
this:SetBackdropColor(br, bg, bb, 0.75) this:SetBackdropColor(br, bg, bb, 0.75)
this:SetBackdropBorderColor(er, eg, eb, 1) this:SetBackdropBorderColor(er, eg, eb, 1)
end) end)
HookScript(btn, "OnMouseUp", function() btn:HookScript("OnMouseUp", function()
StripTextures(this, true) StripTextures(this, true)
this:SetBackdrop(pfUI.backdrop) this:SetBackdrop(pfUI.backdrop)
this:SetBackdropColor(br, bg, bb, 0.75) this:SetBackdropColor(br, bg, bb, 0.75)
@@ -184,7 +184,7 @@ pfUI:RegisterSkin("Options - New", function ()
end end
-- hook after category selection: UpdateOptions is local so we hook its caller -- hook after category selection: UpdateOptions is local so we hook its caller
pfUI.hooksecurefunc("OptionsListButton_OnClick", SkinControls) hooksecurefunc("OptionsListButton_OnClick", SkinControls)
-- also cover initial load -- also cover initial load
HookScript(OptionsFrame, "OnShow", SkinControls) OptionsFrame:HookScript("OnShow", SkinControls)
end) end)
+11 -30
View File
@@ -5,37 +5,18 @@ pfUI:RegisterSkin("Options - Sound", function ()
-- Compatibility -- Compatibility
local SoundOptionsFrameHeaderText, NUM_CHECKBOXES, NUM_SLIDERS local SoundOptionsFrameHeaderText, NUM_CHECKBOXES, NUM_SLIDERS
if SOUND_OPTIONS then -- tbc
SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "BACKGROUND", SOUND_OPTIONS)
NUM_CHECKBOXES = 11
NUM_SLIDERS = 6
StripTextures(AudioOptionsFrame) SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "ARTWORK", SOUNDOPTIONS_MENU)
CreateBackdrop(SoundOptionsFramePlayback, nil, true, .75) NUM_CHECKBOXES = 8
CreateBackdrop(SoundOptionsFrameHardware, nil, true, .75) NUM_SLIDERS = 4
CreateBackdrop(SoundOptionsFrameVolume, nil, true, .75)
SkinDropDown(SoundOptionsOutputDropDown) SoundOptionsFrameOkay:ClearAllPoints()
SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0)
SoundOptionsFrameDefaults:ClearAllPoints() SoundOptionsFrameSlider1:ClearAllPoints()
SoundOptionsFrameDefaults:SetPoint("TOPLEFT", SoundOptionsFramePlayback, "BOTTOMLEFT", 0, -10) SoundOptionsFrameSlider1:SetPoint("TOPRIGHT", SoundOptionsFrame, "TOPRIGHT", -18, -43)
SoundOptionsFrameCancel:ClearAllPoints() for i=2, NUM_SLIDERS do
SoundOptionsFrameCancel:SetPoint("TOPRIGHT", SoundOptionsFrameVolume, "BOTTOMRIGHT", 0, -10) _G["SoundOptionsFrameSlider"..i]:ClearAllPoints()
SoundOptionsFrameOkay:ClearAllPoints() _G["SoundOptionsFrameSlider"..i]:SetPoint("TOP", _G["SoundOptionsFrameSlider"..i-1], "BOTTOM", 0, -30)
SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0)
else -- vanilla
SoundOptionsFrameHeaderText = GetNoNameObject(SoundOptionsFrame, "FontString", "ARTWORK", SOUNDOPTIONS_MENU)
NUM_CHECKBOXES = 8
NUM_SLIDERS = 4
SoundOptionsFrameOkay:ClearAllPoints()
SoundOptionsFrameOkay:SetPoint("RIGHT", SoundOptionsFrameCancel, "LEFT", -2*bpad, 0)
SoundOptionsFrameSlider1:ClearAllPoints()
SoundOptionsFrameSlider1:SetPoint("TOPRIGHT", SoundOptionsFrame, "TOPRIGHT", -18, -43)
for i=2, NUM_SLIDERS do
_G["SoundOptionsFrameSlider"..i]:ClearAllPoints()
_G["SoundOptionsFrameSlider"..i]:SetPoint("TOP", _G["SoundOptionsFrameSlider"..i-1], "BOTTOM", 0, -30)
end
end end
StripTextures(SoundOptionsFrame) StripTextures(SoundOptionsFrame)
@@ -44,7 +25,7 @@ pfUI:RegisterSkin("Options - Sound", function ()
EnableMovable(SoundOptionsFrame) EnableMovable(SoundOptionsFrame)
HookScript(SoundOptionsFrame, "OnShow", function() SoundOptionsFrame:HookScript("OnShow", function()
this:ClearAllPoints() this:ClearAllPoints()
this:SetPoint("CENTER", 0, 0) this:SetPoint("CENTER", 0, 0)
end) end)
+2 -2
View File
@@ -19,7 +19,7 @@ pfUI:RegisterSkin("Options - Video", function ()
slider:SetPoint(point, anchor, anchorPoint, x, y - shift) slider:SetPoint(point, anchor, anchorPoint, x, y - shift)
end end
pfUI.hooksecurefunc("OptionsFrame_Load", function() hooksecurefunc("OptionsFrame_Load", function()
OptionsFramePixelShaders:SetWidth(230) OptionsFramePixelShaders:SetWidth(230)
OptionsFrameMiscellaneous:ClearAllPoints() OptionsFrameMiscellaneous:ClearAllPoints()
OptionsFrameMiscellaneous:SetPoint("LEFT", OptionsFramePixelShaders, "RIGHT", 6, 0) OptionsFrameMiscellaneous:SetPoint("LEFT", OptionsFramePixelShaders, "RIGHT", 6, 0)
@@ -49,7 +49,7 @@ pfUI:RegisterSkin("Options - Video", function ()
EnableMovable(OptionsFrame) EnableMovable(OptionsFrame)
HookScript(OptionsFrame, "OnShow", function() OptionsFrame:HookScript("OnShow", function()
this:ClearAllPoints() this:ClearAllPoints()
this:SetPoint("CENTER", 0, 0) this:SetPoint("CENTER", 0, 0)
end) end)
+1 -1
View File
@@ -192,7 +192,7 @@ pfUI:RegisterSkin("Profession", function ()
reagentlabel:SetTextColor(1,1,1,1) reagentlabel:SetTextColor(1,1,1,1)
local scanner = libtipscan:GetScanner(name) local scanner = libtipscan:GetScanner(name)
pfUI.hooksecurefunc(SetSelection, function(id) hooksecurefunc(SetSelection, function(id)
if id and id ~= 0 then if id and id ~= 0 then
detailscroll:Show() detailscroll:Show()
HandleIcon(icon, icon:GetNormalTexture()) HandleIcon(icon, icon:GetNormalTexture())
+5 -5
View File
@@ -13,7 +13,7 @@ pfUI:RegisterSkin("Quest Log", function ()
StripTextures(QUEST_COUNT) StripTextures(QUEST_COUNT)
QUEST_COUNT:ClearAllPoints() QUEST_COUNT:ClearAllPoints()
pfUI.hooksecurefunc("QuestLogUpdateQuestCount", function(numQuests) hooksecurefunc("QuestLogUpdateQuestCount", function(numQuests)
QUEST_COUNT:ClearAllPoints() QUEST_COUNT:ClearAllPoints()
QUEST_COUNT:SetPoint("BOTTOMRIGHT", QuestLogFrame, "TOPRIGHT", 0, -50) QUEST_COUNT:SetPoint("BOTTOMRIGHT", QuestLogFrame, "TOPRIGHT", 0, -50)
end) end)
@@ -24,7 +24,7 @@ pfUI:RegisterSkin("Quest Log", function ()
QUEST_COUNT:SetPoint("TOPRIGHT", -10, -30) QUEST_COUNT:SetPoint("TOPRIGHT", -10, -30)
end end
pfUI.hooksecurefunc("QuestLog_OnShow", function() hooksecurefunc("QuestLog_OnShow", function()
QuestLogFrame:ClearAllPoints() QuestLogFrame:ClearAllPoints()
QuestLogFrame:SetPoint("TOPLEFT", 10, -104) QuestLogFrame:SetPoint("TOPLEFT", 10, -104)
end) end)
@@ -102,13 +102,13 @@ pfUI:RegisterSkin("Quest Log", function ()
end end
end) end)
HookScript(QuestLogDetailScrollFrame, "OnHide", function() QuestLogDetailScrollFrame:HookScript("OnHide", function()
SkinArrowButton(QuestLogFrameExpandButton, "RIGHT", 21) SkinArrowButton(QuestLogFrameExpandButton, "RIGHT", 21)
QuestLogDetailScrollFrame:Hide() QuestLogDetailScrollFrame:Hide()
QuestLogFrame:SetWidth(340) QuestLogFrame:SetWidth(340)
end) end)
HookScript(QuestLogDetailScrollFrame, "OnShow", function() QuestLogDetailScrollFrame:HookScript("OnShow", function()
SkinArrowButton(QuestLogFrameExpandButton, "LEFT", 21) SkinArrowButton(QuestLogFrameExpandButton, "LEFT", 21)
QuestLogDetailScrollFrame:Show() QuestLogDetailScrollFrame:Show()
QuestLogFrame:SetWidth(676) QuestLogFrame:SetWidth(676)
@@ -163,7 +163,7 @@ pfUI:RegisterSkin("Quest Log", function ()
QuestLogListScrollFrame:SetPoint("TOPLEFT", 10, -54) QuestLogListScrollFrame:SetPoint("TOPLEFT", 10, -54)
QuestLogListScrollFrame:SetHeight(350) QuestLogListScrollFrame:SetHeight(350)
pfUI.hooksecurefunc("QuestLog_Update", function() hooksecurefunc("QuestLog_Update", function()
local numEntries = GetNumQuestLogEntries() local numEntries = GetNumQuestLogEntries()
local questIndex, text, level, questTag, isHeader local questIndex, text, level, questTag, isHeader
+2 -2
View File
@@ -38,12 +38,12 @@ pfUI:RegisterSkin("Readycheck", function ()
frame.bar.text:SetPoint("CENTER", 0, 0) frame.bar.text:SetPoint("CENTER", 0, 0)
local max local max
pfUI.hooksecurefunc("ShowReadyCheck", function() hooksecurefunc("ShowReadyCheck", function()
max = ReadyCheckFrame.timer max = ReadyCheckFrame.timer
frame.bar:SetMinMaxValues(0, max) frame.bar:SetMinMaxValues(0, max)
end) end)
pfUI.hooksecurefunc(update_func, function() hooksecurefunc(update_func, function()
if not ReadyCheckFrame.timer then return end if not ReadyCheckFrame.timer then return end
local perc = ReadyCheckFrame.timer/max local perc = ReadyCheckFrame.timer/max
+1 -1
View File
@@ -32,7 +32,7 @@ pfUI:RegisterSkin("GM Survey", function ()
CreateBackdrop(GMSurveyCommentFrame, nil, true, .75) CreateBackdrop(GMSurveyCommentFrame, nil, true, .75)
SkinScrollbar(GMSurveyCommentScrollFrameScrollBar) SkinScrollbar(GMSurveyCommentScrollFrameScrollBar)
GMSurveyFrameComment:SetMaxLetters(2000) GMSurveyFrameComment:SetMaxLetters(2000)
pfUI.hooksecurefunc("GMSurveyFrame_Update", function() hooksecurefunc("GMSurveyFrame_Update", function()
GMSurveyFrameComment:SetWidth(505) GMSurveyFrameComment:SetWidth(505)
end) end)
end) end)
+2 -2
View File
@@ -7,7 +7,7 @@ pfUI:RegisterSkin("Tooltips", function ()
CreateBackdropShadow(tooltip) CreateBackdropShadow(tooltip)
end end
HookScript(WorldMapTooltip, "OnShow", function() WorldMapTooltip:HookScript("OnShow", function()
CreateBackdrop(WorldMapTooltip, nil, nil, alpha) CreateBackdrop(WorldMapTooltip, nil, nil, alpha)
CreateBackdropShadow(WorldMapTooltip) CreateBackdropShadow(WorldMapTooltip)
end) end)
@@ -16,7 +16,7 @@ pfUI:RegisterSkin("Tooltips", function ()
for _, tooltip in pairs({ShoppingTooltip1, ShoppingTooltip2}) do for _, tooltip in pairs({ShoppingTooltip1, ShoppingTooltip2}) do
tooltip:SetClampedToScreen(true) tooltip:SetClampedToScreen(true)
HookScript(tooltip, "OnShow", function() tooltip:HookScript("OnShow", function()
local a, b, c, x, y = this:GetPoint() local a, b, c, x, y = this:GetPoint()
if not x or x == 0 then x = (border*2) + ( x or 0 ) + 1 end if not x or x == 0 then x = (border*2) + ( x or 0 ) + 1 end
if a then this:SetPoint(a, b, c, x, y) end if a then this:SetPoint(a, b, c, x, y) end
+1 -1
View File
@@ -41,7 +41,7 @@ pfUI:RegisterSkin("Trade", function ()
RecipientButtonBG:SetAllPoints() RecipientButtonBG:SetAllPoints()
end end
pfUI.hooksecurefunc("TradeFrame_UpdateTargetItem", function(id) hooksecurefunc("TradeFrame_UpdateTargetItem", function(id)
HandleIcon(_G["TradeRecipientItem"..id.."ItemButton"], _G["TradeRecipientItem"..id..'IconTexture']) HandleIcon(_G["TradeRecipientItem"..id.."ItemButton"], _G["TradeRecipientItem"..id..'IconTexture'])
end) end)
+1 -1
View File
@@ -36,7 +36,7 @@ pfUI:RegisterSkin("Trainer", function ()
StripTextures(ClassTrainerSkillIcon) StripTextures(ClassTrainerSkillIcon)
SkinButton(ClassTrainerSkillIcon, nil, nil, nil, nil, true) SkinButton(ClassTrainerSkillIcon, nil, nil, nil, nil, true)
pfUI.hooksecurefunc("ClassTrainer_SetSelection", function() hooksecurefunc("ClassTrainer_SetSelection", function()
HandleIcon(ClassTrainerSkillIcon, ClassTrainerSkillIcon:GetNormalTexture()) HandleIcon(ClassTrainerSkillIcon, ClassTrainerSkillIcon:GetNormalTexture())
end) end)