2380 lines
83 KiB
Plaintext
2380 lines
83 KiB
Plaintext
--rbxassetid%4%
|
|
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
|
|
|
|
--Include
|
|
local Create = assert(LoadLibrary("RbxUtility")).Create
|
|
|
|
|
|
-- A Few Script Globals
|
|
local gui
|
|
if script.Parent:FindFirstChild("ControlFrame") then
|
|
gui = script.Parent:FindFirstChild("ControlFrame")
|
|
else
|
|
gui = script.Parent
|
|
end
|
|
|
|
local helpButton = nil
|
|
local updateCameraDropDownSelection = nil
|
|
local updateVideoCaptureDropDownSelection = nil
|
|
local updateSmartCameraDropDownSelection = nil
|
|
local updateTouchMovementDropDownSelection = nil
|
|
local tweenTime = 0.2
|
|
|
|
local mouseLockLookScreenUrl = "http://www.roblox.com/asset?id=54071825"
|
|
local classicLookScreenUrl = "http://www.roblox.com/Asset?id=45915798"
|
|
|
|
local hasGraphicsSlider = true
|
|
local GraphicsQualityLevels = 10 -- how many levels we allow on graphics slider
|
|
local recordingVideo = false
|
|
|
|
local volumeFlagExists, volumeFlagValue = pcall(function () return settings():GetFFlag("VolumeControlInGameEnabled") end)
|
|
local hasVolumeSlider = volumeFlagExists and volumeFlagValue
|
|
|
|
local currentMenuSelection = nil
|
|
local lastMenuSelection = {}
|
|
|
|
local defaultPosition = UDim2.new(0,0,0,0)
|
|
|
|
local centerDialogs = {}
|
|
local mainShield = nil
|
|
|
|
local testReport = false
|
|
|
|
local inStudioMode = UserSettings().GameSettings:InStudioMode()
|
|
-- REMOVE WHEN NOT TESTING
|
|
-- inStudioMode = false
|
|
|
|
local macClient = false
|
|
local success, isMac = pcall(function() return not game.GuiService.IsWindows end)
|
|
macClient = success and isMac
|
|
-- REMOVE WHEN NOT TESTING
|
|
--macClient = true
|
|
|
|
local customCameraDefaultType = "Default (Classic)"
|
|
local touchClient = false
|
|
pcall(function() touchClient = game:GetService("UserInputService").TouchEnabled end)
|
|
-- REMOVE WHEN NOT TESTING
|
|
-- touchClient = true
|
|
if touchClient then
|
|
hasGraphicsSlider = false
|
|
customCameraDefaultType = "Default (Follow)"
|
|
end
|
|
|
|
local function Color3I(r,g,b)
|
|
return Color3.new(r/255,g/255,b/255)
|
|
end
|
|
|
|
local function robloxLock(instance)
|
|
instance.RobloxLocked = true
|
|
children = instance:GetChildren()
|
|
if children then
|
|
for i, child in ipairs(children) do
|
|
robloxLock(child)
|
|
end
|
|
end
|
|
end
|
|
|
|
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 = {}
|
|
pcall(function() game:GetService("UserInputService").OverrideMouseIconEnabled = false end)
|
|
end)
|
|
end
|
|
|
|
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()
|
|
local selectedMenu = false
|
|
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
|
|
|
|
function resetLocalCharacter()
|
|
local player = game.Players.LocalPlayer
|
|
if player then
|
|
if player.Character and player.Character:FindFirstChild("Humanoid") then
|
|
player.Character.Humanoid.Health = 0
|
|
end
|
|
end
|
|
end
|
|
|
|
local function createTextButton(text,style,fontSize,buttonSize,buttonPosition)
|
|
local newTextButton = Instance.new("TextButton")
|
|
newTextButton.Font = Enum.Font.SourceSansBold
|
|
newTextButton.FontSize = fontSize
|
|
newTextButton.Size = buttonSize
|
|
newTextButton.Position = buttonPosition
|
|
newTextButton.Style = style
|
|
newTextButton.TextColor3 = Color3.new(1,1,1)
|
|
newTextButton.Text = text
|
|
return newTextButton
|
|
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 i, obj in ipairs(buttonObjs) do
|
|
if obj == button then
|
|
obj.Style = Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
else
|
|
obj.Style = Enum.ButtonStyle.RobloxRoundButton
|
|
end
|
|
end
|
|
end
|
|
|
|
for i, obj in ipairs(buttons) do
|
|
local button = Instance.new("TextButton")
|
|
button.Name = "Button" .. buttonNum
|
|
button.Font = Enum.Font.SourceSansBold
|
|
button.FontSize = Enum.FontSize.Size18
|
|
button.AutoButtonColor = true
|
|
button.Style = Enum.ButtonStyle.RobloxRoundButton
|
|
button.Text = obj.Text
|
|
button.TextColor3 = Color3.new(1,1,1)
|
|
button.MouseButton1Click:connect(function() toggleSelection(button) obj.Function() end)
|
|
button.Parent = frame
|
|
button.ZIndex = 8
|
|
buttonObjs[buttonNum] = button
|
|
|
|
buttonNum = 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(.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(.35,0, ySize.Scale, ySize.Offset)
|
|
|
|
frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset)
|
|
frame.Button2.Size = UDim2.new(.35,0, ySize.Scale, ySize.Offset)
|
|
elseif numButtons >= 3 then
|
|
local spacing = .1 / numButtons
|
|
local buttonSize = .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 = buttonNum + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
function recordVideoClick(recordVideoButton, stopRecordButton)
|
|
recordingVideo = not recordingVideo
|
|
setRecordGui(recordingVideo, stopRecordButton, recordVideoButton)
|
|
end
|
|
|
|
local currentlyToggling = false;
|
|
local DevConsoleToggle = nil;
|
|
|
|
delay(0, function()
|
|
DevConsoleToggle = gui:WaitForChild("ToggleDevConsole")
|
|
end)
|
|
|
|
function toggleDeveloperConsole()
|
|
if not DevConsoleToggle then
|
|
return
|
|
end
|
|
|
|
DevConsoleToggle:Invoke()
|
|
end
|
|
|
|
function backToGame(buttonClicked, shield, settingsButton)
|
|
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)
|
|
settingsButton.Active = true
|
|
end
|
|
|
|
function setDisabledState(guiObject)
|
|
if not guiObject then return end
|
|
|
|
if guiObject:IsA("TextLabel") then
|
|
guiObject.TextTransparency = 0.9
|
|
elseif guiObject:IsA("TextButton") then
|
|
guiObject.TextTransparency = 0.9
|
|
guiObject.Active = false
|
|
else
|
|
if guiObject["ClassName"] then
|
|
print("setDisabledState() got object of unsupported type. object type is ",guiObject.ClassName)
|
|
end
|
|
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 = Instance.new("Frame")
|
|
shield.Name = "HelpDialogShield"
|
|
shield.Active = true
|
|
shield.Visible = false
|
|
shield.Size = UDim2.new(1,0,1,0)
|
|
shield.BackgroundColor3 = Color3I(51,51,51)
|
|
shield.BorderColor3 = Color3I(27,42,53)
|
|
shield.BackgroundTransparency = 0.4
|
|
shield.ZIndex = baseZIndex + 2
|
|
|
|
local helpDialog = Instance.new("Frame")
|
|
helpDialog.Name = "HelpDialog"
|
|
helpDialog.Style = Enum.FrameStyle.DropShadow
|
|
helpDialog.Position = UDim2.new(.2, 0, .2, 0)
|
|
helpDialog.Size = UDim2.new(0.6, 0, 0.6, 0)
|
|
helpDialog.Active = true
|
|
helpDialog.Parent = shield
|
|
helpDialog.ZIndex = baseZIndex + 2
|
|
|
|
local titleLabel = Instance.new("TextLabel")
|
|
titleLabel.Name = "Title"
|
|
titleLabel.Text = "Keyboard & Mouse Controls"
|
|
titleLabel.Font = Enum.Font.SourceSansBold
|
|
titleLabel.FontSize = Enum.FontSize.Size36
|
|
titleLabel.Position = UDim2.new(0, 0, 0.025, 0)
|
|
titleLabel.Size = UDim2.new(1, 0, 0, 40)
|
|
titleLabel.TextColor3 = Color3.new(1,1,1)
|
|
titleLabel.BackgroundTransparency = 1
|
|
titleLabel.Parent = helpDialog
|
|
titleLabel.ZIndex = baseZIndex + 2
|
|
|
|
local buttonRow = Instance.new("Frame")
|
|
buttonRow.Name = "Buttons"
|
|
buttonRow.Position = UDim2.new(0.1, 0, .07, 40)
|
|
buttonRow.Size = UDim2.new(0.8, 0, 0, 45)
|
|
buttonRow.BackgroundTransparency = 1
|
|
buttonRow.Parent = helpDialog
|
|
buttonRow.ZIndex = baseZIndex + 2
|
|
|
|
local imageFrame = Instance.new("Frame")
|
|
imageFrame.Name = "ImageFrame"
|
|
imageFrame.Position = UDim2.new(0.05, 0, 0.075, 80)
|
|
imageFrame.Size = UDim2.new(0.9, 0, .9, -120)
|
|
imageFrame.BackgroundTransparency = 1
|
|
imageFrame.Parent = helpDialog
|
|
imageFrame.ZIndex = baseZIndex + 2
|
|
|
|
local layoutFrame = Instance.new("Frame")
|
|
layoutFrame.Name = "LayoutFrame"
|
|
layoutFrame.Position = UDim2.new(0.5, 0, 0, 0)
|
|
layoutFrame.Size = UDim2.new(1.5, 0, 1, 0)
|
|
layoutFrame.BackgroundTransparency = 1
|
|
layoutFrame.SizeConstraint = Enum.SizeConstraint.RelativeYY
|
|
layoutFrame.Parent = imageFrame
|
|
layoutFrame.ZIndex = baseZIndex + 2
|
|
|
|
local image = Instance.new("ImageLabel")
|
|
image.Name = "Image"
|
|
if UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then
|
|
image.Image = mouseLockLookScreenUrl
|
|
else
|
|
image.Image = classicLookScreenUrl
|
|
end
|
|
image.Position = UDim2.new(-0.5, 0, 0, 0)
|
|
image.Size = UDim2.new(1, 0, 1, 0)
|
|
image.BackgroundTransparency = 1
|
|
image.Parent = layoutFrame
|
|
image.ZIndex = baseZIndex + 2
|
|
|
|
local buttons = {}
|
|
buttons[1] = {}
|
|
buttons[1].Text = "Look"
|
|
buttons[1].Function = function()
|
|
if UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then
|
|
image.Image = mouseLockLookScreenUrl
|
|
else
|
|
image.Image = classicLookScreenUrl
|
|
end
|
|
end
|
|
buttons[2] = {}
|
|
buttons[2].Text = "Move"
|
|
buttons[2].Function = function()
|
|
image.Image = "http://www.roblox.com/Asset?id=45915811"
|
|
end
|
|
buttons[3] = {}
|
|
buttons[3].Text = "Gear"
|
|
buttons[3].Function = function()
|
|
image.Image = "http://www.roblox.com/Asset?id=45917596"
|
|
end
|
|
buttons[4] = {}
|
|
buttons[4].Text = "Zoom"
|
|
buttons[4].Function = function()
|
|
image.Image = "http://www.roblox.com/Asset?id=45915825"
|
|
end
|
|
|
|
CreateTextButtons(buttonRow, buttons, UDim.new(0, 0), UDim.new(1,0))
|
|
|
|
local devConsoleButton = Create'TextButton'{
|
|
Name = "DeveloperConsoleButton";
|
|
Text = "Log";
|
|
Size = UDim2.new(0,60,0,30);
|
|
Style = Enum.ButtonStyle.RobloxRoundButton;
|
|
Position = UDim2.new(1,-65,1,-35);
|
|
Font = Enum.Font.SourceSansBold;
|
|
FontSize = Enum.FontSize.Size18;
|
|
TextColor3 = Color3.new(1,1,1);
|
|
ZIndex = baseZIndex + 4;
|
|
BackgroundTransparency = 1;
|
|
Parent = helpDialog;
|
|
}
|
|
|
|
Create'TextLabel'{
|
|
Name = "DeveloperConsoleButton";
|
|
Text = "F9";
|
|
Size = UDim2.new(0,14,0,14);
|
|
Position = UDim2.new(1,-6,0, -2);
|
|
Font = Enum.Font.SourceSansBold;
|
|
FontSize = Enum.FontSize.Size12;
|
|
TextColor3 = Color3.new(0,1,0);
|
|
ZIndex = baseZIndex + 4;
|
|
BackgroundTransparency = 1;
|
|
Parent = devConsoleButton;
|
|
}
|
|
|
|
waitForProperty(game.Players, "LocalPlayer")
|
|
game.Players.LocalPlayer:GetMouse().KeyDown:connect(function(key)
|
|
if string.byte(key) == 34 then --F9
|
|
toggleDeveloperConsole()
|
|
end
|
|
end)
|
|
|
|
devConsoleButton.MouseButton1Click:connect(function()
|
|
toggleDeveloperConsole()
|
|
shield.Visible = false
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
end)
|
|
|
|
-- 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" then return end
|
|
if buttonRow.Button1.Style == Enum.ButtonStyle.RobloxRoundDefaultButton then -- only change if this is the currently selected panel
|
|
if gui.UserSettingsShield.Settings.SettingsStyle.GameSettingsMenu.CameraField.DropDownMenuButton.Text == "Classic" then
|
|
image.Image = classicLookScreenUrl
|
|
else
|
|
image.Image = mouseLockLookScreenUrl
|
|
end
|
|
end
|
|
end)
|
|
end)
|
|
|
|
|
|
local okBtn = Instance.new("TextButton")
|
|
okBtn.Name = "OkBtn"
|
|
okBtn.Text = "OK"
|
|
okBtn.Modal = true
|
|
okBtn.Size = UDim2.new(0.3, 0, 0, 45)
|
|
okBtn.Position = UDim2.new(0.35, 0, .975, -50)
|
|
okBtn.Font = Enum.Font.SourceSansBold
|
|
okBtn.FontSize = Enum.FontSize.Size18
|
|
okBtn.BackgroundTransparency = 1
|
|
okBtn.TextColor3 = Color3.new(1,1,1)
|
|
okBtn.Style = Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
okBtn.ZIndex = baseZIndex + 2
|
|
okBtn.MouseButton1Click:connect(
|
|
function()
|
|
shield.Visible = false
|
|
game.GuiService:RemoveCenterDialog(shield)
|
|
end)
|
|
okBtn.Parent = helpDialog
|
|
|
|
robloxLock(shield)
|
|
return shield
|
|
end
|
|
|
|
local function createLeaveConfirmationMenu(baseZIndex,shield)
|
|
local frame = Instance.new("Frame")
|
|
frame.Name = "LeaveConfirmationMenu"
|
|
frame.BackgroundTransparency = 1
|
|
frame.Size = UDim2.new(1,0,1,0)
|
|
frame.Position = UDim2.new(0,0,2,400)
|
|
frame.ZIndex = baseZIndex + 4
|
|
|
|
local yesButton = createTextButton("Leave",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size24,UDim2.new(0,128,0,50),UDim2.new(0,313,0.8,0))
|
|
yesButton.Name = "YesButton"
|
|
yesButton.ZIndex = baseZIndex + 4
|
|
yesButton.Parent = frame
|
|
yesButton.Modal = true
|
|
yesButton:SetVerb("Exit")
|
|
|
|
local noButton = createTextButton("Stay",Enum.ButtonStyle.RobloxRoundDefaultButton,Enum.FontSize.Size24,UDim2.new(0,128,0,50),UDim2.new(0,90,0.8,0))
|
|
noButton.Name = "NoButton"
|
|
noButton.Parent = frame
|
|
noButton.ZIndex = baseZIndex + 4
|
|
noButton.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)
|
|
|
|
local leaveText = Instance.new("TextLabel")
|
|
leaveText.Name = "LeaveText"
|
|
leaveText.Text = "Leave this game?"
|
|
leaveText.Size = UDim2.new(1,0,0.8,0)
|
|
leaveText.TextWrap = true
|
|
leaveText.TextColor3 = Color3.new(1,1,1)
|
|
leaveText.Font = Enum.Font.SourceSansBold
|
|
leaveText.FontSize = Enum.FontSize.Size36
|
|
leaveText.BackgroundTransparency = 1
|
|
leaveText.ZIndex = baseZIndex + 4
|
|
leaveText.Parent = frame
|
|
|
|
return frame
|
|
end
|
|
|
|
local function createResetConfirmationMenu(baseZIndex,shield)
|
|
local frame = Instance.new("Frame")
|
|
frame.Name = "ResetConfirmationMenu"
|
|
frame.BackgroundTransparency = 1
|
|
frame.Size = UDim2.new(1,0,1,0)
|
|
frame.Position = UDim2.new(0,0,2,400)
|
|
frame.ZIndex = baseZIndex + 4
|
|
|
|
local yesButton = createTextButton("Reset",Enum.ButtonStyle.RobloxRoundDefaultButton,Enum.FontSize.Size24,UDim2.new(0,128,0,50),UDim2.new(0,313,0,280))
|
|
yesButton.Name = "YesButton"
|
|
yesButton.ZIndex = baseZIndex + 4
|
|
yesButton.Parent = frame
|
|
yesButton.Modal = true
|
|
yesButton.MouseButton1Click:connect(function()
|
|
resumeGameFunction(shield)
|
|
resetLocalCharacter()
|
|
end)
|
|
|
|
local noButton = createTextButton("Cancel",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size24,UDim2.new(0,128,0,50),UDim2.new(0,90,0,280))
|
|
noButton.Name = "NoButton"
|
|
noButton.Parent = frame
|
|
noButton.ZIndex = baseZIndex + 4
|
|
noButton.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)
|
|
|
|
local resetCharacterText = Instance.new("TextLabel")
|
|
resetCharacterText.Name = "ResetCharacterText"
|
|
resetCharacterText.Text = "Are you sure you want to reset your character?"
|
|
resetCharacterText.Size = UDim2.new(1,0,0.8,0)
|
|
resetCharacterText.TextWrap = true
|
|
resetCharacterText.TextColor3 = Color3.new(1,1,1)
|
|
resetCharacterText.Font = Enum.Font.SourceSansBold
|
|
resetCharacterText.FontSize = Enum.FontSize.Size36
|
|
resetCharacterText.BackgroundTransparency = 1
|
|
resetCharacterText.ZIndex = baseZIndex + 4
|
|
resetCharacterText.Parent = frame
|
|
|
|
local fineResetCharacterText = resetCharacterText:Clone()
|
|
fineResetCharacterText.Name = "FineResetCharacterText"
|
|
fineResetCharacterText.Text = "You will be put back on a spawn point"
|
|
fineResetCharacterText.Size = UDim2.new(0,303,0,18)
|
|
fineResetCharacterText.Position = UDim2.new(0, 109, 0, 215)
|
|
fineResetCharacterText.FontSize = Enum.FontSize.Size18
|
|
fineResetCharacterText.Parent = frame
|
|
|
|
return frame
|
|
end
|
|
|
|
local function createGameMainMenu(baseZIndex, shield)
|
|
|
|
local buttonTop = 54
|
|
|
|
local gameMainMenuFrame = Instance.new("Frame")
|
|
gameMainMenuFrame.Name = "GameMainMenu"
|
|
gameMainMenuFrame.BackgroundTransparency = 1
|
|
gameMainMenuFrame.Size = UDim2.new(1,0,1,0)
|
|
gameMainMenuFrame.ZIndex = baseZIndex + 4
|
|
gameMainMenuFrame.Parent = settingsFrame
|
|
|
|
-- GameMainMenu Children
|
|
|
|
-- RESUME GAME
|
|
local resumeGameButton = createTextButton("Resume Game",Enum.ButtonStyle.RobloxRoundDefaultButton,Enum.FontSize.Size24,UDim2.new(0,340,0,50),UDim2.new(0.5,-170,0,buttonTop))
|
|
resumeGameButton.Name = "resumeGameButton"
|
|
resumeGameButton.ZIndex = baseZIndex + 4
|
|
resumeGameButton.Parent = gameMainMenuFrame
|
|
resumeGameButton.Modal = true
|
|
resumeGameButton.MouseButton1Click:connect(function() resumeGameFunction(shield) end)
|
|
buttonTop = buttonTop + 51
|
|
|
|
-- RESET CHARACTER
|
|
local resetButton = createTextButton("Reset Character",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size24,UDim2.new(0,340,0,50),UDim2.new(0.5,-170,0,buttonTop))
|
|
resetButton.Name = "ResetButton"
|
|
resetButton.ZIndex = baseZIndex + 4
|
|
resetButton.Parent = gameMainMenuFrame
|
|
buttonTop = buttonTop + 51
|
|
|
|
-- GAME SETTINGS
|
|
local gameSettingsButton = createTextButton("Game Settings",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size24,UDim2.new(0,340,0,50),UDim2.new(0.5,-170,0,buttonTop))
|
|
gameSettingsButton.Name = "SettingsButton"
|
|
gameSettingsButton.ZIndex = baseZIndex + 4
|
|
gameSettingsButton.Parent = gameMainMenuFrame
|
|
buttonTop = buttonTop + 51
|
|
|
|
-- HELP BUTTON
|
|
local robloxHelpButton = createTextButton("Help",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size18,UDim2.new(0,164,0,50),UDim2.new(0,92,0,buttonTop))
|
|
robloxHelpButton.Name = "HelpButton"
|
|
robloxHelpButton.ZIndex = baseZIndex + 4
|
|
robloxHelpButton.Parent = gameMainMenuFrame
|
|
robloxHelpButton.Visible = not touchClient
|
|
if macClient or touchClient then
|
|
robloxHelpButton.Size = UDim2.new(0,340,0,50)
|
|
robloxHelpButton.FontSize = Enum.FontSize.Size24
|
|
end
|
|
|
|
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
|
|
|
|
-- SCREEN SHOT
|
|
local screenshotButton = createTextButton("Screenshot",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size18,UDim2.new(0,168,0,50),UDim2.new(0,264,0,buttonTop))
|
|
screenshotButton.Name = "ScreenshotButton"
|
|
screenshotButton.ZIndex = baseZIndex + 4
|
|
screenshotButton.Parent = gameMainMenuFrame
|
|
screenshotButton.Visible = not macClient and not touchClient
|
|
screenshotButton:SetVerb("Screenshot")
|
|
|
|
if not touchClient then
|
|
buttonTop = buttonTop + 51
|
|
end
|
|
|
|
-- REPORT ABUSE
|
|
local reportAbuseButton = createTextButton("Report Abuse",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size18,UDim2.new(0,164,0,50),UDim2.new(0,92,0,buttonTop))
|
|
reportAbuseButton.Name = "ReportAbuseButton"
|
|
reportAbuseButton.ZIndex = baseZIndex + 4
|
|
reportAbuseButton.Parent = gameMainMenuFrame
|
|
if macClient or touchClient then
|
|
reportAbuseButton.Size = UDim2.new(0,340,0,50)
|
|
reportAbuseButton.FontSize = Enum.FontSize.Size24
|
|
end
|
|
|
|
-- RECORD VIDEO
|
|
local recordVideoButton = createTextButton("Record Video",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size18,UDim2.new(0,168,0,50),UDim2.new(0,264,0,buttonTop))
|
|
recordVideoButton.Name = "RecordVideoButton"
|
|
recordVideoButton.ZIndex = baseZIndex + 4
|
|
recordVideoButton.Parent = gameMainMenuFrame
|
|
recordVideoButton.Visible = not macClient and not touchClient
|
|
recordVideoButton:SetVerb("RecordToggle")
|
|
|
|
local stopRecordButton = Instance.new("ImageButton")
|
|
stopRecordButton.Name = "StopRecordButton"
|
|
stopRecordButton.BackgroundTransparency = 1
|
|
stopRecordButton.Image = "rbxasset://textures/ui/RecordStop.png"
|
|
stopRecordButton.Size = UDim2.new(0,59,0,27)
|
|
stopRecordButton:SetVerb("RecordToggle")
|
|
|
|
stopRecordButton.MouseButton1Click:connect(function() recordVideoClick(recordVideoButton, stopRecordButton) end)
|
|
stopRecordButton.Visible = false
|
|
stopRecordButton.Parent = gui
|
|
buttonTop = buttonTop + 51
|
|
|
|
-- LEAVE GAME
|
|
local leaveGameButton = createTextButton("Leave Game",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size24,UDim2.new(0,340,0,50),UDim2.new(0.5,-170,0,buttonTop))
|
|
leaveGameButton.Name = "LeaveGameButton"
|
|
leaveGameButton.ZIndex = baseZIndex + 4
|
|
leaveGameButton.Parent = gameMainMenuFrame
|
|
|
|
return gameMainMenuFrame
|
|
end
|
|
|
|
local function createGameSettingsMenu(baseZIndex, shield)
|
|
local gameSettingsMenuFrame = Instance.new("Frame")
|
|
gameSettingsMenuFrame.Name = "GameSettingsMenu"
|
|
gameSettingsMenuFrame.BackgroundTransparency = 1
|
|
gameSettingsMenuFrame.Size = UDim2.new(1,0,1,0)
|
|
gameSettingsMenuFrame.ZIndex = baseZIndex + 4
|
|
|
|
local itemTop = 0
|
|
if game:GetService("GuiService"):GetScreenResolution().y <= 500 then
|
|
itemTop = 50
|
|
end
|
|
----------------------------------------------------------------------------------------------------
|
|
-- C A M E R A C O N T R O L S
|
|
----------------------------------------------------------------------------------------------------
|
|
|
|
if not touchClient then
|
|
local cameraLabel = Instance.new("TextLabel")
|
|
cameraLabel.Name = "CameraLabel"
|
|
cameraLabel.Text = "Character & Camera Controls"
|
|
cameraLabel.Font = Enum.Font.SourceSansBold
|
|
cameraLabel.FontSize = Enum.FontSize.Size18
|
|
cameraLabel.Position = UDim2.new(0,31,0,itemTop + 6)
|
|
cameraLabel.Size = UDim2.new(0,224,0,18)
|
|
cameraLabel.TextColor3 = Color3I(255,255,255)
|
|
cameraLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
cameraLabel.BackgroundTransparency = 1
|
|
cameraLabel.ZIndex = baseZIndex + 4
|
|
cameraLabel.Parent = gameSettingsMenuFrame
|
|
|
|
local mouseLockLabel = game.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()
|
|
if mouseLockLabel and UserSettings().GameSettings.ControlMode == Enum.ControlMode["Mouse Lock Switch"] then
|
|
mouseLockLabel.Visible = true
|
|
elseif mouseLockLabel then
|
|
mouseLockLabel.Visible = false
|
|
end
|
|
end)
|
|
end, false, true, baseZIndex)
|
|
cameraDropDown.Name = "CameraField"
|
|
cameraDropDown.ZIndex = baseZIndex + 4
|
|
cameraDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4
|
|
cameraDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4
|
|
cameraDropDown.Position = UDim2.new(0, 270, 0, itemTop)
|
|
cameraDropDown.Size = UDim2.new(0,200,0,32)
|
|
cameraDropDown.Parent = gameSettingsMenuFrame
|
|
|
|
itemTop = itemTop + 35
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- V I D E O C A P T U R E S E T T I N G S
|
|
----------------------------------------------------------------------------------------------------
|
|
|
|
local syncVideoCaptureSetting = nil
|
|
|
|
if not macClient and not touchClient then
|
|
local videoCaptureLabel = Instance.new("TextLabel")
|
|
videoCaptureLabel.Name = "VideoCaptureLabel"
|
|
videoCaptureLabel.Text = "After Capturing Video"
|
|
videoCaptureLabel.Font = Enum.Font.SourceSansBold
|
|
videoCaptureLabel.FontSize = Enum.FontSize.Size18
|
|
videoCaptureLabel.Position = UDim2.new(0,32,0,itemTop + 6)
|
|
videoCaptureLabel.Size = UDim2.new(0,164,0,18)
|
|
videoCaptureLabel.BackgroundTransparency = 1
|
|
videoCaptureLabel.TextColor3 = Color3I(255,255,255)
|
|
videoCaptureLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
videoCaptureLabel.ZIndex = baseZIndex + 4
|
|
videoCaptureLabel.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 = nil
|
|
videoCaptureDropDown, updateVideoCaptureDropDownSelection = RbxGui.CreateDropDownMenu(videoNames,
|
|
function(text)
|
|
UserSettings().GameSettings.VideoUploadPromptBehavior = videoNameToItem[text]
|
|
end, false, true, baseZIndex)
|
|
videoCaptureDropDown.Name = "VideoCaptureField"
|
|
videoCaptureDropDown.ZIndex = baseZIndex + 4
|
|
videoCaptureDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4
|
|
videoCaptureDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4
|
|
videoCaptureDropDown.Position = UDim2.new(0, 270, 0, itemTop)
|
|
videoCaptureDropDown.Size = UDim2.new(0,200,0,32)
|
|
videoCaptureDropDown.Parent = gameSettingsMenuFrame
|
|
|
|
syncVideoCaptureSetting = function()
|
|
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
|
|
itemTop = itemTop + 35
|
|
end
|
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- C U S T O M C A M E R A C O N T R O L S
|
|
----------------------------------------------------------------------------------------------------
|
|
|
|
local smartCameraLabel = Instance.new("TextLabel")
|
|
smartCameraLabel.Name = "SmartCameraLabel"
|
|
smartCameraLabel.Text = "Camera Mode"
|
|
smartCameraLabel.Font = Enum.Font.SourceSansBold
|
|
smartCameraLabel.FontSize = Enum.FontSize.Size18
|
|
smartCameraLabel.Position = UDim2.new(0,31,0,itemTop + 6)
|
|
smartCameraLabel.Size = UDim2.new(0,224,0,18)
|
|
smartCameraLabel.TextColor3 = Color3I(255,255,255)
|
|
smartCameraLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
smartCameraLabel.BackgroundTransparency = 1
|
|
smartCameraLabel.ZIndex = baseZIndex + 4
|
|
smartCameraLabel.Parent = gameSettingsMenuFrame
|
|
|
|
local smartEnumItems = nil
|
|
smartEnumItems = Enum.CustomCameraMode:GetEnumItems()
|
|
|
|
local smartEnumNames = {}
|
|
local smartEnumNameToItem = {}
|
|
|
|
for i,obj in pairs(smartEnumItems) do
|
|
local displayName = obj.Name
|
|
if (obj.Name == "Default") then
|
|
displayName = customCameraDefaultType
|
|
end
|
|
smartEnumNames[i] = displayName
|
|
smartEnumNameToItem[displayName] = obj.Value
|
|
end
|
|
|
|
local smartCameraDropDown
|
|
smartCameraDropDown, updateSmartCameraDropDownSelection = RbxGui.CreateDropDownMenu(smartEnumNames,
|
|
function(text)
|
|
UserSettings().GameSettings.CameraMode = smartEnumNameToItem[text]
|
|
end, false, true, baseZIndex)
|
|
smartCameraDropDown.Name = "SmartCameraField"
|
|
smartCameraDropDown.ZIndex = baseZIndex + 4
|
|
smartCameraDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4
|
|
smartCameraDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4
|
|
smartCameraDropDown.Position = UDim2.new(0, 270, 0, itemTop)
|
|
smartCameraDropDown.Size = UDim2.new(0,200,0,32)
|
|
smartCameraDropDown.Parent = gameSettingsMenuFrame
|
|
|
|
itemTop = itemTop + 35
|
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- T O U C H M O V E M E N T C O N T R O L S
|
|
----------------------------------------------------------------------------------------------------
|
|
if (touchClient) then
|
|
local touchMovementLabel = Instance.new("TextLabel")
|
|
touchMovementLabel.Name = "TouchMovementLabel"
|
|
touchMovementLabel.Text = "Movement Mode"
|
|
touchMovementLabel.Font = Enum.Font.SourceSansBold
|
|
touchMovementLabel.FontSize = Enum.FontSize.Size18
|
|
touchMovementLabel.Position = UDim2.new(0,31,0,itemTop + 6)
|
|
touchMovementLabel.Size = UDim2.new(0,224,0,18)
|
|
touchMovementLabel.TextColor3 = Color3I(255,255,255)
|
|
touchMovementLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
touchMovementLabel.BackgroundTransparency = 1
|
|
touchMovementLabel.ZIndex = baseZIndex + 4
|
|
touchMovementLabel.Parent = gameSettingsMenuFrame
|
|
|
|
local touchEnumItems = Enum.TouchMovementMode:GetEnumItems()
|
|
local touchEnumNames = {}
|
|
local touchEnumNameToItem = {}
|
|
for i,obj in ipairs(touchEnumItems) do
|
|
local displayName = obj.Name
|
|
if (obj.Name == "Default") then
|
|
displayName = "Default (Thumbstick)"
|
|
end
|
|
touchEnumNames[i] = displayName
|
|
touchEnumNameToItem[displayName] = obj
|
|
end
|
|
|
|
local touchMovementDropDown
|
|
touchMovementDropDown, updateTouchMovementDropDownSelection = RbxGui.CreateDropDownMenu(touchEnumNames,
|
|
function(text)
|
|
UserSettings().GameSettings.TouchMovementMode = touchEnumNameToItem[text]
|
|
end, false, true, baseZIndex)
|
|
touchMovementDropDown.Name = "touchMovementField"
|
|
touchMovementDropDown.ZIndex = baseZIndex + 4
|
|
touchMovementDropDown.DropDownMenuButton.ZIndex = baseZIndex + 4
|
|
touchMovementDropDown.DropDownMenuButton.Icon.ZIndex = baseZIndex + 4
|
|
touchMovementDropDown.Position = UDim2.new(0, 270, 0, itemTop)
|
|
touchMovementDropDown.Size = UDim2.new(0,200,0,32)
|
|
touchMovementDropDown.Parent = gameSettingsMenuFrame
|
|
|
|
itemTop = itemTop + 35
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- F U L L S C R E E N M O D E
|
|
----------------------------------------------------------------------------------------------------
|
|
|
|
local fullscreenText = nil
|
|
local fullscreenShortcut = nil
|
|
local fullscreenCheckbox = nil
|
|
|
|
if not touchClient then
|
|
|
|
itemTop = itemTop + 15
|
|
|
|
fullscreenText = Instance.new("TextLabel")
|
|
fullscreenText.Name = "FullscreenText"
|
|
fullscreenText.Text = "Fullscreen Mode"
|
|
|
|
fullscreenText.Position = UDim2.new(0,31,0,itemTop + 6)
|
|
fullscreenText.Size = UDim2.new(0,224,0,18)
|
|
|
|
fullscreenText.Font = Enum.Font.SourceSansBold
|
|
fullscreenText.FontSize = Enum.FontSize.Size18
|
|
fullscreenText.TextXAlignment = Enum.TextXAlignment.Left
|
|
fullscreenText.TextColor3 = Color3.new(1,1,1)
|
|
fullscreenText.ZIndex = baseZIndex + 4
|
|
fullscreenText.BackgroundTransparency = 1
|
|
fullscreenText.Parent = gameSettingsMenuFrame
|
|
|
|
fullscreenCheckbox = createTextButton("",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size18,UDim2.new(0,32,0,32),UDim2.new(0, 270, 0, itemTop- 4))
|
|
fullscreenCheckbox.Name = "FullscreenCheckbox"
|
|
fullscreenCheckbox.ZIndex = baseZIndex + 4
|
|
fullscreenCheckbox.Parent = gameSettingsMenuFrame
|
|
fullscreenCheckbox:SetVerb("ToggleFullScreen")
|
|
if UserSettings().GameSettings:InFullScreen() then fullscreenCheckbox.Text = "X" end
|
|
if hasGraphicsSlider then
|
|
UserSettings().GameSettings.FullscreenChanged:connect(function(isFullscreen)
|
|
if isFullscreen then
|
|
fullscreenCheckbox.Text = "X"
|
|
else
|
|
fullscreenCheckbox.Text = ""
|
|
end
|
|
end)
|
|
else
|
|
fullscreenCheckbox.MouseButton1Click:connect(function()
|
|
if fullscreenCheckbox.Text == "" then
|
|
fullscreenCheckbox.Text = "X"
|
|
else
|
|
fullscreenCheckbox.Text = ""
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- G R A P H I C S S L I D E R
|
|
----------------------------------------------------------------------------------------------------
|
|
local graphicsSlider, graphicsLevel = nil
|
|
if hasGraphicsSlider then
|
|
local graphicsQualityYOffset = -45
|
|
|
|
local qualityText = Instance.new("TextLabel")
|
|
qualityText.Name = "QualityText"
|
|
qualityText.Text = "Graphics Quality"
|
|
qualityText.Size = UDim2.new(0,224,0,18)
|
|
qualityText.Position = UDim2.new(0,31,0,239 + graphicsQualityYOffset)
|
|
|
|
qualityText.TextXAlignment = Enum.TextXAlignment.Left
|
|
qualityText.Font = Enum.Font.SourceSansBold
|
|
qualityText.FontSize = Enum.FontSize.Size18
|
|
qualityText.TextColor3 = Color3.new(1,1,1)
|
|
qualityText.ZIndex = baseZIndex + 4
|
|
qualityText.BackgroundTransparency = 1
|
|
qualityText.Parent = gameSettingsMenuFrame
|
|
qualityText.Visible = not inStudioMode
|
|
|
|
local autoText = qualityText:clone()
|
|
autoText.Name = "AutoText"
|
|
autoText.Text = "Auto"
|
|
autoText.Position = UDim2.new(0,270,0,214 + graphicsQualityYOffset)
|
|
autoText.TextColor3 = Color3.new(128/255,128/255,128/255)
|
|
autoText.Size = UDim2.new(0,34,0,18)
|
|
autoText.Parent = gameSettingsMenuFrame
|
|
autoText.Visible = not inStudioMode
|
|
|
|
local fasterText = autoText:clone()
|
|
fasterText.Name = "FasterText"
|
|
fasterText.Text = "Faster"
|
|
fasterText.Position = UDim2.new(0,185,0,274 + graphicsQualityYOffset)
|
|
fasterText.TextColor3 = Color3.new(95,95,95)
|
|
fasterText.FontSize = Enum.FontSize.Size14
|
|
fasterText.Parent = gameSettingsMenuFrame
|
|
fasterText.Visible = not inStudioMode
|
|
|
|
local betterQualityText = autoText:clone()
|
|
betterQualityText.Name = "BetterQualityText"
|
|
betterQualityText.Text = "Better Quality"
|
|
betterQualityText.TextWrap = true
|
|
betterQualityText.Size = UDim2.new(0,41,0,28)
|
|
betterQualityText.Position = UDim2.new(0,390,0,269 + graphicsQualityYOffset)
|
|
betterQualityText.TextColor3 = Color3.new(95,95,95)
|
|
betterQualityText.FontSize = Enum.FontSize.Size14
|
|
betterQualityText.Parent = gameSettingsMenuFrame
|
|
betterQualityText.Visible = not inStudioMode
|
|
|
|
local autoGraphicsButton = createTextButton("X",Enum.ButtonStyle.RobloxRoundButton,Enum.FontSize.Size18,UDim2.new(0,32,0,32),UDim2.new(0,270,0,230 + graphicsQualityYOffset))
|
|
autoGraphicsButton.Name = "AutoGraphicsButton"
|
|
autoGraphicsButton.ZIndex = baseZIndex + 4
|
|
autoGraphicsButton.Parent = gameSettingsMenuFrame
|
|
autoGraphicsButton.Visible = not inStudioMode
|
|
|
|
graphicsSlider, graphicsLevel = RbxGui.CreateSliderNew(GraphicsQualityLevels,150,UDim2.new(0, 230, 0, 280 + graphicsQualityYOffset)) -- graphics - 1 because slider starts at 1 instead of 0
|
|
graphicsSlider.Parent = gameSettingsMenuFrame
|
|
graphicsSlider.Bar.ZIndex = baseZIndex + 4
|
|
graphicsSlider.Bar.Slider.ZIndex = baseZIndex + 5
|
|
graphicsSlider.Visible = not inStudioMode
|
|
graphicsLevel.Value = math.floor((settings().Rendering:GetMaxQualityLevel() - 1)/2)
|
|
|
|
local graphicsSetter = Instance.new("TextBox")
|
|
graphicsSetter.Name = "GraphicsSetter"
|
|
graphicsSetter.BackgroundColor3 = Color3.new(0,0,0)
|
|
graphicsSetter.BorderColor3 = Color3.new(128/255,128/255,128/255)
|
|
graphicsSetter.Size = UDim2.new(0,50,0,25)
|
|
graphicsSetter.Position = UDim2.new(0,450,0,269 + graphicsQualityYOffset)
|
|
graphicsSetter.TextColor3 = Color3.new(1,1,1)
|
|
graphicsSetter.Font = Enum.Font.SourceSansBold
|
|
graphicsSetter.FontSize = Enum.FontSize.Size18
|
|
graphicsSetter.Text = "Auto"
|
|
graphicsSetter.ZIndex = 1
|
|
graphicsSetter.TextWrap = true
|
|
graphicsSetter.Parent = gameSettingsMenuFrame
|
|
graphicsSetter.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
|
|
fasterText.ZIndex = 1
|
|
graphicsSlider.Bar.ZIndex = 1
|
|
graphicsSlider.BarLeft.ZIndex = 1
|
|
graphicsSlider.BarRight.ZIndex = 1
|
|
graphicsSlider.Bar.Fill.ZIndex = 1
|
|
graphicsSlider.FillLeft.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 + 6
|
|
graphicsSlider.BarLeft.ZIndex = baseZIndex + 4
|
|
graphicsSlider.BarRight.ZIndex = baseZIndex + 4
|
|
graphicsSlider.Bar.Fill.ZIndex = baseZIndex + 5
|
|
graphicsSlider.FillLeft.ZIndex = baseZIndex + 5
|
|
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
|
|
betterQualityText.ZIndex = baseZIndex + 4
|
|
fasterText.ZIndex = baseZIndex + 4
|
|
graphicsSetter.ZIndex = baseZIndex + 4
|
|
end
|
|
|
|
local function hideManualGraphics()
|
|
betterQualityText.ZIndex = 1
|
|
fasterText.ZIndex = 1
|
|
graphicsSlider.Bar.ZIndex = 1
|
|
graphicsSlider.Bar.Slider.ZIndex = 1
|
|
graphicsSetter.ZIndex = 1
|
|
end
|
|
|
|
local function translateSavedQualityLevelToInt(savedQualityLevel)
|
|
if savedQualityLevel == Enum.SavedQualitySetting.Automatic then
|
|
return 0
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel1 then
|
|
return 1
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel2 then
|
|
return 2
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel3 then
|
|
return 3
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel4 then
|
|
return 4
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel5 then
|
|
return 5
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel6 then
|
|
return 6
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel7 then
|
|
return 7
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel8 then
|
|
return 8
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel9 then
|
|
return 9
|
|
elseif savedQualityLevel == Enum.SavedQualitySetting.QualityLevel10 then
|
|
return 10
|
|
end
|
|
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(prop)
|
|
if isAutoGraphics then return end
|
|
if 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 end
|
|
|
|
if not isAutoGraphics then
|
|
goToAutoGraphics()
|
|
else
|
|
goToManualGraphics(graphicsLevel.Value)
|
|
end
|
|
end)
|
|
|
|
local lastUpdate = nil
|
|
game.GraphicsQualityChangeRequest:connect(function(graphicsIncrease)
|
|
if isAutoGraphics then return end -- only can set graphics in manual mode
|
|
|
|
if graphicsIncrease then
|
|
if (graphicsLevel.Value + 1) > GraphicsQualityLevels then return end
|
|
graphicsLevel.Value = graphicsLevel.Value + 1
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
|
|
game:GetService("GuiService"):SendNotification("Graphics Quality",
|
|
"Increased to (" .. graphicsSetter.Text .. ")",
|
|
"",
|
|
2,
|
|
function()
|
|
end)
|
|
else
|
|
if (graphicsLevel.Value - 1) <= 0 then return end
|
|
graphicsLevel.Value = graphicsLevel.Value - 1
|
|
graphicsSetter.Text = tostring(graphicsLevel.Value)
|
|
setGraphicsQualityLevel(graphicsLevel.Value)
|
|
|
|
game:GetService("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 wasManualGraphics = (settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic)
|
|
if inStudioMode and not game.Players.LocalPlayer then
|
|
disableGraphicsWidget()
|
|
elseif inStudioMode then
|
|
enableGraphicsWidget()
|
|
end
|
|
if hasGraphicsSlider then
|
|
UserSettings().GameSettings.StudioModeChanged:connect(function(isStudioMode)
|
|
inStudioMode = isStudioMode
|
|
if isStudioMode then
|
|
wasManualGraphics = (settings().Rendering.QualityLevel ~= Enum.QualityLevel.Automatic)
|
|
goToAutoGraphics()
|
|
autoGraphicsButton.ZIndex = 1
|
|
autoText.ZIndex = 1
|
|
else
|
|
if wasManualGraphics then
|
|
goToManualGraphics()
|
|
end
|
|
autoGraphicsButton.ZIndex = baseZIndex + 4
|
|
autoText.ZIndex = baseZIndex + 4
|
|
end
|
|
end)
|
|
end
|
|
|
|
if graphicsSlider and graphicsSlider.Bar and graphicsSlider.Visible then
|
|
itemTop = graphicsSlider.Bar.Position.Y.Offset + 20
|
|
end
|
|
end
|
|
----------------------------------------------------------------------------------------------------
|
|
-- V O L U M E S L I D E R
|
|
----------------------------------------------------------------------------------------------------
|
|
if hasVolumeSlider then
|
|
local maxVolumeLevel = 256
|
|
|
|
local volumeText = Instance.new("TextLabel")
|
|
volumeText.Name = "VolumeText"
|
|
volumeText.Text = "Volume"
|
|
volumeText.Size = UDim2.new(0,224,0,18)
|
|
|
|
local volumeTextOffset = 25
|
|
if graphicsSlider and not graphicsSlider.Visible then
|
|
volumeTextOffset = volumeTextOffset + 30
|
|
end
|
|
volumeText.Position = UDim2.new(0,31,0, itemTop + volumeTextOffset)
|
|
|
|
volumeText.TextXAlignment = Enum.TextXAlignment.Left
|
|
volumeText.Font = Enum.Font.SourceSansBold
|
|
volumeText.FontSize = Enum.FontSize.Size18
|
|
volumeText.TextColor3 = Color3.new(1,1,1)
|
|
volumeText.ZIndex = baseZIndex + 4
|
|
volumeText.BackgroundTransparency = 1
|
|
volumeText.Parent = gameSettingsMenuFrame
|
|
volumeText.Visible = true
|
|
|
|
local volumeSliderOffset = 32
|
|
if graphicsSlider and not graphicsSlider.Visible then
|
|
volumeSliderOffset = volumeSliderOffset + 30
|
|
end
|
|
local volumeSlider, volumeLevel = RbxGui.CreateSliderNew( maxVolumeLevel,256,UDim2.new(0, 180, 0, itemTop + volumeSliderOffset) )
|
|
volumeSlider.Parent = gameSettingsMenuFrame
|
|
volumeSlider.Bar.ZIndex = baseZIndex + 3
|
|
volumeSlider.Bar.Slider.ZIndex = baseZIndex + 4
|
|
volumeSlider.BarLeft.ZIndex = baseZIndex + 3
|
|
volumeSlider.BarRight.ZIndex = baseZIndex + 3
|
|
volumeSlider.Bar.Fill.ZIndex = baseZIndex + 3
|
|
volumeSlider.FillLeft.ZIndex = baseZIndex + 3
|
|
volumeSlider.Visible = true
|
|
volumeLevel.Value = math.min(math.max(UserSettings().GameSettings.MasterVolume * maxVolumeLevel, 1), maxVolumeLevel)
|
|
|
|
volumeLevel.Changed:connect(function(prop)
|
|
local volume = volumeLevel.Value - 1 -- smallest value is 1, so need to subtract one for muting
|
|
UserSettings().GameSettings.MasterVolume = volume/maxVolumeLevel
|
|
end)
|
|
|
|
itemTop = itemTop + volumeSliderOffset
|
|
end
|
|
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
-- O K B U T T O N
|
|
----------------------------------------------------------------------------------------------------
|
|
|
|
|
|
local backButton
|
|
if hasGraphicsSlider then
|
|
backButton = createTextButton("OK",Enum.ButtonStyle.RobloxRoundDefaultButton,Enum.FontSize.Size24,UDim2.new(0,180,0,50),UDim2.new(0,170,0,315))
|
|
backButton.Modal = true
|
|
else
|
|
backButton = createTextButton("OK",Enum.ButtonStyle.RobloxRoundDefaultButton,Enum.FontSize.Size24,UDim2.new(0,180,0,50),UDim2.new(0,170,0,270))
|
|
backButton.Modal = true
|
|
end
|
|
|
|
backButton.Name = "BackButton"
|
|
backButton.ZIndex = baseZIndex + 4
|
|
backButton.Parent = gameSettingsMenuFrame
|
|
|
|
return gameSettingsMenuFrame
|
|
end
|
|
|
|
local showMainMenu = nil
|
|
|
|
if LoadLibrary then
|
|
RbxGui = LoadLibrary("RbxGui")
|
|
local baseZIndex = 4
|
|
if UserSettings then
|
|
|
|
waitForChild(gui,"TopLeftControl")
|
|
waitForChild(gui,"BottomLeftControl")
|
|
|
|
|
|
local settingButtonParent = gui:WaitForChild("TopLeftControl")
|
|
local createSettingsDialog = function()
|
|
if touchClient then
|
|
waitForChild(gui,"TopLeftControl")
|
|
else
|
|
settingButtonParent = gui:WaitForChild("BottomLeftControl")
|
|
end
|
|
|
|
settingsButton = settingButtonParent:FindFirstChild("SettingsButton")
|
|
|
|
if settingsButton == nil then
|
|
settingsButton = Instance.new("ImageButton")
|
|
settingsButton.Name = "SettingsButton"
|
|
settingsButton.Image = "rbxasset://textures/ui/homeButton.png"
|
|
settingsButton.BackgroundTransparency = 1
|
|
settingsButton.Active = false
|
|
settingsButton.Size = UDim2.new(0,36,0,28)
|
|
if (touchClient) then
|
|
settingsButton.Position = UDim2.new(0,2,0,5)
|
|
else
|
|
settingsButton.Position = UDim2.new(0, 15, 1, -42)
|
|
end
|
|
settingsButton.Parent = settingButtonParent
|
|
end
|
|
|
|
local shield = Instance.new("TextButton")
|
|
shield.Text = ""
|
|
shield.Name = "UserSettingsShield"
|
|
shield.Active = true
|
|
shield.AutoButtonColor = false
|
|
shield.Visible = false
|
|
shield.Size = UDim2.new(1,0,1,0)
|
|
shield.BackgroundColor3 = Color3I(51,51,51)
|
|
shield.BorderColor3 = Color3I(27,42,53)
|
|
shield.BackgroundTransparency = 0.4
|
|
shield.ZIndex = baseZIndex + 2
|
|
mainShield = shield
|
|
|
|
local frame = Instance.new("Frame")
|
|
frame.Name = "Settings"
|
|
frame.Position = UDim2.new(0.5, -262, -0.5, -200)
|
|
frame.Size = UDim2.new(0, 525, 0, 430)
|
|
frame.BackgroundTransparency = 1
|
|
frame.Active = true
|
|
frame.Parent = shield
|
|
|
|
local settingsFrame = Instance.new("Frame")
|
|
settingsFrame.Name = "SettingsStyle"
|
|
settingsFrame.Size = UDim2.new(1, 0, 1, 0)
|
|
settingsFrame.Style = Enum.FrameStyle.DropShadow
|
|
settingsFrame.Active = true
|
|
settingsFrame.ZIndex = baseZIndex + 3
|
|
settingsFrame.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)
|
|
|
|
if settings():FindFirstChild("Game Options") then
|
|
pcall(function()
|
|
settings():FindFirstChild("Game Options").VideoRecordingChangeRequest:connect(function(recording)
|
|
recordingVideo = recording
|
|
setRecordGui(recording, gui.StopRecordButton, gameMainMenu.RecordVideoButton)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
game.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)
|
|
|
|
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")
|
|
-- TODO: remove line below when not testing report abuse
|
|
if (testReport) then
|
|
gameMainMenu.ReportAbuseButton.Visible = true
|
|
end
|
|
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
|
|
|
|
gameMainMenu.ResetButton.MouseButton1Click:connect(function()
|
|
goToMenu(settingsFrame,"ResetConfirmationMenu","up",UDim2.new(0,525,0,370))
|
|
end)
|
|
|
|
local leaveGameButton = gameMainMenu:FindFirstChild("LeaveGameButton")
|
|
if (leaveGameButton) then
|
|
gameMainMenu.LeaveGameButton.MouseButton1Click:connect(function()
|
|
goToMenu(settingsFrame,"LeaveConfirmationMenu","down",UDim2.new(0,525,0,300))
|
|
end)
|
|
end
|
|
|
|
showMainMenu = function(overrideMenu, overrideDir, overrideSize)
|
|
if shield.Visible and overrideMenu then
|
|
goToMenu(settingsFrame,overrideMenu,overrideDir,overrideSize)
|
|
return
|
|
end
|
|
|
|
game.GuiService:AddCenterDialog(shield, Enum.CenterDialogType.ModalDialog,
|
|
--showFunction
|
|
function()
|
|
settingsButton.Active = false
|
|
if updateCameraDropDownSelection ~= nil then
|
|
updateCameraDropDownSelection(UserSettings().GameSettings.ControlMode.Name)
|
|
end
|
|
|
|
local cameraMode = UserSettings().GameSettings.CameraMode.Name
|
|
if (cameraMode == "Default") then
|
|
cameraMode = customCameraDefaultType
|
|
end
|
|
updateSmartCameraDropDownSelection(cameraMode)
|
|
|
|
if updateTouchMovementDropDownSelection ~= nil then
|
|
local moveMode = UserSettings().GameSettings.TouchMovementMode.Name
|
|
if (moveMode == "Default") then
|
|
moveMode = "Default (Thumbstick)"
|
|
end
|
|
updateTouchMovementDropDownSelection(moveMode)
|
|
end
|
|
|
|
pcall(function() game:GetService("UserInputService").OverrideMouseIconEnabled = true end)
|
|
|
|
|
|
if syncVideoCaptureSetting then
|
|
syncVideoCaptureSetting()
|
|
end
|
|
|
|
local menuToGoTo = "GameMainMenu"
|
|
local direction = "right"
|
|
local menuSize = UDim2.new(0,525,0,430)
|
|
|
|
if overrideMenu then
|
|
menuToGoTo = overrideMenu
|
|
end
|
|
if overrideDir then
|
|
direction = overrideDir
|
|
end
|
|
if overrideSize then
|
|
menuSize = overrideSize
|
|
end
|
|
|
|
goToMenu(settingsFrame,menuToGoTo,direction,menuSize)
|
|
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,
|
|
--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
|
|
|
|
game:GetService("GuiService").EscapeKeyPressed:connect(function()
|
|
if currentMenuSelection == nil then
|
|
showMainMenu()
|
|
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
|
|
if updateCameraDropDownSelection ~= nil then
|
|
updateCameraDropDownSelection(UserSettings().GameSettings.ControlMode.Name)
|
|
end
|
|
|
|
local cameraMode = UserSettings().GameSettings.CameraMode.Name
|
|
if (cameraMode == "Default") then
|
|
cameraMode = customCameraDefaultType
|
|
end
|
|
updateSmartCameraDropDownSelection(cameraMode)
|
|
|
|
if updateTouchMovementDropDownSelection ~= nil then
|
|
local moveMode = UserSettings().GameSettings.TouchMovementMode.Name
|
|
if (moveMode == "Default") then
|
|
moveMode = "Default (Thumbstick)"
|
|
end
|
|
updateTouchMovementDropDownSelection(moveMode)
|
|
end
|
|
|
|
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
|
|
|
|
settingButtonParent.SettingsButton.Active = true
|
|
-- settingButtonParent.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
|
|
|
|
if settingButtonParent ~= topLeft then
|
|
topLeft:Remove()
|
|
end
|
|
end
|
|
--]]
|
|
end)
|
|
|
|
end --UserSettings call
|
|
|
|
local createSaveDialogs = function()
|
|
local shield = Instance.new("TextButton")
|
|
shield.Text = ""
|
|
shield.AutoButtonColor = false
|
|
shield.Name = "SaveDialogShield"
|
|
shield.Active = true
|
|
shield.Visible = false
|
|
shield.Size = UDim2.new(1,0,1,0)
|
|
shield.BackgroundColor3 = Color3I(51,51,51)
|
|
shield.BorderColor3 = Color3I(27,42,53)
|
|
shield.BackgroundTransparency = 0.4
|
|
shield.ZIndex = baseZIndex+1
|
|
|
|
local clearAndResetDialog
|
|
local save
|
|
local saveLocal
|
|
local dontSave
|
|
local cancel
|
|
|
|
local messageBoxButtons = {}
|
|
messageBoxButtons[1] = {}
|
|
messageBoxButtons[1].Text = "Save"
|
|
messageBoxButtons[1].Style = Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
messageBoxButtons[1].Function = function() save() end
|
|
messageBoxButtons[1].ZIndex = baseZIndex+3
|
|
messageBoxButtons[2] = {}
|
|
messageBoxButtons[2].Text = "Cancel"
|
|
messageBoxButtons[2].Function = function() cancel() end
|
|
messageBoxButtons[2].Style = Enum.ButtonStyle.RobloxRoundButton
|
|
messageBoxButtons[2].ZIndex = baseZIndex+3
|
|
messageBoxButtons[3] = {}
|
|
messageBoxButtons[3].Text = "Don't Save"
|
|
messageBoxButtons[3].Function = function() dontSave() end
|
|
messageBoxButtons[3].Style = Enum.ButtonStyle.RobloxRoundButton
|
|
messageBoxButtons[3].ZIndex = baseZIndex+3
|
|
|
|
local saveDialogMessageBox = RbxGui.CreateStyledMessageDialog("Unsaved Changes", "Save your changes to ROBLOX before leaving?", "Confirm", messageBoxButtons)
|
|
saveDialogMessageBox.Visible = true
|
|
saveDialogMessageBox.Parent = shield
|
|
saveDialogMessageBox.ZIndex = baseZIndex+2
|
|
saveDialogMessageBox.Style = Enum.FrameStyle.DropShadow
|
|
saveDialogMessageBox.Title.ZIndex = baseZIndex+3
|
|
saveDialogMessageBox.Message.ZIndex = baseZIndex+3
|
|
saveDialogMessageBox.StyleImage.ZIndex = baseZIndex+3
|
|
|
|
|
|
local errorBoxButtons = {}
|
|
|
|
local buttonOffset = 1
|
|
if game.LocalSaveEnabled then
|
|
errorBoxButtons[buttonOffset] = {}
|
|
errorBoxButtons[buttonOffset].Text = "Save to Disk"
|
|
errorBoxButtons[buttonOffset].Function = function() saveLocal() end
|
|
buttonOffset = buttonOffset + 1
|
|
end
|
|
errorBoxButtons[buttonOffset] = {}
|
|
errorBoxButtons[buttonOffset].Text = "Keep Playing"
|
|
errorBoxButtons[buttonOffset].Function = function() cancel() end
|
|
errorBoxButtons[buttonOffset].Style = Enum.ButtonStyle.RobloxRoundButton
|
|
errorBoxButtons[buttonOffset].ZIndex = baseZIndex+3
|
|
errorBoxButtons[buttonOffset+1] = {}
|
|
errorBoxButtons[buttonOffset+1].Text = "Don't Save"
|
|
errorBoxButtons[buttonOffset+1].Function = function() dontSave() end
|
|
errorBoxButtons[buttonOffset+1].Style = Enum.ButtonStyle.RobloxRoundButton
|
|
errorBoxButtons[buttonOffset+1].ZIndex = baseZIndex+3
|
|
|
|
local errorDialogMessageBox = RbxGui.CreateStyledMessageDialog("Upload Failed", "Sorry, we could not save your changes to ROBLOX. If this problem continues to occur, please make sure your Roblox account has a verified email address.", "Error", errorBoxButtons)
|
|
errorDialogMessageBox.Visible = false
|
|
errorDialogMessageBox.Parent = shield
|
|
errorDialogMessageBox.ZIndex = baseZIndex+2
|
|
errorDialogMessageBox.Style = Enum.FrameStyle.DropShadow
|
|
errorDialogMessageBox.Title.ZIndex = baseZIndex+3
|
|
errorDialogMessageBox.Message.ZIndex = baseZIndex+3
|
|
errorDialogMessageBox.StyleImage.ZIndex = baseZIndex+3
|
|
|
|
local spinnerDialog = Instance.new("Frame")
|
|
spinnerDialog.Name = "SpinnerDialog"
|
|
spinnerDialog.Style = Enum.FrameStyle.DropShadow
|
|
spinnerDialog.Size = UDim2.new(0, 350, 0, 150)
|
|
spinnerDialog.Position = UDim2.new(.5, -175, .5, -75)
|
|
spinnerDialog.Visible = false
|
|
spinnerDialog.Active = true
|
|
spinnerDialog.ZIndex = baseZIndex+1
|
|
spinnerDialog.Parent = shield
|
|
|
|
local waitingLabel = Instance.new("TextLabel")
|
|
waitingLabel.Name = "WaitingLabel"
|
|
waitingLabel.Text = "Saving to ROBLOX..."
|
|
waitingLabel.Font = Enum.Font.SourceSansBold
|
|
waitingLabel.FontSize = Enum.FontSize.Size18
|
|
waitingLabel.Position = UDim2.new(0.5, 25, 0.5, 0)
|
|
waitingLabel.TextColor3 = Color3.new(1,1,1)
|
|
waitingLabel.ZIndex = baseZIndex+2
|
|
waitingLabel.Parent = spinnerDialog
|
|
|
|
local spinnerFrame = Instance.new("Frame")
|
|
spinnerFrame.Name = "Spinner"
|
|
spinnerFrame.Size = UDim2.new(0, 80, 0, 80)
|
|
spinnerFrame.Position = UDim2.new(0.5, -150, 0.5, -40)
|
|
spinnerFrame.BackgroundTransparency = 1
|
|
spinnerFrame.ZIndex = baseZIndex+2
|
|
spinnerFrame.Parent = spinnerDialog
|
|
|
|
local spinnerIcons = {}
|
|
local spinnerNum = 1
|
|
while spinnerNum <= 8 do
|
|
local spinnerImage = Instance.new("ImageLabel")
|
|
spinnerImage.Name = "Spinner"..spinnerNum
|
|
spinnerImage.Size = UDim2.new(0, 16, 0, 16)
|
|
spinnerImage.Position = UDim2.new(.5+.3*math.cos(math.rad(45*spinnerNum)), -8, .5+.3*math.sin(math.rad(45*spinnerNum)), -8)
|
|
spinnerImage.BackgroundTransparency = 1
|
|
spinnerImage.Image = "http://www.roblox.com/Asset?id=45880710"
|
|
spinnerImage.ZIndex = baseZIndex+3
|
|
spinnerImage.Parent = spinnerFrame
|
|
|
|
spinnerIcons[spinnerNum] = spinnerImage
|
|
spinnerNum = spinnerNum + 1
|
|
end
|
|
|
|
save = function()
|
|
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://www.roblox.com/Asset?id=45880668"
|
|
else
|
|
spinnerIcons[pos+1].Image = "http://www.roblox.com/Asset?id=45880710"
|
|
end
|
|
|
|
pos = 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
|
|
|
|
saveLocal = function()
|
|
errorDialogMessageBox.Visible = false
|
|
game:FinishShutdown(true)
|
|
clearAndResetDialog()
|
|
end
|
|
|
|
dontSave = function()
|
|
saveDialogMessageBox.Visible = false
|
|
errorDialogMessageBox.Visible = false
|
|
game:FinishShutdown(false)
|
|
clearAndResetDialog()
|
|
end
|
|
cancel = function()
|
|
saveDialogMessageBox.Visible = false
|
|
errorDialogMessageBox.Visible = false
|
|
clearAndResetDialog()
|
|
end
|
|
|
|
clearAndResetDialog = function()
|
|
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 createReportAbuseDialog = function()
|
|
--Only show things if we are a NetworkClient
|
|
-- TODO: add line back in when not testing report abuse
|
|
if not testReport then
|
|
waitForChild(game,"NetworkClient")
|
|
end
|
|
|
|
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 = Instance.new("TextButton")
|
|
shield.Name = "ReportAbuseShield"
|
|
shield.Text = ""
|
|
shield.AutoButtonColor = false
|
|
shield.Active = true
|
|
shield.Visible = false
|
|
shield.Size = UDim2.new(1,0,1,0)
|
|
shield.BackgroundColor3 = Color3I(51,51,51)
|
|
shield.BorderColor3 = Color3I(27,42,53)
|
|
shield.BackgroundTransparency = 0.4
|
|
shield.ZIndex = baseZIndex + 1
|
|
|
|
local closeAndResetDialgo
|
|
|
|
local messageBoxButtons = {}
|
|
messageBoxButtons[1] = {}
|
|
messageBoxButtons[1].Text = "Ok"
|
|
messageBoxButtons[1].Modal = true
|
|
messageBoxButtons[1].Style = Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
messageBoxButtons[1].ZIndex = baseZIndex+3
|
|
messageBoxButtons[1].Function = function() closeAndResetDialog() end
|
|
local calmingMessageBox = 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)
|
|
calmingMessageBox.Visible = false
|
|
calmingMessageBox.Parent = shield
|
|
calmingMessageBox.ZIndex = baseZIndex+2
|
|
calmingMessageBox.Style = Enum.FrameStyle.DropShadow
|
|
calmingMessageBox.Title.ZIndex = baseZIndex+3
|
|
calmingMessageBox.Message.ZIndex = baseZIndex+3
|
|
|
|
local recordedMessageBox = RbxGui.CreateMessageDialog("Thanks for your report!","We've recorded your report for evaluation.", messageBoxButtons)
|
|
recordedMessageBox.Visible = false
|
|
recordedMessageBox.Parent = shield
|
|
recordedMessageBox.ZIndex = baseZIndex+2
|
|
recordedMessageBox.Style = Enum.FrameStyle.DropShadow
|
|
recordedMessageBox.Title.ZIndex = baseZIndex+3
|
|
recordedMessageBox.Message.ZIndex = baseZIndex+3
|
|
|
|
local normalMessageBox = RbxGui.CreateMessageDialog("Thanks for your report!", "Our moderators will review the chat logs and determine what happened.", messageBoxButtons)
|
|
normalMessageBox.Visible = false
|
|
normalMessageBox.Parent = shield
|
|
normalMessageBox.ZIndex = baseZIndex+2
|
|
normalMessageBox.Style = Enum.FrameStyle.DropShadow
|
|
normalMessageBox.Title.ZIndex = baseZIndex+3
|
|
normalMessageBox.Message.ZIndex = baseZIndex+3
|
|
|
|
local frame = Instance.new("Frame")
|
|
frame.Name = "Settings"
|
|
frame.Position = UDim2.new(0.5, -240, 0.5, -160)
|
|
frame.Size = UDim2.new(0.0, 480, 0.0, 320)
|
|
frame.BackgroundTransparency = 1
|
|
frame.Active = true
|
|
frame.Parent = shield
|
|
|
|
local settingsFrame = Instance.new("Frame")
|
|
settingsFrame.Name = "ReportAbuseStyle"
|
|
settingsFrame.Size = UDim2.new(1, 0, 1, 0)
|
|
settingsFrame.Style = Enum.FrameStyle.DropShadow
|
|
settingsFrame.Active = true
|
|
settingsFrame.ZIndex = baseZIndex + 1
|
|
settingsFrame.Parent = frame
|
|
|
|
local description = Instance.new("TextLabel")
|
|
description.Name = "Description"
|
|
description.Text = "This will send a complete report to a moderator. The moderator will review the chat log and take appropriate action."
|
|
description.TextColor3 = Color3I(221,221,221)
|
|
description.Position = UDim2.new(0, 10, 0, 10)
|
|
description.Size = UDim2.new(1, -20, 0, 40)
|
|
description.BackgroundTransparency = 1
|
|
description.Font = Enum.Font.SourceSans
|
|
description.FontSize = Enum.FontSize.Size18
|
|
description.TextWrap = true
|
|
description.ZIndex = baseZIndex + 2
|
|
description.TextXAlignment = Enum.TextXAlignment.Left
|
|
description.TextYAlignment = Enum.TextYAlignment.Top
|
|
description.Parent = settingsFrame
|
|
|
|
local playerLabel = Instance.new("TextLabel")
|
|
playerLabel.Name = "PlayerLabel"
|
|
playerLabel.Text = "Which player?"
|
|
playerLabel.BackgroundTransparency = 1
|
|
playerLabel.Font = Enum.Font.SourceSans
|
|
playerLabel.FontSize = Enum.FontSize.Size18
|
|
playerLabel.Position = UDim2.new(0.025,20,0,92)
|
|
playerLabel.Size = UDim2.new(0.4,0,0,36)
|
|
playerLabel.TextColor3 = Color3I(255,255,255)
|
|
playerLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
playerLabel.ZIndex = baseZIndex + 2
|
|
playerLabel.Parent = settingsFrame
|
|
|
|
local gameOrPlayerLabel = Instance.new("TextLabel")
|
|
gameOrPlayerLabel.Name = "TypeLabel"
|
|
gameOrPlayerLabel.Text = "Game or Player:"
|
|
gameOrPlayerLabel.BackgroundTransparency = 1
|
|
gameOrPlayerLabel.Font = Enum.Font.SourceSans
|
|
gameOrPlayerLabel.FontSize = Enum.FontSize.Size18
|
|
gameOrPlayerLabel.Position = UDim2.new(0.025,20,0,55)
|
|
gameOrPlayerLabel.Size = UDim2.new(0.4,0,0,36)
|
|
gameOrPlayerLabel.TextColor3 = Color3I(255,255,255)
|
|
gameOrPlayerLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
gameOrPlayerLabel.ZIndex = baseZIndex + 2
|
|
gameOrPlayerLabel.Parent = settingsFrame
|
|
|
|
local abuseLabel = Instance.new("TextLabel")
|
|
abuseLabel.Name = "AbuseLabel"
|
|
abuseLabel.Text = "Type of Abuse:"
|
|
abuseLabel.Font = Enum.Font.SourceSans
|
|
abuseLabel.BackgroundTransparency = 1
|
|
abuseLabel.FontSize = Enum.FontSize.Size18
|
|
abuseLabel.Position = UDim2.new(0.025,20,0,131)
|
|
abuseLabel.Size = UDim2.new(0.4,0,0,36)
|
|
abuseLabel.TextColor3 = Color3I(255,255,255)
|
|
abuseLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
abuseLabel.ZIndex = baseZIndex + 2
|
|
abuseLabel.Parent = settingsFrame
|
|
|
|
local abusingPlayer = nil
|
|
local abuse = nil
|
|
local submitReportButton = nil
|
|
local gameOrPlayer = nil
|
|
|
|
local updatePlayerSelection = nil
|
|
local createPlayersDropDown = function()
|
|
local players = game:GetService("Players")
|
|
local playerNames = {}
|
|
local nameToPlayer = {}
|
|
local children = players:GetChildren()
|
|
local pos = 1
|
|
if children then
|
|
for i, player in ipairs(children) do
|
|
if player:IsA("Player") and player ~= localPlayer then
|
|
playerNames[pos] = player.Name
|
|
nameToPlayer[player.Name] = player
|
|
pos = pos + 1
|
|
end
|
|
end
|
|
end
|
|
local playerDropDown = nil
|
|
playerDropDown, updatePlayerSelection = RbxGui.CreateDropDownMenu(playerNames,
|
|
function(playerName)
|
|
abusingPlayer = nameToPlayer[playerName]
|
|
if abuse and abusingPlayer then
|
|
submitReportButton.Active = true
|
|
end
|
|
end, false, true, baseZIndex)
|
|
playerDropDown.Name = "PlayersComboBox"
|
|
playerDropDown.ZIndex = baseZIndex + 2
|
|
playerDropDown.Position = UDim2.new(.425, 0, 0, 94)
|
|
playerDropDown.Size = UDim2.new(.55,0,0,32)
|
|
|
|
return playerDropDown
|
|
end
|
|
|
|
local gameOrPlayerTable = {"Game","Player"}
|
|
local gameOrPlayerDropDown = nil
|
|
gameOrPlayerDropDown = RbxGui.CreateDropDownMenu(gameOrPlayerTable,
|
|
function(gameOrPlayerText)
|
|
gameOrPlayer = gameOrPlayerText
|
|
if gameOrPlayer == "Game" then
|
|
submitReportButton.Active = true
|
|
playerLabel.Visible = false
|
|
local playerDropDown = gameOrPlayerDropDown.Parent:FindFirstChild("PlayersComboBox")
|
|
if playerDropDown then
|
|
playerDropDown.Visible = false
|
|
end
|
|
else
|
|
playerLabel.Visible = true
|
|
local playerDropDown = gameOrPlayerDropDown.Parent:FindFirstChild("PlayersComboBox")
|
|
if playerDropDown then
|
|
playerDropDown.Visible = true
|
|
end
|
|
end
|
|
end, true, true, baseZIndex)
|
|
gameOrPlayerDropDown.Name = "TypeComboBox"
|
|
gameOrPlayerDropDown.ZIndex = baseZIndex + 2
|
|
gameOrPlayerDropDown.Position = UDim2.new(0.425, 0, 0, 55)
|
|
gameOrPlayerDropDown.Size = UDim2.new(0.55,0,0,32)
|
|
gameOrPlayerDropDown.Parent = settingsFrame
|
|
|
|
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, true, baseZIndex)
|
|
abuseDropDown.Name = "AbuseComboBox"
|
|
abuseDropDown.ZIndex = baseZIndex + 2
|
|
abuseDropDown.Position = UDim2.new(0.425, 0, 0, 133)
|
|
abuseDropDown.Size = UDim2.new(0.55,0,0,32)
|
|
abuseDropDown.Parent = settingsFrame
|
|
|
|
local shortDescriptionLabel = Instance.new("TextLabel")
|
|
shortDescriptionLabel.Name = "ShortDescriptionLabel"
|
|
shortDescriptionLabel.Text = "Short Description: (optional)"
|
|
shortDescriptionLabel.Font = Enum.Font.SourceSans
|
|
shortDescriptionLabel.FontSize = Enum.FontSize.Size18
|
|
shortDescriptionLabel.Position = UDim2.new(0.025,0,0,165)
|
|
shortDescriptionLabel.Size = UDim2.new(0.95,0,0,36)
|
|
shortDescriptionLabel.TextColor3 = Color3I(255,255,255)
|
|
shortDescriptionLabel.TextXAlignment = Enum.TextXAlignment.Left
|
|
shortDescriptionLabel.BackgroundTransparency = 1
|
|
shortDescriptionLabel.ZIndex = baseZIndex + 2
|
|
shortDescriptionLabel.Parent = settingsFrame
|
|
|
|
local shortDescriptionWrapper = Instance.new("Frame")
|
|
shortDescriptionWrapper.Name = "ShortDescriptionWrapper"
|
|
shortDescriptionWrapper.Position = UDim2.new(0.025,0,0,195)
|
|
shortDescriptionWrapper.Size = UDim2.new(0.95,0,1,-250)
|
|
shortDescriptionWrapper.BackgroundColor3 = Color3I(206,206,206)
|
|
shortDescriptionWrapper.BorderSizePixel = 0
|
|
shortDescriptionWrapper.ZIndex = baseZIndex + 2
|
|
shortDescriptionWrapper.Parent = settingsFrame
|
|
|
|
local shortDescriptionBox = Instance.new("TextBox")
|
|
shortDescriptionBox.Name = "TextBox"
|
|
shortDescriptionBox.Text = ""
|
|
shortDescriptionBox.ClearTextOnFocus = false
|
|
shortDescriptionBox.Font = Enum.Font.SourceSans
|
|
shortDescriptionBox.FontSize = Enum.FontSize.Size18
|
|
shortDescriptionBox.Position = UDim2.new(0,3,0,3)
|
|
shortDescriptionBox.Size = UDim2.new(1,-6,1,-6)
|
|
shortDescriptionBox.TextColor3 = Color3I(0,0,0)
|
|
shortDescriptionBox.TextXAlignment = Enum.TextXAlignment.Left
|
|
shortDescriptionBox.TextYAlignment = Enum.TextYAlignment.Top
|
|
shortDescriptionBox.TextWrap = true
|
|
shortDescriptionBox.BackgroundColor3 = Color3I(206,206,206)
|
|
shortDescriptionBox.BorderColor3 = Color3I(206,206,206)
|
|
shortDescriptionBox.ZIndex = baseZIndex + 2
|
|
shortDescriptionBox.Parent = shortDescriptionWrapper
|
|
|
|
submitReportButton = Instance.new("TextButton")
|
|
submitReportButton.Name = "SubmitReportBtn"
|
|
submitReportButton.Active = false
|
|
submitReportButton.Modal = true
|
|
submitReportButton.Font = Enum.Font.SourceSans
|
|
submitReportButton.FontSize = Enum.FontSize.Size18
|
|
submitReportButton.Position = UDim2.new(0.1, 0, 1, -50)
|
|
submitReportButton.Size = UDim2.new(0.35,0,0,40)
|
|
submitReportButton.AutoButtonColor = true
|
|
submitReportButton.Style = Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
submitReportButton.Text = "Submit Report"
|
|
submitReportButton.TextColor3 = Color3I(255,255,255)
|
|
submitReportButton.ZIndex = baseZIndex + 2
|
|
submitReportButton.Parent = settingsFrame
|
|
|
|
submitReportButton.MouseButton1Click:connect(function()
|
|
if submitReportButton.Active then
|
|
if abuse and abusingPlayer then
|
|
frame.Visible = false
|
|
if gameOrPlayer == "Player" then
|
|
game.Players:ReportAbuse(abusingPlayer, abuse, shortDescriptionBox.Text)
|
|
else
|
|
game.Players:ReportAbuse(nil, abuse, shortDescriptionBox.Text)
|
|
end
|
|
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 = Instance.new("TextButton")
|
|
cancelButton.Name = "CancelBtn"
|
|
cancelButton.Font = Enum.Font.SourceSans
|
|
cancelButton.FontSize = Enum.FontSize.Size18
|
|
cancelButton.Position = UDim2.new(0.55, 0, 1, -50)
|
|
cancelButton.Size = UDim2.new(0.35,0,0,40)
|
|
cancelButton.AutoButtonColor = true
|
|
cancelButton.Style = Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
cancelButton.Text = "Cancel"
|
|
cancelButton.TextColor3 = Color3I(255,255,255)
|
|
cancelButton.ZIndex = baseZIndex + 2
|
|
cancelButton.Parent = settingsFrame
|
|
|
|
closeAndResetDialog = function()
|
|
--Delete old player combo box
|
|
local oldComboBox = settingsFrame: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 = settingsFrame
|
|
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
|
|
|
|
local createChatBar = function()
|
|
--Only show a chat bar if we are a NetworkClient
|
|
waitForChild(game, "NetworkClient")
|
|
|
|
waitForChild(game, "Players")
|
|
waitForProperty(game.Players, "LocalPlayer")
|
|
|
|
local chatBar = Instance.new("Frame")
|
|
chatBar.Name = "ChatBar"
|
|
chatBar.Size = UDim2.new(1, 0, 0, 22)
|
|
chatBar.Position = UDim2.new(0, 0, 1, 0)
|
|
chatBar.BackgroundColor3 = Color3.new(0,0,0)
|
|
chatBar.BorderSizePixel = 0
|
|
|
|
local chatBox = Instance.new("TextBox")
|
|
chatBox.Text = ""
|
|
chatBox.Visible = false
|
|
chatBox.Size = UDim2.new(1,-4,1,0)
|
|
chatBox.Position = UDim2.new(0,2,0,0)
|
|
chatBox.TextXAlignment = Enum.TextXAlignment.Left
|
|
chatBox.Font = Enum.Font.SourceSansBold
|
|
chatBox.ClearTextOnFocus = false
|
|
chatBox.FontSize = Enum.FontSize.Size14
|
|
chatBox.TextColor3 = Color3.new(1,1,1)
|
|
chatBox.BackgroundTransparency = 1
|
|
--chatBox.Parent = chatBar
|
|
|
|
local chatButton = Instance.new("TextButton")
|
|
chatButton.Size = UDim2.new(1,-4,1,0)
|
|
chatButton.Position = UDim2.new(0,2,0,0)
|
|
chatButton.AutoButtonColor = false
|
|
chatButton.Text = "To chat click here or press \"/\" key"
|
|
chatButton.TextXAlignment = Enum.TextXAlignment.Left
|
|
chatButton.Font = Enum.Font.SourceSansBold
|
|
chatButton.FontSize = Enum.FontSize.Size14
|
|
chatButton.TextColor3 = Color3.new(1,1,1)
|
|
chatButton.BackgroundTransparency = 1
|
|
--chatButton.Parent = chatBar
|
|
|
|
local activateChat = function()
|
|
if chatBox.Visible then
|
|
return
|
|
end
|
|
chatButton.Visible = false
|
|
chatBox.Text = ""
|
|
chatBox.Visible = true
|
|
chatBox:CaptureFocus()
|
|
end
|
|
|
|
chatButton.MouseButton1Click:connect(activateChat)
|
|
|
|
local hotKeyEnabled = true
|
|
local toggleHotKey = function(value)
|
|
hotKeyEnabled = value
|
|
end
|
|
|
|
local guiService = game:GetService("GuiService")
|
|
local newChatMode = pcall(function()
|
|
--guiService:AddSpecialKey(Enum.SpecialKey.ChatHotkey)
|
|
--guiService.SpecialKeyPressed:connect(function(key) if key == Enum.SpecialKey.ChatHotkey and hotKeyEnabled then activateChat() end end)
|
|
end)
|
|
if not newChatMode then
|
|
--guiService:AddKey("/")
|
|
--guiService.KeyPressed:connect(function(key) if key == "/" and hotKeyEnabled then activateChat() end end)
|
|
end
|
|
|
|
chatBox.FocusLost:connect(
|
|
function(enterPressed)
|
|
if enterPressed then
|
|
if chatBox.Text ~= "" then
|
|
local str = chatBox.Text
|
|
if string.sub(str, 1, 1) == '%' then
|
|
game.Players:TeamChat(string.sub(str, 2))
|
|
else
|
|
game.Players:Chat(str)
|
|
end
|
|
end
|
|
end
|
|
chatBox.Text = ""
|
|
chatBox.Visible = false
|
|
chatButton.Visible = true
|
|
end)
|
|
robloxLock(chatBar)
|
|
return chatBar, toggleHotKey
|
|
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
|
|
|
|
game.RequestShutdown = function()
|
|
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 to listen to leave game prompts
|
|
Spawn(function()
|
|
local showLeaveEvent = nil
|
|
pcall(function() showLeaveEvent = Game:GetService("GuiService").ShowLeaveConfirmation end)
|
|
if not showLeaveEvent then return end
|
|
|
|
function showLeaveConfirmation()
|
|
if showMainMenu then
|
|
showMainMenu("LeaveConfirmationMenu","down",UDim2.new(0,525,0,300))
|
|
end
|
|
end
|
|
|
|
Game:GetService("GuiService").ShowLeaveConfirmation:connect(function( )
|
|
if currentMenuSelection == nil then
|
|
showLeaveConfirmation()
|
|
else
|
|
resumeGameFunction(gui.UserSettingsShield)
|
|
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)
|
|
|
|
end --LoadLibrary if
|