WoWInterface SVN DagAssist

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /branches
    from Rev 13 to Rev 14
    Reverse comparison

Rev 13 → Rev 14

4.00/DagAssist.xml New file
0,0 → 1,85
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
 
<Frame name="DA_MenuContainer" toplevel="true" frameStrata="HIGH" virtual="true">
<Size><AbsDimension x="220" y="32"/></Size>
<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
<EdgeSize><AbsValue val="16"/></EdgeSize>
<TileSize><AbsValue val="16"/></TileSize>
<BackgroundInsets><AbsInset left="5" right="5" top="5" bottom="5"/></BackgroundInsets>
</Backdrop>
</Frame>
 
<Button name="DA_MinimapButton" frameStrata="LOW" movable="true" virtual="true">
<Size><AbsDimension x="32" y="32"/></Size>
<NormalTexture file="Interface\AddOns\DagAssist\Images\MinmapIcon" />
<PushedTexture file="Interface\AddOns\DagAssist\Images\MinmapIconDown" />
</Button>
 
<Button name="DA_MenuButtonTemplate" virtual="true">
<Size>
<AbsDimension x="200" y="18"/>
</Size>
<ButtonText name="$parentText" justifyH="LEFT" justifyV="MIDDLE" >
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="LEFT">
</Anchor>
</Anchors>
</ButtonText>
 
<NormalFont style="GameFontHighlightSmall"/>
<HighlightFont style="GameFontHighlightSmall"/>
<DisabledFont style="GameFontDisableSmall"/>
 
<HighlightTexture setAllPoints="true">
<Color r="1" g="1" b="0" a="0.1" />
</HighlightTexture>
<PushedTexture setAllPoints="true">
<Color r="0" g="1" b="1" a="0.1" />
</PushedTexture >
</Button>
 
<Button name="DA_MenuSpellButtonTemplate" inherits="DA_MenuButtonTemplate" virtual="true">
<ButtonText name="$parentText" justifyH="LEFT" justifyV="MIDDLE" >
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="LEFT">
<Offset><AbsDimension x="29" y="0"/></Offset>
</Anchor>
</Anchors>
</ButtonText>
 
<Layers>
<Layer level="OVERLAY">
<Texture name="$parentIcon">
<Size><AbsDimension x="17" y="17"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="LEFT">
<Offset><AbsDimension x="10" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
</Layer>
</Layers>
</Button>
 
<Button name="DA_MenuLabelTemplate" virtual="true" >
<Size>
<AbsDimension x="200" y="18"/>
</Size>
<ButtonText name="$parentText" justifyH="LEFT" justifyV="MIDDLE">
<Anchors>
<Anchor point="LEFT" relativeTo="$parent" relativePoint="LEFT">
<Offset><AbsDimension x="5" y="0"/></Offset>
</Anchor>
</Anchors>
</ButtonText>
 
<NormalFont style="GameFontNormalSmall"/>
<HighlightFont style="GameFontNormalSmall"/>
<DisabledFont style="GameFontNormalSmall"/>
 
<PushedTextOffset>
<AbsDimension x="0" y="0" />
</PushedTextOffset>
</Button>
</Ui>
\ No newline at end of file
4.00/DagAssist.lua New file
0,0 → 1,423
------------------------------------------------
-- DagAssist --
-- Dagos of Cenarius --
------------------------------------------------
 
if (not DagAssist) then
DagAssist = {};
end
 
function DagAssist:Debug(msg)
DEFAULT_CHAT_FRAME:AddMessage(msg);
end
 
--Set up the minimap button
DagAssist.MinimapButton = CreateFrame("Button", "DA_Minimap", Minimap, "SecureHandlerClickTemplate, DA_MinimapButton");
local btnMinimap = DagAssist.MinimapButton;
btnMinimap:RegisterForDrag("LeftButton");
btnMinimap:SetClampedToScreen(true);
 
local texture = btnMinimap:CreateTexture(nil, "ARTWORK");
texture:SetTexture("Interface\\AddOns\\DagAssist\\Images\\MinmapIconHighlight");
texture:SetBlendMode("BLEND");
texture:SetAllPoints(btnMinimap);
btnMinimap:SetHighlightTexture(texture);
 
 
 
-- btnMinimap:SetAttribute("_onenter", [[
-- keepOpen = true;
-- ]]);
 
