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


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 = 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
        
        -- Вытаскиваем деталь в workspace, чтобы на неё не влияли анимации инструмента/персонажа
        part.Parent = workspace
        
        -- Жестко удерживаем оригинал на месте клона
        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,
            OriginalParent = originalParent,
            OriginalCanCollide = originalCanCollide
        }
    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
            -- 1. Собираем все физические детали
            local partsToFreeze = {}
            for _, child in ipairs(heldTool:GetDescendants()) do
                if child:IsA("BasePart") then
                    table.insert(partsToFreeze, child)
                end
            end
            
            -- 2. "Выбрасываем" инструмент в workspace, чтобы он отвязался от персонажа
            heldTool.Parent = workspace
            
            -- 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)