Desync V2 script
Key Required

Desync V2 script

Desync PlaygroundReCallFunctionReCallFunction 20.2K views 812 executesUpdated Nov 5, 2025
5.0/ 5(4 votes)
40100% Positive
Lua Script•264 lines (9086 chars)
--[[
its a hook based clientside desync
No NetworkOwner errors anymore • No lag btwww • Spin auto-pause so no detects
]]
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local LocalPlayer = Players.LocalPlayer

local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui")
ScreenGui.ResetOnSpawn = false

local Frame = Instance.new("Frame")
Frame.Size = UDim2.new(0, 200, 0, 180)
Frame.Position = UDim2.new(0.5, -100, 0.5, -90)
Frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
Frame.BorderSizePixel = 0
Frame.Active = true
Frame.Draggable = true
Frame.Parent = ScreenGui

local FrameCorner = Instance.new("UICorner")
FrameCorner.CornerRadius = UDim.new(0, 8)
FrameCorner.Parent = Frame

local FrameStroke = Instance.new("UIStroke")
FrameStroke.Color = Color3.fromRGB(100, 100, 100)
FrameStroke.Thickness = 1
FrameStroke.Parent = Frame

local FrameShadow = Instance.new("ImageLabel")
FrameShadow.Image = "rbxassetid://1316045217"
FrameShadow.ImageTransparency = 0.5
FrameShadow.BackgroundTransparency = 1
FrameShadow.Size = UDim2.new(1, 10, 1, 10)
FrameShadow.Position = UDim2.new(0, -5, 0, -5)
FrameShadow.ZIndex = Frame.ZIndex - 1
FrameShadow.Parent = Frame

local ToggleButton = Instance.new("TextButton")
ToggleButton.Size = UDim2.new(0, 100, 0, 40)
ToggleButton.Position = UDim2.new(0.5, -50, 0, 45)
ToggleButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
ToggleButton.Text = "Desync: OFF"
ToggleButton.TextColor3 = Color3.fromRGB(255, 255, 255)
ToggleButton.Font = Enum.Font.SourceSansBold
ToggleButton.TextSize = 18
ToggleButton.Parent = Frame

local ToggleCorner = Instance.new("UICorner")
ToggleCorner.CornerRadius = UDim.new(0, 6)
ToggleCorner.Parent = ToggleButton

local CustomToggleButton = Instance.new("TextButton")
CustomToggleButton.Size = UDim2.new(0, 100, 0, 40)
CustomToggleButton.Position = UDim2.new(0.5, -50, 0, 95)
CustomToggleButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
CustomToggleButton.Text = "Custom: OFF"
CustomToggleButton.TextColor3 = Color3.fromRGB(255, 255, 255)
CustomToggleButton.Font = Enum.Font.SourceSansBold
CustomToggleButton.TextSize = 18
CustomToggleButton.Parent = Frame

local CustomToggleCorner = Instance.new("UICorner")
CustomToggleCorner.CornerRadius = UDim.new(0, 6)
CustomToggleCorner.Parent = CustomToggleButton

local TextBoxX = Instance.new("TextBox")
TextBoxX.Size = UDim2.new(0, 50, 0, 30)
TextBoxX.Position = UDim2.new(0, 20, 0, 140)
TextBoxX.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
TextBoxX.Text = "0"
TextBoxX.TextColor3 = Color3.fromRGB(255, 255, 255)
TextBoxX.Font = Enum.Font.SourceSans
TextBoxX.TextSize = 16
TextBoxX.Visible = false
TextBoxX.Parent = Frame

local TextBoxXCorner = Instance.new("UICorner")
TextBoxXCorner.CornerRadius = UDim.new(0, 4)
TextBoxXCorner.Parent = TextBoxX

local TextBoxY = Instance.new("TextBox")
TextBoxY.Size = UDim2.new(0, 50, 0, 30)
TextBoxY.Position = UDim2.new(0, 75, 0, 140)
TextBoxY.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
TextBoxY.Text = "0"
TextBoxY.TextColor3 = Color3.fromRGB(255, 255, 255)
TextBoxY.Font = Enum.Font.SourceSans
TextBoxY.TextSize = 16
TextBoxY.Visible = false
TextBoxY.Parent = Frame

local TextBoxYCorner = Instance.new("UICorner")
TextBoxYCorner.CornerRadius = UDim.new(0, 4)
TextBoxYCorner.Parent = TextBoxY

local TextBoxZ = Instance.new("TextBox")
TextBoxZ.Size = UDim2.new(0, 50, 0, 30)
TextBoxZ.Position = UDim2.new(0, 130, 0, 140)
TextBoxZ.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
TextBoxZ.Text = "0"
TextBoxZ.TextColor3 = Color3.fromRGB(255, 255, 255)
TextBoxZ.Font = Enum.Font.SourceSans
TextBoxZ.TextSize = 16
TextBoxZ.Visible = false
TextBoxZ.Parent = Frame