-- btnMinimap:SetAttribute("_onleave", [[
-- keepOpen = false;
-- control:SetTimer(2.5, "");
-- ]]);
 
-- btnMinimap:SetAttribute("_ontimer", [[
-- if not keepOpen then
-- control:Run(Close);
-- end
-- ]]);
 
-- btnMinimap:SetAttribute("_onupdate", [[
-- if self:IsUnderMouse(true) then
-- open = 0
-- else
-- open = open + elapsed
-- end
-- if open > 2.5 then
-- control:Run(Close)
-- end
-- ]]);
 
DagAssist.Menu = CreateFrame("Frame", "DA_Menu", btnMinimap, "SecureHandlerBaseTemplate, DA_MenuContainer");
DagAssist.Menu:SetClampedToScreen(true);
DagAssist.Menu:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b);
DagAssist.Menu:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b, 1);
DagAssist.Menu:Hide();
btnMinimap:SetFrameRef("dag_menu", DagAssist.Menu);
 
btnMinimap:Execute([[
menuItems = table.new();
 
Close = [=[
self:GetFrameRef("dag_menu"):Hide();
]=]
 
Show = [=[
local previous;
local dag_menu = self:GetFrameRef("dag_menu");
 
dag_menu:Show();
dag_menu:SetPoint("TOPLEFT", self, "BOTTOMLEFT");
 
local menuHeight = 20;
for i, button in ipairs(menuItems) do
local visible = button:GetAttribute("visible");
local enabled = button:GetAttribute("enabled");
 
if (visible) then
menuHeight = menuHeight + 18;
if (previous) then
button:SetPoint("TOPLEFT", previous, "BOTTOMLEFT");
else
button:SetPoint("TOPLEFT", dag_menu, "TOPLEFT", 10, -10);
end
if (enabled) then
button:Enable();
else
button:Disable();
end
previous = button;
button:Show();
else
button:Hide();
end
end
 
dag_menu:SetHeight(menuHeight);
]=]
 
table.insert(menuItems, dag_menu);
]]);
 
btnMinimap:SetAttribute("_onclick", [[
if self:GetFrameRef("dag_menu"):IsVisible() then
control:Run(Close);
else
control:Run(Show);
end
]]);
 
btnMinimap:SetScript("OnDragStart",
function(self, event, ...)
self:StartMoving();
self.Dragging = true;
if (InCombatLockdown() ~= 1) then
btnMinimap:Execute([[
control:Run(Close);
]]);
end
end
)
 
btnMinimap:SetScript("OnDragStop",
function(self, event, ...)
self:StopMovingOrSizing();
 
if (self.Dragging) then
self.Dragging = false;
local s = self:GetEffectiveScale();
DA_Vars.Minimap.X = self:GetLeft() * s;
DA_Vars.Minimap.Y = self:GetTop() * s;
end
end
)
 
btnMinimap:SetScript("OnEnter",
function(self, event, ...)
DagAssist:SetMenuItemVisibility();
end
)
 
btnMinimap:RegisterForClicks("AnyDown");
btnMinimap:SetScript("OnEvent", function(self, event, ...)
if (type(DagAssist[event]) == 'function') then
DagAssist[event](DagAssist, event);
end
end)
btnMinimap:RegisterEvent("VARIABLES_LOADED");
 
function DagAssist:VARIABLES_LOADED(event)
if (not DA_Vars) then
DA_Vars = {Minimap = {}};
end
 
if (DA_Vars.Minimap.X and DA_Vars.Minimap.Y) then
--Restore last position
local s = btnMinimap:GetEffectiveScale();
 
btnMinimap:ClearAllPoints()
btnMinimap:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", DA_Vars.Minimap.X / s, DA_Vars.Minimap.Y /s);
else
btnMinimap:SetPoint("CENTER", Minimap, "BOTTOMLEFT", 15, 15);
end
 
local menu = DagAssist.Menu;
for index = 1, table.getn(DagAssist.MenuList) do
local value = DagAssist.MenuList[index];
 
if ((value.type == "spell" or value.type == "buff") and value.id) then
value.text = GetSpellInfo(value.id);
elseif (value.type == "item" and value.id) then
value.text = GetItemInfo(value.id);
end
 
