RAGECOOP-V/Client/Entities/EntitiesThread.cs

98 lines
3.6 KiB
C#
Raw Normal View History

2021-07-07 13:36:25 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using GTA;
namespace CoopClient.Entities
{
2021-12-03 20:30:00 +01:00
/// <summary>
/// Don't use it!
/// </summary>
public class EntitiesThread : Script
2021-07-07 13:36:25 +02:00
{
2021-12-03 20:30:00 +01:00
/// <summary>
/// Don't use it!
/// </summary>
2021-07-07 13:36:25 +02:00
public EntitiesThread()
{
// Required for some synchronization!
if (Game.Version < GameVersion.v1_0_1290_1_Steam)
{
return;
}
2021-07-07 13:36:25 +02:00
Tick += OnTick;
}
private void OnTick(object sender, EventArgs e)
{
if (Game.IsLoading || !Main.MainNetworking.IsOnServer() || !Main.NPCsAllowed)
2021-07-07 13:36:25 +02:00
{
return;
}
2021-12-27 10:15:52 +01:00
Dictionary<long, NPC.EntitiesNPC> localNPCs = null;
lock (Main.NPCs)
2021-07-07 13:36:25 +02:00
{
2021-12-27 10:15:52 +01:00
localNPCs = new Dictionary<long, NPC.EntitiesNPC>(Main.NPCs);
2021-11-19 22:08:15 +01:00
ulong tickCount = Util.GetTickCount64();
2021-12-27 10:15:52 +01:00
foreach (KeyValuePair<long, NPC.EntitiesNPC> npc in new Dictionary<long, NPC.EntitiesNPC>(localNPCs))
{
if ((tickCount - npc.Value.LastUpdateReceived) > 2500)
{
if (npc.Value.Character != null && npc.Value.Character.Exists() && !npc.Value.Character.IsDead)
2021-09-26 22:27:49 +02:00
{
npc.Value.Character.Kill();
npc.Value.Character.MarkAsNoLongerNeeded();
npc.Value.Character.Delete();
}
if (npc.Value.MainVehicle != null && npc.Value.MainVehicle.Exists() && npc.Value.MainVehicle.IsSeatFree(VehicleSeat.Driver) && npc.Value.MainVehicle.PassengerCount == 0)
2021-09-26 22:27:49 +02:00
{
2021-12-27 10:15:52 +01:00
if (npc.Value.PlayerVehicleHandle != 0)
{
lock (Main.NPCsVehicles)
{
2021-12-27 10:15:52 +01:00
if (Main.NPCsVehicles.ContainsKey(npc.Value.PlayerVehicleHandle))
{
2021-12-27 10:15:52 +01:00
Main.NPCsVehicles.Remove(npc.Value.PlayerVehicleHandle);
}
}
}
if (!npc.Value.MainVehicle.IsDead)
{
npc.Value.MainVehicle.MarkAsNoLongerNeeded();
npc.Value.MainVehicle.Delete();
}
2021-09-26 22:27:49 +02:00
}
localNPCs.Remove(npc.Key);
Main.NPCs.Remove(npc.Key);
2021-07-07 13:36:25 +02:00
}
}
}
2021-12-27 10:15:52 +01:00
foreach (NPC.EntitiesNPC npc in localNPCs.Values)
{
2021-12-27 10:15:52 +01:00
npc.DisplayLocally();
}
2021-07-07 13:36:25 +02:00
// Only if that player wants to share his NPCs with others
if (Main.ShareNPCsWithPlayers)
2021-07-07 13:36:25 +02:00
{
// Send all npcs from the current player
foreach (Ped ped in World.GetNearbyPeds(Game.Player.Character.Position, 200f) // Get all NPCs around 200f
.Where(p => !p.IsDead && p.Handle != Game.Player.Character.Handle && p.RelationshipGroup != Main.RelationshipGroup)
.OrderBy(p => (p.Position - Game.Player.Character.Position).Length()) // Get the nearest NPCs
.Take(35)) // We shouldn't sync more peds than 35 as the network traffic can be too high for many players
2021-07-07 13:36:25 +02:00
{
Main.MainNetworking.SendNpcData(ped);
}
}
}
}
}