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
|