local btnMenuItem;
if (value.type == "header") or (value.type == "spacer") then
btnMenuItem = CreateFrame("Button", "DA_MenuButton"..index, menu, "SecureHandlerBaseTemplate, DA_MenuLabelTemplate");
if (value.text == "" and value.reagent and value.reagent ~= "") then
value.text = GetItemInfo(value.reagent);
end
 
elseif value.type == "spell" or value.type == "buff" then
btnMenuItem = CreateFrame("Button", "DA_MenuButton"..index, menu, "SecureActionButtonTemplate, SecureHandlerBaseTemplate, DA_MenuSpellButtonTemplate");
btnMenuItem:SetAttribute("type","spell");
btnMenuItem:SetAttribute("*spell1",value.text);
btnMenuItem:SetAttribute("checkselfcast","1");
btnMenuItem:SetAttribute("checkfocuscast","1");
 
elseif value.type == "item" then
btnMenuItem = CreateFrame("Button", "DA_MenuButton"..index, menu, "SecureActionButtonTemplate, SecureHandlerBaseTemplate, DA_MenuSpellButtonTemplate");
btnMenuItem:SetAttribute("type","item");
btnMenuItem:SetAttribute("*item1", value.text);
btnMenuItem:SetAttribute("checkselfcast","1");
btnMenuItem:SetAttribute("checkfocuscast","1");
 
end
btnMenuItem:SetFrameRef("dag_menu", DagAssist.Menu);
btnMinimap:WrapScript(btnMenuItem, "OnClick", [[control:Run(Close)]])
btnMenuItem:SetClampedToScreen(true);
btnMenuItem:SetAttribute("visible", false);
btnMenuItem:SetAttribute("enabled", false);
 
value.button = btnMenuItem;
value.buttonIcon = _G["DA_MenuButton"..index.."Icon"];
 
DagAssist:SetButtonIcon(value);
btnMenuItem:SetFrameLevel(btnMenuItem:GetFrameLevel() + 1);
btnMenuItem:SetText(value.text);
 
btnMinimap:SetFrameRef("child", btnMenuItem);
btnMinimap:Execute([[
table.insert(menuItems, self:GetFrameRef("child"));
]]);
end
 
--Add the close button
btnMenuItem = CreateFrame("Button", "DA_MenuButtonClose", menu, "SecureActionButtonTemplate, SecureHandlerBaseTemplate, DA_MenuButtonTemplate");
btnMenuItem:SetText("Close");
btnMenuItem:SetAttribute("type", "click");
btnMenuItem:SetAttribute("clickbutton", btnMinimap);
btnMenuItem:SetAttribute("visible", true);
btnMenuItem:SetAttribute("enabled", true);
btnMinimap:SetFrameRef("child", btnMenuItem);
btnMinimap:Execute([[
table.insert(menuItems, self:GetFrameRef("child"));
]]);
 
DagAssist:SetMenuItemVisibility();
DagAssist.MinimapButton:Show();
 
btnMinimap:RegisterEvent("BAG_UPDATE");
btnMinimap:RegisterEvent("LEARNED_SPELL_IN_TAB");
btnMinimap:RegisterEvent("PLAYER_REGEN_DISABLED");
btnMinimap:RegisterEvent("PLAYER_REGEN_ENABLED");
end
 
function DagAssist:BAG_UPDATE(event)
DagAssist:SetMenuItemVisibility();
end
function DagAssist:LEARNED_SPELL_IN_TAB(event)
DagAssist:SetMenuItemVisibility();
end
function DagAssist:PLAYER_REGEN_DISABLED(event)
DagAssist:SetMenuItemVisibility();
end
function DagAssist:PLAYER_REGEN_ENABLED(event)
DagAssist:SetMenuItemVisibility();
end
 
function DagAssist:PlayerKnowsSpell(spellId)
-- Calling GetSpellInfo with the spellID will always return spell information.
-- Calling GetSpellInfo with the spell name will only return a value if the player knows the spell
-- By nesting two calls to GetSpellInfo, we can test if the player knows the spellId
local value = GetSpellInfo(spellId);
if (value ~= nil) then
return (GetSpellInfo(value) ~= nil);
else
return false;
end
end
 
function DagAssist:SetMenuItemVisibility()
--Don't update the menu item visibility if the player is in combat.
if (InCombatLockdown()) then
return;
end
 
local previousItem = nil;
for index = 1, table.getn(DagAssist.MenuList) do
local value = DagAssist.MenuList[index];
 
