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@93
|
4 local MAJOR, MINOR = "AskMrRobot-Serializer", 44
|
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@93
|
150 EmeraldNightmare = 1520,
|
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@93
|
156 [1520] = true,
|
yellowfive@93
|
157 [1530] = 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@57
|
732 if Amr.SupportedInstanceIds[tonumber(instanceMapID)] then
|
yellowfive@57
|
733 return true
|
yellowfive@57
|
734 else
|
yellowfive@57
|
735 return false
|
yellowfive@57
|
736 end
|
yellowfive@57
|
737 end
|
yellowfive@57
|
738
|
yellowfive@57
|
739 -- returns true if currently in a supported instance for logging
|
yellowfive@57
|
740 function Amr.IsSupportedInstance()
|
yellowfive@57
|
741 local zone, _, difficultyIndex, _, _, _, _, instanceMapID = GetInstanceInfo()
|
yellowfive@57
|
742 return Amr.IsSupportedInstanceId(instanceMapID)
|
yellowfive@57
|
743 end
|
yellowfive@57
|
744
|
yellowfive@81
|
745 -- helper to iterate over a table in order by its keys
|
yellowfive@81
|
746 local function spairs(t, order)
|
yellowfive@81
|
747 -- collect the keys
|
yellowfive@81
|
748 local keys = {}
|
yellowfive@81
|
749 for k in pairs(t) do keys[#keys+1] = k end
|
yellowfive@81
|
750
|
yellowfive@81
|
751 -- if order function given, sort by it by passing the table and keys a, b,
|
yellowfive@81
|
752 -- otherwise just sort the keys
|
yellowfive@81
|
753 if order then
|
yellowfive@81
|
754 table.sort(keys, function(a,b) return order(t, a, b) end)
|
yellowfive@81
|
755 else
|
yellowfive@81
|
756 table.sort(keys)
|
yellowfive@81
|
757 end
|
yellowfive@81
|
758
|
yellowfive@81
|
759 -- return the iterator function
|
yellowfive@81
|
760 local i = 0
|
yellowfive@81
|
761 return function()
|
yellowfive@81
|
762 i = i + 1
|
yellowfive@81
|
763 if keys[i] then
|
yellowfive@81
|
764 return keys[i], t[keys[i]]
|
yellowfive@81
|
765 end
|
yellowfive@81
|
766 end
|
yellowfive@81
|
767 end
|
yellowfive@81
|
768
|
yellowfive@81
|
769 -- scanning tooltip b/c for some odd reason the api has no way to get basic item properties...
|
yellowfive@81
|
770 -- so you have to generate a fake item tooltip and search for pre-defined strings in the display text
|
yellowfive@81
|
771 local _scanTt
|
yellowfive@81
|
772 function Amr.GetScanningTooltip()
|
yellowfive@81
|
773 if not _scanTt then
|
yellowfive@81
|
774 _scanTt = CreateFrame("GameTooltip", "AmrUiScanTooltip", nil, "GameTooltipTemplate")
|
yellowfive@81
|
775 _scanTt:SetOwner(UIParent, "ANCHOR_NONE")
|
yellowfive@81
|
776 end
|
yellowfive@81
|
777 return _scanTt
|
yellowfive@81
|
778 end
|
yellowfive@81
|
779
|
yellowfive@81
|
780 -- 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
|
781 function Amr.GetItemTooltip(bagId, slotId, link)
|
yellowfive@81
|
782 local tt = Amr.GetScanningTooltip()
|
yellowfive@81
|
783 tt:ClearLines()
|
yellowfive@81
|
784 if bagId then
|
yellowfive@81
|
785 tt:SetBagItem(bagId, slotId)
|
yellowfive@81
|
786 elseif slotId then
|
yellowfive@81
|
787 tt:SetInventoryItem("player", slotId)
|
yellowfive@81
|
788 else
|
yellowfive@81
|
789 tt:SetHyperlink(link)
|
yellowfive@81
|
790 end
|
yellowfive@81
|
791 return tt
|
yellowfive@81
|
792 end
|
yellowfive@81
|
793
|
yellowfive@81
|
794 function Amr.GetItemLevel(bagId, slotId, link)
|
yellowfive@81
|
795 local itemLevelPattern = _G["ITEM_LEVEL"]:gsub("%%d", "(%%d+)")
|
yellowfive@81
|
796 local tt = Amr.GetItemTooltip(bagId, slotId, link)
|
yellowfive@81
|
797
|
yellowfive@81
|
798 local regions = { tt:GetRegions() }
|
yellowfive@81
|
799 for i, region in ipairs(regions) do
|
yellowfive@81
|
800 if region and region:GetObjectType() == "FontString" then
|
yellowfive@81
|
801 local text = region:GetText()
|
yellowfive@81
|
802 if text then
|
yellowfive@81
|
803 ilvl = tonumber(text:match(itemLevelPattern))
|
yellowfive@81
|
804 if ilvl then
|
yellowfive@81
|
805 return ilvl
|
yellowfive@81
|
806 end
|
yellowfive@81
|
807 end
|
yellowfive@81
|
808 end
|
yellowfive@81
|
809 end
|
yellowfive@81
|
810
|
yellowfive@81
|
811 -- 0 means we couldn't find it for whatever reason
|
yellowfive@81
|
812 return 0
|
yellowfive@81
|
813 end
|
yellowfive@81
|
814
|
yellowfive@57
|
815
|
yellowfive@57
|
816 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
817 -- Character Reading
|
yellowfive@57
|
818 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
819
|
yellowfive@57
|
820 local function readProfessionInfo(prof, ret)
|
yellowfive@57
|
821 if prof then
|
yellowfive@57
|
822 local name, icon, skillLevel, maxSkillLevel, numAbilities, spelloffset, skillLine, skillModifier = GetProfessionInfo(prof);
|
yellowfive@57
|
823 if Amr.ProfessionSkillLineToName[skillLine] ~= nil then
|
yellowfive@57
|
824 ret.Professions[Amr.ProfessionSkillLineToName[skillLine]] = skillLevel;
|
yellowfive@57
|
825 end
|
yellowfive@57
|
826 end
|
yellowfive@57
|
827 end
|
yellowfive@57
|
828
|
yellowfive@81
|
829 --[[
|
yellowfive@81
|
830 local function getTalents(specPos)
|
yellowfive@57
|
831 local talentInfo = {}
|
yellowfive@57
|
832 local maxTiers = 7
|
yellowfive@57
|
833 for tier = 1, maxTiers do
|
yellowfive@57
|
834 for col = 1, 3 do
|
yellowfive@81
|
835 local id, name, _, _, _, spellId, _, t, c, selected = GetTalentInfoBySpecialization(specPos, tier, col)
|
yellowfive@57
|
836 if selected then
|
yellowfive@57
|
837 talentInfo[tier] = col
|
yellowfive@57
|
838 end
|
yellowfive@57
|
839 end
|
yellowfive@57
|
840 end
|
yellowfive@57
|
841
|
yellowfive@57
|
842 local str = ""
|
yellowfive@57
|
843 for i = 1, maxTiers do
|
yellowfive@57
|
844 if talentInfo[i] then
|
yellowfive@57
|
845 str = str .. talentInfo[i]
|
yellowfive@57
|
846 else
|
yellowfive@57
|
847 str = str .. '0'
|
yellowfive@57
|
848 end
|
yellowfive@57
|
849 end
|
yellowfive@57
|
850
|
yellowfive@57
|
851 return str
|
yellowfive@57
|
852 end
|
yellowfive@81
|
853 ]]
|
yellowfive@57
|
854
|
yellowfive@81
|
855 --[[
|
yellowfive@57
|
856 local function getGlyphs(specGroup)
|
yellowfive@57
|
857 local glyphs = {}
|
yellowfive@57
|
858 for i = 1, NUM_GLYPH_SLOTS do
|
yellowfive@57
|
859 local _, _, _, glyphSpellID, _, glyphID = GetGlyphSocketInfo(i, specGroup)
|
yellowfive@57
|
860 if (glyphID) then
|
yellowfive@57
|
861 table.insert(glyphs, glyphSpellID)
|
yellowfive@57
|
862 end
|
yellowfive@57
|
863 end
|
yellowfive@57
|
864 return glyphs;
|
yellowfive@57
|
865 end
|
yellowfive@81
|
866 ]]
|
yellowfive@57
|
867
|
yellowfive@81
|
868 -- get specs and talents
|
yellowfive@81
|
869 local function readSpecs(ret)
|
yellowfive@57
|
870
|
yellowfive@81
|
871 for pos = 1, 4 do
|
yellowfive@57
|
872 -- spec, convert game spec id to one of our spec ids
|
yellowfive@81
|
873 local specId = GetSpecializationInfo(pos)
|
yellowfive@57
|
874 if specId then
|
yellowfive@81
|
875 ret.Specs[pos] = Amr.SpecIds[specId]
|
yellowfive@81
|
876 -- TODO: figure out how to read inactive spec talents if possible... used to be able to but they changed it
|
yellowfive@81
|
877 --ret.Talents[pos] = getTalents(pos)
|
yellowfive@57
|
878 end
|
yellowfive@57
|
879 end
|
yellowfive@57
|
880 end
|
yellowfive@57
|
881
|
yellowfive@81
|
882 -- TODO: hopefully we can read artifact here when there is an API to get info when the artifact UI is not open
|
yellowfive@81
|
883 -- get artifact info
|
yellowfive@81
|
884 local function readArtifact()
|
yellowfive@81
|
885
|
yellowfive@81
|
886 end
|
yellowfive@81
|
887
|
yellowfive@57
|
888 -- get currently equipped items, store with currently active spec
|
yellowfive@57
|
889 local function readEquippedItems(ret)
|
yellowfive@57
|
890 local equippedItems = {};
|
yellowfive@57
|
891 for slotNum = 1, #Amr.SlotIds do
|
yellowfive@57
|
892 local slotId = Amr.SlotIds[slotNum]
|
yellowfive@57
|
893 local itemLink = GetInventoryItemLink("player", slotId)
|
yellowfive@57
|
894 if itemLink then
|
yellowfive@57
|
895 equippedItems[slotId] = itemLink
|
yellowfive@57
|
896 end
|
yellowfive@57
|
897 end
|
yellowfive@57
|
898
|
yellowfive@57
|
899 -- store last-seen equipped gear for each spec
|
yellowfive@81
|
900 ret.Equipped[GetSpecialization()] = equippedItems
|
yellowfive@57
|
901 end
|
yellowfive@57
|
902
|
yellowfive@57
|
903 -- Get all data about the player as an object, includes:
|
yellowfive@57
|
904 -- serializer version
|
yellowfive@57
|
905 -- region/realm/name
|
yellowfive@57
|
906 -- guild
|
yellowfive@57
|
907 -- race
|
yellowfive@57
|
908 -- faction
|
yellowfive@57
|
909 -- level
|
yellowfive@57
|
910 -- professions
|
yellowfive@81
|
911 -- spec/talent for all specs
|
yellowfive@81
|
912 -- artifact for current spec
|
yellowfive@57
|
913 -- equipped gear for the current spec
|
yellowfive@57
|
914 --
|
yellowfive@81
|
915 function Amr:GetPlayerData()
|
yellowfive@57
|
916
|
yellowfive@57
|
917 local ret = {}
|
yellowfive@57
|
918
|
yellowfive@57
|
919 ret.Region = Amr.RegionNames[GetCurrentRegion()]
|
yellowfive@57
|
920 ret.Realm = GetRealmName()
|
yellowfive@57
|
921 ret.Name = UnitName("player")
|
yellowfive@57
|
922 ret.Guild = GetGuildInfo("player")
|
yellowfive@81
|
923 ret.ActiveSpec = GetSpecialization()
|
yellowfive@57
|
924 ret.Level = UnitLevel("player");
|
yellowfive@57
|
925
|
yellowfive@57
|
926 local cls, clsEn = UnitClass("player")
|
yellowfive@57
|
927 ret.Class = clsEn;
|
yellowfive@57
|
928
|
yellowfive@57
|
929 local race, raceEn = UnitRace("player")
|
yellowfive@57
|
930 ret.Race = raceEn;
|
yellowfive@57
|
931 ret.Faction = UnitFactionGroup("player")
|
yellowfive@57
|
932
|
yellowfive@57
|
933 ret.Professions = {};
|
yellowfive@57
|
934 local prof1, prof2, archaeology, fishing, cooking, firstAid = GetProfessions();
|
yellowfive@57
|
935 readProfessionInfo(prof1, ret)
|
yellowfive@57
|
936 readProfessionInfo(prof2, ret)
|
yellowfive@57
|
937 readProfessionInfo(archaeology, ret)
|
yellowfive@57
|
938 readProfessionInfo(fishing, ret)
|
yellowfive@57
|
939 readProfessionInfo(cooking, ret)
|
yellowfive@57
|
940 readProfessionInfo(firstAid, ret)
|
yellowfive@57
|
941
|
yellowfive@57
|
942 ret.Specs = {}
|
yellowfive@57
|
943 ret.Talents = {}
|
yellowfive@81
|
944 readSpecs(ret)
|
yellowfive@81
|
945
|
yellowfive@81
|
946 ret.Artifacts = {}
|
yellowfive@81
|
947 readArtifact()
|
yellowfive@57
|
948
|
yellowfive@57
|
949 ret.Equipped = {}
|
yellowfive@57
|
950 readEquippedItems(ret)
|
yellowfive@57
|
951
|
yellowfive@57
|
952 return ret
|
yellowfive@57
|
953 end
|
yellowfive@57
|
954
|
yellowfive@57
|
955
|
yellowfive@57
|
956 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
957 -- Serialization
|
yellowfive@57
|
958 ----------------------------------------------------------------------------------------
|
yellowfive@57
|
959
|
yellowfive@57
|
960 local function toCompressedNumberList(list)
|
yellowfive@57
|
961 -- ensure the values are numbers, sorted from lowest to highest
|
yellowfive@57
|
962 local nums = {}
|
yellowfive@57
|
963 for i, v in ipairs(list) do
|
yellowfive@57
|
964 table.insert(nums, tonumber(v))
|
yellowfive@57
|
965 end
|
yellowfive@57
|
966 table.sort(nums)
|
yellowfive@57
|
967
|
yellowfive@57
|
968 local ret = {}
|
yellowfive@57
|
969 local prev = 0
|
yellowfive@57
|
970 for i, v in ipairs(nums) do
|
yellowfive@57
|
971 local diff = v - prev
|
yellowfive@57
|
972 table.insert(ret, diff)
|
yellowfive@57
|
973 prev = v
|
yellowfive@57
|
974 end
|
yellowfive@57
|
975
|
yellowfive@57
|
976 return table.concat(ret, ",")
|
yellowfive@57
|
977 end
|
yellowfive@57
|
978
|
yellowfive@57
|
979 -- make this utility publicly available
|
yellowfive@57
|
980 function Amr:ToCompressedNumberList(list)
|
yellowfive@57
|
981 return toCompressedNumberList(list)
|
yellowfive@57
|
982 end
|
yellowfive@57
|
983
|
yellowfive@57
|
984 -- appends a list of items to the export
|
yellowfive@57
|
985 local function appendItemsToExport(fields, itemObjects)
|
yellowfive@57
|
986
|
yellowfive@57
|
987 -- sort by item id so we can compress it more easily
|
yellowfive@57
|
988 table.sort(itemObjects, function(a, b) return a.id < b.id end)
|
yellowfive@57
|
989
|
yellowfive@57
|
990 -- append to the export string
|
yellowfive@57
|
991 local prevItemId = 0
|
yellowfive@57
|
992 local prevGemId = 0
|
yellowfive@57
|
993 local prevEnchantId = 0
|
yellowfive@57
|
994 local prevUpgradeId = 0
|
yellowfive@57
|
995 local prevBonusId = 0
|
yellowfive@81
|
996 local prevLevel = 0
|
yellowfive@57
|
997 for i, itemData in ipairs(itemObjects) do
|
yellowfive@57
|
998 local itemParts = {}
|
yellowfive@57
|
999
|
yellowfive@81
|
1000 -- 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
|
1001 --local _, _, quality = GetItemInfo(itemData.link)
|
yellowfive@81
|
1002 --if quality == 6 then
|
yellowfive@81
|
1003 -- itemData.level = Amr.GetItemLevel(nil, nil, itemData.link)
|
yellowfive@81
|
1004 --end
|
yellowfive@81
|
1005
|
yellowfive@57
|
1006 table.insert(itemParts, itemData.id - prevItemId)
|
yellowfive@57
|
1007 prevItemId = itemData.id
|
yellowfive@57
|
1008
|
yellowfive@57
|
1009 if itemData.slot ~= nil then table.insert(itemParts, "s" .. itemData.slot) end
|
yellowfive@57
|
1010 if itemData.suffixId ~= 0 then table.insert(itemParts, "f" .. itemData.suffixId) end
|
yellowfive@57
|
1011 if itemData.upgradeId ~= 0 then
|
yellowfive@57
|
1012 table.insert(itemParts, "u" .. (itemData.upgradeId - prevUpgradeId))
|
yellowfive@57
|
1013 prevUpgradeId = itemData.upgradeId
|
yellowfive@57
|
1014 end
|
yellowfive@81
|
1015 if itemData.level ~= 0 then
|
yellowfive@81
|
1016 table.insert(itemParts, "v" .. (itemData.level - prevLevel))
|
yellowfive@81
|
1017 prevLevel = itemData.level
|
yellowfive@81
|
1018 end
|
yellowfive@57
|
1019 if itemData.bonusIds then
|
yellowfive@57
|
1020 for bIndex, bValue in ipairs(itemData.bonusIds) do
|
yellowfive@57
|
1021 table.insert(itemParts, "b" .. (bValue - prevBonusId))
|
yellowfive@57
|
1022 prevBonusId = bValue
|
yellowfive@57
|
1023 end
|
yellowfive@57
|
1024 end
|
yellowfive@81
|
1025
|
yellowfive@81
|
1026 if itemData.gemIds[1] ~= 0 then
|
yellowfive@81
|
1027 table.insert(itemParts, "x" .. (itemData.gemIds[1] - prevGemId))
|
yellowfive@81
|
1028 prevGemId = itemData.gemIds[1]
|
yellowfive@81
|
1029 end
|
yellowfive@81
|
1030 if itemData.gemIds[2] ~= 0 then
|
yellowfive@81
|
1031 table.insert(itemParts, "y" .. (itemData.gemIds[2] - prevGemId))
|
yellowfive@81
|
1032 prevGemId = itemData.gemIds[2]
|
yellowfive@81
|
1033 end
|
yellowfive@81
|
1034 if itemData.gemIds[3] ~= 0 then
|
yellowfive@81
|
1035 table.insert(itemParts, "z" .. (itemData.gemIds[3] - prevGemId))
|
yellowfive@81
|
1036 prevGemId = itemData.gemIds[3]
|
yellowfive@81
|
1037 end
|
yellowfive@81
|
1038
|
yellowfive@57
|
1039 if itemData.enchantId ~= 0 then
|
yellowfive@57
|
1040 table.insert(itemParts, "e" .. (itemData.enchantId - prevEnchantId))
|
yellowfive@57
|
1041 prevEnchantId = itemData.enchantId
|
yellowfive@57
|
1042 end
|
yellowfive@57
|
1043
|
yellowfive@57
|
1044 table.insert(fields, table.concat(itemParts, ""))
|
yellowfive@57
|
1045 end
|
yellowfive@57
|
1046 end
|
yellowfive@57
|
1047
|
yellowfive@57
|
1048 -- Serialize just the identity portion of a player (region/realm/name) in the same format used by the full serialization
|
yellowfive@57
|
1049 function Amr:SerializePlayerIdentity(data)
|
yellowfive@57
|
1050 local fields = {}
|
yellowfive@57
|
1051 table.insert(fields, MINOR)
|
yellowfive@57
|
1052 table.insert(fields, data.Region)
|
yellowfive@57
|
1053 table.insert(fields, data.Realm)
|
yellowfive@57
|
1054 table.insert(fields, data.Name)
|
yellowfive@57
|
1055 return "$" .. table.concat(fields, ";") .. "$"
|
yellowfive@57
|
1056 end
|
yellowfive@57
|
1057
|
yellowfive@57
|
1058 -- Serialize player data gathered by GetPlayerData. This can be augmented with extra data if desired (augmenting used mainly by AskMrRobot addon).
|
yellowfive@57
|
1059 -- Pass complete = true to do a complete export of this extra information, otherwise it is ignored.
|
yellowfive@57
|
1060 -- Extra data can include:
|
yellowfive@57
|
1061 -- equipped gear for the player's inactive spec, slot id to item link dictionary
|
yellowfive@57
|
1062 -- Reputations
|
yellowfive@57
|
1063 -- BagItems, BankItems, VoidItems, lists of item links
|
yellowfive@57
|
1064 --
|
yellowfive@57
|
1065 function Amr:SerializePlayerData(data, complete)
|
yellowfive@57
|
1066
|
yellowfive@57
|
1067 local fields = {}
|
yellowfive@57
|
1068
|
yellowfive@57
|
1069 -- compressed string uses a fixed order rather than inserting identifiers
|
yellowfive@57
|
1070 table.insert(fields, MINOR)
|
yellowfive@57
|
1071 table.insert(fields, data.Region)
|
yellowfive@57
|
1072 table.insert(fields, data.Realm)
|
yellowfive@57
|
1073 table.insert(fields, data.Name)
|
yellowfive@57
|
1074
|
yellowfive@57
|
1075 -- guild name
|
yellowfive@57
|
1076 if data.Guild == nil then
|
yellowfive@57
|
1077 table.insert(fields, "")
|
yellowfive@57
|
1078 else
|
yellowfive@57
|
1079 table.insert(fields, data.Guild)
|
yellowfive@57
|
1080 end
|
yellowfive@57
|
1081
|
yellowfive@57
|
1082 -- race, default to pandaren if we can't read it for some reason
|
yellowfive@57
|
1083 local raceval = Amr.RaceIds[data.Race]
|
yellowfive@57
|
1084 if raceval == nil then raceval = 13 end
|
yellowfive@57
|
1085 table.insert(fields, raceval)
|
yellowfive@57
|
1086
|
yellowfive@57
|
1087 -- faction, default to alliance if we can't read it for some reason
|
yellowfive@57
|
1088 raceval = Amr.FactionIds[data.Faction]
|
yellowfive@57
|
1089 if raceval == nil then raceval = 1 end
|
yellowfive@57
|
1090 table.insert(fields, raceval)
|
yellowfive@57
|
1091
|
yellowfive@57
|
1092 table.insert(fields, data.Level)
|
yellowfive@57
|
1093
|
yellowfive@57
|
1094 local profs = {}
|
yellowfive@57
|
1095 local noprofs = true
|
yellowfive@57
|
1096 if data.Professions then
|
yellowfive@57
|
1097 for k, v in pairs(data.Professions) do
|
yellowfive@57
|
1098 local profval = Amr.ProfessionIds[k]
|
yellowfive@57
|
1099 if profval ~= nil then
|
yellowfive@57
|
1100 noprofs = false
|
yellowfive@57
|
1101 table.insert(profs, profval .. ":" .. v)
|
yellowfive@57
|
1102 end
|
yellowfive@57
|
1103 end
|
yellowfive@57
|
1104 end
|
yellowfive@57
|
1105
|
yellowfive@57
|
1106 if noprofs then
|
yellowfive@57
|
1107 table.insert(profs, "0:0")
|
yellowfive@57
|
1108 end
|
yellowfive@57
|
1109
|
yellowfive@57
|
1110 table.insert(fields, table.concat(profs, ","))
|
yellowfive@57
|
1111
|
yellowfive@57
|
1112 -- export specs
|
yellowfive@57
|
1113 table.insert(fields, data.ActiveSpec)
|
yellowfive@81
|
1114 for spec = 1, 4 do
|
yellowfive@57
|
1115 if data.Specs[spec] and (complete or spec == data.ActiveSpec) then
|
yellowfive@57
|
1116 table.insert(fields, ".s" .. spec) -- indicates the start of a spec block
|
yellowfive@81
|
1117 table.insert(fields, data.Specs[spec])
|
yellowfive@91
|
1118 table.insert(fields, data.Talents[spec] or "")
|
yellowfive@57
|
1119
|
yellowfive@81
|
1120 local powerids = {}
|
yellowfive@81
|
1121 local powerranks = {}
|
yellowfive@81
|
1122 local reliclinks = {}
|
yellowfive@81
|
1123
|
yellowfive@81
|
1124 local artifactInfo = data.Artifacts and data.Artifacts[spec]
|
yellowfive@81
|
1125 if artifactInfo and artifactInfo.Powers then
|
yellowfive@81
|
1126 for k, v in spairs(artifactInfo.Powers) do
|
yellowfive@81
|
1127 table.insert(powerids, k)
|
yellowfive@81
|
1128 table.insert(powerranks, v)
|
yellowfive@81
|
1129 end
|
yellowfive@81
|
1130 end
|
yellowfive@81
|
1131 if artifactInfo and artifactInfo.Relics then
|
yellowfive@81
|
1132 for i, link in ipairs(artifactInfo.Relics) do
|
yellowfive@81
|
1133 local relic = Amr.ParseItemLink(link)
|
yellowfive@81
|
1134 table.insert(reliclinks, Amr.GetItemUniqueId(relic) or "")
|
yellowfive@81
|
1135 end
|
yellowfive@57
|
1136 end
|
yellowfive@57
|
1137
|
yellowfive@81
|
1138 table.insert(fields, toCompressedNumberList(powerids))
|
yellowfive@81
|
1139 table.insert(fields, table.concat(powerranks, ","))
|
yellowfive@81
|
1140 table.insert(fields, table.concat(reliclinks, ","))
|
yellowfive@81
|
1141
|
yellowfive@81
|
1142 --table.insert(fields, toCompressedNumberList(data.Glyphs[spec]))
|
yellowfive@57
|
1143 end
|
yellowfive@57
|
1144 end
|
yellowfive@57
|
1145
|
yellowfive@57
|
1146 -- export equipped gear
|
yellowfive@57
|
1147 if data.Equipped then
|
yellowfive@81
|
1148 for spec = 1, 4 do
|
yellowfive@57
|
1149 if data.Equipped[spec] and (complete or spec == data.ActiveSpec) then
|
yellowfive@57
|
1150 table.insert(fields, ".q" .. spec) -- indicates the start of an equipped gear block
|
yellowfive@57
|
1151
|
yellowfive@57
|
1152 local itemObjects = {}
|
yellowfive@57
|
1153 for k, v in pairs(data.Equipped[spec]) do
|
yellowfive@57
|
1154 local itemData = Amr.ParseItemLink(v)
|
yellowfive@57
|
1155 itemData.slot = k
|
yellowfive@81
|
1156 itemData.link = v
|
yellowfive@57
|
1157 table.insert(itemObjects, itemData)
|
yellowfive@57
|
1158 end
|
yellowfive@57
|
1159
|
yellowfive@57
|
1160 appendItemsToExport(fields, itemObjects)
|
yellowfive@57
|
1161 end
|
yellowfive@57
|
1162 end
|
yellowfive@57
|
1163 end
|
yellowfive@57
|
1164
|
yellowfive@57
|
1165 -- if doing a complete export, include reputations and bank/bag items too
|
yellowfive@57
|
1166 if complete then
|
yellowfive@57
|
1167
|
yellowfive@57
|
1168 -- export reputations
|
yellowfive@57
|
1169 local reps = {}
|
yellowfive@91
|
1170 table.insert(reps, "_")
|
yellowfive@91
|
1171 --[[
|
yellowfive@57
|
1172 local noreps = true
|
yellowfive@57
|
1173 if data.Reputations then
|
yellowfive@57
|
1174 for k, v in pairs(data.Reputations) do
|
yellowfive@57
|
1175 noreps = false
|
yellowfive@57
|
1176 table.insert(reps, k .. ":" .. v)
|
yellowfive@57
|
1177 end
|
yellowfive@57
|
1178 end
|
yellowfive@57
|
1179 if noreps then
|
yellowfive@57
|
1180 table.insert(reps, "_")
|
yellowfive@57
|
1181 end
|
yellowfive@91
|
1182 ]]
|
yellowfive@91
|
1183
|
yellowfive@57
|
1184 table.insert(fields, ".r")
|
yellowfive@57
|
1185 table.insert(fields, table.concat(reps, ","))
|
yellowfive@57
|
1186
|
yellowfive@57
|
1187 -- export bag and bank
|
yellowfive@57
|
1188 local itemObjects = {}
|
yellowfive@57
|
1189 if data.BagItems then
|
yellowfive@57
|
1190 for i, v in ipairs(data.BagItems) do
|
yellowfive@57
|
1191 local itemData = Amr.ParseItemLink(v)
|
yellowfive@85
|
1192 if itemData ~= nil --[[and (IsEquippableItem(v) or Amr.SetTokenIds[itemData.id])]] then
|
yellowfive@81
|
1193 itemData.link = v
|
yellowfive@57
|
1194 table.insert(itemObjects, itemData)
|
yellowfive@57
|
1195 end
|
yellowfive@57
|
1196 end
|
yellowfive@57
|
1197 end
|
yellowfive@57
|
1198 if data.BankItems then
|
yellowfive@57
|
1199 for i, v in ipairs(data.BankItems) 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.VoidItems then
|
yellowfive@57
|
1208 for i, v in ipairs(data.VoidItems) 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
|
yellowfive@57
|
1217 table.insert(fields, ".inv")
|
yellowfive@57
|
1218 appendItemsToExport(fields, itemObjects)
|
yellowfive@57
|
1219 end
|
yellowfive@57
|
1220
|
yellowfive@57
|
1221 return "$" .. table.concat(fields, ";") .. "$"
|
yellowfive@57
|
1222
|
yellowfive@57
|
1223 end
|
yellowfive@57
|
1224
|
yellowfive@57
|
1225 -- Shortcut for the common use case: serialize the player's currently active setup with no extras.
|
yellowfive@57
|
1226 function Amr:SerializePlayer()
|
yellowfive@57
|
1227 local data = self:GetPlayerData()
|
yellowfive@57
|
1228 return self:SerializePlayerData(data)
|
yellowfive@57
|
1229 end
|
yellowfive@57
|
1230
|
yellowfive@81
|
1231 --[[
|
yellowfive@57
|
1232 ----------------------------------------------------------------------------------------------------------------------
|
yellowfive@57
|
1233 -- Character Snapshots
|
yellowfive@81
|
1234 -- This feature snapshots a player's gear/talents/artifact when entering combat. It is enabled by default. Consumers
|
yellowfive@57
|
1235 -- of this library can create a setting to enable/disable it as desired per a user setting.
|
yellowfive@57
|
1236 --
|
yellowfive@57
|
1237 -- You should register for the AMR_SNAPSHOT_STATE_CHANGED message (sent via AceEvent-3.0 messaging) to ensure that
|
yellowfive@57
|
1238 -- your addon settings stay in sync with any other addon that may also be trying to control the enabled state.
|
yellowfive@57
|
1239 --
|
yellowfive@57
|
1240 -- Note that if a user has the main AMR addon installed, it will always enable snapshotting, and override any attempt
|
yellowfive@57
|
1241 -- to disable it by immediately re-enabling it and thus re-triggering AMR_SNAPSHOT_STATE_CHANGED.
|
yellowfive@57
|
1242 ----------------------------------------------------------------------------------------------------------------------
|
yellowfive@57
|
1243 Amr._snapshotEnabled = true
|
yellowfive@57
|
1244
|
yellowfive@57
|
1245 -- Enable snapshotting of character data when entering combat. Sends this player's character data to anyone logging with the AskMrRobot addon.
|
yellowfive@57
|
1246 function Amr:EnableSnapshots()
|
yellowfive@57
|
1247 self._snapshotEnabled = true
|
yellowfive@57
|
1248 self:SendMessage("AMR_SNAPSHOT_STATE_CHANGED", self._snapshotEnabled)
|
yellowfive@57
|
1249 end
|
yellowfive@57
|
1250
|
yellowfive@57
|
1251 -- Disable snapshotting of character data when entering combat.
|
yellowfive@57
|
1252 function Amr:DisableSnapshots()
|
yellowfive@57
|
1253 self._snapshotEnabled = false
|
yellowfive@57
|
1254 self:SendMessage("AMR_SNAPSHOT_STATE_CHANGED", self._snapshotEnabled)
|
yellowfive@57
|
1255 end
|
yellowfive@57
|
1256
|
yellowfive@57
|
1257 function Amr:IsSnapshotEnabled()
|
yellowfive@57
|
1258 return self._snapshotEnabled
|
yellowfive@57
|
1259 end
|
yellowfive@57
|
1260
|
yellowfive@57
|
1261
|
yellowfive@57
|
1262 function Amr:PLAYER_REGEN_DISABLED()
|
yellowfive@57
|
1263 --function Amr:GARRISON_MISSION_NPC_OPENED()
|
yellowfive@57
|
1264
|
yellowfive@57
|
1265 -- send data about this character when a player enters combat in a supported zone
|
yellowfive@57
|
1266 if self._snapshotEnabled and Amr.IsSupportedInstance() then
|
yellowfive@57
|
1267 local t = time()
|
yellowfive@57
|
1268 local player = self:GetPlayerData()
|
yellowfive@57
|
1269 local msg = self:SerializePlayerData(player)
|
yellowfive@57
|
1270 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
|
1271
|
yellowfive@57
|
1272 self:SendCommMessage(Amr.ChatPrefix, msg, "RAID")
|
yellowfive@57
|
1273 end
|
yellowfive@57
|
1274 end
|
yellowfive@57
|
1275
|
yellowfive@57
|
1276 Amr:RegisterEvent("PLAYER_REGEN_DISABLED")
|
yellowfive@81
|
1277 --Amr:RegisterEvent("GARRISON_MISSION_NPC_OPENED") -- for debugging, fire this event when open mission table
|
yellowfive@81
|
1278 ]] |