WoWInterface SVN QuestGuruMain

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

trunk/QuestGuru.toc New file
0,0 → 1,18
## Interface: 40300
## Title: QuestGuru
## Notes: Quest Log Enhancement
## Author: MrOBrian/Gregity
## Version: 2.2.5-40300
## SavedVariables: QuestGuru_Items, QuestGuru_Settings
## SavedVariablesPerCharacter:
ChatThrottleLib.lua
localization.lua
localization.DE.lua
localization.FR.lua
localization.RU.lua
localization.TW.lua
QuestGuruComm.lua
QuestGuru_Templates.xml
QuestGuru.xml
QuestGuruOptions.lua
QuestGuruAnnounce.lua
\ No newline at end of file
trunk/localization.lua New file
0,0 → 1,89
------------------------------------
-- QuestGuru English Localization --
------------------------------------
 
QG_REP_GAIN = "Reputation with (.*) increased by ([%d]+).";
QG_REP_DEC = "Reputation with (.*) decreased by ([%d]+).";
QG_XP_GAIN = "You gain ([%d]+) experience.";
QG_QUEST_COMPLETE = "Quest Complete!";
 
-- Default filler words used in various places
QG_UNKNOWN = "Unknown";
QG_NONE = "None";
 
-- Right click menu strings for Quest Log and Tracker
QG_TRACK = "Track";
QG_UNTRACK = "Untrack";
QG_SHARE_QUEST = "Share Quest";
QG_ABANDON_QUEST = "Abandon Quest";
QG_DELETE_QUEST = "Delete Quest";
 
-- User Interface Elements
QG_EXPAND_HEADERS = "Expand/Collapse all headers";
QG_OPTIONS = "Options";
QG_SEARCH = "Search: ";
 
-- History strings
QG_HISTORY_NONE = "No Quest History";
QG_SHOWHISTORY = "History";
QG_COLLEVEL = "Level";
QG_COLTITLE = "Title";
QG_COLSTATUS = "Status";
QG_COLSTART = "Started by";
QG_ACTIVE = "Active";
 
-- Announcer
QG_OPT_ANNOUNCE_HEAD = "QuestGuru Announcer Options";
QG_OPT_ANNOUNCE_DESC = "Use these options to announce your quest progress to others.\nChanges to these settings are saved when you click Okay.";
QG_OPT_ANNOUNCE_PROGRESS = "Announce Quest Progress";
QG_OPT_ANNOUNCE_CHANNEL_HEAD = "Channels:";
QG_OPT_ANNOUNCE_CHANNEL_SAY = "/s";
QG_OPT_ANNOUNCE_CHANNEL_SAY_DESC = "Make announcements in Say";
QG_OPT_ANNOUNCE_CHANNEL_PARTY = "/p";
QG_OPT_ANNOUNCE_CHANNEL_PARTY_DESC = "Make announcements to your Party";
QG_OPT_ANNOUNCE_CHANNEL_GUILD = "/g";
QG_OPT_ANNOUNCE_CHANNEL_GUILD_DESC = "Make announcements to your Guild";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER = "/w";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_DESC = "Whisper your announcements to someone";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_TO = "to:";
QG_OPT_ANNOUNCE_ECHO = "Echo";
QG_OPT_ANNOUNCE_ECHO_DESC = "Display announcements in your General chat window.";
QG_OPT_ANNOUNCE_MESSAGES = "Messages:";
QG_OPT_ANNOUNCE_HELP_DONE = "Number of items collected or monsters killed";
QG_OPT_ANNOUNCE_HELP_NEEDED = "Total number of items or monsters needed";
QG_OPT_ANNOUNCE_HELP_NUMLEFT = "Number of items or monsters remaining";
QG_OPT_ANNOUNCE_HELP_NAME = "Objective text without #/#";
QG_OPT_ANNOUNCE_HELP_TITLE = "Name of the quest for this objective";
QG_OPT_ANNOUNCE_HELP_UITEXT = "The text that showed up onscreen";
QG_OPT_ANNOUNCE_HELP_COMPLETE = "Localized complete message: \""..COMPLETE.."\"";
QG_OPT_ANNOUNCE_HELP_QLINK = "The quest link of the affected quest";
QG_OPT_ANNOUNCE_ITEM_MSG = "Announce item objective progress using message:";
QG_OPT_ANNOUNCE_MOB_MSG = "Announce monster objective progress using message:";
QG_OPT_ANNOUNCE_EVENT_MSG = "Announce event objective progress using message:";
QG_OPT_ANNOUNCE_COMPLETE_MSG = "Announce quest completion using message:";
QG_OPT_ANNOUNCE_QUESTACCEPT_MSG = "Announce when you Accept a new Quest";
QG_ANNOUNCE_ITEM_DEFAULT = "Collected $done $name of $needed needed for $questTitle";
QG_ANNOUNCE_MOB_DEFAULT = "$done $name of $needed needed for $questTitle";
QG_ANNOUNCE_QUESTACCEPT_DEFAULT = "Started quest $qlink";
QG_ANNOUNCE_RESET = "Resetting Announcer settings to defaults.";
 
-- Options
QG_OPT_OPTIONS_DESC = "These options change general settings for QuestGuru.\nChanges to these settings are saved immediately.";
QG_OPT_LEVELS_HEAD = "Show Levels";
QG_OPT_LEVELS_QUESTLOG = "In Quest Log";
QG_OPT_LEVELS_HISTORY = "In History Log";
QG_OPT_LEVELS_ABANDON = "In Abandon Log";
QG_OPT_AUTOCOMPLETE = "AutoComplete Quests";
QG_OPT_OBJ_ICON = "Show objective item icons in log";
QG_OPT_HEADER_QUEST_NUM = "Show number of quests in headers";
QG_OPT_DISABLE_COMM = "Disable all addon-to-addon communications";
 
QG_OPT_SOUND_HEAD = "Sound Options";
QG_OPT_SOUND_DESC = "Use this panel to change the sounds played on quest progress.\nChanges to these settings are saved immediately.";
QG_OPT_SOUND_ENABLE = "Enable additional sounds";
QG_OPT_SOUND_OBJ = "Play sound on objective progress:";
QG_OPT_SOUND_OBJ_DONE = "Play sound on objective completion:";
QG_SOUND_QUEST_DONE = "Play sound on quest completion:";
 
-- Other strings that may or may not need localizing
QG_ITEM_REQ_STR = "(.*):%s*([%d]+)%s*/%s*([%d]+)"; -- The format of the line when an item is required for a quest, an invalid format can cause many errors
\ No newline at end of file
trunk/QuestGuruAnnounce.lua New file
0,0 → 1,470
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("Announce Message Variables");
GameTooltip:AddDoubleLine("$done",QG_OPT_ANNOUNCE_HELP_DONE);
GameTooltip:AddDoubleLine("$needed",QG_OPT_ANNOUNCE_HELP_NEEDED);
GameTooltip:AddDoubleLine("$numleft",QG_OPT_ANNOUNCE_HELP_NUMLEFT);
GameTooltip:AddDoubleLine("$name",QG_OPT_ANNOUNCE_HELP_NAME);
GameTooltip:AddDoubleLine("$questTitle",QG_OPT_ANNOUNCE_HELP_TITLE);
GameTooltip:AddDoubleLine("$uitext",QG_OPT_ANNOUNCE_HELP_UITEXT);
GameTooltip:AddDoubleLine("$complete",QG_OPT_ANNOUNCE_HELP_COMPLETE);
GameTooltip:AddDoubleLine("$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 = "$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 = "$qlink $complete!";
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 = "$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 = "$qlink $complete!";
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,"$done",numDone);
announceText = string.gsub(announceText,"$needed",numNeeded);
announceText = string.gsub(announceText,"$numleft",numNeeded-numDone);
announceText = string.gsub(announceText,"$name",itemName);
announceText = string.gsub(announceText,"$questTitle",questTitle);
announceText = string.gsub(announceText,"$uitext",arg1);
announceText = string.gsub(announceText,"$complete",COMPLETE);
announceText = string.gsub(announceText,"$qlink",GetQuestLink(questID));
 
if (QuestGuru_Settings.Announce.say) then
SendChatMessage(announceText, "SAY");
end
local partyNum = GetNumPartyMembers();
if ((QuestGuru_Settings.Announce.party) and (partyNum > 0)) 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
\ No newline at end of file
trunk/ChatThrottleLib.lua New file
0,0 → 1,503
--
-- 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
]]
 
 
trunk/localization.RU.lua New file
0,0 → 1,132
------------------------------------
-- QuestGuru Russian Localization by StingerSoft--
------------------------------------
if (GetLocale() == "ruRU") then
QG_REP_GAIN = "Отношение |3-7(.*) к вам улучшилось на ([%d]+).";
QG_REP_DEC = "Отношение |3-7(.*) к вам ухудшилось на ([%d]+).";
QG_XP_GAIN = "Вы получили ([%d])|4очко:очка:очков; опыта.";
QG_QUEST_COMPLETE = "Задание выполнено!";
 
-- Default filler words used in various places
QG_UNKNOWN = "Неизвестный";
QG_NONE = "Отсутствует";
 
-- Right click menu strings for Quest Log and Tracker
QG_TRACK = "Следить";
QG_UNTRACK = "Не следить";
QG_SHARE_QUEST = "Поделиться";
QG_ABANDON_QUEST = "Отменить задание";
QG_DELETE_QUEST = "Удалить задание";
 
-- Quest Start and Finish information
QG_QSTART_HEAD = "Детали о начале задания";
QG_QSTART_NPC = "Начало:";
QG_QSTART_TIME = "Начато:";
QG_QSTART_LEVEL = "Начальный уровень:";
QG_QFINISH_HEAD = "Детали о завершении задания";
QG_QFINISH_NPC = "Конец:";
QG_QFINISH_TIME = "Завершено:";
QG_QFINISH_LEVEL = "Конечный уровень:";
QG_QABANDON = "Отменен:";
 
-- Tab Text
QG_TAB_CURRENT = "Текущий";
QG_TAB_HISTORY = "История";
QG_TAB_ABANDON = "Отмененные";
QG_TAB_GUILD = "Гильдия";
QG_TAB_PARTY = "Группа";
 
-- Party Info Tooltip strings
QG_ABANDONED = "Отменённый"
QG_INCOMPLETE = "Не выполненный";
QG_ACTIVE = "Активный";
QG_ALT_STATUS_HEAD = "------------- Статус задания альта -------------";
QG_GUILD_STATUS_HEAD = "---------- Статус участников гильдии ----------";
 
-- User Interface Elements
QG_EXPAND_HEADERS = "Развернуть/Свернуть все загаловки";
QG_OPTIONS = "Настройки";
QG_SEARCH = "Поиск: ";
QG_CLEAR_ABANDON = "Очистить список отменений";
 
-- Abandon Tab Strings
QG_ABANDON_CLEAR = "Вы действительно хотите очистить список отмен?";
QG_ABANDON_DELETE = "Удалить \"%s\" из вашего журнала отмен?"; -- %s is the name of the quest
 
-- History Tab strings
QG_HISTORY_DELETE = "Удалить \"%s\" из вашего журнала истории?"; -- %s is the name of the quest
QG_HISTORY_NONE = "Нет истории задания";
QG_HISTORY_EXPGAIN = "Получено опыта: ";
QG_HISTORY_REPGAIN = "Репутация:";
 
-- History Database strings
QG_HISTORY_NOTLOADED = "База истории не загрежена";
QG_HISTORY_CLICKTOLOAD = "|cff2040ffНажмите тут чтобы загрузить базу истории.|r";
QG_HISTORY_DBLOADDESC = "Чтобы уменьшить использование памяти, база данных, которая содержит данные заданий в этом диапазоне уровней в настоящее время не загружена.";
 
-- Announcer
QG_OPT_ANNOUNCE_HEAD = "Настройки оповещений QuestGuru";
QG_OPT_ANNOUNCE_DESC = "Настройки оповещений о ваших продвижениях по заданиям.\nИзменения настроек сохраняться после нажатия на кнопку Ok.";
QG_OPT_ANNOUNCE_PROGRESS = "Сообщать о прогрессе задания";
QG_OPT_ANNOUNCE_CHANNEL_HEAD = "Каналы:";
QG_OPT_ANNOUNCE_CHANNEL_SAY = "/s";
QG_OPT_ANNOUNCE_CHANNEL_SAY_DESC = "Сказать";
QG_OPT_ANNOUNCE_CHANNEL_PARTY = "/p";
QG_OPT_ANNOUNCE_CHANNEL_PARTY_DESC = "Сообщать в вашу группу";
QG_OPT_ANNOUNCE_CHANNEL_GUILD = "/g";
QG_OPT_ANNOUNCE_CHANNEL_GUILD_DESC = "Сообщать в гильдию";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER = "/w";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_DESC = "Сообщить шепотом кому-нибудь";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_TO = "в:";
QG_OPT_ANNOUNCE_ECHO = "Эхо";
QG_OPT_ANNOUNCE_ECHO_DESC = "Отображать оповещения в окне вашего общего чата.";
QG_OPT_ANNOUNCE_MESSAGES = "Сообщение:";
QG_OPT_ANNOUNCE_HELP_DONE = "Число собранных предметов или убитых существ";
QG_OPT_ANNOUNCE_HELP_NEEDED = "Общее число требуемых предметов или существ";
QG_OPT_ANNOUNCE_HELP_NUMLEFT = "Число оставшихся предметов или существ";
QG_OPT_ANNOUNCE_HELP_NAME = "Текст задачи без #/#";
QG_OPT_ANNOUNCE_HELP_TITLE = "Название задания для данной задачи";
QG_OPT_ANNOUNCE_HELP_UITEXT = "Текст отображаемый вверху экрана";
QG_OPT_ANNOUNCE_HELP_COMPLETE = "Сообщение о завершении: \""..COMPLETE.."\"";
QG_OPT_ANNOUNCE_HELP_QLINK = "Ссылка на задание";
QG_OPT_ANNOUNCE_ITEM_MSG = "Оповещать о продвижение по задаче м предметами:";
QG_OPT_ANNOUNCE_MOB_MSG = "Оповещать о продвижение по задаче с монстрами:";
QG_OPT_ANNOUNCE_EVENT_MSG = "Оповещать о событии по продвижению по задаче:";
QG_OPT_ANNOUNCE_COMPLETE_MSG = "Оповещать о выполненном задании:";
QG_OPT_ANNOUNCE_QUESTACCEPT_MSG = "Оповещать о взятии нового задания";
--QG_ANNOUNCE_ITEM_DEFAULT = "Собрано $done $name из $needed требуемых для $questTitle";
--QG_ANNOUNCE_MOB_DEFAULT = "$done $name из $needed требуемых для $questTitle";
--QG_ANNOUNCE_QUESTACCEPT_DEFAULT = "Взято задание $qlink";
QG_ANNOUNCE_RESET = "Восcтоновить стандартные настройки оповещений.";
 