if (not value.text) then
if ((value.type == "spell" or value.type == "buff") and value.id) then
value.text = GetSpellInfo(value.id);
elseif (value.type == "item" and value.id) then
value.text = GetItemInfo(value.id);
end
end
 
if ((value.button) and (value.reagent) and (value.reagent ~= "")) then
if (not value.reagentname) then value.reagentname = GetItemInfo(value.reagent) end
if (value.text and value.reagentname) then
-- If the item acting as reagent has never been seen by this client, then value.reagentname will be nil
value.button:SetText(value.text .. " (" .. GetItemCount(value.reagentname, false) .. ")");
end
end
 
if ((value.type) and (value.type ~= "") and (value.button)) then
if (value.type == "header") then
value.visible = true;
 
elseif ((value.type == "spell") or (value.type == "buff")) then
if ((value.text) and (value.text ~= "")) then
if (DagAssist:PlayerKnowsSpell(value.text)) then
value.visible = true;
if (not value.IconSet) then
DagAssist:SetButtonIcon(value);
end
 
if (IsUsableSpell(value.text)) then
value.enabled = true;
else
value.enabled = false;
end
 
local startTime, duration, cooldownEnabled;
startTime, duration, cooldownEnabled = GetSpellCooldown(value.id);
 
local secondsRemaining = math.ceil(duration - (GetTime() - startTime));
if (secondsRemaining > 1) then
if (secondsRemaining > 60) then
secondsRemaining = math.ceil(secondsRemaining / 60);
secondsRemaining = string.format(MINUTES_ABBR, secondsRemaining);
else
secondsRemaining = string.format(SECONDS_ABBR, secondsRemaining);
end
value.enabled = false;
value.button:SetText(value.text.." ("..secondsRemaining..")");
else
value.button:SetText(value.text);
end
else
value.visible = false;
end
else
value.visible = false;
end
 
elseif (value.type == "item") then
value.visible = true;
if (not value.IconSet) then
DagAssist:SetButtonIcon(value);
end
 
if (GetItemCount(value.text, false)) > 0 then
local displayName = value.text;
if (value.hearthstone) then
--Set the text and cooldown
displayName = GetBindLocation();
end
 
local startTime, duration, cooldownEnabled;
startTime, duration, cooldownEnabled = GetItemCooldown(value.id);
 
local secondsRemaining = math.ceil(duration - (GetTime() - startTime));
if ((cooldownEnabled == 1) and (secondsRemaining > 1)) then
if (secondsRemaining > 60) then
secondsRemaining = math.ceil(secondsRemaining / 60);
secondsRemaining = string.format(MINUTES_ABBR, secondsRemaining);
else
secondsRemaining = string.format(SECONDS_ABBR, secondsRemaining);
end
value.enabled = false;
value.button:SetText(displayName.." ("..secondsRemaining..")");
else
value.enabled = true;
value.button:SetText(displayName);
end
else
value.enabled = false;
end
 
elseif (value.type == "special") then
value.visible = true;
 
elseif (value.type == "spacer") then
value.visible = true;
 
end
 
if (value.enabled) then
value.button:SetAttribute("enabled", true);
else
value.button:SetAttribute("enabled", false);
end
 
if (value.visible) then
if previousItem then
if ((value.type == "header") and (previousItem.type == "header")) then
if previousItem.button then
previousItem.button:SetAttribute("visible", false);
end
previousItem = previousItem.previous;
end
end
 
if previousItem then
value.count = previousItem.count + 1;
value.previous = previousItem;
else
value.count = 1;
end
 
previousItem = value;
 
value.button:SetAttribute("visible", true);
else
value.button:SetAttribute("visible", false);
end
end
 
end
end
 
function DagAssist:SetButtonIcon(tableEntry)
local itemTexture;
if (tableEntry.text) then
if ((tableEntry.type == "spell") or (tableEntry.type == "buff")) then
itemTexture = GetSpellTexture(tableEntry.text);
 
elseif tableEntry.type == "item" then
--Get the item texture
_, _, _, _, _, _, _, _, _, itemTexture = GetItemInfo(tableEntry.text);
end
end
 
if (itemTexture) then
tableEntry.buttonIcon:SetTexture(itemTexture);
tableEntry.IconSet = true;
end
end
\ No newline at end of file
4.00/ChangeLog.txt New file
0,0 → 1,35
------------------------------------------------
-- DagAssist --
-- Dagos of Cenarius --
------------------------------------------------
2.07
* Updated Paladin and Warlock menus with suggestions from Raloo @ Wowinterface. Thanks!
 
