287 lines
7.8 KiB
Lua
287 lines
7.8 KiB
Lua
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local ElvUF = E.oUF
|
|
--Lua functions
|
|
local _G = _G
|
|
local wipe, date = wipe, date
|
|
local format, select, type, ipairs, pairs = format, select, type, ipairs, pairs
|
|
local strmatch, strfind, tonumber, tostring = strmatch, strfind, tonumber, tostring
|
|
--WoW API / Variables
|
|
local GetCVarBool = GetCVarBool
|
|
local GetFunctionCPUUsage = GetFunctionCPUUsage
|
|
local RequestBattlefieldScoreData = RequestBattlefieldScoreData
|
|
local UnitGroupRolesAssigned = UnitGroupRolesAssigned
|
|
local UnitHasVehicleUI = UnitHasVehicleUI
|
|
local IsInInstance = IsInInstance
|
|
|
|
E.Role = "Melee" -- TODO: Save per specialization?
|
|
|
|
do -- other non-english locales require this
|
|
E.UnlocalizedClasses = {}
|
|
for k, v in pairs(_G.LOCALIZED_CLASS_NAMES_MALE) do E.UnlocalizedClasses[v] = k end
|
|
for k, v in pairs(_G.LOCALIZED_CLASS_NAMES_FEMALE) do E.UnlocalizedClasses[v] = k end
|
|
|
|
function E:UnlocalizedClassName(className)
|
|
return (className and className ~= "") and E.UnlocalizedClasses[className]
|
|
end
|
|
end
|
|
|
|
function E:ScanTooltipTextures(clean, grabTextures)
|
|
local textures
|
|
for i = 1, 10 do
|
|
local tex = _G["ElvUI_ScanTooltipTexture"..i]
|
|
local texture = tex and tex:GetTexture()
|
|
if texture then
|
|
if grabTextures then
|
|
if not textures then textures = {} end
|
|
textures[i] = texture
|
|
end
|
|
if clean then
|
|
tex:SetTexture()
|
|
end
|
|
end
|
|
end
|
|
|
|
return textures
|
|
end
|
|
|
|
function E:GetPlayerRole()
|
|
local isTank, isHealer, _ = UnitGroupRolesAssigned("player")
|
|
return isTank and "TANK" or isHealer and "HEALER" or "DAMAGER"
|
|
end
|
|
|
|
function E:GetPlayerDesiredRole()
|
|
local myRole = E.Role
|
|
if myRole == "Tank" then
|
|
myRole = "TANK"
|
|
elseif myRole == "Healer" then
|
|
myRole = "HEALER"
|
|
else
|
|
local groupRole = E:GetPlayerRole()
|
|
if groupRole then
|
|
myRole = groupRole
|
|
else
|
|
myRole = "DAMAGER"
|
|
end
|
|
end
|
|
|
|
return myRole
|
|
end
|
|
|
|
do
|
|
--local Masque = E.Libs.Masque
|
|
local LBFGroupToTableElement = {
|
|
["ActionBars"] = "actionbar",
|
|
["Auras"] = "auras"
|
|
}
|
|
|
|
function E:LBFCallback(SkinID, _, _, Group)
|
|
if not E.private then return end
|
|
|
|
local element = LBFGroupToTableElement[Group]
|
|
if element then
|
|
if E.private[element].lbf.enable then
|
|
E.private[element].lbf.skin = SkinID
|
|
end
|
|
end
|
|
end
|
|
|
|
if LBF then
|
|
LBF:RegisterSkinCallback("ElvUI", E.LBFCallback, E)
|
|
end
|
|
end
|
|
|
|
do
|
|
local CPU_USAGE = {}
|
|
local function CompareCPUDiff(showall, minCalls)
|
|
local greatestUsage, greatestCalls, greatestName, newName, newFunc
|
|
local greatestDiff, lastModule, mod, usage, calls, diff = 0
|
|
|
|
for name, oldUsage in pairs(CPU_USAGE) do
|
|
newName, newFunc = strmatch(name, "^([^:]+):(.+)$")
|
|
if not newFunc then
|
|
E:Print("CPU_USAGE:", name, newFunc)
|
|
else
|
|
if newName ~= lastModule then
|
|
mod = E:GetModule(newName, true) or E
|
|
lastModule = newName
|
|
end
|
|
usage, calls = GetFunctionCPUUsage(mod[newFunc], true)
|
|
diff = usage - oldUsage
|
|
if showall and (calls > minCalls) then
|
|
E:Print("Name("..name..") Calls("..calls..") Diff("..(diff > 0 and format("%.3f", diff) or 0)..")")
|
|
end
|
|
if (diff > greatestDiff) and calls > minCalls then
|
|
greatestName, greatestUsage, greatestCalls, greatestDiff = name, usage, calls, diff
|
|
end
|
|
end
|
|
end
|
|
|
|
if greatestName then
|
|
E:Print(greatestName.." had the CPU usage of: "..(greatestUsage > 0 and format("%.3f", greatestUsage) or 0).."ms. And has been called "..greatestCalls.." times.")
|
|
else
|
|
E:Print("CPU Usage: No CPU Usage differences found.")
|
|
end
|
|
|
|
wipe(CPU_USAGE)
|
|
end
|
|
|
|
function E:GetTopCPUFunc(msg)
|
|
if not GetCVarBool("scriptProfile") then
|
|
E:Print("For `/cpuusage` to work, you need to enable script profiling via: `/console scriptProfile 1` then reload. Disable after testing by setting it back to 0.")
|
|
return
|
|
end
|
|
|
|
local module, showall, delay, minCalls = strmatch(msg, "^(%S+)%s*(%S*)%s*(%S*)%s*(.*)$")
|
|
local checkCore, mod = (not module or module == "") and "E"
|
|
|
|
showall = (showall == "true" and true) or false
|
|
delay = (delay == "nil" and nil) or tonumber(delay) or 5
|
|
minCalls = (minCalls == "nil" and nil) or tonumber(minCalls) or 15
|
|
|
|
wipe(CPU_USAGE)
|
|
if module == "all" then
|
|
for moduName, modu in pairs(self.modules) do
|
|
for funcName, func in pairs(modu) do
|
|
if (funcName ~= "GetModule") and (type(func) == "function") then
|
|
CPU_USAGE[moduName..":"..funcName] = GetFunctionCPUUsage(func, true)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if not checkCore then
|
|
mod = self:GetModule(module, true)
|
|
if not mod then
|
|
self:Print(module.." not found, falling back to checking core.")
|
|
mod, checkCore = self, "E"
|
|
end
|
|
else
|
|
mod = self
|
|
end
|
|
for name, func in pairs(mod) do
|
|
if (name ~= "GetModule") and type(func) == "function" then
|
|
CPU_USAGE[(checkCore or module)..":"..name] = GetFunctionCPUUsage(func, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
self:Delay(delay, CompareCPUDiff, showall, minCalls)
|
|
self:Print("Calculating CPU Usage differences (module: "..(checkCore or module)..", showall: "..tostring(showall)..", minCalls: "..tostring(minCalls)..", delay: "..tostring(delay)..")")
|
|
end
|
|
end
|
|
|
|
function E:RegisterObjectForVehicleLock(object, originalParent)
|
|
if not object or not originalParent then
|
|
E:Print("Error. Usage: RegisterObjectForVehicleLock(object, originalParent)")
|
|
return
|
|
end
|
|
|
|
object = _G[object] or object
|
|
--Entering/Exiting vehicles will often happen in combat.
|
|
--For this reason we cannot allow protected objects.
|
|
if object.IsProtected and object:IsProtected() then
|
|
E:Print("Error. Object is protected and cannot be changed in combat.")
|
|
return
|
|
end
|
|
|
|
--Check if we are already in a vehicles
|
|
if UnitHasVehicleUI("player") then
|
|
object:SetParent(E.HiddenFrame)
|
|
end
|
|
|
|
--Add object to table
|
|
E.VehicleLocks[object] = originalParent
|
|
end
|
|
|
|
function E:UnregisterObjectForVehicleLock(object)
|
|
if not object then
|
|
E:Print("Error. Usage: UnregisterObjectForVehicleLock(object)")
|
|
return
|
|
end
|
|
|
|
object = _G[object] or object
|
|
--Check if object was registered to begin with
|
|
if not E.VehicleLocks[object] then return end
|
|
|
|
--Change parent of object back to original parent
|
|
local originalParent = E.VehicleLocks[object]
|
|
if originalParent then
|
|
object:SetParent(originalParent)
|
|
end
|
|
|
|
--Remove object from table
|
|
E.VehicleLocks[object] = nil
|
|
end
|
|
|
|
function E:EnterVehicleHideFrames(_, unit)
|
|
if unit ~= "player" then return end
|
|
|
|
for object in pairs(E.VehicleLocks) do
|
|
object:SetParent(E.HiddenFrame)
|
|
end
|
|
end
|
|
|
|
function E:ExitVehicleShowFrames(_, unit)
|
|
if unit ~= "player" then return end
|
|
|
|
for object, originalParent in pairs(E.VehicleLocks) do
|
|
object:SetParent(originalParent)
|
|
end
|
|
end
|
|
|
|
function E:GetThreatStatusColor(status, nothreat)
|
|
local color = ElvUF.colors.threat[status]
|
|
if color then
|
|
return color.r, color.g, color.b, color.a or 1
|
|
elseif nothreat then
|
|
if status == -1 then -- how or why?
|
|
return 1, 1, 1, 1
|
|
else
|
|
return .7, .7, .7, 1
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function E:RequestBGInfo()
|
|
RequestBattlefieldScoreData()
|
|
end
|
|
|
|
function E:PLAYER_ENTERING_WORLD()
|
|
if not self.MediaUpdated then
|
|
self:UpdateMedia()
|
|
self.MediaUpdated = true
|
|
end
|
|
|
|
local _, instanceType = IsInInstance()
|
|
if instanceType == "pvp" then
|
|
self.BGTimer = self:ScheduleRepeatingTimer("RequestBGInfo", 5)
|
|
self:RequestBGInfo()
|
|
elseif self.BGTimer then
|
|
self:CancelTimer(self.BGTimer)
|
|
self.BGTimer = nil
|
|
end
|
|
end
|
|
|
|
function E:PLAYER_LEVEL_UP(_, level)
|
|
E.mylevel = level
|
|
end
|
|
|
|
function E:LoadAPI()
|
|
self:RegisterEvent("PLAYER_LEVEL_UP")
|
|
self:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
self:RegisterEvent("UNIT_ENTERED_VEHICLE", "EnterVehicleHideFrames")
|
|
self:RegisterEvent("UNIT_EXITED_VEHICLE", "ExitVehicleShowFrames")
|
|
self:RegisterEvent("UI_SCALE_CHANGED", "PixelScaleChanged")
|
|
|
|
do -- setup cropIcon texCoords
|
|
local opt = E.db.general.cropIcon
|
|
local modifier = 0.04 * opt
|
|
for i, v in ipairs(E.TexCoords) do
|
|
if i % 2 == 0 then
|
|
E.TexCoords[i] = v - modifier
|
|
else
|
|
E.TexCoords[i] = v + modifier
|
|
end
|
|
end
|
|
end
|
|
end |