This commit is contained in:
lx
2026-07-06 13:39:13 -04:00
commit 34bf440a8c
2694 changed files with 77580 additions and 0 deletions
@@ -0,0 +1,790 @@
--[[
Filename: GameSettings.lua
Written by: jeditkacheff
Version 1.1
Description: Takes care of the Game Settings Tab in Settings Menu
--]]
-------------- SERVICES --------------
local CoreGui = game:GetService("CoreGui")
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
local GuiService = game:GetService("GuiService")
local UserInputService = game:GetService("UserInputService")
local PlatformService = nil
pcall(function() PlatformService = game:GetService("PlatformService") end)
local ContextActionService = game:GetService("ContextActionService")
local StarterGui = game:GetService("StarterGui")
local Settings = UserSettings()
local GameSettings = Settings.GameSettings
-------------- CONSTANTS --------------
local GRAPHICS_QUALITY_LEVELS = 10
local GRAPHICS_QUALITY_TO_INT = {
["Enum.SavedQualitySetting.Automatic"] = 0,
["Enum.SavedQualitySetting.QualityLevel1"] = 1,
["Enum.SavedQualitySetting.QualityLevel2"] = 2,
["Enum.SavedQualitySetting.QualityLevel3"] = 3,
["Enum.SavedQualitySetting.QualityLevel4"] = 4,
["Enum.SavedQualitySetting.QualityLevel5"] = 5,
["Enum.SavedQualitySetting.QualityLevel6"] = 6,
["Enum.SavedQualitySetting.QualityLevel7"] = 7,
["Enum.SavedQualitySetting.QualityLevel8"] = 8,
["Enum.SavedQualitySetting.QualityLevel9"] = 9,
["Enum.SavedQualitySetting.QualityLevel10"] = 10,
}
local PC_CHANGED_PROPS = {
DevComputerMovementMode = true,
DevComputerCameraMode = true,
DevEnableMouseLock = true,
}
local TOUCH_CHANGED_PROPS = {
DevTouchMovementMode = true,
DevTouchCameraMode = true,
}
local CAMERA_MODE_DEFAULT_STRING = UserInputService.TouchEnabled and "Default (Follow)" or "Default (Classic)"
local MOVEMENT_MODE_DEFAULT_STRING = UserInputService.TouchEnabled and "Default (Thumbstick)" or "Default (Keyboard)"
local MOVEMENT_MODE_KEYBOARDMOUSE_STRING = "Keyboard + Mouse"
local MOVEMENT_MODE_CLICKTOMOVE_STRING = UserInputService.TouchEnabled and "Tap to Move" or "Click to Move"
----------- UTILITIES --------------
local utility = require(RobloxGui.Modules.Settings.Utility)
------------ Variables -------------------
RobloxGui:WaitForChild("Modules"):WaitForChild("TenFootInterface")
RobloxGui:WaitForChild("Modules"):WaitForChild("Settings"):WaitForChild("SettingsHub")
local isTenFootInterface = require(RobloxGui.Modules.TenFootInterface):IsEnabled()
local HasVRAPI = false
pcall(function() HasVRAPI = UserInputService.GetUserCFrame ~= nil end)
local PageInstance = nil
local LocalPlayer = game.Players.LocalPlayer
local platform = UserInputService:GetPlatform()
local overscanScreen = nil
----------- CLASS DECLARATION --------------
local function Initialize()
local settingsPageFactory = require(RobloxGui.Modules.Settings.SettingsPageFactory)
local this = settingsPageFactory:CreateNewPage()
----------- FUNCTIONS ---------------
local function createGraphicsOptions()
------------------ Fullscreen Selection GUI Setup ------------------
local fullScreenInit = 1
if not GameSettings:InFullScreen() then
fullScreenInit = 2
end
this.FullscreenFrame,
this.FullscreenLabel,
this.FullscreenEnabler = utility:AddNewRow(this, "Fullscreen", "Selector", {"On", "Off"}, fullScreenInit)
local fullScreenSelectionFrame = this.FullscreenEnabler.SliderFrame and this.FullscreenEnabler.SliderFrame or this.FullscreenEnabler.SelectorFrame
this.FullscreenEnabler.IndexChanged:connect(function(newIndex)
GuiService:ToggleFullscreen()
end)
------------------ Gfx Enabler Selection GUI Setup ------------------
local graphicsEnablerStart = 1
if GameSettings.SavedQualityLevel ~= Enum.SavedQualitySetting.Automatic then
graphicsEnablerStart = 2
end
this.GraphicsEnablerFrame,
this.GraphicsEnablerLabel,
this.GraphicsQualityEnabler = utility:AddNewRow(this, "Graphics Mode", "Selector", {"Automatic", "Manual"}, graphicsEnablerStart)
------------------ Gfx Slider GUI Setup ------------------
this.GraphicsQualityFrame,
this.GraphicsQualityLabel,
this.GraphicsQualitySlider = utility:AddNewRow(this, "Graphics Quality", "Slider", GRAPHICS_QUALITY_LEVELS, 1)
this.GraphicsQualitySlider:SetMinStep(1)
------------------------- Connection Setup ----------------------------
settings().Rendering.EnableFRM = true
function SetGraphicsQuality(newValue, automaticSettingAllowed)
local percentage = newValue/GRAPHICS_QUALITY_LEVELS
local newQualityLevel = math.floor((settings().Rendering:GetMaxQualityLevel() - 1) * percentage)
if newQualityLevel == 20 then
newQualityLevel = 21
elseif newValue == 1 then
newQualityLevel = 1
elseif newValue < 1 and not automaticSettingAllowed then
newValue = 1
newQualityLevel = 1
elseif newQualityLevel > settings().Rendering:GetMaxQualityLevel() then
newQualityLevel = settings().Rendering:GetMaxQualityLevel() - 1
end
GameSettings.SavedQualityLevel = newValue
settings().Rendering.QualityLevel = newQualityLevel
end
local function setGraphicsToAuto()
this.GraphicsQualitySlider:SetZIndex(1)
this.GraphicsQualityLabel.ZIndex = 1
this.GraphicsQualitySlider:SetInteractable(false)
SetGraphicsQuality(Enum.QualityLevel.Automatic.Value, true)
end
local function setGraphicsToManual(level)
this.GraphicsQualitySlider:SetZIndex(2)
this.GraphicsQualityLabel.ZIndex = 2
this.GraphicsQualitySlider:SetInteractable(true)
-- need to force the quality change if slider is already at this position
if this.GraphicsQualitySlider:GetValue() == level then
SetGraphicsQuality(level)
else
this.GraphicsQualitySlider:SetValue(level)
end
end
game.GraphicsQualityChangeRequest:connect(function(isIncrease)
if settings().Rendering.QualityLevel == Enum.QualityLevel.Automatic then return end
--
local currentGraphicsSliderValue = this.GraphicsQualitySlider:GetValue()
if isIncrease then
currentGraphicsSliderValue = currentGraphicsSliderValue + 1
else
currentGraphicsSliderValue = currentGraphicsSliderValue - 1
end
this.GraphicsQualitySlider:SetValue(currentGraphicsSliderValue)
end)
this.GraphicsQualitySlider.ValueChanged:connect(function(newValue)
SetGraphicsQuality(newValue)
end)
this.GraphicsQualityEnabler.IndexChanged:connect(function(newIndex)
if newIndex == 1 then
setGraphicsToAuto()
elseif newIndex == 2 then
setGraphicsToManual( this.GraphicsQualitySlider:GetValue() )
end
end)
-- initialize the slider position
if GameSettings.SavedQualityLevel == Enum.SavedQualitySetting.Automatic then
this.GraphicsQualitySlider:SetValue(5)
setGraphicsToAuto()
else
local graphicsLevel = tostring(GameSettings.SavedQualityLevel)
if GRAPHICS_QUALITY_TO_INT[graphicsLevel] then
graphicsLevel = GRAPHICS_QUALITY_TO_INT[graphicsLevel]
else
graphicsLevel = GRAPHICS_QUALITY_LEVELS
end
spawn(function()
this.GraphicsQualitySlider:SetValue(graphicsLevel)
end)
end
end
local function createCameraModeOptions(movementModeEnabled)
------------------------------------------------------
------------------
------------------ Shift Lock Switch -----------------
if UserInputService.MouseEnabled then
this.ShiftLockFrame,
this.ShiftLockLabel,
this.ShiftLockMode,
this.ShiftLockOverrideText = nil
if UserInputService.MouseEnabled and UserInputService.KeyboardEnabled then
local startIndex = 2
if GameSettings.ControlMode == Enum.ControlMode.MouseLockSwitch then
startIndex = 1
end
this.ShiftLockFrame,
this.ShiftLockLabel,
this.ShiftLockMode = utility:AddNewRow(this, "Shift Lock Switch", "Selector", {"On", "Off"}, startIndex)
this.ShiftLockOverrideText = utility:Create'TextLabel'
{
Name = "ShiftLockOverrideLabel",
Text = "Set by Developer",
TextColor3 = Color3.new(1,1,1),
Font = Enum.Font.SourceSans,
FontSize = Enum.FontSize.Size24,
BackgroundTransparency = 1,
Size = UDim2.new(0,200,1,0),
Position = UDim2.new(1,-350,0,0),
Visible = false,
ZIndex = 2,
Parent = this.ShiftLockFrame
};
this.ShiftLockMode.IndexChanged:connect(function(newIndex)
if newIndex == 1 then
GameSettings.ControlMode = Enum.ControlMode.MouseLockSwitch
else
GameSettings.ControlMode = Enum.ControlMode.Classic
end
end)
end
end
------------------------------------------------------
------------------
------------------ Camera Mode -----------------------
do
local enumItems = nil
local startingCameraEnumItem = 1
if UserInputService.TouchEnabled then
enumItems = Enum.TouchCameraMovementMode:GetEnumItems()
else
enumItems = Enum.ComputerCameraMovementMode:GetEnumItems()
end
local cameraEnumNames = {}
local cameraEnumNameToItem = {}
for i = 1, #enumItems do
local displayName = enumItems[i].Name
if displayName == 'Default' then
displayName = CAMERA_MODE_DEFAULT_STRING
end
if UserInputService.TouchEnabled then
if GameSettings.TouchCameraMovementMode == enumItems[i] then
startingCameraEnumItem = i
end
else
if GameSettings.ComputerCameraMovementMode == enumItems[i] then
startingCameraEnumItem = i
end
end
cameraEnumNames[i] = displayName
cameraEnumNameToItem[displayName] = enumItems[i].Value
end
this.CameraModeFrame,
this.CameraModeLabel,
this.CameraMode = utility:AddNewRow(this, "Camera Mode", "Selector", cameraEnumNames, startingCameraEnumItem)
this.CameraModeOverrideText = utility:Create'TextLabel'
{
Name = "CameraDevOverrideLabel",
Text = "Set by Developer",
TextColor3 = Color3.new(1,1,1),
Font = Enum.Font.SourceSans,
FontSize = Enum.FontSize.Size24,
BackgroundTransparency = 1,
Size = UDim2.new(0,200,1,0),
Position = UDim2.new(1,-350,0,0),
Visible = false,
ZIndex = 2,
Parent = this.CameraModeFrame
};
this.CameraMode.IndexChanged:connect(function(newIndex)
local newEnumSetting = cameraEnumNameToItem[cameraEnumNames[newIndex]]
if UserInputService.TouchEnabled then
GameSettings.TouchCameraMovementMode = newEnumSetting
else
GameSettings.ComputerCameraMovementMode = newEnumSetting
end
end)
end
------------------------------------------------------
------------------
------------------ VR Camera Mode -----------------------
if HasVRAPI and UserInputService.VREnabled then
local VR_ROTATION_INTENSITY_OPTIONS = {"Low", "High", "Smooth"}
if utility:IsSmallTouchScreen() then
this.VRRotationFrame,
this.VRRotationLabel,
this.VRRotationMode = utility:AddNewRow(this, "VR Camera Rotation", "Selector", VR_ROTATION_INTENSITY_OPTIONS, GameSettings.VRRotationIntensity)
else
this.VRRotationFrame,
this.VRRotationLabel,
this.VRRotationMode = utility:AddNewRow(this, "VR Camera Rotation", "Selector", VR_ROTATION_INTENSITY_OPTIONS, GameSettings.VRRotationIntensity, 3)
end
StarterGui:RegisterGetCore("VRRotationIntensity",
function()
return VR_ROTATION_INTENSITY_OPTIONS[GameSettings.VRRotationIntensity] or VR_ROTATION_INTENSITY_OPTIONS[1]
end)
this.VRRotationMode.IndexChanged:connect(function(newIndex)
GameSettings.VRRotationIntensity = newIndex
end)
end
------------------------------------------------------
------------------
------------------ Movement Mode ---------------------
if movementModeEnabled then
local movementEnumItems = nil
local startingMovementEnumItem = 1
if UserInputService.TouchEnabled then
movementEnumItems = Enum.TouchMovementMode:GetEnumItems()
else
movementEnumItems = Enum.ComputerMovementMode:GetEnumItems()
end
local movementEnumNames = {}
local movementEnumNameToItem = {}
for i = 1, #movementEnumItems do
local displayName = movementEnumItems[i].Name
if displayName == "Default" then
displayName = MOVEMENT_MODE_DEFAULT_STRING
elseif displayName == "KeyboardMouse" then
displayName = MOVEMENT_MODE_KEYBOARDMOUSE_STRING
elseif displayName == "ClickToMove" then
displayName = MOVEMENT_MODE_CLICKTOMOVE_STRING
end
if UserInputService.TouchEnabled then
if GameSettings.TouchMovementMode == movementEnumItems[i] then
startingMovementEnumItem = i
end
else
if GameSettings.ComputerMovementMode == movementEnumItems[i] then
startingMovementEnumItem = i
end
end
movementEnumNames[i] = displayName
movementEnumNameToItem[displayName] = movementEnumItems[i]
end
this.MovementModeFrame,
this.MovementModeLabel,
this.MovementMode = utility:AddNewRow(this, "Movement Mode", "Selector", movementEnumNames, startingMovementEnumItem)
this.MovementModeOverrideText = utility:Create'TextLabel'
{
Name = "MovementDevOverrideLabel",
Text = "Set by Developer",
TextColor3 = Color3.new(1,1,1),
Font = Enum.Font.SourceSans,
FontSize = Enum.FontSize.Size24,
BackgroundTransparency = 1,
Size = UDim2.new(0,200,1,0),
Position = UDim2.new(1,-350,0,0),
Visible = false,
ZIndex = 2,
Parent = this.MovementModeFrame
};
this.MovementMode.IndexChanged:connect(function(newIndex)
local newEnumSetting = movementEnumNameToItem[movementEnumNames[newIndex]]
if UserInputService.TouchEnabled then
GameSettings.TouchMovementMode = newEnumSetting
else
GameSettings.ComputerMovementMode = newEnumSetting
end
end)
end
------------------------------------------------------
------------------
------------------------- Connection Setup -----------
function setCameraModeVisible(visible)
if this.CameraMode then
this.CameraMode.SelectorFrame.Visible = visible
this.CameraMode:SetInteractable(visible)
end
end
function setMovementModeVisible(visible)
if this.MovementMode then
this.MovementMode.SelectorFrame.Visible = visible
this.MovementMode:SetInteractable(visible)
end
end
function setShiftLockVisible(visible)
if this.ShiftLockMode then
this.ShiftLockMode.SelectorFrame.Visible = visible
this.ShiftLockMode:SetInteractable(visible)
end
end
do -- initial set of dev vs user choice for guis
local isUserChoiceCamera = false
if UserInputService.TouchEnabled then
isUserChoiceCamera = LocalPlayer.DevTouchCameraMode == Enum.DevTouchCameraMovementMode.UserChoice
else
isUserChoiceCamera = LocalPlayer.DevComputerCameraMode == Enum.DevComputerCameraMovementMode.UserChoice
end
if not isUserChoiceCamera then
this.CameraModeOverrideText.Visible = true
setCameraModeVisible(false)
else
this.CameraModeOverrideText.Visible = false
setCameraModeVisible(true)
end
local isUserChoiceMovement = false
if UserInputService.TouchEnabled then
isUserChoiceMovement = LocalPlayer.DevTouchMovementMode == Enum.DevTouchMovementMode.UserChoice
else
isUserChoiceMovement = LocalPlayer.DevComputerMovementMode == Enum.DevComputerMovementMode.UserChoice
end
if this.MovementModeOverrideText then
if not isUserChoiceMovement then
this.MovementModeOverrideText.Visible = true
setMovementModeVisible(false)
else
this.MovementModeOverrideText.Visible = false
setMovementModeVisible(true)
end
end
if this.ShiftLockOverrideText then
this.ShiftLockOverrideText.Visible = not LocalPlayer.DevEnableMouseLock
setShiftLockVisible(LocalPlayer.DevEnableMouseLock)
end
end
local function updateUserSettingsMenu(property)
if this.ShiftLockOverrideText and property == "DevEnableMouseLock" then
this.ShiftLockOverrideText.Visible = not LocalPlayer.DevEnableMouseLock
setShiftLockVisible(LocalPlayer.DevEnableMouseLock)
elseif property == "DevComputerCameraMode" then
local isUserChoice = LocalPlayer.DevComputerCameraMode == Enum.DevComputerCameraMovementMode.UserChoice
setCameraModeVisible(isUserChoice)
this.CameraModeOverrideText.Visible = not isUserChoice
elseif property == "DevComputerMovementMode" then
local isUserChoice = LocalPlayer.DevComputerMovementMode == Enum.DevComputerMovementMode.UserChoice
setMovementModeVisible(isUserChoice)
if this.MovementModeOverrideText then
this.MovementModeOverrideText.Visible = not isUserChoice
end
-- TOUCH
elseif property == "DevTouchMovementMode" then
local isUserChoice = LocalPlayer.DevTouchMovementMode == Enum.DevTouchMovementMode.UserChoice
setMovementModeVisible(isUserChoice)
if this.MovementModeOverrideText then
this.MovementModeOverrideText.Visible = not isUserChoice
end
elseif property == "DevTouchCameraMode" then
local isUserChoice = LocalPlayer.DevTouchCameraMode == Enum.DevTouchCameraMovementMode.UserChoice
setCameraModeVisible(isUserChoice)
this.CameraModeOverrideText.Visible = not isUserChoice
end
end
LocalPlayer.Changed:connect(function(property)
if IsTouchClient then
if TOUCH_CHANGED_PROPS[property] then
updateUserSettingsMenu(property)
end
else
if PC_CHANGED_PROPS[property] then
updateUserSettingsMenu(property)
end
end
end)
end
local function createVolumeOptions()
local startVolumeLevel = math.floor(GameSettings.MasterVolume * 10)
this.VolumeFrame,
this.VolumeLabel,
this.VolumeSlider = utility:AddNewRow(this, "Volume", "Slider", 10, startVolumeLevel)
local volumeSound = Instance.new("Sound", game.CoreGui.RobloxGui.Sounds)
volumeSound.Name = "VolumeChangeSound"
volumeSound.SoundId = "rbxasset://sounds/metalstone2.mp3"
this.VolumeSlider.ValueChanged:connect(function(newValue)
local soundPercent = newValue/10
volumeSound.Volume = soundPercent
volumeSound:Play()
GameSettings.MasterVolume = soundPercent
end)
end
local function createMouseOptions()
local MouseSteps = 10
local MinMouseSensitivity = 0.2
local AdvancedSuccess, AdvancedValue = pcall(function() return settings():GetFFlag("AdvancedMouseSensitivityEnabled") end)
local AdvancedEnabled = AdvancedSuccess and AdvancedValue
-- equations below map a function to include points (0, 0.2) (5, 1) (10, 4)
-- where x is the slider position, y is the mouse sensitivity
local function translateEngineMouseSensitivityToGui(engineSensitivity)
return math.floor((2.0/3.0) * (math.sqrt(75.0 * engineSensitivity - 11.0) - 2))
end
local function translateGuiMouseSensitivityToEngine(guiSensitivity)
return 0.03 * math.pow(guiSensitivity,2) + (0.08 * guiSensitivity) + MinMouseSensitivity
end
local startMouseLevel = translateEngineMouseSensitivityToGui(GameSettings.MouseSensitivity)
------------------ Mouse Selection GUI Setup ------------------
-- switch between basic mode and advanced mode.
local MouseModeEnablerStart = 2
if GameSettings.UseBasicMouseSensitivity or not AdvancedEnabled then
MouseModeEnablerStart = 1
end
-- auto-detect mouse invert
local MouseInvertStart = 1
if GameSettings.MouseSensitivityFirstPerson.y < 0 then
MouseInvertStart = 2
end
if AdvancedEnabled then
this.MouseModeFrame,
this.MouseModeLabel,
this.MouseModeEnabler = utility:AddNewRow(this, "Mouse Sensitivity Mode", "Selector", {"Basic", "Advanced"}, MouseModeEnablerStart)
end
------------------ Basic Mouse Sensitivity Slider ------------------
-- basic quantized sensitivity with a weird number of settings.
local SliderLabel = "Basic Mouse Sensitivity"
if not AdvancedEnabled then
SliderLabel = "Mouse Sensitivity"
end
this.MouseSensitivityFrame,
this.MouseSensitivityLabel,
this.MouseSensitivitySlider = utility:AddNewRow(this, SliderLabel, "Slider", MouseSteps, startMouseLevel)
this.MouseSensitivitySlider:SetMinStep(1)
this.MouseSensitivitySlider.ValueChanged:connect(function(newValue)
GameSettings.MouseSensitivity = translateGuiMouseSensitivityToEngine(newValue)
end)
------------------ 3D Sensitivity ------------------
-- affects both first and third person.
if AdvancedEnabled then
local MouseAdvancedStart = tostring(GameSettings.MouseSensitivityFirstPerson.y)
this.MouseAdvancedFrame,
this.MouseAdvancedLabel,
this.MouseAdvancedEntry = utility:AddNewRow(this, "Advanced Mouse Sensitivity", "TextEntry", 1.0, 1.0, MouseAdvancedStart)
this.MouseAdvancedEntry.ValueChanged:connect(function(newValueText)
local currentFirstSensitivity = GameSettings.MouseSensitivityFirstPerson
local currentThirdSensitivity = GameSettings.MouseSensitivityThirdPerson
local newValue = tonumber(newValueText)
if not newValue then
this.MouseAdvancedEntry:SetValue(string.format("%.3f",currentFirstSensitivity.x))
return
end
-- inverted mouse will be handled later
if newValue < 0.0 then
newValue = -newValue
end
-- * assume a minimum that allows a 16000 dpi mouse a full 800mm travel for 360deg
-- ~0.0029: min of 0.001 seems ok.
-- * assume a max that allows a 400 dpi mouse a 360deg travel in 10mm
-- ~9.2: max of 10 seems ok, but users will want to have a bit of fun with crazy settings.
if newValue > 100.0 then
newValue = 100.0
elseif newValue < 0.001 then
newValue = 0.001
end
-- try to keep ratios the same, even though they aren't exposed to the GUI
local firstPersonX = newValue
local firstPersonY = newValue * (currentFirstSensitivity.y / currentFirstSensitivity.x)
local thirdPersonX = newValue * (currentFirstSensitivity.x / currentThirdSensitivity.x)
local thirdPersonY = thirdPersonX * (currentThirdSensitivity.y / currentThirdSensitivity.x)
-- handle invert
if currentFirstSensitivity.y < 0.0 then
firstPersonY = -firstPersonY
end
if currentThirdSensitivity.y < 0.0 then
thirdPersonY = -thirdPersonY
end
GameSettings.MouseSensitivityFirstPerson = Vector2.new(firstPersonX, firstPersonY)
GameSettings.MouseSensitivityThirdPerson = Vector2.new(thirdPersonX, thirdPersonY)
this.MouseAdvancedEntry:SetValue(string.format("%.3f",firstPersonX))
end)
end
------------------ Mouse Invert ------------------
-- This is a common setting in games, even if it is rare
if AdvancedEnabled then
this.MouseInvertFrame,
this.MouseInvertLabel,
this.MouseInvertEnabler = utility:AddNewRow(this, "Advanced Mouse Invert", "Selector", {"Normal", "Inverted"}, MouseInvertStart)
this.MouseInvertEnabler.IndexChanged:connect(function(newIndex)
local currentFirstSensitivity = GameSettings.MouseSensitivityFirstPerson
local currentThirdSensitivity = GameSettings.MouseSensitivityThirdPerson
if newIndex == 1 then
if currentFirstSensitivity.y < 0.0 then
currentFirstSensitivity = Vector2.new(currentFirstSensitivity.x, -currentFirstSensitivity.y)
currentThirdSensitivity = Vector2.new(currentThirdSensitivity.x, -currentThirdSensitivity.y)
end
elseif newIndex == 2 then
if currentFirstSensitivity.y > 0.0 then
currentFirstSensitivity = Vector2.new(currentFirstSensitivity.x, -currentFirstSensitivity.y)
currentThirdSensitivity = Vector2.new(currentThirdSensitivity.x, -currentThirdSensitivity.y)
end
end
GameSettings.MouseSensitivityFirstPerson = currentFirstSensitivity
GameSettings.MouseSensitivityThirdPerson = currentThirdSensitivity
end)
end
------------------ Init ------------------
if AdvancedEnabled then
local function setMouseModeToBasic()
this.MouseSensitivitySlider:SetZIndex(2)
this.MouseSensitivityLabel.ZIndex = 2
this.MouseSensitivitySlider:SetInteractable(true)
this.MouseSensitivitySlider:SetValue(translateEngineMouseSensitivityToGui(GameSettings.MouseSensitivity))
this.MouseAdvancedLabel.ZIndex = 1
this.MouseAdvancedEntry:SetInteractable(false)
this.MouseInvertLabel.ZIndex = 1
this.MouseInvertEnabler:SetInteractable(false)
end
local function setMouseModeToAdvanced()
this.MouseSensitivitySlider:SetZIndex(1)
this.MouseSensitivityLabel.ZIndex = 1
this.MouseSensitivitySlider:SetInteractable(false)
this.MouseAdvancedLabel.ZIndex = 2
this.MouseAdvancedEntry:SetInteractable(true)
local MouseSensitivity3d = GameSettings.MouseSensitivityFirstPerson
this.MouseAdvancedEntry:SetValue(tostring(MouseSensitivity3d.x));
this.MouseInvertLabel.ZIndex = 2
this.MouseInvertEnabler:SetInteractable(true)
end
this.MouseModeEnabler.IndexChanged:connect(function(newIndex)
if newIndex == 1 then
GameSettings.UseBasicMouseSensitivity = true
setMouseModeToBasic()
elseif newIndex == 2 then
GameSettings.UseBasicMouseSensitivity = false
setMouseModeToAdvanced()
end
end)
if GameSettings.UseBasicMouseSensitivity then
setMouseModeToBasic()
this.MouseAdvancedEntry:SetValue(tostring(MouseAdvancedStart))
else
setMouseModeToAdvanced()
end
end
end
local function createOverscanOption()
local showOverscanScreen = function()
if not overscanScreen then
local createOverscanFunc = require(RobloxGui.Modules.OverscanScreen)
overscanScreen = createOverscanFunc(RobloxGui)
overscanScreen:SetStyleForInGame()
end
local MenuModule = require(RobloxGui.Modules.Settings.SettingsHub)
MenuModule:SetVisibility(false, true)
local closedCon = nil
closedCon = overscanScreen.Closed:connect(function()
closedCon:disconnect()
pcall(function() PlatformService.BlurIntensity = 0 end)
ContextActionService:UnbindCoreAction("RbxStopOverscanMovement")
MenuModule:SetVisibility(true, true)
end)
pcall(function() PlatformService.BlurIntensity = 10 end)
local noOpFunc = function() end
ContextActionService:BindCoreAction("RbxStopOverscanMovement", noOpFunc, false,
Enum.UserInputType.Gamepad1, Enum.UserInputType.Gamepad2,
Enum.UserInputType.Gamepad3, Enum.UserInputType.Gamepad4)
local ScreenManager = require(RobloxGui.Modules.ScreenManager)
ScreenManager:OpenScreen(overscanScreen)
end
local adjustButton, adjustText, setButtonRowRef = utility:MakeStyledButton("AdjustButton", "Adjust", UDim2.new(0,300,1,-20), showOverscanScreen, this)
adjustText.Font = Enum.Font.SourceSans
adjustButton.Position = UDim2.new(1,-400,0,12)
local row = utility:AddNewRowObject(this, "Safe Zone", adjustButton)
setButtonRowRef(row)
end
createCameraModeOptions(not isTenFootInterface and
(UserInputService.TouchEnabled or UserInputService.MouseEnabled or UserInputService.KeyboardEnabled))
if UserInputService.MouseEnabled then
createMouseOptions()
end
createVolumeOptions()
if platform == Enum.Platform.Windows or platform == Enum.Platform.UWP or platform == Enum.Platform.OSX then
createGraphicsOptions()
end
if isTenFootInterface then
createOverscanOption()
end
------ TAB CUSTOMIZATION -------
this.TabHeader.Name = "GameSettingsTab"
this.TabHeader.Icon.Image = "rbxasset://textures/ui/Settings/MenuBarIcons/GameSettingsTab.png"
if utility:IsSmallTouchScreen() then
this.TabHeader.Icon.Size = UDim2.new(0,34,0,34)
this.TabHeader.Icon.Position = UDim2.new(this.TabHeader.Icon.Position.X.Scale,this.TabHeader.Icon.Position.X.Offset,0.5,-17)
this.TabHeader.Size = UDim2.new(0,125,1,0)
elseif isTenFootInterface then
this.TabHeader.Icon.Image = "rbxasset://textures/ui/Settings/MenuBarIcons/GameSettingsTab@2x.png"
this.TabHeader.Icon.Size = UDim2.new(0,90,0,90)
this.TabHeader.Icon.Position = UDim2.new(0,0,0.5,-43)
this.TabHeader.Size = UDim2.new(0,280,1,0)
else
this.TabHeader.Icon.Size = UDim2.new(0,45,0,45)
this.TabHeader.Icon.Position = UDim2.new(0,15,0.5,-22)
end
this.TabHeader.Icon.Title.Text = "Settings"
------ PAGE CUSTOMIZATION -------
this.Page.ZIndex = 5
return this
end
----------- Page Instantiation --------------
PageInstance = Initialize()
return PageInstance
@@ -0,0 +1,489 @@
--[[
Filename: Help.lua
Written by: jeditkacheff
Version 1.0
Description: Takes care of the help page in Settings Menu
--]]
-------------- CONSTANTS --------------
local KEYBOARD_MOUSE_TAG = "KeyboardMouse"
local TOUCH_TAG = "Touch"
local GAMEPAD_TAG = "Gamepad"
local PC_TABLE_SPACING = 4
-------------- SERVICES --------------
local CoreGui = game:GetService("CoreGui")
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
local UserInputService = game:GetService("UserInputService")
local GuiService = game:GetService("GuiService")
----------- UTILITIES --------------
local utility = require(RobloxGui.Modules.Settings.Utility)
------------ Variables -------------------
local PageInstance = nil
RobloxGui:WaitForChild("Modules"):WaitForChild("TenFootInterface")
local isTenFootInterface = require(RobloxGui.Modules.TenFootInterface):IsEnabled()
----------- CLASS DECLARATION --------------
local function Initialize()
local settingsPageFactory = require(RobloxGui.Modules.Settings.SettingsPageFactory)
local this = settingsPageFactory:CreateNewPage()
this.HelpPages = {}
-- TODO: Change dev console script to parent this to somewhere other than an engine created gui
local ControlFrame = RobloxGui:WaitForChild('ControlFrame')
local ToggleDevConsoleBindableFunc = ControlFrame:WaitForChild('ToggleDevConsole')
local lastInputType = nil
function this:GetCurrentInputType()
if lastInputType == nil then -- we don't know what controls the user has, just use reasonable defaults
local platform = UserInputService:GetPlatform()
if platform == Enum.Platform.XBoxOne or platform == Enum.Platform.WiiU then
return GAMEPAD_TAG
elseif platform == Enum.Platform.Windows or platform == Enum.Platform.OSX then
return KEYBOARD_MOUSE_TAG
else
return TOUCH_TAG
end
end
if lastInputType == Enum.UserInputType.Keyboard or lastInputType == Enum.UserInputType.MouseMovement or
lastInputType == Enum.UserInputType.MouseButton1 or lastInputType == Enum.UserInputType.MouseButton2 or
lastInputType == Enum.UserInputType.MouseButton3 or lastInputType == Enum.UserInputType.MouseWheel then
return KEYBOARD_MOUSE_TAG
elseif lastInputType == Enum.UserInputType.Touch then
return TOUCH_TAG
elseif lastInputType == Enum.UserInputType.Gamepad1 or lastInputType == Enum.UserInputType.Gamepad2 or
inputType == Enum.UserInputType.Gamepad3 or lastInputType == Enum.UserInputType.Gamepad4 then
return GAMEPAD_TAG
end
return KEYBOARD_MOUSE_TAG
end
local function createPCHelp(parentFrame)
local function createPCGroup(title, actionInputBindings)
local textIndent = 9
local pcGroupFrame = utility:Create'Frame'
{
Size = UDim2.new(1/3,-PC_TABLE_SPACING,1,0),
BackgroundTransparency = 1,
Name = "PCGroupFrame" .. tostring(title)
};
local pcGroupTitle = utility:Create'TextLabel'
{
Position = UDim2.new(0,textIndent,0,0),
Size = UDim2.new(1,-textIndent,0,30),
BackgroundTransparency = 1,
Text = title,
Font = Enum.Font.SourceSansBold,
FontSize = Enum.FontSize.Size18,
TextColor3 = Color3.new(1,1,1),
TextXAlignment = Enum.TextXAlignment.Left,
Name = "PCGroupTitle" .. tostring(title),
ZIndex = 2,
Parent = pcGroupFrame
};
local count = 0
local frameHeight = 42
local spacing = 2
local offset = pcGroupTitle.Size.Y.Offset
for i = 1, #actionInputBindings do
for actionName, inputName in pairs(actionInputBindings[i]) do
local actionInputFrame = utility:Create'Frame'
{
Size = UDim2.new(1,0,0,frameHeight),
Position = UDim2.new(0,0,0, offset + ((frameHeight + spacing) * count)),
BackgroundTransparency = 0.65,
BorderSizePixel = 0,
ZIndex = 2,
Name = "ActionInputBinding" .. tostring(actionName),
Parent = pcGroupFrame
};
local nameLabel = utility:Create'TextLabel'
{
Size = UDim2.new(0.4,-textIndent,0,frameHeight),
Position = UDim2.new(0,textIndent,0,0),
BackgroundTransparency = 1,
Text = actionName,
Font = Enum.Font.SourceSansBold,
FontSize = Enum.FontSize.Size18,
TextColor3 = Color3.new(1,1,1),
TextXAlignment = Enum.TextXAlignment.Left,
Name = actionName .. "Label",
ZIndex = 2,
Parent = actionInputFrame
};
local inputLabel = utility:Create'TextLabel'
{
Size = UDim2.new(0.6,0,0,frameHeight),
Position = UDim2.new(0.5,-4,0,0),
BackgroundTransparency = 1,
Text = inputName,
Font = Enum.Font.SourceSans,
FontSize = Enum.FontSize.Size18,
TextColor3 = Color3.new(1,1,1),
TextXAlignment = Enum.TextXAlignment.Left,
Name = inputName .. "Label",
ZIndex = 2,
Parent = actionInputFrame
};
count = count + 1
end
end
pcGroupFrame.Size = UDim2.new(pcGroupFrame.Size.X.Scale,pcGroupFrame.Size.X.Offset,
0, offset + ((frameHeight + spacing) * count))
return pcGroupFrame
end
local rowOffset = 50
local isOSX = UserInputService:GetPlatform() == Enum.Platform.OSX
local charMoveFrame = createPCGroup( "Character Movement", {[1] = {["Move Forward"] = "W/Up Arrow"},
[2] = {["Move Backward"] = "S/Down Arrow"},
[3] = {["Move Left"] = "A/Left Arrow"},
[4] = {["Move Right"] = "D/Right Arrow"},
[5] = {["Jump"] = "Space"}} )
charMoveFrame.Parent = parentFrame
local accessoriesFrame = createPCGroup("Accessories", { [1] = {["Equip Tools"] = "1,2,3..."},
[2] = {["Unequip Tools"] = "1,2,3..."},
[3] = {["Drop Tool"] = "Backspace"},
[4] = {["Use Tool"] = "Left Mouse Button"},
[5] = {["Drop Hats"] = "+"} })
accessoriesFrame.Position = UDim2.new(1/3,PC_TABLE_SPACING,0,0)
accessoriesFrame.Parent = parentFrame
local miscFrame = nil
local hideHudSuccess, hideHudFlagValue = pcall(function() return settings():GetFFlag("AllowHideHudShortcut") end)
if (hideHudSuccess and hideHudFlagValue) then
miscFrame = createPCGroup("Misc", { [1] = {["Screenshot"] = "Print Screen"},
[2] = {["Record Video"] = isOSX and "F12/fn + F12" or "F12"},
[3] = {["Hide HUD"] = isOSX and "F7/fn + F7" or "F7"},
[4] = {["Dev Console"] = isOSX and "F9/fn + F9" or "F9"},
[5] = {["Mouselock"] = "Shift"},
[6] = {["Graphics Level"] = isOSX and "F10/fn + F10" or "F10"},
[7] = {["Fullscreen"] = isOSX and "F11/fn + F11" or "F11"} })
else
miscFrame = createPCGroup("Misc", { [1] = {["Screenshot"] = "Print Screen"},
[2] = {["Record Video"] = isOSX and "F12/fn + F12" or "F12"},
[3] = {["Dev Console"] = isOSX and "F9/fn + F9" or "F9"},
[4] = {["Mouselock"] = "Shift"},
[5] = {["Graphics Level"] = isOSX and "F10/fn + F10" or "F10"},
[6] = {["Fullscreen"] = isOSX and "F11/fn + F11" or "F11"} })
end
miscFrame.Position = UDim2.new(2/3,PC_TABLE_SPACING * 2,0,0)
miscFrame.Parent = parentFrame
local camFrame = createPCGroup("Camera Movement", { [1] = {["Rotate"] = "Right Mouse Button"},
[2] = {["Zoom In/Out"] = "Mouse Wheel"},
[3] = {["Zoom In"] = "I"},
[4] = {["Zoom Out"] = "O"} })
camFrame.Position = UDim2.new(0,0,charMoveFrame.Size.Y.Scale,charMoveFrame.Size.Y.Offset + rowOffset)
camFrame.Parent = parentFrame
local menuFrame = createPCGroup("Menu Items", { [1] = {["ROBLOX Menu"] = "ESC"},
[2] = {["Backpack"] = "~"},
[3] = {["Playerlist"] = "TAB"},
[4] = {["Chat"] = "/"} })
menuFrame.Position = UDim2.new(1/3,PC_TABLE_SPACING,charMoveFrame.Size.Y.Scale,charMoveFrame.Size.Y.Offset + rowOffset)
menuFrame.Parent = parentFrame
parentFrame.Size = UDim2.new(parentFrame.Size.X.Scale, parentFrame.Size.X.Offset, 0,
menuFrame.Size.Y.Offset + menuFrame.Position.Y.Offset)
end
local function createGamepadHelp(parentFrame)
local gamepadImage = "rbxasset://textures/ui/Settings/Help/GenericController.png"
local imageSize = UDim2.new(0,650,0,239)
local imagePosition = UDim2.new(0.5,-imageSize.X.Offset/2,0.5,-imageSize.Y.Offset/2)
if UserInputService:GetPlatform() == Enum.Platform.XBoxOne or UserInputService:GetPlatform() == Enum.Platform.XBox360 then
gamepadImage = "rbxasset://textures/ui/Settings/Help/XboxController.png"
imageSize = UDim2.new(0,1334,0,570)
imagePosition = UDim2.new(0.5, (-imageSize.X.Offset/2) - 50, 0.5, -imageSize.Y.Offset/2)
elseif UserInputService:GetPlatform() == Enum.Platform.PS4 or UserInputService:GetPlatform() == Enum.Platform.PS3 then
gamepadImage = "rbxasset://textures/ui/Settings/Help/PSController.png"
end
local gamepadImageLabel = utility:Create'ImageLabel'
{
Name = "GamepadImage",
Size = imageSize,
Position = imagePosition,
Image = gamepadImage,
BackgroundTransparency = 1,
ZIndex = 2,
Parent = parentFrame
};
parentFrame.Size = UDim2.new(parentFrame.Size.X.Scale, parentFrame.Size.X.Offset, 0, gamepadImageLabel.Size.Y.Offset + 100)
local gamepadFontSize = isTenFootInterface and Enum.FontSize.Size36 or Enum.FontSize.Size24
local function createGamepadLabel(text, position, size)
local nameLabel = utility:Create'TextLabel'
{
Position = position,
Size = size,
BackgroundTransparency = 1,
Text = text,
TextXAlignment = Enum.TextXAlignment.Left,
Font = Enum.Font.SourceSansBold,
FontSize = gamepadFontSize,
TextColor3 = Color3.new(1,1,1),
Name = text .. "Label",
ZIndex = 2,
Parent = gamepadImageLabel
};
end
local textVerticalSize = (gamepadFontSize == Enum.FontSize.Size36) and 36 or 24
if gamepadImage == "rbxasset://textures/ui/Settings/Help/XboxController.png" then
createGamepadLabel("Switch Tool", UDim2.new(0,50,0,-textVerticalSize/2), UDim2.new(0,100,0,textVerticalSize))
createGamepadLabel("Game Menu Toggle", UDim2.new(0,-38,0.15,-textVerticalSize/2), UDim2.new(0,164,0,textVerticalSize))
createGamepadLabel("Move", UDim2.new(0,-80,0.31,-textVerticalSize/2), UDim2.new(0,46,0,textVerticalSize))
createGamepadLabel("Menu Navigation", UDim2.new(0,-50,0.46,-textVerticalSize/2), UDim2.new(0,164,0,textVerticalSize))
createGamepadLabel("Use Tool", UDim2.new(0.96,0,0,-textVerticalSize/2), UDim2.new(0,73,0,textVerticalSize))
createGamepadLabel("ROBLOX Menu", UDim2.new(0.96,0,0.15,-textVerticalSize/2), UDim2.new(0,122,0,textVerticalSize))
createGamepadLabel("Back", UDim2.new(0.96,0,0.31,-textVerticalSize/2), UDim2.new(0,43,0,textVerticalSize))
createGamepadLabel("Jump", UDim2.new(0.96,0,0.46,-textVerticalSize/2), UDim2.new(0,49,0,textVerticalSize))
createGamepadLabel("Rotate Camera", UDim2.new(1,0,0.62,-textVerticalSize/2), UDim2.new(0,132,0,textVerticalSize))
createGamepadLabel("Camera Zoom", UDim2.new(1,0,0.77,-textVerticalSize/2), UDim2.new(0,122,0,textVerticalSize))
else
createGamepadLabel("Switch Tool", UDim2.new(-0.01,0,0,-textVerticalSize/2), UDim2.new(0,100,0,textVerticalSize))
createGamepadLabel("Game Menu Toggle", UDim2.new(-0.11,0,0.15,-textVerticalSize/2), UDim2.new(0,164,0,textVerticalSize))
createGamepadLabel("Move", UDim2.new(-0.08,0,0.31,-textVerticalSize/2), UDim2.new(0,46,0,textVerticalSize))
createGamepadLabel("Menu Navigation", UDim2.new(-0.125,0,0.46,-textVerticalSize/2), UDim2.new(0,164,0,textVerticalSize))
createGamepadLabel("Use Tool", UDim2.new(0.96,0,0,-textVerticalSize/2), UDim2.new(0,73,0,textVerticalSize))
createGamepadLabel("ROBLOX Menu", UDim2.new(0.9,0,0.15,-textVerticalSize/2), UDim2.new(0,122,0,textVerticalSize))
createGamepadLabel("Back", UDim2.new(1.01,0,0.31,-textVerticalSize/2), UDim2.new(0,43,0,textVerticalSize))
createGamepadLabel("Jump", UDim2.new(0.91,0,0.46,-textVerticalSize/2), UDim2.new(0,49,0,textVerticalSize))
createGamepadLabel("Rotate Camera", UDim2.new(0.91,0,0.62,-textVerticalSize/2), UDim2.new(0,132,0,textVerticalSize))
createGamepadLabel("Camera Zoom", UDim2.new(0.91,0,0.77,-textVerticalSize/2), UDim2.new(0,122,0,textVerticalSize))
end
-- todo: turn on dev console button when dev console is ready
--[[local openDevConsoleFunc = function()
this.HubRef:SetVisibility(false)
ToggleDevConsoleBindableFunc:Invoke()
end
local devConsoleButton = utility:MakeStyledButton("ConsoleButton", " Toggle Dev Console", UDim2.new(0,300,0,44), openDevConsoleFunc)
devConsoleButton.Size = UDim2.new(devConsoleButton.Size.X.Scale, devConsoleButton.Size.X.Offset, 0, 60)
devConsoleButton.Position = UDim2.new(1,-300,1,30)
if UserInputService.GamepadEnabled and not UserInputService.TouchEnabled and not UserInputService.MouseEnabled and not UserInputService.KeyboardEnabled then
devConsoleButton.ImageTransparency = 1
end
devConsoleButton.Parent = gamepadImageLabel
local aButtonImage = utility:Create'ImageLabel'
{
Name = "AButtonImage",
Size = UDim2.new(0,55,0,55),
Position = UDim2.new(0,5,0.5,-28),
Image = "rbxasset://textures/ui/Settings/Help/AButtonDark.png",
BackgroundTransparency = 1,
ZIndex = 2,
Parent = devConsoleButton
};
this:AddRow(nil, nil, devConsoleButton, 340)]]
end
local function createTouchHelp(parentFrame)
local smallScreen = utility:IsSmallTouchScreen()
local ySize = GuiService:GetScreenResolution().y - 350
if smallScreen then
ySize = GuiService:GetScreenResolution().y - 100
end
parentFrame.Size = UDim2.new(1,0,0,ySize)
local function createTouchLabel(text, position, size, parent)
local nameLabel = utility:Create'TextLabel'
{
Position = position,
Size = size,
BackgroundTransparency = 1,
Text = text,
Font = Enum.Font.SourceSansBold,
FontSize = Enum.FontSize.Size14,
TextColor3 = Color3.new(1,1,1),
Name = text .. "Label",
ZIndex = 2,
Parent = parent
};
if not smallScreen then
nameLabel.FontSize = Enum.FontSize.Size18
nameLabel.Size = UDim2.new(nameLabel.Size.X.Scale, nameLabel.Size.X.Offset, nameLabel.Size.Y.Scale, nameLabel.Size.Y.Offset + 4)
end
local nameBackgroundImage = utility:Create'ImageLabel'
{
Name = text .. "BackgroundImage",
Size = UDim2.new(1,0,1,0),
Position = UDim2.new(0,0,0,2),
BackgroundTransparency = 1,
Image = "rbxasset://textures/ui/Settings/Radial/RadialLabel.png",
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(12,2,65,21),
ZIndex = 2,
Parent = nameLabel
};
return nameLabel
end
local function createTouchGestureImage(name, image, position, size, parent)
local gestureImage = utility:Create'ImageLabel'
{
Name = name,
Size = size,
Position = position,
BackgroundTransparency = 1,
Image = image,
ZIndex = 2,
Parent = parent
};
return gestureImage
end
local xSizeOffset = 30
local ySize = 25
if smallScreen then xSizeOffset = 0 end
local moveLabel = createTouchLabel("Move", UDim2.new(0.06,0,0.58,0), UDim2.new(0,77 + xSizeOffset,0,ySize), parentFrame)
if not smallScreen then moveLabel.Position = UDim2.new(-0.03,0,0.7,0) end
local jumpLabel = createTouchLabel("Jump", UDim2.new(0.8,0,0.58,0), UDim2.new(0,77 + xSizeOffset,0,ySize), parentFrame)
if not smallScreen then jumpLabel.Position = UDim2.new(0.85,0,0.7,0) end
local equipLabel = createTouchLabel("Equip/Unequip Tools", UDim2.new(0.5,-60,0.64,0), UDim2.new(0,120 + xSizeOffset,0,ySize), parentFrame)
if not smallScreen then equipLabel.Position = UDim2.new(0.5,-60,0.95,0) end
local zoomLabel = createTouchLabel("Zoom In/Out", UDim2.new(0.15,-60,0.02,0), UDim2.new(0,120,0,ySize), parentFrame)
createTouchGestureImage("ZoomImage", "rbxasset://textures/ui/Settings/Help/ZoomGesture.png", UDim2.new(0.5,-26,1,3), UDim2.new(0,53,0,59), zoomLabel)
local rotateLabel = createTouchLabel("Rotate Camera", UDim2.new(0.5,-60,0.02,0), UDim2.new(0,120,0,ySize), parentFrame)
createTouchGestureImage("RotateImage", "rbxasset://textures/ui/Settings/Help/RotateCameraGesture.png", UDim2.new(0.5,-32,1,3), UDim2.new(0,65,0,48), rotateLabel)
local useToolLabel = createTouchLabel("Use Tool", UDim2.new(0.85,-60,0.02,0), UDim2.new(0,120,0,ySize), parentFrame)
createTouchGestureImage("ToolImage", "rbxasset://textures/ui/Settings/Help/UseToolGesture.png", UDim2.new(0.5,-19,1,3), UDim2.new(0,38,0,52), useToolLabel)
end
local function createHelpDisplay(typeOfHelp)
local helpFrame = utility:Create'Frame'
{
Size = UDim2.new(1,0,1,0),
BackgroundTransparency = 1,
Name = "HelpFrame" .. tostring(typeOfHelp)
};
if typeOfHelp == KEYBOARD_MOUSE_TAG then
createPCHelp(helpFrame)
elseif typeOfHelp == GAMEPAD_TAG then
createGamepadHelp(helpFrame)
elseif typeOfHelp == TOUCH_TAG then
createTouchHelp(helpFrame)
end
return helpFrame
end
local function displayHelp(currentPage)
for i, helpPage in pairs(this.HelpPages) do
if helpPage == currentPage then
helpPage.Parent = this.Page
this.Page.Size = helpPage.Size
else
helpPage.Parent = nil
end
end
if UserInputService:GetPlatform() == Enum.Platform.XBoxOne then
this.HubRef.PageViewClipper.ClipsDescendants = false
this.HubRef.PageView.ClipsDescendants = false
end
end
local function switchToHelp(typeOfHelp)
local helpPage = this.HelpPages[typeOfHelp]
if helpPage then
displayHelp(helpPage)
else
this.HelpPages[typeOfHelp] = createHelpDisplay(typeOfHelp)
switchToHelp(typeOfHelp)
end
end
local function showTypeOfHelp()
switchToHelp(this:GetCurrentInputType())
end
------ TAB CUSTOMIZATION -------
this.TabHeader.Name = "HelpTab"
this.TabHeader.Icon.Image = "rbxasset://textures/ui/Settings/MenuBarIcons/HelpTab.png"
if utility:IsSmallTouchScreen() then
this.TabHeader.Icon.Size = UDim2.new(0,33,0,33)
this.TabHeader.Icon.Position = UDim2.new(this.TabHeader.Icon.Position.X.Scale,this.TabHeader.Icon.Position.X.Offset,0.5,-16)
this.TabHeader.Size = UDim2.new(0,100,1,0)
elseif isTenFootInterface then
this.TabHeader.Icon.Image = "rbxasset://textures/ui/Settings/MenuBarIcons/HelpTab@2x.png"
this.TabHeader.Icon.Size = UDim2.new(0,90,0,90)
this.TabHeader.Icon.Position = UDim2.new(0,0,0.5,-43)
this.TabHeader.Size = UDim2.new(0,210,1,0)
else
this.TabHeader.Icon.Size = UDim2.new(0,44,0,44)
this.TabHeader.Icon.Position = UDim2.new(this.TabHeader.Icon.Position.X.Scale,this.TabHeader.Icon.Position.X.Offset,0.5,-22)
this.TabHeader.Size = UDim2.new(0,130,1,0)
end
this.TabHeader.Icon.Title.Text = "Help"
------ PAGE CUSTOMIZATION -------
this.Page.Name = "Help"
UserInputService.InputBegan:connect(function(inputObject)
local inputType = inputObject.UserInputType
if inputType ~= Enum.UserInputType.Focus and inputType ~= Enum.UserInputType.None then
lastInputType = inputObject.UserInputType
showTypeOfHelp()
end
end)
return this
end
----------- Public Facing API Additions --------------
do
PageInstance = Initialize()
PageInstance.Displayed.Event:connect(function()
if PageInstance:GetCurrentInputType() == TOUCH_TAG then
if PageInstance.HubRef.BottomButtonFrame and not utility:IsSmallTouchScreen() then
PageInstance.HubRef.BottomButtonFrame.Visible = false
end
end
end)
PageInstance.Hidden.Event:connect(function()
PageInstance.HubRef.PageViewClipper.ClipsDescendants = true
PageInstance.HubRef.PageView.ClipsDescendants = true
PageInstance.HubRef:ShowShield()
if PageInstance:GetCurrentInputType() == TOUCH_TAG then
PageInstance.HubRef.BottomButtonFrame.Visible = true
end
end)
end
return PageInstance
@@ -0,0 +1,124 @@
--[[
Filename: LeaveGame.lua
Written by: jeditkacheff
Version 1.0
Description: Takes care of the leave game in Settings Menu
--]]
-------------- CONSTANTS -------------
local LEAVE_GAME_ACTION = "LeaveGameCancelAction"
-------------- SERVICES --------------
local CoreGui = game:GetService("CoreGui")
local ContextActionService = game:GetService("ContextActionService")
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
local GuiService = game:GetService("GuiService")
----------- UTILITIES --------------
local utility = require(RobloxGui.Modules.Settings.Utility)
------------ Variables -------------------
local PageInstance = nil
RobloxGui:WaitForChild("Modules"):WaitForChild("TenFootInterface")
local isTenFootInterface = require(RobloxGui.Modules.TenFootInterface):IsEnabled()
----------- CLASS DECLARATION --------------
local function Initialize()
local settingsPageFactory = require(RobloxGui.Modules.Settings.SettingsPageFactory)
local this = settingsPageFactory:CreateNewPage()
this.DontLeaveFunc = function(isUsingGamepad)
if this.HubRef then
this.HubRef:PopMenu(isUsingGamepad, true)
end
end
this.DontLeaveFromHotkey = function(name, state, input)
if state == Enum.UserInputState.Begin then
local isUsingGamepad = input.UserInputType == Enum.UserInputType.Gamepad1 or input.UserInputType == Enum.UserInputType.Gamepad2
or input.UserInputType == Enum.UserInputType.Gamepad3 or input.UserInputType == Enum.UserInputType.Gamepad4
this.DontLeaveFunc(isUsingGamepad)
end
end
this.DontLeaveFromButton = function(isUsingGamepad)
this.DontLeaveFunc(isUsingGamepad)
end
------ TAB CUSTOMIZATION -------
this.TabHeader = nil -- no tab for this page
------ PAGE CUSTOMIZATION -------
this.Page.Name = "LeaveGamePage"
local leaveGameText = utility:Create'TextLabel'
{
Name = "LeaveGameText",
Text = "Are you sure you want to leave the game?",
Font = Enum.Font.SourceSansBold,
FontSize = Enum.FontSize.Size36,
TextColor3 = Color3.new(1,1,1),
BackgroundTransparency = 1,
Size = UDim2.new(1,0,0,200),
TextWrapped = true,
ZIndex = 2,
Parent = this.Page
};
if utility:IsSmallTouchScreen() then
leaveGameText.FontSize = Enum.FontSize.Size24
leaveGameText.Size = UDim2.new(1,0,0,100)
elseif isTenFootInterface then
leaveGameText.FontSize = Enum.FontSize.Size48
end
local buttonSpacing = 20
local buttonSize = UDim2.new(0, 200, 0, 50)
if isTenFootInterface then
leaveGameText.Position = UDim2.new(0,0,0,100)
buttonSize = UDim2.new(0, 300, 0, 80)
end
this.LeaveGameButton = utility:MakeStyledButton("LeaveGame", "Leave", buttonSize)
this.LeaveGameButton.NextSelectionRight = nil
this.LeaveGameButton:SetVerb("Exit")
if utility:IsSmallTouchScreen() then
this.LeaveGameButton.Position = UDim2.new(0.5, -buttonSize.X.Offset - buttonSpacing, 1, 0)
else
this.LeaveGameButton.Position = UDim2.new(0.5, -buttonSize.X.Offset - buttonSpacing, 1, -30)
end
this.LeaveGameButton.Parent = leaveGameText
------------- Init ----------------------------------
local dontleaveGameButton = utility:MakeStyledButton("DontLeaveGame", "Don't Leave", buttonSize, this.DontLeaveFromButton)
dontleaveGameButton.NextSelectionLeft = nil
if utility:IsSmallTouchScreen() then
dontleaveGameButton.Position = UDim2.new(0.5, buttonSpacing, 1, 0)
else
dontleaveGameButton.Position = UDim2.new(0.5, buttonSpacing, 1, -30)
end
dontleaveGameButton.Parent = leaveGameText
this.Page.Size = UDim2.new(1,0,0,dontleaveGameButton.AbsolutePosition.Y + dontleaveGameButton.AbsoluteSize.Y)
return this
end
----------- Public Facing API Additions --------------
PageInstance = Initialize()
PageInstance.Displayed.Event:connect(function()
GuiService.SelectedCoreObject = PageInstance.LeaveGameButton
ContextActionService:BindCoreAction(LEAVE_GAME_ACTION, PageInstance.DontLeaveFromHotkey, false, Enum.KeyCode.ButtonB)
end)
PageInstance.Hidden.Event:connect(function()
ContextActionService:UnbindCoreAction(LEAVE_GAME_ACTION)
end)
return PageInstance
@@ -0,0 +1,170 @@
--[[r
Filename: Record.lua
Written by: jeditkacheff
Version 1.0
Description: Takes care of the Record Tab in Settings Menu
--]]
-------------- SERVICES --------------
local CoreGui = game:GetService("CoreGui")
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
local GuiService = game:GetService("GuiService")
local Settings = UserSettings()
local GameSettings = Settings.GameSettings
----------- UTILITIES --------------
RobloxGui:WaitForChild("Modules"):WaitForChild("TenFootInterface")
local utility = require(RobloxGui.Modules.Settings.Utility)
local isTenFootInterface = require(RobloxGui.Modules.TenFootInterface):IsEnabled()
------------ Variables -------------------
local PageInstance = nil
----------- CLASS DECLARATION --------------
local function Initialize()
local settingsPageFactory = require(RobloxGui.Modules.Settings.SettingsPageFactory)
local this = settingsPageFactory:CreateNewPage()
local isRecordingVideo = false
local recordingEvent = Instance.new("BindableEvent")
recordingEvent.Name = "RecordingEvent"
this.RecordingChanged = recordingEvent.Event
function this:IsRecording()
return isRecordingVideo
end
------ TAB CUSTOMIZATION -------
this.TabHeader.Name = "RecordTab"
this.TabHeader.Icon.Image = "rbxasset://textures/ui/Settings/MenuBarIcons/RecordTab.png"
this.TabHeader.Icon.Size = UDim2.new(0,41,0,40)
this.TabHeader.Icon.Position = UDim2.new(0,5,0.5,-20)
this.TabHeader.Icon.Title.Text = "Record"
this.TabHeader.Size = UDim2.new(0,130,1,0)
------ PAGE CUSTOMIZATION -------
this.Page.Name = "Record"
local function makeTextLabel(name, text, bold, size, pos, parent)
local textLabel = utility:Create'TextLabel'
{
Name = name,
BackgroundTransparency = 1,
Text = text,
TextWrapped = true,
Font = Enum.Font.SourceSans,
FontSize = Enum.FontSize.Size24,
TextColor3 = Color3.new(1,1,1),
Size = size,
Position = pos,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Top,
ZIndex = 2,
Parent = parent
};
if bold then textLabel.Font = Enum.Font.SourceSansBold end
return textLabel
end
-- need to override this function from SettingsPageFactory
-- DropDown menus require hub to to be set when they are initialized
function this:SetHub(newHubRef)
this.HubRef = newHubRef
local recordEnumNames = {}
recordEnumNames[1] = "Save To Disk"
recordEnumNames[2] = "Upload to YouTube"
local startSetting = 2
if GameSettings.VideoUploadPromptBehavior == Enum.UploadSetting["Never"] then
startSetting = 1
end
---------------------------------- SCREENSHOT -------------------------------------
local screenshotTitle = makeTextLabel("ScreenshotTitle",
"Screenshot",
true, UDim2.new(1,0,0,36), UDim2.new(0,10,0.05,0), this.Page)
screenshotTitle.FontSize = Enum.FontSize.Size36
local screenshotBody = makeTextLabel("ScreenshotBody",
"By clicking the 'Take Screenshot' button, the menu will close and take a screenshot and save it to your computer.",
false, UDim2.new(1,-10,0,70), UDim2.new(0,0,1,0), screenshotTitle)
local closeSettingsFunc = function()
this.HubRef:SetVisibility(false, true)
end
this.ScreenshotButton = utility:MakeStyledButton("ScreenshotButton", "Take Screenshot", UDim2.new(0,300,0,44), closeSettingsFunc, this)
this.ScreenshotButton.Position = UDim2.new(0,400,1,0)
this.ScreenshotButton.Parent = screenshotBody
---------------------------------- VIDEO -------------------------------------
local videoTitle = makeTextLabel("VideoTitle",
"Video",
true, UDim2.new(1,0,0,36), UDim2.new(0,10,0.5,0), this.Page)
videoTitle.FontSize = Enum.FontSize.Size36
local videoBody = makeTextLabel("VideoBody",
"By clicking the 'Record Video' button, the menu will close and start recording your screen.",
false, UDim2.new(1,-10,0,70), UDim2.new(0,0,1,0), videoTitle)
this.VideoSettingsFrame,
this.VideoSettingsLabel,
this.VideoSettingsMode = utility:AddNewRow(this, "Video Settings", "Selector", recordEnumNames, startSetting, 270)
this.VideoSettingsMode.IndexChanged:connect(function(newIndex)
if newIndex == 1 then
GameSettings.VideoUploadPromptBehavior = Enum.UploadSetting.Never
elseif newIndex == 2 then
GameSettings.VideoUploadPromptBehavior = Enum.UploadSetting.Always
end
end)
local recordButton = utility:MakeStyledButton("RecordButton", "Record Video", UDim2.new(0,300,0,44), closeSettingsFunc, this)
recordButton.Position = UDim2.new(0,410,1,10)
recordButton.Parent = this.VideoSettingsMode.SelectorFrame.Parent
recordButton.MouseButton1Click:connect(function()
recordingEvent:Fire(not isRecordingVideo)
end)
local gameOptions = settings():FindFirstChild("Game Options")
if gameOptions then
gameOptions.VideoRecordingChangeRequest:connect(function(recording)
isRecordingVideo = recording
if recording then
recordButton.RecordButtonTextLabel.Text = "Stop Recording"
else
recordButton.RecordButtonTextLabel.Text = "Record Video"
end
end)
end
recordButton:SetVerb("RecordToggle")
this.ScreenshotButton:SetVerb("Screenshot")
this.Page.Size = UDim2.new(1,0,0,400)
end
return this
end
----------- Public Facing API Additions --------------
PageInstance = Initialize()
PageInstance.Displayed.Event:connect(function(switchedFromGamepadInput)
if switchedFromGamepadInput then
GuiService.SelectedCoreObject = PageInstance.ScreenshotButton
end
end)
return PageInstance
@@ -0,0 +1,311 @@
--[[
Filename: ReportAbuseMenu.lua
Written by: jeditkacheff
Version 1.0
Description: Takes care of the report abuse page in Settings Menu
--]]
-------------- SERVICES --------------
local CoreGui = game:GetService("CoreGui")
local RobloxGui = CoreGui:WaitForChild("RobloxGui")
local GuiService = game:GetService("GuiService")
local PlayersService = game:GetService("Players")
----------- UTILITIES --------------
local utility = require(RobloxGui.Modules.Settings.Utility)
------------ CONSTANTS -------------------
local ABUSE_TYPES_PLAYER = {
"Swearing",
"Inappropriate Username",
"Bullying",
"Scamming",
"Dating",
"Cheating/Exploiting",
"Personal Question",
"Offsite Links",
}
local ABUSE_TYPES_GAME = {
"Inappropriate Content",
"Bad Model or Script",
"Offsite Link",
}
local DEFAULT_ABUSE_DESC_TEXT = " Short Description (Optional)"
if utility:IsSmallTouchScreen() then
DEFAULT_ABUSE_DESC_TEXT = " (Optional)"
end
------------ VARIABLES -------------------
local PageInstance = nil
----------- CLASS DECLARATION --------------
local function Initialize()
local settingsPageFactory = require(RobloxGui.Modules.Settings.SettingsPageFactory)
local this = settingsPageFactory:CreateNewPage()
local playerNames = {}
local nameToRbxPlayer = {}
function this:GetPlayerFromIndex(index)
local playerName = playerNames[index]
if playerName then
return nameToRbxPlayer[nameToRbxPlayer]
end
return nil
end
function this:UpdatePlayerDropDown()
playerNames = {}
nameToRbxPlayer = {}
local players = PlayersService:GetPlayers()
local index = 1
for i = 1, #players do
local player = players[i]
if player ~= PlayersService.LocalPlayer and player.UserId > 0 then
playerNames[index] = player.Name
nameToRbxPlayer[player.Name] = player
index = index + 1
end
end
this.WhichPlayerMode:UpdateDropDownList(playerNames)
if index == 1 then
this.GameOrPlayerMode:SetSelectionIndex(1)
this.TypeOfAbuseMode:UpdateDropDownList(ABUSE_TYPES_GAME)
end
this.WhichPlayerMode:SetInteractable(index > 1 and this.GameOrPlayerMode.CurrentIndex ~= 1)
this.GameOrPlayerMode:SetInteractable(index > 1)
end
------ TAB CUSTOMIZATION -------
this.TabHeader.Name = "ReportAbuseTab"
this.TabHeader.Icon.Image = "rbxasset://textures/ui/Settings/MenuBarIcons/ReportAbuseTab.png"
if utility:IsSmallTouchScreen() then
this.TabHeader.Icon.Size = UDim2.new(0,27,0,32)
this.TabHeader.Size = UDim2.new(0,120,1,0)
else
this.TabHeader.Size = UDim2.new(0,150,1,0)
this.TabHeader.Icon.Size = UDim2.new(0,36,0,43)
end
this.TabHeader.Icon.Position = UDim2.new(this.TabHeader.Icon.Position.X.Scale, this.TabHeader.Icon.Position.X.Offset + 10, 0.5,-this.TabHeader.Icon.Size.Y.Offset/2)
this.TabHeader.Icon.Title.Text = "Report"
------ PAGE CUSTOMIZATION -------
this.Page.Name = "ReportAbusePage"
-- need to override this function from SettingsPageFactory
-- DropDown menus require hub to to be set when they are initialized
function this:SetHub(newHubRef)
this.HubRef = newHubRef
if utility:IsSmallTouchScreen() then
this.GameOrPlayerFrame,
this.GameOrPlayerLabel,
this.GameOrPlayerMode = utility:AddNewRow(this, "Game or Player?", "Selector", {"Game", "Player"}, 1)
else
this.GameOrPlayerFrame,
this.GameOrPlayerLabel,
this.GameOrPlayerMode = utility:AddNewRow(this, "Game or Player?", "Selector", {"Game", "Player"}, 1, 3)
end
this.WhichPlayerFrame,
this.WhichPlayerLabel,
this.WhichPlayerMode = utility:AddNewRow(this, "Which Player?", "DropDown", {"update me"})
this.WhichPlayerMode:SetInteractable(false)
this.WhichPlayerLabel.ZIndex = 1
this.TypeOfAbuseFrame,
this.TypeOfAbuseLabel,
this.TypeOfAbuseMode = utility:AddNewRow(this, "Type Of Abuse", "DropDown", ABUSE_TYPES_GAME)
if utility:IsSmallTouchScreen() then
this.AbuseDescriptionFrame,
this.AbuseDescriptionLabel,
this.AbuseDescription = utility:AddNewRow(this, DEFAULT_ABUSE_DESC_TEXT, "TextBox", nil, nil)
else
this.AbuseDescriptionFrame,
this.AbuseDescriptionLabel,
this.AbuseDescription = utility:AddNewRow(this, DEFAULT_ABUSE_DESC_TEXT, "TextBox", nil, nil, 5)
end
if utility:IsSmallTouchScreen() then
this.AbuseDescription.Selection.Size = UDim2.new(0, 290, 0, 30)
this.AbuseDescription.Selection.Position = UDim2.new(1,-345,this.AbuseDescription.Selection.Position.Y.Scale, this.AbuseDescription.Selection.Position.Y.Offset)
this.AbuseDescriptionLabel = this.TypeOfAbuseLabel:clone()
this.AbuseDescriptionLabel.Text = "Abuse Description"
this.AbuseDescriptionLabel.Position = UDim2.new(this.AbuseDescriptionLabel.Position.X.Scale, this.AbuseDescriptionLabel.Position.X.Offset,
0,50)
this.AbuseDescriptionLabel.Parent = this.Page
end
local SelectionOverrideObject = utility:Create'ImageLabel'
{
Image = "",
BackgroundTransparency = 1
};
local submitButton, submitText = nil, nil
local function makeSubmitButtonActive()
submitButton.ZIndex = 2
submitButton.Selectable = true
submitText.ZIndex = 2
end
local function makeSubmitButtonInactive()
submitButton.ZIndex = 1
submitButton.Selectable = false
submitText.ZIndex = 1
end
local function updateAbuseDropDown()
this.WhichPlayerMode:ResetSelectionIndex()
this.TypeOfAbuseMode:ResetSelectionIndex()
if this.GameOrPlayerMode.CurrentIndex == 1 then
this.TypeOfAbuseMode:UpdateDropDownList(ABUSE_TYPES_GAME)
this.WhichPlayerMode:SetInteractable(false)
this.WhichPlayerLabel.ZIndex = 1
this.GameOrPlayerMode.SelectorFrame.NextSelectionDown = this.TypeOfAbuseMode.DropDownFrame
else
this.TypeOfAbuseMode:UpdateDropDownList(ABUSE_TYPES_PLAYER)
this.WhichPlayerMode:SetInteractable(true)
this.WhichPlayerLabel.ZIndex = 2
this.GameOrPlayerMode.SelectorFrame.NextSelectionDown = this.WhichPlayerMode.DropDownFrame
end
makeSubmitButtonInactive()
end
local function cleanupReportAbuseMenu()
updateAbuseDropDown()
this.AbuseDescription.Selection.Text = DEFAULT_ABUSE_DESC_TEXT
this.HubRef:SetVisibility(false, true)
end
local function onReportSubmitted()
local abuseReason = nil
if this.GameOrPlayerMode.CurrentIndex == 2 then
abuseReason = ABUSE_TYPES_PLAYER[this.TypeOfAbuseMode.CurrentIndex]
local currentAbusingPlayer = this:GetPlayerFromIndex(this.WhichPlayerMode.CurrentIndex)
if currentAbusingPlayer and abuseReason then
spawn(function()
game.Players:ReportAbuse(currentAbusingPlayer, abuseReason, this.AbuseDescription.Selection.Text)
end)
end
else
abuseReason = ABUSE_TYPES_GAME[this.TypeOfAbuseMode.CurrentIndex]
if abuseReason then
spawn(function()
game.Players:ReportAbuse(nil, abuseReason, this.AbuseDescription.Selection.Text)
end)
end
end
if abuseReason then
local alertText = "Thanks for your report! Our moderators will review the chat logs and evaluate what happened."
if abuseReason == 'Cheating/Exploiting' then
alertText = "Thanks for your report! We've recorded your report for evaluation."
elseif abuseReason == 'Inappropriate Username' then
alertText = "Thanks for your report! Our moderators will evaluate the username."
elseif abuseReason == "Bad Model or Script" or abuseReason == "Inappropriate Content" or abuseReason == "Offsite Link" or abuseReason == "Offsite Links" then
alertText = "Thanks for your report! Our moderators will review the place and make a determination."
end
utility:ShowAlert(alertText, "Ok", this.HubRef, cleanupReportAbuseMenu)
this.LastSelectedObject = nil
end
end
submitButton, submitText = utility:MakeStyledButton("SubmitButton", "Submit", UDim2.new(0,198,0,50), onReportSubmitted, this)
if utility:IsSmallTouchScreen() then
submitButton.Position = UDim2.new(1,-220,1,5)
else
submitButton.Position = UDim2.new(1,-194,1,5)
end
submitButton.Selectable = false
submitButton.ZIndex = 1
submitText.ZIndex = 1
submitButton.Parent = this.AbuseDescription.Selection
local function playerSelectionChanged(newIndex)
if newIndex ~= nil and this.TypeOfAbuseMode:GetSelectedIndex() ~= nil then
makeSubmitButtonActive()
else
makeSubmitButtonInactive()
end
end
this.WhichPlayerMode.IndexChanged:connect(playerSelectionChanged)
local function typeOfAbuseChanged(newIndex)
if newIndex ~= nil then
if this.GameOrPlayerMode.CurrentIndex == 1 or this.WhichPlayerMode:GetSelectedIndex() ~= nil then
makeSubmitButtonActive()
else
makeSubmitButtonInactive()
end
else
makeSubmitButtonInactive()
end
end
this.TypeOfAbuseMode.IndexChanged:connect(typeOfAbuseChanged)
this.GameOrPlayerMode.IndexChanged:connect(updateAbuseDropDown)
this:AddRow(nil, nil, this.AbuseDescription)
this.Page.Size = UDim2.new(1,0,0,submitButton.AbsolutePosition.Y + submitButton.AbsoluteSize.Y)
end
return this
end
----------- Public Facing API Additions --------------
do
PageInstance = Initialize()
PageInstance.Displayed.Event:connect(function()
PageInstance:UpdatePlayerDropDown()
end)
function PageInstance:ReportPlayer(player)
if player then
local setReportPlayerConnection = nil
setReportPlayerConnection = PageInstance.Displayed.Event:connect(function()
-- When we change the SelectionIndex of GameOrPlayerMode it waits until the tween is done
-- before it fires the IndexChanged signal. The WhichPlayerMode dropdown listens to this signal
-- and resets when it is fired. Therefore we need to listen to this signal and set the player we want
-- to report the frame after the dropdown is reset
local indexChangedConnection = nil
indexChangedConnection = PageInstance.GameOrPlayerMode.IndexChanged:connect(function()
if indexChangedConnection then
indexChangedConnection:disconnect()
indexChangedConnection = nil
end
PageInstance.WhichPlayerMode:SetSelectionByValue(player.Name)
end)
PageInstance.GameOrPlayerMode:SetSelectionIndex(2)
if setReportPlayerConnection then
setReportPlayerConnection:disconnect()
setReportPlayerConnection = nil
end
end)
PageInstance.HubRef:SetVisibility(true, false, PageInstance)
end
end
end
return PageInstance