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@57
|
10 lbl:SetWidth(width or 800)
|
yellowfive@57
|
11 lbl:SetText(text)
|
yellowfive@57
|
12 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text))
|
yellowfive@57
|
13 container:AddChild(lbl)
|
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 lbl = createLabel(panel, L.ExportSplash3, 650)
|
yellowfive@57
|
54 lbl:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text))
|
yellowfive@57
|
55 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -15)
|
yellowfive@81
|
56
|
yellowfive@81
|
57 lbl2 = createLabel(panel, L.ExportSplash4, 650)
|
yellowfive@81
|
58 lbl2:SetFont(Amr.CreateFont("Regular", 14, Amr.Colors.Text))
|
yellowfive@81
|
59 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -15)
|
yellowfive@57
|
60
|
yellowfive@57
|
61 local btn = AceGUI:Create("AmrUiButton")
|
yellowfive@57
|
62 btn:SetText(L.ExportSplashClose)
|
yellowfive@57
|
63 btn:SetBackgroundColor(Amr.Colors.Green)
|
yellowfive@57
|
64 btn:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White))
|
yellowfive@57
|
65 btn:SetWidth(120)
|
yellowfive@57
|
66 btn:SetHeight(28)
|
yellowfive@57
|
67 btn:SetPoint("BOTTOM", panel.content, "BOTTOM", 0, 20)
|
yellowfive@57
|
68 btn:SetCallback("OnClick", onSplashClose)
|
yellowfive@57
|
69 panel:AddChild(btn)
|
yellowfive@57
|
70 end
|
yellowfive@57
|
71
|
yellowfive@57
|
72 -- renders the main UI for the Export tab
|
yellowfive@57
|
73 function Amr:RenderTabExport(container)
|
yellowfive@57
|
74
|
yellowfive@57
|
75 local lbl = createLabel(container, L.ExportTitle)
|
yellowfive@57
|
76 lbl:SetFont(Amr.CreateFont("Bold", 24, Amr.Colors.TextHeaderActive))
|
yellowfive@57
|
77 lbl:SetPoint("TOPLEFT", container.content, "TOPLEFT", 0, -40)
|
yellowfive@57
|
78
|
yellowfive@57
|
79 local lbl2 = createLabel(container, L.ExportHelp1)
|
yellowfive@57
|
80 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10)
|
yellowfive@57
|
81
|
yellowfive@57
|
82 lbl = createLabel(container, L.ExportHelp2)
|
yellowfive@57
|
83 lbl:SetPoint("TOPLEFT", lbl2.frame, "BOTTOMLEFT", 0, -10)
|
yellowfive@57
|
84
|
yellowfive@57
|
85 lbl2 = createLabel(container, L.ExportHelp3)
|
yellowfive@57
|
86 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10)
|
yellowfive@57
|
87
|
yellowfive@57
|
88 _txt = AceGUI:Create("AmrUiTextarea")
|
yellowfive@57
|
89 _txt:SetWidth(800)
|
yellowfive@57
|
90 _txt:SetHeight(300)
|
yellowfive@81
|
91 _txt:SetPoint("TOP", lbl2.frame, "BOTTOM", 0, -20)
|
yellowfive@57
|
92 _txt:SetFont(Amr.CreateFont("Regular", 12, Amr.Colors.Text))
|
yellowfive@69
|
93 _txt:SetCallback("OnTextChanged", onTextChanged)
|
yellowfive@57
|
94 container:AddChild(_txt)
|
yellowfive@57
|
95
|
yellowfive@57
|
96 local data = self:ExportCharacter()
|
yellowfive@57
|
97 local txt = Amr.Serializer:SerializePlayerData(data, true)
|
yellowfive@57
|
98 _txt:SetText(txt)
|
yellowfive@57
|
99 _txt:SetFocus(true)
|
yellowfive@57
|
100
|
yellowfive@57
|
101 -- update shopping list data
|
yellowfive@57
|
102 Amr:UpdateShoppingData(data)
|
yellowfive@57
|
103
|
yellowfive@57
|
104 -- show help splash if first time a user is using this
|
yellowfive@57
|
105 if Amr.db.char.FirstUse then
|
yellowfive@57
|
106 Amr:ShowCover(renderSplash)
|
yellowfive@57
|
107 AceGUI:ClearFocus()
|
yellowfive@57
|
108 end
|
yellowfive@57
|
109 end
|
yellowfive@57
|
110
|
yellowfive@57
|
111 function Amr:ReleaseTabExport()
|
yellowfive@57
|
112 end
|
yellowfive@57
|
113
|
yellowfive@57
|
114 function Amr:GetExportText()
|
yellowfive@57
|
115 return _txt:GetText()
|
yellowfive@57
|
116 end
|
yellowfive@57
|
117
|
yellowfive@57
|
118
|
yellowfive@57
|
119 -- use some local variables to deal with the fact that a user can close the bank before a scan completes
|
yellowfive@57
|
120 local _lastBankBagId = nil
|
yellowfive@57
|
121 local _lastBankSlotId = nil
|
yellowfive@57
|
122
|
yellowfive@57
|
123 local function scanBag(bagId, isBank, bagTable, bagItemsWithCount)
|
yellowfive@57
|
124 local numSlots = GetContainerNumSlots(bagId)
|
yellowfive@57
|
125 for slotId = 1, numSlots do
|
yellowfive@57
|
126 local _, itemCount, _, _, _, _, itemLink = GetContainerItemInfo(bagId, slotId)
|
yellowfive@57
|
127 if itemLink ~= nil then
|
yellowfive@57
|
128 local itemData = Amr.Serializer.ParseItemLink(itemLink)
|
yellowfive@57
|
129 if itemData ~= nil then
|
yellowfive@85
|
130
|
yellowfive@57
|
131 -- only add equippable items to bag data
|
yellowfive@85
|
132 --if IsEquippableItem(itemLink) or Amr.SetTokenIds[itemData.id] then
|
yellowfive@57
|
133 if isBank then
|
yellowfive@57
|
134 _lastBankBagId = bagId
|
yellowfive@57
|
135 _lastBankSlotId = slotId
|
yellowfive@57
|
136 end
|
yellowfive@57
|
137
|
yellowfive@57
|
138 table.insert(bagTable, itemLink)
|
yellowfive@85
|
139 --end
|
yellowfive@57
|
140
|
yellowfive@57
|
141 -- all items and counts, used for e.g. shopping list and reagents, etc.
|
yellowfive@57
|
142 if bagItemsWithCount then
|
yellowfive@57
|
143 if bagItemsWithCount[itemData.id] then
|
yellowfive@57
|
144 bagItemsWithCount[itemData.id] = bagItemsWithCount[itemData.id] + itemCount
|
yellowfive@57
|
145 else
|
yellowfive@57
|
146 bagItemsWithCount[itemData.id] = itemCount
|
yellowfive@57
|
147 end
|
yellowfive@57
|
148 end
|
yellowfive@57
|
149 end
|
yellowfive@57
|
150 end
|
yellowfive@57
|
151 end
|
yellowfive@57
|
152 end
|
yellowfive@57
|
153
|
yellowfive@57
|
154 -- get the player's current gear and save it, also returns the data from GetPlayerData for efficiency
|
yellowfive@57
|
155 local function getEquipped()
|
yellowfive@81
|
156 local data = Amr.Serializer:GetPlayerData()
|
yellowfive@81
|
157 local spec = GetSpecialization()
|
yellowfive@57
|
158
|
yellowfive@57
|
159 Amr.db.char.Equipped[spec] = data.Equipped[spec]
|
yellowfive@57
|
160
|
yellowfive@57
|
161 return data
|
yellowfive@57
|
162 end
|
yellowfive@57
|
163
|
yellowfive@57
|
164 local function scanBags()
|
yellowfive@57
|
165
|
yellowfive@57
|
166 local bagItems = {}
|
yellowfive@57
|
167 local itemsAndCounts = {}
|
yellowfive@57
|
168
|
yellowfive@57
|
169 scanBag(BACKPACK_CONTAINER, false, bagItems, itemsAndCounts) -- backpack
|
yellowfive@57
|
170 for bagId = 1, NUM_BAG_SLOTS do
|
yellowfive@57
|
171 scanBag(bagId, false, bagItems, itemsAndCounts)
|
yellowfive@57
|
172 end
|
yellowfive@57
|
173
|
yellowfive@57
|
174 Amr.db.char.BagItems = bagItems
|
yellowfive@57
|
175 Amr.db.char.BagItemsAndCounts = itemsAndCounts
|
yellowfive@57
|
176 end
|
yellowfive@57
|
177
|
yellowfive@57
|
178 -- scan the player's bank and save the contents, must be at the bank
|
yellowfive@57
|
179 local function scanBank()
|
yellowfive@57
|
180
|
yellowfive@57
|
181 local bankItems = {}
|
yellowfive@57
|
182 local itemsAndCounts = {}
|
yellowfive@57
|
183
|
yellowfive@57
|
184 scanBag(BANK_CONTAINER, true, bankItems, itemsAndCounts)
|
yellowfive@57
|
185 scanBag(REAGENTBANK_CONTAINER, true, bankItems, itemsAndCounts)
|
yellowfive@57
|
186 for bagId = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do
|
yellowfive@57
|
187 scanBag(bagId, true, bankItems, itemsAndCounts)
|
yellowfive@57
|
188 end
|
yellowfive@57
|
189
|
yellowfive@57
|
190 -- see if the scan completed before the window closed, otherwise we don't overwrite with partial data
|
yellowfive@57
|
191 if _lastBankBagId ~= nil then
|
yellowfive@57
|
192 local itemLink = GetContainerItemLink(_lastBankBagId, _lastBankSlotId)
|
yellowfive@57
|
193 if itemLink ~= nil then --still open
|
yellowfive@57
|
194 Amr.db.char.BankItems = bankItems
|
yellowfive@57
|
195 Amr.db.char.BankItemsAndCounts = itemsAndCounts
|
yellowfive@57
|
196 end
|
yellowfive@57
|
197 end
|
yellowfive@57
|
198
|
yellowfive@57
|
199 end
|
yellowfive@57
|
200
|
yellowfive@57
|
201 -- scan the player's void storage and save the contents, must be at void storage
|
yellowfive@57
|
202 local function scanVoid()
|
yellowfive@57
|
203
|
yellowfive@57
|
204 if IsVoidStorageReady() then
|
yellowfive@57
|
205 local voidItems = {}
|
yellowfive@57
|
206 local VOID_STORAGE_MAX = 80
|
yellowfive@57
|
207 local VOID_STORAGE_PAGES = 2
|
yellowfive@57
|
208
|
yellowfive@57
|
209 for page = 1,VOID_STORAGE_PAGES do
|
yellowfive@57
|
210 for i = 1,VOID_STORAGE_MAX do
|
yellowfive@57
|
211 local itemId = GetVoidItemInfo(page, i)
|
yellowfive@57
|
212 if itemId then
|
yellowfive@57
|
213 local itemLink = GetVoidItemHyperlinkString(((page - 1) * VOID_STORAGE_MAX) + i);
|
yellowfive@57
|
214 if itemLink then
|
yellowfive@57
|
215 tinsert(voidItems, itemLink)
|
yellowfive@57
|
216 end
|
yellowfive@57
|
217 end
|
yellowfive@57
|
218 end
|
yellowfive@57
|
219 end
|
yellowfive@57
|
220
|
yellowfive@57
|
221 Amr.db.char.VoidItems = voidItems
|
yellowfive@57
|
222 end
|
yellowfive@57
|
223
|
yellowfive@57
|
224 end
|
yellowfive@57
|
225
|
yellowfive@57
|
226 local function getRepStanding(factionId)
|
yellowfive@57
|
227 local name, description, standingId, _ = GetFactionInfoByID(factionId)
|
yellowfive@57
|
228 return standingId - 1; -- our rep enum correspond to what the armory returns, are 1 less than what the game returns
|
yellowfive@57
|
229 end
|
yellowfive@57
|
230
|
yellowfive@57
|
231 local function getReputations()
|
yellowfive@57
|
232 local reps = {}
|
yellowfive@57
|
233
|
yellowfive@57
|
234 local repList = {1375,1376,1270,1269,1341,1337,1387,1388,1435}
|
yellowfive@57
|
235 for i, repId in pairs(repList) do
|
yellowfive@57
|
236 local standing = getRepStanding(repId)
|
yellowfive@57
|
237 if standing >= 0 then
|
yellowfive@57
|
238 reps[repId] = standing
|
yellowfive@57
|
239 end
|
yellowfive@57
|
240 end
|
yellowfive@57
|
241
|
yellowfive@57
|
242 return reps
|
yellowfive@57
|
243 end
|
yellowfive@57
|
244
|
yellowfive@81
|
245 local function scanTalents()
|
yellowfive@81
|
246 local specPos = GetSpecialization()
|
yellowfive@81
|
247 if not specPos or specPos < 1 or specPos > 4 then return end
|
yellowfive@81
|
248
|
yellowfive@81
|
249 local talentInfo = {}
|
yellowfive@81
|
250 local maxTiers = 7
|
yellowfive@81
|
251 for tier = 1, maxTiers do
|
yellowfive@81
|
252 for col = 1, 3 do
|
yellowfive@81
|
253 local id, name, _, _, _, spellId, _, t, c, selected = GetTalentInfoBySpecialization(specPos, tier, col)
|
yellowfive@81
|
254 if selected then
|
yellowfive@81
|
255 talentInfo[tier] = col
|
yellowfive@81
|
256 end
|
yellowfive@81
|
257 end
|
yellowfive@81
|
258 end
|
yellowfive@81
|
259
|
yellowfive@81
|
260 local str = ""
|
yellowfive@81
|
261 for i = 1, maxTiers do
|
yellowfive@81
|
262 if talentInfo[i] then
|
yellowfive@81
|
263 str = str .. talentInfo[i]
|
yellowfive@81
|
264 else
|
yellowfive@81
|
265 str = str .. '0'
|
yellowfive@81
|
266 end
|
yellowfive@81
|
267 end
|
yellowfive@81
|
268
|
yellowfive@81
|
269 Amr.db.char.Talents[specPos] = str
|
yellowfive@81
|
270 end
|
yellowfive@81
|
271
|
yellowfive@112
|
272 local function scanCrucible()
|
yellowfive@112
|
273 if not Amr.db or not Amr.db.char or not Amr.db.char.Artifacts or not C_ArtifactRelicForgeUI or not C_ArtifactRelicForgeUI.GetSocketedRelicTalents then return end
|
yellowfive@112
|
274
|
yellowfive@112
|
275 local equipped = {}
|
yellowfive@112
|
276 local preview = nil
|
yellowfive@112
|
277
|
yellowfive@112
|
278 for i = 1,4 do
|
yellowfive@112
|
279 local talents = nil
|
yellowfive@112
|
280 if i == 4 then
|
yellowfive@112
|
281 talents = C_ArtifactRelicForgeUI.GetPreviewRelicTalents()
|
yellowfive@112
|
282 --talents = nil
|
yellowfive@112
|
283 else
|
yellowfive@112
|
284 talents = C_ArtifactRelicForgeUI.GetSocketedRelicTalents(i)
|
yellowfive@112
|
285
|
yellowfive@112
|
286 --[[
|
yellowfive@114
|
287 -- test data
|
yellowfive@112
|
288 if i == 1 then
|
yellowfive@112
|
289 talents = {}
|
yellowfive@112
|
290 table.insert(talents, {
|
yellowfive@112
|
291 powerID = 1739,
|
yellowfive@112
|
292 isChosen = true
|
yellowfive@112
|
293 })
|
yellowfive@112
|
294 table.insert(talents, {
|
yellowfive@112
|
295 powerID = 1781,
|
yellowfive@112
|
296 isChosen = true
|
yellowfive@112
|
297 })
|
yellowfive@112
|
298 table.insert(talents, {
|
yellowfive@112
|
299 powerID = 1770,
|
yellowfive@112
|
300 isChosen = false
|
yellowfive@112
|
301 })
|
yellowfive@112
|
302 table.insert(talents, {
|
yellowfive@112
|
303 powerID = 791,
|
yellowfive@112
|
304 isChosen = false
|
yellowfive@112
|
305 })
|
yellowfive@112
|
306 table.insert(talents, {
|
yellowfive@112
|
307 powerID = 786,
|
yellowfive@112
|
308 isChosen = false
|
yellowfive@112
|
309 })
|
yellowfive@112
|
310 table.insert(talents, {
|
yellowfive@112
|
311 powerID = 1537,
|
yellowfive@112
|
312 isChosen = false
|
yellowfive@112
|
313 })
|
yellowfive@112
|
314 end
|
yellowfive@112
|
315 ]]
|
yellowfive@112
|
316 end
|
yellowfive@112
|
317
|
yellowfive@112
|
318 if talents then
|
yellowfive@112
|
319 local obj = {
|
yellowfive@112
|
320 Powers = {},
|
yellowfive@112
|
321 Active = {}
|
yellowfive@112
|
322 }
|
yellowfive@112
|
323
|
yellowfive@112
|
324 if i == 4 then
|
yellowfive@112
|
325 obj.ItemLink = C_ArtifactRelicForgeUI.GetPreviewRelicItemLink()
|
yellowfive@112
|
326 if not obj.ItemLink then
|
yellowfive@112
|
327 talents = nil
|
yellowfive@112
|
328 else
|
yellowfive@112
|
329 preview = obj
|
yellowfive@112
|
330 end
|
yellowfive@112
|
331 else
|
yellowfive@112
|
332 table.insert(equipped, obj)
|
yellowfive@112
|
333 end
|
yellowfive@112
|
334
|
yellowfive@112
|
335 if talents then
|
yellowfive@112
|
336 for k,v in ipairs(talents) do
|
yellowfive@112
|
337 table.insert(obj.Powers, v.powerID)
|
yellowfive@112
|
338 table.insert(obj.Active, v.isChosen)
|
yellowfive@112
|
339 end
|
yellowfive@112
|
340 end
|
yellowfive@112
|
341
|
yellowfive@112
|
342 elseif i ~= 4 then
|
yellowfive@112
|
343 table.insert(equipped, {})
|
yellowfive@112
|
344 end
|
yellowfive@112
|
345 end
|
yellowfive@112
|
346
|
yellowfive@112
|
347
|
yellowfive@112
|
348 local itemID = C_ArtifactUI.GetArtifactInfo()
|
yellowfive@112
|
349 local spec = Amr.ArtifactIdToSpecNumber[itemID]
|
yellowfive@112
|
350
|
yellowfive@112
|
351 if spec then
|
yellowfive@112
|
352
|
yellowfive@112
|
353 -- sometimes this event can fire when no crucible data is available, don't overwrite non-blank crucible data with blank crucible data
|
yellowfive@118
|
354 local badEquipped = false
|
yellowfive@112
|
355 if Amr.db.char.Artifacts[spec] then
|
yellowfive@112
|
356 local oldCrucible = Amr.db.char.Artifacts[spec].Crucible
|
yellowfive@112
|
357 if oldCrucible then
|
yellowfive@112
|
358 if #oldCrucible.Equipped > 0 and oldCrucible.Equipped[1] and not equipped[1] then
|
yellowfive@118
|
359 badEquipped = true
|
yellowfive@112
|
360 end
|
yellowfive@112
|
361 end
|
yellowfive@112
|
362 end
|
yellowfive@112
|
363
|
yellowfive@112
|
364 local dataz = Amr.db.char.Artifacts[spec]
|
yellowfive@112
|
365 if not dataz then
|
yellowfive@112
|
366 dataz = {}
|
yellowfive@112
|
367 Amr.db.char.Artifacts[spec] = dataz
|
yellowfive@112
|
368 end
|
yellowfive@112
|
369
|
yellowfive@112
|
370 if not dataz.Crucible then
|
yellowfive@112
|
371 dataz.Crucible = {
|
yellowfive@112
|
372 Equipped = {},
|
yellowfive@114
|
373 Previewed = {}
|
yellowfive@112
|
374 }
|
yellowfive@112
|
375 end
|
yellowfive@112
|
376
|
yellowfive@112
|
377 local crucible = dataz.Crucible
|
yellowfive@118
|
378
|
yellowfive@118
|
379 if not badEquipped then
|
yellowfive@118
|
380 crucible.Equipped = equipped
|
yellowfive@118
|
381 end
|
yellowfive@118
|
382
|
yellowfive@112
|
383 if preview then
|
yellowfive@114
|
384 local previewKey = {}
|
yellowfive@114
|
385 table.insert(previewKey, preview.ItemLink)
|
yellowfive@114
|
386 for i,v in ipairs(preview.Powers) do
|
yellowfive@114
|
387 table.insert(previewKey, v .. "=" .. tostring(preview.Active[i]))
|
yellowfive@114
|
388 end
|
yellowfive@114
|
389 previewKey = table.concat(previewKey, "_")
|
yellowfive@114
|
390
|
yellowfive@116
|
391 if not crucible.Previewed then
|
yellowfive@116
|
392 crucible.Previewed = {}
|
yellowfive@116
|
393 end
|
yellowfive@114
|
394 crucible.Previewed[previewKey] = preview
|
yellowfive@112
|
395 end
|
yellowfive@112
|
396 end
|
yellowfive@112
|
397 end
|
yellowfive@112
|
398
|
yellowfive@114
|
399 local function pruneCrucible()
|
yellowfive@114
|
400 if not Amr.db or not Amr.db.char or not Amr.db.char.Artifacts then return end
|
yellowfive@114
|
401
|
yellowfive@114
|
402 local spec = GetSpecialization()
|
yellowfive@114
|
403 local dataz = Amr.db.char.Artifacts[spec]
|
yellowfive@114
|
404 if not dataz or not dataz.Crucible then return end
|
yellowfive@114
|
405
|
yellowfive@114
|
406 local crucible = dataz.Crucible
|
yellowfive@114
|
407
|
yellowfive@114
|
408 -- this was old format, transform to new format
|
yellowfive@114
|
409 if crucible.Inventory then
|
yellowfive@114
|
410 if not crucible.Previewed then
|
yellowfive@114
|
411 crucible.Previewed = {}
|
yellowfive@114
|
412 end
|
yellowfive@114
|
413
|
yellowfive@114
|
414 for link,preview in pairs(crucible.Inventory) do
|
yellowfive@114
|
415 local previewKey = {}
|
yellowfive@114
|
416 table.insert(previewKey, preview.ItemLink)
|
yellowfive@114
|
417 for i,v in ipairs(preview.Powers) do
|
yellowfive@114
|
418 table.insert(previewKey, v .. "=" .. tostring(preview.Active[i]))
|
yellowfive@114
|
419 end
|
yellowfive@114
|
420 previewKey = table.concat(previewKey, "_")
|
yellowfive@114
|
421
|
yellowfive@114
|
422 crucible.Previewed[previewKey] = preview
|
yellowfive@114
|
423 end
|
yellowfive@114
|
424
|
yellowfive@114
|
425 crucible.Inventory = nil
|
yellowfive@114
|
426 end
|
yellowfive@114
|
427
|
yellowfive@114
|
428 -- get a hash of every owned, but not-equipped item
|
yellowfive@114
|
429 local ownedItems = {}
|
yellowfive@114
|
430 if Amr.db.char.BagItems then
|
yellowfive@114
|
431 for i,link in ipairs(Amr.db.char.BagItems) do
|
yellowfive@114
|
432 ownedItems[link] = true
|
yellowfive@114
|
433 end
|
yellowfive@114
|
434 end
|
yellowfive@114
|
435 if Amr.db.char.BankItems then
|
yellowfive@114
|
436 for i,link in ipairs(Amr.db.char.BankItems) do
|
yellowfive@114
|
437 ownedItems[link] = true
|
yellowfive@114
|
438 end
|
yellowfive@114
|
439 end
|
yellowfive@114
|
440 if Amr.db.char.VoidItems then
|
yellowfive@114
|
441 for i,link in ipairs(Amr.db.char.VoidItems) do
|
yellowfive@114
|
442 ownedItems[link] = true
|
yellowfive@114
|
443 end
|
yellowfive@114
|
444 end
|
yellowfive@114
|
445
|
yellowfive@114
|
446 -- prune out any previewed relics that the player no longer owns
|
yellowfive@114
|
447 if crucible.Previewed then
|
yellowfive@114
|
448 local toRemove = {}
|
yellowfive@114
|
449 for k,v in pairs(crucible.Previewed) do
|
yellowfive@114
|
450 if not ownedItems[v.ItemLink] then
|
yellowfive@114
|
451 table.insert(toRemove, k)
|
yellowfive@114
|
452 end
|
yellowfive@114
|
453 end
|
yellowfive@114
|
454 for i,v in ipairs(toRemove) do
|
yellowfive@114
|
455 crucible.Previewed[v] = nil
|
yellowfive@114
|
456 end
|
yellowfive@114
|
457 end
|
yellowfive@114
|
458
|
yellowfive@114
|
459 end
|
yellowfive@114
|
460
|
yellowfive@81
|
461 local function scanArtifact()
|
yellowfive@91
|
462 if not Amr.db or not Amr.db.char or not Amr.db.char.Artifacts then return end
|
yellowfive@91
|
463
|
yellowfive@81
|
464 local powers = C_ArtifactUI.GetPowers()
|
yellowfive@81
|
465 if not powers then return end
|
yellowfive@81
|
466
|
yellowfive@81
|
467 local powerRanks = {}
|
yellowfive@81
|
468 for k,v in pairs(powers) do
|
yellowfive@106
|
469 local powerInfo = C_ArtifactUI.GetPowerInfo(v)
|
yellowfive@106
|
470 if powerInfo.currentRank - powerInfo.bonusRanks > 0 then
|
yellowfive@106
|
471 powerRanks[v] = powerInfo.currentRank - powerInfo.bonusRanks
|
yellowfive@81
|
472 end
|
yellowfive@81
|
473 end
|
yellowfive@81
|
474
|
yellowfive@81
|
475 local relicInfo = {}
|
yellowfive@81
|
476 for i = 1,3 do
|
yellowfive@81
|
477 local _, _, _, link = C_ArtifactUI.GetRelicInfo(i);
|
yellowfive@81
|
478 table.insert(relicInfo, link or "")
|
yellowfive@81
|
479 end
|
yellowfive@81
|
480
|
yellowfive@81
|
481 -- make sure that the artifact UI didn't get closed while we were reading it, GetPowers seems to return nil unless it is open
|
yellowfive@81
|
482 powers = C_ArtifactUI.GetPowers()
|
yellowfive@81
|
483 if not powers then return end
|
yellowfive@81
|
484
|
yellowfive@89
|
485 -- use the artifact item ID to figure out which spec this is for, since you can open your artifact on any spec
|
yellowfive@91
|
486 local itemID = C_ArtifactUI.GetArtifactInfo()
|
yellowfive@89
|
487 local spec = Amr.ArtifactIdToSpecNumber[itemID]
|
yellowfive@89
|
488 --local spec = GetSpecialization()
|
yellowfive@89
|
489
|
yellowfive@91
|
490 if spec then
|
yellowfive@112
|
491
|
yellowfive@112
|
492 -- sometimes this event can fire when no relic data is available, don't overwrite non-blank relic data with blank relic data
|
yellowfive@112
|
493 if Amr.db.char.Artifacts[spec] then
|
yellowfive@112
|
494 local oldRelics = Amr.db.char.Artifacts[spec].Relics
|
yellowfive@112
|
495 if oldRelics then
|
yellowfive@112
|
496 for i = 1,3 do
|
yellowfive@112
|
497 if oldRelics[i] and oldRelics[i] ~= "" and (not relicInfo[i] or relicInfo[i] == "") then
|
yellowfive@112
|
498 relicInfo[i] = oldRelics[i]
|
yellowfive@112
|
499 end
|
yellowfive@112
|
500 end
|
yellowfive@112
|
501 end
|
yellowfive@112
|
502 end
|
yellowfive@112
|
503
|
yellowfive@112
|
504 local dataz = Amr.db.char.Artifacts[spec]
|
yellowfive@112
|
505 if not dataz then
|
yellowfive@112
|
506 dataz = {}
|
yellowfive@112
|
507 Amr.db.char.Artifacts[spec] = dataz
|
yellowfive@112
|
508 end
|
yellowfive@112
|
509
|
yellowfive@112
|
510 if not dataz.Crucible then
|
yellowfive@112
|
511 dataz.Crucible = {
|
yellowfive@112
|
512 Equipped = {},
|
yellowfive@112
|
513 Inventory = {}
|
yellowfive@112
|
514 }
|
yellowfive@112
|
515 end
|
yellowfive@112
|
516
|
yellowfive@112
|
517 dataz.Powers = powerRanks
|
yellowfive@112
|
518 dataz.Relics = relicInfo
|
yellowfive@112
|
519
|
yellowfive@91
|
520 end
|
yellowfive@112
|
521
|
yellowfive@112
|
522 --scanCrucible()
|
yellowfive@81
|
523 end
|
yellowfive@81
|
524
|
yellowfive@57
|
525 -- Returns a data object containing all information about the current player needed for an export:
|
yellowfive@57
|
526 -- gear, spec, reputations, bag, bank, and void storage items.
|
yellowfive@57
|
527 function Amr:ExportCharacter()
|
yellowfive@57
|
528
|
yellowfive@57
|
529 local data = getEquipped()
|
yellowfive@57
|
530 scanBags()
|
yellowfive@57
|
531
|
yellowfive@81
|
532 -- scan current spec's talents just before exporting
|
yellowfive@81
|
533 scanTalents()
|
yellowfive@81
|
534
|
yellowfive@114
|
535 -- prune crucible info just before each time we export
|
yellowfive@114
|
536 pruneCrucible()
|
yellowfive@114
|
537
|
yellowfive@81
|
538 data.Talents = Amr.db.char.Talents
|
yellowfive@81
|
539 data.Artifacts = Amr.db.char.Artifacts
|
yellowfive@57
|
540 data.Equipped = Amr.db.char.Equipped
|
yellowfive@57
|
541 data.Reputations = getReputations()
|
yellowfive@57
|
542 data.BagItems = Amr.db.char.BagItems
|
yellowfive@57
|
543 data.BankItems = Amr.db.char.BankItems
|
yellowfive@57
|
544 data.VoidItems = Amr.db.char.VoidItems
|
yellowfive@57
|
545
|
yellowfive@57
|
546 return data
|
yellowfive@57
|
547 end
|
yellowfive@57
|
548
|
yellowfive@57
|
549 function Amr:InitializeExport()
|
yellowfive@57
|
550 Amr:AddEventHandler("UNIT_INVENTORY_CHANGED", function(unitID)
|
yellowfive@57
|
551 if unitID and unitID ~= "player" then return end
|
yellowfive@57
|
552 getEquipped()
|
yellowfive@57
|
553 end)
|
yellowfive@57
|
554 end
|
yellowfive@57
|
555
|
yellowfive@57
|
556 Amr:AddEventHandler("BANKFRAME_OPENED", scanBank)
|
yellowfive@57
|
557 Amr:AddEventHandler("PLAYERBANKSLOTS_CHANGED", scanBank)
|
yellowfive@57
|
558
|
yellowfive@57
|
559 Amr:AddEventHandler("VOID_STORAGE_OPEN", scanVoid)
|
yellowfive@57
|
560 Amr:AddEventHandler("VOID_STORAGE_CONTENTS_UPDATE", scanVoid)
|
yellowfive@57
|
561 Amr:AddEventHandler("VOID_STORAGE_DEPOSIT_UPDATE", scanVoid)
|
yellowfive@57
|
562 Amr:AddEventHandler("VOID_STORAGE_UPDATE", scanVoid)
|
yellowfive@81
|
563
|
yellowfive@81
|
564 Amr:AddEventHandler("PLAYER_TALENT_UPDATE", scanTalents)
|
yellowfive@81
|
565 Amr:AddEventHandler("ARTIFACT_UPDATE", scanArtifact)
|
yellowfive@112
|
566 Amr:AddEventHandler("ARTIFACT_RELIC_FORGE_UPDATE", scanCrucible)
|
yellowfive@112
|
567 Amr:AddEventHandler("ARTIFACT_RELIC_FORGE_PREVIEW_RELIC_CHANGED", scanCrucible)
|