diff --git a/Application/Manager.cs b/Application/Manager.cs
index 4ba5edd01..31bf4056d 100644
--- a/Application/Manager.cs
+++ b/Application/Manager.cs
@@ -107,7 +107,7 @@ namespace IW4MAdmin.Application
// todo: this is a hacky mess
if (newEvent.Origin?.DelayedEvents.Count > 0 &&
- (newEvent.Origin?.State == Player.ClientState.Connected ||
+ (//newEvent.Origin?.State == Player.ClientState.Connected ||
newEvent.Type == GameEvent.EventType.Connect))
{
var events = newEvent.Origin.DelayedEvents;
diff --git a/Plugins/Stats/Helpers/StatManager.cs b/Plugins/Stats/Helpers/StatManager.cs
index 96981eaa9..1af751915 100644
--- a/Plugins/Stats/Helpers/StatManager.cs
+++ b/Plugins/Stats/Helpers/StatManager.cs
@@ -504,8 +504,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
async Task ApplyPenalty(Cheat.DetectionPenaltyResult penalty, Cheat.Detection clientDetection, Player attacker)
{
- await OnProcessingPenalty.WaitAsync();
-
try
{
switch (penalty.ClientPenalty)
@@ -564,22 +562,22 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
await new CFlag().ExecuteAsync(e);
break;
}
- OnProcessingPenalty.Release(1);
}
catch
{
- OnProcessingPenalty.Release(1);
+
}
}
async Task SaveTrackedSnapshots(Cheat.Detection clientDetection)
{
+ await OnProcessingPenalty.WaitAsync();
+
using (var ctx = new DatabaseContext(true))
{
// todo: why does this cause duplicate primary key
- foreach (var change in clientDetection.Tracker
- .GetChanges()
- .Where(c => c.SnapshotId == 0))
+ var change = clientDetection.Tracker.GetNextChange();
+ while ((change = clientDetection.Tracker.GetNextChange()) != default(EFACSnapshot))
{
ctx.Add(change);
}
@@ -587,7 +585,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
try
{
await ctx.SaveChangesAsync();
- clientDetection.Tracker.ClearChanges();
}
catch (Exception ex)
@@ -595,6 +592,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
Log.WriteWarning(ex.GetExceptionInfo());
}
}
+
+ OnProcessingPenalty.Release(1);
}
public async Task AddStandardKill(Player attacker, Player victim)
diff --git a/SharedLibraryCore/Commands/NativeCommands.cs b/SharedLibraryCore/Commands/NativeCommands.cs
index 323c89531..cb72bacc4 100644
--- a/SharedLibraryCore/Commands/NativeCommands.cs
+++ b/SharedLibraryCore/Commands/NativeCommands.cs
@@ -591,7 +591,7 @@ namespace SharedLibraryCore.Commands
{
foreach (string line in OnlineAdmins(E.Owner).Split(Environment.NewLine))
{
- var t = E.Message.IsBroadcastCommand() ? E.Owner.Broadcast(line) : E.Origin.Tell(line);
+ var t = E.Message.IsBroadcastCommand() ? E.Owner.Broadcast(line) : E.Origin.Tell(line);
await t;
await Task.Delay(FloodProtectionInterval);
@@ -1370,11 +1370,7 @@ namespace SharedLibraryCore.Commands
// the current map is not in rotation
if (currentMap.Count() == 0)
{
- nextMap = new Map()
- {
- // this happens if it's an unknown custom or DLC map
- Alias = "Unknown"
- };
+ return Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_NEXTMAP_NOT_IN_ROTATION"];
}
// there's duplicate maps in rotation
diff --git a/SharedLibraryCore/Helpers/ChangeTracking.cs b/SharedLibraryCore/Helpers/ChangeTracking.cs
index cba58b23f..99334e1a7 100644
--- a/SharedLibraryCore/Helpers/ChangeTracking.cs
+++ b/SharedLibraryCore/Helpers/ChangeTracking.cs
@@ -1,5 +1,6 @@
using SharedLibraryCore.Interfaces;
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;
@@ -11,32 +12,26 @@ namespace SharedLibraryCore.Helpers
/// Type of entity to keep track of changes to
public class ChangeTracking
{
- List Values;
+ ConcurrentQueue Values;
public ChangeTracking()
{
- Values = new List();
+ Values = new ConcurrentQueue();
}
public void OnChange(T value)
{
- lock (value)
- {
- // clear the first value when count max count reached
- if (Values.Count > 30)
- Values.RemoveAt(0);
- Values.Add(value);
- }
+ if (Values.Count > 30)
+ Values.TryDequeue(out T throwAway);
+ Values.Enqueue(value);
}
- public T[] GetChanges() => Values.ToArray();
+ public T GetNextChange()
+ {
+ bool itemDequeued = Values.TryDequeue(out T val);
+ return itemDequeued ? val : default(T);
+ }
public bool HasChanges => Values.Count > 0;
-
- public void ClearChanges()
- {
- lock (Values)
- Values.Clear();
- }
}
}