diff --git a/Artemis/Artemis.sln b/Artemis/Artemis.sln index 6c8abbab3..0e9c57ea1 100644 --- a/Artemis/Artemis.sln +++ b/Artemis/Artemis.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis", "Artemis\Artemis. EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Razer2Artemis", "Razer2Artemis\Razer2Artemis.vcxproj", "{39711909-C1D5-46CE-A9EA-2D561692EA47}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnrealTournament2Artemis", "UnrealTournament2Artemis\UnrealTournament2Artemis.vcxproj", "{3541864F-1662-4BD6-8328-2C87AE61D152}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CD_ROM|Any CPU = CD_ROM|Any CPU @@ -84,6 +86,34 @@ Global {39711909-C1D5-46CE-A9EA-2D561692EA47}.SingleImage|x64.Build.0 = Release|x64 {39711909-C1D5-46CE-A9EA-2D561692EA47}.SingleImage|x86.ActiveCfg = Release|Win32 {39711909-C1D5-46CE-A9EA-2D561692EA47}.SingleImage|x86.Build.0 = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.CD_ROM|Any CPU.ActiveCfg = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.CD_ROM|Any CPU.Build.0 = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.CD_ROM|x64.ActiveCfg = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.CD_ROM|x64.Build.0 = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.CD_ROM|x86.ActiveCfg = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.CD_ROM|x86.Build.0 = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Debug|x64.ActiveCfg = Debug|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Debug|x64.Build.0 = Debug|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Debug|x86.ActiveCfg = Debug|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Debug|x86.Build.0 = Debug|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.DVD-5|Any CPU.ActiveCfg = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.DVD-5|Any CPU.Build.0 = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.DVD-5|x64.ActiveCfg = Debug|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.DVD-5|x64.Build.0 = Debug|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.DVD-5|x86.ActiveCfg = Debug|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.DVD-5|x86.Build.0 = Debug|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Release|Any CPU.ActiveCfg = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Release|x64.ActiveCfg = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Release|x64.Build.0 = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Release|x86.ActiveCfg = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.Release|x86.Build.0 = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.SingleImage|Any CPU.ActiveCfg = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.SingleImage|Any CPU.Build.0 = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.SingleImage|x64.ActiveCfg = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.SingleImage|x64.Build.0 = Release|x64 + {3541864F-1662-4BD6-8328-2C87AE61D152}.SingleImage|x86.ActiveCfg = Release|Win32 + {3541864F-1662-4BD6-8328-2C87AE61D152}.SingleImage|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Artemis/Artemis/App.config b/Artemis/Artemis/App.config index 62b94b3c1..af9997c3f 100644 --- a/Artemis/Artemis/App.config +++ b/Artemis/Artemis/App.config @@ -1,7 +1,9 @@  + +
@@ -27,6 +29,17 @@ + + + True + + + Default + + + + + True @@ -278,7 +291,7 @@ - + @@ -311,4 +324,4 @@ - + \ No newline at end of file diff --git a/Artemis/Artemis/App.xaml.cs b/Artemis/Artemis/App.xaml.cs index 008f21c59..7b5f4dc88 100644 --- a/Artemis/Artemis/App.xaml.cs +++ b/Artemis/Artemis/App.xaml.cs @@ -13,6 +13,12 @@ namespace Artemis /// public partial class App : Application { + protected override void OnExit(ExitEventArgs e) + { + base.OnExit(e); + Environment.Exit(0); + } + public App() { if (!IsRunAsAdministrator()) @@ -31,11 +37,6 @@ namespace Artemis return wp.IsInRole(WindowsBuiltInRole.Administrator); } - private void Application_Startup(object sender, StartupEventArgs e) - { - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - } - private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { if (DoHandle) @@ -50,12 +51,6 @@ namespace Artemis } } - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - var ex = e.ExceptionObject as Exception; - GetArtemisExceptionViewer(ex).ShowDialog(); - } - private static ExceptionViewer GetArtemisExceptionViewer(Exception e) { var logger = LogManager.GetCurrentClassLogger(); diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index 0016043d5..707d8f05a 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -40,7 +40,7 @@ Artemis Artemis 0 - 1.2.2.0 + 1.2.3.0 false true true @@ -141,8 +141,8 @@ False lib\ColorBox.dll - - ..\packages\Colore.4.0.0\lib\net35\Corale.Colore.dll + + ..\packages\Colore.5.0.0\lib\net35\Corale.Colore.dll True @@ -176,8 +176,8 @@ ..\packages\NAudio.1.7.3\lib\net35\NAudio.dll True - - ..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll True @@ -197,7 +197,7 @@ True - ..\packages\NLog.4.3.4\lib\net45\NLog.dll + ..\packages\NLog.4.3.7\lib\net45\NLog.dll True @@ -205,7 +205,7 @@ D:\Downloads\Chome Downloads\Process.NET-master\Process.NET-master\src\Process.NET\bin\Release\Process.NET.dll - ..\packages\SpotifyAPI-NET.2.9.0\lib\SpotifyAPI.dll + ..\packages\SpotifyAPI-NET.2.11.0\lib\SpotifyAPI.dll True @@ -312,6 +312,18 @@ + + True + True + UnrealTournament.settings + + + + + + UnrealTournamentView.xaml + + True True @@ -617,10 +629,19 @@ Code + + + SettingsSingleFileGenerator + UnrealTournament.Designer.cs + + SettingsSingleFileGenerator WoW.Designer.cs + + Designer + @@ -668,9 +689,6 @@ SettingsSingleFileGenerator VolumeDisplay.Designer.cs - - Designer - Designer @@ -700,7 +718,6 @@ - SettingsSingleFileGenerator Offsets.Designer.cs @@ -732,6 +749,10 @@ Designer MSBuild:Compile + + MSBuild:Compile + Designer + MSBuild:Compile Designer @@ -857,6 +878,7 @@ PreserveNewest + diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index d0aec9007..2b67e8842 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -95,6 +95,7 @@ namespace Artemis protected override void OnExit(object sender, EventArgs e) { _kernel.Dispose(); +// Enviroment.Exit(0); base.OnExit(sender, e); } diff --git a/Artemis/Artemis/DAL/ProfileProvider.cs b/Artemis/Artemis/DAL/ProfileProvider.cs index 2e5aae995..0af504d90 100644 --- a/Artemis/Artemis/DAL/ProfileProvider.cs +++ b/Artemis/Artemis/DAL/ProfileProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.IO; using System.IO.Compression; using System.Linq; @@ -19,9 +20,10 @@ namespace Artemis.DAL { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private static readonly string ProfileFolder = Environment - .GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis\profiles"; + private static readonly string ProfileFolder = + Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis\profiles"; + private static readonly List Profiles = new List(); private static bool _installedDefaults; /// @@ -30,7 +32,15 @@ namespace Artemis.DAL /// All profiles public static List GetAll() { - return ReadProfiles(); + lock (Profiles) + { + if (!Profiles.Any()) + ReadProfiles(); + + // Return a new list, this'll make sure removing/updating the retrieved list doesn't + // affect the datastore + return Profiles.ToList(); + } } /// @@ -59,8 +69,15 @@ namespace Artemis.DAL if (prof == null) throw new ArgumentNullException(nameof(prof)); + lock (Profiles) + { + if (!Profiles.Contains(prof)) + Profiles.Add(prof); + } + lock (prof) { + // Store the file if (!(prof.GameName?.Length > 1) || !(prof.KeyboardSlug?.Length > 1) || !(prof.Name?.Length > 1)) throw new ArgumentException("Profile is invalid. Name, GameName and KeyboardSlug are required"); @@ -86,31 +103,43 @@ namespace Artemis.DAL } } - private static List ReadProfiles() + private static void ReadProfiles() { CheckProfiles(); - InstallDefaults(); - var profiles = new List(); - - // Create the directory structure - var profilePaths = Directory.GetFiles(ProfileFolder, "*.json", SearchOption.AllDirectories); - - // Parse the JSON files into objects and add them if they are valid - foreach (var path in profilePaths) + lock (Profiles) { - try + Profiles.Clear(); + + // Create the directory structure + var profilePaths = Directory.GetFiles(ProfileFolder, "*.json", SearchOption.AllDirectories); + + // Parse the JSON files into objects and add them if they are valid + foreach (var path in profilePaths) { - var prof = LoadProfileIfValid(path); - if (prof != null) - profiles.Add(prof); - } - catch (Exception e) - { - Logger.Error("Failed to load profile: {0} - {1}", path, e.InnerException.Message); + try + { + var prof = LoadProfileIfValid(path); + if (prof == null) + continue; + + // Only add unique profiles + if (Profiles.Any(p => p.GameName == prof.GameName && p.Name == prof.Name && + p.KeyboardSlug == prof.KeyboardSlug)) + { + Logger.Error("Didn't load duplicate profile: {0}", path); + } + else + { + Profiles.Add(prof); + } + } + catch (Exception e) + { + Logger.Error("Failed to load profile: {0} - {1}", path, e.InnerException.Message); + } } } - - return profiles; + InstallDefaults(); } /// @@ -133,23 +162,27 @@ namespace Artemis.DAL var archive = new ZipArchive(stream); archive.ExtractToDirectory(ProfileFolder, true); - // Extract the demo GIF file - var gifPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis\demo-gif.gif"; - Resources.demo_gif.Save(gifPath); + var demoProfiles = Profiles.Where(d => d.Name == "Demo (duplicate to keep changes)"); + InsertGif(demoProfiles, "GIF", Resources.demo_gif, "demo-gif"); + } - // Set the GIF path on each demo profile - var demoProfiles = GetAll().Where(d => d.Name == "Demo (Duplicate to keep changes)"); - foreach (var demoProfile in demoProfiles) + public static void InsertGif(IEnumerable profileModels, string layerName, Bitmap gifFile, + string fileName) + { + // Extract the GIF file + var gifDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Artemis\gifs"; + Directory.CreateDirectory(gifDir); + var gifPath = gifDir + $"\\{fileName}.gif"; + gifFile.Save(gifPath); + + foreach (var profile in profileModels) { - var gifLayer = demoProfile - .Layers.FirstOrDefault(l => l.Name == "Demo - GIFs")? - .Children.FirstOrDefault(c => c.Name == "GIF"); - + var gifLayer = profile.GetLayers().FirstOrDefault(l => l.Name == layerName); if (gifLayer == null) continue; ((KeyboardPropertiesModel) gifLayer.Properties).GifFile = gifPath; - AddOrUpdate(demoProfile); + AddOrUpdate(profile); } } @@ -172,7 +205,6 @@ namespace Artemis.DAL /// The loaded profile, or null if invalid public static ProfileModel LoadProfileIfValid(string path) { - // TODO: What exception on load failure? try { var prof = JsonConvert.DeserializeObject(File.ReadAllText(path)); @@ -182,7 +214,7 @@ namespace Artemis.DAL return null; return prof; } - catch (Exception) + catch (JsonSerializationException) { return null; } @@ -209,20 +241,29 @@ namespace Artemis.DAL if (string.IsNullOrEmpty(name)) return; - // Remove the old file - var path = ProfileFolder + $@"\{profile.KeyboardSlug}\{profile.GameName}\{profile.Name}.json"; - if (File.Exists(path)) - File.Delete(path); + // Remove the old profile + DeleteProfile(profile); // Update the profile, creating a new file profile.Name = name; AddOrUpdate(profile); } - public static void DeleteProfile(ProfileModel profile) + public static void DeleteProfile(ProfileModel prof) { + // Remove from datastore + lock (Profiles) + { + // Get the profile from the datastore instead of just the provided value, to be certain it is removed + var dsProfile = Profiles.FirstOrDefault(p => p.GameName == prof.GameName && + p.Name == prof.Name && + p.KeyboardSlug == prof.KeyboardSlug); + if (dsProfile != null) + Profiles.Remove(dsProfile); + } + // Remove the file - var path = ProfileFolder + $@"\{profile.KeyboardSlug}\{profile.GameName}\{profile.Name}.json"; + var path = ProfileFolder + $@"\{prof.KeyboardSlug}\{prof.GameName}\{prof.Name}.json"; if (File.Exists(path)) File.Delete(path); } diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs index 3a64c1099..b739b0800 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs @@ -10,7 +10,6 @@ using CUE.NET; using CUE.NET.Brushes; using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Keyboard; -using CUE.NET.Devices.Keyboard.Enums; using CUE.NET.Devices.Keyboard.Keys; using Ninject.Extensions.Logging; using Point = System.Drawing.Point; @@ -78,6 +77,11 @@ namespace Artemis.DeviceProviders.Corsair break; } +// Height = 7; +// Width = 18; +// Slug = "corsair-k65-rgb"; +// PreviewSettings = new PreviewSettings(610, 240, new Thickness(0, -30, 0, 0), Resources.k65); + Logger.Debug("Corsair SDK reported device as: {0}", _keyboard.DeviceInfo.Model); _keyboard.Brush = _keyboardBrush ?? (_keyboardBrush = new ImageBrush()); } @@ -121,7 +125,7 @@ namespace Artemis.DeviceProviders.Corsair { var widthMultiplier = Width/_keyboard.KeyboardRectangle.Width; var heightMultiplier = Height/_keyboard.KeyboardRectangle.Height; - + CorsairKey cueKey = null; try { @@ -132,7 +136,7 @@ namespace Artemis.DeviceProviders.Corsair { // ignored } - + if (cueKey != null) return new KeyMatch(keyCode, (int) (cueKey.KeyRectangle.X*widthMultiplier), (int) (cueKey.KeyRectangle.Y*heightMultiplier)); diff --git a/Artemis/Artemis/DeviceProviders/Corsair/Utilities/KeyMap.cs b/Artemis/Artemis/DeviceProviders/Corsair/Utilities/KeyMap.cs index aa8f34795..6c6232bd4 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/Utilities/KeyMap.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/Utilities/KeyMap.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Windows.Forms; using CUE.NET.Devices.Keyboard.Enums; -using CUE.NET.Devices.Keyboard.Keys; namespace Artemis.DeviceProviders.Corsair.Utilities { diff --git a/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs b/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs index 588640cf5..5aa6e9c1e 100644 --- a/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs +++ b/Artemis/Artemis/DeviceProviders/Razer/BlackWidow.cs @@ -7,7 +7,6 @@ using Artemis.DeviceProviders.Razer.Utilities; using Artemis.Properties; using Corale.Colore.Core; using Corale.Colore.Razer; -using Corale.Colore.Razer.Keyboard; using Constants = Corale.Colore.Razer.Keyboard.Constants; namespace Artemis.DeviceProviders.Razer @@ -29,9 +28,9 @@ namespace Artemis.DeviceProviders.Razer public override bool CanEnable() { - if (!Chroma.IsSdkAvailable()) + if (!Chroma.SdkAvailable) return false; - + // Some people have Synapse installed, but not a Chroma keyboard, deal with this var blackWidowFound = Chroma.Instance.Query(Devices.Blackwidow).Connected; var blackWidowTeFound = Chroma.Instance.Query(Devices.BlackwidowTe).Connected; diff --git a/Artemis/Artemis/DeviceProviders/Razer/Utilities/RazerUtilities.cs b/Artemis/Artemis/DeviceProviders/Razer/Utilities/RazerUtilities.cs index b8a380416..2ec0ebd43 100644 --- a/Artemis/Artemis/DeviceProviders/Razer/Utilities/RazerUtilities.cs +++ b/Artemis/Artemis/DeviceProviders/Razer/Utilities/RazerUtilities.cs @@ -1,6 +1,7 @@ using System.Drawing; using Artemis.Utilities; using Corale.Colore.Razer.Keyboard.Effects; +using Color = Corale.Colore.Core.Color; namespace Artemis.DeviceProviders.Razer.Utilities { @@ -13,8 +14,13 @@ namespace Artemis.DeviceProviders.Razer.Utilities b = ImageUtilities.ResizeImage(b, width, height); for (var y = 0; y < b.Height; y++) + { for (var x = 0; x < b.Width; x++) - keyboardGrid[y, x] = b.GetPixel(x, y); + { + var pixel = b.GetPixel(x, y); + keyboardGrid[y, x] = new Color(pixel.R, pixel.G, pixel.B); + } + } return keyboardGrid; } diff --git a/Artemis/Artemis/InjectionModules/ArtemisModules.cs b/Artemis/Artemis/InjectionModules/ArtemisModules.cs index 68f35bd1a..a8c38414c 100644 --- a/Artemis/Artemis/InjectionModules/ArtemisModules.cs +++ b/Artemis/Artemis/InjectionModules/ArtemisModules.cs @@ -10,6 +10,7 @@ using Artemis.Modules.Games.Dota2; using Artemis.Modules.Games.Overwatch; using Artemis.Modules.Games.RocketLeague; using Artemis.Modules.Games.TheDivision; +using Artemis.Modules.Games.UnrealTournament; using Artemis.Modules.Games.Witcher3; using Artemis.Modules.Overlays.VolumeDisplay; using Artemis.Profiles.Layers.Animations; @@ -46,6 +47,7 @@ namespace Artemis.InjectionModules Bind().To().InSingletonScope(); Bind().To().InSingletonScope(); Bind().To().InSingletonScope(); + Bind().To().InSingletonScope(); // Overlays Bind().To().InSingletonScope(); diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index a8f91935a..f5ba8c957 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -65,7 +65,7 @@ namespace Artemis.Managers while (_deviceManager.ChangingKeyboard) Thread.Sleep(200); - + // If still null, no last keyboard, so stop. if (_deviceManager.ActiveKeyboard == null) { diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index bec1c129d..09d10be9d 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -1,13 +1,10 @@ using System; -using System.Diagnostics; using System.Linq; using System.Timers; using Artemis.Events; using Artemis.Models; -using Artemis.Modules.Effects.ProfilePreview; using Artemis.Utilities.DataReaders; using Artemis.Utilities.GameState; -using Artemis.Utilities.Keyboard; using Artemis.ViewModels; using Caliburn.Micro; using Ninject; @@ -25,8 +22,8 @@ namespace Artemis.Managers private readonly IEventAggregator _events; private readonly Timer _processTimer; - public MainManager(IEventAggregator events, ILogger logger, LoopManager loopManager, - DeviceManager deviceManager, EffectManager effectManager, ProfileManager profileManager) + public MainManager(IEventAggregator events, ILogger logger, LoopManager loopManager, DeviceManager deviceManager, + EffectManager effectManager, ProfileManager profileManager, PipeServer pipeServer) { _events = events; @@ -35,6 +32,7 @@ namespace Artemis.Managers DeviceManager = deviceManager; EffectManager = effectManager; ProfileManager = profileManager; + PipeServer = pipeServer; _processTimer = new Timer(1000); _processTimer.Elapsed += ScanProcesses; @@ -48,7 +46,6 @@ namespace Artemis.Managers GameStateWebServer.Start(); // Start the named pipe - PipeServer = new PipeServer(); PipeServer.Start("artemis"); Logger.Info("Intialized MainManager"); diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs index 2c1861c66..50edc8d10 100644 --- a/Artemis/Artemis/Managers/ProfileManager.cs +++ b/Artemis/Artemis/Managers/ProfileManager.cs @@ -73,6 +73,7 @@ namespace Artemis.Managers // LoopManager might be running, this method won't do any harm in that case. _loopManager.StartAsync(); + ProfilePreviewModel.ProfileViewModel = activePreview.ProfileEditor.ProfileViewModel; if (!ReferenceEquals(ProfilePreviewModel.Profile, activePreview.ProfileEditor.SelectedProfile)) ProfilePreviewModel.Profile = activePreview.ProfileEditor.SelectedProfile; } diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 6566a68fe..513a9619d 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -7,6 +7,8 @@ using Artemis.Models; using Artemis.Models.Interfaces; using Artemis.Profiles.Layers.Interfaces; using Artemis.Profiles.Layers.Models; +using Artemis.ViewModels.Profiles; +using Castle.Components.DictionaryAdapter; namespace Artemis.Modules.Effects.ProfilePreview { @@ -17,6 +19,8 @@ namespace Artemis.Modules.Effects.ProfilePreview Name = "Profile Preview"; } + public ProfileViewModel ProfileViewModel { get; set; } + public override void Dispose() { Initialized = false; @@ -33,7 +37,7 @@ namespace Artemis.Modules.Effects.ProfilePreview public override List GetRenderLayers(bool keyboardOnly) { - return Profile.GetRenderLayers(DataModel, keyboardOnly, true); + return ProfileViewModel != null ? ProfileViewModel.GetRenderLayers() : new EditableList(); } public override void Render(RenderFrame frame, bool keyboardOnly) diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml index e591ac8f9..0a8459b29 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeView.xaml @@ -24,7 +24,7 @@ diff --git a/Artemis/Artemis/Modules/Games/Dota2/Dota2View.xaml b/Artemis/Artemis/Modules/Games/Dota2/Dota2View.xaml index 6adaf23ee..336f2b1d7 100644 --- a/Artemis/Artemis/Modules/Games/Dota2/Dota2View.xaml +++ b/Artemis/Artemis/Modules/Games/Dota2/Dota2View.xaml @@ -24,7 +24,7 @@ diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs index 618d90564..72c98e3cb 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading; using System.Windows.Media; using Artemis.Events; using Artemis.Managers; @@ -98,9 +97,7 @@ namespace Artemis.Modules.Games.Overwatch private void PipeServerOnPipeMessage(string message) { - - _lastMessage = message; - + _lastMessage = message; } public override void Update() diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchView.xaml b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchView.xaml index 1d5c7d9ad..309d225a7 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchView.xaml +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchView.xaml @@ -17,13 +17,13 @@ - + @@ -35,6 +35,7 @@ + diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs index 6895b0a34..3cc60a1b9 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Artemis.Managers; using Artemis.Models; diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml index 657690ccd..d59f8c89b 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueView.xaml @@ -28,7 +28,7 @@ diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/redeemer.gif b/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/redeemer.gif new file mode 100644 index 000000000..8b5947845 Binary files /dev/null and b/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/redeemer.gif differ diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip b/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip new file mode 100644 index 000000000..c013a0f6f Binary files /dev/null and b/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip differ diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournament.Designer.cs b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournament.Designer.cs new file mode 100644 index 000000000..1458db06a --- /dev/null +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournament.Designer.cs @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Artemis.Modules.Games.UnrealTournament { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class UnrealTournament : global::System.Configuration.ApplicationSettingsBase { + + private static UnrealTournament defaultInstance = ((UnrealTournament)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new UnrealTournament()))); + + public static UnrealTournament Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Enabled { + get { + return ((bool)(this["Enabled"])); + } + set { + this["Enabled"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Default")] + public string LastProfile { + get { + return ((string)(this["LastProfile"])); + } + set { + this["LastProfile"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string GameDirectory { + get { + return ((string)(this["GameDirectory"])); + } + set { + this["GameDirectory"] = value; + } + } + } +} diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournament.settings b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournament.settings new file mode 100644 index 000000000..8052f2dea --- /dev/null +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournament.settings @@ -0,0 +1,17 @@ + + + + + + + True + + + Default + + + + + + \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs new file mode 100644 index 000000000..aa2deb1b9 --- /dev/null +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs @@ -0,0 +1,104 @@ +using Artemis.Models.Interfaces; +using Newtonsoft.Json; + +namespace Artemis.Modules.Games.UnrealTournament +{ + public class UnrealTournamentDataModel : IDataModel + { + public State State { get; set; } + public Environment Environment { get; set; } + public Player Player { get; set; } + } + + public enum State + { + MainMenu, + Spectating, + Alive, + Dead + } + + public class Player + { + public int Health { get; set; } + public int Armor { get; set; } + public PlayerState State { get; set; } + public Inventory Inventory { get; set; } + public Weapon Weapon { get; set; } + } + + public class PlayerState + { + public string PlayerName { get; set; } + public string UniqueId { get; set; } + public int Score { get; set; } + [JsonProperty("Team Num")] + public int TeamNum { get; set; } + public int RankCheck { get; set; } + [JsonProperty("Duel Rank")] + public int DuelRank { get; set; } + public int No_of_Duel_Played { get; set; } + [JsonProperty("CTF Rank")] + public int CTFRank { get; set; } + public int No_CTF_MatchesPlayed { get; set; } + [JsonProperty("TDM Rank")] + public int TDMRank { get; set; } + public int No_TDM_MatchesPlayed { get; set; } + public int DMRank { get; set; } + public int No_DM_Matches_Played { get; set; } + public int ShowdownRank { get; set; } + public int No_Showdowns { get; set; } + } + + public class Inventory + { + public bool HasJumpBoots { get; set; } + public bool HasInvisibility { get; set; } + public bool HasBerserk { get; set; } + public bool HasUDamage { get; set; } + public bool HasThighPads { get; set; } + public bool HasShieldBelt { get; set; } + public bool HasChestArmor { get; set; } + public bool HasHelmet { get; set; } + } + + public class Weapon + { + public string Name { get; set; } + public int Ammo { get; set; } + public int MaxAmmo { get; set; } + public bool IsFiring { get; set; } + public int FireMode { get; set; } + public ZoomState ZoomState { get; set; } + } + + public enum ZoomState + { + Unzoomed = 0, + Zoomed = 3, + ZoomingIn = 1, + ZoomingOut = 2 + } + + public class Environment + { + public string GameMode { get; set; } + public bool MatchStarted { get; set; } + public int GoalScore { get; set; } + public string ServerName { get; set; } + public bool bWeaponStay { get; set; } + public bool bTeamGame { get; set; } + public bool bAllowTeamSwitches { get; set; } + public bool bStopGameClock { get; set; } + public bool bCasterControl { get; set; } + public bool bForcedBalance { get; set; } + public bool bPlayPlayerIntro { get; set; } + public int TimeLimit { get; set; } + public int SpawnProtectionTime { get; set; } + public int RemainingTime { get; set; } + public int ElapsedTime { get; set; } + public int RespawnWaitTime { get; set; } + public int ForceRespawnTime { get; set; } + } + +} \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs new file mode 100644 index 000000000..a1863c2f9 --- /dev/null +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using Artemis.Managers; +using Artemis.Models; +using Artemis.Profiles.Layers.Models; +using Newtonsoft.Json; + +namespace Artemis.Modules.Games.UnrealTournament +{ + public class UnrealTournamentModel : GameModel + { + public UnrealTournamentModel(MainManager mainManager, UnrealTournamentSettings settings) + : base(mainManager, settings, new UnrealTournamentDataModel()) + { + Name = "UnrealTournament"; + ProcessName = "UE4-Win64-Shipping"; + Scale = 4; + Enabled = Settings.Enabled; + Initialized = false; + } + + public int Scale { get; set; } + + public override void Dispose() + { + Initialized = false; + MainManager.PipeServer.PipeMessage -= PipeServerOnPipeMessage; + } + + public override void Enable() + { + MainManager.PipeServer.PipeMessage += PipeServerOnPipeMessage; + Initialized = true; + } + + private void PipeServerOnPipeMessage(string message) + { + if (!message.Contains("\"Environment\":")) + return; + + // Parse the JSON + try + { + DataModel = JsonConvert.DeserializeObject(message); + } + catch (Exception) + { + //ignored + } + } + + public override void Update() + { + } + + public override List GetRenderLayers(bool keyboardOnly) + { + return Profile.GetRenderLayers(DataModel, keyboardOnly); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentSettings.cs b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentSettings.cs new file mode 100644 index 000000000..9b27c884a --- /dev/null +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentSettings.cs @@ -0,0 +1,36 @@ +using Artemis.Models; + +namespace Artemis.Modules.Games.UnrealTournament +{ + public class UnrealTournamentSettings : GameSettings + { + public UnrealTournamentSettings() + { + Load(); + } + + public string GameDirectory { get; set; } + + public sealed override void Load() + { + Enabled = UnrealTournament.Default.Enabled; + LastProfile = UnrealTournament.Default.LastProfile; + GameDirectory = UnrealTournament.Default.GameDirectory; + } + + public sealed override void Save() + { + UnrealTournament.Default.Enabled = Enabled; + UnrealTournament.Default.LastProfile = LastProfile; + UnrealTournament.Default.GameDirectory = GameDirectory; + + UnrealTournament.Default.Save(); + } + + public sealed override void ToDefault() + { + Enabled = true; + GameDirectory = string.Empty; + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentView.xaml b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentView.xaml new file mode 100644 index 000000000..df2b3afc9 --- /dev/null +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentView.xaml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + +