/// <summary> /// To consume the data of the NetWorker with a player's data /// </summary> /// <param name="socket">The NetWorker socket to be used</param> /// <param name="sender">The player who is sending the data</param> /// <param name="message">Data that is being sent</param> /// <returns></returns> public NetworkingStream Consume(NetWorker socket, NetworkingPlayer sender, BMSByte message) { lock (networkedObjectMutex) { Sender = sender; NetworkedBehaviorId = 0; ByteReadIndex = 0; Bytes.Clone(message); FrameIndex = message[message.StartIndex() + message.Size - 1]; ProtocolType = (Networking.ProtocolType)ObjectMapper.Map <int>(this); Receivers = (NetworkReceivers)ObjectMapper.Map <int>(this); RealSenderId = ObjectMapper.Map <ulong>(this); if (ProtocolType == Networking.ProtocolType.HTTP || ProtocolType == Networking.ProtocolType.QuickUDP || ProtocolType == Networking.ProtocolType.QuickTCP) { Ready = true; return(this); } char identifier = (char)ReadByte(); // ObjectMapper.Map<char>(this); if (identifier == identifier_NONE) { identifierType = IdentifierType.None; } else if (identifier == identifier_RPC) { identifierType = IdentifierType.RPC; BufferedRPC = ReadByte() == 1; } else if (identifier == identifier_PLAYER) { identifierType = IdentifierType.Player; } else if (identifier == identifier_NETWORKED_BEHAVIOR) { identifierType = IdentifierType.NetworkedBehavior; } else if (identifier == identifier_DISCONNECT) { identifierType = IdentifierType.Disconnect; } else if (identifier == identifier_CUSTOM) { identifierType = IdentifierType.Custom; } NetworkedBehaviorId = ObjectMapper.Map <ulong>(this); NetworkedBehavior = SimpleNetworkedMonoBehavior.Locate(NetworkedBehaviorId); if (NetworkedBehaviorId > 0 && ReferenceEquals(NetworkedBehavior, null) && identifierType != IdentifierType.RPC) { return(null); } // Remove the size of ProtocolType, identifier, NetworkId, etc. Bytes.RemoveStart(ByteReadIndex); ByteReadIndex = 0; if (socket.Uniqueidentifier == 0 && !socket.IsServer && identifierType == IdentifierType.Player) { if (socket != null) { socket.AssignUniqueId(ObjectMapper.Map <ulong>(this)); Bytes.RemoveStart(sizeof(ulong)); } else { Bytes.RemoveStart(sizeof(ulong)); } if (socket != null && !socket.IsServer) { if (!socket.MasterServerFlag) { if (socket.UsingUnityEngine && ((ReferenceEquals(NetworkingManager.Instance, null) || !NetworkingManager.Instance.IsSetup || ReferenceEquals(NetworkingManager.Instance.OwningNetWorker, null)))) { NetworkingManager.setupActions.Add(socket.GetNewPlayerUpdates); } else { socket.GetNewPlayerUpdates(); } } } } ByteReadIndex = 0; if (identifierType == IdentifierType.NetworkedBehavior && !ReferenceEquals(NetworkedBehavior, null)) { if (NetworkedBehavior is NetworkedMonoBehavior) { ((NetworkedMonoBehavior)NetworkedBehavior).PrepareDeserialize(this); } else { throw new Exception("Only NetworkedMonoBehaviors can be used for serialization and deserialization across the network, object with id " + NetworkedBehavior.NetworkedId + " is not a \"NetworkedMonoBehavior\""); } } if (identifierType == IdentifierType.Custom) { Customidentifier = ObjectMapper.Map <uint>(this); Bytes.RemoveStart(sizeof(uint)); } ByteReadIndex = 0; Ready = true; if (NetworkedBehaviorId > 0 && ReferenceEquals(NetworkedBehavior, null)) { if (identifierType == IdentifierType.RPC) { SimpleNetworkedMonoBehavior.QueueRPCForInstantiate(NetworkedBehaviorId, this); SkipReplication = true; return(this); } return(null); } return(this); } }
/// <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); } }