annotate MinimapRange.lua @ 0:6fdb0c5751ab

Importing old repo data under /trunk
author root@5e7f7089-49ba-45b1-8616-21aa0651eee7
date Mon, 29 Sep 2008 20:58:24 +0000
parents
children 596068b6b1bf
rev   line source
root@0 1 --
root@0 2 -- MinimapRange 1.00 - Steve Kaye
root@0 3 --
root@0 4 -- Shows a circle on the minimap to indicate spell range
root@0 5 --
root@0 6
root@0 7 MinimapRange = AceLibrary("AceAddon-2.0"):new("AceHook-2.1", "AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "AceDebug-2.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] = {
root@0 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
root@0 94
root@0 95 -- Set up our chat command arguments
root@0 96
root@0 97 function MinimapRange:OnInitialize()
root@0 98
root@0 99 self:Debug("MinimapRange:OnInitialize()")
root@0 100
root@0 101 local defaults = {
root@0 102 colorRed = 1,
root@0 103 colorGreen = 0,
root@0 104 colorBlue = 0,
root@0 105 colorAlpha = 0.25,
root@0 106 range = 30,
root@0 107 indoors = true
root@0 108 }
root@0 109
root@0 110 local args = {
root@0 111 type = 'group',
root@0 112 args = {
root@0 113 color = {
root@0 114 type = 'color',
root@0 115 name = 'color',
root@0 116 desc = "Set the color of the range circle.",
root@0 117 get = function()
root@0 118 return self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha
root@0 119 end,
root@0 120 set = function(r, g, b, a)
root@0 121 self:SetColour(r, g, b, a)
root@0 122 end,
root@0 123 hasAlpha = true
root@0 124 },
root@0 125 range = {
root@0 126 type = 'range',
root@0 127 name = 'range',
root@0 128 desc = "The range of the circle (in yards)",
root@0 129 min = 5,
root@0 130 max = 100,
root@0 131 step = 1,
root@0 132 get = function()
root@0 133 return self.db.profile.range
root@0 134 end,
root@0 135 set = function(value)
root@0 136 self:SetRange(value)
root@0 137 end
root@0 138 },
root@0 139 indoors = {
root@0 140 type = 'toggle',
root@0 141 name = 'indoors',
root@0 142 desc = 'Whether you are indoors or outdoors. Once you tell it which you are in it will try to keep track but you can fix it with this.',
root@0 143 get = function()
root@0 144 return self.db.profile.indoors
root@0 145 end,
root@0 146 set = function(value)
root@0 147 self:SetIndoors(value)
root@0 148 end
root@0 149 },
root@0 150 },
root@0 151 }
root@0 152
root@0 153 self:RegisterDB("MinimapRangeDB")
root@0 154 self:RegisterDefaults('profile', defaults )
root@0 155
root@0 156 self:RegisterChatCommand({"/mmr" }, args)
root@0 157 end
root@0 158
root@0 159 -- Enable the addon
root@0 160 function MinimapRange:OnEnable()
root@0 161
root@0 162 self:CreateFrame()
root@0 163
root@0 164 self:SecureHook(Minimap, "SetZoom")
root@0 165 self:RegisterEvent("MINIMAP_UPDATE_ZOOM","UpdateZoom")
root@0 166 end
root@0 167
root@0 168 function MinimapRange:OnDisable()
root@0 169 if self.rangeFrame ~= nil then
root@0 170 self.rangeFrame:Hide()
root@0 171 end
root@0 172 end
root@0 173
root@0 174 function MinimapRange:CreateFrame()
root@0 175
root@0 176 if self.rangeFrame == nil then
root@0 177 -- Create our frame
root@0 178 self.rangeFrame = CreateFrame('Frame', 'MinimapRangeFrame', Minimap)
root@0 179
root@0 180 -- Set the properties
root@0 181 self.rangeFrame:SetFrameStrata("LOW")
root@0 182
root@0 183 -- Add the texture
root@0 184 local t = self.rangeFrame:CreateTexture(nil, "BACKGROUND")
root@0 185 t:SetTexture("Interface\\AddOns\\MinimapRange\\MM")
root@0 186 t:SetVertexColor(self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha)
root@0 187 t:SetAllPoints(self.rangeFrame)
root@0 188 self.rangeFrame.texture = t
root@0 189
root@0 190 self.rangeFrame:SetPoint("CENTER",0,0)
root@0 191 self:UpdateCircle(self.db.profile.range)
root@0 192 end
root@0 193
root@0 194 self.rangeFrame:Show()
root@0 195 end
root@0 196
root@0 197 function MinimapRange:SetColour(r, g, b, a)
root@0 198 -- Save the setting
root@0 199 self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha = r, g, b, a
root@0 200
root@0 201 -- Set the colour of the circle
root@0 202 if self.rangeFrame ~= nil then
root@0 203 self.rangeFrame.texture:SetVertexColor(r, g, b, a)
root@0 204 end
root@0 205 end
root@0 206
root@0 207 function MinimapRange:SetRange(value)
root@0 208 -- Save the setting
root@0 209 self.db.profile.range = value
root@0 210
root@0 211 -- Show the new range
root@0 212 self:UpdateCircle(value)
root@0 213 end
root@0 214
root@0 215 function MinimapRange:SetIndoors(value)
root@0 216 -- Save the setting
root@0 217 self.db.profile.indoors = value
root@0 218
root@0 219 if value then
root@0 220 self:Debug("Indoors: TRUE")
root@0 221 else
root@0 222 self:Debug("Indoors: FALSE")
root@0 223 end
root@0 224
root@0 225 -- Show the new range
root@0 226 self:UpdateCircle(self.db.profile.range)
root@0 227 end
root@0 228
root@0 229 function MinimapRange:SetCircle(range, size)
root@0 230 if self.rangeFrame ~= nil then
root@0 231
root@0 232 local rangeTable = self.outdoorRanges
root@0 233 if self.db.profile.indoors then
root@0 234 rangeTable = self.indoorRanges
root@0 235 end
root@0 236
root@0 237 rangeTable[Minimap:GetZoom()][range] = size
root@0 238
root@0 239 self:UpdateCircle(range)
root@0 240 end
root@0 241 end
root@0 242
root@0 243 function MinimapRange:UpdateCircle(range)
root@0 244 self:Debug(string.format('Z: %s S: %s', Minimap:GetZoom(), range))
root@0 245
root@0 246 if self.rangeFrame ~= nil then
root@0 247 local lowerKey, lowerValue = 0, 0
root@0 248 local upperKey, upperValue = 100, 140
root@0 249
root@0 250 -- Get the corrct range table to work with
root@0 251 local rangeTable = self.outdoorRanges
root@0 252 if self.db.profile.indoors then
root@0 253 rangeTable = self.indoorRanges
root@0 254 end
root@0 255
root@0 256 -- Find two numbers to interpolate between
root@0 257 for k, v in pairs(rangeTable[Minimap:GetZoom()]) do
root@0 258 self:Debug(string.format("K: %s LK: %s R: %s", k, lowerKey, range))
root@0 259 if k > lowerKey and k <= range then
root@0 260 lowerKey = k
root@0 261 lowerValue = v
root@0 262 end
root@0 263
root@0 264 if k < upperKey and k >= range then
root@0 265 upperKey = k
root@0 266 upperValue = v
root@0 267 end
root@0 268 end
root@0 269
root@0 270 local size
root@0 271
root@0 272 -- Do the interpolation if we haven't found an exact match
root@0 273 if lowerKey == upperKey then
root@0 274 size = lowerValue
root@0 275 else
root@0 276 size = lowerValue + ((upperValue - lowerValue) / (upperKey - lowerKey)) * (range - lowerKey)
root@0 277 end
root@0 278
root@0 279 self:Debug("Size: "..size)
root@0 280 -- Change the circle size
root@0 281 if size ~= nil then
root@0 282 self.rangeFrame:SetWidth(size)
root@0 283 self.rangeFrame:SetHeight(size)
root@0 284 end
root@0 285 end
root@0 286 end
root@0 287
root@0 288 function MinimapRange:SetZoom(minimap, level)
root@0 289 -- Resize the circle
root@0 290 self:UpdateCircle(self.db.profile.range)
root@0 291 end
root@0 292
root@0 293 function MinimapRange:UpdateZoom()
root@0 294
root@0 295 -- Try to detect whether we are indoors or outdoors
root@0 296 local zoom = Minimap:GetZoom()
root@0 297 local indoorsZoom = tonumber(GetCVar("minimapInsideZoom"))
root@0 298 local outdoorsZoom = tonumber(GetCVar("minimapZoom"))
root@0 299
root@0 300 -- Have we detected whether we are inside or outside?
root@0 301 if indoorsZoom ~= outdoorsZoom then
root@0 302 self:Debug("Using detected location")
root@0 303
root@0 304 -- Yes, use the detected value
root@0 305 self:SetIndoors(indoorsZoom == zoom)
root@0 306
root@0 307 else
root@0 308 self:Debug("Using best guess location")
root@0 309
root@0 310 -- If this is not the first time that we have had this message
root@0 311 -- then we must assume that we have moved from indoors to outdoors
root@0 312 -- or vice versa
root@0 313 if self.firstUpdateZoomComplete == true then
root@0 314 self.db.profile.indoors = not self.db.profile.indoors
root@0 315 end
root@0 316
root@0 317 self:SetIndoors(self.db.profile.indoors)
root@0 318 end
root@0 319
root@0 320 -- Resize the circle
root@0 321 self:UpdateCircle(self.db.profile.range)
root@0 322
root@0 323 -- Note that the first update after a reload has been done
root@0 324 self.firstUpdateZoomComplete = true
root@0 325 end
root@0 326