Загрузка данных


local Players = game:GetService("Players") 
local uis = game:GetService("UserInputService") 
local runService = game:GetService("RunService")

local player = Players.LocalPlayer 
local mouse = player:GetMouse()

local TOGGLE_KEY = Enum.KeyCode.Z 
local frozenObjects = {}

-- Функция, которая заставляет сервер верить, что деталь стоит на месте
local function claimNetworkOwnership(part)
    if settings().Network.PhysicsEnvironmentalThrottle ~= Enum.EnviromentalPhysicsThrottle.Disabled then
        pcall(function()
            settings().Network.PhysicsEnvironmentalThrottle = Enum.EnviromentalPhysicsThrottle.Disabled
        end)
    end
    -- Эмуляция сетевой активности для удержания владения физикой (работает во многих эксплоитах)
    task.spawn(function()
        while frozenObjects[part] and part and part.Parent do
            pcall(function()
                part.Velocity = Vector3.new(0, 0.03, 0) -- Микро-скорость, чтобы сервер отдавал приоритет нашему клиенту
                part.RotVelocity = Vector3.new(0, 0, 0)
            end)
            task.wait(0.1)
        end
    end)
end

local function toggleFreeze(part) 
    if not part or not part:IsA("BasePart") then return end

    if frozenObjects[part] then
        frozenObjects[part].Connection:Disconnect()
        
        if frozenObjects[part].Clone and frozenObjects[part].Clone.Parent then
            frozenObjects[part].Clone:Destroy()
        end
        
        part.CanCollide = frozenObjects[part].OriginalCanCollide
        part.AssemblyLinearVelocity = Vector3.new(0,0,0)
        part.AssemblyAngularVelocity = Vector3.new(0,0,0)
        
        if frozenObjects[part].OriginalParent and frozenObjects[part].OriginalParent.Parent then
            part.Parent = frozenObjects[part].OriginalParent
        end
        
        frozenObjects[part] = nil
    else
        local savedCFrame = part.CFrame
        local originalParent = part.Parent
        local originalCanCollide = part.CanCollide
        
        local anchorClone = Instance.new("Part")
        anchorClone.Size = part.Size + Vector3.new(0.01, 0.01, 0.01)
        anchorClone.CFrame = savedCFrame
        anchorClone.Anchored = true
        anchorClone.Transparency = 1 
        anchorClone.CanCollide = true
        anchorClone.TopSurface = Enum.SurfaceType.Smooth
        anchorClone.BottomSurface = Enum.SurfaceType.Smooth
        anchorClone.Parent = workspace
        
        part.CanCollide = false
        part.Parent = workspace
        
        -- Регистрируем объект в таблице до запуска циклов
        frozenObjects[part] = {
            Clone = anchorClone,
            OriginalParent = originalParent,
            OriginalCanCollide = originalCanCollide
        }

        -- Удерживаем права на физику детали, чтобы сервер её не утащил вниз
        claimNetworkOwnership(part)
        
        local connection = runService.Heartbeat:Connect(function()
            if part and part.Parent and anchorClone and anchorClone.Parent then
                part.CFrame = savedCFrame
                -- Принудительно гасим любую скорость на клиенте, реплицируя это на сервер
                part.AssemblyLinearVelocity = Vector3.new(0,0,0)
                part.AssemblyAngularVelocity = Vector3.new(0,0,0)
            else
                if frozenObjects[part] then
                    if anchorClone then anchorClone:Destroy() end
                    frozenObjects[part].Connection:Disconnect()
                    frozenObjects[part] = nil
                end
            end
        end)
        
        frozenObjects[part].Connection = connection
    end
end

uis.InputBegan:Connect(function(input, gameProcessed) 
    if gameProcessed then return end

    if input.KeyCode == TOGGLE_KEY then
        local character = player.Character
        if not character then return end
        
        local heldTool = character:FindFirstChildOfClass("Tool")
        
        if heldTool then
            local partsToFreeze = {}
            for _, child in ipairs(heldTool:GetDescendants()) do
                if child:IsA("BasePart") then
                    table.insert(partsToFreeze, child)
                end
            end
            
            heldTool.Parent = workspace
            
            for _, part in ipairs(partsToFreeze) do
                toggleFreeze(part)
            end
        else
            local target = mouse.Target
            if target and not target.Anchored and not target:IsDescendantOf(character) then
                -- Дополнительно проверяем, можем ли мы управлять физикой этого объекта
                if target.ReceiveAge == target.ReceiveAge then -- Быстрая проверка на валидность объекта
                    toggleFreeze(target)
                end
            end
        end
    end
end)