You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
5.9 KiB

4 years ago
--lua
local unpack, select, wipe, pairs, GetInstanceInfo, strsplit, tonumber, type, tContains, tinsert
= unpack, select, wipe, pairs, GetInstanceInfo, strsplit, tonumber, type, tContains, tinsert
local SetMapToCurrentZone, GetCurrentMapAreaID, GetSpecializationInfo, UnitAffectingCombat, UnitGUID, GetSpecializationInfoByID
= SetMapToCurrentZone, GetCurrentMapAreaID, GetSpecializationInfo, UnitAffectingCombat, UnitGUID, GetSpecializationInfoByID
local BestInSlot, L = unpack(select(2, ...))
local ZoneDetect = BestInSlot:NewModule("ZoneDetect", "AceEvent-3.0", "AceHook-3.0")
ZoneDetect.colorDisable = "|cff777777"
local bossTracking = false
local waitingForMovement = false
local mapIds = {}
local npcIds = {}
function ZoneDetect:OnEnable()
self:RegisterEvent("ZONE_CHANGED_NEW_AREA")
self:ZONE_CHANGED_NEW_AREA()
end
function ZoneDetect:OnDisable()
self:UnregisterEvent("ZONE_CHANGED_NEW_AREA")
end
function ZoneDetect:EnableBossTracking()
if bossTracking then return end
self:Print("Enabled boss tracking")
self:HookScript(GameTooltip, "OnTooltipSetUnit", "TooltipSetUnit")
bossTracking = true
end
function ZoneDetect:DisableBossTracking()
if not bossTracking then return end
self:Print("Disabled boss tracking")
self:Unhook(GameTooltip, "OnTooltipSetUnit")
bossTracking = false
end
local difficultyTable = {
[1] = 1,
[2] = 2,
[3] = 1,
[4] = 1,
[5] = 2,
[6] = 2,
[7] = 4,
[8] = 2,
[9] = 1,
[11] = 2,
[12] = 1,
[14] = 1,
[15] = 2,
[16] = 3,
[17] = 4,
[23] = 3, -- Mythic Dungeon
}
function ZoneDetect:GetDifficulty()
local _,_, difficId = GetInstanceInfo()
return difficultyTable[difficId]
end
function ZoneDetect:GetItemText(item)
local diffic = self:GetDifficulty()
local activeSpec = GetSpecializationInfo(self:GetSpecialization())
local specs = {}
if item.isBiS and item.isBiS[diffic] then
for k,v in pairs(item.isBiS[diffic]) do
local specName = select(2, GetSpecializationInfoByID(k))
tinsert(specs, (activeSpec == k and self.colorHighlight or self.colorDisable)..specName..self.colorNormal)
end
end
return item.link .. (#specs == 0 and "" or " ("..strjoin(",", unpack(specs)) ..")")
end
function ZoneDetect:TooltipSetUnit(tooltip)
if not self.db.char.options.tooltipCombat and UnitAffectingCombat("player") then return end
local _, unit = tooltip:GetUnit()
if not unit then return end
local guid = UnitGUID(unit)
local npcType,_,_,_,_,npcId = strsplit("-", guid)
if npcType and (npcType == "Creature" or npcType == "Vehicle") then
npcId = tonumber(npcId)
if npcId and self.options.DEBUG then
tooltip:AddLine(("%sBiS Debug%s: NPCID: "..npcId):format(self.colorHighlight, self.colorNormal))
end
if npcId and npcIds[npcId] then
local instance = npcIds[npcId][1]
local boss = npcIds[npcId][2]
local bossName = self:GetDescription(self.BOSS, instance, boss)
local raidTier = self:GetRaidTiers(self.INSTANCE, instance)
local difficulty = self:GetDifficulty()
local BiSList = self:GetBestInSlotItems(raidTier, difficulty)
local neededItems = {}
local obtainedItems = {}
self.console:Add("Needed items", neededItems)
self.console:Add("Obtained Items", obtainedItems)
for specId, specdata in pairs(BiSList) do
if type(specdata) == "table" then
for i in pairs(specdata) do
local itemid = specdata[i].item
local obtained = specdata[i].obtained
local item = self:GetItem(itemid, difficulty)
if item then
if item.multiplesources then
if item.multiplesources[instance] and item.multiplesources[instance][boss] then
if obtained then obtainedItems[itemid] = item else neededItems[itemid] = item end
end
elseif item.bossid == boss and item.dungeon == instance then
if obtained then obtainedItems[itemid] = item else neededItems[itemid] = item end
end
end
end
end
end
if self.options.DEBUG then
tooltip:AddLine(("%sBiS Debug%s: This is a known boss: "..bossName):format(self.colorHighlight, self.colorNormal))
end
local first = true
for id, item in pairs(neededItems) do
if first then
tooltip:AddLine((L["These items from %s are %sBestInSlot%s:"]):format(bossName, self.colorHighlight, self.colorNormal), nil,nil,nil,true)
first = false
end
tooltip:AddLine(("- %s"):format(self:GetItemText(item)))
end
first = true
for id, item in pairs(obtainedItems) do
if first then
tooltip:AddLine((L["You already have these %sBestInSlot%s items from %s"]):format(self.colorHighlight, self.colorNormal, bossName), nil,nil,nil,true)
first = false
end
tooltip:AddLine(("- %s"):format(self:GetItemText(item)))
end
end
end
end
function ZoneDetect:ZONE_CHANGED_NEW_AREA()
if not waitingForMovement then
self:RegisterEvent("PLAYER_STARTED_MOVING")
waitingForMovement = true
end
end
function ZoneDetect:PLAYER_STARTED_MOVING()
if not WorldMapFrame:IsVisible() then
--SetMapToCurrentZone()
local id = C_Map.GetBestMapForUnit("player")
if mapIds[id] and tContains(self:GetInstances(), mapIds[id]) then
local raidTier = self:GetRaidTiers(self.INSTANCE, mapIds[id])
self:SetSelected(self.INSTANCE, mapIds[id])
self:SetSelected(self.DIFFICULTY, self:GetDifficulty())
ZoneDetect:EnableBossTracking()
else
ZoneDetect:DisableBossTracking()
end
waitingForMovement = false
self:UnregisterEvent("PLAYER_STARTED_MOVING")
end
end
function ZoneDetect:RegisterMapID(id, raid)
mapIds[id] = raid
end
function ZoneDetect:RegisterNPCID(id, instance, bossid)
npcIds[id] = {instance, bossid}
end