using System.Collections.Generic; using NitroxClient.Communication.Abstract; using NitroxClient.GameLogic; using NitroxClient.MonoBehaviours.Vehicles; using NitroxModel.DataStructures; using NitroxModel.Packets; using UnityEngine; namespace NitroxClient.MonoBehaviours; public class MovementBroadcaster : MonoBehaviour { public const int BROADCAST_FREQUENCY = 30; public const float BROADCAST_PERIOD = 1f / BROADCAST_FREQUENCY; public static MovementBroadcaster Instance; public Dictionary Replicators = []; private readonly Dictionary watchedEntries = []; private float latestBroadcastTime; public void Start() { if (Instance) { Log.Error($"There's already a {nameof(MovementBroadcaster)} Instance alive, destroying the new one."); Destroy(this); return; } Instance = this; } public void OnDestroy() { Instance = null; } public void Update() { float currentTime = (float)this.Resolve().RealTimeElapsed; if (currentTime < latestBroadcastTime + BROADCAST_PERIOD) { return; } latestBroadcastTime = currentTime; BroadcastLocalData(currentTime); } public void BroadcastLocalData(float time) { List data = []; List watchedIds = [..watchedEntries.Keys]; for (int i = watchedIds.Count - 1; i >= 0; i--) { NitroxId entryId = watchedIds[i]; WatchedEntry entry = watchedEntries[entryId]; if (entry.ShouldBroadcastMovement()) { data.Add(entry.GetMovementData(entryId)); entry.OnBroadcastPosition(); } } if (data.Count > 0) { this.Resolve().Send(new VehicleMovements(data, time)); } } public static void RegisterWatched(GameObject gameObject, NitroxId entityId) { if (!Instance) { return; } if (!Instance.watchedEntries.ContainsKey(entityId)) { Instance.watchedEntries.Add(entityId, new(entityId, gameObject.transform)); } } public static void UnregisterWatched(NitroxId entityId) { if (Instance) { Instance.watchedEntries.Remove(entityId); } } public static void RegisterReplicator(MovementReplicator movementReplicator) { if (Instance) { Instance.Replicators.Add(movementReplicator.objectId, movementReplicator); } } public static void UnregisterReplicator(MovementReplicator movementReplicator) { if (Instance) { Instance.Replicators.Remove(movementReplicator.objectId); } } }