scripts.nitaimaarek.com 11 scripts Log in
  1. scripts
  2. Network ownership probe (one part, yes/no answer)

Network ownership probe (one part, yes/no answer)

diagnostic network-ownership probe universal

Standalone. Picks the nearest unanchored non-character part, marks it, pushes it straight up with Velocity for 4s raw and 4s with ReplicationFocus+SimulationRadius, then releases it and watches for snap-back. Prints a verdict: NO OWNERSHIP / PREDICTION ONLY / OWNERSHIP WORKS. Use it to tell an execu
Paste it into any executor. It always pulls the latest version of this script.
15 views· 233 lines· 8.2 KB· added 22d ago raw

Source

--!nonstrict
--[[=========================================================================
    network ownership probe

    One part. One question: when this client writes Velocity to a nearby
    unanchored part, does the SERVER accept it?

    Nothing here is shared with the Optimizer -- no library, no registry, no
    modes -- so whatever it reports is about your executor and this game, not
    about that script.

    It runs four measurements:

      1. capabilities      what the executor actually exposes
      2. raw push          velocity only, no ownership tricks at all
      3. boosted push      same, after ReplicationFocus + SimulationRadius
      4. release           stop pushing and see if the part snaps back

    (4) is the important one. A part that moves while pushed and then returns
    to where it started was never yours: you were watching local prediction,
    and the server's position was the real one the whole time.
=========================================================================]]

local Players    = game:GetService("Players")
local RunService = game:GetService("RunService")
local LocalPlayer = Players.LocalPlayer

local PUSH_SECONDS = 4
local PUSH_SPEED   = 60          -- studs/sec, straight up: unmistakable
local SEARCH_RANGE = 200

--=========================================================================
-- readout
--=========================================================================

local function guiHost()
    if gethui then
        local ok, host = pcall(gethui)
        if ok and host then return host end
    end
    local ok, core = pcall(game.GetService, game, "CoreGui")
    if ok and core then return core end
    return LocalPlayer:WaitForChild("PlayerGui")
end

local gui = Instance.new("ScreenGui")
gui.Name = "OwnershipProbe"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.Parent = guiHost()

local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 460, 0, 240)
frame.Position = UDim2.new(0.5, -230, 0, 40)
frame.BackgroundColor3 = Color3.fromRGB(16, 16, 22)
frame.BorderSizePixel = 0
frame.Parent = gui
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 8)

local text = Instance.new("TextLabel")
text.BackgroundTransparency = 1
text.Position = UDim2.new(0, 12, 0, 10)
text.Size = UDim2.new(1, -24, 1, -20)
text.Font = Enum.Font.Code
text.TextSize = 13
text.TextColor3 = Color3.fromRGB(215, 220, 235)
text.TextXAlignment = Enum.TextXAlignment.Left
text.TextYAlignment = Enum.TextYAlignment.Top
text.TextWrapped = true
text.Text = "probing..."
text.Parent = frame

