--[[ detect actor class ]] do local _detalhes = _G._detalhes local _ local _pairs = pairs local _ipairs = ipairs local _UnitClass = UnitClass local _select = select local _unpack = unpack local unknown_class_coords = {0.75, 1, 0.75, 1} function Details:GetUnknownClassIcon() return [[Interface\AddOns\Details\images\classes_small]], unpack(unknown_class_coords) end function _detalhes:GetIconTexture (iconType, withAlpha) iconType = string.lower (iconType) if (iconType == "spec") then if (withAlpha) then return [[Interface\AddOns\Details\images\spec_icons_normal_alpha]] else return [[Interface\AddOns\Details\images\spec_icons_normal]] end elseif (iconType == "class") then if (withAlpha) then return [[Interface\AddOns\Details\images\classes_small_alpha]] else return [[Interface\AddOns\Details\images\classes_small]] end end end -- try get the class from actor name function _detalhes:GetClass (name) local _, class = _UnitClass (name) if (not class) then for index, container in _ipairs (_detalhes.tabela_overall) do local index = container._NameIndexTable [name] if (index) then local actor = container._ActorTable [index] if (actor.classe ~= "UNGROUPPLAYER") then local left, right, top, bottom = unpack (_detalhes.class_coords [actor.classe] or unknown_class_coords) local r, g, b = unpack (_detalhes.class_colors [actor.classe]) return actor.classe, left, right, top, bottom, r or 1, g or 1, b or 1 end end end return "UNKNOW", 0.75, 1, 0.75, 1, 1, 1, 1, 1 else local left, right, top, bottom = unpack (_detalhes.class_coords [class]) local r, g, b = unpack (_detalhes.class_colors [class]) return class, left, right, top, bottom, r or 1, g or 1, b or 1 end end local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS local roles = { DAMAGER = {421/512, 466/512, 381/512, 427/512}, HEALER = {467/512, 512/512, 381/512, 427/512}, TANK = {373/512, 420/512, 381/512, 427/512}, NONE = {0, 50/512, 110/512, 150/512}, } function _detalhes:GetRoleIcon (role) return [[Interface\AddOns\Details\images\icons2]], unpack (roles [role]) end function _detalhes:GetClassIcon (class) local c if (self.classe) then c = self.classe elseif (type (class) == "table" and class.classe) then c = class.classe elseif (type (class) == "string") then c = class else c = "UNKNOW" end if (c == "UNKNOW") then return [[Interface\LFGFRAME\LFGROLE_BW]], 0.25, 0.5, 0, 1 elseif (c == "UNGROUPPLAYER") then return [[Interface\ICONS\Achievement_Character_Orc_Male]], 0, 1, 0, 1 elseif (c == "PET") then return [[Interface\AddOns\Details\images\classes_small]], 0.25, 0.49609375, 0.75, 1 else return [[Interface\AddOns\Details\images\classes_small]], _unpack (_detalhes.class_coords [c]) end end function _detalhes:GetSpecIcon (spec, useAlpha) if (spec) then if (spec > 600) then --hack to new spec ids on new leveling zones from level 1-10 spec = 65 end if (spec == 0) then return [[Interface\AddOns\Details\images\classes_small]], unpack (_detalhes.class_coords["UNKNOW"]) end if (useAlpha) then return [[Interface\AddOns\Details\images\spec_icons_normal_alpha]], unpack (_detalhes.class_specs_coords [spec]) else return [[Interface\AddOns\Details\images\spec_icons_normal]], unpack (_detalhes.class_specs_coords [spec]) end end end local default_color = {1, 1, 1, 1} function _detalhes:GetClassColor (class) if (self.classe) then return unpack (_detalhes.class_colors [self.classe] or default_color) elseif (type (class) == "table" and class.classe) then return unpack (_detalhes.class_colors [class.classe] or default_color) elseif (type (class) == "string") then return unpack (_detalhes.class_colors [class] or default_color) elseif (self.color) then return unpack(self.color) else return unpack (default_color) end end function _detalhes:GetPlayerIcon (playerName, segment) segment = segment or _detalhes.tabela_vigente local texture local L, R, T, B local playerObject = segment (1, playerName) if (not playerObject or not playerObject.spec) then playerObject = segment (2, playerName) end if (playerObject) then local spec = playerObject.spec if (spec) then texture = [[Interface\AddOns\Details\images\spec_icons_normal]] L, R, T, B = unpack (_detalhes.class_specs_coords [spec]) else texture = [[Interface\AddOns\Details\images\classes_small]] L, R, T, B = unpack (_detalhes.class_coords [playerObject.classe or "UNKNOW"]) end else texture = [[Interface\AddOns\Details\images\classes_small]] L, R, T, B = unpack (_detalhes.class_coords ["UNKNOW"]) end return texture, L, R, T, B end function _detalhes:GuessClass (t) local Actor, container, tries = t[1], t[2], t[3] if (not Actor) then return false end if (Actor.spells) then --> correcao pros containers misc, precisa pegar os diferentes tipos de containers de l� for spellid, _ in _pairs (Actor.spells._ActorTable) do local class = _detalhes.ClassSpellList [spellid] if (class) then Actor.classe = class Actor.guessing_class = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return class end end end if (not Actor.nome) then if (not _detalhes.NoActorNameWarning) then print ("==============") _detalhes:Msg ("Unhandled Exception: Actor has no name, ContainerID: ", container.tipo) _detalhes:Msg ("After the current combat, reset data and use /reload.") _detalhes:Msg ("Report this issue to the Author: Actor with no name, container: ", container.tipo) print ("==============") _detalhes.NoActorNameWarning = true end return end local class = _detalhes:GetClass (Actor.nome) if (class and class ~= "UNKNOW") then Actor.classe = class Actor.need_refresh = true Actor.guessing_class = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return class end if (tries and tries < 10) then t[3] = tries + 1 --thanks @Farmbuyer on curseforge --_detalhes:ScheduleTimer ("GuessClass", 2, {Actor, container, tries+1}) _detalhes:ScheduleTimer ("GuessClass", 2, t) --passing the same table instead of creating a new one end return false end -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- function _detalhes:GetSpecByGUID (unitSerial) return _detalhes.cached_specs [unitSerial] end -- try get the spec from actor name function _detalhes:GetSpec (name) local guid = UnitGUID (name) if (guid) then local spec = _detalhes.cached_specs [guid] if (spec) then return spec end end for index, container in _ipairs (_detalhes.tabela_overall) do local index = container._NameIndexTable [name] if (index) then local actor = container._ActorTable [index] return actor and actor.spec end end end function _detalhes:ReGuessSpec (t) local Actor, container = t[1], t[2] local SpecSpellList = _detalhes.SpecSpellList --> get from the spell cast list if (_detalhes.tabela_vigente) then local misc_actor = _detalhes.tabela_vigente (4, Actor.nome) if (misc_actor and misc_actor.spell_cast) then for spellid, _ in pairs (misc_actor.spell_cast) do local spec = SpecSpellList [spellid] if (spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end end end else if (Actor.spells) then for spellid, _ in _pairs (Actor.spells._ActorTable) do local spec = SpecSpellList [spellid] if (spec) then if (spec ~= Actor.spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec else break end end end if (Actor.classe == "HUNTER") then local container_misc = _detalhes.tabela_vigente[4] local index = container_misc._NameIndexTable [Actor.nome] if (index) then local misc_actor = container_misc._ActorTable [index] local buffs = misc_actor.buff_uptime_spells and misc_actor.buff_uptime_spells._ActorTable if (buffs) then for spellid, spell in _pairs (buffs) do local spec = SpecSpellList [spellid] if (spec) then if (spec ~= Actor.spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec else break end end end end end end end end end function _detalhes:GuessSpec (t) local Actor, container, tries = t[1], t[2], t[3] if (not Actor) then return false end local SpecSpellList = _detalhes.SpecSpellList --local misc_actor = info.instancia.showing (4, self:name()) --spell_cast --> get from the spec cache local spec = _detalhes.cached_specs [Actor.serial] if (spec) then Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end --> get from the spell cast list if (_detalhes.tabela_vigente) then local misc_actor = _detalhes.tabela_vigente (4, Actor.nome) if (misc_actor and misc_actor.spell_cast) then for spellid, _ in pairs (misc_actor.spell_cast) do local spec = SpecSpellList [spellid] if (spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end end else if (Actor.spells) then --> correcao pros containers misc, precisa pegar os diferentes tipos de containers de l� for spellid, _ in _pairs (Actor.spells._ActorTable) do local spec = SpecSpellList [spellid] if (spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end end end end else if (Actor.spells) then --> correcao pros containers misc, precisa pegar os diferentes tipos de containers de l� for spellid, _ in _pairs (Actor.spells._ActorTable) do local spec = SpecSpellList [spellid] if (spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end end end end if (Actor.classe == "HUNTER") then local container_misc = _detalhes.tabela_vigente[4] local index = container_misc._NameIndexTable [Actor.nome] if (index) then local misc_actor = container_misc._ActorTable [index] local buffs = misc_actor.buff_uptime_spells and misc_actor.buff_uptime_spells._ActorTable if (buffs) then for spellid, spell in _pairs (buffs) do local spec = SpecSpellList [spellid] if (spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end end end end end local spec = _detalhes:GetSpec (Actor.nome) if (spec) then _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.need_refresh = true Actor.guessing_spec = nil if (container) then container.need_refresh = true end if (Actor.minha_barra and type (Actor.minha_barra) == "table") then Actor.minha_barra.minha_tabela = nil _detalhes:ScheduleWindowUpdate (2, true) end return spec end if (_detalhes.streamer_config.quick_detection) then if (tries and tries < 30) then t[3] = tries + 1 _detalhes:ScheduleTimer ("GuessSpec", 1, t) end else if (tries and tries < 10) then t[3] = tries + 1 _detalhes:ScheduleTimer ("GuessSpec", 3, t) end end return false end end function _detalhes:AddColorString (player_name, class) --> check if the class colors exists local classColors = _G.RAID_CLASS_COLORS if (classColors) then local color = classColors [class] --> check if the player name is valid if (type (player_name) == "string" and color) then player_name = "|c" .. color.colorStr .. player_name .. "|r" return player_name end end --> if failed, return the player name without modifications return player_name end function _detalhes:AddRoleIcon (player_name, role, size) --> check if is a valid role local roleIcon = _detalhes.role_texcoord [role] if (type (player_name) == "string" and roleIcon and role ~= "NONE") then --> add the role icon size = size or 14 player_name = "|TInterface\\LFGFRAME\\UI-LFG-ICON-ROLES:" .. size .. ":" .. size .. ":0:0:256:256:" .. roleIcon .. "|t " .. player_name return player_name end return player_name end function _detalhes:AddClassOrSpecIcon (playerName, class, spec, iconSize, useAlphaIcons) local size = iconSize or 16 if (spec) then local specString = "" local L, R, T, B = unpack (_detalhes.class_specs_coords [spec]) if (L) then if (useAlphaIcons) then specString = "|TInterface\\AddOns\\Details\\images\\spec_icons_normal_alpha:" .. size .. ":" .. size .. ":0:0:512:512:" .. (L * 512) .. ":" .. (R * 512) .. ":" .. (T * 512) .. ":" .. (B * 512) .. "|t" else specString = "|TInterface\\AddOns\\Details\\images\\spec_icons_normal:" .. size .. ":" .. size .. ":0:0:512:512:" .. (L * 512) .. ":" .. (R * 512) .. ":" .. (T * 512) .. ":" .. (B * 512) .. "|t" end return specString .. " " .. playerName end end if (class) then local classString = "" local L, R, T, B = unpack (_detalhes.class_coords [class]) if (L) then local imageSize = 128 if (useAlphaIcons) then classString = "|TInterface\\AddOns\\Details\\images\\classes_small_alpha:" .. size .. ":" .. size .. ":0:0:" .. imageSize .. ":" .. imageSize .. ":" .. (L * imageSize) .. ":" .. (R * imageSize) .. ":" .. (T * imageSize) .. ":" .. (B * imageSize) .. "|t" else classString = "|TInterface\\AddOns\\Details\\images\\classes_small:" .. size .. ":" .. size .. ":0:0:" .. imageSize .. ":" .. imageSize .. ":" .. (L * imageSize) .. ":" .. (R * imageSize) .. ":" .. (T * imageSize) .. ":" .. (B * imageSize) .. "|t" end return classString .. " " .. playerName end end return playerName end