TradeSkillMaster/Core/Service/Tooltip/General.lua

390 lines
15 KiB
Lua
Raw Permalink Normal View History

2020-11-13 14:13:12 -05:00
-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local General = TSM.Tooltip:NewPackage("General")
local L = TSM.Include("Locale").GetTable()
local DisenchantInfo = TSM.Include("Data.DisenchantInfo")
local TempTable = TSM.Include("Util.TempTable")
local String = TSM.Include("Util.String")
local ItemString = TSM.Include("Util.ItemString")
local ItemInfo = TSM.Include("Service.ItemInfo")
local CustomPrice = TSM.Include("Service.CustomPrice")
local Conversions = TSM.Include("Service.Conversions")
local Inventory = TSM.Include("Service.Inventory")
local private = {
tooltipInfo = nil,
}
local DESTROY_INFO = {
{ key = "deTooltip", method = Conversions.METHOD.DISENCHANT },
{ key = "millTooltip", method = Conversions.METHOD.MILL },
{ key = "prospectTooltip", method = Conversions.METHOD.PROSPECT },
{ key = "transformTooltip", method = Conversions.METHOD.TRANSFORM },
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function General.OnInitialize()
local tooltipInfo = TSM.Tooltip.CreateInfo()
:SetHeadings(L["TSM General Info"])
private.tooltipInfo = tooltipInfo
CustomPrice.RegisterCustomSourceCallback(private.UpdateCustomSources)
-- group name
tooltipInfo:AddSettingEntry("groupNameTooltip", nil, private.PopulateGroupLine)
-- operations
for _, moduleName in TSM.Operations.ModuleIterator() do
tooltipInfo:AddSettingEntry("operationTooltips."..moduleName, false, private.PopulateOperationLine, moduleName)
end
-- destroy info
for _, info in ipairs(DESTROY_INFO) do
tooltipInfo:AddSettingEntry(info.key, nil, private.PopulateDestroyValueLine, info.method)
tooltipInfo:AddSettingEntry("detailedDestroyTooltip", nil, private.PopulateDetailLines, info.method)
end
-- vendor prices
tooltipInfo:AddSettingEntry("vendorBuyTooltip", nil, private.PopulateVendorBuyLine)
tooltipInfo:AddSettingEntry("vendorSellTooltip", nil, private.PopulateVendorSellLine)
-- custom sources
private.UpdateCustomSources()
-- inventory info
tooltipInfo:AddSettingValueEntry("inventoryTooltipFormat", "full", "none", private.PopulateFullInventoryLines)
tooltipInfo:AddSettingValueEntry("inventoryTooltipFormat", "simple", "none", private.PopulateSimpleInventoryLine)
TSM.Tooltip.Register(tooltipInfo)
end
function private.UpdateCustomSources()
private.tooltipInfo:DeleteSettingsByKeyMatch("^customPriceTooltips%.")
local customPriceSources = TempTable.Acquire()
for name in pairs(TSM.db.global.userData.customPriceSources) do
tinsert(customPriceSources, name)
end
sort(customPriceSources)
for _, name in ipairs(customPriceSources) do
private.tooltipInfo:AddSettingEntry("customPriceTooltips."..name, false, private.PopulateCustomPriceLine, name)
end
TempTable.Release(customPriceSources)
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.PopulateGroupLine(tooltip, itemString)
-- add group / operation info
local groupPath, itemInGroup = nil, nil
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
groupPath = L["Example"]
itemInGroup = true
else
groupPath = TSM.Groups.GetPathByItem(itemString)
if groupPath == TSM.CONST.ROOT_GROUP_PATH then
groupPath = nil
else
itemInGroup = TSM.Groups.IsItemInGroup(itemString)
end
end
if groupPath then
local leftText = itemInGroup and GROUP or (GROUP.." ("..L["Base Item"]..")")
tooltip:AddTextLine(leftText, TSM.Groups.Path.Format(groupPath))
end
end
function private.PopulateOperationLine(tooltip, itemString, moduleName)
assert(moduleName)
local operations = TempTable.Acquire()
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
tinsert(operations, L["Example"])
else
local groupPath = TSM.Groups.GetPathByItem(itemString)
if groupPath == TSM.CONST.ROOT_GROUP_PATH then
groupPath = nil
end
if not groupPath then
TempTable.Release(operations)
return
end
for _, operationName in TSM.Operations.GroupOperationIterator(moduleName, groupPath) do
tinsert(operations, operationName)
end
end
if #operations > 0 then
tooltip:AddLine(format(#operations == 1 and L["%s operation"] or L["%s operations"], TSM.Operations.GetLocalizedName(moduleName)), tooltip:ApplyValueColor(table.concat(operations, ", ")))
end
TempTable.Release(operations)
end
function private.PopulateDestroyValueLine(tooltip, itemString, method)
local value = nil
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
if method == Conversions.METHOD.DISENCHANT then
value = 10
elseif method == Conversions.METHOD.MILL then
value = 50
elseif method == Conversions.METHOD.PROSPECT then
value = 20
elseif method == Conversions.METHOD.TRANSFORM then
value = 30
else
error("Invalid method: "..tostring(method))
end
else
value = CustomPrice.GetConversionsValue(itemString, TSM.db.global.coreOptions.destroyValueSource, method)
end
if not value then
return
end
local label = nil
if method == Conversions.METHOD.DISENCHANT then
label = L["Disenchant Value"]
elseif method == Conversions.METHOD.MILL then
label = L["Mill Value"]
elseif method == Conversions.METHOD.PROSPECT then
label = L["Prospect Value"]
elseif method == Conversions.METHOD.TRANSFORM then
label = L["Transform Value"]
else
error("Invalid method: "..tostring(method))
end
tooltip:AddItemValueLine(label, value)
end
function private.PopulateDetailLines(tooltip, itemString, method)
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
tooltip:StartSection()
if method == Conversions.METHOD.DISENCHANT then
tooltip:AddSubItemValueLine(ItemString.GetPlaceholder(), 1, 10, 1, 1, 20)
elseif method == Conversions.METHOD.MILL then
tooltip:AddSubItemValueLine(ItemString.GetPlaceholder(), 5, 10, 1)
elseif method == Conversions.METHOD.PROSPECT then
tooltip:AddSubItemValueLine(ItemString.GetPlaceholder(), 2, 10, 1, 1, 20)
elseif method == Conversions.METHOD.TRANSFORM then
tooltip:AddSubItemValueLine(ItemString.GetPlaceholder(), 3, 10, 1)
else
error("Invalid method: "..tostring(method))
end
tooltip:EndSection()
return
elseif not CustomPrice.GetConversionsValue(itemString, TSM.db.global.coreOptions.destroyValueSource, method) then
return
end
tooltip:StartSection()
if method == Conversions.METHOD.DISENCHANT then
local quality = ItemInfo.GetQuality(itemString)
local ilvl = ItemInfo.GetItemLevel(ItemString.GetBase(itemString))
local classId = ItemInfo.GetClassId(itemString)
for targetItemString in DisenchantInfo.TargetItemIterator() do
local amountOfMats, matRate, minAmount, maxAmount = DisenchantInfo.GetTargetItemSourceInfo(targetItemString, classId, quality, ilvl)
if amountOfMats then
local matValue = CustomPrice.GetValue(TSM.db.global.coreOptions.destroyValueSource, targetItemString) or 0
if matValue > 0 then
tooltip:AddSubItemValueLine(targetItemString, matValue, amountOfMats, matRate, minAmount, maxAmount)
end
end
end
else
for targetItemString, amountOfMats, matRate, minAmount, maxAmount in Conversions.TargetItemsByMethodIterator(itemString, method) do
local matValue = CustomPrice.GetValue(TSM.db.global.coreOptions.destroyValueSource, targetItemString) or 0
if matValue > 0 then
tooltip:AddSubItemValueLine(targetItemString, matValue, amountOfMats, matRate, minAmount, maxAmount)
end
end
end
tooltip:EndSection()
end
function private.PopulateVendorBuyLine(tooltip, itemString)
local value = nil
if itemString == ItemString.GetPlaceholder() then
-- example item
value = 50
else
value = ItemInfo.GetVendorBuy(itemString) or 0
end
if value > 0 then
tooltip:AddItemValueLine(L["Vendor Buy Price"], value)
end
end
function private.PopulateVendorSellLine(tooltip, itemString)
local value = nil
if itemString == ItemString.GetPlaceholder() then
-- example item
value = 8
else
value = ItemInfo.GetVendorSell(itemString) or 0
end
if value > 0 then
tooltip:AddItemValueLine(L["Vendor Sell Price"], value)
end
end
function private.PopulateCustomPriceLine(tooltip, itemString, name)
assert(name)
if not TSM.db.global.userData.customPriceSources[name] then
-- TODO: this custom price source has been removed (ideally shouldn't get here)
return
end
local value = nil
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
value = 10
else
value = CustomPrice.GetValue(name, itemString) or 0
end
if value > 0 then
tooltip:AddItemValueLine(L["Custom Source"].." ("..name..")", value)
end
end
function private.PopulateFullInventoryLines(tooltip, itemString)
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
local totalNum = 0
local playerName = UnitName("player")
local bag, bank, auction, mail, guildQuantity = 5, 4, 4, 9, 1
local playerTotal = bag + bank + auction + mail
totalNum = totalNum + playerTotal
tooltip:StartSection(L["Inventory"], format(L["%s total"], tooltip:ApplyValueColor(totalNum)))
local classColor = RAID_CLASS_COLORS[TSM.db:Get("sync", TSM.db:GetSyncScopeKeyByCharacter(UnitName("player")), "internalData", "classKey")]
local rightText = private.RightTextFormatHelper(tooltip, L["%s (%s bags, %s bank, %s AH, %s mail)"], playerTotal, bag, bank, auction, mail)
if classColor then
tooltip:AddLine("|c"..classColor.colorStr..playerName.."|r", rightText)
else
tooltip:AddLine(playerName, rightText)
end
totalNum = totalNum + guildQuantity
tooltip:AddLine(L["Example"], format(L["%s in guild vault"], tooltip:ApplyValueColor(guildQuantity)))
tooltip:EndSection()
return
end
-- calculate the total number
local totalNum = 0
for factionrealm in TSM.db:GetConnectedRealmIterator("factionrealm") do
for _, character in TSM.db:FactionrealmCharacterIterator(factionrealm) do
local bag = Inventory.GetBagQuantity(itemString, character, factionrealm)
local bank = Inventory.GetBankQuantity(itemString, character, factionrealm)
local reagentBank = Inventory.GetReagentBankQuantity(itemString, character, factionrealm)
local auction = Inventory.GetAuctionQuantity(itemString, character, factionrealm)
local mail = Inventory.GetMailQuantity(itemString, character, factionrealm)
totalNum = totalNum + bag + bank + reagentBank + auction + mail
end
end
for guildName in pairs(TSM.db.factionrealm.internalData.guildVaults) do
local guildQuantity = Inventory.GetGuildQuantity(itemString, guildName)
totalNum = totalNum + guildQuantity
end
tooltip:StartSection(L["Inventory"], format(L["%s total"], tooltip:ApplyValueColor(totalNum)))
-- add the lines
for factionrealm in TSM.db:GetConnectedRealmIterator("factionrealm") do
for _, character in TSM.db:FactionrealmCharacterIterator(factionrealm) do
local realm = strmatch(factionrealm, "^.* "..String.Escape("-").." (.*)")
if realm == GetRealmName() then
realm = ""
else
realm = " - "..realm
end
local bag = Inventory.GetBagQuantity(itemString, character, factionrealm)
local bank = Inventory.GetBankQuantity(itemString, character, factionrealm)
local reagentBank = Inventory.GetReagentBankQuantity(itemString, character, factionrealm)
local auction = Inventory.GetAuctionQuantity(itemString, character, factionrealm)
local mail = Inventory.GetMailQuantity(itemString, character, factionrealm)
local playerTotal = bag + bank + reagentBank + auction + mail
if playerTotal > 0 then
local classColor = RAID_CLASS_COLORS[TSM.db:Get("sync", TSM.db:GetSyncScopeKeyByCharacter(character, factionrealm), "internalData", "classKey")]
local rightText = private.RightTextFormatHelper(tooltip, L["%s (%s bags, %s bank, %s AH, %s mail)"], playerTotal, bag, bank + reagentBank, auction, mail)
if classColor then
tooltip:AddLine("|c"..classColor.colorStr..character..realm.."|r", rightText)
else
tooltip:AddLine(character..realm, rightText)
end
end
end
end
for guildName in pairs(TSM.db.factionrealm.internalData.guildVaults) do
local guildQuantity = Inventory.GetGuildQuantity(itemString, guildName)
if guildQuantity > 0 then
tooltip:AddLine(guildName, format(L["%s in guild vault"], tooltip:ApplyValueColor(guildQuantity)))
end
end
tooltip:EndSection()
end
function private.PopulateSimpleInventoryLine(tooltip, itemString)
if itemString == ItemString.GetPlaceholder() then
-- example tooltip
local totalPlayer, totalAlt, totalGuild, totalAuction = 18, 0, 1, 4
local totalNum2 = totalPlayer + totalAlt + totalGuild + totalAuction
local rightText2 = nil
if not TSM.IsWowClassic() then
rightText2 = private.RightTextFormatHelper(tooltip, L["%s (%s player, %s alts, %s guild, %s AH)"], totalNum2, totalPlayer, totalAlt, totalGuild, totalAuction)
else
rightText2 = private.RightTextFormatHelper(tooltip, L["%s (%s player, %s alts, %s AH)"], totalNum2, totalPlayer, totalAlt, totalAuction)
end
tooltip:AddLine(L["Inventory"], rightText2)
end
local totalPlayer, totalAlt, totalGuild, totalAuction = 0, 0, 0, 0
for factionrealm in TSM.db:GetConnectedRealmIterator("factionrealm") do
for _, character in TSM.db:FactionrealmCharacterIterator(factionrealm) do
local bag = Inventory.GetBagQuantity(itemString, character, factionrealm)
local bank = Inventory.GetBankQuantity(itemString, character, factionrealm)
local reagentBank = Inventory.GetReagentBankQuantity(itemString, character, factionrealm)
local auction = Inventory.GetAuctionQuantity(itemString, character, factionrealm)
local mail = Inventory.GetMailQuantity(itemString, character, factionrealm)
if character == UnitName("player") then
totalPlayer = totalPlayer + bag + bank + reagentBank + mail
totalAuction = totalAuction + auction
else
totalAlt = totalAlt + bag + bank + reagentBank + mail
totalAuction = totalAuction + auction
end
end
end
for guildName in pairs(TSM.db.factionrealm.internalData.guildVaults) do
totalGuild = totalGuild + Inventory.GetGuildQuantity(itemString, guildName)
end
local totalNum = totalPlayer + totalAlt + totalGuild + totalAuction
if totalNum > 0 then
local rightText = nil
if not TSM.IsWowClassic() then
rightText = private.RightTextFormatHelper(tooltip, L["%s (%s player, %s alts, %s guild, %s AH)"], totalNum, totalPlayer, totalAlt, totalGuild, totalAuction)
else
rightText = private.RightTextFormatHelper(tooltip, L["%s (%s player, %s alts, %s AH)"], totalNum, totalPlayer, totalAlt, totalAuction)
end
tooltip:AddLine(L["Inventory"], rightText)
end
end
function private.RightTextFormatHelper(tooltip, fmtStr, ...)
local parts = TempTable.Acquire(...)
for i = 1, #parts do
parts[i] = tooltip:ApplyValueColor(parts[i])
end
local result = format(fmtStr, unpack(parts))
TempTable.Release(parts)
return result
end