Add files via upload
This commit is contained in:
@@ -0,0 +1,966 @@
|
|||||||
|
-- Relationships PVP
|
||||||
|
|
||||||
|
RelationshipsPVPCharDB = RelationshipsPVPCharDB or {}
|
||||||
|
|
||||||
|
local BG_KEYS = { "AV", "WSG", "AB" }
|
||||||
|
local ARENA_KEYS = { "A2", "A3", "A5", "SK" }
|
||||||
|
local ALL_KEYS = { "AV", "WSG", "AB", "A2", "A3", "A5", "SK" }
|
||||||
|
|
||||||
|
local BG_NAMES = {
|
||||||
|
AV = "Alterac Valley",
|
||||||
|
WSG = "Warsong Gulch",
|
||||||
|
AB = "Arathi Basin",
|
||||||
|
A2 = "2v2 Rated",
|
||||||
|
A3 = "3v3 Rated",
|
||||||
|
A5 = "5v5 Rated",
|
||||||
|
SK = "Skirmish",
|
||||||
|
}
|
||||||
|
|
||||||
|
local BG_COLORS = {
|
||||||
|
AV = { r = 0.6, g = 0.85, b = 1.0 },
|
||||||
|
WSG = { r = 0.6, g = 1.0, b = 0.6 },
|
||||||
|
AB = { r = 1.0, g = 0.85, b = 0.4 },
|
||||||
|
A2 = { r = 1.0, g = 0.6, b = 0.9 },
|
||||||
|
A3 = { r = 1.0, g = 0.5, b = 0.6 },
|
||||||
|
A5 = { r = 0.9, g = 0.5, b = 1.0 },
|
||||||
|
SK = { r = 0.8, g = 0.8, b = 0.8 },
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Arena bracket meta: teamSize + isRated (registeredMatch)
|
||||||
|
local ARENA_META = {
|
||||||
|
A2 = { size = 2, rated = 1 },
|
||||||
|
A3 = { size = 3, rated = 1 },
|
||||||
|
A5 = { size = 5, rated = 1 },
|
||||||
|
SK = { size = 2, rated = 0 }, -- default skirmish to 2v2 unrated
|
||||||
|
}
|
||||||
|
|
||||||
|
-- TurtleWoW / OctoWoW arena finder ids for JoinArenaQueue(id).
|
||||||
|
-- Skirmish must be 0; passing the team size opens the Blood Ring panel
|
||||||
|
-- without completing the queue.
|
||||||
|
local ARENA_IDS = {
|
||||||
|
SK = 0,
|
||||||
|
A2 = 1,
|
||||||
|
A3 = 2,
|
||||||
|
A5 = 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
local MARKS_WIN = 3
|
||||||
|
local MARKS_LOSS = 1
|
||||||
|
|
||||||
|
local currentBG = nil
|
||||||
|
local endReported = {}
|
||||||
|
|
||||||
|
-- Track the last arena bracket the user queued for, so we can classify
|
||||||
|
-- the resulting match even on clients that don't report teamSize.
|
||||||
|
local lastQueuedArena = nil
|
||||||
|
|
||||||
|
-- Runtime UI (row FontStrings created dynamically)
|
||||||
|
local rowStrings = {}
|
||||||
|
local totalRow = nil
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Utility
|
||||||
|
---------------------------------------------------------------
|
||||||
|
local function NewStatBlock()
|
||||||
|
return {
|
||||||
|
wins = 0, losses = 0,
|
||||||
|
kills = 0, deaths = 0, hk = 0,
|
||||||
|
marks = 0, honor = 0,
|
||||||
|
bestKB = 0, streak = 0, bestStreak = 0,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EnsureDB()
|
||||||
|
local db = RelationshipsPVPCharDB
|
||||||
|
db.stats = db.stats or {}
|
||||||
|
db.icon = db.icon or { point = "CENTER", x = 60, y = -60 }
|
||||||
|
if db.showIcon == nil then db.showIcon = true end
|
||||||
|
for i = 1, table.getn(ALL_KEYS) do
|
||||||
|
local k = ALL_KEYS[i]
|
||||||
|
local s = db.stats[k] or NewStatBlock()
|
||||||
|
if s.honor == nil then s.honor = 0 end
|
||||||
|
if s.bestKB == nil then s.bestKB = 0 end
|
||||||
|
if s.streak == nil then s.streak = 0 end
|
||||||
|
if s.bestStreak == nil then s.bestStreak = 0 end
|
||||||
|
if s.hk == nil then s.hk = 0 end
|
||||||
|
if s.marks == nil then s.marks = 0 end
|
||||||
|
db.stats[k] = s
|
||||||
|
end
|
||||||
|
return db
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_SaveIconPos()
|
||||||
|
local db = EnsureDB()
|
||||||
|
local btn = RelationshipsPVPMinimapButton
|
||||||
|
if not btn then return end
|
||||||
|
local point, _, _, x, y = btn:GetPoint()
|
||||||
|
db.icon.point = point or "CENTER"
|
||||||
|
db.icon.x = x or 0
|
||||||
|
db.icon.y = y or 0
|
||||||
|
db.icon.parent = "Minimap"
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ApplyIconVisibility()
|
||||||
|
local db = EnsureDB()
|
||||||
|
local btn = RelationshipsPVPMinimapButton
|
||||||
|
if not btn then return end
|
||||||
|
if db.showIcon then btn:Show() else btn:Hide() end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- The Minimap frame can be briefly hidden during loading screens / entering
|
||||||
|
-- battlegrounds; when it re-shows, child buttons parented to it sometimes
|
||||||
|
-- stay hidden until touched. This ticker re-asserts our intended visibility
|
||||||
|
-- once per second so the icon never "randomly disappears".
|
||||||
|
local iconWatcher
|
||||||
|
local function InstallIconWatcher()
|
||||||
|
if iconWatcher then return end
|
||||||
|
iconWatcher = CreateFrame("Frame")
|
||||||
|
iconWatcher.elapsed = 0
|
||||||
|
iconWatcher:SetScript("OnUpdate", function()
|
||||||
|
iconWatcher.elapsed = (iconWatcher.elapsed or 0) + arg1
|
||||||
|
if iconWatcher.elapsed < 1.0 then return end
|
||||||
|
iconWatcher.elapsed = 0
|
||||||
|
local db = RelationshipsPVPCharDB
|
||||||
|
if not db then return end
|
||||||
|
local btn = RelationshipsPVPMinimapButton
|
||||||
|
if not btn then return end
|
||||||
|
if db.showIcon then
|
||||||
|
if not btn:IsShown() then btn:Show() end
|
||||||
|
else
|
||||||
|
if btn:IsShown() then btn:Hide() end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function RestoreIconPos()
|
||||||
|
local db = EnsureDB()
|
||||||
|
local btn = RelationshipsPVPMinimapButton
|
||||||
|
if not btn then return end
|
||||||
|
local parent = (db.icon.parent == "UIParent") and UIParent or Minimap
|
||||||
|
btn:ClearAllPoints()
|
||||||
|
btn:SetPoint(db.icon.point, parent, db.icon.point, db.icon.x, db.icon.y)
|
||||||
|
ApplyIconVisibility()
|
||||||
|
InstallIconWatcher()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SavePanelPos()
|
||||||
|
local db = EnsureDB()
|
||||||
|
db.panel = db.panel or {}
|
||||||
|
if not RelationshipsPVPFrame then return end
|
||||||
|
local point, _, _, x, y = RelationshipsPVPFrame:GetPoint()
|
||||||
|
db.panel.point = point or "CENTER"
|
||||||
|
db.panel.x = x or 0
|
||||||
|
db.panel.y = y or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local function RestorePanelPos()
|
||||||
|
local db = EnsureDB()
|
||||||
|
if not RelationshipsPVPFrame or not db.panel or not db.panel.point then return end
|
||||||
|
RelationshipsPVPFrame:ClearAllPoints()
|
||||||
|
RelationshipsPVPFrame:SetPoint(db.panel.point, UIParent, db.panel.point, db.panel.x, db.panel.y)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Print(msg)
|
||||||
|
if DEFAULT_CHAT_FRAME then
|
||||||
|
DEFAULT_CHAT_FRAME:AddMessage("|cff66ccffRelationships PVP:|r " .. msg)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function MapNameToKey(name)
|
||||||
|
if not name then return nil end
|
||||||
|
if name == BG_NAMES.AV then return "AV" end
|
||||||
|
if name == BG_NAMES.WSG then return "WSG" end
|
||||||
|
if name == BG_NAMES.AB then return "AB" end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function FormatNumber(n)
|
||||||
|
n = n or 0
|
||||||
|
if n >= 1000000 then
|
||||||
|
return string.format("%.1fm", n / 1000000)
|
||||||
|
elseif n >= 10000 then
|
||||||
|
return string.format("%.1fk", n / 1000)
|
||||||
|
end
|
||||||
|
return tostring(n)
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- BG / Arena detection
|
||||||
|
---------------------------------------------------------------
|
||||||
|
local function ClassifyBattlefield(i)
|
||||||
|
local status, mapName, instanceID, minLevel, maxLevel, teamSize, registered = GetBattlefieldStatus(i)
|
||||||
|
if status ~= "active" then return nil end
|
||||||
|
|
||||||
|
local bgKey = MapNameToKey(mapName)
|
||||||
|
if bgKey then return bgKey end
|
||||||
|
|
||||||
|
if teamSize and teamSize > 0 then
|
||||||
|
if registered == 1 or registered == true then
|
||||||
|
if teamSize == 2 then return "A2" end
|
||||||
|
if teamSize == 3 then return "A3" end
|
||||||
|
if teamSize == 5 then return "A5" end
|
||||||
|
else
|
||||||
|
return "SK"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if lastQueuedArena then return lastQueuedArena end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function DetectCurrentBG()
|
||||||
|
for i = 1, 3 do
|
||||||
|
local status = GetBattlefieldStatus(i)
|
||||||
|
if status == "active" then
|
||||||
|
local key = ClassifyBattlefield(i)
|
||||||
|
if key then return key, i end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function RecordEnd(key, index)
|
||||||
|
if not key or endReported[index] then return end
|
||||||
|
endReported[index] = true
|
||||||
|
|
||||||
|
local db = EnsureDB()
|
||||||
|
local s = db.stats[key]
|
||||||
|
if not s then return end
|
||||||
|
|
||||||
|
local playerWon = false
|
||||||
|
local winner = GetBattlefieldWinner()
|
||||||
|
if winner then
|
||||||
|
local myFaction = UnitFactionGroup("player")
|
||||||
|
local wonAsAlliance = (winner == 1 and myFaction == "Alliance")
|
||||||
|
local wonAsHorde = (winner == 0 and myFaction == "Horde")
|
||||||
|
playerWon = wonAsAlliance or wonAsHorde
|
||||||
|
if playerWon then
|
||||||
|
s.wins = s.wins + 1
|
||||||
|
s.streak = s.streak + 1
|
||||||
|
if s.streak > s.bestStreak then s.bestStreak = s.streak end
|
||||||
|
else
|
||||||
|
s.losses = s.losses + 1
|
||||||
|
s.streak = 0
|
||||||
|
end
|
||||||
|
local isBG = (key == "AV" or key == "WSG" or key == "AB")
|
||||||
|
if isBG then
|
||||||
|
s.marks = s.marks + (playerWon and MARKS_WIN or MARKS_LOSS)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
RequestBattlefieldScoreData()
|
||||||
|
local me = UnitName("player")
|
||||||
|
local rows = GetNumBattlefieldScores() or 0
|
||||||
|
for r = 1, rows do
|
||||||
|
local name, killingBlows, honorableKills, deaths, honorGained = GetBattlefieldScore(r)
|
||||||
|
if name == me then
|
||||||
|
local kb = killingBlows or 0
|
||||||
|
local hk = honorableKills or 0
|
||||||
|
local dth = deaths or 0
|
||||||
|
local hon = honorGained or 0
|
||||||
|
s.kills = s.kills + kb
|
||||||
|
s.hk = s.hk + hk
|
||||||
|
s.deaths = s.deaths + dth
|
||||||
|
s.honor = s.honor + hon
|
||||||
|
if kb > s.bestKB then s.bestKB = kb end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local marksMsg = ""
|
||||||
|
if key == "AV" or key == "WSG" or key == "AB" then
|
||||||
|
marksMsg = " +" .. (playerWon and MARKS_WIN or MARKS_LOSS) .. " marks"
|
||||||
|
end
|
||||||
|
Print(BG_NAMES[key] .. " recorded ("
|
||||||
|
.. (playerWon and "|cff66ff66win|r" or "|cffff6666loss|r")
|
||||||
|
.. marksMsg .. ").")
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Queue actions
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Auto-close the Blizzard PvP panels if they pop up as a side effect
|
||||||
|
-- of the arena / BG queueing calls.
|
||||||
|
local function HidePvPPanels()
|
||||||
|
if BattlefieldFrame and BattlefieldFrame:IsVisible() then HideUIPanel(BattlefieldFrame) end
|
||||||
|
if PVPBattlegroundFrame and PVPBattlegroundFrame:IsVisible() then HideUIPanel(PVPBattlegroundFrame) end
|
||||||
|
if PVPFrame and PVPFrame:IsVisible() then HideUIPanel(PVPFrame) end
|
||||||
|
if HonorFrame and HonorFrame:IsVisible() then HideUIPanel(HonorFrame) end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Suppress the PvP panel entirely while we are auto-queueing. Reference-counted
|
||||||
|
-- so nested queues (Queue All BGs) do not release too early.
|
||||||
|
local suppressPanels = 0
|
||||||
|
local suppressHooked = false
|
||||||
|
local origBattlefieldShow, origPVPBGShow
|
||||||
|
|
||||||
|
local function InstallPanelSuppressor()
|
||||||
|
if suppressHooked then return end
|
||||||
|
suppressHooked = true
|
||||||
|
if BattlefieldFrame then
|
||||||
|
origBattlefieldShow = BattlefieldFrame.Show
|
||||||
|
BattlefieldFrame.Show = function(self, ...)
|
||||||
|
if suppressPanels > 0 then return end
|
||||||
|
origBattlefieldShow(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if PVPBattlegroundFrame then
|
||||||
|
origPVPBGShow = PVPBattlegroundFrame.Show
|
||||||
|
PVPBattlegroundFrame.Show = function(self, ...)
|
||||||
|
if suppressPanels > 0 then return end
|
||||||
|
origPVPBGShow(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function BeginSuppress()
|
||||||
|
InstallPanelSuppressor()
|
||||||
|
suppressPanels = suppressPanels + 1
|
||||||
|
HidePvPPanels()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EndSuppress()
|
||||||
|
suppressPanels = suppressPanels - 1
|
||||||
|
if suppressPanels < 0 then suppressPanels = 0 end
|
||||||
|
HidePvPPanels()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Central pending-queue state. `pendingQueue` is a FIFO of items:
|
||||||
|
-- { kind = "bg"|"arena", key = <BG_KEY>, asGroup = 0/1 }
|
||||||
|
-- The finder frame processes them one at a time on BATTLEFIELDS_SHOW.
|
||||||
|
local pendingQueue = {}
|
||||||
|
local finderFrame
|
||||||
|
|
||||||
|
-- Kick the client into opening the finder for the requested queue type.
|
||||||
|
-- The BATTLEFIELDS_SHOW handler below immediately completes the queue and
|
||||||
|
-- hides the Blizzard/Blood Ring panel.
|
||||||
|
local function KickFinderFor(job)
|
||||||
|
if job.kind == "arena" then
|
||||||
|
if type(JoinArenaQueue) == "function" then
|
||||||
|
local id = ARENA_IDS[job.key]
|
||||||
|
if id == nil then id = 0 end
|
||||||
|
JoinArenaQueue(id)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if type(JoinBattlegroundQueue) == "function" then
|
||||||
|
JoinBattlegroundQueue(BG_NAMES[job.key])
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if type(JoinBattlegroundQueue) == "function" then
|
||||||
|
JoinBattlegroundQueue(BG_NAMES[job.key])
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetFinderFrame()
|
||||||
|
if finderFrame then return finderFrame end
|
||||||
|
finderFrame = CreateFrame("Frame")
|
||||||
|
finderFrame:SetScript("OnEvent", function()
|
||||||
|
if event ~= "BATTLEFIELDS_SHOW" then return end
|
||||||
|
|
||||||
|
local job = pendingQueue[1]
|
||||||
|
if not job then
|
||||||
|
HidePvPPanels()
|
||||||
|
EndSuppress()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
table.remove(pendingQueue, 1)
|
||||||
|
|
||||||
|
if SetSelectedBattlefield then SetSelectedBattlefield(0) end
|
||||||
|
|
||||||
|
if job.kind == "arena" then
|
||||||
|
local meta = ARENA_META[job.key] or ARENA_META.SK
|
||||||
|
lastQueuedArena = job.key
|
||||||
|
-- Prefer explicit arena team-size setters where available.
|
||||||
|
if type(SetArenaTeamSize) == "function" then SetArenaTeamSize(meta.size) end
|
||||||
|
if JoinBattlefield then
|
||||||
|
-- Turtle/Octo: JoinArenaQueue(id) opens Blood Ring, then
|
||||||
|
-- JoinBattlefield(0[, asGroup]) actually joins First Available.
|
||||||
|
if job.asGroup == 1 then JoinBattlefield(0, 1) else JoinBattlefield(0) end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if JoinBattlefield then
|
||||||
|
if job.asGroup == 1 then JoinBattlefield(0, 1) else JoinBattlefield(0) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
HidePvPPanels()
|
||||||
|
EndSuppress()
|
||||||
|
|
||||||
|
-- Chain: if more queued, kick the next one after a very short delay.
|
||||||
|
if pendingQueue[1] then
|
||||||
|
local nxt = pendingQueue[1]
|
||||||
|
BeginSuppress()
|
||||||
|
finderFrame:RegisterEvent("BATTLEFIELDS_SHOW")
|
||||||
|
if not KickFinderFor(nxt) then
|
||||||
|
table.remove(pendingQueue, 1)
|
||||||
|
finderFrame:UnregisterEvent("BATTLEFIELDS_SHOW")
|
||||||
|
EndSuppress()
|
||||||
|
end
|
||||||
|
else
|
||||||
|
finderFrame:UnregisterEvent("BATTLEFIELDS_SHOW")
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
return finderFrame
|
||||||
|
end
|
||||||
|
|
||||||
|
local function IsInGroup()
|
||||||
|
if RelationshipsPVPGroupCheck and RelationshipsPVPGroupCheck:GetChecked() then return 1 end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local function EnqueueAndKick(job)
|
||||||
|
local f = GetFinderFrame()
|
||||||
|
-- If another job is already in flight, just append; the handler will chain.
|
||||||
|
if pendingQueue[1] then
|
||||||
|
table.insert(pendingQueue, job)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
table.insert(pendingQueue, job)
|
||||||
|
BeginSuppress()
|
||||||
|
f:UnregisterAllEvents()
|
||||||
|
f:RegisterEvent("BATTLEFIELDS_SHOW")
|
||||||
|
if not KickFinderFor(job) then
|
||||||
|
pendingQueue = {}
|
||||||
|
f:UnregisterEvent("BATTLEFIELDS_SHOW")
|
||||||
|
EndSuppress()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_Queue(key)
|
||||||
|
if not BG_NAMES[key] then return end
|
||||||
|
local asGroup = IsInGroup()
|
||||||
|
|
||||||
|
if EnqueueAndKick({ kind = "bg", key = key, asGroup = asGroup }) then
|
||||||
|
Print("Queued: |cffffd200" .. BG_NAMES[key] .. "|r"
|
||||||
|
.. (asGroup == 1 and " |cff66ff66(group)|r" or ""))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Fallback: legacy vanilla flow (visit a Battlemaster first).
|
||||||
|
if not JoinBattlefield then
|
||||||
|
Print("|cffff4444Battleground Finder not available on this client.|r")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local idx
|
||||||
|
if key == "AV" then idx = 1
|
||||||
|
elseif key == "WSG" then idx = 2
|
||||||
|
elseif key == "AB" then idx = 3 end
|
||||||
|
JoinBattlefield(idx, asGroup)
|
||||||
|
Print("Requested queue: |cffffd200" .. BG_NAMES[key] .. "|r")
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Arena queue: fully automated, no manual panel confirmation
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Turtle/Octo Blood Ring panel: JoinArenaQueue(id) opens a custom
|
||||||
|
-- frame (typically BloodRingFrame). It does NOT fire BATTLEFIELDS_SHOW
|
||||||
|
-- and JoinBattlefield does not apply, so we simulate a click on the
|
||||||
|
-- panel's own Join button.
|
||||||
|
|
||||||
|
-- Text labels the Blood Ring / arena finder Join button may carry.
|
||||||
|
local ARENA_JOIN_TEXTS = {
|
||||||
|
["join battle"] = 1, ["join queue"] = 1, ["join"] = 1,
|
||||||
|
["enter queue"] = 1, ["enter battle"] = 1, ["queue"] = 1,
|
||||||
|
["enter"] = 1, ["join arena"] = 1, ["queue up"] = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
local function _btnText(btn)
|
||||||
|
if not btn then return nil end
|
||||||
|
if btn.GetText then
|
||||||
|
local t = btn:GetText()
|
||||||
|
if t and t ~= "" then return t end
|
||||||
|
end
|
||||||
|
local name = btn.GetName and btn:GetName()
|
||||||
|
if name then
|
||||||
|
local fs = getglobal(name.."Text")
|
||||||
|
if fs and fs.GetText then return fs:GetText() end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _looksLikeJoin(btn)
|
||||||
|
if not btn or type(btn.GetObjectType) ~= "function" then return false end
|
||||||
|
if btn:GetObjectType() ~= "Button" then return false end
|
||||||
|
if btn.IsVisible and not btn:IsVisible() then return false end
|
||||||
|
if btn.IsEnabled and btn:IsEnabled() == 0 then return false end
|
||||||
|
local t = _btnText(btn)
|
||||||
|
if not t then return false end
|
||||||
|
return ARENA_JOIN_TEXTS[string.lower(t)] == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Locate the Blood Ring frame by likely names or a visible frame carrying
|
||||||
|
-- a Join-style child button.
|
||||||
|
local function FindArenaFinderFrame()
|
||||||
|
local names = {
|
||||||
|
"BloodRingFrame", "BloodringFrame", "BloodRingArenaFrame",
|
||||||
|
"ArenaFinderFrame", "ArenaQueueFrame", "SkirmishFrame",
|
||||||
|
"CustomArenaFrame", "PVPArenaFrame",
|
||||||
|
}
|
||||||
|
for i = 1, table.getn(names) do
|
||||||
|
local f = getglobal(names[i])
|
||||||
|
if f and f.IsVisible and f:IsVisible() then return f end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function FindJoinButtonIn(frame)
|
||||||
|
if not frame then return nil end
|
||||||
|
-- Try predictable child names first.
|
||||||
|
local name = frame.GetName and frame:GetName()
|
||||||
|
if name then
|
||||||
|
local suffixes = {
|
||||||
|
"JoinButton", "JoinBattleButton", "QueueButton", "EnterButton",
|
||||||
|
"Button1", "OKButton", "AcceptButton",
|
||||||
|
}
|
||||||
|
for i = 1, table.getn(suffixes) do
|
||||||
|
local b = getglobal(name .. suffixes[i])
|
||||||
|
if _looksLikeJoin(b) then return b end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Walk direct children.
|
||||||
|
if frame.GetChildren then
|
||||||
|
local kids = { frame:GetChildren() }
|
||||||
|
for i = 1, table.getn(kids) do
|
||||||
|
if _looksLikeJoin(kids[i]) then return kids[i] end
|
||||||
|
end
|
||||||
|
-- One level deeper.
|
||||||
|
for i = 1, table.getn(kids) do
|
||||||
|
local k = kids[i]
|
||||||
|
if k and k.GetChildren then
|
||||||
|
local gkids = { k:GetChildren() }
|
||||||
|
for j = 1, table.getn(gkids) do
|
||||||
|
if _looksLikeJoin(gkids[j]) then return gkids[j] end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Global sweep as a last resort: scan all frames for a visible Join-style
|
||||||
|
-- button attached to a visible top-level frame.
|
||||||
|
local function GlobalFindArenaJoinButton()
|
||||||
|
local f = EnumerateFrames()
|
||||||
|
while f do
|
||||||
|
if f.IsVisible and f:IsVisible() and f.GetChildren then
|
||||||
|
local kids = { f:GetChildren() }
|
||||||
|
for i = 1, table.getn(kids) do
|
||||||
|
if _looksLikeJoin(kids[i]) then return kids[i] end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
f = EnumerateFrames(f)
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local arenaPoll
|
||||||
|
local arenaPollElapsed = 0
|
||||||
|
local arenaPollDeadline = 0
|
||||||
|
|
||||||
|
local function StopArenaPoll()
|
||||||
|
if arenaPoll then arenaPoll:Hide() end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function StartArenaPoll()
|
||||||
|
if not arenaPoll then
|
||||||
|
arenaPoll = CreateFrame("Frame")
|
||||||
|
arenaPoll:Hide()
|
||||||
|
arenaPoll:SetScript("OnUpdate", function()
|
||||||
|
arenaPollElapsed = arenaPollElapsed + arg1
|
||||||
|
if arenaPollElapsed < 0.05 then return end
|
||||||
|
arenaPollElapsed = 0
|
||||||
|
|
||||||
|
local frame = FindArenaFinderFrame()
|
||||||
|
local btn = FindJoinButtonIn(frame)
|
||||||
|
if not btn then btn = GlobalFindArenaJoinButton() end
|
||||||
|
if btn then
|
||||||
|
-- Click the button as if the user pressed it.
|
||||||
|
if btn.Click then btn:Click() end
|
||||||
|
if frame and frame.Hide then frame:Hide() end
|
||||||
|
HidePvPPanels()
|
||||||
|
StopArenaPoll()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if GetTime() > arenaPollDeadline then
|
||||||
|
-- Give up quietly; leave the panel open so the user can click.
|
||||||
|
StopArenaPoll()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
arenaPollElapsed = 0
|
||||||
|
arenaPollDeadline = GetTime() + 3.0
|
||||||
|
arenaPoll:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_QueueArena(key)
|
||||||
|
local meta = ARENA_META[key]
|
||||||
|
if not meta then return end
|
||||||
|
local asGroup = IsInGroup()
|
||||||
|
lastQueuedArena = key
|
||||||
|
|
||||||
|
-- 1) Direct TBC-style API — no panel involved.
|
||||||
|
if type(JoinArena) == "function" then
|
||||||
|
if type(SetArenaTeamSize) == "function" then SetArenaTeamSize(meta.size) end
|
||||||
|
JoinArena(meta.size, meta.rated, asGroup)
|
||||||
|
Print("Queued arena: |cffffd200" .. BG_NAMES[key] .. "|r"
|
||||||
|
.. (asGroup == 1 and " |cff66ff66(group)|r" or ""))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 2) Turtle/Octo custom entry point. JoinArenaQueue(id) opens the
|
||||||
|
-- Blood Ring finder; we then click its Join button ourselves.
|
||||||
|
if type(JoinArenaQueue) == "function" then
|
||||||
|
local id = ARENA_IDS[key]; if id == nil then id = 0 end
|
||||||
|
if type(SetArenaTeamSize) == "function" then SetArenaTeamSize(meta.size) end
|
||||||
|
JoinArenaQueue(id)
|
||||||
|
StartArenaPoll()
|
||||||
|
Print("Queued arena: |cffffd200" .. BG_NAMES[key] .. "|r"
|
||||||
|
.. (asGroup == 1 and " |cff66ff66(group)|r" or ""))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
Print("|cffff4444Arena API not available on this client. Visit an Arena Battlemaster.|r")
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Queue for all standard battlegrounds (no arenas, no rated)
|
||||||
|
---------------------------------------------------------------
|
||||||
|
function RelationshipsPVP_QueueAllBGs()
|
||||||
|
local asGroup = IsInGroup()
|
||||||
|
local kicked = 0
|
||||||
|
for i = 1, table.getn(BG_KEYS) do
|
||||||
|
local key = BG_KEYS[i]
|
||||||
|
if EnqueueAndKick({ kind = "bg", key = key, asGroup = asGroup }) then
|
||||||
|
kicked = kicked + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if kicked > 0 then
|
||||||
|
Print("Queueing all standard battlegrounds ("
|
||||||
|
.. kicked .. "): |cffffd200AV, WSG, AB|r"
|
||||||
|
.. (asGroup == 1 and " |cff66ff66(group)|r" or ""))
|
||||||
|
else
|
||||||
|
Print("|cffff4444Battleground Finder not available on this client.|r")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_LeaveAll()
|
||||||
|
local left = 0
|
||||||
|
for i = 1, 3 do
|
||||||
|
local status = GetBattlefieldStatus(i)
|
||||||
|
if status == "queued" or status == "confirm" then
|
||||||
|
AcceptBattlefieldPort(i, 0)
|
||||||
|
left = left + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if left > 0 then
|
||||||
|
Print("Left " .. left .. " pending queue(s).")
|
||||||
|
else
|
||||||
|
Print("No active queues.")
|
||||||
|
end
|
||||||
|
pendingQueue = {}
|
||||||
|
lastQueuedArena = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Minimap icon toggle
|
||||||
|
---------------------------------------------------------------
|
||||||
|
function RelationshipsPVP_ToggleMinimapIcon()
|
||||||
|
local db = EnsureDB()
|
||||||
|
db.showIcon = not db.showIcon
|
||||||
|
ApplyIconVisibility()
|
||||||
|
Print(db.showIcon and "Minimap icon |cff66ff66shown|r." or "Minimap icon |cffff6666hidden|r. Use /rpvp to open.")
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- UI: build row FontStrings inside the stats panel
|
||||||
|
---------------------------------------------------------------
|
||||||
|
local COL_X = { 14, 158, 208, 258, 308, 354, 400, 446, 496, 550, 614 }
|
||||||
|
local COL_W = { 140, 46, 46, 46, 46, 46, 46, 46, 50, 60, 58 }
|
||||||
|
local COL_J = { "LEFT", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER", "CENTER" }
|
||||||
|
local COL_NAMES = { "bg", "games", "win", "loss", "ratio", "kb", "hk", "dth", "kd", "honor", "mk" }
|
||||||
|
|
||||||
|
local ROW_HEIGHT = 22
|
||||||
|
local ROW_TOP = -34
|
||||||
|
|
||||||
|
local function MakeRow(panel, tag, yOff, striped)
|
||||||
|
local row = {}
|
||||||
|
if striped then
|
||||||
|
local bg = panel:CreateTexture("RPVPRowBG"..tag, "BACKGROUND")
|
||||||
|
bg:SetTexture(1, 1, 1, 0.04)
|
||||||
|
bg:SetWidth(660); bg:SetHeight(ROW_HEIGHT - 2)
|
||||||
|
bg:SetPoint("TOPLEFT", panel, "TOPLEFT", 14, yOff + 2)
|
||||||
|
end
|
||||||
|
for c = 1, table.getn(COL_NAMES) do
|
||||||
|
local fs = panel:CreateFontString(
|
||||||
|
"RPVPRow"..tag.."_"..COL_NAMES[c],
|
||||||
|
"ARTWORK",
|
||||||
|
(c == 1) and "GameFontNormal" or "GameFontHighlight"
|
||||||
|
)
|
||||||
|
fs:SetWidth(COL_W[c]); fs:SetHeight(18)
|
||||||
|
fs:SetJustifyH(COL_J[c])
|
||||||
|
fs:SetPoint("TOPLEFT", panel, "TOPLEFT", COL_X[c], yOff)
|
||||||
|
row[COL_NAMES[c]] = fs
|
||||||
|
end
|
||||||
|
return row
|
||||||
|
end
|
||||||
|
|
||||||
|
local function BuildStatsRows()
|
||||||
|
if rowStrings["_built"] then return end
|
||||||
|
local panel = RelationshipsPVPStatsPanel
|
||||||
|
if not panel then return end
|
||||||
|
|
||||||
|
for i = 1, table.getn(ALL_KEYS) do
|
||||||
|
local key = ALL_KEYS[i]
|
||||||
|
local yOff = ROW_TOP - (i - 1) * ROW_HEIGHT
|
||||||
|
local row = MakeRow(panel, key, yOff, (math.mod(i, 2) == 0))
|
||||||
|
local col = BG_COLORS[key]
|
||||||
|
row.bg:SetText(BG_NAMES[key])
|
||||||
|
row.bg:SetTextColor(col.r, col.g, col.b)
|
||||||
|
rowStrings[key] = row
|
||||||
|
end
|
||||||
|
|
||||||
|
local n = table.getn(ALL_KEYS)
|
||||||
|
local totalY = ROW_TOP - n * ROW_HEIGHT - 4
|
||||||
|
local div = panel:CreateTexture("RPVPTotalDivider", "ARTWORK")
|
||||||
|
div:SetTexture(1, 1, 1, 0.25)
|
||||||
|
div:SetWidth(660); div:SetHeight(1)
|
||||||
|
div:SetPoint("TOPLEFT", panel, "TOPLEFT", 14, totalY + 2)
|
||||||
|
|
||||||
|
totalRow = MakeRow(panel, "TOTAL", totalY - 6, false)
|
||||||
|
totalRow.bg:SetText("Total")
|
||||||
|
totalRow.bg:SetTextColor(1.0, 0.95, 0.7)
|
||||||
|
|
||||||
|
rowStrings["_built"] = true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function FormatQueueLine()
|
||||||
|
local lines = ""
|
||||||
|
local any = false
|
||||||
|
for i = 1, 3 do
|
||||||
|
local status, mapName, _, _, _, teamSize, registered = GetBattlefieldStatus(i)
|
||||||
|
if status and status ~= "none" then
|
||||||
|
any = true
|
||||||
|
local color = "|cffffffff"
|
||||||
|
if status == "queued" then color = "|cffffff66" end
|
||||||
|
if status == "confirm" then color = "|cff66ff66" end
|
||||||
|
if status == "active" then color = "|cff66ccff" end
|
||||||
|
local label = mapName or "?"
|
||||||
|
if teamSize and teamSize > 0 then
|
||||||
|
label = label .. " (" .. teamSize .. "v" .. teamSize
|
||||||
|
.. ((registered == 1 or registered == true) and " rated" or " skirmish") .. ")"
|
||||||
|
end
|
||||||
|
lines = lines .. " [" .. i .. "] " .. label
|
||||||
|
.. " - " .. color .. status .. "|r\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not any then return " |cff888888(no active queues)|r\n" end
|
||||||
|
return lines
|
||||||
|
end
|
||||||
|
|
||||||
|
local function FillRow(r, s)
|
||||||
|
local games = s.wins + s.losses
|
||||||
|
local pct = 0
|
||||||
|
if games > 0 then pct = math.floor((s.wins / games) * 100 + 0.5) end
|
||||||
|
local kd = "-"
|
||||||
|
if s.deaths > 0 then
|
||||||
|
kd = string.format("%.2f", (s.kills + s.hk) / s.deaths)
|
||||||
|
elseif (s.kills + s.hk) > 0 then
|
||||||
|
kd = "\226\136\158"
|
||||||
|
end
|
||||||
|
|
||||||
|
r.games:SetText(games)
|
||||||
|
r.win:SetText(s.wins)
|
||||||
|
r.loss:SetText(s.losses)
|
||||||
|
r.ratio:SetText(pct .. "%")
|
||||||
|
r.kb:SetText(s.kills)
|
||||||
|
r.hk:SetText(s.hk)
|
||||||
|
r.dth:SetText(s.deaths)
|
||||||
|
r.kd:SetText(kd)
|
||||||
|
r.honor:SetText(FormatNumber(s.honor))
|
||||||
|
r.mk:SetText(s.marks)
|
||||||
|
|
||||||
|
if games == 0 then
|
||||||
|
r.ratio:SetTextColor(0.7, 0.7, 0.7)
|
||||||
|
elseif pct >= 60 then
|
||||||
|
r.ratio:SetTextColor(0.4, 1.0, 0.4)
|
||||||
|
elseif pct >= 40 then
|
||||||
|
r.ratio:SetTextColor(1.0, 0.9, 0.4)
|
||||||
|
else
|
||||||
|
r.ratio:SetTextColor(1.0, 0.5, 0.5)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_Refresh()
|
||||||
|
if not RelationshipsPVPFrame or not RelationshipsPVPFrame:IsVisible() then return end
|
||||||
|
local db = EnsureDB()
|
||||||
|
BuildStatsRows()
|
||||||
|
|
||||||
|
local totals = NewStatBlock()
|
||||||
|
for i = 1, table.getn(ALL_KEYS) do
|
||||||
|
local k = ALL_KEYS[i]
|
||||||
|
local s = db.stats[k]
|
||||||
|
local r = rowStrings[k]
|
||||||
|
if r then FillRow(r, s) end
|
||||||
|
|
||||||
|
totals.wins = totals.wins + s.wins
|
||||||
|
totals.losses = totals.losses + s.losses
|
||||||
|
totals.kills = totals.kills + s.kills
|
||||||
|
totals.hk = totals.hk + s.hk
|
||||||
|
totals.deaths = totals.deaths + s.deaths
|
||||||
|
totals.honor = totals.honor + s.honor
|
||||||
|
totals.marks = totals.marks + s.marks
|
||||||
|
if s.bestStreak > totals.bestStreak then totals.bestStreak = s.bestStreak end
|
||||||
|
if s.bestKB > totals.bestKB then totals.bestKB = s.bestKB end
|
||||||
|
end
|
||||||
|
|
||||||
|
if totalRow then FillRow(totalRow, totals) end
|
||||||
|
|
||||||
|
if RelationshipsPVPExtrasText then
|
||||||
|
RelationshipsPVPExtrasText:SetText(
|
||||||
|
"|cffffd200Best win streak:|r " .. totals.bestStreak
|
||||||
|
.. " |cffffd200Best KBs (single match):|r " .. totals.bestKB
|
||||||
|
.. " |cffffd200Total honor:|r " .. FormatNumber(totals.honor)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
local qtext = FormatQueueLine()
|
||||||
|
if currentBG then
|
||||||
|
qtext = qtext .. "\n |cff66ff66Currently inside: " .. BG_NAMES[currentBG] .. "|r"
|
||||||
|
end
|
||||||
|
if RelationshipsPVPQueueText then
|
||||||
|
RelationshipsPVPQueueText:SetText(qtext)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Reset panel + minimap button to the centre of the screen
|
||||||
|
---------------------------------------------------------------
|
||||||
|
function RelationshipsPVP_ResetPositions()
|
||||||
|
local db = EnsureDB()
|
||||||
|
|
||||||
|
if RelationshipsPVPFrame then
|
||||||
|
RelationshipsPVPFrame:ClearAllPoints()
|
||||||
|
RelationshipsPVPFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||||
|
RelationshipsPVPFrame:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
if RelationshipsPVPMinimapButton then
|
||||||
|
RelationshipsPVPMinimapButton:ClearAllPoints()
|
||||||
|
RelationshipsPVPMinimapButton:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||||
|
db.icon.point = "CENTER"
|
||||||
|
db.icon.x = 0
|
||||||
|
db.icon.y = 0
|
||||||
|
db.icon.parent = "UIParent"
|
||||||
|
end
|
||||||
|
|
||||||
|
db.panel = { point = "CENTER", x = 0, y = 0 }
|
||||||
|
Print("Panel and minimap button reset to screen centre.")
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_ResetStats()
|
||||||
|
local db = EnsureDB()
|
||||||
|
for i = 1, table.getn(ALL_KEYS) do
|
||||||
|
db.stats[ALL_KEYS[i]] = NewStatBlock()
|
||||||
|
end
|
||||||
|
Print("PvP statistics cleared.")
|
||||||
|
RelationshipsPVP_Refresh()
|
||||||
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------------------
|
||||||
|
-- Events
|
||||||
|
---------------------------------------------------------------
|
||||||
|
function RelationshipsPVP_OnLoad()
|
||||||
|
this:RegisterEvent("PLAYER_LOGIN")
|
||||||
|
this:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||||
|
this:RegisterEvent("UPDATE_BATTLEFIELD_STATUS")
|
||||||
|
this:RegisterEvent("UPDATE_BATTLEFIELD_SCORE")
|
||||||
|
this:RegisterEvent("PLAYER_DEAD")
|
||||||
|
this:RegisterEvent("PLAYER_REGEN_ENABLED")
|
||||||
|
this:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
|
||||||
|
this:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE")
|
||||||
|
this:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE")
|
||||||
|
|
||||||
|
SLASH_RELATIONSHIPSPVP1 = "/rpvp"
|
||||||
|
SLASH_RELATIONSHIPSPVP2 = "/relpvp"
|
||||||
|
SLASH_RELATIONSHIPSPVP3 = "/relationshipspvp"
|
||||||
|
SlashCmdList["RELATIONSHIPSPVP"] = function(msg)
|
||||||
|
msg = string.lower(msg or "")
|
||||||
|
if msg == "leave" then
|
||||||
|
RelationshipsPVP_LeaveAll()
|
||||||
|
elseif msg == "av" then
|
||||||
|
RelationshipsPVP_Queue("AV")
|
||||||
|
elseif msg == "wsg" then
|
||||||
|
RelationshipsPVP_Queue("WSG")
|
||||||
|
elseif msg == "ab" then
|
||||||
|
RelationshipsPVP_Queue("AB")
|
||||||
|
elseif msg == "all" then
|
||||||
|
RelationshipsPVP_QueueAllBGs()
|
||||||
|
elseif msg == "2v2" then
|
||||||
|
RelationshipsPVP_QueueArena("A2")
|
||||||
|
elseif msg == "3v3" then
|
||||||
|
RelationshipsPVP_QueueArena("A3")
|
||||||
|
elseif msg == "5v5" then
|
||||||
|
RelationshipsPVP_QueueArena("A5")
|
||||||
|
elseif msg == "skirmish" or msg == "sk" then
|
||||||
|
RelationshipsPVP_QueueArena("SK")
|
||||||
|
elseif msg == "icon" or msg == "minimap" then
|
||||||
|
RelationshipsPVP_ToggleMinimapIcon()
|
||||||
|
elseif msg == "reset" then
|
||||||
|
RelationshipsPVP_ResetPositions()
|
||||||
|
elseif msg == "clear" or msg == "wipe" then
|
||||||
|
RelationshipsPVP_ResetStats()
|
||||||
|
else
|
||||||
|
if RelationshipsPVPFrame:IsVisible() then
|
||||||
|
RelationshipsPVPFrame:Hide()
|
||||||
|
else
|
||||||
|
RelationshipsPVPFrame:Show()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Print("Loaded v1.8. Type /rpvp to open, /rpvp all to queue all BGs, /rpvp icon to toggle minimap icon.")
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_SavePanelPos()
|
||||||
|
SavePanelPos()
|
||||||
|
end
|
||||||
|
|
||||||
|
function RelationshipsPVP_OnEvent(event)
|
||||||
|
if event == "PLAYER_LOGIN" or event == "PLAYER_ENTERING_WORLD" then
|
||||||
|
EnsureDB()
|
||||||
|
RestoreIconPos()
|
||||||
|
RestorePanelPos()
|
||||||
|
local key = DetectCurrentBG()
|
||||||
|
currentBG = key
|
||||||
|
if not key then endReported = {} end
|
||||||
|
RelationshipsPVP_Refresh()
|
||||||
|
|
||||||
|
elseif event == "UPDATE_BATTLEFIELD_STATUS" then
|
||||||
|
local key = DetectCurrentBG()
|
||||||
|
currentBG = key
|
||||||
|
RelationshipsPVP_Refresh()
|
||||||
|
|
||||||
|
elseif event == "UPDATE_BATTLEFIELD_SCORE" then
|
||||||
|
local key, idx = DetectCurrentBG()
|
||||||
|
if key and idx and GetBattlefieldWinner() then
|
||||||
|
RecordEnd(key, idx)
|
||||||
|
end
|
||||||
|
RelationshipsPVP_Refresh()
|
||||||
|
|
||||||
|
elseif event == "PLAYER_REGEN_ENABLED" then
|
||||||
|
RelationshipsPVP_Refresh()
|
||||||
|
|
||||||
|
elseif event == "CHAT_MSG_BG_SYSTEM_NEUTRAL"
|
||||||
|
or event == "CHAT_MSG_BG_SYSTEM_ALLIANCE"
|
||||||
|
or event == "CHAT_MSG_BG_SYSTEM_HORDE" then
|
||||||
|
RequestBattlefieldScoreData()
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
## Interface: 11200
|
||||||
|
## Title: Relationships PVP
|
||||||
|
## Notes: PvP panel with per-battleground and per-arena stats, marks, kills/deaths, honor, K/D, and queue controls. Supports the Battleground Finder and Arena on OctoWoW.
|
||||||
|
## Author: Relationship
|
||||||
|
## Version: 1.0
|
||||||
|
## SavedVariablesPerCharacter: RelationshipsPVPCharDB
|
||||||
|
|
||||||
|
RelationshipsPVP.xml
|
||||||
|
RelationshipsPVP.lua
|
||||||
@@ -0,0 +1,411 @@
|
|||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<Script file="RelationshipsPVP.lua"/>
|
||||||
|
|
||||||
|
<!-- ============================================================
|
||||||
|
Main Panel
|
||||||
|
============================================================ -->
|
||||||
|
<Frame name="RelationshipsPVPFrame" parent="UIParent" toplevel="true" movable="true" enableMouse="true" hidden="true" frameStrata="HIGH">
|
||||||
|
<Size>
|
||||||
|
<AbsDimension x="740" y="740"/>
|
||||||
|
</Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="CENTER"/>
|
||||||
|
</Anchors>
|
||||||
|
<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\DialogFrame\UI-DialogBox-Border" tile="true">
|
||||||
|
<BackgroundInsets>
|
||||||
|
<AbsInset left="11" right="12" top="12" bottom="11"/>
|
||||||
|
</BackgroundInsets>
|
||||||
|
<TileSize><AbsValue val="32"/></TileSize>
|
||||||
|
<EdgeSize><AbsValue val="32"/></EdgeSize>
|
||||||
|
</Backdrop>
|
||||||
|
|
||||||
|
<Layers>
|
||||||
|
<Layer level="ARTWORK">
|
||||||
|
<Texture name="RelationshipsPVPHeader" file="Interface\DialogFrame\UI-DialogBox-Header">
|
||||||
|
<Size><AbsDimension x="320" y="64"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOP">
|
||||||
|
<Offset><AbsDimension x="0" y="12"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</Texture>
|
||||||
|
<FontString name="RelationshipsPVPTitle" inherits="GameFontNormal" text="Relationships PVP">
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOP" relativeTo="RelationshipsPVPHeader">
|
||||||
|
<Offset><AbsDimension x="0" y="-14"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
|
||||||
|
<FontString name="RelationshipsPVPStatsLabel" inherits="GameFontNormal" text="Battleground & Arena Statistics" justifyH="LEFT">
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-50"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
|
||||||
|
<FontString name="RelationshipsPVPQueueLabel" inherits="GameFontNormal" text="Queue Status" justifyH="LEFT">
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-350"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
|
||||||
|
<FontString name="RelationshipsPVPActionLabel" inherits="GameFontNormal" text="Queue Battleground / Arena" justifyH="LEFT">
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-454"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
</Layer>
|
||||||
|
</Layers>
|
||||||
|
|
||||||
|
<Frames>
|
||||||
|
<Button name="RelationshipsPVPClose" inherits="UIPanelCloseButton">
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPRIGHT">
|
||||||
|
<Offset><AbsDimension x="-4" y="-4"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<!-- ================= Stats Panel ================= -->
|
||||||
|
<Frame name="RelationshipsPVPStatsPanel">
|
||||||
|
<Size><AbsDimension x="692" y="266"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-72"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
|
||||||
|
<BackgroundInsets><AbsInset left="4" right="4" top="4" bottom="4"/></BackgroundInsets>
|
||||||
|
<TileSize><AbsValue val="16"/></TileSize>
|
||||||
|
<EdgeSize><AbsValue val="16"/></EdgeSize>
|
||||||
|
</Backdrop>
|
||||||
|
<Layers>
|
||||||
|
<Layer level="ARTWORK">
|
||||||
|
<FontString name="RPVPHdrBG" inherits="GameFontNormalSmall" text="Bracket" justifyH="LEFT">
|
||||||
|
<Size><AbsDimension x="140" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="14" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrGames" inherits="GameFontNormalSmall" text="Games" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="158" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrWin" inherits="GameFontNormalSmall" text="Win" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="208" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrLoss" inherits="GameFontNormalSmall" text="Loss" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="258" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrRatio" inherits="GameFontNormalSmall" text="Win%" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="308" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrKB" inherits="GameFontNormalSmall" text="KB" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="354" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrHK" inherits="GameFontNormalSmall" text="HK" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="400" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrDth" inherits="GameFontNormalSmall" text="Deaths" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="46" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="446" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrKD" inherits="GameFontNormalSmall" text="K/D" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="50" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="496" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrHonor" inherits="GameFontNormalSmall" text="Honor" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="60" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="550" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
<FontString name="RPVPHdrMk" inherits="GameFontNormalSmall" text="Marks" justifyH="CENTER">
|
||||||
|
<Size><AbsDimension x="58" y="14"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="614" y="-10"/></Offset></Anchor></Anchors>
|
||||||
|
</FontString>
|
||||||
|
|
||||||
|
<Texture name="RPVPHdrDivider" file="Interface\Tooltips\UI-Tooltip-Background">
|
||||||
|
<Size><AbsDimension x="664" y="1"/></Size>
|
||||||
|
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="14" y="-28"/></Offset></Anchor></Anchors>
|
||||||
|
<Color r="0.6" g="0.6" b="0.6" a="0.6"/>
|
||||||
|
</Texture>
|
||||||
|
|
||||||
|
<FontString name="RelationshipsPVPExtrasText" inherits="GameFontHighlightSmall" justifyH="LEFT">
|
||||||
|
<Size><AbsDimension x="664" y="16"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="BOTTOMLEFT"><Offset><AbsDimension x="14" y="10"/></Offset></Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
</Layer>
|
||||||
|
</Layers>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- ================= Queue Status Panel ================= -->
|
||||||
|
<Frame name="RelationshipsPVPQueuePanel">
|
||||||
|
<Size><AbsDimension x="692" y="84"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-368"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
|
||||||
|
<BackgroundInsets><AbsInset left="4" right="4" top="4" bottom="4"/></BackgroundInsets>
|
||||||
|
<TileSize><AbsValue val="16"/></TileSize>
|
||||||
|
<EdgeSize><AbsValue val="16"/></EdgeSize>
|
||||||
|
</Backdrop>
|
||||||
|
<Layers>
|
||||||
|
<Layer level="ARTWORK">
|
||||||
|
<FontString name="RelationshipsPVPQueueText" inherits="GameFontHighlightSmall" justifyH="LEFT" justifyV="TOP">
|
||||||
|
<Size><AbsDimension x="664" y="70"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT"><Offset><AbsDimension x="14" y="-10"/></Offset></Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
</Layer>
|
||||||
|
</Layers>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- ================= Action Panel =================
|
||||||
|
Layout math (panel width 692, side padding 24 → usable 644):
|
||||||
|
Row 1 (3 BGs) : 3 × 200w + 2 × 22gap = 644
|
||||||
|
Row 2 (4 arena) : 4 × 149w + 3 × 16gap = 596 + 48 = 644
|
||||||
|
Row 4 (4 utility) : 4 × 149w + 3 × 16gap = 644
|
||||||
|
All rows share x=24 left edge and end at x=668 right edge.
|
||||||
|
-->
|
||||||
|
<Frame name="RelationshipsPVPActionPanel">
|
||||||
|
<Size><AbsDimension x="692" y="230"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-472"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
|
||||||
|
<BackgroundInsets><AbsInset left="4" right="4" top="4" bottom="4"/></BackgroundInsets>
|
||||||
|
<TileSize><AbsValue val="16"/></TileSize>
|
||||||
|
<EdgeSize><AbsValue val="16"/></EdgeSize>
|
||||||
|
</Backdrop>
|
||||||
|
|
||||||
|
<Frames>
|
||||||
|
<!-- Row 1: BG queue buttons -->
|
||||||
|
<Button name="RelationshipsPVPQueueAV" inherits="UIPanelButtonTemplate" text="Alterac Valley">
|
||||||
|
<Size><AbsDimension x="200" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="-18"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_Queue("AV")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPQueueWSG" inherits="UIPanelButtonTemplate" text="Warsong Gulch">
|
||||||
|
<Size><AbsDimension x="200" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPQueueAV" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="22" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_Queue("WSG")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPQueueAB" inherits="UIPanelButtonTemplate" text="Arathi Basin">
|
||||||
|
<Size><AbsDimension x="200" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPQueueWSG" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="22" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_Queue("AB")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<!-- Row 2: Arena queue buttons -->
|
||||||
|
<Button name="RelationshipsPVPQueueA2" inherits="UIPanelButtonTemplate" text="2v2 Rated">
|
||||||
|
<Size><AbsDimension x="149" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT" relativeTo="RelationshipsPVPQueueAV" relativePoint="BOTTOMLEFT">
|
||||||
|
<Offset><AbsDimension x="0" y="-14"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_QueueArena("A2")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPQueueA3" inherits="UIPanelButtonTemplate" text="3v3 Rated">
|
||||||
|
<Size><AbsDimension x="149" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPQueueA2" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="16" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_QueueArena("A3")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPQueueA5" inherits="UIPanelButtonTemplate" text="5v5 Rated">
|
||||||
|
<Size><AbsDimension x="149" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPQueueA3" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="16" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_QueueArena("A5")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPQueueSK" inherits="UIPanelButtonTemplate" text="Skirmish">
|
||||||
|
<Size><AbsDimension x="149" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPQueueA5" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="16" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_QueueArena("SK")</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<!-- Row 3: Group checkbox -->
|
||||||
|
<CheckButton name="RelationshipsPVPGroupCheck" inherits="UICheckButtonTemplate">
|
||||||
|
<Size><AbsDimension x="32" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT" relativeTo="RelationshipsPVPQueueA2" relativePoint="BOTTOMLEFT">
|
||||||
|
<Offset><AbsDimension x="-1" y="-28"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts>
|
||||||
|
<OnShow>
|
||||||
|
local t = getglobal(this:GetName().."Text")
|
||||||
|
t:SetText("Queue As A Group")
|
||||||
|
t:SetFontObject("GameFontNormalLarge")
|
||||||
|
t:ClearAllPoints()
|
||||||
|
t:SetPoint("LEFT", this, "RIGHT", 2, 0)
|
||||||
|
</OnShow>
|
||||||
|
</Scripts>
|
||||||
|
</CheckButton>
|
||||||
|
|
||||||
|
<!-- Row 4: Utility buttons (4 equal-width columns matching arena row) -->
|
||||||
|
<Button name="RelationshipsPVPLeave" inherits="UIPanelButtonTemplate" text="Leave / Cancel Queue">
|
||||||
|
<Size><AbsDimension x="149" y="30"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="BOTTOMLEFT">
|
||||||
|
<Offset><AbsDimension x="24" y="20"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_LeaveAll()</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPRefreshBtn" inherits="UIPanelButtonTemplate" text="Refresh">
|
||||||
|
<Size><AbsDimension x="149" y="30"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPLeave" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="16" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_Refresh()</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPQueueAllBtn" inherits="UIPanelButtonTemplate" text="Queue All BGs">
|
||||||
|
<Size><AbsDimension x="149" y="30"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPRefreshBtn" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="16" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_QueueAllBGs()</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
<Button name="RelationshipsPVPToggleIconBtn" inherits="UIPanelButtonTemplate" text="Toggle Minimap Icon">
|
||||||
|
<Size><AbsDimension x="149" y="30"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativeTo="RelationshipsPVPQueueAllBtn" relativePoint="RIGHT">
|
||||||
|
<Offset><AbsDimension x="16" y="0"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts><OnClick>RelationshipsPVP_ToggleMinimapIcon()</OnClick></Scripts>
|
||||||
|
</Button>
|
||||||
|
</Frames>
|
||||||
|
</Frame>
|
||||||
|
</Frames>
|
||||||
|
|
||||||
|
<Scripts>
|
||||||
|
<OnLoad>
|
||||||
|
this:RegisterForDrag("LeftButton")
|
||||||
|
this:SetScript("OnDragStart", function() this:StartMoving() end)
|
||||||
|
this:SetScript("OnDragStop", function() this:StopMovingOrSizing(); RelationshipsPVP_SavePanelPos() end)
|
||||||
|
this:SetBackdropColor(0.04, 0.04, 0.06, 0.96)
|
||||||
|
this:SetBackdropBorderColor(0.7, 0.7, 0.75, 1)
|
||||||
|
RelationshipsPVPStatsPanel:SetBackdropColor(0.08, 0.08, 0.10, 0.95)
|
||||||
|
RelationshipsPVPStatsPanel:SetBackdropBorderColor(0.35, 0.35, 0.4, 1)
|
||||||
|
RelationshipsPVPQueuePanel:SetBackdropColor(0.08, 0.08, 0.10, 0.95)
|
||||||
|
RelationshipsPVPQueuePanel:SetBackdropBorderColor(0.35, 0.35, 0.4, 1)
|
||||||
|
RelationshipsPVPActionPanel:SetBackdropColor(0.08, 0.08, 0.10, 0.95)
|
||||||
|
RelationshipsPVPActionPanel:SetBackdropBorderColor(0.35, 0.35, 0.4, 1)
|
||||||
|
RelationshipsPVP_OnLoad()
|
||||||
|
</OnLoad>
|
||||||
|
<OnEvent>
|
||||||
|
RelationshipsPVP_OnEvent(event)
|
||||||
|
</OnEvent>
|
||||||
|
<OnShow>
|
||||||
|
RelationshipsPVP_Refresh()
|
||||||
|
</OnShow>
|
||||||
|
</Scripts>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<!-- ============================================================
|
||||||
|
Minimap Button
|
||||||
|
============================================================ -->
|
||||||
|
<Button name="RelationshipsPVPMinimapButton" parent="Minimap" movable="true" enableMouse="true" frameStrata="MEDIUM" toplevel="true">
|
||||||
|
<Size><AbsDimension x="32" y="32"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="CENTER" relativeTo="Minimap" relativePoint="CENTER">
|
||||||
|
<Offset><AbsDimension x="60" y="-60"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<NormalTexture name="RelationshipsPVPMinimapIcon" file="Interface\Icons\INV_Misc_QuestionMark">
|
||||||
|
<Size><AbsDimension x="20" y="20"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="CENTER"><Offset><AbsDimension x="0" y="0"/></Offset></Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</NormalTexture>
|
||||||
|
<HighlightTexture file="Interface\Minimap\UI-Minimap-ZoomButton-Highlight" alphaMode="ADD"/>
|
||||||
|
<Layers>
|
||||||
|
<Layer level="OVERLAY">
|
||||||
|
<Texture file="Interface\Minimap\MiniMap-TrackingBorder">
|
||||||
|
<Size><AbsDimension x="54" y="54"/></Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="TOPLEFT">
|
||||||
|
<Offset><AbsDimension x="-2" y="2"/></Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</Texture>
|
||||||
|
</Layer>
|
||||||
|
</Layers>
|
||||||
|
<Scripts>
|
||||||
|
<OnLoad>
|
||||||
|
this:RegisterForClicks("LeftButtonUp","RightButtonUp")
|
||||||
|
this:RegisterForDrag("LeftButton")
|
||||||
|
this:SetFrameLevel(Minimap:GetFrameLevel() + 8)
|
||||||
|
local icon = getglobal("RelationshipsPVPMinimapIcon")
|
||||||
|
if icon and icon.SetTexCoord then
|
||||||
|
icon:SetTexCoord(0.08, 0.92, 0.08, 0.92)
|
||||||
|
end
|
||||||
|
this:SetScript("OnDragStart", function() this:StartMoving() end)
|
||||||
|
this:SetScript("OnDragStop", function()
|
||||||
|
this:StopMovingOrSizing()
|
||||||
|
RelationshipsPVP_SaveIconPos()
|
||||||
|
end)
|
||||||
|
</OnLoad>
|
||||||
|
<OnClick>
|
||||||
|
if RelationshipsPVPFrame:IsVisible() then
|
||||||
|
RelationshipsPVPFrame:Hide()
|
||||||
|
else
|
||||||
|
RelationshipsPVPFrame:Show()
|
||||||
|
end
|
||||||
|
</OnClick>
|
||||||
|
<OnEnter>
|
||||||
|
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
|
||||||
|
GameTooltip:AddLine("Relationships PVP")
|
||||||
|
GameTooltip:AddLine("Click to toggle panel", 1, 1, 1)
|
||||||
|
GameTooltip:AddLine("Drag to move", 0.7, 0.7, 0.7)
|
||||||
|
GameTooltip:Show()
|
||||||
|
</OnEnter>
|
||||||
|
<OnLeave>
|
||||||
|
GameTooltip:Hide()
|
||||||
|
</OnLeave>
|
||||||
|
</Scripts>
|
||||||
|
</Button>
|
||||||
|
</Ui>
|
||||||
Reference in New Issue
Block a user