diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index 975ed226d..431d9528f 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -3062,11 +3062,11 @@ internal void OnSecondUpdate() { Task.Run(() => { + var threshold = DateTime.UtcNow.AddSeconds(-5); foreach (var player in TShock.Players) { if (player != null && player.TPlayer.whoAmI >= 0) { - var threshold = DateTime.Now.AddSeconds(-5); lock (player.RecentlyCreatedProjectiles) { player.RecentlyCreatedProjectiles = player.RecentlyCreatedProjectiles.Where(s => s.CreatedAt > threshold).ToList(); diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 604cdce87..41e50dff9 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -3187,13 +3187,23 @@ private static bool HandleProjectileNew(GetDataHandlerArgs args) lock (args.Player.RecentlyCreatedProjectiles) { - if (!args.Player.RecentlyCreatedProjectiles.Any(p => p.Index == index)) + bool alreadyTracked = false; + for (int i = 0; i < args.Player.RecentlyCreatedProjectiles.Count; i++) + { + if (args.Player.RecentlyCreatedProjectiles[i].Index == index) + { + alreadyTracked = true; + break; + } + } + + if (!alreadyTracked) { args.Player.RecentlyCreatedProjectiles.Add(new GetDataHandlers.ProjectileStruct() { Index = index, Type = type, - CreatedAt = DateTime.Now + CreatedAt = DateTime.UtcNow }); } } @@ -3290,7 +3300,15 @@ private static bool HandleProjectileKill(GetDataHandlerArgs args) args.Player.LastKilledProjectile = type; lock (args.Player.RecentlyCreatedProjectiles) { - args.Player.RecentlyCreatedProjectiles.ForEach(s => { if (s.Index == index) { s.Killed = true; } }); + for (int i = 0; i < args.Player.RecentlyCreatedProjectiles.Count; i++) + { + if (args.Player.RecentlyCreatedProjectiles[i].Index != index) + continue; + + var trackedProjectile = args.Player.RecentlyCreatedProjectiles[i]; + trackedProjectile.Killed = true; + args.Player.RecentlyCreatedProjectiles[i] = trackedProjectile; + } } return false; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 28cf03c1f..c0cc39f71 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1837,19 +1837,33 @@ private void NetHooks_SendData(SendDataEventArgs e) var player = Players[projectile.owner]; if (player != null) { - if (player.RecentlyCreatedProjectiles.Any(p => p.Index == e.number && p.Killed)) + lock (player.RecentlyCreatedProjectiles) { - player.RecentlyCreatedProjectiles.RemoveAll(p => p.Index == e.number && p.Killed); - } + bool foundActiveEntry = false; + for (int i = player.RecentlyCreatedProjectiles.Count - 1; i >= 0; i--) + { + var tracked = player.RecentlyCreatedProjectiles[i]; + if (tracked.Index != e.number) + continue; - if (!player.RecentlyCreatedProjectiles.Any(p => p.Index == e.number)) - { - player.RecentlyCreatedProjectiles.Add(new GetDataHandlers.ProjectileStruct() + if (tracked.Killed) + { + player.RecentlyCreatedProjectiles.RemoveAt(i); + continue; + } + + foundActiveEntry = true; + } + + if (!foundActiveEntry) { - Index = e.number, - Type = (short)projectile.type, - CreatedAt = DateTime.Now - }); + player.RecentlyCreatedProjectiles.Add(new GetDataHandlers.ProjectileStruct() + { + Index = e.number, + Type = (short)projectile.type, + CreatedAt = DateTime.UtcNow + }); + } } } }