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

424 lines
15 KiB
Lua

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 GameplaySettingsData = require(ShellModules:FindFirstChild('GameplaySettingsData'))
local GlobalSettings = require(ShellModules:FindFirstChild('GlobalSettings'))
local ScreenManager = require(ShellModules:FindFirstChild('ScreenManager'))
local SoundManager = require(ShellModules:FindFirstChild('SoundManager'))
local Strings = require(ShellModules:FindFirstChild('LocalizedStrings'))
local DisableCrossplayOverlay = require(ShellModules:FindFirstChild('DisableCrossplayOverlay'))
local EnableCrossplayOverlay = require(ShellModules:FindFirstChild('EnableCrossplayOverlay'))
local GuiService = game:GetService('GuiService')
local PlatformService = nil
pcall(function() PlatformService = game:GetService('PlatformService') end)
local MULTIPLAYER_SETTING_URI = "ms-settings://CustomizePrivacyMultiplayer"
local GAME_CONTENT_SETTING_URI = "ms-settings://CustomizePrivacyGameContent"
local function createGameplaySettingsView(errorCode)
local this = {}
local dummySelection = Utility.Create'Frame'
{
BackgroundTransparency = 1;
}
local Container = Utility.Create'Frame'
{
Name = "GameplaySettingsContainer";
Position = UDim2.new(0, 0, 0, 0);
Size = UDim2.new(1, 0, 1, 0);
BackgroundTransparency = 1;
BorderSizePixel = 0;
Selectable = true;
SelectionImageObject = dummySelection;
}
local function TryLaunchUri(uri)
if PlatformService then
PlatformService:LaunchPlatformUri(uri)
end
end
local EnabledStatusButton = nil
local MultiplayerButton = nil
local SharedContentButton = nil
local function createCPPSettingsView()
Utility.Create'TextLabel'
{
Name = "CPPSettingsTitle";
TextXAlignment = 'Left';
TextYAlignment = 'Bottom';
Size = UDim2.new(0, 0, 0, 0);
Position = UDim2.new(0, 26, 0, 26);
BackgroundTransparency = 1;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.SubHeaderSize;
TextColor3 = GlobalSettings.WhiteTextColor;
Text = Strings:LocalizedString('CrossPlatformGameplayPhrase');
Parent = Container;
}
EnabledStatusButton = Utility.Create'ImageButton'
{
Name = "EnabledStatusButton";
Position = UDim2.new(0, 26, 0, 46);
Size = UDim2.new(0, 520, 0, 75);
BackgroundTransparency = 1;
ImageTransparency = 0.25;
ImageColor3 = GlobalSettings.GreyButtonColor;
Image = GlobalSettings.RoundCornerButtonImage;
ScaleType = Enum.ScaleType.Slice;
SliceCenter = Rect.new(16, 16, 16, 16);
ZIndex = 1;
Parent = Container;
SoundManager:CreateSound('MoveSelection');
}
local EnabledStatusText = Utility.Create'TextLabel'
{
Name = "EnabledStatusText";
TextXAlignment = 'Left';
TextYAlignment = 'Center';
Size = UDim2.new(0, 0, 1, 0);
Position = UDim2.new(0, 72, 0, 0);
BackgroundTransparency = 1;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.ButtonSize;
TextColor3 = GlobalSettings.WhiteTextColor;
ZIndex = 2;
Text = Strings:LocalizedString("LoadingWord");
Parent = EnabledStatusButton;
}
local EnabledStatusIcon = Utility.Create'ImageLabel'
{
Name = "EnabledStatusIcon";
Position = UDim2.new(0, 20, 0.5, 0);
AnchorPoint = Vector2.new(0, 0.5);
Size = UDim2.new(0, 32, 0, 32);
BackgroundTransparency = 1;
Image = "rbxasset://textures/ui/Shell/Icons/EnabledStatusIcon.png";
ImageColor3 = Color3.new(1, 1, 1);
ZIndex = 2;
Parent = EnabledStatusButton;
}
local DescriptionText = Utility.Create'TextLabel'
{
Name = "DescriptionText";
Position = UDim2.new(0,26, 0, 135);
Size = UDim2.new(0, 520, 0, 110);
Text = "";
TextXAlignment = 'Center';
TextYAlignment = 'Top';
BackgroundTransparency = 1;
Font = GlobalSettings.BoldFont;
TextColor3 = GlobalSettings.GreyTextColor;
FontSize = GlobalSettings.SmallTitleSize;
TextWrapped = true;
Parent = Container;
}
--Make the EnabledStatusButton big enough
Utility.ResizeButtonWithDynamicText(EnabledStatusButton, EnabledStatusText,
{Strings:LocalizedString("EnabledWord"), Strings:LocalizedString("DisabledWord"), Strings:LocalizedString("LoadingWord")},
GlobalSettings.TextHorizontalPadding + EnabledStatusText.Position.X.Offset/2)
local isCPPEnabled = nil
local cppSettingDebounce = false
local function onCPPStatusChanged(val)
isCPPEnabled = val
if isCPPEnabled then
EnabledStatusIcon.ImageColor3 = Color3.new(0, 0.9, 0);
EnabledStatusText.Text = Strings:LocalizedString("EnabledWord");
DescriptionText.Text = Strings:LocalizedString("CrossplayEnabledDescription");
else
EnabledStatusIcon.ImageColor3 = Color3.new(0.9, 0, 0);
EnabledStatusText.Text = Strings:LocalizedString("DisabledWord");
DescriptionText.Text = Strings:LocalizedString("CrossplayDisabledDescription");
end
end
local function SetCrossplayEnabledCallback(result)
if result == nil then
local Errors = require(ShellModules:FindFirstChild('Errors'))
local ErrorOverlay = require(ShellModules:FindFirstChild('ErrorOverlay'))
ScreenManager:OpenScreen(ErrorOverlay(Errors.CPPSettingError.SetCPPSettingError), false)
else
onCPPStatusChanged(result)
if result then
ScreenManager:OpenScreen(EnableCrossplayOverlay(
{
Title = Strings:LocalizedString("EnableCrossplayOverlayTitle"),
Msg = Strings:LocalizedString("EnableCrossplayOverlayMessage"),
Callback = function() end
}),
false
)
end
end
end
local function SetCrossplayEnabled(val)
cppSettingDebounce = true
GameplaySettingsData.SetCrossplayEnabledStatusAsync(val)
cppSettingDebounce = false
end
EnabledStatusButton.MouseButton1Click:connect(function()
SoundManager:Play('ButtonPress')
if isCPPEnabled == nil or cppSettingDebounce then return end
cppSettingDebounce = true
if isCPPEnabled then
ScreenManager:OpenScreen(DisableCrossplayOverlay(
{
Title = Strings:LocalizedString("DisableCrossplayOverlayTitle"),
Msg = Strings:LocalizedString("DisableCrossplayOverlayMessage"),
Callback = function()
SetCrossplayEnabled(false)
end
}),
false
)
else
SetCrossplayEnabled(true)
end
cppSettingDebounce = false
end)
GameplaySettingsData.UpdateSetCrossplayEnabledStatusAsyncFunc(SetCrossplayEnabledCallback)
spawn(
function()
onCPPStatusChanged(GameplaySettingsData.GetCrossplayEnabledStatusAsync())
end
)
Container.SelectionGained:connect(function()
Utility.SetSelectedCoreObject(EnabledStatusButton)
end)
end
local function createPrivilegeSettingsView()
local XASTitleTextLabel = Utility.Create'TextLabel'
{
Name = "XboxAccountSettingsTitle";
TextXAlignment = 'Left';
TextYAlignment = 'Bottom';
Size = UDim2.new(0, 0, 0, 0);
Position = UDim2.new(0, 26, 0, 252 + 26);
BackgroundTransparency = 1;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.SubHeaderSize;
TextColor3 = GlobalSettings.WhiteTextColor;
Text = Strings:LocalizedString('XboxAccountSettingsPhrase');
Parent = Container;
}
MultiplayerButton = Utility.Create'ImageButton'
{
Name = "MultiplayerButton";
Size = UDim2.new(0, 520, 0, 75);
BackgroundTransparency = 1;
ImageTransparency = 0.25;
ImageColor3 = GlobalSettings.GreyButtonColor;
Image = GlobalSettings.RoundCornerButtonImage;
ScaleType = Enum.ScaleType.Slice;
Selectable = true;
SliceCenter = Rect.new(16, 16, 16, 16);
ZIndex = 1;
Parent = Container;
SoundManager:CreateSound('MoveSelection');
}
MultiplayerButton.Position = XASTitleTextLabel.Position + UDim2.new(0, 0, 0, XASTitleTextLabel.Size.Y.Offset + 20)
SharedContentButton = MultiplayerButton:Clone()
SharedContentButton.Name = "SharedContentButton"
SharedContentButton.Parent = Container
SharedContentButton.Position = SharedContentButton.Position + UDim2.new(0, 0, 0, MultiplayerButton.Size.Y.Offset + 10)
local MultiplayerButtonLinkable = false
local MultiplayerButtonSelectable = MultiplayerButton.Selectable
local SharedContentButtonLinkable = false
local SharedContentButtonSelectable = SharedContentButton.Selectable
MultiplayerButton.MouseButton1Click:connect(function()
if MultiplayerButtonLinkable then
TryLaunchUri(MULTIPLAYER_SETTING_URI)
end
end)
SharedContentButton.MouseButton1Click:connect(function()
if SharedContentButtonLinkable then
TryLaunchUri(GAME_CONTENT_SETTING_URI)
end
end)
local MultiplayerText = Utility.Create'TextLabel'
{
Name = "MultiplayerText";
TextXAlignment = 'Left';
TextYAlignment = 'Center';
Size = UDim2.new(0, 0, 1, 0);
Position = UDim2.new(0, 72, 0, 0);
BackgroundTransparency = 1;
Font = GlobalSettings.RegularFont;
FontSize = GlobalSettings.ButtonSize;
TextColor3 = GlobalSettings.WhiteTextColor;
ZIndex = 2;
Parent = MultiplayerButton;
Text = Strings:LocalizedString("MultiplayerWord")..": "..Strings:LocalizedString("LoadingWord");
}
local SharedContentText = MultiplayerText:Clone()
SharedContentText.Name = "SharedContentText"
SharedContentText.Parent = SharedContentButton
SharedContentText.Text = Strings:LocalizedString("SharedContentWord")..": "..Strings:LocalizedString("LoadingWord")
local MultiplayerIcon = Utility.Create'ImageLabel'
{
Name = "MultiplayerIcon";
Position = UDim2.new(0, 20, 0.5, 0);
AnchorPoint = Vector2.new(0, 0.5);
Size = UDim2.new(0, 32, 0, 32);
BackgroundTransparency = 1;
Image = "rbxasset://textures/ui/Shell/Icons/EnabledStatusIcon.png";
ImageColor3 = Color3.new(1, 1, 1);
ZIndex = 2;
Parent = MultiplayerButton;
}
local SharedContentIcon = MultiplayerIcon:Clone()
SharedContentIcon.Name = "SharedContentIcon"
SharedContentIcon.Parent = SharedContentButton
local MultiplayerLinkIcon = Utility.Create'ImageLabel'
{
Name = "MultiplayerLinkIcon";
Position = UDim2.new(1, -20, 0.5, 0);
AnchorPoint = Vector2.new(1, 0.5);
Size = UDim2.new(0, 32, 0, 32);
BackgroundTransparency = 1;
Image = "rbxasset://textures/ui/Shell/Icons/ExternalLink.png";
ImageColor3 = Color3.new(1, 1, 1);
ZIndex = 2;
Parent = MultiplayerButton;
}
local SharedContentLinkIcon = MultiplayerLinkIcon:Clone()
SharedContentLinkIcon.Name = "SharedContentLinkIcon"
SharedContentLinkIcon.Parent = SharedContentButton
local DescriptionText = Utility.Create'TextLabel'
{
Name = "DescriptionText";
Size = UDim2.new(0, 520, 0, 200);
Text = "";
TextXAlignment = 'Center';
TextYAlignment = 'Top';
BackgroundTransparency = 1;
Font = GlobalSettings.BoldFont;
TextColor3 = GlobalSettings.GreyTextColor;
FontSize = GlobalSettings.SmallTitleSize;
TextWrapped = true;
Parent = Container;
Text = "";
}
DescriptionText.Position = UDim2.new(0, 26, 0, SharedContentButton.Position.Y.Offset + SharedContentButton.Size.Y.Offset + 24)
local function SetPrivilegeInView(privilegeSettings)
if privilegeSettings then
local MultiplayerSetting = privilegeSettings.Multiplayer
local SharedContentSetting = privilegeSettings.SharedContent
if MultiplayerSetting.Success and SharedContentSetting.Success then
if MultiplayerSetting.PrivilegeCheckResult == "NoIssue" and SharedContentSetting.PrivilegeCheckResult == "NoIssue" then
DescriptionText.Text = Strings:LocalizedString("PrivilegeAllowedPhrase")
elseif MultiplayerSetting.PrivilegeCheckResult == "Banned" or SharedContentSetting.PrivilegeCheckResult == "Banned" then
DescriptionText.Text = Strings:LocalizedString("PrivilegeBannedPhrase")
elseif MultiplayerSetting.PrivilegeCheckResult == "PurchaseRequired" or SharedContentSetting.PrivilegeCheckResult == "PurchaseRequired" then
DescriptionText.Text = Strings:LocalizedString("PrivilegePurchaseRequiredPhrase")
else
DescriptionText.Text = Strings:LocalizedString("PrivilegeDeniedPhrase")
end
else
DescriptionText.Text = Strings:LocalizedString("PrivilegeErrorPhrase")
end
MultiplayerIcon.ImageColor3 = MultiplayerSetting.CanJoinGame and Color3.new(0, 0.9, 0) or Color3.new(0.9, 0, 0)
SharedContentIcon.ImageColor3 = SharedContentSetting.CanJoinGame and Color3.new(0, 0.9, 0) or Color3.new(0.9, 0, 0)
MultiplayerText.Text = Strings:LocalizedString("MultiplayerWord")..": "..Strings:LocalizedString(MultiplayerSetting.LocalizedStringKey)
SharedContentText.Text = Strings:LocalizedString("SharedContentWord")..": "..Strings:LocalizedString(SharedContentSetting.LocalizedStringKey)
SharedContentButtonLinkable = not(SharedContentSetting.PrivilegeCheckResult == "NoIssue" or SharedContentSetting.PrivilegeCheckResult == "Banned" or SharedContentSetting.PrivilegeCheckResult == "PurchaseRequired")
MultiplayerButtonLinkable = not(MultiplayerSetting.PrivilegeCheckResult == "NoIssue" or MultiplayerSetting.PrivilegeCheckResult == "Banned" or MultiplayerSetting.PrivilegeCheckResult == "PurchaseRequired")
SharedContentButtonSelectable = SharedContentButtonLinkable
MultiplayerButtonSelectable = MultiplayerButtonLinkable
else
SharedContentIcon.ImageColor3 = Color3.new(1, 1, 1)
MultiplayerIcon.ImageColor3 = Color3.new(1, 1, 1)
SharedContentText.Text = Strings:LocalizedString("SharedContentWord")..": "..Strings:LocalizedString("LoadingWord")
MultiplayerText.Text = Strings:LocalizedString("MultiplayerWord")..": "..Strings:LocalizedString("LoadingWord")
DescriptionText.Text = ""
SharedContentButtonLinkable = false
MultiplayerButtonLinkable = false
--Buttons are still selectable while loading, just don't launch deep link by click
SharedContentButtonSelectable = true
MultiplayerButtonSelectable = true
end
SharedContentLinkIcon.Visible = SharedContentButtonLinkable
MultiplayerLinkIcon.Visible = MultiplayerButtonLinkable
SharedContentButton.Selectable = SharedContentButtonSelectable
MultiplayerButton.Selectable = MultiplayerButtonSelectable
SharedContentButton.ImageTransparency = SharedContentButtonSelectable and 0.25 or 1
MultiplayerButton.ImageTransparency = MultiplayerButtonSelectable and 0.25 or 1
if GuiService.SelectedCoreObject == SharedContentButton or GuiService.SelectedCoreObject == MultiplayerButton then
if not GuiService.SelectedCoreObject.Selectable then
Utility.SetSelectedCoreObject(Container.EnabledStatusButton)
end
end
end
SetPrivilegeInView(GameplaySettingsData.GetPrivilegeSettings())
GameplaySettingsData.OnGetPrivilegeSettingsBegin:connect(SetPrivilegeInView)
GameplaySettingsData.OnGetPrivilegeSettingsEnd:connect(SetPrivilegeInView)
end
createCPPSettingsView()
createPrivilegeSettingsView()
--[[ Public API ]]--
function this:SetParent(newParent)
Container.Parent = newParent
end
function this:Focus()
if errorCode then
if errorCode == 113 then
if MultiplayerButton and MultiplayerButton.Selectable then
Utility.SetSelectedCoreObject(MultiplayerButton)
else
Utility.SetSelectedCoreObject(EnabledStatusButton)
end
elseif errorCode == 116 then
if SharedContentButton and SharedContentButton.Selectable then
Utility.SetSelectedCoreObject(SharedContentButton)
else
Utility.SetSelectedCoreObject(EnabledStatusButton)
end
end
end
end
function this:GetContainer()
return Container
end
return this
end
return createGameplaySettingsView