local TextBoxZCorner = Instance.new("UICorner")
TextBoxZCorner.CornerRadius = UDim.new(0, 4)
TextBoxZCorner.Parent = TextBoxZ

local MinimizeButton = Instance.new("TextButton")
MinimizeButton.Size = UDim2.new(0, 30, 0, 30)
MinimizeButton.Position = UDim2.new(1, -40, 0, 5)
MinimizeButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
MinimizeButton.Text = "-"
MinimizeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
MinimizeButton.Font = Enum.Font.SourceSansBold
MinimizeButton.TextSize = 20
MinimizeButton.Parent = Frame

local MinimizeCorner = Instance.new("UICorner")
MinimizeCorner.CornerRadius = UDim.new(0, 4)
MinimizeCorner.Parent = MinimizeButton

local CloseButton = Instance.new("TextButton")
CloseButton.Size = UDim2.new(0, 30, 0, 30)
CloseButton.Position = UDim2.new(1, -70, 0, 5)
CloseButton.BackgroundColor3 = Color3.fromRGB(150, 50, 50)
CloseButton.Text = "X"
CloseButton.TextColor3 = Color3.fromRGB(255, 255, 255)
CloseButton.Font = Enum.Font.SourceSansBold
CloseButton.TextSize = 20
CloseButton.Parent = Frame

local CloseCorner = Instance.new("UICorner")
CloseCorner.CornerRadius = UDim.new(0, 4)
CloseCorner.Parent = CloseButton

local desyncT = {enabled = false, loc = CFrame.new()}
local customDesyncEnabled = false
local isMinimized = false

local frameTweenInfo = TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)

local function validateTextboxInput(textbox)
    textbox:GetPropertyChangedSignal("Text"):Connect(function()
        local text = textbox.Text
        if text == "" or text == "-" or text == "+" then return end
        if not text:match("^[+-]?%d*%.?%d*$") then
            textbox.Text = "0"
        end
    end)
end
validateTextboxInput(TextBoxX)
validateTextboxInput(TextBoxY)
validateTextboxInput(TextBoxZ)

ToggleButton.MouseButton1Click:Connect(function()
    desyncT.enabled = not desyncT.enabled
    ToggleButton.Text = desyncT.enabled and "Desync: ON" or "Desync: OFF"
end)

CustomToggleButton.MouseButton1Click:Connect(function()
    customDesyncEnabled = not customDesyncEnabled
    CustomToggleButton.Text = customDesyncEnabled and "Custom: ON" or "Custom: OFF"
    TextBoxX.Visible = customDesyncEnabled and not isMinimized
    TextBoxY.Visible = customDesyncEnabled and not isMinimized
    TextBoxZ.Visible = customDesyncEnabled and not isMinimized
end)

MinimizeButton.MouseButton1Click:Connect(function()
    isMinimized = not isMinimized
    local newSize = isMinimized and UDim2.new(0, 200, 0, 40) or UDim2.new(0, 200, 0, 180)
    MinimizeButton.Text = isMinimized and "+" or "-"
    TweenService:Create(Frame, frameTweenInfo, {Size = newSize}):Play()
    ToggleButton.Visible = not isMinimized
    CustomToggleButton.Visible = not isMinimized
    TextBoxX.Visible = customDesyncEnabled and not isMinimized
    TextBoxY.Visible = customDesyncEnabled and not isMinimized
    TextBoxZ.Visible = customDesyncEnabled and not isMinimized
end)


CloseButton.MouseButton1Click:Connect(function()
    ScreenGui:Destroy()
    desyncT.enabled = false
end)

UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
    if gameProcessedEvent then return end
    if input.KeyCode == Enum.KeyCode.C then
        desyncT.enabled = not desyncT.enabled
        ToggleButton.Text = desyncT.enabled and "Desync: ON" or "Desync: OFF"
    end
end)

local desynchook = nil
local prevLookVector = nil
local isSpinning = false
local spinThreshold = 15

local function getOffsetCFrame()
    if customDesyncEnabled then
        local x = tonumber(TextBoxX.Text) or 0
        local y = tonumber(TextBoxY.Text) or 0
        local z = tonumber(TextBoxZ.Text) or 0
        return CFrame.new(x, y, z)
    else
        local ping = LocalPlayer:GetNetworkPing() * 1000
        if ping < 100 then return CFrame.new(0, 0, -2)
        elseif ping <= 170 then return CFrame.new(0, 0, -2.7)
        else return CFrame.new(0, 0, -3.7) end
    end
end

