Mercurial > wow > minimap-range
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 |