424 lines
15 KiB
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
|