add gs
This commit is contained in:
@@ -0,0 +1,254 @@
|
||||
--[[
|
||||
// CurrencyWidget.lua by Kip Turner
|
||||
--]]
|
||||
|
||||
local TextService = game:GetService('TextService')
|
||||
local PlatformService;
|
||||
pcall(function() PlatformService = game:GetService('PlatformService') end)
|
||||
|
||||
local CoreGui = game:GetService("CoreGui")
|
||||
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
|
||||
local Modules = GuiRoot:FindFirstChild("Modules")
|
||||
local ShellModules = Modules:FindFirstChild("Shell")
|
||||
|
||||
local UserDataModule = require(ShellModules:FindFirstChild('UserData'))
|
||||
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
|
||||
local Utility = require(ShellModules:FindFirstChild('Utility'))
|
||||
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
|
||||
local LoadingWidget = require(ShellModules:FindFirstChild('LoadingWidget'))
|
||||
local EventHub = require(ShellModules:FindFirstChild('EventHub'))
|
||||
|
||||
local EventHubConnectCount = 0
|
||||
|
||||
local InternalPlatformRobuxAmountChangedSignal = Utility.Signal()
|
||||
local InternalTotalRobuxAmountChangedSignal = Utility.Signal()
|
||||
|
||||
local function CreateCurrencyWidget(properties)
|
||||
properties = properties or {}
|
||||
|
||||
local this = {}
|
||||
|
||||
this.RobuxChanged = Utility.Signal()
|
||||
|
||||
local internalPlatformRobuxChangedConn = nil
|
||||
local internalTotalRobuxChangedConn = nil
|
||||
|
||||
local CachedTotalRobuxValue = nil
|
||||
local CachedRobuxValue = nil
|
||||
local destroyed = false
|
||||
|
||||
EventHubConnectCount = EventHubConnectCount + 1
|
||||
local myEventId = "CurrencyWidget" .. tostring(EventHubConnectCount)
|
||||
|
||||
local RobuxBalanceTitle = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'RobuxBalanceTitle';
|
||||
Size = UDim2.new(0,0,0,0);
|
||||
Position = properties.Position or UDim2.new(0, 0, 0, 0);
|
||||
TextXAlignment = 'Left';
|
||||
TextYAlignment = 'Top';
|
||||
TextColor3 = GlobalSettings.WhiteTextColor;
|
||||
Text = Strings:LocalizedString('RobuxBalanceTitle') .. ':';
|
||||
Font = GlobalSettings.RegularFont;
|
||||
FontSize = GlobalSettings.HeaderSize;
|
||||
BackgroundTransparency = 1;
|
||||
ZIndex = properties.ZIndex or 2;
|
||||
Parent = properties.Parent or nil;
|
||||
};
|
||||
local robuxTitleSize = TextService:GetTextSize(RobuxBalanceTitle.Text, Utility.ConvertFontSizeEnumToInt(RobuxBalanceTitle.FontSize), RobuxBalanceTitle.Font, Vector2.new())
|
||||
RobuxBalanceTitle.Size = UDim2.new(0, robuxTitleSize.X, 0, robuxTitleSize.Y)
|
||||
|
||||
local RobuxBalanceIcon = Utility.Create'ImageLabel'
|
||||
{
|
||||
Name = 'RobuxIcon';
|
||||
Size = UDim2.new(0,46,0,46);
|
||||
BackgroundTransparency = 1;
|
||||
Image = 'rbxasset://textures/ui/Shell/Icons/ROBUXIconOutlined@1080.png';
|
||||
ZIndex = properties.ZIndex or 2;
|
||||
Parent = RobuxBalanceTitle;
|
||||
AnchorPoint = Vector2.new(0, 0.5);
|
||||
Position = UDim2.new(1, 17, 0.5, 0);
|
||||
};
|
||||
local RobuxBalanceValue = Utility.Create'TextLabel'
|
||||
{
|
||||
Name = 'RobuxBalanceValue';
|
||||
Size = UDim2.new(0,0,1,0);
|
||||
Position = UDim2.new(1,5,0,-2);
|
||||
Text = '';
|
||||
TextXAlignment = 'Left';
|
||||
TextYAlignment = 'Center';
|
||||
TextColor3 = GlobalSettings.GreenTextColor;
|
||||
Font = GlobalSettings.RegularFont;
|
||||
FontSize = GlobalSettings.HeaderSize;
|
||||
BackgroundTransparency = 1;
|
||||
ZIndex = properties.ZIndex or 2;
|
||||
TextTransparency = 1;
|
||||
Parent = RobuxBalanceIcon;
|
||||
};
|
||||
|
||||
|
||||
local function UpdateBalanceText()
|
||||
local balanceValueString = CachedRobuxValue and Utility.FormatNumberString(tostring(CachedRobuxValue)) or '-'
|
||||
local balanceStringWidth = TextService:GetTextSize(balanceValueString, Utility.ConvertFontSizeEnumToInt(RobuxBalanceValue.FontSize), RobuxBalanceValue.Font, Vector2.new())
|
||||
RobuxBalanceValue.Size = UDim2.new(0, balanceStringWidth.X, 1, 0)
|
||||
RobuxBalanceValue.Text = balanceValueString
|
||||
if RobuxBalanceValue.TextTransparency == 1 and CachedRobuxValue ~= nil then
|
||||
Utility.PropertyTweener(RobuxBalanceValue, 'TextTransparency', 1, 0, 0.5, Utility.EaseOutQuad, true)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local robuxAmountChangedLoader = nil
|
||||
local ConsumePurchasedConn = nil
|
||||
if PlatformService then
|
||||
local robuxChangedEventCount = 0
|
||||
|
||||
local function fetchNewRobuxAsync(thisEventCount)
|
||||
if not (CachedRobuxValue and CachedTotalRobuxValue) then
|
||||
this:RefreshRobuxAmountAsync()
|
||||
end
|
||||
local prepurchaseRobux = CachedRobuxValue
|
||||
local prepurchaseTotalRobux = CachedTotalRobuxValue
|
||||
Utility.ExponentialRepeat(
|
||||
function() return thisEventCount == robuxChangedEventCount and not destroyed end,
|
||||
function()
|
||||
local balance = UserDataModule.GetPlatformUserBalanceAsync()
|
||||
local totalBalance = UserDataModule.GetTotalUserBalanceAsync()
|
||||
if balance and totalBalance and not destroyed then
|
||||
if balance ~= prepurchaseRobux and totalBalance ~= prepurchaseTotalRobux then
|
||||
CachedRobuxValue = balance
|
||||
CachedTotalRobuxValue = totalBalance
|
||||
UpdateBalanceText()
|
||||
if this.RobuxChanged ~= nil then
|
||||
this.RobuxChanged:fire(balance)
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
local function OnRobuxAmountChanged()
|
||||
robuxChangedEventCount = robuxChangedEventCount + 1
|
||||
local thisEventCount = robuxChangedEventCount
|
||||
|
||||
if robuxAmountChangedLoader then
|
||||
robuxAmountChangedLoader:Cleanup()
|
||||
robuxAmountChangedLoader = nil
|
||||
end
|
||||
local loader = LoadingWidget({Parent = RobuxBalanceValue, Size = UDim2.new(0,50,0,50), Position = UDim2.new(1,75,0,25)}, {function() fetchNewRobuxAsync(thisEventCount) end})
|
||||
robuxAmountChangedLoader = loader
|
||||
robuxAmountChangedLoader:AwaitFinished()
|
||||
if robuxAmountChangedLoader and loader == robuxAmountChangedLoader then
|
||||
robuxAmountChangedLoader:Cleanup()
|
||||
robuxAmountChangedLoader = nil
|
||||
end
|
||||
end
|
||||
|
||||
Utility.DisconnectEvent(ConsumePurchasedConn)
|
||||
ConsumePurchasedConn = PlatformService.ConsumePurchased:connect(function(platformPurchaseResult, purchasedConsumablesInfo)
|
||||
--Update Robux regardless of purchased type
|
||||
if platformPurchaseResult == 3 then
|
||||
OnRobuxAmountChanged()
|
||||
else
|
||||
if robuxAmountChangedLoader then
|
||||
robuxAmountChangedLoader:Cleanup()
|
||||
robuxAmountChangedLoader = nil
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
EventHub:addEventListener(EventHub.Notifications["RobuxCatalogPurchaseInitiated"], myEventId, function()
|
||||
OnRobuxAmountChanged()
|
||||
end)
|
||||
end
|
||||
|
||||
function this:GetAbsoluteSize()
|
||||
return (RobuxBalanceValue.AbsolutePosition + RobuxBalanceValue.AbsoluteSize) - (RobuxBalanceTitle.AbsolutePosition)
|
||||
end
|
||||
|
||||
function this:GetRobuxAmount()
|
||||
return CachedRobuxValue
|
||||
end
|
||||
|
||||
function this:RefreshRobuxAmountAsync()
|
||||
local beforeTotalRobuxValue = CachedTotalRobuxValue
|
||||
local beforeRobuxValue = CachedRobuxValue
|
||||
|
||||
UserDataModule.GetLocalUserIdAsync()
|
||||
CachedTotalRobuxValue = UserDataModule.GetTotalUserBalanceAsync()
|
||||
CachedRobuxValue = UserDataModule.GetPlatformUserBalanceAsync()
|
||||
UpdateBalanceText()
|
||||
|
||||
if beforeTotalRobuxValue ~= CachedTotalRobuxValue then
|
||||
InternalTotalRobuxAmountChangedSignal:fire(CachedTotalRobuxValue)
|
||||
end
|
||||
if beforeRobuxValue ~= CachedRobuxValue then
|
||||
InternalPlatformRobuxAmountChangedSignal:fire(CachedRobuxValue)
|
||||
end
|
||||
end
|
||||
|
||||
local GetRobuxAmountAsyncTempWidget = nil
|
||||
function this:GetRobuxAmountAsync()
|
||||
if CachedRobuxValue then
|
||||
return CachedRobuxValue
|
||||
end
|
||||
UserDataModule.GetLocalUserIdAsync()
|
||||
spawn(function()
|
||||
wait(1)
|
||||
if CachedRobuxValue == nil and GetRobuxAmountAsyncTempWidget == nil then
|
||||
GetRobuxAmountAsyncTempWidget = LoadingWidget({Parent = RobuxBalanceValue, Size = UDim2.new(0,50,0,50), Position = UDim2.new(1,75,0,25)}, {function() while CachedRobuxValue == nil do wait() end end})
|
||||
GetRobuxAmountAsyncTempWidget:AwaitFinished()
|
||||
if GetRobuxAmountAsyncTempWidget then
|
||||
GetRobuxAmountAsyncTempWidget:Cleanup()
|
||||
end
|
||||
GetRobuxAmountAsyncTempWidget = nil
|
||||
end
|
||||
end)
|
||||
self:RefreshRobuxAmountAsync()
|
||||
return CachedRobuxValue
|
||||
end
|
||||
|
||||
function this:Destroy()
|
||||
destroyed = true
|
||||
RobuxBalanceTitle.Parent = nil
|
||||
self.RobuxChanged = nil
|
||||
if robuxAmountChangedLoader then
|
||||
robuxAmountChangedLoader:Cleanup()
|
||||
robuxAmountChangedLoader = nil
|
||||
end
|
||||
ConsumePurchasedConn = Utility.DisconnectEvent(ConsumePurchasedConn)
|
||||
internalPlatformRobuxChangedConn = Utility.DisconnectEvent(internalPlatformRobuxChangedConn)
|
||||
internalTotalRobuxChangedConn = Utility.DisconnectEvent(internalTotalRobuxChangedConn)
|
||||
EventHub:removeEventListener(EventHub.Notifications["RobuxCatalogPurchaseInitiated"], myEventId)
|
||||
end
|
||||
|
||||
function this:GetGuiObject()
|
||||
return RobuxBalanceTitle
|
||||
end
|
||||
|
||||
internalPlatformRobuxChangedConn = InternalPlatformRobuxAmountChangedSignal:connect(
|
||||
function(newPlatformRobux)
|
||||
if newPlatformRobux ~= CachedRobuxValue then
|
||||
CachedRobuxValue = newPlatformRobux
|
||||
UpdateBalanceText()
|
||||
this.RobuxChanged:fire(CachedRobuxValue)
|
||||
end
|
||||
end)
|
||||
internalTotalRobuxChangedConn = InternalTotalRobuxAmountChangedSignal:connect(
|
||||
function(newTotalRobux)
|
||||
if newTotalRobux ~= CachedTotalRobuxValue then
|
||||
CachedTotalRobuxValue = newTotalRobux
|
||||
this.RobuxChanged:fire(CachedRobuxValue)
|
||||
end
|
||||
end)
|
||||
|
||||
spawn(function()
|
||||
this:GetRobuxAmountAsync()
|
||||
end)
|
||||
|
||||
return this
|
||||
end
|
||||
|
||||
return CreateCurrencyWidget
|
||||
Reference in New Issue
Block a user