Files
coa-atlasloot/AtlasLoot/Core/Maps.lua
T
Anch e04717d340 update to version 7.3.18 (#11)
* Merged Magisters Terrace - Kael'thas Sunstriders normal/heroic pages

* update to build 7.3.18
2024-08-28 09:38:01 -07:00

257 lines
11 KiB
Lua

local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot")
local ORANGE = "|cffFF8400"
local GOLD = "|cffffcc00"
local WHITE = "|cFFFFFFFF"
local CYAN = "|cff00ffff"
local DefaultPin = "questlog-questtypeicon-daily"
-- Map Functions
local playerFaction = UnitFactionGroup("player")
local lastMap
local totalPins = 0
-- Creates the map pins
function AtlasLoot:CreateMapPins(list)
_G["AtlasLoot_PlayerMapPin"]:Hide()
-- Hide all pins before reshowing so any extras arnt showing
if totalPins then
for i = 1, totalPins do
_G["AtlasLoot_MapPin"..i]:Hide()
end
end
-- Creates buttons on the map for pins if a button dosnt already exist
-- If a button exists reuse it
for i,map in ipairs(list) do
--create pin buttons
if not _G["AtlasLoot_MapPin"..i] then
-- Map Pins
local mapPin = CreateFrame("Button","AtlasLoot_MapPin"..i, AtlasLootDefaultFrame_Map)
mapPin:SetSize(25,25)
mapPin:SetFrameStrata("HIGH")
mapPin.text = mapPin:CreateFontString(nil, "OVERLAY","GameFontNormal")
mapPin.text:SetPoint("LEFT",mapPin, 30, 0)
mapPin.text:SetJustifyH("LEFT")
mapPin.text:SetFont("GameFontNormal", 28)
mapPin.text:SetSize(150,12)
mapPin.tex = mapPin:CreateTexture(nil, "ARTWORK")
mapPin.tex:SetPoint("CENTER")
totalPins = totalPins + 1
end
-- converts a standard coordinate x,y to stardard anchor points
local x = ((AtlasLootDefaultFrame_Map:GetWidth()/100) * map[2][1]) - (_G["AtlasLoot_MapPin"..i]:GetWidth()/2)
local y = (-(AtlasLootDefaultFrame_Map:GetHeight()/100) * map[2][2]) + (_G["AtlasLoot_MapPin"..i]:GetHeight()/2)
_G["AtlasLoot_MapPin"..i]:SetScript("OnEnter", function(btn)
self.showCords = true
GameTooltip:SetOwner(btn, "ANCHOR_TOPLEFT")
GameTooltip:AddLine(WHITE..map[1])
if map[4] and list.groups[map[4]] then
for _,v in ipairs(list.groups[map[4]]) do
if v ~= map[1] then
GameTooltip:AddLine(WHITE..v)
end
end
end
GameTooltip:AddLine("("..map[2][1]..", "..map[2][2]..")")
GameTooltip:Show()
end)
_G["AtlasLoot_MapPin"..i]:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
if map[3] then
local tex = AtlasUtil:GetAtlasInfo(map[3])
_G["AtlasLoot_MapPin"..i].tex:SetTexture(tex.filename)
_G["AtlasLoot_MapPin"..i].tex:SetTexCoord(tex.leftTexCoord, tex.rightTexCoord, tex.topTexCoord, tex.bottomTexCoord)
_G["AtlasLoot_MapPin"..i].tex:SetSize(25,25)
else
local tex = AtlasUtil:GetAtlasInfo(DefaultPin)
_G["AtlasLoot_MapPin"..i].tex:SetTexture(tex.filename)
_G["AtlasLoot_MapPin"..i].tex:SetTexCoord(tex.leftTexCoord, tex.rightTexCoord, tex.topTexCoord, tex.bottomTexCoord)
_G["AtlasLoot_MapPin"..i].tex:SetSize(25,25)
end
_G["AtlasLoot_MapPin"..i].text:SetText(CYAN..map[1])
_G["AtlasLoot_MapPin"..i]:ClearAllPoints()
_G["AtlasLoot_MapPin"..i]:SetPoint("TOPLEFT",AtlasLootDefaultFrame_Map,x ,y)
_G["AtlasLoot_MapPin"..i]:Show()
end
end
function AtlasLoot:MapOnEnter()
local x, y = self:GetCursorCords()
if self.showCords then
AtlasLootDefaultFrame_Map.cursorCords:SetText(WHITE.."Cursor: "..x.." , "..y)
end
end
-- Track the coordinates off the mouse while it is on the map frame
function AtlasLoot:GetCursorCords()
local scale,x, y = AtlasLootDefaultFrame_Map:GetEffectiveScale(), GetCursorPosition()
local width, height = AtlasLootDefaultFrame_Map:GetWidth()/100, AtlasLootDefaultFrame_Map:GetHeight()/100
x, y = math.ceil(((x/scale) - AtlasLootDefaultFrame_Map:GetLeft())/width), math.ceil((((y/scale) - AtlasLootDefaultFrame_Map:GetTop())/height) * -1)
return x, y
end
function AtlasLoot:PlayerPin(firstSet)
if AtlasLootDefaultFrame_Map:IsVisible() and AtlasLoot_MapData[self.CurrentMap].ZoneName[1] == GetRealZoneText() and self.MapNum == GetCurrentMapDungeonLevel() then
_G["AtlasLoot_PlayerMapPin"]:Show()
else
return
end
if GetUnitSpeed("player") > 0 or firstSet then
local x, y = GetPlayerMapPosition("player")
x = ((AtlasLootDefaultFrame_Map:GetWidth()/100) * (x * 100)) - (_G["AtlasLoot_PlayerMapPin"]:GetWidth()/2)
y = (-(AtlasLootDefaultFrame_Map:GetHeight()/100) * (y * 100)) + (_G["AtlasLoot_PlayerMapPin"]:GetHeight()/2)
_G["AtlasLoot_PlayerMapPin"]:ClearAllPoints()
_G["AtlasLoot_PlayerMapPin"]:SetPoint("TOPLEFT",AtlasLootDefaultFrame_Map, x, y )
_G["AtlasLoot_PlayerMapPin"].texture:SetRotation(GetPlayerFacing())
end
self.playerPinTimer = self:ScheduleTimer("PlayerPin", .1)
end
function AtlasLoot:SetNavButtons(mapID, mapNum)
if not AtlasLootDefaultFrame_Map:IsVisible() then return end
--Hide navigation buttons by default, only show what we need
_G["AtlasLootItemsFrame_BACK"]:Hide()
_G["AtlasLootItemsFrame_NEXT"]:Hide()
_G["AtlasLootItemsFrame_PREV"]:Hide()
if mapNum ~= #_G["AtlasLoot_MapData"][mapID] then
_G["AtlasLootItemsFrame_NEXT"]:SetParent("AtlasLootDefaultFrame_Map")
_G["AtlasLootItemsFrame_NEXT"]:Show()
_G["AtlasLootItemsFrame_NEXT"].mapNum = mapNum + 1
_G["AtlasLootItemsFrame_NEXT"].mapID = mapID
_G["AtlasLootItemsFrame_NEXT"]:ClearAllPoints()
_G["AtlasLootItemsFrame_NEXT"]:SetPoint("BOTTOMRIGHT", "AtlasLootDefaultFrame_Map", "BOTTOMRIGHT",-5,5)
end
if mapNum ~= 1 then
_G["AtlasLootItemsFrame_PREV"]:SetParent("AtlasLootDefaultFrame_Map")
_G["AtlasLootItemsFrame_PREV"]:Show()
_G["AtlasLootItemsFrame_PREV"].mapNum = mapNum - 1
_G["AtlasLootItemsFrame_PREV"].mapID = mapID
_G["AtlasLootItemsFrame_PREV"]:ClearAllPoints()
_G["AtlasLootItemsFrame_PREV"]:SetPoint("BOTTOMLEFT", "AtlasLootDefaultFrame_Map", "BOTTOMLEFT",5,5)
end
end
--called everytime you open a map hiding the loot item buttons
function AtlasLoot:MapOnShow(mapID, mapNum, refresh)
if not refresh and AtlasLootDefaultFrame_Map:IsVisible() then
AtlasLootDefaultFrame_Map:Hide()
AtlaslLoot_LootBackground:Show()
self:BackButton_OnClick()
AtlasLoot_BossName:Show()
Atlasloot_HeaderLabel:Hide()
self:ScrollFrameUpdate()
else
if self.CurrentMap then
AtlasLoot_BossName:Hide()
-- Hide the Filter Check-Box
AtlasLootFilterCheck:Hide()
AtlaslLoot_LootBackground:Hide()
--Hide UI objects so that only needed ones are shown
for i = 1, 30, 1 do
_G["AtlasLootItem_"..i]:Hide()
_G["AtlasLootItem_"..i].itemID = 0
end
AtlasLootDefaultFrame_Map:Show()
Atlasloot_HeaderLabel:Show()
self:ScrollFrameUpdate(true)
AtlasLootDefaultFrameScroll:Hide()
SetMapToCurrentZone()
if mapNum and mapID then
self.CurrentMap = mapID
elseif AtlasLoot_MapData[self.CurrentMap].ZoneName[1] == GetRealZoneText() then
if GetCurrentMapDungeonLevel() == 0 then
mapNum = 1
else
mapNum = GetCurrentMapDungeonLevel()
end
elseif lastMap == self.CurrentMap then
mapNum = self.MapNum
end
lastMap = self.CurrentMap
self:MapSelect(self.CurrentMap, mapNum)
end
end
end
--called to change the current displayed map
function AtlasLoot:MapSelect(mapID, mapNum)
local map = AtlasLoot_MapData[mapID]
if map.MapName then
for i = 1, 12 do
local texture = _G["AtlasLoot_MapDetailTile"..i]:SetTexture("Interface\\Worldmap\\"..map.MapName.."\\"..map.MapName..mapNum.."_"..i)
if not texture then
_G["AtlasLoot_MapDetailTile"..i]:SetTexture("Interface\\Worldmap\\"..map.MapName.."\\"..map.MapName..i)
end
end
end
local pinsList = {groups = {}}
local group = 0
for _, v in ipairs (map[mapNum]) do
if v.cords then
group = group + 1
tinsert(pinsList,{v[1],v.cords,v.pinType, group})
end
if group ~= 0 then
if not pinsList.groups[group] then pinsList.groups[group] = {} end
tinsert(pinsList.groups[group], v[1])
end
end
self.MapNum = mapNum
self.CurrentMap = mapID
self:SubTableScrollFrameUpdate(mapID, "AtlasLoot_MapData", mapNum)
self:SetNavButtons(mapID, mapNum)
self:CreateMapPins(pinsList)
self:CancelTimer(self.playerPinTimer)
self:PlayerPin(true)
local text = map.ZoneName[1]..WHITE.." ["..map.Acronym.."]\n"..
GOLD .. "Location: ".. WHITE..map.Location[1].."\n"..
GOLD .. "Level Range: ".. WHITE..map.LevelRange.."\n"..
GOLD .. "Minimum Level: ".. WHITE..map.MinLevel.."\n"..
GOLD .. "Player Limit: ".. WHITE..map.PlayerLimit
if map.Reputation and type(map.Reputation) == "table" then
text = text .. "\n" .. GOLD .. AL["Reputation"] .. ": ".. WHITE .. map.Reputation[playerFaction]
elseif map.Reputation then
text = text .. "\n" .. GOLD .. AL["Reputation"] .. ": ".. WHITE .. map.Reputation
end
Atlasloot_HeaderLabel:SetText(text)
self:SetMapButtonText(mapID, mapNum)
end
function AtlasLoot:SetMapButtonText(mapID, mapNum)
local map = AtlasLoot_MapData[mapID]
mapNum = mapNum or 1
local text
if map[mapNum][1].Zone then
text = map[mapNum][2][1]
else
text = map[mapNum][1][1]
end
AtlasLootDefaultFrame_MapButton:SetText(text)
end
--drop down map menu
function AtlasLoot:MapMenuOpen(frame)
local mapID = self.CurrentMap
local map = AtlasLoot_MapData[mapID]
local menuList = { [1] = {} }
for i,v in ipairs(map) do
local text
if v[1].Zone then
text = map[i][2][1]
else
text = v[1][1] or ""
end
tinsert(menuList[1], {text = WHITE..text, func = function() self:MapOnShow(mapID, i, true) end, notCheckable = true, closeWhenClicked = true, textHeight = 12, textWidth = 12})
end
tinsert(menuList[1], {divider = 35})
tinsert(menuList[1], {text = ORANGE..AL["Open AscensionDB To Zone Map"], func = function() self:OpenDBURL(AtlasLoot_MapData[self.CurrentMap].ZoneName[2] , "zone") end, notCheckable = true, closeWhenClicked = true, textHeight = 12, textWidth = 12})
tinsert(menuList[1], {close = true, divider = 35})
self:OpenDewdropMenu(frame, menuList)
end