diff --git a/README.md b/README.md index 6645e98..8307320 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # EZPPLauncher -**EZPPLauncher** is a custom launcher for the private osu! server [EZPPFarm](https://ez-pp.farm), built with **Rust** and **Svelte** using the [Tauri](https://tauri.app) framework. -It enhances the osu! experience with quality-of-life features and integration specifically designed for the EZPPFarm community. +**EZPPLauncher** is a modern, feature-rich custom launcher for the private osu! server [EZPPFarm](https://ez-pp.farm), built with **Rust** and **Svelte 5** using the [Tauri](https://tauri.app) framework. +It enhances the osu! experience with quality-of-life features, advanced launcher theming, customized Discord Rich Presence, and seamless server integration. Windows and macOS are supported, with partial support for Linux. --- @@ -13,101 +13,160 @@ It enhances the osu! experience with quality-of-life features and integration sp ## 🚀 Features -- [x] Automatically updates osu! before launching -- [x] Automatically start/stop the OpenTabletDriver Daemon (Windows) -- [x] Automatic ingame login -- [x] Patches the osu! client to show misses in Relax and Autopilot (Windows, Linux and macOS via Wine) -- [x] Displays your EZPPFarm stats in the launcher -- [x] Shows the number of imported beatmapsets -- [x] Shows the number of imported skins -- [x] Displays ping to the EZPPFarm server -- [x] Discord Rich Presence -- [x] Performance Display Overlay (currently in experimental patcher release stream) -- [x] Launcher Theming (API 1.0 bundles and API 2.0 declarative themes) -- [x] Advanced theme editor in its own window with freeform text/image/video/shape layers, custom Svelte 5 component layers with Monaco editing and inline compiler diagnostics, gradient/outline/shadow text effects, multi-select and snapping, a drag-and-drop layer tree with moves into and out of nested groups, layer/group transforms with independent X/Y scale and skew, hover group breadcrumbs, on-canvas layer/group rotate handles plus group move and scale handles, layer/group-linked WHEN/IF/THEN logic with quick navigation, safe advanced rule scripts with expressions, branches and loops, draft recovery, validation and export -- [x] Theme update backups with one-click rollback, plus a trust prompt before running executable API 1.0 themes or API 2.0 themes with custom Svelte layers -- [x] In-app diagnostics for osu!, Wine, the patcher, and the experimental stream's .NET 8 runtime, plus a log-bundle viewer +### Game & Server Integration + +- [x] **Direct Server Launch**: Launches osu! directly with `-devserver ez-pp.farm`, bypassing osu! updater loops and preserving launch parameters. +- [x] **Automatic In-Game Login**: Automatically signs into your EZPPFarm account upon game boot. +- [x] **In-Game Relax & Autopilot Miss Patcher**: Injects a hook into the osu! client to display misses in Relax and Autopilot modes (Windows, macOS via Wine, and partially on Linux via osu-winello). +- [x] **Live Player Stats**: Displays rank, PP, accuracy, playcount, and server latency directly on the launcher dashboard. +- [x] **Library Indexing**: Automatically counts imported beatmapsets and skins. +- [x] **OpenTabletDriver Integration**: Automatically starts and stops the OpenTabletDriver daemon on launch/exit (Windows only). +- [x] **Performance Display Overlay**: In-game HUD overlay (available in the experimental patcher stream). + +### Visual Theme Engine v2 & In-App Studio + +- [x] **Declarative Theme API 2.0**: Modern JSON schema supporting background videos, audio, Lottie animations, and layered widgets without custom compilation. +- [x] **Dedicated Visual Theme Editor**: Standalone resizable window with a full-featured visual canvas, live preview, and multi-element selection. +- [x] **Custom Svelte 5 Component Layers**: Embed custom reactive Svelte 5 components with an integrated **Monaco code editor** and live compiler diagnostics. +- [x] **Canvas Transform Tooling**: Multi-selection, snapping, freeform rotation, X/Y scale, skew, and group breadcrumb navigation. +- [x] **Logic & Scripting System**: Visual WHEN/IF/THEN rule builder and sandboxed rule scripting (expressions, branches, loops, visibility toggles) without `eval`. +- [x] **Dynamic Placeholders & Clock Expressions**: Real-time variables (`{username}`, `{rank}`, `{pp}`) and second-accurate clock variables (`{time}`, `{hour}`, `{minute}`). +- [x] **Typography & Icon Families**: Gradient fills, outlines, drop shadows, custom `@fontsource` webfonts, and bundled Lucide, Phosphor, and Tabler icon catalogs. +- [x] **Backup & Rollback System**: Automatic versioned theme snapshots with one-click restoration, plus security trust prompts for executable components. + +### Discord Rich Presence Studio + +- [x] **Dedicated Presence Editor Window**: In-app studio to customize your Discord presence. +- [x] **Interactive Discord Embed Preview**: Real-time visual mockup mirroring Discord's user profile popout card. +- [x] **Dynamic Placeholders**: Interpolate live stats (`{username}`, `{rank}`, `{pp}`, `{accuracy}`, `{playcount}`, `{version}`) into details, state, and asset tooltips. +- [x] **Custom Action Buttons & Presets**: Configurable buttons linking to player profiles, leaderboards, or custom URLs, plus quick presets (Default, Grinding, Competitive, Relax, AFK). + +### Diagnostics, Logging & System Tools + +- [x] **In-App Diagnostics Panel**: Validates osu! folder integrity, write permissions, Wine runtimes, .NET 8 desktop runtime, FFmpeg, and patcher status. +- [x] **Multi-Stream Log Viewer**: Dedicated rotating logs (`launcher.log`, `osu.log`, `patcher.log`) with session bundling, zip archive export, and an in-app viewer. +- [x] **macOS Wine Automation**: Automatic font registry sanitization (eliminating GDI+ `AccessViolationException` crashes), Wine prefix management, and automated in-place patcher bytecode patching for .NET 4.0 runtimes under Wine. +- [x] **Hardware-Accelerated Media Server**: Local HTTP range streaming server on macOS and Linux for smooth, low-memory WebM and MP4 video playback. --- ## 💻 Supported Platforms -| Platform | Status | -| -------- | ------------------------------------------------------ | -| Windows | ✅ Supported | -| macOS | 🕧 Partially supported (via Wineskin/Whisky/CrossOver) | -| Linux | 🕧 Partially supported (via osu-winello) | +| Platform | Status | Runtime / Environment | +| -------- | ---------------------- | ---------------------------------------------------------- | +| Windows | ✅ Supported | Native Win32 | +| macOS | ✅ Supported | Wine wrapper (Wineskin, Whisky, CrossOver, or system Wine) | +| Linux | 🕧 Partially Supported | Wine / Proton (via osu-winello / wmctrl) | -> **Windows** remains the fully supported platform. OpenTabletDriver is Windows-only. On macOS, -> in-game patching runs the Windows patcher through the same Wine prefix as osu!. The stable -> patcher stream needs no extra runtime; the experimental stream needs the .NET 8 Desktop Runtime -> installed in that prefix. - -### macOS - -osu! stable is a Windows build, so on macOS it runs inside a Wine wrapper. EZPPLauncher -supports Wineskin wrappers (the usual `osu!.app` wine skin), Whisky bottles and CrossOver -bottles. - -The setup wizard automatically looks for Wineskins in `/Applications` and `~/Applications`. -If detection fails, choose **Browse** and pick the `osu!.app` wrapper itself (or a Wine prefix -folder); the launcher resolves the osu! installation inside it, so there is no need to open the -bundle's package contents. - -Large VP8/VP9/AV1 theme videos are transcoded once to a cached 720p H.264/AAC file so WebKit -can use the Mac's hardware decoder. The first large video triggers a one-time (~63 MB) download -of a signed static FFmpeg 9.0.2 build from `ffmpeg.martin-riedl.de` into `~/.ezpplauncher/bin`; -the launcher verifies its pinned SHA-256 and makes it executable. The managed build requires -macOS 12 or newer. If the download fails, a system FFmpeg (Homebrew or MacPorts) is used; without -either, themes still load but large WebM videos remain on WebKit's software decoder and may -stutter. Theme authors can also ship an H.264/MP4 version alongside the WebM. +> **Windows** and **macOS** are fully supported. **Linux is partially supported**: osu! must be managed through external community tooling ([`osu-winello`](https://github.com/NelloKudo/osu-winello)), window tracking requires `wmctrl`, OpenTabletDriver automation is unavailable, and the launcher is restricted to the stable patcher stream. --- -## 🪵 Logs +### 🍎 macOS Integration Details -Launcher, osu! and patcher output is written to `.ezpplauncher/logs` in your home folder: +osu! stable is a 32-bit Windows application, so on macOS it runs inside a Wine-based wrapper. EZPPLauncher natively supports **Wineskin wrappers** (the standard `osu!.app` bundle), **Whisky bottles**, and **CrossOver bottles**. -| File | Contents | -| -------------- | -------------------------------------------------------------- | -| `launcher.log` | Launcher lifecycle, webview console output and uncaught errors | -| `osu.log` | osu! and osu! updater output, including stdout/stderr | -| `patcher.log` | Patcher output, including stdout/stderr | +- **Automatic Wrapper Detection**: The setup wizard automatically searches `/Applications` and `~/Applications` for existing Wineskin bundles and Wine prefixes. If choosing **Browse**, selecting the `osu!.app` bundle directly resolves the underlying prefix without needing to navigate inside "Show Package Contents". +- **Wine Prefix Font Fix**: macOS system font enumeration under Wine GDI+ can crash osu! on cold start with an `AccessViolationException` when reading Apple Braille fonts. EZPPLauncher automatically detects and cleans incompatible font entries from the prefix registry (`user.reg` / `system.reg`). +- **Updater Loop Prevention**: Abnormal game exits can leave behind `.require_update`, `help.txt`, or `_pending` folders that cause `osu!.exe` to boot into the Bancho updater and lose command-line parameters. The launcher purges these markers before launch to ensure the `-devserver ez-pp.farm` flag is always preserved. +- **Automated Patcher Bytecode Patching**: The Windows patcher (`osu!.patcher.exe`) targets .NET 4.5+ and embeds `ManagedInjector.Lib`. In Wine prefixes using the .NET Framework 4.0 runtime, generic `Marshal.SizeOf()` and `Marshal.PtrToStructure()` methods do not exist, and redirected standard I/O causes `Console.ReadKey()` crashes. EZPPLauncher automatically inspects and patches the patcher binary and its embedded Costura assemblies in-place, enabling seamless injection into the running game process under Wine. +- **Hardware-Accelerated Theme Media**: Large VP8/VP9/AV1 theme videos are automatically transcoded to hardware-decoded H.264/AAC. The launcher manages a sandboxed static FFmpeg build in `~/.ezpplauncher/bin` (with fallback to system FFmpeg). Theme assets are served over an internal loopback server supporting HTTP range requests to minimize memory consumption. +- **Native macOS Window Rounding**: Native Cocoa window clipping applies rounded corners and transparent borders to the Tauri window. -A file is only created when that stream actually writes a line. On each new session, or when -any file reaches 5 MiB, all three active files are bundled into a single -`logs__