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