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 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