diff --git a/RageCoop.Client/Networking/Receive.cs b/RageCoop.Client/Networking/Receive.cs index a2b1357..e343c62 100644 --- a/RageCoop.Client/Networking/Receive.cs +++ b/RageCoop.Client/Networking/Receive.cs @@ -306,12 +306,14 @@ namespace RageCoop.Client SyncedPed c = EntityPool.GetPedByID(packet.ID); if (c == null) { - // Main.Logger.Debug($"Creating character for incoming sync:{packet.ID}"); - if (EntityPool.allPeds.Length < Main.Settings.GlobalPedSoftLimit + PlayerList.Players.Count || PlayerList.Players.ContainsKey(packet.ID)) + if (EntityPool.PedsByID.Count(x => x.Value.OwnerID == packet.OwnerID) < Main.Settings.WorldPedSoftLimit / PlayerList.Players.Count || + EntityPool.VehiclesByID.Any(x => x.Value.Position.DistanceTo(packet.Position) < 2) || packet.ID == packet.OwnerID) + { + // Main.Logger.Debug($"Creating character for incoming sync:{packet.ID}"); EntityPool.ThreadSafe.Add(c = new SyncedPed(packet.ID)); + } else return; } - PedDataFlags flags = packet.Flags; c.ID = packet.ID; c.OwnerID = packet.OwnerID; c.Health = packet.Health; @@ -357,8 +359,12 @@ namespace RageCoop.Client SyncedVehicle v = EntityPool.GetVehicleByID(packet.ID); if (v == null) { - if (EntityPool.allVehicles.Length < Main.Settings.GlobalVehicleSoftLimit || EntityPool.PedsByID.Any(x => x.Value.Position.DistanceTo(packet.Position) < 2f)) + if (EntityPool.VehiclesByID.Count(x => x.Value.OwnerID == packet.OwnerID) < Main.Settings.WorldVehicleSoftLimit / PlayerList.Players.Count || + EntityPool.PedsByID.Any(x => x.Value.VehicleID == packet.ID || x.Value.Position.DistanceTo(packet.Position) < 2)) + { + // Main.Logger.Debug($"Creating vehicle for incoming sync:{packet.ID}"); EntityPool.ThreadSafe.Add(v = new SyncedVehicle(packet.ID)); + } else return; } if (v.IsLocal) { return; } @@ -393,15 +399,12 @@ namespace RageCoop.Client } private static void ProjectileSync(Packets.ProjectileSync packet) { - var p = EntityPool.GetProjectileByID(packet.ID); if (p == null) { if (packet.Flags.HasProjDataFlag(ProjectileDataFlags.Exploded)) { return; } // Main.Logger.Debug($"Creating new projectile: {(WeaponHash)packet.WeaponHash}"); - if (EntityPool.allProjectiles.Length < Main.Settings.GlobalProjectileSoftLimit) - EntityPool.ThreadSafe.Add(p = new SyncedProjectile(packet.ID)); - else return; + EntityPool.ThreadSafe.Add(p = new SyncedProjectile(packet.ID)); } p.Flags = packet.Flags; p.Position = packet.Position; diff --git a/RageCoop.Client/Properties/AssemblyInfo.cs b/RageCoop.Client/Properties/AssemblyInfo.cs index e6b2d99..66704d2 100644 --- a/RageCoop.Client/Properties/AssemblyInfo.cs +++ b/RageCoop.Client/Properties/AssemblyInfo.cs @@ -16,7 +16,7 @@ using System.Resources; // Version information -[assembly: AssemblyVersion("1.5.4.6")] -[assembly: AssemblyFileVersion("1.5.4.6")] +[assembly: AssemblyVersion("1.5.4.7")] +[assembly: AssemblyFileVersion("1.5.4.7")] [assembly: NeutralResourcesLanguageAttribute( "en-US" )] diff --git a/RageCoop.Client/Settings.cs b/RageCoop.Client/Settings.cs index b60e91e..cd1b5cc 100644 --- a/RageCoop.Client/Settings.cs +++ b/RageCoop.Client/Settings.cs @@ -68,21 +68,6 @@ namespace RageCoop.Client /// public int WorldPedSoftLimit { get; set; } = 30; - /// - /// The mod won't sync more vehicles if the limit is exceeded. - /// - public int GlobalVehicleSoftLimit { get; set; } = 100; - - /// - /// The mod won't sync more peds if the limit is exceeded. - /// - public int GlobalPedSoftLimit { get; set; } = 100; - - /// - /// The mod won't sync more projectiles if the limit is exceeded. - /// - public int GlobalProjectileSoftLimit { get; set; } = 100; - /// /// The directory where log and resources downloaded from server will be placed. /// diff --git a/RageCoop.Client/Sync/Entities/Ped/SyncedPed.cs b/RageCoop.Client/Sync/Entities/Ped/SyncedPed.cs index 62554c7..b77a287 100644 --- a/RageCoop.Client/Sync/Entities/Ped/SyncedPed.cs +++ b/RageCoop.Client/Sync/Entities/Ped/SyncedPed.cs @@ -141,6 +141,12 @@ namespace RageCoop.Client } } + if (!IsPlayer && Health <= 0 && !MainPed.IsDead) + { + MainPed.Kill(); + return; + } + if (Speed >= 4) { DisplayInVehicle(); @@ -420,7 +426,7 @@ namespace RageCoop.Client } _lastIsJumping = false; - if (IsRagdoll || Health == 0) + if (IsRagdoll || (IsPlayer && Health == 0)) { if (!MainPed.IsRagdoll) { diff --git a/RageCoop.Client/Sync/Entities/Vehicle/SyncedVehicle.cs b/RageCoop.Client/Sync/Entities/Vehicle/SyncedVehicle.cs index d99e89b..5cab0e0 100644 --- a/RageCoop.Client/Sync/Entities/Vehicle/SyncedVehicle.cs +++ b/RageCoop.Client/Sync/Entities/Vehicle/SyncedVehicle.cs @@ -4,6 +4,7 @@ using GTA.Native; using RageCoop.Core; using System; using System.Collections.Generic; +using System.Linq; namespace RageCoop.Client { @@ -307,6 +308,16 @@ namespace RageCoop.Client } private bool CreateVehicle() { + var existing = World.GetNearbyVehicles(Position, 2).ToList().FirstOrDefault(); + if (existing != null && existing != MainVehicle) + { + if (EntityPool.VehiclesByHandle.ContainsKey(existing.Handle)) + { + EntityPool.RemoveVehicle(ID); + return false; + } + existing.Delete(); + } MainVehicle?.Delete(); MainVehicle = Util.CreateVehicle(Model, Position); if (!Model.IsInCdImage) @@ -337,41 +348,5 @@ namespace RageCoop.Client Model.MarkAsNoLongerNeeded(); return true; } - #region -- PEDALING -- - /* - * Thanks to @oldnapalm. - */ - - private string PedalingAnimDict() - { - switch ((VehicleHash)Model) - { - case VehicleHash.Bmx: - return "veh@bicycle@bmx@front@base"; - case VehicleHash.Cruiser: - return "veh@bicycle@cruiserfront@base"; - case VehicleHash.Scorcher: - return "veh@bicycle@mountainfront@base"; - default: - return "veh@bicycle@roadfront@base"; - } - } - - private string PedalingAnimName(bool fast) - { - return fast ? "fast_pedal_char" : "cruise_pedal_char"; - } - - private void StartPedalingAnim(bool fast) - { - MainVehicle.Driver?.Task.PlayAnimation(PedalingAnimDict(), PedalingAnimName(fast), 8.0f, -8.0f, -1, AnimationFlags.Loop | AnimationFlags.Secondary, 1.0f); - - } - - private void StopPedalingAnim(bool fast) - { - MainVehicle.Driver.Task.ClearAnimation(PedalingAnimDict(), PedalingAnimName(fast)); - } - #endregion } } diff --git a/RageCoop.Client/Sync/EntityPool.cs b/RageCoop.Client/Sync/EntityPool.cs index 9b37b60..1053a85 100644 --- a/RageCoop.Client/Sync/EntityPool.cs +++ b/RageCoop.Client/Sync/EntityPool.cs @@ -363,18 +363,20 @@ namespace RageCoop.Client foreach (Ped p in allPeds) { - SyncedPed c = GetPedByHandle(p.Handle); - if (c == null && p != Game.Player.Character && !mainCharacters.Contains((PedHash)p.Model.Hash)) + if (!PedsByHandle.ContainsKey(p.Handle) && p != Game.Player.Character && !mainCharacters.Contains((PedHash)p.Model.Hash)) { - if (allPeds.Length > Main.Settings.WorldPedSoftLimit && p.PopulationType == EntityPopulationType.RandomAmbient && !p.IsInVehicle()) + if (PedsByID.Count(x => x.Value.IsLocal) > Main.Settings.WorldPedSoftLimit) { - p.Delete(); - continue; + if (p.PopulationType == EntityPopulationType.RandomAmbient && !p.IsInVehicle()) + { + p.Delete(); + continue; + } + if (p.PopulationType == EntityPopulationType.RandomScenario) continue; } // Main.Logger.Trace($"Creating SyncEntity for ped, handle:{p.Handle}"); - c = new SyncedPed(p); - Add(c); + Add(new SyncedPed(p)); } } #if BENCHMARK @@ -438,10 +440,9 @@ namespace RageCoop.Client { if (!VehiclesByHandle.ContainsKey(veh.Handle)) { - if (allVehicles.Length > Main.Settings.WorldVehicleSoftLimit) + if (VehiclesByID.Count(x => x.Value.IsLocal) > Main.Settings.WorldVehicleSoftLimit) { - var type = veh.PopulationType; - if (type == EntityPopulationType.RandomAmbient || type == EntityPopulationType.RandomParked) + if (veh.PopulationType == EntityPopulationType.RandomAmbient || veh.PopulationType == EntityPopulationType.RandomParked) { foreach (var p in veh.Occupants) { diff --git a/RageCoop.Client/WorldThread.cs b/RageCoop.Client/WorldThread.cs index 4192477..a0f0977 100644 --- a/RageCoop.Client/WorldThread.cs +++ b/RageCoop.Client/WorldThread.cs @@ -120,7 +120,7 @@ namespace RageCoop.Client if ((c == null) || (c.IsLocal && (ped.Handle != Game.Player.Character.Handle) && ped.PopulationType != EntityPopulationType.Mission)) { - Main.Logger.Trace($"Removing ped {ped.Handle}. Reason:RemoveTraffic"); + // Main.Logger.Trace($"Removing ped {ped.Handle}. Reason:RemoveTraffic"); ped.CurrentVehicle?.Delete(); ped.Kill(); ped.Delete();