/// <summary> /// find a networkview based on a networkviewid that was serialized into an rpc /// </summary> /// <param name="message">uses deserialize, so the read location does advance</param> /// <param name="view"></param> /// <returns></returns> public static bool Find(ref NetIncomingMessage message, out NetworkView view) { var viewId = new NetworkViewId(); viewId.OnDeserialize(message); if (UnityEngineHook.ValidInstance) return UnityEngineHook.Instance.Manager.TryGetView(viewId, out view); view = null; return false; }
private static void Consume(NetIncomingMessage msg) { try { //faster than switch, as this is in most to least common order if (msg.SequenceChannel == Channels.UNRELIABLE_STREAM) { var actorId = msg.ReadUInt16(); NetworkView find; if (NetworkView.Find(actorId, out find)) { find.OnDeserializeStream(msg); } } else if (msg.SequenceChannel == Channels.RELIABLE_STREAM) { var actorId = msg.ReadUInt16(); NetworkView find; if (NetworkView.Find(actorId, out find)) { find.OnDeserializeStream(msg); } } else if (msg.SequenceChannel >= Channels.BEGIN_RPCMODES && msg.SequenceChannel <= Channels.OWNER_RPC) { //rpc... var viewID = msg.ReadUInt16(); var rpcId = msg.ReadByte(); NetworkView find; if (NetworkView.Find(viewID, out find)) { find.CallRPC(rpcId, msg); } else { Debug.LogWarning("couldn't find view " + viewID + " to send rpc " + rpcId); } } else if (msg.SequenceChannel == Channels.SYNCHED_FIELD) { var viewId = msg.ReadUInt16(); var fieldId = msg.ReadByte(); NetworkView find; if (NetworkView.Find(viewId, out find)) { find.SetSynchronizedField(fieldId, msg); } else { Debug.LogWarning("couldn't find view " + viewId + " to set field " + fieldId); } } else if (msg.SequenceChannel == Channels.OBJECT_RPC) { var viewId = msg.ReadUInt16(); var rpcId = msg.ReadByte(); NetworkedSceneObject find; if (NetworkedSceneObject.sceneObjects.TryGetValue(viewId, out find)) { find.CallRPC(rpcId, msg); } } else if (msg.SequenceChannel == Channels.STATIC_RPC) { var rpcId = msg.ReadByte(); if (ProcessRPC != null) { ProcessRPC(rpcId, msg); } } else if (msg.SequenceChannel == Channels.STATIC_UTILS) { ProcessUtils(msg); } else { Debug.LogWarning("data received over unhandled channel " + msg.SequenceChannel); } } catch (Exception er) { Debug.LogError(er); } }
static void Update() { if (!isMessageQueueRunning) { return; } List <NetIncomingMessage> messages = new List <NetIncomingMessage>(); int counter = peer.ReadMessages(messages); foreach (var msg in messages) { //faster than switch, as most will be Data messages. if (msg.MessageType == NetIncomingMessageType.Data) { Consume(msg); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.DiscoveryResponse) { if (OnDiscoveryResponse != null) { OnDiscoveryResponse(msg); } peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.WarningMessage) { Debug.LogWarning(msg.ReadString()); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.ConnectionLatencyUpdated) { Latency = msg.ReadFloat(); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.ErrorMessage) { Debug.LogError(msg.ReadString()); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.StatusChanged) { var lastStatus = m_status; m_status = (NetConnectionStatus)msg.ReadByte(); statusReason = msg.ReadString(); peer.Recycle(msg); try { if (m_status == NetConnectionStatus.Disconnected) { if (lastStatus != NetConnectionStatus.Disconnected) { if (OnDisconnectedFromServer != null) { OnDisconnectedFromServer(); } if (Configuration.DeleteNetworkInstantiatesOnDisconnect) { NetworkView.DestroyAllViews(); } } else { if (OnFailedToConnect != null) { OnFailedToConnect(statusReason); } } } else if (m_status == NetConnectionStatus.Connected) { if (OnConnectedToServer != null) { OnConnectedToServer(); } } } catch (Exception e) { Debug.LogError(e); } } else if (msg.MessageType == NetIncomingMessageType.Error) { Debug.LogError(msg.ReadString()); //this should really never happen... peer.Recycle(msg); } else { peer.Recycle(msg); } } }
private static void ProcessUtils(NetIncomingMessage msg) { var utilId = msg.ReadByte(); if (utilId == RPCUtils.TimeUpdate) { } else if (utilId == RPCUtils.Instantiate) { //read the path... var resourcePath = msg.ReadString(); var viewId = msg.ReadUInt16(); var ownerId = msg.ReadUInt16(); GameObject gobj; bool isCached = false; if (resourceCaching && (isCached = ResourceCache.ContainsKey(resourcePath))) { gobj = ResourceCache[resourcePath]; } else { gobj = Resources.Load(resourcePath) as GameObject; } if (resourceCaching && !isCached) { ResourceCache.Add(resourcePath, gobj); } var instance = (GameObject)GameObject.Instantiate(gobj); if (instance == null) { Debug.LogWarning("could not find prefab " + resourcePath + " to instantiate"); return; } var trans = instance.transform; trans.position = Vector3Serializer.Deserialize(msg); trans.rotation = QuaternionSerializer.Deserialize(msg); if (Debug.isDebugBuild) { Debug.Log(string.Format("network instantiate of {0}. Loc: {1} Rot: {2}", resourcePath, trans.position, trans.rotation)); } //look for a networkview.. var view = instance.GetComponent <NetworkView>(); if (view) { NetworkView.RegisterView(view, viewId); view.viewID = new NetworkViewId() { guid = viewId, IsMine = PlayerId == ownerId }; view.IsMine = PlayerId == ownerId; view.OwnerId = ownerId; var nBehaviours = instance.GetComponents <NetBehaviour>(); foreach (var behave in nBehaviours) { behave.netView = view; view.OnFinishedCreation += behave.CallFinished; } view.DoOnFinishedCreation(); FinishedInstantiate(view.viewID.guid); } } else if (utilId == RPCUtils.Remove) { var viewId = msg.ReadUInt16(); NetworkView find; if (NetworkView.Find(viewId, out find)) { find.DoOnRemove(); UnityEngine.Object.Destroy(find); } NetworkView.RemoveView(viewId); } else if (utilId == RPCUtils.ChangeRoom) { var newRoom = msg.ReadString(); NetworkedSceneObject.sceneObjects = new Dictionary <int, NetworkedSceneObject>(); if (OnRoomChange != null) { OnRoomChange(newRoom); } if (Configuration.DeleteNetworkInstantiatesOnRoomChange) { NetworkView.DestroyAllViews(); } } else if (utilId == RPCUtils.AddView) { var addToId = msg.ReadUInt16(); var idToAdd = msg.ReadUInt16(); string customFunction; var runCustomFunction = msg.ReadString(out customFunction); NetworkView view; if (NetworkView.Find(addToId, out view)) { var newView = view.gameObject.AddComponent <NetworkView>(); NetworkView.RegisterView(newView, idToAdd); newView.viewID = new NetworkViewId() { guid = idToAdd, IsMine = view.IsMine }; newView.IsMine = view.IsMine; newView.OwnerId = view.OwnerId; if (runCustomFunction) { view.gameObject.SendMessage(customFunction, newView, SendMessageOptions.RequireReceiver); } } } else if (utilId == RPCUtils.SetPlayerId) { var playerId = msg.ReadUInt16(); PlayerId = playerId; if (Debug.isDebugBuild) { Debug.Log("Setting player id to " + playerId); } } }
internal static void RegisterView(NetworkView view, ushort viewId) { allViews.Add(viewId, view); }
/// <summary> /// find a networkview based on a networkviewid that was serialized into an rpc /// </summary> /// <param name="message">uses deserialize, so the read location does advance</param> /// <param name="view"></param> /// <returns></returns> public static bool Find(ref NetIncomingMessage message, out NetworkView view) { var id = NetworkViewId.Deserialize(message); return(Find(id, out view)); }
internal void AddView(PNetC.NetworkView newView, NetworkView view) { _networkViews.Add(newView.ViewID, view); view.SetNetworkView(newView); }
internal bool TryGetView(NetworkViewId viewId, out NetworkView view) { return _networkViews.TryGetValue(viewId, out view); }
internal bool TryGetView(NetworkViewId viewId, out NetworkView view) { return(_networkViews.TryGetValue(viewId, out view)); }