public void AddSubscriber(LiteNetLibPlayer subscriber)
        {
            // Only server can manage subscribers
            if (!IsServer || subscriber == null)
            {
                return;
            }

            if (Subscribers.ContainsKey(subscriber.ConnectionId))
            {
                if (Manager.LogDebug)
                {
                    Logging.Log(LogTag, $"Subscriber: {subscriber.ConnectionId} already added to {gameObject}.");
                }
                return;
            }

            Subscribers[subscriber.ConnectionId] = subscriber;
#if UNITY_EDITOR
            if (!subscriberIds.Contains(subscriber.ConnectionId))
            {
                subscriberIds.Add(subscriber.ConnectionId);
            }
#endif
            subscriber.AddSubscribing(this);
        }
        internal void AddSubscriber(LiteNetLibPlayer subscriber)
        {
            // Only server can manage subscribers
            if (!IsServer || subscriber == null)
            {
                return;
            }

            if (Subscribers.ContainsKey(subscriber.ConnectionId))
            {
                if (Manager.LogDebug)
                {
                    Debug.Log("Subscriber [" + subscriber.ConnectionId + "] already added to [" + gameObject + "]");
                }
                return;
            }

            Subscribers[subscriber.ConnectionId] = subscriber;
#if UNITY_EDITOR
            if (!subscriberIds.Contains(subscriber.ConnectionId))
            {
                subscriberIds.Add(subscriber.ConnectionId);
            }
#endif
            subscriber.AddSubscribing(this);
        }
Example #3
0
        public virtual void SetPlayerReady(long connectionId, NetDataReader reader)
        {
            if (!IsServer)
            {
                return;
            }

            LiteNetLibPlayer player = Players[connectionId];

            if (player.IsReady)
            {
                return;
            }

            player.IsReady = true;
            LiteNetLibIdentity playerIdentity = SpawnPlayer(connectionId);

            DeserializeClientReadyExtra(playerIdentity, connectionId, reader);
            foreach (LiteNetLibIdentity spawnedObject in Assets.SpawnedObjects.Values)
            {
                if (spawnedObject.ConnectionId == player.ConnectionId)
                {
                    continue;
                }

                if (spawnedObject.ShouldAddSubscriber(player))
                {
                    spawnedObject.AddSubscriber(player);
                }
            }
        }
Example #4
0
 public override void OnPeerConnected(long connectionId)
 {
     base.OnPeerConnected(connectionId);
     if (!Players.ContainsKey(connectionId))
     {
         Players[connectionId] = new LiteNetLibPlayer(this, connectionId);
     }
 }
Example #5
0
 public override void OnPeerDisconnected(long connectionId, DisconnectInfo disconnectInfo)
 {
     base.OnPeerDisconnected(connectionId, disconnectInfo);
     if (Players.ContainsKey(connectionId))
     {
         LiteNetLibPlayer player = Players[connectionId];
         player.ClearSubscribing(false);
         player.DestroyAllObjects();
         Players.Remove(connectionId);
     }
 }
Example #6
0
 public bool ShouldAddSubscriber(LiteNetLibPlayer subscriber)
 {
     for (int i = 0; i < Behaviours.Length; ++i)
     {
         if (!Behaviours[i].ShouldAddSubscriber(subscriber))
         {
             return(false);
         }
     }
     return(true);
 }
        public bool ShouldAddSubscriber(LiteNetLibPlayer subscriber)
        {
            int loopCounter;

            for (loopCounter = 0; loopCounter < Behaviours.Length; ++loopCounter)
            {
                if (!Behaviours[loopCounter].ShouldAddSubscriber(subscriber))
                {
                    return(false);
                }
            }
            return(true);
        }
        public void RemoveSubscriber(LiteNetLibPlayer subscriber, bool removePlayerSubscribing)
        {
            // Only server can manage subscribers
            if (!IsServer)
            {
                return;
            }

            Subscribers.Remove(subscriber.ConnectionId);
#if UNITY_EDITOR
            subscriberIds.Remove(subscriber.ConnectionId);
#endif
            if (removePlayerSubscribing)
            {
                subscriber.RemoveSubscribing(this, false);
            }
        }
Example #9
0
        public void SendServerError(long connectionId, bool shouldDisconnect, string errorMessage)
        {
            if (!IsServer)
            {
                return;
            }
            LiteNetLibPlayer player = null;

            if (!Players.TryGetValue(connectionId, out player) || !player.IsReady)
            {
                return;
            }
            ServerErrorMessage message = new ServerErrorMessage();

            message.shouldDisconnect = shouldDisconnect;
            message.errorMessage     = errorMessage;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameMsgTypes.ServerDestroyObject, message);
        }
Example #10
0
        public void SendServerDestroyObject(long connectionId, uint objectId, byte reasons)
        {
            if (!IsServer)
            {
                return;
            }
            LiteNetLibPlayer player = null;

            if (!Players.TryGetValue(connectionId, out player) || !player.IsReady)
            {
                return;
            }
            ServerDestroyObjectMessage message = new ServerDestroyObjectMessage();

            message.objectId = objectId;
            message.reasons  = reasons;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameMsgTypes.ServerDestroyObject, message);
        }
Example #11
0
        public virtual void SetPlayerNotReady(long connectionId, NetDataReader reader)
        {
            if (!IsServer)
            {
                return;
            }

            LiteNetLibPlayer player = Players[connectionId];

            if (!player.IsReady)
            {
                return;
            }

            player.IsReady = false;
            player.ClearSubscribing(true);
            player.DestroyAllObjects();
        }
