/// <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); } } }
/// <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; } }