diff --git a/Core.lua b/Core.lua index ded6587..e9a437a 100644 --- a/Core.lua +++ b/Core.lua @@ -3974,25 +3974,6 @@ function CleveRoids.OnUpdate(self) CR.EnsureSendChatMessageHook() end - -- Process deferred equipment index updates (for throttled UNIT_INVENTORY_CHANGED) - -- PERFORMANCE: Skip check entirely if no pending update - local pendingTime = CR.equipIndexPendingTime - if pendingTime and not UnitAffectingCombat("player") then - if (time - (CR.lastEquipIndexTime or 0)) >= 0.2 then - CR.lastEquipIndexTime = time - CR.equipIndexPendingTime = nil - CR.lastItemIndexTime = time - CR.IndexItems() - CR.Actions = {} - CR.Macros = {} - CR.IndexActionBars() - - if CRM.realtime == 0 then - CR.QueueActionUpdate() - end - end - end - -- PERFORMANCE: Check for expired reactive procs only if we have any -- Use statically allocated removal buffer to avoid per-frame allocation local reactiveProcs = CR.reactiveProcs @@ -5740,31 +5721,26 @@ function CleveRoids.Frame:BAG_UPDATE_DELAYED() end function CleveRoids.Frame:PLAYER_EQUIPMENT_CHANGED() - -- PERFORMANCE: Invalidate equipment cache for HasGearEquipped + -- arg1 = inventory slot that changed, arg2 = hasCurrent (slot now holds an item) + local slot, hasCurrent = arg1, arg2 + + -- [equipped]/HasGearEquipped runs off its own live-rebuilt cache; invalidating + -- it is all that conditional needs. if CleveRoids.InvalidateEquipmentCache then CleveRoids.InvalidateEquipmentCache() end - -- In combat: Skip ALL processing - EquipBagItem already handles cache invalidation - -- This eliminates lag from IndexEquippedItems during rapid gear swapping + -- In combat: Skip indexing - EquipBagItem already handles cache invalidation + -- at the call site. This eliminates lag during rapid gear swapping. if UnitAffectingCombat("player") then return end - -- Out of combat: Full indexing with throttle - local now = GetTime() - if (now - (CleveRoids.lastEquipIndexTime or 0)) < 0.2 then - CleveRoids.equipIndexPendingTime = now - return - end - - CleveRoids.lastEquipIndexTime = now - CleveRoids.equipIndexPendingTime = nil - CleveRoids.lastItemIndexTime = now - CleveRoids.IndexItems() - CleveRoids.Actions = {} - CleveRoids.Macros = {} - CleveRoids.IndexActionBars() + -- Out of combat: reindex only the one slot that changed (the bag side of any + -- swap is covered by BAG_UPDATE_DELAYED). No action-bar rebuild is needed - + -- gear swaps don't change what's on the bars; QueueActionUpdate re-evaluates + -- [equipped:...] icons/conditionals. + CleveRoids.IndexEquipSlot(slot, hasCurrent) if CleveRoidMacros.realtime == 0 then CleveRoids.QueueActionUpdate() diff --git a/Extensions/Tooltip/Generic.lua b/Extensions/Tooltip/Generic.lua index abb6950..e1b1b9a 100644 --- a/Extensions/Tooltip/Generic.lua +++ b/Extensions/Tooltip/Generic.lua @@ -196,13 +196,26 @@ function CleveRoids.IndexEquippedItems() end -- PERFORMANCE: Index a single equipment slot instead of all 20 --- Use when we know exactly which slot changed (e.g., from EquipBagItem) -function CleveRoids.IndexEquipSlot(inventoryID) +-- Use when we know exactly which slot changed (e.g., from EquipBagItem or +-- PLAYER_EQUIPMENT_CHANGED). hasCurrent is the event's arg2 (does the slot now +-- hold an item); pass false to skip the API probe on a slot we know is empty. +function CleveRoids.IndexEquipSlot(inventoryID, hasCurrent) if not inventoryID then return end local items = CleveRoids.Items or {} - local itemID = GetInventoryItemID("player", inventoryID) + -- Clear any stale inventoryID still pointing at this slot: the item that was + -- here is now unequipped or swapped out (its real location comes from the + -- paired BAG_UPDATE rebuild). Equip changes are user-paced, so this table + -- scan is off the hot path. + for _, entry in pairs(items) do + if type(entry) == "table" and entry.inventoryID == inventoryID then + entry.inventoryID = nil + end + end + + -- hasCurrent == false (arg2) => slot is now empty, nothing to add. + local itemID = hasCurrent ~= false and GetInventoryItemID("player", inventoryID) if itemID then local name, itemLink, _, _, itemType, itemSubType, _, _, texture = GetItemInfo(itemID) if name then