local lines = {}
local function log(line)
    lines[#lines + 1] = line
    text.Text = table.concat(lines, "\n")
    print("[probe] " .. line)
end

--=========================================================================
-- helpers
--=========================================================================

local function isCharacterPart(part)
    local node = part
    for _ = 1, 4 do
        node = node.Parent
        if not node then return false end
        if node:FindFirstChildOfClass("Humanoid") then return true end
        if Players:GetPlayerFromCharacter(node) then return true end
    end
    return false
end

local function getRoot()
    local char = LocalPlayer.Character
    return char and char:FindFirstChild("HumanoidRootPart")
end

local function nearestPart(origin)
    local best, bestDist
    for _, inst in ipairs(workspace:GetDescendants()) do
        if inst:IsA("BasePart") and not inst.Anchored and not isCharacterPart(inst) then
            local d = (inst.Position - origin).Magnitude
            if d <= SEARCH_RANGE and (not bestDist or d < bestDist) then
                best, bestDist = inst, d
            end
        end
    end
    return best, bestDist
end

-- Push for a while, then report how far it actually went and whether the
-- server stopped sending us updates for it (ReceiveAge climbing = ours).
local function pushFor(part, seconds)
    local start = part.Position
    local maxAge, elapsed = 0, 0
    local up = Vector3.new(0, PUSH_SPEED, 0)

    while elapsed < seconds and part.Parent do
        local dt = RunService.Heartbeat:Wait()
        elapsed = elapsed + dt
        pcall(function() part.Velocity = up end)
        local ok, age = pcall(function() return part.ReceiveAge end)
        if ok and type(age) == "number" and age > maxAge then maxAge = age end
    end

    return (part.Position - start).Magnitude, maxAge, start
end

--=========================================================================
-- run
--=========================================================================

task.spawn(function()
    log("== network ownership probe ==")

    -- 1. capabilities
    local hasHidden = type(sethiddenproperty) == "function"
    local hasSimFn  = type(setsimulationradius) == "function"
    local okAge = pcall(function() return Instance.new("Part").ReceiveAge end)
    log(string.format("exec: sethiddenproperty=%s setsimradius=%s ReceiveAge=%s",
        tostring(hasHidden), tostring(hasSimFn), tostring(okAge)))

    local root = getRoot()
    if not root then
        log("FAIL: no HumanoidRootPart -- spawn in and re-run")
        return
    end

    -- 2. pick a target
    local part, dist = nearestPart(root.Position)
    if not part then
        log("FAIL: no unanchored non-character part within " .. SEARCH_RANGE .. " studs.")
        log("This game has nothing a client could ever move.")
        return
    end

    log(string.format("target: %s  (%.0f studs away, size %s)",
        part:GetFullName(), dist, tostring(part.Size)))

    local box = Instance.new("SelectionBox")
    box.Adornee = part
    box.Color3 = Color3.fromRGB(90, 200, 255)
    box.LineThickness = 0.05
    box.Parent = gui

    -- 3. raw push, no tricks
    log("phase 1: pushing UP for " .. PUSH_SECONDS .. "s, no ownership tricks...")
    local moved1, age1, origin = pushFor(part, PUSH_SECONDS)
    log(string.format("  moved %.1f studs, peak ReceiveAge %.2f", moved1, age1))

    -- 4. push again with the ownership calls applied
    log("phase 2: same push, with ReplicationFocus + SimulationRadius...")
    pcall(function() LocalPlayer.ReplicationFocus = workspace end)
    local boost = RunService.Heartbeat:Connect(function()
        if hasHidden then
            pcall(function()
                sethiddenproperty(LocalPlayer, "SimulationRadius", math.huge)
            end)
        elseif hasSimFn then
            pcall(function() setsimulationradius(math.huge) end)
        end
    end)

    local moved2, age2 = pushFor(part, PUSH_SECONDS)
    log(string.format("  moved %.1f studs, peak ReceiveAge %.2f", moved2, age2))

    -- 5. stop pushing: does it stay, or snap back?
    log("phase 3: released -- watching for snap-back...")
    local held = part.Position
    local settleStart = tick()
    while tick() - settleStart < 2 and part.Parent do
        RunService.Heartbeat:Wait()
    end
    boost:Disconnect()

    local drift = (part.Position - held).Magnitude
    local backToStart = (part.Position - origin).Magnitude
    log(string.format("  drifted %.1f studs after release, now %.1f from where it began",
        drift, backToStart))

    -- 6. verdict
    log("")
    local best = math.max(moved1, moved2)
    if best < 2 then
        log("VERDICT: NO OWNERSHIP. The part never moved.")
        log("The server is simulating it and ignoring this client entirely.")
    elseif backToStart < 3 and best > 5 then
        log("VERDICT: PREDICTION ONLY -- this is the bug you were seeing.")
        log("It moved while pushed, then returned to its original spot, so")
        log("the movement was local. The server never handed the part over.")
    elseif best > 5 then
        log("VERDICT: OWNERSHIP WORKS. It moved and stayed moved.")
        log("Velocity writes are replicating, so the Optimizer's Network tab")
        log("should work in this game -- if it does not, that is a script bug.")
    else
        log("VERDICT: MARGINAL -- moved " .. string.format("%.1f", best) ..
            " studs. Probably fighting the server.")
    end

    if moved2 > moved1 + 3 then
        log("(the ownership calls measurably helped)")
    elseif hasHidden then
        log("(the ownership calls changed nothing -- SimulationRadius is")
        log(" removed on modern Roblox, so this is expected)")
    end

    task.delay(45, function()
        box:Destroy()
        gui:Destroy()
    end)
end)