Files
coa-elvui/ElvUI/Core/API.lua
T
Andrew 8edf2d7f8a Nameplate Overhaul (#38)
* ElvUI/NamePlates: initial nameplate conversions

* More nameplate work

* Modules/Cooldowns: various CD fixes, nameplates cant show 'swipe' texture

* ElvUI/NamePlates: final nameplate polish

* Modules/Misc: add space before interrupted announcement
2023-05-22 19:18:59 -07:00

269 lines
7.5 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
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