From 481e5439c3787f4068785ea601477c01d044958e Mon Sep 17 00:00:00 2001 From: Natsumi Date: Fri, 31 Jan 2025 16:38:25 +1300 Subject: [PATCH] Update copyright year --- Dotnet/AppApi/Cef/AppApiCef.cs | 22 +-- Dotnet/AssetBundleManager.cs | 21 +-- Dotnet/Cef/CefCustomDownloadHandler.cs | 2 +- Dotnet/Cef/CefCustomMenuHandler.cs | 2 +- Dotnet/Cef/CefNoopDragHandler.cs | 2 +- Dotnet/Cef/MainForm.Designer.cs | 2 +- Dotnet/Cef/MainForm.cs | 2 +- Dotnet/Discord.cs | 6 +- Dotnet/IPC/IPCClient.cs | 4 +- Dotnet/IPC/IPCServer.cs | 4 +- Dotnet/JsonFileSerializer.cs | 2 +- Dotnet/LogWatcher.cs | 34 ++--- Dotnet/Overlay/OffScreenBrowser.cs | 14 +- Dotnet/Overlay/OffScreenBrowserLegacy.cs | 4 +- Dotnet/Overlay/SystemMonitor.cs | 16 +-- Dotnet/Overlay/VRCXVR.cs | 162 +++++++++++------------ Dotnet/Overlay/VRCXVRLegacy.cs | 150 ++++++++++----------- Dotnet/Overlay/VRForm.Designer.cs | 2 +- Dotnet/Overlay/VRForm.cs | 2 +- Dotnet/Program.cs | 4 +- Dotnet/SharedVariable.cs | 2 +- Dotnet/StartupArgs.cs | 8 +- Dotnet/Update.cs | 20 +-- Dotnet/VRCXStorage.cs | 2 +- Dotnet/WinApi.cs | 10 +- LICENSE | 2 +- src/app.js | 2 +- src/app.scss | 2 +- src/mixins/loginPage.pug | 2 +- src/mixins/tabs/settings.pug | 2 +- src/theme.dark.scss | 2 +- src/vr.js | 2 +- src/vr.scss | 2 +- 33 files changed, 258 insertions(+), 257 deletions(-) diff --git a/Dotnet/AppApi/Cef/AppApiCef.cs b/Dotnet/AppApi/Cef/AppApiCef.cs index 4986b26b2..7e8cd79b3 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 8213c1471..49c0b5980 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 3a43b02cb..0a1293dc3 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 127b572f6..45e0fd7e5 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 9d19a7a03..7fd275730 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 683d2fe47..18cee64c7 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 fa28b3af9..abc956788 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 28d616585..0a4023ad7 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 6f5dcc94e..f1f04b297 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 cfbce27e6..91ae1c31c 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 c3fbcc44e..5be564eeb 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 7fd52cb5b..b63c993dc 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 c3aa07684..92386d9ab 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 cd17ce010..2b408b86f 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 d41b1f485..5cebbe97a 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 31b2e956f..cef37fee1 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 d2067d038..69c87677d 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 ea20c4d10..b3c122619 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 b65c567ec..dee5300d8 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 ba6113282..ecaaf71b9 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 7bb60cb95..8c9acedb8 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 3892f6a53..3a8ea3e83 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 7bf45cfaf..35acc3a30 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 0b5da9975..2b3a29732 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 3466d0272..53233f864 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 04eff77ab..7f96fed6f 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 8b04307c6..f0fd74654 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 5f5165fa8..87ae40655 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 c7ab8f9f4..e3dfe962e 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 4dd93a085..f931e1e70 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 78c85b4af..579945f4d 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 76f02860b..cd87f80a7 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 ee34f9542..45637a3bb 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.