using FishNet.Object; using GameKit.Dependencies.Utilities; using System; using System.Collections.Generic; namespace FishNet.Connection { /// /// A container for a connected client used to perform actions on and gather information for the declared client. /// public partial class NetworkConnection { public class LevelOfDetailData : IResettable { /// /// Current level of detail for a NetworkObject. /// public byte CurrentLevelOfDetail; /// /// Previous level of detail for a NetworkObject. /// public byte PreviousLevelOfDetail; internal void Update(byte lodLevel) { PreviousLevelOfDetail = CurrentLevelOfDetail; CurrentLevelOfDetail = lodLevel; } public void ResetState() { CurrentLevelOfDetail = 0; PreviousLevelOfDetail = 0; } public void InitializeState() { } } /// /// Level of detail for each NetworkObject. /// Since this is called frequently this field is intentionally not an accessor to increase performance. /// public Dictionary LevelOfDetails = new Dictionary(new NetworkObjectIdComparer()); /// /// Number oftimes this connection may send a forced LOD update. /// internal int AllowedForcedLodUpdates; /// /// Last tick an LOD was sent. /// On client and clientHost this is LocalTick. /// On server only this is LastPacketTick for the connection. /// internal uint LastLevelOfDetailUpdate; /// /// Returns if the client has not sent an LOD update for expectedInterval. /// /// internal bool IsLateForLevelOfDetail(uint expectedInterval) { //Local client is immune since server and client share ticks. if (IsLocalClient) return false; uint lastPacketTick = PacketTick.RemoteTick; return ((lastPacketTick - LastLevelOfDetailUpdate) > expectedInterval); } /// /// Number of level of detail update infractions for this connection. /// internal int LevelOfDetailInfractions; private void ResetStates_Lod() { foreach (LevelOfDetailData data in LevelOfDetails.Values) ResettableObjectCaches.Store(data); LevelOfDetails.Clear(); } } }