2574 lines
63 KiB
Plaintext
2574 lines
63 KiB
Plaintext
--!strict
|
|
-- CoreGui.RobloxGui.CoreScripts/Settings
|
|
print "[Mercury]: Loaded corescript 46295863"
|
|
|
|
local News = require "../Modules/New"
|
|
local New = News.New
|
|
local Hydrate = News.Hydrate
|
|
|
|
local CoreGui = game:GetService "CoreGui"
|
|
local GuiService = game:GetService "GuiService"
|
|
local Players = game:GetService "Players"
|
|
|
|
local function waitForChild(instance, name)
|
|
while not instance:FindFirstChild(name) do
|
|
instance.ChildAdded:wait()
|
|
end
|
|
end
|
|
|
|
local function waitForProperty(instance, property)
|
|
while not instance[property] do
|
|
instance.Changed:wait()
|
|
end
|
|
end
|
|
|
|
-- A Few Script Globals
|
|
local mercuryGui = script.Parent :: ScreenGui & { ControlFrame: Frame }
|
|
local gui = mercuryGui:FindFirstChild "ControlFrame" and mercuryGui.ControlFrame
|
|
or mercuryGui
|
|
|
|
local RbxGui
|
|
local helpButton, updateCameraDropDownSelection, updateVideoCaptureDropDownSelection
|
|
local tweenTime = 0.2
|
|
|
|
local mouseLockLookScreenUrl = "http://banland.xyz/asset?id=54071825"
|
|
local classicLookScreenUrl = "http://banland.xyz/asset?id=45915798"
|
|
|
|
local hasGraphicsSlider = true
|
|
local GraphicsQualityLevels = 10 -- how many levels we allow on graphics slider
|
|
local recordingVideo = false
|
|
|
|
local currentMenuSelection
|
|
local lastMenuSelection = {}
|
|
|
|
-- local defaultPosition = UDim2.new(0, 0, 0, 0)
|
|
-- local newGuiPlaces = { 0, 41324860 }
|
|
|
|
local centerDialogs = {}
|
|
local mainShield
|
|
|
|
local inStudioMode = UserSettings().GameSettings:InStudioMode()
|
|
|
|
local macClient = false
|
|
local ok, isMac = pcall(function()
|
|
return not game.GuiService.IsWindows
|
|
end)
|
|
macClient = ok and isMac
|
|
|
|
local function Colour3(r: number, g: number, b: number)
|
|
return Color3.new(r / 255, g / 255, b / 255)
|
|
end
|
|
|
|
local function robloxLock(instance)
|
|
instance.RobloxLocked = true
|
|
local children = instance:GetChildren()
|
|
if children then
|
|
for _, child in ipairs(children) do
|
|
robloxLock(child)
|
|
end
|
|
end
|
|
end
|
|
|
|
local settingsButton
|
|
|
|
local function resumeGameFunction(shield)
|
|
shield.Settings:TweenPosition(
|
|
UDim2.new(0.5, -262, -0.5, -200),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
delay(tweenTime, function()
|
|
shield.Visible = false
|
|
for i = 1, #centerDialogs do
|
|
centerDialogs[i].Visible = false
|
|
game.GuiService:RemoveCenterDialog(centerDialogs[i])
|
|
end
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
settingsButton.Active = true
|
|
currentMenuSelection = nil
|
|
lastMenuSelection = {}
|
|
end)
|
|
end
|
|
|
|
local function goToMenu(container, menuName, moveDirection, size, position)
|
|
if type(menuName) ~= "string" then
|
|
return
|
|
end
|
|
|
|
table.insert(lastMenuSelection, currentMenuSelection)
|
|
if menuName == "GameMainMenu" then
|
|
lastMenuSelection = {}
|
|
end
|
|
|
|
local containerChildren = container:GetChildren()
|
|
for i = 1, #containerChildren do
|
|
if containerChildren[i].Name == menuName then
|
|
containerChildren[i].Visible = true
|
|
currentMenuSelection = {
|
|
container = container,
|
|
name = menuName,
|
|
direction = moveDirection,
|
|
lastSize = size,
|
|
}
|
|
-- selectedMenu = true
|
|
if size and position then
|
|
containerChildren[i]:TweenSizeAndPosition(
|
|
size,
|
|
position,
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
elseif size then
|
|
containerChildren[i]:TweenSizeAndPosition(
|
|
size,
|
|
UDim2.new(0.5, -size.X.Offset / 2, 0.5, -size.Y.Offset / 2),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
else
|
|
containerChildren[i]:TweenPosition(
|
|
UDim2.new(0, 0, 0, 0),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
end
|
|
else
|
|
if moveDirection == "left" then
|
|
containerChildren[i]:TweenPosition(
|
|
UDim2.new(-1, -525, 0, 0),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
elseif moveDirection == "right" then
|
|
containerChildren[i]:TweenPosition(
|
|
UDim2.new(1, 525, 0, 0),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
elseif moveDirection == "up" then
|
|
containerChildren[i]:TweenPosition(
|
|
UDim2.new(0, 0, -1, -400),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
elseif moveDirection == "down" then
|
|
containerChildren[i]:TweenPosition(
|
|
UDim2.new(0, 0, 1, 400),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
end
|
|
delay(tweenTime, function()
|
|
containerChildren[i].Visible = false
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function resetLocalCharacter()
|
|
local player = game.Players.LocalPlayer
|
|
if player and player.Character then
|
|
local humanoid = (player.Character:FindFirstChild "Humanoid") :: Humanoid
|
|
if humanoid then
|
|
humanoid.Health = 0
|
|
end
|
|
end
|
|
end
|
|
|
|
local function createTextButton(
|
|
text: string,
|
|
style: EnumItem,
|
|
fontSize: EnumItem,
|
|
buttonSize: UDim2,
|
|
buttonPosition: UDim2
|
|
)
|
|
return New "TextButton" {
|
|
Font = Enum.Font.Arial,
|
|
FontSize = fontSize,
|
|
Size = buttonSize,
|
|
Position = buttonPosition,
|
|
Style = style,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Text = text,
|
|
}
|
|
end
|
|
|
|
local function CreateTextButtons(frame, buttons, yPos, ySize)
|
|
if #buttons < 1 then
|
|
error "Must have more than one button"
|
|
end
|
|
|
|
local buttonNum = 1
|
|
local buttonObjs = {}
|
|
|
|
local function toggleSelection(button)
|
|
for _, obj in ipairs(buttonObjs) do
|
|
if obj == button then
|
|
obj.Style = Enum.ButtonStyle.RobloxButtonDefault
|
|
else
|
|
obj.Style = Enum.ButtonStyle.RobloxButton
|
|
end
|
|
end
|
|
end
|
|
|
|
for _, obj in ipairs(buttons) do
|
|
local button = New "TextButton" {
|
|
Name = "Button" .. buttonNum,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
AutoButtonColor = true,
|
|
Style = Enum.ButtonStyle.RobloxButton,
|
|
Text = obj.Text,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
}
|
|
button.MouseButton1Click:connect(function()
|
|
toggleSelection(button)
|
|
obj.Function()
|
|
end)
|
|
button.Parent = frame
|
|
buttonObjs[buttonNum] = button
|
|
|
|
buttonNum += 1
|
|
end
|
|
|
|
toggleSelection(buttonObjs[1])
|
|
|
|
local numButtons = buttonNum - 1
|
|
|
|
if numButtons == 1 then
|
|
frame.Button1.Position = UDim2.new(0.35, 0, yPos.Scale, yPos.Offset)
|
|
frame.Button1.Size = UDim2.new(0.4, 0, ySize.Scale, ySize.Offset)
|
|
elseif numButtons == 2 then
|
|
frame.Button1.Position = UDim2.new(0.1, 0, yPos.Scale, yPos.Offset)
|
|
frame.Button1.Size = UDim2.new(0.35, 0, ySize.Scale, ySize.Offset)
|
|
|
|
frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset)
|
|
frame.Button2.Size = UDim2.new(0.35, 0, ySize.Scale, ySize.Offset)
|
|
elseif numButtons >= 3 then
|
|
local spacing = 0.1 / numButtons
|
|
local buttonSize = 0.9 / numButtons
|
|
|
|
buttonNum = 1
|
|
while buttonNum <= numButtons do
|
|
buttonObjs[buttonNum].Position = UDim2.new(
|
|
spacing * buttonNum + (buttonNum - 1) * buttonSize,
|
|
0,
|
|
yPos.Scale,
|
|
yPos.Offset
|
|
)
|
|
buttonObjs[buttonNum].Size =
|
|
UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset)
|
|
buttonNum += 1
|
|
end
|
|
end
|
|
end
|
|
|
|
local function setRecordGui(recording, stopRecordButton, recordVideoButton)
|
|
if recording then
|
|
stopRecordButton.Visible = true
|
|
recordVideoButton.Text = "Stop Recording"
|
|
else
|
|
stopRecordButton.Visible = false
|
|
recordVideoButton.Text = "Record Video"
|
|
end
|
|
end
|
|
|
|
local function recordVideoClick(recordVideoButton, stopRecordButton)
|
|
recordingVideo = not recordingVideo
|
|
setRecordGui(recordingVideo, stopRecordButton, recordVideoButton)
|
|
end
|
|
|
|
local function backToGame(buttonClicked, shield, settingsButton2)
|
|
buttonClicked.Parent.Parent.Parent.Parent.Visible = false
|
|
shield.Visible = false
|
|
for i = 1, #centerDialogs do
|
|
game.GuiService:RemoveCenterDialog(centerDialogs[i])
|
|
centerDialogs[i].Visible = false
|
|
end
|
|
centerDialogs = {}
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
settingsButton2.Active = true
|
|
end
|
|
|
|
local function setDisabledState(guiObject)
|
|
if not guiObject then
|
|
return
|
|
elseif guiObject:IsA "TextLabel" then
|
|
guiObject.TextTransparency = 0.9
|
|
elseif guiObject:IsA "TextButton" then
|
|
guiObject.TextTransparency = 0.9
|
|
guiObject.Active = false
|
|
elseif guiObject.ClassName then
|
|
print(
|
|
"setDisabledState() got object of unsupported type. object type is ",
|
|
guiObject.ClassName
|
|
)
|
|
end
|
|
end
|
|
|
|
local function createHelpDialog(baseZIndex)
|
|
if helpButton == nil then
|
|
if
|
|
gui:FindFirstChild "TopLeftControl"
|
|
and gui.TopLeftControl:FindFirstChild "Help"
|
|
then
|
|
helpButton = gui.TopLeftControl.Help
|
|
elseif
|
|
gui:FindFirstChild "BottomRightControl"
|
|
and gui.BottomRightControl:FindFirstChild "Help"
|
|
then
|
|
helpButton = gui.BottomRightControl.Help
|
|
end
|
|
end
|
|
|
|
local shield = New "Frame" {
|
|
Name = "HelpDialogShield",
|
|
Active = true,
|
|
Visible = false,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
BackgroundColor3 = Colour3(51, 51, 51),
|
|
BorderColor3 = Colour3(27, 42, 53),
|
|
BackgroundTransparency = 0.4,
|
|
ZIndex = baseZIndex + 1,
|
|
}
|
|
|
|
local helpDialog = New "Frame" {
|
|
Name = "HelpDialog",
|
|
Style = Enum.FrameStyle.RobloxRound,
|
|
Position = UDim2.new(0.2, 0, 0.2, 0),
|
|
Size = UDim2.new(0.6, 0, 0.6, 0),
|
|
Active = true,
|
|
Parent = shield,
|
|
New "TextLabel" {
|
|
Name = "Title",
|
|
Text = "Keyboard & Mouse Controls",
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
Position = UDim2.new(0, 0, 0.025, 0),
|
|
Size = UDim2.new(1, 0, 0, 40),
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
BackgroundTransparency = 1,
|
|
},
|
|
}
|
|
|
|
local buttonRow = New "Frame" {
|
|
Name = "Buttons",
|
|
Position = UDim2.new(0.1, 0, 0.07, 40),
|
|
Size = UDim2.new(0.8, 0, 0, 45),
|
|
BackgroundTransparency = 1,
|
|
Parent = helpDialog,
|
|
}
|
|
|
|
local imageFrame = New "Frame" {
|
|
Name = "ImageFrame",
|
|
Position = UDim2.new(0.05, 0, 0.075, 80),
|
|
Size = UDim2.new(0.9, 0, 0.9, -120),
|
|
BackgroundTransparency = 1,
|
|
Parent = helpDialog,
|
|
}
|
|
|
|
local layoutFrame = New "Frame" {
|
|
Name = "LayoutFrame",
|
|
Position = UDim2.new(0.5, 0, 0, 0),
|
|
Size = UDim2.new(1.5, 0, 1, 0),
|
|
BackgroundTransparency = 1,
|
|
SizeConstraint = Enum.SizeConstraint.RelativeYY,
|
|
Parent = imageFrame,
|
|
}
|
|
|
|
local image = New "ImageLabel" {
|
|
Name = "Image",
|
|
Image = UserSettings().GameSettings.ControlMode
|
|
== Enum.ControlMode["Mouse Lock Switch"]
|
|
and mouseLockLookScreenUrl
|
|
or classicLookScreenUrl,
|
|
Position = UDim2.new(-0.5, 0, 0, 0),
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
BackgroundTransparency = 1,
|
|
Parent = layoutFrame,
|
|
}
|
|
|
|
CreateTextButtons(buttonRow, {
|
|
{
|
|
Text = "Look",
|
|
Function = function()
|
|
image.Image = UserSettings().GameSettings.ControlMode
|
|
== Enum.ControlMode["Mouse Lock Switch"]
|
|
and mouseLockLookScreenUrl
|
|
or classicLookScreenUrl
|
|
end,
|
|
},
|
|
{
|
|
Text = "Move",
|
|
Function = function()
|
|
image.Image = "http://banland.xyz/asset?id=45915811"
|
|
end,
|
|
},
|
|
{
|
|
Text = "Gear",
|
|
Function = function()
|
|
image.Image = "http://banland.xyz/asset?id=45917596"
|
|
end,
|
|
},
|
|
{
|
|
Text = "Zoom",
|
|
Function = function()
|
|
image.Image = "http://banland.xyz/asset?id=45915825"
|
|
end,
|
|
},
|
|
}, UDim.new(0, 0), UDim.new(1, 0))
|
|
|
|
-- set up listeners for type of mouse mode, but keep constructing gui at same time
|
|
delay(0, function()
|
|
waitForChild(gui, "UserSettingsShield")
|
|
waitForChild(gui.UserSettingsShield, "Settings")
|
|
waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle")
|
|
waitForChild(
|
|
gui.UserSettingsShield.Settings.SettingsStyle,
|
|
"GameSettingsMenu"
|
|
)
|
|
waitForChild(
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu,
|
|
"CameraField"
|
|
)
|
|
waitForChild(
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField,
|
|
"DropDownMenuButton"
|
|
)
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Changed:connect(
|
|
function(prop)
|
|
if
|
|
prop ~= "Text"
|
|
and buttonRow.Button1.Style
|
|
== Enum.ButtonStyle.RobloxButtonDefault
|
|
then -- only change if this is the currently selected panel
|
|
image.Image = gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Text
|
|
== "Classic"
|
|
and classicLookScreenUrl
|
|
or mouseLockLookScreenUrl
|
|
end
|
|
end
|
|
)
|
|
end)
|
|
|
|
New "TextButton"({
|
|
Name = "OkBtn",
|
|
Text = "OK",
|
|
Modal = true,
|
|
Size = UDim2.new(0.3, 0, 0, 45),
|
|
Position = UDim2.new(0.35, 0, 0.975, -50),
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
BackgroundTransparency = 1,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Style = Enum.ButtonStyle.RobloxButtonDefault,
|
|
Parent = helpDialog,
|
|
}).MouseButton1Click:connect(function()
|
|
shield.Visible = false
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
end)
|
|
|
|
robloxLock(shield)
|
|
return shield
|
|
end
|
|
|
|
local function createLeaveConfirmationMenu(baseZIndex, shield)
|
|
local frame = New "Frame" {
|
|
Name = "LeaveConfirmationMenu",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Position = UDim2.new(0, 0, 2, 400),
|
|
ZIndex = baseZIndex + 4,
|
|
New "TextLabel" {
|
|
Name = "LeaveText",
|
|
Text = "Leave this game?",
|
|
Size = UDim2.new(1, 0, 0.8, 0),
|
|
TextWrapped = true,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
BackgroundTransparency = 1,
|
|
ZIndex = baseZIndex + 4,
|
|
},
|
|
}
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Leave",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 128, 0, 50),
|
|
UDim2.new(0, 313, 0.8, 0)
|
|
)
|
|
)({
|
|
Name = "YesButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = frame,
|
|
Modal = true,
|
|
}):SetVerb "Exit"
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Stay",
|
|
Enum.ButtonStyle.RobloxButtonDefault,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 128, 0, 50),
|
|
UDim2.new(0, 90, 0.8, 0)
|
|
)
|
|
)({
|
|
Name = "NoButton",
|
|
Parent = frame,
|
|
ZIndex = baseZIndex + 4,
|
|
}).MouseButton1Click:connect(function()
|
|
goToMenu(
|
|
shield.Settings.SettingsStyle,
|
|
"GameMainMenu",
|
|
"down",
|
|
UDim2.new(0, 525, 0, 430)
|
|
)
|
|
shield.Settings:TweenSize(
|
|
UDim2.new(0, 525, 0, 430),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
end)
|
|
|
|
return frame
|
|
end
|
|
|
|
local function createResetConfirmationMenu(baseZIndex, shield)
|
|
local function resetCharacterText()
|
|
return New "TextLabel" {
|
|
Size = UDim2.new(1, 0, 0.8, 0),
|
|
TextWrapped = true,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Font = Enum.Font.ArialBold,
|
|
BackgroundTransparency = 1,
|
|
ZIndex = baseZIndex + 4,
|
|
}
|
|
end
|
|
|
|
local frame = New "Frame" {
|
|
Name = "ResetConfirmationMenu",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Position = UDim2.new(0, 0, 2, 400),
|
|
ZIndex = baseZIndex + 4,
|
|
Hydrate(resetCharacterText()) {
|
|
Name = "ResetCharacterText",
|
|
Text = "Are you sure you want to reset your character?",
|
|
FontSize = Enum.FontSize.Size36,
|
|
},
|
|
Hydrate(resetCharacterText()) {
|
|
Name = "FineResetCharacterText",
|
|
Text = "You will be put back on a spawn point",
|
|
Size = UDim2.new(0, 303, 0, 18),
|
|
Position = UDim2.new(0, 109, 0, 215),
|
|
FontSize = Enum.FontSize.Size18,
|
|
},
|
|
}
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Reset",
|
|
Enum.ButtonStyle.RobloxButtonDefault,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 128, 0, 50),
|
|
UDim2.new(0, 313, 0, 299)
|
|
)
|
|
)({
|
|
Name = "YesButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = frame,
|
|
Modal = true,
|
|
}).MouseButton1Click:connect(function()
|
|
resumeGameFunction(shield)
|
|
resetLocalCharacter()
|
|
end)
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Cancel",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 128, 0, 50),
|
|
UDim2.new(0, 90, 0, 299)
|
|
)
|
|
)({
|
|
Name = "NoButton",
|
|
Parent = frame,
|
|
ZIndex = baseZIndex + 4,
|
|
}).MouseButton1Click:connect(function()
|
|
goToMenu(
|
|
shield.Settings.SettingsStyle,
|
|
"GameMainMenu",
|
|
"down",
|
|
UDim2.new(0, 525, 0, 430)
|
|
)
|
|
shield.Settings:TweenSize(
|
|
UDim2.new(0, 525, 0, 430),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
end)
|
|
|
|
return frame
|
|
end
|
|
|
|
local settingsFrame
|
|
|
|
local function createGameMainMenu(baseZIndex, shield)
|
|
local gameMainMenuFrame = New "Frame" {
|
|
Name = "GameMainMenu",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = settingsFrame,
|
|
New "TextLabel" {
|
|
Name = "Title",
|
|
Text = "Game Menu",
|
|
BackgroundTransparency = 1,
|
|
TextStrokeTransparency = 0,
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
Size = UDim2.new(1, 0, 0, 36),
|
|
Position = UDim2.new(0, 0, 0, 4),
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
ZIndex = baseZIndex + 4,
|
|
},
|
|
}
|
|
|
|
local function helpShortcutC()
|
|
return New "TextLabel" {
|
|
BackgroundTransparency = 1,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size12,
|
|
Size = UDim2.new(0, 30, 0, 30),
|
|
TextColor3 = Color3.new(0, 1, 0),
|
|
ZIndex = baseZIndex + 4,
|
|
}
|
|
end
|
|
|
|
local robloxHelpButton = Hydrate(
|
|
createTextButton(
|
|
"Help",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 164, 0, 50),
|
|
UDim2.new(0, 82, 0, 256)
|
|
)
|
|
) {
|
|
Name = "HelpButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
Hydrate(helpShortcutC()) {
|
|
Name = "HelpShortcutText",
|
|
Text = "F1",
|
|
Position = UDim2.new(0, 85, 0, 0),
|
|
Visible = false,
|
|
},
|
|
}
|
|
helpButton = robloxHelpButton
|
|
|
|
local helpDialog = createHelpDialog(baseZIndex)
|
|
helpDialog.Parent = gui
|
|
|
|
helpButton.MouseButton1Click:connect(function()
|
|
table.insert(centerDialogs, helpDialog)
|
|
game.GuiService:AddCenterDialog(
|
|
helpDialog,
|
|
Enum.CenterDialogType.ModalDialog,
|
|
--ShowFunction
|
|
function()
|
|
helpDialog.Visible = true
|
|
mainShield.Visible = false
|
|
end,
|
|
--HideFunction
|
|
function()
|
|
helpDialog.Visible = false
|
|
end
|
|
)
|
|
end)
|
|
helpButton.Active = true
|
|
|
|
local screenshotButton = Hydrate(
|
|
createTextButton(
|
|
"Screenshot",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 168, 0, 50),
|
|
UDim2.new(0, 254, 0, 256)
|
|
)
|
|
) {
|
|
Name = "ScreenshotButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
Visible = not macClient,
|
|
Hydrate(helpShortcutC()) {
|
|
Name = "ScreenshotShortcutText",
|
|
Text = "PrintSc",
|
|
Position = UDim2.new(0, 118, 0, 0),
|
|
Visible = true,
|
|
},
|
|
}
|
|
screenshotButton:SetVerb "Screenshot"
|
|
|
|
local recordVideoButton = Hydrate(
|
|
createTextButton(
|
|
"Record Video",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 168, 0, 50),
|
|
UDim2.new(0, 254, 0, 306)
|
|
)
|
|
) {
|
|
Name = "RecordVideoButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Visible = not macClient,
|
|
Parent = gameMainMenuFrame,
|
|
Hydrate(helpShortcutC()) {
|
|
Name = "RecordVideoShortcutText",
|
|
Text = "F12",
|
|
Position = UDim2.new(0, 120, 0, 0),
|
|
Visible = hasGraphicsSlider,
|
|
},
|
|
}
|
|
recordVideoButton:SetVerb "RecordToggle"
|
|
|
|
local stopRecordButton = New "ImageButton" {
|
|
Name = "StopRecordButton",
|
|
BackgroundTransparency = 1,
|
|
Image = "rbxasset://textures/ui/RecordStop.png",
|
|
Size = UDim2.new(0, 59, 0, 27),
|
|
Visible = false,
|
|
}
|
|
stopRecordButton:SetVerb "RecordToggle"
|
|
|
|
stopRecordButton.MouseButton1Click:connect(function()
|
|
recordVideoClick(recordVideoButton, stopRecordButton)
|
|
end)
|
|
stopRecordButton.Parent = gui
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Report Abuse",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 164, 0, 50),
|
|
UDim2.new(0, 82, 0, 306)
|
|
)
|
|
) {
|
|
Name = "ReportAbuseButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
}
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Leave Game",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 340, 0, 50),
|
|
UDim2.new(0, 82, 0, 358)
|
|
)
|
|
) {
|
|
Name = "LeaveGameButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
}
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Resume Game",
|
|
Enum.ButtonStyle.RobloxButtonDefault,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 340, 0, 50),
|
|
UDim2.new(0, 82, 0, 54)
|
|
)
|
|
)({
|
|
Name = "resumeGameButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
Modal = true,
|
|
}).MouseButton1Click:connect(function()
|
|
resumeGameFunction(shield)
|
|
end)
|
|
|
|
local gameSettingsButton = Hydrate(
|
|
createTextButton(
|
|
"Game Settings",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 340, 0, 50),
|
|
UDim2.new(0, 82, 0, 156)
|
|
)
|
|
) {
|
|
Name = "SettingsButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
}
|
|
|
|
if
|
|
game:FindFirstChild "LoadingGuiService"
|
|
and #game.LoadingGuiService:GetChildren() > 0
|
|
then
|
|
gameSettingsButton = createTextButton(
|
|
"Game Instructions",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 340, 0, 50),
|
|
UDim2.new(0, 82, 0, 207)
|
|
)
|
|
gameSettingsButton.Name = "GameInstructions"
|
|
gameSettingsButton.ZIndex = baseZIndex + 4
|
|
gameSettingsButton.Parent = gameMainMenuFrame
|
|
gameSettingsButton.MouseButton1Click:connect(function()
|
|
if game:FindFirstChild "Players" and game.Players.LocalPlayer then
|
|
local loadingGui =
|
|
game.Players.LocalPlayer:FindFirstChild "PlayerLoadingGui"
|
|
if loadingGui then
|
|
loadingGui.Visible = true
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
Hydrate(
|
|
createTextButton(
|
|
"Reset Character",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 340, 0, 50),
|
|
UDim2.new(0, 82, 0, 105)
|
|
)
|
|
) {
|
|
Name = "ResetButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameMainMenuFrame,
|
|
}
|
|
|
|
return gameMainMenuFrame
|
|
end
|
|
|
|
local mouseLockLabel, syncVideoCaptureSetting
|
|
|
|
local function createGameSettingsMenu(baseZIndex, _)
|
|
local function fullscreenShortcut()
|
|
return New "TextLabel" {
|
|
BackgroundTransparency = 1,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size12,
|
|
Size = UDim2.new(0, 30, 0, 30),
|
|
TextColor3 = Color3.new(0, 1, 0),
|
|
ZIndex = baseZIndex + 4,
|
|
}
|
|
end
|
|
|
|
local function qualityTextC()
|
|
return New "TextLabel" {
|
|
Font = Enum.Font.Arial,
|
|
ZIndex = baseZIndex + 4,
|
|
BackgroundTransparency = 1,
|
|
Visible = not inStudioMode,
|
|
}
|
|
end
|
|
|
|
local gameSettingsMenuFrame = New "Frame" {
|
|
Name = "GameSettingsMenu",
|
|
BackgroundTransparency = 1,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
ZIndex = baseZIndex + 4,
|
|
New "TextLabel" {
|
|
Name = "Title",
|
|
Text = "Settings",
|
|
Size = UDim2.new(1, 0, 0, 48),
|
|
Position = UDim2.new(0, 9, 0, -9),
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
ZIndex = baseZIndex + 4,
|
|
BackgroundTransparency = 1,
|
|
},
|
|
New "TextLabel" {
|
|
Name = "FullscreenText",
|
|
Text = "Fullscreen Mode",
|
|
Size = UDim2.new(0, 124, 0, 18),
|
|
Position = UDim2.new(0, 62, 0, 145),
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
ZIndex = baseZIndex + 4,
|
|
BackgroundTransparency = 1,
|
|
},
|
|
Hydrate(fullscreenShortcut()) {
|
|
Name = "FullscreenShortcutText",
|
|
Visible = hasGraphicsSlider,
|
|
Text = "F11",
|
|
Position = UDim2.new(0, 186, 0, 141),
|
|
},
|
|
Hydrate(qualityTextC()) {
|
|
Name = "QualityText",
|
|
Text = "Graphics Quality",
|
|
Position = UDim2.new(0, 30, 0, 239),
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Size = UDim2.new(0, 128, 0, 18),
|
|
FontSize = Enum.FontSize.Size18,
|
|
},
|
|
}
|
|
|
|
local studioText = New "TextLabel" {
|
|
Name = "StudioText",
|
|
Text = "Studio Mode",
|
|
Visible = false,
|
|
Size = UDim2.new(0, 95, 0, 18),
|
|
Position = UDim2.new(0, 62, 0, 179),
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
ZIndex = baseZIndex + 4,
|
|
BackgroundTransparency = 1,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local studioShortcut = Hydrate(fullscreenShortcut()) {
|
|
Name = "StudioShortcutText",
|
|
Text = "F2",
|
|
Visible = false, -- TODO: turn back on when f2 hack is fixed
|
|
Position = UDim2.new(0, 154, 0, 175),
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local fasterShortcut = Hydrate(fullscreenShortcut()) {
|
|
Name = "FasterShortcutText",
|
|
Text = "Shift + F10",
|
|
Visible = not inStudioMode,
|
|
Position = UDim2.new(0, 185, 0, 283),
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local betterQualityShortcut = Hydrate(fullscreenShortcut()) {
|
|
Name = "BetterQualityShortcut",
|
|
Text = "F10",
|
|
Position = UDim2.new(0, 394, 0, 288),
|
|
Visible = not inStudioMode,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local autoText = Hydrate(qualityTextC()) {
|
|
Name = "AutoText",
|
|
Text = "Auto",
|
|
Position = UDim2.new(0, 183, 0, 214),
|
|
TextColor3 = Color3.new(128 / 255, 128 / 255, 128 / 255),
|
|
Size = UDim2.new(0, 34, 0, 18),
|
|
FontSize = Enum.FontSize.Size18,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local fasterText = Hydrate(qualityTextC()) {
|
|
Name = "FasterText",
|
|
Text = "Faster",
|
|
Position = UDim2.new(0, 185, 0, 274),
|
|
TextColor3 = Color3.new(95, 95, 95),
|
|
Size = UDim2.new(0, 34, 0, 18),
|
|
FontSize = Enum.FontSize.Size14,
|
|
Visible = not inStudioMode,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local betterQualityText = Hydrate(qualityTextC()) {
|
|
Name = "BetterQualityText",
|
|
Text = "Better Quality",
|
|
TextWrapped = true,
|
|
Size = UDim2.new(0, 41, 0, 28),
|
|
Position = UDim2.new(0, 390, 0, 269),
|
|
TextColor3 = Color3.new(95, 95, 95),
|
|
FontSize = Enum.FontSize.Size14,
|
|
Visible = not inStudioMode,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local autoGraphicsButton = Hydrate(
|
|
createTextButton(
|
|
"X",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 25, 0, 25),
|
|
UDim2.new(0, 187, 0, 239)
|
|
)
|
|
) {
|
|
Name = "AutoGraphicsButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Visible = not inStudioMode,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local graphicsSlider, graphicsLevel = RbxGui.CreateSlider(
|
|
GraphicsQualityLevels,
|
|
150,
|
|
UDim2.new(0, 230, 0, 280)
|
|
) -- graphics - 1 because slider starts at 1 instead of 0
|
|
|
|
Hydrate(graphicsSlider) {
|
|
Parent = gameSettingsMenuFrame,
|
|
Visible = not inStudioMode,
|
|
}
|
|
graphicsSlider.Bar.ZIndex = baseZIndex + 4
|
|
graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5
|
|
graphicsLevel.Value =
|
|
math.floor((settings().Rendering:GetMaxQualityLevel() - 1) / 2)
|
|
|
|
local graphicsSetter = New "TextBox" {
|
|
Name = "GraphicsSetter",
|
|
BackgroundColor3 = Color3.new(0, 0, 0),
|
|
BorderColor3 = Color3.new(128 / 255, 128 / 255, 128 / 255),
|
|
Size = UDim2.new(0, 50, 0, 25),
|
|
Position = UDim2.new(0, 450, 0, 269),
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Text = "Auto",
|
|
ZIndex = 1,
|
|
TextWrapped = true,
|
|
Parent = gameSettingsMenuFrame,
|
|
Visible = not inStudioMode,
|
|
}
|
|
|
|
local isAutoGraphics = true
|
|
if not inStudioMode then
|
|
isAutoGraphics = (
|
|
UserSettings().GameSettings.SavedQualityLevel
|
|
== Enum.SavedQualitySetting.Automatic
|
|
)
|
|
else
|
|
settings().Rendering.EnableFRM = false
|
|
end
|
|
|
|
local listenToGraphicsLevelChange = true
|
|
|
|
local function setAutoGraphicsGui(active)
|
|
isAutoGraphics = active
|
|
if active then
|
|
autoGraphicsButton.Text = "X"
|
|
betterQualityText.ZIndex = 1
|
|
betterQualityShortcut.ZIndex = 1
|
|
fasterShortcut.ZIndex = 1
|
|
fasterText.ZIndex = 1
|
|
graphicsSlider.Bar.ZIndex = 1
|
|
graphicsSlider.Bar.Slider.ZIndex = 1
|
|
graphicsSetter.ZIndex = 1
|
|
graphicsSetter.Text = "Auto"
|
|
else
|
|
autoGraphicsButton.Text = ""
|
|
graphicsSlider.Bar.ZIndex = baseZIndex + 4
|
|
graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5
|
|
betterQualityShortcut.ZIndex = baseZIndex + 4
|
|
fasterShortcut.ZIndex = baseZIndex + 4
|
|
betterQualityText.ZIndex = baseZIndex + 4
|
|
fasterText.ZIndex = baseZIndex + 4
|
|
graphicsSetter.ZIndex = baseZIndex + 4
|
|
end
|
|
end
|
|
|
|
local function goToAutoGraphics()
|
|
setAutoGraphicsGui(true)
|
|
|
|
UserSettings().GameSettings.SavedQualityLevel =
|
|
Enum.SavedQualitySetting.Automatic
|
|
|
|
settings().Rendering.QualityLevel = Enum.QualityLevel.Automatic
|
|
end
|
|
|
|
local function setGraphicsQualityLevel(newLevel)
|
|
local percentage = newLevel / GraphicsQualityLevels
|
|
local newSetting = math.floor(
|
|
(settings().Rendering:GetMaxQualityLevel() - 1) * percentage
|
|
)
|
|
if newSetting == 20 then -- Level 20 is the same as level 21, except it doesn't render ambient occlusion
|
|
newSetting = 21
|
|
elseif newLevel == 1 then -- make sure we can go to lowest settings (for terrible computers)
|
|
newSetting = 1
|
|
elseif newSetting > settings().Rendering:GetMaxQualityLevel() then
|
|
newSetting = settings().Rendering:GetMaxQualityLevel() - 1
|
|
end
|
|
|
|
UserSettings().GameSettings.SavedQualityLevel = newLevel
|
|
settings().Rendering.QualityLevel = newSetting
|
|
end
|
|
|
|
local function goToManualGraphics(explicitLevel)
|
|
setAutoGraphicsGui(false)
|
|
|
|
if explicitLevel then
|
|
graphicsLevel.Value = explicitLevel
|
|
else
|
|
graphicsLevel.Value = math.floor(
|
|
(
|
|
settings().Rendering.AutoFRMLevel
|
|
/ (settings().Rendering:GetMaxQualityLevel() - 1)
|
|
) * GraphicsQualityLevels
|
|
)
|
|
end
|
|
|
|
if explicitLevel == graphicsLevel.Value then -- make sure we are actually in right graphics mode
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
end
|
|
|
|
if not explicitLevel then
|
|
UserSettings().GameSettings.SavedQualityLevel = graphicsLevel.Value
|
|
end
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
end
|
|
|
|
local function showAutoGraphics()
|
|
autoText.ZIndex = baseZIndex + 4
|
|
autoGraphicsButton.ZIndex = baseZIndex + 4
|
|
end
|
|
|
|
local function hideAutoGraphics()
|
|
autoText.ZIndex = 1
|
|
autoGraphicsButton.ZIndex = 1
|
|
end
|
|
|
|
local function showManualGraphics()
|
|
graphicsSlider.Bar.ZIndex = baseZIndex + 4
|
|
graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5
|
|
betterQualityShortcut.ZIndex = baseZIndex + 4
|
|
fasterShortcut.ZIndex = baseZIndex + 4
|
|
betterQualityText.ZIndex = baseZIndex + 4
|
|
fasterText.ZIndex = baseZIndex + 4
|
|
graphicsSetter.ZIndex = baseZIndex + 4
|
|
end
|
|
|
|
local function hideManualGraphics()
|
|
betterQualityText.ZIndex = 1
|
|
betterQualityShortcut.ZIndex = 1
|
|
fasterShortcut.ZIndex = 1
|
|
fasterText.ZIndex = 1
|
|
graphicsSlider.Bar.ZIndex = 1
|
|
graphicsSlider.Bar.Slider.ZIndex = 1
|
|
graphicsSetter.ZIndex = 1
|
|
end
|
|
|
|
local function translateSavedQualityLevelToInt(savedQualityLevel)
|
|
local sqs = Enum.SavedQualitySetting
|
|
if savedQualityLevel == sqs.QualityLevel1 then
|
|
return 1
|
|
elseif savedQualityLevel == sqs.QualityLevel2 then
|
|
return 2
|
|
elseif savedQualityLevel == sqs.QualityLevel3 then
|
|
return 3
|
|
elseif savedQualityLevel == sqs.QualityLevel4 then
|
|
return 4
|
|
elseif savedQualityLevel == sqs.QualityLevel5 then
|
|
return 5
|
|
elseif savedQualityLevel == sqs.QualityLevel6 then
|
|
return 6
|
|
elseif savedQualityLevel == sqs.QualityLevel7 then
|
|
return 7
|
|
elseif savedQualityLevel == sqs.QualityLevel8 then
|
|
return 8
|
|
elseif savedQualityLevel == sqs.QualityLevel9 then
|
|
return 9
|
|
elseif savedQualityLevel == sqs.QualityLevel10 then
|
|
return 10
|
|
end
|
|
return 0
|
|
end
|
|
|
|
local function enableGraphicsWidget()
|
|
settings().Rendering.EnableFRM = true
|
|
|
|
isAutoGraphics = (
|
|
UserSettings().GameSettings.SavedQualityLevel
|
|
== Enum.SavedQualitySetting.Automatic
|
|
)
|
|
if isAutoGraphics then
|
|
showAutoGraphics()
|
|
goToAutoGraphics()
|
|
else
|
|
showAutoGraphics()
|
|
showManualGraphics()
|
|
goToManualGraphics(
|
|
translateSavedQualityLevelToInt(
|
|
UserSettings().GameSettings.SavedQualityLevel
|
|
)
|
|
)
|
|
end
|
|
end
|
|
|
|
local function disableGraphicsWidget()
|
|
hideManualGraphics()
|
|
hideAutoGraphics()
|
|
settings().Rendering.EnableFRM = false
|
|
end
|
|
|
|
graphicsSetter.FocusLost:connect(function()
|
|
if isAutoGraphics then
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
return
|
|
end
|
|
|
|
local newGraphicsValue = tonumber(graphicsSetter.Text)
|
|
if newGraphicsValue == nil then
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
return
|
|
end
|
|
|
|
if newGraphicsValue < 1 then
|
|
newGraphicsValue = 1
|
|
elseif
|
|
newGraphicsValue >= settings().Rendering:GetMaxQualityLevel()
|
|
then
|
|
newGraphicsValue = settings().Rendering:GetMaxQualityLevel() - 1
|
|
end
|
|
|
|
graphicsLevel.Value = newGraphicsValue
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
end)
|
|
|
|
graphicsLevel.Changed:connect(function(_)
|
|
if isAutoGraphics or not listenToGraphicsLevelChange then
|
|
return
|
|
end
|
|
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
end)
|
|
|
|
-- setup our graphic mode on load
|
|
if
|
|
inStudioMode
|
|
or UserSettings().GameSettings.SavedQualityLevel
|
|
== Enum.SavedQualitySetting.Automatic
|
|
then
|
|
if inStudioMode then
|
|
settings().Rendering.EnableFRM = false
|
|
disableGraphicsWidget()
|
|
else
|
|
settings().Rendering.EnableFRM = true
|
|
goToAutoGraphics()
|
|
end
|
|
else
|
|
settings().Rendering.EnableFRM = true
|
|
goToManualGraphics(
|
|
translateSavedQualityLevelToInt(
|
|
UserSettings().GameSettings.SavedQualityLevel
|
|
)
|
|
)
|
|
end
|
|
|
|
autoGraphicsButton.MouseButton1Click:connect(function()
|
|
if inStudioMode and not game.Players.LocalPlayer then
|
|
return
|
|
elseif not isAutoGraphics then
|
|
goToAutoGraphics()
|
|
else
|
|
goToManualGraphics(graphicsLevel.Value)
|
|
end
|
|
end)
|
|
|
|
game.GraphicsQualityChangeRequest:connect(function(graphicsIncrease)
|
|
if isAutoGraphics then -- only can set graphics in manual mode
|
|
return
|
|
elseif graphicsIncrease then
|
|
if (graphicsLevel.Value + 1) > GraphicsQualityLevels then
|
|
return
|
|
end
|
|
graphicsLevel.Value += 1
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
|
|
GuiService:SendNotification(
|
|
"Graphics Quality",
|
|
`Increased to ({graphicsSetter.Text})`,
|
|
"",
|
|
2,
|
|
function() end
|
|
)
|
|
else
|
|
if (graphicsLevel.Value - 1) <= 0 then
|
|
return
|
|
end
|
|
graphicsLevel.Value -= 1
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
|
|
GuiService:SendNotification(
|
|
"Graphics Quality",
|
|
`Decreased to ({graphicsSetter.Text})`,
|
|
"",
|
|
2,
|
|
function() end
|
|
)
|
|
end
|
|
end)
|
|
|
|
game.Players.PlayerAdded:connect(function(player)
|
|
if player == game.Players.LocalPlayer and inStudioMode then
|
|
enableGraphicsWidget()
|
|
end
|
|
end)
|
|
game.Players.PlayerRemoving:connect(function(player)
|
|
if player == game.Players.LocalPlayer and inStudioMode then
|
|
disableGraphicsWidget()
|
|
end
|
|
end)
|
|
|
|
local studioCheckbox = Hydrate(
|
|
createTextButton(
|
|
"",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 25, 0, 25),
|
|
UDim2.new(0, 30, 0, 176)
|
|
)
|
|
) {
|
|
Name = "StudioCheckbox",
|
|
ZIndex = baseZIndex + 4,
|
|
-- Parent, = gameSettingsMenuFrame -- todo: enable when studio h4x aren't an issue anymore
|
|
Visible = false, -- todo: enabled when studio h4x aren't an issue anymore
|
|
}
|
|
studioCheckbox:SetVerb "TogglePlayMode"
|
|
|
|
local wasManualGraphics = (
|
|
settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic
|
|
)
|
|
if inStudioMode and not game.Players.LocalPlayer then
|
|
studioCheckbox.Text = "X"
|
|
disableGraphicsWidget()
|
|
elseif inStudioMode then
|
|
studioCheckbox.Text = "X"
|
|
enableGraphicsWidget()
|
|
end
|
|
if hasGraphicsSlider then
|
|
UserSettings().GameSettings.StudioModeChanged:connect(
|
|
function(isStudioMode)
|
|
inStudioMode = isStudioMode
|
|
if isStudioMode then
|
|
wasManualGraphics = (
|
|
settings().Rendering.QualityLevel
|
|
~= Enum.QualityLevel.Automatic
|
|
)
|
|
goToAutoGraphics()
|
|
studioCheckbox.Text = "X"
|
|
autoGraphicsButton.ZIndex = 1
|
|
autoText.ZIndex = 1
|
|
else
|
|
if wasManualGraphics then
|
|
goToManualGraphics()
|
|
end
|
|
studioCheckbox.Text = ""
|
|
autoGraphicsButton.ZIndex = baseZIndex + 4
|
|
autoText.ZIndex = baseZIndex + 4
|
|
end
|
|
end
|
|
)
|
|
else
|
|
studioCheckbox.MouseButton1Click:connect(function()
|
|
if not studioCheckbox.Active then
|
|
return
|
|
elseif studioCheckbox.Text == "" then
|
|
studioCheckbox.Text = "X"
|
|
else
|
|
studioCheckbox.Text = ""
|
|
end
|
|
end)
|
|
end
|
|
|
|
local fullscreenCheckbox = Hydrate(
|
|
createTextButton(
|
|
"",
|
|
Enum.ButtonStyle.RobloxButton,
|
|
Enum.FontSize.Size18,
|
|
UDim2.new(0, 25, 0, 25),
|
|
UDim2.new(0, 30, 0, 144)
|
|
)
|
|
) {
|
|
Name = "FullscreenCheckbox",
|
|
ZIndex = baseZIndex + 4,
|
|
}
|
|
fullscreenCheckbox:SetVerb "ToggleFullScreen"
|
|
if UserSettings().GameSettings:InFullScreen() then
|
|
fullscreenCheckbox.Text = "X"
|
|
end
|
|
if hasGraphicsSlider then
|
|
UserSettings().GameSettings.FullscreenChanged:connect(
|
|
function(isFullscreen)
|
|
fullscreenCheckbox.Text = isFullscreen and "X" or ""
|
|
end
|
|
)
|
|
else
|
|
fullscreenCheckbox.MouseButton1Click:connect(function()
|
|
fullscreenCheckbox.Text = fullscreenCheckbox.Text == "" and "X"
|
|
or ""
|
|
end)
|
|
end
|
|
fullscreenCheckbox.Parent = gameSettingsMenuFrame
|
|
|
|
if game:FindFirstChild "NetworkClient" then -- we are playing online
|
|
setDisabledState(studioText)
|
|
setDisabledState(studioShortcut)
|
|
setDisabledState(studioCheckbox)
|
|
end
|
|
|
|
local backButton
|
|
if hasGraphicsSlider then
|
|
backButton = createTextButton(
|
|
"OK",
|
|
Enum.ButtonStyle.RobloxButtonDefault,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 180, 0, 50),
|
|
UDim2.new(0, 170, 0, 330)
|
|
)
|
|
backButton.Modal = true
|
|
else
|
|
backButton = createTextButton(
|
|
"OK",
|
|
Enum.ButtonStyle.RobloxButtonDefault,
|
|
Enum.FontSize.Size24,
|
|
UDim2.new(0, 180, 0, 50),
|
|
UDim2.new(0, 170, 0, 270)
|
|
)
|
|
backButton.Modal = true
|
|
end
|
|
|
|
Hydrate(backButton) {
|
|
Name = "BackButton",
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
syncVideoCaptureSetting = nil
|
|
|
|
if not macClient then
|
|
New "TextLabel" {
|
|
Name = "VideoCaptureLabel",
|
|
Text = "After Capturing Video",
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0, 32, 0, 100),
|
|
Size = UDim2.new(0, 164, 0, 18),
|
|
BackgroundTransparency = 1,
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
local videoNames = {}
|
|
local videoNameToItem = {}
|
|
videoNames[1] = "Just Save to Disk"
|
|
videoNameToItem[videoNames[1]] = Enum.UploadSetting.Never
|
|
videoNames[2] = "Upload to YouTube"
|
|
videoNameToItem[videoNames[2]] = Enum.UploadSetting["Ask me first"]
|
|
|
|
local videoCaptureDropDown
|
|
videoCaptureDropDown, updateVideoCaptureDropDownSelection = RbxGui.CreateDropDownMenu(
|
|
videoNames,
|
|
function(text)
|
|
UserSettings().GameSettings.VideoUploadPromptBehavior =
|
|
videoNameToItem[text]
|
|
end
|
|
)
|
|
|
|
Hydrate(videoCaptureDropDown) {
|
|
Name = "VideoCaptureField",
|
|
ZIndex = baseZIndex + 4,
|
|
Position = UDim2.new(0, 270, 0, 94),
|
|
Size = UDim2.new(0, 200, 0, 32),
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
videoCaptureDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4
|
|
videoCaptureDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4
|
|
|
|
function syncVideoCaptureSetting()
|
|
if
|
|
UserSettings().GameSettings.VideoUploadPromptBehavior
|
|
== Enum.UploadSetting.Never
|
|
then
|
|
updateVideoCaptureDropDownSelection(videoNames[1])
|
|
elseif
|
|
UserSettings().GameSettings.VideoUploadPromptBehavior
|
|
== Enum.UploadSetting["Ask me first"]
|
|
then
|
|
updateVideoCaptureDropDownSelection(videoNames[2])
|
|
else
|
|
UserSettings().GameSettings.VideoUploadPromptBehavior =
|
|
Enum.UploadSetting["Ask me first"]
|
|
updateVideoCaptureDropDownSelection(videoNames[2])
|
|
end
|
|
end
|
|
end
|
|
|
|
New "TextLabel" {
|
|
Name = "CameraLabel",
|
|
Text = "Character & Camera Controls",
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0, 31, 0, 58),
|
|
Size = UDim2.new(0, 224, 0, 18),
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
BackgroundTransparency = 1,
|
|
ZIndex = baseZIndex + 4,
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
|
|
mouseLockLabel = CoreGui.RobloxGui:FindFirstChild("MouseLockLabel", true)
|
|
|
|
local enumItems = Enum.ControlMode:GetEnumItems()
|
|
local enumNames = {}
|
|
local enumNameToItem = {}
|
|
for i, obj in ipairs(enumItems) do
|
|
enumNames[i] = obj.Name
|
|
enumNameToItem[obj.Name] = obj
|
|
end
|
|
|
|
local cameraDropDown
|
|
cameraDropDown, updateCameraDropDownSelection = RbxGui.CreateDropDownMenu(
|
|
enumNames,
|
|
function(text)
|
|
UserSettings().GameSettings.ControlMode = enumNameToItem[text]
|
|
|
|
pcall(function()
|
|
mouseLockLabel.Visible = mouseLockLabel
|
|
and UserSettings().GameSettings.ControlMode
|
|
== Enum.ControlMode["Mouse Lock Switch"]
|
|
end)
|
|
end
|
|
)
|
|
|
|
Hydrate(cameraDropDown) {
|
|
Name = "CameraField",
|
|
ZIndex = baseZIndex + 4,
|
|
Position = UDim2.new(0, 270, 0, 52),
|
|
Size = UDim2.new(0, 200, 0, 32),
|
|
Parent = gameSettingsMenuFrame,
|
|
}
|
|
cameraDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4
|
|
cameraDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4
|
|
|
|
return gameSettingsMenuFrame
|
|
end
|
|
|
|
if not LoadLibrary then
|
|
return
|
|
end
|
|
|
|
RbxGui = LoadLibrary "RbxGui"
|
|
|
|
GuiService:AddKey "l"
|
|
GuiService:AddKey "r"
|
|
|
|
local baseZIndex = 0
|
|
if UserSettings then
|
|
local function createSettingsDialog()
|
|
waitForChild(gui, "BottomLeftControl")
|
|
settingsButton = gui.BottomLeftControl:FindFirstChild "SettingsButton"
|
|
|
|
if settingsButton == nil then
|
|
settingsButton = New "ImageButton" {
|
|
Name = "SettingsButton",
|
|
Image = "rbxasset://textures/ui/SettingsButton.png",
|
|
BackgroundTransparency = 1,
|
|
Active = false,
|
|
Size = UDim2.new(0, 54, 0, 46),
|
|
Position = UDim2.new(0, 2, 0, 50),
|
|
Parent = gui.BottomLeftControl,
|
|
}
|
|
end
|
|
|
|
local shield = New "TextButton" {
|
|
Text = "",
|
|
Name = "UserSettingsShield",
|
|
Active = true,
|
|
AutoButtonColor = false,
|
|
Visible = false,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
BackgroundColor3 = Colour3(51, 51, 51),
|
|
BorderColor3 = Colour3(27, 42, 53),
|
|
BackgroundTransparency = 0.4,
|
|
ZIndex = baseZIndex + 2,
|
|
}
|
|
mainShield = shield
|
|
|
|
local frame = New "Frame" {
|
|
Name = "Settings",
|
|
Position = UDim2.new(0.5, -262, -0.5, -200),
|
|
Size = UDim2.new(0, 525, 0, 430),
|
|
BackgroundTransparency = 1,
|
|
Active = true,
|
|
Parent = shield,
|
|
}
|
|
|
|
settingsFrame = New "Frame" {
|
|
Name = "SettingsStyle",
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Style = Enum.FrameStyle.RobloxRound,
|
|
Active = true,
|
|
ZIndex = baseZIndex + 3,
|
|
Parent = frame,
|
|
}
|
|
|
|
local gameMainMenu = createGameMainMenu(baseZIndex, shield)
|
|
gameMainMenu.Parent = settingsFrame
|
|
|
|
gameMainMenu.ScreenshotButton.MouseButton1Click:connect(function()
|
|
backToGame(gameMainMenu.ScreenshotButton, shield, settingsButton)
|
|
end)
|
|
|
|
gameMainMenu.RecordVideoButton.MouseButton1Click:connect(function()
|
|
recordVideoClick(
|
|
gameMainMenu.RecordVideoButton,
|
|
gui.StopRecordButton
|
|
)
|
|
backToGame(gameMainMenu.RecordVideoButton, shield, settingsButton)
|
|
end)
|
|
|
|
local gameOptions = settings():FindFirstChild "Game Options"
|
|
if gameOptions then
|
|
pcall(function()
|
|
gameOptions.VideoRecordingChangeRequest:connect(
|
|
function(recording)
|
|
recordingVideo = recording
|
|
setRecordGui(
|
|
recording,
|
|
gui.StopRecordButton,
|
|
gameMainMenu.RecordVideoButton
|
|
)
|
|
end
|
|
)
|
|
end)
|
|
end
|
|
|
|
CoreGui.RobloxGui.Changed:connect(
|
|
function(prop) -- We have stopped recording when we resize
|
|
if prop == "AbsoluteSize" and recordingVideo then
|
|
recordVideoClick(
|
|
gameMainMenu.RecordVideoButton,
|
|
gui.StopRecordButton
|
|
)
|
|
end
|
|
end
|
|
)
|
|
|
|
local function localPlayerChange()
|
|
gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer
|
|
if game.Players.LocalPlayer then
|
|
settings().Rendering.EnableFRM = true
|
|
elseif inStudioMode then
|
|
settings().Rendering.EnableFRM = false
|
|
end
|
|
end
|
|
|
|
gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer
|
|
if game.Players.LocalPlayer ~= nil then
|
|
game.Players.LocalPlayer.Changed:connect(function()
|
|
localPlayerChange()
|
|
end)
|
|
else
|
|
delay(0, function()
|
|
waitForProperty(game.Players, "LocalPlayer")
|
|
gameMainMenu.ResetButton.Visible = game.Players.LocalPlayer
|
|
game.Players.LocalPlayer.Changed:connect(function()
|
|
localPlayerChange()
|
|
end)
|
|
end)
|
|
end
|
|
|
|
gameMainMenu.ReportAbuseButton.Visible =
|
|
game:FindFirstChild "NetworkClient"
|
|
if not gameMainMenu.ReportAbuseButton.Visible then
|
|
game.ChildAdded:connect(function(child)
|
|
if child:IsA "NetworkClient" then
|
|
gameMainMenu.ReportAbuseButton.Visible =
|
|
game:FindFirstChild "NetworkClient"
|
|
end
|
|
end)
|
|
end
|
|
|
|
local function confirmReset()
|
|
goToMenu(
|
|
settingsFrame,
|
|
"ResetConfirmationMenu",
|
|
"up",
|
|
UDim2.new(0, 525, 0, 370)
|
|
)
|
|
end
|
|
|
|
local function confirmLeave()
|
|
goToMenu(
|
|
settingsFrame,
|
|
"LeaveConfirmationMenu",
|
|
"down",
|
|
UDim2.new(0, 525, 0, 300)
|
|
)
|
|
end
|
|
|
|
local hotkeysConn
|
|
local function leaveResetHotkeys(key) -- esc, r, not enter (unfortunately)
|
|
if hotkeysConn then
|
|
hotkeysConn:disconnect()
|
|
end
|
|
if key == "r" then
|
|
confirmReset()
|
|
elseif key == "l" then
|
|
confirmLeave()
|
|
end
|
|
end
|
|
|
|
local function showFunction()
|
|
settingsButton.Active = false
|
|
updateCameraDropDownSelection(
|
|
UserSettings().GameSettings.ControlMode.Name
|
|
)
|
|
|
|
if syncVideoCaptureSetting then
|
|
syncVideoCaptureSetting()
|
|
end
|
|
|
|
goToMenu(
|
|
settingsFrame,
|
|
"GameMainMenu",
|
|
"right",
|
|
UDim2.new(0, 525, 0, 430)
|
|
)
|
|
shield.Visible = true
|
|
shield.Active = true
|
|
settingsFrame.Parent:TweenPosition(
|
|
UDim2.new(0.5, -262, 0.5, -200),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
settingsFrame.Parent:TweenSize(
|
|
UDim2.new(0, 525, 0, 430),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
end
|
|
|
|
local function hideFunction()
|
|
settingsFrame.Parent:TweenPosition(
|
|
UDim2.new(0.5, -262, -0.5, -200),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
settingsFrame.Parent:TweenSize(
|
|
UDim2.new(0, 525, 0, 430),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
shield.Visible = false
|
|
settingsButton.Active = true
|
|
end
|
|
|
|
gameMainMenu.ResetButton.MouseButton1Click:connect(confirmReset)
|
|
gameMainMenu.LeaveGameButton.MouseButton1Click:connect(confirmLeave)
|
|
|
|
GuiService.EscapeKeyPressed:connect(function()
|
|
if hotkeysConn then
|
|
hotkeysConn:disconnect()
|
|
end
|
|
-- Prevent mysterious missing settings menu bugs
|
|
delay(tweenTime, function()
|
|
if hotkeysConn then
|
|
hotkeysConn:disconnect()
|
|
end
|
|
hotkeysConn = GuiService.KeyPressed:connect(leaveResetHotkeys)
|
|
end)
|
|
if currentMenuSelection == nil then
|
|
game.GuiService:AddCenterDialog(
|
|
shield,
|
|
Enum.CenterDialogType.ModalDialog,
|
|
showFunction,
|
|
hideFunction
|
|
)
|
|
elseif #lastMenuSelection > 0 then
|
|
if #centerDialogs > 0 then
|
|
for i = 1, #centerDialogs do
|
|
game.GuiService:RemoveCenterDialog(centerDialogs[i])
|
|
centerDialogs[i].Visible = false
|
|
end
|
|
centerDialogs = {}
|
|
end
|
|
|
|
goToMenu(
|
|
lastMenuSelection[#lastMenuSelection].container,
|
|
lastMenuSelection[#lastMenuSelection].name,
|
|
lastMenuSelection[#lastMenuSelection].direction,
|
|
lastMenuSelection[#lastMenuSelection].lastSize
|
|
)
|
|
|
|
table.remove(lastMenuSelection, #lastMenuSelection)
|
|
if #lastMenuSelection == 1 then -- apparently lua can't reduce count to 0... T_T
|
|
lastMenuSelection = {}
|
|
end
|
|
else
|
|
resumeGameFunction(shield)
|
|
end
|
|
end)
|
|
|
|
local gameSettingsMenu = createGameSettingsMenu(baseZIndex, shield)
|
|
gameSettingsMenu.Visible = false
|
|
gameSettingsMenu.Parent = settingsFrame
|
|
|
|
gameMainMenu.SettingsButton.MouseButton1Click:connect(function()
|
|
goToMenu(
|
|
settingsFrame,
|
|
"GameSettingsMenu",
|
|
"left",
|
|
UDim2.new(0, 525, 0, 350)
|
|
)
|
|
end)
|
|
|
|
gameSettingsMenu.BackButton.MouseButton1Click:connect(function()
|
|
goToMenu(
|
|
settingsFrame,
|
|
"GameMainMenu",
|
|
"right",
|
|
UDim2.new(0, 525, 0, 430)
|
|
)
|
|
end)
|
|
|
|
local resetConfirmationWindow =
|
|
createResetConfirmationMenu(baseZIndex, shield)
|
|
resetConfirmationWindow.Visible = false
|
|
resetConfirmationWindow.Parent = settingsFrame
|
|
|
|
local leaveConfirmationWindow =
|
|
createLeaveConfirmationMenu(baseZIndex, shield)
|
|
leaveConfirmationWindow.Visible = false
|
|
leaveConfirmationWindow.Parent = settingsFrame
|
|
|
|
robloxLock(shield)
|
|
|
|
settingsButton.MouseButton1Click:connect(function()
|
|
game.GuiService:AddCenterDialog(
|
|
shield,
|
|
Enum.CenterDialogType.ModalDialog,
|
|
--showFunction
|
|
function()
|
|
settingsButton.Active = false
|
|
updateCameraDropDownSelection(
|
|
UserSettings().GameSettings.ControlMode.Name
|
|
)
|
|
|
|
if syncVideoCaptureSetting then
|
|
syncVideoCaptureSetting()
|
|
end
|
|
|
|
goToMenu(
|
|
settingsFrame,
|
|
"GameMainMenu",
|
|
"right",
|
|
UDim2.new(0, 525, 0, 430)
|
|
)
|
|
shield.Visible = true
|
|
settingsFrame.Parent:TweenPosition(
|
|
UDim2.new(0.5, -262, 0.5, -200),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
settingsFrame.Parent:TweenSize(
|
|
UDim2.new(0, 525, 0, 430),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
end,
|
|
--hideFunction
|
|
function()
|
|
settingsFrame.Parent:TweenPosition(
|
|
UDim2.new(0.5, -262, -0.5, -200),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
settingsFrame.Parent:TweenSize(
|
|
UDim2.new(0, 525, 0, 430),
|
|
Enum.EasingDirection.InOut,
|
|
Enum.EasingStyle.Sine,
|
|
tweenTime,
|
|
true
|
|
)
|
|
shield.Visible = false
|
|
settingsButton.Active = true
|
|
end
|
|
)
|
|
end)
|
|
|
|
return shield
|
|
end
|
|
|
|
delay(0, function()
|
|
createSettingsDialog().Parent = gui
|
|
|
|
gui.BottomLeftControl.SettingsButton.Active = true
|
|
gui.BottomLeftControl.SettingsButton.Position = UDim2.new(0, 2, 0, -2)
|
|
|
|
if
|
|
mouseLockLabel
|
|
and UserSettings().GameSettings.ControlMode
|
|
== Enum.ControlMode["Mouse Lock Switch"]
|
|
then
|
|
mouseLockLabel.Visible = true
|
|
elseif mouseLockLabel then
|
|
mouseLockLabel.Visible = false
|
|
end
|
|
|
|
-- our script has loaded, get rid of older buttons now
|
|
local leaveGameButton = gui.BottomLeftControl:FindFirstChild "Exit"
|
|
if leaveGameButton then
|
|
leaveGameButton:Remove()
|
|
end
|
|
|
|
local topLeft = gui:FindFirstChild "TopLeftControl"
|
|
if topLeft then
|
|
leaveGameButton = topLeft:FindFirstChild "Exit"
|
|
if leaveGameButton then
|
|
leaveGameButton:Remove()
|
|
end
|
|
|
|
topLeft:Remove()
|
|
end
|
|
end)
|
|
end --UserSettings call
|
|
|
|
local function createSaveDialogs()
|
|
local shield = New "TextButton" {
|
|
Text = "",
|
|
AutoButtonColor = false,
|
|
Name = "SaveDialogShield",
|
|
Active = true,
|
|
Visible = false,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
BackgroundColor3 = Colour3(51, 51, 51),
|
|
BorderColor3 = Colour3(27, 42, 53),
|
|
BackgroundTransparency = 0.4,
|
|
ZIndex = baseZIndex + 1,
|
|
}
|
|
|
|
local clearAndResetDialog
|
|
local save
|
|
local saveLocal
|
|
local dontSave
|
|
local cancel
|
|
|
|
local messageBoxButtons = {
|
|
{
|
|
Text = "Save",
|
|
Style = Enum.ButtonStyle.RobloxButtonDefault,
|
|
Function = function()
|
|
save()
|
|
end,
|
|
},
|
|
{
|
|
Text = "Cancel",
|
|
Function = function()
|
|
cancel()
|
|
end,
|
|
},
|
|
{
|
|
Text = "Don't Save",
|
|
Function = function()
|
|
dontSave()
|
|
end,
|
|
},
|
|
}
|
|
|
|
local saveDialogMessageBox = RbxGui.CreateStyledMessageDialog(
|
|
"Unsaved Changes",
|
|
"Save your changes to Mercury before leaving?",
|
|
"Confirm",
|
|
messageBoxButtons
|
|
)
|
|
Hydrate(saveDialogMessageBox) {
|
|
Visible = true,
|
|
Parent = shield,
|
|
}
|
|
|
|
local errorBoxButtons = {}
|
|
|
|
local buttonOffset = 1
|
|
if game.LocalSaveEnabled then
|
|
errorBoxButtons[buttonOffset] = {}
|
|
errorBoxButtons[buttonOffset].Text = "Save to Disk"
|
|
errorBoxButtons[buttonOffset].Function = function()
|
|
saveLocal()
|
|
end
|
|
buttonOffset += 1
|
|
end
|
|
errorBoxButtons[buttonOffset] = {}
|
|
errorBoxButtons[buttonOffset].Text = "Keep Playing"
|
|
errorBoxButtons[buttonOffset].Function = function()
|
|
cancel()
|
|
end
|
|
errorBoxButtons[buttonOffset + 1] = {}
|
|
errorBoxButtons[buttonOffset + 1].Text = "Don't Save"
|
|
errorBoxButtons[buttonOffset + 1].Function = function()
|
|
dontSave()
|
|
end
|
|
|
|
local errorDialogMessageBox = RbxGui.CreateStyledMessageDialog(
|
|
"Upload Failed",
|
|
"Sorry, we could not save your changes to Mercury.",
|
|
"Error",
|
|
errorBoxButtons
|
|
)
|
|
errorDialogMessageBox.Visible = false
|
|
errorDialogMessageBox.Parent = shield
|
|
|
|
local spinnerDialog = New "Frame" {
|
|
Name = "SpinnerDialog",
|
|
Style = Enum.FrameStyle.RobloxRound,
|
|
Size = UDim2.new(0, 350, 0, 150),
|
|
Position = UDim2.new(0.5, -175, 0.5, -75),
|
|
Visible = false,
|
|
Active = true,
|
|
Parent = shield,
|
|
New "TextLabel" {
|
|
Name = "WaitingLabel",
|
|
Text = "Saving to Mercury...",
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0.5, 25, 0.5, 0),
|
|
TextColor3 = Color3.new(1, 1, 1),
|
|
},
|
|
}
|
|
|
|
local spinnerFrame = New "Frame" {
|
|
Name = "Spinner",
|
|
Size = UDim2.new(0, 80, 0, 80),
|
|
Position = UDim2.new(0.5, -150, 0.5, -40),
|
|
BackgroundTransparency = 1,
|
|
Parent = spinnerDialog,
|
|
}
|
|
|
|
local spinnerIcons = {}
|
|
for i = 1, 8 do
|
|
table.insert(
|
|
spinnerIcons,
|
|
New "ImageLabel" {
|
|
Name = "Spinner" .. i,
|
|
Size = UDim2.new(0, 16, 0, 16),
|
|
Position = UDim2.new(
|
|
0.5 + 0.3 * math.cos(math.rad(45 * i)),
|
|
-8,
|
|
0.5 + 0.3 * math.sin(math.rad(45 * i)),
|
|
-8
|
|
),
|
|
BackgroundTransparency = 1,
|
|
Image = "http://banland.xyz/asset?id=45880710",
|
|
Parent = spinnerFrame,
|
|
}
|
|
)
|
|
end
|
|
|
|
function save()
|
|
saveDialogMessageBox.Visible = false
|
|
|
|
--Show the spinner dialog
|
|
spinnerDialog.Visible = true
|
|
local spin = true
|
|
--Make it spin
|
|
delay(0, function()
|
|
local spinPos = 0
|
|
while spin do
|
|
local pos = 0
|
|
|
|
while pos < 8 do
|
|
if pos == spinPos or pos == ((spinPos + 1) % 8) then
|
|
spinnerIcons[pos + 1].Image =
|
|
"http://banland.xyz/asset?id=45880668"
|
|
else
|
|
spinnerIcons[pos + 1].Image =
|
|
"http://banland.xyz/asset?id=45880710"
|
|
end
|
|
|
|
pos += 1
|
|
end
|
|
spinPos = (spinPos + 1) % 8
|
|
wait(0.2)
|
|
end
|
|
end)
|
|
|
|
--Do the save while the spinner is going, function will wait
|
|
local result = game:SaveToRoblox()
|
|
if not result then
|
|
--Try once more
|
|
result = game:SaveToRoblox()
|
|
end
|
|
|
|
--Hide the spinner dialog
|
|
spinnerDialog.Visible = false
|
|
--And cause the delay thread to stop
|
|
spin = false
|
|
|
|
--Now process the result
|
|
if result then
|
|
--Success, close
|
|
game:FinishShutdown(false)
|
|
clearAndResetDialog()
|
|
else
|
|
--Failure, show the second dialog prompt
|
|
errorDialogMessageBox.Visible = true
|
|
end
|
|
end
|
|
|
|
function saveLocal()
|
|
errorDialogMessageBox.Visible = false
|
|
game:FinishShutdown(true)
|
|
clearAndResetDialog()
|
|
end
|
|
|
|
function dontSave()
|
|
saveDialogMessageBox.Visible = false
|
|
errorDialogMessageBox.Visible = false
|
|
game:FinishShutdown(false)
|
|
clearAndResetDialog()
|
|
end
|
|
function cancel()
|
|
saveDialogMessageBox.Visible = false
|
|
errorDialogMessageBox.Visible = false
|
|
clearAndResetDialog()
|
|
end
|
|
|
|
function clearAndResetDialog()
|
|
saveDialogMessageBox.Visible = true
|
|
errorDialogMessageBox.Visible = false
|
|
spinnerDialog.Visible = false
|
|
shield.Visible = false
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
end
|
|
|
|
robloxLock(shield)
|
|
shield.Visible = false
|
|
return shield
|
|
end
|
|
|
|
local function createReportAbuseDialog()
|
|
--Only show things if we are a NetworkClient
|
|
waitForChild(game, "NetworkClient")
|
|
|
|
waitForChild(game, "Players")
|
|
waitForProperty(game.Players, "LocalPlayer")
|
|
local localPlayer = game.Players.LocalPlayer
|
|
|
|
local reportAbuseButton
|
|
waitForChild(gui, "UserSettingsShield")
|
|
waitForChild(gui.UserSettingsShield, "Settings")
|
|
waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle")
|
|
waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu")
|
|
waitForChild(
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu,
|
|
"ReportAbuseButton"
|
|
)
|
|
reportAbuseButton =
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton
|
|
|
|
local shield = New "TextButton" {
|
|
Name = "ReportAbuseShield",
|
|
Text = "",
|
|
AutoButtonColor = false,
|
|
Active = true,
|
|
Visible = false,
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
BackgroundColor3 = Colour3(51, 51, 51),
|
|
BorderColor3 = Colour3(27, 42, 53),
|
|
BackgroundTransparency = 0.4,
|
|
ZIndex = baseZIndex + 1,
|
|
}
|
|
|
|
local closeAndResetDialog
|
|
|
|
local messageBoxButtons = {
|
|
{
|
|
Text = "Ok",
|
|
Modal = true,
|
|
Function = function()
|
|
closeAndResetDialog()
|
|
end,
|
|
},
|
|
}
|
|
|
|
local calmingMessageBox = Hydrate(
|
|
RbxGui.CreateMessageDialog(
|
|
"Thanks for your report!",
|
|
"Our moderators will review the chat logs and determine what happened. The other user is probably just trying to make you mad.\n\nIf anyone used swear words, inappropriate language, or threatened you in real life, please report them for Bad Words or Threats",
|
|
messageBoxButtons
|
|
)
|
|
) {
|
|
Visible = false,
|
|
Parent = shield,
|
|
}
|
|
|
|
local recordedMessageBox = Hydrate(
|
|
RbxGui.CreateMessageDialog(
|
|
"Thanks for your report!",
|
|
"We've recorded your report for evaluation.",
|
|
messageBoxButtons
|
|
)
|
|
) {
|
|
Visible = false,
|
|
Parent = shield,
|
|
}
|
|
|
|
local normalMessageBox = Hydrate(
|
|
RbxGui.CreateMessageDialog(
|
|
"Thanks for your report!",
|
|
"Our moderators will review the chat logs and determine what happened.",
|
|
messageBoxButtons
|
|
)
|
|
) {
|
|
Visible = false,
|
|
Parent = shield,
|
|
}
|
|
|
|
local frame = New "Frame" {
|
|
Name = "Settings",
|
|
Position = UDim2.new(0.5, -250, 0.5, -200),
|
|
Size = UDim2.new(0, 500, 0, 400),
|
|
BackgroundTransparency = 1,
|
|
Active = true,
|
|
Parent = shield,
|
|
}
|
|
|
|
local abusingPlayer
|
|
local abuse
|
|
local submitReportButton
|
|
|
|
local abuses = {
|
|
"Swearing",
|
|
"Bullying",
|
|
"Scamming",
|
|
"Dating",
|
|
"Cheating/Exploiting",
|
|
"Personal Questions",
|
|
"Offsite Links",
|
|
"Bad Model or Script",
|
|
"Bad Username",
|
|
}
|
|
local abuseDropDown, updateAbuseSelection = RbxGui.CreateDropDownMenu(
|
|
abuses,
|
|
function(abuseText)
|
|
abuse = abuseText
|
|
if abuse and abusingPlayer then
|
|
submitReportButton.Active = true
|
|
end
|
|
end,
|
|
true
|
|
)
|
|
|
|
local reportAbuseFrame = New "Frame" {
|
|
Name = "ReportAbuseStyle",
|
|
Size = UDim2.new(1, 0, 1, 0),
|
|
Style = Enum.FrameStyle.RobloxRound,
|
|
Active = true,
|
|
ZIndex = baseZIndex + 1,
|
|
Parent = frame,
|
|
New "TextLabel" {
|
|
Name = "Title",
|
|
Text = "Report Abuse",
|
|
TextColor3 = Colour3(221, 221, 221),
|
|
Position = UDim2.new(0.5, 0, 0, 30),
|
|
Font = Enum.Font.ArialBold,
|
|
FontSize = Enum.FontSize.Size36,
|
|
ZIndex = baseZIndex + 2,
|
|
},
|
|
New "TextLabel" {
|
|
Name = "Description",
|
|
Text = "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action.",
|
|
TextColor3 = Colour3(221, 221, 221),
|
|
Position = UDim2.new(0, 0, 0, 55),
|
|
Size = UDim2.new(1, 0, 0, 40),
|
|
BackgroundTransparency = 1,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
TextWrapped = true,
|
|
ZIndex = baseZIndex + 2,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Top,
|
|
},
|
|
New "TextLabel" {
|
|
Name = "PlayerLabel",
|
|
Text = "Which player?",
|
|
BackgroundTransparency = 1,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0.025, 0, 0, 100),
|
|
Size = UDim2.new(0.4, 0, 0, 36),
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
ZIndex = baseZIndex + 2,
|
|
},
|
|
New "TextLabel" {
|
|
Name = "AbuseLabel",
|
|
Text = "Type of Abuse:",
|
|
Font = Enum.Font.Arial,
|
|
BackgroundTransparency = 1,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0.025, 0, 0, 140),
|
|
Size = UDim2.new(0.4, 0, 0, 36),
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
ZIndex = baseZIndex + 2,
|
|
},
|
|
Hydrate(abuseDropDown) {
|
|
Name = "AbuseComboBox",
|
|
ZIndex = baseZIndex + 2,
|
|
Position = UDim2.new(0.425, 0, 0, 142),
|
|
Size = UDim2.new(0.55, 0, 0, 32),
|
|
},
|
|
New "TextLabel" {
|
|
Name = "ShortDescriptionLabel",
|
|
Text = "Short Description: (optional)",
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0.025, 0, 0, 180),
|
|
Size = UDim2.new(0.95, 0, 0, 36),
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
BackgroundTransparency = 1,
|
|
ZIndex = baseZIndex + 2,
|
|
},
|
|
}
|
|
|
|
local updatePlayerSelection
|
|
local function createPlayersDropDown()
|
|
local playerNames = {}
|
|
local nameToPlayer = {}
|
|
local children = Players:GetChildren()
|
|
local pos = 1
|
|
if children then
|
|
for _, player in ipairs(children) do
|
|
if player:IsA "Player" and player ~= localPlayer then
|
|
playerNames[pos] = player.Name
|
|
nameToPlayer[player.Name] = player
|
|
pos += 1
|
|
end
|
|
end
|
|
end
|
|
local playerDropDown
|
|
playerDropDown, updatePlayerSelection = RbxGui.CreateDropDownMenu(
|
|
playerNames,
|
|
function(playerName)
|
|
abusingPlayer = nameToPlayer[playerName]
|
|
if abuse and abusingPlayer then
|
|
submitReportButton.Active = true
|
|
end
|
|
end
|
|
)
|
|
|
|
return Hydrate(playerDropDown) {
|
|
Name = "PlayersComboBox",
|
|
ZIndex = baseZIndex + 2,
|
|
Position = UDim2.new(0.425, 0, 0, 102),
|
|
Size = UDim2.new(0.55, 0, 0, 32),
|
|
}
|
|
end
|
|
|
|
local shortDescriptionWrapper = New "Frame" {
|
|
Name = "ShortDescriptionWrapper",
|
|
Position = UDim2.new(0.025, 0, 0, 220),
|
|
Size = UDim2.new(0.95, 0, 1, -310),
|
|
BackgroundColor3 = Colour3(0, 0, 0),
|
|
BorderSizePixel = 0,
|
|
ZIndex = baseZIndex + 2,
|
|
Parent = reportAbuseFrame,
|
|
}
|
|
|
|
local shortDescriptionBox = New "TextBox" {
|
|
Name = "TextBox",
|
|
Text = "",
|
|
ClearTextOnFocus = false,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0, 3, 0, 3),
|
|
Size = UDim2.new(1, -6, 1, -6),
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Top,
|
|
TextWrapped = true,
|
|
BackgroundColor3 = Colour3(0, 0, 0),
|
|
BorderSizePixel = 0,
|
|
ZIndex = baseZIndex + 2,
|
|
Parent = shortDescriptionWrapper,
|
|
}
|
|
|
|
submitReportButton = New "TextButton" {
|
|
Name = "SubmitReportBtn",
|
|
Active = false,
|
|
Modal = true,
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0.1, 0, 1, -80),
|
|
Size = UDim2.new(0.35, 0, 0, 50),
|
|
AutoButtonColor = true,
|
|
Style = Enum.ButtonStyle.RobloxButtonDefault,
|
|
Text = "Submit Report",
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
ZIndex = baseZIndex + 2,
|
|
Parent = reportAbuseFrame,
|
|
}
|
|
|
|
submitReportButton.MouseButton1Click:connect(function()
|
|
if submitReportButton.Active then
|
|
if abuse and abusingPlayer then
|
|
frame.Visible = false
|
|
game.Players:ReportAbuse(
|
|
abusingPlayer,
|
|
abuse,
|
|
shortDescriptionBox.Text
|
|
)
|
|
if abuse == "Cheating/Exploiting" then
|
|
recordedMessageBox.Visible = true
|
|
elseif abuse == "Bullying" or abuse == "Swearing" then
|
|
calmingMessageBox.Visible = true
|
|
else
|
|
normalMessageBox.Visible = true
|
|
end
|
|
else
|
|
closeAndResetDialog()
|
|
end
|
|
end
|
|
end)
|
|
|
|
local cancelButton = New "TextButton" {
|
|
Name = "CancelBtn",
|
|
Font = Enum.Font.Arial,
|
|
FontSize = Enum.FontSize.Size18,
|
|
Position = UDim2.new(0.55, 0, 1, -80),
|
|
Size = UDim2.new(0.35, 0, 0, 50),
|
|
AutoButtonColor = true,
|
|
Style = Enum.ButtonStyle.RobloxButtonDefault,
|
|
Text = "Cancel",
|
|
TextColor3 = Colour3(255, 255, 255),
|
|
ZIndex = baseZIndex + 2,
|
|
Parent = reportAbuseFrame,
|
|
}
|
|
|
|
function closeAndResetDialog()
|
|
-- Delete old player combo box
|
|
local oldComboBox = reportAbuseFrame:FindFirstChild "PlayersComboBox"
|
|
if oldComboBox then
|
|
oldComboBox.Parent = nil
|
|
end
|
|
|
|
abusingPlayer = nil
|
|
updatePlayerSelection(nil)
|
|
abuse = nil
|
|
updateAbuseSelection(nil)
|
|
submitReportButton.Active = false
|
|
shortDescriptionBox.Text = ""
|
|
frame.Visible = true
|
|
calmingMessageBox.Visible = false
|
|
recordedMessageBox.Visible = false
|
|
normalMessageBox.Visible = false
|
|
shield.Visible = false
|
|
reportAbuseButton.Active = true
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
end
|
|
|
|
cancelButton.MouseButton1Click:connect(closeAndResetDialog)
|
|
|
|
reportAbuseButton.MouseButton1Click:connect(function()
|
|
createPlayersDropDown().Parent = reportAbuseFrame
|
|
table.insert(centerDialogs, shield)
|
|
game.GuiService:AddCenterDialog(
|
|
shield,
|
|
Enum.CenterDialogType.ModalDialog,
|
|
--ShowFunction
|
|
function()
|
|
reportAbuseButton.Active = false
|
|
shield.Visible = true
|
|
mainShield.Visible = false
|
|
end,
|
|
--HideFunction
|
|
function()
|
|
reportAbuseButton.Active = true
|
|
shield.Visible = false
|
|
end
|
|
)
|
|
end)
|
|
|
|
robloxLock(shield)
|
|
return shield
|
|
end
|
|
|
|
--Spawn a thread for the Save dialogs
|
|
local isSaveDialogSupported = pcall(function()
|
|
-- local var = game.LocalSaveEnabled
|
|
end)
|
|
if isSaveDialogSupported then
|
|
delay(0, function()
|
|
local saveDialogs = createSaveDialogs()
|
|
saveDialogs.Parent = gui
|
|
|
|
function game.RequestShutdown()
|
|
table.insert(centerDialogs, saveDialogs)
|
|
game.GuiService:AddCenterDialog(
|
|
saveDialogs,
|
|
Enum.CenterDialogType.QuitDialog,
|
|
--ShowFunction
|
|
function()
|
|
saveDialogs.Visible = true
|
|
end,
|
|
--HideFunction
|
|
function()
|
|
saveDialogs.Visible = false
|
|
end
|
|
)
|
|
|
|
return true
|
|
end
|
|
end)
|
|
end
|
|
|
|
--Spawn a thread for the Report Abuse dialogs
|
|
delay(0, function()
|
|
createReportAbuseDialog().Parent = gui
|
|
waitForChild(gui, "UserSettingsShield")
|
|
waitForChild(gui.UserSettingsShield, "Settings")
|
|
waitForChild(gui.UserSettingsShield.Settings, "SettingsStyle")
|
|
waitForChild(gui.UserSettingsShield.Settings.SettingsStyle, "GameMainMenu")
|
|
waitForChild(
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu,
|
|
"ReportAbuseButton"
|
|
)
|
|
gui.UserSettingsShield.Settings.SettingsStyle.GameMainMenu.ReportAbuseButton.Active =
|
|
true
|
|
end)
|