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.

263 lines
12 KiB

local Details = _G.Details
local addonName, Details222 = ...
local ipairs = ipairs --lua local
local detailsFramework = DetailsFramework
local ejTable = Details222.EncounterJournalDump
--maybe also cache old expansions and perhaps current expansion dungeons that aren't in the current mythic+ season
---@class details_encounterinfo : table
---@field name string
---@field mapId number
---@field instanceId number
---@field dungeonEncounterId number
---@field journalEncounterId number
---@field journalInstanceId number
---@field creatureName string
---@field creatureIcon string
---@field creatureId number
---@field creatureDisplayId number
---@field creatureUIModelSceneId number
---@class details_instanceinfo : table
---@field name string
---@field bgImage string
---@field mapId number
---@field instanceId number
---@field journalInstanceId number
---@field encountersArray details_encounterinfo[]
---@field encountersByName table<string, details_encounterinfo>
---@field encountersByDungeonEncounterId table<number, details_encounterinfo>
---@field encountersByJournalEncounterId table<number, details_encounterinfo>
---@field icon string
---@field iconSize table<number, number>
---@field iconCoords table<number, number, number, number>
---@field iconLore string
---@field iconLoreSize table<number, number>
---@field iconLoreCoords table<number, number, number, number>
---@field iconTexture string
---@field iconTextureSize table<number, number>
---@field iconTextureCoords table<number, number, number, number>
---@return details_encounterinfo?
function Details:GetEncounterInfo(id)
---@type details_encounterinfo
local encounterData = Details222.EJCache.CacheEncountersBy_EncounterId[id]
if (encounterData) then
return encounterData
end
encounterData = Details222.EJCache.CacheEncountersBy_EncounterName[id]
if (encounterData) then
return encounterData
end
encounterData = Details222.EJCache.CacheEncountersBy_JournalEncounterId[id]
if (encounterData) then
return encounterData
end
end
---@param id instanceid|instancename|mapid
---@return details_instanceinfo?
function Details:GetInstanceInfo(id)
if (id == 463) then --fall
id = 1209
end
---@type details_instanceinfo
local instanceData = Details222.EJCache.CacheRaidData_ByInstanceId[id]
if (instanceData) then
return instanceData
end
instanceData = Details222.EJCache.CacheRaidData_ByInstanceName[id]
if (instanceData) then
return instanceData
end
instanceData = Details222.EJCache.CacheRaidData_ByMapId[id]
if (instanceData) then
return instanceData
end
end
function Details:DumpInstanceInfo()
dumpt(Details222.EJCache.CacheRaidData_ByInstanceId)
end
function Details:GetInstanceEJID(...)
for i = 1, select("#", ...) do
local id = select(i, ...)
local EJID = Details222.EJCache.Id_To_JournalInstanceID[id]
if (EJID) then
return EJID
end
end
end
function Details222.EJCache.CreateEncounterJournalDump()
Details222.EJCache.CacheRaidData_ByInstanceId = {}
Details222.EJCache.CacheRaidData_ByInstanceName = {} --this is localized name
Details222.EJCache.CacheRaidData_ByMapId = {} --retrivied from GetInstanceInfo()
Details222.EJCache.CacheEncountersByEncounterName = {}
Details222.EJCache.CacheEncountersBy_EncounterName = {}
Details222.EJCache.CacheEncountersBy_EncounterId = {}
Details222.EJCache.CacheEncountersBy_JournalEncounterId = {}
---cahe the uiMapID pointing to the instanceID
---this replace the need to call EJ_GetInstanceForMap to get the journalInstanceID
---@type table
local id_to_journalInstanceID = {}
Details222.EJCache.Id_To_JournalInstanceID = id_to_journalInstanceID
--if the expansion does not support the encounter journal, then return
if (not EncounterJournal_LoadUI) then
return
end
--if true then return end
local ejCacheSaved = Details.encounter_journal_cache
local data = {}
---returns the number of valid encounter journal tier indices
---@type number
local tierAmount = EJ_GetNumTiers() --return 11 for dragonisles
---returns the currently active encounter journal tier index
---could also be tierAmount - 1
---bacause the tier is "current season"
---@type number
local currentTierId = tierAmount --EJ_GetCurrentTier(), for some unknown reason, this function is returning 3 on retail
---maximum amount of dungeons in the expansion
---@type number
local maxAmountOfDungeons = 20
---the index of the first raid tier in the expansion, ignoring the first tier as it is open world bosses
---@type number
local raidTierStartIndex = 2
---max amount of bosses which a raid tier can have
---@type number
local maxRaidBosses = 20
---two iterations are required, one for dungeons and another for raids
---this table store two booleans that are passed to EJ_GetInstanceByIndex second argument, to indicate if we want to get dungeons or raids
local tGetDungeonsOrRaids = {false, true}
do --get raid instances data
for i = 1, #tGetDungeonsOrRaids do
local bIsRaid = tGetDungeonsOrRaids[i]
--select the tier, use current tier - 1 for raids, as the currentTier only shows the latest release raid
--use current tier for dungeons, as the current tier shows the dungeons used for the current season of Mythic+
local startIndex, endIndex
if (bIsRaid) then
if (detailsFramework.IsCataWow()) then
if currentTierId == 1 then break end --Cata has only one tier. Looking up tier 0 errors. ~CATA
end
EJ_SelectTier(currentTierId - 1) --print("tier selected:", currentTierId - 1, "raids") --debug
startIndex = raidTierStartIndex
endIndex = 20
else
EJ_SelectTier(currentTierId) --print("tier selected:", currentTierId, "dungeons", "currentTierId:", currentTierId) --debug
startIndex = 1
endIndex = maxAmountOfDungeons
end
for instanceIndex = endIndex, startIndex, -1 do
--instanceID: number - the unique ID of the instance, also returned by GetInstanceInfo() 8th return value
--journalInstanceID: number - the ID used by the Encounter Journal API
--dungeonUiMapID: number - the ID used by the world map API
--dungeonEncounterID: number - same ID passed by the ENCOUNTER_STAR and ENCOUNTER_END events
local journalInstanceID, instanceName, description, bgImage, buttonImage1, loreImage, buttonImage2, dungeonUiMapID, journalLink, shouldDisplayDifficulty, instanceID = EJ_GetInstanceByIndex(instanceIndex, bIsRaid)
if (journalInstanceID) then
id_to_journalInstanceID[dungeonUiMapID] = journalInstanceID
id_to_journalInstanceID[instanceName] = journalInstanceID
id_to_journalInstanceID[instanceID] = journalInstanceID
--select the raid instance, this allow to retrieve data about the encounters of the instance
EJ_SelectInstance(journalInstanceID)
--build a table with data of the raid instance
local instanceData = {
name = instanceName,
bgImage = bgImage,
mapId = dungeonUiMapID,
instanceId = instanceID,
journalInstanceId = journalInstanceID,
encountersArray = {},
encountersByName = {},
encountersByDungeonEncounterId = {},
encountersByJournalEncounterId = {},
icon = buttonImage1,
iconSize = {70, 36},
iconCoords = {0.01, .67, 0.025, .725},
iconLore = loreImage,
iconLoreSize = {70, 36},
iconLoreCoords = {0, 1, 0, 0.95},
iconTexture = buttonImage2,
iconTextureSize = {70, 36},
iconTextureCoords = {0, 1, 0, 0.95},
}
--cache the raidData, in different tables, using different keys
Details222.EJCache.CacheRaidData_ByInstanceId[journalInstanceID] = instanceData
Details222.EJCache.CacheRaidData_ByInstanceId[instanceID] = instanceData
Details222.EJCache.CacheRaidData_ByInstanceName[instanceName] = instanceData
Details222.EJCache.CacheRaidData_ByMapId[dungeonUiMapID] = instanceData
--get information about the bosses in the raid
for encounterIndex = 1, maxRaidBosses do
local encounterName, encounterDescription, journalEncounterID, rootSectionID, link, journalInstanceID, dungeonEncounterID, instanceID = EJ_GetEncounterInfoByIndex(encounterIndex, journalInstanceID)
if (encounterName) then
local encounterData = {
name = encounterName,
mapId = dungeonUiMapID,
instanceId = instanceID,
dungeonEncounterId = dungeonEncounterID,
journalEncounterId = journalEncounterID,
journalInstanceId = journalInstanceID,
}
local journalEncounterCreatureId, creatureName, creatureDescription, creatureDisplayID, iconImage, uiModelSceneID = EJ_GetCreatureInfo(1, journalEncounterID)
if (journalEncounterCreatureId) then
encounterData.creatureName = creatureName
encounterData.creatureIcon = iconImage
encounterData.creatureId = journalEncounterCreatureId
encounterData.creatureDisplayId = creatureDisplayID
encounterData.creatureUIModelSceneId = uiModelSceneID
end
instanceData.encountersArray[#instanceData.encountersArray+1] = encounterData
instanceData.encountersByName[encounterName] = encounterData
--print(instanceName, encounterName, journalEncounterID, journalInstanceID, dungeonEncounterID, instanceID)
instanceData.encountersByDungeonEncounterId[dungeonEncounterID] = encounterData
instanceData.encountersByJournalEncounterId[journalEncounterID] = encounterData
Details222.EJCache.CacheEncountersBy_EncounterName[encounterName] = encounterData
Details222.EJCache.CacheEncountersBy_EncounterId[dungeonEncounterID] = encounterData
Details222.EJCache.CacheEncountersBy_JournalEncounterId[journalEncounterID] = encounterData
id_to_journalInstanceID[encounterName] = journalInstanceID
id_to_journalInstanceID[dungeonEncounterID] = journalInstanceID
id_to_journalInstanceID[journalEncounterID] = journalInstanceID
end
end
end
end
end --end loop of raid or dungeon
end
end