コード例 #1
0
 /// <summary> Calculates scope for every connection against the provided view's scope.
 /// This is useful, for example, when creating a new view so that it can be immediately
 /// instantiated since a delay may be undesireable. </summary>
 internal void FullScopeCalculation(NetView view)
 {
     if (view.Server != Socket.Self)
     {
         return;
     }
     for (int i = 0; i < Socket.Connections.Count; i++)
     {
         NetConnection connection = Socket.Connections[i];
         if (connection.IsServer || !connection.HasScope)
         {
             continue;
         }
         if (view.IsController(connection))
         {
             view.SendInstantiateData(connection);
         }
         else if (connection.InGroup(view.Group) && view.CanInstantiateFor(connection) && UpdateScope(connection.Scope, view))
         {
             view.SendInstantiateData(connection);
         }
     }
 }
コード例 #2
0
        /// <summary> Sends an RPC to connections that are in-scope for the provided view. </summary>
        internal void Send(NetView view, NetMessage netMessage, RpcTarget target)
        {
            switch (target)
            {
            case (RpcTarget.All):
                for (int i = 0; i < Socket.Connections.Count; i++)
                {
                    var connection = Socket.Connections[i];
                    if (!connection.HasScope)
                    {
                        continue;
                    }
                    if (view.Group != 0 && !connection.InGroup(view.Group))
                    {
                        continue;
                    }
                    if ((netMessage.Reliable && connection.Scope.In(view.Id)) || connection.Scope.In(view.Id, syncFrame) || view.IsController(connection))
                    {
                        connection.Send(netMessage);
                    }
                }
                break;

            case (RpcTarget.Controllers):
                foreach (NetConnection controller in view.Controllers)
                {
                    if (controller == Socket.Self)
                    {
                        continue;
                    }
                    controller.Send(netMessage);
                }
                break;

            case (RpcTarget.NonControllers):
                for (int i = 0; i < Socket.Connections.Count; i++)
                {
                    var connection = Socket.Connections[i];
                    if (connection.IsServer || !connection.HasScope)
                    {
                        continue;
                    }
                    if (view.IsController(connection))
                    {
                        continue;
                    }
                    if (view.Group != 0 && !connection.InGroup(view.Group))
                    {
                        continue;
                    }
                    if ((netMessage.Reliable && connection.Scope.In(view.Id)) || connection.Scope.In(view.Id, syncFrame))
                    {
                        connection.Send(netMessage);
                    }
                }
                break;

            case (RpcTarget.Server):
                if (view.Server != Socket.Self)
                {
                    view.Server.Send(netMessage);
                }
                else
                {
                    NetLog.Warning("Trying to send message to self.");
                }
                break;

            case (RpcTarget.AllInclOutOfScope):
                for (int i = 0; i < Socket.Connections.Count; i++)
                {
                    var connection = Socket.Connections[i];
                    if (view.Group != 0 && !connection.InGroup(view.Group))
                    {
                        continue;
                    }
                    connection.Send(netMessage);
                }
                break;
            }
        }