mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-10 15:40:01 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3cfd711fe | ||
|
|
a7ad1f073f | ||
|
|
fe5b3b135b | ||
|
|
9c29f0c7d4 | ||
|
|
685ecb4a3e | ||
|
|
8cdaf1fc00 | ||
|
|
bb39c9d94e | ||
|
|
18059ffbb7 | ||
|
|
d75e280238 | ||
|
|
9eb34b8f0a | ||
|
|
f8dde49f09 | ||
|
|
74fbbb6154 | ||
|
|
af6893c10c | ||
|
|
be6b2ea036 | ||
|
|
afdb6c3862 | ||
|
|
b230a45b92 | ||
|
|
ef1fa47539 | ||
|
|
ab0ad7dcf9 | ||
|
|
c82813df5b | ||
|
|
6e1f8095a2 | ||
|
|
9cabdf2974 | ||
|
|
b6931359b0 | ||
|
|
e017dbf515 | ||
|
|
69d778d6d6 | ||
|
|
75a25cf614 | ||
|
|
9daf6165fd | ||
|
|
06768c985a | ||
|
|
881a17e508 | ||
|
|
4e461d766e | ||
|
|
2dfaa65168 | ||
|
|
97ef039d3a | ||
|
|
25ef02705c | ||
|
|
48d1da2015 | ||
|
|
ff29e9d3c2 | ||
|
|
f0f1c80e24 | ||
|
|
5b4cb2bc9f | ||
|
|
5a3a962c90 | ||
|
|
cd08db75d2 | ||
|
|
6365f0cdb1 | ||
|
|
faa801e27d | ||
|
|
421a103f22 | ||
|
|
ecb28fb194 | ||
|
|
94268b1162 | ||
|
|
1c7c91fdf7 | ||
|
|
7f5d18bc30 | ||
|
|
7efc3334ae | ||
|
|
f322fbd6c6 | ||
|
|
41b77a5728 | ||
|
|
06fea6c889 | ||
|
|
940a1adae0 | ||
|
|
d13710c5a4 | ||
|
|
c3dd7cb601 | ||
|
|
9190b88974 | ||
|
|
fe0ec82ede | ||
|
|
350b1d63ae | ||
|
|
c7f42491ef | ||
|
|
6b458c9e27 | ||
|
|
f338deebe7 | ||
|
|
c994d00596 | ||
|
|
4be680183a | ||
|
|
2352f1c6ed | ||
|
|
305ff6c86e | ||
|
|
a8b131898b | ||
|
|
1f9be33772 | ||
|
|
a798e67b7f | ||
|
|
8b87e30266 | ||
|
|
f68b14e53b | ||
|
|
8ab6fab04f | ||
|
|
6d1bfe805e | ||
|
|
838f7f5d25 | ||
|
|
fad078fa87 | ||
|
|
48d76138ed | ||
|
|
fe22dfc456 | ||
|
|
5eaab2784f | ||
|
|
f41d5ac6d0 | ||
|
|
af8780bb41 | ||
|
|
ea37f41db1 | ||
|
|
6f36da7aa1 | ||
|
|
149d5dd362 | ||
|
|
0156d9dfec | ||
|
|
6b945c2c97 | ||
|
|
452eef3864 | ||
|
|
6f7a57f530 | ||
|
|
a55460e543 | ||
|
|
58aaeef5f0 | ||
|
|
487af0c8f4 | ||
|
|
00292ca3b4 | ||
|
|
cba3604906 | ||
|
|
a31d10384b | ||
|
|
f06af48bc2 | ||
|
|
d73c4de695 | ||
|
|
dd8c529463 | ||
|
|
47a7b4c686 | ||
|
|
cf3f1e5440 | ||
|
|
182127bd67 | ||
|
|
3d2e6e202b | ||
|
|
3a062ee2ac | ||
|
|
5ed1d98ecc | ||
|
|
fa1dc5637e | ||
|
|
8506f5ffbf | ||
|
|
9c529512d1 | ||
|
|
88d0f7bf74 | ||
|
|
a3ff20782d | ||
|
|
88c2462fbd | ||
|
|
e28a7e5606 | ||
|
|
dfa74c5756 | ||
|
|
1c0c9dc019 | ||
|
|
801935130e | ||
|
|
8cdced5ec0 | ||
|
|
756e8840af | ||
|
|
b2db091d54 | ||
|
|
5fae0bd459 | ||
|
|
3deddf2b08 | ||
|
|
650bcda001 | ||
|
|
931fe6c22d | ||
|
|
bd4a40b0f2 | ||
|
|
31ff2773b3 | ||
|
|
8176b906df | ||
|
|
721ecce59d | ||
|
|
73b409fb88 | ||
|
|
0665764610 | ||
|
|
3faf06141f | ||
|
|
0c06401ec4 | ||
|
|
c68e48111d |
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
[](https://octowow.st/)
|
[](https://octowow.st/)
|
||||||
[](https://github.com/brues-code/ClassicAPI)
|
[](https://github.com/brues-code/ClassicAPI)
|
||||||
[](https://github.com/balakethelock/SuperWoW)
|
|
||||||
[](https://github.com/brues-code/nampower)
|
[](https://github.com/brues-code/nampower)
|
||||||
[](https://codeberg.org/konaka/UnitXP_SP3)
|
[](https://github.com/balakethelock/SuperWoW)
|
||||||
|
[](https://github.com/brues-code/UnitXP_SP3)
|
||||||
|
|
||||||
**A pfUI fork specifically optimized for ClassicAPI on [Octo WoW](https://octowow.st/) which requires Nampower and SuperWoW with optional UnitXP_SP3 DLL integration.**
|
**A pfUI fork specifically optimized for ClassicAPI on [Octo WoW](https://octowow.st/)**
|
||||||
|
|
||||||
This version includes significant performance improvements and DLL-enhanced features.
|
This version includes significant performance improvements and DLL-enhanced features.
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ This version includes significant performance improvements and DLL-enhanced feat
|
|||||||
4. Copy "pfUI" into Wow-Directory\Interface\AddOns
|
4. Copy "pfUI" into Wow-Directory\Interface\AddOns
|
||||||
5. Restart Wow
|
5. Restart Wow
|
||||||
|
|
||||||
## Optional DLL Enhancements
|
## DLL Enhancements
|
||||||
|
|
||||||
Since pfUI 6.0.0 includes integrations with client-side DLLs for enhanced functionality. These DLLs are permitted on Octo WoW:
|
Since pfUI 6.0.0 includes integrations with client-side DLLs for enhanced functionality. These DLLs are permitted on Octo WoW:
|
||||||
|
|
||||||
@@ -36,23 +36,24 @@ Provides:
|
|||||||
- Faster, safer profile sharing - Engine-side serialize/compress/base64 via C_EncodingUtil
|
- Faster, safer profile sharing - Engine-side serialize/compress/base64 via C_EncodingUtil
|
||||||
- C_Timer - After / NewTicker replacing hand-rolled OnUpdate throttles
|
- C_Timer - After / NewTicker replacing hand-rolled OnUpdate throttles
|
||||||
- Feign death, shapeshift and quest-item detection via real API calls
|
- Feign death, shapeshift and quest-item detection via real API calls
|
||||||
|
- Mouseover Unit Frames
|
||||||
|
- Click-casting
|
||||||
|
- Loot Roll History (/loothistory)
|
||||||
|
- New item highlighting
|
||||||
- Plenty other functions
|
- Plenty other functions
|
||||||
|
|
||||||
### [SuperWoW](https://github.com/balakethelock/SuperWoW)
|
|
||||||
|
|
||||||
Provides:
|
|
||||||
- UnitPosition for distance calculations
|
|
||||||
- SetMouseoverUnit for improved targeting
|
|
||||||
|
|
||||||
### [Nampower](https://github.com/brues-code/nampower)
|
### [Nampower](https://github.com/brues-code/nampower)
|
||||||
|
|
||||||
Provides:
|
Provides:
|
||||||
- Spell queue indicator
|
- Spell queue indicator
|
||||||
- GCD indicator
|
- GCD indicator
|
||||||
- Reactive spell detection
|
|
||||||
- Enhanced cast information
|
|
||||||
|
|
||||||
### [UnitXP_SP3](https://codeberg.org/konaka/UnitXP_SP3)
|
### [SuperWoW](https://github.com/balakethelock/SuperWoW)
|
||||||
|
|
||||||
|
Provides:
|
||||||
|
- Tracks party/raid units on the minimap
|
||||||
|
|
||||||
|
### [UnitXP_SP3](https://github.com/brues-code/UnitXP_SP3)
|
||||||
|
|
||||||
Provides:
|
Provides:
|
||||||
- Line of Sight detection
|
- Line of Sight detection
|
||||||
@@ -79,6 +80,7 @@ Use `/pfdll` in-game to check which DLLs are detected.
|
|||||||
/swapfocus Toggle Focus and Target-Frame
|
/swapfocus Toggle Focus and Target-Frame
|
||||||
/pftest Toggle pfUI Unitframe Test Mode
|
/pftest Toggle pfUI Unitframe Test Mode
|
||||||
/abp Addon Button Panel
|
/abp Addon Button Panel
|
||||||
|
/loothistory Show Loot Roll History
|
||||||
|
|
||||||
## Languages
|
## Languages
|
||||||
pfUI supports and contains language specific code for the following gameclients.
|
pfUI supports and contains language specific code for the following gameclients.
|
||||||
@@ -91,7 +93,7 @@ pfUI supports and contains language specific code for the following gameclients.
|
|||||||
* Russian (ruRU)
|
* Russian (ruRU)
|
||||||
|
|
||||||
## Recommended Addons
|
## Recommended Addons
|
||||||
* [pfQuest](https://shagu.org/pfQuest) A simple database and quest helper
|
* [pfQuest](https://github.com/brues-code/pfQuest) A simple database and quest helper
|
||||||
* [SuperCleveRoidMacros](https://github.com/brues-code/SuperCleveRoidMacros) Supports modern macro formats
|
* [SuperCleveRoidMacros](https://github.com/brues-code/SuperCleveRoidMacros) Supports modern macro formats
|
||||||
|
|
||||||
## Plugins
|
## Plugins
|
||||||
|
|||||||
+113
-58
@@ -64,6 +64,10 @@ end
|
|||||||
-- Requires UnitXP_SP3
|
-- Requires UnitXP_SP3
|
||||||
function pfUI.api.UnitInLineOfSight(unit1, unit2)
|
function pfUI.api.UnitInLineOfSight(unit1, unit2)
|
||||||
if not pfUI.api.HasUnitXP() then return nil end
|
if not pfUI.api.HasUnitXP() then return nil end
|
||||||
|
if not unit2 then
|
||||||
|
unit2 = unit1
|
||||||
|
unit1 = "player"
|
||||||
|
end
|
||||||
local success, inSight = pcall(UnitXP, "inSight", unit1, unit2)
|
local success, inSight = pcall(UnitXP, "inSight", unit1, unit2)
|
||||||
if success then return inSight end
|
if success then return inSight end
|
||||||
return nil
|
return nil
|
||||||
@@ -74,6 +78,10 @@ end
|
|||||||
-- Requires UnitXP_SP3
|
-- Requires UnitXP_SP3
|
||||||
function pfUI.api.UnitIsBehind(unit1, unit2)
|
function pfUI.api.UnitIsBehind(unit1, unit2)
|
||||||
if not pfUI.api.HasUnitXP() then return nil end
|
if not pfUI.api.HasUnitXP() then return nil end
|
||||||
|
if not unit2 then
|
||||||
|
unit2 = unit1
|
||||||
|
unit1 = "player"
|
||||||
|
end
|
||||||
local success, behind = pcall(UnitXP, "behind", unit1, unit2)
|
local success, behind = pcall(UnitXP, "behind", unit1, unit2)
|
||||||
if success then return behind end
|
if success then return behind end
|
||||||
return nil
|
return nil
|
||||||
@@ -84,16 +92,24 @@ gfind = string.gmatch or string.gfind
|
|||||||
mod = math.mod or mod
|
mod = math.mod or mod
|
||||||
|
|
||||||
-- [ strsplit ]
|
-- [ strsplit ]
|
||||||
-- Splits a string using a delimiter.
|
-- Splits a string using a delimiter. Self-contained on purpose: it does NOT
|
||||||
|
-- delegate to the global strsplit / string.split, because third-party addons
|
||||||
|
-- clobber those (e.g. BigWigs' SpellRequests redefines string:split to return
|
||||||
|
-- a table, which would make this return a single table instead of r,g,b,a and
|
||||||
|
-- break color/version parsing depending on load order). Delimiter chars are
|
||||||
|
-- treated as a set (any one char splits), and empty fields are preserved
|
||||||
|
-- ("a,,b" -> "a", "", "b"), matching real strsplit semantics.
|
||||||
-- 'delimiter' [string] characters that will be interpreted as delimiter
|
-- 'delimiter' [string] characters that will be interpreted as delimiter
|
||||||
-- characters (bytes) in the string.
|
-- characters (bytes) in the string.
|
||||||
-- 'subject' [string] String to split.
|
-- 'subject' [string] String to split.
|
||||||
-- return: [list] a list of strings.
|
-- return: [list] a list of strings.
|
||||||
|
local format, sgsub = string.format, string.gsub
|
||||||
function pfUI.api.strsplit(delimiter, subject)
|
function pfUI.api.strsplit(delimiter, subject)
|
||||||
if not subject then return nil end
|
if not subject then return nil end
|
||||||
local delimiter, fields = delimiter or ":", {}
|
local fields = {}
|
||||||
local pattern = string.format("([^%s]+)", delimiter)
|
delimiter = delimiter or ":"
|
||||||
string.gsub(subject, pattern, function(c) fields[table.getn(fields)+1] = c end)
|
local pattern = format("([^%s]+)", delimiter)
|
||||||
|
sgsub(subject, pattern, function(c) fields[table.getn(fields)+1] = c end)
|
||||||
return unpack(fields)
|
return unpack(fields)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -102,11 +118,7 @@ end
|
|||||||
-- 'tbl' [table] the table that shall be checked
|
-- 'tbl' [table] the table that shall be checked
|
||||||
-- return: [boolean] result of the check.
|
-- return: [boolean] result of the check.
|
||||||
function pfUI.api.isempty(tbl)
|
function pfUI.api.isempty(tbl)
|
||||||
if not tbl then return true end
|
return next(tbl or {}) == nil
|
||||||
for k, v in pairs(tbl) do
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [ checkversion ]
|
-- [ checkversion ]
|
||||||
@@ -135,7 +147,6 @@ end
|
|||||||
-- It takes care of the rangecheck module if existing.
|
-- It takes care of the rangecheck module if existing.
|
||||||
-- unit [string] A unit to query (string, unitID)
|
-- unit [string] A unit to query (string, unitID)
|
||||||
-- return: [bool] "1" if in range otherwise "nil"
|
-- return: [bool] "1" if in range otherwise "nil"
|
||||||
local RangeCache = {}
|
|
||||||
function pfUI.api.UnitInRange(unit)
|
function pfUI.api.UnitInRange(unit)
|
||||||
if not UnitExists(unit) or not UnitIsVisible(unit) then
|
if not UnitExists(unit) or not UnitIsVisible(unit) then
|
||||||
return nil
|
return nil
|
||||||
@@ -143,6 +154,11 @@ function pfUI.api.UnitInRange(unit)
|
|||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- master switch: with the 40y check off, a visible unit beyond interact
|
||||||
|
-- range counts as in range (nothing fades). Invisible units already
|
||||||
|
-- returned nil above, matching the pre-collapse behavior.
|
||||||
|
if C.unitframes.rangecheck == "0" then return 1 end
|
||||||
|
|
||||||
-- UnitXP precise mode: skip librange entirely, use direct distance check
|
-- UnitXP precise mode: skip librange entirely, use direct distance check
|
||||||
if C.unitframes.rangecheck_mode == "unitxp" and _G.UnitXP then
|
if C.unitframes.rangecheck_mode == "unitxp" and _G.UnitXP then
|
||||||
local threshold = tonumber(C.unitframes.rangecheck_distance) or 40
|
local threshold = tonumber(C.unitframes.rangecheck_distance) or 40
|
||||||
@@ -188,6 +204,12 @@ function pfUI.api.UnitHasBuff(unit, name)
|
|||||||
return C_UnitAuras.GetAuraDataBySpellName(unit, name, "HELPFUL") ~= nil or nil
|
return C_UnitAuras.GetAuraDataBySpellName(unit, name, "HELPFUL") ~= nil or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- [ IsPlayerGuid ]
|
||||||
|
-- Returns whether a GUID or unit token refers to the local player.
|
||||||
|
-- guid [string] A unit GUID (or unitID) to test.
|
||||||
|
-- return: [bool] true if it is the player otherwise "false"
|
||||||
|
pfUI.api.IsPlayerGuid = _G.IsPlayerGuid
|
||||||
|
|
||||||
-- [ GetUnbuffedRoster ]
|
-- [ GetUnbuffedRoster ]
|
||||||
-- Returns a comma-joined, colored list of group members missing the named aura.
|
-- Returns a comma-joined, colored list of group members missing the named aura.
|
||||||
-- name [string] the localized aura name to check for
|
-- name [string] the localized aura name to check for
|
||||||
@@ -215,7 +237,7 @@ end
|
|||||||
-- unit [string] the unitstring
|
-- unit [string] the unitstring
|
||||||
-- return: [table] string, r, g, b
|
-- return: [table] string, r, g, b
|
||||||
function pfUI.api.GetUnitColor(unitstr)
|
function pfUI.api.GetUnitColor(unitstr)
|
||||||
local _, class = UnitClass(unitstr)
|
local class = UnitClassBase(unitstr)
|
||||||
local classColor = PFUI_CLASS_COLORS[class]
|
local classColor = PFUI_CLASS_COLORS[class]
|
||||||
return classColor:GenerateHexColorMarkup(), classColor:GetRGB()
|
return classColor:GenerateHexColorMarkup(), classColor:GetRGB()
|
||||||
end
|
end
|
||||||
@@ -266,11 +288,7 @@ end
|
|||||||
-- 'f' [float] the number to breakdown.
|
-- 'f' [float] the number to breakdown.
|
||||||
-- returns: [int],[float] whole and fractional part.
|
-- returns: [int],[float] whole and fractional part.
|
||||||
function pfUI.api.modf(f)
|
function pfUI.api.modf(f)
|
||||||
if modf then return modf(f) end
|
return math.modf(f)
|
||||||
if f > 0 then
|
|
||||||
return math.floor(f), mod(f,1)
|
|
||||||
end
|
|
||||||
return math.ceil(f), mod(f,1)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [ GetServerEpoch ]
|
-- [ GetServerEpoch ]
|
||||||
@@ -365,36 +383,53 @@ end
|
|||||||
-- 'str' [string] input string that should be matched
|
-- 'str' [string] input string that should be matched
|
||||||
-- 'pat' [string] unformatted pattern
|
-- 'pat' [string] unformatted pattern
|
||||||
-- returns: [strings] matched string in capture order
|
-- returns: [strings] matched string in capture order
|
||||||
local a, b, c, d, e
|
|
||||||
local _, va, vb, vc, vd, ve
|
|
||||||
local ra, rb, rc, rd, re
|
|
||||||
function pfUI.api.cmatch(str, pat)
|
function pfUI.api.cmatch(str, pat)
|
||||||
-- read capture indexes
|
-- idx* = the logical %N index of each physical capture slot (nil when the
|
||||||
a, b, c, d, e = GetCaptures(pat)
|
-- pattern has no %N$ markers); val* = the matched values in physical order.
|
||||||
_, _, va, vb, vc, vd, ve = string.find(str, pfUI.api.SanitizePattern(pat))
|
local idx1, idx2, idx3, idx4, idx5 = GetCaptures(pat)
|
||||||
|
local _, _, val1, val2, val3, val4, val5 = string.find(str, pfUI.api.SanitizePattern(pat))
|
||||||
|
|
||||||
-- put entries into the proper return values
|
-- reorder the physical matches into logical (%1..%5) order
|
||||||
ra = e == 1 and ve or d == 1 and vd or c == 1 and vc or b == 1 and vb or va
|
local out1 = idx5 == 1 and val5 or idx4 == 1 and val4 or idx3 == 1 and val3 or idx2 == 1 and val2 or val1
|
||||||
rb = e == 2 and ve or d == 2 and vd or c == 2 and vc or a == 2 and va or vb
|
local out2 = idx5 == 2 and val5 or idx4 == 2 and val4 or idx3 == 2 and val3 or idx1 == 2 and val1 or val2
|
||||||
rc = e == 3 and ve or d == 3 and vd or a == 3 and va or b == 3 and vb or vc
|
local out3 = idx5 == 3 and val5 or idx4 == 3 and val4 or idx1 == 3 and val1 or idx2 == 3 and val2 or val3
|
||||||
rd = e == 4 and ve or a == 4 and va or c == 4 and vc or b == 4 and vb or vd
|
local out4 = idx5 == 4 and val5 or idx1 == 4 and val1 or idx3 == 4 and val3 or idx2 == 4 and val2 or val4
|
||||||
re = a == 5 and va or d == 5 and vd or c == 5 and vc or b == 5 and vb or ve
|
local out5 = idx1 == 5 and val1 or idx4 == 5 and val4 or idx3 == 5 and val3 or idx2 == 5 and val2 or val5
|
||||||
|
|
||||||
return ra, rb, rc, rd, re
|
return out1, out2, out3, out4, out5
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [ GetItemLinkByName ]
|
-- [ GetItemLinkByName ]
|
||||||
-- Returns an itemLink for the given itemname
|
-- Returns an itemLink for the given itemname
|
||||||
-- 'name' [string] name of the item
|
-- 'name' [string] name of the item
|
||||||
-- returns: [string] entire itemLink for the given item
|
-- returns: [string] entire itemLink for the given item
|
||||||
|
local itemLinkCache = {}
|
||||||
|
local itemLinkMisses = {}
|
||||||
|
local ITEMLINK_MAX_SCANS = 2
|
||||||
function pfUI.api.GetItemLinkByName(name)
|
function pfUI.api.GetItemLinkByName(name)
|
||||||
for itemID = 1, 25818 do
|
-- GetInboxItem() hands us a nil name for attachment-less mail
|
||||||
local itemName, hyperLink, itemQuality = GetItemInfo(itemID)
|
if not name then return end
|
||||||
if (itemName and itemName == name) then
|
-- cache successful resolutions so repeated lookups (e.g. per inbox click) are free
|
||||||
local _, _, _, hex = GetItemQualityColor(tonumber(itemQuality))
|
if itemLinkCache[name] then return itemLinkCache[name] end
|
||||||
return hex.. "|H"..hyperLink.."|h["..itemName.."]|h|r"
|
|
||||||
|
-- Failures have to be counted, not just retried. An unresolvable name walks
|
||||||
|
-- the entire id range and finds nothing -- a visible hitch on every tooltip
|
||||||
|
-- hover. Allow a couple of attempts (rendering the tooltip caches the item,
|
||||||
|
-- so the next hover usually resolves), then stop scanning for that name.
|
||||||
|
local misses = itemLinkMisses[name] or 0
|
||||||
|
if misses >= ITEMLINK_MAX_SCANS then return end
|
||||||
|
|
||||||
|
-- Octo/Turtle custom items live well past the 25818 vanilla ceiling
|
||||||
|
for itemID = 1, 61000 do
|
||||||
|
local itemName = C_Item.GetItemNameByID(itemID)
|
||||||
|
if itemName and itemName == name then
|
||||||
|
local _, itemLink = C_Item.GetItemInfo(itemID)
|
||||||
|
itemLinkCache[name] = itemLink
|
||||||
|
return itemLink
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
itemLinkMisses[name] = misses + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [ FindItem ]
|
-- [ FindItem ]
|
||||||
@@ -636,6 +671,10 @@ end
|
|||||||
function pfUI.api.CreateGoldString(money)
|
function pfUI.api.CreateGoldString(money)
|
||||||
if type(money) ~= "number" then return "-" end
|
if type(money) ~= "number" then return "-" end
|
||||||
|
|
||||||
|
if _G.GetCoinTextureString then
|
||||||
|
return "|cffffffff" .. _G.GetCoinTextureString(money) .. "|r"
|
||||||
|
end
|
||||||
|
|
||||||
local gold = floor(money/ 100 / 100)
|
local gold = floor(money/ 100 / 100)
|
||||||
local silver = floor(mod((money/100),100))
|
local silver = floor(mod((money/100),100))
|
||||||
local copper = floor(mod(money,100))
|
local copper = floor(mod(money,100))
|
||||||
@@ -719,24 +758,15 @@ function pfUI.api.CopyTable(src)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- [ Wipe Table ]
|
-- [ Wipe Table ]
|
||||||
-- Empties a table and returns it
|
-- Empties a table and returns it.
|
||||||
-- 'src' [table] the table that should be emptied.
|
-- 'src' [table] the table that should be emptied.
|
||||||
-- return: [table] the emptied table.
|
-- return: [table] the emptied table.
|
||||||
|
-- Delegates to ClassicAPI's table.wipe, which also resets the Lua 5.0 getn
|
||||||
|
-- length (luaL_setn(t,0)) so table.insert on a wiped table resumes at [1].
|
||||||
|
-- Append to wiped arrays with table.insert -- NOT the t[table.getn(t)+1]=v
|
||||||
|
-- idiom, which needs an unmanaged length counter and won't work here.
|
||||||
function pfUI.api.wipe(src)
|
function pfUI.api.wipe(src)
|
||||||
-- notes: table.insert, table.remove will have undefined behavior
|
return table.wipe(src)
|
||||||
-- when used on tables emptied this way because Lua removes nil
|
|
||||||
-- entries from tables after an indeterminate time.
|
|
||||||
-- Instead of table.insert(t,v) use t[table.getn(t)+1]=v as table.getn collapses nil entries.
|
|
||||||
-- There are no issues with hash tables, t[k]=v where k is not a number behaves as expected.
|
|
||||||
local mt = getmetatable(src) or {}
|
|
||||||
if mt.__mode == nil or mt.__mode ~= "kv" then
|
|
||||||
mt.__mode = "kv"
|
|
||||||
src=setmetatable(src,mt)
|
|
||||||
end
|
|
||||||
for k in pairs(src) do
|
|
||||||
src[k] = nil
|
|
||||||
end
|
|
||||||
return src
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- [ Load Movable ]
|
-- [ Load Movable ]
|
||||||
@@ -994,16 +1024,34 @@ end
|
|||||||
|
|
||||||
-- [ GetStringColor ]
|
-- [ GetStringColor ]
|
||||||
-- Queries the pfUI setting strings and extract its color codes
|
-- Queries the pfUI setting strings and extract its color codes
|
||||||
-- returns r,g,b,a
|
-- returns r,g,b,a as strings
|
||||||
local color_cache = {}
|
local color_cache = setmetatable({}, {
|
||||||
function pfUI.api.GetStringColor(colorstr)
|
__index = function(t, k)
|
||||||
if not color_cache[colorstr] then
|
local color = { pfUI.api.strsplit(",", k) }
|
||||||
local r, g, b, a = pfUI.api.strsplit(",", colorstr)
|
rawset(t, k, color)
|
||||||
color_cache[colorstr] = { r, g, b, a }
|
return color
|
||||||
end
|
end
|
||||||
|
})
|
||||||
|
function pfUI.api.GetStringColor(colorstr)
|
||||||
return unpack(color_cache[colorstr])
|
return unpack(color_cache[colorstr])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- [ GetStringColorObject ]
|
||||||
|
-- Like GetStringColor, but returns a cached ColorMixin instead of raw values.
|
||||||
|
-- The object is a shared per-string singleton, so treat it as read-only.
|
||||||
|
-- returns a ColorMixin
|
||||||
|
local color_object_cache = setmetatable({}, {
|
||||||
|
__index = function(t, k)
|
||||||
|
local r,g,b,a = pfUI.api.GetStringColor(k)
|
||||||
|
local color = CreateColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
rawset(t, k, color)
|
||||||
|
return color
|
||||||
|
end
|
||||||
|
})
|
||||||
|
function pfUI.api.GetStringColorObject(colorstr)
|
||||||
|
return color_object_cache[colorstr]
|
||||||
|
end
|
||||||
|
|
||||||
-- [ rgbhex ]
|
-- [ rgbhex ]
|
||||||
-- Returns color format from color info
|
-- Returns color format from color info
|
||||||
-- 'r' [table | number] color table or r color component
|
-- 'r' [table | number] color table or r color component
|
||||||
@@ -1011,12 +1059,13 @@ end
|
|||||||
-- 'b' [number] optional b color component
|
-- 'b' [number] optional b color component
|
||||||
-- 'a' [number] optional alpha component
|
-- 'a' [number] optional alpha component
|
||||||
-- returns color string in the form of '|caarrggbb'
|
-- returns color string in the form of '|caarrggbb'
|
||||||
local _r, _g, _b, _a
|
local rgbhex_cache = {}
|
||||||
function pfUI.api.rgbhex(r, g, b, a)
|
function pfUI.api.rgbhex(r, g, b, a)
|
||||||
|
local _r, _g, _b, _a
|
||||||
if type(r) == "table" then
|
if type(r) == "table" then
|
||||||
if r.r then
|
if r.r then
|
||||||
_r, _g, _b, _a = r.r, r.g, r.b, (r.a or 1)
|
_r, _g, _b, _a = r.r, r.g, r.b, (r.a or 1)
|
||||||
elseif table.getn(r) >= 3 then
|
elseif r[3] ~= nil then
|
||||||
_r, _g, _b, _a = r[1], r[2], r[3], (r[4] or 1)
|
_r, _g, _b, _a = r[1], r[2], r[3], (r[4] or 1)
|
||||||
end
|
end
|
||||||
elseif tonumber(r) then
|
elseif tonumber(r) then
|
||||||
@@ -1024,7 +1073,13 @@ function pfUI.api.rgbhex(r, g, b, a)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if _r and _g and _b and _a then
|
if _r and _g and _b and _a then
|
||||||
return CreateColor(_r, _g, _b, _a):GenerateHexColorMarkup()
|
local key = ((Round(_r*255)*256 + Round(_g*255))*256 + Round(_b*255))*256 + Round(_a*255)
|
||||||
|
local hex = rgbhex_cache[key]
|
||||||
|
if not hex then
|
||||||
|
hex = "|c" .. C_ColorUtil.GenerateTextColorCode({ r = _r, g = _g, b = _b, a = _a })
|
||||||
|
rgbhex_cache[key] = hex
|
||||||
|
end
|
||||||
|
return hex
|
||||||
end
|
end
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
+36
-10
@@ -155,6 +155,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("appearance", "cd", "dynamicsize", "1")
|
pfUI:UpdateConfig("appearance", "cd", "dynamicsize", "1")
|
||||||
pfUI:UpdateConfig("appearance", "castbar", "castbarcolor", ".7,.7,.9,.8")
|
pfUI:UpdateConfig("appearance", "castbar", "castbarcolor", ".7,.7,.9,.8")
|
||||||
pfUI:UpdateConfig("appearance", "castbar", "channelcolor", ".9,.9,.7,.8")
|
pfUI:UpdateConfig("appearance", "castbar", "channelcolor", ".9,.9,.7,.8")
|
||||||
|
pfUI:UpdateConfig("appearance", "castbar", "failcolor", "1,.2,.2,.8")
|
||||||
pfUI:UpdateConfig("appearance", "castbar", "texture", "Interface\\AddOns\\pfUI\\img\\bar")
|
pfUI:UpdateConfig("appearance", "castbar", "texture", "Interface\\AddOns\\pfUI\\img\\bar")
|
||||||
pfUI:UpdateConfig("appearance", "infight", "screen", "0")
|
pfUI:UpdateConfig("appearance", "infight", "screen", "0")
|
||||||
pfUI:UpdateConfig("appearance", "infight", "aggro", "0")
|
pfUI:UpdateConfig("appearance", "infight", "aggro", "0")
|
||||||
@@ -162,6 +163,8 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("appearance", "infight", "intensity", "16")
|
pfUI:UpdateConfig("appearance", "infight", "intensity", "16")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "unusable", "1")
|
pfUI:UpdateConfig("appearance", "bags", "unusable", "1")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "unusable_color", ".9,.2,.2,1")
|
pfUI:UpdateConfig("appearance", "bags", "unusable_color", ".9,.2,.2,1")
|
||||||
|
pfUI:UpdateConfig("appearance", "bags", "newitem", "1")
|
||||||
|
pfUI:UpdateConfig("appearance", "bags", "newitem_color", "1,1,1,1")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "borderlimit", "1")
|
pfUI:UpdateConfig("appearance", "bags", "borderlimit", "1")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "borderonlygear", "0")
|
pfUI:UpdateConfig("appearance", "bags", "borderonlygear", "0")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "fulltext", "1")
|
pfUI:UpdateConfig("appearance", "bags", "fulltext", "1")
|
||||||
@@ -172,6 +175,8 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("appearance", "bags", "bagrowlength", "10")
|
pfUI:UpdateConfig("appearance", "bags", "bagrowlength", "10")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "bankrowlength", "10")
|
pfUI:UpdateConfig("appearance", "bags", "bankrowlength", "10")
|
||||||
pfUI:UpdateConfig("appearance", "bags", "autoSortOnOpen", "0")
|
pfUI:UpdateConfig("appearance", "bags", "autoSortOnOpen", "0")
|
||||||
|
pfUI:UpdateConfig("appearance", "bags", "sortreverse", "0")
|
||||||
|
pfUI:UpdateConfig("appearance", "bags", "sortprioreverse", "0")
|
||||||
pfUI:UpdateConfig("appearance", "minimap", "size", "140")
|
pfUI:UpdateConfig("appearance", "minimap", "size", "140")
|
||||||
pfUI:UpdateConfig("appearance", "minimap", "arrowscale", "1")
|
pfUI:UpdateConfig("appearance", "minimap", "arrowscale", "1")
|
||||||
pfUI:UpdateConfig("appearance", "minimap", "zonetext", "off")
|
pfUI:UpdateConfig("appearance", "minimap", "zonetext", "off")
|
||||||
@@ -229,8 +234,8 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("unitframes", nil, "druidmanaoffy", "0")
|
pfUI:UpdateConfig("unitframes", nil, "druidmanaoffy", "0")
|
||||||
pfUI:UpdateConfig("unitframes", nil, "druidmanaspace", "-3")
|
pfUI:UpdateConfig("unitframes", nil, "druidmanaspace", "-3")
|
||||||
pfUI:UpdateConfig("unitframes", nil, "druidmanatexture", "Interface\\AddOns\\pfUI\\img\\bar")
|
pfUI:UpdateConfig("unitframes", nil, "druidmanatexture", "Interface\\AddOns\\pfUI\\img\\bar")
|
||||||
|
pfUI:UpdateConfig("unitframes", nil, "druidmanatext", "1")
|
||||||
|
|
||||||
pfUI:UpdateConfig("unitframes", nil, "rangechecki", "4")
|
|
||||||
pfUI:UpdateConfig("unitframes", nil, "combowidth", "6")
|
pfUI:UpdateConfig("unitframes", nil, "combowidth", "6")
|
||||||
pfUI:UpdateConfig("unitframes", nil, "comboheight", "6")
|
pfUI:UpdateConfig("unitframes", nil, "comboheight", "6")
|
||||||
pfUI:UpdateConfig("unitframes", nil, "swingtimerwidth", "200")
|
pfUI:UpdateConfig("unitframes", nil, "swingtimerwidth", "200")
|
||||||
@@ -381,6 +386,27 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("unitframes", "grouppet", "glowcombat", "0")
|
pfUI:UpdateConfig("unitframes", "grouppet", "glowcombat", "0")
|
||||||
pfUI:UpdateConfig("unitframes", "grouppet", "txthpright", "healthperc")
|
pfUI:UpdateConfig("unitframes", "grouppet", "txthpright", "healthperc")
|
||||||
|
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "portrait", "off")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "width", "50")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "height", "14")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "pheight", "0")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "buffs", "off")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "buffsize", "16")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "debuffs", "off")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "debuffsize", "16")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "faderange", "1")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "glowcombat", "0")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "txthpright", "healthperc")
|
||||||
|
-- off by default; mirrors the raid grid layout when enabled
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "visible", "0")
|
||||||
|
-- collapse: pack only pets that exist (from the roster snapshot) instead
|
||||||
|
-- of mirroring every raid slot
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "collapse", "1")
|
||||||
|
-- pet block has its own layout, independent of the raid grid
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "raidlayout", "8x5")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "raidpadding", "3")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raidpet", "raidfill", "VERTICAL")
|
||||||
|
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "portrait", "off")
|
pfUI:UpdateConfig("unitframes", "raid", "portrait", "off")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "width", "50")
|
pfUI:UpdateConfig("unitframes", "raid", "width", "50")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "height", "26")
|
pfUI:UpdateConfig("unitframes", "raid", "height", "26")
|
||||||
@@ -399,6 +425,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("unitframes", "raid", "raidlayout", "8x5")
|
pfUI:UpdateConfig("unitframes", "raid", "raidlayout", "8x5")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "raidpadding", "3")
|
pfUI:UpdateConfig("unitframes", "raid", "raidpadding", "3")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "raidfill", "VERTICAL")
|
pfUI:UpdateConfig("unitframes", "raid", "raidfill", "VERTICAL")
|
||||||
|
pfUI:UpdateConfig("unitframes", "raid", "collapse", "0")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "raidgrouplabel", "0")
|
pfUI:UpdateConfig("unitframes", "raid", "raidgrouplabel", "0")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "grouplabelxoff", "0")
|
pfUI:UpdateConfig("unitframes", "raid", "grouplabelxoff", "0")
|
||||||
pfUI:UpdateConfig("unitframes", "raid", "grouplabelyoff", "8")
|
pfUI:UpdateConfig("unitframes", "raid", "grouplabelyoff", "8")
|
||||||
@@ -454,7 +481,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("unitframes", "ptarget", "txthpright", "none")
|
pfUI:UpdateConfig("unitframes", "ptarget", "txthpright", "none")
|
||||||
pfUI:UpdateConfig("unitframes", "ptarget", "overhealperc", "10")
|
pfUI:UpdateConfig("unitframes", "ptarget", "overhealperc", "10")
|
||||||
|
|
||||||
local ufs = { "player", "target", "focus", "focustarget", "group", "grouptarget", "grouppet", "raid", "ttarget", "pet", "ptarget", "fallback", "tttarget" }
|
local ufs = { "player", "target", "focus", "focustarget", "group", "grouptarget", "grouppet", "raid", "raidpet", "ttarget", "pet", "ptarget", "fallback", "tttarget" }
|
||||||
for _, unit in pairs(ufs) do
|
for _, unit in pairs(ufs) do
|
||||||
pfUI:UpdateConfig("unitframes", unit, "selfdebuff", "0")
|
pfUI:UpdateConfig("unitframes", unit, "selfdebuff", "0")
|
||||||
pfUI:UpdateConfig("unitframes", unit, "visible", "1")
|
pfUI:UpdateConfig("unitframes", unit, "visible", "1")
|
||||||
@@ -527,7 +554,6 @@ function pfUI:LoadConfig()
|
|||||||
|
|
||||||
pfUI:UpdateConfig("unitframes", unit, "glowaggro", "1")
|
pfUI:UpdateConfig("unitframes", unit, "glowaggro", "1")
|
||||||
pfUI:UpdateConfig("unitframes", unit, "glowcombat", "1")
|
pfUI:UpdateConfig("unitframes", unit, "glowcombat", "1")
|
||||||
pfUI:UpdateConfig("unitframes", unit, "showtooltip", "1")
|
|
||||||
pfUI:UpdateConfig("unitframes", unit, "healthcolor", "1")
|
pfUI:UpdateConfig("unitframes", unit, "healthcolor", "1")
|
||||||
pfUI:UpdateConfig("unitframes", unit, "powercolor", "1")
|
pfUI:UpdateConfig("unitframes", unit, "powercolor", "1")
|
||||||
pfUI:UpdateConfig("unitframes", unit, "levelcolor", "1")
|
pfUI:UpdateConfig("unitframes", unit, "levelcolor", "1")
|
||||||
@@ -626,6 +652,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("bars", nil, "pagemastershift", "0")
|
pfUI:UpdateConfig("bars", nil, "pagemastershift", "0")
|
||||||
pfUI:UpdateConfig("bars", nil, "pagemasterctrl", "0")
|
pfUI:UpdateConfig("bars", nil, "pagemasterctrl", "0")
|
||||||
pfUI:UpdateConfig("bars", nil, "druidstealth", "0")
|
pfUI:UpdateConfig("bars", nil, "druidstealth", "0")
|
||||||
|
pfUI:UpdateConfig("bars", nil, "priestshadow", "0")
|
||||||
pfUI:UpdateConfig("bars", nil, "showcastable", "1")
|
pfUI:UpdateConfig("bars", nil, "showcastable", "1")
|
||||||
pfUI:UpdateConfig("bars", nil, "glowrange", "1")
|
pfUI:UpdateConfig("bars", nil, "glowrange", "1")
|
||||||
pfUI:UpdateConfig("bars", nil, "rangecolor", "1,0.1,0.1,1")
|
pfUI:UpdateConfig("bars", nil, "rangecolor", "1,0.1,0.1,1")
|
||||||
@@ -757,6 +784,10 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("tooltip", nil, "extguild", "1")
|
pfUI:UpdateConfig("tooltip", nil, "extguild", "1")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "itemid", "0")
|
pfUI:UpdateConfig("tooltip", nil, "itemid", "0")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "movespeed", "0")
|
pfUI:UpdateConfig("tooltip", nil, "movespeed", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "aurasource", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "spellid", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "unitid", "0")
|
||||||
|
pfUI:UpdateConfig("tooltip", nil, "showbuffs", "0")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "alpha", "0.8")
|
pfUI:UpdateConfig("tooltip", nil, "alpha", "0.8")
|
||||||
pfUI:UpdateConfig("tooltip", nil, "alwaysperc", "0")
|
pfUI:UpdateConfig("tooltip", nil, "alwaysperc", "0")
|
||||||
pfUI:UpdateConfig("tooltip", "compare", "basestats", "1")
|
pfUI:UpdateConfig("tooltip", "compare", "basestats", "1")
|
||||||
@@ -927,6 +958,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("questlog", nil, "showQuestLevels", "0")
|
pfUI:UpdateConfig("questlog", nil, "showQuestLevels", "0")
|
||||||
|
|
||||||
pfUI:UpdateConfig("character", "inventory", "durability", "1")
|
pfUI:UpdateConfig("character", "inventory", "durability", "1")
|
||||||
|
pfUI:UpdateConfig("character", "inventory", "equipflyout", "0")
|
||||||
pfUI:UpdateConfig("character", "reputation", "repRequired", "1")
|
pfUI:UpdateConfig("character", "reputation", "repRequired", "1")
|
||||||
pfUI:UpdateConfig("thirdparty", nil, "chatbg", "1")
|
pfUI:UpdateConfig("thirdparty", nil, "chatbg", "1")
|
||||||
pfUI:UpdateConfig("thirdparty", nil, "showmeter", "0")
|
pfUI:UpdateConfig("thirdparty", nil, "showmeter", "0")
|
||||||
@@ -934,6 +966,7 @@ function pfUI:LoadConfig()
|
|||||||
pfUI:UpdateConfig("thirdparty", "dpsmate", "dock", "0")
|
pfUI:UpdateConfig("thirdparty", "dpsmate", "dock", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "shagudps", "skin", "0")
|
pfUI:UpdateConfig("thirdparty", "shagudps", "skin", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "shagudps", "dock", "0")
|
pfUI:UpdateConfig("thirdparty", "shagudps", "dock", "0")
|
||||||
|
pfUI:UpdateConfig("thirdparty", "greedmeter", "dock", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "swstats", "skin", "0")
|
pfUI:UpdateConfig("thirdparty", "swstats", "skin", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "swstats", "dock", "0")
|
pfUI:UpdateConfig("thirdparty", "swstats", "dock", "0")
|
||||||
pfUI:UpdateConfig("thirdparty", "ktm", "skin", "0")
|
pfUI:UpdateConfig("thirdparty", "ktm", "skin", "0")
|
||||||
@@ -1107,13 +1140,6 @@ function pfUI:MigrateConfig()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- migrating rangecheck interval (> 3.2.2)
|
|
||||||
if checkversion(3, 2, 2) then
|
|
||||||
if tonumber(pfUI_config.unitframes.rangechecki) <= 1 then
|
|
||||||
pfUI_config.unitframes.rangechecki = "2"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- migrating legacy buff/debuff naming (> 3.5.0)
|
-- migrating legacy buff/debuff naming (> 3.5.0)
|
||||||
if checkversion(3, 5, 0) then
|
if checkversion(3, 5, 0) then
|
||||||
local unitframes = { "player", "target", "focus", "group", "grouptarget", "grouppet", "raid", "ttarget", "pet", "ptarget", "fallback" }
|
local unitframes = { "player", "target", "focus", "group", "grouptarget", "grouppet", "raid", "ttarget", "pet", "ptarget", "fallback" }
|
||||||
|
|||||||
+270
-59
@@ -21,8 +21,7 @@ do -- statusbars
|
|||||||
|
|
||||||
local handlers = {
|
local handlers = {
|
||||||
["DisplayValue"] = function(self, val)
|
["DisplayValue"] = function(self, val)
|
||||||
val = val > self.max and self.max or val
|
val = Clamp(val, self.min, self.max)
|
||||||
val = val < self.min and self.min or val
|
|
||||||
|
|
||||||
-- remove animation queue
|
-- remove animation queue
|
||||||
if val == self.val_ then
|
if val == self.val_ then
|
||||||
@@ -38,8 +37,7 @@ do -- statusbars
|
|||||||
point = height / (self.max - self.min) * (val - self.min)
|
point = height / (self.max - self.min) * (val - self.min)
|
||||||
|
|
||||||
-- keep values in limits
|
-- keep values in limits
|
||||||
point = math.min(height, point)
|
point = Clamp(point, 0, height)
|
||||||
point = math.max(0, point)
|
|
||||||
|
|
||||||
-- set point to zero if value and max is zero
|
-- set point to zero if value and max is zero
|
||||||
if val == 0 then point = 0 end
|
if val == 0 then point = 0 end
|
||||||
@@ -57,8 +55,7 @@ do -- statusbars
|
|||||||
point = width / (self.max - self.min) * (val - self.min)
|
point = width / (self.max - self.min) * (val - self.min)
|
||||||
|
|
||||||
-- keep values in limits
|
-- keep values in limits
|
||||||
point = math.min(width, point)
|
point = Clamp(point, 0, width)
|
||||||
point = math.max(0, point)
|
|
||||||
|
|
||||||
-- set point to zero if value and max is zero
|
-- set point to zero if value and max is zero
|
||||||
if val == 0 then point = 0 end
|
if val == 0 then point = 0 end
|
||||||
@@ -138,15 +135,8 @@ do -- statusbars
|
|||||||
end
|
end
|
||||||
|
|
||||||
do -- dropdown
|
do -- dropdown
|
||||||
local _, class = UnitClass("player")
|
|
||||||
local color = PFUI_CLASS_COLORS[class]
|
|
||||||
|
|
||||||
local function ListEntryOnShow()
|
local function ListEntryOnShow()
|
||||||
if this.parent.id == this.id then
|
this.icon:SetShown(this.parent.id == this.id)
|
||||||
this.icon:Show()
|
|
||||||
else
|
|
||||||
this.icon:Hide()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ListEntryOnClick()
|
local function ListEntryOnClick()
|
||||||
@@ -288,8 +278,7 @@ do -- dropdown
|
|||||||
|
|
||||||
frame.icon = frame:CreateTexture(nil, "OVERLAY")
|
frame.icon = frame:CreateTexture(nil, "OVERLAY")
|
||||||
frame.icon:SetPoint("RIGHT", frame, "RIGHT", -2, 0)
|
frame.icon:SetPoint("RIGHT", frame, "RIGHT", -2, 0)
|
||||||
frame.icon:SetHeight(16)
|
frame.icon:SetSize(16, 16)
|
||||||
frame.icon:SetWidth(16)
|
|
||||||
frame.icon:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
frame.icon:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
|
||||||
|
|
||||||
frame.text = frame:CreateFontString(nil, "OVERLAY")
|
frame.text = frame:CreateFontString(nil, "OVERLAY")
|
||||||
@@ -329,8 +318,7 @@ do -- dropdown
|
|||||||
|
|
||||||
local button = CreateFrame("Button", nil, frame)
|
local button = CreateFrame("Button", nil, frame)
|
||||||
button:SetPoint("RIGHT", frame, "RIGHT", -2, 0)
|
button:SetPoint("RIGHT", frame, "RIGHT", -2, 0)
|
||||||
button:SetWidth(16)
|
button:SetSize(16, 16)
|
||||||
button:SetHeight(16)
|
|
||||||
button:SetScript("OnClick", ListButtonOnClick)
|
button:SetScript("OnClick", ListButtonOnClick)
|
||||||
SkinArrowButton(button, "down")
|
SkinArrowButton(button, "down")
|
||||||
button.icon:SetVertexColor(1,.9,.1)
|
button.icon:SetVertexColor(1,.9,.1)
|
||||||
@@ -380,8 +368,7 @@ function pfUI.api.CreateTabChild(self, title, bwidth, bheight, bottom, static)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- set dimensions
|
-- set dimensions
|
||||||
b:SetHeight(button_height)
|
b:SetSize(button_width, button_height)
|
||||||
b:SetWidth(button_width)
|
|
||||||
b:SetID(childcount)
|
b:SetID(childcount)
|
||||||
|
|
||||||
if not self.align or self.align == "LEFT" then
|
if not self.align or self.align == "LEFT" then
|
||||||
@@ -516,13 +503,7 @@ function pfUI.api.CreateScrollFrame(name, parent)
|
|||||||
local max = f:GetVerticalScrollRange()
|
local max = f:GetVerticalScrollRange()
|
||||||
local new = current - step
|
local new = current - step
|
||||||
|
|
||||||
if new >= max then
|
f:SetVerticalScroll(Clamp(new, 0, max))
|
||||||
f:SetVerticalScroll(max)
|
|
||||||
elseif new <= 0 then
|
|
||||||
f:SetVerticalScroll(0)
|
|
||||||
else
|
|
||||||
f:SetVerticalScroll(new)
|
|
||||||
end
|
|
||||||
|
|
||||||
f:UpdateScrollState()
|
f:UpdateScrollState()
|
||||||
end
|
end
|
||||||
@@ -539,8 +520,7 @@ function pfUI.api.CreateScrollChild(name, parent)
|
|||||||
local f = CreateFrame("Frame", name, parent)
|
local f = CreateFrame("Frame", name, parent)
|
||||||
|
|
||||||
-- dummy values required
|
-- dummy values required
|
||||||
f:SetWidth(1)
|
f:SetSize(1, 1)
|
||||||
f:SetHeight(1)
|
|
||||||
f:SetAllPoints(parent)
|
f:SetAllPoints(parent)
|
||||||
|
|
||||||
parent:SetScrollChild(f)
|
parent:SetScrollChild(f)
|
||||||
@@ -607,8 +587,7 @@ end
|
|||||||
function pfUI.api.SetHighlight(frame, cr, cg, cb)
|
function pfUI.api.SetHighlight(frame, cr, cg, cb)
|
||||||
if not frame then return end
|
if not frame then return end
|
||||||
if not cr or not cg or not cb then
|
if not cr or not cg or not cb then
|
||||||
local _, class = UnitClass("player")
|
cr, cg, cb = PFUI_CLASS_COLORS[UnitClassBase('player')]:GetRGB()
|
||||||
cr, cg, cb = GetClassColor(class)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
frame.cr, frame.cg, frame.cb = cr, cg, cb, ca
|
frame.cr, frame.cg, frame.cb = cr, cg, cb, ca
|
||||||
@@ -653,8 +632,7 @@ function pfUI.api.SkinButton(button, cr, cg, cb, icon, disableHighlight)
|
|||||||
if not b then b = button end
|
if not b then b = button end
|
||||||
if not b then return end
|
if not b then return end
|
||||||
if not cr or not cg or not cb then
|
if not cr or not cg or not cb then
|
||||||
local _, class = UnitClass("player")
|
cr, cg, cb = PFUI_CLASS_COLORS[UnitClassBase('player')]:GetRGB()
|
||||||
cr, cg, cb = GetClassColor(class)
|
|
||||||
end
|
end
|
||||||
pfUI.api.CreateBackdrop(b, nil, true)
|
pfUI.api.CreateBackdrop(b, nil, true)
|
||||||
b:SetNormalTexture("")
|
b:SetNormalTexture("")
|
||||||
@@ -702,8 +680,7 @@ function pfUI.api.SkinCollapseButton(button, all)
|
|||||||
|
|
||||||
b.icon = _G[name] or CreateFrame("Button", name, b)
|
b.icon = _G[name] or CreateFrame("Button", name, b)
|
||||||
if all then size = 14 end
|
if all then size = 14 end
|
||||||
b.icon:SetWidth(size)
|
b.icon:SetSize(size, size)
|
||||||
b.icon:SetHeight(size)
|
|
||||||
b.icon:SetPoint("LEFT", 2, 2)
|
b.icon:SetPoint("LEFT", 2, 2)
|
||||||
CreateBackdrop(b.icon)
|
CreateBackdrop(b.icon)
|
||||||
b.icon.text = b.icon:CreateFontString(nil, "OVERLAY")
|
b.icon.text = b.icon:CreateFontString(nil, "OVERLAY")
|
||||||
@@ -732,12 +709,10 @@ end
|
|||||||
function pfUI.api.SkinRotateButton(button)
|
function pfUI.api.SkinRotateButton(button)
|
||||||
pfUI.api.CreateBackdrop(button)
|
pfUI.api.CreateBackdrop(button)
|
||||||
|
|
||||||
local _, class = UnitClass("player")
|
local cr, cg, cb = PFUI_CLASS_COLORS[UnitClassBase('player')]:GetRGB()
|
||||||
local color = PFUI_CLASS_COLORS[class]
|
|
||||||
local cr, cg, cb = color.r , color.g, color.b
|
|
||||||
|
|
||||||
button:SetWidth(button:GetWidth() - 18)
|
local btnW, btnH = button:GetSize()
|
||||||
button:SetHeight(button:GetHeight() - 18)
|
button:SetSize(btnW - 18, btnH - 18)
|
||||||
|
|
||||||
button:GetNormalTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65)
|
button:GetNormalTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65)
|
||||||
button:GetPushedTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65)
|
button:GetPushedTexture():SetTexCoord(0.3, 0.29, 0.3, 0.65, 0.69, 0.29, 0.69, 0.65)
|
||||||
@@ -759,8 +734,7 @@ function pfUI.api.SkinCloseButton(button, parentFrame, offsetX, offsetY)
|
|||||||
|
|
||||||
SkinButton(button, 1, .25, .25)
|
SkinButton(button, 1, .25, .25)
|
||||||
|
|
||||||
button:SetWidth(15)
|
button:SetSize(15, 15)
|
||||||
button:SetHeight(15)
|
|
||||||
|
|
||||||
if parentFrame then
|
if parentFrame then
|
||||||
button:ClearAllPoints()
|
button:ClearAllPoints()
|
||||||
@@ -787,8 +761,7 @@ function pfUI.api.SkinArrowButton(button, dir, size)
|
|||||||
button:SetDisabledTexture(nil)
|
button:SetDisabledTexture(nil)
|
||||||
|
|
||||||
if size then
|
if size then
|
||||||
button:SetWidth(size)
|
button:SetSize(size, size)
|
||||||
button:SetHeight(size)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if not button.icon then
|
if not button.icon then
|
||||||
@@ -894,8 +867,7 @@ function pfUI.api.SkinCheckbox(frame, size)
|
|||||||
frame:SetPushedTexture("")
|
frame:SetPushedTexture("")
|
||||||
frame:SetHighlightTexture("")
|
frame:SetHighlightTexture("")
|
||||||
if size then
|
if size then
|
||||||
frame:SetWidth(size)
|
frame:SetSize(size, size)
|
||||||
frame:SetHeight(size)
|
|
||||||
end
|
end
|
||||||
CreateBackdrop(frame)
|
CreateBackdrop(frame)
|
||||||
SetAllPointsOffset(frame.backdrop, frame, 4)
|
SetAllPointsOffset(frame.backdrop, frame, 4)
|
||||||
@@ -923,8 +895,7 @@ function pfUI.api.SkinDropDown(frame, cr, cg, cb, useSmall)
|
|||||||
CreateBackdrop(button)
|
CreateBackdrop(button)
|
||||||
|
|
||||||
button.backdrop:ClearAllPoints()
|
button.backdrop:ClearAllPoints()
|
||||||
button.backdrop:SetWidth(18)
|
button.backdrop:SetSize(18, 18)
|
||||||
button.backdrop:SetHeight(18)
|
|
||||||
button.backdrop:SetPoint("RIGHT", frame.backdrop, "RIGHT", -2, 0)
|
button.backdrop:SetPoint("RIGHT", frame.backdrop, "RIGHT", -2, 0)
|
||||||
|
|
||||||
if not button.icon then
|
if not button.icon then
|
||||||
@@ -936,9 +907,7 @@ function pfUI.api.SkinDropDown(frame, cr, cg, cb, useSmall)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not cr or not cg or not cb then
|
if not cr or not cg or not cb then
|
||||||
local _, class = UnitClass("player")
|
cr, cg, cb = PFUI_CLASS_COLORS[UnitClassBase('player')]:GetRGB()
|
||||||
local color = PFUI_CLASS_COLORS[class]
|
|
||||||
cr, cg, cb = color.r , color.g, color.b
|
|
||||||
end
|
end
|
||||||
|
|
||||||
SetHighlight(button, cr, cg, cb)
|
SetHighlight(button, cr, cg, cb)
|
||||||
@@ -1108,8 +1077,7 @@ function pfUI.api.CreateQuestionDialog(text, yes, no, editbox, onclose)
|
|||||||
-- buttons
|
-- buttons
|
||||||
question.yes = CreateFrame("Button", "pfQuestionDialogYes", question, "UIPanelButtonTemplate")
|
question.yes = CreateFrame("Button", "pfQuestionDialogYes", question, "UIPanelButtonTemplate")
|
||||||
pfUI.api.SkinButton(question.yes)
|
pfUI.api.SkinButton(question.yes)
|
||||||
question.yes:SetWidth(100)
|
question.yes:SetSize(100, 22)
|
||||||
question.yes:SetHeight(22)
|
|
||||||
question.yes:SetText(yescap)
|
question.yes:SetText(yescap)
|
||||||
question.yes:SetScript("OnClick", function()
|
question.yes:SetScript("OnClick", function()
|
||||||
if yes then yes() end
|
if yes then yes() end
|
||||||
@@ -1124,8 +1092,7 @@ function pfUI.api.CreateQuestionDialog(text, yes, no, editbox, onclose)
|
|||||||
|
|
||||||
question.no = CreateFrame("Button", "pfQuestionDialogNo", question, "UIPanelButtonTemplate")
|
question.no = CreateFrame("Button", "pfQuestionDialogNo", question, "UIPanelButtonTemplate")
|
||||||
pfUI.api.SkinButton(question.no)
|
pfUI.api.SkinButton(question.no)
|
||||||
question.no:SetWidth(100)
|
question.no:SetSize(100, 22)
|
||||||
question.no:SetHeight(22)
|
|
||||||
question.no:SetText(nocap)
|
question.no:SetText(nocap)
|
||||||
question.no:SetScript("OnClick", function()
|
question.no:SetScript("OnClick", function()
|
||||||
if no then no() end
|
if no then no() end
|
||||||
@@ -1141,8 +1108,7 @@ function pfUI.api.CreateQuestionDialog(text, yes, no, editbox, onclose)
|
|||||||
question.close = CreateFrame("Button", "pfQuestionDialogClose", question)
|
question.close = CreateFrame("Button", "pfQuestionDialogClose", question)
|
||||||
question.close:SetPoint("TOPRIGHT", -border, -border)
|
question.close:SetPoint("TOPRIGHT", -border, -border)
|
||||||
pfUI.api.CreateBackdrop(question.close)
|
pfUI.api.CreateBackdrop(question.close)
|
||||||
question.close:SetHeight(10)
|
question.close:SetSize(10, 10)
|
||||||
question.close:SetWidth(10)
|
|
||||||
question.close.texture = question.close:CreateTexture("pfQuestionDialogCloseTex")
|
question.close.texture = question.close:CreateTexture("pfQuestionDialogCloseTex")
|
||||||
question.close.texture:SetTexture(pfUI.media["img:close"])
|
question.close.texture:SetTexture(pfUI.media["img:close"])
|
||||||
question.close.texture:ClearAllPoints()
|
question.close.texture:ClearAllPoints()
|
||||||
@@ -1244,9 +1210,8 @@ function pfUI.api.CreateInfoBox(text, time, parent, height)
|
|||||||
infobox.duration = time
|
infobox.duration = time
|
||||||
infobox.lastshow = GetTime()
|
infobox.lastshow = GetTime()
|
||||||
|
|
||||||
infobox:SetWidth(infobox.text:GetStringWidth() + 50)
|
infobox:SetSize(infobox.text:GetStringWidth() + 50, height)
|
||||||
infobox:SetParent(parent)
|
infobox:SetParent(parent)
|
||||||
infobox:SetHeight(height)
|
|
||||||
|
|
||||||
infobox:SetFrameStrata("FULLSCREEN_DIALOG")
|
infobox:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
infobox:Show()
|
infobox:Show()
|
||||||
@@ -1281,3 +1246,249 @@ function pfUI.api.SkinMoneyInputFrame(frame)
|
|||||||
copperIcon:ClearAllPoints()
|
copperIcon:ClearAllPoints()
|
||||||
copperIcon:SetPoint("LEFT", copper_editbox, "RIGHT", 2, 0)
|
copperIcon:SetPoint("LEFT", copper_editbox, "RIGHT", 2, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Shared icon picker widget. Builds a name field, a "currently selected"
|
||||||
|
-- preview, and a 10x8 icon grid backed by IconDataProviderMixin with an
|
||||||
|
-- All/Spells/Items filter and a name search. Used by the macro icon picker
|
||||||
|
-- and the equipment manager's name/icon popup. The widgets attach to
|
||||||
|
-- `parent`; the caller owns the surrounding frame, its OK/Cancel buttons,
|
||||||
|
-- and the save flow. Selection is tracked by texture PATH (not index) so it
|
||||||
|
-- survives filter changes -- a spell icon you picked still saves after you
|
||||||
|
-- switch the filter to "Items" and it drops out of the visible grid.
|
||||||
|
--
|
||||||
|
-- name global-name prefix for the scroll frame and editboxes
|
||||||
|
-- parent the popup frame to attach the widgets to
|
||||||
|
-- extraType IconDataProviderExtraType.* seed (Spellbook / Equipment)
|
||||||
|
-- nameLabelText header shown above the name field
|
||||||
|
--
|
||||||
|
-- Returns a handle:
|
||||||
|
-- .editbox name EditBox (caller wires enter/escape)
|
||||||
|
-- .search search EditBox
|
||||||
|
-- .GetIcon() current selected texture path
|
||||||
|
-- .SetIcon(path) set selection (nil -> question mark)
|
||||||
|
-- .Refresh() ensure provider, redraw grid + preview
|
||||||
|
-- .SetIconAreaShown(shown) show/hide the grid, filter, search, and labels
|
||||||
|
function pfUI.api.CreateIconPicker(name, parent, extraType, nameLabelText)
|
||||||
|
local QUESTION_MARK = "INTERFACE\\ICONS\\INV_MISC_QUESTIONMARK"
|
||||||
|
|
||||||
|
local ICON_GRID_COLS = 10
|
||||||
|
local ICON_GRID_ROWS = 8
|
||||||
|
local ICON_BTN_SIZE = 36
|
||||||
|
local ICON_BTN_PAD = 6
|
||||||
|
|
||||||
|
local provider = nil
|
||||||
|
local selectedIconPath = QUESTION_MARK
|
||||||
|
local currentFilter = "all"
|
||||||
|
local searchText = ""
|
||||||
|
local filtered = nil -- provider indices matching the search, or nil when empty
|
||||||
|
local RefreshIconGrid, RebuildFilter
|
||||||
|
|
||||||
|
local function EnsureProvider()
|
||||||
|
if not provider then
|
||||||
|
provider = CreateAndInitFromMixin(IconDataProviderMixin, extraType)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Normalize a texture to an uppercase basename so matching works across
|
||||||
|
-- sources: GetMacroInfo / stored set icons return "Interface\Icons\<name>"
|
||||||
|
-- while provider paths are uppercase-prefixed for base icons and
|
||||||
|
-- mixed-case for spellbook extras.
|
||||||
|
local function IconKey(path)
|
||||||
|
if type(path) ~= "string" then return path end
|
||||||
|
return string.gsub(string.upper(path), "^.*[\\/]", "")
|
||||||
|
end
|
||||||
|
|
||||||
|
parent.nameLabel = parent:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
parent.nameLabel:SetPoint("TOPLEFT", parent, "TOPLEFT", 14, -20)
|
||||||
|
parent.nameLabel:SetText(nameLabelText)
|
||||||
|
|
||||||
|
parent.editbox = CreateFrame("EditBox", name.."Name", parent, "InputBoxTemplate")
|
||||||
|
parent.editbox:SetSize(280, 20)
|
||||||
|
parent.editbox:SetPoint("TOPLEFT", parent, "TOPLEFT", 14, -38)
|
||||||
|
parent.editbox:SetAutoFocus(false)
|
||||||
|
parent.editbox:SetMaxLetters(16)
|
||||||
|
CreateBackdrop(parent.editbox)
|
||||||
|
|
||||||
|
parent.selectedLabel = parent:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
parent.selectedLabel:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -14, -14)
|
||||||
|
parent.selectedLabel:SetText(ICON_SELECTION_TITLE_CURRENT)
|
||||||
|
parent.selectedLabel:SetTextColor(1, 0.82, 0)
|
||||||
|
|
||||||
|
parent.selectedPreview = CreateFrame("Frame", nil, parent)
|
||||||
|
parent.selectedPreview:SetSize(42, 42)
|
||||||
|
parent.selectedPreview:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -14, -30)
|
||||||
|
CreateBackdrop(parent.selectedPreview)
|
||||||
|
parent.selectedPreview.tex = parent.selectedPreview:CreateTexture(nil, "ARTWORK")
|
||||||
|
parent.selectedPreview.tex:SetAllPoints(parent.selectedPreview)
|
||||||
|
parent.selectedPreview.tex:SetTexCoord(.08, .92, .08, .92)
|
||||||
|
|
||||||
|
parent.iconLabel = parent:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
parent.iconLabel:SetPoint("TOPLEFT", parent, "TOPLEFT", 14, -86)
|
||||||
|
parent.iconLabel:SetText(MACRO_POPUP_CHOOSE_ICON)
|
||||||
|
|
||||||
|
-- Icon grid + scroll
|
||||||
|
local iconScroll = CreateFrame("ScrollFrame", name.."Scroll", parent, "FauxScrollFrameTemplate")
|
||||||
|
iconScroll:SetPoint("TOPLEFT", parent, "TOPLEFT", 14, -116)
|
||||||
|
iconScroll:SetWidth(ICON_GRID_COLS * (ICON_BTN_SIZE + ICON_BTN_PAD) - ICON_BTN_PAD)
|
||||||
|
iconScroll:SetHeight(ICON_GRID_ROWS * (ICON_BTN_SIZE + ICON_BTN_PAD) - ICON_BTN_PAD)
|
||||||
|
|
||||||
|
local scrollbar = _G[name.."ScrollScrollBar"]
|
||||||
|
scrollbar:ClearAllPoints()
|
||||||
|
scrollbar:SetPoint("TOPLEFT", iconScroll, "TOPRIGHT", 8, -16)
|
||||||
|
scrollbar:SetPoint("BOTTOMLEFT", iconScroll, "BOTTOMRIGHT", 8, 16)
|
||||||
|
SkinScrollbar(scrollbar)
|
||||||
|
|
||||||
|
-- Filter dropdown: All / Spells / Items
|
||||||
|
local filterDropdown = CreateFrame("Frame", name.."Filter", parent, "UIDropDownMenuTemplate")
|
||||||
|
filterDropdown:SetPoint("TOPRIGHT", parent, "TOPRIGHT", 0, -80)
|
||||||
|
local function ApplyFilter(value)
|
||||||
|
currentFilter = value
|
||||||
|
UIDropDownMenu_SetSelectedValue(filterDropdown, value)
|
||||||
|
if provider then
|
||||||
|
if value == "spells" then provider:SetIconTypes({ IconDataProviderIconType.Spell })
|
||||||
|
elseif value == "items" then provider:SetIconTypes({ IconDataProviderIconType.Item })
|
||||||
|
else provider:SetIconTypes(nil) end
|
||||||
|
RebuildFilter()
|
||||||
|
RefreshIconGrid()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
UIDropDownMenu_Initialize(filterDropdown, function()
|
||||||
|
local info
|
||||||
|
info = {}; info.text = ICON_FILTER_ALL; info.value = "all"
|
||||||
|
info.func = function() ApplyFilter("all") end
|
||||||
|
info.checked = currentFilter == "all"
|
||||||
|
UIDropDownMenu_AddButton(info)
|
||||||
|
info = {}; info.text = ICON_FILTER_SPELL; info.value = "spells"
|
||||||
|
info.func = function() ApplyFilter("spells") end
|
||||||
|
info.checked = currentFilter == "spells"
|
||||||
|
UIDropDownMenu_AddButton(info)
|
||||||
|
info = {}; info.text = ICON_FILTER_ITEM; info.value = "items"
|
||||||
|
info.func = function() ApplyFilter("items") end
|
||||||
|
info.checked = currentFilter == "items"
|
||||||
|
UIDropDownMenu_AddButton(info)
|
||||||
|
end)
|
||||||
|
UIDropDownMenu_SetWidth(120, filterDropdown)
|
||||||
|
UIDropDownMenu_SetSelectedValue(filterDropdown, "all")
|
||||||
|
SkinDropDown(filterDropdown)
|
||||||
|
|
||||||
|
local iconButtons = {}
|
||||||
|
for r = 1, ICON_GRID_ROWS do
|
||||||
|
for c = 1, ICON_GRID_COLS do
|
||||||
|
local i = (r - 1) * ICON_GRID_COLS + c
|
||||||
|
local btn = CreateFrame("Button", nil, parent)
|
||||||
|
btn:SetSize(ICON_BTN_SIZE, ICON_BTN_SIZE)
|
||||||
|
btn:SetPoint("TOPLEFT", iconScroll, "TOPLEFT", (c-1) * (ICON_BTN_SIZE + ICON_BTN_PAD), -(r-1) * (ICON_BTN_SIZE + ICON_BTN_PAD))
|
||||||
|
CreateBackdrop(btn)
|
||||||
|
btn.texture = btn:CreateTexture(nil, "ARTWORK")
|
||||||
|
btn.texture:SetAllPoints(btn)
|
||||||
|
btn.texture:SetTexCoord(.08, .92, .08, .92)
|
||||||
|
btn:SetScript("OnClick", function()
|
||||||
|
if this.iconIndex and provider then
|
||||||
|
local path = provider:GetIconByIndex(this.iconIndex)
|
||||||
|
if path then selectedIconPath = path end
|
||||||
|
RefreshIconGrid()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
btn:SetScript("OnEnter", function()
|
||||||
|
if not this.iconIndex or not provider then return end
|
||||||
|
local path = provider:GetIconByIndex(this.iconIndex)
|
||||||
|
if type(path) == "string" then
|
||||||
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
||||||
|
GameTooltip:SetText(IconKey(path), 1, 1, 1)
|
||||||
|
GameTooltip:Show()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
btn:SetScript("OnLeave", GameTooltip_Hide)
|
||||||
|
iconButtons[i] = btn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Rebuild the search-filtered index list (provider indices whose icon
|
||||||
|
-- basename contains the search text); nil when the search box is empty.
|
||||||
|
function RebuildFilter()
|
||||||
|
EnsureProvider()
|
||||||
|
if searchText == "" then
|
||||||
|
filtered = nil
|
||||||
|
return
|
||||||
|
end
|
||||||
|
filtered = {}
|
||||||
|
for i = 1, provider:GetNumIcons() do
|
||||||
|
local path = provider:GetIconByIndex(i)
|
||||||
|
if type(path) == "string" and string.find(IconKey(path), searchText, 1, true) then
|
||||||
|
table.insert(filtered, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RefreshIconGrid()
|
||||||
|
EnsureProvider()
|
||||||
|
local numIcons = filtered and table.getn(filtered) or provider:GetNumIcons()
|
||||||
|
local numRows = math.ceil(numIcons / ICON_GRID_COLS)
|
||||||
|
FauxScrollFrame_Update(iconScroll, numRows, ICON_GRID_ROWS, ICON_BTN_SIZE + ICON_BTN_PAD)
|
||||||
|
local offset = FauxScrollFrame_GetOffset(iconScroll)
|
||||||
|
for i = 1, ICON_GRID_ROWS * ICON_GRID_COLS do
|
||||||
|
local listIdx = i + offset * ICON_GRID_COLS
|
||||||
|
local btn = iconButtons[i]
|
||||||
|
if listIdx <= numIcons then
|
||||||
|
btn:Show()
|
||||||
|
local providerIdx = filtered and filtered[listIdx] or listIdx
|
||||||
|
btn.iconIndex = providerIdx
|
||||||
|
local path = provider:GetIconByIndex(providerIdx)
|
||||||
|
btn.texture:SetTexture(path)
|
||||||
|
if IconKey(path) == IconKey(selectedIconPath) then
|
||||||
|
btn.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)
|
||||||
|
else
|
||||||
|
btn.backdrop:SetBackdropBorderColor(pfUI.cache.er, pfUI.cache.eg, pfUI.cache.eb, pfUI.cache.ea)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
btn:Hide()
|
||||||
|
btn.iconIndex = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
parent.selectedPreview.tex:SetTexture(selectedIconPath)
|
||||||
|
end
|
||||||
|
|
||||||
|
iconScroll:SetScript("OnVerticalScroll", function()
|
||||||
|
FauxScrollFrame_OnVerticalScroll(ICON_BTN_SIZE + ICON_BTN_PAD, function() RefreshIconGrid() end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Search box (bottom-left) filters the grid by icon name.
|
||||||
|
parent.searchLabel = parent:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
parent.searchLabel:SetPoint("BOTTOMLEFT", parent, "BOTTOMLEFT", 16, 18)
|
||||||
|
parent.searchLabel:SetText(SEARCH)
|
||||||
|
|
||||||
|
parent.search = CreateFrame("EditBox", name.."Search", parent, "InputBoxTemplate")
|
||||||
|
parent.search:SetSize(180, 20)
|
||||||
|
parent.search:SetPoint("LEFT", parent.searchLabel, "RIGHT", 10, 0)
|
||||||
|
parent.search:SetAutoFocus(false)
|
||||||
|
CreateBackdrop(parent.search)
|
||||||
|
parent.search:SetScript("OnEscapePressed", function() this:ClearFocus() end)
|
||||||
|
parent.search:SetScript("OnTextChanged", function()
|
||||||
|
searchText = strupper(strtrim(this:GetText()))
|
||||||
|
RebuildFilter()
|
||||||
|
scrollbar:SetValue(0)
|
||||||
|
RefreshIconGrid()
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Release the provider when the popup closes so its icon cache GCs.
|
||||||
|
parent:HookScript("OnHide", function()
|
||||||
|
if provider then provider:Release(); provider = nil end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local handle = { editbox = parent.editbox, search = parent.search }
|
||||||
|
function handle.GetIcon() return selectedIconPath end
|
||||||
|
function handle.SetIcon(path) selectedIconPath = path or QUESTION_MARK end
|
||||||
|
function handle.Refresh() RefreshIconGrid() end
|
||||||
|
function handle.SetIconAreaShown(shown)
|
||||||
|
local method = shown and "Show" or "Hide"
|
||||||
|
iconScroll[method](iconScroll)
|
||||||
|
for _, b in ipairs(iconButtons) do b[method](b) end
|
||||||
|
parent.iconLabel[method](parent.iconLabel)
|
||||||
|
parent.selectedLabel[method](parent.selectedLabel)
|
||||||
|
parent.selectedPreview[method](parent.selectedPreview)
|
||||||
|
filterDropdown[method](filterDropdown)
|
||||||
|
parent.searchLabel[method](parent.searchLabel)
|
||||||
|
parent.search[method](parent.search)
|
||||||
|
end
|
||||||
|
return handle
|
||||||
|
end
|
||||||
|
|||||||
+313
-672
File diff suppressed because it is too large
Load Diff
@@ -25,19 +25,9 @@ PLAYER_BUFF_START_ID = -1
|
|||||||
|
|
||||||
ACTIONBAR_SECURE_TEMPLATE_BAR = nil
|
ACTIONBAR_SECURE_TEMPLATE_BAR = nil
|
||||||
ACTIONBAR_SECURE_TEMPLATE_BUTTON = nil
|
ACTIONBAR_SECURE_TEMPLATE_BUTTON = nil
|
||||||
UNITFRAME_SECURE_TEMPLATE = nil
|
|
||||||
|
|
||||||
--[[ Vanilla API Extensions ]]--
|
--[[ Vanilla API Extensions ]]--
|
||||||
|
|
||||||
do -- GetItemInfo
|
|
||||||
local name, link, rarity, minlevel, itype, isubtype, stack
|
|
||||||
function GetItemInfo(item)
|
|
||||||
if not item then return end
|
|
||||||
name, link, rarity, minlevel, itype, isubtype, stack = _G.GetItemInfo(item)
|
|
||||||
return name, link, rarity, nil, minlevel, itype, isubtype, stack
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
do -- RunMacroText
|
do -- RunMacroText
|
||||||
local obj = { ["GetText"] = function(self) return self.text end }
|
local obj = { ["GetText"] = function(self) return self.text end }
|
||||||
obj = setmetatable(obj, {__index = function(tab,key)
|
obj = setmetatable(obj, {__index = function(tab,key)
|
||||||
|
|||||||
Vendored
-1065
File diff suppressed because it is too large
Load Diff
Vendored
-1067
File diff suppressed because it is too large
Load Diff
Vendored
-1060
File diff suppressed because it is too large
Load Diff
Vendored
-1056
File diff suppressed because it is too large
Load Diff
Vendored
-1026
File diff suppressed because it is too large
Load Diff
Vendored
-1063
File diff suppressed because it is too large
Load Diff
Vendored
-1080
File diff suppressed because it is too large
Load Diff
Vendored
-17
@@ -1,20 +1,3 @@
|
|||||||
-- this table is added in later expansions
|
|
||||||
CLASS_SORT_ORDER = CLASS_SORT_ORDER or {
|
|
||||||
"WARRIOR",
|
|
||||||
"DEATHKNIGHT",
|
|
||||||
"PALADIN",
|
|
||||||
"MONK",
|
|
||||||
"PRIEST",
|
|
||||||
"SHAMAN",
|
|
||||||
"DRUID",
|
|
||||||
"ROGUE",
|
|
||||||
"MAGE",
|
|
||||||
"WARLOCK",
|
|
||||||
"HUNTER",
|
|
||||||
"DEMONHUNTER",
|
|
||||||
"UNKNOWN",
|
|
||||||
}
|
|
||||||
|
|
||||||
CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS or {
|
CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS or {
|
||||||
["WARRIOR"] = {0, 0.25, 0, 0.25},
|
["WARRIOR"] = {0, 0.25, 0, 0.25},
|
||||||
["MAGE"] = {0.25, 0.49609375, 0, 0.25},
|
["MAGE"] = {0.25, 0.49609375, 0, 0.25},
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["deDE"] = {
|
|||||||
["Always Show Item Comparison"] = nil,
|
["Always Show Item Comparison"] = nil,
|
||||||
["Always Show On Target Units"] = nil,
|
["Always Show On Target Units"] = nil,
|
||||||
["Always Show On Units With Missing HP"] = nil,
|
["Always Show On Units With Missing HP"] = nil,
|
||||||
["Always Show Self In Raid Frames"] = nil,
|
|
||||||
["Always Use 2D Portraits"] = nil,
|
["Always Use 2D Portraits"] = nil,
|
||||||
["Ammo Counter"] = nil,
|
["Ammo Counter"] = nil,
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["deDE"] = {
|
|||||||
["Auto Sell Grey Items"] = nil,
|
["Auto Sell Grey Items"] = nil,
|
||||||
["Average Per Hour"] = nil,
|
["Average Per Hour"] = nil,
|
||||||
["Background Color"] = nil,
|
["Background Color"] = nil,
|
||||||
|
["Bags"] = "Taschen",
|
||||||
["Bags & Bank"] = nil,
|
["Bags & Bank"] = nil,
|
||||||
["Bags Border Size"] = nil,
|
["Bags Border Size"] = nil,
|
||||||
["Bagslots Per Row"] = nil,
|
["Bagslots Per Row"] = nil,
|
||||||
["Bagspace"] = nil,
|
["Bagspace"] = nil,
|
||||||
|
["Bank"] = "Bank",
|
||||||
["Banker"] = nil,
|
["Banker"] = nil,
|
||||||
["Bankslots Per Row"] = nil,
|
["Bankslots Per Row"] = nil,
|
||||||
["Bar Background"] = nil,
|
["Bar Background"] = nil,
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Click Casting"] = nil,
|
["Click Casting"] = nil,
|
||||||
["Clock"] = nil,
|
["Clock"] = nil,
|
||||||
["Close"] = nil,
|
["Close"] = nil,
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = nil,
|
["Color Buff Stacks"] = nil,
|
||||||
["Color Debuff Stacks"] = nil,
|
["Color Debuff Stacks"] = nil,
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["deDE"] = {
|
|||||||
["Enable Mana Ticks"] = nil,
|
["Enable Mana Ticks"] = nil,
|
||||||
["Enable Micro Bar"] = nil,
|
["Enable Micro Bar"] = nil,
|
||||||
["Enable Mouselook With Right Click"] = nil,
|
["Enable Mouselook With Right Click"] = nil,
|
||||||
["Enable Mouseover Tooltip"] = nil,
|
|
||||||
["Enable Movable Bags"] = nil,
|
["Enable Movable Bags"] = nil,
|
||||||
["Enable Offscreen Frame Positions"] = nil,
|
["Enable Offscreen Frame Positions"] = nil,
|
||||||
["Enable Overlap"] = nil,
|
["Enable Overlap"] = nil,
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Encode"] = nil,
|
["Encode"] = nil,
|
||||||
["Ended"] = nil,
|
["Ended"] = nil,
|
||||||
["Energy Color"] = nil,
|
["Energy Color"] = nil,
|
||||||
|
["Equipped"] = "Angelegt",
|
||||||
["Equipped Item Color"] = nil,
|
["Equipped Item Color"] = nil,
|
||||||
["Estimate Debuffs"] = nil,
|
["Estimate Debuffs"] = nil,
|
||||||
["Estimate Enemy Health Points"] = nil,
|
["Estimate Enemy Health Points"] = nil,
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = nil,
|
["Overwrite If Unit Is Attacking Others"] = nil,
|
||||||
["Overwrite If Unit Is Attacking You"] = nil,
|
["Overwrite If Unit Is Attacking You"] = nil,
|
||||||
["Overwrite If Unit Is Casting"] = nil,
|
["Overwrite If Unit Is Casting"] = nil,
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = nil,
|
["Pageable"] = nil,
|
||||||
["Paging Actionbar"] = nil,
|
["Paging Actionbar"] = nil,
|
||||||
["Panel"] = nil,
|
["Panel"] = nil,
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["deDE"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = nil,
|
["Raid Padding"] = nil,
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = nil,
|
["Random"] = nil,
|
||||||
["Random Roll Announcement Rarity"] = nil,
|
["Random Roll Announcement Rarity"] = nil,
|
||||||
["Random Rolling"] = nil,
|
["Random Rolling"] = nil,
|
||||||
["Range Based Hunter Paging"] = nil,
|
["Range Based Hunter Paging"] = nil,
|
||||||
["Range Check Interval"] = nil,
|
|
||||||
["Rank"] = nil,
|
["Rank"] = nil,
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = nil,
|
["Red Border On Enemy Units"] = nil,
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = nil,
|
["Regional Settings"] = nil,
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Show Description"] = nil,
|
["Show Description"] = nil,
|
||||||
["Show Dispel Indicators"] = nil,
|
["Show Dispel Indicators"] = nil,
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = nil,
|
["Show Duration Inside Buff"] = nil,
|
||||||
["Show Empty Buttons"] = nil,
|
["Show Empty Buttons"] = nil,
|
||||||
["Show FPS and Latency Colors"] = nil,
|
["Show FPS and Latency Colors"] = nil,
|
||||||
@@ -738,6 +743,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Show Required Questitem Count"] = nil,
|
["Show Required Questitem Count"] = nil,
|
||||||
["Show Resting"] = nil,
|
["Show Resting"] = nil,
|
||||||
["Show Self In Group Frames"] = nil,
|
["Show Self In Group Frames"] = nil,
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = nil,
|
["Show Spell Icon"] = nil,
|
||||||
["Show Spell Name"] = nil,
|
["Show Spell Name"] = nil,
|
||||||
["Show Stacks"] = nil,
|
["Show Stacks"] = nil,
|
||||||
@@ -782,6 +788,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Target Castbar"] = nil,
|
["Target Castbar"] = nil,
|
||||||
["Target Debuff Bar"] = nil,
|
["Target Debuff Bar"] = nil,
|
||||||
["Target Nameplate Zoom Factor"] = nil,
|
["Target Nameplate Zoom Factor"] = nil,
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = nil,
|
["Target-Target"] = nil,
|
||||||
["Target-Target-Target"] = nil,
|
["Target-Target-Target"] = nil,
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -814,6 +821,7 @@ pfUI_translation["deDE"] = {
|
|||||||
["Top Actionbar"] = nil,
|
["Top Actionbar"] = nil,
|
||||||
["Top Left"] = nil,
|
["Top Left"] = nil,
|
||||||
["Top Right"] = nil,
|
["Top Right"] = nil,
|
||||||
|
["Total"] = "Gesamt",
|
||||||
["Total Gold"] = nil,
|
["Total Gold"] = nil,
|
||||||
["Totem Direction"] = nil,
|
["Totem Direction"] = nil,
|
||||||
["Totem Icons"] = nil,
|
["Totem Icons"] = nil,
|
||||||
@@ -876,7 +884,6 @@ pfUI_translation["deDE"] = {
|
|||||||
["XP Percentage"] = nil,
|
["XP Percentage"] = nil,
|
||||||
["Yellow Border On Neutral Units"] = nil,
|
["Yellow Border On Neutral Units"] = nil,
|
||||||
["Yes"] = nil,
|
["Yes"] = nil,
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = nil,
|
["You got"] = nil,
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||||
["Your items have been repaired for"] = nil,
|
["Your items have been repaired for"] = nil,
|
||||||
|
|||||||
Vendored
+20
-4
@@ -28,7 +28,6 @@ pfUI_translation["enUS"] = {
|
|||||||
["Always Show Item Comparison"] = nil,
|
["Always Show Item Comparison"] = nil,
|
||||||
["Always Show On Target Units"] = nil,
|
["Always Show On Target Units"] = nil,
|
||||||
["Always Show On Units With Missing HP"] = nil,
|
["Always Show On Units With Missing HP"] = nil,
|
||||||
["Always Show Self In Raid Frames"] = nil,
|
|
||||||
["Always Use 2D Portraits"] = nil,
|
["Always Use 2D Portraits"] = nil,
|
||||||
["Ammo Counter"] = nil,
|
["Ammo Counter"] = nil,
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -53,15 +52,19 @@ pfUI_translation["enUS"] = {
|
|||||||
["Auto Sell Grey Items"] = nil,
|
["Auto Sell Grey Items"] = nil,
|
||||||
["Average Per Hour"] = nil,
|
["Average Per Hour"] = nil,
|
||||||
["Background Color"] = nil,
|
["Background Color"] = nil,
|
||||||
|
["Bags"] = nil,
|
||||||
["Bags & Bank"] = nil,
|
["Bags & Bank"] = nil,
|
||||||
["Bags Border Size"] = nil,
|
["Bags Border Size"] = nil,
|
||||||
["Bagslots Per Row"] = nil,
|
["Bagslots Per Row"] = nil,
|
||||||
["Bagspace"] = nil,
|
["Bagspace"] = nil,
|
||||||
|
["Bank"] = nil,
|
||||||
["Banker"] = nil,
|
["Banker"] = nil,
|
||||||
["Bankslots Per Row"] = nil,
|
["Bankslots Per Row"] = nil,
|
||||||
["Bar Background"] = nil,
|
["Bar Background"] = nil,
|
||||||
["Bar Texture"] = nil,
|
["Bar Texture"] = nil,
|
||||||
|
["Battleground Frames"] = nil,
|
||||||
["Battleground Statistics"] = nil,
|
["Battleground Statistics"] = nil,
|
||||||
|
["BEHIND"] = nil,
|
||||||
["Blacklist"] = nil,
|
["Blacklist"] = nil,
|
||||||
["Blinding Powder"] = nil,
|
["Blinding Powder"] = nil,
|
||||||
["Blue Border On Friendly Players"] = nil,
|
["Blue Border On Friendly Players"] = nil,
|
||||||
@@ -126,6 +129,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Click Casting"] = nil,
|
["Click Casting"] = nil,
|
||||||
["Clock"] = nil,
|
["Clock"] = nil,
|
||||||
["Close"] = nil,
|
["Close"] = nil,
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = nil,
|
["Color Buff Stacks"] = nil,
|
||||||
["Color Debuff Stacks"] = nil,
|
["Color Debuff Stacks"] = nil,
|
||||||
@@ -293,7 +297,6 @@ pfUI_translation["enUS"] = {
|
|||||||
["Enable Mana Ticks"] = nil,
|
["Enable Mana Ticks"] = nil,
|
||||||
["Enable Micro Bar"] = nil,
|
["Enable Micro Bar"] = nil,
|
||||||
["Enable Mouselook With Right Click"] = nil,
|
["Enable Mouselook With Right Click"] = nil,
|
||||||
["Enable Mouseover Tooltip"] = nil,
|
|
||||||
["Enable Movable Bags"] = nil,
|
["Enable Movable Bags"] = nil,
|
||||||
["Enable Offscreen Frame Positions"] = nil,
|
["Enable Offscreen Frame Positions"] = nil,
|
||||||
["Enable Overlap"] = nil,
|
["Enable Overlap"] = nil,
|
||||||
@@ -314,6 +317,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Encode"] = nil,
|
["Encode"] = nil,
|
||||||
["Ended"] = nil,
|
["Ended"] = nil,
|
||||||
["Energy Color"] = nil,
|
["Energy Color"] = nil,
|
||||||
|
["Equipped"] = nil,
|
||||||
["Equipped Item Color"] = nil,
|
["Equipped Item Color"] = nil,
|
||||||
["Estimate Debuffs"] = nil,
|
["Estimate Debuffs"] = nil,
|
||||||
["Estimate Enemy Health Points"] = nil,
|
["Estimate Enemy Health Points"] = nil,
|
||||||
@@ -326,6 +330,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Export"] = nil,
|
["Export"] = nil,
|
||||||
["Face"] = nil,
|
["Face"] = nil,
|
||||||
["Fade To Custom Color"] = nil,
|
["Fade To Custom Color"] = nil,
|
||||||
|
["FARM MODE"] = nil,
|
||||||
["Fast"] = nil,
|
["Fast"] = nil,
|
||||||
["Filter Mode"] = nil,
|
["Filter Mode"] = nil,
|
||||||
["Finish"] = nil,
|
["Finish"] = nil,
|
||||||
@@ -411,6 +416,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Highlight Equipped Items"] = nil,
|
["Highlight Equipped Items"] = nil,
|
||||||
["Highlight Not Usable Spells"] = nil,
|
["Highlight Not Usable Spells"] = nil,
|
||||||
["Highlight Out Of Mana Spells"] = nil,
|
["Highlight Out Of Mana Spells"] = nil,
|
||||||
|
["Highlight New Items"] = nil,
|
||||||
["Highlight Out Of Range Spells"] = nil,
|
["Highlight Out Of Range Spells"] = nil,
|
||||||
["Highlight Settings That Require Reload"] = nil,
|
["Highlight Settings That Require Reload"] = nil,
|
||||||
["Highlight Unusable Items"] = nil,
|
["Highlight Unusable Items"] = nil,
|
||||||
@@ -529,11 +535,13 @@ pfUI_translation["enUS"] = {
|
|||||||
["Network Latency"] = nil,
|
["Network Latency"] = nil,
|
||||||
["Network Up"] = nil,
|
["Network Up"] = nil,
|
||||||
["New entry:"] = nil,
|
["New entry:"] = nil,
|
||||||
|
["New Item Color"] = nil,
|
||||||
["NEW TIMER"] = nil,
|
["NEW TIMER"] = nil,
|
||||||
["Next"] = nil,
|
["Next"] = nil,
|
||||||
["Next Memory Cleanup"] = nil,
|
["Next Memory Cleanup"] = nil,
|
||||||
["No"] = nil,
|
["No"] = nil,
|
||||||
["No Anchor"] = nil,
|
["No Anchor"] = nil,
|
||||||
|
["NO LOS"] = nil,
|
||||||
["None"] = nil,
|
["None"] = nil,
|
||||||
["Not a valid button!"] = nil,
|
["Not a valid button!"] = nil,
|
||||||
["No tracking spell active"] = nil,
|
["No tracking spell active"] = nil,
|
||||||
@@ -574,6 +582,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = nil,
|
["Overwrite If Unit Is Attacking Others"] = nil,
|
||||||
["Overwrite If Unit Is Attacking You"] = nil,
|
["Overwrite If Unit Is Attacking You"] = nil,
|
||||||
["Overwrite If Unit Is Casting"] = nil,
|
["Overwrite If Unit Is Casting"] = nil,
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = nil,
|
["Pageable"] = nil,
|
||||||
["Paging Actionbar"] = nil,
|
["Paging Actionbar"] = nil,
|
||||||
["Panel"] = nil,
|
["Panel"] = nil,
|
||||||
@@ -621,12 +630,13 @@ pfUI_translation["enUS"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = nil,
|
["Raid Padding"] = nil,
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = nil,
|
["Random"] = nil,
|
||||||
["Random Roll Announcement Rarity"] = nil,
|
["Random Roll Announcement Rarity"] = nil,
|
||||||
["Random Rolling"] = nil,
|
["Random Rolling"] = nil,
|
||||||
["Range Based Hunter Paging"] = nil,
|
["Range Based Hunter Paging"] = nil,
|
||||||
["Range Check Interval"] = nil,
|
|
||||||
["Rank"] = nil,
|
["Rank"] = nil,
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = nil,
|
["Red Border On Enemy Units"] = nil,
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = nil,
|
["Regional Settings"] = nil,
|
||||||
@@ -709,6 +719,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Show Description"] = nil,
|
["Show Description"] = nil,
|
||||||
["Show Dispel Indicators"] = nil,
|
["Show Dispel Indicators"] = nil,
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = nil,
|
["Show Duration Inside Buff"] = nil,
|
||||||
["Show Empty Buttons"] = nil,
|
["Show Empty Buttons"] = nil,
|
||||||
["Show FPS and Latency Colors"] = nil,
|
["Show FPS and Latency Colors"] = nil,
|
||||||
@@ -745,6 +756,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Show Required Questitem Count"] = nil,
|
["Show Required Questitem Count"] = nil,
|
||||||
["Show Resting"] = nil,
|
["Show Resting"] = nil,
|
||||||
["Show Self In Group Frames"] = nil,
|
["Show Self In Group Frames"] = nil,
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = nil,
|
["Show Spell Icon"] = nil,
|
||||||
["Show Spell Name"] = nil,
|
["Show Spell Name"] = nil,
|
||||||
["Show Stacks"] = nil,
|
["Show Stacks"] = nil,
|
||||||
@@ -765,6 +777,8 @@ pfUI_translation["enUS"] = {
|
|||||||
["Small"] = nil,
|
["Small"] = nil,
|
||||||
["Some settings need to reload the UI to take effect.\nDo you want to reload now?"] = nil,
|
["Some settings need to reload the UI to take effect.\nDo you want to reload now?"] = nil,
|
||||||
["Some settings need to reload the UI to take effect.\nDo you want to reloadUI now?"] = nil,
|
["Some settings need to reload the UI to take effect.\nDo you want to reloadUI now?"] = nil,
|
||||||
|
["Sort Bags"] = nil,
|
||||||
|
["Sort Bank"] = nil,
|
||||||
["Sort Order"] = nil,
|
["Sort Order"] = nil,
|
||||||
["Soul Shard"] = nil,
|
["Soul Shard"] = nil,
|
||||||
["Soulshard Counter"] = nil,
|
["Soulshard Counter"] = nil,
|
||||||
@@ -786,12 +800,14 @@ pfUI_translation["enUS"] = {
|
|||||||
["Switch Pages On Alt Key Press"] = nil,
|
["Switch Pages On Alt Key Press"] = nil,
|
||||||
["Switch Pages On Ctrl Key Press"] = nil,
|
["Switch Pages On Ctrl Key Press"] = nil,
|
||||||
["Switch Pages On Druid Stealth"] = nil,
|
["Switch Pages On Druid Stealth"] = nil,
|
||||||
|
["Switch Pages On Priest Shadowform"] = nil,
|
||||||
["Switch Pages On Shift Key Press"] = nil,
|
["Switch Pages On Shift Key Press"] = nil,
|
||||||
["Systeminfo"] = nil,
|
["Systeminfo"] = nil,
|
||||||
["Target"] = nil,
|
["Target"] = nil,
|
||||||
["Target Castbar"] = nil,
|
["Target Castbar"] = nil,
|
||||||
["Target Debuff Bar"] = nil,
|
["Target Debuff Bar"] = nil,
|
||||||
["Target Nameplate Zoom Factor"] = nil,
|
["Target Nameplate Zoom Factor"] = nil,
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = nil,
|
["Target-Target"] = nil,
|
||||||
["Target-Target-Target"] = nil,
|
["Target-Target-Target"] = nil,
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -827,6 +843,7 @@ pfUI_translation["enUS"] = {
|
|||||||
["Top Actionbar"] = nil,
|
["Top Actionbar"] = nil,
|
||||||
["Top Left"] = nil,
|
["Top Left"] = nil,
|
||||||
["Top Right"] = nil,
|
["Top Right"] = nil,
|
||||||
|
["Total"] = nil,
|
||||||
["Total Gold"] = nil,
|
["Total Gold"] = nil,
|
||||||
["Totem Direction"] = nil,
|
["Totem Direction"] = nil,
|
||||||
["Totem Icons"] = nil,
|
["Totem Icons"] = nil,
|
||||||
@@ -889,7 +906,6 @@ pfUI_translation["enUS"] = {
|
|||||||
["XP Percentage"] = nil,
|
["XP Percentage"] = nil,
|
||||||
["Yellow Border On Neutral Units"] = nil,
|
["Yellow Border On Neutral Units"] = nil,
|
||||||
["Yes"] = nil,
|
["Yes"] = nil,
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = nil,
|
["You got"] = nil,
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||||
["Your items have been repaired for"] = nil,
|
["Your items have been repaired for"] = nil,
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["esES"] = {
|
|||||||
["Always Show Item Comparison"] = "Mostrar siempre la comparativa entre objetos",
|
["Always Show Item Comparison"] = "Mostrar siempre la comparativa entre objetos",
|
||||||
["Always Show On Target Units"] = "Mostrar siempre en el objectivo",
|
["Always Show On Target Units"] = "Mostrar siempre en el objectivo",
|
||||||
["Always Show On Units With Missing HP"] = "Mostrar siempre en unidades con falta de salud",
|
["Always Show On Units With Missing HP"] = "Mostrar siempre en unidades con falta de salud",
|
||||||
["Always Show Self In Raid Frames"] = "Mostrarse siempre a sí mismo en los marcos de banda",
|
|
||||||
["Always Use 2D Portraits"] = "Usar siempre retratos 2D",
|
["Always Use 2D Portraits"] = "Usar siempre retratos 2D",
|
||||||
["Ammo Counter"] = "Contador de munición",
|
["Ammo Counter"] = "Contador de munición",
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["esES"] = {
|
|||||||
["Auto Sell Grey Items"] = "Vender objetos grises automáticamente",
|
["Auto Sell Grey Items"] = "Vender objetos grises automáticamente",
|
||||||
["Average Per Hour"] = "Promedio por hora",
|
["Average Per Hour"] = "Promedio por hora",
|
||||||
["Background Color"] = "Color del fondo",
|
["Background Color"] = "Color del fondo",
|
||||||
|
["Bags"] = "Bolsas",
|
||||||
["Bags & Bank"] = "Bolsas y banco",
|
["Bags & Bank"] = "Bolsas y banco",
|
||||||
["Bags Border Size"] = "Tamaño del borde de las bolsas",
|
["Bags Border Size"] = "Tamaño del borde de las bolsas",
|
||||||
["Bagslots Per Row"] = "Casillas de la bolsa por fila",
|
["Bagslots Per Row"] = "Casillas de la bolsa por fila",
|
||||||
["Bagspace"] = "Huecos en las bolsas",
|
["Bagspace"] = "Huecos en las bolsas",
|
||||||
|
["Bank"] = "Banco",
|
||||||
["Banker"] = "Banquero",
|
["Banker"] = "Banquero",
|
||||||
["Bankslots Per Row"] = "Casillas del banco por fila",
|
["Bankslots Per Row"] = "Casillas del banco por fila",
|
||||||
["Bar Background"] = "Fondo de la barra",
|
["Bar Background"] = "Fondo de la barra",
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Click Casting"] = "Lanzamiento al hacer click",
|
["Click Casting"] = "Lanzamiento al hacer click",
|
||||||
["Clock"] = "Reloj",
|
["Clock"] = "Reloj",
|
||||||
["Close"] = "Cerrar",
|
["Close"] = "Cerrar",
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = "Colorear pilas de beneficios",
|
["Color Buff Stacks"] = "Colorear pilas de beneficios",
|
||||||
["Color Debuff Stacks"] = "Colorear pilas de perjuicios",
|
["Color Debuff Stacks"] = "Colorear pilas de perjuicios",
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["esES"] = {
|
|||||||
["Enable Mana Ticks"] = "Activar el indicador de pulsos del maná",
|
["Enable Mana Ticks"] = "Activar el indicador de pulsos del maná",
|
||||||
["Enable Micro Bar"] = "Activar microbarra",
|
["Enable Micro Bar"] = "Activar microbarra",
|
||||||
["Enable Mouselook With Right Click"] = "Mirar usando el puntero con clic derecho",
|
["Enable Mouselook With Right Click"] = "Mirar usando el puntero con clic derecho",
|
||||||
["Enable Mouseover Tooltip"] = "Activar la descripción emergente al pasar el puntero",
|
|
||||||
["Enable Movable Bags"] = "Permitir mover las bolsas",
|
["Enable Movable Bags"] = "Permitir mover las bolsas",
|
||||||
["Enable Offscreen Frame Positions"] = "Permitir mover los marcos fuera de la pantalla",
|
["Enable Offscreen Frame Positions"] = "Permitir mover los marcos fuera de la pantalla",
|
||||||
["Enable Overlap"] = "Permitir superposición",
|
["Enable Overlap"] = "Permitir superposición",
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Encode"] = "Codificar",
|
["Encode"] = "Codificar",
|
||||||
["Ended"] = "Terminado",
|
["Ended"] = "Terminado",
|
||||||
["Energy Color"] = "Color de energía",
|
["Energy Color"] = "Color de energía",
|
||||||
|
["Equipped"] = "Equipado",
|
||||||
["Equipped Item Color"] = "Color del objeto equipado",
|
["Equipped Item Color"] = "Color del objeto equipado",
|
||||||
["Estimate Debuffs"] = "Estimar los perjuicios",
|
["Estimate Debuffs"] = "Estimar los perjuicios",
|
||||||
["Estimate Enemy Health Points"] = "Estimar los puntos de salud del enemigo",
|
["Estimate Enemy Health Points"] = "Estimar los puntos de salud del enemigo",
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = nil,
|
["Overwrite If Unit Is Attacking Others"] = nil,
|
||||||
["Overwrite If Unit Is Attacking You"] = nil,
|
["Overwrite If Unit Is Attacking You"] = nil,
|
||||||
["Overwrite If Unit Is Casting"] = nil,
|
["Overwrite If Unit Is Casting"] = nil,
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = "Paginable",
|
["Pageable"] = "Paginable",
|
||||||
["Paging Actionbar"] = "Paginando la barra de acción",
|
["Paging Actionbar"] = "Paginando la barra de acción",
|
||||||
["Panel"] = "Panel",
|
["Panel"] = "Panel",
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["esES"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = "Espaciado del marco de banda",
|
["Raid Padding"] = "Espaciado del marco de banda",
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = "Aleatorio",
|
["Random"] = "Aleatorio",
|
||||||
["Random Roll Announcement Rarity"] = "Anuncio para tirar los dados aleatoriamente",
|
["Random Roll Announcement Rarity"] = "Anuncio para tirar los dados aleatoriamente",
|
||||||
["Random Rolling"] = "Tirar los dados aleatoriamente",
|
["Random Rolling"] = "Tirar los dados aleatoriamente",
|
||||||
["Range Based Hunter Paging"] = "Paginado de alcance para cazadores",
|
["Range Based Hunter Paging"] = "Paginado de alcance para cazadores",
|
||||||
["Range Check Interval"] = "Intervalo de comprobación de alcance",
|
|
||||||
["Rank"] = "Rango",
|
["Rank"] = "Rango",
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = "Borde rojo en unidades enemigas",
|
["Red Border On Enemy Units"] = "Borde rojo en unidades enemigas",
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = nil,
|
["Regional Settings"] = nil,
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Show Description"] = "Mostrar descripción",
|
["Show Description"] = "Mostrar descripción",
|
||||||
["Show Dispel Indicators"] = "Mostrar indicadores para disipar",
|
["Show Dispel Indicators"] = "Mostrar indicadores para disipar",
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = "Mostrar la duración dentro del beneficios",
|
["Show Duration Inside Buff"] = "Mostrar la duración dentro del beneficios",
|
||||||
["Show Empty Buttons"] = "Mostrar botones vacíos",
|
["Show Empty Buttons"] = "Mostrar botones vacíos",
|
||||||
["Show FPS and Latency Colors"] = "Mostrar FPS y colores de latencia",
|
["Show FPS and Latency Colors"] = "Mostrar FPS y colores de latencia",
|
||||||
@@ -738,6 +743,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Show Required Questitem Count"] = "Muestra el número requerido de objetos de misión",
|
["Show Required Questitem Count"] = "Muestra el número requerido de objetos de misión",
|
||||||
["Show Resting"] = "Mostrar descanso",
|
["Show Resting"] = "Mostrar descanso",
|
||||||
["Show Self In Group Frames"] = "Mostrar a sí mismo en marcos de grupo",
|
["Show Self In Group Frames"] = "Mostrar a sí mismo en marcos de grupo",
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = "Mostrar icono de hechizo",
|
["Show Spell Icon"] = "Mostrar icono de hechizo",
|
||||||
["Show Spell Name"] = nil,
|
["Show Spell Name"] = nil,
|
||||||
["Show Stacks"] = "Mostrar pilas",
|
["Show Stacks"] = "Mostrar pilas",
|
||||||
@@ -782,6 +788,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Target Castbar"] = "Barra de lanzamiento del objetivo",
|
["Target Castbar"] = "Barra de lanzamiento del objetivo",
|
||||||
["Target Debuff Bar"] = "Barra de perjuicios del objetivo",
|
["Target Debuff Bar"] = "Barra de perjuicios del objetivo",
|
||||||
["Target Nameplate Zoom Factor"] = "Factor de zoom de la placa de nombre del objetivo",
|
["Target Nameplate Zoom Factor"] = "Factor de zoom de la placa de nombre del objetivo",
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = "Objetivo-Objetivo",
|
["Target-Target"] = "Objetivo-Objetivo",
|
||||||
["Target-Target-Target"] = "Objetivo-Objetivo-Objetivo",
|
["Target-Target-Target"] = "Objetivo-Objetivo-Objetivo",
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -814,6 +821,7 @@ pfUI_translation["esES"] = {
|
|||||||
["Top Actionbar"] = "Barra de acción superior",
|
["Top Actionbar"] = "Barra de acción superior",
|
||||||
["Top Left"] = "Superior derecha",
|
["Top Left"] = "Superior derecha",
|
||||||
["Top Right"] = "Superior izquierda",
|
["Top Right"] = "Superior izquierda",
|
||||||
|
["Total"] = "Total",
|
||||||
["Total Gold"] = "Oro Total",
|
["Total Gold"] = "Oro Total",
|
||||||
["Totem Direction"] = "Dirección del tótem",
|
["Totem Direction"] = "Dirección del tótem",
|
||||||
["Totem Icons"] = "Iconos de los tótems",
|
["Totem Icons"] = "Iconos de los tótems",
|
||||||
@@ -876,7 +884,6 @@ pfUI_translation["esES"] = {
|
|||||||
["XP Percentage"] = "Porcentaje de exp.",
|
["XP Percentage"] = "Porcentaje de exp.",
|
||||||
["Yellow Border On Neutral Units"] = "Borde amarillo en unidades neutrales",
|
["Yellow Border On Neutral Units"] = "Borde amarillo en unidades neutrales",
|
||||||
["Yes"] = "Sí",
|
["Yes"] = "Sí",
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = "Obtienes",
|
["You got"] = "Obtienes",
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "Ahora su interfaz está configurada.\n\nPara la configuración avanzada, abra la configuración |cff33ffccpf|rUI por el menú de escape o escriba \"|cffffffaa/pfui|r\" en el chat.",
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "Ahora su interfaz está configurada.\n\nPara la configuración avanzada, abra la configuración |cff33ffccpf|rUI por el menú de escape o escriba \"|cffffffaa/pfui|r\" en el chat.",
|
||||||
["Your items have been repaired for"] = "Tus objetos se han reparado por",
|
["Your items have been repaired for"] = "Tus objetos se han reparado por",
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["frFR"] = {
|
|||||||
["Always Show Item Comparison"] = "Toujours afficher la comparaison d'objet",
|
["Always Show Item Comparison"] = "Toujours afficher la comparaison d'objet",
|
||||||
["Always Show On Target Units"] = "Toujours montrer sur la cible",
|
["Always Show On Target Units"] = "Toujours montrer sur la cible",
|
||||||
["Always Show On Units With Missing HP"] = "Toujours montrer sur les cibles avec de la vie manquante",
|
["Always Show On Units With Missing HP"] = "Toujours montrer sur les cibles avec de la vie manquante",
|
||||||
["Always Show Self In Raid Frames"] = "Toujours montrer soi-même dans le cadre de raid",
|
|
||||||
["Always Use 2D Portraits"] = "Toujours utiliser les portraits 2D",
|
["Always Use 2D Portraits"] = "Toujours utiliser les portraits 2D",
|
||||||
["Ammo Counter"] = "Compteur de munitions",
|
["Ammo Counter"] = "Compteur de munitions",
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["frFR"] = {
|
|||||||
["Auto Sell Grey Items"] = "Vente automatique des objets gris",
|
["Auto Sell Grey Items"] = "Vente automatique des objets gris",
|
||||||
["Average Per Hour"] = "Moyenne par heure",
|
["Average Per Hour"] = "Moyenne par heure",
|
||||||
["Background Color"] = "Couleur de l'arrière-plan",
|
["Background Color"] = "Couleur de l'arrière-plan",
|
||||||
|
["Bags"] = "Sacs",
|
||||||
["Bags & Bank"] = "Sacs et Banque",
|
["Bags & Bank"] = "Sacs et Banque",
|
||||||
["Bags Border Size"] = "Taille de la bordure des Sacs",
|
["Bags Border Size"] = "Taille de la bordure des Sacs",
|
||||||
["Bagslots Per Row"] = "Emplacements des sacs par rangée",
|
["Bagslots Per Row"] = "Emplacements des sacs par rangée",
|
||||||
["Bagspace"] = "Place libre des sacs",
|
["Bagspace"] = "Place libre des sacs",
|
||||||
|
["Bank"] = "Banque",
|
||||||
["Banker"] = "Banquier",
|
["Banker"] = "Banquier",
|
||||||
["Bankslots Per Row"] = "Emplacements de la banque par rangée",
|
["Bankslots Per Row"] = "Emplacements de la banque par rangée",
|
||||||
["Bar Background"] = "Arrière plan de la barre",
|
["Bar Background"] = "Arrière plan de la barre",
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Click Casting"] = "Clique sur le lancement de sort",
|
["Click Casting"] = "Clique sur le lancement de sort",
|
||||||
["Clock"] = "Horloge",
|
["Clock"] = "Horloge",
|
||||||
["Close"] = "Fermer",
|
["Close"] = "Fermer",
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = "Couleur des l'empilements des Améliorations",
|
["Color Buff Stacks"] = "Couleur des l'empilements des Améliorations",
|
||||||
["Color Debuff Stacks"] = "Couleur de l'empilements de Affaiblissements",
|
["Color Debuff Stacks"] = "Couleur de l'empilements de Affaiblissements",
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["frFR"] = {
|
|||||||
["Enable Mana Ticks"] = "Activer les Ticks de mana",
|
["Enable Mana Ticks"] = "Activer les Ticks de mana",
|
||||||
["Enable Micro Bar"] = "Activer la barre des menus miniature",
|
["Enable Micro Bar"] = "Activer la barre des menus miniature",
|
||||||
["Enable Mouselook With Right Click"] = "Activer le déplacement de la caméra avec le clic droit",
|
["Enable Mouselook With Right Click"] = "Activer le déplacement de la caméra avec le clic droit",
|
||||||
["Enable Mouseover Tooltip"] = "Activer l'infobulle au passage de la souris",
|
|
||||||
["Enable Movable Bags"] = "Activer les sacs mobiles",
|
["Enable Movable Bags"] = "Activer les sacs mobiles",
|
||||||
["Enable Offscreen Frame Positions"] = "Activer le positionnement des cadres en dehors de l'écran",
|
["Enable Offscreen Frame Positions"] = "Activer le positionnement des cadres en dehors de l'écran",
|
||||||
["Enable Overlap"] = "Activer la superposition",
|
["Enable Overlap"] = "Activer la superposition",
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Encode"] = "Encoder",
|
["Encode"] = "Encoder",
|
||||||
["Ended"] = "Terminé",
|
["Ended"] = "Terminé",
|
||||||
["Energy Color"] = "Couleur de l'energie",
|
["Energy Color"] = "Couleur de l'energie",
|
||||||
|
["Equipped"] = "Équipé",
|
||||||
["Equipped Item Color"] = "Couleur de l'objet équipé",
|
["Equipped Item Color"] = "Couleur de l'objet équipé",
|
||||||
["Estimate Debuffs"] = "Estimer les Affaiblissements",
|
["Estimate Debuffs"] = "Estimer les Affaiblissements",
|
||||||
["Estimate Enemy Health Points"] = "Estimer les points de vie ennemis",
|
["Estimate Enemy Health Points"] = "Estimer les points de vie ennemis",
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = nil,
|
["Overwrite If Unit Is Attacking Others"] = nil,
|
||||||
["Overwrite If Unit Is Attacking You"] = nil,
|
["Overwrite If Unit Is Attacking You"] = nil,
|
||||||
["Overwrite If Unit Is Casting"] = nil,
|
["Overwrite If Unit Is Casting"] = nil,
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = "Pageable",
|
["Pageable"] = "Pageable",
|
||||||
["Paging Actionbar"] = "Barre d'action de pagination",
|
["Paging Actionbar"] = "Barre d'action de pagination",
|
||||||
["Panel"] = "Panneau",
|
["Panel"] = "Panneau",
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["frFR"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = "Remplissage du Raid",
|
["Raid Padding"] = "Remplissage du Raid",
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = "Aléatoire",
|
["Random"] = "Aléatoire",
|
||||||
["Random Roll Announcement Rarity"] = "Rareté des annonces des jets de dés aléatoires",
|
["Random Roll Announcement Rarity"] = "Rareté des annonces des jets de dés aléatoires",
|
||||||
["Random Rolling"] = "Lancer de dés aléatoires",
|
["Random Rolling"] = "Lancer de dés aléatoires",
|
||||||
["Range Based Hunter Paging"] = "Pagination de distance basée sur le chasseur",
|
["Range Based Hunter Paging"] = "Pagination de distance basée sur le chasseur",
|
||||||
["Range Check Interval"] = "Intervalle de vérification de la distance",
|
|
||||||
["Rank"] = nil,
|
["Rank"] = nil,
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = "Bordure rouge sur les unités ennemies",
|
["Red Border On Enemy Units"] = "Bordure rouge sur les unités ennemies",
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = nil,
|
["Regional Settings"] = nil,
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Show Description"] = "Afficher les descriptions",
|
["Show Description"] = "Afficher les descriptions",
|
||||||
["Show Dispel Indicators"] = "Afficher les indicateurs de dissipation",
|
["Show Dispel Indicators"] = "Afficher les indicateurs de dissipation",
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = "Afficher la durée à l'intérieur des améliorations",
|
["Show Duration Inside Buff"] = "Afficher la durée à l'intérieur des améliorations",
|
||||||
["Show Empty Buttons"] = "Afficher les boutons vides",
|
["Show Empty Buttons"] = "Afficher les boutons vides",
|
||||||
["Show FPS and Latency Colors"] = nil,
|
["Show FPS and Latency Colors"] = nil,
|
||||||
@@ -738,6 +743,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Show Required Questitem Count"] = nil,
|
["Show Required Questitem Count"] = nil,
|
||||||
["Show Resting"] = "Afficher au repos",
|
["Show Resting"] = "Afficher au repos",
|
||||||
["Show Self In Group Frames"] = "S'afficher dans les cadres de groupe",
|
["Show Self In Group Frames"] = "S'afficher dans les cadres de groupe",
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = "Afficher l'icone des sorts",
|
["Show Spell Icon"] = "Afficher l'icone des sorts",
|
||||||
["Show Spell Name"] = nil,
|
["Show Spell Name"] = nil,
|
||||||
["Show Stacks"] = "Afficher les empilements",
|
["Show Stacks"] = "Afficher les empilements",
|
||||||
@@ -782,6 +788,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Target Castbar"] = "Barre d'incantation de la cible",
|
["Target Castbar"] = "Barre d'incantation de la cible",
|
||||||
["Target Debuff Bar"] = "Barre des affaiblissements de la cible",
|
["Target Debuff Bar"] = "Barre des affaiblissements de la cible",
|
||||||
["Target Nameplate Zoom Factor"] = "Facteur de zoom du Nameplate de la cible",
|
["Target Nameplate Zoom Factor"] = "Facteur de zoom du Nameplate de la cible",
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = "Cible de la cible",
|
["Target-Target"] = "Cible de la cible",
|
||||||
["Target-Target-Target"] = "Cible de la cible de la cible",
|
["Target-Target-Target"] = "Cible de la cible de la cible",
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -814,6 +821,7 @@ pfUI_translation["frFR"] = {
|
|||||||
["Top Actionbar"] = "Barre d'action supérieure",
|
["Top Actionbar"] = "Barre d'action supérieure",
|
||||||
["Top Left"] = "Haut Gauche",
|
["Top Left"] = "Haut Gauche",
|
||||||
["Top Right"] = "Haut Droit",
|
["Top Right"] = "Haut Droit",
|
||||||
|
["Total"] = "Total",
|
||||||
["Total Gold"] = "Or Total",
|
["Total Gold"] = "Or Total",
|
||||||
["Totem Direction"] = "Direction des totems",
|
["Totem Direction"] = "Direction des totems",
|
||||||
["Totem Icons"] = "Icones des totems",
|
["Totem Icons"] = "Icones des totems",
|
||||||
@@ -876,7 +884,6 @@ pfUI_translation["frFR"] = {
|
|||||||
["XP Percentage"] = "Pourcentage de la barre d'expérience",
|
["XP Percentage"] = "Pourcentage de la barre d'expérience",
|
||||||
["Yellow Border On Neutral Units"] = "Bordure jaune sur les unités neutres",
|
["Yellow Border On Neutral Units"] = "Bordure jaune sur les unités neutres",
|
||||||
["Yes"] = "Oui",
|
["Yes"] = "Oui",
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = "Vous avez",
|
["You got"] = "Vous avez",
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||||
["Your items have been repaired for"] = "Vos objets ont été réparés pour",
|
["Your items have been repaired for"] = "Vos objets ont été réparés pour",
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["koKR"] = {
|
|||||||
["Always Show Item Comparison"] = "항상 착용 장비와 비교 표시",
|
["Always Show Item Comparison"] = "항상 착용 장비와 비교 표시",
|
||||||
["Always Show On Target Units"] = nil,
|
["Always Show On Target Units"] = nil,
|
||||||
["Always Show On Units With Missing HP"] = nil,
|
["Always Show On Units With Missing HP"] = nil,
|
||||||
["Always Show Self In Raid Frames"] = nil,
|
|
||||||
["Always Use 2D Portraits"] = "항상 2D초상화 사용",
|
["Always Use 2D Portraits"] = "항상 2D초상화 사용",
|
||||||
["Ammo Counter"] = "탄약 갯수",
|
["Ammo Counter"] = "탄약 갯수",
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["koKR"] = {
|
|||||||
["Auto Sell Grey Items"] = "회색아이템 자동 판매",
|
["Auto Sell Grey Items"] = "회색아이템 자동 판매",
|
||||||
["Average Per Hour"] = nil,
|
["Average Per Hour"] = nil,
|
||||||
["Background Color"] = "백그라운드 색상",
|
["Background Color"] = "백그라운드 색상",
|
||||||
|
["Bags"] = "가방",
|
||||||
["Bags & Bank"] = "가방&은행",
|
["Bags & Bank"] = "가방&은행",
|
||||||
["Bags Border Size"] = "가방 테두리 크기",
|
["Bags Border Size"] = "가방 테두리 크기",
|
||||||
["Bagslots Per Row"] = nil,
|
["Bagslots Per Row"] = nil,
|
||||||
["Bagspace"] = "가방 공간",
|
["Bagspace"] = "가방 공간",
|
||||||
|
["Bank"] = "은행",
|
||||||
["Banker"] = nil,
|
["Banker"] = nil,
|
||||||
["Bankslots Per Row"] = nil,
|
["Bankslots Per Row"] = nil,
|
||||||
["Bar Background"] = nil,
|
["Bar Background"] = nil,
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Click Casting"] = nil,
|
["Click Casting"] = nil,
|
||||||
["Clock"] = "시계",
|
["Clock"] = "시계",
|
||||||
["Close"] = "닫기",
|
["Close"] = "닫기",
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = nil,
|
["Color Buff Stacks"] = nil,
|
||||||
["Color Debuff Stacks"] = nil,
|
["Color Debuff Stacks"] = nil,
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["koKR"] = {
|
|||||||
["Enable Mana Ticks"] = nil,
|
["Enable Mana Ticks"] = nil,
|
||||||
["Enable Micro Bar"] = "미니바 보기(블리자드 마이크로바)",
|
["Enable Micro Bar"] = "미니바 보기(블리자드 마이크로바)",
|
||||||
["Enable Mouselook With Right Click"] = "오른쪽 클릭 Mouselook 사용",
|
["Enable Mouselook With Right Click"] = "오른쪽 클릭 Mouselook 사용",
|
||||||
["Enable Mouseover Tooltip"] = nil,
|
|
||||||
["Enable Movable Bags"] = nil,
|
["Enable Movable Bags"] = nil,
|
||||||
["Enable Offscreen Frame Positions"] = "오프스크린 프레임 위치 활성화",
|
["Enable Offscreen Frame Positions"] = "오프스크린 프레임 위치 활성화",
|
||||||
["Enable Overlap"] = "겹쳐서 표시",
|
["Enable Overlap"] = "겹쳐서 표시",
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Encode"] = nil,
|
["Encode"] = nil,
|
||||||
["Ended"] = nil,
|
["Ended"] = nil,
|
||||||
["Energy Color"] = nil,
|
["Energy Color"] = nil,
|
||||||
|
["Equipped"] = "착용 중",
|
||||||
["Equipped Item Color"] = nil,
|
["Equipped Item Color"] = nil,
|
||||||
["Estimate Debuffs"] = nil,
|
["Estimate Debuffs"] = nil,
|
||||||
["Estimate Enemy Health Points"] = nil,
|
["Estimate Enemy Health Points"] = nil,
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = nil,
|
["Overwrite If Unit Is Attacking Others"] = nil,
|
||||||
["Overwrite If Unit Is Attacking You"] = nil,
|
["Overwrite If Unit Is Attacking You"] = nil,
|
||||||
["Overwrite If Unit Is Casting"] = nil,
|
["Overwrite If Unit Is Casting"] = nil,
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = nil,
|
["Pageable"] = nil,
|
||||||
["Paging Actionbar"] = nil,
|
["Paging Actionbar"] = nil,
|
||||||
["Panel"] = "패널",
|
["Panel"] = "패널",
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["koKR"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = nil,
|
["Raid Padding"] = nil,
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = nil,
|
["Random"] = nil,
|
||||||
["Random Roll Announcement Rarity"] = nil,
|
["Random Roll Announcement Rarity"] = nil,
|
||||||
["Random Rolling"] = nil,
|
["Random Rolling"] = nil,
|
||||||
["Range Based Hunter Paging"] = nil,
|
["Range Based Hunter Paging"] = nil,
|
||||||
["Range Check Interval"] = nil,
|
|
||||||
["Rank"] = nil,
|
["Rank"] = nil,
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = nil,
|
["Red Border On Enemy Units"] = nil,
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = nil,
|
["Regional Settings"] = nil,
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Show Description"] = nil,
|
["Show Description"] = nil,
|
||||||
["Show Dispel Indicators"] = nil,
|
["Show Dispel Indicators"] = nil,
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = nil,
|
["Show Duration Inside Buff"] = nil,
|
||||||
["Show Empty Buttons"] = nil,
|
["Show Empty Buttons"] = nil,
|
||||||
["Show FPS and Latency Colors"] = nil,
|
["Show FPS and Latency Colors"] = nil,
|
||||||
@@ -738,6 +743,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Show Required Questitem Count"] = nil,
|
["Show Required Questitem Count"] = nil,
|
||||||
["Show Resting"] = nil,
|
["Show Resting"] = nil,
|
||||||
["Show Self In Group Frames"] = nil,
|
["Show Self In Group Frames"] = nil,
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = nil,
|
["Show Spell Icon"] = nil,
|
||||||
["Show Spell Name"] = nil,
|
["Show Spell Name"] = nil,
|
||||||
["Show Stacks"] = nil,
|
["Show Stacks"] = nil,
|
||||||
@@ -782,6 +788,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Target Castbar"] = nil,
|
["Target Castbar"] = nil,
|
||||||
["Target Debuff Bar"] = nil,
|
["Target Debuff Bar"] = nil,
|
||||||
["Target Nameplate Zoom Factor"] = nil,
|
["Target Nameplate Zoom Factor"] = nil,
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = "대상-대상",
|
["Target-Target"] = "대상-대상",
|
||||||
["Target-Target-Target"] = nil,
|
["Target-Target-Target"] = nil,
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -814,6 +821,7 @@ pfUI_translation["koKR"] = {
|
|||||||
["Top Actionbar"] = nil,
|
["Top Actionbar"] = nil,
|
||||||
["Top Left"] = nil,
|
["Top Left"] = nil,
|
||||||
["Top Right"] = nil,
|
["Top Right"] = nil,
|
||||||
|
["Total"] = "총",
|
||||||
["Total Gold"] = "총 금",
|
["Total Gold"] = "총 금",
|
||||||
["Totem Direction"] = nil,
|
["Totem Direction"] = nil,
|
||||||
["Totem Icons"] = nil,
|
["Totem Icons"] = nil,
|
||||||
@@ -876,7 +884,6 @@ pfUI_translation["koKR"] = {
|
|||||||
["XP Percentage"] = "경험치 퍼센트",
|
["XP Percentage"] = "경험치 퍼센트",
|
||||||
["Yellow Border On Neutral Units"] = nil,
|
["Yellow Border On Neutral Units"] = nil,
|
||||||
["Yes"] = nil,
|
["Yes"] = nil,
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = nil,
|
["You got"] = nil,
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||||
["Your items have been repaired for"] = nil,
|
["Your items have been repaired for"] = nil,
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Always Show Item Comparison"] = "Всегда показывать сравнение предметов",
|
["Always Show Item Comparison"] = "Всегда показывать сравнение предметов",
|
||||||
["Always Show On Target Units"] = "Всегда показывать над выбранной целью",
|
["Always Show On Target Units"] = "Всегда показывать над выбранной целью",
|
||||||
["Always Show On Units With Missing HP"] = "Всегда показывать над целями с неполным здоровьем",
|
["Always Show On Units With Missing HP"] = "Всегда показывать над целями с неполным здоровьем",
|
||||||
["Always Show Self In Raid Frames"] = "Всегда показывать себя в рейде",
|
|
||||||
["Always Use 2D Portraits"] = "Всегда использовать 2D-портреты",
|
["Always Use 2D Portraits"] = "Всегда использовать 2D-портреты",
|
||||||
["Ammo Counter"] = "Счетчик боеприпасов",
|
["Ammo Counter"] = "Счетчик боеприпасов",
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Auto Sell Grey Items"] = "Автоматическая продажа серых предметов",
|
["Auto Sell Grey Items"] = "Автоматическая продажа серых предметов",
|
||||||
["Average Per Hour"] = "Среднее за час",
|
["Average Per Hour"] = "Среднее за час",
|
||||||
["Background Color"] = "Цвет фона",
|
["Background Color"] = "Цвет фона",
|
||||||
|
["Bags"] = "Сумки",
|
||||||
["Bags & Bank"] = "Сумки & Банк",
|
["Bags & Bank"] = "Сумки & Банк",
|
||||||
["Bags Border Size"] = "Размер границы сумок",
|
["Bags Border Size"] = "Размер границы сумок",
|
||||||
["Bagslots Per Row"] = "Количество ячеек в сумке на строку",
|
["Bagslots Per Row"] = "Количество ячеек в сумке на строку",
|
||||||
["Bagspace"] = "Место в сумках",
|
["Bagspace"] = "Место в сумках",
|
||||||
|
["Bank"] = "Банк",
|
||||||
["Banker"] = "Банкир",
|
["Banker"] = "Банкир",
|
||||||
["Bankslots Per Row"] = "Количество ячеек в банке на строку",
|
["Bankslots Per Row"] = "Количество ячеек в банке на строку",
|
||||||
["Bar Background"] = "Фон панели",
|
["Bar Background"] = "Фон панели",
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Click Casting"] = "Каст по нажатию",
|
["Click Casting"] = "Каст по нажатию",
|
||||||
["Clock"] = "Часы",
|
["Clock"] = "Часы",
|
||||||
["Close"] = "Закрыть",
|
["Close"] = "Закрыть",
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = "Цвет стаков баффа",
|
["Color Buff Stacks"] = "Цвет стаков баффа",
|
||||||
["Color Debuff Stacks"] = "Цвет стаков дебаффа",
|
["Color Debuff Stacks"] = "Цвет стаков дебаффа",
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Enable Mana Ticks"] = "Включить восполнение маны",
|
["Enable Mana Ticks"] = "Включить восполнение маны",
|
||||||
["Enable Micro Bar"] = "Включить панель микро меню",
|
["Enable Micro Bar"] = "Включить панель микро меню",
|
||||||
["Enable Mouselook With Right Click"] = "Включить нажатие правой кнопки мыши на индикаторе здоровья",
|
["Enable Mouselook With Right Click"] = "Включить нажатие правой кнопки мыши на индикаторе здоровья",
|
||||||
["Enable Mouseover Tooltip"] = "Включить подсказку при наведении мыши",
|
|
||||||
["Enable Movable Bags"] = "Включить подвижные сумки",
|
["Enable Movable Bags"] = "Включить подвижные сумки",
|
||||||
["Enable Offscreen Frame Positions"] = "Включить расположение окон за пределами экрана",
|
["Enable Offscreen Frame Positions"] = "Включить расположение окон за пределами экрана",
|
||||||
["Enable Overlap"] = "Включить перекрытие",
|
["Enable Overlap"] = "Включить перекрытие",
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Encode"] = "Кодировать",
|
["Encode"] = "Кодировать",
|
||||||
["Ended"] = "Окончание",
|
["Ended"] = "Окончание",
|
||||||
["Energy Color"] = "Цвет энергии",
|
["Energy Color"] = "Цвет энергии",
|
||||||
|
["Equipped"] = "Экипировано",
|
||||||
["Equipped Item Color"] = "Цвет экипированных предметов",
|
["Equipped Item Color"] = "Цвет экипированных предметов",
|
||||||
["Estimate Debuffs"] = "Оценка дебафов",
|
["Estimate Debuffs"] = "Оценка дебафов",
|
||||||
["Estimate Enemy Health Points"] = "Оценка очков здоровья врага",
|
["Estimate Enemy Health Points"] = "Оценка очков здоровья врага",
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = nil,
|
["Overwrite If Unit Is Attacking Others"] = nil,
|
||||||
["Overwrite If Unit Is Attacking You"] = nil,
|
["Overwrite If Unit Is Attacking You"] = nil,
|
||||||
["Overwrite If Unit Is Casting"] = nil,
|
["Overwrite If Unit Is Casting"] = nil,
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = "Прокрутка страниц",
|
["Pageable"] = "Прокрутка страниц",
|
||||||
["Paging Actionbar"] = "Прокрутка панелей",
|
["Paging Actionbar"] = "Прокрутка панелей",
|
||||||
["Panel"] = "Панель",
|
["Panel"] = "Панель",
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = "Отступ рейда",
|
["Raid Padding"] = "Отступ рейда",
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = "Случайно",
|
["Random"] = "Случайно",
|
||||||
["Random Roll Announcement Rarity"] = "Оповещение случайного броска для качества предмета",
|
["Random Roll Announcement Rarity"] = "Оповещение случайного броска для качества предмета",
|
||||||
["Random Rolling"] = "Случайный бросок костей для",
|
["Random Rolling"] = "Случайный бросок костей для",
|
||||||
["Range Based Hunter Paging"] = "[|cffA9D271Охотник|r] Переключение страниц на основе диапазона",
|
["Range Based Hunter Paging"] = "[|cffA9D271Охотник|r] Переключение страниц на основе диапазона",
|
||||||
["Range Check Interval"] = "Интервал проверки диапазона",
|
|
||||||
["Rank"] = "Ранг",
|
["Rank"] = "Ранг",
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = "Красные границы вражеских юнитов",
|
["Red Border On Enemy Units"] = "Красные границы вражеских юнитов",
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = "Региональные настройки",
|
["Regional Settings"] = "Региональные настройки",
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Show Description"] = "Показать описание",
|
["Show Description"] = "Показать описание",
|
||||||
["Show Dispel Indicators"] = "Показать индикаторы рассеивания",
|
["Show Dispel Indicators"] = "Показать индикаторы рассеивания",
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = "Показать продолжительность внутри баффа",
|
["Show Duration Inside Buff"] = "Показать продолжительность внутри баффа",
|
||||||
["Show Empty Buttons"] = "Показать пустые кнопки",
|
["Show Empty Buttons"] = "Показать пустые кнопки",
|
||||||
["Show FPS and Latency Colors"] = "Показать частоту кадров и задержку в цвете",
|
["Show FPS and Latency Colors"] = "Показать частоту кадров и задержку в цвете",
|
||||||
@@ -738,6 +743,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Show Required Questitem Count"] = "Показать необходимое количество предметов для задания",
|
["Show Required Questitem Count"] = "Показать необходимое количество предметов для задания",
|
||||||
["Show Resting"] = "Показать иконку отдыха",
|
["Show Resting"] = "Показать иконку отдыха",
|
||||||
["Show Self In Group Frames"] = "Показать себя в окне группы",
|
["Show Self In Group Frames"] = "Показать себя в окне группы",
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = "Показать иконку заклинания",
|
["Show Spell Icon"] = "Показать иконку заклинания",
|
||||||
["Show Spell Name"] = "Показать название заклинания",
|
["Show Spell Name"] = "Показать название заклинания",
|
||||||
["Show Stacks"] = "Показать стаки",
|
["Show Stacks"] = "Показать стаки",
|
||||||
@@ -782,6 +788,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Target Castbar"] = "Панель применения цели",
|
["Target Castbar"] = "Панель применения цели",
|
||||||
["Target Debuff Bar"] = "Панель дебаффов цели",
|
["Target Debuff Bar"] = "Панель дебаффов цели",
|
||||||
["Target Nameplate Zoom Factor"] = "Коэффициент увеличения индикатора здоровья цели",
|
["Target Nameplate Zoom Factor"] = "Коэффициент увеличения индикатора здоровья цели",
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = "Цель цели",
|
["Target-Target"] = "Цель цели",
|
||||||
["Target-Target-Target"] = "Цель цели цели",
|
["Target-Target-Target"] = "Цель цели цели",
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -814,6 +821,7 @@ pfUI_translation["ruRU"] = {
|
|||||||
["Top Actionbar"] = "Верхняя",
|
["Top Actionbar"] = "Верхняя",
|
||||||
["Top Left"] = "Сверху слева",
|
["Top Left"] = "Сверху слева",
|
||||||
["Top Right"] = "Сверху справа",
|
["Top Right"] = "Сверху справа",
|
||||||
|
["Total"] = "Всего",
|
||||||
["Total Gold"] = "Всего золота",
|
["Total Gold"] = "Всего золота",
|
||||||
["Totem Direction"] = "Направление тотемов",
|
["Totem Direction"] = "Направление тотемов",
|
||||||
["Totem Icons"] = "Иконки тотемов",
|
["Totem Icons"] = "Иконки тотемов",
|
||||||
@@ -876,7 +884,6 @@ pfUI_translation["ruRU"] = {
|
|||||||
["XP Percentage"] = "Процент опыта",
|
["XP Percentage"] = "Процент опыта",
|
||||||
["Yellow Border On Neutral Units"] = "Желтые границы на нейтральных юнитах",
|
["Yellow Border On Neutral Units"] = "Желтые границы на нейтральных юнитах",
|
||||||
["Yes"] = "Да",
|
["Yes"] = "Да",
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = "Вы получили",
|
["You got"] = "Вы получили",
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "Теперь ваш интерфейс настроен.\n\nДля расширенной настройки откройте \"Настройки |cff33ffccpf|rUI\" с помощью escape меню или введите \"|cffffffaa/pfui|r\" в чат.\n\nЖелаю хорошего путешествия!\n\n|cffaaaaaa- Shagu",
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "Теперь ваш интерфейс настроен.\n\nДля расширенной настройки откройте \"Настройки |cff33ffccpf|rUI\" с помощью escape меню или введите \"|cffffffaa/pfui|r\" в чат.\n\nЖелаю хорошего путешествия!\n\n|cffaaaaaa- Shagu",
|
||||||
["Your items have been repaired for"] = "Ваши предметы были отремонтированы за",
|
["Your items have been repaired for"] = "Ваши предметы были отремонтированы за",
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Always Show Item Comparison"] = "始终显示装备比较(或按SHIFT键)",
|
["Always Show Item Comparison"] = "始终显示装备比较(或按SHIFT键)",
|
||||||
["Always Show On Target Units"] = "始终在目标单位上显示",
|
["Always Show On Target Units"] = "始终在目标单位上显示",
|
||||||
["Always Show On Units With Missing HP"] = "始终在未满血单位上显示",
|
["Always Show On Units With Missing HP"] = "始终在未满血单位上显示",
|
||||||
["Always Show Self In Raid Frames"] = "始终在团队框架中显示自己",
|
|
||||||
["Always Use 2D Portraits"] = "始终使用2D头像",
|
["Always Use 2D Portraits"] = "始终使用2D头像",
|
||||||
["Ammo Counter"] = "弹药数量",
|
["Ammo Counter"] = "弹药数量",
|
||||||
["Anchor Bags Above Chat"] = "将背包锚定在聊天框上方",
|
["Anchor Bags Above Chat"] = "将背包锚定在聊天框上方",
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Auto Sell Grey Items"] = "自动贩卖灰色物品",
|
["Auto Sell Grey Items"] = "自动贩卖灰色物品",
|
||||||
["Average Per Hour"] = "平均每小时",
|
["Average Per Hour"] = "平均每小时",
|
||||||
["Background Color"] = "背景颜色",
|
["Background Color"] = "背景颜色",
|
||||||
|
["Bags"] = "背包",
|
||||||
["Bags & Bank"] = "背包和银行",
|
["Bags & Bank"] = "背包和银行",
|
||||||
["Bags Border Size"] = "背包边框大小",
|
["Bags Border Size"] = "背包边框大小",
|
||||||
["Bagslots Per Row"] = "每行包裹槽数量",
|
["Bagslots Per Row"] = "每行包裹槽数量",
|
||||||
["Bagspace"] = "背包空间",
|
["Bagspace"] = "背包空间",
|
||||||
|
["Bank"] = "银行",
|
||||||
["Banker"] = "工会银行角色",
|
["Banker"] = "工会银行角色",
|
||||||
["Bankslots Per Row"] = "每行银行槽数量",
|
["Bankslots Per Row"] = "每行银行槽数量",
|
||||||
["Bar Background"] = "动作条背景",
|
["Bar Background"] = "动作条背景",
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Click Casting"] = "点击施法",
|
["Click Casting"] = "点击施法",
|
||||||
["Clock"] = "时间",
|
["Clock"] = "时间",
|
||||||
["Close"] = "关闭",
|
["Close"] = "关闭",
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = "颜色",
|
["Color"] = "颜色",
|
||||||
["Color Buff Stacks"] = "Buff堆叠颜色",
|
["Color Buff Stacks"] = "Buff堆叠颜色",
|
||||||
["Color Debuff Stacks"] = "Debuff堆叠颜色",
|
["Color Debuff Stacks"] = "Debuff堆叠颜色",
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Enable Mana Ticks"] = "显示法力值刻度",
|
["Enable Mana Ticks"] = "显示法力值刻度",
|
||||||
["Enable Micro Bar"] = "显示菜单栏",
|
["Enable Micro Bar"] = "显示菜单栏",
|
||||||
["Enable Mouselook With Right Click"] = "启动右键移动镜头",
|
["Enable Mouselook With Right Click"] = "启动右键移动镜头",
|
||||||
["Enable Mouseover Tooltip"] = "启用鼠标悬停工具提示",
|
|
||||||
["Enable Movable Bags"] = "启用可移动包裹",
|
["Enable Movable Bags"] = "启用可移动包裹",
|
||||||
["Enable Offscreen Frame Positions"] = "允许本插件所有框体移出屏幕边缘",
|
["Enable Offscreen Frame Positions"] = "允许本插件所有框体移出屏幕边缘",
|
||||||
["Enable Overlap"] = "叠加显示",
|
["Enable Overlap"] = "叠加显示",
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Encode"] = "编码",
|
["Encode"] = "编码",
|
||||||
["Ended"] = "结束",
|
["Ended"] = "结束",
|
||||||
["Energy Color"] = "能量值颜色",
|
["Energy Color"] = "能量值颜色",
|
||||||
|
["Equipped"] = "已装备",
|
||||||
["Equipped Item Color"] = "已装备物品颜色",
|
["Equipped Item Color"] = "已装备物品颜色",
|
||||||
["Estimate Debuffs"] = "预估Debuffs",
|
["Estimate Debuffs"] = "预估Debuffs",
|
||||||
["Estimate Enemy Health Points"] = "预估敌人的生命值",
|
["Estimate Enemy Health Points"] = "预估敌人的生命值",
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = "如果单位正在攻击其它单位则变色",
|
["Overwrite If Unit Is Attacking Others"] = "如果单位正在攻击其它单位则变色",
|
||||||
["Overwrite If Unit Is Attacking You"] = "如果单位正在攻击你则变色",
|
["Overwrite If Unit Is Attacking You"] = "如果单位正在攻击你则变色",
|
||||||
["Overwrite If Unit Is Casting"] = "如果单位正在施法则变色",
|
["Overwrite If Unit Is Casting"] = "如果单位正在施法则变色",
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = "可分页",
|
["Pageable"] = "可分页",
|
||||||
["Paging Actionbar"] = "分页动作条",
|
["Paging Actionbar"] = "分页动作条",
|
||||||
["Panel"] = "面板",
|
["Panel"] = "面板",
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = "团队填充",
|
["Raid Padding"] = "团队填充",
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = "给随机玩家",
|
["Random"] = "给随机玩家",
|
||||||
["Random Roll Announcement Rarity"] = "随机Roll点稀有度",
|
["Random Roll Announcement Rarity"] = "随机Roll点稀有度",
|
||||||
["Random Rolling"] = "随机Roll点 物品:",
|
["Random Rolling"] = "随机Roll点 物品:",
|
||||||
["Range Based Hunter Paging"] = "启用基于范围的自动分页[|cff7fff7f猎人|r]",
|
["Range Based Hunter Paging"] = "启用基于范围的自动分页[|cff7fff7f猎人|r]",
|
||||||
["Range Check Interval"] = "范围检查间隔",
|
|
||||||
["Rank"] = "军衔",
|
["Rank"] = "军衔",
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = "显示敌方单位红色边框",
|
["Red Border On Enemy Units"] = "显示敌方单位红色边框",
|
||||||
["Red Name Text On Infight Units"] = "进战斗的单位显示红色姓名",
|
["Red Name Text On Infight Units"] = "进战斗的单位显示红色姓名",
|
||||||
["Regional Settings"] = "区域设置",
|
["Regional Settings"] = "区域设置",
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Show Description"] = "显示描述",
|
["Show Description"] = "显示描述",
|
||||||
["Show Dispel Indicators"] = "显示驱散指示器",
|
["Show Dispel Indicators"] = "显示驱散指示器",
|
||||||
["Show Druid Mana Bar"] = "显示德鲁伊法力条",
|
["Show Druid Mana Bar"] = "显示德鲁伊法力条",
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = "显示持续时间在Buff里面",
|
["Show Duration Inside Buff"] = "显示持续时间在Buff里面",
|
||||||
["Show Empty Buttons"] = "显示空按钮",
|
["Show Empty Buttons"] = "显示空按钮",
|
||||||
["Show FPS and Latency Colors"] = "显示帧数以及延迟颜色",
|
["Show FPS and Latency Colors"] = "显示帧数以及延迟颜色",
|
||||||
@@ -739,6 +744,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Show Required Questitem Count"] = "显示所需的任务物品计数",
|
["Show Required Questitem Count"] = "显示所需的任务物品计数",
|
||||||
["Show Resting"] = "显示休息图标",
|
["Show Resting"] = "显示休息图标",
|
||||||
["Show Self In Group Frames"] = "在队伍框架中显示自己",
|
["Show Self In Group Frames"] = "在队伍框架中显示自己",
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = "显示技能图标",
|
["Show Spell Icon"] = "显示技能图标",
|
||||||
["Show Spell Name"] = "显示技能名称",
|
["Show Spell Name"] = "显示技能名称",
|
||||||
["Show Stacks"] = "显示堆叠",
|
["Show Stacks"] = "显示堆叠",
|
||||||
@@ -783,6 +789,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Target Castbar"] = "目标施法条",
|
["Target Castbar"] = "目标施法条",
|
||||||
["Target Debuff Bar"] = "目标Debuffs条",
|
["Target Debuff Bar"] = "目标Debuffs条",
|
||||||
["Target Nameplate Zoom Factor"] = "目标姓名板缩放系数",
|
["Target Nameplate Zoom Factor"] = "目标姓名板缩放系数",
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = "目标的目标",
|
["Target-Target"] = "目标的目标",
|
||||||
["Target-Target-Target"] = "目标的目标的目标",
|
["Target-Target-Target"] = "目标的目标的目标",
|
||||||
["Text"] = "文本",
|
["Text"] = "文本",
|
||||||
@@ -815,6 +822,7 @@ pfUI_translation["zhCN"] = {
|
|||||||
["Top Actionbar"] = "上方动作条",
|
["Top Actionbar"] = "上方动作条",
|
||||||
["Top Left"] = "左上方",
|
["Top Left"] = "左上方",
|
||||||
["Top Right"] = "右上方",
|
["Top Right"] = "右上方",
|
||||||
|
["Total"] = "总计",
|
||||||
["Total Gold"] = "总黄金",
|
["Total Gold"] = "总黄金",
|
||||||
["Totem Direction"] = "图腾方向",
|
["Totem Direction"] = "图腾方向",
|
||||||
["Totem Icons"] = "图腾图标",
|
["Totem Icons"] = "图腾图标",
|
||||||
@@ -877,7 +885,6 @@ pfUI_translation["zhCN"] = {
|
|||||||
["XP Percentage"] = "经验百分比",
|
["XP Percentage"] = "经验百分比",
|
||||||
["Yellow Border On Neutral Units"] = "显示中立单位黄色边框",
|
["Yellow Border On Neutral Units"] = "显示中立单位黄色边框",
|
||||||
["Yes"] = "是",
|
["Yes"] = "是",
|
||||||
["You gain (.+) Mana from Totemic Recall"] = "你从图腾召回获得了(.+)点法力值",
|
|
||||||
["You got"] = "你已得到",
|
["You got"] = "你已得到",
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "你的界面现在已经完成设置.高级设置请点击游戏菜单或者输入命令/pfui进行设置.祝您游戏愉快",
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "你的界面现在已经完成设置.高级设置请点击游戏菜单或者输入命令/pfui进行设置.祝您游戏愉快",
|
||||||
["Your items have been repaired for"] = "你的物品已经修好了",
|
["Your items have been repaired for"] = "你的物品已经修好了",
|
||||||
|
|||||||
Vendored
+11
-4
@@ -27,7 +27,6 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Always Show Item Comparison"] = "始終顯示裝備比較",
|
["Always Show Item Comparison"] = "始終顯示裝備比較",
|
||||||
["Always Show On Target Units"] = nil,
|
["Always Show On Target Units"] = nil,
|
||||||
["Always Show On Units With Missing HP"] = nil,
|
["Always Show On Units With Missing HP"] = nil,
|
||||||
["Always Show Self In Raid Frames"] = nil,
|
|
||||||
["Always Use 2D Portraits"] = "始終使用2D頭像",
|
["Always Use 2D Portraits"] = "始終使用2D頭像",
|
||||||
["Ammo Counter"] = "彈藥數量",
|
["Ammo Counter"] = "彈藥數量",
|
||||||
["Anchor Bags Above Chat"] = nil,
|
["Anchor Bags Above Chat"] = nil,
|
||||||
@@ -52,10 +51,12 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Auto Sell Grey Items"] = "自動販賣灰色物品",
|
["Auto Sell Grey Items"] = "自動販賣灰色物品",
|
||||||
["Average Per Hour"] = "平均每小時",
|
["Average Per Hour"] = "平均每小時",
|
||||||
["Background Color"] = "背景顏色",
|
["Background Color"] = "背景顏色",
|
||||||
|
["Bags"] = "背包",
|
||||||
["Bags & Bank"] = "背包和銀行",
|
["Bags & Bank"] = "背包和銀行",
|
||||||
["Bags Border Size"] = "背包邊框大小",
|
["Bags Border Size"] = "背包邊框大小",
|
||||||
["Bagslots Per Row"] = "每行包裹槽數量",
|
["Bagslots Per Row"] = "每行包裹槽數量",
|
||||||
["Bagspace"] = "背包空間",
|
["Bagspace"] = "背包空間",
|
||||||
|
["Bank"] = "銀行",
|
||||||
["Banker"] = "工會銀行角色",
|
["Banker"] = "工會銀行角色",
|
||||||
["Bankslots Per Row"] = "每行銀行槽數量",
|
["Bankslots Per Row"] = "每行銀行槽數量",
|
||||||
["Bar Background"] = nil,
|
["Bar Background"] = nil,
|
||||||
@@ -124,6 +125,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Click Casting"] = nil,
|
["Click Casting"] = nil,
|
||||||
["Clock"] = "時間",
|
["Clock"] = "時間",
|
||||||
["Close"] = "關閉",
|
["Close"] = "關閉",
|
||||||
|
["Collapse Empty Slots"] = nil,
|
||||||
["Color"] = nil,
|
["Color"] = nil,
|
||||||
["Color Buff Stacks"] = nil,
|
["Color Buff Stacks"] = nil,
|
||||||
["Color Debuff Stacks"] = nil,
|
["Color Debuff Stacks"] = nil,
|
||||||
@@ -290,7 +292,6 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Enable Mana Ticks"] = nil,
|
["Enable Mana Ticks"] = nil,
|
||||||
["Enable Micro Bar"] = "顯示功能表列",
|
["Enable Micro Bar"] = "顯示功能表列",
|
||||||
["Enable Mouselook With Right Click"] = "啟動右鍵移動鏡頭",
|
["Enable Mouselook With Right Click"] = "啟動右鍵移動鏡頭",
|
||||||
["Enable Mouseover Tooltip"] = "啟用滑鼠懸停工具提示",
|
|
||||||
["Enable Movable Bags"] = "啟用可移動包裹",
|
["Enable Movable Bags"] = "啟用可移動包裹",
|
||||||
["Enable Offscreen Frame Positions"] = "啟用螢幕框架固定",
|
["Enable Offscreen Frame Positions"] = "啟用螢幕框架固定",
|
||||||
["Enable Overlap"] = "疊加顯示",
|
["Enable Overlap"] = "疊加顯示",
|
||||||
@@ -311,6 +312,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Encode"] = "編碼",
|
["Encode"] = "編碼",
|
||||||
["Ended"] = nil,
|
["Ended"] = nil,
|
||||||
["Energy Color"] = nil,
|
["Energy Color"] = nil,
|
||||||
|
["Equipped"] = "已裝備",
|
||||||
["Equipped Item Color"] = nil,
|
["Equipped Item Color"] = nil,
|
||||||
["Estimate Debuffs"] = nil,
|
["Estimate Debuffs"] = nil,
|
||||||
["Estimate Enemy Health Points"] = nil,
|
["Estimate Enemy Health Points"] = nil,
|
||||||
@@ -568,6 +570,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Overwrite If Unit Is Attacking Others"] = "如果单位正在攻擊其它单位則覆蓋",
|
["Overwrite If Unit Is Attacking Others"] = "如果单位正在攻擊其它单位則覆蓋",
|
||||||
["Overwrite If Unit Is Attacking You"] = "如果单位正在攻擊你則覆蓋",
|
["Overwrite If Unit Is Attacking You"] = "如果单位正在攻擊你則覆蓋",
|
||||||
["Overwrite If Unit Is Casting"] = "如果单位正在施法則覆蓋",
|
["Overwrite If Unit Is Casting"] = "如果单位正在施法則覆蓋",
|
||||||
|
["Owner Name"] = nil,
|
||||||
["Pageable"] = nil,
|
["Pageable"] = nil,
|
||||||
["Paging Actionbar"] = nil,
|
["Paging Actionbar"] = nil,
|
||||||
["Panel"] = "面板",
|
["Panel"] = "面板",
|
||||||
@@ -615,12 +618,13 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Raid Mark X-Offset"] = nil,
|
["Raid Mark X-Offset"] = nil,
|
||||||
["Raid Mark Y-Offset"] = nil,
|
["Raid Mark Y-Offset"] = nil,
|
||||||
["Raid Padding"] = nil,
|
["Raid Padding"] = nil,
|
||||||
|
["Raid-Pet"] = nil,
|
||||||
["Random"] = "給隨機玩家",
|
["Random"] = "給隨機玩家",
|
||||||
["Random Roll Announcement Rarity"] = "隨機Roll點公示稀有度",
|
["Random Roll Announcement Rarity"] = "隨機Roll點公示稀有度",
|
||||||
["Random Rolling"] = "隨機Roll點 物品:",
|
["Random Rolling"] = "隨機Roll點 物品:",
|
||||||
["Range Based Hunter Paging"] = nil,
|
["Range Based Hunter Paging"] = nil,
|
||||||
["Range Check Interval"] = "範圍檢查間隔",
|
|
||||||
["Rank"] = nil,
|
["Rank"] = nil,
|
||||||
|
["Recast Totem"] = nil,
|
||||||
["Red Border On Enemy Units"] = nil,
|
["Red Border On Enemy Units"] = nil,
|
||||||
["Red Name Text On Infight Units"] = nil,
|
["Red Name Text On Infight Units"] = nil,
|
||||||
["Regional Settings"] = nil,
|
["Regional Settings"] = nil,
|
||||||
@@ -702,6 +706,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Show Description"] = nil,
|
["Show Description"] = nil,
|
||||||
["Show Dispel Indicators"] = nil,
|
["Show Dispel Indicators"] = nil,
|
||||||
["Show Druid Mana Bar"] = nil,
|
["Show Druid Mana Bar"] = nil,
|
||||||
|
["Show Druid Mana Bar Text"] = nil,
|
||||||
["Show Duration Inside Buff"] = "顯示持續時間在Buff裏面",
|
["Show Duration Inside Buff"] = "顯示持續時間在Buff裏面",
|
||||||
["Show Empty Buttons"] = nil,
|
["Show Empty Buttons"] = nil,
|
||||||
["Show FPS and Latency Colors"] = nil,
|
["Show FPS and Latency Colors"] = nil,
|
||||||
@@ -738,6 +743,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Show Required Questitem Count"] = nil,
|
["Show Required Questitem Count"] = nil,
|
||||||
["Show Resting"] = nil,
|
["Show Resting"] = nil,
|
||||||
["Show Self In Group Frames"] = nil,
|
["Show Self In Group Frames"] = nil,
|
||||||
|
["Show Self In Raid Frames When Solo"] = nil,
|
||||||
["Show Spell Icon"] = nil,
|
["Show Spell Icon"] = nil,
|
||||||
["Show Spell Name"] = nil,
|
["Show Spell Name"] = nil,
|
||||||
["Show Stacks"] = nil,
|
["Show Stacks"] = nil,
|
||||||
@@ -782,6 +788,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Target Castbar"] = nil,
|
["Target Castbar"] = nil,
|
||||||
["Target Debuff Bar"] = nil,
|
["Target Debuff Bar"] = nil,
|
||||||
["Target Nameplate Zoom Factor"] = nil,
|
["Target Nameplate Zoom Factor"] = nil,
|
||||||
|
["Target Totem"] = nil,
|
||||||
["Target-Target"] = "目標的目標",
|
["Target-Target"] = "目標的目標",
|
||||||
["Target-Target-Target"] = nil,
|
["Target-Target-Target"] = nil,
|
||||||
["Text"] = nil,
|
["Text"] = nil,
|
||||||
@@ -814,6 +821,7 @@ pfUI_translation["zhTW"] = {
|
|||||||
["Top Actionbar"] = nil,
|
["Top Actionbar"] = nil,
|
||||||
["Top Left"] = "左上方",
|
["Top Left"] = "左上方",
|
||||||
["Top Right"] = "右上方",
|
["Top Right"] = "右上方",
|
||||||
|
["Total"] = "全部",
|
||||||
["Total Gold"] = "總金量",
|
["Total Gold"] = "總金量",
|
||||||
["Totem Direction"] = nil,
|
["Totem Direction"] = nil,
|
||||||
["Totem Icons"] = nil,
|
["Totem Icons"] = nil,
|
||||||
@@ -876,7 +884,6 @@ pfUI_translation["zhTW"] = {
|
|||||||
["XP Percentage"] = "經驗百分比",
|
["XP Percentage"] = "經驗百分比",
|
||||||
["Yellow Border On Neutral Units"] = nil,
|
["Yellow Border On Neutral Units"] = nil,
|
||||||
["Yes"] = nil,
|
["Yes"] = nil,
|
||||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
|
||||||
["You got"] = nil,
|
["You got"] = nil,
|
||||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "您的UI已經設置完畢.使用遊戲菜單或在聊天窗口輸入\"|cffffffaa/pfui|r\"開啟高級設置.祝您遊戲愉快!\n\n|cffaaaaaa- Shagu",
|
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "您的UI已經設置完畢.使用遊戲菜單或在聊天窗口輸入\"|cffffffaa/pfui|r\"開啟高級設置.祝您遊戲愉快!\n\n|cffaaaaaa- Shagu",
|
||||||
["Your items have been repaired for"] = "你的物品已經修好了",
|
["Your items have been repaired for"] = "你的物品已經修好了",
|
||||||
|
|||||||
@@ -4,9 +4,7 @@
|
|||||||
<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\libthrottle.lua"/>
|
<Include file="..\libs\libthrottle.lua"/>
|
||||||
<Include file="..\libs\libpredict.lua"/>
|
<Include file="..\libs\libpredict.lua"/>
|
||||||
<Include file="..\libs\libbagsort.lua"/>
|
<Include file="..\libs\libbagsort.lua"/>
|
||||||
|
|||||||
@@ -71,6 +71,7 @@
|
|||||||
<Include file="..\modules\energytick.lua"/>
|
<Include file="..\modules\energytick.lua"/>
|
||||||
<Include file="..\modules\totems.lua"/>
|
<Include file="..\modules\totems.lua"/>
|
||||||
<Include file="..\modules\macrotweak.lua"/>
|
<Include file="..\modules\macrotweak.lua"/>
|
||||||
|
<Include file="..\modules\macroicons.lua"/>
|
||||||
<Include file="..\modules\turtle-wow.lua"/>
|
<Include file="..\modules\turtle-wow.lua"/>
|
||||||
<Include file="..\modules\superwow.lua"/>
|
<Include file="..\modules\superwow.lua"/>
|
||||||
<Include file="..\modules\innervatecall.lua"/>
|
<Include file="..\modules\innervatecall.lua"/>
|
||||||
@@ -79,4 +80,6 @@
|
|||||||
<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"/>
|
<Include file="..\modules\loothistory.lua"/>
|
||||||
|
<Include file="..\modules\newitem.lua"/>
|
||||||
|
<Include file="..\modules\friendnotes.lua"/>
|
||||||
</Ui>
|
</Ui>
|
||||||
@@ -41,8 +41,6 @@
|
|||||||
<!-- Turtle WoW -->
|
<!-- Turtle WoW -->
|
||||||
<Include file="..\skins\blizzard\barbershop.lua"/>
|
<Include file="..\skins\blizzard\barbershop.lua"/>
|
||||||
<Include file="..\skins\blizzard\transmog.lua"/>
|
<Include file="..\skins\blizzard\transmog.lua"/>
|
||||||
<Include file="..\skins\blizzard\custom_merchant.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\arena_score.lua"/>
|
|
||||||
<Include file="..\skins\blizzard\ebc.lua"/>
|
<Include file="..\skins\blizzard\ebc.lua"/>
|
||||||
|
|
||||||
</Ui>
|
</Ui>
|
||||||
|
|||||||
+123
-63
@@ -11,26 +11,27 @@ pfUI.api.libbagsort = libbagsort
|
|||||||
libbagsort.itemGrid = {}
|
libbagsort.itemGrid = {}
|
||||||
libbagsort.bagList = nil
|
libbagsort.bagList = nil
|
||||||
|
|
||||||
local HEARTHSTONE_ITEM_ID = 6948
|
local ItemClass = Enum.ItemClass
|
||||||
|
local ItemQuality = Enum.ItemQuality
|
||||||
|
|
||||||
-- Lower prefix = sorted earlier in the bag.
|
-- Lower prefix = sorted earlier in the bag.
|
||||||
local function SortCategoryPrefix(itemId, itemType, itemSubType, quality)
|
local function SortCategoryPrefix(itemId, classID, quality)
|
||||||
if itemId == HEARTHSTONE_ITEM_ID then return "00" end
|
if itemId == HEARTHSTONE_ITEM_ID then return "00" end
|
||||||
if quality == 0 then return "13" end -- Poor (gray) always last
|
if quality == ItemQuality.Poor then return "13" end -- gray always last
|
||||||
if itemType == "Weapon" or itemType == "Armor" then
|
if classID == ItemClass.Weapon or classID == ItemClass.Armor then
|
||||||
if quality and quality >= 4 then return "01" end -- Epic+ gear
|
if quality and quality >= ItemQuality.Epic then return "01" end -- Epic+ gear
|
||||||
if quality == 3 then return "02" end -- Rare gear
|
if quality == ItemQuality.Rare then return "02" end -- Rare gear
|
||||||
if quality == 2 then return "03" end -- Uncommon gear
|
if quality == ItemQuality.Uncommon then return "03" end -- Uncommon gear
|
||||||
return "04" -- Common/poor gear
|
return "04" -- Common/poor gear
|
||||||
end
|
end
|
||||||
if itemType == "Consumable" then return "05" end
|
if classID == ItemClass.Consumable then return "05" end
|
||||||
if itemType == "Reagent" then return "06" end
|
if classID == ItemClass.Reagent then return "06" end
|
||||||
if itemType == "Trade Goods" then return "07" end
|
if classID == ItemClass.Tradegoods then return "07" end
|
||||||
if itemType == "Quest" then return "08" end
|
if classID == ItemClass.Questitem then return "08" end
|
||||||
-- Non-gear items without a specific type, sorted by quality
|
-- Non-gear items without a specific type, sorted by quality
|
||||||
if quality and quality >= 4 then return "09" end
|
if quality and quality >= ItemQuality.Epic then return "09" end
|
||||||
if quality == 3 then return "10" end
|
if quality == ItemQuality.Rare then return "10" end
|
||||||
if quality == 2 then return "11" end
|
if quality == ItemQuality.Uncommon then return "11" end
|
||||||
return "12"
|
return "12"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -41,18 +42,31 @@ local function SortCountSuffix(count)
|
|||||||
return string.sub(s, -6)
|
return string.sub(s, -6)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function SortKey(itemId, name, itype, subtype, quality, count)
|
local function SortKey(itemId, name, classID, subClassID, quality, count)
|
||||||
return SortCategoryPrefix(itemId, itype, subtype, quality)
|
-- Zero-pad the class/subclass so the secondary grouping sorts numerically
|
||||||
.. (itype or "") .. "|" .. (subtype or "") .. "|" .. (name or "zzz") .. "|" .. SortCountSuffix(count)
|
-- (as a string, "10" would otherwise precede "2").
|
||||||
|
return SortCategoryPrefix(itemId, classID, quality)
|
||||||
|
.. string.format("%02d|%02d|", classID or 99, subClassID or 99)
|
||||||
|
.. (name or "zzz") .. "|" .. SortCountSuffix(count)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ClearSortData()
|
local function ClearSortData()
|
||||||
libbagsort.itemGrid = {}
|
libbagsort.itemGrid = {}
|
||||||
libbagsort.bagList = nil
|
libbagsort.bagList = nil
|
||||||
|
libbagsort.opts = nil
|
||||||
libbagsort:UnregisterEvent("BAG_UPDATE_DELAYED")
|
libbagsort:UnregisterEvent("BAG_UPDATE_DELAYED")
|
||||||
libbagsort:SetScript("OnEvent", nil)
|
libbagsort:SetScript("OnEvent", nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function ReverseArray(t)
|
||||||
|
local i, j = 1, table.getn(t)
|
||||||
|
while i < j do
|
||||||
|
t[i], t[j] = t[j], t[i]
|
||||||
|
i = i + 1
|
||||||
|
j = j - 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Two-pointer consolidation: sorts stacks largest-first, then merges from
|
-- Two-pointer consolidation: sorts stacks largest-first, then merges from
|
||||||
-- both ends toward the middle. n is set explicitly so table.getn / table.sort
|
-- both ends toward the middle. n is set explicitly so table.getn / table.sort
|
||||||
-- work correctly in Lua 5.0.
|
-- work correctly in Lua 5.0.
|
||||||
@@ -112,36 +126,61 @@ local function BuildConsolidateOps(bagList)
|
|||||||
return ops
|
return ops
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Bag family bitmask (1 << (familyID-1)); 0 = general-purpose (holds
|
||||||
|
-- anything). Backpack (0) and bank (-1) are always general. A specialty
|
||||||
|
-- bag's family comes from the equipped bag item -- ClassicAPI derives it
|
||||||
|
-- from the container subclass when the raw field is empty (Turtle leaves
|
||||||
|
-- bags' m_bagFamily at 0), so quivers/soul/profession bags report properly.
|
||||||
|
local function BagFamily(bag)
|
||||||
|
if bag == 0 or bag == -1 then return 0 end
|
||||||
|
local id = GetInventoryItemID("player", ContainerIDToInventoryID(bag))
|
||||||
|
return id and C_Item.GetItemFamily(id) or 0
|
||||||
|
end
|
||||||
|
|
||||||
local function BuildSortGrid()
|
local function BuildSortGrid()
|
||||||
local bagList = libbagsort.bagList
|
local bagList = libbagsort.bagList
|
||||||
libbagsort.itemGrid = {}
|
libbagsort.itemGrid = {}
|
||||||
local normalItems = {}
|
local normalItems = {}
|
||||||
local poorItems = {}
|
local poorItems = {}
|
||||||
local bagCount = 0
|
|
||||||
local bagSlots = {}
|
-- Destination cells, split by the family they can accept. A specialty
|
||||||
|
-- bag's slots only take items of its own family; general slots take
|
||||||
|
-- anything. Cells are collected in forward order (bag order, slot 1..n).
|
||||||
|
local generalCells = {} -- { {bag=,slot=}, ... }
|
||||||
|
local specialtyCells = {} -- family -> { {bag=,slot=}, ... }
|
||||||
|
|
||||||
for _, bag in ipairs(bagList) do
|
for _, bag in ipairs(bagList) do
|
||||||
bagCount = bagCount + 1
|
local fam = BagFamily(bag)
|
||||||
local numSlots = GetContainerNumSlots(bag)
|
local numSlots = GetContainerNumSlots(bag)
|
||||||
bagSlots[bagCount] = numSlots
|
|
||||||
if numSlots > 0 then
|
if numSlots > 0 then
|
||||||
libbagsort.itemGrid[bag] = {}
|
libbagsort.itemGrid[bag] = {}
|
||||||
for slot = 1, numSlots do
|
for slot = 1, numSlots do
|
||||||
|
if fam == 0 then
|
||||||
|
tinsert(generalCells, {bag=bag, slot=slot})
|
||||||
|
else
|
||||||
|
specialtyCells[fam] = specialtyCells[fam] or {}
|
||||||
|
tinsert(specialtyCells[fam], {bag=bag, slot=slot})
|
||||||
|
end
|
||||||
|
|
||||||
local itemId = C_Container.GetContainerItemID(bag, slot)
|
local itemId = C_Container.GetContainerItemID(bag, slot)
|
||||||
if itemId then
|
if itemId then
|
||||||
-- pfUI's compat layer shims GetItemInfo to the modern 10-field
|
-- C_Item.GetItemInfo is the full 18-field tuple; classID/subClassID
|
||||||
-- signature (inserts nil for itemLevel between quality and
|
-- sit at positions 12/13. We categorize on those numeric class IDs
|
||||||
-- minlevel) — so itype/subtype sit at positions 6/7, not 5/6.
|
-- rather than the localized itemType/itemSubType strings. (pfUI's
|
||||||
local name, _, quality, _, _, itype, subtype = GetItemInfo(itemId)
|
-- shimmed global GetItemInfo is only 10 fields and lacks them.)
|
||||||
|
local name, _, quality, _, _, _, _, _, _, _, _, classID, subClassID = C_Item.GetItemInfo(itemId)
|
||||||
local _, count = GetContainerItemInfo(bag, slot)
|
local _, count = GetContainerItemInfo(bag, slot)
|
||||||
local item = {
|
local item = {
|
||||||
key = SortKey(itemId, name, itype, subtype, quality, count),
|
key = SortKey(itemId, name, classID, subClassID, quality, count),
|
||||||
|
-- vanilla items carry at most one family bit, so equality
|
||||||
|
-- against a bag family suffices (no bit.band needed).
|
||||||
|
family = C_Item.GetItemFamily(itemId) or 0,
|
||||||
srcBag = bag,
|
srcBag = bag,
|
||||||
srcSlot = slot,
|
srcSlot = slot,
|
||||||
curBag = bag,
|
curBag = bag,
|
||||||
curSlot = slot,
|
curSlot = slot,
|
||||||
}
|
}
|
||||||
if quality == 0 then
|
if quality == ItemQuality.Poor then
|
||||||
tinsert(poorItems, item)
|
tinsert(poorItems, item)
|
||||||
else
|
else
|
||||||
tinsert(normalItems, item)
|
tinsert(normalItems, item)
|
||||||
@@ -152,46 +191,61 @@ local function BuildSortGrid()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
table.sort(normalItems, function(a, b) return a.key < b.key end)
|
local opts = libbagsort.opts or {}
|
||||||
-- Sort poor items descending so they read in ascending order when placed
|
local reverse = opts.reverse
|
||||||
-- back-to-front (last poor item lands on the last slot).
|
local reversePrio = opts.reversePrio
|
||||||
table.sort(poorItems, function(a, b) return a.key > b.key end)
|
|
||||||
|
|
||||||
-- Forward pass: assign normal items from slot 1 of bag 1 onward
|
if reverse then
|
||||||
local bagIdx, destSlot = 1, 1
|
ReverseArray(generalCells)
|
||||||
while bagIdx <= bagCount and bagSlots[bagIdx] == 0 do
|
for _, cells in pairs(specialtyCells) do
|
||||||
bagIdx = bagIdx + 1
|
ReverseArray(cells)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if reversePrio then
|
||||||
|
table.sort(normalItems, function(a, b) return a.key > b.key end)
|
||||||
|
else
|
||||||
|
table.sort(normalItems, function(a, b) return a.key < b.key end)
|
||||||
|
end
|
||||||
|
|
||||||
|
if reverse then
|
||||||
|
table.sort(poorItems, function(a, b) return a.key < b.key end)
|
||||||
|
else
|
||||||
|
table.sort(poorItems, function(a, b) return a.key > b.key end)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Forward pass: route each normal item into the next free cell that
|
||||||
|
-- accepts it -- a matching specialty bag first, overflowing to general.
|
||||||
|
local genIdx = 1
|
||||||
|
local specIdx = {} -- family -> next free index into specialtyCells[family]
|
||||||
for _, item in ipairs(normalItems) do
|
for _, item in ipairs(normalItems) do
|
||||||
while bagIdx <= bagCount do
|
local cell
|
||||||
if destSlot <= bagSlots[bagIdx] then break end
|
local fam = item.family
|
||||||
bagIdx = bagIdx + 1
|
if fam ~= 0 and specialtyCells[fam] then
|
||||||
destSlot = 1
|
local i = specIdx[fam] or 1
|
||||||
|
if i <= table.getn(specialtyCells[fam]) then
|
||||||
|
cell = specialtyCells[fam][i]
|
||||||
|
specIdx[fam] = i + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if bagIdx > bagCount then break end
|
if not cell and genIdx <= table.getn(generalCells) then
|
||||||
local grid = libbagsort.itemGrid[item.srcBag][item.srcSlot]
|
cell = generalCells[genIdx]
|
||||||
grid.destBag = bagList[bagIdx]
|
genIdx = genIdx + 1
|
||||||
grid.destSlot = destSlot
|
end
|
||||||
destSlot = destSlot + 1
|
if not cell then break end
|
||||||
|
item.destBag = cell.bag
|
||||||
|
item.destSlot = cell.slot
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Reverse pass: assign poor items from the last slot of the last bag backward
|
-- Reverse pass: poor items are general; fill remaining general cells from
|
||||||
local rBagIdx = bagCount
|
-- the back, stopping before the ones the forward pass already claimed.
|
||||||
local rDestSlot = 0
|
local genBack = table.getn(generalCells)
|
||||||
while rBagIdx >= 1 do
|
|
||||||
if bagSlots[rBagIdx] > 0 then rDestSlot = bagSlots[rBagIdx]; break end
|
|
||||||
rBagIdx = rBagIdx - 1
|
|
||||||
end
|
|
||||||
for _, item in ipairs(poorItems) do
|
for _, item in ipairs(poorItems) do
|
||||||
while rBagIdx >= 1 and rDestSlot < 1 do
|
if genBack < genIdx then break end
|
||||||
rBagIdx = rBagIdx - 1
|
local cell = generalCells[genBack]
|
||||||
rDestSlot = rBagIdx >= 1 and bagSlots[rBagIdx] or 0
|
genBack = genBack - 1
|
||||||
end
|
item.destBag = cell.bag
|
||||||
if rBagIdx < 1 then break end
|
item.destSlot = cell.slot
|
||||||
local grid = libbagsort.itemGrid[item.srcBag][item.srcSlot]
|
|
||||||
grid.destBag = bagList[rBagIdx]
|
|
||||||
grid.destSlot = rDestSlot
|
|
||||||
rDestSlot = rDestSlot - 1
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -248,9 +302,15 @@ end
|
|||||||
-- BAG_UPDATE_DELAYED cycle), then place items by category/name/quality.
|
-- BAG_UPDATE_DELAYED cycle), then place items by category/name/quality.
|
||||||
-- e.g. `libbagsort:Sort({0, 1, 2, 3, 4})` for the main bags;
|
-- e.g. `libbagsort:Sort({0, 1, 2, 3, 4})` for the main bags;
|
||||||
-- `{-1, 5, 6, 7, 8, 9, 10}` for the bank.
|
-- `{-1, 5, 6, 7, 8, 9, 10}` for the bank.
|
||||||
function libbagsort:Sort(bagList)
|
--
|
||||||
|
-- opts (optional): { reverse = bool, reversePrio = bool }
|
||||||
|
-- reverse - place the first-ranked item into the last slot of the last
|
||||||
|
-- bag (junk fills from the opposite end).
|
||||||
|
-- reversePrio - flip the category ranking (e.g. hearthstone sorts last).
|
||||||
|
function libbagsort:Sort(bagList, opts)
|
||||||
ClearSortData()
|
ClearSortData()
|
||||||
self.bagList = bagList
|
self.bagList = bagList
|
||||||
|
self.opts = opts
|
||||||
|
|
||||||
-- Phase 1: fire every consolidation op in a single batch.
|
-- Phase 1: fire every consolidation op in a single batch.
|
||||||
local ops = BuildConsolidateOps(bagList)
|
local ops = BuildConsolidateOps(bagList)
|
||||||
|
|||||||
+83
-74
@@ -11,12 +11,14 @@ setfenv(1, pfUI:GetEnvironment())
|
|||||||
-- This eliminates ~400 lines of error-prone shift logic while maintaining full
|
-- This eliminates ~400 lines of error-prone shift logic while maintaining full
|
||||||
-- multi-caster tracking support.
|
-- multi-caster tracking support.
|
||||||
--
|
--
|
||||||
-- The public per-aura readers (UnitDebuff, UnitOwnDebuff) were retired in favor
|
-- The internal debuff plumbing now runs on ClassicAPI's C_UnitAuras (which
|
||||||
-- of ClassicAPI's C_UnitAuras (which now provides sourceUnit/sourceGUID and
|
-- provides sourceUnit/sourceGUID and non-player expirationTime). The public
|
||||||
-- non-player expirationTime). What remains in libdebuff is the cast-event
|
-- per-aura readers (UnitDebuff, UnitOwnDebuff) survive only as thin adapters
|
||||||
-- bookkeeping consumed by GetBestAuraCast (libpredict HoT tracking) and the
|
-- over C_UnitAuras for third-party addons (e.g. pfUI-WeakIcons) that still
|
||||||
-- libdebuff_*_hooks broadcast surface (subscribers in actionbar / swingtimer
|
-- expect the legacy multi-return signature. The rest of libdebuff is the
|
||||||
-- / libtotem react to SPELL_GO and SPELL_FAILED).
|
-- cast-event bookkeeping consumed by GetBestAuraCast (libpredict HoT tracking)
|
||||||
|
-- and the libdebuff_*_hooks broadcast surface (subscribers in actionbar /
|
||||||
|
-- swingtimer react to SPELL_GO and SPELL_FAILED).
|
||||||
|
|
||||||
-- return instantly when another libdebuff is already active
|
-- return instantly when another libdebuff is already active
|
||||||
if pfUI.api.libdebuff then return end
|
if pfUI.api.libdebuff then return end
|
||||||
@@ -27,8 +29,7 @@ if GetLocale() == "ruRU" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local libdebuff = CreateFrame("Frame", "pfdebuffsScanner", UIParent)
|
local libdebuff = CreateFrame("Frame", "pfdebuffsScanner", UIParent)
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
local lastspell
|
|
||||||
|
|
||||||
-- Nampower Support
|
-- Nampower Support
|
||||||
local hasNampower = false
|
local hasNampower = false
|
||||||
@@ -375,11 +376,9 @@ local function GetDebuffSlotMap(guid)
|
|||||||
local texture = libdebuff:GetSpellIcon(spellId)
|
local texture = libdebuff:GetSpellIcon(spellId)
|
||||||
local stacks = (auraApps and auraApps[auraSlot] or 0) + 1
|
local stacks = (auraApps and auraApps[auraSlot] or 0) + 1
|
||||||
local dtype = nil
|
local dtype = nil
|
||||||
if GetSpellRecField then
|
local dispelId = C_Spell.GetSpellDispelType(spellId)
|
||||||
local dispelId = GetSpellRecField(spellId, "dispel")
|
if dispelId and dispelId > 0 then
|
||||||
if dispelId and dispelId > 0 then
|
dtype = dispelTypeMap[dispelId]
|
||||||
dtype = dispelTypeMap[dispelId]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
map[displaySlot] = {
|
map[displaySlot] = {
|
||||||
auraSlot = auraSlot,
|
auraSlot = auraSlot,
|
||||||
@@ -592,37 +591,13 @@ end
|
|||||||
-- DURATION FUNCTIONS
|
-- DURATION FUNCTIONS
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Report the live, talent-accurate duration of a matching aura on the player.
|
||||||
|
-- ClassicAPI's C_UnitAuras carries the real (mod-folded) duration straight from
|
||||||
|
-- the engine, so there's no static duration table to maintain. Returns 0 when
|
||||||
|
-- the player has no such aura (e.g. a debuff that only ever lands on enemies).
|
||||||
function libdebuff:GetDuration(effect, rank)
|
function libdebuff:GetDuration(effect, rank)
|
||||||
if L["debuffs"][effect] then
|
local aura = C_UnitAuras.GetAuraDataBySpellName("player", effect)
|
||||||
local rank = rank and tonumber((string.gsub(rank, RANK, ""))) or 0
|
return aura and aura.duration or 0
|
||||||
local rank = L["debuffs"][effect][rank] and rank or libdebuff:GetMaxRank(effect)
|
|
||||||
local duration = L["debuffs"][effect][rank]
|
|
||||||
|
|
||||||
if effect == L["dyndebuffs"]["Demoralizing Shout"] then
|
|
||||||
local _,_,_,_,count = GetTalentInfo(2,1)
|
|
||||||
if count and count > 0 then duration = duration + ( duration / 100 * (count*10)) end
|
|
||||||
elseif effect == L["dyndebuffs"]["Shadow Word: Pain"] then
|
|
||||||
local _,_,_,_,count = GetTalentInfo(3,4)
|
|
||||||
if count and count > 0 then duration = duration + count * 3 end
|
|
||||||
elseif effect == L["dyndebuffs"]["Frostbolt"] then
|
|
||||||
local _,_,_,_,count = GetTalentInfo(3,7)
|
|
||||||
if count and count > 0 then duration = duration + count end
|
|
||||||
elseif effect == L["dyndebuffs"]["Gouge"] then
|
|
||||||
local _,_,_,_,count = GetTalentInfo(3,3)
|
|
||||||
if count and count > 0 then duration = duration + (count*.5) end
|
|
||||||
end
|
|
||||||
return duration
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function libdebuff:GetMaxRank(effect)
|
|
||||||
local max = 0
|
|
||||||
for id in pairs(L["debuffs"][effect]) do
|
|
||||||
if id > max then max = id end
|
|
||||||
end
|
|
||||||
return max
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function libdebuff:UpdateDuration(unit, unitlevel, effect, duration)
|
function libdebuff:UpdateDuration(unit, unitlevel, effect, duration)
|
||||||
@@ -648,7 +623,6 @@ libdebuff.objects = {}
|
|||||||
|
|
||||||
function libdebuff:AddPending(unit, unitlevel, effect, duration, caster, rank)
|
function libdebuff:AddPending(unit, unitlevel, effect, duration, caster, rank)
|
||||||
if not unit or duration <= 0 then return end
|
if not unit or duration <= 0 then return end
|
||||||
if not L["debuffs"][effect] then return end
|
|
||||||
if libdebuff.pending[3] then return end
|
if libdebuff.pending[3] then return end
|
||||||
|
|
||||||
libdebuff.pending[1] = unit
|
libdebuff.pending[1] = unit
|
||||||
@@ -727,39 +701,74 @@ end
|
|||||||
-- API: GetBestAuraCast (for libpredict HoT tracking)
|
-- API: GetBestAuraCast (for libpredict HoT tracking)
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Report the active aura for spellName on `guid`, read straight from
|
||||||
|
-- C_UnitAuras. expirationTime is the true, caster-modified remaining time, so
|
||||||
|
-- no cast-event bookkeeping is needed -- and a unit only ever holds one instance
|
||||||
|
-- of a given spell, so this is inherently the "best" one.
|
||||||
|
-- Returns (startTime, duration, timeleft, rank, casterGuid) or nil.
|
||||||
function libdebuff:GetBestAuraCast(guid, spellName)
|
function libdebuff:GetBestAuraCast(guid, spellName)
|
||||||
if not guid or not spellName then return nil end
|
if not guid or not spellName then return nil end
|
||||||
|
|
||||||
-- Check ownDebuffs first (for our casts)
|
local aura = C_UnitAuras.GetAuraDataBySpellName(guid, spellName)
|
||||||
if ownDebuffs[guid] and ownDebuffs[guid][spellName] then
|
if not aura or not aura.expirationTime or aura.expirationTime == 0 then return nil end
|
||||||
local data = ownDebuffs[guid][spellName]
|
|
||||||
local timeleft = (data.startTime + data.duration) - GetTime()
|
local timeleft = aura.expirationTime - GetTime()
|
||||||
if timeleft > 0 then
|
if timeleft <= 0 then return nil end
|
||||||
return data.startTime, data.duration, timeleft, data.rank, GetPlayerGuid()
|
|
||||||
end
|
local duration = (aura.duration and aura.duration > 0) and aura.duration or timeleft
|
||||||
|
local startTime = aura.expirationTime - duration
|
||||||
|
local rank = aura.spellId and tonumber((string.gsub(C_Spell.GetSpellSubtext(aura.spellId) or "", RANK, ""))) or nil
|
||||||
|
|
||||||
|
return startTime, duration, timeleft, rank, aura.sourceGUID
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- API: UnitDebuff / UnitOwnDebuff (C_UnitAuras adapters)
|
||||||
|
-- ============================================================================
|
||||||
|
-- Thin readers kept for third-party addons (e.g. pfUI-WeakIcons) that still
|
||||||
|
-- expect libdebuff's legacy multi-return signature:
|
||||||
|
-- effect, rank, texture, stacks, dtype, duration, timeleft, caster
|
||||||
|
-- ClassicAPI's C_UnitAuras already resolves source and expiration, so these
|
||||||
|
-- just remap its AuraData onto that tuple -- no cast-tracking tables
|
||||||
|
-- (ownDebuffs/allAuraCasts) or GetUnitField slot mapping involved.
|
||||||
|
|
||||||
|
local function AuraToLegacy(aura)
|
||||||
|
if not aura then return nil end
|
||||||
|
|
||||||
|
local duration = aura.duration or 0
|
||||||
|
local timeleft = -1
|
||||||
|
-- Only report a timer for genuinely timed auras. ClassicAPI can leave a
|
||||||
|
-- stale expirationTime on permanent (duration 0) auras, so gate on duration.
|
||||||
|
if duration > 0 and aura.expirationTime and aura.expirationTime > 0 then
|
||||||
|
timeleft = aura.expirationTime - GetTime()
|
||||||
|
if timeleft < 0 then timeleft = 0 end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Check allAuraCasts (for any caster)
|
-- Aura spellId is the specific cast rank, so its subtext is the active rank.
|
||||||
if allAuraCasts[guid] and allAuraCasts[guid][spellName] then
|
local rank
|
||||||
local bestData = nil
|
local subtext = aura.spellId and C_Spell.GetSpellSubtext(aura.spellId)
|
||||||
local bestCaster = nil
|
if subtext and subtext ~= "" then
|
||||||
local bestTimeleft = 0
|
rank = tonumber((string.gsub(subtext, "Rank ", "")))
|
||||||
|
|
||||||
for casterGuid, data in pairs(allAuraCasts[guid][spellName]) do
|
|
||||||
local timeleft = (data.startTime + data.duration) - GetTime()
|
|
||||||
if timeleft > bestTimeleft then
|
|
||||||
bestTimeleft = timeleft
|
|
||||||
bestData = data
|
|
||||||
bestCaster = casterGuid
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if bestData and bestTimeleft > 0 then
|
|
||||||
return bestData.startTime, bestData.duration, bestTimeleft, bestData.rank, bestCaster
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return nil
|
local dtype = aura.dispelName
|
||||||
|
if dtype == "" then dtype = nil end
|
||||||
|
|
||||||
|
local caster = aura.isFromPlayerOrPlayerPet and "player" or "other"
|
||||||
|
|
||||||
|
return aura.name, rank, aura.icon, aura.applications or 0, dtype, duration, timeleft, caster
|
||||||
|
end
|
||||||
|
|
||||||
|
-- id is a 1-based harmful-aura index, matching C_UnitAuras / Blizzard's
|
||||||
|
-- compacted debuff slots.
|
||||||
|
function libdebuff:UnitDebuff(unit, id)
|
||||||
|
return AuraToLegacy(C_UnitAuras.GetAuraDataByIndex(unit, id, "HARMFUL"))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Player-cast harmful auras only, via the PLAYER filter -- no manual
|
||||||
|
-- caster-GUID bookkeeping needed.
|
||||||
|
function libdebuff:UnitOwnDebuff(unit, id)
|
||||||
|
return AuraToLegacy(C_UnitAuras.GetAuraDataByIndex(unit, id, "HARMFUL|PLAYER"))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
@@ -1125,7 +1134,7 @@ if hasNampower then
|
|||||||
|
|
||||||
-- Rank aus spellId ermitteln
|
-- Rank aus spellId ermitteln
|
||||||
local rankNum = 0
|
local rankNum = 0
|
||||||
local rankString = GetSpellRecField(spellId, "rank")
|
local rankString = C_Spell.GetSpellSubtext(spellId)
|
||||||
if rankString and rankString ~= "" then
|
if rankString and rankString ~= "" then
|
||||||
rankNum = tonumber((string.gsub(rankString, "Rank ", ""))) or 0
|
rankNum = tonumber((string.gsub(rankString, "Rank ", ""))) or 0
|
||||||
end
|
end
|
||||||
|
|||||||
+5
-7
@@ -291,7 +291,7 @@ pfUI.libdebuff_spell_start_other_hooks["libpredict"] = function(spellId, casterG
|
|||||||
local targetName = resolveNameFromGuid(targetGuid)
|
local targetName = resolveNameFromGuid(targetGuid)
|
||||||
if not targetName then return end
|
if not targetName then return end
|
||||||
|
|
||||||
local rankStr = GetSpellRecField and GetSpellRecField(spellId, "rank") or ""
|
local rankStr = C_Spell.GetSpellSubtext(spellId) or ""
|
||||||
local spellKey = spellName .. (rankStr or "")
|
local spellKey = spellName .. (rankStr or "")
|
||||||
|
|
||||||
local amount = foreignCache[casterName] and foreignCache[casterName][spellKey]
|
local amount = foreignCache[casterName] and foreignCache[casterName][spellKey]
|
||||||
@@ -355,11 +355,9 @@ pfUI.libdebuff_spell_go_hooks["libpredict"] = function(spellId, a1, a2, a3, a4,
|
|||||||
elseif hotType == "Renew" then duration = renewDuration or 15
|
elseif hotType == "Renew" then duration = renewDuration or 15
|
||||||
end
|
end
|
||||||
local rank = 0
|
local rank = 0
|
||||||
if GetSpellRecField then
|
local rankSub = C_Spell.GetSpellSubtext(spellId)
|
||||||
local rankStr = GetSpellRecField(spellId, "rank")
|
if rankSub and rankSub ~= "" then
|
||||||
if rankStr and rankStr ~= "" then
|
rank = tonumber((string.gsub(rankSub, "Rank ", ""))) or 0
|
||||||
rank = tonumber((string.gsub(rankStr, "Rank ", ""))) or 0
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
local playerName = UnitName("player")
|
local playerName = UnitName("player")
|
||||||
libpredict:Hot(playerName, targetName, hotType, duration, nil, "SPELL_GO_SELF", rank)
|
libpredict:Hot(playerName, targetName, hotType, duration, nil, "SPELL_GO_SELF", rank)
|
||||||
@@ -1224,7 +1222,7 @@ libpredict.sender:SetScript("OnEvent", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
function libpredict:GetHotDuration(unit, spell)
|
function libpredict:GetHotDuration(unit, spell)
|
||||||
if unit == UNKNOWNOBJECT or unit == UNKOWNBEING then return end
|
if unit == UNKNOWNOBJECT or unit == UKNOWNBEING then return end
|
||||||
|
|
||||||
-- NEW: Try libdebuff first (Nampower AURA_CAST events)
|
-- NEW: Try libdebuff first (Nampower AURA_CAST events)
|
||||||
if pfUI.api.libdebuff and pfUI.api.libdebuff.GetBestAuraCast then
|
if pfUI.api.libdebuff and pfUI.api.libdebuff.GetBestAuraCast then
|
||||||
|
|||||||
+14
-164
@@ -2,178 +2,28 @@
|
|||||||
setfenv(1, pfUI:GetEnvironment())
|
setfenv(1, pfUI:GetEnvironment())
|
||||||
|
|
||||||
--[[ librange ]]--
|
--[[ librange ]]--
|
||||||
-- A pfUI library that detects and caches distance to units.
|
-- A thin wrapper over ClassicAPI's UnitInRange: a fixed 40y healing-range
|
||||||
|
-- check computed C-side from unit positions, valid for any unit. There is
|
||||||
|
-- no cache or scan loop -- the check is cheap enough to run per query,
|
||||||
|
-- which also sidesteps the staleness a cached scan hit on zone changes and
|
||||||
|
-- roster re-indexing.
|
||||||
--
|
--
|
||||||
-- librange:UnitInSpellRange(unit)
|
-- librange:UnitInSpellRange(unit)
|
||||||
-- Returns `1` if the unit is within range, `nil` otherwise.
|
-- Returns `1` if the unit is within range, `nil` otherwise.
|
||||||
--
|
|
||||||
-- Requires SuperWoW's UnitPosition for the friendly scan path. Target
|
|
||||||
-- range still works via IsActionInRange (vanilla-native) for any class
|
|
||||||
-- with a known 40y healing spell on the action bar.
|
|
||||||
|
|
||||||
if pfUI.api.librange then return end
|
if pfUI.api.librange then return end
|
||||||
|
|
||||||
local _, class = UnitClass("player")
|
local librange = {}
|
||||||
local librange = CreateFrame("Frame", "pfRangecheck", UIParent)
|
|
||||||
|
|
||||||
-- 40y spells per class. Only consulted to find an action-bar slot for the
|
|
||||||
-- IsActionInRange target-range path; the party/raid scan uses UnitPosition.
|
|
||||||
local spells = {
|
|
||||||
["PALADIN"] = {
|
|
||||||
"Interface\\Icons\\Spell_Holy_FlashHeal",
|
|
||||||
"Interface\\Icons\\Spell_Holy_HolyBolt",
|
|
||||||
},
|
|
||||||
["PRIEST"] = {
|
|
||||||
"Interface\\Icons\\Spell_Holy_FlashHeal",
|
|
||||||
"Interface\\Icons\\Spell_Holy_LesserHeal",
|
|
||||||
"Interface\\Icons\\Spell_Holy_Heal",
|
|
||||||
"Interface\\Icons\\Spell_Holy_GreaterHeal",
|
|
||||||
"Interface\\Icons\\Spell_Holy_Renew",
|
|
||||||
},
|
|
||||||
["DRUID"] = {
|
|
||||||
"Interface\\Icons\\Spell_Nature_HealingTouch",
|
|
||||||
"Interface\\Icons\\Spell_Nature_ResistNature",
|
|
||||||
"Interface\\Icons\\Spell_Nature_Rejuvenation",
|
|
||||||
},
|
|
||||||
["SHAMAN"] = {
|
|
||||||
"Interface\\Icons\\Spell_Nature_MagicImmunity",
|
|
||||||
"Interface\\Icons\\Spell_Nature_HealingWaveLesser",
|
|
||||||
"Interface\\Icons\\Spell_Nature_HealingWaveGreater",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- friendly units the scan loop iterates
|
|
||||||
local units = {}
|
|
||||||
table.insert(units, "pet")
|
|
||||||
for i=1,4 do table.insert(units, "party" .. i) end
|
|
||||||
for i=1,4 do table.insert(units, "partypet" .. i) end
|
|
||||||
for i=1,40 do table.insert(units, "raid" .. i) end
|
|
||||||
for i=1,40 do table.insert(units, "raidpet" .. i) end
|
|
||||||
local numunits = table.getn(units)
|
|
||||||
|
|
||||||
local unitcache = {}
|
|
||||||
local unitdata = {}
|
|
||||||
local librange_isLoggingOut = false
|
|
||||||
librange.id = 1
|
|
||||||
|
|
||||||
librange:Hide()
|
|
||||||
librange:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
|
|
||||||
librange:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
||||||
librange:RegisterEvent("PLAYER_LOGOUT")
|
|
||||||
librange:RegisterEvent("PLAYER_LEAVING_WORLD")
|
|
||||||
librange:SetScript("OnEvent", function()
|
|
||||||
if event == "PLAYER_LOGOUT" or event == "PLAYER_LEAVING_WORLD" then
|
|
||||||
librange_isLoggingOut = true
|
|
||||||
this:SetScript("OnUpdate", nil)
|
|
||||||
this:Hide()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if pfUI_config.unitframes.rangecheck == "0" then
|
|
||||||
this:Hide()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
this.interval = tonumber(C.unitframes.rangechecki)/numunits
|
|
||||||
|
|
||||||
if event == "ACTIONBAR_SLOT_CHANGED" or event == "PLAYER_ENTERING_WORLD" then
|
|
||||||
librange.slot = this:GetRangeSlot()
|
|
||||||
if UnitPosition then this:Show() end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
librange:SetScript("OnUpdate", function()
|
|
||||||
if librange_isLoggingOut then return end
|
|
||||||
|
|
||||||
if (this.tick or 1) > GetTime() then return end
|
|
||||||
this.tick = GetTime() + this.interval
|
|
||||||
|
|
||||||
while not this:NeedRangeScan(units[this.id]) and this.id <= numunits do
|
|
||||||
this.id = this.id + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if this.id <= numunits then
|
|
||||||
local unit = units[this.id]
|
|
||||||
if not UnitIsUnit("target", unit) then
|
|
||||||
local x1, y1, z1 = UnitPosition("player")
|
|
||||||
local x2, y2, z2 = UnitPosition(unit)
|
|
||||||
if x1 and x2 then
|
|
||||||
local distance = ((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2)^.5
|
|
||||||
unitdata[unit] = distance < 45 and 1 or 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
this.id = this.id + 1
|
|
||||||
else
|
|
||||||
this.id = 1
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
function librange:NeedRangeScan(unit)
|
|
||||||
if not UnitExists(unit) then return nil end
|
|
||||||
if not UnitIsVisible(unit) then return nil end
|
|
||||||
if CheckInteractDistance(unit, 4) then return nil end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function librange:GetRealUnit(unit)
|
|
||||||
if unitdata[unit] then return unit end
|
|
||||||
|
|
||||||
if unitcache[unit] and UnitIsUnit(unitcache[unit], unit) then
|
|
||||||
return unitcache[unit]
|
|
||||||
end
|
|
||||||
|
|
||||||
for id, realunit in pairs(units) do
|
|
||||||
if UnitIsUnit(realunit, unit) then
|
|
||||||
unitcache[unit] = realunit
|
|
||||||
return realunit
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return unit
|
|
||||||
end
|
|
||||||
|
|
||||||
function librange:GetRangeSlot()
|
|
||||||
if not spells[class] then return nil end
|
|
||||||
for i=1,120 do
|
|
||||||
-- Resolve the slot to a spellID for both spell and macro actions; the old
|
|
||||||
-- `not GetActionText` macro-filter missed macros that cast a 40y heal but
|
|
||||||
-- displayed a non-spell icon. C_Spell.GetSpellTexture(spellID) gives the
|
|
||||||
-- spell's *intrinsic* icon, which is what we match against.
|
|
||||||
local kind, id = GetActionInfo(i)
|
|
||||||
local spellID
|
|
||||||
if kind == "spell" then
|
|
||||||
spellID = id
|
|
||||||
elseif kind == "macro" then
|
|
||||||
local _, _, sid = GetMacroSpell(id)
|
|
||||||
spellID = sid
|
|
||||||
end
|
|
||||||
if spellID then
|
|
||||||
local texture = C_Spell.GetSpellTexture(spellID)
|
|
||||||
if texture then
|
|
||||||
for _, check in pairs(spells[class]) do
|
|
||||||
if check == texture then return i end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function librange:UnitInSpellRange(unit)
|
function librange:UnitInSpellRange(unit)
|
||||||
if UnitIsUnit("target", unit) then
|
-- _G-qualified: bare `UnitInRange` resolves to pfUI.api.UnitInRange inside
|
||||||
if not librange.slot then return nil end
|
-- the pfUI environment (which calls us), so this must reach ClassicAPI's
|
||||||
return IsActionInRange(librange.slot) == 1 and 1 or nil
|
-- global directly or it recurses.
|
||||||
end
|
local inRange, checked = _G.UnitInRange(unit)
|
||||||
|
-- position miss (e.g. a unit outside the client's sync range): we can't
|
||||||
local unit = librange:GetRealUnit(unit)
|
-- tell, so default to in-range -- matches the old cache's nil behavior.
|
||||||
|
if not checked then return 1 end
|
||||||
if unitdata[unit] and unitdata[unit] == 1 then
|
return inRange and 1 or nil
|
||||||
return 1
|
|
||||||
elseif not unitdata[unit] then
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- add librange to pfUI API
|
-- add librange to pfUI API
|
||||||
|
|||||||
+9
-6
@@ -83,12 +83,13 @@ end
|
|||||||
-- [number] Casting time of the spell in milliseconds
|
-- [number] Casting time of the spell in milliseconds
|
||||||
-- [number] Minimum range from the target required to cast the spell
|
-- [number] Minimum range from the target required to cast the spell
|
||||||
-- [number] Maximum range from the target at which you can cast the spell
|
-- [number] Maximum range from the target at which you can cast the spell
|
||||||
-- [number] The numeric spell-id of the spell
|
-- [number] Spell's index in the book
|
||||||
-- [number] The type of the spellbook that the spell is in
|
-- [number] The type of the spellbook that the spell is in
|
||||||
|
-- [number] The numeric spell-id of the spell
|
||||||
local spellinfo = {}
|
local spellinfo = {}
|
||||||
function libspell.GetSpellInfo(index, bookType)
|
function libspell.GetSpellInfo(index, bookType)
|
||||||
local cache = spellinfo[index]
|
local cache = spellinfo[index]
|
||||||
if cache then return cache[1], cache[2], cache[3], cache[4], cache[5], cache[6], cache[7], cache[8] end
|
if cache then return unpack(cache) end
|
||||||
|
|
||||||
local slot
|
local slot
|
||||||
if type(index) == "string" then
|
if type(index) == "string" then
|
||||||
@@ -108,17 +109,19 @@ function libspell.GetSpellInfo(index, bookType)
|
|||||||
-- ClassicAPI's GetSpellInfo returns: name, rank, icon, cost, isFunnel, powerType,
|
-- ClassicAPI's GetSpellInfo returns: name, rank, icon, cost, isFunnel, powerType,
|
||||||
-- castTime(ms), minRange, maxRange, spellID. Keep libspell's historical positional
|
-- castTime(ms), minRange, maxRange, spellID. Keep libspell's historical positional
|
||||||
-- shape (castingTime at 4, ranges at 5/6, slot+bookType at 7/8).
|
-- shape (castingTime at 4, ranges at 5/6, slot+bookType at 7/8).
|
||||||
local name, rank, icon, _, _, _, castingTime, minRange, maxRange = GetSpellInfo(slot, bookType)
|
local name, rank, icon, _, _, _, castingTime, minRange, maxRange, spellId = GetSpellInfo(slot, bookType)
|
||||||
|
|
||||||
spellinfo[index] = { name, rank, icon, castingTime, minRange, maxRange, slot, bookType }
|
spellinfo[index] = SafePack(name, rank, icon, castingTime, minRange, maxRange, slot, bookType, spellId)
|
||||||
return name, rank, icon, castingTime, minRange, maxRange, slot, bookType
|
return name, rank, icon, castingTime, minRange, maxRange, slot, bookType, spellId
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Reset all spell caches whenever new spells are learned/unlearned
|
-- Reset all spell caches whenever new spells are learned/unlearned
|
||||||
local resetcache = CreateFrame("Frame")
|
local resetcache = CreateFrame("Frame")
|
||||||
resetcache:RegisterEvent("LEARNED_SPELL_IN_TAB")
|
resetcache:RegisterEvent("LEARNED_SPELL_IN_TAB")
|
||||||
resetcache:SetScript("OnEvent", function()
|
resetcache:SetScript("OnEvent", function()
|
||||||
spellmaxrank, spellindex, spellinfo = {}, {}, {}
|
table.wipe(spellmaxrank)
|
||||||
|
table.wipe(spellindex)
|
||||||
|
table.wipe(spellinfo)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- add libspell to pfUI API
|
-- add libspell to pfUI API
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ libthrottle.defaults = {
|
|||||||
nameplates_target = "custom",
|
nameplates_target = "custom",
|
||||||
nameplates_castbar = "custom",
|
nameplates_castbar = "custom",
|
||||||
nameplates_mass = "custom",
|
nameplates_mass = "custom",
|
||||||
tooltip_cursor = "custom",
|
tooltip_cursor = "fastest",
|
||||||
chat_tab = "custom",
|
chat_tab = "custom",
|
||||||
swingtimer = "custom",
|
swingtimer = "custom",
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ libthrottle:SetScript("OnEvent", function()
|
|||||||
-- Set defaults for custom fields if missing
|
-- Set defaults for custom fields if missing
|
||||||
if not _G.pfUI_throttle.nameplates_target_custom then _G.pfUI_throttle.nameplates_target_custom = "50" end
|
if not _G.pfUI_throttle.nameplates_target_custom then _G.pfUI_throttle.nameplates_target_custom = "50" end
|
||||||
if not _G.pfUI_throttle.nameplates_custom then _G.pfUI_throttle.nameplates_custom = "10" end
|
if not _G.pfUI_throttle.nameplates_custom then _G.pfUI_throttle.nameplates_custom = "10" end
|
||||||
if not _G.pfUI_throttle.nameplates_castbar_custom then _G.pfUI_throttle.nameplates_castbar_custom = "50" end
|
if not _G.pfUI_throttle.nameplates_castbar_custom then _G.pfUI_throttle.nameplates_castbar_custom = "100" end
|
||||||
if not _G.pfUI_throttle.nameplates_mass_custom then _G.pfUI_throttle.nameplates_mass_custom = "7" end
|
if not _G.pfUI_throttle.nameplates_mass_custom then _G.pfUI_throttle.nameplates_mass_custom = "7" end
|
||||||
if not _G.pfUI_throttle.tooltip_cursor_custom then _G.pfUI_throttle.tooltip_cursor_custom = "10" end
|
if not _G.pfUI_throttle.tooltip_cursor_custom then _G.pfUI_throttle.tooltip_cursor_custom = "10" end
|
||||||
if not _G.pfUI_throttle.chat_tab_custom then _G.pfUI_throttle.chat_tab_custom = "10" end
|
if not _G.pfUI_throttle.chat_tab_custom then _G.pfUI_throttle.chat_tab_custom = "10" end
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
hooksecurefunc(GameTooltip, "SetBagItem", function(self, container, slot)
|
|
||||||
_, libtooltip.itemCount = GetContainerItemInfo(container, slot)
|
|
||||||
end)
|
|
||||||
@@ -1,275 +0,0 @@
|
|||||||
-- load pfUI environment
|
|
||||||
setfenv(1, pfUI:GetEnvironment())
|
|
||||||
|
|
||||||
--[[ libtotem ]]--
|
|
||||||
-- A pfUI library that tries to emulate the TotemAPI that was introduced in Patch 2.4.
|
|
||||||
-- It detects and saves all current totems of the player and returns information based
|
|
||||||
-- on the totem slot ID. The function GetTotemInfo is supposed to work as it would
|
|
||||||
-- on later expansions.
|
|
||||||
--
|
|
||||||
-- GetTotemInfo(id)
|
|
||||||
-- Returns totem informations on the givent totem slot
|
|
||||||
-- active, name, start, duration, icon
|
|
||||||
|
|
||||||
-- return instantly when another libtotem is already active
|
|
||||||
if pfUI.api.libtotem then return end
|
|
||||||
|
|
||||||
MAX_TOTEMS = MAX_TOTEMS or 4
|
|
||||||
FIRE_TOTEM_SLOT = FIRE_TOTEM_SLOT or 1
|
|
||||||
EARTH_TOTEM_SLOT = EARTH_TOTEM_SLOT or 2
|
|
||||||
WATER_TOTEM_SLOT = WATER_TOTEM_SLOT or 3
|
|
||||||
AIR_TOTEM_SLOT = AIR_TOTEM_SLOT or 4
|
|
||||||
|
|
||||||
local _, class = UnitClass("player")
|
|
||||||
|
|
||||||
local libtotem
|
|
||||||
local active = { [1] = {}, [2] = {}, [3] = {}, [4] = {} }
|
|
||||||
|
|
||||||
-- SpellID -> { slot, duration } mapping
|
|
||||||
-- rank-specific durations are handled via spellId directly
|
|
||||||
local spellids = {
|
|
||||||
-- FIRE (slot 1)
|
|
||||||
[1535] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R1
|
|
||||||
[8498] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R2
|
|
||||||
[8499] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R3
|
|
||||||
[11314] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R4
|
|
||||||
[11315] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R5
|
|
||||||
[8227] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R1
|
|
||||||
[8249] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R2
|
|
||||||
[10526] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R3
|
|
||||||
[16387] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R4
|
|
||||||
[8184] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Frost Resistance Totem R1
|
|
||||||
[10478] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Frost Resistance Totem R2
|
|
||||||
[10479] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Frost Resistance Totem R3
|
|
||||||
[8190] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R1
|
|
||||||
[10585] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R2
|
|
||||||
[10586] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R3
|
|
||||||
[10587] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R4
|
|
||||||
[3599] = { slot = FIRE_TOTEM_SLOT, duration = 30 }, -- Searing Totem R1
|
|
||||||
[6363] = { slot = FIRE_TOTEM_SLOT, duration = 35 }, -- Searing Totem R2
|
|
||||||
[6364] = { slot = FIRE_TOTEM_SLOT, duration = 40 }, -- Searing Totem R3
|
|
||||||
[6365] = { slot = FIRE_TOTEM_SLOT, duration = 45 }, -- Searing Totem R4
|
|
||||||
[10437] = { slot = FIRE_TOTEM_SLOT, duration = 50 }, -- Searing Totem R5
|
|
||||||
[10438] = { slot = FIRE_TOTEM_SLOT, duration = 55 }, -- Searing Totem R6
|
|
||||||
|
|
||||||
-- EARTH (slot 2)
|
|
||||||
[2484] = { slot = EARTH_TOTEM_SLOT, duration = 45 }, -- Earthbind Totem
|
|
||||||
[5730] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R1
|
|
||||||
[6390] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R2
|
|
||||||
[6391] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R3
|
|
||||||
[6392] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R4
|
|
||||||
[10427] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R5
|
|
||||||
[10428] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R6
|
|
||||||
[8071] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R1
|
|
||||||
[8154] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R2
|
|
||||||
[8155] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R3
|
|
||||||
[10406] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R4
|
|
||||||
[10407] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R5
|
|
||||||
[10408] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R6
|
|
||||||
[8075] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R1
|
|
||||||
[8160] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R2
|
|
||||||
[8161] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R3
|
|
||||||
[10442] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R4
|
|
||||||
[25361] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R5
|
|
||||||
[8143] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Tremor Totem
|
|
||||||
|
|
||||||
-- WATER (slot 3)
|
|
||||||
[8170] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Disease Cleansing Totem
|
|
||||||
[8185] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Fire Resistance Totem R1
|
|
||||||
[10537] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Fire Resistance Totem R2
|
|
||||||
[10538] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Fire Resistance Totem R3
|
|
||||||
[5394] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R1
|
|
||||||
[6375] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R2
|
|
||||||
[6377] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R3
|
|
||||||
[10462] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R4
|
|
||||||
[10463] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R5
|
|
||||||
[5675] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R1
|
|
||||||
[10495] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R2
|
|
||||||
[10496] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R3
|
|
||||||
[10497] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R4
|
|
||||||
[16190] = { slot = WATER_TOTEM_SLOT, duration = 12 }, -- Mana Tide Totem
|
|
||||||
[8166] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Poison Cleansing Totem
|
|
||||||
|
|
||||||
-- AIR (slot 4)
|
|
||||||
[8835] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Grace of Air Totem R1
|
|
||||||
[10627] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Grace of Air Totem R2
|
|
||||||
[8177] = { slot = AIR_TOTEM_SLOT, duration = 45 }, -- Grounding Totem
|
|
||||||
[10595] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Nature Resistance Totem R1
|
|
||||||
[10600] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Nature Resistance Totem R2
|
|
||||||
[10601] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Nature Resistance Totem R3
|
|
||||||
[25359] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Tranquil Air Totem
|
|
||||||
[8512] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windfury Totem R1
|
|
||||||
[10613] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windfury Totem R2
|
|
||||||
[10614] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windfury Totem R3
|
|
||||||
[15107] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windwall Totem R1
|
|
||||||
[15421] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windwall Totem R2
|
|
||||||
[15422] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windwall Totem R3
|
|
||||||
}
|
|
||||||
|
|
||||||
-- icon-based fallback table (used by CastSpell/UseAction hooks that don't have spellId)
|
|
||||||
local totems = {
|
|
||||||
[FIRE_TOTEM_SLOT] = {
|
|
||||||
["Spell_Fire_SealOfFire"] = {[-1] = 5},
|
|
||||||
["Spell_Nature_GuardianWard"] = {[-1] = 120},
|
|
||||||
["Spell_FrostResistanceTotem_01"] = {[-1] = 120},
|
|
||||||
["Spell_Fire_SelfDestruct"] = {[-1] = 20},
|
|
||||||
["Spell_Fire_SearingTotem"] = {[-1] = 55,[1] = 30,[2] = 35,[3] = 40,[4] = 45,[5] = 50,[6] = 55},
|
|
||||||
},
|
|
||||||
[EARTH_TOTEM_SLOT] = {
|
|
||||||
["Spell_Nature_StrengthOfEarthTotem02"] = {[-1] = 45},
|
|
||||||
["Spell_Nature_StoneClawTotem"] = {[-1] = 15},
|
|
||||||
["Spell_Nature_StoneSkinTotem"] = {[-1] = 120},
|
|
||||||
["Spell_Nature_EarthBindTotem"] = {[-1] = 120},
|
|
||||||
["Spell_Nature_TremorTotem"] = {[-1] = 120},
|
|
||||||
},
|
|
||||||
[WATER_TOTEM_SLOT] = {
|
|
||||||
["Spell_Nature_DiseaseCleansingTotem"] = {[-1] = 120},
|
|
||||||
["Spell_FireResistanceTotem_01"] = {[-1] = 120},
|
|
||||||
["INV_Spear_04"] = {[-1] = 60},
|
|
||||||
["Spell_Nature_ManaRegenTotem"] = {[-1] = 60},
|
|
||||||
["Spell_Frost_SummonWaterElemental"] = {[-1] = 12},
|
|
||||||
["Spell_Nature_PoisonCleansingTotem"] = {[-1] = 120},
|
|
||||||
},
|
|
||||||
[AIR_TOTEM_SLOT] = {
|
|
||||||
["Spell_Nature_InvisibilityTotem"] = {[-1] = 120},
|
|
||||||
["Spell_Nature_GroundingTotem"] = {[-1] = 45},
|
|
||||||
["Spell_Nature_NatureResistanceTotem"] = {[-1] = 120},
|
|
||||||
["Spell_Nature_Brilliance"] = {[-1] = 120},
|
|
||||||
["Spell_Nature_Windfury"] = {[-1] = 120},
|
|
||||||
["Spell_Nature_EarthBind"] = {[-1] = 120},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
GetTotemInfo = function(id)
|
|
||||||
if not active[id] or not active[id].name then return end
|
|
||||||
if active[id].start + active[id].duration - GetTime() < 0 then
|
|
||||||
libtotem:Clean(id)
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return 1, active[id].name, active[id].start, active[id].duration, active[id].icon
|
|
||||||
end
|
|
||||||
|
|
||||||
if class ~= "SHAMAN" then return end
|
|
||||||
|
|
||||||
libtotem = CreateFrame("Frame")
|
|
||||||
libtotem:RegisterEvent("PLAYER_DEAD")
|
|
||||||
libtotem:SetScript("OnEvent", function()
|
|
||||||
if event == "PLAYER_DEAD" then
|
|
||||||
for i = 1, 4 do libtotem:Clean(i) end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
libtotem.totems = totems
|
|
||||||
|
|
||||||
libtotem.Clean = function(self, slot)
|
|
||||||
active[slot].name = nil
|
|
||||||
active[slot].start = nil
|
|
||||||
active[slot].duration = nil
|
|
||||||
active[slot].icon = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Direct SpellID commit (Nampower SPELL_GO_SELF, most accurate)
|
|
||||||
libtotem.CommitBySpellId = function(spellId, icon)
|
|
||||||
local data = spellids[spellId]
|
|
||||||
if not data then return false end
|
|
||||||
local slot = data.slot
|
|
||||||
active[slot].name = active[slot].pending_name or active[slot].name
|
|
||||||
active[slot].duration = data.duration
|
|
||||||
active[slot].icon = icon or active[slot].pending_icon
|
|
||||||
active[slot].start = GetTime()
|
|
||||||
active[slot].pending_name = nil
|
|
||||||
active[slot].pending_icon = nil
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Fallback: icon-based lookup (for CastSpell/UseAction without spellId)
|
|
||||||
libtotem.CheckAddQueue = function(self, name, rank, icon, spellId)
|
|
||||||
-- if we have a spellId, just store the name/icon as pending for SPELL_GO
|
|
||||||
if spellId and spellids[spellId] then
|
|
||||||
local slot = spellids[spellId].slot
|
|
||||||
active[slot].pending_name = name
|
|
||||||
active[slot].pending_icon = icon
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- icon-based fallback
|
|
||||||
for slot = 1, 4 do
|
|
||||||
for texture, data in pairs(totems[slot]) do
|
|
||||||
if string.find(icon, texture, 1) then
|
|
||||||
if rank then
|
|
||||||
_, _, rank = string.find(rank, "%s(%d+)")
|
|
||||||
end
|
|
||||||
local duration
|
|
||||||
if rank and tonumber(rank) and data[tonumber(rank)] then
|
|
||||||
duration = data[tonumber(rank)]
|
|
||||||
else
|
|
||||||
duration = data[-1]
|
|
||||||
end
|
|
||||||
active[slot].pending_name = name
|
|
||||||
active[slot].pending_icon = icon
|
|
||||||
active[slot].pending_duration = duration
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- assign library to global space
|
|
||||||
pfUI.api.libtotem = libtotem
|
|
||||||
|
|
||||||
-- SPELL_GO_SELF from libdebuff: commit directly by SpellID, no queue needed
|
|
||||||
pfUI.libdebuff_spell_go_hooks = pfUI.libdebuff_spell_go_hooks or {}
|
|
||||||
pfUI.libdebuff_spell_go_hooks["libtotem"] = function(spellId)
|
|
||||||
if not spellId then return end
|
|
||||||
local data = spellids[spellId]
|
|
||||||
if not data then return end
|
|
||||||
local slot = data.slot
|
|
||||||
-- use pending name/icon if available (set by CastSpellByName hook), else GetSpellInfo
|
|
||||||
local name = active[slot].pending_name
|
|
||||||
local icon = active[slot].pending_icon
|
|
||||||
if not name then
|
|
||||||
name = C_Spell.GetSpellName(spellId)
|
|
||||||
end
|
|
||||||
active[slot].name = name
|
|
||||||
active[slot].duration = data.duration
|
|
||||||
active[slot].icon = icon
|
|
||||||
active[slot].start = GetTime()
|
|
||||||
active[slot].pending_name = nil
|
|
||||||
active[slot].pending_icon = nil
|
|
||||||
active[slot].pending_duration = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Hook CastSpellByName to store pending name/icon per slot
|
|
||||||
hooksecurefunc("CastSpellByName", function(effect, target)
|
|
||||||
local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(effect)
|
|
||||||
if not name then return end
|
|
||||||
libtotem:CheckAddQueue(name, rank, icon, spellId)
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Hook CastSpell to store pending name/icon per slot
|
|
||||||
hooksecurefunc("CastSpell", function(id, bookType)
|
|
||||||
if not id or not bookType then return end
|
|
||||||
if bookType ~= BOOKTYPE_SPELL and bookType ~= BOOKTYPE_PET then return end
|
|
||||||
local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(id, bookType)
|
|
||||||
if not name then return end
|
|
||||||
libtotem:CheckAddQueue(name, rank, icon, spellId)
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Hook UseAction. GetActionInfo + GetMacroSpell give us the spellID
|
|
||||||
-- directly for both spell-action and macro-action slots, so the
|
|
||||||
-- tooltip-scan fallback (and the "no spellId available" caveat) goes away.
|
|
||||||
hooksecurefunc("UseAction", function(slot, target, selfcast)
|
|
||||||
if not IsCurrentAction(slot) then return end
|
|
||||||
local kind, id = GetActionInfo(slot)
|
|
||||||
local name, rank, spellID
|
|
||||||
if kind == "spell" then
|
|
||||||
spellID = id
|
|
||||||
local spellInfo = C_Spell.GetSpellInfo(id)
|
|
||||||
name, rank = spellInfo.name, spellInfo.rank
|
|
||||||
elseif kind == "macro" then
|
|
||||||
name, rank, spellID = GetMacroSpell(id)
|
|
||||||
end
|
|
||||||
if not name then return end
|
|
||||||
libtotem:CheckAddQueue(name, rank, GetActionTexture(slot), spellID)
|
|
||||||
end)
|
|
||||||
+32
-31
@@ -89,20 +89,19 @@ libunitscan:SetScript("OnEvent", function()
|
|||||||
|
|
||||||
-- update own character details
|
-- update own character details
|
||||||
local name = UnitName("player")
|
local name = UnitName("player")
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
local level = UnitLevel("player")
|
local level = UnitLevel("player")
|
||||||
local guild = GetGuildInfo("player")
|
local guild = GetGuildInfo("player")
|
||||||
AddData("players", name, class, level, nil, guild)
|
AddData("players", name, class, level, nil, guild)
|
||||||
RememberByUnit("player", name, class)
|
RememberByUnit("player", name, class)
|
||||||
|
|
||||||
elseif event == "FRIENDLIST_UPDATE" then
|
elseif event == "FRIENDLIST_UPDATE" then
|
||||||
local name, class, level
|
|
||||||
for i = 1, GetNumFriends() do
|
for i = 1, GetNumFriends() do
|
||||||
name, level, class = GetFriendInfo(i)
|
local info = C_FriendList.GetFriendInfoByIndex(i)
|
||||||
class = L["class"][class] or nil
|
if info then
|
||||||
-- friendlist updates due to friend going off-line return level 0, let's not overwrite good older values
|
local level = info.level > 0 and info.level or nil
|
||||||
level = level > 0 and level or nil
|
AddData("players", info.name, info.classFilename, level)
|
||||||
AddData("players", name, class, level)
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "GUILD_ROSTER_UPDATE" then
|
elseif event == "GUILD_ROSTER_UPDATE" then
|
||||||
@@ -128,7 +127,7 @@ libunitscan:SetScript("OnEvent", function()
|
|||||||
local name, class, level, unit, _, guild
|
local name, class, level, unit, _, guild
|
||||||
for i = 1, GetNumPartyMembers() do
|
for i = 1, GetNumPartyMembers() do
|
||||||
unit = "party" .. i
|
unit = "party" .. i
|
||||||
_, class = UnitClass(unit)
|
class = UnitClassBase(unit)
|
||||||
name = UnitName(unit)
|
name = UnitName(unit)
|
||||||
level = UnitLevel(unit)
|
level = UnitLevel(unit)
|
||||||
guild = GetGuildInfo(unit)
|
guild = GetGuildInfo(unit)
|
||||||
@@ -137,11 +136,11 @@ libunitscan:SetScript("OnEvent", function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "WHO_LIST_UPDATE" or event == "CHAT_MSG_SYSTEM" then
|
elseif event == "WHO_LIST_UPDATE" or event == "CHAT_MSG_SYSTEM" then
|
||||||
local name, class, level, guild, _
|
for i = 1, C_FriendList.GetNumWhoResults() do
|
||||||
for i = 1, GetNumWhoResults() do
|
local info = C_FriendList.GetWhoInfo(i)
|
||||||
name, guild, level, _, class, _ = GetWhoInfo(i)
|
if info then
|
||||||
class = L["class"][class] or nil
|
AddData("players", info.fullName, info.filename, info.level, nil, info.fullGuildName)
|
||||||
AddData("players", name, class, level, nil, guild)
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "UPDATE_MOUSEOVER_UNIT" or event == "PLAYER_TARGET_CHANGED" or event == "NAME_PLATE_UNIT_ADDED" then
|
elseif event == "UPDATE_MOUSEOVER_UNIT" or event == "PLAYER_TARGET_CHANGED" or event == "NAME_PLATE_UNIT_ADDED" then
|
||||||
@@ -149,24 +148,26 @@ libunitscan:SetScript("OnEvent", function()
|
|||||||
or event == "NAME_PLATE_UNIT_ADDED" and arg1
|
or event == "NAME_PLATE_UNIT_ADDED" and arg1
|
||||||
or "mouseover"
|
or "mouseover"
|
||||||
local name, class, level, elite, guild, _
|
local name, class, level, elite, guild, _
|
||||||
if UnitIsPlayer(scan) then
|
if UnitExists(scan) then
|
||||||
_, class = UnitClass(scan)
|
if UnitIsPlayer(scan) then
|
||||||
level = UnitLevel(scan)
|
class = UnitClassBase(scan)
|
||||||
-- UnitLevel returns -1 for unknown levels, don't overwrite known values
|
level = UnitLevel(scan)
|
||||||
level = level > 0 and level or nil
|
-- UnitLevel returns -1 for unknown levels, don't overwrite known values
|
||||||
name = UnitName(scan)
|
level = level > 0 and level or nil
|
||||||
guild = GetGuildInfo(scan)
|
name = UnitName(scan)
|
||||||
AddData("players", name, class, level, nil, guild)
|
guild = GetGuildInfo(scan)
|
||||||
RememberByUnit(scan, name, class)
|
AddData("players", name, class, level, nil, guild)
|
||||||
else
|
RememberByUnit(scan, name, class)
|
||||||
_, class = UnitClass(scan)
|
else
|
||||||
elite = UnitClassification(scan)
|
class = UnitClassBase(scan)
|
||||||
level = UnitLevel(scan)
|
elite = UnitClassification(scan)
|
||||||
-- UnitLevel returns -1 for unknown levels, don't overwrite known values
|
level = UnitLevel(scan)
|
||||||
level = level > 0 and level or nil
|
-- UnitLevel returns -1 for unknown levels, don't overwrite known values
|
||||||
name = UnitName(scan)
|
level = level > 0 and level or nil
|
||||||
guild = UnitSubName(scan)
|
name = UnitName(scan)
|
||||||
AddData("mobs", name, class, level, elite, guild)
|
guild = UnitSubName(scan)
|
||||||
|
AddData("mobs", name, class, level, elite, guild)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|||||||
+82
-91
@@ -1,5 +1,5 @@
|
|||||||
pfUI:RegisterModule("actionbar", function ()
|
pfUI:RegisterModule("actionbar", function ()
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
local _, cr, cg, cb = GetUnitColor('player')
|
local _, cr, cg, cb = GetUnitColor('player')
|
||||||
local er, eg, eb, ea = GetStringColor(pfUI_config.appearance.border.color)
|
local er, eg, eb, ea = GetStringColor(pfUI_config.appearance.border.color)
|
||||||
|
|
||||||
@@ -168,8 +168,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
["zoomfade"] = function()
|
["zoomfade"] = function()
|
||||||
if this.active == 0 then
|
if this.active == 0 then
|
||||||
-- init animation
|
-- init animation
|
||||||
this:SetWidth(this.parent:GetWidth())
|
this:SetSize(this.parent:GetSize())
|
||||||
this:SetHeight(this.parent:GetHeight())
|
|
||||||
this:SetScale(this.parent:GetScale())
|
this:SetScale(this.parent:GetScale())
|
||||||
this.tex:SetTexture(this.parent.icon:GetTexture())
|
this.tex:SetTexture(this.parent.icon:GetTexture())
|
||||||
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
||||||
@@ -191,8 +190,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
["shrinkreturn"] = function()
|
["shrinkreturn"] = function()
|
||||||
if this.active == 0 then
|
if this.active == 0 then
|
||||||
-- init animation
|
-- init animation
|
||||||
this:SetWidth(this.parent:GetWidth())
|
this:SetSize(this.parent:GetSize())
|
||||||
this:SetHeight(this.parent:GetHeight())
|
|
||||||
this:SetScale(this.parent:GetScale())
|
this:SetScale(this.parent:GetScale())
|
||||||
this.tex:SetTexture(this.parent.icon:GetTexture())
|
this.tex:SetTexture(this.parent.icon:GetTexture())
|
||||||
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
||||||
@@ -218,8 +216,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
["elasticzoom"] = function()
|
["elasticzoom"] = function()
|
||||||
if this.active == 0 then
|
if this.active == 0 then
|
||||||
-- init animation
|
-- init animation
|
||||||
this:SetWidth(this.parent:GetWidth())
|
this:SetSize(this.parent:GetSize())
|
||||||
this:SetHeight(this.parent:GetHeight())
|
|
||||||
this:SetScale(this.parent:GetScale())
|
this:SetScale(this.parent:GetScale())
|
||||||
this.tex:SetTexture(this.parent.icon:GetTexture())
|
this.tex:SetTexture(this.parent.icon:GetTexture())
|
||||||
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
||||||
@@ -245,8 +242,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
["wobblezoom"] = function()
|
["wobblezoom"] = function()
|
||||||
if this.active == 0 then
|
if this.active == 0 then
|
||||||
-- init animation
|
-- init animation
|
||||||
this:SetWidth(this.parent:GetWidth())
|
this:SetSize(this.parent:GetSize())
|
||||||
this:SetHeight(this.parent:GetHeight())
|
|
||||||
this:SetScale(this.parent:GetScale())
|
this:SetScale(this.parent:GetScale())
|
||||||
this.tex:SetTexture(this.parent.icon:GetTexture())
|
this.tex:SetTexture(this.parent.icon:GetTexture())
|
||||||
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
this.tex:SetVertexColor(this.parent.icon:GetVertexColor())
|
||||||
@@ -375,12 +371,12 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
-- active conditional dynamically, instead of being frozen to the first
|
-- active conditional dynamically, instead of being frozen to the first
|
||||||
-- statically-scanned spell.
|
-- statically-scanned spell.
|
||||||
if CleveRoids and CleveRoids.IsManagedAction and CleveRoids.IsManagedAction(self.id) then
|
if CleveRoids and CleveRoids.IsManagedAction and CleveRoids.IsManagedAction(self.id) then
|
||||||
self.spellslot, self.booktype = nil, nil
|
self.spellslot, self.booktype, self.spellID = nil, nil, nil
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local kind, slot = GetActionInfo(self.id)
|
local kind, slot = GetActionInfo(self.id)
|
||||||
self.spellslot, self.booktype = nil, nil
|
self.spellslot, self.booktype, self.spellID = nil, nil, nil
|
||||||
if kind == 'macro' then
|
if kind == 'macro' then
|
||||||
local name, _, body = GetMacroInfo(slot)
|
local name, _, body = GetMacroInfo(slot)
|
||||||
|
|
||||||
@@ -418,10 +414,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if match then
|
if match then
|
||||||
local _, _, spell, rank = string.find(match, '(.+)%((.+)%)')
|
self.spellslot, self.booktype, self.spellID = select(7, libspell.GetSpellInfo(match))
|
||||||
spell = spell or match
|
|
||||||
self.spellslot, self.booktype = libspell.GetSpellIndex(spell, rank)
|
|
||||||
|
|
||||||
if self.spellslot and self.spellslot > 0 then return end
|
if self.spellslot and self.spellslot > 0 then return end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -430,7 +423,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function ButtonEnter(self)
|
local function ButtonEnter(self)
|
||||||
local self = self or this
|
self = self or this
|
||||||
|
|
||||||
-- indicate that dragging could get enabled
|
-- indicate that dragging could get enabled
|
||||||
drag_await = true
|
drag_await = true
|
||||||
@@ -448,6 +441,8 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
else
|
else
|
||||||
GameTooltip:SetPetAction(self.id)
|
GameTooltip:SetPetAction(self.id)
|
||||||
end
|
end
|
||||||
|
elseif self.spellID then
|
||||||
|
GameTooltip:SetSpellByID(self.spellID)
|
||||||
elseif self.spellslot and self.booktype then
|
elseif self.spellslot and self.booktype then
|
||||||
GameTooltip:SetSpell(self.spellslot, self.booktype)
|
GameTooltip:SetSpell(self.spellslot, self.booktype)
|
||||||
else
|
else
|
||||||
@@ -458,7 +453,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function ButtonLeave(self)
|
local function ButtonLeave(self)
|
||||||
local self = self or this
|
self = self or this
|
||||||
|
|
||||||
-- no longer wait for a drag event
|
-- no longer wait for a drag event
|
||||||
drag_await = nil
|
drag_await = nil
|
||||||
@@ -471,7 +466,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
local grid, sid, id, bar, active, texture, _
|
local grid, sid, id, bar, active, texture, _
|
||||||
local function ButtonSlotUpdate(self)
|
local function ButtonSlotUpdate(self)
|
||||||
if not self then return end
|
if not self then return end
|
||||||
local self = self or this
|
self = self or this
|
||||||
sid = self.id -- 1 to 120
|
sid = self.id -- 1 to 120
|
||||||
|
|
||||||
-- reset shared variables
|
-- reset shared variables
|
||||||
@@ -590,7 +585,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
|
|
||||||
local sid, usable, oom, _
|
local sid, usable, oom, _
|
||||||
local function ButtonUsableUpdate(self)
|
local function ButtonUsableUpdate(self)
|
||||||
local self = self or this
|
self = self or this
|
||||||
sid = self.id -- 1 to 120
|
sid = self.id -- 1 to 120
|
||||||
|
|
||||||
if self.bar == 11 then
|
if self.bar == 11 then
|
||||||
@@ -604,17 +599,17 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
-- update usable [out-of-range = 1, oom = 2, not-usable = 3, default = 0]
|
-- update usable [out-of-range = 1, oom = 2, not-usable = 3, default = 0]
|
||||||
if self.outofrange and C.bars.glowrange == "1" then
|
if self.outofrange and C.bars.glowrange == "1" then
|
||||||
if self.vertexstate ~= 1 then
|
if self.vertexstate ~= 1 then
|
||||||
self.icon:SetVertexColor(self.rangeColor[1], self.rangeColor[2], self.rangeColor[3], self.rangeColor[4])
|
self.icon:SetVertexColor(self.rangeColor:GetRGBA())
|
||||||
self.vertexstate = 1
|
self.vertexstate = 1
|
||||||
end
|
end
|
||||||
elseif oom and C.bars.showoom == "1" then
|
elseif oom and C.bars.showoom == "1" then
|
||||||
if self.vertexstate ~= 2 then
|
if self.vertexstate ~= 2 then
|
||||||
self.icon:SetVertexColor(self.oomColor[1], self.oomColor[2], self.oomColor[3], self.oomColor[4])
|
self.icon:SetVertexColor(self.oomColor:GetRGBA())
|
||||||
self.vertexstate = 2
|
self.vertexstate = 2
|
||||||
end
|
end
|
||||||
elseif not usable and C.bars.showna == "1" then
|
elseif not usable and C.bars.showna == "1" then
|
||||||
if self.vertexstate ~= 3 then
|
if self.vertexstate ~= 3 then
|
||||||
self.icon:SetVertexColor(self.naColor[1], self.naColor[2], self.naColor[3], self.naColor[4])
|
self.icon:SetVertexColor(self.naColor:GetRGBA())
|
||||||
self.vertexstate = 3
|
self.vertexstate = 3
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -626,7 +621,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function ButtonRangeUpdate(self)
|
local function ButtonRangeUpdate(self)
|
||||||
local self = self or this
|
self = self or this
|
||||||
|
|
||||||
-- update range display
|
-- update range display
|
||||||
if C.bars.glowrange == "1" and self.bar ~= 11 and self.bar ~= 12 and HasAction(self.id) and ActionHasRange(self.id) and IsActionInRange(self.id) == 0 then
|
if C.bars.glowrange == "1" and self.bar ~= 11 and self.bar ~= 12 and HasAction(self.id) and ActionHasRange(self.id) and IsActionInRange(self.id) == 0 then
|
||||||
@@ -704,7 +699,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function BarsEvent(self)
|
local function BarsEvent(self)
|
||||||
local self = self or this
|
self = self or this
|
||||||
|
|
||||||
-- refresh only specific slots
|
-- refresh only specific slots
|
||||||
if event == "ACTIONBAR_SLOT_CHANGED" and arg1 and arg1 ~= 0 then
|
if event == "ACTIONBAR_SLOT_CHANGED" and arg1 and arg1 ~= 0 then
|
||||||
@@ -853,16 +848,20 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local cat, stealth
|
|
||||||
local inCatForm = nil
|
local inCatForm = nil
|
||||||
local prowlActive = nil
|
local prowlActive = nil
|
||||||
|
|
||||||
-- Cat Form ID per vanilla 1.12 SpellShapeshiftForm.dbc.
|
-- Form IDs per vanilla 1.12 SpellShapeshiftForm.dbc.
|
||||||
local CAT_FORM = 1
|
local CAT_FORM = 1
|
||||||
|
local SHADOWFORM = 28
|
||||||
local function HasCatForm()
|
local function HasCatForm()
|
||||||
return GetShapeshiftFormID() == CAT_FORM and true or nil
|
return GetShapeshiftFormID() == CAT_FORM and true or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function InShadowform()
|
||||||
|
return GetShapeshiftFormID() == SHADOWFORM and true or nil
|
||||||
|
end
|
||||||
|
|
||||||
local function FullScan()
|
local function FullScan()
|
||||||
if class ~= "DRUID" then return nil end
|
if class ~= "DRUID" then return nil end
|
||||||
inCatForm = HasCatForm()
|
inCatForm = HasCatForm()
|
||||||
@@ -872,7 +871,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
|
|
||||||
-- pagemaster / meta page switch
|
-- pagemaster / meta page switch
|
||||||
do
|
do
|
||||||
local prowl, shift, ctrl, alt, default = 8, 6, 5, 3, 1
|
local formpage, shift, ctrl, alt, default = 8, 6, 5, 3, 1
|
||||||
|
|
||||||
-- set temporary pagemaster bindings keybinds
|
-- set temporary pagemaster bindings keybinds
|
||||||
if C.bars.pagemaster == "1" then
|
if C.bars.pagemaster == "1" then
|
||||||
@@ -890,8 +889,10 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- setup page switch frame
|
-- setup page switch frame. `formpaging` is the shared "auto-page is
|
||||||
local prowling = nil
|
-- active" flag; druid prowl and priest shadowform each drive it, and
|
||||||
|
-- no character is ever both, so one flag covers both features.
|
||||||
|
local formpaging = nil
|
||||||
local pageswitch = CreateFrame("Frame", "pfActionBarPageSwitch", UIParent)
|
local pageswitch = CreateFrame("Frame", "pfActionBarPageSwitch", UIParent)
|
||||||
pageswitch:RegisterEvent("PLAYER_ENTERING_WORLD")
|
pageswitch:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
pageswitch:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
|
pageswitch:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
|
||||||
@@ -905,10 +906,17 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if class == "PRIEST" then
|
||||||
|
if event == "UPDATE_SHAPESHIFT_FORM" or event == "PLAYER_ENTERING_WORLD" then
|
||||||
|
formpaging = InShadowform()
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if class ~= "DRUID" then return end
|
if class ~= "DRUID" then return end
|
||||||
|
|
||||||
if event == "PLAYER_ENTERING_WORLD" then
|
if event == "PLAYER_ENTERING_WORLD" then
|
||||||
prowling = FullScan()
|
formpaging = FullScan()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -917,7 +925,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
inCatForm = HasCatForm()
|
inCatForm = HasCatForm()
|
||||||
if not inCatForm then
|
if not inCatForm then
|
||||||
prowlActive = nil
|
prowlActive = nil
|
||||||
prowling = nil
|
formpaging = nil
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -927,10 +935,10 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
if inCatForm then
|
if inCatForm then
|
||||||
if IsStealthed() then
|
if IsStealthed() then
|
||||||
prowlActive = true
|
prowlActive = true
|
||||||
prowling = true
|
formpaging = true
|
||||||
else
|
else
|
||||||
prowlActive = nil
|
prowlActive = nil
|
||||||
prowling = nil
|
formpaging = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
@@ -946,7 +954,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
if PROWL_IDS[spellId] then
|
if PROWL_IDS[spellId] then
|
||||||
inCatForm = true
|
inCatForm = true
|
||||||
prowlActive = true
|
prowlActive = true
|
||||||
prowling = true
|
formpaging = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
pageswitch:SetScript("OnUpdate", function()
|
pageswitch:SetScript("OnUpdate", function()
|
||||||
@@ -964,11 +972,12 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
SwitchBar(default)
|
SwitchBar(default)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- switch actionbar page if druid stealth is detected
|
-- switch actionbar page while druid stealth / priest shadowform is active
|
||||||
if C.bars.druidstealth == "1" then
|
if (class == "DRUID" and C.bars.druidstealth == "1")
|
||||||
if prowling and _G.CURRENT_ACTIONBAR_PAGE == 1 then
|
or (class == "PRIEST" and C.bars.priestshadow == "1") then
|
||||||
SwitchBar(prowl)
|
if formpaging and _G.CURRENT_ACTIONBAR_PAGE == 1 then
|
||||||
elseif not prowling and _G.CURRENT_ACTIONBAR_PAGE == 8 then
|
SwitchBar(formpage)
|
||||||
|
elseif not formpaging and _G.CURRENT_ACTIONBAR_PAGE == 8 then
|
||||||
SwitchBar(default)
|
SwitchBar(default)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -982,13 +991,13 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
local font_offset = tonumber(C.bars.font_offset)
|
local font_offset = tonumber(C.bars.font_offset)
|
||||||
|
|
||||||
local macro_size = tonumber(C.bars.macro_size)
|
local macro_size = tonumber(C.bars.macro_size)
|
||||||
local macro_color = { strsplit(",", C.bars.macro_color) }
|
local macro_color = { GetStringColor(C.bars.macro_color) }
|
||||||
|
|
||||||
local count_size = tonumber(C.bars.count_size)
|
local count_size = tonumber(C.bars.count_size)
|
||||||
local count_color = { strsplit(",", C.bars.count_color) }
|
local count_color = { GetStringColor(C.bars.count_color) }
|
||||||
|
|
||||||
local bind_size = tonumber(C.bars.bind_size)
|
local bind_size = tonumber(C.bars.bind_size)
|
||||||
local bind_color = { strsplit(",", C.bars.bind_color) }
|
local bind_color = { GetStringColor(C.bars.bind_color) }
|
||||||
|
|
||||||
local cd_size = tonumber(C.bars.cd_size)
|
local cd_size = tonumber(C.bars.cd_size)
|
||||||
|
|
||||||
@@ -1147,23 +1156,22 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- range glow color
|
-- range glow color
|
||||||
f.rangeColor = { strsplit(",", C.bars.rangecolor) }
|
f.rangeColor = GetStringColorObject(C.bars.rangecolor)
|
||||||
|
|
||||||
-- out of mana color
|
-- out of mana color
|
||||||
f.oomColor = { strsplit(",", C.bars.oomcolor) }
|
f.oomColor = GetStringColorObject(C.bars.oomcolor)
|
||||||
|
|
||||||
-- not usable color
|
-- not usable color
|
||||||
f.naColor = { strsplit(",", C.bars.nacolor) }
|
f.naColor = GetStringColorObject(C.bars.nacolor)
|
||||||
|
|
||||||
-- equipped color
|
-- equipped color
|
||||||
if f.equipped then
|
if f.equipped then
|
||||||
f.equipped:SetTexture(strsplit(",", C.bars.eqcolor))
|
f.equipped:SetTexture(GetStringColor(C.bars.eqcolor))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- general appearance
|
-- general appearance
|
||||||
f.showempty = showempty == "1" and true or nil
|
f.showempty = showempty == "1" and true or nil
|
||||||
f:SetHeight(size)
|
f:SetSize(size, size)
|
||||||
f:SetWidth(size)
|
|
||||||
CreateBackdrop(f, border)
|
CreateBackdrop(f, border)
|
||||||
|
|
||||||
return f
|
return f
|
||||||
@@ -1335,8 +1343,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
|
|
||||||
-- adjust actionbar size
|
-- adjust actionbar size
|
||||||
BarLayoutSize(bars[i], buttons, formfactor, size, border, spacing, uneven, fillmode)
|
BarLayoutSize(bars[i], buttons, formfactor, size, border, spacing, uneven, fillmode)
|
||||||
bars[i]:SetWidth(bars[i]._size[1])
|
bars[i]:SetSize(bars[i]._size[1], bars[i]._size[2])
|
||||||
bars[i]:SetHeight(bars[i]._size[2])
|
|
||||||
bars[i]:ClearAllPoints()
|
bars[i]:ClearAllPoints()
|
||||||
if i == 1 then -- main
|
if i == 1 then -- main
|
||||||
bars[i]:SetPoint("BOTTOM", 0, 2*border)
|
bars[i]:SetPoint("BOTTOM", 0, 2*border)
|
||||||
@@ -1538,7 +1545,7 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
-- via GetActionInfo + C_Spell.GetSpellReagents. Macro actions and
|
-- via GetActionInfo + C_Spell.GetSpellReagents. Macro actions and
|
||||||
-- bag-item actions are skipped (their reagent resolution would need a
|
-- bag-item actions are skipped (their reagent resolution would need a
|
||||||
-- macro-body parse / item-effect lookup that we don't bother with).
|
-- macro-body parse / item-effect lookup that we don't bother with).
|
||||||
local UpdateSlot = function(slot)
|
local function UpdateSlot(slot)
|
||||||
local newID = nil
|
local newID = nil
|
||||||
if HasAction(slot) then
|
if HasAction(slot) then
|
||||||
local kind, spellID = GetActionInfo(slot)
|
local kind, spellID = GetActionInfo(slot)
|
||||||
@@ -1553,60 +1560,44 @@ pfUI:RegisterModule("actionbar", function ()
|
|||||||
if reagent_slots[slot] ~= newID then
|
if reagent_slots[slot] ~= newID then
|
||||||
reagent_slots[slot] = newID
|
reagent_slots[slot] = newID
|
||||||
if newID then
|
if newID then
|
||||||
reagent_counts[newID] = reagent_counts[newID] or 0
|
reagent_counts[newID] = reagent_counts[newID] or C_Item.GetItemCount(newID)
|
||||||
end
|
end
|
||||||
updatecache[slot] = true
|
updatecache[slot] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Recount every tracked reagent and flag its buttons for a refresh.
|
||||||
|
local RecountReagents = function()
|
||||||
|
for itemID in pairs(reagent_counts) do
|
||||||
|
reagent_counts[itemID] = C_Item.GetItemCount(itemID)
|
||||||
|
end
|
||||||
|
for slot in pairs(reagent_slots) do
|
||||||
|
updatecache[slot] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local reagentcounter = CreateFrame("Frame", "pfReagentCounter", UIParent)
|
local reagentcounter = CreateFrame("Frame", "pfReagentCounter", UIParent)
|
||||||
reagentcounter:RegisterEvent("PLAYER_ENTERING_WORLD")
|
reagentcounter:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
reagentcounter:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
|
reagentcounter:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
|
||||||
reagentcounter:RegisterEvent("BAG_UPDATE_DELAYED")
|
reagentcounter:RegisterEvent("BAG_UPDATE_DELAYED")
|
||||||
reagentcounter:SetScript("OnEvent", function()
|
reagentcounter:SetScript("OnEvent", function()
|
||||||
if event == "BAG_UPDATE_DELAYED" then
|
if event == "ACTIONBAR_SLOT_CHANGED" then
|
||||||
this.event = true
|
-- arg1 is the changed slot; 0 (or nil) means "all slots"
|
||||||
|
if arg1 and arg1 > 0 then
|
||||||
|
UpdateSlot(arg1)
|
||||||
|
else
|
||||||
|
for slot = 1, 120 do UpdateSlot(slot) end
|
||||||
|
end
|
||||||
|
elseif event == "BAG_UPDATE_DELAYED" then
|
||||||
|
-- inventory changed: refresh the counts we already track
|
||||||
|
RecountReagents()
|
||||||
else
|
else
|
||||||
this.scan = 1
|
-- PLAYER_ENTERING_WORLD: seed the full reagent map (UpdateSlot seeds
|
||||||
|
-- each new reagent's count; a BAG_UPDATE_DELAYED follows during login)
|
||||||
|
for slot = 1, 120 do UpdateSlot(slot) end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Reagent counter update with throttle for performance optimization
|
|
||||||
reagentcounter:SetScript("OnUpdate", function()
|
|
||||||
-- Throttle entire function to 10 FPS for smooth scanning
|
|
||||||
if (this.tick_update or 0) > GetTime() then return end
|
|
||||||
this.tick_update = GetTime() + 0.1
|
|
||||||
|
|
||||||
-- scan one action slot per update
|
|
||||||
if this.scan and this.scan <= 120 then
|
|
||||||
UpdateSlot(this.scan)
|
|
||||||
this.scan = this.scan + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
-- trigger reagent count updates after action scans
|
|
||||||
if this.scan and this.scan >= 120 then
|
|
||||||
this.event = true
|
|
||||||
this.scan = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- queue events to fire only once per second
|
|
||||||
if not this.event then return end
|
|
||||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + 1 end
|
|
||||||
|
|
||||||
-- scan for all reagent item counts
|
|
||||||
for itemID in pairs(reagent_counts) do
|
|
||||||
reagent_counts[itemID] = C_Item.GetItemCount(itemID)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- update all actionbar buttons
|
|
||||||
for slot in pairs(reagent_slots) do
|
|
||||||
updatecache[slot] = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- remove event trigger
|
|
||||||
this.event = nil
|
|
||||||
end)
|
|
||||||
|
|
||||||
function IsReagentAction(slot)
|
function IsReagentAction(slot)
|
||||||
return reagent_slots[slot] and true or nil
|
return reagent_slots[slot] and true or nil
|
||||||
end
|
end
|
||||||
|
|||||||
+27
-33
@@ -37,15 +37,10 @@ pfUI:RegisterModule("addonbuttons", function ()
|
|||||||
|
|
||||||
pfUI.addonbuttons.minimapbutton = CreateFrame("Button", "pfMinimapButton", pfUI.minimap or UIParent)
|
pfUI.addonbuttons.minimapbutton = CreateFrame("Button", "pfMinimapButton", pfUI.minimap or UIParent)
|
||||||
pfUI.addonbuttons.minimapbutton:SetFrameLevel(24)
|
pfUI.addonbuttons.minimapbutton:SetFrameLevel(24)
|
||||||
pfUI.addonbuttons.minimapbutton:SetWidth(12)
|
pfUI.addonbuttons.minimapbutton:SetSize(12, 12)
|
||||||
pfUI.addonbuttons.minimapbutton:SetHeight(12)
|
|
||||||
|
|
||||||
pfUI.addonbuttons.minimapbutton:SetScript("OnClick", function()
|
pfUI.addonbuttons.minimapbutton:SetScript("OnClick", function()
|
||||||
if pfUI.addonbuttons:IsShown() then
|
pfUI.addonbuttons:SetShown(not pfUI.addonbuttons:IsShown())
|
||||||
pfUI.addonbuttons:Hide()
|
|
||||||
else
|
|
||||||
pfUI.addonbuttons:Show()
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
pfUI.addonbuttons.buttons = {}
|
pfUI.addonbuttons.buttons = {}
|
||||||
@@ -163,27 +158,25 @@ pfUI:RegisterModule("addonbuttons", function ()
|
|||||||
pfUI.addonbuttons:SetScale(pfUI.minimap:GetScale())
|
pfUI.addonbuttons:SetScale(pfUI.minimap:GetScale())
|
||||||
|
|
||||||
pfUI.addonbuttons.minimapbutton:ClearAllPoints()
|
pfUI.addonbuttons.minimapbutton:ClearAllPoints()
|
||||||
|
local mbtnWidth, mbtnHeight = pfUI.minimap:GetSize()
|
||||||
|
local dynamicSize = ceil((GetNumButtons() > 0 and GetNumButtons() or 1) / tonumber(C.abuttons.rowsize)) * GetStringSize() + tonumber(C.abuttons.spacing)
|
||||||
if C.abuttons.position == "bottom" then
|
if C.abuttons.position == "bottom" then
|
||||||
pfUI.addonbuttons:SetWidth(pfUI.minimap:GetWidth())
|
pfUI.addonbuttons:SetSize(mbtnWidth, dynamicSize)
|
||||||
pfUI.addonbuttons:SetHeight(ceil((GetNumButtons() > 0 and GetNumButtons() or 1) / tonumber(C.abuttons.rowsize)) * GetStringSize() + tonumber(C.abuttons.spacing))
|
|
||||||
pfUI.addonbuttons:SetPoint("TOP", pfUI.minimap, "BOTTOM", 0 , -default_border * 3)
|
pfUI.addonbuttons:SetPoint("TOP", pfUI.minimap, "BOTTOM", 0 , -default_border * 3)
|
||||||
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "down")
|
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "down")
|
||||||
pfUI.addonbuttons.minimapbutton:SetPoint("BOTTOM", pfUI.minimap, "BOTTOM", 0, 4)
|
pfUI.addonbuttons.minimapbutton:SetPoint("BOTTOM", pfUI.minimap, "BOTTOM", 0, 4)
|
||||||
elseif C.abuttons.position == "left" then
|
elseif C.abuttons.position == "left" then
|
||||||
pfUI.addonbuttons:SetWidth(ceil((GetNumButtons() > 0 and GetNumButtons() or 1) / tonumber(C.abuttons.rowsize)) * GetStringSize() + tonumber(C.abuttons.spacing))
|
pfUI.addonbuttons:SetSize(dynamicSize, mbtnHeight)
|
||||||
pfUI.addonbuttons:SetHeight(pfUI.minimap:GetHeight())
|
|
||||||
pfUI.addonbuttons:SetPoint("TOPRIGHT", pfUI.minimap, "TOPLEFT", -default_border * 3, 0)
|
pfUI.addonbuttons:SetPoint("TOPRIGHT", pfUI.minimap, "TOPLEFT", -default_border * 3, 0)
|
||||||
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "left")
|
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "left")
|
||||||
pfUI.addonbuttons.minimapbutton:SetPoint("LEFT", pfUI.minimap, "LEFT", 4, 0)
|
pfUI.addonbuttons.minimapbutton:SetPoint("LEFT", pfUI.minimap, "LEFT", 4, 0)
|
||||||
elseif C.abuttons.position == "top" then
|
elseif C.abuttons.position == "top" then
|
||||||
pfUI.addonbuttons:SetWidth(pfUI.minimap:GetWidth())
|
pfUI.addonbuttons:SetSize(mbtnWidth, dynamicSize)
|
||||||
pfUI.addonbuttons:SetHeight(ceil((GetNumButtons() > 0 and GetNumButtons() or 1) / tonumber(C.abuttons.rowsize)) * GetStringSize() + tonumber(C.abuttons.spacing))
|
|
||||||
pfUI.addonbuttons:SetPoint("BOTTOM", pfUI.minimap, "TOP", 0 , default_border * 3)
|
pfUI.addonbuttons:SetPoint("BOTTOM", pfUI.minimap, "TOP", 0 , default_border * 3)
|
||||||
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "up")
|
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "up")
|
||||||
pfUI.addonbuttons.minimapbutton:SetPoint("TOP", pfUI.minimap, "TOP", 0, -4)
|
pfUI.addonbuttons.minimapbutton:SetPoint("TOP", pfUI.minimap, "TOP", 0, -4)
|
||||||
elseif C.abuttons.position == "right" then
|
elseif C.abuttons.position == "right" then
|
||||||
pfUI.addonbuttons:SetWidth(ceil((GetNumButtons() > 0 and GetNumButtons() or 1) / tonumber(C.abuttons.rowsize)) * GetStringSize() + tonumber(C.abuttons.spacing))
|
pfUI.addonbuttons:SetSize(dynamicSize, mbtnHeight)
|
||||||
pfUI.addonbuttons:SetHeight(pfUI.minimap:GetHeight())
|
|
||||||
pfUI.addonbuttons:SetPoint("TOPLEFT", pfUI.minimap, "TOPRIGHT", default_border * 3, 0)
|
pfUI.addonbuttons:SetPoint("TOPLEFT", pfUI.minimap, "TOPRIGHT", default_border * 3, 0)
|
||||||
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "right")
|
SkinArrowButton(pfUI.addonbuttons.minimapbutton, "right")
|
||||||
pfUI.addonbuttons.minimapbutton:SetPoint("RIGHT", pfUI.minimap, "RIGHT", -4, 0)
|
pfUI.addonbuttons.minimapbutton:SetPoint("RIGHT", pfUI.minimap, "RIGHT", -4, 0)
|
||||||
@@ -231,7 +224,7 @@ pfUI:RegisterModule("addonbuttons", function ()
|
|||||||
frame.backup.is_clamped_to_screen = frame:IsClampedToScreen()
|
frame.backup.is_clamped_to_screen = frame:IsClampedToScreen()
|
||||||
frame.backup.is_movable = frame:IsMovable()
|
frame.backup.is_movable = frame:IsMovable()
|
||||||
frame.backup.point = {frame:GetPoint()}
|
frame.backup.point = {frame:GetPoint()}
|
||||||
frame.backup.size = {frame:GetHeight(), frame:GetWidth()}
|
frame.backup.size = {frame:GetSize()}
|
||||||
frame.backup.scale = frame:GetScale()
|
frame.backup.scale = frame:GetScale()
|
||||||
if frame:HasScript("OnDragStart") then
|
if frame:HasScript("OnDragStart") then
|
||||||
frame.backup.on_drag_start = frame:GetScript("OnDragStart")
|
frame.backup.on_drag_start = frame:GetScript("OnDragStart")
|
||||||
@@ -256,8 +249,7 @@ pfUI:RegisterModule("addonbuttons", function ()
|
|||||||
frame:SetClampedToScreen(frame.backup.is_clamped_to_screen)
|
frame:SetClampedToScreen(frame.backup.is_clamped_to_screen)
|
||||||
frame:SetMovable(frame.backup.is_movable)
|
frame:SetMovable(frame.backup.is_movable)
|
||||||
frame:SetScale(frame.backup.scale)
|
frame:SetScale(frame.backup.scale)
|
||||||
frame:SetHeight(frame.backup.size[1])
|
frame:SetSize(frame.backup.size[2], frame.backup.size[1])
|
||||||
frame:SetWidth(frame.backup.size[2])
|
|
||||||
frame:ClearAllPoints()
|
frame:ClearAllPoints()
|
||||||
frame:SetPoint(frame.backup.point[1], frame.backup.point[2], frame.backup.point[3], frame.backup.point[4], frame.backup.point[5])
|
frame:SetPoint(frame.backup.point[1], frame.backup.point[2], frame.backup.point[3], frame.backup.point[4], frame.backup.point[5])
|
||||||
if frame.backup.on_drag_start ~= nil then
|
if frame.backup.on_drag_start ~= nil then
|
||||||
@@ -405,22 +397,25 @@ pfUI:RegisterModule("addonbuttons", function ()
|
|||||||
pfUI.addonbuttons:ProcessButtons()
|
pfUI.addonbuttons:ProcessButtons()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
pfUI.addonbuttons:SetScript("OnUpdate", function()
|
-- Initial setup on the next frame, once other addons' minimap buttons exist
|
||||||
|
RunNextFrame(function()
|
||||||
-- check if the panel should be shown by default
|
-- check if the panel should be shown by default
|
||||||
if not this.initialized then
|
if C.abuttons.showdefault == "1" and GetNumButtons() > 0 then
|
||||||
if C.abuttons.showdefault == "1" and GetNumButtons() > 0 then
|
pfUI.addonbuttons:Show()
|
||||||
pfUI.addonbuttons:Show()
|
else
|
||||||
else
|
pfUI.addonbuttons:Hide()
|
||||||
pfUI.addonbuttons:Hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- update all buttons
|
|
||||||
pfUI.addonbuttons:ProcessButtons()
|
|
||||||
this.initialized = true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- throttle updates to once per 5 seconds
|
-- update all buttons and apply workarounds
|
||||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + 5 end
|
pfUI.addonbuttons:ProcessButtons()
|
||||||
|
for k, v in pairs(pfUI.addonbuttons.overrides) do
|
||||||
|
_G[k] = v
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Rescan minimap buttons every 5 seconds while the panel is shown
|
||||||
|
C_Timer.NewTicker(5, function()
|
||||||
|
if not pfUI.addonbuttons:IsShown() then return end
|
||||||
|
|
||||||
-- reload/rescan minimap buttons
|
-- reload/rescan minimap buttons
|
||||||
pfUI.addonbuttons:ProcessButtons()
|
pfUI.addonbuttons:ProcessButtons()
|
||||||
@@ -440,6 +435,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)
|
||||||
|
|||||||
+7
-14
@@ -18,8 +18,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
-- addon window
|
-- addon window
|
||||||
pfUI.addons = CreateFrame("Frame", "pfAddons", UIParent)
|
pfUI.addons = CreateFrame("Frame", "pfAddons", UIParent)
|
||||||
pfUI.addons:SetFrameStrata("DIALOG")
|
pfUI.addons:SetFrameStrata("DIALOG")
|
||||||
pfUI.addons:SetHeight(490)
|
pfUI.addons:SetSize(380, 490)
|
||||||
pfUI.addons:SetWidth(380)
|
|
||||||
pfUI.addons:SetPoint("CENTER", 0,0)
|
pfUI.addons:SetPoint("CENTER", 0,0)
|
||||||
pfUI.addons:EnableMouseWheel(1)
|
pfUI.addons:EnableMouseWheel(1)
|
||||||
pfUI.addons:SetMovable(true)
|
pfUI.addons:SetMovable(true)
|
||||||
@@ -51,8 +50,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
pfUI.addons.close = CreateFrame("Button", "pfBagClose", pfUI.addons)
|
pfUI.addons.close = CreateFrame("Button", "pfBagClose", pfUI.addons)
|
||||||
pfUI.addons.close:SetPoint("TOPRIGHT", -border*2,-border*2 )
|
pfUI.addons.close:SetPoint("TOPRIGHT", -border*2,-border*2 )
|
||||||
CreateBackdrop(pfUI.addons.close)
|
CreateBackdrop(pfUI.addons.close)
|
||||||
pfUI.addons.close:SetHeight(15)
|
pfUI.addons.close:SetSize(15, 15)
|
||||||
pfUI.addons.close:SetWidth(15)
|
|
||||||
pfUI.addons.close.texture = pfUI.addons.close:CreateTexture("pfBagClose")
|
pfUI.addons.close.texture = pfUI.addons.close:CreateTexture("pfBagClose")
|
||||||
pfUI.addons.close.texture:SetTexture(pfUI.media["img:close"])
|
pfUI.addons.close.texture:SetTexture(pfUI.media["img:close"])
|
||||||
pfUI.addons.close.texture:ClearAllPoints()
|
pfUI.addons.close.texture:ClearAllPoints()
|
||||||
@@ -125,8 +123,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
pfUI.addons.profile:SetPoint("TOP", pfUI.addons, "TOP", 0, -30)
|
pfUI.addons.profile:SetPoint("TOP", pfUI.addons, "TOP", 0, -30)
|
||||||
pfUI.addons.profile:SetHeight(30)
|
pfUI.addons.profile:SetSize(370, 30)
|
||||||
pfUI.addons.profile:SetWidth(370)
|
|
||||||
CreateBackdrop(pfUI.addons.profile, nil, true)
|
CreateBackdrop(pfUI.addons.profile, nil, true)
|
||||||
|
|
||||||
-- addon profile: title
|
-- addon profile: title
|
||||||
@@ -139,8 +136,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
-- addon profile: delete
|
-- addon profile: delete
|
||||||
pfUI.addons.profile.del = CreateFrame("Button", nil, pfUI.addons.profile, "UIPanelButtonTemplate")
|
pfUI.addons.profile.del = CreateFrame("Button", nil, pfUI.addons.profile, "UIPanelButtonTemplate")
|
||||||
SkinButton(pfUI.addons.profile.del)
|
SkinButton(pfUI.addons.profile.del)
|
||||||
pfUI.addons.profile.del:SetWidth(16)
|
pfUI.addons.profile.del:SetSize(16, 16)
|
||||||
pfUI.addons.profile.del:SetHeight(16)
|
|
||||||
pfUI.addons.profile.del:SetPoint("RIGHT", -10, 0)
|
pfUI.addons.profile.del:SetPoint("RIGHT", -10, 0)
|
||||||
pfUI.addons.profile.del:GetFontString():SetPoint("CENTER", 1, 0)
|
pfUI.addons.profile.del:GetFontString():SetPoint("CENTER", 1, 0)
|
||||||
pfUI.addons.profile.del:SetText("-")
|
pfUI.addons.profile.del:SetText("-")
|
||||||
@@ -157,8 +153,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
-- addon profile: create
|
-- addon profile: create
|
||||||
pfUI.addons.profile.add = CreateFrame("Button", nil, pfUI.addons.profile, "UIPanelButtonTemplate")
|
pfUI.addons.profile.add = CreateFrame("Button", nil, pfUI.addons.profile, "UIPanelButtonTemplate")
|
||||||
SkinButton(pfUI.addons.profile.add)
|
SkinButton(pfUI.addons.profile.add)
|
||||||
pfUI.addons.profile.add:SetWidth(16)
|
pfUI.addons.profile.add:SetSize(16, 16)
|
||||||
pfUI.addons.profile.add:SetHeight(16)
|
|
||||||
pfUI.addons.profile.add:SetPoint("RIGHT", pfUI.addons.profile.del, "LEFT", -4, 0)
|
pfUI.addons.profile.add:SetPoint("RIGHT", pfUI.addons.profile.del, "LEFT", -4, 0)
|
||||||
pfUI.addons.profile.add:GetFontString():SetPoint("CENTER", 1, 0)
|
pfUI.addons.profile.add:GetFontString():SetPoint("CENTER", 1, 0)
|
||||||
pfUI.addons.profile.add:SetText("+")
|
pfUI.addons.profile.add:SetText("+")
|
||||||
@@ -201,8 +196,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
|
|
||||||
-- addon list: scroll frame
|
-- addon list: scroll frame
|
||||||
pfUI.addons.scroll = CreateScrollFrame("pfAddonListScroll", pfUI.addons)
|
pfUI.addons.scroll = CreateScrollFrame("pfAddonListScroll", pfUI.addons)
|
||||||
pfUI.addons.scroll:SetWidth(360)
|
pfUI.addons.scroll:SetSize(360, 410)
|
||||||
pfUI.addons.scroll:SetHeight(410)
|
|
||||||
pfUI.addons.scroll:SetPoint("BOTTOM", 0, 10)
|
pfUI.addons.scroll:SetPoint("BOTTOM", 0, 10)
|
||||||
|
|
||||||
pfUI.addons.scroll.backdrop = CreateFrame("Frame", nil, pfUI.addons.scroll)
|
pfUI.addons.scroll.backdrop = CreateFrame("Frame", nil, pfUI.addons.scroll)
|
||||||
@@ -292,8 +286,7 @@ pfUI:RegisterModule("addons", function ()
|
|||||||
frame.adeps = { GetAddOnDependencies(i) } -- required (.toc Dependencies)
|
frame.adeps = { GetAddOnDependencies(i) } -- required (.toc Dependencies)
|
||||||
frame.aoptdeps = { C_AddOns.GetAddOnOptionalDependencies(i) } -- optional (.toc OptionalDeps)
|
frame.aoptdeps = { C_AddOns.GetAddOnOptionalDependencies(i) } -- optional (.toc OptionalDeps)
|
||||||
|
|
||||||
frame:SetWidth(340)
|
frame:SetSize(340, 25)
|
||||||
frame:SetHeight(25)
|
|
||||||
frame:SetPoint("TOPLEFT", 5, i * -25 + 20)
|
frame:SetPoint("TOPLEFT", 5, i * -25 + 20)
|
||||||
|
|
||||||
frame:SetBackdrop(pfUI.backdrop_hover)
|
frame:SetBackdrop(pfUI.backdrop_hover)
|
||||||
|
|||||||
+1
-2
@@ -48,8 +48,7 @@ pfUI:RegisterModule("afkcam", function ()
|
|||||||
local chat = CreateFrame("ScrollingMessageFrame", "pfAFKCamChat", overlay)
|
local chat = CreateFrame("ScrollingMessageFrame", "pfAFKCamChat", overlay)
|
||||||
chat:EnableMouse(false)
|
chat:EnableMouse(false)
|
||||||
chat:EnableMouseWheel(true)
|
chat:EnableMouseWheel(true)
|
||||||
chat:SetHeight(150)
|
chat:SetSize(500, 150)
|
||||||
chat:SetWidth(500)
|
|
||||||
chat:SetPoint("BOTTOMLEFT",overlay,"BOTTOMLEFT", 10, 10)
|
chat:SetPoint("BOTTOMLEFT",overlay,"BOTTOMLEFT", 10, 10)
|
||||||
chat:SetTimeVisible(1800.0)
|
chat:SetTimeVisible(1800.0)
|
||||||
chat:SetMaxLines(500)
|
chat:SetMaxLines(500)
|
||||||
|
|||||||
@@ -2,6 +2,11 @@ pfUI:RegisterModule("autoshift", function ()
|
|||||||
pfUI.autoshift = CreateFrame("Frame")
|
pfUI.autoshift = CreateFrame("Frame")
|
||||||
pfUI.autoshift:RegisterEvent("UI_ERROR_MESSAGE")
|
pfUI.autoshift:RegisterEvent("UI_ERROR_MESSAGE")
|
||||||
|
|
||||||
|
-- Empty stub kept only so Turtle WoW's pfUI-turtle addon doesn't error when
|
||||||
|
-- its obsolete moonkin autoshift module iterates pfUI.autoshift.shapeshifts.
|
||||||
|
-- This fork drives autoshift off GetShapeshiftFormID() and no longer uses it.
|
||||||
|
pfUI.autoshift.shapeshifts = {}
|
||||||
|
|
||||||
pfUI.autoshift.scanString = string.gsub(SPELL_FAILED_ONLY_SHAPESHIFT, "%%s", "(.+)")
|
pfUI.autoshift.scanString = string.gsub(SPELL_FAILED_ONLY_SHAPESHIFT, "%%s", "(.+)")
|
||||||
|
|
||||||
pfUI.autoshift.errors = { SPELL_FAILED_NOT_MOUNTED, ERR_ATTACK_MOUNTED, ERR_TAXIPLAYERALREADYMOUNTED,
|
pfUI.autoshift.errors = { SPELL_FAILED_NOT_MOUNTED, ERR_ATTACK_MOUNTED, ERR_TAXIPLAYERALREADYMOUNTED,
|
||||||
|
|||||||
@@ -56,8 +56,7 @@ pfUI:RegisterModule("autovendor", function ()
|
|||||||
|
|
||||||
-- Setup Autosell button
|
-- Setup Autosell button
|
||||||
autovendor.button = CreateFrame("Button", "pfMerchantAutoVendorButton", MerchantFrame)
|
autovendor.button = CreateFrame("Button", "pfMerchantAutoVendorButton", MerchantFrame)
|
||||||
autovendor.button:SetWidth(36)
|
autovendor.button:SetSize(36, 36)
|
||||||
autovendor.button:SetHeight(36)
|
|
||||||
autovendor.button.icon = autovendor.button:CreateTexture("ARTWORK")
|
autovendor.button.icon = autovendor.button:CreateTexture("ARTWORK")
|
||||||
autovendor.button.icon:SetTexture("Interface\\Icons\\Spell_Shadow_SacrificialShield")
|
autovendor.button.icon:SetTexture("Interface\\Icons\\Spell_Shadow_SacrificialShield")
|
||||||
autovendor.button:SetScript("OnEnter", function()
|
autovendor.button:SetScript("OnEnter", function()
|
||||||
|
|||||||
+33
-54
@@ -8,6 +8,13 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
|
|
||||||
local scanner = libtipscan:GetScanner("input_search")
|
local scanner = libtipscan:GetScanner("input_search")
|
||||||
|
|
||||||
|
local function BagSortOpts()
|
||||||
|
return {
|
||||||
|
reverse = C.appearance.bags.sortreverse == "1",
|
||||||
|
reversePrio = C.appearance.bags.sortprioreverse == "1",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
-- function to detect openable items in inventory
|
-- function to detect openable items in inventory
|
||||||
local openable = { bag = nil, slot = nil, icon = nil }
|
local openable = { bag = nil, slot = nil, icon = nil }
|
||||||
local function GetNextOpenable()
|
local function GetNextOpenable()
|
||||||
@@ -319,8 +326,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
default_border + x*(frame.button_size+default_border*3),
|
default_border + x*(frame.button_size+default_border*3),
|
||||||
-default_border*2 - y*(frame.button_size+default_border*3) - topspace)
|
-default_border*2 - y*(frame.button_size+default_border*3) - topspace)
|
||||||
|
|
||||||
pfUI.bags[bag].slots[slot].frame:SetHeight(frame.button_size)
|
pfUI.bags[bag].slots[slot].frame:SetSize(frame.button_size, frame.button_size)
|
||||||
pfUI.bags[bag].slots[slot].frame:SetWidth(frame.button_size)
|
|
||||||
|
|
||||||
if x >= rowlength - 1 then
|
if x >= rowlength - 1 then
|
||||||
y = y + 1
|
y = y + 1
|
||||||
@@ -337,12 +343,13 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
local chat = pfUI.chat and ( object == "bank" and pfUI.chat.left or pfUI.chat.right) or nil
|
local chat = pfUI.chat and ( object == "bank" and pfUI.chat.left or pfUI.chat.right) or nil
|
||||||
|
|
||||||
frame:SetScript("OnShow", function()
|
frame:SetScript("OnShow", function()
|
||||||
|
frame.opened = true
|
||||||
if C.appearance.bags.hidechat == "1" and chat and chat:IsVisible() then
|
if C.appearance.bags.hidechat == "1" and chat and chat:IsVisible() then
|
||||||
frame.chatWasOpen = true
|
frame.chatWasOpen = true
|
||||||
chat:Hide()
|
chat:Hide()
|
||||||
end
|
end
|
||||||
if C.appearance.bags.autoSortOnOpen == "1" then
|
if C.appearance.bags.autoSortOnOpen == "1" then
|
||||||
libbagsort:Sort({0, 1, 2, 3, 4})
|
libbagsort:Sort({0, 1, 2, 3, 4}, BagSortOpts())
|
||||||
end
|
end
|
||||||
pfUI.bag:CreateBags(object)
|
pfUI.bag:CreateBags(object)
|
||||||
PlaySound("INTERFACESOUND_BACKPACKOPEN")
|
PlaySound("INTERFACESOUND_BACKPACKOPEN")
|
||||||
@@ -355,6 +362,10 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
end
|
end
|
||||||
pfUI.bag:CreateBags(object)
|
pfUI.bag:CreateBags(object)
|
||||||
PlaySound("INTERFACESOUND_BACKPACKCLOSE")
|
PlaySound("INTERFACESOUND_BACKPACKCLOSE")
|
||||||
|
if frame.opened then
|
||||||
|
frame.opened = nil
|
||||||
|
pfUI.events:TriggerEvent("bag:closed", object)
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -443,7 +454,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local _, _, q, _, _, _, itype = GetItemInfo(itemID)
|
local _, _, q, _, _, _, itype = C_Item.GetItemInfo(itemID)
|
||||||
|
|
||||||
-- running advanced item color scan
|
-- running advanced item color scan
|
||||||
if C.appearance.bags.borderonlygear == "0" and texture and quality and quality < 1 then
|
if C.appearance.bags.borderonlygear == "0" and texture and quality and quality < 1 then
|
||||||
@@ -533,8 +544,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
local width = (frame.button_size/5*4 + default_border*2) * (max-min+1+extra)
|
local width = (frame.button_size/5*4 + default_border*2) * (max-min+1+extra)
|
||||||
local height = default_border + (frame.button_size/5*4 + default_border)
|
local height = default_border + (frame.button_size/5*4 + default_border)
|
||||||
|
|
||||||
frame.bagslots:SetWidth(width)
|
frame.bagslots:SetSize(width, height)
|
||||||
frame.bagslots:SetHeight(height)
|
|
||||||
for slot=min, max do
|
for slot=min, max do
|
||||||
if not frame.bagslots.slots[slot] then
|
if not frame.bagslots.slots[slot] then
|
||||||
frame.bagslots.slots[slot] = {}
|
frame.bagslots.slots[slot] = {}
|
||||||
@@ -594,8 +604,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
|
|
||||||
frame.bagslots.slots[slot].frame:ClearAllPoints()
|
frame.bagslots.slots[slot].frame:ClearAllPoints()
|
||||||
frame.bagslots.slots[slot].frame:SetPoint("TOPLEFT", frame.bagslots, "TOPLEFT", left, top)
|
frame.bagslots.slots[slot].frame:SetPoint("TOPLEFT", frame.bagslots, "TOPLEFT", left, top)
|
||||||
frame.bagslots.slots[slot].frame:SetHeight(frame.button_size/5*4)
|
frame.bagslots.slots[slot].frame:SetSize(frame.button_size/5*4, frame.button_size/5*4)
|
||||||
frame.bagslots.slots[slot].frame:SetWidth(frame.button_size/5*4)
|
|
||||||
|
|
||||||
CreateBackdrop(frame.bagslots.slots[slot].frame, default_border)
|
CreateBackdrop(frame.bagslots.slots[slot].frame, default_border)
|
||||||
frame.bagslots.slots[slot].frame:Show()
|
frame.bagslots.slots[slot].frame:Show()
|
||||||
@@ -614,8 +623,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
end
|
end
|
||||||
frame.bagslots.buy:SetPoint("RIGHT", frame.bagslots, "RIGHT", -default_border, 0)
|
frame.bagslots.buy:SetPoint("RIGHT", frame.bagslots, "RIGHT", -default_border, 0)
|
||||||
CreateBackdrop(frame.bagslots.buy, default_border)
|
CreateBackdrop(frame.bagslots.buy, default_border)
|
||||||
frame.bagslots.buy:SetHeight(frame.button_size/5*4)
|
frame.bagslots.buy:SetSize(frame.button_size/5*4, frame.button_size/5*4)
|
||||||
frame.bagslots.buy:SetWidth(frame.button_size/5*4)
|
|
||||||
frame.bagslots.buy:SetText("+")
|
frame.bagslots.buy:SetText("+")
|
||||||
frame.bagslots.buy:SetTextColor(.5,.5,1,1)
|
frame.bagslots.buy:SetTextColor(.5,.5,1,1)
|
||||||
frame.bagslots.buy:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.bagslots.buy:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
@@ -707,8 +715,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.close = CreateFrame("Button", "pfBagClose", frame)
|
frame.close = CreateFrame("Button", "pfBagClose", frame)
|
||||||
frame.close:SetPoint("TOPRIGHT", -default_border*1,-default_border )
|
frame.close:SetPoint("TOPRIGHT", -default_border*1,-default_border )
|
||||||
CreateBackdrop(frame.close, default_border)
|
CreateBackdrop(frame.close, default_border)
|
||||||
frame.close:SetHeight(12)
|
frame.close:SetSize(12, 12)
|
||||||
frame.close:SetWidth(12)
|
|
||||||
frame.close.texture = frame.close:CreateTexture("pfBagClose")
|
frame.close.texture = frame.close:CreateTexture("pfBagClose")
|
||||||
frame.close.texture:SetTexture(pfUI.media["img:close"])
|
frame.close.texture:SetTexture(pfUI.media["img:close"])
|
||||||
frame.close.texture:ClearAllPoints()
|
frame.close.texture:ClearAllPoints()
|
||||||
@@ -733,8 +740,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.bags = CreateFrame("Button", "pfBagSlotShow", frame)
|
frame.bags = CreateFrame("Button", "pfBagSlotShow", frame)
|
||||||
frame.bags:SetPoint("TOPRIGHT", frame.close, "TOPLEFT", -default_border*3, 0)
|
frame.bags:SetPoint("TOPRIGHT", frame.close, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.bags, default_border)
|
CreateBackdrop(frame.bags, default_border)
|
||||||
frame.bags:SetHeight(12)
|
frame.bags:SetSize(12, 12)
|
||||||
frame.bags:SetWidth(12)
|
|
||||||
frame.bags:SetTextColor(1,1,.25,1)
|
frame.bags:SetTextColor(1,1,.25,1)
|
||||||
frame.bags:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.bags:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
frame.bags.texture = frame.bags:CreateTexture("pfBagArrowUp")
|
frame.bags.texture = frame.bags:CreateTexture("pfBagArrowUp")
|
||||||
@@ -761,11 +767,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
frame.bags:SetScript("OnClick", function()
|
frame.bags:SetScript("OnClick", function()
|
||||||
if pfUI.bag.right.bagslots:IsShown() then
|
pfUI.bag.right.bagslots:SetShown(not pfUI.bag.right.bagslots:IsShown())
|
||||||
pfUI.bag.right.bagslots:Hide()
|
|
||||||
else
|
|
||||||
pfUI.bag.right.bagslots:Show()
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -774,8 +776,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.open = CreateFrame("Button", "pfBagSlotOpen", frame)
|
frame.open = CreateFrame("Button", "pfBagSlotOpen", frame)
|
||||||
frame.open:SetPoint("TOPRIGHT", frame.bags, "TOPLEFT", -default_border*3, 0)
|
frame.open:SetPoint("TOPRIGHT", frame.bags, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.open, default_border)
|
CreateBackdrop(frame.open, default_border)
|
||||||
frame.open:SetHeight(12)
|
frame.open:SetSize(12, 12)
|
||||||
frame.open:SetWidth(12)
|
|
||||||
frame.open:SetTextColor(1,1,.25,1)
|
frame.open:SetTextColor(1,1,.25,1)
|
||||||
frame.open:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.open:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
frame.open.texture = frame.open:CreateTexture("pfBagOpenContainer")
|
frame.open.texture = frame.open:CreateTexture("pfBagOpenContainer")
|
||||||
@@ -833,8 +834,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.disenchant = CreateFrame("Button", "pfBagSlotDisenchant", frame)
|
frame.disenchant = CreateFrame("Button", "pfBagSlotDisenchant", frame)
|
||||||
frame.disenchant:SetPoint("TOPRIGHT", frame.open, "TOPLEFT", -default_border*3, 0)
|
frame.disenchant:SetPoint("TOPRIGHT", frame.open, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.disenchant, default_border)
|
CreateBackdrop(frame.disenchant, default_border)
|
||||||
frame.disenchant:SetHeight(12)
|
frame.disenchant:SetSize(12, 12)
|
||||||
frame.disenchant:SetWidth(12)
|
|
||||||
frame.disenchant:SetTextColor(1,1,.25,1)
|
frame.disenchant:SetTextColor(1,1,.25,1)
|
||||||
frame.disenchant:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.disenchant:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
frame.disenchant.texture = frame.disenchant:CreateTexture("pfBagDisenchant")
|
frame.disenchant.texture = frame.disenchant:CreateTexture("pfBagDisenchant")
|
||||||
@@ -876,8 +876,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.picklock = CreateFrame("Button", "pfBagSlotPicklock", frame)
|
frame.picklock = CreateFrame("Button", "pfBagSlotPicklock", frame)
|
||||||
frame.picklock:SetPoint("TOPRIGHT", frame.disenchant, "TOPLEFT", -default_border*3, 0)
|
frame.picklock:SetPoint("TOPRIGHT", frame.disenchant, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.picklock, default_border)
|
CreateBackdrop(frame.picklock, default_border)
|
||||||
frame.picklock:SetHeight(12)
|
frame.picklock:SetSize(12, 12)
|
||||||
frame.picklock:SetWidth(12)
|
|
||||||
frame.picklock:SetTextColor(1,1,.25,1)
|
frame.picklock:SetTextColor(1,1,.25,1)
|
||||||
frame.picklock:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.picklock:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
frame.picklock.texture = frame.picklock:CreateTexture("pfBagPicklock")
|
frame.picklock.texture = frame.picklock:CreateTexture("pfBagPicklock")
|
||||||
@@ -919,8 +918,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.keys = CreateFrame("Button", "pfBagSlotShow", frame)
|
frame.keys = CreateFrame("Button", "pfBagSlotShow", frame)
|
||||||
frame.keys:SetPoint("TOPRIGHT", frame.picklock, "TOPLEFT", -default_border*3, 0)
|
frame.keys:SetPoint("TOPRIGHT", frame.picklock, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.keys, default_border)
|
CreateBackdrop(frame.keys, default_border)
|
||||||
frame.keys:SetHeight(12)
|
frame.keys:SetSize(12, 12)
|
||||||
frame.keys:SetWidth(12)
|
|
||||||
frame.keys:SetTextColor(1,1,.25,1)
|
frame.keys:SetTextColor(1,1,.25,1)
|
||||||
frame.keys:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.keys:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
frame.keys.texture = frame.keys:CreateTexture("pfBagArrowUp")
|
frame.keys.texture = frame.keys:CreateTexture("pfBagArrowUp")
|
||||||
@@ -962,8 +960,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.sort = CreateFrame("Button", "pfBagSort", frame)
|
frame.sort = CreateFrame("Button", "pfBagSort", frame)
|
||||||
frame.sort:SetPoint("TOPRIGHT", frame.keys, "TOPLEFT", -default_border*3, 0)
|
frame.sort:SetPoint("TOPRIGHT", frame.keys, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.sort, default_border)
|
CreateBackdrop(frame.sort, default_border)
|
||||||
frame.sort:SetHeight(12)
|
frame.sort:SetSize(12, 12)
|
||||||
frame.sort:SetWidth(12)
|
|
||||||
frame.sort.texture = frame.sort:CreateTexture("pfBagSortIcon")
|
frame.sort.texture = frame.sort:CreateTexture("pfBagSortIcon")
|
||||||
frame.sort.texture:SetTexture(pfUI.media["img:sort"])
|
frame.sort.texture:SetTexture(pfUI.media["img:sort"])
|
||||||
frame.sort.texture:ClearAllPoints()
|
frame.sort.texture:ClearAllPoints()
|
||||||
@@ -975,7 +972,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.sort.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
frame.sort.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
||||||
frame.sort.texture:SetVertexColor(1,1,.25,1)
|
frame.sort.texture:SetVertexColor(1,1,.25,1)
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
||||||
GameTooltip:SetText("Sort Bags")
|
GameTooltip:SetText(T["Sort Bags"])
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -988,7 +985,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
frame.sort:SetScript("OnClick", function()
|
frame.sort:SetScript("OnClick", function()
|
||||||
libbagsort:Sort({0, 1, 2, 3, 4})
|
libbagsort:Sort({0, 1, 2, 3, 4}, BagSortOpts())
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -996,8 +993,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
if not frame.gold and (C.appearance.bags.movable == "1" or not pfUI.panel) then
|
if not frame.gold and (C.appearance.bags.movable == "1" or not pfUI.panel) then
|
||||||
frame.gold = CreateFrame("Frame", "pfBagGoldString", frame)
|
frame.gold = CreateFrame("Frame", "pfBagGoldString", frame)
|
||||||
frame.gold:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -4, 1)
|
frame.gold:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -4, 1)
|
||||||
frame.gold:SetWidth(200)
|
frame.gold:SetSize(200, 18)
|
||||||
frame.gold:SetHeight(18)
|
|
||||||
frame.gold:RegisterEvent("PLAYER_ENTERING_WORLD")
|
frame.gold:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
frame.gold:RegisterEvent("PLAYER_MONEY")
|
frame.gold:RegisterEvent("PLAYER_MONEY")
|
||||||
frame.gold:SetScript("OnEvent", function()
|
frame.gold:SetScript("OnEvent", function()
|
||||||
@@ -1089,21 +1085,6 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.search.edit:ClearFocus()
|
frame.search.edit:ClearFocus()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
frame.search:SetScript("OnHide", function()
|
|
||||||
frame.search.edit:SetText(T["Search"])
|
|
||||||
for bag = -2, 11 do
|
|
||||||
if pfUI.bags[bag] then
|
|
||||||
local bagsize = GetContainerNumSlots(bag)
|
|
||||||
if bag == -2 and pfUI.bag.showKeyring == true then bagsize = GetKeyRingSize() end
|
|
||||||
for slot = 1, bagsize do
|
|
||||||
if pfUI.bags[bag] and pfUI.bags[bag].slots[slot] then
|
|
||||||
pfUI.bags[bag].slots[slot].frame:SetAlpha(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
frame.search.edit:SetScript("OnMouseUp", function()
|
frame.search.edit:SetScript("OnMouseUp", function()
|
||||||
if arg1 == "RightButton" then
|
if arg1 == "RightButton" then
|
||||||
this:ClearFocus()
|
this:ClearFocus()
|
||||||
@@ -1133,8 +1114,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.close = CreateFrame("Button", "pfBagClose", frame)
|
frame.close = CreateFrame("Button", "pfBagClose", frame)
|
||||||
frame.close:SetPoint("TOPRIGHT", -default_border*1,-default_border )
|
frame.close:SetPoint("TOPRIGHT", -default_border*1,-default_border )
|
||||||
CreateBackdrop(frame.close, default_border)
|
CreateBackdrop(frame.close, default_border)
|
||||||
frame.close:SetHeight(12)
|
frame.close:SetSize(12, 12)
|
||||||
frame.close:SetWidth(12)
|
|
||||||
frame.close.texture = frame.close:CreateTexture("pfBagClose")
|
frame.close.texture = frame.close:CreateTexture("pfBagClose")
|
||||||
frame.close.texture:SetTexture(pfUI.media["img:close"])
|
frame.close.texture:SetTexture(pfUI.media["img:close"])
|
||||||
frame.close.texture:ClearAllPoints()
|
frame.close.texture:ClearAllPoints()
|
||||||
@@ -1159,8 +1139,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.bags = CreateFrame("Button", "pfBagSlotShow", frame)
|
frame.bags = CreateFrame("Button", "pfBagSlotShow", frame)
|
||||||
frame.bags:SetPoint("TOPRIGHT", frame.close, "TOPLEFT", -default_border*3, 0)
|
frame.bags:SetPoint("TOPRIGHT", frame.close, "TOPLEFT", -default_border*3, 0)
|
||||||
CreateBackdrop(frame.bags, default_border)
|
CreateBackdrop(frame.bags, default_border)
|
||||||
frame.bags:SetHeight(12)
|
frame.bags:SetSize(12, 12)
|
||||||
frame.bags:SetWidth(12)
|
|
||||||
frame.bags:SetTextColor(1,1,.25,1)
|
frame.bags:SetTextColor(1,1,.25,1)
|
||||||
frame.bags:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
frame.bags:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
frame.bags.texture = frame.bags:CreateTexture("pfBagArrowUp")
|
frame.bags.texture = frame.bags:CreateTexture("pfBagArrowUp")
|
||||||
@@ -1213,7 +1192,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
frame.sort.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
frame.sort.backdrop:SetBackdropBorderColor(1,1,.25,1)
|
||||||
frame.sort.texture:SetVertexColor(1,1,.25,1)
|
frame.sort.texture:SetVertexColor(1,1,.25,1)
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
||||||
GameTooltip:SetText("Sort Bank")
|
GameTooltip:SetText(T["Sort Bank"])
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -1226,7 +1205,7 @@ pfUI:RegisterModule("bags", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
frame.sort:SetScript("OnClick", function()
|
frame.sort:SetScript("OnClick", function()
|
||||||
libbagsort:Sort({-1, 5, 6, 7, 8, 9, 10})
|
libbagsort:Sort({-1, 5, 6, 7, 8, 9, 10}, BagSortOpts())
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+3
-5
@@ -2,14 +2,12 @@ pfUI:RegisterModule("bgscore", function ()
|
|||||||
local bgframe = WorldStateAlwaysUpFrame
|
local bgframe = WorldStateAlwaysUpFrame
|
||||||
if not bgframe then
|
if not bgframe then
|
||||||
bgframe = CreateFrame("Frame", "WorldStateAlwaysUpFrame", UIParent)
|
bgframe = CreateFrame("Frame", "WorldStateAlwaysUpFrame", UIParent)
|
||||||
bgframe:SetWidth(200)
|
bgframe:SetSize(200, 25)
|
||||||
bgframe:SetHeight(25)
|
|
||||||
bgframe:SetPoint("TOP", UIParent, "TOP", 0, -100)
|
bgframe:SetPoint("TOP", UIParent, "TOP", 0, -100)
|
||||||
end
|
end
|
||||||
|
|
||||||
local mover = CreateFrame("Frame", "pfUIBGScoreMover", UIParent)
|
local mover = CreateFrame("Frame", "pfUIBGScoreMover", UIParent)
|
||||||
mover:SetWidth(220)
|
mover:SetSize(220, 30)
|
||||||
mover:SetHeight(30)
|
|
||||||
mover:SetPoint("TOP", UIParent, "TOP", 0, -100)
|
mover:SetPoint("TOP", UIParent, "TOP", 0, -100)
|
||||||
mover:SetFrameStrata("DIALOG")
|
mover:SetFrameStrata("DIALOG")
|
||||||
mover:SetMovable(true)
|
mover:SetMovable(true)
|
||||||
@@ -34,7 +32,7 @@ pfUI:RegisterModule("bgscore", function ()
|
|||||||
-- Title label
|
-- Title label
|
||||||
local title = mover:CreateFontString(nil, "OVERLAY")
|
local title = mover:CreateFontString(nil, "OVERLAY")
|
||||||
title:SetFont("Fonts\\FRIZQT__.TTF", 14, "OUTLINE")
|
title:SetFont("Fonts\\FRIZQT__.TTF", 14, "OUTLINE")
|
||||||
title:SetText("Battleground Frames")
|
title:SetText(T["Battleground Frames"])
|
||||||
title:SetPoint("TOP", mover, "TOP", 0, -2)
|
title:SetPoint("TOP", mover, "TOP", 0, -2)
|
||||||
|
|
||||||
-- BG score preview text
|
-- BG score preview text
|
||||||
|
|||||||
+2
-9
@@ -17,12 +17,6 @@ pfUI:RegisterModule("bubbles", function ()
|
|||||||
RunNextFrame(function() pfUI.bubbles:ScanBubbles() end)
|
RunNextFrame(function() pfUI.bubbles:ScanBubbles() end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
function pfUI.bubbles:IsBubble(f)
|
|
||||||
if f:GetName() then return end
|
|
||||||
if not f:GetRegions() then return end
|
|
||||||
return f:GetRegions().GetTexture and f:GetRegions():GetTexture() == "Interface\\Tooltips\\ChatBubble-Background"
|
|
||||||
end
|
|
||||||
|
|
||||||
function pfUI.bubbles:ProcessBubble(f)
|
function pfUI.bubbles:ProcessBubble(f)
|
||||||
f.text:Hide()
|
f.text:Hide()
|
||||||
f.text:SetFont(pfUI.font_default, tonumber(C.global.font_size) * UIParent:GetScale(), "OUTLINE")
|
f.text:SetFont(pfUI.font_default, tonumber(C.global.font_size) * UIParent:GetScale(), "OUTLINE")
|
||||||
@@ -34,9 +28,8 @@ pfUI:RegisterModule("bubbles", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function pfUI.bubbles:ScanBubbles()
|
function pfUI.bubbles:ScanBubbles()
|
||||||
local childs = { WorldFrame:GetChildren() }
|
for _, f in ipairs(C_ChatBubbles.GetAllChatBubbles()) do
|
||||||
for _, f in pairs(childs) do
|
if not f.frame then
|
||||||
if not f.frame and pfUI.bubbles:IsBubble(f) then
|
|
||||||
local textures = {f:GetRegions()}
|
local textures = {f:GetRegions()}
|
||||||
for _, object in pairs(textures) do
|
for _, object in pairs(textures) do
|
||||||
if object:GetObjectType() == "Texture" then
|
if object:GetObjectType() == "Texture" then
|
||||||
|
|||||||
+23
-24
@@ -138,16 +138,10 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
buff:SetScript("OnLeave", function()
|
buff:SetScript("OnLeave", GameTooltip_Hide)
|
||||||
GameTooltip:Hide()
|
|
||||||
end)
|
|
||||||
|
|
||||||
buff:SetScript("OnClick", function()
|
buff:SetScript("OnClick", function()
|
||||||
if CancelItemTempEnchantment and this.mode and this.mode == "MAINHAND" then
|
if this.spellId then
|
||||||
CancelItemTempEnchantment(1)
|
|
||||||
elseif CancelItemTempEnchantment and this.mode and this.mode == "OFFHAND" then
|
|
||||||
CancelItemTempEnchantment(2)
|
|
||||||
elseif this.spellId then
|
|
||||||
C_Spell.CancelSpellByID(this.spellId)
|
C_Spell.CancelSpellByID(this.spellId)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
@@ -277,28 +271,27 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
-- config loading
|
-- config loading
|
||||||
function pfUI.buff:UpdateConfigBuffButton(buff)
|
function pfUI.buff:UpdateConfigBuffButton(buff)
|
||||||
local fontsize = C.buffs.fontsize == "-1" and C.global.font_size or C.buffs.fontsize
|
local fontsize = C.buffs.fontsize == "-1" and C.global.font_size or C.buffs.fontsize
|
||||||
|
local buffSize, buffSpacing = tonumber(C.buffs.size), tonumber(C.buffs.spacing)
|
||||||
local rowcount, relFrame, offsetX, offsetY
|
local rowcount, relFrame, offsetX, offsetY
|
||||||
if buff.btype == "HELPFUL" then
|
if buff.btype == "HELPFUL" then
|
||||||
if buff.weapon == 1 and C.buffs.separateweapons == "1" then
|
if buff.weapon == 1 and C.buffs.separateweapons == "1" then
|
||||||
rowcount = floor((buff.gid-1) / tonumber(C.buffs.wepbuffrowsize))
|
rowcount = floor((buff.gid-1) / tonumber(C.buffs.wepbuffrowsize))
|
||||||
relFrame = pfUI.buff.wepbuffs
|
relFrame = pfUI.buff.wepbuffs
|
||||||
offsetX = -(buff.gid-1-rowcount*tonumber(C.buffs.wepbuffrowsize))*(tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing))
|
offsetX = -(buff.gid-1-rowcount*tonumber(C.buffs.wepbuffrowsize))*(buffSize+2*buffSpacing)
|
||||||
offsetY = -(rowcount) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing))
|
offsetY = -(rowcount) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+buffSize+2*buffSpacing)
|
||||||
else
|
else
|
||||||
rowcount = floor((buff.gid-1) / tonumber(C.buffs.buffrowsize))
|
rowcount = floor((buff.gid-1) / tonumber(C.buffs.buffrowsize))
|
||||||
relFrame = pfUI.buff.buffs
|
relFrame = pfUI.buff.buffs
|
||||||
offsetX = -(buff.gid-1-rowcount*tonumber(C.buffs.buffrowsize))*(tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing))
|
offsetX = -(buff.gid-1-rowcount*tonumber(C.buffs.buffrowsize))*(buffSize+2*buffSpacing)
|
||||||
offsetY = -(rowcount) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing))
|
offsetY = -(rowcount) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+buffSize+2*buffSpacing)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
rowcount = floor((buff.gid-1) / tonumber(C.buffs.debuffrowsize))
|
rowcount = floor((buff.gid-1) / tonumber(C.buffs.debuffrowsize))
|
||||||
relFrame = pfUI.buff.debuffs
|
relFrame = pfUI.buff.debuffs
|
||||||
offsetX = -(buff.gid-1-rowcount*tonumber(C.buffs.debuffrowsize))*(tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing))
|
offsetX = -(buff.gid-1-rowcount*tonumber(C.buffs.debuffrowsize))*(buffSize+2*buffSpacing)
|
||||||
offsetY = -(rowcount) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing))
|
offsetY = -(rowcount) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+buffSize+2*buffSpacing)
|
||||||
end
|
end
|
||||||
|
buff:SetSize(buffSize, buffSize)
|
||||||
buff:SetWidth(tonumber(C.buffs.size))
|
|
||||||
buff:SetHeight(tonumber(C.buffs.size))
|
|
||||||
buff:ClearAllPoints()
|
buff:ClearAllPoints()
|
||||||
buff:SetPoint("TOPRIGHT", relFrame, "TOPRIGHT",offsetX, offsetY)
|
buff:SetPoint("TOPRIGHT", relFrame, "TOPRIGHT",offsetX, offsetY)
|
||||||
|
|
||||||
@@ -318,20 +311,26 @@ pfUI:RegisterModule("buff", function ()
|
|||||||
function pfUI.buff:UpdateConfig()
|
function pfUI.buff:UpdateConfig()
|
||||||
local fontsize = C.buffs.fontsize == "-1" and C.global.font_size or C.buffs.fontsize
|
local fontsize = C.buffs.fontsize == "-1" and C.global.font_size or C.buffs.fontsize
|
||||||
|
|
||||||
pfUI.buff.buffs:SetWidth(tonumber(C.buffs.buffrowsize) * (tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing)))
|
local spacing = tonumber(C.buffs.spacing)
|
||||||
pfUI.buff.buffs:SetHeight(ceil(32/tonumber(C.buffs.buffrowsize)) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing)))
|
local cell = tonumber(C.buffs.size) + 2 * spacing
|
||||||
pfUI.buff.buffs:SetPoint("TOPRIGHT", pfUI.minimap or UIParent, "TOPLEFT", -4*tonumber(C.buffs.spacing), 0)
|
local rowextra = C.buffs.textinside == "1" and 0 or (fontsize * 1.5)
|
||||||
|
|
||||||
|
local function SizeBuffFrame(frame, rowsize, count)
|
||||||
|
rowsize = tonumber(rowsize)
|
||||||
|
frame:SetSize(rowsize * cell, ceil(count / rowsize) * (rowextra + cell))
|
||||||
|
end
|
||||||
|
|
||||||
|
SizeBuffFrame(pfUI.buff.buffs, C.buffs.buffrowsize, 32)
|
||||||
|
pfUI.buff.buffs:SetPoint("TOPRIGHT", pfUI.minimap or UIParent, "TOPLEFT", -4 * spacing, 0)
|
||||||
UpdateMovable(pfUI.buff.buffs)
|
UpdateMovable(pfUI.buff.buffs)
|
||||||
|
|
||||||
pfUI.buff.debuffs:SetWidth(tonumber(C.buffs.debuffrowsize) * (tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing)))
|
SizeBuffFrame(pfUI.buff.debuffs, C.buffs.debuffrowsize, 16)
|
||||||
pfUI.buff.debuffs:SetHeight(ceil(16/tonumber(C.buffs.debuffrowsize)) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing)))
|
|
||||||
pfUI.buff.debuffs:SetPoint("TOPRIGHT", pfUI.buff.buffs, "BOTTOMRIGHT", 0, 0)
|
pfUI.buff.debuffs:SetPoint("TOPRIGHT", pfUI.buff.buffs, "BOTTOMRIGHT", 0, 0)
|
||||||
UpdateMovable(pfUI.buff.debuffs)
|
UpdateMovable(pfUI.buff.debuffs)
|
||||||
|
|
||||||
if C.buffs.separateweapons == "1" then
|
if C.buffs.separateweapons == "1" then
|
||||||
pfUI.buff.wepbuffs:ClearAllPoints()
|
pfUI.buff.wepbuffs:ClearAllPoints()
|
||||||
pfUI.buff.wepbuffs:SetWidth(tonumber(C.buffs.wepbuffrowsize) * (tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing)))
|
SizeBuffFrame(pfUI.buff.wepbuffs, C.buffs.wepbuffrowsize, 2)
|
||||||
pfUI.buff.wepbuffs:SetHeight(ceil(2/tonumber(C.buffs.wepbuffrowsize)) * ((C.buffs.textinside == "1" and 0 or (fontsize*1.5))+tonumber(C.buffs.size)+2*tonumber(C.buffs.spacing)))
|
|
||||||
pfUI.buff.wepbuffs:SetPoint("TOPRIGHT", pfUI.buff.debuffs, "BOTTOMRIGHT", 0, 0)
|
pfUI.buff.wepbuffs:SetPoint("TOPRIGHT", pfUI.buff.debuffs, "BOTTOMRIGHT", 0, 0)
|
||||||
pfUI.buff.wepbuffs:Show()
|
pfUI.buff.wepbuffs:Show()
|
||||||
UpdateMovable(pfUI.buff.wepbuffs)
|
UpdateMovable(pfUI.buff.wepbuffs)
|
||||||
|
|||||||
+15
-25
@@ -90,12 +90,14 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
if val == skill then return end
|
if val == skill then return end
|
||||||
end
|
end
|
||||||
config.whitelist = config.whitelist .. "#" .. skill
|
config.whitelist = config.whitelist .. "#" .. skill
|
||||||
|
fcache[tostring(config)] = nil -- invalidate so the new entry takes effect immediately
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now whitelisted."])
|
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now whitelisted."])
|
||||||
elseif IsShiftKeyDown() then
|
elseif IsShiftKeyDown() then
|
||||||
for _, val in pairs({strsplit("#", config.blacklist)}) do
|
for _, val in pairs({strsplit("#", config.blacklist)}) do
|
||||||
if val == skill then return end
|
if val == skill then return end
|
||||||
end
|
end
|
||||||
config.blacklist = config.blacklist .. "#" .. skill
|
config.blacklist = config.blacklist .. "#" .. skill
|
||||||
|
fcache[tostring(config)] = nil -- invalidate so the new entry takes effect immediately
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now blacklisted."])
|
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffcc" .. skill .. "|r" .. T["is now blacklisted."])
|
||||||
end
|
end
|
||||||
elseif this.parent.unit == "player" then
|
elseif this.parent.unit == "player" then
|
||||||
@@ -162,8 +164,7 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
local color = parent.color
|
local color = parent.color
|
||||||
local bordercolor = parent.bordercolor
|
local bordercolor = parent.bordercolor
|
||||||
local textcolor = parent.textcolor
|
local textcolor = parent.textcolor
|
||||||
local width = parent:GetWidth()
|
local width, height = parent:GetSize()
|
||||||
local height = parent:GetHeight()
|
|
||||||
local framename = "pf" .. parent.unit .. ( parent.type == "HARMFUL" and "Debuff" or "Buff" ) .. "Bar" .. bar
|
local framename = "pf" .. parent.unit .. ( parent.type == "HARMFUL" and "Debuff" or "Buff" ) .. "Bar" .. bar
|
||||||
|
|
||||||
local font = parent.config.use_unitfonts == "1" and pfUI.font_unit or pfUI.font_default
|
local font = parent.config.use_unitfonts == "1" and pfUI.font_unit or pfUI.font_default
|
||||||
@@ -172,8 +173,7 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
frame:EnableMouse(1)
|
frame:EnableMouse(1)
|
||||||
frame:Hide()
|
frame:Hide()
|
||||||
frame:SetPoint("BOTTOM", 0, (bar-1)*(height+2*border+1))
|
frame:SetPoint("BOTTOM", 0, (bar-1)*(height+2*border+1))
|
||||||
frame:SetWidth(width)
|
frame:SetSize(width, height)
|
||||||
frame:SetHeight(height)
|
|
||||||
|
|
||||||
frame.bar = CreateFrame("StatusBar", "pfBuffBar" .. bar, frame)
|
frame.bar = CreateFrame("StatusBar", "pfBuffBar" .. bar, frame)
|
||||||
frame.bar:SetPoint("TOPLEFT", frame, "TOPLEFT", height+1, 0)
|
frame.bar:SetPoint("TOPLEFT", frame, "TOPLEFT", height+1, 0)
|
||||||
@@ -202,8 +202,7 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
frame.time:SetJustifyH("RIGHT")
|
frame.time:SetJustifyH("RIGHT")
|
||||||
|
|
||||||
frame.icon = frame:CreateTexture(nil, "OVERLAY")
|
frame.icon = frame:CreateTexture(nil, "OVERLAY")
|
||||||
frame.icon:SetWidth(height)
|
frame.icon:SetSize(height, height)
|
||||||
frame.icon:SetHeight(height)
|
|
||||||
frame.icon:SetPoint("LEFT", frame, "LEFT", 0, 0)
|
frame.icon:SetPoint("LEFT", frame, "LEFT", 0, 0)
|
||||||
frame.icon:SetTexCoord(.07,.93,.07,.93)
|
frame.icon:SetTexCoord(.07,.93,.07,.93)
|
||||||
|
|
||||||
@@ -225,7 +224,7 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
|
|
||||||
CreateBackdrop(frame)
|
CreateBackdrop(frame)
|
||||||
CreateBackdropShadow(frame)
|
CreateBackdropShadow(frame)
|
||||||
if bordercolor.r ~= "0" and bordercolor.g ~= "0" and bordercolor.b ~= "0" and bordercolor.a ~= "0" then
|
if bordercolor.r ~= 0 and bordercolor.g ~= 0 and bordercolor.b ~= 0 and bordercolor.a ~= 0 then
|
||||||
frame.backdrop:SetBackdropBorderColor(bordercolor.r,bordercolor.g,bordercolor.b,1)
|
frame.backdrop:SetBackdropBorderColor(bordercolor.r,bordercolor.g,bordercolor.b,1)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -422,18 +421,15 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
if pfUI.uf.player and C.buffbar.pbuff.enable == "1" then
|
if pfUI.uf.player and C.buffbar.pbuff.enable == "1" then
|
||||||
pfUI.uf.player.buffbar = CreateBuffBarFrame("Player", "HELPFUL")
|
pfUI.uf.player.buffbar = CreateBuffBarFrame("Player", "HELPFUL")
|
||||||
local config = C.buffbar.pbuff
|
local config = C.buffbar.pbuff
|
||||||
local r, g, b, a = strsplit(",", config.color)
|
|
||||||
local br, bg, bb, ba = strsplit(",", config.bordercolor)
|
|
||||||
local tr, tg, tb, ta = strsplit(",", config.textcolor)
|
|
||||||
|
|
||||||
pfUI.uf.player.buffbar:SetWidth(config.width == "-1" and pfUI.uf.player:GetWidth() or config.width)
|
pfUI.uf.player.buffbar:SetWidth(config.width == "-1" and pfUI.uf.player:GetWidth() or config.width)
|
||||||
pfUI.uf.player.buffbar:SetHeight(config.height)
|
pfUI.uf.player.buffbar:SetHeight(config.height)
|
||||||
pfUI.uf.player.buffbar.threshold = tonumber(config.threshold)
|
pfUI.uf.player.buffbar.threshold = tonumber(config.threshold)
|
||||||
pfUI.uf.player.buffbar.config = config
|
pfUI.uf.player.buffbar.config = config
|
||||||
pfUI.uf.player.buffbar.buffcmp = config.sort == "asc" and asc or desc
|
pfUI.uf.player.buffbar.buffcmp = config.sort == "asc" and asc or desc
|
||||||
pfUI.uf.player.buffbar.color = { r = r, g = g, b = b, a = a }
|
pfUI.uf.player.buffbar.color = GetStringColorObject(config.color)
|
||||||
pfUI.uf.player.buffbar.bordercolor = { r = br, g = bg, b = bb, a = ba }
|
pfUI.uf.player.buffbar.bordercolor = GetStringColorObject(config.bordercolor)
|
||||||
pfUI.uf.player.buffbar.textcolor = { r = tr, g = tg, b = tb, a = ta }
|
pfUI.uf.player.buffbar.textcolor = GetStringColorObject(config.textcolor)
|
||||||
pfUI.uf.player.buffbar.anchors = {
|
pfUI.uf.player.buffbar.anchors = {
|
||||||
pfUI.uf.player,
|
pfUI.uf.player,
|
||||||
pfUI.uf.player and pfUI.uf.player.debuffs,
|
pfUI.uf.player and pfUI.uf.player.debuffs,
|
||||||
@@ -448,9 +444,6 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
-- create player debuffbars
|
-- create player debuffbars
|
||||||
if pfUI.uf.player and C.buffbar.pdebuff.enable == "1" then
|
if pfUI.uf.player and C.buffbar.pdebuff.enable == "1" then
|
||||||
local config = C.buffbar.pdebuff
|
local config = C.buffbar.pdebuff
|
||||||
local r, g, b, a = strsplit(",", config.color)
|
|
||||||
local br, bg, bb, ba = strsplit(",", config.bordercolor)
|
|
||||||
local tr, tg, tb, ta = strsplit(",", config.textcolor)
|
|
||||||
|
|
||||||
pfUI.uf.player.debuffbar = CreateBuffBarFrame("Player", "HARMFUL")
|
pfUI.uf.player.debuffbar = CreateBuffBarFrame("Player", "HARMFUL")
|
||||||
pfUI.uf.player.debuffbar:SetWidth(config.width == "-1" and pfUI.uf.player:GetWidth() or config.width)
|
pfUI.uf.player.debuffbar:SetWidth(config.width == "-1" and pfUI.uf.player:GetWidth() or config.width)
|
||||||
@@ -458,9 +451,9 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
pfUI.uf.player.debuffbar.threshold = tonumber(config.threshold)
|
pfUI.uf.player.debuffbar.threshold = tonumber(config.threshold)
|
||||||
pfUI.uf.player.debuffbar.config = config
|
pfUI.uf.player.debuffbar.config = config
|
||||||
pfUI.uf.player.debuffbar.buffcmp = config.sort == "asc" and asc or desc
|
pfUI.uf.player.debuffbar.buffcmp = config.sort == "asc" and asc or desc
|
||||||
pfUI.uf.player.debuffbar.color = { r = r, g = g, b = b, a = a }
|
pfUI.uf.player.debuffbar.color = GetStringColorObject(config.color)
|
||||||
pfUI.uf.player.debuffbar.bordercolor = { r = br, g = bg, b = bb, a = ba }
|
pfUI.uf.player.debuffbar.bordercolor = GetStringColorObject(config.bordercolor)
|
||||||
pfUI.uf.player.debuffbar.textcolor = { r = tr, g = tg, b = tb, a = ta }
|
pfUI.uf.player.debuffbar.textcolor = GetStringColorObject(config.textcolor)
|
||||||
pfUI.uf.player.debuffbar.anchors = {
|
pfUI.uf.player.debuffbar.anchors = {
|
||||||
pfUI.uf.player,
|
pfUI.uf.player,
|
||||||
pfUI.uf.player and pfUI.uf.player.buffbar and pfUI.uf.player.buffbar.bars,
|
pfUI.uf.player and pfUI.uf.player.buffbar and pfUI.uf.player.buffbar.bars,
|
||||||
@@ -476,18 +469,15 @@ pfUI:RegisterModule("buffwatch", function ()
|
|||||||
-- create target debuffbars
|
-- create target debuffbars
|
||||||
if pfUI.uf.target and C.buffbar.tdebuff.enable == "1" then
|
if pfUI.uf.target and C.buffbar.tdebuff.enable == "1" then
|
||||||
local config = C.buffbar.tdebuff
|
local config = C.buffbar.tdebuff
|
||||||
local r, g, b, a = strsplit(",", config.color)
|
|
||||||
local br, bg, bb, ba = strsplit(",", config.bordercolor)
|
|
||||||
local tr, tg, tb, ta = strsplit(",", config.textcolor)
|
|
||||||
|
|
||||||
pfUI.uf.target.debuffbar = CreateBuffBarFrame("Target", "HARMFUL")
|
pfUI.uf.target.debuffbar = CreateBuffBarFrame("Target", "HARMFUL")
|
||||||
pfUI.uf.target.debuffbar:SetWidth(config.width == "-1" and pfUI.uf.target:GetWidth() or config.width)
|
pfUI.uf.target.debuffbar:SetWidth(config.width == "-1" and pfUI.uf.target:GetWidth() or config.width)
|
||||||
pfUI.uf.target.debuffbar:SetHeight(config.height)
|
pfUI.uf.target.debuffbar:SetHeight(config.height)
|
||||||
pfUI.uf.target.debuffbar.config = config
|
pfUI.uf.target.debuffbar.config = config
|
||||||
pfUI.uf.target.debuffbar.buffcmp = config.sort == "asc" and asc or desc
|
pfUI.uf.target.debuffbar.buffcmp = config.sort == "asc" and asc or desc
|
||||||
pfUI.uf.target.debuffbar.color = { r = r, g = g, b = b, a = a }
|
pfUI.uf.target.debuffbar.color = GetStringColorObject(config.color)
|
||||||
pfUI.uf.target.debuffbar.bordercolor = { r = br, g = bg, b = bb, a = ba }
|
pfUI.uf.target.debuffbar.bordercolor = GetStringColorObject(config.bordercolor)
|
||||||
pfUI.uf.target.debuffbar.textcolor = { r = tr, g = tg, b = tb, a = ta }
|
pfUI.uf.target.debuffbar.textcolor = GetStringColorObject(config.textcolor)
|
||||||
pfUI.uf.target.debuffbar.threshold = tonumber(config.threshold)
|
pfUI.uf.target.debuffbar.threshold = tonumber(config.threshold)
|
||||||
pfUI.uf.target.debuffbar.anchors = {
|
pfUI.uf.target.debuffbar.anchors = {
|
||||||
pfUI.uf.target,
|
pfUI.uf.target,
|
||||||
|
|||||||
+121
-143
@@ -16,9 +16,13 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Clear cast state on the bar. Shows the bar full for one frame, then
|
-- Clear cast state on the bar and start the fade-out. On a normal end the bar
|
||||||
-- OnUpdate fades it out.
|
-- is left at its current fill (a completed cast is already ~full; nothing
|
||||||
local function ClearBar(cb)
|
-- snaps to full, which used to flash for a frame when the next cast stamped
|
||||||
|
-- the bar). When `failed` is set for a cast that was actually in progress, the
|
||||||
|
-- bar flashes full red before fading — the cancelled-cast indicator.
|
||||||
|
local function ClearBar(cb, failed)
|
||||||
|
local wasActive = cb.endTime ~= nil
|
||||||
cb.startTime, cb.endTime, cb.isChannel = nil, nil, nil
|
cb.startTime, cb.endTime, cb.isChannel = nil, nil, nil
|
||||||
cb.activeName, cb.spellID = nil, nil
|
cb.activeName, cb.spellID = nil, nil
|
||||||
cb.isTradeskill = nil
|
cb.isTradeskill = nil
|
||||||
@@ -26,8 +30,11 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
cb.tradeskillSingleMs, cb.currentCraftStart = nil, nil
|
cb.tradeskillSingleMs, cb.currentCraftStart = nil, nil
|
||||||
cb.lastMax = nil
|
cb.lastMax = nil
|
||||||
cb.delay = 0
|
cb.delay = 0
|
||||||
cb.bar:SetMinMaxValues(1, 100)
|
if failed and wasActive then
|
||||||
cb.bar:SetValue(100)
|
cb.bar:SetStatusBarColor(GetStringColor(C.appearance.castbar.failcolor))
|
||||||
|
cb.bar:SetMinMaxValues(0, 1)
|
||||||
|
cb.bar:SetValue(1)
|
||||||
|
end
|
||||||
if cb.bar.spark then cb.bar.spark:Hide() end
|
if cb.bar.spark then cb.bar.spark:Hide() end
|
||||||
cb.fadeout = 1
|
cb.fadeout = 1
|
||||||
end
|
end
|
||||||
@@ -65,16 +72,21 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Mark the start of craft 2..N within an active merge (called from the
|
-- Mark the start of craft 2..N within an active merge (called from the
|
||||||
-- SPELLCAST_START / SPELL_START_SELF handlers). Resets the per-craft
|
-- UNIT_SPELLCAST_START handler). Resets the per-craft spark to the left
|
||||||
-- spark to the left edge of the bar.
|
-- edge of the bar.
|
||||||
local function StartTradeskillCraft(cb)
|
local function StartTradeskillCraft(cb)
|
||||||
cb.currentCraftStart = GetTime() * 1000
|
cb.currentCraftStart = GetTime() * 1000
|
||||||
|
local remaining = cb.tradeskillTotal - (cb.tradeskillCompleted or 0)
|
||||||
|
cb.endTime = cb.currentCraftStart + cb.tradeskillSingleMs * remaining
|
||||||
|
local duration = (cb.endTime - cb.startTime) / 1000
|
||||||
|
cb.bar:SetMinMaxValues(0, duration)
|
||||||
|
cb.lastMax = duration
|
||||||
UpdateTradeskillLabel(cb)
|
UpdateTradeskillLabel(cb)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Stamp the bar with cast data and render text/icon/lag once. OnUpdate
|
-- Stamp the bar with cast data and render text/icon/lag once. OnUpdate
|
||||||
-- then animates the fill from this state without touching C_Spell.
|
-- then animates the fill from this state without touching C_Spell.
|
||||||
local function StampBar(cb, name, tex, startMs, endMs, spellID, isChannel, delayMs, isTradeskill)
|
local function StampBar(cb, name, tex, startMs, endMs, spellID, isChannel, delayMs, isTradeskill, rank)
|
||||||
cb.startTime = startMs
|
cb.startTime = startMs
|
||||||
cb.endTime = endMs
|
cb.endTime = endMs
|
||||||
cb.isChannel = isChannel
|
cb.isChannel = isChannel
|
||||||
@@ -85,12 +97,15 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
cb:SetAlpha(1)
|
cb:SetAlpha(1)
|
||||||
cb.fadeout = nil
|
cb.fadeout = nil
|
||||||
|
|
||||||
cb.bar:SetStatusBarColor(strsplit(",", C.appearance.castbar[isChannel and "channelcolor" or "castbarcolor"]))
|
cb.bar:SetStatusBarColor(GetStringColor(C.appearance.castbar[isChannel and "channelcolor" or "castbarcolor"]))
|
||||||
|
|
||||||
local rank = ""
|
-- Rank: prefer the value the UNIT_SPELLCAST_* event delivered (arg5, passed
|
||||||
if spellID and GetSpellRecField then
|
-- through by RefreshBar). Only the retarget re-poll has no event in hand, so
|
||||||
rank = GetSpellRecField(spellID, "rank") or ""
|
-- it falls back to a lookup.
|
||||||
|
if not rank and spellID then
|
||||||
|
rank = C_Spell.GetSpellSubtext(spellID) or ""
|
||||||
end
|
end
|
||||||
|
rank = rank or ""
|
||||||
local spellname = (cb.showname and name) and (name .. " ") or ""
|
local spellname = (cb.showname and name) and (name .. " ") or ""
|
||||||
local rankstr = (cb.showrank and rank ~= "") and string.format("|cffaaffcc[%s]|r", rank) or ""
|
local rankstr = (cb.showrank and rank ~= "") and string.format("|cffaaffcc[%s]|r", rank) or ""
|
||||||
cb.bar.left:SetText(spellname .. rankstr)
|
cb.bar.left:SetText(spellname .. rankstr)
|
||||||
@@ -98,8 +113,7 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
if tex and cb.showicon then
|
if tex and cb.showicon then
|
||||||
local size = cb:GetHeight()
|
local size = cb:GetHeight()
|
||||||
cb.icon:Show()
|
cb.icon:Show()
|
||||||
cb.icon:SetHeight(size)
|
cb.icon:SetSize(size, size)
|
||||||
cb.icon:SetWidth(size)
|
|
||||||
cb.icon.texture:SetTexture(tex)
|
cb.icon.texture:SetTexture(tex)
|
||||||
cb.bar:SetPoint("TOPLEFT", cb.icon, "TOPRIGHT", cb.spacing, 0)
|
cb.bar:SetPoint("TOPLEFT", cb.icon, "TOPRIGHT", cb.spacing, 0)
|
||||||
else
|
else
|
||||||
@@ -118,11 +132,21 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
|
|
||||||
cb.bar:SetMinMaxValues(0, duration)
|
cb.bar:SetMinMaxValues(0, duration)
|
||||||
cb.lastMax = duration
|
cb.lastMax = duration
|
||||||
|
|
||||||
|
-- Prime the fill on this frame. StampBar otherwise leaves the previous
|
||||||
|
-- value in place (ClearBar, run on the prior cast's STOP, leaves it full),
|
||||||
|
-- so the bar would flash full for the frame between here and the next
|
||||||
|
-- OnUpdate tick. Reset the throttle too so the timer text updates promptly.
|
||||||
|
local nowSec = GetTime()
|
||||||
|
local cur = isChannel and (endMs / 1000 - nowSec) or (nowSec - startMs / 1000)
|
||||||
|
if cur < 0 then cur = 0 elseif cur > duration then cur = duration end
|
||||||
|
cb.bar:SetValue(cur)
|
||||||
|
cb.tick = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
-- One-shot poll: read C_Spell for the bar's unit, stamp or clear. Called
|
-- One-shot poll: read C_Spell for the bar's unit, stamp or clear. Called
|
||||||
-- from event handlers (cast start, target/focus change), never per-frame.
|
-- from event handlers (cast start, target/focus change), never per-frame.
|
||||||
local function RefreshBar(cb)
|
local function RefreshBar(cb, rank)
|
||||||
local query = cb.unitstr ~= "" and cb.unitstr or cb.unitname
|
local query = cb.unitstr ~= "" and cb.unitstr or cb.unitname
|
||||||
if not query or (cb.unitstr ~= "" and not UnitExists(cb.unitstr)) then
|
if not query or (cb.unitstr ~= "" and not UnitExists(cb.unitstr)) then
|
||||||
ClearBar(cb)
|
ClearBar(cb)
|
||||||
@@ -145,7 +169,7 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if name and startMs and endMs then
|
if name and startMs and endMs then
|
||||||
StampBar(cb, name, tex, startMs, endMs, spellID, isChan, delayMs, isTradeskill)
|
StampBar(cb, name, tex, startMs, endMs, spellID, isChan, delayMs, isTradeskill, rank)
|
||||||
else
|
else
|
||||||
ClearBar(cb)
|
ClearBar(cb)
|
||||||
end
|
end
|
||||||
@@ -164,8 +188,7 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
-- icon
|
-- icon
|
||||||
cb.icon = CreateFrame("Frame", nil, cb)
|
cb.icon = CreateFrame("Frame", nil, cb)
|
||||||
cb.icon:SetPoint("TOPLEFT", 0, 0)
|
cb.icon:SetPoint("TOPLEFT", 0, 0)
|
||||||
cb.icon:SetHeight(16)
|
cb.icon:SetSize(16, 16)
|
||||||
cb.icon:SetWidth(16)
|
|
||||||
|
|
||||||
cb.icon.texture = cb.icon:CreateTexture(nil, "OVERLAY")
|
cb.icon.texture = cb.icon:CreateTexture(nil, "OVERLAY")
|
||||||
cb.icon.texture:SetAllPoints()
|
cb.icon.texture:SetAllPoints()
|
||||||
@@ -291,35 +314,27 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Cast lifecycle events. Player bars react to vanilla SPELLCAST_*; non-
|
-- Cast lifecycle, entirely on ClassicAPI's UNIT_SPELLCAST_* events. They
|
||||||
-- player bars also react to Nampower SPELL_*_OTHER (gated by the
|
-- fire per unit token: arg1=="player" for the player's own casts, and the
|
||||||
-- NP_EnableSpell{Start,Go}Events CVars, enabled by libdebuff) plus the
|
-- remote token(s) ("target", "focus", ...) for other units -- so one set of
|
||||||
-- retarget event. Player events also feed non-player bars for the
|
-- events drives every bar with no Nampower dependency. The handler routes an
|
||||||
-- target=self case.
|
-- event to this bar when arg1 matches its unit, or -- since the player's own
|
||||||
cb:RegisterEvent("SPELLCAST_START")
|
-- casts only ever fire arg1=="player" -- when the bar's unit resolves to the
|
||||||
cb:RegisterEvent("SPELLCAST_STOP")
|
-- player (target=self). PLAYER_TARGET/FOCUS_CHANGED re-polls so a unit
|
||||||
cb:RegisterEvent("SPELLCAST_FAILED")
|
-- already mid-cast when it becomes the target/focus still shows.
|
||||||
cb:RegisterEvent("SPELLCAST_INTERRUPTED")
|
cb:RegisterEvent("UNIT_SPELLCAST_START")
|
||||||
cb:RegisterEvent("SPELLCAST_CHANNEL_START")
|
cb:RegisterEvent("UNIT_SPELLCAST_STOP")
|
||||||
cb:RegisterEvent("SPELLCAST_CHANNEL_STOP")
|
cb:RegisterEvent("UNIT_SPELLCAST_FAILED")
|
||||||
cb:RegisterEvent("SPELLCAST_CHANNEL_UPDATE")
|
cb:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
|
||||||
cb:RegisterEvent("SPELL_DELAYED_SELF")
|
cb:RegisterEvent("UNIT_SPELLCAST_DELAYED")
|
||||||
-- Chained same-spell recasts never run the client cast path (the 1.12
|
cb:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
|
||||||
-- engine short-circuits at spellID == current-cast), so vanilla
|
cb:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
|
||||||
-- SPELLCAST_START never fires for them. nampower's SPELL_START_SELF
|
cb:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
|
||||||
-- (server-driven) is the only signal that shows them.
|
cb:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
|
||||||
cb:RegisterEvent("SPELL_START_SELF")
|
if unitstr == "target" then
|
||||||
if unitstr == "player" then
|
cb:RegisterEvent("PLAYER_TARGET_CHANGED")
|
||||||
cb:RegisterEvent("SPELL_GO_SELF")
|
elseif unitstr == "focus" then
|
||||||
end
|
cb:RegisterEvent("PLAYER_FOCUS_CHANGED")
|
||||||
if unitstr ~= "player" and unitstr ~= "" then
|
|
||||||
cb:RegisterEvent("SPELL_START_OTHER")
|
|
||||||
cb:RegisterEvent("SPELL_FAILED_OTHER")
|
|
||||||
if unitstr == "target" then
|
|
||||||
cb:RegisterEvent("PLAYER_TARGET_CHANGED")
|
|
||||||
elseif unitstr == "focus" then
|
|
||||||
cb:RegisterEvent("PLAYER_FOCUS_CHANGED")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
cb:SetScript("OnEvent", function()
|
cb:SetScript("OnEvent", function()
|
||||||
@@ -330,83 +345,33 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if event == "SPELL_START_OTHER" then
|
-- UNIT_SPELLCAST_* fire per unit token (arg1). Handle an event when it's
|
||||||
-- arg3=casterGuid. Defer one frame so ClassicAPI's UnitChannelInfo
|
-- for this bar's unit, or -- since the player's own casts only ever fire
|
||||||
-- can see the engine's +0x228 broadcast for remote-unit channels
|
-- arg1=="player" -- when this bar's unit currently resolves to the player
|
||||||
-- (the cohook+packet handler runs in the same frame; the broadcast
|
-- (target=self / focus=self).
|
||||||
-- propagates after).
|
-- Args: arg1=unit, arg2=castGUID, arg3=spellID, arg4=name, arg5=rank.
|
||||||
if arg3 == UnitGUID(unit) then
|
if arg1 ~= unit and not (arg1 == "player" and UnitIsUnit(unit, "player")) then
|
||||||
local target = this
|
|
||||||
RunNextFrame(function() RefreshBar(target) end)
|
|
||||||
end
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if event == "SPELL_FAILED_OTHER" then
|
if event == "UNIT_SPELLCAST_START" or event == "UNIT_SPELLCAST_CHANNEL_START" then
|
||||||
if arg1 == UnitGUID(unit) then ClearBar(this) end
|
-- START also fires per craft in a same-spell chain, so an active merge
|
||||||
return
|
-- just resyncs the current craft's spark/label instead of restamping.
|
||||||
end
|
|
||||||
|
|
||||||
-- Vanilla SPELLCAST_* + SPELL_DELAYED_SELF fire only for the local
|
|
||||||
-- player. Non-player bars handle them only when their unit currently
|
|
||||||
-- resolves to the player (target=self / focus=self).
|
|
||||||
if not UnitIsUnit(unit, 'player') then return end
|
|
||||||
|
|
||||||
if event == "SPELLCAST_START" or event == "SPELLCAST_CHANNEL_START" then
|
|
||||||
if this.tradeskillTotal then
|
if this.tradeskillTotal then
|
||||||
-- Mid-chain craft N+1 of N. Keep the merged bar; resync the spark
|
|
||||||
-- to the new craft's start and refresh the "(N)" count label.
|
|
||||||
StartTradeskillCraft(this)
|
StartTradeskillCraft(this)
|
||||||
else
|
else
|
||||||
RefreshBar(this)
|
RefreshBar(this, arg5)
|
||||||
if this.isTradeskill and (this.pendingTradeskillCount or 0) > 1
|
if this.isTradeskill and (this.pendingTradeskillCount or 0) > 1
|
||||||
and C.castbar.player.mergetradeskill == "1" then
|
and C.castbar.player.mergetradeskill == "1" then
|
||||||
EnterTradeskillMerge(this, this.startTime, this.endTime, this.pendingTradeskillCount)
|
EnterTradeskillMerge(this, this.startTime, this.endTime, this.pendingTradeskillCount)
|
||||||
end
|
end
|
||||||
this.pendingTradeskillCount = nil
|
this.pendingTradeskillCount = nil
|
||||||
end
|
end
|
||||||
elseif event == "SPELL_START_SELF" then
|
elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
|
||||||
-- Catches chained same-spell recasts (no SPELLCAST_START fires) —
|
-- Per-craft completion during a tradeskill merge (arg3 = spellID):
|
||||||
-- including tradeskill chaining where craft 2..N reuse one spell.
|
-- count and clear when the chain is done. A no-op for normal casts,
|
||||||
-- Defer one frame so ClassicAPI's SMSG_SPELL_START co-hook has
|
-- which are cleared by UNIT_SPELLCAST_STOP.
|
||||||
-- stamped g_cast before we poll, regardless of co-hook order.
|
if this.tradeskillTotal and arg3 == this.tradeskillSpellID then
|
||||||
if this.tradeskillTotal then
|
|
||||||
StartTradeskillCraft(this)
|
|
||||||
else
|
|
||||||
local target = this
|
|
||||||
RunNextFrame(function()
|
|
||||||
-- Re-check: SPELL_START_SELF (nampower co-hook) fires before vanilla
|
|
||||||
-- SPELLCAST_START on the same packet, so SPELLCAST_START may have
|
|
||||||
-- entered merge in this same frame. Don't restamp over it.
|
|
||||||
if target.tradeskillTotal then
|
|
||||||
StartTradeskillCraft(target)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
RefreshBar(target)
|
|
||||||
if target.unitstr == "player" and target.isTradeskill
|
|
||||||
and (target.pendingTradeskillCount or 0) > 1
|
|
||||||
and C.castbar.player.mergetradeskill == "1" then
|
|
||||||
EnterTradeskillMerge(target, target.startTime, target.endTime, target.pendingTradeskillCount)
|
|
||||||
end
|
|
||||||
target.pendingTradeskillCount = nil
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
elseif event == "SPELLCAST_CHANNEL_STOP" then
|
|
||||||
-- A channel's stop can arrive after a following cast already claimed
|
|
||||||
-- the bar (channel->cast transition); only clear if a channel is
|
|
||||||
-- actually being shown, so it doesn't wipe an active cast bar.
|
|
||||||
if this.isChannel then ClearBar(this) end
|
|
||||||
elseif event == "SPELLCAST_STOP" then
|
|
||||||
-- During a tradeskill chain, SPELL_GO_SELF already counted this craft
|
|
||||||
-- and either cleared the bar (chain done) or kept it running. Only a
|
|
||||||
-- non-merge cast clears here.
|
|
||||||
if not this.tradeskillTotal then ClearBar(this) end
|
|
||||||
elseif event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPTED" then
|
|
||||||
ClearBar(this)
|
|
||||||
elseif event == "SPELL_GO_SELF" then
|
|
||||||
-- arg2 = spellId. In a tradeskill merge, count each successful craft
|
|
||||||
-- and clear when the chain is done.
|
|
||||||
if this.tradeskillTotal and arg2 == this.tradeskillSpellID then
|
|
||||||
this.tradeskillCompleted = (this.tradeskillCompleted or 0) + 1
|
this.tradeskillCompleted = (this.tradeskillCompleted or 0) + 1
|
||||||
if this.tradeskillCompleted >= this.tradeskillTotal then
|
if this.tradeskillCompleted >= this.tradeskillTotal then
|
||||||
ClearBar(this)
|
ClearBar(this)
|
||||||
@@ -414,33 +379,46 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
UpdateTradeskillLabel(this)
|
UpdateTradeskillLabel(this)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif event == "SPELL_DELAYED_SELF" then
|
elseif event == "UNIT_SPELLCAST_CHANNEL_STOP" then
|
||||||
-- Cast pushback. nampower's event carries the delay (arg2); apply it
|
-- A channel's stop can arrive after a following cast already claimed
|
||||||
-- locally rather than re-polling, so the bar doesn't depend on
|
-- the bar (channel->cast transition); only clear if a channel is
|
||||||
-- ClassicAPI's SMSG_SPELL_DELAYED co-hook having bumped g_cast before
|
-- actually being shown, so it doesn't wipe an active cast bar.
|
||||||
-- this fires (co-hook order vs nampower is not guaranteed).
|
if this.isChannel then ClearBar(this) end
|
||||||
if not this.endTime or not arg2 then return end
|
elseif event == "UNIT_SPELLCAST_STOP" then
|
||||||
local delayMs = tonumber(arg2) or 0
|
-- STOP fires between crafts in a merge too (each craft is a new cast);
|
||||||
if delayMs > 0 then
|
-- UNIT_SPELLCAST_SUCCEEDED owns the count, so only a non-merge cast
|
||||||
this.delay = (this.delay or 0) + delayMs / 1000
|
-- clears here.
|
||||||
this.endTime = this.endTime + delayMs
|
if not this.tradeskillTotal then ClearBar(this) end
|
||||||
local newDuration = (this.endTime - this.startTime) / 1000
|
elseif event == "UNIT_SPELLCAST_FAILED" or event == "UNIT_SPELLCAST_INTERRUPTED" then
|
||||||
this.bar:SetMinMaxValues(0, newDuration)
|
ClearBar(this, true)
|
||||||
this.lastMax = newDuration
|
elseif event == "UNIT_SPELLCAST_DELAYED" or event == "UNIT_SPELLCAST_CHANNEL_UPDATE" then
|
||||||
end
|
-- Pushback: a cast delayed later or a channel shortened. Following
|
||||||
elseif event == "SPELLCAST_CHANNEL_UPDATE" then
|
-- Quartz, re-poll just the times and accumulate the shift into a running
|
||||||
-- Channel pushback. ClassicAPI doesn't track channel delay in
|
-- this.delay for the +/- indicator, rather than a full restamp (which
|
||||||
-- g_channel, so we adjust endTime + delay locally and resize the
|
-- would reset that total and re-render icon/text). ClassicAPI moves
|
||||||
-- bar so OnUpdate animates against the new total.
|
-- endMs (SpellDelayed_h bumps g_cast.endMs; the MSG_CHANNEL_UPDATE
|
||||||
if not this.endTime or not arg1 then return end
|
-- co-hook rewrites g_channel.endMs) while startMs stays put, so we diff
|
||||||
local newEndMs = GetTime() * 1000 + arg1
|
-- endMs. delay is a positive magnitude; OnUpdate signs it "+" for casts
|
||||||
local diff = this.endTime - newEndMs
|
-- and "-" for channels. Skipped during a tradeskill merge.
|
||||||
if diff > 50 then
|
if this.endTime and not this.tradeskillTotal then
|
||||||
this.delay = (this.delay or 0) + diff / 1000
|
local query = this.unitstr ~= "" and this.unitstr or this.unitname
|
||||||
this.endTime = newEndMs
|
local startMs, endMs
|
||||||
local newDuration = (this.endTime - this.startTime) / 1000
|
if this.isChannel then
|
||||||
this.bar:SetMinMaxValues(0, newDuration)
|
local _, _, _, s, e = C_Spell.UnitChannelInfo(query)
|
||||||
this.lastMax = newDuration
|
startMs, endMs = s, e
|
||||||
|
else
|
||||||
|
local _, _, _, s, e = C_Spell.UnitCastingInfo(query)
|
||||||
|
startMs, endMs = s, e
|
||||||
|
end
|
||||||
|
if startMs and endMs then
|
||||||
|
local shift = this.isChannel and (this.endTime - endMs) or (endMs - this.endTime)
|
||||||
|
this.delay = (this.delay or 0) + shift / 1000
|
||||||
|
this.startTime = startMs
|
||||||
|
this.endTime = endMs
|
||||||
|
local newDuration = (endMs - startMs) / 1000
|
||||||
|
this.bar:SetMinMaxValues(0, newDuration)
|
||||||
|
this.lastMax = newDuration
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
@@ -486,10 +464,10 @@ pfUI:RegisterModule("castbar", function ()
|
|||||||
UpdateMovable(pfUI.castbar.player)
|
UpdateMovable(pfUI.castbar.player)
|
||||||
|
|
||||||
-- Tradeskill merge: hook DoTradeSkill so the player castbar knows the
|
-- Tradeskill merge: hook DoTradeSkill so the player castbar knows the
|
||||||
-- requested count before the first SPELLCAST_START fires. Always-on hook
|
-- requested count before the first UNIT_SPELLCAST_START fires. Always-on
|
||||||
-- (the config knob is read at event time so toggling takes effect on the
|
-- hook (the config knob is read at event time so toggling takes effect on
|
||||||
-- next craft without a /reload). DoTradeSkill is synchronous; the server
|
-- the next craft without a /reload). DoTradeSkill is synchronous; the
|
||||||
-- roundtrip to SPELLCAST_START gives us plenty of time after this hook.
|
-- server roundtrip to UNIT_SPELLCAST_START gives us plenty of time.
|
||||||
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
|
||||||
|
|||||||
+15
-13
@@ -82,10 +82,10 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.global.custombg == "1" then
|
if C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
pfUI.chat.left.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
pfUI.chat.left.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
pfUI.chat.left.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
pfUI.chat.left.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -257,10 +257,10 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.global.custombg == "1" then
|
if C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
pfUI.chat.right.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
pfUI.chat.right.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
pfUI.chat.right.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
pfUI.chat.right.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -429,7 +429,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
_G["ChatFrame" .. i .. "TabFlash"].Show = function() return end
|
_G["ChatFrame" .. i .. "TabFlash"].Show = function() return end
|
||||||
end
|
end
|
||||||
|
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
local classColor = PFUI_CLASS_COLORS[class]
|
local classColor = PFUI_CLASS_COLORS[class]
|
||||||
_G["ChatFrame" .. i .. "TabText"]:SetTextColor((classColor.r + .3) * .5, (classColor.g + .3) * .5, (classColor.b + .3) * .5, 1)
|
_G["ChatFrame" .. i .. "TabText"]:SetTextColor((classColor.r + .3) * .5, (classColor.g + .3) * .5, (classColor.b + .3) * .5, 1)
|
||||||
_G["ChatFrame" .. i .. "TabText"]:SetFont(panelfont,panelfont_size, "OUTLINE")
|
_G["ChatFrame" .. i .. "TabText"]:SetFont(panelfont,panelfont_size, "OUTLINE")
|
||||||
@@ -675,7 +675,7 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- read and parse whisper color settings
|
-- read and parse whisper color settings
|
||||||
local cr, cg, cb, ca = strsplit(",", C.chat.global.whisper)
|
local cr, cg, cb, ca = GetStringColor(C.chat.global.whisper)
|
||||||
cr, cg, cb = tonumber(cr), tonumber(cg), tonumber(cb)
|
cr, cg, cb = tonumber(cr), tonumber(cg), tonumber(cb)
|
||||||
local wcol = rgbhex(cr, cg, cb)
|
local wcol = rgbhex(cr, cg, cb)
|
||||||
|
|
||||||
@@ -706,10 +706,10 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
_G.CHAT_WHISPER_INFORM_GET = '[W]' .. default
|
_G.CHAT_WHISPER_INFORM_GET = '[W]' .. default
|
||||||
end
|
end
|
||||||
|
|
||||||
local r,g,b,a = strsplit(",", C.chat.text.timecolor)
|
local r,g,b,a = GetStringColor(C.chat.text.timecolor)
|
||||||
local timecolorhex = rgbhex(r,g,b,a)
|
local timecolorhex = rgbhex(r,g,b,a)
|
||||||
|
|
||||||
local r,g,b = strsplit(",", C.chat.text.unknowncolor)
|
local r,g,b = GetStringColor(C.chat.text.unknowncolor)
|
||||||
local unknowncolorhex = rgbhex(r,g,b)
|
local unknowncolorhex = rgbhex(r,g,b)
|
||||||
|
|
||||||
-- Suppress FriendsFrame's WHO_LIST_UPDATE handling for our DLL-issued
|
-- Suppress FriendsFrame's WHO_LIST_UPDATE handling for our DLL-issued
|
||||||
@@ -810,23 +810,25 @@ pfUI:RegisterModule("chat", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- detect the whisper prefix BEFORE prepending a timestamp; the timestamp
|
||||||
|
-- pushes the whisper colour code off position 1 and the find below fails
|
||||||
|
local isWhisper = C.chat.global.whispermod == "1" and string.find(text, wcol, 1) == 1
|
||||||
|
|
||||||
-- show timestamp in chat
|
-- show timestamp in chat
|
||||||
if C.chat.text.time == "1" then
|
if C.chat.text.time == "1" then
|
||||||
text = timecolorhex .. tleft .. date(C.chat.text.timeformat) .. tright .. "|r " .. text
|
text = timecolorhex .. tleft .. date(C.chat.text.timeformat) .. tright .. "|r " .. text
|
||||||
end
|
end
|
||||||
|
|
||||||
-- save chat history
|
-- save chat history
|
||||||
if C.chat.global.whispermod == "1" and string.find(text, wcol, 1) == 1 then
|
if isWhisper then
|
||||||
SaveChatHistory(frame:GetID(), string.gsub(text, wcol, ""), cr, cg, cb)
|
SaveChatHistory(frame:GetID(), string.gsub(text, wcol, ""), cr, cg, cb)
|
||||||
else
|
else
|
||||||
SaveChatHistory(frame:GetID(), text, a1, a2, a3)
|
SaveChatHistory(frame:GetID(), text, a1, a2, a3)
|
||||||
end
|
end
|
||||||
|
|
||||||
if C.chat.global.whispermod == "1" then
|
if isWhisper then
|
||||||
-- patch incoming whisper string to match the colors
|
-- patch incoming whisper string to match the colors
|
||||||
if string.find(text, wcol, 1) == 1 then
|
text = string.gsub(text, "|r", "|r" .. wcol)
|
||||||
text = string.gsub(text, "|r", "|r" .. wcol)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
frame:HookAddMessage(text, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
|
frame:HookAddMessage(text, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
|
||||||
|
|||||||
@@ -96,8 +96,7 @@ pfUI:RegisterModule("chatcopy", function ()
|
|||||||
scroll:Hide()
|
scroll:Hide()
|
||||||
|
|
||||||
local editbox = CreateFrame("EditBox", "pfChatCopyBox" .. i, scroll)
|
local editbox = CreateFrame("EditBox", "pfChatCopyBox" .. i, scroll)
|
||||||
editbox:SetHeight(frame:GetHeight())
|
editbox:SetSize(frame:GetSize())
|
||||||
editbox:SetWidth(frame:GetWidth())
|
|
||||||
editbox:SetAllPoints(scroll)
|
editbox:SetAllPoints(scroll)
|
||||||
editbox:SetTextColor(1,1,1,1)
|
editbox:SetTextColor(1,1,1,1)
|
||||||
editbox:SetFontObject(ChatFontNormal)
|
editbox:SetFontObject(ChatFontNormal)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ pfUI:RegisterModule("combopoints", function ()
|
|||||||
ComboFrame:Hide()
|
ComboFrame:Hide()
|
||||||
ComboFrame:UnregisterAllEvents()
|
ComboFrame:UnregisterAllEvents()
|
||||||
|
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
local combo_width = C["unitframes"]["combowidth"]
|
local combo_width = C["unitframes"]["combowidth"]
|
||||||
local combo_height = C["unitframes"]["comboheight"]
|
local combo_height = C["unitframes"]["comboheight"]
|
||||||
pfUI.combopoints = {}
|
pfUI.combopoints = {}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
pfUI:RegisterModule("cooldown", function ()
|
pfUI:RegisterModule("cooldown", function ()
|
||||||
-- cache values
|
-- cache values
|
||||||
local lowcolor = {strsplit(",", C.appearance.cd.lowcolor)}
|
-- local lowcolor = {strsplit(",", C.appearance.cd.lowcolor)}
|
||||||
local normalcolor = {strsplit(",", C.appearance.cd.normalcolor)}
|
-- local normalcolor = {strsplit(",", C.appearance.cd.normalcolor)}
|
||||||
local minutecolor = {strsplit(",", C.appearance.cd.minutecolor)}
|
-- local minutecolor = {strsplit(",", C.appearance.cd.minutecolor)}
|
||||||
local hourcolor = {strsplit(",", C.appearance.cd.hourcolor)}
|
-- local hourcolor = {strsplit(",", C.appearance.cd.hourcolor)}
|
||||||
local daycolor = {strsplit(",", C.appearance.cd.daycolor)}
|
-- local daycolor = {strsplit(",", C.appearance.cd.daycolor)}
|
||||||
|
|
||||||
local parent, parent_name
|
local parent, parent_name
|
||||||
local function pfCooldownOnUpdate()
|
local function pfCooldownOnUpdate()
|
||||||
parent = this:GetParent()
|
parent = this:GetParent()
|
||||||
if not parent then this:Hide() end
|
if not parent then this:Hide() return end
|
||||||
parent_name = parent:GetName()
|
parent_name = parent:GetName()
|
||||||
|
|
||||||
-- avoid to set cooldowns on invalid frames
|
-- avoid to set cooldowns on invalid frames
|
||||||
|
|||||||
@@ -123,8 +123,7 @@ pfUI:RegisterModule("easteregg", function ()
|
|||||||
local f = GetExplosion()
|
local f = GetExplosion()
|
||||||
f:ClearAllPoints()
|
f:ClearAllPoints()
|
||||||
f:SetPoint("CENTER", fireworks, "TOPLEFT", x, y)
|
f:SetPoint("CENTER", fireworks, "TOPLEFT", x, y)
|
||||||
f:SetWidth(25)
|
f:SetSize(25, 25)
|
||||||
f:SetHeight(25)
|
|
||||||
f.tex:SetTexture(1,1,1,.5)
|
f.tex:SetTexture(1,1,1,.5)
|
||||||
f:SetAlpha(1)
|
f:SetAlpha(1)
|
||||||
f:Show()
|
f:Show()
|
||||||
@@ -134,8 +133,7 @@ pfUI:RegisterModule("easteregg", function ()
|
|||||||
local f = GetExplosion()
|
local f = GetExplosion()
|
||||||
f:ClearAllPoints()
|
f:ClearAllPoints()
|
||||||
f:SetPoint("CENTER", fireworks, "TOPLEFT", x+(math.random(0,100)-50), y+(math.random(0,100)-50))
|
f:SetPoint("CENTER", fireworks, "TOPLEFT", x+(math.random(0,100)-50), y+(math.random(0,100)-50))
|
||||||
f:SetWidth(2)
|
f:SetSize(2, 2)
|
||||||
f:SetHeight(2)
|
|
||||||
f.tex:SetTexture(math.random(),math.random(),math.random(),1)
|
f.tex:SetTexture(math.random(),math.random(),math.random(),1)
|
||||||
f:SetAlpha(1)
|
f:SetAlpha(1)
|
||||||
f:Show()
|
f:Show()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ local function getAdjustedTickTimer()
|
|||||||
local adjustedEnergyTick = 2
|
local adjustedEnergyTick = 2
|
||||||
|
|
||||||
-- Check rogue talents and compute energy tick timing reduction for Combat spec (1.18.0 Blade Rush Talent)
|
-- Check rogue talents and compute energy tick timing reduction for Combat spec (1.18.0 Blade Rush Talent)
|
||||||
if UnitClass("player") == "Rogue" then
|
if UnitClassBase("player") == "ROGUE" then
|
||||||
local _, _, _, _, currRank = GetTalentInfo(2, 16)
|
local _, _, _, _, currRank = GetTalentInfo(2, 16)
|
||||||
local bladeRushRank = currRank or 0
|
local bladeRushRank = currRank or 0
|
||||||
|
|
||||||
@@ -32,10 +32,10 @@ pfUI:RegisterModule("energytick", function()
|
|||||||
energytick:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS")
|
energytick:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS")
|
||||||
|
|
||||||
energytick:SetScript("OnEvent", function()
|
energytick:SetScript("OnEvent", function()
|
||||||
if UnitPowerType("player") == 0 and C.unitframes.player.manatick == "1" then
|
if UnitPowerType("player") == Enum.PowerType.Mana and C.unitframes.player.manatick == "1" then
|
||||||
this.mode = "MANA"
|
this.mode = "MANA"
|
||||||
this:Show()
|
this:Show()
|
||||||
elseif UnitPowerType("player") == 3 and C.unitframes.player.energy == "1" then
|
elseif UnitPowerType("player") == Enum.PowerType.Energy and C.unitframes.player.energy == "1" then
|
||||||
this.mode = "ENERGY"
|
this.mode = "ENERGY"
|
||||||
this:Show()
|
this:Show()
|
||||||
else
|
else
|
||||||
@@ -51,11 +51,11 @@ pfUI:RegisterModule("energytick", function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if event == "PLAYER_ENTERING_WORLD" then
|
if event == "PLAYER_ENTERING_WORLD" then
|
||||||
this.lastMana = UnitMana("player")
|
this.lastMana = UnitPower("player")
|
||||||
end
|
end
|
||||||
|
|
||||||
if (event == "UNIT_MANA" or event == "UNIT_ENERGY") and arg1 == "player" then
|
if (event == "UNIT_MANA" or event == "UNIT_ENERGY") and arg1 == "player" then
|
||||||
this.currentMana = UnitMana("player")
|
this.currentMana = UnitPower("player")
|
||||||
local diff = 0
|
local diff = 0
|
||||||
if this.lastMana then
|
if this.lastMana then
|
||||||
diff = this.currentMana - this.lastMana
|
diff = this.currentMana - this.lastMana
|
||||||
@@ -64,7 +64,7 @@ pfUI:RegisterModule("energytick", function()
|
|||||||
if this.mode == "MANA" and diff < 0 then
|
if this.mode == "MANA" and diff < 0 then
|
||||||
this.target = 5
|
this.target = 5
|
||||||
elseif this.mode == "MANA" and diff > 0 then
|
elseif this.mode == "MANA" and diff > 0 then
|
||||||
if UnitMana("player") >= UnitManaMax("player") then
|
if UnitPower("player") >= UnitPowerMax("player") then
|
||||||
this.start = nil
|
this.start = nil
|
||||||
this.spark:SetAlpha(0)
|
this.spark:SetAlpha(0)
|
||||||
this:Hide()
|
this:Hide()
|
||||||
@@ -105,7 +105,7 @@ pfUI:RegisterModule("energytick", function()
|
|||||||
|
|
||||||
if this.current > this.max then
|
if this.current > this.max then
|
||||||
-- Don't restart tick timer if mana is full
|
-- Don't restart tick timer if mana is full
|
||||||
if this.mode == "MANA" and UnitMana("player") >= UnitManaMax("player") then
|
if this.mode == "MANA" and UnitPower("player") >= UnitPowerMax("player") then
|
||||||
this.start = nil
|
this.start = nil
|
||||||
this.spark:SetAlpha(0)
|
this.spark:SetAlpha(0)
|
||||||
return
|
return
|
||||||
|
|||||||
+94
-270
@@ -1,11 +1,10 @@
|
|||||||
-- Equipment Manager module
|
-- Equipment Manager module
|
||||||
-- Backport of the 4.3.4 GearManagerDialog UI on top of ClassicAPI's
|
-- Backport of the 4.3.4 GearManagerDialog UI on top of ClassicAPI's C_EquipmentSet.* API.
|
||||||
-- C_EquipmentSet.* API. Adds a 6th tab to CharacterFrame.
|
|
||||||
|
|
||||||
pfUI:RegisterModule("equipmentmanager", function()
|
pfUI:RegisterModule("equipmentmanager", function()
|
||||||
if not C_EquipmentSet or not C_EquipmentSet.CanUseEquipmentSets() then return end
|
if not C_EquipmentSet or not C_EquipmentSet.CanUseEquipmentSets() then return end
|
||||||
|
|
||||||
pfUI.equipmentmanager = pfUI.equipmentmanager or {}
|
pfUI.equipmentmanager = {}
|
||||||
|
|
||||||
local SET_ROW_HEIGHT = 36
|
local SET_ROW_HEIGHT = 36
|
||||||
|
|
||||||
@@ -14,6 +13,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
local pendingAction = nil -- "new" | "save" | "rename" — what the popups apply to
|
local pendingAction = nil -- "new" | "save" | "rename" — what the popups apply to
|
||||||
local slotOverlays = {} -- [invSlotID] = ignored-overlay texture on the character slot
|
local slotOverlays = {} -- [invSlotID] = ignored-overlay texture on the character slot
|
||||||
local popoutButtons = {} -- popout arrow buttons; toggled with the EM frame
|
local popoutButtons = {} -- popout arrow buttons; toggled with the EM frame
|
||||||
|
local UpdatePopouts -- forward decl; assigned once popouts + flyout exist
|
||||||
|
|
||||||
-- Pending ignored-slot toggles per set: a slotID here means the
|
-- Pending ignored-slot toggles per set: a slotID here means the
|
||||||
-- effective state is flipped from what's persisted. Committed on
|
-- effective state is flipped from what's persisted. Committed on
|
||||||
@@ -55,7 +55,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
local function EquipSet(setID)
|
local function EquipSet(setID)
|
||||||
if not setID then return end
|
if not setID then return end
|
||||||
if C_EquipmentSet.EquipmentSetContainsLockedItems(setID) then
|
if C_EquipmentSet.EquipmentSetContainsLockedItems(setID) then
|
||||||
UIErrorsFrame:AddMessage(ERR_CLIENT_LOCKED_OUT or "Locked items in set", 1, .1, .1, 1)
|
UIErrorsFrame:AddMessage(ERR_CLIENT_LOCKED_OUT, 1, .1, .1, 1)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
ClearCursor()
|
ClearCursor()
|
||||||
@@ -68,8 +68,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
-- ============================================================
|
-- ============================================================
|
||||||
|
|
||||||
local frame = CreateFrame("Frame", "pfEquipmentManagerFrame", CharacterFrame)
|
local frame = CreateFrame("Frame", "pfEquipmentManagerFrame", CharacterFrame)
|
||||||
frame:SetWidth(220)
|
frame:SetSize(220, 350)
|
||||||
frame:SetHeight(350)
|
|
||||||
frame:SetFrameStrata("HIGH")
|
frame:SetFrameStrata("HIGH")
|
||||||
frame:SetScript("OnShow", function()
|
frame:SetScript("OnShow", function()
|
||||||
this:ClearAllPoints()
|
this:ClearAllPoints()
|
||||||
@@ -78,7 +77,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
else
|
else
|
||||||
frame:SetPoint("TOPLEFT", CharacterFrame, "TOPRIGHT", 0, 0)
|
frame:SetPoint("TOPLEFT", CharacterFrame, "TOPRIGHT", 0, 0)
|
||||||
end
|
end
|
||||||
for _, b in ipairs(popoutButtons) do b:Show() end
|
UpdatePopouts()
|
||||||
end)
|
end)
|
||||||
CreateBackdrop(frame, nil, nil, .9)
|
CreateBackdrop(frame, nil, nil, .9)
|
||||||
CreateBackdropShadow(frame)
|
CreateBackdropShadow(frame)
|
||||||
@@ -86,7 +85,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
|
|
||||||
frame.title = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
frame.title = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
frame.title:SetPoint("TOP", frame, "TOP", 0, -10)
|
frame.title:SetPoint("TOP", frame, "TOP", 0, -10)
|
||||||
frame.title:SetText(T["Equipment Manager"] or "Equipment Manager")
|
frame.title:SetText(EQUIPMENT_MANAGER)
|
||||||
|
|
||||||
local closeBtn = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
|
local closeBtn = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
|
||||||
closeBtn:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -4, -4)
|
closeBtn:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -4, -4)
|
||||||
@@ -98,15 +97,14 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
-- ============================================================
|
-- ============================================================
|
||||||
|
|
||||||
local toggleBtn = CreateFrame("Button", "pfEqMgrToggleButton", PaperDollFrame)
|
local toggleBtn = CreateFrame("Button", "pfEqMgrToggleButton", PaperDollFrame)
|
||||||
toggleBtn:SetWidth(28)
|
toggleBtn:SetSize(28, 28)
|
||||||
toggleBtn:SetHeight(28)
|
|
||||||
toggleBtn:SetPoint("BOTTOM", CharacterHandsSlot, "TOP", 0, 4)
|
toggleBtn:SetPoint("BOTTOM", CharacterHandsSlot, "TOP", 0, 4)
|
||||||
toggleBtn:SetNormalTexture(pfUI.path.."\\img\\UI-GearManager-Button")
|
toggleBtn:SetNormalTexture(pfUI.path.."\\img\\UI-GearManager-Button")
|
||||||
toggleBtn:SetPushedTexture(pfUI.path.."\\img\\UI-GearManager-Button-Pushed")
|
toggleBtn:SetPushedTexture(pfUI.path.."\\img\\UI-GearManager-Button-Pushed")
|
||||||
toggleBtn:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square", "ADD")
|
toggleBtn:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square", "ADD")
|
||||||
toggleBtn:SetScript("OnEnter", function()
|
toggleBtn:SetScript("OnEnter", function()
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
||||||
GameTooltip:SetText(T["Equipment Manager"] or "Equipment Manager")
|
GameTooltip:SetText(PAPERDOLL_EQUIPMENTMANAGER)
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end)
|
end)
|
||||||
toggleBtn:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
toggleBtn:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
||||||
@@ -126,13 +124,13 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
-- ============================================================
|
-- ============================================================
|
||||||
|
|
||||||
local btnEquip = CreateFrame("Button", "pfEqMgrEquip", frame, "UIPanelButtonTemplate")
|
local btnEquip = CreateFrame("Button", "pfEqMgrEquip", frame, "UIPanelButtonTemplate")
|
||||||
btnEquip:SetWidth(86); btnEquip:SetHeight(22); btnEquip:SetText(T["Equip"] or "Equip")
|
btnEquip:SetSize(86, 22); btnEquip:SetText(EQUIPSET_EQUIP)
|
||||||
btnEquip:SetPoint("TOPLEFT", frame, "TOPLEFT", 16, -30)
|
btnEquip:SetPoint("TOPLEFT", frame, "TOPLEFT", 16, -30)
|
||||||
SkinButton(btnEquip)
|
SkinButton(btnEquip)
|
||||||
btnEquip:SetScript("OnClick", function() EquipSet(selectedSetID) end)
|
btnEquip:SetScript("OnClick", function() EquipSet(selectedSetID) end)
|
||||||
|
|
||||||
local btnSave = CreateFrame("Button", "pfEqMgrSave", frame, "UIPanelButtonTemplate")
|
local btnSave = CreateFrame("Button", "pfEqMgrSave", frame, "UIPanelButtonTemplate")
|
||||||
btnSave:SetWidth(86); btnSave:SetHeight(22); btnSave:SetText(T["Save"] or "Save")
|
btnSave:SetSize(86, 22); btnSave:SetText(SAVE)
|
||||||
btnSave:SetPoint("LEFT", btnEquip, "RIGHT", 6, 0)
|
btnSave:SetPoint("LEFT", btnEquip, "RIGHT", 6, 0)
|
||||||
SkinButton(btnSave)
|
SkinButton(btnSave)
|
||||||
btnSave:SetScript("OnClick", function()
|
btnSave:SetScript("OnClick", function()
|
||||||
@@ -141,7 +139,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
if not name then return end
|
if not name then return end
|
||||||
local targetID = selectedSetID
|
local targetID = selectedSetID
|
||||||
StaticPopupDialogs["PFUI_EQMGR_SAVE_CONFIRM"] = {
|
StaticPopupDialogs["PFUI_EQMGR_SAVE_CONFIRM"] = {
|
||||||
text = string.format(T["Would you like to save the equipment set '%s'?"] or "Would you like to save the equipment set '%s'?", name),
|
text = string.format(CONFIRM_SAVE_EQUIPMENT_SET, name),
|
||||||
button1 = YES, button2 = NO,
|
button1 = YES, button2 = NO,
|
||||||
OnAccept = function()
|
OnAccept = function()
|
||||||
C_EquipmentSet.ClearIgnoredSlotsForSave()
|
C_EquipmentSet.ClearIgnoredSlotsForSave()
|
||||||
@@ -166,7 +164,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
|
|
||||||
local rowMenu = CreateFrame("Frame", "pfEqMgrRowMenu", UIParent)
|
local rowMenu = CreateFrame("Frame", "pfEqMgrRowMenu", UIParent)
|
||||||
rowMenu:SetFrameStrata("DIALOG")
|
rowMenu:SetFrameStrata("DIALOG")
|
||||||
rowMenu:SetWidth(140); rowMenu:SetHeight(50)
|
rowMenu:SetSize(140, 50);
|
||||||
rowMenu:Hide()
|
rowMenu:Hide()
|
||||||
CreateBackdrop(rowMenu, nil, nil, .95)
|
CreateBackdrop(rowMenu, nil, nil, .95)
|
||||||
CreateBackdropShadow(rowMenu)
|
CreateBackdropShadow(rowMenu)
|
||||||
@@ -185,9 +183,9 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
tinsert(UISpecialFrames, "pfEqMgrRowMenu") -- Escape closes it
|
tinsert(UISpecialFrames, "pfEqMgrRowMenu") -- Escape closes it
|
||||||
|
|
||||||
rowMenu.changeBtn = CreateFrame("Button", nil, rowMenu, "UIPanelButtonTemplate")
|
rowMenu.changeBtn = CreateFrame("Button", nil, rowMenu, "UIPanelButtonTemplate")
|
||||||
rowMenu.changeBtn:SetWidth(130); rowMenu.changeBtn:SetHeight(20)
|
rowMenu.changeBtn:SetSize(130, 20);
|
||||||
rowMenu.changeBtn:SetPoint("TOPLEFT", rowMenu, "TOPLEFT", 5, -3)
|
rowMenu.changeBtn:SetPoint("TOPLEFT", rowMenu, "TOPLEFT", 5, -3)
|
||||||
rowMenu.changeBtn:SetText(T["Change Name/Icon"] or "Change Name/Icon")
|
rowMenu.changeBtn:SetText(EQUIPMENT_SET_EDIT)
|
||||||
SkinButton(rowMenu.changeBtn)
|
SkinButton(rowMenu.changeBtn)
|
||||||
rowMenu.changeBtn:SetScript("OnClick", function()
|
rowMenu.changeBtn:SetScript("OnClick", function()
|
||||||
rowMenu:Hide()
|
rowMenu:Hide()
|
||||||
@@ -198,9 +196,9 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
rowMenu.deleteBtn = CreateFrame("Button", nil, rowMenu, "UIPanelButtonTemplate")
|
rowMenu.deleteBtn = CreateFrame("Button", nil, rowMenu, "UIPanelButtonTemplate")
|
||||||
rowMenu.deleteBtn:SetWidth(130); rowMenu.deleteBtn:SetHeight(20)
|
rowMenu.deleteBtn:SetSize(130, 20);
|
||||||
rowMenu.deleteBtn:SetPoint("TOP", rowMenu.changeBtn, "BOTTOM", 0, -2)
|
rowMenu.deleteBtn:SetPoint("TOP", rowMenu.changeBtn, "BOTTOM", 0, -2)
|
||||||
rowMenu.deleteBtn:SetText(T["Delete"] or "Delete")
|
rowMenu.deleteBtn:SetText(DELETE)
|
||||||
SkinButton(rowMenu.deleteBtn)
|
SkinButton(rowMenu.deleteBtn)
|
||||||
rowMenu.deleteBtn:SetScript("OnClick", function()
|
rowMenu.deleteBtn:SetScript("OnClick", function()
|
||||||
rowMenu:Hide()
|
rowMenu:Hide()
|
||||||
@@ -208,7 +206,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
local targetID = rowMenu.targetSetID
|
local targetID = rowMenu.targetSetID
|
||||||
local name = C_EquipmentSet.GetEquipmentSetInfo(targetID)
|
local name = C_EquipmentSet.GetEquipmentSetInfo(targetID)
|
||||||
StaticPopupDialogs["PFUI_EQMGR_DELETE"] = {
|
StaticPopupDialogs["PFUI_EQMGR_DELETE"] = {
|
||||||
text = string.format(T["Delete equipment set '%s'?"] or "Delete equipment set '%s'?", name or "?"),
|
text = string.format(CONFIRM_DELETE_EQUIPMENT_SET, name or "?"),
|
||||||
button1 = YES, button2 = NO,
|
button1 = YES, button2 = NO,
|
||||||
OnAccept = function()
|
OnAccept = function()
|
||||||
pendingIgnoredToggles[targetID] = nil
|
pendingIgnoredToggles[targetID] = nil
|
||||||
@@ -229,9 +227,8 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
local LIST_ROW_STRIDE = SET_ROW_HEIGHT + 2
|
local LIST_ROW_STRIDE = SET_ROW_HEIGHT + 2
|
||||||
local listFrame = CreateFrame("Frame", nil, frame)
|
local listFrame = CreateFrame("Frame", nil, frame)
|
||||||
listFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 16, -58)
|
listFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 16, -58)
|
||||||
listFrame:SetWidth(180)
|
|
||||||
-- Height fits N rows + (N-1) inter-row gaps + 3px top/bottom padding.
|
-- Height fits N rows + (N-1) inter-row gaps + 3px top/bottom padding.
|
||||||
listFrame:SetHeight(LIST_VISIBLE_ROWS * LIST_ROW_STRIDE + 4)
|
listFrame:SetSize(180, LIST_VISIBLE_ROWS * LIST_ROW_STRIDE + 4)
|
||||||
CreateBackdrop(listFrame, nil, nil, .75)
|
CreateBackdrop(listFrame, nil, nil, .75)
|
||||||
|
|
||||||
-- Mouse-wheel scroll: list of [sets..., newSetRow] is virtualized
|
-- Mouse-wheel scroll: list of [sets..., newSetRow] is virtualized
|
||||||
@@ -247,15 +244,13 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
local setRows = {}
|
local setRows = {}
|
||||||
local function CreateSetRow()
|
local function CreateSetRow()
|
||||||
local row = CreateFrame("Button", nil, listFrame)
|
local row = CreateFrame("Button", nil, listFrame)
|
||||||
row:SetWidth(170)
|
row:SetSize(170, SET_ROW_HEIGHT)
|
||||||
row:SetHeight(SET_ROW_HEIGHT)
|
|
||||||
-- Position is set per-Refresh based on the row's visible slot;
|
-- Position is set per-Refresh based on the row's visible slot;
|
||||||
-- start anchored to avoid uninitialized geometry before first Refresh.
|
-- start anchored to avoid uninitialized geometry before first Refresh.
|
||||||
row:SetPoint("TOPLEFT", listFrame, "TOPLEFT", 5, -3)
|
row:SetPoint("TOPLEFT", listFrame, "TOPLEFT", 5, -3)
|
||||||
|
|
||||||
row.icon = row:CreateTexture(nil, "ARTWORK")
|
row.icon = row:CreateTexture(nil, "ARTWORK")
|
||||||
row.icon:SetWidth(30)
|
row.icon:SetSize(30, 30)
|
||||||
row.icon:SetHeight(30)
|
|
||||||
row.icon:SetPoint("LEFT", row, "LEFT", 2, 0)
|
row.icon:SetPoint("LEFT", row, "LEFT", 2, 0)
|
||||||
row.icon:SetTexCoord(.08, .92, .08, .92)
|
row.icon:SetTexCoord(.08, .92, .08, .92)
|
||||||
|
|
||||||
@@ -270,7 +265,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
row.highlight:Hide()
|
row.highlight:Hide()
|
||||||
|
|
||||||
row.gear = CreateFrame("Button", nil, row)
|
row.gear = CreateFrame("Button", nil, row)
|
||||||
row.gear:SetWidth(16); row.gear:SetHeight(16)
|
row.gear:SetSize(16, 16);
|
||||||
row.gear:SetPoint("RIGHT", row, "RIGHT", -4, 0)
|
row.gear:SetPoint("RIGHT", row, "RIGHT", -4, 0)
|
||||||
row.gear.tex = row.gear:CreateTexture(nil, "ARTWORK")
|
row.gear.tex = row.gear:CreateTexture(nil, "ARTWORK")
|
||||||
row.gear.tex:SetAllPoints(row.gear)
|
row.gear.tex:SetAllPoints(row.gear)
|
||||||
@@ -306,27 +301,27 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
pfUI.equipmentmanager.Refresh()
|
pfUI.equipmentmanager.Refresh()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Hover handling: OnLeave fires when the cursor moves onto a child
|
-- Show the gear and tooltip while the cursor is over the row or its
|
||||||
-- (the gear button becomes the topmost mouse target). Use an
|
-- gear child. The gear sits inside the row's rectangle, so a single
|
||||||
-- OnUpdate poll so the gear stays shown while the cursor is over
|
-- MouseIsOver(row) check covers both. OnLeave on the row and the gear
|
||||||
-- the row OR the gear itself.
|
-- catches every exit path, so no OnUpdate poll is needed.
|
||||||
|
local function HideRowHover()
|
||||||
|
if MouseIsOver(row) then return end
|
||||||
|
GameTooltip:Hide()
|
||||||
|
row.gear:Hide()
|
||||||
|
end
|
||||||
row:SetScript("OnEnter", function()
|
row:SetScript("OnEnter", function()
|
||||||
if not this.setID then return end
|
if not row.setID then return end
|
||||||
local name = C_EquipmentSet.GetEquipmentSetInfo(this.setID)
|
local name = C_EquipmentSet.GetEquipmentSetInfo(row.setID)
|
||||||
if name then
|
if name then
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
GameTooltip:SetOwner(row, "ANCHOR_RIGHT")
|
||||||
GameTooltip:SetEquipmentSet(name)
|
GameTooltip:SetEquipmentSet(name)
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
row.gear:Show()
|
row.gear:Show()
|
||||||
this:SetScript("OnUpdate", function()
|
|
||||||
if not MouseIsOver(this) and not MouseIsOver(row.gear) then
|
|
||||||
this:SetScript("OnUpdate", nil)
|
|
||||||
GameTooltip:Hide()
|
|
||||||
row.gear:Hide()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
row:SetScript("OnLeave", HideRowHover)
|
||||||
|
row.gear:SetScript("OnLeave", HideRowHover)
|
||||||
|
|
||||||
return row
|
return row
|
||||||
end
|
end
|
||||||
@@ -338,10 +333,10 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
-- specific set index (row[i] always shows ids[i]).
|
-- specific set index (row[i] always shows ids[i]).
|
||||||
|
|
||||||
local newSetRow = CreateFrame("Button", nil, listFrame)
|
local newSetRow = CreateFrame("Button", nil, listFrame)
|
||||||
newSetRow:SetWidth(170); newSetRow:SetHeight(SET_ROW_HEIGHT)
|
newSetRow:SetSize(170, SET_ROW_HEIGHT);
|
||||||
|
|
||||||
newSetRow.icon = newSetRow:CreateTexture(nil, "ARTWORK")
|
newSetRow.icon = newSetRow:CreateTexture(nil, "ARTWORK")
|
||||||
newSetRow.icon:SetWidth(24); newSetRow.icon:SetHeight(24)
|
newSetRow.icon:SetSize(24, 24);
|
||||||
newSetRow.icon:SetPoint("LEFT", newSetRow, "LEFT", 5, 0)
|
newSetRow.icon:SetPoint("LEFT", newSetRow, "LEFT", 5, 0)
|
||||||
newSetRow.icon:SetTexture(pfUI.path.."\\img\\Character-Plus")
|
newSetRow.icon:SetTexture(pfUI.path.."\\img\\Character-Plus")
|
||||||
|
|
||||||
@@ -349,7 +344,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
newSetRow.text:SetPoint("LEFT", newSetRow.icon, "RIGHT", 8, 0)
|
newSetRow.text:SetPoint("LEFT", newSetRow.icon, "RIGHT", 8, 0)
|
||||||
newSetRow.text:SetPoint("RIGHT", newSetRow, "RIGHT", -4, 0)
|
newSetRow.text:SetPoint("RIGHT", newSetRow, "RIGHT", -4, 0)
|
||||||
newSetRow.text:SetJustifyH("LEFT")
|
newSetRow.text:SetJustifyH("LEFT")
|
||||||
newSetRow.text:SetText(T["New Set"] or "New Set")
|
newSetRow.text:SetText(PAPERDOLL_NEWEQUIPMENTSET)
|
||||||
newSetRow.text:SetTextColor(0.2, 1, 0.2)
|
newSetRow.text:SetTextColor(0.2, 1, 0.2)
|
||||||
|
|
||||||
newSetRow.highlight = newSetRow:CreateTexture(nil, "BACKGROUND")
|
newSetRow.highlight = newSetRow:CreateTexture(nil, "BACKGROUND")
|
||||||
@@ -362,8 +357,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
|
|
||||||
local function MakeButton(name, label, parent, anchor, ax, ay, width)
|
local function MakeButton(name, label, parent, anchor, ax, ay, width)
|
||||||
local b = CreateFrame("Button", name, parent, "UIPanelButtonTemplate")
|
local b = CreateFrame("Button", name, parent, "UIPanelButtonTemplate")
|
||||||
b:SetWidth(width or 70)
|
b:SetSize(width or 70, 22)
|
||||||
b:SetHeight(22)
|
|
||||||
b:SetText(label)
|
b:SetText(label)
|
||||||
b:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", ax, ay)
|
b:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", ax, ay)
|
||||||
SkinButton(b)
|
SkinButton(b)
|
||||||
@@ -376,8 +370,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
|
|
||||||
local namePopup = CreateFrame("Frame", "pfEqMgrNamePopup", UIParent)
|
local namePopup = CreateFrame("Frame", "pfEqMgrNamePopup", UIParent)
|
||||||
namePopup:SetFrameStrata("DIALOG")
|
namePopup:SetFrameStrata("DIALOG")
|
||||||
namePopup:SetWidth(472)
|
namePopup:SetSize(472, 484)
|
||||||
namePopup:SetHeight(498)
|
|
||||||
namePopup:SetPoint("CENTER", UIParent, "CENTER")
|
namePopup:SetPoint("CENTER", UIParent, "CENTER")
|
||||||
namePopup:Hide()
|
namePopup:Hide()
|
||||||
CreateBackdrop(namePopup, nil, nil, .9)
|
CreateBackdrop(namePopup, nil, nil, .9)
|
||||||
@@ -388,200 +381,28 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
namePopup:SetScript("OnDragStart", function() this:StartMoving() end)
|
namePopup:SetScript("OnDragStart", function() this:StartMoving() end)
|
||||||
namePopup:SetScript("OnDragStop", function() this:StopMovingOrSizing() end)
|
namePopup:SetScript("OnDragStop", function() this:StopMovingOrSizing() end)
|
||||||
|
|
||||||
namePopup.title = namePopup:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
-- Equipment seed leads the grid with gear-relevant item icons. The widget
|
||||||
namePopup.title:SetPoint("TOP", namePopup, "TOP", 0, -10)
|
-- owns the name field, preview, grid, filter, and search; this module keeps
|
||||||
namePopup.title:SetText(T["Save Set"] or "Save Set")
|
-- the OK/Cancel buttons and the create/save/rename flow below.
|
||||||
|
local iconPicker = CreateIconPicker("pfEqMgrIcon", namePopup,
|
||||||
|
IconDataProviderExtraType.Equipment, GEARSETS_POPUP_TEXT)
|
||||||
|
|
||||||
namePopup.nameLabel = namePopup:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
local btnPopupOK = MakeButton("pfEqMgrPopupOK", OKAY, namePopup, namePopup, 14, -340, 80)
|
||||||
namePopup.nameLabel:SetPoint("TOPLEFT", namePopup, "TOPLEFT", 14, -34)
|
|
||||||
namePopup.nameLabel:SetText(T["Enter Set Name (Max 16 Characters):"] or "Enter Set Name (Max 16 Characters):")
|
|
||||||
|
|
||||||
namePopup.editbox = CreateFrame("EditBox", "pfEqMgrNameEdit", namePopup, "InputBoxTemplate")
|
local btnPopupCancel = MakeButton("pfEqMgrPopupCancel", CANCEL, namePopup, namePopup, 0, 0, 80)
|
||||||
namePopup.editbox:SetWidth(280)
|
|
||||||
namePopup.editbox:SetHeight(20)
|
|
||||||
namePopup.editbox:SetPoint("TOPLEFT", namePopup, "TOPLEFT", 14, -52)
|
|
||||||
namePopup.editbox:SetAutoFocus(false)
|
|
||||||
namePopup.editbox:SetMaxLetters(16)
|
|
||||||
CreateBackdrop(namePopup.editbox)
|
|
||||||
|
|
||||||
namePopup.selectedLabel = namePopup:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
|
||||||
namePopup.selectedLabel:SetPoint("TOPRIGHT", namePopup, "TOPRIGHT", -14, -28)
|
|
||||||
namePopup.selectedLabel:SetText(T["Currently Selected"] or "Currently Selected")
|
|
||||||
namePopup.selectedLabel:SetTextColor(1, 0.82, 0)
|
|
||||||
|
|
||||||
namePopup.selectedPreview = CreateFrame("Frame", nil, namePopup)
|
|
||||||
namePopup.selectedPreview:SetWidth(42)
|
|
||||||
namePopup.selectedPreview:SetHeight(42)
|
|
||||||
namePopup.selectedPreview:SetPoint("TOPRIGHT", namePopup, "TOPRIGHT", -14, -44)
|
|
||||||
CreateBackdrop(namePopup.selectedPreview)
|
|
||||||
namePopup.selectedPreview.tex = namePopup.selectedPreview:CreateTexture(nil, "ARTWORK")
|
|
||||||
namePopup.selectedPreview.tex:SetAllPoints(namePopup.selectedPreview)
|
|
||||||
namePopup.selectedPreview.tex:SetTexCoord(.08, .92, .08, .92)
|
|
||||||
|
|
||||||
namePopup.iconLabel = namePopup:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
|
||||||
namePopup.iconLabel:SetPoint("TOPLEFT", namePopup, "TOPLEFT", 14, -100)
|
|
||||||
namePopup.iconLabel:SetText(T["Choose an Icon:"] or "Choose an Icon:")
|
|
||||||
|
|
||||||
-- Icon picker: 10×8 grid of buttons + scroll
|
|
||||||
local ICON_GRID_COLS = 10
|
|
||||||
local ICON_GRID_ROWS = 8
|
|
||||||
local ICON_BTN_SIZE = 36
|
|
||||||
local ICON_BTN_PAD = 6
|
|
||||||
|
|
||||||
local iconScroll = CreateFrame("ScrollFrame", "pfEqMgrIconScroll", namePopup, "FauxScrollFrameTemplate")
|
|
||||||
iconScroll:SetPoint("TOPLEFT", namePopup, "TOPLEFT", 14, -130)
|
|
||||||
iconScroll:SetWidth(ICON_GRID_COLS * (ICON_BTN_SIZE + ICON_BTN_PAD) - ICON_BTN_PAD)
|
|
||||||
iconScroll:SetHeight(ICON_GRID_ROWS * (ICON_BTN_SIZE + ICON_BTN_PAD) - ICON_BTN_PAD)
|
|
||||||
|
|
||||||
-- IconDataProviderMixin owns the icon DB, dedup, and lazy load.
|
|
||||||
-- Init on first picker open; release on hide so the cache GCs.
|
|
||||||
local provider = nil
|
|
||||||
-- Selection is tracked by PATH (not index) so it survives filter
|
|
||||||
-- changes: a spell icon you picked still saves correctly even after
|
|
||||||
-- you switch the filter to "Items" and it's no longer in the visible list.
|
|
||||||
local QUESTION_MARK = "INTERFACE\\ICONS\\INV_MISC_QUESTIONMARK"
|
|
||||||
local selectedIconPath = QUESTION_MARK
|
|
||||||
|
|
||||||
local function EnsureProvider()
|
|
||||||
if not provider then
|
|
||||||
provider = CreateAndInitFromMixin(IconDataProviderMixin,
|
|
||||||
IconDataProviderExtraType.Equipment)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Anchor scrollbar to iconScroll's right edge so its position tracks
|
|
||||||
-- the icon grid rather than the popup. -16/+16 vertical insets are the
|
|
||||||
-- standard up/down arrow spacing for UIPanelScrollBarTemplate.
|
|
||||||
local scrollbar = _G["pfEqMgrIconScrollScrollBar"]
|
|
||||||
if scrollbar then
|
|
||||||
scrollbar:ClearAllPoints()
|
|
||||||
scrollbar:SetPoint("TOPLEFT", iconScroll, "TOPRIGHT", 8, -16)
|
|
||||||
scrollbar:SetPoint("BOTTOMLEFT", iconScroll, "BOTTOMRIGHT", 8, 16)
|
|
||||||
SkinScrollbar(scrollbar)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Filter dropdown: "All Icons" / "Spells" / "Items" (top right of icon area).
|
|
||||||
local filterDropdown = CreateFrame("Frame", "pfEqMgrIconFilter", namePopup, "UIDropDownMenuTemplate")
|
|
||||||
filterDropdown:SetPoint("TOPRIGHT", namePopup, "TOPRIGHT", 0, -94)
|
|
||||||
local currentFilter = "all"
|
|
||||||
local function ApplyFilter(value)
|
|
||||||
currentFilter = value
|
|
||||||
UIDropDownMenu_SetSelectedValue(filterDropdown, value)
|
|
||||||
if provider then
|
|
||||||
if value == "spells" then provider:SetIconTypes({ IconDataProviderIconType.Spell })
|
|
||||||
elseif value == "items" then provider:SetIconTypes({ IconDataProviderIconType.Item })
|
|
||||||
else provider:SetIconTypes(nil) end
|
|
||||||
-- Don't reset selection — selectedIconPath persists. If the
|
|
||||||
-- selected icon isn't in the new filter, no grid entry will be
|
|
||||||
-- highlighted but Save will still write the chosen icon.
|
|
||||||
pfUI.equipmentmanager.RefreshIconGrid()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
UIDropDownMenu_Initialize(filterDropdown, function()
|
|
||||||
local info
|
|
||||||
info = {}; info.text = T["All Icons"] or "All Icons"; info.value = "all"
|
|
||||||
info.func = function() ApplyFilter("all") end
|
|
||||||
info.checked = currentFilter == "all"
|
|
||||||
UIDropDownMenu_AddButton(info)
|
|
||||||
info = {}; info.text = T["Spells"] or "Spells"; info.value = "spells"
|
|
||||||
info.func = function() ApplyFilter("spells") end
|
|
||||||
info.checked = currentFilter == "spells"
|
|
||||||
UIDropDownMenu_AddButton(info)
|
|
||||||
info = {}; info.text = T["Items"] or "Items"; info.value = "items"
|
|
||||||
info.func = function() ApplyFilter("items") end
|
|
||||||
info.checked = currentFilter == "items"
|
|
||||||
UIDropDownMenu_AddButton(info)
|
|
||||||
end)
|
|
||||||
UIDropDownMenu_SetWidth(120, filterDropdown)
|
|
||||||
UIDropDownMenu_SetSelectedValue(filterDropdown, "all")
|
|
||||||
SkinDropDown(filterDropdown)
|
|
||||||
|
|
||||||
local iconButtons = {}
|
|
||||||
for r = 1, ICON_GRID_ROWS do
|
|
||||||
for c = 1, ICON_GRID_COLS do
|
|
||||||
local i = (r - 1) * ICON_GRID_COLS + c
|
|
||||||
local btn = CreateFrame("Button", nil, namePopup)
|
|
||||||
btn:SetWidth(ICON_BTN_SIZE)
|
|
||||||
btn:SetHeight(ICON_BTN_SIZE)
|
|
||||||
btn:SetPoint("TOPLEFT", iconScroll, "TOPLEFT", (c-1) * (ICON_BTN_SIZE + ICON_BTN_PAD), -(r-1) * (ICON_BTN_SIZE + ICON_BTN_PAD))
|
|
||||||
CreateBackdrop(btn)
|
|
||||||
btn.texture = btn:CreateTexture(nil, "ARTWORK")
|
|
||||||
btn.texture:SetAllPoints(btn)
|
|
||||||
btn.texture:SetTexCoord(.08, .92, .08, .92)
|
|
||||||
btn.gridIndex = i
|
|
||||||
btn:SetScript("OnClick", function()
|
|
||||||
if this.iconIndex and provider then
|
|
||||||
local path = provider:GetIconByIndex(this.iconIndex)
|
|
||||||
if path then selectedIconPath = path end
|
|
||||||
pfUI.equipmentmanager.RefreshIconGrid()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
btn:SetScript("OnEnter", function()
|
|
||||||
if not this.iconIndex or not provider then return end
|
|
||||||
local path = provider:GetIconByIndex(this.iconIndex)
|
|
||||||
if type(path) == "string" then
|
|
||||||
local name = string.gsub(path, "^.-INTERFACE\\\\ICONS\\\\", "")
|
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
||||||
GameTooltip:SetText(name)
|
|
||||||
GameTooltip:Show()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
btn:SetScript("OnLeave", GameTooltip_Hide)
|
|
||||||
iconButtons[i] = btn
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function pfUI.equipmentmanager.RefreshIconGrid()
|
|
||||||
EnsureProvider()
|
|
||||||
local numIcons = provider:GetNumIcons()
|
|
||||||
local numRows = math.ceil(numIcons / ICON_GRID_COLS)
|
|
||||||
FauxScrollFrame_Update(iconScroll, numRows, ICON_GRID_ROWS, ICON_BTN_SIZE + ICON_BTN_PAD)
|
|
||||||
local offset = FauxScrollFrame_GetOffset(iconScroll)
|
|
||||||
for i = 1, ICON_GRID_ROWS * ICON_GRID_COLS do
|
|
||||||
local listIdx = i + offset * ICON_GRID_COLS
|
|
||||||
local btn = iconButtons[i]
|
|
||||||
if listIdx <= numIcons then
|
|
||||||
btn:Show()
|
|
||||||
btn.iconIndex = listIdx
|
|
||||||
local path = provider:GetIconByIndex(listIdx)
|
|
||||||
btn.texture:SetTexture(path)
|
|
||||||
if path == selectedIconPath then
|
|
||||||
btn.backdrop:SetBackdropBorderColor(1, 0.82, 0, 1)
|
|
||||||
else
|
|
||||||
btn.backdrop:SetBackdropBorderColor(pfUI.cache.er, pfUI.cache.eg, pfUI.cache.eb, pfUI.cache.ea)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
btn:Hide()
|
|
||||||
btn.iconIndex = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- Sync the "Currently Selected" preview from the path directly so it
|
|
||||||
-- still shows the chosen icon when filtered out of the grid.
|
|
||||||
namePopup.selectedPreview.tex:SetTexture(selectedIconPath)
|
|
||||||
end
|
|
||||||
|
|
||||||
iconScroll:SetScript("OnVerticalScroll", function()
|
|
||||||
FauxScrollFrame_OnVerticalScroll(ICON_BTN_SIZE + ICON_BTN_PAD, function() pfUI.equipmentmanager.RefreshIconGrid() end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
namePopup:SetScript("OnHide", function()
|
|
||||||
if provider then provider:Release(); provider = nil end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local btnPopupOK = MakeButton("pfEqMgrPopupOK", T["OK"] or "OK", namePopup, namePopup, 14, -340, 80)
|
|
||||||
btnPopupOK:ClearAllPoints()
|
|
||||||
btnPopupOK:SetPoint("BOTTOMLEFT", namePopup, "BOTTOMLEFT", 14, 12)
|
|
||||||
|
|
||||||
local btnPopupCancel = MakeButton("pfEqMgrPopupCancel", T["Cancel"] or "Cancel", namePopup, namePopup, 0, 0, 80)
|
|
||||||
btnPopupCancel:ClearAllPoints()
|
btnPopupCancel:ClearAllPoints()
|
||||||
btnPopupCancel:SetPoint("BOTTOMRIGHT", namePopup, "BOTTOMRIGHT", -14, 12)
|
btnPopupCancel:SetPoint("BOTTOMRIGHT", namePopup, "BOTTOMRIGHT", -14, 12)
|
||||||
btnPopupCancel:SetScript("OnClick", function() namePopup:Hide() end)
|
btnPopupCancel:SetScript("OnClick", function() namePopup:Hide() end)
|
||||||
|
|
||||||
|
-- Okay | Cancel, both anchored to the bottom-right corner.
|
||||||
|
btnPopupOK:ClearAllPoints()
|
||||||
|
btnPopupOK:SetPoint("BOTTOMRIGHT", btnPopupCancel, "BOTTOMLEFT", -6, 0)
|
||||||
|
|
||||||
btnPopupOK:SetScript("OnClick", function()
|
btnPopupOK:SetScript("OnClick", function()
|
||||||
local name = namePopup.editbox:GetText()
|
local name = namePopup.editbox:GetText()
|
||||||
if not name or name == "" then return end
|
if not name or name == "" then return end
|
||||||
-- Strip the prefix to match ClassicAPI's persisted short-form basenames.
|
-- Strip the prefix to match ClassicAPI's persisted short-form basenames.
|
||||||
local iconForSave = string.gsub(selectedIconPath, "INTERFACE\\ICONS\\", "")
|
local iconForSave = string.gsub(iconPicker.GetIcon(), "INTERFACE\\ICONS\\", "")
|
||||||
if pendingAction == "new" then
|
if pendingAction == "new" then
|
||||||
C_EquipmentSet.CreateEquipmentSet(name, iconForSave)
|
C_EquipmentSet.CreateEquipmentSet(name, iconForSave)
|
||||||
C_EquipmentSet.ClearIgnoredSlotsForSave()
|
C_EquipmentSet.ClearIgnoredSlotsForSave()
|
||||||
@@ -610,31 +431,20 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
function OpenNamePopup(action, prefillName, prefillIcon)
|
function OpenNamePopup(action, prefillName, prefillIcon)
|
||||||
pendingAction = action
|
pendingAction = action
|
||||||
namePopup.editbox:SetText(prefillName or "")
|
namePopup.editbox:SetText(prefillName or "")
|
||||||
EnsureProvider()
|
|
||||||
if prefillIcon then
|
if prefillIcon then
|
||||||
local short = string.gsub(prefillIcon, "INTERFACE\\ICONS\\", "")
|
-- Stored icons come back either as a full path or a bare basename
|
||||||
selectedIconPath = "INTERFACE\\ICONS\\" .. strupper(short)
|
-- (see the row rendering in Refresh). Only prepend the prefix when
|
||||||
|
-- there's no path separator, so a full path isn't double-prefixed.
|
||||||
|
iconPicker.SetIcon(string.find(prefillIcon, "\\") and prefillIcon
|
||||||
|
or ("INTERFACE\\ICONS\\" .. prefillIcon))
|
||||||
else
|
else
|
||||||
selectedIconPath = QUESTION_MARK
|
iconPicker.SetIcon(nil)
|
||||||
end
|
|
||||||
if action == "rename" then
|
|
||||||
namePopup.title:SetText(T["Rename Set"] or "Rename Set")
|
|
||||||
iconScroll:Hide()
|
|
||||||
for _, b in ipairs(iconButtons) do b:Hide() end
|
|
||||||
namePopup.iconLabel:Hide()
|
|
||||||
namePopup.selectedLabel:Hide()
|
|
||||||
namePopup.selectedPreview:Hide()
|
|
||||||
filterDropdown:Hide()
|
|
||||||
else
|
|
||||||
namePopup.title:SetText(action == "new" and (T["Name Set"] or "Name Set") or (T["Save Set"] or "Save Set"))
|
|
||||||
iconScroll:Show()
|
|
||||||
namePopup.iconLabel:Show()
|
|
||||||
namePopup.selectedLabel:Show()
|
|
||||||
namePopup.selectedPreview:Show()
|
|
||||||
filterDropdown:Show()
|
|
||||||
end
|
end
|
||||||
|
namePopup.search:SetText("")
|
||||||
|
-- Rename only changes the name, so hide the whole icon-picking area.
|
||||||
|
iconPicker.SetIconAreaShown(action ~= "rename")
|
||||||
namePopup:Show()
|
namePopup:Show()
|
||||||
if action ~= "rename" then pfUI.equipmentmanager.RefreshIconGrid() end
|
if action ~= "rename" then iconPicker.Refresh() end
|
||||||
namePopup.editbox:SetFocus()
|
namePopup.editbox:SetFocus()
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -643,9 +453,13 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
-- ============================================================
|
-- ============================================================
|
||||||
|
|
||||||
local flyout = CreateFrame("Frame", "pfEqMgrFlyout", UIParent)
|
local flyout = CreateFrame("Frame", "pfEqMgrFlyout", UIParent)
|
||||||
|
-- The name/icon popup is sidecar-only, so it closes with the sidecar.
|
||||||
|
-- Popout arrows and the flyout are reconciled by UpdatePopouts: by
|
||||||
|
-- default they follow the sidecar, but with the "Always Show Equipment
|
||||||
|
-- Slot Flyouts" option they stay while the paperdoll is open.
|
||||||
frame:SetScript("OnHide", function()
|
frame:SetScript("OnHide", function()
|
||||||
for _, b in ipairs(popoutButtons) do b:Hide() end
|
namePopup:Hide()
|
||||||
flyout:Hide()
|
UpdatePopouts()
|
||||||
end)
|
end)
|
||||||
flyout:SetFrameStrata("DIALOG")
|
flyout:SetFrameStrata("DIALOG")
|
||||||
flyout:Hide()
|
flyout:Hide()
|
||||||
@@ -676,7 +490,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
ClearCursor()
|
ClearCursor()
|
||||||
UIErrorsFrame:AddMessage(EQUIPMENT_MANAGER_BAGS_FULL or "Your bags are full.", 1, .1, .1, 1)
|
UIErrorsFrame:AddMessage(ERR_EQUIPMENT_MANAGER_BAGS_FULL, 1, .1, .1, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function MakeFlyoutButton(i)
|
local function MakeFlyoutButton(i)
|
||||||
@@ -692,11 +506,11 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
b:SetScript("OnEnter", function()
|
b:SetScript("OnEnter", function()
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
||||||
if this.specialAction == "placeInBags" then
|
if this.specialAction == "placeInBags" then
|
||||||
GameTooltip:SetText(EQUIPMENT_MANAGER_PLACE_IN_BAGS or "Place in Bags", 1, 1, 1)
|
GameTooltip:SetText(EQUIPMENT_MANAGER_PLACE_IN_BAGS, 1, 1, 1)
|
||||||
elseif this.specialAction == "ignore" then
|
elseif this.specialAction == "ignore" then
|
||||||
GameTooltip:SetText(EQUIPMENT_MANAGER_IGNORE_SLOT or "Ignore this slot", 1, 1, 1)
|
GameTooltip:SetText(EQUIPMENT_MANAGER_IGNORE_SLOT, 1, 1, 1)
|
||||||
elseif this.specialAction == "unignore" then
|
elseif this.specialAction == "unignore" then
|
||||||
GameTooltip:SetText(EQUIPMENT_MANAGER_UNIGNORE_SLOT or "Stop ignoring this slot", 1, 1, 1)
|
GameTooltip:SetText(EQUIPMENT_MANAGER_UNIGNORE_SLOT, 1, 1, 1)
|
||||||
elseif this.bag then
|
elseif this.bag then
|
||||||
GameTooltip:SetBagItem(this.bag, this.slot)
|
GameTooltip:SetBagItem(this.bag, this.slot)
|
||||||
elseif this.invSlot then
|
elseif this.invSlot then
|
||||||
@@ -704,7 +518,7 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
end
|
end
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end)
|
end)
|
||||||
b:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
b:SetScript("OnLeave", GameTooltip_Hide)
|
||||||
b:SetScript("OnClick", function()
|
b:SetScript("OnClick", function()
|
||||||
if this.specialAction == "placeInBags" then
|
if this.specialAction == "placeInBags" then
|
||||||
UnequipToBags(flyout.targetInvSlot)
|
UnequipToBags(flyout.targetInvSlot)
|
||||||
@@ -809,7 +623,6 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
|
|
||||||
if num == 0 then
|
if num == 0 then
|
||||||
flyout:Hide()
|
flyout:Hide()
|
||||||
UIErrorsFrame:AddMessage(T["No matching items in bags"] or "No matching items in bags", 1, 1, 0, 1)
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -938,15 +751,26 @@ pfUI:RegisterModule("equipmentmanager", function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Tie popout visibility to the EM sidecar. They appear when the
|
-- Popout arrows follow the EM sidecar by default. With the
|
||||||
-- sidecar opens, hide when it closes, and the flyout closes too.
|
-- "Always Show Equipment Slot Flyouts" option they follow the paperdoll
|
||||||
frame:HookScript("OnShow", function()
|
-- instead, so gear can be swapped without opening the equipment manager.
|
||||||
for _, b in ipairs(popoutButtons) do b:Show() end
|
local function PopoutsActive()
|
||||||
end)
|
if C.character.inventory.equipflyout == "1" then
|
||||||
frame:HookScript("OnHide", function()
|
return PaperDollFrame:IsShown()
|
||||||
for _, b in ipairs(popoutButtons) do b:Hide() end
|
end
|
||||||
if flyout then flyout:Hide() end
|
return frame:IsShown()
|
||||||
end)
|
end
|
||||||
|
|
||||||
|
function UpdatePopouts()
|
||||||
|
local show = PopoutsActive()
|
||||||
|
for _, b in ipairs(popoutButtons) do
|
||||||
|
if show then b:Show() else b:Hide() end
|
||||||
|
end
|
||||||
|
if not show then flyout:Hide() end
|
||||||
|
end
|
||||||
|
|
||||||
|
PaperDollFrame:HookScript("OnShow", UpdatePopouts)
|
||||||
|
PaperDollFrame:HookScript("OnHide", UpdatePopouts)
|
||||||
|
|
||||||
-- ============================================================
|
-- ============================================================
|
||||||
-- Refresh
|
-- Refresh
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -42,8 +41,9 @@ pfUI:RegisterModule("farmmode", function ()
|
|||||||
pfUI.farmmap:RegisterForDrag("LeftButton")
|
pfUI.farmmap:RegisterForDrag("LeftButton")
|
||||||
pfUI.farmmap:SetScript("OnMouseWheel", function()
|
pfUI.farmmap:SetScript("OnMouseWheel", function()
|
||||||
if IsControlKeyDown() then
|
if IsControlKeyDown() then
|
||||||
this:SetWidth(this:GetWidth() + (arg1 > 0 and 10 or -10))
|
local adjust = (arg1 > 0 and 10 or -10)
|
||||||
this:SetHeight(this:GetHeight() + (arg1 > 0 and 10 or -10))
|
local width, height = this:GetSize()
|
||||||
|
this:SetSize(width + adjust, height + adjust)
|
||||||
Minimap_ZoomIn()
|
Minimap_ZoomIn()
|
||||||
Minimap_ZoomOut()
|
Minimap_ZoomOut()
|
||||||
elseif IsShiftKeyDown() then
|
elseif IsShiftKeyDown() then
|
||||||
@@ -136,7 +136,7 @@ pfUI:RegisterModule("farmmode", function ()
|
|||||||
pfUI.farmmap.button.txt = pfUI.farmmap.button:CreateFontString("pfFarmMapText", "LOW", "GameFontWhite")
|
pfUI.farmmap.button.txt = pfUI.farmmap.button:CreateFontString("pfFarmMapText", "LOW", "GameFontWhite")
|
||||||
pfUI.farmmap.button.txt:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
pfUI.farmmap.button.txt:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
pfUI.farmmap.button.txt:SetPoint("CENTER", 0, 0)
|
pfUI.farmmap.button.txt:SetPoint("CENTER", 0, 0)
|
||||||
pfUI.farmmap.button.txt:SetText("|cff33ffcc FARM MODE")
|
pfUI.farmmap.button.txt:SetText("|cff33ffcc " .. T["FARM MODE"])
|
||||||
end
|
end
|
||||||
|
|
||||||
CreateBackdrop(pfUI.farmmap)
|
CreateBackdrop(pfUI.farmmap)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
pfUI:RegisterModule("feigndeath", function ()
|
pfUI:RegisterModule("feigndeath", function ()
|
||||||
local oldUnitHealth = UnitHealth
|
local oldUnitHealth = _G.UnitHealth
|
||||||
function UnitHealth(unit)
|
_G.UnitHealth = function(unit)
|
||||||
if UnitIsFeignDeath(unit) then
|
if UnitIsFeignDeath(unit) then
|
||||||
local hp = GetUnitField(unit, "health")
|
local hp = GetUnitField(unit, "health")
|
||||||
if hp and hp > 0 then return hp end
|
if hp and hp > 0 then return hp end
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinCheckbox(f.checkbox, 18)
|
SkinCheckbox(f.checkbox, 18)
|
||||||
|
|
||||||
f.NextScript = function()
|
f.NextScript = function()
|
||||||
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") end
|
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") return end
|
||||||
pfUI.chat.SetupRightChat(f.checkbox:GetChecked())
|
pfUI.chat.SetupRightChat(f.checkbox:GetChecked())
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinCheckbox(f.checkbox, 18)
|
SkinCheckbox(f.checkbox, 18)
|
||||||
|
|
||||||
f.NextScript = function()
|
f.NextScript = function()
|
||||||
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") end
|
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") return end
|
||||||
if f.checkbox:GetChecked() then
|
if f.checkbox:GetChecked() then
|
||||||
pfUI.chat.SetupPositions()
|
pfUI.chat.SetupPositions()
|
||||||
end
|
end
|
||||||
@@ -305,7 +305,7 @@ pfUI:RegisterModule("firstrun", function ()
|
|||||||
SkinCheckbox(f.checkbox, 18)
|
SkinCheckbox(f.checkbox, 18)
|
||||||
|
|
||||||
f.NextScript = function()
|
f.NextScript = function()
|
||||||
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") end
|
if not pfUI.chat then message("Couldn't apply settings. Chat module is disabled.") return end
|
||||||
if f.checkbox:GetChecked() then
|
if f.checkbox:GetChecked() then
|
||||||
pfUI.chat.SetupChannels()
|
pfUI.chat.SetupChannels()
|
||||||
end
|
end
|
||||||
|
|||||||
+11
-12
@@ -2,20 +2,22 @@ pfUI:RegisterModule("focus", function ()
|
|||||||
-- do not go further on disabled UFs
|
-- do not go further on disabled UFs
|
||||||
if C.unitframes.disable == "1" then return end
|
if C.unitframes.disable == "1" then return end
|
||||||
|
|
||||||
pfUI.uf.focus = pfUI.uf:CreateUnitFrame("Focus", nil, C.unitframes.focus, .2)
|
pfUI.uf.focus = pfUI.uf:CreateUnitFrame("Focus", nil, C.unitframes.focus)
|
||||||
pfUI.uf.focus:UpdateFrameSize()
|
pfUI.uf.focus:UpdateFrameSize()
|
||||||
pfUI.uf.focus:SetPoint("BOTTOMLEFT", UIParent, "BOTTOM", 220, 220)
|
pfUI.uf.focus:SetPoint("BOTTOMLEFT", UIParent, "BOTTOM", 220, 220)
|
||||||
UpdateMovable(pfUI.uf.focus)
|
UpdateMovable(pfUI.uf.focus)
|
||||||
pfUI.uf.focus:Hide()
|
pfUI.uf.focus:Hide()
|
||||||
|
|
||||||
pfUI.uf.focustarget = pfUI.uf:CreateUnitFrame("FocusTarget", nil, C.unitframes.focustarget, .2)
|
pfUI.uf.focustarget = pfUI.uf:CreateUnitFrame("FocusTarget", nil, C.unitframes.focustarget)
|
||||||
pfUI.uf.focustarget:UpdateFrameSize()
|
pfUI.uf.focustarget:UpdateFrameSize()
|
||||||
pfUI.uf.focustarget:SetPoint("BOTTOMLEFT", pfUI.uf.focus, "TOP", 0, 10)
|
pfUI.uf.focustarget:SetPoint("BOTTOMLEFT", pfUI.uf.focus, "TOP", 0, 10)
|
||||||
UpdateMovable(pfUI.uf.focustarget)
|
UpdateMovable(pfUI.uf.focustarget)
|
||||||
pfUI.uf.focustarget:Hide()
|
pfUI.uf.focustarget:Hide()
|
||||||
|
|
||||||
-- PLAYER_FOCUS_CHANGED drives immediate refresh on focus assign / clear.
|
-- PLAYER_FOCUS_CHANGED drives immediate refresh on focus assign / clear.
|
||||||
-- The frame's 0.2s tick keeps health/power/aura data fresh between events.
|
-- Between events, ClassicAPI fires UNIT_* (health/mana/aura/...) with
|
||||||
|
-- arg1 == "focus" and arg1 == "focustarget", so both frames update
|
||||||
|
-- event-driven like target and need no polling tick.
|
||||||
local refresher = CreateFrame("Frame")
|
local refresher = CreateFrame("Frame")
|
||||||
refresher:RegisterEvent("PLAYER_FOCUS_CHANGED")
|
refresher:RegisterEvent("PLAYER_FOCUS_CHANGED")
|
||||||
refresher:SetScript("OnEvent", function()
|
refresher:SetScript("OnEvent", function()
|
||||||
@@ -30,8 +32,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 +62,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 +105,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 +117,4 @@ function SlashCmdList.PFSWAPFOCUS(msg)
|
|||||||
TargetUnit(oldFocusGUID)
|
TargetUnit(oldFocusGUID)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end, true)
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
-- Friend notes
|
||||||
|
-- Client-side notes for friends via ClassicAPI's C_FriendList note API
|
||||||
|
-- (SetFriendNotes / GetFriendInfo(.notes)). Adds an "Edit Note" entry to the
|
||||||
|
-- friend right-click menu (the "FRIEND" UnitPopup) and shows the note in a
|
||||||
|
-- tooltip when you hover a friend in the list.
|
||||||
|
pfUI:RegisterModule("friendnotes", function ()
|
||||||
|
local EDIT_TOKEN = "PFUI_FRIEND_NOTE"
|
||||||
|
|
||||||
|
-- Note editor. In 1.12 StaticPopup, OnAccept runs with `this` = the OK
|
||||||
|
-- button (the dialog is this:GetParent()); the friend name arrives as the
|
||||||
|
-- data argument passed to StaticPopup_Show.
|
||||||
|
StaticPopupDialogs["PFUI_FRIEND_NOTE_EDIT"] = {
|
||||||
|
text = SET_FRIENDNOTE_LABEL,
|
||||||
|
button1 = SAVE,
|
||||||
|
button2 = CANCEL,
|
||||||
|
hasEditBox = 1,
|
||||||
|
maxLetters = 128,
|
||||||
|
OnAccept = function(name)
|
||||||
|
C_FriendList.SetFriendNotes(name, _G[this:GetParent():GetName().."EditBox"]:GetText())
|
||||||
|
end,
|
||||||
|
EditBoxOnEnterPressed = function(name)
|
||||||
|
C_FriendList.SetFriendNotes(name, this:GetText())
|
||||||
|
this:GetParent():Hide()
|
||||||
|
end,
|
||||||
|
EditBoxOnEscapePressed = function() this:GetParent():Hide() end,
|
||||||
|
timeout = 0, whileDead = 1, hideOnEscape = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
local function OpenNoteEditor(name)
|
||||||
|
if not name or name == "" then return end
|
||||||
|
local info = C_FriendList.GetFriendInfo(name)
|
||||||
|
local dialog = StaticPopup_Show("PFUI_FRIEND_NOTE_EDIT", name, nil, name)
|
||||||
|
if not dialog then return end
|
||||||
|
local editbox = _G[dialog:GetName().."EditBox"]
|
||||||
|
editbox:SetText((info and info.notes) or "")
|
||||||
|
editbox:HighlightText()
|
||||||
|
editbox:SetFocus()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add "Edit Note" to the friend right-click menu, just before Cancel.
|
||||||
|
UnitPopupButtons[EDIT_TOKEN] = { text = SET_NOTE, dist = 0 }
|
||||||
|
local friendMenu = UnitPopupMenus["FRIEND"]
|
||||||
|
table.insert(friendMenu, table.getn(friendMenu), EDIT_TOKEN)
|
||||||
|
|
||||||
|
UnitPopupMenus["PFUI_FRIENDNOTE"] = { EDIT_TOKEN, "CANCEL" }
|
||||||
|
local function OfflineNoteDropDown_Initialize()
|
||||||
|
UnitPopup_ShowMenu(_G[UIDROPDOWNMENU_OPEN_MENU], "PFUI_FRIENDNOTE", nil, FriendsDropDown.name)
|
||||||
|
end
|
||||||
|
local FriendsFrame_ShowDropdown_orig = FriendsFrame_ShowDropdown
|
||||||
|
_G.FriendsFrame_ShowDropdown = function(name, connected)
|
||||||
|
if connected then return FriendsFrame_ShowDropdown_orig(name, connected) end
|
||||||
|
HideDropDownMenu(1)
|
||||||
|
FriendsDropDown.initialize = OfflineNoteDropDown_Initialize
|
||||||
|
FriendsDropDown.displayMode = "MENU"
|
||||||
|
FriendsDropDown.name = name
|
||||||
|
ToggleDropDownMenu(1, nil, FriendsDropDown, "cursor")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Route our entry to the editor and close the menu; delegate the rest. A
|
||||||
|
-- bare assignment lands on pfUI.env, so set the global explicitly.
|
||||||
|
local UnitPopup_OnClick_orig = UnitPopup_OnClick
|
||||||
|
_G.UnitPopup_OnClick = function()
|
||||||
|
if this and this.value == EDIT_TOKEN then
|
||||||
|
local dropdown = _G[UIDROPDOWNMENU_INIT_MENU]
|
||||||
|
local name = dropdown and dropdown.name
|
||||||
|
CloseDropDownMenus()
|
||||||
|
OpenNoteEditor(name)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return UnitPopup_OnClick_orig()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Show the note in a tooltip while hovering a friend in the list. Friend
|
||||||
|
-- buttons carry their friend index via SetID (see FriendsFrame_Update).
|
||||||
|
local function FriendButton_OnEnter()
|
||||||
|
local index = this:GetID()
|
||||||
|
if not index or index < 1 then return end
|
||||||
|
local info = C_FriendList.GetFriendInfoByIndex(index)
|
||||||
|
if not info or not info.notes or info.notes == "" then return end
|
||||||
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
||||||
|
GameTooltip:SetText(info.name or "")
|
||||||
|
GameTooltip:AddLine(info.notes, 1, 1, 1, 1)
|
||||||
|
GameTooltip:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1, FRIENDS_TO_DISPLAY do
|
||||||
|
local button = _G["FriendsFrameFriendButton"..i]
|
||||||
|
if button then
|
||||||
|
button:HookScript("OnEnter", FriendButton_OnEnter)
|
||||||
|
button:HookScript("OnLeave", GameTooltip_Hide)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
+36
-9
@@ -961,7 +961,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
"16:" .. T["Very Slow"],
|
"16:" .. T["Very Slow"],
|
||||||
},
|
},
|
||||||
["uf_rangecheck_mode"] = {
|
["uf_rangecheck_mode"] = {
|
||||||
"vanilla:" .. T["Vanilla (Spellbook)"],
|
"vanilla:" .. T["ClassicAPI (UnitInRange)"],
|
||||||
"unitxp:" .. T["UnitXP (Precise)"],
|
"unitxp:" .. T["UnitXP (Precise)"],
|
||||||
},
|
},
|
||||||
["uf_raidlayout"] = {
|
["uf_raidlayout"] = {
|
||||||
@@ -1068,6 +1068,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
"unitrev:" .. T["Unit String (Reverse)"],
|
"unitrev:" .. T["Unit String (Reverse)"],
|
||||||
"name:" .. T["Name"],
|
"name:" .. T["Name"],
|
||||||
"nameshort:" .. T["Name (Short)"],
|
"nameshort:" .. T["Name (Short)"],
|
||||||
|
"ownername:" .. T["Owner Name"],
|
||||||
"level:" .. T["Level"],
|
"level:" .. T["Level"],
|
||||||
"class:" .. T["Class"],
|
"class:" .. T["Class"],
|
||||||
"namehealth:" .. T["Name | Health Missing"],
|
"namehealth:" .. T["Name | Health Missing"],
|
||||||
@@ -2119,10 +2120,9 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Enable 40y-Range Check"], C.unitframes, "rangecheck", "checkbox", nil, nil, nil, nil)
|
CreateConfig(nil, T["Enable 40y-Range Check"], C.unitframes, "rangecheck", "checkbox", nil, nil, nil, nil)
|
||||||
CreateConfig(nil, T["Range Check Mode"], C.unitframes, "rangecheck_mode", "dropdown", pfUI.gui.dropdowns.uf_rangecheck_mode, nil, nil, nil)
|
CreateConfig(nil, T["Range Check Mode"], C.unitframes, "rangecheck_mode", "dropdown", pfUI.gui.dropdowns.uf_rangecheck_mode, nil, nil, nil)
|
||||||
CreateConfig(nil, T["UnitXP Range Threshold (yards)"], C.unitframes, "rangecheck_distance", nil, nil, nil, nil, nil)
|
CreateConfig(nil, T["UnitXP Range Threshold (yards)"], C.unitframes, "rangecheck_distance", nil, nil, nil, nil, nil)
|
||||||
CreateConfig(nil, T["Range Check Interval"], C.unitframes, "rangechecki", "dropdown", pfUI.gui.dropdowns.uf_rangecheckinterval, nil, nil, nil)
|
CreateConfig(nil, T["Show Self In Raid Frames When Solo"], C.unitframes, "selfinraid", "checkbox")
|
||||||
CreateConfig(nil, T["Use Raid Frames To Display Group Members"], C.unitframes, "raidforgroup", "checkbox")
|
|
||||||
CreateConfig(nil, T["Always Show Self In Raid Frames"], C.unitframes, "selfinraid", "checkbox")
|
|
||||||
CreateConfig(nil, T["Show Self In Group Frames"], C.unitframes, "selfingroup", "checkbox")
|
CreateConfig(nil, T["Show Self In Group Frames"], C.unitframes, "selfingroup", "checkbox")
|
||||||
|
CreateConfig(nil, T["Use Raid Frames To Display Group Members"], C.unitframes, "raidforgroup", "checkbox")
|
||||||
CreateConfig(nil, T["Hide Group Frames While In Raid"], C.unitframes.group, "hide_in_raid", "checkbox")
|
CreateConfig(nil, T["Hide Group Frames While In Raid"], C.unitframes.group, "hide_in_raid", "checkbox")
|
||||||
CreateConfig(nil, T["Max Amount Of Raid Frames"], C.unitframes, "maxraid", "dropdown", pfUI.gui.dropdowns.maxraid)
|
CreateConfig(nil, T["Max Amount Of Raid Frames"], C.unitframes, "maxraid", "dropdown", pfUI.gui.dropdowns.maxraid)
|
||||||
|
|
||||||
@@ -2143,6 +2143,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
|
|
||||||
CreateConfig(nil, T["Druid Settings"], nil, nil, "header")
|
CreateConfig(nil, T["Druid Settings"], nil, nil, "header")
|
||||||
CreateConfig(nil, T["Show Druid Mana Bar"], C.unitframes, "druidmanabar", "checkbox", nil, nil, nil, nil)
|
CreateConfig(nil, T["Show Druid Mana Bar"], C.unitframes, "druidmanabar", "checkbox", nil, nil, nil, nil)
|
||||||
|
CreateConfig(nil, T["Show Druid Mana Bar Text"], C.unitframes, "druidmanatext", "checkbox", nil, nil, nil, nil)
|
||||||
CreateConfig(nil, T["Druid Mana Bar Height"], C.unitframes, "druidmanaheight", nil, nil, nil, nil, nil)
|
CreateConfig(nil, T["Druid Mana Bar Height"], C.unitframes, "druidmanaheight", nil, nil, nil, nil, nil)
|
||||||
CreateConfig(nil, T["Druid Mana Bar Width (-1 = auto)"], C.unitframes, "druidmanawidth", nil, nil, nil, nil, nil)
|
CreateConfig(nil, T["Druid Mana Bar Width (-1 = auto)"], C.unitframes, "druidmanawidth", nil, nil, nil, nil, nil)
|
||||||
CreateConfig(nil, T["Druid Mana Bar X-Offset"], C.unitframes, "druidmanaoffx", nil, nil, nil, nil, nil)
|
CreateConfig(nil, T["Druid Mana Bar X-Offset"], C.unitframes, "druidmanaoffx", nil, nil, nil, nil, nil)
|
||||||
@@ -2185,6 +2186,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
[10] = { "grouptarget", T["Group-Target"]},
|
[10] = { "grouptarget", T["Group-Target"]},
|
||||||
[11] = { "grouppet", T["Group-Pet"] },
|
[11] = { "grouppet", T["Group-Pet"] },
|
||||||
[12] = { "raid", T["Raid"] },
|
[12] = { "raid", T["Raid"] },
|
||||||
|
[13] = { "raidpet", T["Raid-Pet"] },
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateGUIEntry(T["Unit Frames"], T["Click Casting"], function()
|
CreateGUIEntry(T["Unit Frames"], T["Click Casting"], function()
|
||||||
@@ -2234,10 +2236,10 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
U.ptarget = U["pettarget"]
|
U.ptarget = U["pettarget"]
|
||||||
U.grouptarget = U["group"]
|
U.grouptarget = U["group"]
|
||||||
U.grouppet = U["group"]
|
U.grouppet = U["group"]
|
||||||
|
U.raidpet = U["raid"]
|
||||||
|
|
||||||
-- build config entries
|
-- build config entries
|
||||||
CreateConfig(U[c], T["Display Frame"] .. ": " .. t, C.unitframes[c], "visible", "checkbox")
|
CreateConfig(U[c], T["Display Frame"] .. ": " .. t, C.unitframes[c], "visible", "checkbox")
|
||||||
CreateConfig(U[c], T["Enable Mouseover Tooltip"], C.unitframes[c], "showtooltip", "checkbox")
|
|
||||||
CreateConfig(U[c], T["Default Transparency"], C.unitframes[c], "alpha_visible", "dropdown", pfUI.gui.dropdowns.percent_small)
|
CreateConfig(U[c], T["Default Transparency"], C.unitframes[c], "alpha_visible", "dropdown", pfUI.gui.dropdowns.percent_small)
|
||||||
CreateConfig(U[c], T["Out Of Range Transparency"], C.unitframes[c], "alpha_outrange", "dropdown", pfUI.gui.dropdowns.percent_small)
|
CreateConfig(U[c], T["Out Of Range Transparency"], C.unitframes[c], "alpha_outrange", "dropdown", pfUI.gui.dropdowns.percent_small)
|
||||||
CreateConfig(U[c], T["Offline Transparency"], C.unitframes[c], "alpha_offline", "dropdown", pfUI.gui.dropdowns.percent_small)
|
CreateConfig(U[c], T["Offline Transparency"], C.unitframes[c], "alpha_offline", "dropdown", pfUI.gui.dropdowns.percent_small)
|
||||||
@@ -2278,6 +2280,13 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(U["raid"], T["Raid Padding"], C.unitframes[c], "raidpadding")
|
CreateConfig(U["raid"], T["Raid Padding"], C.unitframes[c], "raidpadding")
|
||||||
CreateConfig(U["raid"], T["Raid Layout"], C.unitframes[c], "raidlayout", "dropdown", pfUI.gui.dropdowns.uf_raidlayout)
|
CreateConfig(U["raid"], T["Raid Layout"], C.unitframes[c], "raidlayout", "dropdown", pfUI.gui.dropdowns.uf_raidlayout)
|
||||||
CreateConfig(U["raid"], T["Raid Fill Direction"], C.unitframes[c], "raidfill", "dropdown", pfUI.gui.dropdowns.orientation)
|
CreateConfig(U["raid"], T["Raid Fill Direction"], C.unitframes[c], "raidfill", "dropdown", pfUI.gui.dropdowns.orientation)
|
||||||
|
CreateConfig(U["raid"], T["Collapse Empty Slots"], C.unitframes[c], "collapse", "checkbox")
|
||||||
|
elseif c == "raidpet" then
|
||||||
|
CreateConfig(U[c], T["Layout"], nil, nil, "header")
|
||||||
|
CreateConfig(U["raid"], T["Raid Padding"], C.unitframes[c], "raidpadding")
|
||||||
|
CreateConfig(U["raid"], T["Raid Layout"], C.unitframes[c], "raidlayout", "dropdown", pfUI.gui.dropdowns.uf_raidlayout)
|
||||||
|
CreateConfig(U["raid"], T["Raid Fill Direction"], C.unitframes[c], "raidfill", "dropdown", pfUI.gui.dropdowns.orientation)
|
||||||
|
CreateConfig(U["raid"], T["Collapse Empty Slots"], C.unitframes[c], "collapse", "checkbox")
|
||||||
end
|
end
|
||||||
|
|
||||||
CreateConfig(U[c], T["Healthbar"], nil, nil, "header")
|
CreateConfig(U[c], T["Healthbar"], nil, nil, "header")
|
||||||
@@ -2402,6 +2411,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
|
|
||||||
CreateGUIEntry(T["Character"], T["Inventory"], function()
|
CreateGUIEntry(T["Character"], T["Inventory"], function()
|
||||||
CreateConfig(nil, T["Show Durability"], C.character.inventory, "durability", "checkbox")
|
CreateConfig(nil, T["Show Durability"], C.character.inventory, "durability", "checkbox")
|
||||||
|
CreateConfig(nil, T["Always Show Equipment Slot Flyouts"], C.character.inventory, "equipflyout", "checkbox")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
CreateGUIEntry(T["Character"], T["Reputation"], function()
|
CreateGUIEntry(T["Character"], T["Reputation"], function()
|
||||||
@@ -2413,6 +2423,8 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Enable Item Quality Color For Equipment Only"], C.appearance.bags, "borderonlygear", "checkbox")
|
CreateConfig(nil, T["Enable Item Quality Color For Equipment Only"], C.appearance.bags, "borderonlygear", "checkbox")
|
||||||
CreateConfig(nil, T["Highlight Unusable Items"], C.appearance.bags, "unusable", "checkbox")
|
CreateConfig(nil, T["Highlight Unusable Items"], C.appearance.bags, "unusable", "checkbox")
|
||||||
CreateConfig(nil, T["Unusable Item Color"], C.appearance.bags, "unusable_color", "color")
|
CreateConfig(nil, T["Unusable Item Color"], C.appearance.bags, "unusable_color", "color")
|
||||||
|
CreateConfig(nil, T["Highlight New Items"], C.appearance.bags, "newitem", "checkbox")
|
||||||
|
CreateConfig(nil, T["New Item Color"], C.appearance.bags, "newitem_color", "color")
|
||||||
CreateConfig(nil, T["Enable Movable Bags"], C.appearance.bags, "movable", "checkbox")
|
CreateConfig(nil, T["Enable Movable Bags"], C.appearance.bags, "movable", "checkbox")
|
||||||
CreateConfig(nil, T["Anchor Bags Above Chat"], C.appearance.bags, "abovechat", "checkbox")
|
CreateConfig(nil, T["Anchor Bags Above Chat"], C.appearance.bags, "abovechat", "checkbox")
|
||||||
CreateConfig(nil, T["Hide Chat When Bags Are Opened"], C.appearance.bags, "hidechat", "checkbox")
|
CreateConfig(nil, T["Hide Chat When Bags Are Opened"], C.appearance.bags, "hidechat", "checkbox")
|
||||||
@@ -2423,6 +2435,8 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Auto Sell Grey Items"], C.global, "autosell", "checkbox")
|
CreateConfig(nil, T["Auto Sell Grey Items"], C.global, "autosell", "checkbox")
|
||||||
CreateConfig(nil, T["Auto Repair Items"], C.global, "autorepair", "checkbox")
|
CreateConfig(nil, T["Auto Repair Items"], C.global, "autorepair", "checkbox")
|
||||||
CreateConfig(nil, T["Auto Sort When Opening Bags"], C.appearance.bags, "autoSortOnOpen", "checkbox")
|
CreateConfig(nil, T["Auto Sort When Opening Bags"], C.appearance.bags, "autoSortOnOpen", "checkbox")
|
||||||
|
CreateConfig(nil, T["Reverse Sort Direction (Last Bag First)"], C.appearance.bags, "sortreverse", "checkbox")
|
||||||
|
CreateConfig(nil, T["Reverse Sort Priority (Hearthstone Last)"], C.appearance.bags, "sortprioreverse", "checkbox")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
CreateGUIEntry(T["Loot"], nil, function()
|
CreateGUIEntry(T["Loot"], nil, function()
|
||||||
@@ -2573,6 +2587,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(U["bars"], T["Switch Pages On Shift Key Press"], C.bars, "pagemastershift", "checkbox")
|
CreateConfig(U["bars"], T["Switch Pages On Shift Key Press"], C.bars, "pagemastershift", "checkbox")
|
||||||
CreateConfig(U["bars"], T["Switch Pages On Ctrl Key Press"], C.bars, "pagemasterctrl", "checkbox")
|
CreateConfig(U["bars"], T["Switch Pages On Ctrl Key Press"], C.bars, "pagemasterctrl", "checkbox")
|
||||||
CreateConfig(U["bars"], T["Switch Pages On Druid Stealth"], C.bars, "druidstealth", "checkbox")
|
CreateConfig(U["bars"], T["Switch Pages On Druid Stealth"], C.bars, "druidstealth", "checkbox")
|
||||||
|
CreateConfig(U["bars"], T["Switch Pages On Priest Shadowform"], C.bars, "priestshadow", "checkbox")
|
||||||
CreateConfig(nil, T["Range Based Hunter Paging"], C.bars, "hunterbar", "checkbox", nil, nil, nil, nil)
|
CreateConfig(nil, T["Range Based Hunter Paging"], C.bars, "hunterbar", "checkbox", nil, nil, nil, nil)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -2748,21 +2763,32 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
CreateGUIEntry(T["Tooltip"], nil, function()
|
CreateGUIEntry(T["Tooltip"], nil, function()
|
||||||
|
CreateConfig(nil, T["General"], nil, nil, "header")
|
||||||
CreateConfig(nil, T["Tooltip Position"], C.tooltip, "position", "dropdown", pfUI.gui.dropdowns.tooltip_position)
|
CreateConfig(nil, T["Tooltip Position"], C.tooltip, "position", "dropdown", pfUI.gui.dropdowns.tooltip_position)
|
||||||
CreateConfig(nil, T["Tooltip Text Font"], C.tooltip, "font_tooltip", "dropdown", pfUI.gui.dropdowns.fonts)
|
CreateConfig(nil, T["Tooltip Text Font"], C.tooltip, "font_tooltip", "dropdown", pfUI.gui.dropdowns.fonts)
|
||||||
CreateConfig(nil, T["Tooltip Text Font Size"], C.tooltip, "font_tooltip_size")
|
CreateConfig(nil, T["Tooltip Text Font Size"], C.tooltip, "font_tooltip_size")
|
||||||
CreateConfig(nil, T["Cursor Tooltip Align"], C.tooltip, "cursoralign", "dropdown", pfUI.gui.dropdowns.tooltip_align)
|
CreateConfig(nil, T["Cursor Tooltip Align"], C.tooltip, "cursoralign", "dropdown", pfUI.gui.dropdowns.tooltip_align)
|
||||||
CreateConfig(nil, T["Cursor Tooltip Offset"], C.tooltip, "cursoroffset")
|
CreateConfig(nil, T["Cursor Tooltip Offset"], C.tooltip, "cursoroffset")
|
||||||
CreateConfig(nil, T["Enable Extended Guild Information"], C.tooltip, "extguild", "checkbox")
|
|
||||||
CreateConfig(nil, T["Always Show Health In Percent"], C.tooltip, "alwaysperc", "checkbox")
|
|
||||||
CreateConfig(nil, T["Show Item IDs"], C.tooltip, "itemid", "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["Items"], nil, nil, "header")
|
||||||
CreateConfig(nil, T["Always Show Item Comparison"], C.tooltip.compare, "showalways", "checkbox")
|
CreateConfig(nil, T["Always Show Item Comparison"], C.tooltip.compare, "showalways", "checkbox")
|
||||||
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")
|
||||||
|
CreateConfig(nil, T["Show Item IDs"], C.tooltip, "itemid", "checkbox")
|
||||||
|
|
||||||
|
CreateConfig(nil, T["Spells"], nil, nil, "header")
|
||||||
|
CreateConfig(nil, T["Show Aura Caster"], C.tooltip, "aurasource", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Spell IDs"], C.tooltip, "spellid", "checkbox")
|
||||||
|
|
||||||
|
CreateConfig(nil, T["Units"], nil, nil, "header")
|
||||||
|
CreateConfig(nil, T["Enable Extended Guild Information"], C.tooltip, "extguild", "checkbox")
|
||||||
|
CreateConfig(nil, T["Always Show Health In Percent"], C.tooltip, "alwaysperc", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Movement Speed"], C.tooltip, "movespeed", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Unit Buffs"], C.tooltip, "showbuffs", "checkbox")
|
||||||
|
CreateConfig(nil, T["Show Unit IDs"], C.tooltip, "unitid", "checkbox")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
CreateGUIEntry(T["Castbar"], T["General"], function()
|
CreateGUIEntry(T["Castbar"], T["General"], function()
|
||||||
@@ -2973,6 +2999,7 @@ pfUI:RegisterModule("gui", function ()
|
|||||||
CreateConfig(nil, T["Use Chat Colors for Meters"], C.thirdparty, "chatbg", "checkbox")
|
CreateConfig(nil, T["Use Chat Colors for Meters"], C.thirdparty, "chatbg", "checkbox")
|
||||||
CreateConfig(nil, "ShaguDPS (" .. T["Skin"] .. ")", C.thirdparty.shagudps, "skin", "checkbox")
|
CreateConfig(nil, "ShaguDPS (" .. T["Skin"] .. ")", C.thirdparty.shagudps, "skin", "checkbox")
|
||||||
CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox")
|
CreateConfig(nil, "ShaguDPS (" .. T["Dock"] .. ")", C.thirdparty.shagudps, "dock", "checkbox")
|
||||||
|
CreateConfig(nil, "GreedMeter (" .. T["Dock"] .. ")", C.thirdparty.greedmeter, "dock", "checkbox")
|
||||||
CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox")
|
CreateConfig(nil, "DPSMate (" .. T["Skin"] .. ")", C.thirdparty.dpsmate, "skin", "checkbox")
|
||||||
CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox")
|
CreateConfig(nil, "DPSMate (" .. T["Dock"] .. ")", C.thirdparty.dpsmate, "dock", "checkbox")
|
||||||
CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox")
|
CreateConfig(nil, "SWStats (" .. T["Skin"] .. ")", C.thirdparty.swstats, "skin", "checkbox")
|
||||||
|
|||||||
+34
-9
@@ -1,10 +1,8 @@
|
|||||||
pfUI:RegisterModule("hunterbar", function ()
|
pfUI:RegisterModule("hunterbar", function ()
|
||||||
local _,class = UnitClass("player")
|
if UnitClassBase("player") ~= "HUNTER" or C.bars.hunterbar == "0" then return end
|
||||||
if class ~= "HUNTER" or C.bars.hunterbar == "0" then return end
|
|
||||||
|
|
||||||
-- Wing Clip (any rank) and Arcane Shot (any rank) spell IDs.
|
-- Wing Clip (any rank) and Arcane Shot (any rank) spell IDs.
|
||||||
-- IsSpellInRange(spellId) works with any spell ID via Nampower,
|
-- C_Spell.IsSpellInRange works with any spell ID, no actionbar slot needed.
|
||||||
-- no actionbar slot needed.
|
|
||||||
local WINGCLIP_ID = 2974 -- melee range indicator (~5 yd)
|
local WINGCLIP_ID = 2974 -- melee range indicator (~5 yd)
|
||||||
local ARCANESHOT_ID = 3044 -- ranged range indicator (~35 yd)
|
local ARCANESHOT_ID = 3044 -- ranged range indicator (~35 yd)
|
||||||
|
|
||||||
@@ -12,22 +10,37 @@ pfUI:RegisterModule("hunterbar", function ()
|
|||||||
-- Only swap BACK to melee bar when Wing Clip is actually in range.
|
-- Only swap BACK to melee bar when Wing Clip is actually in range.
|
||||||
-- This prevents rapid bar-flipping in the transition zone.
|
-- This prevents rapid bar-flipping in the transition zone.
|
||||||
|
|
||||||
|
local THROTTLE = 0.02 -- seconds between range checks (was every frame)
|
||||||
|
|
||||||
pfUI.hunterbar = CreateFrame("Frame", "pfHunterBar", UIParent)
|
pfUI.hunterbar = CreateFrame("Frame", "pfHunterBar", UIParent)
|
||||||
|
|
||||||
-- track which page we last forced so we don't spam ChangeActionBarPage()
|
-- track which page we last forced so we don't spam ChangeActionBarPage()
|
||||||
pfUI.hunterbar.lastPage = nil
|
pfUI.hunterbar.lastPage = nil
|
||||||
|
pfUI.hunterbar.elapsed = 0
|
||||||
|
|
||||||
|
-- Idle until there's a live, attackable target. A hidden frame runs no
|
||||||
|
-- OnUpdate, so the range polling only ticks while it can matter.
|
||||||
|
pfUI.hunterbar:Hide()
|
||||||
|
|
||||||
pfUI.hunterbar:SetScript("OnUpdate", function()
|
pfUI.hunterbar:SetScript("OnUpdate", function()
|
||||||
-- only act when there is a live, attackable target
|
this.elapsed = this.elapsed + arg1
|
||||||
|
if this.elapsed < THROTTLE then return end
|
||||||
|
this.elapsed = 0
|
||||||
|
|
||||||
|
-- Target died or turned unattackable without a target-change event
|
||||||
|
-- (it dropped to a corpse); stop ticking until the next target.
|
||||||
if not UnitExists("target") or not UnitCanAttack("player", "target") then
|
if not UnitExists("target") or not UnitCanAttack("player", "target") then
|
||||||
|
this:Hide()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local wingclipInRange = IsSpellInRange(WINGCLIP_ID, "target")
|
-- C_Spell.IsSpellInRange returns true / false / nil (rangeless). The
|
||||||
local arcaneshotInRange = IsSpellInRange(ARCANESHOT_ID, "target")
|
-- explicit == true / == false tests leave the bar unchanged on nil.
|
||||||
|
local wingclipInRange = C_Spell.IsSpellInRange(WINGCLIP_ID, "target")
|
||||||
|
local arcaneshotInRange = C_Spell.IsSpellInRange(ARCANESHOT_ID, "target")
|
||||||
|
|
||||||
-- swap to ranged bar: out of melee range AND arcane shot (8yd) in range
|
-- swap to ranged bar: out of melee range AND arcane shot (8yd) in range
|
||||||
if wingclipInRange == 0 and arcaneshotInRange == 1 then
|
if wingclipInRange == false and arcaneshotInRange == true then
|
||||||
if this.lastPage ~= 2 then
|
if this.lastPage ~= 2 then
|
||||||
this.lastPage = 2
|
this.lastPage = 2
|
||||||
_G.CURRENT_ACTIONBAR_PAGE = 2
|
_G.CURRENT_ACTIONBAR_PAGE = 2
|
||||||
@@ -35,7 +48,7 @@ pfUI:RegisterModule("hunterbar", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- swap to melee bar: in melee range AND arcane shot (8yd) out of range
|
-- swap to melee bar: in melee range AND arcane shot (8yd) out of range
|
||||||
elseif wingclipInRange == 1 and arcaneshotInRange == 0 then
|
elseif wingclipInRange == true and arcaneshotInRange == false then
|
||||||
if this.lastPage ~= 1 then
|
if this.lastPage ~= 1 then
|
||||||
this.lastPage = 1
|
this.lastPage = 1
|
||||||
_G.CURRENT_ACTIONBAR_PAGE = 1
|
_G.CURRENT_ACTIONBAR_PAGE = 1
|
||||||
@@ -43,4 +56,16 @@ pfUI:RegisterModule("hunterbar", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- Start ticking only when we gain an attackable target.
|
||||||
|
pfUI.hunterbar:RegisterEvent("PLAYER_TARGET_CHANGED")
|
||||||
|
pfUI.hunterbar:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
pfUI.hunterbar:SetScript("OnEvent", function()
|
||||||
|
if UnitExists("target") and UnitCanAttack("player", "target") then
|
||||||
|
this.elapsed = THROTTLE -- run the first check on the next frame
|
||||||
|
this:Show()
|
||||||
|
else
|
||||||
|
this:Hide()
|
||||||
|
end
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
@@ -7,8 +7,7 @@ pfUI:RegisterModule("innervatecall", function ()
|
|||||||
if not GetNampowerVersion then return end
|
if not GetNampowerVersion then return end
|
||||||
|
|
||||||
-- Only load for druids
|
-- Only load for druids
|
||||||
local _, playerClass = UnitClass("player")
|
if UnitClassBase("player") ~= "DRUID" then return end
|
||||||
if playerClass ~= "DRUID" then return end
|
|
||||||
|
|
||||||
local INNERVATE_SPELLID = 29166
|
local INNERVATE_SPELLID = 29166
|
||||||
|
|
||||||
@@ -76,14 +75,14 @@ pfUI:RegisterModule("innervatecall", function ()
|
|||||||
|
|
||||||
SendChatMessage(">> Innervate casted on " .. targetName .. " <<", channel)
|
SendChatMessage(">> Innervate casted on " .. targetName .. " <<", channel)
|
||||||
|
|
||||||
-- Schedule "ready" announcement when cooldown expires
|
-- Schedule "ready" announcement when the cooldown expires. Read the
|
||||||
-- Use GetSpellIdCooldown for precise remaining time, fallback to 360s
|
-- precise remaining time from C_Spell.GetSpellCooldown (startTime and
|
||||||
|
-- duration are seconds from the GetTime epoch); fall back to 360s.
|
||||||
local cdRemaining = 360
|
local cdRemaining = 360
|
||||||
if GetSpellIdCooldown then
|
local cd = C_Spell.GetSpellCooldown(INNERVATE_SPELLID)
|
||||||
local cd = GetSpellIdCooldown(INNERVATE_SPELLID)
|
if cd and cd.duration and cd.duration > 0 then
|
||||||
if cd and cd.cooldownRemainingMs and cd.cooldownRemainingMs > 0 then
|
local remaining = cd.startTime + cd.duration - GetTime()
|
||||||
cdRemaining = cd.cooldownRemainingMs / 1000
|
if remaining > 0 then cdRemaining = remaining end
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
C_Timer.After(cdRemaining, function()
|
C_Timer.After(cdRemaining, function()
|
||||||
|
|||||||
@@ -26,10 +26,14 @@ pfUI:RegisterModule("itemcount", function ()
|
|||||||
if bank < 0 then bank = 0 end
|
if bank < 0 then bank = 0 end
|
||||||
|
|
||||||
frame:AddLine(" ")
|
frame:AddLine(" ")
|
||||||
if bags > 0 then frame:AddDoubleLine("Bags:", bags, 1, 1, 1, 1, 1, 1) end
|
if bags > 0 then frame:AddDoubleLine(T["Bags"] .. ":", bags, 1, 1, 1, 1, 1, 1) end
|
||||||
if bank > 0 then frame:AddDoubleLine("Bank:", bank, 1, 1, 1, 1, 1, 1) end
|
if bank > 0 then frame:AddDoubleLine(T["Bank"] .. ":", bank, 1, 1, 1, 1, 1, 1) end
|
||||||
if equipped > 0 then frame:AddDoubleLine("Equipped:", equipped, 1, 1, 1, 1, 1, 1) end
|
if equipped > 0 then frame:AddDoubleLine(T["Equipped"] .. ":", equipped, 1, 1, 1, 1, 1, 1) end
|
||||||
frame:AddDoubleLine("Total:", total, 1, 1, 1, 1, 1, 1)
|
|
||||||
|
local sources = (bags > 0 and 1 or 0) + (bank > 0 and 1 or 0) + (equipped > 0 and 1 or 0)
|
||||||
|
if sources > 1 then
|
||||||
|
frame:AddDoubleLine(T["Total"] .. ":", total, 1, 1, 1, 1, 1, 1)
|
||||||
|
end
|
||||||
frame:Show()
|
frame:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+7
-17
@@ -77,9 +77,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if pfUI.loot.my_index or pfUI.loot.disenchanter_index or pfUI.loot.banker_index then
|
if pfUI.loot.my_index or pfUI.loot.disenchanter_index or pfUI.loot.banker_index then
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Special Recipient"]
|
info.text = T["Special Recipient"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.textHeight = 12
|
info.textHeight = 12
|
||||||
info.hasArrow = 1
|
info.hasArrow = 1
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
@@ -158,9 +156,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if level == 1 then
|
if level == 1 then
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Random"]
|
info.text = T["Random"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFRANDOM"
|
info.value = "PFRANDOM"
|
||||||
info.textHeight = 12
|
info.textHeight = 12
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
@@ -170,9 +166,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
|
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Request Rolls"]
|
info.text = T["Request Rolls"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFROLLS"
|
info.value = "PFROLLS"
|
||||||
info.textHeight = 12
|
info.textHeight = 12
|
||||||
info.hasArrow = 1
|
info.hasArrow = 1
|
||||||
@@ -183,9 +177,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if UIDROPDOWNMENU_MENU_VALUE == "PFROLLS" then
|
if UIDROPDOWNMENU_MENU_VALUE == "PFROLLS" then
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Clear Rolls"]
|
info.text = T["Clear Rolls"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFCLEARROLLS"
|
info.value = "PFCLEARROLLS"
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
info.func = pfUI.loot.ClearRolls
|
info.func = pfUI.loot.ClearRolls
|
||||||
@@ -193,9 +185,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
|
|
||||||
info = wipe(info)
|
info = wipe(info)
|
||||||
info.text = T["Reroll Ties"]
|
info.text = T["Reroll Ties"]
|
||||||
info.textR = NORMAL_FONT_COLOR.r
|
info.textR, info.textG, info.textB = NORMAL_FONT_COLOR:GetRGB()
|
||||||
info.textG = NORMAL_FONT_COLOR.g
|
|
||||||
info.textB = NORMAL_FONT_COLOR.b
|
|
||||||
info.value = "PFTIEROLL"
|
info.value = "PFTIEROLL"
|
||||||
info.notCheckable = 1
|
info.notCheckable = 1
|
||||||
info.arg1 = pfUI.loot.rollers_sorted
|
info.arg1 = pfUI.loot.rollers_sorted
|
||||||
@@ -236,7 +226,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
if (candidate) then
|
if (candidate) then
|
||||||
index_to_name[i] = candidate
|
index_to_name[i] = candidate
|
||||||
name_to_index[candidate] = i
|
name_to_index[candidate] = i
|
||||||
randoms[table.getn(randoms)+1]=i
|
table.insert(randoms, i)
|
||||||
if candidate == pfUI.loot.me then
|
if candidate == pfUI.loot.me then
|
||||||
pfUI.loot.my_index = i
|
pfUI.loot.my_index = i
|
||||||
end
|
end
|
||||||
@@ -693,7 +683,7 @@ pfUI:RegisterModule("loot", function ()
|
|||||||
else -- not an eligible candidate for that item
|
else -- not an eligible candidate for that item
|
||||||
pfUI.loot.rollers[who] = {roll=tonumber(roll),value="disabled"}
|
pfUI.loot.rollers[who] = {roll=tonumber(roll),value="disabled"}
|
||||||
end
|
end
|
||||||
pfUI.loot.rollers_sorted[table.getn(pfUI.loot.rollers_sorted)+1]={who=who,roll=tonumber(roll),value=pfUI.loot.rollers[who].value}
|
table.insert(pfUI.loot.rollers_sorted, {who=who,roll=tonumber(roll),value=pfUI.loot.rollers[who].value})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.sort(pfUI.loot.rollers_sorted,function(a,b)
|
table.sort(pfUI.loot.rollers_sorted,function(a,b)
|
||||||
|
|||||||
+3
-11
@@ -1,4 +1,3 @@
|
|||||||
pfUI:RegisterNewModule("loothistory", "Loot History")
|
|
||||||
pfUI:RegisterModule("loothistory", function ()
|
pfUI:RegisterModule("loothistory", function ()
|
||||||
local rawborder, border = GetBorderSize()
|
local rawborder, border = GetBorderSize()
|
||||||
|
|
||||||
@@ -17,12 +16,6 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
local WINMARK = "Interface\\Buttons\\UI-CheckBox-Check"
|
local WINMARK = "Interface\\Buttons\\UI-CheckBox-Check"
|
||||||
local QUESTIONMARK = "Interface\\Icons\\INV_Misc_QuestionMark"
|
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.
|
-- Paint an item row's icon/name/quality from a loaded Item mixin.
|
||||||
local function RenderItemVisual(f, item)
|
local function RenderItemVisual(f, item)
|
||||||
local r, g, b = 1, 1, 1
|
local r, g, b = 1, 1, 1
|
||||||
@@ -278,7 +271,7 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
if wroll and wroll > 0 then f.winroll:SetText(wroll) else f.winroll:SetText("") end
|
if wroll and wroll > 0 then f.winroll:SetText(wroll) else f.winroll:SetText("") end
|
||||||
f.winroll:Show()
|
f.winroll:Show()
|
||||||
f.winname:SetText(wname or UNKNOWN)
|
f.winname:SetText(wname or UNKNOWN)
|
||||||
f.winname:SetTextColor(ClassColor(wclass))
|
f.winname:SetTextColor(PFUI_CLASS_COLORS[wclass]:GetRGB())
|
||||||
f.winname:Show()
|
f.winname:Show()
|
||||||
else
|
else
|
||||||
-- nobody won: everyone passed
|
-- nobody won: everyone passed
|
||||||
@@ -299,7 +292,7 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
|
|
||||||
local function RenderPlayerFrame(pf, name, class, rollType, roll, isWinner)
|
local function RenderPlayerFrame(pf, name, class, rollType, roll, isWinner)
|
||||||
pf.name:SetText(name or UNKNOWN)
|
pf.name:SetText(name or UNKNOWN)
|
||||||
pf.name:SetTextColor(ClassColor(class))
|
pf.name:SetTextColor(PFUI_CLASS_COLORS[class]:GetRGB())
|
||||||
|
|
||||||
pf.rollicon:SetTexture(ROLL_TEX[rollType] or ROLL_TEX[ROLL_PASS])
|
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 roll and roll > 0 then pf.rolltext:SetText(roll) else pf.rolltext:SetText("") end
|
||||||
@@ -385,6 +378,5 @@ pfUI:RegisterModule("loothistory", function ()
|
|||||||
pfUI.loothistory:SetShown(not pfUI.loothistory:IsShown())
|
pfUI.loothistory:SetShown(not pfUI.loothistory:IsShown())
|
||||||
end
|
end
|
||||||
|
|
||||||
_G.SLASH_PFLOOTHISTORY1, _G.SLASH_PFLOOTHISTORY2 = "/loothistory", "/pfloothistory"
|
pfUI.api.RegisterSlashCommand("PFLOOTHISTORY", { "/loothistory", "/pfloothistory" }, Toggle, true)
|
||||||
_G.SlashCmdList.PFLOOTHISTORY = Toggle
|
|
||||||
end)
|
end)
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
-- Macro icon picker
|
||||||
|
-- Replaces Blizzard's MacroPopupFrame (the "name + icon" dialog opened by the
|
||||||
|
-- New / Change-Icon buttons) with a pfUI-native picker driven by
|
||||||
|
-- IconDataProviderMixin, so the full spell + item + loose icon set is
|
||||||
|
-- available instead of the stock spell-only list. Saving goes through
|
||||||
|
-- C_Macro.CreateMacro / C_Macro.EditMacro, which take the icon as a texture
|
||||||
|
-- string -- so arbitrary icons (including index-less INV_* item icons) persist
|
||||||
|
-- on both the modern (Turtle/Octo) and stock-vanilla macro UIs. The surrounding
|
||||||
|
-- MacroFrame (list + body editor) is Blizzard's, already skinned elsewhere.
|
||||||
|
pfUI:RegisterModule("macroicons", function ()
|
||||||
|
HookAddonOrVariable("Blizzard_MacroUI", function()
|
||||||
|
-- ============================================================
|
||||||
|
-- Popup frame
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
local picker = CreateFrame("Frame", "pfMacroIconPicker", UIParent)
|
||||||
|
picker:SetFrameStrata("DIALOG")
|
||||||
|
picker:SetSize(472, 484)
|
||||||
|
-- Starts anchored to the right of the macro panel (re-anchored at open
|
||||||
|
-- once the skin's backdrop exists); dragging pins it in place after.
|
||||||
|
picker:SetPoint("BOTTOMLEFT", MacroFrame, "BOTTOMRIGHT", 8, 0)
|
||||||
|
picker:Hide()
|
||||||
|
CreateBackdrop(picker, nil, nil, .9)
|
||||||
|
CreateBackdropShadow(picker)
|
||||||
|
picker:EnableMouse(true)
|
||||||
|
picker:SetMovable(true)
|
||||||
|
picker:RegisterForDrag("LeftButton")
|
||||||
|
picker:SetScript("OnDragStart", function() this:StartMoving() end)
|
||||||
|
picker:SetScript("OnDragStop", function()
|
||||||
|
this:StopMovingOrSizing()
|
||||||
|
this.userMoved = true
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Spellbook seed leads the grid with class-relevant spell/talent icons.
|
||||||
|
local iconPicker = CreateIconPicker("pfMacroIcon", picker,
|
||||||
|
IconDataProviderExtraType.Spellbook, MACRO_POPUP_TEXT)
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- Open / save
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
-- Blizzard's popup disables these while it is open; mirror that so the
|
||||||
|
-- underlying frame can't be double-driven, then let MacroFrame_Update
|
||||||
|
-- restore the correct states on close.
|
||||||
|
local function SetMacroButtons(enabled)
|
||||||
|
local m = enabled and "Enable" or "Disable"
|
||||||
|
MacroNewButton[m](MacroNewButton)
|
||||||
|
MacroEditButton[m](MacroEditButton)
|
||||||
|
MacroDeleteButton[m](MacroDeleteButton)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OpenMacroPopup(mode)
|
||||||
|
if mode == "edit" and MacroFrame.selectedMacro then
|
||||||
|
picker.mode = "edit"
|
||||||
|
local name, texture = GetMacroInfo(MacroFrame.selectedMacro)
|
||||||
|
picker.editbox:SetText(name or "")
|
||||||
|
iconPicker.SetIcon(texture)
|
||||||
|
else
|
||||||
|
picker.mode = "new"
|
||||||
|
picker.editbox:SetText("")
|
||||||
|
iconPicker.SetIcon(nil)
|
||||||
|
end
|
||||||
|
picker.search:SetText("")
|
||||||
|
if not picker.userMoved then
|
||||||
|
picker:ClearAllPoints()
|
||||||
|
picker:SetPoint("BOTTOMLEFT", MacroFrame.backdrop or MacroFrame, "BOTTOMRIGHT", 8, 0)
|
||||||
|
end
|
||||||
|
SetMacroButtons(false)
|
||||||
|
picker:Show()
|
||||||
|
picker.editbox:SetFocus()
|
||||||
|
iconPicker.Refresh()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SaveMacroPopup()
|
||||||
|
local text = picker.editbox:GetText()
|
||||||
|
if text == "" then return end
|
||||||
|
|
||||||
|
local icon = iconPicker.GetIcon()
|
||||||
|
if picker.mode == "edit" and MacroFrame.selectedMacro then
|
||||||
|
C_Macro.EditMacro(MacroFrame.selectedMacro, text, icon, nil)
|
||||||
|
MacroFrame_SelectMacro(MacroFrame.selectedMacro)
|
||||||
|
else
|
||||||
|
local idx = C_Macro.CreateMacro(text, icon, nil, (MacroFrame.macroBase or 0) > 0)
|
||||||
|
if idx then MacroFrame_SelectMacro(idx) end
|
||||||
|
end
|
||||||
|
picker:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
picker:SetScript("OnHide", function() MacroFrame_Update() end)
|
||||||
|
|
||||||
|
picker.editbox:SetScript("OnEnterPressed", SaveMacroPopup)
|
||||||
|
picker.editbox:SetScript("OnEscapePressed", function() picker:Hide() end)
|
||||||
|
|
||||||
|
-- OK / Cancel
|
||||||
|
local okay = CreateFrame("Button", "pfMacroIconPickerOkay", picker, "UIPanelButtonTemplate")
|
||||||
|
okay:SetSize(80, 22)
|
||||||
|
okay:SetText(OKAY)
|
||||||
|
okay:SetScript("OnClick", SaveMacroPopup)
|
||||||
|
SkinButton(okay)
|
||||||
|
|
||||||
|
local cancel = CreateFrame("Button", "pfMacroIconPickerCancel", picker, "UIPanelButtonTemplate")
|
||||||
|
cancel:SetSize(80, 22)
|
||||||
|
cancel:SetText(CANCEL)
|
||||||
|
cancel:SetPoint("BOTTOMRIGHT", picker, "BOTTOMRIGHT", -14, 12)
|
||||||
|
cancel:SetScript("OnClick", function() picker:Hide() end)
|
||||||
|
SkinButton(cancel)
|
||||||
|
|
||||||
|
-- Okay | Cancel, both anchored to the bottom-right corner.
|
||||||
|
okay:SetPoint("BOTTOMRIGHT", cancel, "BOTTOMLEFT", -6, 0)
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- Take over the New / Change-Icon buttons; retire Blizzard's popup
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
MacroNewButton:SetScript("OnClick", function()
|
||||||
|
MacroFrame_SaveMacro()
|
||||||
|
OpenMacroPopup("new")
|
||||||
|
end)
|
||||||
|
|
||||||
|
MacroEditButton:SetScript("OnClick", function()
|
||||||
|
MacroFrame_SaveMacro()
|
||||||
|
OpenMacroPopup("edit")
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Closing the macro window takes the picker with it.
|
||||||
|
MacroFrame:HookScript("OnHide", function() picker:Hide() end)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
+8
-11
@@ -2,19 +2,19 @@ pfUI:RegisterModule("macrotweak", function ()
|
|||||||
local conflictAddons = { "Supermacro", "SuperCleveRoidMacros", "UltimaMacros" }
|
local conflictAddons = { "Supermacro", "SuperCleveRoidMacros", "UltimaMacros" }
|
||||||
local disabled = false
|
local disabled = false
|
||||||
|
|
||||||
local function CheckConflicts()
|
for _, addon in pairs(conflictAddons) do
|
||||||
for _, name in pairs(conflictAddons) do
|
local name = addon
|
||||||
if IsAddOnLoaded(name) then
|
EventUtil.ContinueOnAddOnLoaded(name, function()
|
||||||
|
if not disabled then
|
||||||
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: " .. name .. " found, macrotweak disabled.")
|
DEFAULT_CHAT_FRAME:AddMessage("|cff33ffccpfUI|r: " .. name .. " found, macrotweak disabled.")
|
||||||
disabled = true
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
end
|
disabled = true
|
||||||
return false
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- do not write macro calls into chat input history
|
-- do not write macro calls into chat input history
|
||||||
if ChatFrameEditBox._AddHistoryLine then
|
-- (install once: _AddHistoryLine is our backup slot and is nil until we set it)
|
||||||
|
if not ChatFrameEditBox._AddHistoryLine then
|
||||||
local userinput
|
local userinput
|
||||||
ChatFrameEditBox._AddHistoryLine = ChatFrameEditBox.AddHistoryLine
|
ChatFrameEditBox._AddHistoryLine = ChatFrameEditBox.AddHistoryLine
|
||||||
ChatFrameEditBox.AddHistoryLine = function(self, text)
|
ChatFrameEditBox.AddHistoryLine = function(self, text)
|
||||||
@@ -64,7 +64,4 @@ pfUI:RegisterModule("macrotweak", function ()
|
|||||||
UseInventoryItem(slot)
|
UseInventoryItem(slot)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Check conflicts after one tick so all addons have finished loading
|
|
||||||
RunNextFrame(CheckConflicts)
|
|
||||||
end)
|
end)
|
||||||
+12
-12
@@ -25,11 +25,7 @@ pfUI:RegisterModule("map", function ()
|
|||||||
pfUI.map = { UpdateConfig = UpdateTooltipScale }
|
pfUI.map = { UpdateConfig = UpdateTooltipScale }
|
||||||
|
|
||||||
function _G.ToggleWorldMap()
|
function _G.ToggleWorldMap()
|
||||||
if WorldMapFrame:IsShown() then
|
WorldMapFrame:SetShown(not WorldMapFrame:IsShown())
|
||||||
WorldMapFrame:Hide()
|
|
||||||
else
|
|
||||||
WorldMapFrame:Show()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
C.position["WorldMapFrame"] = C.position["WorldMapFrame"] or { alpha = 1.0, scale = 0.7 }
|
C.position["WorldMapFrame"] = C.position["WorldMapFrame"] or { alpha = 1.0, scale = 0.7 }
|
||||||
@@ -81,7 +77,13 @@ pfUI:RegisterModule("map", function ()
|
|||||||
if point == "TOPLEFT" and relpoint == "TOPLEFT" then
|
if point == "TOPLEFT" and relpoint == "TOPLEFT" then
|
||||||
offx = offx*oldscale/scale
|
offx = offx*oldscale/scale
|
||||||
offy = offy*oldscale/scale
|
offy = offy*oldscale/scale
|
||||||
WorldMapFrame:SetPoint(point, rel, relpoint, offx, offy)
|
-- Anchor to the parent (3-arg SetPoint) rather than re-using the frame
|
||||||
|
-- GetPoint handed back. Re-anchoring to `rel` throws
|
||||||
|
-- "<unnamed> is dependent on this" as soon as anything else has anchored
|
||||||
|
-- itself to WorldMapFrame, which aborts the whole zoom handler. The
|
||||||
|
-- parent-relative form is also what LoadMovable/SaveMovable already
|
||||||
|
-- assume: SaveMovable stores only xpos/ypos, with no relative frame.
|
||||||
|
WorldMapFrame:SetPoint(point, offx, offy)
|
||||||
end
|
end
|
||||||
|
|
||||||
WorldMapFrame:SetScale(scale)
|
WorldMapFrame:SetScale(scale)
|
||||||
@@ -107,8 +109,8 @@ pfUI:RegisterModule("map", function ()
|
|||||||
|
|
||||||
WorldMapFrame:ClearAllPoints()
|
WorldMapFrame:ClearAllPoints()
|
||||||
WorldMapFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
WorldMapFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||||
WorldMapFrame:SetWidth(WorldMapButton:GetWidth() + 15)
|
local wmWidth, wmHeight = WorldMapButton:GetSize()
|
||||||
WorldMapFrame:SetHeight(WorldMapButton:GetHeight() + 55)
|
WorldMapFrame:SetSize(wmWidth + 15, wmHeight + 55)
|
||||||
LoadMovable(WorldMapFrame)
|
LoadMovable(WorldMapFrame)
|
||||||
|
|
||||||
-- skin
|
-- skin
|
||||||
@@ -130,8 +132,7 @@ pfUI:RegisterModule("map", function ()
|
|||||||
btn:SetHighlightTexture("")
|
btn:SetHighlightTexture("")
|
||||||
btn.text = _G["pfUI_map_autozoneswitchText"]
|
btn.text = _G["pfUI_map_autozoneswitchText"]
|
||||||
CreateBackdrop(btn, nil, true)
|
CreateBackdrop(btn, nil, true)
|
||||||
btn:SetWidth(14)
|
btn:SetSize(14, 14)
|
||||||
btn:SetHeight(14)
|
|
||||||
btn:SetPoint("RIGHT", WorldMapContinentDropDown, "LEFT", -8, 2)
|
btn:SetPoint("RIGHT", WorldMapContinentDropDown, "LEFT", -8, 2)
|
||||||
btn.text:ClearAllPoints()
|
btn.text:ClearAllPoints()
|
||||||
btn.text:SetPoint("RIGHT", btn, "LEFT", -4, 1)
|
btn.text:SetPoint("RIGHT", btn, "LEFT", -4, 1)
|
||||||
@@ -169,8 +170,7 @@ pfUI:RegisterModule("map", function ()
|
|||||||
WorldMapButton.coords.text:SetJustifyH("RIGHT")
|
WorldMapButton.coords.text:SetJustifyH("RIGHT")
|
||||||
|
|
||||||
WorldMapButton.coords:SetScript("OnUpdate", function()
|
WorldMapButton.coords:SetScript("OnUpdate", function()
|
||||||
local width = WorldMapButton:GetWidth()
|
local width, height = WorldMapButton:GetSize()
|
||||||
local height = WorldMapButton:GetHeight()
|
|
||||||
local mx, my = WorldMapButton:GetCenter()
|
local mx, my = WorldMapButton:GetCenter()
|
||||||
local scale = WorldMapButton:GetEffectiveScale()
|
local scale = WorldMapButton:GetEffectiveScale()
|
||||||
local x, y = GetCursorPosition()
|
local x, y = GetCursorPosition()
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ pfUI:RegisterModule("mapcolors", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function ColorizeName(frame)
|
local function ColorizeName(frame)
|
||||||
local _, class = UnitClass(frame.unit)
|
local class = UnitClassBase(frame.unit)
|
||||||
local color = PFUI_CLASS_COLORS[class]
|
local color = PFUI_CLASS_COLORS[class]
|
||||||
frame.name = frame.name or UnitName(frame.unit)
|
frame.name = frame.name or UnitName(frame.unit)
|
||||||
frame.name = '|c'..color.colorStr..frame.name..'|r'
|
frame.name = '|c'..color.colorStr..frame.name..'|r'
|
||||||
|
|||||||
@@ -52,19 +52,19 @@ pfUI:RegisterModule("mapreveal", function ()
|
|||||||
WorldMapTooltip:AddLine(this.name, 1, 1, 1)
|
WorldMapTooltip:AddLine(this.name, 1, 1, 1)
|
||||||
WorldMapTooltip:Show()
|
WorldMapTooltip:Show()
|
||||||
|
|
||||||
if not explorecaches[this.name] then return end
|
if not explorecaches[this.area] then return end
|
||||||
if C.appearance.worldmap.mapreveal == "0" then return end
|
if C.appearance.worldmap.mapreveal == "0" then return end
|
||||||
for texture in pairs(explorecaches[this.name]) do
|
for texture in pairs(explorecaches[this.area]) do
|
||||||
texture:SetVertexColor(1,1,1,1)
|
texture:SetVertexColor(1,1,1,1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local exploreLeave = function()
|
local exploreLeave = function()
|
||||||
WorldMapTooltip:Hide()
|
WorldMapTooltip:Hide()
|
||||||
if not explorecaches[this.name] then return end
|
if not explorecaches[this.area] then return end
|
||||||
if C.appearance.worldmap.mapreveal == "0" then return end
|
if C.appearance.worldmap.mapreveal == "0" then return end
|
||||||
local r,g,b,a = GetStringColor(C.appearance.worldmap.mapreveal_color)
|
local r,g,b,a = GetStringColor(C.appearance.worldmap.mapreveal_color)
|
||||||
for texture in pairs(explorecaches[this.name]) do
|
for texture in pairs(explorecaches[this.area]) do
|
||||||
texture:SetVertexColor(r,g,b,a)
|
texture:SetVertexColor(r,g,b,a)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -120,6 +120,7 @@ pfUI:RegisterModule("mapreveal", function ()
|
|||||||
explore:EnableMouse(true)
|
explore:EnableMouse(true)
|
||||||
explore:SetFrameLevel(255)
|
explore:SetFrameLevel(255)
|
||||||
explore.name = mapFileName .. " (" .. name .. ")"
|
explore.name = mapFileName .. " (" .. name .. ")"
|
||||||
|
explore.area = name -- cache key: explorecaches is keyed by the plain area name
|
||||||
explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY")
|
explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY")
|
||||||
explore.tex:SetBlendMode("ADD")
|
explore.tex:SetBlendMode("ADD")
|
||||||
explore.tex:SetTexCoord(.08, .92, .08, .92)
|
explore.tex:SetTexCoord(.08, .92, .08, .92)
|
||||||
|
|||||||
+54
-59
@@ -1,57 +1,32 @@
|
|||||||
pfUI:RegisterModule("marktracking", function ()
|
pfUI:RegisterModule("marktracking", function ()
|
||||||
-- 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
|
||||||
if not pcall(function() UnitExists("mark1") end) then return end
|
if not pcall(function() UnitExists("mark1") end) then return end
|
||||||
end
|
end
|
||||||
|
|
||||||
local rawborder, border = GetBorderSize()
|
local rawborder, border = GetBorderSize()
|
||||||
|
|
||||||
-- Parse color strings "r,g,b,a" into components
|
|
||||||
local function ParseColor(str, dr, dg, db, da)
|
|
||||||
if not str or str == "" then return dr, dg, db, da end
|
|
||||||
local _, _, r, g, b, a = string.find(str, "([%d%.]+),([%d%.]+),([%d%.]+),([%d%.]+)")
|
|
||||||
if r then
|
|
||||||
return tonumber(r) or dr, tonumber(g) or dg, tonumber(b) or db, tonumber(a) or da
|
|
||||||
end
|
|
||||||
return dr, dg, db, da
|
|
||||||
end
|
|
||||||
|
|
||||||
local markerOrder = { 8, 7, 6, 5, 4, 3, 2, 1 } -- skull, cross, square, moon, triangle, diamond, circle, star
|
local markerOrder = { 8, 7, 6, 5, 4, 3, 2, 1 } -- skull, cross, square, moon, triangle, diamond, circle, star
|
||||||
local markerTokens = {}
|
local markerTokens = {}
|
||||||
for i = 1, 8 do markerTokens[i] = "mark" .. i end
|
|
||||||
|
|
||||||
-- Default colors per marker
|
|
||||||
local defaultColors = {
|
|
||||||
[1] = { 1.0, 0.9, 0.0, 1 }, -- star: yellow
|
|
||||||
[2] = { 1.0, 0.5, 0.0, 1 }, -- circle: orange
|
|
||||||
[3] = { 0.8, 0.0, 0.8, 1 }, -- diamond: purple
|
|
||||||
[4] = { 0.0, 0.8, 0.0, 1 }, -- triangle: green
|
|
||||||
[5] = { 0.7, 0.7, 0.7, 1 }, -- moon: silver
|
|
||||||
[6] = { 0.0, 0.4, 0.9, 1 }, -- square: blue
|
|
||||||
[7] = { 0.9, 0.0, 0.0, 1 }, -- cross: red
|
|
||||||
[8] = { 1.0, 1.0, 1.0, 1 }, -- skull: white
|
|
||||||
}
|
|
||||||
|
|
||||||
local markerConfigKeys = {
|
local markerConfigKeys = {
|
||||||
[1] = "raidmarkercolor_star",
|
"raidmarkercolor_star",
|
||||||
[2] = "raidmarkercolor_circle",
|
"raidmarkercolor_circle",
|
||||||
[3] = "raidmarkercolor_diamond",
|
"raidmarkercolor_diamond",
|
||||||
[4] = "raidmarkercolor_triangle",
|
"raidmarkercolor_triangle",
|
||||||
[5] = "raidmarkercolor_moon",
|
"raidmarkercolor_moon",
|
||||||
[6] = "raidmarkercolor_square",
|
"raidmarkercolor_square",
|
||||||
[7] = "raidmarkercolor_cross",
|
"raidmarkercolor_cross",
|
||||||
[8] = "raidmarkercolor_skull",
|
"raidmarkercolor_skull",
|
||||||
}
|
}
|
||||||
|
|
||||||
local markerColors = {}
|
local markerColors = {}
|
||||||
for i = 1, 8 do
|
for i, markKey in ipairs(markerConfigKeys) do
|
||||||
local d = defaultColors[i]
|
markerTokens[i] = "mark" .. i
|
||||||
local r, g, b, a = ParseColor(C.unitframes[markerConfigKeys[i]], d[1], d[2], d[3], d[4])
|
local r, g, b, a = GetStringColor(C.unitframes[markKey])
|
||||||
markerColors[i] = { r, g, b, a }
|
markerColors[i] = { tonumber(r), tonumber(g), tonumber(b), tonumber(a) }
|
||||||
end
|
end
|
||||||
|
|
||||||
local FALLBACK_INTERVAL = 1.0 -- safety net for units that come into range after marker was set
|
local FALLBACK_INTERVAL = 1.0 -- safety net for units that come into range after marker was set
|
||||||
local elapsed = 0
|
|
||||||
local isUnlocked = false
|
local isUnlocked = false
|
||||||
local ROW_HEIGHT = tonumber(C.unitframes.raidmarkerheight) or 14
|
local ROW_HEIGHT = tonumber(C.unitframes.raidmarkerheight) or 14
|
||||||
local BAR_WIDTH = tonumber(C.unitframes.raidmarkerwidth) or 80
|
local BAR_WIDTH = tonumber(C.unitframes.raidmarkerwidth) or 80
|
||||||
@@ -125,19 +100,16 @@ pfUI.marktracking = CreateFrame("Frame", "pfMarkTracking", UIParent)
|
|||||||
local i = markerOrder[idx]
|
local i = markerOrder[idx]
|
||||||
|
|
||||||
local row = CreateFrame("Button", nil, pfUI.marktracking)
|
local row = CreateFrame("Button", nil, pfUI.marktracking)
|
||||||
row:SetWidth(TOTAL_ROW_WIDTH)
|
row:SetSize(TOTAL_ROW_WIDTH, ROW_HEIGHT)
|
||||||
row:SetHeight(ROW_HEIGHT)
|
|
||||||
row:Hide()
|
row:Hide()
|
||||||
|
|
||||||
row:RegisterForClicks("LeftButtonUp")
|
row:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
||||||
row:SetScript("OnClick", function()
|
row:SetAttribute("type1", "target")
|
||||||
TargetUnit(markerTokens[this.markerIndex])
|
row:SetAttribute("type2", "menu")
|
||||||
end)
|
|
||||||
|
|
||||||
-- raid icon
|
-- raid icon
|
||||||
row.icon = row:CreateTexture(nil, "ARTWORK")
|
row.icon = row:CreateTexture(nil, "ARTWORK")
|
||||||
row.icon:SetWidth(ROW_HEIGHT)
|
row.icon:SetSize(ROW_HEIGHT, ROW_HEIGHT)
|
||||||
row.icon:SetHeight(ROW_HEIGHT)
|
|
||||||
row.icon:SetPoint("LEFT", row, "LEFT", 1, 0)
|
row.icon:SetPoint("LEFT", row, "LEFT", 1, 0)
|
||||||
local markTex = C.unitframes.blizzard_raidicons == "1" and "Interface\\TargetingFrame\\UI-RaidTargetingIcons" or pfUI.media["img:raidicons"]
|
local markTex = C.unitframes.blizzard_raidicons == "1" and "Interface\\TargetingFrame\\UI-RaidTargetingIcons" or pfUI.media["img:raidicons"]
|
||||||
row.icon:SetTexture(markTex)
|
row.icon:SetTexture(markTex)
|
||||||
@@ -145,8 +117,7 @@ pfUI.marktracking = CreateFrame("Frame", "pfMarkTracking", UIParent)
|
|||||||
|
|
||||||
-- portrait (right side)
|
-- portrait (right side)
|
||||||
row.portrait = row:CreateTexture(nil, "ARTWORK")
|
row.portrait = row:CreateTexture(nil, "ARTWORK")
|
||||||
row.portrait:SetWidth(PORTRAIT_SIZE)
|
row.portrait:SetSize(PORTRAIT_SIZE, PORTRAIT_SIZE)
|
||||||
row.portrait:SetHeight(PORTRAIT_SIZE)
|
|
||||||
row.portrait:SetPoint("RIGHT", row, "RIGHT", -1, 0)
|
row.portrait:SetPoint("RIGHT", row, "RIGHT", -1, 0)
|
||||||
row.portrait:SetTexCoord(.1, .9, .1, .9)
|
row.portrait:SetTexCoord(.1, .9, .1, .9)
|
||||||
if not rm_showportrait then row.portrait:Hide() end
|
if not rm_showportrait then row.portrait:Hide() end
|
||||||
@@ -204,8 +175,8 @@ pfUI.marktracking = CreateFrame("Frame", "pfMarkTracking", UIParent)
|
|||||||
local token = markerTokens[i]
|
local token = markerTokens[i]
|
||||||
|
|
||||||
if UnitExists(token) and not UnitIsDead(token) then
|
if UnitExists(token) and not UnitIsDead(token) then
|
||||||
local hp = UnitHealth(token)
|
local hp, maxhp = UnitHealth(token), UnitHealthMax(token)
|
||||||
local maxhp = UnitHealthMax(token)
|
row:SetAttribute('unit', token)
|
||||||
|
|
||||||
if hp and maxhp and maxhp > 0 and hp > 0 then
|
if hp and maxhp and maxhp > 0 and hp > 0 then
|
||||||
local pct = hp / maxhp
|
local pct = hp / maxhp
|
||||||
@@ -267,6 +238,27 @@ pfUI.marktracking = CreateFrame("Frame", "pfMarkTracking", UIParent)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Fast per-row refresh for a single mark's UNIT_HEALTH/UNIT_MAXHEALTH: moves
|
||||||
|
-- just the bar + hp text. If the mark's visibility flips (comes into range,
|
||||||
|
-- dies, hp crosses 0) the visible rows re-pack, so hand off to UpdateDisplay.
|
||||||
|
local function UpdateRow(i)
|
||||||
|
if isUnlocked then return end
|
||||||
|
local row = pfUI.marktracking.rows[i]
|
||||||
|
if not row then return end
|
||||||
|
local token = markerTokens[i]
|
||||||
|
local hp, maxhp = UnitHealth(token), UnitHealthMax(token)
|
||||||
|
local shouldShow = UnitExists(token) and not UnitIsDead(token)
|
||||||
|
and hp and maxhp and maxhp > 0 and hp > 0 and true or false
|
||||||
|
if shouldShow ~= (row:IsShown() and true or false) then
|
||||||
|
UpdateDisplay()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if not shouldShow then return end
|
||||||
|
local pct = hp / maxhp
|
||||||
|
row.health:SetValue(pct)
|
||||||
|
if rm_showpct then row.hptext:SetText(math.ceil(pct * 100) .. "%") end
|
||||||
|
end
|
||||||
|
|
||||||
-- Unlock mode: show fixed 1-row placeholder so positioning works correctly
|
-- Unlock mode: show fixed 1-row placeholder so positioning works correctly
|
||||||
if pfUI.unlock then
|
if pfUI.unlock then
|
||||||
local origShow = pfUI.unlock:GetScript("OnShow")
|
local origShow = pfUI.unlock:GetScript("OnShow")
|
||||||
@@ -292,24 +284,27 @@ pfUI.marktracking = CreateFrame("Frame", "pfMarkTracking", UIParent)
|
|||||||
-- Event-driven scanner frame
|
-- Event-driven scanner frame
|
||||||
local scanner = CreateFrame("Frame")
|
local scanner = CreateFrame("Frame")
|
||||||
|
|
||||||
-- RAID_TARGET_UPDATE: fires when a raid marker is set/cleared
|
-- RAID_TARGET_UPDATE: a raid marker was set/cleared -> full refresh
|
||||||
-- PLAYER_ENTERING_WORLD: fires on login, reload, and zone transitions
|
-- PLAYER_ENTERING_WORLD: login/reload/zone -> full refresh
|
||||||
-- UNIT_HEALTH/UNIT_MAXHEALTH: fires on HP changes for real-time bar updates
|
-- UNIT_HEALTH/UNIT_MAXHEALTH: ClassicAPI fires these per token; with the mark
|
||||||
|
-- tokens observed they arrive as arg1 == "markN", so we refresh just that
|
||||||
|
-- one row (UpdateRow) instead of rescanning all eight.
|
||||||
scanner:RegisterEvent("RAID_TARGET_UPDATE")
|
scanner:RegisterEvent("RAID_TARGET_UPDATE")
|
||||||
scanner:RegisterEvent("PLAYER_ENTERING_WORLD")
|
scanner:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
scanner:RegisterEvent("UNIT_HEALTH")
|
scanner:RegisterEvent("UNIT_HEALTH")
|
||||||
scanner:RegisterEvent("UNIT_MAXHEALTH")
|
scanner:RegisterEvent("UNIT_MAXHEALTH")
|
||||||
|
|
||||||
scanner:SetScript("OnEvent", function()
|
scanner:SetScript("OnEvent", function()
|
||||||
|
if event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH" then
|
||||||
|
-- arg1 is the token; "markN" -> N, nil for any non-mark token.
|
||||||
|
local i = arg1 and tonumber(string.match(arg1, "^mark(%d)"))
|
||||||
|
if i then UpdateRow(i) end
|
||||||
|
return
|
||||||
|
end
|
||||||
UpdateDisplay()
|
UpdateDisplay()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- Fallback poll at 1s: catches units that come into range AFTER a marker was set
|
-- Fallback poll: catches units that come into range AFTER a marker was set
|
||||||
-- (no event fires for that case, so we need this safety net)
|
-- (no event fires for that case, so we need this safety net)
|
||||||
scanner:SetScript("OnUpdate", function()
|
C_Timer.NewTicker(FALLBACK_INTERVAL, UpdateDisplay)
|
||||||
elapsed = elapsed + arg1
|
|
||||||
if elapsed < FALLBACK_INTERVAL then return end
|
|
||||||
elapsed = 0
|
|
||||||
UpdateDisplay()
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
+16
-35
@@ -33,11 +33,9 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
pfUI.minimap.UpdateConfig = function(self)
|
pfUI.minimap.UpdateConfig = function(self)
|
||||||
size = tonumber(C.appearance.minimap.size) or 140
|
size = tonumber(C.appearance.minimap.size) or 140
|
||||||
|
|
||||||
pfUI.minimap:SetWidth(size)
|
pfUI.minimap:SetSize(size, size)
|
||||||
pfUI.minimap:SetHeight(size)
|
|
||||||
|
|
||||||
Minimap:SetWidth(size)
|
Minimap:SetSize(size, size)
|
||||||
Minimap:SetHeight(size)
|
|
||||||
|
|
||||||
-- vanilla+tbc: do the best to detect the minimap arrow
|
-- vanilla+tbc: do the best to detect the minimap arrow
|
||||||
local arrowscale = tonumber(C.appearance.minimap.arrowscale)
|
local arrowscale = tonumber(C.appearance.minimap.arrowscale)
|
||||||
@@ -133,18 +131,16 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
|
|
||||||
-- Create coordinates text frame with location configurable
|
-- Create coordinates text frame with location configurable
|
||||||
pfUI.minimapCoordinates = CreateFrame("Frame", "pfMinimapCoord", pfUI.minimap)
|
pfUI.minimapCoordinates = CreateFrame("Frame", "pfMinimapCoord", pfUI.minimap)
|
||||||
pfUI.minimapCoordinates:SetScript("OnUpdate", function()
|
-- Update coords every 0.1 seconds
|
||||||
-- Throttle to update coords every 0.1 seconds
|
C_Timer.NewTicker(0.1, function()
|
||||||
if ( this.tick or 0) > GetTime() then return end
|
|
||||||
this.tick = GetTime() + .1
|
|
||||||
|
|
||||||
if C.appearance.minimap.coordstext == "off" then return end
|
if C.appearance.minimap.coordstext == "off" then return end
|
||||||
|
|
||||||
this.posX, this.posY = GetPlayerMapPosition("player")
|
local coord = pfUI.minimapCoordinates
|
||||||
if this.posX ~= 0 and this.posY ~= 0 then
|
coord.posX, coord.posY = GetPlayerMapPosition("player")
|
||||||
this.text:SetText(string.format("%.1f, %.1f", round(this.posX * 100, 1), round(this.posY * 100, 1)))
|
if coord.posX ~= 0 and coord.posY ~= 0 then
|
||||||
|
coord.text:SetText(string.format("%.1f, %.1f", round(coord.posX * 100, 1), round(coord.posY * 100, 1)))
|
||||||
else
|
else
|
||||||
this.text:SetText("|cffffaaaaN/A")
|
coord.text:SetText("|cffffaaaaN/A")
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -158,8 +154,7 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
pfUI.minimapCoordinates:SetPoint("BOTTOMLEFT", 3, 3)
|
pfUI.minimapCoordinates:SetPoint("BOTTOMLEFT", 3, 3)
|
||||||
end
|
end
|
||||||
|
|
||||||
pfUI.minimapCoordinates:SetHeight(C.global.font_size)
|
pfUI.minimapCoordinates:SetSize(Minimap:GetWidth(), C.global.font_size)
|
||||||
pfUI.minimapCoordinates:SetWidth(Minimap:GetWidth())
|
|
||||||
pfUI.minimapCoordinates.text = pfUI.minimapCoordinates:CreateFontString("MinimapCoordinatesText", "LOW", "GameFontNormal")
|
pfUI.minimapCoordinates.text = pfUI.minimapCoordinates:CreateFontString("MinimapCoordinatesText", "LOW", "GameFontNormal")
|
||||||
pfUI.minimapCoordinates.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
pfUI.minimapCoordinates.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
pfUI.minimapCoordinates.text:SetTextColor(1,1,1,1)
|
pfUI.minimapCoordinates.text:SetTextColor(1,1,1,1)
|
||||||
@@ -171,19 +166,14 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
pfUI.minimapCoordinates.text:SetJustifyH("LEFT")
|
pfUI.minimapCoordinates.text:SetJustifyH("LEFT")
|
||||||
end
|
end
|
||||||
|
|
||||||
if C.appearance.minimap.coordstext ~= "on" then
|
pfUI.minimapCoordinates:SetShown(C.appearance.minimap.coordstext == "on")
|
||||||
pfUI.minimapCoordinates:Hide()
|
|
||||||
else
|
|
||||||
pfUI.minimapCoordinates:Show()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Create zone text frame in top center of minimap
|
-- Create zone text frame in top center of minimap
|
||||||
pfUI.minimapZone = CreateFrame("Frame", "pfMinimapZone", pfUI.minimap)
|
pfUI.minimapZone = CreateFrame("Frame", "pfMinimapZone", pfUI.minimap)
|
||||||
pfUI.minimapZone:RegisterEvent("MINIMAP_ZONE_CHANGED")
|
pfUI.minimapZone:RegisterEvent("MINIMAP_ZONE_CHANGED")
|
||||||
pfUI.minimapZone:RegisterEvent("PLAYER_ENTERING_WORLD")
|
pfUI.minimapZone:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
pfUI.minimapZone:SetPoint("TOP", 0, -3)
|
pfUI.minimapZone:SetPoint("TOP", 0, -3)
|
||||||
pfUI.minimapZone:SetHeight(C.global.font_size + 2)
|
pfUI.minimapZone:SetSize(Minimap:GetWidth(), C.global.font_size + 2)
|
||||||
pfUI.minimapZone:SetWidth(Minimap:GetWidth())
|
|
||||||
pfUI.minimapZone.text = pfUI.minimapZone:CreateFontString("minimapZoneText", "LOW", "GameFontNormal")
|
pfUI.minimapZone.text = pfUI.minimapZone:CreateFontString("minimapZoneText", "LOW", "GameFontNormal")
|
||||||
pfUI.minimapZone.text:SetFont(pfUI.font_default, C.global.font_size + 2, "OUTLINE")
|
pfUI.minimapZone.text:SetFont(pfUI.font_default, C.global.font_size + 2, "OUTLINE")
|
||||||
pfUI.minimapZone.text:SetAllPoints(pfUI.minimapZone)
|
pfUI.minimapZone.text:SetAllPoints(pfUI.minimapZone)
|
||||||
@@ -205,17 +195,13 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
elseif pvp == "contested" then
|
elseif pvp == "contested" then
|
||||||
pfUI.minimapZone.text:SetTextColor(1.0, 0.7, 0)
|
pfUI.minimapZone.text:SetTextColor(1.0, 0.7, 0)
|
||||||
else
|
else
|
||||||
pfUI.minimapZone.text:SetTextColor(1, 1, 1, 1)
|
pfUI.minimapZone.text:SetTextColor(WHITE_FONT_COLOR:GetRGBA())
|
||||||
end
|
end
|
||||||
pfUI.minimapZone.text:SetText(GetMinimapZoneText())
|
pfUI.minimapZone.text:SetText(GetMinimapZoneText())
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if C.appearance.minimap.zonetext ~= "on" then
|
pfUI.minimapZone:SetShown(C.appearance.minimap.zonetext == "on")
|
||||||
pfUI.minimapZone:Hide()
|
|
||||||
else
|
|
||||||
pfUI.minimapZone:Show()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Minimap hover event
|
-- Minimap hover event
|
||||||
-- Update and toggle showing of coordinates and zone text on mouse enter/leave
|
-- Update and toggle showing of coordinates and zone text on mouse enter/leave
|
||||||
@@ -241,8 +227,7 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
pfUI.minimap.pvpicon:RegisterEvent("UPDATE_FACTION")
|
pfUI.minimap.pvpicon:RegisterEvent("UPDATE_FACTION")
|
||||||
pfUI.minimap.pvpicon:RegisterEvent("UNIT_FACTION")
|
pfUI.minimap.pvpicon:RegisterEvent("UNIT_FACTION")
|
||||||
pfUI.minimap.pvpicon:SetFrameStrata("HIGH")
|
pfUI.minimap.pvpicon:SetFrameStrata("HIGH")
|
||||||
pfUI.minimap.pvpicon:SetWidth(16)
|
pfUI.minimap.pvpicon:SetSize(16, 16)
|
||||||
pfUI.minimap.pvpicon:SetHeight(16)
|
|
||||||
pfUI.minimap.pvpicon:SetAlpha(.5)
|
pfUI.minimap.pvpicon:SetAlpha(.5)
|
||||||
pfUI.minimap.pvpicon:SetParent(pfUI.minimap)
|
pfUI.minimap.pvpicon:SetParent(pfUI.minimap)
|
||||||
pfUI.minimap.pvpicon:SetPoint("BOTTOMRIGHT", pfUI.minimap, "BOTTOMRIGHT", -5, 5)
|
pfUI.minimap.pvpicon:SetPoint("BOTTOMRIGHT", pfUI.minimap, "BOTTOMRIGHT", -5, 5)
|
||||||
@@ -251,11 +236,7 @@ pfUI:RegisterModule("minimap", function ()
|
|||||||
pfUI.minimap.pvpicon.texture:SetAllPoints(pfUI.minimap.pvpicon)
|
pfUI.minimap.pvpicon.texture:SetAllPoints(pfUI.minimap.pvpicon)
|
||||||
|
|
||||||
pfUI.minimap.pvpicon:SetScript("OnEvent", function()
|
pfUI.minimap.pvpicon:SetScript("OnEvent", function()
|
||||||
if C.unitframes.player.showPVPMinimap == "1" and UnitIsPVP("player") then
|
pfUI.minimap.pvpicon:SetShown(C.unitframes.player.showPVPMinimap == "1" and UnitIsPVP("player"))
|
||||||
pfUI.minimap.pvpicon:Show()
|
|
||||||
else
|
|
||||||
pfUI.minimap.pvpicon:Hide()
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
|||||||
@@ -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)
|
||||||
+323
-215
@@ -4,7 +4,6 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
|
|
||||||
-- Local function references for performance
|
-- Local function references for performance
|
||||||
local GetTime = GetTime
|
local GetTime = GetTime
|
||||||
local UnitExists = UnitExists
|
|
||||||
local UnitName = UnitName
|
local UnitName = UnitName
|
||||||
local UnitClass = UnitClass
|
local UnitClass = UnitClass
|
||||||
local UnitLevel = UnitLevel
|
local UnitLevel = UnitLevel
|
||||||
@@ -15,8 +14,6 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
local UnitCanAssist = UnitCanAssist
|
local UnitCanAssist = UnitCanAssist
|
||||||
local UnitHealth = UnitHealth
|
local UnitHealth = UnitHealth
|
||||||
local UnitHealthMax = UnitHealthMax
|
local UnitHealthMax = UnitHealthMax
|
||||||
local UnitMana = UnitMana
|
|
||||||
local UnitManaMax = UnitManaMax
|
|
||||||
local pairs = pairs
|
local pairs = pairs
|
||||||
local tonumber = tonumber
|
local tonumber = tonumber
|
||||||
local strlower = strlower
|
local strlower = strlower
|
||||||
@@ -58,18 +55,30 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
local savedHostileState = nil
|
local savedHostileState = nil
|
||||||
local savedFriendlyState = nil
|
local savedFriendlyState = nil
|
||||||
local inFriendlyZone = false
|
local inFriendlyZone = false
|
||||||
|
local myGuild = nil
|
||||||
local platecount = 0
|
local platecount = 0
|
||||||
local registry = {}
|
local registry = {}
|
||||||
|
-- Subset of registry that currently has a unit assigned (between
|
||||||
|
-- NAME_PLATE_UNIT_ADDED and _REMOVED). The central loop iterates this instead
|
||||||
|
-- of the full pool so hidden pool slots aren't touched every tick.
|
||||||
|
local visiblePlates = {}
|
||||||
|
|
||||||
local raidGuidCache = {} -- guid -> name (rebuilt on RAID_ROSTER_UPDATE/PARTY_MEMBERS_CHANGED)
|
local raidGuidCache = {} -- guid -> name (rebuilt on RAID_ROSTER_UPDATE/PARTY_MEMBERS_CHANGED)
|
||||||
|
|
||||||
-- Resolve a plate GUID to its cast/channel info via C_Spell. Returns a
|
-- Per-GUID cast state, populated from ClassicAPI's UNIT_SPELLCAST_* events
|
||||||
-- compact struct (spellName / icon / startTime / endTime / duration /
|
-- (which now fire for nameplate tokens) and cleared on STOP / plate removal /
|
||||||
-- isChannel) or nil when the unit isn't casting / the GUID can't map to a
|
-- expiry. This replaces the old per-tick C_Spell poll on every visible plate:
|
||||||
-- live token.
|
-- cast detection is event driven, and GetCastInfo just reads this cache.
|
||||||
local function GetCastInfo(guid)
|
local castState = {}
|
||||||
if not guid then return nil end
|
-- guid -> nameplate, maintained on NAME_PLATE_UNIT_ADDED/_REMOVED so a cast
|
||||||
local unit = UnitTokenFromGUID(guid)
|
-- event can find its plate in O(1) and only cache casts we actually show.
|
||||||
|
local plateByGuid = {}
|
||||||
|
|
||||||
|
-- One-shot C_Spell poll. Builds the cast struct for a UNIT_SPELLCAST_* event
|
||||||
|
-- (the payload carries no timing) and seeds a plate that spawns while its unit
|
||||||
|
-- is already mid-cast (its START fired before the plate existed). Picks cast
|
||||||
|
-- vs channel itself. Never called per frame.
|
||||||
|
local function PollCastInfo(unit)
|
||||||
if not unit then return nil end
|
if not unit then return nil end
|
||||||
local name, _, texture, startMs, endMs, _, _, _, spellID = C_Spell.UnitCastingInfo(unit)
|
local name, _, texture, startMs, endMs, _, _, _, spellID = C_Spell.UnitCastingInfo(unit)
|
||||||
local isChannel
|
local isChannel
|
||||||
@@ -88,14 +97,27 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
isChannel = isChannel,
|
isChannel = isChannel,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Read a unit's current cast from the event-driven cache (keyed by GUID).
|
||||||
|
-- Returns the cached struct while the cast is still active, else nil (and
|
||||||
|
-- prunes the expired entry). Same struct shape and callers as before, minus
|
||||||
|
-- the per-tick poll.
|
||||||
|
local function GetCastInfo(unit)
|
||||||
|
if not unit then return nil end
|
||||||
|
local guid = UnitGUID(unit)
|
||||||
|
if not guid then return nil end
|
||||||
|
local info = castState[guid]
|
||||||
|
if info and info.endTime > GetTime() then return info end
|
||||||
|
if info then castState[guid] = nil end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
local guidTargetTokenCache = {} -- guid -> "<guid>target" interned string
|
|
||||||
local debuffCache = {} -- guid -> { [spellID] = { start, duration } }
|
local debuffCache = {} -- guid -> { [spellID] = { start, duration } }
|
||||||
-- Reusable per-plate debuff display buffer (avoid GC churn from per-call table creation)
|
-- Reusable per-plate debuff display buffer (avoid GC churn from per-call table creation)
|
||||||
local debuffDisplayBuf = {} -- [i] = { effect, texture, stacks, dtype, duration, timeleft }
|
local debuffDisplayBuf = {} -- [i] = { effect, texture, stacks, dtype, duration, timeleft }
|
||||||
for i = 1, 16 do debuffDisplayBuf[i] = {} end
|
for i = 1, 16 do debuffDisplayBuf[i] = {} end
|
||||||
local threatMemory = {} -- guid -> true if mob had player targeted
|
local threatMemory = {} -- guid -> true if mob had player targeted
|
||||||
local debuffSeen = {} -- reusable table for debuff tracking (avoid GC churn)
|
-- local debuffSeen = {} -- reusable table for debuff tracking (avoid GC churn)
|
||||||
|
|
||||||
-- PERF: visiblePlateCount maintained event-driven (NAME_PLATE_UNIT_ADDED/_REMOVED)
|
-- PERF: visiblePlateCount maintained event-driven (NAME_PLATE_UNIT_ADDED/_REMOVED)
|
||||||
local visiblePlateCount = 0
|
local visiblePlateCount = 0
|
||||||
@@ -159,20 +181,13 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
local frameState = {
|
local frameState = {
|
||||||
now = 0,
|
now = 0,
|
||||||
hasTarget = false,
|
|
||||||
targetGuid = nil,
|
targetGuid = nil,
|
||||||
hasMouseover = false,
|
mouseoverGuid = nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
-- cache default border color
|
-- cache default border color
|
||||||
local er, eg, eb, ea = GetStringColor(pfUI_config.appearance.border.color)
|
local er, eg, eb, ea = GetStringColor(pfUI_config.appearance.border.color)
|
||||||
|
|
||||||
-- Vanilla Lua 5.0 bitwise check: math.mod(math.floor(value / flag), 2) ~= 0
|
|
||||||
local function HasFlag(flags, flag)
|
|
||||||
return math.mod(math.floor(flags / flag), 2) ~= 0
|
|
||||||
end
|
|
||||||
|
|
||||||
local UNIT_FLAG_IN_COMBAT = 524288 -- 0x00080000
|
|
||||||
local NULL_GUID = "0x0000000000000000"
|
local NULL_GUID = "0x0000000000000000"
|
||||||
|
|
||||||
local function RebuildRaidGuidCache()
|
local function RebuildRaidGuidCache()
|
||||||
@@ -191,10 +206,11 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
|
|
||||||
local combatColorCache = {} -- guid -> { color, expires }
|
local combatColorCache = {} -- guid -> { color, expires }
|
||||||
|
|
||||||
local function GetCombatStateColor(guid)
|
local function GetCombatStateColor(guid, token)
|
||||||
-- PERF: Quick exit if player not in combat
|
-- PERF: Quick exit if player not in combat
|
||||||
if not UnitAffectingCombat("player") then return false end
|
if not UnitAffectingCombat("player") then return false end
|
||||||
if UnitCanAssist("player", guid) then return false end
|
if not token then return false end
|
||||||
|
if UnitCanAssist("player", token) then return false end
|
||||||
|
|
||||||
-- PERF: 0.2s throttle per guid - color changes are not time-critical
|
-- PERF: 0.2s throttle per guid - color changes are not time-critical
|
||||||
local now = frameState.now
|
local now = frameState.now
|
||||||
@@ -203,24 +219,17 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
return cached.color
|
return cached.color
|
||||||
end
|
end
|
||||||
|
|
||||||
local flags = GetUnitField and GetUnitField(guid, "flags")
|
if not UnitAffectingCombat(token) then return false end
|
||||||
if not flags then return false end
|
|
||||||
if not HasFlag(flags, UNIT_FLAG_IN_COMBAT) then return false end
|
|
||||||
|
|
||||||
local mobTargetGuid = GetUnitField and GetUnitField(guid, "target")
|
-- The mob's current target via the nameplate token chain (ClassicAPI):
|
||||||
|
-- "nameplateNtarget" resolves to whatever this plate's unit is targeting,
|
||||||
|
-- so no GetUnitField("target") or SuperWoW "<guid>target" token needed.
|
||||||
|
local target = token .. "target"
|
||||||
|
local mobTargetGuid = UnitGUID(target)
|
||||||
local hasTarget = mobTargetGuid and mobTargetGuid ~= NULL_GUID
|
local hasTarget = mobTargetGuid and mobTargetGuid ~= NULL_GUID
|
||||||
|
|
||||||
-- PERF: cache the SuperWoW-style "<guid>target" unit token. The concat
|
|
||||||
-- intern-hits Lua's string pool every call; caching once per guid
|
|
||||||
-- saves the hash+lookup. Cleared in NAME_PLATE_UNIT_REMOVED.
|
|
||||||
local target = guidTargetTokenCache[guid]
|
|
||||||
if not target then
|
|
||||||
target = guid .. "target"
|
|
||||||
guidTargetTokenCache[guid] = target
|
|
||||||
end
|
|
||||||
local color = false
|
local color = false
|
||||||
|
|
||||||
local castInfo = GetCastInfo(guid)
|
local castInfo = GetCastInfo(token)
|
||||||
local isCasting = castInfo and castInfo.endTime and now < castInfo.endTime
|
local isCasting = castInfo and castInfo.endTime and now < castInfo.endTime
|
||||||
local targetingPlayer = hasTarget and UnitIsUnit(target, "player")
|
local targetingPlayer = hasTarget and UnitIsUnit(target, "player")
|
||||||
|
|
||||||
@@ -274,15 +283,35 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function TotemPlate(name)
|
-- Numeric CreatureType.dbc id for the plate's unit (8 = Critter, 11 = Totem).
|
||||||
if C.nameplates.totemicons == "1" then
|
-- It's fixed per unit, so cache it and reset on plate reuse. nil while the GUID
|
||||||
for totem, icon in pairs(L["totems"]) do
|
-- can't resolve yet (incl. the no-SuperWoW case, where cachedGuid is empty).
|
||||||
if string.find(name, totem) then return icon end
|
-- Locale-proof and covers custom units for free -- no name tables needed.
|
||||||
end
|
local function CreatureType(plate)
|
||||||
|
local guid = plate.cachedGuid
|
||||||
|
if not guid or guid == "" then return nil end
|
||||||
|
if not plate.creatureType then
|
||||||
|
plate.creatureType = UnitCreatureTypeID(guid) -- nil retries next call
|
||||||
end
|
end
|
||||||
|
return plate.creatureType
|
||||||
end
|
end
|
||||||
|
|
||||||
local function HidePlate(unittype, name, fullhp, target)
|
-- Totem icon, read straight from the game:
|
||||||
|
-- * Passive totems self-cast their provided buff, so they carry exactly one
|
||||||
|
-- aura whose icon IS the totem's icon (Totem::Summon TOTEM_PASSIVE).
|
||||||
|
-- * Active totems (Searing/Magma/Fire Nova) cast at enemies and hold no
|
||||||
|
-- self-aura, so their icon arrives via UNIT_SPELLCAST_SUCCEEDED (cached
|
||||||
|
-- into plate.totemIcon by the event handler); nil here until then.
|
||||||
|
local function TotemPlate(plate)
|
||||||
|
if C.nameplates.totemicons ~= "1" then return nil end
|
||||||
|
if CreatureType(plate) ~= 11 then return nil end
|
||||||
|
if plate.totemIcon then return plate.totemIcon end
|
||||||
|
local aura = C_UnitAuras.GetBuffDataByIndex(plate.cachedGuid, 1)
|
||||||
|
if aura then plate.totemIcon = aura.icon end
|
||||||
|
return plate.totemIcon
|
||||||
|
end
|
||||||
|
|
||||||
|
local function HidePlate(unittype, fullhp, target, plate)
|
||||||
-- keep some plates always visible according to config
|
-- keep some plates always visible according to config
|
||||||
if C.nameplates.fullhealth == "1" and not fullhp then return nil end
|
if C.nameplates.fullhealth == "1" and not fullhp then return nil end
|
||||||
if C.nameplates.target == "1" and target then return nil end
|
if C.nameplates.target == "1" and target then return nil end
|
||||||
@@ -298,14 +327,10 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
return true
|
return true
|
||||||
elseif C.nameplates.friendlyplayer == "1" and unittype == "FRIENDLY_PLAYER" then
|
elseif C.nameplates.friendlyplayer == "1" and unittype == "FRIENDLY_PLAYER" then
|
||||||
return true
|
return true
|
||||||
elseif C.nameplates.critters == "1" and unittype == "NEUTRAL_NPC" then
|
elseif C.nameplates.critters == "1" and CreatureType(plate) == 8 then
|
||||||
for i, critter in pairs(L["critters"]) do
|
return true
|
||||||
if string.lower(name) == string.lower(critter) then return true end
|
elseif C.nameplates.totems == "1" and CreatureType(plate) == 11 then
|
||||||
end
|
return true
|
||||||
elseif C.nameplates.totems == "1" then
|
|
||||||
for totem in pairs(L["totems"]) do
|
|
||||||
if string.find(name, totem) then return true end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- nothing to hide
|
-- nothing to hide
|
||||||
@@ -442,8 +467,7 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
nameplate.debuffs[i]:SetPoint(aligna, nameplate.debuffs[i-limit], alignb, 0, space)
|
nameplate.debuffs[i]:SetPoint(aligna, nameplate.debuffs[i-limit], alignb, 0, space)
|
||||||
end
|
end
|
||||||
|
|
||||||
nameplate.debuffs[i]:SetWidth(tonumber(C.nameplates.debuffsize))
|
nameplate.debuffs[i]:SetSize(debuffsize, debuffsize)
|
||||||
nameplate.debuffs[i]:SetHeight(tonumber(C.nameplates.debuffsize))
|
|
||||||
|
|
||||||
-- Update cooldown display settings
|
-- Update cooldown display settings
|
||||||
if nameplate.debuffs[i].cd then
|
if nameplate.debuffs[i].cd then
|
||||||
@@ -468,10 +492,15 @@ nameplates:RegisterEvent("PARTY_MEMBERS_CHANGED")
|
|||||||
nameplates:RegisterEvent("NAME_PLATE_CREATED")
|
nameplates:RegisterEvent("NAME_PLATE_CREATED")
|
||||||
nameplates:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
nameplates:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
||||||
nameplates:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
|
nameplates:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
|
||||||
if GetUnitField then
|
nameplates:RegisterEvent("UNIT_AURA")
|
||||||
nameplates:RegisterEvent("UNIT_FLAGS_GUID")
|
nameplates:RegisterEvent("UNIT_FLAGS")
|
||||||
nameplates:RegisterEvent("UNIT_AURA_GUID")
|
nameplates:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
|
||||||
end
|
nameplates:RegisterEvent("UNIT_SPELLCAST_START")
|
||||||
|
nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
|
||||||
|
nameplates:RegisterEvent("UNIT_SPELLCAST_STOP")
|
||||||
|
nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
|
||||||
|
nameplates:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
|
||||||
|
nameplates:RegisterEvent("PLAYER_GUILD_UPDATE")
|
||||||
|
|
||||||
nameplates:SetScript("OnEvent", function()
|
nameplates:SetScript("OnEvent", function()
|
||||||
-- Stop event handling during logout to prevent crash 132
|
-- Stop event handling during logout to prevent crash 132
|
||||||
@@ -483,12 +512,17 @@ end
|
|||||||
nameplates.mouselook:SetScript("OnUpdate", nil)
|
nameplates.mouselook:SetScript("OnUpdate", nil)
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
|
|
||||||
|
elseif event == "PLAYER_GUILD_UPDATE" and arg1 == 'player' then
|
||||||
|
myGuild = GetGuildInfo("player")
|
||||||
|
|
||||||
elseif event == "PLAYER_ENTERING_WORLD" or event == "ZONE_CHANGED_NEW_AREA" then
|
elseif event == "PLAYER_ENTERING_WORLD" or event == "ZONE_CHANGED_NEW_AREA" then
|
||||||
if event == "PLAYER_ENTERING_WORLD" then
|
if event == "PLAYER_ENTERING_WORLD" then
|
||||||
CacheConfig()
|
CacheConfig()
|
||||||
this:SetGameVariables()
|
this:SetGameVariables()
|
||||||
RebuildRaidGuidCache()
|
RebuildRaidGuidCache()
|
||||||
|
frameState.targetGuid = UnitGUID("target")
|
||||||
|
myGuild = GetGuildInfo("player")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Handle friendly zone nameplate disable feature
|
-- Handle friendly zone nameplate disable feature
|
||||||
@@ -544,10 +578,23 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "NAME_PLATE_UNIT_ADDED" then
|
elseif event == "NAME_PLATE_UNIT_ADDED" then
|
||||||
-- arg1 = "nameplateN" unit token; resolve to GUID for cache keys
|
-- arg1 = "nameplateN" unit token. Cache the GUID for cache keys and the
|
||||||
|
-- token itself for token-based UnitX reads (stable per plate lifetime).
|
||||||
local plate = C_NamePlate.GetNamePlateForUnit(arg1)
|
local plate = C_NamePlate.GetNamePlateForUnit(arg1)
|
||||||
if plate and plate.nameplate then
|
if plate and plate.nameplate then
|
||||||
plate.nameplate.cachedGuid = UnitGUID(arg1)
|
visiblePlates[plate] = plate
|
||||||
|
local guid = UnitGUID(arg1)
|
||||||
|
plate.nameplate.cachedGuid = guid
|
||||||
|
plate.nameplate.unit = arg1
|
||||||
|
plate.nameplate.creatureType = nil -- recompute for the new unit
|
||||||
|
plate.nameplate.totemIcon = nil
|
||||||
|
if guid then
|
||||||
|
plateByGuid[guid] = plate.nameplate
|
||||||
|
-- Seed: the unit may already be mid-cast (its UNIT_SPELLCAST_START
|
||||||
|
-- fired before this plate existed). One poll here catches that;
|
||||||
|
-- ongoing casts arrive via the event.
|
||||||
|
castState[guid] = PollCastInfo(arg1)
|
||||||
|
end
|
||||||
nameplates.OnShow(plate)
|
nameplates.OnShow(plate)
|
||||||
end
|
end
|
||||||
visiblePlateCount = visiblePlateCount + 1
|
visiblePlateCount = visiblePlateCount + 1
|
||||||
@@ -556,57 +603,113 @@ end
|
|||||||
visiblePlateCount = visiblePlateCount > 0 and visiblePlateCount - 1 or 0
|
visiblePlateCount = visiblePlateCount > 0 and visiblePlateCount - 1 or 0
|
||||||
-- arg1 = "nameplateN" unit token; UnitGUID still resolves inside the
|
-- arg1 = "nameplateN" unit token; UnitGUID still resolves inside the
|
||||||
-- handler (the slot is freed after dispatch returns)
|
-- handler (the slot is freed after dispatch returns)
|
||||||
|
local plate = C_NamePlate.GetNamePlateForUnit(arg1)
|
||||||
|
if plate then visiblePlates[plate] = nil end
|
||||||
local guid = UnitGUID(arg1)
|
local guid = UnitGUID(arg1)
|
||||||
if guid then
|
if guid then
|
||||||
if debuffCache[guid] then debuffCache[guid] = nil end
|
if debuffCache[guid] then debuffCache[guid] = nil end
|
||||||
if threatMemory[guid] then threatMemory[guid] = nil end
|
if threatMemory[guid] then threatMemory[guid] = nil end
|
||||||
if guidTargetTokenCache[guid] then guidTargetTokenCache[guid] = nil end
|
|
||||||
if combatColorCache[guid] then combatColorCache[guid] = nil end
|
if combatColorCache[guid] then combatColorCache[guid] = nil end
|
||||||
local plate = C_NamePlate.GetNamePlateForUnit(arg1)
|
if castState[guid] then castState[guid] = nil end
|
||||||
|
if plateByGuid[guid] then plateByGuid[guid] = nil end
|
||||||
if plate and plate.nameplate and plate.nameplate.cachedGuid == guid then
|
if plate and plate.nameplate and plate.nameplate.cachedGuid == guid then
|
||||||
plate.nameplate.cachedGuid = nil
|
plate.nameplate.cachedGuid = nil
|
||||||
|
plate.nameplate.unit = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "UNIT_FLAGS_GUID" then
|
elseif event == "UNIT_FLAGS" then
|
||||||
-- Nampower: fires instantly when any unit's flags change (e.g. stun, combat enter/leave)
|
if arg1 and strfind(arg1, "^nameplate") then
|
||||||
-- arg1 = guid — directly flag that nameplate for immediate update, bypassing throttle
|
local plate = C_NamePlate.GetNamePlateForUnit(arg1)
|
||||||
local plate = C_NamePlate.GetNamePlateForGUID(arg1)
|
if plate and plate.nameplate then
|
||||||
if plate and plate.nameplate then
|
plate.nameplate.eventcache = true
|
||||||
plate.nameplate.eventcache = true
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "UNIT_AURA_GUID" then
|
elseif event == "UPDATE_MOUSEOVER_UNIT" then
|
||||||
-- Nampower: fires when a unit's aura set changes (add/remove/modify).
|
local new = UnitGUID("mouseover")
|
||||||
-- arg1 = guid. Flag the matching plate so OnUpdate triggers a fresh
|
local old = frameState.mouseoverGuid
|
||||||
-- C_UnitAuras read on the next tick instead of waiting on the 0.5s
|
if new ~= old then
|
||||||
-- throttle — covers expirations, dispels, refreshes, and stack changes
|
frameState.mouseoverGuid = new
|
||||||
-- in one event.
|
local po = old and plateByGuid[old]
|
||||||
local plate = C_NamePlate.GetNamePlateForGUID(arg1)
|
if po then po.eventcache = true end
|
||||||
if plate and plate.nameplate then
|
local pn = new and plateByGuid[new]
|
||||||
plate.nameplate.auraUpdate = true
|
if pn then pn.eventcache = true end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif event == "UNIT_SPELLCAST_START" or event == "UNIT_SPELLCAST_CHANNEL_START" then
|
||||||
|
-- ClassicAPI fires UNIT_SPELLCAST_* per unit token, including the caster's
|
||||||
|
-- "nameplateN". The payload has no timing, so poll it (PollCastInfo picks
|
||||||
|
-- cast vs channel) and cache -- only for a unit we have a plate for, so
|
||||||
|
-- the table stays bounded to on-screen casters.
|
||||||
|
if arg1 and strfind(arg1, "^nameplate") then
|
||||||
|
local guid = UnitGUID(arg1)
|
||||||
|
local plate = guid and plateByGuid[guid]
|
||||||
|
if plate then
|
||||||
|
castState[guid] = PollCastInfo(arg1)
|
||||||
|
if castState[guid] then
|
||||||
|
plate.castUpdate = true -- bypass the throttle so the bar shows now
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif event == "UNIT_SPELLCAST_STOP" or event == "UNIT_SPELLCAST_CHANNEL_STOP" then
|
||||||
|
-- Cast/channel ended (natural, interrupted, or cancelled -- the poll fires
|
||||||
|
-- STOP for all three). Clear the cached cast and refresh its plate.
|
||||||
|
if arg1 and strfind(arg1, "^nameplate") then
|
||||||
|
local guid = UnitGUID(arg1)
|
||||||
|
if guid and castState[guid] then
|
||||||
|
castState[guid] = nil
|
||||||
|
local plate = plateByGuid[guid]
|
||||||
|
if plate then plate.castUpdate = true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
|
||||||
|
-- Active totems (Searing/Magma/Fire Nova) carry no self-aura, so their
|
||||||
|
-- attack cast is the only icon source. Capture it once per totem, gated on
|
||||||
|
-- creature type so a normal caster's spell never styles it as a totem.
|
||||||
|
if arg1 and strfind(arg1, "^nameplate") then
|
||||||
|
local guid = UnitGUID(arg1)
|
||||||
|
local plate = guid and plateByGuid[guid]
|
||||||
|
if plate and not plate.totemIcon and arg3 and CreatureType(plate) == 11 then
|
||||||
|
local tex = C_Spell.GetSpellTexture(arg3)
|
||||||
|
if tex then
|
||||||
|
plate.totemIcon = tex
|
||||||
|
plate.castUpdate = true -- re-render now so the icon shows
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif event == "UNIT_AURA" then
|
||||||
|
-- ClassicAPI: fires with arg1 == "nameplateN" when a unit's aura set
|
||||||
|
-- changes (add/remove/modify). Flag the matching plate so OnUpdate does a
|
||||||
|
-- fresh C_UnitAuras read next tick instead of waiting on the 0.5s
|
||||||
|
-- throttle -- covers expirations, dispels, refreshes, and stack changes
|
||||||
|
-- in one event. Guard on the token prefix (UNIT_AURA also fires for
|
||||||
|
-- target/party/raid).
|
||||||
|
if arg1 and strfind(arg1, "^nameplate") then
|
||||||
|
local plate = C_NamePlate.GetNamePlateForUnit(arg1)
|
||||||
|
if plate and plate.nameplate then
|
||||||
|
plate.nameplate.auraUpdate = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event == "PLAYER_TARGET_CHANGED" then
|
elseif event == "PLAYER_TARGET_CHANGED" then
|
||||||
-- Flag target plate for update via GUID registry
|
frameState.targetGuid = UnitGUID('target')
|
||||||
local targetGuid = UnitGUID("target")
|
-- Flag the target's plate for update
|
||||||
if targetGuid then
|
local plate = C_NamePlate.GetNamePlateForUnit("target")
|
||||||
local plate = C_NamePlate.GetNamePlateForGUID(targetGuid)
|
if plate and plate.nameplate then
|
||||||
if plate and plate.nameplate then
|
plate.nameplate.targetUpdate = true
|
||||||
plate.nameplate.targetUpdate = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
-- Also propagate to all plates for alpha/strata updates
|
-- Also propagate to all plates for alpha/strata updates
|
||||||
this.eventcache = true
|
this.eventcache = true
|
||||||
|
|
||||||
elseif event == "PLAYER_COMBO_POINTS" or event == "UNIT_COMBO_POINTS" then
|
elseif event == "PLAYER_COMBO_POINTS" or event == "UNIT_COMBO_POINTS" then
|
||||||
-- Only flag the target plate for combo point update
|
-- Only flag the target's plate for combo point update
|
||||||
local targetGuid = UnitGUID("target")
|
local plate = C_NamePlate.GetNamePlateForUnit("target")
|
||||||
if targetGuid then
|
if plate and plate.nameplate then
|
||||||
local plate = C_NamePlate.GetNamePlateForGUID(targetGuid)
|
plate.nameplate.comboUpdate = true
|
||||||
if plate and plate.nameplate then
|
|
||||||
plate.nameplate.comboUpdate = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
this.eventcache = true
|
this.eventcache = true
|
||||||
@@ -622,21 +725,15 @@ end
|
|||||||
|
|
||||||
-- PERF: Cache GetTime() once per frame
|
-- PERF: Cache GetTime() once per frame
|
||||||
frameState.now = now
|
frameState.now = now
|
||||||
frameState.hasTarget, frameState.targetGuid = UnitExists("target")
|
|
||||||
frameState.hasMouseover = UnitExists("mouseover")
|
|
||||||
|
|
||||||
-- propagate events to all nameplates
|
|
||||||
if this.eventcache then
|
if this.eventcache then
|
||||||
this.eventcache = nil
|
this.eventcache = nil
|
||||||
for plate in pairs(registry) do
|
for plate in pairs(visiblePlates) do
|
||||||
plate.eventcache = true
|
plate.nameplate.eventcache = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- visiblePlateCount is maintained event-driven via NAME_PLATE_UNIT_ADDED/_REMOVED.
|
for plate in pairs(visiblePlates) do
|
||||||
|
|
||||||
-- Central OnUpdate for all visible plates
|
|
||||||
for plate in pairs(registry) do
|
|
||||||
if plate:IsVisible() then
|
if plate:IsVisible() then
|
||||||
nameplates.OnUpdate(plate, frameState)
|
nameplates.OnUpdate(plate, frameState)
|
||||||
end
|
end
|
||||||
@@ -669,7 +766,7 @@ end
|
|||||||
nameplates.OnCreate = function(frame)
|
nameplates.OnCreate = function(frame)
|
||||||
local parent = frame or this
|
local parent = frame or this
|
||||||
platecount = platecount + 1
|
platecount = platecount + 1
|
||||||
platename = "pfNamePlate" .. platecount
|
local platename = "pfNamePlate" .. platecount
|
||||||
|
|
||||||
-- create pfUI nameplate overlay
|
-- create pfUI nameplate overlay
|
||||||
local nameplate = CreateFrame("Button", platename, parent)
|
local nameplate = CreateFrame("Button", platename, parent)
|
||||||
@@ -734,8 +831,7 @@ end
|
|||||||
|
|
||||||
nameplate.totem = CreateFrame("Frame", nil, nameplate)
|
nameplate.totem = CreateFrame("Frame", nil, nameplate)
|
||||||
nameplate.totem:SetPoint("CENTER", nameplate, "CENTER", 0, 0)
|
nameplate.totem:SetPoint("CENTER", nameplate, "CENTER", 0, 0)
|
||||||
nameplate.totem:SetHeight(32)
|
nameplate.totem:SetSize(32, 32)
|
||||||
nameplate.totem:SetWidth(32)
|
|
||||||
nameplate.totem.icon = nameplate.totem:CreateTexture(nil, "OVERLAY")
|
nameplate.totem.icon = nameplate.totem:CreateTexture(nil, "OVERLAY")
|
||||||
nameplate.totem.icon:SetTexCoord(.078, .92, .079, .937)
|
nameplate.totem.icon:SetTexCoord(.078, .92, .079, .937)
|
||||||
nameplate.totem.icon:SetAllPoints()
|
nameplate.totem.icon:SetAllPoints()
|
||||||
@@ -823,11 +919,11 @@ end
|
|||||||
|
|
||||||
local plate_width = C.nameplates.width + 50
|
local plate_width = C.nameplates.width + 50
|
||||||
local plate_height = C.nameplates.heighthealth + font_size + 5
|
local plate_height = C.nameplates.heighthealth + font_size + 5
|
||||||
local plate_height_cast = C.nameplates.heighthealth + font_size + 5 + C.nameplates.heightcast + 5
|
-- local plate_height_cast = C.nameplates.heighthealth + font_size + 5 + C.nameplates.heightcast + 5
|
||||||
local combo_size = 5
|
local combo_size = 5
|
||||||
|
|
||||||
local width = tonumber(C.nameplates.width)
|
-- local width = tonumber(C.nameplates.width)
|
||||||
local debuffsize = tonumber(C.nameplates.debuffsize)
|
-- local debuffsize = tonumber(C.nameplates.debuffsize)
|
||||||
local healthoffset = tonumber(C.nameplates.health.offset)
|
local healthoffset = tonumber(C.nameplates.health.offset)
|
||||||
local orientation = C.nameplates.verticalhealth == "1" and "VERTICAL" or "HORIZONTAL"
|
local orientation = C.nameplates.verticalhealth == "1" and "VERTICAL" or "HORIZONTAL"
|
||||||
|
|
||||||
@@ -840,8 +936,7 @@ end
|
|||||||
|
|
||||||
RebuildOfftanks()
|
RebuildOfftanks()
|
||||||
|
|
||||||
nameplate:SetWidth(plate_width)
|
nameplate:SetSize(plate_width, plate_height)
|
||||||
nameplate:SetHeight(plate_height)
|
|
||||||
nameplate:SetPoint("TOP", parent, "TOP", 0, 0)
|
nameplate:SetPoint("TOP", parent, "TOP", 0, 0)
|
||||||
|
|
||||||
nameplate.name:SetFont(font, font_size, font_style)
|
nameplate.name:SetFont(font, font_size, font_style)
|
||||||
@@ -870,23 +965,20 @@ end
|
|||||||
|
|
||||||
nameplate.guild:SetFont(font, font_size, font_style)
|
nameplate.guild:SetFont(font, font_size, font_style)
|
||||||
|
|
||||||
nameplate.glow:SetWidth(C.nameplates.width + 60)
|
nameplate.glow:SetSize(C.nameplates.width + 60, C.nameplates.heighthealth + 30)
|
||||||
nameplate.glow:SetHeight(C.nameplates.heighthealth + 30)
|
|
||||||
nameplate.glow:SetVertexColor(glowr, glowg, glowb, glowa)
|
nameplate.glow:SetVertexColor(glowr, glowg, glowb, glowa)
|
||||||
|
|
||||||
nameplate.raidicon:ClearAllPoints()
|
nameplate.raidicon:ClearAllPoints()
|
||||||
nameplate.raidicon:SetPoint("BOTTOM", nameplate.health, "TOP", C.nameplates.raidiconoffx, C.nameplates.raidiconoffy)
|
nameplate.raidicon:SetPoint("BOTTOM", nameplate.health, "TOP", C.nameplates.raidiconoffx, C.nameplates.raidiconoffy)
|
||||||
nameplate.level:SetFont(font, font_size, font_style)
|
nameplate.level:SetFont(font, font_size, font_style)
|
||||||
nameplate.raidicon:SetWidth(C.nameplates.raidiconsize)
|
nameplate.raidicon:SetSize(C.nameplates.raidiconsize, C.nameplates.raidiconsize)
|
||||||
nameplate.raidicon:SetHeight(C.nameplates.raidiconsize)
|
|
||||||
|
|
||||||
for i=1,16 do
|
for i=1,16 do
|
||||||
UpdateDebuffConfig(nameplate, i)
|
UpdateDebuffConfig(nameplate, i)
|
||||||
end
|
end
|
||||||
|
|
||||||
for i=1,5 do
|
for i=1,5 do
|
||||||
nameplate.combopoints[i]:SetWidth(combo_size)
|
nameplate.combopoints[i]:SetSize(combo_size, combo_size)
|
||||||
nameplate.combopoints[i]:SetHeight(combo_size)
|
|
||||||
nameplate.combopoints[i]:SetPoint("TOPRIGHT", nameplate.health, "BOTTOMRIGHT", -(i-1)*(combo_size+default_border*3), -default_border*3)
|
nameplate.combopoints[i]:SetPoint("TOPRIGHT", nameplate.health, "BOTTOMRIGHT", -(i-1)*(combo_size+default_border*3), -default_border*3)
|
||||||
CreateBackdrop(nameplate.combopoints[i], default_border)
|
CreateBackdrop(nameplate.combopoints[i], default_border)
|
||||||
end
|
end
|
||||||
@@ -897,7 +989,7 @@ end
|
|||||||
-- Use the same castbar texture and color as the unit frame castbar (castbar.lua)
|
-- Use the same castbar texture and color as the unit frame castbar (castbar.lua)
|
||||||
local cbtexture = pfUI.media[C.appearance.castbar.texture]
|
local cbtexture = pfUI.media[C.appearance.castbar.texture]
|
||||||
nameplate.castbar:SetStatusBarTexture(cbtexture or hptexture)
|
nameplate.castbar:SetStatusBarTexture(cbtexture or hptexture)
|
||||||
local cbr, cbg, cbb, cba = strsplit(",", C.appearance.castbar.castbarcolor)
|
local cbr, cbg, cbb, cba = GetStringColor(C.appearance.castbar.castbarcolor)
|
||||||
nameplate.castbar:SetStatusBarColor(cbr, cbg, cbb, cba)
|
nameplate.castbar:SetStatusBarColor(cbr, cbg, cbb, cba)
|
||||||
-- reset endTime cache so color/texture refresh takes effect on next cast
|
-- reset endTime cache so color/texture refresh takes effect on next cast
|
||||||
nameplate.castbar.lastEndTime = nil
|
nameplate.castbar.lastEndTime = nil
|
||||||
@@ -944,7 +1036,7 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
local target = plate.istarget
|
local target = plate.istarget
|
||||||
local mouseover = UnitExists("mouseover") and plate.original.glow:IsShown() or nil
|
local mouseover = plate.cachedGuid and plate.cachedGuid == frameState.mouseoverGuid or nil
|
||||||
local unitstr = target and "target" or mouseover and "mouseover" or plate.cachedGuid or nil
|
local unitstr = target and "target" or mouseover and "mouseover" or plate.cachedGuid or nil
|
||||||
|
|
||||||
-- resolve player vs npc from plate's own unit so libunitscan can't return
|
-- resolve player vs npc from plate's own unit so libunitscan can't return
|
||||||
@@ -988,16 +1080,14 @@ end
|
|||||||
-- always make sure to keep plate visible
|
-- always make sure to keep plate visible
|
||||||
plate:Show()
|
plate:Show()
|
||||||
|
|
||||||
if target and cfg.targetglow then
|
plate.glow:SetShown(target and cfg.targetglow)
|
||||||
plate.glow:Show() else plate.glow:Hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- target indicator
|
-- target indicator
|
||||||
if cfg.outcombatstate then
|
if cfg.outcombatstate then
|
||||||
local guid = plate.cachedGuid or ""
|
local guid = plate.cachedGuid or ""
|
||||||
|
|
||||||
-- determine color based on combat state
|
-- determine color based on combat state
|
||||||
local color = GetCombatStateColor(guid)
|
local color = GetCombatStateColor(guid, plate.unit)
|
||||||
if not color then color = combatstate.NONE end
|
if not color then color = combatstate.NONE end
|
||||||
|
|
||||||
-- set border color
|
-- set border color
|
||||||
@@ -1017,11 +1107,11 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- hide frames according to the configuration
|
-- hide frames according to the configuration
|
||||||
local TotemIcon = TotemPlate(name)
|
local TotemIcon = TotemPlate(plate)
|
||||||
|
|
||||||
if TotemIcon then
|
if TotemIcon then
|
||||||
-- create totem icon
|
-- icon resolved from the totem's aura / attack cast (already a full path)
|
||||||
plate.totem.icon:SetTexture("Interface\\Icons\\" .. TotemIcon)
|
plate.totem.icon:SetTexture(TotemIcon)
|
||||||
|
|
||||||
plate.glow:Hide()
|
plate.glow:Hide()
|
||||||
plate.level:Hide()
|
plate.level:Hide()
|
||||||
@@ -1029,7 +1119,7 @@ end
|
|||||||
plate.health:Hide()
|
plate.health:Hide()
|
||||||
plate.guild:Hide()
|
plate.guild:Hide()
|
||||||
plate.totem:Show()
|
plate.totem:Show()
|
||||||
elseif HidePlate(unittype, name, (hpmax-hp == hpmin), target) then
|
elseif HidePlate(unittype, (hpmax-hp == hpmin), target, plate) then
|
||||||
plate.level:SetPoint("RIGHT", plate.name, "LEFT", -3, 0)
|
plate.level:SetPoint("RIGHT", plate.name, "LEFT", -3, 0)
|
||||||
plate.name:SetParent(plate)
|
plate.name:SetParent(plate)
|
||||||
plate.guild:SetPoint("BOTTOM", plate.name, "BOTTOM", -2, -(font_size + 2))
|
plate.guild:SetPoint("BOTTOM", plate.name, "BOTTOM", -2, -(font_size + 2))
|
||||||
@@ -1064,15 +1154,24 @@ end
|
|||||||
plate.level:SetText(string.format("%s%s", level, (elitestrings[elite] or "")))
|
plate.level:SetText(string.format("%s%s", level, (elitestrings[elite] or "")))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set level color from GetDifficultyColor when using DB level
|
-- Set level color from GetDifficultyColor when using DB level.
|
||||||
|
-- No brightening here: adding a flat offset to all three channels
|
||||||
|
-- desaturates every tier toward white and collapses the boundaries
|
||||||
|
-- (orange reads as yellow, red reads as orange). Use Blizzard's values.
|
||||||
|
-- Clearing cache.levelcolor forces the sync block in OnUpdate to
|
||||||
|
-- re-colour once the ?? resolves and it takes ownership again.
|
||||||
if levelFromDB and type(level) == "number" then
|
if levelFromDB and type(level) == "number" then
|
||||||
local color = GetDifficultyColor(level)
|
local color = GetDifficultyColor(level)
|
||||||
plate.level:SetTextColor(color.r + 0.3, color.g + 0.3, color.b + 0.3, 1)
|
plate.level:SetTextColor(color.r, color.g, color.b, 1)
|
||||||
|
plate.cache.levelcolor = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- remember who owns the level colour so the two writers cannot fight
|
||||||
|
plate.cache.levelfromdb = levelFromDB or nil
|
||||||
|
|
||||||
if guild and C.nameplates.showguildname == "1" then
|
if guild and C.nameplates.showguildname == "1" then
|
||||||
plate.guild:SetText(guild)
|
plate.guild:SetText(guild)
|
||||||
if guild == GetGuildInfo("player") then
|
if guild == myGuild then
|
||||||
plate.guild:SetTextColor(0, 0.9, 0, 1)
|
plate.guild:SetTextColor(0, 0.9, 0, 1)
|
||||||
else
|
else
|
||||||
plate.guild:SetTextColor(0.8, 0.8, 0.8, 1)
|
plate.guild:SetTextColor(0.8, 0.8, 0.8, 1)
|
||||||
@@ -1091,15 +1190,15 @@ end
|
|||||||
|
|
||||||
if cfg.showhp then
|
if cfg.showhp then
|
||||||
local rhp, rhpmax, estimated
|
local rhp, rhpmax, estimated
|
||||||
local guid = plate.cachedGuid
|
local unit = plate.unit
|
||||||
if guid and GetUnitField then
|
if unit then
|
||||||
local npHp = GetUnitField(guid, "health")
|
local npHp = UnitHealth(unit)
|
||||||
local npMaxHp = GetUnitField(guid, "maxHealth")
|
local npMaxHp = UnitHealthMax(unit)
|
||||||
if npHp and npHp > 0 and npMaxHp and npMaxHp > 0 and npMaxHp ~= 100 then
|
if npHp and npHp > 0 and npMaxHp and npMaxHp > 0 and npMaxHp ~= 100 then
|
||||||
rhp, rhpmax = npHp, npMaxHp
|
rhp, rhpmax = npHp, npMaxHp
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Fallback to existing methods
|
-- Fallback to existing methods
|
||||||
if not rhp then
|
if not rhp then
|
||||||
if hpmax > 100 or (round(hpmax/100*hp) ~= hp) then
|
if hpmax > 100 or (round(hpmax/100*hp) ~= hp) then
|
||||||
@@ -1136,12 +1235,11 @@ end
|
|||||||
|
|
||||||
local r, g, b, a = unpack(unitcolors[unittype])
|
local r, g, b, a = unpack(unitcolors[unittype])
|
||||||
|
|
||||||
if class then
|
if class and (
|
||||||
if unittype == "ENEMY_PLAYER" and C.nameplates["enemyclassc"] == "1" then
|
(unittype == "ENEMY_PLAYER" and C.nameplates["enemyclassc"] == "1") or
|
||||||
r, g, b, a = PFUI_CLASS_COLORS[class]:GetRGBA()
|
(unittype == "FRIENDLY_PLAYER" and C.nameplates["friendclassc"] == "1")
|
||||||
elseif unittype == "FRIENDLY_PLAYER" and C.nameplates["friendclassc"] == "1" then
|
) then
|
||||||
r, g, b, a = PFUI_CLASS_COLORS[class]:GetRGBA()
|
r, g, b, a = PFUI_CLASS_COLORS[class]:GetRGBA()
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if unitstr and UnitIsTapped(unitstr) and not UnitIsTappedByPlayer(unitstr) then
|
if unitstr and UnitIsTapped(unitstr) and not UnitIsTappedByPlayer(unitstr) then
|
||||||
@@ -1150,7 +1248,7 @@ end
|
|||||||
|
|
||||||
if cfg.barcombatstate then
|
if cfg.barcombatstate then
|
||||||
local guid = plate.cachedGuid or ""
|
local guid = plate.cachedGuid or ""
|
||||||
local color = GetCombatStateColor(guid)
|
local color = GetCombatStateColor(guid, plate.unit)
|
||||||
|
|
||||||
if color then
|
if color then
|
||||||
r, g, b, a = color.r, color.g, color.b, color.a
|
r, g, b, a = color.r, color.g, color.b, color.a
|
||||||
@@ -1162,15 +1260,43 @@ end
|
|||||||
plate.cache.r, plate.cache.g, plate.cache.b = r, g, b
|
plate.cache.r, plate.cache.g, plate.cache.b = r, g, b
|
||||||
end
|
end
|
||||||
|
|
||||||
if r + g + b ~= plate.cache.namecolor and unittype == "FRIENDLY_PLAYER" and C.nameplates["friendclassnamec"] == "1" and class and PFUI_CLASS_COLORS[class] then
|
-- Friendly player names take this colour when friendclassnamec is on.
|
||||||
plate.name:SetTextColor(r, g, b, a)
|
-- Ownership is recorded so the OnUpdate sync below stands down rather than
|
||||||
plate.cache.namecolor = r + g + b
|
-- racing us: both writers used to share cache.namecolor despite storing
|
||||||
|
-- unrelated quantities (this colour vs Blizzard's name FontString), so
|
||||||
|
-- either could suppress the other -- and since nameplate.cache survives
|
||||||
|
-- pool reuse, a recycled plate could keep the previous unit's name colour.
|
||||||
|
local ownname = unittype == "FRIENDLY_PLAYER" and C.nameplates["friendclassnamec"] == "1"
|
||||||
|
and class and true or nil
|
||||||
|
|
||||||
|
if plate.cache.ownname ~= ownname then
|
||||||
|
plate.cache.ownname = ownname
|
||||||
|
-- ownership flipped: whichever writer is now in charge must re-assert
|
||||||
|
plate.cache.namecolor = nil
|
||||||
|
plate.cache.ownnamecolor = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- read the class colour directly rather than reusing the bar's r,g,b: the
|
||||||
|
-- bar only carries a class colour when friendclassc happens to be on, and
|
||||||
|
-- it also picks up the tapped-grey and barcombatstate overrides, neither of
|
||||||
|
-- which belongs on the name.
|
||||||
|
if ownname then
|
||||||
|
local cr, cg, cb, ca = PFUI_CLASS_COLORS[class]:GetRGBA()
|
||||||
|
if cr + cg + cb ~= plate.cache.ownnamecolor then
|
||||||
|
plate.cache.ownnamecolor = cr + cg + cb
|
||||||
|
plate.name:SetTextColor(cr, cg, cb, ca)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update combopoints
|
|
||||||
for i=1, 5 do plate.combopoints[i]:Hide() end
|
|
||||||
if target and C.nameplates.cpdisplay == "1" then
|
if target and C.nameplates.cpdisplay == "1" then
|
||||||
for i=1, GetComboPoints("target") do plate.combopoints[i]:Show() end
|
local cp = GetComboPoints("target")
|
||||||
|
if plate.cpShown ~= cp then
|
||||||
|
for i=1, 5 do plate.combopoints[i]:SetShown(i <= cp) end
|
||||||
|
plate.cpShown = cp
|
||||||
|
end
|
||||||
|
elseif plate.cpShown then
|
||||||
|
for i=1, 5 do plate.combopoints[i]:Hide() end
|
||||||
|
plate.cpShown = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update debuffs
|
-- update debuffs
|
||||||
@@ -1270,19 +1396,7 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
nameplates.OnShow = function(frame)
|
nameplates.OnShow = function(frame)
|
||||||
local frame = frame or this
|
nameplates:OnDataChanged((frame or this).nameplate)
|
||||||
local nameplate = frame.nameplate
|
|
||||||
|
|
||||||
-- cachedGuid is set by NAME_PLATE_UNIT_ADDED before this fires
|
|
||||||
local guid = nameplate.cachedGuid
|
|
||||||
if guid and pfUI.api.libunitscan and pfUI.api.libunitscan.ScanGuid then
|
|
||||||
-- notify libunitscan so it can cache unit data without mouseover
|
|
||||||
local name = nameplate.original.name:GetText()
|
|
||||||
local npcFlags = GetUnitField(guid, "npcFlags") or 0
|
|
||||||
pfUI.api.libunitscan.ScanGuid(guid, name, npcFlags == 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
nameplates:OnDataChanged(nameplate)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
nameplates.OnUpdate = function(frame, state)
|
nameplates.OnUpdate = function(frame, state)
|
||||||
@@ -1296,13 +1410,13 @@ end
|
|||||||
-- and immediately correct on de-target (unlike istarget which updates one tick later)
|
-- and immediately correct on de-target (unlike istarget which updates one tick later)
|
||||||
local targetGuid = state and state.targetGuid
|
local targetGuid = state and state.targetGuid
|
||||||
local target = (targetGuid and nameplate.cachedGuid and targetGuid == nameplate.cachedGuid) or
|
local target = (targetGuid and nameplate.cachedGuid and targetGuid == nameplate.cachedGuid) or
|
||||||
(state and state.hasTarget and frame:GetAlpha() >= 0.99) or nil
|
(state and state.targetGuid and frame:GetAlpha() >= 0.99) or nil
|
||||||
-- Target plate castbar runs on its own dedicated frame (nameplates.castbarFrame).
|
-- Target plate castbar runs on its own dedicated frame (nameplates.castbarFrame).
|
||||||
-- For non-target plates with castbar active, use castbar throttle to ensure
|
-- For non-target plates with castbar active, use castbar throttle to ensure
|
||||||
-- smooth animation without overloading the central loop.
|
-- smooth animation without overloading the central loop.
|
||||||
local isCastingNonTarget = not target and nameplate.castbar and nameplate.castbar:IsShown()
|
local isCastingNonTarget = not target and nameplate.castbar and nameplate.castbar:IsShown()
|
||||||
if not isCastingNonTarget and not target and cfg.showcastbar and nameplate.cachedGuid then
|
if not isCastingNonTarget and not target and cfg.showcastbar and nameplate.cachedGuid then
|
||||||
local castInfo = GetCastInfo(nameplate.cachedGuid)
|
local castInfo = GetCastInfo(nameplate.unit)
|
||||||
if castInfo and castInfo.endTime > now then
|
if castInfo and castInfo.endTime > now then
|
||||||
isCastingNonTarget = true
|
isCastingNonTarget = true
|
||||||
end
|
end
|
||||||
@@ -1346,7 +1460,7 @@ end
|
|||||||
local update
|
local update
|
||||||
local original = nameplate.original
|
local original = nameplate.original
|
||||||
local name = original.name:GetText()
|
local name = original.name:GetText()
|
||||||
local mouseover = state and state.hasMouseover and original.glow:IsShown() or nil
|
local mouseover = nameplate.cachedGuid and nameplate.cachedGuid == frameState.mouseoverGuid or nil
|
||||||
|
|
||||||
-- trigger queued event update
|
-- trigger queued event update
|
||||||
if hasEventUpdate then
|
if hasEventUpdate then
|
||||||
@@ -1374,8 +1488,7 @@ end
|
|||||||
|
|
||||||
if C.nameplates["overlap"] == "1" then
|
if C.nameplates["overlap"] == "1" then
|
||||||
if frame:GetWidth() > 1 then
|
if frame:GetWidth() > 1 then
|
||||||
frame:SetWidth(1)
|
frame:SetSize(1, 1)
|
||||||
frame:SetHeight(1)
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if not nameplate.dwidth then
|
if not nameplate.dwidth then
|
||||||
@@ -1383,8 +1496,9 @@ end
|
|||||||
end
|
end
|
||||||
|
|
||||||
if floor(frame:GetWidth()) ~= nameplate.dwidth then
|
if floor(frame:GetWidth()) ~= nameplate.dwidth then
|
||||||
frame:SetWidth(nameplate:GetWidth() * UIParent:GetScale())
|
local nameW, nameH = nameplate:GetSize()
|
||||||
frame:SetHeight(nameplate:GetHeight() * UIParent:GetScale())
|
local uiScale = UIParent:GetScale()
|
||||||
|
frame:SetSize(nameW * uiScale, nameH * uiScale)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1410,7 +1524,7 @@ end
|
|||||||
|
|
||||||
-- Set non-target plate alpha
|
-- Set non-target plate alpha
|
||||||
local configAlpha = cfg.notargalpha or 0.5
|
local configAlpha = cfg.notargalpha or 0.5
|
||||||
local desiredAlpha = (target or not state.hasTarget) and 1 or configAlpha
|
local desiredAlpha = (target or not state.targetGuid) and 1 or configAlpha
|
||||||
|
|
||||||
if nameplate.cachedAlpha ~= desiredAlpha then
|
if nameplate.cachedAlpha ~= desiredAlpha then
|
||||||
nameplate:SetAlpha(desiredAlpha)
|
nameplate:SetAlpha(desiredAlpha)
|
||||||
@@ -1439,39 +1553,41 @@ end
|
|||||||
update = true
|
update = true
|
||||||
end
|
end
|
||||||
|
|
||||||
-- trigger update when name color changed (includes combat state check)
|
-- trigger update when name color changed (includes combat state check).
|
||||||
local r, g, b = original.name:GetTextColor()
|
-- Skipped once OnDataChanged owns the name colour (class-coloured friendly
|
||||||
local inCombatWithPlayer = false
|
-- players), so the two writers cannot overwrite each other.
|
||||||
if cfg.namefightcolor then
|
if not nameplate.cache.ownname then
|
||||||
local guid = nameplate.cachedGuid
|
local r, g, b = original.name:GetTextColor()
|
||||||
if guid then
|
local inCombatWithPlayer = cfg.namefightcolor and UnitAffectingCombat(nameplate.unit) and UnitAffectingCombat("player")
|
||||||
inCombatWithPlayer = UnitAffectingCombat(guid) and UnitAffectingCombat("player")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if r + g + b ~= nameplate.cache.namecolor or (cfg.namefightcolor and nameplate.cache.inCombat ~= inCombatWithPlayer) then
|
|
||||||
nameplate.cache.namecolor = r + g + b
|
|
||||||
nameplate.cache.inCombat = inCombatWithPlayer
|
|
||||||
|
|
||||||
if cfg.namefightcolor then
|
if r + g + b ~= nameplate.cache.namecolor or (cfg.namefightcolor and nameplate.cache.inCombat ~= inCombatWithPlayer) then
|
||||||
if (r > .9 and g < .2 and b < .2) or inCombatWithPlayer then
|
nameplate.cache.namecolor = r + g + b
|
||||||
nameplate.name:SetTextColor(1,0.4,0.2,1)
|
nameplate.cache.inCombat = inCombatWithPlayer
|
||||||
|
|
||||||
|
if cfg.namefightcolor then
|
||||||
|
if (r > .9 and g < .2 and b < .2) or inCombatWithPlayer then
|
||||||
|
nameplate.name:SetTextColor(1,0.4,0.2,1)
|
||||||
|
else
|
||||||
|
nameplate.name:SetTextColor(r,g,b,1)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
nameplate.name:SetTextColor(r,g,b,1)
|
nameplate.name:SetTextColor(1,1,1,1)
|
||||||
end
|
end
|
||||||
else
|
update = true
|
||||||
nameplate.name:SetTextColor(1,1,1,1)
|
|
||||||
end
|
end
|
||||||
update = true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- trigger update when level color changed
|
-- trigger update when level color changed. Skipped while the level came
|
||||||
local r, g, b = original.level:GetTextColor()
|
-- from the database (?? plates), where OnDataChanged owns the colour --
|
||||||
r, g, b = r + .3, g + .3, b + .3
|
-- otherwise both writers race and cache.levelcolor goes stale, which
|
||||||
if r + g + b ~= nameplate.cache.levelcolor then
|
-- leaves a recycled plate wearing the previous unit's colour.
|
||||||
nameplate.cache.levelcolor = r + g + b
|
if not nameplate.cache.levelfromdb then
|
||||||
nameplate.level:SetTextColor(r,g,b,1)
|
local r, g, b = original.level:GetTextColor()
|
||||||
update = true
|
if r + g + b ~= nameplate.cache.levelcolor then
|
||||||
|
nameplate.cache.levelcolor = r + g + b
|
||||||
|
nameplate.level:SetTextColor(r,g,b,1)
|
||||||
|
update = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- use timer based updates
|
-- use timer based updates
|
||||||
@@ -1495,7 +1611,7 @@ end
|
|||||||
nameplate.health.targetHeight = hc
|
nameplate.health.targetHeight = hc
|
||||||
end
|
end
|
||||||
|
|
||||||
local w, h = nameplate.health:GetWidth(), nameplate.health:GetHeight()
|
local w, h = nameplate.health:GetSize()
|
||||||
local wc, hc = nameplate.health.targetWidth, nameplate.health.targetHeight
|
local wc, hc = nameplate.health.targetWidth, nameplate.health.targetHeight
|
||||||
|
|
||||||
if wc and hc then
|
if wc and hc then
|
||||||
@@ -1507,15 +1623,14 @@ end
|
|||||||
nameplate.health.zoomTransition = true
|
nameplate.health.zoomTransition = true
|
||||||
else
|
else
|
||||||
if nameplate.health.zoomTransition then
|
if nameplate.health.zoomTransition then
|
||||||
nameplate.health:SetWidth(wc)
|
nameplate.health:SetSize(wc, hc)
|
||||||
nameplate.health:SetHeight(hc)
|
|
||||||
nameplate.health.zoomTransition = nil
|
nameplate.health.zoomTransition = nil
|
||||||
end
|
end
|
||||||
nameplate.health.zoomed = true
|
nameplate.health.zoomed = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif nameplate.health.zoomed or nameplate.health.zoomTransition then
|
elseif nameplate.health.zoomed or nameplate.health.zoomTransition then
|
||||||
local w, h = nameplate.health:GetWidth(), nameplate.health:GetHeight()
|
local w, h = nameplate.health:GetSize()
|
||||||
local wc = cfg.width
|
local wc = cfg.width
|
||||||
local hc = cfg.heighthealth
|
local hc = cfg.heighthealth
|
||||||
|
|
||||||
@@ -1524,8 +1639,7 @@ end
|
|||||||
elseif h > hc + 0.5 then
|
elseif h > hc + 0.5 then
|
||||||
nameplate.health:SetHeight(h*0.95)
|
nameplate.health:SetHeight(h*0.95)
|
||||||
else
|
else
|
||||||
nameplate.health:SetWidth(wc)
|
nameplate.health:SetSize(wc, hc)
|
||||||
nameplate.health:SetHeight(hc)
|
|
||||||
nameplate.health.zoomTransition = nil
|
nameplate.health.zoomTransition = nil
|
||||||
nameplate.health.zoomed = nil
|
nameplate.health.zoomed = nil
|
||||||
nameplate.health.targetWidth = nil
|
nameplate.health.targetWidth = nil
|
||||||
@@ -1591,7 +1705,7 @@ end
|
|||||||
-- Shared castbar update logic (used by both dedicated frame and central loop)
|
-- Shared castbar update logic (used by both dedicated frame and central loop)
|
||||||
nameplates.UpdateCastbar = function(nameplate, now)
|
nameplates.UpdateCastbar = function(nameplate, now)
|
||||||
if not nameplate or not nameplate.castbar then return end
|
if not nameplate or not nameplate.castbar then return end
|
||||||
local castInfo = GetCastInfo(nameplate.cachedGuid)
|
local castInfo = GetCastInfo(nameplate.unit)
|
||||||
if not castInfo or castInfo.endTime < now then
|
if not castInfo or castInfo.endTime < now then
|
||||||
nameplate.castbar.isShown = nil
|
nameplate.castbar.isShown = nil
|
||||||
nameplate.castbar.lastEndTime = nil
|
nameplate.castbar.lastEndTime = nil
|
||||||
@@ -1607,7 +1721,7 @@ end
|
|||||||
-- Relative 0..duration range to avoid float precision loss with large
|
-- Relative 0..duration range to avoid float precision loss with large
|
||||||
-- absolute timestamps.
|
-- absolute timestamps.
|
||||||
nameplate.castbar:SetMinMaxValues(0, duration)
|
nameplate.castbar:SetMinMaxValues(0, duration)
|
||||||
nameplate.castbar:SetStatusBarColor(strsplit(",", C.appearance.castbar[(isChannel and "channelcolor" or "castbarcolor")]))
|
nameplate.castbar:SetStatusBarColor(GetStringColor(C.appearance.castbar[(isChannel and "channelcolor" or "castbarcolor")]))
|
||||||
if castInfo.icon then
|
if castInfo.icon then
|
||||||
nameplate.castbar.icon.tex:SetTexture(castInfo.icon)
|
nameplate.castbar.icon.tex:SetTexture(castInfo.icon)
|
||||||
nameplate.castbar.icon.tex:SetTexCoord(.1,.9,.1,.9)
|
nameplate.castbar.icon.tex:SetTexCoord(.1,.9,.1,.9)
|
||||||
@@ -1627,23 +1741,17 @@ end
|
|||||||
if not nameplate.castbar.isShown then nameplate.castbar.isShown = true; nameplate.castbar:Show() end
|
if not nameplate.castbar.isShown then nameplate.castbar.isShown = true; nameplate.castbar:Show() end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Dedicated frame that updates ONLY the target plate castbar.
|
-- Dedicated frame that updates ONLY the target plate castbar. Unthrottled:
|
||||||
-- Uses nameplates_castbar throttle from libthrottle.
|
-- now that casts are event-driven, this just reads the cache + SetValue, so
|
||||||
|
-- it animates the fill every frame for the smoothest sweep on the bar the
|
||||||
|
-- player watches most. (Non-target plates stay throttled via the central
|
||||||
|
-- loop's nameplates_castbar gate.)
|
||||||
nameplates.castbarFrame = CreateFrame("Frame", nil, UIParent)
|
nameplates.castbarFrame = CreateFrame("Frame", nil, UIParent)
|
||||||
nameplates.castbarFrame:SetScript("OnUpdate", function()
|
nameplates.castbarFrame:SetScript("OnUpdate", function()
|
||||||
if not cfg.showcastbar then return end
|
if not cfg.showcastbar or not frameState.targetGuid then return end
|
||||||
local now = GetTime()
|
local nameplate = plateByGuid[frameState.targetGuid]
|
||||||
local throttle = pfUI.throttle:Get("nameplates_castbar")
|
if not nameplate then return end
|
||||||
if (this.tick or 0) > now then return end
|
nameplates.UpdateCastbar(nameplate, GetTime())
|
||||||
this.tick = now + throttle
|
|
||||||
|
|
||||||
local targetGuid = UnitExists("target") and UnitGUID("target")
|
|
||||||
if not targetGuid then return end
|
|
||||||
|
|
||||||
local frame = C_NamePlate.GetNamePlateForGUID(targetGuid)
|
|
||||||
if not frame or not frame.nameplate then return end
|
|
||||||
|
|
||||||
nameplates.UpdateCastbar(frame.nameplate, now)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- set nameplate game settings
|
-- set nameplate game settings
|
||||||
|
|||||||
+19
-220
@@ -15,8 +15,7 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
|
|
||||||
pfUI.spellqueue = CreateFrame("Frame", "pfSpellQueue", UIParent)
|
pfUI.spellqueue = CreateFrame("Frame", "pfSpellQueue", UIParent)
|
||||||
pfUI.spellqueue:SetFrameStrata("HIGH")
|
pfUI.spellqueue:SetFrameStrata("HIGH")
|
||||||
pfUI.spellqueue:SetWidth(size)
|
pfUI.spellqueue:SetSize(size, size)
|
||||||
pfUI.spellqueue:SetHeight(size)
|
|
||||||
pfUI.spellqueue:Hide()
|
pfUI.spellqueue:Hide()
|
||||||
|
|
||||||
-- Position near player castbar if available
|
-- Position near player castbar if available
|
||||||
@@ -53,8 +52,7 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local eventCode = arg1
|
local eventCode, spellId = arg1, arg2
|
||||||
local spellId = arg2
|
|
||||||
|
|
||||||
if eventCode == NORMAL_QUEUED or eventCode == NON_GCD_QUEUED or eventCode == ON_SWING_QUEUED then
|
if eventCode == NORMAL_QUEUED or eventCode == NON_GCD_QUEUED or eventCode == ON_SWING_QUEUED then
|
||||||
local texture = C_Spell.GetSpellTexture(spellId)
|
local texture = C_Spell.GetSpellTexture(spellId)
|
||||||
@@ -74,21 +72,21 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
-- Shows when reactive abilities like Overpower, Revenge, Execute are usable
|
-- Shows when reactive abilities like Overpower, Revenge, Execute are usable
|
||||||
if C.unitframes.reactive_indicator == "1" then
|
if C.unitframes.reactive_indicator == "1" then
|
||||||
local size = tonumber(C.unitframes.reactive_size) or 28
|
local size = tonumber(C.unitframes.reactive_size) or 28
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
|
|
||||||
-- Reactive spells by class
|
-- Reactive spells by class
|
||||||
local reactiveSpells = {
|
local reactiveSpells = {
|
||||||
WARRIOR = {
|
WARRIOR = {
|
||||||
{ name = "Overpower", texture = "Interface\\Icons\\Ability_MeleeDamage" },
|
7384, -- Overpower
|
||||||
{ name = "Revenge", texture = "Interface\\Icons\\Ability_Warrior_Revenge" },
|
6572, -- Revenge
|
||||||
{ name = "Execute", texture = "Interface\\Icons\\INV_Sword_48" },
|
5283, -- Execute
|
||||||
},
|
},
|
||||||
ROGUE = {
|
ROGUE = {
|
||||||
{ name = "Riposte", texture = "Interface\\Icons\\Ability_Warrior_Challange" },
|
76, -- Riposte
|
||||||
},
|
},
|
||||||
HUNTER = {
|
HUNTER = {
|
||||||
{ name = "Mongoose Bite", texture = "Interface\\Icons\\Ability_Hunter_SwiftStrike" },
|
1495, -- Mongoose Bite
|
||||||
{ name = "Counterattack", texture = "Interface\\Icons\\Ability_Warrior_Challange" },
|
19306, -- Counterattack
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,21 +95,19 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
pfUI.reactive = CreateFrame("Frame", "pfReactiveIndicator", UIParent)
|
pfUI.reactive = CreateFrame("Frame", "pfReactiveIndicator", UIParent)
|
||||||
pfUI.reactive:SetFrameStrata("HIGH")
|
pfUI.reactive:SetFrameStrata("HIGH")
|
||||||
local spellCount = table.getn(spells)
|
local spellCount = table.getn(spells)
|
||||||
pfUI.reactive:SetWidth(size * spellCount + 4 * (spellCount - 1))
|
pfUI.reactive:SetSize(size * spellCount + 4 * (spellCount - 1), size)
|
||||||
pfUI.reactive:SetHeight(size)
|
|
||||||
pfUI.reactive:SetPoint("CENTER", UIParent, "CENTER", 0, -200)
|
pfUI.reactive:SetPoint("CENTER", UIParent, "CENTER", 0, -200)
|
||||||
pfUI.reactive:Hide()
|
pfUI.reactive:Hide()
|
||||||
|
|
||||||
pfUI.reactive.icons = {}
|
pfUI.reactive.icons = {}
|
||||||
for i, spell in ipairs(spells) do
|
for i, spell in ipairs(spells) do
|
||||||
local icon = CreateFrame("Frame", nil, pfUI.reactive)
|
local icon = CreateFrame("Frame", nil, pfUI.reactive)
|
||||||
icon:SetWidth(size)
|
icon:SetSize(size, size)
|
||||||
icon:SetHeight(size)
|
|
||||||
icon:SetPoint("LEFT", pfUI.reactive, "LEFT", (i-1) * (size + 4), 0)
|
icon:SetPoint("LEFT", pfUI.reactive, "LEFT", (i-1) * (size + 4), 0)
|
||||||
|
|
||||||
icon.texture = icon:CreateTexture(nil, "ARTWORK")
|
icon.texture = icon:CreateTexture(nil, "ARTWORK")
|
||||||
icon.texture:SetAllPoints(icon)
|
icon.texture:SetAllPoints(icon)
|
||||||
icon.texture:SetTexture(spell.texture)
|
icon.texture:SetTexture(C_Spell.GetSpellTexture(spell))
|
||||||
icon.texture:SetTexCoord(.08, .92, .08, .92)
|
icon.texture:SetTexCoord(.08, .92, .08, .92)
|
||||||
|
|
||||||
icon.glow = icon:CreateTexture(nil, "OVERLAY")
|
icon.glow = icon:CreateTexture(nil, "OVERLAY")
|
||||||
@@ -122,7 +118,7 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
|
|
||||||
CreateBackdrop(icon)
|
CreateBackdrop(icon)
|
||||||
icon:Hide()
|
icon:Hide()
|
||||||
icon.spellName = spell.name
|
icon.spellName = C_Spell.GetSpellName(spell)
|
||||||
pfUI.reactive.icons[i] = icon
|
pfUI.reactive.icons[i] = icon
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -132,27 +128,17 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
local anyVisible = false
|
local anyVisible = false
|
||||||
for _, icon in ipairs(this.icons) do
|
for _, icon in ipairs(this.icons) do
|
||||||
local usable = C_Spell.IsSpellUsable(icon.spellName)
|
local usable = C_Spell.IsSpellUsable(icon.spellName)
|
||||||
if usable then
|
icon:SetShown(usable)
|
||||||
icon:Show()
|
anyVisible = anyVisible or usable
|
||||||
anyVisible = true
|
|
||||||
else
|
|
||||||
icon:Hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if anyVisible then
|
|
||||||
this:Show()
|
|
||||||
else
|
|
||||||
this:Hide()
|
|
||||||
end
|
end
|
||||||
|
this:SetShown(anyVisible)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- /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.
|
||||||
@@ -160,195 +146,8 @@ pfUI:RegisterModule("nampower", function ()
|
|||||||
local arg = (msg and msg ~= "") and msg or "greens"
|
local arg = (msg and msg ~= "") and msg or "greens"
|
||||||
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) .. ")")
|
print("|cff33ffccpfUI|r: DisenchantAll(" .. tostring(target) .. ")")
|
||||||
end
|
end, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Druid Secondary Mana Bar
|
|
||||||
-- Shows base mana when druid is in shapeshift form (Bear/Cat uses Rage/Energy)
|
|
||||||
-- Uses Nampower's GetUnitField to get base mana values
|
|
||||||
-- Fully self-contained: uses its own config settings from C.unitframes.druidmana*
|
|
||||||
if GetUnitField and pfUI.uf and pfUI_config.unitframes.druidmanabar == "1" then
|
|
||||||
local rawborder, default_border = GetBorderSize("unitframes")
|
|
||||||
local DC = C.unitframes -- druid mana config lives here as druidmana* keys
|
|
||||||
|
|
||||||
-- Shared helper: create a druid mana bar on a unit frame
|
|
||||||
local function CreateDruidManaBar(parent, unit)
|
|
||||||
if not parent then return nil end
|
|
||||||
|
|
||||||
local parentConfig = parent.config
|
|
||||||
|
|
||||||
-- Read own config values
|
|
||||||
local dmHeight = tonumber(DC.druidmanaheight) or 10
|
|
||||||
local dmWidth = DC.druidmanawidth or "-1"
|
|
||||||
local dmOffX = tonumber(DC.druidmanaoffx) or 0
|
|
||||||
local dmOffY = tonumber(DC.druidmanaoffy) or 0
|
|
||||||
local dmSpace = tonumber(DC.druidmanaspace) or -3
|
|
||||||
local dmTexture = DC.druidmanatexture or "Interface\\AddOns\\pfUI\\img\\bar"
|
|
||||||
|
|
||||||
local bar = CreateFrame("StatusBar", "pfDruidMana_" .. unit, parent)
|
|
||||||
bar:SetFrameStrata(parent:GetFrameStrata())
|
|
||||||
bar:SetFrameLevel(parent:GetFrameLevel() + 5)
|
|
||||||
bar:SetStatusBarTexture(pfUI.media[dmTexture] or dmTexture)
|
|
||||||
|
|
||||||
-- Bar color: use same manacolor logic as the normal power bar
|
|
||||||
local manacolor = parentConfig.defcolor == "0" and parentConfig.manacolor or C.unitframes.manacolor
|
|
||||||
local r, g, b, a = pfUI.api.strsplit(",", manacolor)
|
|
||||||
bar:SetStatusBarColor(tonumber(r) or .25, tonumber(g) or .25, tonumber(b) or 1, tonumber(a) or 1)
|
|
||||||
|
|
||||||
-- Size: own width/height, fallback to parent power bar width if -1
|
|
||||||
local width = dmWidth ~= "-1" and tonumber(dmWidth) or nil
|
|
||||||
if width then
|
|
||||||
bar:SetWidth(width)
|
|
||||||
end
|
|
||||||
bar:SetHeight(dmHeight)
|
|
||||||
|
|
||||||
-- Position below the power bar with own spacing + offsets
|
|
||||||
local spacing = -2 * default_border - dmSpace
|
|
||||||
if width then
|
|
||||||
-- Fixed width: use single point with offset
|
|
||||||
bar:SetPoint("TOP", parent.power, "BOTTOM", dmOffX, spacing + dmOffY)
|
|
||||||
else
|
|
||||||
-- Auto width: anchor to both sides of power bar
|
|
||||||
bar:SetPoint("TOPLEFT", parent.power, "BOTTOMLEFT", dmOffX, spacing + dmOffY)
|
|
||||||
bar:SetPoint("TOPRIGHT", parent.power, "BOTTOMRIGHT", dmOffX, spacing + dmOffY)
|
|
||||||
end
|
|
||||||
bar:Hide()
|
|
||||||
|
|
||||||
CreateBackdrop(bar)
|
|
||||||
CreateBackdropShadow(bar)
|
|
||||||
|
|
||||||
-- Font settings (same logic as power bar)
|
|
||||||
local fontname = pfUI.font_unit
|
|
||||||
local fontsize = tonumber(pfUI_config.global.font_unit_size)
|
|
||||||
local fontstyle = pfUI_config.global.font_unit_style
|
|
||||||
|
|
||||||
if parentConfig.customfont == "1" then
|
|
||||||
fontname = pfUI.media[parentConfig.customfont_name]
|
|
||||||
fontsize = tonumber(parentConfig.customfont_size)
|
|
||||||
fontstyle = parentConfig.customfont_style
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Text color (always mana-colored)
|
|
||||||
local tr, tg, tb = ManaBarColor[0].r, ManaBarColor[0].g, ManaBarColor[0].b
|
|
||||||
if C.unitframes.pastel == "1" then
|
|
||||||
tr, tg, tb = (tr + .75) * .5, (tg + .75) * .5, (tb + .75) * .5
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Single center text showing current/max
|
|
||||||
bar.text = bar:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
|
||||||
bar.text:SetFontObject(GameFontWhite)
|
|
||||||
bar.text:SetFont(fontname, fontsize, fontstyle)
|
|
||||||
bar.text:SetPoint("CENTER", bar, "CENTER", 0, 0)
|
|
||||||
bar.text:SetJustifyH("CENTER")
|
|
||||||
bar.text:SetTextColor(tr, tg, tb, 1)
|
|
||||||
|
|
||||||
return bar
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Shared helper: update druid mana bar values and text
|
|
||||||
local function UpdateDruidManaBar(bar, unit)
|
|
||||||
if not UnitExists(unit) then
|
|
||||||
bar:Hide()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- For non-player units, only show if the target is a Druid
|
|
||||||
if unit ~= "player" then
|
|
||||||
local _, unitClass = UnitClass(unit)
|
|
||||||
if unitClass ~= "DRUID" then
|
|
||||||
bar:Hide()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local powerType = UnitPowerType(unit)
|
|
||||||
|
|
||||||
-- Only show when NOT using mana (i.e., in Bear/Cat form)
|
|
||||||
if powerType == 0 then
|
|
||||||
bar:Hide()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Get base mana using Nampower's GetUnitField
|
|
||||||
local baseMana, baseMaxMana
|
|
||||||
local guid = UnitGUID(unit)
|
|
||||||
|
|
||||||
if guid then
|
|
||||||
baseMana = GetUnitField(guid, "power1")
|
|
||||||
baseMaxMana = GetUnitField(guid, "maxPower1")
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Round down power values (Nampower can return decimals)
|
|
||||||
if baseMana then baseMana = math.floor(baseMana) end
|
|
||||||
if baseMaxMana then baseMaxMana = math.floor(baseMaxMana) end
|
|
||||||
|
|
||||||
if type(baseMana) ~= "number" or type(baseMaxMana) ~= "number" or baseMaxMana == 0 then
|
|
||||||
bar:Hide()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Update bar
|
|
||||||
bar:SetMinMaxValues(0, baseMaxMana)
|
|
||||||
bar:SetValue(baseMana)
|
|
||||||
|
|
||||||
-- Always show current/max
|
|
||||||
bar.text:SetText(string.format("%s/%s", Abbreviate(baseMana), Abbreviate(baseMaxMana)))
|
|
||||||
|
|
||||||
bar:Show()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ===== Player Druid Mana Bar =====
|
|
||||||
local _, playerClass = UnitClass("player")
|
|
||||||
if pfUI.uf.player and playerClass == "DRUID" then
|
|
||||||
local playerMana = CreateDruidManaBar(pfUI.uf.player, "player")
|
|
||||||
|
|
||||||
if playerMana then
|
|
||||||
playerMana:RegisterEvent("UNIT_MANA")
|
|
||||||
playerMana:RegisterEvent("UNIT_MAXMANA")
|
|
||||||
playerMana:RegisterEvent("UNIT_DISPLAYPOWER")
|
|
||||||
playerMana:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
|
|
||||||
playerMana:RegisterEvent("PLAYER_LOGOUT")
|
|
||||||
playerMana:SetScript("OnEvent", function()
|
|
||||||
if event == "PLAYER_LOGOUT" then
|
|
||||||
this:UnregisterAllEvents()
|
|
||||||
this:SetScript("OnEvent", nil)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if arg1 == nil or arg1 == "player" then
|
|
||||||
UpdateDruidManaBar(playerMana, "player")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Initial update
|
|
||||||
UpdateDruidManaBar(playerMana, "player")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ===== Target Druid Mana Bar =====
|
|
||||||
if pfUI.uf.target then
|
|
||||||
local targetMana = CreateDruidManaBar(pfUI.uf.target, "target")
|
|
||||||
|
|
||||||
if targetMana then
|
|
||||||
targetMana:RegisterEvent("UNIT_MANA")
|
|
||||||
targetMana:RegisterEvent("UNIT_MAXMANA")
|
|
||||||
targetMana:RegisterEvent("UNIT_DISPLAYPOWER")
|
|
||||||
targetMana:RegisterEvent("PLAYER_TARGET_CHANGED")
|
|
||||||
targetMana:RegisterEvent("PLAYER_LOGOUT")
|
|
||||||
targetMana:SetScript("OnEvent", function()
|
|
||||||
if event == "PLAYER_LOGOUT" then
|
|
||||||
this:UnregisterAllEvents()
|
|
||||||
this:SetScript("OnEvent", nil)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if event == "PLAYER_TARGET_CHANGED" or arg1 == nil or arg1 == "target" then
|
|
||||||
UpdateDruidManaBar(targetMana, "target")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- Initial update
|
|
||||||
UpdateDruidManaBar(targetMana, "target")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
pfUI:RegisterModule("newitem", function ()
|
||||||
|
if not pfUI.bag then return end
|
||||||
|
if C.appearance.bags.newitem ~= "1" then return end
|
||||||
|
|
||||||
|
pfUI.newitem = {}
|
||||||
|
|
||||||
|
local r, g, b, a = pfUI.api.GetStringColor(C.appearance.bags.newitem_color)
|
||||||
|
|
||||||
|
function pfUI.newitem:UpdateSlot(bag, slot)
|
||||||
|
if bag < 0 or bag > 4 then return end
|
||||||
|
if not pfUI.bags[bag] then return end
|
||||||
|
if not pfUI.bags[bag].slots[slot] then return end
|
||||||
|
|
||||||
|
local frame = pfUI.bags[bag].slots[slot].frame
|
||||||
|
|
||||||
|
if frame.hasItem and C_NewItems.IsNewItem(bag, slot) then
|
||||||
|
if not frame.newitem then
|
||||||
|
local glow = frame:CreateTexture(nil, "OVERLAY")
|
||||||
|
glow:SetTexture("Interface\\Buttons\\UI-ActionButton-Border")
|
||||||
|
glow:SetBlendMode("ADD")
|
||||||
|
glow:SetVertexColor(r, g, b, a)
|
||||||
|
glow:SetPoint("CENTER", frame, "CENTER")
|
||||||
|
glow:Hide()
|
||||||
|
glow.RefreshSize = function(g)
|
||||||
|
local w = g:GetParent():GetWidth()
|
||||||
|
if w > 0 then g:SetSize(w * 1.8, w * 1.8) end
|
||||||
|
end
|
||||||
|
frame.newitem = glow
|
||||||
|
|
||||||
|
frame:HookScript("OnEnter", function()
|
||||||
|
C_NewItems.RemoveNewItem(bag, slot)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
frame.newitem:RefreshSize()
|
||||||
|
frame.newitem:Show()
|
||||||
|
elseif frame.newitem and frame.newitem:IsShown() then
|
||||||
|
frame.newitem:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- The new-item set can change without any slot's contents changing (an item
|
||||||
|
-- acknowledged, pruned when it leaves the bags, or ClearAll) -- re-evaluate
|
||||||
|
-- every decorated slot when that happens.
|
||||||
|
function pfUI.newitem:RefreshAll()
|
||||||
|
for bag in pairs(pfUI.bags) do
|
||||||
|
local slots = pfUI.bags[bag] and pfUI.bags[bag].slots
|
||||||
|
if slots then
|
||||||
|
for slot in pairs(slots) do
|
||||||
|
pfUI.newitem:UpdateSlot(bag, slot)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- per-slot: pfUI re-runs UpdateSlot whenever a slot's contents change.
|
||||||
|
hooksecurefunc(pfUI.bag, "UpdateSlot", function(self, bag, slot)
|
||||||
|
pfUI.newitem:UpdateSlot(bag, slot)
|
||||||
|
end)
|
||||||
|
|
||||||
|
EventRegistry:RegisterFrameEventAndCallback("BAG_NEW_ITEMS_UPDATED", function()
|
||||||
|
pfUI.newitem:RefreshAll()
|
||||||
|
end)
|
||||||
|
|
||||||
|
pfUI.events:RegisterCallback("bag:closed", function(_, object)
|
||||||
|
if object then return end
|
||||||
|
C_NewItems.ClearAll()
|
||||||
|
end, "newitem")
|
||||||
|
end)
|
||||||
+24
-51
@@ -37,18 +37,12 @@ pfUI:RegisterModule("panel", function()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
if arg1 == "LeftButton" then
|
if arg1 == "LeftButton" then
|
||||||
if widget.timerFrame:IsShown() then
|
widget.timerFrame:SetShown(not widget.timerFrame:IsShown())
|
||||||
widget.timerFrame:Hide()
|
|
||||||
else
|
|
||||||
widget.timerFrame:Show()
|
|
||||||
end
|
|
||||||
elseif arg1 == "RightButton" then
|
elseif arg1 == "RightButton" then
|
||||||
widget.timerFrame.Snapshot = GetTime()
|
widget.timerFrame.Snapshot = GetTime()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
widget:SetScript("OnUpdate",function()
|
C_Timer.NewTicker(1, function()
|
||||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + 1 end
|
|
||||||
|
|
||||||
local secondsenabled = C.panel.seconds == "1"
|
local secondsenabled = C.panel.seconds == "1"
|
||||||
local fmt
|
local fmt
|
||||||
if C.global.twentyfour == "0" then
|
if C.global.twentyfour == "0" then
|
||||||
@@ -62,8 +56,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
|
|
||||||
widget.timerFrame = CreateFrame("Frame", "pfUITimer", UIParent)
|
widget.timerFrame = CreateFrame("Frame", "pfUITimer", UIParent)
|
||||||
widget.timerFrame:Hide()
|
widget.timerFrame:Hide()
|
||||||
widget.timerFrame:SetWidth(120)
|
widget.timerFrame:SetSize(120, 35)
|
||||||
widget.timerFrame:SetHeight(35)
|
|
||||||
widget.timerFrame:SetPoint("TOP", 0, -100)
|
widget.timerFrame:SetPoint("TOP", 0, -100)
|
||||||
UpdateMovable(widget.timerFrame)
|
UpdateMovable(widget.timerFrame)
|
||||||
|
|
||||||
@@ -103,11 +96,9 @@ pfUI:RegisterModule("panel", function()
|
|||||||
pfUI.panel:OutputPanel("combat", T["Combat"] .. ": " .. NOT_APPLICABLE)
|
pfUI.panel:OutputPanel("combat", T["Combat"] .. ": " .. NOT_APPLICABLE)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
widget.combat:SetScript("OnUpdate", function()
|
C_Timer.NewTicker(1, function()
|
||||||
if not this.tick then this.tick = GetTime() end
|
if widget.combat.combat then
|
||||||
if GetTime() <= this.tick + 1 then return else this.tick = GetTime() end
|
pfUI.panel:OutputPanel("combat", "|cffffaaaa" .. SecondsToTime(ceil(GetTime() - widget.combat.combat)))
|
||||||
if this.combat then
|
|
||||||
pfUI.panel:OutputPanel("combat", "|cffffaaaa" .. SecondsToTime(ceil(GetTime() - this.combat)))
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@@ -153,9 +144,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
pfUI.addons:Show()
|
pfUI.addons:Show()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
widget:SetScript("OnUpdate",function()
|
C_Timer.NewTicker(1, function()
|
||||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + 1 end
|
|
||||||
|
|
||||||
fps = floor(GetFramerate())
|
fps = floor(GetFramerate())
|
||||||
_, _, lag = GetNetStats()
|
_, _, lag = GetNetStats()
|
||||||
|
|
||||||
@@ -307,18 +296,18 @@ pfUI:RegisterModule("panel", function()
|
|||||||
local playerzone = GetRealZoneText()
|
local playerzone = GetRealZoneText()
|
||||||
|
|
||||||
for friendIndex=1, all do
|
for friendIndex=1, all do
|
||||||
local friend_name, friend_level, friend_class, friend_area, friend_connected = GetFriendInfo(friendIndex)
|
local info = C_FriendList.GetFriendInfoByIndex(friendIndex)
|
||||||
if friend_connected and friend_class and friend_level then
|
if info and info.connected and info.classFilename and info.level then
|
||||||
if not init then
|
if not init then
|
||||||
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
||||||
GameTooltip:ClearLines()
|
GameTooltip:ClearLines()
|
||||||
GameTooltip:AddLine("|cff555555" .. T["Friends Online"])
|
GameTooltip:AddLine("|cff555555" .. T["Friends Online"])
|
||||||
init = true
|
init = true
|
||||||
end
|
end
|
||||||
local ccolor = PFUI_CLASS_COLORS[L["class"][friend_class]] or { 1, 1, 1 }
|
local ccolor = PFUI_CLASS_COLORS[info.classFilename]
|
||||||
local lcolor = GetDifficultyColor(tonumber(friend_level)) or { 1, 1, 1 }
|
local lcolor = GetDifficultyColor(tonumber(info.level)) or { 1, 1, 1 }
|
||||||
local zcolor = friend_area == playerzone and "|cff33ffcc" or "|cffcccccc"
|
local zcolor = info.area == playerzone and "|cff33ffcc" or "|cffcccccc"
|
||||||
GameTooltip:AddDoubleLine(rgbhex(ccolor) .. friend_name .. rgbhex(lcolor) .. " [" .. friend_level .. "]", zcolor .. friend_area)
|
GameTooltip:AddDoubleLine(ccolor:WrapTextInColorCode(info.name) .. rgbhex(lcolor) .. " [" .. info.level .. "]", zcolor .. info.area)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -326,15 +315,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
end
|
end
|
||||||
widget.Click = function() ToggleFriendsFrame(1) end
|
widget.Click = function() ToggleFriendsFrame(1) end
|
||||||
widget:SetScript("OnEvent", function()
|
widget:SetScript("OnEvent", function()
|
||||||
local online = 0
|
local online = C_FriendList.GetNumOnlineFriends()
|
||||||
local all = GetNumFriends()
|
|
||||||
for friendIndex=1, all do
|
|
||||||
local friend_name, friend_level, friend_class, friend_area, friend_connected = GetFriendInfo(friendIndex)
|
|
||||||
if ( friend_connected ) then
|
|
||||||
online = online + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
pfUI.panel:OutputPanel("friends", FRIENDS .. ": " .. online, widget.Tooltip, widget.Click)
|
pfUI.panel:OutputPanel("friends", FRIENDS .. ": " .. online, widget.Tooltip, widget.Click)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@@ -346,7 +327,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
widget:RegisterEvent("PLAYER_GUILD_UPDATE")
|
widget:RegisterEvent("PLAYER_GUILD_UPDATE")
|
||||||
widget.Tooltip = function()
|
widget.Tooltip = function()
|
||||||
-- skip without guild
|
-- skip without guild
|
||||||
if not GetGuildInfo("player") then return end
|
if not IsInGuild() then return end
|
||||||
|
|
||||||
local raidparty = {}
|
local raidparty = {}
|
||||||
for i=1,4 do -- detect people in group
|
for i=1,4 do -- detect people in group
|
||||||
@@ -398,7 +379,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
end
|
end
|
||||||
widget.Click = function() ToggleFriendsFrame(3) end
|
widget.Click = function() ToggleFriendsFrame(3) end
|
||||||
widget:SetScript("OnEvent", function()
|
widget:SetScript("OnEvent", function()
|
||||||
if GetGuildInfo("player") then
|
if IsInGuild() then
|
||||||
local count = 0
|
local count = 0
|
||||||
for i = 1, GetNumGuildMembers() do
|
for i = 1, GetNumGuildMembers() do
|
||||||
local _, _, _, _, _, _, _, _, online = GetGuildRosterInfo(i)
|
local _, _, _, _, _, _, _, _, online = GetGuildRosterInfo(i)
|
||||||
@@ -411,9 +392,8 @@ pfUI:RegisterModule("panel", function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
widget:SetScript("OnUpdate",function()
|
C_Timer.NewTicker(60, function()
|
||||||
if ( this.tick or 60) > GetTime() then return else this.tick = GetTime() + 60 end
|
if IsInGuild() then GuildRoster() end
|
||||||
if GetGuildInfo("player") then GuildRoster() end
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -492,11 +472,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
widget.Click = function()
|
widget.Click = function()
|
||||||
if WorldMapFrame:IsShown() then
|
WorldMapFrame:SetShown(not WorldMapFrame:IsShown())
|
||||||
WorldMapFrame:Hide()
|
|
||||||
else
|
|
||||||
WorldMapFrame:Show()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
widget:SetScript("OnEvent", function()
|
widget:SetScript("OnEvent", function()
|
||||||
pfUI.panel:OutputPanel("zone", GetMinimapZoneText(), widget.Tooltip, widget.Click)
|
pfUI.panel:OutputPanel("zone", GetMinimapZoneText(), widget.Tooltip, widget.Click)
|
||||||
@@ -645,8 +621,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
local frame = CreateFrame("Button", nil, parent)
|
local frame = CreateFrame("Button", nil, parent)
|
||||||
frame:SetFrameLevel(0)
|
frame:SetFrameLevel(0)
|
||||||
frame:ClearAllPoints()
|
frame:ClearAllPoints()
|
||||||
frame:SetWidth(width)
|
frame:SetSize(width, parent:GetHeight())
|
||||||
frame:SetHeight(parent:GetHeight())
|
|
||||||
frame:SetPoint(location, 0, 0)
|
frame:SetPoint(location, 0, 0)
|
||||||
frame.text = frame:CreateFontString("Status", "LOW", "GameFontNormal")
|
frame.text = frame:CreateFontString("Status", "LOW", "GameFontNormal")
|
||||||
frame.text:ClearAllPoints()
|
frame.text:ClearAllPoints()
|
||||||
@@ -687,8 +662,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
local imgstring = "img:" .. leftright
|
local imgstring = "img:" .. leftright
|
||||||
parent.texture:SetTexture(pfUI.media[imgstring])
|
parent.texture:SetTexture(pfUI.media[imgstring])
|
||||||
parent.texture:SetPoint("CENTER", 0, 0)
|
parent.texture:SetPoint("CENTER", 0, 0)
|
||||||
parent.texture:SetWidth(8)
|
parent.texture:SetSize(8, 8)
|
||||||
parent.texture:SetHeight(8)
|
|
||||||
parent.texture:SetVertexColor(.25,.25,.25,1)
|
parent.texture:SetVertexColor(.25,.25,.25,1)
|
||||||
return parent.texture
|
return parent.texture
|
||||||
end
|
end
|
||||||
@@ -710,7 +684,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
UpdateMovable(pfUI.panel.left)
|
UpdateMovable(pfUI.panel.left)
|
||||||
|
|
||||||
pfUI.panel.left.hide:SetScript("OnClick", function()
|
pfUI.panel.left.hide:SetScript("OnClick", function()
|
||||||
if pfUI.chat.left:IsShown() then pfUI.chat.left:Hide() else pfUI.chat.left:Show() end
|
pfUI.chat.left:SetShown(not pfUI.chat.left:IsShown())
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if not pfUI.chat then pfUI.panel.left.hide:Hide() end
|
if not pfUI.chat then pfUI.panel.left.hide:Hide() end
|
||||||
@@ -747,7 +721,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
UpdateMovable(pfUI.panel.right)
|
UpdateMovable(pfUI.panel.right)
|
||||||
|
|
||||||
pfUI.panel.right.hide:SetScript("OnClick", function()
|
pfUI.panel.right.hide:SetScript("OnClick", function()
|
||||||
if pfUI.chat.right:IsShown() then pfUI.chat.right:Hide() else pfUI.chat.right:Show() end
|
pfUI.chat.right:SetShown(not pfUI.chat.right:IsShown())
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if not pfUI.chat then pfUI.panel.right.hide:Hide() end
|
if not pfUI.chat then pfUI.panel.right.hide:Hide() end
|
||||||
@@ -796,8 +770,7 @@ pfUI:RegisterModule("panel", function()
|
|||||||
pfUI.panel.microbutton = CreateFrame("Frame", "pfPanelMicroButton", UIParent)
|
pfUI.panel.microbutton = CreateFrame("Frame", "pfPanelMicroButton", UIParent)
|
||||||
pfUI.panel.microbutton:SetPoint("TOP", pfUI.panel.minimap, "BOTTOM", 0, -2*default_border)
|
pfUI.panel.microbutton:SetPoint("TOP", pfUI.panel.minimap, "BOTTOM", 0, -2*default_border)
|
||||||
UpdateMovable(pfUI.panel.microbutton)
|
UpdateMovable(pfUI.panel.microbutton)
|
||||||
pfUI.panel.microbutton:SetHeight(23)
|
pfUI.panel.microbutton:SetSize(145, 23)
|
||||||
pfUI.panel.microbutton:SetWidth(145)
|
|
||||||
pfUI.panel.microbutton:SetFrameStrata("MEDIUM")
|
pfUI.panel.microbutton:SetFrameStrata("MEDIUM")
|
||||||
|
|
||||||
for i=1,table.getn(MICRO_BUTTONS) do
|
for i=1,table.getn(MICRO_BUTTONS) do
|
||||||
|
|||||||
+34
-39
@@ -34,22 +34,25 @@ pfUI:RegisterModule("player", function ()
|
|||||||
playerFrame.infoTopCenterText:SetHeight(14)
|
playerFrame.infoTopCenterText:SetHeight(14)
|
||||||
end
|
end
|
||||||
|
|
||||||
local _, myclass = UnitClass("player")
|
local myclass = UnitClassBase("player")
|
||||||
playerFrame.myclass = myclass
|
playerFrame.myclass = myclass
|
||||||
playerFrame.isSpellCaster = myclass ~= "WARRIOR" and myclass ~= "ROGUE" and myclass ~= "HUNTER"
|
playerFrame.isSpellCaster = myclass ~= "WARRIOR" and myclass ~= "ROGUE" and myclass ~= "HUNTER"
|
||||||
|
|
||||||
-- Convert "r,g,b,a" config color string to a 6-char hex string, or nil if unset
|
-- Convert "r,g,b,a" config color string to a 6-char hex string, or nil if unset
|
||||||
local function cfgColorToHex(colorStr)
|
local cfgColorToHexTable = setmetatable({}, {
|
||||||
if not colorStr or colorStr == "" then return nil end
|
__index = function (t, colorStr)
|
||||||
local r, g, b = strsplit(",", colorStr)
|
if not colorStr or colorStr == "" then return nil end
|
||||||
r, g, b = tonumber(r), tonumber(g), tonumber(b)
|
local r, g, b = GetStringColor(colorStr)
|
||||||
if not r or not g or not b then return nil end
|
if not r or not g or not b then return nil end
|
||||||
return string.format("%02X%02X%02X", r * 255, g * 255, b * 255)
|
local hex = C_ColorUtil.GenerateTextColorCode({ r=r, g = g, b=b})
|
||||||
end
|
rawset(t, colorStr, hex)
|
||||||
|
return hex
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
-- SP school colors indexed by GetSpellPower("net") return order
|
-- SP school colors indexed by GetSpellBonusDamage's 1-based school order
|
||||||
-- (1=phys, 2=holy, 3=fire, 4=nature, 5=frost, 6=shadow, 7=arcane)
|
-- (1=phys, 2=holy, 3=fire, 4=nature, 5=frost, 6=shadow, 7=arcane)
|
||||||
local spColors = { "FFFFFF", "FFFF80", "FF8000", "4DFF4D", "80FFFF", "9482C9", "FFFFFF" }
|
local spColors = { "FFFFFFFF", "FFFFFF80", "FFFF8000", "FF4DFF4D", "FF80FFFF", "FF9482C9", "FFFFFFFF" }
|
||||||
|
|
||||||
-- Default SP school per class used as tiebreaker when multiple schools are equal
|
-- Default SP school per class used as tiebreaker when multiple schools are equal
|
||||||
local spDefaultSchool = {
|
local spDefaultSchool = {
|
||||||
@@ -60,53 +63,45 @@ pfUI:RegisterModule("player", function ()
|
|||||||
|
|
||||||
-- Compute and cache the haste/SP text; called from OnUpdate, throttled to 0.25s
|
-- Compute and cache the haste/SP text; called from OnUpdate, throttled to 0.25s
|
||||||
local function UpdateInfoText()
|
local function UpdateInfoText()
|
||||||
if not GetUnitField then return end -- do nothing for older nampower
|
|
||||||
|
|
||||||
local cfg = playerFrame.config
|
local cfg = playerFrame.config
|
||||||
if not cfg then
|
if not cfg then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- display_haste: "0"=hidden, "1"=show modCastSpeed (gear haste). Talent-
|
-- display_haste: "0"=hidden, "1"=show cast-speed haste (UnitSpellHaste,
|
||||||
-- side cast-time reductions show up in the actual cast bar via
|
-- from UNIT_MOD_CAST_SPEED). Talent/spell-specific cast-time reductions
|
||||||
-- C_Spell.UnitCastingInfo; double-folding them into this overlay was
|
-- show up in the actual cast bar via C_Spell.UnitCastingInfo; folding them
|
||||||
-- mixing two different concepts into one number.
|
-- in here too was mixing two different concepts into one number.
|
||||||
local showHaste = cfg.display_haste == "1"
|
|
||||||
local showSP = cfg.display_spellpower == "1"
|
|
||||||
|
|
||||||
local isSpellCaster = playerFrame.isSpellCaster
|
local isSpellCaster = playerFrame.isSpellCaster
|
||||||
if (not showHaste or not isSpellCaster) and not showSP then
|
local showHaste = isSpellCaster and cfg.display_haste == "1"
|
||||||
|
local showSP = isSpellCaster and cfg.display_spellpower == "1"
|
||||||
|
|
||||||
|
if not showHaste and not showSP then
|
||||||
playerFrame.infoTopCenterText:SetText("")
|
playerFrame.infoTopCenterText:SetText("")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local haste = GetUnitField("player", "modCastSpeed")
|
local parts = {}
|
||||||
local text = ""
|
|
||||||
|
|
||||||
if showHaste and isSpellCaster and haste then
|
if showHaste then
|
||||||
local hasteHex = cfgColorToHex(cfg.display_haste_color) or "FFFFFF"
|
local hex = cfgColorToHexTable[cfg.display_haste_color] or "FFFFFFFF"
|
||||||
text = string.format("|cff%s%.1f%%|r", hasteHex, (1 / haste - 1) * 100)
|
table.insert(parts, string.format("|c%s%.1f%%|r", hex, UnitSpellHaste("player")))
|
||||||
end
|
end
|
||||||
|
|
||||||
if showSP and isSpellCaster then
|
if showSP then
|
||||||
local schools = { GetSpellPower("net") }
|
local school = spDefaultSchool[myclass] or 2
|
||||||
local defSchool = spDefaultSchool[myclass] or 2
|
local maxSP = GetSpellBonusDamage(school) or 0
|
||||||
local maxSP = schools[defSchool] or 0
|
|
||||||
local maxColor = spColors[defSchool]
|
|
||||||
for i = 2, 7 do -- skip physical (1)
|
for i = 2, 7 do -- skip physical (1)
|
||||||
local v = schools[i] or 0
|
local v = GetSpellBonusDamage(i) or 0
|
||||||
if v > maxSP then
|
if v > maxSP then maxSP, school = v, i end
|
||||||
maxSP = v
|
|
||||||
maxColor = spColors[i]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if maxSP > 0 then
|
if maxSP > 0 then
|
||||||
local spHex = (cfg.display_sp_color_override == "1" and cfgColorToHex(cfg.display_sp_color)) or maxColor
|
local hex = (cfg.display_sp_color_override == "1" and cfgColorToHexTable[cfg.display_sp_color]) or spColors[school]
|
||||||
if text ~= "" then text = text .. " " end
|
table.insert(parts, string.format("|c%s+%d SP|r", hex, maxSP))
|
||||||
text = text .. string.format("|cff%s+%d SP|r", spHex, maxSP)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
playerFrame.infoTopCenterText:SetText(text)
|
playerFrame.infoTopCenterText:SetText(table.concat(parts, " "))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Keep a reference to the generic UF UpdateConfig so we can chain it
|
-- Keep a reference to the generic UF UpdateConfig so we can chain it
|
||||||
|
|||||||
+57
-36
@@ -1,8 +1,43 @@
|
|||||||
pfUI:RegisterModule("questitem", function ()
|
pfUI:RegisterModule("questitem", function ()
|
||||||
-- [itemID] = { index = questLogIndex, count = requiredCount }. Rebuilt
|
|
||||||
-- on QUEST_LOG_UPDATE from ClassicAPI's per-quest cached requirements.
|
|
||||||
local requiredItems = {}
|
local requiredItems = {}
|
||||||
|
|
||||||
|
local function AddQuest(questID)
|
||||||
|
local details = C_QuestLog.GetQuestDetails(questID)
|
||||||
|
if not details then return false end
|
||||||
|
if details.requirements then
|
||||||
|
for _, req in ipairs(details.requirements) do
|
||||||
|
if req.kind == "item" and req.id and req.id > 0 then
|
||||||
|
requiredItems[req.id] = {
|
||||||
|
questID = questID,
|
||||||
|
title = details.title,
|
||||||
|
level = details.level,
|
||||||
|
count = req.count,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function RemoveQuest(questID)
|
||||||
|
for itemID, entry in pairs(requiredItems) do
|
||||||
|
if entry.questID == questID then requiredItems[itemID] = nil end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Seed()
|
||||||
|
for k in pairs(requiredItems) do requiredItems[k] = nil end
|
||||||
|
local complete = true
|
||||||
|
local i = 1
|
||||||
|
while true do
|
||||||
|
local questID = C_QuestLog.GetQuestIDForLogIndex(i)
|
||||||
|
if questID == nil then break end
|
||||||
|
if questID > 0 and not AddQuest(questID) then complete = false end
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
return complete
|
||||||
|
end
|
||||||
|
|
||||||
local function AddTooltip(frame, itemID)
|
local function AddTooltip(frame, itemID)
|
||||||
if not itemID then return end
|
if not itemID then return end
|
||||||
if C.tooltip.questitem.showquest ~= "1" then return end
|
if C.tooltip.questitem.showquest ~= "1" then return end
|
||||||
@@ -19,7 +54,7 @@ pfUI:RegisterModule("questitem", function ()
|
|||||||
if not entry and not replace then return end
|
if not entry and not replace then return end
|
||||||
|
|
||||||
local quest, level = UNKNOWN, 255
|
local quest, level = UNKNOWN, 255
|
||||||
if entry then quest, level = GetQuestLogTitle(entry.index) end
|
if entry then quest, level = entry.title, entry.level end
|
||||||
if not quest then return end
|
if not quest then return end
|
||||||
|
|
||||||
local color = GetDifficultyColor(level)
|
local color = GetDifficultyColor(level)
|
||||||
@@ -42,48 +77,37 @@ pfUI:RegisterModule("questitem", function ()
|
|||||||
pfUI.questitem = CreateFrame("Frame", "pfQuestItemScanner", UIParent)
|
pfUI.questitem = CreateFrame("Frame", "pfQuestItemScanner", UIParent)
|
||||||
pfUI.questitem:RegisterEvent("PLAYER_ENTERING_WORLD")
|
pfUI.questitem:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
pfUI.questitem:RegisterEvent("QUEST_LOG_UPDATE")
|
pfUI.questitem:RegisterEvent("QUEST_LOG_UPDATE")
|
||||||
|
pfUI.questitem:RegisterEvent("QUEST_ACCEPTED")
|
||||||
|
pfUI.questitem:RegisterEvent("QUEST_REMOVED")
|
||||||
pfUI.questitem:SetScript("OnEvent", function()
|
pfUI.questitem:SetScript("OnEvent", function()
|
||||||
-- debounce rebuilds — QUEST_LOG_UPDATE fires in bursts
|
if C.tooltip.questitem.showquest ~= "1" then return end
|
||||||
this.run = GetTime() + .5
|
if event == "QUEST_ACCEPTED" then -- arg1 = logIndex, arg2 = questID
|
||||||
|
if not AddQuest(arg2) then -- cache cold (rare) -> reseed
|
||||||
|
this.seeding = true
|
||||||
|
this.run = GetTime() + .5
|
||||||
|
end
|
||||||
|
elseif event == "QUEST_REMOVED" then -- arg1 = questID
|
||||||
|
RemoveQuest(arg1)
|
||||||
|
elseif event == "PLAYER_ENTERING_WORLD" then
|
||||||
|
this.seeding = true -- seed pre-existing quests
|
||||||
|
this.run = GetTime() + .5
|
||||||
|
elseif event == "QUEST_LOG_UPDATE" and this.seeding then
|
||||||
|
this.run = GetTime() + .5 -- keep retrying while cache warms
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
pfUI.questitem:SetScript("OnUpdate", function()
|
pfUI.questitem:SetScript("OnUpdate", function()
|
||||||
if C.tooltip.questitem.showquest ~= "1" then return end
|
|
||||||
if not this.run or GetTime() < this.run then return end
|
if not this.run or GetTime() < this.run then return end
|
||||||
|
|
||||||
for k in pairs(requiredItems) do requiredItems[k] = nil end
|
|
||||||
|
|
||||||
-- GetQuestIDForLogIndex returns nil past the end, 0 for headers, else
|
|
||||||
-- the questID. GetQuestDetails reads the engine's static-info cache —
|
|
||||||
-- nil if not yet populated; we'll catch it on the next refresh.
|
|
||||||
local i = 1
|
|
||||||
while true do
|
|
||||||
local questID = C_QuestLog.GetQuestIDForLogIndex(i)
|
|
||||||
if questID == nil then break end
|
|
||||||
if questID > 0 then
|
|
||||||
local details = C_QuestLog.GetQuestDetails(questID)
|
|
||||||
if details and details.requirements then
|
|
||||||
for _, req in ipairs(details.requirements) do
|
|
||||||
if req.kind == "item" and req.id and req.id > 0 then
|
|
||||||
requiredItems[req.id] = { index = i, count = req.count }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
i = i + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
this.run = nil
|
this.run = nil
|
||||||
|
if Seed() then this.seeding = nil end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- reload quest entries on config change
|
|
||||||
pfUI.questitem.UpdateConfig = function()
|
pfUI.questitem.UpdateConfig = function()
|
||||||
|
if C.tooltip.questitem.showquest ~= "1" then return end
|
||||||
|
pfUI.questitem.seeding = true
|
||||||
pfUI.questitem.run = GetTime() + .5
|
pfUI.questitem.run = GetTime() + .5
|
||||||
end
|
end
|
||||||
|
|
||||||
-- regular tooltip: catch every Show via a child frame's OnShow, then ask
|
|
||||||
-- the tooltip directly for the item it's displaying. Replaces a libtooltip
|
|
||||||
-- indirection that did the same query with extra caching layers.
|
|
||||||
pfUI.questitem.tooltip = CreateFrame("Frame", "pfQuestItems", GameTooltip)
|
pfUI.questitem.tooltip = CreateFrame("Frame", "pfQuestItems", GameTooltip)
|
||||||
pfUI.questitem.tooltip:SetScript("OnShow", function()
|
pfUI.questitem.tooltip:SetScript("OnShow", function()
|
||||||
if GameTooltip:HasItem() then
|
if GameTooltip:HasItem() then
|
||||||
@@ -92,9 +116,6 @@ pfUI:RegisterModule("questitem", function ()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- itemref tooltip (chat link clicks): hooksecurefunc runs after SetItemRef
|
|
||||||
-- 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.
|
|
||||||
hooksecurefunc("SetItemRef", function()
|
hooksecurefunc("SetItemRef", function()
|
||||||
if IsModifierKeyDown() then return end
|
if IsModifierKeyDown() then return end
|
||||||
if ItemRefTooltip:HasItem() then
|
if ItemRefTooltip:HasItem() then
|
||||||
|
|||||||
+143
-11
@@ -4,7 +4,9 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
|
|
||||||
-- tell RaidFrame.lua pfUI replaces party frames
|
-- tell RaidFrame.lua pfUI replaces party frames
|
||||||
HookAddonOrVariable("Blizzard_RaidUI", function()
|
HookAddonOrVariable("Blizzard_RaidUI", function()
|
||||||
GROUP_REPLACE_PARTY = "1"
|
-- must reach _G: RaidFrame.lua reads this global, and pfUI.env has
|
||||||
|
-- __index but no __newindex, so a bare assignment stays in the sandbox
|
||||||
|
_G.GROUP_REPLACE_PARTY = "1"
|
||||||
end)
|
end)
|
||||||
|
|
||||||
pfUI.uf.raid = CreateFrame("Frame", "pfRaidUpdater", UIParent)
|
pfUI.uf.raid = CreateFrame("Frame", "pfRaidUpdater", UIParent)
|
||||||
@@ -13,11 +15,32 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
local rawborder, default_border = GetBorderSize("chat")
|
local rawborder, default_border = GetBorderSize("chat")
|
||||||
local cluster = CreateFrame("Frame", "pfRaidCluster", UIParent)
|
local cluster = CreateFrame("Frame", "pfRaidCluster", UIParent)
|
||||||
cluster:SetFrameLevel(20)
|
cluster:SetFrameLevel(20)
|
||||||
cluster:SetWidth(120)
|
cluster:SetSize(120, 10)
|
||||||
cluster:SetHeight(10)
|
|
||||||
cluster:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", default_border*2, C.chat.left.height + default_border*5)
|
cluster:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", default_border*2, C.chat.left.height + default_border*5)
|
||||||
UpdateMovable(cluster)
|
UpdateMovable(cluster)
|
||||||
|
|
||||||
|
-- Separate, independently-movable block that mirrors the raid grid layout
|
||||||
|
-- for pet frames (raidpet1..40). Defaults to the right of the raid grid.
|
||||||
|
local petcluster = CreateFrame("Frame", "pfRaidPetCluster", UIParent)
|
||||||
|
petcluster:SetFrameLevel(20)
|
||||||
|
petcluster:SetSize(120, 10)
|
||||||
|
petcluster:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", default_border*2 + 300, C.chat.left.height + default_border*5)
|
||||||
|
UpdateMovable(petcluster)
|
||||||
|
|
||||||
|
-- flat pool of pet frames, laid out by LayoutPets (mirror or collapsed)
|
||||||
|
pfUI.uf.raid.pets = {}
|
||||||
|
|
||||||
|
-- 1-based grid slot -> (row, col) for the current fill direction, matching
|
||||||
|
-- the raid grid's own fill loops.
|
||||||
|
local function SlotToCoord(slot, fill, x, y)
|
||||||
|
slot = slot - 1
|
||||||
|
if fill == "VERTICAL" then
|
||||||
|
return floor(slot / y) + 1, mod(slot, y) + 1
|
||||||
|
else
|
||||||
|
return mod(slot, x) + 1, floor(slot / x) + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
pfUI.uf.raid.tanksfirst = {
|
pfUI.uf.raid.tanksfirst = {
|
||||||
["PF_TANK_TOGGLE"] = { T["Toggle as Tank"], "toggleTank" }
|
["PF_TANK_TOGGLE"] = { T["Toggle as Tank"], "toggleTank" }
|
||||||
}
|
}
|
||||||
@@ -28,6 +51,8 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
function pfUI.uf.raid:UpdateConfig()
|
function pfUI.uf.raid:UpdateConfig()
|
||||||
local rawborder, default_border = GetBorderSize("unitframes")
|
local rawborder, default_border = GetBorderSize("unitframes")
|
||||||
maxraid = tonumber(C.unitframes.maxraid)
|
maxraid = tonumber(C.unitframes.maxraid)
|
||||||
|
local showpets = C.unitframes.raidpet.visible == "1"
|
||||||
|
self.showpets = showpets
|
||||||
|
|
||||||
for i=1,maxraid do
|
for i=1,maxraid do
|
||||||
pfUI.uf.raid[i] = pfUI.uf.raid[i] or pfUI.uf:CreateUnitFrame("Raid", i, C.unitframes.raid)
|
pfUI.uf.raid[i] = pfUI.uf.raid[i] or pfUI.uf:CreateUnitFrame("Raid", i, C.unitframes.raid)
|
||||||
@@ -36,6 +61,18 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
|
|
||||||
pfUI.uf.raid[i]:UpdateConfig()
|
pfUI.uf.raid[i]:UpdateConfig()
|
||||||
pfUI.uf.raid[i]:UpdateFrameSize()
|
pfUI.uf.raid[i]:UpdateFrameSize()
|
||||||
|
|
||||||
|
if showpets then
|
||||||
|
self.pets[i] = self.pets[i] or pfUI.uf:CreateUnitFrame("RaidPet", i, C.unitframes.raidpet, 0.5)
|
||||||
|
self.pets[i]:SetParent(petcluster)
|
||||||
|
self.pets[i]:SetFrameLevel(5)
|
||||||
|
self.pets[i]:UpdateConfig()
|
||||||
|
self.pets[i]:UpdateFrameSize()
|
||||||
|
elseif self.pets[i] then
|
||||||
|
self.pets[i]:UpdateConfig()
|
||||||
|
self.pets[i]:Hide()
|
||||||
|
RemoveMovable(self.pets[i])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local i = 1
|
local i = 1
|
||||||
@@ -47,6 +84,17 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
local _, _, x, y = string.find(layout,"(.+)x(.+)")
|
local _, _, x, y = string.find(layout,"(.+)x(.+)")
|
||||||
x, y = tonumber(x), tonumber(y)
|
x, y = tonumber(x), tonumber(y)
|
||||||
|
|
||||||
|
if showpets then
|
||||||
|
local petcfg = C.unitframes.raidpet
|
||||||
|
local _, _, px, py = string.find(petcfg.raidlayout, "(.+)x(.+)")
|
||||||
|
self.petgrid = {
|
||||||
|
fill = petcfg.raidfill, x = tonumber(px), y = tonumber(py),
|
||||||
|
pad = tonumber(petcfg.raidpadding) * GetPerfectPixel(),
|
||||||
|
w = self.pets[1]:GetWidth()+2*default_border,
|
||||||
|
h = self.pets[1]:GetHeight()+2*default_border,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
if fill == "VERTICAL" then
|
if fill == "VERTICAL" then
|
||||||
for r=1, x do for g=1, y do
|
for r=1, x do for g=1, y do
|
||||||
if pfUI.uf.raid[i] then
|
if pfUI.uf.raid[i] then
|
||||||
@@ -66,6 +114,67 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
i = i + 1
|
i = i + 1
|
||||||
end end
|
end end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self:LayoutPets()
|
||||||
|
|
||||||
|
self:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
function pfUI.uf.raid:LayoutPets()
|
||||||
|
if not self.showpets or not self.petgrid then return end
|
||||||
|
local grid = self.petgrid
|
||||||
|
|
||||||
|
local function place(pet, cell, id)
|
||||||
|
pet.label = "raidpet"
|
||||||
|
pet.id = id
|
||||||
|
local r, g = SlotToCoord(cell, grid.fill, grid.x, grid.y)
|
||||||
|
pet:ClearAllPoints()
|
||||||
|
pet:SetPoint("BOTTOMLEFT", petcluster, "BOTTOMLEFT", (r-1)*(grid.pad+grid.w), (g-1)*(grid.pad+grid.h))
|
||||||
|
UpdateMovable(pet, true)
|
||||||
|
pet:UpdateVisibility()
|
||||||
|
end
|
||||||
|
|
||||||
|
if pfUI.uf.showall then
|
||||||
|
for id = 1, maxraid do
|
||||||
|
if self.pets[id] then place(self.pets[id], id, id) end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Party shown as a raid grid: mirror slots 1..5 (player + party members)
|
||||||
|
-- into fixed cells. UpdateVisibility maps each slot to pet / partypet<N>.
|
||||||
|
if not IsInRaid() and IsInGroup() and C.unitframes.raidforgroup == "1" then
|
||||||
|
for id = 1, maxraid do
|
||||||
|
if self.pets[id] then
|
||||||
|
if id <= 5 then
|
||||||
|
place(self.pets[id], id, id)
|
||||||
|
else
|
||||||
|
self.pets[id].id = 0
|
||||||
|
self.pets[id]:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if C.unitframes.raidpet.collapse == "1" then
|
||||||
|
-- Pack the pets that exist into the leading cells, no gaps.
|
||||||
|
local k = 0
|
||||||
|
for id = 1, maxraid do
|
||||||
|
if UnitExists("raidpet"..id) and self.pets[k+1] then
|
||||||
|
k = k + 1
|
||||||
|
place(self.pets[k], k, id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for j = k+1, maxraid do
|
||||||
|
if self.pets[j] then self.pets[j].id = 0 self.pets[j]:Hide() end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Mirror: cell N always shows raidpet<N> at a fixed position.
|
||||||
|
for id = 1, maxraid do
|
||||||
|
if self.pets[id] then place(self.pets[id], id, id) end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
pfUI.uf.raid:UpdateConfig()
|
pfUI.uf.raid:UpdateConfig()
|
||||||
@@ -76,13 +185,22 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
frame:UpdateVisibility()
|
frame:UpdateVisibility()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- add units to the beginning of their groups
|
-- add units to their groups; collapse packs everyone into the leading slots
|
||||||
function pfUI.uf.raid:AddUnitToGroup(index, group)
|
function pfUI.uf.raid:AddUnitToGroup(index, group)
|
||||||
for subindex = 1, 5 do
|
if C.unitframes.raid.collapse == "1" then
|
||||||
local ids = subindex + 5*(group-1)
|
for ids = 1, maxraid do
|
||||||
if pfUI.uf.raid[ids] and pfUI.uf.raid[ids].id == 0 and pfUI.uf.raid[ids].config.visible == "1" then
|
if pfUI.uf.raid[ids] and pfUI.uf.raid[ids].id == 0 and pfUI.uf.raid[ids].config.visible == "1" then
|
||||||
SetRaidIndex(pfUI.uf.raid[ids], index)
|
SetRaidIndex(pfUI.uf.raid[ids], index)
|
||||||
return
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for subindex = 1, 5 do
|
||||||
|
local ids = subindex + 5*(group-1)
|
||||||
|
if pfUI.uf.raid[ids] and pfUI.uf.raid[ids].id == 0 and pfUI.uf.raid[ids].config.visible == "1" then
|
||||||
|
SetRaidIndex(pfUI.uf.raid[ids], index)
|
||||||
|
return
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -92,7 +210,14 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
pfUI.uf.raid:RegisterEvent("PARTY_MEMBERS_CHANGED")
|
pfUI.uf.raid:RegisterEvent("PARTY_MEMBERS_CHANGED")
|
||||||
pfUI.uf.raid:RegisterEvent("PARTY_LEADER_CHANGED")
|
pfUI.uf.raid:RegisterEvent("PARTY_LEADER_CHANGED")
|
||||||
pfUI.uf.raid:RegisterEvent("VARIABLES_LOADED")
|
pfUI.uf.raid:RegisterEvent("VARIABLES_LOADED")
|
||||||
|
pfUI.uf.raid:RegisterEvent("UNIT_PET")
|
||||||
pfUI.uf.raid:SetScript("OnEvent", function()
|
pfUI.uf.raid:SetScript("OnEvent", function()
|
||||||
|
if event == "UNIT_PET" then
|
||||||
|
if this.showpets and C.unitframes.raidpet.collapse == "1" then
|
||||||
|
this:LayoutPets()
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
this:Show()
|
this:Show()
|
||||||
-- Debounce: delay update by 0.5s to batch rapid roster changes (mass swaps)
|
-- Debounce: delay update by 0.5s to batch rapid roster changes (mass swaps)
|
||||||
this.pendingUpdate = GetTime() + 0.5
|
this.pendingUpdate = GetTime() + 0.5
|
||||||
@@ -105,8 +230,13 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
this.tick = GetTime() + 1.0
|
this.tick = GetTime() + 1.0
|
||||||
this.pendingUpdate = nil
|
this.pendingUpdate = nil
|
||||||
|
|
||||||
-- don't proceed without raid
|
-- Without a raid there is nothing to sort, but a party shown as a raid
|
||||||
if not IsInRaid() then return end
|
-- grid still needs its pet frames placed and mapped to the party pets.
|
||||||
|
if not IsInRaid() then
|
||||||
|
this:LayoutPets()
|
||||||
|
this:Hide()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- clear all existing frames
|
-- clear all existing frames
|
||||||
for i=1, maxraid do SetRaidIndex(pfUI.uf.raid[i], 0) end
|
for i=1, maxraid do SetRaidIndex(pfUI.uf.raid[i], 0) end
|
||||||
@@ -127,6 +257,8 @@ pfUI:RegisterModule("raid", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
this:LayoutPets()
|
||||||
|
|
||||||
-- Smart GUID-based updates: only refresh frames where unit changed
|
-- Smart GUID-based updates: only refresh frames where unit changed
|
||||||
if pfUI.uf.guidTracker then
|
if pfUI.uf.guidTracker then
|
||||||
local tracker = pfUI.uf.guidTracker
|
local tracker = pfUI.uf.guidTracker
|
||||||
|
|||||||
+9
-4
@@ -7,8 +7,12 @@ pfUI:RegisterModule("roll", function ()
|
|||||||
local LOOT_ROLL_NEED = string.gsub(LOOT_ROLL_NEED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
local LOOT_ROLL_NEED = string.gsub(LOOT_ROLL_NEED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
||||||
local LOOT_ROLL_PASSED = string.gsub(LOOT_ROLL_PASSED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
local LOOT_ROLL_PASSED = string.gsub(LOOT_ROLL_PASSED, "%%s|Hitem:%%d:%%d:%%d:%%d|h%[%%s%]|h%%s", "%%s")
|
||||||
|
|
||||||
-- try to detect the everyone string
|
-- detect the "everyone passed" subject exactly as the loot scanner will capture
|
||||||
local _, _, everyone, _ = strfind(LOOT_ROLL_ALL_PASSED, LOOT_ROLL_PASSED)
|
-- it: feed a dummy item into LOOT_ROLL_ALL_PASSED and run the same LOOT_ROLL_PASSED
|
||||||
|
-- match. (The old strfind had no captures, so `everyone` was always nil and
|
||||||
|
-- "Everyone has passed on: X" got counted as a fake roller.)
|
||||||
|
local everyoneSample = string.gsub(LOOT_ROLL_ALL_PASSED, "%%s", "x")
|
||||||
|
local everyone = cmatch(everyoneSample, LOOT_ROLL_PASSED)
|
||||||
pfUI.roll.blacklist = { YOU, everyone }
|
pfUI.roll.blacklist = { YOU, everyone }
|
||||||
|
|
||||||
pfUI.roll.cache = {}
|
pfUI.roll.cache = {}
|
||||||
@@ -42,7 +46,8 @@ pfUI:RegisterModule("roll", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local _, _, itemLink = string.find(hyperlink, "(item:%d+:%d+:%d+:%d+)")
|
local _, _, itemLink = string.find(hyperlink, "(item:%d+:%d+:%d+:%d+)")
|
||||||
local itemName = GetItemInfo(itemLink)
|
local itemName = C_Item.GetItemInfo(itemLink)
|
||||||
|
if not itemName then return end -- uncached item: avoid cache[nil] "table index is nil"
|
||||||
|
|
||||||
-- delete obsolete tables
|
-- delete obsolete tables
|
||||||
if pfUI.roll.cache[itemName] and pfUI.roll.cache[itemName]["TIMESTAMP"] < GetTime() - 60 then
|
if pfUI.roll.cache[itemName] and pfUI.roll.cache[itemName]["TIMESTAMP"] < GetTime() - 60 then
|
||||||
@@ -234,7 +239,7 @@ pfUI:RegisterModule("roll", function ()
|
|||||||
f.time.bar:SetAllPoints(f.time)
|
f.time.bar:SetAllPoints(f.time)
|
||||||
f.time.bar:SetStatusBarTexture(pfUI.media["img:bar"])
|
f.time.bar:SetStatusBarTexture(pfUI.media["img:bar"])
|
||||||
f.time.bar:SetMinMaxValues(0, 100)
|
f.time.bar:SetMinMaxValues(0, 100)
|
||||||
local r, g, b, a = strsplit(",", C.appearance.border.color)
|
local r, g, b, a = GetStringColor(C.appearance.border.color)
|
||||||
f.time.bar:SetStatusBarColor(r, g, b)
|
f.time.bar:SetStatusBarColor(r, g, b)
|
||||||
f.time.bar:SetValue(20)
|
f.time.bar:SetValue(20)
|
||||||
f.time.bar:SetScript("OnUpdate", function()
|
f.time.bar:SetScript("OnUpdate", function()
|
||||||
|
|||||||
+2
-3
@@ -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)
|
||||||
|
|||||||
+65
-67
@@ -4,7 +4,7 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM")
|
pfUI.socialmod:RegisterEvent("CHAT_MSG_SYSTEM")
|
||||||
pfUI.socialmod:SetScript("OnEvent", function()
|
pfUI.socialmod:SetScript("OnEvent", function()
|
||||||
local name = cmatch(arg1, _G.ERR_FRIEND_ONLINE_SS)
|
local name = cmatch(arg1, _G.ERR_FRIEND_ONLINE_SS)
|
||||||
name = cmatch(arg1, _G.ERR_FRIEND_OFFLINE_S)
|
name = name or cmatch(arg1, _G.ERR_FRIEND_OFFLINE_S)
|
||||||
if name and playerdb[name] and playerdb[name].cname then
|
if name and playerdb[name] and playerdb[name].cname then
|
||||||
playerdb[name].lastseen = date("%a %d-%b-%Y")
|
playerdb[name].lastseen = date("%a %d-%b-%Y")
|
||||||
end
|
end
|
||||||
@@ -77,20 +77,19 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
local off = FauxScrollFrame_GetOffset(FriendsFrameFriendsScrollFrame)
|
local off = FauxScrollFrame_GetOffset(FriendsFrameFriendsScrollFrame)
|
||||||
|
|
||||||
for i=1, FRIENDS_TO_DISPLAY do
|
for i=1, FRIENDS_TO_DISPLAY do
|
||||||
local name, level, class, zone, connected, status = GetFriendInfo(off + i)
|
local info = C_FriendList.GetFriendInfoByIndex(off + i)
|
||||||
if not name or name == _G.UNKNOWN then break end
|
if not info or not info.name or info.name == _G.UNKNOWN then break end
|
||||||
|
local name = info.name
|
||||||
local friendName = _G["FriendsFrameFriendButton"..i.."ButtonTextName"]
|
local friendName = _G["FriendsFrameFriendButton"..i.."ButtonTextName"]
|
||||||
local friendLoc = _G["FriendsFrameFriendButton"..i..FRIENDS_NAME_LOCATION]
|
local friendLoc = _G["FriendsFrameFriendButton"..i..FRIENDS_NAME_LOCATION]
|
||||||
local friendInfo = _G["FriendsFrameFriendButton"..i.."ButtonTextInfo"]
|
local friendInfo = _G["FriendsFrameFriendButton"..i.."ButtonTextInfo"]
|
||||||
local caption = friendName or friendLoc
|
local caption = friendName or friendLoc
|
||||||
|
|
||||||
if connected then
|
if info.connected then
|
||||||
if not class or class == _G.UNKNOWN then break end
|
local ccolor = PFUI_CLASS_COLORS[info.classFilename]
|
||||||
local ccolor = PFUI_CLASS_COLORS[L["class"][class]] or { 1, 1, 1 }
|
local status = info.afk and CHAT_FLAG_AFK or info.dnd and CHAT_FLAG_DND or ""
|
||||||
local lcolor = GetDifficultyColor(tonumber(level)) or { 1, 1, 1 }
|
local zone = ( info.area == playerzone and "|cffffffff" or "|cffcccccc" ) .. info.area .. "|r"
|
||||||
|
local cname = ccolor:WrapTextInColorCode(name)
|
||||||
zone = ( zone == playerzone and "|cffffffff" or "|cffcccccc" ) .. zone .. "|r"
|
|
||||||
local cname = rgbhex(ccolor) .. name .. "|r"
|
|
||||||
if playerdb[name] then
|
if playerdb[name] then
|
||||||
playerdb[name].lastseen = date("%a %d-%b-%Y")
|
playerdb[name].lastseen = date("%a %d-%b-%Y")
|
||||||
playerdb[name].cname = cname
|
playerdb[name].cname = cname
|
||||||
@@ -103,7 +102,7 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
friendLoc:SetText(format(TEXT(FRIENDS_LIST_TEMPLATE), cname, zone, status))
|
friendLoc:SetText(format(TEXT(FRIENDS_LIST_TEMPLATE), cname, zone, status))
|
||||||
end
|
end
|
||||||
|
|
||||||
friendInfo:SetText(format(TEXT(FRIENDS_LEVEL_TEMPLATE), level, class))
|
friendInfo:SetText(format(TEXT(FRIENDS_LEVEL_TEMPLATE), info.level, info.className))
|
||||||
caption:SetVertexColor(1,1,1,.9)
|
caption:SetVertexColor(1,1,1,.9)
|
||||||
friendInfo:SetVertexColor(1,1,1,.9)
|
friendInfo:SetVertexColor(1,1,1,.9)
|
||||||
else
|
else
|
||||||
@@ -124,74 +123,73 @@ pfUI:RegisterModule("socialmod", function ()
|
|||||||
|
|
||||||
do -- add colors to who list
|
do -- add colors to who list
|
||||||
hooksecurefunc("WhoList_Update", function()
|
hooksecurefunc("WhoList_Update", function()
|
||||||
local num, max = GetNumWhoResults()
|
local num, max = C_FriendList.GetNumWhoResults()
|
||||||
local off = FauxScrollFrame_GetOffset(WhoListScrollFrame)
|
local off = FauxScrollFrame_GetOffset(WhoListScrollFrame)
|
||||||
|
|
||||||
local playerzone = GetRealZoneText()
|
local playerzone = GetRealZoneText()
|
||||||
local playerrace = UnitRace("player")
|
local playerrace = UnitRace("player")
|
||||||
local playerguild = GetGuildInfo("player")
|
local playerguild = GetGuildInfo("player")
|
||||||
|
|
||||||
|
if num + 1 >= MAX_WHOS_FROM_SERVER then
|
||||||
|
WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), max).." |cffaaaaaa"..format(WHO_FRAME_SHOWN_TEMPLATE, MAX_WHOS_FROM_SERVER))
|
||||||
|
else
|
||||||
|
WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), num).." |cffaaaaaa"..format(WHO_FRAME_SHOWN_TEMPLATE, num))
|
||||||
|
end
|
||||||
|
|
||||||
for i=1, WHOS_TO_DISPLAY do
|
for i=1, WHOS_TO_DISPLAY do
|
||||||
local name, guild, level, race, class, zone = GetWhoInfo(off + i)
|
local info = C_FriendList.GetWhoInfo(off + i)
|
||||||
local displayedText = ""
|
if info then
|
||||||
|
-- filename is the class token, so no L["class"] reversal is needed
|
||||||
|
local class = info.filename
|
||||||
|
|
||||||
if num + 1 >= MAX_WHOS_FROM_SERVER then
|
_G["WhoFrameButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR:GetRGB())
|
||||||
displayedText = format(WHO_FRAME_SHOWN_TEMPLATE, MAX_WHOS_FROM_SERVER)
|
|
||||||
WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), max).." |cffaaaaaa"..displayedText)
|
|
||||||
else
|
|
||||||
displayedText = format(WHO_FRAME_SHOWN_TEMPLATE, num)
|
|
||||||
WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), num).." |cffaaaaaa"..displayedText)
|
|
||||||
end
|
|
||||||
|
|
||||||
class = L["class"][class]
|
if (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 1) then
|
||||||
|
if (info.area == playerzone) then
|
||||||
_G["WhoFrameButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b)
|
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1)
|
||||||
|
|
||||||
if (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 1) then
|
|
||||||
if (zone == playerzone) then
|
|
||||||
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1)
|
|
||||||
else
|
|
||||||
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 2) then
|
|
||||||
if (guild == playerguild) then
|
|
||||||
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1)
|
|
||||||
else
|
|
||||||
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 3) then
|
|
||||||
if (race == playerrace) then
|
|
||||||
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1)
|
|
||||||
else
|
|
||||||
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if class then
|
|
||||||
local classicon = _G["WhoFrameButton"..i].classicon
|
|
||||||
local coords = CLASS_ICON_TCOORDS[class]
|
|
||||||
local color = PFUI_CLASS_COLORS[class]
|
|
||||||
|
|
||||||
-- do we have classicons? (skin enabled?)
|
|
||||||
if classicon then
|
|
||||||
_G["WhoFrameButton"..i.."Class"]:SetTextColor(0,0,0,0)
|
|
||||||
_G["WhoFrameButton"..i.."Name"]:SetTextColor(color.r,color.g,color.b,1)
|
|
||||||
|
|
||||||
if coords then
|
|
||||||
classicon:Show()
|
|
||||||
classicon:SetTexCoord(unpack(coords))
|
|
||||||
else
|
else
|
||||||
classicon:Hide()
|
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1)
|
||||||
end
|
end
|
||||||
else
|
|
||||||
_G["WhoFrameButton"..i.."Class"]:SetTextColor(color.r,color.g,color.b,1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local color = GetDifficultyColor(level)
|
elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 2) then
|
||||||
_G["WhoFrameButton"..i.."Level"]:SetTextColor(color.r, color.g, color.b)
|
if (info.fullGuildName == playerguild) then
|
||||||
|
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1)
|
||||||
|
else
|
||||||
|
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 3) then
|
||||||
|
if (info.raceStr == playerrace) then
|
||||||
|
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1)
|
||||||
|
else
|
||||||
|
_G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if class then
|
||||||
|
local classicon = _G["WhoFrameButton"..i].classicon
|
||||||
|
local coords = CLASS_ICON_TCOORDS[class]
|
||||||
|
local color = PFUI_CLASS_COLORS[class]
|
||||||
|
|
||||||
|
-- do we have classicons? (skin enabled?)
|
||||||
|
if classicon then
|
||||||
|
_G["WhoFrameButton"..i.."Class"]:SetTextColor(0,0,0,0)
|
||||||
|
_G["WhoFrameButton"..i.."Name"]:SetTextColor(color.r,color.g,color.b,1)
|
||||||
|
|
||||||
|
if coords then
|
||||||
|
classicon:Show()
|
||||||
|
classicon:SetTexCoord(unpack(coords))
|
||||||
|
else
|
||||||
|
classicon:Hide()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
_G["WhoFrameButton"..i.."Class"]:SetTextColor(color.r,color.g,color.b,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local color = GetDifficultyColor(info.level)
|
||||||
|
_G["WhoFrameButton"..i.."Level"]:SetTextColor(color.r, color.g, color.b)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -76,7 +75,10 @@ pfUI:RegisterModule("superwow", function ()
|
|||||||
DEFAULT_CHAT_FRAME:AddMessage("-> https://github.com/balakethelock/SuperWoW/releases/")
|
DEFAULT_CHAT_FRAME:AddMessage("-> https://github.com/balakethelock/SuperWoW/releases/")
|
||||||
end
|
end
|
||||||
|
|
||||||
if SUPERWOW_VERSION == "1.5" then
|
-- compare numerically: an exact string match silently drops this on any
|
||||||
|
-- SuperWoW release past 1.5
|
||||||
|
local swVersion = tonumber(SUPERWOW_VERSION)
|
||||||
|
if swVersion and swVersion >= 1.5 then
|
||||||
QueueFunction(function()
|
QueueFunction(function()
|
||||||
local pfCombatText_AddMessage = _G.CombatText_AddMessage
|
local pfCombatText_AddMessage = _G.CombatText_AddMessage
|
||||||
_G.CombatText_AddMessage = function(message, a, b, c, d, e, f)
|
_G.CombatText_AddMessage = function(message, a, b, c, d, e, f)
|
||||||
@@ -173,12 +175,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)
|
||||||
+19
-28
@@ -9,11 +9,6 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
local ON_SWING_QUEUED = 0
|
local ON_SWING_QUEUED = 0
|
||||||
local ON_SWING_QUEUE_POPPED = 1
|
local ON_SWING_QUEUE_POPPED = 1
|
||||||
|
|
||||||
-- Spell.dbc bits used to mirror server-side swing-reset rules.
|
|
||||||
local FLAG_AUTOATTACK = tonumber("0x08", 16) -- SPELL_INTERRUPT_FLAG_AUTOATTACK
|
|
||||||
local ATTR_KEEP_SWINGS = tonumber("0x20000", 16) -- SPELL_ATTR_EX2_NOT_RESET_AUTO_ACTIONS
|
|
||||||
local ATTR_ON_NEXT_SWING = tonumber("0x04", 16) -- SPELL_ATTR_ON_NEXT_SWING
|
|
||||||
|
|
||||||
-- Consolidate state into a table to avoid Lua 5.0 upvalue limit (32 max)
|
-- Consolidate state into a table to avoid Lua 5.0 upvalue limit (32 max)
|
||||||
local S = {
|
local S = {
|
||||||
mhTimer = 0, mhTimerMax = 1,
|
mhTimer = 0, mhTimerMax = 1,
|
||||||
@@ -43,12 +38,11 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
local WAND_SHOOT_SPELLID = 5019
|
local WAND_SHOOT_SPELLID = 5019
|
||||||
local THROW_SPELLID = 2764 -- one-shot ranged, not auto-repeat
|
local THROW_SPELLID = 2764 -- one-shot ranged, not auto-repeat
|
||||||
|
|
||||||
-- ATTR_ON_NEXT_SWING: spell replaces next auto-attack swing.
|
-- On-next-swing spells replace the next auto-attack swing.
|
||||||
-- Covers Raptor Strike, Maul, Mongoose Bite, Holy Strike, etc. automatically.
|
-- Covers Raptor Strike, Maul, Mongoose Bite, Holy Strike, etc. automatically.
|
||||||
local function IsOnSwingSpell(spellId)
|
local function IsOnSwingSpell(spellId)
|
||||||
if S.onSwingCache[spellId] ~= nil then return S.onSwingCache[spellId] end
|
if S.onSwingCache[spellId] ~= nil then return S.onSwingCache[spellId] end
|
||||||
local attr = GetSpellRecField(spellId, "attributes") or 0
|
local result = C_Spell.IsNextMeleeSpell(spellId)
|
||||||
local result = bit.band(attr, ATTR_ON_NEXT_SWING) ~= 0
|
|
||||||
S.onSwingCache[spellId] = result
|
S.onSwingCache[spellId] = result
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
@@ -82,7 +76,7 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
local ohR, ohG, ohB, ohA = ParseColor(C.unitframes.swingtimerohcolor, 0.3, 0.8, 0.3, 1)
|
local ohR, ohG, ohB, ohA = ParseColor(C.unitframes.swingtimerohcolor, 0.3, 0.8, 0.3, 1)
|
||||||
local raR, raG, raB, raA = ParseColor(C.unitframes.swingtimerrangedcolor, 0.3, 0.6, 1.0, 1)
|
local raR, raG, raB, raA = ParseColor(C.unitframes.swingtimerrangedcolor, 0.3, 0.6, 1.0, 1)
|
||||||
local rwR, rwG, rwB, rwA = ParseColor(C.unitframes.swingtimerrangedwarncolor, 0.9, 0.0, 0.0, 1)
|
local rwR, rwG, rwB, rwA = ParseColor(C.unitframes.swingtimerrangedwarncolor, 0.9, 0.0, 0.0, 1)
|
||||||
local isHunter = UnitClass("player") == "Hunter"
|
local isHunter = UnitClassBase("player") == "HUNTER"
|
||||||
local mhDefaultR, mhDefaultG, mhDefaultB = mhR, mhG, mhB
|
local mhDefaultR, mhDefaultG, mhDefaultB = mhR, mhG, mhB
|
||||||
|
|
||||||
|
|
||||||
@@ -290,7 +284,9 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
UpdateMovable(pfUI.swingtimer.ranged)
|
UpdateMovable(pfUI.swingtimer.ranged)
|
||||||
|
|
||||||
-- OH weapon detection
|
-- OH weapon detection
|
||||||
local OH_WEAPON_TYPES = { [13]=true, [21]=true }
|
-- OH weapon detection: slot 17 (off hand) accepts one-hand (13) and off-hand
|
||||||
|
-- weapons (22); main-hand-only (21) can never sit there.
|
||||||
|
local OH_WEAPON_TYPES = { [13]=true, [22]=true }
|
||||||
local function HasOffhandWeapon()
|
local function HasOffhandWeapon()
|
||||||
local l = GetInventoryItemLink("player", 17)
|
local l = GetInventoryItemLink("player", 17)
|
||||||
if not l then return false end
|
if not l then return false end
|
||||||
@@ -734,13 +730,12 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
S.pendingCastSpellId = arg1
|
S.pendingCastSpellId = arg1
|
||||||
-- Freeze the swing timer for cast-time spells that DON'T reset auto-
|
-- Freeze the swing timer for cast-time spells that DON'T reset auto-
|
||||||
-- attack on completion (Slam, Hammer of Wrath on Turtle, etc.) — those
|
-- attack on completion (Slam, Hammer of Wrath on Turtle, etc.) — those
|
||||||
-- let the swing resume from where it paused. Detect dynamically via the
|
-- let the swing resume from where it paused. C_Spell.ResetsMeleeSwing
|
||||||
-- absent AUTOATTACK interrupt flag (8); spells with that bit reset on
|
-- mirrors the server rule; spells that reset don't need freezing (they
|
||||||
-- SPELL_GO_SELF so freezing isn't necessary. Subsumes the old hardcoded
|
-- reset on SPELL_GO_SELF). Subsumes the old hardcoded swingDelaySpells
|
||||||
-- swingDelaySpells list (no list maintenance for new Slam-style spells).
|
-- list (no list maintenance for new Slam-style spells).
|
||||||
if S.mhActive then
|
if S.mhActive then
|
||||||
local iflags = GetSpellRecField(arg1, "interruptFlags") or 0
|
if not C_Spell.ResetsMeleeSwing(arg1) then
|
||||||
if bit.band(iflags, FLAG_AUTOATTACK) == 0 then
|
|
||||||
S.mhFrozenAt = GetTime()
|
S.mhFrozenAt = GetTime()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -777,17 +772,13 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
S.hsQueued = false; S.cleaveQueued = false; S.maulQueued = false
|
S.hsQueued = false; S.cleaveQueued = false; S.maulQueued = false
|
||||||
ResetMH()
|
ResetMH()
|
||||||
else
|
else
|
||||||
-- Mirror the server rule for "does this spell reset the auto-attack
|
-- C_Spell.ResetsMeleeSwing mirrors the server rule (Turtle's
|
||||||
-- swing" (Spell::IsMeleeAttackResetSpell in Turtle's core):
|
-- Spell::IsMeleeAttackResetSpell): InterruptFlags has AUTOATTACK and
|
||||||
-- InterruptFlags has SPELL_INTERRUPT_FLAG_AUTOATTACK (0x08)
|
-- AttributesEx2 lacks NOT_RESET_AUTO_ACTIONS. When the spell resets the
|
||||||
-- AND AttributesEx2 lacks NOT_RESET_AUTO_ACTIONS (0x20000).
|
-- swing, snap the timers to full. Otherwise (elseif) a frozen-swing-
|
||||||
-- If neither path resets and we're holding a frozen-swing-during-cast
|
-- during-cast is a Slam-style cast — push the timer forward by the cast
|
||||||
-- (mhFrozenAt set by SPELL_START_SELF for non-AUTOATTACK spells), this
|
-- duration so the bar resumes from where it paused.
|
||||||
-- is a Slam-style cast — push the timer forward by the cast duration
|
if C_Spell.ResetsMeleeSwing(spellId) then
|
||||||
-- so the bar resumes from where it paused.
|
|
||||||
local iflags = GetSpellRecField(spellId, "interruptFlags") or 0
|
|
||||||
if bit.band(iflags, FLAG_AUTOATTACK) ~= 0
|
|
||||||
and bit.band(GetSpellRecField(spellId, "attributesEx2") or 0, ATTR_KEEP_SWINGS) == 0 then
|
|
||||||
if S.mhActive and S.mhSpeed > 0 then
|
if S.mhActive and S.mhSpeed > 0 then
|
||||||
UpdateWeaponSpeeds()
|
UpdateWeaponSpeeds()
|
||||||
S.mhTimerMax = S.mhSpeed
|
S.mhTimerMax = S.mhSpeed
|
||||||
@@ -908,7 +899,7 @@ pfUI:RegisterModule("swingtimer", function ()
|
|||||||
S.autoAttackActive = false
|
S.autoAttackActive = false
|
||||||
|
|
||||||
elseif event == "PLAYER_ENTERING_WORLD" then
|
elseif event == "PLAYER_ENTERING_WORLD" then
|
||||||
local _, class = UnitClass("player")
|
local class = UnitClassBase("player")
|
||||||
S.isWarrior = (class == "WARRIOR")
|
S.isWarrior = (class == "WARRIOR")
|
||||||
S.isDruid = (class == "DRUID")
|
S.isDruid = (class == "DRUID")
|
||||||
UpdateWeaponSpeeds()
|
UpdateWeaponSpeeds()
|
||||||
|
|||||||
@@ -100,10 +100,10 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
|
|||||||
CreateBackdropShadow(KLHTM_Frame)
|
CreateBackdropShadow(KLHTM_Frame)
|
||||||
|
|
||||||
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
KLHTM_Frame.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
KLHTM_Frame.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
KLHTM_Frame.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
KLHTM_Frame.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -199,10 +199,10 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
|
|||||||
CreateBackdropShadow(TWTMain)
|
CreateBackdropShadow(TWTMain)
|
||||||
|
|
||||||
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
TWTMain.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
TWTMain.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
TWTMain.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
TWTMain.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -328,10 +328,10 @@ pfUI:RegisterModule("thirdparty-vanilla", function()
|
|||||||
CreateBackdropShadow(SW_BarFrame1)
|
CreateBackdropShadow(SW_BarFrame1)
|
||||||
|
|
||||||
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
SW_BarFrame1.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
SW_BarFrame1.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
SW_BarFrame1.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
SW_BarFrame1.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+101
-4
@@ -244,10 +244,10 @@ pfUI:RegisterModule("thirdparty", function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
window.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
window.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
window.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
window.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -277,6 +277,103 @@ pfUI:RegisterModule("thirdparty", function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- GreedMeter Damage Meter
|
||||||
|
-- Vanilla: https://github.com/iGreed/GreedMeter
|
||||||
|
-- GreedMeter builds its windows lazily and supports several of them, so the
|
||||||
|
-- frames are resolved at call time. The primary window takes the "damage"
|
||||||
|
-- dock slot; a second window (GreedMeter.UI.frames[2]) takes the "threat"
|
||||||
|
-- slot so the two tile the panel side-by-side. Docking triggers a
|
||||||
|
-- LayoutBars/RefreshFrame so the bars refit the new width.
|
||||||
|
HookAddonOrVariable("GreedMeter", function()
|
||||||
|
local UI = GreedMeter.UI
|
||||||
|
|
||||||
|
local function frameAt(i)
|
||||||
|
return UI and UI.frames and UI.frames[i]
|
||||||
|
end
|
||||||
|
local function primary()
|
||||||
|
return (UI and UI.mainFrame) or getglobal("GreedMeterFrame1")
|
||||||
|
end
|
||||||
|
local function relayout(frame)
|
||||||
|
if not UI then return end
|
||||||
|
if UI.LayoutBars then UI:LayoutBars(frame) end
|
||||||
|
if UI.RefreshFrame then UI:RefreshFrame(frame) end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Builds a docktable for a window resolved through getframe(). left picks
|
||||||
|
-- the left half in split mode; the primary window uses the right half.
|
||||||
|
local function BuildDock(name, getframe, left)
|
||||||
|
return { "greedmeter", "GreedMeter", name,
|
||||||
|
function() -- single: fill the panel
|
||||||
|
local frame = getframe()
|
||||||
|
if not frame then return end
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
frame:SetAllPoints(pfUI.chat.right)
|
||||||
|
frame:SetWidth(pfUI.chat.right:GetWidth())
|
||||||
|
relayout(frame)
|
||||||
|
end,
|
||||||
|
function() -- dual: take one half
|
||||||
|
local frame = getframe()
|
||||||
|
if not frame then return end
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
if left then
|
||||||
|
frame:SetPoint("TOPLEFT", pfUI.chat.right, "TOPLEFT", 0, 0)
|
||||||
|
frame:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOM", 0, 0)
|
||||||
|
else
|
||||||
|
frame:SetPoint("TOPLEFT", pfUI.chat.right, "TOP", 0, 0)
|
||||||
|
frame:SetPoint("BOTTOMRIGHT", pfUI.chat.right, "BOTTOMRIGHT", 0, 0)
|
||||||
|
end
|
||||||
|
frame:SetWidth(pfUI.chat.right:GetWidth() / 2)
|
||||||
|
relayout(frame)
|
||||||
|
end,
|
||||||
|
function() -- show
|
||||||
|
local frame = getframe()
|
||||||
|
if frame then frame:Show() relayout(frame) end
|
||||||
|
end,
|
||||||
|
function() -- hide
|
||||||
|
local frame = getframe()
|
||||||
|
if frame then frame:Hide() end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local threatdock = BuildDock("GreedMeterFrame2", function() return frameAt(2) end, true)
|
||||||
|
pfUI.thirdparty.meters:RegisterMeter("damage", BuildDock("GreedMeterFrame1", primary, false))
|
||||||
|
|
||||||
|
-- pfUI's dock decides fill-vs-split by whether the threat slot is filled,
|
||||||
|
-- not by counting windows, so reconcile that slot whenever GreedMeter adds
|
||||||
|
-- or removes one. Only the first two windows fit; any beyond that float.
|
||||||
|
local function SyncSecond()
|
||||||
|
if not pfUI.thirdparty.meters.damage then return end -- dock disabled
|
||||||
|
local has2 = frameAt(2) ~= nil
|
||||||
|
if has2 and not pfUI.thirdparty.meters.threat then
|
||||||
|
pfUI.thirdparty.meters.threat = threatdock
|
||||||
|
elseif not has2 and pfUI.thirdparty.meters.threat == threatdock then
|
||||||
|
pfUI.thirdparty.meters.threat = nil
|
||||||
|
end
|
||||||
|
pfUI.thirdparty.meters:Resize()
|
||||||
|
|
||||||
|
-- match the second window's visibility to the panel (the primary tracks it)
|
||||||
|
local f1, f2 = primary(), frameAt(2)
|
||||||
|
if f2 then
|
||||||
|
if f1 and f1:IsShown() then f2:Show() relayout(f2) else f2:Hide() end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- AddFrame and the login-time layout restore both go through
|
||||||
|
-- CreateMeterFrame; RemoveFrame handles closing a window.
|
||||||
|
local origCreate = UI.CreateMeterFrame
|
||||||
|
UI.CreateMeterFrame = function(self, isPrimary, copyFrom)
|
||||||
|
local frame = origCreate(self, isPrimary, copyFrom)
|
||||||
|
SyncSecond()
|
||||||
|
return frame
|
||||||
|
end
|
||||||
|
local origRemove = UI.RemoveFrame
|
||||||
|
UI.RemoveFrame = function(self, frame)
|
||||||
|
origRemove(self, frame)
|
||||||
|
SyncSecond()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
-- DPSMate Damage Meter
|
-- DPSMate Damage Meter
|
||||||
-- Vanilla: https://github.com/Geigerkind/DPSMate
|
-- Vanilla: https://github.com/Geigerkind/DPSMate
|
||||||
-- TBC: https://github.com/Geigerkind/DPSMateTBC
|
-- TBC: https://github.com/Geigerkind/DPSMateTBC
|
||||||
@@ -350,10 +447,10 @@ pfUI:RegisterModule("thirdparty", function()
|
|||||||
CreateBackdropShadow(frame)
|
CreateBackdropShadow(frame)
|
||||||
|
|
||||||
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
if C.thirdparty.chatbg == "1" and C.chat.global.custombg == "1" then
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.background)
|
local r, g, b, a = GetStringColor(C.chat.global.background)
|
||||||
frame.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
frame.backdrop:SetBackdropColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
|
|
||||||
local r, g, b, a = strsplit(",", C.chat.global.border)
|
local r, g, b, a = GetStringColor(C.chat.global.border)
|
||||||
frame.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
frame.backdrop:SetBackdropBorderColor(tonumber(r), tonumber(g), tonumber(b), tonumber(a))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+175
-33
@@ -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)
|
||||||
@@ -24,36 +23,54 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if C.tooltip.position == "cursor" then
|
if C.tooltip.position == "cursor" then
|
||||||
|
-- Cursor mode makes the tooltip follow the mouse. The client has no
|
||||||
|
-- mouse-move event, so following means polling GetCursorPosition() via an
|
||||||
|
-- invisible follower frame that the tooltip anchors to. The follower is
|
||||||
|
-- only shown while a tooltip is visible -- an OnUpdate fires only while its
|
||||||
|
-- frame is shown, so the poll stops the moment the tooltip hides instead
|
||||||
|
-- of running forever.
|
||||||
|
local follower, Reposition
|
||||||
|
if C.tooltip.cursoralign ~= "native" then
|
||||||
|
local size = tonumber(C.tooltip.cursoroffset) * 2
|
||||||
|
follower = CreateFrame("Frame", nil, UIParent)
|
||||||
|
follower:SetSize(size, size)
|
||||||
|
follower:Hide()
|
||||||
|
|
||||||
|
Reposition = function()
|
||||||
|
local scale = UIParent:GetScale()
|
||||||
|
local x, y = GetCursorPosition()
|
||||||
|
follower:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x/scale, y/scale)
|
||||||
|
if C.tooltip.cursoralign == "top" then
|
||||||
|
follower:SetWidth(GameTooltip:GetWidth())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
follower:SetScript("OnUpdate", function()
|
||||||
|
-- throttle - cursor following doesn't need to be every frame
|
||||||
|
if (this.tick or 0) > GetTime() then return end
|
||||||
|
this.tick = GetTime() + (pfUI.throttle and pfUI.throttle:Get("tooltip_cursor") or 0.1)
|
||||||
|
Reposition()
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- stop polling as soon as the tooltip is gone
|
||||||
|
pfUI.tooltip:SetScript("OnHide", function() follower:Hide() end)
|
||||||
|
end
|
||||||
|
|
||||||
function _G.GameTooltip_SetDefaultAnchor(tooltip, parent)
|
function _G.GameTooltip_SetDefaultAnchor(tooltip, parent)
|
||||||
tooltip:SetOwner(parent, "ANCHOR_CURSOR")
|
tooltip:SetOwner(parent, "ANCHOR_CURSOR")
|
||||||
if C.tooltip.cursoralign ~= "native" then
|
if not follower then return end
|
||||||
-- create mouse follow frame
|
|
||||||
if not tooltip.cursor then
|
|
||||||
tooltip.cursor = CreateFrame("Frame", nil, UIParent)
|
|
||||||
tooltip.cursor:SetWidth(tonumber(C.tooltip.cursoroffset) * 2)
|
|
||||||
tooltip.cursor:SetHeight(tonumber(C.tooltip.cursoroffset) * 2)
|
|
||||||
tooltip.cursor:SetScript("OnUpdate", function()
|
|
||||||
-- throttle - cursor following doesn't need to be every frame
|
|
||||||
if (this.tick or 0) > GetTime() then return end
|
|
||||||
this.tick = GetTime() + (pfUI.throttle and pfUI.throttle:Get("tooltip_cursor") or 0.1)
|
|
||||||
|
|
||||||
local scale = UIParent:GetScale()
|
-- position the follower right away so the tooltip doesn't flash at a
|
||||||
local x, y = GetCursorPosition()
|
-- stale spot before the first OnUpdate tick
|
||||||
this:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x/scale, y/scale)
|
follower:Show()
|
||||||
if C.tooltip.cursoralign == "top" then
|
Reposition()
|
||||||
tooltip.cursor:SetWidth(tooltip:GetWidth())
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- adjust tooltip to mouse frame
|
if C.tooltip.cursoralign == "top" then
|
||||||
if C.tooltip.cursoralign == "top" then
|
tooltip:SetPoint("BOTTOMLEFT", follower, "TOPLEFT", 0, 0)
|
||||||
tooltip:SetPoint("BOTTOMLEFT", tooltip.cursor, "TOPLEFT", 0, 0)
|
elseif C.tooltip.cursoralign == "left" then
|
||||||
elseif C.tooltip.cursoralign == "left" then
|
tooltip:SetPoint("BOTTOMRIGHT", follower, "LEFT", 0, 0)
|
||||||
tooltip:SetPoint("BOTTOMRIGHT", tooltip.cursor, "LEFT", 0, 0)
|
elseif C.tooltip.cursoralign == "right" then
|
||||||
elseif C.tooltip.cursoralign == "right" then
|
tooltip:SetPoint("BOTTOMLEFT", follower, "RIGHT", 0, 0)
|
||||||
tooltip:SetPoint("BOTTOMLEFT", tooltip.cursor, "RIGHT", 0, 0)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -168,12 +185,101 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
GameTooltipStatusBar.SetStatusBarColor_orig = GameTooltipStatusBar.SetStatusBarColor
|
GameTooltipStatusBar.SetStatusBarColor_orig = GameTooltipStatusBar.SetStatusBarColor
|
||||||
GameTooltipStatusBar.SetStatusBarColor = function() return end
|
GameTooltipStatusBar.SetStatusBarColor = function() return end
|
||||||
|
|
||||||
|
-- A row of buff icons anchored above the tooltip for mouseover units.
|
||||||
|
-- Icons come from a ClassicAPI object pool: ReleaseAll hides the whole
|
||||||
|
-- set each refresh, then we Acquire and re-anchor left-to-right.
|
||||||
|
local BUFF_SIZE, BUFF_SPACING, BUFF_MAX = 20, 2, 32
|
||||||
|
pfUI.tooltip.buffs = CreateFrame("Frame", "pfTooltipBuffs", GameTooltip)
|
||||||
|
pfUI.tooltip.buffs:SetPoint("BOTTOMLEFT", GameTooltipStatusBar, "TOPLEFT", 0, default_border + 2)
|
||||||
|
pfUI.tooltip.buffs:SetHeight(BUFF_SIZE)
|
||||||
|
|
||||||
|
local function CreateBuffIcon()
|
||||||
|
local icon = CreateFrame("Frame", nil, pfUI.tooltip.buffs)
|
||||||
|
icon:SetSize(BUFF_SIZE, BUFF_SIZE)
|
||||||
|
icon.texture = icon:CreateTexture(nil, "BACKGROUND")
|
||||||
|
icon.texture:SetTexCoord(.07, .93, .07, .93)
|
||||||
|
icon.texture:SetAllPoints(icon)
|
||||||
|
CreateBackdrop(icon)
|
||||||
|
|
||||||
|
icon.stacks = icon:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
icon.stacks:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 1, 0)
|
||||||
|
icon.stacks:SetFont(C.tooltip.font_tooltip, C.tooltip.font_tooltip_size, "OUTLINE")
|
||||||
|
icon.stacks:SetTextColor(1, 1, 1, 1)
|
||||||
|
|
||||||
|
icon.timer = icon:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||||
|
icon.timer:SetPoint("CENTER", icon, "CENTER", 0, 0)
|
||||||
|
icon.timer:SetFont(C.tooltip.font_tooltip, C.tooltip.font_tooltip_size, "OUTLINE")
|
||||||
|
icon.timer:SetTextColor(1, 1, 1, 1)
|
||||||
|
return icon
|
||||||
|
end
|
||||||
|
|
||||||
|
pfUI.tooltip.buffpool = CreateObjectPool(CreateBuffIcon, function(_, icon)
|
||||||
|
icon:Hide()
|
||||||
|
icon:ClearAllPoints()
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Tick the remaining-time text on the visible icons. OnUpdate only fires
|
||||||
|
-- while the row is shown, so it stops as soon as the tooltip hides.
|
||||||
|
pfUI.tooltip.buffs:SetScript("OnUpdate", function()
|
||||||
|
local now = GetTime()
|
||||||
|
if (this.tick or 0) > now then return end
|
||||||
|
this.tick = now + 0.1
|
||||||
|
for icon in pfUI.tooltip.buffpool:EnumerateActive() do
|
||||||
|
local timeleft = icon.expirationTime and icon.expirationTime > 0 and (icon.expirationTime - now) or 0
|
||||||
|
icon.timer:SetText(timeleft > 0 and GetColoredTimeString(timeleft) or "")
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
function pfUI.tooltip:UpdateBuffs(unit)
|
||||||
|
pfUI.tooltip.buffpool:ReleaseAll()
|
||||||
|
|
||||||
|
if C.tooltip.showbuffs ~= "1" or not unit or unit == "none" then
|
||||||
|
pfUI.tooltip.buffs:Hide()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local prev, count = nil, 0
|
||||||
|
for i = 1, BUFF_MAX do
|
||||||
|
local aura = C_UnitAuras.GetBuffDataByIndex(unit, i)
|
||||||
|
if not aura then break end
|
||||||
|
|
||||||
|
count = count + 1
|
||||||
|
local icon = pfUI.tooltip.buffpool:Acquire()
|
||||||
|
icon.texture:SetTexture(aura.icon)
|
||||||
|
icon.stacks:SetText(aura.applications and aura.applications > 1 and aura.applications or "")
|
||||||
|
|
||||||
|
icon.expirationTime = aura.expirationTime
|
||||||
|
local timeleft = aura.expirationTime and aura.expirationTime > 0 and (aura.expirationTime - GetTime()) or 0
|
||||||
|
icon.timer:SetText(timeleft > 0 and GetColoredTimeString(timeleft) or "")
|
||||||
|
|
||||||
|
if prev then
|
||||||
|
icon:SetPoint("LEFT", prev, "RIGHT", BUFF_SPACING, 0)
|
||||||
|
else
|
||||||
|
icon:SetPoint("BOTTOMLEFT", pfUI.tooltip.buffs, "BOTTOMLEFT", 0, 0)
|
||||||
|
end
|
||||||
|
icon:Show()
|
||||||
|
prev = icon
|
||||||
|
end
|
||||||
|
|
||||||
|
if count > 0 then
|
||||||
|
pfUI.tooltip.buffs:SetWidth(count * BUFF_SIZE + (count - 1) * BUFF_SPACING)
|
||||||
|
pfUI.tooltip.buffs:Show()
|
||||||
|
else
|
||||||
|
pfUI.tooltip.buffs:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function pfUI.tooltip:Update()
|
function pfUI.tooltip:Update()
|
||||||
local unit = pfUI.tooltip:GetUnit()
|
local unit = pfUI.tooltip:GetUnit()
|
||||||
|
pfUI.tooltip:UpdateBuffs(unit)
|
||||||
if unit == "none" then
|
if unit == "none" then
|
||||||
-- process item tooltips
|
if C.tooltip.itemid == "1" and GameTooltip:HasItem() then
|
||||||
if C.tooltip.itemid == "1" and libtooltip:GetItemID() then
|
local _, _, itemID = GameTooltip:GetItem()
|
||||||
GameTooltip:AddLine(T["ItemID"] .. ": " .. libtooltip:GetItemID(), .25,.5,1)
|
GameTooltip:AddLine(T["ItemID"] .. ": " .. itemID, .25,.5,1)
|
||||||
|
GameTooltip:Show()
|
||||||
|
elseif C.tooltip.spellid == "1" and GameTooltip:HasSpell() then
|
||||||
|
local _, _, spellID = GameTooltip:GetSpell()
|
||||||
|
GameTooltip:AddLine(T["SpellID"] .. ": " .. spellID, .25,.5,1)
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -183,7 +289,7 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
local pvpname = UnitPVPName(unit)
|
local pvpname = UnitPVPName(unit)
|
||||||
local name = UnitName(unit)
|
local name = UnitName(unit)
|
||||||
local validTarget, target = pcall(UnitName, unit .. 'target')
|
local validTarget, target = pcall(UnitName, unit .. 'target')
|
||||||
local _, class = UnitClass(unit)
|
local class = UnitClassBase(unit)
|
||||||
local guild, rankstr, rankid = GetGuildInfo(unit)
|
local guild, rankstr, rankid = GetGuildInfo(unit)
|
||||||
local reaction = UnitReaction(unit, "player")
|
local reaction = UnitReaction(unit, "player")
|
||||||
local pvptitle = gsub(gsub(pvpname or name, name, "", 1), "^%s*(.-)%s*$", "%1")
|
local pvptitle = gsub(gsub(pvpname or name, name, "", 1), "^%s*(.-)%s*$", "%1")
|
||||||
@@ -218,7 +324,7 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if validTarget and target then
|
if validTarget and target then
|
||||||
local _, targetClass = UnitClass(unit .. "target")
|
local targetClass = UnitClassBase(unit .. "target")
|
||||||
local targetReaction = UnitReaction("player",unit .. "target")
|
local targetReaction = UnitReaction("player",unit .. "target")
|
||||||
if UnitIsPlayer(unit .. "target") and targetClass then
|
if UnitIsPlayer(unit .. "target") and targetClass then
|
||||||
local color = PFUI_CLASS_COLORS[targetClass]
|
local color = PFUI_CLASS_COLORS[targetClass]
|
||||||
@@ -241,6 +347,13 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if C.tooltip.unitid == "1" and not UnitIsPlayer(unit) then
|
||||||
|
local npcID = C_CreatureInfo.GetCreatureID(UnitGUID(unit))
|
||||||
|
if npcID then
|
||||||
|
GameTooltip:AddLine(T["UnitID"] .. ": " .. npcID, .25,.5,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if hp and hpm then
|
if hp and hpm then
|
||||||
if hp >= 1000 then hp = round(hp / 1000, 1) .. "k" end
|
if hp >= 1000 then hp = round(hp / 1000, 1) .. "k" end
|
||||||
if hpm >= 1000 then hpm = round(hpm / 1000, 1) .. "k" end
|
if hpm >= 1000 then hpm = round(hpm / 1000, 1) .. "k" end
|
||||||
@@ -248,4 +361,33 @@ pfUI:RegisterModule("tooltip", function ()
|
|||||||
end
|
end
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if C.tooltip.aurasource == "1" or C.tooltip.spellid == "1" then
|
||||||
|
hooksecurefunc(GameTooltip, "SetUnitAura", function(self, ...)
|
||||||
|
local aura = C_UnitAuras.GetAuraDataByIndex(unpack(arg))
|
||||||
|
if not aura then return end
|
||||||
|
if C.tooltip.aurasource == "1" then
|
||||||
|
local caster = aura.sourceUnit and UnitName(aura.sourceUnit)
|
||||||
|
if not caster and aura.sourceGUID then
|
||||||
|
caster = UnitNameFromGUID(aura.sourceGUID)
|
||||||
|
end
|
||||||
|
if caster and caster ~= "" then
|
||||||
|
local classToken
|
||||||
|
if aura.sourceUnit and UnitIsPlayer(aura.sourceUnit) then
|
||||||
|
classToken = UnitClassBase(aura.sourceUnit)
|
||||||
|
elseif aura.sourceGUID then
|
||||||
|
classToken = select(2, GetPlayerInfoByGUID(aura.sourceGUID))
|
||||||
|
end
|
||||||
|
if classToken then
|
||||||
|
caster = PFUI_CLASS_COLORS[classToken]:WrapTextInColorCode(caster)
|
||||||
|
end
|
||||||
|
self:AddLine(T["Cast by"] .. ": " .. caster, .25,.5,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if C.tooltip.spellid == "1" then
|
||||||
|
self:AddLine(T["SpellID"] .. ": " .. aura.spellId, .25,.5,1)
|
||||||
|
end
|
||||||
|
self:Show()
|
||||||
|
end)
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|||||||
+32
-45
@@ -1,64 +1,53 @@
|
|||||||
pfUI:RegisterModule("totems", function ()
|
pfUI:RegisterModule("totems", function ()
|
||||||
local _, class = UnitClass("player")
|
local slotColors = {
|
||||||
|
[FIRE_TOTEM_SLOT] = CreateColor(.5, .2, .1),
|
||||||
local slots = {
|
[EARTH_TOTEM_SLOT] = CreateColor(.2, .4, .1),
|
||||||
[FIRE_TOTEM_SLOT] = { r = .5, g = .2, b = .1 },
|
[WATER_TOTEM_SLOT] = CreateColor(.1, .4, .6),
|
||||||
[EARTH_TOTEM_SLOT] = { r = .2, g = .4, b = .1 },
|
[AIR_TOTEM_SLOT] = CreateColor(.4, .1, .7),
|
||||||
[WATER_TOTEM_SLOT] = { r = .1, g = .4, b = .6 },
|
|
||||||
[AIR_TOTEM_SLOT] = { r = .4, g = .1, b = .7 },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local totems = CreateFrame("Frame", "pfTotems", UIParent)
|
local totems = CreateFrame("Frame", "pfTotems", UIParent)
|
||||||
totems:RegisterEvent("PLAYER_TOTEM_UPDATE")
|
totems:RegisterEvent("PLAYER_TOTEM_UPDATE")
|
||||||
totems:RegisterEvent("PLAYER_ENTERING_WORLD")
|
totems:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
totems:SetScript("OnEvent", function(self)
|
totems:SetScript("OnEvent", function()
|
||||||
totems:RefreshList()
|
this:RefreshList()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if class == "SHAMAN" then
|
|
||||||
-- there's no totem event in vanilla using ticks instead
|
|
||||||
local eventemu = CreateFrame("Frame")
|
|
||||||
eventemu:SetScript("OnUpdate", function()
|
|
||||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .5 end
|
|
||||||
totems:RefreshList()
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
totems.OnEnter = function(self)
|
totems.OnEnter = function(self)
|
||||||
if not this.id then return end
|
local id = this:GetID()
|
||||||
local active, name, start, duration, icon = GetTotemInfo(this.id)
|
local spellID = select(7, GetTotemInfo(id))
|
||||||
if not name or not active then return end -- Prüfen ob name gültig ist
|
if not spellID or spellID == 0 then return end
|
||||||
local color = slots[this.id]
|
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
|
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
|
||||||
GameTooltip:SetText(name, color.r+.2, color.g+.2, color.b+.2)
|
GameTooltip:SetSpellByID(spellID)
|
||||||
|
GameTooltip:AddDoubleLine(T["Left Click"], T["Recast Totem"], nil, nil, nil, WHITE_FONT_COLOR:GetRGB())
|
||||||
|
GameTooltip:AddDoubleLine(T["Right Click"], T["Target Totem"], nil, nil, nil, WHITE_FONT_COLOR:GetRGB())
|
||||||
GameTooltip:Show()
|
GameTooltip:Show()
|
||||||
end
|
|
||||||
|
|
||||||
totems.OnLeave = function(self)
|
|
||||||
GameTooltip:Hide()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
totems.OnLeave = GameTooltip_Hide
|
||||||
|
|
||||||
totems.OnClick = function(self)
|
totems.OnClick = function(self)
|
||||||
if this.id and arg1 and arg1 == "LeftButton" then
|
local id = this:GetID()
|
||||||
-- Try to recast totem on left click
|
if arg1 == "LeftButton" then
|
||||||
local active, name, start, duration, icon = GetTotemInfo(this.id)
|
local spellID = select(7, GetTotemInfo(id))
|
||||||
if name then CastSpellByName(name) end
|
if spellID and spellID > 0 then CastSpell(FindSpellBookSlotByID(spellID)) end
|
||||||
|
elseif arg1 == "RightButton" then
|
||||||
|
TargetTotem(id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
totems.RefreshList = function(self)
|
totems.RefreshList = function(self)
|
||||||
local count = 0
|
local count = 0
|
||||||
for i = 1, MAX_TOTEMS do
|
for i = 1, MAX_TOTEMS do
|
||||||
local active, name, start, duration, icon = GetTotemInfo(i)
|
local _, _, start, duration, icon = GetTotemInfo(i)
|
||||||
|
|
||||||
if active and icon and icon ~= "" then
|
if start and start > 0 and icon and icon ~= "" then
|
||||||
count = count + 1
|
count = count + 1
|
||||||
local color = slots[i]
|
|
||||||
|
|
||||||
self.bar[count]:Show()
|
self.bar[count]:Show()
|
||||||
self.bar[count]:SetBackdropBorderColor(color.r, color.g, color.b)
|
self.bar[count]:SetBackdropBorderColor(slotColors[i]:GetRGB())
|
||||||
self.bar[count].icon:SetTexture(icon)
|
self.bar[count].icon:SetTexture(icon)
|
||||||
self.bar[count].id = i
|
self.bar[count]:SetID(i)
|
||||||
|
|
||||||
CooldownFrame_SetTimer(self.bar[count].cd, start, duration, 1)
|
CooldownFrame_SetTimer(self.bar[count].cd, start, duration, 1)
|
||||||
end
|
end
|
||||||
@@ -77,14 +66,14 @@ end
|
|||||||
self:Show()
|
self:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
local count = count and count > 0 and count or MAX_TOTEMS
|
count = count and count > 0 and count or MAX_TOTEMS
|
||||||
|
|
||||||
|
local thickness = self.iconsize + self.spacing*2
|
||||||
|
local length = thickness * count
|
||||||
if pfUI_config.totems.direction == "HORIZONTAL" then
|
if pfUI_config.totems.direction == "HORIZONTAL" then
|
||||||
self:SetHeight(self.iconsize + self.spacing*2)
|
self:SetSize(length, thickness)
|
||||||
self:SetWidth(self.spacing*2 + self.iconsize + (count-1)*(self.iconsize + self.spacing*2))
|
|
||||||
else
|
else
|
||||||
self:SetWidth(self.iconsize + self.spacing*2)
|
self:SetSize(thickness, length)
|
||||||
self:SetHeight(self.spacing*2 + self.iconsize + (count-1)*(self.iconsize + self.spacing*2))
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -114,8 +103,7 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
self.bar[i]:SetHeight(self.iconsize)
|
self.bar[i]:SetSize(self.iconsize, self.iconsize)
|
||||||
self.bar[i]:SetWidth(self.iconsize)
|
|
||||||
CreateBackdrop(self.bar[i], nil, true)
|
CreateBackdrop(self.bar[i], nil, true)
|
||||||
|
|
||||||
self.bar[i].icon = self.bar[i].icon or self.bar[i]:CreateTexture(nil, "ARTWORK")
|
self.bar[i].icon = self.bar[i].icon or self.bar[i]:CreateTexture(nil, "ARTWORK")
|
||||||
@@ -123,8 +111,7 @@ end
|
|||||||
SetAllPointsOffset(self.bar[i].icon, self.bar[i], 2,-2)
|
SetAllPointsOffset(self.bar[i].icon, self.bar[i], 2,-2)
|
||||||
|
|
||||||
self.bar[i].cdbg = self.bar[i].cdbg or CreateFrame("Frame", nil, self.bar[i])
|
self.bar[i].cdbg = self.bar[i].cdbg or CreateFrame("Frame", nil, self.bar[i])
|
||||||
self.bar[i].cdbg:SetHeight(self.iconsize - 3)
|
self.bar[i].cdbg:SetSize(self.iconsize - 3, self.iconsize - 3)
|
||||||
self.bar[i].cdbg:SetWidth(self.iconsize - 3)
|
|
||||||
self.bar[i].cdbg:SetPoint("CENTER", self.bar[i], "CENTER", 0, 0)
|
self.bar[i].cdbg:SetPoint("CENTER", self.bar[i], "CENTER", 0, 0)
|
||||||
self.bar[i].cd = self.bar[i].cd or CreateFrame(COOLDOWN_FRAME_TYPE, "pfTotemsBar"..i.."Cooldown", self.bar[i].cdbg, "CooldownFrameTemplate")
|
self.bar[i].cd = self.bar[i].cd or CreateFrame(COOLDOWN_FRAME_TYPE, "pfTotemsBar"..i.."Cooldown", self.bar[i].cdbg, "CooldownFrameTemplate")
|
||||||
self.bar[i].cd.pfCooldownStyleAnimation = 1
|
self.bar[i].cd.pfCooldownStyleAnimation = 1
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ pfUI:RegisterModule("tracking", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
function pfUI.tracking:RefreshSpells()
|
function pfUI.tracking:RefreshSpells()
|
||||||
local _, playerClass = UnitClass("player")
|
local playerClass = UnitClassBase("player")
|
||||||
local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(playerClass)
|
local isCatForm = pfUI.tracking:PlayerIsDruidInCatForm(playerClass)
|
||||||
|
|
||||||
-- Build set of valid SpellIDs for this class
|
-- Build set of valid SpellIDs for this class
|
||||||
|
|||||||
+19
-18
@@ -80,24 +80,6 @@ pfUI:RegisterModule("turtle-wow", function ()
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- custom debuff durations
|
|
||||||
L["debuffs"]["Hand of Reckoning"] = {[0]=3.0}
|
|
||||||
L["debuffs"]['Insect Swarm'] = {[0]=18.0}
|
|
||||||
L["debuffs"]['Moonfire'] = {[1]=9.0,[2]=18.0,[3]=18.0,[4]=18.0,[5]=18.0,[6]=18.0,[7]=18.0,[8]=18.0,[9]=18.0,[10]=18.0,[0]=18.0}
|
|
||||||
L["debuffs"]['Deep Wound'] = {[0]=6.0}
|
|
||||||
|
|
||||||
-- turtle wow totemic recall clear totem indicators
|
|
||||||
local _, class = UnitClass("player")
|
|
||||||
if libtotem and class == "SHAMAN" then
|
|
||||||
local trecall = CreateFrame("Frame", "pfTotemsRecall", UIParent)
|
|
||||||
trecall:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF")
|
|
||||||
trecall:SetScript("OnEvent", function()
|
|
||||||
if arg1 and string.find(arg1, T["You gain (.+) Mana from Totemic Recall"]) then
|
|
||||||
for i = 1, 4 do libtotem:Clean(i) end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
local delay = CreateFrame("Frame")
|
local delay = CreateFrame("Frame")
|
||||||
delay:SetScript("OnUpdate", function()
|
delay:SetScript("OnUpdate", function()
|
||||||
this:Hide()
|
this:Hide()
|
||||||
@@ -373,6 +355,25 @@ pfUI:RegisterModule("turtle-wow", function ()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
if C.disabled["macroicons"] == "1" then
|
||||||
|
HookAddonOrVariable("Blizzard_MacroUI", function()
|
||||||
|
if type(UpdateMacroIconFilenames) ~= "function" then return end
|
||||||
|
function _G.UpdateMacroIconFilenames()
|
||||||
|
wipe(MACRO_ICON_FILENAMES)
|
||||||
|
local provider = CreateAndInitFromMixin(IconDataProviderMixin, IconDataProviderExtraType.Spellbook)
|
||||||
|
local seen = {}
|
||||||
|
for i = 1, provider:GetNumIcons() do
|
||||||
|
-- uppercase, prefix-stripped basename, matching Blizzard's original
|
||||||
|
local icon = string.gsub(string.upper(provider:GetIconByIndex(i)), "INTERFACE\\ICONS\\", "")
|
||||||
|
if not seen[icon] then
|
||||||
|
seen[icon] = true
|
||||||
|
table.insert(MACRO_ICON_FILENAMES, icon)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
provider:Release()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
-- add turtle-wow sell values
|
-- add turtle-wow sell values
|
||||||
pfSellData = {
|
pfSellData = {
|
||||||
|
|||||||
+14
-26
@@ -28,7 +28,7 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
behindFrame.text:SetFont(pfUI.font_default, fontSize, "OUTLINE")
|
behindFrame.text:SetFont(pfUI.font_default, fontSize, "OUTLINE")
|
||||||
behindFrame.text:SetPoint("RIGHT", behindFrame, "RIGHT", -1, 0)
|
behindFrame.text:SetPoint("RIGHT", behindFrame, "RIGHT", -1, 0)
|
||||||
behindFrame.text:SetTextColor(0.3, 1, 0.3, 1)
|
behindFrame.text:SetTextColor(0.3, 1, 0.3, 1)
|
||||||
behindFrame.text:SetText("BEHIND")
|
behindFrame.text:SetText(T["BEHIND"])
|
||||||
behindFrame.text:Hide()
|
behindFrame.text:Hide()
|
||||||
|
|
||||||
local lastCheck = 0
|
local lastCheck = 0
|
||||||
@@ -62,7 +62,7 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
losFrame.text:SetFont(pfUI.font_default, fontSize, "OUTLINE")
|
losFrame.text:SetFont(pfUI.font_default, fontSize, "OUTLINE")
|
||||||
losFrame.text:SetPoint("RIGHT", losFrame, "RIGHT", -1, -slot)
|
losFrame.text:SetPoint("RIGHT", losFrame, "RIGHT", -1, -slot)
|
||||||
losFrame.text:SetTextColor(1, 0.3, 0.3, 1)
|
losFrame.text:SetTextColor(1, 0.3, 0.3, 1)
|
||||||
losFrame.text:SetText("NO LOS")
|
losFrame.text:SetText(T["NO LOS"])
|
||||||
losFrame.text:Hide()
|
losFrame.text:Hide()
|
||||||
|
|
||||||
local lastCheck = 0
|
local lastCheck = 0
|
||||||
@@ -169,6 +169,9 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
|
|
||||||
local throttle = 0
|
local throttle = 0
|
||||||
local scanner = CreateFrame("Frame")
|
local scanner = CreateFrame("Frame")
|
||||||
|
-- expose the poller frame so PLAYER_LOGOUT can stop its UnitXP OnUpdate
|
||||||
|
-- (it lives on this separate frame, not on distanceIndicator) -> crash 132
|
||||||
|
pfUI.uf.target.distanceScanner = scanner
|
||||||
scanner:SetScript("OnUpdate", function()
|
scanner:SetScript("OnUpdate", function()
|
||||||
throttle = throttle + arg1
|
throttle = throttle + arg1
|
||||||
if throttle < 0.05 then return end
|
if throttle < 0.05 then return end
|
||||||
@@ -236,6 +239,10 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
if pfUI.uf.target.distanceIndicator then
|
if pfUI.uf.target.distanceIndicator then
|
||||||
pfUI.uf.target.distanceIndicator:SetScript("OnUpdate", nil)
|
pfUI.uf.target.distanceIndicator:SetScript("OnUpdate", nil)
|
||||||
end
|
end
|
||||||
|
-- free-frame mode polls from its own scanner frame, not the indicator
|
||||||
|
if pfUI.uf.target.distanceScanner then
|
||||||
|
pfUI.uf.target.distanceScanner:SetScript("OnUpdate", nil)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -268,7 +275,9 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
-- Also notify on BG queue pop
|
-- Also notify on BG queue pop
|
||||||
local origBattlefieldPortShow = BattlefieldFrame_Show
|
local origBattlefieldPortShow = BattlefieldFrame_Show
|
||||||
if origBattlefieldPortShow then
|
if origBattlefieldPortShow then
|
||||||
BattlefieldFrame_Show = function()
|
-- pfUI.env has __index but no __newindex, so a bare global assignment
|
||||||
|
-- inside a RegisterModule closure never leaves the sandbox
|
||||||
|
_G.BattlefieldFrame_Show = function()
|
||||||
pcall(UnitXP, "notify", "taskbarIcon")
|
pcall(UnitXP, "notify", "taskbarIcon")
|
||||||
pcall(UnitXP, "notify", "systemSound")
|
pcall(UnitXP, "notify", "systemSound")
|
||||||
return origBattlefieldPortShow()
|
return origBattlefieldPortShow()
|
||||||
@@ -331,29 +340,8 @@ pfUI:RegisterModule("unitxp", function ()
|
|||||||
return success and found
|
return success and found
|
||||||
end
|
end
|
||||||
|
|
||||||
pfUI.api.UnitInLineOfSight = function(unit1, unit2)
|
|
||||||
if not unit2 then
|
|
||||||
unit2 = unit1
|
|
||||||
unit1 = "player"
|
|
||||||
end
|
|
||||||
local success, inSight = pcall(UnitXP, "inSight", unit1, unit2)
|
|
||||||
if success then return inSight end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
pfUI.api.UnitIsBehind = function(unit1, unit2)
|
|
||||||
if not unit2 then
|
|
||||||
unit2 = unit1
|
|
||||||
unit1 = "player"
|
|
||||||
end
|
|
||||||
local success, behind = pcall(UnitXP, "behind", unit1, unit2)
|
|
||||||
if success then return behind end
|
|
||||||
return nil
|
|
||||||
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 +375,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)
|
||||||
+6
-2
@@ -6,6 +6,7 @@ pfUI:RegisterModule("unlock", function ()
|
|||||||
-- Name Shift Ctrl
|
-- Name Shift Ctrl
|
||||||
{ "pfCombo", 5 },
|
{ "pfCombo", 5 },
|
||||||
{ "pfRaid", 40, 5 },
|
{ "pfRaid", 40, 5 },
|
||||||
|
{ "pfRaidPet", 40, 5 },
|
||||||
{ "pfGroup", 4 },
|
{ "pfGroup", 4 },
|
||||||
{ "pfLootRollFrame", 4 },
|
{ "pfLootRollFrame", 4 },
|
||||||
}
|
}
|
||||||
@@ -35,6 +36,8 @@ pfUI:RegisterModule("unlock", function ()
|
|||||||
-- groupframes
|
-- groupframes
|
||||||
["Raid%d"] = { T["Group Frames"], T["Raid"] },
|
["Raid%d"] = { T["Group Frames"], T["Raid"] },
|
||||||
["Raid%d%d"] = { T["Group Frames"], T["Raid"] },
|
["Raid%d%d"] = { T["Group Frames"], T["Raid"] },
|
||||||
|
["RaidPet%d"] = { T["Group Frames"], T["Raid-Pet"] },
|
||||||
|
["RaidPet%d%d"] = { T["Group Frames"], T["Raid-Pet"] },
|
||||||
["Group%d"] = { T["Group Frames"], T["Group"] },
|
["Group%d"] = { T["Group Frames"], T["Group"] },
|
||||||
["Party%dTarget"] = { T["Group Frames"], T["Group-Target"] },
|
["Party%dTarget"] = { T["Group Frames"], T["Group-Target"] },
|
||||||
["PartyPet%d"] = { T["Group Frames"], T["Group-Pet"] },
|
["PartyPet%d"] = { T["Group Frames"], T["Group-Pet"] },
|
||||||
@@ -98,7 +101,8 @@ pfUI:RegisterModule("unlock", function ()
|
|||||||
-- search and add clustered frames
|
-- search and add clustered frames
|
||||||
for id, cluster in pairs(clusters) do
|
for id, cluster in pairs(clusters) do
|
||||||
local len = strlen(cluster[1])
|
local len = strlen(cluster[1])
|
||||||
if strsub(frame:GetName(),0,len) == cluster[1] then
|
local fid = tonumber(strsub(frame:GetName(),len+1,len+2))
|
||||||
|
if fid and strsub(frame:GetName(),0,len) == cluster[1] then
|
||||||
if IsShiftKeyDown() and cluster[2] then
|
if IsShiftKeyDown() and cluster[2] then
|
||||||
for i = 1, cluster[2] do
|
for i = 1, cluster[2] do
|
||||||
if _G[cluster[1] .. i] ~= frame then
|
if _G[cluster[1] .. i] ~= frame then
|
||||||
@@ -106,7 +110,7 @@ pfUI:RegisterModule("unlock", function ()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif IsControlKeyDown() and cluster[3] then
|
elseif IsControlKeyDown() and cluster[3] then
|
||||||
local id = tonumber(strsub(frame:GetName(),len+1,len+2))
|
local id = fid
|
||||||
|
|
||||||
local b = 1
|
local b = 1
|
||||||
for i = cluster[3]+1, cluster[2], cluster[3] do
|
for i = cluster[3]+1, cluster[2], cluster[3] do
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ pfUI:RegisterModule("whisperproxy", function ()
|
|||||||
|
|
||||||
local proxy = CreateFrame("Button", "pfWhisperProxy", pfUI.chat.left.panelTop)
|
local proxy = CreateFrame("Button", "pfWhisperProxy", pfUI.chat.left.panelTop)
|
||||||
proxy:SetPoint("TOPRIGHT", pfUI.chat.left, "TOPRIGHT", -22, -5)
|
proxy:SetPoint("TOPRIGHT", pfUI.chat.left, "TOPRIGHT", -22, -5)
|
||||||
proxy:SetWidth(12)
|
proxy:SetSize(12, 12)
|
||||||
proxy:SetHeight(12)
|
|
||||||
proxy.tex = proxy:CreateTexture(nil, "OVERLAY")
|
proxy.tex = proxy:CreateTexture(nil, "OVERLAY")
|
||||||
proxy.tex:SetAllPoints()
|
proxy.tex:SetAllPoints()
|
||||||
proxy.tex:SetTexture(pfUI.media["img:proxy"])
|
proxy.tex:SetTexture(pfUI.media["img:proxy"])
|
||||||
|
|||||||
+2
-10
@@ -183,11 +183,7 @@ end
|
|||||||
local self = self or this
|
local self = self or this
|
||||||
|
|
||||||
if self.text_mouse == "1" then
|
if self.text_mouse == "1" then
|
||||||
if MouseIsOver(self) then
|
self.bar.text:SetShown(MouseIsOver(self))
|
||||||
self.bar.text:Show()
|
|
||||||
else
|
|
||||||
self.bar.text:Hide()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.always then return end
|
if self.always then return end
|
||||||
@@ -352,11 +348,7 @@ end
|
|||||||
b.bar.text:SetJustifyH("CENTER")
|
b.bar.text:SetJustifyH("CENTER")
|
||||||
b.bar.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
b.bar.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
||||||
|
|
||||||
if b.text == "1" then
|
b.bar.text:SetShown(b.text == "1")
|
||||||
b.bar.text:Show()
|
|
||||||
else
|
|
||||||
b.bar.text:Hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
b.restedbar = b.restedbar or CreateFrame("StatusBar", nil, b)
|
b.restedbar = b.restedbar or CreateFrame("StatusBar", nil, b)
|
||||||
b.restedbar:SetStatusBarTexture(pfUI.media[C.panel.xp.texture])
|
b.restedbar:SetStatusBarTexture(pfUI.media[C.panel.xp.texture])
|
||||||
|
|||||||
@@ -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 = 10605 -- (X*10000 + Y*100 + Z)
|
local PFUI_CLASSIC_API_MIN = 10906 -- (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"
|
||||||
@@ -40,9 +36,16 @@ do
|
|||||||
if not CLASSIC_API_VERSION or CLASSIC_API_VERSION < PFUI_CLASSIC_API_MIN then
|
if not CLASSIC_API_VERSION or CLASSIC_API_VERSION < PFUI_CLASSIC_API_MIN then
|
||||||
local minVersion = FormatVersion(PFUI_CLASSIC_API_MIN)
|
local minVersion = FormatVersion(PFUI_CLASSIC_API_MIN)
|
||||||
pfUI.disabled = true
|
pfUI.disabled = true
|
||||||
EventUtil.ContinueOnPlayerLogin(function()
|
local detail
|
||||||
|
if not CLASSIC_API_VERSION then
|
||||||
|
detail = "The ClassicAPI DLL isn't loaded. The |cff33ffcc!!!ClassicAPI|r addon ships bundled with it -- delete your |cff33ffcc!!!ClassicAPI|r folder and install the latest release from:"
|
||||||
|
else
|
||||||
|
detail = "ClassicAPI " .. minVersion .. " or newer is required. Delete your |cff33ffcc!!!ClassicAPI|r folder and reinstall the latest release from:"
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ShowRequiredPopup()
|
||||||
StaticPopupDialogs["PFUI_CLASSICAPI_REQUIRED"] = {
|
StaticPopupDialogs["PFUI_CLASSICAPI_REQUIRED"] = {
|
||||||
text = "This fork of |cff33ffccpf|cffffffffUI|r requires ClassicAPI\n " .. minVersion .. " or newer.\n\nAll |cff33ffccpf|cffffffffUI|r modules have been disabled.\nInstall ClassicAPI from:",
|
text = "|cff33ffccpf|cffffffffUI|r has been disabled.\n\n" .. detail,
|
||||||
button1 = OKAY,
|
button1 = OKAY,
|
||||||
hasEditBox = 1,
|
hasEditBox = 1,
|
||||||
editBoxWidth = 280,
|
editBoxWidth = 280,
|
||||||
@@ -51,7 +54,7 @@ do
|
|||||||
hideOnEscape = 1,
|
hideOnEscape = 1,
|
||||||
preferredIndex = 3,
|
preferredIndex = 3,
|
||||||
OnShow = function()
|
OnShow = function()
|
||||||
local editBox = _G[this:GetName().."EditBox"]
|
local editBox = getglobal(this:GetName().."EditBox")
|
||||||
if editBox then
|
if editBox then
|
||||||
editBox:SetText(PFUI_CLASSIC_API_LATEST_URL)
|
editBox:SetText(PFUI_CLASSIC_API_LATEST_URL)
|
||||||
editBox:HighlightText()
|
editBox:HighlightText()
|
||||||
@@ -61,9 +64,15 @@ do
|
|||||||
}
|
}
|
||||||
StaticPopup_Show("PFUI_CLASSICAPI_REQUIRED")
|
StaticPopup_Show("PFUI_CLASSICAPI_REQUIRED")
|
||||||
DEFAULT_CHAT_FRAME:AddMessage(
|
DEFAULT_CHAT_FRAME:AddMessage(
|
||||||
"This fork of |cff33ffccpf|cffffffffUI|r requires ClassicAPI " .. minVersion .. "+. Get it at " .. PFUI_CLASSIC_API_LATEST_URL,
|
"|cff33ffccpf|cffffffffUI|r disabled: " .. detail .. " " .. PFUI_CLASSIC_API_LATEST_URL,
|
||||||
1, 0.3, 0.3
|
1, 0.3, 0.3
|
||||||
)
|
)
|
||||||
|
end
|
||||||
|
local loginFrame = CreateFrame("Frame")
|
||||||
|
loginFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
loginFrame:SetScript("OnEvent", function()
|
||||||
|
loginFrame:UnregisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
ShowRequiredPopup()
|
||||||
end)
|
end)
|
||||||
elseif CLASSIC_API_VERSION < PFUI_CLASSIC_API_LATEST then
|
elseif CLASSIC_API_VERSION < PFUI_CLASSIC_API_LATEST then
|
||||||
EventUtil.ContinueOnPlayerLogin(function()
|
EventUtil.ContinueOnPlayerLogin(function()
|
||||||
@@ -101,9 +110,19 @@ pfUI.movables = {}
|
|||||||
pfUI.version = {}
|
pfUI.version = {}
|
||||||
pfUI.env = {}
|
pfUI.env = {}
|
||||||
|
|
||||||
pfUI.events = Mixin({}, CallbackRegistryMixin)
|
-- Capability flag: this fork's pfActionBar buttons correctly handle the modern
|
||||||
pfUI.events:OnLoad()
|
-- HookScript widget method, so ClassicAPI's AddOnCompat shim must NOT shadow
|
||||||
pfUI.events:SetUndefinedEventsAllowed(true)
|
-- HookScript during actionbar load (older forks branch on `if button.HookScript`
|
||||||
|
-- and take a modern path they were never written for). This describes behavior,
|
||||||
|
-- not identity: a fork that keeps the HookScript-correct actionbar code keeps
|
||||||
|
-- the flag; one that lacks it should drop the flag and get the safe fallback.
|
||||||
|
pfUI.handlesHookScript = true
|
||||||
|
|
||||||
|
if not pfUI.disabled then
|
||||||
|
pfUI.events = Mixin({}, CallbackRegistryMixin)
|
||||||
|
pfUI.events:OnLoad()
|
||||||
|
pfUI.events:SetUndefinedEventsAllowed(true)
|
||||||
|
end
|
||||||
|
|
||||||
-- check if macro addons are loaded (disables macrotweak/macroscan)
|
-- check if macro addons are loaded (disables macrotweak/macroscan)
|
||||||
function pfUI:MacroAddonsLoaded()
|
function pfUI:MacroAddonsLoaded()
|
||||||
@@ -281,6 +300,21 @@ function pfUI:GetEnvironment()
|
|||||||
pfUI.env.C = pfUI_config
|
pfUI.env.C = pfUI_config
|
||||||
pfUI.env.pfUI_throttle = _G.pfUI_throttle
|
pfUI.env.pfUI_throttle = _G.pfUI_throttle
|
||||||
pfUI.env.L = (pfUI_locale[GetLocale()] or pfUI_locale["enUS"])
|
pfUI.env.L = (pfUI_locale[GetLocale()] or pfUI_locale["enUS"])
|
||||||
|
pfUI.env.L["class"] = pfUI.env.L["class"] or tInvert(LOCALIZED_CLASS_NAMES_MALE)
|
||||||
|
if not pfUI.env.L["race"] then
|
||||||
|
pfUI.env.L["race"] = {}
|
||||||
|
local i = 1
|
||||||
|
local raceInfo = C_CreatureInfo.GetRaceInfo(i)
|
||||||
|
while raceInfo ~= nil do
|
||||||
|
pfUI.env.L["race"][raceInfo.clientFileString] = {
|
||||||
|
raceName = raceInfo.raceName,
|
||||||
|
raceID = raceInfo.raceID,
|
||||||
|
faction = C_CreatureInfo.GetFactionInfo(i).groupTag,
|
||||||
|
}
|
||||||
|
i = i + 1
|
||||||
|
raceInfo = C_CreatureInfo.GetRaceInfo(i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return pfUI.env
|
return pfUI.env
|
||||||
end
|
end
|
||||||
@@ -298,7 +332,7 @@ function pfUI:CheckNewModules()
|
|||||||
pfUI_init.seen_modules = pfUI_init.seen_modules or {}
|
pfUI_init.seen_modules = pfUI_init.seen_modules or {}
|
||||||
|
|
||||||
local pending = 0
|
local pending = 0
|
||||||
local _, playerClass = UnitClass("player")
|
local playerClass = UnitClassBase("player")
|
||||||
for _, entry in pairs(pfUI.new_modules) do
|
for _, entry in pairs(pfUI.new_modules) do
|
||||||
if not pfUI_init.seen_modules[entry.name] and pfUI_init["finalize"] then
|
if not pfUI_init.seen_modules[entry.name] and pfUI_init["finalize"] then
|
||||||
if not entry.class or entry.class == playerClass then
|
if not entry.class or entry.class == playerClass then
|
||||||
@@ -414,7 +448,7 @@ pfUI:SetScript("OnEvent", function()
|
|||||||
pfUI.version.major, pfUI.version.minor, pfUI.version.fix = 0, 0, 0
|
pfUI.version.major, pfUI.version.minor, pfUI.version.fix = 0, 0, 0
|
||||||
pfUI.version.string = "dev"
|
pfUI.version.string = "dev"
|
||||||
else
|
else
|
||||||
local major, minor, fix = pfUI.api.strsplit(".", raw)
|
local major, minor, fix = pfUI.api.strsplit(".", string.gsub(raw, "^[vV]", ""))
|
||||||
pfUI.version.major = tonumber(major) or 0
|
pfUI.version.major = tonumber(major) or 0
|
||||||
pfUI.version.minor = tonumber(minor) or 0
|
pfUI.version.minor = tonumber(minor) or 0
|
||||||
pfUI.version.fix = tonumber(fix) or 0
|
pfUI.version.fix = tonumber(fix) or 0
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
## Version: @project-version@
|
## Version: @project-version@
|
||||||
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache, pfUI_throttle
|
## SavedVariables: pfUI_profiles, pfUI_addon_profiles, pfUI_cache, pfUI_throttle
|
||||||
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
## SavedVariablesPerCharacter: pfUI_config, pfUI_init, pfUI_playerDB
|
||||||
## Dependencies: !!!ClassicAPI
|
|
||||||
## X-Website: https://github.com/brues-code/pfUI
|
## X-Website: https://github.com/brues-code/pfUI
|
||||||
|
|
||||||
pfUI.lua
|
pfUI.lua
|
||||||
|
|||||||
@@ -2,15 +2,10 @@ pfUI:RegisterSkin("Auctionhouse", function ()
|
|||||||
local rawborder, border = GetBorderSize()
|
local rawborder, border = GetBorderSize()
|
||||||
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
|
local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel()
|
||||||
HookAddonOrVariable("Blizzard_AuctionUI", function()
|
HookAddonOrVariable("Blizzard_AuctionUI", function()
|
||||||
-- Compatibility
|
SkinArrowButton(BidPrevPageButton, "left", 18)
|
||||||
if BrowseResetButton then -- tbc
|
SkinArrowButton(BidNextPageButton, "right", 18)
|
||||||
SkinButton(BrowseResetButton)
|
SkinArrowButton(AuctionsPrevPageButton, "left", 18)
|
||||||
else -- vanilla
|
SkinArrowButton(AuctionsNextPageButton, "right", 18)
|
||||||
SkinArrowButton(BidPrevPageButton, "left", 18)
|
|
||||||
SkinArrowButton(BidNextPageButton, "right", 18)
|
|
||||||
SkinArrowButton(AuctionsPrevPageButton, "left", 18)
|
|
||||||
SkinArrowButton(AuctionsNextPageButton, "right", 18)
|
|
||||||
end
|
|
||||||
|
|
||||||
hooksecurefunc("AuctionFrame_OnShow", function()
|
hooksecurefunc("AuctionFrame_OnShow", function()
|
||||||
AuctionFrame:ClearAllPoints()
|
AuctionFrame:ClearAllPoints()
|
||||||
|
|||||||
@@ -52,8 +52,7 @@ pfUI:RegisterSkin("Battlefield", function ()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
BattlefieldFrame.textbox = CreateFrame("Frame", "BattlefieldFrameTextBox", BattlefieldFrame)
|
BattlefieldFrame.textbox = CreateFrame("Frame", "BattlefieldFrameTextBox", BattlefieldFrame)
|
||||||
BattlefieldFrame.textbox:SetWidth(320)
|
BattlefieldFrame.textbox:SetSize(320, 110)
|
||||||
BattlefieldFrame.textbox:SetHeight(110)
|
|
||||||
CreateBackdrop(BattlefieldFrame.textbox)
|
CreateBackdrop(BattlefieldFrame.textbox)
|
||||||
BattlefieldFrame.textbox:SetPoint("BOTTOM", BattlefieldFrame.backdrop, "BOTTOM", 0, 36)
|
BattlefieldFrame.textbox:SetPoint("BOTTOM", BattlefieldFrame.backdrop, "BOTTOM", 0, 36)
|
||||||
BattlefieldFrameZoneDescription:ClearAllPoints()
|
BattlefieldFrameZoneDescription:ClearAllPoints()
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ pfUI:RegisterSkin("Battlefield Minimap", function ()
|
|||||||
CreateBackdrop(BattlefieldMinimap, nil, nil, 0)
|
CreateBackdrop(BattlefieldMinimap, nil, nil, 0)
|
||||||
CreateBackdropShadow(BattlefieldMinimap)
|
CreateBackdropShadow(BattlefieldMinimap)
|
||||||
|
|
||||||
BattlefieldMinimap:SetWidth(220)
|
BattlefieldMinimap:SetSize(220, 146)
|
||||||
BattlefieldMinimap:SetHeight(146)
|
|
||||||
|
|
||||||
SkinCloseButton(BattlefieldMinimapCloseButton, BattlefieldMinimap, 0, 0)
|
SkinCloseButton(BattlefieldMinimapCloseButton, BattlefieldMinimap, 0, 0)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -113,7 +131,7 @@ pfUI:RegisterSkin("Character", function ()
|
|||||||
|
|
||||||
if ShaguScore and itemID then
|
if ShaguScore and itemID then
|
||||||
local itemLevel = C_Item.GetCurrentItemLevel({ equipmentSlotIndex = slotId })
|
local itemLevel = C_Item.GetCurrentItemLevel({ equipmentSlotIndex = slotId })
|
||||||
local _, _, quality, _, _, _, _, _, itemSlot, _ = GetItemInfo(itemID)
|
local _, _, quality, _, _, _, _, _, itemSlot, _ = C_Item.GetItemInfo(itemID)
|
||||||
local score = ShaguScore:Calculate(itemSlot, quality, itemLevel)
|
local score = ShaguScore:Calculate(itemSlot, quality, itemLevel)
|
||||||
if score and score > 0 and quality and quality > 0 then
|
if score and score > 0 and quality and quality > 0 then
|
||||||
local r,g,b = GetItemQualityColor(quality)
|
local r,g,b = GetItemQualityColor(quality)
|
||||||
@@ -159,8 +177,7 @@ pfUI:RegisterSkin("Character", function ()
|
|||||||
|
|
||||||
for i,c in pairs(magicResTextureCords) do
|
for i,c in pairs(magicResTextureCords) do
|
||||||
local magicResFrame = _G["MagicResFrame"..i]
|
local magicResFrame = _G["MagicResFrame"..i]
|
||||||
magicResFrame:SetWidth(26)
|
magicResFrame:SetSize(26, 26)
|
||||||
magicResFrame:SetHeight(26)
|
|
||||||
CreateBackdrop(magicResFrame)
|
CreateBackdrop(magicResFrame)
|
||||||
SetAllPointsOffset(magicResFrame.backdrop, magicResFrame, 2)
|
SetAllPointsOffset(magicResFrame.backdrop, magicResFrame, 2)
|
||||||
local icon = GetNoNameObject(magicResFrame, "Texture", "BACKGROUND", "ResistanceIcons")
|
local icon = GetNoNameObject(magicResFrame, "Texture", "BACKGROUND", "ResistanceIcons")
|
||||||
@@ -218,8 +235,7 @@ pfUI:RegisterSkin("Character", function ()
|
|||||||
|
|
||||||
for i,c in pairs(magicResTextureCords) do
|
for i,c in pairs(magicResTextureCords) do
|
||||||
local magicResFrame = _G["PetMagicResFrame"..i]
|
local magicResFrame = _G["PetMagicResFrame"..i]
|
||||||
magicResFrame:SetWidth(26)
|
magicResFrame:SetSize(26, 26)
|
||||||
magicResFrame:SetHeight(26)
|
|
||||||
CreateBackdrop(magicResFrame)
|
CreateBackdrop(magicResFrame)
|
||||||
SetAllPointsOffset(magicResFrame.backdrop, magicResFrame, 2)
|
SetAllPointsOffset(magicResFrame.backdrop, magicResFrame, 2)
|
||||||
local icon = GetNoNameObject(magicResFrame, "Texture", "BACKGROUND", "ResistanceIcons")
|
local icon = GetNoNameObject(magicResFrame, "Texture", "BACKGROUND", "ResistanceIcons")
|
||||||
@@ -239,8 +255,7 @@ pfUI:RegisterSkin("Character", function ()
|
|||||||
|
|
||||||
local war = _G["ReputationBar"..i.."AtWarCheck"]
|
local war = _G["ReputationBar"..i.."AtWarCheck"]
|
||||||
StripTextures(war)
|
StripTextures(war)
|
||||||
war:SetWidth(13)
|
war:SetSize(13, 13)
|
||||||
war:SetHeight(13)
|
|
||||||
war:ClearAllPoints()
|
war:ClearAllPoints()
|
||||||
war:SetPoint("LEFT", bar.backdrop, "RIGHT", 6, 0)
|
war:SetPoint("LEFT", bar.backdrop, "RIGHT", 6, 0)
|
||||||
war.icon = war:CreateTexture(nil, "OVERLAY")
|
war.icon = war:CreateTexture(nil, "OVERLAY")
|
||||||
@@ -338,8 +353,7 @@ pfUI:RegisterSkin("Character", function ()
|
|||||||
SkillDetailStatusBar:SetParent(SkillDetailScrollFrame)
|
SkillDetailStatusBar:SetParent(SkillDetailScrollFrame)
|
||||||
|
|
||||||
StripTextures(SkillDetailStatusBarUnlearnButton)
|
StripTextures(SkillDetailStatusBarUnlearnButton)
|
||||||
SkillDetailStatusBarUnlearnButton:SetWidth(20)
|
SkillDetailStatusBarUnlearnButton:SetSize(20, 20)
|
||||||
SkillDetailStatusBarUnlearnButton:SetHeight(20)
|
|
||||||
SkillDetailStatusBarUnlearnButton:SetHitRectInsets(0,0,0,0)
|
SkillDetailStatusBarUnlearnButton:SetHitRectInsets(0,0,0,0)
|
||||||
SkillDetailStatusBarUnlearnButton:ClearAllPoints()
|
SkillDetailStatusBarUnlearnButton:ClearAllPoints()
|
||||||
SkillDetailStatusBarUnlearnButton:SetPoint("LEFT", SkillDetailStatusBar, "RIGHT", 6, 0)
|
SkillDetailStatusBarUnlearnButton:SetPoint("LEFT", SkillDetailStatusBar, "RIGHT", 6, 0)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user