198 lines
5.1 KiB
Lua
198 lines
5.1 KiB
Lua
local Players = game:GetService("Players")
|
|
local TweenService = game:GetService("TweenService")
|
|
|
|
local LocalPlayer = Players.LocalPlayer
|
|
if not LocalPlayer then
|
|
Players:GetPropertyChangedSignal("LocalPlayer"):Wait()
|
|
LocalPlayer = Players.LocalPlayer
|
|
end
|
|
|
|
local function waitForChildOfClass(parent, class)
|
|
local child = parent:FindFirstChildOfClass(class)
|
|
while not child or child.ClassName ~= class do
|
|
child = parent.ChildAdded:Wait()
|
|
end
|
|
return child
|
|
end
|
|
|
|
local PlayerGui = waitForChildOfClass(LocalPlayer, "PlayerGui")
|
|
|
|
local TOAST_OPEN_SIZE = UDim2.new(0, 326, 0, 58)
|
|
local TOAST_CLOSED_SIZE = UDim2.new(0, 80, 0, 58)
|
|
local TOAST_BACKGROUND_COLOR = Color3.fromRGB(32, 32, 32)
|
|
local TOAST_BACKGROUND_TRANS = 0.4
|
|
local TOAST_FOREGROUND_COLOR = Color3.fromRGB(200, 200, 200)
|
|
local TOAST_FOREGROUND_TRANS = 0
|
|
|
|
-- Convenient syntax for creating a tree of instanes
|
|
local function create(className)
|
|
return function(props)
|
|
local inst = Instance.new(className)
|
|
local parent = props.Parent
|
|
props.Parent = nil
|
|
for name, val in pairs(props) do
|
|
if type(name) == "string" then
|
|
inst[name] = val
|
|
else
|
|
val.Parent = inst
|
|
end
|
|
end
|
|
-- Only set parent after all other properties are initialized
|
|
inst.Parent = parent
|
|
return inst
|
|
end
|
|
end
|
|
|
|
local initialized = false
|
|
|
|
local uiRoot
|
|
local toast
|
|
local toastIcon
|
|
local toastUpperText
|
|
local toastLowerText
|
|
|
|
local function initializeUI()
|
|
assert(not initialized)
|
|
|
|
uiRoot = create("ScreenGui"){
|
|
Name = "RbxCameraUI",
|
|
AutoLocalize = false,
|
|
Enabled = true,
|
|
DisplayOrder = -1, -- Appears behind default developer UI
|
|
IgnoreGuiInset = false,
|
|
ResetOnSpawn = false,
|
|
ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
|
|
|
|
create("ImageLabel"){
|
|
Name = "Toast",
|
|
Visible = false,
|
|
AnchorPoint = Vector2.new(0.5, 0),
|
|
BackgroundTransparency = 1,
|
|
BorderSizePixel = 0,
|
|
Position = UDim2.new(0.5, 0, 0, 8),
|
|
Size = TOAST_CLOSED_SIZE,
|
|
Image = "rbxasset://textures/ui/Camera/CameraToast9Slice.png",
|
|
ImageColor3 = TOAST_BACKGROUND_COLOR,
|
|
ImageRectSize = Vector2.new(6, 6),
|
|
ImageTransparency = 1,
|
|
ScaleType = Enum.ScaleType.Slice,
|
|
SliceCenter = Rect.new(3, 3, 3, 3),
|
|
ClipsDescendants = true,
|
|
|
|
create("Frame"){
|
|
Name = "IconBuffer",
|
|
BackgroundTransparency = 1,
|
|
BorderSizePixel = 0,
|
|
Position = UDim2.new(0, 0, 0, 0),
|
|
Size = UDim2.new(0, 80, 1, 0),
|
|
|
|
create("ImageLabel"){
|
|
Name = "Icon",
|
|
AnchorPoint = Vector2.new(0.5, 0.5),
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0.5, 0, 0.5, 0),
|
|
Size = UDim2.new(0, 48, 0, 48),
|
|
ZIndex = 2,
|
|
Image = "rbxasset://textures/ui/Camera/CameraToastIcon.png",
|
|
ImageColor3 = TOAST_FOREGROUND_COLOR,
|
|
ImageTransparency = 1,
|
|
}
|
|
},
|
|
|
|
create("Frame"){
|
|
Name = "TextBuffer",
|
|
BackgroundTransparency = 1,
|
|
BorderSizePixel = 0,
|
|
Position = UDim2.new(0, 80, 0, 0),
|
|
Size = UDim2.new(1, -80, 1, 0),
|
|
ClipsDescendants = true,
|
|
|
|
create("TextLabel"){
|
|
Name = "Upper",
|
|
AnchorPoint = Vector2.new(0, 1),
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0, 0, 0.5, 0),
|
|
Size = UDim2.new(1, 0, 0, 19),
|
|
Font = Enum.Font.GothamSemibold,
|
|
Text = "Camera control enabled",
|
|
TextColor3 = TOAST_FOREGROUND_COLOR,
|
|
TextTransparency = 1,
|
|
TextSize = 19,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Center,
|
|
},
|
|
|
|
create("TextLabel"){
|
|
Name = "Lower",
|
|
AnchorPoint = Vector2.new(0, 0),
|
|
BackgroundTransparency = 1,
|
|
Position = UDim2.new(0, 0, 0.5, 3),
|
|
Size = UDim2.new(1, 0, 0, 15),
|
|
Font = Enum.Font.Gotham,
|
|
Text = "Right mouse button to toggle",
|
|
TextColor3 = TOAST_FOREGROUND_COLOR,
|
|
TextTransparency = 1,
|
|
TextSize = 15,
|
|
TextXAlignment = Enum.TextXAlignment.Left,
|
|
TextYAlignment = Enum.TextYAlignment.Center,
|
|
},
|
|
},
|
|
},
|
|
|
|
Parent = PlayerGui,
|
|
}
|
|
|
|
toast = uiRoot.Toast
|
|
toastIcon = toast.IconBuffer.Icon
|
|
toastUpperText = toast.TextBuffer.Upper
|
|
toastLowerText = toast.TextBuffer.Lower
|
|
|
|
initialized = true
|
|
end
|
|
|
|
local CameraUI = {}
|
|
|
|
do
|
|
-- Instantaneously disable the toast or enable for opening later on. Used when switching camera modes.
|
|
function CameraUI.setCameraModeToastEnabled(enabled)
|
|
if not enabled and not initialized then
|
|
return
|
|
end
|
|
|
|
if not initialized then
|
|
initializeUI()
|
|
end
|
|
|
|
toast.Visible = enabled
|
|
if not enabled then
|
|
CameraUI.setCameraModeToastOpen(false)
|
|
end
|
|
end
|
|
|
|
local tweenInfo = TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
|
|
|
|
-- Tween the toast in or out. Toast must be enabled with setCameraModeToastEnabled.
|
|
function CameraUI.setCameraModeToastOpen(open)
|
|
assert(initialized)
|
|
|
|
TweenService:Create(toast, tweenInfo, {
|
|
Size = open and TOAST_OPEN_SIZE or TOAST_CLOSED_SIZE,
|
|
ImageTransparency = open and TOAST_BACKGROUND_TRANS or 1,
|
|
}):Play()
|
|
|
|
TweenService:Create(toastIcon, tweenInfo, {
|
|
ImageTransparency = open and TOAST_FOREGROUND_TRANS or 1,
|
|
}):Play()
|
|
|
|
TweenService:Create(toastUpperText, tweenInfo, {
|
|
TextTransparency = open and TOAST_FOREGROUND_TRANS or 1,
|
|
}):Play()
|
|
|
|
TweenService:Create(toastLowerText, tweenInfo, {
|
|
TextTransparency = open and TOAST_FOREGROUND_TRANS or 1,
|
|
}):Play()
|
|
end
|
|
end
|
|
|
|
return CameraUI
|