annotate MinimapRange.lua @ 6:2748e92d13f0 2.1

Made a change to prevent SexyMap from changing properties of the MinimapRangeFrame which were causing it to be hidden. Also ignored *.suo
author stevekaye@5e7f7089-49ba-45b1-8616-21aa0651eee7
date Sun, 14 Feb 2010 12:27:38 +0000
parents 596068b6b1bf
children
rev   line source
root@0 1 --
stevekaye@6 2 -- MinimapRange 2.10 - Steve Kaye
root@0 3 --
root@0 4 -- Shows a circle on the minimap to indicate spell range
root@0 5 --
root@0 6
stevekaye@3 7 MinimapRange = LibStub("AceAddon-3.0"):NewAddon("MinimapRange", "AceHook-3.0", "AceEvent-3.0", "AceConsole-3.0")
root@0 8
root@0 9 MinimapRange.outdoorRanges =
root@0 10 {
root@0 11 [0] = {
root@0 12 [5] = 13,
root@0 13 [8] = 15,
root@0 14 [45] = 35,
root@0 15 [100] = 70
root@0 16 },
root@0 17 [1] = {
root@0 18 [5] = 13.5,
root@0 19 [8] = 15.5,
root@0 20 [45] = 40,
root@0 21 [100] = 80
root@0 22 },
root@0 23 [2] = {
root@0 24 [5] = 14,
root@0 25 [8] = 16,
root@0 26 [45] = 45,
root@0 27 [100] = 94
root@0 28 },
root@0 29 [3] = {
root@0 30 [5] = 15,
root@0 31 [8] = 18,
root@0 32 [45] = 57,
root@0 33 [100] = 115
root@0 34 },
root@0 35 [4] = {
root@0 36 [5] = 16,
root@0 37 [8] = 22,
root@0 38 [45] = 73
root@0 39 },
root@0 40 [5] = {
root@0 41 [5] = 20,
root@0 42 [8] = 30,
root@0 43 [45] = 105
root@0 44 }
root@0 45 }
root@0 46
root@0 47 MinimapRange.indoorRanges =
root@0 48 {
root@0 49 [0] = {
root@0 50 [5] = 13,
root@0 51 [8] = 16,
root@0 52 [30] = 37,
root@0 53 [36] = 43,
root@0 54 [45] = 52,
root@0 55 [100] = 70 -- suspect
root@0 56 },
root@0 57 [1] = {
root@0 58 [5] = 15,
root@0 59 [8] = 19,
root@0 60 [30] = 43,
root@0 61 [36] = 53,
root@0 62 [45] = 63,
root@0 63 [100] = 80 -- suspect
root@0 64 },
root@0 65 [2] = {
root@0 66 [5] = 15,
root@0 67 [8] = 23,
root@0 68 [30] = 54,
root@0 69 [36] = 66,
root@0 70 [45] = 84,
root@0 71 [100] = 94 -- suspect
root@0 72 },
root@0 73 [3] = {
stevekaye@3 74 [5] = 20,
root@0 75 [8] = 34,
root@0 76 [30] = 75,
root@0 77 [36] = 94,
root@0 78 [45] = 118 -- suspect
root@0 79 },
root@0 80 [4] = {
root@0 81 [5] = 26,
root@0 82 [8] = 90,
root@0 83 [24] = 98,
root@0 84 [30] = 105,
root@0 85 [36] = 118
root@0 86 },
root@0 87 [5] = {
root@0 88 [5] = 35,
root@0 89 [8] = 100,
root@0 90 [24] = 130 -- off the minimap
root@0 91 }
root@0 92 }
root@0 93
stevekaye@3 94 -- Default settings
stevekaye@3 95 local defaults = {
stevekaye@3 96 profile = {
root@0 97 colorRed = 1,
root@0 98 colorGreen = 0,
root@0 99 colorBlue = 0,
root@0 100 colorAlpha = 0.25,
stevekaye@3 101 range = 30
root@0 102 }
stevekaye@3 103 }
stevekaye@3 104
stevekaye@3 105 -- The available options
stevekaye@3 106 local options = {
stevekaye@3 107 name = "MinimapRange",
stevekaye@3 108 handler = MinimapRange,
stevekaye@3 109 icon = "Interface\\Icons\\Ability_Warrior_Defensivestance.jpg",
stevekaye@3 110 type = "group",
stevekaye@3 111 args = {
stevekaye@3 112 version = {
stevekaye@3 113 order = 1,
stevekaye@3 114 type = "description",
stevekaye@3 115 name = "X"
stevekaye@3 116 },
stevekaye@3 117 description = {
stevekaye@3 118 order = 2,
stevekaye@3 119 type = "description",
stevekaye@3 120 name = "Descriptive text"
stevekaye@3 121 },
stevekaye@3 122 color = {
stevekaye@3 123 order = 3,
stevekaye@3 124 type = "color",
stevekaye@3 125 name = "Circle Color",
stevekaye@3 126 desc = "Set the color of the range circle.",
stevekaye@3 127 get = function(info)
stevekaye@3 128 return MinimapRange.db.profile.colorRed, MinimapRange.db.profile.colorGreen, MinimapRange.db.profile.colorBlue, MinimapRange.db.profile.colorAlpha
stevekaye@3 129 end,
stevekaye@3 130 set = function(info, r, g, b, a)
stevekaye@3 131 MinimapRange:SetColour(r, g, b, a)
stevekaye@3 132 end,
stevekaye@3 133 hasAlpha = true
stevekaye@3 134 },
stevekaye@3 135 range = {
stevekaye@3 136 order = 4,
stevekaye@3 137 type = "range",
stevekaye@3 138 name = "Circle Radius",
stevekaye@3 139 desc = "The range that the circle indicates (in yards)",
stevekaye@3 140 min = 5,
stevekaye@3 141 max = 100,
stevekaye@3 142 step = 1,
stevekaye@3 143 get = function()
stevekaye@3 144 return MinimapRange.db.profile.range
stevekaye@3 145 end,
stevekaye@3 146 set = function(info, value)
stevekaye@3 147 MinimapRange:SetRange(value)
stevekaye@3 148 end
stevekaye@3 149 },
stevekaye@3 150 },
stevekaye@3 151 }
stevekaye@3 152
stevekaye@3 153 function MinimapRange:OnInitialize()
stevekaye@3 154
stevekaye@3 155 -- Get the version number for the TOC
stevekaye@3 156 options.args.version.name = string.format("Version %s", GetAddOnMetadata("MinimapRange", "Version"))
stevekaye@3 157 options.args.description.name = GetAddOnMetadata("MinimapRange", "Notes")
stevekaye@3 158
stevekaye@3 159 -- Register the database
stevekaye@3 160 self.db = LibStub("AceDB-3.0"):New("MinimapRangeDB", defaults, "Default")
root@0 161
stevekaye@3 162 local acreg = LibStub("AceConfigRegistry-3.0")
root@0 163
stevekaye@3 164 -- Register the options
stevekaye@3 165 acreg:RegisterOptionsTable("MinimapRange", options)
stevekaye@3 166 acreg:RegisterOptionsTable("MinimapRange Profiles", LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db))
stevekaye@3 167
stevekaye@3 168 LibStub("AceConfigDialog-3.0"):AddToBlizOptions("MinimapRange", "MinimapRange")
stevekaye@3 169 LibStub("AceConfigDialog-3.0"):AddToBlizOptions("MinimapRange Profiles", "Profiles", "MinimapRange")
stevekaye@3 170
stevekaye@3 171 -- Register the chat command
stevekaye@3 172 self:RegisterChatCommand("mmr", "ChatCommand")
root@0 173 end
root@0 174
root@0 175 -- Enable the addon
root@0 176 function MinimapRange:OnEnable()
root@0 177
root@0 178 self:CreateFrame()
root@0 179
root@0 180 self:SecureHook(Minimap, "SetZoom")
root@0 181 self:RegisterEvent("MINIMAP_UPDATE_ZOOM","UpdateZoom")
root@0 182 end
root@0 183
root@0 184 function MinimapRange:OnDisable()
root@0 185 if self.rangeFrame ~= nil then
root@0 186 self.rangeFrame:Hide()
root@0 187 end
root@0 188 end
root@0 189
stevekaye@3 190 function MinimapRange:ChatCommand(input)
stevekaye@3 191 LibStub("AceConfigCmd-3.0").HandleCommand(MinimapRange, "mmr", "MinimapRange", input)
stevekaye@3 192 end
stevekaye@3 193
root@0 194 function MinimapRange:CreateFrame()
root@0 195
root@0 196 if self.rangeFrame == nil then
root@0 197 -- Create our frame
root@0 198 self.rangeFrame = CreateFrame('Frame', 'MinimapRangeFrame', Minimap)
root@0 199
root@0 200 -- Set the properties
root@0 201 self.rangeFrame:SetFrameStrata("LOW")
root@0 202
root@0 203 -- Add the texture
root@0 204 local t = self.rangeFrame:CreateTexture(nil, "BACKGROUND")
root@0 205 t:SetTexture("Interface\\AddOns\\MinimapRange\\MM")
root@0 206 t:SetVertexColor(self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha)
root@0 207 t:SetAllPoints(self.rangeFrame)
root@0 208 self.rangeFrame.texture = t
root@0 209
root@0 210 self.rangeFrame:SetPoint("CENTER",0,0)
stevekaye@3 211 self:UpdateCircle(self.db.profile.range, self:GetIndoors())
stevekaye@6 212
stevekaye@6 213 -- Prevent sexy map from messing around with our frame
stevekaye@6 214 self.rangeFrame.sexyMapMovable = true
root@0 215 end
root@0 216
root@0 217 self.rangeFrame:Show()
root@0 218 end
root@0 219
root@0 220 function MinimapRange:SetColour(r, g, b, a)
root@0 221 -- Save the setting
root@0 222 self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha = r, g, b, a
root@0 223
root@0 224 -- Set the colour of the circle
root@0 225 if self.rangeFrame ~= nil then
root@0 226 self.rangeFrame.texture:SetVertexColor(r, g, b, a)
root@0 227 end
root@0 228 end
root@0 229
root@0 230 function MinimapRange:SetRange(value)
root@0 231 -- Save the setting
root@0 232 self.db.profile.range = value
root@0 233
root@0 234 -- Show the new range
root@0 235 self:UpdateCircle(value)
root@0 236 end
root@0 237
stevekaye@3 238 function MinimapRange:UpdateCircle(range, indoors)
root@0 239
root@0 240 if self.rangeFrame ~= nil then
root@0 241 local lowerKey, lowerValue = 0, 0
root@0 242 local upperKey, upperValue = 100, 140
root@0 243
root@0 244 -- Get the corrct range table to work with
root@0 245 local rangeTable = self.outdoorRanges
stevekaye@3 246 if indoors then
root@0 247 rangeTable = self.indoorRanges
root@0 248 end
root@0 249
root@0 250 -- Find two numbers to interpolate between
root@0 251 for k, v in pairs(rangeTable[Minimap:GetZoom()]) do
stevekaye@3 252
root@0 253 if k > lowerKey and k <= range then
root@0 254 lowerKey = k
root@0 255 lowerValue = v
root@0 256 end
root@0 257
root@0 258 if k < upperKey and k >= range then
root@0 259 upperKey = k
root@0 260 upperValue = v
root@0 261 end
root@0 262 end
root@0 263
root@0 264 local size
root@0 265
root@0 266 -- Do the interpolation if we haven't found an exact match
root@0 267 if lowerKey == upperKey then
root@0 268 size = lowerValue
root@0 269 else
root@0 270 size = lowerValue + ((upperValue - lowerValue) / (upperKey - lowerKey)) * (range - lowerKey)
root@0 271 end
root@0 272
root@0 273 -- Change the circle size
root@0 274 if size ~= nil then
root@0 275 self.rangeFrame:SetWidth(size)
root@0 276 self.rangeFrame:SetHeight(size)
root@0 277 end
root@0 278 end
root@0 279 end
root@0 280
root@0 281 function MinimapRange:SetZoom(minimap, level)
stevekaye@3 282
stevekaye@3 283 -- Prevent recursion into GetIndoors()
stevekaye@3 284 if self.inGetIndoors == nil then
stevekaye@3 285 -- Resize the circle
stevekaye@3 286 self:UpdateCircle(self.db.profile.range, self:GetIndoors())
stevekaye@3 287 end
root@0 288 end
root@0 289
root@0 290 function MinimapRange:UpdateZoom()
root@0 291
stevekaye@3 292 -- Resize the circle
stevekaye@3 293 self:UpdateCircle(self.db.profile.range, self:GetIndoors())
stevekaye@3 294
stevekaye@3 295 end
stevekaye@3 296
stevekaye@3 297 --
stevekaye@3 298 -- Test to see if we are indoors
stevekaye@3 299 --
stevekaye@3 300 function MinimapRange:GetIndoors()
stevekaye@3 301
stevekaye@3 302 local indoors = true
stevekaye@3 303
stevekaye@3 304 -- Prevent recursion
stevekaye@3 305 self.inGetIndoors = true
stevekaye@3 306
root@0 307 -- Try to detect whether we are indoors or outdoors
root@0 308 local zoom = Minimap:GetZoom()
root@0 309 local indoorsZoom = tonumber(GetCVar("minimapInsideZoom"))
root@0 310 local outdoorsZoom = tonumber(GetCVar("minimapZoom"))
stevekaye@3 311 local newZoom
root@0 312
root@0 313 -- Have we detected whether we are inside or outside?
root@0 314 if indoorsZoom ~= outdoorsZoom then
root@0 315
root@0 316 -- Yes, use the detected value
stevekaye@3 317 indoors = indoorsZoom == zoom
stevekaye@3 318 else
root@0 319
stevekaye@3 320 -- What shall we set the new zoom to?
stevekaye@3 321 if zoom == 1 then
stevekaye@3 322 newZoom = 2
stevekaye@3 323 else
stevekaye@3 324 newZoom = 1
root@0 325 end
root@0 326
stevekaye@3 327 -- Set the new zoom
stevekaye@3 328 Minimap:SetZoom(newZoom)
stevekaye@3 329
stevekaye@3 330 -- Did the indoors zoom change?
stevekaye@3 331 indoorsZoom = tonumber(GetCVar("minimapInsideZoom"))
stevekaye@3 332 indoors = indoorsZoom == newZoom
stevekaye@3 333
stevekaye@3 334 -- Set the zoom back
stevekaye@3 335 Minimap:SetZoom(zoom)
root@0 336 end
root@0 337
stevekaye@3 338 self.inGetIndoors = nil
stevekaye@3 339 return indoors
root@0 340 end
root@0 341
stevekaye@3 342 --
stevekaye@3 343 -- This function was just used for helping determine the original circle sizes
stevekaye@3 344 --
stevekaye@3 345 function MinimapRange:SetCircle(range, size)
stevekaye@3 346 if self.rangeFrame ~= nil then
stevekaye@3 347
stevekaye@3 348 local rangeTable = self.outdoorRanges
stevekaye@3 349 if self.db.profile.indoors then
stevekaye@3 350 rangeTable = self.indoorRanges
stevekaye@3 351 end
stevekaye@3 352
stevekaye@3 353 rangeTable[Minimap:GetZoom()][range] = size
stevekaye@3 354
stevekaye@3 355 self:UpdateCircle(range)
stevekaye@3 356 end
stevekaye@3 357 end
stevekaye@3 358