Copy disabled (too large)
Download .txt
Showing preview only (30,299K chars total). Download the full file to get everything.
Repository: max-ri/Guidelime
Branch: master
Commit: f07119983e1b
Files: 86
Total size: 27.4 MB
Directory structure:
gitextract_32tprem4/
├── .gitignore
├── .pkgmeta
├── Guidelime/
│ ├── ActionButtons.lua
│ ├── Bindings.xml
│ ├── CurrentGuide.lua
│ ├── CustomCode.lua
│ ├── Data/
│ │ ├── ClassicCodex.lua
│ │ ├── ClassicCodexCorrections.lua
│ │ ├── Data.lua
│ │ ├── FlightmasterDB.lua
│ │ ├── FlightmasterDB_Locales.lua
│ │ ├── Internal/
│ │ │ ├── CreaturesDB.lua
│ │ │ ├── CreaturesDB_Locales.lua
│ │ │ ├── ItemsDB.lua
│ │ │ ├── ItemsDB_Locales.lua
│ │ │ ├── ObjectsDB.lua
│ │ │ ├── ObjectsDB_Locales.lua
│ │ │ ├── QuestsDB.lua
│ │ │ ├── QuestsDB_Locales.lua
│ │ │ └── corrections.lua
│ │ ├── MapDB.lua
│ │ ├── PositionTools.lua
│ │ ├── Questie.lua
│ │ ├── QuestieCorrections.lua
│ │ ├── QuestsTools.lua
│ │ ├── SkillDB.lua
│ │ ├── SkillDB_Locales.lua
│ │ └── SpellDB.lua
│ ├── Editor.lua
│ ├── EditorTools.lua
│ ├── Events.lua
│ ├── Frames.lua
│ ├── GuideParser.lua
│ ├── Guidelime-Cata.toc
│ ├── Guidelime-Mists.toc
│ ├── Guidelime-TBC.toc
│ ├── Guidelime-Vanilla.toc
│ ├── Guidelime-Wrath.toc
│ ├── Guidelime.lua
│ ├── Guides.lua
│ ├── Icons/
│ │ ├── Arrow.blp
│ │ ├── ArrowLicense.txt
│ │ ├── TitleHighlight.blp
│ │ ├── black.blp
│ │ ├── check.blp
│ │ ├── discord.tga
│ │ ├── getflightpoint.blp
│ │ ├── hearth.blp
│ │ ├── lime.blp
│ │ ├── lime0.blp
│ │ ├── lime_arrow.blp
│ │ ├── lime_marker.blp
│ │ ├── lime_marker_friz.blp
│ │ ├── lime_marker_friz_green.blp
│ │ ├── limev.blp
│ │ ├── paypal.tga
│ │ ├── questunavailable.blp
│ │ ├── repair.blp
│ │ ├── scroll.blp
│ │ └── set_hearth.blp
│ ├── Import.lua
│ ├── Libs/
│ │ ├── CallbackHandler-1.0/
│ │ │ ├── CallbackHandler-1.0.lua
│ │ │ └── CallbackHandler-1.0.xml
│ │ ├── HereBeDragons/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CallbackHandler-1.0/
│ │ │ │ ├── CallbackHandler-1.0.lua
│ │ │ │ └── CallbackHandler-1.0.xml
│ │ │ ├── HereBeDragons-2.0.lua
│ │ │ ├── HereBeDragons-Migrate.lua
│ │ │ ├── HereBeDragons-Pins-2.0.lua
│ │ │ ├── HereBeDragons.toc
│ │ │ └── LibStub/
│ │ │ ├── LibStub.lua
│ │ │ └── LibStub.toc
│ │ ├── LibDBIcon-1.0/
│ │ │ ├── LibDBIcon-1.0.lua
│ │ │ └── lib.xml
│ │ ├── LibDataBroker-1.1/
│ │ │ └── LibDataBroker-1.1.lua
│ │ └── LibStub/
│ │ └── LibStub.lua
│ ├── Localization.lua
│ ├── MainWindow.lua
│ ├── Map.lua
│ ├── Options.lua
│ ├── QuestLog-Classic.lua
│ ├── QuestLog.lua
│ └── QuestScan.lua
├── Guidelime_MyGuideExample/
│ ├── Guidelime_MyGuideExample.toc
│ └── MyGuide.lua
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*
!Guidelime
!Guidelime/**
!Guidelime_MyGuideExample
!README.md
!.pkgmeta
!.gitignore
================================================
FILE: .pkgmeta
================================================
enable-nolib-creation: no
package-as: Guidelime
move-folders:
Guidelime/Guidelime : Guidelime
ignore:
- Guidelime_MyGuideExample
================================================
FILE: Guidelime/ActionButtons.lua
================================================
local addonName, addon = ...
local L = addon.L
addon.D = addon.D or {}; local D = addon.D -- Data/Data
addon.SP = addon.SP or {}; local SP = addon.SP -- Data/SpellDB
addon.EV = addon.EV or {}; local EV = addon.EV -- Events
addon.F = addon.F or {}; local F = addon.F -- Frames
addon.CG = addon.CG or {}; local CG = addon.CG -- CurrentGuide
addon.M = addon.M or {}; local M = addon.M -- Map
addon.MW = addon.MW or {}; local MW = addon.MW -- MainWindow
addon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools
addon.AB = addon.AB or {}; local AB = addon.AB -- ActionButtons
-- for key bindings
_G["BINDING_NAME_GUIDELIME_TARGET_1"] = L.TARGET_1
_G["BINDING_NAME_GUIDELIME_USE_ITEM_1"] = string.format(L.USE_ITEM_X, 1)
for i = 2, 5 do
_G["BINDING_NAME_GUIDELIME_TARGET_" .. i] = string.format(L.TARGET_X, i)
_G["BINDING_NAME_GUIDELIME_USE_ITEM_" .. i] = string.format(L.USE_ITEM_X, i)
end
function AB.resetButtons(buttons)
if not buttons then return end
for _, button in pairs(buttons) do
if button:IsShown() then
if InCombatLockdown() then
EV.updateAfterCombat = true
return
end
ClearOverrideBindings(button)
button:Hide()
end
end
end
-- ordering of raid markers to use
-- default to triangle for friends because it is green and skull for enemies
AB.targetRaidMarkerIndex = {4, 6, 3, 5, 1, 2, 7, 8}
function AB.getTargetButtonIconText(npcId)
if AB.targetNpcIdMarker == null or AB.targetNpcIdMarker[npcId] == null then return "" end
return AB.getTargetMarkerIconText(AB.targetNpcIdMarker[npcId]) .. " "
end
function AB.getTargetMarkerIconText(marker)
if marker and marker > 0 then
return "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_" .. marker .. ":12|t"
else
return "|T" .. addon.icons.TARGET_BUTTON .. ":12|t"
end
end
function AB.createTargetButton(i)
local button = MW.mainFrame.targetButtons[i]
if not button then
button = CreateFrame("BUTTON", "GuidelimeTargetButton" .. i, MW.mainFrame, "SecureActionButtonTemplate")
button.index = i
button:SetSize(32, 32)
button:SetAttribute("type", "macro")
button.texture = button:CreateTexture(nil, "BACKGROUND")
button.texture:SetTexture(i == "Multi" and addon.icons.MULTI_TARGET_BUTTON or addon.icons.TARGET_BUTTON)
button.texture:SetPoint("TOPLEFT", button, -2, 1)
button.texture:SetPoint("BOTTOMRIGHT", button, 2, -2)
button.texture2 = button:CreateTexture(nil, "OVERLAY")
button.texture2:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons")
button.texture2:SetPoint("TOPLEFT", button, 20, -22)
button.texture2:SetPoint("BOTTOMRIGHT", button, -2, 0)
button.hotkey = button:CreateFontString(nil, "ARTWORK", "NumberFontNormalSmallGray")
button.hotkey:SetSize(32, 10)
button.hotkey:SetPoint("TOPRIGHT", button, 0, -1)
button.hotkey:SetJustifyH("RIGHT")
button:RegisterForClicks("AnyUp", "AnyDown")
button:SetMouseClickEnabled(true)
MW.mainFrame.targetButtons[i] = button
end
button:ClearAllPoints()
return button
end
-- global function to be used in the macro: Set target marker on target if it does not have one already; remove existing marker when no target
function LIME(iconId)
SetRaidTarget("player", iconId)
SetRaidTarget("player", 0)
if UnitGUID("target") and not GetRaidTargetIndex("target") then SetRaidTarget("target", iconId) end
end
local function getTargetMacro(t)
return "/targetexact " .. t.name ..
(t.marker and "\n/run LIME(".. t.marker .. ")" or "")
end
local function getTargetMacroMulti(targets)
local macro = ""
for i, t in ipairs(targets) do
local m = getTargetMacro(t)
local maxMacroLength
if select(4, GetBuildInfo()) >= 20505 and select(4, GetBuildInfo()) < 30000 then
maxMacroLength = 240
else
maxMacroLength = 1022
end
if #macro + #m > maxMacroLength then
if addon.debugging then print("LIME: target macro multi is too long") end
--if addon.debugging then print("LIME: target macro -", macro) end
return macro
end
macro = macro .. m .. "\n"
end
if addon.debugging then print("LIME: target macro multi length is", #macro) end
--if addon.debugging then print("LIME: target macro -", macro) end
return macro
end
local function getTooltipHint(newline, disable)
if disable or GuidelimeData.keyBound then return "" end
return (newline and "\n" or "") .. MW.COLOR_INACTIVE .. L.TOOLTIP_HINT_KEY_BIND_BUTTON .. "|r"
end
local function getTargetTooltip(t, last)
return GuidelimeData.showTooltips and
(table.concat({string.format(L.TARGET_TOOLTIP, MW["COLOR_" .. QT.isFriendlyNpc(t.npcId)] .. t.name .. "|r"), M.getMapTooltip(t.element)}, "\n") ..
getTooltipHint(true, last == false))
end
local function getTargetTooltipMulti(targets)
if not GuidelimeData.showTooltips then return end
local tooltips = {}
for i, t in ipairs(targets) do
tooltips[i] = getTargetTooltip(t, i == #targets)
end
return table.concat(tooltips, "\n")
end
local function keyBindButton(button, bindingName, buttonName, functionName)
local key = GetBindingKey(bindingName)
if key then
button.hotkey:SetText(_G["KEY_" .. key] or key)
SetOverrideBindingClick(button, true, key, buttonName)
if addon.debugging then print("LIME: binding " .. key .. " to " .. functionName) end
GuidelimeData.keyBound = true
button.hotkey:Show()
else
button.hotkey:Hide()
end
end
function AB.updateTargetButtons()
if not MW.mainFrame then return end
if MW.mainFrame.targetButtons == nil then
MW.mainFrame.targetButtons = {}
else
AB.resetButtons(MW.mainFrame.targetButtons)
end
if not GuidelimeDataChar.showTargetButtons or not CG.currentGuide or not CG.currentGuide.firstActiveIndex then return end
local targets = {}
local i = 1
local iFriendly = 1
local iHostile = #AB.targetRaidMarkerIndex
for s = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
local step = CG.currentGuide.steps[s]
if step.active then
for _, element in ipairs(step.elements) do
if element.t == "TARGET" and element.targetNpcId > 0 and
(not element.attached or not element.attached.completed) and
(not element.attached or element.attached.t ~= "COMPLETE" or CG.isQuestObjectiveActive(element.attached.questId, element.objectives, element.attached.objective)) and
(element.generated or not D.contains(CG.currentGuide.activeQuestNpcs, element.targetNpcId)) then
if addon.debugging then print("LIME: show target button for npc", element.targetNpcId) end
if InCombatLockdown() then
EV.updateAfterCombat = true
return
end
local name = QT.getNPCName(element.targetNpcId)
if name then
local t = D.find(targets, function(t) return t.name == name end)
if not t then
local marker
if GuidelimeData.targetRaidMarkers and iFriendly <= iHostile then
local friendly = QT.isFriendlyNpc(element.targetNpcId) == 'Friendly'
if friendly then
marker = AB.targetRaidMarkerIndex[iFriendly]
iFriendly = iFriendly + 1
else
marker = AB.targetRaidMarkerIndex[iHostile]
iHostile = iHostile - 1
end
end
targets[i] = {name = name, index = i, marker = marker, npcId = element.targetNpcId}
if GuidelimeDataChar.maxNumOfTargetButtons > 0 and i >= GuidelimeDataChar.maxNumOfTargetButtons then break end
i = i + 1
end
end
end
end
end
end
local pos = 1
if #targets > 1 then
local button = AB.createTargetButton("Multi")
button.texture2:Hide()
button:SetPoint("TOP" .. GuidelimeDataChar.showTargetButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showTargetButtons,
GuidelimeDataChar.showTargetButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37), -2)
button:SetAttribute("macrotext", "/cleartarget\n" .. getTargetMacroMulti(targets))
F.setTooltip(button, getTargetTooltipMulti(targets))
keyBindButton(button, "GUIDELIME_TARGET_1", "GuidelimeTargetButtonMulti", "multi target")
button:Show()
pos = 2
end
AB.targetNpcIdMarker = {}
for _, t in ipairs(targets) do
local button = AB.createTargetButton(t.index)
AB.targetNpcIdMarker[t.npcId] = t.marker or 0
if t.marker then
SetRaidTargetIconTexture(button.texture2, t.marker)
button.texture2:Show()
else
button.texture2:Hide()
end
button:SetPoint("TOP" .. GuidelimeDataChar.showTargetButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showTargetButtons,
GuidelimeDataChar.showTargetButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37),
39 - pos * 41)
button.npc = t.name
button.marker = t.marker
button:SetAttribute("macrotext", "/cleartarget\n" .. getTargetMacro(t))
F.setTooltip(button, getTargetTooltip(t))
keyBindButton(button, "GUIDELIME_TARGET_" .. pos, "GuidelimeTargetButton" .. t.index, t.name)
button:Show()
pos = pos + 1
end
AB.numberOfTargetButtons = pos - 1
end
function AB.createUseItemButton(i)
local button = MW.mainFrame.useButtons[i]
if not button then
button = CreateFrame("BUTTON", "GuidelimeUseItemButton" .. i, MW.mainFrame, "SecureActionButtonTemplate")
button:SetSize(32, 32)
button.texture = button:CreateTexture(nil,"BACKGROUND")
button.texture:SetPoint("TOPLEFT", button, -2, 1)
button.texture:SetPoint("BOTTOMRIGHT", button, 2, -2)
button.cooldown = CreateFrame("Cooldown", nil, button, "CooldownFrameTemplate")
button.cooldown:SetSize(32, 32)
button.cooldown:SetPoint("CENTER", button, "CENTER", 0, 0)
button.hotkey = button:CreateFontString(nil, "ARTWORK", "NumberFontNormalSmallGray")
button.hotkey:SetSize(32, 10)
button.hotkey:SetPoint("TOPRIGHT", button, 0, -1)
button.hotkey:SetJustifyH("RIGHT")
button.count = button:CreateFontString(nil, "ARTWORK", "NumberFontNormal")
button.count:SetPoint("BOTTOMRIGHT", button, -1, 1)
button.count:SetJustifyH("RIGHT")
button:RegisterForClicks("AnyUp", "AnyDown")
button:SetMouseClickEnabled(true)
button.Update = function(self)
local start, duration, enable
if self.spellId then
start, duration, enable = GetSpellCooldown(self.spellId)
else
start, duration, enable = QT.GetItemCooldown(self.itemId)
end
if enable == 1 and duration > 0 then
self.cooldown:Show()
self.cooldown:SetCooldown(start, duration)
else
self.cooldown:Hide()
end
end
MW.mainFrame.useButtons[i] = button
end
button.spellId = nil
button.cooldown:Hide()
button:ClearAllPoints()
return button
end
function AB.updateUseItemButtons()
if not MW.mainFrame then return end
if MW.mainFrame.useButtons == nil then
MW.mainFrame.useButtons = {}
else
AB.resetButtons(MW.mainFrame.useButtons)
end
if not GuidelimeDataChar.showUseItemButtons or not CG.currentGuide or not CG.currentGuide.firstActiveIndex then return end
local i = 1
local startPos = GuidelimeDataChar.showUseItemButtons == GuidelimeDataChar.showTargetButtons and AB.numberOfTargetButtons and AB.numberOfTargetButtons > 0 and (AB.numberOfTargetButtons * 42 + 5) or 0
local previousIds = {}
for s = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
local step = CG.currentGuide.steps[s]
if step.active then
for _, element in ipairs(step.elements) do
if element.t == "USE_ITEM" and element.useItemId > 0 and
not (step.useItemElement and element.generated) and not (element.attached and element.attached.completed) and
not D.contains(previousIds, element.useItemId) then
if addon.debugging then print("LIME: show use item button for item", element.useItemId) end
if InCombatLockdown() then
EV.updateAfterCombat = true
return
end
local button = AB.createUseItemButton(i)
button:SetPoint("TOP" .. GuidelimeDataChar.showUseItemButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showUseItemButtons,
GuidelimeDataChar.showUseItemButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37),
39 - i * 41 - startPos)
button.itemId = element.useItemId
button.texture:SetTexture(GetItemIcon(button.itemId))
local name = EV.GetItemInfo(button.itemId)
if name then
button:SetAttribute("type", "item")
button:SetAttribute("item", name)
--F.setTooltip(button, name .. "\n" .. (QT.getUseItemTooltip(button.itemId) or ""))
F.setTooltip(button, "item:" .. button.itemId, function(self, s)
GameTooltip:SetHyperlink(s)
GameTooltip:AddLine(getTooltipHint())
end)
keyBindButton(button, "GUIDELIME_USE_ITEM_" .. i, "GuidelimeUseItemButton" .. i, name)
end
local count = GetItemCount(button.itemId) or 0
button.count:SetText(count ~= 1 and count or "")
button.texture:SetAlpha((count > 0 and 1) or 0.5)
button:Show()
button:Update()
table.insert(previousIds, element.useItemId)
i = i + 1
elseif element.t == "SPELL" and element.spellId ~= 0 and not element.completed then
local id
if element.spellId and GetSpellInfo(element.spellId) then id = element.spellId end
if id == nil then id = SP.getSpellId(element.spell) end
if addon.debugging then print("LIME: show button for spell", id) end
if InCombatLockdown() then
EV.updateAfterCombat = true
return
end
local name, _, icon = GetSpellInfo(id)
if name then
local button = AB.createUseItemButton(i)
button:SetPoint("TOP" .. GuidelimeDataChar.showUseItemButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showUseItemButtons,
GuidelimeDataChar.showUseItemButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37),
39 - i * 41 - startPos)
button.spellId = id
button.texture:SetTexture(icon or addon.icons.SPELL)
button.texture:SetAlpha(1)
button:SetAttribute("type", "spell")
button:SetAttribute("spell", name)
if not IsSpellKnown(id) then
local index = SP.getTradeSkillIndex(name)
if index then
button:SetAttribute("type", "macro")
button:SetAttribute("macrotext", "/run DoTradeSkill(" .. index .. ")")
local count = select(3, GetTradeSkillInfo(index))
button.count:SetText(count)
button.texture:SetAlpha((count > 0 and 1) or 0.2)
else
button:SetAlpha(0.2)
end
end
F.setTooltip(button, "spell:" .. id, function(self, s)
GameTooltip:SetHyperlink(s)
GameTooltip:AddLine(getTooltipHint())
end)
keyBindButton(button, "GUIDELIME_USE_ITEM_" .. i, "GuidelimeUseItemButton" .. i, name)
button:Show()
button:Update()
if GuidelimeDataChar.maxNumOfItemButtons > 0 and i >= GuidelimeDataChar.maxNumOfItemButtons then break end
i = i + 1
end
end
end
end
end
end
================================================
FILE: Guidelime/Bindings.xml
================================================
<Bindings>
<Binding name="GUIDELIME_TOGGLE" category="BINDING_HEADER_GUIDELIME">
Guidelime.toggleMainFrame()
</Binding>
<Binding name="GUIDELIME_TOGGLE_MAP_MARKERS" category="BINDING_HEADER_GUIDELIME">
Guidelime.toggleMapMarkers()
</Binding>
<Binding name="GUIDELIME_TOGGLE_MINIMAP_MARKERS" category="BINDING_HEADER_GUIDELIME">
Guidelime.toggleMinimapMarkers()
</Binding>
<Binding name="GUIDELIME_TARGET_1" header="TARGET" category="BINDING_HEADER_GUIDELIME">
--for targeting an npc
</Binding>
<Binding name="GUIDELIME_TARGET_2" category="BINDING_HEADER_GUIDELIME">
--for targeting an npc
</Binding>
<Binding name="GUIDELIME_TARGET_3" category="BINDING_HEADER_GUIDELIME">
--for targeting an npc
</Binding>
<Binding name="GUIDELIME_TARGET_4" category="BINDING_HEADER_GUIDELIME">
--for targeting an npc
</Binding>
<Binding name="GUIDELIME_TARGET_5" category="BINDING_HEADER_GUIDELIME">
--for targeting an npc
</Binding>
<Binding name="GUIDELIME_USE_ITEM_1" header="USE_ITEMS" category="BINDING_HEADER_GUIDELIME">
--for using a quest item
</Binding>
<Binding name="GUIDELIME_USE_ITEM_2" category="BINDING_HEADER_GUIDELIME">
--for using a quest item
</Binding>
<Binding name="GUIDELIME_USE_ITEM_3" category="BINDING_HEADER_GUIDELIME">
--for using a quest item
</Binding>
<Binding name="GUIDELIME_USE_ITEM_4" category="BINDING_HEADER_GUIDELIME">
--for using a quest item
</Binding>
<Binding name="GUIDELIME_USE_ITEM_5" category="BINDING_HEADER_GUIDELIME">
--for using a quest item
</Binding>
</Bindings>
================================================
FILE: Guidelime/CurrentGuide.lua
================================================
local addonName, addon = ...
local L = addon.L
local HBD = LibStub("HereBeDragons-2.0")
addon.D = addon.D or {}; local D = addon.D -- Data/Data
addon.FM = addon.FM or {}; local FM = addon.FM -- Data/FlightMasterDB
addon.PT = addon.PT or {}; local PT = addon.PT -- Data/PositionTools
addon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools
addon.SK = addon.SK or {}; local SK = addon.SK -- Data/SkillDB
addon.SP = addon.SP or {}; local SP = addon.SP -- Data/SpellDB
addon.AB = addon.AB or {}; local AB = addon.AB -- ActionButtons
addon.CC = addon.CC or {}; local CC = addon.CC -- CustomCode
addon.EV = addon.EV or {}; local EV = addon.EV -- Events
addon.F = addon.F or {}; local F = addon.F -- Frames
addon.M = addon.M or {}; local M = addon.M -- Map
addon.MW = addon.MW or {}; local MW = addon.MW -- MainWindow
addon.GP = addon.GP or {}; local GP = addon.GP -- GuideParser
addon.QS = addon.QS or {}; local QS = addon.QS -- QuestScan
addon.CG = addon.CG or {}; local CG = addon.CG -- CurrentGuide
CG.DEFAULT_GOTO_RADIUS = 6
CG.GOTO_HYSTERESIS_FACTOR = 2
function CG.loadCurrentGuide(reset)
local guide = addon.guides[GuidelimeDataChar.currentGuide]
CG.quests = {}
CG.questIds = {}
if guide == nil then
if addon.debugging then
print("LIME: available guides:")
for name in pairs(addon.guides) do
print("LIME: " .. name)
end
print("LIME: guide \"" .. (GuidelimeDataChar.currentGuide or "") .. "\" not found")
end
GuidelimeDataChar.currentGuide = nil
CG.currentGuide = {steps = {}}
GuidelimeDataChar.completedSteps = {}
QS.resetScannedQuests()
return
end
if not CG.currentGuide or guide.group ~= CG.currentGuide.group then QS.resetScannedQuests() end
CG.currentGuide = {}
CG.currentGuide.name = GuidelimeDataChar.currentGuide
CG.currentGuide.steps = {}
CG.currentGuide.next = guide.next
CG.currentGuide.group = guide.group
if GuidelimeDataChar.guideSize[GuidelimeDataChar.currentGuide] ~= #guide.steps then
GuidelimeDataChar.completedSteps = {}
GuidelimeDataChar.guideSkip[GuidelimeDataChar.currentGuide] = {}
GuidelimeDataChar.guideSize[GuidelimeDataChar.currentGuide] = #guide.steps
end
if GuidelimeDataChar.guideSkip[GuidelimeDataChar.currentGuide] == nil then
GuidelimeDataChar.guideSkip[GuidelimeDataChar.currentGuide] = {}
end
if reset then
GuidelimeDataChar.completedSteps = {}
end
--print(format(L.LOAD_MESSAGE, CG.currentGuide.name))
guide = GP.parseGuide(guide, guide.group)
if guide == nil then return end
addon.guides[GuidelimeDataChar.currentGuide] = guide
if guide.unknownQuests > 0 and select(4, GetBuildInfo()) >= 20000 and addon.dataSource == "DB" then
CG.currentGuide.steps = {{elements = {{text =
(addon.QUESTIE.isDataSourceInstalled() or addon.CLASSIC_CODEX.isDataSourceInstalled()) and L.ERROR_TBC_DATA_SOURCE or L.ERROR_TBC_DATA_SOURCE_INSTALL
}}}}
CG.currentGuide.next = nil
return
end
local time
if addon.debugging then time = debugprofilestop() end
local completed = QT.GetQuestsCompleted()
local lastGoto
for _, step in ipairs(guide.steps) do
local loadLine = D.applies(step)
local filteredElements = {}
for _, element in ipairs(step.elements) do
if not element.generated and
((element.text ~= nil and element.text ~= "") or
(element.t ~= "TEXT" and element.t ~= "NAME" and element.t ~= "NEXT" and element.t ~= "DETAILS" and element.t ~= "GUIDE_APPLIES" and
element.t ~= "DOWNLOAD" and element.t ~= "AUTO_ADD_COORDINATES_GOTO" and element.t ~= "AUTO_ADD_COORDINATES_LOC" and element.t ~= "AUTO_ADD_USE_ITEM"))
then
table.insert(filteredElements, element)
end
end
step.elements = filteredElements
if #step.elements == 0 then loadLine = false end
if loadLine then
table.insert(CG.currentGuide.steps, step)
step.index = #CG.currentGuide.steps
local i = 1
while i <= #step.elements do
local element = step.elements[i]
element.available = true
if element.t == "ACCEPT" or element.t == "COMPLETE" or element.t == "TURNIN" or element.t == "XP" or element.t == "REPUTATION" or element.t == "SPELL" or element.t == "LEARN" or element.t == "SKILL" then
if step.manual == nil then step.manual = false end
elseif element.t == "TRAIN" or element.t == "VENDOR" or element.t == "REPAIR" or element.t == "SET_HEARTH" or element.t == "GET_FLIGHT_POINT" then
step.manual = true
elseif element.t == "GOTO" then
if step.manual == nil then step.manual = false end
if lastGoto ~= nil then lastGoto.lastGoto = false end
element.lastGoto = true
lastGoto = element
end
if element.questId ~= nil then
if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
if not D.contains(CG.questIds, element.questId) then table.insert(CG.questIds, element.questId) end
CG.quests[element.questId].title = element.title
CG.quests[element.questId].completed = completed[element.questId] ~= nil and completed[element.questId]
CG.quests[element.questId].finished = CG.quests[element.questId].completed
if QT.getQuestPrequests(element.questId) ~= nil then
for _, id in ipairs(QT.getQuestPrequests(element.questId)) do
if QT.getQuestApplies(id) then
if CG.quests[id] == nil then CG.quests[id] = {} end
CG.quests[id].completed = completed[id] ~= nil and completed[id]
if CG.quests[id].followup == nil then CG.quests[id].followup = {} end
table.insert(CG.quests[id].followup, element.questId)
end
end
end
if CG.quests[element.questId].lastStep == nil then CG.quests[element.questId].lastStep = {} end
CG.quests[element.questId].lastStep[element.t] = element
if element.t == "COMPLETE" and CG.quests[element.questId].objectives == nil then
CG.quests[element.questId].objectives = {}
local objectives = QT.getQuestObjectives(element.questId)
if objectives ~= nil then
for i, objective in ipairs(objectives) do
CG.quests[element.questId].objectives[i] = {type = objective.type, desc = objective.names[1]}
end
end
end
if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
if CG.addElement(CG.updatePosElement(PT.getQuestPosition(element.questId, element.t, element.objective, lastGoto), {t = "GOTO"}), element) then
i = i + 1
end
end
if element.races ~= nil or element.classes ~= nil then
CG.addElement({t = "APPLIES", races = element.races, classes = element.classes, faction = element.faction}, element)
i = i + 1
end
elseif element.t == "FLY" then
if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
CG.addElement({t = "GOTO", specialLocation = "NEAREST_FLIGHT_POINT", radius = CG.DEFAULT_GOTO_RADIUS}, element)
i = i + 1
end
elseif element.t == "GET_FLIGHT_POINT" then
if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
if CG.addElement(CG.updatePosElement(FM.getFlightPoint(element.flightmaster), {t = "GOTO"}), element) then
i = i + 1
end
end
elseif element.t == "COLLECT_ITEM" then
guide.itemUpdate = true
if step.manual == nil then step.manual = false end
if guide.autoAddCoordinatesGOTO and
not step.hasGoto and not step.optional and not step.targetElement then
if CG.addElement(CG.updatePosElement(PT.getItemPosition(element.itemId, lastGoto), {t = "GOTO"}), element) then
i = i + 1
end
end
elseif element.t == "USE_ITEM" then
if not element.generated then step.useItemElement = true end
elseif element.t == "TARGET" then
if not element.generated then
step.targetElement = true
if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
if CG.addElement(CG.updatePosElement(PT.getNPCPosition(element.targetNpcId, lastGoto), {t = "GOTO"}), element) then
i = i + 1
end
end
end
elseif guide.autoAddUseItem and not step.useItemElement and element.t == "HEARTH" then
CG.addElement({t = "USE_ITEM", useItemId = 6948, title = ""}, element, 1)
i = i + 1
end
i = i + 1
end
if step.manual == nil then step.manual = true end
if step.completeWithNext == nil then step.completeWithNext = false end
if step.completeWithNext then step.optional = true end
if step.optional == nil then step.optional = false end
step.skip = GuidelimeDataChar.guideSkip[CG.currentGuide.name][step.index] or GuidelimeDataChar.completedSteps[step.index] or false
step.active = false
step.wasActive = false
step.completed = false
step.available = true
end
end
if addon.debugging then print("LIME: loadCurrentGuide " .. math.floor(debugprofilestop() - time) .. " ms") end
CC.parseCustomLuaCode()
QS.scanGuideQuests(guide.name)
end
function CG.addElement(newElement, element, offset, keepIndex)
if not newElement then return end
newElement.step = element.step
newElement.attached = element
newElement.generated = true
newElement.available = true
table.insert(element.step.elements, element.index + (offset or 0), newElement)
if not keepIndex then
for j = element.step.index + (offset or 0), #element.step.elements do
element.step.elements[j].index = j
end
else
newElement.index = element.index + (offset or 0)
end
if newElement.t == "GOTO" then
if lastGoto ~= nil and lastGoto.step.line == element.step.line then lastGoto.lastGoto = false end
newElement.lastGoto = true
lastGoto = newElement
end
return newElement
end
function CG.updatePosElement(pos, element)
if not pos or not pos.x then return end
if not element then element = {} end
for k,v in pairs(pos) do element[k] = v end
element.radius = element.radius or CG.DEFAULT_GOTO_RADIUS
return element
end
function CG.loadStepUseItems(i, recheck)
local step = CG.currentGuide.steps[i]
if addon.guides[GuidelimeDataChar.currentGuide].autoAddUseItem and GuidelimeDataChar.showUseItemButtons and not step.useItemElement then
local j = 1
local previousUseItems = {}
while j <= #step.elements do
local element = step.elements[j]
if recheck and element.t == "USE_ITEM" then
table.insert(previousUseItems, element.useItemId)
elseif element.questId ~= nil and element.available then
if element.t == "ACCEPT" and not recheck then
local itemId = QT.getItemStartingQuest(element.questId)
if itemId then
CG.addElement({t = "USE_ITEM", useItemId = itemId, title = ""}, element)
j = j + 1
end
elseif element.t == "COMPLETE" or element.t == "TURNIN" then
local items = QT.getUsableQuestItems(element.questId)
if items then
for _, itemId in ipairs(items) do
if QT.questItemIsFor[itemId] == element.t and not D.contains(previousUseItems, itemId) then
CG.addElement({t = "USE_ITEM", useItemId = itemId, title = ""}, element)
j = j + 1
end
end
end
end
end
j = j + 1
end
end
end
local function loadQuestStepOnActivation(i)
local time
if addon.debugging then time = debugprofilestop() end
local step = CG.currentGuide.steps[i]
if addon.guides[GuidelimeDataChar.currentGuide].autoAddCoordinatesLOC and (GuidelimeData.showMapMarkersLOC or GuidelimeData.showMinimapMarkersLOC) and not step.hasLoc then
local j = 1
while j <= #step.elements do
local element = step.elements[j]
if element.questId ~= nil and element.available then
local positions = PT.getQuestPositionsLimited(element.questId, element.t, element.objective, GuidelimeData.maxNumOfMarkersLOC, true)
if positions ~= nil then
local objectives = QT.getQuestObjectives(element.questId, element.t)
for _, pos in ipairs(positions) do
local locElement = CG.addElement(CG.updatePosElement(pos, {t = "LOC"}), element, 0, true)
if element.t == "COMPLETE" then
locElement.markerTyp = objectives and pos.objectives and pos.objectives[1] and objectives[pos.objectives[1]] and objectives[pos.objectives[1]].type or "LOC"
else
locElement.markerTyp = element.t
end
j = j + 1
end
for k = j, #step.elements do
step.elements[k].index = k
end
end
end
j = j + 1
end
end
if addon.guides[GuidelimeDataChar.currentGuide].autoAddTarget and GuidelimeDataChar.showTargetButtons then
local j = 1
while j <= #step.elements do
local element = step.elements[j]
if element.questId ~= nil and element.available then
element.questNpcs = QT.getQuestNPCs(element.questId, element.t, element.objective)
if element.questNpcs then
for _, npc in ipairs(element.questNpcs) do
CG.addElement({t = "TARGET", targetNpcId = npc.id, title = "", objectives = npc.objectives}, element)
j = j + 1
end
end
end
j = j + 1
end
end
if addon.debugging then print("LIME: loadQuestStepOnActivation " .. i .. " " .. math.floor(debugprofilestop() - time) .. " ms") end
end
local function loadStepOnActivation(i)
local time
if addon.debugging then time = debugprofilestop() end
local step = CG.currentGuide.steps[i]
if addon.guides[GuidelimeDataChar.currentGuide].autoAddCoordinatesLOC and (GuidelimeData.showMapMarkersLOC or GuidelimeData.showMinimapMarkersLOC) and not step.hasLoc then
local j = 1
while j <= #step.elements do
local element = step.elements[j]
if element.t == "COLLECT_ITEM" and not step.targetElement then
local positions = PT.getItemPositionsLimited(element.itemId, GuidelimeData.maxNumOfMarkersLOC, true)
if positions ~= nil then
for _, pos in ipairs(positions) do
CG.addElement(CG.updatePosElement(pos, {t = "LOC", markerTyp = "item"}), element, 0, true)
j = j + 1
end
for k = j, #step.elements do
step.elements[k].index = k
end
end
elseif element.t == "TARGET" and not element.generated and not D.contains(CG.currentGuide.activeQuestNpcs, element.targetNpcId) then
local positions = PT.getNPCPositionsLimited(element.targetNpcId, GuidelimeData.maxNumOfMarkersLOC, true)
if positions ~= nil then
for _, pos in ipairs(positions) do
CG.addElement(CG.updatePosElement(pos, {t = "LOC", markerTyp = "npc"}), element, 0, true)
j = j + 1
end
for k = j, #step.elements do
step.elements[k].index = k
end
end
end
j = j + 1
end
end
CG.loadStepUseItems(i)
C_Timer.After(1, function()
if addon.debugging then print("LIME: recheck use items for step", step.line) end
CG.loadStepUseItems(i, true)
AB.updateUseItemButtons()
end)
if addon.debugging then print("LIME: loadStepOnActivation " .. i .. " " .. math.floor(debugprofilestop() - time) .. " ms") end
end
function CG.getQuestText(id, t, title, colored)
local q = ""
if (GuidelimeData.showQuestLevels or GuidelimeData.showMinimumQuestLevels) then
q = q .. "["
if GuidelimeData.showMinimumQuestLevels then
q = q .. MW.getRequiredLevelColor(QT.getQuestMinimumLevel(id)) .. (QT.getQuestMinimumLevel(id) or "")
end
if GuidelimeData.showMinimumQuestLevels and GuidelimeData.showQuestLevels then
if colored == true then
q = q .. "|r"
else
q = q .. GuidelimeData.fontColorInactive
end
q = q .. "-"
end
if GuidelimeData.showQuestLevels then
q = q .. MW.getLevelColor(QT.getQuestLevel(id)) .. (QT.getQuestLevel(id) or "")
if QT.getQuestType(id) == "Dungeon" then
q = q .. "D"
elseif QT.getQuestType(id) == "Raid" then
q = q .. "R"
elseif QT.getQuestType(id) == "Elite" then
q = q .. "+"
elseif QT.getQuestType(id) == "Group" then
q = q .. "P"
end
end
if colored == true then
q = q .. "|r"
else
q = q .. GuidelimeData.fontColorInactive
end
q = q .. "]"
end
if colored == nil or colored then q = q .. GuidelimeData["fontColor" .. (t or "ACCEPT")] end
q = q .. (title or QT.getQuestNameById(id) or id)
if GuidelimeData.showQuestIds then q = q .. "(#" .. id .. ")" end
if colored == nil or colored then q = q .. "|r" end
return q
end
local function getSkipQuests(id, skipQuests, newSkipQuests)
if newSkipQuests == nil then newSkipQuests = {} end
if CG.quests[id] ~= nil and CG.quests[id].followup ~= nil and #CG.quests[id].followup > 0 then
for _, fid in ipairs(CG.quests[id].followup) do
if CG.currentGuide.unavailableQuests[fid] == nil and skipQuests[fid] == nil then
table.insert(newSkipQuests, fid)
skipQuests[fid] = true
getSkipQuests(fid, skipQuests, newSkipQuests)
end
end
end
return newSkipQuests
end
function CG.getQuestObjectiveIcon(id, objective, showItemIcon)
if CG.quests[id] == nil or CG.quests[id].objectives == nil then return "" end
local a, b = objective, objective
if objective == nil then a = 1; b = #CG.quests[id].objectives end
local text = ""
local icons = {}
for i = a, b do
local o = CG.quests[id].objectives[i]
if o ~= nil and not o.done then
local type = o.type
if type == nil or addon.icons[type] == nil then type = "COMPLETE" end
local _,icon
if type == "item" and showItemIcon then
local objectives = QT.getQuestObjectives(id)
if objectives ~= nil and objectives[i] ~= nil and objectives[i].type == 'item' then
icon = GetItemIcon(objectives[i].ids.item[1])
end
end
if icon == nil and icons[type] == nil then
icon = addon.icons[type]
icons[type] = true
end
if icon ~= nil then text = text .. "|T" .. icon .. ":12|t" end
end
end
return text
end
function CG.getQuestObjectiveText(id, objectives, indent, npcId, objectId)
local objectiveList = QT.getQuestObjectives(id)
if objectiveList == nil then return "" end
if objectives == true then
objectives = {}; for i = 1, #objectiveList do objectives[i] = i end
end
local text = ""
if npcId ~= nil and (#objectives ~= 1 or objectiveList[objectives[1]] == nil or (objectiveList[objectives[1]].type ~= "npc" and objectiveList[objectives[1]].type ~= "monster")) then
if QT.getNPCName(npcId) ~= nil then
text = (indent or "") .. "|T" .. addon.icons.monster .. ":12|t" .. QT.getNPCName(npcId)
end
elseif objectId ~= nil and (#objectives ~= 1 or objectiveList[objectives[1]] == nil or objectiveList[objectives[1]].type ~= "object") then
if QT.getObjectName(objectId) ~= nil then
text = (indent or "") .. "|T" .. addon.icons.object .. ":12|t" .. QT.getObjectName(objectId)
end
end
for _, i in ipairs(objectives) do
local o
if CG.quests[id] ~= nil and CG.quests[id].logIndex ~= nil and CG.quests[id].objectives ~= nil then o = CG.quests[id].objectives[i] end
if o == nil and objectiveList[i] ~= nil then
if text ~= "" then text = text .. "\n" end
local type = objectiveList[i].type
if type == nil or addon.icons[type] == nil then type = "COMPLETE" end
text = text .. (indent or "") .. "- " .. "|T" .. addon.icons[type] .. ":12|t" .. (objectiveList[i].names[1] or "")
elseif o ~= nil and not o.done and o.desc ~= nil and o.desc ~= "" then
local icon = CG.getQuestObjectiveIcon(id, i, true)
if text ~= "" then text = text .. "\n" end
text = text .. (indent or "") .. "- " .. icon .. o.desc
end
end
return text
end
function CG.getQuestIcon(questId, t, objective, finished)
if t == "ACCEPT" and (QT.getQuestMinimumLevel(questId) or 0) > D.level then
return "|T" .. addon.icons.ACCEPT_UNAVAILABLE .. ":12|t"
elseif t == "TURNIN" and not finished then
return "|T" .. addon.icons.TURNIN_INCOMPLETE .. ":12|t"
elseif t == "COMPLETE" then
return CG.getQuestObjectiveIcon(questId, objective)
else
return "|T" .. (addon.icons[t] or addon.icons.COMPLETE) .. ":12|t"
end
end
function CG.getElementIcon(element, prevElement)
if element.completed and element.t ~= "GOTO" then
return "|T" .. addon.icons.COMPLETED .. ":12|t"
elseif element.available == false then
return "|T" .. addon.icons.UNAVAILABLE .. ":12|t"
elseif GP.getSuperCode(element.t) == "QUEST" then
return CG.getQuestIcon(element.questId, element.t, element.objective, element.finished)
elseif element.t == "LOC" or element.t == "GOTO" then
if not GuidelimeData.showMapMarkersInGuide then
return ""
elseif element.t == "LOC" and ((prevElement ~= nil and prevElement.t == "LOC") or (element.markerTyp ~= nil)) then
-- Dont show an icon for subsequent LOC elements. Also dont show LOC for quest steps since there would be the same icon twice
return ""
elseif element.mapIndex == 0 and M.arrowFrame ~= nil and GuidelimeDataChar.showArrow then
return M.getArrowIconText()
elseif element.mapIndex ~= nil then
return M.getMapMarkerText(element)
end
elseif element.t == "SPELL" or element.t == "LEARN" or element.t == "SKILL" then
if element.spellId and GetSpellInfo(element.spellId) then
return "|T" .. (select(3, GetSpellInfo(element.spellId)) or addon.icons[element.t]) .. ":12|t"
elseif element.spell and SP.spells[element.spell] then
return "|T" .. (SP.spells[element.spell].icon or addon.icons[element.t]) .. ":12|t"
elseif element.skill then
return "|T" .. SK.getSkillIcon(element.skill) .. ":12|t"
end
elseif element.t == "USE_ITEM" and element.title ~= "" then
return "|T" .. (GetItemIcon(element.useItemId) or addon.icons.item) .. ":12|t"
elseif element.t == "APPLIES" then
local text = ""
if D.contains(element.races, D.race) and element.faction == nil then
--text = text .. "|T" .. addon.icons[D.race:upper()] .. ":12|t"
text = text .. D.getRaceIconText(D.race, D.sex)
end
if D.contains(element.classes, D.class) then
--text = text .. "|T" .. addon.icons[D.class:upper()] .. ":12|t"
text = text .. D.getClassIconText(D.class)
end
return text
elseif addon.icons[element.t] ~= nil and (not prevElement or element.t ~= prevElement.t) then
return "|T" .. addon.icons[element.t] .. ":12|t"
end
return ""
end
function CG.getStepText(step)
local text = ""
local tooltip = ""
local skipTooltip = ""
local skipText = ""
local skipQuests = {}
local trackQuest = {}
local itemText = ""
if GuidelimeData.showLineNumbers and step.line ~= nil then text = text .. step.line .. " " end
if not step.active then
text = text .. GuidelimeData.fontColorInactive
elseif step.manual then
skipTooltip = L.STEP_MANUAL
else
skipTooltip = L.STEP_SKIP
end
local prevElement
for _, element in ipairs(step.elements) do
element.textStartPos = #text
text = text .. CG.getElementIcon(element, prevElement)
if element.available and not element.completed and element.t == "ACCEPT" and (QT.getQuestMinimumLevel(element.questId) or 0) > D.level then
if tooltip ~= "" then tooltip = tooltip .. "\n" end
local q = CG.getQuestText(element.questId, element.t)
tooltip = tooltip .. L.QUEST_REQUIRED_LEVEL:format(q, QT.getQuestMinimumLevel(element.questId))
end
if element.text ~= nil then
if step.active or element.textInactive == nil then
text = text .. element.text
else
text = text .. element.textInactive
end
end
if GP.getSuperCode(element.t) == "QUEST" then
text = text .. CG.getQuestText(element.questId, element.t, element.title, step.active)
if element.available and not element.completed then
if CG.quests[element.questId].lastStep[element.t] == element then
local newSkipQuests = getSkipQuests(element.questId, skipQuests)
if #newSkipQuests > 0 then
if skipText ~= "" then skipText = skipText .. "\n\n" end
if #newSkipQuests == 1 then
skipText = skipText .. L.STEP_FOLLOWUP_QUEST:format(CG.getQuestText(element.questId, element.t)) ..":\n"
else
skipText = skipText .. L.STEP_FOLLOWUP_QUESTS:format(CG.getQuestText(element.questId, element.t)) ..":\n"
end
for _, id in ipairs(newSkipQuests) do
skipText = skipText .. "\n|T" .. addon.icons.UNAVAILABLE .. ":12|t" .. CG.getQuestText(id)
end
if #newSkipQuests == 1 then
skipText = skipText .. "\n\n" .. L.STEP_FOLLOWUP_QUEST_CONT:format(CG.getQuestText(element.questId, element.t))
else
skipText = skipText .. "\n\n" .. L.STEP_FOLLOWUP_QUESTS_CONT:format(CG.getQuestText(element.questId, element.t))
end
end
end
if element.t == "COMPLETE" or element.t == "TURNIN" then
if element.objective == nil then
trackQuest[element.questId] = true
elseif trackQuest[element.questId] ~= true then
if trackQuest[element.questId] == nil then trackQuest[element.questId] = {} end
if not D.contains(trackQuest[element.questId], element.objective) then table.insert(trackQuest[element.questId], element.objective) end
end
end
end
elseif element.t == "COLLECT_ITEM" then
local name,_,rarity = EV.GetItemInfo(element.itemId)
local colour = ITEM_QUALITY_COLORS[1].hex
if name then
if step.active then
colour = ITEM_QUALITY_COLORS[rarity].hex
local iconId = GetItemIcon(element.itemId)
local icon = "|T" .. iconId .. ":12|t"
local count = GetItemCount(element.itemId)
if count >= element.qty then
count = element.qty
end
itemText = string.format("%s\n - %s%s: %d/%d",itemText,icon,name,count,element.qty)
end
end
name = element.title or name
if name and name ~= "" then
if step.active then
text = text .. colour .. name .. "|r"
else
text = text .. name
end
end
elseif element.t == "USE_ITEM" and element.title ~= "" then
local name,_,rarity = EV.GetItemInfo(element.useItemId)
local colour = ITEM_QUALITY_COLORS[1].hex
if name then
if step.active then
colour = ITEM_QUALITY_COLORS[rarity].hex
end
end
name = element.title or name
if name and name ~= "" then
if step.active then
text = text .. colour .. name .. "|r"
else
text = text .. name
end
end
elseif element.t == "TARGET" and element.title ~= "" then
local npc = QT.getNPCName(element.targetNpcId)
text = text .. AB.getTargetButtonIconText(element.targetNpcId)
local name = element.title or npc
if name and name ~= "" then
if step.active then
text = text .. MW["COLOR_" .. QT.isFriendlyNpc(element.targetNpcId)] .. name .. "|r"
else
text = text .. name
end
end
elseif element.t == "SPELL" and element.title ~= "" then
local name = element.title or SP.getLocalizedName(element.spell)
if name and name ~= "" then
if step.active then
text = text .. MW.COLOR_WHITE .. name .. "|r"
else
text = text .. name
end
end
elseif element.t == "SKILL" and step.active then
local rank, max = SK.getSkillRank(element.skill)
if rank then
itemText = string.format("\n - %d/%d", rank, element.skillMin)
end
end
if element.textStartPos == #text then element.empty = true end
if element.empty == nil or not element.empty then prevElement = element end
end
if step.skippedQuests ~= nil and #step.skippedQuests > 0 then
if tooltip ~= "" then tooltip = tooltip .. "\n" end
tooltip = tooltip .. "|T" .. addon.icons.UNAVAILABLE .. ":12|t"
tooltip = tooltip .. L.SKIPPING_QUEST
elseif step.missingPrequests ~= nil and #step.missingPrequests > 0 then
if tooltip ~= "" then tooltip = tooltip .. "\n" end
tooltip = tooltip .. "|T" .. addon.icons.UNAVAILABLE .. ":12|t"
if #step.missingPrequests == 1 then
tooltip = tooltip .. L.MISSING_PREQUEST
else
tooltip = tooltip .. L.MISSING_PREQUESTS
end
for _, id in ipairs(step.missingPrequests) do
tooltip = tooltip .. " " ..CG.getQuestText(id)
end
end
for id, objectives in pairs(trackQuest) do
if step.active then
text = text .. "\n" .. CG.getQuestObjectiveText(id, objectives, " ")
else
if tooltip ~= "" then tooltip = tooltip .. "\n" end
tooltip = tooltip .. CG.getQuestObjectiveText(id, objectives)
end
end
text = text .. itemText
return text, tooltip, skipText, skipTooltip
end
function CG.updateStepText(i)
local step = CG.currentGuide.steps[i]
if MW.mainFrame.steps == nil or MW.mainFrame.steps[i] == nil or MW.mainFrame.steps[i].textBox == nil or not MW.mainFrame.steps[i].visible then return end
local text, tooltip, skipText, skipTooltip = CG.getStepText(step)
if text ~= MW.mainFrame.steps[i].textBox:GetText() then
MW.mainFrame.steps[i].textBox:SetText(text)
end
MW.mainFrame.steps[i].skipText = skipText
if GuidelimeData.showTooltips then
MW.mainFrame.steps[i].textBox.tooltip = tooltip
MW.mainFrame.steps[i].tooltip = skipTooltip
else
MW.mainFrame.steps[i].textBox.tooltip = nil
MW.mainFrame.steps[i].tooltip = nil
end
end
local function updateStepCompletion(i, completedIndexes)
local step = CG.currentGuide.steps[i]
local autoCompleteStep
local wasCompleted = step.completed
if not step.manual then step.completed = nil end
step.itemsCollected = nil
for _, element in ipairs(step.elements) do
if element.t == "ACCEPT" then
element.completed = CG.quests[element.questId].completed or CG.quests[element.questId].logIndex ~= nil
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
elseif element.t == "COMPLETE" then
element.completed =
CG.quests[element.questId].completed or
CG.quests[element.questId].finished or
(element.objective ~= nil and
CG.quests[element.questId].objectives ~= nil and
CG.quests[element.questId].objectives[element.objective] ~= nil and
CG.quests[element.questId].objectives[element.objective].done)
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
elseif element.t == "TURNIN" then
element.finished = CG.quests[element.questId].finished
element.completed = CG.quests[element.questId].completed
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
elseif element.t == "XP" then
element.completed = element.level <= D.level
if element.xp ~= nil and element.level == D.level then
if element.xpType == "REMAINING" then
if element.xp < (D.xpMax - D.xp) then element.completed = false end
elseif element.xpType == "PERCENTAGE" then
if D.xpMax == 0 or element.xp > (D.xp / D.xpMax) then element.completed = false end
else
if element.xp > D.xp then element.completed = false end
end
end
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
elseif element.t == "REPUTATION" then
element.completed = D.isRequiredReputation(element.reputation, element.repMin, element.repMax)
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
elseif element.t == "LEARN" or element.t == "SKILL" then
if element.spell then
element.completed = SP.isRequiredSpell(element.spell, element.spellMin, element.spellMax)
elseif element.skill then
element.completed = SK.isRequiredSkill(element.skill, element.skillMin, nil, element.maxSkillMin)
end
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
elseif element.t == "COLLECT_ITEM" and step.active then
if (element.qty > 0 and GetItemCount(element.itemId) >= element.qty) or (element.qty == 0 and GetItemCount(element.itemId) == 0) then
element.completed = true
if step.itemsCollected == nil then step.itemsCollected = true end
else
element.completed = false
step.itemsCollected = false
end
if step.completed == nil or not element.completed then step.completed = element.completed end
autoCompleteStep = true
end
end
-- check goto last so that go to does not matter when all other objectives are completed
local nonGotoCompleted = step.completed or wasCompleted
for _, element in ipairs(step.elements) do
if element.t == "GOTO" then
--if addon.debugging then print("LIME : zone coordinates", x, y, element.mapID) end
if nonGotoCompleted then--step.skip check was redundant, this fixes a bug where you were unable to manually reactivate skipped goto steps
element.completed = true
elseif element.attached ~= nil and element.attached.completed then
element.completed = true
elseif element.completed and not element.lastGoto and element.attached == nil then
-- do not reactivate unless it is the last goto of the step
elseif D.wx ~= nil and D.wy ~= nil and element.wx ~= nil and element.wy ~= nil and D.instance == element.instance and D.isAlive() and step.active then
local radius = element.radius * element.radius
-- add some hysteresis
if element.completed then radius = radius * CG.GOTO_HYSTERESIS_FACTOR end
element.completed = (D.wx - element.wx) * (D.wx - element.wx) + (D.wy - element.wy) * (D.wy - element.wy) <= radius
else
element.completed = false
end
if step.completed == nil or not element.completed then step.completed = element.completed end
end
end
if step.completed == nil then step.completed = step.completeWithNext and wasCompleted end
--skips the completeWithNext check if the step is already complete, fixing a bug where the step persisted even when all elements were complete
if not step.completed and i < #CG.currentGuide.steps and step.completeWithNext ~= nil and step.completeWithNext then
local nstep = CG.currentGuide.steps[i + 1]
local c = nstep.completed or nstep.skip or not nstep.available
if step.completed ~= c then
--if addon.debugging then print("LIME: complete with next ", i - 1, c, nstep.skip, nstep.available) end
step.completed = c
end
end
if step.completed ~= wasCompleted and not D.contains(completedIndexes, i) then
if not autoCompleteStep then
GuidelimeDataChar.completedSteps[step.index] = step.completed
end
table.insert(completedIndexes, i)
end
end
local function updateStepAvailability(i, changedIndexes, scheduled)
local step = CG.currentGuide.steps[i]
local wasAvailable = step.available
step.available = nil
step.missingPrequests = {}
step.skippedQuests = {}
for _, element in ipairs(step.elements) do
element.available = true
if element.t == "ACCEPT" then
if not element.completed then
local missingPrequests = QT.getMissingPrequests(element.questId, function(id) return CG.quests[id].completed or scheduled.TURNIN[id] end)
if #missingPrequests > 0 then
element.available = false
CG.currentGuide.unavailableQuests[element.questId] = true
for _, id in ipairs(missingPrequests) do
if not D.contains(step.missingPrequests, id) then
table.insert(step.missingPrequests, id)
end
end
end
end
elseif element.t == "COMPLETE" or element.t == "TURNIN" then
if not scheduled.ACCEPT[element.questId] and not element.completed and CG.quests[element.questId].logIndex == nil then
element.available = false
if scheduled.SKIP[element.questId] then
if not D.contains(step.skippedQuests, element.questId) then
table.insert(step.skippedQuests, element.questId)
end
else
if not D.contains(step.missingPrequests, element.questId) then
table.insert(step.missingPrequests, element.questId)
end
end
end
end
if element.t == "ACCEPT" or element.t == "COMPLETE" or element.t == "TURNIN" then
if not step.skip and element.available then
scheduled[element.t][element.questId] = true
elseif not scheduled[element.t][element.questId] and step.skip and not element.completed and CG.quests[element.questId].lastStep[element.t] == element then
element.available = false
scheduled.SKIP[element.questId] = true
end
if not element.completed then step.available = step.available or false or element.available end
elseif element.t == "XP" or element.t == "REPUTATION" or element.t == "LEARN" or element.t == "SKILL" then
if not element.completed then step.available = true end
end
end
if step.available == nil then step.available = true end
if step.manual and not step.completed then step.available = true end
if step.available ~= wasAvailable and not D.contains(changedIndexes, i) then
table.insert(changedIndexes, i)
end
end
local function updateStepsCompletion(changedIndexes)
--if addon.debugging then print("LIME: update steps completion") end
CG.currentGuide.unavailableQuests = {}
repeat
local numNew = #changedIndexes
local scheduled = {ACCEPT = {}, COMPLETE = {}, TURNIN = {}, SKIP = {}}
for i, step in ipairs(CG.currentGuide.steps) do
if not step.skip then
updateStepCompletion(i, changedIndexes)
if step.itemsCollected and step.completed then
step.skip = true --once all items are collected, don't re-enable the step again if you lose the item later
end
updateStepAvailability(i, changedIndexes, scheduled)
if MW.mainFrame.steps ~= nil and MW.mainFrame.steps[i] ~= nil and MW.mainFrame.steps[i].visible then
MW.mainFrame.steps[i]:SetChecked(step.completed or step.skip)
MW.mainFrame.steps[i]:SetEnabled(not step.completed or step.skip)
end
end
end
until(numNew == #changedIndexes)
--if addon.debugging then print("LIME: changed", #changedIndexes) end
end
function CG.stepIsVisible(step)
return ((not step.completed and (not step.skip or not step.available)) or GuidelimeDataChar.showCompletedSteps) and
(step.available or GuidelimeDataChar.showUnavailableSteps) and
D.hasRequirements(step)
end
local function keepFading()
local update = false
local isFading = false
for i, step in ipairs(CG.currentGuide.steps) do
if step.fading ~= nil then
if not CG.stepIsVisible(step) then
step.active = false
--if addon.debugging then print("LIME: fade out", i, step.fading) end
if step.fading <= 0 then
step.fading = nil
--if addon.debugging then print("LIME: fade out", i) end
update = true
else
step.fading = step.fading - 0.2
if step.fading < 0 then step.fading = 0 end
if MW.mainFrame.steps ~= nil and MW.mainFrame.steps[i] ~= nil and MW.mainFrame.steps[i].visible then
MW.mainFrame.steps[i]:SetAlpha(step.fading)
end
isFading = true
end
else
step.fading = nil
if MW.mainFrame.steps ~= nil and MW.mainFrame.steps[i] ~= nil and MW.mainFrame.steps[i].visible then MW.mainFrame.steps[i]:SetAlpha(1) end
end
end
end
if isFading then
C_Timer.After(0.1, function()
keepFading()
end)
elseif update and (not GuidelimeDataChar.showCompletedSteps or not GuidelimeDataChar.showUnavailableSteps) then
MW.updateMainFrame()
end
end
local function fadeoutStep(indexes)
for _, i in ipairs(indexes) do
local step = CG.currentGuide.steps[i]
step.fading = 1
end
keepFading()
end
function CG.stopFading()
for _, step in ipairs(CG.currentGuide.steps) do
step.fading = nil
end
end
function CG.updateStepsActivation()
CG.currentGuide.activeQuests = {}
CG.currentGuide.activeQuestNpcs = {}
for i, step in ipairs(CG.currentGuide.steps) do
step.active = not step.completed and not step.skip and step.available and D.hasRequirements(step)
if step.active then
for j, pstep in ipairs(CG.currentGuide.steps) do
if j == i then break end
if not pstep.optional and not pstep.skip and not pstep.completed and pstep.available and D.hasRequirements(pstep) then
step.active = false
break
end
end
end
if step.active then
if not step.wasActive then
loadQuestStepOnActivation(i)
end
for _, element in ipairs(step.elements) do
if not element.completed and (element.t == "ACCEPT" or element.t == "TURNIN") then
table.insert(CG.currentGuide.activeQuests, element.questId)
end
if element.questNpcs ~= nil then
for _, npc in ipairs(element.questNpcs) do
table.insert(CG.currentGuide.activeQuestNpcs, npc.id)
end
end
end
end
end
for i, step in ipairs(CG.currentGuide.steps) do
if step.active and not step.wasActive then
loadStepOnActivation(i)
step.wasActive = true
end
end
-- accepting a follow up: maybe a quest dialog is still open and the quest just became active? try to accept it in that case
if not IsShiftKeyDown() and EV.isQuestAuto(GuidelimeData.autoAcceptQuests, EV.lastQuestOpened) then
AcceptQuest()
end
end
local function updateFirstActiveIndex()
local oldFirstActiveIndex = CG.currentGuide.firstActiveIndex
CG.currentGuide.firstActiveIndex = nil
CG.currentGuide.lastActiveIndex = nil
for i, step in ipairs(CG.currentGuide.steps) do
if (step.active or step.fading ~= nil) then
if CG.currentGuide.firstActiveIndex == nil then CG.currentGuide.firstActiveIndex = i end
CG.currentGuide.lastActiveIndex = i
end
end
if MW.mainFrame.message ~= nil then
for _, message in ipairs(MW.mainFrame.message) do
if CG.currentGuide.firstActiveIndex ~= nil then
message:Hide()
else
message:Show()
end
end
end
if addon.debugging then print("LIME: firstActiveIndex ", CG.currentGuide.firstActiveIndex) end
return oldFirstActiveIndex ~= CG.currentGuide.firstActiveIndex
end
function CG.getQuestActiveObjectives(id, objective)
local objectiveList = QT.getQuestObjectives(id)
if objectiveList == nil then return {} end
local objectives
if objective == nil then
objectives = {}; for i = 1, #objectiveList do objectives[i] = i end
else
objectives = {objective}
end
local active = {}
for _, i in ipairs(objectives) do
local o
if CG.quests[id] ~= nil and CG.quests[id].logIndex ~= nil and CG.quests[id].objectives ~= nil then o = CG.quests[id].objectives[i] end
if o == nil or (not o.done and o.desc ~= nil and o.desc ~= "") then
table.insert(active, i)
end
end
return active
end
function CG.isQuestObjectiveActive(questId, searchObjectives, filterObjective)
if questId == nil or searchObjectives == nil then return true end
local objectives = CG.getQuestActiveObjectives(questId, filterObjective)
local found = false
for _, o in ipairs(searchObjectives) do
if D.contains(objectives, o) or o > #QT.getQuestObjectives(questId) then found = true; break; end
end
return found
end
function CG.updateStepsText()
--if addon.debugging then print("LIME: update step texts") end
if MW.mainFrame == nil then return end
if CG.currentGuide == nil then return end
for i in ipairs(CG.currentGuide.steps) do
CG.updateStepText(i)
end
end
function CG.scrollToFirstActive()
C_Timer.After(0.2, function()
if MW.mainFrame:GetTop() then
local top = CG.currentGuide.firstActiveIndex ~= nil and
MW.mainFrame.steps ~= nil and
MW.mainFrame.steps[CG.currentGuide.firstActiveIndex] ~= nil and
MW.mainFrame.steps[CG.currentGuide.firstActiveIndex]:GetTop() ~= nil and
MW.mainFrame.steps[CG.currentGuide.firstActiveIndex]:GetTop() + MW.GAP
local bottom = MW.mainFrame.bottomElement and MW.mainFrame.bottomElement:GetBottom()
for _, message in ipairs(MW.mainFrame.message or {}) do
if message:IsShown() then
bottom = message:GetBottom()
if not top then top = message:GetTop() + MW.GAP end
end
end
if bottom and MW.mainFrame.scrollFrame:GetTop() - bottom + MW.mainFrame.scrollFrame:GetVerticalScroll() <= MW.mainFrame.scrollFrame:GetHeight() then
MW.mainFrame.scrollFrame:SetVerticalScroll(0)
elseif bottom and top and top < bottom + MW.mainFrame.scrollFrame:GetHeight() then
MW.mainFrame.scrollFrame:SetVerticalScroll(MW.mainFrame.scrollFrame:GetVerticalScroll() +
MW.mainFrame.scrollFrame:GetTop() - bottom - MW.mainFrame.scrollFrame:GetHeight())
elseif top then
MW.mainFrame.scrollFrame:SetVerticalScroll(MW.mainFrame.scrollFrame:GetVerticalScroll() +
MW.mainFrame.scrollFrame:GetTop() - top)
end
if addon.debugging then print("LIME: scrollToFirstActive", MW.mainFrame.scrollFrame:GetVerticalScroll(), CG.currentGuide.firstActiveIndex and CG.currentGuide.steps[CG.currentGuide.firstActiveIndex] and CG.currentGuide.steps[CG.currentGuide.firstActiveIndex].line) end
end
end)
end
function CG.updateSteps(completedIndexes)
if MW.mainFrame == nil then return end
if CG.currentGuide == nil then return end
if F.showingTooltip then GameTooltip:Hide(); F.showingTooltip = false end
local customCodeData = CC.customCodeData
local isStepActive = {}
if customCodeData then
for i,v in ipairs(customCodeData) do
if v.data and v.data.step then
isStepActive[i] = v.data.step.active
if v.OnStepUpdate then
v.OnStepUpdate(v.data,v.args,"OnStepUpdate")
end
end
end
end
--local time
--if addon.debugging then time = debugprofilestop() end
--if addon.debugging then print("LIME: update steps " .. GetTime()) end
if completedIndexes == nil then completedIndexes = {} end
updateStepsCompletion(completedIndexes)
--if addon.debugging then print("LIME: updateStepsCompletion " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
CG.updateStepsActivation()
--if addon.debugging then print("LIME: updateStepsActivation " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
fadeoutStep(completedIndexes)
--if addon.debugging then print("LIME: fadeoutStep " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
local scrollToFirstActive = updateFirstActiveIndex()
--if addon.debugging then print("LIME: updateFirstActiveIndex " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
M.updateStepsMapIcons()
--if addon.debugging then print("LIME: updateStepsMapIcons " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
AB.updateTargetButtons()
AB.updateUseItemButtons()
CG.updateStepsText()
if scrollToFirstActive then CG.scrollToFirstActive() end
--if addon.debugging then print("LIME: updateStepsText " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
if customCodeData then
for i,v in ipairs(customCodeData) do
if v.data and v.data.step then
local step = v.data.step
if v.OnStepActivation and step.active and not isStepActive[i] then
--print(step.index)
v.OnStepActivation(v.data,v.args,"OnStepActivation")
elseif v.OnStepCompletion and isStepActive[i] == not step.active and (step.completed or step.skip) then
v.OnStepCompletion(v.data,v.args,"OnStepCompletion")
end
end
end
end
end
function CG.setStepSkip(value, a, b)
if a == nil then a = 1; b = #CG.currentGuide.steps end
if b == nil then b = a end
local indexes = {}
for i = a, b do
local step = CG.currentGuide.steps[i]
step.skip = value
GuidelimeDataChar.guideSkip[CG.currentGuide.name][i] = step.skip
GuidelimeDataChar.completedSteps[i] = GuidelimeDataChar.completedSteps[i] and value
table.insert(indexes, i)
end
if not value and not GuidelimeDataChar.showUnavailableSteps then
MW.updateMainFrame()
else
CG.updateSteps(indexes)
end
end
function CG.skipCurrentSteps()
if CG.currentGuide ~= nil and CG.currentGuide.firstActiveIndex ~= nil and
CG.currentGuide.lastActiveIndex ~= nil then
CG.setStepSkip(true, CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex)
end
end
function CG.forEveryActiveElement(func)
if CG.currentGuide ~= nil and CG.currentGuide.firstActiveIndex ~= nil and
CG.currentGuide.lastActiveIndex ~= nil then
for i = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
local step = CG.currentGuide.steps[i]
--if addon.debugging then print("LIME:", step.text, step.optional) end
for _, element in ipairs(step.elements) do
if not element.completed then
if func(element) == false then return end
end
end
end
end
end
function CG.completeSemiAutomaticByType(t)
CG.forEveryActiveElement(function(element)
if not element.completed and element.t == t then
CG.completeSemiAutomatic(element)
return false
end
end)
end
function CG.completeSemiAutomatic(element)
element.completed = true
local step = element.step
local complete = true
if not step.manual and not step.optional then
for _, element in ipairs(step.elements) do
if not element.completed and
(element.t == "ACCEPT" or
element.t == "COMPLETE" or
element.t == "TURNIN" or
element.t == "XP" or
element.t == "REPUTATION" or
element.t == "LEARN" or
element.t == "SKILL") then
CG.updateSteps()
return
end
end
end
GuidelimeDataChar.completedSteps[step.index] = true
step.skip = true
CG.updateSteps({step.index})
end
function CG.getElementByTextPos(pos, step)
for j, element in ipairs(CG.currentGuide.steps[step].elements) do
if element.textStartPos > pos then return j - 1 end
end
return #CG.currentGuide.steps[step].elements
end
function CG.simulateCompleteCurrentSteps()
if CG.currentGuide ~= nil and CG.currentGuide.firstActiveIndex ~= nil and
CG.currentGuide.lastActiveIndex ~= nil then
--if addon.debugging then print("LIME:", CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex) end
for i = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
local step = CG.currentGuide.steps[i]
--if addon.debugging then print("LIME:", step.text, step.optional) end
for _, element in ipairs(step.elements) do
if not element.completed then
if element.t == "ACCEPT" then
if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
CG.quests[element.questId].logIndex = -1
elseif element.t == "COMPLETE" then
if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
CG.quests[element.questId].finished = true
elseif element.t == "TURNIN" then
if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
CG.quests[element.questId].completed = true
end
end
end
end
CG.updateSteps()
end
end
================================================
FILE: Guidelime/CustomCode.lua
================================================
local addonName, addon = ...
local L = addon.L
addon.D = addon.D or {}; local D = addon.D -- Data/Data
addon.CC = addon.CC or {}; local CC = addon.CC -- CustomCode
function CC.parseCustomLuaCode()
CC.wipeFrameData()
local guide = addon.guides[GuidelimeDataChar.currentGuide]
if not (guide and guide.group) then return end
local groupTable = Guidelime[guide.group]
if not groupTable then Guidelime[guide.group] = true end
if type(groupTable) == "table" then
local frameCounter = 0
groupTable.__index = groupTable
for stepLine, step in ipairs(guide.steps) do
if D.applies(step) then
if step.eval and step.event then
local args = {}
local eval = nil
for arg in step.eval:gmatch('[^,]+') do
if not eval then
eval = arg:gsub("%s","")
else
local c = string.match(arg,"^%s*(.*%S+)%s*$")
if c then table.insert(args,c) end
end
end
if eval then
frameCounter = frameCounter + 1
step.event = step.event:gsub("%s","")
if step.event == "" then
step.event = groupTable[eval]() or "OnStepActivation"
end
local eventList = {}
for event in step.event:gmatch('[^,]+') do
table.insert(eventList,event)
end
CC.registerStep(groupTable,eventList,eval,args,frameCounter,guide,step)
end
end
end
end
end
end
function CC.registerStep(self,eventList,eval,args,frameCounter,guide,step)
if frameCounter > #CC.customCodeData+1 then
return
end
if #CC.customCodeData < frameCounter then
table.insert(CC.customCodeData,CreateFrame("Frame"))
end
if type(self[eval]) ~= "function" then
return
end
local frame = CC.customCodeData[frameCounter]
frame.data = {}
frame.data.guide = guide
frame.data.step = step
frame.args = args
setmetatable(frame.data, self)
local function EventHandler(s,...) --Executes the function if step is active or if it's specified on a 0 element step (e.g. guide name)
if s.data.step.active or #s.data.step.elements == 0 or s.data.persistent then
self[eval](s.data,args,...)
end
end
local OnUpdate
for _,eventRaw in pairs(eventList) do
local event = {}
eventRaw:gsub("[^:]+",function(e)
table.insert(event,e)
end)
--print(eval,event)
if event[1] == "OnUpdate" then
OnUpdate = true
frame:SetScript("OnUpdate",EventHandler)
elseif event[1] == "OnLoad" then
self[eval](frame.data,args,"OnLoad")
elseif event[1] == "OnStepActivation" then
frame.OnStepActivation = self[eval]
elseif event[1] == "OnStepCompletion" then
frame.OnStepCompletion = self[eval]
elseif event[1] == "OnStepUpdate" then
frame.OnStepUpdate = self[eval]
else
if #event == 1 then
if not pcall(frame.RegisterEvent,frame,event[1]) then
print("Error loading guide: Ignoring invalid event name at line "..step.line..": "..event[1])
end
else
if not pcall(frame.RegisterUnitEvent,frame,unpack(event)) then
print("Error loading guide: Ignoring invalid event name at line "..step.line)
end
end
end
end
if not OnUpdate then
CC.customCodeData[frameCounter]:SetScript("OnEvent",EventHandler)
end
end
function CC.wipeFrameData()
if not CC.customCodeData then
CC.customCodeData = {}
end
for _,frame in pairs(CC.customCodeData) do
frame:SetScript("OnUpdate", nil)
frame:SetScript("OnEvent", nil)
frame:UnregisterAllEvents()
frame.OnStepActivation = nil
frame.OnStepCompletion = nil
frame.OnStepUpdate = nil
frame.args = nil
if frame.data then
frame.data.persistent = nil
frame.data.timer = nil
end
frame.data = nil
end
end
================================================
FILE: Guidelime/Data/ClassicCodex.lua
================================================
local addonName, addon = ...
local L = addon.L
local HBD = LibStub("HereBeDragons-2.0")
addon.D = addon.D or {}; local D = addon.D -- Data/Data
addon.DM = addon.DM or {}; local DM = addon.DM -- Data/MapDB
addon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools
addon.GP = addon.GP or {}; local GP = addon.GP -- GuideParser
addon.CLASSIC_CODEX = addon.CLASSIC_CODEX or {}; local CLASSIC_CODEX = addon.CLASSIC_CODEX -- Data/ClassicCodex
function CLASSIC_CODEX.isDataSourceInstalled()
return CodexDB ~= nil
end
function CLASSIC_CODEX.getQuestIDs()
local ids = {}
for id, q in pairs(CodexDB.quests.data) do
table.insert(ids, id)
end
return ids
end
function CLASSIC_CODEX.isQuestId(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return false end
return CodexDB.quests.data[id] ~= nil
end
function CLASSIC_CODEX.getQuestName(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.loc[id]
if quest == nil then return end
return quest.T
end
-- not supported
function CLASSIC_CODEX.getQuestSort(id) return nil end
function CLASSIC_CODEX.getQuestPrequests(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
if quest.pre ~= nil then return type(quest.pre) == "number" and {quest.pre} or quest.pre end
if quest.preg ~= nil then return type(quest.preg) == "number" and {quest.preg} or quest.preg end
end
function CLASSIC_CODEX.getQuestOneOfPrequests(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
return quest.pre ~= nil
end
-- not supported
function CLASSIC_CODEX.getQuestType(id) return nil end
function CLASSIC_CODEX.getQuestLevel(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
return quest.lvl
end
function CLASSIC_CODEX.getQuestMinimumLevel(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
return quest.min
end
function CLASSIC_CODEX.getQuestNext(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
return quest.next
end
function CLASSIC_CODEX.getQuestRaces(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
local bitmask = quest.race
if bitmask == nil or bitmask == 0 then return end
local races = {}
for i, race in ipairs({"Human", "Orc", "Dwarf", "NightElf", "Undead", "Tauren", "Gnome", "Troll", "", "BloodElf", "Draenei"}) do
if race ~= "" and D.hasbit(bitmask, D.bit(i)) then
table.insert(races, race)
end
end
return races
end
function CLASSIC_CODEX.getQuestClasses(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
local bitmask = quest.class
if bitmask == nil or bitmask == 0 then return end
local classes = {}
for i, class in pairs({"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "Druid"}) do
if class ~= "" and D.hasbit(bitmask, D.bit(i)) then
table.insert(classes, class)
end
end
return classes
end
function CLASSIC_CODEX.getQuestFaction(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
local bitmask = quest.race
if bitmask == nil then return end
if bitmask == 77 or bitmask == 1101 then return "Alliance" end
if bitmask == 178 or bitmask == 690 then return "Horde" end
end
function CLASSIC_CODEX.getQuestObjective(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.loc[id]
if quest == nil then return end
return quest.O
end
function CLASSIC_CODEX.getQuestReputation(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
if quest.repu ~= nil then
return quest.repu.id, quest.repu.min
end
end
function CLASSIC_CODEX.getQuestPositions(id, typ, index, filterZone)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
if index == 0 then index = nil end
if type(index) == "number" then index = {index} end
local ids = {npc = {}, object = {}, item = {}}
local objectives = {npc = {}, object = {}, item = {}}
if GP.getSuperCode(typ) == "QUEST" then
for i, o in ipairs(QT.getQuestObjectives(id, typ) or {}) do
if index == nil or D.contains(index, i) then
local type = o.type == "monster" and "npc" or o.type
for _, oid in ipairs(o.ids[type]) do
table.insert(ids[type], oid)
if objectives[type][oid] == nil then objectives[type][oid] = {} end
table.insert(objectives[type][oid], i)
end
end
end
elseif typ == "COLLECT_ITEM" then
ids.item = {id}
objectives.item[id] = {}
else
return
end
for _, itemId in ipairs(ids.item) do
local item = CodexDB.items.data[itemId]
--if item == nil then error("item " .. itemId .. " not found for quest " .. questid .. typ) end
--if addon.debugging then print("LIME: item", itemId .. " " .. item[6]) end
if item ~= nil then
if item.U ~= nil then
for npcId, chance in pairs(item.U) do
if not D.contains(ids.npc, npcId) then table.insert(ids.npc, npcId) end
if objectives.npc[npcId] == nil then objectives.npc[npcId] = {} end
for _, c in ipairs(objectives.item[itemId]) do table.insert(objectives.npc[npcId], c) end
end
end
if item.O ~= nil then
for objectId, chance in pairs(item.O) do
if not D.contains(ids.object, objectId) then table.insert(ids.object, objectId) end
if objectives.object[objectId] == nil then objectives.object[objectId] = {} end
for _, c in ipairs(objectives.item[itemId]) do table.insert(objectives.object[objectId], c) end
end
end
end
end
local positions = {}
local filterZoneId
if filterZone ~= nil then filterZoneId = DM.mapIDs[filterZone] end
for _, npcId in ipairs(ids.npc) do
local npc = CodexDB.units.data[npcId]
--if npc == nil then error("npc " .. npcId .. " not found for quest " .. questid .. typ) end
--if addon.debugging then print("LIME: npc", npc[1]) end
if npc ~= nil and npc.coords ~= nil then
for _, pos in ipairs(npc.coords) do
if filterZone == nil or filterZone == CodexMap.zones[pos[3]] then
table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], npcId = npcId, objectives = objectives.npc[npcId]})
end
end
end
end
for _, objectId in ipairs(ids.object) do
local object = CodexDB.objects.data[objectId]
--if object == nil then error("object " .. objectId .. " not found for quest " .. id .. typ) end
--if addon.debugging then print("LIME: object", object[1]) end
if object ~= nil and object.coords ~= nil then
for _, pos in ipairs(object.coords) do
if filterZone == nil or filterZone == CodexMap.zones[pos[3]] then
table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], objectId = objectId, objectives = objectives.object[objectId]})
end
end
end
end
local i = 1
while i <= #positions do
local pos = positions[i]
if pos.wx == -1 and pos.wy == -1 then
-- locations inside instances are marked with -1,-1
table.remove(positions, i)
else
pos.mapID = DM.mapIDs[pos.zone]
pos.wx, pos.wy, pos.instance = HBD:GetWorldCoordinatesFromZone(pos.x / 100, pos.y / 100, pos.mapID)
--if addon.debugging then print("LIME: found position", pos.wx, pos.wy, pos.instance) end
if pos.wx == nil then
if addon.debugging then print("LIME: error transforming (", pos.x, ",", pos.y, pos.zone, DM.mapIDs[pos.zone], ") into world coordinates for quest #", id) end
table.remove(positions, i)
else
i = i + 1
end
end
end
--if addon.debugging then print("LIME: found ", #positions, "positions") end
return positions
end
function CLASSIC_CODEX.getNPCPositions(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local positions = {}
local npc = CodexDB.units.data[id]
--if npc == nil then error("npc " .. npcId .. " not found for quest " .. questid .. typ) end
--if addon.debugging then print("LIME: npc", npc[1]) end
if npc ~= nil and npc.coords ~= nil then
for _, pos in ipairs(npc.coords) do
table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], npcId = id})
end
end
local i = 1
while i <= #positions do
local pos = positions[i]
if pos.wx == -1 and pos.wy == -1 then
-- locations inside instances are marked with -1,-1
table.remove(positions, i)
else
pos.mapID = DM.mapIDs[pos.zone]
pos.wx, pos.wy, pos.instance = HBD:GetWorldCoordinatesFromZone(pos.x / 100, pos.y / 100, pos.mapID)
--if addon.debugging then print("LIME: found position", pos.wx, pos.wy, pos.instance) end
if pos.wx == nil then
if addon.debugging then print("LIME: error transforming (", pos.x, ",", pos.y, pos.zone, DM.mapIDs[pos.zone], ") into world coordinates for npc #", id) end
table.remove(positions, i)
else
i = i + 1
end
end
end
--if addon.debugging then print("LIME: found ", #positions, "positions") end
return positions
end
function CLASSIC_CODEX.getItemPositions(id, typ, index, filterZone)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local ids = {npc = {}, object = {}}
local item = CodexDB.items.data[id]
if item ~= nil then
if item.U ~= nil then
for npcId, chance in pairs(item.U) do
if not D.contains(ids.npc, npcId) then table.insert(ids.npc, npcId) end
end
end
if item.O ~= nil then
for objectId, chance in pairs(item.O) do
if not D.contains(ids.object, objectId) then table.insert(ids.object, objectId) end
end
end
end
local positions = {}
for _, npcId in ipairs(ids.npc) do
local npc = CodexDB.units.data[npcId]
--if npc == nil then error("npc " .. npcId .. " not found for quest " .. questid .. typ) end
--if addon.debugging then print("LIME: npc", npc[1]) end
if npc ~= nil and npc.coords ~= nil then
for _, pos in ipairs(npc.coords) do
table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], npcId = npcId})
end
end
end
for _, objectId in ipairs(ids.object) do
local object = CodexDB.objects.data[objectId]
--if object == nil then error("object " .. objectId .. " not found for quest " .. id .. typ) end
--if addon.debugging then print("LIME: object", object[1]) end
if object ~= nil and object.coords ~= nil then
for _, pos in ipairs(object.coords) do
if filterZone == nil or filterZone == CodexMap.zones[pos[3]] then
table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], objectId = objectId})
end
end
end
end
local i = 1
while i <= #positions do
local pos = positions[i]
if pos.wx == -1 and pos.wy == -1 then
-- locations inside instances are marked with -1,-1
table.remove(positions, i)
else
pos.mapID = DM.mapIDs[pos.zone]
pos.wx, pos.wy, pos.instance = HBD:GetWorldCoordinatesFromZone(pos.x / 100, pos.y / 100, pos.mapID)
--if addon.debugging then print("LIME: found position", pos.wx, pos.wy, pos.instance) end
if pos.wx == nil then
if addon.debugging then print("LIME: error transforming (", pos.x, ",", pos.y, pos.zone, DM.mapIDs[pos.zone], ") into world coordinates for item #", id) end
table.remove(positions, i)
else
i = i + 1
end
end
end
--if addon.debugging then print("LIME: found ", #positions, "positions") end
return positions
end
function CLASSIC_CODEX.getQuestNPCs(id, typ, index)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local ids = {npc = {}, object = {}, item = {}}
local objectives = {npc = {}, object = {}, item = {}}
if GP.getSuperCode(typ) == "QUEST" then
for i, o in ipairs(QT.getQuestObjectives(id, typ) or {}) do
if index == nil or index == 0 or index == i then
local type = o.type == "monster" and "npc" or o.type
for _, oid in ipairs(o.ids[type]) do
table.insert(ids[type], oid)
if objectives[type][oid] == nil then objectives[type][oid] = {} end
table.insert(objectives[type][oid], i)
end
end
end
elseif typ == "COLLECT_ITEM" then
ids.item = {id}
objectives.item[id] = {}
else
return
end
for _, itemId in ipairs(ids.item) do
local item = CodexDB.items.data[itemId]
if item ~= nil then
if item.U ~= nil then
for npcId, chance in pairs(item.U) do
if not D.contains(ids.npc, npcId) then table.insert(ids.npc, npcId) end
if objectives.npc[npcId] == nil then objectives.npc[npcId] = {} end
for _, c in ipairs(objectives.item[itemId]) do table.insert(objectives.npc[npcId], c) end
end
end
end
end
local npcs = {}
for _, id in ipairs(ids.npc) do
table.insert(npcs, {id = id; objectives = objectives.npc[id]})
end
return npcs
end
-- returns a type (npc/item/object) and a list of names for quest source / each objective / turn in; e.g. {{type="item", names={"Huge Gnoll Claw", "Hogger"}, ids={item={1931},npc={448}} for id = 176, typ = "COMPLETE"
function CLASSIC_CODEX.getQuestObjectives(id, typ)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
if typ == "ACCEPT" then
list = quest.start
elseif typ == "COMPLETE" then
list = quest.obj
elseif typ == "TURNIN" then
list = quest["end"]
else
return
end
if list == nil then return end
--if addon.debugging then print("LIME: getQuestObjectives " .. typ .. " " .. id .. " " .. #list) end
local objectives = {}
if list.U ~= nil then
for _, npcId in ipairs(list.U) do
local npcName = CodexDB.units.loc[npcId]
table.insert(objectives, {type = typ == "COMPLETE" and "monster" or "npc", names = {npcName or npcId}, ids = {npc = {npcId}}})
end
end
if list.O ~= nil then
for _, objId in ipairs(list.O) do
local objName = CodexDB.objects.loc[objId]
table.insert(objectives, {type = "object", names = {objName or objId}, ids = {object = {objId}}})
end
end
local idsReceived = {}
if list.IR ~= nil then
for _, itemId in ipairs(list.IR) do
idsReceived[itemId] = true
end
end
if list.I ~= nil then
for _, itemId in ipairs(list.I) do
if not idsReceived[itemId] then
local itemName = CodexDB.items.loc[itemId]
local objective = {type = "item", names = {itemName or itemId}, ids = {item = {itemId}}}
local item = CodexDB.items.data[itemId]
if item ~= nil then
if item.U ~= nil then
objective.ids.npc = {}
for unitId, chance in pairs(item.U) do
table.insert(objective.ids.npc, unitId)
local npcName = CodexDB.units.loc[unitId]
if npcName and not D.contains(objective.names, npcName) then table.insert(objective.names, npcName) end
end
end
if item.O ~= nil then
objective.ids.object = {}
for objectId, chance in pairs(item.O) do
table.insert(objective.ids.object, objectId)
local objName = CodexDB.objects.loc[objectId]
if objName and not D.contains(objective.names, objName) then table.insert(objective.names, objName) end
end
end
end
table.insert(objectives, objective)
end
end
end
-- apply corrections for objective order
if typ == "COMPLETE" and CLASSIC_CODEX.correctionsObjectiveOrder[id] then
local objectives2 = {}
for i, j in ipairs(CLASSIC_CODEX.correctionsObjectiveOrder[id]) do
objectives2[i] = objectives[j]
end
objectives = objectives2
end
-- apply corrections for missing objectives
-- e.g. kill credit objectives as in https://tbc.wowhead.com/quest=10482/fel-orc-scavengers
-- or https://tbc.wowhead.com/quest=9935/wanted-giselda-the-crone (kill credit + kill)
if typ == "COMPLETE" and CLASSIC_CODEX.correctionsObjectives[id] then
for i, o in pairs(CLASSIC_CODEX.correctionsObjectives[id]) do
objectives[i] = o
end
end
return objectives
end
function CLASSIC_CODEX.getQuestItems(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
local quest = CodexDB.quests.data[id]
if quest == nil then return end
if quest.obj == nil then return end
local items = {}
if quest.obj.IR ~= nil then
for _, itemId in ipairs(quest.obj.IR) do
table.insert(items, itemId)
end
end
if quest.obj.I ~= nil then
for _, itemId in ipairs(quest.obj.I) do
if not D.contains(items, itemId) then
table.insert(items, itemId)
end
end
end
return items
end
function CLASSIC_CODEX.getNPCName(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
return CodexDB.units.loc[id]
end
function CLASSIC_CODEX.getObjectName(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
return CodexDB.objects.loc[id]
end
function CLASSIC_CODEX.getItemName(id)
if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
return CodexDB.items.loc[id]
end
================================================
FILE: Guidelime/Data/ClassicCodexCorrections.lua
================================================
local addonName, addon = ...
-- add kill credit objectives as these are not supported by ClassicCodex
addon.CLASSIC_CODEX.correctionsObjectives = {
[11537] = {
[2] = {
["type"] = "monster",
["ids"] = {
["npc"] = {
24999, -- [1]
25001, -- [2]
25002, -- [3]
25008, -- [4]
25068, -- [5]
},
},
["names"] = {
"Burning Legion Demon", -- [1]
},
},
},
[9670] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
17681, -- [1]
17680, -- [2]
},
},
["names"] = {
"Expedition Researcher Freed", -- [1]
"Expedition Researcher", -- [2]
},
}, -- [1]
},
[11538] = {
[2] = {
["type"] = "monster",
["ids"] = {
["npc"] = {
24999, -- [1]
25001, -- [2]
25002, -- [3]
25008, -- [4]
25068, -- [5]
},
},
["names"] = {
"Burning Legion Demon", -- [1]
},
},
},
[11174] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
4392, -- [1]
4393, -- [2]
4394, -- [3]
},
},
["names"] = {
"Oozes Dissolved", -- [1]
"Corrosive Swamp Ooze", -- [2]
},
}, -- [1]
},
[10562] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
21786, -- [1]
21419, -- [2]
},
},
["names"] = {
"Infernal Attacker", -- [1]
},
}, -- [1]
},
[10702] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
21864, -- [1]
21878, -- [2]
21879, -- [3]
22145, -- [4]
23020, -- [5]
21978, -- [6]
},
},
["names"] = {
"Shadowmoon Valley Wildlife", -- [1]
},
}, -- [1]
},
[9935] = {
[2] = {
["type"] = "monster",
["ids"] = {
["npc"] = {
17146, -- [1]
17147, -- [2]
17148, -- [3]
18397, -- [4]
18658, -- [5]
21276, -- [6]
},
},
["names"] = {
"Kil'sorrow Agent", -- [1]
},
},
},
[10873] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
22459, -- [1]
22355, -- [2]
},
},
["names"] = {
"Sha'tar Warrior Freed", -- [1]
"Freed Sha'tar Warrior", -- [2]
},
}, -- [1]
},
[10545] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19998, -- [1]
20334, -- [2]
20723, -- [3]
20726, -- [4]
20730, -- [5]
20731, -- [6]
20732, -- [7]
21296, -- [8]
21975, -- [9]
19995, -- [10]
},
},
["names"] = {
"Bladespire Ogres drunken", -- [1]
"Bladespire Brute", -- [2]
},
}, -- [1]
},
[10703] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
21864, -- [1]
21878, -- [2]
21879, -- [3]
22145, -- [4]
23020, -- [5]
21978, -- [6]
},
},
["names"] = {
"Shadowmoon Valley Wildlife", -- [1]
},
}, -- [1]
},
[10184] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
20934, -- [1]
19881, -- [2]
},
},
["names"] = {
"Severed Spirit", -- [1]
},
}, -- [1]
},
[10502] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19948, -- [1]
19952, -- [2]
19956, -- [3]
19957, -- [4]
19992, -- [5]
20095, -- [6]
20116, -- [7]
21238, -- [8]
21254, -- [9]
21294, -- [10]
21319, -- [11]
19991, -- [12]
},
},
["names"] = {
"Bloodmaul Ogres killed", -- [1]
"Bloodmaul Brute", -- [2]
},
}, -- [1]
},
[10864] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
16867, -- [1]
16870, -- [2]
16878, -- [3]
19295, -- [4]
19312, -- [5]
19410, -- [6]
19411, -- [7]
19413, -- [8]
19414, -- [9]
19415, -- [10]
22334, -- [11]
},
},
["names"] = {
"Shattered Hand Souls Reaped", -- [1]
"Shattered Hand Orc", -- [2]
},
}, -- [1]
},
[11169] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
4344, -- [1]
4345, -- [2]
},
},
["names"] = {
"Totem Tests Performed", -- [1]
"Mottled Drywallow Crocolisk", -- [2]
},
}, -- [1]
},
[10836] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
21717, -- [1]
21718, -- [2]
21719, -- [3]
21720, -- [4]
22251, -- [5]
22252, -- [6]
22274, -- [7]
22331, -- [8]
23188, -- [9]
23209, -- [10]
23213, -- [11]
22197, -- [12]
},
},
["names"] = {
"Dragonmaw Orc", -- [1]
},
}, -- [1]
},
[10503] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19998, -- [1]
20334, -- [2]
20723, -- [3]
20726, -- [4]
20730, -- [5]
20731, -- [6]
20732, -- [7]
21296, -- [8]
21975, -- [9]
19995, -- [10]
},
},
["names"] = {
"Bladespire Ogres killed", -- [1]
"Bladespire Brute", -- [2]
},
}, -- [1]
},
[11096] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
22143, -- [1]
22144, -- [2]
22148, -- [3]
23022, -- [4]
23450, -- [5]
},
},
["names"] = {
"Gordunni Ogre", -- [1]
"Gordunni Proxy", -- [2]
},
}, -- [1]
},
[10595] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
21786, -- [1]
21419, -- [2]
},
},
["names"] = {
"Infernal Attacker", -- [1]
},
}, -- [1]
},
[10813] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19440, -- [1]
22177, -- [2]
},
},
["names"] = {
"Eye of Grillok Returned", -- [1]
"Eye of Grillok Quest Credit Bunny", -- [2]
},
}, -- [1]
},
[10504] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19998, -- [1]
20334, -- [2]
20723, -- [3]
20726, -- [4]
20730, -- [5]
20731, -- [6]
20732, -- [7]
21296, -- [8]
21975, -- [9]
19995, -- [10]
},
},
["names"] = {
"Bladespire Ogres killed", -- [1]
"Bladespire Brute", -- [2]
},
}, -- [1]
},
[10512] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19998, -- [1]
20334, -- [2]
20723, -- [3]
20726, -- [4]
20730, -- [5]
20731, -- [6]
20732, -- [7]
21296, -- [8]
21975, -- [9]
19995, -- [10]
},
},
["names"] = {
"Bladespire Ogres drunken", -- [1]
"Bladespire Brute", -- [2]
},
}, -- [1]
},
[10505] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
19948, -- [1]
19952, -- [2]
19956, -- [3]
19957, -- [4]
19992, -- [5]
20095, -- [6]
20116, -- [7]
21238, -- [8]
21254, -- [9]
21294, -- [10]
21319, -- [11]
19991, -- [12]
},
},
["names"] = {
"Bloodmaul Ogres killed", -- [1]
"Bloodmaul Brute", -- [2]
},
}, -- [1]
},
[11086] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
22341, -- [1]
22342, -- [2]
22343, -- [3]
22363, -- [4]
22393, -- [5]
23393, -- [6]
},
},
["names"] = {
"Deathshadow Agent", -- [1]
},
}, -- [1]
},
[11156] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
23595, -- [1]
23594, -- [2]
},
},
["names"] = {
"Direhorn Grimtotems killed", -- [1]
"Grimtotem Destroyer", -- [2]
},
}, -- [1]
},
[10482] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
16876, -- [1]
16925, -- [2]
17595, -- [3]
18952, -- [4]
19701, -- [5]
21161, -- [6]
},
},
["names"] = {
"Bonechewer Orc", -- [1]
},
}, -- [1]
},
[11885] = {
[4] = {
["type"] = "monster",
["ids"] = {
["npc"] = {
23204, -- [1]
23162, -- [2]
},
},
["names"] = {
"Vakkiz the Windrager", -- [1]
},
},
},
[9936] = {
[2] = {
["type"] = "monster",
["ids"] = {
["npc"] = {
17146, -- [1]
17147, -- [2]
17148, -- [3]
18397, -- [4]
18658, -- [5]
21276, -- [6]
},
},
["names"] = {
"Kil'sorrow Agent", -- [1]
},
},
},
[8346] = {
{
["type"] = "monster",
["ids"] = {
["npc"] = {
15294, -- [1]
15274, -- [2]
},
},
["names"] = {
"Mana Tap creature", -- [1]
"Mana Wyrm", -- [2]
},
}, -- [1]
},
}
-- correct order of objectives where ClassicCodex does not have objectives in the same order as in quest log
addon.CLASSIC_CODEX.correctionsObjectiveOrder = {
[8167] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[24] = {
},
[10221] = {
1, -- [1]
},
[8191] = {
2, -- [1]
1, -- [2]
},
[10269] = {
},
[3085] = {
},
[4129] = {
},
[3093] = {
},
[4145] = {
1, -- [1]
3, -- [2]
4, -- [3]
2, -- [4]
},
[3101] = {
},
[3105] = {
},
[3109] = {
},
[10397] = {
1, -- [1]
2, -- [2]
},
[3117] = {
},
[3121] = {
},
[10445] = {
2, -- [1]
1, -- [2]
},
[392] = {
},
[10493] = {
2, -- [1]
1, -- [2]
},
[393] = {
},
[10541] = {
},
[3161] = {
1, -- [1]
},
[4281] = {
},
[10621] = {
},
[10637] = {
1, -- [1]
},
[8606] = {
1, -- [1]
},
[8622] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10685] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[6384] = {
},
[10733] = {
},
[8702] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10765] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[10797] = {
},
[10813] = {
},
[8782] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[10861] = {
2, -- [1]
1, -- [2]
},
[10877] = {
1, -- [1]
},
[405] = {
},
[10909] = {
1, -- [1]
},
[10941] = {
},
[8910] = {
2, -- [1]
1, -- [2]
},
[408] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8958] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[11021] = {
},
[8990] = {
1, -- [1]
[3] = 2,
},
[9006] = {
2, -- [1]
1, -- [2]
},
[9022] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[411] = {
},
[9054] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9070] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[1649] = {
},
[9102] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9118] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9134] = {
},
[6624] = {
},
[9166] = {
},
[9182] = {
1, -- [1]
},
[9198] = {
1, -- [1]
},
[9214] = {
3, -- [1]
1, -- [2]
4, -- [3]
2, -- [4]
},
[417] = {
[2] = 1,
},
[11293] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[9278] = {
},
[9310] = {
},
[9326] = {
},
[11405] = {
},
[3369] = {
},
[3373] = {
},
[9406] = {
},
[1691] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[9438] = {
},
[11533] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[1701] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[1703] = {
},
[9534] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[6824] = {
2, -- [1]
4, -- [2]
3, -- [3]
1, -- [4]
},
[9582] = {
1, -- [1]
},
[9598] = {
},
[430] = {
},
[4841] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[3449] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
4, -- [5]
},
[9726] = {
2, -- [1]
1, -- [2]
},
[3461] = {
},
[4881] = {
},
[9774] = {
1, -- [1]
},
[11885] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[11933] = {
},
[9902] = {
1, -- [1]
},
[3505] = {
2, -- [1]
1, -- [2]
},
[9934] = {
},
[9950] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[440] = {
},
[3521] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[441] = {
},
[3541] = {
},
[10078] = {
1, -- [1]
3, -- [2]
4, -- [3]
2, -- [4]
},
[444] = {
},
[445] = {
},
[10142] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[446] = {
},
[5089] = {
},
[10190] = {
1, -- [1]
},
[7642] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[2159] = {
},
[449] = {
},
[2239] = {
},
[5145] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[3601] = {
2, -- [1]
1, -- [2]
4, -- [3]
3, -- [4]
},
[1803] = {
},
[8287] = {
},
[8303] = {
},
[11140] = {
1, -- [1]
},
[3621] = {
},
[5201] = {
2, -- [1]
1, -- [2]
},
[3629] = {
},
[5217] = {
},
[5225] = {
[2] = 1,
},
[1821] = {
4, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[456] = {
2, -- [1]
1, -- [2]
},
[10494] = {
2, -- [1]
1, -- [2]
},
[457] = {
2, -- [1]
1, -- [2]
},
[10542] = {
2, -- [1]
1, -- [2]
},
[4987] = {
},
[10574] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[677] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[460] = {
},
[8575] = {
},
[5321] = {
},
[10912] = {
1, -- [1]
},
[8623] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8639] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[8655] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[5361] = {
},
[8687] = {
1, -- [1]
},
[8703] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[465] = {
},
[8735] = {
4, -- [1]
1, -- [2]
3, -- [3]
2, -- [4]
},
[8783] = {
1, -- [1]
2, -- [2]
},
[7841] = {
2, -- [1]
1, -- [2]
4, -- [3]
3, -- [4]
},
[5441] = {
1, -- [1]
},
[10894] = {
},
[7504] = {
},
[5465] = {
},
[8895] = {
},
[8911] = {
2, -- [1]
1, -- [2]
},
[10974] = {
[2] = 1,
},
[10990] = {
1, -- [1]
},
[8959] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[3781] = {
},
[8991] = {
1, -- [1]
2, -- [2]
nil, -- [3]
3, -- [4]
},
[9007] = {
2, -- [1]
1, -- [2]
},
[9039] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9055] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[5561] = {
1, -- [1]
},
[9087] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11150] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[11166] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[9135] = {
},
[7648] = {
},
[5842] = {
},
[9183] = {
1, -- [1]
},
[2942] = {
[2] = 1,
},
[3841] = {
},
[3845] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[11294] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[2975] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[9295] = {
},
[396] = {
},
[7736] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[7066] = {
},
[485] = {
},
[3881] = {
2, -- [1]
1, -- [2]
},
[9391] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[3090] = {
},
[11486] = {
},
[9455] = {
},
[3905] = {
},
[3909] = {
},
[3913] = {
},
[3375] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[3921] = {
},
[491] = {
},
[492] = {
},
[493] = {
},
[5841] = {
},
[31] = {
},
[5881] = {
},
[9727] = {
2, -- [1]
1, -- [2]
},
[7944] = {
},
[11122] = {
1, -- [1]
},
[9775] = {
},
[3823] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[499] = {
},
[9823] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[9839] = {
2, -- [1]
1, -- [2]
},
[10155] = {
1, -- [1]
2, -- [2]
},
[4005] = {
},
[8740] = {
1, -- [1]
2, -- [2]
},
[9903] = {
1, -- [1]
},
[9919] = {
},
[9935] = {
1, -- [1]
},
[9191] = {
1, -- [1]
},
[1114] = {
},
[9999] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[121] = {
},
[10031] = {
2, -- [1]
1, -- [2]
},
[6522] = {
},
[8120] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[1120] = {
},
[10127] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[510] = {
},
[4081] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8168] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[32] = {
},
[8184] = {
2, -- [1]
1, -- [2]
},
[8192] = {
2, -- [1]
1, -- [2]
},
[514] = {
},
[515] = {
1, -- [1]
nil, -- [2]
2, -- [3]
3, -- [4]
},
[516] = {
2, -- [1]
1, -- [2]
},
[6362] = {
},
[6185] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[10335] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[8304] = {
2, -- [1]
1, -- [2]
},
[521] = {
},
[522] = {
},
[4135] = {
},
[524] = {
},
[525] = {
},
[8416] = {
},
[529] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8464] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[531] = {
},
[8496] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[4183] = {
},
[779] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[8544] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[536] = {
2, -- [1]
1, -- [2]
},
[10623] = {
},
[8592] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[539] = {
2, -- [1]
1, -- [2]
},
[8624] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[541] = {
4, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[542] = {
},
[10719] = {
},
[10735] = {
},
[10751] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[1164] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[7522] = {
},
[10815] = {
},
[550] = {
},
[551] = {
},
[5081] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[10895] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[10911] = {
2, -- [1]
1, -- [2]
},
[4450] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[8912] = {
2, -- [1]
1, -- [2]
},
[10991] = {
1, -- [1]
},
[11007] = {
},
[9968] = {
2, -- [1]
1, -- [2]
},
[8992] = {
1, -- [1]
[3] = 2,
},
[11055] = {
1, -- [1]
},
[2258] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9040] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9056] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9072] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9088] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[6601] = {
},
[2282] = {
[2] = 1,
},
[9184] = {
1, -- [1]
},
[9200] = {
1, -- [1]
},
[9232] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[6681] = {
1, -- [1]
},
[4642] = {
[2] = 1,
},
[4382] = {
2, -- [1]
1, -- [2]
},
[383] = {
},
[9328] = {
},
[2338] = {
},
[9360] = {
},
[3065] = {
},
[8183] = {
},
[10738] = {
},
[4121] = {
},
[9440] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[4730] = {
},
[593] = {
},
[11535] = {
[2] = 1,
},
[10301] = {
[2] = 1,
},
[9520] = {
},
[9536] = {
2, -- [1]
1, -- [2]
},
[3097] = {
},
[10349] = {
},
[3113] = {
},
[10413] = {
},
[4810] = {
},
[9632] = {
},
[9648] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[12492] = {
},
[8446] = {
},
[9696] = {
},
[608] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[7668] = {
1, -- [1]
},
[610] = {
},
[4882] = {
},
[8558] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[8574] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[4906] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[9824] = {
1, -- [1]
2, -- [2]
},
[10669] = {
1, -- [1]
},
[8638] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9872] = {
},
[11935] = {
},
[2478] = {
2, -- [1]
3, -- [2]
1, -- [3]
5, -- [4]
6, -- [5]
4, -- [6]
},
[6392] = {
},
[622] = {
},
[7025] = {
2, -- [1]
1, -- [2]
},
[624] = {
},
[7041] = {
1, -- [1]
},
[5002] = {
},
[10749] = {
},
[8766] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[2] = {
},
[407] = {
},
[8942] = {
2, -- [1]
1, -- [2]
},
[632] = {
},
[4481] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[409] = {
1, -- [1]
},
[10144] = {
1, -- [1]
2, -- [2]
},
[5082] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[637] = {
},
[10192] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[10208] = {
2, -- [1]
1, -- [2]
},
[4513] = {
1, -- [1]
},
[641] = {
},
[10256] = {
1, -- [1]
},
[9038] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[10288] = {
},
[645] = {
},
[646] = {
},
[2586] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[11101] = {
},
[10368] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[11117] = {
1, -- [1]
},
[5202] = {
},
[2606] = {
},
[8385] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[654] = {
4, -- [1]
[6] = 1,
[7] = 2,
[4] = 3,
},
[10464] = {
},
[10480] = {
1, -- [1]
},
[10496] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[10512] = {
},
[9086] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[8497] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[413] = {
},
[662] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[10592] = {
},
[8561] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[414] = {
},
[8593] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[1665] = {
},
[668] = {
},
[10688] = {
1, -- [1]
},
[670] = {
},
[1667] = {
1, -- [1]
},
[10736] = {
},
[8705] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[674] = {
},
[8737] = {
1, -- [1]
},
[10800] = {
1, -- [1]
},
[10816] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[8785] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8801] = {
},
[10864] = {
},
[10880] = {
},
[9246] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[7505] = {
},
[10739] = {
},
[8897] = {
},
[8913] = {
2, -- [1]
1, -- [2]
},
[8929] = {
},
[10992] = {
1, -- [1]
},
[2754] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[5514] = {
},
[5522] = {
},
[2766] = {
},
[5538] = {
},
[9041] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9057] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9073] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[697] = {
},
[9105] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9121] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[420] = {
},
[7649] = {
},
[702] = {
},
[9185] = {
1, -- [1]
},
[9201] = {
1, -- [1]
},
[3365] = {
},
[9233] = {
},
[11205] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[708] = {
},
[9281] = {
2, -- [1]
1, -- [2]
},
[9518] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[7729] = {
2, -- [1]
1, -- [2]
},
[9550] = {
},
[11392] = {
},
[11408] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[2858] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[5242] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[717] = {
1, -- [1]
[3] = 2,
},
[7785] = {
},
[2874] = {
},
[5210] = {
},
[5762] = {
},
[11536] = {
[2] = 1,
},
[723] = {
},
[724] = {
},
[725] = {
},
[5146] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[9569] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[728] = {
},
[5050] = {
},
[7929] = {
},
[9633] = {
},
[4986] = {
},
[2930] = {
[2] = 1,
},
[30] = {
[2] = 1,
},
[2938] = {
},
[736] = {
nil, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[2946] = {
},
[2950] = {
2, -- [1]
1, -- [2]
},
[9761] = {
2, -- [1]
1, -- [2]
},
[439] = {
},
[9793] = {
},
[2966] = {
},
[2970] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[3513] = {
},
[2978] = {
},
[2982] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[9103] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9905] = {
1, -- [1]
},
[3785] = {
[3] = 1,
},
[9230] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[3002] = {
},
[9969] = {
2, -- [1]
1, -- [2]
},
[9985] = {
},
[6026] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[5049] = {
},
[3022] = {
},
[10334] = {
},
[8105] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[3561] = {
},
[3569] = {
},
[10129] = {
1, -- [1]
2, -- [2]
},
[10145] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[10702] = {
},
[9331] = {
},
[8169] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[10209] = {
[2] = 1,
},
[8185] = {
2, -- [1]
1, -- [2]
},
[10241] = {
2, -- [1]
1, -- [2]
},
[770] = {
},
[3082] = {
},
[10289] = {
},
[10305] = {
1, -- [1]
},
[3094] = {
},
[3098] = {
},
[3102] = {
},
[777] = {
},
[10385] = {
1, -- [1]
},
[3114] = {
},
[3118] = {
},
[64217] = {
2, -- [1]
1, -- [2]
},
[10449] = {
},
[10465] = {
},
[10481] = {
1, -- [1]
},
[10497] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[6282] = {
1, -- [1]
4, -- [2]
3, -- [3]
2, -- [4]
},
[8482] = {
},
[8498] = {
1, -- [1]
},
[3637] = {
},
[10577] = {
},
[6322] = {
},
[8562] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[793] = {
1, -- [1]
[3] = 2,
},
[10641] = {
1, -- [1]
},
[795] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[8626] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[1805] = {
1, -- [1]
},
[8658] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[6386] = {
},
[10737] = {
},
[8706] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10769] = {
1, -- [1]
2, -- [2]
},
[10785] = {
},
[10801] = {
},
[8770] = {
1, -- [1]
},
[8786] = {
1, -- [1]
},
[8802] = {
},
[453] = {
},
[10881] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[10897] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[10913] = {
2, -- [1]
1, -- [2]
},
[10929] = {
[2] = 1,
},
[8898] = {
},
[10961] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[10977] = {
},
[10993] = {
},
[4483] = {
2, -- [1]
4, -- [2]
3, -- [3]
1, -- [4]
},
[8978] = {
},
[8994] = {
2, -- [1]
[3] = 1,
},
[10430] = {
},
[455] = {
2, -- [1]
1, -- [2]
},
[822] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[9058] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[824] = {
},
[9090] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9106] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[6610] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[11185] = {
},
[11201] = {
[2] = 1,
},
[830] = {
},
[831] = {
},
[9202] = {
1, -- [1]
},
[5233] = {
[2] = 1,
},
[9234] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[9250] = {
},
[9266] = {
2, -- [1]
1, -- [2]
},
[9075] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[8559] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[461] = {
},
[11377] = {
[2] = 1,
},
[3362] = {
2, -- [1]
1, -- [2]
},
[11409] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[3370] = {
},
[3374] = {
1, -- [1]
},
[10734] = {
},
[9426] = {
2, -- [1]
1, -- [2]
},
[4723] = {
},
[4731] = {
},
[10750] = {
},
[11537] = {
1, -- [1]
},
[5385] = {
},
[9522] = {
2, -- [1]
1, -- [2]
},
[853] = {
},
[9554] = {
},
[9112] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[10830] = {
1, -- [1]
},
[9602] = {
},
[9618] = {
},
[8691] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[469] = {
},
[10942] = {
},
[3446] = {
},
[54] = {
},
[864] = {
},
[4867] = {
1, -- [1]
},
[9746] = {
2, -- [1]
1, -- [2]
},
[4883] = {
},
[868] = {
1, -- [1]
},
[9794] = {
},
[9810] = {
2, -- [1]
1, -- [2]
},
[871] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[872] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8627] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[11086] = {
},
[11118] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[9906] = {
2, -- [1]
1, -- [2]
},
[4963] = {
[2] = 1,
},
[3510] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[879] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[3518] = {
},
[3522] = {
},
[3526] = {
},
[883] = {
},
[884] = {
},
[885] = {
},
[3542] = {
},
[7632] = {
},
[5051] = {
[3] = 1,
},
[478] = {
},
[890] = {
},
[3562] = {
},
[892] = {
},
[893] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[894] = {
},
[8946] = {
},
[10226] = {
[2] = 1,
},
[5123] = {
},
[481] = {
},
[8227] = {
},
[900] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[3602] = {
1, -- [1]
},
[5163] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[9247] = {
},
[4186] = {
},
[905] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[906] = {
},
[333] = {
},
[8371] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[909] = {
},
[3638] = {
[2] = 1,
},
[5235] = {
[2] = 1,
},
[10482] = {
},
[10498] = {
2, -- [1]
1, -- [2]
},
[9535] = {
},
[10404] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9631] = {
},
[10562] = {
},
[4294] = {
[2] = 1,
},
[10594] = {
},
[4983] = {
},
[10626] = {
2, -- [1]
1, -- [2]
},
[922] = {
},
[9711] = {
},
[924] = {
1, -- [1]
},
[9826] = {
},
[8659] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[927] = {
},
[928] = {
},
[8707] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[930] = {
},
[931] = {
},
[10802] = {
1, -- [1]
},
[8771] = {
1, -- [1]
},
[8787] = {
2, -- [1]
1, -- [2]
},
[935] = {
},
[7490] = {
},
[7498] = {
},
[7506] = {
},
[940] = {
},
[10946] = {
},
[8915] = {
2, -- [1]
1, -- [2]
},
[59] = {
},
[944] = {
},
[9904] = {
1, -- [1]
},
[3782] = {
},
[947] = {
2, -- [1]
1, -- [2]
},
[9011] = {
2, -- [1]
1, -- [2]
},
[11074] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[9043] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[7602] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[952] = {
},
[11138] = {
},
[9107] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9871] = {
},
[956] = {
},
[7650] = {
},
[6323] = {
},
[9187] = {
1, -- [1]
},
[9203] = {
1, -- [1]
},
[502] = {
},
[9235] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[7810] = {
},
[1118] = {
},
[2019] = {
},
[9299] = {
},
[967] = {
},
[968] = {
},
[138] = {
},
[9330] = {
},
[11195] = {
},
[508] = {
},
[5067] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[7786] = {
1, -- [1]
3, -- [2]
4, -- [3]
2, -- [4]
},
[61] = {
},
[511] = {
},
[9475] = {
1, -- [1]
},
[9491] = {
[2] = 1,
},
[3914] = {
},
[6129] = {
1, -- [1]
},
[513] = {
},
[4146] = {
1, -- [1]
},
[9571] = {
},
[9587] = {
},
[9603] = {
},
[2078] = {
1, -- [1]
},
[5843] = {
},
[5083] = {
},
[9667] = {
1, -- [1]
},
[6241] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9699] = {
},
[527] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[7938] = {
},
[9747] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[6281] = {
},
[262] = {
},
[997] = {
},
[9811] = {
},
[9827] = {
},
[6321] = {
},
[8560] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9875] = {
},
[6361] = {
},
[8640] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9923] = {
1, -- [1]
},
[9939] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[9955] = {
1, -- [1]
},
[8656] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[6385] = {
},
[6027] = {
[2] = 1,
},
[544] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[8704] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10703] = {
},
[2198] = {
},
[3565] = {
},
[4062] = {
},
[10115] = {
2, -- [1]
1, -- [2]
},
[264] = {
},
[12194] = {
},
[1020] = {
},
[4082] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8170] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[1023] = {
1, -- [1]
},
[8186] = {
2, -- [1]
1, -- [2]
},
[1026] = {
1, -- [1]
},
[12306] = {
[2] = 1,
},
[10275] = {
},
[554] = {
},
[10307] = {
1, -- [1]
},
[10943] = {
},
[1038] = {
1, -- [1]
},
[8308] = {
},
[560] = {
},
[4482] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[563] = {
},
[1048] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[8388] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[1052] = {
},
[10467] = {
},
[9008] = {
2, -- [1]
1, -- [2]
},
[10499] = {
2, -- [1]
1, -- [2]
},
[1060] = {
},
[10531] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9024] = {
2, -- [1]
1, -- [2]
},
[9104] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[10579] = {
},
[10595] = {
},
[10611] = {
2, -- [1]
1, -- [2]
},
[4292] = {
1, -- [1]
},
[10643] = {
1, -- [1]
},
[9120] = {
},
[6363] = {
},
[1358] = {
},
[8660] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[6387] = {
},
[8692] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[10755] = {
},
[1092] = {
},
[1094] = {
},
[36] = {
},
[10819] = {
},
[1100] = {
},
[8804] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[578] = {
},
[1106] = {
},
[8411] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[2318] = {
},
[1112] = {
},
[8900] = {
},
[8916] = {
2, -- [1]
1, -- [2]
},
[8932] = {
2, -- [1]
1, -- [2]
},
[8948] = {
},
[4484] = {
4, -- [1]
2, -- [2]
1, -- [3]
3, -- [4]
},
[4492] = {
},
[8996] = {
},
[4508] = {
},
[5155] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[9044] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[71] = {
},
[1136] = {
1, -- [1]
},
[9092] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9108] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[8917] = {
2, -- [1]
1, -- [2]
},
[11407] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[9156] = {
2, -- [1]
1, -- [2]
},
[9172] = {
},
[9188] = {
1, -- [1]
},
[9204] = {
1, -- [1]
},
[9220] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9236] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[9252] = {
2, -- [1]
1, -- [2]
},
[9268] = {
2, -- [1]
1, -- [2]
},
[9074] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9300] = {
},
[4510] = {
},
[9332] = {
},
[2339] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
4, -- [5]
},
[9364] = {
1, -- [1]
},
[4521] = {
2, -- [1]
1, -- [2]
},
[11487] = {
},
[9472] = {
1, -- [1]
},
[2359] = {
1, -- [1]
2, -- [2]
},
[1182] = {
[2] = 1,
},
[4732] = {
},
[594] = {
},
[1188] = {
},
[10242] = {
},
[2383] = {
},
[1194] = {
},
[1196] = {
},
[9109] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9588] = {
},
[9604] = {
},
[5283] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[3181] = {
},
[9616] = {
},
[11020] = {
1, -- [1]
},
[607] = {
},
[620] = {
},
[10152] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9936] = {
1, -- [1]
},
[2439] = {
},
[9764] = {
},
[9780] = {
1, -- [1]
},
[623] = {
},
[9812] = {
},
[9828] = {
},
[9984] = {
},
[1121] = {
},
[1238] = {
},
[2479] = {
},
[9924] = {
1, -- [1]
},
[9940] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[78] = {
},
[10096] = {
2, -- [1]
1, -- [2]
},
[9071] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[10004] = {
},
[2941] = {
},
[7067] = {
[2] = 1,
},
[635] = {
},
[161] = {
},
[1262] = {
},
[8241] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[647] = {
},
[5068] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[10148] = {
},
[5226] = {
},
[5234] = {
},
[1276] = {
},
[80] = {
},
[5531] = {
},
[10244] = {
},
[11186] = {
},
[666] = {
[2] = 1,
},
[1288] = {
},
[8625] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[669] = {
},
[81] = {
},
[8309] = {
nil, -- [1]
2, -- [2]
1, -- [3]
3, -- [4]
},
[8657] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8689] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[2603] = {
2, -- [1]
1, -- [2]
},
[5220] = {
},
[10832] = {
1, -- [1]
},
[10468] = {
},
[5252] = {
},
[7521] = {
1, -- [1]
3, -- [2]
4, -- [3]
2, -- [4]
},
[8485] = {
},
[8501] = {
1, -- [1]
},
[8977] = {
},
[11040] = {
},
[9009] = {
2, -- [1]
1, -- [2]
},
[11072] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[11120] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[10644] = {
},
[9089] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[8629] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[1338] = {
},
[10708] = {
},
[84] = {
},
[10740] = {
},
[10756] = {
},
[10772] = {
},
[8741] = {
},
[8690] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[10820] = {
2, -- [1]
1, -- [2]
},
[10836] = {
},
[8805] = {
1, -- [1]
},
[7483] = {
4, -- [1]
3, -- [2]
1, -- [3]
2, -- [4]
},
[292] = {
},
[7499] = {
},
[7507] = {
},
[1368] = {
},
[8901] = {
},
[10964] = {
},
[10980] = {
1, -- [1]
},
[2751] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[2850] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[2759] = {
},
[9361] = {
1, -- [1]
},
[9013] = {
2, -- [1]
1, -- [2]
},
[2771] = {
2, -- [1]
1, -- [2]
},
[1388] = {
},
[9061] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9077] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9093] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[7627] = {
2, -- [1]
1, -- [2]
},
[7761] = {
},
[7643] = {
[2] = 1,
},
[7651] = {
},
[9173] = {
2, -- [1]
1, -- [2]
},
[9189] = {
},
[9205] = {
1, -- [1]
},
[9409] = {
},
[9237] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[3089] = {
},
[2882] = {
[2] = 1,
},
[9521] = {
},
[1420] = {
},
[89] = {
2, -- [1]
1, -- [2]
},
[2851] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[11412] = {
1, -- [1]
},
[2859] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[5724] = {
},
[727] = {
},
[7787] = {
},
[8350] = {
},
[2879] = {
[5] = 1,
},
[10674] = {
1, -- [1]
},
[11540] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9509] = {
},
[7905] = {
},
[735] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[2903] = {
},
[9573] = {
2, -- [1]
1, -- [2]
},
[1456] = {
1, -- [1]
},
[9605] = {
},
[9621] = {
},
[5844] = {
},
[7907] = {
},
[1468] = {
},
[92] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[2943] = {
},
[2947] = {
},
[7937] = {
},
[7945] = {
},
[1480] = {
},
[739] = {
2, -- [1]
1, -- [2]
},
[9813] = {
},
[2501] = {
1, -- [1]
},
[9845] = {
1, -- [1]
},
[9861] = {
},
[1492] = {
},
[741] = {
},
[11972] = {
},
[2990] = {
},
[94] = {
},
[751] = {
},
[6143] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[6028] = {
},
[400] = {
},
[1512] = {
},
[3201] = {
},
[11065] = {
1, -- [1]
},
[1518] = {
},
[763] = {
},
[10193] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[1524] = {
},
[1526] = {
[2] = 1,
},
[10225] = {
},
[6146] = {
1, -- [1]
},
[8171] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[96] = {
},
[8187] = {
2, -- [1]
1, -- [2]
},
[10245] = {
},
[3086] = {
},
[3083] = {
},
[3087] = {
},
[3091] = {
},
[8278] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[10341] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[3103] = {
},
[3107] = {
},
[8342] = {
2, -- [1]
1, -- [2]
},
[4181] = {
},
[3119] = {
},
[10369] = {
1, -- [1]
},
[8338] = {
},
[10469] = {
},
[781] = {
},
[8470] = {
},
[8486] = {
2, -- [1]
1, -- [2]
},
[8502] = {
1, -- [1]
},
[10545] = {
},
[8534] = {
1, -- [1]
},
[6324] = {
},
[4267] = {
},
[4293] = {
[2] = 1,
},
[8598] = {
},
[10625] = {
1, -- [1]
},
[6364] = {
},
[8594] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8662] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10725] = {
},
[8694] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10757] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[10773] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[10657] = {
1, -- [1]
[3] = 2,
},
[10805] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[10821] = {
1, -- [1]
},
[8790] = {
2, -- [1]
1, -- [2]
},
[10853] = {
1, -- [1]
},
[3182] = {
},
[4421] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[10721] = {
1, -- [1]
},
[8738] = {
1, -- [1]
},
[10817] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[8902] = {
},
[8918] = {
2, -- [1]
1, -- [2]
},
[8934] = {
2, -- [1]
1, -- [2]
},
[8950] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[11013] = {
},
[11029] = {
[2] = 1,
},
[10849] = {
},
[4509] = {
},
[1642] = {
},
[9046] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[1646] = {
},
[9078] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[4451] = {
},
[9110] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[1654] = {
3, -- [1]
2, -- [2]
1, -- [3]
[5] = 4,
},
[1656] = {
},
[4581] = {
},
[8914] = {
2, -- [1]
1, -- [2]
},
[9190] = {
1, -- [1]
},
[9206] = {
1, -- [1]
},
[8930] = {
},
[4621] = {
2, -- [1]
1, -- [2]
},
[819] = {
},
[11089] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[826] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9302] = {
},
[11169] = {
},
[829] = {
},
[9170] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[11413] = {
},
[9186] = {
1, -- [1]
},
[9398] = {
2, -- [1]
1, -- [2]
},
[1690] = {
2, -- [1]
1, -- [2]
},
[1692] = {
},
[106] = {
},
[4733] = {
},
[832] = {
},
[1700] = {
},
[1702] = {
},
[1704] = {
},
[11133] = {
1, -- [1]
},
[3301] = {
},
[107] = {
},
[6844] = {
},
[9606] = {
},
[840] = {
},
[3366] = {
},
[4763] = {
[5] = 1,
},
[9670] = {
},
[9538] = {
},
[11052] = {
},
[10098] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[9698] = {
},
[6922] = {
},
[6962] = {
2, -- [1]
1, -- [2]
},
[2855] = {
2, -- [1]
1, -- [2]
},
[9798] = {
},
[10130] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[12193] = {
},
[10162] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[897] = {
},
[9878] = {
2, -- [1]
1, -- [2]
},
[10306] = {
1, -- [1]
},
[9910] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[3507] = {
},
[3511] = {
},
[902] = {
},
[9974] = {
2, -- [1]
1, -- [2]
},
[7044] = {
2, -- [1]
1, -- [2]
},
[3630] = {
},
[3634] = {
},
[57] = {
2, -- [1]
1, -- [2]
},
[10054] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[10466] = {
},
[10086] = {
2, -- [1]
1, -- [2]
},
[8547] = {
},
[10118] = {
2, -- [1]
1, -- [2]
},
[10134] = {
},
[3563] = {
},
[5085] = {
},
[10182] = {
1, -- [1]
},
[10198] = {
},
[10174] = {
},
[2205] = {
},
[10246] = {
2, -- [1]
1, -- [2]
},
[10722] = {
},
[10278] = {
[2] = 1,
},
[5149] = {
1, -- [1]
},
[1802] = {
},
[1804] = {
1, -- [1]
},
[113] = {
},
[8311] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[10754] = {
},
[8739] = {
1, -- [1]
},
[3627] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[10422] = {
1, -- [1]
},
[3635] = {
},
[3639] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[10470] = {
},
[5245] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
4, -- [5]
},
[10502] = {
},
[8471] = {
},
[939] = {
[2] = 1,
},
[10550] = {
},
[10566] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[10582] = {
2, -- [1]
1, -- [2]
},
[5301] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[941] = {
},
[942] = {
},
[8599] = {
},
[10662] = {
},
[8631] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8931] = {
2, -- [1]
1, -- [2]
},
[10710] = {
},
[116] = {
1, -- [1]
4, -- [2]
2, -- [3]
3, -- [4]
},
[8695] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8711] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10774] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[8979] = {
2, -- [1]
1, -- [2]
},
[3786] = {
[3] = 1,
},
[8775] = {
1, -- [1]
},
[8791] = {
},
[8807] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[7484] = {
4, -- [1]
3, -- [2]
1, -- [3]
2, -- [4]
},
[950] = {
},
[10902] = {
4, -- [1]
2, -- [2]
3, -- [3]
1, -- [4]
},
[7508] = {
},
[8887] = {
},
[8903] = {
[2] = 1,
},
[8919] = {
2, -- [1]
1, -- [2]
},
[8935] = {
2, -- [1]
1, -- [2]
},
[8951] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[9059] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[7564] = {
},
[8999] = {
2, -- [1]
1, -- [2]
},
[3791] = {
[2] = 1,
},
[1898] = {
},
[11094] = {
},
[119] = {
},
[9079] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9095] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9111] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11174] = {
},
[7644] = {
},
[9159] = {
2, -- [1]
1, -- [2]
},
[9175] = {
},
[1918] = {
},
[1920] = {
1, -- [1]
},
[3843] = {
},
[9239] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[9255] = {
},
[11318] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[9091] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[3633] = {
},
[7732] = {
},
[3641] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[7738] = {
},
[10606] = {
2, -- [1]
1, -- [2]
},
[8242] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[5763] = {
},
[11538] = {
1, -- [1]
},
[1948] = {
1, -- [1]
2, -- [2]
},
[9447] = {
1, -- [1]
},
[9731] = {
},
[11542] = {
4, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[7828] = {
2, -- [1]
1, -- [2]
},
[1960] = {
1, -- [1]
},
[3923] = {
},
[5805] = {
},
[123] = {
},
[63] = {
[2] = 1,
},
[6388] = {
},
[9623] = {
},
[9707] = {
},
[6142] = {
[2] = 1,
},
[1978] = {
},
[1016] = {
1, -- [1]
},
[10163] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[6131] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[1024] = {
},
[5901] = {
[2] = 1,
},
[10243] = {
},
[1028] = {
},
[1030] = {
},
[6391] = {
},
[5941] = {
},
[7928] = {
},
[4127] = {
},
[1058] = {
1, -- [1]
4, -- [2]
2, -- [3]
3, -- [4]
},
[8484] = {
},
[9911] = {
},
[8548] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[4284] = {
4, -- [1]
3, -- [2]
1, -- [3]
2, -- [4]
},
[10627] = {
2, -- [1]
1, -- [2]
},
[8596] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[6571] = {
1, -- [1]
4, -- [2]
3, -- [3]
2, -- [4]
},
[6029] = {
},
[1080] = {
1, -- [1]
},
[68] = {
},
[10055] = {
2, -- [1]
1, -- [2]
},
[8708] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[10087] = {
1, -- [1]
2, -- [2]
},
[6607] = {
1, -- [1]
3, -- [2]
4, -- [3]
2, -- [4]
},
[10135] = {
},
[8772] = {
1, -- [1]
},
[10835] = {
},
[4083] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[8] = {
},
[6133] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[12278] = {
},
[2203] = {
1, -- [1]
},
[129] = {
},
[6181] = {
},
[4142] = {
},
[1122] = {
},
[8312] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[1124] = {
},
[9060] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[4182] = {
2, -- [1]
4, -- [2]
3, -- [3]
1, -- [4]
},
[2279] = {
},
[1146] = {
},
[1148] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[10471] = {
},
[10503] = {
},
[6285] = {
},
[1168] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[2118] = {
1, -- [1]
},
[11401] = {
},
[8536] = {
1, -- [1]
},
[8552] = {
},
[74] = {
},
[6341] = {
},
[11539] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[10663] = {
},
[2160] = {
},
[4542] = {
},
[8664] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[136] = {
},
[8696] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8712] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8728] = {
1, -- [1]
4, -- [2]
3, -- [3]
2, -- [4]
},
[8784] = {
},
[10807] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[8776] = {
1, -- [1]
},
[2200] = {
},
[8808] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[9325] = {
},
[6862] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[8856] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[139] = {
},
[10935] = {
1, -- [1]
},
[8904] = {
[2] = 1,
},
[8920] = {
2, -- [1]
1, -- [2]
},
[140] = {
},
[8952] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[5253] = {
},
[1220] = {
},
[141] = {
},
[9016] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[2459] = {
1, -- [1]
[3] = 2,
},
[11095] = {
},
[9064] = {
},
[9080] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9096] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[2280] = {
},
[143] = {
},
[1240] = {
},
[1242] = {
},
[9176] = {
2, -- [1]
1, -- [2]
},
[144] = {
},
[1252] = {
},
[6661] = {
1, -- [1]
},
[9240] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[145] = {
},
[565] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[79] = {
},
[9304] = {
},
[146] = {
},
[9047] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[2340] = {
},
[9368] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[11431] = {
1, -- [1]
},
[7500] = {
},
[6622] = {
},
[5124] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8810] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[4734] = {
},
[4742] = {
4, -- [1]
2, -- [2]
1, -- [3]
3, -- [4]
},
[11543] = {
4, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[149] = {
},
[10712] = {
1, -- [1]
},
[9544] = {
1, -- [1]
},
[4722] = {
},
[9576] = {
},
[6023] = {
2, -- [1]
1, -- [2]
},
[5236] = {
},
[6861] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[602] = {
},
[891] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[10692] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[8661] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[152] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[9720] = {
1, -- [1]
4, -- [2]
3, -- [3]
2, -- [4]
},
[9736] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[2440] = {
},
[10724] = {
1, -- [1]
},
[8693] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8709] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8773] = {
1, -- [1]
},
[154] = {
},
[8789] = {
2, -- [1]
1, -- [2]
},
[6981] = {
},
[9045] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[1392] = {
},
[11156] = {
},
[9301] = {
},
[2871] = {
},
[7029] = {
1, -- [1]
},
[8641] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[2500] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9557] = {
},
[7061] = {
},
[5022] = {
},
[9669] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[683] = {
},
[9781] = {
1, -- [1]
},
[2967] = {
},
[10120] = {
},
[11024] = {
},
[159] = {
},
[10168] = {
1, -- [1]
},
[10184] = {
},
[6004] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[160] = {
},
[2782] = {
},
[8201] = {
1, -- [1]
},
[10197] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[10280] = {
},
[10229] = {
},
[5158] = {
},
[5166] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[162] = {
},
[8313] = {
},
[3095] = {
},
[10392] = {
1, -- [1]
2, -- [2]
},
[5206] = {
1, -- [1]
},
[3099] = {
},
[5222] = {
[2] = 1,
},
[5230] = {
},
[10472] = {
},
[3115] = {
},
[7301] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[5262] = {
},
[737] = {
},
[1582] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[8630] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8537] = {
1, -- [1]
},
[10600] = {
2, -- [1]
1, -- [2]
},
[10741] = {
},
[8585] = {
2, -- [1]
1, -- [2]
},
[8710] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[4381] = {
2, -- [1]
1, -- [2]
},
[8633] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8774] = {
1, -- [1]
},
[8665] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10728] = {
},
[8697] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[8806] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[10776] = {
1, -- [1]
[3] = 2,
},
[10792] = {
1, -- [1]
4, -- [2]
2, -- [3]
3, -- [4]
},
[10808] = {
1, -- [1]
},
[7461] = {
2, -- [1]
1, -- [2]
},
[10840] = {
2, -- [1]
1, -- [2]
},
[8809] = {
1, -- [1]
2, -- [2]
},
[7485] = {
4, -- [1]
3, -- [2]
1, -- [3]
2, -- [4]
},
[6564] = {
},
[8857] = {
},
[5462] = {
},
[8889] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[8905] = {
2, -- [1]
1, -- [2]
},
[8921] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[172] = {
},
[2752] = {
2, -- [1]
1, -- [2]
},
[2756] = {
2, -- [1]
1, -- [2]
},
[2760] = {
},
[5526] = {
[2] = 1,
},
[9017] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[2772] = {
2, -- [1]
1, -- [2]
},
[9049] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11093] = {
1, -- [1]
},
[9081] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11144] = {
[2] = 1,
},
[9113] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[8322] = {
},
[9238] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[11208] = {
},
[9177] = {
},
[3110] = {
},
[3122] = {
},
[4725] = {
},
[9241] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[6804] = {
1, -- [1]
},
[4765] = {
},
[1712] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[1714] = {
},
[178] = {
},
[2848] = {
2, -- [1]
1, -- [2]
},
[2852] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[2856] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[2860] = {
},
[9401] = {
},
[7781] = {
},
[11041] = {
1, -- [1]
2, -- [2]
},
[2876] = {
},
[9042] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9154] = {
},
[1243] = {
},
[9513] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9052] = {
2, -- [1]
1, -- [2]
},
[842] = {
},
[10872] = {
2, -- [1]
1, -- [2]
},
[7861] = {
2, -- [1]
1, -- [2]
},
[3523] = {
},
[351] = {
},
[10009] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[5061] = {
},
[3482] = {
},
[2932] = {
},
[5141] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[9705] = {
},
[3566] = {
2, -- [1]
1, -- [2]
},
[2948] = {
2, -- [1]
1, -- [2]
},
[5902] = {
},
[5229] = {
[2] = 1,
},
[3643] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[10518] = {
},
[164] = {
},
[2972] = {
},
[2976] = {
},
[9865] = {
2, -- [1]
1, -- [2]
},
[8535] = {
1, -- [1]
},
[9897] = {
},
[1838] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[1846] = {
[2] = 1,
},
[9945] = {
2, -- [1]
1, -- [2]
},
[5341] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[8777] = {
1, -- [1]
},
[6022] = {
[2] = 1,
},
[6030] = {
},
[8663] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10726] = {
},
[1858] = {
[3] = 1,
},
[5219] = {
[2] = 1,
},
[10838] = {
[2] = 1,
},
[3642] = {
[2] = 1,
},
[118] = {
},
[10137] = {
1, -- [1]
2, -- [2]
},
[7604] = {
1, -- [1]
},
[10169] = {
},
[10185] = {
2, -- [1]
1, -- [2]
},
[12] = {
2, -- [1]
1, -- [2]
},
[7636] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
4, -- [5]
},
[8189] = {
2, -- [1]
1, -- [2]
},
[3084] = {
},
[3088] = {
},
[10313] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[3096] = {
},
[3100] = {
},
[8314] = {
},
[8330] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[10393] = {
},
[3116] = {
},
[3120] = {
},
[8867] = {
1, -- [1]
2, -- [2]
},
[8410] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[10473] = {
},
[10505] = {
},
[8474] = {
},
[10978] = {
},
[11026] = {
1, -- [1]
},
[5861] = {
},
[10585] = {
1, -- [1]
},
[198] = {
},
[7501] = {
},
[6342] = {
},
[8602] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[199] = {
},
[8634] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[1467] = {
},
[8666] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[6390] = {
},
[8698] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[6568] = {
},
[8940] = {
2, -- [1]
1, -- [2]
},
[8746] = {
1, -- [1]
2, -- [2]
},
[4383] = {
2, -- [1]
1, -- [2]
},
[10825] = {
},
[993] = {
},
[10857] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[10873] = {
},
[8188] = {
2, -- [1]
1, -- [2]
},
[8858] = {
},
[8190] = {
2, -- [1]
1, -- [2]
},
[7783] = {
},
[8906] = {
2, -- [1]
1, -- [2]
},
[8922] = {
},
[8938] = {
2, -- [1]
1, -- [2]
},
[8954] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[8970] = {
[2] = 1,
},
[10183] = {
},
[9002] = {
2, -- [1]
1, -- [2]
},
[4511] = {
},
[11081] = {
},
[9050] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9066] = {
2, -- [1]
1, -- [2]
},
[9082] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9098] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9114] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9130] = {
},
[11193] = {
},
[9162] = {
},
[9178] = {
1, -- [1]
},
[9194] = {
1, -- [1]
},
[7502] = {
},
[6662] = {
},
[9242] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[131] = {
},
[11321] = {
},
[132] = {
},
[1074] = {
},
[9322] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[9338] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[3364] = {
},
[3368] = {
},
[1396] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[8628] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9418] = {
},
[9434] = {
},
[4727] = {
},
[11513] = {
1, -- [1]
},
[4743] = {
1, -- [1]
},
[135] = {
},
[9514] = {
},
[6365] = {
},
[6389] = {
},
[10855] = {
1, -- [1]
},
[6501] = {
},
[9594] = {
1, -- [1]
2, -- [2]
},
[9000] = {
2, -- [1]
1, -- [2]
},
[9626] = {
},
[9048] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11404] = {
},
[11003] = {
},
[9069] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9706] = {
},
[8899] = {
},
[9738] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[8557] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[6124] = {
1, -- [1]
},
[157] = {
},
[4903] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[10216] = {
1, -- [1]
4, -- [2]
3, -- [3]
2, -- [4]
},
[9834] = {
1, -- [1]
},
[2604] = {
2, -- [1]
1, -- [2]
},
[10504] = {
},
[10831] = {
[2] = 1,
},
[7509] = {
[2] = 1,
},
[3504] = {
},
[8953] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[5518] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[220] = {
},
[9033] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[9994] = {
},
[3528] = {
1, -- [1]
},
[11096] = {
},
[5023] = {
},
[9805] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[9097] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[5047] = {
},
[5582] = {
},
[5063] = {
3, -- [1]
1, -- [2]
4, -- [3]
2, -- [4]
},
[8460] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[223] = {
},
[3568] = {
1, -- [1]
2, -- [2]
3, -- [3]
4, -- [4]
},
[10727] = {
},
[14] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[1189] = {
},
[8508] = {
[2] = 1,
},
[5127] = {
2, -- [1]
1, -- [2]
},
[11400] = {
},
[1423] = {
},
[5151] = {
[2] = 1,
},
[8539] = {
1, -- [1]
},
[5167] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[10346] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9030] = {
},
[5862] = {
},
[184] = {
},
[10410] = {
},
[3632] = {
},
[5223] = {
},
[10458] = {
1, -- [1]
2, -- [2]
},
[10474] = {
},
[5247] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[7302] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[8556] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[2609] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[8507] = {
1, -- [1]
},
[5942] = {
},
[10586] = {
1, -- [1]
[3] = 2,
},
[230] = {
},
[9849] = {
1, -- [1]
},
[8587] = {
},
[8603] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[231] = {
},
[5343] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[2980] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[8667] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[232] = {
},
[8699] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[10762] = {
},
[8731] = {
1, -- [1]
},
[233] = {
},
[10810] = {
},
[8779] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[9933] = {
},
[234] = {
},
[8572] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[3106] = {
},
[8859] = {
},
[5463] = {
},
[8891] = {
},
[8907] = {
2, -- [1]
1, -- [2]
},
[8923] = {
},
[8939] = {
2, -- [1]
1, -- [2]
},
[11002] = {
},
[5464] = {
},
[5519] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[9003] = {
2, -- [1]
1, -- [2]
},
[11066] = {
1, -- [1]
},
[114] = {
},
[11098] = {
},
[238] = {
},
[11130] = {
},
[11146] = {
},
[9115] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11178] = {
},
[10297] = {
},
[3092] = {
},
[9179] = {
1, -- [1]
},
[240] = {
},
[3104] = {
},
[3108] = {
},
[9243] = {
3, -- [1]
2, -- [2]
4, -- [3]
1, -- [4]
},
[9259] = {
2, -- [1]
1, -- [2]
},
[8346] = {
},
[3128] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[5144] = {
3, -- [1]
1, -- [2]
2, -- [3]
4, -- [4]
},
[9323] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[8538] = {
1, -- [1]
2, -- [2]
4, -- [3]
3, -- [4]
},
[8586] = {
2, -- [1]
1, -- [2]
},
[64063] = {
2, -- [1]
1, -- [2]
},
[243] = {
},
[5727] = {
},
[10602] = {
1, -- [1]
},
[6570] = {
},
[9451] = {
},
[11514] = {
1, -- [1]
},
[3908] = {
},
[3912] = {
},
[10793] = {
},
[8762] = {
1, -- [1]
2, -- [2]
},
[3924] = {
[3] = 1,
},
[8778] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[63866] = {
1, -- [1]
},
[4463] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[11001] = {
1, -- [1]
},
[9034] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[5847] = {
},
[11097] = {
},
[5863] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[11209] = {
1, -- [1]
},
[7926] = {
},
[9723] = {
3, -- [1]
2, -- [2]
1, -- [3]
4, -- [4]
},
[6626] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[5903] = {
[2] = 1,
},
[4728] = {
},
[210] = {
},
[9803] = {
[2] = 1,
},
[4184] = {
},
[9835] = {
2, -- [1]
1, -- [2]
},
[7908] = {
},
[1429] = {
},
[120] = {
},
[251] = {
},
[10923] = {
1, -- [1]
},
[3884] = {
},
[216] = {
2, -- [1]
1, -- [2]
},
[252] = {
},
[8700] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9995] = {
},
[6261] = {
},
[8632] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[3564] = {
},
[9020] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[2585] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[9292] = {
},
[7735] = {
},
[10123] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[3640] = {
[2] = 1,
},
[255] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[8765] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[8166] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[9996] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[265] = {
},
[1025] = {
4, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[6343] = {
},
[1029] = {
},
[10938] = {
},
[8955] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[9019] = {
1, -- [1]
2, -- [2]
3, -- [3]
},
[9083] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[10347] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9099] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[10651] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[1045] = {
1, -- [1]
2, -- [2]
},
[10411] = {
2, -- [1]
1, -- [2]
},
[11242] = {
},
[263] = {
2, -- [1]
1, -- [2]
},
[1053] = {
4, -- [1]
3, -- [2]
2, -- [3]
1, -- [4]
},
[10475] = {
},
[1057] = {
1, -- [1]
4, -- [2]
3, -- [3]
2, -- [4]
},
[10507] = {
1, -- [1]
},
[8476] = {
2, -- [1]
1, -- [2]
},
[266] = {
},
[1065] = {
},
[4264] = {
},
[8540] = {
1, -- [1]
},
[10603] = {
1, -- [1]
[3] = 2,
},
[10619] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[269] = {
},
[1077] = {
},
[1079] = {
1, -- [1]
},
[2161] = {
},
[7639] = {
},
[8668] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[272] = {
[2] = 1,
},
[1089] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[10763] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[8732] = {
[2] = 1,
},
[274] = {
},
[4384] = {
2, -- [1]
1, -- [2]
},
[8780] = {
2, -- [1]
1, -- [2]
},
[2201] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[10859] = {
1, -- [1]
},
[9467] = {
1, -- [1]
},
[1245] = {
},
[8860] = {
},
[1111] = {
},
[10939] = {
},
[8908] = {
2, -- [1]
1, -- [2]
},
[1117] = {
},
[280] = {
},
[8956] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[323] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[4496] = {
2, -- [1]
1, -- [2]
},
[282] = {
},
[4512] = {
[2] = 1,
[3] = 2,
},
[9036] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[11099] = {
},
[9068] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9084] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9100] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[9116] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[286] = {
},
[1145] = {
},
[1147] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[9180] = {
},
[9196] = {
1, -- [1]
},
[8924] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[8941] = {
2, -- [1]
1, -- [2]
},
[9244] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[5231] = {
[2] = 1,
},
[9276] = {
2, -- [1]
1, -- [2]
},
[291] = {
},
[248] = {
},
[9324] = {
},
[7503] = {
},
[293] = {
},
[11419] = {
},
[9388] = {
2, -- [1]
1, -- [2]
4, -- [3]
3, -- [4]
},
[11451] = {
},
[1179] = {
},
[3112] = {
},
[1183] = {
},
[9468] = {
},
[11531] = {
},
[11547] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9516] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[1193] = {
2, -- [1]
1, -- [2]
},
[10633] = {
},
[1197] = {
[2] = 1,
},
[9195] = {
1, -- [1]
},
[10029] = {
},
[4808] = {
},
[4784] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[9101] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[9389] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[303] = {
1, -- [1]
3, -- [2]
2, -- [3]
4, -- [4]
},
[9692] = {
1, -- [1]
nil, -- [2]
2, -- [3]
3, -- [4]
4, -- [5]
},
[10395] = {
},
[4864] = {
2, -- [1]
1, -- [2]
},
[1219] = {
},
[1221] = {
1, -- [1]
},
[306] = {
},
[10523] = {
},
[1067] = {
},
[268] = {
},
[9836] = {
},
[8620] = {
[9] = 1,
},
[1087] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[1091] = {
},
[1239] = {
},
[1241] = {
},
[311] = {
},
[4976] = {
},
[8764] = {
2, -- [1]
3, -- [2]
4, -- [3]
1, -- [4]
},
[9980] = {
2, -- [1]
1, -- [2]
},
[1251] = {
},
[1253] = {
},
[7063] = {
},
[1103] = {
},
[10060] = {
2, -- [1]
4, -- [2]
1, -- [3]
3, -- [4]
},
[8424] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[5048] = {
},
[5056] = {
1, -- [1]
},
[1119] = {
},
[1269] = {
},
[2241] = {
},
[8989] = {
1, -- [1]
[3] = 2,
},
[5096] = {
},
[10204] = {
},
[10220] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[2561] = {
},
[5128] = {
},
[10268] = {
},
[322] = {
},
[6543] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[5160] = {
},
[8285] = {
},
[8301] = {
1, -- [1]
},
[11051] = {
1, -- [1]
},
[10380] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9148] = {
},
[9164] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[5216] = {
[2] = 1,
},
[12491] = {
},
[5232] = {
},
[328] = {
},
[10492] = {
2, -- [1]
1, -- [2]
},
[329] = {
},
[10524] = {
nil, -- [1]
2, -- [2]
1, -- [3]
3, -- [4]
},
[1319] = {
},
[1321] = {
},
[11403] = {
},
[8541] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[332] = {
},
[8573] = {
2, -- [1]
3, -- [2]
1, -- [3]
4, -- [4]
},
[2661] = {
},
[1175] = {
1, -- [1]
3, -- [2]
2, -- [3]
},
[334] = {
},
[8637] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[11515] = {
1, -- [1]
},
[8669] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[336] = {
},
[8701] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[337] = {
},
[298] = {
},
[9564] = {
},
[10812] = {
},
[8781] = {
1, -- [1]
},
[301] = {
},
[1359] = {
},
[8829] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[7495] = {
},
[8861] = {
},
[1367] = {
},
[10940] = {
},
[8909] = {
2, -- [1]
1, -- [2]
},
[1469] = {
},
[10988] = {
1, -- [1]
},
[2753] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[2757] = {
},
[11036] = {
},
[346] = {
},
[9021] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[2773] = {
2, -- [1]
1, -- [2]
},
[11100] = {
},
[1391] = {
},
[9037] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[1395] = {
},
[7631] = {
1, -- [1]
},
[9133] = {
},
[7647] = {
2, -- [1]
1, -- [2]
},
[9165] = {
1, -- [1]
},
[9181] = {
1, -- [1]
},
[9197] = {
1, -- [1]
},
[9117] = {
3, -- [1]
4, -- [2]
1, -- [3]
2, -- [4]
},
[353] = {
},
[9245] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[354] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[319] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[310] = {
},
[9948] = {
1, -- [1]
},
[2845] = {
},
[2849] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[2853] = {
},
[2857] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[358] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[9405] = {
},
[1435] = {
1, -- [1]
},
[10012] = {
},
[9453] = {
},
[11516] = {
},
[11532] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[9501] = {
},
[10140] = {
},
[10188] = {
1, -- [1]
},
[9549] = {
2, -- [1]
1, -- [2]
},
[320] = {
},
[10252] = {
nil, -- [1]
1, -- [2]
2, -- [3]
3, -- [4]
},
[1457] = {
},
[5248] = {
},
[8621] = {
3, -- [1]
4, -- [2]
2, -- [3]
1, -- [4]
},
[366] = {
},
[1465] = {
},
[2933] = {
},
[23] = {
},
[7927] = {
},
[2945] = {
},
[2949] = {
},
[5904] = {
},
[9773] = {
1, -- [1]
},
[5384] = {
1, -- [1]
},
[371] = {
2, -- [1]
1, -- [2]
},
[2969] = {
},
[1487] = {
1, -- [1]
4, -- [2]
2, -- [3]
3, -- [4]
},
[2977] = {
},
[373] = {
},
[10924] = {
1, -- [1]
},
[8957] = {
2, -- [1]
3, -- [2]
1, -- [3]
},
[1425] = {
},
[375] = {
2, -- [1]
1, -- [2]
},
[9949] = {
3, -- [1]
1, -- [2]
2, -- [3]
},
[376] = {
2, -- [1]
1, -- [2]
},
[9981] = {
2, -- [1]
1, -- [2]
},
[9997] = {
2, -- [1]
1, -- [2]
3, -- [3]
},
[10013] = {
},
[1511] = {
},
[10045] = {
2, -- [1]
1, -- [2]
3, -- [3]
4, -- [4]
},
[1515] = {
},
[9373] = {
},
[5728] = {
2, -- [1]
1, -- [2]
},
[1521] = {
},
[361] = {
},
[370] = {
3, -- [1]
2, -- [2]
1, -- [3]
},
[1527] = {
},
[9821] = {
1, -- [1]
},
[372] = {
2, -- [1]
1, -- [2]
},
}
================================================
FILE: Guidelime/Data/Data.lua
================================================
local addonName, addon = ...
local L = addon.L
local HBD = LibStub("HereBeDragons-2.0")
addon.SK = addon.SK or {}; local SK = addon.SK -- Data/SkillDB
addon.SP = addon.SP or {}; local SP = addon.SP -- Data/SpellDB
addon.D = addon.D or {}; local D = addon.D -- Data/Data
D.factions = {"Alliance", "Horde"}
D.races = {Human = "Alliance", NightElf = "Alliance", Dwarf = "Alliance", Gnome = "Alliance", Orc = "Horde", Troll = "Horde", Tauren = "Horde", Undead = "Horde", Draenei = "Alliance", BloodElf = "Horde", Worgen = "Alliance", Goblin = "Horde", Pandaren = "Neutral"}
D.raceIDs = {Human = 1, NightElf = 4, Dwarf = 3, Gnome = 7, Orc = 2, Troll = 8, Tauren = 6, Undead = 5, BloodElf = 10, Draenei = 11, Worgen = 22, Goblin = 9, Pandaren = 24}
D.classes = {"Warrior", "Rogue", "Mage", "Warlock", "Hunter", "Priest", "Druid", "Paladin", "Shaman", "DeathKnight", "Monk"}
D.classesWithFaction = {}
D.classesPerRace = {
Human = {"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Mage", "Warlock", "DeathKnight", "Monk"},
NightElf = {"Warrior", "Hunter", "Rogue", "Priest", "Mage", "Druid", "DeathKnight", "Monk"},
Dwarf = {"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "DeathKnight", "Monk"},
Gnome = {"Warrior", "Rogue", "Priest", "Mage", "Warlock", "DeathKnight", "Monk"},
Orc = {"Warrior", "Hunter", "Rogue", "Shaman", "Mage", "Warlock", "DeathKnight", "Monk"},
Troll = {"Warrior", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "Druid", "DeathKnight", "Monk"},
Tauren = {"Warrior", "Paladin", "Hunter", "Priest", "Shaman", "Druid", "DeathKnight", "Monk"},
Undead = {"Warrior", "Hunter", "Rogue", "Priest", "Mage", "Warlock", "DeathKnight", "Monk"},
Draenei = {"Hunter", "Mage", "Paladin", "Priest", "Shaman", "Warrior", "DeathKnight", "Monk"},
BloodElf = {"Warrior", "Hunter", "Mage", "Paladin", "Priest", "Rogue", "Warlock", "DeathKnight", "Monk"},
Worgen = {"Warrior", "Hunter", "Rogue", "Priest", "Mage", "Warlock", "Druid", "DeathKnight"},
Goblin = {"Warrior", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "DeathKnight"},
Pandaren = {"Hunter", "Mage", "Monk", "Priest", "Rogue", "Shaman", "Warrior"}
}
function D.getClass(class)
class = class:upper():gsub(" ","")
for i, c in ipairs(D.classes) do
if c:upper() == class then return c end
end
end
function D.getRace(race)
race = race:upper():gsub(" ","")
if race == "SCOURGE" then return "Undead" end
for r, f in pairs(D.races) do
if r:upper() == race then return r end
end
end
function D.getSex(sex)
if type(sex) == "number" then
return sex == 2 and "Male" or "Female"
else
return sex:upper() == "MALE" and "Male" or "Female"
end
end
D.class = D.getClass(select(2, UnitClass("player")))
D.race = D.getRace(select(2, UnitRace("player")))
D.sex = D.getSex(UnitSex("player"))
D.faction = UnitFactionGroup("player")
D.level = UnitLevel("player")
D.xp = UnitXP("player")
D.xpMax = UnitXPMax("player")
D.wx, D.wy, D.instance = HBD:GetPlayerWorldPosition()
D.face = GetPlayerFacing()
D.reputations = {
bootybay = 21,
ironforge = 47,
gnomeregan = 54,
thoriumbrotherhood = 59,
undercity = 68,
darnassus = 69,
syndicate = 70,
stormwind = 72,
orgrimmar = 76,
thunderbluff = 81,
bloodsailbuccaneers = 87,
gelkisclancentaur = 92,
magramclancentaur = 93,
zandalartribe = 270,
ravenholdt = 349,
gadgetzan = 369,
ratchet = 470,
wildhammerclan = 471,
leagueofarathor = 509,
defilers = 510,
argentdawn = 529,
darkspeartrolls = 530,
timbermawhold = 576,
everlook = 577,
wintersabertrainers = 589,
cenarioncircle = 609,
frostwolfclan = 729,
stormpikeguard = 730,
hydraxianwaterlords = 749,
shendralar = 809,
warsongoutriders = 889,
silverwingsentinels = 890,
darkmoonfaire = 909,
broodofnozdormu = 910,
silvermooncity = 911,
tranquillien = 922,
exodar = 930,
aldor = 932,
consortium = 933,
scryers = 934,
shatar = 935,
maghar = 941,
cenarionexpedition = 942,
honorhold = 946,
thrallmar = 947,
violeteye = 967,
sporeggar = 970,
kurenai = 978,
keepersoftime = 989,
scaleofthesands = 990,
lowercity = 1011,
ashtonguedeathsworn = 1012,
netherwing = 1015,
shatariskyguard = 1031,
ogrila = 1038,
shatteredsunoffensive = 1077,
valianceexpedition = 1050,
silvercovenant = 1094,
explorersleague = 1068,
frostborn = 1126,
warsongoffensive = 1085,
sunreavers = 1124,
handofvengeance = 1067,
taunka = 1064,
oracles = 1105,
frenzyhearttribe = 1104,
guild = 1169,
gilneas = 1134,
earthenring = 1135,
guardiansofhyjal = 1158,
therazane = 1171,
dragonmawclan = 1172,
ramkahen = 1173,
wildhammerclan = 1174,
baradinswardens = 1177,
hellscreamsreach = 1178,
avengersofhyjal = 1204,
bilgewatercartel = 1133,
goldenlotus = 1269,
orderofthecloudserpent = 1271,
anglers = 1302,
natpagle = 1358,
tillers = 1272,
augustcelestials = 1341,
shadopan = 1270,
klaxxi = 1337,
shadopanassault = 1435,
lorewalkers = 1345,
blackprince = 1359,
sunreaveronslaught = 1388,
pearlfinjinyu = 1242,
kirintoroffensive = 1387,
operationshieldwall = 1376,
dominanceoffensive = 1375,
tinamudclaw = 1280,
emperorshaohao = 1492,
ella = 1275,
foresthozen = 1228,
shangxisacademy = 1216,
ginamudclaw = 1281,
sho = 1278,
fishfellreed = 1282,
brewmasters = 1351,
cheechee = 1277,
haohanmudclaw = 1279,
akamastrust = 1416,
darkspearrebellion = 1440,
joguthedrunk = 1273,
farmerfung = 1283,
oldhillpaw = 1276
}
D.racesPerFaction = {}
for race, faction in pairs(D.races) do
if D.racesPerFaction[faction] == nil then D.racesPerFaction[faction] = {} end
table.insert(D.racesPerFaction[faction], race)
end
D.classesPerFaction = {}
for i, class in ipairs(D.classes) do
for i, faction in ipairs(D.factions) do
if D.classesWithFaction[class] or faction == faction then
if D.classesPerFaction[faction] == nil then D.classesPerFaction[faction] = {} end
table.insert(D.classesPerFaction[faction], class)
end
end
end
function D.isClass(class)
return D.getClass(class) ~= nil
end
function D.isRace(race)
return D.getRace(race) ~= nil
end
function D.getFaction(faction)
faction = faction:upper()
for i, f in ipairs(D.factions) do
if f:upper() == faction then return f end
end
end
function D.isFaction(faction)
return D.getFaction(faction) ~= nil
end
function D.getLocalizedRace(race)
if C_CreatureInfo == nil then return race end
local raceInfo = C_CreatureInfo.GetRaceInfo(D.raceIDs[race])
return raceInfo and raceInfo.raceName or race
end
function D.getLocalizedClass(class)
return LOCALIZED_CLASS_NAMES_MALE[class:upper()] or class
end
function D.getReputation(rep)
return D.reputations[string.gsub(string.gsub(string.lower(rep), "[' ]", ""), "^the", "")]
end
function D.isReputation(rep)
return D.getReputation(rep) ~= nil
end
function D.getLocalizedReputation(id)
local name = GetFactionInfoByID(id)
return name
end
function D.isRequiredReputation(id, repMin, repMax)
local _, _, standing, _, _, value = GetFactionInfoByID(id)
if repMin ~= nil and value < repMin then return false end
if repMax ~= nil and value >= repMax then return false end
return true
end
function D.contains(array, value)
if not array then return end
for i, v in ipairs(array) do
if type(value) == "function" then
if value(v) then return true end
else
if v == value then return true end
end
end
return false
end
function D.find(array, func)
if not array then return end
for i, v in ipairs(array) do
if func(v) then return v end
end
end
function D.containsIgnoreCase(array, value)
return D.contains(array, function(v) return v:upper() == value:upper() end)
end
function D.containsKey(table, value)
for k, v in pairs(table) do
if type(value) == "function" then
if value(k) then return true end
else
if k == value then return true end
end
end
return false
end
function D.applies(guide)
if guide == nil then return false end
if guide.races ~= nil then
if not D.contains(guide.races, D.race) then return false end
end
if guide.classes ~= nil then
if not D.contains(guide.classes, D.class) then return false end
end
if guide.faction ~= nil and guide.faction ~= D.faction then return false end
return true
end
function D.hasRequirements(guide)
if guide == nil then return true end
if guide.reputation and not D.isRequiredReputation(guide.reputation, guide.repMin, guide.repMax) then return false end
if guide.skillReq and not SK.isRequiredSkill(guide.skillReq, guide.skillMin, guide.skillMax) then return false end
if guide.spellReq and not SP.isRequiredSpell(guide.spellReq, guide.spellMin, guide.spellMax) then return false end
if guide.itemReq and not D.hasItem(guide.itemReq, guide.itemMin, guide.itemMax) then return false end
return true
end
function D.isAlive()
return not UnitIsDeadOrGhost("player")
--return HBD:GetPlayerZone() == nil or C_DeathInfo.GetCorpseMapPosition(HBD:GetPlayerZone()) == nil
end
function D.bit(p)
return 2 ^ (p - 1) -- 1-based indexing
end
-- Typical call: if hasbit(x, bit(3)) then ...
function D.hasbit(x, p)
return x % (p + p) >= p
end
function D.hasItem(itemReq, itemMin, itemMax)
-- note that itemMin is not "minimum number of items", but "greater than" (not "greater or equal"), analog itemMax
-- as pattern match for element.t == "APPLIES" in GuideParser.lua does not allow for <= or >=
local itemcnt = GetItemCount(tonumber(itemReq))
if itemMin ~= nil then return (itemcnt > itemMin) end
if itemMax ~= nil then return (itemcnt < itemMax) end
return nil
end
D.RACE_ICON_TCOORDS = {
["Human"] = {
["Male"] = {0, 0.125, 0, 0.25},
["Female"] = {0, 0.125, 0.5, 0.75},
},
["Dwarf"] = {
["Male"] = {0.125, 0.25, 0, 0.25},
["Female"] = {0.125, 0.25, 0.5, 0.75},
},
["Gnome"] = {
["Male"] = {0.25, 0.375, 0, 0.25},
["Female"] = {0.25, 0.375, 0.5, 0.75},
},
["NightElf"] = {
["Male"] = {0.375, 0.5, 0, 0.25},
["Female"] = {0.375, 0.5, 0.5, 0.75},
},
["Tauren"] = {
["Male"] = {0, 0.125, 0.25, 0.5},
["Female"] = {0, 0.125, 0.75, 1.0},
},
["Undead"] = {
["Male"] = {0.125, 0.25, 0.25, 0.5},
["Female"] = {0.125, 0.25, 0.75, 1.0},
},
["Troll"] = {
["Male"] = {0.25, 0.375, 0.25, 0.5},
["Female"] = {0.25, 0.375, 0.75, 1.0},
},
["Orc"] = {
["Male"] = {0.375, 0.5, 0.25, 0.5},
["Female"] = {0.375, 0.5, 0.75, 1.0},
},
["BloodElf"] = {
["Male"] = {0.5, 0.625, 0.25, 0.5},
["Female"] = {0.5, 0.625, 0.75, 1.0},
},
["Draenei"] = {
["Male"] = {0.5, 0.625, 0, 0.25},
["Female"] = {0.5, 0.625, 0.5, 0.75},
},
["Worgen"] = {
["Male"] = {0.625, 0.75, 0, 0.25},
["Female"] = {0.625, 0.75, 0.5, 0.75},
},
["Goblin"] = {
["Male"] = {0.625, 0.75, 0.25, 0.5},
["Female"] = {0.625, 0.75, 0.75, 1.0},
},
["Pandaren"] = {
["Male"] = {0.75, 0.875, 0, 0.25},
["Female"] = {0.75, 0.875, 0.5, 0.75},
},
};
function D.getRaceIconText(race, sex, size)
local coords = D.RACE_ICON_TCOORDS[D.getRace(race)][D.getSex(sex)]
return "|TInterface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-RACES:" .. (size or 12) .. ":" .. (size or 12) .. ":0:0:128:128:" ..
coords[1] * 128 .. ":" .. coords[2] * 128 .. ":" .. coords[3] * 128 .. ":" .. coords[4] * 128 .. ":::|t"
end
function D.getClassIconText(class, size)
-- cf https://wowpedia.fandom.com/wiki/Class_icon; alternative icon suggestions there as well
local coords = CLASS_ICON_TCOORDS[D.getClass(class):upper()]
return "|TInterface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES:" .. (size or 12) .. ":" .. (size or 12) .. ":0:0:128:128:" ..
coords[1] * 128 .. ":" .. coords[2] * 128 .. ":" .. coords[3] * 128 .. ":" .. coords[4] * 128 .. ":::|t"
end
================================================
FILE: Guidelime/Data/FlightmasterDB.lua
================================================
local addonName, addon = ...
local HBD = LibStub("HereBeDragons-2.0")
addon.DM = addon.DM or {}; local DM = addon.DM -- Data/MapDB
addon.PT = addon.PT or {}; local PT = addon.PT -- Data/PositionTools
addon.FM = addon.FM or {}; local FM = addon.FM -- Data/FlightmasterDB
FM.flightmasterDB = {
[2] = {npcId = 352, zone = "Stormwind City", name = "Dungar Longdrink", place = "Stormwind", faction = "Alliance", id = 2},
[4] = {npcId = 523, zone = "Westfall", name = "Thor", place = "Sentinel Hill", faction = "Alliance", id = 4},
[5] = {npcId = 931, zone = "Redridge Mountains", name = "Ariena Stormfeather", place = "Lakeshire", faction = "Alliance", id = 5},
[20] = {npcId = 1387, zone = "Stranglethorn Vale", name = "Thysta", place = "Grom'gol Base Camp", faction = "Horde", id = 20},
[7] = {npcId = 1571, zone = "Wetlands", name = "Shellei Brondir", place = "Menethil Harbor", faction = "Alliance", id = 7},
[8] = {npcId = 1572, zone = "Loch Modan", name = "Thorgrum Borrelson", place = "Thelsamar", faction = "Alliance", id = 8},
[6] = {npcId = 1573, zone = "Ironforge", name = "Gryth Thurden", faction = "Alliance", id = 6},
[10] = {npcId = 2226, zone = "Silverpine Forest", name = "Karos Razok", place = "The Sepulcher", faction = "Horde", id = 10},
[71] = {npcId = 2299, zone = "Burning Steppes", name = "Borgus Stoutarm", place = "Morgan's Vigil", faction = "Alliance", id = 71},
[13] = {npcId = 2389, zone = "Hillsbrad Foothills", name = "Zarise", place = "Tarren Mill", faction = "Horde", id = 13},
[12] = {npcId = 2409, zone = "Duskwood", name = "Felicia Maline", place = "Darkshire", faction = "Alliance", id = 12},
[14] = {npcId = 2432, zone = "Hillsbrad Foothills", name = "Darla Harris", place = "Southshore", faction = "Alliance", id = 14},
[16] = {npcId = 2835, zone = "Arathi Highlands", name = "Cedrik Prose", place = "Refuge Pointe", faction = "Alliance", id = 16},
[17] = {npcId = 2851, zone = "Arathi Highlands", name = "Urda", place = "Hammerfall", faction = "Horde", id = 17},
[18] = {npcId = 2858, zone = "Stranglethorn Vale", name = "Gringer", place = "Booty Bay", faction = "Horde", id = 18},
[19] = {npcId = 2859, zone = "Stranglethorn Vale", name = "Gyll", place = "Booty Bay", faction = "Alliance", id = 19},
[21] = {npcId = 2861, zone = "Badlands", name = "Gorrik", place = "Kargath", faction = "Horde", id = 21},
[74] = {npcId = 2941, zone = "Searing Gorge", name = "Lanie Reed", place = "Thorium Point", faction = "Alliance", id = 74},
[22] = {npcId = 2995, zone = "Mulgore", name = "Tal", place = "Thunder Bluff", faction = "Horde", id = 22},
[75] = {npcId = 3305, zone = "Searing Gorge", name = "Grisha", place = "Thorium Point", faction = "Horde", id = 75},
[23] = {npcId = 3310, zone = "Orgrimmar", name = "Doras", faction = "Horde", id = 23},
[25] = {npcId = 3615, zone = "The Barrens", name = "Devrak", place = "Crossroads", faction = "Horde", id = 25},
[27] = {npcId = 3838, zone = "Teldrassil", name = "Vesprystus", place = "Rut'theran Village", faction = "Alliance", id = 27},
[26] = {npcId = 3841, zone = "Darkshore", name = "Caylais Moonfeather", place = "Auberdine", faction = "Alliance", id = 26},
[28] = {npcId = 4267, zone = "Ashenvale", name = "Daelyshia ", place = "Astranaar", faction = "Alliance", id = 28},
[29] = {npcId = 4312, zone = "Stonetalon Mountains", name = "Tharm", place = "Sun Rock Retreat", faction = "Horde", id = 29},
[76] = {npcId = 4314, zone = "The Hinterlands", name = "Gorkas", place = "Revantusk Village", faction = "Horde", id = 76},
[30] = {npcId = 4317, zone = "Thousand Needles", name = "Nyse", place = "Freewind Post", faction = "Horde", id = 30},
[31] = {npcId = 4319, zone = "Feralas", name = "Thyssiana", place = "Thalanaar", faction = "Alliance", id = 31},
[32] = {npcId = 4321, zone = "Dustwallow Marsh", name = "Baldruc", place = "Theramore", faction = "Alliance", id = 32},
[33] = {npcId = 4407, zone = "Stonetalon Mountains", name = "Teloren", place = "Stonetalon Peak", faction = "Alliance", id = 33},
[11] = {npcId = 4551, zone = "Undercity", name = "Michael Garrett", faction = "Horde", id = 11},
[56] = {npcId = 6026, zone = "Swamp of Sorrows", name = "Breyk", place = "Stonard", faction = "Horde", id = 56},
[37] = {npcId = 6706, zone = "Desolace", name = "Baritanas Skyriver", place = "Nijel's Point", faction = "Alliance", id = 37},
[38] = {npcId = 6726, zone = "Desolace", name = "Thalon", place = "Shadowprey Village", faction = "Horde", id = 38},
[39] = {npcId = 7823, zone = "Tanaris", name = "Bera Stonehammer", place = "Gadgetzan", faction = "Alliance", id = 39},
[40] = {npcId = 7824, zone = "Tanaris", name = "Bulkrek Ragefist", place = "Gadgetzan", faction = "Horde", id = 40},
[43] = {npcId = 8018, zone = "The Hinterlands", name = "Guthrum Thunderfist", place = "Aerie Peak", faction = "Alliance", id = 43},
[41] = {npcId = 8019, zone = "Feralas", name = "Fyldren Moonfeather", place = "Feathermoon", faction = "Alliance", id = 41},
[42] = {npcId = 8020, zone = "Feralas", name = "Shyn", place = "Camp Mojache", faction = "Horde", id = 42},
[45] = {npcId = 8609, zone = "Blasted Lands", name = "Alexandra Constantine", place = "Nethergarde Keep", faction = "Alliance", id = 45},
[44] = {npcId = 8610, zone = "Azshara", name = "Kroum", place = "Valormok", faction = "Horde", id = 44},
[77] = {npcId = 10378, zone = "The Barrens", name = "Omusa Thunderhorn", place = "Camp Taurajo", faction = "Horde", id = 77},
[49] = {npcId = 10897, zone = "Moonglade", name = "Sindrayl", faction = "Alliance", id = 49},
[52] = {npcId = 11138, zone = "Winterspring", name = "Maethrya", place = "Everlook", faction = "Alliance", id = 52},
[53] = {npcId = 11139, zone = "Winterspring", name = "Yugrek", place = "Everlook", faction = "Horde", id = 53},
[55] = {npcId = 11899, zone = "Dustwallow Marsh", name = "Shardi", place = "Brackenwall Village", faction = "Horde", id = 55},
[48] = {npcId = 11900, zone = "Felwood", name = "Brakkar", place = "Bloodvenom Post", faction = "Horde", id = 48},
[58] = {npcId = 11901, zone = "Ashenvale", name = "Andruk", place = "Zoram'gar Outpost", faction = "Horde", id = 58},
[64] = {npcId = 12577, zone = "Azshara", name = "Jarrodenus", place = "Talrendis Point", faction = "Alliance", id = 64},
[65] = {npcId = 12578, zone = "Felwood", name = "Mishellena", place = "Talonbranch Glade", faction = "Alliance", id = 65},
[66] = {npcId = 12596, zone = "Western Plaguelands", name = "Bibilfaz Featherwhistle", place = "Chillwind Camp", faction = "Alliance", id = 66},
[61] = {npcId = 12616, zone = "Ashenvale", name = "Vhulgra", place = "Splintertree Post", faction = "Horde", id = 61},
[67] = {npcId = 12617, zone = "Eastern Plaguelands", name = "Khaelyn Steelwing", place = "Light's Hope Chapel", faction = "Alliance", id = 67},
[68] = {npcId = 12636, zone = "Eastern Plaguelands", name = "Georgia", place = "Light's Hope Chapel", faction = "Horde", id = 68},
[69] = {npcId = 12740, zone = "Moonglade", name = "Faustron", faction = "Horde", id = 69},
[70] = {npcId = 13177, zone = "Burning Steppes", name = "Vahgruk", place = "Flame Crest", faction = "Horde", id = 70},
[72] = {npcId = 15177, zone = "Silithus", name = "Cloud Skydancer", place = "Cenarion Hold", faction = "Alliance", id = 72},
[73] = {npcId = 15178, zone = "Silithus", name = "Runk Windtamer", place = "Cenarion Hold", faction = "Horde", id = 73},
[79] = {npcId = 10583, zone = "Un'Goro Crater", name = "Gryfe", place = "Marshal's Refuge", id = 79},
[80] = {npcId = 16227, zone = "The Barrens", name = "Bragok", place = "Ratchet", id = 80},
}
-- Burning Crusade
if select(4, GetBuildInfo()) >= 20000 then
FM.flightmasterDB[82] = {npcId = 16192, zone = "Silvermoon City", name = "Skymistress Gloaming", faction = "Horde", id = 82}
FM.flightmasterDB[83] = {npcId = 16189, zone = "Ghostlands", name = "Skymaster Sunwing", place = "Tranquillien", faction = "Horde", id = 83}
FM.flightmasterDB[93] = {npcId = 17554, zone = "Bloodmyst Isle", name = "Laando", place = "Blood Watch", faction = "Alliance", id = 93}
FM.flightmasterDB[94] = {npcId = 17555, zone = "The Exodar", name = "Stephanos", faction = "Alliance", id = 94}
FM.flightmasterDB[99] = {npcId = 16587, zone = "Hellfire Peninsula", name = "Barley", place = "Thrallmar", faction = "Horde", id = 99}
FM.flightmasterDB[100] = {npcId = 16822, zone = "Hellfire Peninsula", name = "Flightmaster Krill Bitterhue", place = "Honor Hold", faction = "Alliance", id = 100}
FM.flightmasterDB[101] = {npcId = 18785, zone = "Hellfire Peninsula", name = "Kuma", place = "Temple of Telhamat", faction = "Alliance", id = 101}
FM.flightmasterDB[102] = {npcId = 18942, zone = "Hellfire Peninsula", name = "Innalia", place = "Falcon Watch", faction = "Horde", id = 102}
FM.flightmasterDB[117] = {npcId = 18788, zone = "Zangarmarsh", name = "Munci", place = "Telredor", faction = "Alliance", id = 117}
FM.flightmasterDB[118] = {npcId = 18791, zone = "Zangarmarsh", name = "Du'ga", place = "Zabra'jin", faction = "Horde", id = 118}
FM.flightmasterDB[119] = {npcId = 18789, zone = "Nagrand", name = "Furgu", place = "Telaar", faction = "Alliance", id = 119}
FM.flightmasterDB[120] = {npcId = 18808, zone = "Nagrand", name = "Gursha", place = "Garadar", faction = "Horde", id = 120}
FM.flightmasterDB[121] = {npcId = 18809, zone = "Terokkar Forest", name = "Furnan Skysoar", place = "Allerian Stronghold", faction = "Alliance", id = 121}
FM.flightmasterDB[122] = {npcId = 18938, zone = "Netherstorm", name = "Krexcil", place = "Area 52", id = 122}
FM.flightmasterDB[123] = {npcId = 19317, zone = "Shadowmoon Valley", name = "Drek'Gol", place = "Shadowmoon Village", faction = "Horde", id = 123}
FM.flightmasterDB[124] = {npcId = 18939, zone = "Shadowmoon Valley", name = "Brubeck Stormfoot", place = "Wildhammer Stronghold", faction = "Alliance", id = 124}
FM.flightmasterDB[125] = {npcId = 18937, zone = "Blades Edge Mountains", name = "Amerun Leafshade", place = "Sylvanaar", faction = "Alliance", id = 125}
FM.flightmasterDB[126] = {npcId = 18953, zone = "Blades Edge Mountains", name = "Unoke Tenderhoof", place = "Thunderlord Stronghold", faction = "Horde", id = 126}
FM.flightmasterDB[127] = {npcId = 18807, zone = "Terokkar Forest", name = "Kerna", place = "Stonebreaker Hold", faction = "Horde", id = 127}
FM.flightmasterDB[128] = {npcId = 18940, zone = "Terokkar Forest", name = "Nutral", place = "Shattrath", id = 128}
FM.flightmasterDB[129] = {npcId = 18931, zone = "Hellfire Peninsula", name = "Amish Wildhammer", place = "The Dark Portal", faction = "Alliance", id = 129}
FM.flightmasterDB[130] = {npcId = 18930, zone = "Hellfire Peninsula", name = "Vlagga Freyfeather", place = "The Dark Portal", faction = "Horde", id = 130}
FM.flightmasterDB[139] = {npcId = 19583, zone = "Netherstorm", name = "Grennik", place = "The Stormspire", id = 139}
FM.flightmasterDB[140] = {npcId = 19581, zone = "Shadowmoon Valley", name = "Maddix", place = "Altar of Sha'tar", id = 140}
FM.flightmasterDB[141] = {npcId = 19558, zone = "Hellfire Peninsula", name = "Amilya Airheart", place = "Spinebreaker Ridge", faction = "Horde", id = 141}
FM.flightmasterDB[149] = {npcId = 20234, zone = "Hellfire Peninsula", name = "Runetog Wildhammer", place = "Shatter Point", faction = "Alliance", id = 149}
FM.flightmasterDB[150] = {npcId = 20515, zone = "Netherstorm", name = "Harpax", place = "Cosmowrench", id = 150}
FM.flightmasterDB[151] = {npcId = 20762, zone = "Zangarmarsh", name = "Gur'zil", place = "Swamprat Post", faction = "Horde", id = 151}
FM.flightmasterDB[156] = {npcId = 21107, zone = "Blades Edge Mountains", name = "Rip Pedalslam", place = "Toshley's Station", faction = "Alliance", id = 156}
FM.flightmasterDB[159] = {npcId = 21766, zone = "Shadowmoon Valley", name = "Alieshor", place = "Sanctum of the Stars", id = 159}
FM.flightmasterDB[160] = {npcId = 22216, zone = "Blades Edge Mountains", name = "Fhyn Leafshadow", place = "Evergrove", id = 160}
FM.flightmasterDB[163] = {npcId = 22455, zone = "Blades Edge Mountains", name = "Sky-Master Maxxor", place = "Mok'Nathal Village", faction = "Horde", id = 163}
FM.flightmasterDB[164] = {npcId = 22485, zone = "Zangarmarsh", name = "Halu", place = "Orebor Harborage", faction = "Alliance", id = 164}
FM.flightmasterDB[205] = {npcId = 24851, zone = "Ghostlands", name = "Kiz Coilspanner", place = "Zul'Aman", id = 205}
FM.flightmasterDB[213] = {npcId = 26560, zone = "Isle of Quel Danas", name = "Ohura", place = "Shattered Sun Staging Area", id = 213}
FM.flightmasterDB[166] = {npcId = 22931, zone = "Felwood", name = "Gorrim", place = "Emerald Sanctuary", id = 166}
FM.flightmasterDB[167] = {npcId = 22935, zone = "Ashenvale", name = "Suralais Farwind", place = "Forest Song", faction = "Alliance", id = 167}
FM.flightmasterDB[179] = {npcId = 23612, zone = "Dustwallow Marsh", name = "Dyslix Silvergrub", place = "Mudsprocket", id = 179}
FM.flightmasterDB[195] = {npcId = 24366, zone = "Stranglethorn Vale", name = "Nizzle", place = "Rebel Camp", faction = "Alliance", id = 195}
FM.flightmasterDB[205] = {npcId = 24851, zone = "Ghostlands", name = "Kiz Coilspanner", place = "Zul'Aman", id = 205}
FM.flightmasterDB[213] = {npcId = 26560, zone = "Shattered Sun Staging Area", name = "Ohura", id = 213}
end
-- Wrath of the Lich King
if select(4, GetBuildInfo()) >= 30000 then
FM.flightmasterDB[245] = {npcId = 26879, zone = "Borean Tundra", name = "Tomas Riverwell", place = "Valiance Keep", faction = "Alliance", id = 245}
FM.flightmasterDB[246] = {npcId = 26602, zone = "Borean Tundra", name = "Kara Thricestar", place = "Fizzcrank Airstrip", faction = "Alliance", id = 246}
FM.flightmasterDB[257] = {npcId = 25288, zone = "Borean Tundra", name = "Turida Coldwind", place = "Warsong Hold", faction = "Horde", id = 257}
FM.flightmasterDB[258] = {npcId = 26847, zone = "Borean Tundra", name = "Omu Spiritbreeze", place = "Taunka'le Village", faction = "Horde", id = 258}
FM.flightmasterDB[259] = {npcId = 26848, zone = "Borean Tundra", name = "Kimbiza", place = "Bor'gorok Outpost", faction = "Horde", id = 259}
FM.flightmasterDB[289] = {npcId = 24795, zone = "Borean Tundra", name = "Surristrasz", place = "Amber Ledge", id = 289}
FM.flightmasterDB[296] = {npcId = 28195, zone = "Borean Tundra", name = "Bilko Driftspark", place = "Unu'pe", id = 296}
FM.flightmasterDB[226] = {npcId = 27046, zone = "Coldarra", name = "Warmage Adami", place = "Transitus Shield", id = 226}
FM.flightmasterDB[336] = {npcId = 30271, zone = "Crystalsong Forest", name = "Galendror Whitewing", place = "Windrunner's Overlook", faction = "Alliance", id = 336}
FM.flightmasterDB[337] = {npcId = 30269, zone = "Crystalsong Forest", name = "Skymaster Baeric ", place = "Sunreaver's Command", faction = "Horde", id = 337}
FM.flightmasterDB[310] = {npcId = 28674, zone = "Dalaran", name = "Aludane Whitecloud", id = 310}
FM.flightmasterDB[244] = {npcId = 26878, zone = "Dragonblight", name = "Rodney Wells", place = "Wintergarde Keep", faction = "Alliance", id = 244}
FM.flightmasterDB[247] = {npcId = 26881, zone = "Dragonblight", name = "Palena Silvercloud ", place = "Stars' Rest", faction = "Alliance", id = 247}
FM.flightmasterDB[251] = {npcId = 26877, zone = "Dragonblight", name = "Derek Rammel", place = "Fordragon Hold", faction = "Alliance", id = 251}
FM.flightmasterDB[252] = {npcId = 26851, zone = "Dragonblight", name = "Nethestrasz", place = "Wyrmrest Temple", id = 252}
FM.flightmasterDB[254] = {npcId = 26845, zone = "Dragonblight", name = "Junter Weiss", place = "Venomspite", faction = "Horde", id = 254}
FM.flightmasterDB[256] = {npcId = 26566, zone = "Dragonblight", name = "Narzun Skybreaker", place = "Agmar's Hammer", faction = "Horde", id = 256}
FM.flightmasterDB[260] = {npcId = 26850, zone = "Dragonblight", name = "Numo Spiritbreeze", place = "Kor'koron Vanguard", faction = "Horde", id = 260}
FM.flightmasterDB[294] = {npcId = 28196, zone = "Dragonblight", name = "Cid Flounderfix", place = "Moa'ki", id = 294}
FM.flightmasterDB[249] = {npcId = 26853, zone = "Grizzly Hills", name = "Makki Wintergale", place = "Camp Oneqwah", faction = "Horde", id = 249}
FM.flightmasterDB[250] = {npcId = 26852, zone = "Grizzly Hills", name = "Kragh", place = "Conquest Hold", faction = "Horde", id = 250}
FM.flightmasterDB[253] = {npcId = 26880, zone = "Grizzly Hills", name = "Vana Grey", place = "Amberpine Lodge", faction = "Alliance", id = 253}
FM.flightmasterDB[255] = {npcId = 26876, zone = "Grizzly Hills", name = "Samuel Clearbook", place = "Westfall Brigade", faction = "Alliance", id = 255}
FM.flightmasterDB[183] = {npcId = 23736, zone = "Howling Fjord", name = "Pricilla Winterwind", place = "Valgarde Port", faction = "Alliance", id = 183}
FM.flightmasterDB[184] = {npcId = 24061, zone = "Howling Fjord", name = "James Ormsby", place = "Fort Wildervar", faction = "Alliance", id = 184}
FM.flightmasterDB[185] = {npcId = 23859, zone = "Howling Fjord", name = "Greer Orehammer", place = "Westguard Keep", faction = "Alliance", id = 185}
FM.flightmasterDB[190] = {npcId = 24155, zone = "Howling Fjord", name = "Tobias Sarkhoff", place = "New Agamand", faction = "Horde", id = 190}
FM.flightmasterDB[191] = {npcId = 27344, zone = "Howling Fjord", name = "Bat Handler Adeline", place = "Vengeance Landing", faction = "Horde", id = 191}
FM.flightmasterDB[192] = {npcId = 24032, zone = "Howling Fjord", name = "Celea Frozenmane", place = "Camp Winterhoof", faction = "Horde", id = 192}
FM.flightmasterDB[248] = {npcId = 26844, zone = "Howling Fjord", name = "Lilleth Radescu", place = "Apothecary Camp", faction = "Horde", id = 248}
FM.flightmasterDB[295] = {npcId = 28197, zone = "Howling Fjord", name = "Kip Trawlskip", place = "Kamagua", id = 295}
FM.flightmasterDB[325] = {npcId = 31078, zone = "Icecrown", name = "Dreadwind", place = "Death's Rise", id = 325}
FM.flightmasterDB[333] = {npcId = 30314, zone = "Icecrown", name = "Morlia Doomwing", place = "The Shadow Vault", faction = "Horde", id = 333}
FM.flightmasterDB[334] = {npcId = 33849, zone = "Icecrown", name = "Helidan Lightwing", place = "The Argent Vanguard", id = 334}
FM.flightmasterDB[335] = {npcId = 31069, zone = "Icecrown", name = "Penumbrius", place = "Crusaders' Pinnacle", id = 335}
FM.flightmasterDB[308] = {npcId = 28574, zone = "Sholazar Basin", name = "Marvin Wobblesprocket", place = "River's Heart", id = 308}
FM.flightmasterDB[309] = {npcId = 28037, zone = "Sholazar Basin", name = "The Spirit of Gnomeregan", place = "Nesingwary Base Camp", id = 309}
FM.flightmasterDB[320] = {npcId = 29721, zone = "The Storm Peaks", name = "Skizzle Slickslide", place = "K3", id = 320}
FM.flightmasterDB[321] = {npcId = 29750, zone = "The Storm Peaks", name = "Faldorf Bitterchill", place = "Frosthold", faction = "Alliance", id = 321}
FM.flightmasterDB[322] = {npcId = 32571, zone = "The Storm Peaks", name = "Halvdan ", place = "Dun Nifflelem", id = 322}
FM.flightmasterDB[323] = {npcId = 29757, zone = "The Storm Peaks", name = "Kabarg Windtamer", place = "Grom'arsh Crash-Site", faction = "Horde", id = 323}
FM.flightmasterDB[324] = {npcId = 29762, zone = "The Storm Peaks", name = "Hyeyoung Parka", place = "Camp Tunka'lo", faction = "Horde", id = 324}
FM.flightmasterDB[326] = {npcId = 29951, zone = "The Storm Peaks", name = "Shavalius the Fancy", place = "Ulduar", id = 326}
FM.flightmasterDB[327] = {npcId = 29950, zone = "The Storm Peaks", name = "Breck Rockbrow", place = "Bouldercrag's Refuge", id = 327}
FM.flightmasterDB[303] = {npcId = 30869, zone = "Wintergrasp", name = "Arzo Safeflight", place = "Valiance Landing Camp", faction = "Alliance", id = 303}
FM.flightmasterDB[332] = {npcId = 30870, zone = "Wintergrasp", name = "Herzo Safeflight", place = "Warsong Camp", faction = "Horde", id = 332}
FM.flightmasterDB[290] = {npcId = 28623, zone = "Zul'Drak", name = "Gurric", place = "Argent Stand", faction = "Horde", id = 290}
FM.flightmasterDB[305] = {npcId = 28615, zone = "Zul'Drak", name = "Baneflight", place = "Ebon Watch", id = 305}
FM.flightmasterDB[306] = {npcId = 28618, zone = "Zul'Drak", name = "Danica Saint", place = "Light's Breach", id = 306}
FM.flightmasterDB[307] = {npcId = 28624, zone = "Zul'Drak", name = "Maaka", place = "Zim'Torga", id = 307}
FM.flightmasterDB[331] = {npcId = 30569, zone = "Zul'Drak", name = "Rafae", place = "Gundrak", id = 331}
FM.flightmasterDB[383] = {npcId = 37888, zone = "Western Plaguelands", name = "Frax Bucketdrop", place = "Thondoril River", id = 383}
FM.flightmasterDB[384] = {npcId = 37915, zone = "Tirisfal", name = "Timothy Cunningham", place = "The Bulwark", faction = "Horde", id = 384}
end
-- Cataclysm
if select(4, GetBuildInfo()) >= 40000 then
FM.flightmasterDB[2] = {zone = "Elwynn", place = "Stormwind", faction = "Alliance", id = 2, wx = 489.65600585938, wy = -8841.0595703125, instance = 0}
FM.flightmasterDB[4] = {zone = "Westfall", place = "Sentinel Hill", faction = "Alliance", id = 4, wx = 1034.3900146484, wy = -10551.900390625, instance = 0}
FM.flightmasterDB[5] = {zone = "Redridge", place = "Lakeshire", faction = "Alliance", id = 5, wx = -2231.3999023438, wy = -9429.099609375, instance = 0}
FM.flightmasterDB[6] = {zone = "Dun Morogh", place = "Ironforge", faction = "Alliance", id = 6, wx = -1155.4399414062, wy = -4821.7797851562, instance = 0}
FM.flightmasterDB[7] = {zone = "Wetlands", place = "Menethil Harbor", faction = "Alliance", id = 7, wx = -777.69598388672, wy = -3787.8100585938, instance = 0}
FM.flightmasterDB[8] = {zone = "Loch Modan", place = "Thelsamar", faction = "Alliance", id = 8, wx = -2930.0100097656, wy = -5421.91015625, instance = 0}
FM.flightmasterDB[10] = {zone = "Silverpine Forest", place = "The Sepulcher", faction = "Horde", id = 10, wx = 1536.5899658203, wy = 478.85998535156, instance = 0}
FM.flightmasterDB[11] = {zone = "Tirisfal", place = "Undercity", faction = "Horde", id = 11, wx = 267.9700012207, wy = 1568.6199951172, instance = 0}
FM.flightmasterDB[12] = {zone = "Duskwood", place = "Darkshire", faction = "Alliance", id = 12, wx = -1261.6500244141, wy = -10515.5, instance = 0}
FM.flightmasterDB[13] = {zone = "Hillsbrad", place = "Tarren Mill", faction = "Horde", id = 13, wx = -874.20300292969, wy = -17.70660018921, instance = 0}
FM.flightmasterDB[14] = {zone = "Hillsbrad", place = "Southshore", id = 14, wx = -515.47998046875, wy = -711.47998046875, instance = 0}
FM.flightmasterDB[16] = {zone = "Arathi", place = "Refuge Pointe", faction = "Alliance", id = 16, wx = -2515.1101074219, wy = -1240.5300292969, ins
gitextract_32tprem4/ ├── .gitignore ├── .pkgmeta ├── Guidelime/ │ ├── ActionButtons.lua │ ├── Bindings.xml │ ├── CurrentGuide.lua │ ├── CustomCode.lua │ ├── Data/ │ │ ├── ClassicCodex.lua │ │ ├── ClassicCodexCorrections.lua │ │ ├── Data.lua │ │ ├── FlightmasterDB.lua │ │ ├── FlightmasterDB_Locales.lua │ │ ├── Internal/ │ │ │ ├── CreaturesDB.lua │ │ │ ├── CreaturesDB_Locales.lua │ │ │ ├── ItemsDB.lua │ │ │ ├── ItemsDB_Locales.lua │ │ │ ├── ObjectsDB.lua │ │ │ ├── ObjectsDB_Locales.lua │ │ │ ├── QuestsDB.lua │ │ │ ├── QuestsDB_Locales.lua │ │ │ └── corrections.lua │ │ ├── MapDB.lua │ │ ├── PositionTools.lua │ │ ├── Questie.lua │ │ ├── QuestieCorrections.lua │ │ ├── QuestsTools.lua │ │ ├── SkillDB.lua │ │ ├── SkillDB_Locales.lua │ │ └── SpellDB.lua │ ├── Editor.lua │ ├── EditorTools.lua │ ├── Events.lua │ ├── Frames.lua │ ├── GuideParser.lua │ ├── Guidelime-Cata.toc │ ├── Guidelime-Mists.toc │ ├── Guidelime-TBC.toc │ ├── Guidelime-Vanilla.toc │ ├── Guidelime-Wrath.toc │ ├── Guidelime.lua │ ├── Guides.lua │ ├── Icons/ │ │ ├── Arrow.blp │ │ ├── ArrowLicense.txt │ │ ├── TitleHighlight.blp │ │ ├── black.blp │ │ ├── check.blp │ │ ├── discord.tga │ │ ├── getflightpoint.blp │ │ ├── hearth.blp │ │ ├── lime.blp │ │ ├── lime0.blp │ │ ├── lime_arrow.blp │ │ ├── lime_marker.blp │ │ ├── lime_marker_friz.blp │ │ ├── lime_marker_friz_green.blp │ │ ├── limev.blp │ │ ├── paypal.tga │ │ ├── questunavailable.blp │ │ ├── repair.blp │ │ ├── scroll.blp │ │ └── set_hearth.blp │ ├── Import.lua │ ├── Libs/ │ │ ├── CallbackHandler-1.0/ │ │ │ ├── CallbackHandler-1.0.lua │ │ │ └── CallbackHandler-1.0.xml │ │ ├── HereBeDragons/ │ │ │ ├── CHANGELOG.md │ │ │ ├── CallbackHandler-1.0/ │ │ │ │ ├── CallbackHandler-1.0.lua │ │ │ │ └── CallbackHandler-1.0.xml │ │ │ ├── HereBeDragons-2.0.lua │ │ │ ├── HereBeDragons-Migrate.lua │ │ │ ├── HereBeDragons-Pins-2.0.lua │ │ │ ├── HereBeDragons.toc │ │ │ └── LibStub/ │ │ │ ├── LibStub.lua │ │ │ └── LibStub.toc │ │ ├── LibDBIcon-1.0/ │ │ │ ├── LibDBIcon-1.0.lua │ │ │ └── lib.xml │ │ ├── LibDataBroker-1.1/ │ │ │ └── LibDataBroker-1.1.lua │ │ └── LibStub/ │ │ └── LibStub.lua │ ├── Localization.lua │ ├── MainWindow.lua │ ├── Map.lua │ ├── Options.lua │ ├── QuestLog-Classic.lua │ ├── QuestLog.lua │ └── QuestScan.lua ├── Guidelime_MyGuideExample/ │ ├── Guidelime_MyGuideExample.toc │ └── MyGuide.lua └── README.md
Copy disabled (too large)
Download .json
Condensed preview — 86 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (34,680K chars).
[
{
"path": ".gitignore",
"chars": 86,
"preview": "*\n!Guidelime\n!Guidelime/**\n!Guidelime_MyGuideExample\n!README.md\n!.pkgmeta\n!.gitignore\n"
},
{
"path": ".pkgmeta",
"chars": 137,
"preview": "enable-nolib-creation: no\npackage-as: Guidelime\n\nmove-folders:\n Guidelime/Guidelime : Guidelime\n\nignore:\n - Guidelim"
},
{
"path": "Guidelime/ActionButtons.lua",
"chars": 14798,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D -- Data/Data\naddon.SP = a"
},
{
"path": "Guidelime/Bindings.xml",
"chars": 1551,
"preview": "<Bindings>\n\t<Binding name=\"GUIDELIME_TOGGLE\" category=\"BINDING_HEADER_GUIDELIME\">\n\t\tGuidelime.toggleMainFrame()\n\t</Bindi"
},
{
"path": "Guidelime/CurrentGuide.lua",
"chars": 49608,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
},
{
"path": "Guidelime/CustomCode.lua",
"chars": 3593,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D -- Data/Data\n\naddon.CC = "
},
{
"path": "Guidelime/Data/ClassicCodex.lua",
"chars": 17646,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
},
{
"path": "Guidelime/Data/ClassicCodexCorrections.lua",
"chars": 76942,
"preview": "local addonName, addon = ...\n\n-- add kill credit objectives as these are not supported by ClassicCodex\naddon.CLASSIC_COD"
},
{
"path": "Guidelime/Data/Data.lua",
"chars": 11623,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.SK = addon.SK or {}; loc"
},
{
"path": "Guidelime/Data/FlightmasterDB.lua",
"chars": 77570,
"preview": "local addonName, addon = ...\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.DM = addon.DM or {}; local DM = addon.DM -"
},
{
"path": "Guidelime/Data/FlightmasterDB_Locales.lua",
"chars": 317966,
"preview": "local addonName, addon = ...\n\naddon.FM.flightmasterDB_Locales = {\n[\"deDE\"] = {\n\t[1] = \"Abtei von Nordhain\",\n\t[2] = \"Stur"
},
{
"path": "Guidelime/Data/Internal/CreaturesDB.lua",
"chars": 9159257,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/CreaturesDB_Locales.lua",
"chars": 1710726,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/ItemsDB.lua",
"chars": 773701,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/ItemsDB_Locales.lua",
"chars": 663478,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/ObjectsDB.lua",
"chars": 5931007,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/ObjectsDB_Locales.lua",
"chars": 1567025,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/QuestsDB.lua",
"chars": 2757625,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/QuestsDB_Locales.lua",
"chars": 4234302,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
},
{
"path": "Guidelime/Data/Internal/corrections.lua",
"chars": 9317,
"preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- https://github.com/max-ri/Guidelime/issu"
},
{
"path": "Guidelime/Data/MapDB.lua",
"chars": 14485,
"preview": "local addonName, addon = ...\n\naddon.DM = addon.DM or {}; local DM = addon.DM\n\n--[[if GetLocale() == \"enUS\" then\n\t-- read"
},
{
"path": "Guidelime/Data/PositionTools.lua",
"chars": 12825,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.DM = addon.DM or {}; loc"
},
{
"path": "Guidelime/Data/Questie.lua",
"chars": 117128,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\nlocal QuestieDB = QuestieLoade"
},
{
"path": "Guidelime/Data/QuestieCorrections.lua",
"chars": 15891,
"preview": "local addonName, addon = ...\n\naddon.QUESTIE.correctionsObjectiveOrder = {\n\t-- https://tbc.wowhead.com/quest=10503/the-bl"
},
{
"path": "Guidelime/Data/QuestsTools.lua",
"chars": 47025,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D "
},
{
"path": "Guidelime/Data/SkillDB.lua",
"chars": 5033,
"preview": "local addonName, addon = ...\n\naddon.SK = addon.SK or {}; local SK = addon.SK -- Data/SkillDB\n\nSK.skills = {\n\tALCHEMY"
},
{
"path": "Guidelime/Data/SkillDB_Locales.lua",
"chars": 11035,
"preview": "local addonName, addon = ...\n\naddon.SK.skillDB_Locales = {\n[\"deDE\"] = {\n COOKING = \"Kochkunst\",\n FIRSTAID = \"Erste Hil"
},
{
"path": "Guidelime/Data/SpellDB.lua",
"chars": 614488,
"preview": "local addonName, addon = ...\n\naddon.D = addon.D or {}; local D = addon.D -- Data/Data\naddon.SK = addon.SK or {};"
},
{
"path": "Guidelime/Editor.lua",
"chars": 47194,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
},
{
"path": "Guidelime/EditorTools.lua",
"chars": 8108,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D -- Data/Data\naddon.FM = a"
},
{
"path": "Guidelime/Events.lua",
"chars": 26335,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
},
{
"path": "Guidelime/Frames.lua",
"chars": 9917,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.F = addon.F or {}; local F = addon.F\n\nfunction F.setTooltip(frame,"
},
{
"path": "Guidelime/GuideParser.lua",
"chars": 31409,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
},
{
"path": "Guidelime/Guidelime-Cata.toc",
"chars": 1581,
"preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 40402\n## SavedVariables: GuidelimeDa"
},
{
"path": "Guidelime/Guidelime-Mists.toc",
"chars": 1581,
"preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 50503\n## SavedVariables: GuidelimeDa"
},
{
"path": "Guidelime/Guidelime-TBC.toc",
"chars": 1589,
"preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 20505\n## SavedVariables: GuidelimeDa"
},
{
"path": "Guidelime/Guidelime-Vanilla.toc",
"chars": 1589,
"preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 11508\n## SavedVariables: GuidelimeDa"
},
{
"path": "Guidelime/Guidelime-Wrath.toc",
"chars": 1581,
"preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 30404\n## SavedVariables: GuidelimeDa"
},
{
"path": "Guidelime/Guidelime.lua",
"chars": 19080,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal LibDataBroker = LibStub(\"LibDataBroker-1.1\")\nlocal LibDBIcon = Lib"
},
{
"path": "Guidelime/Guides.lua",
"chars": 14856,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D -- Data/Data\naddon.CG = a"
},
{
"path": "Guidelime/Icons/ArrowLicense.txt",
"chars": 230,
"preview": "Everyone has full permission to do whatever they want with this model file in any non-commercial manner. Attribution to "
},
{
"path": "Guidelime/Import.lua",
"chars": 12720,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D -- Data/Data\naddon.QT = a"
},
{
"path": "Guidelime/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua",
"chars": 8804,
"preview": "--[[ $Id: CallbackHandler-1.0.lua 1131 2015-06-04 07:29:24Z nevcairiel $ ]]\nlocal MAJOR, MINOR = \"CallbackHandler-1.0\", "
},
{
"path": "Guidelime/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml",
"chars": 219,
"preview": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"ht"
},
{
"path": "Guidelime/Libs/HereBeDragons/CHANGELOG.md",
"chars": 393,
"preview": "# Lib: HereBeDragons\n\n## [2.15-release](https://github.com/Nevcairiel/HereBeDragons/tree/2.15-release) (2025-07-02)\n[Ful"
},
{
"path": "Guidelime/Libs/HereBeDragons/CallbackHandler-1.0/CallbackHandler-1.0.lua",
"chars": 7759,
"preview": "--[[ $Id: CallbackHandler-1.0.lua 26 2022-12-12 15:09:39Z nevcairiel $ ]]\nlocal MAJOR, MINOR = \"CallbackHandler-1.0\", 8\n"
},
{
"path": "Guidelime/Libs/HereBeDragons/CallbackHandler-1.0/CallbackHandler-1.0.xml",
"chars": 218,
"preview": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"ht"
},
{
"path": "Guidelime/Libs/HereBeDragons/HereBeDragons-2.0.lua",
"chars": 27019,
"preview": "-- HereBeDragons is a data API for the World of Warcraft mapping system\n\nlocal MAJOR, MINOR = \"HereBeDragons-2.0\", 30\nas"
},
{
"path": "Guidelime/Libs/HereBeDragons/HereBeDragons-Migrate.lua",
"chars": 31766,
"preview": "local MAJOR, MINOR = \"HereBeDragons-Migrate\", 2\nassert(LibStub, MAJOR .. \" requires LibStub\")\n\nlocal HBDMigrate, _oldver"
},
{
"path": "Guidelime/Libs/HereBeDragons/HereBeDragons-Pins-2.0.lua",
"chars": 27771,
"preview": "-- HereBeDragons-Pins is a library to show pins/icons on the world map and minimap\n\nlocal MAJOR, MINOR = \"HereBeDragons-"
},
{
"path": "Guidelime/Libs/HereBeDragons/HereBeDragons.toc",
"chars": 558,
"preview": "## Interface: 11507,50500,110107,110200\n## Title: Lib: HereBeDragons\n## Notes: HereBeDragons is a data API for the World"
},
{
"path": "Guidelime/Libs/HereBeDragons/LibStub/LibStub.lua",
"chars": 1367,
"preview": "-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info\n-- "
},
{
"path": "Guidelime/Libs/HereBeDragons/LibStub/LibStub.toc",
"chars": 253,
"preview": "## Interface: 20400\n## Title: Lib: LibStub\n## Notes: Universal Library Stub\n## Credits: Kaelten, Cladhaire, ckknight, Mi"
},
{
"path": "Guidelime/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua",
"chars": 13565,
"preview": "\n-----------------------------------------------------------------------\n-- LibDBIcon-1.0\n--\n-- Allows addons to easily "
},
{
"path": "Guidelime/Libs/LibDBIcon-1.0/lib.xml",
"chars": 215,
"preview": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"ht"
},
{
"path": "Guidelime/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua",
"chars": 3139,
"preview": "\nassert(LibStub, \"LibDataBroker-1.1 requires LibStub\")\nassert(LibStub:GetLibrary(\"CallbackHandler-1.0\", true), \"LibDataB"
},
{
"path": "Guidelime/Libs/LibStub/LibStub.lua",
"chars": 1367,
"preview": "-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info\n-- "
},
{
"path": "Guidelime/Localization.lua",
"chars": 87295,
"preview": "local addonName, addon = ...\n\nfunction getLocalizedStrings(locale)\nlocal L = {}\n\nif locale == \"enUS\" then\n\nL.TITLE = add"
},
{
"path": "Guidelime/MainWindow.lua",
"chars": 21743,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
},
{
"path": "Guidelime/Map.lua",
"chars": 20175,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\nlocal HBDPins = LibStub(\"HereBe"
},
{
"path": "Guidelime/Options.lua",
"chars": 36521,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal LibDBIcon = LibStub(\"LibDBIcon-1.0\")\n\naddon.QT = addon.QT or {}; l"
},
{
"path": "Guidelime/QuestLog-Classic.lua",
"chars": 3631,
"preview": "\nlocal addonName, addon = ...\nlocal L = addon.L\n\naddon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools\naddon"
},
{
"path": "Guidelime/QuestLog.lua",
"chars": 3509,
"preview": "\nlocal addonName, addon = ...\nlocal L = addon.L\n\naddon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools\naddon"
},
{
"path": "Guidelime/QuestScan.lua",
"chars": 1169,
"preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.QS = addon.QS or {}; local QS = addon.QS\n\nfunction QS.resetScanned"
},
{
"path": "Guidelime_MyGuideExample/Guidelime_MyGuideExample.toc",
"chars": 169,
"preview": "\n## Title: Guidelime_MyGuideExample\n## Author: Me\n## Version: 0.001-Beta\n## Interface: 20501\n## Dependencies: Guidelime\n"
},
{
"path": "Guidelime_MyGuideExample/MyGuide.lua",
"chars": 512,
"preview": "Guidelime.registerGuide([[\n[D *My* own guide for Guidelime \\\\ http://www.twitch.tv/mytwitch] \n[GA Alliance]\n[N1-6 My gu"
},
{
"path": "README.md",
"chars": 4105,
"preview": "# Guidelime\n\nA WoW Classic addon for leveling guides with automatic progress updates\n\n## What does it do?\n\nGuides are sh"
}
]
// ... and 19 more files (download for full content)
About this extraction
This page contains the full source code of the max-ri/Guidelime GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 86 files (27.4 MB), approximately 7.2M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.