-- Grip Editor — client-side -- Executor: cole e execute. -- Studio: LocalScript em StarterPlayerScripts, aperte Play. local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") local old = playerGui:FindFirstChild("GripEditor") if old then old:Destroy() end local DEFAULTS = { GripPos = Vector3.new(0, 0, 0), GripForward = Vector3.new(0, 0, -1), GripRight = Vector3.new(1, 0, 0), GripUp = Vector3.new(0, 1, 0), } local values = { GripPos = DEFAULTS.GripPos, GripForward = DEFAULTS.GripForward, GripRight = DEFAULTS.GripRight, GripUp = DEFAULTS.GripUp, } local GROUPS = { { prop = "GripPos", label = "Posição", min = -3, max = 3, step = 0.05 }, { prop = "GripForward", label = "Forward", min = -1, max = 1, step = 0.01 }, { prop = "GripRight", label = "Right", min = -1, max = 1, step = 0.01 }, { prop = "GripUp", label = "Up", min = -1, max = 1, step = 0.01 }, } local AXES = { "X", "Y", "Z" } local currentTool = nil local refreshers = {} local function mk(class, props) local inst = Instance.new(class) for k, v in pairs(props) do inst[k] = v end return inst end local function getHumanoid() local char = player.Character if not char then return nil end return char:FindFirstChildOfClass("Humanoid") end local function apply() local tool = currentTool if not tool or not tool.Parent then return end for prop, vec in pairs(values) do pcall(function() tool[prop] = vec end) end end local function equip(tool) local hum = getHumanoid() local backpack = player:FindFirstChildOfClass("Backpack") if not hum or not tool or not backpack or tool.Parent ~= backpack then return end pcall(function() hum:EquipTool(tool) end) end local function refreshAll() for _, fn in ipairs(refreshers) do fn() end end local function setAxis(prop, axis, v) local vec = values[prop] if axis == "X" then vec = Vector3.new(v, vec.Y, vec.Z) elseif axis == "Y" then vec = Vector3.new(vec.X, v, vec.Z) else vec = Vector3.new(vec.X, vec.Y, v) end values[prop] = vec apply() refreshAll() end local gui = mk("ScreenGui", { Name = "GripEditor", ResetOnSpawn = false, IgnoreGuiInset = true, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }) gui.Parent = playerGui local main = mk("Frame", { Size = UDim2.fromOffset(300, 460), Position = UDim2.new(1, -310, 0, 70), BackgroundColor3 = Color3.fromRGB(24, 24, 30), BorderSizePixel = 0, }) main.Parent = gui mk("UICorner", { CornerRadius = UDim.new(0, 10) }).Parent = main mk("UIStroke", { Color = Color3.fromRGB(70, 70, 90), Thickness = 1 }).Parent = main local bar = mk("Frame", { Size = UDim2.new(1, 0, 0, 34), BackgroundColor3 = Color3.fromRGB(34, 34, 44), BorderSizePixel = 0, }) bar.Parent = main mk("UICorner", { CornerRadius = UDim.new(0, 10) }).Parent = bar mk("TextLabel", { Size = UDim2.new(1, -40, 1, 0), Position = UDim2.fromOffset(12, 0), BackgroundTransparency = 1, Text = "GRIP EDITOR", TextColor3 = Color3.fromRGB(235, 235, 245), Font = Enum.Font.GothamBold, TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left, }).Parent = bar local close = mk("TextButton", { Size = UDim2.fromOffset(34, 34), Position = UDim2.new(1, -34, 0, 0), BackgroundTransparency = 1, Text = "X", TextColor3 = Color3.fromRGB(255, 110, 110), Font = Enum.Font.GothamBold, TextSize = 14, }) close.Parent = bar close.MouseButton1Click:Connect(function() gui:Destroy() end) local dragging, dragStart, startPos bar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = main.Position end end) UserInputService.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then local delta = input.Position - dragStart main.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) local picker = mk("TextButton", { Size = UDim2.new(1, -24, 0, 32), Position = UDim2.fromOffset(12, 42), BackgroundColor3 = Color3.fromRGB(44, 44, 58), Text = "Selecionar Tool...", TextColor3 = Color3.fromRGB(220, 220, 235), Font = Enum.Font.Gotham, TextSize = 13, BorderSizePixel = 0, }) picker.Parent = main mk("UICorner", { CornerRadius = UDim.new(0, 6) }).Parent = picker local list = mk("ScrollingFrame", { Size = UDim2.new(1, -24, 0, 130), Position = UDim2.fromOffset(12, 78), BackgroundColor3 = Color3.fromRGB(18, 18, 24), BorderSizePixel = 0, CanvasSize = UDim2.new(), ScrollBarThickness = 4, Visible = false, ZIndex = 10, }) list.Parent = main mk("UICorner", { CornerRadius = UDim.new(0, 6) }).Parent = list mk("UIListLayout", { Padding = UDim.new(0, 2) }).Parent = list local function collectTools() local out = {} local backpack = player:FindFirstChildOfClass("Backpack") if backpack then for _, c in ipairs(backpack:GetChildren()) do if c:IsA("Tool") then table.insert(out, c) end end end if player.Character then for _, c in ipairs(player.Character:GetChildren()) do if c:IsA("Tool") then table.insert(out, c) end end end return out end local function selectTool(tool) currentTool = tool picker.Text = tool and tool.Name or "Selecionar Tool..." for prop, default in pairs(DEFAULTS) do local ok, v = pcall(function() return tool[prop] end) values[prop] = (tool and ok and typeof(v) == "Vector3") and v or default end refreshAll() apply() equip(tool) end local function rebuildList() for _, c in ipairs(list:GetChildren()) do if c:IsA("TextButton") then c:Destroy() end end local tools = collectTools() for _, tool in ipairs(tools) do local btn = mk("TextButton", { Size = UDim2.new(1, -8, 0, 30), BackgroundColor3 = Color3.fromRGB(36, 36, 48), Text = tool.Name, TextColor3 = Color3.fromRGB(215, 215, 230), Font = Enum.Font.Gotham, TextSize = 12, BorderSizePixel = 0, ZIndex = 11, }) btn.Parent = list mk("UICorner", { CornerRadius = UDim.new(0, 4) }).Parent = btn btn.MouseButton1Click:Connect(function() selectTool(tool) list.Visible = false end) end list.CanvasSize = UDim2.fromOffset(0, math.max(#tools * 32, 1)) end picker.MouseButton1Click:Connect(function() if list.Visible then list.Visible = false else rebuildList() list.Visible = true end end) local holder = mk("ScrollingFrame", { Size = UDim2.new(1, -24, 0, 200), Position = UDim2.fromOffset(12, 206), BackgroundTransparency = 1, BorderSizePixel = 0, CanvasSize = UDim2.new(), ScrollBarThickness = 4, }) holder.Parent = main mk("UIListLayout", { Padding = UDim.new(0, 6) }).Parent = holder local function makeSlider(prop, axis, label, minV, maxV, step) local wrap = mk("Frame", { Size = UDim2.new(1, -8, 0, 52), BackgroundTransparency = 1, }) wrap.Parent = holder local head = mk("Frame", { Size = UDim2.new(1, 0, 0, 16), BackgroundTransparency = 1, }) head.Parent = wrap mk("TextLabel", { Size = UDim2.new(1, -70, 1, 0), BackgroundTransparency = 1, Text = label, TextColor3 = Color3.fromRGB(160, 160, 180), Font = Enum.Font.GothamMedium, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, }).Parent = head local valLbl = mk("TextLabel", { Size = UDim2.fromOffset(70, 16), Position = UDim2.new(1, -70, 0, 0), BackgroundTransparency = 1, Text = "0.00", TextColor3 = Color3.fromRGB(120, 200, 255), Font = Enum.Font.Code, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Right, }) valLbl.Parent = head local track = mk("Frame", { Size = UDim2.new(1, 0, 0, 26), Position = UDim2.fromOffset(0, 20), BackgroundTransparency = 1, }) track.Parent = wrap local rail = mk("Frame", { Size = UDim2.new(1, 0, 0, 6), Position = UDim2.new(0, 0, 0.5, -3), BackgroundColor3 = Color3.fromRGB(58, 58, 74), BorderSizePixel = 0, }) rail.Parent = track mk("UICorner", { CornerRadius = UDim.new(1, 0) }).Parent = rail local fill = mk("Frame", { Size = UDim2.new(0, 0, 1, 0), BackgroundColor3 = Color3.fromRGB(90, 170, 255), BorderSizePixel = 0, }) fill.Parent = rail mk("UICorner", { CornerRadius = UDim.new(1, 0) }).Parent = fill local knob = mk("Frame", { Size = UDim2.fromOffset(16, 16), Position = UDim2.new(0, -8, 0.5, -8), BackgroundColor3 = Color3.fromRGB(240, 240, 250), BorderSizePixel = 0, }) knob.Parent = track mk("UICorner", { CornerRadius = UDim.new(1, 0) }).Parent = knob local function refresh() local v = values[prop][axis] local rel = math.clamp((v - minV) / (maxV - minV), 0, 1) fill.Size = UDim2.new(rel, 0, 1, 0) knob.Position = UDim2.new(rel, -8, 0.5, -8) valLbl.Text = string.format("%.2f", v) end table.insert(refreshers, refresh) local held = false local function fromX(x) local rel = math.clamp((x - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1) local raw = minV + rel * (maxV - minV) local snapped = math.clamp(math.floor(raw / step + 0.5) * step, minV, maxV) setAxis(prop, axis, snapped) end track.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then held = true fromX(input.Position.X) end end) UserInputService.InputChanged:Connect(function(input) if not held then return end if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then fromX(input.Position.X) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then held = false end end) end for _, g in ipairs(GROUPS) do for _, axis in ipairs(AXES) do makeSlider(g.prop, axis, g.label .. " " .. axis, g.min, g.max, g.step) end end holder.CanvasSize = UDim2.fromOffset(0, #GROUPS * #AXES * 58) local function resetValues() for prop, v in pairs(DEFAULTS) do values[prop] = v end refreshAll() apply() end local function copyValues() local s = string.format( "-- %s\nGripPos = Vector3.new(%.3f, %.3f, %.3f)\nGripForward = Vector3.new(%.3f, %.3f, %.3f)\nGripRight = Vector3.new(%.3f, %.3f, %.3f)\nGripUp = Vector3.new(%.3f, %.3f, %.3f)", currentTool and currentTool.Name or "Tool", values.GripPos.X, values.GripPos.Y, values.GripPos.Z, values.GripForward.X, values.GripForward.Y, values.GripForward.Z, values.GripRight.X, values.GripRight.Y, values.GripRight.Z, values.GripUp.X, values.GripUp.Y, values.GripUp.Z ) if setclipboard then pcall(setclipboard, s) end print(s) end local reset = mk("TextButton", { Size = UDim2.new(0.5, -18, 0, 34), Position = UDim2.fromOffset(12, 414), BackgroundColor3 = Color3.fromRGB(60, 60, 78), Text = "Resetar", TextColor3 = Color3.fromRGB(230, 230, 240), Font = Enum.Font.GothamMedium, TextSize = 13, BorderSizePixel = 0, }) reset.Parent = main mk("UICorner", { CornerRadius = UDim.new(0, 6) }).Parent = reset reset.MouseButton1Click:Connect(resetValues) local copy = mk("TextButton", { Size = UDim2.new(0.5, -18, 0, 34), Position = UDim2.new(0.5, 6, 0, 414), BackgroundColor3 = Color3.fromRGB(60, 130, 220), Text = "Copiar valores", TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.GothamBold, TextSize = 13, BorderSizePixel = 0, }) copy.Parent = main mk("UICorner", { CornerRadius = UDim.new(0, 6) }).Parent = copy copy.MouseButton1Click:Connect(copyValues) local function hookChar() local char = player.Character if not char then return end char.ChildAdded:Connect(function(c) if c:IsA("Tool") then task.defer(apply) end end) end if player.Character then hookChar() end player.CharacterAdded:Connect(function() task.wait(0.5) hookChar() end) refreshAll()