-- Options
QG_OPT_OPTIONS_DESC = "Основные настройки QuestGuru.\nИзменения настроек сохраняются мгновенно.";
QG_OPT_COLORIZE_HEAD = "Окраска";
QG_OPT_COLORIZE_PLAYER = "Имя игрока";
QG_OPT_COLORIZE_AREA = "Территория";
QG_OPT_COLORIZE_NPC = "Имя НИПа";
QG_OPT_LEVELS_HEAD = "Показ уровни";
QG_OPT_LEVELS_QUESTLOG = "В журнале заданий";
QG_OPT_LEVELS_HISTORY = "В журнале истории";
QG_OPT_LEVELS_ABANDON = "В журнале отмен";
QG_OPT_TOOLTIP_TEXT = "Тект в подсказках предметов и монстров";
QG_OPT_AUTOCOMPLETE = "Авто-сдавать задания";
QG_OPT_ALT_STATUS = "Статус заданий альта в подсказке группы";
QG_OPT_GUILD_STATUS = "Статус согульдчан в подсказке группы";
QG_OPT_GUILD_SIMPLE = "Обычное отображение согульдчан";
QG_OPT_OBJ_ICON = "Показ в журнале иконку требуемого предмета";
QG_OPT_WORLDMAP_ICON = "Показ на карте нипов давших задание";
QG_OPT_HEADER_QUEST_NUM = "Показ количевства заданий в загаловке";
QG_OPT_DISABLE_COMM = "Отключить все коммуникации addon < - > addon";
 
QG_OPT_SOUND_HEAD = "Настройки звуков";
QG_OPT_SOUND_DESC = "Используйте панели для смены проигрываемого звука в ходе выполнения задания.";
QG_OPT_SOUND_ENABLE = "Включить дополнительные звуки";
QG_OPT_SOUND_OBJ = "Проиграть звук во время выполнения требований:";
QG_OPT_SOUND_OBJ_DONE = "Проиграть звук после выполнения требования:";
QG_SOUND_QUEST_DONE = "Проиграть звук после выполнения задания:";
 
-- Other strings that may or may not need localizing
QG_ITEM_REQ_STR = "(.*):%s*([%d]+)%s*/%s*([%d]+)"; -- The format of the line when an item is required for a quest, an invalid format can cause many errors
QG_DATETIME = "%m/%d/%Y %H:%M:%S"; -- The format that date/time values are stored and displayed for start/finish info
end
trunk/localization.FR.lua New file
0,0 → 1,197
------------------------------------
-- QuestGuru French Localization --
------------------------------------
 
-- À \195\128
-- Á \195\129
-- Â \195\130
-- Ä \195\132
-- È \195\136
-- É \195\137
-- Ê \195\138
-- Ë \195\139
-- Î \195\142
-- Ï \195\143
-- Ô \195\148
-- Ö \195\150
-- Û \195\155
-- Ü \195\156
-- à \195\160
-- á \195\161
-- â \195\162
-- ä \195\164
-- è \195\168
-- é \195\169
-- ê \195\170
-- ë \195\171
-- î \195\174
-- ï \195\175
-- ô \195\180
-- ö \195\182
-- û \195\187
-- ü \195\188
-- 'Π\39\197\146
--
 
if (GetLocale() == "frFR") then
QG_REP_GAIN = "R\195\169putation aupr\195\168s de (.*) augment\195\169e de ([%d]+).";
QG_REP_DEC = "R\195\169putation aupr\195\168s de (.*) diminu\195\169e de ([%d]+).";
QG_XP_GAIN = "Vous gagnez ([%d]+) points d'exp\195\169rience.";
QG_QUEST_COMPLETE = "Qu\195\170te termin\195\169e !";
 
-- Default filler words used in various places
QG_UNKNOWN = "Inconnu";
QG_NONE = "Aucun";
 
-- Right click menu strings for Quest Log and Tracker
QG_TRACK = "Suivre";
QG_UNTRACK = "Ne pas suivre";
QG_SHARE_QUEST = "Partager la qu\195\170te";
QG_ABANDON_QUEST = "Abandonner la qu\195\170te";
QG_DELETE_QUEST = "Supprimer la qu\195\170te";
 
-- Quest Start and Finish information
QG_QSTART_HEAD = "D\195\169tails du d\195\169but de qu\195\170te";
QG_QSTART_NPC = "Lanc\195\169e par :";
QG_QSTART_TIME = "Le :";
QG_QSTART_LEVEL = "Au niveau :";
QG_QFINISH_HEAD = "D\195\169tails de fin de qu\195\170te";
QG_QFINISH_NPC = "Finie par :";
QG_QFINISH_TIME = "A :";
QG_QFINISH_LEVEL = "Au niveau :";
QG_QABANDON = "Abandonn\195\169e:";
 
-- Tab Text
QG_TAB_CURRENT = "En cours";
QG_TAB_HISTORY = "Historique";
QG_TAB_ABANDON = "Abandon\195\169es";
QG_TAB_GUILD = "Guilde";
QG_TAB_PARTY = "Groupe";
 
-- Party Info Tooltip strings
QG_ABANDONED = "Abandonn\195\169e";
QG_INCOMPLETE = "Incompl\195\168te";
QG_ACTIVE = "Active";
QG_ALT_STATUS_HEAD = "------------- Vos autres personnages ----------";
QG_GUILD_STATUS_HEAD = "-------- Les membres de votre Guilde ---------";
 
-- User Interface Elements
QG_EXPAND_HEADERS = "Ouvrir/fermer tout";
QG_OPTIONS = "Options";
QG_SEARCH = "Rech. : ";
QG_CLEAR_ABANDON = "Effacer la liste";
 
-- Abandon Tab Strings
QG_ABANDON_CLEAR = "Voulez-vous effacer la liste ?";
QG_ABANDON_DELETE = "Effacer \"%s\" du journal d'abandon ?"; -- %s est le nom de la quete
 
-- History Tab strings
QG_HISTORY_DELETE = "Effacer \"%s\" de l'historique ?"; -- %s est le nom de la quete
QG_HISTORY_NONE = "Pas de qu\195\170te dans l'historique";
QG_HISTORY_EXPGAIN = "Exp\195\169rience gagn\195\169e :";
QG_HISTORY_REPGAIN = "R\195\169putation :";
 
