comparison MinimapRange.lua @ 3:596068b6b1bf 2.0

Converted to Ace 3 and added it to the standard interface/addons configuration UI.
author stevekaye@5e7f7089-49ba-45b1-8616-21aa0651eee7
date Fri, 07 Nov 2008 14:27:31 +0000
parents 6fdb0c5751ab
children 2748e92d13f0
comparison
equal deleted inserted replaced
2:f3e03407f27b 3:596068b6b1bf
1 -- 1 --
2 -- MinimapRange 1.00 - Steve Kaye 2 -- MinimapRange 2.00 - Steve Kaye
3 -- 3 --
4 -- Shows a circle on the minimap to indicate spell range 4 -- Shows a circle on the minimap to indicate spell range
5 -- 5 --
6 6
7 MinimapRange = AceLibrary("AceAddon-2.0"):new("AceHook-2.1", "AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "AceDebug-2.0") 7 MinimapRange = LibStub("AceAddon-3.0"):NewAddon("MinimapRange", "AceHook-3.0", "AceEvent-3.0", "AceConsole-3.0")
8 8
9 MinimapRange.outdoorRanges = 9 MinimapRange.outdoorRanges =
10 { 10 {
11 [0] = { 11 [0] = {
12 [5] = 13, 12 [5] = 13,
69 [36] = 66, 69 [36] = 66,
70 [45] = 84, 70 [45] = 84,
71 [100] = 94 -- suspect 71 [100] = 94 -- suspect
72 }, 72 },
73 [3] = { 73 [3] = {
74 [5] = 20, 74 [5] = 20,
75 [8] = 34, 75 [8] = 34,
76 [30] = 75, 76 [30] = 75,
77 [36] = 94, 77 [36] = 94,
78 [45] = 118 -- suspect 78 [45] = 118 -- suspect
79 }, 79 },
89 [8] = 100, 89 [8] = 100,
90 [24] = 130 -- off the minimap 90 [24] = 130 -- off the minimap
91 } 91 }
92 } 92 }
93 93
94 94 -- Default settings
95 -- Set up our chat command arguments 95 local defaults = {
96 96 profile = {
97 function MinimapRange:OnInitialize()
98
99 self:Debug("MinimapRange:OnInitialize()")
100
101 local defaults = {
102 colorRed = 1, 97 colorRed = 1,
103 colorGreen = 0, 98 colorGreen = 0,
104 colorBlue = 0, 99 colorBlue = 0,
105 colorAlpha = 0.25, 100 colorAlpha = 0.25,
106 range = 30, 101 range = 30
107 indoors = true
108 } 102 }
109 103 }
110 local args = { 104
111 type = 'group', 105 -- The available options
112 args = { 106 local options = {
113 color = { 107 name = "MinimapRange",
114 type = 'color', 108 handler = MinimapRange,
115 name = 'color', 109 icon = "Interface\\Icons\\Ability_Warrior_Defensivestance.jpg",
116 desc = "Set the color of the range circle.", 110 type = "group",
117 get = function() 111 args = {
118 return self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha 112 version = {
119 end, 113 order = 1,
120 set = function(r, g, b, a) 114 type = "description",
121 self:SetColour(r, g, b, a) 115 name = "X"
122 end,
123 hasAlpha = true
124 },
125 range = {
126 type = 'range',
127 name = 'range',
128 desc = "The range of the circle (in yards)",
129 min = 5,
130 max = 100,
131 step = 1,
132 get = function()
133 return self.db.profile.range
134 end,
135 set = function(value)
136 self:SetRange(value)
137 end
138 },
139 indoors = {
140 type = 'toggle',
141 name = 'indoors',
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.',
143 get = function()
144 return self.db.profile.indoors
145 end,
146 set = function(value)
147 self:SetIndoors(value)
148 end
149 },
150 }, 116 },
151 } 117 description = {
152 118 order = 2,
153 self:RegisterDB("MinimapRangeDB") 119 type = "description",
154 self:RegisterDefaults('profile', defaults ) 120 name = "Descriptive text"
155 121 },
156 self:RegisterChatCommand({"/mmr" }, args) 122 color = {
123 order = 3,
124 type = "color",
125 name = "Circle Color",
126 desc = "Set the color of the range circle.",
127 get = function(info)
128 return MinimapRange.db.profile.colorRed, MinimapRange.db.profile.colorGreen, MinimapRange.db.profile.colorBlue, MinimapRange.db.profile.colorAlpha
129 end,
130 set = function(info, r, g, b, a)
131 MinimapRange:SetColour(r, g, b, a)
132 end,
133 hasAlpha = true
134 },
135 range = {
136 order = 4,
137 type = "range",
138 name = "Circle Radius",
139 desc = "The range that the circle indicates (in yards)",
140 min = 5,
141 max = 100,
142 step = 1,
143 get = function()
144 return MinimapRange.db.profile.range
145 end,
146 set = function(info, value)
147 MinimapRange:SetRange(value)
148 end
149 },
150 },
151 }
152
153 function MinimapRange:OnInitialize()
154
155 -- Get the version number for the TOC
156 options.args.version.name = string.format("Version %s", GetAddOnMetadata("MinimapRange", "Version"))
157 options.args.description.name = GetAddOnMetadata("MinimapRange", "Notes")
158
159 -- Register the database
160 self.db = LibStub("AceDB-3.0"):New("MinimapRangeDB", defaults, "Default")
161
162 local acreg = LibStub("AceConfigRegistry-3.0")
163
164 -- Register the options
165 acreg:RegisterOptionsTable("MinimapRange", options)
166 acreg:RegisterOptionsTable("MinimapRange Profiles", LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db))
167
168 LibStub("AceConfigDialog-3.0"):AddToBlizOptions("MinimapRange", "MinimapRange")
169 LibStub("AceConfigDialog-3.0"):AddToBlizOptions("MinimapRange Profiles", "Profiles", "MinimapRange")
170
171 -- Register the chat command
172 self:RegisterChatCommand("mmr", "ChatCommand")
157 end 173 end
158 174
159 -- Enable the addon 175 -- Enable the addon
160 function MinimapRange:OnEnable() 176 function MinimapRange:OnEnable()
161 177
167 183
168 function MinimapRange:OnDisable() 184 function MinimapRange:OnDisable()
169 if self.rangeFrame ~= nil then 185 if self.rangeFrame ~= nil then
170 self.rangeFrame:Hide() 186 self.rangeFrame:Hide()
171 end 187 end
188 end
189
190 function MinimapRange:ChatCommand(input)
191 LibStub("AceConfigCmd-3.0").HandleCommand(MinimapRange, "mmr", "MinimapRange", input)
172 end 192 end
173 193
174 function MinimapRange:CreateFrame() 194 function MinimapRange:CreateFrame()
175 195
176 if self.rangeFrame == nil then 196 if self.rangeFrame == nil then
186 t:SetVertexColor(self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha) 206 t:SetVertexColor(self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha)
187 t:SetAllPoints(self.rangeFrame) 207 t:SetAllPoints(self.rangeFrame)
188 self.rangeFrame.texture = t 208 self.rangeFrame.texture = t
189 209
190 self.rangeFrame:SetPoint("CENTER",0,0) 210 self.rangeFrame:SetPoint("CENTER",0,0)
191 self:UpdateCircle(self.db.profile.range) 211 self:UpdateCircle(self.db.profile.range, self:GetIndoors())
192 end 212 end
193 213
194 self.rangeFrame:Show() 214 self.rangeFrame:Show()
195 end 215 end
196 216
210 230
211 -- Show the new range 231 -- Show the new range
212 self:UpdateCircle(value) 232 self:UpdateCircle(value)
213 end 233 end
214 234
215 function MinimapRange:SetIndoors(value) 235 function MinimapRange:UpdateCircle(range, indoors)
216 -- Save the setting
217 self.db.profile.indoors = value
218
219 if value then
220 self:Debug("Indoors: TRUE")
221 else
222 self:Debug("Indoors: FALSE")
223 end
224
225 -- Show the new range
226 self:UpdateCircle(self.db.profile.range)
227 end
228
229 function MinimapRange:SetCircle(range, size)
230 if self.rangeFrame ~= nil then
231
232 local rangeTable = self.outdoorRanges
233 if self.db.profile.indoors then
234 rangeTable = self.indoorRanges
235 end
236
237 rangeTable[Minimap:GetZoom()][range] = size
238
239 self:UpdateCircle(range)
240 end
241 end
242
243 function MinimapRange:UpdateCircle(range)
244 self:Debug(string.format('Z: %s S: %s', Minimap:GetZoom(), range))
245 236
246 if self.rangeFrame ~= nil then 237 if self.rangeFrame ~= nil then
247 local lowerKey, lowerValue = 0, 0 238 local lowerKey, lowerValue = 0, 0
248 local upperKey, upperValue = 100, 140 239 local upperKey, upperValue = 100, 140
249 240
250 -- Get the corrct range table to work with 241 -- Get the corrct range table to work with
251 local rangeTable = self.outdoorRanges 242 local rangeTable = self.outdoorRanges
252 if self.db.profile.indoors then 243 if indoors then
253 rangeTable = self.indoorRanges 244 rangeTable = self.indoorRanges
254 end 245 end
255 246
256 -- Find two numbers to interpolate between 247 -- Find two numbers to interpolate between
257 for k, v in pairs(rangeTable[Minimap:GetZoom()]) do 248 for k, v in pairs(rangeTable[Minimap:GetZoom()]) do
258 self:Debug(string.format("K: %s LK: %s R: %s", k, lowerKey, range)) 249
259 if k > lowerKey and k <= range then 250 if k > lowerKey and k <= range then
260 lowerKey = k 251 lowerKey = k
261 lowerValue = v 252 lowerValue = v
262 end 253 end
263 254
274 size = lowerValue 265 size = lowerValue
275 else 266 else
276 size = lowerValue + ((upperValue - lowerValue) / (upperKey - lowerKey)) * (range - lowerKey) 267 size = lowerValue + ((upperValue - lowerValue) / (upperKey - lowerKey)) * (range - lowerKey)
277 end 268 end
278 269
279 self:Debug("Size: "..size)
280 -- Change the circle size 270 -- Change the circle size
281 if size ~= nil then 271 if size ~= nil then
282 self.rangeFrame:SetWidth(size) 272 self.rangeFrame:SetWidth(size)
283 self.rangeFrame:SetHeight(size) 273 self.rangeFrame:SetHeight(size)
284 end 274 end
285 end 275 end
286 end 276 end
287 277
288 function MinimapRange:SetZoom(minimap, level) 278 function MinimapRange:SetZoom(minimap, level)
279
280 -- Prevent recursion into GetIndoors()
281 if self.inGetIndoors == nil then
282 -- Resize the circle
283 self:UpdateCircle(self.db.profile.range, self:GetIndoors())
284 end
285 end
286
287 function MinimapRange:UpdateZoom()
288
289 -- Resize the circle 289 -- Resize the circle
290 self:UpdateCircle(self.db.profile.range) 290 self:UpdateCircle(self.db.profile.range, self:GetIndoors())
291 end 291
292 292 end
293 function MinimapRange:UpdateZoom() 293
294 294 --
295 -- Test to see if we are indoors
296 --
297 function MinimapRange:GetIndoors()
298
299 local indoors = true
300
301 -- Prevent recursion
302 self.inGetIndoors = true
303
295 -- Try to detect whether we are indoors or outdoors 304 -- Try to detect whether we are indoors or outdoors
296 local zoom = Minimap:GetZoom() 305 local zoom = Minimap:GetZoom()
297 local indoorsZoom = tonumber(GetCVar("minimapInsideZoom")) 306 local indoorsZoom = tonumber(GetCVar("minimapInsideZoom"))
298 local outdoorsZoom = tonumber(GetCVar("minimapZoom")) 307 local outdoorsZoom = tonumber(GetCVar("minimapZoom"))
308 local newZoom
299 309
300 -- Have we detected whether we are inside or outside? 310 -- Have we detected whether we are inside or outside?
301 if indoorsZoom ~= outdoorsZoom then 311 if indoorsZoom ~= outdoorsZoom then
302 self:Debug("Using detected location")
303 312
304 -- Yes, use the detected value 313 -- Yes, use the detected value
305 self:SetIndoors(indoorsZoom == zoom) 314 indoors = indoorsZoom == zoom
306
307 else 315 else
308 self:Debug("Using best guess location") 316
309 317 -- What shall we set the new zoom to?
310 -- If this is not the first time that we have had this message 318 if zoom == 1 then
311 -- then we must assume that we have moved from indoors to outdoors 319 newZoom = 2
312 -- or vice versa 320 else
313 if self.firstUpdateZoomComplete == true then 321 newZoom = 1
314 self.db.profile.indoors = not self.db.profile.indoors 322 end
315 end 323
316 324 -- Set the new zoom
317 self:SetIndoors(self.db.profile.indoors) 325 Minimap:SetZoom(newZoom)
318 end 326
319 327 -- Did the indoors zoom change?
320 -- Resize the circle 328 indoorsZoom = tonumber(GetCVar("minimapInsideZoom"))
321 self:UpdateCircle(self.db.profile.range) 329 indoors = indoorsZoom == newZoom
322 330
323 -- Note that the first update after a reload has been done 331 -- Set the zoom back
324 self.firstUpdateZoomComplete = true 332 Minimap:SetZoom(zoom)
325 end 333 end
326 334
335 self.inGetIndoors = nil
336 return indoors
337 end
338
339 --
340 -- This function was just used for helping determine the original circle sizes
341 --
342 function MinimapRange:SetCircle(range, size)
343 if self.rangeFrame ~= nil then
344
345 local rangeTable = self.outdoorRanges
346 if self.db.profile.indoors then
347 rangeTable = self.indoorRanges
348 end
349
350 rangeTable[Minimap:GetZoom()][range] = size
351
352 self:UpdateCircle(range)
353 end
354 end
355