From 7f89dba5f81e48ea0daf2f0cde63e77cc1127e24 Mon Sep 17 00:00:00 2001 From: HeagBoKaT Date: Sat, 26 Sep 2026 12:46:52 +0300 Subject: [PATCH] =?UTF-8?q?RQ=20Overlay:=20=D0=BE=D0=B2=D0=B5=D1=80=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B7=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B8=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20Royal=20Quest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .gitignore | 10 + RQOverlay.slnx | 3 + src/RQOverlay/App.xaml | 374 ++++++++++++++++++ src/RQOverlay/App.xaml.cs | 68 ++++ src/RQOverlay/Assets/RQOverlay.ico | Bin 0 -> 39269 bytes src/RQOverlay/Converters.cs | 52 +++ src/RQOverlay/Core/Config.cs | 41 ++ src/RQOverlay/Core/LogParser.cs | 66 ++++ src/RQOverlay/Core/LogWatcher.cs | 104 +++++ src/RQOverlay/Core/MemoryScanner.cs | 161 ++++++++ src/RQOverlay/Core/Native.cs | 52 +++ src/RQOverlay/GameEvents.cs | 163 ++++++++ src/RQOverlay/MainWindow.xaml | 166 ++++++++ src/RQOverlay/MainWindow.xaml.cs | 131 ++++++ src/RQOverlay/OverlaySettings.cs | 45 +++ .../Plugins/Builtin/CounterPlugins.cs | 53 +++ src/RQOverlay/Plugins/Builtin/LootPlugin.cs | 199 ++++++++++ .../Plugins/Builtin/MobStatsPlugin.cs | 181 +++++++++ src/RQOverlay/Plugins/IPlugin.cs | 96 +++++ src/RQOverlay/Plugins/PluginManager.cs | 148 +++++++ src/RQOverlay/PriceBook.cs | 326 +++++++++++++++ src/RQOverlay/RQOverlay.csproj | 33 ++ src/RQOverlay/SessionViewModel.cs | 189 +++++++++ src/RQOverlay/ThemeManager.cs | 89 +++++ src/RQOverlay/Themes/Claude.xaml | 123 ++++++ src/RQOverlay/Themes/Fluent.xaml | 130 ++++++ src/RQOverlay/Themes/Terminal.xaml | 118 ++++++ src/RQOverlay/Views/AppWindow.xaml | 11 + src/RQOverlay/Views/AppWindow.xaml.cs | 86 ++++ src/RQOverlay/Views/LootOverlayView.xaml | 79 ++++ src/RQOverlay/Views/LootOverlayView.xaml.cs | 12 + src/RQOverlay/Views/LootSessionView.xaml | 111 ++++++ src/RQOverlay/Views/LootSessionView.xaml.cs | 43 ++ src/RQOverlay/Views/MobStatsView.xaml | 63 +++ src/RQOverlay/Views/MobStatsView.xaml.cs | 42 ++ src/RQOverlay/Views/MobsSessionView.xaml | 37 ++ src/RQOverlay/Views/MobsSessionView.xaml.cs | 51 +++ src/RQOverlay/Views/PluginsView.xaml | 114 ++++++ src/RQOverlay/Views/PluginsView.xaml.cs | 66 ++++ src/RQOverlay/Views/PricesView.xaml | 169 ++++++++ src/RQOverlay/Views/PricesView.xaml.cs | 96 +++++ src/RQOverlay/Views/SessionView.xaml | 105 +++++ src/RQOverlay/Views/SessionView.xaml.cs | 47 +++ 43 files changed, 4253 insertions(+) create mode 100644 .gitignore create mode 100644 RQOverlay.slnx create mode 100644 src/RQOverlay/App.xaml create mode 100644 src/RQOverlay/App.xaml.cs create mode 100644 src/RQOverlay/Assets/RQOverlay.ico create mode 100644 src/RQOverlay/Converters.cs create mode 100644 src/RQOverlay/Core/Config.cs create mode 100644 src/RQOverlay/Core/LogParser.cs create mode 100644 src/RQOverlay/Core/LogWatcher.cs create mode 100644 src/RQOverlay/Core/MemoryScanner.cs create mode 100644 src/RQOverlay/Core/Native.cs create mode 100644 src/RQOverlay/GameEvents.cs create mode 100644 src/RQOverlay/MainWindow.xaml create mode 100644 src/RQOverlay/MainWindow.xaml.cs create mode 100644 src/RQOverlay/OverlaySettings.cs create mode 100644 src/RQOverlay/Plugins/Builtin/CounterPlugins.cs create mode 100644 src/RQOverlay/Plugins/Builtin/LootPlugin.cs create mode 100644 src/RQOverlay/Plugins/Builtin/MobStatsPlugin.cs create mode 100644 src/RQOverlay/Plugins/IPlugin.cs create mode 100644 src/RQOverlay/Plugins/PluginManager.cs create mode 100644 src/RQOverlay/PriceBook.cs create mode 100644 src/RQOverlay/RQOverlay.csproj create mode 100644 src/RQOverlay/SessionViewModel.cs create mode 100644 src/RQOverlay/ThemeManager.cs create mode 100644 src/RQOverlay/Themes/Claude.xaml create mode 100644 src/RQOverlay/Themes/Fluent.xaml create mode 100644 src/RQOverlay/Themes/Terminal.xaml create mode 100644 src/RQOverlay/Views/AppWindow.xaml create mode 100644 src/RQOverlay/Views/AppWindow.xaml.cs create mode 100644 src/RQOverlay/Views/LootOverlayView.xaml create mode 100644 src/RQOverlay/Views/LootOverlayView.xaml.cs create mode 100644 src/RQOverlay/Views/LootSessionView.xaml create mode 100644 src/RQOverlay/Views/LootSessionView.xaml.cs create mode 100644 src/RQOverlay/Views/MobStatsView.xaml create mode 100644 src/RQOverlay/Views/MobStatsView.xaml.cs create mode 100644 src/RQOverlay/Views/MobsSessionView.xaml create mode 100644 src/RQOverlay/Views/MobsSessionView.xaml.cs create mode 100644 src/RQOverlay/Views/PluginsView.xaml create mode 100644 src/RQOverlay/Views/PluginsView.xaml.cs create mode 100644 src/RQOverlay/Views/PricesView.xaml create mode 100644 src/RQOverlay/Views/PricesView.xaml.cs create mode 100644 src/RQOverlay/Views/SessionView.xaml create mode 100644 src/RQOverlay/Views/SessionView.xaml.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3aeacaa --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Сборка +bin/ +obj/ +dist/ + +# IDE +.idea/ +.vs/ +*.user +*.DotSettings.user diff --git a/RQOverlay.slnx b/RQOverlay.slnx new file mode 100644 index 0000000..b09c9dc --- /dev/null +++ b/RQOverlay.slnx @@ -0,0 +1,3 @@ + + + diff --git a/src/RQOverlay/App.xaml b/src/RQOverlay/App.xaml new file mode 100644 index 0000000..9949ab2 --- /dev/null +++ b/src/RQOverlay/App.xaml @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/RQOverlay/App.xaml.cs b/src/RQOverlay/App.xaml.cs new file mode 100644 index 0000000..8c87742 --- /dev/null +++ b/src/RQOverlay/App.xaml.cs @@ -0,0 +1,68 @@ +using System.Windows; +using System.Windows.Threading; +using RQOverlay.Core; +using RQOverlay.Plugins; +using RQOverlay.Views; + +namespace RQOverlay; + +public partial class App : Application, IPluginHost +{ + readonly CancellationTokenSource _cts = new(); + + public PriceBook Prices { get; } = new(); + public PluginManager Plugins { get; private set; } = null!; + public SessionViewModel Session { get; private set; } = null!; + public OverlaySettings Settings { get; } = OverlaySettings.Load(); + + public string DataDir => AppPaths.Dir; + + public static new App Current => (App)Application.Current; + + public void OpenPrices(bool unpricedOnly) => AppWindow.ShowSingle(AppWindow.Page.Prices, unpricedOnly); + + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + ThemeManager.Apply(Settings.Theme); + + Prices.Load(); + Prices.UseAuction = Settings.UseAuction; + Plugins = new PluginManager(this, Settings); + Plugins.Load(); + Session = new SessionViewModel(Prices, Plugins); + + var window = new MainWindow { DataContext = Session }; + MainWindow = window; + window.Show(); + + var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + timer.Tick += (_, _) => Session.Tick(); + timer.Start(); + + // Сканирование памяти — в фоне, результаты — в UI-поток. + var watcher = new LogWatcher(); + watcher.StatusChanged += (connected, status) => Dispatcher.BeginInvoke(() => + { + Session.Connected = connected; + Session.Status = status; + }); + + // --history: засчитать и то, что накопилось в логе до запуска оверлея. + bool countHistory = e.Args.Contains("--history"); + watcher.EntriesReceived += (entries, initial) => + Dispatcher.BeginInvoke(() => Session.Apply(entries, initial, countHistory)); + + new Thread(() => watcher.Run(_cts.Token)) { IsBackground = true, Name = "LogWatcher" }.Start(); + } + + protected override void OnExit(ExitEventArgs e) + { + _cts.Cancel(); + Plugins.Shutdown(); + Prices.Save(); + Settings.Save(); + base.OnExit(e); + } +} diff --git a/src/RQOverlay/Assets/RQOverlay.ico b/src/RQOverlay/Assets/RQOverlay.ico new file mode 100644 index 0000000000000000000000000000000000000000..6410b9f109770ac002425a6021426b4a9b51efc2 GIT binary patch literal 39269 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 OkX>GQ3YT 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 WGluNt^<|HnX9sre&HwkHm;V5(9qb1H literal 0 HcmV?d00001 diff --git a/src/RQOverlay/Converters.cs b/src/RQOverlay/Converters.cs new file mode 100644 index 0000000..47a74fe --- /dev/null +++ b/src/RQOverlay/Converters.cs @@ -0,0 +1,52 @@ +using System.Globalization; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; + +namespace RQOverlay; + +/// bool -> Visibility. ConverterParameter="!" инвертирует. +public sealed class BoolToVis : IValueConverter +{ + public object Convert(object value, Type t, object? p, CultureInfo c) + { + bool v = value is true; + if (p as string == "!") v = !v; + return v ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type t, object? p, CultureInfo c) => throw new NotSupportedException(); +} + +/// +/// Панель-полоска: делит ширину между детьми пропорционально их весу +/// (присоединённое свойство Weight). Для полоски долей дохода. +/// +public sealed class ShareStrip : Panel +{ + public static readonly DependencyProperty WeightProperty = DependencyProperty.RegisterAttached( + "Weight", typeof(double), typeof(ShareStrip), + new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsParentArrange)); + + public static double GetWeight(DependencyObject o) => (double)o.GetValue(WeightProperty); + public static void SetWeight(DependencyObject o, double v) => o.SetValue(WeightProperty, v); + + protected override Size MeasureOverride(Size available) + { + foreach (UIElement child in InternalChildren) child.Measure(available); + return new Size(0, 0); // растягиваемся на всё, что дадут + } + + protected override Size ArrangeOverride(Size final) + { + double total = InternalChildren.Cast().Sum(c => Math.Max(0, GetWeight(c))); + double x = 0; + foreach (UIElement child in InternalChildren) + { + double w = total > 0 ? final.Width * Math.Max(0, GetWeight(child)) / total : 0; + child.Arrange(new Rect(x, 0, w, final.Height)); + x += w; + } + return final; + } +} diff --git a/src/RQOverlay/Core/Config.cs b/src/RQOverlay/Core/Config.cs new file mode 100644 index 0000000..88a1e66 --- /dev/null +++ b/src/RQOverlay/Core/Config.cs @@ -0,0 +1,41 @@ +namespace RQOverlay.Core; + +// --------------------------------------------------------------------- +// НАСТРОЙКИ — правим только здесь +// --------------------------------------------------------------------- +public static class Config +{ + /// Имя процесса БЕЗ расширения .exe + public const string ProcessName = "rqmain"; + + /// + /// Сигнатура для поиска. Должна быть максимально уникальной: + /// чем длиннее и специфичнее — тем меньше мусора и быстрее скан. + /// + public const string Signature = " +/// Цвет записи из разметки, например "#FF0000". +public record LogEntry(string Time, string Text, string Color, string Html); + +public static class LogParser +{ + // Разбираем конструкции вида: + // текст + // Тело заканчивается на следующем ]*title='(?