Esempio n. 1
0
        /// <summary>
        /// The final steps for preparing the NetworkingStream
        /// </summary>
        /// <param name="socket">The NetWorker socket to be used</param>
        /// <param name="identifierType">The type of Identifier it is going to prepare</param>
        /// <param name="behaviorNetworkId">NetworkedBehavior to use</param>
        /// <param name="extra">Extra parameters to prepare</param>
        /// <param name="receivers">Who shall be receiving this NetworkingStream</param>
        /// <param name="bufferedRPC">To know if this is a Buffered RPC</param>
        /// <param name="customidentifier">A custom Identifier to be passed through</param>
        /// <returns></returns>
        public NetworkingStream PrepareFinal(NetWorker socket, IdentifierType identifierType, ulong behaviorNetworkId, BMSByte extra = null, NetworkReceivers receivers = NetworkReceivers.All, bool bufferedRPC = false, uint customidentifier = 0, ulong senderId = 0)
        {
            lock (networkedObjectMutex)
            {
                if (senderId == 0)
                {
                    senderId = socket.Me != null ? socket.Me.NetworkId : 0;
                }

                NetworkedBehaviorId = behaviorNetworkId;
                RealSenderId        = senderId;
                Receivers           = receivers;
                Customidentifier    = customidentifier;
                BufferedRPC         = Receivers == NetworkReceivers.AllBuffered || Receivers == NetworkReceivers.OthersBuffered;

                Bytes.Clear();

                ObjectMapper.MapBytes(bytes, (int)ProtocolType);

                ObjectMapper.MapBytes(bytes, (int)receivers);
                ObjectMapper.MapBytes(bytes, socket.Uniqueidentifier);

                if (ProtocolType != Networking.ProtocolType.HTTP && ProtocolType != Networking.ProtocolType.QuickUDP && ProtocolType != Networking.ProtocolType.QuickTCP)
                {
                    this.identifierType = identifierType;

                    if (identifierType == IdentifierType.None)
                    {
                        Bytes.BlockCopy <byte>(((byte)identifier_NONE), 1);
                    }
                    else if (identifierType == IdentifierType.RPC)
                    {
                        Bytes.BlockCopy <byte>(((byte)identifier_RPC), 1);
                        Bytes.BlockCopy <byte>(((byte)(bufferedRPC ? 1 : 0)), 1);
                    }
                    else if (identifierType == IdentifierType.Player)
                    {
                        Bytes.BlockCopy <byte>(((byte)identifier_PLAYER), 1);
                    }
                    else if (identifierType == IdentifierType.NetworkedBehavior)
                    {
                        Bytes.BlockCopy <byte>(((byte)identifier_NETWORKED_BEHAVIOR), 1);
                    }
                    else if (identifierType == IdentifierType.Disconnect)
                    {
                        Bytes.BlockCopy <byte>(((byte)identifier_DISCONNECT), 1);
                    }
                    else if (identifierType == IdentifierType.Custom)
                    {
                        Bytes.BlockCopy <byte>(((byte)identifier_CUSTOM), 1);
                    }

                    ObjectMapper.MapBytes(bytes, behaviorNetworkId);
                }

                if (identifierType == IdentifierType.Custom)
                {
                    ObjectMapper.MapBytes(bytes, Customidentifier);
                }

                if (extra != null)
                {
                    Bytes.BlockCopy(extra.byteArr, extra.StartIndex(), extra.Size);
                }

                if (!ReferenceEquals(NetworkingManager.Instance, null))
                {
                    ObjectMapper.MapBytes(Bytes, NetworkingManager.Instance.CurrentFrame);
                }
                else
                {
                    ObjectMapper.MapBytes(Bytes, (byte)0);
                }

                if (ProtocolType == Networking.ProtocolType.TCP)
                {
                    List <byte> head = new List <byte>(BitConverter.GetBytes(Bytes.Size + 1));
                    head.Add(0);
                    Bytes.InsertRange(0, head.ToArray());
                }

                Ready = true;
                return(this);
            }
        }