diff --git a/.gitignore b/.gitignore index c218176a..23641831 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,6 @@ installer/Output/* !LICENSE !docs/ !RustPlusDesktop/*.png -!RustPlusDesktop/*.jpg \ No newline at end of file +!RustPlusDesktop/*.jpg +RustPlusDesktop/RustPlusDesk_lbvqmzga_wpftmp.csproj +RustPlusDesktop/Setup.iss diff --git a/3.1.0.png b/3.1.0.png new file mode 100644 index 00000000..2e178042 Binary files /dev/null and b/3.1.0.png differ diff --git a/App-Version3.png b/App-Version3.png new file mode 100644 index 00000000..51cb92fa Binary files /dev/null and b/App-Version3.png differ diff --git a/LICENSE.txt b/LICENSE similarity index 100% rename from LICENSE.txt rename to LICENSE diff --git a/README.md b/README.md index 171d5c79..996b1648 100644 --- a/README.md +++ b/README.md @@ -1,96 +1,446 @@ +![Headline](./headlineGIT.jpg) + +[![Donate](./donate.png)](https://www.patreon.com/c/Pronwan) + + # Rust+ Desktop App (Unofficial) + + ⚠️ **Note**: This is an **unofficial** project and is not affiliated with Facepunch Studios or the game *Rust*. + It is open source so anyone can verify there is **no malware or hidden components**. +⚠️ **Note**: If you used it for a while and can't pair new servers anymore, simply click on the Pairing button with right mouse button and select to delete the config file. + --- + ## 🔍 What is this? + + The **Rust+ Desktop App** is a Windows application built on the official Rust+ Companion API. + It lets you pair Rust servers, monitor in-game events, control Smart Devices, and view dynamic map markers — all on your PC. +By now it's more than 'just' Rust Plus. It's Rust² you could say... That's why this is our new icon ;) Was about time. +![Update](./icon.png) + The app ships as a single installer (bundling .NET, Node.js, WebView2 runtime, RustPlusAPI, etc.), so you don’t have to install dependencies manually. + + --- + + ## 🚀 Latest Release + + ➡️ **[Download the latest RustPlusDesk-Setup.exe](../../releases/latest)** -*(We publish the signed/packaged installer as a GitHub Release asset for clean versioning and smaller repositories.)* + +*(I publish the signed/packaged installer as a GitHub Release asset for clean versioning and smaller repositories.)* + +[![YouTube Video](./RustPlus_V4_Thumbnail.png)](https://youtu.be/tmbAn3lIKmM) +*(click the image to watch on YouTube)* + +## Update 4.2 — Cargo Ship Overhaul (May 5th) +grafik + +**🚢 Smart Cargo Tracking** + +- Route Learning: After the first full Cargo cycle, the app remembers docking times, total map life, and trigger points — saved per server and map wipe, resets automatically after a wipe. +- Docking Countdown: A live countdown appears below the Cargo Ship while it's anchored at harbor. Docking duration is learned per server; the default fallback is 8 minutes. +- Remaining On-Map Timer: Once a full cycle is tracked, a remaining-time countdown is shown in the Event Dock and on the Cargo Ship marker. +grafik + +**💬 Cargo Chat Notifications** +grafik +- Arrival Warning: Team chat alert ~5 minutes before Cargo docks at the next harbor (requires a learned route). +- Docking Alert: Notification when Cargo anchors at a harbor. +- Departure Warning: Notification 5 minutes before Cargo leaves. +- All three can be toggled individually via right-click on the Chat Alerts button. + +**🛢️ Oil Rig Crate Countdown** +- The app detects when a Chinook hovers over an Oil Rig and automatically starts a crate countdown on the map. +grafik + + +## Update 4.1.0 - Crosshair Editor (Right Click Crosshair icon to access) (May 1st) + +**𖦏 Custom Crosshairs** +- **Draw your own**: intuitive pixel-art style editor. Supports drawing tools (Pen, Pixel, Line, Square, Circle), custom colors, adjustable thickness and opacity, and full Undo/Redo support. +- **Upload PNGs**: Upload existing PNG images to use as crosshairs. The editor automatically scales them to fit the pixel grid. You can also right-click to erase individual pixels and easily rename or delete your creations. +![CrosshairEditor](./RustPlusDesktop/Screenshots/v4_5.png) +--- + +## Update 4.0.0 - The Evolution Update | Major Map & Stability Overhaul (April 30th) + +**🚀 Key Highlights** +- **Rebuilt Core Architecture**: A massive refactoring of over 4,000 lines of code into a modular system, ensuring the app is faster and future-proof. +- **"Dead Reckoning" Resilience**: Markers and shops no longer disappear during brief server lags. The app now uses predictive interpolation to keep player and event icons moving smoothly even when data is delayed. +- **Interactive Event Dock**: A new real-time sidebar for active events (Patrol Heli, Cargo Ship, Chinook, etc.). Click any event to **auto-lock and track** it dynamically across the map. +- **Smart Shop Clustering**: Multiple vending machines in one base are now grouped into clean cluster icons. Hovering over them reveals a redesigned, scrollable list of all items without map clutter. + +![V4 Map Overhaul](./RustPlusDesktop/Screenshots/v4_map_overhaul.png) + +**🛠 Improvements** +- **60 FPS Map Animations**: Butter-smooth zooming and panning with a new cinematic "Overview Dip" when jumping across the map. +- **Modern Shop Search**: Powered by WebView2, the new search interface is near-instant and includes advanced arbitrage (Profit Trades) and pathfinding tools. +- **Offline Icon Caching**: All item icons are now securely cached locally using SHA1 hashes, making map loads instant and saving massive bandwidth. +- **Flexible UI**: Added a GridSplitter for a resizable sidebar and the ability to hide the system console to maximize map space. + +**🙌 Special Thanks** +This milestone release was made possible by the incredible contribution of **[JawadYzbk](https://github.com/JawadYzbk)**, who rebuilt the core architecture and implemented the advanced map features! --- +## Update 3.5.0 - Player Intelligence & Background Ops (April 22nd) +**🚀 New Features** +- **Advanced Activity Intelligence**: Introducing a full-scale player tracking system! View 12-week GitHub-style activity grids and 24-hour heatmaps to predict when your enemies (or friends) are most likely to be online or sleeping. +- **Background Operations**: The app can now reside in your System Tray. Collect player data 24/7 without having the main window open. +- **Single Instance Management**: Launching the app via `rustplus://` links or a second desktop shortcut now automatically focuses your already running instance. +- **Auto-Start**: New option to launch the app minimized with Windows, so your tracking database is always up to date. + +**🛠 Improvements & Fixes** +- **Battlemetrics Accuracy**: Completely overhauled server identification. Fixed an issue where servers on shared IP ranges (like Rustoria) were sometimes incorrectly identified. +- **Tray Menu**: Dynamic tray context menu showing current tracking status and last update time. + +**🙌 Special Thanks** +A massive shout-out to [JawadYzbk](https://github.com/JawadYzbk) for contributing this entire intelligence system and background logic! + +## Update 3.4.0 - Custom Alarms & Device Grouping (April 26) +**🚀 New Features** +- Customizable Smart Alarms: You can now set individual popup alerts and custom audio files. Perfect for turning up the volume and getting woken up specifically for Raids! +- Smart Device Groups: Organize your setup by merging devices into groups. You can rename these groups and control multiple devices simultaneously with a single click (bringing the power of hotkeys to the UI). + +**🛠 Improvements** +- Enhanced Team Uploads: Device uploads for team members now fully support hierarchical group structures. No matter how many devices you manage, everything stays organized and easy to navigate. + +## Update Notes 3.3.1 (February 16th 26) +- **New Pre Deep Sea Notification:** Before Deep Sea is triggered, you can get a notification in Team Chat (around 3 minutes ahead of actual spawn) -> note that the direction will always be shown in West - this is not the actual spawn location. It's just coming from the fact that Deep Sea shops have negative X-coordinates. +- **Stability Patch:** Even on weak servers the connection should now be more stable and smart devices should work more reliably. Reduced duplicate chat fetches, made shop search and shops more stable with caching icons to local drive. + +## Update Notes 3.3.0 (January 18th 26) +- **New Oilrig Countdown:** When Oilrig is triggered, a crate icon with the remaining time appears on the map. Optional Team Chat notifications remind your team every 5 minutes until the crate unlocks. +- **Leader Auto-Promote:** No more AFK leaders! Team members can now type `!leader` in chat to be instantly promoted to team leader (requires current leader to have the app open). + +## Update Notes 3.2.1 (November 21st 25) +- You can now share Smart Devices with your team! No more pairing in-game needed. + One guy who pairs the devices is enough - rest of the team just imports with 1 click. + +## Update Notes 3.1.2 (November 17th 25) +Version 3.1.2 brings full Storage Monitor integration and the following optimizations: +![Update](./3.1.0.png) +- Shop alerts now also trigger when item was sold out and then comes back online +- Storage Monitor shows traffic light upkeep indicator (from 1 hr. and less) +- Map can be zoomed with NUM +/- +- No duplicate chat notifications when server had been desynced for a short amount of time + +## Update Notes 3.0.0 (October 30th 25) +- FULL Shop Analytics Overhaul! + This comes with instant check for profit trades, trade route check (Buy X for Y) and more +- Map Overlay + You can draw, set markers, share your map markers with team mates +- Shop Alarm system + Get alerts (in chat or audio alerts) when a new shop pops up or when a suspicious shop disappeared or when your desired item is back in stock +- new Patch Notes Button with all new features explained + +... and more + + +## Update Notes 2.0.5 (October 6th 25) +- Global Device Hotkeys are here! Assign one key to multiple devices to group them together. +- new Update Button (Bug: reads current version as 0.0.0 so it will always find an update - will be fixed in the future) +- new Pairing possibility through Edge Browser + better Logs +- Mini Map Overlay for ingame use +- Crosshair Overlay +- Team Management +- Camera Support +- Promoting Teammember to Leader +- Death Markers +- Grid Corrections +- Notifications in Chat for Deaths, Spawns, Online, Offline +- added fetching icon symbols from rusthelp.com (including Blueprint Fragments) + +![Update](./V2-1.png) +![Update](./V2-2.png) +![Update](./V2-3.png) + +Enjoy! :) +--- + + + ## ✨ Features + + - Pair Rust servers via Steam + Rust+ Companion +- **Player Activity Intelligence: 12-week heatmaps & 24h activity forecasts** +- **Persistent Background Tracking & System Tray integration** +- **Single Instance Management (Named Pipes)** +- Share Smart Devices and device groups with your Team +- Track Storage Monitors and Upkeep Time - Auto-start listener when connecting to a server -- Dynamic map (Cargo, Patrol Heli, Airdrops, Players, …) +- Dynamic map (Cargo, Patrol Heli, Chinook, Travelling Vendor, Players, …) - Smart Devices (pair in-game while connected — shows up instantly) -- Local storage of paired servers & devices +- Local storage of paired servers & devices, map overlays +- Vending Machine Search System for Buy and Sell orders +- Profit Trade analytics and deep trade route search (buy X for Y) - Open-source for transparency and trust - Team Chat support and event spawn posts to chat +- Camera Support (no pannable cams yet) +- Mini Map and Crosshairs as Rust Overlay +- Death Markers +- Profile Icons +- Chat-Notifications for spawns, shops, deaths, events and more --- + + ## 🐞 Known Issues -- **Chat crash**: Opening the chat while not connected to a server will crash the app + - **Mixed languages**: Some UI texts may still show in German if a translation was missed + +- **Server-Hopping:**: Hopping through servers too quickly can cause the Listener to crash + +- **Many shops**: Hovering 8+ shops at once can cause the Tooltip to flicker + - Please report other issues in the [Issues section](../../issues) --- + + ## 🛠️ Installation & Setup + + 1. **Download & install** + - Get the installer from **[Releases](../../releases/latest)** and run it -2. **First run** - - A browser popup will ask you to authorize your Steam account + + +2. **First run** + + - Click Pairing (Listening) to start the initial setup of the Listener. + ⚠️ **IMPORTANT**: IF error message pops up, please restart the app, rightclick on the button and click on "Try Pairing with Edge". + + - A browser popup will ask you to **pair with Companion** (Facepunch) + + let it run until it's set up (needed only once) + + - Click on "**Login with Steam**" and authorize your local PC to Steam (localhost) + - Allow the connection → your Steam account is linked -3. **Pair a server** + + +4. **Pair a server** + - In the app, click **Listening (Pairing)** + - In *Rust*, click the **Rust+ Pairing Link** + - The server will appear automatically in the app -4. **Connect** + + +5. **Connect** + - Select the server and click **Connect** + - Future sessions won’t require another Steam login -5. **Smart Devices** - - While connected, pair a device in-game → it appears instantly in the app +6. **Smart Devices** + + - While connected, pair a device or server in-game → it appears instantly in the app + +7. **If the FCM Listener won't start after a while of using the app** + - you probably have to do the Pairing Process again. + - Rightclick the Pairing button and select "Delete Config + Pair". + - That's it. + +8. **Alternative manuall pairing** + - You can do the pairing manually through PowerShell. + + - Open PowerShell, + - Go to your installation folder (e.g. -> a: -> cd programs -> cd RustPlusDesk) + - Then copy paste this Power Shell code to the console. (Press enter twice) This should pair manually and open a popup in browser: + +$node = ".\runtime\node-win-x64\node.exe" +$cli = "$env:LOCALAPPDATA\RustPlusDesk\runtime\rustplus-cli\node_modules\@liamcottle\rustplus.js\cli\index.js" +$cfg = "$env:APPDATA\RustPlusDesk\rustplusjs-config.json" + +if (!(Test-Path $cli)) { + $zip = ".\runtime\rustplus-cli.zip" + $dst = "$env:LOCALAPPDATA\RustPlusDesk\runtime\rustplus-cli" + New-Item -ItemType Directory -Force -Path $dst | Out-Null + Expand-Archive -Path $zip -DestinationPath $dst -Force +} + +& $node $cli fcm-register --config-file "$cfg" + +## 🛠️ Why initial NCM registration is required: +
+ NCM Registration Explanation +On first launch, the app needs to establish a connection to the Rust+ Companion API. +For this, a bundled Node.js process (rustplus-cli) is started, which takes care of two things: + +**Registration with Facepunch/Steam** + + - Opens a browser window to the official Rust+ Companion login page. + + - After logging in with Steam, an auth token is generated and passed back to the app. + + - This token is saved in the app’s config file so the process only needs to be done once per installation. + +**Local listener for callbacks and notifications** + + - The Node process starts a small HTTP server on localhost: to receive the auth token. + + - Afterwards, it continues running as a background listener to receive notifications (chat, alarms, events) via Google FCM and forward them to the app. + +**Requirements for successful registration** + + - Node.js runtime and rustplus-cli are shipped with the app – no manual installation required. + + - Firewall/Antivirus must not block the Node process: + + - Local loopback (127.0.0.1) must be accessible for the callback port. + +**Outbound connections must be allowed on:** + + - TCP 5228–5230 (Google FCM, mtalk.google.com) + + - TCP 443 (HTTPS to Steam, Facepunch, Google) + + - Browser redirect must be allowed (some security tools or proxies may block it). + + - A valid Steam login is required to complete the auth flow. + +**👉 After successful registration, the token is stored at** +%APPDATA%\RustPlusDesk\rustplusjs-config.json. +You only need to re-register if this file is missing or corrupted. +
+ +
+🔧 Troubleshooting Registration + +If the initial pairing does not work (no browser window opens, or it keeps restarting): + +- **Check if Node is running** + - Open *Task Manager* → *Details* → look for `node.exe`. + - Or run: + ```powershell + tasklist | findstr node.exe + ``` + +- **Check if a local port is listening** + - Run: + ```powershell + netstat -ano | findstr LISTENING | findstr 127.0.0.1 + ``` + - You should see a `127.0.0.1:` entry with the same PID as `node.exe`. + - If not: Firewall or antivirus may be blocking the local callback server. + +- **Check outbound connections** + Test if the required ports are open: + ```powershell + Test-NetConnection mtalk.google.com -Port 5228 + Test-NetConnection companion-rust.facepunch.com -Port 443 + Test-NetConnection steamcommunity.com -Port 443 + All should return TcpTestSucceeded : True +- **Config reset** +If all else fails, close the app and delete: +%APPDATA%\RustPlusDesk\rustplusjs-config.json +On next launch the registration will run again. +
--- + + ## 📸 Screenshots -### Main Backgrounds + + +### Main Screenshots + ![Main Background](./RustPlusDesktop/rustplusbg.png) + ![Background 2](./RustPlusDesktop/rustplusbg2.png) + ![Background 3](./RustPlusDesktop/rustplusbg3.png) + ![Background 4](./RustPlusDesktop/rustplusbg4.png) + ![Background 5](./RustPlusDesktop/rustplusbg5.png) + ![Background 6](./RustPlusDesktop/rustplusbg6.png) + ![Background 7](./RustPlusDesktop/rustplusbg7.png) + ![Background 8](./RustPlusDesktop/rustplusbg8.png) + + ### Video Overview + [![YouTube Video](./RustPlusDesktop/rustplusbg.png)](https://www.youtube.com/watch?v=4NlFuLPK4wk) + *(click the image to watch on YouTube)* + + --- + + ## 📜 License -Licensed under the [MIT License](./LICENSE). -You may use, modify, and redistribute the software as long as the copyright notice is preserved. + + +This project is licensed under the [GNU GPLv3](./LICENSE). + +SPDX-License-Identifier + +GPL-3.0-or-later + + + +## Release Checksum: + +SHA256-Hash von RustPlusDesk-Setup.exe: + +5991535374198c10a7e38748d5c698c5a69df8305ace397afc6d52fd479bf480 --- + + ## 🙌 Contributing + + Found a bug or want to help? -Open an [Issue](../../issues) or create a Pull Request. \ No newline at end of file + +Open an [Issue](../../issues) or create a Pull Request. + + + +## Support? + + + +Sure, why not :) + +**https://streamelements.com/pronwan/tip** + diff --git a/RustPlusDesktop/AlarmPopupWindow.xaml b/RustPlusDesktop/AlarmPopupWindow.xaml index 6db4f436..a4333590 100644 --- a/RustPlusDesktop/AlarmPopupWindow.xaml +++ b/RustPlusDesktop/AlarmPopupWindow.xaml @@ -1,31 +1,113 @@ - - - - - + - + \ No newline at end of file diff --git a/RustPlusDesktop/Converters/ItemsCountConverter.cs b/RustPlusDesktop/Converters/ItemsCountConverter.cs new file mode 100644 index 00000000..2a655416 --- /dev/null +++ b/RustPlusDesktop/Converters/ItemsCountConverter.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections; +using System.Globalization; +using System.Windows.Data; + +namespace RustPlusDesk.Converters +{ + public sealed class ItemsCountConverter : IValueConverter + { + public object Convert(object value, Type t, object p, CultureInfo c) + { + if (value is System.Collections.IEnumerable e) { int n = 0; foreach (var _ in e) n++; return n; } + return 0; + } + public object ConvertBack(object v, Type t, object p, CultureInfo c) => Binding.DoNothing; + } +} \ No newline at end of file diff --git a/RustPlusDesktop/Converters/KindToStorageVisibilityConverter.cs b/RustPlusDesktop/Converters/KindToStorageVisibilityConverter.cs new file mode 100644 index 00000000..f7eca525 --- /dev/null +++ b/RustPlusDesktop/Converters/KindToStorageVisibilityConverter.cs @@ -0,0 +1,21 @@ +// using System; +// using System.Globalization; +// using System.Windows; +// using System.Windows.Data; +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +namespace RustPlusDesk.Converters { +public sealed class KindToStorageVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) + { + var k = value as string; + return (string.Equals(k, "StorageMonitor", StringComparison.OrdinalIgnoreCase) || + string.Equals(k, "Storage Monitor", StringComparison.OrdinalIgnoreCase)) + ? Visibility.Visible : Visibility.Collapsed; + } + public object ConvertBack(object v, Type t, object p, CultureInfo c) => Binding.DoNothing; +} +} \ No newline at end of file diff --git a/RustPlusDesktop/Converters/StorageChipConverter.cs b/RustPlusDesktop/Converters/StorageChipConverter.cs new file mode 100644 index 00000000..aff0b4a7 --- /dev/null +++ b/RustPlusDesktop/Converters/StorageChipConverter.cs @@ -0,0 +1,62 @@ +using RustPlusDesk.Models; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Data; + +namespace RustPlusDesk.Converters +{ + public sealed class StorageChipConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not StorageSnapshot snap) + return string.Empty; + + // TC: immer Upkeep – egal ob 0 oder >0 + if (snap.IsToolCupboard) + { + var secs = snap.UpkeepSeconds ?? 0; + + // Sonderfall: 0 → mit Prefix "Upkeep: 0s" + if (secs <= 0) + return "Upkeep: 0s"; + + // Ab hier: nur noch kompakte Dauer ohne "Upkeep:" + int days = secs / 86400; + int rem = secs % 86400; + int hours = rem / 3600; + rem = rem % 3600; + int mins = rem / 60; + int secsLeft = rem % 60; + + var parts = new List(); + + if (days > 0) + parts.Add($"{days}d"); + if (hours > 0) + parts.Add($"{hours}h"); + if (mins > 0) + parts.Add($"{mins}m"); + + // Falls alles auf 0, aber >0 Sekunden übrig, z. B. 45s + if (parts.Count == 0 && secsLeft > 0) + parts.Add($"{secsLeft}s"); + + // Sicherstellen, dass wir überhaupt etwas anzeigen + if (parts.Count == 0) + parts.Add("0s"); + + return string.Join(" ", parts); + } + + // Alles andere: Boxen, Container → Items + var count = snap.ItemsCount; + return count == 1 ? "1 item" : $"{count} items"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => throw new NotSupportedException(); + } +} + diff --git a/RustPlusDesktop/Converters/UpkeepBackgroundConverter.cs b/RustPlusDesktop/Converters/UpkeepBackgroundConverter.cs new file mode 100644 index 00000000..d61579a7 --- /dev/null +++ b/RustPlusDesktop/Converters/UpkeepBackgroundConverter.cs @@ -0,0 +1,53 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Media; +using RustPlusDesk.Models; // falls SmartDevice hier liegt + +namespace RustPlusDesk.Converters +{ + using System; + using System.Globalization; + using System.Windows.Data; + using System.Windows.Media; + using RustPlusDesk.Models; // wo StorageSnapshot liegt + + public class UpkeepBackgroundConverter : IValueConverter + { + private static readonly Brush DefaultBrush = + new SolidColorBrush(Color.FromArgb(0x33, 0x40, 0xA0, 0x70)); // dein #3340A070 + + private static readonly Brush OrangeBrush = + new SolidColorBrush(Color.FromArgb(0x66, 0xFF, 0xA5, 0x00)); // transparentes Orange + + private static readonly Brush RedBrush = + new SolidColorBrush(Color.FromArgb(0x66, 0xFF, 0x44, 0x44)); // transparentes Rot + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + // Wir erwarten hier direkt den StorageSnapshot + if (value is not StorageSnapshot snap) + return DefaultBrush; + + // Nur richtige TCs einfärben + if (!snap.IsToolCupboard) + return DefaultBrush; + + var secs = snap.UpkeepSeconds ?? 0; + + // 0 → Rot + if (secs <= 0) + return RedBrush; + + // < 1 Stunde → Orange + if (secs < 3600) + return OrangeBrush; + + // sonst Standard + return DefaultBrush; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => Binding.DoNothing; + } +} \ No newline at end of file diff --git a/RustPlusDesktop/Corel Auto-Preserve/TitleScreen-rust-plus-desktop.png b/RustPlusDesktop/Corel Auto-Preserve/TitleScreen-rust-plus-desktop.png new file mode 100644 index 00000000..dec3274c Binary files /dev/null and b/RustPlusDesktop/Corel Auto-Preserve/TitleScreen-rust-plus-desktop.png differ diff --git a/RustPlusDesktop/Corel Auto-Preserve/TitleScreen-rust-plus-desktop2.png b/RustPlusDesktop/Corel Auto-Preserve/TitleScreen-rust-plus-desktop2.png new file mode 100644 index 00000000..b791e5e5 Binary files /dev/null and b/RustPlusDesktop/Corel Auto-Preserve/TitleScreen-rust-plus-desktop2.png differ diff --git a/RustPlusDesktop/Corel Auto-Preserve/V2-1.png b/RustPlusDesktop/Corel Auto-Preserve/V2-1.png new file mode 100644 index 00000000..43012c59 Binary files /dev/null and b/RustPlusDesktop/Corel Auto-Preserve/V2-1.png differ diff --git a/RustPlusDesktop/Corel Auto-Preserve/donate.png b/RustPlusDesktop/Corel Auto-Preserve/donate.png new file mode 100644 index 00000000..c690741e Binary files /dev/null and b/RustPlusDesktop/Corel Auto-Preserve/donate.png differ diff --git a/RustPlusDesktop/CrosshairEditorWindow.xaml b/RustPlusDesktop/CrosshairEditorWindow.xaml new file mode 100644 index 00000000..be04cb83 --- /dev/null +++ b/RustPlusDesktop/CrosshairEditorWindow.xaml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +