Как я делал консоль из ПК
Всем привет, хотел рассказать о своём опыте настройки компьютера для использования его как консоли. Уже предвещаю, что будет множество комментариев, по типу зачем так заморачиваться лучше консоль купить всё и т.д., и т.п. или и так удобно. Поэтому кратко хочу пояснить, что хотелось создать единую платформу Телевизор + ПК с возможностью просмотров фильмом, сериалов, телеканалов т.п., а также с возможностью поиграть (HTPC + Консоль). Возможность купить приставку отсутствует, и даже если накоплю, то на приобретение игр на дисках для консолей средств уже не будет (да особо и не хотелось никогда). Когда собрал компьютер из того что было (докупил только блок питания и корпус), купил к нему пульт-аэромышь с полной qwerty клавиатурой и геймпад, и обнаружил что для запуска игры, используется слишком много действий пультом, что не очень удобно, масло в огонь подкидывали друзья, у которых поголовно консоли PS5, с нарративом о том, что они купили и не парились, из-за этого поставил цель сделать так, чтобы опыт пользования компьютером с геймпадом был ничуть не хуже чем на консоли, т.е. полное управление с геймпада когда дело заходит про игры.
Первая попытка: настройка через steam, а именно попытался использовать полноэкранный режим Steam Big Picture. по началу было удобно: можно добавлять сторонние игры, пиратки, вызов самого steam осуществлялся с помощью кнопки Guide.
В общем выглядело это приблизительно так (из особенностей добавил возможность запуска/отключения VPN прямо со Steam):
Всё было хорошо пока не вышла Diablo IV, как бы я не старался настроить запуск со Steam, всё равно нужно было брать в руки пульт и нажимать кнопку "играть" в BattleNet. А цель повторюсь после взятия в руки Геймпада, управление только через него. Начав искать решение этой проблемы наткнулся на пост Пикабушника Делаем консоль из ПК и благодаря ему настроил Playnite.
У меня вышло вот так:
С playnite я столкнулся впервые, и был крайне удивлен возможностями, особенно запуск игр в BattleNet без участия человека (как раз то что мне и нужно было), но и проблем тоже хватало, Хочу рассказать обо всех. Разобью проблемы по пунктам, которые @Awakeep в своём посте не описывал. PlayNite настраивал на Windows 11.
Все скрипты в Playnite написаны на языке для PowerShell.
1. Запуск Лаунчера playnite с кнопки "Guide" как Steam.
Для начала я отключил эту функции в Steam,
встал вопрос как запускать Playnite, почитав реддит, нашел решения такое (это костыль, может многие лучше решение знают): настроил программу joytokey (https://joytokey.net/en/download), кнопка Guide числиться в ней как Button 13. по нажатию на эту кнопку запускаем Playnite.
Добавил joytokey в автозагрузку, запускался сразу в свернутом виде в трее.
После запуска Playnite, чтобы избежать повторного включения лаунчера (при нажатии на кнопку Guide), добавил скрипт в Playnite, который просто отключает joytokey после запуска лаунчера, а по выходу из лаунчера включает обратно.
2. Запуск игр с VPN,
у меня на компьютере в качестве VPN настроен клиент wireguard (считаю его самым быстрым).
для его запуска только с определенной игрой написал следующие скрипты:
$value = '109.110.***.***'
$ip=(Invoke-WebRequest -uri "http://ident.me").Content
if ( $value -eq $ip )
{
& 'C:\Program Files\WireGuard\wireguard.exe '/installtunnelservice C:\wg\VPN.conf''
$ip='0.0.0.0'
}
else
{
}
_____________________________________________________________________________________
$value = '193.42.***.***'
$ip=(Invoke-WebRequest -uri "http://ident.me").Content
if ( $value -eq $ip )
{
& 'C:\Program Files\WireGuard\wireguard.exe '/uninstalltunnelservice VPN'',
}
else {
}
где vpn.conf - это путь к конфигу vpn соединения, а отключается уже туннель(соединение) через название, которое берём отсюда.
У меня дома установлен белый IP (статический) у VPN со статическим IP, при использовании скрипта не забудьте ввести свои данные.
Уверен, что для других VPN (openVPN, PPTP, L2TP и т.д.) клиентов можно использовать что-то подобное. Так же в скрипте прописана проверка включен ли VPN или нет, для предотвращения ошибок.
3. Проблема с отображением на полный экран.
Столкнулся с проблемой, возможно она актуальна только на windows 11, воспроизводится она так:
При нажатии на панель задач левой кнопкой мыши, и последующим запуском Playnite с помощью геймпада, запускался лаунчер, а внизу оставалась панель задач, т.е. лаунчер был как бы не на весь экран.
Решалась проблема так, необходимо было нажать в любую точку на рабочем столе а после уже запускать Playnite. чтобы не думать о том нажал ли я на рабочий стол, решил это автоматизировать, добавил к скрипту отключения joytokey, следующий код:
function Set-WindowStyle {
param(
[Parameter()]
[ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE',
'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED',
'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')]
$Style = 'SHOW',
[Parameter()]
$MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle
)
$WindowStates = @{
FORCEMINIMIZE = 11; HIDE = 0
MAXIMIZE = 3; MINIMIZE = 6
RESTORE = 9; SHOW = 5
SHOWDEFAULT = 10; SHOWMAXIMIZED = 3
SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7
SHOWNA = 8; SHOWNOACTIVATE = 4
SHOWNORMAL = 1
}
Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style]))
$Win32ShowWindowAsync = Add-Type –memberDefinition @”
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru
$Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null
}
try
{
(Get-Process -Name browser).MainWindowHandle | foreach { Set-WindowStyle MINIMIZE $_ }
}
catch
{
}
$cSource = @'
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class Clicker
{
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public int type; // 0 = INPUT_MOUSE,
// 1 = INPUT_KEYBOARD
// 2 = INPUT_HARDWARE
public MOUSEINPUT mi;
}
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx ;
public int dy ;
public int mouseData ;
public int dwFlags;
public int time;
public IntPtr dwExtraInfo;
}
//This covers most use cases although complex mice may have additional buttons
//There are additional constants you can use for those cases, see the msdn page
const int MOUSEEVENTF_MOVED = 0x0001 ;
const int MOUSEEVENTF_LEFTDOWN = 0x0002 ;
const int MOUSEEVENTF_LEFTUP = 0x0004 ;
const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ;
const int MOUSEEVENTF_RIGHTUP = 0x0010 ;
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;
const int MOUSEEVENTF_MIDDLEUP = 0x0040 ;
const int MOUSEEVENTF_WHEEL = 0x0080 ;
const int MOUSEEVENTF_XDOWN = 0x0100 ;
const int MOUSEEVENTF_XUP = 0x0200 ;
const int MOUSEEVENTF_ABSOLUTE = 0x8000 ;
const int screen_length = 0x10000 ;
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
public static void LeftClickAtPoint(int x, int y)
{
//Move the mouse
INPUT[] input = new INPUT[3];
input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
//Left mouse button down
input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;,
//Left mouse button up
input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(3, input, Marshal.SizeOf(input[0]));
}
}
'@
Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing
#Send a click at a specified point
[Clicker]::LeftClickAtPoint(960,540)
Данный скрипт нажимает левой кнопкой мыши точно по середине экрана из расчета что у меня fullhd разрешение.
4. Проблема запуска некоторых игр на весь экран.
Похожая проблема с экраном была при запуске некоторых игр, например я столкнулся с тем что Fifa 2022 и Fifa 2019 бывает запускается как бы в окне (видны рамки окна), почему я так и не понял (настройка fullscreen была сделана), при чем я запускал 3 раза подряд, 2 раза всё нормально третий раз нет. Решалось нажатием мыши на окно игры. Поэтому добавил практически такой же скрипт что и выше, только ещё учитывая задержку запуска игры в 15 секунд, сделал этот скрипт при запуске для всех игр.
5. Ошибка реагирования на нажатие на геймпаде.
Playnite был настроен как рекомендовалось, когда запускается игра, сам лаунчер сворачивается, когда происходит выход из игры, лаунчер разворачивается на весь экран и в этот момент, по не выявленным мной причинам, в 15 % случалось так что playnite не реагировал на нажатия на геймпаде, при этом стрелки пульта работали штатно, если свернуть лаунчер и снова развернуть всё работало нормально. так как я не понял почему так происходит, решил сворачивать лаунчер и разворачивать лаунчер скриптом, в самом playnite выключил эту настройку.
function Set-WindowStyle {
param(
[Parameter()]
[ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE',
'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED',
'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')]
$Style = 'SHOW',
[Parameter()]
$MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle
)
$WindowStates = @{
FORCEMINIMIZE = 11; HIDE = 0
MAXIMIZE = 3; MINIMIZE = 6
RESTORE = 9; SHOW = 5
SHOWDEFAULT = 10; SHOWMAXIMIZED = 3
SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7
SHOWNA = 8; SHOWNOACTIVATE = 4
SHOWNORMAL = 1
}
Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style]))
$Win32ShowWindowAsync = Add-Type –memberDefinition @”
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru
$Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null
}
try
{
(Get-Process -Name browser).MainWindowHandle | foreach { Set-WindowStyle MINIMIZE $_ }
}
catch
{
}
Для разворачивание изменяем строку (Get-Process -Name browser).MainWindowHandle | foreach { Set-WindowStyle MINIMIZE $_ }
на (Get-Process -Name browser).MainWindowHandle | foreach { Set-WindowStyle SHOWNORMAL $_ }
6. Отключение лаунчеров Steam, BattleNet, EA.
Сначала я не хотел их выключать, хотел только чтобы лаунчеры работали и не отсвечивали, но так не вышло. Даже при выключенной настройки включения Steam по нажатию на кнопку Guide, если Steam свернут, после её нажатия он откроется, для решения этой проблемы необходимо зайти в настройки контроллера в стим и переназначить в нём кнопки, на кнопке Guide нажать пропустить. После этого Steam постоянно будет в трее и не отсвечивать.
Отключаю EA Лаунчер:
В Playnite есть встроенная функция отключения сторонних лаунчеров, но она у меня работает только на Steam, для каждой игры написал скрипт, только с проверкой запущен ли клиент, который необходимо отключить.
BattleNet отключается легко, в самой настройке этого лаунчера:
EA решил отключать потому что после выхода из игры он открывался на весь экран без возможности закрытия или настройки этого не делать.
7. Запуск эмулятора switch
Решил, что можно было бы добавить игры switch, ведь эта консоль мне казалась той с которой можно весело провести время компанией. как скачать эмулятор описывать не буду, и откуда взять ключ шифрования тоже, этих инструкций в интернете полно, скажу только что я использовал эмулятор yuzu. Однако эмулятор не запускался на весь экран и не понятно мне было как выходить из игры, используя только контроллер.
Для запуска игр в полном экране в настройках эмулятора необходимо было добавить след. строки:
А для выхода из игры, я начал придумывать разнообразные костыли, а потом наткнулся на горячие клавиши эмулятора:
Настройки геймпада сделал такие:
8. Запуск эмулятора NES (dendy)
Ещё в зарождении идеи с игровым ПК я хотел добавить игру battle city или по простому танчики, на которые в детстве не одну 100 часов потратил. Итак, для этой эмуляции проблемы были всё те же что и с эмулятор switch. Сначала попробовал эмулятор mesen, но быстро отказался. Затем я попробовал добавить эмулятор retroarсh, скачал, установил добавил одно ядро Nes, сделал настройку в самом retroarh полного экрана, и после тестового запуска танчиков, только начал думать как выходить из игры, нажал на кнопку Guide и ретроарч предоставил мне возможность закрыть эмулятор.
Получился очень длинный пост, он у меня первый, хотел поделиться, вдруг кому-нибудь пригодиться.
Могу ещё рассказать много чего про оформление лаунчера, запуск минивидео в превью игры, создание фильтров, категорий, импорт достижений, настройка Geforce Now + Moonlight для трансляции игры с любого места где норм интернет т.п.
PS
Знаю, что это прям задротство, что большинству это просто не надо, но мне нравиться настраивать ПО на компьютере больше, наверное, чем сами игры.