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
|