You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

278 lines
8.5 KiB

local _, addonTable = ...
-- Externals
local L = LibStub("AceLocale-3.0"):GetLocale("Rarity")
local dbicon = LibStub("LibDBIcon-1.0")
local ldb = LibStub:GetLibrary("LibDataBroker-1.1")
-- Upvalues
local R = Rarity
local GUI = Rarity.GUI
local CONSTANTS = addonTable.constants
local dataobj = ldb:NewDataObject("Rarity", {
type = "data source",
text = L["Loading"],
label = "Rarity",
tocname = "Rarity",
icon = [[Interface\Icons\spell_nature_forceofnature]],
})
GUI.dataobj = dataobj
function GUI:RegisterDataBroker()
dbicon:Register("Rarity", dataobj, Rarity.db.profile.minimap)
end
function dataobj.OnEnter(self)
Rarity.frame = self
if Rarity.db.profile.tooltipActivation == CONSTANTS.TOOLTIP.ACTIVATION_METHOD_HOVER then
Rarity.tooltipOpenDelay = true
-- The following will queue opening of the tooltip based on a user set delay that triggers on mouseover.
C_Timer.After(
Rarity.db.profile.tooltipShowDelay or 0.1, -- Delay in seconds
function()
Rarity.GUI:ShowDelayedTooltip()
end
)
else
Rarity:ShowQuicktip()
end
end
-- Helper function to open the Tooltip GUI unless the delayed opening has been aborted meanwhile.
function GUI:ShowDelayedTooltip()
if Rarity.tooltipOpenDelay == true then
Rarity:ShowTooltip()
end
end
function dataobj.OnLeave(self)
Rarity.tooltipOpenDelay = false -- Set false to abort any pending Tooltip openings that is called in ShowDelayedTooltip()
end
function dataobj:OnClick(button)
self = Rarity
local isRightButton = button == "RightButton"
local isLeftButton = button == "LeftButton"
if IsShiftKeyDown() and isLeftButton then
-- Show options
Rarity:Debug("Loading Rarity_Options addon")
LoadAddOn("Rarity_Options")
if R.optionsFrame then
-- Thanks, Blizzard (https://www.wowinterface.com/forums/showthread.php?t=54599)
InterfaceOptionsFrame_OpenToCategory(R.optionsFrame)
InterfaceOptionsFrame_OpenToCategory(R.optionsFrame)
else
R:Print(L["The Rarity Options module has been disabled. Log out and enable it from your add-ons menu."])
end
elseif IsControlKeyDown() and isLeftButton then
Rarity.GUI:SelectNextSortOrder()
elseif
(self.db.profile.tooltipActivation == CONSTANTS.TOOLTIP.ACTIVATION_METHOD_CLICK and isRightButton)
or (self.db.profile.tooltipActivation == CONSTANTS.TOOLTIP.ACTIVATION_METHOD_HOVER and isLeftButton)
then
Rarity.GUI:ToggleProgressBar()
elseif self.db.profile.tooltipActivation == CONSTANTS.TOOLTIP.ACTIVATION_METHOD_CLICK and isLeftButton then
if Rarity.Tooltips:IsTooltipAcquired("RarityTooltip") then
Rarity:HideTooltip()
else
Rarity:HideQuicktip()
Rarity:ShowTooltip()
end
end
end
function GUI:UpdateText()
dataobj = self.dataobj
self = Rarity
if not Rarity.Caching:IsReady() then
dataobj.text = L["Loading"]
.. " ("
.. format("%d%%", Rarity.Caching:GetPrimedItems() / Rarity.Caching:GetItemsToPrime() * 100)
.. ")"
return
end
self:ProfileStart()
local attempts, dropChance, chance
local trackedItem = Rarity.Tracking:GetTrackedItem(1)
if not trackedItem or (trackedItem and not trackedItem.itemId) then
dataobj.text = L["None"]
return
end
-- Feed text
local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemSellPrice =
GetItemInfo(trackedItem.itemId)
if not itemTexture then
dataobj.icon = [[Interface\Icons\spell_nature_forceofnature]]
else
dataobj.icon = itemTexture
end
attempts = 0
if trackedItem.attempts then
attempts = trackedItem.attempts
end
if trackedItem.lastAttempts then
attempts = attempts - trackedItem.lastAttempts
end
if trackedItem.realAttempts and trackedItem.found and not trackedItem.repeatable then
attempts = trackedItem.realAttempts
end
attempts = min(attempts, 2 ^ 31 - 1) -- Workaround to stop invalid attempt counts from breaking the addon; the correct count can be obtained by updating manually. It should also be restored automatically (at some point...) if the addon loads without errors. See issue: https://github.com/SacredDuckwhale/Rarity/issues/43) - This is mostly relevant for the two Archaeology mounts that may have invalid entries after the API was changed and not updated in the addon for quite some time
if trackedItem.found and not trackedItem.repeatable then
if trackedItem.method == CONSTANTS.DETECTION_METHODS.COLLECTION then
dataobj.text = L["Collection complete!"]
else
if attempts == 1 then
dataobj.text = format(L["Found on your first attempt!"], attempts)
else
dataobj.text = format(L["Found after %d attempts!"], attempts)
end
end
chance = 100.0
else
if trackedItem.method == CONSTANTS.DETECTION_METHODS.COLLECTION then
chance = (trackedItem.attempts or 0) / (trackedItem.chance or 100)
if chance < 0 then
chance = 0
end
if chance > 1 then
chance = 1
end
chance = chance * 100
dataobj.text = format(L["%d collected - %.2f%%"], attempts, chance)
else
dropChance = Rarity.Statistics.GetRealDropPercentage(trackedItem)
chance = 100 * (1 - math.pow(1 - dropChance, attempts))
if self.db.profile.feedText == CONSTANTS.LDB_TEXT_STYLES.FEED_MINIMAL then
if attempts == 1 then
dataobj.text = format(L["%d attempt"], attempts)
else
dataobj.text = format(L["%d attempts"], attempts)
end
elseif self.db.profile.feedText == CONSTANTS.LDB_TEXT_STYLES.FEED_VERBOSE then
if attempts == 1 then
dataobj.text = format(L["%s: %d attempt - %.2f%%"], itemLink or trackedItem.name, attempts, chance)
else
dataobj.text = format(L["%s: %d attempts - %.2f%%"], itemLink or trackedItem.name, attempts, chance)
end
else
if attempts == 1 then
dataobj.text = format(L["%d attempt - %.2f%%"], attempts, chance)
else
dataobj.text = format(L["%d attempts - %.2f%%"], attempts, chance)
end
end
end
end
-- Bar 1
if not chance then
chance = 0
end
if chance > 100 then
chance = 100
end
if chance < 0 then
chance = 0
end
local text = format("%s: %d (%.2f%%)", itemName or trackedItem.name, attempts, chance)
if not self.bar then
self.bar = self.barGroup:NewCounterBar(
"Track",
text,
chance,
100,
itemTexture or [[Interface\Icons\spell_nature_forceofnature]]
)
else
self.bar:SetIcon(itemTexture or [[Interface\Icons\spell_nature_forceofnature]])
self.bar:SetLabel(text)
self.bar:SetValue(chance, 100)
end
if self.hadBarTwo then -- If we've transitioning from 2 bars to 1, hiding/showing the bars collapses them
self.barGroup:Hide()
if self.db.profile.bar.visible then
self.barGroup:Show()
end
end
-- Bar 2
local trackedItem2 = Rarity.Tracking:GetTrackedItem(2)
if trackedItem2 == nil or trackedItem2.itemId == nil then
self.barGroup:RemoveBar("Track2")
self.bar2 = nil
else
self.hadBarTwo = true
_, -- itemName,
_, -- itemLink,
itemRarity,
itemLevel,
itemMinLevel,
itemType,
itemSubType,
itemStackCount,
itemEquipLoc,
itemTexture,
itemSellPrice =
GetItemInfo(trackedItem2.itemId)
attempts = 0
if trackedItem2.attempts then
attempts = trackedItem2.attempts
end
if trackedItem2.lastAttempts then
attempts = attempts - trackedItem2.lastAttempts
end
if trackedItem2.realAttempts and trackedItem2.found and not trackedItem2.repeatable then
attempts = trackedItem2.realAttempts
end
if trackedItem2.found and not trackedItem2.repeatable then
chance = 1.0
else
if trackedItem2.method == CONSTANTS.DETECTION_METHODS.COLLECTION then
chance = (trackedItem2.attempts or 0) / (trackedItem2.chance or 100)
if chance < 0 then
chance = 0
end
if chance > 1 then
chance = 1
end
chance = chance * 100
else
dropChance = Rarity.Statistics.GetRealDropPercentage(trackedItem2)
chance = 100 * (1 - math.pow(1 - dropChance, attempts))
end
end
if not chance then
chance = 0
end
if chance > 100 then
chance = 100
end
if chance < 0 then
chance = 0
end
text = format("%s: %d (%.2f%%)", trackedItem2.name or "", attempts, chance)
if not self.bar2 then
self.bar2 = self.barGroup:NewCounterBar(
"Track2",
text,
chance,
100,
itemTexture or [[Interface\Icons\spell_nature_forceofnature]]
)
else
self.bar2:SetIcon(itemTexture or [[Interface\Icons\spell_nature_forceofnature]])
self.bar2:SetLabel(text)
self.bar2:SetValue(chance, 100)
end
end
self:ProfileStop("UpdateText: %fms")
end