RunService.Heartbeat:Connect(function()
    if not desyncT.enabled or not LocalPlayer.Character then return end
    
    local character = LocalPlayer.Character
    local root = character:FindFirstChild("HumanoidRootPart")
    if not root then return end
    
    local currentLook = root.CFrame.LookVector
    if prevLookVector then
        local dot = math.clamp(prevLookVector:Dot(currentLook), -1, 1)
        local angleDiff = math.deg(math.acos(dot))
        isSpinning = angleDiff > spinThreshold
    end
    prevLookVector = currentLook
    
    if isSpinning then return end 
    
    desyncT.loc = root.CFrame
    
    local offset = getOffsetCFrame()
    local newCFrame = desyncT.loc * offset
    root.CFrame = newCFrame
    
    RunService.RenderStepped:Wait()
    root.CFrame = desyncT.loc
end)

desynchook = hookmetamethod(game, "__index", newcclosure(function(self, key)
    if desyncT.enabled and not checkcaller() and 
       key == "CFrame" and 
       LocalPlayer.Character and 
       self == LocalPlayer.Character:FindFirstChild("HumanoidRootPart") and
       not isSpinning then
        return desyncT.loc
    end
    return desynchook(self, key)
end))

LocalPlayer.CharacterAdded:Connect(function()
    task.wait(1)
    prevLookVector = nil
    isSpinning = false
end)

print("HOOK DESYNC LOADED - Client-side only, others see server pos!")

Features & Information

desync

Community Comments (25)

ScriptFinderWScriptFinderWNov 7, 2025

dude its cool but update it to make it a real desync, teleporting around could trigger anti cheat, i see potential in this code, i have been looking for something like this for ages but its not EXACTLY what i was hoping

Replying to @ScriptFinderW
ReCallFunctionReCallFunctionNov 9, 2025

@ScriptFinderW fixed i think, for me it works, tell me if somethings wrong ill fix it

Replying to @ReCallFunction
ScriptFinderWScriptFinderWNov 9, 2025

@ReCallFunction U made real desync bro?? Rlly

Replying to @ReCallFunction
ScriptFinderWScriptFinderWNov 9, 2025

@ReCallFunction Lol its the same thing but its not jittering anymore i just want a real desync plz :)

ZERETETZERETETNov 9, 2025

made by ai 😂

Replying to @ZERETET
ReCallFunctionReCallFunctionNov 9, 2025

@ZERETET gui made by ai, desync by me

Replying to @ReCallFunction
ZERETETZERETETNov 9, 2025

@ReCallFunction ok

Replying to @ZERETET
ScriptFinderWScriptFinderWNov 9, 2025

@ZERETET please make my suggestion bro plz

Replying to @ScriptFinderW
ZERETETZERETETNov 9, 2025

@ScriptFinderW ?

Replying to @ReCallFunction
notvietnotvietNov 9, 2025

@ReCallFunction bro pls make it like real desync, not teleporting in sky

Replying to @notviet
ReCallFunctionReCallFunctionNov 9, 2025(edited)

guys alr ill fix it for you

Replying to @ReCallFunction
notvietnotvietNov 10, 2025

@ReCallFunction its still same, can you make the fly invisible or just when active fo server u will stay on on one place

praeallanpraeallanNov 12, 2025

please send an update once its done

ReCallFunctionReCallFunctionNov 14, 2025

ill try making real one desync i got you, it will take me a bit so wait

notenoughjacknotenoughjackNov 29, 2025

Dm me on discord iknotenoughjack Are you able to make it so it has no GUI and it puts your desync at a specific location that was preset in the code?

Replying to @notenoughjack
ReCallFunctionReCallFunctionNov 30, 2025(edited)

@notenoughjack yea ill text you later

owlguy17owlguy17Dec 28, 2025

Can u make an option that makes the character freezes where its activated and the camera follows your client (i tried doing this but the camera stuck with the server character

zivrbuzivrbuJan 16, 2026

lowkey don't give a * about this gui ts is GAS.🔥🔥🔥🔥🔥

KartaHubKartaHubFeb 11, 2026

"Visual" desync

Replying to @KartaHub
WlazedWlazedFeb 13, 2026

@KartaHub sthfu, i got immortality with this u mf :/

ExecutorRequiredExecutorRequiredApr 27, 2026

Do it and -- improved from recallfunction gui fixed+more ... Thx recallfunction for opensource in coming features: Invisible toggle ; esp display server root and server character hide toggle (hide ur server character for prevent target kill you),...

ExecutorRequiredExecutorRequiredApr 27, 2026

maybe 2026/28/5 or never? semms like i'm little bit busy

Guest_IVGuest_IVMay 10, 2026(edited)

dayum this is good desync without using raknet, i can make u a better GUI so people and me stop calling this script AI

ExecutorRequiredExecutorRequiredJun 1, 2026

new script: "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x70\x61\x73\x74\x65\x66\x79\x2e\x61\x70\x70\x2f\x56\x39\x72\x4f\x4e\x35\x4d\x52\x2f\x72\x61\x77"

kunwarmanvik2kunwarmanvik2Jun 29, 2026

doesnt even work