-- Announcer
QG_OPT_ANNOUNCE_HEAD = "Options d'annonce";
QG_OPT_ANNOUNCE_DESC = "Evitez les annonces publiques si vous ne voulez pas vous faire ignorer !\nLes modifications sont enregistr\195\169es lors du clic sur OK.";
QG_OPT_ANNOUNCE_PROGRESS = "Annoncer la progression";
QG_OPT_ANNOUNCE_CHANNEL_HEAD = "Canaux :";
QG_OPT_ANNOUNCE_CHANNEL_SAY = "/s";
QG_OPT_ANNOUNCE_CHANNEL_SAY_DESC = "Annoncer \195\160 ceux qui vous entourent";
QG_OPT_ANNOUNCE_CHANNEL_PARTY = "/p";
QG_OPT_ANNOUNCE_CHANNEL_PARTY_DESC = "Annoncer au groupe";
QG_OPT_ANNOUNCE_CHANNEL_GUILD = "/g";
QG_OPT_ANNOUNCE_CHANNEL_GUILD_DESC = "Annoncer \195\160 votre guilde";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER = "/w";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_DESC = "Annoncer \195\160 un ami";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_TO = "A :";
QG_OPT_ANNOUNCE_ECHO = "Discussion";
QG_OPT_ANNOUNCE_ECHO_DESC = "Afficher votre progression sur la fen\195\169tre de discussion (conseill\195\169).";
QG_OPT_ANNOUNCE_MESSAGES = "Messages :";
QG_OPT_ANNOUNCE_HELP_DONE = "Nombre d'objets collect\195\169s ou de mobs tu\195\169s";
QG_OPT_ANNOUNCE_HELP_NEEDED = "Nombre total d'objets ou de mobs n\195\169c\195\169ssaires";
QG_OPT_ANNOUNCE_HELP_NUMLEFT = "Nombre d'objets restants";
QG_OPT_ANNOUNCE_HELP_NAME = "Texte d'objectif (sans #/#)";
QG_OPT_ANNOUNCE_HELP_TITLE = "Nom de la qu\195\170te pour cet objectif";
QG_OPT_ANNOUNCE_HELP_UITEXT = "Le texte affich\195\169 sur l'\195\169cran";
QG_OPT_ANNOUNCE_HELP_COMPLETE = "Message \""..COMPLETE.."\"";
QG_OPT_ANNOUNCE_HELP_QLINK = "Lien de la qu\195\170te concern\195\169e";
QG_OPT_ANNOUNCE_ITEM_MSG = "Message pour la progression d'objectifs (objets) :";
QG_OPT_ANNOUNCE_MOB_MSG = "Message pour la progression d'objectifs (mobs) :";
QG_OPT_ANNOUNCE_EVENT_MSG = "Message pour la progression d'objectifs (event) :";
QG_OPT_ANNOUNCE_COMPLETE_MSG = "Message pour la fin de qu\195\170te :";
QG_ANNOUNCE_ITEM_DEFAULT = "$done $name sur $needed collect\195\169(s) pour la qu\195\170te $questTitle";
QG_ANNOUNCE_MOB_DEFAULT = "$done $name sur $needed n\195\169c\195\169ssaires pour la qu\195\170te $questTitle";
QG_ANNOUNCE_RESET = "Restaurer les param\195\169tres par d\195\169faut.";
 
-- Tracker
QG_TRACKER_SHOW = "Afficher le suivi";
QG_TRACKER_MINIMIZE = "R\195\169duire";
QG_TRACKER_OPTIONS = "Options";
 
-- Options
QG_OPT_OPTIONS_DESC = "Param\195\169tres g\195\169n\195\169raux de QuestGuru. Les modifications sont prises en compte imm\195\169diatement.";
QG_OPT_COLORIZE_HEAD = "Couleurs";
QG_OPT_COLORIZE_PLAYER = "Joueurs";
QG_OPT_COLORIZE_AREA = "Zones";
QG_OPT_COLORIZE_NPC = "PNJ";
QG_OPT_LEVELS_HEAD = "Afficher les niveaux";
QG_OPT_LEVELS_QUESTLOG = "Dans le journal de qu\195\170te";
QG_OPT_LEVELS_HISTORY = "Dans l'historique";
QG_OPT_LEVELS_ABANDON = "Dans le journal d'abandon";
QG_OPT_TOOLTIP_TEXT = "Afficher le texte dans les infobulles des objets/mobs";
QG_OPT_AUTOCOMPLETE = "Terminer automatiquement les qu\195\170tes";
QG_OPT_ALT_STATUS = "Afficher vos autres personnages dans l'infobulle";
QG_OPT_GUILD_STATUS = "Afficher les membres de votre guilde dans l'infobulle";
QG_OPT_GUILD_SIMPLE = "Affichage simple des membres de guilde";
QG_OPT_OBJ_ICON = "Afficher les ic\195\180nes des objets dans le journal";
QG_OPT_WORLDMAP_ICON = "Afficher les donneurs de qu\195\170tes sur la carte du monde";
QG_OPT_HEADER_QUEST_NUM = "Montrer le nombre de qu\195\170tes dans les ent\195\170tes";
QG_OPT_DISABLE_COMM = "Emp\195\170cher QG de communiquer avec les autres joueurs";
 
QG_OPT_TRACKER_DESC = "Faites-vous un superbe Tracker avec plein de couleurs !\nLes modifications sont appliqu\195\169es imm\195\169diatement.";
QG_OPT_TRACKER_USE = "Suivre les qu\195\170tes avec QG";
QG_OPT_TRACKER_USE_DESC = "D\195\169cocher cette option pour utiliser le Tracker original du jeu.";
QG_OPT_TRACKER_BORDER = "Afficher la bordure";
QG_OPT_TRACKER_BORDER_DESC = "Afficher ou non une bordure autour de la fen\195\170tre de suivi.";
QG_OPT_TRACKER_CLICKTHROUGH = "Fixer la fen\195\170tre";
QG_OPT_TRACKER_CLICKTHROUGH_DESC = "Cette option activ\195\169e, vous ne pouvez plus d\195\169placer la fen\195\170tre.";
QG_OPT_TRACKER_HEADERS = "Afficher les ent\195\170tes";
QG_OPT_TRACKER_HEADERS_DESC = "Affiche les ent\195\170tes des zones/cat\195\169gories des qu\195\170tes";
QG_OPT_TRACKER_LEVELS = "Afficher les niveaux";
QG_OPT_TRACKER_LEVELS_DESC = "Affiche les informations sur le niveau n\195\169c\195\169ssaire pour faire les qu\195\170tes.";
QG_OPT_TRACKER_QUEST_TOOLTIPS = "Afficher les infobulles";
QG_OPT_TRACKER_QUEST_TOOLTIPS_DESC = "Ouvre une infobulle avec plein d'infos sur la qu\195\170te survol\195\169e. Ne fonctionne pas si le Tracker est fix\195\169 !";
QG_OPT_TRACKER_PARTY_TOOLTIPS = "Infobulles de groupe";
QG_OPT_TRACKER_PARTY_TOOLTIPS_DESC = "Ouvre une infobulle avec plein d'infos concernant le groupe/la guilde sur la qu\195\170te survol\195\169e.\nNe fonctionne pas si le tracker est fix\195\169 !";
QG_OPT_TRACKER_PERCENT = "Afficher les pourcentages";
QG_OPT_TRACKER_PERCENT_DESC = "Affiche le pourcentage de r\195\169alisation des qu\195\170tes.";
QG_OPT_TRACKER_ANCHOR_BOTTOM = "Etirer vers le haut";
QG_OPT_TRACKER_ANCHOR_BOTTOM_DESC = "La fen\195\170tre de suivi grandit vers le haut (pratique pour la fixer en bas de l'\195\169cran)";
QG_OPT_TRACKER_AUTOTRACK = "Suivi auto. des qu\195\170tes";
QG_OPT_TRACKER_AUTOTRACK_DESC = "Ajoute automatiquement les nouvelles qu\195\170tes \195\160 la fen\195\170tre de suivi.";
QG_OPT_TRACKER_AUTOUNTRACK = "Masquer les qu\195\170tes termin\195\169es";
QG_OPT_TRACKER_AUTOUNTRACK_DESC = "D\195\169sactive automatiquement le suivi des qu\195\170tes termin\195\169es.";
QG_OPT_TRACKER_COMPLETE_OBJ = "Objectifs termin\195\169s";
QG_OPT_TRACKER_COMPLETE_OBJ_DESC = "D\195\169cocher la case pour masquer les objectifs termin\195\169s.";
QG_OPT_TRACKER_COLOR_OBJ = "Couleurs";
QG_OPT_TRACKER_COLOR_OBJ_DESC = "Utiliser les couleurs ci-dessous pour identifier l'\195\169tat des qu\195\170tes :";
QG_OPT_TRACKER_OBJ_COLOR_0 = "Couleur quand l'objectif est atteint \195\160 0%";
QG_OPT_TRACKER_OBJ_COLOR_99 = "Couleur quand l'objectif est atteint \195\160 99%";
QG_OPT_TRACKER_OBJ_COLOR_COMPLETE = "Couleur quand l'objectif est termin\195\169";
QG_OPT_TRACKER_SIZE = "Taille de la fen\195\170tre";
QG_OPT_TRACKER_MAX_LINES = "Lignes maximum :";
QG_OPT_TRACKER_ALPHA = "Transparence";
QG_OPT_TRACKER_BULLET = "Symbole affich\195\169 devant les objectifs :";
 
