annotate AskMrRobot-Serializer/AskMrRobot-Serializer.lua @ 91:b8e9664d3229 v43

option to disable equipment manager sets, minor artifact/talent bug fixes
author yellowfive
date Wed, 21 Sep 2016 00:14:22 -0700
parents 6bbe64d587b4
children 177391341e26
rev   line source
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 ]]