local Players, RS = game:GetService("Players"), game:GetService("RunService") local me = Players.LocalPlayer local gui = Instance.new("ScreenGui") gui.Name, gui.ResetOnSpawn = "FollowMenu", false gui.Parent = me:WaitForChild("PlayerGui") local function new(class, props, parent) local o = Instance.new(class) for k, v in pairs(props) do o[k] = v end o.Parent = parent return o end local function round(o, r) new("UICorner", {CornerRadius = UDim.new(0, r)}, o) end local frame = new("Frame", { Size = UDim2.fromOffset(210, 270), Position = UDim2.new(0.5, -105, 0.5, -135), BackgroundColor3 = Color3.fromRGB(22, 18, 36), Active = true, Draggable = true, }, gui) round(frame, 14) new("UIStroke", {Color = Color3.fromRGB(140, 100, 240), Thickness = 1.5}, frame) new("TextLabel", { Size = UDim2.new(1, -40, 0, 32), Position = UDim2.fromOffset(12, 0), Text = "✈ FOLLOW", Font = Enum.Font.GothamBold, TextSize = 15, TextColor3 = Color3.new(1, 1, 1), TextXAlignment = Enum.TextXAlignment.Left, BackgroundTransparency = 1, }, frame) local close = new("TextButton", { Size = UDim2.fromOffset(22, 22), Position = UDim2.new(1, -30, 0, 6), Text = "×", Font = Enum.Font.GothamBold, TextSize = 16, TextColor3 = Color3.new(1, 1, 1), BackgroundColor3 = Color3.fromRGB(200, 60, 60), }, frame) round(close, 6) local list = new("ScrollingFrame", { Size = UDim2.new(1, -24, 1, -100), Position = UDim2.fromOffset(12, 36), BackgroundColor3 = Color3.fromRGB(36, 30, 58), BorderSizePixel = 0, ScrollBarThickness = 3, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(), }, frame) round(list, 10) new("UIListLayout", {Padding = UDim.new(0, 3)}, list) new("UIPadding", {PaddingTop = UDim.new(0, 3), PaddingLeft = UDim.new(0, 3), PaddingRight = UDim.new(0, 3)}, list) local function btn(text, x, color) local b = new("TextButton", { Size = UDim2.new(0.5, -16, 0, 34), Position = UDim2.new(x, x == 0 and 12 or 4, 1, -46), Text = text, Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = Color3.new(1, 1, 1), BackgroundColor3 = color, }, frame) round(b, 10) return b end local tpBtn = btn("TÉLÉPORTER", 0, Color3.fromRGB(70, 120, 220)) local followBtn = btn("SUIVRE", 0.5, Color3.fromRGB(0, 160, 90)) local OFF, ON = Color3.fromRGB(52, 44, 82), Color3.fromRGB(140, 100, 240) local selected, conn, entries = nil, nil, {} local function root(p) return p and p.Character and p.Character:FindFirstChild("HumanoidRootPart") end local function hum(p) return p and p.Character and p.Character:FindFirstChildOfClass("Humanoid") end local function states(on) local h = hum(me) if not h then return end for _, s in ipairs({Enum.HumanoidStateType.Freefall, Enum.HumanoidStateType.FallingDown, Enum.HumanoidStateType.Ragdoll}) do h:SetStateEnabled(s, on) end end local function stop() if conn then conn:Disconnect() conn = nil end states(true) followBtn.Text, followBtn.BackgroundColor3 = "SUIVRE", Color3.fromRGB(0, 160, 90) end local function pick(p) selected = p for pl, b in pairs(entries) do b.BackgroundColor3 = pl == p and ON or OFF end end local function rebuild() for _, b in pairs(entries) do b:Destroy() end entries = {} for _, p in ipairs(Players:GetPlayers()) do if p ~= me then local b = new("TextButton", { Size = UDim2.new(1, 0, 0, 28), Text = p.DisplayName, Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = Color3.new(1, 1, 1), BackgroundColor3 = p == selected and ON or OFF, }, list) round(b, 8) b.MouseButton1Click:Connect(function() pick(p) end) entries[p] = b end end end Players.PlayerAdded:Connect(rebuild) Players.PlayerRemoving:Connect(function(p) if p == selected then stop() selected = nil end task.defer(rebuild) end) rebuild() tpBtn.MouseButton1Click:Connect(function() local a, b = root(me), root(selected) if a and b then a.CFrame = b.CFrame * CFrame.new(0, 0, 4) end end) -- Un clic = suivre, un autre clic = arrêter followBtn.MouseButton1Click:Connect(function() if conn then stop() return end if not selected or not root(me) then return end states(false) followBtn.Text, followBtn.BackgroundColor3 = "ARRÊTER", Color3.fromRGB(200, 60, 60) conn = RS.Heartbeat:Connect(function() local mine, theirs, h = root(me), root(selected), hum(me) if not mine or not theirs or not h then return end -- collé derrière le joueur, immobile, droit, face à lui local pos = (theirs.CFrame * CFrame.new(0, 0, 4)).Position mine.AssemblyLinearVelocity = Vector3.zero mine.AssemblyAngularVelocity = Vector3.zero mine.CFrame = CFrame.lookAt(pos, Vector3.new(theirs.Position.X, pos.Y, theirs.Position.Z)) h:ChangeState(Enum.HumanoidStateType.Running) end) end) close.MouseButton1Click:Connect(function() stop() gui:Destroy() end) me.CharacterAdded:Connect(stop)