Esempio n. 1
0
        internal void CallRpc(NetMessage msg, NetMessageInfo info, SubMsgType sub)
        {
            if (msg.RemainingBits < 32)
            {
                Debug.LogWarning("Attempted to call an rpc on a network view, but there weren't enough bits remaining to do it.");
                return;
            }
            var id   = msg.ReadUInt16();
            var comp = msg.ReadByte();
            var rpc  = msg.ReadByte();

            NetworkView view;
            var         supposedToHave = _networkViews.TryGetValue(id, out view);

            if (supposedToHave && view != null)
            {
                view.IncomingRpc(comp, rpc, msg, info, sub);
            }
            else
            {
                Debug.LogWarning($"Could not find view {id} to call {comp} rpc {rpc}");
            }

            //todo: filter if rpc mode is all/others/owner, and then send to appropriate people.
            if (info.ContinueForwarding && view != null)
            {
                if (info.Mode == BroadcastMode.Others)
                {
                    view.SendExcept(msg, info.Sender, info.Reliability);
                }
                else if (info.Mode == BroadcastMode.All)
                {
                    view.SendMessage(msg, RpcUtils.RpcMode(info.Reliability, info.Mode));
                }
                else if (info.Mode == BroadcastMode.Owner && info.Sender != view.Owner && view.Owner.IsValid)
                {
                    view.Owner.SendMessage(msg, info.Reliability);
                }
            }
        }