From 966d7484405eae6f142fc0a6b0ccade7d48d4c8e Mon Sep 17 00:00:00 2001 From: Misha Novik Date: Sun, 25 Aug 2019 22:25:02 +0300 Subject: [PATCH 01/22] add .gitignore --- .gitignore | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f75ce25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +### Vim ### +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session +Session.vim +# temporary +.netrwhist +*~ +# auto-generated tag files +tags From 587bed2e668562fba0e229333c3e510c11d0d466 Mon Sep 17 00:00:00 2001 From: Misha Novik Date: Sun, 25 Aug 2019 22:42:33 +0300 Subject: [PATCH 02/22] fix unit frames Remove background & class colors --- unit/unit.lua | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/unit/unit.lua b/unit/unit.lua index f7e80c6..c2ce0f6 100755 --- a/unit/unit.lua +++ b/unit/unit.lua @@ -42,7 +42,7 @@ PlayerFrame.bg = PlayerFrame:CreateTexture() PlayerFrame.bg:SetPoint('TOPLEFT', PlayerFrameBackground) PlayerFrame.bg:SetPoint('BOTTOMRIGHT', PlayerFrameBackground, 0, 22) - PlayerFrame.bg:SetTexture[[Interface/AddOns/modui_classic/art/statusbar/namebg.tga]] + --PlayerFrame.bg:SetTexture[[Interface/AddOns/modui_classic/art/statusbar/namebg.tga]] PlayerFrame.bg:SetVertexColor(colour.r, colour.g, colour.b) end @@ -130,7 +130,7 @@ TargetFrameHealthBar:HookScript('OnValueChanged', UpdateTargetValue) - TargetFrameNameBackground:SetTexture[[Interface/AddOns/modui_classic/art/statusbar/namebg.tga]] + --TargetFrameNameBackground:SetTexture[[Interface/AddOns/modui_classic/art/statusbar/namebg.tga]] TargetFrame.Elite = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') TargetFrame.Elite:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Elite]] @@ -314,16 +314,20 @@ end local UpdateTargetNameClassColour = function() + --[[ if UnitIsPlayer'target' then local _, class = UnitClass'target' local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] TargetFrameNameBackground:SetVertexColor(colour.r, colour.g, colour.b) end + --]] end local UpdatePartyTextClassColour = function() for i = 1, MAX_PARTY_MEMBERS do local name = _G['PartyMemberFrame'..i..'Name'] + + --[[ if UnitIsPlayer('party'..i) then local _, class = UnitClass('party'..i) local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] @@ -331,8 +335,9 @@ name:SetTextColor(colour.r, colour.g, colour.b) end else - name:SetTextColor(1, .8, 0) - end + --]] + + name:SetTextColor(1, .8, 0) end end @@ -381,11 +386,7 @@ local colour = RAID_CLASS_COLORS[class] local name = UnitName'targettarget' - if UnitIsPlayer'targettarget' then - TargetFrameToTTextureFrameName:SetTextColor(colour.r, colour.g, colour.b) - else - TargetFrameToTTextureFrameName:SetTextColor(1, .8, 0) - end + TargetFrameToTTextureFrameName:SetTextColor(1, .8, 0) TargetFrameToTTextureFrameName:ClearAllPoints() TargetFrameToTTextureFrameName:SetPoint('BOTTOMLEFT', TargetFrameToTTextureFrame, 49, 0) From 864578b442206775ebe6479e35389ca5eb6ca41a Mon Sep 17 00:00:00 2001 From: Misha Novik Date: Sat, 7 Sep 2019 22:37:39 +0300 Subject: [PATCH 03/22] wip --- core/colour.lua | 48 +++++++++++++++++++++++++----------------------- unit/unit.lua | 25 ++++++++++++++----------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/core/colour.lua b/core/colour.lua index ca76b37..299cc40 100755 --- a/core/colour.lua +++ b/core/colour.lua @@ -33,29 +33,31 @@ RAID_CLASS_COLORS['SHAMAN'] = INTERNAL_CLASS_COLORS['SHAMAN'] local AddPowerColour = function() - PowerBarColor['MANA'] = { - r = MODUI_VAR['elements']['statusbar']['mana'].r or 0, - g = MODUI_VAR['elements']['statusbar']['mana'].g or 0, - b = MODUI_VAR['elements']['statusbar']['mana'].b or 1, - } - PowerBarColor['RAGE'] = { - r = MODUI_VAR['elements']['statusbar']['rage'].r or 1, - g = MODUI_VAR['elements']['statusbar']['rage'].g or 0, - b = MODUI_VAR['elements']['statusbar']['rage'].b or 0, - fullPowerAnim = true - } - PowerBarColor['FOCUS'] = { - r = MODUI_VAR['elements']['statusbar']['focus'].r or 1, - g = MODUI_VAR['elements']['statusbar']['focus'].g or .5, - b = MODUI_VAR['elements']['statusbar']['focus'].b or .25, - fullPowerAnim = true - } - PowerBarColor['ENERGY'] = { - r = MODUI_VAR['elements']['statusbar']['energy'].r or 1, - g = MODUI_VAR['elements']['statusbar']['energy'].g or 1, - b = MODUI_VAR['elements']['statusbar']['energy'].b or 0, - fullPowerAnim = true - } + if MODUI_VAR['elements']['statusbar'] then + PowerBarColor['MANA'] = { + r = MODUI_VAR['elements']['statusbar']['mana'].r or 0, + g = MODUI_VAR['elements']['statusbar']['mana'].g or 0, + b = MODUI_VAR['elements']['statusbar']['mana'].b or 1, + } + PowerBarColor['RAGE'] = { + r = MODUI_VAR['elements']['statusbar']['rage'].r or 1, + g = MODUI_VAR['elements']['statusbar']['rage'].g or 0, + b = MODUI_VAR['elements']['statusbar']['rage'].b or 0, + fullPowerAnim = true + } + PowerBarColor['FOCUS'] = { + r = MODUI_VAR['elements']['statusbar']['focus'].r or 1, + g = MODUI_VAR['elements']['statusbar']['focus'].g or .5, + b = MODUI_VAR['elements']['statusbar']['focus'].b or .25, + fullPowerAnim = true + } + PowerBarColor['ENERGY'] = { + r = MODUI_VAR['elements']['statusbar']['energy'].r or 1, + g = MODUI_VAR['elements']['statusbar']['energy'].g or 1, + b = MODUI_VAR['elements']['statusbar']['energy'].b or 0, + fullPowerAnim = true + } + end end ns.CLASS_COLOUR = function(f, a) diff --git a/unit/unit.lua b/unit/unit.lua index c2ce0f6..255a06a 100755 --- a/unit/unit.lua +++ b/unit/unit.lua @@ -42,13 +42,10 @@ PlayerFrame.bg = PlayerFrame:CreateTexture() PlayerFrame.bg:SetPoint('TOPLEFT', PlayerFrameBackground) PlayerFrame.bg:SetPoint('BOTTOMRIGHT', PlayerFrameBackground, 0, 22) - --PlayerFrame.bg:SetTexture[[Interface/AddOns/modui_classic/art/statusbar/namebg.tga]] PlayerFrame.bg:SetVertexColor(colour.r, colour.g, colour.b) end - PlayerPVPIcon:SetSize(48, 48) - PlayerPVPIcon:ClearAllPoints() - PlayerPVPIcon:SetPoint('CENTER', PlayerFrame, 'LEFT', 60, 16) + PlayerPVPIcon:SetAlpha(0) if MODUI_VAR['elements']['unit'].castbar then CastingBarFrame.Icon:SetSize(16, 16) @@ -130,7 +127,7 @@ TargetFrameHealthBar:HookScript('OnValueChanged', UpdateTargetValue) - --TargetFrameNameBackground:SetTexture[[Interface/AddOns/modui_classic/art/statusbar/namebg.tga]] + TargetFrameNameBackground:SetTexture(nil) TargetFrame.Elite = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') TargetFrame.Elite:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Elite]] @@ -166,11 +163,14 @@ v:SetFont(STANDARD_TEXT_FONT, 10, 'OUTLINE') end - TargetFrameTextureFramePVPIcon:SetSize(48, 48) - TargetFrameTextureFramePVPIcon:ClearAllPoints() - TargetFrameTextureFramePVPIcon:SetPoint('CENTER', TargetFrame, 'RIGHT', -42, 16) + --TargetFrameTextureFramePVPIcon:SetSize(48, 48) + --TargetFrameTextureFramePVPIcon:ClearAllPoints() + --TargetFrameTextureFramePVPIcon:SetPoint('CENTER', TargetFrame, 'RIGHT', -42, 16) + + TargetFrameTextureFramePVPIcon:SetAlpha(0) end + local AddToTFrame = function() TargetFrameToTPortrait:SetSize(37, 37) TargetFrameToTPortrait:SetPoint('TOPLEFT', 5, -5) @@ -202,12 +202,15 @@ end local AddHealthTextColour = function(t, statusbar) + --[[ local min, max = statusbar:GetMinMaxValues() local v = statusbar:GetValue() ns.GRADIENT_COLOUR(t, v, min, max) + --]] end local AddManaTextColour = function(t, class, powertype) + --[[ if MODUI_VAR['elements']['unit'].vcolour then if class == 'ROGUE' or (class == 'DRUID' and powertype == 3) then t:SetTextColor(250/255, 240/255, 200/255) @@ -219,6 +222,7 @@ else t:SetTextColor(1, 1, 1) end + --]] end local AddTargetAura = function(self) @@ -314,13 +318,11 @@ end local UpdateTargetNameClassColour = function() - --[[ if UnitIsPlayer'target' then local _, class = UnitClass'target' local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] - TargetFrameNameBackground:SetVertexColor(colour.r, colour.g, colour.b) + --TargetFrameNameBackground:SetVertexColor(0.25, 0.78, 0.92) end - --]] end local UpdatePartyTextClassColour = function() @@ -436,6 +438,7 @@ AddPartyPets() if not InCombatLockdown() then UpdatePartyTextClassColour() end end + end local e = CreateFrame'Frame' From 22b97569f0ad6717fb3577680670773adf73ce25 Mon Sep 17 00:00:00 2001 From: wtfblub Date: Sun, 29 Sep 2019 17:28:32 +0200 Subject: [PATCH 04/22] Cleanup options + Move default options merge to var.lua to make sure it happens before any of the other code tries to access the options + Refactor how child options are added to make ToggleChildButton work without hardcoding the name --- core/var.lua | 25 ++ options/options.lua | 608 ++++++++++++++++++-------------------------- 2 files changed, 272 insertions(+), 361 deletions(-) diff --git a/core/var.lua b/core/var.lua index 7df9ae7..086f479 100755 --- a/core/var.lua +++ b/core/var.lua @@ -90,5 +90,30 @@ } MODUI_VAR_DEFAULTS = MODUI_VAR + local OnEvent = function(self, event, addon) + -- Copies default values to the saved variables + -- This makes sure existing saved variables get newly added options + local function MergeTable(source, destination) + if destination == nil then + destination = {} + end + + for key, value in pairs(source) do + if type(value) == 'table' then + destination[key] = MergeTable(value, destination[key]) + elseif destination[key] == nil then + destination[key] = value + end + end + + return destination + end + + MODUI_VAR = MergeTable(MODUI_VAR_DEFAULTS, MODUI_VAR) + end + + local e = CreateFrame'Frame' + e:RegisterEvent'VARIABLES_LOADED' + e:SetScript('OnEvent', OnEvent) -- diff --git a/options/options.lua b/options/options.lua index 0da7a08..55df090 100755 --- a/options/options.lua +++ b/options/options.lua @@ -187,17 +187,18 @@ local ToggleChildButton = function(self, table) if self:GetChecked() then - for _, v in pairs(table) do - v:Enable() + for _, v in pairs(self.suboptions) do + _G[v]:Enable() end else - for _, v in pairs(table) do - v:Disable() + for _, v in pairs(self.suboptions) do + _G[v]:Disable() end end end - local add = function(name, func, checked, r, g, b, inset, enable) + local add = nil + add = function(name, func, checked, r, g, b, inset, enable, children) local bu = CreateFrame('CheckButton', 'modui_checkbutton'..i, menu.inner, 'UICheckButtonTemplate') bu:SetSize(19, 19) bu:SetPoint('TOPLEFT', @@ -224,42 +225,49 @@ i = i + 1 tinsert(j, bu) k = inset and true or false - --print(name, inset, k) + + bu.suboptions = {} + if children then + for _, v in ipairs(children) do + tinsert(bu.suboptions, 'modui_checkbutton'..i) + local name, func, checked, enable = unpack(v) + add(name, func, checked, 1, 1, 1, true, enable) + end + end end local AddMenu = function() + local add = function(name, func, checked, children) + add(name, func, checked, 1, .8, 0, nil, true, children) + end add( 'Actionbar', function(self) MODUI_VAR['elements']['mainbar'].enable = self:GetChecked() and true or false ShowReload() + ToggleChildButton(self) end, MODUI_VAR['elements']['mainbar'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Exp & Reputation Bar', - function(self) - MODUI_VAR['elements']['mainbar'].xp = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['mainbar'].xp and true or false, - 1, 1, 1, - true, - true - ) - add( - 'Horizontal Third Row (Classic Layout only)', - function(self) - MODUI_VAR['elements']['mainbar'].horiz = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['mainbar'].horiz and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['mainbar'].enable and false or true + { + { + 'Exp & Reputation Bar', + function(self) + MODUI_VAR['elements']['mainbar'].xp = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['mainbar'].xp and true or false, + MODUI_VAR['elements']['mainbar'].enable and true or false + }, + { + 'Horizontal Third Row (Classic Layout only)', + function(self) + MODUI_VAR['elements']['mainbar'].horiz = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['mainbar'].horiz and true or false, + MODUI_VAR['elements']['mainbar'].enable and true or false + }, + } ) add( 'Cast Spells on Button Down', @@ -267,48 +275,34 @@ MODUI_VAR['elements']['mainbar'].keypress = self:GetChecked() and true or false ShowReload() end, - MODUI_VAR['elements']['mainbar'].keypress and true or false, - 1, .8, 0, - nil, - true + MODUI_VAR['elements']['mainbar'].keypress and true or false ) add( 'Aura', function(self) MODUI_VAR['elements']['aura'].enable = self:GetChecked() and true or false ShowReload() - ToggleChildButton( - self, - { - _G['modui_checkbutton6'], - _G['modui_checkbutton7'] - } - ) + ToggleChildButton(self) end, MODUI_VAR['elements']['aura'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Statusbars on Auras', - function(self) - MODUI_VAR['elements']['aura'].statusbars = self:GetChecked() and true or false - end, - MODUI_VAR['elements']['aura'].statusbars and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['aura'].enable and true or false - ) - add( - 'Custom Value Formatting on Auras', - function(self) - MODUI_VAR['elements']['aura'].values = self:GetChecked() and true or false - end, - MODUI_VAR['elements']['aura'].values and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['aura'].enable and true or false + { + { + 'Statusbars on Auras', + function(self) + MODUI_VAR['elements']['aura'].statusbars = self:GetChecked() and true or false + end, + MODUI_VAR['elements']['aura'].statusbars and true or false, + MODUI_VAR['elements']['aura'].enable and true or false + }, + { + 'Custom Value Formatting on Auras', + function(self) + MODUI_VAR['elements']['aura'].values = self:GetChecked() and true or false + end, + MODUI_VAR['elements']['aura'].values and true or false, + MODUI_VAR['elements']['aura'].enable and true or false + } + } ) add( 'Castbar', @@ -316,74 +310,54 @@ MODUI_VAR['elements']['unit'].castbar = self:GetChecked() and true or false ShowReload() end, - MODUI_VAR['elements']['unit'].castbar and true or false, - 1, .8, 0, - nil, - true + MODUI_VAR['elements']['unit'].castbar and true or false ) add( 'Chat', function(self) MODUI_VAR['elements']['chat'].enable = self:GetChecked() and true or false ShowReload() - ToggleChildButton( - self, - { - _G['modui_checkbutton10'], - _G['modui_checkbutton11'], - _G['modui_checkbutton12'], - _G['modui_checkbutton13'], - } - ) + ToggleChildButton(self) end, MODUI_VAR['elements']['chat'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Events & Custom Chat Text', - function(self) - MODUI_VAR['elements']['chat'].events = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['chat'].events and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['chat'].enable and true or false - ) - add( - 'Chat Style', - function(self) - MODUI_VAR['elements']['chat'].style = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['chat'].style and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['chat'].enable and true or false - ) - add( - 'Chat Color Names by Class', - function(self) - MODUI_VAR['elements']['chat'].colornames = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['chat'].colornames and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['chat'].enable and true or false - ) - add( - 'URLs', - function(self) - MODUI_VAR['elements']['chat'].url = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['chat'].url and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['chat'].enable and true or false + { + { + 'Events & Custom Chat Text', + function(self) + MODUI_VAR['elements']['chat'].events = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['chat'].events and true or false, + MODUI_VAR['elements']['chat'].enable and true or false + }, + { + 'Chat Style', + function(self) + MODUI_VAR['elements']['chat'].style = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['chat'].style and true or false, + MODUI_VAR['elements']['chat'].enable and true or false + }, + { + 'Chat Color Names by Class', + function(self) + MODUI_VAR['elements']['chat'].colornames = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['chat'].colornames and true or false, + MODUI_VAR['elements']['chat'].enable and true or false + }, + { + 'URLs', + function(self) + MODUI_VAR['elements']['chat'].url = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['chat'].url and true or false, + MODUI_VAR['elements']['chat'].enable and true or false + } + } ) add( 'Inventory', @@ -392,20 +366,17 @@ ShowReload() end, MODUI_VAR['elements']['onebag'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Button For Selling Grey Items at Vendor', - function(self) - MODUI_VAR['elements']['onebag'].greys = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['onebag'].greys and true or false, - 1, 1, 1, - true, - true + { + { + 'Button For Selling Grey Items at Vendor', + function(self) + MODUI_VAR['elements']['onebag'].greys = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['onebag'].greys and true or false, + MODUI_VAR['elements']['onebag'].enable + } + } ) add( 'Enemy Castbars', @@ -413,73 +384,53 @@ MODUI_VAR['elements']['ecastbar'].enable = self:GetChecked() and true or false ShowReload() end, - MODUI_VAR['elements']['ecastbar'].enable and true or false, - 1, .8, 0, - nil, - true + MODUI_VAR['elements']['ecastbar'].enable and true or false ) add( 'Nameplates', function(self) MODUI_VAR['elements']['nameplate'].enable = self:GetChecked() and true or false ShowReload() - ToggleChildButton( - self, - { - _G['modui_checkbutton18'], - _G['modui_checkbutton19'], - _G['modui_checkbutton20'], - _G['modui_checkbutton21'], - } - ) + ToggleChildButton(self) end, MODUI_VAR['elements']['nameplate'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Show Auras on Nameplates', - function(self) - MODUI_VAR['elements']['nameplate'].aura = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['nameplate'].aura and true or false, - 1, 1, 1, - true, - true - ) - add( - 'Show Combo Points on Nameplate', - function(self) - MODUI_VAR['elements']['nameplate'].combo = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['nameplate'].combo and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['nameplate'].enable and true or false - ) - add( - 'Class Colours on Friendly Nameplates', - function(self) - MODUI_VAR['elements']['nameplate'].friendlyclass = self:GetChecked() and true or false - end, - MODUI_VAR['elements']['nameplate'].friendlyclass and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['nameplate'].enable and true or false - ) - add( - 'Icon-based Nameplates for Totems', - function(self) - MODUI_VAR['elements']['nameplate'].totem = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['nameplate'].totem and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['nameplate'].enable and true or false + { + { + 'Show Auras on Nameplates', + function(self) + MODUI_VAR['elements']['nameplate'].aura = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['nameplate'].aura and true or false, + MODUI_VAR['elements']['nameplate'].enable and true or false + }, + { + 'Show Combo Points on Nameplate', + function(self) + MODUI_VAR['elements']['nameplate'].combo = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['nameplate'].combo and true or false, + MODUI_VAR['elements']['nameplate'].enable and true or false + }, + { + 'Class Colours on Friendly Nameplates', + function(self) + MODUI_VAR['elements']['nameplate'].friendlyclass = self:GetChecked() and true or false + end, + MODUI_VAR['elements']['nameplate'].friendlyclass and true or false, + MODUI_VAR['elements']['nameplate'].enable and true or false + }, + { + 'Icon-based Nameplates for Totems', + function(self) + MODUI_VAR['elements']['nameplate'].totem = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['nameplate'].totem and true or false, + MODUI_VAR['elements']['nameplate'].enable and true or false + } + } ) add( 'Quest Tracker (Click-through to Quest Log)', @@ -487,162 +438,119 @@ MODUI_VAR['elements']['tracker'].enable = self:GetChecked() and true or false ShowReload() end, - MODUI_VAR['elements']['tracker'].enable and true or false, - 1, .8, 0, - nil, - true + MODUI_VAR['elements']['tracker'].enable and true or false ) add( 'Tooltip', function(self) MODUI_VAR['elements']['tooltip'].enable = self:GetChecked() and true or false ShowReload() - ToggleChildButton( - self, - { - _G['modui_checkbutton24'], - _G['modui_checkbutton25'], - } - ) + ToggleChildButton(self) end, MODUI_VAR['elements']['tooltip'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Mouse Anchor', - function(self) - MODUI_VAR['elements']['tooltip'].mouseanchor = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['tooltip'].mouseanchor and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['tooltip'].enable and true or false - ) - add( - 'Disable fade out', - function(self) - MODUI_VAR['elements']['tooltip'].disablefade = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['tooltip'].disablefade and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['tooltip'].enable and true or false + { + { + 'Mouse Anchor', + function(self) + MODUI_VAR['elements']['tooltip'].mouseanchor = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['tooltip'].mouseanchor and true or false, + MODUI_VAR['elements']['tooltip'].enable and true or false + }, + { + 'Disable fade out', + function(self) + MODUI_VAR['elements']['tooltip'].disablefade = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['tooltip'].disablefade and true or false, + MODUI_VAR['elements']['tooltip'].enable and true or false + } + } ) add( 'Unitframes', function(self) MODUI_VAR['elements']['unit'].enable = self:GetChecked() and true or false ShowReload() - ToggleChildButton( - self, - { - _G['modui_checkbutton27'], - _G['modui_checkbutton28'], - _G['modui_checkbutton29'], - _G['modui_checkbutton30'], - _G['modui_checkbutton31'], - _G['modui_checkbutton32'], - _G['modui_checkbutton33'], - _G['modui_checkbutton34'], - } - ) + ToggleChildButton(self) end, MODUI_VAR['elements']['unit'].enable and true or false, - 1, .8, 0, - nil, - true - ) - add( - 'Player', - function(self) - MODUI_VAR['elements']['unit'].player = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].player and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Target', - function(self) - MODUI_VAR['elements']['unit'].target = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].target and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Party', - function(self) - MODUI_VAR['elements']['unit'].party = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].party and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Target of Target', - function(self) - MODUI_VAR['elements']['unit'].tot = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].tot and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Pet', - function(self) - MODUI_VAR['elements']['unit'].pet = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].pet and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Cooldowns on Auras', - function(self) - MODUI_VAR['elements']['unit'].auras = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].auras and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Value Colours on Text', - function(self) - MODUI_VAR['elements']['unit'].vcolour = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].vcolour and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false - ) - add( - 'Elite/Rare Dragons in Colour (for dark theme UIs)', - function(self) - MODUI_VAR['elements']['unit'].rcolour = self:GetChecked() and true or false - ShowReload() - end, - MODUI_VAR['elements']['unit'].rcolour and true or false, - 1, 1, 1, - true, - MODUI_VAR['elements']['unit'].enable and true or false + { + { + 'Player', + function(self) + MODUI_VAR['elements']['unit'].player = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].player and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Target', + function(self) + MODUI_VAR['elements']['unit'].target = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].target and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Party', + function(self) + MODUI_VAR['elements']['unit'].party = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].party and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Target of Target', + function(self) + MODUI_VAR['elements']['unit'].tot = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].tot and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Pet', + function(self) + MODUI_VAR['elements']['unit'].pet = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].pet and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Cooldowns on Auras', + function(self) + MODUI_VAR['elements']['unit'].auras = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].auras and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Value Colours on Text', + function(self) + MODUI_VAR['elements']['unit'].vcolour = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].vcolour and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + }, + { + 'Elite/Rare Dragons in Colour (for dark theme UIs)', + function(self) + MODUI_VAR['elements']['unit'].rcolour = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['unit'].rcolour and true or false, + MODUI_VAR['elements']['unit'].enable and true or false + } + } ) add( 'Show Talent Builds', @@ -650,33 +558,11 @@ MODUI_VAR['elements']['talentbuilds'].enable = self:GetChecked() and true or false ShowReload() end, - MODUI_VAR['elements']['talentbuilds'].enable and true or false, - 1, .8, 0, - nil, - true + MODUI_VAR['elements']['talentbuilds'].enable and true or false ) end local OnEvent = function(self, event, addon) - -- Copies default values to the saved variables - -- This makes sure existing saved variables get newly added options - local function MergeTable(source, destination) - if destination == nil then - destination = {} - end - - for key, value in pairs(source) do - if type(value) == 'table' then - destination[key] = MergeTable(value, destination[key]) - elseif destination[key] == nil then - destination[key] = value - end - end - - return destination - end - - MODUI_VAR = MergeTable(MODUI_VAR_DEFAULTS, MODUI_VAR) AddMenu() end From a7ad3e4e4d22de77a9127a9a047cc3bc399832d7 Mon Sep 17 00:00:00 2001 From: wtfblub Date: Sun, 29 Sep 2019 17:30:49 +0200 Subject: [PATCH 05/22] Add option to hide gryphon buttons Closes #95 --- bag/menu.lua | 10 +++++++--- core/var.lua | 2 ++ menu/menu.lua | 8 +++++--- options/options.lua | 22 ++++++++++++++++++++++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/bag/menu.lua b/bag/menu.lua index 1251889..669903f 100755 --- a/bag/menu.lua +++ b/bag/menu.lua @@ -88,9 +88,13 @@ local OnEvent = function(self, event) if MODUI_VAR['elements']['mainbar'].enable then - AddBagMenu() - UpdateFreeSlots() - hooksecurefunc('MainMenuBarBackpackButton_UpdateFreeSlots', UpdateFreeSlots) + if MODUI_VAR['elements']['mainbar'].bagbutton then + AddBagMenu() + UpdateFreeSlots() + hooksecurefunc('MainMenuBarBackpackButton_UpdateFreeSlots', UpdateFreeSlots) + else + bu:Hide() + end end end diff --git a/core/var.lua b/core/var.lua index 086f479..d3b77ee 100755 --- a/core/var.lua +++ b/core/var.lua @@ -39,6 +39,8 @@ keypress = true, xp = true, horiz = false, + micromenubutton = true, + bagbutton = true, }, nameplate = { enable = true, diff --git a/menu/menu.lua b/menu/menu.lua index f85f3ce..b57c0e3 100755 --- a/menu/menu.lua +++ b/menu/menu.lua @@ -216,9 +216,11 @@ local OnEvent = function(self, event) if MODUI_VAR['elements']['mainbar'].enable then - if event == 'PLAYER_LOGIN' then - AddMenu() - hooksecurefunc('UpdateMicroButtons', PositionMicroButtons) + if MODUI_VAR['elements']['mainbar'].micromenubutton then + if event == 'PLAYER_LOGIN' then + AddMenu() + hooksecurefunc('UpdateMicroButtons', PositionMicroButtons) + end end PositionMicroButtons() end diff --git a/options/options.lua b/options/options.lua index 55df090..a2a8374 100755 --- a/options/options.lua +++ b/options/options.lua @@ -97,6 +97,8 @@ MODUI_VAR['elements'].all = true MODUI_VAR['elements']['mainbar'].enable = true MODUI_VAR['elements']['mainbar'].keypress = true + MODUI_VAR['elements']['mainbar'].micromenubutton = true + MODUI_VAR['elements']['mainbar'].bagbutton = true MODUI_VAR['elements']['aura'].enable = true MODUI_VAR['elements']['aura'].statusbars = true MODUI_VAR['elements']['aura'].values = true @@ -135,6 +137,8 @@ MODUI_VAR['elements'].all = false MODUI_VAR['elements']['mainbar'].enable = false MODUI_VAR['elements']['mainbar'].keypress = false + MODUI_VAR['elements']['mainbar'].micromenubutton = false + MODUI_VAR['elements']['mainbar'].bagbutton = false MODUI_VAR['elements']['aura'].enable = false MODUI_VAR['elements']['aura'].statusbars = false MODUI_VAR['elements']['aura'].values = false @@ -267,6 +271,24 @@ MODUI_VAR['elements']['mainbar'].horiz and true or false, MODUI_VAR['elements']['mainbar'].enable and true or false }, + { + 'Micro Menu Button', + function(self) + MODUI_VAR['elements']['mainbar'].micromenubutton = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['mainbar'].micromenubutton and true or false, + MODUI_VAR['elements']['mainbar'].enable and true or false + }, + { + 'Bag Button', + function(self) + MODUI_VAR['elements']['mainbar'].bagbutton = self:GetChecked() and true or false + ShowReload() + end, + MODUI_VAR['elements']['mainbar'].bagbutton and true or false, + MODUI_VAR['elements']['mainbar'].enable and true or false + } } ) add( From a51e80b93d5457b865fcacf2e2d946f704b571c5 Mon Sep 17 00:00:00 2001 From: wtfblub Date: Sun, 29 Sep 2019 18:09:21 +0200 Subject: [PATCH 06/22] Add support for WideQuestLog and Leatrix_Plus quest logs Fixes #94 --- theme/theme.lua | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/theme/theme.lua b/theme/theme.lua index 6635bb8..82afc95 100755 --- a/theme/theme.lua +++ b/theme/theme.lua @@ -4,6 +4,7 @@ local f = CreateFrame'Frame' local build = tonumber(string.sub(GetBuildInfo() , 1, 2)) + local UpdateSkins = nil ns.colour = {MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b} ns.colour_bu = {MODUI_VAR['theme_bu'].r, MODUI_VAR['theme_bu'].g, MODUI_VAR['theme_bu'].b} @@ -266,7 +267,27 @@ end local ADDON_LOADED = function(self, event, addon) - if addon == 'Blizzard_TimeManager' then + local function CheckForAddOn(name) + if addon == name then + return true + elseif addon == 'modui_classic' then + return IsAddOnLoaded(name) + end + end + + if CheckForAddOn('Leatrix_Plus') then + if LeaPlusDB['EnhanceQuestLog'] == 'On' then + QuestLogFrame.Material:SetSize(510, 512) + end + elseif CheckForAddOn('WideQuestLog') then + QuestLogFrame.Material:ClearAllPoints() + QuestLogFrame.Material:SetPoint('TOPLEFT', QuestLogDetailScrollFrame, 'TOPLEFT', -10, 0); + QuestLogFrame.Material:SetSize(520, 552) + local _, _, _, _, _, _, _, _, _, _, _, _, a, b = QuestLogFrame:GetRegions() + for _, v in pairs({a, b}) do + tinsert(ns.skin, v) + end + elseif addon == 'Blizzard_TimeManager' then local a = TimeManagerClockButton:GetRegions() tinsert(ns.skin, a) elseif addon == 'Blizzard_AuctionUI' then @@ -390,7 +411,7 @@ tinsert(ns.skinb, QuestTimerFrame) tinsert(ns.skin, QuestTimerHeader) - local UpdateSkins = function() + UpdateSkins = function() for _, v in pairs(ns.skin) do if v and v:GetObjectType() == 'Texture' and v:GetVertexColor() then v:SetVertexColor( From 062cf044a2b42c8d5f273259a9dcc5eb79d379aa Mon Sep 17 00:00:00 2001 From: wtfblub Date: Fri, 4 Oct 2019 10:56:33 +0200 Subject: [PATCH 07/22] Move addon skins to separate files --- modui_classic.toc | 4 ++++ theme/addons/LeatrixPlus.lua | 10 ++++++++++ theme/addons/WideQuestLog.lua | 15 +++++++++++++++ theme/theme.lua | 19 +++++++------------ 4 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 theme/addons/LeatrixPlus.lua create mode 100644 theme/addons/WideQuestLog.lua diff --git a/modui_classic.toc b/modui_classic.toc index 6226ab5..dbe9714 100755 --- a/modui_classic.toc +++ b/modui_classic.toc @@ -82,3 +82,7 @@ worldmap/worldmap.lua # ~options options/options.lua + +# ~addon skins +theme/addons/LeatrixPlus.lua +theme/addons/WideQuestLog.lua diff --git a/theme/addons/LeatrixPlus.lua b/theme/addons/LeatrixPlus.lua new file mode 100644 index 0000000..6ffcc93 --- /dev/null +++ b/theme/addons/LeatrixPlus.lua @@ -0,0 +1,10 @@ +local _, ns = ... +local addons = ns.addon_skins + +local function load() + if LeaPlusDB['EnhanceQuestLog'] == 'On' then + QuestLogFrame.Material:SetSize(510, 512) + end +end + +tinsert(addons, {name = 'Leatrix_Plus', load = load}) diff --git a/theme/addons/WideQuestLog.lua b/theme/addons/WideQuestLog.lua new file mode 100644 index 0000000..de5765b --- /dev/null +++ b/theme/addons/WideQuestLog.lua @@ -0,0 +1,15 @@ +local _, ns = ... +local skin = ns.skin +local addons = ns.addon_skins + +local function load() + QuestLogFrame.Material:ClearAllPoints() + QuestLogFrame.Material:SetPoint('TOPLEFT', QuestLogDetailScrollFrame, 'TOPLEFT', -10, 0) + QuestLogFrame.Material:SetSize(520, 552) + local _, _, _, _, _, _, _, _, _, _, _, _, a, b = QuestLogFrame:GetRegions() + for _, v in pairs({a, b}) do + tinsert(skin, v) + end +end + +tinsert(addons, {name = 'WideQuestLog', load = load}) diff --git a/theme/theme.lua b/theme/theme.lua index 82afc95..36edf80 100755 --- a/theme/theme.lua +++ b/theme/theme.lua @@ -9,6 +9,7 @@ ns.colour = {MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b} ns.colour_bu = {MODUI_VAR['theme_bu'].r, MODUI_VAR['theme_bu'].g, MODUI_VAR['theme_bu'].b} + ns.addon_skins = {} ns.skin = { MinimapBorder, MiniMapTrackingBorder, @@ -275,19 +276,13 @@ end end - if CheckForAddOn('Leatrix_Plus') then - if LeaPlusDB['EnhanceQuestLog'] == 'On' then - QuestLogFrame.Material:SetSize(510, 512) + for _, v in pairs(ns.addon_skins) do + if CheckForAddOn(v.name) then + v.load() end - elseif CheckForAddOn('WideQuestLog') then - QuestLogFrame.Material:ClearAllPoints() - QuestLogFrame.Material:SetPoint('TOPLEFT', QuestLogDetailScrollFrame, 'TOPLEFT', -10, 0); - QuestLogFrame.Material:SetSize(520, 552) - local _, _, _, _, _, _, _, _, _, _, _, _, a, b = QuestLogFrame:GetRegions() - for _, v in pairs({a, b}) do - tinsert(ns.skin, v) - end - elseif addon == 'Blizzard_TimeManager' then + end + + if addon == 'Blizzard_TimeManager' then local a = TimeManagerClockButton:GetRegions() tinsert(ns.skin, a) elseif addon == 'Blizzard_AuctionUI' then From fc23282c2993eed6ff69b1ecbc27828f4c561146 Mon Sep 17 00:00:00 2001 From: Misha Novik Date: Thu, 24 Oct 2019 00:34:15 +0300 Subject: [PATCH 08/22] :poop: --- actionbar/bars.lua | 6 +++ actionbar/keypress.lua | 3 +- unit/unit.lua | 83 +++++++++++++++++++++++++++++++++++------- 3 files changed, 78 insertions(+), 14 deletions(-) diff --git a/actionbar/bars.lua b/actionbar/bars.lua index 3377ef7..4879beb 100755 --- a/actionbar/bars.lua +++ b/actionbar/bars.lua @@ -363,6 +363,10 @@ hooksecurefunc('ShowPetActionBar', UpdatePetBar) end + local HideKeyBind = function() + for i=1,12 do _G['ActionButton'..i..'HotKey']:SetAlpha(0) end + end + local OnEvent = function(self, event) if MODUI_VAR['elements']['mainbar'].enable then if event == 'PLAYER_LOGIN' then @@ -382,6 +386,8 @@ end end + HideKeyBind() + local e = CreateFrame'Frame' for _, v in pairs(events) do e:RegisterEvent(v) end e:SetScript('OnEvent', OnEvent) diff --git a/actionbar/keypress.lua b/actionbar/keypress.lua index 579415c..7e91bfb 100755 --- a/actionbar/keypress.lua +++ b/actionbar/keypress.lua @@ -88,7 +88,8 @@ if MODUI_VAR['elements']['mainbar'].keypress then hooksecurefunc('ActionButton_Update', AddKeyDown) end - end + + end local e = CreateFrame'Frame' e:RegisterEvent'PLAYER_LOGIN' diff --git a/unit/unit.lua b/unit/unit.lua index 255a06a..f2b39c4 100755 --- a/unit/unit.lua +++ b/unit/unit.lua @@ -106,12 +106,13 @@ UpdateCastingBarIcon(texture) end - local UpdateTargetValue = function() + local UpdateTargetValue = function(targetFrame) local v, max, found = LCMH:GetUnitHealth'target' local display = GetCVar'statusTextDisplay' + print(v) TextStatusBar_UpdateTextStringWithValues(TargetFrameHealthBar, TargetFrameHealthBarText, v, 0, max) if TargetFrameHealthBar.RightText and display == 'BOTH' and not TargetFrameHealthBar.showPercentage then - TargetFrameHealthBar.RightText:SetText(v) + targetFrame.RightText:SetText(v) end end @@ -125,9 +126,10 @@ --ns.SB(v) end - TargetFrameHealthBar:HookScript('OnValueChanged', UpdateTargetValue) - TargetFrameNameBackground:SetTexture(nil) + --TargetFrameNameBackground:SetTexture(nil) + --TargetFrameNameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.5) + TargetFrameNameBackground:Hide() TargetFrame.Elite = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') TargetFrame.Elite:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Elite]] @@ -153,20 +155,39 @@ TargetFrameHealthBarTextRight:SetPoint('RIGHT', -110, 3) TargetFrameHealthBar.RightText = TargetFrameHealthBarTextRight + print("first") + + TargetFrameManaBarText = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameManaBarText:SetPoint('CENTER', -50, -8) + TargetFrameManaBar.TextString = TargetFrameManaBarText + + print("second") + TargetFrameManaBarTextLeft = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameManaBarTextLeft:SetPoint('LEFT', 8, -8) + TargetFrameManaBar.LeftText = TargetFrameManaBarTextLeft + + print("third") + TargetFrameManaBarTextRight = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameManaBarTextRight:SetPoint('RIGHT', -110, -8) + TargetFrameManaBar.RightText = TargetFrameManaBarTextRight + + + + --TargetFrameHealthBar:HookScript('OnValueChanged', UpdateTargetValue) for _, v in pairs( { TargetFrameHealthBarText, TargetFrameHealthBarTextLeft, TargetFrameHealthBarTextRight, + TargetFrameManaBarText, + TargetFrameManaBarTextLeft, + TargetFrameManaBarTextRight, + } ) do v:SetFont(STANDARD_TEXT_FONT, 10, 'OUTLINE') end - --TargetFrameTextureFramePVPIcon:SetSize(48, 48) - --TargetFrameTextureFramePVPIcon:ClearAllPoints() - --TargetFrameTextureFramePVPIcon:SetPoint('CENTER', TargetFrame, 'RIGHT', -42, 16) - TargetFrameTextureFramePVPIcon:SetAlpha(0) end @@ -318,11 +339,7 @@ end local UpdateTargetNameClassColour = function() - if UnitIsPlayer'target' then - local _, class = UnitClass'target' - local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] - --TargetFrameNameBackground:SetVertexColor(0.25, 0.78, 0.92) - end + TargetFrameNameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.4) end local UpdatePartyTextClassColour = function() @@ -446,4 +463,44 @@ e:SetScript('OnEvent', OnEvent) + hooksecurefunc("PlayerFrame_UpdateStatus", function() + if IsResting("player") then + PlayerStatusTexture:Hide() + PlayerRestIcon:Hide() + PlayerRestGlow:Hide() + PlayerStatusGlow:Hide() + elseif PlayerFrame.inCombat then + PlayerStatusTexture:Hide() + PlayerAttackIcon:Hide() + PlayerRestIcon:Hide() + PlayerAttackGlow:Hide() + PlayerRestGlow:Hide() + PlayerStatusGlow:Hide() + PlayerAttackBackground:Hide() + end + end) + + hooksecurefunc("TextStatusBar_UpdateTextStringWithValues",function(statusFrame, _, value, valueMin, valueMax) + + local leftText = statusFrame.LeftText + local rightText = statusFrame.RightText + + if leftText then + leftText:SetText('') + end + + + if statusFrame==TargetFrameHealthBar then + local v, max, found = LCMH:GetUnitHealth'target' + if not found then + v = v .. '%' + end + rightText:SetText(v) + elseif statusFrame==TargetFrameManaBar then + local v, max, found = LCMH:GetUnitMana'target' + rightText:SetText(v) + end + + + end) -- From 5343e107e4c7751c7f9d7633fa83932bccabd99c Mon Sep 17 00:00:00 2001 From: Misha Novik Date: Thu, 24 Oct 2019 00:41:12 +0300 Subject: [PATCH 09/22] update libs --- .../LibClassicCasterino.lua | 263 +++++++++++-- .../LibClassicDurations/classAbilities.lua | 297 ++++++++++++--- libraries/LibClassicDurations/core.lua | 356 +++++++++++++++--- .../diminishingReturns.lua | 23 +- 4 files changed, 795 insertions(+), 144 deletions(-) mode change 100755 => 100644 libraries/LibClassicCasterino/LibClassicCasterino.lua diff --git a/libraries/LibClassicCasterino/LibClassicCasterino.lua b/libraries/LibClassicCasterino/LibClassicCasterino.lua old mode 100755 new mode 100644 index f26e9e2..6f0cd92 --- a/libraries/LibClassicCasterino/LibClassicCasterino.lua +++ b/libraries/LibClassicCasterino/LibClassicCasterino.lua @@ -2,9 +2,9 @@ LibClassicCasterino Author: d87 --]================] +if WOW_PROJECT_ID ~= WOW_PROJECT_CLASSIC then return end - -local MAJOR, MINOR = "LibClassicCasterino", 10 +local MAJOR, MINOR = "LibClassicCasterino", 22 local lib = LibStub:NewLibrary(MAJOR, MINOR) if not lib then return end @@ -19,18 +19,27 @@ local callbacks = lib.callbacks lib.casters = lib.casters or {} -- setmetatable({}, { __mode = "v" }) local casters = lib.casters --- local guidsToPurge = {} +lib.movecheckGUIDs = lib.movecheckGUIDs or {} +local movecheckGUIDs = lib.movecheckGUIDs +local MOVECHECK_TIMEOUT = 4 local UnitGUID = UnitGUID local bit_band = bit.band + +local GetSpellInfo = GetSpellInfo local GetTime = GetTime local CastingInfo = CastingInfo local ChannelInfo = ChannelInfo +local GetUnitSpeed = GetUnitSpeed +local UnitIsUnit = UnitIsUnit -local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER +local COMBATLOG_OBJECT_REACTION_FRIENDLY = COMBATLOG_OBJECT_REACTION_FRIENDLY +local COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET = COMBATLOG_OBJECT_TYPE_PLAYER + COMBATLOG_OBJECT_TYPE_PET local classCasts -local classChannels +local classChannelsByAura +local classChannelsByCast local talentDecreased +local crowdControlAuras local FireToUnits f:SetScript("OnEvent", function(self, event, ...) @@ -45,6 +54,10 @@ local NPCSpells local castTimeCache = {} local castTimeCacheStartTimes = setmetatable({}, { __mode = "v" }) +local AIMED_SHOT = GetSpellInfo(19434) +local castingAimedShot = false +local playerGUID = UnitGUID("player") + --[[ function DUMPCASTS() local castedSpells = {} @@ -75,10 +88,11 @@ local makeCastUID = function(guid, spellName) return npcID..spellName end -local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime ) +local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime, isSrcEnemyPlayer ) local _, _, icon, castTime = GetSpellInfo(spellID) if castType == "CHANNEL" then - castTime = classChannels[spellID]*1000 + local channelDuration = classChannelsByAura[spellID] or classChannelsByCast[spellID] + castTime = channelDuration*1000 local decreased = talentDecreased[spellID] if decreased then castTime = castTime - decreased @@ -98,8 +112,16 @@ local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime casters[srcGUID] = { castType, spellName, icon, startTime, endTime, spellID } end + if isSrcEnemyPlayer then + movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT + end if castType == "CAST" then + if srcGUID == playerGUID and spellName == AIMED_SHOT then + castingAimedShot = true + movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT + callbacks:Fire("UNIT_SPELLCAST_START", "player") + end FireToUnits("UNIT_SPELLCAST_START", srcGUID) else FireToUnits("UNIT_SPELLCAST_CHANNEL_START", srcGUID) @@ -112,9 +134,14 @@ local function CastStop(srcGUID, castType, suffix ) castType = castType or currentCast[1] casters[srcGUID] = nil + movecheckGUIDs[srcGUID] = nil if castType == "CAST" then local event = "UNIT_SPELLCAST_"..suffix + if srcGUID == playerGUID and castingAimedShot then + castingAimedShot = false + callbacks:Fire(event, "player") + end FireToUnits(event, srcGUID) else FireToUnits("UNIT_SPELLCAST_CHANNEL_STOP", srcGUID) @@ -129,7 +156,7 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) dstGUID, dstName, dstFlags, dstFlags2, spellID, spellName, arg3, arg4, arg5 = CombatLogGetCurrentEventInfo() - local isSrcPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER) > 0 + local isSrcPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET) > 0 if isSrcPlayer and spellID == 0 then spellID = spellNameToID[spellName] end @@ -137,14 +164,15 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) if isSrcPlayer then local isCasting = classCasts[spellID] if isCasting then - CastStart(srcGUID, "CAST", spellName, spellID) + local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 + CastStart(srcGUID, "CAST", spellName, spellID, nil, not isSrcFriendlyPlayer) end else local castUID = makeCastUID(srcGUID, spellName) local cachedTime = castTimeCache[castUID] local spellID = NPCspellNameToID[spellName] -- just for the icon if not spellID then - spellID = 2050 + spellID = 4036 -- Engineering Icon end if cachedTime then CastStart(srcGUID, "CAST", spellName, spellID, cachedTime*1000) @@ -155,12 +183,22 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) end elseif eventType == "SPELL_CAST_FAILED" then - CastStop(srcGUID, "CAST", "FAILED") + CastStop(srcGUID, "CAST", "INTERRUPTED") elseif eventType == "SPELL_CAST_SUCCESS" then - if isSrcPlayer and classChannels[spellID] then - -- SPELL_CAST_SUCCESS can come right after AURA_APPLIED, so ignoring it - return + if isSrcPlayer then + if classChannelsByAura[spellID] then + -- SPELL_CAST_SUCCESS can come right after AURA_APPLIED, so ignoring it + return + elseif classChannelsByCast[spellID] then + -- Channels fire SPELL_CAST_SUCCESS at their start + local isChanneling = classChannelsByCast[spellID] + if isChanneling then + local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 + CastStart(srcGUID, "CHANNEL", spellName, spellID, nil, not isSrcFriendlyPlayer) + end + return + end end if not isSrcPlayer then local castUID = makeCastUID(srcGUID, spellName) @@ -182,21 +220,27 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) CastStop(dstGUID, nil, "INTERRUPTED") elseif eventType == "UNIT_DIED" then - CastStop(dstGUID, nil, "FAILED") + CastStop(dstGUID, nil, "INTERRUPTED") elseif eventType == "SPELL_AURA_APPLIED" or eventType == "SPELL_AURA_REFRESH" or eventType == "SPELL_AURA_APPLIED_DOSE" then if isSrcPlayer then - local isChanneling = classChannels[spellID] + if crowdControlAuras[spellName] then + CastStop(dstGUID, nil, "INTERRUPTED") + return + end + + local isChanneling = classChannelsByAura[spellID] if isChanneling then - CastStart(srcGUID, "CHANNEL", spellName, spellID) + local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 + CastStart(srcGUID, "CHANNEL", spellName, spellID, nil, not isSrcFriendlyPlayer) end end elseif eventType == "SPELL_AURA_REMOVED" then if isSrcPlayer then - local isChanneling = classChannels[spellID] + local isChanneling = classChannelsByAura[spellID] if isChanneling then CastStop(srcGUID, "CHANNEL", "STOP") end @@ -220,7 +264,11 @@ local function IsSlowedDown(unit) end function lib:UnitCastingInfo(unit) - if unit == "player" then return CastingInfo() end + if UnitIsUnit(unit,"player") then + if not castingAimedShot then + return CastingInfo() + end + end local guid = UnitGUID(unit) local cast = casters[guid] if cast then @@ -237,7 +285,7 @@ function lib:UnitCastingInfo(unit) end function lib:UnitChannelInfo(unit) - if unit == "player" then return ChannelInfo() end + if UnitIsUnit(unit, "player") then return ChannelInfo() end local guid = UnitGUID(unit) local cast = casters[guid] if cast then @@ -250,9 +298,9 @@ function lib:UnitChannelInfo(unit) end -local Passthrough = function(self, event, unit) - if unit == "player" then - callbacks:Fire(event, unit) +local Passthrough = function(self, event, unit, ...) + if unit == "player" or UnitIsUnit(unit, "player") then + callbacks:Fire(event, unit, ...) end end f.UNIT_SPELLCAST_START = Passthrough @@ -263,6 +311,7 @@ f.UNIT_SPELLCAST_INTERRUPTED = Passthrough f.UNIT_SPELLCAST_CHANNEL_START = Passthrough f.UNIT_SPELLCAST_CHANNEL_UPDATE = Passthrough f.UNIT_SPELLCAST_CHANNEL_STOP = Passthrough +f.UNIT_SPELLCAST_SUCCEEDED = Passthrough function callbacks.OnUsed() f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") @@ -275,6 +324,7 @@ function callbacks.OnUsed() f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE") f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP") + f:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") -- for unit lookup f:RegisterEvent("GROUP_ROSTER_UPDATE") @@ -350,6 +400,8 @@ classCasts = { [17923] = 1.5, -- Searing Pain [25307] = 3, -- Shadow Bolt [17924] = 4, -- Soul Fire + [6358] = 1.5, -- Seduction + [11763] = 2, -- Firebolt (Imp) [9853] = 1.5, -- Entangling Roots [18658] = 1.5, -- Hibernate @@ -373,6 +425,18 @@ classCasts = { [10216] = 3, -- Flamestrike [10207] = 1.5, -- Scorch [25304] = 3, -- Frostbolt + [3561] = 10, -- Teleport: Stormwind + [3562] = 10, -- Teleport: Ironforge + [3563] = 10, -- Teleport: Undercity + [3565] = 10, -- Teleport: Darnassus + [3566] = 10, -- Teleport: Thuner Bluff + [3567] = 10, -- Teleport: Orgrimmar + [10059] = 10, -- Portal: Stormwind + [11416] = 10, -- Portal: Ironforge + [11418] = 10, -- Portal: Undercity + [11419] = 10, -- Portal: Darnassus + [11420] = 10, -- Portal: Thuner Bluff + [11417] = 10, -- Portal: Orgrimmar [10876] = 3, -- Mana Burn [10955] = 1.5, -- Shackle Undead @@ -425,15 +489,14 @@ classCasts = { -- [10793] = 3, -- Striped Nightsaber } -classChannels = { +classChannelsByAura = { [746] = 6, -- First Aid - [13278] = 4, -- Gnomish Death Ray [20577] = 10, -- Cannibalize [19305] = 6, -- Starshards -- DRUID - [17402] = 9.5, -- Hurricane - [9863] = 9.5, -- Tranquility + [17402] = 10, -- Hurricane + [9863] = 10, -- Tranquility -- HUNTER [6197] = 60, -- Eagle Eye @@ -442,8 +505,6 @@ classChannels = { [1002] = 60, -- Eyes of the Beast [14295] = 6, -- Volley - -- MAGE - [25345] = 5, -- Arcane Missiles [10187] = 8, -- Blizzard [12051] = 8, -- Evocation @@ -454,21 +515,32 @@ classChannels = { -- WARLOCK [126] = 45, -- Eye of Kilrogg - [11700] = 4.5, -- Drain Life - [11704] = 4.5, -- Drain Mana - [11675] = 14.5, -- Drain Soul - [11678] = 7.5, -- Rain of Fire + [11700] = 5, -- Drain Life + [11704] = 5, -- Drain Mana + [11675] = 15, -- Drain Soul + [11678] = 8, -- Rain of Fire [11684] = 15, -- Hellfire [11695] = 10, -- Health Funnel + [6358] = 15, -- Seduction + [17854] = 10, -- Consume Shadows (Voidwalker) } +classChannelsByCast = { + [13278] = 4, -- Gnomish Death Ray + + -- MAGE + [25345] = 5, -- Arcane Missiles +} + + for id in pairs(classCasts) do spellNameToID[GetSpellInfo(id)] = id - -- AddSpellNameRecognition(id) end -for id in pairs(classChannels) do +for id in pairs(classChannelsByAura) do + spellNameToID[GetSpellInfo(id)] = id +end +for id in pairs(classChannelsByCast) do spellNameToID[GetSpellInfo(id)] = id - -- AddSpellNameRecognition(id) end local partyGUIDtoUnit = {} @@ -538,6 +610,123 @@ FireToUnits = function(event, guid, ...) end end +crowdControlAuras = { -- from ClassicCastbars + [GetSpellInfo(5211)] = true, -- Bash + [GetSpellInfo(24394)] = true, -- Intimidation + [GetSpellInfo(853)] = true, -- Hammer of Justice + [GetSpellInfo(22703)] = true, -- Inferno Effect (Summon Infernal) + [GetSpellInfo(408)] = true, -- Kidney Shot + [GetSpellInfo(12809)] = true, -- Concussion Blow + [GetSpellInfo(20253)] = true, -- Intercept Stun + [GetSpellInfo(20549)] = true, -- War Stomp + [GetSpellInfo(2637)] = true, -- Hibernate + [GetSpellInfo(3355)] = true, -- Freezing Trap + [GetSpellInfo(19386)] = true, -- Wyvern Sting + [GetSpellInfo(118)] = true, -- Polymorph + [GetSpellInfo(28271)] = true, -- Polymorph: Turtle + [GetSpellInfo(28272)] = true, -- Polymorph: Pig + [GetSpellInfo(20066)] = true, -- Repentance + [GetSpellInfo(1776)] = true, -- Gouge + [GetSpellInfo(6770)] = true, -- Sap + [GetSpellInfo(1513)] = true, -- Scare Beast + [GetSpellInfo(8122)] = true, -- Psychic Scream + [GetSpellInfo(2094)] = true, -- Blind + [GetSpellInfo(5782)] = true, -- Fear + [GetSpellInfo(5484)] = true, -- Howl of Terror + [GetSpellInfo(6358)] = true, -- Seduction + [GetSpellInfo(5246)] = true, -- Intimidating Shout + [GetSpellInfo(6789)] = true, -- Death Coil + [GetSpellInfo(9005)] = true, -- Pounce + [GetSpellInfo(1833)] = true, -- Cheap Shot + [GetSpellInfo(16922)] = true, -- Improved Starfire + [GetSpellInfo(19410)] = true, -- Improved Concussive Shot + [GetSpellInfo(12355)] = true, -- Impact + [GetSpellInfo(20170)] = true, -- Seal of Justice Stun + [GetSpellInfo(15269)] = true, -- Blackout + [GetSpellInfo(18093)] = true, -- Pyroclasm + [GetSpellInfo(12798)] = true, -- Revenge Stun + [GetSpellInfo(5530)] = true, -- Mace Stun + [GetSpellInfo(19503)] = true, -- Scatter Shot + [GetSpellInfo(605)] = true, -- Mind Control + [GetSpellInfo(7922)] = true, -- Charge Stun + [GetSpellInfo(18469)] = true, -- Counterspell - Silenced + [GetSpellInfo(15487)] = true, -- Silence + [GetSpellInfo(18425)] = true, -- Kick - Silenced + [GetSpellInfo(24259)] = true, -- Spell Lock + [GetSpellInfo(18498)] = true, -- Shield Bash - Silenced + + -- ITEMS + [GetSpellInfo(13327)] = true, -- Reckless Charge + [GetSpellInfo(1090)] = true, -- Sleep + [GetSpellInfo(5134)] = true, -- Flash Bomb Fear + [GetSpellInfo(19821)] = true, -- Arcane Bomb Silence + [GetSpellInfo(4068)] = true, -- Iron Grenade + [GetSpellInfo(19769)] = true, -- Thorium Grenade + [GetSpellInfo(13808)] = true, -- M73 Frag Grenade + [GetSpellInfo(4069)] = true, -- Big Iron Bomb + [GetSpellInfo(12543)] = true, -- Hi-Explosive Bomb + [GetSpellInfo(4064)] = true, -- Rough Copper Bomb + [GetSpellInfo(12421)] = true, -- Mithril Frag Bomb + [GetSpellInfo(19784)] = true, -- Dark Iron Bomb + [GetSpellInfo(4067)] = true, -- Big Bronze Bomb + [GetSpellInfo(4066)] = true, -- Small Bronze Bomb + [GetSpellInfo(4065)] = true, -- Large Copper Bomb + [GetSpellInfo(13237)] = true, -- Goblin Mortar + [GetSpellInfo(835)] = true, -- Tidal Charm + [GetSpellInfo(13181)] = true, -- Gnomish Mind Control Cap + [GetSpellInfo(12562)] = true, -- The Big One + [GetSpellInfo(15283)] = true, -- Stunning Blow (Weapon Proc) + [GetSpellInfo(56)] = true, -- Stun (Weapon Proc) + [GetSpellInfo(26108)] = true, -- Glimpse of Madness +} + +------------------------------ +-- Cast Interruption Checker +------------------------------ + +-- There's an issue that if you start a cast and immediately after cancel it, CAST_FAILED event won't ever come for it +-- This leads to zombie casts that have to run until completion +-- So for 4s after non-friendly player controlled guid started a cast we're watching if it's moving and cancel + +do + local GetUnitForFreshGUID = function(guid) + local targetGUID = UnitGUID('target') + if guid == targetGUID then + return "target" + end + + return nameplateGUIDtoUnit[guid] + end + + f:SetScript("OnUpdate", function(self, elapsed) + local guid, timeout = next(movecheckGUIDs) + while guid ~= nil do + -- Removing while iterating here, but it doesn't matter + + local timeStart = MOVECHECK_TIMEOUT - timeout + if timeStart > 0.25 then + local unit = GetUnitForFreshGUID(guid) + if unit then + if GetUnitSpeed(unit) ~= 0 then + CastStop(guid, nil, "INTERRUPTED") + movecheckGUIDs[guid] = nil + return + end + end + end + + movecheckGUIDs[guid] = timeout - elapsed + if timeout - elapsed < 0 then + movecheckGUIDs[guid] = nil + end + -- print(guid, movecheckGUIDs[guid]) + + guid, timeout = next(movecheckGUIDs, guid) + end + end) +end + +------------------------------ if lib.NPCSpellsTimer then lib.NPCSpellsTimer:Cancel() @@ -3266,4 +3455,4 @@ NPCSpells = { 20298, 2637, 15066, -} \ No newline at end of file +} diff --git a/libraries/LibClassicDurations/classAbilities.lua b/libraries/LibClassicDurations/classAbilities.lua index 7c692b8..453e22a 100755 --- a/libraries/LibClassicDurations/classAbilities.lua +++ b/libraries/LibClassicDurations/classAbilities.lua @@ -1,11 +1,89 @@ local lib = LibStub and LibStub("LibClassicDurations", true) if not lib then return end -local Type, Version = "SpellTable", 17 +local Type, Version = "SpellTable", 40 if lib:GetDataVersion(Type) >= Version then return end -- older versions didn't have that function local Spell = lib.AddAura local Talent = lib.Talent +local INFINITY = math.huge + +local _, class = UnitClass("player") +local locale = GetLocale() + +-- Temporary +-- Erases Fire Vulnerability from the name to id table in case older version of the lib written it there +if locale == "zhCN" then + lib.spellNameToID[GetSpellInfo(980)] = nil +end + +-- https://github.com/rgd87/LibClassicDurations/issues/11 +lib.indirectRefreshSpells = { + [GetSpellInfo(11597)] = { -- Sunder Armor + events = { + ["SPELL_CAST_SUCCESS"] = true + }, + targetSpellID = 11597, + }, + + [GetSpellInfo(25357)] = { -- Healing Wave + events = { + ["SPELL_CAST_SUCCESS"] = true + }, + targetSpellID = 29203, -- Healing Way + }, +} + +if class == "MAGE" then + lib.indirectRefreshSpells[GetSpellInfo(10207)] = { -- Scorch + events = { + ["SPELL_DAMAGE"] = true + }, + targetSpellID = 22959, -- Fire Vulnerability + targetResistCheck = true, + condition = function(isMine) return isMine end, + -- it'll refresg only from mages personal casts which is fine + -- because if mage doesn't have imp scorch then he won't even see a Fire Vulnerability timer + } + + lib.indirectRefreshSpells[GetSpellInfo(10)] = { -- Blizzard + events = { + ["SPELL_PERIODIC_DAMAGE"] = true + }, + applyAura = true, + targetSpellID = 12486, -- Imp Blizzard + } +end + +if class == "PRIEST" then + -- Shadow Weaving + lib.indirectRefreshSpells[GetSpellInfo(10894)] = { -- SW:Pain + events = { + ["SPELL_AURA_APPLIED"] = true, + ["SPELL_AURA_REFRESH"] = true, + }, + targetSpellID = 15258, -- Shadow Weaving + targetResistCheck = true, + condition = function(isMine) return isMine end, + } + lib.indirectRefreshSpells[GetSpellInfo(10947)] = { -- Mind Blast + events = { + ["SPELL_DAMAGE"] = true, + }, + targetSpellID = 15258, -- Shadow Weaving + targetResistCheck = true, + condition = function(isMine) return isMine end, + } + lib.indirectRefreshSpells[GetSpellInfo(18807)] = { -- Mind Flay + events = { + ["SPELL_AURA_APPLIED"] = true, + ["SPELL_AURA_REFRESH"] = true, + }, + targetSpellID = 15258, -- Shadow Weaving + targetResistCheck = true, + condition = function(isMine) return isMine end, + } +end ------------------ -- GLOBAL @@ -27,7 +105,8 @@ Spell({ 13099, 13138, 16566 }, { Spell( 23451, { duration = 10 }) -- Battleground speed buff Spell( 23493, { duration = 10 }) -- Battleground heal buff Spell( 23505, { duration = 60 }) -- Battleground damage buff -Spell({ 4068, 19769 }, { duration = 3 }) -- Iron Grenade, Thorium +Spell({ 4068 }, { duration = 3 }) -- Iron Grenade +Spell({ 19769 }, { duration = 3 }) -- Thorium Grenade Spell( 6615, { duration = 30, type = "BUFF" }) -- Free Action Potion Spell( 24364, { duration = 5, type = "BUFF" }) -- Living Action Potion Spell( 3169, { duration = 6, type = "BUFF" }) -- Limited Invulnerability Potion @@ -73,24 +152,30 @@ Spell( 7744, { duration = 5, type = "BUFF" }) -- Will of the Forsaken -- PRIEST ------------- +Spell( 15473, { duration = INFINITY, type = "BUFF" }) -- Shadowform +Spell( 14751, { duration = INFINITY, type = "BUFF" }) -- Inner focus + -- Why long auras are disabled -- When you first get in combat log range with a player, -- you'll get AURA_APPLIED event as if it was just applied, when it actually wasn't. -- That's extremely common for these long self-buffs --- So I think it's better not to show anything rather than incorrect time. +-- Long raid buffs now have cast filter, that is only if you directly casted a spell it'll register +-- Cast Filter is ignored for enemies, so some personal buffs have it to still show enemy buffs + +Spell({ 1243, 1244, 1245, 2791, 10937, 10938 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Power Word: Fortitude +Spell({ 21562, 21564 }, { duration = 3600, type = "BUFF", castFilter = true }) -- Prayer of Fortitude +Spell({ 976, 10957, 10958 }, { duration = 600, type = "BUFF", castFilter = true }) -- Shadow Protection +Spell( 27683, { duration = 600, type = "BUFF", castFilter = true }) -- Prayer of Shadow Protection +Spell({ 14752, 14818, 14819, 27841 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Divine Spirit +Spell( 27681, { duration = 3600, type = "BUFF", castFilter = true }) -- Prayer of Spirit --- Spell({ 1243, 1244, 1245, 2791, 10937, 10938 }, { duration = 1800, type = "BUFF" }) -- Power Word: Fortitude --- Spell({ 21562, 21564 }, { duration = 3600, type = "BUFF" }) -- Prayer of Fortitude --- Spell({ 976, 10957, 10958 }, { duration = 600, type = "BUFF" }) -- Shadow Protection --- Spell( 27683, { duration = 600, type = "BUFF" }) -- Prayer of Shadow Protection --- Spell({ 14752, 14818, 14819, 27841 }, { duration = 1800, type = "BUFF" }) -- Divine Spirit --- Spell( 27681, { duration = 3600, type = "BUFF" }) -- Prayer of Spirit +Spell({ 588, 602, 1006, 7128, 10951, 10952 }, { duration = 600, type = "BUFF", castFilter = true }) -- Inner Fire Spell({ 14743, 27828 }, { duration = 6, type = "BUFF" }) -- Focused Casting (Martyrdom) Spell( 27827, { duration = 10, type = "BUFF" }) -- Spirit of Redemption Spell( 15271, { duration = 15, type = "BUFF" }) -- Spirit Tap -Spell({ 2652, 19261, 19262, 19264, 19265, 19266 }, { duration = 600, type = "BUFF" }) -- Touch of Weakness +Spell({ 2943, 19249, 19251, 19252, 19253, 19254 }, { duration = 120 }) -- Touch of Weakness Effect Spell({ 13896, 19271, 19273, 19274, 19275 }, { duration = 15, type = "BUFF" }) -- Feedback Spell({ 2651, 19289, 19291, 19292, 19293 }, { duration = 15, type = "BUFF" }) -- Elune's Grace Spell({ 9035, 19281, 19282, 19283, 19284, 19285 }, { duration = 120 }) -- Hex of Weakness @@ -127,7 +212,20 @@ Spell({ 589, 594, 970, 992, 2767, 10892, 10893, 10894 }, { stacking = true, end }) -- SW:P Spell( 15269 ,{ duration = 3 }) -- Blackout -Spell( 15258 ,{ duration = 15 }) -- Shadow Vulnerability + +if class == "PRIEST" then +Spell( 15258 ,{ + duration = function(spellID, isSrcPlayer) + -- Only SP himself can see the timer + if Talent(15257, 15331, 15332, 15333, 15334) > 0 then + return 15 + else + return nil + end + end +}) -- Shadow Weaving +end + Spell( 15286 ,{ duration = 60 }) -- Vampiric Embrace Spell({ 15407, 17311, 17312, 17313, 17314, 18807 }, { duration = 3 }) -- Mind Flay Spell({ 605, 10911, 10912 }, { duration = 60 }) -- Mind Control @@ -136,11 +234,19 @@ Spell({ 605, 10911, 10912 }, { duration = 60 }) -- Mind Control -- DRUID --------------- --- Spell({ 1126, 5232, 5234, 6756, 8907, 9884, 9885 }, { duration = 1800, type = "BUFF" }) -- Mark of the Wild --- Spell({ 21849, 21850 }, { duration = 3600, type = "BUFF" }) -- Gift of the Wild +Spell( 768, { duration = INFINITY, type = "BUFF" }) -- Cat Form +Spell( 783, { duration = INFINITY, type = "BUFF" }) -- Travel Form +Spell( 5487, { duration = INFINITY, type = "BUFF" }) -- Bear Form +Spell( 9634, { duration = INFINITY, type = "BUFF" }) -- Dire Bear Form +Spell( 1066, { duration = INFINITY, type = "BUFF" }) -- Aquatic Form +Spell( 24858, { duration = INFINITY, type = "BUFF" }) -- Moonkin Form +Spell( 17116, { duration = INFINITY, type = "BUFF" }) -- Nature's Swiftness + +Spell({ 1126, 5232, 5234, 6756, 8907, 9884, 9885 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Mark of the Wild +Spell({ 21849, 21850 }, { duration = 3600, type = "BUFF", castFilter = true }) -- Gift of the Wild Spell( 19975, { duration = 12 }) -- Nature's Grasp root Spell({ 16689, 16810, 16811, 16812, 16813, 17329 }, { duration = 45, type = "BUFF" }) -- Nature's Grasp -Spell( 16864, { duration = 600, type = "BUFF" }) -- Omen of Clarity +Spell( 16864, { duration = 600, type = "BUFF", castFilter = true }) -- Omen of Clarity Spell( 16870, { duration = 15, type = "BUFF" }) -- Clearcasting from OoC @@ -150,6 +256,7 @@ Spell({ 467, 782, 1075, 8914, 9756, 9910 }, { duration = 600, type = "BUFF" }) - Spell( 22812 ,{ duration = 15, type = "BUFF" }) -- Barkskin --SKIPPING: Hurricane (Channeled) Spell({ 339, 1062, 5195, 5196, 9852, 9853 }, { + pvpduration = 20, duration = function(spellID) if spellID == 339 then return 12 elseif spellID == 1062 then return 15 @@ -161,8 +268,9 @@ Spell({ 339, 1062, 5195, 5196, 9852, 9853 }, { }) -- Entangling Roots Spell({ 2908, 8955, 9901 }, { duration = 15 }) -- Soothe Animal Spell({ 770, 778, 9749, 9907 }, { duration = 40 }) -- Faerie Fire -Spell({ 17390, 17391, 17392 }, { duration = 40 }) -- Faerie Fire (Feral) +Spell({ 16857, 17390, 17391, 17392 }, { duration = 40 }) -- Faerie Fire (Feral) Spell({ 2637, 18657, 18658 }, { + pvpduration = 20, duration = function(spellID) if spellID == 2637 then return 20 elseif spellID == 18657 then return 30 @@ -179,13 +287,14 @@ Spell({ 5211, 6798, 8983 }, { stacking = true, -- stacking? end }) -- Bash Spell( 5209, { duration = 6 }) -- Challenging Roar -Spell( 6795, { duration = 3 }) -- Taunt +Spell( 6795, { duration = 3, stacking = true }) -- Taunt Spell({ 1850, 9821 }, { duration = 15, type = "BUFF" }) -- Dash Spell( 5229, { duration = 10, type = "BUFF" }) -- Enrage Spell({ 22842, 22895, 22896 }, { duration = 10, type = "BUFF" }) -- Frenzied Regeneration Spell( 16922, { duration = 3 }) -- Imp Starfire Stun -Spell({ 9005, 9823, 9827 }, { + +Spell({ 9005, 9823, 9827 }, { -- Pounce stun doesn't create a debuff icon, so this is not going to be used duration = function(spellID) local brutal_impact = Talent(16940, 16941)*0.5 return 2+brutal_impact @@ -213,6 +322,10 @@ Spell({ 5570, 24974, 24975, 24976, 24977 }, { duration = 12, stacking = true }) -- WARRIOR ------------- +Spell( 2457 , { duration = INFINITY, type = "BUFF" }) -- Battle Stance +Spell( 2458 , { duration = INFINITY, type = "BUFF" }) -- Berserker Stance +Spell( 71 , { duration = INFINITY, type = "BUFF" }) -- Def Stance + Spell( 12294, { duration = 10 }) -- Mortal Strike Healing Reduction Spell({72, 1671, 1672}, { duration = 6 }) -- Shield Bash @@ -248,7 +361,7 @@ Spell({ 6343, 8198, 8204, 8205, 11580, 11581 }, { }) -- Thunder Clap Spell({ 694, 7400, 7402, 20559, 20560 }, { duration = 6 }) -- Mocking Blow Spell( 1161 ,{ duration = 6 }) -- Challenging Shout -Spell( 355 ,{ duration = 3 }) -- Taunt +Spell( 355 ,{ duration = 3, stacking = true }) -- Taunt Spell({ 5242, 6192, 6673, 11549, 11550, 11551, 25289 }, { type = "BUFF", duration = function(spellID, isSrcPlayer) local talents = isSrcPlayer and Talent(12321, 12835, 12836, 12837, 12838) or 0 @@ -290,12 +403,15 @@ Spell(5530, { duration = 3 }) -- Mace Specialization -- ROGUE -------------- +Spell( 14177 , { duration = INFINITY, type = "BUFF" }) -- Cold Blood +Spell({ 1784, 1785, 1786, 1787 } , { duration = INFINITY, type = "BUFF" }) -- Stealth + Spell( 14278 , { duration = 7, type = "BUFF" }) -- Ghostly Strike Spell({ 16511, 17347, 17348 }, { duration = 15 }) -- Hemorrhage Spell({ 11327, 11329 }, { duration = 10 }) -- Vanish Spell({ 3409, 11201 }, { duration = 12 }) -- Crippling Poison -Spell({ 13218, 13222, 13223, 13224 }, { duration = 15 }) -- Wound Poison -Spell({ 2818, 2819, 11353, 11354, 25349 }, { duration = 12, stacking = true }) -- Deadly Poison +-- Spell({ 13218, 13222, 13223, 13224 }, { duration = 15 }) -- Wound Poison +-- Spell({ 2818, 2819, 11353, 11354, 25349 }, { duration = 12, stacking = true }) -- Deadly Poison Spell({ 5760, 8692, 11398 }, { duration = function(spellID) if spellID == 5760 then return 10 @@ -309,6 +425,7 @@ Spell( 13750, { duration = 15, type = "BUFF" }) -- Adrenaline Rush Spell( 13877, { duration = 15, type = "BUFF" }) -- Blade Flurry Spell( 1833, { duration = 4 }) -- Cheap Shot Spell({ 2070, 6770, 11297 }, { + pvpduration = 20, duration = function(spellID) if spellID == 6770 then return 25 -- yes, Rank 1 spell id is 6770 actually elseif spellID == 2070 then return 35 @@ -319,6 +436,7 @@ Spell( 2094 , { duration = 10 }) -- Blind Spell({ 8647, 8649, 8650, 11197, 11198 }, { duration = 30 }) -- Expose Armor Spell({ 703, 8631, 8632, 8633, 11289, 11290 }, { duration = 18 }) -- Garrote + Spell({ 408, 8643 }, { duration = function(spellID, isSrcPlayer, comboPoints) local duration = spellID == 8643 and 1 or 0 -- if Rank 2, add 1s @@ -360,7 +478,7 @@ Spell( 14251 , { duration = 6 }) -- Riposte (disarm) ------------ Spell({ 20707, 20762, 20763, 20764, 20765 }, { duration = 1800, type = "BUFF" }) -- Soulstone Resurrection --- Spell({ 687, 696, 706, 1086, 11733, 11734, 11735 }, { duration = 1800, type = "BUFF" }) -- Demon SKin/Armor +Spell({ 687, 696, 706, 1086, 11733, 11734, 11735 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Demon SKin/Armor -- Spell({ 18791, 18789, 18792, 18790 }, { duration = 1800, type = "BUFF" }) -- Touch of Shadow, Burning Wish, Fel Energy, Fel Stamina --SKIPPING: Drain Life, Mana, Soul, Enslave, Health funnel, kilrog @@ -369,7 +487,7 @@ Spell({ 17767, 17850, 17851, 17852, 17853, 17854 }, { duration = 10 }) -- Consum Spell( 18118, { duration = 5 }) -- Aftermath Proc Spell({ 132, 2970, 11743 }, { duration = 600 }) -- Detect Invisibility Spell( 5697, { duration = 600 }) -- Unending Breath -Spell({ 17794, 17798, 17797, 17799, 17800 }, { duration = 12 }) -- Shadow Vulnerability (Imp Shadow Bolt) +-- Spell({ 17794, 17798, 17797, 17799, 17800 }, { duration = 12 }) -- Shadow Vulnerability (Imp Shadow Bolt) -- SKIPPING: Amplify Curse Spell({ 1714, 11719 }, { duration = 30 }) -- Curse of Tongues Spell({ 702, 1108, 6205, 7646, 11707, 11708 },{ duration = 120 }) -- Curse of Weakness @@ -379,12 +497,13 @@ Spell({ 704, 7658, 7659, 11717 }, { duration = 120 }) -- Curse of Recklessness Spell( 603 ,{ duration = 60, stacking = true }) -- Curse of Doom Spell( 18223 ,{ duration = 12 }) -- Curse of Exhaustion Spell( 6358, { + pvpduration = 20, duration = function(spellID, isSrcPlayer) if isSrcPlayer then local mul = 1 + Talent(18754, 18755, 18756)*0.1 - return 20*mul + return 15*mul else - return 20 + return 15 end end }) -- Seduction, varies, Improved Succubus @@ -394,6 +513,7 @@ Spell({ 5484, 17928 }, { end }) -- Howl of Terror Spell({ 5782, 6213, 6215 }, { + pvpduration = 20, duration = function(spellID) if spellID == 5782 then return 10 elseif spellID == 6213 then return 15 @@ -409,7 +529,11 @@ Spell({ 710, 18647 }, { Spell({ 6789, 17925, 17926 }, { duration = 3 }) -- Death Coil Spell({ 18265, 18879, 18880, 18881}, { duration = 30, stacking = true }) -- Siphon Life + +if locale ~= "zhCN" or class ~= "MAGE" then Spell({ 980, 1014, 6217, 11711, 11712, 11713 }, { duration = 24, stacking = true }) -- Curse of Agony +end + Spell({ 172, 6222, 6223, 7648, 11671, 11672, 25311 }, { stacking = true, duration = function(spellID) if spellID == 172 then @@ -432,6 +556,23 @@ Spell( 18093 ,{ duration = 3 }) -- Pyroclasm -- SHAMAN --------------- +Spell({ 8185, 10534, 10535 }, { duration = INFINITY, type = "BUFF" }) -- Fire Resistance Totem +Spell({ 8182, 10476, 10477 }, { duration = INFINITY, type = "BUFF" }) -- Frost Resistance Totem +Spell({ 10596, 10598, 10599 }, { duration = INFINITY, type = "BUFF" }) -- Nature Resistance Totem +Spell( 25909, { duration = INFINITY, type = "BUFF" }) -- Tranquil Air Totem +Spell({ 5672, 6371, 6372, 10460, 10461 }, { duration = INFINITY, type = "BUFF" }) -- Healing Stream Totem +Spell({ 5677, 10491, 10493, 10494 }, { duration = INFINITY, type = "BUFF" }) -- Mana Spring Totem +Spell({ 8076, 8162, 8163, 10441, 25362 }, { duration = INFINITY, type = "BUFF" }) -- Strength of Earth Totem +Spell({ 8836, 10626, 25360 }, { duration = INFINITY, type = "BUFF" }) -- Grace of Air Totem +Spell({ 8072, 8156, 8157, 10403, 10404, 10405 }, { duration = INFINITY, type = "BUFF" }) -- Stoneskin Totem +Spell({ 16191, 17355, 17360 }, { duration = 12, type = "BUFF" }) -- Mana Tide Totem + + +Spell( 8178 ,{ duration = 45, type = "BUFF" }) -- Grounding Totem Effect, no duration, but lasts 45s. Keeping for enemy buffs + +-- Using Druid's NS +-- Spell( 16188, { duration = INFINITY, type = "BUFF" }) -- Nature's Swiftness + Spell({ 324, 325, 905, 945, 8134, 10431, 10432 }, { duration = 600, type = "BUFF" }) -- Lightning Shield Spell( 546 ,{ duration = 600, type = "BUFF" }) -- Water Walkign Spell( 131 ,{ duration = 600, type = "BUFF" }) -- Water Breahing @@ -444,31 +585,38 @@ Spell({ 8050, 8052, 8053, 10447, 10448, 29228 }, { duration = 12, stacking = tru Spell( 29203 ,{ duration = 15, type = "BUFF" }) -- Healing Way Spell({ 8034, 8037, 10458, 16352, 16353 }, { duration = 8 }) -- Frostbrand Attack Spell( 3600 ,{ duration = 5 }) -- Earthbind Totem -Spell( 8178 ,{ duration = 45, type = "BUFF" }) -- Grounding Totem Effect, no duration, but lasts 45s. Keeping for enemy buffs -------------- -- PALADIN -------------- --- Spell( 25780, { duration = 1800, type = "BUFF" }) -- Righteous Fury +Spell( 19746, { duration = INFINITY, type = "BUFF" }) -- Concentration Aura +Spell({ 465, 643, 1032, 10290, 10291, 10292, 10293 }, { duration = INFINITY, type = "BUFF" }) -- Devotion Aura +Spell({ 19891, 19899, 19900 }, { duration = INFINITY, type = "BUFF" }) -- Fire Resistance Aura +Spell({ 19888, 19897, 19898 }, { duration = INFINITY, type = "BUFF" }) -- Frost Resistance Aura +Spell({ 19876, 19895, 19896 }, { duration = INFINITY, type = "BUFF" }) -- Shadow Resistance Aura +Spell({ 7294, 10298, 10299, 10300, 10301 }, { duration = INFINITY, type = "BUFF" }) -- Retribution Aura + + +Spell( 25780, { duration = 1800, type = "BUFF" }) -- Righteous Fury -Spell({ 19740, 19834, 19835, 19836, 19837, 19838, 25291 }, { duration = 300, type = "BUFF" }) -- Blessing of Might -Spell({ 25782, 25916 }, { duration = 900, type = "BUFF" }) -- Greater Blessing of Might +Spell({ 19740, 19834, 19835, 19836, 19837, 19838, 25291 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Might +Spell({ 25782, 25916 }, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Might -Spell({ 19742, 19850, 19852, 19853, 19854, 25290 }, { duration = 300, type = "BUFF" }) -- Blessing of Wisdom -Spell({ 25894, 25918 }, { duration = 900, type = "BUFF" }) -- Greater Blessing of Might +Spell({ 19742, 19850, 19852, 19853, 19854, 25290 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Wisdom +Spell({ 25894, 25918 }, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Might -Spell(20217, { duration = 300, type = "BUFF" }) -- Blessing of Kings -Spell(25898, { duration = 900, type = "BUFF" }) -- Greater Blessing of Kings +Spell(20217, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Kings +Spell(25898, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Kings -Spell({ 20911, 20912, 20913 }, { duration = 300, type = "BUFF" }) -- Blessing of Sanctuary -Spell(25899, { duration = 900, type = "BUFF" }) -- Greater Blessing of Sanctuary +Spell({ 20911, 20912, 20913 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Sanctuary +Spell(25899, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Sanctuary -Spell(1038, { duration = 300, type = "BUFF" }) -- Blessing of Salvation -Spell(25895, { duration = 900, type = "BUFF" }) -- Greater Blessing of Salvation +Spell(1038, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Salvation +Spell(25895, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Salvation -Spell({ 19977, 19978, 19979 }, { duration = 300, type = "BUFF" }) -- Blessing of Light -Spell(25890, { duration = 900, type = "BUFF" }) -- Greater Blessing of Light +Spell({ 19977, 19978, 19979 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Light +Spell(25890, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Light Spell( 20066, { duration = 6 }) -- Repentance Spell({ 2878, 5627, 5627 }, { @@ -548,7 +696,15 @@ Spell( 20170 ,{ duration = 2 }) -- Seal of Justice stun -- HUNTER ------------- --- Spell({ 19506, 20905, 20906 }, { duration = 1800, type = "BUFF" }) -- Trueshot Aura +Spell( 13161, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Beast +Spell( 5118, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Cheetah +Spell( 13159, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Pack +Spell( 13163, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Monkey +Spell({ 20043, 20190 }, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Wild +Spell({ 13165, 14318, 14319, 14320, 14321, 14322, 25296 }, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Hawk +Spell( 5384, { duration = INFINITY, type = "BUFF" }) -- Feign Death (Will it work?) + +Spell({ 19506, 20905, 20906 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Trueshot Aura --SKIPPING: Frenzy Spell({ 1130, 14323, 14324, 14325 }, { duration = 120 }) -- Hunter's Mark Spell(19263, { duration = 10, type = "BUFF" }) -- Deterrence @@ -560,6 +716,7 @@ Spell({ 3034, 14279, 14280 }, { duration = 8 }) -- Viper Sting Spell({ 19386, 24132, 24133 }, { duration = 12 }) -- Wyvern Sting Spell({ 24131, 24134, 24135 }, { duration = 12 }) -- Wyvern Sting Dot Spell({ 1513, 14326, 14327 }, { + pvpduration = 20, duration = function(spellID) if spellID == 1513 then return 10 elseif spellID == 14326 then return 15 @@ -572,6 +729,7 @@ Spell({ 19306, 20909, 20910 }, { duration = 5 }) -- Counterattack -- Spell({ 13812, 14314, 14315 }, { duration = 20, stacking = true }) -- Explosive Trap Spell({ 13797, 14298, 14299, 14300, 14301 }, { duration = 15, stacking = true }) -- Immolation Trap Spell({ 3355, 14308, 14309 }, { + pvpduration = 20, duration = function(spellID, isSrcPlayer) local mul = 1 if isSrcPlayer then @@ -587,23 +745,28 @@ Spell({ 2974, 14267, 14268 }, { duration = 10 }) -- Wing Clip Spell(5116, { duration = 4 }) -- Concussive Shot Spell(19410, { duration = 3 }) -- Conc Stun Spell(24394, { duration = 3 }) -- Intimidation -Spell(15571, { duration = 4 }) -- Daze from Aspect +-- Spell(15571, { duration = 4 }) -- Daze from Aspect Spell(19185, { duration = 5 }) -- Entrapment Spell(25999, { duration = 1 }) -- Boar Charge +Spell(1002, { duration = 60 }) -- Eye of the Beast +Spell(1539, { duration = 20 }) -- Feed Pet Effect ------------- -- MAGE ------------- --- Spell({ 1459, 1460, 1461, 10156, 10157 }, { duration = 1800, type = "BUFF" }) -- Arcane Intellect --- Spell( 23028, { duration = 1800, type = "BUFF" }) -- Arcane Brilliance --- Spell({ 6117, 22782, 22783 }, { duration = 1800, type = "BUFF" }) -- Mage Armor --- Spell({ 168, 7300, 7301, 7302, 7320, 10219, 10220 }, { duration = 1800, type = "BUFF" }) -- Frost/Ice Armor +Spell( 12043, { duration = INFINITY, type = "BUFF" }) -- Presence of Mind + +Spell({ 1459, 1460, 1461, 10156, 10157 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Arcane Intellect +Spell( 23028, { duration = 3600, type = "BUFF", castFilter = true }) -- Arcane Brilliance +Spell({ 6117, 22782, 22783 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Mage Armor +Spell({ 168, 7300, 7301, 7302, 7320, 10219, 10220 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Frost/Ice Armor Spell( 2855, { duration = 1800, type = "BUFF" }) -- Detect Magic Spell( 130, { duration = 1800, type = "BUFF" }) -- Slow Fall Spell({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306 }, { + stacking = true, duration = function(spellID) if spellID == 133 then return 4 elseif spellID == 143 then return 6 @@ -611,13 +774,14 @@ Spell({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306 else return 8 end end }) -- Fireball - +Spell({ 11366, 12505, 12522, 12523, 12524, 12525, 12526, 18809 }, { duration = 12, stacking = true }) -- Pyroblast Spell({ 604, 8450, 8451, 10173, 10174 }, { duration = 600, type = "BUFF" }) -- Dampen Magic Spell({ 1008, 8455, 10169, 10170 }, { duration = 600, type = "BUFF" }) -- Amplify Magic Spell(18469, { duration = 4 }) -- Imp CS Silence Spell({ 118, 12824, 12825, 12826, 28270, 28271, 28272 }, { + pvpduration = 20, duration = function(spellID) if spellID == 118 then return 20 elseif spellID == 12824 then return 30 @@ -633,7 +797,18 @@ Spell({ 6143, 8461, 8462, 10177, 28609 }, { duration = 30, type = "BUFF" }) -- F Spell(12355, { duration = 2 }) -- Impact Spell(12654, { duration = 4 }) -- Ignite -Spell(22959, { duration = 30 }) -- Fire Vulnerability + +if class == "MAGE" then +Spell(22959, { + duration = function(spellID, isSrcPlayer) + if Talent(11095, 12872, 12873) > 0 then + return 30 + else + return nil + end + end }) -- Fire Vulnerability +end + Spell({ 11113, 13018, 13019, 13020, 13021 }, { duration = 6 }) -- Blast Wave Spell({ 2120, 2121, 8422, 8423, 10215, 10216 }, { duration = 8, stacking = true }) -- Flamestrike @@ -645,20 +820,32 @@ Spell({ 120, 8492, 10159, 10160, 10161 }, { end }) -- Cone of Cold --- DOESN'T APPEAR IN COMBAT LOG --- Spell({ 12484, 12485, 12486 }, { --- duration = function(spellID, isSrcPlayer) --- local permafrost = isSrcPlayer and Talent(11175, 12569, 12571) or 0 --- return 1.5 + permafrost --- end --- }) -- Improved Blizzard + +if class == "MAGE" then +-- Chilled from Imp Blizzard +Spell({ 12484, 12485, 12486 }, { + duration = function(spellID, isSrcPlayer) + if Talent(11185, 12487, 12488) > 0 then -- Don't show anything if mage doesn't have imp blizzard talent + local permafrost = Talent(11175, 12569, 12571) -- Always count player's permafost, even source isn't player. + return 1.5 + permafrost + 0.5 + -- 0.5 compensates for delay between damage event and slow application + else + return nil + end + end +}) -- Improved Blizzard (Chilled) + +-- Manually setting a custom spellname for ImpBlizzard's "Chilled" aura +lib.spellNameToID["ImpBlizzard"] = 12486 +-- Frost Armor will overwrite Chilled to 7321 right after +end Spell({6136, 7321}, { duration = function(spellID, isSrcPlayer) local permafrost = isSrcPlayer and Talent(11175, 12569, 12571) or 0 return 5 + permafrost end -}) -- Frost Armor +}) -- Frost/Ice Armor (Chilled) Spell({ 116, 205, 837, 7322, 8406, 8407, 8408, 10179, 10180, 10181, 25304 }, { duration = function(spellID, isSrcPlayer) @@ -684,4 +871,4 @@ Spell(12051, { duration = 8, type = "BUFF" }) -- Evocation -lib:SetDataVersion(Type, Version) \ No newline at end of file +lib:SetDataVersion(Type, Version) diff --git a/libraries/LibClassicDurations/core.lua b/libraries/LibClassicDurations/core.lua index 51532e6..8c4b84d 100755 --- a/libraries/LibClassicDurations/core.lua +++ b/libraries/LibClassicDurations/core.lua @@ -39,7 +39,6 @@ Usage example 2: local LCD = LibStub("LibClassicDurations") LCD:Register("YourAddon") -- tell library it's being used and should start working - local f = CreateFrame("frame", nil, UIParent) f:RegisterUnitEvent("UNIT_AURA", "target") @@ -58,10 +57,15 @@ Usage example 2: EventHandler(f, "UNIT_AURA", unit) end) ---]================] + -- Optional: + LCD.RegisterCallback(addon, "UNIT_BUFF_GAINED", function(event, unit, spellID) + print("Gained", GetSpellInfo(spellID)) + end) +--]================] +if WOW_PROJECT_ID ~= WOW_PROJECT_CLASSIC then return end -local MAJOR, MINOR = "LibClassicDurations", 13 +local MAJOR, MINOR = "LibClassicDurations", 34 local lib = LibStub:NewLibrary(MAJOR, MINOR) if not lib then return end @@ -92,6 +96,9 @@ local buffCacheValid = lib.buffCacheValid lib.nameplateUnitMap = lib.nameplateUnitMap or {} local nameplateUnitMap = lib.nameplateUnitMap +lib.castLog = lib.castLog or {} +local castLog = lib.castLog + lib.guidAccessTimes = lib.guidAccessTimes or {} local guidAccessTimes = lib.guidAccessTimes @@ -100,8 +107,9 @@ local callbacks = lib.callbacks local guids = lib.guids local spells = lib.spells local npc_spells = lib.npc_spells +local indirectRefreshSpells = lib.indirectRefreshSpells - +local INFINITY = math.huge local PURGE_INTERVAL = 900 local PURGE_THRESHOLD = 1800 local UNKNOWN_AURA_DURATION = 3600 -- 60m @@ -115,6 +123,7 @@ local tinsert = table.insert local unpack = unpack local GetAuraDurationByUnitDirect local enableEnemyBuffTracking = false +local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER f:SetScript("OnEvent", function(self, event, ...) return self[event](self, event, ...) @@ -126,6 +135,7 @@ local SpellDataVersions = lib.dataVersions function lib:SetDataVersion(dataType, version) SpellDataVersions[dataType] = version npc_spells = lib.npc_spells + indirectRefreshSpells = lib.indirectRefreshSpells end function lib:GetDataVersion(dataType) @@ -183,6 +193,28 @@ local function processNPCSpellTable() end end lib.NPCSpellTableTimer = C_Timer.NewTimer(10, processNPCSpellTable) + + +local function isHunterGUID(guid) + return select(2, GetPlayerInfoByGUID(guid)) == "HUNTER" +end +local function isFriendlyFeigning(guid) + if IsInRaid() then + for i = 1, MAX_RAID_MEMBERS do + local unitID = "raid"..i + if (UnitGUID(unitID) == guid) and UnitIsFeignDeath(unitID) then + return true + end + end + elseif IsInGroup() then + for i = 1, MAX_PARTY_MEMBERS do + local unitID = "party"..i + if (UnitGUID(unitID) == guid) and UnitIsFeignDeath(unitID) then + return true + end + end + end +end -------------------------- -- OLD GUIDs PURGE -------------------------- @@ -197,6 +229,7 @@ local function purgeOldGUIDs() buffCacheValid[guid] = nil buffCache[guid] = nil DRInfo[guid] = nil + castLog[guid] = nil tinsert(deleted, guid) end end @@ -277,7 +310,9 @@ local function CountDiminishingReturns(eventType, srcGUID, srcFlags, dstGUID, ds addDRLevel(dstGUID, category) end if eventType == "UNIT_DIED" then - clearDRs(dstGUID) + if not isHunterGUID(dstGUID) then + clearDRs(dstGUID) + end end end end @@ -309,18 +344,35 @@ end -- COMBAT LOG --------------------------- -local function cleanDuration(duration, spellID, srcGUID) +local function cleanDuration(duration, spellID, srcGUID, comboPoints) if type(duration) == "function" then local isSrcPlayer = srcGUID == UnitGUID("player") - local comboPoints - if isSrcPlayer and playerClass == "ROGUE" then - comboPoints = GetCP() - end + -- Passing startTime for the sole reason of identifying different Rupture/KS applications for Rogues + -- Then their duration func will cache one actual duration calculated at the moment of application return duration(spellID, isSrcPlayer, comboPoints) end return duration end +local function RefreshTimer(srcGUID, dstGUID, spellID) + local guidTable = guids[dstGUID] + if not guidTable then return end + + local spellTable = guidTable[spellID] + if not spellTable then return end + + local applicationTable + if spellTable.applications then + applicationTable = spellTable.applications[srcGUID] + else + applicationTable = spellTable + end + if not applicationTable then return end + + applicationTable[2] = GetTime() -- set start time to now + return true +end + local function SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType, doRemove) if not opts then return end @@ -366,8 +418,12 @@ local function SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, applicationTable = spellTable end - -- local duration = cleanDuration(opts.duration, spellID, srcGUID) local duration = opts.duration + local isDstPlayer = bit_band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) > 0 + if isDstPlayer and opts.pvpduration then + duration = opts.pvpduration + end + if not duration then return SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType, true) end @@ -381,46 +437,119 @@ local function SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, -- -- local temporaryDuration = cleanDuration(opts.duration, spellID, srcGUID) -- expirationTime = now + duration -- end + applicationTable[1] = duration applicationTable[2] = now -- applicationTable[2] = expirationTime applicationTable[3] = auraType + local isSrcPlayer = srcGUID == UnitGUID("player") + local comboPoints + if isSrcPlayer and playerClass == "ROGUE" then + comboPoints = GetCP() + end + applicationTable[4] = comboPoints + guidAccessTimes[dstGUID] = now end -local function NotifyGUIDBuffChange(dstGUID) +local function FireToUnits(event, dstGUID) if dstGUID == UnitGUID("target") then - callbacks:Fire("UNIT_BUFF", "target") + callbacks:Fire(event, "target") end local nameplateUnit = nameplateUnitMap[dstGUID] if nameplateUnit then - callbacks:Fire("UNIT_BUFF", nameplateUnit) + callbacks:Fire(event, nameplateUnit) + end +end + +local function GetLastRankSpellID(spellName) + local spellID = spellNameToID[spellName] + if not spellID then + spellID = NPCspellNameToID[spellName] end + return spellID end +local eventSnapshot +castLog.SetLastCast = function(self, srcGUID, spellID, timestamp) + self[srcGUID] = { spellID, timestamp } + guidAccessTimes[srcGUID] = timestamp +end +castLog.IsCurrent = function(self, srcGUID, spellID, timestamp, timeWindow) + local entry = self[srcGUID] + if entry then + local lastSpellID, lastTimestamp = entry[1], entry[2] + return lastSpellID == spellID and (timestamp - lastTimestamp < timeWindow) + end +end + +local lastResistSpellID +local lastResistTime = 0 --------------------------- -- COMBAT LOG HANDLER --------------------------- function f:COMBAT_LOG_EVENT_UNFILTERED(event) + return self:CombatLogHandler(CombatLogGetCurrentEventInfo()) +end +function f:CombatLogHandler(...) local timestamp, eventType, hideCaster, srcGUID, srcName, srcFlags, srcFlags2, dstGUID, dstName, dstFlags, dstFlags2, - spellID, spellName, spellSchool, auraType, amount = CombatLogGetCurrentEventInfo() + spellID, spellName, spellSchool, auraType = ... - if auraType == "BUFF" or auraType == "DEBUFF" then - local isSrcPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER) > 0 + if indirectRefreshSpells[spellName] then + local refreshTable = indirectRefreshSpells[spellName] + if refreshTable.events[eventType] then + local targetSpellID = refreshTable.targetSpellID - if spellID == 0 then - -- so not to rewrite the whole thing to spellnames after the combat log change - -- just treat everything as max rank id of that spell name - if isSrcPlayer then - spellID = spellNameToID[spellName] + local condition = refreshTable.condition + if condition then + local isMine = bit_band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE + if not condition(isMine) then return end + end + + if refreshTable.targetResistCheck then + local now = GetTime() + if lastResistSpellID == targetSpellID and now - lastResistTime < 0.4 then + return + end + end + + if refreshTable.applyAura then + local opts = spells[targetSpellID] + if opts then + local targetAuraType = "DEBUFF" + local targetSpellName = GetSpellInfo(targetSpellID) + SetTimer(srcGUID, dstGUID, dstName, dstFlags, targetSpellID, targetSpellName, opts, targetAuraType) + end else - spellID = NPCspellNameToID[spellName] + RefreshTimer(srcGUID, dstGUID, targetSpellID) + end + end + end + + if eventType == "SPELL_MISSED" and + bit_band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE + then + local missType = auraType + if missType == "RESIST" then + spellID = GetLastRankSpellID(spellName) + if not spellID then + return end + lastResistSpellID = spellID + lastResistTime = GetTime() + end + end + + if auraType == "BUFF" or auraType == "DEBUFF" or eventType == "SPELL_CAST_SUCCESS" then + if spellID == 0 then + -- so not to rewrite the whole thing to spellnames after the combat log change + -- just treat everything as max rank id of that spell name + spellID = GetLastRankSpellID(spellName) if not spellID then return end @@ -442,32 +571,86 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) end if opts then + local castEventPass + if opts.castFilter then + -- Buff and Raidwide Buff events arrive in the following order: + -- 1571716930.161 ID: 21562 SPELL_AURA_APPLIED/REFRESH to Caster himself (if selfcast or raidwide) + -- 1571716930.161 ID: 21562 SPELL_CAST_SUCCESS on Cast Target + -- 1571716930.161 ID: 21562 SPELL_AURA_APPLIED/REFRESH to everyone else + + -- For spells that have cast filter enabled: + -- First APPLIED event gets snapshotted and otherwise ignored + -- CAST event effectively sets castEventPass to true + -- Snapshotted event now gets handled with cast pass + -- All the following APPLIED events are accepted while cast pass is valid + -- (Unconfirmed whether timestamp is the same even for a 40m raid) + local now = GetTime() + castEventPass = castLog:IsCurrent(srcGUID, spellID, now, 0.4) + if not castEventPass and (eventType == "SPELL_AURA_REFRESH" or eventType == "SPELL_AURA_APPLIED") then + eventSnapshot = { timestamp, eventType, hideCaster, + srcGUID, srcName, srcFlags, srcFlags2, + dstGUID, dstName, dstFlags, dstFlags2, + spellID, spellName, spellSchool, auraType } + return + end + + if eventType == "SPELL_CAST_SUCCESS" then + -- Aura spell ID can be different from cast spell id + -- But all buffs are usually simple spells and it's the same for them + castLog:SetLastCast(srcGUID, spellID, now) + if eventSnapshot then + self:CombatLogHandler(unpack(eventSnapshot)) + eventSnapshot = nil + end + end + end + + local isEnemyBuff = not isDstFriendly and auraType == "BUFF" -- print(eventType, srcGUID, "=>", dstName, spellID, spellName, auraType ) if eventType == "SPELL_AURA_REFRESH" or eventType == "SPELL_AURA_APPLIED" or - eventType == "SPELL_AURA_APPLIED_DOSE" then - SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType) + eventType == "SPELL_AURA_APPLIED_DOSE" + then + if not opts.castFilter or + castEventPass or + isEnemyBuff + then + SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType) + end elseif eventType == "SPELL_AURA_REMOVED" then SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType, true) -- elseif eventType == "SPELL_AURA_REMOVED_DOSE" then -- self:RemoveDose(srcGUID, dstGUID, spellID, spellName, auraType, amount) end - if enableEnemyBuffTracking and not isDstFriendly and auraType == "BUFF" then + if enableEnemyBuffTracking and isEnemyBuff then -- invalidate buff cache buffCacheValid[dstGUID] = nil - NotifyGUIDBuffChange(dstGUID) + FireToUnits("UNIT_BUFF", dstGUID) + if eventType == "SPELL_AURA_REFRESH" or + eventType == "SPELL_AURA_APPLIED" or + eventType == "SPELL_AURA_APPLIED_DOSE" + then + FireToUnits("UNIT_BUFF_GAINED", dstGUID, spellID) + end end end end if eventType == "UNIT_DIED" then + if isHunterGUID(dstGUID) then + local isDstFriendly = bit_band(dstFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 + if not isDstFriendly or isFriendlyFeigning(dstGUID) then + return + end + end + guids[dstGUID] = nil buffCache[dstGUID] = nil buffCacheValid[dstGUID] = nil guidAccessTimes[dstGUID] = nil local isDstFriendly = bit_band(dstFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 if enableEnemyBuffTracking and not isDstFriendly then - NotifyGUIDBuffChange(dstGUID) + FireToUnits("UNIT_BUFF", dstGUID) end nameplateUnitMap[dstGUID] = nil end @@ -476,12 +659,20 @@ end --------------------------- -- ENEMY BUFFS --------------------------- -local makeBuffInfo = function(spellID, bt) - local name, rank, icon, castTime, minRange, maxRange, spellId = GetSpellInfo(spellID) - local duration = bt[1] - local expirationTime = duration == 0 and 0 or bt[2] - -- buffName, icon, count, debuffType, duration, expirationTime, caster, canStealOrPurge, _ , spellId - return { name, icon, 1, nil, duration, expirationTime, nil, nil, nil, spellID } +local makeBuffInfo = function(spellID, applicationTable, dstGUID, srcGUID) + local name, rank, icon, castTime, minRange, maxRange, _spellId = GetSpellInfo(spellID) + local durationFunc, startTime, auraType, comboPoints = unpack(applicationTable) + local duration = cleanDuration(durationFunc, spellID, srcGUID, comboPoints) -- srcGUID isn't needed actually + -- no DRs on buffs + local expirationTime = startTime + duration + if duration == INFINITY then + duration = 0 + expirationTime = 0 + end + local now = GetTime() + if expirationTime > now then + return { name, icon, 1, nil, duration, expirationTime, nil, nil, nil, spellID } + end end local shouldDisplayAura = function(auraTable) @@ -503,13 +694,19 @@ local function RegenerateBuffList(dstGUID) for spellID, t in pairs(guidTable) do if t.applications then for srcGUID, auraTable in pairs(t.applications) do - if shouldDisplayAura(auraTable) then - tinsert(buffs, makeBuffInfo(spellID, auraTable)) + if auraTable[3] == "BUFF" then + local buffInfo = makeBuffInfo(spellID, auraTable, dstGUID, srcGUID) + if buffInfo then + tinsert(buffs, buffInfo) + end end end else - if shouldDisplayAura(t) then - tinsert(buffs, makeBuffInfo(spellID, t)) + if t[3] == "BUFF" then + local buffInfo = makeBuffInfo(spellID, t, dstGUID) + if buffInfo then + tinsert(buffs, buffInfo) + end end end end @@ -520,7 +717,7 @@ end local FillInDuration = function(unit, buffName, icon, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nps, spellId, ...) if buffName then - local durationNew, expirationTimeNew = GetAuraDurationByUnitDirect(unit, spellId, caster) + local durationNew, expirationTimeNew = GetAuraDurationByUnitDirect(unit, spellId, caster, buffName) if duration == 0 and durationNew then duration = durationNew expirationTime = expirationTimeNew @@ -532,6 +729,7 @@ end function lib.UnitAuraDirect(unit, index, filter) if enableEnemyBuffTracking and filter == "HELPFUL" and not UnitIsFriend("player", unit) and not UnitAura(unit, 1, filter) then local unitGUID = UnitGUID(unit) + if not unitGUID then return end if not buffCacheValid[unitGUID] then RegenerateBuffList(unitGUID) end @@ -547,6 +745,11 @@ function lib.UnitAuraDirect(unit, index, filter) return FillInDuration(unit, UnitAura(unit, index, filter)) end end +lib.UnitAuraWithBuffs = lib.UnitAuraDirect + +function lib.UnitAuraWrapper(unit, ...) + return FillInDuration(unit, UnitAura(unit, ...)) +end function lib:UnitAura(...) return self.UnitAuraDirect(...) @@ -596,8 +799,10 @@ local function GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, isStacking) applicationTable = spellTable end if not applicationTable then return end - local durationFunc, startTime = unpack(applicationTable) - local duration = cleanDuration(durationFunc, spellID, srcGUID) + local durationFunc, startTime, auraType, comboPoints = unpack(applicationTable) + local duration = cleanDuration(durationFunc, spellID, srcGUID, comboPoints) + if duration == INFINITY then return nil end + if not duration then return nil end local mul = getDRMul(dstGUID, spellID) -- local mul = getDRMul(dstGUID, lastRankID) duration = duration * mul @@ -609,6 +814,21 @@ local function GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, isStacking) end end +if playerClass == "MAGE" then + local NormalGetGUIDAuraTime = GetGUIDAuraTime + local Chilled = GetSpellInfo(12486) + GetGUIDAuraTime = function(dstGUID, spellName, spellID, ...) + + -- Overriding spellName for Improved blizzard's spellIDs + if spellName == Chilled and + spellID == 12486 or spellID == 12484 or spellID == 12485 + then + spellName = "ImpBlizzard" + end + return NormalGetGUIDAuraTime(dstGUID, spellName, spellID, ...) + end +end + function lib.GetAuraDurationByUnitDirect(unit, spellID, casterUnit, spellName) assert(spellID, "spellID is nil") local opts = spells[spellID] @@ -635,6 +855,7 @@ function lib:GetLastRankSpellIDByName(spellName) return spellNameToID[spellName] end +-- Will not work for cp-based durations, KS and Rupture function lib:GetDurationForRank(spellName, spellID, srcGUID) local lastRankID = spellNameToID[spellName] local opts = spells[lastRankID] @@ -666,4 +887,55 @@ function lib:UnregisterFrame(frame) end end end -lib.Unregister = lib.UnregisterFrame \ No newline at end of file +lib.Unregister = lib.UnregisterFrame + + +function lib:ToggleDebug() + if not lib.debug then + lib.debug = CreateFrame("Frame") + lib.debug:SetScript("OnEvent",function( self, event ) + local timestamp, eventType, hideCaster, + srcGUID, srcName, srcFlags, srcFlags2, + dstGUID, dstName, dstFlags, dstFlags2, + spellID, spellName, spellSchool, auraType, amount = CombatLogGetCurrentEventInfo() + local isSrcPlayer = (bit_band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE) + if isSrcPlayer then + print (GetTime(), "ID:", spellID, spellName, eventType, srcFlags, srcGUID,"|cff00ff00==>|r", dstGUID, dstFlags, auraType, amount) + end + end) + end + if not lib.debug.enabled then + lib.debug:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + lib.debug.enabled = true + print("[LCD] Enabled combat log event display") + else + lib.debug:UnregisterAllEvents() + lib.debug.enabled = false + print("[LCD] Disabled combat log event display") + end +end + +function lib:MonitorUnit(unit) + if not lib.debug then + lib.debug = CreateFrame("Frame") + local debugGUID = UnitGUID(unit) + lib.debug:SetScript("OnEvent",function( self, event ) + local timestamp, eventType, hideCaster, + srcGUID, srcName, srcFlags, srcFlags2, + dstGUID, dstName, dstFlags, dstFlags2, + spellID, spellName, spellSchool, auraType, amount = CombatLogGetCurrentEventInfo() + if srcGUID == debugGUID or dstGUID == debugGUID then + print (GetTime(), "ID:", spellID, spellName, eventType, srcFlags, srcGUID,"|cff00ff00==>|r", dstGUID, dstFlags, auraType, amount) + end + end) + end + if not lib.debug.enabled then + lib.debug:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + lib.debug.enabled = true + print("[LCD] Enabled combat log event display") + else + lib.debug:UnregisterAllEvents() + lib.debug.enabled = false + print("[LCD] Disabled combat log event display") + end +end diff --git a/libraries/LibClassicDurations/diminishingReturns.lua b/libraries/LibClassicDurations/diminishingReturns.lua index 62ab07f..27cff17 100755 --- a/libraries/LibClassicDurations/diminishingReturns.lua +++ b/libraries/LibClassicDurations/diminishingReturns.lua @@ -1,7 +1,7 @@ local lib = LibStub("LibClassicDurations", true) if not lib then return end -local Type, Version = "DRTable", 6 +local Type, Version = "DRTable", 7 if lib:GetDataVersion(Type) >= Version then return end local FEAR = "FEAR" @@ -10,13 +10,14 @@ local INCAP = "INCAP" local STUN = "STUN" local HORROR = "HORROR" local ROOT = "ROOT" -local OPENER_STUN = "OPENER_STUN" +-- local OPENER_STUN = "OPENER_STUN" local RANDOM_STUN = "RANDOM_STUN" local RANDOM_ROOT = "RANDOM_ROOT" local FROST_SHOCK = "FROST_SHOCK" +local KIDNEY_SHOT = "KIDNEY_SHOT" lib.DR_TypesPVE = { - [OPENER_STUN] = true, + [KIDNEY_SHOT] = true, [STUN] = true, } @@ -28,6 +29,9 @@ lib.DR_CategoryBySpellID = { [835] = STUN, -- Tidal Charm [20549] = STUN, -- War Stomp [16566] = ROOT, -- Net-o-Matic + [1090] = INCAP, -- Magic Dust + [13327] = INCAP, -- Goblin Rocket Helm, Reckless Charge + [5134] = FEAR, -- Flash Bomb [5782] = FEAR, -- Fear 3 ranks [6213] = FEAR, @@ -64,8 +68,8 @@ lib.DR_CategoryBySpellID = { [24132] = INCAP, [24133] = INCAP, - -- [19503] = NONE, -- Scatter Shot - [19229] = RANDOM_ROOT, -- Improved Wing Clip Root + [19503] = INCAP, -- Scatter Shot + -- [19229] = RANDOM_ROOT, -- Improved Wing Clip Root [19306] = ROOT, -- Counterattack @@ -89,7 +93,6 @@ lib.DR_CategoryBySpellID = { [9853] = ROOT, [16922] = RANDOM_STUN, -- Improved Starfire - -- Pounce wasn't on the same DR with Cheap Shot until 3.1.0 [9005] = STUN, -- Pounce 3 ranks [9823] = STUN, [9827] = STUN, @@ -133,7 +136,7 @@ lib.DR_CategoryBySpellID = { -- [18425] = SILENCE, -- Imp Kick - [1833] = OPENER_STUN, -- Cheap Shot + [1833] = STUN, -- Cheap Shot -- Blind wasn't on Fear until some time in 3.0, and before that it was with Cyclone, -- and in classic probably with itself -- [2094] = FEAR, -- Blind @@ -148,14 +151,14 @@ lib.DR_CategoryBySpellID = { [11285] = INCAP, [11286] = INCAP, - [408] = STUN, -- Kidney Shot 2 ranks - [8643] = STUN, + [408] = KIDNEY_SHOT, -- Kidney Shot 2 ranks + [8643] = KIDNEY_SHOT, [5530] = RANDOM_STUN, -- Mace Spec Stun, shared by both Rogue and Warrior -- [18498] = SILENCE, -- Imp Shield Bash Silence - [23694] = RANDOM_ROOT, -- Improved Hamstring Root + -- [23694] = RANDOM_ROOT, -- Improved Hamstring Root -- Disarm wasn't on DR until 2.3.0 -- [676] = "DISARM", -- Disarm From 5edc814dc81f8c918456cb2f896a4a9b221bc389 Mon Sep 17 00:00:00 2001 From: novikmisha Date: Fri, 28 Aug 2020 11:19:31 +0300 Subject: [PATCH 10/22] update libs --- .../LibClassicCasterino.lua | 111 +++- .../LibClassicDurations.xml | 0 .../LibClassicDurations/classAbilities.lua | 523 +++++++++++++----- libraries/LibClassicDurations/core.lua | 455 +++++++++++---- .../diminishingReturns.lua | 0 .../LibClassicDurations/npcAbilities.lua | 0 6 files changed, 817 insertions(+), 272 deletions(-) mode change 100755 => 100644 libraries/LibClassicDurations/LibClassicDurations.xml mode change 100755 => 100644 libraries/LibClassicDurations/classAbilities.lua mode change 100755 => 100644 libraries/LibClassicDurations/core.lua mode change 100755 => 100644 libraries/LibClassicDurations/diminishingReturns.lua mode change 100755 => 100644 libraries/LibClassicDurations/npcAbilities.lua diff --git a/libraries/LibClassicCasterino/LibClassicCasterino.lua b/libraries/LibClassicCasterino/LibClassicCasterino.lua index 6f0cd92..c8f7775 100644 --- a/libraries/LibClassicCasterino/LibClassicCasterino.lua +++ b/libraries/LibClassicCasterino/LibClassicCasterino.lua @@ -4,7 +4,7 @@ Author: d87 --]================] if WOW_PROJECT_ID ~= WOW_PROJECT_CLASSIC then return end -local MAJOR, MINOR = "LibClassicCasterino", 22 +local MAJOR, MINOR = "LibClassicCasterino", 33 local lib = LibStub:NewLibrary(MAJOR, MINOR) if not lib then return end @@ -55,6 +55,8 @@ local castTimeCache = {} local castTimeCacheStartTimes = setmetatable({}, { __mode = "v" }) local AIMED_SHOT = GetSpellInfo(19434) +local MULTI_SHOT = GetSpellInfo(25294) +local AimedDelay = 1 local castingAimedShot = false local playerGUID = UnitGUID("player") @@ -89,14 +91,21 @@ local makeCastUID = function(guid, spellName) end local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime, isSrcEnemyPlayer ) + -- This cast time can't be used reliably because it's changing depending on player's own haste local _, _, icon, castTime = GetSpellInfo(spellID) + if castType == "CAST" then + local knownCastDuration = classCasts[spellID] + if knownCastDuration then + castTime = knownCastDuration*1000 + end + end if castType == "CHANNEL" then local channelDuration = classChannelsByAura[spellID] or classChannelsByCast[spellID] castTime = channelDuration*1000 - local decreased = talentDecreased[spellID] - if decreased then - castTime = castTime - decreased - end + end + local decreased = talentDecreased[spellID] + if decreased then + castTime = castTime - decreased*1000 end if overrideCastTime then castTime = overrideCastTime @@ -113,13 +122,19 @@ local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime end if isSrcEnemyPlayer then - movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT + if not (spellID == 4068 or spellID == 19769) then -- Iron Grenade, Thorium Grenade + movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT + end end if castType == "CAST" then - if srcGUID == playerGUID and spellName == AIMED_SHOT then + if srcGUID == playerGUID and (spellName == AIMED_SHOT or spellName == MULTI_SHOT) then castingAimedShot = true + AimedDelay = 1 movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT + if spellName == MULTI_SHOT then + casters[srcGUID][5] = startTime + 500 + end callbacks:Fire("UNIT_SPELLCAST_START", "player") end FireToUnits("UNIT_SPELLCAST_START", srcGUID) @@ -154,7 +169,8 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) local timestamp, eventType, hideCaster, srcGUID, srcName, srcFlags, srcFlags2, dstGUID, dstName, dstFlags, dstFlags2, - spellID, spellName, arg3, arg4, arg5 = CombatLogGetCurrentEventInfo() + spellID, spellName, arg3, arg4, arg5, + arg6, resisted, blocked, absorbed = CombatLogGetCurrentEventInfo() local isSrcPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET) > 0 if isSrcPlayer and spellID == 0 then @@ -245,22 +261,68 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) CastStop(srcGUID, "CHANNEL", "STOP") end end + elseif castingAimedShot and dstGUID == UnitGUID("player") then + if eventType == "SWING_DAMAGE" or + eventType == "ENVIRONMENTAL_DAMAGE" or + eventType == "RANGE_DAMAGE" or + eventType == "SPELL_DAMAGE" + then + if resisted or blocked or absorbed then return end + local currentCast = casters[UnitGUID("player")] + if currentCast then + refreshCastTable(currentCast, currentCast[1], currentCast[2], currentCast[3], currentCast[4], currentCast[5] + (AimedDelay *1000)) + if AimedDelay > 0.2 then + AimedDelay = AimedDelay - 0.2 + end + callbacks:Fire("UNIT_SPELLCAST_DELAYED", "player") + end + end end end --- local castTimeIncreases = { --- [1714] = 60, -- Curse of Tongues (60%) --- [5760] = 60, -- Mind-Numbing Poison (60%) --- } -local function IsSlowedDown(unit) - for i=1,16 do +local castTimeIncreases = { + [1714] = 1.5, -- Curse of Tongues (Rank 1) (50%) + [11719] = 1.6, -- Curse of Tongues (Rank 2) (60%) + [5760] = 1.4, -- Mind-Numbing Poison (Rank 1) (40%) + [8692] = 1.5, -- Mind-Numbing Poison (Rank 2) (50%) + [11398] = 1.6, -- Mind-Numbing Poison (Rank 3) (60%) + [1098] = 1.3, -- Enslave Demon (Rank 1) (30%) + [11725] = 1.3, -- Enslave Demon (Rank 2) (30%) + [11726] = 1.3, -- Enslave Demon (Rank 3) (30%) +} +local attackTimeDecreases = { + [6150] = 1.3, -- Quick Shots/ Imp Aspect of the Hawk (Aimed) + [3045] = 1.4, -- Rapid Fire (Aimed) + [28866] = 1.2, -- Kiss of the Spider (Increases your _attack speed_ by 20% for 15 sec.) -- For Aimed +} + +local function GetTrollBerserkHaste(unit) + local perc = UnitHealth(unit)/UnitHealthMax(unit) + local speed = min((1.3 - perc)/3, .3) + 1 + return speed +end +local function GetRangedHaste(unit) + local positiveMul = 1 + for i=1, 100 do + local name, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, "HELPFUL") + if not name then return positiveMul end + if attackTimeDecreases[spellID] or spellID == 26635 then + positiveMul = positiveMul * (attackTimeDecreases[spellID] or GetTrollBerserkHaste(unit)) + end + end + return positiveMul +end +local function GetCastSlowdown(unit) + local negativeEx = 1 + for i=1, 100 do local name, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, "HARMFUL") - if not name then return end - if spellID == 1714 or spellID == 5760 then - return true + if not name then return negativeEx end + if castTimeIncreases[spellID] then + negativeEx = math.max(negativeEx, castTimeIncreases[spellID]) end end + return negativeEx end function lib:UnitCastingInfo(unit) @@ -273,10 +335,18 @@ function lib:UnitCastingInfo(unit) local cast = casters[guid] if cast then local castType, name, icon, startTimeMS, endTimeMS, spellID = unpack(cast) - if IsSlowedDown(unit) then + if castingAimedShot and spellID ~= 25294 then -- Multi-Shot spellID + local haste = GetRangedHaste(unit) local duration = endTimeMS - startTimeMS - endTimeMS = startTimeMS + duration * 1.6 + endTimeMS = startTimeMS + duration/haste end + + local slowdown = GetCastSlowdown(unit) + if slowdown ~= 1 then + local duration = endTimeMS - startTimeMS + endTimeMS = startTimeMS + duration * slowdown + end + if castType == "CAST" and endTimeMS > GetTime()*1000 then local castID = nil return name, nil, icon, startTimeMS, endTimeMS, nil, castID, false, spellID @@ -476,6 +546,7 @@ classCasts = { [11605] = 1.5, -- Slam [20904] = 3, -- Aimed Shot + [25294] = 0.5, -- Multi-Shot [1002] = 2, -- Eyes of the Beast [2641] = 5, -- Dismiss pet [982] = 10, -- Revive Pet @@ -483,6 +554,8 @@ classCasts = { [8690] = 10, -- Hearthstone [4068] = 1, -- Iron Grenade + [19769] = 1, -- Thorium Grenade + [20589] = 0.5, -- Escape Artist -- Munts do not generate SPELL_CAST_START -- [8394] = 3, -- Striped Frostsaber diff --git a/libraries/LibClassicDurations/LibClassicDurations.xml b/libraries/LibClassicDurations/LibClassicDurations.xml old mode 100755 new mode 100644 diff --git a/libraries/LibClassicDurations/classAbilities.lua b/libraries/LibClassicDurations/classAbilities.lua old mode 100755 new mode 100644 index 453e22a..167ef85 --- a/libraries/LibClassicDurations/classAbilities.lua +++ b/libraries/LibClassicDurations/classAbilities.lua @@ -1,7 +1,7 @@ local lib = LibStub and LibStub("LibClassicDurations", true) if not lib then return end -local Type, Version = "SpellTable", 40 +local Type, Version = "SpellTable", 67 if lib:GetDataVersion(Type) >= Version then return end -- older versions didn't have that function local Spell = lib.AddAura @@ -16,83 +16,181 @@ local locale = GetLocale() if locale == "zhCN" then lib.spellNameToID[GetSpellInfo(980)] = nil end +if locale == "ruRU" then + lib.spellNameToID[GetSpellInfo(12721)] = nil -- Deep Wounds conflict with Rake on ruRU +end -- https://github.com/rgd87/LibClassicDurations/issues/11 lib.indirectRefreshSpells = { [GetSpellInfo(11597)] = { -- Sunder Armor - events = { - ["SPELL_CAST_SUCCESS"] = true - }, - targetSpellID = 11597, + [11597] = { + events = { + ["SPELL_CAST_SUCCESS"] = true + }, + -- targetSpellID = 11597, + rollbackMisses = true, + } }, [GetSpellInfo(25357)] = { -- Healing Wave - events = { - ["SPELL_CAST_SUCCESS"] = true - }, - targetSpellID = 29203, -- Healing Way + [29203] = { + events = { + ["SPELL_CAST_SUCCESS"] = true + }, + -- targetSpellID = 29203, -- Healing Way + } }, } if class == "MAGE" then - lib.indirectRefreshSpells[GetSpellInfo(10207)] = { -- Scorch - events = { - ["SPELL_DAMAGE"] = true - }, - targetSpellID = 22959, -- Fire Vulnerability - targetResistCheck = true, - condition = function(isMine) return isMine end, - -- it'll refresg only from mages personal casts which is fine - -- because if mage doesn't have imp scorch then he won't even see a Fire Vulnerability timer + + + lib.indirectRefreshSpells[GetSpellInfo(25304)] = { -- Frostbolt + [12579] = { + events = { + ["SPELL_DAMAGE"] = true + }, + targetSpellID = 12579, -- Winter's Chill + rollbackMisses = true, + condition = function(isMine) return isMine end, + } + } + + lib.indirectRefreshSpells[GetSpellInfo(10161)] = { -- Cone of Cold + [12579] = { + events = { + ["SPELL_DAMAGE"] = true + }, + targetSpellID = 12579, -- Winter's Chill + rollbackMisses = true, + condition = function(isMine) return isMine end, + } } + lib.indirectRefreshSpells[GetSpellInfo(10230)] = { -- Frost Nova + [12579] = { + events = { + ["SPELL_DAMAGE"] = true + }, + targetSpellID = 12579, -- Winter's Chill + rollbackMisses = true, + condition = function(isMine) return isMine end, + } + } + + -- Winter's Chill = Frostbolt + lib.indirectRefreshSpells[GetSpellInfo(12579)] = lib.indirectRefreshSpells[GetSpellInfo(25304)] + lib.indirectRefreshSpells[GetSpellInfo(10)] = { -- Blizzard - events = { - ["SPELL_PERIODIC_DAMAGE"] = true + [12486] = { + events = { + ["SPELL_PERIODIC_DAMAGE"] = true + }, + applyAura = true, + targetSpellID = 12486, -- Imp Blizzard + } + } + + -- Ignite + + lib.indirectRefreshSpells[GetSpellInfo(10207)] = { -- Scorch + [22959] = { + events = { + ["SPELL_DAMAGE"] = true + }, + -- targetSpellID = 22959, -- Fire Vulnerability + rollbackMisses = true, + -- condition = function(isMine) return isMine end, + -- it'll refresg only from mages personal casts which is fine + -- because if mage doesn't have imp scorch then he won't even see a Fire Vulnerability timer }, - applyAura = true, - targetSpellID = 12486, -- Imp Blizzard } + + local fire_spells = {133, 10207, 2136, 2120, 11113} -- Fireball, Scorch, Fireblast, Flamestrike, Blast Wave + + for _, spellId in ipairs(fire_spells) do + local spellName = GetSpellInfo(spellId) + if not lib.indirectRefreshSpells[spellName] then + lib.indirectRefreshSpells[spellName] = {} + end + lib.indirectRefreshSpells[spellName][12654] = { + events = { + ["SPELL_DAMAGE"] = true + }, + -- targetSpellID = 12654, -- Ignite + rollbackMisses = true, + condition = function(isMine, isCrit) return isCrit end, + customAction = function(srcGUID, dstGUID, spellID) + local lib = LibStub("LibClassicDurations") + local spellTable = lib:GetSpellTable(srcGUID, dstGUID, spellID) + if spellTable and not spellTable.tickExtended then + local igniteStartTime = spellTable[2] + spellTable[2] = igniteStartTime + 2 + spellTable.tickExtended = true + if lib.DEBUG_IGNITE then + print(GetTime(), "[Ignite] Extended", dstGUID, "New start time:", spellTable[2]) + end + end + end, + } + end + + + + lib.indirectRefreshSpells[GetSpellInfo(12654)] = CopyTable(lib.indirectRefreshSpells[GetSpellInfo(133)]) -- Just adding Ignite to indirectRefreshSpells table + lib.indirectRefreshSpells[GetSpellInfo(12654)][12654].events = {} end if class == "PRIEST" then -- Shadow Weaving lib.indirectRefreshSpells[GetSpellInfo(10894)] = { -- SW:Pain - events = { - ["SPELL_AURA_APPLIED"] = true, - ["SPELL_AURA_REFRESH"] = true, - }, - targetSpellID = 15258, -- Shadow Weaving - targetResistCheck = true, - condition = function(isMine) return isMine end, + [15258] = { + events = { + ["SPELL_AURA_APPLIED"] = true, + ["SPELL_AURA_REFRESH"] = true, + }, + -- targetSpellID = 15258, -- Shadow Weaving + -- targetResistCheck = true, + rollbackMisses = true, + condition = function(isMine) return isMine end, + } } lib.indirectRefreshSpells[GetSpellInfo(10947)] = { -- Mind Blast - events = { - ["SPELL_DAMAGE"] = true, - }, - targetSpellID = 15258, -- Shadow Weaving - targetResistCheck = true, - condition = function(isMine) return isMine end, + [15258] = { + events = { + ["SPELL_DAMAGE"] = true, + }, + -- targetResistCheck = true, + rollbackMisses = true, + condition = function(isMine) return isMine end, + } } lib.indirectRefreshSpells[GetSpellInfo(18807)] = { -- Mind Flay - events = { - ["SPELL_AURA_APPLIED"] = true, - ["SPELL_AURA_REFRESH"] = true, - }, - targetSpellID = 15258, -- Shadow Weaving - targetResistCheck = true, - condition = function(isMine) return isMine end, + [15258] = { + events = { + ["SPELL_AURA_APPLIED"] = true, + ["SPELL_AURA_REFRESH"] = true, + }, + rollbackMisses = true, + condition = function(isMine) return isMine end, + } } + + -- Shadow Weaving = SW: Pain + lib.indirectRefreshSpells[GetSpellInfo(15258)] = CopyTable(lib.indirectRefreshSpells[GetSpellInfo(10894)]) + lib.indirectRefreshSpells[GetSpellInfo(15258)][15258].events = {} end ------------------ -- GLOBAL ------------------ +Spell( 2479, { duration = 30 }) -- Honorless Target Spell(1604, { duration = 4 }) -- Common Daze Spell( 23605, { duration = 5 }) -- Nightfall (Axe) Proc Spell( 835, { duration = 3 }) -- Tidal Charm Spell( 11196, { duration = 60 }) -- Recently Bandaged +Spell( 16928, { duration = 45 }) -- Armor Shatter, procced by Annihilator, axe weapon Spell({ 13099, 13138, 16566 }, { duration = function(spellID) @@ -107,9 +205,9 @@ Spell( 23493, { duration = 10 }) -- Battleground heal buff Spell( 23505, { duration = 60 }) -- Battleground damage buff Spell({ 4068 }, { duration = 3 }) -- Iron Grenade Spell({ 19769 }, { duration = 3 }) -- Thorium Grenade -Spell( 6615, { duration = 30, type = "BUFF" }) -- Free Action Potion -Spell( 24364, { duration = 5, type = "BUFF" }) -- Living Action Potion -Spell( 3169, { duration = 6, type = "BUFF" }) -- Limited Invulnerability Potion +Spell( 6615, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Free Action Potion +Spell( 24364, { duration = 5, type = "BUFF", buffType = "Magic" }) -- Living Action Potion +Spell( 3169, { duration = 6, type = "BUFF", buffType = "Magic" }) -- Limited Invulnerability Potion Spell( 16621, { duration = 3, type = "BUFF" }) -- Invulnerable Mail Spell( 1090, { duration = 30 }) -- Magic Dust Spell( 13327, { duration = 30 }) -- Reckless Charge @@ -117,7 +215,7 @@ Spell({ 26740, 13181 }, { duration = 20 }) -- Mind Control Cap + Backfire Spell( 11359, { duration = 30, type = "BUFF" }) -- Restorative Potion Spell( 6727, { duration = 30 }) -- Violet Tragan Spell( 5024, { duration = 10, type = "BUFF" }) -- Skull of Impending Doom -Spell( 2379, { duration = 15, type = "BUFF" }) -- Swiftness Potion +Spell( 2379, { duration = 15, type = "BUFF", buffType = "Magic" }) -- Swiftness Potion Spell( 5134, { duration = 10 }) -- Flash Bomb Spell( 23097, { duration = 5, type = "BUFF" }) -- Fire Reflector Spell( 23131, { duration = 5, type = "BUFF" }) -- Frost Reflector @@ -130,11 +228,15 @@ Spell( 12733, { duration = 30, type = "BUFF" }) -- Blacksmith trinket -- Spell( 15752, { duration = 10 }) -- Linken's Boomerang disarm Spell( 14530, { duration = 10, type = "BUFF" }) -- Nifty Stopwatch Spell( 13237, { duration = 3 }) -- Goblin Mortar trinket +Spell( 21152, { duration = 3 }) -- Earthshaker, weapon proc Spell( 14253, { duration = 8, type = "BUFF" }) -- Black Husk Shield Spell( 9175, { duration = 15, type = "BUFF" }) -- Swift Boots Spell( 13141, { duration = 20, type = "BUFF" }) -- Gnomish Rocket Boots Spell( 8892, { duration = 20, type = "BUFF" }) -- Goblin Rocket Boots Spell( 9774, { duration = 5, type = "BUFF" }) -- Spider Belt & Ornate Mithril Boots +Spell({ 746, 1159, 3267, 3268, 7926, 7927, 10838, 10839, 18608, 18610, 23567, 23568, 23569, 23696, 24412, 24413, 24414}, { duration = 8, type = "BUFF" }) -- First Aid +Spell({ 21992, 27648 }, { duration = 12 }) -- Thunderfury, -Nature Resist, -Atk Spd + ------------- -- RACIALS @@ -153,7 +255,7 @@ Spell( 7744, { duration = 5, type = "BUFF" }) -- Will of the Forsaken ------------- Spell( 15473, { duration = INFINITY, type = "BUFF" }) -- Shadowform -Spell( 14751, { duration = INFINITY, type = "BUFF" }) -- Inner focus +Spell( 14751, { duration = INFINITY, type = "BUFF", buffType = "Magic" }) -- Inner focus -- Why long auras are disabled -- When you first get in combat log range with a player, @@ -162,16 +264,16 @@ Spell( 14751, { duration = INFINITY, type = "BUFF" }) -- Inner focus -- Long raid buffs now have cast filter, that is only if you directly casted a spell it'll register -- Cast Filter is ignored for enemies, so some personal buffs have it to still show enemy buffs -Spell({ 1243, 1244, 1245, 2791, 10937, 10938 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Power Word: Fortitude -Spell({ 21562, 21564 }, { duration = 3600, type = "BUFF", castFilter = true }) -- Prayer of Fortitude -Spell({ 976, 10957, 10958 }, { duration = 600, type = "BUFF", castFilter = true }) -- Shadow Protection -Spell( 27683, { duration = 600, type = "BUFF", castFilter = true }) -- Prayer of Shadow Protection -Spell({ 14752, 14818, 14819, 27841 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Divine Spirit -Spell( 27681, { duration = 3600, type = "BUFF", castFilter = true }) -- Prayer of Spirit +Spell({ 1243, 1244, 1245, 2791, 10937, 10938 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Power Word: Fortitude +Spell({ 21562, 21564 }, { duration = 3600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Prayer of Fortitude +Spell({ 976, 10957, 10958 }, { duration = 600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Shadow Protection +Spell( 27683, { duration = 1200, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Prayer of Shadow Protection +Spell({ 14752, 14818, 14819, 27841 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Divine Spirit +Spell( 27681, { duration = 3600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Prayer of Spirit -Spell({ 588, 602, 1006, 7128, 10951, 10952 }, { duration = 600, type = "BUFF", castFilter = true }) -- Inner Fire +Spell({ 588, 602, 1006, 7128, 10951, 10952 }, { duration = 600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Inner Fire -Spell({ 14743, 27828 }, { duration = 6, type = "BUFF" }) -- Focused Casting (Martyrdom) +Spell({ 14743, 27828 }, { duration = 6, type = "BUFF", buffType = "Magic" }) -- Focused Casting (Martyrdom) Spell( 27827, { duration = 10, type = "BUFF" }) -- Spirit of Redemption Spell( 15271, { duration = 15, type = "BUFF" }) -- Spirit Tap @@ -180,12 +282,25 @@ Spell({ 13896, 19271, 19273, 19274, 19275 }, { duration = 15, type = "BUFF" }) - Spell({ 2651, 19289, 19291, 19292, 19293 }, { duration = 15, type = "BUFF" }) -- Elune's Grace Spell({ 9035, 19281, 19282, 19283, 19284, 19285 }, { duration = 120 }) -- Hex of Weakness -Spell( 6346, { duration = 600, type = "BUFF" }) -- Fear Ward -Spell({ 7001, 27873, 27874 }, { duration = 10, type = "BUFF" }) -- Lightwell Renew -Spell( 552, { duration = 20, type = "BUFF" }) -- Abolish Disease -Spell({ 17, 592, 600, 3747, 6065, 6066, 10898, 10899, 10900, 10901 }, {duration = 30, type = "BUFF" }) -- PWS +Spell( 6346, { duration = 600, type = "BUFF", buffType = "Magic" }) -- Fear Ward +Spell({ 14893, 15357 ,15359 }, { duration = 15, type = "BUFF", buffType = "Magic" }) -- Inspiration +Spell({ 7001, 27873, 27874 }, { duration = 10, type = "BUFF", buffType = "Magic" }) -- Lightwell Renew +Spell( 552, { duration = 20, type = "BUFF", buffType = "Magic" }) -- Abolish Disease +Spell({ 17, 592, 600, 3747, 6065, 6066, 10898, 10899, 10900, 10901 }, {duration = 30, type = "BUFF", buffType = "Magic" }) -- PWS Spell( 6788, { duration = 15 }) -- Weakened Soul -Spell({ 139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315 }, { duration = 15, type = "BUFF" }) -- Renew +if class == "PRIEST" then + lib:TrackItemSet("Garments of the Oracle", { 21349, 21350, 21348, 21352, 21351 }) + lib:RegisterSetBonusCallback("Garments of the Oracle", 5) +end +Spell({ 139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315 }, { + duration = function(spellID, isSrcPlayer) + if isSrcPlayer and lib:IsSetBonusActive("Garments of the Oracle", 5) then + return 18 + else + return 15 + end + end, + type = "BUFF", buffType = "Magic" }) -- Renew Spell( 15487, { duration = 5 }) -- Silence Spell({ 10797, 19296, 19299, 19302, 19303, 19304, 19305 }, { duration = 6, stacking = true }) -- starshards @@ -200,10 +315,28 @@ Spell({ 9484, 9485, 10955 }, { end }) -- Shackle Undead -Spell( 10060, { duration = 15, type = "BUFF" }) --Power Infusion +Spell( 10060, { duration = 15, type = "BUFF", buffType = "Magic" }) --Power Infusion Spell({ 14914, 15261, 15262, 15263, 15264, 15265, 15266, 15267 }, { duration = 10, stacking = true }) -- Holy Fire, stacking? Spell({ 586, 9578, 9579, 9592, 10941, 10942 }, { duration = 10, type = "BUFF" }) -- Fade -Spell({ 8122, 8124, 10888, 10890 }, { duration = 8, }) -- Psychic Scream +if class == "PRIEST" then + lib:TrackItemSet("PriestPvPSet", { + 17604, 17603, 17605, 17608, 17607, 17602, + 17623, 17625, 17622, 17624, 17618, 17620, + 22869, 22859, 22882, 22885, 23261, 23262, + 23302, 23303, 23288, 23289, 23316, 23317, + }) + lib:RegisterSetBonusCallback("PriestPvPSet", 3) +end +Spell({ 8122, 8124, 10888, 10890 }, { + duration = function(spellID, isSrcPlayer) + if isSrcPlayer then + local pvpSetBonus = lib:IsSetBonusActive("PriestPvPSet", 3) and 1 or 0 + return 8 + pvpSetBonus + else + return 8 + end + end +}) -- Psychic Scream Spell({ 589, 594, 970, 992, 2767, 10892, 10893, 10894 }, { stacking = true, duration = function(spellID, isSrcPlayer) -- Improved SWP, 2 ranks: Increases the duration of your Shadow Word: Pain spell by 3 sec. @@ -240,23 +373,25 @@ Spell( 5487, { duration = INFINITY, type = "BUFF" }) -- Bear Form Spell( 9634, { duration = INFINITY, type = "BUFF" }) -- Dire Bear Form Spell( 1066, { duration = INFINITY, type = "BUFF" }) -- Aquatic Form Spell( 24858, { duration = INFINITY, type = "BUFF" }) -- Moonkin Form -Spell( 17116, { duration = INFINITY, type = "BUFF" }) -- Nature's Swiftness +Spell( 24932, { duration = INFINITY, type = "BUFF" }) -- Leader of the Pack +Spell( 17116, { duration = INFINITY, type = "BUFF", buffType = "Magic" }) -- Nature's Swiftness -Spell({ 1126, 5232, 5234, 6756, 8907, 9884, 9885 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Mark of the Wild -Spell({ 21849, 21850 }, { duration = 3600, type = "BUFF", castFilter = true }) -- Gift of the Wild -Spell( 19975, { duration = 12 }) -- Nature's Grasp root -Spell({ 16689, 16810, 16811, 16812, 16813, 17329 }, { duration = 45, type = "BUFF" }) -- Nature's Grasp -Spell( 16864, { duration = 600, type = "BUFF", castFilter = true }) -- Omen of Clarity -Spell( 16870, { duration = 15, type = "BUFF" }) -- Clearcasting from OoC +Spell({ 1126, 5232, 5234, 6756, 8907, 9884, 9885 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Mark of the Wild +Spell({ 21849, 21850 }, { duration = 3600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Gift of the Wild +Spell( 19975, { duration = 12, buffType = "Magic" }) -- Nature's Grasp root +Spell({ 16689, 16810, 16811, 16812, 16813, 17329 }, { duration = 45, type = "BUFF", buffType = "Magic" }) -- Nature's Grasp +Spell( 16864, { duration = 600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Omen of Clarity +Spell( 16870, { duration = 15, type = "BUFF", buffType = "Magic" }) -- Clearcasting from OoC Spell( 19675, { duration = 4 }) -- Feral Charge -Spell({ 467, 782, 1075, 8914, 9756, 9910 }, { duration = 600, type = "BUFF" }) -- Thorns -Spell( 22812 ,{ duration = 15, type = "BUFF" }) -- Barkskin +Spell({ 467, 782, 1075, 8914, 9756, 9910 }, { duration = 600, type = "BUFF", buffType = "Magic" }) -- Thorns +Spell( 22812 ,{ duration = 15, type = "BUFF", buffType = "Magic" }) -- Barkskin --SKIPPING: Hurricane (Channeled) Spell({ 339, 1062, 5195, 5196, 9852, 9853 }, { pvpduration = 20, + buffType = "Magic", duration = function(spellID) if spellID == 339 then return 12 elseif spellID == 1062 then return 15 @@ -301,7 +436,7 @@ Spell({ 9005, 9823, 9827 }, { -- Pounce stun doesn't create a debuff icon, so th end }) -- Pounce Spell({ 9007, 9824, 9826 }, { duration = 18, stacking = true, }) -- Pounce Bleed -Spell({ 8921, 8924, 8925, 8926, 8927, 8928, 8929, 9833, 9834, 9835 }, { +Spell({ 8921, 8924, 8925, 8926, 8927, 8928, 8929, 9833, 9834, 9835 }, { stacking = true, duration = function(spellID) if spellID == 8921 then return 9 else return 12 end @@ -311,11 +446,24 @@ Spell({ 1822, 1823, 1824, 9904 }, { duration = 9, stacking = true }) -- Rake Spell({ 1079, 9492, 9493, 9752, 9894, 9896 }, { duration = 12, stacking = true }) -- Rip Spell({ 5217, 6793, 9845, 9846 }, { name = "Tiger's Fury", duration = 6 }) -Spell( 2893 ,{ duration = 8, type = "BUFF" }) -- Abolish Poison -Spell( 29166 , { duration = 20, type = "BUFF" }) -- Innervate +Spell( 2893 ,{ duration = 8, type = "BUFF", buffType = "Magic" }) -- Abolish Poison +Spell( 29166 , { duration = 20, type = "BUFF", buffType = "Magic" }) -- Innervate -Spell({ 8936, 8938, 8939, 8940, 8941, 9750, 9856, 9857, 9858 }, { duration = 21, type = "BUFF" }) -- Regrowth -Spell({ 774, 1058, 1430, 2090, 2091, 3627, 8910, 9839, 9840, 9841, 25299 }, { duration = 12, stacking = false, type = "BUFF" }) -- Rejuv +Spell({ 8936, 8938, 8939, 8940, 8941, 9750, 9856, 9857, 9858 }, { duration = 21, type = "BUFF", buffType = "Magic" }) -- Regrowth + +if class == "DRUID" then + lib:TrackItemSet("StormrageRaiment", { 16899, 16900, 16901, 16902, 16903, 16904, 16897, 16898, }) + lib:RegisterSetBonusCallback("StormrageRaiment", 8) +end +Spell({ 774, 1058, 1430, 2090, 2091, 3627, 8910, 9839, 9840, 9841, 25299 }, { + duration = function(spellID, isSrcPlayer) + if isSrcPlayer and lib:IsSetBonusActive("StormrageRaiment", 8) then + return 15 + else + return 12 + end + end, + stacking = false, type = "BUFF", buffType = "Magic" }) -- Rejuv Spell({ 5570, 24974, 24975, 24976, 24977 }, { duration = 12, stacking = true }) -- Insect Swarm ------------- @@ -326,7 +474,7 @@ Spell( 2457 , { duration = INFINITY, type = "BUFF" }) -- Battle Stance Spell( 2458 , { duration = INFINITY, type = "BUFF" }) -- Berserker Stance Spell( 71 , { duration = INFINITY, type = "BUFF" }) -- Def Stance -Spell( 12294, { duration = 10 }) -- Mortal Strike Healing Reduction +Spell({ 12294, 21551, 21552, 21553 }, { duration = 10 }) -- Mortal Strike Healing Reduction Spell({72, 1671, 1672}, { duration = 6 }) -- Shield Bash Spell( 18498, { duration = 3 }) -- Improved Shield Bash @@ -345,7 +493,9 @@ Spell({ 772, 6546, 6547, 6548, 11572, 11573, 11574 }, { stacking = true, else return 21 end end }) -- Rend +if locale ~= "ruRU" or class ~= "DRUID" then Spell( 12721, { duration = 12, stacking = true }) -- Deep Wounds +end Spell({ 1715, 7372, 7373 }, { duration = 15 }) -- Hamstring Spell( 23694 , { duration = 5 }) -- Improved Hamstring @@ -396,6 +546,7 @@ Spell( 12292 ,{ duration = 20, type = "BUFF" }) -- Sweeping Strikes Spell({ 12880, 14201, 14202, 14203, 14204 }, { duration = 12, type = "BUFF" }) -- Enrage Spell({ 12966, 12967, 12968, 12969, 12970 }, { duration = 15, type = "BUFF" }) -- Flurry Spell({ 16488, 16490, 16491 }, { duration = 6, type = "BUFF" }) -- Blood Craze +Spell({ 23885, 23886, 23887, 23888 }, { duration = 6, type = "BUFF" }) -- Bloodthirst Spell(7922, { duration = 1 }) -- Charge Spell(5530, { duration = 3 }) -- Mace Specialization @@ -457,7 +608,8 @@ Spell({ 1943, 8639, 8640, 11273, 11274, 11275 }, { stacking = true, end end }) -- Rupture --- SnD -- player-only, can skip + +Spell({ 5171, 6774 }, { duration = nil, type = "BUFF" }) -- SnD, to prevent fallback to incorrect db values Spell({ 2983, 8696, 11305 }, { duration = 15, type = "BUFF" }) -- Sprint Spell( 5277 ,{ duration = 15, type = "BUFF" }) -- Evasion @@ -478,8 +630,12 @@ Spell( 14251 , { duration = 6 }) -- Riposte (disarm) ------------ Spell({ 20707, 20762, 20763, 20764, 20765 }, { duration = 1800, type = "BUFF" }) -- Soulstone Resurrection -Spell({ 687, 696, 706, 1086, 11733, 11734, 11735 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Demon SKin/Armor --- Spell({ 18791, 18789, 18792, 18790 }, { duration = 1800, type = "BUFF" }) -- Touch of Shadow, Burning Wish, Fel Energy, Fel Stamina +Spell({ 687, 696 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Demon SKin +Spell({ 706, 1086, 11733, 11734, 11735 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Demon Armor +Spell({ 18791 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Touch of Shadow +Spell({ 18789 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Burning Wish +Spell({ 18792 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Fel Energy +Spell({ 18790 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Fel Stamina --SKIPPING: Drain Life, Mana, Soul, Enslave, Health funnel, kilrog Spell( 24259 ,{ duration = 3 }) -- Spell Lock Silence @@ -487,8 +643,10 @@ Spell({ 17767, 17850, 17851, 17852, 17853, 17854 }, { duration = 10 }) -- Consum Spell( 18118, { duration = 5 }) -- Aftermath Proc Spell({ 132, 2970, 11743 }, { duration = 600 }) -- Detect Invisibility Spell( 5697, { duration = 600 }) -- Unending Breath --- Spell({ 17794, 17798, 17797, 17799, 17800 }, { duration = 12 }) -- Shadow Vulnerability (Imp Shadow Bolt) --- SKIPPING: Amplify Curse +if class == "WARLOCK" then + Spell({ 17794, 17798, 17797, 17799, 17800 }, { duration = 12 }) -- Shadow Vulnerability (Imp Shadow Bolt) +end +Spell({ 18288 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Amplify Curse Spell({ 1714, 11719 }, { duration = 30 }) -- Curse of Tongues Spell({ 702, 1108, 6205, 7646, 11707, 11708 },{ duration = 120 }) -- Curse of Weakness Spell({ 17862, 17937 }, { duration = 300 }) -- Curse of Shadows @@ -497,7 +655,6 @@ Spell({ 704, 7658, 7659, 11717 }, { duration = 120 }) -- Curse of Recklessness Spell( 603 ,{ duration = 60, stacking = true }) -- Curse of Doom Spell( 18223 ,{ duration = 12 }) -- Curse of Exhaustion Spell( 6358, { - pvpduration = 20, duration = function(spellID, isSrcPlayer) if isSrcPlayer then local mul = 1 + Talent(18754, 18755, 18756)*0.1 @@ -527,7 +684,11 @@ Spell({ 710, 18647 }, { end }) -- Banish Spell({ 6789, 17925, 17926 }, { duration = 3 }) -- Death Coil - +Spell({ 6307, 7804, 7805, 11766, 11767 }, { duration = INFINITY }) -- Blood Pact +Spell({ 18708 }, { duration = 15, type = "BUFF", buffType = "Magic" }) -- Fel Domination +Spell({ 19480 }, { duration = INFINITY }) -- Paranoia +Spell({ 25228 }, { duration = INFINITY, type = "BUFF", buffType = "Magic" }) -- Soul Link +Spell({ 23829 }, { duration = INFINITY, type = "BUFF" }) -- Master Demonologist Spell({ 18265, 18879, 18880, 18881}, { duration = 30, stacking = true }) -- Siphon Life if locale ~= "zhCN" or class ~= "MAGE" then @@ -547,8 +708,8 @@ Spell({ 172, 6222, 6223, 7648, 11671, 11672, 25311 }, { stacking = true, }) Spell({ 348, 707, 1094, 2941, 11665, 11667, 11668, 25309 },{ duration = 15, stacking = true }) -- Immolate -Spell({ 6229, 11739, 11740, 28610 } ,{ duration = 30, type = "BUFF" }) -- Shadow Ward -Spell({ 7812, 19438, 19440, 19441, 19442, 19443 }, { duration = 30, type = "BUFF" }) -- Sacrifice +Spell({ 6229, 11739, 11740, 28610 } ,{ duration = 30, type = "BUFF", buffType = "Magic" }) -- Shadow Ward +Spell({ 7812, 19438, 19440, 19441, 19442, 19443 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Sacrifice Spell({ 17877, 18867, 18868, 18869, 18870, 18871 }, { duration = 5 }) -- Shadowburn Debuff Spell( 18093 ,{ duration = 3 }) -- Pyroclasm @@ -566,23 +727,23 @@ Spell({ 8076, 8162, 8163, 10441, 25362 }, { duration = INFINITY, type = "BUFF" } Spell({ 8836, 10626, 25360 }, { duration = INFINITY, type = "BUFF" }) -- Grace of Air Totem Spell({ 8072, 8156, 8157, 10403, 10404, 10405 }, { duration = INFINITY, type = "BUFF" }) -- Stoneskin Totem Spell({ 16191, 17355, 17360 }, { duration = 12, type = "BUFF" }) -- Mana Tide Totem - +Spell( 16166, { duration = INFINITY, type = "BUFF" }) -- Elemental Mastery Spell( 8178 ,{ duration = 45, type = "BUFF" }) -- Grounding Totem Effect, no duration, but lasts 45s. Keeping for enemy buffs -- Using Druid's NS -- Spell( 16188, { duration = INFINITY, type = "BUFF" }) -- Nature's Swiftness -Spell({ 324, 325, 905, 945, 8134, 10431, 10432 }, { duration = 600, type = "BUFF" }) -- Lightning Shield -Spell( 546 ,{ duration = 600, type = "BUFF" }) -- Water Walkign -Spell( 131 ,{ duration = 600, type = "BUFF" }) -- Water Breahing +Spell({ 324, 325, 905, 945, 8134, 10431, 10432 }, { duration = 600, type = "BUFF", buffType = "Magic" }) -- Lightning Shield +Spell( 546 ,{ duration = 600, type = "BUFF", buffType = "Magic" }) -- Water Walking +Spell( 131 ,{ duration = 600, type = "BUFF", buffType = "Magic" }) -- Water Breahing Spell({ 16257, 16277, 16278, 16279, 16280 }, { duration = 15, type = "BUFF" }) -- Flurry Spell( 17364 ,{ duration = 12 }) -- Stormstrike -Spell({ 16177, 16236, 16237 }, { duration = 15, type = "BUFF" }) -- Ancestral Fortitude from Ancestral Healing +Spell({ 16177, 16236, 16237 }, { duration = 15, type = "BUFF", buffType = "Magic" }) -- Ancestral Fortitude from Ancestral Healing Spell({ 8056, 8058, 10472, 10473 }, { duration = 8 }) -- Frost Shock Spell({ 8050, 8052, 8053, 10447, 10448, 29228 }, { duration = 12, stacking = true }) -- Flame Shock -Spell( 29203 ,{ duration = 15, type = "BUFF" }) -- Healing Way +Spell( 29203 ,{ duration = 15, type = "BUFF", buffType = "Magic" }) -- Healing Way Spell({ 8034, 8037, 10458, 16352, 16353 }, { duration = 8 }) -- Frostbrand Attack Spell( 3600 ,{ duration = 5 }) -- Earthbind Totem @@ -596,27 +757,28 @@ Spell({ 19891, 19899, 19900 }, { duration = INFINITY, type = "BUFF" }) -- Fire R Spell({ 19888, 19897, 19898 }, { duration = INFINITY, type = "BUFF" }) -- Frost Resistance Aura Spell({ 19876, 19895, 19896 }, { duration = INFINITY, type = "BUFF" }) -- Shadow Resistance Aura Spell({ 7294, 10298, 10299, 10300, 10301 }, { duration = INFINITY, type = "BUFF" }) -- Retribution Aura +Spell({ 20218 }, { duration = INFINITY, type = "BUFF" }) -- Sanctity Aura -Spell( 25780, { duration = 1800, type = "BUFF" }) -- Righteous Fury +Spell( 25780, { duration = 1800, type = "BUFF", buffType = "Magic" }) -- Righteous Fury -Spell({ 19740, 19834, 19835, 19836, 19837, 19838, 25291 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Might -Spell({ 25782, 25916 }, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Might +Spell({ 19740, 19834, 19835, 19836, 19837, 19838, 25291 }, { duration = 300, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Blessing of Might +Spell({ 25782, 25916 }, { duration = 900, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Greater Blessing of Might -Spell({ 19742, 19850, 19852, 19853, 19854, 25290 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Wisdom -Spell({ 25894, 25918 }, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Might +Spell({ 19742, 19850, 19852, 19853, 19854, 25290 }, { duration = 300, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Blessing of Wisdom +Spell({ 25894, 25918 }, { duration = 900, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Greater Blessing of Might -Spell(20217, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Kings -Spell(25898, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Kings +Spell(20217, { duration = 300, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Blessing of Kings +Spell(25898, { duration = 900, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Greater Blessing of Kings -Spell({ 20911, 20912, 20913 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Sanctuary -Spell(25899, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Sanctuary +Spell({ 20911, 20912, 20913 }, { duration = 300, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Blessing of Sanctuary +Spell(25899, { duration = 900, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Greater Blessing of Sanctuary -Spell(1038, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Salvation -Spell(25895, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Salvation +Spell(1038, { duration = 300, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Blessing of Salvation +Spell(25895, { duration = 900, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Greater Blessing of Salvation -Spell({ 19977, 19978, 19979 }, { duration = 300, type = "BUFF", castFilter = true }) -- Blessing of Light -Spell(25890, { duration = 900, type = "BUFF", castFilter = true }) -- Greater Blessing of Light +Spell({ 19977, 19978, 19979 }, { duration = 300, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Blessing of Light +Spell(25890, { duration = 900, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Greater Blessing of Light Spell( 20066, { duration = 6 }) -- Repentance Spell({ 2878, 5627, 5627 }, { @@ -627,9 +789,15 @@ Spell({ 2878, 5627, 5627 }, { end }) -- Turn Undead -Spell( 1044, { duration = 10, type = "BUFF" }) -- Blessing of Freedom -Spell({ 6940, 20729 }, { duration = 30, type = "BUFF" }) -- Blessing of Sacrifice +Spell( 1044, { + duration = function(spellID, isSrcPlayer) + local talents = 0 + if isSrcPlayer then talents = 3*Talent(20174, 20175) end + return 10 + talents + end, type = "BUFF", buffType = "Magic" }) -- Blessing of Freedom +Spell({ 6940, 20729 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Blessing of Sacrifice Spell({ 1022, 5599, 10278 }, { type = "BUFF", + buffType = "Magic", duration = function(spellID) if spellID == 1022 then return 6 elseif spellID == 5599 then return 8 @@ -647,12 +815,12 @@ Spell({ 642, 1020 }, { type = "BUFF", return spellID == 642 and 10 or 12 end }) -- Divine Shield -Spell({ 20375, 20915, 20918, 20919, 20920 }, { duration = 30, type = "BUFF" }) -- Seal of Command -Spell({ 21084, 20287, 20288, 20289, 20290, 20291, 20292, 20293 }, { duration = 30, type = "BUFF"}) -- Seal of Righteousness -Spell({ 20162, 20305, 20306, 20307, 20308, 21082 }, { duration = 30, type = "BUFF" }) -- Seal of the Crusader -Spell({ 20165, 20347, 20348, 20349 }, { duration = 30, type = "BUFF" }) -- Seal of Light -Spell({ 20166, 20356, 20357 }, { duration = 30, type = "BUFF" }) -- Seal of Wisdom -Spell( 20164 , { duration = 30, type = "BUFF" }) -- Seal of Justice +Spell({ 20375, 20915, 20918, 20919, 20920 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Seal of Command +Spell({ 21084, 20287, 20288, 20289, 20290, 20291, 20292, 20293 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Seal of Righteousness +Spell({ 20162, 20305, 20306, 20307, 20308, 21082 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Seal of the Crusader +Spell({ 20165, 20347, 20348, 20349 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Seal of Light +Spell({ 20166, 20356, 20357 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Seal of Wisdom +Spell( 20164 , { duration = 30, type = "BUFF", buffType = "Magic" }) -- Seal of Justice Spell({ 21183, 20188, 20300, 20301, 20302, 20303 }, { duration = 10 }) -- Judgement of the Crusader Spell({ 20185, 20344, 20345, 20346 }, { @@ -686,10 +854,10 @@ Spell({ 853, 5588, 5589, 10308 }, { end }) -- Hammer of Justice -Spell({ 20925, 20927, 20928 }, { duration = 10, type = "BUFF" }) -- Holy Shield -Spell({ 20128, 20131, 20132, 20133, 20134 }, { duration = 10, type = "BUFF" }) -- Holy Shield -Spell({ 67, 26017, 26018 }, { duration = 10, type = "BUFF" }) -- Vindication -Spell({ 20050, 20052, 20053, 20054, 20055 }, { duration = 8, type = "BUFF" }) -- Vengeance +Spell({ 20925, 20927, 20928 }, { duration = 10, type = "BUFF", buffType = "Magic" }) -- Holy Shield +Spell({ 20128, 20131, 20132, 20133, 20134 }, { duration = 10, type = "BUFF" }) -- Redoubt +Spell({ 67, 26017, 26018 }, { duration = 10, type = "BUFF", buffType = "Magic" }) -- Vindication +Spell({ 20050, 20052, 20053, 20054, 20055 }, { duration = 8, type = "BUFF", buffType = "Magic" }) -- Vengeance Spell( 20170 ,{ duration = 2 }) -- Seal of Justice stun ------------- @@ -703,9 +871,10 @@ Spell( 13163, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Monkey Spell({ 20043, 20190 }, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Wild Spell({ 13165, 14318, 14319, 14320, 14321, 14322, 25296 }, { duration = INFINITY, type = "BUFF" }) -- Aspect of the Hawk Spell( 5384, { duration = INFINITY, type = "BUFF" }) -- Feign Death (Will it work?) +Spell({ 19579, 24529 }, { duration = INFINITY, type = "BUFF" }) -- Spirit Bond Spell({ 19506, 20905, 20906 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Trueshot Aura ---SKIPPING: Frenzy +Spell(19615, { duration = 8, type = "BUFF" }) -- Frenzy Spell({ 1130, 14323, 14324, 14325 }, { duration = 120 }) -- Hunter's Mark Spell(19263, { duration = 10, type = "BUFF" }) -- Deterrence Spell(3045, { duration = 15, type = "BUFF" }) -- Rapid Fire @@ -748,22 +917,25 @@ Spell(24394, { duration = 3 }) -- Intimidation -- Spell(15571, { duration = 4 }) -- Daze from Aspect Spell(19185, { duration = 5 }) -- Entrapment Spell(25999, { duration = 1 }) -- Boar Charge +Spell({ 23099, 23109, 23110 } , { duration = 15 }) -- Dash Spell(1002, { duration = 60 }) -- Eye of the Beast Spell(1539, { duration = 20 }) -- Feed Pet Effect +Spell({ 136, 3111, 3661, 3662, 13542, 13543, 13544 }, { duration = 5, type = "BUFF" }) -- Mend Pet ------------- -- MAGE ------------- -Spell( 12043, { duration = INFINITY, type = "BUFF" }) -- Presence of Mind +Spell( 12043, { duration = INFINITY, type = "BUFF", buffType = "Magic" }) -- Presence of Mind -Spell({ 1459, 1460, 1461, 10156, 10157 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Arcane Intellect -Spell( 23028, { duration = 3600, type = "BUFF", castFilter = true }) -- Arcane Brilliance -Spell({ 6117, 22782, 22783 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Mage Armor -Spell({ 168, 7300, 7301, 7302, 7320, 10219, 10220 }, { duration = 1800, type = "BUFF", castFilter = true }) -- Frost/Ice Armor +Spell({ 1459, 1460, 1461, 10156, 10157 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Arcane Intellect +Spell( 23028, { duration = 3600, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Arcane Brilliance +Spell({ 6117, 22782, 22783 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Mage Armor +Spell({ 168, 7300, 7301 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Frost Armor +Spell({ 7302, 7320, 10219, 10220 }, { duration = 1800, type = "BUFF", castFilter = true, buffType = "Magic" }) -- Ice Armor -Spell( 2855, { duration = 1800, type = "BUFF" }) -- Detect Magic -Spell( 130, { duration = 1800, type = "BUFF" }) -- Slow Fall +Spell( 2855, { duration = 120, type = "BUFF", buffType = "Magic" }) -- Detect Magic +Spell( 130, { duration = 1800, type = "BUFF", buffType = "Magic" }) -- Slow Fall Spell({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306 }, { stacking = true, @@ -776,8 +948,8 @@ Spell({ 133, 143, 145, 3140, 8400, 8401, 8402, 10148, 10149, 10150, 10151, 25306 }) -- Fireball Spell({ 11366, 12505, 12522, 12523, 12524, 12525, 12526, 18809 }, { duration = 12, stacking = true }) -- Pyroblast -Spell({ 604, 8450, 8451, 10173, 10174 }, { duration = 600, type = "BUFF" }) -- Dampen Magic -Spell({ 1008, 8455, 10169, 10170 }, { duration = 600, type = "BUFF" }) -- Amplify Magic +Spell({ 604, 8450, 8451, 10173, 10174 }, { duration = 600, type = "BUFF", buffType = "Magic" }) -- Dampen Magic +Spell({ 1008, 8455, 10169, 10170 }, { duration = 600, type = "BUFF", buffType = "Magic" }) -- Amplify Magic Spell(18469, { duration = 4 }) -- Imp CS Silence Spell({ 118, 12824, 12825, 12826, 28270, 28271, 28272 }, { @@ -790,13 +962,14 @@ Spell({ 118, 12824, 12825, 12826, 28270, 28271, 28272 }, { end }) -- Polymorph Spell(11958, { duration = 10, type = "BUFF" }) -- Ice Block -Spell({ 1463, 8494, 8495, 10191, 10192, 10193 }, { duration = 60, type = "BUFF" }) -- Mana Shield -Spell({ 11426, 13031, 13032, 13033 }, { duration = 60, type = "BUFF" }) -- Ice Barrier -Spell({ 543, 8457, 8458, 10223, 10225 }, { duration = 30, type = "BUFF" }) -- Fire Ward -Spell({ 6143, 8461, 8462, 10177, 28609 }, { duration = 30, type = "BUFF" }) -- Frost Ward +Spell({ 1463, 8494, 8495, 10191, 10192, 10193 }, { duration = 60, type = "BUFF", buffType = "Magic" }) -- Mana Shield +Spell({ 11426, 13031, 13032, 13033 }, { duration = 60, type = "BUFF", buffType = "Magic" }) -- Ice Barrier +Spell({ 543, 8457, 8458, 10223, 10225 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Fire Ward +Spell({ 6143, 8461, 8462, 10177, 28609 }, { duration = 30, type = "BUFF", buffType = "Magic" }) -- Frost Ward Spell(12355, { duration = 2 }) -- Impact -Spell(12654, { duration = 4 }) -- Ignite +lib.spellNameToID[GetSpellInfo(12654)] = 12654 +-- Spell(12654, { duration = 4 }) -- Ignite if class == "MAGE" then Spell(22959, { @@ -809,6 +982,17 @@ Spell(22959, { end }) -- Fire Vulnerability end +if class == "MAGE" then +Spell(12579, { + duration = function(spellID, isSrcPlayer) + if Talent(11180, 28592, 28593, 28594, 28595) > 0 then + return 15 + else + return nil + end + end }) -- Winter's Chill +end + Spell({ 11113, 13018, 13019, 13020, 13021 }, { duration = 6 }) -- Blast Wave Spell({ 2120, 2121, 8422, 8423, 10215, 10216 }, { duration = 8, stacking = true }) -- Flamestrike @@ -868,7 +1052,82 @@ Spell(12043, { duration = 15 }) -- Presence of Mind Spell(12042, { duration = 15 }) -- Arcane Power Spell(12051, { duration = 8, type = "BUFF" }) -- Evocation +------------- +-- MOUNTS +------------- + +Spell(17481, { duration = INFINITY, type = "BUFF" }) -- Deathcharger's Reins +Spell(24252, { duration = INFINITY, type = "BUFF" }) -- Swift Zulian Tiger +Spell(23509, { duration = INFINITY, type = "BUFF" }) -- Horn of the Frostwolf Howler +Spell(17229, { duration = INFINITY, type = "BUFF" }) -- Reins of the Winterspring Frostsaber +Spell(26656, { duration = INFINITY, type = "BUFF" }) -- Black Qiraji Resonating Crystal +Spell(24242, { duration = INFINITY, type = "BUFF" }) -- Swift Razzashi Raptor +Spell(23510, { duration = INFINITY, type = "BUFF" }) -- Stormpike Battle Charger +Spell(470, { duration = INFINITY, type = "BUFF" }) -- Black Stallion Bridle +Spell(22723, { duration = INFINITY, type = "BUFF" }) -- Reins of the Black War Tiger +Spell(472, { duration = INFINITY, type = "BUFF" }) -- Pinto Bridle +Spell(23221, { duration = INFINITY, type = "BUFF" }) -- Reins of the Swift Frostsaber +Spell(23227, { duration = INFINITY, type = "BUFF" }) -- Swift Palomino +Spell(23228, { duration = INFINITY, type = "BUFF" }) -- Swift White Steed +Spell(6648, { duration = INFINITY, type = "BUFF" }) -- Chestnut Mare Bridle +Spell(458, { duration = INFINITY, type = "BUFF" }) -- Brown Horse Bridle +Spell(23338, { duration = INFINITY, type = "BUFF" }) -- Reins of the Swift Stormsaber +Spell(23219, { duration = INFINITY, type = "BUFF" }) -- Reins of the Swift Mistsaber +Spell(22721, { duration = INFINITY, type = "BUFF" }) -- Whistle of the Black War Raptor +Spell(23229, { duration = INFINITY, type = "BUFF" }) -- Swift Brown Steed +Spell(22717, { duration = INFINITY, type = "BUFF" }) -- Black War Steed Bridle +Spell(10793, { duration = INFINITY, type = "BUFF" }) -- Reins of the Striped Nightsaber +Spell(22722, { duration = INFINITY, type = "BUFF" }) -- Red Skeletal Warhorse +Spell(18791, { duration = INFINITY, type = "BUFF" }) -- Purple Skeletal Warhorse +Spell(10789, { duration = INFINITY, type = "BUFF" }) -- Reins of the Spotted Frostsaber +Spell(18245, { duration = INFINITY, type = "BUFF" }) -- Horn of the Black War Wolf +Spell(6653, { duration = INFINITY, type = "BUFF" }) -- Horn of the Dire Wolf +Spell(23241, { duration = INFINITY, type = "BUFF" }) -- Swift Blue Raptor +Spell(8394, { duration = INFINITY, type = "BUFF" }) -- Reins of the Striped Frostsaber +Spell(23250, { duration = INFINITY, type = "BUFF" }) -- Horn of the Swift Brown Wolf +Spell(22718, { duration = INFINITY, type = "BUFF" }) -- Black War Kodo +Spell(580, { duration = INFINITY, type = "BUFF" }) -- Horn of the Timber Wolf +Spell(17463, { duration = INFINITY, type = "BUFF" }) -- Blue Skeletal Horse +Spell(23251, { duration = INFINITY, type = "BUFF" }) -- Horn of the Swift Timber Wolf +Spell(23243, { duration = INFINITY, type = "BUFF" }) -- Swift Orange Raptor +Spell(17465, { duration = INFINITY, type = "BUFF" }) -- Green Skeletal Warhorse +Spell(22720, { duration = INFINITY, type = "BUFF" }) -- Black War Ram +Spell(8395, { duration = INFINITY, type = "BUFF" }) -- Whistle of the Emerald Raptor +Spell(6654, { duration = INFINITY, type = "BUFF" }) -- Horn of the Brown Wolf +Spell(17462, { duration = INFINITY, type = "BUFF" }) -- Red Skeletal Horse +Spell(23240, { duration = INFINITY, type = "BUFF" }) -- Swift White Ram +Spell(23252, { duration = INFINITY, type = "BUFF" }) -- Horn of the Swift Gray Wolf +Spell(23247, { duration = INFINITY, type = "BUFF" }) -- Great White Kodo +Spell(23242, { duration = INFINITY, type = "BUFF" }) -- Swift Olive Raptor +Spell(23225, { duration = INFINITY, type = "BUFF" }) -- Swift Green Mechanostrider +Spell(10969, { duration = INFINITY, type = "BUFF" }) -- Blue Mechanostrider +Spell(10799, { duration = INFINITY, type = "BUFF" }) -- Whistle of the Violet Raptor +Spell(22719, { duration = INFINITY, type = "BUFF" }) -- Black Battlestrider +Spell(6898, { duration = INFINITY, type = "BUFF" }) -- White Ram +Spell(17464, { duration = INFINITY, type = "BUFF" }) -- Brown Skeletal Horse +Spell(17454, { duration = INFINITY, type = "BUFF" }) -- Unpainted Mechanostrider +Spell(23223, { duration = INFINITY, type = "BUFF" }) -- Swift White Mechanostrider +Spell(10796, { duration = INFINITY, type = "BUFF" }) -- Whistle of the Turquoise Raptor +Spell(23238, { duration = INFINITY, type = "BUFF" }) -- Swift Brown Ram +Spell(23239, { duration = INFINITY, type = "BUFF" }) -- Swift Gray Ram +Spell(6899, { duration = INFINITY, type = "BUFF" }) -- Brown Ram +Spell(6777, { duration = INFINITY, type = "BUFF" }) -- Gray Ram +Spell(10873, { duration = INFINITY, type = "BUFF" }) -- Red Mechanostrider +Spell(23249, { duration = INFINITY, type = "BUFF" }) -- Great Brown Kodo +Spell(18989, { duration = INFINITY, type = "BUFF" }) -- Gray Kodo +Spell(18990, { duration = INFINITY, type = "BUFF" }) -- Brown Kodo +Spell(23248, { duration = INFINITY, type = "BUFF" }) -- Great Gray Kodo +Spell(23222, { duration = INFINITY, type = "BUFF" }) -- Swift Yellow Mechanostrider +Spell(17453, { duration = INFINITY, type = "BUFF" }) -- Green Mechanostrider +Spell(23214, { duration = INFINITY, type = "BUFF" }) -- Summon Charger +Spell(13819, { duration = INFINITY, type = "BUFF" }) -- Summon Warhorse +Spell(23161, { duration = INFINITY, type = "BUFF" }) -- Summon Dreadsteed +Spell(5784, { duration = INFINITY, type = "BUFF" }) -- Summon Felsteed +------------- +-- ITEMS +------------- +Spell(17670, { duration = INFINITY, type = "BUFF" }) -- Argent Dawn Commission lib:SetDataVersion(Type, Version) diff --git a/libraries/LibClassicDurations/core.lua b/libraries/LibClassicDurations/core.lua old mode 100755 new mode 100644 index 8c4b84d..8e550dc --- a/libraries/LibClassicDurations/core.lua +++ b/libraries/LibClassicDurations/core.lua @@ -7,65 +7,19 @@ And additionally enemy buffs info. Usage example 1: ----------------- - -- Simply get the expiration time and duration + -- Using UnitAura wrapper + local UnitAura = _G.UnitAura - local LibClassicDurations = LibStub("LibClassicDurations") - LibClassicDurations:Register("YourAddon") -- tell library it's being used and should start working - - hooksecurefunc("CompactUnitFrame_UtilSetBuff", function(buffFrame, unit, index, filter) - local name, _, _, _, duration, expirationTime, unitCaster, _, _, spellId = UnitBuff(unit, index, filter); - - local durationNew, expirationTimeNew = LibClassicDurations:GetAuraDurationByUnit(unit, spellId, unitCaster) - if duration == 0 and durationNew then - duration = durationNew - expirationTime = expirationTimeNew - end - - local enabled = expirationTime and expirationTime ~= 0; - if enabled then - local startTime = expirationTime - duration; - CooldownFrame_Set(buffFrame.cooldown, startTime, duration, true); - else - CooldownFrame_Clear(buffFrame.cooldown); - end - end) - -Usage example 2: ------------------ - - -- Use library's UnitAura replacement function, that shows enemy buffs and - -- automatically tries to add duration to everything else - - local LCD = LibStub("LibClassicDurations") - LCD:Register("YourAddon") -- tell library it's being used and should start working - - local f = CreateFrame("frame", nil, UIParent) - f:RegisterUnitEvent("UNIT_AURA", "target") - - local EventHandler = function(self, event, unit) - for i=1,100 do - local name, _, _, _, duration, expirationTime, _, _, _, spellId = LCD:UnitAura(unit, i, "HELPFUL") - if not name then break end - print(name, duration, expirationTime) - end + local LibClassicDurations = LibStub("LibClassicDurations", true) + if LibClassicDurations then + LibClassicDurations:Register("YourAddon") + UnitAura = LibClassicDurations.UnitAuraWrapper end - f:SetScript("OnEvent", EventHandler) - - -- NOTE: Enemy buff tracking won't start until you register UNIT_BUFF - LCD.RegisterCallback(addon, "UNIT_BUFF", function(event, unit) - EventHandler(f, "UNIT_AURA", unit) - end) - - -- Optional: - LCD.RegisterCallback(addon, "UNIT_BUFF_GAINED", function(event, unit, spellID) - print("Gained", GetSpellInfo(spellID)) - end) - --]================] if WOW_PROJECT_ID ~= WOW_PROJECT_CLASSIC then return end -local MAJOR, MINOR = "LibClassicDurations", 34 +local MAJOR, MINOR = "LibClassicDurations", 64 local lib = LibStub:NewLibrary(MAJOR, MINOR) if not lib then return end @@ -90,8 +44,7 @@ local DRInfo = lib.DRInfo lib.buffCache = lib.buffCache or {} local buffCache = lib.buffCache -lib.buffCacheValid = lib.buffCacheValid or {} -local buffCacheValid = lib.buffCacheValid +local buffCacheValid = {} lib.nameplateUnitMap = lib.nameplateUnitMap or {} local nameplateUnitMap = lib.nameplateUnitMap @@ -113,6 +66,7 @@ local INFINITY = math.huge local PURGE_INTERVAL = 900 local PURGE_THRESHOLD = 1800 local UNKNOWN_AURA_DURATION = 3600 -- 60m +local BUFF_CACHE_EXPIRATION_TIME = 40 local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo local UnitGUID = UnitGUID @@ -122,7 +76,12 @@ local GetTime = GetTime local tinsert = table.insert local unpack = unpack local GetAuraDurationByUnitDirect -local enableEnemyBuffTracking = false +local GetGUIDAuraTime +local time = time + +if lib.enableEnemyBuffTracking == nil then lib.enableEnemyBuffTracking = false end +local enableEnemyBuffTracking = lib.enableEnemyBuffTracking + local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER f:SetScript("OnEvent", function(self, event, ...) @@ -219,12 +178,12 @@ end -- OLD GUIDs PURGE -------------------------- -local function purgeOldGUIDs() - local now = GetTime() +local function purgeOldGUIDsArgs(dataTable, accessTimes) + local now = time() local deleted = {} - for guid, lastAccessTime in pairs(guidAccessTimes) do + for guid, lastAccessTime in pairs(accessTimes) do if lastAccessTime + PURGE_THRESHOLD < now then - guids[guid] = nil + dataTable[guid] = nil nameplateUnitMap[guid] = nil buffCacheValid[guid] = nil buffCache[guid] = nil @@ -234,10 +193,59 @@ local function purgeOldGUIDs() end end for _, guid in ipairs(deleted) do - guidAccessTimes[guid] = nil + accessTimes[guid] = nil + end +end + +local function purgeOldGUIDs() + purgeOldGUIDsArgs(guids, guidAccessTimes) +end +if lib.purgeTicker then + lib.purgeTicker:Cancel() +end +lib.purgeTicker = C_Timer.NewTicker( PURGE_INTERVAL, purgeOldGUIDs) + +------------------------------------ +-- Restore data if using standalone +f:RegisterEvent("PLAYER_LOGIN") +function f:PLAYER_LOGIN() + if LCD_Data and LCD_GUIDAccess then + purgeOldGUIDsArgs(LCD_Data, LCD_GUIDAccess) + + local function MergeTable(t1, t2) + if not t2 then return false end + for k,v in pairs(t2) do + if type(v) == "table" then + if t1[k] == nil then + t1[k] = CopyTable(v) + else + MergeTable(t1[k], v) + end + else + t1[k] = v + end + end + return t1 + end + + local curSessionData = lib.guids + lib.guids = LCD_Data + guids = lib.guids -- update upvalue + MergeTable(guids, curSessionData) + + local curSessionAccessTimes = lib.guidAccessTimes + lib.guidAccessTimes = LCD_GUIDAccess + guidAccessTimes = lib.guidAccessTimes -- update upvalue + MergeTable(guidAccessTimes, curSessionAccessTimes) + end + + f:RegisterEvent("PLAYER_LOGOUT") + function f:PLAYER_LOGOUT() + LCD_Data = guids + LCD_GUIDAccess = guidAccessTimes end end -lib.purgeTicker = lib.purgeTicker or C_Timer.NewTicker( PURGE_INTERVAL, purgeOldGUIDs) + -------------------------- -- DIMINISHING RETURNS @@ -257,18 +265,18 @@ local function addDRLevel(dstGUID, category) local catTable = guidTable[category] if not catTable then - guidTable[category] = {} + guidTable[category] = { level = 0, expires = 0} catTable = guidTable[category] end local now = GetTime() local isExpired = (catTable.expires or 0) <= now - if isExpired then - catTable.level = 1 - catTable.expires = now + DRResetTime - else - catTable.level = catTable.level + 1 + local oldDRLevel = catTable.level + if isExpired or oldDRLevel >= 3 then + catTable.level = 0 end + catTable.level = catTable.level + 1 + catTable.expires = now + DRResetTime end local function clearDRs(dstGUID) DRInfo[dstGUID] = nil @@ -354,7 +362,7 @@ local function cleanDuration(duration, spellID, srcGUID, comboPoints) return duration end -local function RefreshTimer(srcGUID, dstGUID, spellID) +local function GetSpellTable(srcGUID, dstGUID, spellID) local guidTable = guids[dstGUID] if not guidTable then return end @@ -368,9 +376,16 @@ local function RefreshTimer(srcGUID, dstGUID, spellID) applicationTable = spellTable end if not applicationTable then return end + return applicationTable +end + +local function RefreshTimer(srcGUID, dstGUID, spellID, overrideTime) + local applicationTable = GetSpellTable(srcGUID, dstGUID, spellID) + if not applicationTable then return end - applicationTable[2] = GetTime() -- set start time to now - return true + local oldStartTime = applicationTable[2] + applicationTable[2] = overrideTime or GetTime() -- set start time to now + return true, oldStartTime end local function SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType, doRemove) @@ -450,7 +465,7 @@ local function SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, end applicationTable[4] = comboPoints - guidAccessTimes[dstGUID] = now + guidAccessTimes[dstGUID] = time() end local function FireToUnits(event, dstGUID) @@ -474,7 +489,7 @@ end local eventSnapshot castLog.SetLastCast = function(self, srcGUID, spellID, timestamp) self[srcGUID] = { spellID, timestamp } - guidAccessTimes[srcGUID] = timestamp + guidAccessTimes[srcGUID] = time() end castLog.IsCurrent = function(self, srcGUID, spellID, timestamp, timeWindow) local entry = self[srcGUID] @@ -493,21 +508,19 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event) return self:CombatLogHandler(CombatLogGetCurrentEventInfo()) end -function f:CombatLogHandler(...) - local timestamp, eventType, hideCaster, - srcGUID, srcName, srcFlags, srcFlags2, - dstGUID, dstName, dstFlags, dstFlags2, - spellID, spellName, spellSchool, auraType = ... - +local rollbackTable = setmetatable({}, { __mode="v" }) +local function ProcIndirectRefresh(eventType, spellName, srcGUID, srcFlags, dstGUID, dstFlags, dstName, isCrit) if indirectRefreshSpells[spellName] then - local refreshTable = indirectRefreshSpells[spellName] + local targetSpells = indirectRefreshSpells[spellName] + + for targetSpellID, refreshTable in pairs(targetSpells) do if refreshTable.events[eventType] then - local targetSpellID = refreshTable.targetSpellID + local condition = refreshTable.condition if condition then local isMine = bit_band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE - if not condition(isMine) then return end + if not condition(isMine, isCrit) then return end end if refreshTable.targetResistCheck then @@ -524,17 +537,104 @@ function f:CombatLogHandler(...) local targetSpellName = GetSpellInfo(targetSpellID) SetTimer(srcGUID, dstGUID, dstName, dstFlags, targetSpellID, targetSpellName, opts, targetAuraType) end + elseif refreshTable.customAction then + refreshTable.customAction(srcGUID, dstGUID, targetSpellID) else - RefreshTimer(srcGUID, dstGUID, targetSpellID) + local _, oldStartTime = RefreshTimer(srcGUID, dstGUID, targetSpellID) + + if refreshTable.rollbackMisses and oldStartTime then + rollbackTable[srcGUID] = rollbackTable[srcGUID] or {} + rollbackTable[srcGUID][dstGUID] = rollbackTable[srcGUID][dstGUID] or {} + local now = GetTime() + rollbackTable[srcGUID][dstGUID][targetSpellID] = {now, oldStartTime} + end end end + end + end +end + +local igniteName = GetSpellInfo(12654) +do + local igniteOpts = { duration = 4 } + function f:IgniteHandler(...) + local timestamp, eventType, hideCaster, + srcGUID, srcName, srcFlags, srcFlags2, + dstGUID, dstName, dstFlags, dstFlags2, + spellID, spellName, spellSchool, auraType, _, _, _, _, _, isCrit = ... + + spellID = 12654 + local opts = igniteOpts + + if eventType == "SPELL_AURA_APPLIED" then + SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType) + local spellTable = GetSpellTable(srcGUID, dstGUID, spellID) + spellTable.tickExtended = true -- skipping first tick by treating it as already extended + if lib.DEBUG_IGNITE then + print(GetTime(), "[Ignite] Applied", dstGUID, "StartTime:", spellTable[2]) + end + elseif eventType == "SPELL_PERIODIC_DAMAGE" then + local spellTable = GetSpellTable(srcGUID, dstGUID, spellID) + if spellTable then + if lib.DEBUG_IGNITE then + print(GetTime(), "[Ignite] Tick", dstGUID) + end + spellTable.tickExtended = false -- unmark tick + end + elseif eventType == "SPELL_AURA_REMOVED" then + SetTimer(srcGUID, dstGUID, dstName, dstFlags, spellID, spellName, opts, auraType, true) + if lib.DEBUG_IGNITE then + print(GetTime(), "[Ignite] Removed", dstGUID) + end + end + end + -- if playerClass ~= "MAGE" then + -- f.IgniteHandler = function() end + -- end + function lib:GetSpellTable(...) + return GetSpellTable(...) + end +end + +function f:CombatLogHandler(...) + local timestamp, eventType, hideCaster, + srcGUID, srcName, srcFlags, srcFlags2, + dstGUID, dstName, dstFlags, dstFlags2, + spellID, spellName, spellSchool, auraType, _, _, _, _, _, isCrit = ... + + ProcIndirectRefresh(eventType, spellName, srcGUID, srcFlags, dstGUID, dstFlags, dstName, isCrit) + + if spellName == igniteName then + self:IgniteHandler(...) end if eventType == "SPELL_MISSED" and bit_band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE then local missType = auraType - if missType == "RESIST" then + -- ABSORB BLOCK DEFLECT DODGE EVADE IMMUNE MISS PARRY REFLECT RESIST + if not (missType == "ABSORB" or missType == "BLOCK") then -- not sure about those two + + local refreshTable = indirectRefreshSpells[spellName] + -- This is just for Sunder Armor misses + if refreshTable and refreshTable.rollbackMisses then + local rollbacksFromSource = rollbackTable[srcGUID] + if rollbacksFromSource then + local rollbacks = rollbacksFromSource[dstGUID] + if rollbacks then + local targetSpellID = refreshTable.targetSpellID + local snapshot = rollbacks[targetSpellID] + if snapshot then + local timestamp, oldStartTime = unpack(snapshot) + local now = GetTime() + if now - timestamp < 0.5 then + RefreshTimer(srcGUID, dstGUID, targetSpellID, oldStartTime) + end + end + end + end + end + spellID = GetLastRankSpellID(spellName) if not spellID then return @@ -562,9 +662,9 @@ function f:CombatLogHandler(...) local opts = spells[spellID] if not opts then - local npc_aura_duration = npc_spells[spellID] - if npc_aura_duration then - opts = { duration = npc_aura_duration } + local npcDurationForSpellName = npc_spells[spellID] + if npcDurationForSpellName then + opts = { duration = npcDurationForSpellName } -- elseif enableEnemyBuffTracking and not isDstFriendly and auraType == "BUFF" then -- opts = { duration = 0 } -- it'll be accepted but as an indefinite aura end @@ -585,7 +685,7 @@ function f:CombatLogHandler(...) -- All the following APPLIED events are accepted while cast pass is valid -- (Unconfirmed whether timestamp is the same even for a 40m raid) local now = GetTime() - castEventPass = castLog:IsCurrent(srcGUID, spellID, now, 0.4) + castEventPass = castLog:IsCurrent(srcGUID, spellID, now, 0.8) if not castEventPass and (eventType == "SPELL_AURA_REFRESH" or eventType == "SPELL_AURA_APPLIED") then eventSnapshot = { timestamp, eventType, hideCaster, srcGUID, srcName, srcFlags, srcFlags2, @@ -671,7 +771,8 @@ local makeBuffInfo = function(spellID, applicationTable, dstGUID, srcGUID) end local now = GetTime() if expirationTime > now then - return { name, icon, 1, nil, duration, expirationTime, nil, nil, nil, spellID } + local buffType = spells[spellID] and spells[spellID].buffType + return { name, icon, 0, buffType, duration, expirationTime, nil, nil, nil, spellID, false, false, false, false, 1 } end end @@ -684,35 +785,39 @@ local shouldDisplayAura = function(auraTable) return false end -local function RegenerateBuffList(dstGUID) - local guidTable = guids[dstGUID] - if not guidTable then - return - end - +lib.scanTip = lib.scanTip or CreateFrame("GameTooltip", "LibClassicDurationsScanTip", nil, "GameTooltipTemplate") +local scanTip = lib.scanTip +scanTip:SetOwner(WorldFrame, "ANCHOR_NONE") +local function RegenerateBuffList(unit, dstGUID) local buffs = {} - for spellID, t in pairs(guidTable) do - if t.applications then - for srcGUID, auraTable in pairs(t.applications) do - if auraTable[3] == "BUFF" then - local buffInfo = makeBuffInfo(spellID, auraTable, dstGUID, srcGUID) - if buffInfo then - tinsert(buffs, buffInfo) - end + local spellName + for i=1, 32 do + scanTip:ClearLines() + scanTip:SetUnitAura(unit, i, "HELPFUL") + spellName = LibClassicDurationsScanTipTextLeft1:GetText() + if spellName then + local spellID = GetLastRankSpellID(spellName) + if spellID then + local icon = GetSpellTexture(spellID) + local opts = spells[spellID] + local buffInfo = { spellName, icon, 0, (opts and opts.buffType), 0, 0, nil, nil, nil, spellID, false, false, false, false, 1 } + local isStacking = opts and opts.stacking + local srcGUID = nil + local duration, expirationTime = GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, isStacking) + if duration then + buffInfo[5] = duration + buffInfo[6] = expirationTime end + + tinsert(buffs, buffInfo) end else - if t[3] == "BUFF" then - local buffInfo = makeBuffInfo(spellID, t, dstGUID) - if buffInfo then - tinsert(buffs, buffInfo) - end - end + break end end buffCache[dstGUID] = buffs - buffCacheValid[dstGUID] = true + buffCacheValid[dstGUID] = GetTime() + BUFF_CACHE_EXPIRATION_TIME -- Expiration timestamp end local FillInDuration = function(unit, buffName, icon, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nps, spellId, ...) @@ -730,8 +835,9 @@ function lib.UnitAuraDirect(unit, index, filter) if enableEnemyBuffTracking and filter == "HELPFUL" and not UnitIsFriend("player", unit) and not UnitAura(unit, 1, filter) then local unitGUID = UnitGUID(unit) if not unitGUID then return end - if not buffCacheValid[unitGUID] then - RegenerateBuffList(unitGUID) + local isValid = buffCacheValid[unitGUID] + if not isValid or isValid < GetTime() then + RegenerateBuffList(unit, unitGUID) end local buffCacheHit = buffCache[unitGUID] @@ -767,28 +873,39 @@ function f:NAME_PLATE_UNIT_REMOVED(event, unit) end function callbacks.OnUsed() - enableEnemyBuffTracking = true + lib.enableEnemyBuffTracking = true + enableEnemyBuffTracking = lib.enableEnemyBuffTracking f:RegisterEvent("NAME_PLATE_UNIT_ADDED") f:RegisterEvent("NAME_PLATE_UNIT_REMOVED") end function callbacks.OnUnused() - enableEnemyBuffTracking = false + lib.enableEnemyBuffTracking = false + enableEnemyBuffTracking = lib.enableEnemyBuffTracking f:UnregisterEvent("NAME_PLATE_UNIT_ADDED") f:UnregisterEvent("NAME_PLATE_UNIT_REMOVED") end +if next(callbacks.events) then + callbacks.OnUsed() +end + --------------------------- -- PUBLIC FUNCTIONS --------------------------- -local function GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, isStacking) +GetGUIDAuraTime = function(dstGUID, spellName, spellID, srcGUID, isStacking, forcedNPCDuration) local guidTable = guids[dstGUID] if guidTable then - local lastRankID = spellNameToID[spellName] + local lastRankID = GetLastRankSpellID(spellName) local spellTable = guidTable[lastRankID] if spellTable then local applicationTable + + -- Return when player spell and npc spell have the same name and the player spell is stacking + -- NPC spells are always assumed to not stack, so it won't find startTime + if forcedNPCDuration and spellTable.applications then return nil end + if isStacking then if srcGUID and spellTable.applications then applicationTable = spellTable.applications[srcGUID] @@ -800,9 +917,10 @@ local function GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, isStacking) end if not applicationTable then return end local durationFunc, startTime, auraType, comboPoints = unpack(applicationTable) - local duration = cleanDuration(durationFunc, spellID, srcGUID, comboPoints) + local duration = forcedNPCDuration or cleanDuration(durationFunc, spellID, srcGUID, comboPoints) if duration == INFINITY then return nil end if not duration then return nil end + if not startTime then return nil end local mul = getDRMul(dstGUID, spellID) -- local mul = getDRMul(dstGUID, lastRankID) duration = duration * mul @@ -832,11 +950,18 @@ end function lib.GetAuraDurationByUnitDirect(unit, spellID, casterUnit, spellName) assert(spellID, "spellID is nil") local opts = spells[spellID] - if not opts then return end + local isStacking + local npcDurationById + if opts then + isStacking = opts.stacking + else + npcDurationById = npc_spells[spellID] + if not npcDurationById then return end + end local dstGUID = UnitGUID(unit) local srcGUID = casterUnit and UnitGUID(casterUnit) if not spellName then spellName = GetSpellInfo(spellID) end - return GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, opts.stacking) + return GetGUIDAuraTime(dstGUID, spellName, spellID, srcGUID, isStacking, npcDurationById) end GetAuraDurationByUnitDirect = lib.GetAuraDurationByUnitDirect @@ -852,7 +977,7 @@ function lib:GetAuraDurationByGUID(dstGUID, spellID, srcGUID, spellName) end function lib:GetLastRankSpellIDByName(spellName) - return spellNameToID[spellName] + return GetLastRankSpellID(spellName) end -- Will not work for cp-based durations, KS and Rupture @@ -864,7 +989,8 @@ function lib:GetDurationForRank(spellName, spellID, srcGUID) end end -local activeFrames = {} +lib.activeFrames = lib.activeFrames or {} +local activeFrames = lib.activeFrames function lib:RegisterFrame(frame) activeFrames[frame] = true if next(activeFrames) then @@ -939,3 +1065,90 @@ function lib:MonitorUnit(unit) print("[LCD] Disabled combat log event display") end end + +------------------ +-- Set Tracking +------------------ + + +local itemSets = {} + +function lib:TrackItemSet(setname, itemArray) + itemSets[setname] = itemSets[setname] or {} + if not itemSets[setname].items then + itemSets[setname].items = {} + itemSets[setname].callbacks = {} + local bitems = itemSets[setname].items + for _, itemID in ipairs(itemArray) do + bitems[itemID] = true + end + end +end +function lib:RegisterSetBonusCallback(setname, pieces, handle_on, handle_off) + local set = itemSets[setname] + if not set then error(string.format("Itemset '%s' is not registered", setname)) end + set.callbacks[pieces] = {} + set.callbacks[pieces].equipped = false + set.callbacks[pieces].on = handle_on + set.callbacks[pieces].off = handle_off +end + +function lib:IsSetBonusActive(setname, bonusLevel) + local set = itemSets[setname] + if not set then return false end + local setCallbacks = set.callbacks + if setCallbacks[bonusLevel] and setCallbacks[bonusLevel].equipped then + return true + end + return false +end + + +function lib:IsSetBonusActiveFullCheck(setname, bonusLevel) + local set = itemSets[setname] + if not set then return false end + local set_items = set.items + local pieces_equipped = 0 + for slot=1,17 do + local itemID = GetInventoryItemID("player", slot) + if set_items[itemID] then pieces_equipped = pieces_equipped + 1 end + end + return (pieces_equipped >= bonusLevel) +end + + +lib.setwatcher = lib.setwatcher or CreateFrame("Frame", nil, UIParent) +local setwatcher = lib.setwatcher +setwatcher:SetScript("OnEvent", function(self, event, ...) + return self[event](self, event, ...) +end) +setwatcher:RegisterEvent("PLAYER_LOGIN") +function setwatcher:PLAYER_LOGIN() + if next(itemSets) then + self:RegisterUnitEvent("UNIT_INVENTORY_CHANGED", "player") + self:UNIT_INVENTORY_CHANGED(nil, "player") + end +end +function setwatcher:UNIT_INVENTORY_CHANGED(event, unit) + for setname, set in pairs(itemSets) do + local set_items = set.items + local pieces_equipped = 0 + for slot=1,17 do -- That excludes ranged slot in classic + local itemID = GetInventoryItemID("player", slot) + if set_items[itemID] then pieces_equipped = pieces_equipped + 1 end + end + for bp, bonus in pairs(set.callbacks) do + if pieces_equipped >= bp then + if not bonus.equipped then + if bonus.on then bonus.on() end + bonus.equipped = true + end + else + if bonus.equipped then + if bonus.off then bonus.off() end + bonus.equipped = false + end + end + end + end +end diff --git a/libraries/LibClassicDurations/diminishingReturns.lua b/libraries/LibClassicDurations/diminishingReturns.lua old mode 100755 new mode 100644 diff --git a/libraries/LibClassicDurations/npcAbilities.lua b/libraries/LibClassicDurations/npcAbilities.lua old mode 100755 new mode 100644 From 909cc1cc96fb60489d3537f23bcd8113ebf70d0d Mon Sep 17 00:00:00 2001 From: Gena Date: Sat, 29 Aug 2020 14:33:22 +0300 Subject: [PATCH 11/22] update auras position, improve unit frame, update chat layout --- aura/aura.lua | 22 +- chat/chat.lua | 4 +- unit/unit.lua | 1006 ++++++++++++++++++++++++------------------------- 3 files changed, 513 insertions(+), 519 deletions(-) diff --git a/aura/aura.lua b/aura/aura.lua index 93ad421..912e22d 100755 --- a/aura/aura.lua +++ b/aura/aura.lua @@ -20,8 +20,8 @@ 'TOPRIGHT', Minimap, 'TOPLEFT', - -35, - -8, + -200, + -180, }, }, ['player|HARMFUL'] = { @@ -29,16 +29,16 @@ sort = 'TIME', minWidth = 330, minHeight = 100, - x = -50, - wrapAfter = 1, + x = -38, + wrapAfter = 12, wrapY = -50, direction = '+', position = { 'TOPRIGHT', - QuestWatchFrame, + Minimap, 'TOPLEFT', - -25, - -20, + -200, + -330, }, }, ['weapons|NA'] = { @@ -101,10 +101,10 @@ local FormatDebuffs = function(self, name, dtype) if name then local colour = DebuffTypeColor[dtype or 'none'] - self.Name:SetText(strupper(name)) - self.Name:SetTextColor(colour.r*1.7, colour.g*1.7, colour.b*1.7) -- brighten up - self.Name:SetWidth(150) - self.Name:SetWordWrap(true) + --self.Name:SetText(strupper(name)) + --self.Name:SetTextColor(colour.r*1.7, colour.g*1.7, colour.b*1.7) -- brighten up + --self.Name:SetWidth(150) + --self.Name:SetWordWrap(true) for i, v in pairs(self.F.bo) do self.F.bo[i]:SetVertexColor(colour.r, colour.g, colour.b) end diff --git a/chat/chat.lua b/chat/chat.lua index 68a5a77..d6fa292 100755 --- a/chat/chat.lua +++ b/chat/chat.lua @@ -69,8 +69,8 @@ SetChatWindowAlpha(i, 0) HideChatElements(v) - chat:SetFrameLevel(99) - chat:SetFrameStrata'MEDIUM' +-- chat:SetFrameLevel(99) +-- chat:SetFrameStrata'MEDIUM' chat:SetShadowOffset(1, -1) chat:SetClampedToScreen(false) chat:SetClampRectInsets(0, 0, 0, 0) diff --git a/unit/unit.lua b/unit/unit.lua index f2b39c4..b387bd0 100755 --- a/unit/unit.lua +++ b/unit/unit.lua @@ -1,506 +1,500 @@ - - local _, ns = ... - - local LCD = LibStub'LibClassicDurations' - LCD:Register'modui' - - local LCMH = LibStub'LibClassicMobHealth-1.0' - - local events = { - 'PLAYER_LOGIN', - 'GROUP_ROSTER_UPDATE', - 'PLAYER_TARGET_CHANGED', - 'UNIT_SPELLCAST_START', - 'UNIT_SPELLCAST_CHANNEL_START', - 'UNIT_FACTION' - } - - local AddPlayerFrame = function() - for _, v in pairs( - { - PlayerFrameHealthBarText, - PlayerFrameHealthBarTextLeft, - PlayerFrameHealthBarTextRight, - PlayerFrameManaBarText, - PlayerFrameManaBarTextLeft, - PlayerFrameManaBarTextRight, - } - ) do - v:SetFont(STANDARD_TEXT_FONT, 10, 'OUTLINE') - end - for _, v in pairs( - { - PlayerFrameHealthBar, - PlayerFrameManaBar - } - ) do - --ns.SB(v) - end - if not PlayerFrame.bg then - local _, class = UnitClass'player' - local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] - PlayerFrame.bg = PlayerFrame:CreateTexture() - PlayerFrame.bg:SetPoint('TOPLEFT', PlayerFrameBackground) - PlayerFrame.bg:SetPoint('BOTTOMRIGHT', PlayerFrameBackground, 0, 22) - PlayerFrame.bg:SetVertexColor(colour.r, colour.g, colour.b) - end - - PlayerPVPIcon:SetAlpha(0) - - if MODUI_VAR['elements']['unit'].castbar then - CastingBarFrame.Icon:SetSize(16, 16) - CastingBarFrame.Icon:ClearAllPoints() - CastingBarFrame.Icon:SetPoint('LEFT', CastingBarFrame, -25, 0) - CastingBarFrame.Icon:SetTexCoord(.1, .9, .1, .9) - - CastingBarFrame.IconF = CreateFrame('Frame', nil, CastingBarFrame) - CastingBarFrame.IconF:SetAllPoints(CastingBarFrame.Icon) - ns.BD(CastingBarFrame.IconF) - ns.BUBorder(CastingBarFrame.IconF, 18) - for i = 1, 4 do - tinsert(ns.skinbu, CastingBarFrame.IconF.bo[i]) - CastingBarFrame.IconF.bo[i]:SetVertexColor(MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b) - end - CastingBarFrame.Icon:SetParent(CastingBarFrame.IconF) - - CastingBarFrame.SafeZone = CastingBarFrame:CreateTexture(nil, 'BORDER') - ns.SB(CastingBarFrame.SafeZone) - CastingBarFrame.SafeZone:SetVertexColor(.69, .31, .31) - end - end - - local UpdateCastingBarLatency = function(start, endtime) - local width = CastingBarFrame:GetWidth() - local _, _, _, ms = GetNetStats() - local x = (ms/1e3)/((endtime/1e3) - (start/1e3)) - - if x > 1 then x = 1 end - - CastingBarFrame.SafeZone:SetWidth(width*x) - CastingBarFrame.SafeZone:ClearAllPoints() - CastingBarFrame.SafeZone:SetPoint(channel and 'LEFT' or 'RIGHT') - CastingBarFrame.SafeZone:SetPoint'TOP' - CastingBarFrame.SafeZone:SetPoint'BOTTOM' - end - - local UpdateCastingBarIcon = function(texture) - if CastingBarFrame.Spark.offsetY < 1 then - CastingBarFrame.Icon:ClearAllPoints() - CastingBarFrame.Icon:SetPoint('LEFT', CastingBarFrame, -25, 0) - else - CastingBarFrame.Icon:SetTexture(texture) - CastingBarFrame.Icon:Show() - CastingBarFrame.Icon:ClearAllPoints() - CastingBarFrame.Icon:SetPoint('LEFT', CastingBarFrame, -32, 3) - end - end - - local UpdateCastingBar = function(channel) - local _, texture, start, endtime - if channel then - _, _, texture, start, endtime = ChannelInfo() - else - _, _, texture, start, endtime = CastingInfo() - end - UpdateCastingBarLatency(start, endtime, channel) - UpdateCastingBarIcon(texture) - end - - local UpdateTargetValue = function(targetFrame) - local v, max, found = LCMH:GetUnitHealth'target' - local display = GetCVar'statusTextDisplay' - print(v) - TextStatusBar_UpdateTextStringWithValues(TargetFrameHealthBar, TargetFrameHealthBarText, v, 0, max) - if TargetFrameHealthBar.RightText and display == 'BOTH' and not TargetFrameHealthBar.showPercentage then - targetFrame.RightText:SetText(v) - end - end - - local AddTargetFrame = function() - for _, v in pairs( - { - TargetFrameHealthBar, - TargetFrameManaBar - } - ) do - --ns.SB(v) - end - - - --TargetFrameNameBackground:SetTexture(nil) - --TargetFrameNameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.5) - TargetFrameNameBackground:Hide() - - TargetFrame.Elite = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') - TargetFrame.Elite:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Elite]] - TargetFrame.Elite:SetSize(128, 128) - TargetFrame.Elite:SetPoint('TOPRIGHT', TargetFrame) - TargetFrame.Elite:Hide() - - TargetFrame.Rare = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') - TargetFrame.Rare:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Rare-Elite]] - TargetFrame.Rare:SetSize(128, 128) - TargetFrame.Rare:SetPoint('TOPRIGHT', TargetFrame) - TargetFrame.Rare:Hide() - - TargetFrameHealthBarText = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') - TargetFrameHealthBarText:SetPoint('CENTER', -50, 3) - TargetFrameHealthBar.TextString = TargetFrameHealthBarText - - TargetFrameHealthBarTextLeft = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') - TargetFrameHealthBarTextLeft:SetPoint('LEFT', 8, 3) - TargetFrameHealthBar.LeftText = TargetFrameHealthBarTextLeft - - TargetFrameHealthBarTextRight = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') - TargetFrameHealthBarTextRight:SetPoint('RIGHT', -110, 3) - TargetFrameHealthBar.RightText = TargetFrameHealthBarTextRight - - print("first") - - TargetFrameManaBarText = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') - TargetFrameManaBarText:SetPoint('CENTER', -50, -8) - TargetFrameManaBar.TextString = TargetFrameManaBarText - - print("second") - TargetFrameManaBarTextLeft = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') - TargetFrameManaBarTextLeft:SetPoint('LEFT', 8, -8) - TargetFrameManaBar.LeftText = TargetFrameManaBarTextLeft - - print("third") - TargetFrameManaBarTextRight = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') - TargetFrameManaBarTextRight:SetPoint('RIGHT', -110, -8) - TargetFrameManaBar.RightText = TargetFrameManaBarTextRight - - - - --TargetFrameHealthBar:HookScript('OnValueChanged', UpdateTargetValue) - for _, v in pairs( - { - TargetFrameHealthBarText, - TargetFrameHealthBarTextLeft, - TargetFrameHealthBarTextRight, - TargetFrameManaBarText, - TargetFrameManaBarTextLeft, - TargetFrameManaBarTextRight, - - } - ) do - v:SetFont(STANDARD_TEXT_FONT, 10, 'OUTLINE') - end - - TargetFrameTextureFramePVPIcon:SetAlpha(0) - end - - - local AddToTFrame = function() - TargetFrameToTPortrait:SetSize(37, 37) - TargetFrameToTPortrait:SetPoint('TOPLEFT', 5, -5) - - for _, v in pairs( - { - TargetFrameToTHealthBar, - TargetFrameToTManaBar - } - ) do - if v then - --ns.SB(v) - end - end - end - - local AddPartyFrame = function() - for i = 1, 4 do - for _, v in pairs( - { - _G['PartyMemberFrame'..i..'HealthBar'], - _G['PartyMemberFrame'..i..'ManaBar'] - } - ) do - --ns.BD(v) - --ns.SB(v) - end - end - end - - local AddHealthTextColour = function(t, statusbar) - --[[ - local min, max = statusbar:GetMinMaxValues() - local v = statusbar:GetValue() - ns.GRADIENT_COLOUR(t, v, min, max) - --]] - end - - local AddManaTextColour = function(t, class, powertype) - --[[ - if MODUI_VAR['elements']['unit'].vcolour then - if class == 'ROGUE' or (class == 'DRUID' and powertype == 3) then - t:SetTextColor(250/255, 240/255, 200/255) - elseif class == 'WARRIOR' or (class == 'DRUID' and powertype == 1) then - t:SetTextColor(250/255, 108/255, 108/255) - else - t:SetTextColor(.6, .65, 1) - end - else - t:SetTextColor(1, 1, 1) - end - --]] - end - - local AddTargetAura = function(self) - -- nb: needs update: these are being generated ad-hoc - for i = 1, MAX_TARGET_BUFFS do - local n = 'TargetFrameBuff'..i - local bu = _G[n] - local cd = _G[n..'Cooldown'] - if bu and not bu.skinned then - ns.BUBorder(bu, 18, 18, 3, 4) - for j = 1, 4 do - tinsert(ns.skinbu, bu.bo[j]) - bu.bo[j]:SetVertexColor(MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b) - end - - cd:SetHideCountdownNumbers(false) - - local t = cd:GetRegions() - t:SetFont(STANDARD_TEXT_FONT, 7, 'OUTLINE') - t:ClearAllPoints() - t:SetPoint('CENTER', cd, 'BOTTOM', 0, 3) - bu.skinned = true - end - end - for i = 1, MAX_TARGET_DEBUFFS do - local n = 'TargetFrameDebuff'..i - local bu = _G[n] - local cd = _G[n..'Cooldown'] - - if bu and not bu.skinned then - cd:SetHideCountdownNumbers(false) - - local t = cd:GetRegions() - t:SetFont(STANDARD_TEXT_FONT, 7, 'OUTLINE') - t:ClearAllPoints() - t:SetPoint('CENTER', cd, 'BOTTOM', 0, 3) - bu.skinned = true - end - end - end - - local AddAuraDuration = function(self) - AddTargetAura(self) - for i = 1, MAX_TARGET_BUFFS do - local name, icon, count, dtype, duration, expiration, caster, canstealorpurge, _ , spellid, _, _, isplayer, nameplateshowall = UnitBuff(self.unit, i, nil) - if name then - local n = self:GetName()..'Buff'..i - local bu = _G[n] - local cd = _G[n..'Cooldown'] - - local duration2, expiration2 = LCD:GetAuraDurationByUnit(self.unit, spellid, caster) - if duration == 0 and duration2 then - duration = duration2 - expiration = expiration2 - end - - CooldownFrame_Set(cd, expiration - duration, duration, duration > 0, true) - else - break - end - end - - local num = 1 - local i = 1 - local max = self.maxDebuffs or MAX_TARGET_DEBUFFS - while num <= max and i <= max do - local name, icon, count, dtype, duration, expiration, caster, _, _, spellid, _, _, isplayer, nameplates= UnitDebuff(self.unit, i, 'INCLUDE_NAME_PLATE_ONLY') - if name then - if TargetFrame_ShouldShowDebuffs(self.unit, caster, nameplateshowall, casterisplayer) then - local n = self:GetName()..'Debuff'..num - local bu = _G[n] - local cd = _G[n..'Cooldown'] - - local duration2, expiration2 = LCD:GetAuraDurationByUnit(self.unit, spellid, caster) - if duration == 0 and duration2 then - duration = duration2 - expiration = expiration2 - end - - CooldownFrame_Set(cd, expiration - duration, duration, duration > 0, true) - num = num + 1 - end - else - break - end - i = i + 1 - end - end - - local AddPartyPets = function() - local var = GetCVar'showPartyPets' - if not var == '1' then SetCVar('showPartyPets', 1) end - end - - local UpdateTargetNameClassColour = function() - TargetFrameNameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.4) - end - - local UpdatePartyTextClassColour = function() - for i = 1, MAX_PARTY_MEMBERS do - local name = _G['PartyMemberFrame'..i..'Name'] - - --[[ - if UnitIsPlayer('party'..i) then - local _, class = UnitClass('party'..i) - local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] - if colour then - name:SetTextColor(colour.r, colour.g, colour.b) - end - else - --]] - - name:SetTextColor(1, .8, 0) - end - end - - local UpdateTextStringColour = function(statusbar) - local _, class = UnitClass'player' - local n = statusbar:GetName() - for _, t in pairs( - { - statusbar.TextString, - statusbar.LeftText, - statusbar.RightText, - } - ) do - if t and n == 'PlayerFrameManaBar' then - AddManaTextColour(t, class, UnitPowerType'player') - elseif t and (n == 'PlayerFrameHealthBar' or n == 'TargetFrameHealthBar') then - AddHealthTextColour(t, statusbar) - end - end - end - - local CheckClassification = function(self) - - local classification = UnitClassification(self.unit) - - for _, v in pairs( - { - self.Elite, - self.Rare - } - ) do - v:Hide() - end - - self.borderTexture:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame]] - - if classification == 'worldboss' or classification == 'elite' or classification == 'rareelite' then - self.Elite:Show() - elseif classification == 'rare' then - self.Rare:Show() - end - end - - local UpdateToT = function(self, elapsed) - local _, class = UnitClass'targettarget' - local colour = RAID_CLASS_COLORS[class] - local name = UnitName'targettarget' - - TargetFrameToTTextureFrameName:SetTextColor(1, .8, 0) - - TargetFrameToTTextureFrameName:ClearAllPoints() - TargetFrameToTTextureFrameName:SetPoint('BOTTOMLEFT', TargetFrameToTTextureFrame, 49, 0) - end - - local function OnEvent(self, event) - if not MODUI_VAR['elements']['unit'].enable then return end - - if event == 'PLAYER_LOGIN' then - if MODUI_VAR['elements']['unit'].player then - AddPlayerFrame() - end - - if MODUI_VAR['elements']['unit'].target then - AddTargetFrame() - end - - if MODUI_VAR['elements']['unit'].tot then - AddToTFrame() - -- TargetFrameToT:HookScript('OnUpdate', UpdateToT) tainting i think - end - - if MODUI_VAR['elements']['unit'].rcolour then - hooksecurefunc('TargetFrame_CheckClassification', CheckClassification) - end - - if MODUI_VAR['elements']['unit'].vcolour then - hooksecurefunc('TextStatusBar_UpdateTextString', UpdateTextStringColour) - end - - if MODUI_VAR['elements']['unit'].auras then - hooksecurefunc('TargetFrame_UpdateAuras', AddAuraDuration) - end - end - - if event == 'UNIT_SPELLCAST_START' or event == 'UNIT_SPELLCAST_CHANNEL_START' then - if MODUI_VAR['elements']['unit'].castbar then - UpdateCastingBar(event == 'UNIT_SPELLCAST_CHANNEL_START' and true or false) - end - end - - if MODUI_VAR['elements']['unit'].target then - UpdateTargetNameClassColour() - end - - if MODUI_VAR['elements']['unit'].party then - AddPartyPets() - if not InCombatLockdown() then UpdatePartyTextClassColour() end - end - - end - - local e = CreateFrame'Frame' - for _, v in pairs(events) do e:RegisterEvent(v) end - e:SetScript('OnEvent', OnEvent) - - - hooksecurefunc("PlayerFrame_UpdateStatus", function() - if IsResting("player") then - PlayerStatusTexture:Hide() - PlayerRestIcon:Hide() - PlayerRestGlow:Hide() - PlayerStatusGlow:Hide() - elseif PlayerFrame.inCombat then - PlayerStatusTexture:Hide() - PlayerAttackIcon:Hide() - PlayerRestIcon:Hide() - PlayerAttackGlow:Hide() - PlayerRestGlow:Hide() - PlayerStatusGlow:Hide() - PlayerAttackBackground:Hide() - end - end) - - hooksecurefunc("TextStatusBar_UpdateTextStringWithValues",function(statusFrame, _, value, valueMin, valueMax) - - local leftText = statusFrame.LeftText - local rightText = statusFrame.RightText - - if leftText then - leftText:SetText('') - end - - - if statusFrame==TargetFrameHealthBar then - local v, max, found = LCMH:GetUnitHealth'target' - if not found then - v = v .. '%' - end - rightText:SetText(v) - elseif statusFrame==TargetFrameManaBar then - local v, max, found = LCMH:GetUnitMana'target' - rightText:SetText(v) - end - - - end) - -- + + local _, ns = ... + + local LCD = LibStub'LibClassicDurations' + LCD:Register'modui' + + local LCMH = LibStub'LibClassicMobHealth-1.0' + + local events = { + 'PLAYER_LOGIN', + 'GROUP_ROSTER_UPDATE', + 'PLAYER_TARGET_CHANGED', + 'UNIT_SPELLCAST_START', + 'UNIT_SPELLCAST_CHANNEL_START', + 'UNIT_FACTION' + } + + local AddPlayerFrame = function() + for _, v in pairs( + { + PlayerFrameHealthBarText, + PlayerFrameHealthBarTextLeft, + PlayerFrameHealthBarTextRight, + PlayerFrameManaBarText, + PlayerFrameManaBarTextLeft, + PlayerFrameManaBarTextRight, + } + ) do + v:SetFont(STANDARD_TEXT_FONT, 10, 'OUTLINE') + end + for _, v in pairs( + { + PlayerFrameHealthBar, + PlayerFrameManaBar + } + ) do + --ns.SB(v) + end + if not PlayerFrame.bg then + local _, class = UnitClass'player' + local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] + PlayerFrame.bg = PlayerFrame:CreateTexture() + PlayerFrame.bg:SetPoint('TOPLEFT', PlayerFrameBackground) + PlayerFrame.bg:SetPoint('BOTTOMRIGHT', PlayerFrameBackground, 0, 22) + PlayerFrame.bg:SetVertexColor(colour.r, colour.g, colour.b) + end + + PlayerPVPIcon:SetAlpha(0) + if MODUI_VAR['elements']['unit'].castbar then + CastingBarFrame.Icon:SetSize(16, 16) + CastingBarFrame.Icon:ClearAllPoints() + CastingBarFrame.Icon:SetPoint('LEFT', CastingBarFrame, -25, 0) + CastingBarFrame.Icon:SetTexCoord(.1, .9, .1, .9) + + CastingBarFrame.IconF = CreateFrame('Frame', nil, CastingBarFrame) + CastingBarFrame.IconF:SetAllPoints(CastingBarFrame.Icon) + ns.BD(CastingBarFrame.IconF) + ns.BUBorder(CastingBarFrame.IconF, 18) + for i = 1, 4 do + tinsert(ns.skinbu, CastingBarFrame.IconF.bo[i]) + CastingBarFrame.IconF.bo[i]:SetVertexColor(MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b) + end + CastingBarFrame.Icon:SetParent(CastingBarFrame.IconF) + + CastingBarFrame.SafeZone = CastingBarFrame:CreateTexture(nil, 'BORDER') + ns.SB(CastingBarFrame.SafeZone) + CastingBarFrame.SafeZone:SetVertexColor(.69, .31, .31) + end + end + + local UpdateCastingBarLatency = function(start, endtime) + local width = CastingBarFrame:GetWidth() + local _, _, _, ms = GetNetStats() + local x = (ms/1e3)/((endtime/1e3) - (start/1e3)) + + if x > 1 then x = 1 end + + CastingBarFrame.SafeZone:SetWidth(width*x) + CastingBarFrame.SafeZone:ClearAllPoints() + CastingBarFrame.SafeZone:SetPoint(channel and 'LEFT' or 'RIGHT') + CastingBarFrame.SafeZone:SetPoint'TOP' + CastingBarFrame.SafeZone:SetPoint'BOTTOM' + end + + local UpdateCastingBarIcon = function(texture) + if CastingBarFrame.Spark.offsetY < 1 then + CastingBarFrame.Icon:ClearAllPoints() + CastingBarFrame.Icon:SetPoint('LEFT', CastingBarFrame, -25, 0) + else + CastingBarFrame.Icon:SetTexture(texture) + CastingBarFrame.Icon:Show() + CastingBarFrame.Icon:ClearAllPoints() + CastingBarFrame.Icon:SetPoint('LEFT', CastingBarFrame, -32, 3) + end + end + + local UpdateCastingBar = function(channel) + local _, texture, start, endtime + if channel then + _, _, texture, start, endtime = ChannelInfo() + else + _, _, texture, start, endtime = CastingInfo() + end + UpdateCastingBarLatency(start, endtime, channel) + UpdateCastingBarIcon(texture) + end + + local UpdateTargetValue = function(targetFrame) + local v, max, found = LCMH:GetUnitHealth'target' + local display = GetCVar'statusTextDisplay' + print(v) + TextStatusBar_UpdateTextStringWithValues(TargetFrameHealthBar, TargetFrameHealthBarText, v, 0, max) + if TargetFrameHealthBar.RightText and display == 'BOTH' and not TargetFrameHealthBar.showPercentage then + targetFrame.RightText:SetText(v) + end + end + + local AddTargetFrame = function() + for _, v in pairs( + { + TargetFrameHealthBar, + TargetFrameManaBar + } + ) do + --ns.SB(v) + end + + + --TargetFrameNameBackground:SetTexture(nil) + --TargetFrameNameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.5) + TargetFrameNameBackground:Hide() + + TargetFrame.Elite = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') + TargetFrame.Elite:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Elite]] + TargetFrame.Elite:SetSize(128, 128) + TargetFrame.Elite:SetPoint('TOPRIGHT', TargetFrame) + TargetFrame.Elite:Hide() + + TargetFrame.Rare = TargetFrameTextureFrame:CreateTexture(nil, 'BORDER') + TargetFrame.Rare:SetTexture[[Interface\AddOns\modui_classic\art\unitframe\UI-TargetingFrame-Rare-Elite]] + TargetFrame.Rare:SetSize(128, 128) + TargetFrame.Rare:SetPoint('TOPRIGHT', TargetFrame) + TargetFrame.Rare:Hide() + + TargetFrameHealthBarText = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameHealthBarText:SetPoint('CENTER', -50, 3) + TargetFrameHealthBar.TextString = TargetFrameHealthBarText + + TargetFrameHealthBarTextLeft = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameHealthBarTextLeft:SetPoint('LEFT', 8, 3) + TargetFrameHealthBar.LeftText = TargetFrameHealthBarTextLeft + + TargetFrameHealthBarTextRight = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameHealthBarTextRight:SetPoint('RIGHT', -110, 3) + TargetFrameHealthBar.RightText = TargetFrameHealthBarTextRight + + + TargetFrameManaBarText = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameManaBarText:SetPoint('CENTER', -50, -8) + TargetFrameManaBar.TextString = TargetFrameManaBarText + + TargetFrameManaBarTextLeft = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameManaBarTextLeft:SetPoint('LEFT', 8, -8) + TargetFrameManaBar.LeftText = TargetFrameManaBarTextLeft + + TargetFrameManaBarTextRight = TargetFrameTextureFrame:CreateFontString(nil, 'OVERLAY', 'TextStatusBarText') + TargetFrameManaBarTextRight:SetPoint('RIGHT', -110, -8) + TargetFrameManaBar.RightText = TargetFrameManaBarTextRight + + + + --TargetFrameHealthBar:HookScript('OnValueChanged', UpdateTargetValue) + for _, v in pairs( + { + TargetFrameHealthBarText, + TargetFrameHealthBarTextLeft, + TargetFrameHealthBarTextRight, + TargetFrameManaBarText, + TargetFrameManaBarTextLeft, + TargetFrameManaBarTextRight, + + } + ) do + v:SetFont(STANDARD_TEXT_FONT, 10, 'OUTLINE') + end + + TargetFrameTextureFramePVPIcon:SetAlpha(0) + end + + + local AddToTFrame = function() + TargetFrameToTPortrait:SetSize(37, 37) + TargetFrameToTPortrait:SetPoint('TOPLEFT', 5, -5) + + for _, v in pairs( + { + TargetFrameToTHealthBar, + TargetFrameToTManaBar + } + ) do + if v then + --ns.SB(v) + end + end + end + + local AddPartyFrame = function() + for i = 1, 4 do + for _, v in pairs( + { + _G['PartyMemberFrame'..i..'HealthBar'], + _G['PartyMemberFrame'..i..'ManaBar'] + } + ) do + --ns.BD(v) + --ns.SB(v) + end + end + end + + local AddHealthTextColour = function(t, statusbar) + --[[ + local min, max = statusbar:GetMinMaxValues() + local v = statusbar:GetValue() + ns.GRADIENT_COLOUR(t, v, min, max) + --]] + end + + local AddManaTextColour = function(t, class, powertype) + --[[ + if MODUI_VAR['elements']['unit'].vcolour then + if class == 'ROGUE' or (class == 'DRUID' and powertype == 3) then + t:SetTextColor(250/255, 240/255, 200/255) + elseif class == 'WARRIOR' or (class == 'DRUID' and powertype == 1) then + t:SetTextColor(250/255, 108/255, 108/255) + else + t:SetTextColor(.6, .65, 1) + end + else + t:SetTextColor(1, 1, 1) + end + --]] + end + + local AddTargetAura = function(self) + -- nb: needs update: these are being generated ad-hoc + for i = 1, MAX_TARGET_BUFFS do + local n = 'TargetFrameBuff'..i + local bu = _G[n] + local cd = _G[n..'Cooldown'] + if bu and not bu.skinned then + ns.BUBorder(bu, 18, 18, 3, 4) + for j = 1, 4 do + tinsert(ns.skinbu, bu.bo[j]) + bu.bo[j]:SetVertexColor(MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b) + end + + cd:SetHideCountdownNumbers(false) + + local t = cd:GetRegions() + t:SetFont(STANDARD_TEXT_FONT, 7, 'OUTLINE') + t:ClearAllPoints() + t:SetPoint('CENTER', cd, 'BOTTOM', 0, 3) + bu.skinned = true + end + end + for i = 1, MAX_TARGET_DEBUFFS do + local n = 'TargetFrameDebuff'..i + local bu = _G[n] + local cd = _G[n..'Cooldown'] + + if bu and not bu.skinned then + cd:SetHideCountdownNumbers(false) + + local t = cd:GetRegions() + t:SetFont(STANDARD_TEXT_FONT, 7, 'OUTLINE') + t:ClearAllPoints() + t:SetPoint('CENTER', cd, 'BOTTOM', 0, 3) + bu.skinned = true + end + end + end + + local AddAuraDuration = function(self) + AddTargetAura(self) + for i = 1, MAX_TARGET_BUFFS do + local name, icon, count, dtype, duration, expiration, caster, canstealorpurge, _ , spellid, _, _, isplayer, nameplateshowall = UnitBuff(self.unit, i, nil) + if name then + local n = self:GetName()..'Buff'..i + local bu = _G[n] + local cd = _G[n..'Cooldown'] + + local duration2, expiration2 = LCD:GetAuraDurationByUnit(self.unit, spellid, caster) + if duration == 0 and duration2 then + duration = duration2 + expiration = expiration2 + end + + CooldownFrame_Set(cd, expiration - duration, duration, duration > 0, true) + else + break + end + end + + local num = 1 + local i = 1 + local max = self.maxDebuffs or MAX_TARGET_DEBUFFS + while num <= max and i <= max do + local name, icon, count, dtype, duration, expiration, caster, _, _, spellid, _, _, isplayer, nameplates= UnitDebuff(self.unit, i, 'INCLUDE_NAME_PLATE_ONLY') + if name then + if TargetFrame_ShouldShowDebuffs(self.unit, caster, nameplateshowall, casterisplayer) then + local n = self:GetName()..'Debuff'..num + local bu = _G[n] + local cd = _G[n..'Cooldown'] + + local duration2, expiration2 = LCD:GetAuraDurationByUnit(self.unit, spellid, caster) + if duration == 0 and duration2 then + duration = duration2 + expiration = expiration2 + end + + CooldownFrame_Set(cd, expiration - duration, duration, duration > 0, true) + num = num + 1 + end + else + break + end + i = i + 1 + end + end + + local AddPartyPets = function() + local var = GetCVar'showPartyPets' + if not var == '1' then SetCVar('showPartyPets', 1) end + end + + local UpdateTargetNameClassColour = function() + TargetFrameNameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.5) + end + + local UpdatePartyTextClassColour = function() + for i = 1, MAX_PARTY_MEMBERS do + local name = _G['PartyMemberFrame'..i..'Name'] + + --[[ + if UnitIsPlayer('party'..i) then + local _, class = UnitClass('party'..i) + local colour = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] + if colour then + name:SetTextColor(colour.r, colour.g, colour.b) + end + else + --]] + + name:SetTextColor(1, .8, 0) + end + end + + local UpdateTextStringColour = function(statusbar) + local _, class = UnitClass'player' + local n = statusbar:GetName() + for _, t in pairs( + { + statusbar.TextString, + statusbar.LeftText, + statusbar.RightText, + } + ) do + if t and n == 'PlayerFrameManaBar' then + AddManaTextColour(t, class, UnitPowerType'player') + elseif t and (n == 'PlayerFrameHealthBar' or n == 'TargetFrameHealthBar') then + AddHealthTextColour(t, statusbar) + end + end + end + + local CheckClassification = function(self) + + local classification = UnitClassification(self.unit) + + for _, v in pairs( + { + self.Elite, + self.Rare + } + ) do + v:Hide() + end + + self.borderTexture:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame]] + + if classification == 'worldboss' or classification == 'elite' or classification == 'rareelite' then + self.Elite:Show() + elseif classification == 'rare' then + self.Rare:Show() + end + end + + local UpdateToT = function(self, elapsed) + local _, class = UnitClass'targettarget' + local colour = RAID_CLASS_COLORS[class] + local name = UnitName'targettarget' + + TargetFrameToTTextureFrameName:SetTextColor(1, .8, 0) + + TargetFrameToTTextureFrameName:ClearAllPoints() + TargetFrameToTTextureFrameName:SetPoint('BOTTOMLEFT', TargetFrameToTTextureFrame, 49, 0) + end + + local function OnEvent(self, event) + if not MODUI_VAR['elements']['unit'].enable then return end + + if event == 'PLAYER_LOGIN' then + if MODUI_VAR['elements']['unit'].player then + AddPlayerFrame() + end + + if MODUI_VAR['elements']['unit'].target then + AddTargetFrame() + end + + if MODUI_VAR['elements']['unit'].tot then + AddToTFrame() + -- TargetFrameToT:HookScript('OnUpdate', UpdateToT) tainting i think + end + + if MODUI_VAR['elements']['unit'].rcolour then + hooksecurefunc('TargetFrame_CheckClassification', CheckClassification) + end + + if MODUI_VAR['elements']['unit'].vcolour then + hooksecurefunc('TextStatusBar_UpdateTextString', UpdateTextStringColour) + end + + if MODUI_VAR['elements']['unit'].auras then + hooksecurefunc('TargetFrame_UpdateAuras', AddAuraDuration) + end + end + + if event == 'UNIT_SPELLCAST_START' or event == 'UNIT_SPELLCAST_CHANNEL_START' then + if MODUI_VAR['elements']['unit'].castbar then + UpdateCastingBar(event == 'UNIT_SPELLCAST_CHANNEL_START' and true or false) + end + end + + if MODUI_VAR['elements']['unit'].target then + UpdateTargetNameClassColour() + end + + if MODUI_VAR['elements']['unit'].party then + AddPartyPets() + if not InCombatLockdown() then UpdatePartyTextClassColour() end + end + + + PlayerFrameGroupIndicator:Hide() + end + + local e = CreateFrame'Frame' + for _, v in pairs(events) do e:RegisterEvent(v) end + e:SetScript('OnEvent', OnEvent) + + + hooksecurefunc("PlayerFrame_UpdateStatus", function() + if IsResting("player") then + PlayerStatusTexture:Hide() + PlayerRestIcon:Hide() + PlayerRestGlow:Hide() + PlayerStatusGlow:Hide() + elseif PlayerFrame.inCombat then + PlayerStatusTexture:Hide() + PlayerAttackIcon:Hide() + PlayerRestIcon:Hide() + PlayerAttackGlow:Hide() + PlayerRestGlow:Hide() + PlayerStatusGlow:Hide() + PlayerAttackBackground:Hide() + end + end) + + hooksecurefunc("TextStatusBar_UpdateTextStringWithValues",function(statusFrame, _, value, valueMin, valueMax) + + local leftText = statusFrame.LeftText + local rightText = statusFrame.RightText + + if leftText then + leftText:SetText('') + end + + + if statusFrame==TargetFrameHealthBar then + local v, max, found = LCMH:GetUnitHealth'target' + if not found then + v = v .. '%' + end + rightText:SetText(v) + end + + end) + -- From 12b0b6241a901079f19231eaaf528c9eeb1f46aa Mon Sep 17 00:00:00 2001 From: novikmisha Date: Mon, 28 Mar 2022 20:12:13 +0300 Subject: [PATCH 12/22] push some changes remove not used functionality, fix API changes --- .gitignore | 0 actionbar/bars.lua | 396 -- actionbar/keypress.lua | 99 - aura/aura.lua | 17 +- bag/bag/bag.lua | 225 -- bag/bank/bank.lua | 143 - bag/button.lua | 123 - bag/menu.lua | 105 - bag/tools/greys.lua | 54 - bag/tools/sort.lua | 55 - bag/update.lua | 378 -- castbars/enemy.lua | 492 --- chat/chat.lua | 2 +- core/skins.lua | 36 +- core/tables.lua | 2720 +------------ .../LibClassicCasterino.lua | 3531 ----------------- .../LibClassicDurations.xml | 7 - .../LibClassicDurations/classAbilities.lua | 1133 ------ libraries/LibClassicDurations/core.lua | 1154 ------ .../diminishingReturns.lua | 176 - .../LibClassicDurations/npcAbilities.lua | 576 --- .../LibClassicMobHealth.lua | 525 --- libraries/init.xml | 3 - menu/menu.lua | 19 - minimap/minimap.lua | 10 +- modui_classic.toc | 29 +- nameplate/aura.lua | 8 - options/options.lua | 10 +- talents/talents.lua | 2 +- theme/addons/LeatrixPlus.lua | 0 theme/addons/WideQuestLog.lua | 0 theme/theme.lua | 22 +- tooltip/layout.lua | 55 +- unit/unit.lua | 436 +- 34 files changed, 264 insertions(+), 12277 deletions(-) mode change 100644 => 100755 .gitignore delete mode 100755 actionbar/bars.lua delete mode 100755 actionbar/keypress.lua delete mode 100755 bag/bag/bag.lua delete mode 100755 bag/bank/bank.lua delete mode 100755 bag/button.lua delete mode 100755 bag/menu.lua delete mode 100755 bag/tools/greys.lua delete mode 100755 bag/tools/sort.lua delete mode 100755 bag/update.lua delete mode 100755 castbars/enemy.lua delete mode 100644 libraries/LibClassicCasterino/LibClassicCasterino.lua delete mode 100644 libraries/LibClassicDurations/LibClassicDurations.xml delete mode 100644 libraries/LibClassicDurations/classAbilities.lua delete mode 100644 libraries/LibClassicDurations/core.lua delete mode 100644 libraries/LibClassicDurations/diminishingReturns.lua delete mode 100644 libraries/LibClassicDurations/npcAbilities.lua delete mode 100755 libraries/LibClassicMobHealth/LibClassicMobHealth.lua mode change 100644 => 100755 theme/addons/LeatrixPlus.lua mode change 100644 => 100755 theme/addons/WideQuestLog.lua diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/actionbar/bars.lua b/actionbar/bars.lua deleted file mode 100755 index 4879beb..0000000 --- a/actionbar/bars.lua +++ /dev/null @@ -1,396 +0,0 @@ - - - local _, ns = ... - - local n = { - 'Action', - 'MultiBarBottomLeft', - 'MultiBarBottomRight', - 'MultiBarLeft', - 'MultiBarRight', - } - - local x = { - 'Pet', - 'Stance', - } - - local h = { - 'MultiBarLeft', - 'MultiBarRight', - } - - local events = { - 'PLAYER_LOGIN', - 'PLAYER_XP_UPDATE', - 'UPDATE_EXHAUSTION', - 'PLAYER_LEVEL_UP' - } - - local MoveBars = function() - if not InCombatLockdown() then - MultiBarBottomLeft:ClearAllPoints() - MultiBarBottomLeft:SetPoint('BOTTOMLEFT', ActionButton1, 'TOPLEFT', 0, 23) - - MultiBarBottomLeftButton1:ClearAllPoints() - MultiBarBottomLeftButton1:SetPoint('BOTTOMLEFT', ActionButton1, 'TOPLEFT', 0, ReputationWatchBar:IsShown() and 30 or 23) - - MultiBarBottomRight:SetPoint('LEFT', MultiBarBottomLeft, 'RIGHT', 43, 6) - - SlidingActionBarTexture0:ClearAllPoints() - SlidingActionBarTexture0:SetPoint('TOPLEFT', PetActionButton1, -34, 12) - - MultiBarBottomRightButton7:ClearAllPoints() - MultiBarBottomRightButton7:SetPoint('BOTTOMLEFT', MultiBarBottomRightButton1, 'TOPLEFT', 0, ReputationWatchBar:IsShown() and 31 or 24) - - PetActionButton1:ClearAllPoints() - PetActionButton1:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, 8) - - MainMenuBarVehicleLeaveButton:ClearAllPoints() - MainMenuBarVehicleLeaveButton:SetPoint('BOTTOM', MainMenuBarBackpackButton, 'TOP', -5, 30) - end - end - - local SetBarLength = function(shorten) - local bar = _G['modui_mainbar'] - - ActionBarUpButton:ClearAllPoints() - ActionBarUpButton:SetPoint('LEFT', ActionButton12, 'RIGHT', -1, 10) - - ActionBarDownButton:ClearAllPoints() - ActionBarDownButton:SetPoint('TOP', ActionBarUpButton, 'BOTTOM', 0, 10) - - MainMenuBarPageNumber:ClearAllPoints() - MainMenuBarPageNumber:SetPoint('LEFT', ActionBarUpButton, 'RIGHT', -2, -10) - - if shorten then - MainMenuExpBar:SetSize(760, 8) - ReputationWatchBar:SetSize(760, 6) - ReputationWatchBar.StatusBar:SetSize(760, 6) - ExhaustionLevelFillBar:SetSize(760, 6) - bar.t:SetTexture[[Interface/Addons/modui_classic/art/mainbar/ActionBarArtLarge]] - bar.t:SetPoint('BOTTOM', -111, -11) - bar.caps:SetSize(950, 64) - ActionButton1:ClearAllPoints() - ActionButton1:SetPoint('BOTTOMLEFT', MainMenuBarArtFrame, 120, 7) - else - MainMenuExpBar:SetSize(500, 8) - ReputationWatchBar:SetSize(500, 6) - ReputationWatchBar.StatusBar:SetSize(500, 6) - ExhaustionLevelFillBar:SetSize(500, 6) - bar.t:SetTexture[[Interface/Addons/modui_classic/art/mainbar/ActionBarArtSmall]] - bar.t:SetPoint('BOTTOM', -237, -11) - bar.caps:SetSize(700, 64) - ActionButton1:ClearAllPoints() - ActionButton1:SetPoint('BOTTOMLEFT', MainMenuBarArtFrame, 245, 7) - end - end - - local UpdateWatchbar = function() - if not ReputationWatchBar:IsShown() then return end - local _, index = GetWatchedFactionInfo() - local min, max = ReputationWatchBar.StatusBar:GetMinMaxValues() - local v = ReputationWatchBar.StatusBar:GetValue() - local x = (v/max)*ReputationWatchBar.StatusBar:GetWidth() - local colour = FACTION_BAR_COLORS[index] - - ReputationWatchBar:ClearAllPoints() - ReputationWatchBar:SetPoint('BOTTOMLEFT', MainMenuExpBar, 'TOPLEFT') - ReputationWatchBar:SetPoint('BOTTOMRIGHT', MainMenuExpBar, 'TOPRIGHT') - - ReputationWatchBar.spark:SetPoint('CENTER', ReputationWatchBar.StatusBar, 'LEFT', x, 2) - ReputationWatchBar.spark:SetVertexColor(colour.r, colour.g, colour.b) - - ReputationWatchBar:HookScript('OnShow', MoveBars) - ReputationWatchBar:HookScript('OnHide', MoveBars) - end - - local UpdateExhaustion = function() - local xp, max = UnitXP'player', UnitXPMax'player' - local threshold = GetXPExhaustion() - if threshold then - local x = ((xp + threshold)/max)*MainMenuExpBar:GetWidth() - ExhaustionTick:SetPoint('CENTER', MainMenuExpBar, 'LEFT', x, 0) - end - end - - local HideMaxXP = function() - for i = 0, 3 do - local t = _G['MainMenuMaxLevelBar'..i] - t:SetTexture'' - t:Hide() - end - end - - local UpdateXP = function() - local xp, max = UnitXP'player', UnitXPMax'player' - local x = (xp/max)*MainMenuExpBar:GetWidth() - local rest = GetRestState() - UpdateExhaustion() - if _G['modui_mainbar'] then - HideMaxXP() - MainMenuExpBar.spark:SetPoint('CENTER', MainMenuExpBar, 'LEFT', x, 2) - if rest == 1 then - MainMenuExpBar.spark:SetVertexColor(0*1.5, .39*1.5, .88*1.5, 1) - elseif rest == 2 then - MainMenuExpBar.spark:SetVertexColor(.58*1.5, 0*1.5, .55*1.5, 1) - end - end - end - - local UpdatePetBar = function() - SlidingActionBarTexture0:ClearAllPoints() - SlidingActionBarTexture0:SetPoint('BOTTOMLEFT', PetActionButton1, -14, -2) - - PetActionBarFrame:ClearAllPoints() - PetActionButton1:ClearAllPoints() - if MODUI_VAR['elements']['mainbar'].horiz and not MODUI_VAR['elements']['mainbar'].enable then - PetActionBarFrame:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, MultiBarRight:IsShown() and 56 or MultiBarBottomLeft:IsShown() and 8 or -40) - PetActionButton1:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, MultiBarRight:IsShown() and 56 or MultiBarBottomLeft:IsShown() and 8 or -40) - else - PetActionBarFrame:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, MultiBarBottomLeft:IsShown() and 8 or -40) - PetActionButton1:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, MultiBarBottomLeft:IsShown() and 8 or -40) - end - end - - local UpdateStanceBar = function() - StanceBarLeft:ClearAllPoints() - StanceBarLeft:SetPoint('BOTTOMLEFT', StanceButton1, -14, -2) - StanceButton1:ClearAllPoints() - if MODUI_VAR['elements']['mainbar'].horiz and not MODUI_VAR['elements']['mainbar'].enable then - StanceButton1:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, MultiBarRight:IsShown() and 56 or MultiBarBottomLeft:IsShown() and 8 or -40) - else - StanceButton1:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 20, MultiBarBottomLeft:IsShown() and 8 or -40) - end - end - - local UpdatePetStance = function() - if not InCombatLockdown() then - UpdatePetBar() - UpdateStanceBar() - end - end - - local UpdateBars = function() - SetBarLength(MultiBar2_IsVisible() and true or false) - UpdateXP() - UpdateWatchbar() - UpdatePetStance() - end - - local AddXP = function() - for i = 0, 3 do - _G['MainMenuXPBarTexture'..i]:Hide() - ReputationWatchBar.StatusBar['WatchBarTexture'..i]:SetAlpha(0) - if MODUI_VAR['elements']['mainbar'].enable then - _G['MainMenuBarTexture'..i]:Hide() - end - end - - ReputationWatchBar:SetSize(1024, 6) - ReputationWatchBar.StatusBar:SetSize(1024, 6) - - ReputationWatchBar.spark = ReputationWatchBar:CreateTexture(nil, 'OVERLAY', nil, 7) - ReputationWatchBar.spark:SetTexture[[Interface\CastingBar\UI-CastingBar-Spark]] - ReputationWatchBar.spark:SetSize(35, 35) - ReputationWatchBar.spark:SetBlendMode'ADD' - - MainMenuExpBar:SetSize(1024, 6) - MainMenuExpBar:ClearAllPoints() - MainMenuExpBar:SetPoint('BOTTOM', 0, MODUI_VAR['elements']['mainbar'].enable and 49 or 40) - - MainMenuExpBar.spark = MainMenuExpBar:CreateTexture(nil, 'OVERLAY', nil, 7) - MainMenuExpBar.spark:SetTexture[[Interface\CastingBar\UI-CastingBar-Spark]] - MainMenuExpBar.spark:SetVertexColor(.58*1.5, 0*1.5, .55*1.5, 1) - MainMenuExpBar.spark:SetSize(35, 35) - MainMenuExpBar.spark:SetBlendMode'ADD' - - MainMenuExpBar.sb = MainMenuExpBar:CreateTexture(nil, 'BACKGROUND', nil, -7) - ns.SB(MainMenuExpBar.sb) - MainMenuExpBar.sb:SetPoint('TOPLEFT', 0, -1) - MainMenuExpBar.sb:SetPoint'BOTTOMRIGHT' - MainMenuExpBar.sb:SetVertexColor(.5, .5, .5) - - MainMenuExpBar.t = MainMenuExpBar:CreateTexture(nil, 'BACKGROUND') - ns.BD(MainMenuExpBar.t, 1, -.5) - MainMenuExpBar.t:SetHeight(1) - MainMenuExpBar.t:SetPoint('BOTTOMLEFT', MainMenuExpBar, 'TOPLEFT') - MainMenuExpBar.t:SetPoint('BOTTOMRIGHT', MainMenuExpBar, 'TOPRIGHT') - - hooksecurefunc('MainMenuTrackingBar_Configure', UpdateWatchbar) - hooksecurefunc('MainMenuBar_UpdateExperienceBars', UpdateWatchbar) - end - - local AddButtonSkin = function() - for _, v in pairs(n) do - for i = 1, 12 do - local bu = _G[v..'Button'..i] - if bu then - ns.BU(bu, .75, true, bu:GetHeight() - 2.25, bu:GetWidth() - 2.25) - ns.BUBorder(bu) - ns.BUElements(bu) - end - end - end - for _, v in pairs(x) do - for i = 1, 10 do - local bu = _G[v..'Button'..i] - if bu then - ns.BU(bu, .75, true, bu:GetHeight() - 2.25, bu:GetWidth() - 2.25) - ns.BUBorder(bu) - ns.BUElements(bu) - end - end - end - end - - local AddBars = function() - local bar = CreateFrame('Frame', 'modui_mainbar', MainMenuBar) - bar:SetSize(1024, 128) - bar:SetPoint'BOTTOM' - - bar.t = bar:CreateTexture(nil, 'BACKGROUND') - bar.t:SetAllPoints() - tinsert(ns.skin, bar.t) - - bar.caps = CreateFrame('Frame', 'modui_endcaps', UIParent) - bar.caps:SetPoint('BOTTOM', bar) - bar.caps:SetFrameLevel(1) - - AddXP() - - MainMenuBarVehicleLeaveButton:SetSize(28, 28) - ns.BUBorder(MainMenuBarVehicleLeaveButton, MainMenuBarVehicleLeaveButton:GetWidth() - 10, MainMenuBarVehicleLeaveButton:GetWidth() - 2, 3.5, 6) - - for _, v in pairs(n) do - for i = 1, 12 do - local bu = _G[v..'Button'..i] - if bu then - -- TODO: all our placement needs *MAJOR* streamlining - -- but i dont have time rn - if v == 'MultiBarBottomRight' then - if i == 1 then - bu:ClearAllPoints() - bu:SetPoint('LEFT', ActionButton12, 'RIGHT', 46, 0) - end - end - - if i > 1 then - bu:ClearAllPoints() - -- pixel... - if v == 'MultiBarRight' or v == 'MultiBarLeft' then - bu:SetPoint('TOP', _G[v..'Button'..(i - 1)], 'BOTTOM', 0, -8.5) - else - bu:SetPoint('LEFT', _G[v..'Button'..(i - 1)], 'RIGHT', 8.5, 0) - end - -- PERFECTION! - if i == 7 and v == 'MultiBarBottomRight' then - bu:ClearAllPoints() - bu:SetPoint('BOTTOMLEFT', _G[v..'Button1'], 'TOPLEFT', 0, 17) - end - end - end - end - end - - for i, v in pairs(n) do - if i > 1 then -- skip 'action' - local bar = _G[v] - bar:HookScript('OnShow', UpdateBars) - bar:HookScript('OnHide', UpdateBars) - end - end - - for _, v in pairs( - { - MultiBarBottomLeft, - PetActionBarFrame, - StanceBarFrame, - } - ) do - UIPARENT_MANAGED_FRAME_POSITIONS.v = nil - end - - for _, v in pairs( - { - MainMenuBarLeftEndCap, - MainMenuBarRightEndCap, - -- fuck em, im just hiding these textures - -- until i can be bothered to level hunter - SlidingActionBarTexture0, - SlidingActionBarTexture1, - } - ) do - v:Hide() - end - - hooksecurefunc('MultiActionBar_Update', MoveBars) - hooksecurefunc('ActionBarController_UpdateAll', UpdateBars) - hooksecurefunc('ShowPetActionBar', UpdatePetBar) - end - - local AddHorizBars = function() - for _, v in pairs(h) do - for i = 1, 12 do - local bu = _G[v..'Button'..i] - if v == 'MultiBarRight' then - if i == 1 then - bu:ClearAllPoints() - bu:SetPoint('BOTTOMLEFT', MultiBarBottomLeftButton1, 'TOPLEFT', 0, 8) - else - bu:ClearAllPoints() - bu:SetPoint('LEFT', _G[v..'Button'..(i - 1)], 'RIGHT', 6, 0) - end - else - if i == 1 then - bu:ClearAllPoints() - bu:SetPoint('BOTTOMLEFT', MultiBarBottomRightButton1, 'TOPLEFT', 0, 8) - else - bu:ClearAllPoints() - bu:SetPoint('LEFT', _G[v..'Button'..(i - 1)], 'RIGHT', 6, 0) - end - end - end - end - for i, v in pairs(n) do - if i > 1 then - local bar = _G[v] - bar:HookScript('OnShow', UpdatePetStance) - bar:HookScript('OnHide', UpdatePetStance) - end - end - hooksecurefunc('ActionBarController_UpdateAll', UpdatePetStance) - hooksecurefunc('ShowPetActionBar', UpdatePetBar) - end - - local HideKeyBind = function() - for i=1,12 do _G['ActionButton'..i..'HotKey']:SetAlpha(0) end - end - - local OnEvent = function(self, event) - if MODUI_VAR['elements']['mainbar'].enable then - if event == 'PLAYER_LOGIN' then - AddBars() - AddButtonSkin() - MoveBars() - UpdateBars() - else - UpdateXP() - end - elseif MODUI_VAR['elements']['mainbar'].xp then - AddXP() - UpdateXP() - end - if MODUI_VAR['elements']['mainbar'].horiz and not MODUI_VAR['elements']['mainbar'].enable then - AddHorizBars() - end - end - - HideKeyBind() - - local e = CreateFrame'Frame' - for _, v in pairs(events) do e:RegisterEvent(v) end - e:SetScript('OnEvent', OnEvent) - - - -- diff --git a/actionbar/keypress.lua b/actionbar/keypress.lua deleted file mode 100755 index 7e91bfb..0000000 --- a/actionbar/keypress.lua +++ /dev/null @@ -1,99 +0,0 @@ - - - local _, ns = ... - - local time = nil - - local SetButtonColour = function(self, r, g, b) - for i = 1, 4 do - self.bo[i]:SetVertexColor(r, g, b) - end - end - - local AddBorderColour = function(self, newtime) - if self:GetChecked() then - self.checked = true - SetButtonColour(self, 255/255, 240/255, 0/255) - end - if self.keypress then - local i = (newtime - self.keypress)*5 - SetButtonColour(self, .3*i, .3*i, .3*i) - end - if self.checked and not self:GetChecked() then - SetButtonColour(self, MODUI_VAR['theme_bu'].r, MODUI_VAR['theme_bu'].g, MODUI_VAR['theme_bu'].b) - self.checked = nil - end - if self.keypress and newtime > (self.keypress + .4) then - SetButtonColour(self, MODUI_VAR['theme_bu'].r, MODUI_VAR['theme_bu'].g, MODUI_VAR['theme_bu'].b) - self.keypress = nil - end - end - - local AddPetBorderColour = function() - for i = 1, 10 do - local bu = _G['PetActionButton'..i] - local _, _, _, _, active = GetPetActionInfo(i) - if active then - SetButtonColour(bu, 255/255, 240/255, 0/255) - else - SetButtonColour(bu, MODUI_VAR['theme_bu'].r, MODUI_VAR['theme_bu'].g, MODUI_VAR['theme_bu'].b) - end - end - end - - local AddKeyDown = function(bu) - if not bu.keydown then - local buttontype = string.upper(bu:GetName()) or bu:GetAttribute'binding' - buttontype = replace(buttontype, 'BOTTOMLEFT', '1') - buttontype = replace(buttontype, 'BOTTOMRIGHT', '2') - buttontype = replace(buttontype, 'RIGHT', '3') - buttontype = replace(buttontype, 'LEFT', '4') - buttontype = replace(buttontype, 'MULTIBAR', 'MULTIACTIONBAR') - - local key = GetBindingKey(buttontype) - if key then - bu:RegisterForClicks'AnyDown' - SetOverrideBinding(bu, true, key, 'CLICK '..bu:GetName()..':LeftButton') - end - - bu.keydown = true - end - end - - local ButtonDown = function(id) - local time = GetTime() - local bu = GetActionButtonForID(id) - if bu:GetButtonState() == 'PUSHED' then - bu.keypress = time - end - end - - local OnUpdate = function(self, elapsed) - if self.bo then - AddBorderColour(self, GetTime()) - end - end - - local PetOnUpdate = function(self, elapsed) - if self.bo then - AddPetBorderColour(self, GetTime()) - end - end - - local OnEvent = function(self, event) - hooksecurefunc('ActionButtonDown', ButtonDown) - hooksecurefunc('ActionButton_OnUpdate', OnUpdate) - hooksecurefunc('PetActionBarFrame_OnUpdate', PetOnUpdate) - - if MODUI_VAR['elements']['mainbar'].keypress then - hooksecurefunc('ActionButton_Update', AddKeyDown) - end - - end - - local e = CreateFrame'Frame' - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - - -- diff --git a/aura/aura.lua b/aura/aura.lua index 912e22d..d4d76e6 100755 --- a/aura/aura.lua +++ b/aura/aura.lua @@ -13,7 +13,7 @@ minHeight = 100, x = -38, y = 0, - wrapAfter = 12, + wrapAfter = 10, wrapY = -50, direction = '+', position = { @@ -38,7 +38,7 @@ Minimap, 'TOPLEFT', -200, - -330, + -370, }, }, ['weapons|NA'] = { @@ -57,7 +57,7 @@ local h, m, s, text if time <= 0 then text = '' - elseif time < 3600 and time > 60 then + elseif time > 60 then h = floor(time/3600) m = floor(mod(time, 3600)/60 + 1) s = mod(time, 60) @@ -66,9 +66,6 @@ m = floor(time/60) s = mod(time, 60) text = m == 0 and format('|cffffffff%d|rs', s) - else - h = floor(time/3600 + 1) - text = format('|cffffffff%d|rh', h) end return text end @@ -122,6 +119,7 @@ local name, icon, count, dtype, duration, expiration = UnitAura(unit, index, filter) if name then self:SetNormalTexture(icon) + self.Count:SetText(count > 1 and count or '') self.debuff = false @@ -178,14 +176,13 @@ end local AddButton = function(self, name, bu) - --print(name) if name:match'^child' or name:find'tempenchant' then bu:SetScript('OnUpdate', OnUpdate) bu:SetScript('OnAttributeChanged', OnAttributeChanged) - bu.F = CreateFrame('Frame', nil, bu) - bu.F:SetAllPoints() ns.BD(bu) + bu.F = CreateFrame('Frame', nil, bu, "BackdropTemplate") + bu.F:SetAllPoints() ns.BUBorder(bu.F, 20) for i = 1, 4 do @@ -212,7 +209,7 @@ count:SetJustifyH'CENTER' count:SetPoint('CENTER', bu, 'TOP', 0, 2) - local sb = CreateFrame('StatusBar', nil, bu) + local sb = CreateFrame('StatusBar', nil, bu, "BackdropTemplate") ns.BD(sb, 1, -2) ns.SB(sb) sb:SetHeight(5) diff --git a/bag/bag/bag.lua b/bag/bag/bag.lua deleted file mode 100755 index e4470ee..0000000 --- a/bag/bag/bag.lua +++ /dev/null @@ -1,225 +0,0 @@ - - - local _, ns = ... - - local FONT_REGULAR = ns.FONT_REGULAR - local e = CreateFrame'Frame' - - local AddSparkle = function(bu) - bu.sparkle = CreateFrame('Button', bu:GetName()..'sparkle', bu, 'AutoCastShineTemplate') - bu.sparkle:RegisterForClicks'NONE' - bu.sparkle:SetAllPoints() - bu.sparkle:Hide() - end - - local ToggleSparkle = function(i, j, enter) - local bu = _G['ContainerFrame'..i..'Item'..j] - - if not bu.sparkle then AddSparkle(bu) end - - if enter then - bu.sparkle:SetFrameStrata'HIGH' - bu.sparkle:Show() - AutoCastShine_AutoCastStart(bu.sparkle, 0, 1, 0) - else - bu.sparkle:SetFrameStrata'LOW' - bu.sparkle:Hide() - AutoCastShine_AutoCastStop(bu.sparkle) - end - end - - local IterateForSparkle = function(self, enter) - if self.isMainBag then - for j = 1, GetContainerNumSlots(0) do - ToggleSparkle(1, j, enter) - end - else - local id = self:GetID() - CharacterBag0Slot:GetID() + 1 - for i = 1, NUM_CONTAINER_FRAMES do - local frame = _G['ContainerFrame'..i] - if frame:GetID() == id then - for j = 1, GetContainerNumSlots(id) do - ToggleSparkle(i, j, enter) - end - end - end - end - end - - local OnEnter = function(self) - if _G['modbag']:IsShown() then - self.isMainBag = true - IterateForSparkle(self, true) - end - end - - local OnLeave = function(self) - IterateForSparkle(self, false) - end - - local ShowBags = function(self) - for i = 0, 3 do - local s = _G['CharacterBag'..i..'Slot'] - s:SetAlpha(1) - s:EnableMouse(true) - end - end - - local HideBags = function(self) - for i = 0, 3 do - local s = _G['CharacterBag'..i..'Slot'] - s:SetAlpha(0) - s:EnableMouse(false) - end - end - - local UpdateSlot = function(self) - if MODUI_VAR['elements']['mainbar'].enable then - self:SetSize(18, 12) - _G[self:GetName()..'IconTexture']:SetTexCoord(.1, .9, .2, .8) - end - end - - local AddBag = function() - local bag = CreateFrame('Frame', 'modbag', UIParent, 'ButtonFrameTemplate') - bag:SetPoint('BOTTOMRIGHT', -120, 150) - bag:SetFrameLevel(3) - bag:Hide() - for _, v in pairs({bag:GetRegions()}) do tinsert(ns.skin, v) end - - bag.portrait = bag:CreateTexture(nil, 'BORDER', nil, 7) - bag.portrait:SetSize(64, 64) - bag.portrait:SetPoint('TOPLEFT', -8, 8) - bag.portrait:SetAlpha(1) - SetPortraitToTexture(bag.portrait, [[Interface\ICONS\Inv_misc_bag_08]]) - - bag.name = bag:CreateFontString(nil, 'OVERLAY', 'GameFontNormal') - bag.name:SetFont(FONT_REGULAR, 10) - bag.name:SetText'Bag' - bag.name:SetPoint('TOPLEFT', 63, -6) - bag.name:SetTextColor(1, .7, 0) - - bag.bd = CreateFrame('Frame', nil, bag) - ns.BD(bag.bd) - bag.bd:SetPoint('TOPLEFT', 8, -58) - bag.bd:SetPoint('BOTTOMRIGHT', -10, 27) - - bag.bd.t = bag.bd:CreateTexture(nil, 'ARTWORK') - bag.bd.t:SetAllPoints() - bag.bd.t:SetTexture([[Interface/Garrison/ClassHallBackground]], true, true) - bag.bd.t:SetHorizTile(true) - bag.bd.t:SetVertTile(true) - bag.bd.t:SetVertexColor(.8, .8, .8) - - bag.topstrip = CreateFrame('Frame', nil, bag) - bag.topstrip:SetHeight(25) - bag.topstrip:SetPoint('TOPLEFT', bag, 60, -28) - bag.topstrip:SetPoint('TOPRIGHT', -10, -28) - - local money = ContainerFrame1MoneyFrame - money:SetParent(bag) - money:ClearAllPoints() - money:SetPoint('BOTTOMRIGHT', 0, 7) - money:SetFrameStrata'MEDIUM' - money:SetFrameLevel(3) - - --[[ - -- https://us.forums.blizzard.com/en/wow/t/key-ring-in-classic/253354/19 - KeyRingButton:SetSize(39, 18) - KeyRingButton:SetParent(bag) - KeyRingButton:ClearAllPoints() - KeyRingButton:SetPoint('BOTTOMLEFT', bag, 6, 3) - KeyRingButton:SetFrameLevel(4) - KeyRingButton:GetNormalTexture():SetTexCoord(.61,0,0,0,.61,.59,0,.59) - KeyRingButton:GetPushedTexture():SetTexCoord(.61,0,0,0,.61,.59,0,.59) - KeyRingButton:SetHighlightTexture'' - ]] - - for _, v in pairs( - { - ContainerFrame1MoneyFrameCopperButtonText, - ContainerFrame1MoneyFrameSilverButtonText, - ContainerFrame1MoneyFrameGoldButtonText - } - ) do - v:SetFont(FONT_REGULAR, 10, 'OUTLINE') - v:SetShadowOffset(0, 0) - end - - MainMenuBarBackpackButton:HookScript('OnEnter', OnEnter) - MainMenuBarBackpackButton:HookScript('OnLeave', OnLeave) - end - - local AddSlots = function() - for i = 0, 3 do - local bag = _G['modbag'] - local slot = _G['CharacterBag'..i..'Slot'] - local icon = _G['CharacterBag'..i..'SlotIconTexture'] - - slot:HookScript('OnEnter', function(self) - IterateForSparkle(self, true) - end) - - slot:HookScript('OnLeave', function(self) - IterateForSparkle(self, false) - end) - - if MODUI_VAR['elements']['onebag'].enable then - slot:SetScript('OnClick', nil) - end - - if MODUI_VAR['elements']['mainbar'].enable then - slot:UnregisterEvent'ITEM_PUSH' - slot:SetNormalTexture'' - slot:SetCheckedTexture'' - slot:SetHighlightTexture'' - slot:SetFrameStrata'MEDIUM' - slot:ClearAllPoints() - - ns.BD(slot) - ns.BDStone(slot, 5) - - slot.IconBorder:SetAlpha(0) - - -- not... the best - slot:HookScript('OnShow', UpdateSlot) - slot:HookScript('OnEvent', UpdateSlot) - - slot:SetParent(MODUI_VAR['elements']['onebag'].enable and bag.topstrip or ContainerFrame1) - if MODUI_VAR['elements']['onebag'].enable then - if i == 0 then - slot:SetPoint('RIGHT', bag.topstrip, 0, 3) - else - slot:SetPoint('RIGHT', _G['CharacterBag'..(i - 1)..'Slot'], 'LEFT', -9, 0) - end - else - if MODUI_VAR['elements']['mainbar'].enable then - slot:SetSize(18, 12) - end - slot:SetParent(ContainerFrame1) - if i == 0 then - slot:SetPoint('TOPRIGHT', ContainerFrame1, -20, -32) - else - slot:SetPoint('RIGHT', _G['CharacterBag'..(i - 1)..'Slot'], 'LEFT', -9, 0) - end - end - end - end - end - - local OnEvent = function(self, event) - if event == 'PLAYER_LOGIN' then - e:RegisterEvent'PLAYER_ENTERING_WORLD' - if MODUI_VAR['elements']['onebag'].enable then - AddBag() - end - elseif event == 'PLAYER_ENTERING_WORLD' then - AddSlots() - end - end - - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - - -- diff --git a/bag/bank/bank.lua b/bag/bank/bank.lua deleted file mode 100755 index ccb6291..0000000 --- a/bag/bank/bank.lua +++ /dev/null @@ -1,143 +0,0 @@ - - - local _, ns = ... - - local FONT_REGULAR = ns.FONT_REGULAR - - local AddSparkle = function(bu) - bu.sparkle = CreateFrame('Button', bu:GetName()..'sparkle', bu, 'SecureActionButtonTemplate, SecureHandlerStateTemplate, SecureHandlerEnterLeaveTemplate, AutoCastShineTemplate') - bu.sparkle:RegisterForClicks'NONE' - bu.sparkle:SetAllPoints() - bu.sparkle:Hide() - end - - local ToggleSparkle = function(self, isEnter) - local id = self:GetID() + NUM_BAG_SLOTS - for i = 1, NUM_CONTAINER_FRAMES do - local frame = _G['ContainerFrame'..i] - if frame:GetID() == id then - for j = 1, GetContainerNumSlots(frame:GetID()) do - local bu = _G['ContainerFrame'..i..'Item'..j] - - if not bu.sparkle then AddSparkle(bu) end - - if isEnter then - bu.sparkle:SetFrameStrata'HIGH' - bu.sparkle:Show() - AutoCastShine_AutoCastStart(bu.sparkle, .25*i, .2/i, .2/i) - else - bu.sparkle:SetFrameStrata'LOW' - bu.sparkle:Hide() - AutoCastShine_AutoCastStop(bu.sparkle) - end - end - end - end - end - - local AddBank = function() - local bag = _G['modbag'] - - local bank = CreateFrame('Button', 'modbank', UIParent, 'ButtonFrameTemplate') - bank:SetPoint('BOTTOMRIGHT', bag, 'BOTTOMLEFT', -20, 0) - bank:SetFrameLevel(5) - bank:Hide() - for _, v in pairs({bank:GetRegions()}) do tinsert(ns.skin, v) end - - bank.portrait = bank:CreateTexture(nil, 'BORDER', nil, 7) - bank.portrait:SetSize(64, 64) - bank.portrait:SetPoint('TOPLEFT', -8, 8) - bank.portrait:SetAlpha(1) - SetPortraitToTexture(bank.portrait, [[Interface\ICONS\Inv_misc_coin_02]]) - - bank.name = CreateFrame('Button', nil, bank) - bank.name:SetPoint('TOPLEFT', 65, -5) - - bank.name.t = bank.name:CreateFontString(nil, 'OVERLAY', 'GameFontNormal') - bank.name.t:SetText'Bank' - bank.name.t:SetAllPoints() - bank.name:SetSize(35, 12) - - bank.bd = CreateFrame('Frame', nil, bank) - ns.BD(bank.bd) - bank.bd:SetPoint('TOPLEFT', 8, -58) - bank.bd:SetPoint('BOTTOMRIGHT', -10, 27) - - bank.bd.t = bank.bd:CreateTexture(nil, 'ARTWORK') - bank.bd.t:SetAllPoints() - bank.bd.t:SetTexture([[Interface/BankFrame/Bank-Background]], true, true) - bank.bd.t:SetHorizTile(true) - bank.bd.t:SetVertTile(true) - bank.bd.t:SetVertexColor(.8, .8, .8) - tinsert(ns.skin, bank.bd.t) - - bank.space = CreateFrame('StatusBar', nil, bank.bd) - ns.SB(bank.space) - ns.BD(bank.space) - bank.space:SetHeight(5) - bank.space:SetPoint('TOPLEFT', bank, 9, -58) - bank.space:SetPoint('TOPRIGHT', bank, -10, -58) - bank.space:SetMinMaxValues(0, 100) - bank.space:SetValue(100) - bank.space:SetStatusBarColor(245/255, 172/255, 144/255) - - bank.purchase = CreateFrame('Button', 'modBankPurchase', bank, 'SmallMoneyFrameTemplate') - bank.purchase:SetSize(30, 20) - bank.purchase:SetPoint('BOTTOMRIGHT', bank, -10, 10) - bank.purchase:SetScale(.7) - SmallMoneyFrame_OnLoad(bank.purchase) - MoneyFrame_SetType(bank.purchase, 'STATIC') - - bank.purchase.t = bank.purchase:CreateFontString(nil, 'OVERLAY', 'NumberFontNormalRight') - bank.purchase.t:SetPoint('RIGHT', bank.purchase, 'LEFT', -6, 0) - bank.purchase.t:SetText'Buy New Bank Slot +' - - for i = 1, 6 do - local slot = BankSlotsFrame['Bag'..i] - local _, highlight = slot:GetChildren() - - ns.BD(slot) - ns.BDStone(slot, 5) - - slot:UnregisterEvent'ITEM_PUSH' - slot:SetNormalTexture'' - slot:SetHighlightTexture'' - slot:SetParent(bank) - slot:SetSize(16, 12) - slot:ClearAllPoints() - slot:SetParent(bank) - slot:SetFrameStrata'MEDIUM' - - slot.IconBorder:SetAlpha(0) - - slot.icon:SetTexCoord(.1, .9, .225, .775) - - if highlight then highlight:Hide() end - - if i == 1 then - slot:SetPoint('TOPRIGHT', bank, -15, -32) - else - slot:SetPoint('RIGHT', BankSlotsFrame['Bag'..(i - 1)], 'LEFT', -3, 0) - end - - slot:HookScript('OnEnter', function(self) - ToggleSparkle(self, true) - end) - slot:HookScript('OnLeave', function(self) - ToggleSparkle(self, false) - end) - end - end - - local OnEvent = function() - if MODUI_VAR['elements']['onebag'].enable then - AddBank() - end - end - - local e = CreateFrame'Frame' - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - - -- diff --git a/bag/button.lua b/bag/button.lua deleted file mode 100755 index 0d50fec..0000000 --- a/bag/button.lua +++ /dev/null @@ -1,123 +0,0 @@ - - - local _, ns = ... - - local FONT_REGULAR = ns.FONT_REGULAR - - local e = CreateFrame'Frame' - - local ColourBagBorders = function(bu, slotID, texture, rarity, type, quest) - local q = _G[bu:GetName()..'IconQuestTexture'] - local s = _G[bu:GetName()].searchOverlay - if bu.bo then - for i, v in pairs(bu.bo) do - if texture then - -- search - if s:IsShown() then - bu.bo[i]:SetVertexColor(1, 1, 1) - -- quest - elseif quest then - bu.bo[i]:SetVertexColor(248/255, 98/255, 86/255) - -- uncommon+ quality - elseif rarity and rarity >= 2 and BAG_ITEM_QUALITY_COLORS[rarity] then - local colour = BAG_ITEM_QUALITY_COLORS[rarity] - bu.bo[i]:SetVertexColor(colour.r*1.5, colour.g*1.5, colour.b*1.5) - elseif type > 0 then - bu.bo[i]:SetVertexColor(.4, .3, 0) - else - bu.bo[i]:SetVertexColor(MODUI_VAR['theme_bu'].r or 1, MODUI_VAR['theme_bu'].g or 1, MODUI_VAR['theme_bu'].b or 1) - end - else - if type > 0 then - bu.bo[i]:SetVertexColor(.4, .3, 0) - else - bu.bo[i]:SetVertexColor(.2, .2, .2) - end - end - end - end - end - - local ColourBankBorders = function(bu, name) - local q = bu['IconQuestTexture'] - if bu.bo then - -- quest - for i, v in pairs(bu.bo) do - if name then - if q and q:IsShown() then - bu.bo[i]:SetVertexColor(248/255, 98/255, 86/255) - -- uncommon+ - elseif bu.quality and bu.quality > 1 and BAG_ITEM_QUALITY_COLORS[bu.quality] then - local colour = BAG_ITEM_QUALITY_COLORS[bu.quality] - bu.bo[i]:SetVertexColor(colour.r, colour.g, colour.b) - else - bu.bo[i]:SetVertexColor(MODUI_VAR['theme_bu'].r or 1, MODUI_VAR['theme_bu'].g or 1, MODUI_VAR['theme_bu'].b or 1) - end - else - bu.bo[i]:SetVertexColor(.2, .2, .2) - end - end - end - end - - ns.ColourUpdate = function(frame) - local name = frame:GetName() - local id = frame:GetID() - for i = 1, frame.size do - local bu = _G[name..'Item'..i] - local itemID = GetContainerItemID(id, bu:GetID()) - local texture, _, _, rarity = GetContainerItemInfo(id, bu:GetID()) - local itemlink = GetContainerItemLink(id, bu:GetID()) - local quest = false - if itemlink then - local _, _, _, _, _, itemtype = GetItemInfo(itemlink) - if itemtype == TRANSMOG_SOURCE_2 then - quest = true - end - end - - local _, type = GetContainerNumFreeSlots(id) - ColourBagBorders(bu, itemID, texture, rarity, type, quest) - bu.IconBorder:Hide() - end - end - - ns.BankColourUpdate = function(bu) - local id = bu:GetID() - local container = bu:GetParent():GetID() - - if bu.isBag then container = -4 end - if container == 0 then return end -- stop colouring bags - - local _, _, _, _, _, _, ilink = GetContainerItemInfo(container, id) - bu.ilink = ilink - bu.quality = nil - - if bu.ilink then - bu.name, _, bu.quality = GetItemInfo(bu.ilink) - end - - ColourBankBorders(bu, bu.name) - end - - ns.AddButtonStyle = function(bu) - if bu and not bu.bo then - ns.BU(bu, 1, true) - ns.BUBorder(bu, 21) - ns.ItemElements(bu) - end - end - - local AddBankSlots = function() - for i = 1, 7 do - local bu = BankSlotsFrame['Bag'..i] - ns.BU(bu) - ns.BUElements(bu) - end - end - - hooksecurefunc('ContainerFrame_Update', ns.ColourUpdate) - hooksecurefunc('ContainerFrame_UpdateSearchResults', ns.ColourUpdate) - hooksecurefunc('BankFrameItemButton_Update', ns.BankColourUpdate) - - -- diff --git a/bag/menu.lua b/bag/menu.lua deleted file mode 100755 index 669903f..0000000 --- a/bag/menu.lua +++ /dev/null @@ -1,105 +0,0 @@ - - - local _, ns = ... - - local bu = MainMenuBarBackpackButton - - --_G['MicroButtonAndBagsBar']:Hide() - --_G['MicroButtonAndBagsBar']:UnregisterAllEvents() - - local ShowBags = function() - for i = 0, 3 do - local s = _G['CharacterBag'..i..'Slot'] - s:SetAlpha(1) - s:EnableMouse(true) - end - end - - local HideBags = function() - for i = 0, 3 do - local s = _G['CharacterBag'..i..'Slot'] - s:SetAlpha(0) - s:EnableMouse(false) - end - end - - local UpdateFreeSlots = function() - local free, total = 0, 0 - for i = BACKPACK_CONTAINER, NUM_BAG_SLOTS do - local slots, type = GetContainerNumFreeSlots(i) - if type == 0 then - free, total = free + slots, total + GetContainerNumSlots(i) - end - end - bu.space:SetMinMaxValues(0, total) - bu.space:SetValue(free) - MainMenuBarBackpackButtonCount:SetText'' - ns.GRADIENT_COLOUR(bu.space, free, 0, total) - end - - local AddBagMenu = function() - bu:SetParent(_G['modui_mainbar'].caps) - bu:ClearAllPoints() - bu:SetPoint('RIGHT', _G['modui_mainbar'].caps, -35, 0) - bu:SetSize(21, 21) - bu:GetNormalTexture():SetTexture'' - ns.BUElements(bu) - - bu.Count:ClearAllPoints() - bu.Count:SetPoint('BOTTOM', bu, 1, 0) - - bu.space = CreateFrame('StatusBar', 'modui_bagspace', bu) - ns.SB(bu.space) - bu.space:SetSize(22, 3) - bu.space:SetPoint('TOP', bu, 'BOTTOM', -2, -7) - bu.space:SetStatusBarColor(1, 1, 1) - bu.space:SetFrameLevel(bu:GetFrameLevel()) - bu.space:SetBackdrop( - {bgFile = [[Interface\Buttons\WHITE8x8]], - insets = { - left = -1, - right = -1, - top = -1, - bottom = -1, - } - } - ) - bu.space:SetBackdropColor(0, 0, 0) - - local mask = bu:CreateMaskTexture() - mask:SetTexture[[Interface\Minimap\UI-Minimap-Background]] - mask:SetPoint('TOPLEFT', -3, 3) - mask:SetPoint('BOTTOMRIGHT', 3, -3) - - bu:GetCheckedTexture():SetTexture'' - - MainMenuBarBackpackButtonIconTexture:AddMaskTexture(mask) - - if not bu.bo then - bu.bo = bu:CreateTexture(nil, 'OVERLAY') - bu.bo:SetSize(36, 36) - bu.bo:SetTexture[[Interface\Artifacts\Artifacts]] - bu.bo:SetPoint'CENTER' - bu.bo:SetTexCoord(.5, .58, .8775, .9575) - bu.bo:SetVertexColor(.6, .6, .6) - tinsert(ns.skinmenu, bu.bo) - end - end - - local OnEvent = function(self, event) - if MODUI_VAR['elements']['mainbar'].enable then - if MODUI_VAR['elements']['mainbar'].bagbutton then - AddBagMenu() - UpdateFreeSlots() - hooksecurefunc('MainMenuBarBackpackButton_UpdateFreeSlots', UpdateFreeSlots) - else - bu:Hide() - end - end - end - - local e = CreateFrame'Frame' - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - -- diff --git a/bag/tools/greys.lua b/bag/tools/greys.lua deleted file mode 100755 index 1499d2b..0000000 --- a/bag/tools/greys.lua +++ /dev/null @@ -1,54 +0,0 @@ - - - local _, ns = ... - - local AddSellShitButton = function() - local bag = _G['modbag'] - - local bu = CreateFrame('Button', nil, MerchantFrame, 'ActionButtonTemplate') - ns.BU(bu) - ns.BUBorder(bu, 16, 16) - bu:SetSize(17, 17) - bu:SetPoint('TOPLEFT', MerchantFrame, 70, -34) - bu:SetFrameStrata'MEDIUM' - bu:Hide() - - bu.i = bu:CreateTexture(nil, 'ARTWORK') - bu.i:SetAllPoints() - bu.i:SetTexture[[Interface\ICONS\inv_ore_tin_01]] - bu.i:SetTexCoord(.1, .9, .1, .9) - - bu:SetScript('OnEnter', function(self) - GameTooltip:SetOwner(self, 'ANCHOR_CURSOR') - GameTooltip:SetText'Sell Poor Quality Items & Rubbish' - GameTooltip:Show() - end) - - bu:SetScript('OnLeave', function() GameTooltip:Hide() end) - - bu:SetScript('OnClick', function() - for i = 0, 4 do - for j = 1, GetContainerNumSlots(i) do - local _, _, _, q = GetContainerItemInfo(i, j) - if q == LE_ITEM_QUALITY_POOR then - UseContainerItem(i, j) - end - end - end - end) - - MerchantFrame:HookScript('OnShow', function() bu:Show() end) - MerchantFrame:HookScript('OnHide', function() bu:Hide() end) - end - - local OnEvent = function() - if MODUI_VAR['elements']['onebag'].greys then - AddSellShitButton() - end - end - - local e = CreateFrame'Frame' - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - -- diff --git a/bag/tools/sort.lua b/bag/tools/sort.lua deleted file mode 100755 index 9057d96..0000000 --- a/bag/tools/sort.lua +++ /dev/null @@ -1,55 +0,0 @@ - - - local _, ns = ... - - local AddAutoSort = function() - local bag = _G['modbag'] or ContainerFrame1 - local bank = _G['modbank'] or BankFrame - - local sort = CreateFrame('Frame', 'modui_AutoSort', bag) - sort:SetSize(14, 12) - if MODUI_VAR['elements']['onebag'].enable then - sort:SetPoint('LEFT', bag.topstrip, 7, 4) - else - sort:SetPoint('TOPLEFT', ContainerFrame1, 50, -32) - end - ns.BDStone(sort, 5) - - sort.t = CreateFrame('Button', 'modui_AudioSortButton', sort) - sort.t:SetAllPoints() - ns.BD(sort.t) - - sort.t.icon = sort.t:CreateTexture(nil, 'OVERLAY') - sort.t.icon:SetAllPoints() - sort.t.icon:SetAtlas'bags-button-autosort-up' - sort.t.icon:SetTexCoord(.2, .8, .2, .8) - - sort.t:SetScript('OnEnter', function(self) - GameTooltip:SetOwner(self) - GameTooltip:SetText(BAG_CLEANUP_BAGS) - GameTooltip:Show() - end) - - sort.t:SetScript('OnLeave', GameTooltip_Hide) - - sort.t:SetScript('OnClick', function() - if bank:IsShown() then - SetSortBagsRightToLeft(true) - SortBankBags() - else - SetSortBagsRightToLeft(false) - SortBags() - end - end) - - end - - local OnEvent = function(self, event, ...) - AddAutoSort() - end - - local e = CreateFrame'Frame' - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - -- diff --git a/bag/update.lua b/bag/update.lua deleted file mode 100755 index 438071b..0000000 --- a/bag/update.lua +++ /dev/null @@ -1,378 +0,0 @@ - - - local _, ns = ... - - local size, spacing = 28, 9 - local buttons, bankbuttons = {}, {} - - --SetSortBagsRightToLeft(true) - -- SetInsertItemsLeftToRight(false) - - local grab_slots = function() - local numBags = 1 - for i = 1, NUM_BAG_FRAMES do - local bagName = 'ContainerFrame'..i + 1 - if _G[bagName]:IsShown() and not _G[bagName..'BackgroundTop']:GetTexture():find'Bank' then - numBags = numBags + 1 - end - end - return numBags - end - - local BagSpace = function() - local ct = 0 - for bag = 0, NUM_BAG_SLOTS do - for slot = 1, GetContainerNumSlots(bag) do - local link = GetContainerItemLink(bag, slot) - if not link then ct = ct + 1 end - end - end - return ct - end - - local BagMaxSpace = function() - local ct = 0 - for bag = 0, NUM_BAG_SLOTS do - for slot = 1, GetContainerNumSlots(bag) do - ct = ct + 1 - end - end - return ct - end - - local BankSpace = function() - local ct = 0 - for i = 1, 28 do - local id = BankButtonIDToInvSlotID(i) - local link = GetInventoryItemLink('player', id) - if not link then ct = ct + 1 end - end - for bag = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do - for slot = 1, GetContainerNumSlots(bag) do - local link = GetContainerItemLink(bag, slot) - if not link then ct = ct + 1 end - end - end - return ct - end - - local BankMaxSpace = function() - local ct = 28 -- account for standard bank slots - for bag = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do - for slot = 1, GetContainerNumSlots(bag) do - ct = ct + 1 - end - end - return ct - end - - local HideBags = function(bagName) - local bag = _G[bagName] - if not bag.stripped then - for i = 1, 7 do select(i, bag:GetRegions()):SetAlpha(0) end - bag:EnableMouse(false) - bag.ClickableTitleFrame:EnableMouse(false) - _G[bagName..'CloseButton']:Hide() - _G[bagName..'PortraitButton']:EnableMouse(false) - bag.stripped = true - end - end - - local HideBagSmall = function() - local hidden = nil - for i = 0, 3 do - local slot = _G['CharacterBag'..i..'Slot'] - if GetInventoryItemTexture('player', slot:GetID()) then - slot:Show() - else - slot:Hide() - hidden = true - end - end - --[[if hidden then - BagItemSearchBox:Hide() - else - BagItemSearchBox:Show() - end]] - end - - local AddBankSlotPurchase = function() - local bank = _G['modbank'] - local num, full = GetNumBankSlots() - local cost = GetBankSlotCost(num) - - bank.purchase:Hide() - - if not full then - bank.purchase:Show() - - _G['modBankPurchaseSilverButton']:Hide() - _G['modBankPurchaseCopperButton']:Hide() - - MoneyFrame_Update(bank.purchase, cost) - - bank.purchase:SetScript('OnClick', function() - --PlaySound'igMainMenuOption' - StaticPopup_Show'CONFIRM_BUY_BANK_SLOT' - end) - end - end - - local HideBank = function() - BankFrame:EnableMouse(false) - BankFrame:DisableDrawLayer'BACKGROUND' - BankFrame:DisableDrawLayer'BORDER' - BankFrame:DisableDrawLayer'OVERLAY' - - BankSlotsFrame:DisableDrawLayer'BORDER' - - --BankItemAutoSortButton:EnableMouse(false) - --BankItemAutoSortButton:SetAlpha(0) - - BankCloseButton:Hide() - BankPortraitTexture:SetTexture'' - - for _, v in pairs({BankFrame:GetRegions()}) do - if v:GetObjectType() == 'Texture' then - v:SetTexture'' - v:SetAlpha(0) - elseif v:GetObjectType() == 'FontString' then - v:SetText'' - v:Hide() - end - end - - for _, v in pairs({ - BankFrameCloseButton, - BankFrameMoneyFrame, - BankItemSearchBox, - BankPortraitTexture, - BankFramePurchaseInfo, - BankFrame.NineSlice - }) do - v:Hide() - end - end - - local HideReagentBank = function() - ReagentBankFrame:DisableDrawLayer'BACKGROUND' - ReagentBankFrame:DisableDrawLayer'BORDER' - ReagentBankFrame:DisableDrawLayer'ARTWORK' - ReagentBankFrame:DisableDrawLayer'OVERLAY' - end - - local HideBankArt = function() -- previously bankArtToggle(x) (we dont need x) - AddBankSlotPurchase() - HideBank() - --HideReagentBank() - - for _, v in pairs({BankFrameMoneyFrameInset, BankFrameMoneyFrameBorder}) do - v:Hide() - end - end - - local AddBG = function(bu) - bu.bg = bu:CreateTexture(nil, 'BACKGROUND', nil, 7) - bu.bg:SetTexture[[Interface\PaperDoll\UI-Backpack-EmptySlot]] - bu.bg:SetTexCoord(.1, .9, .1, .9) - bu.bg:SetAlpha(.5) - bu.bg:SetAllPoints() - end - - local bu, con, bag, col, row - local MoveButtons = function(table, frame) - local columns = ceil(sqrt(#table)) - col, row = 0, 0 - - for i = 1, #table do - bu = table[i] - bu:SetSize(size, size) - bu:ClearAllPoints() - bu:SetPoint('TOPLEFT', frame, col*(size + spacing) + 9, -1*row*(size + spacing) - 58) - - if not bu.bg then AddBG(bu) end - - if col > (columns - 2) then - col = 0 - row = row + 1 - else - col = col + 1 - end - end - - frame:SetHeight((row + (col == 0 and 0 or 1))*(size + spacing) + 83) - frame:SetWidth(columns*size + spacing*(columns - 1) + 20) - col, row = 0, 0 - end - - local FixSlots = function(bag) - for i = 0, 3 do - local bu = _G['CharacterBag'..i..'Slot'] - local icon = _G['CharacterBag'..i..'SlotIconTexture'] - if MODUI_VAR['elements']['mainbar'].enable then - bu:SetSize(18, 12) - icon:SetTexCoord(.1, .9, .2, .8) - end - end - end - - local ReAnchor = function() - local bag = _G['modbag'] - wipe(buttons) - HideBagSmall() - for f = 1, grab_slots() do - con = 'ContainerFrame'..f - HideBags(con) - for i = GetContainerNumSlots(_G[con]:GetID()), 1, -1 do - bu = _G[con..'Item'..i] - tinsert(buttons, bu) - ns.AddButtonStyle(bu) - end - ns.ColourUpdate(_G[con]) - end - MoveButtons(buttons, bag) - FixSlots(bag) - bag:Show() - end - - local cachedBankWidth, cachedBankHeight -- setup bank - local ReAnchorBank = function(noMoving) - local bank = _G['modbank'] - for _, button in pairs(bankbuttons) do button:Hide() end - - wipe(bankbuttons) - - for i = 1, 24 do - local bu = _G['BankFrameItem'..i] - tinsert(bankbuttons, bu) - ns.AddButtonStyle(bu) - ns.BankColourUpdate(bu) - bu:Show() - end - - local bagNameCount = 0 - for f = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do - bagNameCount = bagNameCount + 1 - con = 'ContainerFrame'..grab_slots() + bagNameCount - HideBags(con) - for i = GetContainerNumSlots(f), 1, -1 do - bu = _G[con..'Item'..i] - tinsert(bankbuttons, bu) - ns.AddButtonStyle(bu) - ns.BankColourUpdate(bu) - bu:Show() - end - end - - if not noMoving then - MoveButtons(bankbuttons, bank) - cachedBankWidth = bank:GetWidth() - cachedBankHeight = bank:GetHeight() - else - bank:SetWidth(cachedBankWidth) - bank:SetHeight(cachedBankHeight) - end - - if bank:GetWidth() < 200 then - for i = 1, 6 do BankSlotsFrame['Bag'..i]:SetScale(.85) end - end - - bank:Show() - bank.purchase:Show() - for i = 1, 6 do - BankSlotsFrame['Bag'..i]:Show() - end - end - - local CloseBags = function() -- toggle functions - local bag = _G['modbag'] - local bank = _G['modbank'] - HideBankArt() - for i = 0, 11 do CloseBag(i) end - for _, v in pairs({bag, bank}) do v:Hide() end - end - - local CloseBags2 = function() - local bag = _G['modbag'] - local bagnk = _G['modbank'] - CloseBankFrame() - for _, v in pairs({bag, bank}) do v:Hide() end - end - - local OpenBags = function() - HideBankArt() - for i = 0, 4 do OpenBag(i) end - end - - local ToggleBags = function() - if IsBagOpen(0) then - CloseBankFrame() - CloseBags() - else OpenBags() end - end - - local HideBank = function() - local bank = _G['modbank'] - for i = 1, 24 do - _G['BankFrameItem'..i]:Hide() - end - for i = 5, 11 do CloseBag(i) end - bank:Hide() - ReAnchor() - end - - local AddUpdates = function() - for i = 1, 5 do - local bag = _G['ContainerFrame'..i] - hooksecurefunc(bag, 'Show', ReAnchor) - hooksecurefunc(bag, 'Hide', CloseBags2) - end - - hooksecurefunc(BankFrame, 'Show', function() - for i = 0, 11 do OpenBag(i) end - ReAnchorBank() - HideBankArt() - end) - - hooksecurefunc(BankFrame, 'Hide', function() - CloseBags() - HideBankArt() - end) - - BagSlotButton_OnClick = function(self) - local id = self:GetID() - local hadItem = PutItemInBag(id) - return - end - - BankFrameItemButtonBag_OnClick = function(self, button) - local id = self:GetInventorySlot() - local hadItem = PutItemInBag(id) - if not hadItem then return end - end - - function UpdateContainerFrameAnchors() end - ToggleBackpack = ToggleBags - ToggleBag = ToggleBags - OpenAllBags = OpenBags - OpenBackpack = OpenBags - CloseAllBags = CloseBags - - hooksecurefunc('ContainerFrame_Update', ReAnchor) - - - _G['modbag'].CloseButton:SetScript('OnClick', ToggleBags) - _G['modbank'].CloseButton:SetScript('OnClick', function() HideBank() CloseBankFrame() HideBankArt() end) - end - - local OnEvent = function() - if MODUI_VAR['elements']['onebag'].enable then - AddUpdates() - end - end - - local e = CreateFrame'Frame' - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - -- diff --git a/castbars/enemy.lua b/castbars/enemy.lua deleted file mode 100755 index bef1e00..0000000 --- a/castbars/enemy.lua +++ /dev/null @@ -1,492 +0,0 @@ - - - local _, ns = ... - - local GUIDs = {} - local timer = {} - local frames = {} - local pool = {} - local anchors = {} - local created = 0 - local active = 0 - local FONT_REGULAR = ns.FONT_REGULAR - - local f = CreateFramePool( - 'Statusbar', - UIParent, - 'SmallCastingBarFrameTemplate', - function(pool, frame) - frame:Hide() - frame:SetParent(nil) - frame:ClearAllPoints() - - if frame._data then - frame._data = nil - end - end - ) - - local e = CreateFrame'Frame' - - local InitializeNewFrame = function(frame) - frame.Border:ClearAllPoints() - frame.Icon:ClearAllPoints() - frame.Text:ClearAllPoints() - frame.Icon:SetPoint('LEFT', frame, -35, 0) - frame.Text:SetPoint'CENTER' - frame.Flash:SetAlpha(0) - - frame:SetScript('OnLoad', nil) - frame:SetScript('OnEvent', nil) - frame:SetScript('OnUpdate', nil) - frame:SetScript('OnShow', nil) - - frame.Timer = frame:CreateFontString(nil, 'OVERLAY') - frame.Timer:SetTextColor(1, 1, 1) - frame.Timer:SetFontObject'SystemFont_Shadow_Small' - end - - local GetAnchor = function(unit, default) - if string.find(unit, 'nameplate') then - return C_NamePlate.GetNamePlateForUnit(unit) - elseif string.match(unit, 'target') then - return TargetFrame - end - end - - local SetTargetCastbarPosition = function(castbar, parent) - -- Set position based on aura amount & targetframe type - local rows = parent.auraRows or 0 - if parent.haveToT or parent.haveElite then - if parent.buffsOnTop or rows <= 1 then - castbar:SetPoint('CENTER', TargetFrame, -8, -75) - else - castbar:SetPoint('CENTER', TargetFrame, -8, -100) - end - else - if not parent.buffsOnTop and rows > 0 then - castbar:SetPoint('CENTER', TargetFrame, -8, -100) - else - castbar:SetPoint('CENTER', TargetFrame, -8, -50) - end - end - end - - local SetCastbarIconAndText = function(castbar, cast) - --name = cast.rank and cast.name..' ('..cast.rank..')' or cast.name - name = cast.name - -- Update text + icon if it has changed - if castbar.Text:GetText() ~= name then - castbar.Icon:SetTexture(cast.icon) - castbar.Text:SetText(name) - castbar.Timer:SetPoint('RIGHT', castbar, 23, 0) - end - end - - local SetCastbarStyle = function(castbar, cast, db) - castbar:SetSize(150, 14) - castbar.Timer:SetShown(true) - --ns.SB(castbar) - - castbar.Spark:SetAlpha(1) - - castbar.Icon:SetSize(16, 16) - castbar.Icon:SetPoint('LEFT', castbar, -25, 0) - castbar.Icon:SetTexCoord(.1, .9, .1, .9) - - if not castbar.IconBorder then - castbar.IconBorder = CreateFrame('Frame', nil, castbar) - castbar.IconBorder:SetAllPoints(castbar.Icon) - ns.BD(castbar.IconBorder) - ns.BUBorder(castbar.IconBorder, 18) - for i = 1, 4 do - tinsert(ns.skinbu, castbar.IconBorder.bo[i]) - castbar.IconBorder.bo[i]:SetVertexColor(MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b) - end - castbar.Icon:SetParent(castbar.IconBorder) - end - - castbar.Text:SetFont(FONT_REGULAR, 9) - castbar.Timer:SetFont(FONT_REGULAR, 9) - - castbar.Border:SetAlpha(1) - tinsert(ns.skin, castbar.Border) - castbar.Border:SetVertexColor(MODUI_VAR['theme'].r, MODUI_VAR['theme'].g, MODUI_VAR['theme'].b) - - if castbar.BorderFrame then -- unneccesary? - castbar.BorderFrame:SetAlpha(0) - end - - -- Update border to match castbar size - local width, height = castbar:GetWidth()*1.16, castbar:GetHeight()*1.16 - castbar.Border:SetPoint("TOPLEFT", width, height) - castbar.Border:SetPoint("BOTTOMRIGHT", -width, -height) - end - - local DisplayCastbar = function(castbar, unit) - local parent = GetAnchor(unit) - if not parent then return end -- sanity check - - local cast = castbar._data - castbar:SetMinMaxValues(0, cast.max) - castbar:SetParent(parent) - - if unit == 'target' then - SetTargetCastbarPosition(castbar, parent) - castbar:SetScale(1) - else - castbar:SetPoint('CENTER', parent, -6, -35) -- -5.5 x position? - castbar:SetScale(.7) - end - - SetCastbarStyle(castbar, cast) - SetCastbarIconAndText(castbar, cast) - - castbar:SetAlpha(1) - castbar:Show() - end - - local AcquireFrame = function() - if created >= 300 then return end -- should never happen - - local frame, isNew = f:Acquire() - active = active + 1 - - if isNew then - frame:Hide() - InitializeNewFrame(frame) - - created = created + 1 - -- frame._data = {} - end - - return frame, isNew, created - end - - local ReleaseFrame = function(frame) - if frame then - f:Release(frame) - active = active - 1 - end - end - - local GetFramePool = function() - return pool - end - - local GetCastbarFrame = function(unit) - -- pool:DebugInfo() - - if frames[unit] then - return frames[unit] - end - - -- store reference, refs are deleted on frame recycled. - -- This allows us to not have to Release & Acquire a frame everytime a - -- castbar is shown/hidden for the *same* unit - frames[unit] = AcquireFrame() - - return frames[unit] - end - - local FadeOut = function(self) - local a = self:GetAlpha() - CASTING_BAR_ALPHA_STEP - if a > 0 then - CastingBarFrame_ApplyAlpha(self, a) - else - self.fade = nil - self:Hide() - self:SetScript('OnUpdate', nil) - end - end - - local StartCast = function(GUID, unit) - if not timer[GUID] then return end - - local castbar = GetCastbarFrame(unit) - if not castbar then return end - - castbar._data = timer[GUID] - DisplayCastbar(castbar, unit) - end - - local StopCast = function(unit, hide) - local castbar = frames[unit] - if not castbar then return end - castbar._data = nil - if castbar.fade and not hide then - --C_Timer.After(1, function() castbar:SetScript('OnUpdate', FadeOut) end) - castbar:Hide() - end - end - - local StartAllCasts = function(GUID) - if not timer[GUID] then return end - for unit, guid in pairs(GUIDs) do - if guid == GUID then - StartCast(guid, unit) - end - end - end - - local StopAllCasts = function(GUID) - for unit, guid in pairs(GUIDs) do - if guid == GUID then - if frames[unit] then - frames[unit].fade = true - end - StopCast(unit) - end - end - end - - local StoreCast = function(GUID, name, icon, time, rank, channeled) - timer[GUID] = { - name = name, - rank = rank, - icon = icon, - max = time/1000, - endTime = GetTime() + (time/1000), - GUID = GUID, - channeled = channeled, - } - - StartAllCasts(GUID) - end - - local DeleteCast = function(GUID) - if GUID then - StopAllCasts(GUID) - timer[GUID] = nil - end - end - - local CastPushback = function(GUID, amount, faded) - local cast = timer[GUID] - if not cast then return end - - -- Set cast time modifier (i.e Curse of Tongues) - if not faded and amount and amount > 0 then - if not cast.currTimeModValue or cast.currTimeModValue < amount then -- run only once unless % changed to higher val - if cast.currTimeModValue then -- already was reduced - -- if existing modifer is e.g 50% and new is 60%, we only want to adjust cast by 10% - amount = amount - cast.currTimeModValue - - -- Store previous lesser modifier that was active - cast.prevCurrTimeModValue = cast.prevCurrTimeModValue or {} - cast.prevCurrTimeModValue[#cast.prevCurrTimeModValue + 1] = cast.currTimeModValue - end - - -- print("refreshing timer", percentageAmount) - cast.currTimeModValue = (cast.currTimeModValue or 0) + amount -- highest active modifier - cast.max = cast.max + (cast.max * amount)/100 - cast.endTime = cast.endTime + (cast.max * amount)/100 - elseif cast.currTimeModValue == amount then - -- new modifier has same percentage as current active one, just store it for later - -- print("same percentage, storing") - cast.prevCurrTimeModValue = cast.prevCurrTimeModValue or {} - cast.prevCurrTimeModValue[#cast.prevCurrTimeModValue + 1] = amount - end - elseif faded and amount then - -- Reset cast time modifier - if cast.currTimeModValue == amount then - cast.max = cast.max - (cast.max*amount)/100 - cast.endTime = cast.endTime - (cast.max*amount)/100 - cast.currTimeModValue = nil - - -- Reset to lesser modifier if available - if cast.prevCurrTimeModValue then - local highest, index = 0 - for i = 1, #cast.prevCurrTimeModValue do - if cast.prevCurrTimeModValue[i] and cast.prevCurrTimeModValue[i] > highest then - highest, index = cast.prevCurrTimeModValue[i], i - end - end - - if index then - cast.prevCurrTimeModValue[index] = nil - -- print("resetting to lesser modifier", highest) - return CastPushback(GUID, highest) - end - end - end - - if cast.prevCurrTimeModValue then - -- Delete 1 old modifier (doesn't matter which one aslong as its the same %) - for i = 1, #cast.prevCurrTimeModValue do - if cast.prevCurrTimeModValue[i] == amount then - -- print("deleted lesser modifier, new total:", #cast.prevCurrTimeModValue - 1) - cast.prevCurrTimeModValue[i] = nil - return - end - end - end - else -- normal pushback - if not cast.isChanneled then - cast.pushback = cast.pushback or 1 - cast.max = cast.max + cast.pushback - cast.endTime = cast.endTime + cast.pushback - cast.pushback = max(cast.pushback - .2, .2) - else - -- channels are reduced by 25% - cast.max = cast.max - (cast.max*25)/100 - cast.endTime = cast.endTime - (cast.max*25)/100 - end - end - end - - local PLAYER_ENTERING_WORLD = function(login) - if login then return end - - for _, table in pairs( - { - GUIDs, timer, frames - } - ) do - wipe(table) - end - - pool:GetFramePool():ReleaseAll() - end - - local PLAYER_LOGIN = function() - e:UnregisterEvent'PLAYER_LOGIN' - for _, v in pairs( - { - 'COMBAT_LOG_EVENT_UNFILTERED', - 'PLAYER_ENTERING_WORLD', - 'PLAYER_TARGET_CHANGED', - 'NAME_PLATE_UNIT_ADDED', - 'NAME_PLATE_UNIT_REMOVED', - } - ) do - e:RegisterEvent(v) - end - end - - local PLAYER_TARGET_CHANGED = function() - GUIDs.target = UnitGUID'target' or nil - local castbar = GetCastbarFrame'target' - if castbar then castbar:Hide() end - StopCast('target', true) - StartCast(GUIDs.target, 'target') - end - - local NAME_PLATE_UNIT_ADDED = function(unit) - local GUID = UnitGUID(unit) - GUIDs[unit] = GUID - StartCast(GUID, unit) - end - - local NAME_PLATE_UNIT_REMOVED = function(unit) - GUIDs[unit] = nil - local castbar = frames[unit] - if castbar then - ReleaseFrame(castbar) - frames[unit] = nil - end - end - - local COMBAT_LOG_EVENT_UNFILTERED = function() - local _, event, _, srcGUID, _, srcFlags, _, dstGUID, _, dstFlags, _, _, name, _, damage, _, resisted, blocked, absorbed = CombatLogGetCurrentEventInfo() - if event == 'SPELL_CAST_START' then - local spellid = ns.cast[name] - if not spellid then return end -- nb: keep an eye on how this table loop affects performance - local _, _, icon, time = GetSpellInfo(spellid) - if not time or time == 0 then return end - - local talentdecrease = ns.talentdecrease[name] - if talentdecrease then - if bit.band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER) > 0 then - time = time - (talentdecrease*1000) - end - end - - return StoreCast(srcGUID, name, icon, time, GetSpellSubtext(spellid)) - elseif event == 'SPELL_CAST_SUCCESS' then - -- channeled spells start here - local spell = ns.channelled[name] - if spell then - return StoreCast(srcGUID, name, GetSpellTexture(spell[2]), spell[1]*1000, nil, true) - end - return DeleteCast(srcGUID) - elseif event == 'SPELL_AURA_APPLIED' then - local decrease = ns.decrease[name] - local increase = ns.delay[name] - local cc = ns.CC[name] - if decrease then - return CastPushback(dstGUID, decrease) - elseif increase then - return CastPushback(dstGUID, increase, true) - elseif cc then - return DeleteCast(dstGUID) - end - elseif event == 'SPELL_AURA_REMOVED' then - local increase = ns.delay[name] - if ns.channelled[name] then - return DeleteCast(srcGUID) - elseif increase then - return CastPushback(dstGUID, increase, true) - end - elseif event == 'SPELL_CAST_FAILED' then - if srcGUID == UnitGUID'player' then - if not CastingInfo'player' then - return DeleteCast(srcGUID) - end - else - return DeleteCast(srcGUID) - end - elseif event == 'PARTY_KILL' or event == 'UNIT_DIED' or event == 'SPELL_INTERRUPT' then - return DeleteCast(dstGUID) - elseif event == 'SWING_DAMAGE' or event == 'ENVIRONMENTAL_DAMAGE' or event == 'RANGE_DAMAGE' or event == 'SPELL_DAMAGE' then - if resisted or blocked or absorbed then return end - if bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) > 0 then - return CastPushback(dstGUID) - end - end - end - - local OnUpdate = function() - if not next(timer) then return end - local current = GetTime() - for unit, castbar in pairs(frames) do - local cast = castbar._data - if cast then - local time = cast.endTime - current - if time > 0 then - local v = cast.max - time - if cast.channeled then - v = cast.max - v - end - castbar:SetMinMaxValues(0, cast.max) - castbar:SetValue(v) - castbar.Timer:SetFormattedText('%.1f', time) - castbar.Spark:SetPoint('CENTER', castbar, 'LEFT', (v/cast.max)*castbar:GetWidth(), 0) - else - DeleteCast(cast.GUID) - end - end - end - end - - local OnEvent = function(self, event, ...) - if MODUI_VAR['elements']['ecastbar'].enable then - if event == 'PLAYER_LOGIN' then - PLAYER_LOGIN() - e:SetScript('OnUpdate', OnUpdate) - elseif event == 'COMBAT_LOG_EVENT_UNFILTERED' then - COMBAT_LOG_EVENT_UNFILTERED() - elseif event == 'NAME_PLATE_UNIT_REMOVED' then - NAME_PLATE_UNIT_REMOVED(...) - elseif event == 'NAME_PLATE_UNIT_ADDED' then - NAME_PLATE_UNIT_ADDED(...) - elseif event == 'PLAYER_TARGET_CHANGED' then - PLAYER_TARGET_CHANGED() - end - end - end - - e:RegisterEvent'PLAYER_LOGIN' - e:SetScript('OnEvent', OnEvent) - - -- diff --git a/chat/chat.lua b/chat/chat.lua index d6fa292..88efd18 100755 --- a/chat/chat.lua +++ b/chat/chat.lua @@ -85,7 +85,7 @@ edit:SetTextInsets(11 + header:GetWidth() + (suffix:IsShown() and suffix:GetWidth() or 0), 11, 0, 0) if not edit.f then - edit.f = CreateFrame('Frame', nil, edit) + edit.f = CreateFrame('Frame', nil, edit, "BackdropTemplate") ns.BD(edit.f) edit.f:SetPoint('TOPLEFT', 12, -6) edit.f:SetPoint('BOTTOMRIGHT', -12, 6) diff --git a/core/skins.lua b/core/skins.lua index a83deb3..d75f919 100755 --- a/core/skins.lua +++ b/core/skins.lua @@ -45,28 +45,32 @@ ns.BD = function(bu, a, ix) -- build in an anti-fuckup if not bu then return end local f = bu + if not f.SetBackdrop then + Mixin(f, BackdropTemplateMixin) + end if f:GetObjectType() == 'Texture' then if not bu.BD then local parent = bu:GetParent() - bu.BD = CreateFrame('Frame', nil, parent) + bu.BD = CreateFrame('Frame', nil, parent, "BackdropTemplate") bu.BD:SetAllPoints(bu) bu.BD:SetFrameLevel(parent:GetFrameLevel() - 1) end f = bu.BD end - f:SetBackdrop( - { - bgFile = [[Interface\ChatFrame\ChatFrameBackground]], - tiled = false, - insets = { - left = ix or -3, - right = ix or -3, - top = ix or -3, - bottom = ix or -3 - } - } - ) - f:SetBackdropColor(0, 0, 0, a or 1) + + f:SetBackdrop( + { + bgFile = [[Interface\ChatFrame\ChatFrameBackground]], + tiled = false, + insets = { + left = ix or -3, + right = ix or -3, + top = ix or -3, + bottom = ix or -3 + } + } + ) + f:SetBackdropColor(0, 0, 0, a or 1) end ns.BU = function(bu, a, hover, x, y, ix) @@ -226,8 +230,8 @@ ns.BDStone = function(bu, x, path) bu.stone = CreateFrame('Frame', nil, bu) bu.stone:SetBackdrop({ - bgFile = [[Interface\ChatFrame\ChatFrameBackground]], - insets = {left = -2, right = -2, top = -2, bottom = -2} + bgFile = [[Interface\ChatFrame\ChatFrameBackground]], + insets = {left = -2, right = -2, top = -2, bottom = -2} }) bu.stone:SetBackdropColor(.05, .05, .05) bu.stone:SetPoint('TOPLEFT', bu, x and -x or -4, x and x or 4) diff --git a/core/tables.lua b/core/tables.lua index 6488b64..66c6dfd 100755 --- a/core/tables.lua +++ b/core/tables.lua @@ -9,2741 +9,25 @@ -- of spells we * actually * came across and built up during extensive pserver play ns.cast = { - [GetSpellInfo(17745)] = 17745, -- Diseased Spit - [GetSpellInfo(6753)] = 6753, -- Backhand - [GetSpellInfo(21954)] = 21954, -- Dispel Poison - [GetSpellInfo(18440)] = 18440, -- Mooncloth Leggings - [GetSpellInfo(28165)] = 28165, -- Shadow Guard - [GetSpellInfo(17204)] = 17204, -- Summon Skeleton - [GetSpellInfo(18403)] = 18403, -- Frostweave Tunic - [GetSpellInfo(9781)] = 9781, -- Mithril Shield Spike - [GetSpellInfo(9478)] = 9478, -- Invis Placing Bear Trap - [GetSpellInfo(9972)] = 9972, -- Ornate Mithril Breastplate - [GetSpellInfo(16641)] = 16641, -- Dense Sharpening Stone - [GetSpellInfo(6648)] = 6648, -- Chestnut Mare - [GetSpellInfo(19755)] = 19755, -- Frightalon - [GetSpellInfo(19102)] = 19102, -- Runic Leather Armor - [GetSpellInfo(13228)] = 13228, -- Wound Poison II - [GetSpellInfo(28397)] = 28397, -- Reputation - Gadgetzan +500 - [GetSpellInfo(18452)] = 18452, -- Mooncloth Circlet - [GetSpellInfo(19048)] = 19048, -- Heavy Scorpid Bracers - [GetSpellInfo(29332)] = 29332, -- Fire-toasted Bun - [GetSpellInfo(25177)] = 25177, -- Fire Weakness - [GetSpellInfo(22566)] = 22566, -- Hex - [GetSpellInfo(17196)] = 17196, -- Seeping Willow - [GetSpellInfo(9575)] = 9575, -- Self Detonation - [GetSpellInfo(25166)] = 25166, -- Call Glyphs of Warding - [GetSpellInfo(19050)] = 19050, -- Green Dragonscale Breastplate - [GetSpellInfo(12585)] = 12585, -- Solid Blasting Powder - [GetSpellInfo(28297)] = 28297, -- Lightning Totem - [GetSpellInfo(24165)] = 24165, -- Hoodoo Hex - [GetSpellInfo(13692)] = 13692, -- Dire Growl - [GetSpellInfo(12093)] = 12093, -- Tuxedo Jacket - [GetSpellInfo(9942)] = 9942, -- Mithril Scale Gloves - [GetSpellInfo(16060)] = 16060, -- Golden Sabercat - [GetSpellInfo(18442)] = 18442, -- Felcloth Hood - [GetSpellInfo(12053)] = 12053, -- Black Mageweave Gloves - [GetSpellInfo(2164)] = 2164, -- Fine Leather Gloves - [GetSpellInfo(3170)] = 3170, -- Weak Troll's Blood Potion - [GetSpellInfo(10840)] = 10840, -- Mageweave Bandage - [GetSpellInfo(2666)] = 2666, -- Runed Copper Belt - [GetSpellInfo(21544)] = 21544, -- Create Shredder - [GetSpellInfo(17553)] = 17553, -- Superior Mana Potion - [GetSpellInfo(20890)] = 20890, -- Dark Iron Reaver - [GetSpellInfo(10703)] = 10703, -- Summon Wood Frog - [GetSpellInfo(8365)] = 8365, -- Enlarge - [GetSpellInfo(12511)] = 12511, -- Torch Combine - [GetSpellInfo(24162)] = 24162, -- Falcon's Call - [GetSpellInfo(17574)] = 17574, -- Greater Fire Protection Potion - [GetSpellInfo(3760)] = 3760, -- Hillman's Cloak - [GetSpellInfo(16726)] = 16726, -- Runic Plate Helm - [GetSpellInfo(9435)] = 9435, -- Detonation - [GetSpellInfo(17203)] = 17203, -- Fireball Volley - [GetSpellInfo(2661)] = 2661, -- Copper Chain Belt - [GetSpellInfo(1916)] = 1916, -- Sacrifice (NSE) - [GetSpellInfo(24655)] = 24655, -- Green Dragonscale Gauntlets - [GetSpellInfo(3635)] = 3635, -- Crystal Gaze - [GetSpellInfo(23214)] = 23214, -- Summon Charger - [GetSpellInfo(9195)] = 9195, -- Dusky Leather Leggings - [GetSpellInfo(13230)] = 13230, -- Wound Poison IV - [GetSpellInfo(11535)] = 11535, -- Opening Safe - [GetSpellInfo(11895)] = 11895, -- Healing Wave of Antu'sul - [GetSpellInfo(16658)] = 16658, -- Imperial Plate Helm - [GetSpellInfo(17951)] = 17951, -- Create Firestone - [GetSpellInfo(2337)] = 2337, -- Lesser Healing Potion - [GetSpellInfo(18406)] = 18406, -- Runecloth Robe - [GetSpellInfo(15861)] = 15861, -- Jungle Stew - [GetSpellInfo(16656)] = 16656, -- Radiant Boots - [GetSpellInfo(18763)] = 18763, -- Freeze - [GetSpellInfo(3861)] = 3861, -- Long Silken Cloak - [GetSpellInfo(27725)] = 27725, -- Satchel of Cenarius - [GetSpellInfo(19087)] = 19087, -- Frostsaber Gloves - [GetSpellInfo(22905)] = 22905, -- Place Unfired Blade - [GetSpellInfo(24263)] = 24263, -- UNUSED Quest - Create Empowered Mojo Bundle - [GetSpellInfo(12198)] = 12198, -- Marksman Hit - [GetSpellInfo(28738)] = 28738, -- Summon Speedy - [GetSpellInfo(7673)] = 7673, -- Nether Gem - [GetSpellInfo(27829)] = 27829, -- Titanic Leggings - [GetSpellInfo(3605)] = 3605, -- Summon Remote-Controlled Golem - [GetSpellInfo(17573)] = 17573, -- Greater Arcane Elixir - [GetSpellInfo(3595)] = 3595, -- Frost Oil - [GetSpellInfo(3872)] = 3872, -- Rich Purple Silk Shirt - [GetSpellInfo(23639)] = 23639, -- Blackfury - [GetSpellInfo(24006)] = 24006, -- Bounty of the Harvest - [GetSpellInfo(12907)] = 12907, -- Gnomish Mind Control Cap - [GetSpellInfo(22704)] = 22704, -- Field Repair Bot 74A - [GetSpellInfo(26265)] = 26265, -- Create Elune Stone - [GetSpellInfo(16195)] = 16195, -- Create Knucklebone Pouch - [GetSpellInfo(12248)] = 12248, -- Amplify Damage - [GetSpellInfo(19719)] = 19719, -- Use Bauble - [GetSpellInfo(11923)] = 11923, -- Repair the Blade of Heroes - [GetSpellInfo(7720)] = 7720, -- Ritual of Summoning Effect - [GetSpellInfo(3370)] = 3370, -- Crocolisk Steak - [GetSpellInfo(3854)] = 3854, -- Azure Silk Gloves - [GetSpellInfo(9957)] = 9957, -- Orcish War Leggings - [GetSpellInfo(20565)] = 20565, -- Magma Blast - [GetSpellInfo(17707)] = 17707, -- Summon Panda - [GetSpellInfo(26069)] = 26069, -- Silence - [GetSpellInfo(7636)] = 7636, -- Green Woolen Robe - [GetSpellInfo(2829)] = 2829, -- Sharpen Blade II - [GetSpellInfo(9068)] = 9068, -- Light Leather Pants - [GetSpellInfo(23638)] = 23638, -- Black Amnesty - [GetSpellInfo(3844)] = 3844, -- Heavy Woolen Cloak - [GetSpellInfo(7147)] = 7147, -- Guardian Pants - [GetSpellInfo(6358)] = 6358, -- Seduction - [GetSpellInfo(12851)] = 12851, -- Release the Hounds - [GetSpellInfo(18418)] = 18418, -- Cindercloth Cloak - [GetSpellInfo(9954)] = 9954, -- Truesilver Gauntlets - [GetSpellInfo(3939)] = 3939, -- Lovingly Crafted Boomstick - [GetSpellInfo(3936)] = 3936, -- Deadly Blunderbuss - [GetSpellInfo(6671)] = 6671, -- Create Scroll - [GetSpellInfo(17453)] = 17453, -- Green Mechanostrider - [GetSpellInfo(10696)] = 10696, -- Summon Azure Whelpling - [GetSpellInfo(3657)] = 3657, -- Summon Spell Guard - [GetSpellInfo(9193)] = 9193, -- Heavy Quiver - [GetSpellInfo(6366)] = 6366, -- Create Firestone (Lesser) - [GetSpellInfo(29467)] = 29467, -- Power of the Scourge - [GetSpellInfo(22725)] = 22725, -- Defense +3 - [GetSpellInfo(19790)] = 19790, -- Thorium Grenade - [GetSpellInfo(3849)] = 3849, -- Reinforced Woolen Shoulders - [GetSpellInfo(3263)] = 3263, -- Touch of Ravenclaw - [GetSpellInfo(19645)] = 19645, -- Anti-Magic Shield - [GetSpellInfo(15575)] = 15575, -- Flame Cannon - [GetSpellInfo(2740)] = 2740, -- Bronze Mace - [GetSpellInfo(2881)] = 2881, -- Light Leather - [GetSpellInfo(11466)] = 11466, -- Gift of Arthas - [GetSpellInfo(16652)] = 16652, -- Thorium Boots - [GetSpellInfo(3567)] = 3567, -- Teleport: Orgrimmar - [GetSpellInfo(28327)] = 28327, -- Steam Tonk Controller - [GetSpellInfo(25145)] = 25145, -- Merithra's Wake - [GetSpellInfo(8240)] = 8240, -- Elixir of Giant Growth - [GetSpellInfo(16058)] = 16058, -- Primal Leopard - [GetSpellInfo(21537)] = 21537, -- Planting Ryson's Beacon - [GetSpellInfo(17637)] = 17637, -- Flask of Supreme Power - [GetSpellInfo(24179)] = 24179, -- Create Seal of the Dawn - [GetSpellInfo(15095)] = 15095, -- Molten Blast - [GetSpellInfo(3870)] = 3870, -- Dark Silk Shirt - [GetSpellInfo(4165)] = 4165, -- Throw Rock II - [GetSpellInfo(3565)] = 3565, -- Teleport: Darnassus - [GetSpellInfo(3515)] = 3515, -- Golden Scale Boots - [GetSpellInfo(3966)] = 3966, -- Craftsman's Monocle - [GetSpellInfo(18560)] = 18560, -- Mooncloth - [GetSpellInfo(6215)] = 6215, -- Fear - [GetSpellInfo(23249)] = 23249, -- Great Brown Kodo - [GetSpellInfo(20685)] = 20685, -- Storm Bolt - [GetSpellInfo(25149)] = 25149, -- Arygos's Vengeance - [GetSpellInfo(23652)] = 23652, -- Blackguard - [GetSpellInfo(9814)] = 9814, -- Barbaric Iron Helm - [GetSpellInfo(19566)] = 19566, -- Salt Shaker - [GetSpellInfo(22480)] = 22480, -- Tender Wolf Steak - [GetSpellInfo(3325)] = 3325, -- Gemmed Copper Gauntlets - [GetSpellInfo(30047)] = 30047, -- Crystal Throat Lozenge - [GetSpellInfo(9200)] = 9200, -- Create Sapta - [GetSpellInfo(16600)] = 16600, -- Might of Shahram - [GetSpellInfo(7120)] = 7120, -- Proudmoore's Defense - [GetSpellInfo(16744)] = 16744, -- Enchanted Thorium Leggings - [GetSpellInfo(12908)] = 12908, -- Goblin Dragon Gun - [GetSpellInfo(19058)] = 19058, -- Rugged Armor Kit - [GetSpellInfo(20848)] = 20848, -- Flarecore Mantle - [GetSpellInfo(25123)] = 25123, -- Brilliant Mana Oil - [GetSpellInfo(3500)] = 3500, -- Shadow Crescent Axe - [GetSpellInfo(21943)] = 21943, -- Gloves of the Greatfather - [GetSpellInfo(3264)] = 3264, -- Blood Howl - [GetSpellInfo(23709)] = 23709, -- Corehound Belt - [GetSpellInfo(19512)] = 19512, -- Apply Salve - [GetSpellInfo(3636)] = 3636, -- Crystalline Slumber - [GetSpellInfo(27571)] = 27571, -- Cascade of Roses - [GetSpellInfo(12709)] = 12709, -- Collecting Fallout - [GetSpellInfo(12063)] = 12063, -- Stormcloth Gloves - [GetSpellInfo(10707)] = 10707, -- Summon Great Horned Owl - [GetSpellInfo(8467)] = 8467, -- White Woolen Dress - [GetSpellInfo(22720)] = 22720, -- Black War Ram - [GetSpellInfo(23308)] = 23308, -- Incinerate - [GetSpellInfo(3506)] = 3506, -- Green Iron Leggings - [GetSpellInfo(24815)] = 24815, -- Draw Ancient Glyphs - [GetSpellInfo(7125)] = 7125, -- Toxic Saliva - [GetSpellInfo(28396)] = 28396, -- Reputation - Everlook +500 - [GetSpellInfo(1002)] = 1002, -- Eyes of the Beast - [GetSpellInfo(15833)] = 15833, -- Dreamless Sleep Potion - [GetSpellInfo(10711)] = 10711, -- Summon Snowshoe Rabbit - [GetSpellInfo(10790)] = 10790, -- Tiger - [GetSpellInfo(28271)] = 28271, -- Polymorph - [GetSpellInfo(12584)] = 12584, -- Gold Power Core - [GetSpellInfo(10554)] = 10554, -- Tough Scorpid Boots - [GetSpellInfo(9818)] = 9818, -- Barbaric Iron Boots - [GetSpellInfo(3132)] = 3132, -- Chilling Breath - [GetSpellInfo(16473)] = 16473, -- Summoned Urok - [GetSpellInfo(24963)] = 24963, -- Honor Points +228 - [GetSpellInfo(18363)] = 18363, -- Riding Kodo - [GetSpellInfo(2739)] = 2739, -- Copper Shortsword - [GetSpellInfo(21160)] = 21160, -- Eye of Sulfuras - [GetSpellInfo(7408)] = 7408, -- Heavy Copper Maul - [GetSpellInfo(16032)] = 16032, -- Merging Oozes - [GetSpellInfo(23180)] = 23180, -- Release Imp - [GetSpellInfo(23219)] = 23219, -- Swift Mistsaber - [GetSpellInfo(7213)] = 7213, -- Giant Clam Scorcho - [GetSpellInfo(21370)] = 21370, -- Planting Jeztor's Beacon - [GetSpellInfo(10687)] = 10687, -- Summon White Plymouth Rock - [GetSpellInfo(25119)] = 25119, -- Lesser Wizard Oil - [GetSpellInfo(13528)] = 13528, -- Decayed Strength - [GetSpellInfo(24997)] = 24997, -- Greater Dispel - [GetSpellInfo(12587)] = 12587, -- Bright-Eye Goggles - [GetSpellInfo(3722)] = 3722, -- Summon Syndicate Spectre - [GetSpellInfo(6530)] = 6530, -- Sling Dirt - [GetSpellInfo(24912)] = 24912, -- Darkrune Gauntlets - [GetSpellInfo(23704)] = 23704, -- Timbermaw Brawlers - [GetSpellInfo(11478)] = 11478, -- Elixir of Detect Demon - [GetSpellInfo(7295)] = 7295, -- Soul Drain - [GetSpellInfo(29134)] = 29134, -- Maypole - [GetSpellInfo(18476)] = 18476, -- Summon Minion - [GetSpellInfo(21181)] = 21181, -- Summon Shadowstrike - [GetSpellInfo(2833)] = 2833, -- Armor +24 - [GetSpellInfo(16447)] = 16447, -- Spawn Challenge to Urok - [GetSpellInfo(6653)] = 6653, -- Dire Wolf - [GetSpellInfo(7136)] = 7136, -- Shadow Port - [GetSpellInfo(27832)] = 27832, -- Sageblade - [GetSpellInfo(18423)] = 18423, -- Runecloth Boots - [GetSpellInfo(9974)] = 9974, -- Truesilver Breastplate - [GetSpellInfo(3447)] = 3447, -- Healing Potion - [GetSpellInfo(4096)] = 4096, -- Raptor Hide Harness - [GetSpellInfo(23204)] = 23204, -- Place Scryer - [GetSpellInfo(17738)] = 17738, -- Curse of the Plague Rat - [GetSpellInfo(4950)] = 4950, -- Summon Helcular's Puppets - [GetSpellInfo(19095)] = 19095, -- Living Breastplate - [GetSpellInfo(12758)] = 12758, -- Goblin Rocket Helmet - [GetSpellInfo(3451)] = 3451, -- Mighty Troll's Blood Potion - [GetSpellInfo(11975)] = 11975, -- Arcane Explosion - [GetSpellInfo(12586)] = 12586, -- Solid Dynamite - [GetSpellInfo(3973)] = 3973, -- Silver Contact - [GetSpellInfo(25186)] = 25186, -- Super Crystal - [GetSpellInfo(9156)] = 9156, -- Create Mage's Orb - [GetSpellInfo(8465)] = 8465, -- Simple Dress - [GetSpellInfo(16996)] = 16996, -- Incendia Powder - [GetSpellInfo(10572)] = 10572, -- Wild Leather Leggings - [GetSpellInfo(2393)] = 2393, -- White Linen Shirt - [GetSpellInfo(16661)] = 16661, -- Storm Gauntlets - [GetSpellInfo(22949)] = 22949, -- Seal Felvine Shard - [GetSpellInfo(3942)] = 3942, -- Whirring Bronze Gizmo - [GetSpellInfo(10436)] = 10436, -- Attack - [GetSpellInfo(20274)] = 20274, -- Capturing Termites - [GetSpellInfo(19772)] = 19772, -- Summon Lifelike Toad - [GetSpellInfo(24847)] = 24847, -- Spitfire Gauntlets - [GetSpellInfo(26420)] = 26420, -- Large Blue Rocket - [GetSpellInfo(3400)] = 3400, -- Soothing Turtle Bisque - [GetSpellInfo(7223)] = 7223, -- Golden Scale Bracers - [GetSpellInfo(25813)] = 25813, -- Conjure Dream Rift - [GetSpellInfo(28745)] = 28745, -- Quest - Prepare Field Duty Papers - [GetSpellInfo(17009)] = 17009, -- Voodoo - [GetSpellInfo(2165)] = 2165, -- Medium Armor Kit - [GetSpellInfo(7179)] = 7179, -- Elixir of Water Breathing - [GetSpellInfo(4141)] = 4141, -- Summon Myzrael - [GetSpellInfo(23637)] = 23637, -- Dark Iron Gauntlets - [GetSpellInfo(6630)] = 6630, -- Set NG-5 Charge (Red) - [GetSpellInfo(10340)] = 10340, -- Uldaman Boss Agro - [GetSpellInfo(29331)] = 29331, -- Copy of Dark Desire - [GetSpellInfo(13227)] = 13227, -- Wound Poison - [GetSpellInfo(7845)] = 7845, -- Elixir of Firepower - [GetSpellInfo(12720)] = 12720, -- Goblin "Boom" Box - [GetSpellInfo(20051)] = 20051, -- Runed Arcanite Rod - [GetSpellInfo(5567)] = 5567, -- Miring Mud - [GetSpellInfo(12088)] = 12088, -- Cindercloth Boots - [GetSpellInfo(12905)] = 12905, -- Gnomish Rocket Boots - [GetSpellInfo(27658)] = 27658, -- Enchanted Mageweave Pouch - [GetSpellInfo(9933)] = 9933, -- Heavy Mithril Pants - [GetSpellInfo(24356)] = 24356, -- Bloodvine Goggles - [GetSpellInfo(10558)] = 10558, -- Nightscape Boots - [GetSpellInfo(23247)] = 23247, -- Great White Kodo - [GetSpellInfo(9055)] = 9055, -- Create Witherbark Totem Bundle - [GetSpellInfo(3949)] = 3949, -- Silver-plated Shotgun - [GetSpellInfo(13900)] = 13900, -- Fiery Burst - [GetSpellInfo(35)] = 35, -- Teleport Elwynn - [GetSpellInfo(712)] = 712, -- Summon Succubus - [GetSpellInfo(2157)] = 2157, -- Light Winter Boots - [GetSpellInfo(23122)] = 23122, -- Jaina's Autograph - [GetSpellInfo(3840)] = 3840, -- Heavy Linen Gloves - [GetSpellInfo(14928)] = 14928, -- Nagmara's Love Potion - [GetSpellInfo(3492)] = 3492, -- Hardened Iron Shortsword - [GetSpellInfo(23708)] = 23708, -- Chromatic Gauntlets - [GetSpellInfo(26373)] = 26373, -- Lunar Invititation - [GetSpellInfo(15596)] = 15596, -- Smoking Heart of the Mountain - [GetSpellInfo(10771)] = 10771, -- Soul Shatter - [GetSpellInfo(24418)] = 24418, -- Heavy Crocolisk Stew - [GetSpellInfo(12903)] = 12903, -- Gnomish Harm Prevention Belt - [GetSpellInfo(17463)] = 17463, -- Blue Skeletal Horse - [GetSpellInfo(12802)] = 12802, -- Getting Tide Pool Sample #1 - [GetSpellInfo(16868)] = 16868, -- Banshee Wail - [GetSpellInfo(19070)] = 19070, -- Heavy Scorpid Belt - [GetSpellInfo(6419)] = 6419, -- Lean Venison - [GetSpellInfo(17529)] = 17529, -- Vitreous Focuser - [GetSpellInfo(12755)] = 12755, -- Goblin Bomb Dispenser - [GetSpellInfo(8138)] = 8138, -- Mirkfallon Fungus - [GetSpellInfo(12895)] = 12895, -- Inlaid Mithril Cylinder Plans - [GetSpellInfo(9583)] = 9583, -- Water Sample - [GetSpellInfo(24168)] = 24168, -- Animist's Caress - [GetSpellInfo(458)] = 458, -- Brown Horse - [GetSpellInfo(19819)] = 19819, -- Voice Amplification Modulator - [GetSpellInfo(6918)] = 6918, -- Summon Snufflenose - [GetSpellInfo(8764)] = 8764, -- Earthen Vest - [GetSpellInfo(5761)] = 5761, -- Mind-numbing Poison - [GetSpellInfo(10912)] = 10912, -- Mind Control - [GetSpellInfo(9482)] = 9482, -- Amplify Flames - [GetSpellInfo(10789)] = 10789, -- Spotted Frostsaber - [GetSpellInfo(12805)] = 12805, -- Getting Tide Pool Sample #2 - [GetSpellInfo(16986)] = 16986, -- Blood Talon - [GetSpellInfo(3335)] = 3335, -- Dark Sludge - [GetSpellInfo(23208)] = 23208, -- Exorcise Spirits - [GetSpellInfo(9950)] = 9950, -- Ornate Mithril Gloves - [GetSpellInfo(3607)] = 3607, -- Yenniku's Release - [GetSpellInfo(10683)] = 10683, -- Summon Green Wing Macaw - [GetSpellInfo(14930)] = 14930, -- Quickdraw Quiver - [GetSpellInfo(5666)] = 5666, -- Summon Timberling - [GetSpellInfo(28526)] = 28526, -- Icebolt - [GetSpellInfo(2149)] = 2149, -- Handstitched Leather Boots - [GetSpellInfo(3920)] = 3920, -- Crafted Light Shot - [GetSpellInfo(24334)] = 24334, -- Acid Spit - [GetSpellInfo(25167)] = 25167, -- Call Ancients - [GetSpellInfo(2538)] = 2538, -- Charred Wolf Meat - [GetSpellInfo(6617)] = 6617, -- Rage Potion - [GetSpellInfo(11453)] = 11453, -- Magic Resistance Potion - [GetSpellInfo(6500)] = 6500, -- Goblin Deviled Clams - [GetSpellInfo(10647)] = 10647, -- Feathered Breastplate - [GetSpellInfo(12091)] = 12091, -- White Wedding Dress - [GetSpellInfo(12089)] = 12089, -- Tuxedo Pants - [GetSpellInfo(12890)] = 12890, -- Deep Slumber - [GetSpellInfo(20531)] = 20531, -- Bind Chapter 3 - [GetSpellInfo(15998)] = 15998, -- Capture Worg Pup - [GetSpellInfo(16528)] = 16528, -- Numbing Pain - [GetSpellInfo(27291)] = 27291, -- Summon Magic Staff - [GetSpellInfo(16654)] = 16654, -- Radiant Gloves - [GetSpellInfo(6725)] = 6725, -- Flame Spike - [GetSpellInfo(27287)] = 27287, -- Energy Siphon - [GetSpellInfo(17458)] = 17458, -- Fluorescent Green Mechanostrider - [GetSpellInfo(27860)] = 27860, -- Engulfing Shadows - [GetSpellInfo(28472)] = 28472, -- Bramblewood Helm - [GetSpellInfo(6305)] = 6305, -- Flame Burst - [GetSpellInfo(6469)] = 6469, -- Skeletal Miner Explode - [GetSpellInfo(4221)] = 4221, -- Healing Tongue II - [GetSpellInfo(27590)] = 27590, -- Obsidian Mail Tunic - [GetSpellInfo(26636)] = 26636, -- Elune's Candle - [GetSpellInfo(17432)] = 17432, -- Opening Stratholme Postbox - [GetSpellInfo(7222)] = 7222, -- Iron Counterweight - [GetSpellInfo(20529)] = 20529, -- Bind Chapter 1 - [GetSpellInfo(9594)] = 9594, -- Attach Medallion to Shaft - [GetSpellInfo(580)] = 580, -- Large Timber Wolf - [GetSpellInfo(11209)] = 11209, -- Summon Smithing Hammer - [GetSpellInfo(23510)] = 23510, -- Stormpike Battle Charger - [GetSpellInfo(25117)] = 25117, -- Minor Wizard Oil - [GetSpellInfo(24851)] = 24851, -- Sandstalker Breastplate - [GetSpellInfo(15128)] = 15128, -- Mark of Flames - [GetSpellInfo(11479)] = 11479, -- Transmute: Iron to Gold - [GetSpellInfo(8693)] = 8693, -- Mind-numbing Poison II - [GetSpellInfo(25122)] = 25122, -- Brilliant Wizard Oil - [GetSpellInfo(23252)] = 23252, -- Swift Gray Wolf - [GetSpellInfo(23679)] = 23679, -- Elementals Deck - [GetSpellInfo(18414)] = 18414, -- Brightcloth Robe - [GetSpellInfo(17727)] = 17727, -- Create Spellstone (Greater) - [GetSpellInfo(25853)] = 25853, -- Empty Festive Mug - [GetSpellInfo(13143)] = 13143, -- Summon Razelikh - [GetSpellInfo(25465)] = 25465, -- Firework - [GetSpellInfo(24973)] = 24973, -- Clean Up Stink Bomb - [GetSpellInfo(10698)] = 10698, -- Summon Emerald Whelpling - [GetSpellInfo(15491)] = 15491, -- Collect Blessed Water - [GetSpellInfo(8895)] = 8895, -- Goblin Rocket Boots - [GetSpellInfo(17565)] = 17565, -- Transmute: Life to Earth - [GetSpellInfo(12616)] = 12616, -- Parachute Cloak - [GetSpellInfo(11356)] = 11356, -- Deadly Poison IV - [GetSpellInfo(17460)] = 17460, -- Frost Ram - [GetSpellInfo(19049)] = 19049, -- Wicked Leather Gauntlets - [GetSpellInfo(24420)] = 24420, -- Zandalar Signet of Serenity - [GetSpellInfo(1842)] = 1842, -- Disarm Trap - [GetSpellInfo(17579)] = 17579, -- Greater Holy Protection Potion - [GetSpellInfo(15261)] = 15261, -- Holy Fire - [GetSpellInfo(7929)] = 7929, -- Heavy Silk Bandage - [GetSpellInfo(2166)] = 2166, -- Toughened Leather Armor - [GetSpellInfo(2549)] = 2549, -- Seasoned Wolf Kabob - [GetSpellInfo(11418)] = 11418, -- Portal: Undercity - [GetSpellInfo(25018)] = 25018, -- Summon Murki - [GetSpellInfo(8517)] = 8517, -- Opening Strongbox - [GetSpellInfo(13978)] = 13978, -- Summon Aquementas - [GetSpellInfo(20904)] = 20904, -- Aimed Shot - [GetSpellInfo(4983)] = 4983, -- Create Cleansing Totem - [GetSpellInfo(6805)] = 6805, -- Dousing - [GetSpellInfo(16741)] = 16741, -- Stronghold Gauntlets - [GetSpellInfo(21188)] = 21188, -- Stun Bomb Attack - [GetSpellInfo(2964)] = 2964, -- Bolt of Woolen Cloth - [GetSpellInfo(18246)] = 18246, -- Mightfish Steak - [GetSpellInfo(5669)] = 5669, -- Peon Disguise - [GetSpellInfo(1112)] = 1112, -- Shadow Nova II - [GetSpellInfo(12056)] = 12056, -- Red Mageweave Vest - [GetSpellInfo(21736)] = 21736, -- Winterax Wisdom - [GetSpellInfo(10556)] = 10556, -- Turtle Scale Leggings - [GetSpellInfo(7126)] = 7126, -- Handstitched Leather Vest - [GetSpellInfo(8339)] = 8339, -- EZ-Thro Dynamite - [GetSpellInfo(898)] = 898, -- Create Fervor Potion - [GetSpellInfo(2795)] = 2795, -- Beer Basted Boar Ribs - [GetSpellInfo(8607)] = 8607, -- Smoked Bear Meat - [GetSpellInfo(3611)] = 3611, -- Minion of Morganth - [GetSpellInfo(18163)] = 18163, -- Strength of Arko'narin - [GetSpellInfo(27891)] = 27891, -- Disease Buffet - [GetSpellInfo(7978)] = 7978, -- Throw Dynamite - [GetSpellInfo(10009)] = 10009, -- Runed Mithril Hammer - [GetSpellInfo(8600)] = 8600, -- Fevered Plague - [GetSpellInfo(19029)] = 19029, -- Create Coagulated Rot - [GetSpellInfo(5267)] = 5267, -- Dalaran Wizard Disguise - [GetSpellInfo(17562)] = 17562, -- Transmute: Water to Air - [GetSpellInfo(444)] = 444, -- Teleport Lighthouse - [GetSpellInfo(7962)] = 7962, -- Break Big Stuff - [GetSpellInfo(3513)] = 3513, -- Polished Steel Boots - [GetSpellInfo(8283)] = 8283, -- Snufflenose Command - [GetSpellInfo(23787)] = 23787, -- Powerful Anti-Venom - [GetSpellInfo(7754)] = 7754, -- Loch Frenzy Delight - [GetSpellInfo(459)] = 459, -- Gray Wolf - [GetSpellInfo(17577)] = 17577, -- Greater Arcane Protection Potion - [GetSpellInfo(11067)] = 11067, -- Perm. Illusion Tyrion - [GetSpellInfo(24214)] = 24214, -- Heart of Hakkar - Molthor chucks the heart - [GetSpellInfo(10180)] = 10180, -- Frostbolt - [GetSpellInfo(20528)] = 20528, -- Mor'rogal Enchant - [GetSpellInfo(19073)] = 19073, -- Chimeric Leggings - [GetSpellInfo(6405)] = 6405, -- Furbolg Form - [GetSpellInfo(16031)] = 16031, -- Releasing Corrupt Ooze - [GetSpellInfo(1452)] = 1452, -- Arcane Spirit IV - [GetSpellInfo(23710)] = 23710, -- Molten Belt - [GetSpellInfo(7817)] = 7817, -- Rough Bronze Boots - [GetSpellInfo(12047)] = 12047, -- Colorful Kilt - [GetSpellInfo(3292)] = 3292, -- Heavy Copper Broadsword - [GetSpellInfo(22372)] = 22372, -- Demon Portal - [GetSpellInfo(18992)] = 18992, -- Teal Kodo - [GetSpellInfo(7655)] = 7655, -- Hex of Ravenclaw - [GetSpellInfo(19484)] = 19484, -- Majordomo Teleport Visual - [GetSpellInfo(10574)] = 10574, -- Wild Leather Cloak - [GetSpellInfo(16725)] = 16725, -- Radiant Leggings - [GetSpellInfo(8778)] = 8778, -- Boots of Darkness - [GetSpellInfo(22711)] = 22711, -- Shadowskin Gloves - [GetSpellInfo(7751)] = 7751, -- Brilliant Smallfish - [GetSpellInfo(17728)] = 17728, -- Create Spellstone (Major) - [GetSpellInfo(12459)] = 12459, -- Deadly Scope - [GetSpellInfo(28219)] = 28219, -- Polar Tunic - [GetSpellInfo(22757)] = 22757, -- Elemental Sharpening Stone - [GetSpellInfo(9072)] = 9072, -- Red Whelp Gloves - [GetSpellInfo(3847)] = 3847, -- Red Woolen Boots - [GetSpellInfo(23152)] = 23152, -- Summon Xorothian Dreadsteed - [GetSpellInfo(17578)] = 17578, -- Greater Shadow Protection Potion - [GetSpellInfo(14804)] = 14804, -- Copy of Release Rageclaw - [GetSpellInfo(19052)] = 19052, -- Wicked Leather Bracers - [GetSpellInfo(4094)] = 4094, -- Barbecued Buzzard Wing - [GetSpellInfo(12059)] = 12059, -- White Bandit Mask - [GetSpellInfo(17554)] = 17554, -- Elixir of Superior Defense - [GetSpellInfo(28299)] = 28299, -- Ball Lightning - [GetSpellInfo(21935)] = 21935, -- SnowMaster 9000 - [GetSpellInfo(24252)] = 24252, -- Swift Zulian Tiger - [GetSpellInfo(885)] = 885, -- Invisibility - [GetSpellInfo(17555)] = 17555, -- Elixir of the Sages - [GetSpellInfo(6415)] = 6415, -- Fillet of Frenzy - [GetSpellInfo(16622)] = 16622, -- Enhance Blunt Weapon V - [GetSpellInfo(442)] = 442, -- Teleport Northshire Abbey - [GetSpellInfo(23254)] = 23254, -- Redeeming the Soul - [GetSpellInfo(12562)] = 12562, -- The Big One - [GetSpellInfo(7023)] = 7023, -- Goblin Camera Connection - [GetSpellInfo(4982)] = 4982, -- Pillar Delving - [GetSpellInfo(10708)] = 10708, -- Summon Snowy Owl - [GetSpellInfo(10934)] = 10934, -- Smite - [GetSpellInfo(7081)] = 7081, -- Encage - [GetSpellInfo(21885)] = 21885, -- Heal Vylestem Vine - [GetSpellInfo(19825)] = 19825, -- Master Engineer's Goggles - [GetSpellInfo(16533)] = 16533, -- Emberseer Start - [GetSpellInfo(10562)] = 10562, -- Big Voodoo Cloak - [GetSpellInfo(18243)] = 18243, -- Nightfin Soup - [GetSpellInfo(25804)] = 25804, -- Rumsey Rum Black Label - [GetSpellInfo(15627)] = 15627, -- Applying the Lure - [GetSpellInfo(17566)] = 17566, -- Transmute: Earth to Life - [GetSpellInfo(17464)] = 17464, -- Brown Skeletal Horse - [GetSpellInfo(12537)] = 12537, -- Quest - Summon Treant - [GetSpellInfo(9903)] = 9903, -- Enhance Blunt Weapon IV - [GetSpellInfo(22662)] = 22662, -- Wither - [GetSpellInfo(22876)] = 22876, -- Summon Netherwalker - [GetSpellInfo(5099)] = 5099, -- Disruption - [GetSpellInfo(10548)] = 10548, -- Nightscape Pants - [GetSpellInfo(12060)] = 12060, -- Red Mageweave Pants - [GetSpellInfo(23530)] = 23530, -- Summon Tiny Red Dragon - [GetSpellInfo(7836)] = 7836, -- Blackmouth Oil - [GetSpellInfo(12080)] = 12080, -- Pink Mageweave Shirt - [GetSpellInfo(17559)] = 17559, -- Transmute: Air to Fire - [GetSpellInfo(12048)] = 12048, -- Black Mageweave Vest - [GetSpellInfo(15734)] = 15734, -- Summon - [GetSpellInfo(25118)] = 25118, -- Minor Mana Oil - [GetSpellInfo(10721)] = 10721, -- Summon Elven Wisp - [GetSpellInfo(3658)] = 3658, -- Summon Theurgist - [GetSpellInfo(22732)] = 22732, -- Major Rejuvenation Potion - [GetSpellInfo(18456)] = 18456, -- Truefaith Vestments - [GetSpellInfo(22027)] = 22027, -- Remove Insignia - [GetSpellInfo(12615)] = 12615, -- Spellpower Goggles Xtreme - [GetSpellInfo(9952)] = 9952, -- Ornate Mithril Shoulders - [GetSpellInfo(6234)] = 6234, -- Incineration - [GetSpellInfo(12622)] = 12622, -- Green Lens - [GetSpellInfo(606)] = 606, -- Mind Rot - [GetSpellInfo(24889)] = 24889, -- Create Signet of Beckoning: Fire - [GetSpellInfo(10738)] = 10738, -- Unlocking - [GetSpellInfo(8800)] = 8800, -- Dynamite - [GetSpellInfo(28505)] = 28505, -- Summon Poley - [GetSpellInfo(24888)] = 24888, -- Create Crest of Beckoning: Water - [GetSpellInfo(10621)] = 10621, -- Wolfshead Helm - [GetSpellInfo(18166)] = 18166, -- Summon Magram Ravager - [GetSpellInfo(18629)] = 18629, -- Runecloth Bandage - [GetSpellInfo(30152)] = 30152, -- Summon White Tiger Cub - [GetSpellInfo(10098)] = 10098, -- Smelt Truesilver - [GetSpellInfo(688)] = 688, -- Summon Imp - [GetSpellInfo(8153)] = 8153, -- Owl Form - [GetSpellInfo(8368)] = 8368, -- Ironforge Gauntlets - [GetSpellInfo(15746)] = 15746, -- Disturb Rookery Egg - [GetSpellInfo(5414)] = 5414, -- Balance of Nature - [GetSpellInfo(3759)] = 3759, -- Embossed Leather Pants - [GetSpellInfo(28800)] = 28800, -- Word of Thawing - [GetSpellInfo(2331)] = 2331, -- Minor Mana Potion - [GetSpellInfo(23161)] = 23161, -- Summon Dreadsteed - [GetSpellInfo(23705)] = 23705, -- Dawn Treaders - [GetSpellInfo(9997)] = 9997, -- Wicked Mithril Blade - [GetSpellInfo(6651)] = 6651, -- Instant Toxin - [GetSpellInfo(1980)] = 1980, -- Bombard - [GetSpellInfo(10715)] = 10715, -- Summon Blue Racer - [GetSpellInfo(10854)] = 10854, -- Flames of Chaos - [GetSpellInfo(16650)] = 16650, -- Wildthorn Mail - [GetSpellInfo(12076)] = 12076, -- Shadoweave Shoulders - [GetSpellInfo(11820)] = 11820, -- Electrified Net - [GetSpellInfo(10733)] = 10733, -- Flame Spray - [GetSpellInfo(11568)] = 11568, -- Uldaman Sub-Boss Agro - [GetSpellInfo(20364)] = 20364, -- Bury Samuel's Remains - [GetSpellInfo(15906)] = 15906, -- Dragonbreath Chili - [GetSpellInfo(23232)] = 23232, -- Binding Volume II - [GetSpellInfo(16601)] = 16601, -- Fist of Shahram - [GetSpellInfo(9970)] = 9970, -- Heavy Mithril Helm - [GetSpellInfo(3113)] = 3113, -- Enhance Blunt Weapon II - [GetSpellInfo(24167)] = 24167, -- Prophetic Aura - [GetSpellInfo(5408)] = 5408, -- Quest - Sergra Darkthorn Spell - [GetSpellInfo(14807)] = 14807, -- Greater Magic Wand - [GetSpellInfo(7256)] = 7256, -- Shadow Protection Potion - [GetSpellInfo(20756)] = 20756, -- Create Soulstone (Greater) - [GetSpellInfo(13819)] = 13819, -- Summon Warhorse - [GetSpellInfo(24801)] = 24801, -- Smoked Desert Dumplings - [GetSpellInfo(23632)] = 23632, -- Girdle of the Dawn - [GetSpellInfo(12618)] = 12618, -- Rose Colored Goggles - [GetSpellInfo(23066)] = 23066, -- Red Firework - [GetSpellInfo(12084)] = 12084, -- Red Mageweave Headband - [GetSpellInfo(22598)] = 22598, -- Arcane Mantle of the Dawn - [GetSpellInfo(3766)] = 3766, -- Dark Leather Belt - [GetSpellInfo(12052)] = 12052, -- Shadoweave Pants - [GetSpellInfo(22795)] = 22795, -- Core Marksman Rifle - [GetSpellInfo(17708)] = 17708, -- Summon Diablo - [GetSpellInfo(11399)] = 11399, -- Mind-numbing Poison III - [GetSpellInfo(3443)] = 3443, -- Enchanted Quickness - [GetSpellInfo(15794)] = 15794, -- Summon Blackhand Dreadweaver - [GetSpellInfo(26419)] = 26419, -- Acid Spray - [GetSpellInfo(28612)] = 28612, -- Conjure Food - [GetSpellInfo(3952)] = 3952, -- Minor Recombobulator - [GetSpellInfo(20716)] = 20716, -- Sand Breath - [GetSpellInfo(4209)] = 4209, -- Healing Tongue - [GetSpellInfo(19077)] = 19077, -- Blue Dragonscale Breastplate - [GetSpellInfo(9959)] = 9959, -- Heavy Mithril Breastplate - [GetSpellInfo(8768)] = 8768, -- Iron Buckle - [GetSpellInfo(17048)] = 17048, -- Soul Claim - [GetSpellInfo(6741)] = 6741, -- Identify Brood - [GetSpellInfo(3670)] = 3670, -- Unlock Maury's Foot - [GetSpellInfo(8395)] = 8395, -- Emerald Raptor - [GetSpellInfo(15255)] = 15255, -- Mechanical Repair Kit - [GetSpellInfo(9983)] = 9983, -- Copper Claymore - [GetSpellInfo(3644)] = 3644, -- Speak with Heads - [GetSpellInfo(12085)] = 12085, -- Tuxedo Shirt - [GetSpellInfo(27586)] = 27586, -- Jagged Obsidian Shield - [GetSpellInfo(10509)] = 10509, -- Turtle Scale Gloves - [GetSpellInfo(2841)] = 2841, -- Creeping Torment - [GetSpellInfo(3857)] = 3857, -- Enchanter's Cowl - [GetSpellInfo(23129)] = 23129, -- World Enlarger - [GetSpellInfo(10451)] = 10451, -- Implosion - [GetSpellInfo(3537)] = 3537, -- Minions of Malathrom - [GetSpellInfo(11473)] = 11473, -- Ghost Dye - [GetSpellInfo(7220)] = 7220, -- Weapon Chain - [GetSpellInfo(19792)] = 19792, -- Thorium Rifle - [GetSpellInfo(3377)] = 3377, -- Gooey Spider Cake - [GetSpellInfo(27738)] = 27738, -- Right Piece of Lord Valthalak's Amulet - [GetSpellInfo(4093)] = 4093, -- Reconstruction - [GetSpellInfo(22331)] = 22331, -- Rugged Leather - [GetSpellInfo(3448)] = 3448, -- Lesser Invisibility Potion - [GetSpellInfo(24164)] = 24164, -- Presence of Sight - [GetSpellInfo(12609)] = 12609, -- Catseye Elixir - [GetSpellInfo(691)] = 691, -- Summon Felhunter - [GetSpellInfo(19588)] = 19588, -- Place Ghost Magnet - [GetSpellInfo(25992)] = 25992, -- Brood of Nozdormu Factoin +1000 - [GetSpellInfo(18240)] = 18240, -- Grilled Squid - [GetSpellInfo(10623)] = 10623, -- Chain Heal - [GetSpellInfo(6470)] = 6470, -- Tiny Bronze Key - [GetSpellInfo(15999)] = 15999, -- Summon Worg Pup - [GetSpellInfo(8016)] = 8016, -- Spirit Decay - [GetSpellInfo(26102)] = 26102, -- Sand Blast - [GetSpellInfo(2394)] = 2394, -- Blue Linen Shirt - [GetSpellInfo(3934)] = 3934, -- Flying Tiger Goggles - [GetSpellInfo(7753)] = 7753, -- Longjaw Mud Snapper - [GetSpellInfo(13714)] = 13714, -- Create Samophlange Manual - [GetSpellInfo(16730)] = 16730, -- Imperial Plate Leggings - [GetSpellInfo(6618)] = 6618, -- Great Rage Potion - [GetSpellInfo(24149)] = 24149, -- Presence of Might - [GetSpellInfo(6925)] = 6925, -- Gift of the Xavian - [GetSpellInfo(30156)] = 30156, -- Summon Hippogryph Hatchling - [GetSpellInfo(18448)] = 18448, -- Mooncloth Shoulders - [GetSpellInfo(27585)] = 27585, -- Heavy Obsidian Belt - [GetSpellInfo(28099)] = 28099, -- Shock - [GetSpellInfo(17456)] = 17456, -- Red & Blue Mechanostrider - [GetSpellInfo(24901)] = 24901, -- Runed Stygian Leggings - [GetSpellInfo(23078)] = 23078, -- Goblin Jumper Cables XL - [GetSpellInfo(3775)] = 3775, -- Guardian Belt - [GetSpellInfo(23678)] = 23678, -- Warlord Deck - [GetSpellInfo(8256)] = 8256, -- Lethal Toxin - [GetSpellInfo(126)] = 126, -- Eye of Kilrogg - [GetSpellInfo(27739)] = 27739, -- Top Piece of Lord Valthalak's Amulet - [GetSpellInfo(10630)] = 10630, -- Gauntlets of the Sea - [GetSpellInfo(19085)] = 19085, -- Black Dragonscale Breastplate - [GetSpellInfo(6461)] = 6461, -- Pick Lock - [GetSpellInfo(4945)] = 4945, -- Summon Dagun - [GetSpellInfo(11726)] = 11726, -- Enslave Demon - [GetSpellInfo(7629)] = 7629, -- Red Linen Vest - [GetSpellInfo(2951)] = 2951, -- Hellfire III - [GetSpellInfo(24726)] = 24726, -- Deputize Agent of Nozdormu - [GetSpellInfo(20814)] = 20814, -- Collect Dire Water - [GetSpellInfo(18415)] = 18415, -- Brightcloth Gloves - [GetSpellInfo(9901)] = 9901, -- Soothe Animal - [GetSpellInfo(3768)] = 3768, -- Hillman's Shoulders - [GetSpellInfo(10678)] = 10678, -- Summon Silver Tabby - [GetSpellInfo(2332)] = 2332, -- Minor Rejuvenation Potion - [GetSpellInfo(7481)] = 7481, -- Howling Rage - [GetSpellInfo(472)] = 472, -- Pinto Horse - [GetSpellInfo(3963)] = 3963, -- Compact Harvest Reaper Kit - [GetSpellInfo(3860)] = 3860, -- Boots of the Enchanter - [GetSpellInfo(15067)] = 15067, -- Summon Sprite Darter Hatchling - [GetSpellInfo(21957)] = 21957, -- Create Amulet of Union - [GetSpellInfo(8087)] = 8087, -- Shiny Bauble - [GetSpellInfo(3453)] = 3453, -- Elixir of Detect Lesser Invisibility - [GetSpellInfo(7919)] = 7919, -- Shoot Crossbow - [GetSpellInfo(19053)] = 19053, -- Chimeric Gloves - [GetSpellInfo(22979)] = 22979, -- Shadow Flame - [GetSpellInfo(3323)] = 3323, -- Runed Copper Gauntlets - [GetSpellInfo(23222)] = 23222, -- Swift Yellow Mechanostrider - [GetSpellInfo(25180)] = 25180, -- Nature Weakness - [GetSpellInfo(9853)] = 9853, -- Entangling Roots - [GetSpellInfo(12596)] = 12596, -- Hi-Impact Mithril Slugs - [GetSpellInfo(26587)] = 26587, -- Opening Scarab Coffer - [GetSpellInfo(28270)] = 28270, -- Polymorph: Cow - [GetSpellInfo(12070)] = 12070, -- Dreamweave Vest - [GetSpellInfo(16028)] = 16028, -- Freeze Rookery Egg - Prototype - [GetSpellInfo(8367)] = 8367, -- Ironforge Breastplate - [GetSpellInfo(9577)] = 9577, -- Uldaman Key Staff - [GetSpellInfo(7827)] = 7827, -- Rainbow Fin Albacore - [GetSpellInfo(9945)] = 9945, -- Ornate Mithril Pants - [GetSpellInfo(12258)] = 12258, -- Summon Shadowcaster - [GetSpellInfo(818)] = 818, -- Basic Campfire - [GetSpellInfo(8435)] = 8435, -- Forked Lightning - [GetSpellInfo(3146)] = 3146, -- Daunting Growl - [GetSpellInfo(2838)] = 2838, -- Creeping Pain - [GetSpellInfo(17552)] = 17552, -- Mighty Rage Potion - [GetSpellInfo(12617)] = 12617, -- Deepdive Helmet - [GetSpellInfo(16378)] = 16378, -- Temperature Reading - [GetSpellInfo(5403)] = 5403, -- Crash of Waves - [GetSpellInfo(7156)] = 7156, -- Guardian Gloves - [GetSpellInfo(3359)] = 3359, -- Drink Potion - [GetSpellInfo(759)] = 759, -- Conjure Mana Agate - [GetSpellInfo(27241)] = 27241, -- Summon Gurky - [GetSpellInfo(25120)] = 25120, -- Lesser Mana Oil - [GetSpellInfo(20855)] = 20855, -- Black Dragonscale Boots - [GetSpellInfo(6510)] = 6510, -- Blinding Powder - [GetSpellInfo(8789)] = 8789, -- Crimson Silk Cloak - [GetSpellInfo(3361)] = 3361, -- Dummy NPC Summon - [GetSpellInfo(12066)] = 12066, -- Red Mageweave Gloves - [GetSpellInfo(20773)] = 20773, -- Redemption - [GetSpellInfo(12243)] = 12243, -- Summon Mechanical Chicken - [GetSpellInfo(15958)] = 15958, -- Collect Rookery Egg - [GetSpellInfo(24966)] = 24966, -- Honor Points +2388 - [GetSpellInfo(16247)] = 16247, -- Curse of Thorns - [GetSpellInfo(18887)] = 18887, -- Create Nimboya's Laden Pike - [GetSpellInfo(7818)] = 7818, -- Silver Rod - [GetSpellInfo(16653)] = 16653, -- Thorium Helm - [GetSpellInfo(28161)] = 28161, -- Savage Guard - [GetSpellInfo(22458)] = 22458, -- Healing Circle - [GetSpellInfo(1451)] = 1451, -- Arcane Spirit III - [GetSpellInfo(29475)] = 29475, -- Resilience of the Scourge - [GetSpellInfo(17133)] = 17133, -- Create Pamela's Doll - [GetSpellInfo(15120)] = 15120, -- Cenarion Beacon - [GetSpellInfo(23246)] = 23246, -- Purple Skeletal Warhorse - [GetSpellInfo(15792)] = 15792, -- Summon Blackhand Veteran - [GetSpellInfo(9097)] = 9097, -- Summon Demon of the Orb - [GetSpellInfo(3477)] = 3477, -- Spirit Steal - [GetSpellInfo(19821)] = 19821, -- Arcane Bomb - [GetSpellInfo(4320)] = 4320, -- Trelane's Freezing Touch - [GetSpellInfo(3336)] = 3336, -- Green Iron Gauntlets - [GetSpellInfo(12938)] = 12938, -- Fel Curse - [GetSpellInfo(11643)] = 11643, -- Golden Scale Gauntlets - [GetSpellInfo(3114)] = 3114, -- Enhance Blunt Weapon III - [GetSpellInfo(8980)] = 8980, -- Skeletal Horse - [GetSpellInfo(26072)] = 26072, -- Dust Cloud - [GetSpellInfo(4629)] = 4629, -- Rain of Fire - [GetSpellInfo(16640)] = 16640, -- Dense Weightstone - [GetSpellInfo(2334)] = 2334, -- Elixir of Minor Fortitude - [GetSpellInfo(22797)] = 22797, -- Force Reactive Disk - [GetSpellInfo(11085)] = 11085, -- Chain Bolt - [GetSpellInfo(10053)] = 10053, -- Conjure Mana Citrine - [GetSpellInfo(7359)] = 7359, -- Bright Campfire - [GetSpellInfo(25247)] = 25247, -- Longsight - [GetSpellInfo(3955)] = 3955, -- Explosive Sheep - [GetSpellInfo(8688)] = 8688, -- Instant Poison III - [GetSpellInfo(16667)] = 16667, -- Demon Forged Breastplate - [GetSpellInfo(10011)] = 10011, -- Blight - [GetSpellInfo(3174)] = 3174, -- Elixir of Poison Resistance - [GetSpellInfo(21730)] = 21730, -- Planting Vipore's Beacon - [GetSpellInfo(19106)] = 19106, -- Onyxia Scale Breastplate - [GetSpellInfo(5266)] = 5266, -- Syndicate Disguise - [GetSpellInfo(3852)] = 3852, -- Gloves of Meditation - [GetSpellInfo(6490)] = 6490, -- Sarilus's Elementals - [GetSpellInfo(11447)] = 11447, -- Elixir of Waterwalking - [GetSpellInfo(11338)] = 11338, -- Instant Poison IV - [GetSpellInfo(24895)] = 24895, -- Create Scepter of Beckoning: Fire - [GetSpellInfo(578)] = 578, -- Black Wolf - [GetSpellInfo(11434)] = 11434, -- Gong Zul'Farrak Gong - [GetSpellInfo(22719)] = 22719, -- Black Battlestrider - [GetSpellInfo(21144)] = 21144, -- Egg Nog - [GetSpellInfo(10552)] = 10552, -- Turtle Scale Helm - [GetSpellInfo(18502)] = 18502, -- Curse of Hakkar - [GetSpellInfo(17536)] = 17536, -- Awaken Kerlonian - [GetSpellInfo(10787)] = 10787, -- Panther - [GetSpellInfo(6728)] = 6728, -- Enveloping Winds - [GetSpellInfo(21729)] = 21729, -- Planting Slidore's Beacon - [GetSpellInfo(22928)] = 22928, -- Shifting Cloak - [GetSpellInfo(3956)] = 3956, -- Green Tinted Goggles - [GetSpellInfo(19082)] = 19082, -- Runic Leather Headband - [GetSpellInfo(16396)] = 16396, -- Flame Breath - [GetSpellInfo(5412)] = 5412, -- Balance of Nature Failure - [GetSpellInfo(19047)] = 19047, -- Cured Rugged Hide - [GetSpellInfo(14932)] = 14932, -- Thick Leather Ammo Pouch - [GetSpellInfo(17634)] = 17634, -- Flask of Petrification - [GetSpellInfo(7755)] = 7755, -- Bristle Whisker Catfish - [GetSpellInfo(11729)] = 11729, -- Create Healthstone (Greater) - [GetSpellInfo(6297)] = 6297, -- Fiery Blaze - [GetSpellInfo(6690)] = 6690, -- Lesser Wizard's Robe - [GetSpellInfo(8386)] = 8386, -- Attacking - [GetSpellInfo(2406)] = 2406, -- Gray Woolen Shirt - [GetSpellInfo(2395)] = 2395, -- Barbaric Linen Vest - [GetSpellInfo(22840)] = 22840, -- Arcanum of Rapidity - [GetSpellInfo(23442)] = 23442, -- Everlook Transporter - [GetSpellInfo(8376)] = 8376, -- Earthgrab Totem - [GetSpellInfo(5967)] = 5967, -- Pickpocket (PT) - [GetSpellInfo(23054)] = 23054, -- Igniting Kroshius - [GetSpellInfo(6619)] = 6619, -- Cowardly Flight Potion - [GetSpellInfo(3397)] = 3397, -- Big Bear Steak - [GetSpellInfo(17293)] = 17293, -- Burning Winds - [GetSpellInfo(28210)] = 28210, -- Gaea's Embrace - [GetSpellInfo(27659)] = 27659, -- Enchanted Runecloth Bag - [GetSpellInfo(19078)] = 19078, -- Living Leggings - [GetSpellInfo(7162)] = 7162, -- First Aid - [GetSpellInfo(19796)] = 19796, -- Dark Iron Rifle - [GetSpellInfo(17575)] = 17575, -- Greater Frost Protection Potion - [GetSpellInfo(19060)] = 19060, -- Green Dragonscale Leggings - [GetSpellInfo(19797)] = 19797, -- Conjure Torch of Retribution - [GetSpellInfo(24195)] = 24195, -- Grom's Tribute - [GetSpellInfo(7739)] = 7739, -- Inferno Shell - [GetSpellInfo(12735)] = 12735, -- Fill the Egg of Hakkar - [GetSpellInfo(12280)] = 12280, -- Acid of Hakkar - [GetSpellInfo(24850)] = 24850, -- Sandstalker Gauntlets - [GetSpellInfo(18439)] = 18439, -- Brightcloth Pants - [GetSpellInfo(6777)] = 6777, -- Gray Ram - [GetSpellInfo(6704)] = 6704, -- Thick Murloc Armor - [GetSpellInfo(9879)] = 9879, -- Self Destruct - [GetSpellInfo(9082)] = 9082, -- Create Containment Coffer - [GetSpellInfo(3755)] = 3755, -- Linen Bag - [GetSpellInfo(23399)] = 23399, -- Barbaric Bracers - [GetSpellInfo(4942)] = 4942, -- Lesser Stoneshield Potion - [GetSpellInfo(26418)] = 26418, -- Small Red Rocket - [GetSpellInfo(24245)] = 24245, -- String Together Heads - [GetSpellInfo(10688)] = 10688, -- Summon Cockroach - [GetSpellInfo(4539)] = 4539, -- Strength of the Ages - [GetSpellInfo(4974)] = 4974, -- Wither Touch - [GetSpellInfo(12253)] = 12253, -- Dowse Eternal Flame - [GetSpellInfo(9002)] = 9002, -- Coarse Dynamite - [GetSpellInfo(6950)] = 6950, -- Faerie Fire - [GetSpellInfo(11836)] = 11836, -- Freeze Solid - [GetSpellInfo(16969)] = 16969, -- Ornate Thorium Handaxe - [GetSpellInfo(4131)] = 4131, -- Banish Cresting Exile - [GetSpellInfo(19669)] = 19669, -- Arcanite Skeleton Key - [GetSpellInfo(9062)] = 9062, -- Small Leather Ammo Pouch - [GetSpellInfo(4064)] = 4064, -- Rough Copper Bomb - [GetSpellInfo(22722)] = 22722, -- Red Skeletal Warhorse - [GetSpellInfo(14293)] = 14293, -- Lesser Magic Wand - [GetSpellInfo(12065)] = 12065, -- Mageweave Bag - [GetSpellInfo(20604)] = 20604, -- Dominate Mind - [GetSpellInfo(18409)] = 18409, -- Runecloth Cloak - [GetSpellInfo(855)] = 855, -- Feeblemind III - [GetSpellInfo(24125)] = 24125, -- Blood Tiger Shoulders - [GetSpellInfo(6202)] = 6202, -- Create Healthstone (Lesser) - [GetSpellInfo(16497)] = 16497, -- Stun Bomb - [GetSpellInfo(31)] = 31, -- Teleport Goldshire - [GetSpellInfo(20762)] = 20762, -- Soulstone Resurrection - [GetSpellInfo(8758)] = 8758, -- Azure Silk Pants - [GetSpellInfo(22596)] = 22596, -- Shadow Mantle of the Dawn - [GetSpellInfo(6252)] = 6252, -- Southsea Cannon Fire - [GetSpellInfo(19107)] = 19107, -- Black Dragonscale Leggings - [GetSpellInfo(17953)] = 17953, -- Create Firestone (Major) - [GetSpellInfo(18445)] = 18445, -- Mooncloth Bag - [GetSpellInfo(3278)] = 3278, -- Heavy Wool Bandage - [GetSpellInfo(10788)] = 10788, -- Leopard - [GetSpellInfo(6296)] = 6296, -- Enchant: Fiery Blaze - [GetSpellInfo(3501)] = 3501, -- Green Iron Bracers - [GetSpellInfo(16080)] = 16080, -- Red Wolf - [GetSpellInfo(447)] = 447, -- Teleport Treant - [GetSpellInfo(20006)] = 20006, -- Unholy Curse - [GetSpellInfo(2544)] = 2544, -- Crab Cake - [GetSpellInfo(10682)] = 10682, -- Summon Hyacinth Macaw - [GetSpellInfo(22563)] = 22563, -- Recall - [GetSpellInfo(19088)] = 19088, -- Heavy Scorpid Helm - [GetSpellInfo(3502)] = 3502, -- Green Iron Helm - [GetSpellInfo(17162)] = 17162, -- Summon Water Elemental - [GetSpellInfo(16587)] = 16587, -- Dark Whispers - [GetSpellInfo(23223)] = 23223, -- Swift White Mechanostrider - [GetSpellInfo(11082)] = 11082, -- Megavolt - [GetSpellInfo(17571)] = 17571, -- Elixir of the Mongoose - [GetSpellInfo(18960)] = 18960, -- Teleport: Moonglade - [GetSpellInfo(23429)] = 23429, -- Summon Loggerhead Snapjaw - [GetSpellInfo(7398)] = 7398, -- Birth - [GetSpellInfo(19833)] = 19833, -- Flawless Arcanite Rifle - [GetSpellInfo(14809)] = 14809, -- Lesser Mystic Wand - [GetSpellInfo(26086)] = 26086, -- Felcloth Bag - [GetSpellInfo(19083)] = 19083, -- Wicked Leather Pants - [GetSpellInfo(2742)] = 2742, -- Bronze Shortsword - [GetSpellInfo(11467)] = 11467, -- Elixir of Greater Agility - [GetSpellInfo(21027)] = 21027, -- Spark - [GetSpellInfo(16965)] = 16965, -- Bleakwood Hew - [GetSpellInfo(5140)] = 5140, -- Detonate - [GetSpellInfo(20649)] = 20649, -- Heavy Leather - [GetSpellInfo(8856)] = 8856, -- Bending Shinbone - [GetSpellInfo(2541)] = 2541, -- Coyote Steak - [GetSpellInfo(6717)] = 6717, -- Place Lion Carcass - [GetSpellInfo(3295)] = 3295, -- Deadly Bronze Poniard - [GetSpellInfo(7132)] = 7132, -- Summon Lupine Delusions - [GetSpellInfo(15853)] = 15853, -- Lean Wolf Steak - [GetSpellInfo(9149)] = 9149, -- Heavy Earthen Gloves - [GetSpellInfo(10518)] = 10518, -- Turtle Scale Bracers - [GetSpellInfo(16796)] = 16796, -- Summon Shy-Rotam - [GetSpellInfo(9273)] = 9273, -- Goblin Jumper Cables - [GetSpellInfo(12897)] = 12897, -- Gnomish Goggles - [GetSpellInfo(24849)] = 24849, -- Sandstalker Bracers - [GetSpellInfo(15779)] = 15779, -- White Mechanostrider - [GetSpellInfo(23227)] = 23227, -- Swift Palomino - [GetSpellInfo(4960)] = 4960, -- Create Fervor Potion (New) - [GetSpellInfo(15750)] = 15750, -- Rookery Whelp Spawn-in Spell - [GetSpellInfo(3503)] = 3503, -- Golden Scale Coif - [GetSpellInfo(3013)] = 3013, -- Volley II - [GetSpellInfo(12458)] = 12458, -- Evil God Counterspell - [GetSpellInfo(7896)] = 7896, -- Exploding Shot - [GetSpellInfo(19667)] = 19667, -- Golden Skeleton Key - [GetSpellInfo(3866)] = 3866, -- Stylish Red Shirt - [GetSpellInfo(24902)] = 24902, -- Runed Stygian Belt - [GetSpellInfo(10700)] = 10700, -- Summon Faeling - [GetSpellInfo(7383)] = 7383, -- Water Bubble - [GetSpellInfo(25262)] = 25262, -- Abomination Spit - [GetSpellInfo(26407)] = 26407, -- Festive Red Pant Suit - [GetSpellInfo(30174)] = 30174, -- Riding Turtle - [GetSpellInfo(16598)] = 16598, -- Will of Shahram - [GetSpellInfo(6422)] = 6422, -- Ashcrombe's Teleport - [GetSpellInfo(6501)] = 6501, -- Clam Chowder - [GetSpellInfo(17564)] = 17564, -- Transmute: Water to Undeath - [GetSpellInfo(16993)] = 16993, -- Masterwork Stormhammer - [GetSpellInfo(9147)] = 9147, -- Earthen Leather Shoulders - [GetSpellInfo(2158)] = 2158, -- Fine Leather Boots - [GetSpellInfo(9616)] = 9616, -- Wild Regeneration - [GetSpellInfo(4520)] = 4520, -- Wide Sweep - [GetSpellInfo(27290)] = 27290, -- Increase Reputation - [GetSpellInfo(9966)] = 9966, -- Mithril Scale Shoulders - [GetSpellInfo(11460)] = 11460, -- Elixir of Detect Undead - [GetSpellInfo(1698)] = 1698, -- Shockwave - [GetSpellInfo(16081)] = 16081, -- Arctic Wolf - [GetSpellInfo(13484)] = 13484, -- Plant Gor'tesh Head - [GetSpellInfo(16059)] = 16059, -- Tawny Sabercat - [GetSpellInfo(23707)] = 23707, -- Lava Belt - [GetSpellInfo(16594)] = 16594, -- Crypt Scarabs - [GetSpellInfo(10511)] = 10511, -- Turtle Scale Breastplate - [GetSpellInfo(10258)] = 10258, -- Awaken Vault Warder - [GetSpellInfo(3967)] = 3967, -- Big Iron Bomb - [GetSpellInfo(16745)] = 16745, -- Enchanted Thorium Breastplate - [GetSpellInfo(25688)] = 25688, -- Narain! - [GetSpellInfo(7960)] = 7960, -- Scry on Azrethoc - [GetSpellInfo(3818)] = 3818, -- Cured Heavy Hide - [GetSpellInfo(7101)] = 7101, -- Flame Blast - [GetSpellInfo(22597)] = 22597, -- Nature Mantle of the Dawn - [GetSpellInfo(10799)] = 10799, -- Violet Raptor - [GetSpellInfo(27724)] = 27724, -- Cenarion Herb Bag - [GetSpellInfo(7430)] = 7430, -- Arclight Spanner - [GetSpellInfo(10676)] = 10676, -- Summon Orange Tabby - [GetSpellInfo(22999)] = 22999, -- Defibrillate - [GetSpellInfo(3868)] = 3868, -- Phoenix Gloves - [GetSpellInfo(21048)] = 21048, -- Curse of the Tribes - [GetSpellInfo(18411)] = 18411, -- Frostweave Gloves - [GetSpellInfo(1050)] = 1050, -- Sacrifice - [GetSpellInfo(10520)] = 10520, -- Big Voodoo Robe - [GetSpellInfo(8137)] = 8137, -- Silithid Pox - [GetSpellInfo(16051)] = 16051, -- Barrier of Light - [GetSpellInfo(23313)] = 23313, -- Corrosive Acid - [GetSpellInfo(16570)] = 16570, -- Charged Arcane Bolt - [GetSpellInfo(23124)] = 23124, -- Human Orphan Whistle - [GetSpellInfo(25146)] = 25146, -- Transmute: Elemental Fire - [GetSpellInfo(12075)] = 12075, -- Lavender Mageweave Shirt - [GetSpellInfo(18437)] = 18437, -- Felcloth Boots - [GetSpellInfo(22779)] = 22779, -- Biznicks 247x128 Accurascope - [GetSpellInfo(10650)] = 10650, -- Dragonscale Breastplate - [GetSpellInfo(19564)] = 19564, -- Draw Water Sample - [GetSpellInfo(15591)] = 15591, -- Revive Ringo - [GetSpellInfo(12684)] = 12684, -- Kadrak's Flag - [GetSpellInfo(18416)] = 18416, -- Ghostweave Vest - [GetSpellInfo(1450)] = 1450, -- Arcane Spirit II - [GetSpellInfo(12904)] = 12904, -- Gnomish Ham Radio - [GetSpellInfo(17117)] = 17117, -- Magatha Incendia Powder - [GetSpellInfo(9811)] = 9811, -- Barbaric Iron Shoulders - [GetSpellInfo(13258)] = 13258, -- Summon Goblin Bomb - [GetSpellInfo(23041)] = 23041, -- Call Anathema - [GetSpellInfo(17501)] = 17501, -- Cannon Fire - [GetSpellInfo(27722)] = 27722, -- Sweet Surprise - [GetSpellInfo(26422)] = 26422, -- Large Red Rocket - [GetSpellInfo(3922)] = 3922, -- Handful of Copper Bolts - [GetSpellInfo(10542)] = 10542, -- Tough Scorpid Gloves - [GetSpellInfo(24161)] = 24161, -- Death's Embrace - [GetSpellInfo(19090)] = 19090, -- Stormshroud Shoulders - [GetSpellInfo(28244)] = 28244, -- Icebane Bracers - [GetSpellInfo(10695)] = 10695, -- Summon Dark Whelpling - [GetSpellInfo(25704)] = 25704, -- Smoked Sagefish - [GetSpellInfo(12072)] = 12072, -- Black Mageweave Headband - [GetSpellInfo(24092)] = 24092, -- Bloodvine Leggings - [GetSpellInfo(10677)] = 10677, -- Summon Siamese - [GetSpellInfo(28133)] = 28133, -- Cure Disease - [GetSpellInfo(19799)] = 19799, -- Dark Iron Bomb - [GetSpellInfo(3171)] = 3171, -- Elixir of Wisdom - [GetSpellInfo(9552)] = 9552, -- Searing Flames - [GetSpellInfo(12055)] = 12055, -- Shadoweave Robe - [GetSpellInfo(7054)] = 7054, -- Forsaken Skills - [GetSpellInfo(23430)] = 23430, -- Summon Olive Snapjaw - [GetSpellInfo(20755)] = 20755, -- Create Soulstone - [GetSpellInfo(8782)] = 8782, -- Truefaith Gloves - [GetSpellInfo(16057)] = 16057, -- Place Unforged Seal - [GetSpellInfo(2330)] = 2330, -- Minor Healing Potion - [GetSpellInfo(11456)] = 11456, -- Goblin Rocket Fuel - [GetSpellInfo(556)] = 556, -- Astral Recall - [GetSpellInfo(19793)] = 19793, -- Lifelike Mechanical Toad - [GetSpellInfo(16991)] = 16991, -- Annihilator - [GetSpellInfo(2817)] = 2817, -- Teach Bark of Doom - [GetSpellInfo(9888)] = 9888, -- Healing Touch - [GetSpellInfo(12590)] = 12590, -- Gyromatic Micro-Adjustor - [GetSpellInfo(10876)] = 10876, -- Mana Burn - [GetSpellInfo(16071)] = 16071, -- Curse of the Firebrand - [GetSpellInfo(10947)] = 10947, -- Mind Blast - [GetSpellInfo(11365)] = 11365, -- Bly's Band's Escape - [GetSpellInfo(28785)] = 28785, -- Locust Swarm - [GetSpellInfo(21912)] = 21912, -- Dummy Nuke - [GetSpellInfo(23663)] = 23663, -- Mantle of the Timbermaw - [GetSpellInfo(16801)] = 16801, -- Warosh's Transform - [GetSpellInfo(19089)] = 19089, -- Blue Dragonscale Shoulders - [GetSpellInfo(23233)] = 23233, -- Binding Volume III - [GetSpellInfo(2663)] = 2663, -- Copper Bracers - [GetSpellInfo(3507)] = 3507, -- Golden Scale Leggings - [GetSpellInfo(7901)] = 7901, -- Decayed Agility - [GetSpellInfo(16645)] = 16645, -- Radiant Belt - [GetSpellInfo(8784)] = 8784, -- Green Silk Armor - [GetSpellInfo(28089)] = 28089, -- Polarity Shift - [GetSpellInfo(24914)] = 24914, -- Darkrune Breastplate - [GetSpellInfo(19104)] = 19104, -- Frostsaber Tunic - [GetSpellInfo(12050)] = 12050, -- Black Mageweave Robe - [GetSpellInfo(28995)] = 28995, -- Stoneskin - [GetSpellInfo(18149)] = 18149, -- Volatile Infection - [GetSpellInfo(20853)] = 20853, -- Corehound Boots - [GetSpellInfo(18413)] = 18413, -- Ghostweave Gloves - [GetSpellInfo(6306)] = 6306, -- Acid Splash - [GetSpellInfo(10003)] = 10003, -- The Shatterer - [GetSpellInfo(1536)] = 1536, -- Longshot II - [GetSpellInfo(11763)] = 11763, -- Firebolt - [GetSpellInfo(18407)] = 18407, -- Runecloth Tunic - [GetSpellInfo(6249)] = 6249, -- Opening - [GetSpellInfo(9196)] = 9196, -- Dusky Leather Armor - [GetSpellInfo(9481)] = 9481, -- Holy Smite - [GetSpellInfo(23068)] = 23068, -- Green Firework - [GetSpellInfo(3945)] = 3945, -- Heavy Blasting Powder - [GetSpellInfo(6417)] = 6417, -- Dig Rat Stew - [GetSpellInfo(22421)] = 22421, -- Massive Geyser - [GetSpellInfo(11451)] = 11451, -- Oil of Immolation - [GetSpellInfo(28280)] = 28280, -- Bombard Slime - [GetSpellInfo(12082)] = 12082, -- Shadoweave Boots - [GetSpellInfo(16073)] = 16073, -- Filling - [GetSpellInfo(18540)] = 18540, -- Ritual of Doom - [GetSpellInfo(29335)] = 29335, -- Elderberry Pie - [GetSpellInfo(10544)] = 10544, -- Wild Leather Vest - [GetSpellInfo(10348)] = 10348, -- Tune Up - [GetSpellInfo(2161)] = 2161, -- Embossed Leather Boots - [GetSpellInfo(3116)] = 3116, -- Coarse Weightstone - [GetSpellInfo(7752)] = 7752, -- Slitherskin Mackerel - [GetSpellInfo(22478)] = 22478, -- Intense Pain - [GetSpellInfo(3651)] = 3651, -- Shield of Reflection - [GetSpellInfo(6705)] = 6705, -- Murloc Scale Bracers - [GetSpellInfo(15402)] = 15402, -- Lesser Arcane Amalgamation - [GetSpellInfo(16007)] = 16007, -- Draco-Incarcinatrix 900 - [GetSpellInfo(4286)] = 4286, -- Poisonous Spit - [GetSpellInfo(6620)] = 6620, -- Place Toxic Fogger - [GetSpellInfo(12722)] = 12722, -- Goblin Radio - [GetSpellInfo(3495)] = 3495, -- Golden Iron Destroyer - [GetSpellInfo(13240)] = 13240, -- The Mortar: Reloaded - [GetSpellInfo(18630)] = 18630, -- Heavy Runecloth Bandage - [GetSpellInfo(16994)] = 16994, -- Arcanite Reaper - [GetSpellInfo(21332)] = 21332, -- Aspect of Neptulon - [GetSpellInfo(3780)] = 3780, -- Heavy Armor Kit - [GetSpellInfo(10632)] = 10632, -- Helm of Fire - [GetSpellInfo(8090)] = 8090, -- Bright Baubles - [GetSpellInfo(3971)] = 3971, -- Gnomish Cloaking Device - [GetSpellInfo(10714)] = 10714, -- Summon Black Kingsnake - [GetSpellInfo(2668)] = 2668, -- Rough Bronze Leggings - [GetSpellInfo(12045)] = 12045, -- Simple Linen Boots - [GetSpellInfo(4978)] = 4978, -- Cleanse Wildmane Well - [GetSpellInfo(19051)] = 19051, -- Heavy Scorpid Vest - [GetSpellInfo(3494)] = 3494, -- Solid Iron Maul - [GetSpellInfo(12067)] = 12067, -- Dreamweave Gloves - [GetSpellInfo(4164)] = 4164, -- Throw Rock - [GetSpellInfo(8088)] = 8088, -- Nightcrawlers - [GetSpellInfo(11452)] = 11452, -- Restorative Potion - [GetSpellInfo(17454)] = 17454, -- Unpainted Mechanostrider - [GetSpellInfo(16082)] = 16082, -- Palomino Stallion - [GetSpellInfo(11339)] = 11339, -- Instant Poison V - [GetSpellInfo(16379)] = 16379, -- Ozzie Explodes - [GetSpellInfo(8322)] = 8322, -- Moonglow Vest - [GetSpellInfo(3452)] = 3452, -- Mana Potion - [GetSpellInfo(12078)] = 12078, -- Red Mageweave Shoulders - [GetSpellInfo(28221)] = 28221, -- Polar Bracers - [GetSpellInfo(17639)] = 17639, -- Wail of the Banshee - [GetSpellInfo(10704)] = 10704, -- Summon Tree Frog - [GetSpellInfo(12740)] = 12740, -- Summon Infernal Servant - [GetSpellInfo(20629)] = 20629, -- Corrosive Venom Spit - [GetSpellInfo(7255)] = 7255, -- Holy Protection Potion - [GetSpellInfo(5017)] = 5017, -- Divining Trance - [GetSpellInfo(27723)] = 27723, -- Dark Desire - [GetSpellInfo(2830)] = 2830, -- Sharpen Blade III - [GetSpellInfo(22789)] = 22789, -- Gordok Green Grog - [GetSpellInfo(3015)] = 3015, -- Bombard II - [GetSpellInfo(7934)] = 7934, -- Anti-Venom - [GetSpellInfo(10955)] = 10955, -- Shackle Undead - [GetSpellInfo(22989)] = 22989, -- The Breaking - [GetSpellInfo(10716)] = 10716, -- Summon Brown Snake - [GetSpellInfo(27146)] = 27146, -- Left Piece of Lord Valthalak's Amulet - [GetSpellInfo(21979)] = 21979, -- Create The Pariah's Instructions - [GetSpellInfo(18762)] = 18762, -- Hand of Iruxos - [GetSpellInfo(22844)] = 22844, -- Arcanum of Focus - [GetSpellInfo(11016)] = 11016, -- Soul Bite - [GetSpellInfo(14292)] = 14292, -- Fling Torch - [GetSpellInfo(2545)] = 2545, -- Cooked Crab Claw - [GetSpellInfo(20849)] = 20849, -- Flarecore Gloves - [GetSpellInfo(11454)] = 11454, -- Inlaid Mithril Cylinder - [GetSpellInfo(3376)] = 3376, -- Curiously Tasty Omelet - [GetSpellInfo(3229)] = 3229, -- Quick Bloodlust - [GetSpellInfo(3769)] = 3769, -- Dark Leather Shoulders - [GetSpellInfo(3368)] = 3368, -- Drink Minor Potion - [GetSpellInfo(6278)] = 6278, -- Creeping Mold - [GetSpellInfo(27624)] = 27624, -- Lesser Healing Wave - [GetSpellInfo(3772)] = 3772, -- Green Leather Armor - [GetSpellInfo(3007)] = 3007, -- Longshot III - [GetSpellInfo(3120)] = 3120, -- Sol L - [GetSpellInfo(3237)] = 3237, -- Curse of Thule - [GetSpellInfo(23225)] = 23225, -- Swift Green Mechanostrider - [GetSpellInfo(28242)] = 28242, -- Icebane Breastplate - [GetSpellInfo(17229)] = 17229, -- Winterspring Frostsaber - [GetSpellInfo(10254)] = 10254, -- Stone Dwarf Awaken Visual - [GetSpellInfo(3974)] = 3974, -- Crude Scope - [GetSpellInfo(10570)] = 10570, -- Tough Scorpid Helm - [GetSpellInfo(17950)] = 17950, -- Shadow Portal - [GetSpellInfo(11355)] = 11355, -- Deadly Poison III - [GetSpellInfo(3108)] = 3108, -- Touch of Death - [GetSpellInfo(10710)] = 10710, -- Summon Cottontail Rabbit - [GetSpellInfo(22686)] = 22686, -- Bellowing Roar - [GetSpellInfo(23765)] = 23765, -- Darkmoon Faire Fortune - [GetSpellInfo(13463)] = 13463, -- Summon Bloodpetal Mini Pests - [GetSpellInfo(27642)] = 27642, -- Copy of Increase Reputation - [GetSpellInfo(5174)] = 5174, -- Cookie's Cooking - [GetSpellInfo(12071)] = 12071, -- Shadoweave Gloves - [GetSpellInfo(10550)] = 10550, -- Nightscape Cloak - [GetSpellInfo(6499)] = 6499, -- Boiled Clams - [GetSpellInfo(4961)] = 4961, -- Resupply - [GetSpellInfo(6907)] = 6907, -- Diseased Slime - [GetSpellInfo(23250)] = 23250, -- Swift Brown Wolf - [GetSpellInfo(17161)] = 17161, -- Taking Moon Well Sample - [GetSpellInfo(6974)] = 6974, -- Gnome Camera Connection - [GetSpellInfo(9202)] = 9202, -- Green Whelp Bracers - [GetSpellInfo(12599)] = 12599, -- Mithril Casing - [GetSpellInfo(11402)] = 11402, -- Shay's Bell - [GetSpellInfo(15745)] = 15745, -- Summon Rookery Whelp - [GetSpellInfo(25719)] = 25719, -- Bind Draconic For Dummies - [GetSpellInfo(3373)] = 3373, -- Crocolisk Gumbo - [GetSpellInfo(22869)] = 22869, -- Mooncloth Gloves - [GetSpellInfo(22867)] = 22867, -- Felcloth Gloves - [GetSpellInfo(24696)] = 24696, -- Summon Murky - [GetSpellInfo(22921)] = 22921, -- Girdle of Insight - [GetSpellInfo(8363)] = 8363, -- Parasite - [GetSpellInfo(16973)] = 16973, -- Enchanted Battlehammer - [GetSpellInfo(16657)] = 16657, -- Imperial Plate Boots - [GetSpellInfo(21267)] = 21267, -- Conjure Altar of Summoning - [GetSpellInfo(23304)] = 23304, -- Manna-Enriched Horse Feed - [GetSpellInfo(4055)] = 4055, -- Mechanical Squirrel - [GetSpellInfo(17928)] = 17928, -- Howl of Terror - [GetSpellInfo(12655)] = 12655, -- Enlightenment - [GetSpellInfo(3869)] = 3869, -- Bright Yellow Shirt - [GetSpellInfo(24422)] = 24422, -- Zandalar Signet of Might - [GetSpellInfo(10792)] = 10792, -- Spotted Panther - [GetSpellInfo(19100)] = 19100, -- Heavy Scorpid Shoulders - [GetSpellInfo(19571)] = 19571, -- Destroy Ghost Magnet - [GetSpellInfo(23633)] = 23633, -- Gloves of the Dawn - [GetSpellInfo(22759)] = 22759, -- Flarecore Wraps - [GetSpellInfo(11465)] = 11465, -- Elixir of Greater Intellect - [GetSpellInfo(5219)] = 5219, -- Draw of Thistlenettle - [GetSpellInfo(11024)] = 11024, -- Call of Thund - [GetSpellInfo(22868)] = 22868, -- Inferno Gloves - [GetSpellInfo(9198)] = 9198, -- Frost Leather Cloak - [GetSpellInfo(15856)] = 15856, -- Hot Wolf Ribs - [GetSpellInfo(5401)] = 5401, -- Lizard Bolt - [GetSpellInfo(19877)] = 19877, -- Tranquilizing Shot - [GetSpellInfo(21249)] = 21249, -- Call of the Nether - [GetSpellInfo(3331)] = 3331, -- Silvered Bronze Boots - [GetSpellInfo(16055)] = 16055, -- Nightsaber - [GetSpellInfo(12902)] = 12902, -- Gnomish Net-o-Matic Projector - [GetSpellInfo(1084)] = 1084, -- Firebolt III - [GetSpellInfo(12760)] = 12760, -- Goblin Sapper Charge - [GetSpellInfo(3188)] = 3188, -- Elixir of Ogre's Strength - [GetSpellInfo(3177)] = 3177, -- Elixir of Defense - [GetSpellInfo(15295)] = 15295, -- Dark Iron Shoulders - [GetSpellInfo(9900)] = 9900, -- Sharpen Blade IV - [GetSpellInfo(16056)] = 16056, -- Frostsaber - [GetSpellInfo(7224)] = 7224, -- Steel Weapon Chain - [GetSpellInfo(711)] = 711, -- Hellfire - [GetSpellInfo(26218)] = 26218, -- Mistletoe - [GetSpellInfo(14929)] = 14929, -- Fill Nagmara's Vial - [GetSpellInfo(3112)] = 3112, -- Enhance Blunt Weapon - [GetSpellInfo(3328)] = 3328, -- Rough Bronze Shoulders - [GetSpellInfo(16197)] = 16197, -- Empty Charm Pouch - [GetSpellInfo(16990)] = 16990, -- Arcanite Champion - [GetSpellInfo(24138)] = 24138, -- Bloodsoul Gauntlets - [GetSpellInfo(21848)] = 21848, -- Snowman - [GetSpellInfo(10059)] = 10059, -- Portal: Stormwind - [GetSpellInfo(23239)] = 23239, -- Swift Gray Ram - [GetSpellInfo(16746)] = 16746, -- Invulnerable Mail - [GetSpellInfo(15441)] = 15441, -- Greater Arcane Amalgamation - [GetSpellInfo(17176)] = 17176, -- Panther Cage Key - [GetSpellInfo(3816)] = 3816, -- Cured Light Hide - [GetSpellInfo(471)] = 471, -- Palamino Stallion - [GetSpellInfo(446)] = 446, -- Teleport Cemetary - [GetSpellInfo(4508)] = 4508, -- Discolored Healing Potion - [GetSpellInfo(6421)] = 6421, -- Ashcrombe's Unlock - [GetSpellInfo(12199)] = 12199, -- Summon Ishamuhale - [GetSpellInfo(15855)] = 15855, -- Roast Raptor - [GetSpellInfo(10140)] = 10140, -- Conjure Water - [GetSpellInfo(20627)] = 20627, -- Lightning Breath - [GetSpellInfo(15294)] = 15294, -- Dark Iron Sunderer - [GetSpellInfo(26443)] = 26443, -- Firework Cluster Launcher - [GetSpellInfo(26105)] = 26105, -- Glare - [GetSpellInfo(23242)] = 23242, -- Swift Olive Raptor - [GetSpellInfo(24201)] = 24201, -- Create Rune of the Dawn - [GetSpellInfo(9820)] = 9820, -- Barbaric Iron Gloves - [GetSpellInfo(3276)] = 3276, -- Heavy Linen Bandage - [GetSpellInfo(1)] = 1, -- Word of Recall (OLD) - [GetSpellInfo(13630)] = 13630, -- Scraping - [GetSpellInfo(3398)] = 3398, -- Hot Lion Chops - [GetSpellInfo(6688)] = 6688, -- Red Woolen Bag - [GetSpellInfo(3304)] = 3304, -- Smelt Tin - [GetSpellInfo(9918)] = 9918, -- Solid Sharpening Stone - [GetSpellInfo(16450)] = 16450, -- Summon Smolderweb - [GetSpellInfo(17506)] = 17506, -- Soul Breaker - [GetSpellInfo(25347)] = 25347, -- Deadly Poison V - [GetSpellInfo(3320)] = 3320, -- Rough Grinding Stone - [GetSpellInfo(23677)] = 23677, -- Beasts Deck - [GetSpellInfo(21067)] = 21067, -- Poison Bolt - [GetSpellInfo(10490)] = 10490, -- Comfortable Leather Hat - [GetSpellInfo(27)] = 27, -- Goldshire Portal - [GetSpellInfo(3387)] = 3387, -- Rage of Thule - [GetSpellInfo(15743)] = 15743, -- Flamecrack - [GetSpellInfo(3926)] = 3926, -- Copper Modulator - [GetSpellInfo(28243)] = 28243, -- Icebane Gauntlets - [GetSpellInfo(16648)] = 16648, -- Radiant Breastplate - [GetSpellInfo(21175)] = 21175, -- Spider Sausage - [GetSpellInfo(27587)] = 27587, -- Thick Obsidian Breastplate - [GetSpellInfo(12521)] = 12521, -- Teleport from Azshara Tower - [GetSpellInfo(28023)] = 28023, -- Create Healthstone - [GetSpellInfo(5110)] = 5110, -- Summon Living Flame - [GetSpellInfo(3293)] = 3293, -- Copper Battle Axe - [GetSpellInfo(7079)] = 7079, -- Simple Teleport Other - [GetSpellInfo(22430)] = 22430, -- Refined Scale of Onyxia - [GetSpellInfo(26056)] = 26056, -- Summon Green Qiraji Battle Tank - [GetSpellInfo(7828)] = 7828, -- Rockscale Cod - [GetSpellInfo(17461)] = 17461, -- Black Ram - [GetSpellInfo(25162)] = 25162, -- Summon Disgusting Oozeling - [GetSpellInfo(11459)] = 11459, -- Philosophers' Stone - [GetSpellInfo(3855)] = 3855, -- Spidersilk Boots - [GetSpellInfo(29163)] = 29163, -- Copy of Frostbolt - [GetSpellInfo(12715)] = 12715, -- Goblin Rocket Fuel Recipe - [GetSpellInfo(14008)] = 14008, -- Miblon's Bait - [GetSpellInfo(3843)] = 3843, -- Heavy Woolen Gloves - [GetSpellInfo(29483)] = 29483, -- Might of the Scourge - [GetSpellInfo(4975)] = 4975, -- Cleanse Winterhoof Well - [GetSpellInfo(20589)] = 20589, -- Escape Artist - [GetSpellInfo(16781)] = 16781, -- Combining Charms - [GetSpellInfo(6416)] = 6416, -- Strider Stew - [GetSpellInfo(14327)] = 14327, -- Scare Beast - [GetSpellInfo(17709)] = 17709, -- Summon Zergling - [GetSpellInfo(22717)] = 22717, -- Black War Steed - [GetSpellInfo(3841)] = 3841, -- Green Linen Bracers - [GetSpellInfo(17405)] = 17405, -- Domination - [GetSpellInfo(2159)] = 2159, -- Fine Leather Cloak - [GetSpellInfo(9986)] = 9986, -- Bronze Greatsword - [GetSpellInfo(6521)] = 6521, -- Pearl-clasped Cloak - [GetSpellInfo(6686)] = 6686, -- Red Linen Bag - [GetSpellInfo(12304)] = 12304, -- Drawing Kit - [GetSpellInfo(24136)] = 24136, -- Bloodsoul Breastplate - [GetSpellInfo(3778)] = 3778, -- Gem-studded Leather Belt - [GetSpellInfo(10713)] = 10713, -- Summon Albino Snake - [GetSpellInfo(3508)] = 3508, -- Green Iron Hauberk - [GetSpellInfo(28481)] = 28481, -- Sylvan Crown - [GetSpellInfo(12718)] = 12718, -- Goblin Construction Helmet - [GetSpellInfo(2480)] = 2480, -- Shoot Bow - [GetSpellInfo(28146)] = 28146, -- Copy of Portal: Undercity - [GetSpellInfo(18458)] = 18458, -- Robe of the Void - [GetSpellInfo(21050)] = 21050, -- Melodious Rapture - [GetSpellInfo(11417)] = 11417, -- Portal: Orgrimmar - [GetSpellInfo(19065)] = 19065, -- Runic Leather Bracers - [GetSpellInfo(6272)] = 6272, -- Eye of Yesmur (PT) - [GetSpellInfo(23063)] = 23063, -- Dense Dynamite - [GetSpellInfo(10969)] = 10969, -- Blue Mechanostrider - [GetSpellInfo(3330)] = 3330, -- Silvered Bronze Shoulders - [GetSpellInfo(22593)] = 22593, -- Flame Mantle of the Dawn - [GetSpellInfo(2403)] = 2403, -- Gray Woolen Robe - [GetSpellInfo(8275)] = 8275, -- Poisoned Shot - [GetSpellInfo(18991)] = 18991, -- Green Kodo - [GetSpellInfo(184)] = 184, -- Fire Shield II - [GetSpellInfo(19666)] = 19666, -- Silver Skeleton Key - [GetSpellInfo(17169)] = 17169, -- Summon Carrion Scarab - [GetSpellInfo(15869)] = 15869, -- Superior Healing Ward - [GetSpellInfo(7151)] = 7151, -- Barbaric Shoulders - [GetSpellInfo(25748)] = 25748, -- Poison Stinger - [GetSpellInfo(30001)] = 30001, -- Copy of Fear - [GetSpellInfo(10529)] = 10529, -- Wild Leather Shoulders - [GetSpellInfo(15728)] = 15728, -- Plague Cloud - [GetSpellInfo(19066)] = 19066, -- Frostsaber Boots - [GetSpellInfo(23229)] = 23229, -- Swift Brown Steed - [GetSpellInfo(10679)] = 10679, -- Summon White Kitten - [GetSpellInfo(18417)] = 18417, -- Runecloth Gloves - [GetSpellInfo(9931)] = 9931, -- Mithril Scale Pants - [GetSpellInfo(16596)] = 16596, -- Flames of Shahram - [GetSpellInfo(18159)] = 18159, -- Curse of the Fallen Magram - [GetSpellInfo(10097)] = 10097, -- Smelt Mithril - [GetSpellInfo(15049)] = 15049, -- Summon Robot - [GetSpellInfo(8000)] = 8000, -- Area Burn - [GetSpellInfo(18711)] = 18711, -- Forging - [GetSpellInfo(26417)] = 26417, -- Small Green Rocket - [GetSpellInfo(3864)] = 3864, -- Star Belt - [GetSpellInfo(19062)] = 19062, -- Ironfeather Shoulders - [GetSpellInfo(17155)] = 17155, -- Sprinkling Purified Water - [GetSpellInfo(13564)] = 13564, -- Opening Dark Coffer - [GetSpellInfo(21913)] = 21913, -- Edge of Winter - [GetSpellInfo(25662)] = 25662, -- Copy of Nightfin Soup - [GetSpellInfo(22799)] = 22799, -- King of the Gordok - [GetSpellInfo(11758)] = 11758, -- Dowsing - [GetSpellInfo(17045)] = 17045, -- Dawn's Gambit - [GetSpellInfo(12509)] = 12509, -- Teleport to Azshara Tower - [GetSpellInfo(22434)] = 22434, -- Charged Scale of Onyxia - [GetSpellInfo(16971)] = 16971, -- Huge Thorium Battleaxe - [GetSpellInfo(8366)] = 8366, -- Ironforge Chain - [GetSpellInfo(23507)] = 23507, -- Snake Burst Firework - [GetSpellInfo(26001)] = 26001, -- Reputation - Ahn'Qiraj Temple Boss - [GetSpellInfo(509)] = 509, -- Feeblemind II - [GetSpellInfo(18153)] = 18153, -- Kodo Kombobulator - [GetSpellInfo(15533)] = 15533, -- Stoned - Channel Cast Visual - [GetSpellInfo(9928)] = 9928, -- Heavy Mithril Gauntlet - [GetSpellInfo(9197)] = 9197, -- Green Whelp Armor - [GetSpellInfo(16997)] = 16997, -- Gargoyle Strike - [GetSpellInfo(22923)] = 22923, -- Swift Flight Bracers - [GetSpellInfo(12079)] = 12079, -- Red Mageweave Bag - [GetSpellInfo(18242)] = 18242, -- Hot Smoked Bass - [GetSpellInfo(14814)] = 14814, -- Throw Dark Iron Ale - [GetSpellInfo(3308)] = 3308, -- Smelt Gold - [GetSpellInfo(2160)] = 2160, -- Embossed Leather Vest - [GetSpellInfo(13565)] = 13565, -- Opening Secure Safe - [GetSpellInfo(21950)] = 21950, -- Recite Words of Celebras - [GetSpellInfo(2828)] = 2828, -- Sharpen Blade - [GetSpellInfo(19668)] = 19668, -- Truesilver Skeleton Key - [GetSpellInfo(9010)] = 9010, -- Create Filled Containment Coffer - [GetSpellInfo(16724)] = 16724, -- Whitesoul Helm - [GetSpellInfo(22870)] = 22870, -- Cloak of Warding - [GetSpellInfo(7183)] = 7183, -- Elixir of Minor Defense - [GetSpellInfo(17016)] = 17016, -- Placing Beacon Torch - [GetSpellInfo(5107)] = 5107, -- Opening Booty Chest - [GetSpellInfo(10841)] = 10841, -- Heavy Mageweave Bandage - [GetSpellInfo(11547)] = 11547, -- Drive Nimboya's Laden Pike - [GetSpellInfo(3356)] = 3356, -- Flame Lash - [GetSpellInfo(28615)] = 28615, -- Spike Volley - [GetSpellInfo(10216)] = 10216, -- Flamestrike - [GetSpellInfo(6898)] = 6898, -- White Ram - [GetSpellInfo(11548)] = 11548, -- Summon Spider God - [GetSpellInfo(27572)] = 27572, -- Smitten - [GetSpellInfo(14250)] = 14250, -- Capture Grark - [GetSpellInfo(1849)] = 1849, -- Beast Claws II - [GetSpellInfo(26424)] = 26424, -- Green Rocket Cluster - [GetSpellInfo(3491)] = 3491, -- Big Bronze Knife - [GetSpellInfo(25309)] = 25309, -- Immolate - [GetSpellInfo(7076)] = 7076, -- Summon Tervosh's Minion - [GetSpellInfo(16987)] = 16987, -- Darkspear - [GetSpellInfo(3334)] = 3334, -- Green Iron Boots - [GetSpellInfo(25183)] = 25183, -- Shadow Weakness - [GetSpellInfo(11048)] = 11048, -- Perm. Illusion Bishop Tyriona - [GetSpellInfo(10681)] = 10681, -- Summon Cockatoo - [GetSpellInfo(24365)] = 24365, -- Mageblood Potion - [GetSpellInfo(11416)] = 11416, -- Portal: Ironforge - [GetSpellInfo(23628)] = 23628, -- Heavy Timbermaw Belt - [GetSpellInfo(10798)] = 10798, -- Obsidian Raptor - [GetSpellInfo(8802)] = 8802, -- Crimson Silk Robe - [GetSpellInfo(24703)] = 24703, -- Dreamscale Breastplate - [GetSpellInfo(10675)] = 10675, -- Summon Maine Coon - [GetSpellInfo(6700)] = 6700, -- Dimensional Portal - [GetSpellInfo(7624)] = 7624, -- White Linen Robe - [GetSpellInfo(16336)] = 16336, -- Haunting Phantoms - [GetSpellInfo(15915)] = 15915, -- Spiced Chili Crab - [GetSpellInfo(10228)] = 10228, -- Greater Invisibility - [GetSpellInfo(23653)] = 23653, -- Nightfall - [GetSpellInfo(11443)] = 11443, -- Cripple - [GetSpellInfo(11435)] = 11435, -- Create Mallet of Zul'Farrak - [GetSpellInfo(21646)] = 21646, -- Conjure Circle of Calling - [GetSpellInfo(9092)] = 9092, -- Flesh Eating Worm - [GetSpellInfo(20757)] = 20757, -- Create Soulstone (Major) - [GetSpellInfo(3337)] = 3337, -- Heavy Grinding Stone - [GetSpellInfo(16644)] = 16644, -- Thorium Bracers - [GetSpellInfo(25178)] = 25178, -- Frost Weakness - [GetSpellInfo(5784)] = 5784, -- Summon Felsteed - [GetSpellInfo(19794)] = 19794, -- Spellpower Goggles Xtreme Plus - [GetSpellInfo(2163)] = 2163, -- White Leather Jerkin - [GetSpellInfo(3763)] = 3763, -- Fine Leather Belt - [GetSpellInfo(16084)] = 16084, -- Mottled Red Raptor - [GetSpellInfo(10533)] = 10533, -- Tough Scorpid Bracers - [GetSpellInfo(8677)] = 8677, -- Summon Effect - [GetSpellInfo(21355)] = 21355, -- Planting Guse's Beacon - [GetSpellInfo(9595)] = 9595, -- Attach Shaft to Medallion - [GetSpellInfo(17235)] = 17235, -- Raise Undead Scarab - [GetSpellInfo(15050)] = 15050, -- Psychometry - [GetSpellInfo(28394)] = 28394, -- Reputation - Ratchet +500 - [GetSpellInfo(10568)] = 10568, -- Tough Scorpid Leggings - [GetSpellInfo(30297)] = 30297, -- Heightened Senses - [GetSpellInfo(8348)] = 8348, -- Julie's Blessing - [GetSpellInfo(10793)] = 10793, -- Striped Nightsaber - [GetSpellInfo(7638)] = 7638, -- Potion Toss - [GetSpellInfo(10207)] = 10207, -- Scorch - [GetSpellInfo(2641)] = 2641, -- Dismiss Pet - [GetSpellInfo(1940)] = 1940, -- Rocket Blast - [GetSpellInfo(9208)] = 9208, -- Swift Boots - [GetSpellInfo(22567)] = 22567, -- Summon Ar'lia - [GetSpellInfo(7124)] = 7124, -- Arugal's Gift - [GetSpellInfo(19086)] = 19086, -- Ironfeather Breastplate - [GetSpellInfo(27660)] = 27660, -- Big Bag of Enchantment - [GetSpellInfo(23251)] = 23251, -- Swift Timber Wolf - [GetSpellInfo(468)] = 468, -- White Stallion - [GetSpellInfo(2667)] = 2667, -- Runed Copper Breastplate - [GetSpellInfo(21403)] = 21403, -- Ryson's All Seeing Eye - [GetSpellInfo(10096)] = 10096, -- Shrink - [GetSpellInfo(16562)] = 16562, -- Urok Minions Vanish - [GetSpellInfo(8776)] = 8776, -- Linen Belt - [GetSpellInfo(2840)] = 2840, -- Creeping Anguish - [GetSpellInfo(12806)] = 12806, -- Getting Tide Pool Sample #3 - [GetSpellInfo(3863)] = 3863, -- Spider Belt - [GetSpellInfo(12614)] = 12614, -- Mithril Heavy-bore Rifle - [GetSpellInfo(7078)] = 7078, -- Simple Teleport Group - [GetSpellInfo(9232)] = 9232, -- Scarlet Resurrection - [GetSpellInfo(13524)] = 13524, -- Curse of Stalvan - [GetSpellInfo(3924)] = 3924, -- Copper Tube - [GetSpellInfo(21143)] = 21143, -- Gingerbread Cookie - [GetSpellInfo(22990)] = 22990, -- The Forming - [GetSpellInfo(28207)] = 28207, -- Glacial Vest - [GetSpellInfo(22810)] = 22810, -- Opening - No Text - [GetSpellInfo(9201)] = 9201, -- Dusky Bracers - [GetSpellInfo(11464)] = 11464, -- Invisibility Potion - [GetSpellInfo(28482)] = 28482, -- Sylvan Shoulders - [GetSpellInfo(8489)] = 8489, -- Red Swashbuckler's Shirt - [GetSpellInfo(28487)] = 28487, -- Summon Terky - [GetSpellInfo(20201)] = 20201, -- Arcanite Rod - [GetSpellInfo(10001)] = 10001, -- Big Black Mace - [GetSpellInfo(28224)] = 28224, -- Icy Scale Bracers - [GetSpellInfo(22922)] = 22922, -- Mongoose Boots - [GetSpellInfo(8598)] = 8598, -- Lightning Blast - [GetSpellInfo(16072)] = 16072, -- Purify and Place Food - [GetSpellInfo(12906)] = 12906, -- Gnomish Battle Chicken - [GetSpellInfo(4971)] = 4971, -- Healing Ward - [GetSpellInfo(23012)] = 23012, -- Summon Orphan - [GetSpellInfo(17576)] = 17576, -- Greater Nature Protection Potion - [GetSpellInfo(23071)] = 23071, -- Truesilver Transformer - [GetSpellInfo(2335)] = 2335, -- Swiftness Potion - [GetSpellInfo(17014)] = 17014, -- Bone Shards - [GetSpellInfo(3975)] = 3975, -- Standard Scope - [GetSpellInfo(8762)] = 8762, -- Silk Headband - [GetSpellInfo(6413)] = 6413, -- Scorpid Surprise - [GetSpellInfo(7221)] = 7221, -- Iron Shield Spike - [GetSpellInfo(9858)] = 9858, -- Regrowth - [GetSpellInfo(11448)] = 11448, -- Greater Mana Potion - [GetSpellInfo(18238)] = 18238, -- Spotted Yellowtail - [GetSpellInfo(16138)] = 16138, -- Sharpen Blade V - [GetSpellInfo(19079)] = 19079, -- Stormshroud Armor - [GetSpellInfo(7084)] = 7084, -- Damage Car - [GetSpellInfo(5244)] = 5244, -- Kodo Hide Bag - [GetSpellInfo(6982)] = 6982, -- Gust of Wind - [GetSpellInfo(3757)] = 3757, -- Woolen Bag - [GetSpellInfo(10487)] = 10487, -- Thick Armor Kit - [GetSpellInfo(16742)] = 16742, -- Enchanted Thorium Helm - [GetSpellInfo(12083)] = 12083, -- Stormcloth Headband - [GetSpellInfo(25952)] = 25952, -- Reindeer Dust Effect - [GetSpellInfo(27552)] = 27552, -- Cupid's Arrow - [GetSpellInfo(24885)] = 24885, -- Create Crest of Beckoning: Air - [GetSpellInfo(24221)] = 24221, -- Quest - Teleport Spawn-out - [GetSpellInfo(2741)] = 2741, -- Bronze Axe - [GetSpellInfo(470)] = 470, -- Black Stallion - [GetSpellInfo(6957)] = 6957, -- Frostmane Strength - [GetSpellInfo(16655)] = 16655, -- Fiery Plate Gauntlets - [GetSpellInfo(9456)] = 9456, -- Tharnariun Cure 1 - [GetSpellInfo(25181)] = 25181, -- Arcane Weakness - [GetSpellInfo(15048)] = 15048, -- Summon Bomb - [GetSpellInfo(9912)] = 9912, -- Wrath - [GetSpellInfo(18666)] = 18666, -- Corrupt Redpath - [GetSpellInfo(3779)] = 3779, -- Barbaric Belt - [GetSpellInfo(22681)] = 22681, -- Shadowblink - [GetSpellInfo(10054)] = 10054, -- Conjure Mana Ruby - [GetSpellInfo(8606)] = 8606, -- Summon Cyclonian - [GetSpellInfo(20269)] = 20269, -- Enchanted Gaea Seed - [GetSpellInfo(23312)] = 23312, -- Time Lapse - [GetSpellInfo(5264)] = 5264, -- South Seas Pirate Disguise - [GetSpellInfo(19873)] = 19873, -- Destroy Egg - [GetSpellInfo(19057)] = 19057, -- Armor +40 - [GetSpellInfo(25031)] = 25031, -- Shoot Missile - [GetSpellInfo(2540)] = 2540, -- Roasted Boar Meat - [GetSpellInfo(16613)] = 16613, -- Displacing Temporal Rift - [GetSpellInfo(23431)] = 23431, -- Summon Leatherback Snapjaw - [GetSpellInfo(19059)] = 19059, -- Volcanic Leggings - [GetSpellInfo(6949)] = 6949, -- Weak Frostbolt - [GetSpellInfo(23338)] = 23338, -- Swift Stormsaber - [GetSpellInfo(19055)] = 19055, -- Runic Leather Gauntlets - [GetSpellInfo(16075)] = 16075, -- Throw Axe - [GetSpellInfo(18449)] = 18449, -- Runecloth Shoulders - [GetSpellInfo(3363)] = 3363, -- Summon Riding Gryphon - [GetSpellInfo(6576)] = 6576, -- Intimidating Growl - [GetSpellInfo(28393)] = 28393, -- Reputation - Booty Bay +500 - [GetSpellInfo(24649)] = 24649, -- Thousand Blades - [GetSpellInfo(23666)] = 23666, -- Flarecore Robe - [GetSpellInfo(10796)] = 10796, -- Turquoise Raptor - [GetSpellInfo(19093)] = 19093, -- Onyxia Scale Cloak - [GetSpellInfo(8774)] = 8774, -- Green Silken Shoulders - [GetSpellInfo(9657)] = 9657, -- Shadow Shell - [GetSpellInfo(3930)] = 3930, -- Crafted Heavy Shot - [GetSpellInfo(3207)] = 3207, -- Sol U - [GetSpellInfo(7421)] = 7421, -- Runed Copper Rod - [GetSpellInfo(17580)] = 17580, -- Major Mana Potion - [GetSpellInfo(3921)] = 3921, -- Deprecated Solid Shot - [GetSpellInfo(9771)] = 9771, -- Radiation Bolt - [GetSpellInfo(2399)] = 2399, -- Green Woolen Vest - [GetSpellInfo(22756)] = 22756, -- Sharpen Weapon - Critical - [GetSpellInfo(13262)] = 13262, -- Disenchant - [GetSpellInfo(11202)] = 11202, -- Crippling Poison - [GetSpellInfo(10674)] = 10674, -- Summon Cornish Rex - [GetSpellInfo(11790)] = 11790, -- Poison Cloud - [GetSpellInfo(11963)] = 11963, -- Enfeeble - [GetSpellInfo(690)] = 690, -- Firebolt II - [GetSpellInfo(12062)] = 12062, -- Stormcloth Pants - [GetSpellInfo(23241)] = 23241, -- Swift Blue Raptor - [GetSpellInfo(16642)] = 16642, -- Thorium Armor - [GetSpellInfo(7795)] = 7795, -- Runed Silver Rod - [GetSpellInfo(2645)] = 2645, -- Ghost Wolf - [GetSpellInfo(26423)] = 26423, -- Blue Rocket Cluster - [GetSpellInfo(26087)] = 26087, -- Core Felcloth Bag - [GetSpellInfo(24913)] = 24913, -- Darkrune Helm - [GetSpellInfo(9743)] = 9743, -- Delete Me - [GetSpellInfo(7077)] = 7077, -- Simple Teleport - [GetSpellInfo(3850)] = 3850, -- Heavy Woolen Pants - [GetSpellInfo(18375)] = 18375, -- Aynasha's Arrow - [GetSpellInfo(693)] = 693, -- Create Soulstone (Minor) - [GetSpellInfo(474)] = 474, -- Fumble - [GetSpellInfo(3770)] = 3770, -- Toughened Leather Gloves - [GetSpellInfo(3326)] = 3326, -- Coarse Grinding Stone - [GetSpellInfo(23082)] = 23082, -- Ultra-Flash Shadow Reflector - [GetSpellInfo(427)] = 427, -- Teleport Monastery - [GetSpellInfo(20650)] = 20650, -- Thick Leather - [GetSpellInfo(13399)] = 13399, -- Cultivate Packet of Seeds - [GetSpellInfo(2664)] = 2664, -- Runed Copper Bracers - [GetSpellInfo(3842)] = 3842, -- Handstitched Linen Britches - [GetSpellInfo(17455)] = 17455, -- Purple Mechanostrider - [GetSpellInfo(3562)] = 3562, -- Teleport: Ironforge - [GetSpellInfo(10705)] = 10705, -- Summon Eagle Owl - [GetSpellInfo(3498)] = 3498, -- Massive Iron Axe - [GetSpellInfo(3957)] = 3957, -- Ice Deflector - [GetSpellInfo(15648)] = 15648, -- Summon Corrupted Kitten - [GetSpellInfo(24368)] = 24368, -- Major Troll's Blood Potion - [GetSpellInfo(13548)] = 13548, -- Summon Farm Chicken - [GetSpellInfo(2167)] = 2167, -- Dark Leather Boots - [GetSpellInfo(66)] = 66, -- Lesser Invisibility - [GetSpellInfo(16988)] = 16988, -- Hammer of the Titans - [GetSpellInfo(15664)] = 15664, -- Venom Spit - [GetSpellInfo(1056)] = 1056, -- Slow Poison II - [GetSpellInfo(4980)] = 4980, -- Quick Frost Ward - [GetSpellInfo(11131)] = 11131, -- Icicle - [GetSpellInfo(9157)] = 9157, -- Create Mage's Robe - [GetSpellInfo(7135)] = 7135, -- Dark Leather Pants - [GetSpellInfo(24124)] = 24124, -- Blood Tiger Breastplate - [GetSpellInfo(12900)] = 12900, -- Mobile Alarm - [GetSpellInfo(23079)] = 23079, -- Major Recombobulator - [GetSpellInfo(28898)] = 28898, -- Blessed Wizard Oil - [GetSpellInfo(10482)] = 10482, -- Cured Thick Hide - [GetSpellInfo(16429)] = 16429, -- Piercing Shadow - [GetSpellInfo(10795)] = 10795, -- Ivory Raptor - [GetSpellInfo(7133)] = 7133, -- Fine Leather Pants - [GetSpellInfo(23136)] = 23136, -- Release J'eevee - [GetSpellInfo(5106)] = 5106, -- Crystal Flash - [GetSpellInfo(3115)] = 3115, -- Rough Weightstone - [GetSpellInfo(3230)] = 3230, -- Elixir of Minor Agility - [GetSpellInfo(28739)] = 28739, -- Summon Mr. Wiggles - [GetSpellInfo(11761)] = 11761, -- Scorpid Sample - [GetSpellInfo(8986)] = 8986, -- Summon Illusionary Phantasm - [GetSpellInfo(4526)] = 4526, -- Mass Dispell - [GetSpellInfo(428)] = 428, -- Teleport Moonbrook - [GetSpellInfo(18989)] = 18989, -- Gray Kodo - [GetSpellInfo(3944)] = 3944, -- Flame Deflector - [GetSpellInfo(134)] = 134, -- Fire Shield - [GetSpellInfo(22724)] = 22724, -- Black War Wolf - [GetSpellInfo(23008)] = 23008, -- Powerful Seaforium Charge - [GetSpellInfo(6201)] = 6201, -- Create Healthstone (Minor) - [GetSpellInfo(3407)] = 3407, -- Rune of Opening - [GetSpellInfo(6487)] = 6487, -- Ilkrud's Guardians - [GetSpellInfo(3173)] = 3173, -- Lesser Mana Potion - [GetSpellInfo(16989)] = 16989, -- Planting Banner - [GetSpellInfo(18952)] = 18952, -- Opening Termite Barrel - [GetSpellInfo(10564)] = 10564, -- Tough Scorpid Shoulders - [GetSpellInfo(5407)] = 5407, -- Segra Darkthorn Effect - [GetSpellInfo(20804)] = 20804, -- Triage - [GetSpellInfo(23706)] = 23706, -- Golden Mantle of the Dawn - [GetSpellInfo(8272)] = 8272, -- Mind Tremor - [GetSpellInfo(6458)] = 6458, -- Ornate Spyglass - [GetSpellInfo(23077)] = 23077, -- Gyrofreeze Ice Reflector - [GetSpellInfo(16732)] = 16732, -- Runic Plate Leggings - [GetSpellInfo(3848)] = 3848, -- Double-stitched Woolen Shoulders - [GetSpellInfo(2385)] = 2385, -- Brown Linen Vest - [GetSpellInfo(9513)] = 9513, -- Thistle Tea - [GetSpellInfo(11468)] = 11468, -- Elixir of Dream Vision - [GetSpellInfo(8040)] = 8040, -- Druid's Slumber - [GetSpellInfo(2658)] = 2658, -- Smelt Silver - [GetSpellInfo(24141)] = 24141, -- Darksoul Shoulders - [GetSpellInfo(22727)] = 22727, -- Core Armor Kit - [GetSpellInfo(24302)] = 24302, -- Eternium Fishing Line - [GetSpellInfo(3774)] = 3774, -- Green Leather Belt - [GetSpellInfo(110)] = 110, -- Spell Deflection (NYI) - [GetSpellInfo(3933)] = 3933, -- Small Seaforium Charge - [GetSpellInfo(457)] = 457, -- Feeblemind - [GetSpellInfo(2333)] = 2333, -- Elixir of Lesser Agility - [GetSpellInfo(11792)] = 11792, -- Opening Cage - [GetSpellInfo(18436)] = 18436, -- Robe of Winter Night - [GetSpellInfo(22723)] = 22723, -- Black War Tiger - [GetSpellInfo(18451)] = 18451, -- Felcloth Robe - [GetSpellInfo(26427)] = 26427, -- Large Green Rocket Cluster - [GetSpellInfo(9206)] = 9206, -- Dusky Belt - [GetSpellInfo(7643)] = 7643, -- Greater Adept's Robe - [GetSpellInfo(3175)] = 3175, -- Limited Invulnerability Potion - [GetSpellInfo(7437)] = 7437, -- Break Stuff - [GetSpellInfo(3865)] = 3865, -- Bolt of Mageweave - [GetSpellInfo(11802)] = 11802, -- Dark Iron Land Mine - [GetSpellInfo(17572)] = 17572, -- Purification Potion - [GetSpellInfo(23664)] = 23664, -- Argent Boots - [GetSpellInfo(26403)] = 26403, -- Festive Red Dress - [GetSpellInfo(24399)] = 24399, -- Dark Iron Boots - [GetSpellInfo(8772)] = 8772, -- Crimson Silk Belt - [GetSpellInfo(9461)] = 9461, -- Summon Swamp Ooze - [GetSpellInfo(26298)] = 26298, -- Create Firework Rocket Launcher - [GetSpellInfo(17638)] = 17638, -- Flask of Chromatic Resistance - [GetSpellInfo(16728)] = 16728, -- Helm of the Great Chief - [GetSpellInfo(3307)] = 3307, -- Smelt Iron - [GetSpellInfo(17180)] = 17180, -- Enchanted Thorium - [GetSpellInfo(19561)] = 19561, -- Summon Gnashjaw - [GetSpellInfo(10418)] = 10418, -- Arugal spawn-in spell - [GetSpellInfo(24923)] = 24923, -- Honor Points +398 - [GetSpellInfo(10684)] = 10684, -- Summon Senegal - [GetSpellInfo(3488)] = 3488, -- Felstrom Resurrection - [GetSpellInfo(10619)] = 10619, -- Dragonscale Gauntlets - [GetSpellInfo(24258)] = 24258, -- Quest - Troll Hero Summon Visual - [GetSpellInfo(12081)] = 12081, -- Admiral's Hat - [GetSpellInfo(24194)] = 24194, -- Uther's Tribute - [GetSpellInfo(20549)] = 20549, -- War Stomp - [GetSpellInfo(23509)] = 23509, -- Frostwolf Howler - [GetSpellInfo(23042)] = 23042, -- Call Benediction - [GetSpellInfo(11757)] = 11757, -- Digging for Cobalt - [GetSpellInfo(9070)] = 9070, -- Black Whelp Cloak - [GetSpellInfo(16053)] = 16053, -- Dominion of Soul - [GetSpellInfo(5262)] = 5262, -- Fanatic Blade - [GetSpellInfo(22594)] = 22594, -- Frost Mantle of the Dawn - [GetSpellInfo(11759)] = 11759, -- Basilisk Sample - [GetSpellInfo(4954)] = 4954, -- Break Tool - [GetSpellInfo(18990)] = 18990, -- Brown Kodo - [GetSpellInfo(15119)] = 15119, -- Apply Seduction Gland - [GetSpellInfo(19092)] = 19092, -- Wicked Leather Belt - [GetSpellInfo(16665)] = 16665, -- Runic Plate Boots - [GetSpellInfo(2053)] = 2053, -- Lesser Heal - [GetSpellInfo(18419)] = 18419, -- Felcloth Pants - [GetSpellInfo(25793)] = 25793, -- Demon Summoning Torch - [GetSpellInfo(6471)] = 6471, -- Tiny Iron Key - [GetSpellInfo(3914)] = 3914, -- Brown Linen Pants - [GetSpellInfo(19795)] = 19795, -- Thorium Tube - [GetSpellInfo(9961)] = 9961, -- Mithril Coif - [GetSpellInfo(25030)] = 25030, -- Shoot Rocket - [GetSpellInfo(26656)] = 26656, -- Summon Black Qiraji Battle Tank - [GetSpellInfo(10546)] = 10546, -- Wild Leather Helmet - [GetSpellInfo(10499)] = 10499, -- Nightscape Tunic - [GetSpellInfo(12595)] = 12595, -- Mithril Blunderbuss - [GetSpellInfo(17923)] = 17923, -- Searing Pain - [GetSpellInfo(8812)] = 8812, -- Heal - [GetSpellInfo(18447)] = 18447, -- Mooncloth Vest - [GetSpellInfo(7057)] = 7057, -- Haunting Spirits - [GetSpellInfo(7918)] = 7918, -- Shoot Gun - [GetSpellInfo(9148)] = 9148, -- Pilferer's Gloves - [GetSpellInfo(24242)] = 24242, -- Swift Razzashi Raptor - [GetSpellInfo(7106)] = 7106, -- Dark Restore - [GetSpellInfo(7893)] = 7893, -- Stylish Green Shirt - [GetSpellInfo(7258)] = 7258, -- Frost Protection Potion - [GetSpellInfo(24848)] = 24848, -- Spitfire Breastplate - [GetSpellInfo(8795)] = 8795, -- Azure Shoulders - [GetSpellInfo(11840)] = 11840, -- Summon Edana Hatetalon - [GetSpellInfo(10015)] = 10015, -- Truesilver Champion - [GetSpellInfo(271)] = 271, -- Call of the Void - [GetSpellInfo(867)] = 867, -- Fumble III - [GetSpellInfo(13028)] = 13028, -- Goldthorn Tea - [GetSpellInfo(18976)] = 18976, -- Self Resurrection - [GetSpellInfo(17563)] = 17563, -- Transmute: Undeath to Water - [GetSpellInfo(3294)] = 3294, -- Thick War Axe - [GetSpellInfo(17459)] = 17459, -- Icy Blue Mechanostrider - [GetSpellInfo(29480)] = 29480, -- Fortitude of the Scourge - [GetSpellInfo(3859)] = 3859, -- Azure Silk Vest - [GetSpellInfo(2738)] = 2738, -- Copper Axe - [GetSpellInfo(26010)] = 26010, -- Summon Tranquil Mechanical Yeti - [GetSpellInfo(22721)] = 22721, -- Black War Raptor - [GetSpellInfo(25298)] = 25298, -- Starfire - [GetSpellInfo(2963)] = 2963, -- Bolt of Linen Cloth - [GetSpellInfo(16983)] = 16983, -- Serenity - [GetSpellInfo(9059)] = 9059, -- Handstitched Leather Bracers - [GetSpellInfo(19435)] = 19435, -- Mooncloth Boots - [GetSpellInfo(24421)] = 24421, -- Zandalar Signet of Mojo - [GetSpellInfo(2168)] = 2168, -- Dark Leather Cloak - [GetSpellInfo(3964)] = 3964, -- Deprecated BKP "Impact" Shot - [GetSpellInfo(16992)] = 16992, -- Frostguard - [GetSpellInfo(11760)] = 11760, -- Hyena Sample - [GetSpellInfo(26055)] = 26055, -- Summon Yellow Qiraji Battle Tank - [GetSpellInfo(4075)] = 4075, -- Large Seaforium Charge - [GetSpellInfo(7992)] = 7992, -- Slowing Poison - [GetSpellInfo(13628)] = 13628, -- Runed Golden Rod - [GetSpellInfo(23192)] = 23192, -- Forming Rhok'delar - [GetSpellInfo(3496)] = 3496, -- Moonsteel Broadsword - [GetSpellInfo(3561)] = 3561, -- Teleport: Stormwind - [GetSpellInfo(21939)] = 21939, -- Create Scepter of Celebras - [GetSpellInfo(19074)] = 19074, -- Frostsaber Leggings - [GetSpellInfo(26381)] = 26381, -- Burrow - [GetSpellInfo(16729)] = 16729, -- Lionheart Helm - [GetSpellInfo(19791)] = 19791, -- Thorium Widget - [GetSpellInfo(29333)] = 29333, -- Midsummer Sausage - [GetSpellInfo(2660)] = 2660, -- Rough Sharpening Stone - [GetSpellInfo(3925)] = 3925, -- Rough Boomstick - [GetSpellInfo(19075)] = 19075, -- Heavy Scorpid Leggings - [GetSpellInfo(22866)] = 22866, -- Belt of the Archmage - [GetSpellInfo(8690)] = 8690, -- Hearthstone - [GetSpellInfo(27890)] = 27890, -- Clone - [GetSpellInfo(24024)] = 24024, -- Unstable Concoction - [GetSpellInfo(982)] = 982, -- Revive Pet - [GetSpellInfo(3777)] = 3777, -- Guardian Leather Bracers - [GetSpellInfo(17567)] = 17567, -- Summon Blood Parrot - [GetSpellInfo(9916)] = 9916, -- Steel Breastplate - [GetSpellInfo(9813)] = 9813, -- Barbaric Iron Breastplate - [GetSpellInfo(16629)] = 16629, -- Attuned Dampener - [GetSpellInfo(10709)] = 10709, -- Summon Prairie Dog - [GetSpellInfo(4068)] = 4068, -- Iron Grenade - [GetSpellInfo(10617)] = 10617, -- Release Rageclaw - [GetSpellInfo(20916)] = 20916, -- Mithril Headed Trout - [GetSpellInfo(9993)] = 9993, -- Heavy Mithril Axe - [GetSpellInfo(6905)] = 6905, -- Summon Illusionary Nightmare - [GetSpellInfo(9058)] = 9058, -- Handstitched Leather Cloak - [GetSpellInfo(8686)] = 8686, -- Instant Poison II - [GetSpellInfo(6418)] = 6418, -- Crispy Lizard Tail - [GetSpellInfo(25807)] = 25807, -- Great Heal - [GetSpellInfo(26421)] = 26421, -- Large Green Rocket - [GetSpellInfo(28732)] = 28732, -- Widow's Embrace - [GetSpellInfo(18113)] = 18113, -- Manifestation Cleansing - [GetSpellInfo(2835)] = 2835, -- Deadly Poison - [GetSpellInfo(10837)] = 10837, -- Goblin Land Mine - [GetSpellInfo(26277)] = 26277, -- Elixir of Greater Firepower - [GetSpellInfo(513)] = 513, -- Earth Elemental - [GetSpellInfo(13901)] = 13901, -- Arcane Bolt - [GetSpellInfo(3449)] = 3449, -- Shadow Oil - [GetSpellInfo(15783)] = 15783, -- Blizzard - [GetSpellInfo(25004)] = 25004, -- Throw Nightmare Object - [GetSpellInfo(7821)] = 7821, -- Transform Victim - [GetSpellInfo(3678)] = 3678, -- Focusing - [GetSpellInfo(16643)] = 16643, -- Thorium Belt - [GetSpellInfo(24266)] = 24266, -- Gurubashi Mojo Madness - [GetSpellInfo(19061)] = 19061, -- Living Shoulders - [GetSpellInfo(12346)] = 12346, -- Awaken the Soulflayer - [GetSpellInfo(6656)] = 6656, -- Remote Detonate - [GetSpellInfo(16980)] = 16980, -- Rune Edge - [GetSpellInfo(507)] = 507, -- Fumble II - [GetSpellInfo(8791)] = 8791, -- Crimson Silk Vest - [GetSpellInfo(27589)] = 27589, -- Black Grasp of the Destroyer - [GetSpellInfo(28324)] = 28324, -- Forming Frame of Atiesh - [GetSpellInfo(10849)] = 10849, -- Form of the Moonstalker (no invis) - [GetSpellInfo(5206)] = 5206, -- Plant Seeds - [GetSpellInfo(3505)] = 3505, -- Golden Scale Shoulders - [GetSpellInfo(20737)] = 20737, -- Summon Karang's Banner - [GetSpellInfo(16502)] = 16502, -- Release Winna's Kitten - [GetSpellInfo(10516)] = 10516, -- Nightscape Shoulders - [GetSpellInfo(21066)] = 21066, -- Void Bolt - [GetSpellInfo(19097)] = 19097, -- Devilsaur Leggings - [GetSpellInfo(12260)] = 12260, -- Rough Copper Vest - [GetSpellInfo(23703)] = 23703, -- Might of the Timbermaw - [GetSpellInfo(11343)] = 11343, -- Instant Poison VI - [GetSpellInfo(3758)] = 3758, -- Green Woolen Bag - [GetSpellInfo(697)] = 697, -- Summon Voidwalker - [GetSpellInfo(28461)] = 28461, -- Ironvine Breastplate - [GetSpellInfo(12074)] = 12074, -- Black Mageweave Shoulders - [GetSpellInfo(3206)] = 3206, -- Sol H - [GetSpellInfo(3839)] = 3839, -- Bolt of Silk Cloth - [GetSpellInfo(3756)] = 3756, -- Embossed Leather Gloves - [GetSpellInfo(20873)] = 20873, -- Fiery Chain Shoulders - [GetSpellInfo(15303)] = 15303, -- DEBUG Create Samophlange Manual - [GetSpellInfo(15463)] = 15463, -- Legendary Arcane Amalgamation - [GetSpellInfo(10719)] = 10719, -- Summon Ribbon Snake - [GetSpellInfo(7928)] = 7928, -- Silk Bandage - [GetSpellInfo(443)] = 443, -- Teleport Barracks - [GetSpellInfo(2837)] = 2837, -- Deadly Poison II - [GetSpellInfo(8532)] = 8532, -- Aquadynamic Fish Lens - [GetSpellInfo(11419)] = 11419, -- Portal: Darnassus - [GetSpellInfo(8617)] = 8617, -- Skinning - [GetSpellInfo(17646)] = 17646, -- Summon Onyxia Whelp - [GetSpellInfo(16647)] = 16647, -- Imperial Plate Belt - [GetSpellInfo(26416)] = 26416, -- Small Blue Rocket - [GetSpellInfo(11472)] = 11472, -- Elixir of Giants - [GetSpellInfo(2396)] = 2396, -- Green Linen Shirt - [GetSpellInfo(19071)] = 19071, -- Wicked Leather Headband - [GetSpellInfo(6703)] = 6703, -- Murloc Scale Breastplate - [GetSpellInfo(12719)] = 12719, -- Explosive Arrow - [GetSpellInfo(3429)] = 3429, -- Plague Mind - [GetSpellInfo(877)] = 877, -- Elemental Fury - [GetSpellInfo(18244)] = 18244, -- Poached Sunscale Salmon - [GetSpellInfo(13982)] = 13982, -- Bael'Gar's Fiery Essence - [GetSpellInfo(7761)] = 7761, -- Shared Bonds - [GetSpellInfo(3960)] = 3960, -- Portable Bronze Mortar - [GetSpellInfo(28353)] = 28353, -- Raise Dead - [GetSpellInfo(18559)] = 18559, -- Demon Pick - [GetSpellInfo(9437)] = 9437, -- Placing Bear Trap - [GetSpellInfo(6702)] = 6702, -- Murloc Scale Belt - [GetSpellInfo(23221)] = 23221, -- Swift Frostsaber - [GetSpellInfo(3117)] = 3117, -- Heavy Weightstone - [GetSpellInfo(3659)] = 3659, -- Mage Sight - [GetSpellInfo(20872)] = 20872, -- Fiery Chain Girdle - [GetSpellInfo(16599)] = 16599, -- Blessing of Shahram - [GetSpellInfo(15033)] = 15033, -- Summon Ancient Spirits - [GetSpellInfo(26442)] = 26442, -- Firework Launcher - [GetSpellInfo(3504)] = 3504, -- Green Iron Shoulders - [GetSpellInfo(25037)] = 25037, -- Rumsey Rum Light - [GetSpellInfo(3721)] = 3721, -- Teleport Altar of the Tides - [GetSpellInfo(28891)] = 28891, -- Consecrated Weapon - [GetSpellInfo(3858)] = 3858, -- Shadow Hood - [GetSpellInfo(28148)] = 28148, -- Portal: Karazhan - [GetSpellInfo(24091)] = 24091, -- Bloodvine Vest - [GetSpellInfo(23069)] = 23069, -- EZ-Thro Dynamite II - [GetSpellInfo(19773)] = 19773, -- Elemental Fire - [GetSpellInfo(10013)] = 10013, -- Ebon Shiv - [GetSpellInfo(3332)] = 3332, -- Slow Poison - [GetSpellInfo(19830)] = 19830, -- Arcanite Dragonling - [GetSpellInfo(2675)] = 2675, -- Shining Silver Breastplate - [GetSpellInfo(22906)] = 22906, -- Plunging Blade into Onyxia - [GetSpellInfo(12259)] = 12259, -- Silvered Bronze Leggings - [GetSpellInfo(23629)] = 23629, -- Heavy Timbermaw Boots - [GetSpellInfo(3172)] = 3172, -- Minor Magic Resistance Potion - [GetSpellInfo(10005)] = 10005, -- Dazzling Mithril Rapier - [GetSpellInfo(5213)] = 5213, -- Molten Metal - [GetSpellInfo(10525)] = 10525, -- Tough Scorpid Breastplate - [GetSpellInfo(23123)] = 23123, -- Cairne's Hoofprint - [GetSpellInfo(17015)] = 17015, -- Destroy Tent - [GetSpellInfo(24896)] = 24896, -- Create Scepter of Beckoning: Air - [GetSpellInfo(23486)] = 23486, -- Dimensional Ripper - Everlook - [GetSpellInfo(11537)] = 11537, -- Charge Stave of Equinex - [GetSpellInfo(9920)] = 9920, -- Solid Grinding Stone - [GetSpellInfo(10685)] = 10685, -- Summon Ancona - [GetSpellInfo(17561)] = 17561, -- Transmute: Earth to Water - [GetSpellInfo(27588)] = 27588, -- Light Obsidian Belt - [GetSpellInfo(8797)] = 8797, -- Earthen Silk Belt - [GetSpellInfo(16639)] = 16639, -- Dense Grinding Stone - [GetSpellInfo(2543)] = 2543, -- Westfall Stew - [GetSpellInfo(8334)] = 8334, -- Practice Lock - [GetSpellInfo(17187)] = 17187, -- Transmute: Arcanite - [GetSpellInfo(7181)] = 7181, -- Greater Healing Potion - [GetSpellInfo(20777)] = 20777, -- Ancestral Spirit - [GetSpellInfo(20752)] = 20752, -- Create Soulstone (Lesser) - [GetSpellInfo(10717)] = 10717, -- Summon Crimson Snake - [GetSpellInfo(7487)] = 7487, -- Call Bleak Worg - [GetSpellInfo(12534)] = 12534, -- Flames of Retribution - [GetSpellInfo(26103)] = 26103, -- Sweep - [GetSpellInfo(21728)] = 21728, -- Planting Ichman's Beacon - [GetSpellInfo(25159)] = 25159, -- Call Prismatic Barrier - [GetSpellInfo(17166)] = 17166, -- Release Umi's Yeti - [GetSpellInfo(16597)] = 16597, -- Curse of Shahram - [GetSpellInfo(13895)] = 13895, -- Summon Spawn of Bael'Gar - [GetSpellInfo(4153)] = 4153, -- Guile of the Raptor - [GetSpellInfo(11433)] = 11433, -- Death & Decay - [GetSpellInfo(3776)] = 3776, -- Green Leather Bracers - [GetSpellInfo(968)] = 968, -- Feral Spirit II - [GetSpellInfo(5166)] = 5166, -- Harvest Silithid Egg - [GetSpellInfo(3765)] = 3765, -- Dark Leather Gloves - [GetSpellInfo(3396)] = 3396, -- Corrosive Poison - [GetSpellInfo(23339)] = 23339, -- Wing Buffet - [GetSpellInfo(7837)] = 7837, -- Fire Oil - [GetSpellInfo(15292)] = 15292, -- Dark Iron Pulverizer - [GetSpellInfo(2662)] = 2662, -- Copper Chain Pants - [GetSpellInfo(20530)] = 20530, -- Bind Chapter 2 - [GetSpellInfo(15114)] = 15114, -- Summon Illusionary Dreamwatchers - [GetSpellInfo(8398)] = 8398, -- Frostbolt Volley - [GetSpellInfo(3845)] = 3845, -- Soft-soled Linen Boots - [GetSpellInfo(18809)] = 18809, -- Pyroblast - [GetSpellInfo(6250)] = 6250, -- Fire Cannon - [GetSpellInfo(23453)] = 23453, -- Gnomish Transporter - [GetSpellInfo(12068)] = 12068, -- Stormcloth Vest - [GetSpellInfo(2547)] = 2547, -- Redridge Goulash - [GetSpellInfo(9060)] = 9060, -- Light Leather Quiver - [GetSpellInfo(12624)] = 12624, -- Mithril Mechanical Dragonling - [GetSpellInfo(11661)] = 11661, -- Shadow Bolt - [GetSpellInfo(12460)] = 12460, -- Sniper Scope - [GetSpellInfo(555)] = 555, -- Feral Spirit - [GetSpellInfo(6897)] = 6897, -- Blue Ram - [GetSpellInfo(6692)] = 6692, -- Robes of Arcana - [GetSpellInfo(24377)] = 24377, -- Destroy Bijou - [GetSpellInfo(13229)] = 13229, -- Wound Poison III - [GetSpellInfo(3655)] = 3655, -- Summon Shield Guard - [GetSpellInfo(18446)] = 18446, -- Wizardweave Robe - [GetSpellInfo(3856)] = 3856, -- Spider Silk Slippers - [GetSpellInfo(7639)] = 7639, -- Blue Overalls - [GetSpellInfo(9614)] = 9614, -- Rift Beacon - [GetSpellInfo(18404)] = 18404, -- Frostweave Robe - [GetSpellInfo(7068)] = 7068, -- Veil of Shadow - [GetSpellInfo(15712)] = 15712, -- Linken's Boomerang - [GetSpellInfo(28209)] = 28209, -- Glacial Wrists - [GetSpellInfo(7791)] = 7791, -- Teleport - [GetSpellInfo(7935)] = 7935, -- Strong Anti-Venom - [GetSpellInfo(3871)] = 3871, -- Formal White Shirt - [GetSpellInfo(11654)] = 11654, -- Call of Sul'thraze - [GetSpellInfo(7967)] = 7967, -- Naralex's Nightmare - [GetSpellInfo(12061)] = 12061, -- Orange Mageweave Shirt - [GetSpellInfo(6661)] = 6661, -- Barbaric Harness - [GetSpellInfo(7155)] = 7155, -- CreatureSpecial - [GetSpellInfo(2397)] = 2397, -- Reinforced Linen Cape - [GetSpellInfo(22902)] = 22902, -- Mooncloth Robe - [GetSpellInfo(10699)] = 10699, -- Summon Bronze Whelpling - [GetSpellInfo(14030)] = 14030, -- Hooked Net - [GetSpellInfo(18402)] = 18402, -- Runecloth Belt - [GetSpellInfo(18454)] = 18454, -- Gloves of Spell Mastery - [GetSpellInfo(8286)] = 8286, -- Summon Boar Spirit - [GetSpellInfo(3873)] = 3873, -- Black Swashbuckler's Shirt - [GetSpellInfo(3321)] = 3321, -- Copper Chain Vest - [GetSpellInfo(6517)] = 6517, -- Pearl-handled Dagger - [GetSpellInfo(34)] = 34, -- Teleport Duskwood - [GetSpellInfo(21047)] = 21047, -- Corrosive Acid Spit - [GetSpellInfo(15549)] = 15549, -- Chained Bolt - [GetSpellInfo(1122)] = 1122, -- Inferno - [GetSpellInfo(26425)] = 26425, -- Red Rocket Cluster - [GetSpellInfo(11458)] = 11458, -- Wildvine Potion - [GetSpellInfo(3143)] = 3143, -- Glacial Roar - [GetSpellInfo(17474)] = 17474, -- Find Relic Fragment - [GetSpellInfo(23140)] = 23140, -- J'eevee summons object - [GetSpellInfo(21559)] = 21559, -- Shredder Armor Melt - [GetSpellInfo(22909)] = 22909, -- Eye of Immol'thar - [GetSpellInfo(3319)] = 3319, -- Copper Chain Boots - [GetSpellInfo(24706)] = 24706, -- Toss Stink Bomb - [GetSpellInfo(20693)] = 20693, -- Summon Lost Amulet - [GetSpellInfo(20626)] = 20626, -- Undermine Clam Chowder - [GetSpellInfo(9654)] = 9654, -- Jumping Lightning - [GetSpellInfo(5137)] = 5137, -- Call of the Grave - [GetSpellInfo(15972)] = 15972, -- Glinting Steel Dagger - [GetSpellInfo(8766)] = 8766, -- Azure Silk Belt - [GetSpellInfo(3764)] = 3764, -- Hillman's Leather Gloves - [GetSpellInfo(8919)] = 8919, -- Fill Jennea's Flask - [GetSpellInfo(11480)] = 11480, -- Transmute: Mithril to Truesilver - [GetSpellInfo(5169)] = 5169, -- Defias Disguise - [GetSpellInfo(3371)] = 3371, -- Blood Sausage - [GetSpellInfo(23316)] = 23316, -- Ignite Flesh - [GetSpellInfo(22599)] = 22599, -- Chromatic Mantle of the Dawn - [GetSpellInfo(15748)] = 15748, -- Freeze Rookery Egg - [GetSpellInfo(22647)] = 22647, -- Empower Pet - [GetSpellInfo(20733)] = 20733, -- Black Arrow - [GetSpellInfo(19788)] = 19788, -- Dense Blasting Powder - [GetSpellInfo(8682)] = 8682, -- Fake Shot - [GetSpellInfo(3771)] = 3771, -- Barbaric Gloves - [GetSpellInfo(7955)] = 7955, -- Deviate Scale Belt - [GetSpellInfo(8786)] = 8786, -- Azure Silk Cloak - [GetSpellInfo(21648)] = 21648, -- Call to Ivus - [GetSpellInfo(12151)] = 12151, -- Summon Atal'ai Skeleton - [GetSpellInfo(28614)] = 28614, -- Pointy Spike - [GetSpellInfo(7277)] = 7277, -- Harvest Swarm - [GetSpellInfo(8282)] = 8282, -- Curse of Blood - [GetSpellInfo(27830)] = 27830, -- Persuader - [GetSpellInfo(3851)] = 3851, -- Phoenix Pants - [GetSpellInfo(20874)] = 20874, -- Dark Iron Bracers - [GetSpellInfo(19081)] = 19081, -- Chimeric Vest - [GetSpellInfo(7259)] = 7259, -- Nature Protection Potion - [GetSpellInfo(9744)] = 9744, -- Jarkal's Translation - [GetSpellInfo(24874)] = 24874, -- Create Crest of Beckoning: Fire - [GetSpellInfo(7949)] = 7949, -- Summon Viper - [GetSpellInfo(31364)] = 31364, -- Spice Mortar - [GetSpellInfo(24366)] = 24366, -- Greater Dreamless Sleep Potion - [GetSpellInfo(21652)] = 21652, -- Closing - [GetSpellInfo(1124)] = 1124, -- Hellfire II - [GetSpellInfo(7488)] = 7488, -- Call Slavering Worg - [GetSpellInfo(23665)] = 23665, -- Argent Shoulders - [GetSpellInfo(7951)] = 7951, -- Toxic Spit - [GetSpellInfo(19470)] = 19470, -- Gem of the Serpent - [GetSpellInfo(2542)] = 2542, -- Goretusk Liver Pie - [GetSpellInfo(895)] = 895, -- Fire Elemental - [GetSpellInfo(23228)] = 23228, -- Swift White Steed - [GetSpellInfo(7841)] = 7841, -- Swim Speed Potion - [GetSpellInfo(17636)] = 17636, -- Flask of Distilled Wisdom - [GetSpellInfo(10686)] = 10686, -- Summon Prairie Chicken - [GetSpellInfo(10318)] = 10318, -- Holy Wrath - [GetSpellInfo(3718)] = 3718, -- Syndicate Bomb - [GetSpellInfo(20436)] = 20436, -- Drunken Pit Crew - [GetSpellInfo(19103)] = 19103, -- Runic Leather Shoulders - [GetSpellInfo(1936)] = 1936, -- Teleport Anvilmar - [GetSpellInfo(23231)] = 23231, -- Binding Volume I - [GetSpellInfo(10873)] = 10873, -- Red Mechanostrider - [GetSpellInfo(20876)] = 20876, -- Dark Iron Leggings - [GetSpellInfo(26588)] = 26588, -- Opening Greater Scarab Coffer - [GetSpellInfo(16588)] = 16588, -- Dark Mending - [GetSpellInfo(18410)] = 18410, -- Ghostweave Belt - [GetSpellInfo(19084)] = 19084, -- Devilsaur Gauntlets - [GetSpellInfo(18401)] = 18401, -- Bolt of Runecloth - [GetSpellInfo(24264)] = 24264, -- Extinguish - [GetSpellInfo(7920)] = 7920, -- Mebok Smart Drink - [GetSpellInfo(20875)] = 20875, -- Rumsey Rum - [GetSpellInfo(932)] = 932, -- Replenish Spirit II - [GetSpellInfo(12564)] = 12564, -- Summon Treasure Horde Visual - [GetSpellInfo(24189)] = 24189, -- Force Punch - [GetSpellInfo(9064)] = 9064, -- Rugged Leather Pants - [GetSpellInfo(8804)] = 8804, -- Crimson Silk Gloves - [GetSpellInfo(22927)] = 22927, -- Hide of the Wild - [GetSpellInfo(4962)] = 4962, -- Encasing Webs - [GetSpellInfo(26167)] = 26167, -- Colossal Smash - [GetSpellInfo(10697)] = 10697, -- Summon Crimson Whelpling - [GetSpellInfo(22562)] = 22562, -- Fill Amethyst Phial - [GetSpellInfo(9146)] = 9146, -- Herbalist's Gloves - [GetSpellInfo(15057)] = 15057, -- Mechanical Patch Kit - [GetSpellInfo(18408)] = 18408, -- Cindercloth Vest - [GetSpellInfo(15781)] = 15781, -- Steel Mechanostrider - [GetSpellInfo(12087)] = 12087, -- Stormcloth Shoulders - [GetSpellInfo(21923)] = 21923, -- Elixir of Frost Power - [GetSpellInfo(7364)] = 7364, -- Light Torch - [GetSpellInfo(5668)] = 5668, -- Peasant Disguise - [GetSpellInfo(25314)] = 25314, -- Greater Heal - [GetSpellInfo(12619)] = 12619, -- Hi-Explosive Bomb - [GetSpellInfo(2672)] = 2672, -- Patterned Bronze Bracers - [GetSpellInfo(6758)] = 6758, -- Party Fever - [GetSpellInfo(15293)] = 15293, -- Dark Iron Mail - [GetSpellInfo(4981)] = 4981, -- Inducing Vision - [GetSpellInfo(2336)] = 2336, -- Elixir of Tongues - [GetSpellInfo(2362)] = 2362, -- Create Spellstone - [GetSpellInfo(11477)] = 11477, -- Elixir of Demonslaying - [GetSpellInfo(2659)] = 2659, -- Smelt Bronze - [GetSpellInfo(13899)] = 13899, -- Fire Storm - [GetSpellInfo(22808)] = 22808, -- Elixir of Greater Water Breathing - [GetSpellInfo(24576)] = 24576, -- Chromatic Mount - [GetSpellInfo(10706)] = 10706, -- Summon Hawk Owl - [GetSpellInfo(2673)] = 2673, -- Silvered Bronze Breastplate - [GetSpellInfo(2601)] = 2601, -- Fire Shield III - [GetSpellInfo(2156)] = 2156, -- Light Winter Cloak - [GetSpellInfo(22718)] = 22718, -- Black War Kodo - [GetSpellInfo(3277)] = 3277, -- Wool Bandage - [GetSpellInfo(24239)] = 24239, -- Hammer of Wrath - [GetSpellInfo(28208)] = 28208, -- Glacial Cloak - [GetSpellInfo(849)] = 849, -- Elemental Armor - [GetSpellInfo(10560)] = 10560, -- Big Voodoo Pants - [GetSpellInfo(6693)] = 6693, -- Green Silk Pack - [GetSpellInfo(24140)] = 24140, -- Darksoul Leggings - [GetSpellInfo(30021)] = 30021, -- Crystal Infused Bandage - [GetSpellInfo(16798)] = 16798, -- Enchanting Lullaby - [GetSpellInfo(8809)] = 8809, -- Slave Drain - [GetSpellInfo(5265)] = 5265, -- Stonesplinter Trogg Disguise - [GetSpellInfo(28222)] = 28222, -- Icy Scale Breastplate - [GetSpellInfo(18420)] = 18420, -- Brightcloth Cloak - [GetSpellInfo(24887)] = 24887, -- Create Crest of Beckoning: Earth - [GetSpellInfo(4130)] = 4130, -- Banish Burning Exile - [GetSpellInfo(2329)] = 2329, -- Elixir of Lion's Strength - [GetSpellInfo(13478)] = 13478, -- Opening Relic Coffer - [GetSpellInfo(13583)] = 13583, -- Curse of the Deadwood - [GetSpellInfo(18571)] = 18571, -- Breath - [GetSpellInfo(24891)] = 24891, -- Create Signet of Beckoning: Earth - [GetSpellInfo(17505)] = 17505, -- Curse of Timmy - [GetSpellInfo(9095)] = 9095, -- Cantation of Manifestation - [GetSpellInfo(2576)] = 2576, -- Mining - [GetSpellInfo(3979)] = 3979, -- Accurate Scope - [GetSpellInfo(28305)] = 28305, -- Copy of Great Heal - [GetSpellInfo(5208)] = 5208, -- Poisoned Harpoon - [GetSpellInfo(512)] = 512, -- Chains of Ice - [GetSpellInfo(14227)] = 14227, -- Signing - [GetSpellInfo(26063)] = 26063, -- Ouro Submerge Visual - [GetSpellInfo(8238)] = 8238, -- Savory Deviate Delight - [GetSpellInfo(2831)] = 2831, -- Armor +8 - [GetSpellInfo(30732)] = 30732, -- Worm Sweep - [GetSpellInfo(22846)] = 22846, -- Arcanum of Protection - [GetSpellInfo(12090)] = 12090, -- Stormcloth Boots - [GetSpellInfo(3940)] = 3940, -- Shadow Goggles - [GetSpellInfo(17777)] = 17777, -- Create Commission - [GetSpellInfo(12589)] = 12589, -- Mithril Tube - [GetSpellInfo(16381)] = 16381, -- Summon Rockwing Gargoyles - [GetSpellInfo(10712)] = 10712, -- Summon Spotted Rabbit - [GetSpellInfo(12077)] = 12077, -- Simple Black Dress - [GetSpellInfo(23081)] = 23081, -- Hyper-Radiant Flame Reflector - [GetSpellInfo(7355)] = 7355, -- Stuck - [GetSpellInfo(24962)] = 24962, -- Honor Points +138 - [GetSpellInfo(23675)] = 23675, -- Minigun - [GetSpellInfo(5884)] = 5884, -- Banshee Curse - [GetSpellInfo(6814)] = 6814, -- Sludge Toxin - [GetSpellInfo(17635)] = 17635, -- Flask of the Titans - [GetSpellInfo(3813)] = 3813, -- Small Silk Pack - [GetSpellInfo(2401)] = 2401, -- Woolen Boots - [GetSpellInfo(10850)] = 10850, -- Powerful Smelling Salts - [GetSpellInfo(16664)] = 16664, -- Runic Plate Shoulders - [GetSpellInfo(3421)] = 3421, -- Crippling Poison II - [GetSpellInfo(28462)] = 28462, -- Ironvine Gloves - [GetSpellInfo(8799)] = 8799, -- Crimson Silk Pantaloons - [GetSpellInfo(9987)] = 9987, -- Bronze Battle Axe - [GetSpellInfo(25121)] = 25121, -- Wizard Oil - [GetSpellInfo(21945)] = 21945, -- Green Holiday Shirt - [GetSpellInfo(18831)] = 18831, -- Conjure Lily Root - [GetSpellInfo(6441)] = 6441, -- Explosive Shells - [GetSpellInfo(26299)] = 26299, -- Create Cluster Rocket Launcher - [GetSpellInfo(25840)] = 25840, -- Full Heal - [GetSpellInfo(3372)] = 3372, -- Murloc Fin Soup - [GetSpellInfo(17560)] = 17560, -- Transmute: Fire to Earth - [GetSpellInfo(10507)] = 10507, -- Nightscape Headband - [GetSpellInfo(21097)] = 21097, -- Manastorm - [GetSpellInfo(11437)] = 11437, -- Opening Chest - [GetSpellInfo(9937)] = 9937, -- Mithril Scale Bracers - [GetSpellInfo(6412)] = 6412, -- Kaldorei Spider Kabob - [GetSpellInfo(3333)] = 3333, -- Silvered Bronze Gauntlets - [GetSpellInfo(6624)] = 6624, -- Free Action Potion - [GetSpellInfo(16651)] = 16651, -- Thorium Shield Spike - [GetSpellInfo(24367)] = 24367, -- Living Action Potion - [GetSpellInfo(20513)] = 20513, -- Enchanted Resonite Crystal - [GetSpellInfo(18457)] = 18457, -- Robe of the Archmage - [GetSpellInfo(27871)] = 27871, -- Lightwell - [GetSpellInfo(2657)] = 2657, -- Smelt Copper - [GetSpellInfo(8880)] = 8880, -- Copper Dagger - [GetSpellInfo(8593)] = 8593, -- Symbol of Life - [GetSpellInfo(21154)] = 21154, -- Might of Ragnaros - [GetSpellInfo(18987)] = 18987, -- Create Relic Bundle - [GetSpellInfo(18541)] = 18541, -- Ritual of Doom Effect - [GetSpellInfo(8243)] = 8243, -- Flash Bomb - [GetSpellInfo(12699)] = 12699, -- Summon Screecher Spirit - [GetSpellInfo(5159)] = 5159, -- Melt Ore - [GetSpellInfo(24160)] = 24160, -- Syncretist's Sigil - [GetSpellInfo(19063)] = 19063, -- Chimeric Boots - [GetSpellInfo(3109)] = 3109, -- Presence of Death - [GetSpellInfo(16153)] = 16153, -- Smelt Thorium - [GetSpellInfo(28480)] = 28480, -- Sylvan Vest - [GetSpellInfo(8780)] = 8780, -- Hands of Darkness - [GetSpellInfo(9143)] = 9143, -- Bomb - [GetSpellInfo(17462)] = 17462, -- Red Skeletal Horse - [GetSpellInfo(9995)] = 9995, -- Blue Glittering Axe - [GetSpellInfo(33)] = 33, -- Teleport Westfall - [GetSpellInfo(28304)] = 28304, -- Copy of Healing Wave - [GetSpellInfo(3918)] = 3918, -- Rough Blasting Powder - [GetSpellInfo(28205)] = 28205, -- Glacial Gloves - [GetSpellInfo(10680)] = 10680, -- Summon Cockatiel - [GetSpellInfo(25954)] = 25954, -- Sagefish Delight - [GetSpellInfo(23531)] = 23531, -- Summon Tiny Green Dragon - [GetSpellInfo(23220)] = 23220, -- Swift Dawnsaber - [GetSpellInfo(17496)] = 17496, -- Crest of Retribution - [GetSpellInfo(25783)] = 25783, -- Place Arcanite Buoy - [GetSpellInfo(2539)] = 2539, -- Spiced Wolf Meat - [GetSpellInfo(20041)] = 20041, -- Tammra Sapling - [GetSpellInfo(18658)] = 18658, -- Hibernate - [GetSpellInfo(2670)] = 2670, -- Rough Bronze Cuirass - [GetSpellInfo(25839)] = 25839, -- Mass Healing - [GetSpellInfo(24139)] = 24139, -- Darksoul Breastplate - [GetSpellInfo(24121)] = 24121, -- Primal Batskin Jerkin - [GetSpellInfo(23392)] = 23392, -- Boulder - [GetSpellInfo(2392)] = 2392, -- Red Linen Shirt - [GetSpellInfo(9979)] = 9979, -- Ornate Mithril Boots - [GetSpellInfo(5316)] = 5316, -- Raptor Feather - [GetSpellInfo(16554)] = 16554, -- Toxic Bolt - [GetSpellInfo(24654)] = 24654, -- Blue Dragonscale Leggings - [GetSpellInfo(15125)] = 15125, -- Scarshield Portal - [GetSpellInfo(26428)] = 26428, -- Large Red Rocket Cluster - [GetSpellInfo(3959)] = 3959, -- Discombobulator Ray - [GetSpellInfo(19250)] = 19250, -- Placing Smokey's Explosives - [GetSpellInfo(581)] = 581, -- Winter Wolf - [GetSpellInfo(23193)] = 23193, -- Forming Lok'delar - [GetSpellInfo(4062)] = 4062, -- Heavy Dynamite - [GetSpellInfo(3919)] = 3919, -- Rough Dynamite - [GetSpellInfo(3761)] = 3761, -- Fine Leather Tunic - [GetSpellInfo(11438)] = 11438, -- Join Map Fragments - [GetSpellInfo(20702)] = 20702, -- Summon Treant Allies - [GetSpellInfo(25849)] = 25849, -- Summon Baby Shark - [GetSpellInfo(3205)] = 3205, -- Sol M - [GetSpellInfo(13912)] = 13912, -- Princess Summons Portal - [GetSpellInfo(6518)] = 6518, -- Iridescent Hammer - [GetSpellInfo(3399)] = 3399, -- Tasty Lion Steak - [GetSpellInfo(3511)] = 3511, -- Golden Scale Cuirass - [GetSpellInfo(14810)] = 14810, -- Greater Mystic Wand - [GetSpellInfo(18647)] = 18647, -- Banish - [GetSpellInfo(10007)] = 10007, -- Phantom Blade - [GetSpellInfo(23667)] = 23667, -- Flarecore Leggings - [GetSpellInfo(19067)] = 19067, -- Stormshroud Pants - [GetSpellInfo(24967)] = 24967, -- Gong - [GetSpellInfo(3275)] = 3275, -- Linen Bandage - [GetSpellInfo(10166)] = 10166, -- Khadgar's Unlocking - [GetSpellInfo(28311)] = 28311, -- Slime Bolt - [GetSpellInfo(24163)] = 24163, -- Vodouisant's Vigilant Embrace - [GetSpellInfo(17181)] = 17181, -- Enchanted Leather - [GetSpellInfo(19054)] = 19054, -- Red Dragonscale Breastplate - [GetSpellInfo(10605)] = 10605, -- Chain Lightning - [GetSpellInfo(5781)] = 5781, -- Threatening Growl - [GetSpellInfo(19094)] = 19094, -- Black Dragonscale Shoulders - [GetSpellInfo(12621)] = 12621, -- Mithril Gyro-Shot - [GetSpellInfo(7153)] = 7153, -- Guardian Cloak - [GetSpellInfo(23125)] = 23125, -- Orcish Orphan Whistle - [GetSpellInfo(26426)] = 26426, -- Large Blue Rocket Cluster - [GetSpellInfo(24890)] = 24890, -- Create Signet of Beckoning: Air - [GetSpellInfo(2548)] = 2548, -- Succulent Pork Ribs - [GetSpellInfo(5161)] = 5161, -- Revive Dig Rat - [GetSpellInfo(2153)] = 2153, -- Handstitched Leather Pants - [GetSpellInfo(785)] = 785, -- True Fulfillment - [GetSpellInfo(8362)] = 8362, -- Renew - [GetSpellInfo(25292)] = 25292, -- Holy Light - [GetSpellInfo(26234)] = 26234, -- Submerge Visual - [GetSpellInfo(10396)] = 10396, -- Healing Wave - [GetSpellInfo(9065)] = 9065, -- Light Leather Bracers - [GetSpellInfo(8770)] = 8770, -- Robe of Power - [GetSpellInfo(12189)] = 12189, -- Summon Echeyakee - [GetSpellInfo(22813)] = 22813, -- Gordok Ogre Suit - [GetSpellInfo(3862)] = 3862, -- Icy Cloak - [GetSpellInfo(16978)] = 16978, -- Blazing Rapier - [GetSpellInfo(18405)] = 18405, -- Runecloth Bag - [GetSpellInfo(9269)] = 9269, -- Gnomish Universal Remote - [GetSpellInfo(6529)] = 6529, -- Opening Benedict's Chest - [GetSpellInfo(17618)] = 17618, -- Summon Risen Lackey - [GetSpellInfo(29334)] = 29334, -- Toasted Smorc - [GetSpellInfo(19815)] = 19815, -- Delicate Arcanite Converter - [GetSpellInfo(14125)] = 14125, -- Opening Secret Safe - [GetSpellInfo(8139)] = 8139, -- Fevered Fatigue - [GetSpellInfo(11605)] = 11605, -- Slam - [GetSpellInfo(16590)] = 16590, -- Summon Zombie - [GetSpellInfo(2386)] = 2386, -- Linen Boots - [GetSpellInfo(16967)] = 16967, -- Inlaid Thorium Hammer - [GetSpellInfo(24846)] = 24846, -- Spitfire Bracers - [GetSpellInfo(3950)] = 3950, -- Big Bronze Bomb - [GetSpellInfo(10346)] = 10346, -- Machine Gun - [GetSpellInfo(18422)] = 18422, -- Cloak of Fire - [GetSpellInfo(26011)] = 26011, -- Tranquil Mechanical Yeti - [GetSpellInfo(19091)] = 19091, -- Runic Leather Pants - [GetSpellInfo(16984)] = 16984, -- Volcanic Hammer - [GetSpellInfo(23650)] = 23650, -- Ebon Hand - [GetSpellInfo(7098)] = 7098, -- Curse of Mending - [GetSpellInfo(8681)] = 8681, -- Instant Poison - [GetSpellInfo(24122)] = 24122, -- Primal Batskin Gloves - [GetSpellInfo(3233)] = 3233, -- Evil Eye - [GetSpellInfo(25841)] = 25841, -- Prayer of Elune - [GetSpellInfo(17551)] = 17551, -- Stonescale Oil - [GetSpellInfo(18969)] = 18969, -- Taelan Death - [GetSpellInfo(21180)] = 21180, -- Summon Thunderstrike - [GetSpellInfo(3436)] = 3436, -- Wandering Plague - [GetSpellInfo(16869)] = 16869, -- Ice Tomb - [GetSpellInfo(12716)] = 12716, -- Goblin Mortar - [GetSpellInfo(28697)] = 28697, -- Forgiveness - [GetSpellInfo(26279)] = 26279, -- Stormshroud Gloves - [GetSpellInfo(14871)] = 14871, -- Shadow Bolt Misfire - [GetSpellInfo(22924)] = 22924, -- Grasping Vines - [GetSpellInfo(18974)] = 18974, -- Summon Lunaclaw - [GetSpellInfo(27720)] = 27720, -- Buttermilk Delight - [GetSpellInfo(7892)] = 7892, -- Stylish Blue Shirt - [GetSpellInfo(2737)] = 2737, -- Copper Mace - [GetSpellInfo(24314)] = 24314, -- Threatening Gaze - [GetSpellInfo(8912)] = 8912, -- Forge Verigan's Fist - [GetSpellInfo(17557)] = 17557, -- Elixir of Brute Force - [GetSpellInfo(22926)] = 22926, -- Chromatic Cloak - [GetSpellInfo(455)] = 455, -- Replenish Spirit - [GetSpellInfo(25659)] = 25659, -- Dirge's Kickin' Chimaerok Chops - [GetSpellInfo(24940)] = 24940, -- Black Whelp Tunic - [GetSpellInfo(11534)] = 11534, -- Leper Cure! - [GetSpellInfo(14887)] = 14887, -- Shadow Bolt Volley - [GetSpellInfo(3324)] = 3324, -- Runed Copper Pants - [GetSpellInfo(2671)] = 2671, -- Rough Bronze Bracers - [GetSpellInfo(5395)] = 5395, -- Death Capsule - [GetSpellInfo(18434)] = 18434, -- Cindercloth Pants - [GetSpellInfo(15647)] = 15647, -- Summon Common Kitten - [GetSpellInfo(25722)] = 25722, -- Rumsey Rum Dark - [GetSpellInfo(17952)] = 17952, -- Create Firestone (Greater) - [GetSpellInfo(445)] = 445, -- Teleport Darkshire - [GetSpellInfo(8760)] = 8760, -- Azure Silk Hood - [GetSpellInfo(9968)] = 9968, -- Heavy Mithril Boots - [GetSpellInfo(24123)] = 24123, -- Primal Batskin Bracers - [GetSpellInfo(6115)] = 6115, -- Far Sight (PT) - [GetSpellInfo(6894)] = 6894, -- Death Bed - [GetSpellInfo(7257)] = 7257, -- Fire Protection Potion - [GetSpellInfo(20770)] = 20770, -- Resurrection - [GetSpellInfo(3121)] = 3121, -- Kev - [GetSpellInfo(17465)] = 17465, -- Green Skeletal Warhorse - [GetSpellInfo(20854)] = 20854, -- Molten Helm - [GetSpellInfo(14380)] = 14380, -- Truesilver Rod - [GetSpellInfo(2162)] = 2162, -- Embossed Leather Cloak - [GetSpellInfo(12044)] = 12044, -- Simple Linen Pants - [GetSpellInfo(11410)] = 11410, -- Whirling Barrage - [GetSpellInfo(1090)] = 1090, -- Sleep - [GetSpellInfo(23151)] = 23151, -- Balance of Light and Shadow - [GetSpellInfo(2152)] = 2152, -- Light Armor Kit - [GetSpellInfo(27608)] = 27608, -- Flash Heal - [GetSpellInfo(6257)] = 6257, -- Torch Toss - [GetSpellInfo(8277)] = 8277, -- Voodoo Hex - [GetSpellInfo(20748)] = 20748, -- Rebirth - [GetSpellInfo(14379)] = 14379, -- Golden Rod - [GetSpellInfo(22761)] = 22761, -- Runn Tum Tuber Surprise - [GetSpellInfo(7630)] = 7630, -- Blue Linen Vest - [GetSpellInfo(24964)] = 24964, -- Honor Points +378 - [GetSpellInfo(23636)] = 23636, -- Dark Iron Helm - [GetSpellInfo(19943)] = 19943, -- Flash of Light - [GetSpellInfo(18702)] = 18702, -- Curse of the Darkmaster - [GetSpellInfo(15863)] = 15863, -- Carrion Surprise - [GetSpellInfo(16531)] = 16531, -- Summon Frail Skeleton - [GetSpellInfo(17231)] = 17231, -- Summon Illusory Wraith - [GetSpellInfo(16663)] = 16663, -- Imperial Plate Chest - [GetSpellInfo(3297)] = 3297, -- Mighty Iron Hammer - [GetSpellInfo(4506)] = 4506, -- CHU's QUEST SPELL - [GetSpellInfo(18424)] = 18424, -- Frostweave Pants - [GetSpellInfo(12667)] = 12667, -- Soul Consumption - [GetSpellInfo(27721)] = 27721, -- Very Berry Cream - [GetSpellInfo(7279)] = 7279, -- Black Sludge - [GetSpellInfo(17570)] = 17570, -- Greater Stoneshield Potion - [GetSpellInfo(4239)] = 4239, -- Activating Defenses - [GetSpellInfo(2387)] = 2387, -- Linen Cloak - [GetSpellInfo(21100)] = 21100, -- Conjure Elegant Letter - [GetSpellInfo(23067)] = 23067, -- Blue Firework - [GetSpellInfo(19072)] = 19072, -- Runic Leather Belt - [GetSpellInfo(5280)] = 5280, -- Razor Mane - [GetSpellInfo(18245)] = 18245, -- Lobster Stew - [GetSpellInfo(12591)] = 12591, -- Unstable Trigger - [GetSpellInfo(10459)] = 10459, -- Sacrifice Spinneret - [GetSpellInfo(25316)] = 25316, -- Prayer of Healing - [GetSpellInfo(9052)] = 9052, -- Fill Deino's Flask - [GetSpellInfo(5512)] = 5512, -- Fill Phial - [GetSpellInfo(4066)] = 4066, -- Small Bronze Bomb - [GetSpellInfo(16168)] = 16168, -- Flame Buffet - [GetSpellInfo(9636)] = 9636, -- Summon Swamp Spirit - [GetSpellInfo(6695)] = 6695, -- Black Silk Pack - [GetSpellInfo(19101)] = 19101, -- Volcanic Shoulders - [GetSpellInfo(21425)] = 21425, -- Ryson's Eye in the Sky - [GetSpellInfo(6414)] = 6414, -- Roasted Kodo Meat - [GetSpellInfo(27662)] = 27662, -- Throw Cupid's Dart - [GetSpellInfo(15933)] = 15933, -- Monster Omelet - [GetSpellInfo(19800)] = 19800, -- Thorium Shells - [GetSpellInfo(23662)] = 23662, -- Wisdom of the Timbermaw - [GetSpellInfo(23680)] = 23680, -- Portals Deck - [GetSpellInfo(19774)] = 19774, -- Summon Ragnaros - [GetSpellInfo(3969)] = 3969, -- Mechanical Dragonling - [GetSpellInfo(9921)] = 9921, -- Solid Weightstone - [GetSpellInfo(24093)] = 24093, -- Bloodvine Boots - [GetSpellInfo(9985)] = 9985, -- Bronze Warhammer - [GetSpellInfo(8211)] = 8211, -- Chain Burn - [GetSpellInfo(28220)] = 28220, -- Polar Gloves - [GetSpellInfo(7623)] = 7623, -- Brown Linen Robe - [GetSpellInfo(23243)] = 23243, -- Swift Orange Raptor - [GetSpellInfo(25150)] = 25150, -- Molten Rain - [GetSpellInfo(7149)] = 7149, -- Barbaric Leggings - [GetSpellInfo(2546)] = 2546, -- Dry Pork Ribs - [GetSpellInfo(3569)] = 3569, -- Smelt Steel - [GetSpellInfo(19814)] = 19814, -- Masterwork Target Dummy - [GetSpellInfo(8793)] = 8793, -- Crimson Silk Shoulders - [GetSpellInfo(10344)] = 10344, -- Armor +32 - [GetSpellInfo(12046)] = 12046, -- Simple Kilt - [GetSpellInfo(9074)] = 9074, -- Nimble Leather Gloves - [GetSpellInfo(12092)] = 12092, -- Dreamweave Circlet - [GetSpellInfo(23004)] = 23004, -- Summon Alarm-o-Bot - [GetSpellInfo(29116)] = 29116, -- Toast Smorc - [GetSpellInfo(9268)] = 9268, -- Teleport to Darnassus - Event - [GetSpellInfo(21161)] = 21161, -- Sulfuron Hammer - [GetSpellInfo(11397)] = 11397, -- Diseased Shot - [GetSpellInfo(3243)] = 3243, -- Life Harvest - [GetSpellInfo(18421)] = 18421, -- Wizardweave Leggings - [GetSpellInfo(4979)] = 4979, -- Quick Flame Ward - [GetSpellInfo(3954)] = 3954, -- Moonsight Rifle - [GetSpellInfo(3767)] = 3767, -- Hillman's Belt - [GetSpellInfo(25808)] = 25808, -- Dispel - [GetSpellInfo(20568)] = 20568, -- Ragnaros Emerge - [GetSpellInfo(18453)] = 18453, -- Felcloth Shoulders - [GetSpellInfo(14532)] = 14532, -- Creeper Venom - [GetSpellInfo(10149)] = 10149, -- Fireball - [GetSpellInfo(3493)] = 3493, -- Jade Serpentblade - [GetSpellInfo(12808)] = 12808, -- Getting Tide Pool Sample #4 - [GetSpellInfo(15296)] = 15296, -- Dark Iron Plate - [GetSpellInfo(12759)] = 12759, -- Gnomish Death Ray - [GetSpellInfo(23000)] = 23000, -- Ez-Thro Dynamite - [GetSpellInfo(18450)] = 18450, -- Wizardweave Turban - [GetSpellInfo(3204)] = 3204, -- Sapper Explode - [GetSpellInfo(9783)] = 9783, -- Mithril Spurs - [GetSpellInfo(9194)] = 9194, -- Heavy Leather Ammo Pouch - [GetSpellInfo(8089)] = 8089, -- Aquadynamic Fish Attractor - [GetSpellInfo(17680)] = 17680, -- Spirit Spawn-out - [GetSpellInfo(7994)] = 7994, -- Nullify Mana - [GetSpellInfo(3929)] = 3929, -- Coarse Blasting Powder - [GetSpellInfo(8352)] = 8352, -- Adjust Attitude - [GetSpellInfo(3953)] = 3953, -- Bronze Framework - [GetSpellInfo(7953)] = 7953, -- Deviate Scale Cloak - [GetSpellInfo(8001)] = 8001, -- Placing Pendant - [GetSpellInfo(23061)] = 23061, -- Fix Ritual Node - [GetSpellInfo(4097)] = 4097, -- Raptor Hide Belt - [GetSpellInfo(24897)] = 24897, -- Create Scepter of Beckoning: Earth - [GetSpellInfo(22661)] = 22661, -- Enervate - [GetSpellInfo(10702)] = 10702, -- Summon Island Frog - [GetSpellInfo(12421)] = 12421, -- Mithril Frag Bomb - [GetSpellInfo(16960)] = 16960, -- Thorium Greatsword - [GetSpellInfo(30081)] = 30081, -- Retching Plague - [GetSpellInfo(22313)] = 22313, -- Purple Hands - [GetSpellInfo(16660)] = 16660, -- Dawnbringer Shoulders - [GetSpellInfo(28473)] = 28473, -- Bramblewood Boots - [GetSpellInfo(3753)] = 3753, -- Handstitched Leather Belt - [GetSpellInfo(12607)] = 12607, -- Catseye Ultra Goggles - [GetSpellInfo(17556)] = 17556, -- Major Healing Potion - [GetSpellInfo(6310)] = 6310, -- Divining Scroll Spell - [GetSpellInfo(11730)] = 11730, -- Create Healthstone (Major) - [GetSpellInfo(3563)] = 3563, -- Teleport: Undercity - [GetSpellInfo(20897)] = 20897, -- Dark Iron Destroyer - [GetSpellInfo(18455)] = 18455, -- Bottomless Bag - [GetSpellInfo(15865)] = 15865, -- Mystery Stew - [GetSpellInfo(11513)] = 11513, -- Empty Phial - [GetSpellInfo(3915)] = 3915, -- Brown Linen Shirt - [GetSpellInfo(2602)] = 2602, -- Fire Shield IV - [GetSpellInfo(28463)] = 28463, -- Ironvine Belt - [GetSpellInfo(3961)] = 3961, -- Gyrochronatom - [GetSpellInfo(3296)] = 3296, -- Heavy Bronze Mace - [GetSpellInfo(6535)] = 6535, -- Lightning Cloud - [GetSpellInfo(18241)] = 18241, -- Filet of Redgill - [GetSpellInfo(12049)] = 12049, -- Black Mageweave Leggings - [GetSpellInfo(12594)] = 12594, -- Fire Goggles - [GetSpellInfo(12073)] = 12073, -- Black Mageweave Boots - [GetSpellInfo(461)] = 461, -- Righteous Flame On - [GetSpellInfo(15649)] = 15649, -- Collect Corrupted Water - [GetSpellInfo(1179)] = 1179, -- Beast Claws - [GetSpellInfo(1453)] = 1453, -- Arcane Spirit V - [GetSpellInfo(10326)] = 10326, -- Turn Undead - [GetSpellInfo(21953)] = 21953, -- The Feast of Winter Veil - [GetSpellInfo(3947)] = 3947, -- Crafted Solid Shot - [GetSpellInfo(3817)] = 3817, -- Cured Medium Hide - [GetSpellInfo(8901)] = 8901, -- Gas Bomb - [GetSpellInfo(3497)] = 3497, -- Frost Tiger Blade - [GetSpellInfo(16069)] = 16069, -- Nefarius Attack 001 - [GetSpellInfo(15628)] = 15628, -- Pet Bombling - [GetSpellInfo(24960)] = 24960, -- Honor Points +50 - [GetSpellInfo(8483)] = 8483, -- White Swashbuckler's Shirt - [GetSpellInfo(16995)] = 16995, -- Heartseeker - [GetSpellInfo(6354)] = 6354, -- Venom's Bane - [GetSpellInfo(27794)] = 27794, -- Cleave - [GetSpellInfo(2389)] = 2389, -- Red Linen Robe - [GetSpellInfo(9935)] = 9935, -- Steel Plate Helm - [GetSpellInfo(26085)] = 26085, -- Soul Pouch - [GetSpellInfo(16662)] = 16662, -- Thorium Leggings - [GetSpellInfo(12086)] = 12086, -- Shadoweave Mask - [GetSpellInfo(6626)] = 6626, -- Set NG-5 Charge (Blue) - [GetSpellInfo(28474)] = 28474, -- Bramblewood Belt - [GetSpellInfo(17924)] = 17924, -- Soul Fire - [GetSpellInfo(23489)] = 23489, -- Ultrasafe Transporter - Gadgetzan - [GetSpellInfo(9795)] = 9795, -- Talvash's Necklace Repair - [GetSpellInfo(11017)] = 11017, -- Summon Witherbark Felhunter - [GetSpellInfo(9145)] = 9145, -- Fletcher's Gloves - [GetSpellInfo(28352)] = 28352, -- Breath of Sargeras - [GetSpellInfo(6199)] = 6199, -- Nostalgia - [GetSpellInfo(19068)] = 19068, -- Warbear Harness - [GetSpellInfo(7218)] = 7218, -- Weapon Counterweight - [GetSpellInfo(5026)] = 5026, -- Create Water of the Seers - [GetSpellInfo(7489)] = 7489, -- Call Lupine Horror - [GetSpellInfo(15207)] = 15207, -- Lightning Bolt - [GetSpellInfo(10531)] = 10531, -- Big Voodoo Mask - [GetSpellInfo(15276)] = 15276, -- Opening Bar Door - [GetSpellInfo(16659)] = 16659, -- Radiant Circlet - [GetSpellInfo(3176)] = 3176, -- Strong Troll's Blood Potion - [GetSpellInfo(9612)] = 9612, -- Ink Spray - [GetSpellInfo(24961)] = 24961, -- Honor Points +82 - [GetSpellInfo(9220)] = 9220, -- "Plucky" Resumes Chicken Form - [GetSpellInfo(7762)] = 7762, -- Summon Gunther's Visage - [GetSpellInfo(3131)] = 3131, -- Frost Breath - [GetSpellInfo(25311)] = 25311, -- Corruption - [GetSpellInfo(26137)] = 26137, -- Rotate Trigger - [GetSpellInfo(24898)] = 24898, -- Create Scepter of Beckoning: Water - [GetSpellInfo(19098)] = 19098, -- Wicked Leather Armor - [GetSpellInfo(698)] = 698, -- Ritual of Summoning - [GetSpellInfo(7633)] = 7633, -- Blue Linen Robe - [GetSpellInfo(16731)] = 16731, -- Runic Breastplate - [GetSpellInfo(11021)] = 11021, -- Flamespit - [GetSpellInfo(10718)] = 10718, -- Summon Green Water Snake - [GetSpellInfo(6899)] = 6899, -- Brown Ram - [GetSpellInfo(12899)] = 12899, -- Gnomish Shrink Ray - [GetSpellInfo(10701)] = 10701, -- Summon Dart Frog - [GetSpellInfo(11449)] = 11449, -- Elixir of Agility - [GetSpellInfo(20648)] = 20648, -- Medium Leather - [GetSpellInfo(3552)] = 3552, -- Conjure Mana Jade - [GetSpellInfo(15118)] = 15118, -- Place Threshadon Carcass - [GetSpellInfo(19076)] = 19076, -- Volcanic Breastplate - [GetSpellInfo(23248)] = 23248, -- Great Gray Kodo - [GetSpellInfo(21358)] = 21358, -- Aqual Quintessence - Dowse Molten Core Rune - [GetSpellInfo(12717)] = 12717, -- Goblin Mining Helmet - [GetSpellInfo(1540)] = 1540, -- Volley - [GetSpellInfo(28354)] = 28354, -- Exorcise Atiesh - [GetSpellInfo(2832)] = 2832, -- Armor +16 - [GetSpellInfo(3932)] = 3932, -- Target Dummy - [GetSpellInfo(24357)] = 24357, -- Bloodvine Lens - [GetSpellInfo(2674)] = 2674, -- Heavy Sharpening Stone - [GetSpellInfo(9172)] = 9172, -- Lift Seal - [GetSpellInfo(3450)] = 3450, -- Elixir of Fortitude - [GetSpellInfo(21371)] = 21371, -- Planting Mulverick's Beacon - [GetSpellInfo(3566)] = 3566, -- Teleport: Thunder Bluff - [GetSpellInfo(3937)] = 3937, -- Large Copper Bomb - [GetSpellInfo(23190)] = 23190, -- Heavy Leather Ball - [GetSpellInfo(23428)] = 23428, -- Summon Albino Snapjaw - [GetSpellInfo(10566)] = 10566, -- Wild Leather Boots - [GetSpellInfo(5514)] = 5514, -- Darken Vision - [GetSpellInfo(2169)] = 2169, -- Dark Leather Tunic - [GetSpellInfo(18444)] = 18444, -- Runecloth Headband - [GetSpellInfo(16646)] = 16646, -- Imperial Plate Shoulders - [GetSpellInfo(29059)] = 29059, -- Skeletal Steed - [GetSpellInfo(17632)] = 17632, -- Alchemist's Stone - [GetSpellInfo(18412)] = 18412, -- Cindercloth Gloves - [GetSpellInfo(18441)] = 18441, -- Ghostweave Pants - [GetSpellInfo(8552)] = 8552, -- Curse of Weakness - [GetSpellInfo(18239)] = 18239, -- Cooked Glossy Mightfish - [GetSpellInfo(18438)] = 18438, -- Runecloth Pants - [GetSpellInfo(6755)] = 6755, -- Tell Joke - [GetSpellInfo(3773)] = 3773, -- Guardian Armor - [GetSpellInfo(3965)] = 3965, -- Advanced Target Dummy - [GetSpellInfo(12064)] = 12064, -- Orange Martial Shirt - [GetSpellInfo(9980)] = 9980, -- Ornate Mithril Helm - [GetSpellInfo(18247)] = 18247, -- Baked Salmon - [GetSpellInfo(15935)] = 15935, -- Crispy Bat Wing - [GetSpellInfo(28740)] = 28740, -- Summon Whiskers - [GetSpellInfo(3650)] = 3650, -- Sling Mud - [GetSpellInfo(1096)] = 1096, -- Firebolt IV - [GetSpellInfo(3762)] = 3762, -- Hillman's Leather Vest - [GetSpellInfo(6270)] = 6270, -- Serpentine Cleansing - [GetSpellInfo(26181)] = 26181, -- Strike - [GetSpellInfo(15633)] = 15633, -- Lil' Smoky - [GetSpellInfo(11450)] = 11450, -- Elixir of Greater Defense - [GetSpellInfo(22790)] = 22790, -- Kreeg's Stout Beatdown - [GetSpellInfo(7395)] = 7395, -- Deadmines Dynamite - [GetSpellInfo(11461)] = 11461, -- Arcane Elixir - [GetSpellInfo(28223)] = 28223, -- Icy Scale Gauntlets - [GetSpellInfo(23238)] = 23238, -- Swift Brown Ram - [GetSpellInfo(3938)] = 3938, -- Bronze Tube - [GetSpellInfo(12069)] = 12069, -- Cindercloth Robe - [GetSpellInfo(23187)] = 23187, -- Frost Burn - [GetSpellInfo(19064)] = 19064, -- Heavy Scorpid Gauntlets - [GetSpellInfo(28163)] = 28163, -- Ice Guard - [GetSpellInfo(4132)] = 4132, -- Banish Thundering Exile - [GetSpellInfo(9207)] = 9207, -- Dusky Boots - [GetSpellInfo(25158)] = 25158, -- Time Stop - [GetSpellInfo(7954)] = 7954, -- Deviate Scale Gloves - [GetSpellInfo(11457)] = 11457, -- Superior Healing Potion - [GetSpellInfo(26054)] = 26054, -- Summon Red Qiraji Battle Tank - [GetSpellInfo(9079)] = 9079, -- Create Rift - [GetSpellInfo(10869)] = 10869, -- Summon Embers - [GetSpellInfo(14891)] = 14891, -- Smelt Dark Iron - [GetSpellInfo(26134)] = 26134, -- Eye Beam - [GetSpellInfo(2368)] = 2368, -- Herb Gathering - [GetSpellInfo(19080)] = 19080, -- Warbear Woolies - [GetSpellInfo(16)] = 16, -- Fear (NYI) - [GetSpellInfo(11420)] = 11420, -- Portal: Thunder Bluff - [GetSpellInfo(19720)] = 19720, -- Combine Pendants - [GetSpellInfo(9926)] = 9926, -- Heavy Mithril Shoulder - [GetSpellInfo(12512)] = 12512, -- Kalaran Conjures Torch - [GetSpellInfo(25953)] = 25953, -- Summon Blue Qiraji Battle Tank - [GetSpellInfo(28806)] = 28806, -- Toss Fuel on Bonfire - [GetSpellInfo(24903)] = 24903, -- Runed Stygian Boots - [GetSpellInfo(8394)] = 8394, -- Striped Frostsaber - [GetSpellInfo(21884)] = 21884, -- Collect Orange Crystal Liquid - [GetSpellInfo(16649)] = 16649, -- Imperial Plate Bracers - [GetSpellInfo(18115)] = 18115, -- Viewing Room Student Transform - Effect - [GetSpellInfo(1538)] = 1538, -- Charging - [GetSpellInfo(21960)] = 21960, -- Manifest Spirit - [GetSpellInfo(2665)] = 2665, -- Coarse Sharpening Stone - [GetSpellInfo(3133)] = 3133, -- Beast Claws III - [GetSpellInfo(15066)] = 15066, -- Create PX83-Enigmatron - [GetSpellInfo(5252)] = 5252, -- Voidwalker Guardian - [GetSpellInfo(3958)] = 3958, -- Iron Strut - [GetSpellInfo(4977)] = 4977, -- Cleanse Thunderhorn Well - [GetSpellInfo(10673)] = 10673, -- Summon Bombay - [GetSpellInfo(10720)] = 10720, -- Summon Scarlet Snake - [GetSpellInfo(22967)] = 22967, -- Smelt Elementium - [GetSpellInfo(23432)] = 23432, -- Summon Hawksbill Snapjaw - [GetSpellInfo(15973)] = 15973, -- Searing Golden Blade - [GetSpellInfo(8604)] = 8604, -- Herb Baked Egg - [GetSpellInfo(19069)] = 19069, -- Plant Magic Beans - [GetSpellInfo(9489)] = 9489, -- Create Scrying Bowl - [GetSpellInfo(23096)] = 23096, -- Alarm-O-Bot - [GetSpellInfo(12554)] = 12554, -- Summon Treasure Horde - [GetSpellInfo(9457)] = 9457, -- Tharnariun's Heal - [GetSpellInfo(5268)] = 5268, -- Dark Iron Dwarf Disguise - [GetSpellInfo(6196)] = 6196, -- Far Sight - [GetSpellInfo(16970)] = 16970, -- Dawn's Edge - [GetSpellInfo(17481)] = 17481, -- Deathcharger - [GetSpellInfo(6654)] = 6654, -- Brown Wolf - [GetSpellInfo(15910)] = 15910, -- Heavy Kodo Stew - [GetSpellInfo(23240)] = 23240, -- Swift White Ram - [GetSpellInfo(15495)] = 15495, -- Explosive Shot - [GetSpellInfo(15699)] = 15699, -- Filling Empty Jar - [GetSpellInfo(13702)] = 13702, -- Runed Truesilver Rod - [GetSpellInfo(24892)] = 24892, -- Create Signet of Beckoning: Water - [GetSpellInfo(23811)] = 23811, -- Summon Jubling - [GetSpellInfo(11476)] = 11476, -- Elixir of Shadow Power - [GetSpellInfo(24137)] = 24137, -- Bloodsoul Shoulders - [GetSpellInfo(2402)] = 2402, -- Woolen Cape - } + } ns.channelled = { - -- MISC - [GetSpellInfo(746)] = { 7, 746 }, -- First Aid - [GetSpellInfo(13278)] = { 4, 13278 }, -- Gnomish Death Ray - [GetSpellInfo(20577)] = { 10, 20577 }, -- Cannibalize - [GetSpellInfo(10797)] = { 6, 10797 }, -- Starshards - - -- DRUID - [GetSpellInfo(17401)] = { 9.5, 17401 }, -- Hurricane - [GetSpellInfo(740)] = { 9.5, 740 }, -- Tranquility - - -- HUNTER - [GetSpellInfo(6197)] = { 60, 6197 }, -- Eagle Eye - [GetSpellInfo(1002)] = { 60, 1002 }, -- Eyes of the Beast - [GetSpellInfo(1510)] = { 6, 1510 }, -- Volley - [GetSpellInfo(136)] = { 10, 136 }, -- Mend Pet - - -- MAGE - [GetSpellInfo(7268)] = { 2.25, 7268, }, -- Arcane Missile - [GetSpellInfo(5143)] = { 4.5, 5143, }, -- Arcane Missiles - [GetSpellInfo(10)] = { 7.5, 10 }, -- Blizzard - [GetSpellInfo(12051)] = { 8, 12051 }, -- Evocation - - -- PRIEST - [GetSpellInfo(15407)] = { 3, 15407 }, -- Mind Flay - [GetSpellInfo(2096)] = { 60, 2096 }, -- Mind Vision - [GetSpellInfo(605)] = { 3, 605 }, -- Mind Control - - -- WARLOCK - [GetSpellInfo(126)] = { 45, 126 }, -- Eye of Kilrogg - [GetSpellInfo(689)] = { 4.5, 689 }, -- Drain Life - [GetSpellInfo(5138)] = { 4.5, 5138 }, -- Drain Mana - [GetSpellInfo(1120)] = { 14.5, 1120 }, -- Drain Soul - [GetSpellInfo(5740)] = { 7.5, 5740 }, -- Rain of Fire - [GetSpellInfo(1949)] = { 15, 1949 }, -- Hellfire - [GetSpellInfo(755)] = { 10, 755 }, -- Health Funnel } ns.decrease = { - -- WARLOCK - [1714] = 50, -- Curse of Tongues Rank 1 - [11719] = 60, -- Curse of Tongues Rank 2 - -- ROGUE - [5760] = 40, -- Mind-Numbing Poison Rank 1 - [8692] = 50, -- Mind-Numbing Poison Rank 2 - [25810] = 50, -- Mind-Numbing Poison Rank 2 incorrect? - [11398] = 60, -- Mind-Numbing Poison Rank 3 - -- ITEMS - [17331] = 10, -- Fang of the Crystal Spider } ns.delay = { - -- WARLOCK - [GetSpellInfo(1714)] = 60, -- Curse of Tongues - [GetSpellInfo(1098)] = 30, -- Enslave Demon - - -- ROGUE - [GetSpellInfo(5760)] = 60, -- Mind-Numbing Poison - - -- ITEMS - [GetSpellInfo(17331)] = 10, -- Fang of the Crystal Spider - - -- NPCS - [GetSpellInfo(7127)] = 20, -- Wavering Will - [GetSpellInfo(7102)] = 25, -- Contagion of Rot - [GetSpellInfo(3603)] = 35, -- Distracting Pain - [GetSpellInfo(8140)] = 50, -- Befuddlement - [GetSpellInfo(8272)] = 20, -- Mind Tremor - [GetSpellInfo(12255)] = 15, -- Curse of Tuten'kash - [GetSpellInfo(10651)] = 20, -- Curse of the Eye - [GetSpellInfo(14538)] = 35, -- Aural Shock - [GetSpellInfo(22247)] = 80, -- Suppression Aura - [GetSpellInfo(22642)] = 50, -- Brood Power: Bronze - [GetSpellInfo(23153)] = 50, -- Brood Power: Blue - [GetSpellInfo(24415)] = 50, -- Slow - [GetSpellInfo(19365)] = 50, -- Ancient Dread - [GetSpellInfo(28732)] = 25, -- Widow's Embrace - [GetSpellInfo(22909)] = 50, -- Eye of Immol'thar } ns.CC = { - [GetSpellInfo(5211)] = 1, -- Bash - [GetSpellInfo(24394)] = 1, -- Intimidation - [GetSpellInfo(853)] = 1, -- Hammer of Justice - [GetSpellInfo(22703)] = 1, -- Inferno Effect (Summon Infernal) - [GetSpellInfo(408)] = 1, -- Kidney Shot - [GetSpellInfo(12809)] = 1, -- Concussion Blow - [GetSpellInfo(20253)] = 1, -- Intercept Stun - [GetSpellInfo(20549)] = 1, -- War Stomp - [GetSpellInfo(2637)] = 1, -- Hibernate - [GetSpellInfo(3355)] = 1, -- Freezing Trap - [GetSpellInfo(19386)] = 1, -- Wyvern Sting - [GetSpellInfo(118)] = 1, -- Polymorph - [GetSpellInfo(28271)] = 1, -- Polymorph: Turtle - [GetSpellInfo(28272)] = 1, -- Polymorph: Pig - [GetSpellInfo(20066)] = 1, -- Repentance - [GetSpellInfo(1776)] = 1, -- Gouge - [GetSpellInfo(6770)] = 1, -- Sap - [GetSpellInfo(1513)] = 1, -- Scare Beast - [GetSpellInfo(8122)] = 1, -- Psychic Scream - [GetSpellInfo(2094)] = 1, -- Blind - [GetSpellInfo(5782)] = 1, -- Fear - [GetSpellInfo(5484)] = 1, -- Howl of Terror - [GetSpellInfo(6358)] = 1, -- Seduction - [GetSpellInfo(5246)] = 1, -- Intimidating Shout - [GetSpellInfo(6789)] = 1, -- Death Coil - [GetSpellInfo(9005)] = 1, -- Pounce - [GetSpellInfo(1833)] = 1, -- Cheap Shot - [GetSpellInfo(16922)] = 1, -- Improved Starfire - [GetSpellInfo(19410)] = 1, -- Improved Concussive Shot - [GetSpellInfo(12355)] = 1, -- Impact - [GetSpellInfo(20170)] = 1, -- Seal of Justice Stun - [GetSpellInfo(15269)] = 1, -- Blackout - [GetSpellInfo(18093)] = 1, -- Pyroclasm - [GetSpellInfo(12798)] = 1, -- Revenge Stun - [GetSpellInfo(5530)] = 1, -- Mace Stun - [GetSpellInfo(19503)] = 1, -- Scatter Shot - [GetSpellInfo(605)] = 1, -- Mind Control - [GetSpellInfo(7922)] = 1, -- Charge Stun - [GetSpellInfo(18469)] = 1, -- Counterspell - Silenced - [GetSpellInfo(15487)] = 1, -- Silence - [GetSpellInfo(18425)] = 1, -- Kick - Silenced - [GetSpellInfo(24259)] = 1, -- Spell Lock - [GetSpellInfo(18498)] = 1, -- Shield Bash - Silenced - - -- ITEMS - [GetSpellInfo(13327)] = 1, -- Reckless Charge - [GetSpellInfo(1090)] = 1, -- Sleep - [GetSpellInfo(5134)] = 1, -- Flash Bomb Fear - [GetSpellInfo(19821)] = 1, -- Arcane Bomb Silence - [GetSpellInfo(4068)] = 1, -- Iron Grenade - [GetSpellInfo(19769)] = 1, -- Thorium Grenade - [GetSpellInfo(13808)] = 1, -- M73 Frag Grenade - [GetSpellInfo(4069)] = 1, -- Big Iron Bomb - [GetSpellInfo(12543)] = 1, -- Hi-Explosive Bomb - [GetSpellInfo(4064)] = 1, -- Rough Copper Bomb - [GetSpellInfo(12421)] = 1, -- Mithril Frag Bomb - [GetSpellInfo(19784)] = 1, -- Dark Iron Bomb - [GetSpellInfo(4067)] = 1, -- Big Bronze Bomb - [GetSpellInfo(4066)] = 1, -- Small Bronze Bomb - [GetSpellInfo(4065)] = 1, -- Large Copper Bomb - [GetSpellInfo(13237)] = 1, -- Goblin Mortar - [GetSpellInfo(835)] = 1, -- Tidal Charm - [GetSpellInfo(13181)] = 1, -- Gnomish Mind Control Cap - [GetSpellInfo(12562)] = 1, -- The Big One - [GetSpellInfo(15283)] = 1, -- Stunning Blow (Weapon Proc) - [GetSpellInfo(56)] = 1, -- Stun (Weapon Proc) - [GetSpellInfo(26108)] = 1, -- Glimpse of Madness } ns.talentdecrease = { - [GetSpellInfo(403)] = 1, -- Lightning Bolt - [GetSpellInfo(421)] = 1, -- Chain Lightning - [GetSpellInfo(6353)] = 2, -- Soul Fire - [GetSpellInfo(116)] = .5, -- Frostbolt - [GetSpellInfo(133)] = .5, -- Fireball - [GetSpellInfo(686)] = .5, -- Shadow Bolt - [GetSpellInfo(348)] = .5, -- Immolate - [GetSpellInfo(331)] = .5, -- Healing Wave - [GetSpellInfo(585)] = .5, -- Smite - [GetSpellInfo(14914)] = .5, -- Holy Fire - [GetSpellInfo(2054)] = .5, -- Heal - [GetSpellInfo(25314)] = .5, -- Greater Heal - [GetSpellInfo(8129)] = .5, -- Mana Burn - [GetSpellInfo(5176)] = .5, -- Wrath - [GetSpellInfo(2912)] = .5, -- Starfire - [GetSpellInfo(5185)] = .5, -- Healing Touch - [GetSpellInfo(2645)] = 2, -- Ghost Wolf - [GetSpellInfo(691)] = 4, -- Summon Felhunter - [GetSpellInfo(688)] = 4, -- Summon Imp - [GetSpellInfo(697)] = 4, -- Summon Voidwalker - [GetSpellInfo(712)] = 4, -- Summon Succubus } ns.auras = { - -- misc - ['Flee'] = 10, - ['Reckless Charge'] = 12, - ['Sleep'] = 12, - ['Tidal Charm'] = 3, - -- blackwing lair - ['Burning Adrenaline'] = 20, - -- molten core - ['Living Bomb'] = 8, - -- engineering - ['Iron Grenade'] = 3, - ['Net-o-Matic'] = 10, - ['Thorium Grenade'] = 3, - -- druid - ['Hibernate'] = 40, - -- hunter - ['Freezing Trap'] = 20, - ['Scare Beast'] = 20, - -- mage - ['Polymorph'] = 50, - ['Polymorph: Pig'] = 50, - ['Polymorph: Turtle'] = 50, - ['Frostbolt'] = 7, - ['Frost Nova'] = 8, - ['Frostbite'] = 5, - -- paladin - ['Hammer of Justice'] = 6, - ['Repentance'] = 6, - -- priest - ['Mind Control'] = 3, - ['Mind Vision'] = 60, - ['Psychic Scream'] = 8, - -- rogue - ['Blind'] = 10, - ['Cheap Shot'] = 5, - ['Gouge'] = 4, - ['Kidney Shot'] = 6, - ['Sap'] = 11, - -- warlock - ['Curse of Exhaustion'] = 12, - ['Curse of Tongues'] = 30, - ['Death Coil'] = 3, - ['Drain Mana'] = 5, - ['Fear'] = 20, - ['Howl of Terror'] = 15, - -- warrior - ['Charge Stun'] = 1, - ['Intercept Stun'] = 3, - } + } -- diff --git a/libraries/LibClassicCasterino/LibClassicCasterino.lua b/libraries/LibClassicCasterino/LibClassicCasterino.lua deleted file mode 100644 index c8f7775..0000000 --- a/libraries/LibClassicCasterino/LibClassicCasterino.lua +++ /dev/null @@ -1,3531 +0,0 @@ ---[================[ -LibClassicCasterino -Author: d87 ---]================] -if WOW_PROJECT_ID ~= WOW_PROJECT_CLASSIC then return end - -local MAJOR, MINOR = "LibClassicCasterino", 33 -local lib = LibStub:NewLibrary(MAJOR, MINOR) -if not lib then return end - - -lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) - -lib.frame = lib.frame or CreateFrame("Frame") - -local f = lib.frame -local callbacks = lib.callbacks - -lib.casters = lib.casters or {} -- setmetatable({}, { __mode = "v" }) -local casters = lib.casters - -lib.movecheckGUIDs = lib.movecheckGUIDs or {} -local movecheckGUIDs = lib.movecheckGUIDs -local MOVECHECK_TIMEOUT = 4 - -local UnitGUID = UnitGUID -local bit_band = bit.band - -local GetSpellInfo = GetSpellInfo -local GetTime = GetTime -local CastingInfo = CastingInfo -local ChannelInfo = ChannelInfo -local GetUnitSpeed = GetUnitSpeed -local UnitIsUnit = UnitIsUnit - -local COMBATLOG_OBJECT_REACTION_FRIENDLY = COMBATLOG_OBJECT_REACTION_FRIENDLY -local COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET = COMBATLOG_OBJECT_TYPE_PLAYER + COMBATLOG_OBJECT_TYPE_PET -local classCasts -local classChannelsByAura -local classChannelsByCast -local talentDecreased -local crowdControlAuras -local FireToUnits - -f:SetScript("OnEvent", function(self, event, ...) - return self[event](self, event, ...) -end) - - -local spellNameToID = {} -local NPCspellNameToID = {} -local NPCSpells - -local castTimeCache = {} -local castTimeCacheStartTimes = setmetatable({}, { __mode = "v" }) - -local AIMED_SHOT = GetSpellInfo(19434) -local MULTI_SHOT = GetSpellInfo(25294) -local AimedDelay = 1 -local castingAimedShot = false -local playerGUID = UnitGUID("player") - ---[[ -function DUMPCASTS() - local castedSpells = {} - local counter = 0 - for id=1,40000 do - local name, _, texture, castTime = GetSpellInfo(id) - 136235 -- interface/icons/temp.blp -- Samwise Didier Icon aka missing icon - if name and castTime > 500 and texture ~= 136235 then - castedSpells[id] = true - counter = counter + 1 - end - end - print(counter) - NugHealthDB.LCDDUMP = castedSpells -end -]] - -local refreshCastTable = function(tbl, ...) - local numArgs = select("#", ...) - for i=1, numArgs do - tbl[i] = select(i, ...) - end -end - -local makeCastUID = function(guid, spellName) - local _, _, _, _, _, npcID = strsplit("-", guid); - npcID = npcID or "Unknown" - return npcID..spellName -end - -local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime, isSrcEnemyPlayer ) - -- This cast time can't be used reliably because it's changing depending on player's own haste - local _, _, icon, castTime = GetSpellInfo(spellID) - if castType == "CAST" then - local knownCastDuration = classCasts[spellID] - if knownCastDuration then - castTime = knownCastDuration*1000 - end - end - if castType == "CHANNEL" then - local channelDuration = classChannelsByAura[spellID] or classChannelsByCast[spellID] - castTime = channelDuration*1000 - end - local decreased = talentDecreased[spellID] - if decreased then - castTime = castTime - decreased*1000 - end - if overrideCastTime then - castTime = overrideCastTime - end - local now = GetTime()*1000 - local startTime = now - local endTime = now + castTime - local currentCast = casters[srcGUID] - - if currentCast then - refreshCastTable(currentCast, castType, spellName, icon, startTime, endTime, spellID ) - else - casters[srcGUID] = { castType, spellName, icon, startTime, endTime, spellID } - end - - if isSrcEnemyPlayer then - if not (spellID == 4068 or spellID == 19769) then -- Iron Grenade, Thorium Grenade - movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT - end - end - - if castType == "CAST" then - if srcGUID == playerGUID and (spellName == AIMED_SHOT or spellName == MULTI_SHOT) then - castingAimedShot = true - AimedDelay = 1 - movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT - if spellName == MULTI_SHOT then - casters[srcGUID][5] = startTime + 500 - end - callbacks:Fire("UNIT_SPELLCAST_START", "player") - end - FireToUnits("UNIT_SPELLCAST_START", srcGUID) - else - FireToUnits("UNIT_SPELLCAST_CHANNEL_START", srcGUID) - end -end - -local function CastStop(srcGUID, castType, suffix ) - local currentCast = casters[srcGUID] - if currentCast then - castType = castType or currentCast[1] - - casters[srcGUID] = nil - movecheckGUIDs[srcGUID] = nil - - if castType == "CAST" then - local event = "UNIT_SPELLCAST_"..suffix - if srcGUID == playerGUID and castingAimedShot then - castingAimedShot = false - callbacks:Fire(event, "player") - end - FireToUnits(event, srcGUID) - else - FireToUnits("UNIT_SPELLCAST_CHANNEL_STOP", srcGUID) - end - end -end - -function f:COMBAT_LOG_EVENT_UNFILTERED(event) - - local timestamp, eventType, hideCaster, - srcGUID, srcName, srcFlags, srcFlags2, - dstGUID, dstName, dstFlags, dstFlags2, - spellID, spellName, arg3, arg4, arg5, - arg6, resisted, blocked, absorbed = CombatLogGetCurrentEventInfo() - - local isSrcPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET) > 0 - if isSrcPlayer and spellID == 0 then - spellID = spellNameToID[spellName] - end - if eventType == "SPELL_CAST_START" then - if isSrcPlayer then - local isCasting = classCasts[spellID] - if isCasting then - local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 - CastStart(srcGUID, "CAST", spellName, spellID, nil, not isSrcFriendlyPlayer) - end - else - local castUID = makeCastUID(srcGUID, spellName) - local cachedTime = castTimeCache[castUID] - local spellID = NPCspellNameToID[spellName] -- just for the icon - if not spellID then - spellID = 4036 -- Engineering Icon - end - if cachedTime then - CastStart(srcGUID, "CAST", spellName, spellID, cachedTime*1000) - else - castTimeCacheStartTimes[srcGUID..castUID] = GetTime() - CastStart(srcGUID, "CAST", spellName, spellID, 1500) -- using default 1.5s cast time for now - end - end - elseif eventType == "SPELL_CAST_FAILED" then - - CastStop(srcGUID, "CAST", "INTERRUPTED") - - elseif eventType == "SPELL_CAST_SUCCESS" then - if isSrcPlayer then - if classChannelsByAura[spellID] then - -- SPELL_CAST_SUCCESS can come right after AURA_APPLIED, so ignoring it - return - elseif classChannelsByCast[spellID] then - -- Channels fire SPELL_CAST_SUCCESS at their start - local isChanneling = classChannelsByCast[spellID] - if isChanneling then - local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 - CastStart(srcGUID, "CHANNEL", spellName, spellID, nil, not isSrcFriendlyPlayer) - end - return - end - end - if not isSrcPlayer then - local castUID = makeCastUID(srcGUID, spellName) - local cachedTime = castTimeCache[castUID] - if not cachedTime then - local restoredStartTime = castTimeCacheStartTimes[srcGUID..castUID] - if restoredStartTime then - local now = GetTime() - local castTime = now - restoredStartTime - if castTime < 10 then - castTimeCache[castUID] = castTime - end - end - end - end - CastStop(srcGUID, nil, "STOP") - - elseif eventType == "SPELL_INTERRUPT" then - - CastStop(dstGUID, nil, "INTERRUPTED") - elseif eventType == "UNIT_DIED" then - CastStop(dstGUID, nil, "INTERRUPTED") - - elseif eventType == "SPELL_AURA_APPLIED" or - eventType == "SPELL_AURA_REFRESH" or - eventType == "SPELL_AURA_APPLIED_DOSE" - then - if isSrcPlayer then - if crowdControlAuras[spellName] then - CastStop(dstGUID, nil, "INTERRUPTED") - return - end - - local isChanneling = classChannelsByAura[spellID] - if isChanneling then - local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0 - CastStart(srcGUID, "CHANNEL", spellName, spellID, nil, not isSrcFriendlyPlayer) - end - end - elseif eventType == "SPELL_AURA_REMOVED" then - if isSrcPlayer then - local isChanneling = classChannelsByAura[spellID] - if isChanneling then - CastStop(srcGUID, "CHANNEL", "STOP") - end - end - elseif castingAimedShot and dstGUID == UnitGUID("player") then - if eventType == "SWING_DAMAGE" or - eventType == "ENVIRONMENTAL_DAMAGE" or - eventType == "RANGE_DAMAGE" or - eventType == "SPELL_DAMAGE" - then - if resisted or blocked or absorbed then return end - local currentCast = casters[UnitGUID("player")] - if currentCast then - refreshCastTable(currentCast, currentCast[1], currentCast[2], currentCast[3], currentCast[4], currentCast[5] + (AimedDelay *1000)) - if AimedDelay > 0.2 then - AimedDelay = AimedDelay - 0.2 - end - callbacks:Fire("UNIT_SPELLCAST_DELAYED", "player") - end - end - end - -end - -local castTimeIncreases = { - [1714] = 1.5, -- Curse of Tongues (Rank 1) (50%) - [11719] = 1.6, -- Curse of Tongues (Rank 2) (60%) - [5760] = 1.4, -- Mind-Numbing Poison (Rank 1) (40%) - [8692] = 1.5, -- Mind-Numbing Poison (Rank 2) (50%) - [11398] = 1.6, -- Mind-Numbing Poison (Rank 3) (60%) - [1098] = 1.3, -- Enslave Demon (Rank 1) (30%) - [11725] = 1.3, -- Enslave Demon (Rank 2) (30%) - [11726] = 1.3, -- Enslave Demon (Rank 3) (30%) -} -local attackTimeDecreases = { - [6150] = 1.3, -- Quick Shots/ Imp Aspect of the Hawk (Aimed) - [3045] = 1.4, -- Rapid Fire (Aimed) - [28866] = 1.2, -- Kiss of the Spider (Increases your _attack speed_ by 20% for 15 sec.) -- For Aimed -} - -local function GetTrollBerserkHaste(unit) - local perc = UnitHealth(unit)/UnitHealthMax(unit) - local speed = min((1.3 - perc)/3, .3) + 1 - return speed -end -local function GetRangedHaste(unit) - local positiveMul = 1 - for i=1, 100 do - local name, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, "HELPFUL") - if not name then return positiveMul end - if attackTimeDecreases[spellID] or spellID == 26635 then - positiveMul = positiveMul * (attackTimeDecreases[spellID] or GetTrollBerserkHaste(unit)) - end - end - return positiveMul -end -local function GetCastSlowdown(unit) - local negativeEx = 1 - for i=1, 100 do - local name, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, "HARMFUL") - if not name then return negativeEx end - if castTimeIncreases[spellID] then - negativeEx = math.max(negativeEx, castTimeIncreases[spellID]) - end - end - return negativeEx -end - -function lib:UnitCastingInfo(unit) - if UnitIsUnit(unit,"player") then - if not castingAimedShot then - return CastingInfo() - end - end - local guid = UnitGUID(unit) - local cast = casters[guid] - if cast then - local castType, name, icon, startTimeMS, endTimeMS, spellID = unpack(cast) - if castingAimedShot and spellID ~= 25294 then -- Multi-Shot spellID - local haste = GetRangedHaste(unit) - local duration = endTimeMS - startTimeMS - endTimeMS = startTimeMS + duration/haste - end - - local slowdown = GetCastSlowdown(unit) - if slowdown ~= 1 then - local duration = endTimeMS - startTimeMS - endTimeMS = startTimeMS + duration * slowdown - end - - if castType == "CAST" and endTimeMS > GetTime()*1000 then - local castID = nil - return name, nil, icon, startTimeMS, endTimeMS, nil, castID, false, spellID - end - end -end - -function lib:UnitChannelInfo(unit) - if UnitIsUnit(unit, "player") then return ChannelInfo() end - local guid = UnitGUID(unit) - local cast = casters[guid] - if cast then - local castType, name, icon, startTimeMS, endTimeMS, spellID = unpack(cast) - -- Curse of Tongues doesn't matter that much for channels, skipping - if castType == "CHANNEL" and endTimeMS > GetTime()*1000 then - return name, nil, icon, startTimeMS, endTimeMS, nil, false, spellID - end - end -end - - -local Passthrough = function(self, event, unit, ...) - if unit == "player" or UnitIsUnit(unit, "player") then - callbacks:Fire(event, unit, ...) - end -end -f.UNIT_SPELLCAST_START = Passthrough -f.UNIT_SPELLCAST_DELAYED = Passthrough -f.UNIT_SPELLCAST_STOP = Passthrough -f.UNIT_SPELLCAST_FAILED = Passthrough -f.UNIT_SPELLCAST_INTERRUPTED = Passthrough -f.UNIT_SPELLCAST_CHANNEL_START = Passthrough -f.UNIT_SPELLCAST_CHANNEL_UPDATE = Passthrough -f.UNIT_SPELLCAST_CHANNEL_STOP = Passthrough -f.UNIT_SPELLCAST_SUCCEEDED = Passthrough - -function callbacks.OnUsed() - f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") - - f:RegisterEvent("UNIT_SPELLCAST_START") - f:RegisterEvent("UNIT_SPELLCAST_DELAYED") - f:RegisterEvent("UNIT_SPELLCAST_STOP") - f:RegisterEvent("UNIT_SPELLCAST_FAILED") - f:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED") - f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") - f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE") - f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP") - f:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") - - -- for unit lookup - f:RegisterEvent("GROUP_ROSTER_UPDATE") - f:RegisterEvent("NAME_PLATE_UNIT_ADDED") - f:RegisterEvent("NAME_PLATE_UNIT_REMOVED") -end - -function callbacks.OnUnused() - f:UnregisterAllEvents() -end - -talentDecreased = { - [25311] = 0.8, -- Corruption (while leveling) - [17924] = 2, -- Soul Fire - [25307] = 0.5, -- Shadow Bolt - [25309] = 0.5, -- Immolate - [691] = 4, -- Summon Felhunter - [688] = 4, -- Summon Imp - [697] = 4, -- Summon Voidwalker - [712] = 4, -- Summon Succubus - - [15208] = 1, -- Lightning Bolt - [10605] = 1, -- Chain Lightning - [25357] = 0.5, -- Healing Wave - [2645] = 2, -- Ghost Wolf - - [25304] = 0.5, -- Frostbolt - [25306] = 0.5, -- Fireball - - [10934] = 0.5, -- Smite - [15261] = 0.5, -- Holy Fire - [6064] = 0.5, -- Heal - [25314] = 0.5, -- Greater Heal - [10876] = 0.5, -- Mana Burn - - [9912] = 0.5, -- Wrath - [25298] = 0.5, -- Starfire - [25297] = 0.5, -- Healing Touch -} - -classCasts = { - [25311] = 2, -- Corruption - [6215] = 1.5, -- Fear - [17928] = 2, -- Howl of Terror - [18647] = 1.5, -- Banish - [6366] = 3, -- Create Firestone (Lesser) - [17951] = 3, -- Create Firestone - [17952] = 3, -- Create Firestone (Greater) - [17953] = 3, -- Create Firestone (Major) - [28023] = 3, -- Create Healthstone - [11729] = 3, -- Create Healthstone (Greater) - [6202] = 3, -- Create Healthstone (Lesser) - [11730] = 3, -- Create Healthstone (Major) - [6201] = 3, -- Create Healthstone (Minor) - [20755] = 3, -- Create Soulstone - [20756] = 3, -- Create Soulstone (Greater) - [20752] = 3, -- Create Soulstone (Lesser) - [20757] = 3, -- Create Soulstone (Major) - [693] = 3, -- Create Soulstone (Minor) - [2362] = 5, -- Create Spellstone - [17727] = 5, -- Create Spellstone (Greater) - [17728] = 5, -- Create Spellstone (Major) - [11726] = 3, -- Enslave Demon - [126] = 5, -- Eye of Kilrogg - [1122] = 2, -- Inferno - [23161] = 3, -- Summon Dreadsteed - [5784] = 3, -- Summon Felsteed - [691] = 10, -- Summon Felhunter - [688] = 10, -- Summon Imp - [697] = 10, -- Summon Voidwalker - [712] = 10, -- Summon Succubus - [25309] = 2, -- Immolate - [17923] = 1.5, -- Searing Pain - [25307] = 3, -- Shadow Bolt - [17924] = 4, -- Soul Fire - [6358] = 1.5, -- Seduction - [11763] = 2, -- Firebolt (Imp) - - [9853] = 1.5, -- Entangling Roots - [18658] = 1.5, -- Hibernate - [9901] = 1.5, -- Soothe Animal - [25298] = 3.5, -- Starfire - [18960] = 10, -- Teleport: Moonglade - [9912] = 2, -- Wrath - [25297] = 3.5, -- Healing Touch - [20748] = 2, -- Rebirth - [9858] = 2, -- Regrowth - - [28612] = 3, -- Conjure Food - [759] = 3, -- Conjure Mana Agate - [10053] = 3, -- Conjure Mana Citrine - [3552] = 3, -- Conjure Mana Jade - [10054] = 3, -- Conjure Mana Ruby - [10140] = 3, -- Conjure Water - [12826] = 1.5, -- Polymorph - [28270] = 1.5, -- Polymorph: Cow - [25306] = 3.5, -- Fireball - [10216] = 3, -- Flamestrike - [10207] = 1.5, -- Scorch - [25304] = 3, -- Frostbolt - [3561] = 10, -- Teleport: Stormwind - [3562] = 10, -- Teleport: Ironforge - [3563] = 10, -- Teleport: Undercity - [3565] = 10, -- Teleport: Darnassus - [3566] = 10, -- Teleport: Thuner Bluff - [3567] = 10, -- Teleport: Orgrimmar - [10059] = 10, -- Portal: Stormwind - [11416] = 10, -- Portal: Ironforge - [11418] = 10, -- Portal: Undercity - [11419] = 10, -- Portal: Darnassus - [11420] = 10, -- Portal: Thuner Bluff - [11417] = 10, -- Portal: Orgrimmar - - [10876] = 3, -- Mana Burn - [10955] = 1.5, -- Shackle Undead - [10917] = 1.5, -- Flash Heal - [25314] = 3, -- Greater Heal - [6064] = 3, -- Heal - [15261] = 3.5, -- Holy Fire - [2053] = 2.5, -- Lesser Heal - [25316] = 3, -- Prayer of Healing - [20770] = 10, -- Resurrection - [10934] = 2.5, -- Smite - [10947] = 1.5, -- Mind Blast - [10912] = 3, -- Mind Control - - [19943] = 1.5, -- Flash of Light - [24239] = 1, -- Hammer of Wrath - [25292] = 2.5, -- Holy Light - [10318] = 2, -- Holy Wrath - [20773] = 10, -- Redemption - [23214] = 3, -- Summon Charger - [13819] = 3, -- Summon Warhorse - [10326] = 1.5, -- Turn Undead - - [10605] = 2.5, -- Chain Lightning - [15208] = 3, -- Lightning Bolt - [556] = 10, -- Astral Recall - [6196] = 2, -- Far Sight - [2645] = 3, -- Ghost Wolf - [20777] = 10, -- Ancestral Spirit - [10623] = 2.5, -- Chain Heal - [25357] = 3, -- Healing Wave - [10468] = 1.5, -- Lesser Healing Wave - - [1842] = 2, -- Disarm Trap - -- missing poison creation - - [11605] = 1.5, -- Slam - - [20904] = 3, -- Aimed Shot - [25294] = 0.5, -- Multi-Shot - [1002] = 2, -- Eyes of the Beast - [2641] = 5, -- Dismiss pet - [982] = 10, -- Revive Pet - [14327] = 1.5, -- Scare Beast - - [8690] = 10, -- Hearthstone - [4068] = 1, -- Iron Grenade - [19769] = 1, -- Thorium Grenade - [20589] = 0.5, -- Escape Artist - - -- Munts do not generate SPELL_CAST_START - -- [8394] = 3, -- Striped Frostsaber - -- [10793] = 3, -- Striped Nightsaber -} - -classChannelsByAura = { - [746] = 6, -- First Aid - [20577] = 10, -- Cannibalize - [19305] = 6, -- Starshards - - -- DRUID - [17402] = 10, -- Hurricane - [9863] = 10, -- Tranquility - - -- HUNTER - [6197] = 60, -- Eagle Eye - [13544] = 5, -- Mend Pet - [1515] = 20, -- Tame Beast - [1002] = 60, -- Eyes of the Beast - [14295] = 6, -- Volley - - [10187] = 8, -- Blizzard - [12051] = 8, -- Evocation - - -- PRIEST - [18807] = 3, -- Mind Flay - [2096] = 60, -- Mind Vision - [10912] = 3, -- Mind Control - - -- WARLOCK - [126] = 45, -- Eye of Kilrogg - [11700] = 5, -- Drain Life - [11704] = 5, -- Drain Mana - [11675] = 15, -- Drain Soul - [11678] = 8, -- Rain of Fire - [11684] = 15, -- Hellfire - [11695] = 10, -- Health Funnel - [6358] = 15, -- Seduction - [17854] = 10, -- Consume Shadows (Voidwalker) -} - -classChannelsByCast = { - [13278] = 4, -- Gnomish Death Ray - - -- MAGE - [25345] = 5, -- Arcane Missiles -} - - -for id in pairs(classCasts) do - spellNameToID[GetSpellInfo(id)] = id -end -for id in pairs(classChannelsByAura) do - spellNameToID[GetSpellInfo(id)] = id -end -for id in pairs(classChannelsByCast) do - spellNameToID[GetSpellInfo(id)] = id -end - -local partyGUIDtoUnit = {} -local raidGUIDtoUnit = {} -local nameplateGUIDtoUnit = {} -local commonUnits = { - -- "player", - "target", - "targettarget", - "pet", -} - -function f:NAME_PLATE_UNIT_ADDED(event, unit) - local unitGUID = UnitGUID(unit) - nameplateGUIDtoUnit[unitGUID] = unit -end - - -function f:NAME_PLATE_UNIT_REMOVED(event, unit) - local unitGUID = UnitGUID(unit) -- Unit still exists at this point - nameplateGUIDtoUnit[unitGUID] = nil -end - -function f:GROUP_ROSTER_UPDATE() - table.wipe(partyGUIDtoUnit) - table.wipe(raidGUIDtoUnit) - if IsInGroup() then - for i=1,4 do - local unit = "party"..i - local guid = UnitGUID(unit) - if guid then - partyGUIDtoUnit[guid] = unit - end - end - end - if IsInRaid() then - for i=1,40 do - local unit = "raid"..i - local guid = UnitGUID(unit) - if guid then - raidGUIDtoUnit[guid] = unit - end - end - end -end - -FireToUnits = function(event, guid, ...) - for _, unit in ipairs(commonUnits) do - if UnitGUID(unit) == guid then - callbacks:Fire(event, unit, ...) - end - end - - local partyUnit = partyGUIDtoUnit[guid] - if partyUnit then - callbacks:Fire(event, partyUnit, ...) - end - - local raidUnit = raidGUIDtoUnit[guid] - if raidUnit then - callbacks:Fire(event, raidUnit, ...) - end - - local nameplateUnit = nameplateGUIDtoUnit[guid] - if nameplateUnit then - callbacks:Fire(event, nameplateUnit, ...) - end -end - -crowdControlAuras = { -- from ClassicCastbars - [GetSpellInfo(5211)] = true, -- Bash - [GetSpellInfo(24394)] = true, -- Intimidation - [GetSpellInfo(853)] = true, -- Hammer of Justice - [GetSpellInfo(22703)] = true, -- Inferno Effect (Summon Infernal) - [GetSpellInfo(408)] = true, -- Kidney Shot - [GetSpellInfo(12809)] = true, -- Concussion Blow - [GetSpellInfo(20253)] = true, -- Intercept Stun - [GetSpellInfo(20549)] = true, -- War Stomp - [GetSpellInfo(2637)] = true, -- Hibernate - [GetSpellInfo(3355)] = true, -- Freezing Trap - [GetSpellInfo(19386)] = true, -- Wyvern Sting - [GetSpellInfo(118)] = true, -- Polymorph - [GetSpellInfo(28271)] = true, -- Polymorph: Turtle - [GetSpellInfo(28272)] = true, -- Polymorph: Pig - [GetSpellInfo(20066)] = true, -- Repentance - [GetSpellInfo(1776)] = true, -- Gouge - [GetSpellInfo(6770)] = true, -- Sap - [GetSpellInfo(1513)] = true, -- Scare Beast - [GetSpellInfo(8122)] = true, -- Psychic Scream - [GetSpellInfo(2094)] = true, -- Blind - [GetSpellInfo(5782)] = true, -- Fear - [GetSpellInfo(5484)] = true, -- Howl of Terror - [GetSpellInfo(6358)] = true, -- Seduction - [GetSpellInfo(5246)] = true, -- Intimidating Shout - [GetSpellInfo(6789)] = true, -- Death Coil - [GetSpellInfo(9005)] = true, -- Pounce - [GetSpellInfo(1833)] = true, -- Cheap Shot - [GetSpellInfo(16922)] = true, -- Improved Starfire - [GetSpellInfo(19410)] = true, -- Improved Concussive Shot - [GetSpellInfo(12355)] = true, -- Impact - [GetSpellInfo(20170)] = true, -- Seal of Justice Stun - [GetSpellInfo(15269)] = true, -- Blackout - [GetSpellInfo(18093)] = true, -- Pyroclasm - [GetSpellInfo(12798)] = true, -- Revenge Stun - [GetSpellInfo(5530)] = true, -- Mace Stun - [GetSpellInfo(19503)] = true, -- Scatter Shot - [GetSpellInfo(605)] = true, -- Mind Control - [GetSpellInfo(7922)] = true, -- Charge Stun - [GetSpellInfo(18469)] = true, -- Counterspell - Silenced - [GetSpellInfo(15487)] = true, -- Silence - [GetSpellInfo(18425)] = true, -- Kick - Silenced - [GetSpellInfo(24259)] = true, -- Spell Lock - [GetSpellInfo(18498)] = true, -- Shield Bash - Silenced - - -- ITEMS - [GetSpellInfo(13327)] = true, -- Reckless Charge - [GetSpellInfo(1090)] = true, -- Sleep - [GetSpellInfo(5134)] = true, -- Flash Bomb Fear - [GetSpellInfo(19821)] = true, -- Arcane Bomb Silence - [GetSpellInfo(4068)] = true, -- Iron Grenade - [GetSpellInfo(19769)] = true, -- Thorium Grenade - [GetSpellInfo(13808)] = true, -- M73 Frag Grenade - [GetSpellInfo(4069)] = true, -- Big Iron Bomb - [GetSpellInfo(12543)] = true, -- Hi-Explosive Bomb - [GetSpellInfo(4064)] = true, -- Rough Copper Bomb - [GetSpellInfo(12421)] = true, -- Mithril Frag Bomb - [GetSpellInfo(19784)] = true, -- Dark Iron Bomb - [GetSpellInfo(4067)] = true, -- Big Bronze Bomb - [GetSpellInfo(4066)] = true, -- Small Bronze Bomb - [GetSpellInfo(4065)] = true, -- Large Copper Bomb - [GetSpellInfo(13237)] = true, -- Goblin Mortar - [GetSpellInfo(835)] = true, -- Tidal Charm - [GetSpellInfo(13181)] = true, -- Gnomish Mind Control Cap - [GetSpellInfo(12562)] = true, -- The Big One - [GetSpellInfo(15283)] = true, -- Stunning Blow (Weapon Proc) - [GetSpellInfo(56)] = true, -- Stun (Weapon Proc) - [GetSpellInfo(26108)] = true, -- Glimpse of Madness -} - ------------------------------- --- Cast Interruption Checker ------------------------------- - --- There's an issue that if you start a cast and immediately after cancel it, CAST_FAILED event won't ever come for it --- This leads to zombie casts that have to run until completion --- So for 4s after non-friendly player controlled guid started a cast we're watching if it's moving and cancel - -do - local GetUnitForFreshGUID = function(guid) - local targetGUID = UnitGUID('target') - if guid == targetGUID then - return "target" - end - - return nameplateGUIDtoUnit[guid] - end - - f:SetScript("OnUpdate", function(self, elapsed) - local guid, timeout = next(movecheckGUIDs) - while guid ~= nil do - -- Removing while iterating here, but it doesn't matter - - local timeStart = MOVECHECK_TIMEOUT - timeout - if timeStart > 0.25 then - local unit = GetUnitForFreshGUID(guid) - if unit then - if GetUnitSpeed(unit) ~= 0 then - CastStop(guid, nil, "INTERRUPTED") - movecheckGUIDs[guid] = nil - return - end - end - end - - movecheckGUIDs[guid] = timeout - elapsed - if timeout - elapsed < 0 then - movecheckGUIDs[guid] = nil - end - -- print(guid, movecheckGUIDs[guid]) - - guid, timeout = next(movecheckGUIDs, guid) - end - end) -end - ------------------------------- - -if lib.NPCSpellsTimer then - lib.NPCSpellsTimer:Cancel() -end - -local prevID -local counter = 0 -local function processNPCSpellTable() - counter = 0 - local index, id = next(NPCSpells, prevID) - while (id and counter < 150) do - NPCspellNameToID[GetSpellInfo(id)] = id - - counter = counter + 1 - prevID = index - index, id = next(NPCSpells, prevID) - end - if (id) then - C_Timer.After(1, processNPCSpellTable) - end -end -lib.NPCSpellsTimer = C_Timer.NewTimer(6.5, processNPCSpellTable) - -NPCSpells = { - 10215, - 16587, - 16651, - 20874, - 16971, - 10695, - 7428, - 30152, - 7588, - 15238, - 11399, - 11431, - 7828, - 23242, - 7892, - 15910, - 8004, - 11975, - 16102, - 12039, - 12071, - 12167, - 20299, - 20427, - 513, - 16588, - 4165, - 20811, - 20875, - 25034, - 529, - 21067, - 21131, - 8552, - 8712, - 547, - 8776, - 555, - 8936, - 569, - 9224, - 4629, - 581, - 585, - 587, - 591, - 2371, - 13607, - 2387, - 2395, - 9672, - 27658, - 27722, - 13895, - 9928, - 4981, - 19980, - 14119, - 635, - 2547, - 639, - 10248, - 2579, - 647, - 5189, - 20876, - 16973, - 2667, - 17293, - 10792, - 17613, - 2739, - 11016, - 11048, - 693, - 15207, - 697, - 2795, - 5605, - 18445, - 707, - 2835, - 711, - 11400, - 22924, - 5781, - 23308, - 15783, - 735, - 27659, - 23628, - 19725, - 16071, - 19981, - 12072, - 28299, - 759, - 3067, - 3075, - 3083, - 3091, - 16590, - 6213, - 3115, - 8489, - 25292, - 8617, - 17294, - 8681, - 6405, - 6421, - 8809, - 6469, - 8873, - 8905, - 6517, - 3275, - 26444, - 3323, - 3331, - 837, - 6725, - 13480, - 6757, - 3387, - 9481, - 9513, - 13640, - 855, - 857, - 3443, - 6917, - 867, - 6949, - 3491, - 3507, - 9961, - 9993, - 24141, - 7077, - 3563, - 895, - 7221, - 16655, - 3635, - 25037, - 913, - 915, - 25357, - 17231, - 10697, - 10793, - 939, - 15048, - 943, - 11017, - 15208, - 26381, - 26445, - 11209, - 959, - 3843, - 3851, - 3859, - 22798, - 11433, - 18831, - 15592, - 7861, - 23310, - 7893, - 27725, - 8005, - 16072, - 12073, - 4067, - 20431, - 1026, - 16528, - 16656, - 8362, - 16784, - 12521, - 1062, - 8618, - 12745, - 8682, - 1090, - 1094, - 1098, - 1106, - 30093, - 8938, - 1122, - 9002, - 13225, - 22415, - 18448, - 18576, - 22799, - 22991, - 9482, - 23247, - 4950, - 24399, - 5110, - 5174, - 16657, - 20816, - 29134, - 5270, - 17169, - 10698, - 25807, - 17745, - 15049, - 26063, - 11082, - 15241, - 15305, - 22480, - 18449, - 11338, - 15497, - 5782, - 1450, - 23248, - 23312, - 15785, - 23632, - 12074, - 24208, - 20433, - 16402, - 16594, - 16658, - 8363, - 8395, - 12522, - 6278, - 16978, - 6310, - 6358, - 6422, - 17618, - 6470, - 6518, - 9003, - 13226, - 6630, - 13322, - 13482, - 6758, - 9483, - 13642, - 23249, - 23313, - 9739, - 9771, - 6950, - 19666, - 6982, - 9931, - 9995, - 14122, - 10059, - 20434, - 16531, - 10347, - 16659, - 24913, - 25297, - 1842, - 17235, - 10699, - 10795, - 10955, - 15114, - 15242, - 7638, - 18451, - 11339, - 15498, - 15530, - 7782, - 23250, - 11659, - 23442, - 19667, - 2006, - 2010, - 12075, - 8102, - 24274, - 20435, - 2052, - 2060, - 20627, - 16596, - 16660, - 8364, - 12491, - 12523, - 16980, - 25298, - 21331, - 12747, - 8780, - 8812, - 8940, - 9004, - 13227, - 13323, - 13419, - 22867, - 9484, - 23187, - 2396, - 9612, - 13899, - 13931, - 19860, - 9964, - 28242, - 28306, - 24275, - 2540, - 2548, - 14379, - 5159, - 10348, - 16661, - 16725, - 2660, - 2668, - 10700, - 10796, - 2740, - 2812, - 18453, - 11340, - 2860, - 15659, - 2908, - 11660, - 23508, - 2948, - 15915, - 19669, - 16075, - 12044, - 12076, - 3068, - 3084, - 3092, - 6199, - 6215, - 8365, - 12492, - 3132, - 3140, - 29331, - 12684, - 21397, - 8717, - 25748, - 6471, - 6487, - 8941, - 6535, - 3276, - 3292, - 13228, - 6631, - 3324, - 3332, - 22677, - 3356, - 3364, - 3372, - 13548, - 9485, - 13612, - 13644, - 3420, - 9613, - 3436, - 23509, - 13836, - 13868, - 6951, - 27860, - 3492, - 9901, - 9933, - 9997, - 28244, - 7079, - 3564, - 14380, - 20630, - 7223, - 16663, - 20822, - 3636, - 3644, - 3652, - 16983, - 29332, - 10605, - 7383, - 10701, - 10733, - 17559, - 3748, - 26069, - 11021, - 11085, - 18199, - 7639, - 7655, - 3844, - 3852, - 3860, - 3868, - 7751, - 22870, - 7799, - 7863, - 11661, - 11725, - 23510, - 23638, - 15980, - 19863, - 12045, - 8087, - 8103, - 4068, - 16, - 16408, - 8238, - 16600, - 16664, - 16728, - 8398, - 12525, - 16984, - 21143, - 12653, - 8686, - 17496, - 17560, - 8814, - 26006, - 26070, - 26134, - 4520, - 13229, - 18392, - 18456, - 18584, - 13421, - 13485, - 22999, - 23063, - 9614, - 23639, - 13901, - 13933, - 27990, - 19864, - 9966, - 20312, - 16409, - 20568, - 10318, - 5176, - 16665, - 16729, - 16985, - 21144, - 10702, - 10798, - 17561, - 21848, - 26071, - 15117, - 22168, - 15245, - 18457, - 11342, - 22744, - 15533, - 23000, - 11534, - 5784, - 27287, - 11726, - 15853, - 11790, - 19865, - 24024, - 12046, - 12078, - 28311, - 20313, - 20377, - 16410, - 16730, - 8399, - 12526, - 25112, - 16986, - 29335, - 25304, - 8687, - 17434, - 25688, - 17562, - 21913, - 26072, - 18138, - 13230, - 13262, - 6648, - 18458, - 6728, - 22937, - 13582, - 13646, - 27608, - 9743, - 27992, - 9935, - 20314, - 20378, - 7224, - 16667, - 16731, - 16795, - 7288, - 16987, - 10703, - 17435, - 10799, - 17563, - 17883, - 15118, - 11343, - 7752, - 15534, - 22938, - 7800, - 15662, - 7896, - 7928, - 7960, - 15982, - 8008, - 19867, - 12047, - 12079, - 8104, - 20315, - 20379, - 2053, - 2061, - 8272, - 4153, - 20763, - 16732, - 8400, - 16988, - 12655, - 17180, - 21403, - 8688, - 17564, - 21787, - 8880, - 17820, - 9200, - 9232, - 13519, - 9456, - 13583, - 2389, - 2397, - 9616, - 19484, - 13935, - 19868, - 9968, - 24091, - 10096, - 2541, - 2549, - 16413, - 5161, - 5177, - 20764, - 5273, - 2645, - 25307, - 2661, - 10704, - 10768, - 5401, - 17565, - 2741, - 11024, - 18205, - 2837, - 15535, - 11568, - 27291, - 2941, - 3013, - 6041, - 20317, - 20381, - 16367, - 8209, - 3085, - 3093, - 6201, - 3109, - 3117, - 16798, - 12528, - 8465, - 16990, - 12624, - 8593, - 3205, - 17566, - 3229, - 3237, - 6521, - 17950, - 3277, - 3293, - 3325, - 3333, - 22749, - 22813, - 3373, - 6777, - 9489, - 13648, - 3421, - 3429, - 6905, - 3477, - 3493, - 3501, - 9937, - 10001, - 7081, - 20318, - 20382, - 16415, - 3605, - 20702, - 20830, - 16799, - 7289, - 16991, - 25309, - 10673, - 10705, - 17503, - 17567, - 7481, - 10961, - 17951, - 7641, - 22430, - 18399, - 3845, - 3861, - 15472, - 7753, - 15536, - 7801, - 7817, - 15664, - 15728, - 11665, - 15792, - 11729, - 15856, - 11921, - 11985, - 12049, - 12081, - 8105, - 4061, - 4069, - 20319, - 16336, - 24670, - 20831, - 8402, - 66, - 16992, - 8690, - 8786, - 17952, - 4506, - 18656, - 1179, - 13617, - 13745, - 13841, - 13905, - 13937, - 4954, - 14033, - 9970, - 20320, - 20384, - 10258, - 10322, - 5178, - 25055, - 16993, - 25311, - 10674, - 10706, - 17505, - 30046, - 15057, - 30174, - 17953, - 18081, - 1403, - 18401, - 18657, - 11410, - 15537, - 11538, - 15665, - 1451, - 23392, - 11730, - 11762, - 27871, - 11922, - 16081, - 12050, - 12082, - 20321, - 20385, - 16418, - 8275, - 6202, - 12466, - 20897, - 16866, - 12562, - 16994, - 8595, - 8691, - 17506, - 6490, - 18082, - 18402, - 26656, - 18658, - 13522, - 6778, - 13746, - 9811, - 9875, - 14034, - 10003, - 7098, - 28448, - 20322, - 20386, - 7162, - 16419, - 113, - 20770, - 10451, - 16995, - 17187, - 10675, - 10707, - 116, - 7434, - 25953, - 10963, - 118, - 18211, - 22434, - 18403, - 7754, - 11443, - 7786, - 7802, - 7818, - 15730, - 11667, - 15794, - 11763, - 7962, - 7978, - 7994, - 11923, - 16082, - 126, - 12083, - 8106, - 8138, - 20323, - 12243, - 2054, - 20707, - 16868, - 21027, - 133, - 8532, - 134, - 8596, - 12883, - 8820, - 25954, - 8980, - 4539, - 143, - 18404, - 145, - 18596, - 22883, - 22947, - 2366, - 2406, - 13939, - 9876, - 4971, - 9972, - 2542, - 20388, - 10228, - 10324, - 5179, - 5195, - 14515, - 10452, - 16869, - 5275, - 2662, - 10676, - 10708, - 5403, - 21668, - 10964, - 172, - 18149, - 26403, - 5627, - 2838, - 11444, - 2878, - 11604, - 11668, - 184, - 23652, - 11892, - 19877, - 19941, - 12052, - 12084, - 20389, - 3070, - 24612, - 8245, - 8277, - 3110, - 12468, - 20901, - 25124, - 25316, - 8693, - 3206, - 17510, - 8789, - 8949, - 205, - 18086, - 3294, - 18214, - 22373, - 6635, - 3326, - 3334, - 22757, - 13524, - 9461, - 3398, - 13620, - 13748, - 23461, - 6907, - 23653, - 9813, - 3494, - 3502, - 19942, - 10005, - 20326, - 14292, - 3606, - 20902, - 25125, - 7355, - 10677, - 10709, - 3718, - 14900, - 10837, - 10869, - 3750, - 10933, - 10965, - 26085, - 15124, - 7643, - 18407, - 22566, - 3854, - 3862, - 7739, - 7755, - 7771, - 15668, - 11605, - 7867, - 7931, - 11829, - 16084, - 19943, - 12053, - 12085, - 4054, - 4062, - 8139, - 20327, - 16340, - 4094, - 8246, - 16552, - 8342, - 16744, - 8406, - 25126, - 21159, - 8598, - 271, - 8694, - 8758, - 25958, - 8950, - 18088, - 13237, - 18408, - 22567, - 22695, - 22759, - 13653, - 9654, - 9750, - 9814, - 13941, - 19816, - 9942, - 9974, - 20008, - 24359, - 10166, - 14293, - 10326, - 5180, - 5196, - 16745, - 20904, - 25127, - 5276, - 331, - 332, - 10678, - 10710, - 21544, - 339, - 21736, - 10934, - 5484, - 26087, - 15125, - 18089, - 348, - 18217, - 18409, - 5676, - 15797, - 5884, - 23592, - 16053, - 20009, - 12086, - 6060, - 20201, - 20329, - 20393, - 24680, - 16554, - 20777, - 16746, - 6252, - 25128, - 21097, - 21161, - 17194, - 6412, - 25704, - 403, - 25960, - 8951, - 22313, - 9143, - 18410, - 22761, - 421, - 6780, - 13622, - 9591, - 19434, - 13846, - 13878, - 9879, - 10007, - 7068, - 7084, - 7132, - 20394, - 14326, - 20714, - 10391, - 455, - 29160, - 457, - 458, - 459, - 17195, - 10679, - 10711, - 7420, - 7484, - 17707, - 470, - 471, - 472, - 474, - 15254, - 18411, - 11479, - 27241, - 491, - 15734, - 11671, - 19435, - 7948, - 11895, - 19755, - 12055, - 12087, - 507, - 12151, - 509, - 20395, - 12279, - 2055, - 4141, - 12471, - 8408, - 4221, - 25130, - 21099, - 536, - 8600, - 25514, - 8760, - 17708, - 556, - 21931, - 26218, - 18412, - 578, - 18540, - 13399, - 13463, - 18796, - 13527, - 23083, - 596, - 598, - 13687, - 23339, - 606, - 13815, - 13943, - 9912, - 14103, - 2543, - 20396, - 14327, - 16429, - 2575, - 10328, - 20716, - 10392, - 5213, - 2663, - 10680, - 10712, - 17453, - 10840, - 17709, - 25963, - 686, - 15095, - 690, - 692, - 698, - 700, - 18413, - 2823, - 18541, - 710, - 712, - 11416, - 11480, - 18989, - 724, - 11672, - 15799, - 15863, - 2951, - 19821, - 3007, - 12056, - 12088, - 16247, - 12248, - 12280, - 3079, - 3087, - 3095, - 20717, - 25004, - 29163, - 3143, - 3207, - 8793, - 6461, - 25964, - 3263, - 818, - 9081, - 6637, - 6653, - 3335, - 6717, - 13464, - 13528, - 18990, - 9657, - 6909, - 6925, - 19566, - 6957, - 3495, - 14008, - 3511, - 10009, - 20078, - 7101, - 20270, - 3567, - 20398, - 3583, - 3607, - 7277, - 3655, - 10681, - 10713, - 7421, - 930, - 932, - 10841, - 10873, - 25965, - 10969, - 15128, - 18159, - 7629, - 7645, - 18351, - 18415, - 3847, - 3855, - 3863, - 968, - 11417, - 7821, - 7853, - 984, - 7901, - 990, - 7949, - 996, - 1002, - 16056, - 19887, - 20015, - 12089, - 4055, - 28461, - 20399, - 8282, - 24942, - 12505, - 12537, - 29229, - 1064, - 25262, - 4286, - 1084, - 1088, - 12825, - 8762, - 8858, - 1112, - 21935, - 1124, - 22127, - 4526, - 18416, - 13529, - 18992, - 13657, - 13689, - 9658, - 13817, - 23663, - 9818, - 13945, - 4974, - 20016, - 28270, - 24239, - 10138, - 28526, - 20400, - 16497, - 16561, - 20720, - 20848, - 5262, - 17009, - 25263, - 17137, - 10682, - 10714, - 17393, - 10842, - 10874, - 25967, - 18417, - 18609, - 11418, - 23088, - 1452, - 11642, - 15801, - 27567, - 15865, - 11802, - 23664, - 11962, - 19889, - 20017, - 12090, - 16249, - 28463, - 20401, - 1536, - 1540, - 16498, - 8283, - 6222, - 20849, - 6254, - 6270, - 17138, - 6350, - 6366, - 21425, - 6414, - 12890, - 25968, - 6510, - 8955, - 6638, - 18418, - 22705, - 13530, - 23089, - 6814, - 6894, - 27632, - 13882, - 19890, - 9979, - 10011, - 28272, - 10139, - 20402, - 1804, - 10395, - 25073, - 17203, - 10683, - 10715, - 17459, - 7454, - 10875, - 25969, - 17843, - 26097, - 11067, - 11131, - 7630, - 1916, - 18419, - 11355, - 11419, - 27057, - 23090, - 11643, - 15802, - 7918, - 7934, - 23666, - 11899, - 16058, - 12059, - 12091, - 24242, - 16250, - 8142, - 20403, - 28785, - 16564, - 8348, - 8444, - 2120, - 21171, - 12667, - 8604, - 17460, - 8764, - 30001, - 25970, - 26098, - 8988, - 18420, - 22643, - 27058, - 2368, - 23091, - 9532, - 13659, - 13819, - 23667, - 13915, - 9852, - 9916, - 9980, - 20020, - 10140, - 2544, - 20404, - 2576, - 16565, - 16629, - 10396, - 24947, - 20916, - 17141, - 2664, - 10684, - 10716, - 17461, - 10844, - 10876, - 25971, - 15067, - 5567, - 26419, - 18421, - 2824, - 11356, - 11420, - 27059, - 15611, - 11548, - 23220, - 2912, - 11836, - 19701, - 23860, - 16059, - 12060, - 12092, - 6063, - 6127, - 3072, - 3080, - 3088, - 3096, - 6223, - 3120, - 6255, - 8445, - 17142, - 6351, - 6415, - 8797, - 6463, - 25972, - 3256, - 3264, - 9053, - 3296, - 3320, - 3328, - 6671, - 22709, - 3368, - 3376, - 3400, - 3408, - 23221, - 13692, - 27572, - 3472, - 9853, - 3496, - 3504, - 28148, - 10013, - 3552, - 10205, - 3584, - 20790, - 7279, - 7295, - 7359, - 3696, - 10717, - 7439, - 3728, - 7487, - 25973, - 15228, - 15292, - 3840, - 3848, - 3856, - 3864, - 3872, - 22902, - 7791, - 15612, - 23094, - 7855, - 7919, - 7935, - 7951, - 7967, - 27829, - 23862, - 16060, - 24054, - 20023, - 12093, - 4064, - 24374, - 20407, - 20535, - 8286, - 20791, - 12509, - 8446, - 21047, - 21175, - 8606, - 4320, - 17464, - 8766, - 25974, - 26102, - 30732, - 30156, - 30096, - 30091, - 18424, - 9472, - 30047, - 16742, - 29334, - 29333, - 13501, - 5272, - 28995, - 18153, - 28739, - 13661, - 13693, - 7489, - 8467, - 28505, - 28487, - 9758, - 28482, - 13917, - 23799, - 6297, - 4960, - 9950, - 3693, - 14109, - 20698, - 28462, - 461, - 28328, - 28305, - 10206, - 28304, - 20536, - 6651, - 28286, - 16633, - 20792, - 28271, - 28243, - 25079, - 5264, - 5280, - 28210, - 10622, - 28209, - 10686, - 10718, - 28208, - 17465, - 28207, - 28205, - 28146, - 28133, - 15037, - 28089, - 5504, - 1096, - 27891, - 18105, - 27890, - 15261, - 15293, - 27870, - 21160, - 22945, - 3243, - 11358, - 27830, - 27794, - 15549, - 27760, - 27724, - 27723, - 27721, - 23224, - 9435, - 27660, - 3503, - 27637, - 15869, - 27624, - 15933, - 27831, - 23800, - 19769, - 28023, - 27588, - 18440, - 12062, - 5186, - 6064, - 4065, - 27527, - 27106, - 27100, - 16381, - 27098, - 24696, - 16570, - 26616, - 20793, - 19851, - 4983, - 12542, - 16168, - 26437, - 26436, - 26435, - 8607, - 17274, - 12766, - 26434, - 6416, - 26433, - 8799, - 26432, - 26431, - 25976, - 21945, - 26430, - 26429, - 26407, - 9055, - 12066, - 23246, - 26298, - 24093, - 6656, - 26192, - 26103, - 26086, - 13438, - 3108, - 26055, - 16724, - 20035, - 26010, - 23161, - 23225, - 25985, - 691, - 25983, - 6896, - 13822, - 20819, - 25981, - 27832, - 23801, - 25979, - 24139, - 25183, - 9983, - 10015, - 25966, - 25962, - 25961, - 7120, - 25959, - 10207, - 25849, - 25841, - 25839, - 25808, - 25804, - 20794, - 25722, - 25664, - 25081, - 20821, - 7328, - 23316, - 10623, - 25424, - 10687, - 10719, - 16006, - 25347, - 25314, - 25306, - 7488, - 10911, - 25977, - 25181, - 25180, - 25178, - 25177, - 25162, - 15230, - 15262, - 15294, - 18363, - 25146, - 25129, - 20829, - 7728, - 22336, - 23085, - 7776, - 23391, - 25082, - 23098, - 25080, - 25078, - 25074, - 25072, - 25054, - 25052, - 27641, - 7952, - 11839, - 25030, - 8000, - 8016, - 25018, - 16094, - 24997, - 12063, - 24995, - 16969, - 24314, - 24914, - 24912, - 24903, - 24902, - 24901, - 8256, - 24801, - 24706, - 8352, - 24668, - 4209, - 12543, - 2121, - 16652, - 24418, - 24358, - 24334, - 23102, - 24209, - 24189, - 8736, - 8768, - 8800, - 24173, - 24140, - 25978, - 24138, - 10329, - 24136, - 26234, - 18108, - 24092, - 24011, - 7395, - 23954, - 5274, - 23804, - 13375, - 23803, - 13439, - 23802, - 13503, - 23787, - 2369, - 23665, - 13631, - 2393, - 13695, - 23662, - 23650, - 23637, - 19452, - 23636, - 13887, - 23633, - 9856, - 9888, - 9920, - 9952, - 23629, - 20028, - 23531, - 23530, - 6413, - 10144, - 2545, - 3336, - 10771, - 5137, - 2577, - 5169, - 5185, - 2601, - 3570, - 8153, - 25083, - 5265, - 2641, - 23381, - 23338, - 2665, - 2673, - 10720, - 17405, - 25659, - 23315, - 23314, - 10880, - 10912, - 2737, - 23309, - 5505, - 23252, - 23251, - 26299, - 23243, - 15263, - 15295, - 23241, - 15119, - 23239, - 23238, - 2841, - 15451, - 23228, - 23227, - 23223, - 5761, - 15647, - 19069, - 5809, - 15743, - 23222, - 23219, - 23214, - 23206, - 23189, - 15935, - 19645, - 15999, - 16031, - 23130, - 19862, - 20773, - 20029, - 12096, - 24252, - 23093, - 23092, - 23087, - 6129, - 3073, - 3081, - 23086, - 3097, - 3105, - 20797, - 3121, - 6257, - 25084, - 23084, - 6305, - 17086, - 23030, - 6353, - 23013, - 23012, - 22990, - 6417, - 22989, - 22949, - 3233, - 22946, - 25980, - 22909, - 22876, - 22869, - 22868, - 22866, - 3297, - 18238, - 22796, - 3321, - 22790, - 3337, - 18166, - 22717, - 13440, - 22750, - 6753, - 13536, - 9473, - 22724, - 9744, - 23229, - 3513, - 20405, - 7448, - 6897, - 22718, - 22710, - 22686, - 22678, - 13952, - 9889, - 3505, - 19902, - 9985, - 7057, - 3537, - 22665, - 22662, - 7121, - 22661, - 22651, - 22539, - 22478, - 22458, - 22425, - 16639, - 22421, - 22414, - 22357, - 25085, - 3657, - 22334, - 22275, - 22167, - 13900, - 3697, - 10721, - 22048, - 21971, - 7457, - 10849, - 10881, - 17727, - 15040, - 8791, - 17919, - 16080, - 3695, - 18111, - 15232, - 18239, - 15296, - 21807, - 18431, - 3849, - 3857, - 7729, - 7745, - 7761, - 21667, - 7793, - 21565, - 15648, - 21559, - 7857, - 21549, - 21402, - 21369, - 19391, - 21367, - 5514, - 21162, - 27837, - 21096, - 19775, - 21073, - 12001, - 21072, - 20031, - 21071, - 21068, - 8129, - 21066, - 19774, - 21048, - 20903, - 20543, - 4130, - 20900, - 16640, - 20890, - 10696, - 16083, - 25086, - 16960, - 20827, - 20826, - 20825, - 20824, - 12737, - 8674, - 20823, - 25662, - 8770, - 8802, - 20820, - 17728, - 25982, - 20817, - 17920, - 8994, - 20815, - 18112, - 20813, - 18240, - 15859, - 5188, - 17509, - 3210, - 18560, - 22719, - 6576, - 3694, - 20787, - 20776, - 9474, - 23103, - 20772, - 20765, - 20762, - 20757, - 20756, - 20755, - 20752, - 13857, - 20748, - 20747, - 9858, - 20742, - 4962, - 9954, - 9986, - 20032, - 5026, - 20739, - 20733, - 28478, - 20696, - 5106, - 20695, - 20692, - 20685, - 16965, - 16641, - 20800, - 20669, - 10466, - 20665, - 5266, - 20657, - 20656, - 20629, - 20626, - 20012, - 20609, - 20604, - 17473, - 20565, - 10850, - 2672, - 20432, - 10946, - 20430, - 17921, - 20429, - 1385, - 20428, - 20426, - 15265, - 11202, - 18617, - 20408, - 20406, - 5666, - 22720, - 20397, - 20392, - 20391, - 15585, - 20390, - 20387, - 20383, - 1453, - 3065, - 3069, - 5669, - 8366, - 3133, - 18439, - 6296, - 11986, - 14106, - 16033, - 17140, - 6352, - 15267, - 20033, - 1513, - 10685, - 20324, - 8782, - 19859, - 12258, - 24576, - 16450, - 8259, - 20316, - 16642, - 20801, - 6632, - 11341, - 6274, - 8483, - 6306, - 11357, - 16597, - 3361, - 13321, - 3377, - 20296, - 6418, - 17196, - 3397, - 13628, - 20051, - 25984, - 26048, - 17922, - 20014, - 15979, - 13948, - 3497, - 18242, - 6626, - 4961, - 18434, - 11981, - 6690, - 22721, - 13442, - 12061, - 18818, - 13538, - 12077, - 20030, - 20026, - 20025, - 13698, - 3565, - 20024, - 13794, - 19750, - 13858, - 13890, - 10254, - 16502, - 16662, - 3658, - 8367, - 9987, - 20034, - 14146, - 28352, - 7106, - 28480, - 10179, - 20006, - 7408, - 20013, - 20610, - 17462, - 16643, - 20802, - 10435, - 10467, - 3729, - 3733, - 468, - 20011, - 20010, - 3506, - 1849, - 19982, - 7426, - 10787, - 14914, - 17229, - 7648, - 10915, - 10947, - 21954, - 17923, - 8368, - 19970, - 3841, - 15234, - 15266, - 19968, - 3869, - 18435, - 3873, - 14807, - 22722, - 9487, - 19940, - 19939, - 15586, - 7992, - 23106, - 19874, - 8040, - 19873, - 8088, - 19866, - 27585, - 18327, - 15906, - 512, - 15970, - 18163, - 2005, - 19861, - 16098, - 19971, - 12067, - 15253, - 19848, - 14621, - 28481, - 17273, - 12259, - 2050, - 18438, - 4131, - 8292, - 12419, - 8356, - 6620, - 548, - 8784, - 21059, - 19772, - 8912, - 12675, - 19668, - 12739, - 579, - 580, - 15453, - 8772, - 8804, - 16601, - 10688, - 30081, - 9488, - 17924, - 2386, - 9552, - 18960, - 9092, - 13219, - 17450, - 605, - 9220, - 18500, - 18564, - 22723, - 12064, - 17454, - 18991, - 2362, - 2538, - 2546, - 13635, - 2394, - 18702, - 9636, - 2738, - 27586, - 18763, - 2742, - 18809, - 8401, - 23811, - 18647, - 18241, - 9956, - 19972, - 20036, - 2670, - 1056, - 18444, - 10148, - 10180, - 20420, - 20484, - 28738, - 2578, - 10340, - 16645, - 2602, - 10436, - 10468, - 688, - 5267, - 5506, - 21188, - 17157, - 2666, - 2674, - 695, - 7633, - 5395, - 701, - 17501, - 705, - 10916, - 15043, - 7769, - 18455, - 7865, - 18454, - 18452, - 18450, - 18245, - 7929, - 18447, - 18437, - 18446, - 9857, - 18629, - 5699, - 9921, - 3018, - 15587, - 5763, - 8089, - 7788, - 8137, - 10145, - 15779, - 23428, - 27587, - 3066, - 3074, - 16412, - 14847, - 3086, - 3094, - 19845, - 16099, - 19973, - 12068, - 18436, - 10945, - 18423, - 18422, - 8010, - 12260, - 16390, - 3082, - 3090, - 8293, - 16646, - 20805, - 29059, - 5208, - 18414, - 3146, - 6530, - 3278, - 17158, - 8613, - 12740, - 8677, - 18405, - 6419, - 6650, - 3330, - 877, - 14053, - 8901, - 13028, - 849, - 8090, - 18244, - 18243, - 6898, - 18246, - 6627, - 15855, - 9221, - 18502, - 13380, - 18630, - 22789, - 3370, - 6755, - 4979, - 12065, - 885, - 3562, - 9573, - 13700, - 3566, - 23429, - 6899, - 20380, - 13860, - 7322, - 8211, - 5187, - 3498, - 19846, - 9957, - 19974, - 5219, - 10053, - 8435, - 3722, - 10149, - 10181, - 28612, - 3586, - 28740, - 1050, - 20678, - 16647, - 20806, - 14532, - 928, - 3650, - 16967, - 15264, - 2539, - 1042, - 3690, - 17287, - 3866, - 3870, - 10789, - 3561, - 7794, - 3064, - 10917, - 982, - 17639, - 9795, - 597, - 1004, - 9939, - 26373, - 18247, - 12098, - 4066, - 3842, - 3850, - 3858, - 11365, - 11397, - 17463, - 7779, - 7795, - 17458, - 7827, - 17456, - 7859, - 17455, - 15780, - 23430, - 27589, - 19463, - 6499, - 19903, - 15972, - 17290, - 15575, - 19847, - 24006, - 19975, - 12069, - 28293, - 17204, - 8131, - 20295, - 13378, - 17181, - 12824, - 16997, - 4132, - 20297, - 4164, - 20807, - 24966, - 8422, - 12549, - 3515, - 19886, - 2671, - 2675, - 7443, - 7451, - 16788, - 7483, - 16783, - 8774, - 8806, - 1366, - 30021, - 16726, - 26054, - 17928, - 7418, - 16654, - 16653, - 1464, - 26438, - 16648, - 18376, - 9222, - 16644, - 11988, - 3015, - 16599, - 10165, - 16598, - 1538, - 13626, - 12826, - 13637, - 9574, - 16533, - 3211, - 23431, - 27590, - 9734, - 6500, - 13140, - 3295, - 13220, - 19784, - 9926, - 4980, - 3319, - 16055, - 10054, - 3359, - 3363, - 10150, - 3371, - 16741, - 3611, - 1698, - 3399, - 20680, - 16649, - 20808, - 20872, - 25031, - 5252, - 5268, - 7124, - 3071, - 25351, - 8407, - 7437, - 1980, - 3651, - 17481, - 5269, - 10854, - 15861, - 21832, - 10790, - 21960, - 16396, - 22088, - 8778, - 3815, - 18406, - 26439, - 3871, - 7748, - 18441, - 15596, - 5668, - 11366, - 15493, - 15495, - 2008, - 6741, - 8092, - 15653, - 10151, - 23240, - 15050, - 15781, - 23432, - 14887, - 14871, - 14810, - 6501, - 15973, - 14809, - 14200, - 19849, - 16101, - 13947, - 12070, - 13912, - 2392, - 7054, - 12198, - 13898, - 2480, - 13663, - 7213, - 13655, - 6196, - 16650, - 7389, - 20873, - 8423, - 9918, - 16970, - 18442, - 2840, - 17162, - 12524, - 12742, - 8679, - 12421, - 9945, - 3016, - 12199, - 9820, - 17738, - 8903, - 26056, - 3116, - 8394, - 12080, - 3204, - 9095, - 26440, - 8986, - 12058, - 9223, - 12048, - 6692, - 11963, - 6766, - 3396, - 6918, - 3488, - 3500, - 3508, - 11993, - 9575, - 13702, - 7078, - 7222, - 8331, - 6654, - 27720, - 10960, - 8795, - 8939, - 10788, - 7766, - 9959, - 15800, - 24137, - 7076, - 10216, - 6639, - 20298, - 2637, - 15066, -} diff --git a/libraries/LibClassicDurations/LibClassicDurations.xml b/libraries/LibClassicDurations/LibClassicDurations.xml deleted file mode 100644 index 4934790..0000000 --- a/libraries/LibClassicDurations/LibClassicDurations.xml +++ /dev/null @@ -1,7 +0,0 @@ - -