-- Title: TitanRepair v2.17 (improved Performances by Archarodim - 2006-04-21 04:35 CEST) -- Notes: Adds Durability Info to Titan Panel, also reminds you to repair -- Author: lua@lumpn.de/Adsertor TITAN_REPAIR_ID = "Repair"; REPAIR_INDEX = 0; REPAIR_MONEY = 0; REPAIR_ITEM_STATUS = {}; REPAIR_ITEM_BAG = {}; -- this index (0) will be never set, just accessed to this state, it simplifies code for TitanRepair_GetMostDamagedItem() when Tit_R_EquipedMinIndex == 0 REPAIR_ITEM_STATUS[0] = { val = 0, max = 0, cost = 0, name = INVTYPE_HEAD, slot = "VIRTUAL" }; -- REPAIR_ITEM_STATUS[1] = { val = 0, max = 0, cost = 0, name = INVTYPE_HEAD, slot = "Head" }; REPAIR_ITEM_STATUS[2] = { val = 0, max = 0, cost = 0, name = INVTYPE_SHOULDER, slot = "Shoulder" }; REPAIR_ITEM_STATUS[3] = { val = 0, max = 0, cost = 0, name = INVTYPE_CHEST, slot = "Chest" }; REPAIR_ITEM_STATUS[4] = { val = 0, max = 0, cost = 0, name = INVTYPE_WAIST, slot = "Waist" }; REPAIR_ITEM_STATUS[5] = { val = 0, max = 0, cost = 0, name = INVTYPE_LEGS, slot = "Legs" }; REPAIR_ITEM_STATUS[6] = { val = 0, max = 0, cost = 0, name = INVTYPE_FEET, slot = "Feet" }; REPAIR_ITEM_STATUS[7] = { val = 0, max = 0, cost = 0, name = INVTYPE_WRIST, slot = "Wrist" }; REPAIR_ITEM_STATUS[8] = { val = 0, max = 0, cost = 0, name = INVTYPE_HAND, slot = "Hands" }; REPAIR_ITEM_STATUS[9] = { val = 0, max = 0, cost = 0, name = INVTYPE_WEAPONMAINHAND, slot = "MainHand" }; REPAIR_ITEM_STATUS[10] = { val = 0, max = 0, cost = 0, name = INVTYPE_WEAPONOFFHAND, slot = "SecondaryHand" }; REPAIR_ITEM_STATUS[11] = { val = 0, max = 0, cost = 0, name = INVTYPE_RANGED, slot = "Ranged" }; REPAIR_ITEM_STATUS[12] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP }; INVENTORY_REPAIR_STATUS = {} INVENTORY_REPAIR_STATUS[0] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP }; INVENTORY_REPAIR_STATUS[1] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP }; INVENTORY_REPAIR_STATUS[2] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP }; INVENTORY_REPAIR_STATUS[3] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP }; INVENTORY_REPAIR_STATUS[4] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP }; local TitRep_show_debug = false; -- will tell you a lot about what's happening local Tit_R_WholeScanInProgress = false; local Tit_R_UpdateCheckDelay = 2; -- 2 seconds must elaps between scans local Tit_R_DelayTimer = 0; -- init the timer local Tit_R_EquipedMinIndex = 0; -- keep a record of the most damaged equiped item (used when removing the most damaged item placed in the inventory to switch on an equiped index) local Tit_R_PleaseCheckBag = { }; local Tit_R_CouldRepair = false; local Tit_R_CheckForUpdate = false; -- tells the TitanPanelRepairButton_OnUpdate() function that it has something to do Tit_R_PleaseCheckBag[0] = 0; Tit_R_PleaseCheckBag[1] = 0; Tit_R_PleaseCheckBag[2] = 0; Tit_R_PleaseCheckBag[3] = 0; Tit_R_PleaseCheckBag[4] = 0; Tit_R_PleaseCheckBag[5] = 0; -- this will be used for equiped items, not very good but simplify the code... -- Tit_R_PleaseCheckBag element values meaning: -- 0 means "This bag did not changed, no need to scan it" -- 1 means "Please Check This Bag" -- 2 means "Yes I'm checking, don't disturb me" -- local InitialLoad = 0; -- Found no use of this StaticPopupDialogs["REPAIR_CONFIRMATION"] = { text = TEXT(REPAIR_LOCALE["confirmation"]), button1 = TEXT(YES), button2 = TEXT(NO), OnAccept = function() TitanRepair_RepairItems(); end, OnShow = function() MoneyFrame_Update(this:GetName().."MoneyFrame", REPAIR_MONEY); end, hasMoneyFrame = 1, timeout = 0, }; function TitanPanelRepairButton_OnLoad() -- register plugin this.registry = { id = TITAN_REPAIR_ID, builtIn = 1, version = "2.17.11000", menuText = REPAIR_LOCALE["menu"], buttonTextFunction = "TitanPanelRepairButton_GetButtonText", tooltipTitle = REPAIR_LOCALE["tooltip"], tooltipTextFunction = "TitanPanelRepairButton_GetTooltipText", icon = "Interface\\AddOns\\Titan\\Artwork\\TitanRepair", iconWidth = 16, savedVariables = { ShowIcon = 1, ShowLabelText = 1, ShowItemName = TITAN_NIL, ShowUndamaged = TITAN_NIL, ShowPopup = TITAN_NIL, ShowPercentage = TITAN_NIL, ShowColoredText = TITAN_NIL, RepairInventory = TITAN_NIL, ShowInventory = 1 -- this is no longer a problem :-D } }; this:RegisterEvent("PLAYER_LEAVING_WORLD"); this:RegisterEvent("PLAYER_ENTERING_WORLD"); end function TitanPanelRepairButton_ScanAllItems() if (TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") == 1) then Tit_R_PleaseCheckBag[0] = 1; Tit_R_PleaseCheckBag[1] = 1; Tit_R_PleaseCheckBag[2] = 1; Tit_R_PleaseCheckBag[3] = 1; Tit_R_PleaseCheckBag[4] = 1; end Tit_R_PleaseCheckBag[5] = 1; Tit_R_WholeScanInProgress = true; TitanPanelButton_UpdateButton(TITAN_REPAIR_ID); end function TitanPanelRepairButton_OnEvent() -- NOTE that events test are done in probability order: -- The events that fires the most are tested first if (event == "UPDATE_INVENTORY_ALERTS") then -- register to check the equiped items on next appropriate OnUpdate call if (TitRep_show_debug) then -- this if is not necessary but is here to optimize this part the most possible tit_debug_bis("Event " .. event .. " TREATED!"); end Tit_R_PleaseCheckBag[5] = 1; Tit_R_CheckForUpdate = true; return; end -- when arg1 is > 4 it means that a bank's bag has been updated if ( (event == "BAG_UPDATE") and (arg1 < 5) and (TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") == 1)) then -- register to check this bag's items on next appropriate OnUpdate call if (TitRep_show_debug) then -- this if is not necessary but is here to optimize this part the most possible tit_debug_bis("Event " .. event .. " TREATED!"); end Tit_R_PleaseCheckBag[arg1] = 1; Tit_R_CheckForUpdate = true; return; end if (event == "MERCHANT_SHOW") then if TitanGetVar(TITAN_REPAIR_ID,"ShowPopup") == 1 then local repairCost, canRepair = GetRepairAllCost(); if (canRepair) then Tit_R_CouldRepair = true; if (TitanGetVar(TITAN_REPAIR_ID, "RepairInventory")) then repairCost = repairCost + TitanRepair_GetRepairInvCost(); end if (repairCost > 0) then REPAIR_MONEY = repairCost; StaticPopup_Show("REPAIR_CONFIRMATION"); end end end return; end if ( event == "MERCHANT_CLOSED" ) then StaticPopup_Hide("REPAIR_CONFIRMATION"); -- When an object is repaired in a bag, the BAG_UPDATE event is not sent... :'( -- so we rescan all if (Tit_R_CouldRepair) then TitanPanelRepairButton_ScanAllItems(); Tit_R_CheckForUpdate = true; Tit_R_CouldRepair = false; end; return; end if (event == "PLAYER_ENTERING_WORLD") then this:RegisterEvent("BAG_UPDATE"); this:RegisterEvent("UPDATE_INVENTORY_ALERTS"); this:RegisterEvent("MERCHANT_SHOW"); this:RegisterEvent("MERCHANT_CLOSED"); -- Check everything on world enter (at init and after zoning) -- (NOTE: this will take 6 * Tit_R_UpdateCheckDelay seconds to update) TitanPanelRepairButton_ScanAllItems(); Tit_R_CheckForUpdate = true; return; end if (event == "PLAYER_LEAVING_WORLD") then this:UnregisterEvent("BAG_UPDATE"); this:UnregisterEvent("UPDATE_INVENTORY_ALERTS"); this:UnregisterEvent("MERCHANT_SHOW"); this:UnregisterEvent("MERCHANT_CLOSED"); return; end end -- A little debug function function tit_debug_bis( Message) if (TitRep_show_debug) then DEFAULT_CHAT_FRAME:AddMessage("TiT_Rep: " .. Message, 0.5, 0.3, 1); end end function TitanPanelRepairButton_OnUpdate (Elapsed) -- Note that Tit_R_CheckForUpdate is a boolean value, boolean values are easier to test for the cpu if (not Tit_R_CheckForUpdate) then return; end Tit_R_CheckForUpdate = false; -- this is the first thing we do so another event that fires while we are here can set it to true -- test if a "bag" needs to be scanned for tocheck = 0, 5 do -- if there is one if (Tit_R_PleaseCheckBag[tocheck] == 1) then Tit_R_CheckForUpdate = true; -- so Tit_R_CheckForUpdate will remain false only if there WAS nothing to do :-) (The WAS is important) -- and ONLY if no event fires while we were in this loop... We can't miss anything :-D -- increase the delay timer Tit_R_DelayTimer = Tit_R_DelayTimer + Elapsed; -- if enough time has elapsed if (Tit_R_DelayTimer > Tit_R_UpdateCheckDelay) then -- we are checking... Tit_R_PleaseCheckBag[tocheck] = 2; -- reset the timer, next update will be made once Tit_R_UpdateCheckDelay seconds have elapsed from now Tit_R_DelayTimer = 0; if (tocheck ~= 5) then -- call update inventory function (I've put this test first because there is 5 chances on 6 that it returns true) tit_debug_bis("Upadate: Checking bag " .. tocheck .. " as requested"); TitanRepair_GetInventoryInformation(tocheck); else -- call update equiped items function tit_debug_bis("Upadate: Checking equiped items as requested"); TitanRepair_GetEquipedInformation(); end -- test if another check was not asked during this update (avoid to miss something... rare but still) if (Tit_R_PleaseCheckBag[tocheck] ~= 1) then -- Check completed Tit_R_PleaseCheckBag[tocheck] = 0; end -- we break here since we don't have time to scan anything else. break; else break; end end end -- These lines are commented because they're here just for debugging... -- if (not Tit_R_CheckForUpdate) then -- if we get here it means there was nothing to update (we've gone through 0 to 5 without hitting a bag to check that would have set Tit_R_CheckForUpdatep to true) -- tit_debug_bis("***No more \"Please\" to handle, easy mode on"); -- end end; function TitanRepair_GetStatusPercent(val, max) if (max > 0) then return (val / max); end return 1.0; end; function TitanRepair_GetMostDamagedItem () -- Get repair status for Equiped items and inventory -- NOTE: TitanRepair_GetStatusPercent() will return 1.0 if max value <= 0 local EquipedItemsStatus = TitanRepair_GetStatusPercent( REPAIR_ITEM_STATUS[Tit_R_EquipedMinIndex].val, REPAIR_ITEM_STATUS[Tit_R_EquipedMinIndex].max ); local InventoryItemsStatus = TitanRepair_GetStatusPercent( REPAIR_ITEM_STATUS[12].val, REPAIR_ITEM_STATUS[12].max ); -- if everything is repaired if (EquipedItemsStatus == 1.0 and InventoryItemsStatus == 1.0) then tit_debug_bis("Everything is repaired"); return 0; end -- If something is more or equaly damaged than the current most damaged equiped item -- -- NOTE: The <= is important because InventoryItemsStatus is updated BEFORE EquipedItemsStatus -- The typicale case is when you move the most damaged equiped item to your iventory, -- when this function will be called by TitanRepair_GetInventoryInformation(), Tit_R_EquipedMinIndex will point to an empty slot: -- since TitanRepair_GetEquipedInformation() won't have been called yet (bag update events are treated before equiped item event), -- EquipedItemsStatus will be egual to InventoryItemsStatus... -- So the <= is to avoid that Tit_R_EquipedMinIndex points to nothing (even if it has no concequence right now, it may save hours of debugging some day...) if ( (InventoryItemsStatus <= EquipedItemsStatus) and (TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") == 1) ) then tit_debug_bis("Inventory is more damaged than equiped items"); return 12; else -- if EquipedItemsStatus < InventoryItemsStatus tit_debug_bis("Equiped items are more damaged than inventory"); return Tit_R_EquipedMinIndex; end -- Typical 6 possibilities: -- - InventoryItemsStatus == 1 and EquipedItemsStatus == 1 ==> returns 0 -- - InventoryItemsStatus < 1 and EquipedItemsStatus == 1 ==> returns 12 -- - InventoryItemsStatus == 1 and EquipedItemsStatus < 1 ==> ! (InventoryItemsStatus <= EquipedItemsStatus) ==> returns Tit_R_EquipedMinIndex -- - InventoryItemsStatus < 1 and EquipedItemsStatus < 1 : -- - InventoryItemsStatus <= EquipedItemsStatus ==> returns 12 -- - InventoryItemsStatus > EquipedItemsStatus ==> ! (InventoryItemsStatus <= EquipedItemsStatus) ==> returns Tit_R_EquipedMinIndex end; function TitanRepair_GetInventoryInformation(bag) local min_status = 1.0; local min_val = 0; local min_max = 0; TitanRepairTooltip:SetOwner(WorldFrame, "ANCHOR_NONE"); if (bag > 4) then -- should never get true though, bag > 4 are for the bank's bags return; end -- we re-scan the whole bag so we reset its status INVENTORY_REPAIR_STATUS[bag].cost = 0; -- reset this bag globl repair cost INVENTORY_REPAIR_STATUS[bag].val = 0; -- INVENTORY_REPAIR_STATUS[bag].max = 0; -- for slot = 1, GetContainerNumSlots(bag) do -- find the most damaged item of this bag local act_status, act_val, act_max, act_cost = TitanRepair_GetStatus(slot, bag); -- retrieve slot's item repair status if (act_status < min_status) then -- if this item is more damaged than the others min_status = act_status; min_val = act_val; min_max = act_max; -- set the global bag repair state to this item state INVENTORY_REPAIR_STATUS[bag].val = act_val; INVENTORY_REPAIR_STATUS[bag].max = act_max; end -- add this item cost to this bag global repair cost INVENTORY_REPAIR_STATUS[bag].cost = INVENTORY_REPAIR_STATUS[bag].cost + act_cost; end -- We check all the bags so we reset the global inventory status REPAIR_ITEM_STATUS[12].cost = 0; -- reset global repair cost for inventory REPAIR_ITEM_STATUS[12].val = 0; -- REPAIR_ITEM_STATUS[12].max = 0; -- min_status = 1.0; -- reset min status to maximum -- let's find the bag that contains the most damaged item of the inventory for bag = 0, 4 do local act_val = INVENTORY_REPAIR_STATUS[bag].val ; local act_max = INVENTORY_REPAIR_STATUS[bag].max ; local act_cost = INVENTORY_REPAIR_STATUS[bag].cost ; local act_status= TitanRepair_GetStatusPercent(act_val, act_max); -- if the bag contains a damaged item (else act_status == 1, and min_status <= 1 and so this if never get true) if (act_status < min_status) then min_status = act_status; min_val = act_val; min_max = act_max; REPAIR_ITEM_STATUS[12].val = act_val; REPAIR_ITEM_STATUS[12].max = act_max; end -- add each bag global repair cost to inventory global repair cost REPAIR_ITEM_STATUS[12].cost = REPAIR_ITEM_STATUS[12].cost + act_cost; end REPAIR_INDEX = TitanRepair_GetMostDamagedItem(); tit_debug_bis("(inv) REPAIR_INDEX=" ..REPAIR_INDEX ); -- Update the button text only if we are not waiting for TitanRepair_GetEquipedInformation() -- else an incorrect value may be displayed till TitanRepair_GetEquipedInformation() is called -- if a whole scan is in progress we update the button ("Updating..." is displayed in that case, so incorrect values are acceptable) if ( (Tit_R_PleaseCheckBag[5] == 0) or Tit_R_WholeScanInProgress ) then TitanPanelButton_UpdateButton(TITAN_REPAIR_ID); else tit_debug_bis("Waiting for updating button text"); end TitanPanelButton_UpdateTooltip(); TitanRepairTooltip:Hide(); end function TitanRepair_GetEquipedInformation() local min_status = 1.0; local min_val = 0; local min_max = 0; local min_index = 0; Tit_R_EquipedMinIndex = 0; TitanRepairTooltip:SetOwner(WorldFrame, "ANCHOR_NONE"); for index, value in INVENTORY_ALERT_STATUS_SLOTS do -- index begins from 1 local act_status, act_val, act_max, act_cost = TitanRepair_GetStatus(index); if ( act_status < min_status ) then min_status = act_status; min_val = act_val; min_max = act_max; min_index = index; end REPAIR_ITEM_STATUS[index].val = act_val; REPAIR_ITEM_STATUS[index].max = act_max; REPAIR_ITEM_STATUS[index].cost = act_cost; end Tit_R_EquipedMinIndex = min_index; REPAIR_INDEX = TitanRepair_GetMostDamagedItem(); -- if a whole update is in progress, and we are here, then we have finished this wole update :) -- it has to be here because it changes the text of the button. if (Tit_R_WholeScanInProgress) then Tit_R_WholeScanInProgress = false; end tit_debug_bis("(equip) REPAIR_INDEX=" ..REPAIR_INDEX .. " min_index=" .. min_index); TitanPanelButton_UpdateButton(TITAN_REPAIR_ID); TitanPanelButton_UpdateTooltip(); TitanRepairTooltip:Hide(); end function TitanRepair_GetStatus(index, bag) local val = 0; local max = 0; local cost = 0; local hasItem, repairCost if (bag) then local _, lRepairCost = TitanRepairTooltip:SetBagItem(bag, index); repairCost = lRepairCost; hasItem = 1; else local slotName = REPAIR_ITEM_STATUS[index].slot .. "Slot"; local id = GetInventorySlotInfo(slotName); local lHasItem, _, lRepairCost = TitanRepairTooltip:SetInventoryItem("player", id); hasItem = lHasItem; repairCost = lRepairCost; end if (hasItem) then if (repairCost) then cost = repairCost; end for i = 1, 30 do local field = getglobal("TitanRepairTooltipTextLeft" .. i); if (field ~= nil) then local text = field:GetText(); if (text) then -- find durability local _, _, f_val, f_max = string.find(text, REPAIR_LOCALE["pattern"]); if (f_val) then val = tonumber(f_val); max = tonumber(f_max); end end end end end return TitanRepair_GetStatusPercent(val, max), val, max, cost; end local Tit_R_LastKnownText = ""; local Tit_R_LastKnownItemFrac = 1.0; function TitanRepair_GetStatusStr(index, short) -- skip if fully repaired if (index == 0) then return TitanRepair_AutoHighlight(1.0, "100%"); end local valueText = ""; -- if used for button text if (short) then valueText = Tit_R_LastKnownText; end local item_status = REPAIR_ITEM_STATUS[index]; local item_frac = TitanRepair_GetStatusPercent(item_status.val, item_status.max); -- skip if empty slot if (item_status.max == 0) then if (short) then if (not Tit_R_WholeScanInProgress) then valueText = TitanRepair_AutoHighlight(Tit_R_LastKnownItemFrac, valueText .. " (" .. REPAIR_LOCALE["WholeScanInProgress"] .. ")"); else valueText = TitanRepair_AutoHighlight(Tit_R_LastKnownItemFrac, valueText); end return valueText; else return nil; end end -- percent or value if (TitanGetVar(TITAN_REPAIR_ID,"ShowPercentage") or short) then valueText = string.format("%d%%", item_frac * 100); else valueText = string.format("%d / %d", item_status.val, item_status.max); end -- color valueText = TitanRepair_AutoHighlight(item_frac, valueText); -- name if (not short or TitanGetVar(TITAN_REPAIR_ID, "ShowItemName")) then valueText = valueText .. " " .. item_status.name; end -- add repair cost local item_cost = TitanRepair_GetCostStr(item_status.cost); if (not short and item_cost) then valueText = valueText .. "\t" .. item_cost; end if (short) then Tit_R_LastKnownText = valueText; Tit_R_LastKnownItemFrac = item_frac; end return valueText; end function TitanRepair_AutoHighlight (item_frac, valueText) -- I've changed this so when the ratio is 1, the text is green (green means OK for FPS, Latency, etc...) -- beneath 0.91 (so it can be true for 0.90) the text is white -- and red if the ratio reach 0.20 -- I didn't check for <= 0.90 or <= 0.20 because fractional eguality test is not acurate... if (TitanGetVar(TITAN_REPAIR_ID, "ShowColoredText")) then if (item_frac == 0.0) then valueText = TitanUtils_GetRedText(valueText); elseif (item_frac < 0.21) then valueText = TitanUtils_GetNormalText(valueText); elseif (item_frac < 0.91) then valueText = TitanUtils_GetHighlightText(valueText); else valueText = TitanUtils_GetGreenText(valueText); end else valueText = TitanUtils_GetHighlightText(valueText); end return valueText; end function TitanRepair_GetCostStr(cost) if (cost > 0) then return TitanUtils_GetHighlightText(string.format("%.2fg" , cost / 10000)); end return nil; end -- to move in the localisation files REPAIR_LOCALE["WholeScanInProgress"] = "Updating..."; function TitanPanelRepairButton_GetButtonText(id) -- supports turning off labels if (not Tit_R_WholeScanInProgress) then return REPAIR_LOCALE["button"], TitanRepair_GetStatusStr(REPAIR_INDEX, 1); else return REPAIR_LOCALE["button"], TitanRepair_GetStatusStr(REPAIR_INDEX, 1) .. " (" .. REPAIR_LOCALE["WholeScanInProgress"] .. ")"; end end function TitanPanelRepairButton_GetTooltipText() local out = ""; local cost = 0; local sum = 0; for i = 1, table.getn(REPAIR_ITEM_STATUS) do local str = TitanRepair_GetStatusStr(i); cost = REPAIR_ITEM_STATUS[i].cost; sum = sum + cost; if ((str) and (TitanGetVar(TITAN_REPAIR_ID,"ShowUndamaged") or (cost > 0))) then out = out .. str .. "\n"; end end if (sum > 0) then local costStr = TitanRepair_GetCostStr(sum); if (costStr) then out = out .. "\n" .. REPAIR_COST .. " " .. costStr; end else out = out .. "\n" .. REPAIR_LOCALE["nothing"]; end return out; end function TitanPanelRightClickMenu_PrepareRepairMenu() TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_REPAIR_ID].menuText); local info = {}; info.text = REPAIR_LOCALE["percentage"]; info.func = TitanRepair_ShowPercentage; info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowPercentage"); UIDropDownMenu_AddButton(info); local info = {}; info.text = REPAIR_LOCALE["itemname"]; info.func = TitanRepair_ShowItemName; info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowItemName"); UIDropDownMenu_AddButton(info); local info = {}; info.text = REPAIR_LOCALE["undamaged"]; info.func = TitanRepair_ShowUndamaged; info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowUndamaged"); UIDropDownMenu_AddButton(info); local info = {}; info.text = REPAIR_LOCALE["popup"]; info.func = TitanRepair_ShowPop; info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowPopup"); UIDropDownMenu_AddButton(info); local info = {}; info.text = REPAIR_LOCALE["repinventory"]; info.func = TitanRepair_RepairInventory; info.checked = TitanGetVar(TITAN_REPAIR_ID,"RepairInventory"); UIDropDownMenu_AddButton(info); local info = {}; info.text = REPAIR_LOCALE["showinventory"]; info.func = TitanRepair_ShowInventory; info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowInventory"); UIDropDownMenu_AddButton(info); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddToggleIcon(TITAN_REPAIR_ID); TitanPanelRightClickMenu_AddToggleLabelText(TITAN_REPAIR_ID); TitanPanelRightClickMenu_AddToggleColoredText(TITAN_REPAIR_ID); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_REPAIR_ID, TITAN_PANEL_MENU_FUNC_HIDE); end function TitanRepair_ShowPercentage() TitanToggleVar(TITAN_REPAIR_ID, "ShowPercentage"); TitanPanelButton_UpdateButton(TITAN_REPAIR_ID); end function TitanRepair_ShowItemName() TitanToggleVar(TITAN_REPAIR_ID, "ShowItemName"); TitanPanelButton_UpdateButton(TITAN_REPAIR_ID); end function TitanRepair_ShowUndamaged() TitanToggleVar(TITAN_REPAIR_ID, "ShowUndamaged"); end function TitanRepair_ShowPop() TitanToggleVar(TITAN_REPAIR_ID, "ShowPopup"); end function TitanRepair_RepairInventory() TitanToggleVar(TITAN_REPAIR_ID, "RepairInventory"); end function TitanRepair_ShowInventory() if (Tit_R_WholeScanInProgress) then return; end tit_debug_bis("TitanRepair_ShowInventory has been called !!"); TitanToggleVar(TITAN_REPAIR_ID, "ShowInventory"); if TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") ~= 1 then REPAIR_ITEM_STATUS[12].cost = 0; REPAIR_ITEM_STATUS[12].val = 0; REPAIR_ITEM_STATUS[12].max = 0; end TitanPanelRepairButton_ScanAllItems(); Tit_R_CheckForUpdate = true; end function TitanRepair_RepairItems() RepairAllItems(); if (not TitanGetVar(TITAN_REPAIR_ID, "RepairInventory")) then return; end ShowRepairCursor(); local bag, slot for bag = 0, 4 do for slot = 1, GetContainerNumSlots(bag) do local _, repairCost = TitanRepairTooltip:SetBagItem(bag, slot); if (repairCost and (repairCost > 0)) then UseContainerItem(bag,slot); Tit_R_PleaseCheckBag[bag] = 1; -- this bag will be updated Tit_R_CheckForUpdate = true; end end end HideRepairCursor(); end function TitanRepair_GetRepairInvCost() local result = 0; local bag; TitanRepairTooltip:SetOwner(WorldFrame, "ANCHOR_NONE"); for bag = 0, 4 do for slot = 1, GetContainerNumSlots(bag) do local _, repairCost = TitanRepairTooltip:SetBagItem(bag, slot); if (repairCost and (repairCost > 0)) then result = result + repairCost; end end end TitanRepairTooltip:Hide(); return result; end