scripts.nitaimaarek.com 11 scripts Log in
  1. scripts
  2. DragDetector probe (which drag method works here)

DragDetector probe (which drag method works here)

diagnostic dragdetector probe universal

Standalone. Finds a draggable part, dumps the detector settings (including RunLocally, which means the game made the drag client-only), then tries four methods in order -- plain DragFrame write, DragFrame after forcing settings, RestartDrag+DragFrame, and a real simulated mouse drag via VirtualInput
Paste it into any executor. It always pulls the latest version of this script.
9 views· 201 lines· 7.0 KB· added 22d ago raw

Source

--!nonstrict
--[[=========================================================================
    DragDetector probe

    Finds a draggable part and works out WHICH method actually moves it, if
    any. Nothing is swallowed: every write reports whether it took, and every
    method reports whether the part physically moved afterwards.

    Methods tried, in order:
      1. write DragFrame directly           (no active drag session)
      2. same, after forcing the detector's settings
      3. RestartDrag() then write DragFrame
      4. simulated mouse drag via VirtualInputManager  (a real drag session)

    It also dumps the detector's own settings first, because RunLocally = true
    means the drag is client-only by the game's own choice and nothing here
    will ever replicate.
=========================================================================]]

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

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 = "DragProbe"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.Parent = guiHost()

local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 520, 0, 320)
frame.Position = UDim2.new(0.5, -260, 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 = gui and frame

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

local function findDetector()
    for _, inst in ipairs(workspace:GetDescendants()) do
        if inst:IsA("DragDetector") then
            local node = inst.Parent
            for _ = 1, 3 do
                if not node then break end
                if node:IsA("BasePart") then return inst, node end
                node = node.Parent
            end
        end
    end
    return nil
end

-- try a write and say plainly whether it took
local function tryWrite(inst, prop, value)
    local ok, err = pcall(function() inst[prop] = value end)
    if not ok then
        return false, tostring(err)
    end
    local got
    pcall(function() got = inst[prop] end)
    return true, tostring(got)
end

local function moved(part, from)
    return (part.Position - from).Magnitude
end

task.spawn(function()
    log("== DragDetector probe ==")

    local det, part = findDetector()
    if not det then
        log("no DragDetector anywhere in workspace.")
        log("This game has no draggable parts, so the Drag tab has nothing")
        log("to act on -- that is the whole explanation.")
        return
    end

    log("found: " .. det:GetFullName())
    log("  part: " .. part:GetFullName())

    -- 1. what does the game itself say about this detector?
    local function readProp(name)
        local ok, v = pcall(function() return det[name] end)
        return ok and tostring(v) or "n/a"
    end
    log(string.format("  Enabled=%s RunLocally=%s Response=%s",
        readProp("Enabled"), readProp("RunLocally"), readProp("ResponseStyle")))
    log(string.format("  DragStyle=%s Permission=%s MaxDist=%s",
        readProp("DragStyle"), readProp("PermissionPolicy"),
        readProp("MaxActivationDistance")))

    if readProp("RunLocally") == "true" then
        log("!! RunLocally is TRUE -- this game made the drag client-only.")
        log("   Nothing any script does here will replicate.")
    end

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

    local function attempt(name, fn)
        local from = part.Position
        local ok, err = pcall(fn)
        for _ = 1, 12 do RunService.Heartbeat:Wait() end
        local d = moved(part, from)
        log(string.format("%s -> %s, part moved %.2f studs",
            name, ok and "write ok" or ("ERR " .. tostring(err)), d))
        return d
    end

    -- 2. plain DragFrame write, exactly what the hub was doing
    local best = attempt("1. DragFrame write", function()
        det.DragFrame = det.DragFrame + Vector3.new(0, 25, 0)
    end)

    -- 3. force the settings first
    local okE, msgE = tryWrite(det, "Enabled", true)
    log("   set Enabled -> " .. (okE and msgE or msgE))
    local okR, msgR = tryWrite(det, "RunLocally", false)
    log("   set RunLocally -> " .. (okR and msgR or msgR))
    local okS = tryWrite(det, "ResponseStyle", Enum.DragDetectorResponseStyle.Geometric)
    log("   set ResponseStyle -> " .. tostring(okS))
    pcall(function() det.MaxActivationDistance = 1e6 end)

    best = math.max(best, attempt("2. DragFrame after forcing settings", function()
        det.DragFrame = det.DragFrame + Vector3.new(0, 25, 0)
    end))

    -- 4. RestartDrag first, in case a live drag session is required
    best = math.max(best, attempt("3. RestartDrag + DragFrame", function()
        det:RestartDrag()
        det.DragFrame = det.DragFrame + Vector3.new(0, 25, 0)
    end))

    -- 5. an actual simulated drag, which is what the engine really listens for
    local vimOk = pcall(function() return game:GetService("VirtualInputManager") end)
    log("VirtualInputManager available: " .. tostring(vimOk))

    if vimOk then
        best = math.max(best, attempt("4. simulated mouse drag", function()
            local VIM = game:GetService("VirtualInputManager")
            local cam = workspace.CurrentCamera
            local sp, onScreen = cam:WorldToViewportPoint(part.Position)
            if not onScreen then error("part is off-screen; look at it and re-run") end
            VIM:SendMouseButtonEvent(sp.X, sp.Y, 0, true, game, 0)
            for i = 1, 10 do
                VIM:SendMouseMoveEvent(sp.X, sp.Y - i * 6, game)
                RunService.Heartbeat:Wait()
            end
            VIM:SendMouseButtonEvent(sp.X, sp.Y - 60, 0, false, game, 0)
        end))
    end

    log("")
    if best < 0.5 then
        log("VERDICT: nothing moved it.")
        log("Either the game blocks it (PermissionPolicy), or a drag only")
        log("works from real input while you are looking at the part.")
    else
        log(string.format("VERDICT: something worked -- best movement %.2f studs.", best))
        log("Tell me which numbered method moved it and I will make the")
        log("hub's Drag section use that one.")
    end

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