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