Example #12
0
        public void SendServerSpawnSceneObject(long connectionId, LiteNetLibIdentity identity)
        {
            if (!IsServer)
            {
                return;
            }
            LiteNetLibPlayer player = null;

            if (!Players.TryGetValue(connectionId, out player) || !player.IsReady)
            {
                return;
            }
            ServerSpawnSceneObjectMessage message = new ServerSpawnSceneObjectMessage();

            message.objectId = identity.ObjectId;
            message.position = identity.transform.position;
            message.rotation = identity.transform.rotation;
            ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameMsgTypes.ServerSpawnSceneObject, message, identity.WriteInitialSyncFields);
        }
Example #13
0
        public void SendServerSpawnObject(long connectionId, LiteNetLibIdentity identity)
        {
            if (!IsServer)
            {
                return;
            }
            LiteNetLibPlayer player = null;

            if (!Players.TryGetValue(connectionId, out player) || !player.IsReady)
            {
                return;
            }
            var message = new ServerSpawnObjectMessage();

            message.hashAssetId = identity.HashAssetId;
            message.objectId    = identity.ObjectId;
            message.isOwner     = identity.ConnectionId == connectionId;
            message.position    = identity.transform.position;
            message.rotation    = identity.transform.rotation;
            ServerSendPacket(connectionId, SendOptions.ReliableOrdered, GameMsgTypes.ServerSpawnObject, message);
        }
        public override bool ShouldAddSubscriber(LiteNetLibPlayer subscriber)
        {
            if (subscriber == null)
            {
                return(false);
            }

            if (subscriber.ConnectionId == ConnectionId)
            {
                return(true);
            }

            foreach (LiteNetLibIdentity spawnedObject in subscriber.SpawnedObjects.Values)
            {
                Vector3 pos = spawnedObject.transform.position;
                if ((pos - transform.position).magnitude < range)
                {
                    return(true);
                }
            }
            return(false);
        }
Example #15
0
 /// <summary>
 /// Override this function to decides that old object should add new object as subscriber or not
 /// </summary>
 /// <param name="subscriber"></param>
 public virtual bool ShouldAddSubscriber(LiteNetLibPlayer subscriber)
 {
     return(true);
 }
        public void RebuildSubscribers(bool initialize)
        {
            // Only server can manage subscribers
            if (!IsServer || !IsSetupBehaviours)
            {
                return;
            }

            LiteNetLibPlayer ownerPlayer = Player;

            if (initialize)
            {
                AddSubscriber(ownerPlayer);
            }

            bool hasChanges    = false;
            bool shouldRebuild = false;
            HashSet <LiteNetLibPlayer> newSubscribers = new HashSet <LiteNetLibPlayer>();
            HashSet <LiteNetLibPlayer> oldSubscribers = new HashSet <LiteNetLibPlayer>(Subscribers.Values);

            int loopCounter;

            for (loopCounter = 0; loopCounter < Behaviours.Length; ++loopCounter)
            {
                shouldRebuild |= Behaviours[loopCounter].OnRebuildSubscribers(newSubscribers, initialize);
            }

            // If shouldRebuild is FALSE, it's means it does not have to rebuild subscribers
            if (!shouldRebuild)
            {
                // None of the behaviours rebuilt our subscribers, use built-in rebuild method
                if (initialize)
                {
                    foreach (LiteNetLibPlayer player in Manager.GetPlayers())
                    {
                        if (ConnectionId == player.ConnectionId || !player.IsReady)
                        {
                            continue;
                        }

                        if (ShouldAddSubscriber(player))
                        {
                            AddSubscriber(player);
                        }
                    }
                }
                return;
            }

            // Apply changes from rebuild
            foreach (LiteNetLibPlayer subscriber in newSubscribers)
            {
                if (subscriber == null)
                {
                    continue;
                }

                if (!subscriber.IsReady)
                {
                    if (Manager.LogWarn)
                    {
                        Logging.Log(LogTag, $"Subscriber: {subscriber.ConnectionId} is not ready.");
                    }
                    continue;
                }

                if ((ownerPlayer == null || subscriber.ConnectionId != ownerPlayer.ConnectionId) && (initialize || !oldSubscribers.Contains(subscriber)))
                {
                    subscriber.AddSubscribing(this);
                    if (Manager.LogDebug)
                    {
                        Logging.Log(LogTag, $"Add subscriber: {subscriber.ConnectionId} to {gameObject}.");
                    }
                    hasChanges = true;
                }
            }

            // Remove subscribers that is not in new subscribers list
            foreach (LiteNetLibPlayer subscriber in oldSubscribers)
            {
                if (!newSubscribers.Contains(subscriber))
                {
                    subscriber.RemoveSubscribing(this, true);
                    if (Manager.LogDebug)
                    {
                        Logging.Log(LogTag, $"Remove subscriber: {subscriber.ConnectionId} from {gameObject}.");
                    }
                    hasChanges = true;
                }
            }

            if (!hasChanges)
            {
                return;
            }

            // Rebuild subscribers
            Subscribers.Clear();
            foreach (LiteNetLibPlayer subscriber in newSubscribers)
            {
                Subscribers.Add(subscriber.ConnectionId, subscriber);
            }

#if UNITY_EDITOR
            subscriberIds.Clear();
            foreach (LiteNetLibPlayer subscriber in newSubscribers)
            {
                subscriberIds.Add(subscriber.ConnectionId);
            }
#endif
        }
Example #17
0
 public bool TryGetPlayer(long connectionId, out LiteNetLibPlayer player)
 {
     return(Players.TryGetValue(connectionId, out player));
 }