2.06
* Added Aspect of the Dragonhawk
 
2.05
* Updated for 3.0.8
 
2.04
* Added Deathgate and Runeforging for Death Knights
* Fixed the redundant Track Humanoids
 
2.03
* Fixed problem with items not in the cache causing an error on first startup
* Self-cast and focus-cast shortcuts now work
* Glowing-hand selection now functions properly
* Added spell cooldowns
* Fixed the %d problem with spell & item cooldowns
 
2.02
* Fixed the buff type
 
2.01
* Fixed several small bugs
 
2.0
* Initial release for 3.0 / WotLK
* Complete rewrite of inner workings
* Added many abilities and professions
* Translations are no longer necessary. Using the built-in localization for everything
4.00/Images/MinmapIconDown.tga Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes : Added: svn:mime-type + application/octet-stream
4.00/Images/MinmapIconHighlight.tga Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes : Added: svn:mime-type + application/octet-stream
4.00/Images/MinmapIcon.tga Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes : Added: svn:mime-type + application/octet-stream
4.00/DagAssist.toc New file
0,0 → 1,12
## Interface: 40000
## Title: DagAssist
## Author: Dagos (Cenarius)
## Notes: Convenient shortcut menu
## Version: 4.00
## DefaultState: enabled
## LoadOnDemand: 0
## SavedVariablesPerCharacter: DA_Vars
 
DagAssist_Menu.lua
DagAssist.xml
DagAssist.lua
4.00/DagAssist_Menu.lua New file
0,0 → 1,255
------------------------------------------------
-- DagAssist --
-- Dagos of Cenarius --
------------------------------------------------
 
if (not DagAssist) then
DagAssist = {};
end
 
--------------------------------------------------
-- To find a spell or item ID, use Wowhead. Look up the item or spell and the check the URL for the ID
-- TelePort:Ironforge = http://www.wowhead.com/?spell=3562
-- ID = 3562
--------------------------------------------------
 
DagAssist.MenuList = {
 
-----------
--CLASS ABILITIES--
-----------
 
--WARRIOR
{["text"] = CLASS, ["type"] = "header"},
 
--DEATHKNIGHT
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 50977}, --Death Gate
{["type"] = "spell", ["id"] = 53428}, --Runeforging
 
--PALADIN
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 48950}, --Redemption
{["type"] = "spell", ["id"] = 25780}, --Righteous Fury
{["type"] = "spell", ["id"] = 5502}, --Sense Undead
 
--Seals
{["text"] = "Seals", ["type"] = "header"},
{["type"] = "spell", ["id"] = 20165}, --Seal of Light
{["type"] = "spell", ["id"] = 20166}, --Seal of Wisdom
{["type"] = "spell", ["id"] = 21084}, --Seal of Righteousness
{["type"] = "spell", ["id"] = 31801}, --Seal of Vengeance
{["type"] = "spell", ["id"] = 53736}, --Seal of Corruption
{["type"] = "spell", ["id"] = 20164}, --Seal of Justice
{["type"] = "spell", ["id"] = 31892}, --Seal of Blood
{["type"] = "spell", ["id"] = 53720}, --Seal of the Martyr
 
--Blessings
{["text"] = "Blessings", ["type"] = "header"},
{["type"] = "spell", ["id"] = 48932}, --Blessing of Might
{["type"] = "spell", ["id"] = 48936}, --Blessing of Wisdom
{["type"] = "spell", ["id"] = 58054}, --Blessing of Kings
{["type"] = "spell", ["id"] = 20911}, --Blessing of Sanctuary
{["text"] = "Symbol of Kings", ["type"] = "header", ["reagent"] = 21177},
{["type"] = "spell", ["id"] = 48934}, --Greater Blessing of Might
{["type"] = "spell", ["id"] = 48938}, --Greater Blessing of Wisdom
{["type"] = "spell", ["id"] = 25898}, --Greater Blessing of Kings
{["type"] = "spell", ["id"] = 25899}, --Greater Blessing of Sanctuary
 
--PRIEST
{["text"] = CLASS, ["type"] = "header"},
 
