diff --git a/RageCoop.Client/Menus/Sub/SettingsMenu.cs b/RageCoop.Client/Menus/Sub/SettingsMenu.cs index f3bbc90..17b1bf6 100644 --- a/RageCoop.Client/Menus/Sub/SettingsMenu.cs +++ b/RageCoop.Client/Menus/Sub/SettingsMenu.cs @@ -24,6 +24,7 @@ namespace RageCoop.Client.Menus private static readonly NativeItem _menuKey = new NativeItem("Menu Key", "The key to open menu", Main.Settings.MenuKey.ToString()); private static readonly NativeItem _passengerKey = new NativeItem("Passenger Key", "The key to enter a vehicle as passenger", Main.Settings.PassengerKey.ToString()); private static readonly NativeItem _vehicleSoftLimit = new NativeItem("Vehicle limit (soft)", "The game won't spawn more NPC traffic if the limit is exceeded. \n-1 for unlimited (not recommended).", Main.Settings.WorldVehicleSoftLimit.ToString()); + private static readonly NativeItem _pedSoftLimit = new NativeItem("Ped limit (soft)", "The game won't spawn more NPCs if the limit is exceeded. \n-1 for unlimited (not recommended).", Main.Settings.WorldPedSoftLimit.ToString()); static SettingsMenu() { @@ -37,6 +38,7 @@ namespace RageCoop.Client.Menus _menuKey.Activated += ChaneMenuKey; _passengerKey.Activated += ChangePassengerKey; _vehicleSoftLimit.Activated += VehicleSoftLimitActivated; + _pedSoftLimit.Activated += PedSoftLimitActivated; _showBlip.Activated += (s, e) => { Main.Settings.ShowPlayerBlip = _showBlip.Checked; @@ -55,6 +57,7 @@ namespace RageCoop.Client.Menus Menu.Add(_menuKey); Menu.Add(_passengerKey); Menu.Add(_vehicleSoftLimit); + Menu.Add(_pedSoftLimit); Menu.Add(_showBlip); Menu.Add(_showNametag); } @@ -89,7 +92,19 @@ namespace RageCoop.Client.Menus Main.Settings.WorldVehicleSoftLimit = int.Parse( Game.GetUserInput(WindowTitle.EnterMessage20, Main.Settings.WorldVehicleSoftLimit.ToString(), 20)); - _menuKey.AltTitle = Main.Settings.WorldVehicleSoftLimit.ToString(); + _vehicleSoftLimit.AltTitle = Main.Settings.WorldVehicleSoftLimit.ToString(); + Util.SaveSettings(); + } + catch { } + } + private static void PedSoftLimitActivated(object sender, EventArgs e) + { + try + { + Main.Settings.WorldPedSoftLimit = int.Parse( + Game.GetUserInput(WindowTitle.EnterMessage20, + Main.Settings.WorldPedSoftLimit.ToString(), 20)); + _pedSoftLimit.AltTitle = Main.Settings.WorldPedSoftLimit.ToString(); Util.SaveSettings(); } catch { } diff --git a/RageCoop.Client/Networking/Receive.cs b/RageCoop.Client/Networking/Receive.cs index fcea653..e343c62 100644 --- a/RageCoop.Client/Networking/Receive.cs +++ b/RageCoop.Client/Networking/Receive.cs @@ -3,6 +3,7 @@ using Lidgren.Network; using RageCoop.Client.Menus; using RageCoop.Core; using System; +using System.Linq; using System.Threading; namespace RageCoop.Client @@ -305,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.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; @@ -356,8 +359,12 @@ namespace RageCoop.Client SyncedVehicle v = EntityPool.GetVehicleByID(packet.ID); if (v == null) { - if (EntityPool.allVehicles.Length < Main.Settings.GlobalVehicleSoftLimit) + 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; } @@ -392,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 0452cf3..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(); @@ -205,7 +211,7 @@ namespace RageCoop.Client MainPed = null; } - if (PedBlip != null && PedBlip.Exists()) + if (PedBlip != null) { PedBlip.Delete(); PedBlip = null; @@ -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 891e386..1053a85 100644 --- a/RageCoop.Client/Sync/EntityPool.cs +++ b/RageCoop.Client/Sync/EntityPool.cs @@ -51,7 +51,7 @@ namespace RageCoop.Client PedsByID.Clear(); PedsByHandle.Clear(); - foreach (int id in new List(VehiclesByID.Keys)) + foreach (int id in VehiclesByID.Keys.ToArray()) { if (keepMine && (VehiclesByID[id].OwnerID == Main.LocalPlayerID)) { continue; } RemoveVehicle(id); @@ -359,22 +359,24 @@ namespace RageCoop.Client lock (PedsLock) { AddPlayer(); + var mainCharacters = new List { PedHash.Michael, PedHash.Franklin, PedHash.Franklin02, PedHash.Trevor }; foreach (Ped p in allPeds) { - SyncedPed c = GetPedByHandle(p.Handle); - List mainCharacters = new List { PedHash.Michael, PedHash.Franklin, PedHash.Franklin02, PedHash.Trevor }; - 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();