-- FastQuest 2.11 By Vashen ( Vashen@msn.com ) -- http://www.curse-gaming.com/mod.php?addid=812 hQuestLog_Update = QuestLog_Update; hQuestWatch_Update = QuestWatch_Update; local player = "DEFAULT"; local Formats = {}; Formats[0]="QuestName"; Formats[1]="[QuestLevel] QuestName"; Formats[2]="[QuestLevel+] QuestName"; Formats[3]="[QuestLevel] QuestName (Tag)"; local nFormats = 4; function FastQuest_OnLoad() this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("UI_INFO_MESSAGE"); this:RegisterEvent("QUEST_PROGRESS"); this:RegisterEvent("QUEST_COMPLETE"); SLASH_FQ1 = "/fastquest"; SLASH_FQ2 = "/fq"; SlashCmdList["FQ"] = FastQuest_SlashCmd; qOut("|cff00ffffFastQuest 2.11 By Vashen is now loaded. |cffffffff/fq"); end function FastQuest_SlashCmd(msg) if (msg) then local cmd = gsub(msg, "%s*([^%s]+).*", "%1"); local info ="|cff00ffffFastQuest: |r|cffffffff"; if( cmd == "tag" ) then info = (info.."Display of quest-tags has been "); FQD[player].Tag=FastQuest_ToggleBoolean(FQD[player].Tag,info); QuestLog_Update(); QuestWatch_Update(); return; elseif( cmd == "autoadd" ) then info = (info.."Automatic addition of changed quests to QuestTracker has been "); FQD.AutoAdd=FastQuest_ToggleBoolean(FQD.AutoAdd,info); return; elseif( cmd == "autonotify" ) then info = (info.."Automatic notification of party members regarding your quest progress has been "); FQD.AutoNotify=FastQuest_ToggleBoolean(FQD.AutoNotify,info); return; elseif( cmd == "autocomplete" ) then info = (info.."Automatic quest completion has been "); FQD.AutoComplete=FastQuest_ToggleBoolean(FQD.AutoComplete,info); return; elseif( cmd == "lock" and FQD.NoDrag==false)then qOut(info.." Movable components have been Locked"); FQD.Lock = true; FastQuest_LockMovableParts(); return; elseif( cmd == "unlock" and FQD.NoDrag==false)then qOut(info.." Movable components have been Unlocked"); FQD.Lock = false; FastQuest_LockMovableParts(); return; elseif( cmd == "nodrag") then info = (info.." Dragging is now "); FQD.NoDrag=FastQuest_ToggleBoolean(FQD.NoDrag,info); if (FQD.NoDrag == false ) then FQD.Lock = true;end qOut("You must reload UI for this change to apply. Type /console reloadui"); return; elseif( cmd == "reset" and FQD.NoDrag==false)then qOut(info.." Movable components have been Reset"); FastQuestFrame:SetPoint("TOPLEFT", "Minimap", "TOPLEFT", -20, -15); dQuestWatchDragButton:SetPoint("TOPLEFT", "UIParent", "TOPRIGHT", -250, -250); return; elseif( cmd == "format" )then if (FQD[player].Format==nil) then FQD[player].Format=1;end if (FQD[player].Format==(nFormats-1)) then FQD[player].Format=0; else FQD[player].Format=FQD[player].Format+1; end qOut(info.."Toggle beetween output formats "); qOut("Selected format: "..Formats[FQD[player].Format]); return; elseif( cmd == "clear" ) then qOut(info.."All quest tracker quests have been removed "); for i = GetNumQuestWatches(), 1 , -1 do local qID = GetQuestIndexForWatch(i) FQD[player].tQuests[i] = " "; RemoveQuestWatch(qID); end FQD[player].nQuests = 0; QuestWatch_Update(); return; end qOut(info.."usage /fastquest [command] or /fq [command]"); qOut("|cffffffff/fq tag - Toggle display of quest tags (elite, raid,etc) "); qOut("|cffffffff/fq lock(unlock) - Locks/Unlocks quest tracker window"); qOut("|cffffffff/fq nodrag - Toggle dragging of quest tracker, you must reload UI to apply"); qOut("|cffffffff/fq reset - Resets FastQuest moving components, draging must be enabled"); qOut("|cffffffff/fq autoadd - Toggle automatic addition of changed quests to QuestTracker"); qOut("|cffffffff/fq autonotify - Toggle automatic notification of party members"); qOut("|cffffffff/fq autocomplete - Toggle automatic completion of quests when turning them in"); qOut("|cffffffff/fq clear - Clear QuestTracker window from all quests"); qOut(info.."New version: http://www.curse-gaming.com/mod.php?addid=812"); end end function FastQuest_OnEvent(event, message) if ((event == "QUEST_PROGRESS") and (FQD.AutoComplete==true)) then CompleteQuest(); elseif ((event == "QUEST_COMPLETE") and (FQD.AutoComplete==true)) then if (GetNumQuestChoices() == 0) then GetQuestReward(QuestFrameRewardPanel.itemChoice); end elseif(event == "VARIABLES_LOADED") then if (FQD == nil) then FQD = {};end if (FQD.Lock == nil) then FQD.Lock=true; end if (FQD.NoDrag == nil) then FQD.NoDrag = false; end; if (FQD.AutoNotify == nil) then FQD.AutoAdd = true; end if (FQD.AutoComplete == nil) then FQD.AutoNotify = true; end; FQD.AutoNotify = false; UpdatePlayer(); FastQuest_LinkFrame(dQuestWatchDragButton:GetName(), QuestWatchFrame:GetName(), "RIGHT"); FastQuest_LockMovableParts(); elseif (event == "UI_INFO_MESSAGE" and message) then local uQuestText = gsub(message,"(.*):%s*([-%d]+)%s*/%s*([-%d]+)%s*$","%1",1); if ( uQuestText ~= message) then if (FQD.AutoNotify == true) then FastQuest_CheckDefaultChat(false); SendChatMessage("FastQuest progress: "..message, DEFAULT_CHAT_FRAME.editBox.chatType); end if (FQD.AutoAdd==true and GetNumQuestWatches() 0 ) then for i=1, nObjectives do oText, oType, oDone = GetQuestLogLeaderBoard(i, qIndex); if ( not oText or strlen(oText) == 0 or oText == "" ) then oText = oType;end if ( oDone ) then SendChatMessage(" X "..oText, DEFAULT_CHAT_FRAME.editBox.chatType); else SendChatMessage(" - "..oText, DEFAULT_CHAT_FRAME.editBox.chatType); end end end end QuestLog_Update(); elseif ( button == "RightButton" ) then if ( ChatFrameEditBox:IsVisible() ) then QuestLog_SetSelection(qIndex); local qDescription, qObjectives = GetQuestLogQuestText(); if (qObjectives) then ChatFrameEditBox:Insert(qObjectives);end return; end FastQuest_Watch(qIndex,false); end end function QuestLog_Update() if (player == "DEFAULT" or FQD[player].tQuests == nil) then UpdatePlayer();end; FastQuest_LockMovableParts(); local nEntries, nQuests = GetNumQuestLogEntries(); if (GetNumQuestWatches() < 1 and FQD[player].nQuests > 0) then for i=1, nEntries do SelectQuestLogEntry(i); local qTitle, qLevel, qTag, isHeader, isCollapsed = GetQuestLogTitle(i + FauxScrollFrame_GetOffset(QuestLogListScrollFrame)); for j = 1, FQD[player].nQuests do if (qTitle == FQD[player].tQuests[j] and not IsQuestWatched(i)) then AddQuestWatch(i); end end end end hQuestLog_Update(); for i=1, QUESTS_DISPLAYED, 1 do if ( i <= nEntries ) then local qTitle, qLevel, qTag, isHeader, isCollapsed = GetQuestLogTitle(i + FauxScrollFrame_GetOffset(QuestLogListScrollFrame)); local qLogTitle = getglobal("QuestLogTitle"..i); local qCheck = getglobal("QuestLogTitle"..i.."Check"); qCheck:SetPoint("LEFT", qLogTitle:GetName(), "LEFT", 3, 0); FastQuest_ChangeTitle(qLogTitle, qTitle, qLevel, qTag, isHeader, false); end end end function QuestWatch_Update() hQuestWatch_Update(); local qDone; wID=1; oID=1; DoneID = -1; FQD[player].nQuests = GetNumQuestWatches(); for i = 1, GetNumQuestWatches() do FQD[player].tQuests[i] = " "; local qID = GetQuestIndexForWatch(i); if (qID) then local qTitle, qLevel, qTag, isHeader, isCollapsed = GetQuestLogTitle(qID); FQD[player].tQuests[i]= qTitle; qLogTitle = getglobal( "QuestWatchLine" ..wID); FastQuest_ChangeTitle(qLogTitle, qTitle, qLevel, qTag, isHeader, true); qDone = true; oID = 1; for j = 1, GetNumQuestLeaderBoards(qID) do oID = j; qLogTitle = getglobal( "QuestWatchLine" ..(wID+j)); local oTitle, oType, oDone = GetQuestLogLeaderBoard(j,qID); if (oDone) then qLogTitle:SetText("|cFFC0FFCF X "..oTitle.." "); else qLogTitle:SetText("|cFFFFFFFF - "..oTitle.." "); qDone = false; end end wID= wID+oID+1; if (qDone) then DoneID = qID;end end end if (DoneID>0) then PlaySoundFile("sound/interface/igplayerBind.wav"); UIErrorsFrame:AddMessage("|cff00ffff"..GetQuestLogTitle(DoneID).." (COMPLETE)", 1.0, 1.0, 1.0, 1.0, 2); if (FQD.AutoNotify==true) then FastQuest_CheckDefaultChat(false); SendChatMessage("FastQuest : "..GetQuestLogTitle(DoneID).." is now complete!", DEFAULT_CHAT_FRAME.editBox.chatType) end RemoveQuestWatch(DoneID); QuestWatch_Update(); end FQD[player].nQuests = GetNumQuestWatches(); FastQuest_LockMovableParts(); end function FastQuest_ChangeTitle(qLogTitle, qTitle, qLevel, qTag, isHeader, Watch) local ColorTag=""; local DifTag=""; if (qTitle and not isHeader) then if (qTag and FQD[player].Tag==true) then DifTag = (" ("..qTag..") ");end if (Watch) then local cQuestLevel = GetDifficultyColor(qLevel); ColorTag = string.format("|cff%02x%02x%02x", cQuestLevel.r * 255, cQuestLevel.g * 255, cQuestLevel.b * 255); qLogTitle:SetText(ColorTag.." ["..qLevel.."] "..qTitle..DifTag); else qLogTitle:SetText(" ["..qLevel.."] "..qTitle.." "); end end end function FastQuest_LinkFrame(dButton, pFrame) if (FQD.NoDrag == false) then getglobal(pFrame):ClearAllPoints(); getglobal(pFrame):SetPoint("TOPLEFT", dButton, "TOPRIGHT"); else qOut("Fast Quest: Draging is disabled, use /fq nodrag to toggle you must also reload UI for changes to take affect"); FQD.Lock = true; end end function FastQuest_DragFrame(pFrame, mode) if (FQD.NoDrag == false) then if (mode == 0) then pFrame:StartMoving(); else pFrame:StopMovingOrSizing(); end end end function qOut (msg) if( DEFAULT_CHAT_FRAME and msg) then DEFAULT_CHAT_FRAME:AddMessage(msg); end end function FastQuest_LockMovableParts() if (FQD[player].nQuests > 0 and QuestWatchFrame:IsVisible() and FQD.Lock==false and FQD.NoDrag==false) then dQuestWatchDragButton:Show(); else dQuestWatchDragButton:Hide(); end; end function UpdatePlayer() player = UnitName("player"); if (player == nil or player == UNKNOWNBEING or player == UKNOWNBEING or player == UNKNOWNOBJECT) then player = "DEFAULT";end if ( FQD[player] == nil or FQD[player].tQuests == nil ) then FQD[player] = { ["Format"] = 1; ["Tag"] = false; ["nQuests"] = 0; ["tQuests"] = { }; } for i=1, MAX_WATCHABLE_QUESTS, 1 do FQD[player].tQuests[i]=" "; end; end end function GetDifficultyColor(level) local lDiff = level - UnitLevel("player"); if (lDiff >= 0) then for i= 1.00, 0.10, -0.10 do color = {r = 1.00, g = i, b = 0.00}; if ((i/0.10)==(10-lDiff)) then return color; end end elseif ( -lDiff < GetQuestGreenRange() ) then for i= 0.90, 0.10, -0.10 do color = {r = i, g = 1.00, b = 0.00}; if ((9-i/0.10)==(-1*lDiff)) then return color; end end elseif ( -lDiff == GetQuestGreenRange() ) then color = {r = 0.50, g = 1.00, b = 0.50}; else color = {r = 0.75, g = 0.75, b = 0.75}; end return color; end function FastQuest_Watch(qID, auto) if (qID) then if ((IsQuestWatched(qID)) and (auto == false)) then RemoveQuestWatch(qID); QuestWatch_Update(); QuestLog_Update(); else if ((GetNumQuestLeaderBoards(qID) == 0) and (auto == false)) then UIErrorsFrame:AddMessage(QUEST_WATCH_NO_OBJECTIVES, 1.0, 0.1, 0.1, 1.0, UIERRORS_HOLD_TIME); return; end if (GetNumQuestWatches() >= MAX_WATCHABLE_QUESTS ) then UIErrorsFrame:AddMessage(format(QUEST_WATCH_TOO_MANY, MAX_WATCHABLE_QUESTS), 1.0, 0.1, 0.1, 1.0, UIERRORS_HOLD_TIME); return; end AddQuestWatch(qID); QuestWatch_Update(); QuestLog_Update(); end end end function FastQuest_GetQuestID(str) local qSelected= GetQuestLogSelection(); for i=1, GetNumQuestLogEntries(), 1 do SelectQuestLogEntry(i); local qTitle, qLevel, qTag, isHeader, isCollapsed, qComplete = GetQuestLogTitle(i); if (qTitle == str ) then return i; end if(not isHeader) then for j = 1, GetNumQuestLeaderBoards() do local oText, oType, oDone = GetQuestLogLeaderBoard(j); if ((oText==nil) or (oText=="")) then oText = oType; end if (string.find(gsub(oText,"(.*): %d+/%d+","%1",1),gsub(str,"(.*): %d+/%d+","%1",1))) then SelectQuestLogEntry(qSelected); return i; end end local qDescription, qObjectives = GetQuestLogQuestText(); if(string.find(qObjectives, str)) then SelectQuestLogEntry(qSelected); return i; end end end SelectQuestLogEntry(qSelected); return nil; end function FastQuest_CheckDefaultChat(allowGuild) if ((DEFAULT_CHAT_FRAME.editBox.stickyType == "GUILD") and (allowGuild == false)) then DEFAULT_CHAT_FRAME.editBox.chatType = "PARTY"; elseif ((DEFAULT_CHAT_FRAME.editBox.stickyType == "PARTY") and (GetNumPartyMembers() == 0)) then DEFAULT_CHAT_FRAME.editBox.chatType = "SAY"; elseif ((DEFAULT_CHAT_FRAME.editBox.stickyType == "RAID") and (GetNumRaidMembers() == 0)) then DEFAULT_CHAT_FRAME.editBox.chatType = "SAY"; end end function FastQuest_ToggleBoolean ( bool, msg ) if( bool == false ) then qOut(msg.."Enabled"); bool = true; else qOut(msg.."Disabled"); bool = false; end return bool; end