annotate Export.lua @ 193:cb7eb9b9cc24 v94

Tweak to soulbind exporting.
author yellowfive
date Wed, 11 Nov 2020 23:58:22 -0800
parents 4aeedce4c995
children 23b740b4c93a
rev   line source
yellowfive@57 1 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot")
yellowfive@57 2 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true)
yellowfive@57 3 local AceGUI = LibStub("AceGUI-3.0")
yellowfive@57 4
yellowfive@57 5 local _lastExport = nil
yellowfive@57 6 local _txt = nil
yellowfive@57 7
yellowfive@57 8 local function createLabel(container, text, width)
yellowfive@57 9 local lbl = AceGUI:Create("AmrUiLabel")
yellowfive@124 10 container:AddChild(lbl)
yellowfive@57 11 lbl:SetWidth(width or 800)
yellowfive@57 12 lbl:SetText(text)
yellowfive@57 13 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text))
yellowfive@57 14 return lbl
yellowfive@57 15 end
yellowfive@57 16
yellowfive@57 17 local function onSplashClose()
yellowfive@57 18 Amr:HideCover()
yellowfive@57 19 Amr.db.char.FirstUse = false
yellowfive@57 20 end
yellowfive@57 21
yellowfive@69 22 local function onTextChanged(widget)
yellowfive@69 23 local val = _txt:GetText()
yellowfive@69 24 if val == "overwolf-bib" then
yellowfive@69 25 -- go to the gear tab, open import window, and show a cover
yellowfive@69 26 Amr:ShowTab("Gear")
yellowfive@69 27 Amr:ShowImportWindow(true)
yellowfive@69 28 end
yellowfive@69 29 end
yellowfive@69 30
yellowfive@57 31 -- render a splash screen with first-time help
yellowfive@57 32 local function renderSplash(container)
yellowfive@57 33 local panel = Amr:RenderCoverChrome(container, 700, 450)
yellowfive@57 34
yellowfive@57 35 local lbl = createLabel(panel, L.ExportSplashTitle, 650)
yellowfive@57 36 lbl:SetJustifyH("CENTER")
yellowfive@57 37 lbl:SetFont(Amr.CreateFont("Bold", 24, Amr.Colors.TextHeaderActive))
yellowfive@57 38 lbl:SetPoint("TOP", panel.content, "TOP", 0, -10)
yellowfive@57 39
yellowfive@57 40 local lbl2 = createLabel(panel, L.ExportSplashSubtitle, 650)
yellowfive@57 41 lbl2:SetJustifyH("CENTER")
yellowfive@57 42 lbl2:SetFont(Amr.CreateFont("Bold", 18, Amr.Colors.TextTan))
yellowfive@57 43 lbl2:SetPoint("TOP", lbl.frame, "BOTTOM", 0, -20)
yellowfive@57 44
yellowfive@57 45 lbl = createLabel(panel, L.ExportSplash1, 650)
yellowfive@57 46 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text))
yellowfive@57 47 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -70)
yellowfive@57 48
yellowfive@57 49 lbl2 = createLabel(panel, L.ExportSplash2, 650)
yellowfive@57 50 lbl2:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text))
yellowfive@57 51 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -15)
yellowfive@57 52
yellowfive@57 53 local btn = AceGUI:Create("AmrUiButton")
yellowfive@57 54 btn:SetText(L.ExportSplashClose)
yellowfive@57 55 btn:SetBackgroundColor(Amr.Colors.Green)
yellowfive@57 56 btn:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White))
yellowfive@57 57 btn:SetWidth(120)
yellowfive@57 58 btn:SetHeight(28)
yellowfive@57 59 btn:SetCallback("OnClick", onSplashClose)
yellowfive@57 60 panel:AddChild(btn)
yellowfive@124 61 btn:SetPoint("BOTTOM", panel.content, "BOTTOM", 0, 20)
yellowfive@57 62 end
yellowfive@57 63
yellowfive@57 64 -- renders the main UI for the Export tab
yellowfive@57 65 function Amr:RenderTabExport(container)
yellowfive@57 66
yellowfive@57 67 local lbl = createLabel(container, L.ExportTitle)
yellowfive@57 68 lbl:SetFont(Amr.CreateFont("Bold", 24, Amr.Colors.TextHeaderActive))
yellowfive@57 69 lbl:SetPoint("TOPLEFT", container.content, "TOPLEFT", 0, -40)
yellowfive@57 70
yellowfive@57 71 local lbl2 = createLabel(container, L.ExportHelp1)
yellowfive@57 72 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10)
yellowfive@57 73
yellowfive@57 74 lbl = createLabel(container, L.ExportHelp2)
yellowfive@57 75 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -10)
yellowfive@57 76
yellowfive@57 77 lbl2 = createLabel(container, L.ExportHelp3)
yellowfive@57 78 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10)
yellowfive@57 79
yellowfive@57 80 _txt = AceGUI:Create("AmrUiTextarea")
yellowfive@57 81 _txt:SetWidth(800)
yellowfive@57 82 _txt:SetHeight(300)
yellowfive@57 83 _txt:SetFont(Amr.CreateFont("Regular", 12, Amr.Colors.Text))
yellowfive@69 84 _txt:SetCallback("OnTextChanged", onTextChanged)
yellowfive@57 85 container:AddChild(_txt)
yellowfive@124 86 _txt:SetPoint("TOP", lbl2.frame, "BOTTOM", 0, -20)
yellowfive@57 87
yellowfive@57 88 local data = self:ExportCharacter()
yellowfive@57 89 local txt = Amr.Serializer:SerializePlayerData(data, true)
yellowfive@57 90 _txt:SetText(txt)
yellowfive@57 91 _txt:SetFocus(true)
yellowfive@57 92
yellowfive@57 93 -- update shopping list data
yellowfive@57 94 Amr:UpdateShoppingData(data)
yellowfive@57 95
yellowfive@57 96 -- show help splash if first time a user is using this
yellowfive@57 97 if Amr.db.char.FirstUse then
yellowfive@57 98 Amr:ShowCover(renderSplash)
yellowfive@57 99 AceGUI:ClearFocus()
yellowfive@57 100 end
yellowfive@57 101 end
yellowfive@57 102
yellowfive@57 103 function Amr:ReleaseTabExport()
yellowfive@57 104 end
yellowfive@57 105
yellowfive@57 106 function Amr:GetExportText()
yellowfive@57 107 return _txt:GetText()
yellowfive@57 108 end
yellowfive@57 109
yellowfive@57 110
yellowfive@57 111 -- use some local variables to deal with the fact that a user can close the bank before a scan completes
yellowfive@57 112 local _lastBankBagId = nil
yellowfive@57 113 local _lastBankSlotId = nil
yellowfive@124 114 local _bankOpen = false
yellowfive@57 115
yellowfive@57 116 local function scanBag(bagId, isBank, bagTable, bagItemsWithCount)
yellowfive@57 117 local numSlots = GetContainerNumSlots(bagId)
yellowfive@191 118 --local loc = ItemLocation.CreateEmpty()
yellowfive@191 119 local item
yellowfive@57 120 for slotId = 1, numSlots do
yellowfive@57 121 local _, itemCount, _, _, _, _, itemLink = GetContainerItemInfo(bagId, slotId)
yellowfive@57 122 if itemLink ~= nil then
yellowfive@57 123 local itemData = Amr.Serializer.ParseItemLink(itemLink)
yellowfive@57 124 if itemData ~= nil then
yellowfive@191 125 item = Item:CreateFromBagAndSlot(bagId, slotId)
yellowfive@191 126
yellowfive@191 127 -- seems to be of the form Item-1147-0-4000000XXXXXXXXX, so we take just the last 9 digits
yellowfive@191 128 itemData.guid = item:GetItemGUID()
yellowfive@191 129 if itemData.guid and strlen(itemData.guid) > 9 then
yellowfive@191 130 itemData.guid = strsub(itemData.guid, -9)
yellowfive@191 131 end
yellowfive@124 132
yellowfive@124 133 -- see if this is an azerite item and read azerite power ids
yellowfive@185 134 --[[loc:SetBagAndSlot(bagId, slotId)
yellowfive@124 135 if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then
yellowfive@124 136 local powers = Amr.ReadAzeritePowers(loc)
yellowfive@124 137 if powers then
yellowfive@124 138 itemData.azerite = powers
yellowfive@124 139 end
yellowfive@185 140 end]]
yellowfive@124 141
yellowfive@124 142 if isBank then
yellowfive@124 143 _lastBankBagId = bagId
yellowfive@124 144 _lastBankSlotId = slotId
yellowfive@124 145 end
yellowfive@57 146
yellowfive@124 147 table.insert(bagTable, itemData)
yellowfive@57 148
yellowfive@57 149 -- all items and counts, used for e.g. shopping list and reagents, etc.
yellowfive@57 150 if bagItemsWithCount then
yellowfive@57 151 if bagItemsWithCount[itemData.id] then
yellowfive@57 152 bagItemsWithCount[itemData.id] = bagItemsWithCount[itemData.id] + itemCount
yellowfive@57 153 else
yellowfive@57 154 bagItemsWithCount[itemData.id] = itemCount
yellowfive@57 155 end
yellowfive@57 156 end
yellowfive@57 157 end
yellowfive@57 158 end
yellowfive@57 159 end
yellowfive@57 160 end
yellowfive@57 161
yellowfive@124 162 -- cache the currently equipped gear for this spec
yellowfive@124 163 local function cacheEquipped()
yellowfive@124 164 local data = Amr.Serializer:GetEquipped()
yellowfive@57 165
yellowfive@124 166 local spec = GetSpecialization()
yellowfive@57 167 Amr.db.char.Equipped[spec] = data.Equipped[spec]
yellowfive@57 168 end
yellowfive@57 169
yellowfive@57 170 local function scanBags()
yellowfive@57 171
yellowfive@57 172 local bagItems = {}
yellowfive@57 173 local itemsAndCounts = {}
yellowfive@57 174
yellowfive@57 175 scanBag(BACKPACK_CONTAINER, false, bagItems, itemsAndCounts) -- backpack
yellowfive@57 176 for bagId = 1, NUM_BAG_SLOTS do
yellowfive@57 177 scanBag(bagId, false, bagItems, itemsAndCounts)
yellowfive@57 178 end
yellowfive@57 179
yellowfive@57 180 Amr.db.char.BagItems = bagItems
yellowfive@57 181 Amr.db.char.BagItemsAndCounts = itemsAndCounts
yellowfive@57 182 end
yellowfive@57 183
yellowfive@57 184 -- scan the player's bank and save the contents, must be at the bank
yellowfive@57 185 local function scanBank()
yellowfive@57 186
yellowfive@57 187 local bankItems = {}
yellowfive@57 188 local itemsAndCounts = {}
yellowfive@127 189
yellowfive@127 190 local bagList = {}
yellowfive@127 191 table.insert(bagList, BANK_CONTAINER)
yellowfive@127 192 table.insert(bagList, REAGENTBANK_CONTAINER)
yellowfive@127 193 for bagId = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do
yellowfive@127 194 table.insert(bagList, bagId)
yellowfive@127 195 end
yellowfive@57 196
yellowfive@127 197 for i,bagId in ipairs(bagList) do
yellowfive@124 198 local bagItems = {}
yellowfive@124 199 local bagItemsAndCounts = {}
yellowfive@124 200 scanBag(bagId, true, bagItems, bagItemsAndCounts)
yellowfive@124 201
yellowfive@124 202 bankItems[bagId] = bagItems
yellowfive@124 203 itemsAndCounts[bagId] = bagItemsAndCounts
yellowfive@57 204 end
yellowfive@57 205
yellowfive@57 206 -- see if the scan completed before the window closed, otherwise we don't overwrite with partial data
yellowfive@124 207 if _bankOpen and _lastBankBagId then
yellowfive@57 208 local itemLink = GetContainerItemLink(_lastBankBagId, _lastBankSlotId)
yellowfive@124 209 if itemLink then --still open
yellowfive@57 210 Amr.db.char.BankItems = bankItems
yellowfive@57 211 Amr.db.char.BankItemsAndCounts = itemsAndCounts
yellowfive@57 212 end
yellowfive@57 213 end
yellowfive@57 214 end
yellowfive@57 215
yellowfive@124 216 local function onBankOpened()
yellowfive@124 217 _bankOpen = true
yellowfive@124 218 scanBank()
yellowfive@124 219 end
yellowfive@124 220
yellowfive@124 221 local function onBankClosed()
yellowfive@124 222 _bankOpen = false
yellowfive@124 223 end
yellowfive@124 224
yellowfive@124 225 -- if a bank bag is updated while the bank is open, re-scan that bag
yellowfive@124 226 local function onBankUpdated(bagID)
yellowfive@124 227 if _bankOpen and (bagID == BANK_CONTAINER or bagID == REAGENTBANK_CONTAINER or (bagID >= NUM_BAG_SLOTS + 1 and bagID <= NUM_BAG_SLOTS + NUM_BANKBAGSLOTS)) then
yellowfive@124 228 local bagItems = {}
yellowfive@124 229 local bagItemsAndCounts = {}
yellowfive@124 230 scanBag(bagID, true, bagItems, bagItemsAndCounts)
yellowfive@124 231
yellowfive@124 232 -- see if the scan completed before the window closed, otherwise we don't overwrite with partial data
yellowfive@124 233 if _bankOpen and _lastBankBagId == bagID then
yellowfive@124 234 local itemLink = GetContainerItemLink(_lastBankBagId, _lastBankSlotId)
yellowfive@124 235 if itemLink then
yellowfive@124 236 Amr.db.char.BankItems[bagID] = bagItems
yellowfive@124 237 Amr.db.char.BankItemsAndCounts[bagID] = bagItemsAndCounts
yellowfive@124 238 end
yellowfive@124 239 end
yellowfive@124 240 end
yellowfive@124 241 end
yellowfive@124 242
yellowfive@124 243 --[[
yellowfive@57 244 -- scan the player's void storage and save the contents, must be at void storage
yellowfive@57 245 local function scanVoid()
yellowfive@57 246
yellowfive@57 247 if IsVoidStorageReady() then
yellowfive@57 248 local voidItems = {}
yellowfive@57 249 local VOID_STORAGE_MAX = 80
yellowfive@57 250 local VOID_STORAGE_PAGES = 2
yellowfive@57 251
yellowfive@57 252 for page = 1,VOID_STORAGE_PAGES do
yellowfive@57 253 for i = 1,VOID_STORAGE_MAX do
yellowfive@57 254 local itemId = GetVoidItemInfo(page, i)
yellowfive@57 255 if itemId then
yellowfive@57 256 local itemLink = GetVoidItemHyperlinkString(((page - 1) * VOID_STORAGE_MAX) + i);
yellowfive@57 257 if itemLink then
yellowfive@57 258 tinsert(voidItems, itemLink)
yellowfive@57 259 end
yellowfive@57 260 end
yellowfive@57 261 end
yellowfive@57 262 end
yellowfive@57 263
yellowfive@57 264 Amr.db.char.VoidItems = voidItems
yellowfive@57 265 end
yellowfive@57 266
yellowfive@57 267 end
yellowfive@124 268 ]]
yellowfive@57 269
yellowfive@185 270 local function scanSoulbinds()
yellowfive@185 271 if not C_Soulbinds then return end
yellowfive@185 272
yellowfive@185 273 -- read which conduits this player has unlocked
yellowfive@185 274 Amr.db.char.UnlockedConduits = {}
yellowfive@185 275
yellowfive@185 276 for t = 0,2 do
yellowfive@185 277 local conduits = C_Soulbinds.GetConduitCollection(t)
yellowfive@185 278 for i, conduit in ipairs(conduits) do
yellowfive@185 279 table.insert(Amr.db.char.UnlockedConduits, { conduit.conduitID, conduit.conduitRank })
yellowfive@185 280 end
yellowfive@185 281 end
yellowfive@185 282
yellowfive@185 283 if not Amr.db.char.ActiveSoulbinds then
yellowfive@185 284 Amr.db.char.ActiveSoulbinds = {}
yellowfive@185 285 end
yellowfive@185 286
yellowfive@185 287 -- read the currently active soulbind for this spec
yellowfive@185 288 local specPos = GetSpecialization()
yellowfive@185 289 if specPos and specPos >= 1 and specPos <= 4 then
yellowfive@185 290 Amr.db.char.ActiveSoulbinds[specPos] = C_Soulbinds.GetActiveSoulbindID() or 0
yellowfive@185 291 end
yellowfive@185 292
yellowfive@185 293 -- update soulbind tree info for all soulbinds
yellowfive@185 294 Amr.db.char.Soulbinds = {}
yellowfive@185 295
yellowfive@185 296 local covenantData = C_Covenants.GetCovenantData(C_Covenants.GetActiveCovenantID())
yellowfive@185 297
yellowfive@185 298 if covenantData and covenantData.soulbindIDs then
yellowfive@185 299 for i, soulbindId in ipairs(covenantData.soulbindIDs) do
yellowfive@185 300 local soulbindData = soulbindId and C_Soulbinds.GetSoulbindData(soulbindId)
yellowfive@185 301 local nodes = {}
yellowfive@193 302 local unlockedTier = -1
yellowfive@185 303
yellowfive@185 304 if soulbindData and soulbindData.tree and soulbindData.tree.nodes then
yellowfive@185 305 for i, node in ipairs(soulbindData.tree.nodes) do
yellowfive@185 306 if node.state == 3 then
yellowfive@185 307 nodes[node.row] = { soulbindId, node.row, node.column, node.conduitID, node.conduitRank }
yellowfive@185 308 end
yellowfive@185 309 if node.state > 0 then
yellowfive@185 310 unlockedTier = math.max(node.row, unlockedTier)
yellowfive@185 311 end
yellowfive@185 312 end
yellowfive@185 313 end
yellowfive@185 314
yellowfive@185 315 Amr.db.char.Soulbinds[soulbindId] = {
yellowfive@185 316 UnlockedTier = unlockedTier,
yellowfive@185 317 Nodes = nodes
yellowfive@185 318 }
yellowfive@185 319
yellowfive@185 320 end
yellowfive@185 321 end
yellowfive@185 322
yellowfive@185 323 end
yellowfive@185 324
yellowfive@185 325 --[[
yellowfive@165 326 local function scanEssences()
yellowfive@165 327 if not C_AzeriteEssence then return end
yellowfive@165 328
yellowfive@165 329 -- read which essences this player has unlocked
yellowfive@165 330 Amr.db.char.UnlockedEssences = {}
yellowfive@165 331
yellowfive@165 332 local essences = C_AzeriteEssence.GetEssences()
yellowfive@165 333 if essences then
yellowfive@165 334 for i, essence in ipairs(essences) do
yellowfive@165 335 if essence.unlocked then
yellowfive@165 336 table.insert(Amr.db.char.UnlockedEssences, { essence.ID, essence.rank })
yellowfive@165 337 end
yellowfive@165 338 end
yellowfive@165 339 end
yellowfive@165 340
yellowfive@165 341 local specPos = GetSpecialization()
yellowfive@165 342 if not specPos or specPos < 1 or specPos > 4 then return end
yellowfive@165 343
yellowfive@165 344 if not Amr.db.char.Essences then
yellowfive@165 345 Amr.db.char.Essences = {}
yellowfive@165 346 end
yellowfive@165 347
yellowfive@165 348 Amr.db.char.Essences[specPos] = {}
yellowfive@165 349 local active = Amr.db.char.Essences[specPos]
yellowfive@165 350
yellowfive@165 351 local milestones = C_AzeriteEssence.GetMilestones()
yellowfive@165 352 if milestones then
yellowfive@165 353 for i, milestone in ipairs(milestones) do
yellowfive@165 354 -- if no slot, it corresponds to the stamina nodes, skip those
yellowfive@165 355 if milestone.slot ~= nil then
yellowfive@165 356 if milestone.unlocked then
yellowfive@165 357 local essenceId = C_AzeriteEssence.GetMilestoneEssence(milestone.ID)
yellowfive@165 358 if essenceId then
yellowfive@165 359 local essence = C_AzeriteEssence.GetEssenceInfo(essenceId)
yellowfive@165 360 table.insert(active, { milestone.slot, essence.ID, essence.rank })
yellowfive@165 361 end
yellowfive@165 362 end
yellowfive@165 363 end
yellowfive@165 364 end
yellowfive@165 365 end
yellowfive@165 366 end
yellowfive@185 367 ]]
yellowfive@165 368
yellowfive@81 369 local function scanTalents()
yellowfive@81 370 local specPos = GetSpecialization()
yellowfive@81 371 if not specPos or specPos < 1 or specPos > 4 then return end
yellowfive@81 372
yellowfive@81 373 local talentInfo = {}
yellowfive@81 374 local maxTiers = 7
yellowfive@81 375 for tier = 1, maxTiers do
yellowfive@81 376 for col = 1, 3 do
yellowfive@81 377 local id, name, _, _, _, spellId, _, t, c, selected = GetTalentInfoBySpecialization(specPos, tier, col)
yellowfive@81 378 if selected then
yellowfive@81 379 talentInfo[tier] = col
yellowfive@81 380 end
yellowfive@81 381 end
yellowfive@81 382 end
yellowfive@81 383
yellowfive@81 384 local str = ""
yellowfive@81 385 for i = 1, maxTiers do
yellowfive@81 386 if talentInfo[i] then
yellowfive@81 387 str = str .. talentInfo[i]
yellowfive@81 388 else
yellowfive@81 389 str = str .. '0'
yellowfive@81 390 end
yellowfive@81 391 end
yellowfive@81 392
yellowfive@81 393 Amr.db.char.Talents[specPos] = str
yellowfive@81 394 end
yellowfive@81 395
yellowfive@57 396 -- Returns a data object containing all information about the current player needed for an export:
yellowfive@57 397 -- gear, spec, reputations, bag, bank, and void storage items.
yellowfive@57 398 function Amr:ExportCharacter()
yellowfive@57 399
yellowfive@124 400 -- get all necessary player data
yellowfive@124 401 local data = Amr.Serializer:GetPlayerData()
yellowfive@124 402
yellowfive@124 403 -- cache latest-seen equipped gear for current spec
yellowfive@124 404 local spec = GetSpecialization()
yellowfive@124 405 Amr.db.char.Equipped[spec] = data.Equipped[spec]
yellowfive@124 406
yellowfive@124 407 -- scan current inventory just before export so that it is always fresh
yellowfive@57 408 scanBags()
yellowfive@57 409
yellowfive@81 410 -- scan current spec's talents just before exporting
yellowfive@81 411 scanTalents()
yellowfive@165 412
yellowfive@185 413 -- scan all soulbinds just before exporting
yellowfive@185 414 scanSoulbinds()
yellowfive@185 415
yellowfive@165 416 -- scan current spec's essences just before exporting
yellowfive@185 417 --scanEssences()
yellowfive@81 418
yellowfive@124 419 data.Talents = Amr.db.char.Talents
yellowfive@185 420 data.UnlockedConduits = Amr.db.char.UnlockedConduits
yellowfive@185 421 data.ActiveSoulbinds = Amr.db.char.ActiveSoulbinds
yellowfive@185 422 data.Soulbinds = Amr.db.char.Soulbinds
yellowfive@185 423 --data.UnlockedEssences = Amr.db.char.UnlockedEssences
yellowfive@185 424 --data.Essences = Amr.db.char.Essences
yellowfive@124 425 data.Equipped = Amr.db.char.Equipped
yellowfive@57 426 data.BagItems = Amr.db.char.BagItems
yellowfive@124 427
yellowfive@124 428 -- flatten bank data (which is stored by bag for more efficient updating)
yellowfive@124 429 data.BankItems = {}
yellowfive@124 430 for k,v in pairs(Amr.db.char.BankItems) do
yellowfive@124 431 for i,v2 in ipairs(v) do
yellowfive@124 432 table.insert(data.BankItems, v2)
yellowfive@124 433 end
yellowfive@124 434 end
yellowfive@124 435
yellowfive@124 436 --data.VoidItems = Amr.db.char.VoidItems
yellowfive@57 437
yellowfive@57 438 return data
yellowfive@57 439 end
yellowfive@57 440
yellowfive@57 441 function Amr:InitializeExport()
yellowfive@57 442 Amr:AddEventHandler("UNIT_INVENTORY_CHANGED", function(unitID)
yellowfive@57 443 if unitID and unitID ~= "player" then return end
yellowfive@124 444 cacheEquipped()
yellowfive@57 445 end)
yellowfive@57 446 end
yellowfive@57 447
yellowfive@124 448 Amr:AddEventHandler("BANKFRAME_OPENED", onBankOpened)
yellowfive@124 449 Amr:AddEventHandler("BANKFRAME_CLOSED", onBankClosed)
yellowfive@124 450 Amr:AddEventHandler("BAG_UPDATE", onBankUpdated)
yellowfive@57 451
yellowfive@124 452 --Amr:AddEventHandler("VOID_STORAGE_OPEN", scanVoid)
yellowfive@124 453 --Amr:AddEventHandler("VOID_STORAGE_CONTENTS_UPDATE", scanVoid)
yellowfive@124 454 --Amr:AddEventHandler("VOID_STORAGE_DEPOSIT_UPDATE", scanVoid)
yellowfive@124 455 --Amr:AddEventHandler("VOID_STORAGE_UPDATE", scanVoid)
yellowfive@81 456
yellowfive@81 457 Amr:AddEventHandler("PLAYER_TALENT_UPDATE", scanTalents)
yellowfive@165 458
yellowfive@185 459 --if C_AzeriteEssence then
yellowfive@185 460 -- Amr:AddEventHandler("AZERITE_ESSENCE_UPDATE", scanEssences)
yellowfive@185 461 --end
yellowfive@185 462
yellowfive@185 463 if C_Soulbinds then
yellowfive@185 464 Amr:AddEventHandler("SOULBIND_ACTIVATED", scanSoulbinds)
yellowfive@165 465 end