├── .luacheckrc ├── Classes ├── AreaTrigger │ ├── AreaTrigger.lua │ └── Drawings.lua ├── Aura │ ├── Aura.lua │ ├── Cache.lua │ └── DotTracker.lua ├── Classes.lua ├── GameObject │ └── GameObject.lua ├── Item │ └── Item.lua ├── LocalPlayer │ ├── Enemy.lua │ ├── Friend.lua │ ├── Loaders.lua │ └── LocalPlayer.lua ├── Spell │ ├── Cast.lua │ ├── LastCast.lua │ └── Spell.lua └── Unit │ ├── Drawings.lua │ ├── Friend.lua │ ├── Quest.lua │ ├── TimeToDie.lua │ └── Unit.lua ├── Core.lua ├── DoMeWhen.toc ├── Enums ├── CC.lua ├── Conduits.lua ├── Defensive.lua ├── Dispel.lua ├── Dummy.lua ├── HardCC.lua ├── Interrupts.lua ├── Items.lua ├── Misc.lua ├── Overrides.lua ├── Runeforge.lua ├── Specs.lua ├── Spells │ ├── DeathKnight.lua │ ├── DemonHunter.lua │ ├── Druid.lua │ ├── Global.lua │ ├── Hunter.lua │ ├── Mage.lua │ ├── Monk.lua │ ├── Paladin.lua │ ├── Priest.lua │ ├── Rogue.lua │ ├── Shaman.lua │ ├── Warlock.lua │ └── Warrior.lua └── Tracker.lua ├── Helpers ├── Gatherers.lua ├── Navigation.lua ├── Queue.lua ├── Rotation.lua └── Trackers.lua ├── LICENSE ├── Libs ├── !LibDraw │ ├── !LibDraw.toc │ ├── LibDraw.lua │ ├── Libs │ │ └── LibStub │ │ │ └── LibStub.lua │ └── Media │ │ └── LineTemplate.tga ├── AceAddon-3.0 │ ├── AceAddon-3.0.lua │ └── AceAddon-3.0.xml ├── AceConfig-3.0 │ ├── AceConfig-3.0.lua │ ├── AceConfig-3.0.xml │ ├── AceConfigCmd-3.0 │ │ ├── AceConfigCmd-3.0.lua │ │ └── AceConfigCmd-3.0.xml │ ├── AceConfigDialog-3.0 │ │ ├── AceConfigDialog-3.0.lua │ │ └── AceConfigDialog-3.0.xml │ └── AceConfigRegistry-3.0 │ │ ├── AceConfigRegistry-3.0.lua │ │ └── AceConfigRegistry-3.0.xml ├── AceConsole-3.0 │ ├── AceConsole-3.0.lua │ └── AceConsole-3.0.xml ├── AceDB-3.0 │ ├── AceDB-3.0.lua │ └── AceDB-3.0.xml ├── AceDBOptions-3.0 │ ├── AceDBOptions-3.0.lua │ └── AceDBOptions-3.0.xml ├── AceGUI-3.0 │ ├── AceGUI-3.0.lua │ ├── AceGUI-3.0.xml │ └── widgets │ │ ├── AceGUIContainer-BlizOptionsGroup.lua │ │ ├── AceGUIContainer-DropDownGroup.lua │ │ ├── AceGUIContainer-Frame.lua │ │ ├── AceGUIContainer-InlineGroup.lua │ │ ├── AceGUIContainer-ScrollFrame.lua │ │ ├── AceGUIContainer-SimpleGroup.lua │ │ ├── AceGUIContainer-TabGroup.lua │ │ ├── AceGUIContainer-TreeGroup.lua │ │ ├── AceGUIContainer-Window.lua │ │ ├── AceGUIWidget-Button.lua │ │ ├── AceGUIWidget-CheckBox.lua │ │ ├── AceGUIWidget-ColorPicker.lua │ │ ├── AceGUIWidget-DropDown-Items.lua │ │ ├── AceGUIWidget-DropDown.lua │ │ ├── AceGUIWidget-EditBox.lua │ │ ├── AceGUIWidget-Heading.lua │ │ ├── AceGUIWidget-Icon.lua │ │ ├── AceGUIWidget-InteractiveLabel.lua │ │ ├── AceGUIWidget-Keybinding.lua │ │ ├── AceGUIWidget-Label.lua │ │ ├── AceGUIWidget-MultiLineEditBox.lua │ │ └── AceGUIWidget-Slider.lua ├── CallbackHandler-1.0 │ ├── CallbackHandler-1.0.lua │ └── CallbackHandler-1.0.xml ├── LibDBIcon-1.0 │ ├── CHANGES.txt │ ├── CallbackHandler-1.0 │ │ └── CallbackHandler-1.0.lua │ ├── LibDBIcon-1.0.toc │ ├── LibDBIcon-1.0 │ │ ├── LibDBIcon-1.0.lua │ │ └── lib.xml │ ├── LibDataBroker-1.1 │ │ └── LibDataBroker-1.1.lua │ ├── LibStub │ │ └── LibStub.lua │ └── embeds.xml ├── LibSharedMedia-3.0 │ ├── LibSharedMedia-3.0.lua │ └── lib.xml └── LibStub │ ├── LibStub.lua │ ├── LibStub.toc │ └── tests │ ├── test.lua │ ├── test2.lua │ ├── test3.lua │ └── test4.lua ├── README.md ├── Rotations ├── DeathKnight │ ├── Blood.lua │ ├── Frost.lua │ ├── Shared.lua │ └── Unholy.lua ├── DemonHunter │ ├── Havoc.lua │ ├── Shared.lua │ └── Vengeance.lua ├── Druid │ ├── Balance.lua │ ├── Guardian.lua │ └── Shared.lua ├── Hunter │ ├── BeastMastery.lua │ └── Shared.lua ├── Mage │ ├── Fire.lua │ ├── Frost.lua │ └── Shared.lua ├── Paladin │ ├── Holy.lua │ ├── Protection.lua │ ├── Retribution.lua │ └── Shared.lua ├── Priest │ ├── Discipline.lua │ ├── Holy.lua │ ├── Shadow.lua │ └── Shared.lua ├── Rogue │ ├── Assassination.lua │ ├── Outlaw.lua │ ├── Shared.lua │ └── Subtlety.lua ├── Warlock │ ├── Affliction.lua │ ├── Demonology.lua │ ├── Destruction.lua │ └── Shared.lua └── Warrior │ ├── Arms.lua │ ├── Fury.lua │ ├── Protection.lua │ └── Shared.lua ├── System ├── Combatlog.lua ├── EventHandler.lua ├── ObjectManager.lua ├── Settings.lua ├── SlashHandler.lua └── WMApi.lua └── UI ├── Debug.lua ├── HUD.lua ├── Log.lua └── Main.lua /Classes/AreaTrigger/AreaTrigger.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local AreaTrigger = DMW.Classes.AreaTrigger 3 | 4 | function AreaTrigger:New(Pointer) 5 | self.Pointer = Pointer 6 | self.Name = ObjectName(Pointer) 7 | self.ObjectID = ObjectID(Pointer) 8 | if self.ObjectID == 12765 then 9 | DMW.Tables.Sanguine[Pointer] = {} 10 | DMW.Tables.Sanguine[Pointer].PosX, DMW.Tables.Sanguine[Pointer].PosY, DMW.Tables.Sanguine[Pointer].PosZ = ObjectPosition(Pointer) 11 | end 12 | end 13 | 14 | function AreaTrigger:Update() 15 | self.NextUpdate = DMW.Time + (math.random(100, 800) / 1000) 16 | self.PosX, self.PosY, self.PosZ = ObjectPosition(self.Pointer) 17 | self.Distance = self:GetDistance() 18 | if not self.Name or self.Name == "" then 19 | self.Name = ObjectName(self.Pointer) 20 | end 21 | self.Tracking = self:IsTracking() 22 | if DMW.Settings.profile.Enemy.DrawDangerous then 23 | self:Drawings() 24 | end 25 | end 26 | 27 | function AreaTrigger:GetDistance(OtherUnit) 28 | OtherUnit = OtherUnit or DMW.Player 29 | return sqrt(((self.PosX - OtherUnit.PosX) ^ 2) + ((self.PosY - OtherUnit.PosY) ^ 2) + ((self.PosZ - OtherUnit.PosZ) ^ 2)) 30 | end 31 | 32 | function AreaTrigger:IsTracking() --TODO: Actual code 33 | return false 34 | end 35 | -------------------------------------------------------------------------------- /Classes/AreaTrigger/Drawings.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local AreaTrigger = DMW.Classes.AreaTrigger 3 | local LibDraw = LibStub("LibDraw-1.0") 4 | 5 | local Triggers = { 6 | [23839] = {"rect", 30, 2}, --First boss 7 | [23813] = {"rect", 40, 2} --Second boss 8 | } 9 | 10 | function AreaTrigger:Drawings() 11 | local Trigger = Triggers[self.ObjectID] 12 | if Trigger then 13 | LibDraw.SetColorRaw(0, 1, 0) 14 | if Trigger[1] == "rect" then 15 | self:DrawRect(Trigger[2], Trigger[3]) 16 | elseif Trigger[1] == "cone" then 17 | self:DrawCone(Trigger[2], Trigger[3]) 18 | end 19 | self.NextUpdate = DMW.Time 20 | end 21 | end 22 | 23 | function AreaTrigger:DrawRect(Length, Width) 24 | local function IsInside(x, y, ax, ay, bx, by, dx, dy) 25 | local bax = bx - ax 26 | local bay = by - ay 27 | local dax = dx - ax 28 | local day = dy - ay 29 | if ((x - ax) * bax + (y - ay) * bay <= 0.0) then 30 | return false 31 | end 32 | if ((x - bx) * bax + (y - by) * bay >= 0.0) then 33 | return false 34 | end 35 | if ((x - ax) * dax + (y - ay) * day <= 0.0) then 36 | return false 37 | end 38 | if ((x - dx) * dax + (y - dy) * day >= 0.0) then 39 | return false 40 | end 41 | return true 42 | end 43 | local Rotation = select(2, ObjectFacing(self.Pointer)) or 0 44 | local halfWidth = Width / 2 45 | local nlX, nlY, nlZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, halfWidth, Rotation + rad(90), 0) 46 | local nrX, nrY, nrZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, halfWidth, Rotation + rad(270), 0) 47 | local flX, flY, flZ = GetPositionFromPosition(nlX, nlY, nlZ, Length, Rotation, 0) 48 | local frX, frY, frZ = GetPositionFromPosition(nrX, nrY, nrZ, Length, Rotation, 0) 49 | if IsInside(DMW.Player.PosX, DMW.Player.PosY, nlX, nlY, nrX, nrY, frX, frY) then 50 | LibDraw.SetColorRaw(1, 0, 0) 51 | end 52 | DMW.Helpers.DrawLineDMW(flX, flY, DMW.Player.PosZ, nlX, nlY, DMW.Player.PosZ) 53 | DMW.Helpers.DrawLineDMW(frX, frY, DMW.Player.PosZ, nrX, nrY, DMW.Player.PosZ) 54 | DMW.Helpers.DrawLineDMW(frX, frY, DMW.Player.PosZ, flX, flY, DMW.Player.PosZ) 55 | DMW.Helpers.DrawLineDMW(nlX, nlY, DMW.Player.PosZ, nrX, nrY, DMW.Player.PosZ) 56 | end 57 | 58 | function AreaTrigger:DrawCone(Angle, Length) 59 | local Rotation = select(2, ObjectFacing(self.Pointer)) 60 | if UnitIsFacing(self.Pointer, "player", Angle / 2) and self:RawDistance(DMW.Player) <= Length then 61 | LibDraw.SetColorRaw(1, 0, 0) 62 | end 63 | LibDraw.Arc(self.PosX, self.PosY, self.PosZ, Length, Angle, Rotation) 64 | end 65 | -------------------------------------------------------------------------------- /Classes/Aura/Cache.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | DMW.Tables.AuraCache = {} 3 | DMW.Functions.AuraCache = {} 4 | local AuraCache = DMW.Functions.AuraCache 5 | local Buff = DMW.Classes.Buff 6 | local Debuff = DMW.Classes.Debuff 7 | 8 | function AuraCache.Refresh(Unit) 9 | if DMW.Tables.AuraCache[Unit] ~= nil then 10 | DMW.Tables.AuraCache[Unit] = nil 11 | end 12 | local AuraReturn, Name, Source 13 | 14 | for i = 1, 40 do 15 | AuraReturn = {UnitBuff(Unit, i)} 16 | Name, Source = GetSpellInfo(AuraReturn[10]), AuraReturn[7] 17 | if AuraReturn[10] == 294027 then 18 | Name = "AvengingWrathAutocrit" 19 | end 20 | if Name == nil then 21 | break 22 | end 23 | if DMW.Tables.AuraCache[Unit] == nil then 24 | DMW.Tables.AuraCache[Unit] = {} 25 | end 26 | if DMW.Tables.AuraCache[Unit][Name] == nil then 27 | DMW.Tables.AuraCache[Unit][Name] = { 28 | ["AuraReturn"] = AuraReturn, 29 | Type = "HELPFUL" 30 | } 31 | end 32 | if Source ~= nil and Source == "player" then 33 | DMW.Tables.AuraCache[Unit][Name]["player"] = { 34 | ["AuraReturn"] = AuraReturn, 35 | Type = "HELPFUL" 36 | } 37 | end 38 | end 39 | 40 | for i = 1, 40 do 41 | AuraReturn = {UnitDebuff(Unit, i)} 42 | Name, Source = GetSpellInfo(AuraReturn[10]), AuraReturn[7] 43 | if Name == nil then 44 | break 45 | end 46 | if DMW.Tables.AuraCache[Unit] == nil then 47 | DMW.Tables.AuraCache[Unit] = {} 48 | end 49 | if DMW.Tables.AuraCache[Unit][Name] == nil then 50 | DMW.Tables.AuraCache[Unit][Name] = { 51 | ["AuraReturn"] = AuraReturn, 52 | Type = "HARMFUL" 53 | } 54 | end 55 | if Source ~= nil and Source == "player" then 56 | DMW.Tables.AuraCache[Unit][Name]["player"] = { 57 | ["AuraReturn"] = AuraReturn, 58 | Type = "HARMFUL" 59 | } 60 | end 61 | end 62 | end 63 | 64 | function AuraCache.Event(...) 65 | 66 | local timeStamp, event, hideCaster, sourceGUID, sourceName, sourceFlags, 67 | sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId, spellName, spellSchool = ... 68 | 69 | local dest = GetObjectWithGUID(destGUID) 70 | if dest and (event == "SPELL_AURA_APPLIED" or event == "SPELL_AURA_APPLIED_DOSE" or event == "SPELL_AURA_REMOVED_DOSE" or event == "SPELL_AURA_REFRESH" or event == "SPELL_AURA_REMOVED" or event == "SPELL_PERIODIC_AURA_REMOVED") then 71 | AuraCache.Refresh(dest) 72 | elseif dest and DMW.Enums.AuraRefresh[spellId] then 73 | C_Timer.After( 74 | 0.6, 75 | function() 76 | AuraCache.Refresh(dest) 77 | end 78 | ) 79 | end 80 | end 81 | 82 | function Buff:Query(Unit, OnlyPlayer) 83 | OnlyPlayer = OnlyPlayer or false 84 | Unit = Unit.Pointer 85 | if DMW.Tables.AuraCache[Unit] ~= nil and DMW.Tables.AuraCache[Unit][self.SpellName] ~= nil and (not OnlyPlayer or DMW.Tables.AuraCache[Unit][self.SpellName]["player"] ~= nil) then 86 | local AuraReturn 87 | if OnlyPlayer then 88 | AuraReturn = DMW.Tables.AuraCache[Unit][self.SpellName]["player"].AuraReturn 89 | else 90 | AuraReturn = DMW.Tables.AuraCache[Unit][self.SpellName].AuraReturn 91 | end 92 | return unpack(AuraReturn) 93 | end 94 | return nil 95 | end 96 | 97 | function Debuff:Query(Unit, OnlyPlayer) 98 | OnlyPlayer = OnlyPlayer or false 99 | Unit = Unit.Pointer 100 | if DMW.Tables.AuraCache[Unit] ~= nil and DMW.Tables.AuraCache[Unit][self.SpellName] ~= nil and (not OnlyPlayer or DMW.Tables.AuraCache[Unit][self.SpellName]["player"] ~= nil) then 101 | local AuraReturn 102 | if OnlyPlayer then 103 | AuraReturn = DMW.Tables.AuraCache[Unit][self.SpellName]["player"].AuraReturn 104 | else 105 | AuraReturn = DMW.Tables.AuraCache[Unit][self.SpellName].AuraReturn 106 | end 107 | return unpack(AuraReturn) 108 | end 109 | return nil 110 | end -------------------------------------------------------------------------------- /Classes/Aura/DotTracker.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | DMW.Tables.PMultiplier = {} 3 | DMW.Tables.Exsanguinated = {} 4 | local Debuff = DMW.Classes.Debuff 5 | 6 | function Debuff:PMultiplier(Unit) 7 | Unit = Unit or DMW.Player.Target 8 | if not DMW.Tables.PMultiplier[self.SpellName] then 9 | DMW.Tables.PMultiplier[self.SpellName] = {} 10 | end 11 | if DMW.Tables.PMultiplier[self.SpellName][Unit.GUID] then 12 | return DMW.Tables.PMultiplier[self.SpellName][Unit.GUID] 13 | end 14 | return 1 15 | end 16 | 17 | function Debuff:Exsanguinated(Unit) 18 | Unit = Unit or DMW.Player.Target 19 | if not DMW.Tables.Exsanguinated[self.SpellName] then 20 | DMW.Tables.Exsanguinated[self.SpellName] = {} 21 | end 22 | return DMW.Tables.Exsanguinated[self.SpellName][Unit.GUID] ~= nil 23 | end 24 | 25 | function Debuff:SetPMultiplier(GUID) 26 | if not DMW.Tables.PMultiplier[self.SpellName] then 27 | DMW.Tables.PMultiplier[self.SpellName] = {} 28 | end 29 | if DMW.Player.SpecID == 259 then 30 | if DMW.Rotations.ROGUE.Stealth() then 31 | if DMW.Player.Talents.Subterfuge.Active and self.SpellID == DMW.Player.Debuffs.Garrote.SpellID then 32 | DMW.Tables.PMultiplier[self.SpellName][GUID] = 1.8 33 | elseif DMW.Player.Talents.Nightstalker.Active then 34 | DMW.Tables.PMultiplier[self.SpellName][GUID] = 1.5 35 | end 36 | end 37 | end 38 | end 39 | 40 | function Debuff:ResetPMultiplier(GUID) 41 | if not DMW.Tables.PMultiplier[self.SpellName] then 42 | DMW.Tables.PMultiplier[self.SpellName] = {} 43 | end 44 | if DMW.Tables.PMultiplier[self.SpellName][GUID] then 45 | DMW.Tables.PMultiplier[self.SpellName][GUID] = nil 46 | end 47 | end 48 | 49 | function Debuff:AddExsanguinate(GUID) 50 | if not DMW.Tables.Exsanguinated[self.SpellName] then 51 | DMW.Tables.Exsanguinated[self.SpellName] = {} 52 | end 53 | DMW.Tables.Exsanguinated[self.SpellName][GUID] = true 54 | end 55 | 56 | function Debuff:ResetExsanguinate(GUID) 57 | if not DMW.Tables.Exsanguinated[self.SpellName] then 58 | DMW.Tables.Exsanguinated[self.SpellName] = {} 59 | end 60 | if DMW.Tables.Exsanguinated[self.SpellName][GUID] then 61 | DMW.Tables.Exsanguinated[self.SpellName][GUID] = nil 62 | end 63 | end -------------------------------------------------------------------------------- /Classes/Classes.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | DMW.Classes = {} 3 | local Classes = DMW.Classes 4 | local function Class() 5 | local cls = {} 6 | cls.__index = cls 7 | setmetatable( 8 | cls, 9 | { 10 | __call = function(self, ...) 11 | local instance = setmetatable({}, self) 12 | instance:New(...) 13 | return instance 14 | end 15 | } 16 | ) 17 | return cls 18 | end 19 | 20 | Classes.Spell = Class() 21 | Classes.Buff = Class() 22 | Classes.Debuff = Class() 23 | Classes.Unit = Class() 24 | Classes.LocalPlayer = Class() 25 | Classes.Item = Class() 26 | Classes.GameObject = Class() 27 | Classes.AreaTrigger = Class() -------------------------------------------------------------------------------- /Classes/GameObject/GameObject.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local GameObject = DMW.Classes.GameObject 3 | 4 | function GameObject:New(Pointer) 5 | self.Pointer = Pointer 6 | self.Name = ObjectName(Pointer) 7 | self.ObjectID = ObjectID(Pointer) 8 | self.TypeID, self.Type = GetGameObjectType(Pointer) 9 | end 10 | 11 | function GameObject:Update() 12 | self.NextUpdate = DMW.Time + (math.random(100, 800) / 1000) 13 | self.PosX, self.PosY, self.PosZ = ObjectPosition(self.Pointer) 14 | self.Distance = self:GetDistance() 15 | if not self.Name or self.Name == "" then 16 | self.Name = ObjectName(self.Pointer) 17 | end 18 | self.Herb = self:IsHerb() 19 | self.Ore = self:IsOre() 20 | self.Tracking = self:IsTracking() 21 | self.IsQuest = self:IsQuestObject() 22 | if self.TypeID == 17 and (DMW.Settings.profile.Gatherers.FishingHelper or DMW.Settings.profile.Gatherers.AutoFishing) and DMW.Player.Casting and DMW.Player.Casting == DMW.Player.Spells.Fishing.SpellName then 23 | self:Fishing() 24 | end 25 | end 26 | 27 | function GameObject:GetDistance(OtherUnit) 28 | OtherUnit = OtherUnit or DMW.Player 29 | return sqrt(((self.PosX - OtherUnit.PosX) ^ 2) + ((self.PosY - OtherUnit.PosY) ^ 2) + ((self.PosZ - OtherUnit.PosZ) ^ 2)) 30 | end 31 | 32 | local glow = 0 33 | function GameObject:IsQuestObject() --TODO: Better code 34 | glow = ObjectDynamicFlags(self.Pointer) or 0 35 | if bit.band(glow, 0x4) ~= 0 or bit.band(glow, 0x20) ~= 0 then 36 | return true 37 | end 38 | return false 39 | end 40 | 41 | function GameObject:IsHerb() 42 | if DMW.Enums.Tracker.Herbs[self.ObjectID] and ObjectDynamicFlags(self.Pointer) == 0x00 then 43 | return true 44 | end 45 | return false 46 | end 47 | 48 | function GameObject:IsOre() 49 | if DMW.Enums.Tracker.Ore[self.ObjectID] and ObjectDynamicFlags(self.Pointer) == 0x00 then 50 | return true 51 | end 52 | return false 53 | end 54 | 55 | function GameObject:IsTracking() 56 | return false 57 | end 58 | 59 | function GameObject:Fishing() 60 | if ObjectAnimation(self.Pointer) == 1 and UnitIsUnit("player", ObjectCreator(self.Pointer)) then 61 | self.NextUpdate = DMW.Time + 0.1 62 | if not self.BobbingTime then 63 | self.BobbingTime = DMW.Time + (math.random(450, 850) / 1000) 64 | elseif self.BobbingTime < DMW.Time then 65 | ObjectInteract(self.Pointer) 66 | self.BobbingTime = false 67 | end 68 | return 69 | end 70 | if self.BobbingTime then 71 | self.BobbingTime = false 72 | end 73 | end -------------------------------------------------------------------------------- /Classes/Item/Item.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local Item = DMW.Classes.Item 3 | 4 | function Item:New(ItemID) 5 | self.ItemID = ItemID 6 | self.ItemName = GetItemInfo(ItemID) 7 | self.SpellName, self.SpellID = GetItemSpell(ItemID) 8 | self.Cache = {} 9 | end 10 | 11 | function Item:Equipped() 12 | return DMW.Player.EquipmentID[self.ItemID] ~= nil 13 | end 14 | 15 | function Item:CD() 16 | if DMW.Pulses == self.Cache.CDUpdate then 17 | return self.Cache.CD 18 | end 19 | self.Cache.CDUpdate = DMW.Pulses 20 | local Start, Duration, Enable = GetItemCooldown(self.ItemID) 21 | if Enable == 0 then 22 | return 99 23 | end 24 | local CD = Start + Duration - DMW.Time 25 | self.Cache.CD = CD > 0 and CD or 0 26 | return self.Cache.CD 27 | end 28 | 29 | function Item:IsReady() 30 | return IsUsableItem(self.ItemID) and self:CD() == 0 31 | end 32 | 33 | function Item:Use(Unit) 34 | Unit = Unit or DMW.Player 35 | if self.SpellID and self:IsReady() then 36 | UseItemByName(self.ItemName, Unit.Pointer) 37 | return true 38 | end 39 | return false 40 | end -------------------------------------------------------------------------------- /Classes/LocalPlayer/Enemy.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local LocalPlayer = DMW.Classes.LocalPlayer 3 | 4 | local function IsInside(x, y, ax, ay, bx, by, dx, dy) -- Stolen at BadRotations 5 | local bax = bx - ax 6 | local bay = by - ay 7 | local dax = dx - ax 8 | local day = dy - ay 9 | if ((x - ax) * bax + (y - ay) * bay <= 0.0) then 10 | return false 11 | end 12 | if ((x - bx) * bax + (y - by) * bay >= 0.0) then 13 | return false 14 | end 15 | if ((x - ax) * dax + (y - ay) * day <= 0.0) then 16 | return false 17 | end 18 | if ((x - dx) * dax + (y - dy) * day >= 0.0) then 19 | return false 20 | end 21 | return true 22 | end 23 | 24 | function LocalPlayer:AutoTarget(Yards, Facing) 25 | local Facing = Facing or false 26 | if (not self.Target or self.Target.Dead) and self.Combat then 27 | for _, Unit in ipairs(DMW.Enemies) do 28 | if Unit.Distance <= Yards and not Facing or Unit.Facing == true then 29 | TargetUnit(Unit.Pointer) 30 | return true 31 | end 32 | end 33 | end 34 | end 35 | 36 | function LocalPlayer:GetEnemies(Yards) 37 | local Table = {} 38 | local Count = 0 39 | if DMW.Settings.profile.HUD.Mode and DMW.Settings.profile.HUD.Mode == 2 then 40 | if self.Target and self.Target.ValidEnemy and self.Target.Distance <= Yards then 41 | table.insert(Table, self.Target) 42 | Count = 1 43 | end 44 | return Table, Count 45 | end 46 | for _, Unit in ipairs(DMW.Enemies) do 47 | if Unit.Distance <= Yards then 48 | table.insert(Table, Unit) 49 | Count = Count + 1 50 | end 51 | end 52 | return Table, Count 53 | end 54 | 55 | function LocalPlayer:GetAttackable(Yards) 56 | local Table = {} 57 | local Count = 0 58 | for _, Unit in ipairs(DMW.Attackable) do 59 | if Unit.Distance <= Yards then 60 | table.insert(Table, Unit) 61 | Count = Count + 1 62 | end 63 | end 64 | return Table, Count 65 | end 66 | 67 | function LocalPlayer:GetEnemiesInRect(Length, Width, TTD) 68 | local Count = 0 69 | local Table, TableCount = self:GetEnemies(Length) 70 | if TableCount > 0 then 71 | TTD = TTD or 0 72 | local Facing = ObjectFacing(self.Pointer) 73 | local nlX, nlY, nlZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, Width / 2, Facing + math.rad(90), 0) 74 | local nrX, nrY, nrZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, Width / 2, Facing + math.rad(270), 0) 75 | local frX, frY, frZ = GetPositionFromPosition(nrX, nrY, nrZ, Length, Facing, 0) 76 | for _, Unit in pairs(Table) do 77 | if IsInside(Unit.PosX, Unit.PosY, nlX, nlY, nrX, nrY, frX, frY) and Unit.TTD >= TTD then 78 | Count = Count + 1 79 | end 80 | end 81 | end 82 | return Count 83 | end 84 | 85 | function LocalPlayer:GetEnemiesInCone(Length, Angle, TTD) 86 | local Count = 0 87 | local Table, TableCount = self:GetEnemies(Length) 88 | if TableCount > 0 then 89 | TTD = TTD or 0 90 | local Facing = ObjectFacing(self.Pointer) 91 | for _, Unit in pairs(Table) do 92 | if Unit.TTD >= TTD and UnitIsFacing(self.Pointer, Unit.Pointer, Angle / 2) then 93 | Count = Count + 1 94 | end 95 | end 96 | end 97 | return Count 98 | end 99 | -------------------------------------------------------------------------------- /Classes/LocalPlayer/Friend.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local LocalPlayer = DMW.Classes.LocalPlayer 3 | 4 | local function IsInside(x, y, ax, ay, bx, by, dx, dy) -- Stolen at BadRotations 5 | local bax = bx - ax 6 | local bay = by - ay 7 | local dax = dx - ax 8 | local day = dy - ay 9 | if ((x - ax) * bax + (y - ay) * bay <= 0.0) then 10 | return false 11 | end 12 | if ((x - bx) * bax + (y - by) * bay >= 0.0) then 13 | return false 14 | end 15 | if ((x - ax) * dax + (y - ay) * day <= 0.0) then 16 | return false 17 | end 18 | if ((x - dx) * dax + (y - dy) * day >= 0.0) then 19 | return false 20 | end 21 | return true 22 | end 23 | 24 | function LocalPlayer:GetFriends(Yards, HP) 25 | local Table = {} 26 | local Count = 0 27 | for _, v in ipairs(DMW.Friends.Units) do 28 | if v.Distance <= Yards and (not HP or v.HP < HP) then 29 | table.insert(Table, v) 30 | Count = Count + 1 31 | end 32 | end 33 | return Table, Count 34 | end 35 | 36 | function LocalPlayer:GetFriendsInCone(Length, Angle, HP) 37 | local Count = 0 38 | local Table, TableCount = self:GetFriends(Length) 39 | if TableCount > 0 then 40 | HP = HP or 100 41 | local Facing = ObjectFacing(self.Pointer) 42 | for _, Unit in pairs(Table) do 43 | if Unit.HP <= HP and UnitIsFacing(self.Pointer, Unit.Pointer, Angle/2) then 44 | Count = Count + 1 45 | end 46 | end 47 | end 48 | return Count 49 | end 50 | 51 | function LocalPlayer:GetFriendsInRect(Length, Width, HP) 52 | local Count = 0 53 | local Table, TableCount = self:GetFriends(Length) 54 | if TableCount > 0 then 55 | TTD = TTD or 0 56 | local Facing = ObjectFacing(self.Pointer) 57 | local nlX, nlY, nlZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, Width / 2, Facing + math.rad(90), 0) 58 | local nrX, nrY, nrZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, Width / 2, Facing + math.rad(270), 0) 59 | local frX, frY, frZ = GetPositionFromPosition(nrX, nrY, nrZ, Length, Facing, 0) 60 | for _, Unit in pairs(Table) do 61 | if Unit.HP <= HP and IsInside(Unit.PosX, Unit.PosY, nlX, nlY, nrX, nrY, frX, frY) then 62 | Count = Count + 1 63 | end 64 | end 65 | end 66 | return Count 67 | end -------------------------------------------------------------------------------- /Classes/LocalPlayer/Loaders.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local LocalPlayer = DMW.Classes.LocalPlayer 3 | local Spell = DMW.Classes.Spell 4 | local Buff = DMW.Classes.Buff 5 | local Debuff = DMW.Classes.Debuff 6 | local AzeriteItem, AzeriteEmpoweredItem = C_AzeriteItem, C_AzeriteEmpoweredItem 7 | 8 | function LocalPlayer:GetSpells() 9 | self.Spells = {} 10 | self.Buffs = {} 11 | self.Debuffs = {} 12 | local CastType, Duration 13 | for Class, ClassTable in pairs(DMW.Enums.Spells) do 14 | if Class == "GLOBAL" or Class == self.Class then 15 | for Spec, SpecTable in pairs(ClassTable) do 16 | if Spec == "All" or Spec == self.Spec then 17 | for SpellType, SpellTable in pairs(SpecTable) do 18 | if SpellType == "Abilities" then 19 | for SpellName, SpellInfo in pairs(SpellTable) do 20 | CastType = SpellInfo.CastType or "Normal" 21 | self.Spells[SpellName] = Spell(SpellInfo.SpellID, CastType, SpellInfo.SpellType) 22 | end 23 | elseif SpellType == "Buffs" then 24 | for SpellName, SpellInfo in pairs(SpellTable) do 25 | if type(SpellInfo) ~= "number" then 26 | self.Buffs[SpellName] = Buff(SpellInfo.SpellID) 27 | else 28 | self.Buffs[SpellName] = Buff(SpellInfo) 29 | end 30 | end 31 | elseif SpellType == "Debuffs" then 32 | for SpellName, SpellInfo in pairs(SpellTable) do 33 | Duration = SpellInfo.BaseDuration or nil 34 | self.Debuffs[SpellName] = Debuff(SpellInfo.SpellID, Duration) 35 | end 36 | end 37 | end 38 | end 39 | end 40 | end 41 | end 42 | end 43 | 44 | function LocalPlayer:GetTalents() 45 | local Selected 46 | local ActiveSpec = GetActiveSpecGroup() 47 | if self.Talents then 48 | table.wipe(self.Talents) 49 | else 50 | self.Talents = {} 51 | end 52 | for TalentName, TalentID in pairs(DMW.Enums.Spells[self.Class][self.Spec].Talents) do 53 | Selected = select(4, GetTalentInfoByID(TalentID, ActiveSpec)) 54 | if Selected then 55 | self.Talents[TalentName] = {Active = true, Value = 1} 56 | else 57 | self.Talents[TalentName] = {Active = false, Value = 0} 58 | end 59 | end 60 | if DMW.Enums.Spells[self.Class].All.Talents then 61 | for TalentName, TalentID in pairs(DMW.Enums.Spells[self.Class].All.Talents) do 62 | Selected = select(4, GetTalentInfoByID(TalentID, ActiveSpec)) 63 | if Selected then 64 | self.Talents[TalentName] = {Active = true, Value = 1} 65 | else 66 | self.Talents[TalentName] = {Active = false, Value = 0} 67 | end 68 | end 69 | end 70 | end 71 | 72 | function LocalPlayer:UpdateEquipment() 73 | table.wipe(self.Equipment) 74 | table.wipe(self.EquipmentID) 75 | table.wipe(self.Runeforge) 76 | self.Items.Trinket1 = nil 77 | self.Items.Trinket2 = nil 78 | local FoundRuneforge = false 79 | local ItemID 80 | for i = 1, 19 do 81 | ItemID = GetInventoryItemID("player", i) 82 | if ItemID then 83 | self.EquipmentID[ItemID] = true 84 | self.Equipment[i] = ItemID 85 | if i == 13 then 86 | self.Items.Trinket1 = DMW.Classes.Item(ItemID) 87 | elseif i == 14 then 88 | self.Items.Trinket2 = DMW.Classes.Item(ItemID) 89 | end 90 | if not FoundRuneforge then 91 | local string = GetInventoryItemLink("player", i) 92 | if string then 93 | local LegendaryID = select(15, strsplit(":", string)) 94 | if DMW.Enums.Runeforge[tonumber(legID)] then 95 | self.Runeforge[DMW.Enums.Runeforge[tonumber(LegendaryID)]] = true 96 | FoundRuneforge = true 97 | end 98 | end 99 | end 100 | end 101 | end 102 | end 103 | 104 | function LocalPlayer:GetItems() 105 | local Item = DMW.Classes.Item 106 | for Name, ItemID in pairs(DMW.Enums.Items) do 107 | self.Items[Name] = Item(ItemID) 108 | end 109 | end 110 | 111 | function LocalPlayer:GetCovenantData() 112 | table.wipe(self.Conduits) 113 | local ActiveCovenantID = C_Covenants.GetActiveCovenantID() 114 | if ActiveCovenantID > 0 then 115 | local CovenantData = C_Covenants.GetCovenantData(ActiveCovenantID) 116 | if CovenantData then 117 | self.Covenant = CovenantData.textureKit 118 | end 119 | local Data = C_Soulbinds.GetSoulbindData(C_Soulbinds.GetActiveSoulbindID()) 120 | for _, node in pairs(Data.tree.nodes) do 121 | if node.state == 3 and node.conduitID and DMW.Enums.Conduits[node.conduitID] then 122 | self.Conduits[DMW.Enums.Conduits[node.conduitID]] = true 123 | end 124 | end 125 | end 126 | end -------------------------------------------------------------------------------- /Classes/LocalPlayer/LocalPlayer.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local LocalPlayer = DMW.Classes.LocalPlayer 3 | 4 | function LocalPlayer:New(Pointer) 5 | self.Pointer = Pointer 6 | self.Name = "LocalPlayer" 7 | self.CombatReach = UnitCombatReach(Pointer) 8 | self.PosX, self.PosY, self.PosZ = ObjectPosition(Pointer) 9 | self.GUID = ObjectGUID(Pointer) 10 | self.Class = select(2, UnitClass(Pointer)):gsub("%s+", "") 11 | self.Level = UnitLevel(Pointer) 12 | self.SpecID = GetSpecializationInfo(GetSpecialization()) 13 | self.Spec = DMW.Enums.Specs[self.SpecID] or "" 14 | self.Distance = 0 15 | self.Combat = UnitAffectingCombat(self.Pointer) and DMW.Time or false 16 | self.EID = false 17 | self.NoControl = false 18 | DMW.Functions.AuraCache.Refresh(Pointer) 19 | self:GetSpells() 20 | self:GetTalents() 21 | self.Equipment = {} 22 | self.Runeforge = {} 23 | self.Conduits = {} 24 | self.EquipmentID = {} 25 | self.Items = {} 26 | self:UpdateEquipment() 27 | self:GetItems() 28 | self:GetCovenantData() 29 | self.Player = true 30 | self.Height = 2 31 | DMW.Helpers.Queue.GetBindings() 32 | end 33 | 34 | function LocalPlayer:Update() 35 | self.PosX, self.PosY, self.PosZ = ObjectPosition(self.Pointer) 36 | self.Health = UnitHealth(self.Pointer) 37 | self.HealthMax = UnitHealthMax(self.Pointer) 38 | self.HP = self.Health / self.HealthMax * 100 39 | self.Power = UnitPower(self.Pointer) 40 | self.PowerMax = UnitPowerMax(self.Pointer) 41 | self.PowerDeficit = self.PowerMax - self.Power 42 | self.PowerPct = self.Power / self.PowerMax * 100 43 | self.PowerRegen = GetPowerRegen() 44 | if self.Class == "ROGUE" or self.Class == "DRUID" then 45 | self.ComboPoints = UnitPower(self.Pointer, 4) 46 | self.ComboMax = UnitPowerMax(self.Pointer, 4) 47 | self.ComboDeficit = self.ComboMax - self.ComboPoints 48 | elseif self.SpecID == 70 then 49 | self.HolyPower = UnitPower(self.Pointer, 9) 50 | self.HolyPowerMax = UnitPowerMax(self.Pointer, 9) 51 | self.HolyPowerDeficit = self.HolyPowerMax - self.HolyPower 52 | elseif self.Class == "DEATHKNIGHT" then 53 | self.Runes = self:GetRunes() 54 | end 55 | if not self.Combat and UnitAffectingCombat("player") then 56 | self.Combat = DMW.Time 57 | end 58 | self.InInstance, self.Instance = IsInInstance() 59 | self.Casting = UnitCastingInfo(self.Pointer) or UnitChannelInfo(self.Pointer) 60 | self.Moving = GetUnitSpeed(self.Pointer) > 0 61 | self.MovingTime = self:TimeMoving() 62 | self.PetActive = UnitIsVisible("pet") 63 | self.InGroup = IsInGroup() 64 | self.CombatTime = self.Combat and (DMW.Time - self.Combat) or 0 65 | self.Resting = IsResting() 66 | end 67 | 68 | function LocalPlayer:GCD() 69 | if DMW.Enums.GCDOneSec[self.SpecID] then 70 | return 1 71 | else 72 | return math.max(1.5 / (1 + GetHaste() / 100), 0.75) 73 | end 74 | end 75 | 76 | function LocalPlayer:GCDMax() 77 | if DMW.Enums.GCDOneSec[self.SpecID] then 78 | return 1 79 | else 80 | return 1.5 81 | end 82 | end 83 | 84 | local movingTimer = GetTime() 85 | function LocalPlayer:TimeMoving() 86 | if not self.Moving then 87 | movingTimer = DMW.Time 88 | end 89 | return DMW.Time - movingTimer 90 | end 91 | 92 | function LocalPlayer:CDs() 93 | if DMW.Settings.profile.HUD.CDs and DMW.Settings.profile.HUD.CDs == 3 then 94 | return false 95 | elseif DMW.Settings.profile.HUD.CDs and DMW.Settings.profile.HUD.CDs == 2 and self.Target and self.Target.TTD > 4 then 96 | return true 97 | elseif self.Target and self.Target:IsBoss() and self.Target.TTD > 4 then 98 | return true 99 | end 100 | return false 101 | end 102 | 103 | function LocalPlayer:CritPct() 104 | return GetCritChance() 105 | end 106 | 107 | function LocalPlayer:TTM() 108 | local PowerMissing = self.PowerMax - self.Power 109 | if PowerMissing > 0 then 110 | return PowerMissing / self.PowerRegen 111 | else 112 | return 0 113 | end 114 | end 115 | 116 | function LocalPlayer:Standing() --wait for fix?? 117 | return true 118 | -- if ObjectDescriptor("player", GetOffset("CGUnitData__AnimTier"), Types.Byte) == 0 then 119 | -- return true 120 | -- end 121 | -- return false 122 | end 123 | 124 | function LocalPlayer:HasFlag(Flag) 125 | return bit.band(ObjectDescriptor(self.Pointer, GetOffset("CGUnitData__Flags"), "int"), Flag) > 0 126 | end 127 | 128 | function LocalPlayer:HasMovementFlag(Flag) 129 | local SelfFlag = UnitMovementFlags(self.Pointer) 130 | if SelfFlag then 131 | return bit.band(UnitMovementFlags(self.Pointer), Flag) > 0 132 | end 133 | return false 134 | end 135 | 136 | function LocalPlayer:GetFreeBagSlots() 137 | local Slots = 0 138 | local Temp 139 | for i = 0, 4, 1 do 140 | Slots = Slots + GetContainerNumFreeSlots(i) 141 | end 142 | return Slots 143 | end 144 | 145 | function LocalPlayer:HasItemEquipped(ItemID) 146 | return DMW.Player.EquipmentID[ItemID] ~= nil 147 | end 148 | 149 | function LocalPlayer:Dispel(Spell) 150 | return DMW.Units[self.Pointer]:Dispel(Spell) 151 | end 152 | 153 | function LocalPlayer:GetRunes() 154 | local Count = 0 155 | if GetRuneCount(1) then 156 | for i=1,6 do 157 | Count = Count + GetRuneCount(i) 158 | end 159 | end 160 | return Count 161 | end 162 | 163 | function LocalPlayer:AuraByID(SpellID, OnlyPlayer) 164 | OnlyPlayer = OnlyPlayer or false 165 | local SpellName = GetSpellInfo(SpellID) 166 | local Unit = self.Pointer 167 | if DMW.Tables.AuraCache[Unit] ~= nil and DMW.Tables.AuraCache[Unit][SpellName] ~= nil and (not OnlyPlayer or DMW.Tables.AuraCache[Unit][SpellName]["player"] ~= nil) then 168 | local AuraReturn 169 | if OnlyPlayer then 170 | AuraReturn = DMW.Tables.AuraCache[Unit][SpellName]["player"].AuraReturn 171 | else 172 | AuraReturn = DMW.Tables.AuraCache[Unit][SpellName].AuraReturn 173 | end 174 | return unpack(AuraReturn) 175 | end 176 | return nil 177 | end -------------------------------------------------------------------------------- /Classes/Spell/LastCast.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local WaitForSuccess = 0 3 | local lastCastFrame = CreateFrame("Frame") 4 | local Spell = DMW.Classes.Spell 5 | 6 | function Spell:LastCast(Index) 7 | Index = Index or 1 8 | if DMW.Player.LastCast and DMW.Player.LastCast[Index] then 9 | return DMW.Player.LastCast[Index].SpellName == self.SpellName 10 | end 11 | return false 12 | end 13 | 14 | local function AddSpell(SpellID) 15 | if not DMW.Player.LastCast then 16 | DMW.Player.LastCast = {} 17 | end 18 | for k, v in pairs(DMW.Player.Spells) do 19 | if v.SpellName == GetSpellInfo(SpellID) then 20 | local Temp = {} 21 | v.LastCastTime = DMW.Time 22 | Temp.SpellName = v.SpellName 23 | Temp.CastTime = DMW.Time 24 | tinsert(DMW.Player.LastCast, 1, Temp) 25 | if #DMW.Player.LastCast == 10 then 26 | DMW.Player.LastCast[10] = nil 27 | end 28 | return true 29 | end 30 | end 31 | return false 32 | end 33 | 34 | local function EventTracker(self, event, ...) 35 | local SourceUnit = select(1, ...) 36 | local SpellID = select(3, ...) 37 | if SourceUnit == "player" and EWT and DMW.Player.Spells then 38 | if event == "UNIT_SPELLCAST_START" then 39 | if AddSpell(SpellID) then 40 | WaitForSuccess = SpellID 41 | end 42 | elseif event == "UNIT_SPELLCAST_SUCCEEDED" then 43 | if WaitForSuccess == SpellID then 44 | DMW.Player.LastCast[1].SuccessTime = DMW.Time 45 | WaitForSuccess = 0 46 | else 47 | if AddSpell(SpellID) then 48 | DMW.Player.LastCast[1].SuccessTime = DMW.Time 49 | end 50 | end 51 | elseif event == "UNIT_SPELLCAST_STOP" then 52 | if WaitForSuccess == SpellID then 53 | tremove(DMW.Player.LastCast,1) 54 | WaitForSuccess = 0 55 | end 56 | end 57 | end 58 | end 59 | 60 | lastCastFrame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") 61 | lastCastFrame:RegisterEvent("UNIT_SPELLCAST_STOP") 62 | lastCastFrame:RegisterEvent("UNIT_SPELLCAST_START") 63 | lastCastFrame:SetScript("OnEvent", EventTracker) -------------------------------------------------------------------------------- /Classes/Spell/Spell.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local Spell = DMW.Classes.Spell 3 | 4 | function Spell:New(SpellID, CastType, SpellType) 5 | self.SpellID = SpellID 6 | self.SpellType = SpellType or "Normal" 7 | self.SpellName = GetSpellInfo(self.SpellID) 8 | self.BaseCD = GetSpellBaseCooldown(self.SpellID) / 1000 9 | self.BaseGCD = select(2, GetSpellBaseCooldown(self.SpellID)) / 1000 10 | self.MinRange = select(5,GetSpellInfo(self.SpellID)) or 0 11 | self.MaxRange = select(6,GetSpellInfo(self.SpellID)) or 0 12 | self.Cost = 0 13 | self.CastType = CastType or "Normal" -- Ground, Normal, Pet ect. 14 | self.IsHarmful = IsHarmfulSpell(self.SpellName) or false 15 | self.IsHelpful = IsHelpfulSpell(self.SpellName) or false 16 | self.LastCastTime = 0 17 | self.LastBotTarget = "" 18 | local costTable = GetSpellPowerCost(self.SpellName) 19 | if costTable then 20 | for _, costInfo in pairs(costTable) do 21 | if costInfo.cost > 0 then 22 | self.Cost = costInfo.cost 23 | end 24 | if costInfo.costPerSec > 0 then 25 | self.Cost = costInfo.costPerSec 26 | self.CastType = "Channel" 27 | end 28 | end 29 | end 30 | end 31 | 32 | function Spell:Count() 33 | return GetSpellCount(self.SpellName) 34 | end 35 | 36 | function Spell:CD() 37 | if DMW.Pulses == self.CDUpdate then 38 | return self.CDCache 39 | end 40 | self.CDUpdate = DMW.Pulses 41 | local LocStart, LocDuration = GetSpellLossOfControlCooldown(self.SpellName) 42 | local Start, CD = GetSpellCooldown(self.SpellName) 43 | if not Start then 44 | Start, CD = GetSpellCooldown(self.SpellID) 45 | end 46 | if LocStart and (LocStart + LocDuration) > (Start + CD) then 47 | Start = LocStart 48 | CD = LocDuration 49 | end 50 | local FinalCD = 0 51 | if Start > 0 and CD > 0 then 52 | FinalCD = Start + CD - DMW.Time 53 | else 54 | self.CDCache = 0 55 | return 0 56 | end 57 | FinalCD = FinalCD - 0.1 58 | if FinalCD < 0 then FinalCD = 0 end 59 | self.CDCache = FinalCD 60 | return FinalCD 61 | end 62 | 63 | function Spell:IsReady() 64 | -- for k, v in pairs(DMW.Player.Spells) do 65 | -- if v.CastType ~= "Special" and IsCurrentSpell(v.SpellID) then 66 | -- return false 67 | -- end 68 | -- end 69 | if self:IsKnown() and IsUsableSpell(self.SpellName) and self:CD() == 0 then 70 | return true 71 | end 72 | return false 73 | end 74 | 75 | function Spell:IsKnown() 76 | if GetSpellInfo(self.SpellName) then 77 | return true 78 | end 79 | return false 80 | end 81 | 82 | function Spell:Charges() 83 | return GetSpellCharges(self.SpellName) 84 | end 85 | 86 | function Spell:ChargesFrac() 87 | local Charges, MaxCharges, Start, Duration = GetSpellCharges(self.SpellName) 88 | if Charges ~= MaxCharges then 89 | return Charges + (1 - (Start + Duration - DMW.Time) / Duration) 90 | else 91 | return Charges 92 | end 93 | end 94 | 95 | function Spell:MaxCharges() 96 | return select(2, GetSpellCharges(self.SpellName)) 97 | end 98 | 99 | function Spell:RechargeTime() 100 | local Charges, MaxCharges, Start, Duration = GetSpellCharges(self.SpellName) 101 | if Charges ~= MaxCharges then 102 | return Start + Duration - DMW.Time 103 | else 104 | return 0 105 | end 106 | end 107 | 108 | function Spell:FullRechargeTime() 109 | local Charges, MaxCharges, Start, Duration = GetSpellCharges(self.SpellName) 110 | if Charges ~= MaxCharges then 111 | local ChargesFracRemain = MaxCharges - (Charges + (1 - (Start + Duration - DMW.Time) / Duration)) 112 | return ChargesFracRemain * Duration 113 | else 114 | return 0 115 | end 116 | end 117 | 118 | function Spell:CastTime() 119 | local CastTime = select(4, GetSpellInfo(self.SpellName)) 120 | if CastTime and CastTime > 0 then 121 | return CastTime / 1000 122 | else 123 | return 0 124 | end 125 | end 126 | 127 | --Very messy way to do this? 128 | function Spell:Ticking() 129 | if DMW.Player:AuraByID(self.SpellID) then 130 | return true 131 | end 132 | end -------------------------------------------------------------------------------- /Classes/Unit/Drawings.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local Unit = DMW.Classes.Unit 3 | local LibDraw = LibStub("LibDraw-1.0") 4 | 5 | local Casts = { 6 | --Shadowlands Credit Immy 7 | --NecroticWake 8 | [324323] = {"cone", 5, 120}, --Gruesome Cleave 9 | -- [333489] = {"rect", 25, 10}, --Amarth Necrotic Breath??????????????????????? 10 | [333477] = {"cone", 10, 60}, -- Gut Slice 11 | --De Other Side 12 | [334051] = {"rect", 20, 7}, --Erupting Darkness 13 | --Mists of Tirna Scithe 14 | [323137] = {"cone", 35, 20}, --Bewildering Pollen 15 | [321968] = {"cone", 35, 20}, --Bewildering Pollen 16 | [340160] = {"cone", 20, 45}, --Radiant Breath 17 | [340300] = {"cone", 12, 60}, --Tongue Lashing 18 | --PlagueFall 19 | [324667] = {"cone", 100, 60}, -- Slime Wave 20 | [328395] = {"cone", 15, 30}, --Venompiercer 21 | [330404] = {"rect", 15, 10}, --Wing Buffet 22 | [318949] = {"cone", 20, 60}, --FesteringBelch 23 | [327233] = {"cone", 30, 45}, --Belch Plague 24 | --Halls of Attonement 25 | -- [325797] = {"cone"} -- Rapid Fire 325797 325793 325799 not found 26 | --322936 First boss ??? 27 | [346866] = {"cone", 15, 60}, --Stone Breath 28 | [325523] = {"cone", 8, 40}, --Deadly Thrust 29 | [326623] = {"cone", 8, 90}, --Reaping Strike 30 | [326997] = {"cone", 7, 60}, --Powerful Swipe 31 | [323236] = {"cone", 25, 30}, --Unleashed Suffering 32 | --Sanguine Depths 33 | [320991] = {"rect", 8, 5}, --Echoing Thrust ??? add areatriggers 34 | [322429] = {"cone", 8, 60}, --Severing Slice 35 | --Spires of Ascension 36 | [317943] = {"cone", 8, 60}, --Sweeping Blow 37 | [323943] = {"rect", 25, 4}, --Run Through 38 | [324205] = {"cone", 30, 25}, --Blinding Flash 39 | --Theeatre of Pain 40 | --misc 41 | [331718] = {"cone", 60, 15}, --Spear Flurry ??? 42 | [333294] = {"rect", 25, 10}, --Death Winds ??? or 333297 43 | [334329] = {"cone", 60, 15}, --Sweeping Slash 44 | -- [330403] = {"rect", 10, 20}, --WingBuffet ??? 45 | [329518] = {"cone", 60, 20}, 46 | [326455] = {"cone", 75, 10}, 47 | [329181] = {"rect", 15, 5} --last Cleave 48 | } 49 | 50 | function Unit:Drawings() 51 | local CastID, ChannelID = UnitCastID(self.Pointer) 52 | local Cast = Casts[CastID] or Casts[ChannelID] 53 | if Cast then 54 | LibDraw.SetColorRaw(0, 1, 0) 55 | if Cast[1] == "rect" then 56 | self:DrawRect(Cast[2], Cast[3]) 57 | elseif Cast[1] == "cone" then 58 | self:DrawCone(Cast[2], Cast[3]) 59 | end 60 | self.NextUpdate = DMW.Time 61 | end 62 | end 63 | 64 | function Unit:DrawRect(Length, Width) 65 | local function IsInside(x, y, ax, ay, bx, by, dx, dy) 66 | local bax = bx - ax 67 | local bay = by - ay 68 | local dax = dx - ax 69 | local day = dy - ay 70 | if ((x - ax) * bax + (y - ay) * bay <= 0.0) then 71 | return false 72 | end 73 | if ((x - bx) * bax + (y - by) * bay >= 0.0) then 74 | return false 75 | end 76 | if ((x - ax) * dax + (y - ay) * day <= 0.0) then 77 | return false 78 | end 79 | if ((x - dx) * dax + (y - dy) * day >= 0.0) then 80 | return false 81 | end 82 | return true 83 | end 84 | local Rotation = select(2, ObjectFacing(self.Pointer)) or 0 85 | local halfWidth = Width / 2 86 | local nlX, nlY, nlZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, halfWidth, Rotation + rad(90), 0) 87 | local nrX, nrY, nrZ = GetPositionFromPosition(self.PosX, self.PosY, self.PosZ, halfWidth, Rotation + rad(270), 0) 88 | local flX, flY, flZ = GetPositionFromPosition(nlX, nlY, nlZ, Length, Rotation, 0) 89 | local frX, frY, frZ = GetPositionFromPosition(nrX, nrY, nrZ, Length, Rotation, 0) 90 | if IsInside(DMW.Player.PosX, DMW.Player.PosY, nlX, nlY, nrX, nrY, frX, frY) then 91 | LibDraw.SetColorRaw(1, 0, 0) 92 | end 93 | DMW.Helpers.DrawLineDMW(flX, flY, DMW.Player.PosZ, nlX, nlY, DMW.Player.PosZ) 94 | DMW.Helpers.DrawLineDMW(frX, frY, DMW.Player.PosZ, nrX, nrY, DMW.Player.PosZ) 95 | DMW.Helpers.DrawLineDMW(frX, frY, DMW.Player.PosZ, flX, flY, DMW.Player.PosZ) 96 | DMW.Helpers.DrawLineDMW(nlX, nlY, DMW.Player.PosZ, nrX, nrY, DMW.Player.PosZ) 97 | end 98 | 99 | function Unit:DrawCone(Angle, Length) 100 | local Rotation = select(2, ObjectFacing(self.Pointer)) 101 | if UnitIsFacing(self.Pointer, "player", Angle / 2) and self:RawDistance(DMW.Player) <= Length then 102 | LibDraw.SetColorRaw(1, 0, 0) 103 | end 104 | LibDraw.Arc(self.PosX, self.PosY, self.PosZ, Length, Angle, Rotation) 105 | end 106 | -------------------------------------------------------------------------------- /Classes/Unit/Friend.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local Unit = DMW.Classes.Unit 3 | 4 | function Unit:CalculateHP() 5 | local Incomming = UnitGetIncomingHeals(self.Pointer) 6 | if Incomming then 7 | self.Health = self.Health + Incomming 8 | self.HP = self.Health / self.HealthMax * 100 9 | end 10 | end -------------------------------------------------------------------------------- /Classes/Unit/Quest.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local Unit = DMW.Classes.Unit 3 | local LineText, LineCache, p1, p2 4 | local QuestPlateTooltip = CreateFrame("GameTooltip", "QuestPlateTooltipScan", nil, "GameTooltipTemplate") 5 | 6 | function Unit:IsQuestUnit() 7 | if (not self.Dead or UnitCanBeLooted(self.Pointer)) and not UnitIsTapDenied(self.Pointer) then 8 | LineCache = {} 9 | QuestPlateTooltip:SetOwner(WorldFrame, "ANCHOR_NONE") 10 | QuestPlateTooltip:SetHyperlink("unit:" .. self.GUID) 11 | for i = 1, QuestPlateTooltip:NumLines() do 12 | LineCache[i] = _G["QuestPlateTooltipScanTextLeft" .. i] 13 | end 14 | if LineCache then 15 | for i = 1, #LineCache do 16 | LineText = LineCache[i]:GetText() 17 | if LineText and not LineText:match(THREAT_TOOLTIP) then 18 | p1, p2 = LineText:match("(%d+)/(%d+)") 19 | if p1 and p2 and p1 ~= p2 then 20 | return true 21 | elseif not p1 and DMW.Settings.profile.Trackers.QuestsPct then 22 | p1 = LineText:match("(%d+%%)") 23 | if p1 and p1 ~= "100%" then 24 | return true 25 | end 26 | end 27 | end 28 | end 29 | end 30 | end 31 | return false 32 | end 33 | -------------------------------------------------------------------------------- /Classes/Unit/TimeToDie.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local Unit = DMW.Classes.Unit 3 | DMW.Tables.TTD = {} 4 | 5 | function Unit:GetTTD(targetPercentage) 6 | if targetPercentage == nil then targetPercentage = 0 end 7 | local value 8 | if self.HP == 0 then return -1 end 9 | if self.HP == 100 then return 999 end 10 | local timeNow = DMW.Time 11 | -- Reset unit if HP is higher 12 | if DMW.Tables.TTD[self.Pointer] ~= nil and (DMW.Tables.TTD[self.Pointer].lasthp < self.HP or #DMW.Tables.TTD[self.Pointer].values == 0) then 13 | DMW.Tables.TTD[self.Pointer] = nil 14 | end 15 | -- initialize new unit 16 | if DMW.Tables.TTD[self.Pointer] == nil then 17 | DMW.Tables.TTD[self.Pointer] = { } -- create unit 18 | DMW.Tables.TTD[self.Pointer].values = { } -- create value table 19 | value = {time = 0, hp = self.HP} -- create initial values 20 | tinsert(DMW.Tables.TTD[self.Pointer].values, 1, value) -- insert unit 21 | DMW.Tables.TTD[self.Pointer].lasthp = self.HP -- store current hp pct 22 | DMW.Tables.TTD[self.Pointer].startTime = timeNow -- store current time 23 | DMW.Tables.TTD[self.Pointer].lastTime = 0 --store last time value 24 | return 999 25 | end 26 | local ttdUnit = DMW.Tables.TTD[self.Pointer] 27 | -- add current value to ttd table if HP changed or more than X sec since last update 28 | if self.HP ~= ttdUnit.lasthp or (timeNow - ttdUnit.startTime - ttdUnit.lastTime) > 0.5 then 29 | value = {time = timeNow - ttdUnit.startTime, hp = self.HP} 30 | tinsert(ttdUnit.values, 1, value) 31 | DMW.Tables.TTD[self.Pointer].lasthp = self.HP 32 | DMW.Tables.TTD[self.Pointer].lastTime = timeNow - ttdUnit.startTime 33 | end 34 | -- clean units 35 | local valueCount = #ttdUnit.values 36 | while valueCount > 0 and (valueCount > 100 or (timeNow - ttdUnit.startTime - ttdUnit.values[valueCount].time) > 10) do 37 | ttdUnit.values[valueCount] = nil 38 | valueCount = valueCount - 1 39 | end 40 | -- calculate ttd if more than 3 values 41 | valueCount = #ttdUnit.values 42 | if valueCount > 1 then 43 | -- linear regression calculation from https://github.com/herotc/hero-lib/ 44 | local a, b = 0, 0 45 | local Ex2, Ex, Exy, Ey = 0, 0, 0, 0 46 | local x, y 47 | for i = 1, valueCount do 48 | x, y = ttdUnit.values[i].time, ttdUnit.values[i].hp 49 | Ex2 = Ex2 + x * x 50 | Ex = Ex + x 51 | Exy = Exy + x * y 52 | Ey = Ey + y 53 | end 54 | local invariant = 1 / (Ex2 * valueCount - Ex * Ex) 55 | a = (-Ex * Exy * invariant) + (Ex2 * Ey * invariant) 56 | b = (valueCount * Exy * invariant) - (Ex * Ey * invariant) 57 | if b ~= 0 then 58 | local ttdSec = (targetPercentage - a) / b 59 | ttdSec = math.min(999, ttdSec - (timeNow - ttdUnit.startTime)) 60 | if ttdSec > 0 then 61 | return ttdSec 62 | end 63 | return 0 -- TTD under 0 64 | end 65 | end 66 | return 999 -- not enough values 67 | end -------------------------------------------------------------------------------- /Core.lua: -------------------------------------------------------------------------------- 1 | DMW = LibStub("AceAddon-3.0"):NewAddon("DMW", "AceConsole-3.0") 2 | local DMW = DMW 3 | DMW.Tables = {} 4 | DMW.Enums = {} 5 | DMW.Functions = {} 6 | DMW.Rotations = {} 7 | DMW.Player = {} 8 | DMW.UI = {} 9 | DMW.Settings = {} 10 | DMW.Helpers = {} 11 | DMW.Pulses = 0 12 | DMW.Timers = { 13 | OM = {}, 14 | Navigation = {}, 15 | Trackers = {}, 16 | Gatherers = {}, 17 | Rotation = {} 18 | } 19 | local Init = false 20 | local DebugStart 21 | local RotationCount = 0 22 | 23 | local function FindRotation() 24 | if DMW.Rotations[DMW.Player.Class] and DMW.Rotations[DMW.Player.Class][DMW.Player.Spec] then 25 | DMW.Player.Rotation = DMW.Rotations[DMW.Player.Class][DMW.Player.Spec] 26 | end 27 | end 28 | 29 | local function Initialize() 30 | DMW.Init() 31 | DMW.UI.HUD.Init() 32 | if EWT ~= nil then 33 | InitializeNavigation( 34 | function(Result) 35 | if Result then 36 | if DMW.Settings.profile.Navigation.WorldMapHook then 37 | DMW.Helpers.Navigation:InitWorldMap() 38 | end 39 | DMW.UI.InitNavigation() 40 | end 41 | end 42 | ) 43 | end 44 | Init = true 45 | end 46 | 47 | local f = CreateFrame("Frame", "DoMeWhen", UIParent) 48 | f:SetScript( 49 | "OnUpdate", 50 | function(self, elapsed) 51 | DMW.Time = GetTime() 52 | DMW.Pulses = DMW.Pulses + 1 53 | if not DMW.Enums.Specs[GetSpecializationInfo(GetSpecialization())] then 54 | return 55 | end 56 | if UnitCastID == nil and wmbapi then 57 | LoadMiniBotAPI() 58 | end 59 | if UnitCastID ~= nil then 60 | LibStub("LibDraw-1.0").clearCanvas() 61 | if not Init then 62 | Initialize() 63 | end 64 | if not DMW.Player.Name then 65 | DMW.Player = DMW.Classes.LocalPlayer(ObjectPointer("player")) 66 | end 67 | -- if GetSpecializationInfo(GetSpecialization()) ~= DMW.Player.SpecID then 68 | -- ReloadUI() 69 | -- return 70 | -- end 71 | DebugStart = debugprofilestop() 72 | DMW.UpdateOM() 73 | DMW.Timers.OM.Last = debugprofilestop() - DebugStart 74 | DebugStart = debugprofilestop() 75 | DMW.Helpers.Trackers.Run() 76 | DMW.Timers.Trackers.Last = debugprofilestop() - DebugStart 77 | DebugStart = debugprofilestop() 78 | DMW.Helpers.Gatherers.Run() 79 | DMW.Timers.Gatherers.Last = debugprofilestop() - DebugStart 80 | if not DMW.Player.Rotation then 81 | FindRotation() 82 | else 83 | if DMW.Helpers.Queue.Run() then 84 | return true 85 | end 86 | if DMW.Player.Combat then 87 | RotationCount = RotationCount + 1 88 | DebugStart = debugprofilestop() 89 | end 90 | DMW.Player.Rotation() 91 | if DMW.Player.Combat then 92 | DMW.Timers.Rotation.Last = debugprofilestop() - DebugStart 93 | DMW.Timers.Rotation.Total = DMW.Timers.Rotation.Total and (DMW.Timers.Rotation.Total + DMW.Timers.Rotation.Last) or DMW.Timers.Rotation.Last 94 | DMW.Timers.Rotation.Average = DMW.Timers.Rotation.Total / RotationCount 95 | end 96 | if not DMW.UI.HUD.Loaded then 97 | DMW.UI.HUD.Load() 98 | end 99 | end 100 | DebugStart = debugprofilestop() 101 | DMW.Helpers.Navigation:Pulse() 102 | DMW.Timers.Navigation.Last = debugprofilestop() - DebugStart 103 | DMW.UI.Debug.Run() 104 | DMW.Timers.OM.Total = DMW.Timers.OM.Total and (DMW.Timers.OM.Total + DMW.Timers.OM.Last) or DMW.Timers.OM.Last 105 | DMW.Timers.Navigation.Total = DMW.Timers.Navigation.Total and (DMW.Timers.Navigation.Total + DMW.Timers.Navigation.Last) or DMW.Timers.Navigation.Last 106 | DMW.Timers.Trackers.Total = DMW.Timers.Trackers.Total and (DMW.Timers.Trackers.Total + DMW.Timers.Trackers.Last) or DMW.Timers.Trackers.Last 107 | DMW.Timers.Gatherers.Total = DMW.Timers.Gatherers.Total and (DMW.Timers.Gatherers.Total + DMW.Timers.Gatherers.Last) or DMW.Timers.Gatherers.Last 108 | DMW.Timers.Rotation.Total = DMW.Timers.Rotation.Total and (DMW.Timers.Rotation.Total + DMW.Timers.Rotation.Last) or DMW.Timers.Rotation.Last or nil 109 | DMW.Timers.OM.Average = DMW.Timers.OM.Total / DMW.Pulses 110 | DMW.Timers.Navigation.Average = DMW.Timers.Navigation.Total / DMW.Pulses 111 | DMW.Timers.Trackers.Average = DMW.Timers.Trackers.Total / DMW.Pulses 112 | DMW.Timers.Gatherers.Average = DMW.Timers.Gatherers.Total / DMW.Pulses 113 | end 114 | end 115 | ) 116 | -------------------------------------------------------------------------------- /DoMeWhen.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 90200 2 | ## Author: Fisker 3 | ## Version: 1.1 4 | ## Title: DoMeWhen 5 | ## Notes: Rotation Addon 6 | ## SavedVariables: DMWSettings 7 | 8 | Libs\LibStub\LibStub.lua 9 | Libs\CallbackHandler-1.0\CallbackHandler-1.0.xml 10 | Libs\LibSharedMedia-3.0\lib.xml 11 | Libs\AceAddon-3.0\AceAddon-3.0.xml 12 | Libs\AceGUI-3.0\AceGUI-3.0.xml 13 | Libs\AceConfig-3.0\AceConfig-3.0.xml 14 | Libs\AceConfig-3.0\AceConfigDialog-3.0\AceConfigDialog-3.0.xml 15 | Libs\AceConfig-3.0\AceConfigCmd-3.0\AceConfigCmd-3.0.xml 16 | Libs\AceDB-3.0\AceDB-3.0.xml 17 | Libs\AceDBOptions-3.0\AceDBOptions-3.0.xml 18 | Libs\AceConsole-3.0\AceConsole-3.0.xml 19 | Libs\LibDBIcon-1.0\LibDataBroker-1.1\LibDataBroker-1.1.lua 20 | Libs\LibDBIcon-1.0\LibDBIcon-1.0\lib.xml 21 | Libs\!LibDraw\LibDraw.lua 22 | 23 | Core.lua 24 | Classes\Classes.lua 25 | System\Settings.lua 26 | System\ObjectManager.lua 27 | System\Combatlog.lua 28 | System\EventHandler.lua 29 | System\SlashHandler.lua 30 | System\WMApi.lua 31 | 32 | Classes\Unit\Unit.lua 33 | Classes\Unit\TimeToDie.lua 34 | Classes\Unit\Friend.lua 35 | Classes\Unit\Quest.lua 36 | Classes\Unit\Drawings.lua 37 | Classes\Spell\Spell.lua 38 | Classes\Spell\Cast.lua 39 | Classes\Spell\LastCast.lua 40 | Classes\LocalPlayer\LocalPlayer.lua 41 | Classes\LocalPlayer\Loaders.lua 42 | Classes\LocalPlayer\Enemy.lua 43 | Classes\LocalPlayer\Friend.lua 44 | Classes\Aura\Aura.lua 45 | Classes\Aura\Cache.lua 46 | Classes\Aura\DotTracker.lua 47 | Classes\Item\Item.lua 48 | Classes\GameObject\GameObject.lua 49 | Classes\AreaTrigger\AreaTrigger.lua 50 | Classes\AreaTrigger\Drawings.lua 51 | 52 | Helpers\Rotation.lua 53 | Helpers\Queue.lua 54 | Helpers\Trackers.lua 55 | Helpers\Navigation.lua 56 | Helpers\Gatherers.lua 57 | 58 | Enums\Spells\Global.lua 59 | Enums\Spells\DeathKnight.lua 60 | Enums\Spells\DemonHunter.lua 61 | Enums\Spells\Druid.lua 62 | Enums\Spells\Hunter.lua 63 | Enums\Spells\Mage.lua 64 | Enums\Spells\Monk.lua 65 | Enums\Spells\Paladin.lua 66 | Enums\Spells\Priest.lua 67 | Enums\Spells\Rogue.lua 68 | Enums\Spells\Shaman.lua 69 | Enums\Spells\Warlock.lua 70 | Enums\Spells\Warrior.lua 71 | 72 | Enums\Specs.lua 73 | Enums\Items.lua 74 | Enums\Misc.lua 75 | Enums\Dispel.lua 76 | Enums\Dummy.lua 77 | Enums\Overrides.lua 78 | Enums\HardCC.lua 79 | Enums\Interrupts.lua 80 | Enums\CC.lua 81 | Enums\Tracker.lua 82 | Enums\Defensive.lua 83 | Enums\Runeforge.lua 84 | Enums\Conduits.lua 85 | 86 | UI\Main.lua 87 | UI\HUD.lua 88 | UI\Debug.lua 89 | UI\Log.lua 90 | 91 | Rotations\DeathKnight\Shared.lua 92 | Rotations\DeathKnight\Blood.lua 93 | Rotations\DeathKnight\Frost.lua 94 | Rotations\DeathKnight\Unholy.lua 95 | 96 | Rotations\DemonHunter\Shared.lua 97 | Rotations\DemonHunter\Havoc.lua 98 | Rotations\DemonHunter\Vengeance.lua 99 | 100 | Rotations\Druid\Shared.lua 101 | Rotations\Druid\Balance.lua 102 | Rotations\Druid\Guardian.lua 103 | 104 | Rotations\Hunter\Shared.lua 105 | Rotations\Hunter\BeastMastery.lua 106 | 107 | Rotations\Mage\Shared.lua 108 | Rotations\Mage\Frost.lua 109 | Rotations\Mage\Fire.lua 110 | 111 | Rotations\Paladin\Shared.lua 112 | Rotations\Paladin\Holy.lua 113 | Rotations\Paladin\Protection.lua 114 | Rotations\Paladin\Retribution.lua 115 | 116 | Rotations\Rogue\Shared.lua 117 | Rotations\Rogue\Assassination.lua 118 | Rotations\Rogue\Outlaw.lua 119 | Rotations\Rogue\Subtlety.lua 120 | 121 | Rotations\Priest\Shared.lua 122 | Rotations\Priest\Discipline.lua 123 | Rotations\Priest\Holy.lua 124 | Rotations\Priest\Shadow.lua 125 | 126 | Rotations\Warlock\Shared.lua 127 | Rotations\Warlock\Affliction.lua 128 | Rotations\Warlock\Demonology.lua 129 | Rotations\Warlock\Destruction.lua 130 | 131 | Rotations\Warrior\Shared.lua 132 | Rotations\Warrior\Arms.lua 133 | Rotations\Warrior\Fury.lua 134 | Rotations\Warrior\Protection.lua 135 | -------------------------------------------------------------------------------- /Enums/CC.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.CCBuffs = { 2 | [61780] = true, 3 | [28271] = true, 4 | [115078] = true, 5 | [20066] = true, 6 | [217832] = true, 7 | [339] = true, 8 | [102359] = true, 9 | [3355] = true, 10 | [200108] = true, 11 | [213691] = true, 12 | [162488] = true, 13 | [212638] = true, 14 | [19386] = true, 15 | [61305] = true, 16 | [161354] = true, 17 | [161355] = true, 18 | [28272] = true, 19 | [161353] = true, 20 | [126819] = true, 21 | [61721] = true, 22 | [118] = true, 23 | [8122] = true, 24 | [9484] = true, 25 | [2094] = true, 26 | [1776] = true, 27 | [6770] = true, 28 | [64695] = true, 29 | [211015] = true, 30 | [210873] = true, 31 | [51514] = true, 32 | [211010] = true, 33 | [211004] = true, 34 | [196942] = true, 35 | [118699] = true, 36 | [5484] = true, 37 | [710] = true 38 | } 39 | -------------------------------------------------------------------------------- /Enums/Defensive.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.DefensiveCast = { 2 | [322736] = "Piercing Barb", -- DoS Hakkar 3 | [327646] = "Soulcrusher", -- DoS Meuhzala 4 | [325552] = "Cytotoxic Slash", -- Plaguefall Domina 5 | [325254] = "Iron Spikes", -- Sanguine Depths Graand Proctor 6 | [319650] = "Vicious Headbutt", -- Sanguine Depths Kryxis 7 | [320063] = "Slam", -- ToP Challengers 8 | [323515] = "Hateful Strike", -- ToP Gorechop 9 | [324079] = "Reaping Scythe", -- ToP Mordretha 10 | [320644] = "Brutal Combo", -- ToP Xav 11 | [320655] = "Crunch" -- Necrotic Wake Blightbone 12 | } 13 | 14 | DMW.Enums.DefensiveDebuff = { 15 | [320012] = "Unholy Frenzy", -- Necrotic Wake Amarth 16 | [325552] = "Cytotoxic Slash" -- Plaguefall Domina 17 | } 18 | -------------------------------------------------------------------------------- /Enums/Dispel.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.DispelSpells = { 2 | --DH 3 | [278326] = {"Magic"}, 4 | --Druid 5 | [2782] = {"Curse", "Poison"}, 6 | [2908] = {""}, 7 | [88423] = {"Curse", "Magic", "Poison"}, 8 | --Hunter 9 | [264028] = {"Magic", ""}, 10 | [254056] = {"Magic", ""}, 11 | [254262] = {"Magic", ""}, 12 | [264263] = {"Magic", ""}, 13 | [264264] = {"Magic", ""}, 14 | [264265] = {"Magic", ""}, 15 | [264266] = {"Magic", ""}, 16 | --Mage 17 | [475] = {"Curse"}, 18 | --Monk 19 | [115450] = {"Disease", "Magic", "Poison"}, 20 | [218164] = {"Disease", "Poison"}, 21 | --Paladin 22 | [4987] = {"Disease", "Magic", "Poison"}, 23 | [213644] = {"Disease", "Poison"}, 24 | --Priest 25 | [527] = {"Disease", "Magic"}, 26 | [528] = {"Magic"}, 27 | [32375] = {"Magic"}, 28 | --Shaman 29 | [370] = {"Magic"}, 30 | [51886] = {"Curse"}, 31 | [77130] = {"Curse", "Magic"}, 32 | --Warlock 33 | [19505] = {"Magic"}, 34 | [119905] = {"Magic"}, 35 | [132411] = {"Magic"} 36 | } 37 | 38 | DMW.Enums.DispelLogic = { 39 | [275014] = {Range = 3}, 40 | [261440] = {Range = 6}, 41 | [252781] = {Range = 8}, 42 | [255371] = {Stacks = 2}, 43 | [276031] = {Stacks = 2}, 44 | [269301] = {Stacks = 3}, 45 | } 46 | 47 | DMW.Enums.NoDispel = { 48 | [282566] = true 49 | } -------------------------------------------------------------------------------- /Enums/Dummy.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.Dummy = { 2 | [1921] = "Combat Dummy", 3 | [4952] = "Theramore Combat Dummy", 4 | [5652] = "Undercity Practice Dummy", 5 | [16211] = "Naxxramas Combat Dummy", 6 | [17578] = "Hellfire Training Dummy", 7 | [19139] = "Nagrand Target Dummy", 8 | [24792] = "Advanced Training Dummy", 9 | [25225] = "Practice Dummy", 10 | [25297] = "Drill Dummy", 11 | [32541] = "Initiate's Training Dummy", 12 | [32542] = "Disciple's Training Dummy", 13 | [32545] = "Initiate's Training Dummy", 14 | [32546] = "Ebon Knight's Training Dummy", 15 | [32547] = "Highlord's Nemesis Trainer", 16 | [54344] = "Highlord's Nemesis Trainer", 17 | [33229] = "Melee Target", 18 | [84991] = "Pet Training Post", 19 | [42328] = "Practice Dummy", 20 | [31146] = "Raider's Training Dummy", 21 | [18504] = "Silvermoon Practice Dummy", 22 | [43560] = "Smilin' Timmy Sticks", 23 | [38038] = "Tiki Target", 24 | [64446] = "Training Dummy", 25 | [60197] = "Training Dummy", 26 | [44171] = "Training Dummy", 27 | [48304] = "Training Dummy", 28 | [44937] = "Training Dummy", 29 | [44389] = "Training Dummy", 30 | [44614] = "Training Dummy", 31 | [44548] = "Training Dummy", 32 | [44703] = "Training Dummy", 33 | [44794] = "Training Dummy", 34 | [44820] = "Training Dummy", 35 | [44848] = "Training Dummy", 36 | [32666] = "Training Dummy", 37 | [32667] = "Training Dummy", 38 | [31144] = "Training Dummy", 39 | [46647] = "Training Dummy", 40 | [67127] = "Training Dummy", 41 | [79414] = "Training Dummy", 42 | [79987] = "Training Dummy", 43 | [70245] = "Training Dummy", 44 | [89078] = "Training Dummy", 45 | [32543] = "Veteran's Training Dummy", 46 | [87320] = "Raider's Training Dummy ", 47 | [87329] = "Raider's Training Dummy ", 48 | [87762] = "Raider's Training Dummy ", 49 | [88837] = "Raider's Training Dummy ", 50 | [92164] = "Training Dummy ", 51 | [92165] = "Dungeoneer's Training Dummy ", 52 | [92166] = "Raider's Training Dummy ", 53 | [92168] = "Dungeoneer's Training Dummy ", 54 | [113860] = "Raider's Training Dummy ", 55 | [113864] = "Raider's Training Dummy ", 56 | [113964] = "Raider's Training Dummy ", 57 | [113966] = "Dungeoneer's Training Dummy ", 58 | [113859] = "Dungeoneer's Training Dummy ", 59 | [113863] = "Dungeoneer's Training Dummy ", 60 | [113871] = "Bombardier's Training Dummy ", 61 | [114832] = "PvP Training Dummy", 62 | [114840] = "PvP Training Dummy", 63 | [111824] = "Training Dummy", 64 | [113862] = "Training Dummy ", 65 | [113858] = "Training Dummy ", 66 | [102045] = "Rebellious Wrathguard ", 67 | [101956] = "Rebellious Fel Lord ", 68 | [102048] = "Rebellious Felguard ", 69 | [102052] = "Rebellious Imp ", 70 | [113676] = "Imprisoned Weaver ", 71 | [113674] = "Imprisoned Centurion ", 72 | [113647] = "Imprisoned Eradicator ", 73 | [113673] = "Imprisoned Executioner ", 74 | [113636] = "Imprisoned Forgefiend ", 75 | [113687] = "Imprisoned Imp ", 76 | [103404] = "Bulwark Construct ", 77 | [103397] = "Greater Bulwark Construct ", 78 | [103402] = "Lesser Bulwark Construct ", 79 | [100441] = "Dungeoneer's Training Bag", 80 | [100451] = "Raider's Training Bag", 81 | [100440] = "Training Bag", 82 | [107484] = "Greater Sparring Partner ", 83 | [114558] = "Greater Sparring Partner ", 84 | [114559] = "Lesser Sparring Partner ", 85 | [107483] = "Lesser Sparring Partner ", 86 | [107555] = "Bound Void Wraith ", 87 | [107556] = "Bound Void Walker ", 88 | [107202] = "Reanimated Monstrosity ", 89 | [126712] = "Training Dummy", 90 | [127019] = "Training Dummy", 91 | [131983] = "Raider's Training Dummy ", 92 | [131975] = "Dungeoneer's Training Dummy ", 93 | [131985] = "Dungeoneer's Training Dummy ", 94 | [131990] = "Raider's Training Dummy ", 95 | [131992] = "Dungeoneer's Training Dummy ", 96 | [143509] = "Training Dummy", 97 | [144078] = "Dungeoneer's Training Dummy ", 98 | [144081] = "Training Dummy ", 99 | [144082] = "Training Dummy ", 100 | [144085] = "Training Dummy ", 101 | [144086] = "Raider's Training Dummy ", 102 | [175456] = "Swarm Training Dummy", 103 | [175455] = "Cleave Training Dummy" 104 | } 105 | -------------------------------------------------------------------------------- /Enums/HardCC.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.HardCCCasts = { 2 | [253239] = true, 3 | [256897] = true, 4 | [257756] = true, 5 | [258317] = true, 6 | [258864] = true, 7 | [258908] = true, 8 | [258917] = true, 9 | [259711] = true, 10 | [264038] = true, 11 | [264574] = true, 12 | [265540] = true, 13 | [265568] = true, 14 | [267237] = true, 15 | [267354] = true, 16 | [267433] = true, 17 | [268273] = true, 18 | [268702] = true, 19 | [268846] = true, 20 | [268865] = true, 21 | [269266] = true, 22 | [269931] = true, 23 | [270084] = true, 24 | [270482] = true, 25 | [270506] = true, 26 | [270507] = true, 27 | [272542] = true, 28 | [272655] = true, 29 | [272659] = true, 30 | [272888] = true, 31 | [274383] = true, 32 | [274400] = true, 33 | [276292] = true, 34 | [277567] = true, 35 | [326450] = true 36 | } 37 | 38 | DMW.Enums.HardCCUnits = {} 39 | 40 | DMW.Enums.StunImmuneBuffs = {} 41 | 42 | DMW.Enums.StunImmuneUnits = {} 43 | -------------------------------------------------------------------------------- /Enums/Interrupts.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.InterruptBlacklist = { 2 | [257899] = "Painful Motivation", 3 | [298548] = "Massive Incubator" 4 | } 5 | 6 | DMW.Enums.InterruptDangerous = { 7 | [153401] = 298033, --Touch of the Abyss Visions 8 | [157610] = 298033, --Touch of the Abyss Visions 9 | [156795] = 298033 --Touch of the Abyss Visions 10 | } -------------------------------------------------------------------------------- /Enums/Items.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.Items = { 2 | Healthstone = 5512, 3 | } -------------------------------------------------------------------------------- /Enums/Misc.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.GCDOneSec = { 2 | [103] = true, 3 | [259] = true, 4 | [260] = true, 5 | [261] = true, 6 | [268] = true, 7 | [269] = true 8 | } 9 | 10 | DMW.Enums.MeleeSpell = { 11 | [250] = 49998, 12 | [251] = 49998, 13 | [252] = 49998, 14 | [577] = 162794, 15 | [581] = 214743, 16 | [102] = 22568, 17 | [103] = 22568, 18 | [104] = 22568, 19 | [105] = 22568, 20 | --[255] = "Survival", 21 | [268] = 100780, 22 | [269] = 100780, 23 | [270] = 100780, 24 | [65] = 35395, 25 | [66] = 35395, 26 | [70] = 35395, 27 | [259] = 1766, 28 | [260] = 1766, 29 | [261] = 1766, 30 | [262] = 73899, 31 | [263] = 73899, 32 | [264] = 73899, 33 | [71] = 6552, 34 | [72] = 6552, 35 | [73] = 6552 36 | } 37 | 38 | DMW.Enums.CreatureType = { 39 | [1] = "Beast", 40 | [2] = "Dragonkin", 41 | [3] = "Demon", 42 | [4] = "Elemental", 43 | [5] = "Giant", 44 | [6] = "Undead", 45 | [7] = "Humanoid", 46 | [8] = "Critter", 47 | [9] = "Mechanical", 48 | [10] = "Not specified", 49 | [11] = "Totem" 50 | } 51 | 52 | DMW.Enums.ClassColor = { 53 | DRUID = {r = 255, g = 125, b = 10}, 54 | HUNTER = {r = 171, g = 212, b = 115}, 55 | MAGE = {r = 64, g = 199, b = 235}, 56 | PALADIN = {r = 245, g = 140, b = 186}, 57 | PRIEST = {r = 255, g = 255, b = 255}, 58 | ROGUE = {r = 255, g = 245, b = 105}, 59 | SHAMAN = {r = 0, g = 112, b = 222}, 60 | WARLOCK = {r = 135, g = 135, b = 237}, 61 | WARRIOR = {r = 199, g = 156, b = 110} 62 | } 63 | 64 | DMW.Enums.UnitFlags = { 65 | --From trinity 66 | NotClientControlled = 0x1, 67 | PlayerCannotAttack = 0x2, 68 | RemoveClientControl = 0x4, 69 | PlayerControlled = 0x8, 70 | Preparation = 0x20, 71 | NoAttack = 0x80, 72 | NotAttackbleByPlayerControlled = 0x100, 73 | OnlyAttackableByPlayerControlled = 0x200, 74 | Looting = 0x400, 75 | PetIsAttackingTarget = 0x800, 76 | PVP = 0x1000, 77 | Silenced = 0x2000, 78 | CannotSwim = 0x4000, 79 | OnlySwim = 0x8000, 80 | NoAttack2 = 0x10000, 81 | Pacified = 0x20000, 82 | Stunned = 0x40000, 83 | AffectingCombat = 0x80000, 84 | OnTaxi = 0x100000, 85 | MainHandDisarmed = 0x200000, 86 | Confused = 0x400000, 87 | Feared = 0x800000, 88 | PossessedByPlayer = 0x1000000, 89 | NotSelectable = 0x2000000, 90 | Skinnable = 0x4000000, 91 | Mount = 0x8000000, 92 | PreventKneelingWhenLooting = 0x10000000, 93 | PreventEmotes = 0x20000000, 94 | Sheath = 0x40000000 95 | } 96 | 97 | DMW.Enums.NpcFlags = { 98 | Innkeeper = 0x00010000, 99 | Repair = 0x0000001000, 100 | PoisonVendor = 0x0000000400, 101 | FlightMaster = 0x0000002000, 102 | ReagentVendor = 0x0000000800, 103 | Trainer = 0x0000000010, 104 | ClassTrainer = 0x0000000020, 105 | ProfessionTrainer = 0x0000000040, 106 | AmmoVendor = 0x0000000100, 107 | FoodVendor = 0x0000000200, 108 | BlackMarket = 0x0080000000, 109 | TradeskillNpc = 0x4000000000, 110 | Vendor = 0x0000000080 111 | } 112 | 113 | DMW.Enums.MovementFlags = { 114 | None = 0x00000000, 115 | Forward = 0x00000001, 116 | Backward = 0x00000002, 117 | StrafeLeft = 0x00000004, 118 | StrafeRight = 0x00000008, 119 | Left = 0x00000010, 120 | Right = 0x00000020, 121 | PitchUp = 0x00000040, 122 | PitchDown = 0x00000080, 123 | Walking = 0x00000100, 124 | DisableGravity = 0x00000200, 125 | Root = 0x00000400, 126 | Falling = 0x00000800, 127 | FallingFar = 0x00001000, 128 | PendingStop = 0x00002000, 129 | PendingStrafeStop = 0x00004000, 130 | PendingForward = 0x00008000, 131 | PendingBackward = 0x00010000, 132 | PendingStrafeLeft = 0x00020000, 133 | PendingStrafeRight = 0x00040000, 134 | PendingRoot = 0x00080000, 135 | Swimming = 0x00100000, 136 | Ascending = 0x00200000, 137 | Descending = 0x00400000, 138 | CanFly = 0x00800000, 139 | Flying = 0x01000000, 140 | SplineElevation = 0x02000000, 141 | WaterWalking = 0x04000000, 142 | FallingSlow = 0x08000000, 143 | Hover = 0x10000000, 144 | DisableCollision = 0x20000000, 145 | } 146 | 147 | DMW.Enums.MovementFlags.Moving = bit.bor(DMW.Enums.MovementFlags.Forward, DMW.Enums.MovementFlags.Backward, DMW.Enums.MovementFlags.StrafeLeft, DMW.Enums.MovementFlags.StrafeRight, DMW.Enums.MovementFlags.Falling, DMW.Enums.MovementFlags.Ascending, DMW.Enums.MovementFlags.Descending) 148 | -------------------------------------------------------------------------------- /Enums/Overrides.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.LoS = { 2 | [44566] = true, 3 | [131863] = true, 4 | [134691] = true, 5 | [137405] = true, 6 | [140447] = true, 7 | [137119] = true, 8 | [137578] = true, 9 | [138959] = true, 10 | [138017] = true, 11 | [130217] = true, 12 | [140286] = true, 13 | [138530] = true, 14 | [133392] = true, 15 | [146256] = true, 16 | [150773] = true, 17 | [152364] = true, 18 | [152671] = true, 19 | [116939] = true, 20 | [157602] = true, 21 | [158041] = true, 22 | [166608] = true, 23 | [166618] = true, 24 | [169769] = true, 25 | [171665] = true, 26 | [168326] = true 27 | } 28 | 29 | DMW.Enums.Threat = { 30 | [98081] = true, 31 | [44566] = true, 32 | [44752] = true, 33 | [100818] = true, 34 | [133492] = true, 35 | [135016] = true, 36 | [131009] = true, 37 | [125828] = true, 38 | [134691] = true, 39 | [147218] = true, 40 | [148436] = true, 41 | [148415] = true, 42 | [147377] = true, 43 | [147376] = true, 44 | [147374] = true, 45 | [147375] = true, 46 | [146756] = true, 47 | [146107] = true, 48 | [148522] = true, 49 | [148907] = true, 50 | [120651] = true, 51 | [136330] = true, 52 | [134388] = true, 53 | [153064] = true, 54 | [154240] = true, 55 | [155354] = true, 56 | [153194] = true, 57 | [150773] = true, 58 | [154174] = true, 59 | [154175] = true, 60 | [151581] = true, 61 | [151900] = true, 62 | [145267] = true, 63 | [158327] = true, 64 | [125977] = true, 65 | [127315] = true, 66 | [143774] = true, 67 | [158478] = true, 68 | [164558] = true, 69 | [164532] = true, 70 | [166473] = true, 71 | [166608] = true, -- Mueh'zala - De Other Side 72 | [166618] = true, 73 | [169769] = true, 74 | [171665] = true, 75 | [168326] = true 76 | } 77 | 78 | DMW.Enums.EnemyBlacklist = { 79 | [129359] = true, 80 | [129448] = true, 81 | [144942] = true 82 | } 83 | 84 | DMW.Enums.UnitBlacklist = { 85 | [101436] = true, -- Invisible Wormhole unit in new Dalaran 86 | [121541] = true, -- Invisible Ban-Lu unit in new Dalaran 87 | [155641] = true, -- Random unit in Mecha city 88 | [150710] = true -- Hidden Treasure Nazjatar 89 | } 90 | 91 | --Spells that don't trigger aura event for some reason?????????????????????? 92 | DMW.Enums.AuraRefresh = { 93 | [85948] = "FesteringStrike", 94 | [77575] = "Outbreak" 95 | } -------------------------------------------------------------------------------- /Enums/Specs.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.Specs = { 2 | [250] = "Blood", 3 | [251] = "Frost", 4 | [252] = "Unholy", 5 | [577] = "Havoc", 6 | [581] = "Vengeance", 7 | [102] = "Balance", 8 | [103] = "Feral", 9 | [104] = "Guardian", 10 | [105] = "Restoration", 11 | [253] = "BeastMastery", 12 | [254] = "Marksmanship", 13 | [255] = "Survival", 14 | [62] = "Arcane", 15 | [63] = "Fire", 16 | [64] = "Frost", 17 | [268] = "Brewmaster", 18 | [269] = "Windwalker", 19 | [270] = "Mistweaver", 20 | [65] = "Holy", 21 | [66] = "Protection", 22 | [70] = "Retribution", 23 | [256] = "Discipline", 24 | [257] = "Holy", 25 | [258] = "Shadow", 26 | [259] = "Assassination", 27 | [260] = "Outlaw", 28 | [261] = "Subtlety", 29 | [262] = "Elemental", 30 | [263] = "Enhancement", 31 | [264] = "Restoration", 32 | [265] = "Affliction", 33 | [266] = "Demonology", 34 | [267] = "Destruction", 35 | [71] = "Arms", 36 | [72] = "Fury", 37 | [73] = "Protection" 38 | } 39 | -------------------------------------------------------------------------------- /Enums/Spells/DemonHunter.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.DEMONHUNTER = { 4 | Havoc = { 5 | Abilities = {}, 6 | Buffs = {}, 7 | Debuffs = {}, 8 | Talents = { 9 | BlindFury = 21854, 10 | BurningHatred = 22765, 11 | CycleOfHatred = 21866, 12 | DemonBlades = 22799, 13 | Demonic = 21900, 14 | DemonicAppetite = 22493, 15 | DesperateInstincts = 21864, 16 | EssenceBreak = 21868, 17 | FelBarrage = 22547, 18 | FelEruption = 22767, 19 | Felblade = 22416, 20 | FirstBlood = 21867, 21 | GlaiveTempest = 21862, 22 | InsatiableHunger = 21857, 23 | MasterOfTheGlaive = 21870, 24 | Momentum = 21901, 25 | Netherwalk = 21865, 26 | SoulRending = 21863, 27 | TrailOfRuin = 22909, 28 | UnboundChaos = 22494, 29 | UnleashedPower = 21869 30 | } 31 | }, 32 | Vengeance = { 33 | Abilities = {}, 34 | Buffs = {}, 35 | Debuffs = {}, 36 | Talents = { 37 | AbyssalStrike = 22502, 38 | AgonizingFlames = 22503, 39 | BulkExtraction = 21902, 40 | BurningAlive = 22507, 41 | CharredFlesh = 22541, 42 | ConcentratedSigils = 22546, 43 | Demonic = 22513, 44 | Fallout = 22766, 45 | FeastOfSouls = 22505, 46 | FeedTheDemon = 22509, 47 | Felblade = 22504, 48 | Fracture = 22770, 49 | InfernalArmor = 22324, 50 | LastResort = 22543, 51 | QuickenedSigils = 22510, 52 | RuinousBulwark = 23464, 53 | SigilOfChains = 22511, 54 | SoulBarrier = 22768, 55 | SoulRending = 22508, 56 | SpiritBomb = 22540, 57 | VoidReaver = 22512 58 | } 59 | }, 60 | All = { 61 | Abilities = {}, 62 | Buffs = {}, 63 | Debuffs = {}, 64 | Talents = {} 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Enums/Spells/Global.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | 3 | DMW.Enums.Spells = { 4 | GLOBAL = { 5 | All = { 6 | Abilities = { 7 | GCD = {SpellID = 61304, CastType = "Passive", SpellType = "GCD"}, 8 | --Professions, multiple ID's shouldn't matter, just for tracking casts 9 | Fishing = {SpellID = 131474, SpellType = "Profession"}, 10 | HerbGathering = {SpellID = 110413, SpellType = "Profession"}, 11 | Mining = {SpellID = 50310, SpellType = "Profession"}, 12 | Skinning = {SpellID = 32678, SpellType = "Profession"} 13 | }, 14 | Buffs = { 15 | MemoryOfLucidDreams = 298357, 16 | RecklessForce = 302932, 17 | SeethingRage = 297126 18 | }, 19 | Debuffs = { 20 | ConcentratedFlame = {SpellID = 299349} 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Enums/Spells/Hunter.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.HUNTER = { 4 | BeastMastery = { 5 | Abilities = { 6 | AMurderOfCrows = {SpellID = 131894}, 7 | AspectOfTheWild = {SpellID = 193530}, 8 | BarbedShot = {SpellID = 217200}, 9 | Barrage = {SpellID = 120360}, 10 | BestialWrath = {SpellID = 19574}, 11 | ChimaeraShot = {SpellID = 53209}, 12 | CobraShot = {SpellID = 193455}, 13 | CounterShot = {SpellID = 147362, SpellType = "Interrupt"}, 14 | DireBeast = {SpellID = 120679}, 15 | FreezingTrap = {SpellID = 187650, CastType = "Ground"}, 16 | Intimidation = {SpellID = 19577}, 17 | KillCommand = {SpellID = 34026}, 18 | Misdirection = {SpellID = 34477}, 19 | Multishot = {SpellID = 2643}, 20 | SpittingCobra = {SpellID = 194407}, 21 | Stampede = {SpellID = 201430} 22 | }, 23 | Buffs = { 24 | AspectOfTheWild = 193530, 25 | BeastCleave = 118455, 26 | BestialWrath = 19574, 27 | DanceOfDeath = 274443, 28 | DireBeast = 120694, 29 | Frenzy = 272790 30 | }, 31 | Debuffs = { 32 | BarbedShot = {SpellID = 217200} 33 | }, 34 | Talents = { 35 | AMurderOfCrows = 22269, 36 | AnimalCompanion = 22280, 37 | AspectOfTheBeast = 22273, 38 | Barrage = 22002, 39 | Bloodshed = 22295, 40 | ChimaeraShot = 22290, 41 | DireBeast = 22282, 42 | KillerCobra = 21986, 43 | KillerInstinct = 22291, 44 | OneWithThePack = 22266, 45 | ScentOfBlood = 22500, 46 | SpittingCobra = 22441, 47 | Stampede = 23044, 48 | Stomp = 19357, 49 | ThrillOfTheHunt = 22347 50 | } 51 | }, 52 | Marksmanship = { 53 | Abilities = {}, 54 | Buffs = {}, 55 | Debuffs = {}, 56 | Talents = { 57 | AMurderOfCrows = 22289, 58 | Barrage = 22497, 59 | BindingShackles = 23463, 60 | CallingTheShots = 22274, 61 | CarefulAim = 22495, 62 | ChimaeraShot = 21998, 63 | DeadEye = 23104, 64 | DoubleTap = 22287, 65 | ExplosiveShot = 22498, 66 | LethalShots = 23063, 67 | LockAndLoad = 22308, 68 | MasterMarksman = 22279, 69 | SerpentSting = 22501, 70 | SteadyFocus = 22267, 71 | Streamline = 22286, 72 | Volley = 22288 73 | } 74 | }, 75 | Survival = { 76 | Abilities = {}, 77 | Buffs = {}, 78 | Debuffs = {}, 79 | Talents = { 80 | AMurderOfCrows = 22299, 81 | AlphaPredator = 22296, 82 | BirdsOfPrey = 22272, 83 | Bloodseeker = 22277, 84 | Butchery = 22297, 85 | Chakrams = 23105, 86 | FlankingStrike = 22271, 87 | GuerrillaTactics = 21997, 88 | HydrasBite = 22769, 89 | MongooseBite = 22278, 90 | SteelTrap = 19361, 91 | TermsOfEngagement = 22283, 92 | TipOfTheSpear = 22300, 93 | VipersVenom = 22275, 94 | WildfireInfusion = 22301 95 | } 96 | }, 97 | All = { 98 | Abilities = { 99 | CallPet1 = {SpellID = 883, CastType = "Special"}, 100 | CallPet2 = {SpellID = 83242, CastType = "Special"}, 101 | CallPet3 = {SpellID = 83243, CastType = "Special"}, 102 | CallPet4 = {SpellID = 83244, CastType = "Special"}, 103 | CallPet5 = {SpellID = 83245, CastType = "Special"}, 104 | MendPet = {SpellID = 136}, 105 | RevivePet = {SpellID = 982} 106 | }, 107 | Buffs = {}, 108 | Debuffs = {}, 109 | Talents = { 110 | BindingShot = 22499, 111 | BornToBeWild = 22268, 112 | Camouflage = 23100, 113 | NaturalMending = 19348, 114 | Posthaste = 22276, 115 | Trailblazer = 19347 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /Enums/Spells/Monk.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.MONK = { 4 | Brewmaster = { 5 | Abilities = {}, 6 | Buffs = {}, 7 | Debuffs = {}, 8 | Talents = {BlackOxBrew = 19992, 9 | BlackoutCombo = 22108, 10 | BobAndWeave = 20174, 11 | CelestialFlames = 22104, 12 | ExplodingKeg = 22103, 13 | HealingElixir = 23363, 14 | HighTolerance = 22106, 15 | LightBrewing = 22099, 16 | RushingJadeWind = 20184, 17 | SpecialDelivery = 19819, 18 | Spitfire = 22097,} 19 | }, 20 | Mistweaver = { 21 | Abilities = {}, 22 | Buffs = {}, 23 | Debuffs = {}, 24 | Talents = {FocusedThunder = 22218, 25 | HealingElixir = 23371, 26 | InvokeChijiTheRedCrane = 22214, 27 | Lifecycles = 22168, 28 | ManaTea = 22166, 29 | MistWrap = 19823, 30 | RefreshingJadeWind = 22101, 31 | RisingMist = 22170, 32 | SongOfChiji = 22219, 33 | SpiritOfTheCrane = 22167, 34 | SummonJadeSerpentStatue = 23107, 35 | Upwelling = 22169,} 36 | }, 37 | Windwalker = { 38 | Abilities = {}, 39 | Buffs = {}, 40 | Debuffs = {}, 41 | Talents = {Ascension = 22098, 42 | DanceOfChiji = 22102, 43 | EnergizingElixir = 22096, 44 | FistOfTheWhiteTiger = 19771, 45 | GoodKarma = 23364, 46 | HitCombo = 22093, 47 | InnerStrength = 23258, 48 | RushingJadeWind = 23122, 49 | Serenity = 21191, 50 | SpiritualFocus = 22107, 51 | WhirlingDragonPunch = 22105,} 52 | }, 53 | All = { 54 | Abilities = {}, 55 | Buffs = {}, 56 | Debuffs = {}, 57 | Talents = {Celerity = 19304, 58 | ChiBurst = 20185, 59 | ChiTorpedo = 19818, 60 | ChiWave = 19820, 61 | DampenHarm = 20175, 62 | DiffuseMagic = 20173, 63 | EyeOfTheTiger = 23106, 64 | RingOfPeace = 19995, 65 | SummonBlackOxStatue = 19994, 66 | TigerTailSweep = 19993, 67 | TigersLust = 19302,} 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Enums/Spells/Priest.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.PRIEST = { 4 | Discipline = { 5 | Abilities = { 6 | AngelicFeather = {SpellID = 121536}, 7 | DivineStar = {SpellID = 110744}, 8 | DesperatePrayer = {SpellID = 19236}, 9 | Evangelism = {SpellID = 246287}, 10 | Halo = {SpellID = 120517}, 11 | LeapOfFaith = {SpellID = 73325}, 12 | LuminousBarrier = {SpellID = 271466}, 13 | Mindbender = {SpellID = 123040}, 14 | MindControl = {SpellID = 205364}, 15 | PainSuppression = {SpellID = 33206}, 16 | Penance = {SpellID = 47540}, 17 | PowerWordBarrier = {SpellID = 62618}, 18 | PowerWordRadiance = {SpellID = 194509}, 19 | PowerWordShield = {SpellID = 17}, 20 | PowerWordSolace = {SpellID = 129250}, 21 | PsychicScream = {SpellID = 8122}, 22 | PurgeTheWicked = {SpellID = 204197}, 23 | Purify = {SpellID = 527}, 24 | Rapture = {SpellID = 47536}, 25 | Schism = {SpellID = 214621}, 26 | ShadowCovenant = {SpellID = 204065}, 27 | Shadowfiend = {SpellID = 34433}, 28 | ShadowMend = {SpellID = 186263}, 29 | ShadowWordPain = {SpellID = 589}, 30 | ShiningForce = {SpellID = 204263}, 31 | SinsOfTheMany = {SpellID = 198076}, 32 | Smite = {SpellID = 585} 33 | }, 34 | Buffs = { 35 | AngelicFeather = 121557, 36 | Atonement = 194384, 37 | BodyAndSoul = 65081, 38 | BorrowedTime = 197763, 39 | OverloadedWithLight = 223166, 40 | Penitent = 246519, 41 | PowerOfTheDarkSide = 198069, 42 | PowerWordShield = 17, 43 | Rapture = 47536, 44 | SymbolOfHope = 64901 45 | }, 46 | Debuffs = { 47 | PurgeTheWicked = {SpellID = 204213}, 48 | Schism = {SpellID = 214621}, 49 | ShadowMend = {SpellID = 187464}, 50 | ShadowWordPain = {SpellID = 589, BaseDuration = 16}, 51 | Smite = {SpellID = 585}, 52 | WeakenedSoul = {SpellID = 6788} 53 | }, 54 | Talents = { 55 | DominantMind = 19769, 56 | Evangelism = 22976, 57 | Lenience = 21183, 58 | Masochism = 22316, 59 | PsychicVoice = 19759, 60 | PurgeTheWicked = 22161, 61 | Schism = 22329, 62 | SinsOfTheMany = 22330, 63 | TwistOfFate = 22313 64 | } 65 | }, 66 | Holy = { 67 | Abilities = {}, 68 | Buffs = {}, 69 | Debuffs = {}, 70 | Talents = { 71 | Afterlife = 22562, 72 | AngelsMercy = 22325, 73 | Apotheosis = 21644, 74 | BindingHeal = 22327, 75 | BodyAndSoul = 22326, 76 | Censure = 21977, 77 | CosmicRipple = 22487, 78 | Enlightenment = 22312, 79 | GuardianAngel = 22095, 80 | HolyWordSalvation = 23145, 81 | LightOfTheNaaru = 21636, 82 | PrayerCircle = 21754, 83 | PsychicVoice = 21750, 84 | RenewedFaith = 19754, 85 | SurgeOfLight = 19764, 86 | TrailOfLight = 19753 87 | } 88 | }, 89 | Shadow = { 90 | Abilities = { 91 | DarkAscension = {SpellID = 280711}, 92 | DarkVoid = {SpellID = 263346}, 93 | MindBlast = {SpellID = 8092}, 94 | MindFlay = {SpellID = 15407}, 95 | MindSear = {SpellID = 48045}, 96 | Mindbender = {SpellID = 200174}, 97 | ShadowCrash = {SpellID = 205385}, 98 | ShadowWordDeath = {SpellID = 32379}, 99 | ShadowWordPain = {SpellID = 589}, 100 | SurrenderToMadness = {SpellID = 193223}, 101 | VampiricTouch = {SpellID = 34914}, 102 | VoidBolt = {SpellID = 228266}, 103 | VoidEruption = {SpellID = 228260} 104 | }, 105 | Buffs = { 106 | HarvestedThoughts = 273321, 107 | Voidform = 228264 108 | }, 109 | Debuffs = { 110 | ShadowWordPain = {SpellID = 589, BaseDuration = 16} 111 | }, 112 | Talents = { 113 | AncientMadness = 21637, 114 | AuspiciousSpirits = 22310, 115 | Damnation = 21718, 116 | DeathAndMadness = 22136, 117 | FortressOfTheMind = 22328, 118 | HungeringVoid = 21978, 119 | Intangibility = 21976, 120 | LastWord = 23137, 121 | MindBomb = 23375, 122 | Mindbender = 21719, 123 | Misery = 23126, 124 | PsychicHorror = 21752, 125 | PsychicLink = 22311, 126 | Sanlayn = 23374, 127 | SearingNightmare = 23127, 128 | ShadowCrash = 21755, 129 | SurrenderToMadness = 21979, 130 | TwistOfFate = 23125, 131 | UnfurlingDarkness = 22314, 132 | VoidTorrent = 21720 133 | } 134 | }, 135 | All = { 136 | Abilities = { 137 | DispelMagic = {SpellID = 528}, 138 | Fade = {SpellID = 586}, 139 | Levitate = {SpellID = 1706}, 140 | MassDispel = {SpellID = 32375}, 141 | MindControl = {SpellID = 605}, 142 | Resurrection = {SpellID = 2006}, 143 | ShackleUndead = {SpellID = 9484} 144 | }, 145 | Buffs = {}, 146 | Debuffs = {}, 147 | Talents = { 148 | AngelicFeather = 19758, 149 | Benediction = 19767, 150 | BodyAndSoul = 22315, 151 | Castigation = 19752, 152 | Contrition = 19765, 153 | DivineStar = 19760, 154 | Halo = 19763, 155 | Mindbender = 22094, 156 | PowerWordSolace = 19755, 157 | ShadowCovenant = 19766, 158 | ShieldDiscipline = 22440, 159 | ShiningForce = 19761, 160 | SpiritShell = 21184 161 | } 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /Enums/Spells/Shaman.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.SHAMAN = { 4 | Elemental = { 5 | Abilities = {}, 6 | Buffs = {}, 7 | Debuffs = {}, 8 | Talents = { 9 | Aftershock = 23108, 10 | AncestralGuidance = 22172, 11 | Ascendance = 21675, 12 | EarthShield = 23163, 13 | EarthenRage = 22356, 14 | EchoOfTheElements = 22357, 15 | EchoingShock = 23460, 16 | ElementalBlast = 23190, 17 | Icefury = 23111, 18 | LiquidMagmaTotem = 19273, 19 | MasterOfTheElements = 19271, 20 | PrimalElementalist = 19266, 21 | SpiritWolf = 23162, 22 | StaticCharge = 23164, 23 | StaticDischarge = 22358, 24 | StormElemental = 19272, 25 | Stormkeeper = 22153, 26 | SurgeOfPower = 22145, 27 | UnlimitedPower = 21198 28 | } 29 | }, 30 | Enhancement = { 31 | Abilities = {}, 32 | Buffs = {}, 33 | Debuffs = {}, 34 | Talents = { 35 | Ascendance = 21972, 36 | CrashingStorm = 21973, 37 | EarthShield = 19260, 38 | EarthenSpike = 22977, 39 | ElementalAssault = 23089, 40 | ElementalBlast = 22353, 41 | ElementalSpirits = 21970, 42 | FeralLunge = 22149, 43 | FireNova = 22171, 44 | ForcefulWinds = 22355, 45 | Hailstorm = 23090, 46 | HotHand = 23462, 47 | IceStrike = 23109, 48 | LashingFlames = 22354, 49 | SpiritWolf = 23165, 50 | StaticCharge = 23166, 51 | Stormflurry = 22636, 52 | Stormkeeper = 22352, 53 | Sundering = 22351 54 | } 55 | }, 56 | Restoration = { 57 | Abilities = {}, 58 | Buffs = {}, 59 | Debuffs = {}, 60 | Talents = { 61 | AncestralProtectionTotem = 22323, 62 | AncestralVigor = 22152, 63 | Ascendance = 22359, 64 | Deluge = 23461, 65 | Downpour = 21971, 66 | EarthenWallTotem = 22322, 67 | EarthgrabTotem = 23110, 68 | FlashFlood = 19265, 69 | GracefulSpirit = 19269, 70 | HighTide = 21969, 71 | SurgeOfEarth = 21963, 72 | Torrent = 19262, 73 | Undulation = 19263, 74 | UnleashLife = 19264, 75 | Wellspring = 21199 76 | } 77 | }, 78 | All = { 79 | Abilities = {}, 80 | Buffs = {}, 81 | Debuffs = {}, 82 | Talents = { 83 | CloudburstTotem = 21968, 84 | EchoOfTheElements = 19259, 85 | NaturesGuardian = 22144, 86 | SpiritWolf = 19275, 87 | StaticCharge = 22127, 88 | WindRushTotem = 21966 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /Enums/Spells/Warlock.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.WARLOCK = { 4 | Affliction = { 5 | Abilities = { 6 | Agony = {SpellID = 980}, 7 | Corruption = {SpellID = 172}, 8 | DarkSoulMisery = {SpellID = 113860}, 9 | Deathbolt = {SpellID = 264106}, 10 | DrainLife = {SpellID = 234153, CastType = "Channel"}, 11 | DrainSoul = {SpellID = 198590, CastType = "Channel"}, 12 | GrimoireOfSacrifice = {SpellID = 108503}, 13 | Haunt = {SpellID = 48181}, 14 | PhantomSingularity = {SpellID = 205179, CastType = "Ground"}, 15 | SeedOfCorruption = {SpellID = 27243}, 16 | ShadowBolt = {SpellID = 232670}, 17 | SiphonLife = {SpellID = 63106}, 18 | SpellLock = {SpellID = 19647}, 19 | SpellLockGrimoire = {SpellID = 132409}, 20 | SummonDarkglare = {SpellID = 205180}, 21 | UnstableAffliction = {SpellID = 30108}, 22 | VileTaint = {SpellID = 278350, CastType = "Ground"} 23 | }, 24 | Buffs = {}, 25 | Debuffs = { 26 | Agony = {SpellID = 980, BaseDuration = 18}, 27 | Corruption = {SpellID = 146739, BaseDuration = 14}, 28 | Haunt = {SpellID = 48181, BaseDuration = 15}, 29 | PhantomSingularity = {SpellID = 205179}, 30 | SeedOfCorruption = {SpellID = 27243}, 31 | ShadowEmbrace = {SpellID = 32388}, 32 | SiphonLife = {SpellID = 63106, BaseDuration = 15}, 33 | UnstableAffliction1 = {SpellID = 233490}, 34 | UnstableAffliction2 = {SpellID = 233496}, 35 | UnstableAffliction3 = {SpellID = 233497}, 36 | UnstableAffliction4 = {SpellID = 233498}, 37 | UnstableAffliction5 = {SpellID = 233499} 38 | }, 39 | Talents = { 40 | AbsoluteCorruption = 21180, 41 | CreepingDeath = 19281, 42 | DarkCaller = 23139, 43 | DarkSoulMisery = 19293, 44 | DrainSoul = 23141, 45 | Haunt = 23159, 46 | InevitableDemise = 23140, 47 | Nightfall = 22039, 48 | SiphonLife = 22089, 49 | SowTheSeeds = 19279, 50 | VileTaint = 22046, 51 | WritheInAgony = 22044 52 | } 53 | }, 54 | Demonology = { 55 | Abilities = {}, 56 | Buffs = {}, 57 | Debuffs = {}, 58 | Talents = { 59 | BilescourgeBombers = 22048, 60 | DemonicCalling = 22045, 61 | DemonicConsumption = 22479, 62 | DemonicStrength = 23138, 63 | Doom = 23158, 64 | Dreadlash = 19290, 65 | FromTheShadows = 22477, 66 | GrimoireFelguard = 21717, 67 | InnerDemons = 23146, 68 | NetherPortal = 23091, 69 | PowerSiphon = 21694, 70 | SacrificedSouls = 23161, 71 | SoulConduit = 23147, 72 | SoulStrike = 22042, 73 | SummonVilefiend = 23160 74 | } 75 | }, 76 | Destruction = { 77 | Abilities = {}, 78 | Buffs = {}, 79 | Debuffs = {}, 80 | Talents = { 81 | Cataclysm = 23143, 82 | ChannelDemonfire = 23144, 83 | DarkSoulInstability = 23092, 84 | Eradication = 22090, 85 | FireAndBrimstone = 22043, 86 | Flashover = 22038, 87 | Inferno = 22480, 88 | InternalCombustion = 21695, 89 | RainOfChaos = 23156, 90 | ReverseEntropy = 23148, 91 | RoaringBlaze = 23155, 92 | Shadowburn = 23157, 93 | SoulFire = 22040 94 | } 95 | }, 96 | All = { 97 | Abilities = {}, 98 | Buffs = {}, 99 | Debuffs = {}, 100 | Talents = { 101 | BurningRush = 19285, 102 | DarkPact = 19286, 103 | Darkfury = 22047, 104 | DemonSkin = 19280, 105 | GrimoireOfSacrifice = 19295, 106 | HowlOfTerror = 23465, 107 | MortalCoil = 19291, 108 | PhantomSingularity = 19292, 109 | SoulConduit = 19284 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /Enums/Spells/Warrior.lua: -------------------------------------------------------------------------------- 1 | local Spells = DMW.Enums.Spells 2 | 3 | Spells.WARRIOR = { 4 | Arms = { 5 | Abilities = {}, 6 | Buffs = {}, 7 | Debuffs = {}, 8 | Talents = { 9 | AngerManagement = 21204, 10 | Avatar = 22397, 11 | Cleave = 22362, 12 | CollateralDamage = 22392, 13 | DeadlyCalm = 22399, 14 | DefensiveStance = 22628, 15 | Dreadnaught = 22407, 16 | FervorOfBattle = 22489, 17 | ImpendingVictory = 22372, 18 | InForTheKill = 22394, 19 | Massacre = 22380, 20 | Ravager = 21667, 21 | Rend = 19138, 22 | SecondWind = 15757, 23 | Skullsplitter = 22371, 24 | StormBolt = 22789, 25 | SuddenDeath = 22360, 26 | WarMachine = 22624, 27 | Warbreaker = 22391 28 | } 29 | }, 30 | Fury = { 31 | Abilities = {}, 32 | Buffs = {}, 33 | Debuffs = {}, 34 | Talents = { 35 | AngerManagement = 22405, 36 | Bladestorm = 22400, 37 | Cruelty = 19140, 38 | DragonRoar = 22398, 39 | Frenzy = 22381, 40 | FreshMeat = 22491, 41 | FrothingBerserker = 22393, 42 | FuriousCharge = 23097, 43 | ImpendingVictory = 22625, 44 | Massacre = 22379, 45 | MeatCleaver = 22396, 46 | Onslaught = 23372, 47 | RecklessAbandon = 22402, 48 | Seethe = 22383, 49 | Siegebreaker = 16037, 50 | StormBolt = 23093, 51 | SuddenDeath = 22633, 52 | WarMachine = 22632, 53 | Warpaint = 22382 54 | } 55 | }, 56 | Protection = { 57 | Abilities = { 58 | Avatar = {SpellID = 107574}, 59 | DemoralizingShout = {SpellID = 1160}, 60 | Devastate = {SpellID = 20243}, 61 | DragonRoar = {SpellID = 118000}, 62 | IgnorePain = {SpellID = 190456}, 63 | Intercept = {SpellID = 198304}, 64 | LastStand = {SpellID = 12975}, 65 | Ravager = {SpellID = 228920, CastType = "Ground"}, 66 | Revenge = {SpellID = 6572}, 67 | ShieldBlock = {SpellID = 132404}, 68 | ShieldSlam = {SpellID = 23922}, 69 | ShieldWall = {SpellID = 871}, 70 | Shockwave = {SpellID = 46968}, 71 | SpellReflection = {SpellID = 23920}, 72 | ThunderClap = {SpellID = 6343} 73 | }, 74 | Buffs = { 75 | Avatar = 107574, 76 | IgnorePain = 190456, 77 | LastStand = 12975, 78 | ShieldBlock = 132404, 79 | ShieldWall = 871, 80 | SpellReflection = 23920 81 | }, 82 | Debuffs = { 83 | DemoralizingShout = {SpellID = 1160}, 84 | DragonRoar = {SpellID = 118000} 85 | }, 86 | Talents = { 87 | AngerManagement = 23455, 88 | BestServedCold = 22378, 89 | Bolster = 23099, 90 | BoomingVoice = 22626, 91 | CracklingThunder = 23096, 92 | Devastator = 15774, 93 | DragonRoar = 23260, 94 | HeavyRepercussions = 22406, 95 | ImpendingVictory = 22800, 96 | Indomitable = 22631, 97 | IntoTheFray = 22395, 98 | Menace = 22488, 99 | NeverSurrender = 22384, 100 | Punish = 15759, 101 | Ravager = 22401, 102 | RumblingEarth = 22629, 103 | StormBolt = 22409, 104 | UnstoppableForce = 22544, 105 | WarMachine = 15760 106 | } 107 | }, 108 | All = { 109 | Abilities = { 110 | BattleShout = {SpellID = 6673}, 111 | BerserkerRage = {SpellID = 18499}, 112 | Charge = {SpellID = 100}, 113 | HeroicLeap = {SpellID = 6544, CastType = "Ground"}, 114 | HeroicThrow = {SpellID = 57755}, 115 | IntimidatingShout = {SpellID = 5246}, 116 | Pummel = {SpellID = 6552, SpellType = "Interrupt"}, 117 | RallyingCry = {SpellID = 97462}, 118 | Recklessness = {SpellID = 1719}, 119 | StormBolt = {SpellID = 107570, SpellType = "Stun"}, 120 | Taunt = {SpellID = 355}, 121 | VictoryRush = {SpellID = 34428} 122 | }, 123 | Buffs = { 124 | BattleShout = 6673, 125 | RallyingCry = 97462, 126 | Recklessness = 1719 127 | }, 128 | Debuffs = {}, 129 | Talents = { 130 | BoundingStride = 22627, 131 | DoubleTime = 19676 132 | } 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /Enums/Tracker.lua: -------------------------------------------------------------------------------- 1 | DMW.Enums.Tracker = {} 2 | local Tracker = DMW.Enums.Tracker 3 | 4 | Tracker.Visions = { 5 | [341337] = "Vial of Mysterious Black Liquid", 6 | [341376] = "Odd Crystal", 7 | [341367] = "Odd Crystal", 8 | [341368] = "Odd Crystal", 9 | [341369] = "Odd Crystal", 10 | [341372] = "Odd Crystal", 11 | [341338] = "Vial of Mysterious Blue Liquid", 12 | [341339] = "Vial of Mysterious Green Liquid", 13 | [341341] = "Vial of Mysterious Red Liquid", 14 | [342135] = "Black Empire Cache", 15 | [349341] = "Black Empire Cache", 16 | [349342] = "Black Empire Cache", 17 | [349343] = "Black Empire Cache", 18 | [342136] = "Black Empire Cache", 19 | [342137] = "Black Empire Cache", 20 | [342203] = "Black Empire Cache", 21 | [342204] = "Black Empire Cache", 22 | [342205] = "Black Empire Cache", 23 | [342206] = "Black Empire Cache", 24 | [341340] = "Vial of Mysterious Purple Liquid" 25 | } 26 | 27 | Tracker.TorghastUnits = { 28 | [167986] = "Ashen Phylactery", 29 | [169902] = "Soul" 30 | } 31 | 32 | Tracker.TorghastObjects = { 33 | [336801] = "Anima Chest", 34 | [336799] = "Anima Chest", 35 | [324030] = "Anima Cell", 36 | [330193] = "Anima Cell", 37 | [338483] = "Stolen Anima" 38 | } 39 | 40 | Tracker.Herbs = { 41 | [294125] = "Anchor Weed", 42 | [276242] = "Anchor Weed", 43 | [276234] = "Riverbud", 44 | [281870] = "Riverbud", 45 | [276237] = "Akunda's Bite", 46 | [276238] = "Winter's Kiss", 47 | [276239] = "Siren's Sting", 48 | [281869] = "Siren's Sting", 49 | [276240] = "Sea Stalks", 50 | [281872] = "Sea Stalks", 51 | [281079] = "Star Moss", 52 | [281868] = "Star Moss", 53 | [281867] = "Star Moss", 54 | [276236] = "Star Moss", 55 | [326598] = "Zin'anthid", 56 | [336433] = "Widowbloom", 57 | [336688] = "Vigil's Torch", 58 | [336689] = "Marrowroot", 59 | [336686] = "Death Blossom", 60 | [351469] = "Death Blossom", 61 | [351470] = "Death Blossom", 62 | [351471] = "Death Blossom", 63 | [336691] = "Nightshade", 64 | [336690] = "Rising Glory" 65 | } 66 | 67 | Tracker.Ore = { 68 | [276617] = "Storm Silver Deposit", 69 | [276618] = "Platinum Deposit", 70 | [276616] = "Monelite Deposit", 71 | [325875] = "Osmenite Deposit", 72 | [276620] = "Storm Silver Seam", 73 | [276621] = "Rich Monelite Deposit", 74 | [276619] = "Monelite Seam", 75 | [276623] = "Rich Platinum Deposit", 76 | [325874] = "Osmenite Seam", 77 | [276622] = "Rich Storm Silver Deposit", 78 | [297626] = "Ductile Platinum Deposit", 79 | [297468] = "Hardened Monelite Deposit", 80 | [325873] = "Rich Osmenite Deposit", 81 | [297469] = "Gleaming Storm Silver Deposit", 82 | [297624] = "Hardened Monelite Deposit", 83 | [297474] = "Ductile Platinum Deposit", 84 | [297621] = "Rough Monelite Deposit", 85 | [297466] = "Luminous Monelite Deposit", 86 | [297467] = "Rough Monelite Deposit", 87 | [297623] = "Smooth Platinum Deposit", 88 | [297618] = "Luminous Monelite Deposit", 89 | [297622] = "Coarse Storm Silver Deposit", 90 | [297472] = "Burnished Platinum Deposit", 91 | [297470] = "Coarse Storm Silver Deposit", 92 | [297625] = "Dense Storm Silver Deposit", 93 | [297619] = "Gleaming Storm Silver Deposit", 94 | [297620] = "Burnished Platinum Deposit", 95 | [297471] = "Dense Storm Silver Deposit", 96 | [349898] = "Laestrite Deposit", 97 | [349899] = "Rich Laestrite Deposit", 98 | [349900] = "Elethium Deposit", 99 | [349980] = "Solenium Deposit", 100 | [349981] = "Oxxein Deposit", 101 | [349982] = "Phaedrum Deposit", 102 | [355508] = "Phaedrum Deposit", 103 | [349983] = "Sinvyr Deposit", 104 | [350082] = "Rich Elethium Deposit", 105 | [350086] = "Rich Solenium Deposit", 106 | [350085] = "Rich Oxxein Deposit" 107 | } 108 | 109 | Tracker.MountsRare = { 110 | [148790] = "Frightened Kodo", 111 | [50409] = "Mysterious Camel Figurine", 112 | [32491] = "Time-Lost Proto-Drake", 113 | [157134] = "Ishak of the Four Winds", 114 | [157162] = "Rei Lun", 115 | [50062] = "Aeonaxx", 116 | [50005] = "Poseidus", 117 | [62346] = "Galleon", 118 | [60491] = "Sha of Anger", 119 | [69099] = "Nalak", 120 | --[69161] = "Oondasta", 121 | [69841] = "Zandalari Warbringer", 122 | [69842] = "Zandalari Warbringer", 123 | [69769] = "Zandalari Warbringer", 124 | [73167] = "Huolon", 125 | [50990] = "Nakk the Thunderer", 126 | [50981] = "Luk'hok", 127 | [50992] = "Gorok", 128 | [51015] = "Silthide", 129 | [50985] = "Poundfist", 130 | [87493] = "Rukhmar", 131 | [50883] = "Pathrunner", 132 | [81001] = "Nok-Karosh", 133 | [126912] = "Skreeg the Devourer", 134 | [126040] = "Puscilla", 135 | [126199] = "Vrax'thul", 136 | [122958] = "Blistermaw", 137 | [127288] = "Houndmaster Kerrax", 138 | [126852] = "Wrangler Kravos", 139 | [126867] = "Venomtail Skyfin", 140 | [140474] = "Adherent of the Abyss", 141 | [142692] = "Nimar the Slayer", 142 | [142741] = "Doomrider Helgrim", 143 | [142739] = "Knight-Captain Aldrin", 144 | [142423] = "Overseer Krix", 145 | [142709] = "Beastrider Kama", 146 | [142437] = "Skullripper", 147 | [148154] = "Agathe Wyrmwood", 148 | [149660] = "Blackpaw", 149 | [148787] = "Alash'anir", 150 | [145268] = "Shadowclaw", 151 | [148144] = "Croz Bloodrage", 152 | [147701] = "Moxo the Beheader", 153 | [148037] = "Athil Dewfire", 154 | [152182] = "Rustfeather", 155 | [151934] = "Arachnoid Harvester", 156 | [152290] = "Soundless", 157 | [138794] = "Dunegorger Kraulok", 158 | [162147] = "Corpse Eater", 159 | [163042] = "Ivory Cloud Serpent", 160 | [157160] = "Houndlord Ren", 161 | [157466] = "Anh-De the Loyal", 162 | [157153] = "Ha-Li", 163 | [157146] = "Rotfeaster", 164 | [162765] = "Friendly Alpaca", 165 | [173468] = "Dead Blanchy" 166 | } 167 | -------------------------------------------------------------------------------- /Helpers/Gatherers.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | DMW.Helpers.Gatherers = {} 3 | local Looting = false 4 | local Skinning = false 5 | local NextFishCast = false 6 | 7 | function DMW.Helpers.Gatherers.Run() 8 | if DMW.Player:Standing() and not DMW.Player.Casting and not UnitIsDeadOrGhost("player") then 9 | if Looting and (DMW.Time - Looting) > 0 and not DMW.Player.Looting then 10 | Looting = false 11 | end 12 | if DMW.Settings.profile.Gatherers.AutoLoot and not IsMounted() then 13 | if not Looting and not DMW.Player.Combat then 14 | for _, Unit in pairs(DMW.Units) do 15 | if Unit.Dead and Unit.Distance < 1.5 and UnitCanBeLooted(Unit.Pointer) then 16 | InteractUnit(Unit.Pointer) 17 | Looting = DMW.Time + 0.6 18 | end 19 | end 20 | end 21 | end 22 | if DMW.Settings.profile.Gatherers.AutoSkinning and not IsMounted() then 23 | if Skinning and (DMW.Time - Skinning) > 2.3 then 24 | Skinning = false 25 | end 26 | if not Skinning and not DMW.Player.Combat and not DMW.Player.Moving and not DMW.Player.Casting then 27 | for _, Unit in pairs(DMW.Units) do 28 | if Unit.Dead and Unit.Distance < 1.5 and UnitCanBeSkinned(Unit.Pointer) then 29 | InteractUnit(Unit.Pointer) 30 | Skinning = DMW.Time 31 | end 32 | end 33 | end 34 | end 35 | if DMW.Settings.profile.Gatherers.AutoGather then 36 | if not Looting and not DMW.Player.Combat and not DMW.Player.Moving then 37 | for _, Object in pairs(DMW.GameObjects) do 38 | if Object.Distance < 5 then 39 | if Object.Herb and (not DMW.Player.Spells.HerbGathering:LastCast() or (DMW.Player.LastCast[1].SuccessTime and (DMW.Time - DMW.Player.LastCast[1].SuccessTime) > 2)) then 40 | ObjectInteract(Object.Pointer) 41 | Looting = DMW.Time + 0.3 42 | elseif Object.Ore and (not DMW.Player.Spells.Mining:LastCast() or (DMW.Player.LastCast[1].SuccessTime and (DMW.Time - DMW.Player.LastCast[1].SuccessTime) > 2)) then 43 | ObjectInteract(Object.Pointer) 44 | Looting = DMW.Time + 0.3 45 | elseif Object.Trackable then 46 | ObjectInteract(Object.Pointer) 47 | Looting = DMW.Time + 0.6 48 | end 49 | end 50 | end 51 | end 52 | end 53 | if DMW.Settings.profile.Gatherers.AutoFishing and not Looting then 54 | if not DMW.Player.Casting and not DMW.Player.Looting then 55 | if not NextFishCast then 56 | NextFishCast = DMW.Time + (math.random(1300, 2900) / 1000) 57 | elseif DMW.Time > NextFishCast and DMW.Player.Spells.Fishing:Cast(DMW.Player) then 58 | Looting = DMW.Time + 0.3 59 | NextFishCast = false 60 | end 61 | end 62 | end 63 | end 64 | end 65 | -------------------------------------------------------------------------------- /Helpers/Rotation.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | DMW.Helpers.Rotation = {} 3 | local Rotation = DMW.Helpers.Rotation 4 | 5 | function Rotation.Active(CastingCheck) 6 | if DMW.Settings.profile.HUD.Rotation == 1 and DMW.Helpers.Navigation.Mode ~= 2 and (CastingCheck ~= nil or not DMW.Player.Casting) and not (IsMounted() or IsFlying()) and not DMW.Player.NoControl then 7 | return true 8 | end 9 | return false 10 | end 11 | 12 | function Rotation.GetSpellByID(SpellID) 13 | local SpellName = GetSpellInfo(SpellID) 14 | for _, Spell in pairs(DMW.Player.Spells) do 15 | if Spell.SpellName == SpellName then 16 | return Spell 17 | end 18 | end 19 | end 20 | 21 | function Rotation.RawDistance(X1, Y1, Z1, X2, Y2, Z2) 22 | return sqrt(((X1 - X2) ^ 2) + ((Y1 - Y2) ^ 2) + ((Z1 - Z2) ^ 2)) 23 | end 24 | 25 | function Rotation.Setting(Setting) 26 | return DMW.Settings.profile.Rotation[Setting] 27 | end 28 | 29 | function Rotation.Defensive() 30 | local CastID, ChannelID 31 | for _, Unit in ipairs(DMW.Enemies) do 32 | CastID, ChannelID = UnitCastID(Unit.Pointer) 33 | if CastID and DMW.Enums.DefensiveCast[CastID] then 34 | return true 35 | elseif ChannelID and DMW.Enums.DefensiveCast[ChannelID] then 36 | return true 37 | end 38 | end 39 | for SpellID, _ in pairs(DMW.Enums.DefensiveDebuff) do 40 | if DMW.Player:AuraByID(SpellID) then 41 | return true 42 | end 43 | end 44 | end -------------------------------------------------------------------------------- /Helpers/Trackers.lua: -------------------------------------------------------------------------------- 1 | local DMW = DMW 2 | local AlertTimer = GetTime() 3 | DMW.Helpers.Trackers = {} 4 | local LibDraw = LibStub("LibDraw-1.0") 5 | local tX, tY, tZ 6 | local Settings 7 | 8 | function DMW.Helpers.DrawLineDMW(sx, sy, sz, ex, ey, ez) 9 | local function WorldToScreen(wX, wY, wZ) 10 | local sX, sY = _G.WorldToScreen(wX, wY, wZ) 11 | if sX and sY then 12 | return sX, -(WorldFrame:GetTop() - sY) 13 | else 14 | return sX, sY 15 | end 16 | end 17 | local startx, starty = WorldToScreen(sx, sy, sz) 18 | local endx, endy = WorldToScreen(ex, ey, ez) 19 | if (endx == nil or endy == nil) and (startx and starty) then 20 | local i = 1 21 | while (endx == nil or endy == nil) and i < 50 do 22 | endx, endy = WorldToScreen(GetPositionBetweenPositions(ex, ey, ez, sx, sy, sz, i)) 23 | i = i + 1 24 | end 25 | end 26 | if (startx == nil or starty == nil) and (endx and endy) then 27 | local i = 1 28 | while (startx == nil or starty == nil) and i < 50 do 29 | startx, starty = WorldToScreen(GetPositionBetweenPositions(sx, sy, sz, ex, ey, ez, i)) 30 | i = i + 1 31 | end 32 | end 33 | LibDraw.Draw2DLine(startx, starty, endx, endy) 34 | end 35 | 36 | function DMW.Helpers.Trackers.Run() 37 | LibDraw.SetColorRaw(0, 1, 0) 38 | if not Settings then 39 | Settings = DMW.Settings.profile 40 | end 41 | local s = 1 42 | for _, Unit in pairs(DMW.Units) do 43 | if Settings.Trackers.Quests and Unit.IsQuest then 44 | Unit:UpdatePosition() 45 | tX, tY, tZ = Unit.PosX, Unit.PosY, Unit.PosZ 46 | LibDraw.SetWidth(4) 47 | LibDraw.Line(tX, tY, tZ + s * 1.3, tX, tY, tZ) 48 | LibDraw.Line(tX - s, tY, tZ, tX + s, tY, tZ) 49 | LibDraw.Line(tX, tY - s, tZ, tX, tY + s, tZ) 50 | end 51 | if Settings.Developer.Units or (DMW.Enums.Tracker.MountsRare[Unit.ObjectID] and not Unit.Dead) then 52 | LibDraw.Text("Unit: " .. Unit.Name .. " (" .. Unit.ObjectID .. ") - " .. math.floor(Unit.Distance) .. " Yards", "GameFontNormal", Unit.PosX, Unit.PosY, Unit.PosZ + 2) 53 | end 54 | if DMW.Enums.Tracker.MountsRare[Unit.ObjectID] and not Unit.Dead then 55 | if (AlertTimer + 5) < DMW.Time and not IsForeground() then 56 | FlashClientIcon() 57 | AlertTimer = DMW.Time 58 | end 59 | tX, tY, tZ = Unit.PosX, Unit.PosY, Unit.PosZ 60 | LibDraw.SetWidth(4) 61 | DMW.Helpers.DrawLineDMW(tX, tY, tZ, DMW.Player.PosX, DMW.Player.PosY, DMW.Player.PosZ + 2) 62 | end 63 | end 64 | for _, Object in pairs(DMW.GameObjects) do 65 | if Settings.Trackers.Quests and Object.IsQuest then 66 | tX, tY, tZ = Object.PosX, Object.PosY, Object.PosZ 67 | LibDraw.SetWidth(4) 68 | LibDraw.Line(tX, tY, tZ + s * 1.3, tX, tY, tZ) 69 | LibDraw.Line(tX - s, tY, tZ, tX + s, tY, tZ) 70 | LibDraw.Line(tX, tY - s, tZ, tX, tY + s, tZ) 71 | end 72 | if Settings.Developer.GameObjects then 73 | LibDraw.Text("GO: " .. Object.Name .. " (" .. Object.ObjectID .. ") - " .. math.floor(Object.Distance) .. " Yards", "GameFontNormal", Object.PosX, Object.PosY, Object.PosZ + 2) 74 | elseif Settings.Trackers.HorrificVisions and (DMW.Enums.Tracker.Visions[Object.ObjectID] or Object.Name == "Black Empire Cache" or Object.Name == "Odd Crystal") then 75 | LibDraw.Text(Object.Name .. " - " .. math.floor(Object.Distance) .. " Yards", "GameFontNormal", Object.PosX, Object.PosY, Object.PosZ + 2) 76 | elseif Settings.Trackers.Herbs and Object:IsHerb() then 77 | LibDraw.Text(Object.Name .. " - " .. math.floor(Object.Distance) .. " Yards", "GameFontNormal", Object.PosX, Object.PosY, Object.PosZ + 2) 78 | DMW.Helpers.DrawLineDMW(Object.PosX, Object.PosY, Object.PosZ, DMW.Player.PosX, DMW.Player.PosY, DMW.Player.PosZ + 2) 79 | elseif Settings.Trackers.Ore and Object:IsOre() then 80 | LibDraw.Text(Object.Name .. " - " .. math.floor(Object.Distance) .. " Yards", "GameFontNormal", Object.PosX, Object.PosY, Object.PosZ + 2) 81 | DMW.Helpers.DrawLineDMW(Object.PosX, Object.PosY, Object.PosZ, DMW.Player.PosX, DMW.Player.PosY, DMW.Player.PosZ + 2) 82 | end 83 | end 84 | if Settings.Developer.AreaTriggers then 85 | for _, AreaTrigger in pairs(DMW.AreaTriggers) do 86 | LibDraw.Text("Area Trigger: " .. AreaTrigger.ObjectID .. " - " .. math.floor(AreaTrigger.Distance) .. " Yards", "GameFontNormal", AreaTrigger.PosX, AreaTrigger.PosY, AreaTrigger.PosZ + 2) 87 | end 88 | end 89 | if Settings.Developer.Missiles then 90 | for _, Missile in pairs(DMW.Missiles) do 91 | if Missile.SpellName then 92 | LibDraw.Text(Missile.SpellName .. "(" .. Missile.SpellID .. ")", "GameFontNormal", Missile.PosX, Missile.PosY, Missile.PosZ + 1) 93 | DMW.Helpers.DrawLineDMW(Missile.PosX, Missile.PosY, Missile.PosZ, Missile.TPosX, Missile.TPosY, Missile.TPosZ) 94 | end 95 | end 96 | end 97 | end 98 | -------------------------------------------------------------------------------- /Libs/!LibDraw/!LibDraw.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 60000 2 | ## Title: !LibDraw 3 | 4 | Libs\LibStub\LibStub.lua 5 | LibDraw.lua -------------------------------------------------------------------------------- /Libs/!LibDraw/Libs/LibStub/LibStub.lua: -------------------------------------------------------------------------------- 1 | -- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info 2 | -- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke 3 | local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! 4 | local LibStub = _G[LIBSTUB_MAJOR] 5 | 6 | if not LibStub or LibStub.minor < LIBSTUB_MINOR then 7 | LibStub = LibStub or {libs = {}, minors = {} } 8 | _G[LIBSTUB_MAJOR] = LibStub 9 | LibStub.minor = LIBSTUB_MINOR 10 | 11 | function LibStub:NewLibrary(major, minor) 12 | assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") 13 | minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") 14 | 15 | local oldminor = self.minors[major] 16 | if oldminor and oldminor >= minor then return nil end 17 | self.minors[major], self.libs[major] = minor, self.libs[major] or {} 18 | return self.libs[major], oldminor 19 | end 20 | 21 | function LibStub:GetLibrary(major, silent) 22 | if not self.libs[major] and not silent then 23 | error(("Cannot find a library instance of %q."):format(tostring(major)), 2) 24 | end 25 | return self.libs[major], self.minors[major] 26 | end 27 | 28 | function LibStub:IterateLibraries() return pairs(self.libs) end 29 | setmetatable(LibStub, { __call = LibStub.GetLibrary }) 30 | end 31 | -------------------------------------------------------------------------------- /Libs/!LibDraw/Media/LineTemplate.tga: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fiskee/DoMeWhen/41aaf5bdbca8977746ebc2d880ed8d6ed21b9ba7/Libs/!LibDraw/Media/LineTemplate.tga -------------------------------------------------------------------------------- /Libs/AceAddon-3.0/AceAddon-3.0.xml: -------------------------------------------------------------------------------- 1 | 3 |