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.
381 lines
12 KiB
381 lines
12 KiB
local SLE, T, E, L, V, P, G = unpack(ElvUI_SLE)
|
|
local DT = E.DataTexts
|
|
local B = E.Bags
|
|
|
|
local _G = _G
|
|
local type, tonumber, wipe, pairs, ipairs, sort = type, tonumber, wipe, pairs, ipairs, sort
|
|
local format, strjoin, tostring, tinsert = format, strjoin, tostring, tinsert
|
|
|
|
local GetMoney = GetMoney
|
|
local IsControlKeyDown, IsShiftKeyDown = IsControlKeyDown, IsShiftKeyDown
|
|
local IsLoggedIn = IsLoggedIn
|
|
local BreakUpLargeNumbers = BreakUpLargeNumbers
|
|
local C_WowTokenPublic_UpdateMarketPrice = C_WowTokenPublic.UpdateMarketPrice
|
|
local C_WowTokenPublic_GetCurrentMarketPrice = C_WowTokenPublic.GetCurrentMarketPrice
|
|
local C_Timer_NewTicker = C_Timer.NewTicker
|
|
local C_Container_GetContainerItemLink = C_Container.GetContainerItemLink
|
|
local C_Container_GetContainerNumSlots = C_Container.GetContainerNumSlots
|
|
local C_Container_GetContainerItemInfo = C_Container.GetContainerItemInfo
|
|
local C_Container_GetBagName = C_Container.GetBagName
|
|
local C_Item_IsAnimaItemByID = C_Item.IsAnimaItemByID
|
|
local GetItemSpell = GetItemSpell
|
|
|
|
local BONUS_ROLL_REWARD_MONEY = BONUS_ROLL_REWARD_MONEY
|
|
local MAX_WATCHED_TOKENS = MAX_WATCHED_TOKENS or 3
|
|
local CURRENCY = CURRENCY
|
|
local PRIEST_COLOR = RAID_CLASS_COLORS.PRIEST
|
|
|
|
local Profit, Spent, Ticker, goldText = 0, 0
|
|
local resetCountersFormatter = strjoin('', '|cffaaaaaa', L["Reset Session Data: Hold Ctrl + Right Click"], '|r')
|
|
local resetInfoFormatter = strjoin('', '|cffaaaaaa', L["Reset Character Data: Hold Shift + Right Click"], '|r')
|
|
|
|
local menuList, myGold = {}, {}
|
|
local animaSpellID = { [347555] = 3, [345706] = 5, [336327] = 35, [336456] = 250 }
|
|
local totalGold, totalHorde, totalAlliance = 0, 0, 0
|
|
local iconString = '|T%s:16:16:0:0:64:64:4:60:4:60|t'
|
|
DT.CurrencyList = { GOLD = BONUS_ROLL_REWARD_MONEY, BACKPACK = 'Backpack' }
|
|
|
|
local function deleteCharacter(_, realm, name)
|
|
ElvDB.gold[realm][name] = nil
|
|
ElvDB.class[realm][name] = nil
|
|
ElvDB.faction[realm][name] = nil
|
|
|
|
DT:ForceUpdate_DataText('S&L Currencies')
|
|
end
|
|
|
|
local function OnClick(self, btn)
|
|
if btn == 'RightButton' then
|
|
if IsShiftKeyDown() then
|
|
wipe(menuList)
|
|
tinsert(menuList, { text = 'Delete Character', isTitle = true, notCheckable = true })
|
|
for realm in pairs(ElvDB.serverID[E.serverID]) do
|
|
for name in pairs(ElvDB.gold[realm]) do
|
|
tinsert(menuList, {
|
|
text = format('%s - %s', name, realm),
|
|
notCheckable = true,
|
|
func = function()
|
|
deleteCharacter(self, realm, name)
|
|
end
|
|
})
|
|
end
|
|
end
|
|
|
|
E:SetEasyMenuAnchor(E.EasyMenu, self)
|
|
_G.EasyMenu(menuList, E.EasyMenu, nil, nil, nil, 'MENU')
|
|
elseif IsControlKeyDown() then
|
|
Profit = 0
|
|
Spent = 0
|
|
end
|
|
else
|
|
_G.ToggleCharacter('TokenFrame')
|
|
end
|
|
end
|
|
|
|
local function AddInfo(id)
|
|
local info, name, icon = DT:CurrencyInfo(id)
|
|
if name then
|
|
local textRight = '%s'
|
|
if E.global.datatexts.settings.Currencies.maxCurrency and info.maxQuantity and info.maxQuantity > 0 then
|
|
textRight = '%s / '..BreakUpLargeNumbers(info.maxQuantity)
|
|
end
|
|
|
|
DT.tooltip:AddDoubleLine(format('%s %s', icon, name), format(textRight, BreakUpLargeNumbers(info.quantity)), 1, 1, 1, 1, 1, 1)
|
|
end
|
|
end
|
|
|
|
local shownHeaders = {}
|
|
local function AddHeader(id, addLine)
|
|
if (not E.global.datatexts.settings.Currencies.headers) or shownHeaders[id] then return end
|
|
|
|
if addLine then
|
|
DT.tooltip:AddLine(' ')
|
|
end
|
|
|
|
DT.tooltip:AddLine(E.global.datatexts.settings.Currencies.tooltipData[id][1])
|
|
shownHeaders[id] = true
|
|
end
|
|
|
|
local function sortFunction(a, b)
|
|
return a.amount > b.amount
|
|
end
|
|
|
|
local function updateTotal(faction, change)
|
|
if faction == 'Alliance' then
|
|
totalAlliance = totalAlliance + change
|
|
elseif faction == 'Horde' then
|
|
totalHorde = totalHorde + change
|
|
end
|
|
|
|
totalGold = totalGold + change
|
|
end
|
|
|
|
local function updateGold(self, updateAll, goldChange)
|
|
local textOnly = not E.global.datatexts.settings.Gold.goldCoins and true or false
|
|
local style = E.global.datatexts.settings.Gold.goldFormat or 'BLIZZARD'
|
|
|
|
if updateAll then
|
|
wipe(myGold)
|
|
wipe(menuList)
|
|
|
|
totalGold, totalHorde, totalAlliance = 0, 0, 0
|
|
|
|
tinsert(menuList, { text = '', isTitle = true, notCheckable = true })
|
|
tinsert(menuList, { text = 'Delete Character', isTitle = true, notCheckable = true })
|
|
|
|
local realmN = 1
|
|
for realm in pairs(ElvDB.serverID[E.serverID]) do
|
|
tinsert(menuList, realmN, { text = 'Delete All - '..realm, notCheckable = true, func = function() ElvDB.gold[realm] = {} DT:ForceUpdate_DataText('Gold') end })
|
|
realmN = realmN + 1
|
|
for name in pairs(ElvDB.gold[realm]) do
|
|
local faction = ElvDB.faction[realm][name]
|
|
local gold = ElvDB.gold[realm][name]
|
|
|
|
if gold then
|
|
local color = E:ClassColor(ElvDB.class[realm][name]) or PRIEST_COLOR
|
|
|
|
tinsert(myGold, {
|
|
name = name,
|
|
realm = realm,
|
|
amount = gold,
|
|
amountText = E:FormatMoney(gold, style, textOnly),
|
|
faction = faction or '',
|
|
r = color.r, g = color.g, b = color.b,
|
|
})
|
|
|
|
tinsert(menuList, {
|
|
text = format('%s - %s', name, realm),
|
|
notCheckable = true,
|
|
func = function() deleteCharacter(self, realm, name) end
|
|
})
|
|
|
|
updateTotal(faction, gold)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for _, info in ipairs(myGold) do
|
|
if info.name == E.myname and info.realm == E.myrealm then
|
|
info.amount = ElvDB.gold[E.myrealm][E.myname]
|
|
info.amountText = E:FormatMoney(ElvDB.gold[E.myrealm][E.myname], style, textOnly)
|
|
|
|
break
|
|
end
|
|
end
|
|
|
|
if goldChange then
|
|
updateTotal(E.myfaction, goldChange)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function UpdateMarketPrice()
|
|
return C_WowTokenPublic_UpdateMarketPrice()
|
|
end
|
|
|
|
local function OnEvent(self, event)
|
|
if not IsLoggedIn() then return end
|
|
|
|
if E.Retail and not Ticker then
|
|
C_WowTokenPublic_UpdateMarketPrice()
|
|
Ticker = C_Timer_NewTicker(60, UpdateMarketPrice)
|
|
end
|
|
|
|
--prevent an error possibly from really old profiles
|
|
local oldMoney = ElvDB.gold[E.myrealm][E.myname]
|
|
if oldMoney and type(oldMoney) ~= 'number' then
|
|
ElvDB.gold[E.myrealm][E.myname] = nil
|
|
oldMoney = nil
|
|
end
|
|
|
|
local NewMoney = GetMoney()
|
|
ElvDB.gold[E.myrealm][E.myname] = NewMoney
|
|
|
|
local OldMoney = oldMoney or NewMoney
|
|
local Change = NewMoney-OldMoney -- Positive if we gain money
|
|
if OldMoney>NewMoney then -- Lost Money
|
|
Spent = Spent - Change
|
|
else -- Gained Moeny
|
|
Profit = Profit + Change
|
|
end
|
|
|
|
updateGold(self, event == 'ELVUI_FORCE_UPDATE', Change)
|
|
|
|
goldText = E:FormatMoney(GetMoney(), E.global.datatexts.settings.Currencies.goldFormat or 'BLIZZARD', not E.global.datatexts.settings.Currencies.goldCoins)
|
|
|
|
local displayed = E.global.datatexts.settings.Currencies.displayedCurrency
|
|
if displayed == 'BACKPACK' then
|
|
local displayString
|
|
for i = 1, 3 do
|
|
local info = DT:BackpackCurrencyInfo(i)
|
|
if info and info.quantity then
|
|
displayString = (i > 1 and displayString..' ' or '')..format('%s %s', format(iconString, info.iconFileID), E:ShortValue(info.quantity))
|
|
end
|
|
end
|
|
|
|
self.text:SetText(displayString or goldText)
|
|
elseif displayed == 'GOLD' then
|
|
self.text:SetText(goldText)
|
|
else
|
|
local id = tonumber(displayed)
|
|
if not id then return end
|
|
|
|
local info, name, icon = DT:CurrencyInfo(id)
|
|
if not name then return end
|
|
|
|
local style = E.global.datatexts.settings.Currencies.displayStyle
|
|
if style == 'ICON' then
|
|
self.text:SetFormattedText('%s %s', icon, E:ShortValue(info.quantity))
|
|
elseif style == 'ICON_TEXT' then
|
|
self.text:SetFormattedText('%s %s %s', icon, name, E:ShortValue(info.quantity))
|
|
else --ICON_TEXT_ABBR
|
|
self.text:SetFormattedText('%s %s %s', icon, E:AbbreviateString(name), E:ShortValue(info.quantity))
|
|
end
|
|
end
|
|
end
|
|
|
|
local function getTotalAnima()
|
|
local total = 0
|
|
|
|
for i = 0, NUM_BAG_SLOTS do
|
|
local bagName = C_Container_GetBagName(i)
|
|
if bagName then
|
|
for slotID = 1, C_Container_GetContainerNumSlots(i) do
|
|
local link = C_Container_GetContainerItemLink(i, slotID)
|
|
|
|
if link and C_Item_IsAnimaItemByID(link) then
|
|
local itemInfo = C_Container_GetContainerItemInfo(i, slotID)
|
|
local _, spellID = GetItemSpell(link)
|
|
total = total + animaSpellID[spellID] * itemInfo.stackCount
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return total
|
|
end
|
|
|
|
local function OnEnter()
|
|
DT.tooltip:ClearLines()
|
|
|
|
local textOnly = not E.global.datatexts.settings.Gold.goldCoins and true or false
|
|
local style = E.global.datatexts.settings.Gold.goldFormat or 'BLIZZARD'
|
|
|
|
DT.tooltip:AddLine(L["Session:"])
|
|
|
|
DT.tooltip:AddDoubleLine(L["Earned:"], E:FormatMoney(Profit, style, textOnly), 1, 1, 1, 1, 1, 1)
|
|
DT.tooltip:AddDoubleLine(L["Spent:"], E:FormatMoney(Spent, style, textOnly), 1, 1, 1, 1, 1, 1)
|
|
if Profit < Spent then
|
|
DT.tooltip:AddDoubleLine(L["Deficit:"], E:FormatMoney(Profit-Spent, style, textOnly), 1, 0, 0, 1, 1, 1)
|
|
elseif (Profit-Spent)>0 then
|
|
DT.tooltip:AddDoubleLine(L["Profit:"], E:FormatMoney(Profit-Spent, style, textOnly), 0, 1, 0, 1, 1, 1)
|
|
end
|
|
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddLine(L["Character: "])
|
|
|
|
sort(myGold, sortFunction)
|
|
|
|
for _, g in ipairs(myGold) do
|
|
local nameLine = ''
|
|
if g.faction ~= '' and g.faction ~= 'Neutral' then
|
|
nameLine = format('|TInterface/FriendsFrame/PlusManz-%s:14|t ', g.faction)
|
|
end
|
|
|
|
local toonName = format('%s%s%s', nameLine, g.name, (g.realm and g.realm ~= E.myrealm and ' - '..g.realm) or '')
|
|
DT.tooltip:AddDoubleLine((g.name == E.myname and toonName..' |TInterface/COMMON/Indicator-Green:14|t') or toonName, g.amountText, g.r, g.g, g.b, 1, 1, 1)
|
|
end
|
|
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddLine(L["Server: "])
|
|
if totalAlliance > 0 and totalHorde > 0 then
|
|
if totalAlliance ~= 0 then DT.tooltip:AddDoubleLine(L["Alliance: "], E:FormatMoney(totalAlliance, style, textOnly), 0, .376, 1, 1, 1, 1) end
|
|
if totalHorde ~= 0 then DT.tooltip:AddDoubleLine(L["Horde: "], E:FormatMoney(totalHorde, style, textOnly), 1, .2, .2, 1, 1, 1) end
|
|
DT.tooltip:AddLine(' ')
|
|
end
|
|
DT.tooltip:AddDoubleLine(L["Total: "], E:FormatMoney(totalGold, style, textOnly), 1, 1, 1, 1, 1, 1)
|
|
|
|
DT.tooltip:AddLine(' ')
|
|
|
|
wipe(shownHeaders)
|
|
local addLine, addLine2
|
|
for _, info in ipairs(E.global.datatexts.settings.Currencies.tooltipData) do
|
|
local _, id, header = unpack(info)
|
|
if id and E.global.datatexts.settings.Currencies.idEnable[id] then
|
|
AddHeader(header, addLine)
|
|
AddInfo(id)
|
|
addLine = true
|
|
end
|
|
end
|
|
|
|
if addLine then
|
|
DT.tooltip:AddLine(' ')
|
|
end
|
|
|
|
for id, info in pairs(E.global.datatexts.customCurrencies) do
|
|
if info and not DT.CurrencyList[tostring(id)] and info.currencyTooltip then
|
|
AddInfo(id)
|
|
addLine2 = true
|
|
end
|
|
end
|
|
|
|
if addLine2 then
|
|
DT.tooltip:AddLine(' ')
|
|
end
|
|
|
|
if E.Retail then
|
|
local anima = getTotalAnima()
|
|
if anima > 0 then
|
|
DT.tooltip:AddDoubleLine(L["Anima:"], anima, 0, .8, 1, 1, 1, 1)
|
|
DT.tooltip:AddLine(' ')
|
|
end
|
|
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddDoubleLine(L["WoW Token:"], E:FormatMoney(C_WowTokenPublic_GetCurrentMarketPrice() or 0, style, textOnly), 0, .8, 1, 1, 1, 1)
|
|
end
|
|
|
|
if E.Retail or E.Wrath then
|
|
for i = 1, MAX_WATCHED_TOKENS do
|
|
local info, name = DT:BackpackCurrencyInfo(i)
|
|
if not name then break end
|
|
|
|
if i == 1 then
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddLine(CURRENCY)
|
|
end
|
|
|
|
if info.quantity then
|
|
DT.tooltip:AddDoubleLine(format(iconString, info.iconFileID, name), info.quantity, 1, 1, 1, 1, 1, 1)
|
|
end
|
|
end
|
|
end
|
|
|
|
local grayValue = B:GetGraysValue()
|
|
if grayValue > 0 then
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddDoubleLine(L["Grays"], E:FormatMoney(grayValue, style, textOnly), nil, nil, nil, 1, 1, 1)
|
|
end
|
|
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddDoubleLine(L["Gold"]..':', goldText, nil, nil, nil, 1, 1, 1)
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddLine(resetCountersFormatter)
|
|
DT.tooltip:AddLine(resetInfoFormatter)
|
|
DT.tooltip:Show()
|
|
end
|
|
|
|
hooksecurefunc(DT, 'ForceUpdate_DataText', function(_, name)
|
|
if name and name == 'Currencies' then
|
|
for dtSlot, dtName in pairs(DT.AssignedDatatexts) do
|
|
if dtName.name == 'S&L Currencies' then
|
|
if dtName.colorUpdate then
|
|
dtName.colorUpdate(E.media.hexvaluecolor)
|
|
end
|
|
if dtName.eventFunc then
|
|
dtName.eventFunc(dtSlot, 'ELVUI_FORCE_UPDATE')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
DT:RegisterDatatext('S&L Currencies', nil, {'PLAYER_MONEY', 'SEND_MAIL_MONEY_CHANGED', 'SEND_MAIL_COD_CHANGED', 'PLAYER_TRADE_MONEY', 'TRADE_MONEY_CHANGED', 'CHAT_MSG_CURRENCY', 'CURRENCY_DISPLAY_UPDATE'}, OnEvent, nil, OnClick, OnEnter, nil, 'S&L '.._G.CURRENCY)
|
|
|