NUMGOSSIPBUTTONS = 32; function GossipFrame_OnLoad(self) self:RegisterEvent("GOSSIP_SHOW"); self:RegisterEvent("GOSSIP_CLOSED"); end function GossipFrame_OnEvent(self, event, ...) if ( event == "GOSSIP_SHOW" ) then -- if there is only a non-gossip option, then go to it directly if ( (GetNumGossipAvailableQuests() == 0) and (GetNumGossipActiveQuests() == 0) and (GetNumGossipOptions() == 1) and not ForceGossip() ) then local text, gossipType = GetGossipOptions(); if ( gossipType ~= "gossip" ) then SelectGossipOption(1); return; end end if ( not GossipFrame:IsShown() ) then ShowUIPanel(self); if ( not self:IsShown() ) then CloseGossip(); return; end end GossipFrameUpdate(); elseif ( event == "GOSSIP_CLOSED" ) then HideUIPanel(self); end end function GossipFrameUpdate() GossipFrame.buttonIndex = 1; GossipGreetingText:SetText(GetGossipText()); GossipFrameAvailableQuestsUpdate(GetGossipAvailableQuests()); GossipFrameActiveQuestsUpdate(GetGossipActiveQuests()); GossipFrameOptionsUpdate(GetGossipOptions()); for i=GossipFrame.buttonIndex, NUMGOSSIPBUTTONS do _G["GossipTitleButton" .. i]:Hide(); end GossipFrameNpcNameText:SetText(UnitName("npc")); if ( UnitExists("npc") ) then SetPortraitTexture(GossipFramePortrait, "npc"); else GossipFramePortrait:SetTexture("Interface\\QuestFrame\\UI-QuestLog-BookIcon"); end -- Set Spacer if ( GossipFrame.buttonIndex > 1 ) then GossipSpacerFrame:SetPoint("TOP", "GossipTitleButton"..GossipFrame.buttonIndex-1, "BOTTOM", 0, 0); GossipSpacerFrame:Show(); else GossipSpacerFrame:Hide(); end -- Update scrollframe GossipGreetingScrollFrame:SetVerticalScroll(0); end function GossipTitleButton_OnClick(self, button) if ( self.type == "Available" ) then SelectGossipAvailableQuest(self:GetID()); elseif ( self.type == "Active" ) then SelectGossipActiveQuest(self:GetID()); else SelectGossipOption(self:GetID()); end end function GossipFrameAvailableQuestsUpdate(...) local titleButton; local titleIndex = 1; local titleButtonIcon; local isTrivial, isDaily, isRepeatable; for i=1, select("#", ...), 5 do if ( GossipFrame.buttonIndex > NUMGOSSIPBUTTONS ) then message("This NPC has too many quests and/or gossip options."); end titleButton = _G["GossipTitleButton" .. GossipFrame.buttonIndex]; titleButtonIcon = _G[titleButton:GetName() .. "GossipIcon"]; isTrivial = select(i+2, ...); isDaily = select(i+3, ...); isRepeatable = select(i+4, ...); if ( isDaily ) then titleButtonIcon:SetTexture("Interface\\GossipFrame\\DailyQuestIcon"); elseif ( isRepeatable ) then titleButtonIcon:SetTexture("Interface\\GossipFrame\\DailyActiveQuestIcon"); else titleButtonIcon:SetTexture("Interface\\GossipFrame\\AvailableQuestIcon"); end if ( isTrivial ) then titleButton:SetFormattedText(TRIVIAL_QUEST_DISPLAY, select(i, ...)); titleButtonIcon:SetVertexColor(0.5,0.5,0.5); else titleButton:SetFormattedText(NORMAL_QUEST_DISPLAY, select(i, ...)); titleButtonIcon:SetVertexColor(1,1,1); end GossipResize(titleButton); titleButton:SetID(titleIndex); titleButton.type="Available"; GossipFrame.buttonIndex = GossipFrame.buttonIndex + 1; titleIndex = titleIndex + 1; titleButton:Show(); end if ( GossipFrame.buttonIndex > 1 ) then titleButton = _G["GossipTitleButton" .. GossipFrame.buttonIndex]; titleButton:Hide(); GossipFrame.buttonIndex = GossipFrame.buttonIndex + 1; end end function GossipFrameActiveQuestsUpdate(...) local titleButton; local titleIndex = 1; local titleButtonIcon; for i=1, select("#", ...), 4 do if ( GossipFrame.buttonIndex > NUMGOSSIPBUTTONS ) then message("This NPC has too many quests and/or gossip options."); end titleButton = _G["GossipTitleButton" .. GossipFrame.buttonIndex]; titleButtonIcon = _G[titleButton:GetName() .. "GossipIcon"]; if ( select(i+2, ...) ) then titleButton:SetFormattedText(TRIVIAL_QUEST_DISPLAY, select(i, ...)); titleButtonIcon:SetVertexColor(0.5,0.5,0.5); else titleButton:SetFormattedText(NORMAL_QUEST_DISPLAY, select(i, ...)); titleButtonIcon:SetVertexColor(1,1,1); end GossipResize(titleButton); titleButton:SetID(titleIndex); titleButton.type="Active"; if ( select(i+3, ...) ) then titleButtonIcon:SetTexture("Interface\\GossipFrame\\ActiveQuestIcon"); else titleButtonIcon:SetTexture("Interface\\GossipFrame\\IncompleteQuestIcon"); end GossipFrame.buttonIndex = GossipFrame.buttonIndex + 1; titleIndex = titleIndex + 1; titleButton:Show(); end if ( titleIndex > 1 ) then titleButton = _G["GossipTitleButton" .. GossipFrame.buttonIndex]; titleButton:Hide(); GossipFrame.buttonIndex = GossipFrame.buttonIndex + 1; end end function GossipFrameOptionsUpdate(...) local titleButton; local titleIndex = 1; local titleButtonIcon; for i=1, select("#", ...), 2 do if ( GossipFrame.buttonIndex > NUMGOSSIPBUTTONS ) then message("This NPC has too many quests and/or gossip options."); end titleButton = _G["GossipTitleButton" .. GossipFrame.buttonIndex]; titleButton:SetText(select(i, ...)); GossipResize(titleButton); titleButton:SetID(titleIndex); titleButton.type="Gossip"; titleButtonIcon = _G[titleButton:GetName() .. "GossipIcon"]; titleButtonIcon:SetTexture("Interface\\GossipFrame\\" .. select(i+1, ...) .. "GossipIcon"); titleButtonIcon:SetVertexColor(1, 1, 1, 1); GossipFrame.buttonIndex = GossipFrame.buttonIndex + 1; titleIndex = titleIndex + 1; titleButton:Show(); end end function GossipResize(titleButton) titleButton:SetHeight( titleButton:GetTextHeight() + 2); end