diff --git a/Dotnet/AppApi/Cef/AppApiCef.cs b/Dotnet/AppApi/Cef/AppApiCef.cs
index 4986b26b..7e8cd79b 100644
--- a/Dotnet/AppApi/Cef/AppApiCef.cs
+++ b/Dotnet/AppApi/Cef/AppApiCef.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -27,7 +27,7 @@ namespace VRCX
public partial class AppApiCef : AppApi
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
-
+
///
/// Shows the developer tools for the main browser window.
///
@@ -95,7 +95,7 @@ public override void DesktopNotification(string BoldText, string Text = "", stri
logger.Error(ex, "Unknown error when sending desktop notification");
}
}
-
+
public override void RestartApplication(bool isUpgrade)
{
var args = new List();
@@ -125,12 +125,12 @@ public override void RestartApplication(bool isUpgrade)
vrcxProcess.Start();
Environment.Exit(0);
}
-
+
public override bool CheckForUpdateExe()
{
return File.Exists(Path.Join(Program.AppDataDirectory, "update.exe"));
}
-
+
public override void ExecuteAppFunction(string function, string json)
{
if (MainForm.Instance?.Browser != null && !MainForm.Instance.Browser.IsLoading && MainForm.Instance.Browser.CanExecuteJavascriptInMainFrame)
@@ -153,7 +153,7 @@ public override string GetLaunchCommand()
StartupArgs.LaunchArguments.LaunchCommand = string.Empty;
return command;
}
-
+
public override void FocusWindow()
{
MainForm.Instance.Invoke(new Action(() => { MainForm.Instance.Focus_Window(); }));
@@ -168,7 +168,7 @@ public override void DoFunny()
{
WinformThemer.DoFunny();
}
-
+
public override string GetClipboard()
{
var clipboard = string.Empty;
@@ -189,7 +189,7 @@ public override void SetStartup(bool enabled)
logger.Warn("Failed to open startup registry key");
return;
}
-
+
if (enabled)
{
var path = Application.ExecutablePath;
@@ -216,7 +216,7 @@ public override void CopyImageToClipboard(string path)
!path.EndsWith(".bmp") &&
!path.EndsWith(".webp")))
return;
-
+
MainForm.Instance.BeginInvoke(new MethodInvoker(() =>
{
var image = Image.FromFile(path);
@@ -227,12 +227,12 @@ public override void CopyImageToClipboard(string path)
Clipboard.SetDataObject(data, true);
}));
}
-
+
public override void FlashWindow()
{
MainForm.Instance.BeginInvoke(new MethodInvoker(() => { WinformThemer.Flash(MainForm.Instance); }));
}
-
+
public override void SetUserAgent()
{
using var client = MainForm.Instance.Browser.GetDevToolsClient();
diff --git a/Dotnet/AssetBundleManager.cs b/Dotnet/AssetBundleManager.cs
index 8213c147..49c0b598 100644
--- a/Dotnet/AssetBundleManager.cs
+++ b/Dotnet/AssetBundleManager.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -28,7 +28,7 @@ static AssetBundleManager()
public string GetAssetId(string id, string variant = "")
{
- using(var sha256 = SHA256.Create())
+ using (var sha256 = SHA256.Create())
{
byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(id + variant));
StringBuilder idHex = new StringBuilder(hash.Length * 2);
@@ -53,16 +53,17 @@ public string GetAssetVersion(int version, int variantVersion = 0)
{
versionHex += b.ToString("X2");
}
-
+
return versionHex.PadLeft(32, '0');
}
-
+
public (int, int) ReverseHexToDecimal(string hexString)
{
if (hexString.Length != 32)
return (0, 0); // it's cooked
-
- try {
+
+ try
+ {
var variantVersionHexString = hexString.Substring(0, 8); // 0..8
var versionHexString = hexString.Substring(24, 8); // 24..32
var versionBytes = new byte[4];
@@ -110,7 +111,7 @@ public string GetVRChatCacheFullLocation(string id, int version, string variant
var dirs = Directory.GetDirectories(topDir, versionSearchPattern);
if (dirs.Length > 0)
return dirs.OrderByDescending(dir => ReverseHexToDecimal(Path.GetFileName(dir)).Item2).First();
-
+
return Path.Join(topDir, versionLocation);
}
@@ -129,7 +130,7 @@ public Tuple CheckVRChatCache(string id, int version, string
var fullLocation = GetVRChatCacheFullLocation(id, version);
if (!Directory.Exists(fullLocation))
fullLocation = GetVRChatCacheFullLocation(id, version, variant, variantVersion);
-
+
var fileLocation = Path.Join(fullLocation, "__data");
var cachePath = string.Empty;
if (File.Exists(fileLocation))
@@ -157,7 +158,7 @@ public void DeleteCache(string id, int version, string variant, int variantVersi
var path = GetVRChatCacheFullLocation(id, version);
if (Directory.Exists(path))
Directory.Delete(path, true);
-
+
path = GetVRChatCacheFullLocation(id, version, variant, variantVersion);
if (Directory.Exists(path))
Directory.Delete(path, true);
@@ -206,7 +207,7 @@ public List SweepCache()
if (File.Exists(Path.Join(versionDirectory.FullName, "__lock")))
continue; // skip locked version
-
+
versionDirectory.Delete(true);
output.Add($"{cacheDirectory.Name}\\{versionDirectory.Name}");
}
diff --git a/Dotnet/Cef/CefCustomDownloadHandler.cs b/Dotnet/Cef/CefCustomDownloadHandler.cs
index 3a43b02c..0a1293dc 100644
--- a/Dotnet/Cef/CefCustomDownloadHandler.cs
+++ b/Dotnet/Cef/CefCustomDownloadHandler.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/Cef/CefCustomMenuHandler.cs b/Dotnet/Cef/CefCustomMenuHandler.cs
index 127b572f..45e0fd7e 100644
--- a/Dotnet/Cef/CefCustomMenuHandler.cs
+++ b/Dotnet/Cef/CefCustomMenuHandler.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019 pypy. All rights reserved.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
//
// This work is licensed under the terms of the MIT license.
// For a copy, see .
diff --git a/Dotnet/Cef/CefNoopDragHandler.cs b/Dotnet/Cef/CefNoopDragHandler.cs
index 9d19a7a0..7fd27573 100644
--- a/Dotnet/Cef/CefNoopDragHandler.cs
+++ b/Dotnet/Cef/CefNoopDragHandler.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/Cef/MainForm.Designer.cs b/Dotnet/Cef/MainForm.Designer.cs
index 683d2fe4..18cee64c 100644
--- a/Dotnet/Cef/MainForm.Designer.cs
+++ b/Dotnet/Cef/MainForm.Designer.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019 pypy. All rights reserved.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
//
// This work is licensed under the terms of the MIT license.
// For a copy, see .
diff --git a/Dotnet/Cef/MainForm.cs b/Dotnet/Cef/MainForm.cs
index fa28b3af..abc95678 100644
--- a/Dotnet/Cef/MainForm.cs
+++ b/Dotnet/Cef/MainForm.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/Discord.cs b/Dotnet/Discord.cs
index 28d61658..0a4023ad 100644
--- a/Dotnet/Discord.cs
+++ b/Dotnet/Discord.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -119,7 +119,7 @@ public void SetText(string details, string state)
{
if (m_Client == null || m_Lock.IsReadLockHeld)
return;
-
+
m_Lock.EnterWriteLock();
try
{
@@ -179,7 +179,7 @@ public void SetAssets(string largeKey, string largeText, string smallKey, string
m_Lock.ExitWriteLock();
}
}
-
+
public void SetTimestamps(double startUnixMilliseconds, double endUnixMilliseconds)
{
var _startUnixMilliseconds = (ulong)startUnixMilliseconds;
diff --git a/Dotnet/IPC/IPCClient.cs b/Dotnet/IPC/IPCClient.cs
index 6f5dcc94..f1f04b29 100644
--- a/Dotnet/IPC/IPCClient.cs
+++ b/Dotnet/IPC/IPCClient.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -87,7 +87,7 @@ private void OnRead(IAsyncResult asyncResult)
{
if (string.IsNullOrEmpty(packet))
continue;
-
+
#if !LINUX
if (MainForm.Instance?.Browser != null && !MainForm.Instance.Browser.IsLoading && MainForm.Instance.Browser.CanExecuteJavascriptInMainFrame)
MainForm.Instance.Browser.ExecuteScriptAsync("$app.ipcEvent", packet);
diff --git a/Dotnet/IPC/IPCServer.cs b/Dotnet/IPC/IPCServer.cs
index cfbce27e..91ae1c31 100644
--- a/Dotnet/IPC/IPCServer.cs
+++ b/Dotnet/IPC/IPCServer.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -33,7 +33,7 @@ public static void Send(IPCPacket ipcPacket)
client?.Send(ipcPacket);
}
}
-
+
public static string GetIpcName()
{
var hash = 0;
diff --git a/Dotnet/JsonFileSerializer.cs b/Dotnet/JsonFileSerializer.cs
index c3fbcc44..5be564ee 100644
--- a/Dotnet/JsonFileSerializer.cs
+++ b/Dotnet/JsonFileSerializer.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/LogWatcher.cs b/Dotnet/LogWatcher.cs
index 7fd52cb5..b63c993d 100644
--- a/Dotnet/LogWatcher.cs
+++ b/Dotnet/LogWatcher.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -618,7 +618,7 @@ private bool ParseLogVideoError(FileInfo fileInfo, LogContext logContext, string
{
// 2021.04.08 06:37:45 Error - [Video Playback] ERROR: Video unavailable
// 2021.04.08 06:40:07 Error - [Video Playback] ERROR: Private video
-
+
// 2024.07.31 22:28:47 Error - [AVProVideo] Error: Loading failed. File not found, codec not supported, video resolution too high or insufficient system resources.
// 2024.07.31 23:04:15 Error - [AVProVideo] Error: Loading failed. File not found, codec not supported, video resolution too high or insufficient system resources.
@@ -639,7 +639,7 @@ private bool ParseLogVideoError(FileInfo fileInfo, LogContext logContext, string
return true;
}
-
+
if (line.Contains("[AVProVideo] Error: "))
{
var data = line.Substring(offset + 20);
@@ -870,17 +870,17 @@ private bool ParseLogAPIRequest(FileInfo fileInfo, LogContext logContext, string
private bool ParseLogAvatarChange(FileInfo fileInfo, LogContext logContext, string line, int offset)
{
// 2023.11.05 14:45:57 Log - [Behaviour] Switching K․MOG to avatar MoeSera
-
+
if (string.Compare(line, offset, "[Behaviour] Switching ", 0, 22, StringComparison.Ordinal) != 0)
return false;
-
+
var pos = line.LastIndexOf(" to avatar ", StringComparison.Ordinal);
if (pos < 0)
return false;
-
+
var displayName = line.Substring(offset + 22, pos - (offset + 22));
var avatarName = line.Substring(pos + 11);
-
+
AppendLog(new[]
{
fileInfo.Name,
@@ -889,7 +889,7 @@ private bool ParseLogAvatarChange(FileInfo fileInfo, LogContext logContext, stri
displayName,
avatarName
});
-
+
return true;
}
@@ -1046,7 +1046,7 @@ private bool ParseLogUdonException(FileInfo fileInfo, string line)
{
// 2022.11.29 04:27:33 Error - [UdonBehaviour] An exception occurred during Udon execution, this UdonBehaviour will be halted.
// VRC.Udon.VM.UdonVMException: An exception occurred in an UdonVM, execution will be halted. --->VRC.Udon.VM.UdonVMException: An exception occurred during EXTERN to 'VRCSDKBaseVRCPlayerApi.__get_displayName__SystemString'. --->System.NullReferenceException: Object reference not set to an instance of an object.
-
+
if (line.Contains("[PyPyDance]"))
{
AppendLog(new[]
@@ -1058,7 +1058,7 @@ private bool ParseLogUdonException(FileInfo fileInfo, string line)
});
return true;
}
-
+
var lineOffset = line.IndexOf(" ---> VRC.Udon.VM.UdonVMException: ", StringComparison.Ordinal);
if (lineOffset < 0)
return false;
@@ -1102,7 +1102,7 @@ private bool ParseOpenVRInit(FileInfo fileInfo, LogContext logContext, string li
// 2023.04.22 16:52:28 Log - Initializing VRSDK.
// 2023.04.22 16:52:29 Log - StartVRSDK: Open VR Loader
-
+
// 2024.07.26 01:48:56 Log - STEAMVR HMD Model: Index
if (string.Compare(line, offset, "Initializing VRSDK.", 0, 19, StringComparison.Ordinal) != 0 &&
@@ -1152,7 +1152,7 @@ private bool ParseLogStringDownload(FileInfo fileInfo, LogContext logContext, st
if (stringData.StartsWith("http://127.0.0.1:22500") || stringData.StartsWith("http://localhost:22500"))
return true; // ignore own requests
-
+
AppendLog(new[]
{
fileInfo.Name,
@@ -1176,10 +1176,10 @@ private bool ParseLogImageDownload(FileInfo fileInfo, LogContext logContext, str
var imageData = line.Substring(lineOffset + check.Length);
imageData = imageData.Remove(imageData.Length - 1);
-
+
if (imageData.StartsWith("http://127.0.0.1:22500") || imageData.StartsWith("http://localhost:22500"))
return true; // ignore own requests
-
+
AppendLog(new[]
{
fileInfo.Name,
@@ -1189,7 +1189,7 @@ private bool ParseLogImageDownload(FileInfo fileInfo, LogContext logContext, str
});
return true;
}
-
+
private bool ParseVoteKick(FileInfo fileInfo, LogContext logContext, string line, int offset)
{
// 2023.06.02 01:08:04 Log - [Behaviour] Received executive message: You have been kicked from the instance by majority vote
@@ -1207,7 +1207,7 @@ private bool ParseVoteKick(FileInfo fileInfo, LogContext logContext, string line
});
return true;
}
-
+
private bool ParseFailedToJoin(FileInfo fileInfo, LogContext logContext, string line, int offset)
{
// 2023.09.01 10:42:19 Warning - [Behaviour] Failed to join instance 'wrld_78eb6b52-fd5a-4954-ba28-972c92c8cc77:82384~hidden(usr_a9bf892d-b447-47ce-a572-20c83dbfffd8)~region(eu)' due to 'That instance is using an outdated version of VRChat. You won't be able to join them until they update!'
@@ -1228,7 +1228,7 @@ private bool ParseFailedToJoin(FileInfo fileInfo, LogContext logContext, string
private bool ParseOscFailedToStart(FileInfo fileInfo, LogContext logContext, string line, int offset)
{
// 2023.09.26 04:12:57 Warning - Could not Start OSC: Address already in use
-
+
if (string.Compare(line, offset, "Could not Start OSC: ", 0, 21, StringComparison.Ordinal) != 0)
return false;
diff --git a/Dotnet/Overlay/OffScreenBrowser.cs b/Dotnet/Overlay/OffScreenBrowser.cs
index c3aa0768..92386d9a 100644
--- a/Dotnet/Overlay/OffScreenBrowser.cs
+++ b/Dotnet/Overlay/OffScreenBrowser.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -25,7 +25,7 @@ public class OffScreenBrowser : ChromiumWebBrowser, IRenderHandler
private DeviceMultithread _deviceMultithread;
private Query _query;
private Texture2D _renderTarget;
-
+
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public OffScreenBrowser(string address, int width, int height)
@@ -37,18 +37,18 @@ public OffScreenBrowser(string address, int width, int height)
windowInfo.SharedTextureEnabled = true;
windowInfo.Width = width;
windowInfo.Height = height;
-
+
var browserSettings = new BrowserSettings()
{
DefaultEncoding = "UTF-8",
WindowlessFrameRate = 60
};
-
+
CreateBrowser(windowInfo, browserSettings);
Size = new System.Drawing.Size(width, height);
RenderHandler = this;
-
+
JavascriptBindings.ApplyVrJavascriptBindings(JavascriptObjectRepository);
}
@@ -56,13 +56,13 @@ public void UpdateRender(Device device, Texture2D renderTarget)
{
_device = device;
_device1 = _device.QueryInterface();
-
+
_deviceMultithread?.Dispose();
_deviceMultithread = _device.QueryInterfaceOrNull();
_deviceMultithread?.SetMultithreadProtected(true);
_renderTarget = renderTarget;
-
+
_query?.Dispose();
_query = new Query(_device, new QueryDescription
{
diff --git a/Dotnet/Overlay/OffScreenBrowserLegacy.cs b/Dotnet/Overlay/OffScreenBrowserLegacy.cs
index cd17ce01..2b408b86 100644
--- a/Dotnet/Overlay/OffScreenBrowserLegacy.cs
+++ b/Dotnet/Overlay/OffScreenBrowserLegacy.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -66,7 +66,7 @@ public void RenderToTexture(Texture2D texture)
// Safeguard against uninitialized texture
if (texture == null)
return;
-
+
_paintBufferLock.EnterReadLock();
try
{
diff --git a/Dotnet/Overlay/SystemMonitor.cs b/Dotnet/Overlay/SystemMonitor.cs
index d41b1f48..5cebbe97 100644
--- a/Dotnet/Overlay/SystemMonitor.cs
+++ b/Dotnet/Overlay/SystemMonitor.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -31,7 +31,7 @@ public void Start(bool enabled)
{
if (enabled == _enabled)
return;
-
+
_enabled = enabled;
if (enabled)
StartThread();
@@ -61,11 +61,11 @@ internal void Exit()
_performanceCounterUpTime?.Dispose();
_performanceCounterUpTime = null;
}
-
+
private void StartThread()
{
Exit();
-
+
try
{
_performanceCounterCpuUsage = new PerformanceCounter(
@@ -99,7 +99,7 @@ private void StartThread()
logger.Warn($"Failed to create \"Processor Time\" PerformanceCounter ${ex}");
}
}
-
+
try
{
_performanceCounterUpTime = new PerformanceCounter("System", "System Up Time");
@@ -117,14 +117,14 @@ private void StartThread()
return;
}
logger.Info("SystemMonitor started");
-
+
_thread = new Thread(ThreadProc)
{
IsBackground = true
};
_thread.Start();
}
-
+
private void ThreadProc()
{
try
@@ -136,7 +136,7 @@ private void ThreadProc()
if (_performanceCounterUpTime != null)
UpTime = TimeSpan.FromSeconds(_performanceCounterUpTime.NextValue()).TotalMilliseconds;
-
+
Thread.Sleep(1000);
}
}
diff --git a/Dotnet/Overlay/VRCXVR.cs b/Dotnet/Overlay/VRCXVR.cs
index 31b2e956..cef37fee 100644
--- a/Dotnet/Overlay/VRCXVR.cs
+++ b/Dotnet/Overlay/VRCXVR.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -51,11 +51,11 @@ public class VRCXVR : VRCXVRInterface
private ulong _hmdOverlayHandle;
private bool _hmdOverlayActive;
private bool _hmdOverlayWasActive;
-
+
private ulong _wristOverlayHandle;
private bool _wristOverlayActive;
private bool _wristOverlayWasActive;
-
+
static VRCXVR()
{
@@ -98,7 +98,7 @@ public override void Restart()
private void SetupTextures()
{
_factory ??= new Factory1();
-
+
_device?.Dispose();
_device = new Device(_factory.GetAdapter(OpenVR.System.GetD3D9AdapterIndex()),
DeviceCreationFlags.BgraSupport);
@@ -136,7 +136,7 @@ private void SetupTextures()
);
_hmdOverlay?.UpdateRender(_device, _texture2);
}
-
+
private void UpgradeDevice()
{
Device5 device5 = _device.QueryInterfaceOrNull();
@@ -186,7 +186,7 @@ private void ThreadLoop()
var overlayVisible1 = false;
var overlayVisible2 = false;
var dashboardHandle = 0UL;
-
+
_wristOverlay = new OffScreenBrowser(
"file://vrcx/vr.html?1",
512,
@@ -340,15 +340,15 @@ public override void SetActive(bool active, bool hmdOverlay, bool wristOverlay,
OpenVR.Overlay.DestroyOverlay(_hmdOverlayHandle);
_hmdOverlayHandle = 0;
}
-
+
_hmdOverlayWasActive = _hmdOverlayActive;
-
+
if (_wristOverlayActive != _wristOverlayWasActive && _wristOverlayHandle != 0)
{
OpenVR.Overlay.DestroyOverlay(_wristOverlayHandle);
_wristOverlayHandle = 0;
}
-
+
_wristOverlayWasActive = _wristOverlayActive;
}
@@ -396,7 +396,7 @@ private void UpdateDevices(CVRSystem system, ref uint overlayIndex)
var success = system.GetControllerState(i, ref state, (uint)Marshal.SizeOf(state));
if (!success)
break; // this fails while SteamVR overlay is open
-
+
var prox = state.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_ProximitySensor));
var isHmdAfk = prox == 0;
if (isHmdAfk != IsHmdAfk)
@@ -438,82 +438,82 @@ private void UpdateDevices(CVRSystem system, ref uint overlayIndex)
case ETrackedDeviceClass.Controller:
case ETrackedDeviceClass.GenericTracker:
case ETrackedDeviceClass.TrackingReference:
- {
- var err = ETrackedPropertyError.TrackedProp_Success;
- var batteryPercentage = system.GetFloatTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float, ref err);
- if (err != ETrackedPropertyError.TrackedProp_Success)
{
- batteryPercentage = 1f;
- }
+ var err = ETrackedPropertyError.TrackedProp_Success;
+ var batteryPercentage = system.GetFloatTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float, ref err);
+ if (err != ETrackedPropertyError.TrackedProp_Success)
+ {
+ batteryPercentage = 1f;
+ }
- err = ETrackedPropertyError.TrackedProp_Success;
- var isCharging = system.GetBoolTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceIsCharging_Bool, ref err);
- if (err != ETrackedPropertyError.TrackedProp_Success)
- {
- isCharging = false;
- }
+ err = ETrackedPropertyError.TrackedProp_Success;
+ var isCharging = system.GetBoolTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceIsCharging_Bool, ref err);
+ if (err != ETrackedPropertyError.TrackedProp_Success)
+ {
+ isCharging = false;
+ }
- sb.Clear();
- system.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_TrackingSystemName_String, sb, (uint)sb.Capacity, ref err);
- var isOculus = sb.ToString().IndexOf("oculus", StringComparison.OrdinalIgnoreCase) >= 0;
- // Oculus : B/Y, Bit 1, Mask 2
- // Oculus : A/X, Bit 7, Mask 128
- // Vive : Menu, Bit 1, Mask 2,
- // Vive : Grip, Bit 2, Mask 4
- var role = system.GetControllerRoleForTrackedDeviceIndex(i);
- if (role == ETrackedControllerRole.LeftHand || role == ETrackedControllerRole.RightHand)
- {
- if (_overlayHand == 0 ||
- (_overlayHand == 1 && role == ETrackedControllerRole.LeftHand) ||
- (_overlayHand == 2 && role == ETrackedControllerRole.RightHand))
+ sb.Clear();
+ system.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_TrackingSystemName_String, sb, (uint)sb.Capacity, ref err);
+ var isOculus = sb.ToString().IndexOf("oculus", StringComparison.OrdinalIgnoreCase) >= 0;
+ // Oculus : B/Y, Bit 1, Mask 2
+ // Oculus : A/X, Bit 7, Mask 128
+ // Vive : Menu, Bit 1, Mask 2,
+ // Vive : Grip, Bit 2, Mask 4
+ var role = system.GetControllerRoleForTrackedDeviceIndex(i);
+ if (role == ETrackedControllerRole.LeftHand || role == ETrackedControllerRole.RightHand)
{
- if (system.GetControllerState(i, ref state, (uint)Marshal.SizeOf(state)) &&
- (state.ulButtonPressed & (_menuButton ? 2u : isOculus ? 128u : 4u)) != 0)
+ if (_overlayHand == 0 ||
+ (_overlayHand == 1 && role == ETrackedControllerRole.LeftHand) ||
+ (_overlayHand == 2 && role == ETrackedControllerRole.RightHand))
{
- _nextOverlayUpdate = DateTime.MinValue;
- if (role == ETrackedControllerRole.LeftHand)
+ if (system.GetControllerState(i, ref state, (uint)Marshal.SizeOf(state)) &&
+ (state.ulButtonPressed & (_menuButton ? 2u : isOculus ? 128u : 4u)) != 0)
{
- Array.Copy(_translationLeft, _translation, 3);
- Array.Copy(_rotationLeft, _rotation, 3);
+ _nextOverlayUpdate = DateTime.MinValue;
+ if (role == ETrackedControllerRole.LeftHand)
+ {
+ Array.Copy(_translationLeft, _translation, 3);
+ Array.Copy(_rotationLeft, _rotation, 3);
+ }
+ else
+ {
+ Array.Copy(_translationRight, _translation, 3);
+ Array.Copy(_rotationRight, _rotation, 3);
+ }
+
+ overlayIndex = i;
}
- else
- {
- Array.Copy(_translationRight, _translation, 3);
- Array.Copy(_rotationRight, _rotation, 3);
- }
-
- overlayIndex = i;
}
}
- }
- var type = string.Empty;
- if (devClass == ETrackedDeviceClass.Controller)
- {
- if (role == ETrackedControllerRole.LeftHand)
+ var type = string.Empty;
+ if (devClass == ETrackedDeviceClass.Controller)
{
- type = "leftController";
+ if (role == ETrackedControllerRole.LeftHand)
+ {
+ type = "leftController";
+ }
+ else if (role == ETrackedControllerRole.RightHand)
+ {
+ type = "rightController";
+ }
+ else
+ {
+ type = "controller";
+ }
}
- else if (role == ETrackedControllerRole.RightHand)
+ else if (devClass == ETrackedDeviceClass.GenericTracker)
{
- type = "rightController";
+ type = "tracker";
}
- else
+ else if (devClass == ETrackedDeviceClass.TrackingReference)
{
- type = "controller";
+ type = "base";
}
- }
- else if (devClass == ETrackedDeviceClass.GenericTracker)
- {
- type = "tracker";
- }
- else if (devClass == ETrackedDeviceClass.TrackingReference)
- {
- type = "base";
- }
- var item = new[]
- {
+ var item = new[]
+ {
type,
system.IsTrackedDeviceConnected(i)
? "connected"
@@ -524,18 +524,18 @@ private void UpdateDevices(CVRSystem system, ref uint overlayIndex)
(batteryPercentage * 100).ToString(),
poses[i].eTrackingResult.ToString()
};
- _deviceListLock.EnterWriteLock();
- try
- {
- _deviceList.Add(item);
- }
- finally
- {
- _deviceListLock.ExitWriteLock();
- }
+ _deviceListLock.EnterWriteLock();
+ try
+ {
+ _deviceList.Add(item);
+ }
+ finally
+ {
+ _deviceListLock.ExitWriteLock();
+ }
- break;
- }
+ break;
+ }
}
}
}
@@ -833,7 +833,7 @@ internal EVROverlayError ProcessOverlay2(CVROverlay overlay, ref ulong overlayHa
return err;
}
-
+
public override void ExecuteVrFeedFunction(string function, string json)
{
if (_wristOverlay == null) return;
diff --git a/Dotnet/Overlay/VRCXVRLegacy.cs b/Dotnet/Overlay/VRCXVRLegacy.cs
index d2067d03..69c87677 100644
--- a/Dotnet/Overlay/VRCXVRLegacy.cs
+++ b/Dotnet/Overlay/VRCXVRLegacy.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -105,7 +105,7 @@ private void SetupTextures()
CpuAccessFlags = CpuAccessFlags.Write
}
);
-
+
_texture2?.Dispose();
_texture2 = new Texture2D(
_device,
@@ -137,7 +137,7 @@ private void ThreadLoop()
var dashboardHandle = 0UL;
var overlayHandle1 = 0UL;
var overlayHandle2 = 0UL;
-
+
_wristOverlay = new OffScreenBrowserLegacy(
"file://vrcx/vr.html?1",
512,
@@ -324,7 +324,7 @@ private void UpdateDevices(CVRSystem system, ref uint overlayIndex)
var success = system.GetControllerState(i, ref state, (uint)Marshal.SizeOf(state));
if (!success)
break; // this fails while SteamVR overlay is open
-
+
var prox = state.ulButtonPressed & (1UL << ((int)EVRButtonId.k_EButton_ProximitySensor));
var isHmdAfk = prox == 0;
if (isHmdAfk != IsHmdAfk)
@@ -366,82 +366,82 @@ private void UpdateDevices(CVRSystem system, ref uint overlayIndex)
case ETrackedDeviceClass.Controller:
case ETrackedDeviceClass.GenericTracker:
case ETrackedDeviceClass.TrackingReference:
- {
- var err = ETrackedPropertyError.TrackedProp_Success;
- var batteryPercentage = system.GetFloatTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float, ref err);
- if (err != ETrackedPropertyError.TrackedProp_Success)
{
- batteryPercentage = 1f;
- }
+ var err = ETrackedPropertyError.TrackedProp_Success;
+ var batteryPercentage = system.GetFloatTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float, ref err);
+ if (err != ETrackedPropertyError.TrackedProp_Success)
+ {
+ batteryPercentage = 1f;
+ }
- err = ETrackedPropertyError.TrackedProp_Success;
- var isCharging = system.GetBoolTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceIsCharging_Bool, ref err);
- if (err != ETrackedPropertyError.TrackedProp_Success)
- {
- isCharging = false;
- }
+ err = ETrackedPropertyError.TrackedProp_Success;
+ var isCharging = system.GetBoolTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_DeviceIsCharging_Bool, ref err);
+ if (err != ETrackedPropertyError.TrackedProp_Success)
+ {
+ isCharging = false;
+ }
- sb.Clear();
- system.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_TrackingSystemName_String, sb, (uint)sb.Capacity, ref err);
- var isOculus = sb.ToString().IndexOf("oculus", StringComparison.OrdinalIgnoreCase) >= 0;
- // Oculus : B/Y, Bit 1, Mask 2
- // Oculus : A/X, Bit 7, Mask 128
- // Vive : Menu, Bit 1, Mask 2,
- // Vive : Grip, Bit 2, Mask 4
- var role = system.GetControllerRoleForTrackedDeviceIndex(i);
- if (role == ETrackedControllerRole.LeftHand || role == ETrackedControllerRole.RightHand)
- {
- if (_overlayHand == 0 ||
- (_overlayHand == 1 && role == ETrackedControllerRole.LeftHand) ||
- (_overlayHand == 2 && role == ETrackedControllerRole.RightHand))
+ sb.Clear();
+ system.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_TrackingSystemName_String, sb, (uint)sb.Capacity, ref err);
+ var isOculus = sb.ToString().IndexOf("oculus", StringComparison.OrdinalIgnoreCase) >= 0;
+ // Oculus : B/Y, Bit 1, Mask 2
+ // Oculus : A/X, Bit 7, Mask 128
+ // Vive : Menu, Bit 1, Mask 2,
+ // Vive : Grip, Bit 2, Mask 4
+ var role = system.GetControllerRoleForTrackedDeviceIndex(i);
+ if (role == ETrackedControllerRole.LeftHand || role == ETrackedControllerRole.RightHand)
{
- if (system.GetControllerState(i, ref state, (uint)Marshal.SizeOf(state)) &&
- (state.ulButtonPressed & (_menuButton ? 2u : isOculus ? 128u : 4u)) != 0)
+ if (_overlayHand == 0 ||
+ (_overlayHand == 1 && role == ETrackedControllerRole.LeftHand) ||
+ (_overlayHand == 2 && role == ETrackedControllerRole.RightHand))
{
- _nextOverlayUpdate = DateTime.MinValue;
- if (role == ETrackedControllerRole.LeftHand)
+ if (system.GetControllerState(i, ref state, (uint)Marshal.SizeOf(state)) &&
+ (state.ulButtonPressed & (_menuButton ? 2u : isOculus ? 128u : 4u)) != 0)
{
- Array.Copy(_translationLeft, _translation, 3);
- Array.Copy(_rotationLeft, _rotation, 3);
+ _nextOverlayUpdate = DateTime.MinValue;
+ if (role == ETrackedControllerRole.LeftHand)
+ {
+ Array.Copy(_translationLeft, _translation, 3);
+ Array.Copy(_rotationLeft, _rotation, 3);
+ }
+ else
+ {
+ Array.Copy(_translationRight, _translation, 3);
+ Array.Copy(_rotationRight, _rotation, 3);
+ }
+
+ overlayIndex = i;
}
- else
- {
- Array.Copy(_translationRight, _translation, 3);
- Array.Copy(_rotationRight, _rotation, 3);
- }
-
- overlayIndex = i;
}
}
- }
- var type = string.Empty;
- if (devClass == ETrackedDeviceClass.Controller)
- {
- if (role == ETrackedControllerRole.LeftHand)
+ var type = string.Empty;
+ if (devClass == ETrackedDeviceClass.Controller)
{
- type = "leftController";
+ if (role == ETrackedControllerRole.LeftHand)
+ {
+ type = "leftController";
+ }
+ else if (role == ETrackedControllerRole.RightHand)
+ {
+ type = "rightController";
+ }
+ else
+ {
+ type = "controller";
+ }
}
- else if (role == ETrackedControllerRole.RightHand)
+ else if (devClass == ETrackedDeviceClass.GenericTracker)
{
- type = "rightController";
+ type = "tracker";
}
- else
+ else if (devClass == ETrackedDeviceClass.TrackingReference)
{
- type = "controller";
+ type = "base";
}
- }
- else if (devClass == ETrackedDeviceClass.GenericTracker)
- {
- type = "tracker";
- }
- else if (devClass == ETrackedDeviceClass.TrackingReference)
- {
- type = "base";
- }
- var item = new[]
- {
+ var item = new[]
+ {
type,
system.IsTrackedDeviceConnected(i)
? "connected"
@@ -452,18 +452,18 @@ private void UpdateDevices(CVRSystem system, ref uint overlayIndex)
(batteryPercentage * 100).ToString(),
poses[i].eTrackingResult.ToString()
};
- _deviceListLock.EnterWriteLock();
- try
- {
- _deviceList.Add(item);
- }
- finally
- {
- _deviceListLock.ExitWriteLock();
- }
+ _deviceListLock.EnterWriteLock();
+ try
+ {
+ _deviceList.Add(item);
+ }
+ finally
+ {
+ _deviceListLock.ExitWriteLock();
+ }
- break;
- }
+ break;
+ }
}
}
}
@@ -761,7 +761,7 @@ internal EVROverlayError ProcessOverlay2(CVROverlay overlay, ref ulong overlayHa
return err;
}
-
+
public override void ExecuteVrFeedFunction(string function, string json)
{
if (_wristOverlay == null) return;
diff --git a/Dotnet/Overlay/VRForm.Designer.cs b/Dotnet/Overlay/VRForm.Designer.cs
index ea20c4d1..b3c12261 100644
--- a/Dotnet/Overlay/VRForm.Designer.cs
+++ b/Dotnet/Overlay/VRForm.Designer.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/Overlay/VRForm.cs b/Dotnet/Overlay/VRForm.cs
index b65c567e..dee5300d 100644
--- a/Dotnet/Overlay/VRForm.cs
+++ b/Dotnet/Overlay/VRForm.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019 pypy. All rights reserved.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
//
// This work is licensed under the terms of the MIT license.
// For a copy, see .
diff --git a/Dotnet/Program.cs b/Dotnet/Program.cs
index ba611328..ecaaf71b 100644
--- a/Dotnet/Program.cs
+++ b/Dotnet/Program.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -107,7 +107,7 @@ private static void ConfigureLogger()
Encoding = System.Text.Encoding.UTF8
};
builder.ForLogger().FilterMinLevel(LogLevel.Debug).WriteTo(fileTarget);
-
+
var consoleTarget = new ConsoleTarget("consoleTarget")
{
Layout = "${longdate} [${level:uppercase=true:padding=-5}] ${logger:padding=-20} - ${message} ${exception:format=tostring}",
diff --git a/Dotnet/SharedVariable.cs b/Dotnet/SharedVariable.cs
index 7bb60cb9..8c9acedb 100644
--- a/Dotnet/SharedVariable.cs
+++ b/Dotnet/SharedVariable.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/StartupArgs.cs b/Dotnet/StartupArgs.cs
index 3892f6a5..3a8ea3e8 100644
--- a/Dotnet/StartupArgs.cs
+++ b/Dotnet/StartupArgs.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -28,7 +28,7 @@ internal class StartupArgs
public static void ArgsCheck()
{
var args = Environment.GetCommandLineArgs();
-
+
Debug.Assert(Program.LaunchDebug = true);
var currentProcessArgs = ParseArgs(args);
@@ -77,7 +77,7 @@ private static VrcxLaunchArguments ParseArgs(string[] args)
if (arg.StartsWith(VrcxLaunchArguments.IsDebugPrefix))
arguments.IsDebug = true;
-
+
if (arg.StartsWith(VrcxLaunchArguments.LaunchCommandPrefix) && arg.Length > VrcxLaunchArguments.LaunchCommandPrefix.Length)
arguments.LaunchCommand = arg.Substring(VrcxLaunchArguments.LaunchCommandPrefix.Length);
@@ -115,7 +115,7 @@ private static bool IsDuplicateProcessRunning(VrcxLaunchArguments launchArgument
{
if (process.Id == Environment.ProcessId)
continue;
-
+
var commandLine = string.Empty;
try
{
diff --git a/Dotnet/Update.cs b/Dotnet/Update.cs
index 7bf45cfa..35acc3a3 100644
--- a/Dotnet/Update.cs
+++ b/Dotnet/Update.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -38,7 +38,7 @@ static Update()
var httpClientHandler = new HttpClientHandler();
if (WebApi.ProxySet)
httpClientHandler.Proxy = WebApi.Proxy;
-
+
httpClient = new HttpClient(httpClientHandler);
httpClient.DefaultRequestHeaders.Add("User-Agent", Program.Version);
}
@@ -47,7 +47,7 @@ public void Init(string appImagePath = "")
{
if (string.IsNullOrEmpty(appImagePath))
return;
-
+
AppImagePath = appImagePath;
AppImagePathOld = appImagePath + ".old";
logger.Info($"AppImagePath: {AppImagePath}");
@@ -57,14 +57,14 @@ public static void Check()
{
if (Process.GetProcessesByName("VRCX_Setup").Length > 0)
Environment.Exit(0);
-
+
if (File.Exists(HashLocation))
File.Delete(HashLocation);
if (File.Exists(TempDownload))
File.Delete(TempDownload);
if (File.Exists(VrcxSetupExecutable))
File.Delete(VrcxSetupExecutable);
-
+
if (File.Exists(UpdateExecutable))
InstallUpdate();
}
@@ -76,7 +76,7 @@ private static void InstallUpdate()
if (Wine.GetIfWine())
setupArguments += "/SKIP_SHORTCUT=true";
#endif
-
+
try
{
if (File.Exists(VrcxSetupExecutable))
@@ -104,7 +104,7 @@ private static void InstallUpdate()
#endif
}
}
-
+
public static async Task DownloadInstallRedist()
{
try
@@ -178,11 +178,11 @@ public static async Task DownloadUpdate(string fileUrl, string fileName, string
File.Delete(TempDownload);
if (File.Exists(HashLocation))
File.Delete(HashLocation);
-
+
var hashesPath = await DownloadFile(hashUrl, _cancellationToken);
if (!string.IsNullOrEmpty(hashesPath))
File.Move(hashesPath, HashLocation);
-
+
await using var destination = File.OpenWrite(TempDownload);
using (var response = await httpClient.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead, _cancellationToken))
await using (var download = await response.Content.ReadAsStreamAsync(_cancellationToken))
@@ -216,7 +216,7 @@ public static async Task DownloadUpdate(string fileUrl, string fileName, string
}
}
destination.Close();
-
+
var data = new FileInfo(TempDownload);
if (data.Length != downloadSize)
{
diff --git a/Dotnet/VRCXStorage.cs b/Dotnet/VRCXStorage.cs
index 0b5da997..2b3a2973 100644
--- a/Dotnet/VRCXStorage.cs
+++ b/Dotnet/VRCXStorage.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/Dotnet/WinApi.cs b/Dotnet/WinApi.cs
index 3466d027..53233f86 100644
--- a/Dotnet/WinApi.cs
+++ b/Dotnet/WinApi.cs
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2022 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
@@ -14,7 +14,7 @@ namespace VRCX
{
public static class WinApi
{
- private static List<(List, string, string)> CpuErrorMessages = new List<(List, string, string)>()
+ private static List<(List, string, string)> CpuErrorMessages = new List<(List, string, string)>()
{
(["Intel", "Core", "-13"], "VRCX has detected that you're using a 13th or 14th generation Intel CPU.\nThese CPUs are known to have issues which can lead to crashes.\nThis crash was unlikely caused by VRCX itself, therefore limited support can be offered.\nWould you like to open a link with more information?", "https://alderongames.com/intel-crashes"),
(["Intel", "Core", "-14"], "VRCX has detected that you're using a 13th or 14th generation Intel CPU.\nThese CPUs are known to have issues which can lead to crashes.\nThis crash was unlikely caused by VRCX itself, therefore limited support can be offered.\nWould you like to open a link with more information?", "https://alderongames.com/intel-crashes"),
@@ -76,13 +76,13 @@ internal static bool HasProcessExited(int processId)
// Fun fact, If a program uses STILL_ACTIVE (259) as an exit code, GetExitCodeProcess will return 259, since it returns... the exit code. This would break this function.
exited = exitCode != 259;
}
- finally
+ finally
{
// Imagine closing process handles.
WinApi.CloseHandle(hProcess);
}
-
-
+
+
return exited;
}
diff --git a/LICENSE b/LICENSE
index 04eff77a..7f96fed6 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2019 pypy & Natsumi
+Copyright (c) 2019-2025 pypy and individual contributors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/src/app.js b/src/app.js
index 8b04307c..f0fd7465 100644
--- a/src/app.js
+++ b/src/app.js
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2024 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/src/app.scss b/src/app.scss
index 5f5165fa..87ae4065 100644
--- a/src/app.scss
+++ b/src/app.scss
@@ -1,7 +1,7 @@
@charset "utf-8";
//
-// Copyright(c) 2019-2021 pypy and individual contributors.
+// Copyright(c) 2019-2025 pypy and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/src/mixins/loginPage.pug b/src/mixins/loginPage.pug
index c7ab8f9f..e3dfe962 100644
--- a/src/mixins/loginPage.pug
+++ b/src/mixins/loginPage.pug
@@ -98,7 +98,7 @@ mixin loginPage
.x-legal-notice-container
div(style='text-align: center; font-size: 12px')
p #[a.x-link(@click='openExternalLink("https://vrchat.com/home/password")') {{ $t('view.login.forgotPassword') }}]
- p © 2019-2024 #[a.x-link(@click='openExternalLink("https://github.com/pypy-vrc")') pypy] & #[a.x-link(@click='openExternalLink("https://github.com/Natsumi-sama")') Natsumi]
+ p © 2019-2025 #[a.x-link(@click='openExternalLink("https://github.com/pypy-vrc")') pypy] & #[a.x-link(@click='openExternalLink("https://github.com/Natsumi-sama")') Natsumi]
p {{ $t('view.settings.general.legal_notice.info') }}
p {{ $t('view.settings.general.legal_notice.disclaimer1') }}
p {{ $t('view.settings.general.legal_notice.disclaimer2') }}
diff --git a/src/mixins/tabs/settings.pug b/src/mixins/tabs/settings.pug
index 4dd93a08..f931e1e7 100644
--- a/src/mixins/tabs/settings.pug
+++ b/src/mixins/tabs/settings.pug
@@ -203,7 +203,7 @@ mixin settingsTab
.options-container(style='margin-top: 45px; border-top: 1px solid #eee; padding-top: 30px')
span.header {{ $t('view.settings.general.legal_notice.header') }}
.options-container-item
- p © 2019-2024 #[a.x-link(@click='openExternalLink("https://github.com/pypy-vrc")') pypy] & #[a.x-link(@click='openExternalLink("https://github.com/Natsumi-sama")') Natsumi]
+ p © 2019-2025 #[a.x-link(@click='openExternalLink("https://github.com/pypy-vrc")') pypy] & #[a.x-link(@click='openExternalLink("https://github.com/Natsumi-sama")') Natsumi]
p {{ $t('view.settings.general.legal_notice.info') }}
p {{ $t('view.settings.general.legal_notice.disclaimer1') }}
p {{ $t('view.settings.general.legal_notice.disclaimer2') }}
diff --git a/src/theme.dark.scss b/src/theme.dark.scss
index 78c85b4a..579945f4 100644
--- a/src/theme.dark.scss
+++ b/src/theme.dark.scss
@@ -1,7 +1,7 @@
@charset "utf-8";
//
-// Copyright(c) 2019-2021 pypy and individual contributors.
+// Copyright(c) 2019-2025 pypy and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/src/vr.js b/src/vr.js
index 76f02860..cd87f80a 100644
--- a/src/vr.js
+++ b/src/vr.js
@@ -1,4 +1,4 @@
-// Copyright(c) 2019-2024 pypy, Natsumi and individual contributors.
+// Copyright(c) 2019-2025 pypy, Natsumi and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.
diff --git a/src/vr.scss b/src/vr.scss
index ee34f954..45637a3b 100644
--- a/src/vr.scss
+++ b/src/vr.scss
@@ -1,7 +1,7 @@
@charset "utf-8";
//
-// Copyright(c) 2019-2021 pypy and individual contributors.
+// Copyright(c) 2019-2025 pypy and individual contributors.
// All rights reserved.
//
// This work is licensed under the terms of the MIT license.