annotate Bloodhound2.lua @ 18:c530327b423c Release

Updated for 5.4 Added new zone to the Bloodhound2 Database (Timeless Isle). Fixed Bug 7: Fadeleaf absent from Feralas Database. Updated zone data to fix issues on the PTR with certain zones not placing rubies properly. Updated Herb and Ore Databases.
author only1yzerman
date Tue, 10 Sep 2013 02:34:11 -0400
parents ad6dff5d31c7
children
rev   line source
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 ----------------------------------------------------------------------------------------------------