QG_OPT_SOUND_HEAD = "Sons";
QG_OPT_SOUND_DESC = "Vous pouvez modifier les sons jou\195\169s lors de la progression des qu\195\170tes.\nLes modifications sont prises en compte imm\195\169diatement.";
QG_OPT_SOUND_ENABLE = "Activer les sons";
QG_OPT_SOUND_OBJ = "Pour la progression d'un objectif :";
QG_OPT_SOUND_OBJ_DONE = "Pour la fin d'un objectif :";
QG_SOUND_QUEST_DONE = "Pour la fin d'une qu\195\170te :";
 
-- Other strings that may or may not need localizing
QG_ITEM_REQ_STR = "(.*):%s*([%d]+)%s*/%s*([%d]+)"; -- The format of the line when an item is required for a quest, an invalid format can cause many errors
QG_DATETIME = "%d/%m/%Y %H:%M:%S"; -- Format des dates utilise dans les infos des quetes
end
trunk/localization.DE.lua New file
0,0 → 1,164
------------------------------------
-- QuestGuru German Localization --
------------------------------------
 
if (GetLocale() == "deDE") then
QG_REP_GAIN = "Euer Ruf bei der Fraktion '(.*)' hat sich um ([%d]+) verbessert.";
QG_REP_DEC = "Euer Ruf bei der Fraktion '(.*)' hat sich um ([%d]+) verschlechtert.";
QG_XP_GAIN = "Ihr bekommt ([%d]+) Erfahrung.";
QG_QUEST_COMPLETE = "Quest fertig!";
 
-- Default filler words used in various places
QG_UNKNOWN = "Unbekannt";
QG_NONE = "Nichts";
 
-- Right click menu strings for Quest Log and Tracker
QG_TRACK = "Beobachten";
QG_UNTRACK = "Nicht beobachten";
QG_SHARE_QUEST = "Quest teilen";
QG_ABANDON_QUEST = "Quest abbrechen";
QG_DELETE_QUEST = "Quest l\195\182schen";
 
-- Quest Start and Finish information
QG_QSTART_HEAD = "Queststart Details";
QG_QSTART_NPC = "Gestartet von:";
QG_QSTART_TIME = "Startzeit:";
QG_QSTART_LEVEL = "Startstufe:";
QG_QFINISH_HEAD = "Questabgabe Details";
QG_QFINISH_NPC = "Abgegeben bei:";
QG_QFINISH_TIME = "Abgabezeit:";
QG_QFINISH_LEVEL = "Abgabestufe:";
QG_QABANDON = "Abgebrochen:";
 
-- Tab Text
QG_TAB_CURRENT = "Aktuell";
QG_TAB_HISTORY = "Historie";
QG_TAB_ABANDON = "Abgebrochen";
QG_TAB_GUILD = "Gilde";
QG_TAB_PARTY = "Gruppe";
 
-- Party Info Tooltip strings
QG_COMPLETE = "Fertig";
QG_ABANDONED = "Abgebrochen";
QG_INCOMPLETE = "Nicht fertig";
QG_ACTIVE = "Aktiv";
QG_ALT_STATUS_HEAD = "------------- Status eigener Charaktere -------------";
QG_GUILD_STATUS_HEAD = "---------- Gildenmitglieder Status ----------";
 
-- User Interface Elements
QG_EXPAND_HEADERS = "Alle Bereiche ein-/ausklappen";
QG_OPTIONS = "Optionen";
QG_SEARCH = "Suchen: ";
QG_CLEAR_ABANDON = "Abgebrochen-Liste l\195\182schen";
 
-- Abandon Tab Strings
QG_ABANDON_CLEAR = "Wollen Sie die Liste l\195\182schen?";
QG_ABANDON_DELETE = "\"%s\" aus der Liste l\195\182schen?"; -- %s is the name of the quest
 
-- History Tab strings
QG_HISTORY_DELETE = "\"%s\" aus der Historie l\195\182schen?"; -- %s is the name of the quest
QG_HISTORY_NONE = "Keine Quest Historie";
QG_HISTORY_EXPGAIN = "Erfahrung erhalten: ";
QG_HISTORY_REPGAIN = "Ruf:";
 
-- Announcer
QG_OPT_ANNOUNCE_HEAD = "QuestGuru Announcer Optionen";
QG_OPT_ANNOUNCE_DESC = "Benutzen Sie diese Optionen, um Ihren Questfortschritt anderen mitzuteilen.\n\195\132nderungen werden beim Klick auf OK gespeichert.";
QG_OPT_ANNOUNCE_PROGRESS = "Questfortschritt mitteilen";
QG_OPT_ANNOUNCE_CHANNEL_HEAD = "Kan\195\164le:";
QG_OPT_ANNOUNCE_CHANNEL_SAY = "/s";
QG_OPT_ANNOUNCE_CHANNEL_SAY_DESC = "Questfortschritt in \"Say\" mitteilen";
QG_OPT_ANNOUNCE_CHANNEL_PARTY = "/p";
QG_OPT_ANNOUNCE_CHANNEL_PARTY_DESC = "Questfortschritt der Gruppe mitteilen";
QG_OPT_ANNOUNCE_CHANNEL_GUILD = "/g";
QG_OPT_ANNOUNCE_CHANNEL_GUILD_DESC = "Questfortschritt der Gilde mitteilen";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER = "/w";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_DESC = "Questfortschritt jemandem zufl\195\188stern";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_TO = "an:";
QG_OPT_ANNOUNCE_ECHO = "Echo";
QG_OPT_ANNOUNCE_ECHO_DESC = "Fortschritt im allgemeinen Chatfenster anzeigen.";
QG_OPT_ANNOUNCE_MESSAGES = "Nachrichten:";
QG_OPT_ANNOUNCE_HELP_DONE = "Anzahl gesammelter Gegenst\195\164nde oder get\195\182teter Monster";
QG_OPT_ANNOUNCE_HELP_NEEDED = "Gesamtzahl ben\195\182tigter Gegens\195\164tnde oder Monster";
QG_OPT_ANNOUNCE_HELP_NUMLEFT = "Anzahl noch ben\195\182tigter Gegenst\195\164nde oder Monster";
QG_OPT_ANNOUNCE_HELP_NAME = "Zieltext ohne #/#";
QG_OPT_ANNOUNCE_HELP_TITLE = "Name der Quest f\195\188r dieses Ziel";
QG_OPT_ANNOUNCE_HELP_UITEXT = "The text that showed up onscreen";
QG_OPT_ANNOUNCE_HELP_COMPLETE = "\195\156bersetzte Fertigmeldung: \""..COMPLETE.."\"";
QG_OPT_ANNOUNCE_HELP_QLINK = "Der Questlink der betroffenen Quest";
QG_OPT_ANNOUNCE_ITEM_MSG = "Fortschritt bei Genst\195\164nden mit dieser Nachricht mitteilen:";
QG_OPT_ANNOUNCE_MOB_MSG = "Fortschritt bei Monstern mit dieser Nachricht mitteilen:";
QG_OPT_ANNOUNCE_EVENT_MSG = "Fortschritt bei Ereignissen mit dieser Nachricht mitteilen:";
QG_OPT_ANNOUNCE_COMPLETE_MSG = "Quest Fertigstellung mit dieser Nachticht mitteilen:";
QG_ANNOUNCE_ITEM_DEFAULT = "$done $name von $needed ben\195\182tigten f\195\188r $questTitle gesammelt";
QG_ANNOUNCE_MOB_DEFAULT = "$done $name von $needed ben\195\182tigten f\195\188r $questTitle";
QG_ANNOUNCE_RESET = "Announcer Optionen werden zur\195\188ckgesetzt.";
 
