comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:6fdb0c5751ab
1 --
2 -- MinimapRange 1.00 - Steve Kaye
3 --
4 -- Shows a circle on the minimap to indicate spell range
5 --
6
7 MinimapRange = AceLibrary("AceAddon-2.0"):new("AceHook-2.1", "AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "AceDebug-2.0")
8
9 MinimapRange.outdoorRanges =
10 {
11 [0] = {
12 [5] = 13,
13 [8] = 15,
14 [45] = 35,
15 [100] = 70
16 },
17 [1] = {
18 [5] = 13.5,
19 [8] = 15.5,
20 [45] = 40,
21 [100] = 80
22 },
23 [2] = {
24 [5] = 14,
25 [8] = 16,
26 [45] = 45,
27 [100] = 94
28 },
29 [3] = {
30 [5] = 15,
31 [8] = 18,
32 [45] = 57,
33 [100] = 115
34 },
35 [4] = {
36 [5] = 16,
37 [8] = 22,
38 [45] = 73
39 },
40 [5] = {
41 [5] = 20,
42 [8] = 30,
43 [45] = 105
44 }
45 }
46
47 MinimapRange.indoorRanges =
48 {
49 [0] = {
50 [5] = 13,
51 [8] = 16,
52 [30] = 37,
53 [36] = 43,
54 [45] = 52,
55 [100] = 70 -- suspect
56 },
57 [1] = {
58 [5] = 15,
59 [8] = 19,
60 [30] = 43,
61 [36] = 53,
62 [45] = 63,
63 [100] = 80 -- suspect
64 },
65 [2] = {
66 [5] = 15,
67 [8] = 23,
68 [30] = 54,
69 [36] = 66,
70 [45] = 84,
71 [100] = 94 -- suspect
72 },
73 [3] = {
74 [5] = 20,
75 [8] = 34,
76 [30] = 75,
77 [36] = 94,
78 [45] = 118 -- suspect
79 },
80 [4] = {
81 [5] = 26,
82 [8] = 90,
83 [24] = 98,
84 [30] = 105,
85 [36] = 118
86 },
87 [5] = {
88 [5] = 35,
89 [8] = 100,
90 [24] = 130 -- off the minimap
91 }
92 }
93
94
95 -- Set up our chat command arguments
96
97 function MinimapRange:OnInitialize()
98
99 self:Debug("MinimapRange:OnInitialize()")
100
101 local defaults = {
102 colorRed = 1,
103 colorGreen = 0,
104 colorBlue = 0,
105 colorAlpha = 0.25,
106 range = 30,
107 indoors = true
108 }
109
110 local args = {
111 type = 'group',
112 args = {
113 color = {
114 type = 'color',
115 name = 'color',
116 desc = "Set the color of the range circle.",
117 get = function()
118 return self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha
119 end,
120 set = function(r, g, b, a)
121 self:SetColour(r, g, b, a)
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 },
151 }
152
153 self:RegisterDB("MinimapRangeDB")
154 self:RegisterDefaults('profile', defaults )
155
156 self:RegisterChatCommand({"/mmr" }, args)
157 end
158
159 -- Enable the addon
160 function MinimapRange:OnEnable()
161
162 self:CreateFrame()
163
164 self:SecureHook(Minimap, "SetZoom")
165 self:RegisterEvent("MINIMAP_UPDATE_ZOOM","UpdateZoom")
166 end
167
168 function MinimapRange:OnDisable()
169 if self.rangeFrame ~= nil then
170 self.rangeFrame:Hide()
171 end
172 end
173
174 function MinimapRange:CreateFrame()
175
176 if self.rangeFrame == nil then
177 -- Create our frame
178 self.rangeFrame = CreateFrame('Frame', 'MinimapRangeFrame', Minimap)
179
180 -- Set the properties
181 self.rangeFrame:SetFrameStrata("LOW")
182
183 -- Add the texture
184 local t = self.rangeFrame:CreateTexture(nil, "BACKGROUND")
185 t:SetTexture("Interface\\AddOns\\MinimapRange\\MM")
186 t:SetVertexColor(self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha)
187 t:SetAllPoints(self.rangeFrame)
188 self.rangeFrame.texture = t
189
190 self.rangeFrame:SetPoint("CENTER",0,0)
191 self:UpdateCircle(self.db.profile.range)
192 end
193
194 self.rangeFrame:Show()
195 end
196
197 function MinimapRange:SetColour(r, g, b, a)
198 -- Save the setting
199 self.db.profile.colorRed, self.db.profile.colorGreen, self.db.profile.colorBlue, self.db.profile.colorAlpha = r, g, b, a
200
201 -- Set the colour of the circle
202 if self.rangeFrame ~= nil then
203 self.rangeFrame.texture:SetVertexColor(r, g, b, a)
204 end
205 end
206
207 function MinimapRange:SetRange(value)
208 -- Save the setting
209 self.db.profile.range = value
210
211 -- Show the new range
212 self:UpdateCircle(value)
213 end
214
215 function MinimapRange:SetIndoors(value)
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
246 if self.rangeFrame ~= nil then
247 local lowerKey, lowerValue = 0, 0
248 local upperKey, upperValue = 100, 140
249
250 -- Get the corrct range table to work with
251 local rangeTable = self.outdoorRanges
252 if self.db.profile.indoors then
253 rangeTable = self.indoorRanges
254 end
255
256 -- Find two numbers to interpolate between
257 for k, v in pairs(rangeTable[Minimap:GetZoom()]) do
258 self:Debug(string.format("K: %s LK: %s R: %s", k, lowerKey, range))
259 if k > lowerKey and k <= range then
260 lowerKey = k
261 lowerValue = v
262 end
263
264 if k < upperKey and k >= range then
265 upperKey = k
266 upperValue = v
267 end
268 end
269
270 local size
271
272 -- Do the interpolation if we haven't found an exact match
273 if lowerKey == upperKey then
274 size = lowerValue
275 else
276 size = lowerValue + ((upperValue - lowerValue) / (upperKey - lowerKey)) * (range - lowerKey)
277 end
278
279 self:Debug("Size: "..size)
280 -- Change the circle size
281 if size ~= nil then
282 self.rangeFrame:SetWidth(size)
283 self.rangeFrame:SetHeight(size)
284 end
285 end
286 end
287
288 function MinimapRange:SetZoom(minimap, level)
289 -- Resize the circle
290 self:UpdateCircle(self.db.profile.range)
291 end
292
293 function MinimapRange:UpdateZoom()
294
295 -- Try to detect whether we are indoors or outdoors
296 local zoom = Minimap:GetZoom()
297 local indoorsZoom = tonumber(GetCVar("minimapInsideZoom"))
298 local outdoorsZoom = tonumber(GetCVar("minimapZoom"))
299
300 -- Have we detected whether we are inside or outside?
301 if indoorsZoom ~= outdoorsZoom then
302 self:Debug("Using detected location")
303
304 -- Yes, use the detected value
305 self:SetIndoors(indoorsZoom == zoom)
306
307 else
308 self:Debug("Using best guess location")
309
310 -- If this is not the first time that we have had this message
311 -- then we must assume that we have moved from indoors to outdoors
312 -- or vice versa
313 if self.firstUpdateZoomComplete == true then
314 self.db.profile.indoors = not self.db.profile.indoors
315 end
316
317 self:SetIndoors(self.db.profile.indoors)
318 end
319
320 -- Resize the circle
321 self:UpdateCircle(self.db.profile.range)
322
323 -- Note that the first update after a reload has been done
324 self.firstUpdateZoomComplete = true
325 end
326