From be1d3f6efe712f2deac048ee52faa3fa40445943 Mon Sep 17 00:00:00 2001 From: acolis <43079252+acolis@users.noreply.github.com> Date: Wed, 27 Sep 2023 20:37:32 +0300 Subject: [PATCH] Add files via upload --- VitalWatch.lua | 1249 +++++++++ VitalWatch.toc | 19 + VitalWatchLocale_enEN.lua | 41 + libs/AceAddon-2.0/AceAddon-2.0.lua | 1102 ++++++++ libs/AceDB-2.0/AceDB-2.0.lua | 1984 ++++++++++++++ libs/AceEvent-2.0/AceEvent-2.0.lua | 1040 ++++++++ libs/AceLibrary/AceLibrary.lua | 702 +++++ libs/AceOO-2.0/AceOO-2.0.lua | 986 +++++++ libs/Banzai-1.1/Banzai-1.1.lua | 217 ++ libs/Dewdrop-2.0/Dewdrop-2.0.lua | 2983 ++++++++++++++++++++++ libs/FuBarPlugin-2.0/FuBarPlugin-2.0.lua | 1585 ++++++++++++ libs/Roster-2.1/Roster-2.1.lua | 425 +++ libs/Tablet-2.0/Tablet-2.0.lua | 2948 +++++++++++++++++++++ sounds/Heartbeat.wav | Bin 0 -> 14446 bytes sounds/blareaggro.wav | Bin 0 -> 27224 bytes sounds/blaredanger.wav | Bin 0 -> 27224 bytes sounds/blaredruid.wav | Bin 0 -> 27250 bytes sounds/blarehunter.wav | Bin 0 -> 27252 bytes sounds/blaremage.wav | Bin 0 -> 27250 bytes sounds/blarepaladin.wav | Bin 0 -> 24440 bytes sounds/blarepriest.wav | Bin 0 -> 27224 bytes sounds/blarerogue.wav | Bin 0 -> 27250 bytes sounds/blareshaman.wav | Bin 0 -> 27224 bytes sounds/blarewarlock.wav | Bin 0 -> 27224 bytes sounds/blarewarrior.wav | Bin 0 -> 27252 bytes sounds/blip5.wav | Bin 0 -> 2460 bytes sounds/blip5druid.wav | Bin 0 -> 16186 bytes sounds/blip5hunter.wav | Bin 0 -> 16060 bytes sounds/blip5mage.wav | Bin 0 -> 18086 bytes sounds/blip5paladin.wav | Bin 0 -> 14684 bytes sounds/blip5priest.wav | Bin 0 -> 19482 bytes sounds/blip5rogue.wav | Bin 0 -> 13802 bytes sounds/blip5shaman.wav | Bin 0 -> 16442 bytes sounds/blip5warlock.wav | Bin 0 -> 24276 bytes sounds/blip5warrior.wav | Bin 0 -> 20086 bytes sounds/phasers3.wav | Bin 0 -> 4124 bytes sounds/phasers3druid.wav | Bin 0 -> 16186 bytes sounds/phasers3hunter.wav | Bin 0 -> 16060 bytes sounds/phasers3mage.wav | Bin 0 -> 18086 bytes sounds/phasers3paladin.wav | Bin 0 -> 14684 bytes sounds/phasers3priest.wav | Bin 0 -> 19482 bytes sounds/phasers3rogue.wav | Bin 0 -> 13802 bytes sounds/phasers3shaman.wav | Bin 0 -> 16442 bytes sounds/phasers3warlock.wav | Bin 0 -> 24276 bytes sounds/phasers3warrior.wav | Bin 0 -> 20086 bytes sounds/shrink.wav | Bin 0 -> 19998 bytes sounds/shrinkdruid.wav | Bin 0 -> 23184 bytes sounds/shrinkhunter.wav | Bin 0 -> 21666 bytes sounds/shrinkmage.wav | Bin 0 -> 19966 bytes sounds/shrinkpaladin.wav | Bin 0 -> 19940 bytes sounds/shrinkpriest.wav | Bin 0 -> 19940 bytes sounds/shrinkshaman.wav | Bin 0 -> 19940 bytes sounds/shrinkwarlock.wav | Bin 0 -> 24276 bytes 53 files changed, 15281 insertions(+) create mode 100644 VitalWatch.lua create mode 100644 VitalWatch.toc create mode 100644 VitalWatchLocale_enEN.lua create mode 100644 libs/AceAddon-2.0/AceAddon-2.0.lua create mode 100644 libs/AceDB-2.0/AceDB-2.0.lua create mode 100644 libs/AceEvent-2.0/AceEvent-2.0.lua create mode 100644 libs/AceLibrary/AceLibrary.lua create mode 100644 libs/AceOO-2.0/AceOO-2.0.lua create mode 100644 libs/Banzai-1.1/Banzai-1.1.lua create mode 100644 libs/Dewdrop-2.0/Dewdrop-2.0.lua create mode 100644 libs/FuBarPlugin-2.0/FuBarPlugin-2.0.lua create mode 100644 libs/Roster-2.1/Roster-2.1.lua create mode 100644 libs/Tablet-2.0/Tablet-2.0.lua create mode 100644 sounds/Heartbeat.wav create mode 100644 sounds/blareaggro.wav create mode 100644 sounds/blaredanger.wav create mode 100644 sounds/blaredruid.wav create mode 100644 sounds/blarehunter.wav create mode 100644 sounds/blaremage.wav create mode 100644 sounds/blarepaladin.wav create mode 100644 sounds/blarepriest.wav create mode 100644 sounds/blarerogue.wav create mode 100644 sounds/blareshaman.wav create mode 100644 sounds/blarewarlock.wav create mode 100644 sounds/blarewarrior.wav create mode 100644 sounds/blip5.wav create mode 100644 sounds/blip5druid.wav create mode 100644 sounds/blip5hunter.wav create mode 100644 sounds/blip5mage.wav create mode 100644 sounds/blip5paladin.wav create mode 100644 sounds/blip5priest.wav create mode 100644 sounds/blip5rogue.wav create mode 100644 sounds/blip5shaman.wav create mode 100644 sounds/blip5warlock.wav create mode 100644 sounds/blip5warrior.wav create mode 100644 sounds/phasers3.wav create mode 100644 sounds/phasers3druid.wav create mode 100644 sounds/phasers3hunter.wav create mode 100644 sounds/phasers3mage.wav create mode 100644 sounds/phasers3paladin.wav create mode 100644 sounds/phasers3priest.wav create mode 100644 sounds/phasers3rogue.wav create mode 100644 sounds/phasers3shaman.wav create mode 100644 sounds/phasers3warlock.wav create mode 100644 sounds/phasers3warrior.wav create mode 100644 sounds/shrink.wav create mode 100644 sounds/shrinkdruid.wav create mode 100644 sounds/shrinkhunter.wav create mode 100644 sounds/shrinkmage.wav create mode 100644 sounds/shrinkpaladin.wav create mode 100644 sounds/shrinkpriest.wav create mode 100644 sounds/shrinkshaman.wav create mode 100644 sounds/shrinkwarlock.wav diff --git a/VitalWatch.lua b/VitalWatch.lua new file mode 100644 index 0000000..6932100 --- /dev/null +++ b/VitalWatch.lua @@ -0,0 +1,1249 @@ +--[[ +-- Name: VitalWatch +-- Author: Thrae of Maelstrom (aka "Matthew Carras") +-- Release Date: 8-25-06 +-- +-- Original concept by Sean Kennedy (HealthWatch), then modified by Nikolas Davis (VitalWatch). +-- This is a complete recode of the original VitalWatch, with a lot of new features. +-- +-- Thanks to #wowace and #wowi-lounge on Freenode as always for +-- optimization assistance. +--]] + +local _G = getfenv(0) +local strfind = string.find + +local UnitExists, UnitIsUnit, UnitCanAttack, UnitIsPlayer, UnitName, UnitInRaid, UnitInParty, UnitLevel = _G.UnitExists, _G.UnitIsUnit, _G.UnitCanAttack, _G.UnitIsPlayer, _G.UnitName, _G.UnitInRaid, _G.UnitInParty, _G.UnitLevel + +local GetTime = _G.GetTime + +VitalWatch = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceDB-2.0", "FuBarPlugin-2.0") +local VitalWatch = _G.VitalWatch +local VitalWatchLocale = _G.VitalWatchLocale +local tablet = AceLibrary("Tablet-2.0") +local roster + +-- stuff for FuBar / Tablet +--VitalWatch.name = "VitalWatch" -- should be auto provided if using AceAddon-2.0 +VitalWatch.title = VitalWatchLocale.LogTitle +VitalWatch.defaultPosition = "LEFT" +VitalWatch.defaultMinimapPosition = 150 +VitalWatch.cannotDetachTooltip = false +VitalWatch.hideWithoutStandby = true +VitalWatch.clickableTooltip = true -- XXX now do what? +VitalWatch.independentProfile = true +--VitalWatch.tooltipHiddenWhenEmpty = true +VitalWatch.showTitleWhenDetached = true +VitalWatch.hasIcon = "Interface\\Icons\\Spell_ChargePositive" + +local db, tmp, _ + +-- These are frames from the default UI +local LowHealthFrame = _G.LowHealthFrame +local OutOfControlFrame = _G.OutOfControlFrame + +local LastPercentageHealth +local LastPercentageMana +local MessageLog +local NumMessageLog = 0 + +local MessageFrameHoldTime = 3 -- How long the message is held on the frame. +local MessageFrameMessageAlpha = 1 + +local NextQueuedMessage, NextQueuedMessageChan, NextQueuedMessagePriority, NextQueuedEmote, NextQueuedDoEmote +local DEFAULT_MsgRate = 0.2 +local DEFAULT_AggroWatchRate = 5 +local DEFAULT_AggroWatchOtherRate = 8 + +-- hopefully this won't need to be localized +local SoundPath = "Interface\\AddOns\\VitalWatch\\sounds\\" +local HeartbeatSound = SoundPath .. "Heartbeat.wav" + +local DEFAULT_ThresholdCritHealth = 0.2 +local DEFAULT_ThresholdLowHealth = 0.4 +local DEFAULT_ThresholdCritMana = 0.2 +local DEFAULT_ThresholdLowMana = 0.4 +local DEFAULT_SoundCritHealth = SoundPath .. "phasers3.wav" +local DEFAULT_SoundLowHealth = SoundPath .. "blip5.wav" + +local DEFAULT_SoundCritHealthByClass = { + ["DRUID"] = SoundPath .. "phasers3druid.wav", + ["HUNTER"] = SoundPath .. "phasers3hunter.wav", + ["MAGE"] = SoundPath .. "phasers3mage.wav", + ["PALADIN"] = SoundPath .. "phasers3paladin.wav", + ["PRIEST"] = SoundPath .. "phasers3priest.wav", + ["ROGUE"] = SoundPath .. "phasers3rogue.wav", + ["WARLOCK"] = SoundPath .. "phasers3warlock.wav", + ["WARRIOR"] = SoundPath .. "phasers3warrior.wav" +} +local DEFAULT_SoundLowHealthByClass = { + ["DRUID"] = SoundPath .. "blip5druid.wav", + ["HUNTER"] = SoundPath .. "blip5hunter.wav", + ["MAGE"] = SoundPath .. "blip5mage.wav", + ["PALADIN"] = SoundPath .. "blip5paladin.wav", + ["PRIEST"] = SoundPath .. "blip5priest.wav", + ["ROGUE"] = SoundPath .. "blip5rogue.wav", + ["WARLOCK"] = SoundPath .. "blip5warlock.wav", + ["WARRIOR"] = SoundPath .. "blip5warrior.wav" +} +local DEFAULT_SoundCritManaByClass = { + ["DRUID"] = SoundPath .. "shrinkdruid.wav", + ["HUNTER"] = SoundPath .. "shrinkhunter.wav", + ["MAGE"] = SoundPath .. "shrinkmage.wav", + ["PALADIN"] = SoundPath .. "shrinkpaladin.wav", + ["PRIEST"] = SoundPath .. "shrinkpriest.wav", + ["WARLOCK"] = SoundPath .. "shrinkwarlock.wav" +} + +local DEFAULT_SoundAggroByClass = { + ["DRUID"] = SoundPath .. "blaredruid.wav", + ["HUNTER"] = SoundPath .. "blarehunter.wav", + ["PALADIN"] = SoundPath .. "blarepaladin.wav", + ["PRIEST"] = SoundPath .. "blarepriest.wav", + ["ROGUE"] = SoundPath .. "blarerogue.wav", + ["WARLOCK"] = SoundPath .. "blarewarlock.wav", + ["WARRIOR"] = SoundPath .. "blarewarrior.wav" +} + +local ClassColors = {} +for k,v in pairs(RAID_CLASS_COLORS) do + ClassColors[k] = string.format("%2x%2x%2x", v.r*255, v.g*255, v.b*255) +end + +-- Print out a message, probably to ChatFrame1 +function VitalWatch:Msg(msg) + DEFAULT_CHAT_FRAME:AddMessage("|cFFFFCC00VitalWatch:|r " .. msg ) +end + +-- Enable a LoadOnDemand addon and optionally run one of its functions. +-- If the addon is already loaded, then just run the function or do +-- nothing. +function VitalWatch:LoDRun(addon,sfunc,arg1,arg2,arg3,arg4,arg5,arg6) + if not self[sfunc] then + local loaded, reason = LoadAddOn(addon) + if loaded then + if self[sfunc] and type( self[sfunc] ) == "function" then + self[sfunc](self,arg1,arg2,arg3,arg4,arg5,arg6) + end + else + self:Msg( addon .. " Addon LoadOnDemand Error - " .. reason ) + return reason + end + elseif type( self[sfunc] ) == "function" then + self[sfunc](self,arg1,arg2,arg3,arg4,arg5,arg6) + end +end + +local MessageFrame, MessageFrameHealth_AddMessage, MessageFrameMana_AddMessage, MessageFrameAggro_AddMessage +local function CreateMessageFrame() + if not MessageFrame then + MessageFrame = CreateFrame("MessageFrame", "VitalWatchMessageFrame", UIParent ) + MessageFrame:SetWidth(512) + MessageFrame:SetHeight(60) + MessageFrame:SetPoint("CENTER", 0, 250) + MessageFrame:SetInsertMode("TOP") + MessageFrame:SetToplevel(true) + MessageFrame:SetFontObject(NumberFontNormalHuge) + MessageFrame:SetJustifyH("CENTER") + MessageFrame:Show() + end +end + +local function StopFrameFlash(frame) + UIFrameFlashRemoveFrame(frame) + UIFrameFadeRemoveFrame(frame) + if frame:IsVisible() then frame:Hide() end +end + +-- Thanks to TNE_LowHealthWarning for part of this. +local function AdjustFlashRate(frame, rate) + if rate and rate < 1 then + if UIFrameIsFlashing(frame) then + frame.flashDuration = frame.flashDuration + rate + 1 + if rate < 1 then + frame.fadeInTime = rate * 0.15 + frame.fadeOutTime = rate * 0.85 + frame.flashInHoldTime = 0 + elseif rate > 0 then + frame.fadeInTime = 0.2 + frame.fadeOutTime = 0.8 + frame.flashInHoldTime = rate - 1 + else + StopFrameFlash(frame) + end + elseif rate > 0 then + UIFrameFlash(frame, 0.2, 0.8, 10, nil, rate -1, 0) + else + StopFrameFlash(frame) + end + end +end + +-- I want to get rid of this +local function PlayHeartbeatSound() + PlaySoundFile( HeartbeatSound ) +end + +-- Alternative message frames. I used BigWigs as a template. +local colourtable +local function SCT4_AddMessage(frame, text, r, g, b, alpha) + if not colourtable then colourtable = {} end + colourtable.r, colourtable.g, colourtable.b = r, g, b + SCT_Display_Message( text, colourtable ) +end + +local function SCT_AddMessage(frame, text, r, g, b, alpha) + SCT_MSG_FRAME:AddMessage(text, r, g, b, alpha) +end + +local function MikSBT_AddMessage(frame, text, r, g, b) + MikSBT.DisplayMessage(text, MikSBT.DISPLAYTYPE_NOTIFICATION, false, r * 255, g * 255, b * 255) +end + +local function BigWigs_AddMessage(frame, text, r, g, b, alpha) + if not colourtable then colourtable = {} end + colourtable.r, colourtable.g, colourtable.b = r,g,b + VitalWatch:TriggerEvent("BigWigs_Message", text, colourtable, true, nil) +end + +local function Blizzard_FCT_AddMessage(frame, text, r, g, b, alpha) + CombatText_AddMessage(text, COMBAT_TEXT_SCROLL_FUNCTION, r, g, b, "sticky", nil) +end + +------------------------------------------------------------------------- +-- WoW Event Processing + +local playerInBG +function VitalWatch:PLAYER_ENTERING_WORLD() + local isIn,typeOf=IsInInstance() + playerInBG = isIn and (typeOf == "pvp") +end + +function VitalWatch:ProcessUnitHealthOther(unit, name, class, petTag) + local percentage = UnitHealth(unit) / UnitHealthMax(unit) + if percentage < (db["ThresholdCritHealth"] or DEFAULT_ThresholdCritHealth) and + (not LastPercentageHealth[unit] or + LastPercentageHealth[unit] >= (db["ThresholdCritHealth"] or DEFAULT_ThresholdCritHealth)) then + if class and ClassColors[class] then + self:MessageLogUpdate("|cFF" .. ClassColors[class] .. name .. "|r" .. + VitalWatchLocale.Floating_Message_CritHealth, + db["ColourCritHealthOtherR"] or 1, + db["ColourCritHealthOtherG"] or 0, + db["ColourCritHealthOtherB"] or 0) + else + self:MessageLogUpdate(name .. VitalWatchLocale.Floating_Message_CritHealth .. (petTag or ""), + db["ColourCritHealthOtherR"] or 1, + db["ColourCritHealthOtherG"] or 0, + db["ColourCritHealthOtherB"] or 0) + end + if db["MessageFrameHealth"] ~= 5 then + MessageFrameHealth_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + + tmp = db["SoundCritHealthByClass"] + tmp = tmp ~= nil and tmp[(class or "pet")] + if tmp then + PlaySoundFile( DEFAULT_SoundCritHealthByClass[class] ) + else + tmp = db["SoundCritHealthOther"] + if tmp ~= "DISABLED" then + PlaySoundFile( (tmp ~= nil and (SoundPath .. tmp .. ".wav") ) or DEFAULT_SoundCritHealth) + end + end + + tmp = db["MsgChanOther"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and + (not NextQueuedMessagePriority or (NextQueuedMessagePriority < 3 and + not petTag)) and db["MsgCritHealth"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + (tmp == "PARTY" and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ------- + NextQueuedMessage = "<< " .. + name .. + db["MsgOtherCritHealth"] .. + (petTag or (" (" .. UnitClass(unit) .. ") ")) .. + " >>" + NextQueuedMessageChan = db["MsgChanOther"] + NextQueuedMessagePriority = (petTag and 1) or 2 + -------- + end + elseif percentage < (db["ThresholdLowHealth"] or DEFAULT_ThresholdLowHealth) and + (not LastPercentageHealth[unit] or + LastPercentageHealth[unit] >= (db["ThresholdLowHealth"] or DEFAULT_ThresholdLowHealth)) then + + if class and ClassColors[class] then + self:MessageLogUpdate("|cFF" .. ClassColors[class] .. name .. "|r" .. + VitalWatchLocale.Floating_Message_LowHealth, + db["ColourLowHealthOtherR"] or 1, + db["ColourLowHealthOtherG"] or 0, + db["ColourLowHealthOtherB"] or 0) + else + self:MessageLogUpdate(name .. VitalWatchLocale.Floating_Message_LowHealth .. (petTag or ""), + db["ColourLowHealthOtherR"] or 1, + db["ColourLowHealthOtherG"] or 0, + db["ColourLowHealthOtherB"] or 0) + end + if db["MessageFrameHealth"] ~= 5 then + MessageFrameHealth_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + + tmp = db["SoundLowHealthByClass"] + tmp = tmp ~= nil and tmp[(class or "pet")] + if tmp then + PlaySoundFile( DEFAULT_SoundLowHealthByClass[class] ) + else + tmp = db["SoundLowHealthOther"] + if tmp ~= "DISABLED" then + PlaySoundFile( (tmp ~= nil and (SoundPath .. tmp .. ".wav") ) or DEFAULT_SoundLowHealth) + end + end + + tmp = db["MsgChanOther"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and + (not NextQueuedMessagePriority or (NextQueuedMessagePriority < 2 and + not petTag)) and db["MsgCritHealth"] and not playerInBG and + db["MsgOtherLowHealth"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + (tmp == "PARTY" and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ------- + NextQueuedMessage = "<< " .. + name .. + db["MsgOtherLowHealth"] .. + (petTag or (" (" .. UnitClass(unit) .. ")")) .. + " >>" + NextQueuedMessageChan = db["MsgChanOther"] + NextQueuedMessagePriority = (not petTag and 1) or nil + -------- + end + end + LastPercentageHealth[unit] = percentage +end + +function VitalWatch:UNIT_HEALTH(unit) + if unit and unit ~= "target" and unit ~= "focus" and UnitAffectingCombat(unit) and + UnitHealth(unit) > 0 and not UnitIsDeadOrGhost(unit) then + if unit == "player" or UnitIsUnit(unit, "player") then + local flashRestart + local percentage = UnitHealth(unit) / UnitHealthMax(unit) + if percentage < (db["ThresholdCritHealth"] or DEFAULT_ThresholdCritHealth) and + (not LastPercentageHealth[unit] or + LastPercentageHealth[unit] >= (db["ThresholdCritHealth"] or DEFAULT_ThresholdCritHealth)) then + if db["FlashFrameHealth"] then + AdjustFlashRate(LowHealthFrame, (2.0 * percentage) + 0.5) + flashRestart = true + end + if db["Heartbeat"] then + self:ScheduleRepeatingEvent( "Heartbeat", + PlayHeartbeatSound, + (2.0 * percentage) + 0.5 ) + end + self:MessageLogUpdate(VitalWatchLocale.Floating_Message_Self_CritHealth, + db["ColourCritHealthR"] or 1, + db["ColourCritHealthG"] or 0, + db["ColourCritHealthB"] or 0) + if db["MessageFrameHealth"] ~= 5 then + MessageFrameHealth_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + local skipsound + tmp = db["EmoteCritHealth"] + if tmp and not playerInBG then + local doEmote + _,_,doEmote = strfind(tmp, "^/(.+)") + if doEmote then + _,_,NextQueuedDoEmote = doEmote + skipsound = true + else + NextQueuedEmote = tmp + end + end + tmp = db["SoundCritHealth"] + if not skipsound and tmp ~= "DISABLED" then + PlaySoundFile( (tmp ~= nil and (SoundPath .. tmp .. ".wav") ) or DEFAULT_SoundCritHealth) + end + tmp = db["MsgChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and + db["MsgCritHealth"] ~= "DISABLED" and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ------- + NextQueuedMessage = "<< " .. + (db["MsgCritHealth"] or VitalWatchLocale.DEFAULT_MsgCritHealth) .. + " >>" + NextQueuedMessageChan = db["MsgChan"] or "PARTY" + NextQueuedMessagePriority = 4 + -------- + end + elseif percentage < (db["ThresholdLowHealth"] or DEFAULT_ThresholdLowHealth) and + (not LastPercentageHealth[unit] or + LastPercentageHealth[unit] >= (db["ThresholdLowHealth"] or DEFAULT_ThresholdLowHealth)) then + if db["FlashFrameHealth"] then + AdjustFlashRate(LowHealthFrame, (2.0 * percentage) + 0.5) + flashRestart = true + end + if db["Heartbeat"] then + self:ScheduleRepeatingEvent( "Heartbeat", + PlayHeartbeatSound, + (2.0 * percentage) + 0.5 ) + end + self:MessageLogUpdate(VitalWatchLocale.Floating_Message_Self_LowHealth, + db["ColourLowHealthR"] or 1, + db["ColourLowHealthG"] or 0, + db["ColourLowHealthB"] or 0) + if db["MessageFrameHealth"] ~= 5 then + MessageFrameHealth_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + local skipsound + tmp = db["EmoteLowHealth"] + if tmp and not playerInBG then + local doEmote + _,_,doEmote = strfind(tmp, "^/(.+)") + if doEmote then + _,_,NextQueuedDoEmote = doEmote + skipsound = true + else + NextQueuedEmote = tmp + end + end + tmp = db["SoundLowHealth"] + if not skipsound and tmp ~= "DISABLED" then + PlaySoundFile( (tmp ~= nil and (SoundPath .. tmp .. ".wav") ) or DEFAULT_SoundLowHealth) + end + tmp = db["MsgChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and NextQueuedPriority == nil and + db["MsgLowHealth"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ----- + NextQueuedMessage = "<< " .. + db["MsgLowHealth"] .. + " >>" + NextQueuedMessageChan = db["MsgChan"] or "PARTY" + NextQueuedMessagePriority = 3 + ----- + end + end + if db["FlashFrameHealth"] and not flashRestart then + StopFrameFlash(LowHealthFrame) + end + LastPercentageHealth[unit] = percentage + elseif UnitIsPlayer(unit) then + local _,c = UnitClass(unit) + local name = (UnitName(unit)) or "Name Unknown" + if ((db["HealthWatch"] and db["HealthWatch"] > 1 and UnitInParty(unit)) or + (db["HealthWatch"] == 3 and UnitInRaid(unit))) and + (not db["HealthNoWatchClass"] or not db["HealthNoWatchClass"][c]) and + (not db["HealthNoWatchName"] or not db["HealthNoWatchName"][name]) then + ------- + self:ProcessUnitHealthOther(unit, name, class) + ------- + end + elseif db["PetHealthWatch"] ~= 1 and unit == "pet" then + self:ProcessUnitHealthOther(unit, (UnitName(unit)) or "Name Unknown", nil, VitalWatchLocale.MyPetTag) + elseif (db["PetHealthWatch"] and db["PetHealthWatch"] > 1 and UnitPlayerOrPetInParty(unit)) or + (db["PetHealthWatch"] == 3 and UnitPlayerOrPetInRaid(unit)) then + self:ProcessUnitHealthOther(unit, (UnitName(unit)) or "Name Unknown", nil, VitalWatchLocale.PetTag) + end + end +end + +function VitalWatch:UNIT_MANA(unit) + if unit and unit ~= "target" and unit ~= "focus" and UnitAffectingCombat(unit) and + UnitMana(unit) > 0 and not UnitIsDeadOrGhost(unit) and UnitPowerType(unit) == 0 then + if unit == "player" or UnitIsUnit(unit, "player") then + local flashRestart + local percentage = UnitMana(unit) / UnitManaMax(unit) + if not percentage then return end + if percentage < (db["ThresholdCritMana"] or DEFAULT_ThresholdCritMana) and + (not LastPercentageMana[unit] or + LastPercentageMana[unit] >= (db["ThresholdCritMana"] or DEFAULT_ThresholdCritMana)) then + if db["FlashFrameMana"] then + AdjustFlashRate(OutOfControlFrame, (2.0 * percentage) + 0.5) + flashRestart = true + end + self:MessageLogUpdate(VitalWatchLocale.Floating_Message_Self_CritMana, + db["ColourCritManaR"] or 1, + db["ColourCritManaG"] or 0, + db["ColourCritManaB"] or 0) + if db["MessageFrameMana"] ~= 5 then + MessageFrameMana_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + local skipsound + tmp = db["EmoteCritMana"] + if tmp ~= "DISABLED" and not playerInBG then + local doEmote + _,_,doEmote = strfind(tmp or VitalWatchLocale.DEFAULT_EmoteCritMana, "^/(.+)") + if doEmote then + NextQueuedDoEmote = doEmote + skipsound = true + else + NextQueuedEmote = tmp + end + end + tmp = db["SoundCritMana"] + if not skipsound and tmp then + PlaySoundFile( SoundPath .. tmp .. ".wav" ) + end + tmp = db["MsgChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and + db["MsgCritMana"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ------- + NextQueuedMessage = "<< " .. + db["MsgCritMana"] .. + " >>" + NextQueuedMessageChan = db["MsgChan"] or "PARTY" + NextQueuedMessagePriority = 3 + -------- + end + elseif (percentage < (db["ThresholdLowMana"] or DEFAULT_ThresholdLowMana)) and + (not LastPercentageMana[unit] or + LastPercentageMana[unit] >= (db["ThresholdLowMana"] or DEFAULT_ThresholdLowMana)) then + if db["FlashFrameMana"] then + AdjustFlashRate(OutOfControlFrame, (2.0 * percentage) + 0.5) + flashRestart = true + end + self:MessageLogUpdate(VitalWatchLocale.Floating_Message_Self_LowMana, + db["ColourLowManaR"] or 1, + db["ColourLowManaG"] or 0, + db["ColourLowManaB"] or 0) + if db["MessageFrameMana"] ~= 5 then + MessageFrameMana_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + local skipsound + tmp = db["EmoteLowMana"] + if tmp and not playerInBG then + local doEmote + _,_,doEmote = strfind(tmp, "^/(.+)") + if doEmote then + _,_,NextQueuedDoEmote = doEmote + skipsound = true + else + NextQueuedEmote = tmp + end + end + tmp = db["SoundLowMana"] + if not skipsound and tmp then + PlaySoundFile( SoundPath .. tmp .. ".wav" ) + end + tmp = db["MsgChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and + (not NextQueuedMessagePriority or NextQueuedMessagePriority < 3) and + db["MsgLowMana"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ----- + NextQueuedMessage = "<< " .. + db["MsgLowMana"] .. + " >>" + NextQueuedMessageChan = db["MsgChan"] or "PARTY" + NextQueuedMessagePriority = 2 + ----- + end + end + if db["FlashFrameMana"] and not flashRestart then + StopFrameFlash(OutOfControlFrame) + end + LastPercentageMana[unit] = percentage + elseif UnitIsPlayer(unit) then + local _,c = UnitClass(unit) + local name = (UnitName(unit)) or "Name Unknown" + if ((db["ManaWatch"] and db["ManaWatch"] > 1 and UnitInParty(unit)) or + (db["ManaWatch"] == 3 and UnitInRaid(unit))) and + (not db["ManaNoWatchClass"] or not db["ManaNoWatchClass"][c]) and + (not db["ManaNoWatchName"] or not db["ManaNoWatchName"][name]) then + local percentage = UnitMana(unit) / UnitManaMax(unit) + if percentage < (db["ThresholdCritMana"] or DEFAULT_ThresholdCritMana) and + (not LastPercentageMana[unit] or + LastPercentageMana[unit] >= (db["ThresholdCritMana"] or DEFAULT_ThresholdCritMana)) then + if c and ClassColors[c] then + self:MessageLogUpdate("|cFF" .. ClassColors[c] .. name .. "|r" .. + VitalWatchLocale.Floating_Message_CritMana, + db["ColourCritManaOtherR"] or 0, + db["ColourCritManaOtherG"] or 0, + db["ColourCritManaOtherB"] or 1) + else + self:MessageLogUpdate(name .. VitalWatchLocale.Floating_Message_CritMana, + db["ColourCritManaOtherR"] or 0, + db["ColourCritManaOtherG"] or 0, + db["ColourCritManaOtherB"] or 1) + end + if db["MessageFrameMana"] ~= 5 then + MessageFrameMana_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + tmp = db["SoundCritManaByClass"] + tmp = tmp ~= nil and tmp[class] + if tmp then + PlaySoundFile( DEFAULT_SoundCritHealthByClass[class] ) + else + tmp = db["SoundCritManaOther"] + if tmp then + PlaySoundFile( SoundPath .. tmp .. ".wav") + end + end + tmp = db["MsgChanOther"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and + (not NextQueuedMessagePriority or NextQueuedMessagePriority < 3) and + db["MsgOtherCritMana"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ------- + NextQueuedMessage = "<< " .. + name .. + db["MsgOtherCritMana"] .. + " (" .. UnitClass(unit) .. + ") >>" + NextQueuedMessageChan = db["MsgChanOther"] or "PARTY" + NextQueuedMessagePriority = 2 + -------- + end + elseif (percentage < (db["ThresholdLowMana"] or DEFAULT_ThresholdLowMana)) and + (not LastPercentageMana[unit] or + LastPercentageMana[unit] >= (db["ThresholdLowMana"] or DEFAULT_ThresholdLowMana)) then + if c and ClassColors[c] then + self:MessageLogUpdate("|cFF" .. ClassColors[c] .. name .. "|r" .. + VitalWatchLocale.Floating_Message_LowMana, + db["ColourLowManaOtherR"] or 0, + db["ColourLowManaOtherG"] or 0, + db["ColourLowManaOtherB"] or 1) + else + self:MessageLogUpdate(name .. VitalWatchLocale.Floating_Message_LowMana, + db["ColourLowManaOtherR"] or 0, + db["ColourLowManaOtherG"] or 0, + db["ColourLowManaOtherB"] or 1) + end + if db["MessageFrameMana"] ~= 5 then + MessageFrameMana_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + tmp = db["SoundLowManaOther"] + if tmp then + PlaySoundFile( SoundPath .. tmp .. ".wav" ) + end + tmp = db["MsgChanOther"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and NextQueuedMessagePriority == nil and + db["MsgOtherLowMana"] and not playerInBG and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + ------- + NextQueuedMessage = "<< " .. + name .. + db["MsgOtherLowMana"] .. + " (" .. UnitClass(unit) .. + ") >>" + NextQueuedMessageChan = db["MsgChanOther"] or "PARTY" + NextQueuedMessagePriority = nil + -------- + end + end + LastPercentageMana[unit] = percentage + end -- big-ass if statement + end + end +end + +------------------------------------------------------------------- +-- Custom Events (Banzai) + + +function VitalWatch:Banzai_UnitGainedAggro( unitId, unitTable ) + if unitId and unitTable and (db["AggroWatch"] ~= 1 or GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0) then + local ru = roster:GetUnitObjectFromUnit(unitId) + if ru then + if unitId == "player" or UnitIsUnit(unitId, "player") then + if db["AggroWatch"] ~= 4 and db["AggroWatch"] ~= 5 then + if not ru.lastAggroAlert or ((GetTime() - ru.lastAggroAlert) > (db["AggroWatchRate"] or DEFAULT_AggroWatchRate)) then + + ru.lastAggroAlert = GetTime() + + if db["FlashFrameAggro"] then + local rate + if ru.banzaiModifier and ru.banzaiModifier > 0 then rate = 10 / ru.banzaiModifier else rate = 1 end + if db["FlashFrameAggro"] == 1 then + AdjustFlashRate( LowHealthFrame, (2.0 * rate) + 0.5) + else + AdjustFlashRate( OutOfControlFrame, (2.0 * rate) + 0.5) + end + end + + local tname,tid = UnitName(unitTable[1]) or "?", unitTable[1] or "?" + VitalWatch:MessageLogUpdate(VitalWatchLocale.Floating_Message_Aggro .. + tname .. + " (" .. + (ru.banzaiModifier or "!") .. + ")", + db["ColourAggroR"] or 0.7, + db["ColourAggroG"] or 0.7, + db["ColourAggroB"] or 0.7) + + if db["MessageFrameAggro"] then + MessageFrameAggro_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + local skipsound + tmp = db["EmoteAggro"] + if tmp and not playerInBG then + local doEmote + _,_,doEmote = strfind(tmp, "^/(.+)") + if doEmote then + _,_,NextQueuedDoEmote = doEmote + skipsound = true + else + NextQueuedEmote = tmp + end + end + tmp = db["MsgAggroChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and db["MsgAggro"] and not playerInBG and + (NextQueuedMessagePriority == nil or (ru.banzaiModifier and ru.banzaiModifier > 20)) and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) and not IsMounted() then + NextQueuedMessage = "<< (" .. + UnitClass("player") .. + ") " .. + db["MsgAggro"] .. + " " .. + tname .. + " (" .. + (ru.banzaiModifier or "!") .. + ") >>" + NextQueuedMessageChan = db["MsgAggroChan"] or "PARTY" + NextQueuedMessagePriority = nil + end + if not skipsound and db["SoundAggro"] then + PlaySoundFile( SoundPath .. db["SoundAggro"] .. ".wav" ) + end + end + end + + -- other players + elseif ((db["AggroWatch"] > 4) or (db["AggroWatch"] > 2 and UnitInParty(unitId))) and + (not db["AggroNoWatchClass"] or not db["AggroNoWatchClass"][ru.class]) and + (not db["AggroNoWatchName"] or not db["AggroNoWatchName"][ru.name]) and + (not ru.lastAggroAlert or + ((GetTime() - ru.lastAggroAlert) > (db["AggroWatchOtherRate"] or DEFAULT_AggroWatchOtherRate))) then + + ru.lastAggroAlert = GetTime() + + local tname,tid = UnitName(unitTable[1]) or "?", unitTable[1] or "?" + if ru.class and ClassColors[ru.class] then + self:MessageLogUpdate("|cFF" .. ClassColors[ru.class] .. ru.name .. "|r" .. + " -- " .. + VitalWatchLocale.Floating_Message_Aggro .. + tname .. + " (" .. + (ru.banzaiModifier or "!") .. + ")", + db["ColourAggroOtherR"] or 0.5, + db["ColourAggroOtherG"] or 0.5, + db["ColourAggroOtherB"] or 0.5) + else + self:MessageLogUpdate(ru.name .. + " -- " .. + VitalWatchLocale.Floating_Message_Aggro .. + tname .. + " (" .. + (ru.banzaiModifier or "!") .. + ")", + db["ColourAggroOtherR"] or 0.5, + db["ColourAggroOtherG"] or 0.5, + db["ColourAggroOtherB"] or 0.5) + end + + if db["MessageFrameAggro"] then + MessageFrameAggro_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + tmp = db["MsgAggroOtherChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and db["MsgAggroOther"] and not playerInBG and + (NextQueuedMessagePriority == nil or (ru.banzaiModifier and ru.banzaiModifier > 30)) and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + NextQueuedMessage = "<< " .. + ru.name .. + " (" .. + UnitClass(unitId) .. + " ) " .. + db["MsgAggroOther"] .. + " " .. + tname .. + " (" .. + (ru.banzaiModifier or "!") .. + ") >>" + NextQueuedMessageChan = db["MsgAggroOtherChan"] or "PARTY" + NextQueuedMessagePriority = nil + end + tmp = db["SoundAggroByClass"] + tmp = tmp ~= nil and ru.class ~= nil and tmp[ru.class] + if tmp then + PlaySoundFile( DEFAULT_SoundAggroByClass[class] ) + else + tmp = db["SoundAggroOther"] + if tmp then + PlaySoundFile( SoundPath .. tmp .. ".wav") + end + end + end + end + end +end + +function VitalWatch:Banzai_UnitLostAggro( unitId ) + if unitId and (db["AggroLostWatch"] ~= 1 or GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0) then + local ru = roster:GetUnitObjectFromUnit(unitId) + if ru then + if unitId == "player" or UnitIsUnit(unitId, "player") then + if db["AggroWatch"] ~= 4 and db["AggroWatch"] ~= 5 then + if db["FlashFrameAggro"] then + if db["FlashFrameAggro"] == 1 then + StopFrameFlash( LowHealthFrame ) + else + StopFrameFlash( OutOfControlFrame ) + end + end + + VitalWatch:MessageLogUpdate(VitalWatchLocale.Floating_Message_Aggro .. + VitalWatchLocale.Floating_Message_AggroLost .. + " (" .. + (ru.banzaiModifier or "-") .. + ")", + db["ColourAggroLostR"] or 1, + db["ColourAggroLostG"] or 1, + db["ColourAggroLostB"] or 1) + + if db["MessageFrameAggro"] then + MessageFrameAggro_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + local skipsound + tmp = db["EmoteAggroLost"] + if tmp and not playerInBG then + local doEmote + _,_,doEmote = strfind(tmp, "^/(.+)") + if doEmote then + _,_,NextQueuedDoEmote = doEmote + skipsound = true + else + NextQueuedEmote = tmp + end + end + tmp = db["MsgAggroChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and db["MsgAggroLost"] and not playerInBG and + NextQueuedMessagePriority == nil and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) and not IsMounted() then + NextQueuedMessage = "<< (" .. + UnitClass("player") .. + ") " .. + db["MsgAggroLost"] .. + " >> (" .. + (ru.banzaiModifier or "-") .. + ")" + NextQueuedMessageChan = db["MsgAggroChan"] or "PARTY" + NextQueuedMessagePriority = nil + end + if not skipsound and db["SoundAggroLost"] then + PlaySoundFile( SoundPath .. db["SoundAggroLost"] .. ".wav" ) + end + end + -- other players + elseif ((db["AggroWatch"] > 4) or (db["AggroWatch"] > 2 and GetNumPartyMembers() > 0)) and + (not db["AggroNoWatchClass"] or not db["AggroNoWatchClass"][ru.class]) and + (not db["AggroNoWatchName"] or not db["AggroNoWatchName"][ru.name]) then + + if ru.class and ClassColors[ru.class] then + self:MessageLogUpdate("|cFF" .. ClassColors[ru.class] .. ru.name .. "|r" .. + " -- " .. + VitalWatchLocale.Floating_Message_Aggro .. + VitalWatchLocale.Floating_Message_AggroLost .. + " (" .. + (ru.banzaiModifier or "-") .. + ")", + db["ColourAggroLostOtherR"] or 1, + db["ColourAggroLostOtherG"] or 1, + db["ColourAggroLostOtherB"] or 1) + else + self:MessageLogUpdate(ru.name .. + " -- " .. + VitalWatchLocale.Floating_Message_Aggro .. + VitalWatchLocale.Floating_Message_AggroLost .. + " (" .. + (ru.banzaiModifier or "-") .. + ")", + db["ColourAggroLostOtherR"] or 1, + db["ColourAggroLostOtherG"] or 1, + db["ColourAggroLostOtherB"] or 1) + end + if db["MessageFrameAggro"] then + MessageFrameAggro_AddMessage(MessageFrame, + MessageLog[NumMessageLog].text, + MessageLog[NumMessageLog].r, + MessageLog[NumMessageLog].g, + MessageLog[NumMessageLog].b, + MessageFrameMessageAlpha, + MessageFrameHoldTime) + end + + tmp = db["MsgAggroOtherChan"] + if not db["DisableMsg"] and tmp ~= "DISABLED" and db["MsgAggroLostOther"] and not playerInBG and + NextQueuedMessagePriority == nil and + ((tmp and tmp ~= "PARTY" and tmp ~= "RAID") or + ((not tmp or tmp == "PARTY") and GetNumPartyMembers() > 0) or + (tmp == "RAID" and GetNumRaidMembers() > 0)) then + NextQueuedMessage = "<< " .. + ru.name .. + " (" .. + UnitClass(unitId) .. + " ) " .. + db["MsgAggroLostOther"] .. + " (" .. + (ru.banzaiModifier or "-") .. + ") >>" + NextQueuedMessageChan = db["MsgAggroOtherChan"] or "PARTY" + NextQueuedMessagePriority = nil + end + if db["SoundAggroLostOther"] then + PlaySoundFile( SoundPath .. db["SoundAggroLostOther"] .. ".wav" ) + end + end + end + end +end + + +------------------------------------------------------------------- +-- Timed Events + +function VitalWatch:SendQueuedMessages() + if NextQueuedMessage and NextQueuedMessageChan then + SendChatMessage( NextQueuedMessage, NextQueuedMessageChan) + NextQueuedMessage = nil + NextQueuedMessageChan = nil + NextQueuedMessagePriority = nil + end + if NextQueuedEmote then + SendChatMessage( NextQueuedEmote, "EMOTE" ) + NextQueuedEmote = nil + end + if NextQueuedDoEmote then + DoEmote( NextQueuedDoEmote ) + NextQueuedDoEmote = nil + end +end + +function VitalWatch:StopTimers() + NextQueuedMessage = nil + NextQueuedEmote = nil + NextQueuedDoEmote = nil + NextQueuedMessageChan = nil + NextQueuedMessagePriority = nil + if db["FlashFrameHealth"] then StopFrameFlash(LowHealthFrame) end + if db["FlashFrameMana"] then StopFrameFlash(OutOfControlFrame) end + if db["FlashFrameAggro"] then + if db["FlashFrameAggro"] == 1 then + StopFrameFlash( LowHealthFrame ) + else + StopFrameFlash( OutOfControlFrame ) + end + end + self:CancelScheduledEvent("Heartbeat") +end + +function VitalWatch:FadeOldMessagesInLog() + if NumMessageLog > 0 then + local numRecent = 0 + local currTime = GetTime() + local fadeTime = db["MessageLogFade"] or 15 + for i = 1,NumMessageLog do + if currTime < MessageLog[i].time + fadeTime then + numRecent = numRecent + 1 + end + end + if numRecent ~= NumMessageLog then + local oldi + for i = 1,numRecent do + oldi = NumMessageLog - numRecent + i + MessageLog[i].text = MessageLog[oldi].text + MessageLog[i].ftext = MessageLog[oldi].ftext + MessageLog[i].r = MessageLog[oldi].r + MessageLog[i].g = MessageLog[oldi].g + MessageLog[i].b = MessageLog[oldi].b + MessageLog[i].time = MessageLog[oldi].time + end + NumMessageLog = numRecent + self:UpdateText() + self:UpdateTooltip() + end + end +end + + +----------------------------------------------------------------------- +-- Tablet / Message Log + +function VitalWatch:OnTooltipUpdate() + local cat = tablet:AddCategory("columns", 1, "showWithoutChildren", true, "hideBlankLine", false) + if MessageLog and NumMessageLog > 0 then + for i = 1,NumMessageLog do + cat:AddLine('text', MessageLog[i].ftext, + 'textR', MessageLog[i].r, + 'textG', MessageLog[i].g, + 'textB', MessageLog[i].b, + 'wrap', false) + end + end +end + +function VitalWatch:OnTextUpdate() + if NumMessageLog > 0 then + self:SetText( "VW: " .. MessageLog[NumMessageLog].text ) + else + self:SetText( "VitalWatch" ) + end +end + +function VitalWatch:OnMenuRequest(level, value) + self:LoDRun( "VitalWatchOptions", "CreateDDMenu", level, value) +end + +function VitalWatch:MessageLogUpdate(text, r, g, b) + local max = (db["MaxMessages"] or 6) + if NumMessageLog == max then + for i = max,2,-1 do + MessageLog[i-1].text = MessageLog[i].text + MessageLog[i-1].ftext = MessageLog[i].ftext + MessageLog[i-1].r = MessageLog[i].r + MessageLog[i-1].g = MessageLog[i].g + MessageLog[i-1].b = MessageLog[i].b + MessageLog[i-1].time = MessageLog[i].time + end + MessageLog[max].text = text + MessageLog[max].r = r + MessageLog[max].g = g + MessageLog[max].b = b + MessageLog[max].time = GetTime() + MessageLog[max].ftext = "[" .. date('*t').sec .. "s] " .. text + else + NumMessageLog = NumMessageLog + 1 + if not MessageLog[NumMessageLog] then MessageLog[NumMessageLog] = {} end + MessageLog[NumMessageLog].text = text + MessageLog[NumMessageLog].r = r + MessageLog[NumMessageLog].g = g + MessageLog[NumMessageLog].b = b + MessageLog[NumMessageLog].time = GetTime() + MessageLog[NumMessageLog].ftext = "[" .. date('*t').sec .. "s] " .. text + end + self:UpdateTooltip() + self:UpdateText() +end + + +---------------------------------------------------------------- +-- Initialization + +-- oRA2 additions via BanzaiAlert by vhaarr +--[[ +local function InitoRA() + oRAPAggroAlert = oRA:NewModule(VitalWatchLocale.oRAModule) + oRAPAggroAlert.participant = true + oRAPAggroAlert.name = VitalWatchLocale.oRAModuleName +end + +function VitalWatch:ADDON_LOADED() + if arg1 == "oRA" and oRA and not oRAPAggroAlert then + InitoRA() + end +end +--]] +function VitalWatch:OnInitialize() + self:RegisterDB("VitalWatchDB", "VitalWatchCharDB") + db = self.db.profile +end + +function VitalWatch:OnDataUpdate() + db = self.db.profile +end + +function VitalWatch:OnEnable() + LastPercentageHealth = {} + LastPercentageMana = {} + MessageLog = {} + self:ReInitialize() +--[[ + if oRA and not oRAPAggroAlert then + InitoRA() + end + --]] +end + +function VitalWatch:ReInitialize() + self:UnregisterAllEvents() + self:CancelAllScheduledEvents() + db = self.db.profile + -- self:RegisterEvent("ADDON_LOADED") + if db["HealthWatch"] ~= 1 then + self:RegisterEvent("UNIT_HEALTH") + end + if db["ManaWatch"] ~= 1 then + self:RegisterEvent("UNIT_MANA") + end + + if db["FlashFrameHealth"] or db["FlashFrameMana"] or db["Heartbeat"] or db["FlashFrameAggro"] then + self:RegisterEvent("PLAYER_REGEN_ENABLED", "StopTimers") + self:RegisterEvent("PLAYER_REGEN_DISABLED", "StopTimers") + end + + if db["MessageFrameHealth"] then + if db["MessageFrameHealth"] == 1 then -- SCT + if SCT_Display_Message then + MessageFrameHealth_AddMessage = SCT4_AddMessage + elseif SCT and SCT_MSG_FRAME and SCT_MSG_FRAME.AddMessage then + MessageFrameHealth_AddMessage = SCT_AddMessage + end + elseif db["MessageFrameHealth"] == 2 and MikSBT and MikSBT.DisplayMessage then -- MikSBT + MessageFrameHealth_AddMessage = MikSBT_AddMessage + elseif db["MessageFrameHealth"] == 3 and CombatText_AddMessage then -- Blizzard's Floating Combat Text + MessageFrameHealth_AddMessage = Blizzard_FCT_AddMessage + elseif db["MessageFrameHealth"] == 4 then -- BigWigs + MessageFrameHealth_AddMessage = BigWigs_AddMessage + end + else + CreateMessageFrame() + MessageFrameHealth_AddMessage = MessageFrame.AddMessage + end + if db["MessageFrameMana"] then + if db["MessageFrameMana"] == 1 then -- SCT + if SCT_Display_Message then + MessageFrameMana_AddMessage = SCT4_AddMessage + elseif SCT and SCT_MSG_FRAME and SCT_MSG_FRAME.AddMessage then + MessageFrameMana_AddMessage = SCT_AddMessage + end + elseif db["MessageFrameMana"] == 2 and MikSBT and MikSBT.DisplayMessage then -- MikSBT + MessageFrameMana_AddMessage = MikSBT_AddMessage + elseif db["MessageFrameMana"] == 3 and CombatText_AddMessage then -- Blizzard's Floating Combat Text + MessageFrameMana_AddMessage = Blizzard_FCT_AddMessage + elseif db["MessageFrameMana"] == 4 then -- BigWigs + MessageFrameMana_AddMessage = BigWigs_AddMessage + end + else + CreateMessageFrame() + MessageFrameMana_AddMessage = MessageFrame.AddMessage + end + if db["MessageFrameAggro"] then + if db["MessageFrameAggro"] == 1 then -- SCT + if SCT_Display_Message then + MessageFrameAggro_AddMessage = SCT4_AddMessage + elseif SCT and SCT_MSG_FRAME and SCT_MSG_FRAME.AddMessage then + MessageFrameAggro_AddMessage = SCT_AddMessage + end + elseif db["MessageFrameAggro"] == 2 and MikSBT and MikSBT.DisplayMessage then -- MikSBT + MessageFrameAggro_AddMessage = MikSBT_AddMessage + elseif db["MessageFrameAggro"] == 3 and CombatText_AddMessage then -- Blizzard's Floating Combat Text + MessageFrameAggro_AddMessage = Blizzard_FCT_AddMessage + elseif db["MessageFrameAggro"] == 4 then -- BigWigs + MessageFrameAggro_AddMessage = BigWigs_AddMessage + elseif db["MessageFrameAggro"] == 5 then + CreateMessageFrame() + MessageFrameAggro_AddMessage = MessageFrame.AddMessage + end + end + + if not db["EnableInBGs"] then + self:RegisterEvent("PLAYER_ENTERING_WORLD") + end + self:ScheduleRepeatingEvent("QueuedMessages", self.SendQueuedMessages, db["MsgRate"] or 0.2, self) + self:ScheduleRepeatingEvent("FadeOldMessagesInLog", self.FadeOldMessagesInLog, db["MessageLogFade"] or 5, self) + + -- BanzaiLib + if db["AggroWatch"] then + if not roster then roster = AceLibrary("Roster-2.1") end + self:RegisterEvent("Banzai_UnitGainedAggro") + end + if db["AggroLostWatch"] then + if not roster then roster = AceLibrary("Roster-2.1") end + self:RegisterEvent("Banzai_UnitLostAggro") + end +end + +function VitalWatch:OnDisable() + self:UnregisterAllEvents() + self:CancelAllScheduledEvents() + playerInBG = nil + LastHealthPercentage = nil + LastManaPercentage = nil + NumMessageLog = 0 + MessageLog = nil + roster = nil +end diff --git a/VitalWatch.toc b/VitalWatch.toc new file mode 100644 index 0000000..bce65e1 --- /dev/null +++ b/VitalWatch.toc @@ -0,0 +1,19 @@ +## Interface: 20003 +## Author: Thrae +## Title: VitalWatch |cff7fff7f -Ace2-|r +## Notes: A powerfully customizable health, mana, and aggro alert system for solo, group, and raid. +## SavedVariables: VitalWatchDB +## SavedVariablesPerCharacter: VitalWatchCharDB +libs\AceLibrary\AceLibrary.lua +libs\AceOO-2.0\AceOO-2.0.lua +libs\AceEvent-2.0\AceEvent-2.0.lua +libs\AceDB-2.0\AceDB-2.0.lua +libs\AceAddon-2.0\AceAddon-2.0.lua +libs\Dewdrop-2.0\Dewdrop-2.0.lua +libs\Tablet-2.0\Tablet-2.0.lua +libs\FuBarPlugin-2.0\FuBarPlugin-2.0.lua +libs\Roster-2.1\Roster-2.1.lua +libs\Banzai-1.1\Banzai-1.1.lua + +VitalWatchLocale_enEN.lua +VitalWatch.lua diff --git a/VitalWatchLocale_enEN.lua b/VitalWatchLocale_enEN.lua new file mode 100644 index 0000000..de28c1c --- /dev/null +++ b/VitalWatchLocale_enEN.lua @@ -0,0 +1,41 @@ +--[[ VitalWatch by Thrae +-- +-- +-- English Localization (Default) +-- +-- VitalWatchLocale should be defined in your FIRST localization +-- code. +-- +--]] + +VitalWatchLocale = {} +VitalWatchLocale.locale = getglobal("GetLocale")() + +if VitalWatchLocale.locale then + VitalWatchLocale.LogTitle = "VitalWatch Log" + + VitalWatchLocale.Floating_Message_Self_LowHealth = "Your health is low!" + VitalWatchLocale.Floating_Message_Self_CritHealth = "Your health is CRITICAL!" + VitalWatchLocale.Floating_Message_Self_LowMana = "Your mana is low!" + VitalWatchLocale.Floating_Message_Self_CritMana = "Your mana is CRITICAL!" + + VitalWatchLocale.Floating_Message_LowHealth = "'s health is low!" + VitalWatchLocale.Floating_Message_CritHealth = "'s health is CRITICAL!" + VitalWatchLocale.Floating_Message_LowMana = "'s mana is low!" + VitalWatchLocale.Floating_Message_CritMana = "'s mana is CRITICAL!" + + VitalWatchLocale.Floating_Message_Aggro = "AGGRO: " + VitalWatchLocale.Floating_Message_AggroLost = "Lost aggro." + + VitalWatchLocale.MyPetTag = " (my pet)" + VitalWatchLocale.PetTag = " (pet)" + + VitalWatchLocale.DEFAULT_MsgCritHealth = "My health is CRITICAL!" + + -- Below are voice emotes for your locale. On an English client, you + -- would type in /oom to announce to everyone you're out of mana. To + -- properly translate, you must find out the command for your locale. + VitalWatchLocale.DEFAULT_EmoteCritMana = "/oom" + + VitalWatchLocale.locale = nil -- we no longer need this +end diff --git a/libs/AceAddon-2.0/AceAddon-2.0.lua b/libs/AceAddon-2.0/AceAddon-2.0.lua new file mode 100644 index 0000000..f9eabff --- /dev/null +++ b/libs/AceAddon-2.0/AceAddon-2.0.lua @@ -0,0 +1,1102 @@ +--[[ +Name: AceAddon-2.0 +Revision: $Rev: 23383 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Ace 1.x by Turan (turan@gryphon.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/wiki/AceAddon-2.0 +SVN: http://svn.wowace.com/wowace/trunk/Ace2/AceAddon-2.0 +Description: Base for all Ace addons to inherit from. +Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0, (optional) AceConsole-2.0 +License: LGPL v2.1 +]] + +local MAJOR_VERSION = "AceAddon-2.0" +local MINOR_VERSION = "$Revision: 23383 $" + +-- This ensures the code is only executed if the libary doesn't already exist, or is a newer version +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0.") end + +local function safecall(func,...) + local success, err = pcall(func,...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end +end +-- Localization +local STANDBY, TITLE, NOTES, VERSION, AUTHOR, DATE, CATEGORY, EMAIL, CREDITS, WEBSITE, CATEGORIES, ABOUT, LICENSE, PRINT_ADDON_INFO +if GetLocale() == "deDE" then + STANDBY = "|cffff5050(Standby)|r" -- capitalized + + TITLE = "Titel" + NOTES = "Anmerkung" + VERSION = "Version" + AUTHOR = "Autor" + DATE = "Datum" + CATEGORY = "Kategorie" + EMAIL = "E-Mail" + WEBSITE = "Webseite" + CREDITS = "Credits" -- fix + LICENSE = "License" -- fix + + ABOUT = "Über" + PRINT_ADDON_INFO = "Gibt Addondaten aus" + + CATEGORIES = { + ["Action Bars"] = "Aktionsleisten", + ["Auction"] = "Auktion", + ["Audio"] = "Audio", + ["Battlegrounds/PvP"] = "Schlachtfeld/PvP", + ["Buffs"] = "Stärkungszauber", + ["Chat/Communication"] = "Chat/Kommunikation", + ["Druid"] = "Druide", + ["Hunter"] = "Jäger", + ["Mage"] = "Magier", + ["Paladin"] = "Paladin", + ["Priest"] = "Priester", + ["Rogue"] = "Schurke", + ["Shaman"] = "Schamane", + ["Warlock"] = "Hexenmeister", + ["Warrior"] = "Krieger", + ["Healer"] = "Heiler", + ["Tank"] = "Tank", + ["Caster"] = "Zauberer", + ["Combat"] = "Kampf", + ["Compilations"] = "Zusammenstellungen", + ["Data Export"] = "Datenexport", + ["Development Tools"] = "Entwicklungs Tools", + ["Guild"] = "Gilde", + ["Frame Modification"] = "Frame Veränderungen", + ["Interface Enhancements"] = "Interface Verbesserungen", + ["Inventory"] = "Inventar", + ["Library"] = "Bibliotheken", + ["Map"] = "Karte", + ["Mail"] = "Post", + ["Miscellaneous"] = "Diverses", + ["Quest"] = "Quest", + ["Raid"] = "Schlachtzug", + ["Tradeskill"] = "Beruf", + ["UnitFrame"] = "Einheiten-Fenster", + } +elseif GetLocale() == "frFR" then + STANDBY = "|cffff5050(attente)|r" + + TITLE = "Titre" + NOTES = "Notes" + VERSION = "Version" + AUTHOR = "Auteur" + DATE = "Date" + CATEGORY = "Catégorie" + EMAIL = "E-mail" + WEBSITE = "Site web" + CREDITS = "Credits" -- fix + LICENSE = "License" -- fix + + ABOUT = "A propos" + PRINT_ADDON_INFO = "Afficher les informations sur l'addon" + + CATEGORIES = { + ["Action Bars"] = "Barres d'action", + ["Auction"] = "Hôtel des ventes", + ["Audio"] = "Audio", + ["Battlegrounds/PvP"] = "Champs de bataille/JcJ", + ["Buffs"] = "Buffs", + ["Chat/Communication"] = "Chat/Communication", + ["Druid"] = "Druide", + ["Hunter"] = "Chasseur", + ["Mage"] = "Mage", + ["Paladin"] = "Paladin", + ["Priest"] = "Prêtre", + ["Rogue"] = "Voleur", + ["Shaman"] = "Chaman", + ["Warlock"] = "Démoniste", + ["Warrior"] = "Guerrier", + ["Healer"] = "Soigneur", + ["Tank"] = "Tank", + ["Caster"] = "Casteur", + ["Combat"] = "Combat", + ["Compilations"] = "Compilations", + ["Data Export"] = "Exportation de données", + ["Development Tools"] = "Outils de développement", + ["Guild"] = "Guilde", + ["Frame Modification"] = "Modification des fenêtres", + ["Interface Enhancements"] = "Améliorations de l'interface", + ["Inventory"] = "Inventaire", + ["Library"] = "Bibliothèques", + ["Map"] = "Carte", + ["Mail"] = "Courrier", + ["Miscellaneous"] = "Divers", + ["Quest"] = "Quêtes", + ["Raid"] = "Raid", + ["Tradeskill"] = "Métiers", + ["UnitFrame"] = "Fenêtres d'unité", + } +elseif GetLocale() == "koKR" then + STANDBY = "|cffff5050(사용가능)|r" + + TITLE = "제목" + NOTES = "노트" + VERSION = "버전" + AUTHOR = "저작자" + DATE = "날짜" + CATEGORY = "분류" + EMAIL = "E-mail" + WEBSITE = "웹사이트" + CREDITS = "Credits" -- fix + LICENSE = "License" -- fix + + ABOUT = "정보" + PRINT_ADDON_INFO = "애드온 정보 출력" + + CATEGORIES = { + ["Action Bars"] = "액션바", + ["Auction"] = "경매", + ["Audio"] = "음향", + ["Battlegrounds/PvP"] = "전장/PvP", + ["Buffs"] = "버프", + ["Chat/Communication"] = "대화/의사소통", + ["Druid"] = "드루이드", + ["Hunter"] = "사냥꾼", + ["Mage"] = "마법사", + ["Paladin"] = "성기사", + ["Priest"] = "사제", + ["Rogue"] = "도적", + ["Shaman"] = "주술사", + ["Warlock"] = "흑마법사", + ["Warrior"] = "전사", + ["Healer"] = "힐러", + ["Tank"] = "탱커", + ["Caster"] = "캐스터", + ["Combat"] = "전투", + ["Compilations"] = "복합", + ["Data Export"] = "자료 출력", + ["Development Tools"] = "개발 도구", + ["Guild"] = "길드", + ["Frame Modification"] = "구조 변경", + ["Interface Enhancements"] = "인터페이스 강화", + ["Inventory"] = "인벤토리", + ["Library"] = "라이브러리", + ["Map"] = "지도", + ["Mail"] = "우편", + ["Miscellaneous"] = "기타", + ["Quest"] = "퀘스트", + ["Raid"] = "공격대", + ["Tradeskill"] = "전문기술", + ["UnitFrame"] = "유닛 프레임", + } +elseif GetLocale() == "zhTW" then + STANDBY = "|cffff5050(待命)|r" + + TITLE = "標題" + NOTES = "註記" + VERSION = "版本" + AUTHOR = "作者" + DATE = "日期" + CATEGORY = "類別" + EMAIL = "E-mail" + WEBSITE = "網站" + CREDITS = "Credits" -- fix + LICENSE = "License" -- fix + + ABOUT = "關於" + PRINT_ADDON_INFO = "顯示插件資訊" + + CATEGORIES = { + ["Action Bars"] = "動作列", + ["Auction"] = "拍賣", + ["Audio"] = "音樂", + ["Battlegrounds/PvP"] = "戰場/PvP", + ["Buffs"] = "增益", + ["Chat/Communication"] = "聊天/通訊", + ["Druid"] = "德魯伊", + ["Hunter"] = "獵人", + ["Mage"] = "法師", + ["Paladin"] = "聖騎士", + ["Priest"] = "牧師", + ["Rogue"] = "盜賊", + ["Shaman"] = "薩滿", + ["Warlock"] = "術士", + ["Warrior"] = "戰士", + ["Healer"] = "治療者", + ["Tank"] = "坦克", + ["Caster"] = "施法者", + ["Combat"] = "戰鬥", + ["Compilations"] = "編輯", + ["Data Export"] = "資料匯出", + ["Development Tools"] = "開發工具", + ["Guild"] = "公會", + ["Frame Modification"] = "框架修改", + ["Interface Enhancements"] = "介面增強", + ["Inventory"] = "背包", + ["Library"] = "資料庫", + ["Map"] = "地圖", + ["Mail"] = "郵件", + ["Miscellaneous"] = "綜合", + ["Quest"] = "任務", + ["Raid"] = "團隊", + ["Tradeskill"] = "商業技能", + ["UnitFrame"] = "單位框架", + } +elseif GetLocale() == "zhCN" then + STANDBY = "|cffff5050(暂挂)|r" + + TITLE = "标题" + NOTES = "附注" + VERSION = "版本" + AUTHOR = "作者" + DATE = "日期" + CATEGORY = "分类" + EMAIL = "电子邮件" + WEBSITE = "网站" + CREDITS = "Credits" -- fix + LICENSE = "License" -- fix + + ABOUT = "关于" + PRINT_ADDON_INFO = "印列出插件信息" + + CATEGORIES = { + ["Action Bars"] = "动作条", + ["Auction"] = "拍卖", + ["Audio"] = "音频", + ["Battlegrounds/PvP"] = "战场/PvP", + ["Buffs"] = "增益魔法", + ["Chat/Communication"] = "聊天/交流", + ["Druid"] = "德鲁伊", + ["Hunter"] = "猎人", + ["Mage"] = "法师", + ["Paladin"] = "圣骑士", + ["Priest"] = "牧师", + ["Rogue"] = "盗贼", + ["Shaman"] = "萨满祭司", + ["Warlock"] = "术士", + ["Warrior"] = "战士", +-- ["Healer"] = "治疗保障", +-- ["Tank"] = "近战控制", +-- ["Caster"] = "远程输出", + ["Combat"] = "战斗", + ["Compilations"] = "编译", + ["Data Export"] = "数据导出", + ["Development Tools"] = "开发工具", + ["Guild"] = "公会", + ["Frame Modification"] = "框架修改", + ["Interface Enhancements"] = "界面增强", + ["Inventory"] = "背包", + ["Library"] = "库", + ["Map"] = "地图", + ["Mail"] = "邮件", + ["Miscellaneous"] = "杂项", + ["Quest"] = "任务", + ["Raid"] = "团队", + ["Tradeskill"] = "商业技能", + ["UnitFrame"] = "头像框架", + } +elseif GetLocale() == "esES" then + STANDBY = "|cffff5050(espera)|r" + + TITLE = "Título" + NOTES = "Notas" + VERSION = "Versión" + AUTHOR = "Autor" + DATE = "Fecha" + CATEGORY = "Categoría" + EMAIL = "E-mail" + WEBSITE = "Web" + CREDITS = "Créditos" + LICENSE = "License" -- fix + + ABOUT = "Acerca de" + PRINT_ADDON_INFO = "Muestra información acerca del accesorio." + + CATEGORIES = { + ["Action Bars"] = "Barras de Acción", + ["Auction"] = "Subasta", + ["Audio"] = "Audio", + ["Battlegrounds/PvP"] = "Campos de Batalla/JcJ", + ["Buffs"] = "Buffs", + ["Chat/Communication"] = "Chat/Comunicación", + ["Druid"] = "Druida", + ["Hunter"] = "Cazador", + ["Mage"] = "Mago", + ["Paladin"] = "Paladín", + ["Priest"] = "Sacerdote", + ["Rogue"] = "Pícaro", + ["Shaman"] = "Chamán", + ["Warlock"] = "Brujo", + ["Warrior"] = "Guerrero", + ["Healer"] = "Sanador", + ["Tank"] = "Tanque", + ["Caster"] = "Conjurador", + ["Combat"] = "Combate", + ["Compilations"] = "Compilaciones", + ["Data Export"] = "Exportar Datos", + ["Development Tools"] = "Herramientas de Desarrollo", + ["Guild"] = "Hermandad", + ["Frame Modification"] = "Modificación de Marcos", + ["Interface Enhancements"] = "Mejoras de la Interfaz", + ["Inventory"] = "Inventario", + ["Library"] = "Biblioteca", + ["Map"] = "Mapa", + ["Mail"] = "Correo", + ["Miscellaneous"] = "Misceláneo", + ["Quest"] = "Misión", + ["Raid"] = "Banda", + ["Tradeskill"] = "Habilidad de Comercio", + ["UnitFrame"] = "Marco de Unidades", + } +else -- enUS + STANDBY = "|cffff5050(standby)|r" + + TITLE = "Title" + NOTES = "Notes" + VERSION = "Version" + AUTHOR = "Author" + DATE = "Date" + CATEGORY = "Category" + EMAIL = "E-mail" + WEBSITE = "Website" + CREDITS = "Credits" + LICENSE = "License" + + ABOUT = "About" + PRINT_ADDON_INFO = "Show information about the addon." + + CATEGORIES = { + ["Action Bars"] = "Action Bars", + ["Auction"] = "Auction", + ["Audio"] = "Audio", + ["Battlegrounds/PvP"] = "Battlegrounds/PvP", + ["Buffs"] = "Buffs", + ["Chat/Communication"] = "Chat/Communication", + ["Druid"] = "Druid", + ["Hunter"] = "Hunter", + ["Mage"] = "Mage", + ["Paladin"] = "Paladin", + ["Priest"] = "Priest", + ["Rogue"] = "Rogue", + ["Shaman"] = "Shaman", + ["Warlock"] = "Warlock", + ["Warrior"] = "Warrior", + ["Healer"] = "Healer", + ["Tank"] = "Tank", + ["Caster"] = "Caster", + ["Combat"] = "Combat", + ["Compilations"] = "Compilations", + ["Data Export"] = "Data Export", + ["Development Tools"] = "Development Tools", + ["Guild"] = "Guild", + ["Frame Modification"] = "Frame Modification", + ["Interface Enhancements"] = "Interface Enhancements", + ["Inventory"] = "Inventory", + ["Library"] = "Library", + ["Map"] = "Map", + ["Mail"] = "Mail", + ["Miscellaneous"] = "Miscellaneous", + ["Quest"] = "Quest", + ["Raid"] = "Raid", + ["Tradeskill"] = "Tradeskill", + ["UnitFrame"] = "UnitFrame", + } +end + +setmetatable(CATEGORIES, { __index = function(self, key) -- case-insensitive + local lowerKey = key:lower() + for k,v in pairs(CATEGORIES) do + if k:lower() == lowerKey then + return v + end + end +end }) + +-- Create the library object + +local AceOO = AceLibrary("AceOO-2.0") +local AceAddon = AceOO.Class() +local AceEvent +local AceConsole +local AceModuleCore + +function AceAddon:GetLocalizedCategory(name) + self:argCheck(name, 2, "string") + return CATEGORIES[name] or UNKNOWN +end + +function AceAddon:ToString() + return "AceAddon" +end + +local function print(text) + DEFAULT_CHAT_FRAME:AddMessage(text) +end + +function AceAddon:ADDON_LOADED(name) + local unregister = true + local initAddon = {} + while #self.nextAddon > 0 do + local addon = table.remove(self.nextAddon, 1) + if addon.possibleNames[name] then + table.insert(initAddon, addon) + else + unregister = nil + table.insert(self.skipAddon, addon) + end + end + self.nextAddon, self.skipAddon = self.skipAddon, self.nextAddon + if unregister then + AceAddon:UnregisterEvent("ADDON_LOADED") + end + while #initAddon > 0 do + local addon = table.remove(initAddon, 1) + table.insert(self.addons, addon) + if not self.addons[name] then + self.addons[name] = addon + end + addon.possibleNames = nil + self:InitializeAddon(addon, name) + end +end + +local function RegisterOnEnable(self) + if DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage then -- HACK + AceAddon.playerLoginFired = true + end + if AceAddon.playerLoginFired then + AceAddon.addonsStarted[self] = true + if (type(self.IsActive) ~= "function" or self:IsActive()) and (not AceModuleCore or not AceModuleCore:IsModule(self) or AceModuleCore:IsModuleActive(self)) then + AceAddon.addonsEnabled[self] = true + local current = self.class + while true do + if current == AceOO.Class or not current then + break + end + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedEnable) == "function" then + safecall(mixin.OnEmbedEnable,mixin,self,true) + end + end + end + current = current.super + end + if type(self.OnEnable) == "function" then + safecall(self.OnEnable,self,true) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonEnabled", self, true) + end + end + else + if not AceAddon.addonsToOnEnable then + AceAddon.addonsToOnEnable = {} + end + table.insert(AceAddon.addonsToOnEnable, self) + end +end + +function AceAddon:InitializeAddon(addon, name) + if addon.name == nil then + addon.name = name + end + if GetAddOnMetadata then + -- TOC checks + if addon.title == nil then + addon.title = GetAddOnMetadata(name, "Title") + end + if type(addon.title) == "string" then + local num = addon.title:find(" |cff7fff7f %-Ace2%-|r$") + if num then + addon.title = addon.title:sub(1, num - 1) + end + addon.title = addon.title:trim() + end + if addon.notes == nil then + addon.notes = GetAddOnMetadata(name, "Notes") + end + if type(addon.notes) == "string" then + addon.notes = addon.notes:trim() + end + if addon.version == nil then + addon.version = GetAddOnMetadata(name, "Version") + end + if type(addon.version) == "string" then + if addon.version:find("%$Revision: (%d+) %$") then + addon.version = addon.version:gsub("%$Revision: (%d+) %$", "%1") + elseif addon.version:find("%$Rev: (%d+) %$") then + addon.version = addon.version:gsub("%$Rev: (%d+) %$", "%1") + elseif addon.version:find("%$LastChangedRevision: (%d+) %$") then + addon.version = addon.version:gsub("%$LastChangedRevision: (%d+) %$", "%1") + end + addon.version = addon.version:trim() + end + if addon.author == nil then + addon.author = GetAddOnMetadata(name, "Author") + end + if type(addon.author) == "string" then + addon.author = addon.author:trim() + end + if addon.credits == nil then + addon.credits = GetAddOnMetadata(name, "X-Credits") + end + if type(addon.credits) == "string" then + addon.credits = addon.credits:trim() + end + if addon.date == nil then + addon.date = GetAddOnMetadata(name, "X-Date") or GetAddOnMetadata(name, "X-ReleaseDate") + end + if type(addon.date) == "string" then + if addon.date:find("%$Date: (.-) %$") then + addon.date = addon.date:gsub("%$Date: (.-) %$", "%1") + elseif addon.date:find("%$LastChangedDate: (.-) %$") then + addon.date = addon.date:gsub("%$LastChangedDate: (.-) %$", "%1") + end + addon.date = addon.date:trim() + end + + if addon.category == nil then + addon.category = GetAddOnMetadata(name, "X-Category") + end + if type(addon.category) == "string" then + addon.category = addon.category:trim() + end + if addon.email == nil then + addon.email = GetAddOnMetadata(name, "X-eMail") or GetAddOnMetadata(name, "X-Email") + end + if type(addon.email) == "string" then + addon.email = addon.email:trim() + end + if addon.license == nil then + addon.license = GetAddOnMetadata(name, "X-License") + end + if type(addon.license) == "string" then + addon.license = addon.license:trim() + end + if addon.website == nil then + addon.website = GetAddOnMetadata(name, "X-Website") + end + if type(addon.website) == "string" then + addon.website = addon.website:trim() + end + end + local current = addon.class + while true do + if current == AceOO.Class or not current then + break + end + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedInitialize) == "function" then + mixin:OnEmbedInitialize(addon, name) + end + end + end + current = current.super + end + if type(addon.OnInitialize) == "function" then + safecall(addon.OnInitialize, addon, name) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonInitialized", addon) + end + RegisterOnEnable(addon) +end + +local function isGoodVariable(var) + return type(var) == "string" or type(var) == "number" +end +function AceAddon.prototype:PrintAddonInfo() + local x + if isGoodVariable(self.title) then + x = "|cffffff7f" .. tostring(self.title) .. "|r" + elseif isGoodVariable(self.name) then + x = "|cffffff7f" .. tostring(self.name) .. "|r" + else + x = "|cffffff7f<" .. tostring(self.class) .. " instance>|r" + end + if type(self.IsActive) == "function" then + if not self:IsActive() then + x = x .. " " .. STANDBY + end + end + if isGoodVariable(self.version) then + x = x .. " - |cffffff7f" .. tostring(self.version) .. "|r" + end + if isGoodVariable(self.notes) then + x = x .. " - " .. tostring(self.notes) + end + print(x) + if isGoodVariable(self.author) then + print(" - |cffffff7f" .. AUTHOR .. ":|r " .. tostring(self.author)) + end + if isGoodVariable(self.credits) then + print(" - |cffffff7f" .. CREDITS .. ":|r " .. tostring(self.credits)) + end + if isGoodVariable(self.date) then + print(" - |cffffff7f" .. DATE .. ":|r " .. tostring(self.date)) + end + if self.category then + local category = CATEGORIES[self.category] + if category then + print(" - |cffffff7f" .. CATEGORY .. ":|r " .. category) + end + end + if isGoodVariable(self.email) then + print(" - |cffffff7f" .. EMAIL .. ":|r " .. tostring(self.email)) + end + if isGoodVariable(self.website) then + print(" - |cffffff7f" .. WEBSITE .. ":|r " .. tostring(self.website)) + end + if isGoodVariable(self.license) then + print(" - |cffffff7f" .. LICENSE .. ":|r " .. tostring(self.license)) + end +end + +local options +function AceAddon:GetAceOptionsDataTable(target) + if not options then + options = { + about = { + name = ABOUT, + desc = PRINT_ADDON_INFO, + type = "execute", + func = "PrintAddonInfo", + order = -1, + } + } + end + return options +end + +function AceAddon:PLAYER_LOGIN() + self.playerLoginFired = true + if self.addonsToOnEnable then + while #self.addonsToOnEnable > 0 do + local addon = table.remove(self.addonsToOnEnable, 1) + self.addonsStarted[addon] = true + if (type(addon.IsActive) ~= "function" or addon:IsActive()) and (not AceModuleCore or not AceModuleCore:IsModule(addon) or AceModuleCore:IsModuleActive(addon)) then + self.addonsEnabled[addon] = true + local current = addon.class + while true do + if current == AceOO.Class or not current then + break + end + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedEnable) == "function" then + safecall(mixin.OnEmbedEnable, mixin, addon, true) + end + end + end + current = current.super + end + if type(addon.OnEnable) == "function" then + safecall(addon.OnEnable, addon, true) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonEnabled", addon, true) + end + end + end + self.addonsToOnEnable = nil + end +end + +function AceAddon.prototype:Inject(t) + AceAddon:argCheck(t, 2, "table") + for k,v in pairs(t) do + self[k] = v + end +end + +function AceAddon.prototype:init() + if not AceEvent then + error(MAJOR_VERSION .. " requires AceEvent-2.0", 4) + end + AceAddon.super.prototype.init(self) + + self.super = self.class.prototype + + AceAddon:RegisterEvent("ADDON_LOADED", "ADDON_LOADED") + local names = {} + for i = 1, GetNumAddOns() do + if IsAddOnLoaded(i) then names[GetAddOnInfo(i)] = true end + end + self.possibleNames = names + table.insert(AceAddon.nextAddon, self) +end + +function AceAddon.prototype:ToString() + local x + if type(self.title) == "string" then + x = self.title + elseif type(self.name) == "string" then + x = self.name + else + x = "<" .. tostring(self.class) .. " instance>" + end + if (type(self.IsActive) == "function" and not self:IsActive()) or (AceModuleCore and AceModuleCore:IsModule(addon) and AceModuleCore:IsModuleActive(addon)) then + x = x .. " " .. STANDBY + end + return x +end + +AceAddon.new = function(self, ...) + local class = AceAddon:pcall(AceOO.Classpool, self, ...) + return class:new() +end + +local function external(self, major, instance) + if major == "AceEvent-2.0" then + AceEvent = instance + + AceEvent:embed(self) + + self:RegisterEvent("PLAYER_LOGIN", "PLAYER_LOGIN", true) + elseif major == "AceConsole-2.0" then + AceConsole = instance + + local slashCommands = { "/ace2" } + local _,_,_,enabled,loadable = GetAddOnInfo("Ace") + if not enabled or not loadable then + table.insert(slashCommands, "/ace") + end + local function listAddon(addon, depth) + if not depth then + depth = 0 + end + + local s = (" "):rep(depth) .. " - " .. tostring(addon) + if rawget(addon, 'version') then + s = s .. " - |cffffff7f" .. tostring(addon.version) .. "|r" + end + if rawget(addon, 'slashCommand') then + s = s .. " |cffffff7f(" .. tostring(addon.slashCommand) .. ")|r" + end + print(s) + if type(rawget(addon, 'modules')) == "table" then + local i = 0 + for k,v in pairs(addon.modules) do + i = i + 1 + if i == 6 then + print((" "):rep(depth + 1) .. " - more...") + break + else + listAddon(v, depth + 1) + end + end + end + end + local function listNormalAddon(i) + local name,_,_,enabled,loadable = GetAddOnInfo(i) + if not loadable then + enabled = false + end + if self.addons[name] then + listAddon(self.addons[name]) + else + local s = " - " .. tostring(GetAddOnMetadata(i, "Title") or name) + local version = GetAddOnMetadata(i, "Version") + if version then + if version:find("%$Revision: (%d+) %$") then + version = version:gsub("%$Revision: (%d+) %$", "%1") + elseif version:find("%$Rev: (%d+) %$") then + version = version:gsub("%$Rev: (%d+) %$", "%1") + elseif version:find("%$LastChangedRevision: (%d+) %$") then + version = version:gsub("%$LastChangedRevision: (%d+) %$", "%1") + end + s = s .. " - |cffffff7f" .. version .. "|r" + end + if not enabled then + s = s .. " |cffff0000(disabled)|r" + end + if IsAddOnLoadOnDemand(i) then + s = s .. " |cff00ff00[LoD]|r" + end + print(s) + end + end + local function mySort(alpha, bravo) + return tostring(alpha) < tostring(bravo) + end + AceConsole.RegisterChatCommand(self, slashCommands, { + desc = "AddOn development framework", + name = "Ace2", + type = "group", + args = { + about = { + desc = "Get information about Ace2", + name = "About", + type = "execute", + func = function() + print("|cffffff7fAce2|r - |cffffff7f2.0." .. MINOR_VERSION:gsub("%$Revision: (%d+) %$", "%1") .. "|r - AddOn development framework") + print(" - |cffffff7f" .. AUTHOR .. ":|r Ace Development Team") + print(" - |cffffff7f" .. WEBSITE .. ":|r http://www.wowace.com/") + end + }, + list = { + desc = "List addons", + name = "List", + type = "group", + args = { + ace2 = { + desc = "List addons using Ace2", + name = "Ace2", + type = "execute", + func = function() + print("|cffffff7fAddon list:|r") + table.sort(self.addons, mySort) + for _,v in ipairs(self.addons) do + listAddon(v) + end + end + }, + all = { + desc = "List all addons", + name = "All", + type = "execute", + func = function() + print("|cffffff7fAddon list:|r") + local count = GetNumAddOns() + for i = 1, count do + listNormalAddon(i) + end + end + }, + enabled = { + desc = "List all enabled addons", + name = "Enabled", + type = "execute", + func = function() + print("|cffffff7fAddon list:|r") + local count = GetNumAddOns() + for i = 1, count do + local _,_,_,enabled,loadable = GetAddOnInfo(i) + if enabled and loadable then + listNormalAddon(i) + end + end + end + }, + disabled = { + desc = "List all disabled addons", + name = "Disabled", + type = "execute", + func = function() + print("|cffffff7fAddon list:|r") + local count = GetNumAddOns() + for i = 1, count do + local _,_,_,enabled,loadable = GetAddOnInfo(i) + if not enabled or not loadable then + listNormalAddon(i) + end + end + end + }, + lod = { + desc = "List all LoadOnDemand addons", + name = "LoadOnDemand", + type = "execute", + func = function() + print("|cffffff7fAddon list:|r") + local count = GetNumAddOns() + for i = 1, count do + if IsAddOnLoadOnDemand(i) then + listNormalAddon(i) + end + end + end + }, + ace1 = { + desc = "List all addons using Ace1", + name = "Ace 1.x", + type = "execute", + func = function() + print("|cffffff7fAddon list:|r") + local count = GetNumAddOns() + for i = 1, count do + local dep1, dep2, dep3, dep4 = GetAddOnDependencies(i) + if dep1 == "Ace" or dep2 == "Ace" or dep3 == "Ace" or dep4 == "Ace" then + listNormalAddon(i) + end + end + end + }, + libs = { + desc = "List all libraries using AceLibrary", + name = "Libraries", + type = "execute", + func = function() + if type(AceLibrary) == "table" and type(AceLibrary.libs) == "table" then + print("|cffffff7fLibrary list:|r") + for name, data in pairs(AceLibrary.libs) do + local s + if data.minor then + s = " - " .. tostring(name) .. "." .. tostring(data.minor) + else + s = " - " .. tostring(name) + end + if rawget(AceLibrary(name), 'slashCommand') then + s = s .. " |cffffff7f(" .. tostring(AceLibrary(name).slashCommand) .. "|cffffff7f)" + end + print(s) + end + end + end + }, + search = { + desc = "Search by name", + name = "Search", + type = "text", + usage = "", + input = true, + get = false, + set = function(...) + local arg = { ... } + for i,v in ipairs(arg) do + arg[i] = v:gsub('%*', '.*'):gsub('%%', '%%%%'):lower() + end + local count = GetNumAddOns() + for i = 1, count do + local name = GetAddOnInfo(i) + local good = true + for _,v in ipairs(arg) do + if not name:lower():find(v) then + good = false + break + end + end + if good then + listNormalAddon(i) + end + end + end + } + }, + }, + enable = { + desc = "Enable addon", + name = "Enable", + type = "text", + usage = "", + get = false, + set = function(text) + local name,title,_,enabled,_,reason = GetAddOnInfo(text) + if reason == "MISSING" then + print(("|cffffff7fAce2:|r AddOn %q does not exist"):format(text)) + elseif not enabled then + EnableAddOn(text) + print(("|cffffff7fAce2:|r %s is now enabled"):format(title or name)) + else + print(("|cffffff7fAce2:|r %s is already enabled"):format(title or name)) + end + end, + }, + disable = { + desc = "Disable addon", + name = "Disable", + type = "text", + usage = "", + get = false, + set = function(text) + local name,title,_,enabled,_,reason = GetAddOnInfo(text) + if reason == "MISSING" then + print(("|cffffff7fAce2:|r AddOn %q does not exist"):format(text)) + elseif enabled then + DisableAddOn(text) + print(("|cffffff7fAce2:|r %s is now disabled"):format(title or name)) + else + print(("|cffffff7fAce2:|r %s is already disabled"):format(title or name)) + end + end, + }, + load = { + desc = "Load addon", + name = "Load", + type = "text", + usage = "", + get = false, + set = function(text) + local name,title,_,_,loadable,reason = GetAddOnInfo(text) + if reason == "MISSING" then + print(("|cffffff7fAce2:|r AddOn %q does not exist."):format(text)) + elseif not loadable then + print(("|cffffff7fAce2:|r AddOn %q is not loadable. Reason: %s"):format(text, reason)) + else + LoadAddOn(text) + print(("|cffffff7fAce2:|r %s is now loaded"):format(title or name)) + end + end + }, + info = { + desc = "Display information", + name = "Information", + type = "execute", + func = function() + local mem, threshold = gcinfo() + print((" - |cffffff7fMemory usage [|r%.3f MiB|cffffff7f]|r"):format(mem / 1024)) + if threshold then + print((" - |cffffff7fThreshold [|r%.3f MiB|cffffff7f]|r"):format(threshold / 1024)) + end + print((" - |cffffff7fFramerate [|r%.0f fps|cffffff7f]|r"):format(GetFramerate())) + local bandwidthIn, bandwidthOut, latency = GetNetStats() + bandwidthIn, bandwidthOut = floor(bandwidthIn * 1024), floor(bandwidthOut * 1024) + print((" - |cffffff7fLatency [|r%.0f ms|cffffff7f]|r"):format(latency)) + print((" - |cffffff7fBandwidth in [|r%.0f B/s|cffffff7f]|r"):format(bandwidthIn)) + print((" - |cffffff7fBandwidth out [|r%.0f B/s|cffffff7f]|r"):format(bandwidthOut)) + print((" - |cffffff7fTotal addons [|r%d|cffffff7f]|r"):format(GetNumAddOns())) + print((" - |cffffff7fAce2 addons [|r%d|cffffff7f]|r"):format(#self.addons)) + local ace = 0 + local enabled = 0 + local disabled = 0 + local lod = 0 + for i = 1, GetNumAddOns() do + local dep1, dep2, dep3, dep4 = GetAddOnDependencies(i) + if dep1 == "Ace" or dep2 == "Ace" or dep3 == "Ace" or dep4 == "Ace" then + ace = ace + 1 + end + if IsAddOnLoadOnDemand(i) then + lod = lod + 1 + end + local _,_,_,IsActive,loadable = GetAddOnInfo(i) + if not IsActive or not loadable then + disabled = disabled + 1 + else + enabled = enabled + 1 + end + end + print((" - |cffffff7fAce 1.x addons [|r%d|cffffff7f]|r"):format(ace)) + print((" - |cffffff7fLoadOnDemand addons [|r%d|cffffff7f]|r"):format(lod)) + print((" - |cffffff7fenabled addons [|r%d|cffffff7f]|r"):format(enabled)) + print((" - |cffffff7fdisabled addons [|r%d|cffffff7f]|r"):format(disabled)) + local libs = 0 + if type(AceLibrary) == "table" and type(AceLibrary.libs) == "table" then + for _ in pairs(AceLibrary.libs) do + libs = libs + 1 + end + end + print((" - |cffffff7fAceLibrary instances [|r%d|cffffff7f]|r"):format(libs)) + end + } + } + }) + elseif major == "AceModuleCore-2.0" then + AceModuleCore = instance + end +end + +local function activate(self, oldLib, oldDeactivate) + AceAddon = self + + self.playerLoginFired = oldLib and oldLib.playerLoginFired or DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage + self.addonsToOnEnable = oldLib and oldLib.addonsToOnEnable + self.addons = oldLib and oldLib.addons or {} + self.nextAddon = oldLib and oldLib.nextAddon or {} + self.skipAddon = oldLib and oldLib.skipAddon or {} + self.addonsStarted = oldLib and oldLib.addonsStarted or {} + self.addonsEnabled = oldLib and oldLib.addonsEnabled or {} + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(AceAddon, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) diff --git a/libs/AceDB-2.0/AceDB-2.0.lua b/libs/AceDB-2.0/AceDB-2.0.lua new file mode 100644 index 0000000..3bea2e9 --- /dev/null +++ b/libs/AceDB-2.0/AceDB-2.0.lua @@ -0,0 +1,1984 @@ +--[[ +Name: AceDB-2.0 +Revision: $Rev: 23704 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Ace 1.x by Turan (turan@gryphon.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceDB-2.0 +SVN: http://svn.wowace.com/root/trunk/Ace2/AceDB-2.0 +Description: Mixin to allow for fast, clean, and featureful saved variable + access. +Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0 +License: LGPL v2.1 +]] + +local MAJOR_VERSION = "AceDB-2.0" +local MINOR_VERSION = "$Revision: 23704 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end + +local function safecall(func,...) + local success, err = pcall(func,...) + if not success then geterrorhandler()(err) end +end + +local ACTIVE, ENABLED, STATE, TOGGLE_ACTIVE, MAP_ACTIVESUSPENDED, SET_PROFILE, SET_PROFILE_USAGE, PROFILE, PLAYER_OF_REALM, CHOOSE_PROFILE_DESC, CHOOSE_PROFILE_GUI, COPY_PROFILE_DESC, COPY_PROFILE_GUI, OTHER_PROFILE_DESC, OTHER_PROFILE_GUI, OTHER_PROFILE_USAGE, CHARACTER_COLON, REALM_COLON, CLASS_COLON, DEFAULT, ALTERNATIVE + +if GetLocale() == "deDE" then + ACTIVE = "Aktiv" + ENABLED = "Aktiviert" + STATE = "Status" + TOGGLE_ACTIVE = "Stoppt/Aktiviert dieses Addon." + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00Aktiv|r", [false] = "|cffff0000Gestoppt|r" } + SET_PROFILE = "Setzt das Profil f\195\188r dieses Addon." + SET_PROFILE_USAGE = "{Charakter || Klasse || Realm || }" + PROFILE = "Profil" + PLAYER_OF_REALM = "%s von %s" + CHOOSE_PROFILE_DESC = "W\195\164hle ein Profil." + CHOOSE_PROFILE_GUI = "W\195\164hle" + COPY_PROFILE_DESC = "Kopiert Einstellungen von einem anderem Profil." + COPY_PROFILE_GUI = "Kopiere von" + OTHER_PROFILE_DESC = "W\195\164hle ein anderes Profil." + OTHER_PROFILE_GUI = "Anderes" + OTHER_PROFILE_USAGE = "" + + CHARACTER_COLON = "Charakter: " + REALM_COLON = "Realm: " + CLASS_COLON = "Klasse: " + + DEFAULT = "Default" -- fix + ALTERNATIVE = "Alternative" -- fix +elseif GetLocale() == "frFR" then + ACTIVE = "Actif" + ENABLED = "Activ\195\169" + STATE = "Etat" + TOGGLE_ACTIVE = "Suspend/active cet addon." + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00Actif|r", [false] = "|cffff0000Suspendu|r" } + SET_PROFILE = "S\195\169lectionne le profil pour cet addon." + SET_PROFILE_USAGE = "{perso || classe || royaume || }" + PROFILE = "Profil" + PLAYER_OF_REALM = "%s de %s" + CHOOSE_PROFILE_DESC = "Choisissez un profil." + CHOOSE_PROFILE_GUI = "Choix" + COPY_PROFILE_DESC = "Copier les param\195\168tres d'un autre profil." + COPY_PROFILE_GUI = "Copier \195\160 partir de" + OTHER_PROFILE_DESC = "Choisissez un autre profil." + OTHER_PROFILE_GUI = "Autre" + OTHER_PROFILE_USAGE = "" + + CHARACTER_COLON = "Personnage: " + REALM_COLON = "Royaume: " + CLASS_COLON = "Classe: " + + DEFAULT = "Default" -- fix + ALTERNATIVE = "Alternative" -- fix +elseif GetLocale() == "koKR" then + ACTIVE = "활성화" + ENABLED = "활성화" + STATE = "상태" + TOGGLE_ACTIVE = "이 애드온 중지/계속 실행" + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00활성화|r", [false] = "|cffff0000중지됨|r" } + SET_PROFILE = "이 애드온에 프로필 설정" + SET_PROFILE_USAGE = "{캐릭터명 || 직업 || 서버명 || <프로필명>}" + PROFILE = "프로필" + PLAYER_OF_REALM = "%s (%s 서버)" + CHOOSE_PROFILE_DESC = "프로파일을 선택합니다." + CHOOSE_PROFILE_GUI = "선택" + COPY_PROFILE_DESC = "다른 프로파일에서 설정을 복사합니다." + COPY_PROFILE_GUI = "복사" + OTHER_PROFILE_DESC = "다른 프로파일을 선택합니다." + OTHER_PROFILE_GUI = "기타" + OTHER_PROFILE_USAGE = "<프로파일명>" + + CHARACTER_COLON = "캐릭터: " + REALM_COLON = "서버: " + CLASS_COLON = "직업: " + + DEFAULT = "Default" -- fix + ALTERNATIVE = "Alternative" -- fix +elseif GetLocale() == "zhTW" then + ACTIVE = "啟動" + ENABLED = "啟用" + STATE = "狀態" + TOGGLE_ACTIVE = "暫停/重啟這個插件。" + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00啟動|r", [false] = "|cffff0000已暫停|r" } + SET_PROFILE = "設定這插件的記錄檔。" + SET_PROFILE_USAGE = "{角色 || 聯業 || 伺服器 || <記錄檔名稱>}" + PROFILE = "記錄檔" + PLAYER_OF_REALM = "%s 於 %s" + CHOOSE_PROFILE_DESC = "選擇一個記錄檔" + CHOOSE_PROFILE_GUI = "選擇" + COPY_PROFILE_DESC = "由其他記錄檔複製設定。" + COPY_PROFILE_GUI = "複製由" + OTHER_PROFILE_DESC = "選擇其他記錄檔。" + OTHER_PROFILE_GUI = "其他" + OTHER_PROFILE_USAGE = "<記錄檔名稱>" + + CHARACTER_COLON = "角色:" + REALM_COLON = "伺服器:" + CLASS_COLON = "聯業:" + + DEFAULT = "Default" -- fix + ALTERNATIVE = "Alternative" -- fix +elseif GetLocale() == "zhCN" then + ACTIVE = "\230\156\137\230\149\136" + ENABLED = "\229\144\175\231\148\168" + STATE = "\231\138\182\230\128\129" + TOGGLE_ACTIVE = "\230\154\130\229\129\156/\230\129\162\229\164\141 \230\173\164\230\143\146\228\187\182." + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00\230\156\137\230\149\136|r", [false] = "|cffff0000\230\154\130\229\129\156|r" } + SET_PROFILE = "\232\174\190\231\189\174\233\133\141\231\189\174\230\150\135\228\187\182\228\184\186\232\191\153\230\143\146\228\187\182." + SET_PROFILE_USAGE = "{\229\173\151\231\172\166 || \233\128\137\228\187\182\231\177\187 || \229\159\159 || <\233\133\141\231\189\174\230\150\135\228\187\182\229\144\141\229\173\151>}" + PROFILE = "\233\133\141\231\189\174\230\150\135\228\187\182" + PLAYER_OF_REALM = "%s \231\154\132 %s" + CHOOSE_PROFILE_DESC = "\233\128\137\230\139\169\233\133\141\231\189\174\230\150\135\228\187\182." + CHOOSE_PROFILE_GUI = "\233\128\137\230\139\169" + COPY_PROFILE_DESC = "\229\164\141\229\136\182\232\174\190\231\189\174\228\187\142\229\143\166\228\184\128\228\184\170\233\133\141\231\189\174\230\150\135\228\187\182." + COPY_PROFILE_GUI = "\229\164\141\229\136\182\228\187\142" + OTHER_PROFILE_DESC = "\233\128\137\230\139\169\229\143\166\228\184\128\228\184\170\233\133\141\231\189\174\230\150\135\228\187\182." + OTHER_PROFILE_GUI = "\229\133\182\228\187\150" + OTHER_PROFILE_USAGE = "<\233\133\141\231\189\174\230\150\135\228\187\182\229\144\141\229\173\151>" + + CHARACTER_COLON = "\229\173\151\231\172\166: " + REALM_COLON = "\229\159\159: " + CLASS_COLON = "\233\128\137\228\187\182\231\177\187: " + + DEFAULT = "Default" -- fix + ALTERNATIVE = "Alternative" -- fix +elseif GetLocale() == "esES" then + ACTIVE = "Activo" + ENABLED = "Activado" + STATE = "Estado" + TOGGLE_ACTIVE = "Parar/Continuar este accesorio" + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00Activo|r", [false] = "|cffff0000Parado|r" } + SET_PROFILE = "Selecciona el perfil para este accesorio." + SET_PROFILE_USAGE = "{perso || clase || reino || }" + PROFILE = "Perfil" + PLAYER_OF_REALM = "%s de %s" + CHOOSE_PROFILE_DESC = "Elige un perfil." + CHOOSE_PROFILE_GUI = "Elige" + COPY_PROFILE_DESC = "Copiar de un perfil a otro" + COPY_PROFILE_GUI = "Copiar desde" + OTHER_PROFILE_DESC = "Elige otro perfil." + OTHER_PROFILE_GUI = "Otro" + OTHER_PROFILE_USAGE = "" + + CHARACTER_COLON = "Personaje: " + REALM_COLON = "Reino: " + CLASS_COLON = "Clase: " + + DEFAULT = "Por defecto" + ALTERNATIVE = "Alternativo" +else -- enUS + ACTIVE = "Active" + ENABLED = "Enabled" + STATE = "State" + TOGGLE_ACTIVE = "Suspend/resume this addon." + MAP_ACTIVESUSPENDED = { [true] = "|cff00ff00Active|r", [false] = "|cffff0000Suspended|r" } + SET_PROFILE = "Set profile for this addon." + SET_PROFILE_USAGE = "{char || class || realm || }" + PROFILE = "Profile" + PLAYER_OF_REALM = "%s of %s" + CHOOSE_PROFILE_DESC = "Choose a profile." + CHOOSE_PROFILE_GUI = "Choose" + COPY_PROFILE_DESC = "Copy settings from another profile." + COPY_PROFILE_GUI = "Copy from" + OTHER_PROFILE_DESC = "Choose another profile." + OTHER_PROFILE_GUI = "Other" + OTHER_PROFILE_USAGE = "" + + CHARACTER_COLON = "Character: " + REALM_COLON = "Realm: " + CLASS_COLON = "Class: " + + DEFAULT = "Default" + ALTERNATIVE = "Alternative" +end +local convertFromOldCharID +do + local matchStr = "^" .. PLAYER_OF_REALM:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1"):gsub("%%s", "(.+)") .. "$" + function convertFromOldCharID(str) + local player, realm = str:match(matchStr) + if not player then + return str + end + return player .. " - " .. realm + end +end + +local AceOO = AceLibrary("AceOO-2.0") +local AceEvent +local Mixin = AceOO.Mixin +local AceDB = Mixin { + "RegisterDB", + "RegisterDefaults", + "ResetDB", + "SetProfile", + "GetProfile", + "CopyProfileFrom", + "ToggleActive", + "IsActive", + "AcquireDBNamespace", + } +local Dewdrop = AceLibrary:HasInstance("Dewdrop-2.0") and AceLibrary("Dewdrop-2.0") + +local _G = getfenv(0) + +local function inheritDefaults(t, defaults) + if not defaults then + return t + end + for k,v in pairs(defaults) do + if k == "*" then + local v = v + if type(v) == "table" then + setmetatable(t, { + __index = function(self, key) + if key == nil then + return nil + end + self[key] = {} + inheritDefaults(self[key], v) + return self[key] + end + } ) + else + setmetatable(t, { + __index = function(self, key) + if key == nil then + return nil + end + self[key] = v + return self[key] + end + } ) + end + for key in pairs(t) do + if (defaults[key] == nil or key == "*") and type(t[key]) == "table" then + inheritDefaults(t[key], v) + end + end + else + if type(v) == "table" then + if type(t[k]) ~= "table" then + t[k] = {} + end + inheritDefaults(t[k], v) + elseif t[k] == nil then + t[k] = v + end + end + end + return t +end + +local _,race = UnitRace("player") +local faction +if race == "Orc" or race == "Scourge" or race == "Troll" or race == "Tauren" or race == "BloodElf" then + faction = FACTION_HORDE +else + faction = FACTION_ALLIANCE +end +local server = GetRealmName():trim() +local charID = UnitName("player") .. " - " .. server +local realmID = server .. " - " .. faction +local classID = UnitClass("player") + +AceDB.CHAR_ID = charID +AceDB.REALM_ID = realmID +AceDB.CLASS_ID = classID + +AceDB.FACTION = faction +AceDB.REALM = server +AceDB.NAME = UnitName("player") + +local new, del +do + local list = setmetatable({}, {__mode="k"}) + function new() + local t = next(list) + if t then + list[t] = nil + return t + else + return {} + end + end + + function del(t) + setmetatable(t, nil) + for k in pairs(t) do + t[k] = nil + end + list[t] = true + end +end + +local caseInsensitive_mt = { + __index = function(self, key) + if type(key) ~= "string" then + return nil + end + local lowerKey = key:lower() + for k,v in pairs(self) do + if k:lower() == lowerKey then + return self[k] + end + end + end, + __newindex = function(self, key, value) + if type(key) ~= "string" then + return error("table index is nil", 2) + end + local lowerKey = key:lower() + for k in pairs(self) do + if k:lower() == lowerKey then + rawset(self, k, nil) + rawset(self, key, value) + return + end + end + rawset(self, key, value) + end +} + +local db_mt = { __index = function(db, key) + if key == "char" then + if db.charName then + if type(_G[db.charName]) ~= "table" then + _G[db.charName] = {} + end + if type(_G[db.charName].global) ~= "table" then + _G[db.charName].global = {} + end + rawset(db, 'char', _G[db.charName].global) + else + if type(db.raw.chars) ~= "table" then + db.raw.chars = {} + end + local id = charID + if type(db.raw.chars[id]) ~= "table" then + db.raw.chars[id] = {} + end + rawset(db, 'char', db.raw.chars[id]) + end + if db.defaults and db.defaults.char then + inheritDefaults(db.char, db.defaults.char) + end + return db.char + elseif key == "realm" then + if type(db.raw.realms) ~= "table" then + db.raw.realms = {} + end + local id = realmID + if type(db.raw.realms[id]) ~= "table" then + db.raw.realms[id] = {} + end + rawset(db, 'realm', db.raw.realms[id]) + if db.defaults and db.defaults.realm then + inheritDefaults(db.realm, db.defaults.realm) + end + return db.realm + elseif key == "server" then + if type(db.raw.servers) ~= "table" then + db.raw.servers = {} + end + local id = server + if type(db.raw.servers[id]) ~= "table" then + db.raw.servers[id] = {} + end + rawset(db, 'server', db.raw.servers[id]) + if db.defaults and db.defaults.server then + inheritDefaults(db.server, db.defaults.server) + end + return db.server + elseif key == "account" then + if type(db.raw.account) ~= "table" then + db.raw.account = {} + end + rawset(db, 'account', db.raw.account) + if db.defaults and db.defaults.account then + inheritDefaults(db.account, db.defaults.account) + end + return db.account + elseif key == "faction" then + if type(db.raw.factions) ~= "table" then + db.raw.factions = {} + end + local id = faction + if type(db.raw.factions[id]) ~= "table" then + db.raw.factions[id] = {} + end + rawset(db, 'faction', db.raw.factions[id]) + if db.defaults and db.defaults.faction then + inheritDefaults(db.faction, db.defaults.faction) + end + return db.faction + elseif key == "class" then + if type(db.raw.classes) ~= "table" then + db.raw.classes = {} + end + local id = classID + if type(db.raw.classes[id]) ~= "table" then + db.raw.classes[id] = {} + end + rawset(db, 'class', db.raw.classes[id]) + if db.defaults and db.defaults.class then + inheritDefaults(db.class, db.defaults.class) + end + return db.class + elseif key == "profile" then + if type(db.raw.profiles) ~= "table" then + db.raw.profiles = setmetatable({}, caseInsensitive_mt) + else + setmetatable(db.raw.profiles, caseInsensitive_mt) + end + local id = db.raw.currentProfile[charID] + if id == "char" then + id = "char/" .. charID + elseif id == "class" then + id = "class/" .. classID + elseif id == "realm" then + id = "realm/" .. realmID + end + if type(db.raw.profiles[id]) ~= "table" then + db.raw.profiles[id] = {} + end + rawset(db, 'profile', db.raw.profiles[id]) + if db.defaults and db.defaults.profile then + inheritDefaults(db.profile, db.defaults.profile) + end + return db.profile + elseif key == "raw" or key == "defaults" or key == "name" or key == "charName" or key == "namespaces" then + return nil + end + error(("Cannot access key %q in db table. You may want to use db.profile[%q]"):format(tostring(key), tostring(key)), 2) +end, __newindex = function(db, key, value) + error(("Cannot access key %q in db table. You may want to use db.profile[%q]"):format(tostring(key), tostring(key)), 2) +end } + +local function RecalculateAceDBCopyFromList(target) + local db = target.db + local t = target['acedb-profile-copylist'] + for k,v in pairs(t) do + t[k] = nil + end + local _,currentProfile = AceDB.GetProfile(target) + if db and db.raw then + if db.raw.profiles then + for k in pairs(db.raw.profiles) do + if currentProfile ~= k then + if k:find("^char/") then + local name = k:sub(6) + local player, realm = name:match("^(.*) %- (.*)$") + if player then + name = PLAYER_OF_REALM:format(player, realm) + end + t[k] = CHARACTER_COLON .. name + elseif k:find("^realm/") then + local name = k:sub(7) + t[k] = REALM_COLON .. name + elseif k:find("^class/") then + local name = k:sub(7) + t[k] = CLASS_COLON .. name + else + t[k] = k + end + end + end + end + if db.raw.namespaces then + for _,n in pairs(db.raw.namespaces) do + if n.profiles then + for k in pairs(n.profiles) do + if currentProfile ~= k then + if k:find('^char/') then + local name = k:sub(6) + local player, realm = name:match("^(.*) %- (.*)$") + if player then + name = PLAYER_OF_REALM:format(player, realm) + end + t[k] = CHARACTER_COLON .. name + elseif k:find('^realm/') then + local name = k:sub(7) + t[k] = REALM_COLON .. name + elseif k:find('^class/') then + local name = k:sub(7) + t[k] = CLASS_COLON .. name + else + t[k] = k + end + end + end + end + end + end + end + if t.Default then + t.Default = DEFAULT + end + if t.Alternative then + t.Alternative = ALTERNATIVE + end +end + +local function RecalculateAceDBProfileList(target) + local t = target['acedb-profile-list'] + for k,v in pairs(t) do + t[k] = nil + end + t.char = CHARACTER_COLON .. PLAYER_OF_REALM:format(UnitName("player"), server) + t.realm = REALM_COLON .. realmID + t.class = CLASS_COLON .. classID + t.Default = DEFAULT + local db = target.db + if db and db.raw then + if db.raw.profiles then + for k in pairs(db.raw.profiles) do + if not k:find("^char/") and not k:find("^realm/") and not k:find("^class/") then + t[k] = k + end + end + end + if db.raw.namespaces then + for _,n in pairs(db.raw.namespaces) do + if n.profiles then + for k in pairs(n.profiles) do + if not k:find("^char/") and not k:find("^realm/") and not k:find("^class/") then + t[k] = k + end + end + end + end + end + local curr = db.raw.currentProfile and db.raw.currentProfile[charID] + if curr and not t[curr] then + t[curr] = curr + end + end + if t.Alternative then + t.Alternative = ALTERNATIVE + end +end + +local CrawlForSerialization +local CrawlForDeserialization + +local function SerializeObject(o) + local t = { o:Serialize() } + CrawlForSerialization(t) + t[0] = o.class:GetLibraryVersion() + return t +end + +local function DeserializeObject(t) + CrawlForDeserialization(t) + local className = t[0] + t[0] = nil + return AceLibrary(className):Deserialize(unpack(t)) +end + +local function IsSerializable(t) + return AceOO.inherits(t, AceOO.Class) and t.class and type(t.class.Deserialize) == "function" and type(t.Serialize) == "function" and type(t.class.GetLibraryVersion) == "function" +end + +function CrawlForSerialization(t) + local tmp = new() + for k,v in pairs(t) do + tmp[k] = v + end + for k,v in pairs(tmp) do + if type(v) == "table" and type(rawget(v, 0)) ~= "userdata" then + if IsSerializable(v) then + v = SerializeObject(v) + t[k] = v + else + CrawlForSerialization(v) + end + end + if type(k) == "table" and type(rawget(k, 0)) ~= "userdata" then + if IsSerializable(k) then + t[k] = nil + t[SerializeObject(k)] = v + else + CrawlForSerialization(k) + end + end + tmp[k] = nil + k = nil + end + tmp = del(tmp) +end + +local function IsDeserializable(t) + return type(rawget(t, 0)) == "string" and AceLibrary:HasInstance(rawget(t, 0)) +end + +function CrawlForDeserialization(t) + local tmp = new() + for k,v in pairs(t) do + tmp[k] = v + end + for k,v in pairs(tmp) do + if type(v) == "table" then + if IsDeserializable(v) then + t[k] = DeserializeObject(v) + del(v) + v = t[k] + elseif type(rawget(v, 0)) ~= "userdata" then + CrawlForDeserialization(v) + end + end + if type(k) == "table" then + if IsDeserializable(k) then + t[k] = nil + t[DeserializeObject(k)] = v + del(k) + elseif type(rawget(k, 0)) ~= "userdata" then + CrawlForDeserialization(k) + end + end + tmp[k] = nil + k = nil + end + tmp = del(tmp) +end + +local namespace_mt = { __index = function(namespace, key) + local db = namespace.db + local name = namespace.name + if key == "char" then + if db.charName then + if type(_G[db.charName]) ~= "table" then + _G[db.charName] = {} + end + if type(_G[db.charName].namespaces) ~= "table" then + _G[db.charName].namespaces = {} + end + if type(_G[db.charName].namespaces[name]) ~= "table" then + _G[db.charName].namespaces[name] = {} + end + rawset(namespace, 'char', _G[db.charName].namespaces[name]) + else + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].chars) ~= "table" then + db.raw.namespaces[name].chars = {} + end + local id = charID + if type(db.raw.namespaces[name].chars[id]) ~= "table" then + db.raw.namespaces[name].chars[id] = {} + end + rawset(namespace, 'char', db.raw.namespaces[name].chars[id]) + end + if namespace.defaults and namespace.defaults.char then + inheritDefaults(namespace.char, namespace.defaults.char) + end + return namespace.char + elseif key == "realm" then + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].realms) ~= "table" then + db.raw.namespaces[name].realms = {} + end + local id = realmID + if type(db.raw.namespaces[name].realms[id]) ~= "table" then + db.raw.namespaces[name].realms[id] = {} + end + rawset(namespace, 'realm', db.raw.namespaces[name].realms[id]) + if namespace.defaults and namespace.defaults.realm then + inheritDefaults(namespace.realm, namespace.defaults.realm) + end + return namespace.realm + elseif key == "server" then + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].servers) ~= "table" then + db.raw.namespaces[name].servers = {} + end + local id = server + if type(db.raw.namespaces[name].servers[id]) ~= "table" then + db.raw.namespaces[name].servers[id] = {} + end + rawset(namespace, 'server', db.raw.namespaces[name].servers[id]) + if namespace.defaults and namespace.defaults.server then + inheritDefaults(namespace.server, namespace.defaults.server) + end + return namespace.server + elseif key == "account" then + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].account) ~= "table" then + db.raw.namespaces[name].account = {} + end + rawset(namespace, 'account', db.raw.namespaces[name].account) + if namespace.defaults and namespace.defaults.account then + inheritDefaults(namespace.account, namespace.defaults.account) + end + return namespace.account + elseif key == "faction" then + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].factions) ~= "table" then + db.raw.namespaces[name].factions = {} + end + local id = faction + if type(db.raw.namespaces[name].factions[id]) ~= "table" then + db.raw.namespaces[name].factions[id] = {} + end + rawset(namespace, 'faction', db.raw.namespaces[name].factions[id]) + if namespace.defaults and namespace.defaults.faction then + inheritDefaults(namespace.faction, namespace.defaults.faction) + end + return namespace.faction + elseif key == "class" then + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].classes) ~= "table" then + db.raw.namespaces[name].classes = {} + end + local id = classID + if type(db.raw.namespaces[name].classes[id]) ~= "table" then + db.raw.namespaces[name].classes[id] = {} + end + rawset(namespace, 'class', db.raw.namespaces[name].classes[id]) + if namespace.defaults and namespace.defaults.class then + inheritDefaults(namespace.class, namespace.defaults.class) + end + return namespace.class + elseif key == "profile" then + if type(db.raw.namespaces) ~= "table" then + db.raw.namespaces = {} + end + if type(db.raw.namespaces[name]) ~= "table" then + db.raw.namespaces[name] = {} + end + if type(db.raw.namespaces[name].profiles) ~= "table" then + db.raw.namespaces[name].profiles = setmetatable({}, caseInsensitive_mt) + else + setmetatable(db.raw.namespaces[name].profiles, caseInsensitive_mt) + end + local id = db.raw.currentProfile[charID] + if id == "char" then + id = "char/" .. charID + elseif id == "class" then + id = "class/" .. classID + elseif id == "realm" then + id = "realm/" .. realmID + end + if type(db.raw.namespaces[name].profiles[id]) ~= "table" then + db.raw.namespaces[name].profiles[id] = {} + end + rawset(namespace, 'profile', db.raw.namespaces[name].profiles[id]) + if namespace.defaults and namespace.defaults.profile then + inheritDefaults(namespace.profile, namespace.defaults.profile) + end + return namespace.profile + elseif key == "defaults" or key == "name" or key == "db" then + return nil + end + error(("Cannot access key %q in db table. You may want to use db.profile[%q]"):format(tostring(key), tostring(key)), 2) +end, __newindex = function(db, key, value) + error(("Cannot access key %q in db table. You may want to use db.profile[%q]"):format(tostring(key), tostring(key)), 2) +end } + +local tmp = {} +function AceDB:InitializeDB(addonName) + local db = self.db + + if not db then + if addonName then + AceDB.addonsLoaded[addonName] = true + end + return + end + + if db.raw then + -- someone manually initialized + return + end + + if type(_G[db.name]) ~= "table" then + _G[db.name] = {} + else + CrawlForDeserialization(_G[db.name]) + end + if type(_G[db.charName]) == "table" then + CrawlForDeserialization(_G[db.charName]) + end + rawset(db, 'raw', _G[db.name]) + if not db.raw.currentProfile then + db.raw.currentProfile = {} + else + for k,v in pairs(db.raw.currentProfile) do + tmp[convertFromOldCharID(k)] = v + db.raw.currentProfile[k] = nil + end + for k,v in pairs(tmp) do + db.raw.currentProfile[k] = v + tmp[k] = nil + end + end + if not db.raw.currentProfile[charID] then + db.raw.currentProfile[charID] = "Default" + end + if db.raw.profiles then + for k,v in pairs(db.raw.profiles) do + local new_k = k + if k:find("^char/") then + new_k = "char/" .. convertFromOldCharID(k:sub(6)) + end + tmp[new_k] = v + db.raw.profiles[k] = nil + end + for k,v in pairs(tmp) do + db.raw.profiles[k] = v + tmp[k] = nil + end + end + if db.raw.disabledModules then -- AceModuleCore-2.0 + for k,v in pairs(db.raw.disabledModules) do + local new_k = k + if k:find("^char/") then + new_k = "char/" .. convertFromOldCharID(k:sub(6)) + end + tmp[new_k] = v + db.raw.disabledModules[k] = nil + end + for k,v in pairs(tmp) do + db.raw.disabledModules[k] = v + tmp[k] = nil + end + end + if db.raw.chars then + for k,v in pairs(db.raw.chars) do + tmp[convertFromOldCharID(k)] = v + db.raw.chars[k] = nil + end + for k,v in pairs(tmp) do + db.raw.chars[k] = v + tmp[k] = nil + end + end + if db.raw.namespaces then + for l,u in pairs(db.raw.namespaces) do + if u.chars then + for k,v in pairs(u.chars) do + tmp[convertFromOldCharID(k)] = v + u.chars[k] = nil + end + for k,v in pairs(tmp) do + u.chars[k] = v + tmp[k] = nil + end + end + end + end + if db.raw.disabled then + setmetatable(db.raw.disabled, caseInsensitive_mt) + end + if self['acedb-profile-copylist'] then + RecalculateAceDBCopyFromList(self) + end + if self['acedb-profile-list'] then + RecalculateAceDBProfileList(self) + end + setmetatable(db, db_mt) +end + +function AceDB:OnEmbedInitialize(target, name) + if name then + self:ADDON_LOADED(name) + end + self.InitializeDB(target, name) +end + +function AceDB:RegisterDB(name, charName) + AceDB:argCheck(name, 2, "string") + AceDB:argCheck(charName, 3, "string", "nil") + if self.db then + AceDB:error("Cannot call \"RegisterDB\" if self.db is set.") + end + local stack = debugstack() + local addonName = stack:gsub(".-\n.-\\AddOns\\(.-)\\.*", "%1") + self.db = { + name = name, + charName = charName + } + if AceDB.addonsLoaded[addonName] then + AceDB.InitializeDB(self, addonName) + else + AceDB.addonsToBeInitialized[self] = addonName + end + AceDB.registry[self] = true +end + +function AceDB:RegisterDefaults(kind, defaults, a3) + local name + if a3 then + name, kind, defaults = kind, defaults, a3 + AceDB:argCheck(name, 2, "string") + AceDB:argCheck(kind, 3, "string") + AceDB:argCheck(defaults, 4, "table") + else + AceDB:argCheck(kind, 2, "string") + AceDB:argCheck(defaults, 3, "table") + end + if kind ~= "char" and kind ~= "class" and kind ~= "profile" and kind ~= "account" and kind ~= "realm" and kind ~= "faction" and kind ~= "server" then + AceDB:error("Bad argument #%d to `RegisterDefaults' (\"char\", \"class\", \"profile\", \"account\", \"realm\", \"server\", or \"faction\" expected, got %q)", a3 and 3 or 2, kind) + end + if type(self.db) ~= "table" or type(self.db.name) ~= "string" then + AceDB:error("Cannot call \"RegisterDefaults\" unless \"RegisterDB\" has been previously called.") + end + local db + if name then + local namespace = self:AcquireDBNamespace(name) + if namespace.defaults and namespace.defaults[kind] then + AceDB:error("\"RegisterDefaults\" has already been called for %q::%q.", name, kind) + end + db = namespace + else + if self.db.defaults and self.db.defaults[kind] then + AceDB:error("\"RegisterDefaults\" has already been called for %q.", kind) + end + db = self.db + end + if not db.defaults then + rawset(db, 'defaults', {}) + end + db.defaults[kind] = defaults + if rawget(db, kind) then + inheritDefaults(db[kind], defaults) + end +end + +function AceDB:ResetDB(kind, a2) + local name + if a2 then + name, kind = kind, a2 + AceDB:argCheck(name, 2, "nil", "string") + AceDB:argCheck(kind, 3, "nil", "string") + else + AceDB:argCheck(kind, 2, "nil", "string") + if kind ~= "char" and kind ~= "class" and kind ~= "profile" and kind ~= "account" and kind ~= "realm" and kind ~= "faction" and kind ~= "server" then + name, kind = kind, nil + end + end + if not self.db or not self.db.raw then + AceDB:error("Cannot call \"ResetDB\" before \"RegisterDB\" has been called and before \"ADDON_LOADED\" has been fired.") + end + local db = self.db + if not kind then + if not name then + if db.charName then + _G[db.charName] = nil + end + _G[db.name] = nil + rawset(db, 'raw', nil) + AceDB.InitializeDB(self) + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'account', nil) + rawset(v, 'char', nil) + rawset(v, 'class', nil) + rawset(v, 'profile', nil) + rawset(v, 'realm', nil) + rawset(v, 'server', nil) + rawset(v, 'faction', nil) + end + end + else + if db.raw.namespaces then + db.raw.namespaces[name] = nil + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'account', nil) + rawset(v, 'char', nil) + rawset(v, 'class', nil) + rawset(v, 'profile', nil) + rawset(v, 'realm', nil) + rawset(v, 'server', nil) + rawset(v, 'faction', nil) + end + end + end + elseif kind == "account" then + if name then + db.raw.account = nil + rawset(db, 'account', nil) + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + v.account = nil + end + end + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'account', nil) + end + end + else + if db.raw.namespaces and db.raw.namespaces[name] then + db.raw.namespaces[name].account = nil + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'account', nil) + end + end + end + elseif kind == "char" then + if name then + if db.charName then + _G[db.charName] = nil + else + if db.raw.chars then + db.raw.chars[charID] = nil + end + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + if v.chars then + v.chars[charID] = nil + end + end + end + end + rawset(db, 'char', nil) + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'char', nil) + end + end + else + if db.charName then + local x = _G[db.charName] + if x.namespaces then + x.namespaces[name] = nil + end + else + if db.raw.namespaces then + local v = db.namespaces[name] + if v and v.chars then + v.chars[charID] = nil + end + end + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'char', nil) + end + end + end + elseif kind == "realm" then + if not name then + if db.raw.realms then + db.raw.realms[realmID] = nil + end + rawset(db, 'realm', nil) + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + if v.realms then + v.realms[realmID] = nil + end + end + end + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'realm', nil) + end + end + else + if db.raw.namespaces then + local v = db.raw.namespaces[name] + if v and v.realms then + v.realms[realmID] = nil + end + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'realm', nil) + end + end + end + elseif kind == "server" then + if not name then + if db.raw.servers then + db.raw.servers[server] = nil + end + rawset(db, 'server', nil) + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + if v.servers then + v.servers[server] = nil + end + end + end + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'server', nil) + end + end + else + if db.raw.namespaces then + local v = db.raw.namespaces[name] + if v and v.servers then + v.servers[server] = nil + end + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'server', nil) + end + end + end + elseif kind == "faction" then + if not name then + if db.raw.factions then + db.raw.factions[faction] = nil + end + rawset(db, 'faction', nil) + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + if v.factions then + v.factions[faction] = nil + end + end + end + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'faction', nil) + end + end + else + if db.raw.namespaces then + local v = db.raw.namespaces[name] + if v and v.factions then + v.factions[faction] = nil + end + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'faction', nil) + end + end + end + elseif kind == "class" then + if not name then + if db.raw.realms then + db.raw.realms[classID] = nil + end + rawset(db, 'class', nil) + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + if v.classes then + v.classes[classID] = nil + end + end + end + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'class', nil) + end + end + else + if db.raw.namespaces then + local v = db.raw.namespaces[name] + if v and v.classes then + v.classes[classID] = nil + end + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'class', nil) + end + end + end + elseif kind == "profile" then + local id = db.raw.currentProfile and db.raw.currentProfile[charID] or "Default" + if id == "char" then + id = "char/" .. charID + elseif id == "class" then + id = "class/" .. classID + elseif id == "realm" then + id = "realm/" .. realmID + end + if not name then + if db.raw.profiles then + db.raw.profiles[id] = nil + end + rawset(db, 'profile', nil) + if db.raw.namespaces then + for name,v in pairs(db.raw.namespaces) do + if v.profiles then + v.profiles[id] = nil + end + end + end + if db.namespaces then + for name,v in pairs(db.namespaces) do + rawset(v, 'profile', nil) + end + end + else + if db.raw.namespaces then + local v = db.raw.namespaces[name] + if v and v.profiles then + v.profiles[id] = nil + end + end + if db.namespaces then + local v = db.namespaces[name] + if v then + rawset(v, 'profile', nil) + end + end + end + end +end + +local function cleanDefaults(t, defaults) + if defaults then + for k,v in pairs(defaults) do + if k == "*" then + if type(v) == "table" then + for k in pairs(t) do + if (defaults[k] == nil or k == "*") and type(t[k]) == "table" then + if cleanDefaults(t[k], v) then + t[k] = nil + end + end + end + else + for k in pairs(t) do + if (defaults[k] == nil or k == "*") and t[k] == v then + t[k] = nil + end + end + end + else + if type(v) == "table" then + if type(t[k]) == "table" then + if cleanDefaults(t[k], v) then + t[k] = nil + end + end + elseif t[k] == v then + t[k] = nil + end + end + end + end + return t and not next(t) +end + +function AceDB:GetProfile() + if not self.db or not self.db.raw then + return nil + end + if not self.db.raw.currentProfile then + self.db.raw.currentProfile = {} + end + if not self.db.raw.currentProfile[charID] then + self.db.raw.currentProfile[charID] = "Default" + end + local profile = self.db.raw.currentProfile[charID] + if profile == "char" then + return "char", "char/" .. charID + elseif profile == "class" then + return "class", "class/" .. classID + elseif profile == "realm" then + return "realm", "realm/" .. realmID + end + return profile, profile +end + +local function copyTable(to, from) + setmetatable(to, nil) + for k,v in pairs(from) do + if type(k) == "table" then + k = copyTable({}, k) + end + if type(v) == "table" then + v = copyTable({}, v) + end + to[k] = v + end + setmetatable(to, from) + return to +end + +function AceDB:SetProfile(name) + AceDB:argCheck(name, 2, "string") + if not self.db or not self.db.raw then + AceDB:error("Cannot call \"SetProfile\" before \"RegisterDB\" has been called and before \"ADDON_LOADED\" has been fired.") + end + local db = self.db + local lowerName = name:lower() + if lowerName:find("^char/") or lowerName:find("^realm/") or lowerName:find("^class/") then + if lowerName:find("^char/") then + name = "char" + else + name = lowerName:sub(1, 5) + end + lowerName = name:lower() + end + local oldName = db.raw.currentProfile[charID] + if oldName:lower() == name:lower() then + return + end + local oldProfileData = db.profile + local realName = name + if lowerName == "char" then + realName = name .. "/" .. charID + elseif lowerName == "realm" then + realName = name .. "/" .. realmID + elseif lowerName == "class" then + realName = name .. "/" .. classID + end + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedProfileDisable) == "function" then + safecall(mixin.OnEmbedProfileDisable, mixin, self, realName) + end + end + end + current = current.super + end + if type(self.OnProfileDisable) == "function" then + safecall(self.OnProfileDisable, self, realName) + end + local active = self:IsActive() + db.raw.currentProfile[charID] = name + rawset(db, 'profile', nil) + if db.namespaces then + for k,v in pairs(db.namespaces) do + rawset(v, 'profile', nil) + end + end + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedProfileEnable) == "function" then + safecall(mixin.OnEmbedProfileEnable, mixin, self, oldName, oldProfileData) + end + end + end + current = current.super + end + if type(self.OnProfileEnable) == "function" then + safecall(self.OnProfileEnable, self, oldName, oldProfileData) + end + if cleanDefaults(oldProfileData, db.defaults and db.defaults.profile) then + db.raw.profiles[oldName] = nil + if not next(db.raw.profiles) then + db.raw.profiles = nil + end + end + local newactive = self:IsActive() + if active ~= newactive then + local first = nil + if AceOO.inherits(self, "AceAddon-2.0") then + local AceAddon = AceLibrary("AceAddon-2.0") + if not AceAddon.addonsStarted[self] then + return + end + if AceAddon.addonsEnabled and not AceAddon.addonsEnabled[self] then + first = true + end + end + if newactive then + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedEnable) == "function" then + safecall(mixin.OnEmbedEnable, mixin, self, first) + end + end + end + current = current.super + end + if type(self.OnEnable) == "function" then + safecall(self.OnEnable, self, first) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonEnabled", self, first) + end + else + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedDisable) == "function" then + safecall(mixin.OnEmbedDisable, mixin, self) + end + end + end + current = current.super + end + if type(self.OnDisable) == "function" then + safecall(self.OnDisable, self) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonDisabled", self) + end + end + end + if self['acedb-profile-list'] then + RecalculateAceDBProfileList(self) + end + if self['acedb-profile-copylist'] then + RecalculateAceDBCopyFromList(self) + end + if Dewdrop then + Dewdrop:Refresh(1) + Dewdrop:Refresh(2) + Dewdrop:Refresh(3) + Dewdrop:Refresh(4) + Dewdrop:Refresh(5) + end +end + +function AceDB:CopyProfileFrom(copyFrom) + AceDB:argCheck(copyFrom, 2, "string") + if not self.db or not self.db.raw then + AceDB:error("Cannot call \"CopyProfileFrom\" before \"RegisterDB\" has been called and before \"ADDON_LOADED\" has been fired.") + end + local db = self.db + local lowerCopyFrom = copyFrom:lower() + if not db.raw.profiles or not db.raw.profiles[copyFrom] then + local good = false + if db.raw.namespaces then + for _,n in pairs(db.raw.namespaces) do + if n.profiles and n.profiles[copyFrom] then + good = true + break + end + end + end + if not good then + AceDB:error("Cannot copy from profile %q, it does not exist.", copyFrom) + end + end + local currentProfile = db.raw.currentProfile[charID] + if currentProfile:lower() == lowerCopyFrom then + AceDB:error("Cannot copy from profile %q, it is currently in use.", copyFrom) + end + local oldProfileData = db.profile + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedProfileDisable) == "function" then + safecall(mixin.OnEmbedProfileDisable, mixin, self, currentProfile) + end + end + end + current = current.super + end + if type(self.OnProfileDisable) == "function" then + safecall(self.OnProfileDisable, self, realName) + end + local active = self:IsActive() + for k,v in pairs(db.profile) do + db.profile[k] = nil + end + if db.raw.profiles[copyFrom] then + copyTable(db.profile, db.raw.profiles[copyFrom]) + end + inheritDefaults(db.profile, db.defaults and db.defaults.profile) + if db.namespaces then + for l,u in pairs(db.namespaces) do + for k,v in pairs(u.profile) do + u.profile[k] = nil + end + if db.raw.namespaces[l].profiles[copyFrom] then + copyTable(u.profile, db.raw.namespaces[l].profiles[copyFrom]) + end + inheritDefaults(u.profile, u.defaults and u.defaults.profile) + end + end + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedProfileEnable) == "function" then + safecall(mixin.OnEmbedProfileEnable, mixin, self, copyFrom, oldProfileData, copyFrom) + end + end + end + current = current.super + end + if type(self.OnProfileEnable) == "function" then + safecall(self.OnProfileEnable, self, copyFrom, oldProfileData, copyFrom) + end + local newactive = self:IsActive() + if active ~= newactive then + if AceOO.inherits(self, "AceAddon-2.0") then + local AceAddon = AceLibrary("AceAddon-2.0") + if not AceAddon.addonsStarted[self] then + return + end + end + if newactive then + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedEnable) == "function" then + safecall(mixin.OnEmbedEnable, mixin, self) + end + end + end + current = current.super + end + if type(self.OnEnable) == "function" then + safecall(self.OnEnable, self) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonEnabled", self) + end + else + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedDisable) == "function" then + safecall(mixin.OnEmbedDisable, mixin, self) + end + end + end + current = current.super + end + if type(self.OnDisable) == "function" then + safecall(self.OnDisable, self) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonDisabled", self) + end + end + end + if self['acedb-profile-list'] then + RecalculateAceDBProfileList(self) + end + if self['acedb-profile-copylist'] then + RecalculateAceDBCopyFromList(self) + end + if Dewdrop then + Dewdrop:Refresh(1) + Dewdrop:Refresh(2) + Dewdrop:Refresh(3) + Dewdrop:Refresh(4) + Dewdrop:Refresh(5) + end +end + +function AceDB:IsActive() + return not self.db or not self.db.raw or not self.db.raw.disabled or not self.db.raw.disabled[self.db.raw.currentProfile[charID]] +end + +function AceDB:ToggleActive(state) + AceDB:argCheck(state, 2, "boolean", "nil") + if not self.db or not self.db.raw then + AceDB:error("Cannot call \"ToggleActive\" before \"RegisterDB\" has been called and before \"ADDON_LOADED\" has been fired.") + end + local db = self.db + if not db.raw.disabled then + db.raw.disabled = setmetatable({}, caseInsensitive_mt) + end + local profile = db.raw.currentProfile[charID] + local disable + if state == nil then + disable = not db.raw.disabled[profile] + else + disable = not state + if disable == db.raw.disabled[profile] then + return + end + end + db.raw.disabled[profile] = disable or nil + if AceOO.inherits(self, "AceAddon-2.0") then + local AceAddon = AceLibrary("AceAddon-2.0") + if not AceAddon.addonsStarted[self] then + return + end + end + if not disable then + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedEnable) == "function" then + safecall(mixin.OnEmbedEnable, mixin, self) + end + end + end + current = current.super + end + if type(self.OnEnable) == "function" then + safecall(self.OnEnable, self) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonEnabled", self) + end + else + local current = self.class + while current and current ~= AceOO.Class do + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnEmbedDisable) == "function" then + safecall(mixin.OnEmbedDisable, mixin, self) + end + end + end + current = current.super + end + if type(self.OnDisable) == "function" then + safecall(self.OnDisable, self) + end + if AceEvent then + AceEvent:TriggerEvent("Ace2_AddonDisabled", self) + end + end + return not disable +end + +function AceDB:embed(target) + self.super.embed(self, target) + if not AceEvent then + AceDB:error(MAJOR_VERSION .. " requires AceEvent-2.0") + end +end + +function AceDB:ADDON_LOADED(name) + AceDB.addonsLoaded[name] = true + for addon, addonName in pairs(AceDB.addonsToBeInitialized) do + if name == addonName then + AceDB.InitializeDB(addon, name) + AceDB.addonsToBeInitialized[addon] = nil + end + end +end + +function AceDB:PLAYER_LOGOUT() + for addon in pairs(AceDB.registry) do + local db = addon.db + if db then + setmetatable(db, nil) + CrawlForSerialization(db.raw) + if type(_G[db.charName]) == "table" then + CrawlForSerialization(_G[db.charName]) + end + if db.char and cleanDefaults(db.char, db.defaults and db.defaults.char) then + if db.charName and _G[db.charName] and _G[db.charName].global == db.char then + _G[db.charName].global = nil + if not next(_G[db.charName]) then + _G[db.charName] = nil + end + else + if db.raw.chars then + db.raw.chars[charID] = nil + if not next(db.raw.chars) then + db.raw.chars = nil + end + end + end + end + if db.realm and cleanDefaults(db.realm, db.defaults and db.defaults.realm) then + if db.raw.realms then + db.raw.realms[realmID] = nil + if not next(db.raw.realms) then + db.raw.realms = nil + end + end + end + if db.server and cleanDefaults(db.server, db.defaults and db.defaults.server) then + if db.raw.servers then + db.raw.servers[server] = nil + if not next(db.raw.servers) then + db.raw.servers = nil + end + end + end + if db.faction and cleanDefaults(db.faction, db.defaults and db.defaults.faction) then + if db.raw.factions then + db.raw.factions[faction] = nil + if not next(db.raw.factions) then + db.raw.factions = nil + end + end + end + if db.class and cleanDefaults(db.class, db.defaults and db.defaults.class) then + if db.raw.classes then + db.raw.classes[classID] = nil + if not next(db.raw.classes) then + db.raw.classes = nil + end + end + end + if db.account and cleanDefaults(db.account, db.defaults and db.defaults.account) then + db.raw.account = nil + end + if db.profile and cleanDefaults(db.profile, db.defaults and db.defaults.profile) then + if db.raw.profiles then + db.raw.profiles[db.raw.currentProfile and db.raw.currentProfile[charID] or "Default"] = nil + if not next(db.raw.profiles) then + db.raw.profiles = nil + end + end + end + if db.namespaces and db.raw.namespaces then + for name,v in pairs(db.namespaces) do + if db.raw.namespaces[name] then + setmetatable(v, nil) + if v.char and cleanDefaults(v.char, v.defaults and v.defaults.char) then + if db.charName and _G[db.charName] and _G[db.charName].namespaces and _G[db.charName].namespaces[name] == v then + _G[db.charName].namespaces[name] = nil + if not next(_G[db.charName].namespaces) then + _G[db.charName].namespaces = nil + if not next(_G[db.charName]) then + _G[db.charName] = nil + end + end + else + if db.raw.namespaces[name].chars then + db.raw.namespaces[name].chars[charID] = nil + if not next(db.raw.namespaces[name].chars) then + db.raw.namespaces[name].chars = nil + end + end + end + end + if v.realm and cleanDefaults(v.realm, v.defaults and v.defaults.realm) then + if db.raw.namespaces[name].realms then + db.raw.namespaces[name].realms[realmID] = nil + if not next(db.raw.namespaces[name].realms) then + db.raw.namespaces[name].realms = nil + end + end + end + if v.server and cleanDefaults(v.server, v.defaults and v.defaults.server) then + if db.raw.namespaces[name].servers then + db.raw.namespaces[name].servers[server] = nil + if not next(db.raw.namespaces[name].servers) then + db.raw.namespaces[name].servers = nil + end + end + end + if v.faction and cleanDefaults(v.faction, v.defaults and v.defaults.faction) then + if db.raw.namespaces[name].factions then + db.raw.namespaces[name].factions[faction] = nil + if not next(db.raw.namespaces[name].factions) then + db.raw.namespaces[name].factions = nil + end + end + end + if v.class and cleanDefaults(v.class, v.defaults and v.defaults.class) then + if db.raw.namespaces[name].classes then + db.raw.namespaces[name].classes[classID] = nil + if not next(db.raw.namespaces[name].classes) then + db.raw.namespaces[name].classes = nil + end + end + end + if v.account and cleanDefaults(v.account, v.defaults and v.defaults.account) then + db.raw.namespaces[name].account = nil + end + if v.profile and cleanDefaults(v.profile, v.defaults and v.defaults.profile) then + if db.raw.namespaces[name].profiles then + db.raw.namespaces[name].profiles[db.raw.currentProfile and db.raw.currentProfile[charID] or "Default"] = nil + if not next(db.raw.namespaces[name].profiles) then + db.raw.namespaces[name].profiles = nil + end + end + end + if not next(db.raw.namespaces[name]) then + db.raw.namespaces[name] = nil + end + end + end + if not next(db.raw.namespaces) then + db.raw.namespaces = nil + end + end + if db.raw.disabled and not next(db.raw.disabled) then + db.raw.disabled = nil + end + if db.raw.currentProfile then + for k,v in pairs(db.raw.currentProfile) do + if v:lower() == "default" then + db.raw.currentProfile[k] = nil + end + end + if not next(db.raw.currentProfile) then + db.raw.currentProfile = nil + end + end + if _G[db.name] and not next(_G[db.name]) then + _G[db.name] = nil + end + end + end +end + +function AceDB:AcquireDBNamespace(name) + AceDB:argCheck(name, 2, "string") + local db = self.db + if not db then + AceDB:error("Cannot call `AcquireDBNamespace' before `RegisterDB' has been called.", 2) + end + if not db.namespaces then + rawset(db, 'namespaces', {}) + end + if not db.namespaces[name] then + local namespace = {} + db.namespaces[name] = namespace + namespace.db = db + namespace.name = name + setmetatable(namespace, namespace_mt) + end + return db.namespaces[name] +end + +function AceDB:GetAceOptionsDataTable(target) + if not target['acedb-profile-list'] then + target['acedb-profile-list'] = setmetatable({}, caseInsensitive_mt) + RecalculateAceDBProfileList(target) + end + if not target['acedb-profile-copylist'] then + target['acedb-profile-copylist'] = setmetatable({}, caseInsensitive_mt) + RecalculateAceDBCopyFromList(target) + end + return { + standby = { + cmdName = STATE, + guiName = ENABLED, + name = ACTIVE, + desc = TOGGLE_ACTIVE, + type = "toggle", + get = "IsActive", + set = "ToggleActive", + map = MAP_ACTIVESUSPENDED, + order = -3, + }, + profile = { + type = 'group', + name = PROFILE, + desc = SET_PROFILE, + order = -3.5, + get = "GetProfile", + args = { + choose = { + guiName = CHOOSE_PROFILE_GUI, + cmdName = PROFILE, + desc = CHOOSE_PROFILE_DESC, + type = 'text', + get = "GetProfile", + set = "SetProfile", + validate = target['acedb-profile-list'] + }, + copy = { + guiName = COPY_PROFILE_GUI, + cmdName = PROFILE, + desc = COPY_PROFILE_DESC, + type = 'text', + get = false, + set = "CopyProfileFrom", + validate = target['acedb-profile-copylist'], + disabled = function() + return not next(target['acedb-profile-copylist']) + end, + }, + other = { + guiName = OTHER_PROFILE_GUI, + cmdName = PROFILE, + desc = OTHER_PROFILE_DESC, + usage = OTHER_PROFILE_USAGE, + type = 'text', + get = "GetProfile", + set = "SetProfile", + } + } + }, + } +end + +local function activate(self, oldLib, oldDeactivate) + AceDB = self + AceEvent = AceLibrary:HasInstance("AceEvent-2.0") and AceLibrary("AceEvent-2.0") + + self.addonsToBeInitialized = oldLib and oldLib.addonsToBeInitialized or {} + self.addonsLoaded = oldLib and oldLib.addonsLoaded or {} + self.registry = oldLib and oldLib.registry or {} + + self:activate(oldLib, oldDeactivate) + + for t in pairs(self.embedList) do + if t.db then + rawset(t.db, 'char', nil) + rawset(t.db, 'realm', nil) + rawset(t.db, 'class', nil) + rawset(t.db, 'account', nil) + rawset(t.db, 'server', nil) + rawset(t.db, 'faction', nil) + rawset(t.db, 'profile', nil) + setmetatable(t.db, db_mt) + end + end + + if oldLib then + oldDeactivate(oldLib) + end +end + +local function external(self, major, instance) + if major == "AceEvent-2.0" then + AceEvent = instance + + AceEvent:embed(self) + + self:RegisterEvent("ADDON_LOADED") + self:RegisterEvent("PLAYER_LOGOUT") + elseif major == "Dewdrop-2.0" then + Dewdrop = instance + end +end + +AceLibrary:Register(AceDB, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) +AceDB = AceLibrary(MAJOR_VERSION) diff --git a/libs/AceEvent-2.0/AceEvent-2.0.lua b/libs/AceEvent-2.0/AceEvent-2.0.lua new file mode 100644 index 0000000..027dc09 --- /dev/null +++ b/libs/AceEvent-2.0/AceEvent-2.0.lua @@ -0,0 +1,1040 @@ +--[[ +Name: AceEvent-2.0 +Revision: $Rev: 23383 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Ace 1.x by Turan (turan@gryphon.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceEvent-2.0 +SVN: http://svn.wowace.com/root/trunk/Ace2/AceEvent-2.0 +Description: Mixin to allow for event handling, scheduling, and inter-addon + communication. +Dependencies: AceLibrary, AceOO-2.0 +License: LGPL v2.1 +]] + +local MAJOR_VERSION = "AceEvent-2.0" +local MINOR_VERSION = "$Revision: 23383 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end + +local AceOO = AceLibrary:GetInstance("AceOO-2.0") +local Mixin = AceOO.Mixin +local AceEvent = Mixin { + "RegisterEvent", + "RegisterAllEvents", + "UnregisterEvent", + "UnregisterAllEvents", + "TriggerEvent", + "ScheduleEvent", + "ScheduleRepeatingEvent", + "CancelScheduledEvent", + "CancelAllScheduledEvents", + "IsEventRegistered", + "IsEventScheduled", + "RegisterBucketEvent", + "UnregisterBucketEvent", + "UnregisterAllBucketEvents", + "IsBucketEventRegistered", + "ScheduleLeaveCombatAction", + "CancelAllCombatSchedules", + } + +local weakKey = {__mode="k"} + +local FAKE_NIL +local RATE + +local eventsWhichHappenOnce = { + PLAYER_LOGIN = true, + AceEvent_FullyInitialized = true, + VARIABLES_LOADED = true, + PLAYER_LOGOUT = true, +} +local next = next +local pairs = pairs +local pcall = pcall +local type = type +local GetTime = GetTime +local gcinfo = gcinfo +local unpack = unpack +local geterrorhandler = geterrorhandler + +local new, del +do + local cache = setmetatable({}, {__mode='k'}) + function new(...) + local t = next(cache) + if t then + cache[t] = nil + for i = 1, select('#', ...) do + t[i] = select(i, ...) + end + return t + else + return { ... } + end + end + function del(t) + for k in pairs(t) do + t[k] = nil + end + cache[t] = true + return nil + end +end + +local registeringFromAceEvent +function AceEvent:RegisterEvent(event, method, once) + AceEvent:argCheck(event, 2, "string") + if self == AceEvent and not registeringFromAceEvent then + AceEvent:argCheck(method, 3, "function") + self = method + else + AceEvent:argCheck(method, 3, "string", "function", "nil", "boolean", "number") + if type(method) == "boolean" or type(method) == "number" then + AceEvent:argCheck(once, 4, "nil") + once, method = method, event + end + end + AceEvent:argCheck(once, 4, "number", "boolean", "nil") + if eventsWhichHappenOnce[event] then + once = true + end + local throttleRate + if type(once) == "number" then + throttleRate, once = once + end + if not method then + method = event + end + if type(method) == "string" and type(self[method]) ~= "function" then + AceEvent:error("Cannot register event %q to method %q, it does not exist", event, method) + else + assert(type(method) == "function" or type(method) == "string") + end + + local AceEvent_registry = AceEvent.registry + if not AceEvent_registry[event] then + AceEvent_registry[event] = new() + AceEvent.frame:RegisterEvent(event) + end + + local remember = true + if AceEvent_registry[event][self] then + remember = false + end + AceEvent_registry[event][self] = method + + local AceEvent_onceRegistry = AceEvent.onceRegistry + if once then + if not AceEvent_onceRegistry then + AceEvent.onceRegistry = {} + AceEvent_onceRegistry = AceEvent.onceRegistry + end + if not AceEvent_onceRegistry[event] then + AceEvent_onceRegistry[event] = new() + end + AceEvent_onceRegistry[event][self] = true + else + if AceEvent_onceRegistry and AceEvent_onceRegistry[event] then + AceEvent_onceRegistry[event][self] = nil + if not next(AceEvent_onceRegistry[event]) then + AceEvent_onceRegistry[event] = del(AceEvent_onceRegistry[event]) + end + end + end + + local AceEvent_throttleRegistry = AceEvent.throttleRegistry + if throttleRate then + if not AceEvent_throttleRegistry then + AceEvent.throttleRegistry = {} + AceEvent_throttleRegistry = AceEvent.throttleRegistry + end + if not AceEvent_throttleRegistry[event] then + AceEvent_throttleRegistry[event] = new() + end + if AceEvent_throttleRegistry[event][self] then + AceEvent_throttleRegistry[event][self] = nil + end + AceEvent_throttleRegistry[event][self] = setmetatable(new(), weakKey) + local t = AceEvent_throttleRegistry[event][self] + t[RATE] = throttleRate + else + if AceEvent_throttleRegistry and AceEvent_throttleRegistry[event] then + if AceEvent_throttleRegistry[event][self] then + AceEvent_throttleRegistry[event][self] = nil + end + if not next(AceEvent_throttleRegistry[event]) then + AceEvent_throttleRegistry[event] = del(AceEvent_throttleRegistry[event]) + end + end + end + + if remember then + AceEvent:TriggerEvent("AceEvent_EventRegistered", self, event) + end +end + +local ALL_EVENTS + +function AceEvent:RegisterAllEvents(method) + if self == AceEvent then + AceEvent:argCheck(method, 1, "function") + self = method + else + AceEvent:argCheck(method, 1, "string", "function") + if type(method) == "string" and type(self[method]) ~= "function" then + AceEvent:error("Cannot register all events to method %q, it does not exist", method) + end + end + + local AceEvent_registry = AceEvent.registry + if not AceEvent_registry[ALL_EVENTS] then + AceEvent_registry[ALL_EVENTS] = new() + AceEvent.frame:RegisterAllEvents() + end + + AceEvent_registry[ALL_EVENTS][self] = method +end + +local memstack, timestack = {}, {} +local memdiff, timediff + +function AceEvent:TriggerEvent(event, ...) + local tmp = new() + if type(event) ~= "string" then + DEFAULT_CHAT_FRAME:AddMessage(debugstack()) + end + AceEvent:argCheck(event, 2, "string") + local AceEvent_registry = AceEvent.registry + if (not AceEvent_registry[event] or not next(AceEvent_registry[event])) and (not AceEvent_registry[ALL_EVENTS] or not next(AceEvent_registry[ALL_EVENTS])) then + return + end + local lastEvent = AceEvent.currentEvent + AceEvent.currentEvent = event + + local AceEvent_onceRegistry = AceEvent.onceRegistry + local AceEvent_debugTable = AceEvent.debugTable + if AceEvent_onceRegistry and AceEvent_onceRegistry[event] then + for obj, method in pairs(AceEvent_onceRegistry[event]) do + tmp[obj] = AceEvent_registry[event] and AceEvent_registry[event][obj] or nil + end + local obj = next(tmp) + while obj do + local mem, time + if AceEvent_debugTable then + if not AceEvent_debugTable[event] then + AceEvent_debugTable[event] = {} + end + if not AceEvent_debugTable[event][obj] then + AceEvent_debugTable[event][obj] = { + mem = 0, + time = 0, + count = 0, + } + end + if memdiff then + table.insert(memstack, memdiff) + table.insert(timestack, timediff) + end + memdiff, timediff = 0, 0 + mem, time = gcinfo(), GetTime() + end + local method = tmp[obj] + AceEvent.UnregisterEvent(obj, event) + if type(method) == "string" then + local obj_method = obj[method] + if obj_method then + local success, err = pcall(obj_method, obj, ...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + elseif method then -- function + local success, err = pcall(method, ...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + if AceEvent_debugTable then + local dmem, dtime = memdiff, timediff + mem, time = gcinfo() - mem - memdiff, GetTime() - time - timediff + AceEvent_debugTable[event][obj].mem = AceEvent_debugTable[event][obj].mem + mem + AceEvent_debugTable[event][obj].time = AceEvent_debugTable[event][obj].time + time + AceEvent_debugTable[event][obj].count = AceEvent_debugTable[event][obj].count + 1 + + memdiff, timediff = table.remove(memstack), table.remove(timestack) + if memdiff then + memdiff = memdiff + mem + dmem + timediff = timediff + time + dtime + end + end + tmp[obj] = nil + obj = next(tmp) + end + end + + local AceEvent_throttleRegistry = AceEvent.throttleRegistry + local throttleTable = AceEvent_throttleRegistry and AceEvent_throttleRegistry[event] + if AceEvent_registry[event] then + for obj, method in pairs(AceEvent_registry[event]) do + tmp[obj] = method + end + local obj = next(tmp) + while obj do + local method = tmp[obj] + local continue = false + if throttleTable and throttleTable[obj] then + local a1 = ... + if a1 == nil then + a1 = FAKE_NIL + end + if not throttleTable[obj][a1] or GetTime() - throttleTable[obj][a1] >= throttleTable[obj][RATE] then + throttleTable[obj][a1] = GetTime() + else + continue = true + end + end + if not continue then + local mem, time + if AceEvent_debugTable then + if not AceEvent_debugTable[event] then + AceEvent_debugTable[event] = {} + end + if not AceEvent_debugTable[event][obj] then + AceEvent_debugTable[event][obj] = { + mem = 0, + time = 0, + count = 0, + } + end + if memdiff then + table.insert(memstack, memdiff) + table.insert(timestack, timediff) + end + memdiff, timediff = 0, 0 + mem, time = gcinfo(), GetTime() + end + if type(method) == "string" then + local obj_method = obj[method] + if obj_method then + local success, err = pcall(obj_method, obj, ...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + elseif method then -- function + local success, err = pcall(method, ...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + if AceEvent_debugTable then + local dmem, dtime = memdiff, timediff + mem, time = gcinfo() - mem - memdiff, GetTime() - time - timediff + AceEvent_debugTable[event][obj].mem = AceEvent_debugTable[event][obj].mem + mem + AceEvent_debugTable[event][obj].time = AceEvent_debugTable[event][obj].time + time + AceEvent_debugTable[event][obj].count = AceEvent_debugTable[event][obj].count + 1 + + memdiff, timediff = table.remove(memstack), table.remove(timestack) + if memdiff then + memdiff = memdiff + mem + dmem + timediff = timediff + time + dtime + end + end + end + tmp[obj] = nil + obj = next(tmp) + end + end + if AceEvent_registry[ALL_EVENTS] then + for obj, method in pairs(AceEvent_registry[ALL_EVENTS]) do + tmp[obj] = method + end + local obj = next(tmp) + while obj do + local method = tmp[obj] + local mem, time + if AceEvent_debugTable then + if not AceEvent_debugTable[event] then + AceEvent_debugTable[event] = {} + end + if not AceEvent_debugTable[event][obj] then + AceEvent_debugTable[event][obj] = {} + AceEvent_debugTable[event][obj].mem = 0 + AceEvent_debugTable[event][obj].time = 0 + AceEvent_debugTable[event][obj].count = 0 + end + if memdiff then + table.insert(memstack, memdiff) + table.insert(timestack, timediff) + end + memdiff, timediff = 0, 0 + mem, time = gcinfo(), GetTime() + end + if type(method) == "string" then + local obj_method = obj[method] + if obj_method then + local success, err = pcall(obj_method, obj, ...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + elseif method then -- function + local success, err = pcall(method, ...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + if AceEvent_debugTable then + local dmem, dtime = memdiff, timediff + mem, time = gcinfo() - mem - memdiff, GetTime() - time - timediff + AceEvent_debugTable[event][obj].mem = AceEvent_debugTable[event][obj].mem + mem + AceEvent_debugTable[event][obj].time = AceEvent_debugTable[event][obj].time + time + AceEvent_debugTable[event][obj].count = AceEvent_debugTable[event][obj].count + 1 + + memdiff, timediff = table.remove(memstack), table.remove(timestack) + if memdiff then + memdiff = memdiff + mem + dmem + timediff = timediff + time + dtime + end + end + tmp[obj] = nil + obj = next(tmp) + end + end + tmp = del(tmp) + AceEvent.currentEvent = lastEvent +end + +local delayRegistry +local tmp = {} +local function OnUpdate() + local t = GetTime() + for k,v in pairs(delayRegistry) do + tmp[k] = true + end + local AceEvent_debugTable = AceEvent.debugTable + for k in pairs(tmp) do + local v = delayRegistry[k] + if v then + local v_time = v.time + if not v_time then + delayRegistry[k] = nil + elseif v_time <= t then + local v_repeatDelay = v.repeatDelay + if v_repeatDelay then + -- use the event time, not the current time, else timing inaccuracies add up over time + v.time = v_time + v_repeatDelay + end + local event = v.event + local mem, time + if AceEvent_debugTable then + mem, time = gcinfo(), GetTime() + end + if type(event) == "function" then + local success, err = pcall(event, unpack(v, 1, v.n)) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + else + AceEvent:TriggerEvent(event, unpack(v, 1, v.n)) + end + if AceEvent_debugTable then + mem, time = gcinfo() - mem, GetTime() - time + v.mem = v.mem + mem + v.timeSpent = v.timeSpent + time + v.count = v.count + 1 + end + if not v_repeatDelay then + local x = delayRegistry[k] + if x and x.time == v_time then -- check if it was manually reset + if type(k) == "string" then + del(delayRegistry[k]) + end + delayRegistry[k] = nil + end + end + end + end + end + for k in pairs(tmp) do + tmp[k] = nil + end + if not next(delayRegistry) then + AceEvent.frame:Hide() + end +end + +local function ScheduleEvent(self, repeating, event, delay, ...) + local id + if type(event) == "string" or type(event) == "table" then + if type(event) == "table" then + if not delayRegistry or not delayRegistry[event] then + AceEvent:error("Bad argument #2 to `ScheduleEvent'. Improper id table fed in.") + end + end + if type(delay) ~= "number" then + id, event, delay = event, delay, ... + AceEvent:argCheck(event, 3, "string", "function", --[[ so message is right ]] "number") + AceEvent:argCheck(delay, 4, "number") + self:CancelScheduledEvent(id) + end + else + AceEvent:argCheck(event, 2, "string", "function") + AceEvent:argCheck(delay, 3, "number") + end + + if not delayRegistry then + AceEvent.delayRegistry = {} + delayRegistry = AceEvent.delayRegistry + AceEvent.frame:SetScript("OnUpdate", OnUpdate) + end + local t + if type(id) == "table" then + for k in pairs(id) do + id[k] = nil + end + t = id + for i = 2, select('#', ...) do + t[i-1] = select(i, ...) + end + t.n = select('#', ...) - 1 + elseif id then + t = new(select(2, ...)) + t.n = select('#', ...) - 1 + else + t = { n = select('#', ...), ... } + end + t.event = event + t.time = GetTime() + delay + t.self = self + t.id = id or t + t.repeatDelay = repeating and delay + if AceEvent.debugTable then + t.mem = 0 + t.count = 0 + t.timeSpent = 0 + end + delayRegistry[t.id] = t + AceEvent.frame:Show() + return t.id +end + +function AceEvent:ScheduleEvent(event, delay, ...) + if type(event) == "string" or type(event) == "table" then + if type(event) == "table" then + if not delayRegistry or not delayRegistry[event] then + AceEvent:error("Bad argument #2 to `ScheduleEvent'. Improper id table fed in.") + end + end + if type(delay) ~= "number" then + AceEvent:argCheck(delay, 3, "string", "function", --[[ so message is right ]] "number") + AceEvent:argCheck(..., 4, "number") + end + else + AceEvent:argCheck(event, 2, "string", "function") + AceEvent:argCheck(delay, 3, "number") + end + + return ScheduleEvent(self, false, event, delay, ...) +end + +function AceEvent:ScheduleRepeatingEvent(event, delay, ...) + if type(event) == "string" or type(event) == "table" then + if type(event) == "table" then + if not delayRegistry or not delayRegistry[event] then + AceEvent:error("Bad argument #2 to `ScheduleEvent'. Improper id table fed in.") + end + end + if type(delay) ~= "number" then + AceEvent:argCheck(delay, 3, "string", "function", --[[ so message is right ]] "number") + AceEvent:argCheck(..., 4, "number") + end + else + AceEvent:argCheck(event, 2, "string", "function") + AceEvent:argCheck(delay, 3, "number") + end + + return ScheduleEvent(self, true, event, delay, ...) +end + +function AceEvent:CancelScheduledEvent(t) + AceEvent:argCheck(t, 2, "string", "table") + if delayRegistry then + local v = delayRegistry[t] + if v then + if type(t) == "string" then + del(delayRegistry[t]) + end + delayRegistry[t] = nil + if not next(delayRegistry) then + AceEvent.frame:Hide() + end + return true + end + end + return false +end + +function AceEvent:IsEventScheduled(t) + AceEvent:argCheck(t, 2, "string", "table") + if delayRegistry then + local v = delayRegistry[t] + if v then + return true, v.time - GetTime() + end + end + return false, nil +end + +function AceEvent:UnregisterEvent(event) + AceEvent:argCheck(event, 2, "string") + local AceEvent_registry = AceEvent.registry + if AceEvent_registry[event] and AceEvent_registry[event][self] then + AceEvent_registry[event][self] = nil + local AceEvent_onceRegistry = AceEvent.onceRegistry + if AceEvent_onceRegistry and AceEvent_onceRegistry[event] and AceEvent_onceRegistry[event][self] then + AceEvent_onceRegistry[event][self] = nil + if not next(AceEvent_onceRegistry[event]) then + AceEvent_onceRegistry[event] = del(AceEvent_onceRegistry[event]) + end + end + local AceEvent_throttleRegistry = AceEvent.throttleRegistry + if AceEvent_throttleRegistry and AceEvent_throttleRegistry[event] and AceEvent_throttleRegistry[event][self] then + AceEvent_throttleRegistry[event][self] = nil + if not next(AceEvent_throttleRegistry[event]) then + AceEvent_throttleRegistry[event] = del(AceEvent_throttleRegistry[event]) + end + end + if not next(AceEvent_registry[event]) then + AceEvent_registry[event] = del(AceEvent_registry[event]) + if not AceEvent_registry[ALL_EVENTS] or not next(AceEvent_registry[ALL_EVENTS]) then + AceEvent.frame:UnregisterEvent(event) + end + end + else + if self == AceEvent then + error(("Cannot unregister event %q. Improperly unregistering from AceEvent-2.0."):format(event), 2) + else + AceEvent:error("Cannot unregister event %q. %q is not registered with it.", event, self) + end + end + AceEvent:TriggerEvent("AceEvent_EventUnregistered", self, event) +end + +function AceEvent:UnregisterAllEvents() + local AceEvent_registry = AceEvent.registry + if AceEvent_registry[ALL_EVENTS] and AceEvent_registry[ALL_EVENTS][self] then + AceEvent_registry[ALL_EVENTS][self] = nil + if not next(AceEvent_registry[ALL_EVENTS]) then + AceEvent_registry[ALL_EVENTS] = del(AceEvent_registry[ALL_EVENTS]) + AceEvent.frame:UnregisterAllEvents() + for k,v in pairs(AceEvent_registry) do + AceEvent.frame:RegisterEvent(k) + end + end + end + if AceEvent_registry.AceEvent_EventUnregistered then + local event, data = "AceEvent_EventUnregistered", AceEvent_registry.AceEvent_EventUnregistered + local x = data[self] + data[self] = nil + if x then + if not next(data) then + if not AceEvent_registry[ALL_EVENTS] then + AceEvent.frame:UnregisterEvent(event) + end + AceEvent_registry[event] = del(AceEvent_registry[event]) + end + AceEvent:TriggerEvent("AceEvent_EventUnregistered", self, event) + end + end + for event, data in pairs(AceEvent_registry) do + local x = data[self] + data[self] = nil + if x and event ~= ALL_EVENTS then + if not next(data) then + if not AceEvent_registry[ALL_EVENTS] then + AceEvent.frame:UnregisterEvent(event) + end + AceEvent_registry[event] = del(AceEvent_registry[event]) + end + AceEvent:TriggerEvent("AceEvent_EventUnregistered", self, event) + end + end + if AceEvent.onceRegistry then + for event, data in pairs(AceEvent.onceRegistry) do + data[self] = nil + end + end +end + +function AceEvent:CancelAllScheduledEvents() + if delayRegistry then + for k,v in pairs(delayRegistry) do + if v.self == self then + if type(k) == "string" then + del(delayRegistry[k]) + end + delayRegistry[k] = nil + end + end + if not next(delayRegistry) then + AceEvent.frame:Hide() + end + end +end + +function AceEvent:IsEventRegistered(event) + AceEvent:argCheck(event, 2, "string") + local AceEvent_registry = AceEvent.registry + if self == AceEvent then + return AceEvent_registry[event] and next(AceEvent_registry[event]) and true or false + end + if AceEvent_registry[event] and AceEvent_registry[event][self] then + return true, AceEvent_registry[event][self] + end + return false, nil +end + +local bucketfunc +function AceEvent:RegisterBucketEvent(event, delay, method) + AceEvent:argCheck(event, 2, "string", "table") + if type(event) == "table" then + for k,v in pairs(event) do + if type(k) ~= "number" then + AceEvent:error("All keys to argument #2 to `RegisterBucketEvent' must be numbers.") + elseif type(v) ~= "string" then + AceEvent:error("All values to argument #2 to `RegisterBucketEvent' must be strings.") + end + end + end + AceEvent:argCheck(delay, 3, "number") + if AceEvent == self then + AceEvent:argCheck(method, 4, "function") + self = method + else + if type(event) == "string" then + AceEvent:argCheck(method, 4, "string", "function", "nil") + if not method then + method = event + end + else + AceEvent:argCheck(method, 4, "string", "function") + end + + if type(method) == "string" and type(self[method]) ~= "function" then + AceEvent:error("Cannot register event %q to method %q, it does not exist", event, method) + end + end + if not AceEvent.buckets then + AceEvent.buckets = {} + end + if not AceEvent.buckets[event] then + AceEvent.buckets[event] = new() + end + if not AceEvent.buckets[event][self] then + local t = new() + t.current = new() + t.self = self + AceEvent.buckets[event][self] = t + else + AceEvent.CancelScheduledEvent(self, AceEvent.buckets[event][self].id) + end + local bucket = AceEvent.buckets[event][self] + bucket.method = method + + local func = function(arg1) + bucket.run = true + if arg1 then + bucket.current[arg1] = true + end + end + AceEvent.buckets[event][self].func = func + if type(event) == "string" then + AceEvent.RegisterEvent(self, event, func) + else + for _,v in ipairs(event) do + AceEvent.RegisterEvent(self, v, func) + end + end + if not bucketfunc then + bucketfunc = function(bucket) + local current = bucket.current + local method = bucket.method + local self = bucket.self + if bucket.run then + if type(method) == "string" then + self[method](self, current) + elseif method then -- function + method(current) + end + for k in pairs(current) do + current[k] = nil + k = nil + end + bucket.run = false + end + end + end + bucket.id = AceEvent.ScheduleRepeatingEvent(self, bucketfunc, delay, bucket) +end + +function AceEvent:IsBucketEventRegistered(event) + AceEvent:argCheck(event, 2, "string", "table") + return AceEvent.buckets and AceEvent.buckets[event] and AceEvent.buckets[event][self] +end + +function AceEvent:UnregisterBucketEvent(event) + AceEvent:argCheck(event, 2, "string", "table") + if not AceEvent.buckets or not AceEvent.buckets[event] or not AceEvent.buckets[event][self] then + AceEvent:error("Cannot unregister bucket event %q. %q is not registered with it.", event, self) + end + + local bucket = AceEvent.buckets[event][self] + + if type(event) == "string" then + AceEvent.UnregisterEvent(self, event) + else + for _,v in ipairs(event) do + AceEvent.UnregisterEvent(self, v) + end + end + AceEvent:CancelScheduledEvent(bucket.id) + + bucket.current = del(bucket.current) + AceEvent.buckets[event][self] = del(bucket) + if not next(AceEvent.buckets[event]) then + AceEvent.buckets[event] = del(AceEvent.buckets[event]) + end +end + +function AceEvent:UnregisterAllBucketEvents() + if not AceEvent.buckets or not next(AceEvent.buckets) then + return + end + for k,v in pairs(AceEvent.buckets) do + if v == self then + AceEvent.UnregisterBucketEvent(self, k) + k = nil + end + end +end + +local combatSchedules +function AceEvent:CancelAllCombatSchedules() + local i = 0 + while true do + i = i + 1 + if not combatSchedules[i] then + break + end + local v = combatSchedules[i] + if v.self == self then + v = del(v) + table.remove(combatSchedules, i) + i = i - 1 + end + end +end + +local inCombat = false +local tmp = {} + +function AceEvent:PLAYER_REGEN_DISABLED() + inCombat = true +end + +function AceEvent:PLAYER_REGEN_ENABLED() + inCombat = false + for i, v in ipairs(combatSchedules) do + tmp[i] = v + combatSchedules[i] = nil + end + for i, v in ipairs(tmp) do + local func = v.func + if func then + local success, err = pcall(func, unpack(v, 1, v.n)) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + else + local obj = v.self + local method = v.method + local obj_method = obj[method] + if obj_method then + local success, err = pcall(obj_method, obj, unpack(v, 1, v.n)) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + end + end + tmp[i] = del(v) + end +end + +function AceEvent:ScheduleLeaveCombatAction(method, ...) + if self == AceEvent then + AceEvent:argCheck(method, 2, "function") + self = func + else + AceEvent:argCheck(method, 2, "function", "string") + if type(method) == "string" and type(self[method]) ~= "function" then + AceEvent:error("Cannot schedule a combat action to method %q, it does not exist", method) + end + end + + if not inCombat then + local success, err + if type(method) == "function" then + success, err = pcall(method, ...) + else + success, err = pcall(self[method], self, ...) + end + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("(.-: )in.-\n") or "") .. err) end + return + end + local t = new(...) + t.n = select('#', ...) + if type(method) == "function" then + t.func = method + else + t.method = method + end + t.self = self + table.insert(combatSchedules, t) +end + +function AceEvent:OnEmbedDisable(target) + self.UnregisterAllEvents(target) + + self.CancelAllScheduledEvents(target) + + self.UnregisterAllBucketEvents(target) + + self.CancelAllCombatSchedules(target) +end + +function AceEvent:EnableDebugging() + if not self.debugTable then + self.debugTable = {} + + if delayRegistry then + for k,v in pairs(self.delayRegistry) do + if not v.mem then + v.mem = 0 + v.count = 0 + v.timeSpent = 0 + end + end + end + end +end + +function AceEvent:IsFullyInitialized() + return self.postInit or false +end + +function AceEvent:IsPostPlayerLogin() + return self.playerLogin or false +end + +local function activate(self, oldLib, oldDeactivate) + AceEvent = self + + self.onceRegistry = oldLib and oldLib.onceRegistry or {} + self.throttleRegistry = oldLib and oldLib.throttleRegistry or {} + self.delayRegistry = oldLib and oldLib.delayRegistry or {} + self.buckets = oldLib and oldLib.buckets or {} + self.registry = oldLib and oldLib.registry or {} + self.frame = oldLib and oldLib.frame or CreateFrame("Frame", "AceEvent20Frame") + self.debugTable = oldLib and oldLib.debugTable + self.playerLogin = oldLib and oldLib.pew or DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.defaultLanguage and true + self.postInit = oldLib and oldLib.postInit or self.playerLogin and ChatTypeInfo and ChatTypeInfo.WHISPER and ChatTypeInfo.WHISPER.r and true + self.ALL_EVENTS = oldLib and oldLib.ALL_EVENTS or {} + self.FAKE_NIL = oldLib and oldLib.FAKE_NIL or {} + self.RATE = oldLib and oldLib.RATE or {} + self.combatSchedules = oldLib and oldLib.combatSchedules or {} + + combatSchedules = self.combatSchedules + ALL_EVENTS = self.ALL_EVENTS + FAKE_NIL = self.FAKE_NIL + RATE = self.RATE + local inPlw = false + local blacklist = { + UNIT_INVENTORY_CHANGED = true, + BAG_UPDATE = true, + ITEM_LOCK_CHANGED = true, + ACTIONBAR_SLOT_CHANGED = true, + } + self.frame:SetScript("OnEvent", function(_, event, ...) + if event == "PLAYER_ENTERING_WORLD" then + inPlw = false + elseif event == "PLAYER_LEAVING_WORLD" then + inPlw = true + end + if event and (not inPlw or not blacklist[event]) then + self:TriggerEvent(event, ...) + end + end) + if self.delayRegistry then + delayRegistry = self.delayRegistry + self.frame:SetScript("OnUpdate", OnUpdate) + end + + self:UnregisterAllEvents() + self:CancelAllScheduledEvents() + + registeringFromAceEvent = true + self:RegisterEvent("LOOT_OPENED", function() + SendAddonMessage("LOOT_OPENED", "", "RAID") + end) + registeringFromAceEvent = nil + + if not self.playerLogin then + registeringFromAceEvent = true + self:RegisterEvent("PLAYER_LOGIN", function() + collectgarbage('collect') + self.playerLogin = true + end, true) + registeringFromAceEvent = nil + end + + if not self.postInit then + local isReload = true + local function func() + self.postInit = true + self:TriggerEvent("AceEvent_FullyInitialized") + if self.registry["CHAT_MSG_CHANNEL_NOTICE"] and self.registry["CHAT_MSG_CHANNEL_NOTICE"][self] then + self:UnregisterEvent("CHAT_MSG_CHANNEL_NOTICE") + end + if self.registry["MEETINGSTONE_CHANGED"] and self.registry["MEETINGSTONE_CHANGED"][self] then + self:UnregisterEvent("MEETINGSTONE_CHANGED") + end + if self.registry["MINIMAP_ZONE_CHANGED"] and self.registry["MINIMAP_ZONE_CHANGED"][self] then + self:UnregisterEvent("MINIMAP_ZONE_CHANGED") + end + if self.registry["LANGUAGE_LIST_CHANGED"] and self.registry["LANGUAGE_LIST_CHANGED"][self] then + self:UnregisterEvent("LANGUAGE_LIST_CHANGED") + end + collectgarbage('collect') + end + registeringFromAceEvent = true + local f = function() + self.playerLogin = true + self:ScheduleEvent("AceEvent_FullyInitialized", func, 1) + end + self:RegisterEvent("MEETINGSTONE_CHANGED", f, true) + self:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE", function() + self:ScheduleEvent("AceEvent_FullyInitialized", func, 0.05) + end) + self:RegisterEvent("LANGUAGE_LIST_CHANGED", function() + if self.registry["MEETINGSTONE_CHANGED"] and self.registry["MEETINGSTONE_CHANGED"][self] then + registeringFromAceEvent = true + self:UnregisterEvent("MEETINGSTONE_CHANGED") + self:RegisterEvent("MINIMAP_ZONE_CHANGED", f, true) + registeringFromAceEvent = nil + end + end) + self:ScheduleEvent("AceEvent_FullyInitialized", func, 10) + registeringFromAceEvent = nil + end + + registeringFromAceEvent = true + self:RegisterEvent("PLAYER_REGEN_ENABLED") + self:RegisterEvent("PLAYER_REGEN_DISABLED") + inCombat = InCombatLockdown() + registeringFromAceEvent = nil + + self:activate(oldLib, oldDeactivate) + if oldLib then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(AceEvent, MAJOR_VERSION, MINOR_VERSION, activate) diff --git a/libs/AceLibrary/AceLibrary.lua b/libs/AceLibrary/AceLibrary.lua new file mode 100644 index 0000000..d7c78ce --- /dev/null +++ b/libs/AceLibrary/AceLibrary.lua @@ -0,0 +1,702 @@ +--[[ +Name: AceLibrary +Revision: $Rev: 23383 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Iriel (iriel@vigilance-committee.org) + Tekkub (tekkub@gmail.com) + Revision: $Rev: 23383 $ +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceLibrary +SVN: http://svn.wowace.com/root/trunk/Ace2/AceLibrary +Description: Versioning library to handle other library instances, upgrading, + and proper access. + It also provides a base for libraries to work off of, providing + proper error tools. It is handy because all the errors occur in the + file that called it, not in the library file itself. +Dependencies: None +License: LGPL v2.1 +]] + +local ACELIBRARY_MAJOR = "AceLibrary" +local ACELIBRARY_MINOR = "$Revision: 23383 $" + +local _G = getfenv(0) +local previous = _G[ACELIBRARY_MAJOR] +if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end + +local function safecall(func,...) + local success, err = pcall(func,...) + if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end +end + +-- @table AceLibrary +-- @brief System to handle all versioning of libraries. +local AceLibrary = {} +local AceLibrary_mt = {} +setmetatable(AceLibrary, AceLibrary_mt) + +local function error(self, message, ...) + if type(self) ~= "table" then + return _G.error(("Bad argument #1 to `error' (table expected, got %s)"):format(type(self)), 2) + end + + local stack = debugstack() + if not message then + local _,_,second = stack:find("\n(.-)\n") + message = "error raised! " .. second + else + local arg = { ... } -- not worried about table creation, as errors don't happen often + + for i = 1, #arg do + arg[i] = tostring(arg[i]) + end + for i = 1, 10 do + table.insert(arg, "nil") + end + message = message:format(unpack(arg)) + end + + if getmetatable(self) and getmetatable(self).__tostring then + message = ("%s: %s"):format(tostring(self), message) + elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then + message = ("%s: %s"):format(self:GetLibraryVersion(), message) + elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then + message = ("%s: %s"):format(self.class:GetLibraryVersion(), message) + end + + local first = stack:gsub("\n.*", "") + local file = first:gsub(".*\\(.*).lua:%d+: .*", "%1") + file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1") + + + local i = 0 + for s in stack:gmatch("\n([^\n]*)") do + i = i + 1 + if not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then + file = s:gsub("^.*\\(.*).lua:%d+: .*", "%1") + file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1") + break + end + end + local j = 0 + for s in stack:gmatch("\n([^\n]*)") do + j = j + 1 + if j > i and not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then + return _G.error(message, j+1) + end + end + return _G.error(message, 2) +end + +local function assert(self, condition, message, ...) + if not condition then + if not message then + local stack = debugstack() + local _,_,second = stack:find("\n(.-)\n") + message = "assertion failed! " .. second + end + return error(self, message, ...) + end + return condition +end + +local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5) + if type(num) ~= "number" then + return error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num)) + elseif type(kind) ~= "string" then + return error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind)) + end + local errored = false + arg = type(arg) + if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then + local stack = debugstack() + local _,_,func = stack:find("`argCheck'.-([`<].-['>])") + if not func then + _,_,func = stack:find("([`<].-['>])") + end + if kind5 then + return error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg) + elseif kind4 then + return error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg) + elseif kind3 then + return error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg) + elseif kind2 then + return error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg) + else + return error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg) + end + end +end + +local pcall +do + local function check(self, ret, ...) + if not ret then + local s = ... + return error(self, (s:gsub(".-%.lua:%d-: ", ""))) + else + return ... + end + end + + function pcall(self, func, ...) + return check(self, _G.pcall(func, ...)) + end +end + +local recurse = {} +local function addToPositions(t, major) + if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then + rawset(t, recurse, true) + AceLibrary.positions[t] = major + for k,v in pairs(t) do + if type(v) == "table" and not rawget(v, recurse) then + addToPositions(v, major) + end + if type(k) == "table" and not rawget(k, recurse) then + addToPositions(k, major) + end + end + local mt = getmetatable(t) + if mt and not rawget(mt, recurse) then + addToPositions(mt, major) + end + rawset(t, recurse, nil) + end +end + +local function svnRevisionToNumber(text) + if type(text) == "string" then + if text:find("^%$Revision: (%d+) %$$") then + return tonumber((text:gsub("^%$Revision: (%d+) %$$", "%1"))) + elseif text:find("^%$Rev: (%d+) %$$") then + return tonumber((text:gsub("^%$Rev: (%d+) %$$", "%1"))) + elseif text:find("^%$LastChangedRevision: (%d+) %$$") then + return tonumber((text:gsub("^%$LastChangedRevision: (%d+) %$$", "%1"))) + end + elseif type(text) == "number" then + return text + end + return nil +end + +local crawlReplace +do + local recurse = {} + local function func(t, to, from) + if recurse[t] then + return + end + recurse[t] = true + local mt = getmetatable(t) + setmetatable(t, nil) + rawset(t, to, rawget(t, from)) + rawset(t, from, nil) + for k,v in pairs(t) do + if v == from then + t[k] = to + elseif type(v) == "table" then + if not recurse[v] then + func(v, to, from) + end + end + + if type(k) == "table" then + if not recurse[k] then + func(k, to, from) + end + end + end + setmetatable(t, mt) + if mt then + if mt == from then + setmetatable(t, to) + elseif not recurse[mt] then + func(mt, to, from) + end + end + end + function crawlReplace(t, to, from) + func(t, to, from) + for k in pairs(recurse) do + recurse[k] = nil + end + end +end + +-- @function destroyTable +-- @brief remove all the contents of a table +-- @param t table to destroy +local function destroyTable(t) + setmetatable(t, nil) + for k,v in pairs(t) do + t[k] = nil + end +end + +local function isFrame(frame) + return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function" +end + +-- @function copyTable +-- @brief Create a shallow copy of a table and return it. +-- @param from The table to copy from +-- @return A shallow copy of the table +local function copyTable(from) + local to = {} + for k,v in pairs(from) do + to[k] = v + end + setmetatable(to, getmetatable(from)) + return to +end + +-- @function deepTransfer +-- @brief Fully transfer all data, keeping proper previous table +-- backreferences stable. +-- @param to The table with which data is to be injected into +-- @param from The table whose data will be injected into the first +-- @param saveFields If available, a shallow copy of the basic data is saved +-- in here. +-- @param list The account of table references +-- @param list2 The current status on which tables have been traversed. +local deepTransfer +do + -- @function examine + -- @brief Take account of all the table references to be shared + -- between the to and from tables. + -- @param to The table with which data is to be injected into + -- @param from The table whose data will be injected into the first + -- @param list An account of the table references + local function examine(to, from, list, major) + list[from] = to + for k,v in pairs(from) do + if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then + if from[k] == to[k] then + list[from[k]] = to[k] + elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then + list[from[k]] = from[k] + elseif not list[from[k]] then + examine(to[k], from[k], list, major) + end + end + end + return list + end + + function deepTransfer(to, from, saveFields, major, list, list2) + setmetatable(to, nil) + if not list then + list = {} + list2 = {} + examine(to, from, list, major) + end + list2[to] = to + for k,v in pairs(to) do + if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then + if saveFields then + saveFields[k] = v + end + to[k] = nil + elseif v ~= _G then + if saveFields then + saveFields[k] = copyTable(v) + end + end + end + for k in pairs(from) do + if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then + if not list2[to[k]] then + deepTransfer(to[k], from[k], nil, major, list, list2) + end + to[k] = list[to[k]] or list2[to[k]] + else + rawset(to, k, from[k]) + end + end + setmetatable(to, getmetatable(from)) + local mt = getmetatable(to) + if mt then + if list[mt] then + setmetatable(to, list[mt]) + elseif mt.__index and list[mt.__index] then + mt.__index = list[mt.__index] + end + end + destroyTable(from) + end +end + +-- @method TryToLoadStandalone +-- @brief Attempt to find and load a standalone version of the requested library +-- @param major A string representing the major version +-- @return If library is found, return values from the call to LoadAddOn are returned +-- If the library has been requested previously, nil is returned. +local function TryToLoadStandalone(major) + if not AceLibrary.scannedlibs then AceLibrary.scannedlibs = {} end + if AceLibrary.scannedlibs[major] then return end + + AceLibrary.scannedlibs[major] = true + + local name, _, _, enabled, loadable = GetAddOnInfo(major) + if loadable then + return LoadAddOn(name) + end + + for i=1,GetNumAddOns() do + if GetAddOnMetadata(i, "X-AceLibrary-"..major) then + local name, _, _, enabled, loadable = GetAddOnInfo(i) + if loadable then + return LoadAddOn(name) + end + end + end +end + +-- @method IsNewVersion +-- @brief Obtain whether the supplied version would be an upgrade to the +-- current version. This allows for bypass code in library +-- declaration. +-- @param major A string representing the major version +-- @param minor An integer or an svn revision string representing the minor version +-- @return whether the supplied version would be newer than what is +-- currently available. +function AceLibrary:IsNewVersion(major, minor) + argCheck(self, major, 2, "string") + TryToLoadStandalone(major) + + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2) + end + end + argCheck(self, minor, 3, "number") + local data = self.libs[major] + if not data then + return true + end + return data.minor < minor +end + +-- @method HasInstance +-- @brief Returns whether an instance exists. This allows for optional support of a library. +-- @param major A string representing the major version. +-- @param minor (optional) An integer or an svn revision string representing the minor version. +-- @return Whether an instance exists. +function AceLibrary:HasInstance(major, minor) + argCheck(self, major, 2, "string") + TryToLoadStandalone(major) + + if minor then + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2) + end + end + argCheck(self, minor, 3, "number") + if not self.libs[major] then + return + end + return self.libs[major].minor == minor + end + return self.libs[major] and true +end + +-- @method GetInstance +-- @brief Returns the library with the given major/minor version. +-- @param major A string representing the major version. +-- @param minor (optional) An integer or an svn revision string representing the minor version. +-- @return The library with the given major/minor version. +function AceLibrary:GetInstance(major, minor) + argCheck(self, major, 2, "string") + TryToLoadStandalone(major) + + local data = self.libs[major] + if not data then + _G.error(("Cannot find a library instance of %s."):format(major), 2) + return + end + if minor then + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2) + end + end + argCheck(self, minor, 2, "number") + if data.minor ~= minor then + _G.error(("Cannot find a library instance of %s, minor version %d."):format(major, minor), 2) + end + end + return data.instance +end + +-- Syntax sugar. AceLibrary("FooBar-1.0") +AceLibrary_mt.__call = AceLibrary.GetInstance + +local donothing = function() end + +local AceEvent + +-- @method Register +-- @brief Registers a new version of a given library. +-- @param newInstance the library to register +-- @param major the major version of the library +-- @param minor the minor version of the library +-- @param activateFunc (optional) A function to be called when the library is +-- fully activated. Takes the arguments +-- (newInstance [, oldInstance, oldDeactivateFunc]). If +-- oldInstance is given, you should probably call +-- oldDeactivateFunc(oldInstance). +-- @param deactivateFunc (optional) A function to be called by a newer library's +-- activateFunc. +-- @param externalFunc (optional) A function to be called whenever a new +-- library is registered. +function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc) + argCheck(self, newInstance, 2, "table") + argCheck(self, major, 3, "string") + if major ~= ACELIBRARY_MAJOR then + for k,v in pairs(_G) do + if v == newInstance then + geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k)) + end + end + end + if major ~= ACELIBRARY_MAJOR and not major:find("^[%a%-][%a%d%-]*%-%d+%.%d+$") then + _G.error(string.format("Bad argument #3 to `Register'. Must be in the form of \"Name-1.0\". %q is not appropriate", major), 2) + end + if type(minor) == "string" then + local m = svnRevisionToNumber(minor) + if m then + minor = m + else + _G.error(("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2) + end + end + argCheck(self, minor, 4, "number") + if math.floor(minor) ~= minor or minor < 0 then + error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor) + end + argCheck(self, activateFunc, 5, "function", "nil") + argCheck(self, deactivateFunc, 6, "function", "nil") + argCheck(self, externalFunc, 7, "function", "nil") + if not deactivateFunc then + deactivateFunc = donothing + end + local data = self.libs[major] + if not data then + -- This is new + local instance = copyTable(newInstance) + crawlReplace(instance, instance, newInstance) + destroyTable(newInstance) + if AceLibrary == newInstance then + self = instance + AceLibrary = instance + end + self.libs[major] = { + instance = instance, + minor = minor, + deactivateFunc = deactivateFunc, + externalFunc = externalFunc, + } + rawset(instance, 'GetLibraryVersion', function(self) + return major, minor + end) + if not rawget(instance, 'error') then + rawset(instance, 'error', error) + end + if not rawget(instance, 'assert') then + rawset(instance, 'assert', assert) + end + if not rawget(instance, 'argCheck') then + rawset(instance, 'argCheck', argCheck) + end + if not rawget(instance, 'pcall') then + rawset(instance, 'pcall', pcall) + end + addToPositions(instance, major) + if activateFunc then + safecall(activateFunc, instance, nil, nil) -- no old version, so explicit nil + +--[[ if major ~= ACELIBRARY_MAJOR then + for k,v in pairs(_G) do + if v == instance then + geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k)) + end + end + end]] + end + + if externalFunc then + for k,data in pairs(self.libs) do + if k ~= major then + safecall(externalFunc, instance, k, data.instance) + end + end + end + + for k,data in pairs(self.libs) do + if k ~= major and data.externalFunc then + safecall(data.externalFunc, data.instance, major, instance) + end + end + if major == "AceEvent-2.0" then + AceEvent = instance + end + if AceEvent then + AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance) + end + + return instance + end + local instance = data.instance + if minor <= data.minor then + -- This one is already obsolete, raise an error. + _G.error(("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end"):format(major, data.minor, minor, major, minor), 2) + return + end + -- This is an update + local oldInstance = {} + + addToPositions(newInstance, major) + local isAceLibrary = (AceLibrary == newInstance) + local old_error, old_assert, old_argCheck, old_pcall + if isAceLibrary then + self = instance + AceLibrary = instance + + old_error = instance.error + old_assert = instance.assert + old_argCheck = instance.argCheck + old_pcall = instance.pcall + + self.error = error + self.assert = assert + self.argCheck = argCheck + self.pcall = pcall + end + deepTransfer(instance, newInstance, oldInstance, major) + crawlReplace(instance, instance, newInstance) + local oldDeactivateFunc = data.deactivateFunc + data.minor = minor + data.deactivateFunc = deactivateFunc + data.externalFunc = externalFunc + rawset(instance, 'GetLibraryVersion', function(self) + return major, minor + end) + if not rawget(instance, 'error') then + rawset(instance, 'error', error) + end + if not rawget(instance, 'assert') then + rawset(instance, 'assert', assert) + end + if not rawget(instance, 'argCheck') then + rawset(instance, 'argCheck', argCheck) + end + if not rawget(instance, 'pcall') then + rawset(instance, 'pcall', pcall) + end + if isAceLibrary then + for _,v in pairs(self.libs) do + local i = type(v) == "table" and v.instance + if type(i) == "table" then + if not rawget(i, 'error') or i.error == old_error then + rawset(i, 'error', error) + end + if not rawget(i, 'assert') or i.assert == old_assert then + rawset(i, 'assert', assert) + end + if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then + rawset(i, 'argCheck', argCheck) + end + if not rawget(i, 'pcall') or i.pcall == old_pcall then + rawset(i, 'pcall', pcall) + end + end + end + end + if activateFunc then + safecall(activateFunc, instance, oldInstance, oldDeactivateFunc) + +--[[ if major ~= ACELIBRARY_MAJOR then + for k,v in pairs(_G) do + if v == instance then + geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k)) + end + end + end]] + else + safecall(oldDeactivateFunc, oldInstance) + end + oldInstance = nil + + if externalFunc then + for k,data in pairs(self.libs) do + if k ~= major then + safecall(externalFunc, instance, k, data.instance) + end + end + end + + return instance +end + +local iter +function AceLibrary:IterateLibraries() + if not iter then + local function iter(t, k) + k = next(t, k) + if not k then + return nil + else + return k, t[k].instance + end + end + end + return iter, self.libs, nil +end + +-- @function Activate +-- @brief The activateFunc for AceLibrary itself. Called when +-- AceLibrary properly registers. +-- @param self Reference to AceLibrary +-- @param oldLib (optional) Reference to an old version of AceLibrary +-- @param oldDeactivate (optional) Function to deactivate the old lib +local function activate(self, oldLib, oldDeactivate) + AceLibrary = self + if not self.libs then + self.libs = oldLib and oldLib.libs or {} + self.scannedlibs = oldLib and oldLib.scannedlibs or {} + end + if not self.positions then + self.positions = oldLib and oldLib.positions or setmetatable({}, { __mode = "k" }) + end + + -- Expose the library in the global environment + _G[ACELIBRARY_MAJOR] = self + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +if not previous then + previous = AceLibrary +end +if not previous.libs then + previous.libs = {} +end +AceLibrary.libs = previous.libs +if not previous.positions then + previous.positions = setmetatable({}, { __mode = "k" }) +end +AceLibrary.positions = previous.positions +AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate) diff --git a/libs/AceOO-2.0/AceOO-2.0.lua b/libs/AceOO-2.0/AceOO-2.0.lua new file mode 100644 index 0000000..b694b6a --- /dev/null +++ b/libs/AceOO-2.0/AceOO-2.0.lua @@ -0,0 +1,986 @@ +--[[ +Name: AceOO-2.0 +Revision: $Rev: 23383 $ +Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team) +Inspired By: Ace 1.x by Turan (turan@gryphon.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/index.php/AceOO-2.0 +SVN: http://svn.wowace.com/root/trunk/Ace2/AceOO-2.0 +Description: Library to provide an object-orientation framework. +Dependencies: AceLibrary +License: MIT +]] + +local MAJOR_VERSION = "AceOO-2.0" +local MINOR_VERSION = "$Revision: 23383 $" + +-- This ensures the code is only executed if the libary doesn't already exist, or is a newer version +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local AceOO = { + error = AceLibrary.error, + argCheck = AceLibrary.argCheck +} + +-- @function getuid +-- @brief Obtain a unique string identifier for the object in question. +-- @param t The object to obtain the uid for. +-- @return The uid string. +local function pad(cap) + return ("0"):rep(8 - cap:len()) .. cap +end +local function getuid(t) + local mt = getmetatable(t) + setmetatable(t, nil) + local str = tostring(t) + setmetatable(t, mt) + local cap = str:match("[^:]*: 0x(.*)$") + if not cap then + cap = str:match("[^:]*: (.*)$") + end + if cap then + return pad(cap) + end +end + +local function getlibrary(o) + if type(o) == "table" then + return o + elseif type(o) == "string" then + if not AceLibrary:HasInstance(o) then + AceOO:error("Library %q does not exist.", o) + end + return AceLibrary(o) + end +end + +local function deeprawget(self, k) + while true do + local v = rawget(self, k) + if v ~= nil then + return v + end + local mt = getmetatable(self) + if not mt or type(mt.__index) ~= "table" then + return nil + end + self = mt.__index + end +end + +-- @function Factory +-- @brief Construct a factory for the creation of objects. +-- @param obj The object whose init method will be called on the new factory +-- object. +-- @param newobj The object whose init method will be called on the new +-- objects that the Factory creates, to initialize them. +-- @param (...) Arguments which will be passed to obj.init() in addition +-- to the Factory object. +-- @return The new factory which creates a newobj when its new method is called, +-- or when it is called directly (__call metamethod). +local Factory +do + local function getlibraries(...) + if select('#', ...) == 0 then + return + end + return getlibrary((select(1, ...))), getlibraries(select(2, ...)) + end + local arg = {} + local function new(obj, ...) + local t = {} + local uid = getuid(t) + obj:init(t, getlibraries(...)) + t.uid = uid + return t + end + + local function createnew(self, ...) + local o = self.prototype + local x = new(o, getlibraries(...)) + return x + end + + function Factory(obj, newobj, ...) + local t = new(obj, ...) + t.prototype = newobj + t.new = createnew + getmetatable(t).__call = t.new + return t + end +end + + +local function objtostring(self) + if self.ToString then + return self:ToString() + elseif self.GetLibraryVersion then + return (self:GetLibraryVersion()) + elseif self.super then + local s = "Sub-" .. tostring(self.super) + local first = true + if self.interfaces then + for interface in pairs(self.interfaces) do + if first then + s = s .. "(" .. tostring(interface) + first = false + else + s = s .. ", " .. tostring(interface) + end + end + end + if self.mixins then + for mixin in pairs(self.mixins) do + if first then + s = s .. tostring(mixin) + first = false + else + s = s .. ", " .. tostring(mixin) + end + end + end + if first then + if self.uid then + return s .. ":" .. self.uid + else + return s + end + else + return s .. ")" + end + else + return self.uid and 'Subclass:' .. self.uid or 'Subclass' + end +end + +-- @table Object +-- @brief Base of all objects, including Class. +-- +-- @method init +-- @brief Initialize a new object. +-- @param newobject The object to initialize +-- @param class The class to make newobject inherit from +local Object +do + Object = {} + function Object:init(newobject, class) + local parent = class or self + if not rawget(newobject, 'uid') then + newobject.uid = getuid(newobject) + end + local mt = { + __index = parent, + __tostring = objtostring, + } + setmetatable(newobject, mt) + end + Object.uid = getuid(Object) + setmetatable(Object, { __tostring = function() return 'Object' end }) +end + +local Interface + +local function validateInterface(object, interface) + if not object.class and object.prototype then + object = object.prototype + end + for k,v in pairs(interface.interface) do + if tostring(type(object[k])) ~= v then + return false + end + end + if interface.superinterfaces then + for superinterface in pairs(interface.superinterfaces) do + if not validateInterface(object, superinterface) then + return false + end + end + end + if type(object.class) == "table" and rawequal(object.class.prototype, object) then + if not object.class.interfaces then + rawset(object.class, 'interfaces', {}) + end + object.class.interfaces[interface] = true + elseif type(object.class) == "table" and type(object.class.prototype) == "table" then + validateInterface(object.class.prototype, interface) + -- check if class is proper, thus preventing future checks. + end + return true +end + +-- @function inherits +-- @brief Return whether an Object or Class inherits from a given +-- parent. +-- @param object Object or Class to check +-- @param parent Parent to test inheritance from +-- @return whether an Object or Class inherits from a given +-- parent. +local function inherits(object, parent) + object = getlibrary(object) + if type(parent) == "string" then + if not AceLibrary:HasInstance(parent) then + return false + else + parent = AceLibrary(parent) + end + end + AceOO:argCheck(parent, 2, "table") + if type(object) ~= "table" then + return false + end + local current + local class = deeprawget(object, 'class') + if class then + current = class + else + current = object + end + if type(current) ~= "table" then + return false + end + if rawequal(current, parent) then + return true + end + if parent.class then + while true do + if rawequal(current, Object) then + break + end + if current.mixins then + for mixin in pairs(current.mixins) do + if rawequal(mixin, parent) then + return true + end + end + end + if current.interfaces then + for interface in pairs(current.interfaces) do + if rawequal(interface, parent) then + return true + end + end + end + current = deeprawget(current, 'super') + if type(current) ~= "table" then + break + end + end + + local isInterface = false + local curr = parent.class + while true do + if rawequal(curr, Object) then + break + elseif rawequal(curr, Interface) then + isInterface = true + break + end + curr = deeprawget(curr, 'super') + if type(curr) ~= "table" then + break + end + end + return isInterface and validateInterface(object, parent) + else + while true do + if rawequal(current, parent) then + return true + elseif rawequal(current, Object) then + return false + end + current = deeprawget(current, 'super') + if type(current) ~= "table" then + return false + end + end + end +end + +-- @table Class +-- @brief An object factory which sets up inheritence and supports +-- 'mixins'. +-- +-- @metamethod Class call +-- @brief Call ClassFactory:new() to create a new class. +-- +-- @method Class new +-- @brief Construct a new object. +-- @param (...) Arguments to pass to the object init function. +-- @return The new object. +-- +-- @method Class init +-- @brief Initialize a new class. +-- @param parent Superclass. +-- @param (...) Mixins. +-- +-- @method Class ToString +-- @return A string representing the object, in this case 'Class'. +local initStatus +local Class +local Mixin +local autoEmbed = false +local function traverseInterfaces(bit, total) + if bit.superinterfaces then + for interface in pairs(bit.superinterfaces) do + if not total[interface] then + total[interface] = true + traverseInterfaces(interface, total) + end + end + end +end +local class_new +do + Class = Factory(Object, setmetatable({}, {__index = Object}), Object) + Class.super = Object + + local function protostring(t) + return '<' .. tostring(t.class) .. ' prototype>' + end + local function classobjectstring(t) + if t.ToString then + return t:ToString() + elseif t.GetLibraryVersion then + return (t:GetLibraryVersion()) + else + return '<' .. tostring(t.class) .. ' instance>' + end + end + local function classobjectequal(self, other) + if type(self) == "table" and self.Equals then + return self:Equals(other) + elseif type(other) == "table" and other.Equals then + return other:Equals(self) + elseif type(self) == "table" and self.CompareTo then + return self:CompareTo(other) == 0 + elseif type(other) == "table" and other.CompareTo then + return other:CompareTo(self) == 0 + else + return rawequal(self, other) + end + end + local function classobjectlessthan(self, other) + if type(self) == "table" and self.IsLessThan then + return self:IsLessThan(other) + elseif type(other) == "table" and other.IsLessThanOrEqualTo then + return not other:IsLessThanOrEqualTo(self) + elseif type(self) == "table" and self.CompareTo then + return self:CompareTo(other) < 0 + elseif type(other) == "table" and other.CompareTo then + return other:CompareTo(self) > 0 + elseif type(other) == "table" and other.IsLessThan and other.Equals then + return other:Equals(self) or other:IsLessThan(self) + else + AceOO:error("cannot compare two objects") + end + end + local function classobjectlessthanequal(self, other) + if type(self) == "table" and self.IsLessThanOrEqualTo then + return self:IsLessThanOrEqualTo(other) + elseif type(other) == "table" and other.IsLessThan then + return not other:IsLessThan(self) + elseif type(self) == "table" and self.CompareTo then + return self:CompareTo(other) <= 0 + elseif type(other) == "table" and other.CompareTo then + return other:CompareTo(self) >= 0 + elseif type(self) == "table" and self.IsLessThan and self.Equals then + return self:Equals(other) or self:IsLessThan(other) + else + AceOO:error("cannot compare two incompatible objects") + end + end + local function classobjectadd(self, other) + if type(self) == "table" and self.Add then + return self:Add(other) + else + AceOO:error("cannot add two incompatible objects") + end + end + local function classobjectsub(self, other) + if type(self) == "table" and self.Subtract then + return self:Subtract(other) + else + AceOO:error("cannot subtract two incompatible objects") + end + end + local function classobjectunm(self, other) + if type(self) == "table" and self.UnaryNegation then + return self:UnaryNegation(other) + else + AceOO:error("attempt to negate an incompatible object") + end + end + local function classobjectmul(self, other) + if type(self) == "table" and self.Multiply then + return self:Multiply(other) + else + AceOO:error("cannot multiply two incompatible objects") + end + end + local function classobjectdiv(self, other) + if type(self) == "table" and self.Divide then + return self:Divide(other) + else + AceOO:error("cannot divide two incompatible objects") + end + end + local function classobjectpow(self, other) + if type(self) == "table" and self.Exponent then + return self:Exponent(other) + else + AceOO:error("cannot exponentiate two incompatible objects") + end + end + local function classobjectconcat(self, other) + if type(self) == "table" and self.Concatenate then + return self:Concatenate(other) + else + AceOO:error("cannot concatenate two incompatible objects") + end + end + function class_new(self, ...) + if self.virtual then + AceOO:error("Cannot instantiate a virtual class.") + end + + local o = self.prototype + local newobj = {} + if o.class and o.class.instancemeta then + setmetatable(newobj, o.class.instancemeta) + else + Object:init(newobj, o) + end + + if self.interfaces and not self.interfacesVerified then + -- Verify the interfaces + + for interface in pairs(self.interfaces) do + for field,kind in pairs(interface.interface) do + if tostring(type(newobj[field])) ~= kind then + AceOO:error("Class did not satisfy all interfaces. %q is required to be a %s. It is a %s", field, kind, tostring(type(newobj[field]))) + end + end + end + self.interfacesVerified = true + end + local tmp = initStatus + initStatus = newobj + newobj:init(...) + if initStatus then + initStatus = tmp + AceOO:error("Initialization not completed, be sure to call the superclass's init method.") + return + end + initStatus = tmp + return newobj + end + local classmeta = { + __tostring = objtostring, + __call = function(self, ...) + return self:new(...) + end, + } + function Class:init(newclass, parent, ...) + parent = parent or self + + local total + + if parent.class then + total = { parent, ... } + parent = self + else + total = { ... } + end + if not inherits(parent, Class) then + AceOO:error("Classes must inherit from a proper class") + end + if parent.sealed then + AceOO:error("Cannot inherit from a sealed class") + end + for i,v in ipairs(total) do + if inherits(v, Mixin) and v.class then + if v.__deprecated then + AceOO:error(v.__deprecated) + end + if not newclass.mixins then + newclass.mixins = {} + end + if newclass.mixins[v] then + AceOO:error("Cannot explicitly inherit from the same mixin twice") + end + newclass.mixins[v] = true + elseif inherits(v, Interface) and v.class then + if not newclass.interfaces then + newclass.interfaces = {} + end + if newclass.interfaces[v] then + AceOO:error("Cannot explicitly inherit from the same interface twice") + end + newclass.interfaces[v] = true + else + AceOO:error("Classes can only inherit from one or zero classes and any number of mixins or interfaces") + end + end + if parent.interfaces then + if not newclass.interfaces then + newclass.interfaces = {} + end + for interface in pairs(parent.interfaces) do + newclass.interfaces[interface] = true + end + end + for k in pairs(total) do + total[k] = nil + end + + newclass.super = parent + + newclass.prototype = setmetatable(total, { + __index = parent.prototype, + __tostring = protostring, + }) + total = nil + + newclass.instancemeta = { + __index = newclass.prototype, + __tostring = classobjectstring, + __eq = classobjectequal, + __lt = classobjectlessthan, + __le = classobjectlessthanequal, + __add = classobjectadd, + __sub = classobjectsub, + __unm = classobjectunm, + __mul = classobjectmul, + __div = classobjectdiv, + __pow = classobjectpow, + __concat = classobjectconcat, + } + + setmetatable(newclass, classmeta) + + newclass.new = class_new + + if newclass.mixins then + -- Fold in the mixins + local err, msg + for mixin in pairs(newclass.mixins) do + local ret + autoEmbed = true + ret, msg = pcall(mixin.embed, mixin, newclass.prototype) + autoEmbed = false + if not ret then + err = true + break + end + end + + if err then + local pt = newclass.prototype + for k,v in pairs(pt) do + pt[k] = nil + end + + -- method conflict + AceOO:error(msg) + end + end + + newclass.prototype.class = newclass + + if newclass.interfaces then + for interface in pairs(newclass.interfaces) do + traverseInterfaces(interface, newclass.interfaces) + end + end + if newclass.mixins then + for mixin in pairs(newclass.mixins) do + if mixin.interfaces then + if not newclass.interfaces then + newclass.interfaces = {} + end + for interface in pairs(mixin.interfaces) do + newclass.interfaces[interface] = true + end + end + end + end + end + function Class:ToString() + if type(self.GetLibraryVersion) == "function" then + return (self:GetLibraryVersion()) + else + return "Class" + end + end + + local tmp + function Class.prototype:init() + if rawequal(self, initStatus) then + initStatus = nil + else + AceOO:error("Improper self passed to init. You must do MyClass.super.prototype.init(self, ...)", 2) + end + self.uid = getuid(self) + local current = self.class + while true do + if current == Class then + break + end + if current.mixins then + for mixin in pairs(current.mixins) do + if type(mixin.OnInstanceInit) == "function" then + mixin:OnInstanceInit(self) + end + end + end + current = current.super + end + end +end + + +-- @object ClassFactory +-- @brief A factory for creating classes. Rarely used directly. +local ClassFactory = Factory(Object, Class, Object) + +function Class:new(...) + local x = ClassFactory:new(...) + if AceOO.classes then + AceOO.classes[x] = true + end + return x +end +getmetatable(Class).__call = Class.new + +-- @class Mixin +-- @brief A class to create mixin objects, which contain methods that get +-- "mixed in" to class prototypes. +-- +-- @object Mixin prototype +-- @brief The prototype that mixin objects inherit their methods from. +-- +-- @method Mixin prototype embed +-- @brief Mix in the methods of our object which are listed in our interface +-- to the supplied target table. +-- +-- @method Mixin prototype init +-- @brief Initialize the mixin object. +-- @param newobj The new object we're initializing. +-- @param interface The interface we implement (the list of methods our +-- prototype provides which should be mixed into the target +-- table by embed). +do + Mixin = Class() + function Mixin:ToString() + if self.GetLibraryVersion then + return (self:GetLibraryVersion()) + else + return 'Mixin' + end + end + local function _Embed(state, field, target) + field = next(state.export, field) + if field == nil then + return + end + + if rawget(target, field) or (target[field] and target[field] ~= state[field]) then + AceOO:error("Method conflict in attempt to mixin. Field %q", field) + end + + target[field] = state[field] + + local ret,msg = pcall(_Embed, state, field, target) + if not ret then + -- Mix in the next method according to the defined interface. If that + -- fails due to a conflict, re-raise to back out the previous mixed + -- methods. + + target[field] = nil + AceOO:error(msg) + end + end + function Mixin.prototype:embed(target) + if self.__deprecated then + AceOO:error(self.__deprecated) + end + local mt = getmetatable(target) + setmetatable(target, nil) + local err, msg = pcall(_Embed, self, nil, target) + if not err then + setmetatable(target, mt) + AceOO:error(msg) + return + end + if type(self.embedList) == "table" then + self.embedList[target] = true + end + if type(target.class) ~= "table" then + target[self] = true + end + if not autoEmbed and type(self.OnManualEmbed) == "function" then + self:OnManualEmbed(target) + end + setmetatable(target, mt) + end + + function Mixin.prototype:activate(oldLib, oldDeactivate) + if oldLib and oldLib.embedList then + for target in pairs(oldLib.embedList) do + local mt = getmetatable(target) + setmetatable(target, nil) + for field in pairs(oldLib.export) do + target[field] = nil + end + setmetatable(target, mt) + end + self.embedList = oldLib.embedList + for target in pairs(self.embedList) do + self:embed(target) + end + else + self.embedList = setmetatable({}, {__mode="k"}) + end + end + + function Mixin.prototype:init(export, ...) + AceOO:argCheck(export, 2, "table") + for k,v in pairs(export) do + if type(k) ~= "number" then + AceOO:error("All keys to argument #2 must be numbers.") + elseif type(v) ~= "string" then + AceOO:error("All values to argument #2 must be strings.") + end + end + local num = #export + for i = 1, num do + local v = export[i] + export[i] = nil + export[v] = true + end + + local interfaces + if select('#', ...) >= 1 then + interfaces = { ... } + for i,v in ipairs(interfaces) do + v = getlibrary(v) + interfaces[i] = v + if not v.class or not inherits(v, Interface) then + AceOO:error("Mixins can inherit only from interfaces") + end + end + local num = #interfaces + for i = 1, num do + local v = interfaces[i] + interfaces[i] = nil + interfaces[v] = true + end + for interface in pairs(interfaces) do + traverseInterfaces(interface, interfaces) + end + for interface in pairs(interfaces) do + for field,kind in pairs(interface.interface) do + if kind ~= "nil" then + local good = false + for bit in pairs(export) do + if bit == field then + good = true + break + end + end + if not good then + AceOO:error("Mixin does not fully accommodate field %q", field) + end + end + end + end + end + self.super = Mixin.prototype + Mixin.super.prototype.init(self) + self.export = export + self.interfaces = interfaces + end +end + +-- @class Interface +-- @brief A class to create interfaces, which contain contracts that classes +-- which inherit from this must comply with. +-- +-- @object Interface prototype +-- @brief The prototype that interface objects must adhere to. +-- +-- @method Interface prototype init +-- @brief Initialize the mixin object. +-- @param interface The interface we contract (the hash of fields forced). +-- @param (...) Superinterfaces +do + Interface = Class() + function Interface:ToString() + if self.GetLibraryVersion then + return (self:GetLibraryVersion()) + else + return 'Instance' + end + end + function Interface.prototype:init(interface, ...) + Interface.super.prototype.init(self) + AceOO:argCheck(interface, 2, "table") + for k,v in pairs(interface) do + if type(k) ~= "string" then + AceOO:error("All keys to argument #2 must be numbers.") + elseif type(v) ~= "string" then + AceOO:error("All values to argument #2 must be strings.") + elseif v ~= "nil" and v ~= "string" and v ~= "number" and v ~= "table" and v ~= "function" then + AceOO:error('All values to argument #2 must either be "nil", "string", "number", "table", or "function".') + end + end + if select('#', ...) >= 1 then + self.superinterfaces = { ... } + for i,v in ipairs(self.superinterfaces) do + v = getlibrary(v) + self.superinterfaces[i] = v + if not inherits(v, Interface) or not v.class then + AceOO:error('Cannot provide a non-Interface to inherit from') + end + end + local num = #self.superinterfaces + for i = 1, num do + local v = self.superinterfaces[i] + self.superinterfaces[i] = nil + self.superinterfaces[v] = true + end + end + self.interface = interface + end +end + +-- @function Classpool +-- @brief Obtain a read only class from our pool of classes, indexed by the +-- superclass and mixins. +-- @param sc The superclass of the class we want. +-- @param (m1..m20) Mixins of the class we want's objects. +-- @return A read only class from the class pool. +local Classpool +do + local pool = setmetatable({}, {__mode = 'v'}) + local function newindex(k, v) + AceOO:error('Attempt to modify a read-only class.') + end + local function protonewindex(k, v) + AceOO:error('Attempt to modify a read-only class prototype.') + end + local function ts(bit) + if type(bit) ~= "table" then + return tostring(bit) + elseif getmetatable(bit) and bit.__tostring then + return tostring(bit) + elseif type(bit.GetLibraryVersion) == "function" then + return bit:GetLibraryVersion() + else + return tostring(bit) + end + end + local t = {} + local function getcomplexuid(sc, ...) + if sc then + if sc.uid then + table.insert(t, sc.uid) + else + AceOO:error("%s is not an appropriate class/mixin", ts(sc)) + end + end + for i = 1, select('#', ...) do + local m = select(i, ...) + if m.uid then + table.insert(t, m.uid) + else + AceOO:error("%s is not an appropriate mixin", ts(m)) + end + end + table.sort(t) + local uid = table.concat(t, '') + local num = #t + for i = 1, num do + t[i] = nil + end + return uid + end + local classmeta + local arg = {} + function Classpool(superclass, ...) + local l = getlibrary + superclass = getlibrary(superclass) + arg = { ... } + for i, v in ipairs(arg) do + arg[i] = getlibrary(v) + end + if superclass then + if superclass.class then -- mixin + table.insert(arg, 1, superclass) + superclass = Class + end + else + superclass = Class + end + local key = getcomplexuid(superclass, unpack(arg)) + if not pool[key] then + local class = Class(superclass, unpack(arg)) + if not classmeta then + classmeta = {} + local mt = getmetatable(class) + for k,v in pairs(mt) do + classmeta[k] = v + end + classmeta.__newindex = newindex + end + -- Prevent the user from adding methods to this class. + -- NOTE: I'm not preventing modifications of existing class members, + -- but it's likely that only a truly malicious user will be doing so. + class.sealed = true + setmetatable(class, classmeta) + getmetatable(class.prototype).__newindex = protonewindex + pool[key] = class + end + return pool[key] + end +end + +AceOO.Factory = Factory +AceOO.Object = Object +AceOO.Class = Class +AceOO.Mixin = Mixin +AceOO.Interface = Interface +AceOO.Classpool = Classpool +AceOO.inherits = inherits + +-- Library handling bits + +local function activate(self, oldLib, oldDeactivate) + AceOO = self + Factory = self.Factory + Object = self.Object + Class = self.Class + ClassFactory.prototype = Class + Mixin = self.Mixin + Interface = self.Interface + Classpool = self.Classpool + + if oldLib then + self.classes = oldLib.classes + end + if not self.classes then + self.classes = setmetatable({}, {__mode="k"}) + else + for class in pairs(self.classes) do + class.new = class_new + end + end + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(AceOO, MAJOR_VERSION, MINOR_VERSION, activate) +AceOO = AceLibrary(MAJOR_VERSION) diff --git a/libs/Banzai-1.1/Banzai-1.1.lua b/libs/Banzai-1.1/Banzai-1.1.lua new file mode 100644 index 0000000..76d563f --- /dev/null +++ b/libs/Banzai-1.1/Banzai-1.1.lua @@ -0,0 +1,217 @@ +--[[ +Name: Banzai-1.1 +Revision: $Rev: 21576 $ +Author(s): Rabbit (rabbit.magtheridon@gmail.com), maia +Documentation: http://www.wowace.com/index.php/Banzai-1.1_API_Documentation +SVN: http://svn.wowace.com/wowace/trunk/BanzaiLib/Banzai-1.1 +Description: Aggro notification library. +Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0, Roster-2.1 +]] + +--[[ +BanzaiLib is copyrighted 2006 by Rabbit. + +This addon is distributed under the terms of the Creative Commons +Attribution-NonCommercial-ShareAlike 2.0 license. + +http://creativecommons.org/licenses/by-nc-sa/2.5/ + +You may distribute and use these libraries without making your mod adhere to the +same license, as long as you preserve the license text embedded in the +libraries. + +Any and all questions regarding our stance and licensing should be +directed to the #wowace IRC channel on irc.freenode.net. +]] + +------------------------------------------------------------------------------- +-- Locals +------------------------------------------------------------------------------- + +local MAJOR_VERSION = "Banzai-1.1" +local MINOR_VERSION = "$Revision: 21576 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +if AceLibrary:HasInstance("Banzai-1.0") then error(MAJOR_VERSION .. " can't run alongside Banzai-1.0.") end +if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0.") end +if not AceLibrary:HasInstance("AceEvent-2.0") then error(MAJOR_VERSION .. " requires AceEvent-2.0.") end +if not AceLibrary:HasInstance("Roster-2.1") then error(MAJOR_VERSION .. " requires Roster-2.1.") end + +local lib = {} +AceLibrary("AceEvent-2.0"):embed(lib) + +local RL = nil +local roster = nil +local playerName = nil + +------------------------------------------------------------------------------- +-- Local heap +------------------------------------------------------------------------------- + +local new, del +do + local cache = setmetatable({},{__mode='k'}) + function new() + local t = next(cache) + if t then + cache[t] = nil + return t + else + return {} + end + end + function del(t) + for k in pairs(t) do + t[k] = nil + end + cache[t] = true + return nil + end +end + +------------------------------------------------------------------------------- +-- Initialization +------------------------------------------------------------------------------- + +-- Activate a new instance of this library +function activate(self, oldLib, oldDeactivate) + if oldLib then + self.vars = oldLib.vars + if oldLib:IsEventScheduled("UpdateAggroList") then + oldLib:CancelScheduledEvent("UpdateAggroList") + self:StartOrStop() + end + else + self.vars = {} + end + + RL = AceLibrary("Roster-2.1") + roster = RL.roster + playerName = UnitName("player") + + if not self.vars then self.vars = {} end + + self:RegisterEvent("AceEvent_EventRegistered", "StartOrStop") + self:RegisterEvent("AceEvent_EventUnregistered", "StartOrStop") + + if oldDeactivate then oldDeactivate(oldLib) end +end + +------------------------------------------------------------------------------- +-- Events +------------------------------------------------------------------------------- + +function lib:StartOrStop() + local aceEvent = AceLibrary("AceEvent-2.0") + if aceEvent:IsEventRegistered("Banzai_UnitGainedAggro") or + aceEvent:IsEventRegistered("Banzai_PlayerGainedAggro") or + aceEvent:IsEventRegistered("Banzai_UnitLostAggro") or + aceEvent:IsEventRegistered("Banzai_PlayerLostAggro") or + aceEvent:IsEventRegistered("Banzai_Run") then + if not self:IsEventScheduled("UpdateAggroList") then + self:ScheduleRepeatingEvent("UpdateAggroList", self.UpdateAggroList, 0.2, self) + self.vars.running = true + self:TriggerEvent("Banzai_Enabled") + end + elseif self:IsEventRegistered("UpdateAggroList") then + self:CancelScheduledEvent("UpdateAggroList") + for i, unit in pairs(roster) do + unit.banzai = nil + unit.banzaiModifier = nil + end + self.vars.running = nil + self:TriggerEvent("Banzai_Disabled") + end +end + +------------------------------------------------------------------------------- +-- Library +------------------------------------------------------------------------------- + +function lib:UpdateAggroList() + local oldBanzai = nil + + for name, unit in pairs(roster) do + if not oldBanzai then oldBanzai = new() end + oldBanzai[name] = unit.banzai + + -- deduct aggro for all, increase it later for everyone with aggro + if not unit.banzaiModifier then unit.banzaiModifier = 0 end + unit.banzaiModifier = math.max(0, unit.banzaiModifier - 5) + + -- check for aggro + local targetId = unit.unitid .. "target" + if UnitExists(targetId) and UnitExists(targetId .. "target") then + local targetName = UnitName(targetId .. "target") + if roster[targetName] and UnitCanAttack("player", targetId) and UnitCanAttack(targetId, "player") then + if not roster[targetName].banzaiModifier then roster[targetName].banzaiModifier = 0 end + roster[targetName].banzaiModifier = roster[targetName].banzaiModifier + 10 + if not roster[targetName].banzaiTarget then roster[targetName].banzaiTarget = new() end + table.insert(roster[targetName].banzaiTarget, targetId) + end + end + + -- cleanup + unit.banzaiModifier = math.max(0, unit.banzaiModifier) + unit.banzaiModifier = math.min(25, unit.banzaiModifier) + + -- set aggro + unit.banzai = (unit.banzaiModifier > 15) + end + + for name, unit in pairs(roster) do + if oldBanzai[name] ~= nil and oldBanzai[name] ~= unit.banzai then + -- Aggro status has changed. + if unit.banzai == true and unit.banzaiTarget then + -- Unit has aggro + self:TriggerEvent("Banzai_UnitGainedAggro", unit.unitid, unit.banzaiTarget) + if name == playerName then + self:TriggerEvent("Banzai_PlayerGainedAggro", unit.banzaiTarget) + end + elseif unit.banzai == false then + -- Unit lost aggro + self:TriggerEvent("Banzai_UnitLostAggro", unit.unitid) + if name == playerName then + self:TriggerEvent("Banzai_PlayerLostAggro", unit.unitid) + end + end + end + if unit.banzaiTarget then + unit.banzaiTarget = del(unit.banzaiTarget) + end + end + + if oldBanzai then + oldBanzai = del(oldBanzai) + end +end + +------------------------------------------------------------------------------- +-- API +------------------------------------------------------------------------------- + +function lib:GetUnitAggroByUnitId( unitId ) + if not self.vars.running then error(MAJOR_VERSION.." is not running. You must register for one of the events.") end + local rosterUnit = RL:GetUnitObjectFromUnit(unitId) + if not rosterUnit then return nil end + return rosterUnit.banzai +end + +function lib:GetUnitAggroByUnitName( unitName ) + if not self.vars.running then error(MAJOR_VERSION.." is not running. You must register for one of the events.") end + local rosterUnit = RL:GetUnitObjectFromName(unitName) + if not rosterUnit then return nil end + return rosterUnit.banzai +end + +function lib:IsRunning() + return self:IsEventScheduled("UpdateAggroList") +end + +------------------------------------------------------------------------------- +-- Register +------------------------------------------------------------------------------- +AceLibrary:Register(lib, MAJOR_VERSION, MINOR_VERSION, activate) + diff --git a/libs/Dewdrop-2.0/Dewdrop-2.0.lua b/libs/Dewdrop-2.0/Dewdrop-2.0.lua new file mode 100644 index 0000000..9c917a1 --- /dev/null +++ b/libs/Dewdrop-2.0/Dewdrop-2.0.lua @@ -0,0 +1,2983 @@ +--[[ +Name: Dewdrop-2.0 +Revision: $Rev: 23612 $ +Author(s): ckknight (ckknight@gmail.com) +Website: http://ckknight.wowinterface.com/ +Documentation: http://wiki.wowace.com/index.php/Dewdrop-2.0 +SVN: http://svn.wowace.com/root/trunk/DewdropLib/Dewdrop-2.0 +Description: A library to provide a clean dropdown menu interface. +Dependencies: AceLibrary +License: LGPL v2.1 +]] + +local MAJOR_VERSION = "Dewdrop-2.0" +local MINOR_VERSION = "$Revision: 23612 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local Dewdrop = {} + +local CLOSE = "Close" +local CLOSE_DESC = "Close the menu." +local VALIDATION_ERROR = "Validation error." +local RESET_KEYBINDING_DESC = "Hit escape to clear the keybinding." +local KEY_BUTTON1 = "Left Mouse" +local KEY_BUTTON2 = "Right Mouse" +local DISABLED = "Disabled" +local DEFAULT_CONFIRM_MESSAGE = "Are you sure you want to perform `%s'?" + +if GetLocale() == "deDE" then + CLOSE = "Schlie\195\159en" + CLOSE_DESC = "Men\195\188 schlie\195\159en." + VALIDATION_ERROR = "Validierungsfehler." + RESET_KEYBINDING_DESC = "Escape dr\195\188cken, um die Tastenbelegung zu l\195\182schen." + KEY_BUTTON1 = "Linke Maustaste" + KEY_BUTTON2 = "Rechte Maustaste" + DISABLED = "Deaktiviert" +elseif GetLocale() == "koKR" then + CLOSE = "닫기" + CLOSE_DESC = "메뉴를 닫습니다." +elseif GetLocale() == "frFR" then + CLOSE = "Fermer" + CLOSE_DESC = "Ferme le menu." + VALIDATION_ERROR = "Erreur de validation." + RESET_KEYBINDING_DESC = "Appuyez sur la touche Echappement pour effacer le raccourci." +elseif GetLocale() == "esES" then + CLOSE = "Cerrar" + CLOSE_DESC = "Cierra el men\195\186." + VALIDATION_ERROR = "Error de validaci\195\179n" + RESET_KEYBINDING_DESC = "Pulsa Escape para limpiar la asignaci\195\179n de tecla." +end + +Dewdrop.KEY_BUTTON1 = KEY_BUTTON1 +Dewdrop.KEY_BUTTON2 = KEY_BUTTON2 + +local function new(...) + local t = {} + for i = 1, select('#', ...), 2 do + local k = select(i, ...) + if k then + t[k] = select(i+1, ...) + else + break + end + end + return t +end + +local tmp +do + local t = {} + function tmp(...) + for k in pairs(t) do + t[k] = nil + end + for i = 1, select('#', ...), 2 do + local k = select(i, ...) + if k then + t[k] = select(i+1, ...) + else + break + end + end + return t + end +end +local tmp2 +do + local t = {} + function tmp2(...) + for k in pairs(t) do + t[k] = nil + end + for i = 1, select('#', ...), 2 do + local k = select(i, ...) + if k then + t[k] = select(i+1, ...) + else + break + end + end + return t + end +end +local levels +local buttons + +local function GetScaledCursorPosition() + local x, y = GetCursorPosition() + local scale = UIParent:GetEffectiveScale() + return x / scale, y / scale +end + +local function StartCounting(self, level) + for i = level, 1, -1 do + if levels[i] then + levels[i].count = 3 + end + end +end + +local function StopCounting(self, level) + for i = level, 1, -1 do + if levels[i] then + levels[i].count = nil + end + end +end + +local function OnUpdate(self, elapsed) + for _,level in ipairs(levels) do + local count = level.count + if count then + count = count - elapsed + if count < 0 then + level.count = nil + self:Close(level.num) + else + level.count = count + end + end + end +end + +local function CheckDualMonitor(self, frame) + local ratio = GetScreenWidth() / GetScreenHeight() + if ratio >= 2.4 and frame:GetRight() > GetScreenWidth() / 2 and frame:GetLeft() < GetScreenWidth() / 2 then + local offsetx + if GetCursorPosition() / GetScreenHeight() * 768 < GetScreenWidth() / 2 then + offsetx = GetScreenWidth() / 2 - frame:GetRight() + else + offsetx = GetScreenWidth() / 2 - frame:GetLeft() + end + local point, parent, relativePoint, x, y = frame:GetPoint(1) + frame:SetPoint(point, parent, relativePoint, (x or 0) + offsetx, y or 0) + end +end + +local function CheckSize(self, level) + if not level.buttons then + return + end + local height = 20 + for _, button in ipairs(level.buttons) do + height = height + button:GetHeight() + end + level:SetHeight(height) + local width = 160 + for _, button in ipairs(level.buttons) do + local extra = 1 + if button.hasArrow or button.hasColorSwatch then + extra = extra + 16 + end + if not button.notCheckable then + extra = extra + 24 + end + button.text:SetFont(STANDARD_TEXT_FONT, button.textHeight) + if button.text:GetWidth() + extra > width then + width = button.text:GetWidth() + extra + end + end + level:SetWidth(width + 20) + if level:GetLeft() and level:GetRight() and level:GetTop() and level:GetBottom() and (level:GetLeft() < 0 or level:GetRight() > GetScreenWidth() or level:GetTop() > GetScreenHeight() or level:GetBottom() < 0) then + level:ClearAllPoints() + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + level:SetPoint("TOPLEFT", level.parent or level:GetParent(), "TOPRIGHT", 5, 10) + else + level:SetPoint("BOTTOMLEFT", level.parent or level:GetParent(), "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + level:SetPoint("TOPRIGHT", level.parent or level:GetParent(), "TOPLEFT", -5, 10) + else + level:SetPoint("BOTTOMRIGHT", level.parent or level:GetParent(), "BOTTOMLEFT", -5, -10) + end + end + end + local dirty = false + if not level:GetRight() then + self:Close() + return + end + if level:GetRight() > GetScreenWidth() and level.lastDirection == "RIGHT" then + level.lastDirection = "LEFT" + dirty = true + elseif level:GetLeft() < 0 and level.lastDirection == "LEFT" then + level.lastDirection = "RIGHT" + dirty = true + end + if level:GetTop() > GetScreenHeight() and level.lastVDirection == "UP" then + level.lastVDirection = "DOWN" + dirty = true + elseif level:GetBottom() < 0 and level.lastVDirection == "DOWN" then + level.lastVDirection = "UP" + dirty = true + end + if dirty then + level:ClearAllPoints() + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + level:SetPoint("TOPLEFT", level.parent or level:GetParent(), "TOPRIGHT", 5, 10) + else + level:SetPoint("BOTTOMLEFT", level.parent or level:GetParent(), "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + level:SetPoint("TOPRIGHT", level.parent or level:GetParent(), "TOPLEFT", -5, 10) + else + level:SetPoint("BOTTOMRIGHT", level.parent or level:GetParent(), "BOTTOMLEFT", -5, -10) + end + end + end + if level:GetTop() > GetScreenHeight() then + local top = level:GetTop() + local point, parent, relativePoint, x, y = level:GetPoint(1) + level:ClearAllPoints() + level:SetPoint(point, parent, relativePoint, x or 0, (y or 0) + GetScreenHeight() - top) + elseif level:GetBottom() < 0 then + local bottom = level:GetBottom() + local point, parent, relativePoint, x, y = level:GetPoint(1) + level:ClearAllPoints() + level:SetPoint(point, parent, relativePoint, x or 0, (y or 0) - bottom) + end + CheckDualMonitor(self, level) + if mod(level.num, 5) == 0 then + local left, bottom = level:GetLeft(), level:GetBottom() + level:ClearAllPoints() + level:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom) + end +end + +local Open +local OpenSlider +local OpenEditBox +local Refresh +local Clear +local function ReleaseButton(self, level, index) + if not level.buttons then + return + end + if not level.buttons[index] then + return + end + local button = level.buttons[index] + button:Hide() + if button.highlight then + button.highlight:Hide() + end +-- button.arrow:SetVertexColor(1, 1, 1) +-- button.arrow:SetHeight(16) +-- button.arrow:SetWidth(16) + table.remove(level.buttons, index) + table.insert(buttons, button) + for k in pairs(button) do + if k ~= 0 and k ~= "text" and k ~= "check" and k ~= "arrow" and k ~= "colorSwatch" and k ~= "highlight" and k ~= "radioHighlight" then + button[k] = nil + end + end + return true +end + +local function Scroll(self, level, down) + if down then + if level:GetBottom() < 0 then + local point, parent, relativePoint, x, y = level:GetPoint(1) + level:SetPoint(point, parent, relativePoint, x, y + 50) + if level:GetBottom() > 0 then + level:SetPoint(point, parent, relativePoint, x, y + 50 - level:GetBottom()) + end + end + else + if level:GetTop() > GetScreenHeight() then + local point, parent, relativePoint, x, y = level:GetPoint(1) + level:SetPoint(point, parent, relativePoint, x, y - 50) + if level:GetTop() < GetScreenHeight() then + level:SetPoint(point, parent, relativePoint, x, y - 50 + GetScreenHeight() - level:GetTop()) + end + end + end +end + +local function getArgs(t, str, num, ...) + local x = t[str .. num] + if x == nil then + return ... + else + return x, getArgs(t, str, num + 1, ...) + end +end + +local sliderFrame +local editBoxFrame + +local function showGameTooltip(this) + if this.tooltipTitle or this.tooltipText then + GameTooltip_SetDefaultAnchor(GameTooltip, this) + local disabled = not this.isTitle and this.disabled + if this.tooltipTitle then + if disabled then + GameTooltip:SetText(this.tooltipTitle, 0.5, 0.5, 0.5, 1) + else + GameTooltip:SetText(this.tooltipTitle, 1, 1, 1, 1) + end + if this.tooltipText then + if disabled then + GameTooltip:AddLine(this.tooltipText, (NORMAL_FONT_COLOR.r + 0.5) / 2, (NORMAL_FONT_COLOR.g + 0.5) / 2, (NORMAL_FONT_COLOR.b + 0.5) / 2, 1) + else + GameTooltip:AddLine(this.tooltipText, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1) + end + end + else + if disabled then + GameTooltip:SetText(this.tooltipText, 0.5, 0.5, 0.5, 1) + else + GameTooltip:SetText(this.tooltipText, 1, 1, 1, 1) + end + end + GameTooltip:Show() + end + if this.tooltipFunc then + GameTooltip:SetOwner(this, "ANCHOR_NONE") + GameTooltip:SetPoint("TOPLEFT", this, "TOPRIGHT", 5, 0) + this.tooltipFunc(getArgs(this, 'tooltipArg', 1)) + GameTooltip:Show() + end +end + +local tmpt = setmetatable({}, {mode='v'}) +local numButtons = 0 +local function AcquireButton(self, level) + if not levels[level] then + return + end + level = levels[level] + if not level.buttons then + level.buttons = {} + end + local button + if #buttons == 0 then + numButtons = numButtons + 1 + button = CreateFrame("Button", "Dewdrop20Button" .. numButtons, nil) + button:SetFrameStrata("FULLSCREEN_DIALOG") + button:SetHeight(16) + local highlight = button:CreateTexture(nil, "BACKGROUND") + highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") + button.highlight = highlight + highlight:SetBlendMode("ADD") + highlight:SetAllPoints(button) + highlight:Hide() + local check = button:CreateTexture(nil, "ARTWORK") + button.check = check + check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") + check:SetPoint("CENTER", button, "LEFT", 12, 0) + check:SetWidth(24) + check:SetHeight(24) + local radioHighlight = button:CreateTexture(nil, "ARTWORK") + button.radioHighlight = radioHighlight + radioHighlight:SetTexture("Interface\\Buttons\\UI-RadioButton") + radioHighlight:SetAllPoints(check) + radioHighlight:SetBlendMode("ADD") + radioHighlight:SetTexCoord(0.5, 0.75, 0, 1) + radioHighlight:Hide() + button:SetScript("OnEnter", function() + if (sliderFrame and sliderFrame:IsShown() and sliderFrame.mouseDown and sliderFrame.level == this.level.num + 1) or (editBoxFrame and editBoxFrame:IsShown() and editBoxFrame.mouseDown and editBoxFrame.level == this.level.num + 1) then + for i = 1, this.level.num do + Refresh(self, levels[i]) + end + return + end + self:Close(this.level.num + 1) + if not this.disabled then + if this.hasSlider then + OpenSlider(self, this) + elseif this.hasEditBox then + OpenEditBox(self, this) + elseif this.hasArrow then + Open(self, this, nil, this.level.num + 1, this.value) + end + end + if not this.level then -- button reclaimed + return + end + StopCounting(self, this.level.num + 1) + if not this.disabled then + highlight:Show() + if this.isRadio then + button.radioHighlight:Show() + end + end + showGameTooltip(this) + end) + button:SetScript("OnLeave", function() + if not this.selected then + highlight:Hide() + end + button.radioHighlight:Hide() + if this.level then + StartCounting(self, this.level.num) + end + GameTooltip:Hide() + end) + local first = true + button:SetScript("OnClick", function() + if not this.disabled then + if this.hasColorSwatch then + local func = button.colorFunc + local hasOpacity = this.hasOpacity + local this = this + for k in pairs(tmpt) do + tmpt[k] = nil + end + for i = 1, 1000 do + local x = this['colorArg'..i] + if x == nil then + break + else + tmpt[i] = x + end + end + ColorPickerFrame.func = function() + if func then + local r,g,b = ColorPickerFrame:GetColorRGB() + local a = hasOpacity and 1 - OpacitySliderFrame:GetValue() or nil + local n = #tmpt + tmpt[n+1] = r + tmpt[n+2] = g + tmpt[n+3] = b + tmpt[n+4] = a + func(unpack(tmpt)) + tmpt[n+1] = nil + tmpt[n+2] = nil + tmpt[n+3] = nil + tmpt[n+4] = nil + end + end + ColorPickerFrame.hasOpacity = this.hasOpacity + ColorPickerFrame.opacityFunc = ColorPickerFrame.func + ColorPickerFrame.opacity = 1 - this.opacity + ColorPickerFrame:SetColorRGB(this.r, this.g, this.b) + local r, g, b, a = this.r, this.g, this.b, this.opacity + ColorPickerFrame.cancelFunc = function() + if func then + local n = #tmpt + tmpt[n+1] = r + tmpt[n+2] = g + tmpt[n+3] = b + tmpt[n+4] = a + func(unpack(tmpt)) + for i = 1, n+4 do + tmpt[i] = nil + end + end + end + self:Close(1) + ShowUIPanel(ColorPickerFrame) + elseif this.func then + local level = this.level + if type(this.func) == "string" then + self:assert(type(this.arg1[this.func]) == "function", "Cannot call method " .. this.func) + this.arg1[this.func](this.arg1, getArgs(this, 'arg', 2)) + else + this.func(getArgs(this, 'arg', 1)) + end + if this.closeWhenClicked then + self:Close() + elseif level:IsShown() then + for i = 1, level.num do + Refresh(self, levels[i]) + end + local value = levels[level.num].value + for i = level.num-1, 1, -1 do + local level = levels[i] + local good = false + for _,button in ipairs(level.buttons) do + if button.value == value then + good = true + break + end + end + if not good then + Dewdrop:Close(i+1) + end + value = levels[i].value + end + end + elseif this.closeWhenClicked then + self:Close() + end + end + end) + local text = button:CreateFontString(nil, "ARTWORK") + button.text = text + text:SetFontObject(GameFontHighlightSmall) + button.text:SetFont(STANDARD_TEXT_FONT, UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT) + button:SetScript("OnMouseDown", function() + if not this.disabled and (this.func or this.colorFunc or this.closeWhenClicked) then + text:SetPoint("LEFT", button, "LEFT", this.notCheckable and 1 or 25, -1) + end + end) + button:SetScript("OnMouseUp", function() + if not this.disabled and (this.func or this.colorFunc or this.closeWhenClicked) then + text:SetPoint("LEFT", button, "LEFT", this.notCheckable and 0 or 24, 0) + end + end) + local arrow = button:CreateTexture(nil, "ARTWORK") + button.arrow = arrow + arrow:SetPoint("LEFT", button, "RIGHT", -16, 0) + arrow:SetWidth(16) + arrow:SetHeight(16) + arrow:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow") + local colorSwatch = button:CreateTexture(nil, "OVERLAY") + button.colorSwatch = colorSwatch + colorSwatch:SetWidth(20) + colorSwatch:SetHeight(20) + colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch") + local texture = button:CreateTexture(nil, "OVERLAY") + colorSwatch.texture = texture + texture:SetTexture(1, 1, 1) + texture:SetWidth(11.5) + texture:SetHeight(11.5) + texture:Show() + texture:SetPoint("CENTER", colorSwatch, "CENTER") + colorSwatch:SetPoint("RIGHT", button, "RIGHT", 0, 0) + else + button = table.remove(buttons) + end + button:ClearAllPoints() + button:SetParent(level) + button:SetFrameStrata(level:GetFrameStrata()) + button:SetFrameLevel(level:GetFrameLevel() + 1) + button:SetPoint("LEFT", level, "LEFT", 10, 0) + button:SetPoint("RIGHT", level, "RIGHT", -10, 0) + if #level.buttons == 0 then + button:SetPoint("TOP", level, "TOP", 0, -10) + else + button:SetPoint("TOP", level.buttons[#level.buttons], "BOTTOM", 0, 0) + end + button.text:SetPoint("LEFT", button, "LEFT", 24, 0) + button:Show() + button.level = level + table.insert(level.buttons, button) + if not level.parented then + level.parented = true + level:ClearAllPoints() + if level.num == 1 then + if level.parent ~= UIParent then + level:SetPoint("TOPRIGHT", level.parent, "TOPLEFT") + else + level:SetPoint("CENTER", level.parent, "CENTER") + end + else + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + level:SetPoint("TOPLEFT", level.parent, "TOPRIGHT", 5, 10) + else + level:SetPoint("BOTTOMLEFT", level.parent, "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + level:SetPoint("TOPRIGHT", level.parent, "TOPLEFT", -5, 10) + else + level:SetPoint("BOTTOMRIGHT", level.parent, "BOTTOMLEFT", -5, -10) + end + end + end + level:SetFrameStrata("FULLSCREEN_DIALOG") + end + button:SetAlpha(1) + return button +end + +local numLevels = 0 +local function AcquireLevel(self, level) + if not levels[level] then + for i = #levels + 1, level, -1 do + local i = i + numLevels = numLevels + 1 + local frame = CreateFrame("Button", "Dewdrop20Level" .. numLevels, nil) + if i == 1 then + local old_CloseSpecialWindows = CloseSpecialWindows + function CloseSpecialWindows() + local found = old_CloseSpecialWindows() + if levels[1]:IsShown() then + self:Close() + return 1 + end + return found + end + end + levels[i] = frame + frame.num = i + frame:SetParent(UIParent) + frame:SetFrameStrata("FULLSCREEN_DIALOG") + frame:Hide() + frame:SetWidth(180) + frame:SetHeight(10) + frame:SetFrameLevel(i * 3) + frame:SetScript("OnHide", function() + self:Close(level + 1) + end) + if frame.SetTopLevel then + frame:SetTopLevel(true) + end + frame:EnableMouse(true) + frame:EnableMouseWheel(true) + local backdrop = CreateFrame("Frame", nil, frame) + backdrop:SetAllPoints(frame) + backdrop:SetBackdrop(tmp( + 'bgFile', "Interface\\Tooltips\\UI-Tooltip-Background", + 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border", + 'tile', true, + 'insets', tmp2( + 'left', 5, + 'right', 5, + 'top', 5, + 'bottom', 5 + ), + 'tileSize', 16, + 'edgeSize', 16 + )) + backdrop:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b) + backdrop:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b) + frame:SetScript("OnClick", function() + self:Close(i) + end) + frame:SetScript("OnEnter", function() + StopCounting(self, i) + end) + frame:SetScript("OnLeave", function() + StartCounting(self, i) + end) + frame:SetScript("OnMouseWheel", function() + Scroll(self, frame, arg1 < 0) + end) + if i == 1 then + frame:SetScript("OnUpdate", function(this, arg1) + OnUpdate(self, arg1) + end) + levels[1].lastDirection = "RIGHT" + levels[1].lastVDirection = "DOWN" + else + levels[i].lastDirection = levels[i - 1].lastDirection + levels[i].lastVDirection = levels[i - 1].lastVDirection + end + end + end + local fullscreenFrame = GetFullScreenFrame() + local l = levels[level] + local strata, framelevel = l:GetFrameStrata(), l:GetFrameLevel() + if fullscreenFrame then + l:SetParent(fullscreenFrame) + else + l:SetParent(UIParent) + end + l:SetFrameStrata(strata) + l:SetFrameLevel(framelevel) + l:SetAlpha(1) + return l +end + +local function validateOptions(options, position, baseOptions, fromPass) + if not baseOptions then + baseOptions = options + end + if type(options) ~= "table" then + return "Options must be a table.", position + end + local kind = options.type + if type(kind) ~= "string" then + return '"type" must be a string.', position + elseif kind ~= "group" and kind ~= "range" and kind ~= "text" and kind ~= "execute" and kind ~= "toggle" and kind ~= "color" and kind ~= "header" then + return '"type" must either be "range", "text", "group", "toggle", "execute", "color", or "header".', position + end + if options.aliases then + if type(options.aliases) ~= "table" and type(options.aliases) ~= "string" then + return '"alias" must be a table or string', position + end + end + if not fromPass then + if kind == "execute" then + if type(options.func) ~= "string" and type(options.func) ~= "function" then + return '"func" must be a string or function', position + end + elseif kind == "range" or kind == "text" or kind == "toggle" then + if type(options.set) ~= "string" and type(options.set) ~= "function" then + return '"set" must be a string or function', position + end + if kind == "text" and options.get == false then + elseif type(options.get) ~= "string" and type(options.get) ~= "function" then + return '"get" must be a string or function', position + end + elseif kind == "group" and options.pass then + if options.pass ~= true then + return '"pass" must be either nil, true, or false', position + end + if not options.func then + if type(options.set) ~= "string" and type(options.set) ~= "function" then + return '"set" must be a string or function', position + end + if type(options.get) ~= "string" and type(options.get) ~= "function" then + return '"get" must be a string or function', position + end + elseif type(options.func) ~= "string" and type(options.func) ~= "function" then + return '"func" must be a string or function', position + end + end + else + if kind == "group" then + return 'cannot have "type" = "group" as a subgroup of a passing group', position + end + end + if options ~= baseOptions then + if kind == "header" then + elseif type(options.desc) ~= "string" then + return '"desc" must be a string', position + elseif options.desc:len() == 0 then + return '"desc" cannot be a 0-length string', position + end + end + if options ~= baseOptions or kind == "range" or kind == "text" or kind == "toggle" or kind == "color" then + if options.type == "header" and not options.cmdName and not options.name then + elseif options.cmdName then + if type(options.cmdName) ~= "string" then + return '"cmdName" must be a string or nil', position + elseif options.cmdName:len() == 0 then + return '"cmdName" cannot be a 0-length string', position + end + if type(options.guiName) ~= "string" then + if not options.guiNameIsMap then + return '"guiName" must be a string or nil', position + end + elseif options.guiName:len() == 0 then + return '"guiName" cannot be a 0-length string', position + end + else + if type(options.name) ~= "string" then + return '"name" must be a string', position + elseif options.name:len() == 0 then + return '"name" cannot be a 0-length string', position + end + end + end + if options.guiNameIsMap then + if type(options.guiNameIsMap) ~= "boolean" then + return '"guiNameIsMap" must be a boolean or nil', position + elseif options.type ~= "toggle" then + return 'if "guiNameIsMap" is true, then "type" must be set to \'toggle\'', position + elseif type(options.map) ~= "table" then + return '"map" must be a table', position + end + end + if options.message and type(options.message) ~= "string" then + return '"message" must be a string or nil', position + end + if options.error and type(options.error) ~= "string" then + return '"error" must be a string or nil', position + end + if options.current and type(options.current) ~= "string" then + return '"current" must be a string or nil', position + end + if options.order then + if type(options.order) ~= "number" or (-1 < options.order and options.order < 0.999) then + return '"order" must be a non-zero number or nil', position + end + end + if options.disabled then + if type(options.disabled) ~= "function" and type(options.disabled) ~= "string" and options.disabled ~= true then + return '"disabled" must be a function, string, or boolean', position + end + end + if options.cmdHidden then + if type(options.cmdHidden) ~= "function" and type(options.cmdHidden) ~= "string" and options.cmdHidden ~= true then + return '"cmdHidden" must be a function, string, or boolean', position + end + end + if options.guiHidden then + if type(options.guiHidden) ~= "function" and type(options.guiHidden) ~= "string" and options.guiHidden ~= true then + return '"guiHidden" must be a function, string, or boolean', position + end + end + if options.hidden then + if type(options.hidden) ~= "function" and type(options.hidden) ~= "string" and options.hidden ~= true then + return '"hidden" must be a function, string, or boolean', position + end + end + if kind == "text" then + if type(options.validate) == "table" then + local t = options.validate + local iTable = nil + for k,v in pairs(t) do + if type(k) == "number" then + if iTable == nil then + iTable = true + elseif not iTable then + return '"validate" must either have all keys be indexed numbers or strings', position + elseif k < 1 or k > #t then + return '"validate" numeric keys must be indexed properly. >= 1 and <= #t', position + end + else + if iTable == nil then + iTable = false + elseif iTable then + return '"validate" must either have all keys be indexed numbers or strings', position + end + end + if type(v) ~= "string" then + return '"validate" values must all be strings', position + end + end + elseif options.validate == "keybinding" then + -- no other checks + else + if type(options.usage) ~= "string" then + return '"usage" must be a string', position + elseif options.validate and type(options.validate) ~= "string" and type(options.validate) ~= "function" then + return '"validate" must be a string, function, or table', position + end + end + elseif kind == "range" then + if options.min or options.max then + if type(options.min) ~= "number" then + return '"min" must be a number', position + elseif type(options.max) ~= "number" then + return '"max" must be a number', position + elseif options.min >= options.max then + return '"min" must be less than "max"', position + end + end + if options.step then + if type(options.step) ~= "number" then + return '"step" must be a number', position + elseif options.step < 0 then + return '"step" must be nonnegative', position + end + end + if options.isPercent and options.isPercent ~= true then + return '"isPercent" must either be nil, true, or false', position + end + elseif kind == "toggle" then + if options.map then + if type(options.map) ~= "table" then + return '"map" must be a table', position + elseif type(options.map[true]) ~= "string" then + return '"map[true]" must be a string', position + elseif type(options.map[false]) ~= "string" then + return '"map[false]" must be a string', position + end + end + elseif kind == "color" then + if options.hasAlpha and options.hasAlpha ~= true then + return '"hasAlpha" must be nil, true, or false', position + end + elseif kind == "group" then + if options.pass and options.pass ~= true then + return '"pass" must be nil, true, or false', position + end + if type(options.args) ~= "table" then + return '"args" must be a table', position + end + for k,v in pairs(options.args) do + if type(k) ~= "number" then + if type(k) ~= "string" then + return '"args" keys must be strings or numbers', position + elseif k:len() == 0 then + return '"args" keys must not be 0-length strings.', position + end + end + if type(v) ~= "table" then + return '"args" values must be tables', position and position .. "." .. k or k + end + local newposition + if position then + newposition = position .. ".args." .. k + else + newposition = "args." .. k + end + local err, pos = validateOptions(v, newposition, baseOptions, options.pass) + if err then + return err, pos + end + end + elseif kind == "execute" then + if type(options.confirm) ~= "string" and type(options.confirm) ~= "boolean" and type(options.confirm) ~= "nil" then + return '"confirm" must be a string, boolean, or nil', position + end + end + if options.icon and type(options.icon) ~= "string" then + return'"icon" must be a string', position + end + if options.iconWidth or options.iconHeight then + if type(options.iconWidth) ~= "number" or type(options.iconHeight) ~= "number" then + return '"iconHeight" and "iconWidth" must be numbers', position + end + end + if options.iconCoordLeft or options.iconCoordRight or options.iconCoordTop or options.iconCoordBottom then + if type(options.iconCoordLeft) ~= "number" or type(options.iconCoordRight) ~= "number" or type(options.iconCoordTop) ~= "number" or type(options.iconCoordBottom) ~= "number" then + return '"iconCoordLeft", "iconCoordRight", "iconCoordTop", and "iconCoordBottom" must be numbers', position + end + end +end + +local validatedOptions + +local values +local mysort_args +local mysort +local othersort +local othersort_validate + +local baseFunc, currentLevel + +local function confirmPopup(message, func, ...) + if not StaticPopupDialogs["DEWDROP20_CONFIRM_DIALOG"] then + StaticPopupDialogs["DEWDROP20_CONFIRM_DIALOG"] = {} + end + local t = StaticPopupDialogs["DEWDROP20_CONFIRM_DIALOG"] + for k in pairs(t) do + t[k] = nil + end + t.text = message + t.button1 = ACCEPT or "Accept" + t.button2 = CANCEL or "Cancel" + t.OnAccept = function() + func(unpack(t)) + end + for i = 1, select('#', ...) do + t[i] = select(i, ...) + end + t.timeout = 0 + t.whileDead = 1 + t.hideOnEscape = 1 + + Dewdrop:Close() + StaticPopup_Show("DEWDROP20_CONFIRM_DIALOG") +end + +function Dewdrop:FeedAceOptionsTable(options, difference) + self:argCheck(options, 2, "table") + self:argCheck(difference, 3, "nil", "number") + self:assert(currentLevel, "Cannot call `FeedAceOptionsTable' outside of a Dewdrop declaration") + if not difference then + difference = 0 + end + if not validatedOptions then + validatedOptions = {} + end + if not validatedOptions[options] then + local err, position = validateOptions(options) + + if err then + if position then + Dewdrop:error(position .. ": " .. err) + else + Dewdrop:error(err) + end + end + + validatedOptions[options] = true + end + local level = levels[currentLevel] + self:assert(level, "Improper level given") + if not values then + values = {} + else + for k,v in pairs(values) do + values[k] = nil + end + end + + local current = level + while current do + if current.num == difference + 1 then + break + end + table.insert(values, current.value) + current = levels[current.num - 1] + end + + local realOptions = options + local handler = options.handler + local passTable + local passValue + while #values > 0 do + passTable = options.pass and options or nil + local value = table.remove(values) + options = options.args and options.args[value] + if not options then + return + end + handler = options.handler or handler + passValue = passTable and value or nil + end + + if options.type == "group" then + local hidden, disabled = options.hidden + if hidden then + if type(hidden) == "function" then + hidden = hidden() + elseif type(hidden) == "string" then + local f = hidden + local neg = f:match("^~(.-)$") + if neg then + f = neg + end + hidden = handler[f](handler) + if neg then + hidden = not hidden + end + end + end + if hidden then + return + end + local disabled = options.disabled + if disabled then + if type(disabled) == "function" then + disabled = disabled() + elseif type(disabled) == "string" then + local f = disabled + local neg = f:match("^~(.-)$") + if neg then + f = neg + end + hidden = handler[f](handler) + if neg then + disabled = not disabled + end + end + end + if disabled then + self:AddLine( + 'text', DISABLED, + 'disabled', true + ) + return + end + for k in pairs(options.args) do + table.insert(values, k) + end + passTable = options.pass and options or nil + if not mysort then + mysort = function(a, b) + local alpha, bravo = mysort_args[a], mysort_args[b] + local alpha_order = alpha.order or 100 + local bravo_order = bravo.order or 100 + local alpha_name = alpha.guiName or alpha.name + local bravo_name = bravo.guiName or bravo.name + if alpha_order == bravo_order then + if not alpha_name then + return true + elseif not bravo_name then + return false + else + return alpha_name:upper() < bravo_name:upper() + end + else + if alpha_order < 0 then + if bravo_order > 0 then + return false + end + else + if bravo_order < 0 then + return true + end + end + return alpha_order < bravo_order + end + end + end + mysort_args = options.args + table.sort(values, mysort) + mysort_args = nil + local hasBoth = #values >= 1 and (options.args[values[1]].order or 100) > 0 and (options.args[values[#values]].order or 100) < 0 + local last_order = 1 + for _,k in ipairs(values) do + local v = options.args[k] + local handler = v.handler or handler + if hasBoth and last_order > 0 and (v.order or 100) < 0 then + hasBoth = false + self:AddLine() + end + local hidden, disabled = v.guiHidden or v.hidden, v.disabled + if type(hidden) == "function" then + hidden = hidden() + elseif type(hidden) == "string" then + local f = hidden + local neg = f:match("^~(.-)$") + if neg then + f = neg + end + hidden = handler[f](handler) + if neg then + hidden = not hidden + end + end + if not hidden then + if type(disabled) == "function" then + disabled = disabled() + elseif type(disabled) == "string" then + local f = disabled + local neg = f:match("^~(.-)$") + if neg then + f = neg + end + disabled = handler[f](handler) + if neg then + disabled = not disabled + end + end + local name = (v.guiIconOnly and v.icon) and "" or (v.guiName or v.name) + local desc = v.desc + local iconHeight = v.iconHeight or 16 + local iconWidth = v.iconWidth or 16 + local iconCoordLeft = v.iconCoordLeft + local iconCoordRight = v.iconCoordRight + local iconCoordBottom = v.iconCoordBottom + local iconCoordTop = v.iconCoordTop + local tooltipTitle, tooltipText + tooltipTitle = name + if name ~= desc then + tooltipText = desc + end + local v_p = passTable or v + local passValue = passTable and k or nil + if v.type == "toggle" then + local checked + local checked_arg + if type(v_p.get) == "function" then + checked = v_p.get(passValue) + checked_arg = checked + else + local f = v_p.get + local neg = f:match("^~(.-)$") + if neg then + f = neg + end + if not handler[f] then + Dewdrop:error("Handler %q not available", f) + end + checked = handler[f](handler, passValue) + checked_arg = checked + if neg then + checked = not checked + end + end + local func, arg1, arg2, arg3 + if type(v_p.set) == "function" then + func = v_p.set + if passValue then + arg1 = passValue + arg2 = not checked_arg + else + arg1 = not checked_arg + end + else + if not handler[v_p.set] then + Dewdrop:error("Handler %q not available", v_p.set) + end + func = handler[v_p.set] + arg1 = handler + if passValue then + arg2 = passValue + arg3 = not checked_arg + else + arg2 = not checked_arg + end + end + if v.guiNameIsMap then + checked = checked and true or false + name = tostring(v.map and v.map[checked]):gsub("|c%x%x%x%x%x%x%x%x(.-)|r", "%1") + tooltipTitle = name + checked = true--nil + end + self:AddLine( + 'text', name, + 'checked', checked, + 'isRadio', v.isRadio, + 'func', func, + 'arg1', arg1, + 'arg2', arg2, + 'arg3', arg3, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText + ) + elseif v.type == "execute" then + local func, arg1, arg2, arg3, arg4 + local confirm = v.confirm + if confirm == true then + confirm = DEFAULT_CONFIRM_MESSAGE:format(tooltipText or tooltipTitle) + end + if type(v_p.func) == "function" then + if confirm then + func = confirmPopup + arg1 = confirm + arg2 = v_p.func + arg3 = passValue + else + func = v_p.func + arg1 = passValue + end + else + if not handler[v_p.func] then + Dewdrop:error("Handler %q not available", v_p.func) + end + if confirm then + func = confirmPopup + arg1 = confirm + arg2 = handler[v_p.func] + arg3 = handler + arg4 = passValue + else + func = handler[v_p.func] + arg1 = handler + arg2 = passValue + end + end + self:AddLine( + 'text', name, + 'checked', checked, + 'func', func, + 'arg1', arg1, + 'arg2', arg2, + 'arg3', arg3, + 'arg4', arg4, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom + ) + elseif v.type == "range" then + local sliderValue + if type(v_p.get) == "function" then + sliderValue = v_p.get(passValue) + else + if not handler[v_p.get] then + Dewdrop:error("Handler %q not available", v_p.get) + end + sliderValue = handler[v_p.get](handler, passValue) + end + local sliderFunc, sliderArg1, sliderArg2 + if type(v_p.set) == "function" then + sliderFunc = v_p.set + sliderArg1 = passValue + else + if not handler[v_p.set] then + Dewdrop:error("Handler %q not available", v_p.set) + end + sliderFunc = handler[v_p.set] + sliderArg1 = handler + sliderArg2 = passValue + end + self:AddLine( + 'text', name, + 'hasArrow', true, + 'hasSlider', true, + 'sliderMin', v.min or 0, + 'sliderMax', v.max or 1, + 'sliderStep', v.step or 0, + 'sliderIsPercent', v.isPercent or false, + 'sliderValue', sliderValue, + 'sliderFunc', sliderFunc, + 'sliderArg1', sliderArg1, + 'sliderArg2', sliderArg2, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom + ) + elseif v.type == "color" then + local r,g,b,a + if type(v_p.get) == "function" then + r,g,b,a = v_p.get(passValue) + else + if not handler[v_p.get] then + Dewdrop:error("Handler %q not available", v_p.get) + end + r,g,b,a = handler[v_p.get](handler, passValue) + end + local colorFunc, colorArg1, colorArg2 + if type(v_p.set) == "function" then + colorFunc = v_p.set + colorArg1 = passValue + else + if not handler[v_p.set] then + Dewdrop:error("Handler %q not available", v_p.set) + end + colorFunc = handler[v_p.set] + colorArg1 = handler + colorArg2 = passValue + end + self:AddLine( + 'text', name, + 'hasArrow', true, + 'hasColorSwatch', true, + 'r', r, + 'g', g, + 'b', b, + 'opacity', v.hasAlpha and a or nil, + 'hasOpacity', v.hasAlpha, + 'colorFunc', colorFunc, + 'colorArg1', colorArg1, + 'colorArg2', colorArg2, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText + ) + elseif v.type == "text" then + if type(v.validate) == "table" then + self:AddLine( + 'text', name, + 'hasArrow', true, + 'value', k, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom + ) + else + local editBoxText + if type(v_p.get) == "function" then + editBoxText = v_p.get(passValue) + elseif v_p.get == false then + editBoxText = nil + else + if not handler[v_p.get] then + Dewdrop:error("Handler %q not available", v_p.get) + end + editBoxText = handler[v_p.get](handler, passValue) + end + local editBoxFunc, editBoxArg1, editBoxArg2 + if type(v_p.set) == "function" then + editBoxFunc = v_p.set + editBoxArg1 = passValue + else + if not handler[v_p.set] then + Dewdrop:error("Handler %q not available", v_p.set) + end + editBoxFunc = handler[v_p.set] + editBoxArg1 = handler + editBoxArg2 = passValue + end + + local editBoxValidateFunc, editBoxValidateArg1 + + if v.validate and v.validate ~= "keybinding" then + if type(v.validate) == "function" then + editBoxValidateFunc = v.validate + else + if not handler[v.validate] then + Dewdrop:error("Handler %q not available", v.validate) + end + editBoxValidateFunc = handler[v.validate] + editBoxValidateArg1 = handler + end + elseif v.validate then + if tooltipText then + tooltipText = tooltipText .. "\n\n" .. RESET_KEYBINDING_DESC + else + tooltipText = RESET_KEYBINDING_DESC + end + end + + self:AddLine( + 'text', name, + 'hasArrow', true, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom, + 'hasEditBox', true, + 'editBoxText', editBoxText, + 'editBoxFunc', editBoxFunc, + 'editBoxArg1', editBoxArg1, + 'editBoxArg2', editBoxArg2, + 'editBoxValidateFunc', editBoxValidateFunc, + 'editBoxValidateArg1', editBoxValidateArg1, + 'editBoxIsKeybinding', v.validate == "keybinding", + 'editBoxKeybindingOnly', v.keybindingOnly, + 'editBoxKeybindingExcept', v.keybindingExcept, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText + ) + end + elseif v.type == "group" then + self:AddLine( + 'text', name, + 'hasArrow', true, + 'value', k, + 'disabled', disabled, + 'tooltipTitle', tooltipTitle, + 'tooltipText', tooltipText, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom + ) + elseif v.type == "header" then + if name == "" or not name then + self:AddLine( + 'isTitle', true, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom + ) + else + self:AddLine( + 'text', name, + 'isTitle', true, + 'icon', v.icon, + 'iconHeight', iconHeight, + 'iconWidth', iconWidth, + 'iconCoordLeft', iconCoordLeft, + 'iconCoordRight', iconCoordRight, + 'iconCoordTop', iconCoordTop, + 'iconCoordBottom', iconCoordBottom + ) + end + end + end + last_order = v.order or 100 + end + elseif options.type == "text" and type(options.validate) == "table" then + local current + local options_p = passTable or options + if type(options_p.get) == "function" then + current = options_p.get(passValue) + elseif options_p.get ~= false then + if not handler[options_p.get] then + Dewdrop:error("Handler %q not available", options_p.get) + end + current = handler[options_p.get](handler, passValue) + end + local indexed = true + for k,v in pairs(options.validate) do + if type(k) ~= "number" then + indexed = false + end + table.insert(values, k) + end + if not indexed then + if not othersort then + othersort = function(alpha, bravo) + return othersort_validate[alpha] < othersort_validate[bravo] + end + end + othersort_validate = options.validate + table.sort(values, othersort) + othersort_validate = nil + end + for _,k in ipairs(values) do + local v = options.validate[k] + if type(k) == "number" then + k = v + end + local func, arg1, arg2, arg3 + if type(options_p.set) == "function" then + func = options_p.set + if passValue then + arg1 = passValue + arg2 = k + else + arg1 = k + end + else + if not handler[options.set] then + Dewdrop:error("Handler %q not available", options.set) + end + func = handler[options.set] + arg1 = handler + if passValue then + arg2 = passValue + arg3 = k + else + arg2 = k + end + end + local checked = (k == current or (type(k) == "string" and type(current) == "string" and k:lower() == current:lower())) + self:AddLine( + 'text', v, + 'func', not checked and func or nil, + 'arg1', not checked and arg1 or nil, + 'arg2', not checked and arg2 or nil, + 'arg3', not checked and arg3 or nil, + 'isRadio', true, + 'checked', checked, + 'tooltipTitle', options.guiName or options.name, + 'tooltipText', v + ) + end + for k in pairs(values) do + values[k] = nil + end + else + return false + end + return true +end + +function Refresh(self, level) + if type(level) == "number" then + level = levels[level] + end + if not level then + return + end + if baseFunc then + Clear(self, level) + currentLevel = level.num + if type(baseFunc) == "table" then + if currentLevel == 1 then + local handler = baseFunc.handler + if handler then + local name = tostring(handler) + if not name:find('^table:') and not handler.hideMenuTitle then + name = name:gsub("|c%x%x%x%x%x%x%x%x(.-)|r", "%1") + self:AddLine( + 'text', name, + 'isTitle', true + ) + end + end +-- elseif level.parentText then +-- self:AddLine( +-- 'text', level.parentText, +-- 'tooltipTitle', level.parentTooltipTitle, +-- 'tooltipText', level.parentTooltipText, +-- 'tooltipFunc', level.parentTooltipFunc, +-- 'isTitle', true +-- ) + end + self:FeedAceOptionsTable(baseFunc) + if currentLevel == 1 then + self:AddLine( + 'text', CLOSE, + 'tooltipTitle', CLOSE, + 'tooltipText', CLOSE_DESC, + 'closeWhenClicked', true + ) + end + else +-- if level.parentText then +-- self:AddLine( +-- 'text', level.parentText, +-- 'tooltipTitle', level.parentTooltipTitle, +-- 'tooltipText', level.parentTooltipText, +-- 'tooltipFunc', level.parentTooltipFunc, +-- 'isTitle', true +-- ) +-- end + baseFunc(currentLevel, level.value, levels[level.num - 1] and levels[level.num - 1].value, levels[level.num - 2] and levels[level.num - 2].value, levels[level.num - 3] and levels[level.num - 3].value, levels[level.num - 4] and levels[level.num - 4].value) + end + currentLevel = nil + CheckSize(self, level) + end +end + +function Dewdrop:Refresh(level) + self:argCheck(level, 2, "number") + Refresh(self, levels[level]) +end + +function OpenSlider(self, parent) + if not sliderFrame then + sliderFrame = CreateFrame("Frame", nil, nil) + sliderFrame:SetWidth(80) + sliderFrame:SetHeight(170) + sliderFrame:SetScale(UIParent:GetScale()) + sliderFrame:SetBackdrop(tmp( + 'bgFile', "Interface\\Tooltips\\UI-Tooltip-Background", + 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border", + 'tile', true, + 'insets', tmp2( + 'left', 5, + 'right', 5, + 'top', 5, + 'bottom', 5 + ), + 'tileSize', 16, + 'edgeSize', 16 + )) + sliderFrame:SetFrameStrata("FULLSCREEN_DIALOG") + if sliderFrame.SetTopLevel then + sliderFrame:SetTopLevel(true) + end + sliderFrame:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b) + sliderFrame:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b) + sliderFrame:EnableMouse(true) + sliderFrame:Hide() + sliderFrame:SetPoint("CENTER", UIParent, "CENTER") + local slider = CreateFrame("Slider", nil, sliderFrame) + sliderFrame.slider = slider + slider:SetOrientation("VERTICAL") + slider:SetMinMaxValues(0, 1) + slider:SetValueStep(0.01) + slider:SetValue(0.5) + slider:SetWidth(16) + slider:SetHeight(128) + slider:SetPoint("LEFT", sliderFrame, "LEFT", 15, 0) + slider:SetBackdrop(tmp( + 'bgFile', "Interface\\Buttons\\UI-SliderBar-Background", + 'edgeFile', "Interface\\Buttons\\UI-SliderBar-Border", + 'tile', true, + 'edgeSize', 8, + 'tileSize', 8, + 'insets', tmp2( + 'left', 3, + 'right', 3, + 'top', 3, + 'bottom', 3 + ) + )) + local texture = slider:CreateTexture() + slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical") + local text = slider:CreateFontString(nil, "ARTWORK") + sliderFrame.topText = text + text:SetFontObject(GameFontGreenSmall) + text:SetText("100%") + text:SetPoint("BOTTOM", slider, "TOP") + local text = slider:CreateFontString(nil, "ARTWORK") + sliderFrame.bottomText = text + text:SetFontObject(GameFontGreenSmall) + text:SetText("0%") + text:SetPoint("TOP", slider, "BOTTOM") + local text = slider:CreateFontString(nil, "ARTWORK") + sliderFrame.currentText = text + text:SetFontObject(GameFontHighlightSmall) + text:SetText("50%") + text:SetPoint("LEFT", slider, "RIGHT") + text:SetPoint("RIGHT", sliderFrame, "RIGHT", -6, 0) + text:SetJustifyH("CENTER") + local changed = false + local inside = false + slider:SetScript("OnValueChanged", function() + if sliderFrame.changing then + return + end + changed = true + local done = false + if sliderFrame.parent and sliderFrame.parent.sliderFunc then + local min = sliderFrame.parent.sliderMin or 0 + local max = sliderFrame.parent.sliderMax or 1 + local step = sliderFrame.parent.sliderStep or (max - min) / 100 + local value = (1 - slider:GetValue()) * (max - min) + min + if step > 0 then + value = math.floor((value - min) / step + 0.5) * step + min + if value > max then + value = max + elseif value < min then + value = min + end + end + if value == sliderFrame.lastValue then + return + end + sliderFrame.lastValue = value + local text = sliderFrame.parent.sliderFunc(getArgs(sliderFrame.parent, 'sliderArg', 1, value)) + if text then + sliderFrame.currentText:SetText(text) + done = true + end + end + if not done then + local min = sliderFrame.parent.sliderMin or 0 + local max = sliderFrame.parent.sliderMax or 1 + local step = sliderFrame.parent.sliderStep or (max - min) / 100 + local value = (1 - slider:GetValue()) * (max - min) + min + if step > 0 then + value = math.floor((value - min) / step + 0.5) * step + min + if value > max then + value = max + elseif value < min then + value = min + end + end + if sliderFrame.parent.sliderIsPercent then + sliderFrame.currentText:SetText(string.format("%.0f%%", value * 100)) + else + if step < 0.1 then + sliderFrame.currentText:SetText(string.format("%.2f", value)) + elseif step < 1 then + sliderFrame.currentText:SetText(string.format("%.1f", value)) + else + sliderFrame.currentText:SetText(string.format("%.0f", value)) + end + end + end + end) + sliderFrame:SetScript("OnEnter", function() + StopCounting(self, sliderFrame.level) + showGameTooltip(sliderFrame.parent) + end) + sliderFrame:SetScript("OnLeave", function() + StartCounting(self, sliderFrame.level) + GameTooltip:Hide() + end) + slider:SetScript("OnMouseDown", function() + sliderFrame.mouseDown = true + GameTooltip:Hide() + end) + slider:SetScript("OnMouseUp", function() + sliderFrame.mouseDown = false + if changed--[[ and not inside]] then + local parent = sliderFrame.parent + local sliderFunc = parent.sliderFunc + for i = 1, sliderFrame.level - 1 do + Refresh(self, levels[i]) + end + local newParent + for _,button in ipairs(levels[sliderFrame.level-1].buttons) do + if button.sliderFunc == sliderFunc then + newParent = button + break + end + end + if newParent then + OpenSlider(self, newParent) + else + sliderFrame:Hide() + end + end + if inside then + showGameTooltip(sliderFrame.parent) + end + end) + slider:SetScript("OnEnter", function() + inside = true + StopCounting(self, sliderFrame.level) + showGameTooltip(sliderFrame.parent) + end) + slider:SetScript("OnLeave", function() + inside = false + StartCounting(self, sliderFrame.level) + GameTooltip:Hide() + if changed and not sliderFrame.mouseDown then + local parent = sliderFrame.parent + local sliderFunc = parent.sliderFunc + for i = 1, sliderFrame.level - 1 do + Refresh(self, levels[i]) + end + local newParent + for _,button in ipairs(levels[sliderFrame.level-1].buttons) do + if button.sliderFunc == sliderFunc then + newParent = button + break + end + end + if newParent then + OpenSlider(self, newParent) + else + sliderFrame:Hide() + end + end + end) + end + sliderFrame.parent = parent + sliderFrame.level = parent.level.num + 1 + sliderFrame.parentValue = parent.level.value + sliderFrame:SetFrameLevel(parent.level:GetFrameLevel() + 3) + sliderFrame.slider:SetFrameLevel(sliderFrame:GetFrameLevel() + 1) + sliderFrame.changing = true + if not parent.sliderMin or not parent.sliderMax then + return + end + + if parent.arrow then +-- parent.arrow:SetVertexColor(0.2, 0.6, 0) +-- parent.arrow:SetHeight(24) +-- parent.arrow:SetWidth(24) + parent.selected = true + parent.highlight:Show() + end + + sliderFrame:SetClampedToScreen(false) + if not parent.sliderValue then + parent.sliderValue = (parent.sliderMin + parent.sliderMax) / 2 + end + sliderFrame.slider:SetValue(1 - (parent.sliderValue - parent.sliderMin) / (parent.sliderMax - parent.sliderMin)) + sliderFrame.changing = false + sliderFrame.bottomText:SetText(parent.sliderMinText or "0") + sliderFrame.topText:SetText(parent.sliderMaxText or "1") + local text + if parent.sliderFunc then + text = parent.sliderFunc(getArgs(parent, 'sliderArg', 1, parent.sliderValue)) + end + if text then + sliderFrame.currentText:SetText(text) + elseif parent.sliderIsPercent then + sliderFrame.currentText:SetText(string.format("%.0f%%", parent.sliderValue * 100)) + else + sliderFrame.currentText:SetText(parent.sliderValue) + end + + sliderFrame.lastValue = parent.sliderValue + + local level = parent.level + sliderFrame:Show() + sliderFrame:ClearAllPoints() + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + sliderFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10) + else + sliderFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + sliderFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10) + else + sliderFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10) + end + end + local dirty + if level.lastDirection == "RIGHT" then + if sliderFrame:GetRight() > GetScreenWidth() then + level.lastDirection = "LEFT" + dirty = true + end + elseif sliderFrame:GetLeft() < 0 then + level.lastDirection = "RIGHT" + dirty = true + end + if level.lastVDirection == "DOWN" then + if sliderFrame:GetBottom() < 0 then + level.lastVDirection = "UP" + dirty = true + end + elseif sliderFrame:GetTop() > GetScreenWidth() then + level.lastVDirection = "DOWN" + dirty = true + end + if dirty then + sliderFrame:ClearAllPoints() + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + sliderFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10) + else + sliderFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + sliderFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10) + else + sliderFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10) + end + end + end + local left, bottom = sliderFrame:GetLeft(), sliderFrame:GetBottom() + sliderFrame:ClearAllPoints() + sliderFrame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom) + if mod(level.num, 5) == 0 then + local left, bottom = level:GetLeft(), level:GetBottom() + level:ClearAllPoints() + level:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom) + end + sliderFrame:SetClampedToScreen(true) +end + +function OpenEditBox(self, parent) + if not editBoxFrame then + editBoxFrame = CreateFrame("Frame", nil, nil) + editBoxFrame:SetWidth(200) + editBoxFrame:SetHeight(40) + editBoxFrame:SetScale(UIParent:GetScale()) + editBoxFrame:SetBackdrop(tmp( + 'bgFile', "Interface\\Tooltips\\UI-Tooltip-Background", + 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border", + 'tile', true, + 'insets', tmp2( + 'left', 5, + 'right', 5, + 'top', 5, + 'bottom', 5 + ), + 'tileSize', 16, + 'edgeSize', 16 + )) + editBoxFrame:SetFrameStrata("FULLSCREEN_DIALOG") + if editBoxFrame.SetTopLevel then + editBoxFrame:SetTopLevel(true) + end + editBoxFrame:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b) + editBoxFrame:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b) + editBoxFrame:EnableMouse(true) + editBoxFrame:EnableMouseWheel(true) + editBoxFrame:Hide() + editBoxFrame:SetPoint("CENTER", UIParent, "CENTER") + + local editBox = CreateFrame("EditBox", nil, editBoxFrame) + editBoxFrame.editBox = editBox + editBox:SetFontObject(ChatFontNormal) + editBox:SetWidth(160) + editBox:SetHeight(13) + editBox:SetPoint("CENTER", editBoxFrame, "CENTER", 0, 0) + + local left = editBox:CreateTexture(nil, "BACKGROUND") + left:SetTexture("Interface\\ChatFrame\\UI-ChatInputBorder-Left") + left:SetTexCoord(0, 100 / 256, 0, 1) + left:SetWidth(100) + left:SetHeight(32) + left:SetPoint("LEFT", editBox, "LEFT", -10, 0) + local right = editBox:CreateTexture(nil, "BACKGROUND") + right:SetTexture("Interface\\ChatFrame\\UI-ChatInputBorder-Right") + right:SetTexCoord(156/256, 1, 0, 1) + right:SetWidth(100) + right:SetHeight(32) + right:SetPoint("RIGHT", editBox, "RIGHT", 10, 0) + + editBox:SetScript("OnEnterPressed", function() + if editBoxFrame.parent and editBoxFrame.parent.editBoxValidateFunc then + local t = editBox.realText or editBox:GetText() or "" + local result = editBoxFrame.parent.editBoxValidateFunc(getArgs(editBoxFrame.parent, 'editBoxValidateArg', 1, t)) + if not result then + UIErrorsFrame:AddMessage(VALIDATION_ERROR, 1, 0, 0) + return + end + end + if editBoxFrame.parent and editBoxFrame.parent.editBoxFunc then + local t + if editBox.realText ~= "NONE" then + t = editBox.realText or editBox:GetText() or "" + end + editBoxFrame.parent.editBoxFunc(getArgs(editBoxFrame.parent, 'editBoxArg', 1, t)) + end + self:Close(editBoxFrame.level) + for i = 1, editBoxFrame.level - 1 do + Refresh(self, levels[i]) + end + StartCounting(self, editBoxFrame.level-1) + end) + editBox:SetScript("OnEscapePressed", function() + self:Close(editBoxFrame.level) + StartCounting(self, editBoxFrame.level-1) + end) + editBox:SetScript("OnReceiveDrag", function(this) + if GetCursorInfo then + local type, alpha, bravo = GetCursorInfo() + local text + if type == "spell" then + text = GetSpellName(alpha, bravo) + elseif type == "item" then + text = bravo + end + if not text then + return + end + ClearCursor() + editBox:SetText(text) + end + end) + local changing = false + local skipNext = false + + function editBox:SpecialSetText(text) + local oldText = editBox:GetText() or "" + if not text then + text = "" + end + if text ~= oldText then + changing = true + self:SetText(text) + changing = false + skipNext = true + end + end + + editBox:SetScript("OnTextChanged", function() + if skipNext then + skipNext = false + elseif not changing and editBoxFrame.parent and editBoxFrame.parent.editBoxChangeFunc then + local t + if editBox.realText ~= "NONE" then + t = editBox.realText or editBox:GetText() or "" + end + local text = editBoxFrame.parent.editBoxChangeFunc(getArgs(editBoxFrame.parent, 'editBoxChangeArg', 1, t)) + if text then + editBox:SpecialSetText(text) + end + end + end) + editBoxFrame:SetScript("OnEnter", function() + StopCounting(self, editBoxFrame.level) + showGameTooltip(editBoxFrame.parent) + end) + editBoxFrame:SetScript("OnLeave", function() + GameTooltip:Hide() + end) + editBox:SetScript("OnEnter", function() + StopCounting(self, editBoxFrame.level) + showGameTooltip(editBoxFrame.parent) + end) + editBox:SetScript("OnLeave", function() + GameTooltip:Hide() + end) + editBoxFrame:SetScript("OnKeyDown", function(this, a1) + if not editBox.keybinding then + return + end + local arg1 = a1 or arg1 + local screenshotKey = GetBindingKey("SCREENSHOT") + if screenshotKey and arg1 == screenshotKey then + Screenshot() + return + end + + if arg1 == "LeftButton" then + arg1 = "BUTTON1" + elseif arg1 == "RightButton" then + arg1 = "BUTTON2" + elseif arg1 == "MiddleButton" then + arg1 = "BUTTON3" + elseif arg1 == "Button4" then + arg1 = "BUTTON4" + elseif arg1 == "Button5" then + arg1 = "BUTTON5" + end + if arg1 == "UNKNOWN" then + return + elseif arg1 == "SHIFT" or arg1 == "CTRL" or arg1 == "ALT" then + return + elseif arg1 == "ENTER" then + if editBox.keybindingOnly and not editBox.keybindingOnly[editBox.realText] then + return editBox:GetScript("OnEscapePressed")() + elseif editBox.keybindingExcept and editBox.keybindingExcept[editBox.realText] then + return editBox:GetScript("OnEscapePressed")() + else + return editBox:GetScript("OnEnterPressed")() + end + elseif arg1 == "ESCAPE" then + if editBox.realText == "NONE" then + return editBox:GetScript("OnEscapePressed")() + else + editBox:SpecialSetText(NONE or "NONE") + editBox.realText = "NONE" + return + end + elseif editBox.keybindingOnly and not editBox.keybindingOnly[arg1] then + return + elseif editBox.keybindingExcept and editBox.keybindingExcept[arg1] then + return + end + local s = GetBindingText(arg1, "KEY_") + if s == "BUTTON1" then + s = KEY_BUTTON1 + elseif s == "BUTTON2" then + s = KEY_BUTTON2 + end + local real = arg1 + if IsShiftKeyDown() then + s = "Shift-" .. s + real = "SHIFT-" .. real + end + if IsControlKeyDown() then + s = "Ctrl-" .. s + real = "CTRL-" .. real + end + if IsAltKeyDown() then + s = "Alt-" .. s + real = "ALT-" .. real + end + if editBox:GetText() ~= s then + editBox:SpecialSetText("-") + editBox:SpecialSetText(s) + editBox.realText = real + return editBox:GetScript("OnTextChanged")() + end + end) + editBoxFrame:SetScript("OnMouseDown", editBoxFrame:GetScript("OnKeyDown")) + editBox:SetScript("OnMouseDown", function(this, ...) + if GetCursorInfo and (CursorHasItem() or CursorHasSpell()) then + return editBox:GetScript("OnReceiveDrag")(this, ...) + end + return editBoxFrame:GetScript("OnKeyDown")(this, ...) + end) + editBoxFrame:SetScript("OnMouseWheel", function(t, a1) + local arg1 = a1 or arg1 + local up = arg1 > 0 + arg1 = up and "MOUSEWHEELUP" or "MOUSEWHEELDOWN" + return editBoxFrame:GetScript("OnKeyDown")(t or this, arg1) + end) + editBox:SetScript("OnMouseWheel", editBoxFrame:GetScript("OnMouseWheel")) + end + editBoxFrame.parent = parent + editBoxFrame.level = parent.level.num + 1 + editBoxFrame.parentValue = parent.level.value + editBoxFrame:SetFrameLevel(parent.level:GetFrameLevel() + 3) + editBoxFrame.editBox:SetFrameLevel(editBoxFrame:GetFrameLevel() + 1) + editBoxFrame.editBox.realText = nil + editBoxFrame:SetClampedToScreen(false) + + editBoxFrame.editBox:SpecialSetText("") + if parent.editBoxIsKeybinding then + local s = parent.editBoxText + if s == "" then + s = "NONE" + end + editBoxFrame.editBox.realText = s + if s and s ~= "NONE" then + local alpha,bravo = s:match("^(.+)%-(.+)$") + if not bravo then + alpha = nil + bravo = s + end + bravo = GetBindingText(bravo, "KEY_") + if alpha then + editBoxFrame.editBox:SpecialSetText(alpha:upper() .. "-" .. bravo) + else + editBoxFrame.editBox:SpecialSetText(bravo) + end + else + editBoxFrame.editBox:SpecialSetText(NONE or "NONE") + end + else + editBoxFrame.editBox:SpecialSetText(parent.editBoxText) + end + + editBoxFrame.editBox.keybinding = parent.editBoxIsKeybinding + editBoxFrame.editBox.keybindingOnly = parent.editBoxKeybindingOnly + editBoxFrame.editBox.keybindingExcept = parent.editBoxKeybindingExcept + editBoxFrame.editBox:EnableKeyboard(not parent.editBoxIsKeybinding) + editBoxFrame:EnableKeyboard(parent.editBoxIsKeybinding) + + if parent.arrow then +-- parent.arrow:SetVertexColor(0.2, 0.6, 0) +-- parent.arrow:SetHeight(24) +-- parent.arrow:SetWidth(24) + parent.selected = true + parent.highlight:Show() + end + + local level = parent.level + editBoxFrame:Show() + editBoxFrame:ClearAllPoints() + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + editBoxFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10) + else + editBoxFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + editBoxFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10) + else + editBoxFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10) + end + end + local dirty + if level.lastDirection == "RIGHT" then + if editBoxFrame:GetRight() > GetScreenWidth() then + level.lastDirection = "LEFT" + dirty = true + end + elseif editBoxFrame:GetLeft() < 0 then + level.lastDirection = "RIGHT" + dirty = true + end + if level.lastVDirection == "DOWN" then + if editBoxFrame:GetBottom() < 0 then + level.lastVDirection = "UP" + dirty = true + end + elseif editBoxFrame:GetTop() > GetScreenWidth() then + level.lastVDirection = "DOWN" + dirty = true + end + if dirty then + editBoxFrame:ClearAllPoints() + if level.lastDirection == "RIGHT" then + if level.lastVDirection == "DOWN" then + editBoxFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10) + else + editBoxFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10) + end + else + if level.lastVDirection == "DOWN" then + editBoxFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10) + else + editBoxFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10) + end + end + end + local left, bottom = editBoxFrame:GetLeft(), editBoxFrame:GetBottom() + editBoxFrame:ClearAllPoints() + editBoxFrame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom) + if mod(level.num, 5) == 0 then + local left, bottom = level:GetLeft(), level:GetBottom() + level:ClearAllPoints() + level:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom) + end + editBoxFrame:SetClampedToScreen(true) +end + +function Dewdrop:EncodeKeybinding(text) + if text == nil or text == "NONE" then + return nil + end + text = tostring(text):upper() + local shift, ctrl, alt + local modifier + while true do + if text == "-" then + break + end + modifier, text = strsplit('-', text, 2) + if text then + if modifier ~= "SHIFT" and modifier ~= "CTRL" and modifier ~= "ALT" then + return false + end + if modifier == "SHIFT" then + if shift then + return false + end + shift = true + end + if modifier == "CTRL" then + if ctrl then + return false + end + ctrl = true + end + if modifier == "ALT" then + if alt then + return false + end + alt = true + end + else + text = modifier + break + end + end + if not text:find("^F%d+$") and text ~= "CAPSLOCK" and text:len() ~= 1 and (text:len() == 0 or text:byte() < 128 or text:len() > 4) and not _G["KEY_" .. text] and text ~= "BUTTON1" and text ~= "BUTTON2" then + return false + end + local s = GetBindingText(text, "KEY_") + if s == "BUTTON1" then + s = KEY_BUTTON1 + elseif s == "BUTTON2" then + s = KEY_BUTTON2 + end + if shift then + s = "Shift-" .. s + end + if ctrl then + s = "Ctrl-" .. s + end + if alt then + s = "Alt-" .. s + end + return s +end + +function Dewdrop:IsOpen(parent) + self:argCheck(parent, 2, "table", "nil") + return levels[1] and levels[1]:IsShown() and (not parent or parent == levels[1].parent or parent == levels[1]:GetParent()) +end + +function Dewdrop:GetOpenedParent() + return (levels[1] and levels[1]:IsShown()) and (levels[1].parent or levels[1]:GetParent()) +end + +function Open(self, parent, func, level, value, point, relativePoint, cursorX, cursorY) + self:Close(level) + if DewdropLib then + local d = DewdropLib:GetInstance('1.0') + local ret, val = pcall(d, IsOpen, d) + if ret and val then + DewdropLib:GetInstance('1.0'):Close() + end + end + parent:GetCenter() + local frame = AcquireLevel(self, level) + if level == 1 then + frame.lastDirection = "RIGHT" + frame.lastVDirection = "DOWN" + else + frame.lastDirection = levels[level - 1].lastDirection + frame.lastVDirection = levels[level - 1].lastVDirection + end + frame:SetFrameStrata("FULLSCREEN_DIALOG") + frame:ClearAllPoints() + frame.parent = parent + frame:SetPoint("LEFT", UIParent, "RIGHT", 10000, 0) + frame:Show() + if level == 1 then + baseFunc = func + end + levels[level].value = value +-- levels[level].parentText = parent.text and parent.text:GetText() or nil +-- levels[level].parentTooltipTitle = parent.tooltipTitle +-- levels[level].parentTooltipText = parent.tooltipText +-- levels[level].parentTooltipFunc = parent.tooltipFunc + if parent.arrow then +-- parent.arrow:SetVertexColor(0.2, 0.6, 0) +-- parent.arrow:SetHeight(24) +-- parent.arrow:SetWidth(24) + parent.selected = true + parent.highlight:Show() + end + relativePoint = relativePoint or point + Refresh(self, levels[level]) + if point or (cursorX and cursorY) then + frame:ClearAllPoints() + if cursorX and cursorY then + local curX, curY = GetScaledCursorPosition() + if curY < GetScreenHeight() / 2 then + point, relativePoint = "BOTTOM", "BOTTOM" + else + point, relativePoint = "TOP", "TOP" + end + if curX < GetScreenWidth() / 2 then + point, relativePoint = point .. "LEFT", relativePoint .. "RIGHT" + else + point, relativePoint = point .. "RIGHT", relativePoint .. "LEFT" + end + end + frame:SetPoint(point, parent, relativePoint) + if cursorX and cursorY then + local left = frame:GetLeft() + local width = frame:GetWidth() + local bottom = frame:GetBottom() + local height = frame:GetHeight() + local curX, curY = GetScaledCursorPosition() + frame:ClearAllPoints() + relativePoint = relativePoint or point + if point == "BOTTOM" or point == "TOP" then + if curX < GetScreenWidth() / 2 then + point = point .. "LEFT" + else + point = point .. "RIGHT" + end + elseif point == "CENTER" then + if curX < GetScreenWidth() / 2 then + point = "LEFT" + else + point = "RIGHT" + end + end + local xOffset, yOffset = 0, 0 + if curY > GetScreenHeight() / 2 then + yOffset = -height + end + if curX > GetScreenWidth() / 2 then + xOffset = -width + end + frame:SetPoint(point, parent, relativePoint, curX - left + xOffset, curY - bottom + yOffset) + if level == 1 then + frame.lastDirection = "RIGHT" + end + elseif cursorX then + local left = frame:GetLeft() + local width = frame:GetWidth() + local curX, curY = GetScaledCursorPosition() + frame:ClearAllPoints() + relativePoint = relativePoint or point + if point == "BOTTOM" or point == "TOP" then + if curX < GetScreenWidth() / 2 then + point = point .. "LEFT" + else + point = point .. "RIGHT" + end + elseif point == "CENTER" then + if curX < GetScreenWidth() / 2 then + point = "LEFT" + else + point = "RIGHT" + end + end + frame:SetPoint(point, parent, relativePoint, curX - left - width / 2, 0) + if level == 1 then + frame.lastDirection = "RIGHT" + end + elseif cursorY then + local bottom = frame:GetBottom() + local height = frame:GetHeight() + local curX, curY = GetScaledCursorPosition() + frame:ClearAllPoints() + relativePoint = relativePoint or point + if point == "LEFT" or point == "RIGHT" then + if curX < GetScreenHeight() / 2 then + point = point .. "BOTTOM" + else + point = point .. "TOP" + end + elseif point == "CENTER" then + if curX < GetScreenHeight() / 2 then + point = "BOTTOM" + else + point = "TOP" + end + end + frame:SetPoint(point, parent, relativePoint, 0, curY - bottom - height / 2) + if level == 1 then + frame.lastDirection = "DOWN" + end + end + if (strsub(point, 1, 3) ~= strsub(relativePoint, 1, 3)) then + if frame:GetBottom() < 0 then + local point, parent, relativePoint, x, y = frame:GetPoint(1) + local change = GetScreenHeight() - frame:GetTop() + local otherChange = -frame:GetBottom() + if otherChange < change then + change = otherChange + end + frame:SetPoint(point, parent, relativePoint, x, y + change) + elseif frame:GetTop() > GetScreenHeight() then + local point, parent, relativePoint, x, y = frame:GetPoint(1) + local change = GetScreenHeight() - frame:GetTop() + local otherChange = -frame:GetBottom() + if otherChange < change then + change = otherChange + end + frame:SetPoint(point, parent, relativePoint, x, y + change) + end + end + end + CheckDualMonitor(self, frame) + frame:SetClampedToScreen(true) + frame:SetClampedToScreen(false) + StartCounting(self, level) +end + +function Dewdrop:IsRegistered(parent) + self:argCheck(parent, 2, "table") + return not not self.registry[parent] +end + +function Dewdrop:Register(parent, ...) + self:argCheck(parent, 2, "table") + if self.registry[parent] then + self:Unregister(parent) + end + local info = new(...) + if type(info.children) == "table" then + local err, position = validateOptions(info.children) + + if err then + if position then + Dewdrop:error(position .. ": " .. err) + else + Dewdrop:error(err) + end + end + end + self.registry[parent] = info + if not info.dontHook and not self.onceRegistered[parent] then + if parent:HasScript("OnMouseUp") then + local script = parent:GetScript("OnMouseUp") + parent:SetScript("OnMouseUp", function() + if script then + script() + end + if arg1 == "RightButton" and self.registry[parent] then + if self:IsOpen(parent) then + self:Close() + else + self:Open(parent) + end + end + end) + end + if parent:HasScript("OnMouseDown") then + local script = parent:GetScript("OnMouseDown") + parent:SetScript("OnMouseDown", function() + if script then + script() + end + if self.registry[parent] then + self:Close() + end + end) + end + end + self.onceRegistered[parent] = true +end + +function Dewdrop:Unregister(parent) + self:argCheck(parent, 2, "table") + self.registry[parent] = nil +end + +function Dewdrop:Open(parent, ...) + self:argCheck(parent, 2, "table") + local info + local k1 = ... + if type(k1) == "table" and k1[0] and k1.IsFrameType and self.registry[k1] then + info = tmp() + for k,v in pairs(self.registry[k1]) do + info[k] = v + end + else + info = tmp(...) + if self.registry[parent] then + for k,v in pairs(self.registry[parent]) do + if info[k] == nil then + info[k] = v + end + end + end + end + local point = info.point + local relativePoint = info.relativePoint + local cursorX = info.cursorX + local cursorY = info.cursorY + if type(point) == "function" then + local b + point, b = point(parent) + if b then + relativePoint = b + end + end + if type(relativePoint) == "function" then + relativePoint = relativePoint(parent) + end + Open(self, parent, info.children, 1, nil, point, relativePoint, cursorX, cursorY) +end + +function Clear(self, level) + if level then + if level.buttons then + for i = #level.buttons, 1, -1 do + ReleaseButton(self, level, i) + end + end + end +end + +function Dewdrop:Close(level) + if DropDownList1:IsShown() then + DropDownList1:Hide() + end + if DewdropLib then + local d = DewdropLib:GetInstance('1.0') + local ret, val = pcall(d, IsOpen, d) + if ret and val then + DewdropLib:GetInstance('1.0'):Close() + end + end + self:argCheck(level, 2, "number", "nil") + if not level then + level = 1 + end + if level == 1 and levels[level] then + levels[level].parented = false + end + if level > 1 and levels[level-1].buttons then + local buttons = levels[level-1].buttons + for _,button in ipairs(buttons) do +-- button.arrow:SetWidth(16) +-- button.arrow:SetHeight(16) + button.selected = nil + button.highlight:Hide() +-- button.arrow:SetVertexColor(1, 1, 1) + end + end + if sliderFrame and sliderFrame.level >= level then + sliderFrame:Hide() + end + if editBoxFrame and editBoxFrame.level >= level then + editBoxFrame:Hide() + end + for i = level, #levels do + Clear(self, levels[level]) + levels[i]:Hide() + levels[i]:ClearAllPoints() + levels[i]:SetPoint("CENTER", UIParent, "CENTER") + levels[i].value = nil + end +end + +function Dewdrop:AddLine(...) + local info = tmp(...) + local level = info.level or currentLevel + info.level = nil + local button = AcquireButton(self, level) + if not next(info) then + info.disabled = true + end + button.disabled = info.isTitle or info.notClickable or info.disabled + button.isTitle = info.isTitle + button.notClickable = info.notClickable + if button.isTitle then + button.text:SetFontObject(GameFontNormalSmall) + elseif button.notClickable then + button.text:SetFontObject(GameFontHighlightSmall) + elseif button.disabled then + button.text:SetFontObject(GameFontDisableSmall) + else + button.text:SetFontObject(GameFontHighlightSmall) + end + if info.disabled then + button.arrow:SetDesaturated(true) + button.check:SetDesaturated(true) + else + button.arrow:SetDesaturated(false) + button.check:SetDesaturated(false) + end + if info.textR and info.textG and info.textB then + button.textR = info.textR + button.textG = info.textG + button.textB = info.textB + button.text:SetTextColor(button.textR, button.textG, button.textB) + else + button.text:SetTextColor(button.text:GetFontObject():GetTextColor()) + end + button.notCheckable = info.notCheckable + button.text:SetPoint("LEFT", button, "LEFT", button.notCheckable and 0 or 24, 0) + button.checked = not info.notCheckable and info.checked + button.isRadio = not info.notCheckable and info.isRadio + if info.isRadio then + button.check:Show() + button.check:SetTexture(info.checkIcon or "Interface\\Buttons\\UI-RadioButton") + if button.checked then + button.check:SetTexCoord(0.25, 0.5, 0, 1) + button.check:SetVertexColor(1, 1, 1, 1) + else + button.check:SetTexCoord(0, 0.25, 0, 1) + button.check:SetVertexColor(1, 1, 1, 0.5) + end + button.radioHighlight:SetTexture(info.checkIcon or "Interface\\Buttons\\UI-RadioButton") + button.check:SetWidth(16) + button.check:SetHeight(16) + elseif info.icon then + button.check:Show() + button.check:SetTexture(info.icon) + if info.iconWidth and info.iconHeight then + button.check:SetWidth(info.iconWidth) + button.check:SetHeight(info.iconHeight) + else + button.check:SetWidth(16) + button.check:SetHeight(16) + end + if info.iconCoordLeft and info.iconCoordRight and info.iconCoordTop and info.iconCoordBottom then + button.check:SetTexCoord(info.iconCoordLeft, info.iconCoordRight, info.iconCoordTop, info.iconCoordBottom) + elseif info.icon:find("^Interface\\Icons\\") then + button.check:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + button.check:SetTexCoord(0, 1, 0, 1) + end + button.check:SetVertexColor(1, 1, 1, 1) + else + if button.checked then + if info.checkIcon then + button.check:SetWidth(16) + button.check:SetHeight(16) + button.check:SetTexture(info.checkIcon) + if info.checkIcon:find("^Interface\\Icons\\") then + button.check:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + button.check:SetTexCoord(0, 1, 0, 1) + end + else + button.check:SetWidth(24) + button.check:SetHeight(24) + button.check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") + button.check:SetTexCoord(0, 1, 0, 1) + end + button.check:SetVertexColor(1, 1, 1, 1) + else + button.check:SetVertexColor(1, 1, 1, 0) + end + end + if not button.disabled then + button.func = info.func + end + button.hasColorSwatch = info.hasColorSwatch + if button.hasColorSwatch then + button.colorSwatch:Show() + button.colorSwatch.texture:Show() + button.r = info.r or 1 + button.g = info.g or 1 + button.b = info.b or 1 + button.colorSwatch.texture:SetTexture(button.r, button.g, button.b) + button.checked = false + button.func = nil + button.colorFunc = info.colorFunc + local i = 1 + while true do + local k = "colorArg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + button.hasOpacity = info.hasOpacity + button.opacity = info.opacity or 1 + else + button.colorSwatch:Hide() + button.colorSwatch.texture:Hide() + end + button.hasArrow = not button.hasColorSwatch and (info.value or info.hasSlider or info.hasEditBox) and info.hasArrow + if button.hasArrow then + button.arrow:SetAlpha(1) + if info.hasSlider then + button.hasSlider = true + button.sliderMin = info.sliderMin or 0 + button.sliderMax = info.sliderMax or 1 + button.sliderStep = info.sliderStep or 0 + button.sliderIsPercent = info.sliderIsPercent and true or false + button.sliderMinText = info.sliderMinText or button.sliderIsPercent and string.format("%.0f%%", button.sliderMin * 100) or button.sliderMin + button.sliderMaxText = info.sliderMaxText or button.sliderIsPercent and string.format("%.0f%%", button.sliderMax * 100) or button.sliderMax + button.sliderFunc = info.sliderFunc + button.sliderValue = info.sliderValue + local i = 1 + while true do + local k = "sliderArg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + elseif info.hasEditBox then + button.hasEditBox = true + button.editBoxText = info.editBoxText or "" + button.editBoxFunc = info.editBoxFunc + local i = 1 + while true do + local k = "editBoxArg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + button.editBoxChangeFunc = info.editBoxChangeFunc + local i = 1 + while true do + local k = "editBoxChangeArg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + button.editBoxValidateFunc = info.editBoxValidateFunc + local i = 1 + while true do + local k = "editBoxValidateArg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + button.editBoxIsKeybinding = info.editBoxIsKeybinding + button.editBoxKeybindingOnly = info.editBoxKeybindingOnly + button.editBoxKeybindingExcept = info.editBoxKeybindingExcept + else + button.value = info.value + local l = levels[level+1] + if l and info.value == l.value then +-- button.arrow:SetWidth(24) +-- button.arrow:SetHeight(24) + button.selected = true + button.highlight:Show() + end + end + else + button.arrow:SetAlpha(0) + end + local i = 1 + while true do + local k = "arg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + button.closeWhenClicked = info.closeWhenClicked + button.textHeight = info.textHeight or UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT or 10 + local font,_ = button.text:GetFont() + button.text:SetFont(STANDARD_TEXT_FONT or "Fonts\\FRIZQT__.TTF", button.textHeight) + button:SetHeight(button.textHeight + 6) + button.text:SetPoint("RIGHT", button.arrow, (button.hasColorSwatch or button.hasArrow) and "LEFT" or "RIGHT") + button.text:SetJustifyH(info.justifyH or "LEFT") + button.text:SetText(info.text) + button.tooltipTitle = info.tooltipTitle + button.tooltipText = info.tooltipText + button.tooltipFunc = info.tooltipFunc + local i = 1 + while true do + local k = "tooltipArg" .. i + local x = info[k] + if x == nil then + break + end + button[k] = x + i = i + 1 + end + if not button.tooltipTitle and not button.tooltipText and not button.tooltipFunc and not info.isTitle then + button.tooltipTitle = info.text + end + if type(button.func) == "string" then + self:assert(type(button.arg1) == "table", "Cannot call method " .. button.func .. " on a non-table") + self:assert(type(button.arg1[button.func]) == "function", "Method " .. button.func .. " nonexistant.") + end +end + +function Dewdrop:InjectAceOptionsTable(handler, options) + self:argCheck(handler, 2, "table") + self:argCheck(options, 3, "table") + if tostring(options.type):lower() ~= "group" then + self:error('Cannot inject into options table argument #3 if its type is not "group"') + end + if options.handler ~= nil and options.handler ~= handler then + self:error("Cannot inject into options table argument #3 if it has a different handler than argument #2") + end + options.handler = handler + local class = handler.class + if not AceLibrary:HasInstance("AceOO-2.0") or not class then + self:error("Cannot retrieve AceOptions tables from a non-object argument #2") + end + while class and class ~= AceLibrary("AceOO-2.0").Class do + if type(class.GetAceOptionsDataTable) == "function" then + local t = class:GetAceOptionsDataTable(handler) + for k,v in pairs(t) do + if type(options.args) ~= "table" then + options.args = {} + end + if options.args[k] == nil then + options.args[k] = v + end + end + end + local mixins = class.mixins + if mixins then + for mixin in pairs(mixins) do + if type(mixin.GetAceOptionsDataTable) == "function" then + local t = mixin:GetAceOptionsDataTable(handler) + for k,v in pairs(t) do + if type(options.args) ~= "table" then + options.args = {} + end + if options.args[k] == nil then + options.args[k] = v + end + end + end + end + end + class = class.super + end + return options +end + +local function activate(self, oldLib, oldDeactivate) + Dewdrop = self + if oldLib and oldLib.registry then + self.registry = oldLib.registry + self.onceRegistered = oldLib.onceRegistered + else + self.registry = {} + self.onceRegistered = {} + + local WorldFrame_OnMouseDown = WorldFrame:GetScript("OnMouseDown") + local WorldFrame_OnMouseUp = WorldFrame:GetScript("OnMouseUp") + local oldX, oldY, clickTime + WorldFrame:SetScript("OnMouseDown", function() + oldX,oldY = GetCursorPosition() + clickTime = GetTime() + if WorldFrame_OnMouseDown then + WorldFrame_OnMouseDown() + end + end) + + WorldFrame:SetScript("OnMouseUp", function() + local x,y = GetCursorPosition() + if not oldX or not oldY or not x or not y or not clickTime then + self:Close() + if WorldFrame_OnMouseUp then + WorldFrame_OnMouseUp() + end + return + end + local d = math.abs(x - oldX) + math.abs(y - oldY) + if d <= 5 and GetTime() - clickTime < 0.5 then + self:Close() + end + if WorldFrame_OnMouseUp then + WorldFrame_OnMouseUp() + end + end) + + hooksecurefunc(DropDownList1, "Show", function() + if levels[1] and levels[1]:IsVisible() then + self:Close() + end + end) + + hooksecurefunc("HideDropDownMenu", function() + if levels[1] and levels[1]:IsVisible() then + self:Close() + end + end) + + hooksecurefunc("CloseDropDownMenus", function() + if levels[1] and levels[1]:IsVisible() then + local stack = debugstack() + if not stack:find("`TargetFrame_OnHide'") then + self:Close() + end + end + end) + end + self.frame = oldLib and oldLib.frame or CreateFrame("Frame") + self.frame:UnregisterAllEvents() + self.frame:RegisterEvent("PLAYER_REGEN_ENABLED") + self.frame:RegisterEvent("PLAYER_REGEN_DISABLED") + self.frame:Hide() + self.frame:SetScript("OnEvent", function(this, event) + this:Show() + end) + self.frame:SetScript("OnUpdate", function(this) + this:Hide() + self:Refresh(1) + end) + levels = {} + buttons = {} + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(Dewdrop, MAJOR_VERSION, MINOR_VERSION, activate) diff --git a/libs/FuBarPlugin-2.0/FuBarPlugin-2.0.lua b/libs/FuBarPlugin-2.0/FuBarPlugin-2.0.lua new file mode 100644 index 0000000..65d0fa0 --- /dev/null +++ b/libs/FuBarPlugin-2.0/FuBarPlugin-2.0.lua @@ -0,0 +1,1585 @@ +--[[ +Name: FuBarPlugin-2.0 +Revision: $Rev: 23187 $ +Author: Cameron Kenneth Knight (ckknight@gmail.com) +Website: http://wiki.wowace.com/index.php/FuBarPlugin-2.0 +Documentation: http://wiki.wowace.com/index.php/FuBarPlugin-2.0 +SVN: svn://svn.wowace.com/root/branches/FuBar/FuBarPlugin-2.0/FuBarPlugin-2.0/ +Description: Plugin for FuBar. +Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0, Tablet-2.0, Dewdrop-2.0 +License: LGPL v2.1 +]] + +local MAJOR_VERSION = "FuBarPlugin-2.0" +local MINIMAPCONTAINER_MAJOR_VERSION = "FuBarPlugin-MinimapContainer-2.0" +local MINOR_VERSION = "$Revision: 23187 $" + +-- This ensures the code is only executed if the libary doesn't already exist, or is a newer version +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0.") end + +local AceEvent = AceLibrary:HasInstance("AceEvent-2.0") and AceLibrary("AceEvent-2.0") +local Tablet = AceLibrary:HasInstance("Tablet-2.0") and AceLibrary("Tablet-2.0") +local Dewdrop = AceLibrary:HasInstance("Dewdrop-2.0") and AceLibrary("Dewdrop-2.0") + +local epsilon = 1e-5 +local _G = getfenv(0) + +local SHOW_ICON = "Show icon" +local SHOW_ICON_DESC = "Show the plugins icon on the panel." +local SHOW_TEXT = "Show text" +local SHOW_TEXT_DESC = "Show the plugins text on the panel." +local SHOW_COLORED_TEXT = "Show colored text" +local SHOW_COLORED_TEXT_DESC = "Allow the plugin to color its text." +local DETACH_TOOLTIP = "Detach tooltip" +local DETACH_TOOLTIP_DESC = "Detach the tooltip from the panel." +local LOCK_TOOLTIP = "Lock tooltip" +local LOCK_TOOLTIP_DESC = "Lock the tooltips position. When the tooltip is locked, you must use Alt to access it with your mouse." +local POSITION = "Position" +local POSITION_DESC = "Position the plugin on the panel." +local POSITION_LEFT = "Left" +local POSITION_RIGHT = "Right" +local POSITION_CENTER = "Center" +local ATTACH_TO_MINIMAP = "Attach to minimap" +local ATTACH_TO_MINIMAP_DESC = "Attach the plugin to the minimap instead of the panel." +local HIDE_FUBAR_PLUGIN = "Hide plugin" +local HIDE_FUBAR_PLUGIN_CMD = "Hidden" +local HIDE_FUBAR_PLUGIN_DESC = "Hide the plugin from the panel or minimap, leaving the addon running." +local OTHER = "Other" +local CLOSE = "Close" +local CLOSE_DESC = "Close the menu." + +if GetLocale() == "koKR" then + SHOW_ICON = "아이콘 표시" + SHOW_ICON_DESC = "패널에 플러그인 아이콘을 표시합니다." + SHOW_TEXT = "텍스트 표시" + SHOW_TEXT_DESC = "페널에 플러그인 텍스트를 표시합니다." + SHOW_COLORED_TEXT = "색상화된 텍스트 표시" + SHOW_COLORED_TEXT_DESC = "플러그인의 텍스트 색상을 허용합니다." + DETACH_TOOLTIP = "툴팁 분리" + DETACH_TOOLTIP_DESC = "패널에서 툴팁을 분리 합니다." + LOCK_TOOLTIP = "툴팁 고정" + LOCK_TOOLTIP_DESC = "툴팁 위치를 고정합니다." + POSITION = "위치" + POSITION_DESC = "패널에서 플러그인의 위치를 설정합니다." + POSITION_LEFT = "왼쪽" + POSITION_RIGHT = "오른쪽" + POSITION_CENTER = "가운데" + ATTACH_TO_MINIMAP = "미니맵에 표시" + ATTACH_TO_MINIMAP_DESC = "플러그인을 패널 대신 미니맵에 표시합니다." + HIDE_FUBAR_PLUGIN = "FuBar 플러그인 숨기기" + HIDE_FUBAR_PLUGIN_CMD = "숨겨짐" + HIDE_FUBAR_PLUGIN_DESC = "패널에서 플러그인을 숨깁니다." + OTHER = "기타" + CLOSE = "닫기" + CLOSE_DESC = "메뉴 닫기." +elseif GetLocale() == "deDE" then + SHOW_ICON = "Zeige Icon" + SHOW_ICON_DESC = "Zeige das Plugin-Icon auf der Leiste." + SHOW_TEXT = "Zeige Text" + SHOW_TEXT_DESC = "Zeige den Plugin-Text auf der Leiste." + SHOW_COLORED_TEXT = "Zeige gef\195\164rbten Text" + SHOW_COLORED_TEXT_DESC = "Dem Plugin erlauben sein Text zu f\195\164rben." + DETACH_TOOLTIP = "Tooltip l\195\182sen" + DETACH_TOOLTIP_DESC = "Tooltip von der Leiste l\195\182sen." + LOCK_TOOLTIP = "Tooltip sperren" + LOCK_TOOLTIP_DESC = "Tooltip an der Position sperren." + POSITION = "Position" + POSITION_DESC = "Positioniert das Plugin auf der Leiste." + POSITION_LEFT = "Links" + POSITION_RIGHT = "Rechts" + POSITION_CENTER = "Mitte" + ATTACH_TO_MINIMAP = "An der Minimap anbringen" + ATTACH_TO_MINIMAP_DESC = "Bringt das Plugin an der Minimap anstelle der Leiste an." + HIDE_FUBAR_PLUGIN = "Versteckt das FuBar Plugin" + HIDE_FUBAR_PLUGIN_CMD = "Verstecken" + HIDE_FUBAR_PLUGIN_DESC = "Versteckt das Plugin von der Leiste." +elseif GetLocale() == "frFR" then + SHOW_ICON = "Afficher l'ic\195\180ne" + SHOW_ICON_DESC = "Afficher l'ic\195\180ne du plugin sur le panneau." + SHOW_TEXT = "Afficher le texte" + SHOW_TEXT_DESC = "Afficher le texte du plugin sur le panneau." + SHOW_COLORED_TEXT = "Afficher la couleur du texte" + SHOW_COLORED_TEXT_DESC = "Permet au plugin de colorer le texte." + DETACH_TOOLTIP = "D\195\169tacher le tooltip" + DETACH_TOOLTIP_DESC = "Permet de d\195\169tacher le tooltip du panneau." + LOCK_TOOLTIP = "Bloquer le tooltip" + LOCK_TOOLTIP_DESC = "Permet de bloquer le tooltip \195\160 sa position actuelle. Une fois le tooltip bloqu\195\169, vous devez utiliser la touche Alt pour le d\195\169placer avec votre souris." + POSITION = "Position" + POSITION_DESC = "Permet de changer la position du plugin dans le panneau." + POSITION_LEFT = "Gauche" + POSITION_RIGHT = "Droite" + POSITION_CENTER = "Centre" + ATTACH_TO_MINIMAP = "Attacher \195\160 la minicarte" + ATTACH_TO_MINIMAP_DESC = "Attache l'ic\195\180ne du plugin \195\160 la minicarte." + HIDE_FUBAR_PLUGIN = "Masquer le plugin" + HIDE_FUBAR_PLUGIN_CMD = "Masqu\195\169" + HIDE_FUBAR_PLUGIN_DESC = "Permet de masquer compl\195\168tement le plugin du panneau, mais laisse l'addon fonctionner." + OTHER = "Autre" + CLOSE = "Fermer" + CLOSE_DESC = "Ferme le menu." +elseif GetLocale() == "zhCN" then + SHOW_ICON = "显示图标" + SHOW_ICON_DESC = "在面板上显示插件图标." + SHOW_TEXT = "显示文字" + SHOW_TEXT_DESC = "在面板上显示文字标题." + SHOW_COLORED_TEXT = "显示彩色文字" + SHOW_COLORED_TEXT_DESC = "允许插件显示彩色文字." + DETACH_TOOLTIP = "独立提示信息" + DETACH_TOOLTIP_DESC = "从面板上独立提示信息." + LOCK_TOOLTIP = "锁定提示信息" + LOCK_TOOLTIP_DESC = "锁定提示信息位置." + POSITION = "位置" + POSITION_DESC = "插件在面板上的位置." + POSITION_LEFT = "居左" + POSITION_RIGHT = "居右" + POSITION_CENTER = "居中" + ATTACH_TO_MINIMAP = "依附在小地图" + ATTACH_TO_MINIMAP_DESC = "插件图标依附在小地图而不显示在面板上." + HIDE_FUBAR_PLUGIN = "隐藏FuBar插件" + HIDE_FUBAR_PLUGIN_CMD = "Hidden" + HIDE_FUBAR_PLUGIN_DESC = "在面板上隐藏该插件." +elseif GetLocale() == "zhTW" then + SHOW_ICON = "顯示圖示" + SHOW_ICON_DESC = "在面板上顯示插件圖示。" + SHOW_TEXT = "顯示文字" + SHOW_TEXT_DESC = "在面板上顯示文字標題。" + SHOW_COLORED_TEXT = "顯示彩色文字" + SHOW_COLORED_TEXT_DESC = "允許插件顯示彩色文字。" + DETACH_TOOLTIP = "獨立提示訊息" + DETACH_TOOLTIP_DESC = "從面板上獨立提示訊息。" + LOCK_TOOLTIP = "鎖定提示訊息" + LOCK_TOOLTIP_DESC = "鎖定提示訊息位置。" + POSITION = "位置" + POSITION_DESC = "插件在面板上的位置。" + POSITION_LEFT = "靠左" + POSITION_RIGHT = "靠右" + POSITION_CENTER = "置中" + ATTACH_TO_MINIMAP = "依附在小地圖" + ATTACH_TO_MINIMAP_DESC = "插件圖標依附在小地圖而不顯示在面板上。" + HIDE_FUBAR_PLUGIN = "隱藏FuBar插件" + HIDE_FUBAR_PLUGIN_CMD = "Hidden" + HIDE_FUBAR_PLUGIN_DESC = "在面板上隱藏該插件." +elseif GetLocale() == "esES" then + SHOW_ICON = "Mostrar icono" + SHOW_ICON_DESC = "Muestra el icono del plugin en el panel" + SHOW_TEXT = "Mostrar texto" + SHOW_TEXT_DESC = "Muestra el texto del plugin en el panel" + SHOW_COLORED_TEXT = "Mostrar el texto en color" + SHOW_COLORED_TEXT_DESC = "Permite al plugin colorear su texto" + DETACH_TOOLTIP = "Separar tooltip" + DETACH_TOOLTIP_DESC = "Separa el tooltip del panel" + LOCK_TOOLTIP = "Bloquear tooltip" + LOCK_TOOLTIP_DESC = "Bloquea la posici\195\179n de los tooltips. Cuando el tooltip est\195\161 bloqueado debes usar Alt para acceder a \195\169l con el rat\195\179n" + POSITION = "Posici\195\179n" + POSITION_DESC = "Posici\195\179n del plugin en el panel" + POSITION_LEFT = "Izquierda" + POSITION_RIGHT = "Derecha" + POSITION_CENTER = "Centro" + ATTACH_TO_MINIMAP = "Adjuntar al minimapa" + ATTACH_TO_MINIMAP_DESC = "Adjunta el plugin al minimapa en vez de al panel." + HIDE_FUBAR_PLUGIN = "Ocultar plugin" + HIDE_FUBAR_PLUGIN_CMD = "Oculto" + HIDE_FUBAR_PLUGIN_DESC = "Oculta el plugin del panel o minimapa, dejando el accesorio funcionando." + OTHER = "Otros" + CLOSE = "Cerrar" + CLOSE_DESC = "Cierra el men\195\186." +end + +local AceOO = AceLibrary("AceOO-2.0") +local FuBarPlugin = AceOO.Mixin { + "GetTitle", + "GetName", + "GetCategory", + "SetFontSize", + "GetFrame", + "Show", + "Hide", + "GetPanel", + "IsTextColored", + "ToggleTextColored", + "IsMinimapAttached", + "ToggleMinimapAttached", + "Update", + "UpdateDisplay", + "UpdateData", + "UpdateText", + "UpdateTooltip", + "SetIcon", + "GetIcon", + "CheckWidth", + "SetText", + "GetText", + "IsIconShown", + "ToggleIconShown", + "ShowIcon", + "HideIcon", + "IsTextShown", + "ToggleTextShown", + "ShowText", + "HideText", + "IsTooltipDetached", + "ToggleTooltipDetached", + "DetachTooltip", + "ReattachTooltip", + "GetDefaultPosition", + "SetPanel", + "IsLoadOnDemand", + "IsDisabled", + "CreateBasicPluginFrame", + "CreatePluginChildFrame", + "OpenMenu", + "AddImpliedMenuOptions", + } + +local good = nil +local function CheckFuBar() + if not good then + good = FuBar and tonumber(string.sub(FuBar.version, 1, 3)) and tonumber(string.sub(FuBar.version, 1, 3)) >= 2 and true + end + return good +end + +function FuBarPlugin:GetTitle() + local name = self.title or self.name + FuBarPlugin:assert(name, "You must provide self.title or self.name") + local _,_,title = string.find(name, "FuBar %- (.-)%s*$") + if not title then + title = name + end + return (string.gsub(string.gsub(title, "|c%x%x%x%x%x%x%x%x", ""), "|r", "")) +end + +function FuBarPlugin:GetName() + return self.name +end + +function FuBarPlugin:GetCategory() + return self.category or OTHER +end + +function FuBarPlugin:GetFrame() + return self.frame +end + +function FuBarPlugin:GetPanel() + return self.panel +end + +function FuBarPlugin:IsTextColored() + return not self.db or not self.db.profile or not self.db.profile.uncolored +end + +function FuBarPlugin:ToggleTextColored() + FuBarPlugin:assert(self.db, "Cannot change text color if self.db is not available. (" .. self:GetTitle() .. ")") + self.db.profile.uncolored = not self.db.profile.uncolored or nil + self:UpdateText() +end + +function FuBarPlugin:ToggleMinimapAttached() + if CheckFuBar() and not self.cannotAttachToMinimap then + local value = self:IsMinimapAttached() + if value then + if self.panel then + self.panel:RemovePlugin(self) + end + FuBar:GetPanel(1):AddPlugin(self, nil, self.defaultPosition) + else + if self.panel then + self.panel:RemovePlugin(self) + end + AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION):AddPlugin(self) + end + end + Dewdrop:Close() +end + +function FuBarPlugin:IsMinimapAttached() + if not CheckFuBar() then + return true + end + return self.panel == AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION) +end + +function FuBarPlugin:Update() + self:UpdateData() + self:UpdateText() + self:UpdateTooltip() +end + +function FuBarPlugin:UpdateDisplay() + self:UpdateText() + self:UpdateTooltip() +end + +function FuBarPlugin:UpdateData() + if type(self.OnDataUpdate) == "function" then + if not self:IsDisabled() then + self:OnDataUpdate() + end + end +end + +function FuBarPlugin:UpdateText() + if type(self.OnTextUpdate) == "function" then + if not self:IsDisabled() then + self:OnTextUpdate() + end + elseif self:IsTextShown() then + self:SetText(self:GetTitle()) + end +end + +function FuBarPlugin:RegisterTablet() + if not Tablet:IsRegistered(self.frame) then + if self.db and self.db.profile and not self.db.profile.detachedTooltip then + self.db.profile.detachedTooltip = {} + end + Tablet:Register(self.frame, + 'children', function() + Tablet:SetTitle(self:GetTitle()) + if type(self.OnTooltipUpdate) == "function" then + if not self:IsDisabled() then + self:OnTooltipUpdate() + end + end + end, + 'clickable', self.clickableTooltip, + 'data', CheckFuBar() and FuBar.db.profile.tooltip or self.db and self.db.profile.detachedTooltip or {}, + 'detachedData', self.db and self.db.profile.detachedTooltip or {}, + 'point', function(frame) + if frame:GetTop() > GetScreenHeight() / 2 then + local x = frame:GetCenter() + if x < GetScreenWidth() / 3 then + return "TOPLEFT", "BOTTOMLEFT" + elseif x < GetScreenWidth() * 2 / 3 then + return "TOP", "BOTTOM" + else + return "TOPRIGHT", "BOTTOMRIGHT" + end + else + local x = frame:GetCenter() + if x < GetScreenWidth() / 3 then + return "BOTTOMLEFT", "TOPLEFT" + elseif x < GetScreenWidth() * 2 / 3 then + return "BOTTOM", "TOP" + else + return "BOTTOMRIGHT", "TOPRIGHT" + end + end + end, + 'menu', self.OnMenuRequest and function(level, value, valueN_1, valueN_2, valueN_3, valueN_4) + if level == 1 then + local name = tostring(self) + if not string.find(name, '^table:') then + name = string.gsub(name, "|c%x%x%x%x%x%x%x%x(.-)|r", "%1") + Dewdrop:AddLine( + 'text', name, + 'isTitle', true + ) + end + end + if type(self.OnMenuRequest) == "function" then + self:OnMenuRequest(level, value, true, valueN_1, valueN_2, valueN_3, valueN_4) + elseif type(self.OnMenuRequest) == "table" then + Dewdrop:FeedAceOptionsTable(self.OnMenuRequest) + end + end, + 'hideWhenEmpty', self.tooltipHiddenWhenEmpty + ) + local func = self.frame:GetScript("OnEnter") + local function newFunc(...) + func(...) + + if FuBar and FuBar.IsHidingTooltipsInCombat and FuBar:IsHidingTooltipsInCombat() and InCombatLockdown() then + local frame = this.self.frame + if Tablet:IsAttached(frame) then + Tablet:Close(frame) + end + end + end + self.frame:SetScript("OnEnter", newFunc) + end +end + +function FuBarPlugin:UpdateTooltip() + FuBarPlugin.RegisterTablet(self) + if self:IsMinimapAttached() and not self:IsTooltipDetached() and self.minimapFrame then + Tablet:Refresh(self.minimapFrame) + else + Tablet:Refresh(self.frame) + end +end + +function FuBarPlugin:OnProfileEnable() + self:Update() +end + +function FuBarPlugin:Show(panelId) + if self.frame:IsShown() or (self.minimapFrame and self.minimapFrame:IsShown()) then + return + end + if panelId ~= false then + if self.db then + self.db.profile.hidden = nil + end + end + if self.IsActive and not self:IsActive() then + self.panelIdTmp = panelId + self:ToggleActive() + self.panelIdTmp = nil + if self.db then + self.db.profile.disabled = nil + end + elseif not self.db or not self.db.profile.hidden then + if panelId == 0 or not CheckFuBar() then + AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION):AddPlugin(self) + else + FuBar:ShowPlugin(self, panelId or self.panelIdTmp) + end + if not self.userDefinedFrame then + if not self:IsTextShown() then + self.textFrame:SetText("") + self.textFrame:SetWidth(epsilon) + self.textFrame:Hide() + end + if not self:IsIconShown() then + self.iconFrame:SetWidth(epsilon) + self.iconFrame:Hide() + end + end + if AceOO.inherits(self, "AceAddon-2.0") then + local AceAddon = AceLibrary("AceAddon-2.0") + if AceAddon.addonsEnabled and not AceAddon.addonsEnabled[self] then + return + end + end + self:Update() + end +end + +function FuBarPlugin:Hide(check) + if not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) then + return + end + if self.hideWithoutStandby and self.db and check ~= false then + self.db.profile.hidden = true + end + if not self.hideWithoutStandby then + if self.db and not self.overrideTooltip and not self.cannotDetachTooltip and self:IsTooltipDetached() and self.db.profile.detachedTooltip and self.db.profile.detachedTooltip.detached then + self:ReattachTooltip() + self.db.profile.detachedTooltip.detached = true + end + if self.IsActive and self:IsActive() and self.ToggleActive and (not CheckFuBar() or not FuBar:IsChangingProfile()) then + self:ToggleActive() + end + end + if self.panel then + self.panel:RemovePlugin(self) + end + self.frame:Hide() + if self.minimapFrame then + self.minimapFrame:Hide() + end + + if Dewdrop:IsOpen(self.frame) or (self.minimapFrame and Dewdrop:IsOpen(self.minimapFrame)) then + Dewdrop:Close() + end +end + +function FuBarPlugin:SetIcon(path) + if not path then + return + end + FuBarPlugin:argCheck(path, 2, "string", "boolean") + FuBarPlugin:assert(self.hasIcon, "Cannot set icon unless self.hasIcon is set. (" .. self:GetTitle() .. ")") + if not self.iconFrame then + return + end + if type(path) ~= "string" then + path = format("Interface\\AddOns\\%s\\icon", FuBarPlugin.folderNames[self] or self.folderName) + elseif not string.find(path, '^Interface[\\/]') then + path = format("Interface\\AddOns\\%s\\%s", FuBarPlugin.folderNames[self] or self.folderName, path) + end + if string.sub(path, 1, 16) == "Interface\\Icons\\" then + self.iconFrame:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + self.iconFrame:SetTexCoord(0, 1, 0, 1) + end + self.iconFrame:SetTexture(path) + if self.minimapIcon then + if string.sub(path, 1, 16) == "Interface\\Icons\\" then + self.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + self.minimapIcon:SetTexCoord(0, 1, 0, 1) + end + self.minimapIcon:SetTexture(path) + end +end + +function FuBarPlugin:GetIcon() + if self.hasIcon then + return self.iconFrame:GetTexture() + end +end + +function FuBarPlugin:CheckWidth(force) + FuBarPlugin:argCheck(force, 2, "boolean", "nil") + if (self.iconFrame and self.iconFrame:IsShown()) or (self.textFrame and self.textFrame:IsShown()) then + if (self.db and self.db.profile and not self:IsIconShown()) or not self.hasIcon then + self.iconFrame:SetWidth(epsilon) + end + local width + if not self.hasNoText then + self.textFrame:SetHeight(0) + self.textFrame:SetWidth(500) + width = self.textFrame:GetStringWidth() + 1 + self.textFrame:SetWidth(width) + self.textFrame:SetHeight(self.textFrame:GetHeight()) + end + if self.hasNoText or not self.textFrame:IsShown() then + self.frame:SetWidth(self.iconFrame:GetWidth()) + if self.panel and self.panel:GetPluginSide(self) == "CENTER" then + self.panel:UpdateCenteredPosition() + end + elseif force or not self.textWidth or self.textWidth < width or self.textWidth - 8 > width then + self.textWidth = width + self.textFrame:SetWidth(width) + if self.iconFrame and self.iconFrame:IsShown() then + self.frame:SetWidth(width + self.iconFrame:GetWidth()) + else + self.frame:SetWidth(width) + end + if self.panel and self.panel:GetPluginSide(self) == "CENTER" then + self.panel:UpdateCenteredPosition() + end + end + end +end + +function FuBarPlugin:SetText(text) + if not self.textFrame then + return + end + FuBarPlugin:assert(not self.hasNoText, "Cannot set text if self.hasNoText has been set. (" .. self:GetTitle() .. ")") + FuBarPlugin:argCheck(text, 2, "string", "number") + if text == "" then + if self.hasIcon then + self:ShowIcon() + else + text = self:GetTitle() + end + end + if not self:IsTextColored() then + text = string.gsub(string.gsub(text, "|c%x%x%x%x%x%x%x%x", ""), "|r", "") + end + self.textFrame:SetText(text) + self:CheckWidth() +end + +function FuBarPlugin:GetText() + FuBarPlugin:assert(self.textFrame, "Cannot get text without a self.textFrame (" .. self:GetTitle() .. ")") + if not self.hasNoText then + return self.textFrame:GetText() or "" + end +end + +function FuBarPlugin:IsIconShown() + if not self.hasIcon then + return false + elseif self.hasNoText then + return true + elseif not self.db then + return true + elseif self.db and self.db.profile.showIcon == nil then + return true + else + return (self.db and (self.db.profile.showIcon == 1 or self.db.profile.showIcon == true)) and true or false + end +end + +function FuBarPlugin:ToggleIconShown() + FuBarPlugin:assert(self.iconFrame, "Cannot toggle icon without a self.iconFrame (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.hasIcon, "Cannot show icon unless self.hasIcon is set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(not self.hasNoText, "Cannot hide icon if self.hasNoText is set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.textFrame, "Cannot hide icon if self.textFrame is not set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.iconFrame, "Cannot hide icon if self.iconFrame is not set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.db, "Cannot hide icon if self.db is not available. (" .. self:GetTitle() .. ")") + local value = not self:IsIconShown() + self.db.profile.showIcon = value + if value then + if not self:IsTextShown() and self.textFrame:IsShown() and self.textFrame:GetText() == self:GetTitle() then + self.textFrame:Hide() + self.textFrame:SetText("") + end + self.iconFrame:Show() + self.iconFrame:SetWidth(self.iconFrame:GetHeight()) + else + if not self.textFrame:IsShown() or not self.textFrame:GetText() then + self.textFrame:Show() + self.textFrame:SetText(self:GetTitle()) + end + self.iconFrame:Hide() + self.iconFrame:SetWidth(epsilon) + end + self:CheckWidth(true) + return value +end + +function FuBarPlugin:ShowIcon() + if not self:IsIconShown() then + self:ToggleIconShown() + end +end + +function FuBarPlugin:HideIcon() + if self:IsIconShown() then + self:ToggleIconShown() + end +end + +function FuBarPlugin:IsTextShown() + if self.hasNoText then + return false + elseif not self.hasIcon then + return true + elseif not self.db then + return true + elseif self.db and self.db.profile.showText == nil then + return true + else + return (self.db and (self.db.profile.showText == 1 or self.db.profile.showText == true)) and true or false + end +end + +function FuBarPlugin:ToggleTextShown() + FuBarPlugin:assert(not self.cannotHideText, "Cannot hide text unless self.cannotHideText is unset. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.hasIcon, "Cannot show text unless self.hasIcon is set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(not self.hasNoText, "Cannot hide text if self.hasNoText is set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.textFrame, "Cannot hide text if self.textFrame is not set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.iconFrame, "Cannot hide text if self.iconFrame is not set. (" .. self:GetTitle() .. ")") + FuBarPlugin:assert(self.db, "Cannot hide text if self.db is not available. (" .. self:GetTitle() .. ")") + local value = not self:IsTextShown() + self.db.profile.showText = value + if value then + self.textFrame:Show() + self:UpdateText() + else + self.textFrame:SetText("") + self.textFrame:SetWidth(epsilon) + self.textFrame:Hide() + if not self:IsIconShown() then + DropDownList1:Hide() + end + self:ShowIcon() + end + self:CheckWidth(true) + return value +end + +function FuBarPlugin:ShowText() + if not self:IsTextShown() then + self:ToggleTextShown() + end +end + +function FuBarPlugin:HideText() + if self:IsTextShown() then + self:ToggleTextShown() + end +end + +function FuBarPlugin:IsTooltipDetached() + FuBarPlugin.RegisterTablet(self) + return not Tablet:IsAttached(self.frame) +end + +function FuBarPlugin:ToggleTooltipDetached() + FuBarPlugin.RegisterTablet(self) + if self:IsTooltipDetached() then + Tablet:Attach(self.frame) + else + Tablet:Detach(self.frame) + end + if Dewdrop then Dewdrop:Close() end +end + +function FuBarPlugin:DetachTooltip() + FuBarPlugin.RegisterTablet(self) + Tablet:Detach(self.frame) +end + +function FuBarPlugin:ReattachTooltip() + FuBarPlugin.RegisterTablet(self) + Tablet:Attach(self.frame) +end + +function FuBarPlugin:GetDefaultPosition() + return self.defaultPosition or "LEFT" +end + +local function IsCorrectPanel(panel) + if type(panel) ~= "table" then + return false + elseif type(panel.AddPlugin) ~= "function" then + return false + elseif type(panel.RemovePlugin) ~= "function" then + return false + elseif type(panel.GetNumPlugins) ~= "function" then + return false + elseif type(panel:GetNumPlugins()) ~= "number" then + return false + elseif type(panel.GetPlugin) ~= "function" then + return false + elseif type(panel.HasPlugin) ~= "function" then + return false + elseif type(panel.GetPluginSide) ~= "function" then + return false + end + return true +end + +function FuBarPlugin:SetPanel(panel) + if panel then + FuBarPlugin:assert(IsCorrectPanel(panel), "Bad argument #2 to `SetPanel'. Panel does not have the correct API.") + end + self.panel = panel +end + +function FuBarPlugin:SetFontSize(size) + FuBarPlugin:assert(not self.userDefinedFrame, (self.name and self.name .. ": " or "") .. "You must provide a SetFontSize(size) method if you provide your own frame.") + if self.hasIcon then + FuBarPlugin:assert(self.iconFrame, (self.name and self.name .. ": " or "") .. "No iconFrame found") + self.iconFrame:SetWidth(size + 3) + self.iconFrame:SetHeight(size + 3) + end + if not self.hasNoText then + FuBarPlugin:assert(self.textFrame, (self.name and self.name .. ": " or "") .. "No textFrame found") + local font, _, flags = self.textFrame:GetFont() + self.textFrame:SetFont(font, size, flags) + end + self:CheckWidth() +end + +function FuBarPlugin:IsLoadOnDemand() + return IsAddOnLoadOnDemand(FuBarPlugin.folderNames[self] or self.folderName) +end + +function FuBarPlugin:IsDisabled() + return self.IsActive and not self:IsActive() or false +end + +function FuBarPlugin:OnInstanceInit(target) + if not AceEvent then + self:error(MAJOR_VERSION .. " requires AceEvent-2.0.") + elseif not Tablet then + self:error(MAJOR_VERSION .. " requires Tablet-2.0.") + elseif not Dewdrop then + self:error(MAJOR_VERSION .. " requires Dewdrop-2.0.") + end + self.registry[target] = true + + local _,_,folderName = string.find(debugstack(6, 1, 0), "\\AddOns\\(.*)\\") + target.folderName = folderName + self.folderNames[target] = folderName +end + +local frame_OnClick, frame_OnDoubleClick, frame_OnMouseDown, frame_OnMouseUp, frame_OnReceiveDrag, frame_OnEnter, frame_OnLeave + +function FuBarPlugin:CreateBasicPluginFrame(name) + local frame = CreateFrame("Button", name, UIParent) + frame:SetFrameStrata("HIGH") + frame:SetFrameLevel(7) + frame:EnableMouse(true) + frame:EnableMouseWheel(true) + frame:SetMovable(true) + frame:SetWidth(150) + frame:SetHeight(24) + frame:SetPoint("CENTER", UIParent, "CENTER") + frame.self = self + if not frame_OnEnter then + function frame_OnEnter() + if type(this.self.OnEnter) == "function" then + this.self:OnEnter() + end + end + end + frame:SetScript("OnEnter", frame_OnEnter) + if not frame_OnLeave then + function frame_OnLeave() + if type(this.self.OnLeave) == "function" then + this.self:OnLeave() + end + end + end + frame:SetScript("OnLeave", frame_OnLeave) + if not frame_OnClick then + function frame_OnClick() + if type(this.self.OnClick) == "function" then + this.self:OnClick(arg1) + end + end + end + frame:SetScript("OnClick", frame_OnClick) + if not frame_OnDoubleClick then + function frame_OnDoubleClick() + if type(this.self.OnDoubleClick) == "function" then + this.self:OnDoubleClick(arg1) + end + end + end + frame:SetScript("OnDoubleClick", frame_OnDoubleClick) + if not frame_OnMouseDown then + function frame_OnMouseDown() + if arg1 == "RightButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then + this.self:OpenMenu() + return + else + HideDropDownMenu(1) + if type(this.self.OnMouseDown) == "function" then + this.self:OnMouseDown(arg1) + end + end + end + end + frame:SetScript("OnMouseDown", frame_OnMouseDown) + if not frame_OnMouseUp then + function frame_OnMouseUp() + if type(this.self.OnMouseUp) == "function" then + this.self:OnMouseUp(arg1) + end + end + end + frame:SetScript("OnMouseUp", frame_OnMouseUp) + if not frame_OnReceiveDrag then + function frame_OnReceiveDrag() + if type(this.self.OnReceiveDrag) == "function" then + this.self:OnReceiveDrag() + end + end + end + frame:SetScript("OnReceiveDrag", frame_OnReceiveDrag) + return frame +end + +local child_OnEnter, child_OnLeave, child_OnClick, child_OnDoubleClick, child_OnMouseDown, child_OnMouseUp, child_OnReceiveDrag +function FuBarPlugin:CreatePluginChildFrame(frameType, name, parent) + FuBarPlugin:assert(self.frame, (self.name and self.name .. ": " or "") .. "You must have self.frame declared in order to add child frames") + FuBarPlugin:argCheck(frameType, 1, "string") + local child = CreateFrame(frameType, name, parent) + if parent then + child:SetFrameLevel(parent:GetFrameLevel() + 2) + end + child.self = self + if not child_OnEnter then + function child_OnEnter(...) + if this.self.frame:GetScript("OnEnter") then + this.self.frame:GetScript("OnEnter")(...) + end + end + end + child:SetScript("OnEnter", child_OnEnter) + if not child_OnLeave then + function child_OnLeave(...) + if this.self.frame:GetScript("OnLeave") then + this.self.frame:GetScript("OnLeave")(...) + end + end + end + child:SetScript("OnLeave", child_OnLeave) + if child:HasScript("OnClick") then + if not child_OnClick then + function child_OnClick(...) + if this.self.frame:HasScript("OnClick") and this.self.frame:GetScript("OnClick") then + this.self.frame:GetScript("OnClick")(...) + end + end + end + child:SetScript("OnClick", child_OnClick) + end + if child:HasScript("OnDoubleClick") then + if not child_OnDoubleClick then + function child_OnDoubleClick(...) + if this.self.frame:HasScript("OnDoubleClick") and this.self.frame:GetScript("OnDoubleClick") then + this.self.frame:GetScript("OnDoubleClick")(...) + end + end + end + child:SetScript("OnDoubleClick", child_OnDoubleClick) + end + if not child_OnMouseDown then + function child_OnMouseDown(...) + if this.self.frame:HasScript("OnMouseDown") and this.self.frame:GetScript("OnMouseDown") then + this.self.frame:GetScript("OnMouseDown")(...) + end + end + end + child:SetScript("OnMouseDown", child_OnMouseDown) + if not child_OnMouseUp then + function child_OnMouseUp(...) + if this.self.frame:HasScript("OnMouseUp") and this.self.frame:GetScript("OnMouseUp") then + this.self.frame:GetScript("OnMouseUp")(...) + end + end + end + child:SetScript("OnMouseUp", child_OnMouseUp) + if not child_OnReceiveDrag then + function child_OnReceiveDrag(this) + if this.self.frame:HasScript("OnReceiveDrag") and this.self.frame:GetScript("OnReceiveDrag") then + this.self.frame:GetScript("OnReceiveDrag")() + end + end + end + child:SetScript("OnReceiveDrag", child_OnReceiveDrag) + return child +end + +function FuBarPlugin:OpenMenu(frame) + if not frame then + frame = self:GetFrame() + end + if not frame or not self:GetFrame() or Dewdrop:IsOpen(frame) then + Dewdrop:Close() + return + end + Tablet:Close() + + if not Dewdrop:IsRegistered(self:GetFrame()) then + if type(self.OnMenuRequest) == "table" and (not self.OnMenuRequest.handler or self.OnMenuRequest.handler == self) and self.OnMenuRequest.type == "group" then + Dewdrop:InjectAceOptionsTable(self, self.OnMenuRequest) + if self.OnMenuRequest.args and CheckFuBar() and not self.independentProfile then + self.OnMenuRequest.args.profile = nil + end + end + Dewdrop:Register(self:GetFrame(), + 'children', type(self.OnMenuRequest) == "table" and self.OnMenuRequest or function(level, value, valueN_1, valueN_2, valueN_3, valueN_4) + if level == 1 then + if not self.hideMenuTitle then + Dewdrop:AddLine( + 'text', self:GetTitle(), + 'isTitle', true + ) + end + + if self.OnMenuRequest then + self:OnMenuRequest(level, value, false, valueN_1, valueN_2, valueN_3, valueN_4) + end + + if not self.overrideMenu then + if self.MenuSettings and not self.hideMenuTitle then + Dewdrop:AddLine() + end + self:AddImpliedMenuOptions() + end + else + if not self.overrideMenu and self:AddImpliedMenuOptions() then + else + if self.OnMenuRequest then + self:OnMenuRequest(level, value, false, valueN_1, valueN_2, valueN_3, valueN_4) + end + end + end + if level == 1 then + Dewdrop:AddLine( + 'text', CLOSE, + 'tooltipTitle', CLOSE, + 'tooltipText', CLOSE_DESC, + 'func', Dewdrop.Close, + 'arg1', Dewdrop + ) + end + end, + 'point', function(frame) + local x, y = frame:GetCenter() + local leftRight + if x < GetScreenWidth() / 2 then + leftRight = "LEFT" + else + leftRight = "RIGHT" + end + if y < GetScreenHeight() / 2 then + return "BOTTOM" .. leftRight, "TOP" .. leftRight + else + return "TOP" .. leftRight, "BOTTOM" .. leftRight + end + end, + 'dontHook', true + ) + end + if frame == self:GetFrame() then + Dewdrop:Open(self:GetFrame()) + else + Dewdrop:Open(frame, self:GetFrame()) + end +end + +local impliedMenuOptions +function FuBarPlugin:AddImpliedMenuOptions(level) + FuBarPlugin:argCheck(level, 2, "number", "nil") + if not impliedMenuOptions then + impliedMenuOptions = {} + end + if not impliedMenuOptions[self] then + impliedMenuOptions[self] = { type = 'group', args = {} } + Dewdrop:InjectAceOptionsTable(self, impliedMenuOptions[self]) + if impliedMenuOptions[self].args and CheckFuBar() and not self.independentProfile then + impliedMenuOptions[self].args.profile = nil + end + end + return Dewdrop:FeedAceOptionsTable(impliedMenuOptions[self], level and level - 1) +end + +function FuBarPlugin.OnEmbedInitialize(FuBarPlugin, self) + if not self.frame then + local name = "FuBarPlugin" .. self:GetTitle() .. "Frame" + local frame = _G[name] + if not frame or not _G[name .. "Text"] or not _G[name .. "Icon"] then + frame = self:CreateBasicPluginFrame(name) + + local icon = frame:CreateTexture(name .. "Icon", "ARTWORK") + icon:SetWidth(16) + icon:SetHeight(16) + icon:SetPoint("LEFT", frame, "LEFT") + + local text = frame:CreateFontString(name .. "Text", "ARTWORK") + text:SetWidth(134) + text:SetHeight(24) + text:SetPoint("LEFT", icon, "RIGHT", 0, 1) + text:SetFontObject(GameFontNormal) + end + self.frame = frame + self.textFrame = _G[name .. "Text"] + self.iconFrame = _G[name .. "Icon"] + else + self.userDefinedFrame = true + end + + self.frame.plugin = self + self.frame:SetParent(UIParent) + self.frame:SetPoint("RIGHT", UIParent, "LEFT", -5, 0) + self.frame:Hide() + + if self.hasIcon then + self:SetIcon(self.hasIcon) + end + + if CheckFuBar() then + FuBar:RegisterPlugin(self) + end +end + +local CheckShow = function(self, panelId) + if not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) then + self:Show(panelId) + Dewdrop:Refresh(2) + end +end + +local recheckPlugins +function FuBarPlugin.OnEmbedEnable(FuBarPlugin, self) + if not self.userDefinedFrame then + if self:IsIconShown() then + self.iconFrame:Show() + else + self.iconFrame:Hide() + end + end + self:CheckWidth(true) + + if not self.hideWithoutStandby or (self.db and not self.db.profile.hidden) then + if FuBarPlugin.enabledPlugins[self] then + CheckShow(self, self.panelIdTmp) + else + FuBarPlugin:ScheduleEvent(CheckShow, 0, self, self.panelIdTmp) + end + end + FuBarPlugin.enabledPlugins[self] = true + + if not self.overrideTooltip and not self.cannotDetachTooltip and self.db and self.db.profile.detachedTooltip and self.db.profile.detachedTooltip.detached then + FuBarPlugin:ScheduleEvent(self.DetachTooltip, 0, self) + end + + if self:IsLoadOnDemand() and CheckFuBar() then + if not FuBar.db.profile.loadOnDemand then + FuBar.db.profile.loadOnDemand = {} + end + if not FuBar.db.profile.loadOnDemand[FuBarPlugin.folderNames[self] or self.folderName] then + FuBar.db.profile.loadOnDemand[FuBarPlugin.folderNames[self] or self.folderName] = {} + end + FuBar.db.profile.loadOnDemand[FuBarPlugin.folderNames[self] or self.folderName].disabled = nil + end + + if CheckFuBar() and AceLibrary:HasInstance("AceConsole-2.0") then + if not recheckPlugins then + local AceConsole = AceLibrary("AceConsole-2.0") + local AceOO = AceLibrary("AceOO-2.0") + function recheckPlugins() + for k,v in pairs(AceConsole.registry) do + if type(v) == "table" and v.args and AceOO.inherits(v.handler, FuBarPlugin) and not v.handler.independentProfile then + v.args.profile = nil + end + end + end + end + FuBarPlugin:ScheduleEvent(recheckPlugins, 0) + end +end + +function FuBarPlugin.OnEmbedDisable(FuBarPlugin, self) + self:Hide(false) + + if self:IsLoadOnDemand() and CheckFuBar() then + if not FuBar.db.profile.loadOnDemand then + FuBar.db.profile.loadOnDemand = {} + end + if not FuBar.db.profile.loadOnDemand[FuBarPlugin.folderNames[self] or self.folderName] then + FuBar.db.profile.loadOnDemand[FuBarPlugin.folderNames[self] or self.folderName] = {} + end + FuBar.db.profile.loadOnDemand[FuBarPlugin.folderNames[self] or self.folderName].disabled = true + end +end + +function FuBarPlugin.OnEmbedProfileEnable(FuBarPlugin, self) + self:Update() + if self.db and self.db.profile then + if not self.db.profile.detachedTooltip then + self.db.profile.detachedTooltip = {} + end + if Tablet.registry[self.frame] then + Tablet:UpdateDetachedData(self.frame, self.db.profile.detachedTooltip) + else + FuBarPlugin.RegisterTablet(self) + end + local MinimapContainer = AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION) + if MinimapContainer:HasPlugin(self) then + AceLibrary(MINIMAPCONTAINER_MAJOR_VERSION):ReadjustLocation(self) + end + end +end + +function FuBarPlugin.GetAceOptionsDataTable(FuBarPlugin, self) + return { + icon = { + type = "toggle", + name = SHOW_ICON, + desc = SHOW_ICON_DESC, + set = "ToggleIconShown", + get = "IsIconShown", + hidden = function() + return not self.hasIcon or self.hasNoText or self:IsDisabled() or self:IsMinimapAttached() or not self.db + end, + order = -13.7, + handler = self, + }, + text = { + type = "toggle", + name = SHOW_TEXT, + desc = SHOW_TEXT_DESC, + set = "ToggleTextShown", + get = "IsTextShown", + hidden = function() + return self.cannotHideText or not self.hasIcon or self.hasNoText or self:IsDisabled() or self:IsMinimapAttached() or not self.db + end, + order = -13.6, + handler = self, + }, + colorText = { + type = "toggle", + name = SHOW_COLORED_TEXT, + desc = SHOW_COLORED_TEXT_DESC, + set = "ToggleTextColored", + get = "IsTextColored", + hidden = function() + return self.userDefinedFrame or self.hasNoText or self.hasNoColor or self:IsDisabled() or self:IsMinimapAttached() or not self.db + end, + order = -13.5, + handler = self, + }, + detachTooltip = { + type = "toggle", + name = DETACH_TOOLTIP, + desc = DETACH_TOOLTIP_DESC, + get = "IsTooltipDetached", + set = "ToggleTooltipDetached", + hidden = function() + return self.overrideTooltip or self.cannotDetachTooltip or self:IsDisabled() + end, + order = -13.4, + handler = self, + }, + lockTooltip = { + type = "toggle", + name = LOCK_TOOLTIP, + desc = LOCK_TOOLTIP_DESC, + get = function() + return Tablet:IsLocked(self.frame) + end, + set = function() + return Tablet:ToggleLocked(self.frame) + end, + disabled = function() + return not self:IsTooltipDetached() + end, + hidden = function() + return self.overrideTooltip or self.cannotDetachTooltip or self:IsDisabled() + end, + order = -13.3, + handler = self, + }, + position = { + type = "text", + name = POSITION, + desc = POSITION_DESC, + validate = { + LEFT = POSITION_LEFT, + CENTER = POSITION_CENTER, + RIGHT = POSITION_RIGHT + }, + get = function() + return self.panel and self.panel:GetPluginSide(self) + end, + set = function(value) + if self.panel then + self.panel:SetPluginSide(self, value) + end + end, + hidden = function() + return self:IsMinimapAttached() or self:IsDisabled() or not self.panel + end, + order = -13.2, + handler = self, + }, + minimapAttach = { + type = "toggle", + name = ATTACH_TO_MINIMAP, + desc = ATTACH_TO_MINIMAP_DESC, + get = "IsMinimapAttached", + set = "ToggleMinimapAttached", + hidden = function() + return (self.cannotAttachToMinimap and not self:IsMinimapAttached()) or not CheckFuBar() or self:IsDisabled() + end, + order = -13.1, + handler = self, + }, + hide = { + type = "toggle", + cmdName = HIDE_FUBAR_PLUGIN_CMD, + guiName = HIDE_FUBAR_PLUGIN, + desc = HIDE_FUBAR_PLUGIN_DESC, + get = function() + return not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) + end, + set = function() + if not self.frame:IsShown() and (not self.minimapFrame or not self.minimapFrame:IsShown()) then + self:Show() + else + self:Hide() + end + end, + hidden = function() + return not self.hideWithoutStandby or self:IsDisabled() + end, + order = -13, + handler = self, + }, + } +end + +local function activate(self, oldLib, oldDeactivate) + FuBarPlugin = self + + if oldLib then + self.registry = oldLib.registry + self.folderNames = oldLib.folderNames + self.enabledPlugins = oldLib.enabledPlugins + end + + if not self.registry then + self.registry = {} + end + if not self.folderNames then + self.folderNames = {} + end + if not self.enabledPlugins then + self.enabledPlugins = {} + end + + FuBarPlugin.activate(self, oldLib, oldDeactivate) + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +local function external(self, major, instance) + if major == "AceEvent-2.0" then + AceEvent = instance + + AceEvent:embed(self) + elseif major == "Tablet-2.0" then + Tablet = instance + elseif major == "Dewdrop-2.0" then + Dewdrop = instance + end +end + +AceLibrary:Register(FuBarPlugin, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) + +local MinimapContainer = {} + +local function IsMinimapSquare() + return IsAddOnLoaded("CornerMinimap") or IsAddOnLoaded("SquareMinimap") or IsAddOnLoaded("Squeenix") or (IsAddOnLoaded("simpleMinimap") and simpleMinimap:HasModule("skins") and simpleMinimap:GetModule("skins"):GetShape() == "square") +end + +function MinimapContainer:AddPlugin(plugin) + if CheckFuBar() and FuBar:IsChangingProfile() then + return + end + if plugin.panel ~= nil then + plugin.panel:RemovePlugin(plugin) + end + plugin.panel = self + if not plugin.minimapFrame then + local frame = CreateFrame("Button", plugin.frame:GetName() .. "MinimapButton", Minimap) + plugin.minimapFrame = frame + AceLibrary(MAJOR_VERSION).RegisterTablet(plugin) + Tablet:Register(frame, plugin.frame) + frame.plugin = plugin + frame:SetWidth(31) + frame:SetHeight(31) + frame:SetFrameStrata("BACKGROUND") + frame:SetFrameLevel(4) + frame:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight") + local icon = frame:CreateTexture(frame:GetName() .. "Icon", "BACKGROUND") + plugin.minimapIcon = icon + local path = plugin:GetIcon() or (plugin.iconFrame and plugin.iconFrame:GetTexture()) or "Interface\\Icons\\INV_Misc_QuestionMark" + icon:SetTexture(path) + if string.sub(path, 1, 16) == "Interface\\Icons\\" then + icon:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + icon:SetTexCoord(0, 1, 0, 1) + end + icon:SetWidth(20) + icon:SetHeight(20) + icon:SetPoint("TOPLEFT", frame, "TOPLEFT", 7, -5) + local overlay = frame:CreateTexture(frame:GetName() .. "Overlay","OVERLAY") +overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder") + overlay:SetWidth(53) + overlay:SetHeight(53) + overlay:SetPoint("TOPLEFT",frame,"TOPLEFT") + frame:EnableMouse(true) + frame:RegisterForClicks("LeftButtonUp") + frame.plugin = plugin + frame:SetScript("OnClick", function() + if type(plugin.OnClick) == "function" then + if not this.dragged then + plugin:OnClick(arg1) + end + end + end) + frame:SetScript("OnDoubleClick", function() + if type(plugin.OnDoubleClick) == "function" then + plugin:OnDoubleClick(arg1) + end + end) + frame:SetScript("OnReceiveDrag", function() + if type(plugin.OnReceiveDrag) == "function" then + if not this.dragged then + plugin:OnReceiveDrag() + end + end + end) + frame:SetScript("OnMouseDown", function() + this.dragged = false + if arg1 == "LeftButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then + HideDropDownMenu(1) + if type(plugin.OnMouseDown) == "function" then + plugin:OnMouseDown(arg1) + end + elseif arg1 == "RightButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then + plugin:OpenMenu(frame) + else + HideDropDownMenu(1) + if type(plugin.OnMouseDown) == "function" then + plugin:OnMouseDown(arg1) + end + end + if plugin.OnClick or plugin.OnMouseDown or plugin.OnMouseUp or plugin.OnDoubleClick then + if string.sub(this.plugin.minimapIcon:GetTexture(), 1, 16) == "Interface\\Icons\\" then + plugin.minimapIcon:SetTexCoord(0.14, 0.86, 0.14, 0.86) + else + plugin.minimapIcon:SetTexCoord(0.1, 0.9, 0.1, 0.9) + end + end + end) + frame:SetScript("OnMouseUp", function() + if not this.dragged and type(plugin.OnMouseUp) == "function" then + plugin:OnMouseUp(arg1) + end + if string.sub(this.plugin.minimapIcon:GetTexture(), 1, 16) == "Interface\\Icons\\" then + plugin.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + plugin.minimapIcon:SetTexCoord(0, 1, 0, 1) + end + end) + frame:RegisterForDrag("LeftButton") + frame:SetScript("OnDragStart", self.OnDragStart) + frame:SetScript("OnDragStop", self.OnDragStop) + end + plugin.frame:Hide() + plugin.minimapFrame:Show() + self:ReadjustLocation(plugin) + table.insert(self.plugins, plugin) + local exists = false + return true +end + +function MinimapContainer:RemovePlugin(index) + if CheckFuBar() and FuBar:IsChangingProfile() then + return + end + if type(index) == "table" then + index = self:IndexOfPlugin(index) + if not index then + return + end + end + local t = self.plugins + local plugin = t[index] + assert(plugin.panel == self, "Plugin has improper panel field") + plugin:SetPanel(nil) + table.remove(t, index) + return true +end + +function MinimapContainer:ReadjustLocation(plugin) + local frame = plugin.minimapFrame + if plugin.db and plugin.db.profile.minimapPositionWild then + frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", plugin.db.profile.minimapPositionX, plugin.db.profile.minimapPositionY) + elseif not plugin.db and plugin.minimapPositionWild then + frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", plugin.minimapPositionX, plugin.minimapPositionY) + else + local position + if plugin.db then + position = plugin.db.profile.minimapPosition or plugin.defaultMinimapPosition or math.random(1, 360) + else + position = plugin.minimapPosition or plugin.defaultMinimapPosition or math.random(1, 360) + end + local angle = math.rad(position or 0) + local x,y + if not IsMinimapSquare() then + x = math.cos(angle) * 80 + y = math.sin(angle) * 80 + else + x = 110 * math.cos(angle) + y = 110 * math.sin(angle) + x = math.max(-82, math.min(x, 84)) + y = math.max(-86, math.min(y, 82)) + end + frame:SetPoint("CENTER", Minimap, "CENTER", x, y) + end +end + +function MinimapContainer:GetPlugin(index) + return self.plugins[index] +end + +function MinimapContainer:GetNumPlugins() + return table.getn(self.plugins) +end + +function MinimapContainer:IndexOfPlugin(plugin) + for i,p in ipairs(self.plugins) do + if p == plugin then + return i, "MINIMAP" + end + end +end + +function MinimapContainer:HasPlugin(plugin) + return self:IndexOfPlugin(plugin) ~= nil +end + +function MinimapContainer:GetPluginSide(plugin) + local index = self:IndexOfPlugin(plugin) + assert(index, "Plugin not in panel") + return "MINIMAP" +end + +function MinimapContainer.OnDragStart() + this.dragged = true + this:LockHighlight() + this:SetScript("OnUpdate", MinimapContainer.OnUpdate) + if string.sub(this.plugin.minimapIcon:GetTexture(), 1, 16) == "Interface\\Icons\\" then + this.plugin.minimapIcon:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + this.plugin.minimapIcon:SetTexCoord(0, 1, 0, 1) + end +end + +function MinimapContainer.OnDragStop() + this:SetScript("OnUpdate", nil) + this:UnlockHighlight() +end + +function MinimapContainer.OnUpdate() + if not IsAltKeyDown() then + local mx, my = Minimap:GetCenter() + local px, py = GetCursorPosition() + local scale = UIParent:GetEffectiveScale() + px, py = px / scale, py / scale + local position = math.deg(math.atan2(py - my, px - mx)) + if position <= 0 then + position = position + 360 + elseif position > 360 then + position = position - 360 + end + if this.plugin.db then + this.plugin.db.profile.minimapPosition = position + this.plugin.db.profile.minimapPositionX = nil + this.plugin.db.profile.minimapPositionY = nil + this.plugin.db.profile.minimapPositionWild = nil + else + this.plugin.minimapPosition = position + this.plugin.minimapPositionX = nil + this.plugin.minimapPositionY = nil + this.plugin.minimapPositionWild = nil + end + else + local px, py = GetCursorPosition() + local scale = UIParent:GetEffectiveScale() + px, py = px / scale, py / scale + if this.plugin.db then + this.plugin.db.profile.minimapPositionX = px + this.plugin.db.profile.minimapPositionY = py + this.plugin.db.profile.minimapPosition = nil + this.plugin.db.profile.minimapPositionWild = true + else + this.plugin.minimapPositionX = px + this.plugin.minimapPositionY = py + this.plugin.minimapPosition = nil + this.plugin.minimapPositionWild = true + end + end + MinimapContainer:ReadjustLocation(this.plugin) +end + +local function activate(self, oldLib, oldDeactivate) + MinimapContainer = self + + if oldLib then + self.plugins = oldLib.plugins + end + + if not self.plugins then + self.plugins = {} + end + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +AceLibrary:Register(MinimapContainer, MINIMAPCONTAINER_MAJOR_VERSION, MINOR_VERSION, activate) diff --git a/libs/Roster-2.1/Roster-2.1.lua b/libs/Roster-2.1/Roster-2.1.lua new file mode 100644 index 0000000..10eab77 --- /dev/null +++ b/libs/Roster-2.1/Roster-2.1.lua @@ -0,0 +1,425 @@ +--[[ +Name: Roster-2.1 +Revision: $Revision: 21071 $ +X-ReleaseDate: $Date: 2006-12-17 13:56:50 -0500 (Sun, 17 Dec 2006) $ +Author: Maia (maia.proudmoore@gmail.com) +Website: http://www.wowace.com/ +Documentation: http://www.wowace.com/wiki/Roster-2.1 +SVN: http://svn.wowace.com/wowace/trunk/RosterLib/ +Description: Party/raid roster management +Dependencies: AceLibrary, AceOO-2.0, AceEvent-2.0 +]] + +local MAJOR_VERSION = "Roster-2.1" +local MINOR_VERSION = "$Revision: 21071 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary.") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end +if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end +if not AceLibrary:HasInstance("AceEvent-2.0") then error(MAJOR_VERSION .. " requires AceEvent-2.0") end + +local unknownUnits = {} +local Lib = {} +local roster +local new, del +do + local cache = setmetatable({}, {__mode='k'}) + function new() + local t = next(cache) + if t then + cache[t] = nil + return t + else + return {} + end + end + + function del(t) + for k in pairs(t) do + t[k] = nil + end + cache[t] = true + return nil + end +end + +------------------------------------------------ +-- activate, enable, disable +------------------------------------------------ + +local function activate(self, oldLib, oldDeactivate) + if oldLib then + if oldLib.roster then self.roster = oldLib.roster end + oldLib:UnregisterAllEvents() + oldLib:CancelAllScheduledEvents() + end + if not self.roster then self.roster = {} end + if oldDeactivate then oldDeactivate(oldLib) end + roster = self.roster +end + + +local function external(self, major, instance) + if major == "AceEvent-2.0" then + instance:embed(self) + if instance:IsFullyInitialized() then + self:AceEvent_FullyInitialized() + else + self:RegisterEvent("AceEvent_FullyInitialized") + end + end +end + +------------------------------------------------ +-- Internal functions +------------------------------------------------ + +function Lib:AceEvent_FullyInitialized() + self:TriggerEvent("RosterLib_Enabled") + + self:RegisterBucketEvent({"RAID_ROSTER_UPDATE", "PARTY_MEMBERS_CHANGED"}, 0.2, "ScanFullRoster") + self:RegisterBucketEvent("UNIT_PET", 0.2, "ScanPet") + + self:ScanFullRoster() +end + + +------------------------------------------------ +-- Unit iterator +------------------------------------------------ + +local UnitIterator +do + local rmem, pmem, step, count + local function SelfIterator() + while step do + local unit + if step == 1 then + -- STEP 1: player + unit = "player" + step = 2 + elseif step == 2 then + -- STEP 2: pet + unit = "pet" + step = nil + end + if unit and UnitExists(unit) then return unit end + end + end + + local function SelfAndPartyIterator() + while step do + local unit + if step <= 2 then + unit = SelfIterator() + if not step then step = 3 end + elseif step == 3 then + -- STEP 3: party units + unit = string.format("party%d", count) + step = 4 + elseif step == 4 then + -- STEP 4: party pets + unit = string.format("partypet%d", count) + count = count + 1 + step = count <= pmem and 3 or nil + end + if unit and UnitExists(unit) then return unit end + end + end + + local function RaidIterator() + while step do + local unit + if step == 1 then + -- STEP 1: raid units + unit = string.format("raid%d", count) + step = 2 + elseif step == 2 then + -- STEP 2: raid pets + unit = string.format("raidpet%d", count) + count = count + 1 + step = count <= rmem and 1 or nil + end + if unit and UnitExists(unit) then return unit end + end + end + + function UnitIterator() + rmem = GetNumRaidMembers() + step = 1 + if rmem == 0 then + pmem = GetNumPartyMembers() + if pmem == 0 then + return SelfIterator, false + else + count = 1 + return SelfAndPartyIterator, false + end + else + count = 1 + return RaidIterator, true + end + end +end + +------------------------------------------------ +-- Roster code +------------------------------------------------ + +local rosterScanCache = {} +function Lib:ScanFullRoster() + local changed + local it, isInRaid = UnitIterator() + -- save all units we currently have, this way we can check who to remove from roster later. + for name in pairs(roster) do + rosterScanCache[name] = true + end + -- update data + for unitid in it do + local name = self:CreateOrUpdateUnit(unitid, isInRaid) + -- we successfully added a unit, so we don't need to remove it next step + if name then + rosterScanCache[name] = nil + changed = true + end + end + -- clear units we had in roster that either left the raid or are unknown for some reason. + for name in pairs(rosterScanCache) do + self:RemoveUnit(name) + rosterScanCache[name] = nil + changed = true + end + self:ProcessRoster() + if changed then + self:TriggerEvent("RosterLib_RosterUpdated") + end +end + + + +function Lib:ScanPet(owner_list) + local changed + for owner in pairs(owner_list) do + local unitid = self:GetPetFromOwner(owner) + if not unitid then return end + + if not UnitExists(unitid) then + unknownUnits[unitid] = nil + -- find the pet in the roster we need to delete + for _,u in pairs(roster) do + if u.unitid == unitid then + self:RemoveUnit(u.name) + changed = true + end + end + else + _, changed = self:CreateOrUpdateUnit(unitid) + end + self:ProcessRoster() + end + if changed then + self:TriggerEvent("RosterLib_RosterUpdated") + end +end + + +function Lib:GetPetFromOwner(id) + -- convert party3 crap to raid IDs when in raid. + local owner = self:GetUnitIDFromUnit(id) + if not owner then return end + + -- get ID + if owner:find("raid") then + return owner:gsub("raid", "raidpet") + elseif owner:find("party") then + return owner:gsub("party", "partypet") + elseif owner == "player" then + return "pet" + else + return nil + end +end + + +function Lib:ScanUnknownUnits() + local changed + for unitid in pairs(unknownUnits) do + local name, c + if UnitExists(unitid) then + name, c = self:CreateOrUpdateUnit(unitid) + else + unknownUnits[unitid] = nil + end + -- some pets never have a name. too bad for them, farewell! + if not name and unitid:find("pet") then + unknownUnits[unitid] = nil + else + changed = changed or c + end + end + self:ProcessRoster() + if changed then + self:TriggerEvent("RosterLib_RosterUpdated") + end +end + + +function Lib:ProcessRoster() + if next(unknownUnits, nil) then + self:CancelScheduledEvent("ScanUnknownUnits") + self:ScheduleEvent("ScanUnknownUnits", self.ScanUnknownUnits, 1, self) + end +end + + +function Lib:CreateOrUpdateUnit(unitid, isInRaid) + -- check for name + local name = UnitName(unitid) + if name and name ~= UNKNOWNOBJECT and name ~= UKNOWNBEING and not UnitIsCharmed(unitid) then + local unit = roster[name] + local isPet = unitid:find("pet") + + -- clear stuff + unknownUnits[unitid] = nil + -- return if a pet attempts to replace a player name + -- this doesnt fix the problem with 2 pets overwriting each other FIXME + if isPet and unit and unit.class ~= "PET" then + return name + end + -- save old data if existing + local old_name, old_unitid, old_class, old_rank, old_subgroup, old_online + if unit then + old_name = unit.name + old_unitid = unit.unitid + old_class = unit.class + old_rank = unit.rank + old_subgroup = unit.subgroup + old_online = unit.online + else + -- object + unit = new() + roster[name] = unit + end + + local new_name, new_unitid, new_class, new_rank, new_subgroup, new_online + + -- name + new_name = name + -- unitid + new_unitid = unitid + -- class + if isPet then + new_class = "PET" + else + _, new_class = UnitClass(unitid) + end + if isInRaid == nil and GetNumRaidMembers() > 0 then + isInRaid = true + end + + -- subgroup and rank + new_subgroup = 1 + new_rank = 0 -- XXX Support party leader? + if isInRaid then + local _,_,num = unitid:find("(%d+)") + if num then + _, new_rank, new_subgroup = GetRaidRosterInfo(num) + end + end + -- online/offline status + new_online = UnitIsConnected(unitid) + + -- compare data + if not old_name + or new_name ~= old_name + or new_unitid ~= old_unitid + or new_class ~= old_class + or new_subgroup ~= old_subgroup + or new_rank ~= old_rank + or new_online ~= old_online + then + unit.name = new_name + unit.unitid = new_unitid + unit.class = new_class + unit.subgroup = new_subgroup + unit.rank = new_rank + unit.online = new_online + self:TriggerEvent("RosterLib_UnitChanged", + new_unitid, new_name, new_class, new_subgroup, new_rank, + old_name, old_unitid, old_class, old_subgroup, old_rank) + return name, true + end + return name + else + unknownUnits[unitid] = true + return false + end +end + + +function Lib:RemoveUnit(name) + local r = roster[name] + roster[name] = nil + self:TriggerEvent("RosterLib_UnitChanged", + nil, nil, nil, nil, nil, + r.name, r.unitid, r.class, r.subgroup, r.rank) + r = del(r) +end + + +------------------------------------------------ +-- API +------------------------------------------------ + +function Lib:GetUnitIDFromName(name) + if roster[name] then + return roster[name].unitid + else + return nil + end +end + + +function Lib:GetUnitIDFromUnit(unit) + local name = UnitName(unit) + if name and roster[name] then + return roster[name].unitid + else + return nil + end +end + + +function Lib:GetUnitObjectFromName(name) + return roster[name] +end + + +function Lib:GetUnitObjectFromUnit(unit) + local name = UnitName(unit) + return roster[name] +end + + +local function iter(t) + local key = t.key + local pets = t.pets + repeat + key = next(roster, key) + if not key then + t = del(t) + return nil + end + until (pets or roster[key].class ~= "PET") + t.key = key + return roster[key] +end + +function Lib:IterateRoster(pets) + local t = new() + t.pets = pets + return iter, t +end + +AceLibrary:Register(Lib, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) + diff --git a/libs/Tablet-2.0/Tablet-2.0.lua b/libs/Tablet-2.0/Tablet-2.0.lua new file mode 100644 index 0000000..d9865a7 --- /dev/null +++ b/libs/Tablet-2.0/Tablet-2.0.lua @@ -0,0 +1,2948 @@ +--[[ +Name: Tablet-2.0 +Revision: $Rev: 23368 $ +Author(s): ckknight (ckknight@gmail.com) +Website: http://ckknight.wowinterface.com/ +Documentation: http://www.wowace.com/index.php/Tablet-2.0 +SVN: http://svn.wowace.com/wowace/trunk/TabletLib/Tablet-2.0 +Description: A library to provide an efficient, featureful tooltip-style display. +Dependencies: AceLibrary, (optional) Dewdrop-2.0 +License: LGPL v2.1 +]] + +local MAJOR_VERSION = "Tablet-2.0" +local MINOR_VERSION = "$Revision: 23368 $" + +if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end +if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end + +local DEBUG = false + +local SCROLL_UP = "Scroll up" +local SCROLL_DOWN = "Scroll down" +local HINT = "Hint" +local DETACH = "Detach" +local DETACH_DESC = "Detach the tablet from its source." +local SIZE = "Size" +local SIZE_DESC = "Scale the tablet." +local CLOSE_MENU = "Close menu" +local CLOSE_MENU_DESC = "Close the menu." +local COLOR = "Background color" +local COLOR_DESC = "Set the background color." +local LOCK = "Lock" +local LOCK_DESC = "Lock the tablet in its current position. Alt+Right-click for menu or Alt+drag to drag it when locked." + +if GetLocale() == "deDE" then + SCROLL_UP = "Hochscrollen" + SCROLL_DOWN = "Runterscrollen" + HINT = "Hinweis" + DETACH = "L\195\182sen" + DETACH_DESC = "L\195\182st den Tooltip aus seiner Verankerung." + SIZE = "Gr\195\182\195\159e" + SIZE_DESC = "Gr\195\182\195\159e des Tooltips \195\164ndern." + CLOSE_MENU = "Menu schlie\195\159en" + CLOSE_MENU_DESC = "Schlie\195\159t das Menu." + COLOR = "Hintergrundfarbe" + COLOR_DESC = "Hintergrundfarbe setzen." + LOCK = "Sperren" + LOCK_DESC = "Sperrt die aktuelle Position vom Tooltip. Alt+Rechts-klick f\195\188rs Men\195\188 oder Alt+Verschieben f\195\188rs verschieben wenn es gesperrt ist." +elseif GetLocale() == "koKR" then + SCROLL_UP = "위로 스크롤" + SCROLL_DOWN = "아래로 스크롤" + HINT = "힌트" + DETACH = "분리" + DETACH_DESC = "테이블을 분리합니다." + SIZE = "크기" + SIZE_DESC = "테이블의 크기입니다." + CLOSE_MENU = "메뉴 닫기" + CLOSE_MENU_DESC = "메뉴를 닫습니다." + COLOR = "배경 색상" + COLOR_DESC = "배경 색상을 설정합니다." + LOCK = "고정" + LOCK_DESC = "현재 위치에 테이블을 고정합니다. 알트+우클릭 : 메뉴열기, 알트+드래그 : 고정된것을 드래그합니다." +elseif GetLocale() == "zhCN" then + SCROLL_UP = "向上翻转" + SCROLL_DOWN = "向上翻转" + HINT = "提示" + DETACH = "分离" + DETACH_DESC = "分离菜单为独立提示." + SIZE = "尺寸" + SIZE_DESC = "缩放菜单显示尺寸." + CLOSE_MENU = "关闭菜单" + CLOSE_MENU_DESC = "关闭菜单" + COLOR = "背景颜色" + COLOR_DESC = "设置菜单背景颜色." + LOCK = "锁定" + LOCK_DESC = "锁定菜单当前位置. alt+右键 将显示选项, alt+拖动 可以移动已锁定的菜单." +elseif GetLocale() == "zhTW" then + SCROLL_UP = "向上翻轉" + SCROLL_DOWN = "向上翻轉" + HINT = "提示" + DETACH = "分離" + DETACH_DESC = "分離選單為獨立提示。" + SIZE = "尺寸" + SIZE_DESC = "縮放選單顯示尺寸。" + CLOSE_MENU = "關閉選單" + CLOSE_MENU_DESC = "關閉選單" + COLOR = "背景顏色" + COLOR_DESC = "設置選單背景顏色。" + LOCK = "鎖定" + LOCK_DESC = "鎖定選單目前位置. Alt+右鍵 將顯示選項,Alt+拖動 可以移動已鎖定的選單。" +elseif GetLocale() == "frFR" then + SCROLL_UP = "Parcourir vers le haut" + SCROLL_DOWN = "Parcourir vers le bas" + HINT = "Astuce" + DETACH = "D\195\169tacher" + DETACH_DESC = "Permet de d\195\169tacher le tableau de sa source." + SIZE = "Taille" + SIZE_DESC = "Permet de changer l'\195\169chelle du tableau." + CLOSE_MENU = "Fermer le menu" + CLOSE_MENU_DESC = "Ferme ce menu." + COLOR = "Couleur du fond" + COLOR_DESC = "Permet de d\195\169finir la couleur du fond." + LOCK = "Bloquer" + LOCK_DESC = "Bloque le tableau \195\160 sa position actuelle. Alt+clic-droit pour le menu ou Alt+glisser pour le d\195\169placer quand il est bloqu\195\169." +elseif GetLocale() == "esES" then + SCROLL_UP = "Desplazar hacia arriba" + SCROLL_DOWN = "Desplazar hacia abajo" + HINT = "Consejo" + DETACH = "Separar" + DETACH_DESC = "Separa el tooltip de su fuente." + SIZE = "Tama\195\177o" + SIZE_DESC = "Escala el tooltip" + CLOSE_MENU = "Cerrar men\195\186" + CLOSE_MENU_DESC = "Cierra el men\195\186" + COLOR = "Color de fondo" + COLOR_DESC = "Establece el color de fondo" + LOCK = "Bloquear" + LOCK_DESC = "Bloquea el tooltip en su posici\195\179n actual. Clic+Alt para el men\195\186 y arrastra+Alt para arrastrarlo cuando est\195\161 bloqueado" +end + +local start = GetTime() +local wrap +local GetProfileInfo +if DEBUG then + local tree = {} + local treeMemories = {} + local treeTimes = {} + local memories = {} + local times = {} + function wrap(value, name) + if type(value) == "function" then + local oldFunction = value + memories[name] = 0 + times[name] = 0 + return function(self, ...) + local pos = #tree + table.insert(tree, name) + table.insert(treeMemories, 0) + table.insert(treeTimes, 0) + local t, mem = GetTime(), gcinfo() + local r1, r2, r3, r4, r5, r6, r7, r8 = oldFunction(self, ...) + mem, t = gcinfo() - mem, GetTime() - t + if pos > 0 then + treeMemories[pos] = treeMemories[pos] + mem + treeTimes[pos] = treeTimes[pos] + t + end + local otherMem = table.remove(treeMemories) + if mem - otherMem > 0 then + memories[name] = memories[name] + mem - otherMem + end + times[name] = times[name] + t - table.remove(treeTimes) + table.remove(tree) + return r1, r2, r3, r4, r5, r6, r7, r8 + end + end + end + + function GetProfileInfo() + return GetTime() - start, times, memories + end +else + function wrap(value) + return value + end +end + +local MIN_TOOLTIP_SIZE = 200 +local TESTSTRING_EXTRA_WIDTH = 8 +local Tablet = {} +local Dewdrop = nil +local CleanCategoryPool +local pool = {} + +local function del(t) + if t then + for k in pairs(t) do + t[k] = nil + end + setmetatable(t, nil) + pool[t] = true + end +end + +local new + +local function copy(parent) + local t = next(pool) or {} + pool[t] = nil + if parent then + for k,v in pairs(parent) do + t[k] = v + end + setmetatable(t, getmetatable(parent)) + end + return t +end + +function new(...) + local t = next(pool) or {} + pool[t] = nil + + for i = 1, select('#', ...), 2 do + local k = select(i, ...) + if k then + t[k] = select(i+1, ...) + else + break + end + end + return t +end + +local tmp +tmp = setmetatable({}, {__index = function(self, key) + local t = {} + tmp[key] = function(...) + for k in pairs(t) do + t[k] = nil + end + for i = 1, select('#', ...), 2 do + local k = select(i, ...) + if k then + t[k] = select(i+1, ...) + else + break + end + end + return t + end + return tmp[key] +end}) + +local headerSize, normalSize +if GameTooltipHeaderText then + _,headerSize = GameTooltipHeaderText:GetFont() +else + headerSize = 14 +end +if GameTooltipText then + _,normalSize = GameTooltipText:GetFont() +else + normalSize = 12 +end +local tooltip +local testString-- = CreateFrame("Frame", UIParent):CreateFontString(nil, "OVERLAY") +local TabletData = {} +local Category = {} +local Line = {} +local function getTestWidth(font, size, text) + testString:SetWidth(0) + testString:SetFontObject(font) + local a,_,b = testString:GetFont() + testString:SetFont(a, size, b) + testString:SetText(text) + return testString:GetStringWidth()-- + TESTSTRING_EXTRA_WIDTH +end +do + local TabletData_mt = { __index = TabletData } + function TabletData:new(tablet) + local self = new() + self.categories = new() + self.id = 0 + self.width = 0 -- (MIN_TOOLTIP_SIZE - 20)*tablet.fontSizePercent + self.tablet = tablet + self.title = "Title" + self.titleR, self.titleG, self.titleB = nil, nil, nil + self.num_lines = 0 + setmetatable(self, TabletData_mt) + return self + end + + function TabletData:checkMinWidth() + local width = (MIN_TOOLTIP_SIZE - 20)*self.tablet.fontSizePercent + if self.width < width then + self.width = width + end + end + + function TabletData:del() + for k, v in ipairs(self.categories) do + v:del() + end + del(self.categories) + del(self) + end + + function TabletData:Display() + if self.tablet == tooltip or self.tablet.registration.showTitleWhenDetached then + local info = new( + 'hideBlankLine', true, + 'text', self.title, + 'justify', "CENTER", + 'font', GameTooltipHeaderText, + 'isTitle', true + ) + if self.titleR then + info.textR = self.titleR + info.textG = self.titleG + info.textB = self.titleB + end + self:AddCategory(info, 1) + del(info) + end + if self.tablet == tooltip or self.tablet.registration.showHintWhenDetached then + if self.hint then + self:AddCategory(nil):AddLine( + 'text', HINT .. ": " .. self.hint, + 'textR', 0, + 'textG', 1, + 'textB', 0, + 'wrap', true + ) + end + end + + local tabletData = self.tabletData + for k, v in ipairs(self.categories) do + local width + if v.columns <= 2 then + width = v.x1 + else + width = v.x1 + v.x2 + v.x3 + v.x4 + v.x5 + v.x6 + (v.columns - 1) * 20 + end + if self.width < width then + self.width = width + end + end + + local good = false + local lastTitle = true + for k, v in ipairs(self.categories) do + if lastTitle then + v.hideBlankLine = true + lastTitle = false + end + if v:Display(self.tablet) and (not v.isTitle or not self.tablet.registration.hideWhenEmpty or next(self.categories, k)) then + good = true + end + if v.isTitle then + lastTitle = true + end + end + if not good then + if self.tablet == tooltip or not self.tablet.registration.hideWhenEmpty then + local width + local info = new( + 'hideBlankLine', true, + 'text', self.title, + 'justify', "CENTER", + 'font', GameTooltipHeaderText, + 'isTitle', true + ) + local cat = self:AddCategory(info) + del(info) + self.width = self.categories[#self.categories].x1 + cat:Display(self.tablet) + else + self.tablet:__Hide() + self.tablet.tmpHidden = true + end + else + self.tablet:__Show() + self.tablet.tmpHidden = nil + end + end + + function TabletData:AddCategory(info, index) + local made = false + if not info then + made = true + info = new() + end + local cat = Category:new(self, info) + if index then + table.insert(self.categories, index, cat) + else + table.insert(self.categories, cat) + end + if made then + del(info) + end + return cat + end + + function TabletData:SetHint(hint) + self.hint = hint + end + + function TabletData:SetTitle(title) + self.title = title or "Title" + end + + function TabletData:SetTitleColor(r, g, b) + self.titleR = r + self.titleG = g + self.titleB = b + end +end +do + local Category_mt = { __index = Category } + function Category:new(tabletData, info, superCategory) + local self = copy(info) + if superCategory and not self.noInherit then + self.superCategory = superCategory.superCategory + for k, v in pairs(superCategory) do + if string.find(k, "^child_") then + local k = strsub(k, 7) + if self[k] == nil then + self[k] = v + end + end + end + self.columns = superCategory.columns + else + self.superCategory = self + end + self.tabletData = tabletData + self.lines = new() + if not self.columns then + self.columns = 1 + end + self.x1 = 0 + self.x2 = 0 + self.x3 = 0 + self.x4 = 0 + self.x5 = 0 + self.x6 = 0 + setmetatable(self, Category_mt) + self.lastWasTitle = nil + if self.text or self.text2 or self.text3 or self.text4 or self.text5 or self.text6 then + local x = new( + 'category', category, + 'text', self.text, + 'textR', self.textR or 1, + 'textG', self.textG or 1, + 'textB', self.textB or 1, + 'fakeChild', true, + 'func', self.func, + 'hasCheck', self.hasCheck, + 'checked', self.checked, + 'checkIcon', self.checkIcon, + 'isRadio', self.isRadio, + 'font', self.font, + 'size', self.size, + 'wrap', self.wrap, + 'catStart', true, + 'indentation', self.indentation, + 'noInherit', true, + 'justify', self.justify, + 'justify2', self.justify2, + 'justify3', self.justify3, + 'justify4', self.justify4, + 'justify5', self.justify5, + 'justify6', self.justify6 + ) + local i = 1 + while true do + local k = 'arg' .. i + local v = self[k] + if v == nil then + break + end + x[k] = v + i = i + 1 + end + if self.isTitle then + x.textR = self.textR or 1 + x.textG = self.textG or 0.823529 + x.textB = self.textB or 0 + else + x.textR = self.textR or 1 + x.textG = self.textG or 1 + x.textB = self.textB or 1 + end + x.text2 = self.text2 + x.text3 = self.text3 + x.text4 = self.text4 + x.text5 = self.text5 + x.text6 = self.text6 + x.text2R = self.text2R or self.textR2 or 1 + x.text2G = self.text2G or self.textG2 or 1 + x.text2B = self.text2B or self.textB2 or 1 + x.text3R = self.text3R or self.textR3 or 1 + x.text3G = self.text3G or self.textG3 or 1 + x.text3B = self.text3B or self.textB3 or 1 + x.text4R = self.text4R or self.textR4 or 1 + x.text4G = self.text4G or self.textG4 or 1 + x.text4B = self.text4B or self.textB4 or 1 + x.text5R = self.text5R or self.textR5 or 1 + x.text5G = self.text5G or self.textG5 or 1 + x.text5B = self.text5B or self.textB5 or 1 + x.text6R = self.text6R or self.textR6 or 1 + x.text6G = self.text6G or self.textG6 or 1 + x.text6B = self.text6B or self.textB6 or 1 + x.font2 = self.font2 + x.font3 = self.font3 + x.font4 = self.font4 + x.font5 = self.font5 + x.font6 = self.font6 + x.size2 = self.size2 + x.size3 = self.size3 + x.size4 = self.size4 + x.size5 = self.size5 + x.size6 = self.size6 + self:AddLine(x) + del(x) + self.lastWasTitle = true + end + return self + end + + function Category:del() + local prev = garbageLine + for k, v in pairs(self.lines) do + v:del() + end + del(self.lines) + del(self) + end + + function Category:AddLine(...) + self.lastWasTitle = nil + local line + local k1 = ... + if type(k1) == "table" then + local k2 = select(2, ...) + Line:new(self, k1, k2) + else + local info = new(...) + Line:new(self, info) + info = del(info) + end + end + + function Category:AddCategory(...) + local lastWasTitle = self.lastWasTitle + self.lastWasTitle = nil + local info + local k1 = ... + if type(k1) == "table" then + info = k1 + else + info = new(...) + end + if lastWasTitle or #self.lines == 0 then + info.hideBlankLine = true + end + local cat = Category:new(self.tabletData, info, self) + table.insert(self.lines, cat) + if info ~= k1 then + info = del(info) + end + return cat + end + + function Category:HasChildren() + local hasChildren = false + for k, v in ipairs(self.lines) do + if v.HasChildren then + if v:HasChildren() then + return true + end + end + if not v.fakeChild then + return true + end + end + return false + end + + local lastWasTitle = false + function Category:Display(tablet) + if not self.isTitle and not self.showWithoutChildren and not self:HasChildren() then + return false + end + if not self.hideBlankLine and not lastWasTitle then + local info = new( + 'blank', true, + 'fakeChild', true + ) + self:AddLine(info, 1) + del(info) + end + local good = false + if #self.lines > 0 then + self.tabletData.id = self.tabletData.id + 1 + self.id = self.tabletData.id + for k, v in ipairs(self.lines) do + if v:Display(tablet) then + good = true + end + end + end + lastWasTitle = self.isTitle + return good + end +end +do + local Line_mt = { __index = Line } + function Line:new(category, info, position) + local self = copy(info) + if not info.noInherit then + for k, v in pairs(category) do + if string.find(k, "^child_") then + local k = strsub(k, 7) + if self[k] == nil then + self[k] = v + end + end + end + end + self.category = category + if position then + table.insert(category.lines, position, self) + else + table.insert(category.lines, self) + end + setmetatable(self, Line_mt) + local n = category.tabletData.num_lines + 1 + category.tabletData.num_lines = n + if n == 15 then + category.tabletData:checkMinWidth() + end + local columns = category.columns + if columns == 1 then + if not self.justify then + self.justify = "LEFT" + end + elseif columns == 2 then + self.justify = "LEFT" + self.justify2 = "RIGHT" + if self.wrap then + self.wrap2 = false + end + elseif columns == 3 then + if not self.justify then + self.justify = "LEFT" + end + if not self.justify2 then + self.justify2 = "CENTER" + end + if not self.justify3 then + self.justify3 = "RIGHT" + end + if self.wrap then + self.wrap2 = false + self.wrap3 = false + elseif self.wrap2 then + self.wrap3 = false + end + elseif columns == 4 then + if not self.justify then + self.justify = "LEFT" + end + if not self.justify2 then + self.justify2 = "CENTER" + end + if not self.justify3 then + self.justify3 = "CENTER" + end + if not self.justify4 then + self.justify4 = "RIGHT" + end + if self.wrap then + self.wrap2 = false + self.wrap3 = false + self.wrap4 = false + elseif self.wrap2 then + self.wrap3 = false + self.wrap4 = false + elseif self.wrap3 then + self.wrap4 = false + end + elseif columns == 5 then + if not self.justify then + self.justify = "LEFT" + end + if not self.justify2 then + self.justify2 = "CENTER" + end + if not self.justify3 then + self.justify3 = "CENTER" + end + if not self.justify4 then + self.justify4 = "CENTER" + end + if not self.justify5 then + self.justify5 = "RIGHT" + end + if self.wrap then + self.wrap2 = false + self.wrap3 = false + self.wrap4 = false + self.wrap5 = false + elseif self.wrap2 then + self.wrap3 = false + self.wrap4 = false + self.wrap5 = false + elseif self.wrap3 then + self.wrap4 = false + self.wrap5 = false + elseif self.wrap4 then + self.wrap5 = false + end + elseif columns == 6 then + if not self.justify then + self.justify = "LEFT" + end + if not self.justify2 then + self.justify2 = "CENTER" + end + if not self.justify3 then + self.justify3 = "CENTER" + end + if not self.justify4 then + self.justify4 = "CENTER" + end + if not self.justify5 then + self.justify5 = "CENTER" + end + if not self.justify6 then + self.justify6 = "RIGHT" + end + if self.wrap then + self.wrap2 = false + self.wrap3 = false + self.wrap4 = false + self.wrap5 = false + self.wrap6 = false + elseif self.wrap2 then + self.wrap3 = false + self.wrap4 = false + self.wrap5 = false + self.wrap6 = false + elseif self.wrap3 then + self.wrap4 = false + self.wrap5 = false + self.wrap6 = false + elseif self.wrap4 then + self.wrap5 = false + self.wrap6 = false + elseif self.wrap5 then + self.wrap6 = false + end + end + if self.textR2 then + self.text2R, self.textR2 = self.text2R or self.textR2 + self.text2G, self.textG2 = self.text2G or self.textG2 + self.text2B, self.textB2 = self.text2B or self.textB2 + if self.textR3 then + self.text3R, self.textR3 = self.text3R or self.textR3 + self.text3G, self.textG3 = self.text3G or self.textG3 + self.text3B, self.textB3 = self.text3B or self.textB3 + if self.textR4 then + self.text4R, self.textR4 = self.text4R or self.textR4 + self.text4G, self.textG4 = self.text4G or self.textG4 + self.text4B, self.textB4 = self.text4B or self.textB4 + if self.textR5 then + self.text5R, self.textR5 = self.text5R or self.textR5 + self.text5G, self.textG5 = self.text5G or self.textG5 + self.text5B, self.textB5 = self.text5B or self.textB5 + if self.textR5 then + self.text6R, self.textR6 = self.text6R or self.textR6 + self.text6G, self.textG6 = self.text6G or self.textG6 + self.text6B, self.textB6 = self.text6B or self.textB6 + end + end + end + end + end + if not self.indentation or self.indentation < 0 then + self.indentation = 0 + end + if not self.font then + self.font = GameTooltipText + end + if not self.font2 then + self.font2 = self.font + end + if not self.font3 then + self.font3 = self.font + end + if not self.font4 then + self.font4 = self.font + end + if not self.font5 then + self.font5 = self.font + end + if not self.font6 then + self.font6 = self.font + end + if not self.size then + _,self.size = self.font:GetFont() + end + if not self.size2 then + _,self.size2 = self.font2:GetFont() + end + if not self.size3 then + _,self.size3 = self.font3:GetFont() + end + if not self.size4 then + _,self.size4 = self.font4:GetFont() + end + if not self.size5 then + _,self.size5 = self.font5:GetFont() + end + if not self.size6 then + _,self.size6 = self.font6:GetFont() + end + + local fontSizePercent = category.tabletData.tablet.fontSizePercent + local w = 0 + self.checkWidth = 0 + testString = category.tabletData.tablet.lefts[1] + if self.text then + if not self.wrap then + local testWidth = getTestWidth(self.font, self.size * fontSizePercent, self.text) + local checkWidth = self.hasCheck and self.size * fontSizePercent or 0 + self.checkWidth = checkWidth + w = testWidth + self.indentation * fontSizePercent + checkWidth + if category.superCategory.x1 < w then + category.superCategory.x1 = w + end + else + if columns == 1 then + local testWidth = getTestWidth(self.font, self.size * fontSizePercent, self.text) + local checkWidth = self.hasCheck and self.size * fontSizePercent or 0 + self.checkWidth = checkWidth + w = testWidth + self.indentation * fontSizePercent + checkWidth + if w > (MIN_TOOLTIP_SIZE - 20) * fontSizePercent then + w = (MIN_TOOLTIP_SIZE - 20) * fontSizePercent + end + else + w = MIN_TOOLTIP_SIZE * fontSizePercent / 2 + end + if category.superCategory.x1 < w then + category.superCategory.x1 = w + end + end + end + if columns == 2 and self.text2 then + if not self.wrap2 then + local testWidth = getTestWidth(self.font2, self.size2 * fontSizePercent, self.text2) + w = w + 40 * fontSizePercent + testWidth + if category.superCategory.x1 < w then + category.superCategory.x1 = w + end + else + w = w + 40 * fontSizePercent + MIN_TOOLTIP_SIZE * fontSizePercent / 2 + if category.superCategory.x1 < w then + category.superCategory.x1 = w + end + end + elseif columns >= 3 then + if self.text2 then + if not self.wrap2 then + local testWidth = getTestWidth(self.font2, self.size2 * fontSizePercent, self.text2) + local w = testWidth + if category.superCategory.x2 < w then + category.superCategory.x2 = w + end + else + local w = MIN_TOOLTIP_SIZE / 2 + if category.superCategory.x2 < w then + category.superCategory.x2 = w + end + end + end + if self.text3 then + if not self.wrap3 then + local testWidth = getTestWidth(self.font3, self.size3 * fontSizePercent, self.text3) + local w = testWidth + if category.superCategory.x3 < w then + category.superCategory.x3 = w + end + else + local w = MIN_TOOLTIP_SIZE / 2 + if category.superCategory.x3 < w then + category.superCategory.x3 = w + end + end + end + if columns >= 4 then + if self.text4 then + if not self.wrap4 then + local testWidth = getTestWidth(self.font4, self.size4 * fontSizePercent, self.text4) + w = testWidth + if category.superCategory.x4 < w then + category.superCategory.x4 = w + end + else + local w = MIN_TOOLTIP_SIZE / 2 + if category.superCategory.x4 < w then + category.superCategory.x4 = w + end + end + end + if columns >= 5 then + if self.text5 then + if not self.wrap5 then + local testWidth = getTestWidth(self.font5, self.size5 * fontSizePercent, self.text5) + w = testWidth + if category.superCategory.x5 < w then + category.superCategory.x5 = w + end + else + local w = MIN_TOOLTIP_SIZE / 2 + if category.superCategory.x5 < w then + category.superCategory.x5 = w + end + end + end + if columns >= 6 then + if self.text6 then + if not self.wrap6 then + local testWidth = getTestWidth(self.font6, self.size6 * fontSizePercent, self.text6) + w = testWidth + if category.superCategory.x6 < w then + category.superCategory.x6 = w + end + else + local w = MIN_TOOLTIP_SIZE / 2 + if category.superCategory.x6 < w then + category.superCategory.x6 = w + end + end + end + end + end + end + end + return self + end + + function Line:del() + del(self) + end + + function Line:Display(tablet) + tablet:AddLine(self) + return true + end +end + +local function button_OnEnter() + if type(this.self:GetScript("OnEnter")) == "function" then + this.self:GetScript("OnEnter")() + end + this.highlight:Show() +end + +local function button_OnLeave() + if type(this.self:GetScript("OnLeave")) == "function" then + this.self:GetScript("OnLeave")() + end + this.highlight:Hide() +end + +local num_buttons = 0 +local function NewLine(self) + if self.maxLines <= self.numLines then + self.maxLines = self.maxLines + 1 + num_buttons = num_buttons + 1 + local button = CreateFrame("Button", "Tablet20Button" .. num_buttons, self) + button:SetFrameLevel(self:GetFrameLevel()+2) + button.indentation = 0 + local check = button:CreateTexture(nil, "ARTWORK") + local left = button:CreateFontString(nil, "ARTWORK") + testString = left + local right = button:CreateFontString(nil, "ARTWORK") + local third = button:CreateFontString(nil, "ARTWORK") + local fourth = button:CreateFontString(nil, "ARTWORK") + local fifth = button:CreateFontString(nil, "ARTWORK") + local sixth = button:CreateFontString(nil, "ARTWORK") + local highlight = button:CreateTexture(nil, "BACKGROUND") + highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") + button.highlight = highlight + highlight:SetBlendMode("ADD") + highlight:SetAllPoints(button) + highlight:Hide() + table.insert(self.buttons, button) + table.insert(self.checks, check) + table.insert(self.lefts, left) + table.insert(self.rights, right) + table.insert(self.thirds, third) + table.insert(self.fourths, fourth) + table.insert(self.fifths, fifth) + table.insert(self.sixths, sixth) + left:SetWidth(0) + if self.maxLines == 1 then + left:SetFontObject(GameTooltipHeaderText) + right:SetFontObject(GameTooltipHeaderText) + third:SetFontObject(GameTooltipHeaderText) + fourth:SetFontObject(GameTooltipHeaderText) + fifth:SetFontObject(GameTooltipHeaderText) + sixth:SetFontObject(GameTooltipHeaderText) + left:SetJustifyH("CENTER") + button:SetPoint("TOPLEFT", self, "TOPLEFT", 8, -10) + else + left:SetFontObject(GameTooltipText) + right:SetFontObject(GameTooltipText) + third:SetFontObject(GameTooltipText) + fourth:SetFontObject(GameTooltipText) + fifth:SetFontObject(GameTooltipText) + sixth:SetFontObject(GameTooltipText) + button:SetPoint("TOPLEFT", self.buttons[self.maxLines - 1], "BOTTOMLEFT", 0, -2) + end + button:SetScript("OnEnter", button_OnEnter) + button:SetScript("OnLeave", button_OnLeave) + button.check = check + button.self = self + button:SetPoint("RIGHT", self, "RIGHT", -12, 0) + check.shown = false + check:SetPoint("TOPLEFT", button, "TOPLEFT") + left:SetPoint("TOPLEFT", check, "TOPLEFT") + right:SetPoint("TOPLEFT", left, "TOPRIGHT", 40 * self.fontSizePercent, 0) + third:SetPoint("TOPLEFT", right, "TOPRIGHT", 20 * self.fontSizePercent, 0) + fourth:SetPoint("TOPLEFT", third, "TOPRIGHT", 20 * self.fontSizePercent, 0) + fifth:SetPoint("TOPLEFT", fourth, "TOPRIGHT", 20 * self.fontSizePercent, 0) + sixth:SetPoint("TOPLEFT", fifth, "TOPRIGHT", 20 * self.fontSizePercent, 0) + right:SetJustifyH("RIGHT") + local _,size = GameTooltipText:GetFont() + check:SetHeight(size * 1.5) + check:SetWidth(size * 1.5) + check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") + check:SetAlpha(0) + if not button.clicked then + button:SetScript("OnMouseWheel", self:GetScript("OnMouseWheel")) + button:EnableMouseWheel(true) + button:Hide() + end + check:Show() + left:Hide() + right:Hide() + third:Hide() + fourth:Hide() + fifth:Hide() + sixth:Hide() + end +end +NewLine = wrap(NewLine, "NewLine") + +local function GetMaxLinesPerScreen(self) + if self.height_ then + local height = self:GetTop() and self:GetBottom() and self:GetTop() - self:GetBottom() or self:GetHeight() + if height == 0 then + height = self.height_ + end + height = height - 20 + return floor(height / (12*self.fontSizePercent+2)) + end + if self == tooltip then + return floor(50 / self.fontSizePercent) + else + return floor(30 / self.fontSizePercent) + end +end +GetMaxLinesPerScreen = wrap(GetMaxLinesPerScreen, "GetMaxLinesPerScreen") + +local overFrame = nil +local detachedTooltips = {} +local AcquireDetachedFrame, ReleaseDetachedFrame +local function AcquireFrame(self, registration, data, detachedData) + if not detachedData then + detachedData = data + end + if tooltip then + tooltip.data = data + tooltip.detachedData = detachedData + local fontSizePercent = tooltip.data and tooltip.data.fontSizePercent or 1 + local transparency = tooltip.data and tooltip.data.transparency or 0.75 + local r = tooltip.data and tooltip.data.r or 0 + local g = tooltip.data and tooltip.data.g or 0 + local b = tooltip.data and tooltip.data.b or 0 + tooltip:SetFontSizePercent(fontSizePercent) + tooltip:SetTransparency(transparency) + tooltip:SetColor(r, g, b) + tooltip:SetFrameStrata(registration.strata or "TOOLTIP") + else + tooltip = CreateFrame("Frame", "Tablet20Frame", UIParent) + self.tooltip = tooltip + tooltip.data = data + tooltip.detachedData = detachedData + tooltip:EnableMouse(true) + tooltip:EnableMouseWheel(true) + tooltip:SetFrameStrata(registration.strata or "TOOLTIP") + tooltip:SetFrameLevel(10) + local backdrop = new( + 'bgFile', "Interface\\Buttons\\WHITE8X8", + 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border", + 'tile', true, + 'tileSize', 16, + 'edgeSize', 16, + 'insets', new( + 'left', 5, + 'right', 5, + 'top', 5, + 'bottom', 5 + ) + ) + tooltip:SetBackdrop(backdrop) + del(backdrop.insets) + del(backdrop) + tooltip:SetBackdropColor(0, 0, 0, 1) + + tooltip.numLines = 0 + tooltip.owner = nil + tooltip.fontSizePercent = tooltip.data and tooltip.data.fontSizePercent or 1 + tooltip.maxLines = 0 + tooltip.buttons = {} + tooltip.checks = {} + tooltip.lefts = {} + tooltip.rights = {} + tooltip.thirds = {} + tooltip.fourths = {} + tooltip.fifths = {} + tooltip.sixths = {} + tooltip.transparency = tooltip.data and tooltip.data.transparency or 0.75 + tooltip:SetBackdropColor(0, 0, 0, tooltip.transparency) + tooltip:SetBackdropBorderColor(1, 1, 1, tooltip.transparency) + tooltip.scroll = 0 + + tooltip:SetScript("OnUpdate", function() + if not tooltip.updating and (not tooltip.enteredFrame or (overFrame and not MouseIsOver(overFrame))) then + tooltip.scroll = 0 + tooltip:Hide() + tooltip.registration.tooltip = nil + tooltip.registration = nil + overFrame = nil + end + end) + + tooltip:SetScript("OnEnter", function() + if tooltip.clickable then + tooltip.enteredFrame = true + overFrame = nil + end + end) + + tooltip:SetScript("OnLeave", function() + if not tooltip.updating then + tooltip.enteredFrame = false + end + end) + + tooltip:SetScript("OnMouseWheel", function() + tooltip.updating = true + tooltip:Scroll(arg1 < 0) + tooltip.updating = false + end) + + NewLine(tooltip) + + tooltip.scrollUp = tooltip:CreateFontString(nil, "ARTWORK") + tooltip.scrollUp:SetPoint("TOPLEFT", tooltip.buttons[1], "BOTTOMLEFT", 0, -2) + tooltip.scrollUp:SetPoint("RIGHT", tooltip, "RIGHT", 0, -10) + tooltip.scrollUp:SetFontObject(GameTooltipText) + tooltip.scrollUp:Hide() + local font,_,flags = tooltip.scrollUp:GetFont() + tooltip.scrollUp:SetFont(font, normalSize * tooltip.fontSizePercent, flags) + tooltip.scrollUp:SetJustifyH("CENTER") + tooltip.scrollUp:SetTextColor(1, 0.823529, 0) + tooltip.scrollUp:SetText(" ") + + tooltip.scrollDown = tooltip:CreateFontString(nil, "ARTWORK") + tooltip.scrollDown:SetPoint("TOPLEFT", tooltip.buttons[1], "BOTTOMLEFT", 0, -2) + tooltip.scrollDown:SetPoint("RIGHT", tooltip, "RIGHT", 0, -10) + tooltip.scrollDown:SetFontObject(GameTooltipText) + tooltip.scrollDown:Hide() + local font,_,flags = tooltip.scrollUp:GetFont() + tooltip.scrollDown:SetFont(font, normalSize * tooltip.fontSizePercent, flags) + tooltip.scrollDown:SetJustifyH("CENTER") + tooltip.scrollDown:SetTextColor(1, 0.823529, 0) + tooltip.scrollDown:SetText(" ") + + function tooltip:SetOwner(o) + self:Hide(o) + self.owner = o + end + tooltip.SetOwner = wrap(tooltip.SetOwner, "tooltip:SetOwner") + + function tooltip:IsOwned(o) + return self.owner == o + end + tooltip.IsOwned = wrap(tooltip.IsOwned, "tooltip:IsOwned") + + function tooltip:ClearLines(hide) + CleanCategoryPool(self) + for i = 1, self.numLines do + local button = self.buttons[i] + local check = self.checks[i] + if not button.clicked or hide then + button:Hide() + end + check.shown = false + check:SetAlpha(0) + end + self.numLines = 0 + end + tooltip.ClearLines = wrap(tooltip.ClearLines, "tooltip:ClearLines") + + function tooltip:NumLines() + return self.numLines + end + + local lastWidth + local old_tooltip_Hide = tooltip.Hide + tooltip.__Hide = old_tooltip_Hide + function tooltip:Hide(newOwner) + if self == tooltip or newOwner == nil then + old_tooltip_Hide(self) + end + self:ClearLines(true) + self.owner = nil + self.lastWidth = nil + self.tmpHidden = nil + end + tooltip.Hide = wrap(tooltip.Hide, "tooltip:Hide") + + local old_tooltip_Show = tooltip.Show + tooltip.__Show = old_tooltip_Show + function tooltip:Show(tabletData) + if self.owner == nil or self.notInUse then + return + end + if not self.tmpHidden then + old_tooltip_Show(self) + end + + testString = self.lefts[1] + + local maxWidth = tabletData and tabletData.width or self:GetWidth() - 20 + local hasWrap = false + local screenWidth = GetScreenWidth() + local scrollMax = self.numLines + local maxLinesPerScreen = GetMaxLinesPerScreen(self) + if scrollMax > maxLinesPerScreen + self.scroll then + scrollMax = maxLinesPerScreen + self.scroll + end + local numColumns + + local height = 20 + if scrollMax ~= self.numLines then + self.scrollDown:SetWidth(maxWidth) + height = height + self.scrollDown:GetHeight() + 2 + end + if self.scroll ~= 0 then + self.scrollUp:SetWidth(maxWidth) + height = height + self.scrollUp:GetHeight() + 2 + end + self:SetWidth(maxWidth + 20) + + local tmp = self.scroll + 1 + if tmp ~= 1 then + tmp = tmp + 1 + end + for i = 1, self.numLines do + if i < tmp or i > scrollMax or (i == scrollMax and i ~= self.numLines) then + self.buttons[i]:ClearAllPoints() + self.buttons[i]:Hide() + else + local button = self.buttons[i] + local left = self.lefts[i] + local right = self.rights[i] + local check = self.checks[i] + button:SetWidth(maxWidth) + button:SetHeight(math.max(left:GetHeight(), right:GetHeight())) + height = height + button:GetHeight() + 2 + if i == self.scroll + 1 then + button:SetPoint("TOPLEFT", self, "TOPLEFT", 10, -10) + else + button:SetPoint("TOPLEFT", self.buttons[i - 1], "BOTTOMLEFT", 0, -2) + end + if button.clicked then + check:SetPoint("TOPLEFT", button, "TOPLEFT", button.indentation * self.fontSizePercent + (check.width - check:GetWidth()) / 2 + 1, -1) + else + check:SetPoint("TOPLEFT", button, "TOPLEFT", button.indentation * self.fontSizePercent + (check.width - check:GetWidth()) / 2, 0) + end + button:Show() + end + end + if self.scroll ~= 0 then + self.scrollUp:SetPoint("TOPLEFT", self, "TOPLEFT", 10, -10) + self.buttons[self.scroll + 2]:SetPoint("TOPLEFT", self.scrollUp, "BOTTOMLEFT", 0, -2) + self.scrollUp:SetText(SCROLL_UP .. " (" .. self.scroll + 2 .. " / " .. self.numLines .. ")") + self.scrollUp:Show() + else + self.scrollUp:Hide() + end + if scrollMax ~= self.numLines and self.buttons[scrollMax - 1] then + self.scrollDown:SetPoint("TOPLEFT", self.buttons[scrollMax - 1], "BOTTOMLEFT", 0, -2) + self.scrollDown:SetText(SCROLL_DOWN .. " (" .. scrollMax - 1 .. " / " .. self.numLines .. ")") + self.scrollDown:Show() + else + self.scrollDown:Hide() + end + self:SetHeight(height) + end + tooltip.Show = wrap(tooltip.Show, "tooltip:Show") + + local lastMouseDown + local function button_OnClick() + if this.self:HasScript("OnClick") and type(this.self:GetScript("OnClick")) == "function" then + this.self:GetScript("OnClick")() + end + if arg1 == "RightButton" then + if this.self:HasScript("OnClick") and type(this.self:GetScript("OnClick")) == "function" then + this.self:GetScript("OnClick")() + end + elseif arg1 == "LeftButton" then + if this.self.preventClick == nil or GetTime() > this.self.preventClick and GetTime() < lastMouseDown + 0.5 then + this.self.preventClick = nil + this.self.updating = true + this.self.preventRefresh = true + this.func(unpack(this)) + if this.self and this.self.registration then + this.self.preventRefresh = false + this.self:children() + this.self.updating = false + end + end + end + end + local function button_OnMouseUp() + if this.self:HasScript("OnMouseUp") and type(this.self:GetScript("OnMouseUp")) == "function" then + this.self:GetScript("OnMouseUp")() + end + if arg1 ~= "RightButton" then + if this.clicked then + local a,b,c,d,e = this.check:GetPoint(1) + this.check:SetPoint(a,b,c,d-1,e+1) + this.clicked = false + end + end + end + local function button_OnMouseDown() + if this.self:HasScript("OnMouseDown") and type(this.self:GetScript("OnMouseDown")) == "function" then + this.self:GetScript("OnMouseDown")() + end + lastMouseDown = GetTime() + if arg1 ~= "RightButton" then + local a,b,c,d,e = this.check:GetPoint(1) + this.check:SetPoint(a,b,c,d+1,e-1) + this.clicked = true + end + end + function tooltip:AddLine(info) + local category = info.category.superCategory + local maxWidth = category.tabletData.width + local text = info.blank and "\n" or info.text + local id = info.id + local func = info.func + local checked = info.checked + local isRadio = info.isRadio + local checkTexture = info.checkTexture + local fontSizePercent = self.fontSizePercent + if not info.font then + info.font = GameTooltipText + end + if not info.size then + _,info.size = info.font:GetFont() + end + local catStart = false + local columns = category and category.columns or 1 + local x1, x2, x3, x4, x5, x6 + if category then + x1, x2, x3, x4, x5, x6 = category.x1, category.x2, category.x3, category.x4, category.x5, category.x6 + else + x1, x2, x3, x4, x5, x6 = 0, 0, 0, 0, 0, 0 + end + if info.isTitle then + justAddedTitle = true + end + + self.numLines = self.numLines + 1 + NewLine(self) + self.lefts[self.numLines]:Show() + self.buttons[self.numLines]:Show() + num = self.numLines + + local button = self.buttons[num] + button.indentation = info.indentation + local left = self.lefts[num] +-- testString = left + + local right = self.rights[num] + local third = self.thirds[num] + local fourth = self.fourths[num] + local fifth = self.fifths[num] + local sixth = self.sixths[num] + local check = self.checks[num] + do -- if columns >= 1 then + left:SetWidth(0) + left:SetFontObject(info.font) + local font,_,flags = left:GetFont() + left:SetFont(font, info.size * fontSizePercent, flags) + left:SetText(text) + left:SetJustifyH(info.justify) + left:Show() + + if info.textR and info.textG and info.textB then + left:SetTextColor(info.textR, info.textG, info.textB) + else + left:SetTextColor(1, 0.823529, 0) + end + if columns < 2 then + right:SetText(nil) + right:Hide() + right:SetPoint("TOPLEFT", left, "TOPRIGHT", 40 * fontSizePercent, 0) + right:SetPoint("TOPRIGHT", button, "TOPRIGHT", -5, 0) + third:SetText(nil) + third:Hide() + fourth:SetText(nil) + fourth:Hide() + fifth:SetText(nil) + fifth:Hide() + sixth:SetText(nil) + sixth:Hide() + else + right:SetFontObject(info.font2) + right:SetText(info.text2) + right:Show() + if info.text2R and info.text2G and info.text2B then + right:SetTextColor(info.text2R, info.text2G, info.text2B) + else + right:SetTextColor(1, 0.823529, 0) + end + local a,_,b = right:GetFont() + right:SetFont(a, info.size2 * fontSizePercent, b) + right:SetJustifyH(info.justify2) + if columns < 3 then + right:SetPoint("TOPLEFT", left, "TOPRIGHT", 40 * fontSizePercent, 0) + right:SetPoint("TOPRIGHT", button, "TOPRIGHT", -5, 0) + third:SetText(nil) + third:Hide() + fourth:SetText(nil) + fourth:Hide() + fifth:SetText(nil) + fifth:Hide() + sixth:SetText(nil) + sixth:Hide() + else + third:SetFontObject(info.font3) + third:SetText(info.text3) + third:Show() + if info.text3R and info.text3G and info.text3B then + third:SetTextColor(info.text3R, info.text3G, info.text3B) + else + third:SetTextColor(1, 0.823529, 0) + end + local a,_,b = third:GetFont() + third:SetFont(a, info.size3 * fontSizePercent, b) + right:ClearAllPoints() + right:SetPoint("TOPLEFT", left, "TOPRIGHT", (20 - info.indentation) * fontSizePercent, 0) + third:SetJustifyH(info.justify3) + if columns < 4 then + fourth:SetText(nil) + fourth:Hide() + fifth:SetText(nil) + fifth:Hide() + sixth:SetText(nil) + sixth:Hide() + else + fourth:SetFontObject(info.font4) + fourth:SetText(info.text4) + fourth:Show() + if info.text4R and info.text4G and info.text4B then + fourth:SetTextColor(info.text4R, info.text4G, info.text4B) + else + fourth:SetTextColor(1, 0.823529, 0) + end + local a,_,b = fourth:GetFont() + fourth:SetFont(a, info.size4 * fontSizePercent, b) + fourth:SetJustifyH(info.justify4) + if columns < 5 then + fifth:SetText(nil) + fifth:Hide() + sixth:SetText(nil) + sixth:Hide() + else + fifth:SetFontObject(info.font5) + fifth:SetText(info.text5) + fifth:Show() + if info.text5R and info.text5G and info.text5B then + fifth:SetTextColor(info.text5R, info.text5G, info.text5B) + else + fifth:SetTextColor(1, 0.823529, 0) + end + local a,_,b = fourth:GetFont() + fifth:SetFont(a, info.size5 * fontSizePercent, b) + fifth:SetJustifyH(info.justify5) + if columns < 6 then + sixth:SetText(nil) + sixth:Hide() + else + sixth:SetFontObject(info.font6) + sixth:SetText(info.text6) + sixth:Show() + if info.text5R and info.text6G and info.text6B then + sixth:SetTextColor(info.text6R, info.text6G, info.text6B) + else + sixth:SetTextColor(1, 0.823529, 0) + end + local a,_,b = fourth:GetFont() + sixth:SetFont(a, info.size6 * fontSizePercent, b) + sixth:SetJustifyH(info.justify6) + end + end + end + end + end + end + + check:SetWidth(info.size * fontSizePercent) + check:SetHeight(info.size * fontSizePercent) + check.width = info.size * fontSizePercent + if info.hasCheck then + check.shown = true + check:Show() + if isRadio then + check:SetTexture(info.checkIcon or "Interface\\Buttons\\UI-RadioButton") + if info.checked then + check:SetAlpha(1) + check:SetTexCoord(0.25, 0.5, 0, 1) + else + check:SetAlpha(self.transparency) + check:SetTexCoord(0, 0.25, 0, 1) + end + else + if info.checkIcon then + check:SetTexture(info.checkIcon) + if string.sub(info.checkIcon, 1, 16) == "Interface\\Icons\\" then + check:SetTexCoord(0.05, 0.95, 0.05, 0.95) + else + check:SetTexCoord(0, 1, 0, 1) + end + else + check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") + check:SetWidth(info.size * fontSizePercent * 1.5) + check:SetHeight(info.size * fontSizePercent * 1.5) + check.width = info.size * fontSizePercent * 1.2 + check:SetTexCoord(0, 1, 0, 1) + end + check:SetAlpha(info.checked and 1 or 0) + end + left:SetPoint("TOPLEFT", check, "TOPLEFT", check.width, 0) + else + left:SetPoint("TOPLEFT", check, "TOPLEFT") + end + if columns == 1 then + left:SetWidth(maxWidth) + elseif columns == 2 then + left:SetWidth(0) + right:SetWidth(0) + if info.wrap then + left:SetWidth(maxWidth - right:GetWidth() - 40 * fontSizePercent) + elseif info.wrap2 then + right:SetWidth(maxWidth - left:GetWidth() - 40 * fontSizePercent) + end + right:ClearAllPoints() + right:SetPoint("TOPRIGHT", button, "TOPRIGHT", 0, 0) + if not info.text2 then + left:SetJustifyH(info.justify or "LEFT") + end + elseif columns == 3 then + left:SetWidth(x1 - info.checkWidth) + right:SetWidth(x2) + third:SetWidth(x3) + right:ClearAllPoints() + local num = (category.tabletData.width - x1 - x2 - x3) / 2 + right:SetPoint("TOPLEFT", left, "TOPRIGHT", num - info.indentation * fontSizePercent, 0) + third:SetPoint("TOPLEFT", right, "TOPRIGHT", num, 0) + elseif columns == 4 then + left:SetWidth(x1 - info.checkWidth) + right:SetWidth(x2) + third:SetWidth(x3) + fourth:SetWidth(x4) + local num = (category.tabletData.width - x1 - x2 - x3 - x4) / 3 + right:SetPoint("TOPLEFT", left, "TOPRIGHT", num - info.indentation * fontSizePercent, 0) + third:SetPoint("TOPLEFT", right, "TOPRIGHT", num, 0) + fourth:SetPoint("TOPLEFT", third, "TOPRIGHT", num, 0) + elseif columns == 5 then + left:SetWidth(x1 - info.checkWidth) + right:SetWidth(x2) + third:SetWidth(x3) + fourth:SetWidth(x4) + fifth:SetWidth(x5) + local num = (category.tabletData.width - x1 - x2 - x3 - x4 - x5) / 4 + right:SetPoint("TOPLEFT", left, "TOPRIGHT", num - info.indentation * fontSizePercent, 0) + third:SetPoint("TOPLEFT", right, "TOPRIGHT", num, 0) + fourth:SetPoint("TOPLEFT", third, "TOPRIGHT", num, 0) + fifth:SetPoint("TOPLEFT", fourth, "TOPRIGHT", num, 0) + elseif columns == 6 then + left:SetWidth(x1 - info.checkWidth) + right:SetWidth(x2) + third:SetWidth(x3) + fourth:SetWidth(x4) + fifth:SetWidth(x5) + sixth:SetWidth(x6) + local num = (category.tabletData.width - x1 - x2 - x3 - x4 - x5 - x6) / 5 + right:SetPoint("TOPLEFT", left, "TOPRIGHT", num - info.indentation * fontSizePercent, 0) + third:SetPoint("TOPLEFT", right, "TOPRIGHT", num, 0) + fourth:SetPoint("TOPLEFT", third, "TOPRIGHT", num, 0) + fifth:SetPoint("TOPLEFT", fourth, "TOPRIGHT", num, 0) + sixth:SetPoint("TOPLEFT", fifth, "TOPRIGHT", num, 0) + end + if not self.locked or IsAltKeyDown() then + local func = info.func + if func then + if type(func) == "string" then + if type(info.arg1) ~= "table" then + Tablet:error("Cannot call method " .. info.func .. " on a non-table") + end + func = info.arg1[func] + if type(func) ~= "function" then + Tablet:error("Method " .. info.func .. " nonexistant") + end + else + if type(func) ~= "function" then + Tablet:error("func must be a function or method") + end + end + button.func = func + local i = 1 + while true do + if button[i] ~= nil then + button[i] = nil + else + break + end + i = i + 1 + end + i = 1 + while true do + local k = 'arg' .. i + local v = info[k] + if v == nil then + break + end + button[i] = v + i = i + 1 + end + button.self = self + button:SetScript("OnMouseUp", button_OnMouseUp) + button:SetScript("OnMouseDown", button_OnMouseDown) + button:SetScript("OnClick", button_OnClick) + if button.clicked then + button:SetButtonState("PUSHED") + end + button:EnableMouse(true) + else + button:SetScript("OnMouseDown", nil) + button:SetScript("OnMouseUp", nil) + button:SetScript("OnClick", nil) + button:EnableMouse(false) + end + else + button:SetScript("OnMouseDown", nil) + button:SetScript("OnMouseUp", nil) + button:SetScript("OnClick", nil) + button:EnableMouse(false) + end + end + tooltip.AddLine = wrap(tooltip.AddLine, "tooltip:AddLine") + + function tooltip:SetFontSizePercent(percent) + local data, detachedData = self.data, self.detachedData + if detachedData and detachedData.detached then + data = detachedData + end + local lastSize = self.fontSizePercent + percent = tonumber(percent) or 1 + if percent < 0.25 then + percent = 0.25 + elseif percent > 4 then + percent = 4 + end + self.fontSizePercent = percent + if data then + data.fontSizePercent = percent + end + self.scrollUp:SetFont(font, normalSize * self.fontSizePercent, flags) + self.scrollDown:SetFont(font, normalSize * self.fontSizePercent, flags) + local ratio = self.fontSizePercent / lastSize + for i = 1, self.numLines do + local left = self.lefts[i] + local right = self.rights[i] + local third = self.thirds[i] + local fourth = self.fourths[i] + local fifth = self.fifths[i] + local sixth = self.sixths[i] + local check = self.checks[i] + local font, size, flags = left:GetFont() + left:SetFont(font, size * ratio, flags) + font, size, flags = right:GetFont() + right:SetFont(font, size * ratio, flags) + font, size, flags = third:GetFont() + third:SetFont(font, size * ratio, flags) + font, size, flags = fourth:GetFont() + fourth:SetFont(font, size * ratio, flags) + font, size, flags = fifth:GetFont() + fifth:SetFont(font, size * ratio, flags) + font, size, flags = sixth:GetFont() + sixth:SetFont(font, size * ratio, flags) + check.width = check.width * ratio + check:SetWidth(check:GetWidth() * ratio) + check:SetHeight(check:GetHeight() * ratio) + end + self:SetWidth((self:GetWidth() - 51) * ratio + 51) + self:SetHeight((self:GetHeight() - 51) * ratio + 51) + if self:IsShown() and self.children then + self:children() + self:Show() + end + end + tooltip.SetFontSizePercent = wrap(tooltip.SetFontSizePercent, "tooltip:SetFontSizePercent") + + function tooltip:GetFontSizePercent() + return self.fontSizePercent + end + + function tooltip:SetTransparency(alpha) + local data, detachedData = self.data, self.detachedData + if detachedData and detachedData.detached then + data = detachedData + end + self.transparency = alpha + if data then + data.transparency = alpha ~= 0.75 and alpha or nil + end + self:SetBackdropColor(self.r or 0, self.g or 0, self.b or 0, alpha) + self:SetBackdropBorderColor(1, 1, 1, alpha) + end + tooltip.SetTransparency = wrap(tooltip.SetTransparency, "tooltip:SetTransparency") + + function tooltip:GetTransparency() + return self.transparency + end + + function tooltip:SetColor(r, g, b) + local data, detachedData = self.data, self.detachedData + if detachedData and detachedData.detached then + data = detachedData + end + self.r = r + self.g = g + self.b = b + if data then + data.r = r ~= 0 and r or nil + data.g = g ~= 0 and g or nil + data.b = b ~= 0 and b or nil + end + self:SetBackdropColor(r or 0, g or 0, b or 0, self.transparency) + self:SetBackdropBorderColor(1, 1, 1, self.transparency) + end + tooltip.SetColor = wrap(tooltip.SetColor, "tooltip:SetColor") + + function tooltip:GetColor() + return self.r, self.g, self.b + end + + function tooltip:Scroll(down) + local maxLinesPerScreen = GetMaxLinesPerScreen(self) + if down then + if IsShiftKeyDown() then + self.scroll = self.numLines - maxLinesPerScreen + else + self.scroll = self.scroll + 3 + end + else + if IsShiftKeyDown() then + self.scroll = 0 + else + self.scroll = self.scroll - 3 + end + end + if self.scroll > self.numLines - maxLinesPerScreen then + self.scroll = self.numLines - maxLinesPerScreen + end + if self.scroll < 0 then + self.scroll = 0 + end + if self:IsShown() then + self:Show() + end + end + tooltip.Scroll = wrap(tooltip.Scroll, "tooltip:Scroll") + + function tooltip.Detach(tooltip) + local owner = tooltip.owner + tooltip:Hide() + if not tooltip.detachedData then + self:error("You cannot detach if detachedData is not present") + end + tooltip.detachedData.detached = true + local detached = AcquireDetachedFrame(self, tooltip.registration, tooltip.data, tooltip.detachedData) + + detached.menu, tooltip.menu = tooltip.menu, nil + detached.children = tooltip.children + tooltip.children = nil + detached:SetOwner(owner) + detached:children() + detached:Show() + end + tooltip.Detach = wrap(tooltip.Detach, "tooltip:Detach") + + end + + tooltip.registration = registration + registration.tooltip = tooltip + return tooltip +end +AcquireFrame = wrap(AcquireFrame, "AcquireFrame") + +function ReleaseDetachedFrame(self, data, detachedData) + if not detachedData then + detachedData = data + end + for _, detached in ipairs(detachedTooltips) do + if detached.detachedData == detachedData then + detached.notInUse = true + detached:Hide() + detached.registration.tooltip = nil + detached.registration = nil + detached.detachedData = nil + end + end +end +ReleaseDetachedFrame = wrap(ReleaseDetachedFrame, "ReleaseDetachedFrame") + +local StartCheckingAlt, StopCheckingAlt +do + local frame + function StartCheckingAlt(func) + if not frame then + frame = CreateFrame("Frame") + frame:SetScript("OnEvent", function(this, _, modifier) + if modifier == "ALT" then + this.func() + end + end) + end + frame:RegisterEvent("MODIFIER_STATE_CHANGED") + frame.func = func + end + function StopCheckingAlt() + if frame then + frame:UnregisterEvent("MODIFIER_STATE_CHANGED") + end + end +end + +local fake_ipairs +do + local function iter(tmp, i) + i = i + 1 + local x = tmp[i] + tmp[i] = nil + if x then + return i, x + end + end + + local tmp = {} + function fake_ipairs(...) + for i = 1, select('#', ...) do + tmp[i] = select(i, ...) + end + return iter, tmp, 0 + end +end + +function AcquireDetachedFrame(self, registration, data, detachedData) + if not detachedData then + detachedData = data + end + for _, detached in ipairs(detachedTooltips) do + if detached.notInUse then + detached.data = data + detached.detachedData = detachedData + detached.notInUse = nil + local fontSizePercent = detachedData.fontSizePercent or 1 + local transparency = detachedData.transparency or 0.75 + local r = detachedData.r or 0 + local g = detachedData.g or 0 + local b = detachedData.b or 0 + detached:SetFontSizePercent(fontSizePercent) + detached:SetTransparency(transparency) + detached:SetColor(r, g, b) + detached:ClearAllPoints() + detached:SetWidth(0) + detached:SetHeight(0) + if not registration.strata then + detached:SetFrameStrata("BACKGROUND") + end + if not registration.frameLevel then + detached:SetFrameLevel(10) + for _,frame in fake_ipairs(detached:GetChildren()) do + frame:SetFrameLevel(12) + end + end + detached:SetParent(registration.parent or UIParent) + if registration.strata then + detached:SetFrameStrata(registration.strata) + end + if registration.frameLevel then + detached:SetFrameLevel(registration.frameLevel) + for _,frame in fake_ipairs(detached:GetChildren()) do + frame:SetFrameLevel(registration.frameLevel+2) + end + end + detached.height_ = nil + if registration.positionFunc then + registration.positionFunc(detached) + local height = detached:GetHeight() + if height > 0 then + detached.height_ = height + else + local top, bottom + for i = 1, detached:GetNumPoints() do + local a,b,c,d,e = detached:GetPoint(i) + + if a:find("^TOP") then + if c:find("^TOP") then + top = b:GetTop() + elseif c:find("^BOTTOM") then + top = b:GetBottom() + else + _,top = b:GetCenter() + end + if top then + top = top + e + end + elseif a:find("^BOTTOM") then + if c:find("^TOP") then + bottom = b:GetTop() + elseif c:find("^BOTTOM") then + bottom = b:GetBottom() + else + _,bottom = b:GetCenter() + end + if bottom then + bottom = bottom + e + end + end + end + if top and bottom then + detached.height_ = top - bottom + end + end + else + detached:SetPoint(detachedData.anchor or "CENTER", UIParent, detachedData.anchor or "CENTER", detachedData.offsetx or 0, detachedData.offsety or 0) + end + detached.registration = registration + registration.tooltip = detached + if registration.movable == false then + detached:RegisterForDrag() + else + detached:RegisterForDrag("LeftButton") + end + return detached + end + end + + if not Dewdrop and AceLibrary:HasInstance("Dewdrop-2.0") then + Dewdrop = AceLibrary("Dewdrop-2.0") + end + StartCheckingAlt(function() + for _, detached in ipairs(detachedTooltips) do + if detached:IsShown() and detached.locked then + detached:EnableMouse(IsAltKeyDown()) + detached:children() + if detached.moving then + local a1 = arg1 + arg1 = "LeftButton" + if type(detached:GetScript("OnMouseUp")) == "function" then + detached:GetScript("OnMouseUp")(detached, arg1) + end + arg1 = a1 + end + end + end + end) + if not tooltip then + AcquireFrame(self, {}) + end + local detached = CreateFrame("Frame", "Tablet20DetachedFrame" .. (#detachedTooltips + 1), UIParent) + table.insert(detachedTooltips, detached) + detached.notInUse = true + detached:EnableMouse(not data.locked) + detached:EnableMouseWheel(true) + detached:SetMovable(true) + detached:SetPoint(data.anchor or "CENTER", UIParent, data.anchor or "CENTER", data.offsetx or 0, data.offsety or 0) + + detached.numLines = 0 + detached.owner = nil + detached.fontSizePercent = 1 + detached.maxLines = 0 + detached.buttons = {} + detached.checks = {} + detached.lefts = {} + detached.rights = {} + detached.thirds = {} + detached.fourths = {} + detached.fifths = {} + detached.sixths = {} + detached.transparency = 0.75 + detached.r = 0 + detached.g = 0 + detached.b = 0 + detached:SetFrameStrata(registration.strata or "BACKGROUND") + detached:SetBackdrop(tmp.a( + 'bgFile', "Interface\\Buttons\\WHITE8X8", + 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border", + 'tile', true, + 'tileSize', 16, + 'edgeSize', 16, + 'insets', tmp.b( + 'left', 5, + 'right', 5, + 'top', 5, + 'bottom', 5 + ) + )) + detached.locked = detachedData.locked + detached.scroll = 0 + detached:EnableMouse(not detached.locked) + + local width = GetScreenWidth() + local height = GetScreenHeight() + if registration.movable == false then + detached:RegisterForDrag() + else + detached:RegisterForDrag("LeftButton") + end + detached:SetScript("OnDragStart", function() + detached:StartMoving() + detached.moving = true + end) + + detached:SetScript("OnDragStop", function() + detached:StopMovingOrSizing() + detached.moving = nil + local anchor + local offsetx + local offsety + if detached:GetTop() + detached:GetBottom() < height then + anchor = "BOTTOM" + offsety = detached:GetBottom() + if offsety < 0 then + offsety = 0 + end + if offsety < MainMenuBar:GetTop() and MainMenuBar:IsVisible() then + offsety = MainMenuBar:GetTop() + end + local top = 0 + if FuBar then + for i = 1, FuBar:GetNumPanels() do + local panel = FuBar:GetPanel(i) + if panel:GetAttachPoint() == "BOTTOM" then + if panel.frame:GetTop() > top then + top = panel.frame:GetTop() + break + end + end + end + end + if offsety < top then + offsety = top + end + else + anchor = "TOP" + offsety = detached:GetTop() - height + if offsety > 0 then + offsety = 0 + end + local bottom = GetScreenHeight() + if FuBar then + for i = 1, FuBar:GetNumPanels() do + local panel = FuBar:GetPanel(i) + if panel:GetAttachPoint() == "TOP" then + if panel.frame:GetBottom() < bottom then + bottom = panel.frame:GetBottom() + break + end + end + end + end + bottom = bottom - GetScreenHeight() + if offsety > bottom then + offsety = bottom + end + end + if detached:GetLeft() + detached:GetRight() < width * 2 / 3 then + anchor = anchor .. "LEFT" + offsetx = detached:GetLeft() + if offsetx < 0 then + offsetx = 0 + end + elseif detached:GetLeft() + detached:GetRight() < width * 4 / 3 then + if anchor == "" then + anchor = "CENTER" + end + offsetx = (detached:GetLeft() + detached:GetRight() - GetScreenWidth()) / 2 + else + anchor = anchor .. "RIGHT" + offsetx = detached:GetRight() - width + if offsetx > 0 then + offsetx = 0 + end + end + detached:ClearAllPoints() + detached:SetPoint(anchor, UIParent, anchor, offsetx, offsety) + local t = detached.detachedData + if t.anchor ~= anchor or math.abs(t.offsetx - offsetx) > 8 or math.abs(t.offsety - offsety) > 8 then + detached.preventClick = GetTime() + 0.05 + end + t.anchor = anchor + t.offsetx = offsetx + t.offsety = offsety + detached:Show() + end) + + if Dewdrop then + Dewdrop:Register(detached, + 'children', function(level, value) + if not detached.registration then + return + end + if detached.menu then + detached.menu(level, value) + if level == 1 then + Dewdrop:AddLine() + end + end + if level == 1 then + if not detached.registration.cantAttach then + Dewdrop:AddLine( + 'text', DETACH, + 'tooltipTitle', DETACH, + 'tooltipText', DETACH_DESC, + 'checked', true, + 'arg1', detached, + 'func', "Attach", + 'closeWhenClicked', true + ) + end + Dewdrop:AddLine( + 'text', LOCK, + 'tooltipTitle', LOCK, + 'tooltipText', LOCK_DESC, + 'checked', detached:IsLocked(), + 'arg1', detached, + 'func', "Lock", + 'closeWhenClicked', not detached:IsLocked() + ) + Dewdrop:AddLine( + 'text', COLOR, + 'tooltipTitle', COLOR, + 'tooltipText', COLOR_DESC, + 'hasColorSwatch', true, + 'r', detached.r, + 'g', detached.g, + 'b', detached.b, + 'hasOpacity', true, + 'opacity', detached.transparency, + 'colorFunc', function(r, g, b, a) + detached:SetColor(r, g, b) + detached:SetTransparency(a) + end + ) + Dewdrop:AddLine( + 'text', SIZE, + 'tooltipTitle', SIZE, + 'tooltipText', SIZE_DESC, + 'hasArrow', true, + 'hasSlider', true, + 'sliderFunc', function(value) + detached:SetFontSizePercent(value) + end, + 'sliderMax', 2, + 'sliderMin', 0.5, + 'sliderStep', 0.05, + 'sliderIsPercent', true, + 'sliderValue', detached:GetFontSizePercent() + ) + Dewdrop:AddLine( + 'text', CLOSE_MENU, + 'tooltipTitle', CLOSE_MENU, + 'tooltipText', CLOSE_MENU_DESC, + 'func', function() + Dewdrop:Close() + end + ) + end + end, + 'point', function() + local x, y = detached:GetCenter() + if x < GetScreenWidth() / 2 then + if y < GetScreenHeight() / 2 then + return "BOTTOMLEFT", "BOTTOMRIGHT" + else + return "TOPLEFT", "TOPRIGHT" + end + else + if y < GetScreenHeight() / 2 then + return "BOTTOMRIGHT", "BOTTOMLEFT" + else + return "TOPRIGHT", "TOPLEFT" + end + end + end + ) + end + + NewLine(detached) + + detached.scrollUp = detached:CreateFontString(nil, "ARTWORK") + detached.scrollUp:SetPoint("TOPLEFT", detached.buttons[1], "BOTTOMLEFT", 0, -2) + detached.scrollUp:SetPoint("RIGHT", detached, "RIGHT", 0, -10) + detached.scrollUp:SetFontObject(GameTooltipText) + detached.scrollUp:Hide() + local font,_,flags = detached.scrollUp:GetFont() + detached.scrollUp:SetFont(font, normalSize * detached.fontSizePercent, flags) + detached.scrollUp:SetJustifyH("CENTER") + detached.scrollUp:SetTextColor(1, 0.823529, 0) + detached.scrollUp:SetText(" ") + + detached.scrollDown = detached:CreateFontString(nil, "ARTWORK") + detached.scrollDown:SetPoint("TOPLEFT", detached.buttons[1], "BOTTOMLEFT", 0, -2) + detached.scrollDown:SetPoint("RIGHT", detached, "RIGHT", 0, -10) + detached.scrollDown:SetFontObject(GameTooltipText) + detached.scrollDown:Hide() + local font,_,flags = detached.scrollUp:GetFont() + detached.scrollDown:SetFont(font, normalSize * detached.fontSizePercent, flags) + detached.scrollDown:SetJustifyH("CENTER") + detached.scrollDown:SetTextColor(1, 0.823529, 0) + detached.scrollDown:SetText(" ") + + detached:SetScript("OnMouseWheel", function() + detached:Scroll(arg1 < 0) + end) + + detached.SetTransparency = tooltip.SetTransparency + detached.GetTransparency = tooltip.GetTransparency + detached.SetColor = tooltip.SetColor + detached.GetColor = tooltip.GetColor + detached.SetFontSizePercent = tooltip.SetFontSizePercent + detached.GetFontSizePercent = tooltip.GetFontSizePercent + detached.SetOwner = tooltip.SetOwner + detached.IsOwned = tooltip.IsOwned + detached.ClearLines = tooltip.ClearLines + detached.NumLines = tooltip.NumLines + detached.__Hide = detached.Hide + detached.__Show = detached.Show + detached.Hide = tooltip.Hide + detached.Show = tooltip.Show + local old_IsShown = detached.IsShown + function detached:IsShown() + if self.tmpHidden then + return true + else + return old_IsShown(self) + end + end + detached.AddLine = tooltip.AddLine + detached.Scroll = tooltip.Scroll + function detached:IsLocked() + return self.locked + end + function detached:Lock() + self:EnableMouse(self.locked) + self.locked = not self.locked + self.detachedData.locked = self.locked or nil + self:children() + end + + function detached.Attach(detached) + if not detached then + self:error("Detached tooltip not given.") + end + if not detached.AddLine then + self:error("detached argument not a Tooltip.") + end + if not detached.owner then + self:error("Detached tooltip has no owner.") + end + if detached.notInUse then + self:error("Detached tooltip not in use.") + end + detached.menu = nil + detached.detachedData.detached = nil + detached:SetOwner(nil) + detached.notInUse = true + end + + return AcquireDetachedFrame(self, registration, data, detachedData) +end +AcquireDetachedFrame = wrap(AcquireDetachedFrame, "AcquireDetachedFrame") + +function Tablet:Close(parent) + if not parent then + if tooltip and tooltip:IsShown() then + tooltip:Hide() + tooltip.registration.tooltip = nil + tooltip.registration = nil + tooltip.enteredFrame = false + end + return + else + self:argCheck(parent, 2, "table", "string") + end + local info = self.registry[parent] + if not info then + self:error("You cannot close a tablet with an unregistered parent frame.") + end + local data = info.data + local detachedData = info.detachedData + if detachedData and detachedData.detached then + ReleaseDetachedFrame(self, data, detachedData) + elseif tooltip.data == data then + tooltip:Hide() + tooltip.registration.tooltip = nil + tooltip.registration = nil + end + tooltip.enteredFrame = false +end +Tablet.Close = wrap(Tablet.Close, "Tablet:Close") + +local currentFrame +local currentTabletData + +function Tablet:Open(fakeParent, parent) + self:argCheck(fakeParent, 2, "table", "string") + self:argCheck(parent, 3, "nil", "table", "string") + if not parent then + parent = fakeParent + end + local info = self.registry[parent] + if not info then + self:error("You cannot open a tablet with an unregistered parent frame.") + end + local detachedData = info.detachedData + if detachedData then + for _, detached in ipairs(detachedTooltips) do + if not detached.notInUse and detached.detachedData == detachedData then + return + end + end + end +-- self:Close(fakeParent) + local data = info.data + local children = info.children + if not children then + return + end + local frame = AcquireFrame(self, info, data, detachedData) + frame.clickable = info.clickable + frame.menu = info.menu + local children = info.children + function frame:children() + if not self.preventRefresh and self:GetParent():IsVisible() then + currentFrame = self + currentTabletData = TabletData:new(self) +-- if info.width then +-- currentTabletData.width = info.width +-- end + self:ClearLines() + if children then + children() + end + currentTabletData:Display(currentFrame) + self:Show(currentTabletData) + currentTabletData:del() + currentTabletData = nil + currentFrame = nil + end + end + frame:SetOwner(fakeParent) + frame:children() + local point = info.point + local relativePoint = info.relativePoint + if type(point) == "function" then + local b + point, b = point(fakeParent) + if b then + relativePoint = b + end + end + if type(relativePoint) == "function" then + relativePoint = relativePoint(fakeParent) + end + if not point then + point = "CENTER" + end + if not relativePoint then + relativePoint = point + end + frame:ClearAllPoints() + if type(parent) ~= "string" then + frame:SetPoint(point, fakeParent, relativePoint) + end + local offsetx = 0 + local offsety = 0 + if frame:GetBottom() and frame:GetLeft() then + if frame:GetRight() > GetScreenWidth() then + offsetx = frame:GetRight() - GetScreenWidth() + elseif frame:GetLeft() < 0 then + offsetx = -frame:GetLeft() + end + local ratio = GetScreenWidth() / GetScreenHeight() + if ratio >= 2.4 and frame:GetRight() > GetScreenWidth() / 2 and frame:GetLeft() < GetScreenWidth() / 2 then + if frame:GetCenter() < GetScreenWidth() / 2 then + offsetx = frame:GetRight() - GetScreenWidth() / 2 + else + offsetx = frame:GetLeft() - GetScreenWidth() / 2 + end + end + if frame:GetBottom() < 0 then + offsety = frame:GetBottom() + elseif frame:GetTop() and frame:GetTop() > GetScreenHeight() then + offsety = frame:GetTop() - GetScreenHeight() + end + if MainMenuBar:IsVisible() and frame:GetBottom() < MainMenuBar:GetTop() and offsety < frame:GetBottom() - MainMenuBar:GetTop() then + offsety = frame:GetBottom() - MainMenuBar:GetTop() + end + + if FuBar then + local top = 0 + if FuBar then + for i = 1, FuBar:GetNumPanels() do + local panel = FuBar:GetPanel(i) + if panel:GetAttachPoint() == "BOTTOM" then + if panel.frame:GetTop() and panel.frame:GetTop() > top then + top = panel.frame:GetTop() + break + end + end + end + end + if frame:GetBottom() < top and offsety < frame:GetBottom() - top then + offsety = frame:GetBottom() - top + end + local bottom = GetScreenHeight() + if FuBar then + for i = 1, FuBar:GetNumPanels() do + local panel = FuBar:GetPanel(i) + if panel:GetAttachPoint() == "TOP" then + if panel.frame:GetBottom() and panel.frame:GetBottom() < bottom then + bottom = panel.frame:GetBottom() + break + end + end + end + end + if frame:GetTop() > bottom and offsety < frame:GetTop() - bottom then + offsety = frame:GetTop() - bottom + end + end + end + if type(fakeParent) ~= "string" then + frame:SetPoint(point, fakeParent, relativePoint, -offsetx, -offsety) + end + + if detachedData and (info.cantAttach or detachedData.detached) and frame == tooltip then + detachedData.detached = false + frame:Detach() + end + if (not detachedData or not detachedData.detached) and GetMouseFocus() == fakeParent then + self.tooltip.enteredFrame = true + end + overFrame = type(fakeParent) == "table" and MouseIsOver(fakeParent) and fakeParent +end +Tablet.Open = wrap(Tablet.Open, "Tablet:Open") + +function Tablet:Register(parent, ...) + self:argCheck(parent, 2, "table", "string") + if self.registry[parent] then + self:Unregister(parent) + end + local info + local k1 = ... + if type(k1) == "table" and k1[0] then + if type(self.registry[k1]) ~= "table" then + self:error("Other parent not registered") + end + info = copy(self.registry[k1]) + local v1 = select(2, ...) + if type(v1) == "function" then + info.point = v1 + info.relativePoint = nil + end + else + info = new(...) + end + self.registry[parent] = info + info.data = info.data or info.detachedData or {} + info.detachedData = info.detachedData or info.data + local data = info.data + local detachedData = info.detachedData + if not self.onceRegistered[parent] and type(parent) == "table" and type(parent.SetScript) == "function" and not info.dontHook then + if not Dewdrop and AceLibrary:HasInstance("Dewdrop-2.0") then + Dewdrop = AceLibrary("Dewdrop-2.0") + end + local script = parent:GetScript("OnEnter") + parent:SetScript("OnEnter", function(...) + if script then + script(...) + end + if self.registry[parent] then + if (not data or not detachedData.detached) and (Dewdrop and not Dewdrop:IsOpen(parent)) then + self:Open(parent) + end + end + end) + if parent:HasScript("OnMouseDown") then + local script = parent:GetScript("OnMouseDown") + parent:SetScript("OnMouseDown", function(...) + if script then + script(...) + end + if self.registry[parent] and self.registry[parent].tooltip and self.registry[parent].tooltip == self.tooltip then + self.tooltip:Hide() + end + end) + end + if parent:HasScript("OnMouseWheel") then + local script = parent:GetScript("OnMouseWheel") + parent:SetScript("OnMouseWheel", function(...) + if script then + script(...) + end + if self.registry[parent] and self.registry[parent].tooltip then + self.registry[parent].tooltip:Scroll(arg1 < 0) + end + end) + end + end + self.onceRegistered[parent] = true + if GetMouseFocus() == parent then + self:Open(parent) + end +end +Tablet.Register = wrap(Tablet.Register, "Tablet:Register") + +function Tablet:Unregister(parent) + self:argCheck(parent, 2, "table", "string") + if not self.registry[parent] then + self:error("You cannot unregister a parent frame if it has not been registered already.") + end + self.registry[parent] = nil +end +Tablet.Unregister = wrap(Tablet.Unregister, "Tablet:Unregister") + +function Tablet:IsRegistered(parent) + self:argCheck(parent, 2, "table", "string") + return self.registry[parent] and true +end +Tablet.IsRegistered = wrap(Tablet.IsRegistered, "Tablet:IsRegistered") + +local _id = 0 +local addedCategory +local currentCategoryInfo +local depth = 0 +local categoryPool = {} +function CleanCategoryPool(self) + for k,v in pairs(categoryPool) do + del(v) + categoryPool[k] = nil + end + _id = 0 +end + +function Tablet:AddCategory(...) + if not currentFrame then + self:error("You must add categories in within a registration.") + end + local info = new(...) + local cat = currentTabletData:AddCategory(info) + info = del(info) + return cat +end +Tablet.AddCategory = wrap(Tablet.AddCategory, "Tablet:AddCategory") + +function Tablet:SetHint(text) + if not currentFrame then + self:error("You must set hint within a registration.") + end + if currentCategoryInfo then + self:error("You cannot set hint in a category.") + end + currentTabletData:SetHint(text) +end +Tablet.SetHint = wrap(Tablet.SetHint, "Tablet:SetHint") + +function Tablet:SetTitle(text) + if not currentFrame then + self:error("You must set title within a registration.") + end + if currentCategoryInfo then + self:error("You cannot set title in a category.") + end + currentTabletData:SetTitle(text) +end +Tablet.SetTitle = wrap(Tablet.SetTitle, "Tablet:SetTitle") + +function Tablet:SetTitleColor(r, g, b) + if not currentFrame then + self:error("You must set title color within a registration.") + end + if currentCategoryInfo then + self:error("You cannot set title color in a category.") + end + self:argCheck(r, 2, "number") + self:argCheck(g, 3, "number") + self:argCheck(b, 4, "number") + currentTabletData:SetTitleColor(r, g, b) +end +Tablet.SetTitleColor = wrap(Tablet.SetTitleColor, "Tablet:SetTitleColor") + +function Tablet:GetNormalFontSize() + return normalSize +end + +function Tablet:GetHeaderFontSize() + return headerSize +end + +function Tablet:GetNormalFontObject() + return GameTooltipText +end + +function Tablet:GetHeaderFontObject() + return GameTooltipHeaderText +end + +function Tablet:SetFontSizePercent(parent, percent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if info then + if info.tooltip then + info.tooltip:SetFontSizePercent(percent) + else + local data = info.data + local detachedData = info.detachedData + if detachedData.detached then + detachedData.fontSizePercent = percent + else + data.fontSizePercent = percent + end + end + elseif type(parent) == "table" then + parent.fontSizePercent = percent + else + self:error("You cannot change font size with an unregistered parent frame.") + end +end +Tablet.SetFontSizePercent = wrap(Tablet.SetFontSizePercent, "Tablet:SetFontSizePercent") + +function Tablet:GetFontSizePercent(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if info then + local data = info.data + local detachedData = info.detachedData + if detachedData.detached then + return detachedData.fontSizePercent or 1 + else + return data.fontSizePercent or 1 + end + elseif type(parent) == "table" then + return parent.fontSizePercent or 1 + else + self:error("You cannot check font size with an unregistered parent frame.") + end +end +Tablet.GetFontSizePercent = wrap(Tablet.GetFontSizePercent, "Tablet:GetFontSizePercent") + +function Tablet:SetTransparency(parent, percent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if info then + if info.tooltip then + info.tooltip:SetTransparency(percent) + else + local data = info.data + local detachedData = info.detachedData + if detachedData.detached then + detachedData.transparency = percent + elseif data then + data.transparency = percent + end + end + elseif type(parent) == "table" then + parent.transparency = percent + else + self:error("You cannot change transparency with an unregistered parent frame.") + end +end +Tablet.SetTransparency = wrap(Tablet.SetTransparency, "Tablet:SetTransparency") + +function Tablet:GetTransparency(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if info then + local data = info.data + local detachedData = info.detachedData + if detachedData.detached then + return detachedData.transparency or 0.75 + else + return data.transparency or 0.75 + end + elseif type(parent) == "table" then + return parent.transparency or 0.75 + else + self:error("You cannot get transparency with an unregistered parent frame.") + end +end +Tablet.GetTransparency = wrap(Tablet.GetTransparency, "Tablet:GetTransparency") + +function Tablet:SetColor(parent, r, g, b) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if info then + if info.tooltip then + info.tooltip:SetColor(r, g, b) + else + local data = info.data + local detachedData = info.detachedData + if detachedData.detached then + detachedData.r = r + detachedData.g = g + detachedData.b = b + else + data.r = r + data.g = g + data.b = b + end + end + elseif type(parent) == "table" then + parent.r = r + parent.g = g + parent.b = b + else + self:error("You cannot change color with an unregistered parent frame.") + end +end +Tablet.SetColor = wrap(Tablet.SetColor, "Tablet:SetColor") + +function Tablet:GetColor(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if info then + local data = info.data + local detachedData = info.detachedData + if detachedData.detached then + return detachedData.r or 0, detachedData.g or 0, detachedData.b or 0 + else + return data.r or 0, data.g or 0, data.b or 0 + end + elseif type(parent) == "table" then + return parent.r or 0, parent.g or 0, parent.b or 0 + else + self:error("You must provide a registered parent frame to check color") + end +end +Tablet.GetColor = wrap(Tablet.GetColor, "Tablet:GetColor") + +function Tablet:Detach(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot detach tablet with an unregistered parent frame.") + end + if not info.detachedData then + self:error("You cannot detach tablet without a data field.") + end + if info.tooltip and info.tooltip == tooltip then + tooltip:Detach() + else + info.detachedData.detached = true + local detached = AcquireDetachedFrame(self, info, info.data, info.detachedData) + + detached.menu = info.menu + local children = info.children + function detached:children() + if not self.preventRefresh then + currentFrame = self + currentTabletData = TabletData:new(self) + self:ClearLines() + if children then + children() + end + currentTabletData:Display(currentFrame) + self:Show(currentTabletData) + currentTabletData:del() + currentTabletData = nil + currentFrame = nil + end + end + detached:SetOwner(parent) + detached:children() + end +end +Tablet.Detach = wrap(Tablet.Detach, "Tablet:Detach") + +function Tablet:Attach(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot detach tablet with an unregistered parent frame.") + end + if not info.detachedData then + self:error("You cannot attach tablet without a data field.") + end + if info.tooltip and info.tooltip ~= tooltip then + info.tooltip:Attach() + else + info.detachedData.detached = false + end +end +Tablet.Attach = wrap(Tablet.Attach, "Tablet:Attach") + +function Tablet:IsAttached(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot check tablet with an unregistered parent frame.") + end + return not info.detachedData or not info.detachedData.detached +end +Tablet.IsAttached = wrap(Tablet.IsAttached, "Tablet:IsAttached") + +function Tablet:Refresh(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot refresh tablet with an unregistered parent frame.") + end + local tt = info.tooltip + if tt and not tt.preventRefresh and tt:IsShown() then + tt.updating = true + tt:children() + tt.updating = false + end +end +Tablet.Refresh = wrap(Tablet.Refresh, "Tablet:Refresh") + +function Tablet:IsLocked(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot check tablet with an unregistered parent frame.") + end + return info.detachedData and info.detachedData.locked +end +Tablet.IsLocked = wrap(Tablet.IsLocked, "Tablet:IsLocked") + +function Tablet:ToggleLocked(parent) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot lock tablet with an unregistered parent frame.") + end + if info.tooltip and info.tooltip ~= tooltip then + info.tooltip:Lock() + elseif info.detachedData then + info.detachedData.locked = info.detachedData.locked + end +end +Tablet.ToggleLocked = wrap(Tablet.ToggleLocked, "Tablet:ToggleLocked") + +function Tablet:UpdateDetachedData(parent, detachedData) + self:argCheck(parent, 2, "table", "string") + local info = self.registry[parent] + if not info then + self:error("You cannot update tablet with an unregistered parent frame.") + end + self:argCheck(detachedData, 3, "table") + if info.data == info.detachedData then + info.data = detachedData + end + info.detachedData = detachedData + if info.detachedData.detached then + self:Detach(parent) + elseif info.tooltip and info.tooltip.owner then + self:Attach(parent) + end +end +Tablet.UpdateDetachedData = wrap(Tablet.UpdateDetachedData, "Tablet:UpdateDetachedData") + +if DEBUG then + function Tablet:ListProfileInfo() + local duration, times, memories = GetProfileInfo() + self:assert(duration and times and memories) + local t = new() + for method in pairs(memories) do + table.insert(t, method) + end + table.sort(t, function(alpha, bravo) + if memories[alpha] ~= memories[bravo] then + return memories[alpha] < memories[bravo] + elseif times[alpha] ~= times[bravo] then + return times[alpha] < times[bravo] + else + return alpha < bravo + end + end) + local memory = 0 + local time = 0 + for _,method in ipairs(t) do + DEFAULT_CHAT_FRAME:AddMessage(format("%s || %.3f s || %.3f%% || %d KiB", method, times[method], times[method] / duration * 100, memories[method])) + memory = memory + memories[method] + time = time + times[method] + end + DEFAULT_CHAT_FRAME:AddMessage(format("%s || %.3f s || %.3f%% || %d KiB", "Total", time, time / duration * 100, memory)) + del(t) + end + SLASH_TABLET1 = "/tablet" + SLASH_TABLET2 = "/tabletlib" + SlashCmdList["TABLET"] = function(msg) + TabletLib:GetInstance(MAJOR_VERSION):ListProfileInfo() + end +end + +local function activate(self, oldLib, oldDeactivate) + Tablet = self + if oldLib then + self.registry = oldLib.registry + self.onceRegistered = oldLib.onceRegistered + self.tooltip = oldLib.tooltip + else + self.registry = {} + self.onceRegistered = {} + end + + tooltip = self.tooltip + + if oldDeactivate then + oldDeactivate(oldLib) + end +end + +local function deactivate(self) + StopCheckingAlt() +end + +AceLibrary:Register(Tablet, MAJOR_VERSION, MINOR_VERSION, activate, deactivate) diff --git a/sounds/Heartbeat.wav b/sounds/Heartbeat.wav new file mode 100644 index 0000000000000000000000000000000000000000..97a5c748d4a5ecdadd1dd2e6ab3dbdae7cdf2399 GIT binary patch literal 14446 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 literal 0 HcmV?d00001 diff --git a/sounds/blareaggro.wav b/sounds/blareaggro.wav new file mode 100644 index 0000000000000000000000000000000000000000..60b0d1abdeab66ff5297f110965d587a86634718 GIT binary patch literal 27224 zcmW(61$5lF(zax##c-OW?Ufm?%zW*&S7v5rzA`6eW@cuFD>E}g((v+n&EN08d1Fhm zY)Kg|RHEI1E0SzkK?FIdmETe#o)?rr!0K7m)@UMqdks{ITi_$9avKDN?V;3Iez zUWae2)N6PHj<>%13Qn+EyJOWq0kf^1U4;M-z^7Kd16GYoR!N5SbgNaz18-S9I%4%< zlU4f4YA*nza0J(22|NK;tag6Ed+@XM&K5}EUtu438Rl5y%!3qu7NsH2H7CJ22wt|IVN9*mv zumW5Lec%b$4}XDupd9323~UCsgE^ol%mF7sLuN-VObyn__5_6 z9kW~Qt_P2?mR7I!VvE26SRHuKmmrM&gFOOSU=>!{YNZ7z3KT2_^alhe0d|3ln2PSS z%2Ti~b_$#UA%Iw8%ePi)JNODrK|NRkH4J2PNTU*ZIZ+;pygp7@E*Gj@=*%C2&ZBM)(ITJvO#;|7%>DpjSnMZpbp=G zZpa?2F1-@#W^D;~aa|c`#?pIC1ldRZNA^Gs(neOsm(q`sR)~|zMc*LviT|)l=4&zr z$FVC|hE^QI=>M=ST1|W%c^Et(`r);)Cinoj%%VdRED4Ju_7bgOUpRrxzzf14wpd?m ze8bm(e)0vQ3DrZ}g&d_*(Q~?!@xT+vS?Vc13yWgYsg1@~;sJFD9flmkx}s~*L+~(C z*&K|1NB%;Str@&$QfNDPA8!Fyfa351E?aBo5SE8#S`?fQz7aL>*2oXsAUYv9S_Cda z)*2PC&PY#V3fdkNLgrx~fr?zjml6_M2-d-S!C&|aTmU1<4E8GW7)zyEU?t^fIF<(b z!pI(b5^08;n|p2L&?>SMzX!v{F3=B}U=QUd4r8xjQDO)3%`A#FMULVgkfGVAy>ynb z36*FG@2c6+IaoHDkFGHDF$ZI(hnQL55_KFst%cz|d^*}xTLnfkZ6J_a!cRndT}D1q zTaA|J0PZmuj(wr4kp_Gr>>>u}wdrSIw~>K0HYaFLh%QW{upfCz9Z~G+KCUNnRnDdV zVP+vC$ah3CEWyQshe~tiCOSjefYXGjhhRO@fu%#Y)=zS=>wp?stxu!7A~Jd(pN3SX z-r}+PNir3ms7^);unf5q9t4$$?aUi(kF){XNW4W0>v6!%H$#7FE9q^l-2`SUn2A@U z{suj@DqJi2y1q(#Mr5E~xv`pv;&2bRYA#3rr5#`;(uTgy%|R|}UEl>u09_ChkE4Ep z5AZxlKxZMSep5e--$VY?vO!nktlG`o!xYjJ^#D~6JPlQ5KiJmmABiQR+uQ;U+dbel zTtIh3>cAJ|2PIh_Yi|>o>MzMJ0Z%+<^s=-g*j_KgZYJ*_uRv*h0Cjbj3xDehKUM4$}v*_PodZatt;{H=Q zp>(s&z_xfdvd5U{KuB9kmM{k)d#IrL3wMf@v6_)#TsKkCub_pvnPfQvW!GWFF*h5; zd+O715Bo-KVD_Z9;x+VaXj;2RA=pjrrT!vDqPx`cpcu6r)S>dI-uM~#2o=an)CO}e zV3_CDx=eMP1pNZ-7>A>ar)}tvbDohd&*zGf(Nc&xM=@Ff>X}?SSc^GE{vE7n6ld4! zHR*M>zp%$(E|&o+W9J1E{b1ha4l$dNAXAcx(NWkG#2Ve;DEO~Z40%Rx2Sw4o$P*-s zIE8gp?U;=%s8-iBfrjsmg6uN>Dw0L+q)%hB`PS$#wUZ!lU&5pLLBb2)-)MPZrL@RT z*&oOy{ac03#Ex(yQm{P@Bw%M9lklC0hi(bO)G9F|0J-D%c2ZD?Y|VY!4%WxtL1N)hXj2zAQe-m_`fyAae+@hTBXW zG7pm>H*zG?7rq8F`84K>zT3PYyd$a@Kau9d2}DFwu@G9x+G|_GB>e$;6Am)g z=r8dEq8->`oq2G)2tEd7$?CKdX+}V%3G9iF=R2B55ZnnU&Nq`6?C*l(uoirGrG_%Y z@j@;fTu!_7=jIHiw%K1j$3`gCKo}VuM#}L4d>%5FPN56yYlyzWHM~CZgFZ*RMhW8! zHWMF=G||5qnM5i%Ty3bvQ3c4Mk>6NnYJ+|cb5q^b=Wr{xO)W|9wQol;gcfI$IoKXz zv#t=Exp(pgd_R{e_f?m%1C=Ae^YEj|8_8tI9H%ejmeVyNM?iwO9(U@bW+1FVjU`pJDcw|T8vI3ca`DO^k*f9x{?lKB`G&_w!sal&jnRp=VfO;> zh%Dg`a~Lv*ng$*b-N?6SBd#aoRaw}^wwtb|T_qhtapI#i8vDYIHU;GY(HH4$biw-> zb@l$_Vbm4A!0+ePa1^{pw?+n_9`2fTN}0mdAL#tR z?YucG@TCzFx(u#zCfqx-IxpL8>5ogmWoIxnLordv=-P)d^1mQ&FK62aeTel zNcdxTw=;>jQ2w?@`A>t$yfS>q9 zrozkM2N}lqshhxSJVE;h`9KNM#c(lhDt0V90V@nLlzRLG`bD?``HjuezMGdF7mblB zW}8Z`Mo!XK$?e(+#>+-Uj)TcU`^YhA2B8|gvI#yDUT}%z4 z7%~nT_&_+`*oP*v14vWJ!;T6*%7?ba>LA~#Hq7C`d)UU^)6DXh7U!{l1iFIrba8#6 za@y35Sh_Q@DDYYD#4W&|>nHIJcn{c#oM*{#Gl>5zx%C2VouAMe-~i*mUGgF5!c&#v zNF91#7=-;yA*^oXge8lQ)i<)2h#m4uVj!_tDU4m?vrIeIkn@s*vD-`~;+y86nv)OI zD<&om(dq>EgTi>F@DJrWek@{fH1f1M#GJ>?H`@hyE}hlQQrHHI3|;j7F6)F?5m4AweF4PDqV1vnfL(-l*Zk~Uc3(&~g{V8qjqomF3icuL0N;wYRq}zCD51Da2cH}E z1}R|$cgp;ZH(>h_pV&CUuMXiVF;&do=y_WRdX)e^0<>4kfQwKw#!{>BJgFGA+Br`8 z>`leJRFbhCO<|uvojJ|=BV~xn;vM6s+*+JWY3LsA5VjT{?)Zkh46Sm>{EhtGcs92s z(nSAdW0Yp+D*xEY{2X zt=5BAxS#TICEvah`4FrNt`k-Km#}(FPpvyF6~7M6Qw4USd{W*j)}s@Ghn;oePMIk2 zkh-8AC+c&}{mZqq_zT*MPx8E8A971z9Vjer-CEQ4^&kp9@#D4 zk~<;OY%Q>Y`faC=xEGjW`$UhBE|4v4ALae_H0R%*Ua**pifr&-aCK7pcz^IK5h?Hn z?{56?ZgkvpocHWPdqiy^FX~r7cZ4O%+g2(=m{0^kuq4mV}0KiPT@gwa8~))}E5r`8ir9 zzQsPktfMV z$)nMgEP}SvX7X>j!+1;K2^J@#OkHt+&rdxm5KA=BK14NS8=86UBZwHRCH%=Ic+!xU zj_bj(nz!rL{HG zdhr832`foW=k_v-kVtSx=$q{dUC|%ysT=2XpVdd{A~O%%Cvoy%xG8hAH-N#qxQjK0ZL2i>htCO^vknF>PnoL1Ra#1oFU#6MyR zzMuMCs1dp4%Uy|2dZ&3K#ci^46N@+?eOp=19z?EqPZ}Tjk!l0>P~t>b$V2hJ_@vxL z;S_2w25d!RhssTZJsmxmeHk8QO57s(EVsEx6Lfi)Pt0JOrUwCoRm@*UUX81y9W#^T zoyg9trGYvT3E{Oo$wWTI1pIf-pFvG(wkkw zh1I`^^)ZcNHUzrmUx|6^FtW;c3BACX1P?8sfEp7|eAz>@XLB4deBAd8G4alA6w z3{TQz{gd;kzB=y{y~WP!L%3b8zA%k^!0lBl1&SaMGX@!@wG02t&yTH(X8G)BH*=bD z2&?Al^eYN2Da=5U@gBkij&PoW+V8`B54ak?jFDyHgw*`mFbjKN{7AN`gJ<*UUThXWlyf zF|4{1SWsKHn&xc{=Av zK{-0@i#L>5@x3@XD?=GXN1=o1vC7}xsRhgPdd`Y)2fQ`*gJ>D4l>M11%4dY?TQd0@ z^@Ohy(TuO5uhw$FQRJ0lE;~H*fStqV!bf15*~{30PeS75&*nd7hOM35lV32@oNucd z+AZozphz&jXpFt!m!@_qVNm2qR$pX>a3p#!y2gjb&4~YM%u^4Mb3nGZgPr2V#P;sO znSXmm+jdg3(8EZp+-lMzceXz8_uWV=AeAhk7?L#i*JVKTCyZJgc!?6G;-wi|_0LY1>82}60WI!b93NFuMtjvzcaE7(6{ zN;BVxnR1Gnn$RGg^%Pb&#X(XHrALhfn}1(2uL^6t<@8m2O>Q#vGne zke$dfFvtEU6pU-kQLLXl%=S~v5A^_x;%88Iq%rDe+g74;@MGk)xd|;qUPJCHf3wA? z^YUqW9)2e@UH%q5j0;6>Y9)*b1o~0;Y*Q?L+T1FnxUv1rhS1K#L`{B*LZ@g-cR z$QOFa=r&1S@8wUOV%io+$)BNBi~S(na-<6BS^Ye(?Te91-en1K*q#gr+!DqqM}|ZcnYqf4E*Cij2DTdux z%54J;!|%vO(a!}-Z=if~K4i;ES&`1 z{QWn!RD^IEUPc|E9p)QR%fpXAIXAS~WoS%Gz7@YXtAb}${9`fkXXmh-u!p$taffl< z{v+^b_CH}+pUPK@?Z?!|*2e!V@KApl(%CNVi1{|KT1DBrwtk+Up3aU;r8V)RdS;Z z62i#iFZcZQ3islEeZ8I?ag?O-KW-~*E?ae52mSY>dB>l;zyALQO!tX#;ty{h`d@*u1 ze|C7ZG+rMoPf#2j9aRol26Dt2jxp>F#ze0UvWL5c1bJI!%;W%ocuI! zg0kh_P@@UU2B9p+qqT~`-_mTgkp6_arr!%6WLDa<(Jx@Xtv8SmS{pA&SCmO*gEK!RtB(v8Z}L?XssSbZ4U!(9|cd1mNGsS#KX zQbB#9*j>+L1b*x&`;) zH`SnJ6)k4`g-Pr*RMFdmVcMohA)=lu1zSPjQM01XaF3{WYM#Kh}$L zetc2rHMY{|rYxo#qiu3_8uqy3zW?%G-~nbl9Kk-ZG{Z<@9X3;X#04FEc)L`Ux}7@BINH!%;Mx zqCTV|+_9J`e8=Fvn0@gdl<5p3PLv1ZSahY1FBY`T^wgTt0-|2k{bT0JN zH`qTZIwE9d$7iP_jl>1mf0`@l zJ;C+zUS^?DKJbxf$Qsy5_>4%`dD}~2iPR8e#x_7MsF$c))DNtZD~Vbiy3aMIV#0oN zw7s=7M5`kFW=ygM9|zu$pQH2jd%@$jZ{mR5dif^Xk3DX0EPf+NatZns_@ae`D4OYvys5z!@UjBQO;w*V`^og ztG>hc3v|+xJZacMq;v2X^%rwFqqrZ54^l&n9(+l@oW6(|M3|AqWE%tIU(-H0r=y>U zMu}sww}BGW0M}S!7wbm`<}WqVxpvxT@=g4}&|t;qI83@DQ{se#W9k_yj*pjlc;NGZ?T}(Kcq$vc6`r2N~JmT^Cza;`AK@mKqcX!Wr336TKuVR1OL#zSXLqv zqtYeHv!7qj-!kXHqWBi1L-cajFB4OFxFBu6O?-(u54!8GV{X&GHIaKo?D;W3 z@5LoZcw|1))X4DHqT>|7PZ3?2COU!R)WFDHd#!j5Z;pJm_g1rW&lpGXv3f1(kwR3yIJ&x{R zmX}e-Km3$%FXl_3b9%QhK)l`^@;v7R(y|Q1IwM!px7o@>!;l*rllWMB9xjHzGgfF_ z@IG1d(_@Ki@U`BOosclsoPqu3PqDMPp8W2JknNL4VHeF*@rb*=3I{sod;FrP-e5(n>Mo7@ zX_Kgu72~VJkBgj&l(i*r2hppRozCSeF1AicbrdO7Kj}p1jJn*N6q?{^YWx#=ES*TG z>W+jKGPBqX(geC(p(9jbeGalFFFH3CU1(H5rzaeyD|pJw6S%gRN}ef@7IRAs@ynzR z*&Edh>NCIPi6Ag!U#7qNkh&xUTxs_4+GmRsdVO6f%GNdbJbMlPLn*8lj$X^uhg(zn zCKV2~wCBX%REA)?$swLnp_8o5H&wcqDB*jxchUW$7ieTWNXQQDlPBq8GH&G#WLfP{ zFw-pUz340B6r$%lHx^z{uoEAr5^^C=W&c)!r;F&{&^c(wyr=3zypS>ne-kwyuOlsX zl!nVf?U*LqEN_C56`i85#3x4|Lk^nhv3~{M`!^*OrPF-dscGaHFUNIe#^ev6PdEyz zbMW4A338SemAsuQB5{}}fMhITlKI-6T&)_FDQ!~@aC;4xUYUOlYGZb86tl}1NN?fJ zqPp@5jWt_i?`;pz`Po16I)?fMw>e?*FLa?aF1Eb8r#4$WfM|YFk8otiLsH+k=H_T>7=~g(C>Ln~onp_ZWIR)OLtf@yg30JWycVb;o%9#aXpmPas%v6H*b*;Jz6w`E z^HPRV4}<-&WBw}NpW^qpM16Pc8kWl|hs`ZknE8vonMnGZ<<2Lr5LLjLq%-2uoJm+^ z>|$OfQaI_ArSU1?^hj|*CuLKjGcVD#=%U&H@jacG8?FDDuv47Rm1kcmoZe4p#*_%} zR=Qi-g&Dr`k;PyyTRJX?z4j(k1yfq%OVJZt(C`1TifE>v$l7oJz;w{<_HG>M-&U|r z#ZvqME<_j4?&jYUH%nROX~i~EM7gg!jjIyumKaIs9-{SL$Zc;;sTrgCm-=tBW+Yjg z5PK}?7=6Xk^E?Y&#g9ZUBM$3n$kyO^<%jJ<{8FTJ<1LYP0q?10aBk}%nl zu2N$c$86Aw#l^eVg&S*bVyAZ|b-4JweD=pgZ5S9}qzFAUK2%G<**l&Bu<9QzsGXrD zp~tzSj0uTTou9*P(3W&f5O9_))Q(a#fovB(nX_N5L>4!ai5$FW=BRKmCdrnFJm3eZ zIi3S-tGI{qMe442B+wXpz%35j&5}uWm@0QqyzN?{tYs1UOU@JeU-6$T)A$(u-c%zG zVs-xE$&KBbN%r)`3%rPmYG#P9>ilZoH)Qgp0ACl}~U!JsA1LRHb%k zEu>tKj?Y9lfM8(wkAm{8#J|{8U^zcRJ1NB`Z*~cuXV@TfO?EM3cJw54AXBXHrpP`+ zE!cor;{D7j!OYyV_%?ME(yrjrf@?gy{2RR(V7b!;dJ$*B57jBzcYN34zDMms{$rNW zBk}_9Y;-qf5|+vqf;+Kh?p^eJqL1?@(KtWdGf&sp>7ZSh$#0|gNVq{ih)gh8*ePdO z{(tu6;&Z^@1HB`p--VT=LPmt^OFN`_s68eRd?q%DkAAQ4UbRh$>uGV;n4GhpTI0~& zO}k0lCk|#nZKlmlHeoNsK0_AdmZ5Hd=30t#i#=W%uH5HlInKE*3Jro;(i8e4RyF(| zevLf~mZSHL`^sI^M*R~$owXEB6FX=%I8S0v`nZ%#57XaAG=3{G*8hsT9m7a#sk_mW zh-kV8UsWCuiE*b(d$Uhco6vWm>Qo4w_+dhmi9*uGd^-r5NhxFCXqJ&A2?tJl9}8Sip3_0 zr-fR^9CSRDfhC$UscMX}4gHR-w7mBYGj2H9}vh(LN#jsm}Ht10@))+?Z7s^W0 zVUlB%@k=f1-b#nP$;?N5XJj??nkf^qVTxm6q>Z_o8>v(am0|t@I|AdG%S5BdaO^1F z#D4%x6mpEO2F6asN+3gpzu`pihhri&!2CtFVp+@6{IGs4@Jd;Nt}`|u3xu}BZFMk= zp>Xep;C1Sed_Hso_5>9TA14{zf~$qs0v8goeEW{zDzl#ByOD;v9re)x5d1Js#Lhw6Vpj4bWWfiFPmi*8bD<1%rs77FOS|b%e6!TUWiP@n9vk7*gT- znkl})+8cR9Nx8YVGF_9Krscyb&=%hB8$oQ;9|c>G_n2!YLa5}7@L`zmsIMmJ*Wwn^ zTfH7Jp53b~<2%^QkXuxvM~3ax99C@T2bmXB}JDmkt>4l6<4!*>l_#OB&=YxmSbwmH6+nbTo; z{c+$iod(MLa~TJac?3$BpEy6`6|5^{V9ZxYgNhOG{_~b~E*@G&FEDclGc(kqT0ZW)vvlah9%nLAjJ=aj!Oljv*!DFeI zc$BUr-DkGOe^S4p<(M{}DxL-KkkrG6TRLFXTyI|rR8Iy{!Zz9ZXKp*&MqVk?TmV7_72~qBbS{f-7%YtrbETUKKF-;}oE&*=Z%XH?_ncFi&dLk|!Do33;_unxQi3*_ zn{2l9-iPlg2O`7L{3m&A1kl~|^2j{*Q@(7VvC!K^DQ+S|Y@pVR%n|O$FGK%DudyLY z7xE)_AqPRP(F6Qvr9{^0I~j_O$}^Tr1Nkbf5$Nxj8Pi8QPL;CH)!!?aI~F~zc5xSB zr>JA7(#-5o4XQWCL&U+X9pP}cLSD(x8X-n$4uCzN4e$(h478C- zX(wS*mGZcgn;d#VAB_4BQT233HL9w*T>$&2EC<47>hUV(2CcGwn*oL+~XD%SO$id1y>(>3+3_!s=*E6JPG zHqScZI~gC?Z|vlHc-w}fV`9n8$Te{~RW8zp?<-`>CD+IKDtGpN6oa&^$X!T&T8uY;D2Nax+pNuc0s7^8$@#UUTVHE+CE;Njx>sU zhlliXB4oP;{-N4i+Jbx-Ywv+1tCRV^!i0}-7iS)N7ZCHKzx(o(g4Fg%M9mha$`_=q z&Y~bHTt(R6_~kuD6^_}a4?uX=dOXh<=w6|h@U7-zU?0y`G~0eNJcqo|4f_cL4;NypGP8^+bX6f3?t}lwj|(@`lcEow>usQ;veYpPcJz)H6YLu)o!c`_kP3{z-lnsxS3lU@g){Z02=_ zk?5+(3#EmKu*>!8&MYxQUP0|}Gy=bo_4dNBI$Dcej@VR@*oNkX%Ww+0JQUIUIC{%V zeOtLiE<=qE&CCcRO>REh&y3{Ea6TKSBIrz$B`9{ z9*%CbtodyHkwW3y^e&=o&<=j^Cw%KbGnb&glge`=%t-hY*G2niapi1V59yvc&e0dS zLl$)c{EK#9Tu1{Dt?G-w8hEN$@?%kgEf`jY`fsp(;V0 zeWBJ@KGTOSf6}4C5yv>0$2nU&FadsWuCRPq7O;!h4%&6B5}S>!CTEcI(d#gU?5z(s zep0=Vgz!IT3cn%pN&d|wS+=4p>;X2U)Z&*?`@#Gg%k@n~2Sy04rAN{36?mPEFT|m`f z=YaljJhcMpg4QG}TCo>Tnew2h_agm=qm;BuD&pEecL{YDJ^(emURX~3>)%bSh+5}e zN$p5ZhJUMrq9;?E)bh@%=Bm(pF^a_eh4{k4e||T)gFh0PtZipwA~)n|d^7cScsfh+ zm#r0X!1DS1LX{K#fcN!N{Cm=E6eoO)A4~@xA_t2F_u&F$wAq)Tzzx5TD8nWO9!hR| zPxFAbm79lc)^0dB0t;-6>O@S>&tzf~uZR0+&!Y$FnfPhveeJO-yZXb2-gcr3O!f{Z z3kuVH=heCFt#Bo5C4W6qIFjjng!GR*<4-d;%uUQ(?z?^v-@vzo>yYNm7^1or&oUn? zfsVl!VC(dg$V7UAQbl@4Y^C_1f{qg38d=&u!cWvx-`O4NMlIKM8-L_$72QAfdE^he zztCA9N>%4Rg^rtD9Tmerv{bQ&;Sc)lW9WyzThvu_SMX1KDHZk}RjxXg=sV5w!dfzj z)D@>QPxKx{EA}{#vZ`)NXXE! zdBhGWs8(gtU=1hW{{4%H*(aH}*PY0af5bLr>y^HOsxHM$fM z9hx5hmN^;OZ*lw2dM-1L`6|ug9@`#-KAVq)i(3E4E@ySk>;H>cZSIQHq%fkgcRF3u z-BB-sY_@l$5x9ZB24`ZYNQ^lNTzGwa5jlZbg8YlMqWdG)%`E&StZGitICDHP4y`Kn z#YWl+%Y(4%!f3M&`bN-^i`snW3B6J{;E1-rQ=8!dVJEhWYKHeflgYL4r#i^WZI(NO zH^OFfveJ}Zgrurpn7;Za|61ahNGt0M#;)MA@V#7JvMDy3tYdj2x5M9|i}6unX)DHR z7uOf8QxT>u*sZQN0^lzC5As>Vh@rG!--~=@y6C-;eL_iXHHJ9Lq9x=KF|(Z&)a{l} z#746&6~&g-ILiw3OKyfe;c9E^v=a7W+V)U!hA_NJd!_|!=hfJ{?*8g#gm!Xt4|EtW z5R1`EL>Ica6`%S8dhxziG{;kH5a~v*o8$1wpqbf8AB}7#Mj3ji-cQQQ{YXZdqxN{wY#R1Kr0R5Sjmqp;Le1YAS43_XY|C3Qo- zi3`Fnj09UNqqVfxev4io_?zTVU#N)Xt-L)yq*RLjsFl)mF_mp-*aVE*t8*mHree?0 z4s;N^P0S-Ru!GoYFbrLQ^n(AP2jpGa5;kbf=`>=jZFXRZJlA2_a*-wW`o=Svj7}wE zypy9Qi6fIO|Qu(I6sdOjcwS7WUgKP2j;CRr|8Zrm-HiFi! zdxj=&cMgOd^awwaM6_yF^u#T5B%Vu&SPSw1aS!Q>{=y3x_q3wKZ|qfoQv=*Wt!c27 zP?Ikgnv3saYRIRt*WwZXVYyRG;fN|pQ3FLTc*~jQ=oi+xV>BIlfE~2;_C|tDoGT(3 z(g~p|eBf8;+OVJh8*9g&=e$8mMV$`K#B44OzBk==f(pr1*m9&p?}-Pg-NrUhm|ka; zLhln>%%^HiY9PMCUlv)!bu!}oZ#aQO!ke+D-1=}ibCP&2GzZjizEcN<7snTbGlRcu zooGo4(5u*qflF*j`vd<|ql)dkvN#-ebXRWscF=zswZidqE^L~c#zsZ8lU5^JUC(je z=x)D@HIPryCbdwjN~h7X*`J(5+%$%v9|)j5P{&ad&8LBtNGyFaebifdH2Xt{wPeW?&Qq{qnT3BQ07t#$#tPGLI-=};B`C_y&OJM&$^l$bL3z47-YRP zgI`Tu&Tq<{v#s)t#Ab-g>&u| zD%7%ZVI`3y-a+(Jo>DczO{p&0lKmZg?Kj!Upj=?Ap>eC!#>ioIgBjM>3EP!=p?wag z#pU|aWV9#pFa6b>uC@e|9V3iV(qUJsbI#1(og5 z|KU9c<~%ocJI&{6evBy!ue-l8x+r>wf4h4^q=sIxr`=s*ikP?kQ~9l!Of^}wh^`AH{IYAhzA2t}oYzN9Uqp#BJ(y&hX1^YI+-l&t z>F-?im+dz$@piOEI6lT&q(5zquo~)f$0hru;QPio_ssAKvrX*)KP&e}K4O14+$O5M zr9f-;eF11a$wEV z_Or%1|8v|i>T;li>JZz@KH18Mp6a|+(?7D9)BFL)Q!aZ|58D~fEbl`3T;#ZLw)c7W z%D|ecboV;(UWLUAqr(0Y`@C9v1lEX0ZlMv@vynS#MEG&%9OFBB*!hNSZ%w8BBS$EZ zD8F-e6`xivcI0ENr_0QCK4K>D)2`X#UGu0rpk4lB?uo9h!Dy~m+fUQPD^Z{E9(lvF zO&tjIi}ZTBdp{<>y;i6cJvJ{e#y`l`GJLt_9ouA{S^b^uPuCWip&xR#QQ6KRuAJ~0 z`@)EZvIqa|uo*YiZb!cLX84Aql2!(*>3R2Q->yJQXsk)FVPx7i_#++V&bi)oVyOMK;862< z_aOhS>K)D|jvvL#_ObQ?ZXW5!+TBTxneN7BISqAdB#xdE#-Hgh)EUGIVG|Sx2 zI>&~tIMUrcS^b z70xc6L%!XPw_-EZ!+bLOZ*?lPqSigDS@kB*I{fQ3Oq__wss5M0jF=wmQghl_>U}D( zG-7MuqBq_(!SQNvcjRTymSDe#-4XR`M#;ijr$a_)YQ&Rjk4Sf|(p_r)bv@zO;q9tt zxtayjyth3k#4_(MyjFJ!k5e5Shk~V8_1+QoNjUZc^Vt1@sE;CF3=FkhjJe>=cU+5$ z3f2j}9v9X2qJK@;mob?hZ$JTG8q1`nK=v_d|7zQsdW9 zPyW>TtFKv5#=dRt^Su|0xy10sf0pQcQu<#|< z>BX`BH==vFJKwF0@WigG2w1}+ulUFM(_)f+kNE026U?g0f`|xP-|`8LJ`rWUT%9%Xiy7!n4q~*wr;sg$5Yi+_|BqX4|L;|JnQ1kpp?ttyD`zpQ-f0=ic3X zDzqtjLtuC1f?7{f--_PO$7)sHUhI7G(FNAuR*Q#{xg>D@q0V7{MKJPX+o-!OC|Fc^2Lht&jqq6LyZ)e10KXl}7 zn43P@)88TBu3K(4Fe7Wn>W}Zo#8i1!-yLRjcMPt2#@ZbH-u-2jpLn8zK7WC;t{h*n zGomzVzITKzC;FU-qE})USlPb%?hMz(U@7Ie#)*gYYqsXr8X0m72qpxUcovxIUN`lE z`@8#hME!^{HO;Ki(S9q>`&8}0;nF)5Q4?K@?yTqS4+jEy#%Hy)`4_d0NwyjXW@Daf za6iMnN=~~!KDxlO?M|}M-u`su@7DE*!*`?ZSHz^qF}}L)T@l&Av!3QLeauZ}lgL8* z=iw9feX18lVZHG-GpMf`Kl`VvF`gF!zgK5PG`Ib7e~&(4jH#ZZmPGBk*U{Fl&TxNY z|NV!nZG-L{iQ9|!UUhW$fUEiJ(R-O~?TA>ut#4`o!EaL66_)9))AI!(XL+pz<6nK?l-D#D1 z_uq-obmv}{tZ^lJuiIP1eBoUp5^MLhf>oy;N;aLcnh<3iWh!Gj+x;d8~LCw&w8p{E$=1C$+dIuX{`4h8*uxs$K(cItLW+|kpJ;s zH{LPU++A(Uh{+AVZB<8nZj`F>$Z~N5P;8DdQs$~&MmzDcZJqrebEB-V`6wIOJ_>J= zZ?EYX-6XKt+tmKI(Zc_;dz?F~s*$t8xyYN0_kEtNO!nTb`>!5S)7O)0^H?Kdju?F_ zpNnp6>s&F07JGtsE(iV-`-*R$|G4W#k?tE7F(J6|ZjmF^^NoMCY#p&nws35Ys4H8E z?#?s=a;ZwGLjG$jRiByz=}(*AI%N&8HC8=+FY-(7T(hyij$@iFHF()*q{n-ik9&@I z*YoA*cfz)ssc~5mUj?@~S37Oo%+=p$ZN}QyI-d+IR&5>Ke2e8d=P$vBeff^%zF2QR zXP@9BRoiSO?k|JA9gRG{@exl;&*P%pDDkx9B;y^&72)Ff_GzK>%uV*SR^#gS#w6#W zsxCF-qGyCeASSZHo$6iZTo{=bWP1~5mM^|$di1(bnJ>8c^lTk6SBg*-1R z#Azeh`V`tP8tVuq%WAz__7Mf#+n!)t0W(ybnqwbrE9PR+z$iCXklUQBkIPqsdwH_` zl&^1and6-Kb-2E6E;iLv+jiNnTJMWkwb8N2mS~OTC+rvHUdne&3q2Q_60uv23BF}N z?*7dmXDf{o;ZDIadzNZrwi1m(HhI{#A$TD?(6&>IsPP)_=}>qU-WSiM7)KZ9DQlkN zdQ>`}GLt-49M^+gRlX4p<%TA!f!3!rY1T>eLeOPRQU1UzbG>aP-?pB0O?D(%8{G-c zSg}}-arF=Hmmj;o4a^U>h%BaiRcoAi;>W7noM}(=hC|D3*Fu-{9!F|ujb0Z~L<`LI z?kDKc@K}2}?+cf*gYSngIWlYy`7Pe<`pDW7I_2mo9uBX@im>kCSocwUuoZ(|TSeGvF6~3+!!aV9u#$`w4tZ z!)&F_Own2t8UN_Z;ZpFz^)suaT`w^&i1EhT$ambnK#mBXw2w5JnG+4Sa+uwW){e=c z7S>1hmDW=0rp^%iLQ9S1>ccSEGWE;h7RuokX8+JE$3ZnRJi&MhIrnl0+XI%YX=)s8 zu@a@5x`~Biv;2eysC;T9&)I}6Mb5@QFDLkv<)^bmVmT$KaaJ!iPiL9kDZ{p2_-lIG zF3K)p0=rZoeA{rs_k2y9vn}Q$=6U$L-wOYV+O0H4(*zx9_U1(UVVNBs{Gdmz->8Cb zi^q7P@v2OgOCp_UD(uw2dPrC*B*vJ}>Phw;;e%q6t(8i|Juj+dV1$~Z?J}D- zYqyvqVvJbPKU|L|aCZ1AO;GpD94<4K$@A7gV=k47Uh0AzY7Nr)>TPqInya^)1!BJA zF>7+rt6Jzbuu5}vm6-<5QXDO}niw;*P3)m!SU3Y^H|i|M(iBR!611=#w>FpuaL?Z6 zX}OR`2}OUYrm{VE(VtRt`a^Z6o92f+n?A9EB8?V`qm-?Z#XoYS8b+xyOhNIzIIG@~ z3DzDp0Bh-b%KNst;_q-H;}>-yJV%b_PsCTUK>5UXB3_N;(XvV&mK9*cst{%3bM>&? zW+v#R#&E@kNH@?m*EPv5BcDGBuM%E0)G9@d`^k2~p{se5l|;R1 zvluChWQoY8N=gxH)Bqz>BwELe&-H)8<1n)Sl@T~R`xjaq$Xdd7ZD%ol&w;CBT&HRU6MUT8`W%DSOVkVvA zBH3T&aXFo}l(<7tG|DUyZPjF1WKPh(s`KID*3U*EJrnLO_Nyh}e5|I{lrE?7Q1HoR z$S-83d=JuHCFh7k<}MC#zU3BI;cx!MTtkoXweUXcq&jY`F@5@+dcizKHe-&AGHyv4J` zc2PtbvIlM8Vi`x5=tG$E;1kY+exu`MQXP?EerCA16wQJ2!Iw8%Uoep5a<1}mkC)I945 z-uGyX8WhPwsy%Vgx0C7c)eS#BA{3RBD zh9I9!WgRZE;?X0!q3!;pF}4@vZnM2{OzjKDV?>UynuybQUO$Rajc6uPr_c?#UMlgn zY>J$aHT9X?C3dMIzJM0U<0oWvQlT6UI6R7xvEn$=QE-er!bwziH!SzGi9tXs^K8`TeDww%dXG>6V|3*Jnp zX*9jUkCI!=T?*S znP5eXmkVSY{TMf*Sv-TA(KUISmT|P`EQjf?YLWGesxa=#7)mnQs!^gVw^v80E$yfO z@)`xcB$}rVb3@8kZYr@3bEG<3&g?~~$Coh;tmy2cO1(sVT)~myMGTowbmBa;L zl3d0eRR?IvkUE3;vn>rYY-pR#7)@yF@9%>n~w zCvak(-~zq`Ia)w&T|sN*W>u`;!^)jPZR2Uc9%&e}uWH7qzQXNvSoBvxokE|`LSY0=!?rI;e7b|(Xej2Brl;`C_!ul^a+YT&$;9f{XMGkuE11yI6<|DxK3s zEZ0%ntQBH|dY#%~21?)}5=zpGvau?sWHFbPD4*35Ob8|PqPPy!drQ2-aU3NcrC-$% z>zY-n3@Q^(ga7bhaRd^xUYwy$^evFe7izB6gDZ8J$d?}*JLo<0i2jqhnn&q?T5Ucm zml-kQqR7*`sGfB}-QZ4UE!a>)0ku?nnrA%z6#;RIe6-o~gm1ZwB z9@=&=jnZFQRkE(GgvJ@G+TuBPc_RFHKgk}LNmh|dcYVxzZ-{cz@Z+4liVr4ljjQLc@`klW~eZ>$usH){r(Lsg4Kj)|8 z@*X56ou3z_+)4G7?@^gr3?Af=S})szad8e`v&O16db9vC)zJjZsghBe)4Yau3&C5s zw~SFK>VW77%yH4WC7SDw@&}|U;WW__jJ6Xbfn)Y1X!dWEUkI#u7|*%lJZ)3`k zZp$XLoeRL6d32B?oXTorpJK#;YOJjZ&4H z-SR3Q;c{6)>(q2GI7g`#!2k7m0c8=Z{&Yf41W#|3{E+vkO)`ZmR19UxYUp~en4re1 zGPGg5egXfJS{6nps+wvVVXa874}EqXlVVkVeEQ@K0PQyF-l{{ffpO|C=p!KS%P4nTYT zN&PTmCjn9KC%5{C$}zhXBUd_jth-T1{+O_Kk(;wueg$3jF6O|$Ifq)y^+4y~Hbs5Y zU^%r0Gw?n6C(Wa`t8qB(Mi+$S5;5Au*40POrGESnMOEg6fa^`%x|3wP7Q!23ffPmYGwF_=!tpTUJ!C9A*u;G8Iw zvy8eR|9)C7i-ZmAa)-r2d69;oJpI8Bz7Q5wE2@RwY6IT!+Ni-m*_E;>O%}^vsaUQN zyU^=NVyqki6p@1ZET$^)5gnnna-EE%ZgLp#`z+K-Q3472uS}8+z)~J59q?IX$Q;-= z=joEjkezuu(k`I}ShG3=QY;|-_b7?na+5qm+rgM#i1vO<8sJ4A3xrk+Bkmlv$DQLi zN4_bB!A_~L_Q-9#Ri=xD`~oi)4ltX4Alpf>q07~bTerxekf(VliasA7KOgQ!Ui48hwxtE&07nB~Z!A6bho9 zR?CjSO2b467}e*Ckk}9T7%9$yQ~jVwlTO|NuJ<#tLVhEUK}H0vLI3^*dEF*{!-zU4 z9C8%otBW{5al8Wf@O7|M50aC?=3XwkBjqGX&_sea%AP<(YiP7g1#WInSH&cG=K+2e z^{E0(w!Kk~6mY}rrU2FzTm>>bgO-fqe=sZmBlE~XpF$S>vJI_}D^T{|<(rV{W3oTy z{&b!M2K{dAm%~Io8o?(p-!_Gf;D&!83Zw6={FYvW?6d*inkjvv4}FHS@T`&-&v*x8 zun6sPS$+ld`n_CEN98TChJK<-F;te)P--Ka(oD*gdBDtVsXshNYhOwVup94cjnU! zIZej%Y&lAdCLl*x&=(;s(Xu|qMo)~z=`@43zs}G)y}h%6~v!_V5V)O8hIA ztMBELGKYuoH-fk?u*d{?4ov+=Ft$hXE0E)nu!56d@%7?ocp&bS!x8*In;d2ry$06x zHW*b4xxR{oHlL%Cd91tud$%>B3^-IICsQ}*6Y_wP1>z8Ree1R%>A1X6<|MF zZ#rMTDFzR^sSW2ZjC4z*JM0IRk_MIm1) zA`?`r_IfO=_{F*mkjm8`>2@kbzo!?f z7+o86OwgUc=IPcYI#DTDLPdz((9if*&F8PR+nCP7z<4@HwNy_Sxv)l$>mDlnL-$q1(Hxc{b5A~_Oir51IeE=;oNms*u%u!z(VC&`q#$r7XJo_`?F*>eh8s}9N zw==FOKWFORx|4cL&)0G2gR{DYs-xqKT-8XuYb->q{d%eH!)MiWBab(NYqU^p;UUHW z_&c)o7WC3oRjpe?QocuR=BXd`b(MfNSgi6nAN@9%XQ>v(*T9}VaJSLi$=Iu7xtrds zw{rvasPQ0XL7`ry3VE5f>t*mdpHP$ejGCmob8U57uVc5mq?fDud{EEU6?9e2*B@Xc zg!CH3K6oFpQ;)Z(b{cb&8lhKlG}_XR{%fgs^IEp+Wbnkc)DP)mdKHYQX`I8O^>h3! zHPcb*7!clRwE<(GC8Q(+eqyCc=|{C0Yk8(YM$ZBZ6{-><^l&Fw{H3Y`7t(6j+Z)M_ zm>BQ^@h>VwPx216nzzy0scX%4korAAw8gx}5j{_=EDxWS=Ibt(R zMhS|bBW8d*bSV8nckz__R0=OxCVUhh@D!TFJ%AMIb1qQpLE6tNfQoiuybhx+ycquN zmpBv5-lw3AWIf3sFk4DId`%CK2w-Ti|2) z7TX#0HJ&+*2E!xOmr{5iVo;pIIf*+gL;a`I7=E5-(HxXxF(vSaeExssI72I-$y=b* zgU~Yzpd-KHAD|l#ASTLpRKT@?nMXjI?n5k#om>gu`zn4Eu`D)lB-&;*bnpp!1~$%V zdXeG#fPVW1Q7bBOeF)!1tK?$8AtGZm;%=M|oz(zdi!6SGKZe~@pGWaZJUaz`gueVD z@8;>8$eVcqwjUtRbEtm-Pvp_O9c6nNXEyQ}lx02Yn2E?8)A?QAg)5mjzZ&Uw;tmM)a1oh}f|KcmFTqxO|0PJ&NZRAYDE%{t4cS z{gXJ_4a?&&&KzY}LD(zArvRRhLpUlzkN?C!V7s4-ar7>rfiS2_}HM`J`d(c+x-7s{Q_5Wc`3G^@)GpmN7!G)^Y|0A@FE;7z+Mje zEDL+t*n1Cq+3=;!LZp=0JQLqp7)8_2Z?n)(@Lcj#oSlaA0Q3J%KhTK(MGWc*gwP%M{uv;tkMQjQB-0LYgmNhd z5m4U6)n>5PUIa$%k4Qs3koF0rev$@0unDLM&iBE$EmHKPmOyF^|98LE$TNVt0JWsx z%yYO~Tj0K~$OGnMVEhE!MNn8aCMVUym6lW+sMQGs8j^0Ri=*!Fw^afQ)~8m8#Zo07 f1FEP;Ensc7hHbF|B~h@Q{@>!LLUg32}dSS6*>tSecobVP!~~q)i*nM`mB&`{O?6 zk!;J7EK5hys{`$tHfq#n7yzB?c4|0i*zA<)*@itBPf0_vXmnPZI{~J#NqrsH_r)gjsm~Is@2lv2ZkOaPh4|bdaet>k43o<~C{ZkNHfP)C~FxVy$hQL@D2Mfbuumr3O ztHLU;t4HCqV0Ygwe6ojHtF%*wtQ3+HIRYWyWWmEyx zNA2v;0JTJIP**g}roN~r>V&$W9%wq6godDzHjPJ<(NwemEl11H3bYZeL)*|UvC{B~?1 zf;o(F2+oHia5xULDFP?pLO2RX+NsgF0FJ|D?B|-e6|QAdSzHpA!&Px*JFaVoQusGq z+NQ$)mtGW?u%AoVsTFZ;T*uB;&(75d*SE`8#5L@+TJ}?A`>v5q4RCeb`2X^?!<}&_ z+}uvDhnwPtxC@?&o7ivL*rglVUv7X~;O=%x7yDY!uA`gXvhujKoxcGdgxlhlcK#7| z4GrxwE$n=4aXS1`jeVv2{+coyIYiezOBN|t;?~2+zR^IL{m)$!Bu-i@z#gcvR zzyTDEo%kpEiHhSN=p72ihCLqC{?lZ;|BK-p=rF2+&!fNW9M91Qq}k&-6)}7ntw%oe z8XdAnlj2+UDF0*U+-Q&SeAL^{{SMtnbMDJTw3uKwD68w8qXk-sXp; z=nGtG*KrTV+hblAWy14zuKZ}0&4It6{dP?l$tVS-!9P(9Zic47!!}Qzg!|A%yJT&f zw>qF&C;?SPgKbW&WAmF2&VUQ;uWy9WXcO9uZlVWv`Kxw5)Ba`&7>0(@nc$vf&{mK$ ze!vVO8#}E(@fOqr{%`*bAzyF}Gah~cwee$nX7)ho z@FHqVW|Q0SE%uNXXb3)v#)DrlmVJVCjJYraGvmD_F$AiCJG4BFhTZ5jvJ!V;SHURI zpH6_c!9W7gC95W#f#*XV)-|_4lUgvuT#qB^CbXU$!$;sY%y1Iif=Jw8!=+*@%{Y_!{+%`Wl**Fq9ac_^MFRjTE$>p z{+i8iyP1b9#LtDbWS?1;T|uL*66lR3ng@xO6;RWGpJwZ&j1l}Q&|W{pGT2@aN>7mh zD#*7&mi~i{gU|FN{2LLinb=SE!%6t1@kH&z?La@3hvq=G3ao`3*$dXuATrHtNR#mx zqd6SMy(P`@zo2YfF~e~(t%K%+STd77Mnmy&WY~LHe>2ha z;b$P(c!GM86~=d~05`>)Y;vp(daO*~T+&7Rk86l0tc~bz=@IIU`>?qH;zm@{$C_iL zp4zU!X?{6M_x)#MFavZnNInzNUT-17K)r5&K7pY*7c?nIxXKfyQ!4D*EP?0MuOw;-rqPP)!P&m9u z>TE@t*V$E8THlSzb2qIA##OF0nq&shdw3iDM_+;%V+W{=Zh&BO4%m+RlRIb|`JKg+ znz$i-V9%q&@F&~F3WKt2Dkq|PuoP`?Jv9Bej@i$wM3-Y1?2pHQnwEre(G(C4-os-k z3N^sBX+czh7U82vgne(4zU(2IsYT)YgPGJ5n01v2%nGEB^@~*{1*=73X*N+6P(5EHeOq;SSns@j={5VD)gXEMrY#; zsRZX6ozQ%`4y~quUAFg%iSPwUqE4_2U10gpTdTO^0IDJXVDF_pzKP0rM|Z2A-h%%~ zHmj|&)a@qV@(1?y;3QXcd zVJl;(;NkkIFZppo$v`k{BfL?!2I8cedY8ajp$Vy`ej(Guf%0Fltm6#c4puWiYDvpE z5@0zqn_En`n+MQ7?l)_rxrYp*=gcoi#1xbvEx}afJN%nJA!|St{Pyavvoq)}T*20w zY35OWGA?3OXLI>`Rvl7-??`ydHD;6uq0u}a2K+Jj?iOKSjM%^dAp zAxwZP0s>i1ml#2KIsZWG25$)k@B^z7zl`PD`|UkGl|3?lS!;y(1X^c6NwNXF0Jq@) z_zMiOaZ(Gj1+0V%SzF9x97LL+f;P74j>qB%xRL( zKS6}ph;~HhNUoVfmhy{r2U)>)(H9wCxKzEmG7I+y)h&UJ1@Fum{AM;wdx;8(PO`;p zNdDkUvX?NDw&n_BH`qpkSzj{C+Gj=6Pb9=#1j^xp2%+WX6!5^_1xITd9KhzHGBBP# z$A!>DP#ssdVdQIT5rbSae1+DcX~u9?NA${H$Q0)ReWW%)s!g1-!77je+EDP&>}ic) z_uwA+EwO}j>k>$#C(uh$j_!wT`2t*$;l{tjUCeEcrqhL?q@E@qHy;fS>(9tpFv|Ll z$68m->U1qEsx}d72$$3X_&PfYy20CgGWv?9@-xU1WOBD@8PJ7v6UL$^x+J|vE992o zU)Dq$t=1$x&A-gv3;k z9%JyeJ_`zD13ZIg8ABqEeG!$U9)K}}KLPsV)nY9;Sv%sG1^Wa<@`COR{HagjAM4S^TinCE3|k6qweE@_ zjOL~q74bIi0Nf<}%{MbQvjY4fD?gYldO@gOm@cu`5W#9?BcVDZhkVuN>2-x)Y?DgB zPj(W8f-Brs_}UERmcdJQ4?dGIEoio!SQ@Y z?HbxI%+^A+Rph2sN-u>%&@H757U?v-G=9Ohn0>Xb!ef>I8o-eR2-o@N<}vs|C_-=P zXNby@!AM|ZEgK~vs2GpY3^p57QR2TrQ55HR_?; zLInF8zK8RHgK2EGJOyKyW;x_|@gY}1UV{Fy*WB^?6RWHBoH_}WcbTc&BD~q$ZJ$sc zqLVi2Jco*tIOv2`SvoBNgV8Hi2d~piR2MJM3xZ6_sXG+R^@W@^7Bm5)%z4~!60G+j zEyxvp8w?fdf&;K3KaqN2d;85a^RSJLzZgS7MX`$+XQKcgo~ceZrjf$>NoyP}YAypZ zzYi=@uJ8wWw>^^mXf1Y1ScxJfIv~dg7;8Uyt=3{um%z>e}tPa3QZaMm0HeqT0 z9c->$GBv8x$JQiB$Yr$JI%saE4{0CsZ!3c5xgJnQ!PW)xyAYvE#zE&cHremNDYU+} zz%0S0YeV%I^oOCK6jo51s7w@m?3C`dIpBzmulLhjbEl2jKU%}_Z01H6VPAF*8R|#8 zlXOuvvvrlEEm|vPbLDGE$pSa+8B0{ zF4xjwl6XY5luPu6)l%IGcA!+nfx5xX+A1`i{-qw&kJ+pE2&mKJ_y<|R9fPC6RW2Jm z)LW1gw!yps#*migY?zKqS$C{&+y>My5KofX9phhZzl{K~M zz%?e<)Ir!1{!x-ur*ji7tPN%N#2@B$PRB2d3#sx44naCf-();m;^h0x)A4N}x3yuqegpUkd8V|-Dsg!7{aBZ_>-Vdflq zk$5!;d=^!sz52@D@dnzsHW)VsN!)6NwCk*Z_|g2+8YDG_h0VhDDzpK_H~?&|L`XZOY*LVM5$eB@NNkhF$%tnTO|9f6;r4QwKt zOPlgz$S-pkK1Ii>Q}t)`rBX<($$pXJ{zoj&nT->)Xja&L5XNRqGRx8sT+z((bdxe8 zFOX5FoBN&cRs2i(lou*zhn@D<{xuag!(Tm^JIyxvA99x*N!k(pWLP`vbM_Cs*HKr! zZ6m8iY@wr(9HG33igvhj8W=;vEs*6|X%xZzY~)r=u4_&Lvp_0X2YazZ)}EHYM5{o~ zxrUmJGKWbG!pj;ieWtS??{YqgnCc_ivG8c2Ncw1^b3Nr-ViB?@bE|bME<2E!dXioX zUT8k^t2w~+IRAP5)z7;Tf8{@HZOhIh)ue%JdfwI4M(&t=t+Nv4(uF*c0d1`Na>$T$ zHN)%flGFERmW?C4KW;~67iy<`g^p5vA`YgPGXD1)bd)YoU%YRh?rxe*h49Fao_>kFP^nZ3Aed2iY+icX!XU5 za)(^XeL~0OgW$4rRY(#41<&T_+K!I7hhYh}R}&6V0Q!DJ7~Y_i~hwr z7+yYS(YK54W$tbt+y2Uop6fo5J0quFK4<>;H~)OAU0|J_qE;Xi)ARGi3SP0s8-=4f zlAf+^`O9SN;L64Pku^FGaUgSq)i-K->Z445zVXq|lTMjCOQuSTzU_~kT5yyS!m0zo zDCR2QJ7ATJ4#MkGi${%$sg_w&9T7Rr^8OqX^cv6k(Z};B#G%rh9Axiv{1^FkuIb8i z-}GGd=F-a2QM^d&uU#&{$2HMN#*e5(;kn0cR(77&2KxRHUXjV!H{t#0@~}h}GP*{5 zq1V5a$m?9FoE4i|A4V5g&HczZ3>SuGah)=*dh4?^Vad<3`mlWELK6b>U5yJJaYTQA z7h15``5zn8ZWrUZX8%o%+!A7BzT+bDosv%xr>kf7Ju=5(sq?K(q&Ivkmto`iNe1Qb z(%t%h!SU?8Hk<$H+Xq(!^-KNDFv7YauRp)KU%zPYT;GiZ_ytGv^>ocsh@?1!a;Ig~ z2%X{T|MRkOG2xOvT@Q*%mO^v>w2J5V6pV=w9LZepptG$enmq+D~`>C_eqQn&h~f>Gieda;@Fu zgXeT^fp{k^l3u{EIb8M5)MKRzrQlvA zCkEQQ2`m1r#MSyB%Cl$?|?JlDY(o54@@*elT(0sWWT6Vq+STXstH#%fu=Dw_j zR%vkB>DHW{x>5g-BDuxm-bRSucBpbxe|j;8xhuMM>#cD@XbXJ zO6uB(%ktFJZ^1LUEnhFk4$S}N^C?$mM1rSGV417BGCyy&)K?t%y`cWC$N=?-_h0E| zM7N-)S^F|Z2bEUK{R}l5(3%=jyTA`&)%pL@-$jj#-j_95^{|nu;Va~?sKuj0S_fmP zJ5AW=GlX*P>i)snntWXL(&YQXDfY=cBL37?YyZWoQ3rm`U{U3IIpaT4N1KSOypb8X zp0Od_(Asa)tVbm)@;qkq8! z=E_>;9U|qLtH1vJt61b-Yxxg8c5=~Hp5VNMC|0n0wjRY zZ_S$;)tcA1_O7{(Esl2Jif=G-xH~3I(8eYtc}izoE$(wp@~;hD>V0WU4qE*g_#%Q) zAT05B>q6+C{FJQ1!Hr7%bl%Cn7&ae&)6Y($LPx~3lc5q`dc3;+Q!%M;WXa4OIg#%7{3(4BD=N56f5fv8 zl9}wBo-ZgnAuTaxmjA_9Vz24T@)E5+&Oe<`a7Den(4SAycam(jg#PWFhbGy7`QG0s z=mhEGPgfJ^_Tc(*`Lu|r0gm+V-<(bGfZQpLA84Y#l)Fy&;IyV_M$z$B)aNq^cVo_e zc;^2UY3r}#XMu{+cd5UA!RqTOZS_^Z!7mg#syMfC$<_uWx{nKmvqp)dg3hE)$m=N{ z^&iU$Vxm9IPK z;A{L-_-96H?gH_e9FhCXdl;19+Xp~SVu+I*&Kw>n9x4l`y$5rTL{APgJ=fF@(UAXL z&IUc)d{9NR*{|l#{lM>(eVgm{lsFfM{TFyA<5>|?u02dy<%5ShN;=qz!y zrwDv4Cg$`eot+zug+8aeo*tq*(jzs&^+5Wb@>!W(*kUI>4v9G$b30um)YZs6Ld;6t zAS^4`I51E<7urh+79P0nWu6P|nUDSIq{Kwl#JkgPxeCyc*|$(j_jB0NmZm%=@1=Ot zum9ni={fte7k^nOoL$~{L}c%6Z>%stD5_Mkc(F6eqU|F`D$l&xF*Hi;=H}S=nvV_0Zacm!ripL3i;*uD)1@ zofSGd2b1E;d0{EPMDD6Sa~-l#;##gclQQSHzXw0bXezxA-ky=@&sS`nemi}C@W_zM z)<}Lozg6R09fO&Fj2_~CrnAf_@XRcuEcd1OTk7|<7^Ad7Kq`4=CE%{^8{7sq(|rk_ z54#uH&|)F&Lb425cjF!aqsL&od%H0bM z4f>4M25$?iDr7UrZ>3AcA+)xCw_2b5!TMzHR{x?yJmWlB_6q3oq=ROjQ`&p}YwlUI zz2hp8i71@6HIC)^i{fQ867J->U}&wNyT$9E0r(sK4kNhQs4=+*qi+&aRE&;_1e+5uq)!R8$(fZ~`yuX4?L$10MRTB2Od>ZxRC z_2_so#JkIuy(SpvNl!Y~+bu9Dbh}<7@1ro690|zum{38>?`-FYSEv}~OtIQJ-Up>A zwfVcwBU*3tNAN>@Ebk`wO_-?tYhI=+{d=`8QX9RjTncErf=kd7zPdIji9*Vjkg&cob!*a|~PsC(vDb0X)Q=$X!)u za-GFwuo(;!Ry#Io4y}Xht)qnzuPn3P^8W@NWS#&!#fQK6v^?Rb|MicpFqqEyb&sDJ za#zVV(}X#&JHE^=Xsy_7*CTJD)!N;Rt83PBr8_r()#zB*8pm<2f;18}#U6L5kUZru znG@;~&RcgJ>CWl6k*%4O_2JZMl*=0eQsC2{&5fht8NIC9gqE;2>z&y`tH1dep8|)} z1AG_9Gi?eSAP$G^@j3@Uf5O*Jh2D@W!qSe~=0>X|jt57Dt|U%rOF4HH>m_O)b{yYV z3}J!0x8Be()3L{Uncd-w=l0dc38S;;%B_Wu{`_f+p=owY`y99g2Ly_$wdpzkdwE%K zS*aW1T*Q5as~mnWB#CX8BDn^(2I^t(cB4gLqkSeTWlZFrprJkubcMx~X>bx(z+YPX z=-v*K)S5z=RGQCTpa>k~YMZ4f)U{tQeJI)yJ$>Uq03$8pc(0k*|OH}jPh2fCQ? zY?<&^?na}gvn4KJ{-jsPU|W_o%h^M8;zOjQzd2|W@;zsg{Dwb{Uu(xa!Rkz0O;PZ9 z>kRHD9m-1L78Xo4E2^D>S_q=mR62o@j7jbo=J2OT9rJa_oaz~gTZPQMqS2Rlm&-178Z-a7-BH|nFAlN3Q za3kP!RDg>RLiHl-bm$e|M8}MR@4Q&M6t_g$@cnNDB4%4}Qy)vqT}3l`_?88al2k)i z%g`x7-HlE15ywLuE_Wu!DFe2skp-Q$Zj83G-xr6ed&=2|ddRC}e1p`6nvg_!LoR!Em?-8vh zN#MqyD*lb!v&cT=b6&}yD`C~Gxyo_tGwDK7<$k2Ms}G&)Ys)VRPZXzGE7fIYKW8B! zO70F%StE=cxHCUPYNnURqk<;W_N=9i&}M~H7VEUU7$J>R2{xt>kZ!0>;)F~lEo*dJ%@SKx=? zz0ISrW%xGlVeiYZpTXt93%xS8%AIarQZx9@{NS9z8HHGklX^Dgg-K7qDtV+cIOKCS zL&qIV-(W=uTl9PEv^d(IKX_N{JKRov9`-Z*y730hRm5+|BU-mJ_wR(a_J zlma72cxY!o2z`|A2YjjbQE#R7a(;_ip1U|b zR$ncPD3gB5-J*PS4AQod8Tsl23-U|$#c_njid#`Xe{A5e5bQ{S$KX3@2C2fX3XPO} zT$=NSCo8)>>H?1WLiDHjz5jv#qGa1Mf&YS|rFT}gaKZS?-zNAre4TStpTjO1^Ke9H z5{%Yr(C=)Ub8AQ$b>jEoPRK@NRRym@BK&#sVE1A+#9iLGR4o9eN7OaH=UxO|t>S@W z=s(9k?SyB#rZ_XhUrY7%0Xb{Qy^wEW8SQ2EUe6+{9#>Sa6zB)O3Qi>gFAQ%YYUX2M z0DL5`LY<8+N|J43(IgNqHV*2p9HgQ7M+yzJj*fu>rQgLpX1ubEFDYprsC_WT1-|gj zSX|yt&qBvd+d6@me;D=X1L-i?>VIftq8>&+euAr6?%m8&V!enku_rlb-S8D4YeI&z zLE3nq~uLYeEWc4f! zXDibCgM!Y*^6|h6;fk-VdMErUu9p*S+b$fEZ(6s}{p^Fr?$D|vDR9*Bkk4eZgWT|> z?>l-B+JHXQ$5{8(Wb-%I8(Vr5U_7V~ceu(3y1rF7EyO4bwZ$R5Lpv&}?}&cWs1p2I z%u25&-wyw(pU?`4!}Y@cfZNNx_T=LRn*}^;xq{L>U#9U|n3dOEo$i=mA9wPZ-E%&9 zyN3Hh!vYh%U9~!3ai|qG*X(3<<2jPX#f9w?rkL%l(;S6|&BvUNKL!&l)v5@ql0Iw% z_<~zG+FLm}AB8zmQ{VJ}%Mg6|gbhKD{oCbn&g-1&7#%U!do25TNQ`5be+7s_`Mpb} zoZx?yyL3kQ6jqv?c3<$0@Ei}G#%ozMa`prU=}LIF{GrA(g}GGzq4;MAwi3Nh&EZH0 zl%l6y%Sd-C1f5X3nvo&X(J;?dd9xJ~Xd~z7(0fYjE_6Z#wUuGrT~~aAr1ktoWe*p} zj%Q5Mg7Q1C$IK1=#v`j#_#k-LS6kS^W(1nTImqSFoX7I_)9z=!qmTLbT!izEcX_5F zUSmN@SNgl(6ypO8##wK+GVZJ+9&RGd=MVAH?n z&HG#$na#35cvb`KP4 znD5aIAxzjxfi^sg_rG?QVzR$Hdcu{o$~u>Y_rjUJ(qxJHQa;9wR`>f$b6>eEza;Do z|K!*vOeM|oHs%OHugI^!U8A>WVXnZh4+~X~1211zd8KV(N0sk^10iqC2fj$b;hJH6 z7VkS-a7p4MegL=+D>|-%MS47!jwb76xKUy)tsOZa%=QnEyErcC~n1&G(cK&(|X`3+9Qrxf9I;p$zr&wdeL}+r577 zgyTOYPfy_f(w?CfuD-C3a>&)n5vsT5R#;Ji&tjvXICU85Aguk?eehZZ=?oyba2PxHg!tdJt1 zOMKxrig~DO#(kl#{!(AZ^+Zin-m%ItPA`p0f@|Kv#x{4TdD!zv?T?O$mOFyhQU(Hr zOyfcw*Wkh2Lm2_OTKwJCIX9L=1CQ)^G7^15t&9;i#8`hyJS^f%GwZ-Ka|xFUX87)@dr@t9 z8s5Z@3@r9@!b1KJZm9FPHCGMcAUkSSK=a^zzt^b7R=|7KH2e)NB%4F(v(3J)atAiY z*kp;~Yeq^)>K zo`Tk}^;xREgd3xH^mlZgvNe$Gx=QY_*#-# zz^O=LSMiQ#6fWeBhP}y2{$Ky@oISSX#C!D$eBgbYQ;M4#Rl>YrB$IkF!8;-VKTM9| zdl-||Caz9=RU^_qQ8n}@tKUcptxUJz+e%OW-?l~7RHKD$f&a-fM}CQ_!t=7o?s65a zWKQAE8efe5TmvKCtR(KS`YAi;D!z}E^aj42q)E^xHPv9aoTAfxkqqj70E(Gkz--qi z=P327j?Eog8 z9QUpu6s5bpW3E)rSE!&Q}5%)rC>fh{GPgkkId=06++{L`^{v8u;i}R`0 zQjT-4bbPQ>v6h~jQQYj}zHL$PkZjK7jCZc1+(NUYKJM}rrA6yY>LT*}a zoMS!5gEUM9J8UKp$`E$P{x@ac1rmhED*Yw zMY(68?eJFbR8&&Es1$X-B17^D>2+CoWgngCETzXN8(0T3#(#}(4DKmqxj!8TEuXVj zNNM}@Epc(?3REO$uwF8+6nHLdWkaQ7tfH?sI~BYbpE2K(mhw(-o@**z>$#{0SX=Og zY~=^aKdilu@94YynP=vvKwWpK;B9I{7%zP@b_p9CdcZP0uK8$hAXjWiW~+bko4K0a z$A-gM)3$m#C3I24j5qEtd@I$3!|$8v%C0G*G!`bz;_*zBLAE^rmIlGRV#6V7ifb+(jDbs|0? z1i)Q%$T=NU*RSCW{Dq}Byy&~+Xk4q zMuFl=R!9v0Oz$C;76oH6J;?gXj2;&{2QDoYb0VD1pEBn9o*Cb{GsXyG z2z`PUYsI+Bh%;t$?dc}Pgr|g$@({8-_y`Hok8ysy+&V4Af=NmxmO$srPrwZBr~e1; z?OLWcQl7CjV7}SWG1eUK9f!|INk(^6-qFjNNrpJ@lm2F5A%sTSn!aE394JTT+MYyp z`4IY8eGW3%Ry0pPg$JUOYEAu$pu(PNWxR)MGd7aOteHAWSmWBSuCne0RpeF~10BEP zW!5=iA0DAy6Z-M%)$_C--sHP(RB^V`Bo(nC>VEAmSD5xwWV(l2uZVP^D}g4!NqngJ zuZ{NG3A(n?mJof14cH#~)3((;2-oZ9jf13w6(%pWs&Pk^m)bttF7J+dnrqE<(x>u! z$s_p%R-HZNa#~o(5Nzpfq&R^$|8f9(moLZP;v>|Gwwz{v;17VD2hBQ)mp_B9%9Ni6 z|M6Ssh@+48&8X+7jcggXG>jbAbfKSA-xz|%33c!h(2>1{%dAFZF??u@z%@v*06~4E zV@Cb}a`eEF@^V_5JE!)s?F|nH7V&F?-YSYYG3+tdMJ?>=h^lE{#d`R;@`~2u@B4eu ziBh!E$NDKfvr-i&ztnK5OSxKbdf*KDOM0YNx8)sKs60s$V?jG(1Al^jvu!5daShQW zT#3$vzoB-dC|GK)<93<<`Cp*T!XNSo`MUTNZPOI$plkH9(kQNHV1k%W%qO1!+rz4w z3!(1%2D@7uoIyBF+2hEvHAkmt9N)$_!d&N^p*YNRzP7nbdo6rGYyA)TIs8X`5N;<$ z*%oxKq~dUod68?!_cdnIid;?GXYEfq$M)2_M5bFkt?!JXx4z%mPHB*OT;-e%SSO{Y zuo(TWRuKBp+JQE-xXbb_rrBX9Q8}ZI`#c?CG;#E`iYZ=U2nh>}=EH^6fz{+X-$lD? zOy*=&&=2s$h*SG=y?ADyRZfUg;b~exIEuELk9a42X3Ci3R@(k}lSwMXDAJZuAF+)&LR~o1m@IwQlZ-LWtJv@N zyIKZK)PB(VLJxBcP2|=nAFW5yeZ^&30=6`Hi4?^G{)4m>d>{|Ni|A- z%n{sWJ&gFp{yH)ry079*{%Nke!hS801c_OCGZG{$P+pS1g+f{2Rf7J`T|<4~ zK|<*XIu`A)5q2{?(8>X6nBc#)4(2JAi3%$m;rKU(3;f_3>d|b3bV;27Bi->pQnm&A zS$8dtFUKD+5qFloR2hF)oT=nkGleXpxVFKu%{Ua;%5GY1v}W`RPWMHztnS&0|u+h?bh$sR>4Wa zVe2KBFYE_d#yrOg^M+Ey;TL-vgYkOdG+agpVcXV_c+mi3rTvtxl|b`^JJxjFM|*(M zhQhj<+XB^zORTKNS{dRyywtX9IzXnvmn55plaaUrT#ZwOc+dpqxAiy`jA5)Ws%<1# zD^V#}18`;{cCqv3SfJa!4GqB%VZCt_mUBD+2eg^)`3|36khfPZt2K?|HW{7a2rf>a z39It|*d8xLT5Akc7PC9%V|@?1hoJuy_m4Be7!Im9UeGkKows`)b|Qq?GIHC?@-;rf z-k{g;HaQOxt@*ePT4!~%QT$`F){4>#(nb7h)khkM^=vu7CgC6JtmSgX8z*d;=zZ>@ z(VeR&d@x7w@3^7nQo4#P)nCAP-ckn|C8Z2&imub@u#tX(uSNZSo(__VSt;fPhYRmU z9fbz8F4)AXa?MaRl7#!Cg< z=(BZGa%fNG$+ksvUjwE16#J~0A6|ECTCmerlI=-x*lG*YNIQ^ZyrGQ9fumppKik?HxWk9jl4=cf zonNjxz(i3~9-%Le@5XSoOh~-Fvo)6{u}<1M_L&S(dX6fS_vX+3Sfwg*~2)`1RI*WwnA&w*}h4z zgSbDi2NvP?+9%^+TYED+P|kT2%~jI4RNgRNi;YFq=JJy~wZ?-<;$ic-`C8Zt)*5}- z2mF^Ju;oIE+(fg)-MD&SCkeB)#J8*%zP7Q%6oi51Yh$R`k$w%_k`B7(nl(tWSV6Cj zeo8A;2g>g(WgeH?IKGl;{(tyNq<3Jq?a}7*2U+dK7=Na|(6+UzqsBVRi)D=!;tkeU zuRzKQU5zPVjj+PHjVB3nK#o062bzg$Wv1YkfnU0hZ()qrI*_Thw@D##&PMJZP#M06 z)!h)BdFHFYUg?^2R%?O-j%>XtJM3s=w6Us5cR-39CGu7QwIaJhC7IaXc4d_VIF!zj zm+4(yn~Ym(yd#=kv22eAZmH3p%gjpeRADI)8!M_8e&1H_qf@v+`Dzcd%f{mq5&FQEwd#|5|2e@zg zVY9AK9JN;$vtH(Mr4#FcUiki}r>}vlqT1SDYwejipC~37C@FrVrc{)s<|QK~l`E!( zX(SegAu1H9*O1Ie$+RpnjjQ=ZVSXf*y=qqr&CE=T3e5<-RNVBMCKjc9oO9;Pejj`P zzyI(2&YU?jd-m+T_F8K{YtP=#JflneYeVa#&OcIB&~)D+p6~2%{a1x(vem~Z(*e&E z*BRSuerYbW>+~u2e?mXE%`tzFRl#3%wzWWGJ(cNEtDKju>#Q1km9feFg;TEEBL0*C z{15Nz<{sxWZ>lxSzGBTZMutZ5JFaB`$3EaK3fF{=SfA+|f{Q&_M(^eithpYtSMs5V zcb(ySvVSY@(<|K><^-&FTrbJa3io6aGf-5n>!;vBiS@Xg^uSiE`J5E&%za!p@iWd~ z*BqW2-e`VcYzaLf2k~^lr$$G-ZHDv`pXvH2+{^o^JQq4(J?Glh<`@Z{dxB{k<9*i| z6}-cpWOoRpx<97emhSo<|vzK^&|HqjT}H!*i5 z(K7)fJ>9({Jki0c+`+02-$T#2Znx)!w6WN!2zN1yWldnDdC`^0RqB|<%Hvw;`pCIr zZua`|V`i-<=ye z80hc1)jCPrfVy^z+iSZj!jD+@yZh+d<)5w|sdUtI6#Ztf}W((tRsEN@oGr%@veL9Gl8@2Lb@8rku_?tQzZ@NMy&n% z+$ssDhG#~&^b4)qy^WqdpvD)HI_h93>xH2ZKrWalfJ83oiFszV4y%-uwIugBMN9D{X&- z_xe4-tM++Mntmqmw)X?fTrD@&(7x6ZtjimE^*X!4A8((aPyCz33D-u%c_s$Rt#o%! zXDx4V$Lk{6@BY;((KFris7IjMox~N*6R4Nx=D^c|BG(&Ewv*tQ#8U#@{rg>`n$Np# z_Eoe+hnufk;S38Fw~vwEgWY}guH@zt&uM@E7F(b4%n9`h<@sj>#|IZ$UpZsivOPyO`huD=e#T8XsCy?p?xL27`)HD!o4>5xa(8Tys+1(b$t~+?M(Gv3a)M)zjA=6RYC7z522~-7ZQx+V{2}>O9tR zm-k!ak>=Pmt4>jKX&;l5WsFuHhKTffqOYZnZI4WwPX5gSPL z_O))be^lpPg-!$4xu%6J`4%xsSuokR-zd1^G4owl1G7R2p3$h=e|?{aR|f06`Q{B* z=lK2YH#V=39oI#Mc7$A!<8`&OAR@IGOG%lOV+lqCnFQc`6TZMa|T@DK@1<(>`A*S8+=pQc5@gRUIUBD>C=?7!&r(tA9mW`VQW zG_bb6uQ^ou=x^0btVgbsRqlPE=K`ZVrN*nRTh(M^aG+k+dC#D7 zk0_F|V2p2|IntTvzSaF~IDuxnZw*T1)x25^~{xQMh9Zc zGlCOC^L-ejzq;F<>iVeVF|()nRLdE=N4vH5#=t;trD@PU*E_EL;bY2njgj5d+kBfd z<&;@Kt@>jlTfG!YGwWQ3+8(ky`npS6ON1qAS73+ni)(UgI_>cP*%rrE`@>GBz^M+S z{O1E_JlEQ?&b`%D+;W0Gh&YN_NgsMX$K1?H|5BS;8qFvU24)+*jit>E#vF_mR_NC} zcNtw(g1403aWbu5Mgv_E!{|=`V=Oht=m?H7|I0nXmbFgiwj?4REDKq|A?6Ij!P?#? z*Os^5!vvwqju zF1f*2`Pp^74h2t|M~xZwba06L5NHH@MszSup71^HoU*618|7JRpR&HRnz)zCW7InR z%_?gPMjg(YGlQCbw|3d%g1xP>;I_b8>tTC(+XX!PTVpqwGu=!VcSWK5y z9!A#=I|ZsIKW=Brbn|F%irvE+u8W-%)rE$HZ!k;DCj9_yka+8~u}H_u0P|L^0dOX2O*Vyw2yoZZG#iq*fIddXDf z{I$6PqkYlVN$&s|rVHE;ScmKb7&(Y?&_l>;x_|gBeYf6gPuJf`FWb^*vEKcvzQg6V zigmQR(DKu(D#bP0iDAnf4&^%gJSX^aTNTEFs@s-Go>>`)a_SA!Iiv>rr@ix(6tZanWLg_Bs%Owf=y1>k$B*{{rQZ7ZR z6C7~1IK|w^J9r{LuNO;iD^9+5)_~uo$tg85%`W-`*7E02x)W{nD@*aMbU2KsA{0US+yAFi#6xF z=JH+oh`F10InPNU>+nL1@l}Bf=me*U;u3JWmGC7_klR#=kt@l($7r_3QCFIPe9F-` zWpg9uAPiBR^m2+ZDsbHX!& zma`DgNX9xlWsmECvnAZ#veX18#%NKeolG$6T%u=noh;`Q`Y4U#ew0q_d8B+QJGqjS zS!kT5RLro*g>=sIH%wUBUoM+q>OsAN-!UHKL%K;V zQU-m*Cpd*_X$~K!W&8?n(W6wM@q_N6Q<3KdtX58zVU&W=1qpSaThh0$7zfd z@_t=LD>$8w@mc9hcY>p=h#Tl4mk}6M)D?P4D{#zp*41>qnMPZk-@%Jl=KMjo$iral zBDE3e%E0b-mXg3Mn8@pS9rz6Yl)cmk<=C&LI=AU;tVDjt@q-JnQAdE4?=C9mh3YqO z7@CN7Evn@L7$@^#LaO!*644XLA%T|?*OybAn=3a zJJTs%y{;Q^ryA-`L)0=kuJd?4&!z_I$}1rEv+#n=;x)$6B0b3{Rr8#CVcECyE}bT` zQA>~9FV}HCFGINrztMa*?E;s@A~`{)X{Pukiw1zFtX3z`C`qBgdKx(3mg>Va0t{1* zQ^!xBMc#%iZx#aM);#ITHIxE=uX9?c0j!E`&I;Ns7iplL50<>mnE(C|R;AqS^e01Q z(1VywpUs!RB-K-{u{L_Zb21*yDG6WTSF*QoO}OQ&(R9Mc2!B5*@SQY`nBS$L9jl27v->Pt1egroFQx?bH2 z-+HU^s6F}&aA+lJ(3KB!n{J^)+>-`?ud$30dA1y(Nz?>}wTrrfhkzrqQC9L>@WcZo z7VXr^U+Uu;v*~Gtp2=O+eDwT>G4gvrkL3c{hi6z7T+h2uiXKI3U1?Vx1YPdD-fj)s>RAQz}fzXkTc zPxNoRU23(L`bri3tZnf1y{B_{o+{;M^hK$X0W^dTNFmMD`}yD8kv_$&y!l|)oXaDNQ+? ziDztsHt`=!02NnavIyTQ=KzOfgDG;ToZxfdX?zqM zX5;u*Jp=rVb^3MmlF9T7uQTqIL1d}X(icpn-=Mr5q`e%Iqq2hIB*l1>M^inRA|IhW zoTEOYZM+9QH<6cstFnsUf%l1)OdPESmdm78c~7kXvuSVDLH2VC%D4ww-2h&w1L!|< zFrU5&JU|b@n&Rj`U=iG?Kb3FPC3>AJjKQ1(zqA;3=s{oQl1MN{)$&sHBM*{jqfBn0 zVii zKj-6#UZplw8tmr*Zc#7L3XUPoOHbTykivJgZL7Lfm07-Oh7SD=$q%Ifr9zh@~b{7GIVt@J#C@1HLas4d5s~ zshTN^IvLl?JUtM#*`hD;F0}?esIxH@elCs1!G{Y?T`YnBc+o-?{hcU5D!g!Y1CHj;9nF*)=#=kjSF zm8-H_N6Xi$1W(};jQ#A@yVZAm4*u0tUG)bv$nb-$ca=H-w!s)xBtJOi{1&u)4ce*# zM7w^Jww!FK;LiG6FyAKXcs>sFRjo7COYr5XVB|^Gh2XTj2?!=uHBkpxf~MVIeS8-s zTnvlK)42k^C!NVN(DPeq&vJO%XZa}wzB(SE?t#atmK@xtSYGA?-3y-X2YAT4)K`%H z*Rl_uHyVC-Gy1qVS*IuR-KrDp_khZyb68~@BcD0@!Gtzgf57`yn*J3}Uk_iyk-!Ym zxLXCr2G_ubQt5fvrlKvJ4ec>0OWAyfu7Slz(aq3^&uBaCN9bYRzO`t_= zsU%)R{{v)s6nE{39{Cvjd^{Dx-cHk6j#E>>znq}_u(OB2(%Ph}B~9H!C8*m2yd1c! z3Z==HT|AdA@nmS`dO0lfsXZ{q1zk$_tIvTcPC|2&sX{uVziLE(T?@~yF-A=EvD^Zk ztOg5H4SfSn)xW_rrArilMcq^)_dw6`g-oOUTnOpE!ed}T6KN@;s7l>kT?R*DF(1YA zx7i%8V!&$ENrgC(E=VKi(+;$IUn=Hp(Et1SMYR~(`WASC@5b7@NY#t?@J-O4QXa0d zU?;b!^D>)e3*)ZY>{clp3rmXyTl0CKj6!HnHoVJYl7#d9;Wyf-H&#;)k|au#9qL8& zF-z56Aepo9XeYtoxC1=U`BEeUVR-=wVOBvKdanWS99}33I7I}?pc^y1|3A1d1uPZ@((2KtXI!WRr0dW_{;z@KGuuD9i10!lj zJ_F%*lhu4MP0t1Y<1F~ya-gAQG6Wj9S#FcR^9XSAeoI&2*Rp{fS*-?kxi%B}dp?LY zT5DjLiC}$g$5-I9Zo{?=o-?0^N)+_E96iA+dhNUK zJ@Pi+&EN3`pridL!)S124+eklM0np%5D(?RXRqMPJcTV_r)rL5_%!&pTd?hn9<~uu zCYAM>Q6p>~PeUEEWfms%Eq@1V8z*?B= zfP23U?2-v=R!{M~i#=fP-UEKhft-iDGC2kPQ3U$BXq?}Pde+f<=zrVD&jFOR0LNbB ztrP$fOypBE7uVW!fznW)KfoIvjU3{jWmp@DdM*W8`<@OH=7Xa5nvAyB=#vTlemA64 zz=z=@$MIf@L!Tsk7E#Bu+!u(Z8$%lqkA(<+hf6WbE|fzz7k6k?nV9)(hzphr-j3gEU%)Mhezvub`B*g8@=KssB%tDFIEvkvXD zn*Ia%?WA@nM+cNO77XZ(v<+xy8S3*M4Z@YjkaK`TV2~?9oYJaqVDuh53Yf67OhJ8q z;uiXhp5!WWL$9J>1J{_;^EiR`)4kBW=TY~=ka`Mz$v4RsYC+Fc1mCt3sfwt>HNB?c zh=?xpD)`0Iki-T`LT}*W?eI*+(1op3z`sCFZfGsA64HFZlc4014nilU0UzEhy`U#6U}vS!h#E+I3-Hh- zj^JuwpIvC#23iTUx*EAR@IszWQ{fE)kVkv?<2;~<^V}IS8Z7;grkU%|E8odmQDQ3PI9vR$Qil9p-(9}+N@d>cL{)ihI&@;>c-fE(a z^fYhB(Gw_T67F#YcF+}aN#GA)TQ}ld50rfu@a}qOK@IfrQ<}!Baev_ju+3}MG?%9# z2NS5SmMoMXb_l%~Dh1%&w^8?*i1yawIvY_+JYNLMVJbA$4+i`cXv8^Sl-a2HLKbNR zH~$CV#GgaMVbyWapLMv)B^nIN{hamz@8zH^YjHFSdgh0J8U-1~gEjvWeGQzr6tzr* zhx(l^Y41;DIhfbH!5RQRwW_Y6wz~ZxU)dBdn+mX*tu&0@bo`&s@u!AMYwWBOVP9x+h?5mb%$oA1}l=g z5d|bkB4UzAb*-veRld@3dBjOl=cLgMZqrQ_mBAJLjn!uc$F7*$6bK;Eso7GqA*6suI1O8?5?;vP24j7beQB zs$BI&8S7O8dbQ1}OaafzhbUdDVFt# zCrCB&Ns#`kUVVpt^;boRibts}3eQpHbuj!_p{Gy8bzM~l6|Wvt)#6dFVs`Up`5#=F z2ORM`@>wW1gC9OdidCJu4KZgYqfs`>O7${gxhz$zF37bvBs3!D$?8iPihJ*tI}r(a zRGD}TOWiAPsULx9j!Uv}R4SwqZ!Ac~$epcThZL*uK7)FUwf9Epp252px_~vm2V%xk zY6m3pw5rDbc^PTEF9R|5gVJI3P!Eh4wO2ijX!WABsh)^c7OQD$kBn5yF*^RF`cPr! z4cPWC0hRPIE+E1@iCnv&?YbK&kXc{Dg|+|_DO&4AwHd8c16l1to)xIgIoXXo%OQhb zv68D4?baRbdVa|&gC(3+6L9PW=nmoS2@_QSs4!2Bho+8FYtVk<)gySb z#t^k1HgxR`5+}f&pM;!8$Q*^|&fwNrC&z&BqF^bNNF5Cs^;D~*1~JSeM0R!1(Qkl- zT!^AdpsA6-eOix3%%1b&S}3va-EW&mlffd4y-Z5Lp_0@R=nkl+un=`y_QWRg^&7axL= zzzsZ3M&r)WxPA}%oGfft^TW93D((*dPyiI1DO-`}!?5Jd7$>NQFYk}HIjrHkP>yoc zEeUnMR*tXnOkp%6yA$OY0fZL=zi<@3ahf>r+8NRYEY};}v=UOuK-og@f??EfB3iWy z`@Q8jca+H}TP#}TD&Dp-MdFceBINlKq%sQoN*)p=ouH3>5w(qxM94K6aT6no7>j$y z!kfk7^N0*W?Iy`^Y=_~RDAYd#2)!T5G(vjf$b-@!Wl2LFha%k|A0;M!{rHF1C_&#GZUx%3@ofX5+RdNx zNnq_-p!dbFx7Tni4^cus-Ziv<%kZ5CBr_9x<*=VOcrDI822{NOIIR$tI}d3ykos|? z%E!4(9Df?$oWHJ|4$SiCU-@O@nrHY4oG-wUeB_n`-1ijrGBNHt8F^fb6z;>nvDi!J z>4-a0u|EN4$Km`$+^2}|!M~|E_W-cx!$1`oz;)U9U^YBTl7iUj{~`{ItpH<==l=y) CiY}-C literal 0 HcmV?d00001 diff --git a/sounds/blaredruid.wav b/sounds/blaredruid.wav new file mode 100644 index 0000000000000000000000000000000000000000..2cc7ff6d41ca5f88b4e33db33c95c9c959abc812 GIT binary patch literal 27250 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 literal 0 HcmV?d00001 diff --git a/sounds/blarepaladin.wav b/sounds/blarepaladin.wav new file mode 100644 index 0000000000000000000000000000000000000000..bd8d5a1e84feeffb24ede80863f5d184dda0ca78 GIT binary patch literal 24440 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 EKUkfRpa1{> literal 0 HcmV?d00001 diff --git a/sounds/blarepriest.wav b/sounds/blarepriest.wav new file mode 100644 index 0000000000000000000000000000000000000000..a59d08ac8b9746b49b7a1d869fc3f08dbec6d624 GIT binary patch literal 27224 zcmW(+1GpqR(~g@n$7>sRZQJ(VwQbwBZJTFp?_Jxr&K}N8JAeM~$&>C(8tF+YN!43# zHLX*#X5&5pw5rmwMvwl(vP1#^ph%T712Cx~00@MOnjW3I4kO|mRsw)-oriVKB%b&e zbO3EZJCRz7QX9}pl-h{ewj#IuU+y64+ksA?y{Ky|uD2ECKA`*mQcutq^b@Hk=q*Y^ zz;Ka=fT3Un7zsv$abUbSP6AWFG?8ZhFUECFl58j&}HbznU>0QP}x;L!ih z2f-bHkf#p;Q;!LVsL`!bBO@E~5itq^F|?XayR8hKUjHEo$os zdFhM}qdh1Uswc*}6Z!?4p>~L(O5*O3$bZfDC!cz#YC$$g+#`n0-}wqs4$w0;$S~G z9xXx(VOsI^OT@d+qYvnqkX8rnKsjLy>P;tutK6dvVT}6`CXr-!B_D*>pw_T}=$oG8 zH7t>=%mHtrXK)eNfw!Y`uoB)4pMiZShNOqPc~@8r_s0!I%l+^Y{71}`Y48qg z2S326_$59C>%v{+8JPx~!_TOL_~*OOAou}P#Sg`7Y$g8H8B~`{B6r|V?2?yg5I%** zfp}P${eX4cc`$^d+;==3^MMNBHZ4PQ!EW>_S&6%_YhuOeN2kDhpbyc|RbH1)!waE` z8hBfvpM|3|-ddcAu16cl8GIh@7P9mk?m;Kvc36bWB;hy$N7G1>h>D@pUVAQ)xkz)y z@l`bF9tNXXO?cls%Ld@1;0-0@8*D3uXdga}e4*V$KOmF?HiUI?EV#mp!|B<80rXK%Ky6 zcme$e33w!#4U^FptYMkF!DSJl-=!-c8eOK>V4VE}wP2mR+4fTHC7Er#;K`~ElkK^< zCEma{iFxt@-KQrAK%H?}vIpb`+u(5U8{a|IyykgC2qPa$s2~O=ioJc>O{K@NR4Uq!oNN|AkWU09qA2bxkP?JMY=PwLB04vZiJcat`E1VbBn@=|S zp44DRQ7_v=x__B<%Q>JvfNg?XBuz>V)$zjVAwCXVqB~p%e^j=?Ds}-mO#S0EhCr5R zK~h8d4A;XZk}9O{9DXmYbg%Qu>?t1Sb;rZ-bFrG#b?doX$Uks|TN90zhZ8H|)}qqkzd@An|TCNIL}c~iDd{>a;r`tn$! zfdcej{N8;}i;*O!4$mPS0j3v*-*XwHp^ZRwH=Z>YQqvOWVzo(GHiWE0JEUYXmboA#(mE~G2e_uyR=JBx*m2SUWuCKM z(R`ah1b(EPM(xpax(IZl4OvI`4P7Xex5n}%a#wG8;Ha_+?hh3vhv{LrBt9-D*c0G) zr6T^rTgiu58hj4L$%+*3`9Z9*i)7|6L1S_nq=4UW4piYBq~YP-VAulJDge4TuLiweu9tWSZAY?Tkq(cH3qT4 zUNN9b&v<9|p`@{GJeEC2XTSwH1KA3?v7BtIH-$`9EIe9_)Os=ssyrupjF*C?-ZLH~ zz3DD@u6v1QqDSoh=m(W~TXdGLad+Tt@-=q=d#bI2OF<#E9qoZ05uK}atGvm{L3YW5 zoDFV3vYn>pGCT$}=9%eikmxNF|9_PohbpMK$PuptX(U%>-{3#Ar&Jba2eITIHkPd9 zXL$+wn`HMkfSS0d&{wy3i@+y*4bHZs(P*{`)r6(!H*sYesEun$;rI*Rz*0#a@e|sN za(5zYq5924ve_%6Eu z2EsdX9Qui-%QMJQq{??_Nzj>eQ^ugjPPFzBEi;;dSk}lMZPg-Oy%kI)u*lf?g>&1?DHO$$!p3C%^KPO|=sE3$`8kz%gkBeB}A1nL@kEt6reB z?W$5HwJ)524v==De>$+9E8WH9cAK8jVV4Ss^g(Mn{GdmiN#dgnHfh8?vgTP0&Q)B)G3M5p&MpN zoSx2h%HnrypEtL>r<9`4oy){01%%zo(Ft$~M#E_DCtAf; zgN9~1a$f2KiJcDCm&TEmpfzqu8sbTO9$YPzrS;tQ=!;TRta>Kg2J*2OX^pWGXY)sZ zj7D+wja1Xvf{wC-UeIX(Uhu|j9+_rj;az1$((7D>E`Ssi%7_M2+JuQ!9`eGos z9rVh*EYHTfoD`u=vL?fQh34TM&Pb47CitK+810msp{sULK9~(<)r4+7ffUC+ zkd3EeHP{&*4SrVP&N=-OcDvBjHeAQjf*jDqqjO*zcV!XqVd$cazrI zzsxU62k9SoFSeybE0p`DtURuy@6ofLEXea34Mn)1k}c0qEntW?RWzcP30!l3^`4hc*?v?Le`& zXXMkuD$*B$T2fuI+Pnqc(AFTs^kzCRg zcnch5@91`Lg;?;OQx?sp%dEZL3&pXrIg8{+ST|RZ&19`pTdGOUTkUYTy5D?bnff~1 z+@8qRsR>>dISX0j?qeTV2J<10@qckfS`{e8->tIP#b4~%@HYO(nEY_tKG zhnLbLyc7M(KG-iYR#mXb8=+soojpU+h1C$DMuR!lGyi3^La+>KA;&vCT_Edi66lp2fzy~>HiUg1>?34ezfdH{y&M3E%GQ>S@ zUZSQ{#P|;O(QN!BqU@mk1Q_aBr@Q-1`^NSfwY96hFL?GW zDQwmXd=~Brr?`hm08g|md#Y;k7eO1;QwBSI-O=(~j{`#q@iO*Ee?7T<=&Mp*E#wR$ zDN<#-y1G#%p$6oSUfOwRL}_vl~t~6NeO^=dRsWyt)`4enUSk> z19QEHESvP)Wkh1h@EP6)+c`zS5j4ZjhnlbnUN^G_`N-T+>r)UQso@>S|-y}+kf zTKBwb%ewc>E<>w1OF;|u7=IL^T0ZvPK7`-0B0M)Mq`XDrEFX33wzlnmykUS&SJHYaV#@aij)Xs7#dqfFu zPvDDMTAkwFl!miP=!1G+dTCWdXVgmGe{j0uM>}~uU5Gl0UAPz=>K=w4*&8R4H~v z>8<1%&RaQPZsS+k94Eo6=F8_63T;%zs#o{}+*Do-q5N37;3cr-@?vlf5^V~umR1V`AzR_M<(0u?Ia2%NEaE$* za!wvti*88;qIr)-@OFzMylxDabT4s)fmGONyiFMNzvnwyEW@mqSRr$8OPcEm{ z!?nnCh0*<>fK-e1hjj%a9WIR1k^Q#5!-id(wd50lTqQ8l+3QAoW&` zhK|4>dt^MetE2E>GTNtiaJQQQr8&87o)DO`0$=%R=$q&+HA%T+=O9ENF^S#{KF7IW zX7Fw~$U5N7hHZ@N=2R`8^2aL*6Y+KT3!9}b!2K!JheCiBM>nB{`JLX<(>iAh})R#!T+HbS`c_X15$U5>-qb zO22BcaH0GFXLELuOC+;f8jn$zf$lV?vIl=eg(Mj!ke+%3Z{R#cC-@UP77T`m(F6X& zY~)2rLs38aO9}!9J;KM`rJ#+J#fr5WDKGJKxIk_JemL8u0RItc>AxnWHd6EA&L;yLOEWxDx~w^DnEKHIU_ zvCi2O6h23M!?R$Bg=v=6Sb+e!@W;qM z+HibCoi6pYy5eOlTG&c`;AE?@-P*~TJTuf0zXg~112RndP0DzW>|YSj(R7+Ln;pT& zr4i)1Q$vbHS*%%jM?@BuSFWkH_6TdC@8wJFczvW@FsT)JLkoqP*%Q6oDgC_jU{)|3 zEAj*5SjuS%T+7G@+ISz4r53^QZgsVSw9ZTecHt1zp`ULeraF~A;Jf4*Qdx8f{KX&D z0qR$;2*;`?$AYQwB>sl8vav9;{3;?sI%AYoziYLeI!FgcjSKv(mp6VU_t?e6R|&&N z2K32J$6ia9XfNqAZo)k6iljLm*-kB&T%8iBAuFRzk*m4TTTN`chf&LY4ZoPxjSB94 z-q0=Q#yP`Kyu44~E=9FF{!(IGzLAx5oSY4=vV$OvS2KBRAPHn~i<_1Iwomg=i;9pUjbRwnK$E%a+c?6tm zu)VO2&-2O3YIel>9_rv+b@F-pU_-E%S+s_c+iVCYd25Wz_AT!d{ts_AGm{d!%-2}u zq}tM1Se$1eQBn)mkc<@Q_hGUVuW}ENf7Q##Gp@kYQakX}T8ro4VfGMyRQR*z;O*`@ zdn&4{W=Exj-E^9DBHutJ+?dTpn?wtlm9!*>J6m92^F0jb!H%#T>E%7QGQ!%@1~9?B z?Oes1<hHx5y(avK3ZB%x_f0oOSy#7LSTUX36nOUobD)Z zEZpo>v`g?IYzH3ZjSUupljY|i){9aU)Y1(J^y(BW2kv=iXbU+3&UWvC_Xv;E-*^8y#vW{C->9AZRV*KVvYTnce+?CsRhYGMjZn*`2{&R=rMCcmIB+j?a~L2ji?; zxSiC@rwc9iO(5sz8^1cx!M=COZ=;RXP2klB&~LMkYbX!lXJZOIEE$|TXY6cNtXaif zBpnTt{F(3tYmD`cKc?yU|7%nmLG~2IG~gk7yM3C*`sT_lfoa59A@~sYLf-`D{+o>9 z`HizqYdRd)l>Pp{c2&EIH_lrRI(d7+2soWL;Ujq}atQAWt~TqD?rb8Du$zM2>PacV z?P(2E%h1hk5`Tox;~KEMr_ej-gg4yGYwUvu)mhS9G%0MJ{GXE#LpcL33LE2g^t;>1 zZf57QzI(Tgt0^h&Ut>o=ph2W-WPD6#{M*IS54O_&jh{x;@pKEbm}mgt>fww7CpNy+zl zN&HQ1nfiwepv{v%ea`x6@6X}MP02BBK50isJNw@6PI~Q&F5s5`8R-~*5|g|%@=fWh zcEUattN|tF@Z$uF)!1^YI(2zo-}Ll@G-&P!q%+F}F1XcoRlP+DoAW}Ccw_mB&$w%Zc>$sI&30D!> zsH9_W#LOLR9xz9^+um)&+J@R2RD#n$1^cGb z-#5qDm9*GlI0G0%zse_*%LSX+c5oN|8c`suxYUkhNUo8T+CME_AzvH+h}84LBaq5d z*+6QP?ta*C;|JOi7yoKN(pvqI{DudtnaMWj5>_4lYv%Lqhpz*P=(8f>JjxyXH@Um> zf|kPhwWbj-!2N`7!UtIt6!X7D&4W!mLPm!2AiwX0+bon@>#vkivPi_L<$hICMbrz; zGr9Co?F#=`uZRtAUbWZZo;9k)sY!t5xCx+Za>ts(*40Aq^&+HvANMzOH@`#8?`;)zIRYxE5~{D z$h0tER(Df{)$!7}%qyGBy_0Ht>2b;}qn2`oHush)$ME&AqG4~XNzz3e zgbv&6MxIZ8gp%oLTHkz27KKd=6f~wQ+w~p(dCU&B$B$$B zhK({VkeU8Za38oY{8E*b>){9Oj)@a701HgR&Krs_|DiYFq2zw%Fii%RQ9b=XG*kle z1AYoF@Xyi8gHQH#DHEzphL9&lcWJuxET2``oh;@2}Sf9 z(bvtWzlI$VemVlW{gN)rlfpvg5BIk;R*eVULlgKNUl;!~=kK3?mB_G3pqTJgZ2)=k zI{h+!5&Dh8nQrxzru&|dM7uAlp71u=_51mDdlcuuk4E8q(qd~BF?|g@hn5asy=zRDfywMvcMf09~7mCv*ULvGLjtDKmn|;&FSKcvFnM_Dp z#n-SENh1hBv#oco4bK>Rwf?Egp`G?*T~GT?c-PlT4Zy9)$8=BdE{u^UF`iV{S+2eP zWkhCh8YG8>Z}g^EnZ5IRSvoeDnZ6`nlUIk0cXuX^VU?B6^1`H)=z6@KvDa7DdJxq_ zsUl6Vno%puy!gg6hyEz3A59;K_Kr#Cg7NfH;wh;^s)q^Xq#iNfgaw++F7p?WTf-}c z53|lmEi>PbUz(~-x|0b7Xff`1OHl8mrS|s3-K3J#@MTGUDDA@Ene~}$ve{WrpVCR` zf;yPhvbO%R$ZDLU`>Xu9=VV-wpu*1qA+a+l%d=Hfs9`f3I~ z{%sNMPtN1DjGp+nA-xM9DK(U@#>wbL@GWjHEoNc(qqmVC{Z&}r=Q9#pJFBI0ftGS? z8aH{Vb|al-k4kABGr_EDzV_d+Y`Vwp;x^$6trn3ll5ctEqdtHrP)#ou@e~wN_C=1d zrlm@w^|ptE)sJ43^ut&janr@Y*U39ccrde54StB*7cs?GEq)FT;Hg?MIEcBv<;g3< z)|meqzfv_*hdF&gfBHv$!Z-SNYZrq4^kwaD_9RvWji=iMycIB0!UJ2mqZ5G4ugg_#Cz#kyf0;Uc+F6x z6q~-@XDi}^67w@kc#w;O0sOPl#>@dqtM_?9r?|d4Y?AT{B}Zj*Zn&|j9wdLD8=`N9 z7_JFVc=4eR7%AM{PyRr`UjU^QRc>HZr-{mCZ?yA8-)b+g7HH>_U)c5hbDc48cEkzy zJZT?ONvR&5+RyZ(dOU0tT@L=X&-v}p*_6`k4}2B>7;N!2CgkVu&G!M_TH^l{supa^ z+QR(mMQwpTg-+ILDJ?_Mep_o|Bt%WsDmVqm4|JXlurtOC*A4_X;A!qO<33JyFIsK9 zgYp4#DTLKIlBV_2=7E0lT79zrteZwU6E!d3Xr;+Mx4&Bk?WErV*}yL={%2d>Q7Mpk z(ApQC&RvHOhF>Jba9<^-{2NBfef>+kYV=ZMYW!X=6;)KN#%3tR!@k?kqBh6$ihC3> z+$d^&XO8gmlur8L4ks_;J8Q#~j%eb=^HFjLr4Avj!V9Rev;jA9E8O*U@2~x2Y|=oxL-3aY zSTVPje~r2hY>3K6Tcd?(&-*f}A0p3(HN=%bgx;T)k*~=c&0BVQ!F#w8%;x#SX8mnx zuM1~!ZG^Wh$(Vw2Xf1;k67u*|l*?VD%#6%wR}0VJyKQGC`;^oCsWn7>kx(w>fub2d z5(-H7|Tv0r}2Yr@kg4Xhq+M!AkF@n}BW zE#iej$0!eMB1Po-iT;#CcPeffy5{wiD+i;!NTt!Qrv9y3FnCZ7hV7CTxRdqSV}t? zT9e4=6QXz%l{~1UQIr(Z+nPOziB4;|jRdj6R)8?|gzFbmp&C*ki6+pg(5LT-WHVfQ3U>A(||O%@L;2bo?&9xt%?mZ+CJ zP5y4)(N9Kg_><(z3FhJp##H}nyGmkXx{UR+W5E1~2Ju)VR*7)@x`i9dqF8c4SRBsJ|dHM1tZ)LIUr5j6* z_-@EKSOTr1z7I{nW9S)qC0oEw$V8ipy9Z-qX2Dh3Te3$VmegI_;}%EVQ*x8C9AGWJ zm($9gZTxYb+XbBGdS)q;wZiI}YMgJMv(on|I#*z8)F=GI%s@9vp}36Tfd61{w|(1p zA6|9W^HcIP>#zQr4wawtV`+1{@qQ1d^3AbkC^Eh#kA~NLmtkpVJR63Fl2L9V$-y`9 z4)$iFf?AIZPwMM7kJ&F>_)}C_kMp7hXg95C-IL?xP+$+gn!YO-YF>!gNsa}&s-rLt z9Kfrk$H6D^0zF@1QSY28*7(5Tuuet|{@Py8K3i>t-P0r4q)Q@-2MUw*{!(reX|cCj zdT5Q%r%Qjm6mh*eujog_Kifzlb?bSJ$WS@EQb;!E{)Rjdv+xwlF&XdLPV! zR!ga7Qf|Yi*X5gxqh5QZx)JaD2ww4~(gU^#TmVhfeQYUeBE`zJaWnlI*ksm_E6Xy> zXjH*BSr4bT^GikcGrmkRIRiO0Kknyk)bFZC%+}0OLujru-#_1cD}1_{dB#wLl*wD; zTq9G_-Owxf5+4$3YZX_HSr5rQ)-yB=ca%Hu3toHQPkEwMRBNPUIMQP*)A2%8thO`7*ZV0Zo%K!;fse2-A~F?H^TdeJ_EBs6!)=_!NGDq?P+{1M6nmXih>y_c1fE;V!t&Tn&@{CPW#%xYj6BUw^d{=Z%>itj{M{-IO36)NAv-I4 z1AE&ka1u^s74&kbEqEJqgw#p+dzQog>UZ0O9_z(NxEGb@b|qZ2fceAGU`CV*k)UX)4N2{OP!@Q!(2 z%AxJCM!|mx;~Cu}c&(Gw@!>ykp4(J-7D}5}_z-0ye{A;Fw(;6RZz!SU2+ie>q>j?(2di1hD{m~VO<$VF=nE3Yd*dI<4mU<{ zNS}EdoH1hEy%@ZRCsArIvsIiM-F4H_Ms7c2JZS}Uo2gM7b&11`=~|-xDpWPHte4rm zq;&V2p;Jm9t*P4(0_BZY!yc^70-qBBTZ+#ctLZoGOF|DNO+>&u0w4Ly2)=MgYYV>` zebi#|-q1Gps_^GtcS$+a z56*cjz2HzDHA=~8t&vs>GR6ItyaI2d5VS&{6e|=(D=QhCL3X%*gRu8Up|-4&OMRs! z$NMhyZLL zbNSkV<=*PB<~oJj{B`6QE3JG*iVF&@Lu+eJvWrMniER{PL3rCOg0kVx&H~q`9E8n+ zlT`>a7|qBrxfuL}erm1Ez1Ayjh+R0bfwCKZNJ;1Ik=KOQ&w}IpKptUpoB0-c6Ril}0IjDvOSRbx zH;8j+vF2lQr~kN};+&?t(at~(WhrVE>IQS;$H}qw7CJ8BP0}-;Zk2U!C}r70`ub4rKG5Eo8Ks;bnM zlK%FG3zU5zwU^d++D*1Hh1UZIoMG~J^?K-~GFGb0OMqMYYf#gx=AUeqHEPIp=#0d6 z_^sS1Wr|mgowZDUOxkSMGy`fCw`nMiY{+|(n#k$H27t~mLl{=47kzH>CEBw%$0gtO!2o^dWvc&N+^6!k?jvAY3mUT;#U!rzUw)fELoS8M)b0 zI?)*i`}@wd8M=Iv-@@-SQnjPd8Y7Q6%W~o9W=kaU;I^kZUCCM)< zNm@d7gbMNBYA@$tN_nLN8E$?=UG+A025FksK`<)jgbzVqj53jfNw`~!TvGD58`xC# zz)WIAwN*x8!DD-C7d5!P*?FH5fg@nCP*ZxF)Csz1ls4FXU=4ndMxgt~9GXKe>P|CrvE1~v;7`_s$o1s*Lih7XBmYU~ zAgvWOkwMy~@#=6yr_w)@3<|f2fj3*e`^fPdVmm&#&ib3cfrIb4x zHdTxAOeD8Dn{P5-s%dc#y9+)@`hcfwpkS#p5uI_z%*Z>yfqY)*7D|U7xMu>Fr1KsK zEk>JhTPqHpW^03s*+Snu`;}Ke@-w~86)hin4X&#dscnSo4doriQ?{6O49FYlBrBj=R zCa61Qzta>S(lVN1FqPiR-EORus)Kx1Ke7sH0StU{g!9J!BJ{yHXs9QJW>Zz(s-Lv0 zV^wMf7s3mK@MTta`oSCH7KU%oo#g*eDSe6CE|jDl#zRB3$Wyh4J&;t@F9!~&T_Rsu zoA~BbOQhrWH9ZG=W@9~(l(UD>vuZl)x?J4n+22u4|1*BtF0J-+vkTr$6R;;Z9Bt5= zS}W;H&B1%nB=xU3#}(Nh1Jm$G6HUO=Sv6Ns=*w1BCQ{)9}LMq z!Ah&L)Ep1C>nMxK!{8QuwKOQ?gF9pPxoglR|7qUZoA2*LmW4+8Ho>C7#UiGna7qQQ zl5dw0=M+$TIAfho>IB-)sG@$BV%?JHfO_3MAVT6?P}o^YezGQR622~N$B*zDX*Vbc zPT;BTR4{^VgL_gQ(l2UeSxSviznWE~f3>mhboZdt!(QV(kk-3h?Ul+O!JXQm{?!b0m6pfM$xHYLEyXh}yQLk;-YVSB1YWOD<5t2~M}%&BIu)3uYIMk7j(E8fnL3Y{pYVZd7 zV6(jy>yHFO4NLv*GtHpHd}ZBJQV*JJZAFjNrJ+>l#vu-+&eP=ioOVLJ@5rjq@* zVld<_@Ex)ZJWY)dkx6-#(b7{dnaUEtk*EuH*?zVNIw%imgb?or-r*W}mNmqSXM?C2 zdPNV@cYL_FQflliqifVAc06AY_Q-kXj1RvfUp%%{(Aq*9VzVX4p^r5DbwFBjac zbUad7l6+1rolwt-b1E49<^1jv9tn5(uUjMGJ_Yle;4M7|UfX4K0qdF>wGnb6Y(pG+ z5oV)Foeji)aq z25-{s_$nDl9)cTokElD=bXbCoS2hQ0h1GRC!YfWADT9dPxsbBP_ubjabHRU=f|f*A zGX=)jsiO^}k|ePxHPMNdGHa==GlG*b$T&h<2|a9}k%3-xe;UiQiB61_Pq42C!^_@c zRxs%UtK`o?>N~!u5KYCh(6nl1kQV#VE80X|?fxgvVW*q`x(Mn>GX=|a3;tmZhG*R0 zte|sDN$reE(3;1u}IVah8kh z%!Vh)hG3xcJIVc><7j@$B~-=ooEdzBFX=ChUgl&jGBmlgx`MPrQ?bI=q2cZ|)*K#? zd!lmWsys);WsZk+)g|s8tRhw;n(XB;(z^}AuUV1&HQ1ov zv<@o8(SCO+d#J1pX(~XOgy(va^4m#^SCXc}OVd|<5*SH)2H*SBn;lYmDOaV{p)a7a ze22XabcvZ@OeL9pZ^_(H0e?|Fuk!_Tih2?}M&_wMtZ{Cle`&A^&qAAdjg$LDUUE)? zfoL==Y{m(^Y>QQiAB${mpYwoxNofTiYokG9lug>sx5HINZ}p1hNNe0K$aNaaA8pV6 z%@&{?B0A?5{07P=tNvz6-K3_<1^7mxT z2rb1qY1P1#uOq?>gxYuu4L@Sdq2+K5A+K}~@B>zeE7ZkKl;ZOQ`yRe8TEzgJInR;1s1X@K6Z<#yV-#9QhSV9?Ox3O|-2i*F> zeA45HgGn`|oBA)OJF84{OG$xi>OmF^Me2>D35dHR1m}+=7xiUJY3x1)E%-A-cXmhx z?A;-qZbr4N^wL1(vDuo0a6Y>lI;^cqeCX`ex0A`vO{t;sCU9TvD6LL8B_dnyrCc`i z`@)iH(tx_r%W7xVvnYpBuJ}e-hwbTjjqiHOG167-1ZJW~@?Bn)UB@y0)hRWi2!Ci! zSL1lRcOM)l8|9+reU1T+R1HY(b8gw0wycv~L9AxwtL)vbXudSiW>^$*+}k(;Hl z7yGvG{$jN}qZCRxAKp=T#y?0kSy!h&I4IR|$2n=_yyhjZMr4`L42P&4)Lbb=eAVdb zr1t6vp;x5=+qDzCJFLmV*(|%GT#)S-2yisIZ+;P)Kxy}F(rWpp;FOQD9tbZ_qBk7R zLDAM>>9sZ74M}@IPqT;?rX92QO0)fsLuI7#B93)PFjJ~@$&*u(SyTEaIlr6HS2*!3 z-mmDP4I*YS7v7k1$~Ta;OIfQGXO(a>DV4g@{YoO0ujm`xD4+Cldb6e8u#0E2PUx)p zO5UN*4zvOLSX+D`*q+{%w|EHsCoObFdEshqUd?^!%Yd3&KjakuC;JGlpjLLWpmXvg zYYUj|A7_0s%BaUkO``-3;YPv6?iA_v-x%c-#>=bgy!Em(F-z-YE;Q9jL>FP`G zV)M3QYYnX(2 z&-PMZxU>m$r7hI$mOz-KJ+L0yNYV;^Z#5PLu7XWcdix;gAU}1ph=|Yt`(zFCDzG(Z zEHu$W^2*tSgZPc$cs7;4foa}!y|xU%R2He2&PH;L=JyEDq`~ee!Hm@0itZ_v3jQ>1 zqvLLF5ofa!uL%tC-f6aV3+2Y^43vakDdWDyzO)o%*k^wn|^T@;W5f0Gz6TA%mFX4R@yy^xS@`a#@c7( zQ#jGgh_A3-_Fm_XUf!)~HIUc4yA6RS{$EdD0#;Skg}v6==bSrm5k~?er8Gw@%h|BV znbMrcFfj~Kp~zXnGBc;tFby>)3Uf#;{M6FIA~h2uha{&=E&U9W3O{AI_nv$9|JwgQ z|8pNM=bp3A9@p@$efEBjoW9c%d(d8j=NuC;%|5BqeApA~%y-2hW^LiRu6}p&+=I+l z>?Nv$>rP+|ANBqi+<zp$Zs!+BKZTLsnA~EB=l0hUa~| zLCEJy416D);b~we2A*=Yuol^mc-gbx?&n$V2@83+sjrcS5yoAw7WlP`?B>de;+84I9Fm#f%B$&34iF{XB;#icf7_sMzqsS z%B-@$Wcz=ZMZ6fm&Y-Zw;B0S(@1sB+>k)6OnrP>ouXP|Y;_3>dXPkj!9y*bDCO zDrslLmPI3FZaMe3t?z0zs?4{-Nf-o`7-rPPX-dr)TgeoUJKT-r`7&iC+M5u zpQ+Q;>wF_T|5RohqpiC&xAp$8W7SzT4Lu*(e+PTG9^|Q2XFQ$5k^&E!`C)hIE6xmm zfSf>E_t&o2(9=?a2tQxNn7?W4>$HyBmL2Vxqt8_}SI@X_SDT#W$;O_A5|0e$Ml`FG;V)E>y$%!>MP@RyTR0`KheeiNU z>aZD6S)~|N5r;XcNJ%HQS zdbYZ|?&Td|pA2*luN7KSHN#rZ^8=Me0oF)OG=o0B)1G3yhm0-iOK)R-T$fq9jEOv5 zEd$d?S2M!;N$2ukKrOhrFJ#=HI&9S8AlytPG1WGpiz`qi0*?2lnUT9Q-X<*Ih`pg1bGo-Jt52 z745kcT*(_f8~G)x%+r-WriQM~#tPo2#>x?X4>9frEwbEvi&E$jvyHloxq}Jr5ApAT4*y37dJg;{FRW-BI)l1f` zz&xJfY8yHe*lslqw!-Y(FZT7C3FdxxL##u+<-RKeJ-2}ZZW?1fiv^4*R$ZPh)n;Sv z@BFD&I}Po%vVo%mF8i1YlUmL)E!H99F|0etw0bFJ^)?%+@2n?Po=!F#>n%#;C%ITh zSiQjKFbA9Y(&DfFMPWM^1#xU~*4u+His ze}o<}cgspVqrYE@>=bZ=EC?;a6ueU^G4M!h*Cwg}anS`46Z)v}NZ+JWDw5k$lJqlgfnh_b_1JfFz{rq!^q0yowsVm)OEuw_ z>|_BKP~ds{A*;Kd?<8VgxO3<}GsmpZgK53QS*6D7I!@Y|k8mM3vkF7&Lh&9^lk5p* z8+Tf8kx}Ap;5=s+m{;Y36GKZv+o;M|Y3Dfw#;fEGO*7`JFPuw~tn&GUxfBdJQPyd1 zJ9!doxCUEa+XtkpQQ!G7R4VUj_*vae@3qJ4pQWj7>1#%RxvL*{xvlv+%AIBTXt_#s z^>w1za)*NH&OT2uX7Wm`7wA;YTasZG`s+KF4Ac2qb+kSUtyM{$LtI-&x|6ttlWfkD zB~F%9aDmg`I$~4=mP@v4pZ;&Cj}=GFoVUz;NpMccayq)A!LgR>@~A@RTdP=_>K;~s(ZJrtKF@hO->EdK={dXDJfw1h+f}@kNZ(@5 zthK)cLmG;yNUTm7Z?o7;?!sHNFT zX~)k^)NOqd+-hepIt`6n`Nm=FC;cKcThBn5U+H5ik^Ts^H!5V3lWojX{hb}M z2i!56LlKsx20772l`3_TWrJ~x=3rOyVrcad8o;fX%Wh31>51gdT-qJ}&De(C@KcICn zdI8T+hn;9iFk^X=c&u=rkhKNbuqHplIsH(=fC0I2exn&hsk8 zT?AN6$zEMt?Li~N%e)jcH5Q2dAX8SD66 zDuhRRA8R%4AUw9Q)3dqG1gk@)&a~se@U|j!T)(S^fkWXFV;Fy}E7a@C0M01pL^@AX z_!uqXWxQGUQCY^X`XSv9d6qdX@qFV+Si}d^K?;{q*z26a_p7NqKqtUv?bms&~9WEE73*~dR`kVHW2^J&^dq!&* z!3tOgFHmpE<#_7Ni{x!EA{KL*zD~c2n`3p1(Hbj9qGg)-INuF*#4L2CGoIqq`??$@ zouvnQZDPL6YdU&e@h zjJ|A%wV^9{8s;C*Qlebu>ssh458@hUDHX^~YOiO2A8?biT8}h}xSP|O49xZqqwCO{ zThu|C$ZfDSdiV|vgmfoxe|lVx0o!4bcF|GQhU4`vc6ht<6F8H8)v?$o9Hq*fqx_4y zO-G!$a*LmY{hTY&U>u1BYu!Jzn<6D0HGhbz_!HXg#L-QOq<8cJ>8buit>&uT;6v)d zZ%RMPphH|v(|D*f<6(S;Yv>lOqjnU|%g}SJ_!Ra*e@Zp*!lU#ZZj9N$9C}e!QJQA; zFvc~8SE(B`Ne|&vIjY<1*ZCW+jkQlrWD*zCX)fg{)Pl}}L9)JHKn>K>u&s|MkJ_Uz z>NBbkEoj6=T%)V#Yi>gAq(bs2o+ry8@M>0Y7~Rx6xijTbIk@;ff+cPzF&L+6{y`rD z`&tDp)f2gqnt^$nA{itHbbqX3*+;u@*CpPCR=msEyc3LiHbwI)?7Kh3@N4?2c;ujC z@*v}oCYlbWxHp}zxKQG$K7Y?|QYN34wX~gj%6@u)%Qy;Frk#{gh5krd^0)eL-X`a@ zms&^({jP1k$)D*oo~Cm7HGNY`q#bpp1Cm8k^?v?^>(OC~l^Hydr-FU6C*<=W1u#CZ zU_=Dg?q~keI74yT55~zQ&M0W)8XZlUC~r163X{14sb_I#?B*1(6!`ML#kzK32ad9qJuF{_1`hi)r5?1tUQ;IllA zKGFlRA}vlY=5L5}$m?m*@uO%TnYBoszR^B>Fx~tqNel8h``xD5n93q=G@Rs}zIFae|Bm&))$4Q%?Xh zWDq&U}{xc1`d@I0- zIuhCxOTVcxz|M#9jP4e_&pVAyoCdoz4|?cFK0lGHgZ>W69ql9_%7*9p3yfhT`>`q6)6FQVq_%ARzM9Nx8g6&IG?Z6v!T2&&_ zh%_3=G~FJp*{pBzF0~3asG%_ib~ReHlRi|#8|65jY19b#AmM>X4uKQ0FaJ#2U~gN{ zIxd%>9*-HgQgF>R0qV`AC&bSl8ihR>7j*@AS)K*+d?5n97>CdU7;iDyZDtv&a>S#4res%KsBS`rwjMYx?>iSUI zeC%r9$qn@xv0xwL_!!XFDV?mAz?S!uFS)1AlE36(Aeb0cL3N-BnhJDF`4lyr2aU?m z=~4?EEy+9qo;R5;0Ue!l96T4>;`}U))pe(Y*QinSKYbXx*n8@Y(gO&$AJ2uZtN=pE zp?$DN>uDuMsv`{r`dJKXI|r;n-|GbKfz^6Tp@nHEXTH3{ZFN&vx?f=-yQm-0`zK@{ zEN>L-?k4!SSXrxwayJzT{XL*E=sMUGqUAehKiGUb>CdrOe2D&2pHM~ja3nB86iVC4 z%k?VgP(OMTx~agMnF{GKDMi_cbk9QL>r+ce#CNof_Jgf47ZJt=PS;aKOIv!KEtSBp zgN3ChA3>>2;E|8Q&c{&}^sSWEaIAVBY{^)O13eolU8F*v0*m8Ql!LYn=EcBeC8$lN z?Bc0lu^R!&Tqi{`gCc-A%5*M0r@jZKI1S0|3Fg&?@K@#V*XLo`wQK~_^EcpMO@e2z zVDg}D- zsJbDOX)>5}hA_Ea+%BQ6DCla7^qprJ+Jw@Kqo@~Aw6x#6wg;=BX9mJ001Y9+8shWsw)z#^Ru zY?{vT;D@S(=WxmLD8BPxIWxJd)Q4Q>!xJpy$7L#dC|jmV2cCi!4hP$10b-SNv3f0Cb|gc0c`)zf7qLG48s}oXauI2s1$#FvH!w>!*OnVJ0$6J! z2T=CMz%I$aW|t_Acd>`NKx*c2d(J>!$(#s(6b@e(h3h-e&I|Mz{BI5Uz_2!yXW`sJ z-U0^jDq!@VXe#ctsf>o8J-6v1MInb+NZD(^&gHZKXzd&o5$56Gy+&Z{HGDF`-WQ;k zW^oa0Pec`$~o=Q3)>KY%wi75QXxGrCUAfFerCkFj4*d3*#` zB8&%uyZ91tS_S=t7$*s=VU2+|UqE|y0=E^SH6!57PGKEFIn|ar=$*~{0(SYl4k^xu zrTh*3w}Wb-9(7RH7#@K;wgT-eLVG@=j=1wEa`tnO`qEs)Db@NuhWFq;z=RFud9>#W zSJ8I_?nQD#uIfVv20_9yxGnFery+Z9qU}ZK^+fuCAC}Ej1WfQa#wtIP`?)Uaw-L(&~RKA#0_qUKI$Z`kfxF^z$s^WRg=a%I?`hLi z9)}!Ept|#9q5jZA$VFF~1y+3y&HbMC0q><@EYIU?3gpZO`_u=07{{BC<^*u!0<dCnP3IE0bMAVgB^nknyNt=Vd z-vgbPD^Ef)jzOk#s54m3)8H$vLHjzP)g^oYw(T+Ga|QY|5wTob)MPA})nCS_SI7hW zE%gAydL~AX<~qLv&Ik z-4F#NNIYVa+UlOK*$KAygBY>Z(nw%U!7guL?r#dbQUz*rK{g|XDa5{k<7jJ76^m9E zfUiD}ZFu0;vX{S>2vx$}!D+u1k-(=?CYeAYrFdIFlC+R(V1|gonTHV_RB~TcAt!mb zY*LNkXRow272#;q=IMtU1_D(saa@$ z5v~rBQ^=>Sv{skEo-tMaRD`IwkJ=38lvVOR-f>U@Palu_8iD;i4sQrJ1up&NDi$sJ z5AMtWj`#=pWP_7bfEee4zy49goRLPkY>;==JBZ~{)O=M2zN7@Su@Bxw@B`Swi*UXJ zA|a2;6OUo3r@`KS8JOmn^fZphPALcPa6io4+3J1tVhP@ea0zqm%}~47@OFj!RSw>! zZ~&ZA+tDL4)hQg`klw~_X^*)d)K0FehcIIlp_&*`YN6DqCWuw$sc~wL^j3>8JN}CL zQtgoL>bklGRMOliLxg!6x!#Yld(cQkpS3Vt7>jVj#Aq#4n=nde(O0{W=T5Zdx)dPK zeDuMec#B0Y#_d6j^BpxBy{wR1D{$FwRW&?DZB(Q1?tq)<@uv{6-9c=;Qgv3(qE~98 z-y_vb6)EfGxEcaB{I4;33`{o{@zX=7=abNcQZ)$Y-iGXu1QFl)feJI!KuBsIwF=`m zP`!Zn6LePlp+f`J)0o9R4y4#tddL)2U%uh~YONdv!mAHWDMach^idPF0`Dg9so{w1 zEkiMdd(JYXkQ+!fL}J#7Gmsfs@L?)c+XHt%v=L;VPnZo~Gx zB^_{X8WY-qG|F7T55hjo0t!x+Ey!~;GSz*)gzYG5EY79nresV6F0@=SIR3H^-GnA+w`Uwjr`|t~|QG&cV zTn)5o4}a5uWG3P$ANunFuff$9fvRT% zr)5ENry*?;Qon>$nYfmW^E2_6_V1nJfmz1>n_nvKc@1waN(TBIiC& zIs$pzixhg{SAQIh;_-+(`r&vGt`5NUp(tlA-ip+d$KcvvV9(J&6-mH#srV#AckiLY QzWBSB59U^YF$ePh0cdaFUH||9 literal 0 HcmV?d00001 diff --git a/sounds/blarerogue.wav b/sounds/blarerogue.wav new file mode 100644 index 0000000000000000000000000000000000000000..17c129c638114017404c5590adc00c08068222cc GIT binary patch literal 27250 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 literal 0 HcmV?d00001 diff --git a/sounds/blareshaman.wav b/sounds/blareshaman.wav new file mode 100644 index 0000000000000000000000000000000000000000..53be7bf0c1d8504aabf64265a93e3de69a6f08ea GIT binary patch literal 27224 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�+ifYii_%fPAPLYK|MxGv4aJa44WXGL)c{dy4f+E$ z3FeFeVs!e_-ZY3d6wDuWX&u^w4x^E@5p72Gw2hGR)rDtc3T;YT(m^718#Clh!YxG2+l#yHMO=5A!5SC5i5Gli$;lG0X9KBsfXyRO5z|vV%*sXp!p(PLb6FI zDHG>>@=b(t#5;RMzLQK5dLcp|g)i;C;7xfb_;4NyKAfB4NEPSPe-!Xb@VCcA}{wZ4HsS zJz66;hK8U<;{IHrzjhZXrlWSKztEV5iZmTXo|R~Xu#4u4JHH5Pu{#Pz<3!FTC>sW# z>Y|i9VTUzDE*OhKMNW6*gf7TMEJS|dY7*Lxp21JB7Wx6HC>=&1p;ZWeqmHPPuq{0B WR8$HJV2Q9ea^Z9M0X7r-NB;*W7WMD| literal 0 HcmV?d00001 diff --git a/sounds/blarewarlock.wav b/sounds/blarewarlock.wav new file mode 100644 index 0000000000000000000000000000000000000000..c6963c9fb9e797e30b9e67355d25bb144e034f16 GIT binary patch literal 27224 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 Jks2d}{trz2)ZYLA literal 0 HcmV?d00001 diff --git a/sounds/blarewarrior.wav b/sounds/blarewarrior.wav new file mode 100644 index 0000000000000000000000000000000000000000..b878f9f8ff607ed29f36babeaea871a35511d2ab GIT binary patch literal 27252 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 literal 0 HcmV?d00001 diff --git a/sounds/blip5paladin.wav b/sounds/blip5paladin.wav new file mode 100644 index 0000000000000000000000000000000000000000..ab2e65861940d53baa0cfada857fcfb9232aa279 GIT binary patch literal 14684 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 Ku4Wf$*8Bri(|NK0 literal 0 HcmV?d00001 diff --git a/sounds/blip5rogue.wav b/sounds/blip5rogue.wav new file mode 100644 index 0000000000000000000000000000000000000000..bf0bb4b77e10284eef59f95745f9b54f6a167cdc GIT binary patch literal 13802 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 YuI|0N^y%Kd|G@t_HgjiBUN8~-KPWWd8~^|S literal 0 HcmV?d00001 diff --git a/sounds/blip5shaman.wav b/sounds/blip5shaman.wav new file mode 100644 index 0000000000000000000000000000000000000000..0921ddbd2e07bb25cdaa1fd429b9ebb7d92efa11 GIT binary patch literal 16442 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 B0=EDF literal 0 HcmV?d00001 diff --git a/sounds/blip5warrior.wav b/sounds/blip5warrior.wav new file mode 100644 index 0000000000000000000000000000000000000000..8b127c4166dff8b02a7a39104d6f5d338a5bd270 GIT binary patch literal 20086 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 H7V!T8A?x%0 literal 0 HcmV?d00001 diff --git a/sounds/phasers3.wav b/sounds/phasers3.wav new file mode 100644 index 0000000000000000000000000000000000000000..0222b030372737386f901f676e9d5994263498bf GIT binary patch literal 4124 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 Ch!uJO literal 0 HcmV?d00001 diff --git a/sounds/phasers3hunter.wav b/sounds/phasers3hunter.wav new file mode 100644 index 0000000000000000000000000000000000000000..cb928f1ed53c6afe8b8c6e757085b7e5a6e64b5f GIT binary patch literal 16060 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 S?%A8C|BstJW!C5!0Q?^_jfOJ- literal 0 HcmV?d00001 diff --git a/sounds/phasers3mage.wav b/sounds/phasers3mage.wav new file mode 100644 index 0000000000000000000000000000000000000000..9ae40978cb80557155362df84c95e18916479d47 GIT binary patch literal 18086 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 literal 0 HcmV?d00001 diff --git a/sounds/phasers3paladin.wav b/sounds/phasers3paladin.wav new file mode 100644 index 0000000000000000000000000000000000000000..a6dafe084d1411d68d660c26bb3d5aa1630bf40f GIT binary patch literal 14684 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 S?f)IxX;g{ZHO3xW3jPm2t*Yq& literal 0 HcmV?d00001 diff --git a/sounds/phasers3rogue.wav b/sounds/phasers3rogue.wav new file mode 100644 index 0000000000000000000000000000000000000000..d56c06a56ceb2674efa390d63290710583e45198 GIT binary patch literal 13802 zcmeHu_jeP=_x6-+(yCjMZMk3@n+_%v1I857d+!iR=)EWO5_${0Lnxv55Q^!YKq#Si z8;k*CNw(Ej+h2Wt`~C~>InkV%ozd>q&bfPM?{lBI>e9MJi_f(I=$YN4`LMB5k}LoK z7%7d*05Gp100@{O-wYcxcnT3YK5zgqWYCmBn<5hb_wzrA|CRsA;z&i2s*4mO&_r4T zpd-Jci<~ioSYQJVkObm^JS>);e5Cl9)}O%P52kw19wA+Iv@p3ho@j7`UV-qpabw2oPg#b5L#J}Uicpu)1kKqk?KK=z?$G7ns`~X{s)i{JDoJJhR zZ*e=~1NP%8gq^sCClkwv&qOVvERjQG5b;D0Vj?kt7(pB(t`n1q4a6rRiQGhdAa)Qh zh^2%-GWJLM^~f>gd4eG)khh2^@-8u$d>E0KPIe;w#7%M_8BY!-8L|iYl=zqQ5N2{+ z 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 A9RL6T literal 0 HcmV?d00001 diff --git a/sounds/phasers3shaman.wav b/sounds/phasers3shaman.wav new file mode 100644 index 0000000000000000000000000000000000000000..0796a7bd2ac4dc94664c96b79918ee068678b59c GIT binary patch literal 16442 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 UtV!>{9wI?3BXb2O$Pn~@04r$R+W-In literal 0 HcmV?d00001 diff --git a/sounds/phasers3warrior.wav b/sounds/phasers3warrior.wav new file mode 100644 index 0000000000000000000000000000000000000000..a69c8f5b195c2393188bbee145f153666c7b0d7b GIT binary patch literal 20086 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 IG!^*&0DMjFi~s-t literal 0 HcmV?d00001 diff --git a/sounds/shrink.wav b/sounds/shrink.wav new file mode 100644 index 0000000000000000000000000000000000000000..d60baf3435efccd019e8d808140c1bcc22f09765 GIT binary patch literal 19998 zcmbu`OOIXISq9);uDh$sU3R;j1SOQ^~<91p;H`Dt* z%k%$@6JdSsy#B0D@B4Ua)Z52xIA717tLbXG%;#b{f6wP4_b>9)DC2LxA+$F0+n6?| z?R<8o-RbVMm(Tv|&tC5A=Kgj@tVaq5o|oZrHl0o{r<3_}JiVBX=TEOs^5k^>oQLyO z<~Z(58=@${)V~f@AC!-y!FePAsEye& zwaMMtBCIkjv-OR{!yDI;X!yVPSiYb7%ky#Y?s|A^=ChU0X3p1NKfKATdi5-J@Tomn z6bFaz1%V6Q*Cg^a5Vl}zBRp^!pZ6nd;EUu%7aXl345|jMR&^?(X*E8yTm6jtP&JTU zj}Lu|pVQY`8*!v5hSwcPgb); ziD=x(XM4uMZ7eJTUIe8_`6km8U7-Ciay*=|y%j1$kLMW+y;m70p4RhsBebFYbe82R z{BhWe7P~VSaV@GFO?bQ0Sa1B{IwE*C&+&8IiM~gP&C^`d^=j5&H!m+RESKjJ%yCWEYy6f11Dh(fKwSu+tR2?#U>gUgzwC{JY6~ z=X?44Bx5$_$QSVr9+;x>&FeGw+}RF4I@ikAp~(hUv#itX_l?-*NvJ>&pIyY7N6~04 zca)j4JfA}4Fi)>?#iO)g71CX1^m%0YXy$Vqv~46e?dRUhXtb6rwUZf7GInS7=~WQ; zBs?}|8(!tCSlSMS^-$f-%%jZ110FVVO{OVNk&``GowsCiT{TnYZiKyX|@8Ml8+;yu>Cv4F$Xi(J+hOIPgI4JWnAU;!l!4E+PR*<*U=& zXWi|bKg&~x>@L^6%!sw%=w9eRzkIr%@i4((FmONLS2-gW|M49};KVktacAapn~1&6 zh}+D4l{>X6iREvZ4MlN+mTY*F(J)MU@*d^(yH<^tGrFpYs&+AF zvP#6pH@Ww6zMrX~a5pp$a#w~s30JgmBZ;_zqy70B&Tb;7=)A}{{=?xQI*T+>O;R<0 z?CdJm$+(ug{&t?c0yXQi%~oB3X!XKzHm&HTHb>B5y9&W7@) zjsiA#su6sYyW)Y*c!t!&>gK|NNlKnPlKa z614Ye9ud#Yre{F_B*;Q&z{+XHt2vD){)aSv7O$|Z$6!k}Q6`e3=)wmiILjROrcmd1 zh?ruZ7n#448MW~6?VUNwWNG-N?M~(&<}aDW_p8ia%Pg_H9qP_sWE`Z5l7oz|-)Z2V z4Csjny_m;|J(*B;+0H#@=8Ka?3XRnsalytdPgvOXLB7@5XBnyL!u@$F zw+y(RkQFCSy(Kb%)Ix)&$G*L+RXPwbX$-0 z9!4{IkXT;O(eW2-o<(*s&Jr~4Dnd5>aJCAY-OXGmWHG&kp7kcx*1X5FW{0768A)E{ z3PMygF~{>?XD0v1z5Fcp_99ig;M@pBa_Wg%EpLJp*^zzR*~|!0dmH`8@SV(6UDoDN zyoswWc0G6W9bF^p`1nn{i8}dB#)Yt#d9s$fa6QFByP+WtNY%*b-CE^1{ZgNNn7M2$ zw!X@@`TA)+mUxmS7AO0sHv~K45EVJ)Ma=Aix zO}dL<0-siu2eHLkI3DH6`mCdo>bmX&1?Tdc9!X|HMJ+nb2$kH9_WfS)^eva*eFCx=4$GWHzmwKD)*y3Kk>4*>6)L(HYYtxv0 zMFHEJ%RlRh5`DF2(D5*L)milz4M>qWFgeo4-V=bK?&uz@e z*bH5felJ?+!1%zb>^2gseER3E%G8qUa29Q-y~-1QW>wgxoADyP9(MPGjQl7g_?Ruu z!b8^B%3lZ;X`3^J)6jZ2OE2E{W;!e>C$&DRe}}QggW1|*&1_vsb2-_pcUxno@cFZc5FCOXNJI>^>Q@uCA|eVEp(FIu7qDQH^tbrq++d>OfQ z^sFvJ$W!etp5@y9z(H`n8_LC_)$l=NQc;dF*7}$|^cS?%4HlKg zKhG1DV13pCnm2N<*!o_qD&C%i7KyD-NFWw?UQY}&S2IO=o#%`P_VRB%TtvB!OupVt zBsD{`H>@1zelz)(p)VRf$~-s~IcDyJy7)NH+1k9G_C!Qn&f{)F5jr2|-}l0yRev{> z&6b;wGMeo7qZ0{7Z>ZN0?^a-RISq~LjC~Z2*7bH{NUK7u#m067E+c`=t{%uF&1Y&P zZRB2a%SFgbvZFez7VP2Zj8*h{hdNKZ6GqC7_@xpc{<){(6u_cGFoR}EE__1^kP z(uop>*qY{ivXPNS$kpQAb1NH>05{*tJ+TA}_9oZ?M%ZjEJ`=6b+&GefE@Quk8TBMM z#pz|9v7IPBh+e1De}qGk-~Eb%(6G+269mtD8Oc*naTeX}>0Cq#df~M(?+x&UtZ|d? zCmH==EKMtGzsIx8e9M+rUCn_yiqr79m@TURa;;C-eLabc&4Fe?H~i{Bct#}?E%J(r zYHfa;IZ*Z}^I1SddUBm{GK5N~CwUhAtQA`6u4jo@q+Ps-wVILptZE_f>1?;ljD!hM zWCgA!+LPi!UVHPbrC9MxL3cpNRo zB`fRO9_OyTf3d{>k0Y~ZA`$-CSI$xcnw{ZNC)~A_2vtK}=_b3&^PA}TEb`f>*a-); z@rM^^!tFA=c5>euU^`ZO6q)Vui8L9dD?3(TH{R|Zt$jMX7O?o6S=Q6gg|iRmzwNW_ zHP}^R7dRIsI&%@RolZ#KEO*__EcLV*NxtGoRbI}ZsW>O)=G-ai-PCKoa$mJ>o=_>- zLRSSfmeD`z>G_?EJE3Zor#Eb0 zrmpKZ`LI#c-Hoo?dF3>j1Zs=^y^MtbNK_Shpmnw@=Z%jHo;9_Aq(2mQJ2_@{rFLIs%fldChxus zhV3qs<=*rMk?d8t@q-%Y;P1mc^$y7zNQM4xw6}(m+t|nc5q|ba?0Z10!e=e;BFjNR;WUCtitszJ<>NEWkdQPJ2yH{CU#^T*-$AaqryFT))jSzGTZexA=X zWJA5e-RLG(_(AWjXI4MNinkXhk;^Jl+}Q1G1iIg9XAH|&(>{+JW^aWay-7`Hd+Sr= z?ID}u_bg-S<2{Jo81HS=LcIkq%W8T%?`3F5qV^N5<#M|>h%CS!_Uyk76_~Mpv|H6I zz@Ck6Sd^n6mS(gin@GgdVRw{w;mkdKxGc)cmCPC0yWX%zBHmkF+adC&K0z*I_tq_Q zP!(_OiDgo~i5^3Zto`LV5$?^MIj}`?_{QlrV;|2|&pyUp>~L_n%xi8 z_Tlyy^~a2Cw|K9BNAFvi>$tnm?Ohl|>CjaU)n9ax%KFWkt{Anm z)BT6`I@LoITu=WMKd}}>Yz2Y0@fwTEi15S9aIW&YhE!bWuO{$EeQWo$^+xB0rZtm2 zTXwySZS1hJr|2h<=j3G*ny>}$!2GCFaA8&H!0Ub}>D+63o~d?_Ze7;h4Qp`SLUXJv z&r0}qhvwC6A$4{y)J3*_%1TeIR`Vgx+lKn&)tuF6QFN&VkZVoG#`bi(D{bwe1CaqM zWvh7cMjjQF*F@FOgEbs%s;h;3S6zvlfSbON z@kEV+;2wNpm%>|NPxNEnNa{(wXOmM%uRkjK`IhC>Pg#;gqEMZXo%qnVtK|%R zT~*&`)Ox(m*3C7lHvB;zU*6AXb>UgKu(Z76(DM(gL9X8BWX3WsIxz39MKRmR8@jyK z2RYErGB3!%I%d%?C*w&PXyfn8+_CSWTGz*o}p7f>Bjk zwH;U1R6D8cGI?VSg6vAFs#oD*SIcgh-6OG}k9!cBP+-=07bX`&iu`hsJY+wb|I`A0 z8Fh}|MG}5?&LFY&lZEf3M&rwpR@U+&o8jC;6@-P$NOYbj>Yd6WZgkJkq|1RgHNm{D z?ASxLzMsGHtL$y3iRJnp9|Ekv)dAMBD)bzt#7X_3r*hXDTOIKINZih|Q6xV>lwV1~ zoV}q|1;|lh9P+LVD>LCG%j=!{8wZH)UcO%ghyZqIY+e=}p>jAe~vYyAePSgd#wOU;|@NM!)Mt@qoo%4h8wX~I8!6Jd9pg&o%H zJYa;Vw`a{WT~XA2^c5vKQSW3R2-=~f`G>^tVXs~!!K1f#ItIH}tp}T#EngPrWT1O@ zKp;%KH9vJHO~s)Di?f3Rii%77t9&Ywn(^xuh?Egn4gY~@s|@QWxwh*WT^n0L0t)Jt z6||jNhq`MINcOf0Jd01wl|SH_^vzSoS_jfjO%@5T3k@=z-`{i>&t8YFL3DYh+I2UC zv^`L5ugap{``Srtw5a2Hj^ku?Hm;Z5HM@0$tP8d72y{Im+rk7JS`U#x2I#@cDy;dU ziA`!*@z(t(YdW)w>%OUkSRS@2(Xr7QWxbqLEsEq5J8JjM9Bq9&KeB&kus4(%PiJ^& zPGJue#?CMv(4l@oCL8)a6g-M7sIVUAW51k{!Ovnf{P0lm^-FS(e#pVD*U2a95-ITa zc7z8Z$z5LSJIJpyQZ*DikVj&*oW0ctaY|cu>n}xMuQ4p|(MP`U_JcIu)1f6Iy}_t2 z*_vdsUL`kzo{sKj@`)XZ?g^p@dv?9LLdQ!r-pjSzqXTF*9ltRh2(bUK#2Qqq0F7oj z$Um46>-Kf@YqC`5S4Mg{WG1qTMiHi4G1vQjelxDUnp)IcFRP51Ims+>CF*5?Vo^;e zH*Xd7Drncp=I8;t$imPxA z&pOxYdsu_LTV>!%?(j<~d1ORQdvyAmBbP#g9>wm2e5D^UYDAk+vYuW6irQU^5OKl3 zeo@fh42iFrlbvV4C2~a;2M-*;6p!uIyBw_ML;d>TGkv$WL%1LwMgW4*H8f^BSjS!KR+4 z-H*LjM=K<3i_ekqbRcS=9-%D{GoppS7~d{iMc|=458~;yX8T)C$hJzrkuUEnf1J3f5Je zG0oj4GwS%Y67z&CHu_!`D_Z?#Ti&WC(PlXrn$$A046Z9@;UOE`!ciloUL^$!>gYT( zMn0l18&{9k0{#~%a81|Z0q;@UG9dc3k8G6LofvkizpdY_je775&i!=-T}xZuriJ`o zN`14&Hs#jL-#rqDqnD39y}w8i6_A2vb%8xOONLv##rocxk1nYDjeI?%BrB~|eA=+1 zr;yBA&gB|-(MMRh@`_AkT?T#Z(h92+k()egj*u<+Zdg7O^2B_$)g!a%$oRP7Zww5h zPo`!a9%$d!j?KJAj`7{EB4ghk)a&F$tE=I5BskQPs9T9ZLphftoBNSr?)4XcajtDnS{8N+X^X|ygISF*?t z<(seBm-RaS4)`*T*Z9%e+F_LYX8RT)V@B^nkQh{F9OM#LuqbyzSyzZq+8P0yb`MGk zUDCq$s6L*IjICd4m+LnvwNpoqwX$s3=qM^x#db=Sm{gEBvYBW{zxd~GzbnJDk;p=_ zAgSCLeqW6XwD{h4>GoO&N_QUM5nZZifdcbcp&H{au4L%OJ2dNa)cks;`KGvTcGGRv z+ofN>w2QB&{DpXXA~e-SkVcPTrk=uetzfKk(P<1B#d*8XT;%Bb-Pu69^GfB+d^sD( z%2t}q8m-$r+r9`FS4I}aLnAwXp0)C~)|q7_3_vOQM7IC=flIID3upC(xD&(t0=X(r z+ja{t_hkc&{T^X$53tuzaHu@3~9W>_d|>~+P6jt>rI+7*`B2EvT;feGFo-R`P~ z^6;&L=8b#&YJs8w24yci<*?x`1lpZizlk!qFG|e!tX44c&7;VGlj~gze3g`Pi)1vHLcE=U zu0igpB#T#zxgp8o10z_1b(QWo;3ey4320by*2fqR*g~QSN4_rRPce@fr!e`D>O@S z$y;os^BE`<|H}bcdPy-{q_BfZs(M%3qQIQmTV%HLYP`Cy8x>*0tL?~Wg9GkkY^kUR zebyY>oHuO8j_n;w`zY%&?{~Vh)@advcQ?+p*lq2o2by3Dw~GD_WHb_a9VV$AC|f0M0QbU{Ja zBF*&!xy@!BIj~r1*h!Su7INjdKQt`21}ngWc)F1 z%x{D>(~i1QG~r%94-c>M9a0SbrH^`R68iGf+XtP8U22PE#E^|WRuS5j7n?4JvBg2N z0a^QxM)=kWoncI6;s0tjB8xP&xg1e_e11>0qO0A z$MYhxxnLCot-S+Rt!_j2>fM>8vskmT)r!p{gA*R3YiWP%Nim|ft_lT3PArAPcF6ZHF%I)@Or1Kh;z1EaaeCuyc*>f%b?BXG80vq+V$rdp+Ts zujU<>MH%@zyZPsvfq7mHm*?%YaBHW=Q9Q%#3W7tW0su{?UN_SvO6ba|H}|GX^;T3v6Es8aKB z$D%l_x!~zt${i=03?KInZbmPj#$jl*N@qEzzfbutR)Pcc>DSEJyo$q!mOOszsK+}3 z@A84QT6*C-CRSoso{hL%q#olchf(!cM~|l?-UnL8{aUtnS241BZtSqXIC%S5Bpmv@ zPm9I_I}ZxQoSq3n6Yr^S*7WWH)rA7JIx^UH*Vam z*HL*_`Xy_W%kTTU;HOeA5)8X9GsiO;kMm*oj&gTc;oW)el*{sLAY5d;nUiV}x(yqX zb-_T9J9HoN6s4&4ju`{_gZJXGMUGW`kGsRmu9uv%JRMbT)f(gJ>i4khD!uXiebySf zj4}Ow_wM`o7L#wzZ455=%9UL2+G5H3i>;TLZ%Q#NIwTy?TrVtR-yB!mj;H?@E(`y6 z?KP+kdd9vx%AMYAx4K%B7wXH|puj>4nntZ(#;u-p?*SpN{k2&nq1M^3$LG&7WlCr$7GWC!hYsPyWhJ%75_3AAj=eU;gsrpZ@c| j{^}PW|M0WVe);py|0N@S@FTATe){*n{)b=v<23yb=~3N} literal 0 HcmV?d00001 diff --git a/sounds/shrinkdruid.wav b/sounds/shrinkdruid.wav new file mode 100644 index 0000000000000000000000000000000000000000..e57f7c13e21f26a2bc8db6fb8324681458a0748c GIT binary patch literal 23184 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 T=+o`R!Eiun!t8ldCSd;uQnK|0 literal 0 HcmV?d00001 diff --git a/sounds/shrinkhunter.wav b/sounds/shrinkhunter.wav new file mode 100644 index 0000000000000000000000000000000000000000..d93e17e95b26d485cb869a1369f15fdf097841fe GIT binary patch literal 21666 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 TN@ddR+jm-mAlBELJIL5ywnq!1 literal 0 HcmV?d00001 diff --git a/sounds/shrinkpaladin.wav b/sounds/shrinkpaladin.wav new file mode 100644 index 0000000000000000000000000000000000000000..e71e7be208924aad656ad523a7357a14ff8f9be5 GIT binary patch literal 19940 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 D&*1h& literal 0 HcmV?d00001 diff --git a/sounds/shrinkshaman.wav b/sounds/shrinkshaman.wav new file mode 100644 index 0000000000000000000000000000000000000000..a915f0794bdb540709de047a956de0a29ce8e416 GIT binary patch literal 19940 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 Hx;6d*mks+^ literal 0 HcmV?d00001

    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 InlM@VKhCM`jsO4v literal 0 HcmV?d00001 diff --git a/sounds/blip5.wav b/sounds/blip5.wav new file mode 100644 index 0000000000000000000000000000000000000000..55d6dea74645506fe30a75aba109d123bad8510d GIT binary patch literal 2460 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 literal 0 HcmV?d00001 diff --git a/sounds/blip5hunter.wav b/sounds/blip5hunter.wav new file mode 100644 index 0000000000000000000000000000000000000000..48a8a7a537528d94247a1f2bd4ba0e6df33dc16b GIT binary patch literal 16060 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 X+OAuNmOXpx*yr)Hr_35N1AzYrU+#9| literal 0 HcmV?d00001 diff --git a/sounds/blip5mage.wav b/sounds/blip5mage.wav new file mode 100644 index 0000000000000000000000000000000000000000..b9b33cadef52a67c6326ae6ad9d1e8c9b0195ecc GIT binary patch literal 18086 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