-- Tracker
QG_TRACKER_SHOW = "Tracker anzeigen";
QG_TRACKER_MINIMIZE = "Tracker minimieren";
QG_TRACKER_OPTIONS = "Trackeroptionen";
 
-- Options
QG_OPT_OPTIONS_DESC = "Die sind die allgemeinen Einstellungen von QuestGuru.\n\195\132nderungen werden sofort gespeichert.";
QG_OPT_COLORIZE_HEAD = "Einf\195\164rben";
QG_OPT_COLORIZE_PLAYER = "Spielername";
QG_OPT_COLORIZE_AREA = "Gebiete";
QG_OPT_COLORIZE_NPC = "NPC Namen";
QG_OPT_LEVELS_HEAD = "Stufen anzeigen";
QG_OPT_LEVELS_QUESTLOG = "Im Questlog";
QG_OPT_LEVELS_HISTORY = "In der Historie";
QG_OPT_LEVELS_ABANDON = "In der Abgebrochen-Liste";
QG_OPT_TOOLTIP_TEXT = "Zeige Text in Gegenstand- und Monstertooltips";
QG_OPT_AUTOCOMPLETE = "Quests automatisch einl\195\182sen";
QG_OPT_ALT_STATUS = "Zeige Queststatus eigener Charaktere im Tooltip";
QG_OPT_GUILD_STATUS = "Zeige Queststatus von Gildenmitgliedern im Tooltip";
QG_OPT_GUILD_SIMPLE = "Einfache Gildenmitgliederanzeige";
QG_OPT_OBJ_ICON = "Zeige Gegenstandicons im Questlog";
QG_OPT_DISABLE_COMM = "gesamte addon-zu-addon Kommunikation abschalten";
 
QG_OPT_TRACKER_DESC = "Diese Optionen \195\164ndern das Aussehen des QuestGuru Trackers.\n\195\132nderungen werden sofort gespeichert.";
QG_OPT_TRACKER_USE = "QuestGuru Tracker verwenden";
QG_OPT_TRACKER_USE_DESC = "Deaktivieren Sie diese Option, um den Standardtracker oder andere Tracker Addons zu verwenden";
QG_OPT_TRACKER_BORDER = "Rahmen anzeigen";
QG_OPT_TRACKER_BORDER_DESC = "Aktivieren Sie diese Option, um einen d\195\188nnen Rahmen um den Tracker anzuzeigen";
QG_OPT_TRACKER_CLICKTHROUGH = "Durch den Tracker klicken";
QG_OPT_TRACKER_CLICKTHROUGH_DESC = "Aktivieren Sie diese Option, um den Tracker nicht anklickbar zu machen";
QG_OPT_TRACKER_HEADERS = "\195\156berschriften anzeigen";
QG_OPT_TRACKER_HEADERS_DESC = "Aktivieren Sie diese Option, um Zonen\195\188berschriften im Tracker anzuzeigen";
QG_OPT_TRACKER_LEVELS = "Queststufen anzeigen";
QG_OPT_TRACKER_LEVELS_DESC = "Aktivieren Sie diese Option, um die Queststufen im Tracker anzuzeigen";
QG_OPT_TRACKER_QUEST_TOOLTIPS = "Quest Tooltips anzeigen";
QG_OPT_TRACKER_QUEST_TOOLTIPS_DESC = "Aktivieren Sie diese Option, um einen Tooltip mit Informationen anzuzeigen, wenn Sie mit dem Mauszeiger \195\188ber Questnamen oder Ziele fahren";
QG_OPT_TRACKER_PARTY_TOOLTIPS = "Gruppen Tooltips anzeigen";
QG_OPT_TRACKER_PARTY_TOOLTIPS_DESC = "Aktivieren Sie diese Option, um den Tooltip f\195\188r Gruppen-, Gilden und Zweitcharakterinformationen anzuzeigen, wenn Sie mit dem Mauszeiger \195\188ber Questnamen fahren";
QG_OPT_TRACKER_PERCENT = "Quest Prozentwert anzeigen";
QG_OPT_TRACKER_PERCENT_DESC = "Aktivieren Sie diese Option, um den Fortschrittsprozentwert neben dem Questnamen im Tracker anzuzeigen";
QG_OPT_TRACKER_ANCHOR_BOTTOM = "Unten verankern";
QG_OPT_TRACKER_ANCHOR_BOTTOM_DESC = "Verankert den unteren Rand des Trackers, um ihn nach oben zu vergr\195\182\195\159ern.";
QG_OPT_TRACKER_AUTOTRACK = "Neue Q's automatisch beobachten";
QG_OPT_TRACKER_AUTOTRACK_DESC = "Aktivieren Sie diese Option, um neue Quests automatisch zum Tracker hinzuzuf\195\188gen";
QG_OPT_TRACKER_AUTOUNTRACK = "Fertige Q's nicht beobachten";
QG_OPT_TRACKER_AUTOUNTRACK_DESC = "Nach abschlie\195\159en aller Questziele Quest automtisch aus dem Tracker entfernen";
QG_OPT_TRACKER_COMPLETE_OBJ = "Vollendete Ziele anzeigen";
QG_OPT_TRACKER_COMPLETE_OBJ_DESC = "Deaktivieren Sie diese Option, um vollendete Questziele nicht im Tracker anzuzeigen";
QG_OPT_TRACKER_COLOR_OBJ = "Ziele nach Fortschritt einf\195\164rben";
QG_OPT_TRACKER_COLOR_OBJ_DESC = "Aktivieren Sie diese Option, um Questziele nach dem Fortschritt mit den folgenden Farben einzuf\195\164rben";
QG_OPT_TRACKER_OBJ_COLOR_0 = "Farbe f\195\188r zu 0% vollendete Ziele";
QG_OPT_TRACKER_OBJ_COLOR_99 = "Farbe f\195\188r zu 99% vollendete Ziele";
QG_OPT_TRACKER_OBJ_COLOR_COMPLETE = "Farbe f\195\188r vollendete Ziele";
QG_OPT_TRACKER_SIZE = "Trackergr\195\182\195\159e";
QG_OPT_TRACKER_MAX_LINES = "Max. Trackerzeilen:";
QG_OPT_TRACKER_ALPHA = "Hintergrund-Alpha";
 
