-- ============================================================================== -- SCRIPT MODO PC + TECLADO DE CHAT (COMPATIBLE CON DELTA) -- ============================================================================== local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local StarterGui = game:GetService("StarterGui") local VirtualInputManager = game:GetService("VirtualInputManager") local TextChatService = game:GetService("TextChatService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local LocalPlayer = Players.LocalPlayer local playerGui = LocalPlayer:WaitForChild("PlayerGui") -- Limpiar interfaz anterior si existe if playerGui:FindFirstChild("TotalPCMode_Ultimate") then playerGui.TotalPCMode_Ultimate:Destroy() end -- Ocultar controles táctiles originales de Roblox pcall(function() local touchGui = playerGui:FindFirstChild("TouchGui") if touchGui then touchGui.Enabled = false end end) playerGui.ChildAdded:Connect(function(child) if child.Name == "TouchGui" then child.Enabled = false end end) local function getHumanoid() local char = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait() return char:WaitForChild("Humanoid", 5) end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "TotalPCMode_Ultimate" ScreenGui.ResetOnSpawn = false ScreenGui.DisplayOrder = 999999 ScreenGui.Parent = playerGui local mainControlsFrame = Instance.new("Frame") mainControlsFrame.Name = "MainControlsFrame" mainControlsFrame.Size = UDim2.new(1, 0, 1, 0) mainControlsFrame.BackgroundTransparency = 1 mainControlsFrame.Parent = ScreenGui local function makeButton(name, text, size, pos, parent, color) local btn = Instance.new("TextButton") btn.Name = name btn.Text = text btn.Size = size btn.Position = pos btn.BackgroundColor3 = color or Color3.fromRGB(25, 25, 25) btn.BackgroundTransparency = 0.25 btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.TextSize = 13 btn.Font = Enum.Font.SourceSansBold btn.BorderSizePixel = 0 btn.AutoButtonColor = true local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 6) corner.Parent = btn local stroke = Instance.new("UIStroke") stroke.Thickness = 1 stroke.Color = Color3.fromRGB(150, 150, 150) stroke.Parent = btn btn.Parent = parent or mainControlsFrame return btn end local function simulateKey(keyCode) if VirtualInputManager then VirtualInputManager:SendKeyEvent(true, keyCode, false, game) task.delay(0.05, function() VirtualInputManager:SendKeyEvent(false, keyCode, false, game) end) end end -------------------------------------------------------------------------------- -- CÁMARA Y DISPARO TÁCTIL -------------------------------------------------------------------------------- local camZone = Instance.new("TextButton") camZone.Name = "MouseTouchpad" camZone.Text = "" camZone.Size = UDim2.new(0.65, 0, 0.75, 0) camZone.Position = UDim2.new(0.35, 0, 0.05, 0) camZone.BackgroundTransparency = 1 camZone.Parent = mainControlsFrame local draggingCam = false local lastPos = Vector2.new(0, 0) local sensitivity = 0.007 camZone.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then draggingCam = true lastPos = Vector2.new(input.Position.X, input.Position.Y) end end) camZone.InputChanged:Connect(function(input) if draggingCam and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then local currentPos = Vector2.new(input.Position.X, input.Position.Y) local delta = currentPos - lastPos lastPos = currentPos local cam = workspace.CurrentCamera if cam then local xAngle = -delta.X * sensitivity local yAngle = -delta.Y * sensitivity local currentCFrame = cam.CFrame local newCFrame = CFrame.Angles(0, xAngle, 0) * currentCFrame * CFrame.Angles(yAngle, 0, 0) cam.CFrame = CFrame.new(currentCFrame.Position, currentCFrame.Position + newCFrame.LookVector) end end end) camZone.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then draggingCam = false end end) -------------------------------------------------------------------------------- -- D-PAD DE MOVIMIENTO (WASD) -------------------------------------------------------------------------------- local keysPressed = { W = false, A = false, S = false, D = false } local keyMap = { W = Enum.KeyCode.W, A = Enum.KeyCode.A, S = Enum.KeyCode.S, D = Enum.KeyCode.D } local dpadFrame = Instance.new("Frame") dpadFrame.Size = UDim2.new(0, 160, 0, 160) dpadFrame.Position = UDim2.new(0.03, 0, 0.55, 0) dpadFrame.BackgroundTransparency = 1 dpadFrame.Parent = mainControlsFrame local btnW = makeButton("Key_W", "W", UDim2.new(0, 48, 0, 48), UDim2.new(0, 56, 0, 0), dpadFrame) local btnA = makeButton("Key_A", "A", UDim2.new(0, 48, 0, 48), UDim2.new(0, 4, 0, 52), dpadFrame) local btnS = makeButton("Key_S", "S", UDim2.new(0, 48, 0, 48), UDim2.new(0, 56, 0, 104), dpadFrame) local btnD = makeButton("Key_D", "D", UDim2.new(0, 48, 0, 48), UDim2.new(0, 108, 0, 52), dpadFrame) local function setupKeyEvents(btn, keyName) local keyCode = keyMap[keyName] btn.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then keysPressed[keyName] = true btn.BackgroundTransparency = 0.0 if VirtualInputManager and keyCode then VirtualInputManager:SendKeyEvent(true, keyCode, false, game) end end end) btn.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then keysPressed[keyName] = false btn.BackgroundTransparency = 0.25 if VirtualInputManager and keyCode then VirtualInputManager:SendKeyEvent(false, keyCode, false, game) end end end) end setupKeyEvents(btnW, "W") setupKeyEvents(btnA, "A") setupKeyEvents(btnS, "S") setupKeyEvents(btnD, "D") RunService.RenderStepped:Connect(function() local hum = getHumanoid() if not hum or not hum.Parent or not hum.Parent:FindFirstChild("HumanoidRootPart") then return end local moveVector = Vector3.new(0, 0, 0) if keysPressed.W then moveVector = moveVector + Vector3.new(0, 0, -1) end if keysPressed.S then moveVector = moveVector + Vector3.new(0, 0, 1) end if keysPressed.A then moveVector = moveVector + Vector3.new(-1, 0, 0) end if keysPressed.D then moveVector = moveVector + Vector3.new(1, 0, 0) end local camera = workspace.CurrentCamera if camera and moveVector.Magnitude > 0 then moveVector = moveVector.Unit local camCFrame = camera.CFrame local forward = Vector3.new(camCFrame.LookVector.X, 0, camCFrame.LookVector.Z).Unit local right = Vector3.new(camCFrame.RightVector.X, 0, camCFrame.RightVector.Z).Unit local worldDirection = (forward * -moveVector.Z) + (right * moveVector.X) hum:Move(worldDirection, false) else hum:Move(Vector3.new(0, 0, 0), false) end end) -------------------------------------------------------------------------------- -- TECLADO VIRTUAL DE CHAT FLOTANTE -------------------------------------------------------------------------------- local chatKeyboardFrame = Instance.new("Frame") chatKeyboardFrame.Name = "CustomChatKeyboard" chatKeyboardFrame.Size = UDim2.new(0.6, 0, 0.42, 0) chatKeyboardFrame.Position = UDim2.new(0.2, 0, 0.55, 0) chatKeyboardFrame.BackgroundColor3 = Color3.fromRGB(15, 15, 20) chatKeyboardFrame.BackgroundTransparency = 0.1 chatKeyboardFrame.Visible = false chatKeyboardFrame.Parent = ScreenGui local kbCorner = Instance.new("UICorner") kbCorner.CornerRadius = UDim.new(0, 10) kbCorner.Parent = chatKeyboardFrame local inputDisplay = Instance.new("TextLabel") inputDisplay.Size = UDim2.new(0.8, 0, 0.18, 0) inputDisplay.Position = UDim2.new(0.02, 0, 0.04, 0) inputDisplay.BackgroundColor3 = Color3.fromRGB(30, 30, 35) inputDisplay.TextColor3 = Color3.fromRGB(255, 255, 255) inputDisplay.TextSize = 14 inputDisplay.Font = Enum.Font.SourceSans inputDisplay.Text = "" inputDisplay.TextXAlignment = Enum.TextXAlignment.Left inputDisplay.Parent = chatKeyboardFrame local closeKbBtn = makeButton("CloseKB", "❌", UDim2.new(0.15, 0, 0.18, 0), UDim2.new(0.83, 0, 0.04, 0), chatKeyboardFrame, Color3.fromRGB(150, 40, 40)) local keysLayout = { {"Q","W","E","R","T","Y","U","I","O","P"}, {"A","S","D","F","G","H","J","K","L"}, {"Z","X","C","V","B","N","M","←"} } local currentMessage = "" local function updateChatDisplay() inputDisplay.Text = " " .. currentMessage .. "_" end local function sendChatMessage(msg) if msg == "" or string.gsub(msg, " ", "") == "" then return end pcall(function() if TextChatService.ChatVersion == Enum.ChatVersion.TextChatService then local generalChannel = TextChatService.TextChannels:FindFirstChild("RBXGeneral") if generalChannel then generalChannel:SendAsync(msg) end else ReplicatedStorage.DefaultChatSystemChatEvents.SayMessageRequest:FireServer(msg, "All") end end) end local keyContainer = Instance.new("Frame") keyContainer.Size = UDim2.new(0.96, 0, 0.72, 0) keyContainer.Position = UDim2.new(0.02, 0, 0.25, 0) keyContainer.BackgroundTransparency = 1 keyContainer.Parent = chatKeyboardFrame for rIndex, row in ipairs(keysLayout) do local rowFrame = Instance.new("Frame") rowFrame.Size = UDim2.new(1, 0, 0.23, 0) rowFrame.Position = UDim2.new(0, 0, (rIndex - 1) * 0.25, 0) rowFrame.BackgroundTransparency = 1 rowFrame.Parent = keyContainer local keyWidth = 1 / #row for kIndex, char in ipairs(row) do local btn = makeButton("K_"..char, char, UDim2.new(keyWidth - 0.01, 0, 0.9, 0), UDim2.new((kIndex - 1) * keyWidth, 0, 0, 0), rowFrame, Color3.fromRGB(45, 45, 55)) btn.MouseButton1Click:Connect(function() if char == "←" then currentMessage = string.sub(currentMessage, 1, #currentMessage - 1) else currentMessage = currentMessage .. string.lower(char) end updateChatDisplay() end) end end local spaceBtn = makeButton("K_Space", "ESPACIO", UDim2.new(0.4, 0, 0.2, 0), UDim2.new(0.1, 0, 0.78, 0), keyContainer, Color3.fromRGB(55, 55, 65)) spaceBtn.MouseButton1Click:Connect(function() currentMessage = currentMessage .. " " updateChatDisplay() end) local sendBtn = makeButton("K_Send", "ENVIAR ↵", UDim2.new(0.38, 0, 0.2, 0), UDim2.new(0.52, 0, 0.78, 0), keyContainer, Color3.fromRGB(30, 120, 50)) sendBtn.MouseButton1Click:Connect(function() sendChatMessage(currentMessage) currentMessage = "" updateChatDisplay() chatKeyboardFrame.Visible = false end) closeKbBtn.MouseButton1Click:Connect(function() chatKeyboardFrame.Visible = false end) -------------------------------------------------------------------------------- -- BARRA SUPERIOR (1-9, CHAT, ESC, INVENTARIO) -------------------------------------------------------------------------------- local topBarFrame = Instance.new("Frame") topBarFrame.Size = UDim2.new(0.95, 0, 0, 35) topBarFrame.Position = UDim2.new(0.025, 0, 0.01, 0) topBarFrame.BackgroundTransparency = 1 topBarFrame.Parent = mainControlsFrame local keyCodesNum = { Enum.KeyCode.One, Enum.KeyCode.Two, Enum.KeyCode.Three, Enum.KeyCode.Four, Enum.KeyCode.Five, Enum.KeyCode.Six, Enum.KeyCode.Seven, Enum.KeyCode.Eight, Enum.KeyCode.Nine } for i = 1, 9 do local btnNum = makeButton("Key_"..i, tostring(i), UDim2.new(0, 28, 0, 30), UDim2.new(0, (i - 1) * 30, 0, 0), topBarFrame) btnNum.MouseButton1Click:Connect(function() simulateKey(keyCodesNum[i]) local char = LocalPlayer.Character local hum = getHumanoid() if not char or not hum then return end local tools = {} for _, item in ipairs(LocalPlayer.Backpack:GetChildren()) do if item:IsA("Tool") then table.insert(tools, item) end end for _, item in ipairs(char:GetChildren()) do if item:IsA("Tool") then table.insert(tools, item) end end local targetTool = tools[i] if targetTool then local currentTool = char:FindFirstChildOfClass("Tool") if currentTool == targetTool then hum:UnequipTools() else hum:EquipTool(targetTool) end end end) end local btnChat = makeButton("Btn_Chat", "💬", UDim2.new(0, 35, 0, 30), UDim2.new(0, 275, 0, 0), topBarFrame, Color3.fromRGB(40, 40, 100)) btnChat.MouseButton1Click:Connect(function() chatKeyboardFrame.Visible = not chatKeyboardFrame.Visible if chatKeyboardFrame.Visible then currentMessage = "" updateChatDisplay() end end) local btnEsc = makeButton("Btn_Esc", "⚙️", UDim2.new(0, 35, 0, 30), UDim2.new(0, 315, 0, 0), topBarFrame, Color3.fromRGB(80, 80, 80)) btnEsc.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.Escape) end) local btnInv = makeButton("Btn_Inv", "🎒", UDim2.new(0, 35, 0, 30), UDim2.new(0, 355, 0, 0), topBarFrame, Color3.fromRGB(100, 60, 40)) btnInv.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.Backquote) pcall(function() local backpackEnabled = StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType.Backpack) StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, not backpackEnabled) end) end) -------------------------------------------------------------------------------- -- BOTONES DE ACCIÓN (CLICS, R, Q, TAB, SALTAR, CORRER, CTRL) -------------------------------------------------------------------------------- local actionFrame = Instance.new("Frame") actionFrame.Name = "ActionFrame" actionFrame.Size = UDim2.new(0, 220, 0, 180) actionFrame.Position = UDim2.new(0.72, 0, 0.58, 0) actionFrame.BackgroundTransparency = 1 actionFrame.Parent = mainControlsFrame local btnLClick = makeButton("Btn_LClick", "CLIC IZQ", UDim2.new(0, 65, 0, 38), UDim2.new(0, 0, 0, 0), actionFrame, Color3.fromRGB(20, 80, 20)) btnLClick.MouseButton1Click:Connect(function() if VirtualInputManager then VirtualInputManager:SendMouseButtonEvent(0, 0, 0, true, game, 0) task.delay(0.05, function() VirtualInputManager:SendMouseButtonEvent(0, 0, 0, false, game, 0) end) end local char = LocalPlayer.Character if char then local tool = char:FindFirstChildOfClass("Tool") if tool then tool:Activate() end end end) local btnRClick = makeButton("Btn_RClick", "CLIC DER", UDim2.new(0, 65, 0, 38), UDim2.new(0, 70, 0, 0), actionFrame, Color3.fromRGB(80, 20, 20)) btnRClick.MouseButton1Click:Connect(function() if VirtualInputManager then VirtualInputManager:SendMouseButtonEvent(0, 0, 1, true, game, 0) task.delay(0.05, function() VirtualInputManager:SendMouseButtonEvent(0, 0, 1, false, game, 0) end) end end) local btnE = makeButton("Btn_E", "E", UDim2.new(0, 65, 0, 38), UDim2.new(0, 140, 0, 0), actionFrame, Color3.fromRGB(40, 40, 90)) btnE.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.E) end) local btnR = makeButton("Btn_R", "R", UDim2.new(0, 65, 0, 38), UDim2.new(0, 0, 0, 42), actionFrame, Color3.fromRGB(70, 50, 20)) btnR.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.R) end) local btnQ = makeButton("Btn_Q", "Q", UDim2.new(0, 65, 0, 38), UDim2.new(0, 70, 0, 42), actionFrame, Color3.fromRGB(20, 60, 70)) btnQ.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.Q) end) local btnTab = makeButton("Btn_Tab", "TAB", UDim2.new(0, 65, 0, 38), UDim2.new(0, 140, 0, 42), actionFrame, Color3.fromRGB(50, 30, 70)) btnTab.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.Tab) end) local btnSpace = makeButton("Btn_Space", "SALTAR", UDim2.new(0, 65, 0, 38), UDim2.new(0, 0, 0, 84), actionFrame, Color3.fromRGB(50, 50, 50)) btnSpace.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.Space) local hum = getHumanoid() if hum then hum.Jump = true end end) local isRunning = false local btnShift = makeButton("Btn_Shift", "CORRER", UDim2.new(0, 65, 0, 38), UDim2.new(0, 70, 0, 84), actionFrame, Color3.fromRGB(60, 60, 20)) btnShift.MouseButton1Click:Connect(function() isRunning = not isRunning btnShift.BackgroundTransparency = isRunning and 0.0 or 0.25 local hum = getHumanoid() if hum then hum.WalkSpeed = isRunning and 24 or 16 end end) local btnCtrl = makeButton("Btn_Ctrl", "CTRL", UDim2.new(0, 65, 0, 38), UDim2.new(0, 140, 0, 84), actionFrame, Color3.fromRGB(40, 40, 40)) btnCtrl.MouseButton1Click:Connect(function() simulateKey(Enum.KeyCode.LeftControl) end)