Загрузка данных
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)