QG_OPT_SOUND_HEAD = "Klangoptionen";
QG_OPT_SOUND_DESC = "Benutzen Sie diese Optionen, um die Kl\195\164nge zu \195\164ndern, die beim Questfortschritt abgespielt werden.\n\195\132nderungen werden sofort gespeichert.";
QG_OPT_SOUND_ENABLE = "Zus\195\164tzliche Kl\195\164nge aktivieren";
QG_OPT_SOUND_OBJ = "Klang beim Zielfortschritt abspielen:";
QG_OPT_SOUND_OBJ_DONE = "Klang beim abschlie\195\159en eines Questziels abspielen:";
QG_SOUND_QUEST_DONE = "Klang beim Fertigstellen einer Quest abspielen:";
 
-- Other strings that may or may not need localizing
QG_ITEM_REQ_STR = "(.*):%s*([%d]+)%s*/%s*([%d]+)"; -- The format of the line when an item is required for a quest, an invalid format can cause many errors
QG_DATETIME = "%d/%m/%Y %H:%M:%S"; -- The format that date/time values are stored and displayed for start/finish info
end
\ No newline at end of file
trunk/QuestGuruComm.lua New file
0,0 → 1,458
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 ((GetNumPartyMembers() > 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 (GetNumPartyMembers() > 0)) then
QuestGuru_CommSendMessage("PARTY", "0001", QUESTGURU_VERSION);
QuestGuru_SendCurrentQuestStatus(true, "PARTY");
end
QuestGuru_CommLastPartyNum = GetNumPartyMembers();
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
\ No newline at end of file
trunk/QuestGuruOptions.lua New file
0,0 → 1,374
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"};
 
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
\ No newline at end of file
trunk/QuestGuru_Templates.xml New file
0,0 → 1,159
<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>
\ No newline at end of file
trunk/localization.TW.lua New file
0,0 → 1,136
-------------------------------------------------------------------------------
-- QuestGuru Chinese Localization(zhTW) By Silver Fox, fixed/updated By Player Lin --
-------------------------------------------------------------------------------
 
if (GetLocale() == "zhTW") then
 
QG_REP_GAIN = "陣營 (.*) 的聲望增加了 ([%d]+).";
QG_REP_DEC = "陣營 (.*) 的聲望降低了 ([%d]+).";
QG_XP_GAIN = "你獲得 ([%d]+) 經驗值.";
QG_QUEST_COMPLETE = "任務完成!";
 
-- Default filler words used in various places
QG_UNKNOWN = "未知";
QG_NONE = "沒有";
 
-- Right click menu strings for Quest Log and Tracker
QG_TRACK = "加入追蹤";
QG_UNTRACK = "取消追蹤";
QG_SHARE_QUEST = "分享任務";
QG_ABANDON_QUEST = "放棄任務";
QG_DELETE_QUEST = "刪除任務";
 
-- Quest Start and Finish information
QG_QSTART_HEAD = "任務開始詳細說明";
QG_QSTART_NPC = "開始目標:";
QG_QSTART_TIME = "開始時間:";
QG_QSTART_LEVEL = "開始等級:";
QG_QFINISH_HEAD = "任務完成詳細說明";
QG_QFINISH_NPC = "結束目標:";
QG_QFINISH_TIME = "結束時間:";
QG_QFINISH_LEVEL = "結束等級:";
QG_QABANDON = "放棄時間:";
 
-- Tab Text
QG_TAB_CURRENT = "目前任務";
QG_TAB_HISTORY = "歷史任務";
QG_TAB_ABANDON = "放棄任務";
QG_TAB_GUILD = "公會任務";
QG_TAB_PARTY = "隊伍任務";
 
-- Party Info Tooltip strings
QG_ABANDONED = "放棄"
QG_INCOMPLETE = "未完";
QG_ACTIVE = "進行";
QG_ALT_STATUS_HEAD = "------------- 分身角色任務狀況 -------------";
QG_GUILD_STATUS_HEAD = "------------- 公會成員任務狀況 -------------";
 
-- User Interface Elements
QG_EXPAND_HEADERS = "收起/展開所有標題";
QG_OPTIONS = "選項";
QG_SEARCH = "搜尋: ";
QG_CLEAR_ABANDON = "清除放棄任務列表";
 
-- Abandon Tab Strings
QG_ABANDON_CLEAR = "您確定要清除放棄任務列表嗎?";
QG_ABANDON_DELETE = "將任務 \"%s\" 從放棄任務列表清除嗎?"; -- %s is the name of the quest
 
-- History Tab strings
QG_HISTORY_DELETE = "將任務 \"%s\" 從歷史任務列表清除嗎?"; -- %s is the name of the quest
QG_HISTORY_NONE = "沒有任何歷史任務";
QG_HISTORY_EXPGAIN = "獲得經驗值: ";
QG_HISTORY_REPGAIN = "獲得聲望:";
 
-- History Database strings
QG_HISTORY_NOTLOADED = "歷史任務資料厙沒有載入";
QG_HISTORY_CLICKTOLOAD = "|cff2040ff點擊載入歷史任務資料庫.|r";
QG_HISTORY_DBLOADDESC = "為了減少記憶體使用量,資料庫包含這任務等級範圍資料未即時載入.";
 
 
-- Announcer
QG_OPT_ANNOUNCE_HEAD = "QuestGuru Announcer 選項";
QG_OPT_ANNOUNCE_DESC = "這些選項可以改變廣播的設定.";
QG_OPT_ANNOUNCE_PROGRESS = "廣播任務的進行狀況";
QG_OPT_ANNOUNCE_CHANNEL_HEAD = "使用頻道:";
QG_OPT_ANNOUNCE_CHANNEL_SAY = "/s";
QG_OPT_ANNOUNCE_CHANNEL_SAY_DESC = "在 說 頻道中廣播";
QG_OPT_ANNOUNCE_CHANNEL_PARTY = "/p";
QG_OPT_ANNOUNCE_CHANNEL_PARTY_DESC = "在 隊伍聊天 頻道中廣播";
QG_OPT_ANNOUNCE_CHANNEL_GUILD = "/g";
QG_OPT_ANNOUNCE_CHANNEL_GUILD_DESC = "在 公會聊天 頻道中廣播";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER = "/w";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_DESC = "在 悄悄話 頻道中廣播";
QG_OPT_ANNOUNCE_CHANNEL_WHISPER_TO = "誰:";
QG_OPT_ANNOUNCE_ECHO = "對話視窗提示";
QG_OPT_ANNOUNCE_ECHO_DESC = "在你的對話視窗中顯示廣播內容.";
QG_OPT_ANNOUNCE_MESSAGES = "顯示訊息:";
QG_OPT_ANNOUNCE_HELP_DONE = "目前收集的物品或是需要殺死的怪物數量";
QG_OPT_ANNOUNCE_HELP_NEEDED = "需要收集的物品或是需要殺死的怪物數量";
QG_OPT_ANNOUNCE_HELP_NUMLEFT = "尚需收集的物品或是需要殺死的怪物數量";
QG_OPT_ANNOUNCE_HELP_NAME = "物件名稱";
QG_OPT_ANNOUNCE_HELP_TITLE = "任務名稱";
QG_OPT_ANNOUNCE_HELP_UITEXT = "顯示在螢幕上的文字";
QG_OPT_ANNOUNCE_HELP_COMPLETE = "中文化的任務完成訊息: \""..COMPLETE.."\"";
QG_OPT_ANNOUNCE_HELP_QLINK = "受到影響的任務連結";
QG_OPT_ANNOUNCE_ITEM_MSG = "廣播收集物品進度時使用這個訊息:";
QG_OPT_ANNOUNCE_MOB_MSG = "廣播殺死怪物進度時使用這個訊息:";
QG_OPT_ANNOUNCE_EVENT_MSG = "廣播事件完成進度時使用這個訊息:";
QG_OPT_ANNOUNCE_COMPLETE_MSG = "廣播任務完成時使用這個訊息:";
QG_OPT_ANNOUNCE_QUESTACCEPT_MSG = "廣播接受新任務";
QG_ANNOUNCE_ITEM_DEFAULT = "$questTitle 需要收集物品-$name:$done/$needed.";
QG_ANNOUNCE_MOB_DEFAULT = "$questTitle 需要殺死生物-$name:$done/$needed.";
QG_ANNOUNCE_QUESTACCEPT_DEFAULT = "$qlink 任務已接受.";
QG_ANNOUNCE_RESET = "恢復所有關於廣播的設定為預設值.";
 
-- Options
QG_OPT_OPTIONS_DESC = "這些選項可以改變基本的設定.";
QG_OPT_COLORIZE_HEAD = "設定顏色";
QG_OPT_COLORIZE_PLAYER = "玩家姓名";
QG_OPT_COLORIZE_AREA = "區域名稱";
QG_OPT_COLORIZE_NPC = "NPC 姓名";
QG_OPT_LEVELS_HEAD = "顯示等級";
QG_OPT_LEVELS_QUESTLOG = "目前任務列表中";
QG_OPT_LEVELS_HISTORY = "歷史任務列表中";
QG_OPT_LEVELS_ABANDON = "放棄任務列表中";
QG_OPT_TOOLTIP_TEXT = "在物品和怪物提示訊息中顯示";
QG_OPT_AUTOCOMPLETE = "自動回覆已完成的任務";
QG_OPT_ALT_STATUS = "顯示分身角色任務狀況";
QG_OPT_GUILD_STATUS = "顯示公會成員任務狀況";
QG_OPT_GUILD_SIMPLE = "簡易公會成員顯示";
QG_OPT_OBJ_ICON = "在記錄中顯示物品圖示";
QG_OPT_WORLDMAP_ICON = "在世界地圖中顯示任務提供者的圖示";
QG_OPT_HEADER_QUEST_NUM = "在區域標題顯示任務數量";
QG_OPT_DISABLE_COMM = "關閉所有插件與插件間的通訊";
 
QG_OPT_SOUND_HEAD = "音效選項";
QG_OPT_SOUND_DESC = "這些選項可以改變音效的設定.";
QG_OPT_SOUND_ENABLE = "開啟額外的音效功能";
QG_OPT_SOUND_OBJ = "任務項目進行中的音效:";
QG_OPT_SOUND_OBJ_DONE = "任務項目已完成的音效:";
QG_SOUND_QUEST_DONE = "任務全部完成時的音效:";
 
-- Other strings that may or may not need localizing
QG_ITEM_REQ_STR = "(.*):%s*([%d]+)%s*/%s*([%d]+)"; -- The format of the line when an item is required for a quest, an invalid format can cause many errors
QG_DATETIME = "%m/%d/%Y %H:%M:%S"; -- The format that date/time values are stored and displayed for start/finish info
 
end
\ No newline at end of file
trunk/QuestGuru.xml New file
0,0 → 1,75
<?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" />
<Frame name="QuestGuru_QuestLogTitleMenu" inherits="UIDropDownMenuTemplate" id="1">
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(self, QuestGuru_QuestLogTitleMenu_OnLoad, "MENU");
</OnLoad>
</Scripts>
</Frame>
<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>
trunk/QuestGuru.lua New file
0,0 → 1,681
QUESTGURU_VERSION = GetAddOnMetadata("QuestGuru", "Version");
 
QuestGuru_Settings = {};
QuestGuru_Items = {};
 
QGC_Cache = {};
QGC_Active = {};
 
local QuestGuru_RealmName, QuestGuru_PlayerFaction;
 
do
local QuestGuru_Frame = CreateFrame("Frame", "QuestGuru_Frame", UIParent);
QuestGuru_Frame:SetScript("OnEvent",
function (self, event, arg1, arg2)
QuestGuru_OnEvent(self, event, arg1, arg2);
end);
 
QuestGuru_Frame:RegisterEvent("QUEST_COMPLETE");
QuestGuru_Frame:RegisterEvent("QUEST_LOG_UPDATE");
QuestGuru_Frame:RegisterEvent("QUEST_PROGRESS");
QuestGuru_Frame:RegisterEvent("UI_INFO_MESSAGE");
QuestGuru_Frame:RegisterEvent("VARIABLES_LOADED");
QuestGuru_Frame:RegisterEvent("GOSSIP_SHOW");
QuestGuru_Frame:RegisterEvent("QUEST_DETAIL");
QuestGuru_Frame:RegisterEvent("QUEST_GREETING");
QuestGuru_Frame:RegisterEvent("QUEST_PROGRESS");
 
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
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)
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);
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.." ($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
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 (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_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;
 
local j = 4;
if (availQuest) then j=5; end
 
for i=1, select("#", ...), j do
local button = _G["GossipTitleButton"..currButton];
local buttonIcon = _G[button:GetName() .. "GossipIcon"];
local level = select(i+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
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;
function QuestGuru_QuestLog_OnShow()
QuestLog_OnShow();
if (QuestLogFrameX ~= nil and QuestLogFrameY ~= nil) then
QuestLogFrame:SetPoint("TOPLEFT", QuestLogFrame:GetParent(), "BOTTOMLEFT", QuestLogFrameX, QuestLogFrameY);
end
end
QuestLogFrame:SetScript("OnShow", QuestGuru_QuestLog_OnShow);
 
function QuestGuru_QuestLog_OnHide()
QuestLog_OnHide();
QuestLogFrameX = QuestLogFrame:GetLeft();
QuestLogFrameY = QuestLogFrame:GetTop();
end
QuestLogFrame:SetScript("OnHide", QuestGuru_QuestLog_OnHide);
\ No newline at end of file
trunk/ChangeLog.txt New file
0,0 → 1,57
QuestGuru ChangeLog
===================
 
Version 2.2.5-40300
-------------
* The History button call to QuestCompletist has been fixed.
 
 
Version 2.2.4-40300
-------------
* Fixed the TOC for 4.3 cata
* MrObrien has asked that somebody pickup and work on the QuestGuru so I will try and do some updates as I can't play without this mod.
Addon home is www.wowinterface.com and you can PM me there if you like. Gregity is the name.
I will be making small changes to get used to the codebase before I try anything like a major update.
 
 
Version 2.2.3
-------------
* Fixes for when scrolling the quest log
* The quest log frame will now remember where it was when moved
 
 
Version 2.2.2
-------------
* Tracker achievement bug fixes and flashing for completed remote quests
 
 
Version 2.2.1
-------------
* Tracker bug fix that was causing game crashes
 
 
Version 2.2
-----------
* Added quest levels to NPC dialogs where possible
* Added "Sound\\Creature\\Peasant\\PeasantWhat3.wav" to the list of sound options
 
 
Version 2.1
-----------
* Removed the History, I recommend using Quest Completist
* Fixes for Cataclysm
* Special thanks to Dridzy and Cartman for their invaluable contributions
 
 
Version 2.0 Beta 2
------------------
* QuestGuru now modifies the quest log to add quest level and checkboxes for tracking quests (like previous versions of QuestGuru)
 
 
Version 2.0 Beta 1
------------------
* Incorporated History function, QuestGuru History is no longer a separate module
* QuestGuru is now a modification of the built-in quest log, rather than a replacement
* History is no longer stored on your computer but is retrieved from the server instead
* Removed some features that were causing problems and slimmed down the addon to reduce memory usage
* Upgraded to ChatThrottleLib v21
\ No newline at end of file