Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
564d1467f6 | |||
8bd6ea15a3 | |||
3c7f16f7a4 | |||
393a401860 |
@ -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 _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 _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 _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()
|
static SettingsMenu()
|
||||||
{
|
{
|
||||||
@ -37,6 +38,7 @@ namespace RageCoop.Client.Menus
|
|||||||
_menuKey.Activated += ChaneMenuKey;
|
_menuKey.Activated += ChaneMenuKey;
|
||||||
_passengerKey.Activated += ChangePassengerKey;
|
_passengerKey.Activated += ChangePassengerKey;
|
||||||
_vehicleSoftLimit.Activated += VehicleSoftLimitActivated;
|
_vehicleSoftLimit.Activated += VehicleSoftLimitActivated;
|
||||||
|
_pedSoftLimit.Activated += PedSoftLimitActivated;
|
||||||
_showBlip.Activated += (s, e) =>
|
_showBlip.Activated += (s, e) =>
|
||||||
{
|
{
|
||||||
Main.Settings.ShowPlayerBlip = _showBlip.Checked;
|
Main.Settings.ShowPlayerBlip = _showBlip.Checked;
|
||||||
@ -55,6 +57,7 @@ namespace RageCoop.Client.Menus
|
|||||||
Menu.Add(_menuKey);
|
Menu.Add(_menuKey);
|
||||||
Menu.Add(_passengerKey);
|
Menu.Add(_passengerKey);
|
||||||
Menu.Add(_vehicleSoftLimit);
|
Menu.Add(_vehicleSoftLimit);
|
||||||
|
Menu.Add(_pedSoftLimit);
|
||||||
Menu.Add(_showBlip);
|
Menu.Add(_showBlip);
|
||||||
Menu.Add(_showNametag);
|
Menu.Add(_showNametag);
|
||||||
}
|
}
|
||||||
@ -89,7 +92,19 @@ namespace RageCoop.Client.Menus
|
|||||||
Main.Settings.WorldVehicleSoftLimit = int.Parse(
|
Main.Settings.WorldVehicleSoftLimit = int.Parse(
|
||||||
Game.GetUserInput(WindowTitle.EnterMessage20,
|
Game.GetUserInput(WindowTitle.EnterMessage20,
|
||||||
Main.Settings.WorldVehicleSoftLimit.ToString(), 20));
|
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();
|
Util.SaveSettings();
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
@ -3,6 +3,7 @@ using Lidgren.Network;
|
|||||||
using RageCoop.Client.Menus;
|
using RageCoop.Client.Menus;
|
||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace RageCoop.Client
|
namespace RageCoop.Client
|
||||||
@ -304,13 +305,15 @@ namespace RageCoop.Client
|
|||||||
{
|
{
|
||||||
SyncedPed c = EntityPool.GetPedByID(packet.ID);
|
SyncedPed c = EntityPool.GetPedByID(packet.ID);
|
||||||
if (c == null)
|
if (c == null)
|
||||||
|
{
|
||||||
|
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}");
|
// Main.Logger.Debug($"Creating character for incoming sync:{packet.ID}");
|
||||||
if (EntityPool.allPeds.Length < Main.Settings.GlobalPedSoftLimit || PlayerList.Players.ContainsKey(packet.ID))
|
|
||||||
EntityPool.ThreadSafe.Add(c = new SyncedPed(packet.ID));
|
EntityPool.ThreadSafe.Add(c = new SyncedPed(packet.ID));
|
||||||
|
}
|
||||||
else return;
|
else return;
|
||||||
}
|
}
|
||||||
PedDataFlags flags = packet.Flags;
|
|
||||||
c.ID = packet.ID;
|
c.ID = packet.ID;
|
||||||
c.OwnerID = packet.OwnerID;
|
c.OwnerID = packet.OwnerID;
|
||||||
c.Health = packet.Health;
|
c.Health = packet.Health;
|
||||||
@ -356,8 +359,12 @@ namespace RageCoop.Client
|
|||||||
SyncedVehicle v = EntityPool.GetVehicleByID(packet.ID);
|
SyncedVehicle v = EntityPool.GetVehicleByID(packet.ID);
|
||||||
if (v == null)
|
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));
|
EntityPool.ThreadSafe.Add(v = new SyncedVehicle(packet.ID));
|
||||||
|
}
|
||||||
else return;
|
else return;
|
||||||
}
|
}
|
||||||
if (v.IsLocal) { return; }
|
if (v.IsLocal) { return; }
|
||||||
@ -392,15 +399,12 @@ namespace RageCoop.Client
|
|||||||
}
|
}
|
||||||
private static void ProjectileSync(Packets.ProjectileSync packet)
|
private static void ProjectileSync(Packets.ProjectileSync packet)
|
||||||
{
|
{
|
||||||
|
|
||||||
var p = EntityPool.GetProjectileByID(packet.ID);
|
var p = EntityPool.GetProjectileByID(packet.ID);
|
||||||
if (p == null)
|
if (p == null)
|
||||||
{
|
{
|
||||||
if (packet.Flags.HasProjDataFlag(ProjectileDataFlags.Exploded)) { return; }
|
if (packet.Flags.HasProjDataFlag(ProjectileDataFlags.Exploded)) { return; }
|
||||||
// Main.Logger.Debug($"Creating new projectile: {(WeaponHash)packet.WeaponHash}");
|
// Main.Logger.Debug($"Creating new projectile: {(WeaponHash)packet.WeaponHash}");
|
||||||
if (EntityPool.allProjectiles.Length < Main.Settings.GlobalProjectileSoftLimit)
|
|
||||||
EntityPool.ThreadSafe.Add(p = new SyncedProjectile(packet.ID));
|
EntityPool.ThreadSafe.Add(p = new SyncedProjectile(packet.ID));
|
||||||
else return;
|
|
||||||
}
|
}
|
||||||
p.Flags = packet.Flags;
|
p.Flags = packet.Flags;
|
||||||
p.Position = packet.Position;
|
p.Position = packet.Position;
|
||||||
|
@ -16,7 +16,7 @@ using System.Resources;
|
|||||||
|
|
||||||
|
|
||||||
// Version information
|
// Version information
|
||||||
[assembly: AssemblyVersion("1.5.4.6")]
|
[assembly: AssemblyVersion("1.5.4.7")]
|
||||||
[assembly: AssemblyFileVersion("1.5.4.6")]
|
[assembly: AssemblyFileVersion("1.5.4.7")]
|
||||||
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
[assembly: NeutralResourcesLanguageAttribute( "en-US" )]
|
||||||
|
|
||||||
|
@ -68,21 +68,6 @@ namespace RageCoop.Client
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int WorldPedSoftLimit { get; set; } = 30;
|
public int WorldPedSoftLimit { get; set; } = 30;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The mod won't sync more vehicles if the limit is exceeded.
|
|
||||||
/// </summary>
|
|
||||||
public int GlobalVehicleSoftLimit { get; set; } = 100;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The mod won't sync more peds if the limit is exceeded.
|
|
||||||
/// </summary>
|
|
||||||
public int GlobalPedSoftLimit { get; set; } = 100;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The mod won't sync more projectiles if the limit is exceeded.
|
|
||||||
/// </summary>
|
|
||||||
public int GlobalProjectileSoftLimit { get; set; } = 100;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The directory where log and resources downloaded from server will be placed.
|
/// The directory where log and resources downloaded from server will be placed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -141,6 +141,12 @@ namespace RageCoop.Client
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsPlayer && Health <= 0 && !MainPed.IsDead)
|
||||||
|
{
|
||||||
|
MainPed.Kill();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (Speed >= 4)
|
if (Speed >= 4)
|
||||||
{
|
{
|
||||||
DisplayInVehicle();
|
DisplayInVehicle();
|
||||||
@ -205,7 +211,7 @@ namespace RageCoop.Client
|
|||||||
MainPed = null;
|
MainPed = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PedBlip != null && PedBlip.Exists())
|
if (PedBlip != null)
|
||||||
{
|
{
|
||||||
PedBlip.Delete();
|
PedBlip.Delete();
|
||||||
PedBlip = null;
|
PedBlip = null;
|
||||||
@ -420,7 +426,7 @@ namespace RageCoop.Client
|
|||||||
}
|
}
|
||||||
_lastIsJumping = false;
|
_lastIsJumping = false;
|
||||||
|
|
||||||
if (IsRagdoll || Health == 0)
|
if (IsRagdoll || (IsPlayer && Health == 0))
|
||||||
{
|
{
|
||||||
if (!MainPed.IsRagdoll)
|
if (!MainPed.IsRagdoll)
|
||||||
{
|
{
|
||||||
|
@ -4,6 +4,7 @@ using GTA.Native;
|
|||||||
using RageCoop.Core;
|
using RageCoop.Core;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace RageCoop.Client
|
namespace RageCoop.Client
|
||||||
{
|
{
|
||||||
@ -307,6 +308,16 @@ namespace RageCoop.Client
|
|||||||
}
|
}
|
||||||
private bool CreateVehicle()
|
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?.Delete();
|
||||||
MainVehicle = Util.CreateVehicle(Model, Position);
|
MainVehicle = Util.CreateVehicle(Model, Position);
|
||||||
if (!Model.IsInCdImage)
|
if (!Model.IsInCdImage)
|
||||||
@ -337,41 +348,5 @@ namespace RageCoop.Client
|
|||||||
Model.MarkAsNoLongerNeeded();
|
Model.MarkAsNoLongerNeeded();
|
||||||
return true;
|
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ namespace RageCoop.Client
|
|||||||
PedsByID.Clear();
|
PedsByID.Clear();
|
||||||
PedsByHandle.Clear();
|
PedsByHandle.Clear();
|
||||||
|
|
||||||
foreach (int id in new List<int>(VehiclesByID.Keys))
|
foreach (int id in VehiclesByID.Keys.ToArray())
|
||||||
{
|
{
|
||||||
if (keepMine && (VehiclesByID[id].OwnerID == Main.LocalPlayerID)) { continue; }
|
if (keepMine && (VehiclesByID[id].OwnerID == Main.LocalPlayerID)) { continue; }
|
||||||
RemoveVehicle(id);
|
RemoveVehicle(id);
|
||||||
@ -359,22 +359,24 @@ namespace RageCoop.Client
|
|||||||
lock (PedsLock)
|
lock (PedsLock)
|
||||||
{
|
{
|
||||||
AddPlayer();
|
AddPlayer();
|
||||||
|
var mainCharacters = new List<PedHash> { PedHash.Michael, PedHash.Franklin, PedHash.Franklin02, PedHash.Trevor };
|
||||||
|
|
||||||
foreach (Ped p in allPeds)
|
foreach (Ped p in allPeds)
|
||||||
{
|
{
|
||||||
SyncedPed c = GetPedByHandle(p.Handle);
|
if (!PedsByHandle.ContainsKey(p.Handle) && p != Game.Player.Character && !mainCharacters.Contains((PedHash)p.Model.Hash))
|
||||||
List<PedHash> mainCharacters = new List<PedHash> { PedHash.Michael, PedHash.Franklin, PedHash.Franklin02, PedHash.Trevor };
|
|
||||||
if (c == null && 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)
|
||||||
|
{
|
||||||
|
if (p.PopulationType == EntityPopulationType.RandomAmbient && !p.IsInVehicle())
|
||||||
{
|
{
|
||||||
p.Delete();
|
p.Delete();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (p.PopulationType == EntityPopulationType.RandomScenario) continue;
|
||||||
|
}
|
||||||
// Main.Logger.Trace($"Creating SyncEntity for ped, handle:{p.Handle}");
|
// Main.Logger.Trace($"Creating SyncEntity for ped, handle:{p.Handle}");
|
||||||
c = new SyncedPed(p);
|
|
||||||
|
|
||||||
Add(c);
|
Add(new SyncedPed(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if BENCHMARK
|
#if BENCHMARK
|
||||||
@ -438,10 +440,9 @@ namespace RageCoop.Client
|
|||||||
{
|
{
|
||||||
if (!VehiclesByHandle.ContainsKey(veh.Handle))
|
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 (veh.PopulationType == EntityPopulationType.RandomAmbient || veh.PopulationType == EntityPopulationType.RandomParked)
|
||||||
if (type == EntityPopulationType.RandomAmbient || type == EntityPopulationType.RandomParked)
|
|
||||||
{
|
{
|
||||||
foreach (var p in veh.Occupants)
|
foreach (var p in veh.Occupants)
|
||||||
{
|
{
|
||||||
|
@ -120,7 +120,7 @@ namespace RageCoop.Client
|
|||||||
if ((c == null) || (c.IsLocal && (ped.Handle != Game.Player.Character.Handle) && ped.PopulationType != EntityPopulationType.Mission))
|
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.CurrentVehicle?.Delete();
|
||||||
ped.Kill();
|
ped.Kill();
|
||||||
ped.Delete();
|
ped.Delete();
|
||||||
|
Reference in New Issue
Block a user