mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-23 16:16:56 +00:00
b7c3fe5333
ClassicAPI's RegisterUnitEvent registers for an event but only delivers it when arg1 is one of the given units, so a handler for one unit stops waking for every other one in the world. Convert the 26 registrations whose unit set is fixed and known at registration time. The rule throughout is register the superset and keep the handler's own check: the filter narrows what arrives, it does not decide what to act on. castbar is the case that matters -- the player's own casts only ever fire arg1=="player", never "target"/"focus", so the target and focus bars must register "player" too, and their UnitIsUnit test is what still rejects a "player" event while you are targeting a mob. Two that are not one-line swaps: actionbar's two unit events are keys in tables that also drive dispatch, so they cannot leave the tables -- and they cannot be plain-registered first, because a registration keeps its kind and RegisterUnitEvent over a plain one stays plain. They route through a small event_units map instead. swingtimer's UNIT_DIED carries a GUID, not a token. The filter is a plain case-insensitive string compare with no GUID resolution, so the player's own GUID -- fixed for the session -- filters it exactly. Guards that are now unreachable stay put: the filter applies only when arg1 is a string, so an event that ever fires with a number or no argument is delivered as if plainly registered, and the handler's own test is what still rejects it. Left alone: api/unitframes.lua (the frame's unit changes at runtime and the handler also matches on GUID), nameplates' six nameplateN events, libdebuff and libpredict's UNIT_HEALTH (genuinely any unit), and raid.lua's UNIT_PET (any raid member can own the pet).
825 lines
32 KiB
Lua
825 lines
32 KiB
Lua
pfUI:RegisterModule("panel", function()
|
|
-- initialize gold cache if not yet happened
|
|
pfUI_cache["gold"] = pfUI_cache["gold"] or {}
|
|
|
|
local font = C.panel.use_unitfonts == "1" and pfUI.font_unit or pfUI.font_default
|
|
local font_size = C.panel.use_unitfonts == "1" and C.global.font_unit_size or C.global.font_size
|
|
local rawborder, default_border = GetBorderSize("panels")
|
|
|
|
do -- Widgets
|
|
do -- Clock & Timer
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetClock",UIParent)
|
|
widget.Tooltip = function()
|
|
GameTooltip:ClearLines()
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
local fmt = C.global.twentyfour == "0" and "%I:%M %p" or "%H:%M"
|
|
local time = date(fmt)
|
|
local servertime = date(fmt, GetServerEpoch())
|
|
GameTooltip:AddLine("|cff555555" .. T["Time"])
|
|
GameTooltip:AddDoubleLine(T["Localtime"], "|cffffffff" .. time)
|
|
GameTooltip:AddDoubleLine(T["Servertime"], "|cffffffff".. servertime)
|
|
GameTooltip:AddLine(" ")
|
|
if TimeManagerFrame then
|
|
GameTooltip:AddDoubleLine(T["Left Click"], "|cffffffff" .. T["Show/Hide TimeManager"])
|
|
else
|
|
GameTooltip:AddDoubleLine(T["Left Click"], "|cffffffff" .. T["Show/Hide Timer"])
|
|
GameTooltip:AddDoubleLine(T["Right Click"], "|cffffffff" .. T["Reset Timer"])
|
|
end
|
|
GameTooltip:Show()
|
|
end
|
|
widget.Click = function()
|
|
this:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
|
if TimeManagerFrame then
|
|
if TimeManagerClockButton.alarmFiring then
|
|
TimeManager_TurnOffAlarm()
|
|
end
|
|
ToggleTimeManager()
|
|
return
|
|
end
|
|
if arg1 == "LeftButton" then
|
|
widget.timerFrame:SetShown(not widget.timerFrame:IsShown())
|
|
elseif arg1 == "RightButton" then
|
|
widget.timerFrame.Snapshot = GetTime()
|
|
end
|
|
end
|
|
C_Timer.NewTicker(1, function()
|
|
local secondsenabled = C.panel.seconds == "1"
|
|
local fmt
|
|
if C.global.twentyfour == "0" then
|
|
fmt = secondsenabled and "%I:%M:%S %p" or "%I:%M %p"
|
|
else
|
|
fmt = secondsenabled and "%H:%M:%S" or "%H:%M"
|
|
end
|
|
local time = C.global.servertime == "1" and date(fmt, GetServerEpoch()) or date(fmt)
|
|
pfUI.panel:OutputPanel("time", time, widget.Tooltip, widget.Click)
|
|
end)
|
|
|
|
widget.timerFrame = CreateFrame("Frame", "pfUITimer", UIParent)
|
|
widget.timerFrame:Hide()
|
|
widget.timerFrame:SetSize(120, 35)
|
|
widget.timerFrame:SetPoint("TOP", 0, -100)
|
|
UpdateMovable(widget.timerFrame)
|
|
|
|
widget.timerFrame.text = widget.timerFrame:CreateFontString("Status", "LOW", "GameFontNormal")
|
|
widget.timerFrame.text:SetFontObject(GameFontWhite)
|
|
widget.timerFrame.text:SetFont(font, font_size, "OUTLINE")
|
|
widget.timerFrame.text:SetAllPoints(widget.timerFrame)
|
|
widget.timerFrame:SetScript("OnUpdate", function()
|
|
if not widget.timerFrame.Snapshot then widget.timerFrame.Snapshot = GetTime() end
|
|
widget.timerFrame.curTime = SecondsToTime(floor(GetTime() - widget.timerFrame.Snapshot))
|
|
if widget.timerFrame.curTime ~= "" then
|
|
widget.timerFrame.text:SetText("|c33cccccc" .. widget.timerFrame.curTime)
|
|
else
|
|
widget.timerFrame.text:SetText("|cffff3333 --- " .. T["NEW TIMER"] .. " ---")
|
|
end
|
|
end)
|
|
|
|
-- Combat Timer
|
|
widget.combat = CreateFrame("Frame", "pfUICombatTimer", UIParent)
|
|
widget.combat:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget.combat:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
widget.combat:RegisterEvent("PLAYER_REGEN_DISABLED")
|
|
widget.combat:SetScript("OnEvent", function()
|
|
if event == "PLAYER_REGEN_DISABLED" then
|
|
if UnitAffectingCombat("player") and not this.combat then
|
|
this.combat = GetTime()
|
|
end
|
|
|
|
elseif event == "PLAYER_REGEN_ENABLED" then
|
|
if this.combat then
|
|
this.lastcombat = GetTime() - this.combat
|
|
this.combat = nil
|
|
pfUI.panel:OutputPanel("combat", "|cffffffff" .. SecondsToTime(ceil(this.lastcombat)))
|
|
end
|
|
|
|
elseif event == "PLAYER_ENTERING_WORLD" then
|
|
pfUI.panel:OutputPanel("combat", T["Combat"] .. ": " .. NOT_APPLICABLE)
|
|
end
|
|
end)
|
|
C_Timer.NewTicker(1, function()
|
|
if widget.combat.combat then
|
|
pfUI.panel:OutputPanel("combat", "|cffffaaaa" .. SecondsToTime(ceil(GetTime() - widget.combat.combat)))
|
|
end
|
|
end)
|
|
end
|
|
|
|
do -- FPS & Lag
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetLag", UIParent)
|
|
local lag, fps, laghex, fpshex, _
|
|
widget.Tooltip = function()
|
|
local active = 0
|
|
GameTooltip:ClearLines()
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:AddLine("|cff555555" .. T["Systeminfo"])
|
|
for i=1, GetNumAddOns() do
|
|
if IsAddOnLoaded(i) then
|
|
active = active + 1
|
|
end
|
|
end
|
|
|
|
local memkb, gckb = gcinfo()
|
|
local memmb = memkb and memkb > 0 and round((memkb or 0)/1000, 2) .. " MB" or UNAVAILABLE
|
|
local gcmb = gckb and gckb > 0 and round((gckb or 0)/1000, 2) .. " MB" or UNAVAILABLE
|
|
|
|
local nin, nout, nping = GetNetStats()
|
|
|
|
GameTooltip:AddDoubleLine(T["Active Addons"], "|cffffffff" .. active .. "|cff555555 / |cffffffff" .. GetNumAddOns())
|
|
GameTooltip:AddLine(" ")
|
|
GameTooltip:AddDoubleLine(T["Memory Usage"], "|cffffffff" .. memmb)
|
|
GameTooltip:AddDoubleLine(T["Next Memory Cleanup"], "|cffffffff" .. gcmb)
|
|
GameTooltip:AddLine(" ")
|
|
GameTooltip:AddDoubleLine(T["Network Down"], "|cffffffff" .. round(nin,1) .. "KB/s")
|
|
GameTooltip:AddDoubleLine(T["Network Up"], "|cffffffff" .. round(nout,1) .. "KB/s")
|
|
GameTooltip:AddDoubleLine(T["Network Latency"], "|cffffffff" .. nping .. "ms")
|
|
GameTooltip:AddLine(" ")
|
|
GameTooltip:AddDoubleLine(T["Graphic Renderer"], "|cffffffff" .. GetCVar("gxApi"))
|
|
GameTooltip:AddDoubleLine(T["Screen Resolution"], "|cffffffff" .. GetCVar("gxResolution"))
|
|
GameTooltip:AddDoubleLine(T["UI-Scale"], "|cffffffff" .. round(UIParent:GetEffectiveScale(),2))
|
|
GameTooltip:Show()
|
|
end
|
|
widget.Click = function()
|
|
if pfUI.addons and pfUI.addons:IsShown() then
|
|
pfUI.addons:Hide()
|
|
elseif pfUI.addons then
|
|
pfUI.addons:Show()
|
|
end
|
|
end
|
|
C_Timer.NewTicker(1, function()
|
|
fps = floor(GetFramerate())
|
|
_, _, lag = GetNetStats()
|
|
|
|
if C.panel.fpscolors == "1" then
|
|
_, _, _, fpshex = GetColorGradient(fps > 0 and fps/60 or 0)
|
|
_, _, _, laghex = GetColorGradient(lag > 0 and 60/lag or 0)
|
|
fps = fpshex .. fps .. "|r"
|
|
lag = laghex .. lag .. "|r"
|
|
end
|
|
|
|
pfUI.panel:OutputPanel("fps", fps .. " " .. T["fps"] .. " & " .. lag .. " " .. T["ms"], widget.Tooltip, widget.Click)
|
|
end)
|
|
end
|
|
|
|
do -- XP & Kills To Level
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetXP", UIParent)
|
|
local curexp, difexp, maxexp, remexp, oldexp, remstring
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("PLAYER_XP_UPDATE")
|
|
widget:SetScript("OnEvent", function()
|
|
if UnitLevel("player") < _G.MAX_PLAYER_LEVEL then
|
|
curexp = UnitXP("player")
|
|
if oldexp ~= nil then
|
|
difexp = curexp - oldexp
|
|
maxexp = UnitXPMax("player")
|
|
if difexp > 0 then
|
|
remexp = floor((maxexp - curexp)/difexp)
|
|
remstring = "|cff555555 [" .. remexp .. "]|r"
|
|
else
|
|
remstring = nil
|
|
end
|
|
end
|
|
oldexp = curexp
|
|
|
|
local a=UnitXP("player")
|
|
local b=UnitXPMax("player")
|
|
local xprested = tonumber(GetXPExhaustion())
|
|
if remstring == nil then remstring = "" end
|
|
if xprested ~= nil then
|
|
pfUI.panel:OutputPanel("exp", T["Exp"] .. ": |cffaaaaff"..floor((a/b)*100).."%"..remstring)
|
|
else
|
|
pfUI.panel:OutputPanel("exp", T["Exp"] .. ": " .. floor((a/b)*100) .. "%" .. remstring)
|
|
end
|
|
else
|
|
pfUI.panel:OutputPanel("exp", T["Exp"] .. ": " .. NOT_APPLICABLE)
|
|
end
|
|
end)
|
|
end
|
|
|
|
do -- Bagspace
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetBag", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("BAG_UPDATE_DELAYED")
|
|
widget:SetScript("OnEvent", function()
|
|
local maxslots = 0
|
|
local usedslots = 0
|
|
|
|
for bag = 0,4 do
|
|
if C.panel.bag.ignorespecial ~= "1" or GetBagFamily(bag) == "BAG" then
|
|
local bagsize = GetContainerNumSlots(bag)
|
|
maxslots = maxslots + bagsize
|
|
for j = 1,bagsize do
|
|
local itemID = C_Container.GetContainerItemID(bag,j)
|
|
if itemID then
|
|
usedslots = usedslots + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local freeslots = maxslots - usedslots
|
|
pfUI.panel:OutputPanel("bagspace", freeslots .. " (" .. usedslots .. "/" .. maxslots .. ")", nil, OpenAllBags)
|
|
end)
|
|
end
|
|
|
|
do -- Gold
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetGold", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("PLAYER_MONEY")
|
|
widget.Click = function()
|
|
if IsShiftKeyDown() then
|
|
-- read current data
|
|
local realm = GetRealmName()
|
|
local unit = UnitName("player")
|
|
local money = GetMoney()
|
|
|
|
-- reset gold value and hide tooltip
|
|
pfUI_cache["gold"][realm] = { [unit] = money }
|
|
GameTooltip:Hide()
|
|
else
|
|
OpenAllBags()
|
|
end
|
|
end
|
|
widget.Tooltip = function()
|
|
local gold = floor(GetMoney()/ 10000)
|
|
local silver = floor(mod((GetMoney()/100),100))
|
|
local copper = floor(mod(GetMoney(),100))
|
|
|
|
local dmod = ""
|
|
if pfUI.panel.diffMoney < 0 then
|
|
dmod = "|cffff8888-"
|
|
elseif pfUI.panel.diffMoney > 0 then
|
|
dmod = "|cff88ff88+"
|
|
end
|
|
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:ClearLines()
|
|
|
|
GameTooltip:AddLine("|cff555555" .. T["Money"])
|
|
GameTooltip:AddDoubleLine(T["Login"] .. ":", CreateGoldString(pfUI.panel.initMoney))
|
|
GameTooltip:AddDoubleLine(T["Now"] .. ":", CreateGoldString(GetMoney()))
|
|
GameTooltip:AddDoubleLine("|cffffffff","")
|
|
local totalgold = 0
|
|
for name, gold in pairs(pfUI_cache["gold"][GetRealmName()]) do
|
|
totalgold = totalgold + gold
|
|
if name ~= UnitName("player") then
|
|
GameTooltip:AddDoubleLine(name .. ":", CreateGoldString(gold))
|
|
end
|
|
end
|
|
GameTooltip:AddDoubleLine("|cffffffff","")
|
|
GameTooltip:AddDoubleLine(T["This Session"] .. ":", dmod .. CreateGoldString(math.abs(pfUI.panel.diffMoney)))
|
|
GameTooltip:AddDoubleLine(T["Total Gold"] .. ":", CreateGoldString(totalgold))
|
|
GameTooltip:AddLine(" ")
|
|
GameTooltip:AddLine(T["Shift-Click to reset all money totals"], .5, .5, .5, 1)
|
|
GameTooltip:Show()
|
|
end
|
|
widget:SetScript("OnEvent", function()
|
|
local realm = GetRealmName()
|
|
local unit = UnitName("player")
|
|
local money = GetMoney()
|
|
local goldstr = CreateGoldString(GetMoney())
|
|
|
|
pfUI.panel.initMoney = pfUI.panel.initMoney or money
|
|
pfUI.panel.diffMoney = money - pfUI.panel.initMoney
|
|
|
|
pfUI_cache["gold"][realm] = pfUI_cache["gold"][realm] or {}
|
|
pfUI_cache["gold"][realm][unit] = money
|
|
|
|
pfUI.panel:OutputPanel("gold", goldstr, widget.Tooltip, widget.Click)
|
|
end)
|
|
end
|
|
|
|
do -- Friends
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetFriends", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("FRIENDLIST_UPDATE")
|
|
widget.Tooltip = function()
|
|
local init = nil
|
|
local all = GetNumFriends()
|
|
local playerzone = GetRealZoneText()
|
|
|
|
for friendIndex=1, all do
|
|
local info = C_FriendList.GetFriendInfoByIndex(friendIndex)
|
|
if info and info.connected and info.classFilename and info.level then
|
|
if not init then
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:AddLine("|cff555555" .. T["Friends Online"])
|
|
init = true
|
|
end
|
|
local ccolor = PFUI_CLASS_COLORS[info.classFilename]
|
|
local lcolor = GetDifficultyColor(tonumber(info.level)) or { 1, 1, 1 }
|
|
local zcolor = info.area == playerzone and "|cff33ffcc" or "|cffcccccc"
|
|
GameTooltip:AddDoubleLine(ccolor:WrapTextInColorCode(info.name) .. rgbhex(lcolor) .. " [" .. info.level .. "]", zcolor .. info.area)
|
|
end
|
|
end
|
|
|
|
GameTooltip:Show()
|
|
end
|
|
widget.Click = function() ToggleFriendsFrame(1) end
|
|
widget:SetScript("OnEvent", function()
|
|
local online = C_FriendList.GetNumOnlineFriends()
|
|
pfUI.panel:OutputPanel("friends", FRIENDS .. ": " .. online, widget.Tooltip, widget.Click)
|
|
end)
|
|
end
|
|
|
|
do -- Guild
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetGuild", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("GUILD_ROSTER_UPDATE")
|
|
widget:RegisterEvent("PLAYER_GUILD_UPDATE")
|
|
widget.Tooltip = function()
|
|
-- skip without guild
|
|
if not IsInGuild() then return end
|
|
|
|
local raidparty = {}
|
|
for i=1,4 do -- detect people in group
|
|
if UnitExists("party"..i) then
|
|
raidparty[UnitName("party"..i)] = true
|
|
end
|
|
end
|
|
for i=1,40 do -- detect people in raid
|
|
if UnitExists("raid"..i) then
|
|
raidparty[UnitName("raid"..i)] = true
|
|
end
|
|
end
|
|
|
|
local all = GetNumGuildMembers()
|
|
local playerzone = GetRealZoneText()
|
|
local off = FauxScrollFrame_GetOffset(GuildListScrollFrame)
|
|
local left, field, init
|
|
|
|
for i=1, all do
|
|
local name, _, _, level, class, zone, _, _, online = GetGuildRosterInfo(off + i)
|
|
if online then
|
|
if not init then
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:AddLine("|cff555555" .. T["Guild Online"])
|
|
init = true
|
|
end
|
|
|
|
local ccolor = PFUI_CLASS_COLORS[L["class"][class]] or { 1, 1, 1 }
|
|
local lcolor = GetDifficultyColor(tonumber(level)) or { 1, 1, 1 }
|
|
local level = "|cff555555" .. "[" .. rgbhex(lcolor) .. level .. "|cff555555]"
|
|
local raid = raidparty[name] and "|cff555555[|cff33ffccG|cff555555]|r" or ""
|
|
|
|
if not left then
|
|
left = level .. raid .. " " .. rgbhex(ccolor) .. name
|
|
else
|
|
field = rgbhex(ccolor) .. name .. " " .. raid .. level
|
|
GameTooltip:AddDoubleLine(left, field)
|
|
left = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
if left then
|
|
GameTooltip:AddDoubleLine(left, "")
|
|
end
|
|
|
|
GameTooltip:Show()
|
|
end
|
|
widget.Click = function() ToggleFriendsFrame(3) end
|
|
widget:SetScript("OnEvent", function()
|
|
if IsInGuild() then
|
|
local count = 0
|
|
for i = 1, GetNumGuildMembers() do
|
|
local _, _, _, _, _, _, _, _, online = GetGuildRosterInfo(i)
|
|
if online then count = count + 1 end
|
|
end
|
|
|
|
pfUI.panel:OutputPanel("guild", GUILD .. ": " .. count, widget.Tooltip, widget.Click)
|
|
else
|
|
pfUI.panel:OutputPanel("guild", GUILD .. ": " .. NOT_APPLICABLE, widget.Tooltip, widget.Click)
|
|
end
|
|
end)
|
|
|
|
C_Timer.NewTicker(60, function()
|
|
if IsInGuild() then GuildRoster() end
|
|
end)
|
|
end
|
|
|
|
do -- Durability / Repair
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetRepair", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("PLAYER_MONEY")
|
|
widget:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
widget:RegisterEvent("PLAYER_DEAD")
|
|
widget:RegisterEvent("PLAYER_UNGHOST")
|
|
widget:RegisterEvent("PLAYER_EQUIPMENT_CHANGED") -- ClassicAPI: equip/unequip changes total durability
|
|
widget:RegisterEvent("UPDATE_INVENTORY_DURABILITY") -- ClassicAPI: combat wear / repair
|
|
|
|
widget.Click = function() ToggleCharacter("PaperDollFrame") end
|
|
widget.Tooltip = function()
|
|
local totalRep = 0
|
|
local itemLines = {}
|
|
for id = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do
|
|
local cur, max = GetInventoryItemDurability(id)
|
|
if cur and max then
|
|
totalRep = totalRep + (GetInventoryItemRepairCost(id) or 0)
|
|
local repPercent = floor(cur / max * 100)
|
|
if repPercent < 100 then
|
|
local _, _, _, hex = GetColorGradient(repPercent/100)
|
|
local link = GetInventoryItemLink("player", id)
|
|
local texture = GetInventoryItemTexture("player", id)
|
|
if texture then
|
|
link = CreateSimpleTextureMarkup(texture, 24) .. " " .. link
|
|
end
|
|
itemLines[table.getn(itemLines)+1] = {
|
|
link,
|
|
string.format("%s%s%%|r", hex, repPercent)
|
|
}
|
|
end
|
|
end
|
|
end
|
|
if totalRep > 0 then
|
|
GameTooltip:ClearLines()
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:AddLine(REPAIR_COST.." " .. CreateGoldString(totalRep), 0.3333, 0.3333, 0.3333)
|
|
for _,line in ipairs(itemLines) do
|
|
GameTooltip:AddDoubleLine(line[1],line[2])
|
|
end
|
|
GameTooltip:Show()
|
|
end
|
|
end
|
|
widget:SetScript("OnEvent", function()
|
|
local totalCurr, totalMax = 0, 0
|
|
for id = INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED do
|
|
local cur, max = GetInventoryItemDurability(id)
|
|
if cur and max then
|
|
totalCurr = totalCurr + cur
|
|
totalMax = totalMax + max
|
|
end
|
|
end
|
|
local armorPercent = totalMax > 0 and floor(totalCurr / totalMax * 100) or 100
|
|
|
|
pfUI.panel:OutputPanel("durability", armorPercent .. "% " .. ARMOR, widget.Tooltip, widget.Click)
|
|
end)
|
|
end
|
|
|
|
do -- Zone
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetZone", UIParent)
|
|
for _,event in pairs({"PLAYER_ENTERING_WORLD", "MINIMAP_ZONE_CHANGED"}) do
|
|
widget:RegisterEvent(event)
|
|
end
|
|
widget.Tooltip = function()
|
|
local real = GetRealZoneText()
|
|
local sub = GetSubZoneText()
|
|
GameTooltip:ClearLines()
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:AddLine("|cffffffff" .. real)
|
|
GameTooltip:AddLine(sub)
|
|
|
|
local posX, posY = GetPlayerMapPosition("player")
|
|
if posX ~= 0 and posY ~= 0 then
|
|
GameTooltip:AddLine("|cffaaaaaa" .. round(posX * 100, 1) .. ", " .. round(posY * 100, 1))
|
|
end
|
|
|
|
GameTooltip:Show()
|
|
end
|
|
widget.Click = function()
|
|
WorldMapFrame:SetShown(not WorldMapFrame:IsShown())
|
|
end
|
|
widget:SetScript("OnEvent", function()
|
|
pfUI.panel:OutputPanel("zone", GetMinimapZoneText(), widget.Tooltip, widget.Click)
|
|
end)
|
|
end
|
|
|
|
do -- Ammo
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetAmmo", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterUnitEvent("UNIT_INVENTORY_CHANGED", "player")
|
|
widget:RegisterEvent("BAG_UPDATE_DELAYED")
|
|
widget.Tooltip = function()
|
|
if GetInventoryItemQuality("player", 0) then
|
|
local ammo = GetInventoryItemCount("player", 0)
|
|
GameTooltip:ClearLines()
|
|
GameTooltip_SetDefaultAnchor(GameTooltip, this)
|
|
GameTooltip:SetInventoryItem("player", 0)
|
|
GameTooltip:AddLine(T["Count"] .. ": " .. ammo, .3,1,.8)
|
|
GameTooltip:Show()
|
|
end
|
|
end
|
|
widget:SetScript("OnEvent", function()
|
|
if not GetInventoryItemQuality("player", 0) then
|
|
pfUI.panel:OutputPanel("ammo", AMMOSLOT .. ": -")
|
|
else
|
|
pfUI.panel:OutputPanel("ammo", AMMOSLOT .. ": " .. GetInventoryItemCount("player", 0), tooltip)
|
|
end
|
|
end)
|
|
end
|
|
|
|
|
|
do
|
|
-- Hearthstone bind location
|
|
local hearth = CreateFrame("Frame", "pfPanelBindLocation", UIParent)
|
|
hearth:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
hearth:RegisterEvent("HEARTHSTONE_BOUND")
|
|
hearth:SetScript("OnEvent", function()
|
|
pfUI.panel:OutputPanel("bindlocation", T["Hearthstone"] .. ": " .. (GetBindLocation() or T["Not Set"]))
|
|
end)
|
|
|
|
local itemIDs = {
|
|
soulshard = 6265,
|
|
flashpowder = 5140,
|
|
thistletea = 7676,
|
|
blindpowder = 5530
|
|
}
|
|
|
|
local function AddItemToPanel(panelType)
|
|
local itemID = itemIDs[panelType]
|
|
if C_Item.IsItemDataCachedByID(itemID) then
|
|
local itemName, count = C_Item.GetItemNameByID(itemID), C_Item.GetItemCount(itemID)
|
|
pfUI.panel:OutputPanel(panelType, itemName .. ": " .. count)
|
|
else
|
|
local item = Item:CreateFromItemID(itemID)
|
|
item:ContinueOnItemLoad(function()
|
|
local itemName, count = item:GetItemName(), C_Item.GetItemCount(item:GetItemID())
|
|
pfUI.panel:OutputPanel(panelType, itemName .. ": " .. count)
|
|
end)
|
|
end
|
|
end
|
|
|
|
local class = UnitClassBase('player')
|
|
if class == "WARLOCK" then
|
|
-- Soulshards
|
|
local widget = CreateFrame("Frame", "pfPanelWidgetSoulshard", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("BAG_UPDATE_DELAYED")
|
|
widget:SetScript("OnEvent", function()
|
|
AddItemToPanel("soulshard")
|
|
end)
|
|
end
|
|
|
|
if class == "ROGUE" then
|
|
-- Flash Powder
|
|
local widget = CreateFrame("Frame", "pfPanelFlashPowder", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("BAG_UPDATE_DELAYED")
|
|
widget:SetScript("OnEvent", function()
|
|
AddItemToPanel("flashpowder")
|
|
end)
|
|
|
|
-- Thistle Tea
|
|
local widget = CreateFrame("Frame", "pfPanelThistleTea", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("BAG_UPDATE_DELAYED")
|
|
widget:SetScript("OnEvent", function()
|
|
AddItemToPanel("thistletea")
|
|
end)
|
|
|
|
-- Blinding Powder
|
|
local widget = CreateFrame("Frame", "pfPanelBlindingPowder", UIParent)
|
|
widget:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
widget:RegisterEvent("BAG_UPDATE_DELAYED")
|
|
widget:SetScript("OnEvent", function()
|
|
AddItemToPanel("blindpowder")
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
|
|
pfUI.panel = {}
|
|
pfUI.panel.modules = {}
|
|
|
|
-- list of available panel fields
|
|
pfUI.panel.options = { "time", "fps", "exp", "gold", "friends",
|
|
"guild", "durability", "zone", "ammo", "bagspace" }
|
|
|
|
local panels = {}
|
|
function pfUI.panel:OutputPanel(entry, value, tooltip, func)
|
|
-- return if not yet fully initialized
|
|
if not pfUI.panel.minimap then return end
|
|
|
|
-- initialize then panels if not yet done
|
|
if not panels[1] then
|
|
panels = {
|
|
{ pfUI.panel.left.left, C.panel.left.left },
|
|
{ pfUI.panel.left.center, C.panel.left.center },
|
|
{ pfUI.panel.left.right, C.panel.left.right },
|
|
{ pfUI.panel.right.left, C.panel.right.left },
|
|
{ pfUI.panel.right.center, C.panel.right.center },
|
|
{ pfUI.panel.right.right, C.panel.right.right },
|
|
{ pfUI.panel.minimap, C.panel.other.minimap },
|
|
}
|
|
end
|
|
|
|
for i,p in pairs(panels) do
|
|
local frame, config = p[1], p[2]
|
|
if config == entry then
|
|
frame.text:SetText(value)
|
|
if not frame.initialized or frame.initialized ~= entry then
|
|
if tooltip then
|
|
frame:SetScript("OnEnter", tooltip)
|
|
frame:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
|
end
|
|
|
|
if func then
|
|
frame:SetScript("OnClick", func)
|
|
end
|
|
frame.initialized = entry
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function CreatePanelButton(parent, width, location, tjustify)
|
|
local frame = CreateFrame("Button", nil, parent)
|
|
frame:SetFrameLevel(0)
|
|
frame:ClearAllPoints()
|
|
frame:SetSize(width, parent:GetHeight())
|
|
frame:SetPoint(location, 0, 0)
|
|
frame.text = frame:CreateFontString("Status", "LOW", "GameFontNormal")
|
|
frame.text:ClearAllPoints()
|
|
frame.text:SetAllPoints(frame)
|
|
frame.text:SetPoint(location, 0, 0)
|
|
frame.text:SetJustifyH(tjustify)
|
|
frame.text:SetFont(font, font_size, "OUTLINE")
|
|
frame.text:SetFontObject(GameFontWhite)
|
|
return frame
|
|
end
|
|
|
|
local function CreatePanel(panelname, default_border)
|
|
local frame = CreateFrame("Frame", panelname, UIParent)
|
|
frame:SetFrameStrata("FULLSCREEN")
|
|
frame:ClearAllPoints()
|
|
frame:SetFrameStrata("DIALOG")
|
|
frame:SetHeight(C.global.font_size*1.5)
|
|
CreateBackdrop(frame, default_border, nil)
|
|
CreateBackdropShadow(frame)
|
|
return frame
|
|
end
|
|
|
|
local function CreatePanelHide(parent, leftright)
|
|
parent.hide = CreateFrame("Button", nil, parent)
|
|
parent.hide:SetFrameLevel(4)
|
|
parent.hide:SetPoint(leftright, parent.backdrop, leftright, 0, 0)
|
|
parent.hide:SetPoint("TOP", parent.backdrop, "TOP", 0, 0)
|
|
parent.hide:SetPoint("BOTTOM", parent.backdrop, "BOTTOM", 0, 0)
|
|
parent.hide:SetWidth(12)
|
|
return parent.hide
|
|
end
|
|
|
|
local function CreatePanelHideTexture(parent, framename, leftright)
|
|
SkinButton(parent)
|
|
parent:SetBackdropColor(0,0,0,0)
|
|
|
|
parent.texture = parent:CreateTexture(framename)
|
|
local imgstring = "img:" .. leftright
|
|
parent.texture:SetTexture(pfUI.media[imgstring])
|
|
parent.texture:SetPoint("CENTER", 0, 0)
|
|
parent.texture:SetSize(8, 8)
|
|
parent.texture:SetVertexColor(.25,.25,.25,1)
|
|
return parent.texture
|
|
end
|
|
|
|
-- left panel
|
|
pfUI.panel.left = CreatePanel("pfPanelLeft", default_border)
|
|
pfUI.panel.left.hide = CreatePanelHide(pfUI.panel.left, "LEFT", -5)
|
|
pfUI.panel.left.hide.texture = CreatePanelHideTexture(pfUI.panel.left.hide, "pfPanelLeftHide", "left")
|
|
|
|
if pfUI.chat then
|
|
pfUI.panel.left:SetScale(pfUI.chat.left:GetScale())
|
|
pfUI.panel.left:SetWidth(tonumber(C.chat.left.width) - 4)
|
|
pfUI.panel.left:SetPoint("BOTTOM", pfUI.chat.left, "BOTTOM", 0, 2)
|
|
else
|
|
pfUI.panel.left:SetWidth(C.chat.left.width)
|
|
pfUI.panel.left:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 5, 5)
|
|
end
|
|
|
|
UpdateMovable(pfUI.panel.left)
|
|
|
|
pfUI.panel.left.hide:SetScript("OnClick", function()
|
|
pfUI.chat.left:SetShown(not pfUI.chat.left:IsShown())
|
|
end)
|
|
|
|
if not pfUI.chat then pfUI.panel.left.hide:Hide() end
|
|
|
|
-- buttons for left panel
|
|
local width = pfUI.panel.left:GetWidth() / 3 - 2
|
|
width = C.panel.left.left == "none" and C.panel.left.right == "none" and pfUI.panel.left:GetWidth() - 2 or width
|
|
width = C.panel.left.center == "none" and pfUI.panel.left:GetWidth() / 2 - 2 or width
|
|
|
|
pfUI.panel.left.left = CreatePanelButton(pfUI.panel.left, width, "LEFT", "CENTER")
|
|
pfUI.panel.left.center = CreatePanelButton(pfUI.panel.left, width, "CENTER", "CENTER")
|
|
pfUI.panel.left.right = CreatePanelButton(pfUI.panel.left, width, "RIGHT", "CENTER")
|
|
|
|
if C.panel.left.left == "none"
|
|
and C.panel.left.center == "none"
|
|
and C.panel.left.right == "none" then
|
|
pfUI.panel.left:Hide()
|
|
end
|
|
|
|
-- right panel
|
|
pfUI.panel.right = CreatePanel("pfPanelRight", default_border)
|
|
pfUI.panel.right.hide = CreatePanelHide(pfUI.panel.right, "RIGHT", 5)
|
|
pfUI.panel.right.hide.texture = CreatePanelHideTexture(pfUI.panel.right.hide, "pfPanelRightHide", "right")
|
|
|
|
if pfUI.chat then
|
|
pfUI.panel.right:SetScale(pfUI.chat.right:GetScale())
|
|
pfUI.panel.right:SetWidth(tonumber(C.chat.right.width) - 4)
|
|
pfUI.panel.right:SetPoint("BOTTOM", pfUI.chat.right, "BOTTOM", 0, 2)
|
|
else
|
|
pfUI.panel.right:SetWidth(C.chat.right.width)
|
|
pfUI.panel.right:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -5, 5)
|
|
end
|
|
|
|
UpdateMovable(pfUI.panel.right)
|
|
|
|
pfUI.panel.right.hide:SetScript("OnClick", function()
|
|
pfUI.chat.right:SetShown(not pfUI.chat.right:IsShown())
|
|
end)
|
|
|
|
if not pfUI.chat then pfUI.panel.right.hide:Hide() end
|
|
|
|
-- buttons for right panel
|
|
local width = pfUI.panel.right:GetWidth() / 3 - 2
|
|
width = C.panel.right.left == "none" and C.panel.right.right == "none" and pfUI.panel.right:GetWidth() - 2 or width
|
|
width = C.panel.right.center == "none" and pfUI.panel.right:GetWidth() / 2 - 2 or width
|
|
|
|
pfUI.panel.right.left = CreatePanelButton(pfUI.panel.right, width, "LEFT", "CENTER")
|
|
pfUI.panel.right.center = CreatePanelButton(pfUI.panel.right, width, "CENTER", "CENTER")
|
|
pfUI.panel.right.right = CreatePanelButton(pfUI.panel.right, width, "RIGHT", "CENTER")
|
|
|
|
if C.panel.right.left == "none"
|
|
and C.panel.right.center == "none"
|
|
and C.panel.right.right == "none" then
|
|
pfUI.panel.right:Hide()
|
|
end
|
|
|
|
pfUI.panel.minimap = CreateFrame("Button", "pfPanelMinimap", UIParent)
|
|
if pfUI.minimap then
|
|
pfUI.panel.minimap:SetWidth(pfUI.minimap:GetWidth())
|
|
pfUI.panel.minimap:SetPoint("TOPLEFT", pfUI.minimap, "BOTTOMLEFT", 0 , -default_border*3)
|
|
pfUI.panel.minimap:SetPoint("TOPRIGHT", pfUI.minimap, "BOTTOMRIGHT", 0 , default_border*3)
|
|
else
|
|
pfUI.panel.minimap:SetWidth(200)
|
|
pfUI.panel.minimap:SetPoint("TOP", UIParent, "TOP", 0, -5)
|
|
end
|
|
|
|
pfUI.panel.minimap:SetHeight(C.global.font_size*1.5)
|
|
pfUI.panel.minimap:SetFrameStrata("MEDIUM")
|
|
|
|
CreateBackdrop(pfUI.panel.minimap, default_border)
|
|
CreateBackdropShadow(pfUI.panel.minimap)
|
|
UpdateMovable(pfUI.panel.minimap)
|
|
|
|
pfUI.panel.minimap.text = pfUI.panel.minimap:CreateFontString("MinimapZoneText", "LOW", "GameFontNormal")
|
|
pfUI.panel.minimap.text:SetFont(font, font_size, "OUTLINE")
|
|
pfUI.panel.minimap.text:SetAllPoints()
|
|
pfUI.panel.minimap.text:SetFontObject(GameFontWhite)
|
|
|
|
if C.panel.other.minimap == "none" then pfUI.panel.minimap:Hide() end
|
|
|
|
-- MicroButtons
|
|
if C.panel.micro.enable == "1" then
|
|
pfUI.panel.microbutton = CreateFrame("Frame", "pfPanelMicroButton", UIParent)
|
|
pfUI.panel.microbutton:SetPoint("TOP", pfUI.panel.minimap, "BOTTOM", 0, -2*default_border)
|
|
UpdateMovable(pfUI.panel.microbutton)
|
|
pfUI.panel.microbutton:SetSize(145, 23)
|
|
pfUI.panel.microbutton:SetFrameStrata("MEDIUM")
|
|
|
|
local microButtons = {
|
|
'CharacterMicroButton', 'SpellbookMicroButton', 'TalentMicroButton',
|
|
'QuestLogMicroButton', 'SocialsMicroButton', 'WorldMapMicroButton',
|
|
'MainMenuMicroButton', 'HelpMicroButton',
|
|
}
|
|
|
|
for i=1,table.getn(microButtons) do
|
|
local anchor = _G[microButtons[i-1]] or pfUI.panel.microbutton
|
|
local button = _G[microButtons[i]]
|
|
button:ClearAllPoints()
|
|
button:SetParent(pfUI.panel.microbutton)
|
|
if i == 1 then
|
|
button:SetPoint("LEFT", pfUI.panel.microbutton, "LEFT", 1, 10)
|
|
else
|
|
button:SetPoint("TOPLEFT", anchor, "TOPRIGHT", 1, 0)
|
|
end
|
|
|
|
button:SetScale(.6)
|
|
button.frame = CreateFrame("Frame", "backdrop", button)
|
|
button.frame:SetScale(1.4)
|
|
button.frame:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -16)
|
|
button.frame:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 1)
|
|
CreateBackdrop(button.frame, default_border)
|
|
button:Show()
|
|
end
|
|
end
|
|
|
|
|
|
pfUI.panel.autohide = CreateFrame("Frame", nil, UIParent)
|
|
pfUI.panel.autohide:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
pfUI.panel.autohide:SetScript("OnEvent", function()
|
|
if C.panel.hide_leftchat == "1" then
|
|
EnableAutohide(pfUI.panel.left, 2)
|
|
end
|
|
if C.panel.hide_rightchat == "1" then
|
|
EnableAutohide(pfUI.panel.right, 2)
|
|
end
|
|
if C.panel.hide_minimap == "1" then
|
|
EnableAutohide(pfUI.panel.minimap, 2)
|
|
end
|
|
if C.panel.hide_microbar == "1" then
|
|
EnableAutohide(pfUI.panel.microbutton, 2)
|
|
end
|
|
end)
|
|
end)
|