--Extra lines added because looking upward was too much work. LFR_MAX_SHOWN_LEVEL_DIFF = 15; NUM_LFR_CHOICE_BUTTONS = 14; NUM_LFR_LIST_BUTTONS = 19; LFR_BROWSE_AUTO_REFRESH_TIME = 20; local heroicIcon = "|TInterface\\LFGFrame\\UI-LFG-ICON-HEROIC:16:13:-5:-3:32:32:0:16:0:20|t"; function LFRFrame_OnLoad(self) self:RegisterEvent("UPDATE_LFG_LIST"); self:RegisterEvent("LFG_UPDATE"); self:RegisterEvent("PARTY_MEMBERS_CHANGED"); PanelTemplates_SetNumTabs(self, 2); LFRFrame_SetActiveTab(1); self.lastInGroup = GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0; end function LFRFrame_OnEvent(self, event, ...) if ( event == "UPDATE_LFG_LIST" ) then if ( LFRBrowseFrame:IsVisible() ) then LFRBrowseFrameList_Update(); end elseif ( event == "LFG_UPDATE" or event == "PARTY_MEMBERS_CHANGED" ) then local inParty, joined, queued, noPartialClear, achievements, lfgComment, slotCount = GetLFGInfoServer(); local inGroup = GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0; if ( inGroup ~= self.lastInGroup ) then self.lastInGroup = inGroup; LFRQueueFrameComment:SetText(""); LFRQueueFrameCommentExplanation:Show(); LFRQueueFrameComment:ClearFocus(); SetLFGComment(""); end if ( not LFR_IsEmpowered() or (not LFRQueueFrameComment:HasFocus() and LFRQueueFrameComment:GetText() == "") ) then if ( joined ) then LFRQueueFrameComment:SetText(lfgComment); if ( strtrim(lfgComment) == "" ) then LFRQueueFrameCommentExplanation:Show(); else LFRQueueFrameCommentExplanation:Hide(); end end LFRQueueFrameComment:ClearFocus(); end end end function LFRQueueFrameFindGroupButton_Update() local mode, subMode = GetLFGMode(); if ( mode == "listed" ) then if ( GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0 ) then LFRQueueFrameFindGroupButton:SetText(UNLIST_MY_GROUP); LFDQueueFrameNoLFDWhileLFRLeaveQueueButton:SetText(UNLIST_MY_GROUP); else LFRQueueFrameFindGroupButton:SetText(UNLIST_ME); LFDQueueFrameNoLFDWhileLFRLeaveQueueButton:SetText(UNLIST_ME); end else if ( GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0 ) then LFRQueueFrameFindGroupButton:SetText(LIST_MY_GROUP); else LFRQueueFrameFindGroupButton:SetText(LIST_ME); end end if ( LFR_IsEmpowered() and mode ~= "proposal" and mode ~= "queued" and mode ~= "rolecheck" and (not LFRRaidList or LFRRaidList[1])) then --During the proposal, they must use the proposal buttons to leave the queue. LFRQueueFrameFindGroupButton:Enable(); LFRQueueFrameAcceptCommentButton:Enable(); LFDQueueFrameNoLFDWhileLFRLeaveQueueButton:Enable(); else LFRQueueFrameFindGroupButton:Disable(); LFRQueueFrameAcceptCommentButton:Disable(); LFDQueueFrameNoLFDWhileLFRLeaveQueueButton:Disable(); end end function LFR_CanQueueForLockedInstances() return GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0; end function LFR_CanQueueForMultiple() return (GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0); end function LFRQueueFrame_SetRoles() local leader, tank, healer, damage = GetLFGRoles(); SetLFGRoles(leader, LFRQueueFrameRoleButtonTank.checkButton:GetChecked(), LFRQueueFrameRoleButtonHealer.checkButton:GetChecked(), LFRQueueFrameRoleButtonDPS.checkButton:GetChecked()); end function LFRFrameRoleCheckButton_OnClick(self) LFRQueueFrame_SetRoles(); end function LFRQueueFrameDungeonChoiceEnableButton_OnClick(self, button) local parent = self:GetParent(); local dungeonID = parent.id; local isChecked = self:GetChecked(); PlaySound(isChecked and "igMainMenuOptionCheckBoxOff" or "igMainMenuOptionCheckBoxOff"); if ( LFGIsIDHeader(dungeonID) ) then LFRList_SetHeaderEnabled(dungeonID, isChecked); elseif ( LFR_CanQueueForMultiple() ) then LFRList_SetRaidEnabled(dungeonID, isChecked); LFGListUpdateHeaderEnabledAndLockedStates(LFRRaidList, LFGEnabledList, LFGLockList, LFRHiddenByCollapseList); else LFRQueueFrame.selectedLFM = dungeonID; end LFRQueueFrameSpecificList_Update(); end function LFRQueueFrameExpandOrCollapseButton_OnClick(self, button) local parent = self:GetParent(); LFRList_SetHeaderCollapsed(parent.id, not parent.isCollapsed); end function LFRList_SetRaidEnabled(dungeonID, isEnabled) SetLFGDungeonEnabled(dungeonID, isEnabled); LFGEnabledList[dungeonID] = not not isEnabled; --Change to true/false end function LFRList_SetHeaderEnabled(headerID, isEnabled) for _, dungeonID in pairs(LFRRaidList) do if ( LFGGetDungeonInfoByID(dungeonID)[LFG_RETURN_VALUES.groupID] == headerID ) then LFRList_SetRaidEnabled(dungeonID, isEnabled); end end for _, dungeonID in pairs(LFRHiddenByCollapseList) do if ( LFGGetDungeonInfoByID(dungeonID)[LFG_RETURN_VALUES.groupID] == headerID ) then LFRList_SetRaidEnabled(dungeonID, isEnabled); end end LFGEnabledList[headerID] = not not isEnabled; --Change to true/false end function LFRList_SetHeaderCollapsed(headerID, isCollapsed) SetLFGHeaderCollapsed(headerID, isCollapsed); LFGCollapseList[headerID] = isCollapsed; for _, dungeonID in pairs(LFRRaidList) do if ( LFGGetDungeonInfoByID(dungeonID)[LFG_RETURN_VALUES.groupID] == headerID ) then LFGCollapseList[dungeonID] = isCollapsed; end end for _, dungeonID in pairs(LFRHiddenByCollapseList) do if ( LFGGetDungeonInfoByID(dungeonID)[LFG_RETURN_VALUES.groupID] == headerID ) then LFGCollapseList[dungeonID] = isCollapsed; end end LFRQueueFrame_Update(); end --List functions function LFRQueueFrameSpecificListButton_SetDungeon(button, dungeonID, mode, submode) local info = LFGGetDungeonInfoByID(dungeonID); button.id = dungeonID; if ( LFGIsIDHeader(dungeonID) ) then local name = info[LFG_RETURN_VALUES.name]; button.instanceName:SetText(name); button.instanceName:SetFontObject(QuestDifficulty_Header); button.instanceName:SetPoint("RIGHT", button, "RIGHT", 0, 0); button.level:Hide(); if ( info[LFG_RETURN_VALUES.typeID] == TYPEID_HEROIC_DIFFICULTY ) then button.heroicIcon:Show(); button.instanceName:SetPoint("LEFT", button.heroicIcon, "RIGHT", 0, 1); else button.heroicIcon:Hide(); button.instanceName:SetPoint("LEFT", 40, 0); end button.expandOrCollapseButton:Show(); local isCollapsed = LFGCollapseList[dungeonID]; button.isCollapsed = isCollapsed; if ( isCollapsed ) then button.expandOrCollapseButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP"); else button.expandOrCollapseButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP"); end else local name = info[LFG_RETURN_VALUES.name]; local minLevel, maxLevel = info[LFG_RETURN_VALUES.minLevel], info[LFG_RETURN_VALUES.maxLevel]; local minRecLevel, maxRecLevel = info[LFG_RETURN_VALUES.minRecLevel], info[LFG_RETURN_VALUES.maxRecLevel]; local recLevel = info[LFG_RETURN_VALUES.recLevel]; button.instanceName:SetText(name); button.instanceName:SetPoint("RIGHT", button.level, "LEFT", -10, 0); button.heroicIcon:Hide(); button.instanceName:SetPoint("LEFT", 40, 0); if ( minLevel == maxLevel ) then button.level:SetText(format(LFD_LEVEL_FORMAT_SINGLE, minLevel)); else button.level:SetText(format(LFD_LEVEL_FORMAT_RANGE, minLevel, maxLevel)); end button.level:Show(); local difficultyColor = GetQuestDifficultyColor(recLevel); button.level:SetFontObject(difficultyColor.font); if ( mode == "rolecheck" or mode == "queued" or mode == "listed" or not LFR_IsEmpowered()) then button.instanceName:SetFontObject(QuestDifficulty_Header); else button.instanceName:SetFontObject(difficultyColor.font); end button.expandOrCollapseButton:Hide(); button.isCollapsed = false; end --Could probably use being refactored. if ( not LFR_CanQueueForLockedInstances() and LFGLockList[dungeonID] ) then button.enableButton:Hide(); button.lockedIndicator:Show(); else if ( LFR_CanQueueForMultiple() ) then button.enableButton:Show(); LFGSpecificChoiceEnableButton_SetIsRadio(button.enableButton, false); else if ( LFGIsIDHeader(dungeonID) ) then button.enableButton:Hide(); else button.enableButton:Show(); LFGSpecificChoiceEnableButton_SetIsRadio(button.enableButton, true); end end button.lockedIndicator:Hide(); end local enableState; if ( mode == "queued" or mode == "listed" ) then enableState = LFGQueuedForList[dungeonID]; elseif ( not LFR_CanQueueForMultiple() ) then enableState = dungeonID == LFRQueueFrame.selectedLFM; else enableState = LFGEnabledList[dungeonID]; end if ( LFR_CanQueueForMultiple() ) then if ( enableState == 1 ) then --Some are checked, some aren't. button.enableButton:SetCheckedTexture("Interface\\Buttons\\UI-MultiCheck-Up"); button.enableButton:SetDisabledCheckedTexture("Interface\\Buttons\\UI-MultiCheck-Disabled"); else button.enableButton:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check"); button.enableButton:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled"); end button.enableButton:SetChecked(enableState and enableState ~= 0); else button.enableButton:SetChecked(enableState); end if ( mode == "rolecheck" or mode == "queued" or mode == "listed" or not LFR_IsEmpowered() ) then button.enableButton:Disable(); else button.enableButton:Enable(); end end function LFRQueueFrameSpecificList_Update() if ( LFGDungeonList_Setup() ) then return; --Setup will update the list. end FauxScrollFrame_Update(LFRQueueFrameSpecificListScrollFrame, LFRGetNumDungeons(), NUM_LFR_CHOICE_BUTTONS, 16); local offset = FauxScrollFrame_GetOffset(LFRQueueFrameSpecificListScrollFrame); local areButtonsBig = not LFRQueueFrameSpecificListScrollFrame:IsShown(); local mode, subMode = GetLFGMode(); for i = 1, NUM_LFR_CHOICE_BUTTONS do local button = _G["LFRQueueFrameSpecificListButton"..i]; local dungeonID = LFRRaidList[i+offset]; if ( dungeonID ) then button:Show(); if ( areButtonsBig ) then button:SetWidth(315); else button:SetWidth(295); end LFRQueueFrameSpecificListButton_SetDungeon(button, dungeonID, mode, subMode); else button:Hide(); end end if ( LFRRaidList[1] ) then LFRQueueFrameSpecificNoRaidsAvailable:Hide(); else LFRQueueFrameSpecificNoRaidsAvailable:Show(); end end function LFRQueueFrame_QueueForInstanceIfEnabled(queueID) if ( not LFGIsIDHeader(queueID) and LFGEnabledList[queueID] and (LFR_CanQueueForLockedInstances() or not LFGLockList[queueID]) ) then local info = LFGGetDungeonInfoByID(queueID); SetLFGDungeon(queueID); return true; end return false; end function LFRQueueFrame_Join() ClearAllLFGDungeons(); if ( LFR_CanQueueForMultiple() ) then for _, queueID in pairs(LFRRaidList) do LFRQueueFrame_QueueForInstanceIfEnabled(queueID); end for _, queueID in pairs(LFRHiddenByCollapseList) do LFRQueueFrame_QueueForInstanceIfEnabled(queueID); end else if ( LFRQueueFrame.selectedLFM ) then SetLFGDungeon(LFRQueueFrame.selectedLFM); end end if ( LFRQueueFrameComment:HasFocus() ) then LFRQueueFrameComment:ClearFocus(); else SetLFGComment(LFRQueueFrameComment:GetText()); end JoinLFG(); end LFRHiddenByCollapseList = {}; function LFRQueueFrame_Update() local enableList; local mode, submode = GetLFGMode(); if ( LFR_IsEmpowered() and mode ~= "listed") then enableList = LFGEnabledList; else enableList = LFGQueuedForList; end LFRRaidList = GetLFRChoiceOrder(LFRRaidList); LFGQueueFrame_UpdateLFGDungeonList(LFRRaidList, LFRHiddenByCollapseList, LFGLockList, LFGDungeonInfo, enableList, LFGCollapseList, LFR_CURRENT_FILTER); LFRQueueFrameSpecificList_Update(); end function LFRList_DefaultFilterFunction(dungeonID) local info = LFGGetDungeonInfoByID(dungeonID) local hasHeader = info[LFG_RETURN_VALUES.groupID] ~= 0; local sufficientExpansion = EXPANSION_LEVEL >= info[LFG_RETURN_VALUES.expansionLevel]; local level = UnitLevel("player"); local sufficientLevel = level >= info[LFG_RETURN_VALUES.minLevel] and level <= info[LFG_RETURN_VALUES.maxLevel]; return (hasHeader and sufficientExpansion and sufficientLevel) and ( level - LFR_MAX_SHOWN_LEVEL_DIFF <= info[LFG_RETURN_VALUES.recLevel] or (LFGLockList and not LFGLockList[dungeonID])); --If the server tells us we can join, who are we to complain? end LFR_CURRENT_FILTER = LFRList_DefaultFilterFunction; ----------------------------------------------------------------------- -----------------------LFR Browsing-------------------------------- ----------------------------------------------------------------------- local browseFrameLocal; function LFRBrowseFrame_OnLoad(self) browseFrameLocal = self; end function LFRBrowseFrame_OnUpdateAlways(elapsed) --Actually called in UIParent_OnUpdate so that it can run while LFRBrowseFrame is hidden. local timeToClear = browseFrameLocal.timeToClear; if ( timeToClear ) then if ( timeToClear < 0 ) then SearchLFGLeave(); --We don't really have to do any of the other work done by SetSelectedValue, so why do it? LFRBrowseFrameRaidDropDownText:SetText(NONE); browseFrameLocal.timeToClear = nil; else browseFrameLocal.timeToClear = timeToClear - elapsed; end end end --We construct the list. This should only need to be called once (since we don't filter or change it), so we don't much worry about 1 garbage table. function GetFullRaidList() LFGDungeonList_Setup(); local headerOrder = {}; local list = {}; local tempList = GetLFRChoiceOrder(); LFGListRemoveHeadersWithoutChildren(tempList); for i=1, #tempList do local id = tempList[i]; if ( LFGIsIDHeader(tempList[i]) ) then tinsert(headerOrder, id); list[tempList[i]] = {}; else local parentID = LFGGetDungeonInfoByID(id)[LFG_RETURN_VALUES.groupID]; if ( parentID ~= 0 ) then local parentTable = list[parentID]; tinsert(parentTable, id); end end end return headerOrder, list; end function LFRBrowseFrameRaidDropDown_SetUp(self) UIDropDownMenu_SetWidth(self, 140); UIDropDownMenu_Initialize(self, LFRBrowseFrameRaidDropDown_Initialize); UIDropDownMenu_SetSelectedValue(LFRBrowseFrameRaidDropDown, SearchLFGGetJoinedID() or "none"); end function LFRBrowseFrameRaidDropDown_Initialize(self, level) LFGDungeonList_Setup(); if ( not LFR_FULL_RAID_LIST_HEADER_ORDER ) then LFR_FULL_RAID_LIST_HEADER_ORDER, LFR_FULL_RAID_LIST = GetFullRaidList(); end local activeSearching = SearchLFGGetJoinedID() or "none"; local info = UIDropDownMenu_CreateInfo(); if ( not level or level == 1 ) then info.text = NONE; info.value = "none"; info.func = LFRBrowseFrameRaidDropDownButton_OnClick; info.checked = activeSearching == info.value; UIDropDownMenu_AddButton(info); for _, groupID in ipairs(LFR_FULL_RAID_LIST_HEADER_ORDER) do info.text = LFGGetDungeonInfoByID(groupID)[LFG_RETURN_VALUES.name]; info.value = groupID; info.func = nil; info.hasArrow = true; info.checked = false; UIDropDownMenu_AddButton(info, 1); end elseif ( level == 2 ) then for _, dungeonID in ipairs(LFR_FULL_RAID_LIST[UIDROPDOWNMENU_MENU_VALUE]) do local info = LFGGetDungeonInfoByID(dungeonID); local maxPlayers = format(LFD_LEVEL_FORMAT_SINGLE, info[LFG_RETURN_VALUES.maxPlayers]); info.text = maxPlayers.." "..info[LFG_RETURN_VALUES.name]; info.value = dungeonID; info.func = LFRBrowseFrameRaidDropDownButton_OnClick; info.checked = activeSearching == info.value; UIDropDownMenu_AddButton(info, level); end end end function LFRBrowseFrameRaidDropDownButton_OnClick(self) LFRBrowseFrameRaidDropDown.activeValue = self.value; UIDropDownMenu_SetSelectedValue(LFRBrowseFrameRaidDropDown, self.value); HideDropDownMenu(1); --Hide the category menu. It gets annoying. if ( self.value == "none" ) then SearchLFGLeave(); else SearchLFGJoin(LFGGetDungeonInfoByID(self.value)[LFG_RETURN_VALUES.typeID], self.value); end end function LFRFrame_SetActiveTab(tab) if ( tab == 1 ) then LFRParentFrame.activeTab = 1; LFRQueueFrame:Show(); LFRBrowseFrame:Hide(); elseif ( tab == 2 ) then LFRParentFrame.activeTab = 2; LFRBrowseFrame:Show(); LFRQueueFrame:Hide(); end PanelTemplates_SetTab(LFRParentFrame, tab); end function LFRBrowseFrameRefreshButton_OnUpdate(self, elapsed) local timeLeft = self.timeUntilNextRefresh; if ( timeLeft ) then self.timeUntilNextRefresh = timeLeft - elapsed; if ( self.timeUntilNextRefresh <= 0 ) then RefreshLFGList(); end end end function LFRBrowseFrameList_Update() LFRBrowseFrameRefreshButton.timeUntilNextRefresh = LFR_BROWSE_AUTO_REFRESH_TIME; local numResults, totalResults = SearchLFGGetNumResults(); FauxScrollFrame_Update(LFRBrowseFrameListScrollFrame, numResults, NUM_LFR_LIST_BUTTONS, 16); local offset = FauxScrollFrame_GetOffset(LFRBrowseFrameListScrollFrame); for i=1, NUM_LFR_LIST_BUTTONS do local button = _G["LFRBrowseFrameListButton"..i]; if ( i <= numResults ) then LFRBrowseFrameListButton_SetData(button, i + offset); button:Show(); else button:Hide(); end end if ( LFRBrowseFrame.selectedName ) then local nameStillThere = false; for i=1, numResults do local name = SearchLFGGetResults(i); if ( LFRBrowseFrame.selectedName == name ) then nameStillThere = true; break; end end if ( not nameStillThere ) then LFRBrowseFrame.selectedName = nil; end end LFRBrowse_UpdateButtonStates(); end function LFRBrowseFrameListButton_SetData(button, index) local name, level, areaName, className, comment, partyMembers, status, class, encountersTotal, encountersComplete, isLeader, isTank, isHealer, isDamage = SearchLFGGetResults(index); button.index = index; button.unitName = name; if ( LFRBrowseFrame.selectedName == name ) then button:LockHighlight(); else button:UnlockHighlight(); end button.name:SetText(name); button.level:SetText(level); local classTextColor; if ( class ) then classTextColor = RAID_CLASS_COLORS[class]; else classTextColor = NORMAL_FONT_COLOR; end button.class:SetText(className); button.class:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b); if ( partyMembers > 0 ) then button.type = "party"; button.partyIcon:Show(); button.tankIcon:Hide(); button.healerIcon:Hide(); button.damageIcon:Hide(); else button.type = "individual"; button.partyIcon:Hide(); if ( isTank ) then button.tankIcon:Show() else button.tankIcon:Hide(); end if ( isHealer ) then button.healerIcon:Show(); else button.healerIcon:Hide(); end if ( isDamage ) then button.damageIcon:Show(); else button.damageIcon:Hide(); end end if ( name == UnitName("player") ) then button:Disable(); button.name:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b) button.level:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); button.class:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); button.tankIcon:SetTexture("Interface\\LFGFrame\\LFGRole_BW"); button.healerIcon:SetTexture("Interface\\LFGFrame\\LFGRole_BW"); button.damageIcon:SetTexture("Interface\\LFGFrame\\LFGRole_BW"); button.partyIcon:SetTexture("Interface\\LFGFrame\\LFGRole_BW"); else button:Enable(); button.name:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b) button.level:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); button.tankIcon:SetTexture("Interface\\LFGFrame\\LFGRole"); button.healerIcon:SetTexture("Interface\\LFGFrame\\LFGRole"); button.damageIcon:SetTexture("Interface\\LFGFrame\\LFGRole"); button.partyIcon:SetTexture("Interface\\LFGFrame\\LFGRole"); end end function LFRBrowseButton_OnEnter(self) local name, level, areaName, className, comment, partyMembers, status, class, encountersTotal, encountersComplete, isLeader, isTank, isHealer, isDamage = SearchLFGGetResults(self.index); GameTooltip:SetOwner(self, "ANCHOR_RIGHT", 27, -37); if ( partyMembers > 0 ) then GameTooltip:AddLine(LOOKING_FOR_RAID); GameTooltip:AddLine(name); GameTooltip:AddTexture("Interface\\LFGFrame\\LFGRole", 0, 0.25, 0, 1); GameTooltip:AddLine(format(LFM_NUM_RAID_MEMBER_TEMPLATE, partyMembers)); -- Bogus texture to fix spacing GameTooltip:AddTexture(""); --Display ignored party members and friend party members. (You probably won't care about the rest. Though guildys would be nice at some point...) local displayedMembersLabel = false; for i=1, partyMembers do local name, level, relationship, className, areaName, comment = SearchLFGGetPartyResults(self.index, i); if ( relationship ) then if ( not displayedMembersLabel ) then displayedMembersLabel = true; GameTooltip:AddLine("\n"..IMPORTANT_PEOPLE_IN_GROUP); end if ( relationship == "ignored" ) then GameTooltip:AddDoubleLine(name, IGNORED, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b); elseif ( relationship == "friend" ) then GameTooltip:AddDoubleLine(name, FRIEND, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b); end end end else GameTooltip:AddLine(name); GameTooltip:AddLine(format(FRIENDS_LEVEL_TEMPLATE, level, className)); end if ( comment and comment ~= "" ) then GameTooltip:AddLine("\n"..comment, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b, 1); end if ( partyMembers == 0 ) then GameTooltip:AddLine("\n"..LFG_TOOLTIP_ROLES); if ( isTank ) then GameTooltip:AddLine(TANK); GameTooltip:AddTexture("Interface\\LFGFrame\\LFGRole", 0.5, 0.75, 0, 1); end if ( isHealer ) then GameTooltip:AddLine(HEALER); GameTooltip:AddTexture("Interface\\LFGFrame\\LFGRole", 0.75, 1, 0, 1); end if ( isDamage ) then GameTooltip:AddLine(DAMAGER); GameTooltip:AddTexture("Interface\\LFGFrame\\LFGRole", 0.25, 0.5, 0, 1); end end if ( encountersComplete > 0 ) then GameTooltip:AddLine("\n"..BOSSES); for i=1, encountersTotal do local bossName, texture, isKilled = SearchLFGGetEncounterResults(self.index, i); if ( isKilled ) then GameTooltip:AddDoubleLine(bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b); else GameTooltip:AddDoubleLine(bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b); end end elseif ( partyMembers > 0 and encountersTotal > 0) then GameTooltip:AddLine("\n"..ALL_BOSSES_ALIVE); end GameTooltip:Show(); end --this is used by the static popup for INSTANCE_LOCK_TIMER function InstanceLock_OnEnter(self) GameTooltip:SetOwner(self:GetParent(), "ANCHOR_BOTTOM"); if ( self.encountersComplete > 0 ) then GameTooltip:SetText(BOSSES); for i=1, self.encountersTotal do local bossName, texture, isKilled = GetInstanceLockTimeRemainingEncounter(i); if ( isKilled ) then GameTooltip:AddDoubleLine(bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b); else GameTooltip:AddDoubleLine(bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b); end end else GameTooltip:SetText(ALL_BOSSES_ALIVE); end GameTooltip:Show(); end function LFRBrowseButton_OnClick(self) if ( LFRBrowseFrame.selectedName == self.unitName ) then PlaySound("igMainMenuOptionCheckBoxOff"); LFRBrowseFrame.selectedName = nil; LFRBrowseFrame.selectedType = nil; self:UnlockHighlight(); else PlaySound("igMainMenuOptionCheckBoxOn"); LFRBrowseFrame.selectedName = self.unitName; LFRBrowseFrame.selectedType = self.type; --Unlock all other highlights for i=1, NUM_LFR_LIST_BUTTONS do _G["LFRBrowseFrameListButton"..i]:UnlockHighlight(); end self:LockHighlight(); end LFRBrowse_UpdateButtonStates(); end function LFRBrowse_UpdateButtonStates() local playerName = UnitName("player"); local selectedName = LFRBrowseFrame.selectedName; if ( selectedName and selectedName ~= playerName ) then LFRBrowseFrameSendMessageButton:Enable(); else LFRBrowseFrameSendMessageButton:Disable(); end if ( selectedName and selectedName ~= playerName and LFRBrowseFrame.selectedType ~= "party" and CanGroupInvite() ) then LFRBrowseFrameInviteButton:Enable(); else LFRBrowseFrameInviteButton:Disable(); end end