Mercurial > wow > ouroloot
comparison core.lua @ 82:ae17128ef3f2
Cosmetic cleanup. Minor tweaks to fixup_unique_replacements to aid in debugging.
| author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
|---|---|
| date | Sun, 17 Jun 2012 20:55:11 +0000 |
| parents | 0f6355bcfe68 |
| children | 940e53dd18c3 |
comparison
equal
deleted
inserted
replaced
| 81:0f6355bcfe68 | 82:ae17128ef3f2 |
|---|---|
| 1309 | 1309 |
| 1310 -- Recent loot cache | 1310 -- Recent loot cache |
| 1311 local candidates = {} | 1311 local candidates = {} |
| 1312 local sigmap = {} | 1312 local sigmap = {} |
| 1313 local function preempt_older_signature (oldersig, newersig) | 1313 local function preempt_older_signature (oldersig, newersig) |
| 1314 --pprint("preempt", oldersig, "::", newersig) | |
| 1315 local origin = candidates[oldersig] and candidates[oldersig].bcast_from | 1314 local origin = candidates[oldersig] and candidates[oldersig].bcast_from |
| 1316 --pprint("preempt", "candidate", candidates[oldersig], "bcast:", origin) | |
| 1317 if origin and g_seeing_oldsigs[origin] then | 1315 if origin and g_seeing_oldsigs[origin] then |
| 1318 -- replace entry from older client with this newer one | 1316 -- replace entry from older client with this newer one |
| 1319 candidates[oldersig] = nil | 1317 candidates[oldersig] = nil |
| 1320 addon.dprint('loot', "preempting signature <", oldersig, "> from", origin) | 1318 addon.dprint('loot', "preempting signature <", oldersig, "> from", origin) |
| 1321 end | 1319 end |
| 1407 local oldersig = recipient .. iname .. (count or "") | 1405 local oldersig = recipient .. iname .. (count or "") |
| 1408 local signature, seenit | 1406 local signature, seenit |
| 1409 if #unique > 0 then | 1407 if #unique > 0 then |
| 1410 -- newer case | 1408 -- newer case |
| 1411 signature = unique .. oldersig | 1409 signature = unique .. oldersig |
| 1412 --pprint("newer", "mapping older <", oldersig, "> to newer <", signature, ">") | |
| 1413 sigmap[oldersig] = signature | 1410 sigmap[oldersig] = signature |
| 1414 --pprint("newer", "testing recent for", signature, "yields", recent_loot:test(signature)) | |
| 1415 seenit = (from and recent_loot:test(signature)) | 1411 seenit = (from and recent_loot:test(signature)) |
| 1416 -- The following clause is what handles older 'casts arriving | 1412 -- The following clause is what handles older 'casts arriving |
| 1417 -- earlier. All this is tested inside-out to maximize short | 1413 -- earlier. All this is tested inside-out to maximize short |
| 1418 -- circuit evaluation; the preempt function always returns | 1414 -- circuit evaluation; the preempt function always returns |
| 1419 -- false to force seenit off. | 1415 -- false to force seenit off. |
| 1420 or (g_seeing_oldsigs and preempt_older_signature(oldersig,signature)) | 1416 or (g_seeing_oldsigs and preempt_older_signature(oldersig,signature)) |
| 1421 else | 1417 else |
| 1422 -- older case, only remote | 1418 -- older case, only remote |
| 1423 assert(from) | 1419 assert(from) |
| 1424 signature = sigmap[oldersig] or oldersig | 1420 signature = sigmap[oldersig] or oldersig |
| 1425 --pprint("older", "testing signature will be", signature) | |
| 1426 seenit = recent_loot:test(signature) | 1421 seenit = recent_loot:test(signature) |
| 1427 end | 1422 end |
| 1428 | 1423 |
| 1429 if seenit then | 1424 if seenit then |
| 1430 self.dprint('loot', "remote", prefix, "<", signature, | 1425 self.dprint('loot', "remote", prefix, "<", signature, |
| 2006 self.dprint('flow', "restoring", #g_loot, "entries") | 2001 self.dprint('flow', "restoring", #g_loot, "entries") |
| 2007 self:ScheduleTimer("Activate", 12, opts.threshold) | 2002 self:ScheduleTimer("Activate", 12, opts.threshold) |
| 2008 -- FIXME printed could be too large if entries were deleted, how much do we care? | 2003 -- FIXME printed could be too large if entries were deleted, how much do we care? |
| 2009 self.sharder = opts.autoshard | 2004 self.sharder = opts.autoshard |
| 2010 else | 2005 else |
| 2011 --g_loot = { printed = {}, raiders = {} } | |
| 2012 g_loot = {} | 2006 g_loot = {} |
| 2013 end | 2007 end |
| 2014 if type(g_loot.raiders) ~= 'table' then | 2008 if type(g_loot.raiders) ~= 'table' then |
| 2015 g_loot.raiders = {} | 2009 g_loot.raiders = {} |
| 2016 end | 2010 end |
| 2353 -- Problem: (1) boss kill happens, (2) fast looting happens, (3) boss | 2347 -- Problem: (1) boss kill happens, (2) fast looting happens, (3) boss |
| 2354 -- cache cleanup fires. Result: loot shows up before boss kill entry. | 2348 -- cache cleanup fires. Result: loot shows up before boss kill entry. |
| 2355 -- Solution: We need to shuffle the boss entry above any of the loot | 2349 -- Solution: We need to shuffle the boss entry above any of the loot |
| 2356 -- from that boss. | 2350 -- from that boss. |
| 2357 function addon._adjustBossOrder (is, should_be) | 2351 function addon._adjustBossOrder (is, should_be) |
| 2358 --pprint('loot', is, should_be) | 2352 if is == should_be then |
| 2359 if is == should_be then --pprint('loot', "equal, yay") | |
| 2360 return | 2353 return |
| 2361 end | 2354 end |
| 2362 if (type(is)~='number') or (type(should_be)~='number') or (is < should_be) then | 2355 if (type(is)~='number') or (type(should_be)~='number') or (is < should_be) then |
| 2363 pprint('loot', is, should_be, "...the hell? bailing") | 2356 pprint('loot', is, should_be, "...the hell? bailing") |
| 2364 return | 2357 return |
| 2365 end | 2358 end |
| 2366 if g_loot[should_be].kind == 'time' then | 2359 if g_loot[should_be].kind == 'time' then |
| 2367 should_be = should_be + 1 | 2360 should_be = should_be + 1 |
| 2368 if is == should_be then | 2361 if is == should_be then |
| 2369 --pprint('loot', "needed to mark day entry, otherwise equal, yay") | |
| 2370 return | 2362 return |
| 2371 end | 2363 end |
| 2372 end | 2364 end |
| 2373 | 2365 |
| 2374 assert(g_loot[is].kind == 'boss') | 2366 assert(g_loot[is].kind == 'boss') |
| 2375 local boss = tremove (g_loot, is) | 2367 local boss = tremove (g_loot, is) |
| 2376 --pprint('loot', "MOVING", boss.bossname) | |
| 2377 tinsert (g_loot, should_be, boss) | 2368 tinsert (g_loot, should_be, boss) |
| 2378 return should_be | 2369 return should_be |
| 2379 end | 2370 end |
| 2380 end | 2371 end |
| 2381 | 2372 |
| 2431 -- Strictly speaking, we'd want to handle individual 'exist' entries | 2422 -- Strictly speaking, we'd want to handle individual 'exist' entries |
| 2432 -- as they expire, rather then waiting for all of them to expire and then | 2423 -- as they expire, rather then waiting for all of them to expire and then |
| 2433 -- doing them as a group. But, if there're more than one of these per | 2424 -- doing them as a group. But, if there're more than one of these per |
| 2434 -- boss, something else is funky anyhow and certainly not a hurry. | 2425 -- boss, something else is funky anyhow and certainly not a hurry. |
| 2435 local function fixup_unique_replacements() | 2426 local function fixup_unique_replacements() |
| 2436 --print("replacements fixup happening!") | |
| 2437 --tabledump(g_unique_replace.replacements) | |
| 2438 --_G.GRR = g_unique_replace.replacements | |
| 2439 for exist,info in pairs(gur.replacements) do | 2427 for exist,info in pairs(gur.replacements) do |
| 2440 local winning_index = 1 | 2428 local winning_index = 1 |
| 2441 local winner = info[1] | 2429 local winner = info[1] |
| 2442 info[1] = nil | 2430 info[1] = nil |
| 2443 pprint('improv', "fixup for", exist, "starting with", winner[1], | 2431 pprint('improv', "fixup for", exist, "starting with guid", |
| 2444 "with", winner[2], "out of", #info, "total entries") | 2432 winner[1], "with tag", winner[2], "out of", #info, |
| 2433 "total entries") | |
| 2445 -- Lowest player GUID wins. Seniority gotta count for something. | 2434 -- Lowest player GUID wins. Seniority gotta count for something. |
| 2446 for i = 2, #info do | 2435 for i = 2, #info do |
| 2447 if winner[1] <= info[i][1] then | 2436 if winner[1] <= info[i][1] then |
| 2448 pprint('improv', "champ wins against", i, info[i][1]) | 2437 pprint('improv', "champ wins against", i, info[i][1]) |
| 2449 flib.del(info[i]) | 2438 flib.del(info[i]) |
| 2454 winning_index = i | 2443 winning_index = i |
| 2455 end | 2444 end |
| 2456 info[i] = nil | 2445 info[i] = nil |
| 2457 end | 2446 end |
| 2458 pprint('improv', "final:", winner[1], winner[2]) | 2447 pprint('improv', "final:", winner[1], winner[2]) |
| 2448 --@debug@ | |
| 2449 -- purely a sanity check | |
| 2450 if winning_index == 1 then | |
| 2451 if winner[2] ~= info.LOCAL then | |
| 2452 pprint('improv', | |
| 2453 "things locally generated are not locally generated?", | |
| 2454 info.LOCAL, winner[2]) | |
| 2455 end | |
| 2456 end | |
| 2457 --@end-debug@ | |
| 2459 --[[ | 2458 --[[ |
| 2460 A: winner was generated locally | 2459 A: winner was generated locally |
| 2460 >winning_index == 1 | |
| 2461 >g_loot and history already has the replacement value | 2461 >g_loot and history already has the replacement value |
| 2462 >winning_index == 1 | |
| 2463 B: winner was generated remotely | 2462 B: winner was generated remotely |
| 2464 >need to scan and replace | 2463 >need to scan and replace |
| 2464 Detecting A is strictly an optimization. We should be able to do | |
| 2465 this code safely in all cases. | |
| 2465 ]] | 2466 ]] |
| 2466 if winning_index ~= 1 then | 2467 if winning_index ~= 1 then |
| 2467 --XXX still needs to be debugged: | 2468 --XXX this branch still needs to be tested with live data |
| 2468 local cache = g_uniques[exist] | 2469 local cache = g_uniques:SEARCH(exist) |
| 2469 local looti = assert(cache.loot) -- can't possibly be missing... | 2470 local looti,hi,ui = cache.loot, cache.history, cache.history_may |
| 2470 if g_loot[looti].unique ~= exist then | 2471 |
| 2471 pprint('improv', "WTF. entry", looti, | 2472 -- Active loot |
| 2472 "does not match original unique tag! instead", | 2473 if looti and g_loot[looti].unique == exist then |
| 2473 g_loot[looti].unique) | |
| 2474 else | |
| 2475 pprint('improv', "found and replaced loot entry", looti) | 2474 pprint('improv', "found and replaced loot entry", looti) |
| 2476 g_loot[looti].unique = winner[2] | 2475 g_loot[looti].unique = winner[2] |
| 2477 end | 2476 else |
| 2478 local hi,ui = cache.history, cache.history_may | 2477 -- If winning_index == 1, the "previous" unique would not |
| 2478 -- have made it into the tables to begin with. So don't | |
| 2479 -- flag an error. Still should be looked at. | |
| 2480 pprint('improv', "Um.", looti, g_loot[looti].unique, winning_index) | |
| 2481 end | |
| 2482 | |
| 2483 -- History | |
| 2479 if hi ~= g_uniques.NOTFOUND then | 2484 if hi ~= g_uniques.NOTFOUND then |
| 2480 local hist = addon.history[hi] | 2485 local hist = addon.history[hi] |
| 2481 if ui and hist.unique[ui] == exist then | 2486 if ui and hist.unique[ui] == exist then |
| 2482 -- ui is valid | 2487 -- ui is valid |
| 2483 else | 2488 else |
| 2490 end | 2495 end |
| 2491 end | 2496 end |
| 2492 if ui then | 2497 if ui then |
| 2493 pprint('improv', "found and replacing history entry", hi, | 2498 pprint('improv', "found and replacing history entry", hi, |
| 2494 ui, hist.name) | 2499 ui, hist.name) |
| 2500 assert(exist ~= winner[2]) | |
| 2495 hist.when[winner[2]] = hist.when[exist] | 2501 hist.when[winner[2]] = hist.when[exist] |
| 2496 hist.id[winner[2]] = hist.id[exist] | 2502 hist.id[winner[2]] = hist.id[exist] |
| 2497 hist.count[winner[2]] = hist.count[exist] | 2503 hist.count[winner[2]] = hist.count[exist] |
| 2498 hist.unique[ui] = winner[2] | 2504 hist.unique[ui] = winner[2] |
| 2499 hist.when[exist] = nil | 2505 hist.when[exist] = nil |
| 2575 addon:horrible_horrible_error (err) | 2581 addon:horrible_horrible_error (err) |
| 2576 -- we don't actually need to kill the GUI in this case | 2582 -- we don't actually need to kill the GUI in this case |
| 2577 addon.NOLOAD = nil | 2583 addon.NOLOAD = nil |
| 2578 end | 2584 end |
| 2579 end | 2585 end |
| 2580 --function DOTEST() | |
| 2581 -- local err = unique_collision:format ( | |
| 2582 -- "Codpiece of the Grimacing Lunatic", | |
| 2583 -- 'n3183021', 'Farmbuyer', '14', '78') | |
| 2584 -- _unavoidable_collision (err) | |
| 2585 -- pprint('ohfuck', "COLLISION", err) | |
| 2586 --end | |
| 2587 | 2586 |
| 2588 | 2587 |
| 2589 ------ Saved texts | 2588 ------ Saved texts |
| 2590 function addon:check_saved_table(silent_p) | 2589 function addon:check_saved_table(silent_p) |
| 2591 local s = _G.OuroLootSV_saved | 2590 local s = _G.OuroLootSV_saved |
| 2781 end | 2780 end |
| 2782 for i,e in self:filtered_loot_iter('loot') do | 2781 for i,e in self:filtered_loot_iter('loot') do |
| 2783 if e.unique and e.unique ~= "" then | 2782 if e.unique and e.unique ~= "" then |
| 2784 local hmmm = _G.rawget(g_uniques,e.unique) | 2783 local hmmm = _G.rawget(g_uniques,e.unique) |
| 2785 if hmmm then | 2784 if hmmm then |
| 2786 hmmm.loot = i --;print("Active loot", i, "found with tag", e.unique) | 2785 hmmm.loot = i |
| 2787 elseif e.disposition == 'shard' or e.disposition == 'gvault' then | 2786 elseif e.disposition == 'shard' or e.disposition == 'gvault' then |
| 2788 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } | 2787 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } |
| 2789 count = count + 1 | 2788 count = count + 1 |
| 2790 --print("Active loot", i, "INSERTED with tag", e.unique, "as", e.disposition) | |
| 2791 else | 2789 else |
| 2792 hmmm = "active data not found in history ("..i.."/"..tostring(e.unique) | 2790 hmmm = "active data not found in history ("..i.."/"..tostring(e.unique) |
| 2793 ..") in precache loop! trying to fixup for this session" | 2791 ..") in precache loop! trying to fixup for this session" |
| 2794 pprint(hmmm) -- more? | 2792 pprint(hmmm) -- more? |
| 2795 -- try to simply fix up errors as we go | 2793 -- try to simply fix up errors as we go |
| 2796 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } | 2794 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } |
| 2797 --trouble = true | |
| 2798 end | 2795 end |
| 2799 else | 2796 else |
| 2800 trouble = true | 2797 trouble = true |
| 2801 pprint('loot', "ERROR precache loop found bad unique tag!", | 2798 pprint('loot', "ERROR precache loop found bad unique tag!", |
| 2802 i, "tag", tostring(e.unique), "from?", tostring(e.bcast_from)) | 2799 i, "tag", tostring(e.unique), "from?", tostring(e.bcast_from)) |
| 3087 or select(2,_G.UnitClass(to_name)) | 3084 or select(2,_G.UnitClass(to_name)) |
| 3088 self.hist_clean = nil | 3085 self.hist_clean = nil |
| 3089 self.loot_clean = nil | 3086 self.loot_clean = nil |
| 3090 | 3087 |
| 3091 if how == "local" then | 3088 if how == "local" then |
| 3092 --self:Print("Reassigned entry %d/%s from '%s' to '%s'.", index, e.itemlink, from_name, to_name) | |
| 3093 _notify_about_change (_G.DEFAULT_CHAT_FRAME, _G.UNIT_YOU, index, | 3089 _notify_about_change (_G.DEFAULT_CHAT_FRAME, _G.UNIT_YOU, index, |
| 3094 nil, from_name, from_person_class) | 3090 nil, from_name, from_person_class) |
| 3095 self:vbroadcast('reassign', unique, id, from_name, to_name) | 3091 self:vbroadcast('reassign', unique, id, from_name, to_name) |
| 3096 elseif opts.chatty_on_remote_changes then | 3092 elseif opts.chatty_on_remote_changes then |
| 3097 _notify_about_remote (sender, index, nil, from_name, from_person_class) | 3093 _notify_about_remote (sender, index, nil, from_name, from_person_class) |
