comparison core.lua @ 81:0f6355bcfe68

Initial version of reassign_loot that handles remote broadcasting, tested in sandbox. Catch tab generation errors at a higher level and take apart the window (including STs) rather than propagating Lua errors upwards.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 15 Jun 2012 20:04:05 +0000
parents f01d8d1b8f82
children ae17128ef3f2
comparison
equal deleted inserted replaced
80:f01d8d1b8f82 81:0f6355bcfe68
141 .." welcome message will not intrude again." 141 .." welcome message will not intrude again."
142 local newer_warning = "A newer version has been released. You can %s to display" 142 local newer_warning = "A newer version has been released. You can %s to display"
143 .." a download URL for copy-and-pasting. You can %s to ping other raiders" 143 .." a download URL for copy-and-pasting. You can %s to ping other raiders"
144 .." for their installed versions (same as '/ouroloot ping' or clicking the" 144 .." for their installed versions (same as '/ouroloot ping' or clicking the"
145 .." 'Ping!' button on the options panel)." 145 .." 'Ping!' button on the options panel)."
146 local unique_collision = "|cffff1010%s:|r|nItem '%s' was carrying unique tag <%s>, but that was already in use; tried to generate a new tag and failed!|n|nRemote sender was '%s', previous cache entry was <%s/%s>.|n|nThis may require a live human to figure out; the loot in question has not been stored." 146 local horrible_error_text = [[|cffff1010]] .. ERROR_CAPS
147 ..[[:|n|cffffff00Something unrecoverable has happened. The error message]]
148 ..[[ which was provided follows in white:|r|n|n%s|n|n|cffffff00Ouro Loot]]
149 ..[[ will not display a window until this situation is corrected. ]]
150 ..[[ You can try typing|n|cff00ff40/ouroloot fix ?|n]]
151 ..[[|cffffff00to see what can be done by software alone. You may still]]
152 ..[[ need to do a "/reload" afterwards, or even restart the game client.]]
153 local unique_collision = "Item '%s' was carrying unique tag <%s>, but that was already in use; tried to generate a new tag and failed!|n|nRemote sender was '%s', previous cache entry was <%s/%s>.|n|nThis may require a live human to figure out; the loot in question has not been stored."
147 local remote_chatty = "|cff00ff00%s|r changed %d/%s from %s%s|r to %s%s|r" 154 local remote_chatty = "|cff00ff00%s|r changed %d/%s from %s%s|r to %s%s|r"
148 local qualnames = { 155 local qualnames = {
149 ['gray'] = 0, ['grey'] = 0, ['poor'] = 0, ['trash'] = 0, 156 ['gray'] = 0, ['grey'] = 0, ['poor'] = 0, ['trash'] = 0,
150 ['white'] = 1, ['common'] = 1, 157 ['white'] = 1, ['common'] = 1,
151 ['green'] = 2, ['uncommon'] = 2, 158 ['green'] = 2, ['uncommon'] = 2,
337 344
338 local pprint, tabledump = addon.pprint, flib.tabledump 345 local pprint, tabledump = addon.pprint, flib.tabledump
339 local CopyTable, GetNumRaidMembers = _G.CopyTable, _G.GetNumRaidMembers 346 local CopyTable, GetNumRaidMembers = _G.CopyTable, _G.GetNumRaidMembers
340 -- En masse forward decls of symbols defined inside local blocks 347 -- En masse forward decls of symbols defined inside local blocks
341 local _register_bossmod, makedate, create_new_cache, _init, _log 348 local _register_bossmod, makedate, create_new_cache, _init, _log
342 local _history_by_loot_id, _notify_about_remote, _setup_unique_replace 349 local _history_by_loot_id, _setup_unique_replace, _unavoidable_collision
343 local _unavoidable_collision 350 local _notify_about_change, _notify_about_remote
344 351
345 -- Try to extract numbers from the .toc "Version" and munge them into an 352 -- Try to extract numbers from the .toc "Version" and munge them into an
346 -- integral form for comparison. The result doesn't need to be meaningful as 353 -- integral form for comparison. The result doesn't need to be meaningful as
347 -- long as we can reliably feed two of them to "<" and get useful answers. 354 -- long as we can reliably feed two of them to "<" and get useful answers.
348 -- 355 --
1380 -- collision, but we've generated a placeholder for now 1387 -- collision, but we've generated a placeholder for now
1381 -- and broadcast the fact 1388 -- and broadcast the fact
1382 self.dprint('loot', "substituting", unique, "with", replacement) 1389 self.dprint('loot', "substituting", unique, "with", replacement)
1383 else 1390 else
1384 i = g_uniques[unique] 1391 i = g_uniques[unique]
1385 local err = unique_collision:format (ERROR_CAPS, iname, unique, 1392 local err = unique_collision:format (iname, unique,
1386 tostring(from), tostring(i.loot), tostring(i.history)) 1393 tostring(from), tostring(i.loot), tostring(i.history))
1387 _unavoidable_collision (err) 1394 _unavoidable_collision (err)
1388 -- Make sure this is logged one way or another 1395 -- Make sure this is logged one way or another
1389 ;(self.debug.loot and self.dprint or pprint)('loot', "COLLISION", prefix, err); 1396 ;(self.debug.loot and self.dprint or pprint)('loot', "COLLISION", prefix, err);
1390 ret1, ret2 = nil, err 1397 ret1, ret2 = nil, err
1623 elseif cmd == "help" then 1630 elseif cmd == "help" then
1624 self:BuildMainDisplay('help') 1631 self:BuildMainDisplay('help')
1625 elseif cmd == "ping" then 1632 elseif cmd == "ping" then
1626 self:DoPing() 1633 self:DoPing()
1627 1634
1628 elseif cmd == "fixcache" then 1635 elseif cmd == "fix" then
1629 self:do_item_cache_fixup() 1636 if arg == "?" then
1637 self:Print[['/loot fix cache' updates loot that wasn't in the cache]]
1638 self:Print[['/loot fix history' repairs inconsistent data on the History tab]]
1639 self:Print[['/loot fix' changes no stored data, only allows the window to be displayed again (this is built into all fixes above)]]
1640 return
1641 elseif arg == "cache" then
1642 self:do_item_cache_fixup()
1643 elseif arg == "history" then
1644 self:repair_history_integrity()
1645 end
1646 self.NOLOAD = nil
1647 self:Print("Window unlocked, best of luck.")
1630 1648
1631 else 1649 else
1632 if self:OpenMainDisplayToTab(cmd) then 1650 if self:OpenMainDisplayToTab(cmd) then
1633 return 1651 return
1634 end 1652 end
1796 else 1814 else
1797 self:Print("'%s' was not a valid chat frame number/name, no change has been made.", arg) 1815 self:Print("'%s' was not a valid chat frame number/name, no change has been made.", arg)
1798 end 1816 end
1799 end 1817 end
1800 1818
1801 function _notify_about_remote (sender, index, from_whom, olddisp) 1819 local hexes = _G.setmetatable({}, {__index = function (t, k)
1820 local r = _G.math.floor(255*k.r+0.5)
1821 local g = _G.math.floor(255*k.g+0.5)
1822 local b = _G.math.floor(255*k.b+0.5)
1823 local hex = ("|cff%.2x%.2x%.2x"):format(r,g,b)
1824 t[k] = hex
1825 return hex
1826 end})
1827 function _notify_about_change (chatframe, source, index, olddisp, from_whom, from_class)
1802 local e = g_loot[index] 1828 local e = g_loot[index]
1803 if not e then 1829 if not e then
1804 -- how did this happen? 1830 -- how did this happen?
1805 return 1831 return
1806 end 1832 end
1807 local from_color, from_text, to_color, to_text 1833 local from_color, from_text, to_color, to_text
1808 if from_whom then 1834 if from_whom then
1809 -- FIXME need to return previous name/class from reassign_loot 1835 from_color = from_class
1810 1836 and addon.class_colors[from_class]
1837 or _G.NORMAL_FONT_COLOR
1838 from_color = hexes[from_color]
1839 from_text = from_whom
1840 to_color = e.person_class
1841 and addon.class_colors[e.person_class]
1842 or _G.NORMAL_FONT_COLOR
1843 to_color = hexes[to_color]
1844 to_text = e.person
1811 else 1845 else
1812 if olddisp then 1846 if olddisp then
1813 from_text = addon.disposition_colors[olddisp].text 1847 from_text = addon.disposition_colors[olddisp].text
1814 else 1848 else
1815 olddisp = "normal" 1849 olddisp = "normal"
1822 to_text = "normal" 1856 to_text = "normal"
1823 end 1857 end
1824 to_color = addon.disposition_colors[e.disposition or "normal"].hex 1858 to_color = addon.disposition_colors[e.disposition or "normal"].hex
1825 end 1859 end
1826 1860
1827 addon.dprint ('loot', "notifying:", sender, index, 1861 addon.dprint ('loot', "notification:", source, index,
1828 e.itemlink, from_color, from_text, to_color, to_text) 1862 e.itemlink, from_color, from_text, to_color, to_text)
1829 addon:CFPrint (remote_change_chatframe, remote_chatty, sender, index, 1863 addon:CFPrint (chatframe, remote_chatty, source, index,
1830 e.itemlink, from_color, from_text, to_color, to_text) 1864 e.itemlink, from_color, from_text, to_color, to_text)
1865 end
1866
1867 function _notify_about_remote (sender, index, olddisp, from_whom, from_class)
1868 _notify_about_change (remote_change_chatframe, sender, index, olddisp, from_whom, from_class)
1831 end 1869 end
1832 end 1870 end
1833 1871
1834 -- Adds indices to traverse the tables in a nice sorted order. 1872 -- Adds indices to traverse the tables in a nice sorted order.
1835 do 1873 do
2503 end 2541 end
2504 end 2542 end
2505 2543
2506 do 2544 do
2507 local clicky 2545 local clicky
2508 function _unavoidable_collision (err) 2546 function addon:horrible_horrible_error (err_msg)
2547 if self.display then
2548 local d = self.display
2549 if d then
2550 local eoist = d:GetUserData("eoiST")
2551 if eoist then eoist:Hide() end
2552 local histst = d:GetUserData("histST")
2553 if histst then histst:Hide() end
2554 d:Hide()
2555 end
2556 end
2557 self.NOLOAD = err_msg
2509 -- This should happen so rarely that it's not worth moving into gui.lua 2558 -- This should happen so rarely that it's not worth moving into gui.lua
2510 if not StaticPopupDialogs["OUROL_COLLISION"] then 2559 if not StaticPopupDialogs["OUROL_ARGH"] then
2511 StaticPopupDialogs["OUROL_COLLISION"] = flib.StaticPopup{ 2560 StaticPopupDialogs["OUROL_ARGH"] = flib.StaticPopup{
2512 button1 = OKAY, 2561 button1 = OKAY,
2513 } 2562 }
2514 clicky = addon.format_hypertext( 2563 clicky = addon.format_hypertext(
2515 [[ SYSTEM FAILURE -- RELEASE RINZLER ]], "|cffff0000", 2564 [[ SYSTEM FAILURE -- RELEASE RINZLER ]], "|cffff0000",
2516 function() StaticPopup_Show "OUROL_COLLISION" end) 2565 function() StaticPopup_Show "OUROL_ARGH" end)
2517 end 2566 end
2518 StaticPopupDialogs["OUROL_COLLISION"].text = err 2567 StaticPopupDialogs["OUROL_ARGH"].text = horrible_error_text:format(err_msg)
2519 _G.PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master") 2568 _G.PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master")
2520 addon:Print (" ") 2569 addon:Print (" ")
2521 addon:Print (" ", clicky) 2570 addon:Print (" ", clicky)
2522 addon:Print (" ") 2571 addon:Print (" ")
2523 end 2572 end
2573
2574 function _unavoidable_collision (err)
2575 addon:horrible_horrible_error (err)
2576 -- we don't actually need to kill the GUI in this case
2577 addon.NOLOAD = nil
2578 end
2524 end 2579 end
2525 --function DOTEST() 2580 --function DOTEST()
2526 -- local err = unique_collision:format (ERROR_CAPS, 2581 -- local err = unique_collision:format (
2527 -- "Codpiece of the Grimacing Lunatic", 2582 -- "Codpiece of the Grimacing Lunatic",
2528 -- 'n3183021', 'Farmbuyer', '14', '78') 2583 -- 'n3183021', 'Farmbuyer', '14', '78')
2529 -- _unavoidable_collision (err) 2584 -- _unavoidable_collision (err)
2530 -- pprint('ohfuck', "COLLISION", err) 2585 -- pprint('ohfuck', "COLLISION", err)
2531 --end 2586 --end
2538 _G.OuroLootSV_saved = nil 2593 _G.OuroLootSV_saved = nil
2539 if not silent_p then self:Print("There are no saved loot texts.") end 2594 if not silent_p then self:Print("There are no saved loot texts.") end
2540 end 2595 end
2541 2596
2542 function addon:save_list() 2597 function addon:save_list()
2543 local s = self:check_saved_table(); if not s then return end; 2598 local s = self:check_saved_table(); if not s then return end
2544 for i,t in ipairs(s) do 2599 for i,t in ipairs(s) do
2545 self:Print("#%d %s %d entries %s", i, t.date, t.count, t.name) 2600 self:Print("#%d %s %d entries %s", i, t.date, t.count, t.name)
2546 end 2601 end
2547 end 2602 end
2548 2603
2562 SV[n] = save 2617 SV[n] = save
2563 return self:save_list() 2618 return self:save_list()
2564 end 2619 end
2565 2620
2566 function addon:save_restore(num) 2621 function addon:save_restore(num)
2567 local s = self:check_saved_table(); if not s then return end; 2622 local s = self:check_saved_table(); if not s then return end
2568 if (not num) or (num > #s) then 2623 if (not num) or (num > #s) then
2569 return self:Print("Saved text number must be 1 - "..#s) 2624 return self:Print("Saved text number must be 1 - "..#s)
2570 end 2625 end
2571 local save = s[num] 2626 local save = s[num]
2572 self:Print("Overwriting current loot data with saved text #%d '%s'", num, save.name) 2627 self:Print("Overwriting current loot data with saved text #%d '%s'", num, save.name)
2577 g_loot[text] = save[text] 2632 g_loot[text] = save[text]
2578 end 2633 end
2579 end 2634 end
2580 2635
2581 function addon:save_delete(num) 2636 function addon:save_delete(num)
2582 local s = self:check_saved_table(); if not s then return end; 2637 local s = self:check_saved_table(); if not s then return end
2583 if (not num) or (num > #s) then 2638 if (not num) or (num > #s) then
2584 return self:Print("Saved text number must be 1 - "..#s) 2639 return self:Print("Saved text number must be 1 - "..#s)
2585 end 2640 end
2586 self:Print("Deleting saved text #"..num) 2641 self:Print("Deleting saved text #"..num)
2587 tremove(s,num) 2642 tremove(s,num)
2639 new_uniques[i] = uniques_bywhen[tstamp] 2694 new_uniques[i] = uniques_bywhen[tstamp]
2640 end 2695 end
2641 p.unique = new_uniques 2696 p.unique = new_uniques
2642 end 2697 end
2643 2698
2699 function addon:repair_history_integrity()
2700 local rcount, pcount, hcount, errors = 0, 0, 0, 0
2701 local empties_to_delete = {}
2702
2703 for rname,realm in pairs(self.history_all) do
2704 for pk,player in ipairs(realm) do
2705 local id, when, unique, count = {}, {}, {}, {}
2706 for i,h in ipairs(player.unique) do
2707 h = tostring(h)
2708 if player.when[h] and player.id[h] then
2709 unique[#unique+1] = h
2710 id[h] = player.id[h]
2711 when[h] = player.when[h]
2712 count[h] = player.count[h]
2713 else
2714 self:Print("Realm %s, player %s, entry %d: tag <%s>, id <%s>, time <%s>, count <%s>",
2715 rname, player.name, i, h, tostring(player.id[h]),
2716 tostring(player.when[h]), tostring(player.count[h]))
2717 errors = errors + 1
2718 end
2719 hcount = hcount + 1
2720 end
2721 player.id, player.when, player.unique, player.count =
2722 id, when, unique, count
2723 player.person_class = g_loot.raiders[player.name]
2724 and g_loot.raiders[player.name].class
2725 if #player.unique > 1 then
2726 sort_player(player)
2727 elseif #player.unique == 0 then
2728 tinsert (empties_to_delete, 1, pk)
2729 end
2730 pcount = pcount + 1
2731 end
2732 if #empties_to_delete > 0 then
2733 for _,pk in ipairs(empties_to_delete) do
2734 local player = tremove (realm, pk)
2735 self:Print("Realm %s, player %s, is empty", rname, player.name)
2736 end
2737 wipe(empties_to_delete)
2738 end
2739 if #realm == 0 then
2740 self.history_all[rname] = nil
2741 self:Print("Realm %s is empty", rname)
2742 end
2743 rcount = rcount + 1
2744 end
2745 self:_build_history_names()
2746 if errors > 0 then
2747 self:Print("The listed entries have been erased from history.")
2748 end
2749 end
2750
2644 -- Possibly called during login. Cleared when no longer needed. 2751 -- Possibly called during login. Cleared when no longer needed.
2645 -- Rewrites a PLAYER table from format 3 to format 4. 2752 -- Rewrites a PLAYER table from format 3 to format 4.
2646 function addon:_uplift_history_format (player) 2753 function addon:_uplift_history_format (player)
2647 local unique, when, id, count = {}, {}, {}, {} 2754 local unique, when, id, count = {}, {}, {}, {}
2648 local name = player.name 2755 local name = player.name
2882 errtxt = "ZOMG! %s was in history but now is gone. Possibly your history tables have been corrupted and should be recreated. This is likely a bug. Tell Farmbuyer what steps you took to cause this." 2989 errtxt = "ZOMG! %s was in history but now is gone. Possibly your history tables have been corrupted and should be recreated. This is likely a bug. Tell Farmbuyer what steps you took to cause this."
2883 end 2990 end
2884 return nil, errtxt 2991 return nil, errtxt
2885 end 2992 end
2886 2993
2887 function addon:reassign_loot (index, to_name) 2994 -- Handles reassigning loot between players. Arguments depend on who's
2888 assert(type(to_name)=='string' and to_name:len()>0) 2995 -- calling it:
2889 local e = g_loot[index] 2996 -- "local", row_index, new_recipient
2997 -- "remote", sender, unique_id, item_id, old_recipient, new_recipient
2998 -- In the local case, must also broadcast a trigger. In the remote case,
2999 -- must figure out the corresponding loot entry (if it exists). In both
3000 -- cases, must update history appropriately. Returns nil if anything odd
3001 -- happens; returns the affected loot index on success.
3002 --function addon:reassign_loot (index, to_name)
3003 function addon:reassign_loot (how, ...)
3004 -- This must all be filled out in all cases:
3005 local e, index, from_name, to_name, unique, id
3006 -- Only set in remote case:
3007 local sender
3008
3009 if how == "local" then
3010 -- GUI doesn't allow reassignment unless the item is not-shard,
3011 -- so we can assume the presence of a unique tag in this function.
3012 index, to_name = ...
3013 assert(type(to_name)=='string' and to_name:len()>0)
3014 index = assert(tonumber(index))
3015 e = g_loot[index]
3016 id = e.id
3017 unique = assert(e.unique)
3018 from_name = e.person
3019
3020 elseif how == "remote" then
3021 sender, unique, id, from_name, to_name = ...
3022 id = tonumber(id)
3023 local cache
3024 local loop = 0
3025 repeat -- wtb continue statement pst
3026 if loop > 1 then break end
3027 e = nil
3028 cache = cache and g_uniques:SEARCH(unique) or g_uniques[unique]
3029 index = tonumber(cache.loot)
3030 if index then
3031 e = g_loot[index]
3032 else
3033 end
3034 loop = loop + 1
3035 until e and (e.id == id)
3036
3037 else
3038 return -- silently ignore future cases from future clients
3039 end
3040
3041 if self.debug.loot then
3042 local m = ("Reassign index %d (pre-unique %s) with id %d from '%s' to '%s'."):
3043 format(index, unique, id, tostring(from_name), tostring(to_name))
3044 self.dprint('loot', m)
3045 if sender == my_name then
3046 self.dprint('loot',"(Returning early from debug mode's double self-reassign.)")
3047 return index
3048 end
3049 end
3050
3051 if not e then
3052 -- say something?
3053 return
3054 end
3055
2890 local from_i, from_h, hist_i = _history_by_loot_id (e, "reassign") 3056 local from_i, from_h, hist_i = _history_by_loot_id (e, "reassign")
2891 local from_name = e.person
2892 local to_i,to_h = self:get_loot_history(to_name) 3057 local to_i,to_h = self:get_loot_history(to_name)
2893 3058
2894 if not from_i then -- from_h here is the formatted error text 3059 if not from_i then
2895 self:Print(from_h .. " Loot will be reassigned, but history will NOT be updated.", e.itemlink) 3060 if how == "local" then
3061 -- from_h here is the formatted error text
3062 self:Print(from_h .. " Loot will be reassigned, but history will NOT be updated.", e.itemlink)
3063 end
2896 else 3064 else
3065 -- XXX do some sanity checks here? from_name == from_h.name, etc?
3066
2897 local U = tremove (from_h.unique, hist_i) 3067 local U = tremove (from_h.unique, hist_i)
2898 -- The loot master giveth... 3068 -- The loot master giveth...
2899 to_h.unique[#to_h.unique+1] = U 3069 to_h.unique[#to_h.unique+1] = U
2900 to_h.when[U] = from_h.when[U] 3070 to_h.when[U] = from_h.when[U]
2901 to_h.id[U] = from_h.id[U] 3071 to_h.id[U] = from_h.id[U]
2906 from_h.id[U] = nil 3076 from_h.id[U] = nil
2907 from_h.count[U] = nil 3077 from_h.count[U] = nil
2908 -- Blessed be the lookup cache of the loot master. 3078 -- Blessed be the lookup cache of the loot master.
2909 g_uniques[U] = { loot = index, history = to_i } 3079 g_uniques[U] = { loot = index, history = to_i }
2910 end 3080 end
3081 local from_person_class = e.person_class or from_h.person_class
3082 or (g_loot.raiders[from_name] and g_loot.raiders[from_name].class)
3083 or select(2,_G.UnitClass(from_name))
2911 e.person = to_name 3084 e.person = to_name
2912 e.person_class = select(2,_G.UnitClass(to_name)) 3085 e.person_class = to_h.person_class
3086 or (g_loot.raiders[to_name] and g_loot.raiders[to_name].class)
3087 or select(2,_G.UnitClass(to_name))
2913 self.hist_clean = nil 3088 self.hist_clean = nil
2914 3089 self.loot_clean = nil
2915 self:Print("Reassigned entry %d/%s from '%s' to '%s'.", index, e.itemlink, from_name, to_name) 3090
3091 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,
3094 nil, from_name, from_person_class)
3095 self:vbroadcast('reassign', unique, id, from_name, to_name)
3096 elseif opts.chatty_on_remote_changes then
3097 _notify_about_remote (sender, index, nil, from_name, from_person_class)
3098 end
3099 if self.display then
3100 self.display:GetUserData("eoiST"):OuroLoot_Refresh(index)
3101 self:redisplay()
3102 end
3103 return index
2916 end 3104 end
2917 3105
2918 -- Similar to _addHistoryEntry. The second arg may be a loot entry 3106 -- Similar to _addHistoryEntry. The second arg may be a loot entry
2919 -- (which used to be at LOOTINDEX), or nil (and the loot entry will 3107 -- (which used to be at LOOTINDEX), or nil (and the loot entry will
2920 -- be pulled from LOOTINDEX instead). 3108 -- be pulled from LOOTINDEX instead).
3033 unique = e.unique -- can potentially still be nil at this step 3221 unique = e.unique -- can potentially still be nil at this step
3034 olddisp = e.disposition 3222 olddisp = e.disposition
3035 3223
3036 elseif how == "remote" then 3224 elseif how == "remote" then
3037 sender, unique, id, olddisp, newdisp = ... 3225 sender, unique, id, olddisp, newdisp = ...
3038 local cache = g_uniques[unique] 3226 id = tonumber(id)
3039 if cache.loot then 3227 local cache
3228 local loop = 0
3229 repeat -- wtb continue statement pst
3230 if loop > 1 then break end
3231 e = nil
3232 cache = cache and g_uniques:SEARCH(unique) or g_uniques[unique]
3040 index = tonumber(cache.loot) 3233 index = tonumber(cache.loot)
3041 e = g_loot[index] 3234 if index then
3042 end 3235 e = g_loot[index]
3236 else
3237 end
3238 loop = loop + 1
3239 until e and (e.id == id)
3043 3240
3044 else 3241 else
3045 return -- silently ignore future cases from future clients 3242 return -- silently ignore future cases from future clients
3046 end 3243 end
3047 3244
3062 3259
3063 e.disposition = newdisp 3260 e.disposition = newdisp
3064 e.bcast_from = nil -- I actually don't remember now why this gets cleared... 3261 e.bcast_from = nil -- I actually don't remember now why this gets cleared...
3065 e.extratext = nil 3262 e.extratext = nil
3066 self:history_handle_disposition (index, olddisp) 3263 self:history_handle_disposition (index, olddisp)
3264 self.hist_clean = nil
3265 self.loot_clean = nil
3067 -- A unique tag has been set by this point. 3266 -- A unique tag has been set by this point.
3068 if how == "local" then 3267 if how == "local" then
3069 unique = assert(e.unique) 3268 unique = assert(e.unique)
3070 self:vbroadcast('mark', unique, id, olddisp, newdisp) 3269 self:vbroadcast('mark', unique, id, olddisp, newdisp)
3071 end 3270 end
3153 addon.dprint('comm', "DOTmark/17, sender", sender, "unique", unique, 3352 addon.dprint('comm', "DOTmark/17, sender", sender, "unique", unique,
3154 "item", item, "from old", old, "to new", new) 3353 "item", item, "from old", old, "to new", new)
3155 local index = addon:loot_mark_disposition ("remote", sender, unique, item, old, new) 3354 local index = addon:loot_mark_disposition ("remote", sender, unique, item, old, new)
3156 --if not addon.enabled then return end -- hmm 3355 --if not addon.enabled then return end -- hmm
3157 if index and opts.chatty_on_remote_changes then 3356 if index and opts.chatty_on_remote_changes then
3158 _notify_about_remote (sender, index, --[[from_whom=]]nil, old) 3357 _notify_about_remote (sender, index, old)
3159 end 3358 end
3359 end
3360
3361 OCR_funcs['17reassign'] = function (sender, _, unique, item, from, to)
3362 addon.dprint('comm', "DOTreassign/17, sender", sender, "unique", unique,
3363 "item", item, "from", from, "to", to)
3364 --[[local index =]] addon:reassign_loot ("remote", sender, unique, item, from, to)
3365 -- Notification handled inside reassign_loot.
3160 end 3366 end
3161 3367
3162 OCR_funcs['16loot'] = function (sender, _, recip, item, count, extratext) 3368 OCR_funcs['16loot'] = function (sender, _, recip, item, count, extratext)
3163 addon.dprint('comm', "DOTloot/16, sender", sender, "recip", recip, "item", item, "count", count) 3369 addon.dprint('comm', "DOTloot/16, sender", sender, "recip", recip, "item", item, "count", count)
3164 if not addon.enabled then return end 3370 if not addon.enabled then return end