
Key Required VerifiedUniversal

LogService = game:GetService("LogService")
UserInputService = game:GetService("UserInputService")
RunService = game:GetService("RunService")
CoreGui = game:GetService("CoreGui")
DraggingSystem = {}
function DraggingSystem.GetDistance(pos1, pos2)
return math.sqrt((pos2.X - pos1.X)^2 + (pos2.Y - pos1.Y)^2)
end
function DraggingSystem.IsMouseOverFrame(Frame, Position)
AbsPos, AbsSize = Frame.AbsolutePosition, Frame.AbsoluteSize
return Position.X >= AbsPos.X and Position.X <= AbsPos.X + AbsSize.X and Position.Y >= AbsPos.Y and Position.Y <= AbsPos.Y + AbsSize.Y
end
function DraggingSystem.MakeDraggable(MainFrame, DragFrame, CallbackTable)
if not MainFrame or not DragFrame then return end
dragging = false
dragStart = nil
startPos = nil
dragDistance = 0
DRAG_THRESHOLD = 5
originalZIndex = MainFrame.ZIndex
isDraggingStarted = false
currentTouch = nil
function getScreenSize()
return workspace.CurrentCamera.ViewportSize
end
function updatePosition(input)
if not dragging or not dragStart then return end
delta = input.Position - dragStart
dragDistance = math.sqrt(delta.X^2 + delta.Y^2)
screenSize = getScreenSize()
newOffsetX = startPos.X.Offset + delta.X
newOffsetY = startPos.Y.Offset + delta.Y
newScaleX = startPos.X.Scale
newScaleY = startPos.Y.Scale
if startPos.X.Scale > 0 then
scaleOffsetX = (screenSize.X * startPos.X.Scale) + startPos.X.Offset
newAbsoluteX = scaleOffsetX + delta.X
newScaleX = newAbsoluteX / screenSize.X
newOffsetX = 0
end
if startPos.Y.Scale > 0 then
scaleOffsetY = (screenSize.Y * startPos.Y.Scale) + startPos.Y.Offset
newAbsoluteY = scaleOffsetY + delta.Y
newScaleY = newAbsoluteY / screenSize.Y
newOffsetY = 0
end
MainFrame.Position = UDim2.new(newScaleX, newOffsetX, newScaleY, newOffsetY)
if CallbackTable and CallbackTable.OnDragUpdate then
CallbackTable.OnDragUpdate(MainFrame.Position, dragDistance)
end
end
function resetDragState()
dragging = false
dragStart = nil
startPos = nil
dragDistance = 0
isDraggingStarted = false
currentTouch = nil
end
mouseButton1Connection = nil
touchEndedConnection = nil
movementConnection = nil
function onInputEnded()
if dragging then
wasDragged = dragDistance > DRAG_THRESHOLD
if not wasDragged and CallbackTable and CallbackTable.OnClick then
CallbackTable.OnClick()
end
if wasDragged and isDraggingStarted then
MainFrame.ZIndex = originalZIndex
if CallbackTable and CallbackTable.OnDragEnd then
CallbackTable.OnDragEnd(MainFrame.Position, wasDragged)
end
end
resetDragState()
if mouseButton1Connection then
mouseButton1Connection:Disconnect()
mouseButton1Connection = nil
end
if touchEndedConnection then
touchEndedConnection:Disconnect()
touchEndedConnection = nil
end
if movementConnection then
movementConnection:Disconnect()
movementConnection = nil
end
end
end
function onInputEndedHandler(endInput)
if dragging then
if endInput.UserInputType == Enum.UserInputType.MouseButton1 then
onInputEnded()
elseif endInput.UserInputType == Enum.UserInputType.Touch and endInput == currentTouch then
onInputEnded()
end
end
end
function onMovement(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input == currentTouch) then
if not isDraggingStarted and dragDistance > DRAG_THRESHOLD then
isDraggingStarted = true
if CallbackTable and CallbackTable.OnDragStart then
CallbackTable.OnDragStart()
end
end
updatePosition(input)
end
end
function onInputBegan(input)
if (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) and input.UserInputState == Enum.UserInputState.Begin and not dragging then
if DraggingSystem.IsMouseOverFrame(DragFrame, input.Position) then
dragging = true
dragStart = input.Position
startPos = MainFrame.Position
dragDistance = 0
isDraggingStarted = false
if input.UserInputType == Enum.UserInputType.Touch then
currentTouch = input
else
currentTouch = nil
end
mouseButton1Connection = UserInputService.InputEnded:Connect(function(endInput)
if endInput.UserInputType == Enum.UserInputType.MouseButton1 then
onInputEndedHandler(endInput)
end
end)
touchEndedConnection = UserInputService.InputEnded:Connect(function(endInput)
if endInput.UserInputType == Enum.UserInputType.Touch then
onInputEndedHandler(endInput)
end
end)
movementConnection = UserInputService.InputChanged:Connect(function(moveInput)
if moveInput.UserInputType == Enum.UserInputType.MouseMovement or moveInput.UserInputType == Enum.UserInputType.Touch then
onMovement(moveInput)
end
end)
end
end
end
inputBeganConnection = DragFrame.InputBegan:Connect(onInputBegan)
cleanupFunction = function()
inputBeganConnection:Disconnect()
if mouseButton1Connection then mouseButton1Connection:Disconnect() end
if touchEndedConnection then touchEndedConnection:Disconnect() end
if movementConnection then movementConnection:Disconnect() end
end
return cleanupFunction
end
ResizeSystem = {}
function ResizeSystem.MakeResizable(MainFrame, ResizeHandle, CallbackTable)
if not MainFrame or not ResizeHandle then return end
resizing = false
resizeStart = nil
startSize = nil
startPosition = nil
resizeMode = "right"
activeTouch = nil
function updateResize(input)
if not resizing or not resizeStart then return end
delta = input.Position - resizeStart
newWidth = startSize.X.Offset
newHeight = startSize.Y.Offset
newX = startPosition.X.Offset
newY = startPosition.Y.Offset
if resizeMode == "right" then
newWidth = math.max(396, startSize.X.Offset + delta.X)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
elseif resizeMode == "left" then
newWidth = math.max(396, startSize.X.Offset - delta.X)
newX = startPosition.X.Offset + (startSize.X.Offset - newWidth)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
MainFrame.Position = UDim2.new(startPosition.X.Scale, newX, startPosition.Y.Scale, newY)
elseif resizeMode == "bottom" then
newHeight = math.max(200, startSize.Y.Offset + delta.Y)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
elseif resizeMode == "top" then
newHeight = math.max(200, startSize.Y.Offset - delta.Y)
newY = startPosition.Y.Offset + (startSize.Y.Offset - newHeight)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
MainFrame.Position = UDim2.new(startPosition.X.Scale, newX, startPosition.Y.Scale, newY)
elseif resizeMode == "bottomRight" then
newWidth = math.max(396, startSize.X.Offset + delta.X)
newHeight = math.max(200, startSize.Y.Offset + delta.Y)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
elseif resizeMode == "bottomLeft" then
newWidth = math.max(396, startSize.X.Offset - delta.X)
newHeight = math.max(200, startSize.Y.Offset + delta.Y)
newX = startPosition.X.Offset + (startSize.X.Offset - newWidth)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
MainFrame.Position = UDim2.new(startPosition.X.Scale, newX, startPosition.Y.Scale, newY)
elseif resizeMode == "topRight" then
newWidth = math.max(396, startSize.X.Offset + delta.X)
newHeight = math.max(200, startSize.Y.Offset - delta.Y)
newY = startPosition.Y.Offset + (startSize.Y.Offset - newHeight)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
MainFrame.Position = UDim2.new(startPosition.X.Scale, newX, startPosition.Y.Scale, newY)
elseif resizeMode == "topLeft" then
newWidth = math.max(396, startSize.X.Offset - delta.X)
newHeight = math.max(200, startSize.Y.Offset - delta.Y)
newX = startPosition.X.Offset + (startSize.X.Offset - newWidth)
newY = startPosition.Y.Offset + (startSize.Y.Offset - newHeight)
MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
MainFrame.Position = UDim2.new(startPosition.X.Scale, newX, startPosition.Y.Scale, newY)
end
if CallbackTable and CallbackTable.OnResizeUpdate then
CallbackTable.OnResizeUpdate(MainFrame.Size, MainFrame.Position)
end
updateScrollability()
end
function resetResizeState()
resizing = false
resizeStart = nil
startSize = nil
startPosition = nil
activeTouch = nil
end
mouseConnection = nil
touchConnection = nil
moveConnection = nil
function onResizeEnd()
if resizing then
if CallbackTable and CallbackTable.OnResizeEnd then
CallbackTable.OnResizeEnd(MainFrame.Size)
end
resetResizeState()
if mouseConnection then mouseConnection:Disconnect() end
if touchConnection then touchConnection:Disconnect() end
if moveConnection then moveConnection:Disconnect() end
end
end
function onResizeMovement(input)
if resizing then
if input.UserInputType == Enum.UserInputType.MouseMovement then
updateResize(input)
elseif input.UserInputType == Enum.UserInputType.Touch and input == activeTouch then
updateResize(input)
end
end
end
function onResizeBegan(input)
if (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) and input.UserInputState == Enum.UserInputState.Begin and not resizing then
if DraggingSystem.IsMouseOverFrame(ResizeHandle, input.Position) then
resizing = true
resizeStart = input.Position
startSize = MainFrame.Size
startPosition = MainFrame.Position
if input.UserInputType == Enum.UserInputType.Touch then
activeTouch = input
else
activeTouch = nil
end
if ResizeHandle.Name == "ResizeRight" then
resizeMode = "right"
elseif ResizeHandle.Name == "ResizeLeft" then
resizeMode = "left"
elseif ResizeHandle.Name == "ResizeBottom" then
resizeMode = "bottom"
elseif ResizeHandle.Name == "ResizeTop" then
resizeMode = "top"
elseif ResizeHandle.Name == "ResizeBottomRight" then
resizeMode = "bottomRight"
elseif ResizeHandle.Name == "ResizeBottomLeft" then
resizeMode = "bottomLeft"
elseif ResizeHandle.Name == "ResizeTopRight" then
resizeMode = "topRight"
elseif ResizeHandle.Name == "ResizeTopLeft" then
resizeMode = "topLeft"
end
if CallbackTable and CallbackTable.OnResizeStart then
CallbackTable.OnResizeStart()
end
mouseConnection = UserInputService.InputEnded:Connect(function(endInput)
if endInput.UserInputType == Enum.UserInputType.MouseButton1 then
onResizeEnd()
end
end)
touchConnection = UserInputService.InputEnded:Connect(function(endInput)
if endInput.UserInputType == Enum.UserInputType.Touch and endInput == activeTouch then
onResizeEnd()
end
end)
moveConnection = UserInputService.InputChanged:Connect(function(moveInput)
if moveInput.UserInputType == Enum.UserInputType.MouseMovement then
onResizeMovement(moveInput)
elseif moveInput.UserInputType == Enum.UserInputType.Touch and moveInput == activeTouch then
onResizeMovement(moveInput)
end
end)
end
end
end
inputBeganConnection = ResizeHandle.InputBegan:Connect(onResizeBegan)
cleanupFunction = function()
inputBeganConnection:Disconnect()
if mouseConnection then mouseConnection:Disconnect() end
if touchConnection then touchConnection:Disconnect() end
if moveConnection then moveConnection:Disconnect() end
end
return cleanupFunction
end
function getDPIScale()
return 0.9
end
function updateScrollability()
task.wait()
local containerHeight = logContainer.AbsoluteSize.Y
local contentHeight = logList.AbsoluteContentSize.Y
if contentHeight > containerHeight then
logContainer.ScrollBarThickness = 6
logContainer.ScrollingEnabled = true
else
logContainer.ScrollBarThickness = 0
logContainer.ScrollingEnabled = false
end
end
autoScroll = true
textSize = 12
screenGui = Instance.new("ScreenGui")
screenGui.Name = "RBXConsole"
screenGui.ResetOnSpawn = false
screenGui.Enabled = false
screenGui.Parent = CoreGui
mainFrame = Instance.new("Frame")
mainFrame.Name = "Main"
mainFrame.Size = UDim2.new(0, 550, 0, 400)
mainFrame.Position = UDim2.new(0.5, -275, 0.5, -200)
mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
mainFrame.BackgroundTransparency = 0.3
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.Parent = screenGui
uiScale = Instance.new("UIScale")
uiScale.Scale = getDPIScale()
uiScale.Parent = mainFrame
uiCorner = Instance.new("UICorner")
uiCorner.CornerRadius = UDim.new(0, 8)
uiCorner.Parent = mainFrame
uiStroke = Instance.new("UIStroke")
uiStroke.Color = Color3.fromRGB(60, 60, 70)
uiStroke.Thickness = 1
uiStroke.Parent = mainFrame
titleBar = Instance.new("Frame")
titleBar.Name = "TitleBar"
titleBar.Size = UDim2.new(1, 0, 0, 40)
titleBar.BackgroundColor3 = Color3.fromRGB(40, 40, 45)
titleBar.BackgroundTransparency = 0.3
titleBar.BorderSizePixel = 0
titleBar.Parent = mainFrame
tbCorner = Instance.new("UICorner")
tbCorner.CornerRadius = UDim.new(0, 8)
tbCorner.Parent = titleBar
title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -60, 1, 0)
title.Position = UDim2.new(0, 15, 0, 0)
title.BackgroundTransparency = 1
title.Text = "RBX Console"
title.TextColor3 = Color3.fromRGB(240, 240, 240)
title.TextXAlignment = Enum.TextXAlignment.Left
title.Font = Enum.Font.GothamBold
title.TextSize = 14
title.Parent = titleBar
controls = Instance.new("Frame")
controls.Size = UDim2.new(0, 340, 1, 0)
controls.Position = UDim2.new(1, -345, 0, 0)
controls.BackgroundTransparency = 1
controls.Parent = titleBar
controlList = Instance.new("UIListLayout")
controlList.SortOrder = Enum.SortOrder.LayoutOrder
controlList.FillDirection = Enum.FillDirection.Horizontal
controlList.HorizontalAlignment = Enum.HorizontalAlignment.Right
controlList.VerticalAlignment = Enum.VerticalAlignment.Center
controlList.Padding = UDim.new(0, 5)
controlList.Parent = controls
function createButton(name, text, color)
btn = Instance.new("TextButton")
btn.Name = name
btn.Size = UDim2.new(0, 65, 0, 25)
btn.BackgroundColor3 = color
btn.BackgroundTransparency = 0.2
btn.Text = text
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
btn.Font = Enum.Font.GothamBold
btn.TextSize = 11
btn.BorderSizePixel = 0
btn.Parent = controls
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
return btn
end
autoScrollBtn = createButton("AutoScroll", "Scroll: ON", Color3.fromRGB(60, 100, 180))
copyAllBtn = createButton("CopyAll", "Copy All", Color3.fromRGB(60, 120, 60))
clearBtn = createButton("Clear", "Clear", Color3.fromRGB(80, 80, 85))
textSizeBox = Instance.new("TextBox")
textSizeBox.Size = UDim2.new(0, 50, 0, 25)
textSizeBox.BackgroundColor3 = Color3.fromRGB(80, 80, 85)
textSizeBox.BackgroundTransparency = 0.2
textSizeBox.Text = "12"
textSizeBox.TextColor3 = Color3.fromRGB(255, 255, 255)
textSizeBox.Font = Enum.Font.GothamBold
textSizeBox.TextSize = 11
textSizeBox.PlaceholderText = "Size"
textSizeBox.Parent = controls
Instance.new("UICorner", textSizeBox).CornerRadius = UDim.new(0, 4)
closeBtn = createButton("Close", "X", Color3.fromRGB(180, 60, 60))
closeBtn.Size = UDim2.new(0, 30, 0, 25)
function updateTextSize()
local newSize = tonumber(textSizeBox.Text)
if newSize then
textSize = newSize
for _, logFrame in ipairs(logContainer:GetChildren()) do
if logFrame:IsA("Frame") then
textLabel = logFrame:FindFirstChild("TextLabel")
if textLabel then
textLabel.TextSize = textSize
end
end
end
end
end
textSizeBox.FocusLost:Connect(function()
updateTextSize()
end)
logContainer = Instance.new("ScrollingFrame")
logContainer.Name = "Logs"
logContainer.Size = UDim2.new(1, -20, 1, -60)
logContainer.Position = UDim2.new(0, 10, 0, 50)
logContainer.BackgroundColor3 = Color3.fromRGB(20, 20, 23)
logContainer.BackgroundTransparency = 0.5
logContainer.BorderSizePixel = 0
logContainer.ScrollBarThickness = 0
logContainer.ScrollingEnabled = false
logContainer.AutomaticCanvasSize = Enum.AutomaticSize.Y
logContainer.CanvasSize = UDim2.new(0, 0, 0, 0)
logContainer.Parent = mainFrame
logList = Instance.new("UIListLayout")
logList.SortOrder = Enum.SortOrder.LayoutOrder
logList.Padding = UDim.new(0, 4)
logList.Parent = logContainer
Instance.new("UIPadding", logContainer).PaddingLeft = UDim.new(0, 5)
logList:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(updateScrollability)
logContainer:GetPropertyChangedSignal("AbsoluteSize"):Connect(updateScrollability)
function createResizeHandle(name, position, size)
handle = Instance.new("TextButton")
handle.Name = name
handle.Size = size
handle.Position = position
handle.BackgroundTransparency = 1
handle.Text = ""
handle.AutoButtonColor = false
handle.Parent = mainFrame
return handle
end
resizeRight = createResizeHandle("ResizeRight", UDim2.new(1, -4, 0, 0), UDim2.new(0, 8, 1, 0))
resizeLeft = createResizeHandle("ResizeLeft", UDim2.new(0, -4, 0, 0), UDim2.new(0, 8, 1, 0))
resizeBottom = createResizeHandle("ResizeBottom", UDim2.new(0, 0, 1, -4), UDim2.new(1, 0, 0, 8))
resizeTop = createResizeHandle("ResizeTop", UDim2.new(0, 0, 0, -4), UDim2.new(1, 0, 0, 8))
resizeBottomRight = createResizeHandle("ResizeBottomRight", UDim2.new(1, -8, 1, -8), UDim2.new(0, 16, 0, 16))
resizeBottomLeft = createResizeHandle("ResizeBottomLeft", UDim2.new(0, -8, 1, -8), UDim2.new(0, 16, 0, 16))
resizeTopRight = createResizeHandle("ResizeTopRight", UDim2.new(1, -8, 0, -8), UDim2.new(0, 16, 0, 16))
resizeTopLeft = createResizeHandle("ResizeTopLeft", UDim2.new(0, -8, 0, -8), UDim2.new(0, 16, 0, 16))
DraggingSystem.MakeDraggable(mainFrame, titleBar, {
OnClick = function() end
})
ResizeSystem.MakeResizable(mainFrame, resizeRight, {})
ResizeSystem.MakeResizable(mainFrame, resizeLeft, {})
ResizeSystem.MakeResizable(mainFrame, resizeBottom, {})
ResizeSystem.MakeResizable(mainFrame, resizeTop, {})
ResizeSystem.MakeResizable(mainFrame, resizeBottomRight, {})
ResizeSystem.MakeResizable(mainFrame, resizeBottomLeft, {})
ResizeSystem.MakeResizable(mainFrame, resizeTopRight, {})
ResizeSystem.MakeResizable(mainFrame, resizeTopLeft, {})
function addLog(message, color, messageType)
logFrame = Instance.new("Frame")
logFrame.Size = UDim2.new(1, -10, 0, 0)
logFrame.BackgroundTransparency = 1
logFrame.AutomaticSize = Enum.AutomaticSize.Y
logFrame.Parent = logContainer
iconLabel = Instance.new("ImageLabel")
iconLabel.Size = UDim2.new(0, 20, 0, 20)
iconLabel.Position = UDim2.new(0, 0, 0, 2)
iconLabel.BackgroundTransparency = 1
iconLabel.Parent = logFrame
if messageType == Enum.MessageType.MessageError then
iconLabel.Image = "rbxasset://textures/DevConsole/Error.png"
elseif messageType == Enum.MessageType.MessageWarning then
iconLabel.Image = "rbxasset://textures/DevConsole/Warning.png"
else
iconLabel.Image = "rbxasset://textures/DevConsole/Info.png"
end
textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, -75, 0, 0)
textLabel.Position = UDim2.new(0, 25, 0, 0)
textLabel.BackgroundTransparency = 1
textLabel.Text = message
textLabel.TextColor3 = color
textLabel.Font = Enum.Font.Code
textLabel.TextSize = textSize
textLabel.TextWrapped = true
textLabel.TextXAlignment = Enum.TextXAlignment.Left
textLabel.AutomaticSize = Enum.AutomaticSize.Y
textLabel.Parent = logFrame
copyBtn = Instance.new("TextButton")
copyBtn.Size = UDim2.new(0, 45, 0, 20)
copyBtn.Position = UDim2.new(1, -45, 0, 0)
copyBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 60)
copyBtn.BackgroundTransparency = 0.2
copyBtn.Text = "Copy"
copyBtn.TextColor3 = Color3.fromRGB(200, 200, 200)
copyBtn.Font = Enum.Font.Gotham
copyBtn.TextSize = 10
copyBtn.Parent = logFrame
Instance.new("UICorner", copyBtn).CornerRadius = UDim.new(0, 4)
copyBtn.MouseButton1Click:Connect(function()
if setclipboard then
setclipboard(message)
copyBtn.Text = "Done!"
task.wait(1)
copyBtn.Text = "Copy"
end
end)
if autoScroll then
task.wait(0.03)
logContainer.CanvasPosition = Vector2.new(0, logContainer.AbsoluteCanvasSize.Y)
end
updateScrollability()
end
autoScrollBtn.MouseButton1Click:Connect(function()
autoScroll = not autoScroll
autoScrollBtn.Text = "Scroll: " .. (autoScroll and "ON" or "OFF")
autoScrollBtn.BackgroundColor3 = autoScroll and Color3.fromRGB(60, 100, 180) or Color3.fromRGB(100, 100, 110)
end)
clearBtn.MouseButton1Click:Connect(function()
for _, child in ipairs(logContainer:GetChildren()) do
if child:IsA("Frame") then child:Destroy() end
end
updateScrollability()
end)
copyAllBtn.MouseButton1Click:Connect(function()
allLogs = {}
for _, child in ipairs(logContainer:GetChildren()) do
if child:IsA("Frame") and child:FindFirstChild("TextLabel") then
table.insert(allLogs, child.TextLabel.Text)
end
end
if setclipboard then setclipboard(table.concat(allLogs, "\n")) end
end)
closeBtn.MouseButton1Click:Connect(function() screenGui.Enabled = false end)
UserInputService.InputBegan:Connect(function(input, gpe)
if not gpe and input.KeyCode == Enum.KeyCode.F2 then
screenGui.Enabled = not screenGui.Enabled
end
end)
LogService.MessageOut:Connect(function(message, messageType)
color = Color3.fromRGB(220, 220, 220)
if messageType == Enum.MessageType.MessageError then
color = Color3.fromRGB(255, 100, 100)
elseif messageType == Enum.MessageType.MessageWarning then
color = Color3.fromRGB(255, 200, 100)
end
addLog(string.format("[%s] %s", os.date("%H:%M:%S"), message), color, messageType)
end)
updateScrollability()No comments yet for this script.



