
Key Required

-- =============================================================================
-- Cafezitos V2 ☕ — Menu completo por Cafezl
-- Versão auditada: bugs corrigidos + novas funções
-- =============================================================================
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
-- Token compartilhado entre execuções/skins. Se uma segunda execução começar
-- enquanto esta ainda espera PlayerGui ou um frame de render, a antiga aborta.
local suiteGuard = { environment = _G }
if type(getgenv) == "function" then
local ok, environment = pcall(getgenv)
if ok and type(environment) == "table" then suiteGuard.environment = environment end
end
suiteGuard.generation = (tonumber(suiteGuard.environment.__CafezlSuiteGeneration) or 0) + 1
local storedGeneration = pcall(function()
suiteGuard.environment.__CafezlSuiteGeneration = suiteGuard.generation
end)
if not storedGeneration then
-- Alguns ambientes expõem um getgenv somente-leitura. O _G continua
-- servindo como coordenador para impedir dois bootstraps simultâneos.
suiteGuard.environment = _G
suiteGuard.generation = (tonumber(_G.__CafezlSuiteGeneration) or 0) + 1
_G.__CafezlSuiteGeneration = suiteGuard.generation
end
local function isCurrentSuiteGeneration()
return suiteGuard.environment.__CafezlSuiteGeneration == suiteGuard.generation
end
local LocalPlayer = Players.LocalPlayer
do
local deadline = os.clock() + 10
while not LocalPlayer and os.clock() < deadline do
if not isCurrentSuiteGeneration() then return end
task.wait(0.05)
LocalPlayer = Players.LocalPlayer
end
if not LocalPlayer then
error("Cafezitos: jogador local indisponível após 10 segundos; execute no cliente do Roblox.")
end
end
local MENU_NAME = "Cafezitos V2 ☕"
local UI_TITLE = MENU_NAME .. " | Feito por Cafezl"
-- Alguns ambientes bloqueiam GUI direto em CoreGui e outros usam gethui().
-- Escolher o pai aqui evita o menu morrer antes mesmo de aparecer.
local function getGuiParent()
local function usable(root)
if typeof(root) ~= "Instance" then return nil end
local probe = Instance.new("ScreenGui")
local ok = pcall(function() probe.Parent = root end)
local accepted = ok and probe.Parent == root
probe:Destroy()
return accepted and root or nil
end
if type(gethui) == "function" then
local ok, parent = pcall(gethui)
if ok then
local ready = usable(parent)
if ready then return ready end
end
end
local ok, coreGui = pcall(function()
return game:GetService("CoreGui")
end)
if ok and coreGui then
local ready = usable(coreGui)
if ready then return ready end
end
local playerGui = LocalPlayer:FindFirstChild("PlayerGui")
or LocalPlayer:WaitForChild("PlayerGui", 10)
local ready = usable(playerGui)
if ready then return ready end
error("Cafezitos: não foi possível encontrar um local permitido para a interface.")
end
local CoreGui = getGuiParent()
if not isCurrentSuiteGeneration() then return end
local guiRoots = {}
local guiRootSet = {}
local function addGuiRoot(root)
if root and not guiRootSet[root] then
guiRootSet[root] = true
table.insert(guiRoots, root)
end
end
addGuiRoot(CoreGui)
pcall(function() addGuiRoot(game:GetService("CoreGui")) end)
addGuiRoot(LocalPlayer:FindFirstChild("PlayerGui"))
local destroyCafezitos
local setMenuVisible
local destroyed = false
local runtimeConnections = {}
local function trackConnection(connection)
if connection then table.insert(runtimeConnections, connection) end
return connection
end
local function disconnectRuntimeConnections()
for index = #runtimeConnections, 1, -1 do
local connection = runtimeConnections[index]
if connection then pcall(function() connection:Disconnect() end) end
runtimeConnections[index] = nil
end
end
-- Nothrilo e Cafezitos são duas skins da mesma suíte: abrir uma encerra a
-- outra para não duplicar atalhos, ESP, forças e controladores de voo.
for _, guiRoot in ipairs(guiRoots) do
for _, runtimeName in ipairs({ "CafezitosRuntime", "NothriloRuntime" }) do
local previousRuntime = guiRoot:FindFirstChild(runtimeName)
if previousRuntime then
local previousCleanup = previousRuntime:FindFirstChild("Cleanup")
if previousCleanup and previousCleanup:IsA("BindableEvent") then
previousCleanup:Fire()
end
previousRuntime:Destroy()
end
end
end
local originalGravity = workspace.Gravity
local runtime = Instance.new("Folder")
runtime.Name = "CafezitosRuntime"
runtime.Parent = CoreGui
local runtimeCleanup = Instance.new("BindableEvent")
runtimeCleanup.Name = "Cleanup"
runtimeCleanup.Parent = runtime
trackConnection(runtimeCleanup.Event:Connect(function()
if destroyCafezitos then
destroyCafezitos()
return
end
destroyed = true
disconnectRuntimeConnections()
if runtime and runtime.Parent then runtime:Destroy() end
end))
-- Remove somente GUIs de versões anteriores do Cafezitos. Não toca no
-- Nothrilo, no Rayfield nem em interfaces de outros scripts.
local cafeGuiNames = {
CafezitosV2UI = true,
CafezitosLauncher = true,
CafezitosNotifications = true,
CafezitosLoading = true,
CafezitosMobileFly = true,
}
for _, guiRoot in ipairs(guiRoots) do
for _, gui in ipairs(guiRoot:GetChildren()) do
if gui:IsA("ScreenGui") then
if cafeGuiNames[gui.Name] then
gui:Destroy()
else
local main = gui:FindFirstChild("Main")
local header = main and main:FindFirstChild("MainHeader")
local title = header and header:FindFirstChild("title")
if title and title.Text:find("Cafezitos", 1, true) then
gui:Destroy()
end
end
end
end
end
-- Tema escuro — só os detalhes passam pelo RGB
local Theme = {
SchemeColor = Color3.fromRGB(239, 180, 112), -- caramelo cremoso
Background = Color3.fromRGB(66, 41, 33), -- cappuccino
Header = Color3.fromRGB(108, 67, 49), -- espuma de mocha
TextColor = Color3.fromRGB(255, 246, 232), -- leite quente
ElementColor = Color3.fromRGB(121, 76, 56), -- doce de leite
}
-- =============================================================================
-- Tela de carregamento
-- =============================================================================
local function showStartupCard()
local gui = Instance.new("ScreenGui")
gui.Name = "CafezitosLoading"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.DisplayOrder = 10050
gui.Parent = CoreGui
local card = Instance.new("Frame")
card.Name = "Card"
card.AnchorPoint = Vector2.new(0.5, 0.5)
card.Position = UDim2.fromScale(0.5, 0.5)
card.Size = UDim2.new(0.9, 0, 0, 150)
card.BackgroundColor3 = Color3.fromRGB(43, 26, 19)
card.BorderSizePixel = 0
card.Parent = gui
local cardSize = Instance.new("UISizeConstraint")
cardSize.MinSize = Vector2.new(270, 150)
cardSize.MaxSize = Vector2.new(390, 150)
cardSize.Parent = card
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 16)
corner.Parent = card
local stroke = Instance.new("UIStroke")
stroke.Thickness = 1.5
stroke.Color = Theme.SchemeColor
stroke.Parent = card
local titleL = Instance.new("TextLabel")
titleL.BackgroundTransparency = 1
titleL.Position = UDim2.fromOffset(92, 27)
titleL.Size = UDim2.new(1, -116, 0, 24)
titleL.Font = Enum.Font.GothamBold
titleL.Text = MENU_NAME
titleL.TextColor3 = Color3.fromRGB(248, 248, 250)
titleL.TextSize = 18
titleL.TextXAlignment = Enum.TextXAlignment.Left
titleL.Parent = card
local subtitleL = Instance.new("TextLabel")
subtitleL.BackgroundTransparency = 1
subtitleL.Position = UDim2.fromOffset(92, 55)
subtitleL.Size = UDim2.new(1, -116, 0, 18)
subtitleL.Font = Enum.Font.Gotham
subtitleL.Text = "Feito por Cafezl"
subtitleL.TextColor3 = Color3.fromRGB(205, 205, 214)
subtitleL.TextSize = 13
subtitleL.TextXAlignment = Enum.TextXAlignment.Left
subtitleL.Parent = card
local status = Instance.new("TextLabel")
status.BackgroundTransparency = 1
status.Position = UDim2.fromOffset(92, 82)
status.Size = UDim2.new(1, -116, 0, 16)
status.Font = Enum.Font.Gotham
status.Text = "Carregando menu..."
status.TextColor3 = Theme.SchemeColor
status.TextSize = 12
status.TextXAlignment = Enum.TextXAlignment.Left
status.Parent = card
local cup = Instance.new("TextLabel")
cup.BackgroundTransparency = 1
cup.Position = UDim2.fromOffset(26, 48)
cup.Size = UDim2.fromOffset(50, 50)
cup.Text = "☕"
cup.Font = Enum.Font.GothamBlack
cup.TextSize = 36
cup.TextColor3 = Theme.SchemeColor
cup.Parent = card
local track = Instance.new("Frame")
track.Position = UDim2.fromOffset(92, 111)
track.Size = UDim2.new(1, -122, 0, 7)
track.BackgroundColor3 = Color3.fromRGB(79, 48, 34)
track.BorderSizePixel = 0
track.Parent = card
Instance.new("UICorner", track).CornerRadius = UDim.new(1, 0)
local crema = Instance.new("Frame")
crema.Size = UDim2.new(0.14, 0, 1, 0)
crema.BackgroundColor3 = Theme.SchemeColor
crema.BorderSizePixel = 0
crema.Parent = track
Instance.new("UICorner", crema).CornerRadius = UDim.new(1, 0)
for index = 1, 3 do
local steam = Instance.new("Frame")
steam.AnchorPoint = Vector2.new(0.5, 0.5)
steam.Position = UDim2.fromOffset(39 + index * 10, 45)
steam.Size = UDim2.fromOffset(5, 10)
steam.BackgroundColor3 = Color3.fromRGB(255, 233, 204)
steam.BackgroundTransparency = 0.4
steam.BorderSizePixel = 0
steam.Parent = card
Instance.new("UICorner", steam).CornerRadius = UDim.new(1, 0)
local animation = TweenService:Create(steam, TweenInfo.new(1.05 + index * 0.12, Enum.EasingStyle.Sine, Enum.EasingDirection.Out, -1, true), {
Position = UDim2.fromOffset(36 + index * 12, 23), BackgroundTransparency = 1,
})
animation:Play()
end
TweenService:Create(crema, TweenInfo.new(1.8, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut, -1, true), {
Size = UDim2.new(0.92, 0, 1, 0),
}):Play()
return gui, status
end
-- =============================================================================
-- CAFÉ UI — interface própria, responsiva para PC e celular
-- =============================================================================
local CafeUI = {
accent = Theme.SchemeColor,
accentObjects = {},
traceback = debug and debug.traceback or function(errorValue)
return tostring(errorValue)
end,
}
local function ui(className, properties, parent)
local object = Instance.new(className)
for property, value in pairs(properties or {}) do object[property] = value end
object.Parent = parent
return object
end
local function corner(parent, radius)
return ui("UICorner", { CornerRadius = UDim.new(0, radius or 12) }, parent)
end
local function stroke(parent, color, thickness, transparency)
return ui("UIStroke", {
Color = color or Color3.fromRGB(111, 72, 47),
Thickness = thickness or 1,
Transparency = transparency or 0,
}, parent)
end
local function addPadding(parent, pixels)
return ui("UIPadding", {
PaddingLeft = UDim.new(0, pixels), PaddingRight = UDim.new(0, pixels),
PaddingTop = UDim.new(0, pixels), PaddingBottom = UDim.new(0, pixels),
}, parent)
end
local function tween(object, duration, properties)
return TweenService:Create(object, TweenInfo.new(duration, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), properties)
end
function CafeUI:trackAccent(object, property)
table.insert(self.accentObjects, { object = object, property = property })
object[property] = self.accent
end
function CafeUI:ChangeColor(_, color)
self.accent = color
for index = #self.accentObjects, 1, -1 do
local item = self.accentObjects[index]
if item.object and item.object.Parent then item.object[item.property] = color
else table.remove(self.accentObjects, index) end
end
end
function CafeUI.CreateLib(title)
local gui = ui("ScreenGui", {
Name = "CafezitosV2UI", ResetOnSpawn = false, IgnoreGuiInset = true,
DisplayOrder = 10000, ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
}, CoreGui)
local shade = ui("Frame", {
Name = "CoffeeShade", Size = UDim2.fromScale(1, 1),
BackgroundColor3 = Color3.fromRGB(48, 26, 20), BackgroundTransparency = 0.48,
BorderSizePixel = 0,
}, gui)
-- A câmera pode ainda não existir no primeiro frame. O layout nasce com um
-- viewport seguro e será religado quando CurrentCamera aparecer.
local camera = workspace.CurrentCamera
local viewport = camera and camera.ViewportSize or Vector2.new(1280, 720)
local function getResponsiveSizes(currentViewport)
local mobile = currentViewport.X < 700 or currentViewport.Y < 520
local normal = mobile and UDim2.fromScale(0.94, 0.84) or UDim2.fromScale(0.64, 0.66)
local mini = mobile and UDim2.fromScale(0.82, 0.62) or UDim2.fromScale(0.48, 0.48)
return mobile, normal, mini
end
local mobileLayout, normalSize, miniSize = getResponsiveSizes(viewport)
local main = ui("Frame", {
Name = "Main", AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.fromScale(0.5, 0.5), Size = normalSize,
BackgroundColor3 = Theme.Background, BorderSizePixel = 0,
}, gui)
corner(main, 22)
local mainStroke = stroke(main, Color3.fromRGB(120, 74, 46), 1.5, 0.1)
CafeUI:trackAccent(mainStroke, "Color")
local sizeConstraint = ui("UISizeConstraint", {
MinSize = mobileLayout and Vector2.new(250, 270) or Vector2.new(420, 350),
MaxSize = Vector2.new(780, 570),
}, main)
local header = ui("Frame", {
Name = "MainHeader", Size = UDim2.new(1, 0, 0, 78),
BackgroundColor3 = Theme.Header, BorderSizePixel = 0,
}, main)
corner(header, 22)
local headerMask = ui("Frame", {
Size = UDim2.new(1, 0, 0, 28), Position = UDim2.new(0, 0, 1, -28),
BackgroundColor3 = Theme.Header, BorderSizePixel = 0,
}, header)
local cup = ui("TextLabel", {
Name = "Cup", BackgroundTransparency = 1, Position = UDim2.fromOffset(18, 10),
Size = UDim2.fromOffset(50, 50), Font = Enum.Font.GothamBlack,
Text = "☕", TextSize = 31, TextColor3 = Theme.SchemeColor,
}, header)
CafeUI:trackAccent(cup, "TextColor3")
local titleLabel = ui("TextLabel", {
Name = "title", BackgroundTransparency = 1, Position = UDim2.fromOffset(72, 12),
Size = UDim2.new(1, -145, 0, 27), Font = Enum.Font.GothamBold,
Text = title, TextColor3 = Theme.TextColor, TextSize = 20,
TextXAlignment = Enum.TextXAlignment.Left,
}, header)
ui("TextLabel", {
BackgroundTransparency = 1, Position = UDim2.fromOffset(74, 39),
Size = UDim2.new(1, -145, 0, 18), Font = Enum.Font.Gotham,
Text = "Cappuccino doce • simples de usar", TextColor3 = Color3.fromRGB(255, 223, 188),
TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left,
}, header)
local close = ui("TextButton", {
Name = "close", AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -18, 0.5, 0),
Size = UDim2.fromOffset(38, 38), BackgroundColor3 = Color3.fromRGB(94, 48, 34),
BorderSizePixel = 0, Text = "×", Font = Enum.Font.GothamBold,
TextColor3 = Theme.TextColor, TextSize = 25,
}, header)
corner(close, 12)
close.Activated:Connect(function()
if destroyCafezitos then destroyCafezitos() else gui:Destroy() end
end)
local compact = false
local resize = ui("TextButton", {
Name = "CoffeeResize", AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -64, 0.5, 0),
Size = UDim2.fromOffset(38, 38), BackgroundColor3 = Color3.fromRGB(255, 222, 181),
BorderSizePixel = 0, Text = "↙", Font = Enum.Font.GothamBold,
TextColor3 = Color3.fromRGB(89, 51, 37), TextSize = 20,
}, header)
corner(resize, 12)
resize.Activated:Connect(function()
compact = not compact
resize.Text = compact and "↗" or "↙"
tween(main, 0.25, { Size = compact and miniSize or normalSize }):Play()
end)
local tabBar = ui("ScrollingFrame", {
Name = "TabBar", Position = UDim2.fromOffset(12, 90), Size = UDim2.new(1, -24, 0, 45),
BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 0,
AutomaticCanvasSize = Enum.AutomaticSize.X, CanvasSize = UDim2.new(), ScrollingDirection = Enum.ScrollingDirection.X,
}, main)
local tabLayout = ui("UIListLayout", {
FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 7), SortOrder = Enum.SortOrder.LayoutOrder,
}, tabBar)
local pages = ui("Frame", {
Name = "Pages", Position = UDim2.fromOffset(12, 143), Size = UDim2.new(1, -24, 1, -155),
BackgroundTransparency = 1, BorderSizePixel = 0,
}, main)
local watermark = ui("TextLabel", {
Name = "CoffeeWatermark", AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.56),
Size = UDim2.fromScale(0.9, 0.55), BackgroundTransparency = 1,
Text = "☕ C A F E Z I T O S ☕", Font = Enum.Font.GothamBlack,
TextColor3 = Color3.fromRGB(255, 226, 193), TextTransparency = 0.91,
TextSize = mobileLayout and 32 or 48, ZIndex = 0,
}, pages)
local function updateResponsiveLayout()
local currentCamera = workspace.CurrentCamera
if not currentCamera then return end
mobileLayout, normalSize, miniSize = getResponsiveSizes(currentCamera.ViewportSize)
sizeConstraint.MinSize = mobileLayout and Vector2.new(250, 270) or Vector2.new(420, 350)
watermark.TextSize = mobileLayout and 30 or 48
main.Size = compact and miniSize or normalSize
end
local viewportConnection
local function bindViewportCamera()
if viewportConnection then
viewportConnection:Disconnect()
viewportConnection = nil
end
camera = workspace.CurrentCamera
if camera then
viewportConnection = trackConnection(
camera:GetPropertyChangedSignal("ViewportSize"):Connect(updateResponsiveLayout)
)
updateResponsiveLayout()
end
end
bindViewportCamera()
trackConnection(workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(bindViewportCamera))
local window = { tabs = {}, activeTab = nil, gui = gui }
local tabEmoji = {
["Jogador"] = "🧑", ["Teleporte"] = "🗺️", ["Carrinho"] = "🚋",
["Cart+"] = "⚡", ["Extras"] = "✨", ["Mapa"] = "🧭",
["Eliminador"] = "🎯", ["Troll"] = "🎭", ["Comandos"] = "☕",
["Interface"] = "🎨",
}
local function showTab(tab)
for _, other in ipairs(window.tabs) do
other.page.Visible = other == tab
other.button.BackgroundColor3 = other == tab and Theme.SchemeColor or Color3.fromRGB(67, 42, 31)
other.button.TextColor3 = other == tab and Color3.fromRGB(33, 20, 13) or Theme.TextColor
end
window.activeTab = tab
end
function window:NewTab(name)
local button = ui("TextButton", {
Name = name .. "TabButton", Size = UDim2.fromOffset(math.max(96, #name * 9 + 34), 44),
BackgroundColor3 = Color3.fromRGB(67, 42, 31), BorderSizePixel = 0,
Text = (tabEmoji[name] or "☕") .. " " .. name, Font = Enum.Font.GothamBold, TextColor3 = Theme.TextColor, TextSize = 13,
}, tabBar)
corner(button, 12)
local page = ui("ScrollingFrame", {
Name = name .. "Page", Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1,
BorderSizePixel = 0, ScrollBarThickness = 3, ScrollBarImageColor3 = Theme.SchemeColor,
AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(), Visible = false,
}, pages)
addPadding(page, 2)
ui("UIListLayout", { Padding = UDim.new(0, 10), SortOrder = Enum.SortOrder.LayoutOrder }, page)
local tab = { button = button, page = page }
table.insert(self.tabs, tab)
button.Activated:Connect(function() showTab(tab) end)
if #self.tabs == 1 then showTab(tab) end
function tab:NewSection(sectionName)
local section = ui("Frame", {
Name = sectionName .. "Section", Size = UDim2.new(1, -5, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
BackgroundColor3 = Color3.fromRGB(47, 28, 21), BorderSizePixel = 0,
}, page)
corner(section, 16); stroke(section, Color3.fromRGB(112, 70, 46), 1, 0.25); addPadding(section, 10)
ui("UIListLayout", { Padding = UDim.new(0, 7), SortOrder = Enum.SortOrder.LayoutOrder }, section)
ui("TextLabel", {
Size = UDim2.new(1, 0, 0, 22), BackgroundTransparency = 1, Text = sectionName:upper(),
Font = Enum.Font.GothamBold, TextColor3 = Theme.SchemeColor, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left,
}, section)
local api = {}
local function card(height, name)
local frame = ui("Frame", { Name = name or "CafeCard", Size = UDim2.new(1, 0, 0, height), BackgroundColor3 = Theme.ElementColor, BorderSizePixel = 0 }, section)
corner(frame, 12)
return frame
end
local function labels(frame, label, description, rightInset)
rightInset = rightInset or 0
local textWidth = -(28 + rightInset)
local title = ui("TextLabel", { Name = "togName", BackgroundTransparency = 1, Position = UDim2.fromOffset(14, 8), Size = UDim2.new(1, textWidth, 0, 20), Text = label, Font = Enum.Font.GothamBold, TextColor3 = Theme.TextColor, TextSize = 15, TextTruncate = Enum.TextTruncate.AtEnd, TextXAlignment = Enum.TextXAlignment.Left }, frame)
ui("TextLabel", { BackgroundTransparency = 1, Position = UDim2.fromOffset(14, 30), Size = UDim2.new(1, textWidth, 0, 17), Text = description or "", Font = Enum.Font.Gotham, TextColor3 = Color3.fromRGB(255, 220, 185), TextSize = 12, TextTruncate = Enum.TextTruncate.AtEnd, TextXAlignment = Enum.TextXAlignment.Left }, frame)
return title
end
function api:NewButton(label, description, callback)
local frame = ui("TextButton", { Name = "buttonElement", Size = UDim2.new(1, 0, 0, 62), BackgroundColor3 = Theme.ElementColor, BorderSizePixel = 0, Text = "", AutoButtonColor = false }, section)
corner(frame, 12); labels(frame, label, description, 108)
local action = ui("TextLabel", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0), Size = UDim2.fromOffset(37, 37), BackgroundColor3 = Theme.SchemeColor, BorderSizePixel = 0, Text = "›", Font = Enum.Font.GothamBold, TextColor3 = Theme.Background, TextSize = 26 }, frame)
corner(action, 10); CafeUI:trackAccent(action, "BackgroundColor3")
frame.Activated:Connect(function() if callback then callback() end end)
return frame
end
function api:NewToggle(label, description, callback)
local frame = ui("TextButton", { Name = "toggleElement", Size = UDim2.new(1, 0, 0, 62), BackgroundColor3 = Theme.ElementColor, BorderSizePixel = 0, Text = "", AutoButtonColor = false }, section)
corner(frame, 12); labels(frame, label, description, 108)
local knob = ui("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0), Size = UDim2.fromOffset(49, 30), BackgroundColor3 = Color3.fromRGB(72, 44, 33), BorderSizePixel = 0 }, frame)
corner(knob, 14)
local dot = ui("Frame", { Position = UDim2.fromOffset(3, 3), Size = UDim2.fromOffset(22, 22), BackgroundColor3 = Color3.fromRGB(180, 154, 132), BorderSizePixel = 0 }, knob); corner(dot, 11)
local state = false
local control = {}
function control:UpdateToggle(_, enabled)
state = enabled and true or false
tween(knob, 0.16, { BackgroundColor3 = state and CafeUI.accent or Color3.fromRGB(38, 24, 18) }):Play()
tween(dot, 0.16, { Position = UDim2.fromOffset(state and 20 or 3, 3), BackgroundColor3 = state and Theme.Background or Color3.fromRGB(180, 154, 132) }):Play()
if callback then callback(state) end
end
frame.Activated:Connect(function() control:UpdateToggle(nil, not state) end)
return control
end
function api:NewTextBox(label, description, callback)
local frame = ui("TextButton", { Name = "textboxElement", Size = UDim2.new(1, 0, 0, 84), BackgroundColor3 = Theme.ElementColor, BorderSizePixel = 0, Text = "", AutoButtonColor = false }, section)
corner(frame, 12); labels(frame, label, description, 0)
local input = ui("TextBox", { Position = UDim2.new(0, 13, 1, -34), Size = UDim2.new(1, -26, 0, 27), BackgroundColor3 = Color3.fromRGB(78, 46, 34), BorderSizePixel = 0, PlaceholderText = "Digite aqui...", Text = "", ClearTextOnFocus = false, Font = Enum.Font.Gotham, TextColor3 = Theme.TextColor, PlaceholderColor3 = Color3.fromRGB(239, 196, 158), TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left }, frame)
corner(input, 7); addPadding(input, 8)
input.FocusLost:Connect(function(enter) if enter and callback then callback(input.Text) end end)
return input
end
function api:NewSlider(label, description, maximum, minimum, defaultValue, callback)
-- Compatibilidade com chamadas antigas sem valor padrão.
if type(defaultValue) == "function" then
callback = defaultValue
defaultValue = minimum
end
maximum = maximum or 100
minimum = minimum or 0
local frame = card(84, "sliderElement"); labels(frame, label, description, 72)
local value = math.clamp(tonumber(defaultValue) or minimum, minimum, maximum)
local valueLabel = ui("TextLabel", { Position = UDim2.new(1, -64, 0, 8), Size = UDim2.fromOffset(50, 20), BackgroundTransparency = 1, Text = tostring(value), Font = Enum.Font.GothamBold, TextColor3 = Theme.SchemeColor, TextSize = 13, TextXAlignment = Enum.TextXAlignment.Right }, frame); CafeUI:trackAccent(valueLabel, "TextColor3")
local bar = ui("TextButton", { Position = UDim2.new(0, 13, 1, -23), Size = UDim2.new(1, -26, 0, 9), BackgroundColor3 = Color3.fromRGB(78, 46, 34), BorderSizePixel = 0, Text = "" }, frame); corner(bar, 5)
local range = maximum - minimum
local initialPercent = range ~= 0 and ((value - minimum) / range) or 0
local fill = ui("Frame", { Size = UDim2.new(initialPercent, 0, 1, 0), BackgroundColor3 = Theme.SchemeColor, BorderSizePixel = 0 }, bar); corner(fill, 4); CafeUI:trackAccent(fill, "BackgroundColor3")
local dragging = false
local control = {}
function control:SetValue(nextValue, invokeCallback)
nextValue = math.clamp(tonumber(nextValue) or minimum, minimum, maximum)
value = nextValue
local percent = range ~= 0 and ((value - minimum) / range) or 0
fill.Size = UDim2.new(percent, 0, 1, 0)
valueLabel.Text = tostring(value)
if invokeCallback ~= false and callback then callback(value) end
end
function control:GetValue()
return value
end
local function setFrom(input)
local percent = math.clamp((input.Position.X - bar.AbsolutePosition.X) / bar.AbsoluteSize.X, 0, 1)
control:SetValue(math.floor((minimum + range * percent) + 0.5), true)
end
bar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true; setFrom(input) end end)
trackConnection(UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then setFrom(input) end end))
trackConnection(UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end))
return control
end
function api:NewKeybind(label, description, keyCode, callback)
local frame = ui("TextButton", { Name = "keybindElement", Size = UDim2.new(1, 0, 0, 62), BackgroundColor3 = Theme.ElementColor, BorderSizePixel = 0, Text = "", AutoButtonColor = false }, section)
corner(frame, 12); labels(frame, label, description, 108)
local key = ui("TextLabel", { Name = "key", Position = UDim2.new(1, -49, 0.5, -13), Size = UDim2.fromOffset(37, 26), BackgroundColor3 = Color3.fromRGB(35, 21, 16), BorderSizePixel = 0, Text = keyCode.Name, Font = Enum.Font.GothamBold, TextColor3 = Theme.SchemeColor, TextSize = 11 }, frame); corner(key, 8); CafeUI:trackAccent(key, "TextColor3")
trackConnection(UserInputService.InputBegan:Connect(function(input, processed)
if destroyed or processed or UserInputService:GetFocusedTextBox() then return end
if input.KeyCode == keyCode and callback then callback() end
end))
return frame
end
return api
end
return tab
end
local startSize = mobileLayout and UDim2.fromScale(0.72, 0.56) or UDim2.fromScale(0.46, 0.46)
main.Size = startSize; main.BackgroundTransparency = 0.2
tween(main, 0.45, { Size = normalSize, BackgroundTransparency = 0 }):Play()
return window
end
local startup = {}
startup.gui, startup.status = showStartupCard()
startup.finished = false
startup.fail = function(reason)
if startup.finished or destroyed then return end
warn(MENU_NAME .. " startup: " .. tostring(reason))
if startup.status and startup.status.Parent then
startup.status.Text = "Não foi possível abrir • veja o console"
end
task.delay(1.5, function()
if startup.finished or destroyed then return end
destroyed = true
disconnectRuntimeConnections()
for _, guiRoot in ipairs(guiRoots) do
for _, gui in ipairs(guiRoot:GetChildren()) do
if gui:IsA("ScreenGui") and (
cafeGuiNames[gui.Name]
or gui.Name == "CafezitosFallbackHost"
) then
gui:Destroy()
end
end
end
if runtime and runtime.Parent then runtime:Destroy() end
end)
end
-- Se uma exceção interromper o arquivo no meio da montagem, a tela de loading
-- não fica presa para sempre.
task.delay(10, function()
if not startup.finished and not destroyed and isCurrentSuiteGeneration() then
startup.fail("tempo limite durante a montagem")
end
end)
-- A UI é local: não baixa biblioteca externa e abre igual no PC e no mobile.
if startup.status then startup.status.Text = "Montando a interface..." end
task.wait()
if destroyed or not runtime.Parent or not isCurrentSuiteGeneration() then return end
local Window
do
local createOk, windowOrError = xpcall(function()
return CafeUI.CreateLib(UI_TITLE, Theme)
end, CafeUI.traceback)
if not createOk then
startup.fail(windowOrError)
return
end
Window = windowOrError
end
if Window.gui then Window.gui.Enabled = false end
if startup.status and startup.status.Parent then startup.status.Text = "Montando funções e atalhos..." end
-- =============================================================================
-- Sistema de notificações (toasts)
-- =============================================================================
local toastContainer
local toastStrokes = {}
local function notify(title, text)
if not toastContainer or not toastContainer.Parent then
warn((title or MENU_NAME) .. ": " .. (text or ""))
return
end
local card = Instance.new("Frame")
card.Name = "CafezitosToast"
card.Size = UDim2.new(1, 0, 0, 74)
card.BackgroundColor3 = Color3.fromRGB(18, 18, 23)
card.BackgroundTransparency = 1
card.BorderSizePixel = 0
card.Parent = toastContainer
Instance.new("UICorner", card).CornerRadius = UDim.new(0, 15)
local stroke = Instance.new("UIStroke")
stroke.Name = "RGBStroke"
stroke.Thickness = 1.5
stroke.Transparency = 1
stroke.Parent = card
table.insert(toastStrokes, stroke)
local icon = Instance.new("TextLabel")
icon.Size = UDim2.fromOffset(42, 42)
icon.Position = UDim2.fromOffset(14, 16)
icon.BackgroundColor3 = Color3.fromRGB(30, 30, 37)
icon.BackgroundTransparency = 1
icon.Font = Enum.Font.GothamBold
icon.Text = "☕"
icon.TextColor3 = Color3.fromRGB(255, 255, 255)
icon.TextSize = 22
icon.TextTransparency = 1
icon.Parent = card
Instance.new("UICorner", icon).CornerRadius = UDim.new(1, 0)
local titleLabel = Instance.new("TextLabel")
titleLabel.Size = UDim2.new(1, -76, 0, 20)
titleLabel.Position = UDim2.fromOffset(68, 14)
titleLabel.BackgroundTransparency = 1
titleLabel.Font = Enum.Font.GothamBold
titleLabel.Text = title or MENU_NAME
titleLabel.TextColor3 = Color3.fromRGB(250, 250, 252)
titleLabel.TextSize = 14
titleLabel.TextTransparency = 1
titleLabel.TextXAlignment = Enum.TextXAlignment.Left
titleLabel.Parent = card
local bodyLabel = Instance.new("TextLabel")
bodyLabel.Size = UDim2.new(1, -76, 0, 30)
bodyLabel.Position = UDim2.fromOffset(68, 34)
bodyLabel.BackgroundTransparency = 1
bodyLabel.Font = Enum.Font.Gotham
bodyLabel.Text = text or ""
bodyLabel.TextColor3 = Color3.fromRGB(185, 185, 195)
bodyLabel.TextSize = 12
bodyLabel.TextTransparency = 1
bodyLabel.TextWrapped = true
bodyLabel.TextXAlignment = Enum.TextXAlignment.Left
bodyLabel.TextYAlignment = Enum.TextYAlignment.Top
bodyLabel.Parent = card
local ti = TweenInfo.new(0.22, Enum.EasingStyle.Quint, Enum.EasingDirection.Out)
TweenService:Create(card, ti, { BackgroundTransparency = 0 }):Play()
TweenService:Create(stroke, TweenInfo.new(0.22), { Transparency = 0.15 }):Play()
TweenService:Create(icon, TweenInfo.new(0.22), { BackgroundTransparency = 0, TextTransparency = 0 }):Play()
TweenService:Create(titleLabel, TweenInfo.new(0.22), { TextTransparency = 0 }):Play()
TweenService:Create(bodyLabel, TweenInfo.new(0.22), { TextTransparency = 0 }):Play()
task.delay(4, function()
if not card.Parent then return end
local tiOut = TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.In)
TweenService:Create(card, tiOut, { BackgroundTransparency = 1 }):Play()
TweenService:Create(stroke, tiOut, { Transparency = 1 }):Play()
TweenService:Create(icon, tiOut, { BackgroundTransparency = 1, TextTransparency = 1 }):Play()
TweenService:Create(titleLabel, tiOut, { TextTransparency = 1 }):Play()
TweenService:Create(bodyLabel, tiOut, { TextTransparency = 1 }):Play()
task.wait(0.25)
card:Destroy()
end)
end
-- =============================================================================
-- Helpers de personagem
-- =============================================================================
local function getCharacter(waitSeconds)
local character = LocalPlayer.Character
if character or not waitSeconds or waitSeconds <= 0 then return character end
local deadline = os.clock() + waitSeconds
repeat
task.wait()
character = LocalPlayer.Character
until character or destroyed or not isCurrentSuiteGeneration() or os.clock() >= deadline
return character
end
local function getHumanoid(character, waitSeconds)
character = character or getCharacter(waitSeconds)
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if humanoid or not character or not waitSeconds or waitSeconds <= 0 then return humanoid end
local deadline = os.clock() + waitSeconds
repeat
task.wait()
humanoid = character:FindFirstChildOfClass("Humanoid")
until humanoid or not character.Parent or destroyed
or not isCurrentSuiteGeneration() or os.clock() >= deadline
return humanoid
end
local function getRoot(character, waitSeconds)
character = character or getCharacter(waitSeconds)
local root = character and character:FindFirstChild("HumanoidRootPart")
if root or not character or not waitSeconds or waitSeconds <= 0 then return root end
root = character:WaitForChild("HumanoidRootPart", waitSeconds)
return root and root:IsA("BasePart") and root or nil
end
local function teleportCharacter(cframe)
if destroyed or not isCurrentSuiteGeneration() then return false end
local character = getCharacter(2)
local humanoid = getHumanoid(character, 2)
local root = getRoot(character, 2)
if destroyed or not isCurrentSuiteGeneration()
or not character or character ~= LocalPlayer.Character or not character.Parent
then return false end
if not root or not root.Parent then
notify("Teleporte", "HumanoidRootPart não encontrado.")
return false
end
-- RootPart soldado a um assento não se move de forma confiável. Soltar e
-- aguardar um frame replica o comportamento funcional da referência.
if humanoid and humanoid.SeatPart then
humanoid.Sit = false
pcall(function() humanoid:ChangeState(Enum.HumanoidStateType.GettingUp) end)
local deadline = os.clock() + 0.6
repeat RunService.Heartbeat:Wait()
until not humanoid.Parent or humanoid.SeatPart == nil
or destroyed or not isCurrentSuiteGeneration() or os.clock() >= deadline
if destroyed or not isCurrentSuiteGeneration()
or character ~= LocalPlayer.Character or not character.Parent
then return false end
root = getRoot(character, 1)
if not root or not root.Parent or humanoid.SeatPart then
notify("Teleporte", "Não foi possível sair do assento.")
return false
end
end
local ok = pcall(function()
root.AssemblyLinearVelocity = Vector3.zero
root.AssemblyAngularVelocity = Vector3.zero
root.CFrame = cframe
root.AssemblyLinearVelocity = Vector3.zero
root.AssemblyAngularVelocity = Vector3.zero
end)
if not ok then notify("Teleporte", "Não foi possível concluir o teleporte.") end
return ok
end
-- =============================================================================
-- ESP
-- =============================================================================
local ESP_TAG = "CafezitosESP"
local espEnabled = false
local espObjects = {}
local espPlayerConnections = {}
local espGlobalConnections = {}
local espSession = 0
local function getESPColor(player)
if player.Team and player.Team.TeamColor then
return player.Team.TeamColor.Color
end
return Color3.fromRGB(190, 130, 255)
end
local function removeESP(player)
local objects = espObjects[player]
if not objects then return end
if objects.Billboard and objects.Billboard.Parent then objects.Billboard:Destroy() end
if objects.Highlight and objects.Highlight.Parent then objects.Highlight:Destroy() end
local humanoid = objects.Humanoid
local state = objects.DisplayState
if humanoid and humanoid.Parent and state then
pcall(function()
humanoid.DisplayDistanceType = state.DisplayDistanceType
humanoid.NameOcclusion = state.NameOcclusion
humanoid.NameDisplayDistance = state.NameDisplayDistance
humanoid.HealthDisplayDistance = state.HealthDisplayDistance
end)
end
espObjects[player] = nil
end
local function refreshESPColor(player)
local objects = espObjects[player]
if not objects then return end
local color = getESPColor(player)
if objects.Highlight and objects.Highlight.Parent then
objects.Highlight.FillColor = color
objects.Highlight.OutlineColor = color
end
if objects.Label and objects.Label.Parent then
objects.Label.TextColor3 = color
end
end
local function refreshESPSize(player)
local objects = espObjects[player]
if not objects or not objects.Billboard or not objects.Billboard.Parent then return end
local localCharacter = LocalPlayer.Character
local localRoot = localCharacter and localCharacter:FindFirstChild("HumanoidRootPart")
local targetRoot = objects.Billboard.Adornee
if not localRoot or not targetRoot or not targetRoot.Parent then
objects.Billboard.Enabled = false
return
end
local distance = (localRoot.Position - targetRoot.Position).Magnitude
local scaleStartDistance = 150
objects.Billboard.Enabled = true
if objects.Label and objects.Label.Parent then
local displayName = player.DisplayName ~= "" and player.DisplayName or player.Name
objects.Label.Text = string.format("%s • %d studs", displayName, math.floor(distance + 0.5))
end
local progress = math.clamp((distance - scaleStartDistance) / 450, 0, 1)
objects.Billboard.Size = UDim2.fromOffset(
math.floor(118 + (220 - 118) * progress),
math.floor(18 + (36 - 18) * progress)
)
end
local function addESP(player, character)
if not espEnabled or player == LocalPlayer then return end
character = character or player.Character
if not character or not character.Parent then return end
local root = character:FindFirstChild("HumanoidRootPart")
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not root or not humanoid then return end
removeESP(player)
local displayState = {
DisplayDistanceType = humanoid.DisplayDistanceType,
NameOcclusion = humanoid.NameOcclusion,
NameDisplayDistance = humanoid.NameDisplayDistance,
HealthDisplayDistance = humanoid.HealthDisplayDistance,
}
pcall(function()
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
humanoid.NameOcclusion = Enum.NameOcclusion.NoOcclusion
humanoid.NameDisplayDistance = 0
humanoid.HealthDisplayDistance = 0
end)
local billboard = Instance.new("BillboardGui")
billboard.Name = ESP_TAG .. "Name"
billboard.Size = UDim2.fromOffset(118, 18)
billboard.Enabled = false
billboard.Adornee = root
billboard.AlwaysOnTop = true
billboard.LightInfluence = 0
billboard.MaxDistance = math.huge
billboard.StudsOffset = Vector3.new(0, 3.2, 0)
billboard.Parent = root
local label = Instance.new("TextLabel")
label.Name = "NameLabel"
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Font = Enum.Font.GothamBold
label.Text = player.DisplayName ~= "" and player.DisplayName or player.Name
label.TextScaled = true
label.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
label.TextStrokeTransparency = 0
label.Parent = billboard
local highlight = Instance.new("Highlight")
highlight.Name = ESP_TAG
highlight.FillTransparency = 0.5
highlight.OutlineTransparency = 0
highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
highlight.Adornee = character
highlight.Parent = character
espObjects[player] = {
Billboard = billboard,
Label = label,
Highlight = highlight,
Humanoid = humanoid,
DisplayState = displayState,
}
refreshESPColor(player)
refreshESPSize(player)
end
local function disconnectESPPlayer(player)
local connections = espPlayerConnections[player]
if connections then
for _, c in ipairs(connections) do c:Disconnect() end
end
espPlayerConnections[player] = nil
end
local function watchESPPlayer(player)
if player == LocalPlayer then return end
disconnectESPPlayer(player)
local connections = {}
local watchSession = espSession
espPlayerConnections[player] = connections
table.insert(connections, player.CharacterAdded:Connect(function(character)
character:WaitForChild("HumanoidRootPart", 5)
local deadline = os.clock() + 5
while character.Parent and not character:FindFirstChildOfClass("Humanoid")
and os.clock() < deadline do task.wait() end
if destroyed or not espEnabled or watchSession ~= espSession then return end
addESP(player, character)
end))
table.insert(connections, player.CharacterRemoving:Connect(function()
removeESP(player)
end))
table.insert(connections, player:GetPropertyChangedSignal("Team"):Connect(function()
refreshESPColor(player)
end))
table.insert(connections, player:GetPropertyChangedSignal("DisplayName"):Connect(function()
refreshESPSize(player)
end))
addESP(player, player.Character)
end
local function clearESP()
for _, c in ipairs(espGlobalConnections) do c:Disconnect() end
table.clear(espGlobalConnections)
local connectedPlayers = {}
for player in pairs(espPlayerConnections) do table.insert(connectedPlayers, player) end
for _, player in ipairs(connectedPlayers) do disconnectESPPlayer(player) end
local renderedPlayers = {}
for player in pairs(espObjects) do table.insert(renderedPlayers, player) end
for _, player in ipairs(renderedPlayers) do removeESP(player) end
end
local function setESP(enabled)
espEnabled = enabled
espSession = espSession + 1
clearESP()
if not enabled then notify("ESP", "Desligado.") return end
for _, player in ipairs(Players:GetPlayers()) do watchESPPlayer(player) end
table.insert(espGlobalConnections, Players.PlayerAdded:Connect(watchESPPlayer))
table.insert(espGlobalConnections, Players.PlayerRemoving:Connect(function(player)
removeESP(player)
disconnectESPPlayer(player)
end))
local session = espSession
task.spawn(function()
while espEnabled and session == espSession do
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and player.Character then
local objects = espObjects[player]
local valid = objects
and objects.Billboard and objects.Billboard.Parent
and objects.Highlight and objects.Highlight.Parent
if not valid then
removeESP(player)
addESP(player, player.Character)
else
refreshESPSize(player)
end
end
end
task.wait(0.25)
end
end)
notify("ESP", "Ligado: nomes e contornos ativos.")
end
local flyEnabled = false
local flyToggleControl
local boostToggleControl
local panicToggleControl
local stopBoost
local fakeLagActive = false
local fakeLagSession = 0
local fakeLagHumanoid
local desiredWalkSpeed
local desiredJumpPower
local desiredJumpHeight
local createdTools = {}
local killerActive = false
local killerSession = 0
local cartMotionPauseUntil = 0
local cartFeatureTiming = { antiFlipReadyAt = 0, autobrakeHoldUntil = 0, autobrakeReadyAt = 0 }
local activeCameraMode
local cameraModeStoppers = {}
local cameraBaseline
local function captureCameraBaseline()
local camera = workspace.CurrentCamera
if not camera then return end
cameraBaseline = {
camera = camera,
cameraType = camera.CameraType,
cameraSubject = camera.CameraSubject,
cframe = camera.CFrame,
focus = camera.Focus,
fieldOfView = camera.FieldOfView,
}
end
local function restoreDefaultCamera()
local camera = workspace.CurrentCamera
local baseline = cameraBaseline
cameraBaseline = nil
if not camera then return end
local restored = false
if baseline and baseline.camera == camera then
restored = pcall(function()
camera.CameraType = baseline.cameraType
camera.CFrame = baseline.cframe
camera.Focus = baseline.focus
camera.FieldOfView = baseline.fieldOfView
local subject = baseline.cameraSubject
if subject and subject.Parent then camera.CameraSubject = subject
else
local humanoid = getHumanoid()
if humanoid then camera.CameraSubject = humanoid end
end
end)
end
if not restored then
pcall(function()
camera.CameraType = Enum.CameraType.Custom
local humanoid = getHumanoid()
if humanoid then camera.CameraSubject = humanoid end
end)
end
end
local function claimCameraMode(mode)
if activeCameraMode == mode then return end
local previous = activeCameraMode
if not previous then captureCameraBaseline() end
activeCameraMode = mode
local stopper = previous and cameraModeStoppers[previous]
if stopper then pcall(stopper) end
end
local function releaseCameraMode(mode)
if activeCameraMode ~= mode then return end
activeCameraMode = nil
restoreDefaultCamera()
end
local function resetCameraModes()
local previous = activeCameraMode
activeCameraMode = nil
local stopper = previous and cameraModeStoppers[previous]
if stopper then pcall(stopper) end
restoreDefaultCamera()
end
-- =============================================================================
-- Voo (Vehicle Fly)
-- =============================================================================
local FLYING = false
local vehicleFlySpeed = 1
local flyKeyDown
local flyKeyUp
local flyHumanoid
local flyAutoRotate
local flyPlatformStand
local flySavedState = {
freefall = nil, fallingDown = nil, inputEnabled = true,
humanoidModified = false, startedSeated = false,
}
local flyRoot
local flyBodyGyro
local flyBodyVelocity
local flySession = 0
local mouse = LocalPlayer:GetMouse()
local flyTouchUp = 0
local flyTouchDown = 0
local flyMobileGui
local function showMobileFlyControls(visible)
if not UserInputService.TouchEnabled then return end
if flyMobileGui and flyMobileGui.Parent then
flyMobileGui.Enabled = visible
return
end
if not visible then return end
local gui = Instance.new("ScreenGui")
gui.Name = "CafezitosMobileFly"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.DisplayOrder = 10020
gui.Parent = CoreGui
flyMobileGui = gui
local panel = Instance.new("Frame")
panel.Name = "ControlesDeVoo"
panel.AnchorPoint = Vector2.new(1, 0.5)
panel.Position = UDim2.new(1, -16, 0.5, 0)
panel.Size = UDim2.fromOffset(72, 124)
panel.BackgroundColor3 = Color3.fromRGB(10, 10, 13)
panel.BackgroundTransparency = 0.12
panel.BorderSizePixel = 0
panel.Parent = gui
Instance.new("UICorner", panel).CornerRadius = UDim.new(0, 14)
local ps = Instance.new("UIStroke", panel)
ps.Color = Theme.SchemeColor
ps.Thickness = 1
local titleL = Instance.new("TextLabel")
titleL.BackgroundTransparency = 1
titleL.Position = UDim2.fromOffset(0, 6)
titleL.Size = UDim2.new(1, 0, 0, 18)
titleL.Font = Enum.Font.GothamBold
titleL.Text = "VOO"
titleL.TextColor3 = Color3.fromRGB(245, 245, 245)
titleL.TextSize = 11
titleL.Parent = panel
local function makeBtn(symbol, y, setDir)
local btn = Instance.new("TextButton")
btn.Size = UDim2.fromOffset(52, 38)
btn.Position = UDim2.new(0.5, -26, 0, y)
btn.BackgroundColor3 = Color3.fromRGB(28, 28, 35)
btn.BorderSizePixel = 0
btn.AutoButtonColor = false
btn.Font = Enum.Font.GothamBold
btn.Text = symbol
btn.TextColor3 = Theme.SchemeColor
btn.TextSize = 22
btn.Parent = panel
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 10)
btn.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch
or input.UserInputType == Enum.UserInputType.MouseButton1 then
setDir(1)
btn.BackgroundColor3 = Color3.fromRGB(48, 48, 58)
end
end)
btn.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Touch
or input.UserInputType == Enum.UserInputType.MouseButton1 then
setDir(0)
btn.BackgroundColor3 = Color3.fromRGB(28, 28, 35)
end
end)
end
makeBtn("▲", 30, function(v) flyTouchUp = v end)
makeBtn("▼", 74, function(v) flyTouchDown = v end)
end
local function stopFly()
flySession = flySession + 1
FLYING = false
flyTouchUp = 0
flyTouchDown = 0
showMobileFlyControls(false)
if flyKeyDown then flyKeyDown:Disconnect() flyKeyDown = nil end
if flyKeyUp then flyKeyUp:Disconnect() flyKeyUp = nil end
if flyBodyGyro and flyBodyGyro.Parent then flyBodyGyro:Destroy() end
if flyBodyVelocity and flyBodyVelocity.Parent then flyBodyVelocity:Destroy() end
local function removeNamedMovers(root)
if root and root.Parent then
local gyro = root:FindFirstChild("CafezitosVehicleFlyGyro")
local velocity = root:FindFirstChild("CafezitosVehicleFlyVelocity")
if gyro then gyro:Destroy() end
if velocity then velocity:Destroy() end
end
end
removeNamedMovers(flyRoot)
local currentRoot = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
if currentRoot ~= flyRoot then removeNamedMovers(currentRoot) end
local humanoid = flyHumanoid or getHumanoid()
if humanoid and humanoid.Parent and flySavedState.humanoidModified then
if flyPlatformStand ~= nil then humanoid.PlatformStand = flyPlatformStand end
if flyAutoRotate ~= nil then humanoid.AutoRotate = flyAutoRotate end
pcall(function()
humanoid:SetStateEnabled(
Enum.HumanoidStateType.Freefall,
flySavedState.freefall == nil and true or flySavedState.freefall
)
humanoid:SetStateEnabled(
Enum.HumanoidStateType.FallingDown,
flySavedState.fallingDown == nil and true or flySavedState.fallingDown
)
end)
end
flyHumanoid = nil
flyAutoRotate = nil
flyPlatformStand = nil
flyRoot = nil
flyBodyGyro = nil
flyBodyVelocity = nil
flySavedState.freefall = nil
flySavedState.fallingDown = nil
flySavedState.inputEnabled = true
flySavedState.humanoidModified = false
flySavedState.startedSeated = false
releaseCameraMode("fly")
end
local function startVehicleFly(inputEnabled)
stopFly()
local session = flySession
local character = getCharacter(3)
local root = getRoot(character, 3)
local humanoid = getHumanoid(character, 3)
if destroyed or not isCurrentSuiteGeneration() or session ~= flySession
or not character or character ~= LocalPlayer.Character or not character.Parent
then return false end
if not root or not root.Parent or not humanoid or not humanoid.Parent then
notify("Voo do Veículo", "Personagem não encontrado.")
return false
end
claimCameraMode("fly")
pcall(function()
local camera = workspace.CurrentCamera
if camera then camera.CameraType = Enum.CameraType.Track end
end)
flyHumanoid = humanoid
flyAutoRotate = humanoid.AutoRotate
flyPlatformStand = humanoid.PlatformStand
flySavedState.inputEnabled = inputEnabled ~= false
flySavedState.startedSeated = humanoid.SeatPart ~= nil
pcall(function()
flySavedState.freefall = humanoid:GetStateEnabled(Enum.HumanoidStateType.Freefall)
flySavedState.fallingDown = humanoid:GetStateEnabled(Enum.HumanoidStateType.FallingDown)
end)
-- O Vehicle Fly original do DEV R-77 usa sFLY(true): ele nunca coloca o
-- Humanoid em PlatformStand. Isso preserva a solda do VehicleSeat e evita
-- que o carrinho solte/entorte assim que o voo liga.
flySavedState.humanoidModified = false
local control = { F=0, B=0, L=0, R=0, Q=0, E=0 }
FLYING = true
showMobileFlyControls(flySavedState.inputEnabled)
local bodyGyro = Instance.new("BodyGyro")
bodyGyro.Name = "CafezitosVehicleFlyGyro"
bodyGyro.P = 90000
bodyGyro.MaxTorque = Vector3.new(9e9, 9e9, 9e9)
bodyGyro.CFrame = root.CFrame
bodyGyro.Parent = root
flyRoot = root
flyBodyGyro = bodyGyro
local bodyVelocity = Instance.new("BodyVelocity")
bodyVelocity.Name = "CafezitosVehicleFlyVelocity"
bodyVelocity.MaxForce = Vector3.new(9e9, 9e9, 9e9)
bodyVelocity.Velocity = Vector3.zero
bodyVelocity.Parent = root
flyBodyVelocity = bodyVelocity
flyKeyDown = UserInputService.InputBegan:Connect(function(input, processed)
if not flySavedState.inputEnabled or processed or UserInputService:GetFocusedTextBox() then return end
local key = input.KeyCode
if key == Enum.KeyCode.W then control.F = vehicleFlySpeed
elseif key == Enum.KeyCode.S then control.B = -vehicleFlySpeed
elseif key == Enum.KeyCode.A then control.L = -vehicleFlySpeed
elseif key == Enum.KeyCode.D then control.R = vehicleFlySpeed
elseif key == Enum.KeyCode.E then control.Q = vehicleFlySpeed * 2
elseif key == Enum.KeyCode.Q then control.E = -vehicleFlySpeed * 2
end
end)
flyKeyUp = UserInputService.InputEnded:Connect(function(input)
local key = input.KeyCode
if key == Enum.KeyCode.W then control.F = 0
elseif key == Enum.KeyCode.S then control.B = 0
elseif key == Enum.KeyCode.A then control.L = 0
elseif key == Enum.KeyCode.D then control.R = 0
elseif key == Enum.KeyCode.E then control.Q = 0
elseif key == Enum.KeyCode.Q then control.E = 0
end
end)
task.spawn(function()
local boundCamera
while FLYING and session == flySession and root.Parent and humanoid.Parent
and bodyGyro.Parent and bodyVelocity.Parent
do
task.wait()
if flySavedState.startedSeated and humanoid.SeatPart == nil then break end
local camera = workspace.CurrentCamera
if not camera then break end
if camera ~= boundCamera then
boundCamera = camera
pcall(function() camera.CameraType = Enum.CameraType.Track end)
end
if flySavedState.inputEnabled and UserInputService.KeyboardEnabled then
control.F = UserInputService:IsKeyDown(Enum.KeyCode.W) and vehicleFlySpeed or 0
control.B = UserInputService:IsKeyDown(Enum.KeyCode.S) and -vehicleFlySpeed or 0
control.L = UserInputService:IsKeyDown(Enum.KeyCode.A) and -vehicleFlySpeed or 0
control.R = UserInputService:IsKeyDown(Enum.KeyCode.D) and vehicleFlySpeed or 0
control.Q = UserInputService:IsKeyDown(Enum.KeyCode.E) and vehicleFlySpeed * 2 or 0
control.E = UserInputService:IsKeyDown(Enum.KeyCode.Q) and -vehicleFlySpeed * 2 or 0
end
local keyboardMoving = flySavedState.inputEnabled and ((control.L + control.R ~= 0)
or (control.F + control.B ~= 0)
or (control.Q + control.E ~= 0))
local mobileDir = humanoid.MoveDirection
if UserInputService.TouchEnabled
and Vector3.new(mobileDir.X, 0, mobileDir.Z).Magnitude <= 0.05
then
local seat = humanoid.SeatPart
if seat and seat:IsA("VehicleSeat") then
local flatLook = Vector3.new(camera.CFrame.LookVector.X, 0, camera.CFrame.LookVector.Z)
local flatRight = Vector3.new(camera.CFrame.RightVector.X, 0, camera.CFrame.RightVector.Z)
if flatLook.Magnitude > 0.01 then flatLook = flatLook.Unit end
if flatRight.Magnitude > 0.01 then flatRight = flatRight.Unit end
mobileDir = flatLook * seat.ThrottleFloat + flatRight * seat.SteerFloat
end
end
local mobileMoving = flySavedState.inputEnabled and UserInputService.TouchEnabled and (
Vector3.new(mobileDir.X, 0, mobileDir.Z).Magnitude > 0.05
or flyTouchUp ~= 0 or flyTouchDown ~= 0
)
if keyboardMoving then
-- Mesma equação do sFLY(true) do DEV R-77. Os controles já
-- carregam o multiplicador de velocidade; aplicar de novo aqui
-- deixava o valor quadrático e diferente do menu de referência.
local cameraCFrame = camera.CFrame
local direction = cameraCFrame.LookVector * (control.F + control.B)
+ ((cameraCFrame * CFrame.new(
control.L + control.R,
(control.F + control.B + control.Q + control.E) * 0.2,
0
)).Position - cameraCFrame.Position)
bodyVelocity.Velocity = direction * 50
elseif mobileMoving then
bodyVelocity.Velocity =
Vector3.new(mobileDir.X, 0, mobileDir.Z) * (vehicleFlySpeed * 50)
+ Vector3.new(0, (flyTouchUp - flyTouchDown) * vehicleFlySpeed * 50, 0)
else
bodyVelocity.Velocity = Vector3.zero
end
bodyGyro.CFrame = camera.CFrame
end
if bodyGyro.Parent then bodyGyro:Destroy() end
if bodyVelocity.Parent then bodyVelocity:Destroy() end
if flyBodyGyro == bodyGyro then flyBodyGyro = nil end
if flyBodyVelocity == bodyVelocity then flyBodyVelocity = nil end
if flyRoot == root then flyRoot = nil end
if session == flySession and FLYING then
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
end
end)
return true
end
cameraModeStoppers.fly = function()
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
end
-- =============================================================================
-- Carrinho: helpers, parada, checkpoints, estabilizador
-- =============================================================================
local function findCartFromSeat(seat)
if not seat or not seat:IsA("BasePart") then return nil end
local assemblyRoot = seat.AssemblyRootPart
local current = seat.Parent
local fallback
while current and current ~= workspace do
if current:IsA("Model") then
fallback = fallback or current
local assemblyParts = 0
for _, object in ipairs(current:GetDescendants()) do
if object:IsA("BasePart")
and (not assemblyRoot or object.AssemblyRootPart == assemblyRoot)
then
assemblyParts = assemblyParts + 1
if assemblyParts >= 2 then return current end
end
end
end
current = current.Parent
end
return fallback
end
-- O carrinho so muda quando o Humanoid senta/troca de assento. Manter esse
-- snapshot evita repetir GetDescendants em todo Heartbeat dos controladores.
local cartCache = {
humanoid = nil,
seat = nil,
cart = nil,
assemblyRoot = nil,
primary = nil,
}
local function clearCurrentCartCache()
cartCache.humanoid = nil
cartCache.seat = nil
cartCache.cart = nil
cartCache.assemblyRoot = nil
cartCache.primary = nil
end
local function cacheCurrentCart(humanoid, seat)
clearCurrentCartCache()
if not humanoid or not seat or not seat:IsA("BasePart") or not seat.Parent then
return nil
end
cartCache.humanoid = humanoid
cartCache.seat = seat
cartCache.assemblyRoot = seat.AssemblyRootPart
cartCache.cart = findCartFromSeat(seat)
-- Os checkpoints do menu antigo foram gravados para o PrimaryPart do
-- carrinho. Usar AssemblyRootPart primeiro deslocava e girava o modelo em
-- relação às coordenadas originais.
cartCache.primary = (cartCache.cart and cartCache.cart.PrimaryPart)
or cartCache.assemblyRoot
return cartCache.cart
end
local function getCurrentCart()
local humanoid = getHumanoid()
local seat = humanoid and humanoid.SeatPart
if not humanoid or not seat or not seat.Parent then
clearCurrentCartCache()
return nil
end
if cartCache.humanoid == humanoid
and cartCache.seat == seat
and cartCache.cart
and cartCache.cart.Parent
and cartCache.cart:IsAncestorOf(seat)
and (not cartCache.assemblyRoot or cartCache.assemblyRoot.Parent)
and cartCache.assemblyRoot == seat.AssemblyRootPart
then
return cartCache.cart
end
return cacheCurrentCart(humanoid, seat)
end
-- Retorna a parte principal do carrinho de forma robusta
local function getCartPrimary(cart)
if not cart then return nil end
if cart.PrimaryPart then
if cartCache.cart == cart then cartCache.primary = cart.PrimaryPart end
return cart.PrimaryPart
end
if cartCache.cart == cart and cartCache.primary and cartCache.primary.Parent then
return cartCache.primary
end
local humanoid = getHumanoid()
local seat = humanoid and humanoid.SeatPart
if seat and cart:IsAncestorOf(seat) and seat.AssemblyRootPart then
if cartCache.cart == cart then cartCache.primary = seat.AssemblyRootPart end
return seat.AssemblyRootPart
end
local firstUnanchored
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") and not part.Anchored then
firstUnanchored = firstUnanchored or part
if part.AssemblyRootPart == part then return part end
end
end
if cartCache.cart == cart then cartCache.primary = firstUnanchored end
return firstUnanchored
end
local panicParts = {}
local panicActive = false
local function restorePanicStop()
for part, wasAnchored in pairs(panicParts) do
if part and part.Parent then part.Anchored = wasAnchored end
end
panicParts = {}
panicActive = false
end
local function setPanicStop(enabled)
if not enabled then
restorePanicStop()
notify("Carrinho", "Parada de emergência desligada.")
return true
end
local cart = getCurrentCart()
if not cart then
notify("Carrinho", "Sente em um carrinho primeiro.")
return false
end
if killerActive then
killerSession = killerSession + 1
killerActive = false
end
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
if stopBoost then stopBoost() end
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
-- Se a função for chamada novamente enquanto já está ativa, restaura o
-- snapshot anterior antes de capturar o novo estado.
restorePanicStop()
panicActive = true
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") then
panicParts[part] = part.Anchored
part.Anchored = true
part.AssemblyLinearVelocity = Vector3.zero
part.AssemblyAngularVelocity = Vector3.zero
end
end
notify("Carrinho", "Parada de emergência ligada.")
return true
end
local function pivotCartByReference(cart, desiredReferenceCFrame)
local reference = getCartPrimary(cart)
if not cart or not reference or not reference.Parent then return false end
return pcall(function()
local referenceOffset = cart:GetPivot():ToObjectSpace(reference.CFrame)
local function stopPart(part)
if not part.Anchored then
pcall(function()
part.AssemblyLinearVelocity = Vector3.zero
part.AssemblyAngularVelocity = Vector3.zero
end)
end
end
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") then stopPart(part) end
end
cart:PivotTo(desiredReferenceCFrame * referenceOffset:Inverse())
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") then stopPart(part) end
end
end)
end
local function stopCartControllersForTeleport()
cartMotionPauseUntil = os.clock() + 0.3
if killerActive then
killerSession = killerSession + 1
killerActive = false
end
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
if stopBoost then stopBoost() end
restorePanicStop()
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
if panicToggleControl then
task.defer(function() panicToggleControl:UpdateToggle(nil, false) end)
end
end
local function teleportCart(cframe)
local cart = getCurrentCart()
if not cart then notify("Carrinho", "Sente em um carrinho primeiro.") return false end
stopCartControllersForTeleport()
local ok = pivotCartByReference(cart, cframe)
if ok then
notify("Carrinho", "Carrinho movido para o checkpoint.")
else
notify("Carrinho", "Não foi possível mover este carrinho.")
end
return ok
end
local STABILIZER_CONFIG = { NORMAL_FORCE = 2500, DOWNHILL_FORCE = 800 }
local stabilizer = { enabled = false, cart = nil, forces = {}, attachments = {}, heartbeat = nil }
local function cleanupStabilizer()
if stabilizer.heartbeat then stabilizer.heartbeat:Disconnect() stabilizer.heartbeat = nil end
for _, force in ipairs(stabilizer.forces) do
if force and force.Parent then force:Destroy() end
end
for _, attachment in ipairs(stabilizer.attachments) do
if attachment and attachment.Parent then attachment:Destroy() end
end
stabilizer.forces = {}
stabilizer.attachments = {}
stabilizer.cart = nil
end
local function getWheels(cart)
local wheels = {}
local keywords = { "wheel", "tire", "tyre", "roda", "pneu", "axle", "roue" }
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") and not part.Anchored then
local name = part.Name:lower()
for _, kw in ipairs(keywords) do
if name:find(kw, 1, true) then
table.insert(wheels, part)
break
end
end
end
end
if #wheels == 0 then
local parts = {}
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") and not part.Anchored then
table.insert(parts, part)
end
end
table.sort(parts, function(a, b) return a.Position.Y < b.Position.Y end)
local count = math.max(1, math.floor(#parts / 3))
for i = 1, math.min(count, #parts) do table.insert(wheels, parts[i]) end
end
return wheels
end
local function applyStabilizer(cart)
cleanupStabilizer()
if not cart or not cart.Parent then return end
local wheels = getWheels(cart)
if #wheels == 0 then notify("Estabilizador", "Nenhuma roda encontrada.") return end
stabilizer.cart = cart
for _, part in ipairs(wheels) do
for _, child in ipairs(part:GetChildren()) do
if child:IsA("VectorForce") and child.Name == "CafezitosStabilizerForce" then
child:Destroy()
end
end
local att = part:FindFirstChild("_CafezitosStabilizer")
if not att then
att = Instance.new("Attachment")
att.Name = "_CafezitosStabilizer"
att.Parent = part
end
table.insert(stabilizer.attachments, att)
local force = Instance.new("VectorForce")
force.Name = "CafezitosStabilizerForce"
force.Attachment0 = att
force.RelativeTo = Enum.ActuatorRelativeTo.World
force.Force = Vector3.zero
force.Parent = part
table.insert(stabilizer.forces, force)
end
local reference = getCartPrimary(cart) or wheels[1]
stabilizer.heartbeat = RunService.Heartbeat:Connect(function()
if not reference or not reference.Parent then cleanupStabilizer() return end
local mag = 0
if stabilizer.enabled and not FLYING and not panicActive
and os.clock() >= cartMotionPauseUntil
and os.clock() >= cartFeatureTiming.autobrakeHoldUntil
then
mag = math.abs(reference.AssemblyLinearVelocity.Y) > 5
and STABILIZER_CONFIG.DOWNHILL_FORCE
or STABILIZER_CONFIG.NORMAL_FORCE
end
for _, force in ipairs(stabilizer.forces) do
if force and force.Parent and force.Attachment0 and force.Attachment0.Parent then
force.Force = Vector3.new(0, -mag * force.Parent.AssemblyMass, 0)
elseif force and force.Parent then
force:Destroy()
end
end
end)
end
local function refreshStabilizer()
if stabilizer.enabled then
local cart = getCurrentCart()
if cart then applyStabilizer(cart)
else notify("Estabilizador", "Sente em um carrinho primeiro.") end
else
cleanupStabilizer()
end
end
local seatConnection
local function watchSeat(character)
-- Este watcher roda em task.defer/CharacterAdded, nunca em Heartbeat.
-- Um unico wait limitado cobre personagens cujo Humanoid chega depois.
local humanoid = character and character:FindFirstChildOfClass("Humanoid")
if not humanoid and character and character.Parent then
humanoid = character:WaitForChild("Humanoid", 5)
end
if destroyed or not isCurrentSuiteGeneration()
or not character or character ~= LocalPlayer.Character or not character.Parent
or not humanoid or not humanoid:IsA("Humanoid") or not humanoid.Parent
then return end
if seatConnection then
seatConnection:Disconnect()
seatConnection = nil
end
local initialSeat = humanoid.SeatPart
if initialSeat then
local initialCart = cacheCurrentCart(humanoid, initialSeat)
if stabilizer.enabled then applyStabilizer(initialCart) end
else
clearCurrentCartCache()
end
seatConnection = trackConnection(humanoid.Seated:Connect(function(isSeated, seat)
if destroyed or not isCurrentSuiteGeneration()
or character ~= LocalPlayer.Character or humanoid.Parent ~= character
then return end
if not isSeated then
clearCurrentCartCache()
cleanupStabilizer()
restorePanicStop()
if FLYING and flySavedState.startedSeated then
if flyEnabled and flyToggleControl then
task.defer(function() flyToggleControl:UpdateToggle(nil, false) end)
else
stopFly()
end
end
if stopBoost then stopBoost() end
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
if panicToggleControl then
task.defer(function() panicToggleControl:UpdateToggle(nil, false) end)
end
else
local cart = cacheCurrentCart(humanoid, seat)
if stabilizer.enabled then applyStabilizer(cart) end
end
end))
end
local function teleportPlayerOrCart(cframe)
local cart = getCurrentCart()
if cart then
stopCartControllersForTeleport()
return pivotCartByReference(cart, cframe)
end
return teleportCharacter(cframe)
end
do
local initialCharacter = LocalPlayer.Character
if initialCharacter then
task.defer(function()
if not destroyed and isCurrentSuiteGeneration() then
watchSeat(initialCharacter)
end
end)
end
end
trackConnection(LocalPlayer.CharacterAdded:Connect(function(character)
if destroyed or not isCurrentSuiteGeneration() then return end
clearCurrentCartCache()
cleanupStabilizer()
restorePanicStop()
if panicToggleControl then
task.defer(function() panicToggleControl:UpdateToggle(nil, false) end)
end
fakeLagSession = fakeLagSession + 1
fakeLagActive = false
fakeLagHumanoid = nil
if stopBoost then stopBoost() end
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
task.defer(resetCameraModes)
task.defer(watchSeat, character)
task.delay(0.25, function()
if destroyed or not isCurrentSuiteGeneration()
or character ~= LocalPlayer.Character or not character.Parent
then return end
local humanoid = getHumanoid(character)
if not humanoid then return end
if not activeCameraMode then restoreDefaultCamera() end
if fakeLagActive then return end
if desiredWalkSpeed then humanoid.WalkSpeed = desiredWalkSpeed end
if humanoid.UseJumpPower and desiredJumpPower then
humanoid.JumpPower = desiredJumpPower
elseif not humanoid.UseJumpPower and desiredJumpHeight then
humanoid.JumpHeight = desiredJumpHeight
end
end)
end))
trackConnection(LocalPlayer.CharacterRemoving:Connect(function()
killerSession = killerSession + 1
killerActive = false
clearCurrentCartCache()
cleanupStabilizer()
restorePanicStop()
if stopBoost then stopBoost() end
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
if panicToggleControl then
task.defer(function() panicToggleControl:UpdateToggle(nil, false) end)
end
resetCameraModes()
end))
-- =============================================================================
-- Eliminador (Killer)
-- =============================================================================
local function findNearestFreeVehicleSeat()
local root = getRoot(nil, 5)
if not root then return nil end
local bestVS, bestVD = nil, math.huge
for _, inst in ipairs(workspace:GetDescendants()) do
if inst:IsA("VehicleSeat") and not inst.Occupant then
local dist = (root.Position - inst.Position).Magnitude
if dist < bestVD then bestVS = inst; bestVD = dist end
end
end
return bestVS
end
local function findPlayerByPartialName(value)
value = (value or ""):match("^%s*(.-)%s*$"):lower()
if value == "" then return nil end
for _, p in ipairs(Players:GetPlayers()) do
if p.Name:lower() == value or p.DisplayName:lower() == value then return p end
end
for _, p in ipairs(Players:GetPlayers()) do
local n = p.Name:lower(); local d = p.DisplayName:lower()
if n:sub(1, #value) == value or d:sub(1, #value) == value then return p end
end
for _, p in ipairs(Players:GetPlayers()) do
if p.Name:lower():find(value, 1, true) or p.DisplayName:lower():find(value, 1, true) then return p end
end
return nil
end
local function sitOnVehicleSeat(seat, session)
local root = getRoot(nil, 5)
local humanoid = getHumanoid(nil, 5)
if destroyed or not isCurrentSuiteGeneration()
or (session and (session ~= killerSession or not killerActive))
or not seat or not root or not humanoid or seat.Occupant
then return false end
if humanoid.SeatPart and humanoid.SeatPart ~= seat then
humanoid.Sit = false
pcall(function() humanoid:ChangeState(Enum.HumanoidStateType.GettingUp) end)
local deadline = os.clock() + 0.5
repeat RunService.Heartbeat:Wait()
until not humanoid.Parent or not humanoid.SeatPart or destroyed
or (session and session ~= killerSession) or os.clock() >= deadline
if destroyed or not isCurrentSuiteGeneration() or not humanoid.Parent
or (session and (session ~= killerSession or not killerActive))
then return false end
end
for _ = 1, 3 do
if destroyed or not isCurrentSuiteGeneration()
or (session and (session ~= killerSession or not killerActive))
or not seat.Parent or seat.Occupant
then break end
root.CFrame = seat.CFrame * CFrame.new(0, 2, 0)
task.wait(0.12)
if destroyed or (session and session ~= killerSession) then return false end
pcall(function() seat:Sit(humanoid) end)
task.wait(0.2)
if destroyed or (session and session ~= killerSession) then return false end
if humanoid.SeatPart == seat or seat.Occupant == humanoid then return true end
humanoid.Sit = true
task.wait(0.12)
if destroyed or (session and session ~= killerSession) then return false end
if humanoid.SeatPart == seat or seat.Occupant == humanoid then return true end
end
return false
end
local function moveToTarget(targetRoot, duration, session, seat, cart)
local root = getRoot()
local humanoid = getHumanoid()
local started = os.clock()
while os.clock() - started < duration do
if destroyed or not killerActive or session ~= killerSession then return false end
if not root or not root.Parent or not humanoid or not humanoid.Parent
or not targetRoot or not targetRoot.Parent
or not seat or not seat.Parent or seat.Occupant ~= humanoid
or humanoid.SeatPart ~= seat or getCurrentCart() ~= cart
then return false end
local pos = targetRoot.Position - targetRoot.CFrame.LookVector * 1.2 + Vector3.new(0, 1.5, 0)
root.CFrame = CFrame.lookAt(pos, targetRoot.Position)
RunService.Heartbeat:Wait()
end
return true
end
local function finishKiller(message, session)
if session and session ~= killerSession then return end
killerSession = killerSession + 1
local cleanupSession = killerSession
local humanoid = getHumanoid()
local wasSeated = humanoid and humanoid.SeatPart ~= nil
if humanoid then
humanoid.Sit = false
pcall(function() humanoid:ChangeState(Enum.HumanoidStateType.GettingUp) end)
end
if wasSeated then
task.wait(0.05)
if killerSession ~= cleanupSession then return end
end
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
killerActive = false
if message then notify("Eliminador", message) end
end
local function executeKiller(partialName)
if killerActive then notify("Eliminador", "Aguarde a tentativa atual terminar.") return end
local target = findPlayerByPartialName(partialName)
if not target or target == LocalPlayer then
notify("Eliminador", target == LocalPlayer and "Escolha outro jogador." or "Jogador não encontrado.")
return
end
killerSession = killerSession + 1
local session = killerSession
killerActive = true
if flyEnabled and flyToggleControl then
flyToggleControl:UpdateToggle(nil, false)
else
stopFly()
end
if stopBoost then stopBoost() end
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
local humanoid = getHumanoid(nil, 5)
local seat = humanoid and humanoid.SeatPart
local alreadySeated = seat and seat:IsA("VehicleSeat") and seat.Occupant == humanoid
if not alreadySeated then
seat = findNearestFreeVehicleSeat()
if not seat then finishKiller("Não há carrinho livre por perto.", session) return end
if not sitOnVehicleSeat(seat, session) then finishKiller("Não foi possível sentar no carrinho.", session) return end
end
if destroyed or session ~= killerSession then return end
local cart = cacheCurrentCart(humanoid, seat)
if not cart then finishKiller("Estrutura do carrinho não reconhecida.", session) return end
-- O Eliminador escreve o CFrame diretamente; entradas WASD/touch ficariam
-- concorrendo com esse movimento e desviando o carrinho do alvo.
if not startVehicleFly(false) then finishKiller("Não foi possível iniciar o voo.", session) return end
task.wait(0.15)
if destroyed or session ~= killerSession then return end
local targetRoot
local deadline = os.clock() + 2
repeat
local char = target.Character
targetRoot = char and char:FindFirstChild("HumanoidRootPart")
if targetRoot then break end
task.wait(0.2)
until os.clock() >= deadline or destroyed or session ~= killerSession
if not targetRoot then finishKiller("Personagem do alvo não carregou.", session) return end
local reached = moveToTarget(targetRoot, 3, session, seat, cart)
if session == killerSession then
finishKiller(reached and "Carrinho levado ao alvo." or "Tentativa cancelada.", session)
end
end
trackConnection(LocalPlayer.CharacterAdded:Connect(function()
killerSession = killerSession + 1
killerActive = false
end))
-- =============================================================================
-- Variáveis adiantadas (usadas nos callbacks de atalho)
-- =============================================================================
local getKavoTextBoxByLabel
local restoreKavoTextBox
local infiniteJump = false
local espToggleControl
local infiniteJumpToggleControl
-- =============================================================================
-- ABA: Jogador
-- =============================================================================
local PlayerSection = Window:NewTab("Jogador"):NewSection("Configurações do Jogador")
local walkSpeedSlider = PlayerSection:NewSlider("Velocidade", "Velocidade de caminhada (padrão 16).", 500, 0, 16, function(value)
desiredWalkSpeed = value
local h = getHumanoid()
if h and not fakeLagActive then h.WalkSpeed = value end
end)
PlayerSection:NewButton("Redefinir Velocidade", "Volta para 16.", function()
desiredWalkSpeed = 16
local h = getHumanoid()
if h and not fakeLagActive then h.WalkSpeed = 16 end
walkSpeedSlider:SetValue(16, false)
notify("Velocidade", "Redefinida para 16.")
end)
infiniteJumpToggleControl = PlayerSection:NewToggle(
"Pulo Infinito", "Pula no ar. Tecla P.", function(state)
infiniteJump = state
notify("Pulo Infinito", state and "Ligado." or "Desligado.")
end
)
-- BUG CORRIGIDO: JumpRequest dispara bem, mas não estava verificando se
-- o humanoid existia antes de chamar ChangeState
trackConnection(UserInputService.JumpRequest:Connect(function()
if destroyed or not infiniteJump then return end
local h = getHumanoid()
if h then h:ChangeState(Enum.HumanoidStateType.Jumping) end
end))
local function giveClickTeleportTool()
local backpack = LocalPlayer:FindFirstChildOfClass("Backpack")
if not backpack then return end
local character = LocalPlayer.Character
if backpack:FindFirstChild("ClickTP")
or (character and character:FindFirstChild("ClickTP")) then
notify("Teleporte por Clique", "A ferramenta já está na mochila.")
return
end
local tool = Instance.new("Tool")
tool.Name = "ClickTP"
tool.RequiresHandle = false
tool.Activated:Connect(function()
teleportCharacter(CFrame.new(mouse.Hit.Position + Vector3.new(0, 2.5, 0)))
end)
tool.Parent = backpack
table.insert(createdTools, tool)
notify("Teleporte por Clique", "Ferramenta criada. Clique no mapa para teleportar.")
end
PlayerSection:NewButton("Teleporte por Clique", "Cria ferramenta na mochila. Tecla T.", giveClickTeleportTool)
PlayerSection:NewTextBox("Ir até Jogador", "Nome do jogador. Enter.", function(name)
local player = findPlayerByPartialName(name)
if not player then notify("Ir até Jogador", "Jogador não encontrado.") return end
local targetRoot
local deadline = os.clock() + 2
repeat
local char = player.Character
targetRoot = char and char:FindFirstChild("HumanoidRootPart")
if targetRoot then break end
task.wait(0.2)
until os.clock() >= deadline
if not targetRoot then notify("Ir até Jogador", "Personagem não carregou.") return end
teleportCharacter(targetRoot.CFrame * CFrame.new(0, 2, 0))
notify("Ir até Jogador", "Teleportado para " .. player.DisplayName .. ".")
end)
local function setVehicleFlyEnabled(enabled)
flyEnabled = enabled
if enabled then
if stopBoost then stopBoost() end
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
if startVehicleFly() then
notify("Voo do Veículo", "Ligado.")
else
flyEnabled = false
task.defer(function()
if flyToggleControl then flyToggleControl:UpdateToggle(nil, false) end
end)
end
else
stopFly()
notify("Voo do Veículo", "Desligado.")
end
end
flyToggleControl = PlayerSection:NewToggle(
"Voo do Veículo", "Tecla V liga/desliga.", setVehicleFlyEnabled
)
espToggleControl = PlayerSection:NewToggle(
"ESP", "Destaca jogadores. Tecla L.", setESP
)
PlayerSection:NewTextBox("Velocidade do Voo", "Digite e aperte Enter.", function(value)
local n = tonumber(value)
if n and n > 0 then vehicleFlySpeed = n; notify("Voo", "Velocidade: " .. n)
else notify("Voo", "Digite um número maior que zero.") end
end)
PlayerSection:NewButton("Redefinir Velocidade do Voo", "Volta para 1.", function()
vehicleFlySpeed = 1
restoreKavoTextBox("Velocidade do Voo", 1)
notify("Voo", "Velocidade redefinida para 1.")
end)
-- Novo: God Mode local (impede a morte localmente via Humanoid.Health)
-- BUG CORRIGIDO: usar HealthChanged em vez de loop — mais limpo e sem
-- lag acumulado quando o personagem respawna
local godEnabled = false
local godConn
local godRespawnConn
local godHumanoid
local godOriginalMaxHealth
local godOriginalHealth
local function restoreGodHumanoid()
if godConn then godConn:Disconnect() godConn = nil end
local h = godHumanoid
if h and h.Parent and godOriginalMaxHealth then
h.MaxHealth = godOriginalMaxHealth
h.Health = math.clamp(godOriginalHealth or godOriginalMaxHealth, 1, godOriginalMaxHealth)
end
godHumanoid, godOriginalMaxHealth, godOriginalHealth = nil, nil, nil
end
local function connectGod()
restoreGodHumanoid()
local h = getHumanoid()
if not h then return end
godHumanoid = h
godOriginalMaxHealth = h.MaxHealth
godOriginalHealth = h.Health
h.MaxHealth = math.huge
h.Health = math.huge
godConn = h.HealthChanged:Connect(function()
if godEnabled and h.Parent and h.Health < 1 then h.Health = h.MaxHealth end
end)
end
local function setGodMode(state)
godEnabled = state
if not state then
restoreGodHumanoid()
notify("God Mode", "Desligado.")
return
end
connectGod()
if not godRespawnConn then
godRespawnConn = LocalPlayer.CharacterAdded:Connect(function()
task.wait(0.3)
if godEnabled then connectGod() end
end)
end
notify("God Mode", "Ligado (só funciona localmente).")
end
PlayerSection:NewToggle(
"God Mode (local)",
"Impede que sua vida caia abaixo de 1 localmente.",
setGodMode
)
-- Novo: Anti-AFK — previne kick por inatividade
local antiAfkEnabled = false
local antiAfkConn
PlayerSection:NewToggle("Anti-AFK", "Mantém a sessão de teste ativa.", function(enabled)
antiAfkEnabled = enabled
if antiAfkConn then
antiAfkConn:Disconnect()
antiAfkConn = nil
end
if not enabled then
notify("Anti-AFK", "Desligado.")
return
end
antiAfkConn = LocalPlayer.Idled:Connect(function()
if not antiAfkEnabled then return end
pcall(function()
local virtualUser = game:GetService("VirtualUser")
virtualUser:CaptureController()
virtualUser:ClickButton2(Vector2.zero, workspace.CurrentCamera.CFrame)
end)
end)
notify("Anti-AFK", "Ligado.")
end)
-- =============================================================================
-- ABA: Teleporte
-- =============================================================================
do
local TeleportSection = Window:NewTab("Teleporte"):NewSection("Teleportes")
TeleportSection:NewButton("Início", "Teleporta para o início da trilha.", function()
if teleportCharacter(CFrame.new(1, 3.11, 38)) then
notify("Teleporte", "Teleportado para o início.")
end
end)
TeleportSection:NewButton("Botão de Carrinho", "Teleporta para o botão do carrinho.", function()
if teleportCharacter(CFrame.new(-33, 3.11, 21.5) * CFrame.Angles(0, math.rad(180), 0)) then
notify("Teleporte", "Teleportado para o botão.")
end
end)
TeleportSection:NewButton("Equipe Suffering", "Teleporta para a área Suffering.", function()
if teleportCharacter(CFrame.new(
-416.844727, 163.402969, 171.087555,
0.0174489655, 5.45878223e-08, 0.99984777,
-4.55684486e-08, 1, -5.38008926e-08,
-0.99984777, -4.46227411e-08, 0.0174489655
)) then
notify("Teleporte", "Teleportado para Suffering.")
end
end)
TeleportSection:NewButton("Insígnia Secreta", "Teleporta para a Secret Badge.", function()
if teleportCharacter(CFrame.new(234.500259, 2.28650475, 296.495483)) then
notify("Teleporte", "Teleportado para a insígnia secreta.")
end
end)
TeleportSection:NewButton("Sala Secreta", "Procura Workspace.Misc.Giver.", function()
local misc = workspace:FindFirstChild("Misc")
local giver = misc and misc:FindFirstChild("Giver")
local part = giver and (giver:IsA("BasePart") and giver or giver:FindFirstChildWhichIsA("BasePart", true))
if not part then notify("Teleporte", "Misc.Giver não encontrado.") return end
if teleportPlayerOrCart(part.CFrame * CFrame.new(0, 3, 0)) then
notify("Teleporte", "Teleportado para a sala secreta.")
end
end)
end
local CHECKPOINTS = {
[1] = CFrame.new(-430.898926, 164.75, 101.645676) * CFrame.Angles(0, math.rad(90), 0),
[2] = CFrame.new(511.88, 3.69, 306.59) * CFrame.Angles(0, math.rad(270), 0),
[3] = CFrame.new(171.09, 2.78, -410.31) * CFrame.Angles(0, math.rad(90), 0),
}
local function teleportToCheckpoint(number)
local dest = CHECKPOINTS[number]
if dest then teleportCart(dest) end
end
-- =============================================================================
-- ABA: Carrinho
-- =============================================================================
do
local CartTab = Window:NewTab("Carrinho")
local CartSection = CartTab:NewSection("Controle do Carrinho")
panicToggleControl = CartSection:NewToggle(
"Parada de Emergência",
"Para e trava o carrinho.",
function(state)
local applied = setPanicStop(state)
if state and not applied then
task.defer(function() panicToggleControl:UpdateToggle(nil, false) end)
end
end
)
CartSection:NewButton("Ir ao Checkpoint 1", "NumPad 1.", function() teleportToCheckpoint(1) end)
CartSection:NewButton("Ir ao Checkpoint 2", "NumPad 2.", function() teleportToCheckpoint(2) end)
CartSection:NewButton("Ir ao Checkpoint 3", "NumPad 3.", function() teleportToCheckpoint(3) end)
-- Novo: Velocidade do carrinho em tempo real
CartSection:NewButton("Ver Velocidade do Carrinho", "Mostra studs/s na notificação.", function()
local cart = getCurrentCart()
if not cart then notify("Velocidade", "Sente em um carrinho primeiro.") return end
local primary = getCartPrimary(cart)
if not primary then notify("Velocidade", "Estrutura não reconhecida.") return end
local vel = primary.AssemblyLinearVelocity.Magnitude
notify("Velocidade do Cart", string.format("%.1f studs/s", vel))
end)
-- Novo: Ejetar do carrinho
CartSection:NewButton("Ejetar do Carrinho", "Sai do assento atual.", function()
local h = getHumanoid()
if h then
h.Sit = false
notify("Carrinho", "Ejetado.")
else
notify("Carrinho", "Personagem não encontrado.")
end
end)
local StabilizerSection = CartTab:NewSection("Estabilizador")
StabilizerSection:NewToggle("Estabilizador do Carrinho", "Mantém estável enquanto sentado.", function(state)
stabilizer.enabled = state
refreshStabilizer()
if state and getCurrentCart() then notify("Estabilizador", "Ligado.")
elseif not state then notify("Estabilizador", "Desligado.") end
end)
StabilizerSection:NewTextBox("Força Normal", "Padrão 2500. Enter.", function(value)
local n = tonumber(value)
if n and n > 0 then
STABILIZER_CONFIG.NORMAL_FORCE = n
restoreKavoTextBox("Força Normal", n)
notify("Estabilizador", "Força normal: " .. n)
else
notify("Estabilizador", "Digite um número maior que zero.")
end
end)
StabilizerSection:NewTextBox("Força em Descidas", "Padrão 800. Enter.", function(value)
local n = tonumber(value)
if n and n > 0 then
STABILIZER_CONFIG.DOWNHILL_FORCE = n
restoreKavoTextBox("Força em Descidas", n)
notify("Estabilizador", "Força descida: " .. n)
else
notify("Estabilizador", "Digite um número maior que zero.")
end
end)
StabilizerSection:NewButton("Redefinir Forças", "Volta para 2500 e 800.", function()
STABILIZER_CONFIG.NORMAL_FORCE = 2500
STABILIZER_CONFIG.DOWNHILL_FORCE = 800
restoreKavoTextBox("Força Normal", 2500)
restoreKavoTextBox("Força em Descidas", 800)
refreshStabilizer()
notify("Estabilizador", "Forças redefinidas.")
end)
end
-- =============================================================================
-- ABA: Cart+ (boost, anti-flip, freio automático)
-- =============================================================================
local BoostSection = Window:NewTab("Cart+"):NewSection("Boost e Física")
local boostActive = false
local boostForce = 500
local boostConnection
local boostBodyForce = nil
local boostAttachment
local boostAttachmentCreated = false
local boostCartRoot
stopBoost = function()
boostActive = false
if boostConnection then boostConnection:Disconnect() boostConnection = nil end
if boostBodyForce and boostBodyForce.Parent then
boostBodyForce:Destroy()
end
if boostAttachmentCreated and boostAttachment and boostAttachment.Parent then
boostAttachment:Destroy()
end
boostBodyForce = nil
boostAttachment = nil
boostAttachmentCreated = false
boostCartRoot = nil
end
local function startBoost()
stopBoost()
if panicActive or FLYING or killerActive then
notify("Boost", "Indisponível durante parada, voo ou Eliminador.")
return false
end
local cart = getCurrentCart()
if not cart then notify("Boost", "Sente em um carrinho primeiro.") return false end
local primary = getCartPrimary(cart)
if not primary then notify("Boost", "Estrutura do carrinho não reconhecida.") return false end
boostCartRoot = primary.AssemblyRootPart or primary
local attachment = primary:FindFirstChild("CafezitosBoostAttachment")
if not attachment then
attachment = Instance.new("Attachment")
attachment.Name = "CafezitosBoostAttachment"
attachment.Parent = primary
boostAttachmentCreated = true
end
boostAttachment = attachment
local previousForce = primary:FindFirstChild("CafezitosBoost")
if previousForce and previousForce:IsA("VectorForce") then previousForce:Destroy() end
local bf = Instance.new("VectorForce")
bf.Name = "CafezitosBoost"
bf.Attachment0 = attachment
bf.RelativeTo = Enum.ActuatorRelativeTo.World
bf.ApplyAtCenterOfMass = true
bf.Force = Vector3.zero
bf.Parent = primary
boostBodyForce = bf
boostActive = true
boostConnection = RunService.Heartbeat:Connect(function()
local currentCart = getCurrentCart()
local currentPrimary = currentCart and getCartPrimary(currentCart)
local currentRoot = currentPrimary and (currentPrimary.AssemblyRootPart or currentPrimary)
if not boostActive or panicActive or FLYING or killerActive
or not primary.Parent or not bf.Parent
or currentCart ~= cart or currentRoot ~= boostCartRoot
then
stopBoost()
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
return
end
bf.Force = primary.CFrame.LookVector * boostForce * primary.AssemblyMass * 60
end)
notify("Boost", "Ligado — força " .. boostForce .. ".")
return true
end
boostToggleControl = BoostSection:NewToggle(
"Boost do Carrinho", "Empurra pra frente. Tecla B.", function(state)
if state then
if not startBoost() then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
else
stopBoost()
notify("Boost", "Desligado.")
end
end
)
BoostSection:NewSlider("Força do Boost", "Intensidade (padrão 500).", 3000, 0, 500, function(value)
boostForce = value
if boostActive and not startBoost() then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
end)
-- Anti-Flip com cooldown correto
local antiFlipEnabled = false
local antiFlipConn
BoostSection:NewToggle("Anti-Flip", "Endireita o carrinho ao tombar automaticamente.", function(state)
antiFlipEnabled = state
if antiFlipConn then antiFlipConn:Disconnect() antiFlipConn = nil end
cartFeatureTiming.antiFlipReadyAt = 0
if not state then
notify("Anti-Flip", "Desligado.")
return
end
antiFlipConn = RunService.Heartbeat:Connect(function()
if not antiFlipEnabled or panicActive or FLYING or killerActive
or os.clock() < cartMotionPauseUntil
or os.clock() < cartFeatureTiming.antiFlipReadyAt
then return end
local cart = getCurrentCart()
if not cart then return end
local primary = getCartPrimary(cart)
if not primary or not primary.Parent then return end
local dot = primary.CFrame.UpVector:Dot(Vector3.new(0, 1, 0))
if dot < 0.5 then
cartFeatureTiming.antiFlipReadyAt = os.clock() + 1.5
if boostActive then
stopBoost()
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
end
local pos = primary.CFrame.Position
local look = Vector3.new(primary.CFrame.LookVector.X, 0, primary.CFrame.LookVector.Z)
look = look.Magnitude > 0.01 and look.Unit or Vector3.new(1, 0, 0)
local targetPosition = pos + Vector3.new(0, 2, 0)
local ok = pivotCartByReference(cart, CFrame.new(targetPosition, targetPosition + look))
if ok then notify("Anti-Flip", "Carrinho endireitado.") end
end
end)
notify("Anti-Flip", "Ligado.")
end)
-- Freio automático ao detectar queda livre
local autobrakeEnabled = false
local autobrakeConn
BoostSection:NewToggle("Freio Automático", "Trava ao detectar queda livre.", function(state)
autobrakeEnabled = state
if autobrakeConn then autobrakeConn:Disconnect() autobrakeConn = nil end
cartFeatureTiming.autobrakeHoldUntil = 0
cartFeatureTiming.autobrakeReadyAt = 0
if not state then
notify("Freio Automático", "Desligado.")
return
end
autobrakeConn = RunService.Heartbeat:Connect(function()
if not autobrakeEnabled or panicActive or FLYING or killerActive
or os.clock() < cartMotionPauseUntil
then return end
local cart = getCurrentCart()
if not cart then return end
local primary = getCartPrimary(cart)
if not primary then return end
local now = os.clock()
if now < cartFeatureTiming.autobrakeHoldUntil then
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") and not part.Anchored then
pcall(function()
part.AssemblyLinearVelocity = Vector3.zero
part.AssemblyAngularVelocity = Vector3.zero
end)
end
end
return
end
if now >= cartFeatureTiming.autobrakeReadyAt and primary.AssemblyLinearVelocity.Y < -35 then
cartFeatureTiming.autobrakeHoldUntil = now + 0.45
cartFeatureTiming.autobrakeReadyAt = now + 1.25
if boostActive then
stopBoost()
if boostToggleControl then
task.defer(function() boostToggleControl:UpdateToggle(nil, false) end)
end
end
for _, part in ipairs(cart:GetDescendants()) do
if part:IsA("BasePart") and not part.Anchored then
pcall(function()
part.AssemblyLinearVelocity = Vector3.zero
part.AssemblyAngularVelocity = Vector3.zero
end)
end
end
notify("Freio Automático", "Queda detectada — travado.")
end
end)
notify("Freio Automático", "Ligado.")
end)
-- =============================================================================
-- ABA: Extras (jogador)
-- =============================================================================
local ExtrasSection = Window:NewTab("Extras"):NewSection("Movimento e Física")
-- Noclip corrigido: CanCollide precisa ser reposto a cada Stepped
-- porque o motor físico reseta automaticamente
local noclipEnabled = false
local noclipOriginal = {}
local function restoreNoclip()
for part, canCollide in pairs(noclipOriginal) do
if part and part.Parent then
part.CanCollide = canCollide
end
end
table.clear(noclipOriginal)
end
trackConnection(RunService.Stepped:Connect(function()
if not noclipEnabled then return end
local character = LocalPlayer.Character
if not character then return end
for _, part in ipairs(character:GetDescendants()) do
if part:IsA("BasePart") then
if noclipOriginal[part] == nil then
noclipOriginal[part] = part.CanCollide
end
part.CanCollide = false
end
end
end))
ExtrasSection:NewToggle("Noclip", "Atravessa paredes durante o teste.", function(enabled)
noclipEnabled = enabled
if not enabled then restoreNoclip() end
notify("Noclip", enabled and "Ligado." or "Desligado.")
end)
-- Invisível local: LocalTransparencyModifier só afeta o cliente local
local invisEnabled = false
local invisOriginal = {}
local function setLocalInvisible(enabled)
local character = LocalPlayer.Character
if not character then return end
for _, object in ipairs(character:GetDescendants()) do
if object:IsA("BasePart") or object:IsA("Decal") then
if enabled and invisOriginal[object] == nil then
invisOriginal[object] = object.LocalTransparencyModifier
end
object.LocalTransparencyModifier = enabled and 1 or (invisOriginal[object] or 0)
end
end
if not enabled then table.clear(invisOriginal) end
end
ExtrasSection:NewToggle("Invisível (local)", "Só você se vê transparente.", function(enabled)
invisEnabled = enabled
setLocalInvisible(enabled)
notify("Invisível", enabled and "Ligado (só você vê)." or "Desligado.")
end)
trackConnection(LocalPlayer.CharacterAdded:Connect(function()
task.wait(0.25)
if invisEnabled and not destroyed then setLocalInvisible(true) end
end))
local jumpPowerSlider = ExtrasSection:NewSlider("Jump Power", "Altura do pulo (padrão 50).", 300, 0, 50, function(value)
local h = getHumanoid()
if h then
if h.UseJumpPower then desiredJumpPower = value
else desiredJumpHeight = value end
if not fakeLagActive then
if h.UseJumpPower then h.JumpPower = value else h.JumpHeight = value end
end
end
end)
ExtrasSection:NewButton("Redefinir Jump Power", "Volta para 50.", function()
local h = getHumanoid()
if h then
if h.UseJumpPower then desiredJumpPower = 50
else desiredJumpHeight = 7.2 end
if not fakeLagActive then
if h.UseJumpPower then h.JumpPower = 50 else h.JumpHeight = 7.2 end
end
end
jumpPowerSlider:SetValue(50, false)
notify("Jump Power", "Redefinido.")
end)
local gravitySlider = ExtrasSection:NewSlider("Gravidade", "Gravidade global (padrão 196.2).", 400, 0, math.clamp(originalGravity, 0, 400), function(value)
workspace.Gravity = value
end)
ExtrasSection:NewButton("Redefinir Gravidade", "Volta ao valor original do jogo.", function()
workspace.Gravity = originalGravity
gravitySlider:SetValue(math.clamp(originalGravity, 0, 400), false)
notify("Gravidade", "Valor original restaurado.")
end)
-- Salvar / restaurar posição (funciona pra jogador e carrinho)
local savedPosition = nil
ExtrasSection:NewButton("Salvar Posição Atual", "Salva onde você está.", function()
local cart = getCurrentCart()
local reference = cart and getCartPrimary(cart) or getRoot()
if not reference then notify("Posição", "Personagem não encontrado.") return end
savedPosition = reference.CFrame
local p = reference.Position
notify("Posição", string.format("Salva em %.0f, %.0f, %.0f", p.X, p.Y, p.Z))
end)
ExtrasSection:NewButton("Voltar à Posição Salva", "Teleporta de volta.", function()
if not savedPosition then notify("Posição", "Nenhuma posição salva ainda.") return end
if teleportPlayerOrCart(savedPosition) then notify("Posição", "Teleportado.") end
end)
-- =============================================================================
-- ABA: Mapa
-- =============================================================================
local MapSection = Window:NewTab("Mapa"):NewSection("Exploração")
-- Ir até parte por nome — busca com prioridade (exato > começo > contém)
MapSection:NewTextBox("Ir até Parte", "Nome da parte no workspace. Enter.", function(value)
value = value:match("^%s*(.-)%s*$"):lower()
if value == "" then return end
local best, bestPriority = nil, 0
for _, obj in ipairs(workspace:GetDescendants()) do
if obj:IsA("BasePart") then
local name = obj.Name:lower()
local priority = 0
if name == value then priority = 3
elseif name:sub(1, #value) == value then priority = 2
elseif name:find(value, 1, true) then priority = 1
end
if priority > bestPriority then best = obj; bestPriority = priority end
end
end
if not best then notify("Mapa", "Parte '" .. value .. "' não encontrada.") return end
teleportCharacter(best.CFrame * CFrame.new(0, 4, 0))
notify("Mapa", "Teleportado para: " .. best.Name)
end)
-- Listar partes no output (F9 pra ver)
MapSection:NewButton("Listar Partes no Output (F9)", "Imprime 30 BaseParts no console.", function()
print("[Cafezitos V2] === BaseParts no Workspace ===")
local count = 0
for _, obj in ipairs(workspace:GetDescendants()) do
if obj:IsA("BasePart") and count < 30 then
print(("[Cafezitos V2] %s pos: %s"):format(obj:GetFullName(), tostring(obj.Position)))
count = count + 1
end
end
print(("[Cafezitos V2] %d partes listadas. Abra F9 para ver."):format(count))
notify("Mapa", count .. " partes no output (F9).")
end)
-- Carrinho: encontra pelo assento, não pelo nome do Model nem por SpawnLocation.
local function findNearestCartSeat()
local root = getRoot()
if not root then return nil end
for _, wantedClass in ipairs({ "VehicleSeat", "Seat" }) do
local nearest, nearestDistance = nil, math.huge
for _, object in ipairs(workspace:GetDescendants()) do
if object:IsA(wantedClass) then
local distance = (root.Position - object.Position).Magnitude
if distance < nearestDistance then
nearest = object
nearestDistance = distance
end
end
end
if nearest then return nearest end
end
return nil
end
MapSection:NewButton("Ir ao Carrinho", "Procura o assento do carrinho mais próximo.", function()
local seat = findNearestCartSeat()
if not seat then
notify("Carrinho", "Nenhum assento de carrinho foi encontrado.")
return
end
if teleportCharacter(seat.CFrame * CFrame.new(0, 4, 0)) then
notify("Carrinho", "Teleportado para o carrinho.")
end
end)
-- Câmera livre — WASD + Q/E, desacoplada do personagem
local freecamActive = false
local freecamConn
local freecamSpeed = 1
local freecamToggleControl
local function stopFreecam()
freecamActive = false
if freecamConn then freecamConn:Disconnect() freecamConn = nil end
releaseCameraMode("freecam")
end
cameraModeStoppers.freecam = function()
if freecamToggleControl then freecamToggleControl:UpdateToggle(nil, false)
else stopFreecam() end
end
freecamToggleControl = MapSection:NewToggle("Câmera Livre", "WASD move, Q/E sobe e desce.", function(state)
if not state then
stopFreecam()
notify("Câmera Livre", "Desligada.")
return
end
claimCameraMode("freecam")
freecamActive = true
local camera = workspace.CurrentCamera
if not camera then
stopFreecam()
task.defer(function() freecamToggleControl:UpdateToggle(nil, false) end)
return
end
camera.CameraType = Enum.CameraType.Scriptable
local cf = camera.CFrame
freecamConn = RunService.RenderStepped:Connect(function(deltaTime)
if not freecamActive then return end
local currentCamera = workspace.CurrentCamera
if not currentCamera then return end
if currentCamera ~= camera then
camera = currentCamera
camera.CameraType = Enum.CameraType.Scriptable
end
local move = Vector3.zero
if UserInputService:IsKeyDown(Enum.KeyCode.W) then move = move + cf.LookVector end
if UserInputService:IsKeyDown(Enum.KeyCode.S) then move = move - cf.LookVector end
if UserInputService:IsKeyDown(Enum.KeyCode.A) then move = move - cf.RightVector end
if UserInputService:IsKeyDown(Enum.KeyCode.D) then move = move + cf.RightVector end
if UserInputService:IsKeyDown(Enum.KeyCode.E) then move = move + Vector3.new(0, 1, 0) end
if UserInputService:IsKeyDown(Enum.KeyCode.Q) then move = move - Vector3.new(0, 1, 0) end
if move.Magnitude > 0 then
cf = CFrame.new(cf.Position + move * freecamSpeed * math.clamp(deltaTime * 60, 0, 3))
* (cf - cf.Position)
end
camera.CFrame = cf
camera.Focus = cf * CFrame.new(0, 0, -12)
end)
notify("Câmera Livre", "WASD move, Q/E sobe e desce. Desative para voltar.")
end)
MapSection:NewSlider("Velocidade da Câmera Livre", "Velocidade de movimento (1–10).", 10, 1, 1, function(value)
freecamSpeed = value
end)
-- =============================================================================
-- ABA: Eliminador
-- =============================================================================
do
local KillerSection = Window:NewTab("Eliminador"):NewSection("Controle de Alvo")
local targetName = ""
KillerSection:NewTextBox("Nome do Alvo", "Parte do nome. Enter.", function(value)
targetName = value
end)
KillerSection:NewButton("Alcançar Alvo", "Usa o carrinho livre mais próximo.", function()
if not targetName or targetName:match("^%s*$") then
notify("Eliminador", "Digite uma parte do nome primeiro.")
return
end
local requested = targetName
task.spawn(function()
local ok, err = xpcall(function()
executeKiller(requested)
end, CafeUI.traceback)
if not ok then
warn(MENU_NAME .. " Killer: " .. err)
if killerActive then finishKiller("Erro na tentativa. Tente de novo.") end
end
end)
end)
end
-- =============================================================================
-- ABA: Troll
-- =============================================================================
local stopSpin
local restoreFakeLag
local stopSpectate
do
local TrollSection = Window:NewTab("Troll"):NewSection("Diversão")
-- Câmera giratória com duração ajustável
local spinDuration = 5
local spinConn
stopSpin = function(silent)
if spinConn then spinConn:Disconnect() spinConn = nil end
releaseCameraMode("spin")
if not silent then notify("Troll", "Câmera voltou ao normal.") end
end
cameraModeStoppers.spin = function() stopSpin(true) end
TrollSection:NewButton("Câmera Giratória", "Gira a câmera por alguns segundos.", function()
stopSpin(true)
claimCameraMode("spin")
local camera = workspace.CurrentCamera
if not camera then releaseCameraMode("spin") return end
camera.CameraType = Enum.CameraType.Scriptable
local startTime = os.clock()
local origin = camera.CFrame
spinConn = RunService.RenderStepped:Connect(function()
local currentCamera = workspace.CurrentCamera
if not currentCamera then return end
if currentCamera ~= camera then
camera = currentCamera
camera.CameraType = Enum.CameraType.Scriptable
origin = camera.CFrame
end
local elapsed = os.clock() - startTime
if elapsed >= spinDuration then
stopSpin(false)
return
end
local angle = elapsed * math.pi * 2
camera.CFrame = CFrame.new(origin.Position)
* CFrame.Angles(0, angle, 0)
* CFrame.new(0, 0, -10)
camera.Focus = CFrame.new(origin.Position)
end)
notify("Troll", "Câmera girando por " .. spinDuration .. "s.")
end)
TrollSection:NewSlider("Duração Câmera (s)", "Segundos de giro.", 30, 1, 5, function(value)
spinDuration = value
end)
-- Fake Lag ajustável
local fakeLagDuration = 2
restoreFakeLag = function()
local h = fakeLagHumanoid
fakeLagActive = false
if h and h.Parent then
h.WalkSpeed = desiredWalkSpeed or 16
if h.UseJumpPower then h.JumpPower = desiredJumpPower or 50
else h.JumpHeight = desiredJumpHeight or 7.2 end
end
fakeLagHumanoid = nil
end
TrollSection:NewButton("Fake Lag", "Congela você por alguns segundos.", function()
local h = getHumanoid()
if not h then return end
if not fakeLagActive then
desiredWalkSpeed = desiredWalkSpeed or h.WalkSpeed
desiredJumpPower = desiredJumpPower or h.JumpPower
desiredJumpHeight = desiredJumpHeight or h.JumpHeight
elseif fakeLagHumanoid ~= h then
restoreFakeLag()
end
fakeLagSession = fakeLagSession + 1
local session = fakeLagSession
fakeLagActive = true
fakeLagHumanoid = h
h.WalkSpeed = 0
if h.UseJumpPower then h.JumpPower = 0 else h.JumpHeight = 0 end
notify("Troll", "Fake lag por " .. fakeLagDuration .. "s.")
task.spawn(function()
task.wait(fakeLagDuration)
if session ~= fakeLagSession or destroyed then return end
restoreFakeLag()
notify("Troll", "Fake lag encerrado.")
end)
end)
TrollSection:NewSlider("Duração Fake Lag (s)", "Duração em segundos.", 15, 1, 2, function(value)
fakeLagDuration = value
end)
-- Spectate — segue outro jogador com a câmera
local spectating = false
local spectateConn
stopSpectate = function(silent)
spectating = false
if spectateConn then spectateConn:Disconnect() spectateConn = nil end
releaseCameraMode("spectate")
if not silent then notify("Spectate", "Parado.") end
end
cameraModeStoppers.spectate = function() stopSpectate(true) end
TrollSection:NewTextBox("Spectate Jogador", "Nome do jogador. Enter para seguir.", function(value)
local player = findPlayerByPartialName(value)
if not player or player == LocalPlayer then notify("Spectate", "Escolha outro jogador.") return end
stopSpectate(true)
claimCameraMode("spectate")
spectating = true
local camera = workspace.CurrentCamera
if not camera then stopSpectate(true) return end
camera.CameraType = Enum.CameraType.Scriptable
spectateConn = RunService.RenderStepped:Connect(function()
if not spectating then return end
local currentCamera = workspace.CurrentCamera
if not currentCamera then return end
if currentCamera ~= camera then
camera = currentCamera
camera.CameraType = Enum.CameraType.Scriptable
end
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
if not root then stopSpectate(false) return end
camera.CFrame = CFrame.new(root.Position + Vector3.new(0, 8, -14), root.Position)
camera.Focus = CFrame.new(root.Position)
end)
notify("Spectate", "Seguindo " .. player.DisplayName .. ".")
end)
TrollSection:NewButton("Parar Spectate", "Para de seguir.", function()
stopSpectate(false)
end)
-- Teleporte aleatório — filtra partes visíveis e grandes
TrollSection:NewButton("Teleporte Aleatório", "Te joga em uma parte aleatória.", function()
local parts = {}
for _, obj in ipairs(workspace:GetDescendants()) do
if obj:IsA("BasePart")
and obj.Transparency < 0.9
and obj.Size.Magnitude > 2
and obj ~= workspace.Terrain
then
table.insert(parts, obj)
end
end
if #parts == 0 then notify("Troll", "Nenhuma parte útil encontrada.") return end
local target = parts[math.random(1, #parts)]
teleportCharacter(target.CFrame * CFrame.new(0, 5, 0))
notify("Troll", "Caiu em: " .. target.Name)
end)
end
-- =============================================================================
-- Minimizar / reabrir + drag
-- =============================================================================
local function findMenuGui()
for _, guiRoot in ipairs(guiRoots) do
for _, gui in ipairs(guiRoot:GetChildren()) do
if gui:IsA("ScreenGui") then
if gui.Name == "CafezitosV2UI" then return gui end
local main = gui:FindFirstChild("Main", true)
local header = main and main:FindFirstChild("MainHeader")
local title = header and header:FindFirstChild("title")
if title and title.Text == UI_TITLE then return gui end
end
end
end
return nil
end
local menuGui = findMenuGui()
local commandsTabButton
if not menuGui then
warn(MENU_NAME .. ": não foi possível localizar a janela principal.")
menuGui = Instance.new("ScreenGui")
menuGui.Name = "CafezitosFallbackHost"
menuGui.ResetOnSpawn = false
menuGui.Parent = CoreGui
end
-- Arredonda todos os UICorner
local function applyRoundedStyle(root)
for _, object in ipairs(root:GetDescendants()) do
if object:IsA("UICorner") then object.CornerRadius = UDim.new(0, 12) end
end
end
applyRoundedStyle(menuGui)
trackConnection(menuGui.DescendantAdded:Connect(function(object)
if object:IsA("UICorner") then object.CornerRadius = UDim.new(0, 12) end
end))
-- Textbox helper: encontra pela label ao lado
do
local textBoxesByLabel = {}
for _, element in ipairs(menuGui:GetDescendants()) do
if element:IsA("TextButton") and element.Name == "textboxElement" then
local title = element:FindFirstChild("togName")
local input = element:FindFirstChildOfClass("TextBox")
if title and input then
textBoxesByLabel[title.Text] = input
if input.PlaceholderText == "Type here!" then
input.PlaceholderText = "Digite aqui..."
end
end
end
end
getKavoTextBoxByLabel = function(labelText)
local input = textBoxesByLabel[labelText]
return input and input.Parent and input or nil
end
restoreKavoTextBox = function(labelText, value)
task.delay(0.22, function()
local input = getKavoTextBoxByLabel(labelText)
if input and input.Parent then input.Text = tostring(value) end
end)
end
local function configureKavoTextBox(labelText, placeholder, value)
local input = getKavoTextBoxByLabel(labelText)
if not input then return end
input.PlaceholderText = placeholder
if value ~= nil then input.Text = tostring(value) end
end
configureKavoTextBox("Ir até Jogador", "Nome ou começo do nome", nil)
configureKavoTextBox("Velocidade do Voo", "Digite a velocidade", nil)
configureKavoTextBox("Nome do Alvo", "Nome ou começo do nome", nil)
configureKavoTextBox("Força Normal", "2500", 2500)
configureKavoTextBox("Força em Descidas", "800", 800)
end
-- Badges de atalho (quadrinhos com a tecla no canto direito de cada item)
local customKeybindIcons = {}
local shortcutElementsByLabel
local function rebuildShortcutElementIndex()
shortcutElementsByLabel = {}
for _, element in ipairs(menuGui:GetDescendants()) do
if element:IsA("TextButton") then
local title = element:FindFirstChild("togName")
if title and title:IsA("TextLabel") then
local list = shortcutElementsByLabel[title.Text]
if not list then
list = {}
shortcutElementsByLabel[title.Text] = list
end
table.insert(list, element)
end
end
end
end
local function addShortcutBadge(labelText, keyText)
if not shortcutElementsByLabel then rebuildShortcutElementIndex() end
for _, element in ipairs(shortcutElementsByLabel[labelText] or {}) do
if element.Parent and not element:FindFirstChild("CafezitosShortcut_" .. keyText) then
local badgeWidth = keyText == "1/2/3" and 42 or 21
local badge = Instance.new("TextButton")
badge.Name = "CafezitosShortcut_" .. keyText
badge.Size = UDim2.fromOffset(badgeWidth, 21)
badge.AnchorPoint = Vector2.new(1, 0)
badge.Position = UDim2.new(1, -66, 0, 9)
badge.BackgroundColor3 = Color3.fromRGB(30, 30, 37)
badge.BorderSizePixel = 0
badge.AutoButtonColor = false
badge.Font = Enum.Font.GothamBold
badge.Text = keyText
badge.TextColor3 = Theme.SchemeColor
badge.TextSize = keyText == "1/2/3" and 9 or 12
badge.ZIndex = 3
badge.Parent = element
Instance.new("UICorner", badge).CornerRadius = UDim.new(0, 5)
table.insert(customKeybindIcons, badge)
badge.Activated:Connect(function()
if keyText == "V" then flyToggleControl:UpdateToggle(nil, not flyEnabled)
elseif keyText == "L" then espToggleControl:UpdateToggle(nil, not espEnabled)
elseif keyText == "P" then infiniteJumpToggleControl:UpdateToggle(nil, not infiniteJump)
elseif keyText == "T" then giveClickTeleportTool()
elseif keyText == "1" then teleportToCheckpoint(1)
elseif keyText == "2" then teleportToCheckpoint(2)
elseif keyText == "3" then teleportToCheckpoint(3)
elseif keyText == "1/2/3" then notify("Checkpoints", "Use NumPad 1, 2 ou 3.")
elseif keyText == "B" then boostToggleControl:UpdateToggle(nil, not boostActive)
elseif keyText == "K" and setMenuVisible then setMenuVisible(false)
elseif keyText == "X" and destroyCafezitos then destroyCafezitos()
end
end)
end
end
end
-- Badges das abas originais
addShortcutBadge("Voo do Veículo", "V")
addShortcutBadge("ESP", "L")
addShortcutBadge("Pulo Infinito", "P")
addShortcutBadge("Teleporte por Clique","T")
addShortcutBadge("Boost do Carrinho", "B")
addShortcutBadge("Ir ao Checkpoint 1", "1")
addShortcutBadge("Ir ao Checkpoint 2", "2")
addShortcutBadge("Ir ao Checkpoint 3", "3")
-- Sistema de toast
local toastGui = Instance.new("ScreenGui")
toastGui.Name = "CafezitosNotifications"
toastGui.ResetOnSpawn = false
toastGui.IgnoreGuiInset = true
toastGui.DisplayOrder = 10001
toastGui.Parent = menuGui.Parent
toastContainer = Instance.new("Frame")
toastContainer.Name = "ToastContainer"
toastContainer.AnchorPoint = Vector2.new(1, 0)
toastContainer.Position = UDim2.new(1, -18, 0, 20)
toastContainer.Size = UDim2.fromOffset(300, 300)
toastContainer.BackgroundTransparency = 1
toastContainer.Parent = toastGui
do
local toastLayout = Instance.new("UIListLayout")
toastLayout.Padding = UDim.new(0, 8)
toastLayout.SortOrder = Enum.SortOrder.LayoutOrder
toastLayout.Parent = toastContainer
end
-- Drag helper (mouse e touch)
local function enableDrag(target, handle, onDragEnd)
target.Active = true
handle.Active = true
local dragging, dragInput, dragStart, startPos, wasDragged = false, nil, nil, nil, false
local function updatePos(input)
local delta = input.Position - dragStart
if delta.Magnitude > 6 then wasDragged = true end
target.Position = UDim2.new(
startPos.X.Scale, startPos.X.Offset + delta.X,
startPos.Y.Scale, startPos.Y.Offset + delta.Y
)
end
handle.InputBegan:Connect(function(input)
if input.UserInputType ~= Enum.UserInputType.MouseButton1
and input.UserInputType ~= Enum.UserInputType.Touch then return end
dragging = true
wasDragged = false
dragStart = input.Position
startPos = target.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
if onDragEnd then onDragEnd(wasDragged) end
end
end)
end)
handle.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
trackConnection(UserInputService.InputChanged:Connect(function(input)
if dragging and input == dragInput then updatePos(input) end
end))
end
-- Launcher (botão para reabrir quando minimizado)
local launcherGui = Instance.new("ScreenGui")
launcherGui.Name = "CafezitosLauncher"
launcherGui.ResetOnSpawn = false
launcherGui.IgnoreGuiInset = true
launcherGui.DisplayOrder = 10000
launcherGui.Parent = menuGui.Parent
local launcher = Instance.new("TextButton")
launcher.Name = "OpenCafezitosMenu"
launcher.Size = UDim2.fromOffset(62, 62)
launcher.Position = UDim2.new(0, 18, 0.5, -31)
launcher.BackgroundColor3 = Color3.fromRGB(104, 61, 43)
launcher.BorderSizePixel = 0
launcher.AutoButtonColor = false
launcher.Font = Enum.Font.GothamBold
launcher.Text = ""
launcher.Visible = false
launcher.Parent = launcherGui
Instance.new("UICorner", launcher).CornerRadius = UDim.new(1, 0)
CafeUI.launcherStroke = Instance.new("UIStroke")
CafeUI.launcherStroke.Thickness = 2.5
CafeUI.launcherStroke.Parent = launcher
CafeUI.launcherIcon = Instance.new("TextLabel")
CafeUI.launcherIcon.BackgroundTransparency = 1
CafeUI.launcherIcon.Size = UDim2.fromScale(1, 1)
CafeUI.launcherIcon.Position = UDim2.fromOffset(0, 0)
CafeUI.launcherIcon.Font = Enum.Font.GothamBold
CafeUI.launcherIcon.Text = "☕"
CafeUI.launcherIcon.TextSize = 32
CafeUI.launcherIcon.Parent = launcher
setMenuVisible = function(visible)
if destroyed then return end
menuGui.Enabled = visible
launcher.Visible = not visible
end
do
local main = menuGui:FindFirstChild("Main")
local header = main and main:FindFirstChild("MainHeader")
local originalClose = header and header:FindFirstChild("close")
if originalClose then
originalClose.Visible = false
originalClose.Active = false
end
if header then
local minimize = Instance.new("TextButton")
minimize.Name = "Minimize"
minimize.Size = UDim2.fromOffset(28, 24)
minimize.Position = UDim2.new(1, -34, 0, 2)
minimize.BackgroundTransparency = 1
minimize.AutoButtonColor = false
minimize.Font = Enum.Font.GothamBold
minimize.Text = "—"
minimize.TextColor3 = Color3.fromRGB(255, 255, 255)
minimize.TextSize = 20
minimize.Parent = header
minimize.MouseButton1Click:Connect(function() setMenuVisible(false) end)
enableDrag(main, header)
end
end
CafeUI.launcherLastDrag = 0
enableDrag(launcher, launcher, function(wasDragged)
if wasDragged then CafeUI.launcherLastDrag = os.clock() end
end)
launcher.Activated:Connect(function()
if os.clock() - CafeUI.launcherLastDrag < 0.25 then return end
setMenuVisible(true)
end)
-- =============================================================================
-- Atalhos de teclado globais
-- =============================================================================
if destroyed or not runtime.Parent or not isCurrentSuiteGeneration() then return end
trackConnection(UserInputService.InputBegan:Connect(function(input, gameProcessed)
if destroyed or gameProcessed or UserInputService:GetFocusedTextBox() then return end
if input.KeyCode == Enum.KeyCode.V then
flyToggleControl:UpdateToggle(nil, not flyEnabled)
elseif input.KeyCode == Enum.KeyCode.L then
espToggleControl:UpdateToggle(nil, not espEnabled)
elseif input.KeyCode == Enum.KeyCode.P then
infiniteJumpToggleControl:UpdateToggle(nil, not infiniteJump)
elseif input.KeyCode == Enum.KeyCode.T then
giveClickTeleportTool()
elseif input.KeyCode == Enum.KeyCode.B then
boostToggleControl:UpdateToggle(nil, not boostActive)
elseif input.KeyCode == Enum.KeyCode.KeypadOne then
teleportToCheckpoint(1)
elseif input.KeyCode == Enum.KeyCode.KeypadTwo then
teleportToCheckpoint(2)
elseif input.KeyCode == Enum.KeyCode.KeypadThree then
teleportToCheckpoint(3)
elseif input.KeyCode == Enum.KeyCode.K then
setMenuVisible(not menuGui.Enabled)
elseif input.KeyCode == Enum.KeyCode.X then
destroyCafezitos()
end
end))
-- =============================================================================
-- Destruição limpa
-- =============================================================================
destroyCafezitos = function()
if destroyed then return end
local hadManagedCamera = activeCameraMode ~= nil or cameraBaseline ~= nil
destroyed = true
killerActive = false
killerSession = killerSession + 1
infiniteJump = false
disconnectRuntimeConnections()
fakeLagSession = fakeLagSession + 1
restoreFakeLag()
stopSpin(true)
stopSpectate(true)
stopFreecam()
noclipEnabled = false
restoreNoclip()
invisEnabled = false
setLocalInvisible(false)
godEnabled = false
if godRespawnConn then godRespawnConn:Disconnect(); godRespawnConn = nil end
restoreGodHumanoid()
antiAfkEnabled = false
if antiAfkConn then antiAfkConn:Disconnect(); antiAfkConn = nil end
stopFly()
stopBoost()
espEnabled = false
espSession = espSession + 1
clearESP()
stabilizer.enabled = false
cleanupStabilizer()
restorePanicStop()
workspace.Gravity = originalGravity
if antiFlipConn then antiFlipConn:Disconnect() antiFlipConn = nil end
if autobrakeConn then autobrakeConn:Disconnect() autobrakeConn = nil end
activeCameraMode = nil
if cameraBaseline or not hadManagedCamera then restoreDefaultCamera() end
for index = #createdTools, 1, -1 do
local tool = createdTools[index]
if tool and tool.Parent then tool:Destroy() end
createdTools[index] = nil
end
if flyMobileGui and flyMobileGui.Parent then flyMobileGui:Destroy() end
if toastGui and toastGui.Parent then toastGui:Destroy() end
if launcherGui and launcherGui.Parent then launcherGui:Destroy() end
if menuGui and menuGui.Parent then menuGui:Destroy() end
if runtime and runtime.Parent then runtime:Destroy() end
end
-- =============================================================================
-- ABA: Comandos (atalhos listados)
-- =============================================================================
do
local CommandsSection = Window:NewTab("Comandos"):NewSection("Atalhos")
commandsTabButton = menuGui:FindFirstChild("ComandosTabButton", true)
CommandsSection:NewButton("V • Voo do Veículo", "Tecla V", function() flyToggleControl:UpdateToggle(nil, not flyEnabled) end)
CommandsSection:NewButton("L • ESP", "Tecla L", function() espToggleControl:UpdateToggle(nil, not espEnabled) end)
CommandsSection:NewButton("P • Pulo Infinito", "Tecla P", function() infiniteJumpToggleControl:UpdateToggle(nil, not infiniteJump) end)
CommandsSection:NewButton("T • Teleporte por Clique", "Tecla T", giveClickTeleportTool)
CommandsSection:NewButton("B • Boost do Carrinho", "Tecla B", function() boostToggleControl:UpdateToggle(nil, not boostActive) end)
CommandsSection:NewButton("NumPad 1/2/3 • Checkpoints","Teclado numérico", function()
notify("Checkpoints", "Use NumPad 1, 2 ou 3.")
end)
CommandsSection:NewButton("K • Minimizar / Abrir", "Tecla K", function() setMenuVisible(false) end)
CommandsSection:NewButton("X • Fechar o Cafezitos", "Tecla X", destroyCafezitos)
-- As linhas de Comandos acabaram de ser criadas; um único reindex substitui
-- as várias varreduras integrais que existiam no boot.
shortcutElementsByLabel = nil
addShortcutBadge("V • Voo do Veículo", "V")
addShortcutBadge("L • ESP", "L")
addShortcutBadge("P • Pulo Infinito", "P")
addShortcutBadge("T • Teleporte por Clique", "T")
addShortcutBadge("B • Boost do Carrinho", "B")
addShortcutBadge("NumPad 1/2/3 • Checkpoints","1/2/3")
addShortcutBadge("K • Minimizar / Abrir", "K")
addShortcutBadge("X • Fechar o Cafezitos", "X")
end
-- =============================================================================
-- ABA: Interface
-- =============================================================================
do
local GuiSection = Window:NewTab("Interface"):NewSection("Interface")
-- O atalho X já é tratado pelo listener global. Aqui fica apenas o botão,
-- evitando dois callbacks para a mesma tecla.
GuiSection:NewButton("Fechar Menu", "Tecla X também fecha o Cafezitos.", destroyCafezitos)
end
-- =============================================================================
-- Loop RGB
-- =============================================================================
task.spawn(function()
while not destroyed and menuGui.Parent and launcherGui.Parent do
-- Pulso caramelo: mantém o tema café sem virar arco-íris.
local pulse = (math.sin(os.clock() * 1.2) + 1) * 0.5
local rgb = Color3.fromRGB(
math.floor(188 + 38 * pulse),
math.floor(112 + 42 * pulse),
math.floor(57 + 27 * pulse)
)
CafeUI:ChangeColor("SchemeColor", rgb)
if commandsTabButton and commandsTabButton.Parent then
commandsTabButton.BackgroundColor3 = rgb
end
CafeUI.launcherStroke.Color = rgb
CafeUI.launcherIcon.TextColor3 = rgb
for i = #customKeybindIcons, 1, -1 do
local icon = customKeybindIcons[i]
if icon and icon.Parent then icon.TextColor3 = rgb
else table.remove(customKeybindIcons, i) end
end
for i = #toastStrokes, 1, -1 do
local stroke = toastStrokes[i]
if stroke and stroke.Parent then stroke.Color = rgb
else table.remove(toastStrokes, i) end
end
task.wait(0.30)
end
end)
startup.finished = true
if Window.gui and Window.gui.Parent then Window.gui.Enabled = true end
if startup.status and startup.status.Parent then startup.status.Text = "Pronto!" end
if startup.gui and startup.gui.Parent then startup.gui:Destroy() end
notify(MENU_NAME, "Feito por Cafezl • K minimiza e reabre o menu.")
eae seus comedinhas, oq acharam ❓😂