yellowfive@57
|
1 -- AskMrRobot-Serializer will serialize and communicate character data between users.
|
yellowfive@57
|
2 -- This is used primarily to associate character information to logs uploaded to askmrrobot.com.
|
yellowfive@57
|
3
|
yellowfive@91
|
4 local MAJOR, MINOR = "AskMrRobot-Serializer", 43
|
yellowfive@57
|
5 local Amr, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
|
yellowfive@57
|
6
|
yellowfive@57
|
7 if not Amr then return end -- already loaded by something else
|
yellowfive@57
|
8
|
yellowfive@57
|
9 -- event and comm used for player snapshotting on entering combat
|
yellowfive@57
|
10 LibStub("AceEvent-3.0"):Embed(Amr)
|
yellowfive@57
|
11 LibStub("AceComm-3.0"):Embed(Amr)
|
yellowfive@57
|
12
|
yellowfive@57
|
13 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
14 -- Constants
|
yellowfive@57
|
15 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
16
|
yellowfive@57
|
17 -- prefix used for communicating gear snapshots created by the AMR serializer
|
yellowfive@57
|
18 Amr.ChatPrefix = "_AMRS"
|
yellowfive@57
|
19
|
yellowfive@57
|
20 -- map of region ids to AMR region names
|
yellowfive@57
|
21 Amr.RegionNames = {
|
yellowfive@57
|
22 [1] = "US",
|
yellowfive@57
|
23 [2] = "KR",
|
yellowfive@57
|
24 [3] = "EU",
|
yellowfive@57
|
25 [4] = "TW",
|
yellowfive@57
|
26 [5] = "CN"
|
yellowfive@57
|
27 }
|
yellowfive@57
|
28
|
yellowfive@57
|
29 -- map of the skillLine returned by profession API to the AMR profession name
|
yellowfive@57
|
30 Amr.ProfessionSkillLineToName = {
|
yellowfive@57
|
31 [794] = "Archaeology",
|
yellowfive@57
|
32 [171] = "Alchemy",
|
yellowfive@57
|
33 [164] = "Blacksmithing",
|
yellowfive@57
|
34 [185] = "Cooking",
|
yellowfive@57
|
35 [333] = "Enchanting",
|
yellowfive@57
|
36 [202] = "Engineering",
|
yellowfive@57
|
37 [129] = "First Aid",
|
yellowfive@57
|
38 [356] = "Fishing",
|
yellowfive@57
|
39 [182] = "Herbalism",
|
yellowfive@57
|
40 [773] = "Inscription",
|
yellowfive@57
|
41 [755] = "Jewelcrafting",
|
yellowfive@57
|
42 [165] = "Leatherworking",
|
yellowfive@57
|
43 [186] = "Mining",
|
yellowfive@57
|
44 [393] = "Skinning",
|
yellowfive@57
|
45 [197] = "Tailoring"
|
yellowfive@57
|
46 }
|
yellowfive@57
|
47
|
yellowfive@57
|
48 -- all slot IDs that we care about, ordered in AMR standard display order
|
yellowfive@57
|
49 Amr.SlotIds = { 16, 17, 1, 2, 3, 15, 5, 9, 10, 6, 7, 8, 11, 12, 13, 14 }
|
yellowfive@57
|
50
|
yellowfive@57
|
51 Amr.SpecIds = {
|
yellowfive@57
|
52 [250] = 1, -- DeathKnightBlood
|
yellowfive@57
|
53 [251] = 2, -- DeathKnightFrost
|
yellowfive@57
|
54 [252] = 3, -- DeathKnightUnholy
|
yellowfive@81
|
55 [577] = 4, -- DemonHunterHavoc
|
yellowfive@81
|
56 [581] = 5, -- DemonHunterVengeance
|
yellowfive@81
|
57 [102] = 6, -- DruidBalance
|
yellowfive@81
|
58 [103] = 7, -- DruidFeral
|
yellowfive@81
|
59 [104] = 8, -- DruidGuardian
|
yellowfive@81
|
60 [105] = 9, -- DruidRestoration
|
yellowfive@81
|
61 [253] = 10, -- HunterBeastMastery
|
yellowfive@81
|
62 [254] = 11, -- HunterMarksmanship
|
yellowfive@81
|
63 [255] = 12, -- HunterSurvival
|
yellowfive@81
|
64 [62] = 13, -- MageArcane
|
yellowfive@81
|
65 [63] = 14, -- MageFire
|
yellowfive@81
|
66 [64] = 15, -- MageFrost
|
yellowfive@81
|
67 [268] = 16, -- MonkBrewmaster
|
yellowfive@81
|
68 [270] = 17, -- MonkMistweaver
|
yellowfive@81
|
69 [269] = 18, -- MonkWindwalker
|
yellowfive@81
|
70 [65] = 19, -- PaladinHoly
|
yellowfive@81
|
71 [66] = 20, -- PaladinProtection
|
yellowfive@81
|
72 [70] = 21, -- PaladinRetribution
|
yellowfive@81
|
73 [256] = 22, -- PriestDiscipline
|
yellowfive@81
|
74 [257] = 23, -- PriestHoly
|
yellowfive@81
|
75 [258] = 24, -- PriestShadow
|
yellowfive@81
|
76 [259] = 25, -- RogueAssassination
|
yellowfive@81
|
77 [260] = 26, -- RogueOutlaw
|
yellowfive@81
|
78 [261] = 27, -- RogueSubtlety
|
yellowfive@81
|
79 [262] = 28, -- ShamanElemental
|
yellowfive@81
|
80 [263] = 29, -- ShamanEnhancement
|
yellowfive@81
|
81 [264] = 30, -- ShamanRestoration
|
yellowfive@81
|
82 [265] = 31, -- WarlockAffliction
|
yellowfive@81
|
83 [266] = 32, -- WarlockDemonology
|
yellowfive@81
|
84 [267] = 33, -- WarlockDestruction
|
yellowfive@81
|
85 [71] = 34, -- WarriorArms
|
yellowfive@81
|
86 [72] = 35, -- WarriorFury
|
yellowfive@81
|
87 [73] = 36 -- WarriorProtection
|
yellowfive@57
|
88 }
|
yellowfive@57
|
89
|
yellowfive@57
|
90 Amr.ClassIds = {
|
yellowfive@57
|
91 ["NONE"] = 0,
|
yellowfive@57
|
92 ["DEATHKNIGHT"] = 1,
|
yellowfive@81
|
93 ["DEMONHUNTER"] = 2,
|
yellowfive@81
|
94 ["DRUID"] = 3,
|
yellowfive@81
|
95 ["HUNTER"] = 4,
|
yellowfive@81
|
96 ["MAGE"] = 5,
|
yellowfive@81
|
97 ["MONK"] = 6,
|
yellowfive@81
|
98 ["PALADIN"] = 7,
|
yellowfive@81
|
99 ["PRIEST"] = 8,
|
yellowfive@81
|
100 ["ROGUE"] = 9,
|
yellowfive@81
|
101 ["SHAMAN"] = 10,
|
yellowfive@81
|
102 ["WARLOCK"] = 11,
|
yellowfive@81
|
103 ["WARRIOR"] = 12,
|
yellowfive@57
|
104 }
|
yellowfive@57
|
105
|
yellowfive@57
|
106 Amr.ProfessionIds = {
|
yellowfive@57
|
107 ["None"] = 0,
|
yellowfive@57
|
108 ["Mining"] = 1,
|
yellowfive@57
|
109 ["Skinning"] = 2,
|
yellowfive@57
|
110 ["Herbalism"] = 3,
|
yellowfive@57
|
111 ["Enchanting"] = 4,
|
yellowfive@57
|
112 ["Jewelcrafting"] = 5,
|
yellowfive@57
|
113 ["Engineering"] = 6,
|
yellowfive@57
|
114 ["Blacksmithing"] = 7,
|
yellowfive@57
|
115 ["Leatherworking"] = 8,
|
yellowfive@57
|
116 ["Inscription"] = 9,
|
yellowfive@57
|
117 ["Tailoring"] = 10,
|
yellowfive@57
|
118 ["Alchemy"] = 11,
|
yellowfive@57
|
119 ["Fishing"] = 12,
|
yellowfive@57
|
120 ["Cooking"] = 13,
|
yellowfive@57
|
121 ["First Aid"] = 14,
|
yellowfive@57
|
122 ["Archaeology"] = 15
|
yellowfive@57
|
123 }
|
yellowfive@57
|
124
|
yellowfive@57
|
125 Amr.RaceIds = {
|
yellowfive@57
|
126 ["None"] = 0,
|
yellowfive@57
|
127 ["BloodElf"] = 1,
|
yellowfive@57
|
128 ["Draenei"] = 2,
|
yellowfive@57
|
129 ["Dwarf"] = 3,
|
yellowfive@57
|
130 ["Gnome"] = 4,
|
yellowfive@57
|
131 ["Human"] = 5,
|
yellowfive@57
|
132 ["NightElf"] = 6,
|
yellowfive@57
|
133 ["Orc"] = 7,
|
yellowfive@57
|
134 ["Tauren"] = 8,
|
yellowfive@57
|
135 ["Troll"] = 9,
|
yellowfive@57
|
136 ["Scourge"] = 10,
|
yellowfive@57
|
137 ["Undead"] = 10,
|
yellowfive@57
|
138 ["Goblin"] = 11,
|
yellowfive@57
|
139 ["Worgen"] = 12,
|
yellowfive@57
|
140 ["Pandaren"] = 13
|
yellowfive@57
|
141 }
|
yellowfive@57
|
142
|
yellowfive@57
|
143 Amr.FactionIds = {
|
yellowfive@57
|
144 ["None"] = 0,
|
yellowfive@57
|
145 ["Alliance"] = 1,
|
yellowfive@57
|
146 ["Horde"] = 2
|
yellowfive@57
|
147 }
|
yellowfive@57
|
148
|
yellowfive@57
|
149 Amr.InstanceIds = {
|
yellowfive@91
|
150 EmeraldNightmare = 1094,
|
yellowfive@91
|
151 Nighthold = 1530
|
yellowfive@57
|
152 }
|
yellowfive@57
|
153
|
yellowfive@57
|
154 -- instances that AskMrRobot currently supports logging for
|
yellowfive@57
|
155 Amr.SupportedInstanceIds = {
|
yellowfive@91
|
156 [1094] = true,
|
yellowfive@91
|
157 [1088] = true
|
yellowfive@57
|
158 }
|
yellowfive@57
|
159
|
yellowfive@89
|
160 -- just to make life easier, maps ID of each artifact weapon to the spec number (1-4)
|
yellowfive@89
|
161 Amr.ArtifactIdToSpecNumber = {
|
yellowfive@89
|
162 [128402] = 1, -- DK
|
yellowfive@89
|
163 [128292] = 2,
|
yellowfive@89
|
164 [128403] = 3,
|
yellowfive@89
|
165 [127829] = 1, -- DH
|
yellowfive@89
|
166 [128832] = 2,
|
yellowfive@89
|
167 [128858] = 1, -- Druid
|
yellowfive@89
|
168 [128860] = 2,
|
yellowfive@89
|
169 [128821] = 3,
|
yellowfive@89
|
170 [128306] = 4,
|
yellowfive@89
|
171 [128861] = 1, -- Hunter
|
yellowfive@89
|
172 [128826] = 2,
|
yellowfive@89
|
173 [128808] = 3,
|
yellowfive@89
|
174 [127857] = 1, -- Mage
|
yellowfive@89
|
175 [128820] = 2,
|
yellowfive@89
|
176 [128862] = 3,
|
yellowfive@89
|
177 [128938] = 1, -- Monk
|
yellowfive@89
|
178 [128937] = 2,
|
yellowfive@89
|
179 [128940] = 3,
|
yellowfive@89
|
180 [128823] = 1, -- Paladin
|
yellowfive@89
|
181 [128866] = 2,
|
yellowfive@89
|
182 [120978] = 3,
|
yellowfive@89
|
183 [128868] = 1, -- Priest
|
yellowfive@89
|
184 [128825] = 2,
|
yellowfive@89
|
185 [128827] = 3,
|
yellowfive@89
|
186 [128870] = 1, -- Rogue
|
yellowfive@89
|
187 [128872] = 2,
|
yellowfive@89
|
188 [128476] = 3,
|
yellowfive@89
|
189 [128935] = 1, -- Shaman
|
yellowfive@89
|
190 [128819] = 2,
|
yellowfive@89
|
191 [128911] = 3,
|
yellowfive@89
|
192 [128942] = 1, -- Warlock
|
yellowfive@89
|
193 [128943] = 2,
|
yellowfive@89
|
194 [128941] = 3,
|
yellowfive@89
|
195 [128910] = 1, -- Warrior
|
yellowfive@89
|
196 [128908] = 2,
|
yellowfive@89
|
197 [128289] = 3,
|
yellowfive@89
|
198
|
yellowfive@89
|
199 --[128293] = 2, -- Frost OH
|
yellowfive@89
|
200 --[127830] = 1, -- Havoc OH
|
yellowfive@89
|
201 --[128831] = 2, -- Vengeance OH
|
yellowfive@89
|
202 --[128859] = 2, -- Feral OH
|
yellowfive@89
|
203 --[128822] = 3, -- Guardian OH
|
yellowfive@89
|
204 --[133959] = 2, -- Fire OH
|
yellowfive@89
|
205 --[133948] = 3, -- Windwalker OH
|
yellowfive@89
|
206 --[128867] = 2, -- Prot MH
|
yellowfive@89
|
207 --[133958] = 3, -- Shadow OH
|
yellowfive@89
|
208 --[128869] = 1, -- Rogue OH's
|
yellowfive@89
|
209 --[134552] = 2,
|
yellowfive@89
|
210 --[128479] = 3,
|
yellowfive@89
|
211 --[128936] = 1, -- Shaman OH's
|
yellowfive@89
|
212 --[128873] = 2,
|
yellowfive@89
|
213 --[128934] = 3,
|
yellowfive@89
|
214 --[137246] = 2, -- Demo MH
|
yellowfive@89
|
215 --[134553] = 2, -- Fury OH
|
yellowfive@89
|
216 --[128288] = 3 -- Prot MH
|
yellowfive@89
|
217 }
|
yellowfive@89
|
218
|
yellowfive@57
|
219 -- IDs of set tokens that we would care about in a player's inventory
|
yellowfive@57
|
220 Amr.SetTokenIds = {
|
yellowfive@63
|
221 [127970] = true,
|
yellowfive@63
|
222 [127969] = true,
|
yellowfive@63
|
223 [127968] = true,
|
yellowfive@63
|
224 [127967] = true,
|
yellowfive@63
|
225 [127966] = true,
|
yellowfive@63
|
226 [127965] = true,
|
yellowfive@63
|
227 [127964] = true,
|
yellowfive@63
|
228 [127963] = true,
|
yellowfive@63
|
229 [127962] = true,
|
yellowfive@63
|
230 [127961] = true,
|
yellowfive@63
|
231 [127960] = true,
|
yellowfive@63
|
232 [127959] = true,
|
yellowfive@63
|
233 [127958] = true,
|
yellowfive@63
|
234 [127957] = true,
|
yellowfive@63
|
235 [127956] = true,
|
yellowfive@63
|
236 [127955] = true,
|
yellowfive@63
|
237 [127954] = true,
|
yellowfive@63
|
238 [127953] = true,
|
yellowfive@57
|
239 [120285] = true,
|
yellowfive@57
|
240 [120284] = true,
|
yellowfive@57
|
241 [120283] = true,
|
yellowfive@57
|
242 [120282] = true,
|
yellowfive@57
|
243 [120281] = true,
|
yellowfive@57
|
244 [120280] = true,
|
yellowfive@57
|
245 [120279] = true,
|
yellowfive@57
|
246 [120278] = true,
|
yellowfive@57
|
247 [120277] = true,
|
yellowfive@57
|
248 [120256] = true,
|
yellowfive@57
|
249 [120255] = true,
|
yellowfive@57
|
250 [120254] = true,
|
yellowfive@57
|
251 [120253] = true,
|
yellowfive@57
|
252 [120252] = true,
|
yellowfive@57
|
253 [120251] = true,
|
yellowfive@57
|
254 [120250] = true,
|
yellowfive@57
|
255 [120249] = true,
|
yellowfive@57
|
256 [120248] = true,
|
yellowfive@57
|
257 [120247] = true,
|
yellowfive@57
|
258 [120246] = true,
|
yellowfive@57
|
259 [120245] = true,
|
yellowfive@57
|
260 [120244] = true,
|
yellowfive@57
|
261 [120243] = true,
|
yellowfive@57
|
262 [120242] = true,
|
yellowfive@57
|
263 [120241] = true,
|
yellowfive@57
|
264 [120240] = true,
|
yellowfive@57
|
265 [120239] = true,
|
yellowfive@57
|
266 [120238] = true,
|
yellowfive@57
|
267 [120237] = true,
|
yellowfive@57
|
268 [120236] = true,
|
yellowfive@57
|
269 [120235] = true,
|
yellowfive@57
|
270 [120234] = true,
|
yellowfive@57
|
271 [120233] = true,
|
yellowfive@57
|
272 [120232] = true,
|
yellowfive@57
|
273 [120231] = true,
|
yellowfive@57
|
274 [120230] = true,
|
yellowfive@57
|
275 [120229] = true,
|
yellowfive@57
|
276 [120228] = true,
|
yellowfive@57
|
277 [120227] = true,
|
yellowfive@57
|
278 [120226] = true,
|
yellowfive@57
|
279 [120225] = true,
|
yellowfive@57
|
280 [120224] = true,
|
yellowfive@57
|
281 [120223] = true,
|
yellowfive@57
|
282 [120222] = true,
|
yellowfive@57
|
283 [120221] = true,
|
yellowfive@57
|
284 [120220] = true,
|
yellowfive@57
|
285 [120219] = true,
|
yellowfive@57
|
286 [120218] = true,
|
yellowfive@57
|
287 [120217] = true,
|
yellowfive@57
|
288 [120216] = true,
|
yellowfive@57
|
289 [120215] = true,
|
yellowfive@57
|
290 [120214] = true,
|
yellowfive@57
|
291 [120213] = true,
|
yellowfive@57
|
292 [120212] = true,
|
yellowfive@57
|
293 [120211] = true,
|
yellowfive@57
|
294 [120210] = true,
|
yellowfive@57
|
295 [120209] = true,
|
yellowfive@57
|
296 [120208] = true,
|
yellowfive@57
|
297 [120207] = true,
|
yellowfive@57
|
298 [120206] = true,
|
yellowfive@57
|
299 [119323] = true,
|
yellowfive@57
|
300 [119322] = true,
|
yellowfive@57
|
301 [119321] = true,
|
yellowfive@57
|
302 [119320] = true,
|
yellowfive@57
|
303 [119319] = true,
|
yellowfive@57
|
304 [119318] = true,
|
yellowfive@57
|
305 [119316] = true,
|
yellowfive@57
|
306 [119315] = true,
|
yellowfive@57
|
307 [119314] = true,
|
yellowfive@57
|
308 [119313] = true,
|
yellowfive@57
|
309 [119312] = true,
|
yellowfive@57
|
310 [119311] = true,
|
yellowfive@57
|
311 [119310] = true,
|
yellowfive@57
|
312 [119309] = true,
|
yellowfive@57
|
313 [119308] = true,
|
yellowfive@57
|
314 [119307] = true,
|
yellowfive@57
|
315 [119306] = true,
|
yellowfive@57
|
316 [119305] = true,
|
yellowfive@57
|
317 [105868] = true,
|
yellowfive@57
|
318 [105867] = true,
|
yellowfive@57
|
319 [105866] = true,
|
yellowfive@57
|
320 [105865] = true,
|
yellowfive@57
|
321 [105864] = true,
|
yellowfive@57
|
322 [105863] = true,
|
yellowfive@57
|
323 [105862] = true,
|
yellowfive@57
|
324 [105861] = true,
|
yellowfive@57
|
325 [105860] = true,
|
yellowfive@57
|
326 [105859] = true,
|
yellowfive@57
|
327 [105858] = true,
|
yellowfive@57
|
328 [105857] = true,
|
yellowfive@57
|
329 [99756] = true,
|
yellowfive@57
|
330 [99755] = true,
|
yellowfive@57
|
331 [99754] = true,
|
yellowfive@57
|
332 [99753] = true,
|
yellowfive@57
|
333 [99752] = true,
|
yellowfive@57
|
334 [99751] = true,
|
yellowfive@57
|
335 [99750] = true,
|
yellowfive@57
|
336 [99749] = true,
|
yellowfive@57
|
337 [99748] = true,
|
yellowfive@57
|
338 [99747] = true,
|
yellowfive@57
|
339 [99746] = true,
|
yellowfive@57
|
340 [99745] = true,
|
yellowfive@57
|
341 [99744] = true,
|
yellowfive@57
|
342 [99743] = true,
|
yellowfive@57
|
343 [99742] = true,
|
yellowfive@57
|
344 [99740] = true,
|
yellowfive@57
|
345 [99739] = true,
|
yellowfive@57
|
346 [99738] = true,
|
yellowfive@57
|
347 [99737] = true,
|
yellowfive@57
|
348 [99736] = true,
|
yellowfive@57
|
349 [99735] = true,
|
yellowfive@57
|
350 [99734] = true,
|
yellowfive@57
|
351 [99733] = true,
|
yellowfive@57
|
352 [99732] = true,
|
yellowfive@57
|
353 [99731] = true,
|
yellowfive@57
|
354 [99730] = true,
|
yellowfive@57
|
355 [99729] = true,
|
yellowfive@57
|
356 [99728] = true,
|
yellowfive@57
|
357 [99727] = true,
|
yellowfive@57
|
358 [99726] = true,
|
yellowfive@57
|
359 [99725] = true,
|
yellowfive@57
|
360 [99724] = true,
|
yellowfive@57
|
361 [99723] = true,
|
yellowfive@57
|
362 [99722] = true,
|
yellowfive@57
|
363 [99721] = true,
|
yellowfive@57
|
364 [99720] = true,
|
yellowfive@57
|
365 [99719] = true,
|
yellowfive@57
|
366 [99718] = true,
|
yellowfive@57
|
367 [99717] = true,
|
yellowfive@57
|
368 [99716] = true,
|
yellowfive@57
|
369 [99715] = true,
|
yellowfive@57
|
370 [99714] = true,
|
yellowfive@57
|
371 [99713] = true,
|
yellowfive@57
|
372 [99712] = true,
|
yellowfive@57
|
373 [99711] = true,
|
yellowfive@57
|
374 [99710] = true,
|
yellowfive@57
|
375 [99709] = true,
|
yellowfive@57
|
376 [99708] = true,
|
yellowfive@57
|
377 [99707] = true,
|
yellowfive@57
|
378 [99706] = true,
|
yellowfive@57
|
379 [99705] = true,
|
yellowfive@57
|
380 [99704] = true,
|
yellowfive@57
|
381 [99703] = true,
|
yellowfive@57
|
382 [99702] = true,
|
yellowfive@57
|
383 [99701] = true,
|
yellowfive@57
|
384 [99700] = true,
|
yellowfive@57
|
385 [99699] = true,
|
yellowfive@57
|
386 [99698] = true,
|
yellowfive@57
|
387 [99697] = true,
|
yellowfive@57
|
388 [99696] = true,
|
yellowfive@57
|
389 [99695] = true,
|
yellowfive@57
|
390 [99694] = true,
|
yellowfive@57
|
391 [99693] = true,
|
yellowfive@57
|
392 [99692] = true,
|
yellowfive@57
|
393 [99691] = true,
|
yellowfive@57
|
394 [99690] = true,
|
yellowfive@57
|
395 [99689] = true,
|
yellowfive@57
|
396 [99688] = true,
|
yellowfive@57
|
397 [99687] = true,
|
yellowfive@57
|
398 [99686] = true,
|
yellowfive@57
|
399 [99685] = true,
|
yellowfive@57
|
400 [99684] = true,
|
yellowfive@57
|
401 [99683] = true,
|
yellowfive@57
|
402 [99682] = true,
|
yellowfive@57
|
403 [99681] = true,
|
yellowfive@57
|
404 [99680] = true,
|
yellowfive@57
|
405 [99679] = true,
|
yellowfive@57
|
406 [99678] = true,
|
yellowfive@57
|
407 [99677] = true,
|
yellowfive@57
|
408 [99676] = true,
|
yellowfive@57
|
409 [99675] = true,
|
yellowfive@57
|
410 [99674] = true,
|
yellowfive@57
|
411 [99673] = true,
|
yellowfive@57
|
412 [99672] = true,
|
yellowfive@57
|
413 [99671] = true,
|
yellowfive@57
|
414 [99670] = true,
|
yellowfive@57
|
415 [99669] = true,
|
yellowfive@57
|
416 [99668] = true,
|
yellowfive@57
|
417 [99667] = true,
|
yellowfive@57
|
418 [96701] = true,
|
yellowfive@57
|
419 [96700] = true,
|
yellowfive@57
|
420 [96699] = true,
|
yellowfive@57
|
421 [96633] = true,
|
yellowfive@57
|
422 [96632] = true,
|
yellowfive@57
|
423 [96631] = true,
|
yellowfive@57
|
424 [96625] = true,
|
yellowfive@57
|
425 [96624] = true,
|
yellowfive@57
|
426 [96623] = true,
|
yellowfive@57
|
427 [96601] = true,
|
yellowfive@57
|
428 [96600] = true,
|
yellowfive@57
|
429 [96599] = true,
|
yellowfive@57
|
430 [96568] = true,
|
yellowfive@57
|
431 [96567] = true,
|
yellowfive@57
|
432 [96566] = true,
|
yellowfive@57
|
433 [95957] = true,
|
yellowfive@57
|
434 [95956] = true,
|
yellowfive@57
|
435 [95955] = true,
|
yellowfive@57
|
436 [95889] = true,
|
yellowfive@57
|
437 [95888] = true,
|
yellowfive@57
|
438 [95887] = true,
|
yellowfive@57
|
439 [95881] = true,
|
yellowfive@57
|
440 [95880] = true,
|
yellowfive@57
|
441 [95879] = true,
|
yellowfive@57
|
442 [95857] = true,
|
yellowfive@57
|
443 [95856] = true,
|
yellowfive@57
|
444 [95855] = true,
|
yellowfive@57
|
445 [95824] = true,
|
yellowfive@57
|
446 [95823] = true,
|
yellowfive@57
|
447 [95822] = true,
|
yellowfive@57
|
448 [95583] = true,
|
yellowfive@57
|
449 [95582] = true,
|
yellowfive@57
|
450 [95581] = true,
|
yellowfive@57
|
451 [95580] = true,
|
yellowfive@57
|
452 [95579] = true,
|
yellowfive@57
|
453 [95578] = true,
|
yellowfive@57
|
454 [95577] = true,
|
yellowfive@57
|
455 [95576] = true,
|
yellowfive@57
|
456 [95575] = true,
|
yellowfive@57
|
457 [95574] = true,
|
yellowfive@57
|
458 [95573] = true,
|
yellowfive@57
|
459 [95572] = true,
|
yellowfive@57
|
460 [95571] = true,
|
yellowfive@57
|
461 [95570] = true,
|
yellowfive@57
|
462 [95569] = true,
|
yellowfive@57
|
463 [89278] = true,
|
yellowfive@57
|
464 [89277] = true,
|
yellowfive@57
|
465 [89276] = true,
|
yellowfive@57
|
466 [89275] = true,
|
yellowfive@57
|
467 [89274] = true,
|
yellowfive@57
|
468 [89273] = true,
|
yellowfive@57
|
469 [89272] = true,
|
yellowfive@57
|
470 [89271] = true,
|
yellowfive@57
|
471 [89270] = true,
|
yellowfive@57
|
472 [89269] = true,
|
yellowfive@57
|
473 [89268] = true,
|
yellowfive@57
|
474 [89267] = true,
|
yellowfive@57
|
475 [89266] = true,
|
yellowfive@57
|
476 [89265] = true,
|
yellowfive@57
|
477 [89264] = true,
|
yellowfive@57
|
478 [89263] = true,
|
yellowfive@57
|
479 [89262] = true,
|
yellowfive@57
|
480 [89261] = true,
|
yellowfive@57
|
481 [89260] = true,
|
yellowfive@57
|
482 [89259] = true,
|
yellowfive@57
|
483 [89258] = true,
|
yellowfive@57
|
484 [89257] = true,
|
yellowfive@57
|
485 [89256] = true,
|
yellowfive@57
|
486 [89255] = true,
|
yellowfive@57
|
487 [89254] = true,
|
yellowfive@57
|
488 [89253] = true,
|
yellowfive@57
|
489 [89252] = true,
|
yellowfive@57
|
490 [89251] = true,
|
yellowfive@57
|
491 [89250] = true,
|
yellowfive@57
|
492 [89249] = true,
|
yellowfive@57
|
493 [89248] = true,
|
yellowfive@57
|
494 [89247] = true,
|
yellowfive@57
|
495 [89246] = true,
|
yellowfive@57
|
496 [89245] = true,
|
yellowfive@57
|
497 [89244] = true,
|
yellowfive@57
|
498 [89243] = true,
|
yellowfive@57
|
499 [89242] = true,
|
yellowfive@57
|
500 [89241] = true,
|
yellowfive@57
|
501 [89240] = true,
|
yellowfive@57
|
502 [89239] = true,
|
yellowfive@57
|
503 [89238] = true,
|
yellowfive@57
|
504 [89237] = true,
|
yellowfive@57
|
505 [89236] = true,
|
yellowfive@57
|
506 [89235] = true,
|
yellowfive@57
|
507 [89234] = true,
|
yellowfive@57
|
508 [78876] = true,
|
yellowfive@57
|
509 [78875] = true,
|
yellowfive@57
|
510 [78874] = true,
|
yellowfive@57
|
511 [78873] = true,
|
yellowfive@57
|
512 [78872] = true,
|
yellowfive@57
|
513 [78871] = true,
|
yellowfive@57
|
514 [78867] = true,
|
yellowfive@57
|
515 [78866] = true,
|
yellowfive@57
|
516 [78865] = true,
|
yellowfive@57
|
517 [78864] = true,
|
yellowfive@57
|
518 [78863] = true,
|
yellowfive@57
|
519 [78862] = true,
|
yellowfive@57
|
520 [78861] = true,
|
yellowfive@57
|
521 [78860] = true,
|
yellowfive@57
|
522 [78859] = true,
|
yellowfive@57
|
523 [78858] = true,
|
yellowfive@57
|
524 [78857] = true,
|
yellowfive@57
|
525 [78856] = true,
|
yellowfive@57
|
526 [78855] = true,
|
yellowfive@57
|
527 [78854] = true,
|
yellowfive@57
|
528 [78853] = true,
|
yellowfive@57
|
529 [78849] = true,
|
yellowfive@57
|
530 [78848] = true,
|
yellowfive@57
|
531 [78847] = true,
|
yellowfive@57
|
532 [78184] = true,
|
yellowfive@57
|
533 [78183] = true,
|
yellowfive@57
|
534 [78181] = true,
|
yellowfive@57
|
535 [78180] = true,
|
yellowfive@57
|
536 [78179] = true,
|
yellowfive@57
|
537 [78178] = true,
|
yellowfive@57
|
538 [78176] = true,
|
yellowfive@57
|
539 [78175] = true,
|
yellowfive@57
|
540 [78174] = true,
|
yellowfive@57
|
541 [78173] = true,
|
yellowfive@57
|
542 [78171] = true,
|
yellowfive@57
|
543 [78170] = true,
|
yellowfive@57
|
544 [71687] = true,
|
yellowfive@57
|
545 [71686] = true,
|
yellowfive@57
|
546 [71685] = true,
|
yellowfive@57
|
547 [71683] = true,
|
yellowfive@57
|
548 [71682] = true,
|
yellowfive@57
|
549 [71680] = true,
|
yellowfive@57
|
550 [71679] = true,
|
yellowfive@57
|
551 [71678] = true,
|
yellowfive@57
|
552 [71676] = true,
|
yellowfive@57
|
553 [71675] = true,
|
yellowfive@57
|
554 [71673] = true,
|
yellowfive@57
|
555 [71672] = true,
|
yellowfive@57
|
556 [71671] = true,
|
yellowfive@57
|
557 [71669] = true,
|
yellowfive@57
|
558 [71668] = true,
|
yellowfive@57
|
559 [67431] = true,
|
yellowfive@57
|
560 [67430] = true,
|
yellowfive@57
|
561 [67429] = true,
|
yellowfive@57
|
562 [67428] = true,
|
yellowfive@57
|
563 [67427] = true,
|
yellowfive@57
|
564 [67426] = true,
|
yellowfive@57
|
565 [67425] = true,
|
yellowfive@57
|
566 [67424] = true,
|
yellowfive@57
|
567 [67423] = true,
|
yellowfive@57
|
568 [66998] = true,
|
yellowfive@57
|
569 [65089] = true,
|
yellowfive@57
|
570 [65088] = true,
|
yellowfive@57
|
571 [65087] = true,
|
yellowfive@57
|
572 [63684] = true,
|
yellowfive@57
|
573 [63683] = true,
|
yellowfive@57
|
574 [63682] = true,
|
yellowfive@63
|
575 [51320] = true,
|
yellowfive@57
|
576 [45652] = true,
|
yellowfive@57
|
577 [45651] = true,
|
yellowfive@57
|
578 [45650] = true,
|
yellowfive@57
|
579 [45649] = true,
|
yellowfive@57
|
580 [45648] = true,
|
yellowfive@57
|
581 [45647] = true,
|
yellowfive@57
|
582 [45643] = true,
|
yellowfive@57
|
583 [45642] = true,
|
yellowfive@57
|
584 [45641] = true,
|
yellowfive@57
|
585 [40630] = true,
|
yellowfive@57
|
586 [40629] = true,
|
yellowfive@57
|
587 [40628] = true,
|
yellowfive@57
|
588 [40621] = true,
|
yellowfive@57
|
589 [40620] = true,
|
yellowfive@57
|
590 [40619] = true,
|
yellowfive@57
|
591 [40618] = true,
|
yellowfive@57
|
592 [40617] = true,
|
yellowfive@57
|
593 [40616] = true,
|
yellowfive@57
|
594 [34544] = true,
|
yellowfive@57
|
595 [31100] = true,
|
yellowfive@57
|
596 [31099] = true,
|
yellowfive@57
|
597 [31098] = true,
|
yellowfive@57
|
598 [31097] = true,
|
yellowfive@57
|
599 [31096] = true,
|
yellowfive@57
|
600 [31095] = true,
|
yellowfive@57
|
601 [30247] = true,
|
yellowfive@57
|
602 [30246] = true,
|
yellowfive@57
|
603 [30245] = true,
|
yellowfive@57
|
604 [30244] = true,
|
yellowfive@57
|
605 [30243] = true,
|
yellowfive@57
|
606 [30242] = true,
|
yellowfive@57
|
607 [29767] = true,
|
yellowfive@57
|
608 [29766] = true,
|
yellowfive@57
|
609 [29765] = true,
|
yellowfive@57
|
610 [29761] = true,
|
yellowfive@57
|
611 [29760] = true,
|
yellowfive@57
|
612 [29759] = true
|
yellowfive@57
|
613 }
|
yellowfive@57
|
614
|
yellowfive@57
|
615
|
yellowfive@57
|
616 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
617 -- Public Utility Methods
|
yellowfive@57
|
618 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
619
|
yellowfive@81
|
620 local function readBonusIdList(parts, first, last)
|
yellowfive@81
|
621 local ret = {}
|
yellowfive@81
|
622 for i = first, last do
|
yellowfive@81
|
623 table.insert(ret, tonumber(parts[i]))
|
yellowfive@81
|
624 end
|
yellowfive@81
|
625 table.sort(ret)
|
yellowfive@81
|
626 return ret
|
yellowfive@81
|
627 end
|
yellowfive@81
|
628
|
yellowfive@81
|
629 local function setRelicId(item, index, relicBonuses)
|
yellowfive@81
|
630 local relicId = item.gemIds[index] .. ""
|
yellowfive@81
|
631 for i = 1, #relicBonuses do
|
yellowfive@81
|
632 relicId = relicId .. "." .. relicBonuses[i]
|
yellowfive@81
|
633 end
|
yellowfive@81
|
634 local list = item.gemItemIds or {}
|
yellowfive@81
|
635 list[i] = relicId
|
yellowfive@81
|
636 end
|
yellowfive@81
|
637
|
yellowfive@81
|
638 --|color|Hitem:135820:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:playerlevel:spec?:flags:11:numBonusIDs:bonusID1:bonusID2...:playerlevelwhengotitem, 296 for warrior artifact:upgrade ID?:num artifact bonuses?:artifact bonus 1:artifact bonus 2:artifact bonus 3:[item name]
|
yellowfive@81
|
639 -- 133004 for relic on my warrior, gem2
|
yellowfive@81
|
640 -- 296::3:767:1507:1809:[item name] this is for warrior artifact with the above relic in storm slot, for parts after the bonus IDs
|
yellowfive@81
|
641
|
yellowfive@81
|
642 --|cffa335ee|Hitem:itemID:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:level:unknown:unknown:instanceDifficultyID:numBonusIDs:bonusID1:bonusID2...|h[item name]|h|r
|
yellowfive@81
|
643
|
yellowfive@69
|
644 -- item link format: |cffa335ee|Hitem:itemID:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:level:unknown:unknown:instanceDifficultyID:numBonusIDs:bonusID1:bonusID2...|h[item name]|h|r
|
yellowfive@57
|
645 -- get an object with all of the parts of the item link format that we care about
|
yellowfive@57
|
646 function Amr.ParseItemLink(itemLink)
|
yellowfive@57
|
647 if not itemLink then return nil end
|
yellowfive@57
|
648
|
yellowfive@57
|
649 local str = string.match(itemLink, "|Hitem:([\-%d:]+)|")
|
yellowfive@57
|
650 if not str then return nil end
|
yellowfive@57
|
651
|
yellowfive@57
|
652 local parts = { strsplit(":", str) }
|
yellowfive@57
|
653
|
yellowfive@57
|
654 local item = {}
|
yellowfive@81
|
655 item.id = tonumber(parts[1]) or 0
|
yellowfive@81
|
656 item.enchantId = tonumber(parts[2]) or 0
|
yellowfive@81
|
657 item.gemIds = { tonumber(parts[3]) or 0, tonumber(parts[4]) or 0, tonumber(parts[5]) or 0, tonumber(parts[6]) or 0 }
|
yellowfive@81
|
658 item.suffixId = math.abs(tonumber(parts[7]) or 0) -- convert suffix to positive number, that's what we use in our code
|
yellowfive@81
|
659 -- part 8 is some unique ID... we never really used it
|
yellowfive@81
|
660 -- part 9 is current player level
|
yellowfive@81
|
661 -- part 10 is player spec
|
yellowfive@81
|
662 local upgradeIdType = tonumber(parts[11]) or 0 -- part 11 indicates what kind of upgrade ID is just after the bonus IDs
|
yellowfive@81
|
663 -- part 12 is instance difficulty id
|
yellowfive@57
|
664
|
yellowfive@81
|
665 local numBonuses = tonumber(parts[13]) or 0
|
yellowfive@81
|
666 local offset = numBonuses
|
yellowfive@81
|
667 if numBonuses > 0 then
|
yellowfive@81
|
668 item.bonusIds = readBonusIdList(parts, 14, 13 + numBonuses)
|
yellowfive@57
|
669 end
|
yellowfive@69
|
670
|
yellowfive@81
|
671 item.upgradeId = 0
|
yellowfive@81
|
672 item.level = 0
|
yellowfive@81
|
673
|
yellowfive@81
|
674 -- the next part after bonus IDs depends on the upgrade id type; is either the "drop level" or upgrade ID, or not sure for artifacts
|
yellowfive@81
|
675 if upgradeIdType == 4 then
|
yellowfive@81
|
676 item.upgradeId = tonumber(parts[14 + offset]) or 0
|
yellowfive@81
|
677 elseif upgradeIdType == 512 then
|
yellowfive@81
|
678 item.level = tonumber(parts[14 + offset]) or 0
|
yellowfive@69
|
679 end
|
yellowfive@81
|
680
|
yellowfive@81
|
681 -- ignore relic stuff in the item link for now, we read the relic information directly and save it with artifact power info
|
yellowfive@81
|
682 --[[
|
yellowfive@81
|
683 -- the next part is the number of bonus IDs on the first relic slot of the artifact
|
yellowfive@81
|
684 numBonuses = tonumber(parts[15 + offset]) or 0
|
yellowfive@81
|
685 if numBonuses > 0 then
|
yellowfive@81
|
686 local relicBonuses = readBonusIdList(16 + offset, 15 + offset + numBonuses, parts)
|
yellowfive@81
|
687 setRelicId(item, 1, relicBonuses)
|
yellowfive@81
|
688 end
|
yellowfive@81
|
689
|
yellowfive@81
|
690 -- second relic slot bonus IDs
|
yellowfive@81
|
691 offset = offset + numBonuses
|
yellowfive@81
|
692 numBonuses = tonumber(parts[16 + offset]) or 0
|
yellowfive@81
|
693 if numBonuses > 0 then
|
yellowfive@81
|
694 local relicBonuses = readBonusIdList(17 + offset, 16 + offset + numBonuses, parts)
|
yellowfive@81
|
695 setRelicId(item, 2, relicBonuses)
|
yellowfive@81
|
696 end
|
yellowfive@81
|
697
|
yellowfive@81
|
698 -- third relic slot bonus IDs
|
yellowfive@81
|
699 offset = offset + numBonuses
|
yellowfive@81
|
700 numBonuses = tonumber(parts[17 + offset]) or 0
|
yellowfive@81
|
701 if numBonuses > 0 then
|
yellowfive@81
|
702 local relicBonuses = readBonusIdList(18 + offset, 17 + offset + numBonuses, parts)
|
yellowfive@81
|
703 setRelicId(item, 3, relicBonuses)
|
yellowfive@81
|
704 end
|
yellowfive@81
|
705 ]]
|
yellowfive@81
|
706
|
yellowfive@57
|
707 return item
|
yellowfive@57
|
708 end
|
yellowfive@57
|
709
|
yellowfive@81
|
710 function Amr.GetItemUniqueId(item, noUpgrade)
|
yellowfive@81
|
711 if not item then return "" end
|
yellowfive@81
|
712 local ret = item.id .. ""
|
yellowfive@81
|
713 if item.bonusIds then
|
yellowfive@81
|
714 for i = 1, #item.bonusIds do
|
yellowfive@81
|
715 ret = ret .. "b" .. item.bonusIds[i]
|
yellowfive@81
|
716 end
|
yellowfive@81
|
717 end
|
yellowfive@81
|
718 if item.suffixId ~= 0 then
|
yellowfive@81
|
719 ret = ret .. "s" .. item.suffixId
|
yellowfive@81
|
720 end
|
yellowfive@81
|
721 if not noUpgrade and item.upgradeId ~= 0 then
|
yellowfive@81
|
722 ret = ret .. "u" .. item.upgradeId
|
yellowfive@81
|
723 end
|
yellowfive@81
|
724 if item.level ~= 0 then
|
yellowfive@81
|
725 ret = ret .. "v" .. item.level
|
yellowfive@81
|
726 end
|
yellowfive@81
|
727 return ret
|
yellowfive@81
|
728 end
|
yellowfive@81
|
729
|
yellowfive@57
|
730 -- returns true if this is an instance that AskMrRobot supports for logging
|
yellowfive@57
|
731 function Amr.IsSupportedInstanceId(instanceMapID)
|
yellowfive@91
|
732 for k,v in pairs(Amr.SupportedInstanceIds) do
|
yellowfive@91
|
733 local instanceId = GetAreaMapInfo(k)
|
yellowfive@91
|
734 if instanceId == tonumber(instanceMapID) then
|
yellowfive@91
|
735 return true
|
yellowfive@91
|
736 end
|
yellowfive@91
|
737 end
|
yellowfive@91
|
738 return false
|
yellowfive@91
|
739 --[[
|
yellowfive@57
|
740 if Amr.SupportedInstanceIds[tonumber(instanceMapID)] then
|
yellowfive@57
|
741 return true
|
yellowfive@57
|
742 else
|
yellowfive@57
|
743 return false
|
yellowfive@57
|
744 end
|
yellowfive@91
|
745 ]]
|
yellowfive@57
|
746 end
|
yellowfive@57
|
747
|
yellowfive@57
|
748 -- returns true if currently in a supported instance for logging
|
yellowfive@57
|
749 function Amr.IsSupportedInstance()
|
yellowfive@57
|
750 local zone, _, difficultyIndex, _, _, _, _, instanceMapID = GetInstanceInfo()
|
yellowfive@57
|
751 return Amr.IsSupportedInstanceId(instanceMapID)
|
yellowfive@57
|
752 end
|
yellowfive@57
|
753
|
yellowfive@81
|
754 -- helper to iterate over a table in order by its keys
|
yellowfive@81
|
755 local function spairs(t, order)
|
yellowfive@81
|
756 -- collect the keys
|
yellowfive@81
|
757 local keys = {}
|
yellowfive@81
|
758 for k in pairs(t) do keys[#keys+1] = k end
|
yellowfive@81
|
759
|
yellowfive@81
|
760 -- if order function given, sort by it by passing the table and keys a, b,
|
yellowfive@81
|
761 -- otherwise just sort the keys
|
yellowfive@81
|
762 if order then
|
yellowfive@81
|
763 table.sort(keys, function(a,b) return order(t, a, b) end)
|
yellowfive@81
|
764 else
|
yellowfive@81
|
765 table.sort(keys)
|
yellowfive@81
|
766 end
|
yellowfive@81
|
767
|
yellowfive@81
|
768 -- return the iterator function
|
yellowfive@81
|
769 local i = 0
|
yellowfive@81
|
770 return function()
|
yellowfive@81
|
771 i = i + 1
|
yellowfive@81
|
772 if keys[i] then
|
yellowfive@81
|
773 return keys[i], t[keys[i]]
|
yellowfive@81
|
774 end
|
yellowfive@81
|
775 end
|
yellowfive@81
|
776 end
|
yellowfive@81
|
777
|
yellowfive@81
|
778 -- scanning tooltip b/c for some odd reason the api has no way to get basic item properties...
|
yellowfive@81
|
779 -- so you have to generate a fake item tooltip and search for pre-defined strings in the display text
|
yellowfive@81
|
780 local _scanTt
|
yellowfive@81
|
781 function Amr.GetScanningTooltip()
|
yellowfive@81
|
782 if not _scanTt then
|
yellowfive@81
|
783 _scanTt = CreateFrame("GameTooltip", "AmrUiScanTooltip", nil, "GameTooltipTemplate")
|
yellowfive@81
|
784 _scanTt:SetOwner(UIParent, "ANCHOR_NONE")
|
yellowfive@81
|
785 end
|
yellowfive@81
|
786 return _scanTt
|
yellowfive@81
|
787 end
|
yellowfive@81
|
788
|
yellowfive@81
|
789 -- get the item tooltip for the specified item in one of your bags, or if bagId is nil, an equipped item, or if slotId is also nil, the specified item link
|
yellowfive@81
|
790 function Amr.GetItemTooltip(bagId, slotId, link)
|
yellowfive@81
|
791 local tt = Amr.GetScanningTooltip()
|
yellowfive@81
|
792 tt:ClearLines()
|
yellowfive@81
|
793 if bagId then
|
yellowfive@81
|
794 tt:SetBagItem(bagId, slotId)
|
yellowfive@81
|
795 elseif slotId then
|
yellowfive@81
|
796 tt:SetInventoryItem("player", slotId)
|
yellowfive@81
|
797 else
|
yellowfive@81
|
798 tt:SetHyperlink(link)
|
yellowfive@81
|
799 end
|
yellowfive@81
|
800 return tt
|
yellowfive@81
|
801 end
|
yellowfive@81
|
802
|
yellowfive@81
|
803 function Amr.GetItemLevel(bagId, slotId, link)
|
yellowfive@81
|
804 local itemLevelPattern = _G["ITEM_LEVEL"]:gsub("%%d", "(%%d+)")
|
yellowfive@81
|
805 local tt = Amr.GetItemTooltip(bagId, slotId, link)
|
yellowfive@81
|
806
|
yellowfive@81
|
807 local regions = { tt:GetRegions() }
|
yellowfive@81
|
808 for i, region in ipairs(regions) do
|
yellowfive@81
|
809 if region and region:GetObjectType() == "FontString" then
|
yellowfive@81
|
810 local text = region:GetText()
|
yellowfive@81
|
811 if text then
|
yellowfive@81
|
812 ilvl = tonumber(text:match(itemLevelPattern))
|
yellowfive@81
|
813 if ilvl then
|
yellowfive@81
|
814 return ilvl
|
yellowfive@81
|
815 end
|
yellowfive@81
|
816 end
|
yellowfive@81
|
817 end
|
yellowfive@81
|
818 end
|
yellowfive@81
|
819
|
yellowfive@81
|
820 -- 0 means we couldn't find it for whatever reason
|
yellowfive@81
|
821 return 0
|
yellowfive@81
|
822 end
|
yellowfive@81
|
823
|
yellowfive@57
|
824
|
yellowfive@57
|
825 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
826 -- Character Reading
|
yellowfive@57
|
827 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
828
|
yellowfive@57
|
829 local function readProfessionInfo(prof, ret)
|
yellowfive@57
|
830 if prof then
|
yellowfive@57
|
831 local name, icon, skillLevel, maxSkillLevel, numAbilities, spelloffset, skillLine, skillModifier = GetProfessionInfo(prof);
|
yellowfive@57
|
832 if Amr.ProfessionSkillLineToName[skillLine] ~= nil then
|
yellowfive@57
|
833 ret.Professions[Amr.ProfessionSkillLineToName[skillLine]] = skillLevel;
|
yellowfive@57
|
834 end
|
yellowfive@57
|
835 end
|
yellowfive@57
|
836 end
|
yellowfive@57
|
837
|
yellowfive@81
|
838 --[[
|
yellowfive@81
|
839 local function getTalents(specPos)
|
yellowfive@57
|
840 local talentInfo = {}
|
yellowfive@57
|
841 local maxTiers = 7
|
yellowfive@57
|
842 for tier = 1, maxTiers do
|
yellowfive@57
|
843 for col = 1, 3 do
|
yellowfive@81
|
844 local id, name, _, _, _, spellId, _, t, c, selected = GetTalentInfoBySpecialization(specPos, tier, col)
|
yellowfive@57
|
845 if selected then
|
yellowfive@57
|
846 talentInfo[tier] = col
|
yellowfive@57
|
847 end
|
yellowfive@57
|
848 end
|
yellowfive@57
|
849 end
|
yellowfive@57
|
850
|
yellowfive@57
|
851 local str = ""
|
yellowfive@57
|
852 for i = 1, maxTiers do
|
yellowfive@57
|
853 if talentInfo[i] then
|
yellowfive@57
|
854 str = str .. talentInfo[i]
|
yellowfive@57
|
855 else
|
yellowfive@57
|
856 str = str .. '0'
|
yellowfive@57
|
857 end
|
yellowfive@57
|
858 end
|
yellowfive@57
|
859
|
yellowfive@57
|
860 return str
|
yellowfive@57
|
861 end
|
yellowfive@81
|
862 ]]
|
yellowfive@57
|
863
|
yellowfive@81
|
864 --[[
|
yellowfive@57
|
865 local function getGlyphs(specGroup)
|
yellowfive@57
|
866 local glyphs = {}
|
yellowfive@57
|
867 for i = 1, NUM_GLYPH_SLOTS do
|
yellowfive@57
|
868 local _, _, _, glyphSpellID, _, glyphID = GetGlyphSocketInfo(i, specGroup)
|
yellowfive@57
|
869 if (glyphID) then
|
yellowfive@57
|
870 table.insert(glyphs, glyphSpellID)
|
yellowfive@57
|
871 end
|
yellowfive@57
|
872 end
|
yellowfive@57
|
873 return glyphs;
|
yellowfive@57
|
874 end
|
yellowfive@81
|
875 ]]
|
yellowfive@57
|
876
|
yellowfive@81
|
877 -- get specs and talents
|
yellowfive@81
|
878 local function readSpecs(ret)
|
yellowfive@57
|
879
|
yellowfive@81
|
880 for pos = 1, 4 do
|
yellowfive@57
|
881 -- spec, convert game spec id to one of our spec ids
|
yellowfive@81
|
882 local specId = GetSpecializationInfo(pos)
|
yellowfive@57
|
883 if specId then
|
yellowfive@81
|
884 ret.Specs[pos] = Amr.SpecIds[specId]
|
yellowfive@81
|
885 -- TODO: figure out how to read inactive spec talents if possible... used to be able to but they changed it
|
yellowfive@81
|
886 --ret.Talents[pos] = getTalents(pos)
|
yellowfive@57
|
887 end
|
yellowfive@57
|
888 end
|
yellowfive@57
|
889 end
|
yellowfive@57
|
890
|
yellowfive@81
|
891 -- TODO: hopefully we can read artifact here when there is an API to get info when the artifact UI is not open
|
yellowfive@81
|
892 -- get artifact info
|
yellowfive@81
|
893 local function readArtifact()
|
yellowfive@81
|
894
|
yellowfive@81
|
895 end
|
yellowfive@81
|
896
|
yellowfive@57
|
897 -- get currently equipped items, store with currently active spec
|
yellowfive@57
|
898 local function readEquippedItems(ret)
|
yellowfive@57
|
899 local equippedItems = {};
|
yellowfive@57
|
900 for slotNum = 1, #Amr.SlotIds do
|
yellowfive@57
|
901 local slotId = Amr.SlotIds[slotNum]
|
yellowfive@57
|
902 local itemLink = GetInventoryItemLink("player", slotId)
|
yellowfive@57
|
903 if itemLink then
|
yellowfive@57
|
904 equippedItems[slotId] = itemLink
|
yellowfive@57
|
905 end
|
yellowfive@57
|
906 end
|
yellowfive@57
|
907
|
yellowfive@57
|
908 -- store last-seen equipped gear for each spec
|
yellowfive@81
|
909 ret.Equipped[GetSpecialization()] = equippedItems
|
yellowfive@57
|
910 end
|
yellowfive@57
|
911
|
yellowfive@57
|
912 -- Get all data about the player as an object, includes:
|
yellowfive@57
|
913 -- serializer version
|
yellowfive@57
|
914 -- region/realm/name
|
yellowfive@57
|
915 -- guild
|
yellowfive@57
|
916 -- race
|
yellowfive@57
|
917 -- faction
|
yellowfive@57
|
918 -- level
|
yellowfive@57
|
919 -- professions
|
yellowfive@81
|
920 -- spec/talent for all specs
|
yellowfive@81
|
921 -- artifact for current spec
|
yellowfive@57
|
922 -- equipped gear for the current spec
|
yellowfive@57
|
923 --
|
yellowfive@81
|
924 function Amr:GetPlayerData()
|
yellowfive@57
|
925
|
yellowfive@57
|
926 local ret = {}
|
yellowfive@57
|
927
|
yellowfive@57
|
928 ret.Region = Amr.RegionNames[GetCurrentRegion()]
|
yellowfive@57
|
929 ret.Realm = GetRealmName()
|
yellowfive@57
|
930 ret.Name = UnitName("player")
|
yellowfive@57
|
931 ret.Guild = GetGuildInfo("player")
|
yellowfive@81
|
932 ret.ActiveSpec = GetSpecialization()
|
yellowfive@57
|
933 ret.Level = UnitLevel("player");
|
yellowfive@57
|
934
|
yellowfive@57
|
935 local cls, clsEn = UnitClass("player")
|
yellowfive@57
|
936 ret.Class = clsEn;
|
yellowfive@57
|
937
|
yellowfive@57
|
938 local race, raceEn = UnitRace("player")
|
yellowfive@57
|
939 ret.Race = raceEn;
|
yellowfive@57
|
940 ret.Faction = UnitFactionGroup("player")
|
yellowfive@57
|
941
|
yellowfive@57
|
942 ret.Professions = {};
|
yellowfive@57
|
943 local prof1, prof2, archaeology, fishing, cooking, firstAid = GetProfessions();
|
yellowfive@57
|
944 readProfessionInfo(prof1, ret)
|
yellowfive@57
|
945 readProfessionInfo(prof2, ret)
|
yellowfive@57
|
946 readProfessionInfo(archaeology, ret)
|
yellowfive@57
|
947 readProfessionInfo(fishing, ret)
|
yellowfive@57
|
948 readProfessionInfo(cooking, ret)
|
yellowfive@57
|
949 readProfessionInfo(firstAid, ret)
|
yellowfive@57
|
950
|
yellowfive@57
|
951 ret.Specs = {}
|
yellowfive@57
|
952 ret.Talents = {}
|
yellowfive@81
|
953 readSpecs(ret)
|
yellowfive@81
|
954
|
yellowfive@81
|
955 ret.Artifacts = {}
|
yellowfive@81
|
956 readArtifact()
|
yellowfive@57
|
957
|
yellowfive@57
|
958 ret.Equipped = {}
|
yellowfive@57
|
959 readEquippedItems(ret)
|
yellowfive@57
|
960
|
yellowfive@57
|
961 return ret
|
yellowfive@57
|
962 end
|
yellowfive@57
|
963
|
yellowfive@57
|
964
|
yellowfive@57
|
965 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
966 -- Serialization
|
yellowfive@57
|
967 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
968
|
yellowfive@57
|
969 local function toCompressedNumberList(list)
|
yellowfive@57
|
970 -- ensure the values are numbers, sorted from lowest to highest
|
yellowfive@57
|
971 local nums = {}
|
yellowfive@57
|
972 for i, v in ipairs(list) do
|
yellowfive@57
|
973 table.insert(nums, tonumber(v))
|
yellowfive@57
|
974 end
|
yellowfive@57
|
975 table.sort(nums)
|
yellowfive@57
|
976
|
yellowfive@57
|
977 local ret = {}
|
yellowfive@57
|
978 local prev = 0
|
yellowfive@57
|
979 for i, v in ipairs(nums) do
|
yellowfive@57
|
980 local diff = v - prev
|
yellowfive@57
|
981 table.insert(ret, diff)
|
yellowfive@57
|
982 prev = v
|
yellowfive@57
|
983 end
|
yellowfive@57
|
984
|
yellowfive@57
|
985 return table.concat(ret, ",")
|
yellowfive@57
|
986 end
|
yellowfive@57
|
987
|
yellowfive@57
|
988 -- make this utility publicly available
|
yellowfive@57
|
989 function Amr:ToCompressedNumberList(list)
|
yellowfive@57
|
990 return toCompressedNumberList(list)
|
yellowfive@57
|
991 end
|
yellowfive@57
|
992
|
yellowfive@57
|
993 -- appends a list of items to the export
|
yellowfive@57
|
994 local function appendItemsToExport(fields, itemObjects)
|
yellowfive@57
|
995
|
yellowfive@57
|
996 -- sort by item id so we can compress it more easily
|
yellowfive@57
|
997 table.sort(itemObjects, function(a, b) return a.id < b.id end)
|
yellowfive@57
|
998
|
yellowfive@57
|
999 -- append to the export string
|
yellowfive@57
|
1000 local prevItemId = 0
|
yellowfive@57
|
1001 local prevGemId = 0
|
yellowfive@57
|
1002 local prevEnchantId = 0
|
yellowfive@57
|
1003 local prevUpgradeId = 0
|
yellowfive@57
|
1004 local prevBonusId = 0
|
yellowfive@81
|
1005 local prevLevel = 0
|
yellowfive@57
|
1006 for i, itemData in ipairs(itemObjects) do
|
yellowfive@57
|
1007 local itemParts = {}
|
yellowfive@57
|
1008
|
yellowfive@81
|
1009 -- for now export the item level of artifacts as the "drop level" because it is a pain in the ass to figure it out from the bonus IDs
|
yellowfive@81
|
1010 --local _, _, quality = GetItemInfo(itemData.link)
|
yellowfive@81
|
1011 --if quality == 6 then
|
yellowfive@81
|
1012 -- itemData.level = Amr.GetItemLevel(nil, nil, itemData.link)
|
yellowfive@81
|
1013 --end
|
yellowfive@81
|
1014
|
yellowfive@57
|
1015 table.insert(itemParts, itemData.id - prevItemId)
|
yellowfive@57
|
1016 prevItemId = itemData.id
|
yellowfive@57
|
1017
|
yellowfive@57
|
1018 if itemData.slot ~= nil then table.insert(itemParts, "s" .. itemData.slot) end
|
yellowfive@57
|
1019 if itemData.suffixId ~= 0 then table.insert(itemParts, "f" .. itemData.suffixId) end
|
yellowfive@57
|
1020 if itemData.upgradeId ~= 0 then
|
yellowfive@57
|
1021 table.insert(itemParts, "u" .. (itemData.upgradeId - prevUpgradeId))
|
yellowfive@57
|
1022 prevUpgradeId = itemData.upgradeId
|
yellowfive@57
|
1023 end
|
yellowfive@81
|
1024 if itemData.level ~= 0 then
|
yellowfive@81
|
1025 table.insert(itemParts, "v" .. (itemData.level - prevLevel))
|
yellowfive@81
|
1026 prevLevel = itemData.level
|
yellowfive@81
|
1027 end
|
yellowfive@57
|
1028 if itemData.bonusIds then
|
yellowfive@57
|
1029 for bIndex, bValue in ipairs(itemData.bonusIds) do
|
yellowfive@57
|
1030 table.insert(itemParts, "b" .. (bValue - prevBonusId))
|
yellowfive@57
|
1031 prevBonusId = bValue
|
yellowfive@57
|
1032 end
|
yellowfive@57
|
1033 end
|
yellowfive@81
|
1034
|
yellowfive@81
|
1035 if itemData.gemIds[1] ~= 0 then
|
yellowfive@81
|
1036 table.insert(itemParts, "x" .. (itemData.gemIds[1] - prevGemId))
|
yellowfive@81
|
1037 prevGemId = itemData.gemIds[1]
|
yellowfive@81
|
1038 end
|
yellowfive@81
|
1039 if itemData.gemIds[2] ~= 0 then
|
yellowfive@81
|
1040 table.insert(itemParts, "y" .. (itemData.gemIds[2] - prevGemId))
|
yellowfive@81
|
1041 prevGemId = itemData.gemIds[2]
|
yellowfive@81
|
1042 end
|
yellowfive@81
|
1043 if itemData.gemIds[3] ~= 0 then
|
yellowfive@81
|
1044 table.insert(itemParts, "z" .. (itemData.gemIds[3] - prevGemId))
|
yellowfive@81
|
1045 prevGemId = itemData.gemIds[3]
|
yellowfive@81
|
1046 end
|
yellowfive@81
|
1047
|
yellowfive@57
|
1048 if itemData.enchantId ~= 0 then
|
yellowfive@57
|
1049 table.insert(itemParts, "e" .. (itemData.enchantId - prevEnchantId))
|
yellowfive@57
|
1050 prevEnchantId = itemData.enchantId
|
yellowfive@57
|
1051 end
|
yellowfive@57
|
1052
|
yellowfive@57
|
1053 table.insert(fields, table.concat(itemParts, ""))
|
yellowfive@57
|
1054 end
|
yellowfive@57
|
1055 end
|
yellowfive@57
|
1056
|
yellowfive@57
|
1057 -- Serialize just the identity portion of a player (region/realm/name) in the same format used by the full serialization
|
yellowfive@57
|
1058 function Amr:SerializePlayerIdentity(data)
|
yellowfive@57
|
1059 local fields = {}
|
yellowfive@57
|
1060 table.insert(fields, MINOR)
|
yellowfive@57
|
1061 table.insert(fields, data.Region)
|
yellowfive@57
|
1062 table.insert(fields, data.Realm)
|
yellowfive@57
|
1063 table.insert(fields, data.Name)
|
yellowfive@57
|
1064 return "$" .. table.concat(fields, ";") .. "$"
|
yellowfive@57
|
1065 end
|
yellowfive@57
|
1066
|
yellowfive@57
|
1067 -- Serialize player data gathered by GetPlayerData. This can be augmented with extra data if desired (augmenting used mainly by AskMrRobot addon).
|
yellowfive@57
|
1068 -- Pass complete = true to do a complete export of this extra information, otherwise it is ignored.
|
yellowfive@57
|
1069 -- Extra data can include:
|
yellowfive@57
|
1070 -- equipped gear for the player's inactive spec, slot id to item link dictionary
|
yellowfive@57
|
1071 -- Reputations
|
yellowfive@57
|
1072 -- BagItems, BankItems, VoidItems, lists of item links
|
yellowfive@57
|
1073 --
|
yellowfive@57
|
1074 function Amr:SerializePlayerData(data, complete)
|
yellowfive@57
|
1075
|
yellowfive@57
|
1076 local fields = {}
|
yellowfive@57
|
1077
|
yellowfive@57
|
1078 -- compressed string uses a fixed order rather than inserting identifiers
|
yellowfive@57
|
1079 table.insert(fields, MINOR)
|
yellowfive@57
|
1080 table.insert(fields, data.Region)
|
yellowfive@57
|
1081 table.insert(fields, data.Realm)
|
yellowfive@57
|
1082 table.insert(fields, data.Name)
|
yellowfive@57
|
1083
|
yellowfive@57
|
1084 -- guild name
|
yellowfive@57
|
1085 if data.Guild == nil then
|
yellowfive@57
|
1086 table.insert(fields, "")
|
yellowfive@57
|
1087 else
|
yellowfive@57
|
1088 table.insert(fields, data.Guild)
|
yellowfive@57
|
1089 end
|
yellowfive@57
|
1090
|
yellowfive@57
|
1091 -- race, default to pandaren if we can't read it for some reason
|
yellowfive@57
|
1092 local raceval = Amr.RaceIds[data.Race]
|
yellowfive@57
|
1093 if raceval == nil then raceval = 13 end
|
yellowfive@57
|
1094 table.insert(fields, raceval)
|
yellowfive@57
|
1095
|
yellowfive@57
|
1096 -- faction, default to alliance if we can't read it for some reason
|
yellowfive@57
|
1097 raceval = Amr.FactionIds[data.Faction]
|
yellowfive@57
|
1098 if raceval == nil then raceval = 1 end
|
yellowfive@57
|
1099 table.insert(fields, raceval)
|
yellowfive@57
|
1100
|
yellowfive@57
|
1101 table.insert(fields, data.Level)
|
yellowfive@57
|
1102
|
yellowfive@57
|
1103 local profs = {}
|
yellowfive@57
|
1104 local noprofs = true
|
yellowfive@57
|
1105 if data.Professions then
|
yellowfive@57
|
1106 for k, v in pairs(data.Professions) do
|
yellowfive@57
|
1107 local profval = Amr.ProfessionIds[k]
|
yellowfive@57
|
1108 if profval ~= nil then
|
yellowfive@57
|
1109 noprofs = false
|
yellowfive@57
|
1110 table.insert(profs, profval .. ":" .. v)
|
yellowfive@57
|
1111 end
|
yellowfive@57
|
1112 end
|
yellowfive@57
|
1113 end
|
yellowfive@57
|
1114
|
yellowfive@57
|
1115 if noprofs then
|
yellowfive@57
|
1116 table.insert(profs, "0:0")
|
yellowfive@57
|
1117 end
|
yellowfive@57
|
1118
|
yellowfive@57
|
1119 table.insert(fields, table.concat(profs, ","))
|
yellowfive@57
|
1120
|
yellowfive@57
|
1121 -- export specs
|
yellowfive@57
|
1122 table.insert(fields, data.ActiveSpec)
|
yellowfive@81
|
1123 for spec = 1, 4 do
|
yellowfive@57
|
1124 if data.Specs[spec] and (complete or spec == data.ActiveSpec) then
|
yellowfive@57
|
1125 table.insert(fields, ".s" .. spec) -- indicates the start of a spec block
|
yellowfive@81
|
1126 table.insert(fields, data.Specs[spec])
|
yellowfive@91
|
1127 table.insert(fields, data.Talents[spec] or "")
|
yellowfive@57
|
1128
|
yellowfive@81
|
1129 local powerids = {}
|
yellowfive@81
|
1130 local powerranks = {}
|
yellowfive@81
|
1131 local reliclinks = {}
|
yellowfive@81
|
1132
|
yellowfive@81
|
1133 local artifactInfo = data.Artifacts and data.Artifacts[spec]
|
yellowfive@81
|
1134 if artifactInfo and artifactInfo.Powers then
|
yellowfive@81
|
1135 for k, v in spairs(artifactInfo.Powers) do
|
yellowfive@81
|
1136 table.insert(powerids, k)
|
yellowfive@81
|
1137 table.insert(powerranks, v)
|
yellowfive@81
|
1138 end
|
yellowfive@81
|
1139 end
|
yellowfive@81
|
1140 if artifactInfo and artifactInfo.Relics then
|
yellowfive@81
|
1141 for i, link in ipairs(artifactInfo.Relics) do
|
yellowfive@81
|
1142 local relic = Amr.ParseItemLink(link)
|
yellowfive@81
|
1143 table.insert(reliclinks, Amr.GetItemUniqueId(relic) or "")
|
yellowfive@81
|
1144 end
|
yellowfive@57
|
1145 end
|
yellowfive@57
|
1146
|
yellowfive@81
|
1147 table.insert(fields, toCompressedNumberList(powerids))
|
yellowfive@81
|
1148 table.insert(fields, table.concat(powerranks, ","))
|
yellowfive@81
|
1149 table.insert(fields, table.concat(reliclinks, ","))
|
yellowfive@81
|
1150
|
yellowfive@81
|
1151 --table.insert(fields, toCompressedNumberList(data.Glyphs[spec]))
|
yellowfive@57
|
1152 end
|
yellowfive@57
|
1153 end
|
yellowfive@57
|
1154
|
yellowfive@57
|
1155 -- export equipped gear
|
yellowfive@57
|
1156 if data.Equipped then
|
yellowfive@81
|
1157 for spec = 1, 4 do
|
yellowfive@57
|
1158 if data.Equipped[spec] and (complete or spec == data.ActiveSpec) then
|
yellowfive@57
|
1159 table.insert(fields, ".q" .. spec) -- indicates the start of an equipped gear block
|
yellowfive@57
|
1160
|
yellowfive@57
|
1161 local itemObjects = {}
|
yellowfive@57
|
1162 for k, v in pairs(data.Equipped[spec]) do
|
yellowfive@57
|
1163 local itemData = Amr.ParseItemLink(v)
|
yellowfive@57
|
1164 itemData.slot = k
|
yellowfive@81
|
1165 itemData.link = v
|
yellowfive@57
|
1166 table.insert(itemObjects, itemData)
|
yellowfive@57
|
1167 end
|
yellowfive@57
|
1168
|
yellowfive@57
|
1169 appendItemsToExport(fields, itemObjects)
|
yellowfive@57
|
1170 end
|
yellowfive@57
|
1171 end
|
yellowfive@57
|
1172 end
|
yellowfive@57
|
1173
|
yellowfive@57
|
1174 -- if doing a complete export, include reputations and bank/bag items too
|
yellowfive@57
|
1175 if complete then
|
yellowfive@57
|
1176
|
yellowfive@57
|
1177 -- export reputations
|
yellowfive@57
|
1178 local reps = {}
|
yellowfive@91
|
1179 table.insert(reps, "_")
|
yellowfive@91
|
1180 --[[
|
yellowfive@57
|
1181 local noreps = true
|
yellowfive@57
|
1182 if data.Reputations then
|
yellowfive@57
|
1183 for k, v in pairs(data.Reputations) do
|
yellowfive@57
|
1184 noreps = false
|
yellowfive@57
|
1185 table.insert(reps, k .. ":" .. v)
|
yellowfive@57
|
1186 end
|
yellowfive@57
|
1187 end
|
yellowfive@57
|
1188 if noreps then
|
yellowfive@57
|
1189 table.insert(reps, "_")
|
yellowfive@57
|
1190 end
|
yellowfive@91
|
1191 ]]
|
yellowfive@91
|
1192
|
yellowfive@57
|
1193 table.insert(fields, ".r")
|
yellowfive@57
|
1194 table.insert(fields, table.concat(reps, ","))
|
yellowfive@57
|
1195
|
yellowfive@57
|
1196 -- export bag and bank
|
yellowfive@57
|
1197 local itemObjects = {}
|
yellowfive@57
|
1198 if data.BagItems then
|
yellowfive@57
|
1199 for i, v in ipairs(data.BagItems) do
|
yellowfive@57
|
1200 local itemData = Amr.ParseItemLink(v)
|
yellowfive@85
|
1201 if itemData ~= nil --[[and (IsEquippableItem(v) or Amr.SetTokenIds[itemData.id])]] then
|
yellowfive@81
|
1202 itemData.link = v
|
yellowfive@57
|
1203 table.insert(itemObjects, itemData)
|
yellowfive@57
|
1204 end
|
yellowfive@57
|
1205 end
|
yellowfive@57
|
1206 end
|
yellowfive@57
|
1207 if data.BankItems then
|
yellowfive@57
|
1208 for i, v in ipairs(data.BankItems) do
|
yellowfive@57
|
1209 local itemData = Amr.ParseItemLink(v)
|
yellowfive@85
|
1210 if itemData ~= nil --[[and (IsEquippableItem(v) or Amr.SetTokenIds[itemData.id])]] then
|
yellowfive@81
|
1211 itemData.link = v
|
yellowfive@57
|
1212 table.insert(itemObjects, itemData)
|
yellowfive@57
|
1213 end
|
yellowfive@57
|
1214 end
|
yellowfive@57
|
1215 end
|
yellowfive@57
|
1216 if data.VoidItems then
|
yellowfive@57
|
1217 for i, v in ipairs(data.VoidItems) do
|
yellowfive@57
|
1218 local itemData = Amr.ParseItemLink(v)
|
yellowfive@85
|
1219 if itemData ~= nil --[[and (IsEquippableItem(v) or Amr.SetTokenIds[itemData.id])]] then
|
yellowfive@81
|
1220 itemData.link = v
|
yellowfive@57
|
1221 table.insert(itemObjects, itemData)
|
yellowfive@57
|
1222 end
|
yellowfive@57
|
1223 end
|
yellowfive@57
|
1224 end
|
yellowfive@57
|
1225
|
yellowfive@57
|
1226 table.insert(fields, ".inv")
|
yellowfive@57
|
1227 appendItemsToExport(fields, itemObjects)
|
yellowfive@57
|
1228 end
|
yellowfive@57
|
1229
|
yellowfive@57
|
1230 return "$" .. table.concat(fields, ";") .. "$"
|
yellowfive@57
|
1231
|
yellowfive@57
|
1232 end
|
yellowfive@57
|
1233
|
yellowfive@57
|
1234 -- Shortcut for the common use case: serialize the player's currently active setup with no extras.
|
yellowfive@57
|
1235 function Amr:SerializePlayer()
|
yellowfive@57
|
1236 local data = self:GetPlayerData()
|
yellowfive@57
|
1237 return self:SerializePlayerData(data)
|
yellowfive@57
|
1238 end
|
yellowfive@57
|
1239
|
yellowfive@81
|
1240 --[[
|
yellowfive@57
|
1241 ----------------------------------------------------------------------------------------------------------------------
|
yellowfive@57
|
1242 -- Character Snapshots
|
yellowfive@81
|
1243 -- This feature snapshots a player's gear/talents/artifact when entering combat. It is enabled by default. Consumers
|
yellowfive@57
|
1244 -- of this library can create a setting to enable/disable it as desired per a user setting.
|
yellowfive@57
|
1245 --
|
yellowfive@57
|
1246 -- You should register for the AMR_SNAPSHOT_STATE_CHANGED message (sent via AceEvent-3.0 messaging) to ensure that
|
yellowfive@57
|
1247 -- your addon settings stay in sync with any other addon that may also be trying to control the enabled state.
|
yellowfive@57
|
1248 --
|
yellowfive@57
|
1249 -- Note that if a user has the main AMR addon installed, it will always enable snapshotting, and override any attempt
|
yellowfive@57
|
1250 -- to disable it by immediately re-enabling it and thus re-triggering AMR_SNAPSHOT_STATE_CHANGED.
|
yellowfive@57
|
1251 ----------------------------------------------------------------------------------------------------------------------
|
yellowfive@57
|
1252 Amr._snapshotEnabled = true
|
yellowfive@57
|
1253
|
yellowfive@57
|
1254 -- Enable snapshotting of character data when entering combat. Sends this player's character data to anyone logging with the AskMrRobot addon.
|
yellowfive@57
|
1255 function Amr:EnableSnapshots()
|
yellowfive@57
|
1256 self._snapshotEnabled = true
|
yellowfive@57
|
1257 self:SendMessage("AMR_SNAPSHOT_STATE_CHANGED", self._snapshotEnabled)
|
yellowfive@57
|
1258 end
|
yellowfive@57
|
1259
|
yellowfive@57
|
1260 -- Disable snapshotting of character data when entering combat.
|
yellowfive@57
|
1261 function Amr:DisableSnapshots()
|
yellowfive@57
|
1262 self._snapshotEnabled = false
|
yellowfive@57
|
1263 self:SendMessage("AMR_SNAPSHOT_STATE_CHANGED", self._snapshotEnabled)
|
yellowfive@57
|
1264 end
|
yellowfive@57
|
1265
|
yellowfive@57
|
1266 function Amr:IsSnapshotEnabled()
|
yellowfive@57
|
1267 return self._snapshotEnabled
|
yellowfive@57
|
1268 end
|
yellowfive@57
|
1269
|
yellowfive@57
|
1270
|
yellowfive@57
|
1271 function Amr:PLAYER_REGEN_DISABLED()
|
yellowfive@57
|
1272 --function Amr:GARRISON_MISSION_NPC_OPENED()
|
yellowfive@57
|
1273
|
yellowfive@57
|
1274 -- send data about this character when a player enters combat in a supported zone
|
yellowfive@57
|
1275 if self._snapshotEnabled and Amr.IsSupportedInstance() then
|
yellowfive@57
|
1276 local t = time()
|
yellowfive@57
|
1277 local player = self:GetPlayerData()
|
yellowfive@57
|
1278 local msg = self:SerializePlayerData(player)
|
yellowfive@57
|
1279 msg = string.format("%s\r%s\n%s\n%s\n%s\n%s", MINOR, t, player.Region, player.Realm, player.Name, msg)
|
yellowfive@57
|
1280
|
yellowfive@57
|
1281 self:SendCommMessage(Amr.ChatPrefix, msg, "RAID")
|
yellowfive@57
|
1282 end
|
yellowfive@57
|
1283 end
|
yellowfive@57
|
1284
|
yellowfive@57
|
1285 Amr:RegisterEvent("PLAYER_REGEN_DISABLED")
|
yellowfive@81
|
1286 --Amr:RegisterEvent("GARRISON_MISSION_NPC_OPENED") -- for debugging, fire this event when open mission table
|
yellowfive@81
|
1287 ]] |