--SHAMAN
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 556}, --Astral Recall
{["type"] = "spell", ["id"] = 6196}, --Far Sight
 
--DRUID
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 18960}, --Teleport: Moonglade
--{["type"] = "spell", ["id"] = 5225}, --Track Humanoids
 
--ROGUE
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 1804}, --Pick Lock
 
--MAGE
--Teleports
{["text"] = "", ["type"] = "header", ["reagent"] = 17031},
{["type"] = "spell", ["id"] = 53140}, --Teleport: Dalaran
{["type"] = "spell", ["id"] = 3565}, --Teleport: Darnassus
{["type"] = "spell", ["id"] = 32271}, --Teleport: Exodar
{["type"] = "spell", ["id"] = 3562}, --Teleport: Ironforge
{["type"] = "spell", ["id"] = 3567}, --Teleport: Orgrimmar
{["type"] = "spell", ["id"] = 33690}, --Teleport: Shattrath
{["type"] = "spell", ["id"] = 32272}, --Teleport: Silvermoon
{["type"] = "spell", ["id"] = 49358}, --Teleport: Stonard
{["type"] = "spell", ["id"] = 3561}, --Teleport: Stormwind
{["type"] = "spell", ["id"] = 49359}, --Teleport: Theramore
{["type"] = "spell", ["id"] = 3566}, --Teleport: Thunder Bluff
{["type"] = "spell", ["id"] = 3563}, --Teleport: Undercity
 
--Portals
{["text"] = "", ["type"] = "header", ["reagent"] = 17032},
{["type"] = "spell", ["id"] = 53142}, --Portal: Dalaran
{["type"] = "spell", ["id"] = 11419}, --Portal: Darnassus
{["type"] = "spell", ["id"] = 32266}, --Portal: Exodar
{["type"] = "spell", ["id"] = 11416}, --Portal: Ironforge
{["type"] = "spell", ["id"] = 11417}, --Portal: Orgrimmar
{["type"] = "spell", ["id"] = 33691}, --Portal: Shattrath
{["type"] = "spell", ["id"] = 32267}, --Portal: Silvermoon
{["type"] = "spell", ["id"] = 49361}, --Portal: Stonard
{["type"] = "spell", ["id"] = 10059}, --Portal: Stormwind
{["type"] = "spell", ["id"] = 49360}, --Portal: Theramore
{["type"] = "spell", ["id"] = 11420}, --Portal: Thunder Bluff
{["type"] = "spell", ["id"] = 11418}, --Portal: Undercity
 
--WARLOCK
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 126}, --Eye of Kilrogg
{["type"] = "spell", ["id"] = 5500}, --Sense Demons
{["type"] = "spell", ["id"] = 5697}, --Unending Breathe
{["type"] = "spell", ["id"] = 132}, --Detect Invisability
 
--Buffs
{["text"] = "Buffs", ["type"] = "header"},
{["type"] = "spell", ["id"] = 696}, --Demon Skin
{["type"] = "spell", ["id"] = 47889}, --Demon Armor
{["type"] = "spell", ["id"] = 47893}, --Felarmor
 
--Soul shards
{["text"] = "", ["type"] = "header", ["reagent"] = 6265},
{["type"] = "spell", ["id"] = 6366}, --Create Firestone
{["type"] = "spell", ["id"] = 6201}, --Create Healthstone
{["type"] = "spell", ["id"] = 2362}, --Create Spellstone
{["type"] = "spell", ["id"] = 47884}, --Create Soulstone
{["type"] = "spell", ["id"] = 29893}, --Ritual of Souls
{["type"] = "spell", ["id"] = 698}, --Ritual of Summoning
 
--Minions
{["text"] = "Minions", ["type"] = "header"},
{["type"] = "spell", ["id"] = 691}, --Summon Felhunter
{["type"] = "spell", ["id"] = 30146}, --Summon Felguard
{["type"] = "spell", ["id"] = 712}, --Summon Succubus
{["type"] = "spell", ["id"] = 697}, --Summon Voidwalker
{["type"] = "spell", ["id"] = 688}, --Summon Imp
 
