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

local BackpackRemote = ReplicatedStorage:FindFirstChild("BackpackRemote")
local InventoryRemote = ReplicatedStorage:FindFirstChild("Inventory")
local BuyItemRemote = ReplicatedStorage:FindFirstChild("BuyItemRemote")
local ListWeaponRemote = ReplicatedStorage:FindFirstChild("ListWeaponRemote")
local MarketItems = ReplicatedStorage:FindFirstChild("MarketItems")
local dropRemote = ReplicatedStorage:WaitForChild("DropItemRemote", 5)

local safeActive = false
local autoDropEnabled = false

local Blacklist = {
    ["Fists"] = true, ["Fist"] = true, ["Phone"] = true,
    ["Car Keys"] = true, ["Bandage"] = true, ["762s"] = true,
    ["556s"] = true, ["Extended"] = true, ["T shirt"] = true,
    ["Combat"] = true, ["Weight"] = true,
}

local function SilentBypassTeleport(targetCFrame)
    local char = LocalPlayer.Character
    local root = char and char:FindFirstChild("HumanoidRootPart")
    local hum  = char and char:FindFirstChildOfClass("Humanoid")
    if not root then return end
    if hum then hum:ChangeState(0) end
    local sWait = tick()
    repeat task.wait() until not LocalPlayer:GetAttribute("LastACPos") or (tick() - sWait > 1)
    root.CFrame = targetCFrame
    root.AssemblyLinearVelocity = Vector3.zero
    root.AssemblyAngularVelocity = Vector3.zero
    task.wait(0.5)
    if hum then hum:ChangeState(Enum.HumanoidStateType.GettingUp) end
end

local function FirePromptsInArea(range, nameFilter)
    local char = LocalPlayer.Character
    local root = char and char:FindFirstChild("HumanoidRootPart")
    if not root then return end
    for _, v in pairs(workspace:GetDescendants()) do
        if v:IsA("ProximityPrompt") then
            local pPos = (v.Parent:IsA("Model") and v.Parent:GetPivot().Position)
                      or (v.Parent:IsA("BasePart") and v.Parent.Position)
            if pPos then
                local dist = (pPos - root.Position).Magnitude
                if dist < range then
                    if not nameFilter
                        or v.Parent.Name:lower():find(nameFilter:lower())
                        or v.Name:lower():find(nameFilter:lower()) then
                        fireproximityprompt(v)
                    end
                end
            end
        end
    end
end

local function GetLockedTools()
    local tools = {}
    for _, tool in pairs(LocalPlayer.Backpack:GetChildren()) do
        if tool:IsA("Tool") and not Blacklist[tool.Name] then
            table.insert(tools, { Name = tool.Name, Id = tool })
        end
    end
    return tools
end

local function SafeDupeOnce(itemData, returnCFrame)
    local toolName  = itemData.Name
    local SafeFolder = workspace:FindFirstChild("HomeDoorSS")
        and workspace.HomeDoorSS:FindFirstChild("HomeDoor")
        and workspace.HomeDoorSS.HomeDoor:FindFirstChild("Safe")
    if not SafeFolder then return end

    local safePart = SafeFolder:FindFirstChild("Union")
                  or SafeFolder:FindFirstChildWhichIsA("BasePart")
    if not safePart then return end

    SilentBypassTeleport(safePart.CFrame * CFrame.new(0, 2, 0))
    task.wait(0.3)
    task.spawn(function() BackpackRemote:InvokeServer("Store", toolName) end)
    task.spawn(function() InventoryRemote:FireServer("Change", toolName, "Backpack", SafeFolder) end)
    task.wait(0.6)
    SilentBypassTeleport(returnCFrame)
    task.wait(1.2)
    BackpackRemote:InvokeServer("Grab", toolName)
    task.wait(0.5)
end

local Rayfield = loadstring(game:HttpGet("https://[Log in to view URL]"))()

local Window = Rayfield:CreateWindow({
    Name = "Safe Dupe Hub",
    LoadingTitle = "Safe Dupe Hub",
    LoadingSubtitle = "Safe Dupe | Safe TP | Auto Drop",
    Theme = "Default",
    DisableRayfieldPrompts = false,
    DisableBuildWarnings = false,
    ConfigurationSaving = {
        Enabled = true,
        FolderName = "SafeDupeHub",
        FileName = "Config",
    },
    KeySystem = false,
})

