-- Full Physical Motion Mirroring (9 Limbs: Knees & Elbows Included) --- local Players = game:GetService("Players") local RunService = game:GetService("RunService") local CoreGui = game:GetService("CoreGui") local LocalPlayer = Players.LocalPlayer local Mouse = LocalPlayer:GetMouse() local Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait() -- Таблица для хранения привязанных объектов (добавлено 4 новых сустава) local AttachedObjects = { Torso = {Part = nil, R15 = "UpperTorso", R6 = "Torso"}, -- Верхние части рук (Плечи) LeftArm = {Part = nil, R15 = "LeftUpperArm", R6 = "Left Arm"}, RightArm = {Part = nil, R15 = "RightUpperArm", R6 = "Right Arm"}, -- Нижние части рук (Предплечья / Локти) LeftLowerArm = {Part = nil, R15 = "LeftLowerArm", R6 = "Left Arm"}, RightLowerArm = {Part = nil, R15 = "RightLowerArm", R6 = "Right Arm"}, -- Верхние части ног (Бёдра) LeftLeg = {Part = nil, R15 = "LeftUpperLeg", R6 = "Left Leg"}, RightLeg = {Part = nil, R15 = "RightUpperLeg", R6 = "Right Leg"}, -- Нижние части ног (Голени / Колени) LeftLowerLeg = {Part = nil, R15 = "LeftLowerLeg", R6 = "Left Leg"}, RightLowerLeg = {Part = nil, R15 = "RightLowerLeg", R6 = "Right Leg"} } -- Ссылка на GUI для обновления текста статуса local StatusLabels = {} -- Функция поиска правильной кости персонажа в зависимости от R15 / R6 local function GetCharacterLimb(limbData) if Character:FindFirstChild("Humanoid") and Character.Humanoid.RigType == Enum.HumanoidRigType.R6 then return Character:FindFirstChild(limbData.R6) else return Character:FindFirstChild(limbData.R15) end end --- ========================================== --- --- ФУНКЦИЯ СОЗДАНИЯ ИНСТРУМЕНТОВ --- --- ========================================== --- local function CreateLimbTool(toolName, keyName, color) local Tool = Instance.new("Tool") Tool.Name = toolName Tool.RequiresHandle = false Tool.Equipped:Connect(function() local conn conn = Mouse.Button1Down:Connect(function() local target = Mouse.Target -- Проверяем, что это незафиксированный блок и не часть нашего персонажа if target and target:IsA("BasePart") and not target.Anchored and not target:IsDescendantOf(Character) then -- Если этот блок уже привязан к другой части тела, освобождаем его там for k, data in pairs(AttachedObjects) do if data.Part == target then AttachedObjects[k].Part = nil if StatusLabels[k] then StatusLabels[k].Text = k .. ": пусто" StatusLabels[k].TextColor3 = Color3.fromRGB(150, 150, 150) end end end -- Привязываем блок AttachedObjects[keyName].Part = target target.AssemblyLinearVelocity = Vector3.new(0, 0, 0) -- Эффект вспышки при выборе local origTrans = target.Transparency target.Transparency = 0.5 task.delay(0.2, function() target.Transparency = origTrans end) -- Обновляем текст в GUI if StatusLabels[keyName] then StatusLabels[keyName].Text = toolName .. " -> " .. target.Name StatusLabels[keyName].TextColor3 = color end print(toolName .. " успешно подключен к: " .. target.Name) end end) Tool.Unequipped:Connect(function() if conn then conn:Disconnect() end end) end) Tool.Parent = LocalPlayer:WaitForChild("Backpack") end -- Создаем 9 инструментов для полной детализации робота CreateLimbTool("Робот: Тело", "Torso", Color3.fromRGB(255, 255, 255)) CreateLimbTool("Робот: Л. Плечо", "LeftArm", Color3.fromRGB(0, 150, 255)) CreateLimbTool("Робот: Л. Локоть", "LeftLowerArm", Color3.fromRGB(0, 100, 200)) CreateLimbTool("Робот: П. Плечо", "RightArm", Color3.fromRGB(0, 255, 150)) CreateLimbTool("Робот: П. Локоть", "RightLowerArm", Color3.fromRGB(0, 200, 100)) CreateLimbTool("Робот: Л. Бедро", "LeftLeg", Color3.fromRGB(255, 150, 0)) CreateLimbTool("Робот: Л. Колено", "LeftLowerLeg", Color3.fromRGB(200, 100, 0)) CreateLimbTool("Робот: П. Бедро", "RightLeg", Color3.fromRGB(255, 50, 250)) CreateLimbTool("Робот: П. Колено", "RightLowerLeg", Color3.fromRGB(200, 30, 200)) --- ========================================== --- --- ОСНОВНОЙ ЦИКЛ СИНХРОНИЗАЦИИ --- --- ========================================== --- RunService.Heartbeat:Connect(function() for keyName, data in pairs(AttachedObjects) do local obj = data.Part if obj and obj.Parent then local limb = GetCharacterLimb(data) if limb then -- Берём текущую позицию блока на земле, чтобы избежать левитации local _, _, _, r00, r01, r02, r10, r11, r12, r20, r21, r22 = limb.CFrame:components() local limbRotation = CFrame.new(0, 0, 0, r00, r01, r02, r10, r11, r12, r20, r21, r22) -- Применяем только вращение, позиция регулируется физикой Roblox obj.CFrame = CFrame.new(obj.Position) * limbRotation obj.AssemblyAngularVelocity = Vector3.new(0, 0, 0) else -- Автосброс при потере конечности AttachedObjects[keyName].Part = nil if StatusLabels[keyName] then StatusLabels[keyName].Text = keyName .. ": пусто" StatusLabels[keyName].TextColor3 = Color3.fromRGB(150, 150, 150) end end end end end) --- ========================================== --- --- СОЗДАНИЕ ИНТЕРФЕЙСА --- --- ========================================== --- local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "RobotAnatomyMirror_GUI" ScreenGui.ResetOnSpawn = false if gethui then ScreenGui.Parent = gethui() else ScreenGui.Parent = CoreGui end local MainPanel = Instance.new("Frame") MainPanel.Size = UDim2.new(0, 320, 0, 185) -- Увеличено под 9 строк мониторинга MainPanel.Position = UDim2.new(0.5, 0, 1, -240) MainPanel.AnchorPoint = Vector2.new(0.5, 0) MainPanel.BackgroundColor3 = Color3.fromRGB(25, 25, 25) MainPanel.BorderSizePixel = 2 MainPanel.Parent = ScreenGui local Corner = Instance.new("UICorner") Corner.CornerRadius = UDim.new(0, 8) Corner.Parent = MainPanel local function CreateStatusLabel(text, posY) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, -20, 0, 15) lbl.Position = UDim2.new(0, 10, 0, posY) lbl.Text = text lbl.TextColor3 = Color3.fromRGB(150, 150, 150) lbl.BackgroundTransparency = 1 lbl.Font = Enum.Font.SourceSansBold lbl.TextSize = 12 lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.Parent = MainPanel return lbl end StatusLabels["Torso"] = CreateStatusLabel("Корпус: пусто", 10) StatusLabels["LeftArm"] = CreateStatusLabel("Л. Плечо: пусто", 27) StatusLabels["LeftLowerArm"] = CreateStatusLabel("Л. Локоть: пусто", 44) StatusLabels["RightArm"] = CreateStatusLabel("П. Плечо: пусто", 61) StatusLabels["RightLowerArm"] = CreateStatusLabel("П. Локоть: пусто", 78) StatusLabels["LeftLeg"] = CreateStatusLabel("Л. Бедро: пусто", 95) StatusLabels["LeftLowerLeg"] = CreateStatusLabel("Л. Колено: пусто", 112) StatusLabels["RightLeg"] = CreateStatusLabel("П. Бедро: пусто", 129) StatusLabels["RightLowerLeg"] = CreateStatusLabel("П. Колено: пусто", 146) print("9-ти суставный физический аниматор запущен! Полная поддержка коленей и локтей.")