--HUNTER
{["text"] = CLASS, ["type"] = "header"},
{["type"] = "spell", ["id"] = 13161}, --Aspect of the Beast
{["type"] = "spell", ["id"] = 5118}, --Aspect of the Cheetah
{["type"] = "spell", ["id"] = 61846}, --Aspect of the Dragonhawk
{["type"] = "spell", ["id"] = 13165}, --Aspect of the Hawk
{["type"] = "spell", ["id"] = 13163}, --Aspect of the Monkey
{["type"] = "spell", ["id"] = 13159}, --Aspect of the Pack
{["type"] = "spell", ["id"] = 34074}, --Aspect of the Viper
{["type"] = "spell", ["id"] = 20043}, --Aspect of the Wild
 
{["type"] = "spell", ["id"] = 1494}, --Track Beasts
{["type"] = "spell", ["id"] = 19878}, --Track Demons
{["type"] = "spell", ["id"] = 19879}, --Track Dragonkin
{["type"] = "spell", ["id"] = 19880}, --Track Elementals
{["type"] = "spell", ["id"] = 19882}, --Track Giants
{["type"] = "spell", ["id"] = 19885}, --Track Hidden
{["type"] = "spell", ["id"] = 19883}, --Track Humanoids (maybe redundant, it will be covered by the druid spell?)
{["type"] = "spell", ["id"] = 19884}, --Track Undead
 
-----------
--RACIALS--
-----------
 
--DRAENEI
 
--DWARF
{["text"] = RACE, ["type"] = "header"},
{["type"] = "spell", ["id"] = 2481}, --Find Treasure
 
--GNOME
 
--HUMAN
 
--NIGHT ELF
 
--BLOOD ELF
 
--ORC
 
--TAUREN
 
--TROLL
 
--UNDEAD
 
 
 
-----------
--PROFESSIONS--
{["text"] = TRADE_SKILLS, ["type"] = "header"},
-----------
 
--ALCHEMY
{["type"] = "spell", ["id"] = 2259}, --Alchemy
{["type"] = "spell", ["id"] = 28677}, --Elixer Master
{["type"] = "spell", ["id"] = 28675}, --Potion Master
{["type"] = "spell", ["id"] = 28672}, --Transmutation Master
 
--BLACKSMITHING
{["type"] = "spell", ["id"] = 2018}, --Blacksmithing
{["type"] = "spell", ["id"] = 9788}, --Armorsmithing
{["type"] = "spell", ["id"] = 17041}, --Master Axesmith
{["type"] = "spell", ["id"] = 17040}, --Master Hammersmith
{["type"] = "spell", ["id"] = 17039}, --Master Swordsmith
 
--COOKING
{["type"] = "spell", ["id"] = 2550}, --Cooking
{["type"] = "spell", ["id"] = 818}, --Basic Campfire
 
--ENCHANTING
{["type"] = "spell", ["id"] = 7411}, --Enchanting
{["type"] = "spell", ["id"] = 13262}, --Disenchant
 
--ENGINEERING
{["type"] = "spell", ["id"] = 4036}, --Engineering
{["type"] = "spell", ["id"] = 20219}, --Gnomish Engineer
{["type"] = "spell", ["id"] = 20222}, --Goblin Engineer
{["type"] = "spell", ["id"] = 56273}, --Wormhole: Gadgetzan
 
--FIRST AID
{["type"] = "spell", ["id"] = 3273}, --First Aid
 
--FISHING
{["type"] = "spell", ["id"] = 7620}, --Fishing
 
--HERBALISM
{["type"] = "spell", ["id"] = 2383}, --Find Herbs
 
--INSCRIPTION
{["type"] = "spell", ["id"] = 45357}, --Inscription
{["type"] = "spell", ["id"] = 51005}, --Milling
{["type"] = "spell", ["id"] = 52175}, --Decipher
 
--JEWELCRAFTING
{["type"] = "spell", ["id"] = 25229}, --Jewelcrafting
{["type"] = "spell", ["id"] = 31252}, --Prospecting
 
--LEATHERWORKING
{["type"] = "spell", ["id"] = 2108}, --Leatherworking
 
--MINING
{["type"] = "spell", ["id"] = 2580}, --Find Minerals
{["type"] = "spell", ["id"] = 2656}, --Smelting
 
--SKINNING
 
--TAILORING
{["type"] = "spell", ["id"] = 3908}, --Tailoring
 
-----------
--HEARTHSTONE--
{["text"] = HOME, ["type"] = "header"},
-----------
{["text"] = HOME, ["type"] = "item", ["hearthstone"] = true, ["id"] = 6948},
 
{["type"] = "spacer"}
 
};