local function Notify(title, content, duration)
    Rayfield:Notify({ Title = title, Content = content, Duration = duration or 3 })
end

local MainTab = Window:CreateTab("Dupe & Utils", "package")

MainTab:CreateSection("Safe Dupe")

MainTab:CreateLabel("Need 0 items equipped. Max 3 in backpack. Start in a safe zone. Script rents a home, opens the safe, and cycles your items.")

MainTab:CreateButton({
    Name = "Start / Stop Safe Dupe",
    Info = "Toggles the safe dupe. Press again to stop.",
    Callback = function()
        if safeActive then
            safeActive = false
            Notify("Safe Dupe", "Stopped.", 3)
            return
        end

        local lockedItems = GetLockedTools()
        if #lockedItems == 0 then
            return Notify("Safe Dupe", "No tools in backpack!", 4)
        end

        local char = LocalPlayer.Character
        local root = char and char:FindFirstChild("HumanoidRootPart")
        if not root then
            return Notify("Safe Dupe", "No character found!", 4)
        end

        safeActive = true
        local OriginalLocation = root.CFrame

        task.spawn(function()

            Notify("Safe Dupe", "Renting home...", 3)
            SilentBypassTeleport(CFrame.new(-1443, 256, 2137))
            task.wait(0.7)
            FirePromptsInArea(15)


            Notify("Safe Dupe", "Opening safe...", 3)
            SilentBypassTeleport(CFrame.new(-1473, 256, 2134))
            task.wait(0.7)
            FirePromptsInArea(15, "Safe")


            Notify("Safe Dupe", "Returning to start...", 2)
            SilentBypassTeleport(OriginalLocation)
            task.wait(0.5)


            for i = 1, 15 do
                if not safeActive then break end
                local itemIndex = ((i - 1) % #lockedItems) + 1
                local itemName  = lockedItems[itemIndex].Name

                Notify("Safe Dupe", string.format("Auto Duping Safe Item", i, itemName), 2)
                SafeDupeOnce(lockedItems[itemIndex], OriginalLocation)
                task.wait(0.2)
            end

            safeActive = false
            Notify("Safe Dupe", "Done!", 4)
        end)
    end,
})

MainTab:CreateSection("Safe Teleport")

MainTab:CreateLabel("Teleports directly to the safe and fires its prompts to open it.")

MainTab:CreateButton({
    Name = "Teleport To Safe",
    Info = "TP to safe location and open it",
    Callback = function()
        Notify("Safe TP", "Teleporting to safe...", 2)
        SilentBypassTeleport(CFrame.new(-1473, 256, 2134))
        task.wait(0.8)
        FirePromptsInArea(15, "Safe")
        Notify("Safe TP", "Safe opened!", 3)
    end,
})

MainTab:CreateSection("Auto Drop Items")

MainTab:CreateLabel("Automatically equips and drops every non-blacklisted item in your backpack on loop.")

MainTab:CreateToggle({
    Name = "Auto Drop Items",
    CurrentValue = false,
    Flag = "AutoDropEnabled",
    Callback = function(State)
        autoDropEnabled = State

        if not State then
            Notify("Auto Drop", "Stopped.", 2)
            return
        end

        Notify("Auto Drop", "Dropping items...", 2)

        task.spawn(function()
            while autoDropEnabled do
                local backpack  = LocalPlayer:FindFirstChild("Backpack")
                local character = LocalPlayer.Character
                if not backpack or not character then task.wait(0.5) continue end

                local humanoid = character:FindFirstChildOfClass("Humanoid")
                local foundAny = false

                for _, item in ipairs(backpack:GetChildren()) do
                    if not autoDropEnabled then break end
                    if item:IsA("Tool") and not Blacklist[item.Name] then
                        foundAny = true
                        if humanoid then
                            humanoid:EquipTool(item)
                            local dropStart = tick()
                            repeat
                                if dropRemote then
                                    pcall(function() dropRemote:FireServer(item.Name) end)
                                    pcall(function() dropRemote:FireServer(item) end)
                                    pcall(function() dropRemote:FireServer() end)
                                end
                                task.wait(0.2)
                            until not item:IsDescendantOf(character)
                                or not autoDropEnabled
                                or (tick() - dropStart > 3)
                            task.wait(0.1)
                        end
                    end
                end

                if not foundAny then
                    task.wait(1) 
                else
                    task.wait(0.1)
                end
            end
        end)
    end,
})

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: