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

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)