local UnitAura = UnitAura local UnitBuff = UnitBuff local GetSpellInfo = GetSpellInfo local UnitClass = UnitClass local UnitName = UnitName local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS local DF = DetailsFramework local UnitGroupRolesAssigned = DF.UnitGroupRolesAssigned local version = "95" --> build the list of buffs to track local flask_list = DF.FlaskIDs local is_drinking = 257428 local localizedFoodDrink local food_list = { tier1 = {}, tier2 = {}, tier3 = {}, } for spellID, power in pairs (DF.FoodIDs) do if (power == 1) then food_list.tier1 [spellID] = true elseif (power == 2) then food_list.tier2 [spellID] = true elseif (power == 3) then food_list.tier3 [spellID] = true end end local runes_id = DF.RuneIDs -- local get_unit_id = function (i) local unitID local unitType = "raid" if (not IsInRaid()) then --o jogador esta em grupo unitType = "party" end if (unitType == "party") then if (i == GetNumGroupMembers()) then unitID = "player" else unitID = unitType .. i end else unitID = unitType .. i end return unitID end --> localization local Loc = LibStub ("AceLocale-3.0"):GetLocale ("Details") --> create the plugin object local DetailsRaidCheck = _detalhes:NewPluginObject ("Details_RaidCheck", DETAILSPLUGIN_ALWAYSENABLED) tinsert (UISpecialFrames, "Details_RaidCheck") DetailsRaidCheck:SetPluginDescription (Loc ["STRING_RAIDCHECK_PLUGIN_DESC"]) local debugmode = false --local debugmode = true local CreatePluginFrames = function() --> localize details functions (localize = it doesn't need to get this through indexed metatable any more) DetailsRaidCheck.GetOnlyName = DetailsRaidCheck.GetOnlyName --> tables DetailsRaidCheck.usedprepot_table = {} DetailsRaidCheck.focusaug_table = {} DetailsRaidCheck.haveflask_table = {} DetailsRaidCheck.havefood_table = {} DetailsRaidCheck.iseating_table = {} DetailsRaidCheck.havefocusaug_table = {} DetailsRaidCheck.on_raid = false DetailsRaidCheck.tracking_buffs = false local empty_table = {} local PlayerData = {} local UpdateSpeed = 0.5 function DetailsRaidCheck:OnDetailsEvent (event, ...) if (event == "ZONE_TYPE_CHANGED") then DetailsRaidCheck:CheckCanShowIcon (...) elseif (event == "COMBAT_PREPOTION_UPDATED") then DetailsRaidCheck.usedprepot_table, DetailsRaidCheck.focusaug_table = select (1, ...) elseif (event == "COMBAT_PLAYER_LEAVE") then elseif (event == "COMBAT_PLAYER_ENTER") then elseif (event == "DETAILS_STARTED") then localizedFoodDrink = GetSpellInfo (is_drinking) DetailsRaidCheck:CheckCanShowIcon() elseif (event == "PLUGIN_DISABLED") then DetailsRaidCheck.on_raid = false DetailsRaidCheck.tracking_buffs = false DetailsRaidCheck:StopTrackBuffs() DetailsRaidCheck:HideToolbarIcon (DetailsRaidCheck.ToolbarButton) elseif (event == "PLUGIN_ENABLED") then DetailsRaidCheck:CheckCanShowIcon() end end DetailsRaidCheck.ToolbarButton = _detalhes.ToolBar:NewPluginToolbarButton (DetailsRaidCheck.empty_function, [[Interface\Buttons\UI-CheckBox-Check]], Loc ["STRING_RAIDCHECK_PLUGIN_NAME"], "", 16, 16, "RAIDCHECK_PLUGIN_BUTTON") DetailsRaidCheck.ToolbarButton.shadow = true --> loads icon_shadow.tga when the instance is showing icons with shadows function DetailsRaidCheck.GetPlayerAmount() local playerAmount = GetNumGroupMembers() --limit to 20 if in mythic raid and the option is enabled local _, _, difficulty = GetInstanceInfo() if (difficulty == 16 and DetailsRaidCheck.db.mythic_1_4 and playerAmount > 20) then playerAmount = 20 end return playerAmount end function DetailsRaidCheck:SetGreenIcon() local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then return end local instance = _detalhes:GetInstance (lower_instance) if (instance.menu_icons.shadow) then DetailsRaidCheck.ToolbarButton:SetNormalTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetPushedTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetDisabledTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetHighlightTexture ([[Interface\Buttons\UI-CheckBox-Check]], "ADD") DetailsRaidCheck.ToolbarButton:GetNormalTexture():SetVertexColor(.2, 1, .2) DetailsRaidCheck.ToolbarButton:GetHighlightTexture():SetVertexColor(.2, 1, .2) DetailsRaidCheck.ToolbarButton:GetDisabledTexture():SetVertexColor(.2, 1, .2) DetailsRaidCheck.ToolbarButton:GetPushedTexture():SetVertexColor(.2, 1, .2) else DetailsRaidCheck.ToolbarButton:SetNormalTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetPushedTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetDisabledTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetHighlightTexture ([[Interface\Buttons\UI-CheckBox-Check]], "ADD") DetailsRaidCheck.ToolbarButton:GetNormalTexture():SetVertexColor(.2, 1, .2) DetailsRaidCheck.ToolbarButton:GetHighlightTexture():SetVertexColor(.2, 1, .2) DetailsRaidCheck.ToolbarButton:GetDisabledTexture():SetVertexColor(.2, 1, .2) DetailsRaidCheck.ToolbarButton:GetPushedTexture():SetVertexColor(.2, 1, .2) end end function DetailsRaidCheck:SetRedIcon() local lower_instance = _detalhes:GetLowerInstanceNumber() if (not lower_instance) then return end local instance = _detalhes:GetInstance (lower_instance) if (instance.menu_icons.shadow) then DetailsRaidCheck.ToolbarButton:SetNormalTexture ([[Interface\Buttons\UI-CheckBox-Check]]) --RED DetailsRaidCheck.ToolbarButton:SetPushedTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetDisabledTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetHighlightTexture ([[Interface\Buttons\UI-CheckBox-Check]], "ADD") DetailsRaidCheck.ToolbarButton:GetNormalTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetNormalTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetHighlightTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetDisabledTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetPushedTexture():SetVertexColor(1, .6, .1) else DetailsRaidCheck.ToolbarButton:SetNormalTexture ([[Interface\Buttons\UI-CheckBox-Check]]) --RED DetailsRaidCheck.ToolbarButton:SetPushedTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetDisabledTexture ([[Interface\Buttons\UI-CheckBox-Check]]) DetailsRaidCheck.ToolbarButton:SetHighlightTexture ([[Interface\Buttons\UI-CheckBox-Check]], "ADD") DetailsRaidCheck.ToolbarButton:GetNormalTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetNormalTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetHighlightTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetDisabledTexture():SetVertexColor(1, .6, .1) DetailsRaidCheck.ToolbarButton:GetPushedTexture():SetVertexColor(1, .6, .1) end end local show_panel = CreateFrame ("frame", nil, UIParent, "BackdropTemplate") show_panel:SetPoint ("bottom", DetailsRaidCheck.ToolbarButton, "top", 0, 10) show_panel:SetClampedToScreen (true) show_panel:SetFrameStrata ("TOOLTIP") -- --copying style from the all displays menu show_panel:SetBackdrop ({bgFile = "Interface\\AddOns\\Details\\images\\background", tile = true, tileSize = 16 }) show_panel:SetBackdropColor (0.05, 0.05, 0.05, 0.3) show_panel.background = show_panel:CreateTexture ("DetailsAllAttributesFrameBackground111", "background") show_panel.background:SetDrawLayer ("background", 2) show_panel.background:SetPoint ("topleft", show_panel, "topleft", 4, -4) show_panel.background:SetPoint ("bottomright", show_panel, "bottomright", -4, 4) show_panel.wallpaper = show_panel:CreateTexture ("DetailsAllAttributesFrameWallPaper111", "background") show_panel.wallpaper:SetDrawLayer ("background", 4) show_panel.wallpaper:SetPoint ("topleft", show_panel, "topleft", 4, -4) show_panel.wallpaper:SetPoint ("bottomright", show_panel, "bottomright", -4, 4) show_panel:SetBackdrop (_detalhes.menu_backdrop_config.menus_backdrop) show_panel:SetBackdropColor (unpack (_detalhes.menu_backdrop_config.menus_backdropcolor)) show_panel:SetBackdropBorderColor (unpack (_detalhes.menu_backdrop_config.menus_bordercolor)) -- local report_string1 = show_panel:CreateFontString (nil, "overlay", "GameFontNormal") report_string1:SetPoint ("bottomleft", show_panel, "bottomleft", 10, 8) report_string1:SetText ("|TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:12:12:0:1:512:512:8:70:225:307|t Report No Food/Flask |TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:12:12:0:1:512:512:8:70:328:409|t Report No Pre-Pot |TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:12:12:0:1:512:512:8:70:126:204|t Report No Rune | |cFFFFFFFFShift+Click: Options|r") --local using_details_string1 = show_panel:CreateFontString (nil, "overlay", "GameFontNormal") --using_details_string1:SetPoint ("bottomleft", show_panel, "bottomleft", 10, 22) --using_details_string1:SetText ("Receives dynamic updates from other Details! users when they change talents and gear") DetailsRaidCheck:SetFontSize (report_string1, 10) DetailsRaidCheck:SetFontColor (report_string1, "white") report_string1:SetAlpha (0.6) --DetailsRaidCheck:SetFontSize (using_details_string1, 10) --DetailsRaidCheck:SetFontColor (using_details_string1, "white") --using_details_string1:SetAlpha (0.6) -- --header and scroll local headerTable = { {text = "Player Name", width = 140}, {text = "Talents", width = 130}, {text = "ILevel", width = 45}, {text = "Repair", width = 45}, {text = "Food", width = 45}, {text = "Flask", width = 45}, {text = "Rune", width = 45}, --{text = "Pre-Pot Last Try", width = 100}, --{text = "Using Details!", width = 100}, } local headerOptions = { padding = 2, } DetailsRaidCheck.Header = DF:CreateHeader (show_panel, headerTable, headerOptions) DetailsRaidCheck.Header:SetPoint ("topleft", show_panel, "topleft", 10, -10) --options local scroll_width = 722 local scroll_lines = 30 local scroll_line_height = 16 local scroll_height = (scroll_lines * scroll_line_height) + scroll_lines + 2 local backdrop_color = {.2, .2, .2, 0.2} local backdrop_color_on_enter = {.8, .8, .8, 0.4} local y = -10 local headerY = y - 2 local scrollY = headerY - 20 show_panel:SetSize (722 + 20, 565) function show_panel:AdjustHeight(height) show_panel:SetHeight (height or 565) end --create line for the scroll local scroll_createline = function (self, index) local line = CreateFrame ("button", "$parentLine" .. index, self, "BackdropTemplate") line:SetPoint ("topleft", self, "topleft", 1, -((index-1)*(scroll_line_height+1)) - 1) line:SetSize (scroll_width - 2, scroll_line_height) line:SetScript ("OnEnter", line_onenter) line:SetScript ("OnLeave", line_onleave) line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor (unpack (backdrop_color)) DF:Mixin (line, DetailsFramework.HeaderFunctions) --role icon local roleIcon = DF:CreateImage (line, nil, scroll_line_height, scroll_line_height) --spec icon local specIcon = DF:CreateImage (line, nil, scroll_line_height, scroll_line_height) specIcon:SetPoint ("left", roleIcon, "right", 2, 0) --covenant icon local covenantIcon = DF:CreateImage (line, nil, scroll_line_height, scroll_line_height) covenantIcon:SetPoint ("left", specIcon, "right", 2, 0) --player name local playerName = DF:CreateLabel (line) playerName:SetPoint ("left", covenantIcon, "right", 2, 0) --talents local talent_row_options = { icon_width = 16, icon_height = 16, texcoord = {.1, .9, .1, .9}, show_text = false, icon_padding = 2, } local talentsRow = DF:CreateIconRow (line, "$parentTalentIconsRow", talent_row_options) --item level local itemLevel = DF:CreateLabel(line) --repair status local repairStatus = DF:CreateLabel(line) --no food local FoodIndicator = DF:CreateImage(line, "", scroll_line_height, scroll_line_height) --no flask local FlaskIndicator = DF:CreateImage(line, "", scroll_line_height, scroll_line_height) --no rune local RuneIndicator = DF:CreateImage(line, "", scroll_line_height, scroll_line_height) --no pre pot --local PrePotIndicator = DF:CreateImage (line, "", scroll_line_height, scroll_line_height) --using details! --local DetailsIndicator = DF:CreateImage(line, "", scroll_line_height, scroll_line_height) line:AddFrameToHeaderAlignment(roleIcon) line:AddFrameToHeaderAlignment(talentsRow) line:AddFrameToHeaderAlignment(itemLevel) line:AddFrameToHeaderAlignment(repairStatus) line:AddFrameToHeaderAlignment(FoodIndicator) line:AddFrameToHeaderAlignment(FlaskIndicator) line:AddFrameToHeaderAlignment(RuneIndicator) --line:AddFrameToHeaderAlignment(PrePotIndicator) --line:AddFrameToHeaderAlignment(DetailsIndicator) line:AlignWithHeader (DetailsRaidCheck.Header, "left") line.CovenantIcon = covenantIcon line.RoleIcon = roleIcon line.SpecIcon = specIcon line.PlayerName = playerName line.TalentsRow = talentsRow line.ItemLevel = itemLevel line.RepairStatus = repairStatus line.FoodIndicator = FoodIndicator line.FlaskIndicator = FlaskIndicator line.RuneIndicator = RuneIndicator --line.PrePotIndicator = PrePotIndicator --line.DetailsIndicator = DetailsIndicator return line end --refresh scroll local has_food_icon = {texture = [[Interface\Scenarios\ScenarioIcon-Check]], coords = {0, 1, 0, 1}} local eating_food_icon = {texture = [[Interface\AddOns\Details\images\icons]], coords = {225/512, 249/512, 35/512, 63/512}} local scroll_refresh = function (self, data, offset, total_lines) local dataInOrder = {} for i = 1, #data do dataInOrder [#dataInOrder+1] = data [i] end table.sort (dataInOrder, DF.SortOrder2) --table.sort (dataInOrder, DF.SortOrder1R) --alphabetical data = dataInOrder local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0") --get the information of all players local playersInfoData = openRaidLib.playerInfoManager.GetAllPlayersInfo() local playersGearData = openRaidLib.gearManager.GetAllPlayersGear() for i = 1, total_lines do local index = i + offset local playerTable = data [index] if (playerTable) then local line = self:GetLine (i) if (line) then local thisPlayerInfo = playersInfoData[playerTable.UnitNameRealm] if (thisPlayerInfo) then local playerCovenantId = thisPlayerInfo.covenantId if (playerCovenantId > 0) then line.CovenantIcon:SetTexture(LIB_OPEN_RAID_COVENANT_ICONS[playerCovenantId]) line.CovenantIcon:SetTexCoord(.05, .95, .05, .95) else line.CovenantIcon:SetTexture("") end else line.CovenantIcon:SetTexture("") end --repair status local thisPlayerGearInfo = playersGearData[playerTable.UnitNameRealm] if (thisPlayerGearInfo) then line.RepairStatus:SetText(thisPlayerGearInfo.durability .. "%") else line.RepairStatus:SetText("") end local roleTexture, L, R, T, B = _detalhes:GetRoleIcon(playerTable.Role or "NONE") line.RoleIcon:SetTexture(roleTexture) line.RoleIcon:SetTexCoord(L, R, T, B) if (playerTable.Spec) then local texture, L, R, T, B = _detalhes:GetSpecIcon(playerTable.Spec) line.SpecIcon:SetTexture(texture) line.SpecIcon:SetTexCoord(L, R, T, B) else local texture, L, R, T, B = _detalhes:GetClassIcon(playerTable.Class) line.SpecIcon:SetTexture (texture) line.SpecIcon:SetTexCoord (L, R, T, B) end line.TalentsRow:ClearIcons() if (playerTable.Talents) then for i = 1, #playerTable.Talents do local talent = playerTable.Talents [i] local talentID, name, texture, selected, available = GetTalentInfoByID(talent) line.TalentsRow:SetIcon(false, false, false, false, texture) end end local classColor = Details.class_colors [playerTable.Class] if (classColor) then line:SetBackdropColor (unpack (classColor)) else line:SetBackdropColor (unpack (backdrop_color)) end line.PlayerName.text = playerTable.Name line.ItemLevel.text = floor (playerTable.ILevel and playerTable.ILevel.ilvl or 0) if (playerTable.Food) then line.FoodIndicator.texture = has_food_icon.texture line.FoodIndicator.texcoord = has_food_icon.coords elseif (playerTable.Eating) then line.FoodIndicator.texture = eating_food_icon.texture line.FoodIndicator.texcoord = eating_food_icon.coords else line.FoodIndicator.texture = "" end line.FlaskIndicator.texture = playerTable.Flask and [[Interface\Scenarios\ScenarioIcon-Check]] or "" line.RuneIndicator.texture = playerTable.Rune and [[Interface\Scenarios\ScenarioIcon-Check]] or "" --line.PrePotIndicator.texture = playerTable.PrePot and [[Interface\Scenarios\ScenarioIcon-Check]] or "" --line.DetailsIndicator.texture = playerTable.UseDetails and [[Interface\Scenarios\ScenarioIcon-Check]] or "" end end end end --create scroll local mainScroll = DF:CreateScrollBox (show_panel, "$parentMainScroll", scroll_refresh, PlayerData, 1, 1, scroll_lines, scroll_line_height) DF:ReskinSlider (mainScroll) mainScroll.HideScrollBar = true mainScroll:SetPoint ("topleft", show_panel, "topleft", 10, scrollY) mainScroll:SetPoint ("bottomright", show_panel, "bottomright", -10, 20) mainScroll:Refresh() --create lines for i = 1, scroll_lines do mainScroll:CreateLine (scroll_createline) end show_panel:Hide() DetailsRaidCheck.report_lines = "" local reportFunc = function (IsCurrent, IsReverse, AmtLines) DetailsRaidCheck:SendReportLines (DetailsRaidCheck.report_lines) end --> overwrite the default scripts DetailsRaidCheck.ToolbarButton:RegisterForClicks ("AnyUp") DetailsRaidCheck.ToolbarButton:SetScript ("OnClick", function (self, button) if (IsShiftKeyDown()) then DetailsRaidCheck.OpenOptionsPanel() return end if (button == "LeftButton") then --> link no food/flask local s, added = "Details!: No Flask or Food: ", {} local amt = GetNumGroupMembers() local _, _, difficulty = GetInstanceInfo() if (difficulty == 16 and DetailsRaidCheck.db.mythic_1_4 and amt > 20) then amt = 20 end for i = 1, amt, 1 do local unitID = get_unit_id (i) local name = UnitName (unitID) local unitSerial = UnitGUID (unitID) if (not DetailsRaidCheck.havefood_table [unitSerial]) then added [unitSerial] = true s = s .. DetailsRaidCheck:GetOnlyName (name) .. " " end if (not DetailsRaidCheck.haveflask_table [unitSerial] and not added [unitSerial]) then s = s .. DetailsRaidCheck:GetOnlyName (name) .. " " end end if (DetailsRaidCheck.db.use_report_panel) then DetailsRaidCheck.report_lines = s DetailsRaidCheck:SendReportWindow (reportFunc) else if (IsInRaid()) then DetailsRaidCheck:SendMsgToChannel (s, "RAID") else DetailsRaidCheck:SendMsgToChannel (s, "PARTY") end end elseif (button == "RightButton") then --> link no pre-pot latest segment local s = "Details!: No Pre-Pot Last Try: " local amt = GetNumGroupMembers() local _, _, difficulty = GetInstanceInfo() if (difficulty == 16 and DetailsRaidCheck.db.mythic_1_4 and amt > 20) then amt = 20 end for i = 1, amt, 1 do local unitID = get_unit_id (i) local role = UnitGroupRolesAssigned (unitID) if (role == "DAMAGER" or (role == "HEALER" and DetailsRaidCheck.db.pre_pot_healers) or (role == "TANK" and DetailsRaidCheck.db.pre_pot_tanks)) then local playerName, realmName = UnitName (unitID) if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end if (not DetailsRaidCheck.usedprepot_table [playerName]) then s = s .. DetailsRaidCheck:GetOnlyName (playerName) .. " " end end end if (DetailsRaidCheck.db.use_report_panel) then DetailsRaidCheck.report_lines = s DetailsRaidCheck:SendReportWindow (reportFunc) else if (IsInRaid()) then DetailsRaidCheck:SendMsgToChannel (s, "RAID") else DetailsRaidCheck:SendMsgToChannel (s, "PARTY") end end elseif (button == "MiddleButton") then --report focus aug local s = "Details!: Not using Rune: " local amt = GetNumGroupMembers() local _, _, difficulty = GetInstanceInfo() if (difficulty == 16 and DetailsRaidCheck.db.mythic_1_4 and amt > 20) then amt = 20 end for i = 1, amt do local unitID = get_unit_id (i) local name = UnitName (unitID) local unitSerial = UnitGUID (unitID) if (not DetailsRaidCheck.havefocusaug_table [unitSerial]) then s = s .. DetailsRaidCheck:GetOnlyName (name) .. " " end end if (DetailsRaidCheck.db.use_report_panel) then DetailsRaidCheck.report_lines = s DetailsRaidCheck:SendReportWindow (reportFunc) else if (IsInRaid()) then DetailsRaidCheck:SendMsgToChannel (s, "RAID") else DetailsRaidCheck:SendMsgToChannel (s, "PARTY") end end end end) local update_panel = function (self, elapsed) show_panel.NextUpdate = show_panel.NextUpdate - elapsed if (show_panel.NextUpdate > 0) then return end show_panel.NextUpdate = UpdateSpeed if (not IsInRaid() and not IsInGroup()) then return end wipe (PlayerData) local groupTypeID = IsInRaid() and "raid" or "party" local playerAmount = DetailsRaidCheck.GetPlayerAmount() local iterateAmount = playerAmount if (not IsInRaid()) then iterateAmount = iterateAmount - 1 end for i = 1, iterateAmount do local unitID = groupTypeID .. i local unitName = UnitName (unitID) local unitNameWithRealm = GetUnitName(unitID, true) local cleuName = _detalhes:GetCLName (unitID) local unitSerial = UnitGUID (unitID) local _, unitClass, unitClassID = UnitClass (unitID) local unitRole = UnitGroupRolesAssigned (unitID) local unitSpec = _detalhes:GetSpecFromSerial (unitSerial) or _detalhes:GetSpec (cleuName) local itemLevelTable = _detalhes.ilevel:GetIlvl (unitSerial) local talentsTable = _detalhes:GetTalents (unitSerial) --> order by class > alphabetically by the unit name unitClassID = (((unitClassID or 0) + 128) ^ 4) + tonumber (string.byte (unitName, 1) .. "" .. string.byte (unitName, 2)) tinsert (PlayerData, {unitName, unitClassID, Name = unitName, UnitNameRealm = unitNameWithRealm, Class = unitClass, Serial = unitSerial, Role = unitRole, Spec = unitSpec, ILevel = itemLevelTable, Talents = talentsTable, Food = DetailsRaidCheck.havefood_table [unitSerial], Flask = DetailsRaidCheck.haveflask_table [unitSerial], PrePot = DetailsRaidCheck.usedprepot_table [cleuName], Rune = DetailsRaidCheck.havefocusaug_table [unitSerial], Eating = DetailsRaidCheck.iseating_table [unitSerial], UseDetails = Details.trusted_characters [unitSerial], }) end if (not IsInRaid()) then --> add the player data local unitID = "player" local unitName = UnitName (unitID) local cleuName = _detalhes:GetCLName (unitID) local unitSerial = UnitGUID (unitID) local _, unitClass, unitClassID = UnitClass (unitID) local unitRole = UnitGroupRolesAssigned (unitID) local unitSpec = _detalhes:GetSpecFromSerial (unitSerial) or _detalhes:GetSpec (cleuName) local itemLevelTable = _detalhes.ilevel:GetIlvl (unitSerial) local talentsTable = _detalhes:GetTalents (unitSerial) unitClassID = ((unitClassID + 128) ^ 4) + tonumber (string.byte (unitName, 1) .. "" .. string.byte (unitName, 2)) local unitNameWithRealm = GetUnitName(unitID, true) tinsert (PlayerData, {unitName, unitClassID, Name = unitName, UnitNameRealm = unitNameWithRealm, Class = unitClass, Serial = unitSerial, Role = unitRole, Spec = unitSpec, ILevel = itemLevelTable, Talents = talentsTable, Food = DetailsRaidCheck.havefood_table [unitSerial], Flask = DetailsRaidCheck.haveflask_table [unitSerial], PrePot = DetailsRaidCheck.usedprepot_table [cleuName], Rune = DetailsRaidCheck.havefocusaug_table [unitSerial], Eating = DetailsRaidCheck.iseating_table [unitSerial], UseDetails = Details.trusted_characters [unitSerial], }) end mainScroll:Refresh() local height = (playerAmount * scroll_line_height) + 75 show_panel:AdjustHeight(height) end DetailsRaidCheck.ToolbarButton:SetScript ("OnEnter", function (self) show_panel:Show() show_panel:ClearAllPoints() local bottomPosition = self:GetBottom() local screenHeight = GetScreenHeight() local positionHeightPercent = bottomPosition / screenHeight if (positionHeightPercent > 0.7) then show_panel:SetPoint("top", DetailsRaidCheck.ToolbarButton, "bottom", 0, -10) else show_panel:SetPoint("bottom", DetailsRaidCheck.ToolbarButton, "top", 0, 10) end show_panel.NextUpdate = UpdateSpeed update_panel (show_panel, 1) show_panel:SetScript ("OnUpdate", update_panel) DetailsRaidCheck:StartTrackBuffs() end) DetailsRaidCheck.ToolbarButton:SetScript ("OnLeave", function (self) show_panel:SetScript ("OnUpdate", nil) show_panel:Hide() DetailsRaidCheck:StopTrackBuffs() DetailsRaidCheck:StartTrackBuffs(5.0) end) function DetailsRaidCheck:CheckCanShowIcon(...) local isInRaid = IsInRaid() local isInGroup = IsInGroup() if (isInRaid or isInGroup) then DetailsRaidCheck:ShowToolbarIcon (DetailsRaidCheck.ToolbarButton, "star") DetailsRaidCheck.on_raid = true DetailsRaidCheck:StartTrackBuffs(5.0) else DetailsRaidCheck:HideToolbarIcon (DetailsRaidCheck.ToolbarButton) DetailsRaidCheck.on_raid = false if (DetailsRaidCheck.UpdateBuffsTick and not DetailsRaidCheck.UpdateBuffsTick._cancelled) then DetailsRaidCheck.UpdateBuffsTick:Cancel() end end end function DetailsRaidCheck:CheckUnitBuffs (unitID, consumableTable) local name = UnitName (unitID) local unitSerial = UnitGUID (unitID) for buffIndex = 1, 40 do local bname, texture, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nameplateShowPersonal, spellid = UnitBuff (unitID, buffIndex) if (bname) then if (flask_list [spellid]) then DetailsRaidCheck.haveflask_table [unitSerial] = spellid consumableTable.Flask = consumableTable.Flask + 1 end if (DetailsRaidCheck.db.food_tier1) then if (food_list.tier1 [spellid]) then DetailsRaidCheck.havefood_table [unitSerial] = 1 consumableTable.Food = consumableTable.Food + 1 end end if (DetailsRaidCheck.db.food_tier2) then if (food_list.tier2 [spellid]) then DetailsRaidCheck.havefood_table [unitSerial] = 2 consumableTable.Food = consumableTable.Food + 1 end end if (DetailsRaidCheck.db.food_tier3) then if (food_list.tier3 [spellid]) then DetailsRaidCheck.havefood_table [unitSerial] = 3 consumableTable.Food = consumableTable.Food + 1 end end if (runes_id [spellid]) then DetailsRaidCheck.havefocusaug_table [unitSerial] = spellid end if (bname == localizedFoodDrink) then DetailsRaidCheck.iseating_table [unitSerial] = true end else break end end end function DetailsRaidCheck:BuffTrackTick() wipe (DetailsRaidCheck.haveflask_table) wipe (DetailsRaidCheck.havefood_table) wipe (DetailsRaidCheck.havefocusaug_table) wipe (DetailsRaidCheck.iseating_table) local hasConsumables = { Flask = 0, Food = 0, } local playerAmount = DetailsRaidCheck.GetPlayerAmount() if (IsInRaid()) then for i = 1, playerAmount do local unitId = "raid" .. i DetailsRaidCheck:CheckUnitBuffs(unitId, hasConsumables) end elseif (IsInGroup()) then for i = 1, playerAmount-1 do local unitId = "party" .. i DetailsRaidCheck:CheckUnitBuffs(unitId, hasConsumables) end DetailsRaidCheck:CheckUnitBuffs ("player", hasConsumables) end if (hasConsumables.Food == playerAmount and hasConsumables.Flask == playerAmount) then DetailsRaidCheck:SetGreenIcon() else DetailsRaidCheck:SetRedIcon() end end function DetailsRaidCheck:StartTrackBuffs(customUpdateSpeed) if (not DetailsRaidCheck.tracking_buffs) then DetailsRaidCheck.tracking_buffs = true DetailsRaidCheck:BuffTrackTick() if (DetailsRaidCheck.UpdateBuffsTick and not DetailsRaidCheck.UpdateBuffsTick._cancelled) then DetailsRaidCheck.UpdateBuffsTick:Cancel() end if (customUpdateSpeed) then DetailsRaidCheck.UpdateBuffsTick = C_Timer.NewTicker (customUpdateSpeed-0.01, DetailsRaidCheck.BuffTrackTick) else DetailsRaidCheck.UpdateBuffsTick = C_Timer.NewTicker (UpdateSpeed-0.01, DetailsRaidCheck.BuffTrackTick) end end end function DetailsRaidCheck:StopTrackBuffs() DetailsRaidCheck.tracking_buffs = false if (DetailsRaidCheck.UpdateBuffsTick and not DetailsRaidCheck.UpdateBuffsTick._cancelled) then DetailsRaidCheck.UpdateBuffsTick:Cancel() end end end local build_options_panel = function() local options_frame = DetailsRaidCheck:CreatePluginOptionsFrame ("DetailsRaidCheckOptionsWindow", "Details! Raid Check Options", 1) local menu = { {type = "label", get = function() return "General Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, { type = "toggle", get = function() return DetailsRaidCheck.db.pre_pot_healers end, set = function (self, fixedparam, value) DetailsRaidCheck.db.pre_pot_healers = value end, desc = "If enabled, pre potion for healers are also shown.", name = "Track Healers Pre Pot" }, { type = "toggle", get = function() return DetailsRaidCheck.db.pre_pot_tanks end, set = function (self, fixedparam, value) DetailsRaidCheck.db.pre_pot_tanks = value end, desc = "If enabled, pre potion for tanks are also shown.", name = "Track Tank Pre Pot" }, { type = "toggle", get = function() return DetailsRaidCheck.db.mythic_1_4 end, set = function (self, fixedparam, value) DetailsRaidCheck.db.mythic_1_4 = value end, desc = "When raiding on Mythic difficult, only check the first 4 groups.", name = "Mythic 1-4 Group Only" }, --[=[ { type = "toggle", get = function() return DetailsRaidCheck.db.use_report_panel end, set = function (self, fixedparam, value) DetailsRaidCheck.db.use_report_panel = value end, desc = "If enabled, clicking to report open the report panel instead (to be able to choose where to send the report).", name = "Use Report Panel" }, --]=] {type = "breakline"}, {type = "label", get = function() return "Food Level Tracking:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, { type = "toggle", get = function() return DetailsRaidCheck.db.food_tier1 end, set = function (self, fixedparam, value) DetailsRaidCheck.db.food_tier1 = value end, desc = "Consider players using Tier 1 food.", name = "Food Tier 1 [41]" }, { type = "toggle", get = function() return DetailsRaidCheck.db.food_tier2 end, set = function (self, fixedparam, value) DetailsRaidCheck.db.food_tier2 = value end, desc = "Consider players using Tier 2 food.", name = "Food Tier 2 [55]" }, { type = "toggle", get = function() return DetailsRaidCheck.db.food_tier3 end, set = function (self, fixedparam, value) DetailsRaidCheck.db.food_tier3 = value end, desc = "Consider players using Tier 3 food.", name = "Food Tier 3 [>= 75]" }, } local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") _detalhes.gump:BuildMenu (options_frame, menu, 15, -45, 180, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) end DetailsRaidCheck.OpenOptionsPanel = function() if (not DetailsRaidCheckOptionsWindow) then build_options_panel() end DetailsRaidCheckOptionsWindow:Show() end function DetailsRaidCheck:OnEvent (_, event, ...) if (event == "GROUP_ROSTER_UPDATE") then if (DetailsRaidCheck.RosterDelay < GetTime()) then DetailsRaidCheck:CheckCanShowIcon() DetailsRaidCheck.RosterDelay = GetTime()+2 end elseif (event == "ADDON_LOADED") then local AddonName = select (1, ...) if (AddonName == "Details_RaidCheck") then if (_G._detalhes) then if (DetailsFramework.IsClassicWow()) then return end --> create widgets CreatePluginFrames() --> core version required local MINIMAL_DETAILS_VERSION_REQUIRED = 20 local default_settings = { pre_pot_healers = false, --do not report pre pot for healers pre_pot_tanks = false, --do not report pre pot for tanks mythic_1_4 = true, --only track groups 1-4 on mythic use_report_panel = true, --if true, shows the report panel food_tier1 = true, --legion food tiers food_tier2 = true, food_tier3 = true, } DetailsRaidCheck.RosterDelay = GetTime() --make it load after the other plugins C_Timer.After(1, function() --> install local install, saveddata, is_enabled = _G._detalhes:InstallPlugin ("TOOLBAR", Loc ["STRING_RAIDCHECK_PLUGIN_NAME"], [[Interface\Buttons\UI-CheckBox-Check]], DetailsRaidCheck, "DETAILS_PLUGIN_RAIDCHECK", MINIMAL_DETAILS_VERSION_REQUIRED, "Terciob", version, default_settings) if (type (install) == "table" and install.error) then return print (install.error) end --> register needed events _G._detalhes:RegisterEvent (DetailsRaidCheck, "COMBAT_PLAYER_LEAVE") _G._detalhes:RegisterEvent (DetailsRaidCheck, "COMBAT_PLAYER_ENTER") _G._detalhes:RegisterEvent (DetailsRaidCheck, "COMBAT_PREPOTION_UPDATED") _G._detalhes:RegisterEvent (DetailsRaidCheck, "ZONE_TYPE_CHANGED") DetailsRaidCheck.Frame:RegisterEvent ("GROUP_ROSTER_UPDATE") end) end end end end -- doo