diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip b/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip index c013a0f6f..68f048c55 100644 Binary files a/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip and b/Artemis/Artemis/Modules/Games/UnrealTournament/Resources/ut-plugin.zip differ diff --git a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs index 5d611805c..f1971d73f 100644 --- a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentDataModel.cs @@ -1,4 +1,5 @@ -using Artemis.Models.Interfaces; +using System.ComponentModel; +using Artemis.Models.Interfaces; using Newtonsoft.Json; namespace Artemis.Modules.Games.UnrealTournament @@ -25,6 +26,19 @@ namespace Artemis.Modules.Games.UnrealTournament public PlayerState State { get; set; } public Inventory Inventory { get; set; } public Weapon Weapon { get; set; } + + [DefaultValue("None")] + public KillState KillState { get; set; } + } + + public enum KillState + { + None = 0, + Kill = 1, + DoubleKill = 2, + MultiKill = 3, + UltraKill = 4, + MonsterKill = 5 } public class PlayerState @@ -101,11 +115,11 @@ namespace Artemis.Modules.Games.UnrealTournament 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; } + public float TimeLimit { get; set; } + public float SpawnProtectionTime { get; set; } + public float RemainingTime { get; set; } + public float ElapsedTime { get; set; } + public float RespawnWaitTime { get; set; } + public float 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 index 41a36ea29..c8c1f3b75 100644 --- a/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs +++ b/Artemis/Artemis/Modules/Games/UnrealTournament/UnrealTournamentModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Timers; using Artemis.DAL; using Artemis.Managers; using Artemis.Models; @@ -10,6 +11,9 @@ namespace Artemis.Modules.Games.UnrealTournament { public class UnrealTournamentModel : GameModel { + private Timer _killTimer; + private int _lastScore; + public UnrealTournamentModel(MainManager mainManager) : base(mainManager, SettingsProvider.Load(), new UnrealTournamentDataModel()) { @@ -18,6 +22,9 @@ namespace Artemis.Modules.Games.UnrealTournament Scale = 4; Enabled = Settings.Enabled; Initialized = false; + + _killTimer = new Timer(3500); + _killTimer.Elapsed += KillTimerOnElapsed; } public int Scale { get; set; } @@ -25,12 +32,16 @@ namespace Artemis.Modules.Games.UnrealTournament public override void Dispose() { Initialized = false; + + _killTimer.Stop(); MainManager.PipeServer.PipeMessage -= PipeServerOnPipeMessage; } public override void Enable() { MainManager.PipeServer.PipeMessage += PipeServerOnPipeMessage; + _killTimer.Start(); + Initialized = true; } @@ -42,7 +53,7 @@ namespace Artemis.Modules.Games.UnrealTournament // Parse the JSON try { - DataModel = JsonConvert.DeserializeObject(message); + JsonConvert.PopulateObject(message, DataModel); } catch (Exception) { @@ -52,6 +63,34 @@ namespace Artemis.Modules.Games.UnrealTournament public override void Update() { + var utDataModel = (UnrealTournamentDataModel) DataModel; + if (utDataModel.Player?.State?.Score == _lastScore) + return; + + // Reset the timer + _killTimer.Stop(); + _killTimer.Start(); + if (utDataModel.Player?.State != null) + { + // Can't go past MonsterKill in the current version of UT + if (utDataModel.Player.KillState != KillState.MonsterKill) + { + var recentKills = utDataModel.Player.State.Score - _lastScore; + utDataModel.Player.KillState = (KillState) ((int) utDataModel.Player.KillState + recentKills); + } + _lastScore = utDataModel.Player.State.Score; + } + else + { + _lastScore = 0; + } + } + + private void KillTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) + { + var dataModel = (UnrealTournamentDataModel) DataModel; + if (dataModel.Player != null) + dataModel.Player.KillState = KillState.None; } public override List GetRenderLayers(bool keyboardOnly) diff --git a/Artemis/Artemis/Profiles/Layers/Animations/PulseAnimation.cs b/Artemis/Artemis/Profiles/Layers/Animations/PulseAnimation.cs index f68eee6cb..00734bfad 100644 --- a/Artemis/Artemis/Profiles/Layers/Animations/PulseAnimation.cs +++ b/Artemis/Artemis/Profiles/Layers/Animations/PulseAnimation.cs @@ -13,7 +13,7 @@ namespace Artemis.Profiles.Layers.Animations public void Update(LayerModel layerModel, bool updateAnimations) { // Reset animation progress if layer wasn't drawn for 100ms - if (new TimeSpan(0, 0, 0, 0, 100) > DateTime.Now - layerModel.LastRender) + if (new TimeSpan(0, 0, 0, 0, 100) < DateTime.Now - layerModel.LastRender) layerModel.Properties.AnimationProgress = 0; var progress = layerModel.Properties.AnimationProgress; diff --git a/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs index ebe5ee700..80c7aa4ec 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Generic/GenericPropertiesViewModel.cs @@ -12,7 +12,7 @@ namespace Artemis.Profiles.Layers.Types.Generic public GenericPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm) { - LayerAnimations = new BindableCollection(editorVm.Animations); + LayerAnimations = new BindableCollection(editorVm.LayerAnimations); OpacityProperties = new LayerDynamicPropertiesViewModel("Opacity", editorVm); SelectedLayerAnimation = diff --git a/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetPropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetPropertiesViewModel.cs index 88bb4c0b5..e6db95ab0 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetPropertiesViewModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Headset/HeadsetPropertiesViewModel.cs @@ -12,7 +12,7 @@ namespace Artemis.Profiles.Layers.Types.Headset public HeadsetPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm) { - LayerAnimations = new BindableCollection(editorVm.Animations); + LayerAnimations = new BindableCollection(editorVm.LayerAnimations); OpacityProperties = new LayerDynamicPropertiesViewModel("Opacity", editorVm); SelectedLayerAnimation = diff --git a/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardPropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardPropertiesViewModel.cs index 86ed34c81..478b482b9 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardPropertiesViewModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Keyboard/KeyboardPropertiesViewModel.cs @@ -15,7 +15,7 @@ namespace Artemis.Profiles.Layers.Types.Keyboard public KeyboardPropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm) { - LayerAnimations = new BindableCollection(editorVm.Animations); + LayerAnimations = new BindableCollection(editorVm.LayerAnimations); HeightProperties = new LayerDynamicPropertiesViewModel("Height", editorVm); WidthProperties = new LayerDynamicPropertiesViewModel("Width", editorVm); diff --git a/Artemis/Artemis/Profiles/Layers/Types/Mouse/MousePropertiesViewModel.cs b/Artemis/Artemis/Profiles/Layers/Types/Mouse/MousePropertiesViewModel.cs index 6363ec67d..00d683cc8 100644 --- a/Artemis/Artemis/Profiles/Layers/Types/Mouse/MousePropertiesViewModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Types/Mouse/MousePropertiesViewModel.cs @@ -12,7 +12,7 @@ namespace Artemis.Profiles.Layers.Types.Mouse public MousePropertiesViewModel(LayerEditorViewModel editorVm) : base(editorVm) { - LayerAnimations = new BindableCollection(editorVm.Animations); + LayerAnimations = new BindableCollection(editorVm.LayerAnimations); OpacityProperties = new LayerDynamicPropertiesViewModel("Opacity", editorVm); SelectedLayerAnimation = diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs index 531c99ba3..ff4156bb9 100644 --- a/Artemis/Artemis/Properties/AssemblyInfo.cs +++ b/Artemis/Artemis/Properties/AssemblyInfo.cs @@ -52,5 +52,5 @@ using System.Windows; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.3.1.0")] -[assembly: AssemblyFileVersion("1.3.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.3.2.0")] +[assembly: AssemblyFileVersion("1.3.2.0")] \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs index cd7dbfaf9..8158da854 100644 --- a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs @@ -27,13 +27,13 @@ namespace Artemis.ViewModels.Profiles private ILayerType _selectedLayerType; public LayerEditorViewModel(LayerModel layer, IDataModel dataModel, IEnumerable types, - List animations) + List layerAnimations) { Layer = layer; ProposedLayer = Clone(layer); DataModel = DataModel; - Types = new BindableCollection(types); - Animations = animations; + LayerTypes = new BindableCollection(types); + LayerAnimations = layerAnimations; DataModelProps = new BindableCollection(GenerateTypeMap(dataModel)); @@ -55,7 +55,7 @@ namespace Artemis.ViewModels.Profiles [Inject] public MetroDialogService DialogService { get; set; } - public BindableCollection Types { get; set; } + public BindableCollection LayerTypes { get; set; } public BindableCollection DataModelProps { get; set; } public BindableCollection LayerConditionVms { get; set; } public bool KeyboardGridIsVisible => ProposedLayer.LayerType is KeyboardType; @@ -72,7 +72,7 @@ namespace Artemis.ViewModels.Profiles } } - public List Animations { get; set; } + public List LayerAnimations { get; set; } public LayerModel ProposedLayer { @@ -120,7 +120,7 @@ namespace Artemis.ViewModels.Profiles public void PreSelect() { - SelectedLayerType = Types.FirstOrDefault(t => t.Name == ProposedLayer.LayerType.Name); + SelectedLayerType = LayerTypes.FirstOrDefault(t => t.Name == ProposedLayer.LayerType.Name); ToggleIsEvent(); } @@ -166,8 +166,8 @@ namespace Artemis.ViewModels.Profiles LayerPropertiesViewModel?.ApplyProperties(); Layer.Properties.DynamicProperties.Clear(); - Layer.Properties.Conditions.Clear(); JsonConvert.PopulateObject(JsonConvert.SerializeObject(ProposedLayer), Layer); + Layer.Properties.Conditions.Clear(); foreach (var conditionViewModel in LayerConditionVms) Layer.Properties.Conditions.Add(conditionViewModel.LayerConditionModel); diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 7ca43adf2..4fbf21493 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -352,16 +352,22 @@ namespace Artemis.ViewModels.Profiles private List GetLayers() { - // Get the layers that must be drawn - List drawLayers; - if (ShowAll) - drawLayers = SelectedProfile.GetLayers(); - else if (SelectedLayer.LayerType is FolderType) - drawLayers = SelectedLayer.GetLayers().ToList(); - else - drawLayers = new List {SelectedLayer}; + if (SelectedLayer == null) + return new List(); - return drawLayers; + lock (SelectedLayer) + { + // Get the layers that must be drawn + List drawLayers; + if (ShowAll) + drawLayers = SelectedProfile.GetLayers(); + else if (SelectedLayer.LayerType is FolderType) + drawLayers = SelectedLayer.GetLayers().ToList(); + else + drawLayers = new List {SelectedLayer}; + + return drawLayers; + } } #endregion