root@0: -- stevekaye@6: -- MinimapRange 2.10 - Steve Kaye root@0: -- root@0: -- Shows a circle on the minimap to indicate spell range root@0: -- root@0: stevekaye@3: MinimapRange = LibStub("AceAddon-3.0"):NewAddon("MinimapRange", "AceHook-3.0", "AceEvent-3.0", "AceConsole-3.0") root@0: root@0: MinimapRange.outdoorRanges = root@0: { root@0: [0] = { root@0: [5] = 13, root@0: [8] = 15, root@0: [45] = 35, root@0: [100] = 70 root@0: }, root@0: [1] = { root@0: [5] = 13.5, root@0: [8] = 15.5, root@0: [45] = 40, root@0: [100] = 80 root@0: }, root@0: [2] = { root@0: [5] = 14, root@0: [8] = 16, root@0: [45] = 45, root@0: [100] = 94 root@0: }, root@0: [3] = { root@0: [5] = 15, root@0: [8] = 18, root@0: [45] = 57, root@0: [100] = 115 root@0: }, root@0: [4] = { root@0: [5] = 16, root@0: [8] = 22, root@0: [45] = 73 root@0: }, root@0: [5] = { root@0: [5] = 20, root@0: [8] = 30, root@0: [45] = 105 root@0: } root@0: } root@0: root@0: MinimapRange.indoorRanges = root@0: { root@0: [0] = { root@0: [5] = 13, root@0: [8] = 16, root@0: [30] = 37, root@0: [36] = 43, root@0: [45] = 52, root@0: [100] = 70 -- suspect root@0: }, root@0: [1] = { root@0: [5] = 15, root@0: [8] = 19, root@0: [30] = 43, root@0: [36] = 53, root@0: [45] = 63, root@0: [100] = 80 -- suspect root@0: }, root@0: [2] = { root@0: [5] = 15, root@0: [8] = 23, root@0: [30] = 54, root@0: [36] = 66, root@0: [45] = 84, root@0: [100] = 94 -- suspect root@0: }, root@0: [3] = { stevekaye@3: [5] = 20, root@0: [8] = 34, root@0: [30] = 75, root@0: [36] = 94, root@0: [45] = 118 -- suspect root@0: }, root@0: [4] = { root@0: [5] = 26, root@0: [8] = 90, root@0: [24] = 98, root@0: [30] = 105, root@0: [36] = 118 root@0: }, root@0: [5] = { root@0: [5] = 35, root@0: [8] = 100, root@0: [24] = 130 -- off the minimap root@0: } root@0: } root@0: stevekaye@3: -- Default settings stevekaye@3: local defaults = { stevekaye@3: profile = { root@0: colorRed = 1, root@0: colorGreen = 0, root@0: colorBlue = 0, root@0: colorAlpha = 0.25, stevekaye@3: range = 30 root@0: } stevekaye@3: } stevekaye@3: stevekaye@3: -- The available options stevekaye@3: local options = { stevekaye@3: name = "MinimapRange", stevekaye@3: handler = MinimapRange, stevekaye@3: icon = "Interface\\Icons\\Ability_Warrior_Defensivestance.jpg", stevekaye@3: type = "group", stevekaye@3: args = { stevekaye@3: version = { stevekaye@3: order = 1, stevekaye@3: type = "description", stevekaye@3: name = "X" stevekaye@3: }, stevekaye@3: description = { stevekaye@3: order = 2, stevekaye@3: type = "description", stevekaye@3: name = "Descriptive text" stevekaye@3: }, stevekaye@3: color = { stevekaye@3: order = 3, stevekaye@3: type = "color", stevekaye@3: name = "Circle Color", stevekaye@3: desc = "Set the color of the range circle.", stevekaye@3: get = function(info) stevekaye@3: return MinimapRange.db.profile.colorRed, MinimapRange.db.profile.colorGreen, MinimapRange.db.profile.colorBlue, MinimapRange.db.profile.colorAlpha stevekaye@3: end, stevekaye@3: set = function(info, r, g, b, a) stevekaye@3: MinimapRange:SetColour(r, g, b, a) stevekaye@3: end, stevekaye@3: hasAlpha = true stevekaye@3: }, stevekaye@3: range = { stevekaye@3: order = 4, stevekaye@3: type = "range", stevekaye@3: name = "Circle Radius", stevekaye@3: desc = "The range that the circle indicates (in yards)", stevekaye@3: min = 5, stevekaye@3: max = 100, stevekaye@3: step = 1, stevekaye@3: get = function() stevekaye@3: return MinimapRange.db.profile.range stevekaye@3: end, stevekaye@3: set = function(info, value) stevekaye@3: MinimapRange:SetRange(value) stevekaye@3: end stevekaye@3: }, stevekaye@3: }, stevekaye@3: } stevekaye@3: stevekaye@3: function MinimapRange:OnInitialize() stevekaye@3: stevekaye@3: -- Get the version number for the TOC stevekaye@3: options.args.version.name = string.format("Version %s", GetAddOnMetadata("MinimapRange", "Version")) stevekaye@3: options.args.description.name = GetAddOnMetadata("MinimapRange", "Notes") stevekaye@3: stevekaye@3: -- Register the database stevekaye@3: self.db = LibStub("AceDB-3.0"):New("MinimapRangeDB", defaults, "Default") root@0: stevekaye@3: local acreg = LibStub("AceConfigRegistry-3.0") root@0: stevekaye@3: -- Register the options stevekaye@3: acreg:RegisterOptionsTable("MinimapRange", options) stevekaye@3: acreg:RegisterOptionsTable("MinimapRange Profiles", LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)) stevekaye@3: stevekaye@3: LibStub("AceConfigDialog-3.0"):AddToBlizOptions("MinimapRange", "MinimapRange") stevekaye@3: LibStub("AceConfigDialog-3.0"):AddToBlizOptions("MinimapRange Profiles", "Profiles", "MinimapRange") stevekaye@3: stevekaye@3: -- Register the chat command stevekaye@3: self:RegisterChatCommand("mmr", "ChatCommand") root@0: end root@0: root@0: -- Enable the addon root@0: function MinimapRange:OnEnable() root@0: root@0: self:CreateFrame() root@0: root@0: self:SecureHook(Minimap, "SetZoom") root@0: self:RegisterEvent("MINIMAP_UPDATE_ZOOM","UpdateZoom") root@0: end root@0: root@0: function MinimapRange:OnDisable() root@0: if self.rangeFrame ~= nil then root@0: self.rangeFrame:Hide() root@0: end root@0: end root@0: stevekaye@3: function MinimapRange:ChatCommand(input) stevekaye@3: LibStub("AceConfigCmd-3.0").HandleCommand(MinimapRange, "mmr", "MinimapRange", input) stevekaye@3: end stevekaye@3: root@0: function MinimapRange:CreateFrame() root@0: root@0: if self.rangeFrame == nil then root@0: -- Create our frame root@0: self.rangeFrame = CreateFrame('Frame', 'MinimapRangeFrame', Minimap) root@0: root@0: -- Set the properties root@0: self.rangeFrame:SetFrameStrata("LOW") root@0: root@0: -- Add the texture root@0: local t = self.rangeFrame:CreateTexture(nil, "BACKGROUND") root@0: t:SetTexture("Interface\\AddOns\\MinimapRange\\MM") root@0: t:SetVertexColor(self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha) root@0: t:SetAllPoints(self.rangeFrame) root@0: self.rangeFrame.texture = t root@0: root@0: self.rangeFrame:SetPoint("CENTER",0,0) stevekaye@3: self:UpdateCircle(self.db.profile.range, self:GetIndoors()) stevekaye@6: stevekaye@6: -- Prevent sexy map from messing around with our frame stevekaye@6: self.rangeFrame.sexyMapMovable = true root@0: end root@0: root@0: self.rangeFrame:Show() root@0: end root@0: root@0: function MinimapRange:SetColour(r, g, b, a) root@0: -- Save the setting root@0: self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha = r, g, b, a root@0: root@0: -- Set the colour of the circle root@0: if self.rangeFrame ~= nil then root@0: self.rangeFrame.texture:SetVertexColor(r, g, b, a) root@0: end root@0: end root@0: root@0: function MinimapRange:SetRange(value) root@0: -- Save the setting root@0: self.db.profile.range = value root@0: root@0: -- Show the new range root@0: self:UpdateCircle(value) root@0: end root@0: stevekaye@3: function MinimapRange:UpdateCircle(range, indoors) root@0: root@0: if self.rangeFrame ~= nil then root@0: local lowerKey, lowerValue = 0, 0 root@0: local upperKey, upperValue = 100, 140 root@0: root@0: -- Get the corrct range table to work with root@0: local rangeTable = self.outdoorRanges stevekaye@3: if indoors then root@0: rangeTable = self.indoorRanges root@0: end root@0: root@0: -- Find two numbers to interpolate between root@0: for k, v in pairs(rangeTable[Minimap:GetZoom()]) do stevekaye@3: root@0: if k > lowerKey and k <= range then root@0: lowerKey = k root@0: lowerValue = v root@0: end root@0: root@0: if k < upperKey and k >= range then root@0: upperKey = k root@0: upperValue = v root@0: end root@0: end root@0: root@0: local size root@0: root@0: -- Do the interpolation if we haven't found an exact match root@0: if lowerKey == upperKey then root@0: size = lowerValue root@0: else root@0: size = lowerValue + ((upperValue - lowerValue) / (upperKey - lowerKey)) * (range - lowerKey) root@0: end root@0: root@0: -- Change the circle size root@0: if size ~= nil then root@0: self.rangeFrame:SetWidth(size) root@0: self.rangeFrame:SetHeight(size) root@0: end root@0: end root@0: end root@0: root@0: function MinimapRange:SetZoom(minimap, level) stevekaye@3: stevekaye@3: -- Prevent recursion into GetIndoors() stevekaye@3: if self.inGetIndoors == nil then stevekaye@3: -- Resize the circle stevekaye@3: self:UpdateCircle(self.db.profile.range, self:GetIndoors()) stevekaye@3: end root@0: end root@0: root@0: function MinimapRange:UpdateZoom() root@0: stevekaye@3: -- Resize the circle stevekaye@3: self:UpdateCircle(self.db.profile.range, self:GetIndoors()) stevekaye@3: stevekaye@3: end stevekaye@3: stevekaye@3: -- stevekaye@3: -- Test to see if we are indoors stevekaye@3: -- stevekaye@3: function MinimapRange:GetIndoors() stevekaye@3: stevekaye@3: local indoors = true stevekaye@3: stevekaye@3: -- Prevent recursion stevekaye@3: self.inGetIndoors = true stevekaye@3: root@0: -- Try to detect whether we are indoors or outdoors root@0: local zoom = Minimap:GetZoom() root@0: local indoorsZoom = tonumber(GetCVar("minimapInsideZoom")) root@0: local outdoorsZoom = tonumber(GetCVar("minimapZoom")) stevekaye@3: local newZoom root@0: root@0: -- Have we detected whether we are inside or outside? root@0: if indoorsZoom ~= outdoorsZoom then root@0: root@0: -- Yes, use the detected value stevekaye@3: indoors = indoorsZoom == zoom stevekaye@3: else root@0: stevekaye@3: -- What shall we set the new zoom to? stevekaye@3: if zoom == 1 then stevekaye@3: newZoom = 2 stevekaye@3: else stevekaye@3: newZoom = 1 root@0: end root@0: stevekaye@3: -- Set the new zoom stevekaye@3: Minimap:SetZoom(newZoom) stevekaye@3: stevekaye@3: -- Did the indoors zoom change? stevekaye@3: indoorsZoom = tonumber(GetCVar("minimapInsideZoom")) stevekaye@3: indoors = indoorsZoom == newZoom stevekaye@3: stevekaye@3: -- Set the zoom back stevekaye@3: Minimap:SetZoom(zoom) root@0: end root@0: stevekaye@3: self.inGetIndoors = nil stevekaye@3: return indoors root@0: end root@0: stevekaye@3: -- stevekaye@3: -- This function was just used for helping determine the original circle sizes stevekaye@3: -- stevekaye@3: function MinimapRange:SetCircle(range, size) stevekaye@3: if self.rangeFrame ~= nil then stevekaye@3: stevekaye@3: local rangeTable = self.outdoorRanges stevekaye@3: if self.db.profile.indoors then stevekaye@3: rangeTable = self.indoorRanges stevekaye@3: end stevekaye@3: stevekaye@3: rangeTable[Minimap:GetZoom()][range] = size stevekaye@3: stevekaye@3: self:UpdateCircle(range) stevekaye@3: end stevekaye@3: end stevekaye@3: