Compare commits
9 Commits
Canary-1.2
...
23b53f4c0d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23b53f4c0d | ||
|
|
a205ec374b | ||
|
|
aab9b58542 | ||
|
|
daa648dc40 | ||
|
|
1024aa8757 | ||
|
|
13388e972a | ||
|
|
1eb78872d8 | ||
|
|
bcbe589964 | ||
|
|
d406c42e15 |
@@ -2480,6 +2480,7 @@
|
|||||||
010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49
|
010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49
|
||||||
010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17
|
010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17
|
||||||
010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36
|
010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36
|
||||||
|
010071E0145F8000,"Rustler",,playable,2025-02-10 20:17:12
|
||||||
0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01
|
0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01
|
||||||
010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43
|
010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43
|
||||||
0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09
|
0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09
|
||||||
|
|||||||
|
@@ -219,6 +219,7 @@ namespace Ryujinx.Common
|
|||||||
//Misc Games
|
//Misc Games
|
||||||
"010056e00853a000", // A Hat in Time
|
"010056e00853a000", // A Hat in Time
|
||||||
"0100fd1014726000", // Baldurs Gate: Dark Alliance
|
"0100fd1014726000", // Baldurs Gate: Dark Alliance
|
||||||
|
"01008c2019598000", // Bluey: The Video Game
|
||||||
"0100c6800b934000", // Brawlhalla
|
"0100c6800b934000", // Brawlhalla
|
||||||
"0100dbf01000a000", // Burnout Paradise Remastered
|
"0100dbf01000a000", // Burnout Paradise Remastered
|
||||||
"0100744001588000", // Cars 3: Driven to Win
|
"0100744001588000", // Cars 3: Driven to Win
|
||||||
|
|||||||
@@ -110,24 +110,10 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
|
|||||||
_broadcastAddress = config.ProxyIp | (~config.ProxySubnetMask);
|
_broadcastAddress = config.ProxyIp | (~config.ProxySubnetMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ushort> NatPunch()
|
private async Task<ushort> NatPunchForDevice(NatDevice device)
|
||||||
{
|
{
|
||||||
NatDiscoverer discoverer = new();
|
Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Attempting to map port using {device.ToString()}");
|
||||||
CancellationTokenSource cts = new(5000);
|
|
||||||
|
|
||||||
NatDevice device;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
device = await discoverer.DiscoverDeviceAsync(PortMapper.Upnp, cts);
|
|
||||||
}
|
|
||||||
catch (NatDeviceNotFoundException)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_publicPort = PublicPortBase;
|
_publicPort = PublicPortBase;
|
||||||
|
|
||||||
for (int i = 0; i < PublicPortRange; i++)
|
for (int i = 0; i < PublicPortRange; i++)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -138,12 +124,14 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
catch (MappingException)
|
catch (MappingException ex)
|
||||||
{
|
{
|
||||||
|
Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.Message}");
|
||||||
_publicPort++;
|
_publicPort++;
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.GetType().Name}: {ex.Message}");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,17 +143,52 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy
|
|||||||
|
|
||||||
if (_publicPort != 0)
|
if (_publicPort != 0)
|
||||||
{
|
{
|
||||||
|
_natDevice = device;
|
||||||
_ = Executor.ExecuteAfterDelayAsync(
|
_ = Executor.ExecuteAfterDelayAsync(
|
||||||
PortLeaseRenew.Seconds(),
|
PortLeaseRenew.Seconds(),
|
||||||
_disposedCancellation.Token,
|
_disposedCancellation.Token,
|
||||||
RefreshLease);
|
RefreshLease);
|
||||||
}
|
}
|
||||||
|
|
||||||
_natDevice = device;
|
|
||||||
|
|
||||||
return _publicPort;
|
return _publicPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<ushort> NatPunch()
|
||||||
|
{
|
||||||
|
NatDiscoverer discoverer = new();
|
||||||
|
CancellationTokenSource cts = new(500);
|
||||||
|
|
||||||
|
NatDevice[] devices;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
devices = (await discoverer.DiscoverDevicesAsync(PortMapper.Upnp, cts)).ToArray();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Failed to discover UPnP devices: {ex.Message}");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (devices.Length == 0)
|
||||||
|
{
|
||||||
|
Logger.Error?.PrintMsg(LogClass.ServiceLdn, "No UPnP devices found.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var device in devices)
|
||||||
|
{
|
||||||
|
ushort port = await NatPunchForDevice(device);
|
||||||
|
if (port != 0)
|
||||||
|
{
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port using any device");
|
||||||
|
_publicPort = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Proxy handlers
|
// Proxy handlers
|
||||||
|
|
||||||
private void RouteMessage(P2pProxySession sender, ref ProxyInfo info, Action<P2pProxySession> action)
|
private void RouteMessage(P2pProxySession sender, ref ProxyInfo info, Action<P2pProxySession> action)
|
||||||
|
|||||||
@@ -17747,6 +17747,31 @@
|
|||||||
"zh_TW": "更新已停用!"
|
"zh_TW": "更新已停用!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ID": "UpdaterBackgroundStatusBarButtonText",
|
||||||
|
"Translations": {
|
||||||
|
"ar_SA": "",
|
||||||
|
"de_DE": "",
|
||||||
|
"el_GR": "",
|
||||||
|
"en_US": "Update Available!",
|
||||||
|
"es_ES": "",
|
||||||
|
"fr_FR": "",
|
||||||
|
"he_IL": "",
|
||||||
|
"it_IT": "",
|
||||||
|
"ja_JP": "",
|
||||||
|
"ko_KR": "",
|
||||||
|
"no_NO": "",
|
||||||
|
"pl_PL": "",
|
||||||
|
"pt_BR": "",
|
||||||
|
"ru_RU": "",
|
||||||
|
"sv_SE": "",
|
||||||
|
"th_TH": "",
|
||||||
|
"tr_TR": "",
|
||||||
|
"uk_UA": "",
|
||||||
|
"zh_CN": "",
|
||||||
|
"zh_TW": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ID": "ControllerSettingsRotate90",
|
"ID": "ControllerSettingsRotate90",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using Avalonia.Media.Imaging;
|
|||||||
using Avalonia.Platform.Storage;
|
using Avalonia.Platform.Storage;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using CommunityToolkit.Mvvm.Input;
|
||||||
using DynamicData;
|
using DynamicData;
|
||||||
using DynamicData.Binding;
|
using DynamicData.Binding;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
@@ -104,6 +105,13 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
[ObservableProperty] private bool _isSubMenuOpen;
|
[ObservableProperty] private bool _isSubMenuOpen;
|
||||||
[ObservableProperty] private ApplicationContextMenu _listAppContextMenu;
|
[ObservableProperty] private ApplicationContextMenu _listAppContextMenu;
|
||||||
[ObservableProperty] private ApplicationContextMenu _gridAppContextMenu;
|
[ObservableProperty] private ApplicationContextMenu _gridAppContextMenu;
|
||||||
|
[ObservableProperty] private bool _updateAvailable;
|
||||||
|
|
||||||
|
public static AsyncRelayCommand UpdateCommand => Commands.Create(async () =>
|
||||||
|
{
|
||||||
|
if (Updater.CanUpdate(true))
|
||||||
|
await Updater.BeginUpdateAsync(true);
|
||||||
|
});
|
||||||
|
|
||||||
private bool _showLoadProgress;
|
private bool _showLoadProgress;
|
||||||
private bool _isGameRunning;
|
private bool _isGameRunning;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
Background="{DynamicResource ThemeContentBackgroundColor}"
|
Background="{DynamicResource ThemeContentBackgroundColor}"
|
||||||
DockPanel.Dock="Bottom"
|
DockPanel.Dock="Bottom"
|
||||||
IsVisible="{Binding ShowMenuAndStatusBar}"
|
IsVisible="{Binding ShowMenuAndStatusBar}"
|
||||||
ColumnDefinitions="Auto,Auto,*,Auto,Auto">
|
ColumnDefinitions="Auto,Auto,*,Auto,Auto,Auto">
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="5"
|
Margin="5"
|
||||||
@@ -280,9 +280,29 @@
|
|||||||
Text="{Binding GpuNameText}"
|
Text="{Binding GpuNameText}"
|
||||||
TextAlignment="Start" />
|
TextAlignment="Start" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Column="4"
|
Grid.Column="4"
|
||||||
Margin="0,0,5,0"
|
Margin="0,0,5,0"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<StackPanel.IsVisible>
|
||||||
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
||||||
|
<Binding Path="EnableNonGameRunningControls" />
|
||||||
|
<Binding Path="UpdateAvailable" />
|
||||||
|
</MultiBinding>
|
||||||
|
</StackPanel.IsVisible>
|
||||||
|
<Button Margin="0, 0, 5, 0"
|
||||||
|
Command="{Binding UpdateCommand}">
|
||||||
|
<TextBlock
|
||||||
|
Margin="-5"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{ext:Locale UpdaterBackgroundStatusBarButtonText}" />
|
||||||
|
</Button>
|
||||||
|
<controls:MiniVerticalSeparator Margin="5,0,0,0"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel
|
||||||
|
Grid.Column="5"
|
||||||
|
Margin="0,0,5,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
IsVisible="{Binding ShowFirmwareStatus}"
|
IsVisible="{Binding ShowFirmwareStatus}"
|
||||||
Orientation="Horizontal">
|
Orientation="Horizontal">
|
||||||
|
|||||||
@@ -413,15 +413,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
case UpdaterType.CheckInBackground:
|
case UpdaterType.CheckInBackground:
|
||||||
if ((await Updater.CheckVersionAsync()).TryGet(out (Version Current, Version Incoming) versions))
|
if ((await Updater.CheckVersionAsync()).TryGet(out (Version Current, Version Incoming) versions))
|
||||||
{
|
{
|
||||||
string newVersionString = ReleaseInformation.IsCanaryBuild
|
Dispatcher.UIThread.Post(() => RyujinxApp.MainWindow.ViewModel.UpdateAvailable = versions.Current < versions.Incoming);
|
||||||
? $"Canary {versions.Current} -> Canary {versions.Incoming}"
|
|
||||||
: $"{versions.Current} -> {versions.Incoming}";
|
|
||||||
|
|
||||||
if (versions.Current < versions.Incoming)
|
|
||||||
NotificationHelper.ShowInformation(
|
|
||||||
title: "Update Available",
|
|
||||||
text: newVersionString,
|
|
||||||
onClick: () => _ = Updater.BeginUpdateAsync());
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
_running = false;
|
_running = false;
|
||||||
|
|
||||||
return (currentVersion, null);
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (currentVersion, newVersion);
|
return (currentVersion, newVersion);
|
||||||
@@ -178,7 +178,11 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
_running = true;
|
_running = true;
|
||||||
|
|
||||||
(Version currentVersion, Version newVersion) = (await CheckVersionAsync(showVersionUpToDate)).OrDefault();
|
Optional<(Version, Version)> versionTuple = await CheckVersionAsync(showVersionUpToDate);
|
||||||
|
|
||||||
|
if (_running is false || !versionTuple.HasValue) return;
|
||||||
|
|
||||||
|
(Version currentVersion, Version newVersion) = versionTuple.Value;
|
||||||
|
|
||||||
if (newVersion <= currentVersion)
|
if (newVersion <= currentVersion)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
|||||||
DockedMode = System.EnableDockedMode,
|
DockedMode = System.EnableDockedMode,
|
||||||
EnableDiscordIntegration = EnableDiscordIntegration,
|
EnableDiscordIntegration = EnableDiscordIntegration,
|
||||||
CheckUpdatesOnStart = CheckUpdatesOnStart,
|
CheckUpdatesOnStart = CheckUpdatesOnStart,
|
||||||
|
UpdateCheckerType = UpdateCheckerType,
|
||||||
ShowConfirmExit = ShowConfirmExit,
|
ShowConfirmExit = ShowConfirmExit,
|
||||||
RememberWindowState = RememberWindowState,
|
RememberWindowState = RememberWindowState,
|
||||||
ShowTitleBar = ShowTitleBar,
|
ShowTitleBar = ShowTitleBar,
|
||||||
|
|||||||
Reference in New Issue
Block a user