An Aku'mai Servant
Join Date: May 2008
Posts: 36
|
Over my head and drowning...
For a little background, I started programming in 1975 using COBOL and FORTRAN. I did a little Basic years later but lapsed in my programming for about 25 years. At 54 I started up with Lua about the time TOT hit to make my Lei Shen addon. That was a learning experience but it was started from scratch. Now thinking I could take over to breathe new life into QuestGuru that was programmed by two other people I am finding myself drowning. I really can't understand how Blizz broke this addon so badly. I have used it for years and has worked just great. But 6.0.2 broke it almost beyond repair. I know you folks have your addons you are trying to update but am asking for some "hand holding" so I can get this addon back into the hands of the people who use and love it like I do. I am listing the code below for the Lua, xml and bindings. Thanks in advance for your help.
QuestGuru.toc
Code:
## Interface: 60000## Title: QuestGuru
## Version: 2.3.00-60000
## Notes: Quest Log Enhancement
## Author: Lazare, current author (MrOBrian/Gregity, past authors)
## SavedVariables: QuestGuru_Items, QuestGuru_Settings
## SavedVariablesPerCharacter:
ChatThrottleLib.lua
localization.lua
localization.DE.lua
localization.FR.lua
localization.RU.lua
localization.TW.lua
localization.CN.lua
QuestGuruComm.lua
QuestGuru_Templates.xml
QuestGuru.xml
QuestGuruOptions.lua
QuestGuruAnnounce.lua
Bindings.xml
QuestGuru.lua
lua Code:
QUESTGURU_VERSION = GetAddOnMetadata("QuestGuru", "Version"); QuestGuru_Settings = {}; QuestGuru_Items = {}; QGC_Cache = {}; QGC_Active = {}; BINDING_HEADER_QUESTGURU = "QuestGuru" BINDING_NAME_QUESTGURU_TOGGLE = "Show/Hide Quest Log" local QuestGuru_RealmName, QuestGuru_PlayerFaction; do local qgf = CreateFrame("Frame", "qgf", UIParent); qgf:SetScript("OnEvent", function (self, event, arg1, arg2) QuestGuru_OnEvent(self, event, arg1, arg2); end); qgf:RegisterEvent("QUEST_DETAIL") qgf:RegisterEvent("QUEST_LOG_UPDATE") qgf:RegisterEvent("QUEST_WATCH_LIST_CHANGED") qgf:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED") qgf:RegisterEvent("GROUP_ROSTER_UPDATE") qgf:RegisterEvent("PARTY_MEMBER_ENABLE") qgf:RegisterEvent("PARTY_MEMBER_DISABLE") qgf:RegisterEvent("QUEST_POI_UPDATE") qgf:RegisterEvent("QUEST_WATCH_UPDATE") qgf:RegisterEvent("QUEST_ACCEPTED") qgf:RegisterEvent("UNIT_QUEST_LOG_CHANGED") tinsert(UISpecialFrames, "QuestLogFrame"); QuestLogFrame:SetMovable(true) QuestLogFrame:EnableMouse(true) QuestLogFrame:RegisterForDrag("LeftButton") QuestLogFrame:SetScript("OnDragStart", QuestLogFrame.StartMoving) QuestLogFrame:SetScript("OnDragStop", QuestLogFrame.StopMovingOrSizing) end function QuestGuru_OnEvent(self, event, arg1, arg2) if (event == "UI_INFO_MESSAGE") then QuestGuru_UIInfoMessage(arg1); elseif (event == "VARIABLES_LOADED") then QuestLogTitleText:SetText(QuestLogTitleText:GetText().." - QuestGuru v"..QUESTGURU_VERSION); QuestGuru_LoadVariables(); QuestGuru_HistoryShowButton:Hide(); if IsAddOnLoaded("QuestCompletist") then QuestGuru_HistoryShowButton:Show(); end elseif (event=="QUEST_COMPLETE") then if (QuestGuru_Settings.AutoComplete and (GetNumQuestChoices() == 0)) then QuestRewardCompleteButton_OnClick(); end elseif (event=="QUEST_PROGRESS") then QuestGuru_QuestProgressShow(); if (QuestGuru_Settings.AutoComplete and IsQuestCompletable()) then CompleteQuest(); end elseif (event=="QUEST_LOG_UPDATE") then wipe(QGC_Active); local numEntries, numQuests = GetNumQuestLogEntries(); for i=1, numEntries do local qLink = GetQuestLink(i); if (qLink) then local qi, qj, questNum = string.find(qLink, (":(%d+):")); if (questNum) then QGC_Active[questNum]="true"; end end end elseif (event=="GOSSIP_SHOW") then QuestGuru_GossipShow(); elseif (event=="QUEST_GREETING") then QuestGuru_QuestFrameGreetingPanel_OnShow(); elseif (event=="QUEST_DETAIL") then QuestGuru_QuestDetailShow(); end end function QuestGuru_ShowHistory() -- Bring up any history addon that is installed but doesn't have it's own button if IsAddOnLoaded("QuestCompletist") then qcQuestCompletistUI:Show(); end end function QuestGuru_TitleButtonCheckBox_OnClick(self, button, down) local index = self:GetParent():GetID(); local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(index); if (self:GetChecked()) then if (isHeader) then QuestGuru_AddQuestWatchHeader(questLogTitleText); else if (not AddQuestWatch(index)) then self:SetChecked(0); end end else if (isHeader) then QuestGuru_RemoveQuestWatchHeader(questLogTitleText); else RemoveQuestWatch(index); end end WatchFrame_Update(); QuestLog_Update(); end function QuestGuru_AddQuestWatchHeader(questHeader) local numEntries, numQuests = GetNumQuestLogEntries(); local inHeader = false; for questIndex=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); if (isHeader) then if (questLogTitleText == questHeader) then inHeader = true; else inHeader = false; end end if (inHeader and (not isHeader)) then AddQuestWatch(questIndex); end end end function IsHeaderWatched(questHeader) local numEntries, numQuests = GetNumQuestLogEntries(); local inHeader = false; local headerWatched = true; for questIndex=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); if (isHeader) then if (questLogTitleText == questHeader) then inHeader = true; else inHeader = false; end end if (inHeader and (not isHeader)) then headerWatched = (headerWatched and IsQuestWatched(questIndex)); end end return headerWatched; end function QuestGuru_RemoveQuestWatchHeader(questHeader) local numEntries, numQuests = GetNumQuestLogEntries(); local inHeader = false; for questIndex=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); if (isHeader) then if (questLogTitleText == questHeader) then inHeader = true; else inHeader = false; end end if (inHeader and (not isHeader)) then RemoveQuestWatch(questIndex); end end end local prevParent; local function QuestGuru_QuestLog_HighlightQuest(questLogTitle) if ( prevParent and prevParent ~= questLogTitle ) then -- set prev quest's colors back to normal prevParent.level:SetTextColor(prevParent.r, prevParent.g, prevParent.b); end if ( questLogTitle ) then -- highlight the quest's colors questLogTitle.level:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); end prevParent = questLogTitle; end function QuestGuru_SetSelection(questIndex) if ( questIndex == 0 ) then return; end -- find and highlight the selected quest local buttons = QuestLogScrollFrame.buttons; local numButtons = #buttons; local min = 1; local max = #buttons; local mid; local titleButton, id; while ( min <= max ) do mid = bit.rshift(min + max, 1); titleButton = buttons[mid]; id = titleButton:GetID(); if ( id == questIndex ) then QuestGuru_QuestLog_HighlightQuest(titleButton); break; end if ( id > questIndex ) then max = mid - 1; else min = mid + 1; end end -- Dridzt supplied snippet to solve some obscure framelevel issues. local QG_qlcp = _G["QuestLogControlPanel"] QG_qlcp:SetFrameLevel(QG_qlcp:GetParent():GetFrameLevel()+1); end hooksecurefunc("QuestLog_SetSelection", QuestGuru_SetSelection); --local QG_QuestLogUpdate = QuestLog_Update; function QG_QuestLog_Update() -- QG_QuestLogUpdate(); local buttons = QuestLogScrollFrame.buttons; local numButtons = #buttons; local scrollOffset = HybridScrollFrame_GetOffset(QuestLogScrollFrame); local questLogSelection = GetQuestLogSelection(); local questIndex, questLogTitle, questTitleTag, questNumGroupMates, questNormalText, questCheck; local title, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily; for i=1, numButtons do questLogTitle = buttons[i]; questIndex = questLogTitle:GetID(); title, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questIndex); questNumGroupMates = questLogTitle.groupMates; questNumGroupMates:SetPoint("LEFT", 6, 0); if (questLogTitle.level == nil) then questLogTitle.level = questLogTitle:CreateFontString(questLogTitle:GetName().."Level", "BACKGROUND", "GameFontNormalSmall"); questLogTitle.tag:SetFontObject("GameFontNormalSmall"); questLogTitle.level:SetPoint("LEFT", 28, 0); questLogTitle.level:SetWidth(32); questLogTitle.level:SetJustifyH("CENTER"); questLogTitle.level.parentKey = "level"; questLogTitle:HookScript("OnEnter", function(self) self.level:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); end); questLogTitle:HookScript("OnLeave", function(self) if ( self:GetID() ~= QuestLogFrame.selectedIndex ) then self.level:SetTextColor(self.r, self.g, self.b); end end); end if (questLogTitle.checkBox == nil) then questLogTitle.checkBox = CreateFrame("CheckButton", questLogTitle:GetName().."CheckBox", questLogTitle, "OptionsCheckButtonTemplate"); questLogTitle.checkBox:SetHeight(16); questLogTitle.checkBox:SetWidth(16); questLogTitle.checkBox:SetPoint("LEFT", 16, 0); questLogTitle.checkBox:SetHitRectInsets(0, 0, 0, 0); questLogTitle.checkBox:SetScript("OnClick", QuestGuru_TitleButtonCheckBox_OnClick); end questLogTitle.check:Hide(); questLevel = questLogTitle.level; if (isHeader) then questLevel:SetText(""); questLogTitle.normalText:SetPoint("LEFT", 32, 0); if (IsHeaderWatched(title)) then questLogTitle.checkBox:SetChecked(1); else questLogTitle.checkBox:SetChecked(0); end else local strLvl = level if (isDaily) then strLvl = strLvl.."Y"; end if (questTag ~= nil) then if ((questTag == "Group") and (suggestedGroup > 0)) then strLvl = strLvl.."G"..suggestedGroup; elseif (questTag == "Dungeon") then strLvl = strLvl.."D"; else strLvl = strLvl.."+" end else if (suggestedGroup > 0) then strLvl = strLvl.."G"..suggestedGroup; end end if (QuestGuru_Settings.ShowLevels == nil) then QuestGuru_Settings.ShowLevels = {}; end if (QuestGuru_Settings.ShowLevels.QuestLog) then questLevel:Show(); textLeft = 52; else questLevel:Hide(); textLeft = 32; end questLevel:SetText(strLvl); questLogTitle.normalText:SetPoint("LEFT", textLeft, 0); local color = GetQuestDifficultyColor(level); questLevel:SetTextColor(color.r, color.g, color.b); if ( questLogSelection == questIndex ) then QuestGuru_QuestLog_HighlightQuest(questLogTitle); end if (IsQuestWatched(questIndex)) then questLogTitle.checkBox:SetChecked(1); else questLogTitle.checkBox:SetChecked(0); end end QuestLogTitleButton_Resize(questLogTitle); end end hooksecurefunc("QuestLog_Update", QG_QuestLog_Update); QuestLogScrollFrame.update = function () QuestLog_Update(); end; function QuestGuru_ShowObjectives(template, parentFrame, acceptButton, material) local i, lastObjective; local numObjectives = GetNumQuestLeaderBoards(); for i=1, MAX_OBJECTIVES do _G["QuestGuru_QuestLogObjectiveItem"..i]:Hide(); _G["QuestGuru_QuestLogObjectiveItem"..i].timerEnabled = false; end if (QuestGuru_Settings.ShowObjItemIcons) then local currObjItem = 0; for i=1, numObjectives, 1 do local text, type, finished = GetQuestLogLeaderBoard(i); local count; if (type == "item") then local questObj = _G["QuestInfoObjective"..i]; if ( not text or strlen(text) == 0 ) then text = type; end if ( finished ) then questObj:SetTextColor(0.2, 0.2, 0.2); text = text.." ("..COMPLETE..")"; else questObj:SetTextColor(0, 0, 0); end questObj:SetText(text); questObj:Show(); questObj:SetAlpha(0); lastObjective = questObj; currObjItem = currObjItem + 1; local questItem = _G["QuestGuru_QuestLogObjectiveItem"..currObjItem]; questItem.type = "required"; local x, y, name, numItems, numNeeded = string.find(text, QG_ITEM_REQ_STR); local iiName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, texture = GetItemInfo(name); if ((not itemLink) and QuestGuru_Items[QuestGuru_RealmName][name]) then iiName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, texture = GetItemInfo(QuestGuru_Items[QuestGuru_RealmName][name]); end if (not itemLink) then texture = "Interface\\Icons\\INV_Misc_QuestionMark"; count = 0; SetItemButtonTextureVertexColor(questItem, 0.4, 0.4, 0.4); QuestGuru_CommSendPGMessage("0301", name); else if (texture == nil) then GameTooltip:SetHyperlink(itemLink); GameTooltip:Show(); GameTooltip:Hide(); questItem.timerEnabled = true; end count = GetItemCount(itemLink); SetItemButtonTextureVertexColor(questItem, 0.8, 0.8, 0.8); end questItem:SetID(currObjItem) -- For the tooltip questItem.rewardType = "item" questItem.link = itemLink; _G["QuestGuru_QuestLogObjectiveItem"..currObjItem.."Name"]:SetText(name); _G["QuestGuru_QuestLogObjectiveItem"..currObjItem.."Count"]:SetText(count.." /"..numNeeded); SetItemButtonTexture(questItem, texture); SetItemButtonNameFrameVertexColor(questItem, 1, 1, 1); if ( currObjItem > 1 ) then if ( mod(currObjItem ,2) == 1 ) then questItem:SetPoint("TOPLEFT", "QuestGuru_QuestLogObjectiveItem"..(currObjItem - 2), "BOTTOMLEFT", 0, -2); lastObjective = questItem; else questItem:SetPoint("TOPLEFT", "QuestGuru_QuestLogObjectiveItem"..(currObjItem - 1), "TOPRIGHT", 1, 0); lastObjective = _G["QuestGuru_QuestLogObjectiveItem"..(currObjItem)-1]; end else if (i > 1) then questItem:SetPoint("TOPLEFT", "QuestInfoObjective"..(i - 1), "BOTTOMLEFT", 0, -5); else questItem:SetPoint("TOPLEFT"); end lastObjective = questItem; end questItem:Show(); end end if ( lastObjective ) then QuestInfoObjectivesFrame:SetHeight(QuestInfoObjectivesFrame:GetTop() - lastObjective:GetTop() + lastObjective:GetHeight()); QuestInfoDescriptionHeader:SetPoint("TOPLEFT", QuestInfoObjectivesFrame, "BOTTOMLEFT"); end end end hooksecurefunc("QuestInfo_Display", QuestGuru_ShowObjectives); function QuestGuru_UIInfoMessage(arg1) QuestGuru_Echo(string.format("QuestGuru_UIInfoMessage invoked, arg1=%s", tostring(arg1) ), false) local questID=0; local sound, announceText; local numEntries, numQuests = GetNumQuestLogEntries(); local i, ii, jj, itemName, numDone, numNeeded; local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily; if (arg1 == nil) then return; end for questID=1, numEntries, 1 do questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(questID); local numObjectives = GetNumQuestLeaderBoards(questID); local currQuest = false; local questComplete = true; sound = nil; announceText = nil; if (numObjectives ~= nil) then for i=1, numObjectives, 1 do local text, type, finished = GetQuestLogLeaderBoard(i,questID); if (text == nil) then QuestGuru_Echo(string.format("Error: numEntries=%s, numQuests=%s", tostring(numEntries), tostring(numQuests) ), false) QuestGuru_Echo(string.format("Error: Variable text is nil. arg1=%s, questID=%s, i=%s, numObjectives=%s, questLogTitleText=%s", tostring(arg1), tostring(questID), tostring(i), tostring(numObjectives), tostring(questLogTitleText) ), false) QuestGuru_Echo(string.format("Error: text=%s, type=%s, finished=%s", tostring(text), tostring(type), tostring(finished) ), false) else local qi, qj, qitemName, qnumDone, qnumNeeded = string.find(text, QG_ITEM_REQ_STR); if ((type == "item") or (type == "monster") or (type == "object")) then if (type == "object") then type = "item"; end ii, jj, itemName, numDone, numNeeded = string.find(arg1, QG_ITEM_REQ_STR); if ((itemName == qitemName) and (numNeeded == qnumNeeded)) then if (QuestGuru_Settings.Sounds.Progress.Enabled) then sound = QuestGuru_Settings.Sounds.Progress.Sound; end if (QuestGuru_Settings.Announce.item.Enabled and (type == "item")) then announceText = QuestGuru_Settings.Announce.item.Text; end if (QuestGuru_Settings.Announce.monster.Enabled and (type == "monster")) then announceText = QuestGuru_Settings.Announce.monster.Text; end if (numDone == numNeeded) then if (QuestGuru_Settings.Sounds.ObjComplete.Enabled) then sound = QuestGuru_Settings.Sounds.ObjComplete.Sound; end if (announceText) then announceText = announceText.." ("..QG_ANNOUNCE_KEYWORD_COMPLETE..")"; end finished = true; end currQuest = true; end elseif (type == "event") then itemName = text; numDone=1; numNeeded=1; if (arg1 == text.." ("..COMPLETE..")") then if (QuestGuru_Settings.Sounds.ObjComplete.Enabled) then sound = QuestGuru_Settings.Sounds.ObjComplete.Sound; end if (QuestGuru_Settings.Announce.event.Enabled) then announceText = QuestGuru_Settings.Announce.event.Text; end currQuest = true; finished = true; end end if (not finished) then questComplete = false; end end end end if (currQuest) then if (questComplete) then if (QuestGuru_Settings.Sounds.QuestComplete.Enabled) then sound = QuestGuru_Settings.Sounds.QuestComplete.Sound; end if (QuestGuru_Settings.Announce.Quest.Enabled) then announceText = QuestGuru_Settings.Announce.Quest.Text; end UIErrorsFrame:AddMessage(QG_QUEST_COMPLETE, 1, 1, 0, 1, 5); end QuestGuru_PlayExtraSound(sound); QuestGuru_DoAnnounce(announceText, numDone, numNeeded, itemName, questLogTitleText, arg1, questID); QuestGuru_CommAddTimer(1, 1, QuestGuru_SendQuestStatus, questID, false); end end end function QuestGuru_PlayExtraSound(sound) if (sound == nil) then return; end if (QuestGuru_Settings.Sounds.Enabled) then if ((string.sub(sound, -4) == ".wav") or (string.sub(sound, -4) == ".mp3")) then PlaySoundFile(sound); else PlaySound(sound); end end end function QuestGuru_QuestProgressShow() local questTitle = GetTitleText(); QuestGuru_UpdateProgressFrame(questTitle, GetGossipActiveQuests()); local i; for i=1, GetNumQuestItems() do local name, texture, numItems, quality, isUsable = GetQuestItemInfo("required", i); local link = GetQuestItemLink("required", i); if (name and link) then QuestGuru_Items[QuestGuru_RealmName][name] = link; _G["QuestProgressItem"..i].link = link; _G["QuestProgressItem"..i]:SetScript("OnEnter", function (self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT"); GameTooltip:SetHyperlink(self.link); end); end end end function QuestGuru_UpdateProgressFrame(questTitle, ...) local i; for i=1, select("#", ...), 3 do if (select(i, ...) == questTitle) then QuestProgressTitleText:SetText("["..select(i+1, ...).."] "..questTitle); end end end function QuestGuru_LoadVariables() QuestGuru_Player = UnitName("player"); QuestGuru_PlayerFaction = UnitFactionGroup("player"); QuestGuru_RealmName = GetRealmName(); if (QuestGuru_Items == nil) then QuestGuru_Items = {}; end if (QuestGuru_Items[QuestGuru_RealmName] == nil) then QuestGuru_Items[QuestGuru_RealmName] = {}; end if (QuestGuru_Settings == nil) then QuestGuru_Settings = {}; end QuestGuru_QuestAnnounceLoadSettings(); QuestGuru_OptionsSoundsLoadSettings(); if (QuestGuru_Settings.AutoComplete ~= true) then QuestGuru_Settings.AutoComplete = false; end QuestGuru_OptionsFrameAutoCompleteToggle:SetChecked(QuestGuru_Settings.AutoComplete); if (QuestGuru_Settings.ShowObjItemIcons ~= true) then QuestGuru_Settings.ShowObjItemIcons = false; end QuestGuru_OptionsFrameShowObjItemIconsToggle:SetChecked(QuestGuru_Settings.ShowObjItemIcons); if (QuestGuru_Settings.DisableComm ~= true) then QuestGuru_Settings.DisableComm = false; end QuestGuru_OptionsFrameDisableCommToggle:SetChecked(QuestGuru_Settings.DisableComm); if (QuestGuru_Settings.HeaderQuests ~= false) then QuestGuru_Settings.HeaderQuests = true; end QuestGuru_OptionsFrameShowHeaderQuestsToggle:SetChecked(QuestGuru_Settings.HeaderQuests); if (QuestGuru_Settings.ShowLevels == nil) then QuestGuru_Settings.ShowLevels = {}; end if (QuestGuru_Settings.ShowLevels.QuestLog ~= false) then QuestGuru_Settings.ShowLevels.QuestLog = true; end QuestGuru_OptionsFrameShowLevelsQuestLogToggle:SetChecked(QuestGuru_Settings.ShowLevels.QuestLog); end function QuestGuru_Echo(msg, always) local info = ChatTypeInfo["SYSTEM"]; if msg == nil then msg = "<nil>"; end -- if (always) then -- DEFAULT_CHAT_FRAME:AddMessage("always " .. tostring(always), info.r, info.g, info.b, info.id); -- else -- DEFAULT_CHAT_FRAME:AddMessage("not always " .. tostring(always), info.r, info.g, info.b, info.id); -- end -- if (QuestGuru_Settings) then -- DEFAULT_CHAT_FRAME:AddMessage("QuestGuru_Settings", info.r, info.g, info.b, info.id); -- if (QuestGuru_Settings.DebugLevel) then -- DEFAULT_CHAT_FRAME:AddMessage("QuestGuru_Settings.DebugLevel = " .. QuestGuru_Settings.DebugLevel, info.r, info.g, info.b, info.id); -- DEFAULT_CHAT_FRAME:AddMessage(msg, info.r, info.g, info.b, info.id); -- end -- end if (always or (QuestGuru_Settings and QuestGuru_Settings.DebugLevel and QuestGuru_Settings.DebugLevel > 0)) then DEFAULT_CHAT_FRAME:AddMessage(msg, info.r, info.g, info.b, info.id); end end --function QuestGuru_Dump(Var2Dump, Label) -- if ( Label ~= nil ) then -- DEFAULT_CHAT_FRAME:AddMessage("Dump " .. Label .. ":"); -- end -- DevTools_Dump(Var2Dump) --end -- function function QuestGuru_QuestFrameGreetingPanel_OnShow() local numActiveQuests = GetNumActiveQuests(); for i=1, numActiveQuests, 1 do local questTitleButton = _G["QuestTitleButton"..i]; local questTitleButtonIcon = _G[questTitleButton:GetName() .. "QuestIcon"]; local level = GetActiveLevel(i); if (level == -1) then level = "*"; end local title = GetActiveTitle(i); if ( IsActiveQuestTrivial(i) ) then questTitleButton:SetFormattedText(TRIVIAL_QUEST_DISPLAY, "["..level.."] "..title); else questTitleButton:SetFormattedText(NORMAL_QUEST_DISPLAY, "["..level.."] "..title); end if (QuestGuru_IsQuestComplete(title)) then SetDesaturation(questTitleButtonIcon, nil); else SetDesaturation(questTitleButtonIcon, 1); end end local numAvailableQuests = GetNumAvailableQuests(); for i=(numActiveQuests + 1), (numActiveQuests + numAvailableQuests), 1 do local questTitleButton = _G["QuestTitleButton"..i]; local questTitleButtonIcon = _G[questTitleButton:GetName() .. "QuestIcon"]; local level = GetAvailableLevel(i - numActiveQuests); if (level == -1) then level = "*"; end local title = GetAvailableTitle(i - numActiveQuests); if ( IsAvailableQuestTrivial(i - numActiveQuests) ) then questTitleButton:SetFormattedText(TRIVIAL_QUEST_DISPLAY, "["..level.."] "..title); questTitleButtonIcon:SetVertexColor(0.5,0.5,0.5); else questTitleButton:SetFormattedText(NORMAL_QUEST_DISPLAY, "["..level.."] "..title); questTitleButtonIcon:SetVertexColor(1,1,1); end end end function QuestGuru_QuestDetailShow() local questTitle = GetTitleText(); QuestGuru_UpdateDetailFrame(questTitle, GetGossipAvailableQuests()); end function QuestGuru_UpdateDetailFrame(questTitle, ...) local i; for i=1, select("#", ...), 5 do if (select(i, ...) == questTitle) then QuestInfoTitleHeader:SetText("["..select(i+1, ...).."] "..questTitle); end end end function QuestGuru_QuestProgressShow() local questTitle = GetTitleText(); QuestGuru_UpdateProgressFrame(questTitle, GetGossipActiveQuests()); local i; for i=1, GetNumQuestItems() do local name, texture, numItems, quality, isUsable = GetQuestItemInfo("required", i); local link = GetQuestItemLink("required", i); if (name and link) then QuestGuru_Items[QuestGuru_RealmName][name] = link; end end end function QuestGuru_UpdateProgressFrame(questTitle, ...) local i; for i=1, select("#", ...), 4 do if (select(i, ...) == questTitle) then QuestProgressTitleText:SetText("["..select(i+1, ...).."] "..questTitle); end end end function QuestGuru_GossipShow() local npc = UnitName("npc"); QuestGuru_UpdateGossipFrame(1, true, GetGossipAvailableQuests()); if (GetNumGossipAvailableQuests() > 0) then QuestGuru_UpdateGossipFrame(GetNumGossipAvailableQuests() + 2, false, GetGossipActiveQuests()); else QuestGuru_UpdateGossipFrame(1, false, GetGossipActiveQuests()); end end function QuestGuru_UpdateGossipFrame(currButton, availQuest, ...) local i; --MoP changed this from 4&5 to 5&6. local j = 5; if (availQuest) then j=6; end for i=1, select("#", ...), j do --QuestGuru_Echo("level="..i,1) local button = _G["GossipTitleButton"..currButton]; local buttonIcon = _G[button:GetName() .. "GossipIcon"]; local level = select(i+1, ...); --QuestGuru_Echo(level, 1) if (level == -1) then level = "*"; end button:SetFormattedText("[%s] %s", level, select(i, ...)); if (QuestGuru_IsQuestComplete(select(i, ...)) or availQuest) then SetDesaturation(buttonIcon, nil); else SetDesaturation(buttonIcon, 1); end currButton = currButton + 1; end --QuestGuru_Echo("bottom", 1) end function QuestGuru_IsQuestComplete(questTitle) local numEntries, numQuests = GetNumQuestLogEntries(); local i; for i=1, numEntries do local questLogTitleText, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete, isDaily = GetQuestLogTitle(i); local numObjectives = GetNumQuestLeaderBoards(i); if (questLogTitleText == questTitle) then return (isComplete or (numObjectives == 0)); end end return false; end local QuestLogFrameX, QuestLogFrameY; QuestLogFrame:HookScript("OnShow", function(self,button) --QuestGuru_Echo("OnShow", 1) if (QuestLogFrameX ~= nil and QuestLogFrameY ~= nil) then QuestLogFrame:SetPoint("TOPLEFT", QuestLogFrame:GetParent(), "BOTTOMLEFT", QuestLogFrameX, QuestLogFrameY); end end) QuestLogFrame:HookScript("OnHide", function(self, button) --QuestGuru_Echo("OnHide", 1) QuestLogFrameX = QuestLogFrame:GetLeft(); QuestLogFrameY = QuestLogFrame:GetTop(); end) --Slash Commands are UpperCase, Global, of the form SLASH_<SlashCmdListMemberFunctionName><digit> local ADirName, A = ... -- ... contains the name of the Addon Directory, which is the name of the addon and an (initially) empty table that is passed to all modules in the directory & sub-directories function A.SlashHandler(SlashText, OriginatingChatFrame) QuestGuru_Echo(format("/qg %s", tostring(SlashText)), true) if SlashText == "testui1" then QuestGuru_UIInfoMessage("Test UI Info Message 1/3") elseif SlashText == "debugon" then QuestGuru_Settings.DebugLevel = 1 QuestGuru_Echo("Debug enabled", true) elseif SlashText == "debugoff" then QuestGuru_Settings.DebugLevel = 0 QuestGuru_Echo("Debug disabled", true) end end SLASH_QG1 = "/qg" -- Slash command 1 SlashCmdList["QG"] = A.SlashHandler -- Register our SlashCmdListMemberFunction
QuestGuru.xml
Code:
<?xml version="1.0" encoding="utf-8" ?>
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="QuestGuru.lua" />
<Button name="QuestGuru_HistoryShowButton" inherits="UIPanelButtonTemplate" text="QG_SHOWHISTORY" parent="QuestLogFrame">
<Size x="100" y="22"/>
<Anchors>
<Anchor point="BOTTOMRIGHT">
<Offset x="-260" y="13"/>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
QuestGuru_ShowHistory();
</OnClick>
</Scripts>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem1" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem2" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem3" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem4" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem5" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem6" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem7" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem8" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem9" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
<Button name="QuestGuru_QuestLogObjectiveItem10" inherits="QuestLogObjectiveItemTemplate" hidden="true" parent="QuestInfoObjectivesFrame">
<Anchors>
<Anchor point="TOPLEFT"/>
</Anchors>
</Button>
</Ui>
QuestGuru_Templates.xml
Code:
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Button name="QuestLogObjectiveItemTemplate" inherits="QuestItemTemplate" virtual="true">
<Scripts>
<OnEnter>
if (( self:GetAlpha() > 0 ) and self.link) then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
GameTooltip:SetHyperlink(self.link);
GameTooltip_ShowCompareItem();
end
CursorUpdate();
</OnEnter>
<OnUpdate>
if (( self:GetAlpha() > 0 ) and self.link) then
if (self.timerEnabled) then
local name, link, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, texture = GetItemInfo(self.link);
if (texture) then
self.timerEnabled = nil;
SetItemButtonTexture(self, texture);
_G[self:GetName().."Name"]:SetText(name);
self:Show();
end
end
end
</OnUpdate>
</Scripts>
</Button>
<Button name="QuestGuru_ColorPickerButtonTemplate" virtual="true">
<Size x="16" y="16"/>
<Layers>
<Layer level="ARTWORK">
<Texture name="$parentSwatch">
<Size x="12" y="12"/>
<Anchors>
<Anchor point="CENTER">
<Offset x="0" y="0"/>
</Anchor>
</Anchors>
<Color r="1.0" g="1.0" b="1.0" a="1.0"/>
</Texture>
</Layer>
</Layers>
<Scripts>
<OnEnter>
if ( self.tooltipText ) then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
GameTooltip:SetText(self.tooltipText, nil, nil, nil, nil, 1);
end
if ( self.tooltipRequirement ) then
GameTooltip:AddLine(self.tooltipRequirement, "", 1.0, 1.0, 1.0);
GameTooltip:Show();
end
</OnEnter>
<OnLeave function="GameTooltip_Hide" />
</Scripts>
</Button>
<Button name="QuestGuru_QuestLogStartFinishTemplate" virtual="true">
<Size x="285" y="14"/>
<Layers>
<Layer level="BACKGROUND">
<FontString name="$parentLabel" inherits="QuestFont" justifyH="LEFT">
<Size x="0" y="0"/>
<Anchors>
<Anchor point="LEFT">
<Offset x="0" y="0"/>
</Anchor>
</Anchors>
</FontString>
<FontString name="$parentPos" inherits="QuestFontNormalSmall" justifyH="LEFT">
<Size x="0" y="0"/>
<Anchors>
<Anchor point="RIGHT">
<Offset x="0" y="0"/>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLeave>
QuestGuru_QuestStartInfoFrame:Hide();
</OnLeave>
</Scripts>
<ButtonText name="$parentNPCName" nonspacewrap="true">
<Size x="0" y="10"/>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentLabel" relativePoint="RIGHT">
<Offset x="2" y="0"/>
</Anchor>
</Anchors>
</ButtonText>
<NormalFont style="QuestFontLeft" />
<HighlightFont style="QuestFontLeft" />
<DisabledFont style="QuestFontLeft" />
</Button>
<CheckButton name="QuestGuru_InterfaceOptionsBaseCheckButtonTemplate" virtual="true">
<Size x="26" y="26"/>
<HitRectInsets>
<AbsInset left="0" right="-100" top="0" bottom="0"/>
</HitRectInsets>
<Scripts>
<OnShow>
self:SetHitRectInsets(0, -_G[self:GetName().."Text"]:GetWidth(), 0, 0);
</OnShow>
<OnMouseUp>
if ( self:GetChecked() ) then
PlaySound("igMainMenuOptionCheckBoxOn");
else
PlaySound("igMainMenuOptionCheckBoxOff");
end
</OnMouseUp>
<OnEnter>
if ( self.tooltipText ) then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
GameTooltip:SetText(self.tooltipText, nil, nil, nil, nil, 1);
end
if ( self.tooltipRequirement ) then
GameTooltip:AddLine(self.tooltipRequirement, "", 1.0, 1.0, 1.0);
GameTooltip:Show();
end
</OnEnter>
<OnLeave function="GameTooltip_Hide" />
</Scripts>
<NormalTexture file="Interface\Buttons\UI-CheckBox-Up"/>
<PushedTexture file="Interface\Buttons\UI-CheckBox-Down"/>
<HighlightTexture file="Interface\Buttons\UI-CheckBox-Highlight" alphaMode="ADD"/>
<CheckedTexture file="Interface\Buttons\UI-CheckBox-Check"/>
<DisabledCheckedTexture file="Interface\Buttons\UI-CheckBox-Check-Disabled"/>
</CheckButton>
<CheckButton name="QuestGuru_InterfaceOptionsCheckButtonTemplate" virtual="true" inherits="QuestGuru_InterfaceOptionsBaseCheckButtonTemplate">
<Layers>
<Layer level="ARTWORK">
<FontString name="$parentText" inherits="GameFontHighlight">
<Anchors>
<Anchor point="LEFT" relativePoint="RIGHT">
<Offset x="0" y="1" />
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>
<CheckButton name="QuestGuru_InterfaceOptionsSmallCheckButtonTemplate" virtual="true" inherits="QuestGuru_InterfaceOptionsBaseCheckButtonTemplate">
<Layers>
<Layer level="ARTWORK">
<FontString name="$parentText" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="LEFT" relativePoint="RIGHT">
<Offset x="0" y="1" />
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</CheckButton>
</Ui>
ChatThrottleLib.lua
lua Code:
-- -- ChatThrottleLib by Mikk -- -- Manages AddOn chat output to keep player from getting kicked off. -- -- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept -- a Priority ("BULK", "NORMAL", "ALERT") as well as prefix for SendChatMessage. -- -- Priorities get an equal share of available bandwidth when fully loaded. -- Communication channels are separated on extension+chattype+destination and -- get round-robinned. (Destination only matters for whispers and channels, -- obviously) -- -- Will install hooks for SendChatMessage and SendAddonMessage to measure -- bandwidth bypassing the library and use less bandwidth itself. -- -- -- Fully embeddable library. Just copy this file into your addon directory, -- add it to the .toc, and it's done. -- -- Can run as a standalone addon also, but, really, just embed it! :-) -- local CTL_VERSION = 21 local _G = _G if _G.ChatThrottleLib then if _G.ChatThrottleLib.version >= CTL_VERSION then -- There's already a newer (or same) version loaded. Buh-bye. return elseif not _G.ChatThrottleLib.securelyHooked then print("ChatThrottleLib: Warning: There's an ANCIENT ChatThrottleLib.lua (pre-wow 2.0, <v16) in an addon somewhere. Get the addon updated or copy in a newer ChatThrottleLib.lua (>=v16) in it!") -- ATTEMPT to unhook; this'll behave badly if someone else has hooked... -- ... and if someone has securehooked, they can kiss that goodbye too... >.< _G.SendChatMessage = _G.ChatThrottleLib.ORIG_SendChatMessage if _G.ChatThrottleLib.ORIG_SendAddonMessage then _G.SendAddonMessage = _G.ChatThrottleLib.ORIG_SendAddonMessage end end _G.ChatThrottleLib.ORIG_SendChatMessage = nil _G.ChatThrottleLib.ORIG_SendAddonMessage = nil end if not _G.ChatThrottleLib then _G.ChatThrottleLib = {} end ChatThrottleLib = _G.ChatThrottleLib -- in case some addon does "local ChatThrottleLib" above us and we're copypasted (AceComm-2, sigh) local ChatThrottleLib = _G.ChatThrottleLib ChatThrottleLib.version = CTL_VERSION ------------------ TWEAKABLES ----------------- ChatThrottleLib.MAX_CPS = 800 -- 2000 seems to be safe if NOTHING ELSE is happening. let's call it 800. ChatThrottleLib.MSG_OVERHEAD = 40 -- Guesstimate overhead for sending a message; source+dest+chattype+protocolstuff ChatThrottleLib.BURST = 4000 -- WoW's server buffer seems to be about 32KB. 8KB should be safe, but seen disconnects on _some_ servers. Using 4KB now. ChatThrottleLib.MIN_FPS = 20 -- Reduce output CPS to half (and don't burst) if FPS drops below this value local setmetatable = setmetatable local table_remove = table.remove local tostring = tostring local GetTime = GetTime local math_min = math.min local math_max = math.max local next = next local strlen = string.len local GetFrameRate = GetFrameRate ----------------------------------------------------------------------- -- Double-linked ring implementation local Ring = {} local RingMeta = { __index = Ring } function Ring:New() local ret = {} setmetatable(ret, RingMeta) return ret end function Ring:Add(obj) -- Append at the "far end" of the ring (aka just before the current position) if self.pos then obj.prev = self.pos.prev obj.prev.next = obj obj.next = self.pos obj.next.prev = obj else obj.next = obj obj.prev = obj self.pos = obj end end function Ring:Remove(obj) obj.next.prev = obj.prev obj.prev.next = obj.next if self.pos == obj then self.pos = obj.next if self.pos == obj then self.pos = nil end end end ----------------------------------------------------------------------- -- Recycling bin for pipes -- A pipe is a plain integer-indexed queue, which also happens to be a ring member ChatThrottleLib.PipeBin = nil -- pre-v19, drastically different local PipeBin = setmetatable({}, {__mode="k"}) local function DelPipe(pipe) for i = #pipe, 1, -1 do pipe[i] = nil end pipe.prev = nil pipe.next = nil PipeBin[pipe] = true end local function NewPipe() local pipe = next(PipeBin) if pipe then PipeBin[pipe] = nil return pipe end return {} end ----------------------------------------------------------------------- -- Recycling bin for messages ChatThrottleLib.MsgBin = nil -- pre-v19, drastically different local MsgBin = setmetatable({}, {__mode="k"}) local function DelMsg(msg) msg[1] = nil -- there's more parameters, but they're very repetetive so the string pool doesn't suffer really, and it's faster to just not delete them. MsgBin[msg] = true end local function NewMsg() local msg = next(MsgBin) if msg then MsgBin[msg] = nil return msg end return {} end ----------------------------------------------------------------------- -- ChatThrottleLib:Init -- Initialize queues, set up frame for OnUpdate, etc function ChatThrottleLib:Init() -- Set up queues if not self.Prio then self.Prio = {} self.Prio["ALERT"] = { ByName = {}, Ring = Ring:New(), avail = 0 } self.Prio["NORMAL"] = { ByName = {}, Ring = Ring:New(), avail = 0 } self.Prio["BULK"] = { ByName = {}, Ring = Ring:New(), avail = 0 } end -- v4: total send counters per priority for _, Prio in pairs(self.Prio) do Prio.nTotalSent = Prio.nTotalSent or 0 end if not self.avail then self.avail = 0 -- v5 end if not self.nTotalSent then self.nTotalSent = 0 -- v5 end -- Set up a frame to get OnUpdate events if not self.Frame then self.Frame = CreateFrame("Frame") self.Frame:Hide() end self.Frame:SetScript("OnUpdate", self.OnUpdate) self.Frame:SetScript("OnEvent", self.OnEvent) -- v11: Monitor P_E_W so we can throttle hard for a few seconds self.Frame:RegisterEvent("PLAYER_ENTERING_WORLD") self.OnUpdateDelay = 0 self.LastAvailUpdate = GetTime() self.HardThrottlingBeginTime = GetTime() -- v11: Throttle hard for a few seconds after startup -- Hook SendChatMessage and SendAddonMessage so we can measure unpiped traffic and avoid overloads (v7) if not self.securelyHooked then -- Use secure hooks as of v16. Old regular hook support yanked out in v21. self.securelyHooked = true --SendChatMessage hooksecurefunc("SendChatMessage", function(...) return ChatThrottleLib.Hook_SendChatMessage(...) end) --SendAddonMessage hooksecurefunc("SendAddonMessage", function(...) return ChatThrottleLib.Hook_SendAddonMessage(...) end) end self.nBypass = 0 end ----------------------------------------------------------------------- -- ChatThrottleLib.Hook_SendChatMessage / .Hook_SendAddonMessage local bMyTraffic = false function ChatThrottleLib.Hook_SendChatMessage(text, chattype, language, destination, ...) if bMyTraffic then return end local self = ChatThrottleLib local size = strlen(tostring(text or "")) + strlen(tostring(destination or "")) + self.MSG_OVERHEAD self.avail = self.avail - size self.nBypass = self.nBypass + size -- just a statistic end function ChatThrottleLib.Hook_SendAddonMessage(prefix, text, chattype, destination, ...) if bMyTraffic then return end local self = ChatThrottleLib local size = tostring(text or ""):len() + tostring(prefix or ""):len(); size = size + tostring(destination or ""):len() + self.MSG_OVERHEAD self.avail = self.avail - size self.nBypass = self.nBypass + size -- just a statistic end ----------------------------------------------------------------------- -- ChatThrottleLib:UpdateAvail -- Update self.avail with how much bandwidth is currently available function ChatThrottleLib:UpdateAvail() local now = GetTime() local MAX_CPS = self.MAX_CPS; local newavail = MAX_CPS * (now - self.LastAvailUpdate) local avail = self.avail if now - self.HardThrottlingBeginTime < 5 then -- First 5 seconds after startup/zoning: VERY hard clamping to avoid irritating the server rate limiter, it seems very cranky then avail = math_min(avail + (newavail*0.1), MAX_CPS*0.5) self.bChoking = true elseif GetFramerate() < self.MIN_FPS then -- GetFrameRate call takes ~0.002 secs avail = math_min(MAX_CPS, avail + newavail*0.5) self.bChoking = true -- just a statistic else avail = math_min(self.BURST, avail + newavail) self.bChoking = false end avail = math_max(avail, 0-(MAX_CPS*2)) -- Can go negative when someone is eating bandwidth past the lib. but we refuse to stay silent for more than 2 seconds; if they can do it, we can. self.avail = avail self.LastAvailUpdate = now return avail end ----------------------------------------------------------------------- -- Despooling logic function ChatThrottleLib:Despool(Prio) local ring = Prio.Ring while ring.pos and Prio.avail > ring.pos[1].nSize do local msg = table_remove(Prio.Ring.pos, 1) if not Prio.Ring.pos[1] then local pipe = Prio.Ring.pos Prio.Ring:Remove(pipe) Prio.ByName[pipe.name] = nil DelPipe(pipe) else Prio.Ring.pos = Prio.Ring.pos.next end Prio.avail = Prio.avail - msg.nSize bMyTraffic = true msg.f(unpack(msg, 1, msg.n)) bMyTraffic = false Prio.nTotalSent = Prio.nTotalSent + msg.nSize DelMsg(msg) if msg.callbackFn then msg.callbackFn (msg.callbackArg) end end end function ChatThrottleLib.OnEvent(this,event) -- v11: We know that the rate limiter is touchy after login. Assume that it's touchy after zoning, too. local self = ChatThrottleLib if event == "PLAYER_ENTERING_WORLD" then self.HardThrottlingBeginTime = GetTime() -- Throttle hard for a few seconds after zoning self.avail = 0 end end function ChatThrottleLib.OnUpdate(this,delay) local self = ChatThrottleLib self.OnUpdateDelay = self.OnUpdateDelay + delay if self.OnUpdateDelay < 0.08 then return end self.OnUpdateDelay = 0 self:UpdateAvail() if self.avail < 0 then return -- argh. some bastard is spewing stuff past the lib. just bail early to save cpu. end -- See how many of our priorities have queued messages (we only have 3, don't worry about the loop) local n = 0 for prioname,Prio in pairs(self.Prio) do if Prio.Ring.pos or Prio.avail < 0 then n = n + 1 end end -- Anything queued still? if n<1 then -- Nope. Move spillover bandwidth to global availability gauge and clear self.bQueueing for prioname, Prio in pairs(self.Prio) do self.avail = self.avail + Prio.avail Prio.avail = 0 end self.bQueueing = false self.Frame:Hide() return end -- There's stuff queued. Hand out available bandwidth to priorities as needed and despool their queues local avail = self.avail/n self.avail = 0 for prioname, Prio in pairs(self.Prio) do if Prio.Ring.pos or Prio.avail < 0 then Prio.avail = Prio.avail + avail if Prio.Ring.pos and Prio.avail > Prio.Ring.pos[1].nSize then self:Despool(Prio) -- Note: We might not get here if the user-supplied callback function errors out! Take care! end end end end ----------------------------------------------------------------------- -- Spooling logic function ChatThrottleLib:Enqueue(prioname, pipename, msg) local Prio = self.Prio[prioname] local pipe = Prio.ByName[pipename] if not pipe then self.Frame:Show() pipe = NewPipe() pipe.name = pipename Prio.ByName[pipename] = pipe Prio.Ring:Add(pipe) end pipe[#pipe + 1] = msg self.bQueueing = true end function ChatThrottleLib:SendChatMessage(prio, prefix, text, chattype, language, destination, queueName, callbackFn, callbackArg) if not self or not prio or not prefix or not text or not self.Prio[prio] then error('Usage: ChatThrottleLib:SendChatMessage("{BULK||NORMAL||ALERT}", "prefix", "text"[, "chattype"[, "language"[, "destination"]]]', 2) end if callbackFn and type(callbackFn)~="function" then error('ChatThrottleLib:ChatMessage(): callbackFn: expected function, got '..type(callbackFn), 2) end local nSize = text:len() if nSize>255 then error("ChatThrottleLib:SendChatMessage(): message length cannot exceed 255 bytes", 2) end nSize = nSize + self.MSG_OVERHEAD -- Check if there's room in the global available bandwidth gauge to send directly if not self.bQueueing and nSize < self:UpdateAvail() then self.avail = self.avail - nSize bMyTraffic = true _G.SendChatMessage(text, chattype, language, destination) bMyTraffic = false self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize if callbackFn then callbackFn (callbackArg) end return end -- Message needs to be queued local msg = NewMsg() msg.f = _G.SendChatMessage msg[1] = text msg[2] = chattype or "SAY" msg[3] = language msg[4] = destination msg.n = 4 msg.nSize = nSize msg.callbackFn = callbackFn msg.callbackArg = callbackArg self:Enqueue(prio, queueName or (prefix..(chattype or "SAY")..(destination or "")), msg) end function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg) if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then error('Usage: ChatThrottleLib:SendAddonMessage("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2) end if callbackFn and type(callbackFn)~="function" then error('ChatThrottleLib:SendAddonMessage(): callbackFn: expected function, got '..type(callbackFn), 2) end local nSize = prefix:len() + 1 + text:len(); if nSize>255 then error("ChatThrottleLib:SendAddonMessage(): prefix + message length cannot exceed 254 bytes", 2) end nSize = nSize + self.MSG_OVERHEAD; -- Check if there's room in the global available bandwidth gauge to send directly if not self.bQueueing and nSize < self:UpdateAvail() then self.avail = self.avail - nSize bMyTraffic = true _G.SendAddonMessage(prefix, text, chattype, target) bMyTraffic = false self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize if callbackFn then callbackFn (callbackArg) end return end -- Message needs to be queued local msg = NewMsg() msg.f = _G.SendAddonMessage msg[1] = prefix msg[2] = text msg[3] = chattype msg[4] = target msg.n = (target~=nil) and 4 or 3; msg.nSize = nSize msg.callbackFn = callbackFn msg.callbackArg = callbackArg self:Enqueue(prio, queueName or (prefix..chattype..(target or "")), msg) end ----------------------------------------------------------------------- -- Get the ball rolling! ChatThrottleLib:Init() --[[ WoWBench debugging snippet if(WOWB_VER) then local function SayTimer() print("SAY: "..GetTime().." "..arg1) end ChatThrottleLib.Frame:SetScript("OnEvent", SayTimer) ChatThrottleLib.Frame:RegisterEvent("CHAT_MSG_SAY") end ]]
QuestGuruOptions.lua (I do know that I have to change the one mp3 sound file to ogg)
lua Code:
local lastColorPick; QuestGuru_Sounds = {"PVPENTERQUEUE","PVPTHROUGHQUEUE","GLUECREATECHARACTERBUTTON","GLUEENTERWORLDBUTTON","QUESTCOMPLETED","INTERFACESOUND_MONEYFRAMEOPEN", "igPlayerInvite","LEVELUP","QUESTADDED","gsCharacterCreationCreateChar","TalentScreenOpen","ReadyCheck","RaidWarning","AuctionWindowOpen","AuctionWindowClose", "Sound\\Creature\\Peon\\PeonBuildingComplete1.wav", "Sound\\Creature\\Peon\\PeonReady1.wav", "Sound\\Creature\\Peasant\\PeasantReady1.wav", "Sound\\Interface\\igPlayerBind.wav", "Sound\\Creature\\MillhouseManastorm\\TEMPEST_Millhouse_Ready01.wav", "Sound\\Creature\\MillhouseManastorm\\TEMPEST_Millhouse_Slay01.wav", "Sound\\Creature\\Cow\\CowDeath.wav", "Sound\\interface\\HumanExploration.wav","Sound\\Creature\\Peasant\\PeasantWhat3.wav", "Sound\\Creature\\Peon\\PeonYes3.wav", "Sound\\Creature\\Peon\\PeonWhat4.wav", "Interface\\AddOns\\QuestGuru\\Peasant_job_done.mp3"}; function QuestGuru_OptionsFrameSoundProgressDropDown_Initialize() if (QuestGuru_Settings.Sounds == nil) then return; end local info = UIDropDownMenu_CreateInfo(); info.func = QuestGuru_OptionsFrameSoundProgress_OnClick; info.owner = QuestGuru_OptionsFrameSoundProgressButton; info.checked = nil; info.icon = nil; for i,v in ipairs(QuestGuru_Sounds) do info.text = v; info.value = i; if (v == QuestGuru_Settings.Sounds.Progress.Sound) then info.checked = 1; else info.checked = nil; end UIDropDownMenu_AddButton(info, 1); end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundProgressButton, QuestGuru_Settings.Sounds.Progress.Sound); end function QuestGuru_OptionsFrameSoundProgress_OnClick(self, button, down) if (QuestGuru_Settings.Sounds == nil) then return; end local sound = QuestGuru_Sounds[self.value]; if ((string.sub(sound, -4) == ".wav") or (string.sub(sound, -4) == ".mp3")) then PlaySoundFile(sound); else PlaySound(sound); end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundProgressButton, sound); QuestGuru_Settings.Sounds.Progress.Sound = sound; end function QuestGuru_OptionsFrameSoundObjCompleteDropDown_Initialize() if (QuestGuru_Settings.Sounds == nil) then return; end local info = UIDropDownMenu_CreateInfo(); info.func = QuestGuru_OptionsFrameSoundObjComplete_OnClick; info.owner = QuestGuru_OptionsFrameSoundObjCompleteButton; info.checked = nil; info.icon = nil; for i,v in ipairs(QuestGuru_Sounds) do info.text = v; info.value = i; if (v == QuestGuru_Settings.Sounds.ObjComplete.Sound) then info.checked = 1; else info.checked = nil; end UIDropDownMenu_AddButton(info, 1); end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundObjCompleteButton, QuestGuru_Settings.Sounds.ObjComplete.Sound); end function QuestGuru_OptionsFrameSoundObjComplete_OnClick(self, button, down) if (QuestGuru_Settings.Sounds == nil) then return; end local sound = QuestGuru_Sounds[self.value]; if ((string.sub(sound, -4) == ".wav") or (string.sub(sound, -4) == ".mp3")) then PlaySoundFile(sound); else PlaySound(sound); end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundObjCompleteButton, sound); QuestGuru_Settings.Sounds.ObjComplete.Sound = sound; end function QuestGuru_OptionsFrameSoundQuestCompleteDropDown_Initialize() if (QuestGuru_Settings.Sounds == nil) then return; end local info = UIDropDownMenu_CreateInfo(); info.func = QuestGuru_OptionsFrameSoundQuestComplete_OnClick; info.owner = QuestGuru_OptionsFrameSoundQuestCompleteButton; info.checked = nil; info.icon = nil; for i,v in ipairs(QuestGuru_Sounds) do info.text = v; info.value = i; if (v == QuestGuru_Settings.Sounds.QuestComplete.Sound) then info.checked = 1; else info.checked = nil; end UIDropDownMenu_AddButton(info, 1); end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundQuestCompleteButton, QuestGuru_Settings.Sounds.QuestComplete.Sound); end function QuestGuru_OptionsFrameSoundQuestComplete_OnClick(self, button, down) if (QuestGuru_Settings.Sounds == nil) then return; end local sound = QuestGuru_Sounds[self.value]; if ((string.sub(sound, -4) == ".wav") or (string.sub(sound, -4) == ".mp3")) then PlaySoundFile(sound); else PlaySound(sound); end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundQuestCompleteButton, sound); QuestGuru_Settings.Sounds.QuestComplete.Sound = sound; end do local temp, i; --------------------- -- General Options -- --------------------- QuestGuru_OptionsFrameGeneral = CreateFrame("FRAME", "QuestGuru_OptionsFrameGeneral", QuestGuru_OptionsFrame); QuestGuru_OptionsFrameGeneral.name = "QuestGuru"; QuestGuru_OptionsFrameGeneral.default = function () QuestGuru_SetGeneralDefaults(); end; InterfaceOptions_AddCategory(QuestGuru_OptionsFrameGeneral); QuestGuru_OptionsFrameGeneralTitle = QuestGuru_OptionsFrameGeneral:CreateFontString("QuestGuru_OptionsFrameGeneralTitle", "ARTWORK", "GameFontNormalLarge"); QuestGuru_OptionsFrameGeneralTitle:SetPoint("TOPLEFT", 16, -16); QuestGuru_OptionsFrameGeneralTitle:SetJustifyH("LEFT"); QuestGuru_OptionsFrameGeneralTitle:SetJustifyV("TOP"); QuestGuru_OptionsFrameGeneralTitle:SetText("QuestGuru "..QG_OPTIONS); QuestGuru_OptionsFrameGeneralSubText = QuestGuru_OptionsFrameGeneral:CreateFontString("QuestGuru_OptionsFrameGeneralSubText", "ARTWORK", "GameFontHighlightSmall"); QuestGuru_OptionsFrameGeneralSubText:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameGeneralTitle", "BOTTOMLEFT", 0, -8); QuestGuru_OptionsFrameGeneralSubText:SetPoint("RIGHT", -32, 0); QuestGuru_OptionsFrameGeneralSubText:SetJustifyH("LEFT"); QuestGuru_OptionsFrameGeneralSubText:SetJustifyV("TOP"); QuestGuru_OptionsFrameGeneralSubText:SetHeight(24); QuestGuru_OptionsFrameGeneralSubText:SetText(QG_OPT_OPTIONS_DESC); QuestGuru_OptionsFrameGeneralShowLevels = QuestGuru_OptionsFrameGeneral:CreateFontString("QuestGuru_OptionsFrameGeneralShowLevels", "OVERLAY", "GameFontHighlight"); QuestGuru_OptionsFrameGeneralShowLevels:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameGeneralSubText", "BOTTOMLEFT", -2, -8); QuestGuru_OptionsFrameGeneralShowLevels:SetText(QG_OPT_LEVELS_HEAD); QuestGuru_OptionsFrameShowLevelsQuestLogToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameShowLevelsQuestLogToggle", QuestGuru_OptionsFrameGeneral, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameShowLevelsQuestLogToggle:SetPoint("TOPLEFT", QuestGuru_OptionsFrameGeneralShowLevels, "BOTTOMLEFT", 0, -2); QuestGuru_OptionsFrameShowLevelsQuestLogToggleText:SetText(QG_OPT_LEVELS_QUESTLOG); QuestGuru_OptionsFrameShowLevelsQuestLogToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameShowLevelsQuestLogToggle:GetChecked()) then QuestGuru_Settings.ShowLevels.QuestLog = true; else QuestGuru_Settings.ShowLevels.QuestLog = false; end QuestLog_Update(); end); QuestGuru_OptionsFrameAutoCompleteToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameAutoCompleteToggle", QuestGuru_OptionsFrameGeneral, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameAutoCompleteToggle:SetPoint("TOPLEFT", QuestGuru_OptionsFrameShowLevelsQuestLogToggle, "BOTTOMLEFT", 0, -6); QuestGuru_OptionsFrameAutoCompleteToggleText:SetText(QG_OPT_AUTOCOMPLETE); QuestGuru_OptionsFrameAutoCompleteToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameAutoCompleteToggle:GetChecked()) then QuestGuru_Settings.AutoComplete = true; else QuestGuru_Settings.AutoComplete = false; end end); QuestGuru_OptionsFrameShowObjItemIconsToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameShowObjItemIconsToggle", QuestGuru_OptionsFrameGeneral, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameShowObjItemIconsToggle:SetPoint("TOPLEFT", QuestGuru_OptionsFrameAutoCompleteToggle, "BOTTOMLEFT", 0, -4); QuestGuru_OptionsFrameShowObjItemIconsToggleText:SetText(QG_OPT_OBJ_ICON); QuestGuru_OptionsFrameShowObjItemIconsToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameShowObjItemIconsToggle:GetChecked()) then QuestGuru_Settings.ShowObjItemIcons = true; else QuestGuru_Settings.ShowObjItemIcons = false; end QuestLog_UpdateQuestDetails(); end); QuestGuru_OptionsFrameShowHeaderQuestsToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameShowHeaderQuestsToggle", QuestGuru_OptionsFrameGeneral, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameShowHeaderQuestsToggle:SetPoint("TOPLEFT", QuestGuru_OptionsFrameShowObjItemIconsToggle, "BOTTOMLEFT", 0, -4); QuestGuru_OptionsFrameShowHeaderQuestsToggleText:SetText(QG_OPT_HEADER_QUEST_NUM); QuestGuru_OptionsFrameShowHeaderQuestsToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameShowHeaderQuestsToggle:GetChecked()) then QuestGuru_Settings.HeaderQuests = true; else QuestGuru_Settings.HeaderQuests = false; end QuestLog_Update(); end); QuestGuru_OptionsFrameDisableCommToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameDisableCommToggle", QuestGuru_OptionsFrameGeneral, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameDisableCommToggle:SetPoint("TOPLEFT", QuestGuru_OptionsFrameShowHeaderQuestsToggle, "BOTTOMLEFT", 0, -4); QuestGuru_OptionsFrameDisableCommToggleText:SetText(QG_OPT_DISABLE_COMM); QuestGuru_OptionsFrameDisableCommToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameDisableCommToggle:GetChecked()) then QuestGuru_Settings.DisableComm = true; else QuestGuru_Settings.DisableComm = false; QuestGuru_CommSendPGMessage("0001", QUESTGURU_VERSION); QuestGuru_SendCurrentQuestStatus(true); end end); --------------------- -- Sound Options -- --------------------- QuestGuru_OptionsFrameSound = CreateFrame("FRAME", "QuestGuru_OptionsFrameSound", QuestGuru_OptionsFrame); QuestGuru_OptionsFrameSound.name = "QG Sounds"; QuestGuru_OptionsFrameSound.parent = "QuestGuru"; QuestGuru_OptionsFrameSound.default = function () QuestGuru_SetSoundDefaults(); end; InterfaceOptions_AddCategory(QuestGuru_OptionsFrameSound) QuestGuru_OptionsFrameSoundTitle = QuestGuru_OptionsFrameSound:CreateFontString("QuestGuru_OptionsFrameSoundTitle", "ARTWORK", "GameFontNormalLarge"); QuestGuru_OptionsFrameSoundTitle:SetPoint("TOPLEFT", 16, -16); QuestGuru_OptionsFrameSoundTitle:SetJustifyH("LEFT"); QuestGuru_OptionsFrameSoundTitle:SetJustifyV("TOP"); QuestGuru_OptionsFrameSoundTitle:SetText("QuestGuru "..QG_OPT_SOUND_HEAD); QuestGuru_OptionsFrameSoundSubText = QuestGuru_OptionsFrameSound:CreateFontString("QuestGuru_OptionsFrameSoundSubText", "ARTWORK", "GameFontHighlightSmall"); QuestGuru_OptionsFrameSoundSubText:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundTitle", "BOTTOMLEFT", 0, -8); QuestGuru_OptionsFrameSoundSubText:SetPoint("RIGHT", -32, 0); QuestGuru_OptionsFrameSoundSubText:SetJustifyH("LEFT"); QuestGuru_OptionsFrameSoundSubText:SetJustifyV("TOP"); QuestGuru_OptionsFrameSoundSubText:SetHeight(24); QuestGuru_OptionsFrameSoundSubText:SetText(QG_OPT_SOUND_DESC); QuestGuru_OptionsFrameSoundToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameSoundToggle", QuestGuru_OptionsFrameSound, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameSoundToggle:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundSubText", "BOTTOMLEFT", -2, -8); QuestGuru_OptionsFrameSoundToggleText:SetText(QG_OPT_SOUND_ENABLE); QuestGuru_OptionsFrameSoundToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameSoundToggle:GetChecked()) then QuestGuru_Settings.Sounds.Enabled = true; else QuestGuru_Settings.Sounds.Enabled = false; end end); QuestGuru_OptionsFrameSoundProgressToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameSoundProgressToggle", QuestGuru_OptionsFrameSound, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameSoundProgressToggle:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundToggle", "BOTTOMLEFT", 0, -12); QuestGuru_OptionsFrameSoundProgressToggleText:SetText(QG_OPT_SOUND_OBJ); QuestGuru_OptionsFrameSoundProgressToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameSoundProgressToggle:GetChecked()) then QuestGuru_Settings.Sounds.Progress.Enabled = true; else QuestGuru_Settings.Sounds.Progress.Enabled = false; end end); QuestGuru_OptionsFrameSoundProgressButton = CreateFrame("Frame", "QuestGuru_OptionsFrameSoundProgressButton", QuestGuru_OptionsFrameSound, "UIDropDownMenuTemplate"); QuestGuru_OptionsFrameSoundProgressButton:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundProgressToggle", "BOTTOMLEFT"); QuestGuru_OptionsFrameSoundProgressButton:SetWidth(200); QuestGuru_OptionsFrameSoundProgressButtonText:SetJustifyH("LEFT"); UIDropDownMenu_SetWidth(QuestGuru_OptionsFrameSoundProgressButton, 200); UIDropDownMenu_Initialize(QuestGuru_OptionsFrameSoundProgressButton, QuestGuru_OptionsFrameSoundProgressDropDown_Initialize); QuestGuru_OptionsFrameSoundObjCompleteToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameSoundObjCompleteToggle", QuestGuru_OptionsFrameSound, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameSoundObjCompleteToggle:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundProgressToggle", "BOTTOMLEFT", 0, -48); QuestGuru_OptionsFrameSoundObjCompleteToggleText:SetText(QG_OPT_SOUND_OBJ_DONE); QuestGuru_OptionsFrameSoundObjCompleteToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameSoundObjCompleteToggle:GetChecked()) then QuestGuru_Settings.Sounds.ObjComplete.Enabled = true; else QuestGuru_Settings.Sounds.ObjComplete.Enabled = false; end end); QuestGuru_OptionsFrameSoundObjCompleteButton = CreateFrame("Frame", "QuestGuru_OptionsFrameSoundObjCompleteButton", QuestGuru_OptionsFrameSound, "UIDropDownMenuTemplate"); QuestGuru_OptionsFrameSoundObjCompleteButton:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundObjCompleteToggle", "BOTTOMLEFT"); QuestGuru_OptionsFrameSoundObjCompleteButton:SetWidth(200); QuestGuru_OptionsFrameSoundObjCompleteButtonText:SetJustifyH("LEFT"); UIDropDownMenu_SetWidth(QuestGuru_OptionsFrameSoundObjCompleteButton, 200); UIDropDownMenu_Initialize(QuestGuru_OptionsFrameSoundObjCompleteButton, QuestGuru_OptionsFrameSoundObjCompleteDropDown_Initialize); QuestGuru_OptionsFrameSoundQuestCompleteToggle = CreateFrame("CheckButton", "QuestGuru_OptionsFrameSoundQuestCompleteToggle", QuestGuru_OptionsFrameSound, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_OptionsFrameSoundQuestCompleteToggle:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundObjCompleteToggle", "BOTTOMLEFT", 0, -48); QuestGuru_OptionsFrameSoundQuestCompleteToggleText:SetText(QG_SOUND_QUEST_DONE); QuestGuru_OptionsFrameSoundQuestCompleteToggle:SetScript("OnClick", function () if (QuestGuru_OptionsFrameSoundQuestCompleteToggle:GetChecked()) then QuestGuru_Settings.Sounds.QuestComplete.Enabled = true; else QuestGuru_Settings.Sounds.QuestComplete.Enabled = false; end end); QuestGuru_OptionsFrameSoundQuestCompleteButton = CreateFrame("Frame", "QuestGuru_OptionsFrameSoundQuestCompleteButton", QuestGuru_OptionsFrameSound, "UIDropDownMenuTemplate"); QuestGuru_OptionsFrameSoundQuestCompleteButton:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameSoundQuestCompleteToggle", "BOTTOMLEFT"); QuestGuru_OptionsFrameSoundQuestCompleteButton:SetWidth(200); QuestGuru_OptionsFrameSoundQuestCompleteButtonText:SetJustifyH("LEFT"); UIDropDownMenu_SetWidth(QuestGuru_OptionsFrameSoundQuestCompleteButton, 200); UIDropDownMenu_Initialize(QuestGuru_OptionsFrameSoundQuestCompleteButton, QuestGuru_OptionsFrameSoundQuestCompleteDropDown_Initialize); end function QuestGuru_OptionsSaveColor() local r,g,b = ColorPickerFrame:GetColorRGB(); QuestGuru_Settings.Colorize[lastColorPick].Color.r = r; QuestGuru_Settings.Colorize[lastColorPick].Color.g = g; QuestGuru_Settings.Colorize[lastColorPick].Color.b = b; QuestGuru_OptionsFrameColorizePlayerNameColorSwatch:SetTexture(QuestGuru_Settings.Colorize.PlayerName.Color.r, QuestGuru_Settings.Colorize.PlayerName.Color.g, QuestGuru_Settings.Colorize.PlayerName.Color.b, 1.0); QuestGuru_OptionsFrameColorizeAreaNamesColorSwatch:SetTexture(QuestGuru_Settings.Colorize.AreaNames.Color.r, QuestGuru_Settings.Colorize.AreaNames.Color.g, QuestGuru_Settings.Colorize.AreaNames.Color.b, 1.0); QuestGuru_OptionsFrameColorizeNPCNamesColorSwatch:SetTexture(QuestGuru_Settings.Colorize.NPCNames.Color.r, QuestGuru_Settings.Colorize.NPCNames.Color.g, QuestGuru_Settings.Colorize.NPCNames.Color.b, 1.0); end function QuestGuru_OptionsSoundsLoadSettings() if (QuestGuru_Settings.Sounds == nil) then QuestGuru_Settings.Sounds = {}; end if (QuestGuru_Settings.Sounds.Enabled ~= false) then QuestGuru_Settings.Sounds.Enabled = true; end QuestGuru_OptionsFrameSoundToggle:SetChecked(QuestGuru_Settings.Sounds.Enabled); if (QuestGuru_Settings.Sounds.Progress == nil) then QuestGuru_Settings.Sounds.Progress = {}; end if (QuestGuru_Settings.Sounds.Progress.Enabled ~= false) then QuestGuru_Settings.Sounds.Progress.Enabled = true; end QuestGuru_OptionsFrameSoundProgressToggle:SetChecked(QuestGuru_Settings.Sounds.Progress.Enabled); if (QuestGuru_Settings.Sounds.Progress.Sound == nil) then QuestGuru_Settings.Sounds.Progress.Sound = "AuctionWindowOpen"; end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundProgressButton, QuestGuru_Settings.Sounds.Progress.Sound); if (QuestGuru_Settings.Sounds.ObjComplete == nil) then QuestGuru_Settings.Sounds.ObjComplete = {}; end if (QuestGuru_Settings.Sounds.ObjComplete.Enabled ~= false) then QuestGuru_Settings.Sounds.ObjComplete.Enabled = true; end QuestGuru_OptionsFrameSoundObjCompleteToggle:SetChecked(QuestGuru_Settings.Sounds.ObjComplete.Enabled); if (QuestGuru_Settings.Sounds.ObjComplete.Sound == nil) then QuestGuru_Settings.Sounds.ObjComplete.Sound = "AuctionWindowClose"; end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundObjCompleteButton, QuestGuru_Settings.Sounds.ObjComplete.Sound); if (QuestGuru_Settings.Sounds.QuestComplete == nil) then QuestGuru_Settings.Sounds.QuestComplete = {}; end if (QuestGuru_Settings.Sounds.QuestComplete.Enabled ~= false) then QuestGuru_Settings.Sounds.QuestComplete.Enabled = true; end QuestGuru_OptionsFrameSoundQuestCompleteToggle:SetChecked(QuestGuru_Settings.Sounds.QuestComplete.Enabled); if (QuestGuru_Settings.Sounds.QuestComplete.Sound == nil) then QuestGuru_Settings.Sounds.QuestComplete.Sound = "ReadyCheck"; end UIDropDownMenu_SetText(QuestGuru_OptionsFrameSoundQuestCompleteButton, QuestGuru_Settings.Sounds.QuestComplete.Sound); end function QuestGuru_SetGeneralDefaults() QuestGuru_Echo("Resetting General settings to defaults."); QuestGuru_Settings.AutoComplete = false; QuestGuru_OptionsFrameAutoCompleteToggle:SetChecked(QuestGuru_Settings.AutoComplete); QuestGuru_Settings.ShowObjItemIcons = false; QuestGuru_OptionsFrameShowObjItemIconsToggle:SetChecked(QuestGuru_Settings.ShowObjItemIcons); QuestGuru_Settings.DisableComm = false; QuestGuru_OptionsFrameDisableCommToggle:SetChecked(QuestGuru_Settings.DisableComm); QuestGuru_Settings.HeaderQuests = true; QuestGuru_OptionsFrameShowHeaderQuestsToggle:SetChecked(QuestGuru_Settings.HeaderQuests); QuestGuru_Settings.ShowLevels = {}; QuestGuru_Settings.ShowLevels.QuestLog = true; QuestGuru_OptionsFrameShowLevelsQuestLogToggle:SetChecked(QuestGuru_Settings.ShowLevels.QuestLog); end function QuestGuru_SetSoundDefaults() QuestGuru_Echo("Resetting Sound settings to defaults."); QuestGuru_Settings.Sounds.Progress.Enabled = true; QuestGuru_Settings.Sounds.QuestComplete.Sound = "ReadyCheck"; QuestGuru_Settings.Sounds.ObjComplete.Sound = "AuctionWindowClose"; QuestGuru_Settings.Sounds.Progress.Sound = "AuctionWindowOpen"; end
QuestGuruAnnounce.lua
lua Code:
do local temp, i; QuestGuru_AnnounceFrame = CreateFrame("FRAME", "QuestGuru_AnnounceFrame", QuestGuru_OptionsFrame); QuestGuru_AnnounceFrame.name = "QG Announcer"; QuestGuru_AnnounceFrame.parent = "QuestGuru"; QuestGuru_AnnounceFrame.default = function () QuestGuru_SetAnnounceDefaults(); end; QuestGuru_AnnounceFrame.okay = function () QuestGuru_SaveAnnounceSettings(); end; QuestGuru_AnnounceFrame.cancel = function () QuestGuru_CancelAnnounceChanges(); end; InterfaceOptions_AddCategory(QuestGuru_AnnounceFrame); QuestGuru_OptionsFrameAnnounceTitle = QuestGuru_AnnounceFrame:CreateFontString("QuestGuru_OptionsFrameAnnounceTitle", "ARTWORK", "GameFontNormalLarge"); QuestGuru_OptionsFrameAnnounceTitle:SetPoint("TOPLEFT", 16, -16); QuestGuru_OptionsFrameAnnounceTitle:SetJustifyH("LEFT"); QuestGuru_OptionsFrameAnnounceTitle:SetJustifyV("TOP"); QuestGuru_OptionsFrameAnnounceTitle:SetText(QG_OPT_ANNOUNCE_HEAD); QuestGuru_OptionsFrameAnnounceSubText = QuestGuru_AnnounceFrame:CreateFontString("QuestGuru_OptionsFrameAnnounceSubText", "ARTWORK", "GameFontHighlightSmall"); QuestGuru_OptionsFrameAnnounceSubText:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameAnnounceTitle", "BOTTOMLEFT", 0, -8); QuestGuru_OptionsFrameAnnounceSubText:SetPoint("RIGHT", -32, 0); QuestGuru_OptionsFrameAnnounceSubText:SetJustifyH("LEFT"); QuestGuru_OptionsFrameAnnounceSubText:SetJustifyV("TOP"); QuestGuru_OptionsFrameAnnounceSubText:SetHeight(24); QuestGuru_OptionsFrameAnnounceSubText:SetText(QG_OPT_ANNOUNCE_DESC); QuestGuru_AnnounceFrameAnnounceToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameAnnounceToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameAnnounceToggle:SetPoint("TOPLEFT", "QuestGuru_OptionsFrameAnnounceSubText", "BOTTOMLEFT", -2, -8); QuestGuru_AnnounceFrameAnnounceToggleText:SetText(QG_OPT_ANNOUNCE_PROGRESS); temp = QuestGuru_AnnounceFrame:CreateFontString("QuestGuru_AnnounceFrameChannelsLabel", "ARTWORK", "GameFontNormal"); temp:SetText(QG_OPT_ANNOUNCE_CHANNEL_HEAD); temp:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameAnnounceToggle", "BOTTOMLEFT", 0, -6); QuestGuru_AnnounceFrameChannelSayToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameChannelSayToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameChannelSayToggle:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameChannelsLabel", "BOTTOMLEFT", 0, -2); QuestGuru_AnnounceFrameChannelSayToggleText:SetText(QG_OPT_ANNOUNCE_CHANNEL_SAY); QuestGuru_AnnounceFrameChannelSayToggle.tooltipText = QG_OPT_ANNOUNCE_CHANNEL_SAY_DESC; QuestGuru_AnnounceFrameChannelPartyToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameChannelPartyToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameChannelPartyToggle:SetPoint("LEFT", "QuestGuru_AnnounceFrameChannelSayToggle", "RIGHT", 24, 0); QuestGuru_AnnounceFrameChannelPartyToggleText:SetText(QG_OPT_ANNOUNCE_CHANNEL_PARTY); QuestGuru_AnnounceFrameChannelPartyToggle.tooltipText = QG_OPT_ANNOUNCE_CHANNEL_PARTY_DESC; QuestGuru_AnnounceFrameChannelGuildToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameChannelGuildToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameChannelGuildToggle:SetPoint("LEFT", "QuestGuru_AnnounceFrameChannelPartyToggle", "RIGHT", 24, 0); QuestGuru_AnnounceFrameChannelGuildToggleText:SetText(QG_OPT_ANNOUNCE_CHANNEL_GUILD); QuestGuru_AnnounceFrameChannelGuildToggle.tooltipText = QG_OPT_ANNOUNCE_CHANNEL_GUILD_DESC; QuestGuru_AnnounceFrameChannelWhisperToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameChannelWhisperToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameChannelWhisperToggle:SetPoint("LEFT", "QuestGuru_AnnounceFrameChannelGuildToggle", "RIGHT", 24, 0); QuestGuru_AnnounceFrameChannelWhisperToggleText:SetText(QG_OPT_ANNOUNCE_CHANNEL_WHISPER); QuestGuru_AnnounceFrameChannelWhisperToggle.tooltipText = QG_OPT_ANNOUNCE_CHANNEL_WHISPER_DESC; temp = QuestGuru_AnnounceFrame:CreateFontString("QuestGuru_AnnounceFrameChannelWhisperToText", "ARTWORK", "GameFontNormal"); temp:SetText(QG_OPT_ANNOUNCE_CHANNEL_WHISPER_TO); temp:SetPoint("LEFT", "QuestGuru_AnnounceFrameChannelWhisperToggle", "RIGHT", 24, 0); QuestGuru_AnnounceFrameChannelWhisperTo = CreateFrame("EditBox", "QuestGuru_AnnounceFrameChannelWhisperTo", QuestGuru_AnnounceFrame, "InputBoxTemplate"); QuestGuru_AnnounceFrameChannelWhisperTo:SetPoint("LEFT", "QuestGuru_AnnounceFrameChannelWhisperToText", "RIGHT", 8, 0); QuestGuru_AnnounceFrameChannelWhisperTo:SetHeight(20); QuestGuru_AnnounceFrameChannelWhisperTo:SetWidth(72); QuestGuru_AnnounceFrameChannelWhisperTo:SetAutoFocus(false); QuestGuru_AnnounceFrameChannelWhisperTo:SetScript("OnShow", function () QuestGuru_AnnounceFrameChannelWhisperTo:SetCursorPosition(1); end); QuestGuru_AnnounceFrameChannelWhisperTo:SetScript("OnEscapePressed", function (self) self:ClearFocus(); end); QuestGuru_AnnounceFrameChannelEchoToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameChannelEchoToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameChannelEchoToggle:SetPoint("LEFT", "QuestGuru_AnnounceFrameChannelWhisperTo", "RIGHT", 24, 2); QuestGuru_AnnounceFrameChannelEchoToggleText:SetText(QG_OPT_ANNOUNCE_ECHO); QuestGuru_AnnounceFrameChannelEchoToggle.tooltipText = QG_OPT_ANNOUNCE_ECHO_DESC; temp = QuestGuru_AnnounceFrame:CreateFontString("QuestGuru_AnnounceFrameMessageLabel", "ARTWORK", "GameFontNormal"); temp:SetText(QG_OPT_ANNOUNCE_MESSAGES); temp:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameChannelSayToggle", "BOTTOMLEFT", 0, -8); QuestGuru_AnnounceFrameMessageHelpButton = CreateFrame("BUTTON", "QuestGuru_AnnounceFrameMessageHelpButton", QuestGuru_AnnounceFrame, "UIPanelButtonTemplate"); QuestGuru_AnnounceFrameMessageHelpButton:SetHeight(24); QuestGuru_AnnounceFrameMessageHelpButton:SetWidth(24); QuestGuru_AnnounceFrameMessageHelpButton:SetText("?"); QuestGuru_AnnounceFrameMessageHelpButton:SetPoint("TOP", "QuestGuru_AnnounceFrameChannelSayToggle", "BOTTOM", 0, -24); QuestGuru_AnnounceFrameMessageHelpButton:SetPoint("RIGHT", -8, 0); QuestGuru_AnnounceFrameMessageHelpButton:SetScript("OnEnter", function (self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT"); GameTooltip:ClearLines(); GameTooltip:AddLine(QG_OPT_ANNOUNCE_MSG_VARS); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_DONE,QG_OPT_ANNOUNCE_HELP_DONE); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_NEEDED,QG_OPT_ANNOUNCE_HELP_NEEDED); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_NUMLEFT,QG_OPT_ANNOUNCE_HELP_NUMLEFT); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_ITEMNAME,QG_OPT_ANNOUNCE_HELP_NAME); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_QUESTTITLE,QG_OPT_ANNOUNCE_HELP_TITLE); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_UITEXT,QG_OPT_ANNOUNCE_HELP_UITEXT); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_COMPLETE,QG_OPT_ANNOUNCE_HELP_COMPLETE); GameTooltip:AddDoubleLine(QG_ANNOUNCE_KEYWORD_QLINK,QG_OPT_ANNOUNCE_HELP_QLINK); GameTooltip:Show(); end); QuestGuru_AnnounceFrameMessageHelpButton:SetScript("OnLeave", function () GameTooltip:Hide(); end); QuestGuru_AnnounceFrameMessageItemToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameMessageItemToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameMessageItemToggle:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageLabel", "BOTTOMLEFT", 0, -2); QuestGuru_AnnounceFrameMessageItemToggleText:SetText(QG_OPT_ANNOUNCE_ITEM_MSG); QuestGuru_AnnounceFrameMessageItem = CreateFrame("EditBox", "QuestGuru_AnnounceFrameMessageItem", QuestGuru_AnnounceFrame, "InputBoxTemplate"); QuestGuru_AnnounceFrameMessageItem:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageItemToggle", "BOTTOMLEFT", 2, 0); QuestGuru_AnnounceFrameMessageItem:SetHeight(20); QuestGuru_AnnounceFrameMessageItem:SetWidth(352); QuestGuru_AnnounceFrameMessageItem:SetAutoFocus(false); QuestGuru_AnnounceFrameMessageItem:SetScript("OnShow", function () QuestGuru_AnnounceFrameMessageItem:SetCursorPosition(1); end); QuestGuru_AnnounceFrameMessageItem:SetScript("OnEscapePressed", function (self) self:ClearFocus(); end); QuestGuru_AnnounceFrameMessageMonsterToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameMessageMonsterToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameMessageMonsterToggle:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageItem", "BOTTOMLEFT", -2, -6); QuestGuru_AnnounceFrameMessageMonsterToggleText:SetText(QG_OPT_ANNOUNCE_MOB_MSG); QuestGuru_AnnounceFrameMessageMonster = CreateFrame("EditBox", "QuestGuru_AnnounceFrameMessageMonster", QuestGuru_AnnounceFrame, "InputBoxTemplate"); QuestGuru_AnnounceFrameMessageMonster:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageMonsterToggle", "BOTTOMLEFT", 2, 0); QuestGuru_AnnounceFrameMessageMonster:SetHeight(20); QuestGuru_AnnounceFrameMessageMonster:SetWidth(352); QuestGuru_AnnounceFrameMessageMonster:SetAutoFocus(false); QuestGuru_AnnounceFrameMessageMonster:SetScript("OnShow", function () QuestGuru_AnnounceFrameMessageMonster:SetCursorPosition(1); end); QuestGuru_AnnounceFrameMessageMonster:SetScript("OnEscapePressed", function (self) self:ClearFocus(); end); QuestGuru_AnnounceFrameMessageEventToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameMessageEventToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameMessageEventToggle:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageMonster", "BOTTOMLEFT", -2, -6); QuestGuru_AnnounceFrameMessageEventToggleText:SetText(QG_OPT_ANNOUNCE_EVENT_MSG); QuestGuru_AnnounceFrameMessageEvent = CreateFrame("EditBox", "QuestGuru_AnnounceFrameMessageEvent", QuestGuru_AnnounceFrame, "InputBoxTemplate"); QuestGuru_AnnounceFrameMessageEvent:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageEventToggle", "BOTTOMLEFT", 2, 0); QuestGuru_AnnounceFrameMessageEvent:SetHeight(20); QuestGuru_AnnounceFrameMessageEvent:SetWidth(352); QuestGuru_AnnounceFrameMessageEvent:SetAutoFocus(false); QuestGuru_AnnounceFrameMessageEvent:SetScript("OnShow", function () QuestGuru_AnnounceFrameMessageEvent:SetCursorPosition(1); end); QuestGuru_AnnounceFrameMessageEvent:SetScript("OnEscapePressed", function (self) self:ClearFocus(); end); QuestGuru_AnnounceFrameMessageQuestToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameMessageQuestToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameMessageQuestToggle:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageEvent", "BOTTOMLEFT", -2, -6); QuestGuru_AnnounceFrameMessageQuestToggleText:SetText(QG_OPT_ANNOUNCE_COMPLETE_MSG); QuestGuru_AnnounceFrameMessageQuest = CreateFrame("EditBox", "QuestGuru_AnnounceFrameMessageQuest", QuestGuru_AnnounceFrame, "InputBoxTemplate"); QuestGuru_AnnounceFrameMessageQuest:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageQuestToggle", "BOTTOMLEFT", 2, 0); QuestGuru_AnnounceFrameMessageQuest:SetHeight(20); QuestGuru_AnnounceFrameMessageQuest:SetWidth(352); QuestGuru_AnnounceFrameMessageQuest:SetAutoFocus(false); QuestGuru_AnnounceFrameMessageQuest:SetScript("OnShow", function () QuestGuru_AnnounceFrameMessageQuest:SetCursorPosition(1); end); QuestGuru_AnnounceFrameMessageQuest:SetScript("OnEscapePressed", function (self) self:ClearFocus(); end); QuestGuru_AnnounceFrameMessageQuestAcceptToggle = CreateFrame("CheckButton", "QuestGuru_AnnounceFrameMessageQuestAcceptToggle", QuestGuru_AnnounceFrame, "QuestGuru_InterfaceOptionsCheckButtonTemplate"); QuestGuru_AnnounceFrameMessageQuestAcceptToggle:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageQuest", "BOTTOMLEFT", -2, -6); QuestGuru_AnnounceFrameMessageQuestAcceptToggleText:SetText(QG_OPT_ANNOUNCE_QUESTACCEPT_MSG); QuestGuru_AnnounceFrameMessageQuestAccept = CreateFrame("EditBox", "QuestGuru_AnnounceFrameMessageQuestAccept", QuestGuru_AnnounceFrame, "InputBoxTemplate"); QuestGuru_AnnounceFrameMessageQuestAccept:SetPoint("TOPLEFT", "QuestGuru_AnnounceFrameMessageQuestAcceptToggle", "BOTTOMLEFT", 2, 0); QuestGuru_AnnounceFrameMessageQuestAccept:SetHeight(20); QuestGuru_AnnounceFrameMessageQuestAccept:SetWidth(352); QuestGuru_AnnounceFrameMessageQuestAccept:SetAutoFocus(false); QuestGuru_AnnounceFrameMessageQuestAccept:SetScript("OnShow", function () QuestGuru_AnnounceFrameMessageQuestAccept:SetCursorPosition(1); end); QuestGuru_AnnounceFrameMessageQuestAccept:SetScript("OnEscapePressed", function (self) self:ClearFocus(); end); end function QuestGuru_QuestAnnounceLoadSettings() if (QuestGuru_Settings.Announce == nil) then QuestGuru_Settings.Announce={}; end if (QuestGuru_Settings.Announce.Enabled ~= true) then QuestGuru_Settings.Announce.Enabled = false; end QuestGuru_AnnounceFrameAnnounceToggle:SetChecked(QuestGuru_Settings.Announce.Enabled); if (QuestGuru_Settings.Announce.item == nil) then QuestGuru_Settings.Announce.item = {}; end if (QuestGuru_Settings.Announce.item.Enabled ~= false) then QuestGuru_Settings.Announce.item.Enabled = true; end QuestGuru_AnnounceFrameMessageItemToggle:SetChecked(QuestGuru_Settings.Announce.item.Enabled); if (QuestGuru_Settings.Announce.item.Text == nil) then QuestGuru_Settings.Announce.item.Text = QG_ANNOUNCE_ITEM_DEFAULT; end QuestGuru_AnnounceFrameMessageItem:SetText(QuestGuru_Settings.Announce.item.Text); if (QuestGuru_Settings.Announce.monster == nil) then QuestGuru_Settings.Announce.monster = {}; end if (QuestGuru_Settings.Announce.monster.Enabled ~= false) then QuestGuru_Settings.Announce.monster.Enabled = true; end QuestGuru_AnnounceFrameMessageMonsterToggle:SetChecked(QuestGuru_Settings.Announce.monster.Enabled); if (QuestGuru_Settings.Announce.monster.Text == nil) then QuestGuru_Settings.Announce.monster.Text = QG_ANNOUNCE_MOB_DEFAULT; end QuestGuru_AnnounceFrameMessageMonster:SetText(QuestGuru_Settings.Announce.monster.Text); if (QuestGuru_Settings.Announce.QuestAccept == nil) then QuestGuru_Settings.Announce.QuestAccept = {}; end if (QuestGuru_Settings.Announce.QuestAccept.Enabled ~= false) then QuestGuru_Settings.Announce.QuestAccept.Enabled = true; end QuestGuru_AnnounceFrameMessageQuestAcceptToggle:SetChecked(QuestGuru_Settings.Announce.QuestAccept.Enabled); if (QuestGuru_Settings.Announce.QuestAccept.Text == nil) then QuestGuru_Settings.Announce.QuestAccept.Text = QG_ANNOUNCE_QUESTACCEPT_DEFAULT; end QuestGuru_AnnounceFrameMessageQuestAccept:SetText(QuestGuru_Settings.Announce.QuestAccept.Text); if (QuestGuru_Settings.Announce.event == nil) then QuestGuru_Settings.Announce.event = {}; end if (QuestGuru_Settings.Announce.event.Enabled ~= false) then QuestGuru_Settings.Announce.event.Enabled = true; end QuestGuru_AnnounceFrameMessageEventToggle:SetChecked(QuestGuru_Settings.Announce.event.Enabled); if (QuestGuru_Settings.Announce.event.Text == nil) then QuestGuru_Settings.Announce.event.Text = QG_ANNOUNCE_KEYWORD_UITEXT; end QuestGuru_AnnounceFrameMessageEvent:SetText(QuestGuru_Settings.Announce.event.Text); if (QuestGuru_Settings.Announce.Quest == nil) then QuestGuru_Settings.Announce.Quest = {}; end if (QuestGuru_Settings.Announce.Quest.Enabled ~= false) then QuestGuru_Settings.Announce.Quest.Enabled = true; end QuestGuru_AnnounceFrameMessageQuestToggle:SetChecked(QuestGuru_Settings.Announce.Quest.Enabled); if (QuestGuru_Settings.Announce.Quest.Text == nil) then QuestGuru_Settings.Announce.Quest.Text = QG_ANNOUNCE_QUEST_TEXT; end QuestGuru_AnnounceFrameMessageQuest:SetText(QuestGuru_Settings.Announce.Quest.Text); if (QuestGuru_Settings.Announce.say ~= true) then QuestGuru_Settings.Announce.say = false; end QuestGuru_AnnounceFrameChannelSayToggle:SetChecked(QuestGuru_Settings.Announce.say); if (QuestGuru_Settings.Announce.party ~= false) then QuestGuru_Settings.Announce.party = true; end QuestGuru_AnnounceFrameChannelPartyToggle:SetChecked(QuestGuru_Settings.Announce.party); if (QuestGuru_Settings.Announce.guild ~= true) then QuestGuru_Settings.Announce.guild = false; end QuestGuru_AnnounceFrameChannelGuildToggle:SetChecked(QuestGuru_Settings.Announce.guild); if (QuestGuru_Settings.Announce.whisper == nil) then QuestGuru_Settings.Announce.whisper = {}; end if (QuestGuru_Settings.Announce.whisper.Enabled ~= true) then QuestGuru_Settings.Announce.whisper.Enabled = false; end QuestGuru_AnnounceFrameChannelWhisperToggle:SetChecked(QuestGuru_Settings.Announce.whisper.Enabled); if (QuestGuru_Settings.Announce.whisper.To == nil) then QuestGuru_Settings.Announce.whisper.To = ""; end QuestGuru_AnnounceFrameChannelWhisperTo:SetText(QuestGuru_Settings.Announce.whisper.To); if (QuestGuru_Settings.Announce.Echo ~= true) then QuestGuru_Settings.Announce.Echo = false; end QuestGuru_AnnounceFrameChannelEchoToggle:SetChecked(QuestGuru_Settings.Announce.Echo); end function QuestGuru_SetAnnounceDefaults() QuestGuru_Echo(QG_ANNOUNCE_RESET); QuestGuru_Settings.Announce.Enabled = false; QuestGuru_AnnounceFrameAnnounceToggle:SetChecked(QuestGuru_Settings.Announce.Enabled); QuestGuru_Settings.Announce.item = {}; QuestGuru_Settings.Announce.item.Enabled = true; QuestGuru_AnnounceFrameMessageItemToggle:SetChecked(QuestGuru_Settings.Announce.item.Enabled); QuestGuru_Settings.Announce.item.Text = QG_ANNOUNCE_ITEM_DEFAULT; QuestGuru_AnnounceFrameMessageItem:SetText(QuestGuru_Settings.Announce.item.Text); QuestGuru_Settings.Announce.monster = {}; QuestGuru_Settings.Announce.monster.Enabled = true; QuestGuru_AnnounceFrameMessageMonsterToggle:SetChecked(QuestGuru_Settings.Announce.monster.Enabled); QuestGuru_Settings.Announce.monster.Text = QG_ANNOUNCE_MOB_DEFAULT; QuestGuru_AnnounceFrameMessageMonster:SetText(QuestGuru_Settings.Announce.monster.Text); QuestGuru_Settings.Announce.QuestAccept = {}; QuestGuru_Settings.Announce.QuestAccept.Enabled = true; QuestGuru_AnnounceFrameMessageQuestAcceptToggle:SetChecked(QuestGuru_Settings.Announce.QuestAccept.Enabled); QuestGuru_Settings.Announce.QuestAccept.Text = QG_ANNOUNCE_QUESTACCEPT_DEFAULT; QuestGuru_AnnounceFrameMessageQuestAccept:SetText(QuestGuru_Settings.Announce.QuestAccept.Text); QuestGuru_Settings.Announce.event = {}; QuestGuru_Settings.Announce.event.Enabled = true; QuestGuru_AnnounceFrameMessageEventToggle:SetChecked(QuestGuru_Settings.Announce.event.Enabled); QuestGuru_Settings.Announce.event.Text = QG_ANNOUNCE_KEYWORD_UITEXT; QuestGuru_AnnounceFrameMessageEvent:SetText(QuestGuru_Settings.Announce.event.Text); QuestGuru_Settings.Announce.Quest = {}; QuestGuru_Settings.Announce.Quest.Enabled = true; QuestGuru_AnnounceFrameMessageQuestToggle:SetChecked(QuestGuru_Settings.Announce.Quest.Enabled); QuestGuru_Settings.Announce.Quest.Text = QG_ANNOUNCE_QUEST_TEXT; QuestGuru_AnnounceFrameMessageQuest:SetText(QuestGuru_Settings.Announce.Quest.Text); QuestGuru_Settings.Announce.say = false; QuestGuru_AnnounceFrameChannelSayToggle:SetChecked(QuestGuru_Settings.Announce.say); QuestGuru_Settings.Announce.party = true; QuestGuru_AnnounceFrameChannelPartyToggle:SetChecked(QuestGuru_Settings.Announce.party); QuestGuru_Settings.Announce.guild = false; QuestGuru_AnnounceFrameChannelGuildToggle:SetChecked(QuestGuru_Settings.Announce.guild); QuestGuru_Settings.Announce.whisper = {}; QuestGuru_Settings.Announce.whisper.Enabled = false; QuestGuru_AnnounceFrameChannelWhisperToggle:SetChecked(QuestGuru_Settings.Announce.whisper.Enabled); QuestGuru_Settings.Announce.whisper.To = ""; QuestGuru_AnnounceFrameChannelWhisperTo:SetText(QuestGuru_Settings.Announce.whisper.To); QuestGuru_Settings.Announce.Echo = false; QuestGuru_AnnounceFrameChannelEchoToggle:SetChecked(QuestGuru_Settings.Announce.Echo); end function QuestGuru_SaveAnnounceSettings() if (QuestGuru_AnnounceFrameAnnounceToggle:GetChecked()) then QuestGuru_Settings.Announce.Enabled = true; else QuestGuru_Settings.Announce.Enabled = false; end if (QuestGuru_AnnounceFrameChannelSayToggle:GetChecked()) then QuestGuru_Settings.Announce.say = true; else QuestGuru_Settings.Announce.say = false; end if (QuestGuru_AnnounceFrameChannelPartyToggle:GetChecked()) then QuestGuru_Settings.Announce.party = true; else QuestGuru_Settings.Announce.party = false; end if (QuestGuru_AnnounceFrameChannelGuildToggle:GetChecked()) then QuestGuru_Settings.Announce.guild = true; else QuestGuru_Settings.Announce.guild = false; end if (QuestGuru_AnnounceFrameChannelWhisperToggle:GetChecked()) then QuestGuru_Settings.Announce.whisper.Enabled = true; else QuestGuru_Settings.Announce.whisper.Enabled = false; end QuestGuru_Settings.Announce.whisper.To = QuestGuru_AnnounceFrameChannelWhisperTo:GetText(); if (QuestGuru_AnnounceFrameChannelEchoToggle:GetChecked()) then QuestGuru_Settings.Announce.Echo = true; else QuestGuru_Settings.Announce.Echo = false; end if (QuestGuru_AnnounceFrameMessageItemToggle:GetChecked()) then QuestGuru_Settings.Announce.item.Enabled = true; else QuestGuru_Settings.Announce.item.Enabled = false; end QuestGuru_Settings.Announce.item.Text = QuestGuru_AnnounceFrameMessageItem:GetText(); if (QuestGuru_AnnounceFrameMessageMonsterToggle:GetChecked()) then QuestGuru_Settings.Announce.monster.Enabled = true; else QuestGuru_Settings.Announce.monster.Enabled = false; end QuestGuru_Settings.Announce.monster.Text = QuestGuru_AnnounceFrameMessageMonster:GetText(); if (QuestGuru_AnnounceFrameMessageQuestAcceptToggle:GetChecked()) then QuestGuru_Settings.Announce.QuestAccept.Enabled = true; else QuestGuru_Settings.Announce.QuestAccept.Enabled = false; end QuestGuru_Settings.Announce.QuestAccept.Text = QuestGuru_AnnounceFrameMessageQuestAccept:GetText(); if (QuestGuru_AnnounceFrameMessageEventToggle:GetChecked()) then QuestGuru_Settings.Announce.event.Enabled = true; else QuestGuru_Settings.Announce.event.Enabled = false; end QuestGuru_Settings.Announce.event.Text = QuestGuru_AnnounceFrameMessageEvent:GetText(); if (QuestGuru_AnnounceFrameMessageQuestToggle:GetChecked()) then QuestGuru_Settings.Announce.Quest.Enabled = true; else QuestGuru_Settings.Announce.Quest.Enabled = false; end QuestGuru_Settings.Announce.Quest.Text = QuestGuru_AnnounceFrameMessageQuest:GetText(); end function QuestGuru_CancelAnnounceChanges() QuestGuru_AnnounceFrameAnnounceToggle:SetChecked(QuestGuru_Settings.Announce.Enabled); QuestGuru_AnnounceFrameChannelSayToggle:SetChecked(QuestGuru_Settings.Announce.say); QuestGuru_AnnounceFrameChannelPartyToggle:SetChecked(QuestGuru_Settings.Announce.party); QuestGuru_AnnounceFrameChannelGuildToggle:GetChecked(QuestGuru_Settings.Announce.guild); QuestGuru_AnnounceFrameChannelWhisperToggle:GetChecked(QuestGuru_Settings.Announce.whisper.Enabled); QuestGuru_AnnounceFrameChannelWhisperTo:SetText(QuestGuru_Settings.Announce.whisper.To); QuestGuru_AnnounceFrameChannelEchoToggle:SetChecked(QuestGuru_Settings.Announce.Echo); QuestGuru_AnnounceFrameMessageItemToggle:SetChecked(QuestGuru_Settings.Announce.item.Enabled); QuestGuru_AnnounceFrameMessageItem:SetText(QuestGuru_Settings.Announce.item.Text); QuestGuru_AnnounceFrameMessageMonsterToggle:SetChecked(QuestGuru_Settings.Announce.monster.Enabled); QuestGuru_AnnounceFrameMessageMonster:SetText(QuestGuru_Settings.Announce.monster.Text); QuestGuru_AnnounceFrameMessageQuestAcceptToggle:SetChecked(QuestGuru_Settings.Announce.QuestAccept.Enabled); QuestGuru_AnnounceFrameMessageQuestAccept:SetText(QuestGuru_Settings.Announce.QuestAccept.Text); QuestGuru_AnnounceFrameMessageEventToggle:SetChecked(QuestGuru_Settings.Announce.event.Enabled); QuestGuru_AnnounceFrameMessageEvent:SetText(QuestGuru_Settings.Announce.event.Text); QuestGuru_AnnounceFrameMessageQuestToggle:SetChecked(QuestGuru_Settings.Announce.Quest.Enabled); QuestGuru_AnnounceFrameMessageQuest:SetText(QuestGuru_Settings.Announce.Quest.Text); end function QuestGuru_DoAnnounce(announceText, numDone, numNeeded, itemName, questTitle, arg1, questID) if (not QuestGuru_Settings.Announce.Enabled) then return; end if (announceText ~= nil) then if (numDone == nil) then numDone = 0; end if (numNeeded == nil) then numNeeded = 0; end announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_DONE,numDone); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_NEEDED,numNeeded); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_NUMLEFT,numNeeded-numDone); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_ITEMNAME,itemName); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_QUESTTITLE,questTitle); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_UITEXT,arg1); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_COMPLETE,COMPLETE); announceText = string.gsub(announceText,QG_ANNOUNCE_KEYWORD_QLINK,GetQuestLink(questID)); if (QuestGuru_Settings.Announce.say) then SendChatMessage(announceText, "SAY"); end if (QuestGuru_Settings.Announce.party and (IsInGroup() and GetNumSubgroupMembers(LE_PARTY_CATEGORY_HOME) > 0 and IsInRaid() == false)) then SendChatMessage(announceText, "PARTY"); end if ((QuestGuru_Settings.Announce.guild) and IsInGuild()) then SendChatMessage(announceText, "GUILD"); end if (QuestGuru_Settings.Announce.whisper.Enabled) then SendChatMessage(announceText, "WHISPER", nil, QuestGuru_Settings.Announce.whisper.To); end if (QuestGuru_Settings.Announce.Echo) then QuestGuru_Echo(announceText, true); end end end function QuestGuru_DoAnnounceByTitle(questTitle, announceText, numDone, numNeeded, itemName, arg1) local i; local numEntries, numQuests = GetNumQuestLogEntries(); for i=1, numEntries do local qTitle, _, _, _, isHeader = GetQuestLogTitle(i); if not isHeader and (qTitle == questTitle) then QuestGuru_DoAnnounce(announceText, numDone, numNeeded, itemName, questTitle, arg1, i); end end end
QuestGuruComm.lua
lua Code:
QuestGuru_CommFrame = CreateFrame("FRAME", "QuestGuru_CommFrame", UIParent); QuestGuru_CommFrame:SetPoint("TOPLEFT"); QuestGuru_CommFrame:SetHeight(0); QuestGuru_CommFrame:SetWidth(0); QuestGuru_CommFrame:SetScript("OnUpdate", function (self, elapsed) QuestGuru_CommOnUpdate(elapsed); end); QuestGuru_CommFrame:Show(); QuestGuru_CommGuild = {}; QuestGuru_CommParty = {}; -- [PlayerName].QGver = version of QuestGuru other player is using -- quietTime = number of seconds since last message from player -- [quest number].Title -- .Status = status of player on that quest -- .Objectives = objectives text -- .Description = description text -- .[Obj#].type = objective type -- .text = objective text -- .finished = objective finished? -- .[Reward#].type = reward type (choice, spell, reward) -- .link = reward link -- MPmsg = storage for multi-part messages QuestGuru_CommTimer = {}; -- .interval = number of seconds to wait -- .currTime = number of seconds remaining -- .func = function to call after interval -- .count = number of times to repeat (-1 for infinite) -- .args = options arguments to pass QuestGuru_CommLastPartyNum = 0; QuestGuru_CommPendingPartyUpdate = false; function QuestGuru_CommOnUpdate(elapsed) local i, timer; for i, timer in ipairs(QuestGuru_CommTimer) do timer.currTime = timer.currTime - elapsed; if (timer.currTime <= 0) then timer.func(timer.arg1, timer.arg2, timer.arg3, timer.arg4); timer.currTime = timer.interval; timer.count = timer.count - 1; if (timer.count < 0) then timer.count = -1; elseif (timer.count == 0) then tremove(QuestGuru_CommTimer, i); i = i - 1; end end end end function QuestGuru_CommAddTimer(interval, count, func, arg1, arg2, arg3, arg4) local tempTimer = {} tempTimer.interval = interval; tempTimer.currTime = interval; tempTimer.count = count; tempTimer.func = func; tempTimer.arg1 = arg1; tempTimer.arg2 = arg2; tempTimer.arg3 = arg3; tempTimer.arg4 = arg4; tinsert(QuestGuru_CommTimer, tempTimer); end function QuestGuru_CommSendMessage(channel, code, ...) local i = 1; local recipient; if (channel == "WHISPER") then i = 2; recipient = select(1, ...); end if ((not QuestGuru_Settings.DisableComm) and not ((UnitInBattleground("player") ~= nil) and (channel == "PARTY"))) then ChatThrottleLib:SendAddonMessage("NORMAL", "QuGu", strjoin(string.char(2), code, ...), channel, recipient); end end function QuestGuru_CommSendPGMessage(...) if ((IsInGroup() and GetNumSubgroupMembers(LE_PARTY_CATEGORY_HOME) > 0) and (table.getn(QuestGuru_CommParty) > 0)) then QuestGuru_CommSendMessage("PARTY", ...); end if (IsInGuild()) then QuestGuru_CommSendMessage("GUILD", ...); end end function QuestGuru_CommSendMPMessage(channel, code, recipient, qNum, msg) -- Sends a MultiPart message (for quest objective and description since they can exceed the per-message size limit) -- These should always be WHISPER. Part "0" is last part, ready to process -- MP messages use char(3) to not conflict with SendMessage local i=1; msg = qNum..string.char(3)..msg; while (strlen(msg) > 200) do local t = string.sub(msg, 1, 200); msg = string.sub(msg, 201); QuestGuru_CommSendMessage(channel, code, recipient, i, t) i = i + 1; end QuestGuru_CommSendMessage(channel, code, recipient, "0", msg) end function QuestGuru_CommProcessMsg(sender, channel, message) local msg = { strsplit(string.char(2), message) }; if (msg == nil) then return; end local code = msg[1]; local currSender; if (channel == "GUILD") then if (QuestGuru_CommGuild[sender] == nil) then QuestGuru_CommGuild[sender] = {}; end currSender = QuestGuru_CommGuild[sender]; elseif (channel == "PARTY") then if (QuestGuru_CommParty[sender] == nil) then QuestGuru_CommParty[sender] = {}; end currSender = QuestGuru_CommParty[sender]; else if (QuestGuru_CommGuild[sender]) then QuestGuru_CommGuild[sender].quietTime = 0; end if (QuestGuru_CommParty[sender]) then QuestGuru_CommParty[sender].quietTime = 0; end currSender = {}; end currSender.quietTime = 0; if (code == "0000") then -- Player is sending their QG info -- store it currSender.QGver = msg[2]; QuestGuru_Echo(sender.." is using QuestGuru v"..msg[2]); elseif (code == "0001") then -- Player is sending QG info and requesting yours -- store their info and send ours currSender.QGver = msg[2]; QuestGuru_Echo(sender.." is using QuestGuru v"..msg[2]); if (sender ~= QuestGuru_Player) then QuestGuru_CommSendMessage(channel, "0000", QUESTGURU_VERSION); end elseif (code == "0008") then -- Pong -- not really necessary to do anything elseif (code == "0009") then -- Ping -- send a Pong QuestGuru_CommSendMessage("WHISPER", "0008", sender); elseif (code == "000F") then -- Player logged out currSender = nil; QuestGuru_Echo(sender.." logged off"); elseif (code == "0020") then -- Discovered NPC Name QuestGuru_MoreNPCNames[msg[2]] = 1; elseif (code == "0024") then -- Discovered Area Name QuestGuru_MoreAreaNames[msg[2]] = 1; elseif (code == "0108") then -- Player is on quest (linkNum, objStatus) if ((not msg[2]) or (not msg[3])) then return; end local qIDi, qIDj, qNum = string.find(msg[2], (":(%d+):")); if (qNum) then if (not currSender[qNum]) then currSender[qNum] = {}; end currSender[qNum].Status = msg[3]; end QuestLog_Update(); elseif (code == "0109") then -- Player is on quest, requesting who else is too if ((not msg[2]) or (not msg[3])) then return; end local qIDi, qIDj, qNum = string.find(msg[2], (":(%d+):")); if (qNum) then if (not currSender[qNum]) then currSender[qNum] = {}; end currSender[qNum].Status = msg[3]; end local numEntries, numQuests = GetNumQuestLogEntries(); local i, j; local qStatus = ""; for i=1, numEntries do local qLink = GetQuestLink(i); if (qLink) then local qli, qlj, qlNum = string.find(qLink, (":(%d+):")); if (qlNum == qNum) then QuestGuru_SendQuestStatus(i, false); end end end QuestLog_Update(); elseif (code == "010A") then -- Player completed quest currSender[msg[2]] = nil; QuestLog_Update(); elseif (code == "010B") then -- Player completed quest, requesting who else has it -- not used at this time elseif (code == "010C") then -- Player abandoned quest currSender[msg[2]] = nil; QuestLog_Update(); elseif (code == "010D") then -- Player abandoned quest, requesting who else has it -- not used at this time elseif (code == "0200") then -- qID = quest link QuestGuru_UpdateqID(msg[2], msg[3]); elseif (code == "0201") then -- Request quest link by qID if (QuestGuru_Quests[QuestGuru_RealmName][msg[2]] ~= nil) then if (QuestGuru_Quests[QuestGuru_RealmName][msg[2]]["_link"] ~= nil) then QuestGuru_CommSendMessage(channel, "0200", msg[2], QuestGuru_Quests[QuestGuru_RealmName][msg[2]]["_link"]); end end elseif (code == "0202") then -- Quest Title (qNum, Title) if (not currSender[msg[2]]) then currSender[msg[2]] = {}; end currSender[msg[2]].Title = msg[3]; elseif (code == "0203") then -- Request quest title (qNum) if (not msg[2]) then return; end local qNum = msg[2]; local numEntries, numQuests = GetNumQuestLogEntries(); local i, j; local qStatus = ""; for i=1, numEntries do local qLink = GetQuestLink(i); if (qLink) then local qli, qlj, qlNum = string.find(qLink, (":(%d+):")); if (qlNum == qNum) then local qTitle = GetQuestLogTitle(i); QuestGuru_CommSendMessage(channel, "0202", sender, qNum, qTitle); end end end elseif (code == "0204") then -- Objectives text (msg[2] = part, msg[3] = qNum..char(3)..text) if (tonumber(msg[2]) == 1) then currSender.MPmsg = nil; end currSender.MPmsg = currSender.MPmsg..msg[3]; if (msg[2] == "0") then -- end of multi-part local qDesc = { strsplit(string.char(3), currSender.MPmsg) }; -- qDesc[1] = qNum, qDesc[2] = text if (not currSender[qDesc[1]]) then currSender[qDesc[1]] = {}; end currSender[qDesc[1]].Objectives = qDesc[2]; currSender.MPmsg = nil; end elseif (code == "0205") then -- Request objectives text (qNum) if (not msg[2]) then return; end local qNum = msg[2]; local numEntries, numQuests = GetNumQuestLogEntries(); local i, j; local qStatus = ""; for i=1, numEntries do local qLink = GetQuestLink(i); if (qLink) then local qli, qlj, qlNum = string.find(qLink, (":(%d+):")); if (qlNum == qNum) then QuestGuru_SendQuestObjectivesText(i, sender, qNum); end end end elseif (code == "0206") then -- Description text (msg[2] = part, msg[3] = qNum..char(3)..text) if (tonumber(msg[2]) < 2) then currSender.MPmsg = nil; end currSender.MPmsg = currSender.MPmsg..msg[3]; if (msg[2] == "0") then -- end of multi-part local qDesc = { strsplit(string.char(3), currSender.MPmsg) }; -- qDesc[1] = qNum, qDesc[2] = text if (not currSender[qDesc[1]]) then currSender[qDesc[1]] = {}; end currSender[qDesc[1]].Description = qDesc[2]; end elseif (code == "0207") then -- Request description text (qNum) if (not msg[2]) then return; end local qNum = msg[2]; local numEntries, numQuests = GetNumQuestLogEntries(); local i, j; local qStatus = ""; for i=1, numEntries do local qLink = GetQuestLink(i); if (qLink) then local qli, qlj, qlNum = string.find(qLink, (":(%d+):")); if (qlNum == qNum) then QuestGuru_SendQuestDescription(i, sender, qNum); end end end elseif (code == "0208") then -- Quest starter info (qNum, info) if (QuestGuru_Quests[QuestGuru_RealmName][msg[2]] == nil) then QuestGuru_Quests[QuestGuru_RealmName][msg[2]] = {}; end if ((QuestGuru_Quests[QuestGuru_RealmName][msg[2]].StartInfo == nil) or (string.find(QuestGuru_Quests[QuestGuru_RealmName][msg[2]].StartInfo, QG_UNKNOWN))) then QuestGuru_Quests[QuestGuru_RealmName][msg[2]].StartInfo = msg[3]; end elseif (code == "0209") then -- Requesting quest starter info (qNum) if (QuestGuru_Quests[QuestGuru_RealmName][msg[2]] ~= nil) then if ((QuestGuru_Quests[QuestGuru_RealmName][msg[2]].StartInfo ~= nil) and (not string.find(QuestGuru_Quests[QuestGuru_RealmName][msg[2]].StartInfo, QG_UNKNOWN))) then QuestGuru_CommSendMessage(channel, "020A", msg[2], QuestGuru_Quests[QuestGuru_RealmName][msg[2]].StartInfo); end end elseif (code == "020A") then -- Quest finisher info (qNum, info) if (QuestGuru_Quests[QuestGuru_RealmName][msg[2]] == nil) then QuestGuru_Quests[QuestGuru_RealmName][msg[2]] = {}; end if ((QuestGuru_Quests[QuestGuru_RealmName][msg[2]].FinishInfo == nil) or (string.find(QuestGuru_Quests[QuestGuru_RealmName][msg[2]].FinishInfo, QG_UNKNOWN))) then QuestGuru_Quests[QuestGuru_RealmName][msg[2]].FinishInfo = msg[3]; end elseif (code == "020B") then -- Requesting quest finisher info (qNum) if (QuestGuru_Quests[QuestGuru_RealmName][msg[2]] ~= nil) then if ((QuestGuru_Quests[QuestGuru_RealmName][msg[2]].FinishInfo ~= nil) and (not string.find(QuestGuru_Quests[QuestGuru_RealmName][msg[2]].FinishInfo, QG_UNKNOWN))) then QuestGuru_CommSendMessage(channel, "020A", msg[2], QuestGuru_Quests[QuestGuru_RealmName][msg[2]].FinishInfo); end end elseif (code == "020C") then -- Quest objective (qNum, type, text) elseif (code == "020D") then -- Request quest objectives (qNum) elseif (code == "020E") then -- Quest reward (qNum, type, link) elseif (code == "020F") then -- Request quest rewards (qNum) elseif (code == "0300") then -- Item link by name if (QuestGuru_Items[QuestGuru_RealmName]) then QuestGuru_Items[QuestGuru_RealmName][msg[2]] = msg[3]; end elseif (code == "0301") then -- Request item link by name if (QuestGuru_Items[QuestGuru_RealmName] and QuestGuru_Items[QuestGuru_RealmName][msg[2]]) then QuestGuru_CommSendMessage(channel, "0300", msg[2], QuestGuru_Items[QuestGuru_RealmName][msg[2]]); end end end function QuestGuru_UpdateqID(qID, link) if (QuestGuru_Quests[QuestGuru_RealmName][qID] == nil) then QuestGuru_Quests[QuestGuru_RealmName][qID] = {}; end if (QuestGuru_Quests[QuestGuru_RealmName][qID]["_link"] == nil) then QuestGuru_Quests[QuestGuru_RealmName][qID]["_link"] = link; end local qIDi, qIDj, qNum, qLevel = string.find(link, (":(%d+):(%d+)|")); if (qLevel and (QuestGuru_Quests[QuestGuru_RealmName][qID].level == nil)) then QuestGuru_Quests[QuestGuru_RealmName][qID].level = qLevel; end if (qNum and (QuestGuru_Quests[QuestGuru_RealmName][qNum] == nil)) then QuestGuru_Quests[QuestGuru_RealmName][qNum] = {}; end if (qNum and (QuestGuru_Quests[QuestGuru_RealmName][qNum][qID] == nil)) then QuestGuru_Quests[QuestGuru_RealmName][qNum][qID] = 1; end end function QuestGuru_SendCurrentQuestStatus(req, channel) local numEntries, numQuests = GetNumQuestLogEntries(); local i; for i=1, numEntries do QuestGuru_SendQuestStatus(i, req, channel); end end function QuestGuru_SendQuestStatusByName(name, req, channel) local i; local numEntries, numQuests = GetNumQuestLogEntries(); for i=1, numEntries do local qTitle = GetQuestLogTitle(i); if (qTitle == name) then QuestGuru_SendQuestStatus(i, req, channel); end end end function QuestGuru_SendQuestStatus(index, req, channel) local j; local qStatus = ""; if (req ~= false) then req = true; end local qLink = GetQuestLink(index); if (qLink) then local numObjectives = GetNumQuestLeaderBoards(index); for j=1, numObjectives do local text, type, finished = GetQuestLogLeaderBoard(j, index); if ((type == "item") or (type == "monster") or (type == "object")) then local x, y, name, numItems, numNeeded = string.find(text, QG_ITEM_REQ_STR); if (name ~= nil) then qStatus = qStatus..numItems..";"; end else if (finished) then qStatus = qStatus.."1;"; else qStatus = qStatus.."0;"; end end end local code = "0108"; if (req == true) then code = "0109"; end if (channel == nil) then QuestGuru_CommSendPGMessage(code, qLink, qStatus); else QuestGuru_CommSendMessage(channel, code, qLink, qStatus); end end end function QuestGuru_SendQuestDescription(index, recipient, qNum) local questSelected = GetQuestLogSelection(); SelectQuestLogEntry(index); local questDescription, questObjectives = GetQuestLogQuestText(); QuestGuru_CommSendMPMessage("WHISPER", "0206", recipient, qNum, questDescription); SelectQuestLogEntry(questSelected); end function QuestGuru_SendQuestObjectivesText(index, recipient, qNum) local questSelected = GetQuestLogSelection(); SelectQuestLogEntry(index); local questDescription, questObjectives = GetQuestLogQuestText(); QuestGuru_CommSendMPMessage("WHISPER", "0204", recipient, qNum, questObjectives); SelectQuestLogEntry(questSelected); end function QuestGuru_FindLink(lastqID) local qID, record; for qID, record in pairs(QuestGuru_Quests) do if (record["_link"] == nil) then if (lastqID == nil) then lastqID = qID; QuestGuru_CommSendPGMessage("0201", qID); QuestGuru_CommAddTimer(60, 1, QuestGuru_FindLink, lastqID); return; elseif (lastqID == qID) then lastqID = nil; end end end end function QuestGuru_CommUpdateParty() local i, v; local c = 0; for i, v in pairs(QuestGuru_CommParty) do if (not UnitInParty(i)) then QuestGuru_CommParty[i] = nil; else c = c + 1; end end if ((QuestGuru_CommLastPartyNum == 0) and (IsInGroup() and GetNumSubgroupMembers(LE_PARTY_CATEGORY_HOME) > 0)) then QuestGuru_CommSendMessage("PARTY", "0001", QUESTGURU_VERSION); QuestGuru_SendCurrentQuestStatus(true, "PARTY"); end QuestGuru_CommLastPartyNum = GetNumSubgroupMembers(LE_PARTY_CATEGORY_HOME); QuestGuru_CommPendingPartyUpdate = false; end function QuestGuru_CommUpdateGuild() local i; local c = 0; local guildNum = GetNumGuildMembers(); local showOffline = GetGuildRosterShowOffline(); if (QuestGuru_CommGuild == nil) then QuestGuru_CommGuild = {}; end SetGuildRosterShowOffline(true); for i=1, guildNum do local name, rank, rankIndex, level, class, zone, note, officernote, online, status = GetGuildRosterInfo(i); if (not online) then if (name) then QuestGuru_CommGuild[name] = nil; end else if (name and QuestGuru_CommGuild[name]) then c = c + 1; end end end SetGuildRosterShowOffline(showOffline); end function QuestGuru_CommListGuild() local i, v; for i, v in pairs(QuestGuru_CommGuild) do QuestGuru_Echo(i.." is using QuestGuru v"..v.QGver, true); end end
Bindings.xml
Code:
<Bindings>
<Binding name="QUESTGURU_TOGGLE" description="Toggle Quest Log" header="QUESTGURU" default="L" category="ADDONS">
ToggleQuestLog();
</Binding>
</Bindings>
I didn't add the localization files as they are still ok (I hope). I really do appreciate any and all help getting this addon back on the road and will include acknowledgements for all those that do help because without you I would sink. I do hope that once I do understand what you are helping me with that I can get the QuestGuru Tracker up and going also. I just thought it would be way too much to ask help on both parts here. Not used to asking for too much help. I have asked a couple of small things in the past, but mainly rely on searching the net for the knowledge to help myself. Its just now seeing myself get overwhelmed with this and the emails I have been getting from the people that rely on this addon that I must ask for help. Thanks again in advance.(Also, the full QuestGuru addon is attached as a zip file)
__________________
"There's no such thing as too many addons."Lothaer
My Authored AddonsHOME OF THE FREE, BECAUSE OF THE BRAVE
|