local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local TextService = game:GetService("TextService") local player = Players.LocalPlayer local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") -- Таблицы переводов local translations = { Russian = { title = "Выбор языка", r15 = "R15", r6 = "R6", start = "Начать запись", stop = "Остановить", play = "Воспроизвести", play_reverse = "Воспр. назад", speed = "Скорость: ", recording = "Запись: ", select_avatar = "Выберите тип аватара", hide = "Скрыть", show = "Показать", enter_speed = "Введите скорость", confirm = "OK", show_gui = "Вернуть GUI", scroll = "Листайте ↓" }, English = { title = "Language Selection", r15 = "R15", r6 = "R6", start = "Start Recording", stop = "Stop", play = "Play", play_reverse = "Play Reverse", speed = "Speed: ", recording = "Recording: ", select_avatar = "Select Avatar Type", hide = "Hide", show = "Show", enter_speed = "Enter speed", confirm = "OK", show_gui = "Show GUI", scroll = "Scroll ↓" }, Thai = { title = "เลือกภาษา", r15 = "R15", r6 = "R6", start = "เริ่มบันทึก", stop = "หยุด", play = "เล่น", play_reverse = "เล่นย้อนกลับ", speed = "ความเร็ว: ", recording = "กำลังบันทึก: ", select_avatar = "เลือกประเภทอวาตาร์", hide = "ซ่อน", show = "แสดง", enter_speed = "ใส่ความเร็ว", confirm = "ตกลง", show_gui = "แสดง GUI", scroll = "เลื่อน ↓" }, Arabic = { title = "اختيار اللغة", r15 = "R15", r6 = "R6", start = "بدء التسجيل", stop = "إيقاف", play = "تشغيل", play_reverse = "تشغيل عكسي", speed = "السرعة: ", recording = "التسجيل: ", select_avatar = "اختر نوع الصورة الرمزية", hide = "إخفاء", show = "إظهار", enter_speed = "أدخل السرعة", confirm = "موافق", show_gui = "إظهار GUI", scroll = "انتقل لأسفل ↓" }, French = { title = "Sélection de la langue", r15 = "R15", r6 = "R6", start = "Commencer l'enregistrement", stop = "Arrêter", play = "Lire", play_reverse = "Lire à l'envers", speed = "Vitesse: ", recording = "Enregistrement: ", select_avatar = "Sélectionner le type d'avatar", hide = "Masquer", show = "Afficher", enter_speed = "Entrez la vitesse", confirm = "OK", show_gui = "Afficher GUI", scroll = "Défiler ↓" }, Spanish = { title = "Selección de idioma", r15 = "R15", r6 = "R6", start = "Comenzar grabación", stop = "Detener", play = "Reproducir", play_reverse = "Reproducir reverso", speed = "Velocidad: ", recording = "Grabando: ", select_avatar = "Seleccionar tipo de avatar", hide = "Ocultar", show = "Mostrar", enter_speed = "Ingrese velocidad", confirm = "OK", show_gui = "Mostrar GUI", scroll = "Desplazar ↓" }, German = { title = "Sprachauswahl", r15 = "R15", r6 = "R6", start = "Aufnahme starten", stop = "Stopp", play = "Abspielen", play_reverse = "Rückwärts abspielen", speed = "Geschwindigkeit: ", recording = "Aufnahme: ", select_avatar = "Avatar-Typ auswählen", hide = "Ausblenden", show = "Einblenden", enter_speed = "Geschwindigkeit eingeben", confirm = "OK", show_gui = "GUI anzeigen", scroll = "Scrollen ↓" } } -- Переменные local currentLanguage = "English" local selectedAvatar = "R15" local isRecording = false local isPlaying = false local isReversePlaying = false local recordingStartTime = 0 local recordedActions = {} local recordingConnection = nil local playConnection = nil local currentSpeed = 1.0 -- Создание интерфейса local screenGui = Instance.new("ScreenGui") screenGui.Name = "RecorderGUI" screenGui.Parent = player.PlayerGui -- Функция для форматирования времени local function formatTime(seconds) local minutes = math.floor(seconds / 60) local secs = math.floor(seconds % 60) return string.format("%02d:%02d", minutes, secs) end -- Функция создания кнопки local function createButton(name, text, position, size) local button = Instance.new("TextButton") button.Name = name button.Text = text button.Size = UDim2.new(0, size.X, 0, size.Y) button.Position = UDim2.new(0, position.X, 0, position.Y) button.BackgroundColor3 = Color3.fromRGB(60, 60, 60) button.TextColor3 = Color3.fromRGB(255, 255, 255) button.Font = Enum.Font.SourceSans button.TextSize = 14 button.BorderSizePixel = 0 button.ZIndex = 10 button.AutoButtonColor = true return button end -- Функция создания текстовой метки local function createLabel(name, text, position) local label = Instance.new("TextLabel") label.Name = name label.Text = text label.Size = UDim2.new(0, 200, 0, 30) label.Position = UDim2.new(0, position.X, 0, position.Y) label.BackgroundTransparency = 1 label.TextColor3 = Color3.fromRGB(255, 255, 255) label.Font = Enum.Font.SourceSans label.TextSize = 16 label.ZIndex = 10 return label end -- Функция создания текстового поля local function createTextBox(name, text, position, size) local textBox = Instance.new("TextBox") textBox.Name = name textBox.Text = text textBox.Size = UDim2.new(0, size.X, 0, size.Y) textBox.Position = UDim2.new(0, position.X, 0, position.Y) textBox.BackgroundColor3 = Color3.fromRGB(40, 40, 40) textBox.TextColor3 = Color3.fromRGB(255, 255, 255) textBox.Font = Enum.Font.SourceSans textBox.TextSize = 14 textBox.BorderSizePixel = 0 textBox.ZIndex = 10 return textBox end -- Кнопка возврата GUI (изначально скрыта) local showGUIButton = createButton("ShowGUIButton", translations[currentLanguage].show_gui, Vector2.new(10, 10), Vector2.new(120, 40)) showGUIButton.BackgroundColor3 = Color3.fromRGB(30, 144, 255) showGUIButton.Visible = false showGUIButton.ZIndex = 100 showGUIButton.Parent = screenGui -- Создание языкового меню с прокруткой local languageFrame = Instance.new("Frame") languageFrame.Size = UDim2.new(0, 350, 0, 400) languageFrame.Position = UDim2.new(0.5, -175, 0.5, -200) languageFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40) languageFrame.BorderSizePixel = 0 languageFrame.ZIndex = 5 languageFrame.Parent = screenGui -- Контейнер для прокрутки local scrollingFrame = Instance.new("ScrollingFrame") scrollingFrame.Size = UDim2.new(1, -20, 1, -80) scrollingFrame.Position = UDim2.new(0, 10, 0, 60) scrollingFrame.BackgroundTransparency = 1 scrollingFrame.BorderSizePixel = 0 scrollingFrame.ScrollBarThickness = 8 scrollingFrame.CanvasSize = UDim2.new(0, 0, 0, 0) scrollingFrame.ZIndex = 6 scrollingFrame.Parent = languageFrame local titleLabel = createLabel("Title", "Select Language", Vector2.new(75, 15)) titleLabel.Size = UDim2.new(0, 200, 0, 40) titleLabel.TextSize = 20 titleLabel.Parent = languageFrame local scrollHint = createLabel("ScrollHint", translations[currentLanguage].scroll, Vector2.new(75, 365)) scrollHint.Size = UDim2.new(0, 200, 0, 30) scrollHint.TextSize = 14 scrollHint.TextColor3 = Color3.fromRGB(200, 200, 200) scrollHint.Parent = languageFrame local languages = {"Russian", "English", "Thai", "Arabic", "French", "Spanish", "German", "Chinese", "Japanese", "Korean", "Portuguese", "Italian", "Dutch", "Turkish", "Hindi"} local yOffset = 10 for _, lang in pairs(languages) do local button = createButton(lang, lang, Vector2.new(25, yOffset), Vector2.new(280, 50)) button.TextSize = 16 button.Parent = scrollingFrame yOffset += 60 end -- Обновляем размер canvas для прокрутки scrollingFrame.CanvasSize = UDim2.new(0, 0, 0, #languages * 60) -- Обработчики для кнопок языка for _, button in ipairs(scrollingFrame:GetChildren()) do if button:IsA("TextButton") then button.MouseButton1Click:Connect(function() currentLanguage = button.Name titleLabel.Text = translations[currentLanguage].title scrollHint.Text = translations[currentLanguage].scroll languageFrame.Visible = false showAvatarSelection() end) end end -- Функция показа выбора аватара function showAvatarSelection() local avatarFrame = Instance.new("Frame") avatarFrame.Size = UDim2.new(0, 350, 0, 250) avatarFrame.Position = UDim2.new(0.5, -175, 0.5, -125) avatarFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40) avatarFrame.BorderSizePixel = 0 avatarFrame.ZIndex = 5 avatarFrame.Parent = screenGui local title = createLabel("AvatarTitle", translations[currentLanguage].select_avatar, Vector2.new(75, 20)) title.Size = UDim2.new(0, 200, 0, 40) title.TextSize = 18 title.Parent = avatarFrame local r15Button = createButton("R15Button", translations[currentLanguage].r15, Vector2.new(75, 70), Vector2.new(200, 60)) r15Button.TextSize = 16 r15Button.Parent = avatarFrame local r6Button = createButton("R6Button", translations[currentLanguage].r6, Vector2.new(75, 150), Vector2.new(200, 60)) r6Button.TextSize = 16 r6Button.Parent = avatarFrame r15Button.MouseButton1Click:Connect(function() selectedAvatar = "R15" avatarFrame:Destroy() createMainUI() end) r6Button.MouseButton1Click:Connect(function() selectedAvatar = "R6" avatarFrame:Destroy() createMainUI() end) end -- Функция остановки записи local function stopRecording() isRecording = false if recordingConnection then recordingConnection:Disconnect() recordingConnection = nil end end -- Функция остановки воспроизведения local function stopPlayback() isPlaying = false isReversePlaying = false if playConnection then playConnection:Disconnect() playConnection = nil end end -- Создание основного интерфейса function createMainUI() local mainFrame = Instance.new("Frame") mainFrame.Name = "MainFrame" mainFrame.Size = UDim2.new(1, 0, 0, 70) mainFrame.Position = UDim2.new(0, 0, 1, -70) mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) mainFrame.BorderSizePixel = 0 mainFrame.ZIndex = 5 mainFrame.Parent = screenGui -- Кнопка записи local recordButton = createButton("RecordButton", translations[currentLanguage].start, Vector2.new(20, 15), Vector2.new(100, 40)) recordButton.TextSize = 16 recordButton.Parent = mainFrame -- Кнопка воспроизведения вперед local playButton = createButton("PlayButton", translations[currentLanguage].play, Vector2.new(130, 15), Vector2.new(100, 40)) playButton.TextSize = 16 playButton.Parent = mainFrame -- Кнопка воспроизведения назад local reversePlayButton = createButton("ReversePlayButton", translations[currentLanguage].play_reverse, Vector2.new(240, 15), Vector2.new(100, 40)) reversePlayButton.TextSize = 14 reversePlayButton.Parent = mainFrame -- Кнопка скрытия GUI local hideButton = createButton("HideButton", translations[currentLanguage].hide, Vector2.new(350, 15), Vector2.new(100, 40)) hideButton.TextSize = 16 hideButton.Parent = mainFrame -- Кнопка изменения скорости local speedButton = createButton("SpeedButton", "⚙️ Speed", Vector2.new(460, 15), Vector2.new(100, 40)) speedButton.TextSize = 16 speedButton.Parent = mainFrame -- Таймер записи local timerLabel = createLabel("TimerLabel", translations[currentLanguage].recording .. "00:00/06:00", Vector2.new(20, 60)) timerLabel.Size = UDim2.new(0, 200, 0, 20) timerLabel.TextSize = 14 timerLabel.Parent = mainFrame -- Метка скорости local speedLabel = createLabel("SpeedLabel", translations[currentLanguage].speed .. "1.0x", Vector2.new(230, 60)) speedLabel.Size = UDim2.new(0, 120, 0, 20) speedLabel.TextSize = 14 speedLabel.Parent = mainFrame -- Окно ввода скорости local speedInputFrame = Instance.new("Frame") speedInputFrame.Size = UDim2.new(0, 250, 0, 120) speedInputFrame.Position = UDim2.new(0.5, -125, 0.5, -60) speedInputFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40) speedInputFrame.BorderSizePixel = 0 speedInputFrame.ZIndex = 20 speedInputFrame.Visible = false speedInputFrame.Parent = screenGui local speedInputLabel = createLabel("SpeedInputLabel", translations[currentLanguage].enter_speed, Vector2.new(25, 10)) speedInputLabel.Size = UDim2.new(0, 200, 0, 30) speedInputLabel.TextSize = 16 speedInputLabel.Parent = speedInputFrame local speedTextBox = createTextBox("SpeedTextBox", "1.0", Vector2.new(25, 50), Vector2.new(200, 30)) speedTextBox.Parent = speedInputFrame local confirmButton = createButton("ConfirmButton", translations[currentLanguage].confirm, Vector2.new(25, 90), Vector2.new(200, 40)) confirmButton.TextSize = 16 confirmButton.Parent = speedInputFrame -- Функция обновления скорости local function updateSpeed(speed) currentSpeed = math.clamp(tonumber(speed) or 1.0, 0.1, 10.0) speedLabel.Text = translations[currentLanguage].speed .. string.format("%.1fx", currentSpeed) speedInputFrame.Visible = false end -- Обработчики событий для окна скорости speedButton.MouseButton1Click:Connect(function() speedInputFrame.Visible = not speedInputFrame.Visible if speedInputFrame.Visible then speedTextBox.Text = tostring(currentSpeed) end end) confirmButton.MouseButton1Click:Connect(function() updateSpeed(speedTextBox.Text) end) speedTextBox.FocusLost:Connect(function(enterPressed) if enterPressed then updateSpeed(speedTextBox.Text) end end) -- Обработчик скрытия GUI local isGUIVisible = true hideButton.MouseButton1Click:Connect(function() isGUIVisible = not isGUIVisible mainFrame.Visible = isGUIVisible hideButton.Text = isGUIVisible and translations[currentLanguage].hide or translations[currentLanguage].show showGUIButton.Visible = not isGUIVisible showGUIButton.Text = translations[currentLanguage].show_gui end) -- Обработчик кнопки возврата GUI showGUIButton.MouseButton1Click:Connect(function() mainFrame.Visible = true showGUIButton.Visible = false hideButton.Text = translations[currentLanguage].hide isGUIVisible = true end) -- Функции записи recordButton.MouseButton1Click:Connect(function() if not isRecording then -- Начать запись isRecording = true recordedActions = {} recordingStartTime = tick() recordButton.Text = translations[currentLanguage].stop playButton.Visible = false reversePlayButton.Visible = false -- Запись движений recordingConnection = RunService.Heartbeat:Connect(function() if isRecording then local currentTime = tick() - recordingStartTime if currentTime >= 360 then -- 6 минут stopRecording() recordButton.Text = translations[currentLanguage].start playButton.Visible = true reversePlayButton.Visible = true return end -- Запись позиции и вращения local action = { time = currentTime, position = character:GetPivot().Position, rotation = character:GetPivot().Rotation } table.insert(recordedActions, action) timerLabel.Text = translations[currentLanguage].recording .. formatTime(currentTime) .. "/06:00" end end) else -- Остановить запись stopRecording() recordButton.Text = translations[currentLanguage].start playButton.Visible = true reversePlayButton.Visible = true end end) -- Функция воспроизведения вперед playButton.MouseButton1Click:Connect(function() if isPlaying or isReversePlaying then -- Остановить воспроизведение stopPlayback() playButton.Text = translations[currentLanguage].play reversePlayButton.Text = translations[currentLanguage].play_reverse recordButton.Visible = true elseif not isPlaying and #recordedActions > 0 then -- Начать воспроизведение вперед isPlaying = true recordButton.Visible = false playButton.Text = "⏹️" local startTime = tick() local currentIndex = 1 playConnection = RunService.Heartbeat:Connect(function() if isPlaying then local elapsed = (tick() - startTime) * currentSpeed while currentIndex <= #recordedActions and recordedActions[currentIndex].time <= elapsed do local action = recordedActions[currentIndex] character:PivotTo(CFrame.new(action.position) * action.rotation) currentIndex += 1 end if currentIndex > #recordedActions then stopPlayback() playButton.Text = translations[currentLanguage].play recordButton.Visible = true end else stopPlayback() end end) end end) -- Функция воспроизведения назад (обратная перемотка) reversePlayButton.MouseButton1Click:Connect(function() if isPlaying or isReversePlaying then -- Остановить воспроизведение stopPlayback() playButton.Text = translations[currentLanguage].play reversePlayButton.Text = translations[currentLanguage].play_reverse recordButton.Visible = true elseif not isReversePlaying and #recordedActions > 0 then -- Начать воспроизведение назад isReversePlaying = true recordButton.Visible = false reversePlayButton.Text = "⏹️" local startTime = tick() local currentIndex = #recordedActions local totalDuration = recordedActions[#recordedActions].time playConnection = RunService.Heartbeat:Connect(function() if isReversePlaying then local elapsed = (tick() - startTime) * currentSpeed local reverseTime = math.max(0, totalDuration - elapsed) -- Находим соответствующий кадр для обратного воспроизведения local targetIndex = 1 for i = #recordedActions, 1, -1 do if recordedActions[i].time <= reverseTime then targetIndex = i break end end -- Применяем позицию и вращение if targetIndex >= 1 and targetIndex <= #recordedActions then local action = recordedActions[targetIndex] character:PivotTo(CFrame.new(action.position) * action.rotation) end if elapsed >= totalDuration then stopPlayback() reversePlayButton.Text = translations[currentLanguage].play_reverse recordButton.Visible = true end else stopPlayback() end end) end end) end