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


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 toggleFreeze(part) if not part or not part:IsA("BasePart") then return end
if frozenObjects[part] then
    -- РАЗМОРОЗКА: Возвращаем всё назад
    frozenObjects[part].Connection:Disconnect()
    
    -- Уничтожаем невидимый Anchored-клон
    if frozenObjects[part].Clone and frozenObjects[part].Clone.Parent then
        frozenObjects[part].Clone:Destroy()
    end
    
    -- Возвращаем физику оригиналу
    part.CanCollide = true
    part.Velocity = Vector3.new(0,0,0)
    part.RotVelocity = Vector3.new(0,0,0)
    part.AssemblyLinearVelocity = Vector3.new(0,0,0)
    part.AssemblyAngularVelocity = Vector3.new(0,0,0)
    
    frozenObjects[part] = nil
else
    -- ЗАМОРОЗКА: Создаем невидимый жесткий блок, чтобы убрать тряску для других
    local savedCFrame = part.CFrame
    
    -- Создаем скрытый клон, который будет выступать "бетонной" опорой
    local anchorClone = Instance.new("Part")
    anchorClone.Size = part.Size + Vector3.new(0.02, 0.02, 0.02) -- Чуть больше оригинала для точности коллизии
    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
    
    -- У оригинала отключаем коллизию, чтобы физика сервера не конфликтовала с твоим CFrame
    part.CanCollide = false
    
    -- Каждую итерацию Heartbeat жестко удерживаем оригинал на месте клона
    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,
        Clone = anchorClone
    }
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
    
    -- Проверяем: держим ли мы что-то в руках (Tool)
    local heldTool = character:FindFirstChildOfClass("Tool")
    
    if heldTool then
        -- 1. Сначала собираем все детали инструмента
        local partsToFreeze = {}
        for _, child in ipairs(heldTool:GetDescendants()) do
            if child:IsA("BasePart") then
                table.insert(partsToFreeze, child)
            end
        end
        
        -- 2. Убираем инструмент в рюкзак
        heldTool.Parent = player.Backpack
        task.wait(0.05)
        
        -- 3. Замораживаем детали
        for _, part in ipairs(partsToFreeze) do
            toggleFreeze(part)
        end
    else
        -- Если руки пустые — заморозка блока под мышкой
        local target = mouse.Target
        if target and not target.Anchored then
            toggleFreeze(target)
        end
    end
end
end)