only1yzerman@0
|
1
|
only1yzerman@0
|
2 -------- SINGLE OBJECT IN GLOBAL NAMESPACE
|
only1yzerman@0
|
3
|
only1yzerman@0
|
4 Bloodhound2 = {};
|
only1yzerman@0
|
5
|
only1yzerman@0
|
6
|
only1yzerman@0
|
7 -------- CREATE OUR INVISIBLE FRAME TO RECEIVE EVENTS AND UPDATES
|
only1yzerman@0
|
8
|
only1yzerman@0
|
9 local frame = CreateFrame("Frame", nil, UIParent);
|
only1yzerman@0
|
10 Bloodhound2.Frame = frame;
|
only1yzerman@0
|
11
|
only1yzerman@0
|
12
|
only1yzerman@0
|
13 -------- DEFINE AND REGISTER EVENT HANDLERS
|
only1yzerman@0
|
14
|
only1yzerman@0
|
15 local events = {};
|
only1yzerman@0
|
16
|
only1yzerman@0
|
17 function events:MINIMAP_UPDATE_TRACKING(...)
|
only1yzerman@0
|
18 if player and player.Z then
|
only1yzerman@0
|
19 Bloodhound2.UpdateMinimap();
|
only1yzerman@0
|
20 end
|
only1yzerman@0
|
21 end
|
only1yzerman@0
|
22
|
only1yzerman@0
|
23 frame:SetScript("OnEvent",
|
only1yzerman@0
|
24 function(self, event, ...)
|
only1yzerman@0
|
25 events[event](self, ...);
|
only1yzerman@0
|
26 end);
|
only1yzerman@0
|
27
|
only1yzerman@0
|
28 local k, v;
|
only1yzerman@0
|
29
|
only1yzerman@0
|
30 for k, v in pairs(events) do
|
only1yzerman@0
|
31 frame:RegisterEvent(k);
|
only1yzerman@0
|
32 end
|
only1yzerman@0
|
33
|
only1yzerman@0
|
34
|
only1yzerman@0
|
35
|
only1yzerman@0
|
36
|
only1yzerman@0
|
37
|
only1yzerman@0
|
38
|
only1yzerman@0
|
39 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
40 -------- STORES A POINTER TO THE MINIMAP LOCALLY SO IT CAN BE CHANGED BY A RE-PARENTING FUNCTION
|
only1yzerman@0
|
41 -------- - Added by Zasurus(www.curseforge.com/profiles/Zasurus/) for MiniHugeHUD
|
only1yzerman@0
|
42 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
43 local Minimap = _G.Minimap;
|
only1yzerman@0
|
44 Minimap.MinimapName = "Minimap";
|
only1yzerman@0
|
45 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
46
|
only1yzerman@0
|
47
|
only1yzerman@0
|
48
|
only1yzerman@0
|
49
|
only1yzerman@0
|
50
|
only1yzerman@0
|
51
|
only1yzerman@0
|
52 -------- WORK AROUND WOW BUG THAT CAUSES GetPlayerMapPosition TO RETURN 0,0
|
only1yzerman@0
|
53
|
only1yzerman@0
|
54 WorldMapFrame:Show()
|
only1yzerman@0
|
55 WorldMapFrame:Hide()
|
only1yzerman@0
|
56
|
only1yzerman@0
|
57
|
only1yzerman@0
|
58 -------- HOOK INTO PER-FRAME UPDATE HANDLER
|
only1yzerman@0
|
59
|
only1yzerman@0
|
60 local player = {}; -- player position
|
only1yzerman@0
|
61 local totalElapsed = 0.0; -- time elapsed since last update
|
only1yzerman@0
|
62 local updatePeriod = 0.1; -- sec. interval for each minimap update
|
only1yzerman@0
|
63 local cpuThrottle = 0.05; -- throttle to 5% usage while moving
|
only1yzerman@0
|
64 local minUpdatePeriod = 0.04; -- sec. don't update more often than this
|
only1yzerman@0
|
65 local lastzoom = 0; -- previous minimap zoom level
|
only1yzerman@0
|
66 local updateTotalTime = 0; -- time spent updating minimap
|
only1yzerman@0
|
67 local updateCount = 0; -- number of times minimap updated
|
only1yzerman@0
|
68
|
only1yzerman@0
|
69 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
70 -------- MOVED OnUpdate Script into seperate function so it could be called by re-parent function
|
only1yzerman@0
|
71 -------- - Added by Zasurus(www.curseforge.com/profiles/Zasurus/) for MiniHugeHUD
|
only1yzerman@0
|
72 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
73 frame:SetScript("OnUpdate", function(self, elapsed) Bloodhound2.OnUpdateScript(self, elapsed) end);
|
only1yzerman@0
|
74 function Bloodhound2.OnUpdateScript(self, elapsed)
|
only1yzerman@0
|
75 totalElapsed = totalElapsed + elapsed; -- measure total elapsed time
|
only1yzerman@0
|
76
|
only1yzerman@0
|
77 if (totalElapsed >= updatePeriod) then -- if enough time has passed
|
only1yzerman@0
|
78 totalElapsed = mod(totalElapsed, updatePeriod);
|
only1yzerman@0
|
79 local isInInstance, instanceType = IsInInstance()
|
only1yzerman@0
|
80
|
only1yzerman@0
|
81 if isInInstance ~= nil then
|
only1yzerman@0
|
82 Bloodhound2.DrawArrow(0, 0, 0, 0)
|
only1yzerman@0
|
83 return
|
only1yzerman@0
|
84 end
|
only1yzerman@0
|
85
|
only1yzerman@0
|
86 local cmap = GetCurrentMapContinent();
|
only1yzerman@0
|
87 local zmap = GetCurrentMapZone();
|
only1yzerman@10
|
88 if(WorldMapFrame:IsVisible() ~= 1) then
|
only1yzerman@10
|
89 SetMapToCurrentZone();
|
only1yzerman@10
|
90 end
|
only1yzerman@0
|
91 local c = GetCurrentMapContinent(); -- get current player position
|
only1yzerman@0
|
92 local z = GetCurrentMapZone();
|
only1yzerman@0
|
93 local x, y = GetPlayerMapPosition("player");
|
only1yzerman@0
|
94 local f = GetPlayerFacing();
|
only1yzerman@0
|
95 local m = Minimap:GetZoom();
|
only1yzerman@6
|
96 local ztxt = GetZoneText();
|
only1yzerman@6
|
97 local zstxt = GetSubZoneText();
|
only1yzerman@6
|
98 local badzones = { "","The Star's Bazaar", "The Emperor's Step", "The Golden Lantern", "Chamber of Reflection", "The Imperial Exchange", "Path of Serenity", "Ethereal Corridor", "The Celestial Vault", "Chamber of Enlightenment" }
|
only1yzerman@10
|
99 if(WorldMapFrame:IsVisible() ~= 1) then
|
only1yzerman@10
|
100 SetMapZoom(cmap, zmap);
|
only1yzerman@10
|
101 end
|
only1yzerman@6
|
102
|
only1yzerman@5
|
103 if (c ~= player.C and c ~= 0 and c ~= -1) then -- reload continent data if continent has changed
|
only1yzerman@0
|
104 Bloodhound2.HerbNodes, Bloodhound2.ContinentHerbs = Bloodhound2.ReloadNodes(Bloodhound2.HerbDatabase[c], Bloodhound2.ZoneDatum[c]);
|
only1yzerman@0
|
105 Bloodhound2.OreNodes, Bloodhound2.ContinentOre = Bloodhound2.ReloadNodes(Bloodhound2.OreDatabase[c], Bloodhound2.ZoneDatum[c]);
|
only1yzerman@2
|
106 Bloodhound2.MiscNodes, Bloodhound2.ContinentNode = Bloodhound2.ReloadNodes(Bloodhound2.MiscDatabase[c], Bloodhound2.ZoneDatum[c]);
|
only1yzerman@0
|
107 end
|
only1yzerman@6
|
108
|
only1yzerman@0
|
109
|
only1yzerman@0
|
110 if (c ~= player.C or z ~= player.Z or x ~= player.X or y ~= player.Y or f ~= player.F or m ~= lastzoom) then
|
only1yzerman@0
|
111 player.C = c;
|
only1yzerman@0
|
112 player.Z = z;
|
only1yzerman@0
|
113 player.X = x;
|
only1yzerman@0
|
114 player.Y = y;
|
only1yzerman@0
|
115 player.F = f;
|
only1yzerman@0
|
116 lastzoom = m;
|
only1yzerman@0
|
117 local t0 = GetTime();
|
only1yzerman@0
|
118 Bloodhound2.UpdateMinimap(); -- player has moved or minimap scale has changed
|
only1yzerman@0
|
119 local t1 = GetTime() - t0;
|
only1yzerman@0
|
120
|
only1yzerman@0
|
121 -- calculate and throttle CPU usage to 5%
|
only1yzerman@0
|
122 updateTotalTime = updateTotalTime + t1
|
only1yzerman@0
|
123
|
only1yzerman@0
|
124 if updateCount > 10 then
|
only1yzerman@0
|
125 local avgTime = updateTotalTime / updateCount
|
only1yzerman@0
|
126 updatePeriod = avgTime / cpuThrottle
|
only1yzerman@0
|
127 Print(updateCount);
|
only1yzerman@0
|
128
|
only1yzerman@0
|
129 if updatePeriod < minUpdatePeriod then
|
only1yzerman@0
|
130 updatePeriod = minUpdatePeriod
|
only1yzerman@0
|
131 end
|
only1yzerman@0
|
132
|
only1yzerman@0
|
133 if updateCount >= 100 then
|
only1yzerman@0
|
134 updateTotalTime = updateTotalTime / 2
|
only1yzerman@0
|
135 updateCount = updateCount / 2
|
only1yzerman@0
|
136 end
|
only1yzerman@0
|
137 end
|
only1yzerman@0
|
138 end
|
only1yzerman@0
|
139 end
|
only1yzerman@0
|
140 end
|
only1yzerman@6
|
141 function Bloodhound2.BadZone(ztxt, zstxt, badzones)
|
only1yzerman@6
|
142 for tbl, value in pairs(badzones) do
|
only1yzerman@6
|
143 if (ztxt == "Shrine of Seven Stars" or zstxt == value) then return false
|
only1yzerman@6
|
144 end
|
only1yzerman@6
|
145 end
|
only1yzerman@6
|
146 return true
|
only1yzerman@6
|
147 end
|
only1yzerman@0
|
148
|
only1yzerman@0
|
149 function Bloodhound2.UpdateMinimap()
|
only1yzerman@0
|
150 local facing = 0
|
only1yzerman@0
|
151
|
only1yzerman@0
|
152 if GetCVar("rotateMinimap") ~= "0" then
|
only1yzerman@0
|
153 facing = GetPlayerFacing() * 57.2957795;
|
only1yzerman@0
|
154 end
|
only1yzerman@0
|
155
|
only1yzerman@0
|
156 local cf = cos(facing);
|
only1yzerman@0
|
157 local sf = sin(facing);
|
only1yzerman@0
|
158 local gx, gy = Bloodhound2.CalculateForce(cf, sf);
|
only1yzerman@0
|
159 Bloodhound2.DrawArrow(gx, gy, cf, sf);
|
only1yzerman@0
|
160 end
|
only1yzerman@0
|
161
|
only1yzerman@0
|
162
|
only1yzerman@0
|
163 -------- DATABASE LOADING
|
only1yzerman@0
|
164
|
only1yzerman@0
|
165 Bloodhound2.HerbNodes = {};
|
only1yzerman@0
|
166 Bloodhound2.OreNodes = {};
|
only1yzerman@2
|
167 Bloodhound2.MiscNodes = {};
|
only1yzerman@0
|
168 Bloodhound2.ContinentHerbs = {};
|
only1yzerman@0
|
169 Bloodhound2.ContinentOre = {};
|
only1yzerman@0
|
170
|
only1yzerman@0
|
171 function Bloodhound2.ReloadNodes(database, zoneDatum)
|
only1yzerman@0
|
172
|
only1yzerman@0
|
173 if (database == nil) then return {}; end
|
only1yzerman@0
|
174
|
only1yzerman@0
|
175 local nodes = {};
|
only1yzerman@0
|
176 local db = {};
|
only1yzerman@0
|
177
|
only1yzerman@0
|
178 local zoneNode, positions;
|
only1yzerman@0
|
179 for zoneNode, positions in pairs(database) do
|
only1yzerman@0
|
180 local _, _, zone, node = string.find(zoneNode, "Z(%d+)N(%d+)");
|
only1yzerman@0
|
181 local z = tonumber(zone);
|
only1yzerman@0
|
182 local datum = zoneDatum[z];
|
only1yzerman@0
|
183 local n = tonumber(node);
|
only1yzerman@0
|
184 db[n] = true;
|
only1yzerman@0
|
185 local pxy = 0
|
only1yzerman@0
|
186
|
only1yzerman@0
|
187 for _,pos in ipairs(positions) do
|
only1yzerman@0
|
188 local xy = pos + pxy
|
only1yzerman@0
|
189 pxy = xy
|
only1yzerman@0
|
190 local x = floor(xy / 1000);
|
only1yzerman@0
|
191 local y = xy - 1000 * x;
|
only1yzerman@0
|
192 x, y = Bloodhound2.ZoneDatum.LocalToGlobal(x / 1000.0, y / 1000.0, datum);
|
only1yzerman@0
|
193 tinsert(nodes, {Z = z, N = n, X = x, Y = y, TimeStamp = time() - 60 - 3600 * math.random() });
|
only1yzerman@0
|
194 end
|
only1yzerman@0
|
195 end
|
only1yzerman@0
|
196
|
only1yzerman@0
|
197 return nodes, db;
|
only1yzerman@0
|
198 end
|
only1yzerman@0
|
199
|
only1yzerman@0
|
200
|
only1yzerman@0
|
201 -------- UTILITY FUNCTIONS
|
only1yzerman@0
|
202
|
only1yzerman@0
|
203 function Print(message)
|
only1yzerman@0
|
204 DEFAULT_CHAT_FRAME:AddMessage(message);
|
only1yzerman@0
|
205 end
|
only1yzerman@0
|
206
|
only1yzerman@0
|
207
|
only1yzerman@0
|
208
|
only1yzerman@0
|
209 -------- ARROW LOADING AND DISPLAY
|
only1yzerman@0
|
210
|
only1yzerman@0
|
211 local function GetArrowTexture()
|
only1yzerman@0
|
212
|
only1yzerman@0
|
213 local tex = Bloodhound2.GravityTexture
|
only1yzerman@0
|
214
|
only1yzerman@0
|
215 if not ( tex ) then
|
only1yzerman@1
|
216 tex = Minimap:CreateTexture("Bloodhound2_Arrow", "OVERLAY");
|
only1yzerman@0
|
217 tex:SetTexture("Interface\\AddOns\\Bloodhound2\\MinimapArrow");
|
only1yzerman@0
|
218 Bloodhound2.GravityTexture = tex
|
only1yzerman@0
|
219 end
|
only1yzerman@0
|
220
|
only1yzerman@0
|
221 return tex
|
only1yzerman@0
|
222 end
|
only1yzerman@0
|
223
|
only1yzerman@0
|
224 function Bloodhound2.DrawArrow(grx, gry, cf, sf)
|
only1yzerman@0
|
225
|
only1yzerman@0
|
226 local gravityX = grx * cf - gry * sf;
|
only1yzerman@0
|
227 local gravityY = gry * cf + grx * sf;
|
only1yzerman@0
|
228 local gravityTexture = GetArrowTexture()
|
only1yzerman@0
|
229
|
only1yzerman@0
|
230 if (gravityX == 0 and gravityY == 0) then
|
only1yzerman@0
|
231 gravityTexture:Hide();
|
only1yzerman@0
|
232 return;
|
only1yzerman@0
|
233 end
|
only1yzerman@0
|
234
|
only1yzerman@0
|
235 local gravityScale = sqrt(gravityX * gravityX + gravityY * gravityY)
|
only1yzerman@0
|
236 gravityX = gravityX / gravityScale
|
only1yzerman@0
|
237 gravityY = gravityY / gravityScale
|
only1yzerman@0
|
238
|
only1yzerman@0
|
239 -- determine rotated and scaled texture coordinates
|
only1yzerman@0
|
240 local gy = (gravityX + gravityY) / 2.82843
|
only1yzerman@0
|
241 local gx = (gravityX - gravityY) / 2.82843
|
only1yzerman@0
|
242
|
only1yzerman@0
|
243 gravityTexture:SetTexCoord(
|
only1yzerman@0
|
244 0.5 - gx, 0.5 + gy,
|
only1yzerman@0
|
245 0.5 + gy, 0.5 + gx,
|
only1yzerman@0
|
246 0.5 - gy, 0.5 - gx,
|
only1yzerman@0
|
247 0.5 + gx, 0.5 - gy);
|
only1yzerman@0
|
248
|
only1yzerman@0
|
249 gravityTexture:SetPoint("CENTER", Minimap, "CENTER", 40 * gravityX, -40 * gravityY)
|
only1yzerman@0
|
250 gravityTexture:Show()
|
only1yzerman@0
|
251 end
|
only1yzerman@0
|
252
|
only1yzerman@0
|
253
|
only1yzerman@0
|
254 -------- "RUBY" MANAGEMENT (REUSE RUBIES AND ONLY CREATE NEW ONES WHEN NEEDED)
|
only1yzerman@0
|
255
|
only1yzerman@0
|
256 local circles = {};
|
only1yzerman@0
|
257 local nextCircle = 1;
|
only1yzerman@0
|
258 local circleScale = 1;
|
only1yzerman@0
|
259
|
only1yzerman@0
|
260 function Bloodhound2.ResetCircles()
|
only1yzerman@0
|
261 nextCircle = 1;
|
only1yzerman@0
|
262 circleScale = Minimap:GetHeight() * 0.015 / (7 - Minimap:GetZoom());
|
only1yzerman@0
|
263 end
|
only1yzerman@0
|
264
|
only1yzerman@0
|
265 function Bloodhound2.SetCircle(dx, dy, alpha)
|
only1yzerman@0
|
266 local circle;
|
only1yzerman@0
|
267 if (#circles < nextCircle) then
|
only1yzerman@1
|
268 circle = Minimap:CreateTexture("Bloodhound_Circle", "ARTWORK", nil, -7);
|
only1yzerman@0
|
269 circles[nextCircle] = circle;
|
only1yzerman@0
|
270 circle:SetTexture("Interface\\AddOns\\Bloodhound2\\Circle");
|
only1yzerman@0
|
271 circle:SetWidth(12);
|
only1yzerman@0
|
272 circle:SetHeight(12);
|
only1yzerman@0
|
273 circle:SetAlpha(1);
|
only1yzerman@0
|
274 else
|
only1yzerman@0
|
275 circle = circles[nextCircle];
|
only1yzerman@0
|
276 end
|
only1yzerman@0
|
277
|
only1yzerman@0
|
278 nextCircle = nextCircle + 1;
|
only1yzerman@0
|
279 circle:SetPoint("CENTER", Minimap, "CENTER", dx * circleScale, -dy * circleScale);
|
only1yzerman@0
|
280 circle:SetAlpha(alpha);
|
only1yzerman@0
|
281 circle:Show();
|
only1yzerman@0
|
282 end
|
only1yzerman@0
|
283
|
only1yzerman@0
|
284 function Bloodhound2.HideExtraCircles()
|
only1yzerman@0
|
285 for i=nextCircle,#circles,1 do
|
only1yzerman@0
|
286 circles[i]:Hide();
|
only1yzerman@0
|
287 end
|
only1yzerman@0
|
288 end
|
only1yzerman@0
|
289
|
only1yzerman@0
|
290
|
only1yzerman@0
|
291
|
only1yzerman@0
|
292 -------- MAIN FUNCTION FOR CALCULATING RECOMMENDED DIRECTION OF TRAVEL
|
only1yzerman@0
|
293
|
only1yzerman@0
|
294 function Bloodhound2.CalculateForce(cf, sf)
|
only1yzerman@0
|
295
|
only1yzerman@0
|
296 local c = player.C; -- get player position
|
only1yzerman@0
|
297 local z = player.Z;
|
only1yzerman@0
|
298 local x = player.X;
|
only1yzerman@0
|
299 local y = player.Y;
|
only1yzerman@6
|
300 local ztxt = GetZoneText();
|
only1yzerman@6
|
301 local zstxt = GetSubZoneText();
|
only1yzerman@6
|
302 local badzones = { "The Star's Bazaar", "The Emperor's Step", "The Golden Lantern", "Chamber of Reflection", "The Imperial Exchange", "Path of Serenity", "Ethereal Corridor", "The Celestial Vault", "Chamber of Enlightenment" }
|
only1yzerman@6
|
303
|
only1yzerman@6
|
304 if (Bloodhound2.BadZone(ztxt, zstxt, badzones) == false) then return 0,0 end -- don't draw the arrow when inside Shrine of Seven Stars
|
only1yzerman@5
|
305 if c == 0 or z == 0 or c == -1 then return 0,0 end -- don't draw arrow if using world coordinates
|
only1yzerman@0
|
306 if not Bloodhound2.ZoneDatum then return 0,0 end
|
only1yzerman@0
|
307
|
only1yzerman@0
|
308 local datum = Bloodhound2.ZoneDatum[c][z]; -- get scale and offset for current zone map
|
only1yzerman@0
|
309 if datum == nil then return 0,0 end
|
only1yzerman@0
|
310
|
only1yzerman@0
|
311 local gx, gy = Bloodhound2.ZoneDatum.LocalToGlobal(x, y, datum); -- convert player position to world coordinates
|
only1yzerman@0
|
312 local now = time(); -- value to use for time-stamping visited nodes
|
only1yzerman@0
|
313 local fx = 0; -- cumulative force, X-component
|
only1yzerman@0
|
314 local fy = 0; -- cumulative force, Y-component
|
only1yzerman@0
|
315 local multiZone = true; -- whether to include more than the current zone
|
only1yzerman@0
|
316 local inspectionRadius = 60;
|
only1yzerman@0
|
317
|
only1yzerman@0
|
318 if Settings then
|
only1yzerman@0
|
319 if Settings.MultiZoneMode==0 then
|
only1yzerman@0
|
320 multiZone = IsFlying();
|
only1yzerman@0
|
321 elseif Settings.MultiZoneMode==1 then
|
only1yzerman@0
|
322 multiZone = true;
|
only1yzerman@0
|
323 else
|
only1yzerman@0
|
324 multiZone = false;
|
only1yzerman@0
|
325 end
|
only1yzerman@0
|
326
|
only1yzerman@0
|
327 if Settings.InspectionRadius then
|
only1yzerman@0
|
328 inspectionRadius = Settings.InspectionRadius;
|
only1yzerman@0
|
329 end
|
only1yzerman@0
|
330 end
|
only1yzerman@0
|
331
|
only1yzerman@0
|
332 local settingsFilter = {}; -- which node types to ignore
|
only1yzerman@0
|
333 local nodes = {}; -- which nodes to track
|
only1yzerman@0
|
334
|
only1yzerman@0
|
335 for i=1,GetNumTrackingTypes(),1 do
|
only1yzerman@0
|
336 local name, _, active, _ = GetTrackingInfo(i);
|
only1yzerman@0
|
337 if (active == 1) then
|
only1yzerman@0
|
338 if (name == L["Find Herbs"]) then
|
only1yzerman@0
|
339 for k,v in pairs(Settings.HerbFilter) do settingsFilter[k] = v end
|
only1yzerman@0
|
340 for k,v in pairs(Bloodhound2.HerbNodes) do tinsert(nodes, v) end
|
only1yzerman@0
|
341 elseif (name == L["Find Minerals"]) then
|
only1yzerman@0
|
342 for k,v in pairs(Settings.OreFilter) do settingsFilter[k] = v end
|
only1yzerman@0
|
343 for k,v in pairs(Bloodhound2.OreNodes) do tinsert(nodes, v) end
|
only1yzerman@12
|
344 else
|
only1yzerman@7
|
345 for k,v in pairs(Settings.MiscFilter) do settingsFilter[k] = v end
|
only1yzerman@2
|
346 for k,v in pairs(Bloodhound2.MiscNodes) do tinsert(nodes, v) end
|
only1yzerman@7
|
347 end
|
only1yzerman@0
|
348 end
|
only1yzerman@0
|
349 end
|
only1yzerman@0
|
350
|
only1yzerman@0
|
351 local avoidZones = {}; -- which zones to avoid
|
only1yzerman@0
|
352
|
only1yzerman@0
|
353 if multiZone then
|
only1yzerman@0
|
354 local cmc = GetCurrentMapContinent()
|
only1yzerman@0
|
355
|
only1yzerman@0
|
356 if not Settings.ZoneFilter[cmc] then
|
only1yzerman@0
|
357 Settings.ZoneFilter[cmc] = {}
|
only1yzerman@0
|
358 end
|
only1yzerman@0
|
359
|
only1yzerman@0
|
360 for k,v in pairs(Settings.ZoneFilter[GetCurrentMapContinent()]) do
|
only1yzerman@0
|
361 avoidZones[k] = true;
|
only1yzerman@0
|
362 end
|
only1yzerman@0
|
363 end
|
only1yzerman@0
|
364
|
only1yzerman@0
|
365 local avoidNodes = {}; -- which node types to ignore
|
only1yzerman@0
|
366
|
only1yzerman@0
|
367 if settingsFilter then
|
only1yzerman@0
|
368 for k,v in pairs(settingsFilter) do
|
only1yzerman@0
|
369 avoidNodes[k] = true;
|
only1yzerman@0
|
370 end
|
only1yzerman@0
|
371 end
|
only1yzerman@0
|
372
|
only1yzerman@0
|
373 local minimapSize = Minimap:GetWidth() / 2 - 2;
|
only1yzerman@0
|
374 Bloodhound2.ResetCircles();
|
only1yzerman@0
|
375
|
only1yzerman@0
|
376 for key, node in pairs(nodes) do
|
only1yzerman@0
|
377 if (avoidNodes[node.N] ~= true) and (avoidZones[node.Z] ~= true) and (multiZone or (node.Z == z)) then
|
only1yzerman@0
|
378 local dx = node.X - gx;
|
only1yzerman@0
|
379 local dy = node.Y - gy;
|
only1yzerman@0
|
380 local rsqrd = dx * dx + dy * dy;
|
only1yzerman@0
|
381 local r = sqrt(rsqrd); -- distance to node
|
only1yzerman@0
|
382 local age = now - node.TimeStamp; -- time since last inspected
|
only1yzerman@0
|
383
|
only1yzerman@0
|
384 if (r < inspectionRadius) then
|
only1yzerman@0
|
385 node.TimeStamp = now;
|
only1yzerman@0
|
386 else
|
only1yzerman@0
|
387 --[[
|
only1yzerman@0
|
388 The magnitude of the force is proportional to the age and inversely
|
only1yzerman@0
|
389 proportional to the square of the distance, and the direction is towards
|
only1yzerman@0
|
390 the node. The math for this starts out as
|
only1yzerman@0
|
391
|
only1yzerman@0
|
392 local force = age / rsqrd
|
only1yzerman@0
|
393 local angle = math.atan2(dy, dx)
|
only1yzerman@0
|
394 fx = fx + force * math.cos(angle)
|
only1yzerman@0
|
395 fy = fy + force * math.sin(angle)
|
only1yzerman@0
|
396
|
only1yzerman@0
|
397 But cos(angle) is just dx/r and sin(angle) is just dy/r, so we don't
|
only1yzerman@0
|
398 actually need atan2, cos, and sin and instead we can write this as
|
only1yzerman@0
|
399 ]]
|
only1yzerman@0
|
400 local force = age / (r * rsqrd)
|
only1yzerman@0
|
401 fx = fx + force * dx
|
only1yzerman@0
|
402 fy = fy + force * dy
|
only1yzerman@0
|
403 end
|
only1yzerman@0
|
404
|
only1yzerman@0
|
405 if (r * circleScale < minimapSize) and (age > 60) then -- draw ruby
|
only1yzerman@0
|
406 local alpha = r / (minimapSize / circleScale) / 0.7 - 0.3;
|
only1yzerman@0
|
407 alpha = max(0, alpha);
|
only1yzerman@0
|
408 Bloodhound2.SetCircle(dx * cf - dy * sf, dy * cf + dx * sf, alpha);
|
only1yzerman@0
|
409 end
|
only1yzerman@0
|
410 end
|
only1yzerman@0
|
411 end
|
only1yzerman@0
|
412
|
only1yzerman@0
|
413 Bloodhound2.HideExtraCircles();
|
only1yzerman@0
|
414 return fx, fy;
|
only1yzerman@0
|
415 end
|
only1yzerman@0
|
416
|
only1yzerman@0
|
417
|
only1yzerman@0
|
418
|
only1yzerman@0
|
419
|
only1yzerman@0
|
420
|
only1yzerman@0
|
421
|
only1yzerman@0
|
422
|
only1yzerman@0
|
423 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
424 -------- REPARENT THE MINIMAP FOR 3RD PARTY MINIMAPS AND HUDS
|
only1yzerman@0
|
425 -------- - Added by Zasurus(www.curseforge.com/profiles/Zasurus/) for MiniHugeHUD
|
only1yzerman@0
|
426 ----------------------------------------------------------------------------------------------------
|
only1yzerman@0
|
427 function Bloodhound2.ReparentMinimap(NewMinimap, MinimapName)
|
only1yzerman@0
|
428 Bloodhound2.OnUpdateScript(nil, 1000000)
|
only1yzerman@0
|
429 -- Hide the circles currently on the minimap
|
only1yzerman@0
|
430 Bloodhound2.ResetCircles();
|
only1yzerman@0
|
431 Bloodhound2.HideExtraCircles();
|
only1yzerman@0
|
432 -- Hide this minimap's copy of the arrow
|
only1yzerman@0
|
433 if Bloodhound2.GravityTexture then
|
only1yzerman@0
|
434 Bloodhound2.GravityTexture:Hide();
|
only1yzerman@0
|
435 end;
|
only1yzerman@0
|
436 -- Store the current set of circles and arrow on this minimap for later
|
only1yzerman@0
|
437 Minimap.Bloodhound2Circles = circles;
|
only1yzerman@0
|
438 Minimap.Bloodhound2Arrow = Bloodhound2.GravityTexture;
|
only1yzerman@0
|
439 -- Pull back (or create for circles) the arrow and circles for this minimap
|
only1yzerman@0
|
440 circles = NewMinimap.Bloodhound2Circles or {};
|
only1yzerman@0
|
441 ZasCircles = circles;
|
only1yzerman@0
|
442 Bloodhound2.GravityTexture = NewMinimap.Bloodhound2Arrow;
|
only1yzerman@0
|
443 -- Move Bloodhound2's Local Minimap pointer to the new minimap
|
only1yzerman@0
|
444 Minimap = NewMinimap;
|
only1yzerman@0
|
445 Minimap.MinimapName = MinimapName;
|
only1yzerman@0
|
446 -- Update all points
|
only1yzerman@0
|
447 Bloodhound2.UpdateMinimap();
|
only1yzerman@0
|
448 end
|
only1yzerman@0
|
449 ---------------------------------------------------------------------------------------------------- |