MONEY_ICON_WIDTH = 19;
MONEY_ICON_WIDTH_SMALL = 13;
MONEY_BUTTON_SPACING = -4;
MONEY_BUTTON_SPACING_SMALL = -4;
MONEY_TEXT_VADJUST = 0;
COPPER_PER_SILVER = 100;
SILVER_PER_GOLD = 100;
COPPER_PER_GOLD = COPPER_PER_SILVER * SILVER_PER_GOLD;
COIN_BUTTON_WIDTH = 32;
MoneyTypeInfo = { };
MoneyTypeInfo["PLAYER"] = {
UpdateFunc = function(self)
local money = (GetMoney() - GetCursorMoney() - GetPlayerTradeMoney());
if self.trialErrorButton then
if IsTrialAccount() then
local _, rMoney = GetRestrictedAccountData();
if money >= rMoney then
self.trialErrorButton:Show();
else
self.trialErrorButton:Hide();
end
else
self.trialErrorButton:Hide();
end
end
return money;
end,
PickupFunc = function(self, amount)
PickupPlayerMoney(amount);
end,
DropFunc = function(self)
DropCursorMoney();
end,
collapse = 1,
canPickup = 1,
showSmallerCoins = "Backpack"
};
MoneyTypeInfo["STATIC"] = {
UpdateFunc = function(self)
return self.staticMoney;
end,
collapse = 1,
};
MoneyTypeInfo["AUCTION"] = {
UpdateFunc = function(self)
return self.staticMoney;
end,
showSmallerCoins = "Backpack",
fixedWidth = 1,
collapse = 1,
truncateSmallCoins = nil,
};
MoneyTypeInfo["PLAYER_TRADE"] = {
UpdateFunc = function(self)
return GetPlayerTradeMoney();
end,
PickupFunc = function(self, amount)
PickupTradeMoney(amount);
end,
DropFunc = function(self)
AddTradeMoney();
end,
collapse = 1,
canPickup = 1,
};
MoneyTypeInfo["TARGET_TRADE"] = {
UpdateFunc = function(self)
return GetTargetTradeMoney();
end,
collapse = 1,
};
MoneyTypeInfo["SEND_MAIL"] = {
UpdateFunc = function(self)
return GetSendMailMoney();
end,
PickupFunc = function(self, amount)
PickupSendMailMoney(amount);
end,
DropFunc = function(self)
AddSendMailMoney();
end,
collapse = nil,
canPickup = 1,
showSmallerCoins = "Backpack",
};
MoneyTypeInfo["SEND_MAIL_COD"] = {
UpdateFunc = function(self)
return GetSendMailCOD();
end,
PickupFunc = function(self, amount)
PickupSendMailCOD(amount);
end,
DropFunc = function(self)
AddSendMailCOD();
end,
collapse = 1,
canPickup = 1,
};
MoneyTypeInfo["GUILDBANK"] = {
OnloadFunc = function(self)
self:RegisterEvent("GUILDBANK_UPDATE_MONEY");
end,
UpdateFunc = function(self)
return (GetGuildBankMoney() - GetCursorMoney());
end,
PickupFunc = function(self, amount)
PickupGuildBankMoney(amount);
end,
DropFunc = function(self)
DropCursorMoney();
end,
collapse = 1,
showSmallerCoins = "Backpack",
};
MoneyTypeInfo["GUILDBANKWITHDRAW"] = {
OnloadFunc = function(self)
self:RegisterEvent("GUILDBANK_UPDATE_WITHDRAWMONEY");
end,
UpdateFunc = function(self)
GuildBankFrame_UpdateWithdrawMoney();
return nil;
end,
collapse = 1,
showSmallerCoins = "Backpack",
};
MoneyTypeInfo["GUILD_REPAIR"] = {
UpdateFunc = function(self)
return self.staticMoney;
end,
collapse = 1,
showSmallerCoins = "Backpack",
};
MoneyTypeInfo["TOOLTIP"] = {
UpdateFunc = function(self)
return self.staticMoney;
end,
showSmallerCoins = "Backpack",
collapse = 1,
truncateSmallCoins = nil,
};
MoneyTypeInfo["REFORGE"] = {
UpdateFunc = function(self)
return self.staticMoney;
end,
collapse = 1,
showSmallerCoins = "Backpack",
};
MoneyTypeInfo["GUILDBANKCASHFLOW"] = {
OnloadFunc = function(self)
self:RegisterEvent("GUILDBANKLOG_UPDATE");
end,
UpdateFunc = function(self)
GuildBankFrame_UpdateCashFlowMoney();
return nil;
end,
collapse = 1,
showSmallerCoins = "Backpack",
};
MoneyTypeInfo["BLACKMARKET"] = {
UpdateFunc = function(self)
return self.staticMoney;
end,
showSmallerCoins = nil,
fixedWidth = 1,
collapse = 1,
};
function MoneyFrame_OnLoad (self)
self:RegisterEvent("PLAYER_MONEY");
self:RegisterEvent("PLAYER_TRADE_MONEY");
self:RegisterEvent("TRADE_MONEY_CHANGED");
self:RegisterEvent("SEND_MAIL_MONEY_CHANGED");
self:RegisterEvent("SEND_MAIL_COD_CHANGED");
MoneyFrame_SetType(self, "PLAYER");
end
function SmallMoneyFrame_OnLoad(self, moneyType)
--If there's a moneyType we'll use the new way of doing things, otherwise do things the old way
if ( moneyType ) then
local info = MoneyTypeInfo[moneyType];
if ( info and info.OnloadFunc ) then
--This way you can just register for the events that you care about
--Should write OnloadFunc's for all money frames, but don't have time right now
info.OnloadFunc(self);
self.small = 1;
MoneyFrame_SetType(self, moneyType);
end
else
--The old sucky way of doing things
self:RegisterEvent("PLAYER_MONEY");
self:RegisterEvent("PLAYER_TRADE_MONEY");
self:RegisterEvent("TRADE_MONEY_CHANGED");
self:RegisterEvent("SEND_MAIL_MONEY_CHANGED");
self:RegisterEvent("SEND_MAIL_COD_CHANGED");
self.small = 1;
MoneyFrame_SetType(self, "PLAYER");
end
end
function MoneyFrame_OnEvent (self, event, ...)
if ( not self.info or not self:IsVisible() ) then
return;
end
local moneyType = self.moneyType;
if ( event == "PLAYER_MONEY" and moneyType == "PLAYER" ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "PLAYER_TRADE_MONEY" and (moneyType == "PLAYER" or moneyType == "PLAYER_TRADE") ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "TRADE_MONEY_CHANGED" and moneyType == "TARGET_TRADE" ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "SEND_MAIL_MONEY_CHANGED" and (moneyType == "PLAYER" or moneyType == "SEND_MAIL") ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "SEND_MAIL_COD_CHANGED" and (moneyType == "PLAYER" or moneyType == "SEND_MAIL_COD") ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "GUILDBANK_UPDATE_MONEY" and moneyType == "GUILDBANK" ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "GUILDBANK_UPDATE_WITHDRAWMONEY" and moneyType == "GUILDBANKWITHDRAW" ) then
MoneyFrame_UpdateMoney(self);
elseif ( event == "GUILDBANKLOG_UPDATE" and moneyType == "GUILDBANKCASHFLOW" ) then
MoneyFrame_UpdateMoney(self);
end
end
function MoneyFrame_OnEnter(moneyFrame)
if ( moneyFrame.showTooltip ) then
GameTooltip:SetOwner(_G[moneyFrame:GetName().."CopperButton"], "ANCHOR_TOPRIGHT", 20, 2);
SetTooltipMoney(GameTooltip, moneyFrame.staticMoney, "TOOLTIP", "");
GameTooltip:Show();
end
end
function MoneyFrame_OnLeave(moneyFrame)
if ( moneyFrame.showTooltip ) then
GameTooltip:Hide();
end
end
function MoneyFrame_SetType(self, type)
local info = MoneyTypeInfo[type];
if ( not info ) then
message("Invalid money type: "..type);
return;
end
self.info = info;
self.moneyType = type;
local frameName = self:GetName();
if ( info.canPickup ) then
_G[frameName.."GoldButton"]:EnableMouse(true);
_G[frameName.."SilverButton"]:EnableMouse(true);
_G[frameName.."CopperButton"]:EnableMouse(true);
else
_G[frameName.."GoldButton"]:EnableMouse(false);
_G[frameName.."SilverButton"]:EnableMouse(false);
_G[frameName.."CopperButton"]:EnableMouse(false);
end
end
function MoneyFrame_SetMaxDisplayWidth(moneyFrame, width)
moneyFrame.maxDisplayWidth = width;
end
-- Update the money shown in a money frame
function MoneyFrame_UpdateMoney(moneyFrame)
assert(moneyFrame);
if ( moneyFrame.info ) then
local money = moneyFrame.info.UpdateFunc(moneyFrame);
if ( money ) then
MoneyFrame_Update(moneyFrame:GetName(), money);
end
else
message("Error moneyType not set");
end
end
local function CreateMoneyButtonNormalTexture (button, iconWidth)
local texture = button:CreateTexture();
texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons");
texture:SetWidth(iconWidth);
texture:SetHeight(iconWidth);
texture:SetPoint("RIGHT");
button:SetNormalTexture(texture);
return texture;
end
function MoneyFrame_Update(frameName, money)
local frame;
if ( type(frameName) == "table" ) then
frame = frameName;
frameName = frame:GetName();
else
frame = _G[frameName];
end
local info = frame.info;
if ( not info ) then
message("Error moneyType not set");
end
-- Breakdown the money into denominations
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
local goldDisplay = BreakUpLargeNumbers(gold);
local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
local copper = mod(money, COPPER_PER_SILVER);
local goldButton = _G[frameName.."GoldButton"];
local silverButton = _G[frameName.."SilverButton"];
local copperButton = _G[frameName.."CopperButton"];
local iconWidth = MONEY_ICON_WIDTH;
local spacing = MONEY_BUTTON_SPACING;
if ( frame.small ) then
iconWidth = MONEY_ICON_WIDTH_SMALL;
spacing = MONEY_BUTTON_SPACING_SMALL;
end
local maxDisplayWidth = frame.maxDisplayWidth;
-- Set values for each denomination
if ( ENABLE_COLORBLIND_MODE == "1" ) then
if ( not frame.colorblind or not frame.vadjust or frame.vadjust ~= MONEY_TEXT_VADJUST ) then
frame.colorblind = true;
frame.vadjust = MONEY_TEXT_VADJUST;
goldButton:SetNormalTexture("");
silverButton:SetNormalTexture("");
copperButton:SetNormalTexture("");
_G[frameName.."GoldButtonText"]:SetPoint("RIGHT", 0, MONEY_TEXT_VADJUST);
_G[frameName.."SilverButtonText"]:SetPoint("RIGHT", 0, MONEY_TEXT_VADJUST);
_G[frameName.."CopperButtonText"]:SetPoint("RIGHT", 0, MONEY_TEXT_VADJUST);
end
goldButton:SetText(goldDisplay .. GOLD_AMOUNT_SYMBOL);
goldButton:SetWidth(goldButton:GetTextWidth());
goldButton:Show();
silverButton:SetText(silver .. SILVER_AMOUNT_SYMBOL);
silverButton:SetWidth(silverButton:GetTextWidth());
silverButton:Show();
copperButton:SetText(copper .. COPPER_AMOUNT_SYMBOL);
copperButton:SetWidth(copperButton:GetTextWidth());
copperButton:Show();
else
if ( frame.colorblind or not frame.vadjust or frame.vadjust ~= MONEY_TEXT_VADJUST ) then
frame.colorblind = nil;
frame.vadjust = MONEY_TEXT_VADJUST;
local texture = CreateMoneyButtonNormalTexture(goldButton, iconWidth);
texture:SetTexCoord(0, 0.25, 0, 1);
texture = CreateMoneyButtonNormalTexture(silverButton, iconWidth);
texture:SetTexCoord(0.25, 0.5, 0, 1);
texture = CreateMoneyButtonNormalTexture(copperButton, iconWidth);
texture:SetTexCoord(0.5, 0.75, 0, 1);
_G[frameName.."GoldButtonText"]:SetPoint("RIGHT", -iconWidth, MONEY_TEXT_VADJUST);
_G[frameName.."SilverButtonText"]:SetPoint("RIGHT", -iconWidth, MONEY_TEXT_VADJUST);
_G[frameName.."CopperButtonText"]:SetPoint("RIGHT", -iconWidth, MONEY_TEXT_VADJUST);
end
goldButton:SetText(goldDisplay);
goldButton:SetWidth(goldButton:GetTextWidth() + iconWidth);
goldButton:Show();
silverButton:SetText(silver);
silverButton:SetWidth(silverButton:GetTextWidth() + iconWidth);
silverButton:Show();
copperButton:SetText(copper);
copperButton:SetWidth(copperButton:GetTextWidth() + iconWidth);
copperButton:Show();
end
-- Store how much money the frame is displaying
frame.staticMoney = money;
frame.showTooltip = nil;
-- If not collapsable or not using maxDisplayWidth don't need to continue
if ( not info.collapse and not maxDisplayWidth ) then
return;
end
local width = iconWidth;
local showLowerDenominations, truncateCopper;
if ( gold > 0 ) then
width = width + goldButton:GetWidth();
if ( info.showSmallerCoins ) then
showLowerDenominations = 1;
end
if ( info.truncateSmallCoins ) then
truncateCopper = 1;
end
else
goldButton:Hide();
end
goldButton:ClearAllPoints();
local hideSilver = true;
if ( silver > 0 or showLowerDenominations ) then
hideSilver = false;
-- Exception if showLowerDenominations and fixedWidth
if ( showLowerDenominations and info.fixedWidth ) then
silverButton:SetWidth(COIN_BUTTON_WIDTH);
end
width = width + silverButton:GetWidth();
goldButton:SetPoint("RIGHT", frameName.."SilverButton", "LEFT", spacing, 0);
if ( goldButton:IsShown() ) then
width = width - spacing;
end
if ( info.showSmallerCoins ) then
showLowerDenominations = 1;
end
-- hide silver if not enough room
if ( maxDisplayWidth and width > maxDisplayWidth ) then
hideSilver = true;
frame.showTooltip = true;
end
end
if ( hideSilver ) then
silverButton:Hide();
goldButton:SetPoint("RIGHT", frameName.."SilverButton", "RIGHT", 0, 0);
end
-- Used if we're not showing lower denominations
silverButton:ClearAllPoints();
local hideCopper = true;
if ( (copper > 0 or showLowerDenominations or info.showSmallerCoins == "Backpack") and not truncateCopper) then
hideCopper = false;
-- Exception if showLowerDenominations and fixedWidth
if ( showLowerDenominations and info.fixedWidth ) then
copperButton:SetWidth(COIN_BUTTON_WIDTH);
end
width = width + copperButton:GetWidth();
silverButton:SetPoint("RIGHT", frameName.."CopperButton", "LEFT", spacing, 0);
if ( silverButton:IsShown() or goldButton:IsShown() ) then
width = width - spacing;
end
-- hide copper if not enough room
if ( maxDisplayWidth and width > maxDisplayWidth ) then
hideCopper = true;
frame.showTooltip = true;
end
end
if ( hideCopper ) then
copperButton:Hide();
silverButton:SetPoint("RIGHT", frameName.."CopperButton", "RIGHT", 0, 0);
end
-- make sure the copper button is in the right place
copperButton:ClearAllPoints();
copperButton:SetPoint("RIGHT", frameName, "RIGHT", -13, 0);
-- attach text now that denominations have been computed
local prefixText = _G[frameName.."PrefixText"];
if ( prefixText ) then
if ( prefixText:GetText() and money > 0 ) then
prefixText:Show();
copperButton:ClearAllPoints();
copperButton:SetPoint("RIGHT", frameName.."PrefixText", "RIGHT", width, 0);
width = width + prefixText:GetWidth();
else
prefixText:Hide();
end
end
local suffixText = _G[frameName.."SuffixText"];
if ( suffixText ) then
if ( suffixText:GetText() and money > 0 ) then
suffixText:Show();
suffixText:ClearAllPoints();
suffixText:SetPoint("LEFT", frameName.."CopperButton", "RIGHT", 0, 0);
width = width + suffixText:GetWidth();
else
suffixText:Hide();
end
end
frame:SetWidth(width);
-- check if we need to toggle mouse events for the currency buttons to present tooltip
-- the events are always enabled if info.canPickup is true
if ( maxDisplayWidth and not info.canPickup ) then
local mouseEnabled = goldButton:IsMouseEnabled();
if ( frame.showTooltip and not mouseEnabled ) then
goldButton:EnableMouse(true);
silverButton:EnableMouse(true);
copperButton:EnableMouse(true);
elseif ( not frame.showTooltip and mouseEnabled ) then
goldButton:EnableMouse(false);
silverButton:EnableMouse(false);
copperButton:EnableMouse(false);
end
end
end
function RefreshMoneyFrame(frameName, money, small, collapse, showSmallerCoins)
--[[
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
local copper = mod(money, COPPER_PER_SILVER);
local goldButton = _G[frameName.."GoldButton"];
local silverButton = _G[frameName.."SilverButton"];
local copperButton = _G[frameName.."CopperButton"];
local iconWidth = MONEY_ICON_WIDTH;
local spacing = MONEY_BUTTON_SPACING;
if ( small > 0 ) then
iconWidth = MONEY_ICON_WIDTH_SMALL;
spacing = MONEY_BUTTON_SPACING_SMALL;
end
goldButton:SetText(gold);
goldButton:SetWidth(goldButton:GetTextWidth() + iconWidth);
goldButton:Show();
silverButton:SetText(silver);
silverButton:SetWidth(silverButton:GetTextWidth() + iconWidth);
silverButton:Show();
copperButton:SetText(copper);
copperButton:SetWidth(copperButton:GetTextWidth() + iconWidth);
copperButton:Show();
local frame = _G[frameName];
frame.staticMoney = money;
if ( collapse == 0 ) then
return;
end
local width = 13;
local showLowerDenominations;
if ( gold > 0 ) then
width = width + goldButton:GetWidth();
if ( showSmallerCoins ) then
showLowerDenominations = 1;
end
else
goldButton:Hide();
end
if ( silver > 0 or showLowerDenominations ) then
width = width + silverButton:GetWidth();
goldButton:SetPoint("RIGHT", frameName.."SilverButton", "LEFT", spacing, 0);
if ( goldButton:IsShown() ) then
width = width - spacing;
end
if ( showSmallerCoins ) then
showLowerDenominations = 1;
end
else
silverButton:Hide();
goldButton:SetPoint("RIGHT", frameName.."SilverButton", "RIGHT", 0, 0);
end
-- Used if we're not showing lower denominations
if ( copper > 0 or showLowerDenominations or showSmallerCoins == "Backpack") then
width = width + copperButton:GetWidth();
silverButton:SetPoint("RIGHT", frameName.."CopperButton", "LEFT", spacing, 0);
if ( silverButton:IsShown() ) then
width = width - spacing;
end
else
copperButton:Hide();
silverButton:SetPoint("RIGHT", frameName.."CopperButton", "RIGHT", 0, 0);
end
frame:SetWidth(width);
]]
end
function SetMoneyFrameColor(frameName, color)
local moneyFrame = _G[frameName];
if ( not moneyFrame ) then
return;
end
local fontObject;
if ( moneyFrame.small ) then
if ( color == "yellow" ) then
fontObject = NumberFontNormalRightYellow;
elseif ( color == "red" ) then
fontObject = NumberFontNormalRightRed;
else
fontObject = NumberFontNormalRight;
end
else
if ( color == "yellow" ) then
fontObject = NumberFontNormalLargeRightYellow;
elseif ( color == "red" ) then
fontObject = NumberFontNormalLargeRightRed;
else
fontObject = NumberFontNormalLargeRight;
end
end
local goldButton = _G[frameName.."GoldButton"];
local silverButton = _G[frameName.."SilverButton"];
local copperButton = _G[frameName.."CopperButton"];
goldButton:SetNormalFontObject(fontObject);
silverButton:SetNormalFontObject(fontObject);
copperButton:SetNormalFontObject(fontObject);
end
function AltCurrencyFrame_Update(frameName, texture, cost)
local iconWidth;
local button = _G[frameName];
local buttonTexture = _G[frameName.."Texture"];
button:SetText(cost);
buttonTexture:SetTexture(texture);
if ( button.pointType == HONOR_POINTS ) then
iconWidth = 24;
buttonTexture:SetPoint("LEFT", _G[frameName.."Text"], "RIGHT", -1, -6);
else
iconWidth = MONEY_ICON_WIDTH_SMALL;
buttonTexture:SetPoint("LEFT", _G[frameName.."Text"], "RIGHT", 0, 0);
end
buttonTexture:SetWidth(iconWidth);
buttonTexture:SetHeight(iconWidth);
button:SetWidth(button:GetTextWidth() + MONEY_ICON_WIDTH_SMALL);
end
function GetDenominationsFromCopper(money)
return GetCoinText(money, " ");
end
function GetMoneyString(money)
local goldString, silverString, copperString;
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
local copper = mod(money, COPPER_PER_SILVER);
if ( ENABLE_COLORBLIND_MODE == "1" ) then
goldString = gold..GOLD_AMOUNT_SYMBOL;
silverString = silver..SILVER_AMOUNT_SYMBOL;
copperString = copper..COPPER_AMOUNT_SYMBOL;
else
goldString = format(GOLD_AMOUNT_TEXTURE, gold, 0, 0);
silverString = format(SILVER_AMOUNT_TEXTURE, silver, 0, 0);
copperString = format(COPPER_AMOUNT_TEXTURE, copper, 0, 0);
end
local moneyString = "";
local separator = "";
if ( gold > 0 ) then
moneyString = goldString;
separator = " ";
end
if ( silver > 0 ) then
moneyString = moneyString..separator..silverString;
separator = " ";
end
if ( copper > 0 or moneyString == "" ) then
moneyString = moneyString..separator..copperString;
end
return moneyString;
end