mirror of
https://github.com/Blaststar/Questie-Octo-Vanilla.git
synced 2026-10-26 23:20:50 +00:00
417 lines
11 KiB
Lua
417 lines
11 KiB
Lua
|
|
-- Title: TitanRepair v0.2
|
|
-- Notes: Adds Durability Info to Titan Panel, also reminds you to repair
|
|
-- Author: lua@lumpn.de
|
|
|
|
TITAN_REPAIR_ID = "Repair";
|
|
|
|
REPAIR_INDEX = 0;
|
|
REPAIR_MONEY = 0;
|
|
REPAIR_ITEM_STATUS = {};
|
|
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 };
|
|
|
|
|
|
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 = "0.3.1800",
|
|
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
|
|
}
|
|
};
|
|
|
|
this:RegisterEvent("BAG_UPDATE");
|
|
this:RegisterEvent("UPDATE_INVENTORY_ALERTS");
|
|
this:RegisterEvent("MERCHANT_SHOW");
|
|
this:RegisterEvent("MERCHANT_CLOSED");
|
|
end
|
|
|
|
|
|
function TitanPanelRepairButton_OnEvent()
|
|
if (event == "MERCHANT_SHOW") then
|
|
if TitanGetVar(TITAN_REPAIR_ID,"ShowPopup") == 1 then
|
|
local repairCost, canRepair = GetRepairAllCost();
|
|
if (canRepair) then
|
|
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
|
|
end
|
|
|
|
if ( event == "MERCHANT_CLOSED" ) then
|
|
StaticPopup_Hide("REPAIR_CONFIRMATION");
|
|
end
|
|
|
|
if ( event == "UPDATE_INVENTORY_ALERTS" ) then
|
|
local min_status = 1.0;
|
|
local min_val = 0;
|
|
local min_max = 0;
|
|
local min_index = 0;
|
|
|
|
for index, value in INVENTORY_ALERT_STATUS_SLOTS do
|
|
|
|
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
|
|
|
|
REPAIR_INDEX = min_index;
|
|
|
|
TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);
|
|
TitanPanelButton_UpdateTooltip();
|
|
end
|
|
|
|
if (event == "BAG_UPDATE") then
|
|
|
|
local min_status = 1.0;
|
|
local min_val = 0;
|
|
local min_max = 0;
|
|
|
|
REPAIR_ITEM_STATUS[12].cost = 0;
|
|
|
|
for bag = 0, 4 do
|
|
for slot = 1, GetContainerNumSlots(bag) do
|
|
|
|
local act_status, act_val, act_max, act_cost = TitanRepair_GetStatus(slot, bag);
|
|
if (act_status < min_status) then
|
|
min_status = act_status;
|
|
min_val = act_val;
|
|
min_max = act_max;
|
|
|
|
if((REPAIR_INDEX > 0) and (act_status < TitanRepair_GetStatusPercent(REPAIR_ITEM_STATUS[REPAIR_INDEX].val, REPAIR_ITEM_STATUS[REPAIR_INDEX].max))) then
|
|
REPAIR_INDEX = 12;
|
|
end
|
|
|
|
REPAIR_ITEM_STATUS[12].val = act_val;
|
|
REPAIR_ITEM_STATUS[12].max = act_max;
|
|
end
|
|
REPAIR_ITEM_STATUS[12].cost = REPAIR_ITEM_STATUS[12].cost + act_cost;
|
|
end
|
|
end
|
|
|
|
TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);
|
|
TitanPanelButton_UpdateTooltip();
|
|
end
|
|
end
|
|
|
|
function TitanRepair_GetStatusPercent(val, max)
|
|
|
|
if (max > 0) then
|
|
return (val / max);
|
|
end
|
|
|
|
return 1.0;
|
|
|
|
end;
|
|
|
|
|
|
function TitanRepair_GetStatus(index, bag)
|
|
|
|
local val = 0;
|
|
local max = 0;
|
|
local cost = 0;
|
|
|
|
local hasItem, repairCost
|
|
if (bag) then
|
|
local _, lRepairCost = TRTooltip:SetBagItem(bag, index);
|
|
repairCost = lRepairCost;
|
|
hasItem = 1;
|
|
else
|
|
local slotName = REPAIR_ITEM_STATUS[index].slot .. "Slot";
|
|
|
|
local id = GetInventorySlotInfo(slotName);
|
|
local lHasItem, _, lRepairCost = TRTooltip:SetInventoryItem("player", id);
|
|
hasItem = lHasItem;
|
|
repairCost = lRepairCost;
|
|
end
|
|
|
|
TRTooltip:Hide();
|
|
|
|
if (hasItem) then
|
|
|
|
if (repairCost) then
|
|
cost = repairCost;
|
|
end
|
|
|
|
for i = 1, 30 do
|
|
local text = getglobal("TRTooltipTextLeft" .. i):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
|
|
|
|
return TitanRepair_GetStatusPercent(val, max), val, max, cost;
|
|
|
|
end
|
|
|
|
|
|
function TitanRepair_GetStatusStr(index, short)
|
|
|
|
-- skip if fully repaired
|
|
if (index == 0) then
|
|
return TitanUtils_GetHighlightText("100%");
|
|
end
|
|
|
|
local valueText = "";
|
|
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
|
|
return nil;
|
|
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
|
|
if (TitanGetVar(TITAN_REPAIR_ID, "ShowColoredText")) then
|
|
if (item_frac == 0.0) then
|
|
valueText = TitanUtils_GetRedText(valueText);
|
|
elseif (item_frac < 0.2) then
|
|
valueText = TitanUtils_GetNormalText(valueText);
|
|
elseif (item_frac < 0.9) then
|
|
valueText = TitanUtils_GetGreenText(valueText);
|
|
else
|
|
valueText = TitanUtils_GetHighlightText(valueText);
|
|
end
|
|
else
|
|
valueText = TitanUtils_GetHighlightText(valueText);
|
|
end
|
|
|
|
-- 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
|
|
|
|
return valueText;
|
|
|
|
end
|
|
|
|
|
|
function TitanRepair_GetCostStr(cost)
|
|
|
|
if (cost > 0) then
|
|
return TitanUtils_GetHighlightText(format("%.2fg", cost / 10000));
|
|
end
|
|
|
|
return nil;
|
|
|
|
end
|
|
|
|
|
|
function TitanPanelRepairButton_GetButtonText(id)
|
|
|
|
-- supports turning off labels
|
|
return REPAIR_LOCALE["button"], TitanRepair_GetStatusStr(REPAIR_INDEX, 1);
|
|
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);
|
|
|
|
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_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 = TRTooltip:SetBagItem(bag, slot);
|
|
if (repairCost and (repairCost > 0)) then
|
|
UseContainerItem(bag,slot);
|
|
end
|
|
end
|
|
end
|
|
HideRepairCursor();
|
|
end
|
|
|
|
|
|
function TitanRepair_GetRepairInvCost()
|
|
|
|
local result = 0;
|
|
for bag = 0, 4 do
|
|
for slot = 1, GetContainerNumSlots(bag) do
|
|
local _, repairCost = TRTooltip:SetBagItem(bag, slot);
|
|
if (repairCost and (repairCost > 0)) then
|
|
result = result + repairCost;
|
|
end
|
|
end
|
|
end
|
|
TRTooltip:Hide();
|
|
|
|
return result;
|
|
end |