Clients/Client2018/content/internal/AppShell/Modules/Shell/AvatarTile.lua

255 lines
7.0 KiB
Lua

--[[
// AvatarTile.lua
// Created by Kip Turner
// Copyright Roblox 2015
]]
local TextService = game:GetService('TextService')
local CoreGui = game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local ShellModules = Modules:FindFirstChild("Shell")
local Utility = require(ShellModules:FindFirstChild('Utility'))
local Http = require(ShellModules:FindFirstChild('Http'))
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
local Analytics = require(ShellModules:FindFirstChild('Analytics'))
local Errors = require(ShellModules:FindFirstChild('Errors'))
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
local ErrorOverlayModule = require(ShellModules:FindFirstChild('ErrorOverlay'))
local PurchasePackagePrompt = require(ShellModules:FindFirstChild('PurchasePackagePrompt'))
local BaseTile = require(ShellModules:FindFirstChild('BaseTile'))
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
local function createAvatarInfoContainer(packageInfo)
local this = BaseTile()
local focused = false
local packageName = packageInfo:GetFullName()
local function wearPackageAsync()
if packageInfo:IsOwned() and not packageInfo:IsWearing() then
local result = packageInfo:WearAsync()
if result and result['success'] == true then
this:UpdateEquipButton()
else
local err = Errors.PackageEquip['Default']
ScreenManager:OpenScreen(ErrorOverlayModule(err), false)
end
end
end
local function buyPackageAsync()
local newPurchasePrompt = PurchasePackagePrompt(packageInfo)
ScreenManager:OpenScreen(newPurchasePrompt, false)
newPurchasePrompt:FadeInBackground()
spawn(function()
local didPurchase = newPurchasePrompt:ResultAsync()
if didPurchase then
SoundManager:Play('PurchaseSuccess')
wearPackageAsync()
end
end)
end
local PriceText = Utility.Create'TextLabel'
{
Name = 'PriceText';
Text = '';
Size = UDim2.new(1, 0, 0, 36);
Position = UDim2.new(0, 0, 0, 0);
TextColor3 = GlobalSettings.BlackTextColor;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.DescriptionSize;
BorderSizePixel = 0;
BackgroundColor3 = GlobalSettings.PriceLabelColor;
ZIndex = 2;
Visible = false;
Parent = this.AvatarItemContainer;
};
local PromoText = Utility.Create'TextLabel'
{
Name = 'PromoText';
Text = '';
Size = UDim2.new(1, 0, 0, 36);
Position = UDim2.new(0, 0, 0, 0);
TextColor3 = GlobalSettings.WhiteTextColor;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.DescriptionSize;
BorderSizePixel = 0;
BackgroundColor3 = GlobalSettings.PromoLabelColor;
ZIndex = 2;
Visible = false;
Parent = this.AvatarItemContainer;
};
function this:UpdatePriceText()
local newText = ""
local price = packageInfo:GetRobuxPrice()
if price == 0 then
newText = Strings:LocalizedString('FreeWord')
elseif price then
newText = "R$ " .. Utility.FormatNumberString(price)
end
PriceText.Text = newText
local priceTextSize = TextService:GetTextSize(PriceText.Text, Utility.ConvertFontSizeEnumToInt(PriceText.FontSize), PriceText.Font, Vector2.new())
PriceText.Size = UDim2.new(0, priceTextSize.X + 28, 0, 36)
PriceText.AnchorPoint = Vector2.new(1, 0)
PriceText.Position = UDim2.new(1, -6, 0, 6)
PriceText.Visible = price ~= nil and not packageInfo:IsOwned()
end
function this:UpdatePromoText()
if not packageInfo:IsOwned() then
local saleIdStr = Utility.GetFastVariable("XboxSaleAvatarPackageIds")
if type(saleIdStr) == "string" and saleIdStr ~= '' then
for saleId in string.gmatch(saleIdStr, '([^;]+)') do
if tonumber(saleId) ~= nil and tonumber(saleId) == tonumber(packageInfo:GetAssetId()) then --If the package is on sale
PromoText.Text = "SALE!"
local promoTextSize = TextService:GetTextSize(PromoText.Text, Utility.ConvertFontSizeEnumToInt(PromoText.FontSize), PromoText.Font, Vector2.new())
PromoText.Size = UDim2.new(0, promoTextSize.X + 28, 0, 36)
PromoText.AnchorPoint = Vector2.new(1, 0)
PromoText.Position = UDim2.new(1, -6, 0, 42)
PromoText.Visible = true
break
end
end
end
else
PromoText.Visible = false
end
end
if packageInfo:GetAssetId() then
this:SetImage(Http.GetThumbnailUrlForAsset(packageInfo:GetAssetId()))
else
--TODO: show a no package image?
end
this:ColorizeImage(packageInfo:IsOwned() and 1 or 0, 0)
this:SetPopupText(packageInfo:GetName())
function this:GetAssetId()
return packageInfo:GetAssetId()
end
function this:GetPackageInfo()
return packageInfo
end
function this:UpdateOwnership()
local ownsAsset = packageInfo:IsOwned()
self:SetActive(ownsAsset)
self:ColorizeImage(ownsAsset and 1 or 0, 0)
self:UpdateEquipButton()
self:UpdatePriceText()
--Added for promo label
self:UpdatePromoText()
end
function this:UpdateEquipButton()
self.EquippedCheckmark.Visible = packageInfo:IsWearing()
end
local selectDebounce = false
function this:Select()
if selectDebounce then return false end
local result = false
if packageInfo:IsOwned() and not packageInfo:IsWearing() then
selectDebounce = true
spawn(function()
wearPackageAsync()
selectDebounce = false
end)
result = true
end
return result
end
function this:OnClick()
buyPackageAsync()
end
local isWearingConn = nil
local ownershipChangedCn = nil
local baseShow = this.Show
function this:Show()
baseShow(self)
Utility.DisconnectEvent(isWearingConn)
packageInfo.IsWearingChanged:connect(function()self:UpdateEquipButton() end)
Utility.DisconnectEvent(ownershipChangedCn)
ownershipChangedCn = packageInfo.OwnershipChanged:connect(function()
self:UpdateOwnership()
end)
self:UpdateEquipButton()
self:UpdateOwnership()
end
local baseHide = this.Hide
function this:Hide()
baseHide(self)
isWearingConn = Utility.DisconnectEvent(isWearingConn)
ownershipChangedCn = Utility.DisconnectEvent(ownershipChangedCn)
end
local baseFocus = this.Focus
local avatarItemClickConn = nil
function this:GetAnalyticsInfo()
return
{
[Analytics.WidgetNames('WidgetId')] = Analytics.WidgetNames('AvatarTileId');
AssetId = packageInfo:GetAssetId();
IsOwned = packageInfo:IsOwned();
}
end
function this:Focus()
baseFocus(self)
focused = true
Utility.DisconnectEvent(avatarItemClickConn)
avatarItemClickConn = self.AvatarItemContainer.MouseButton1Click:connect(function()
self:OnClick()
end)
self:UpdateEquipButton()
spawn(function()
wait(0.17)
if focused then
if not packageInfo:IsOwned() then
self:ColorizeImage(1)
end
end
end)
end
local baseRemoveFocus = this.RemoveFocus
function this:RemoveFocus()
baseRemoveFocus(self)
focused = false
avatarItemClickConn = Utility.DisconnectEvent(avatarItemClickConn)
-- Decolorize unowned packages
if not packageInfo:IsOwned() then
self:ColorizeImage(0)
end
end
return this
end
return createAvatarInfoContainer