using System; using System.Collections.Generic; using System.IO; using System.Text; using ExitGames.Client.Photon.EncryptorManaged; namespace ExitGames.Client.Photon { // Token: 0x02000017 RID: 23 internal class EnetPeer : PeerBase { // Token: 0x1700005C RID: 92 // (get) Token: 0x0600014A RID: 330 RVA: 0x0000A930 File Offset: 0x00008B30 internal override int QueuedIncomingCommandsCount { get { int num = 0; EnetChannel[] array = this.channelArray; lock (array) { for (int i = 0; i < this.channelArray.Length; i++) { EnetChannel enetChannel = this.channelArray[i]; num += enetChannel.incomingReliableCommandsList.Count; num += enetChannel.incomingUnreliableCommandsList.Count; } } return num; } } // Token: 0x1700005D RID: 93 // (get) Token: 0x0600014B RID: 331 RVA: 0x0000A9B4 File Offset: 0x00008BB4 internal override int QueuedOutgoingCommandsCount { get { int num = 0; EnetChannel[] array = this.channelArray; lock (array) { for (int i = 0; i < this.channelArray.Length; i++) { EnetChannel enetChannel = this.channelArray[i]; num += enetChannel.outgoingReliableCommandsList.Count; num += enetChannel.outgoingUnreliableCommandsList.Count; } } return num; } } // Token: 0x1700005E RID: 94 // (get) Token: 0x0600014C RID: 332 RVA: 0x0000AA38 File Offset: 0x00008C38 private Encryptor encryptor { get { return this.ppeer.encryptor; } } // Token: 0x1700005F RID: 95 // (get) Token: 0x0600014D RID: 333 RVA: 0x0000AA58 File Offset: 0x00008C58 private Decryptor decryptor { get { return this.ppeer.decryptor; } } // Token: 0x0600014E RID: 334 RVA: 0x0000AA78 File Offset: 0x00008C78 internal EnetPeer() { PeerBase.peerCount += 1; base.InitOnce(); this.TrafficPackageHeaderSize = 12; } // Token: 0x0600014F RID: 335 RVA: 0x0000AAE4 File Offset: 0x00008CE4 internal override void InitPeerBase() { base.InitPeerBase(); bool flag = this.ppeer.PayloadEncryptionSecret != null && this.usedProtocol == ConnectionProtocol.Udp; if (flag) { this.InitEncryption(this.ppeer.PayloadEncryptionSecret); } bool flag2 = this.encryptor != null && this.decryptor != null; if (flag2) { this.isEncryptionAvailable = true; } this.peerID = (this.ppeer.EnableServerTracing ? -2 : -1); this.challenge = SupportClass.ThreadSafeRandom.Next(); bool flag3 = this.udpBuffer == null || this.udpBuffer.Length != base.mtu; if (flag3) { this.udpBuffer = new byte[base.mtu]; } this.reliableCommandsSent = 0; this.reliableCommandsRepeated = 0; EnetChannel[] array = this.channelArray; lock (array) { EnetChannel[] array2 = this.channelArray; bool flag4 = array2.Length != (int)(base.ChannelCount + 1); if (flag4) { array2 = new EnetChannel[(int)(base.ChannelCount + 1)]; } for (byte b = 0; b < base.ChannelCount; b += 1) { array2[(int)b] = new EnetChannel(b, this.commandBufferSize); } array2[(int)base.ChannelCount] = new EnetChannel(byte.MaxValue, this.commandBufferSize); this.channelArray = array2; } List list = this.sentReliableCommands; lock (list) { this.sentReliableCommands = new List(this.commandBufferSize); } this.outgoingAcknowledgementsPool = new StreamBuffer(0); base.CommandLogInit(); } // Token: 0x06000150 RID: 336 RVA: 0x0000ACAC File Offset: 0x00008EAC internal override bool Connect(string ipport, string appID, object custom = null) { bool flag = this.peerConnectionState > PeerBase.ConnectionStateValue.Disconnected; bool flag2; if (flag) { base.Listener.DebugReturn(DebugLevel.WARNING, "Connect() can't be called if peer is not Disconnected. Not connecting. peerConnectionState: " + this.peerConnectionState); flag2 = false; } else { bool flag3 = base.debugOut >= DebugLevel.ALL; if (flag3) { base.Listener.DebugReturn(DebugLevel.ALL, "Connect()"); } base.ServerAddress = ipport; this.InitPeerBase(); bool flag4 = base.SocketImplementation != null; if (flag4) { this.rt = (IPhotonSocket)Activator.CreateInstance(base.SocketImplementation, new object[] { this }); } else { this.rt = new SocketUdp(this); } bool flag5 = this.rt == null; if (flag5) { base.Listener.DebugReturn(DebugLevel.ERROR, "Connect() failed, because SocketImplementation or socket was null. Set PhotonPeer.SocketImplementation before Connect()."); flag2 = false; } else { bool flag6 = this.rt.Connect(); if (flag6) { bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { base.TrafficStatsOutgoing.ControlCommandBytes += 44; base.TrafficStatsOutgoing.ControlCommandCount++; } this.peerConnectionState = PeerBase.ConnectionStateValue.Connecting; flag2 = true; } else { flag2 = false; } } } return flag2; } // Token: 0x06000151 RID: 337 RVA: 0x0000ADE2 File Offset: 0x00008FE2 public override void OnConnect() { this.QueueOutgoingReliableCommand(new NCommand(this, 2, null, byte.MaxValue)); } // Token: 0x06000152 RID: 338 RVA: 0x0000ADFC File Offset: 0x00008FFC internal override void Disconnect() { bool flag = this.peerConnectionState == PeerBase.ConnectionStateValue.Disconnected || this.peerConnectionState == PeerBase.ConnectionStateValue.Disconnecting; if (!flag) { bool flag2 = this.sentReliableCommands != null; if (flag2) { List list = this.sentReliableCommands; lock (list) { this.sentReliableCommands.Clear(); } } EnetChannel[] array = this.channelArray; lock (array) { foreach (EnetChannel enetChannel in this.channelArray) { enetChannel.clearAll(); } } bool isSimulationEnabled = base.NetworkSimulationSettings.IsSimulationEnabled; base.NetworkSimulationSettings.IsSimulationEnabled = false; NCommand ncommand = new NCommand(this, 4, null, byte.MaxValue); this.QueueOutgoingReliableCommand(ncommand); this.SendOutgoingCommands(); bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { base.TrafficStatsOutgoing.CountControlCommand(ncommand.Size); } base.NetworkSimulationSettings.IsSimulationEnabled = isSimulationEnabled; this.rt.Disconnect(); this.peerConnectionState = PeerBase.ConnectionStateValue.Disconnected; base.EnqueueStatusCallback(StatusCode.Disconnect); this.datagramEncryptedConnection = false; } } // Token: 0x06000153 RID: 339 RVA: 0x0000AF50 File Offset: 0x00009150 internal override void StopConnection() { bool flag = this.rt != null; if (flag) { this.rt.Disconnect(); } this.peerConnectionState = PeerBase.ConnectionStateValue.Disconnected; bool flag2 = base.Listener != null; if (flag2) { base.Listener.OnStatusChanged(StatusCode.Disconnect); } } // Token: 0x06000154 RID: 340 RVA: 0x0000AFA0 File Offset: 0x000091A0 internal override void FetchServerTimestamp() { bool flag = this.peerConnectionState != PeerBase.ConnectionStateValue.Connected || !this.ApplicationIsInitialized; if (flag) { bool flag2 = base.debugOut >= DebugLevel.INFO; if (flag2) { base.EnqueueDebugReturn(DebugLevel.INFO, "FetchServerTimestamp() was skipped, as the client is not connected. Current ConnectionState: " + this.peerConnectionState); } } else { this.CreateAndEnqueueCommand(12, new byte[0], byte.MaxValue); } } // Token: 0x06000155 RID: 341 RVA: 0x0000B010 File Offset: 0x00009210 internal override bool DispatchIncomingCommands() { for (;;) { Queue actionQueue = this.ActionQueue; PeerBase.MyAction myAction; lock (actionQueue) { bool flag = this.ActionQueue.Count <= 0; if (flag) { break; } myAction = this.ActionQueue.Dequeue(); } myAction(); } NCommand ncommand = null; EnetChannel[] array = this.channelArray; lock (array) { for (int i = 0; i < this.channelArray.Length; i++) { EnetChannel enetChannel = this.channelArray[i]; bool flag2 = enetChannel.incomingUnreliableCommandsList.Count > 0; if (flag2) { int num = int.MaxValue; foreach (int num2 in enetChannel.incomingUnreliableCommandsList.Keys) { NCommand ncommand2 = enetChannel.incomingUnreliableCommandsList[num2]; bool flag3 = num2 < enetChannel.incomingUnreliableSequenceNumber || ncommand2.reliableSequenceNumber < enetChannel.incomingReliableSequenceNumber; if (flag3) { this.commandsToRemove.Enqueue(num2); } else { bool flag4 = base.limitOfUnreliableCommands > 0 && enetChannel.incomingUnreliableCommandsList.Count > base.limitOfUnreliableCommands; if (flag4) { this.commandsToRemove.Enqueue(num2); } else { bool flag5 = num2 < num; if (flag5) { bool flag6 = ncommand2.reliableSequenceNumber > enetChannel.incomingReliableSequenceNumber; if (!flag6) { num = num2; } } } } } while (this.commandsToRemove.Count > 0) { enetChannel.incomingUnreliableCommandsList.Remove(this.commandsToRemove.Dequeue()); } bool flag7 = num < int.MaxValue; if (flag7) { ncommand = enetChannel.incomingUnreliableCommandsList[num]; } bool flag8 = ncommand != null; if (flag8) { enetChannel.incomingUnreliableCommandsList.Remove(ncommand.unreliableSequenceNumber); enetChannel.incomingUnreliableSequenceNumber = ncommand.unreliableSequenceNumber; break; } } bool flag9 = ncommand == null && enetChannel.incomingReliableCommandsList.Count > 0; if (flag9) { enetChannel.incomingReliableCommandsList.TryGetValue(enetChannel.incomingReliableSequenceNumber + 1, out ncommand); bool flag10 = ncommand == null; if (!flag10) { bool flag11 = ncommand.commandType != 8; if (flag11) { enetChannel.incomingReliableSequenceNumber = ncommand.reliableSequenceNumber; enetChannel.incomingReliableCommandsList.Remove(ncommand.reliableSequenceNumber); break; } bool flag12 = ncommand.fragmentsRemaining > 0; if (flag12) { ncommand = null; } else { byte[] array2 = new byte[ncommand.totalLength]; for (int j = ncommand.startSequenceNumber; j < ncommand.startSequenceNumber + ncommand.fragmentCount; j++) { bool flag13 = enetChannel.ContainsReliableSequenceNumber(j); if (!flag13) { throw new Exception("command.fragmentsRemaining was 0, but not all fragments are found to be combined!"); } NCommand ncommand3 = enetChannel.FetchReliableSequenceNumber(j); Buffer.BlockCopy(ncommand3.Payload, 0, array2, ncommand3.fragmentOffset, ncommand3.Payload.Length); enetChannel.incomingReliableCommandsList.Remove(ncommand3.reliableSequenceNumber); } bool flag14 = base.debugOut >= DebugLevel.ALL; if (flag14) { base.Listener.DebugReturn(DebugLevel.ALL, "assembled fragmented payload from " + ncommand.fragmentCount + " parts. Dispatching now."); } ncommand.Payload = array2; ncommand.Size = 12 * ncommand.fragmentCount + ncommand.totalLength; enetChannel.incomingReliableSequenceNumber = ncommand.reliableSequenceNumber + ncommand.fragmentCount - 1; } break; } } } } bool flag15 = ncommand != null && ncommand.Payload != null; if (flag15) { this.ByteCountCurrentDispatch = ncommand.Size; this.CommandInCurrentDispatch = ncommand; bool flag16 = this.DeserializeMessageAndCallback(ncommand.Payload); if (flag16) { this.CommandInCurrentDispatch = null; return true; } this.CommandInCurrentDispatch = null; } return false; } // Token: 0x06000156 RID: 342 RVA: 0x0000B488 File Offset: 0x00009688 private int GetFragmentLength() { int num = base.mtu; bool flag = this.datagramEncryptedConnection; int num2; if (flag) { num = num - 7 - EnetPeer.HMAC_SIZE - EnetPeer.IV_SIZE; num = num / EnetPeer.BLOCK_SIZE * EnetPeer.BLOCK_SIZE; num = num - 5 - 36; num2 = num; } else { num2 = num - 12 - 36; } return num2; } // Token: 0x06000157 RID: 343 RVA: 0x0000B4DC File Offset: 0x000096DC private int CalculateBufferLen() { int num = base.mtu; bool flag = this.datagramEncryptedConnection; int num2; if (flag) { num = num - 7 - EnetPeer.HMAC_SIZE - EnetPeer.IV_SIZE; num = num / EnetPeer.BLOCK_SIZE * EnetPeer.BLOCK_SIZE; num--; num2 = num; } else { num2 = num; } return num2; } // Token: 0x06000158 RID: 344 RVA: 0x0000B528 File Offset: 0x00009728 private int CalculateInitialOffset() { bool flag = this.datagramEncryptedConnection; int num; if (flag) { num = 5; } else { int num2 = 12; bool crcEnabled = base.crcEnabled; if (crcEnabled) { num2 += 4; } num = num2; } return num; } // Token: 0x06000159 RID: 345 RVA: 0x0000B560 File Offset: 0x00009760 internal override bool SendAcksOnly() { bool flag = this.peerConnectionState == PeerBase.ConnectionStateValue.Disconnected; bool flag2; if (flag) { flag2 = false; } else { bool flag3 = this.rt == null || !this.rt.Connected; if (flag3) { flag2 = false; } else { byte[] array = this.udpBuffer; lock (array) { int num = 0; this.udpBufferIndex = this.CalculateInitialOffset(); this.udpBufferLength = this.CalculateBufferLen(); this.udpCommandCount = 0; this.timeInt = SupportClass.GetTickCount() - this.timeBase; StreamBuffer streamBuffer = this.outgoingAcknowledgementsPool; lock (streamBuffer) { num = this.SerializeAckToBuffer(); this.timeLastSendAck = this.timeInt; } bool flag4 = this.timeInt > this.timeoutInt && this.sentReliableCommands.Count > 0; if (flag4) { List list = this.sentReliableCommands; lock (list) { foreach (NCommand ncommand in this.sentReliableCommands) { bool flag5 = ncommand != null && ncommand.roundTripTimeout != 0 && this.timeInt - ncommand.commandSentTime > ncommand.roundTripTimeout; if (flag5) { ncommand.commandSentCount = 1; ncommand.roundTripTimeout = 0; ncommand.timeoutTime = int.MaxValue; ncommand.commandSentTime = this.timeInt; } } } } bool flag6 = this.udpCommandCount <= 0; if (flag6) { flag2 = false; } else { bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { TrafficStats trafficStatsOutgoing = base.TrafficStatsOutgoing; int totalPacketCount = trafficStatsOutgoing.TotalPacketCount; trafficStatsOutgoing.TotalPacketCount = totalPacketCount + 1; base.TrafficStatsOutgoing.TotalCommandsInPackets += (int)this.udpCommandCount; } this.SendData(this.udpBuffer, this.udpBufferIndex); flag2 = num > 0; } } } } return flag2; } // Token: 0x0600015A RID: 346 RVA: 0x0000B7D0 File Offset: 0x000099D0 internal override bool SendOutgoingCommands() { bool flag = this.peerConnectionState == PeerBase.ConnectionStateValue.Disconnected; bool flag2; if (flag) { flag2 = false; } else { bool flag3 = !this.rt.Connected; if (flag3) { flag2 = false; } else { byte[] array = this.udpBuffer; lock (array) { int num = 0; this.udpBufferIndex = this.CalculateInitialOffset(); this.udpBufferLength = this.CalculateBufferLen(); this.udpCommandCount = 0; this.timeInt = SupportClass.GetTickCount() - this.timeBase; this.timeLastSendOutgoing = this.timeInt; StreamBuffer streamBuffer = this.outgoingAcknowledgementsPool; lock (streamBuffer) { bool flag4 = this.outgoingAcknowledgementsPool.Length > 0L; if (flag4) { num = this.SerializeAckToBuffer(); this.timeLastSendAck = this.timeInt; } } bool flag5 = !base.IsSendingOnlyAcks && this.timeInt > this.timeoutInt && this.sentReliableCommands.Count > 0; if (flag5) { List list = this.sentReliableCommands; lock (list) { this.commandsToResend.Clear(); foreach (NCommand ncommand in this.sentReliableCommands) { bool flag6 = ncommand != null && this.timeInt - ncommand.commandSentTime > ncommand.roundTripTimeout; if (flag6) { bool flag7 = (int)ncommand.commandSentCount > base.sentCountAllowance || this.timeInt > ncommand.timeoutTime; if (flag7) { bool flag8 = base.debugOut >= DebugLevel.WARNING; if (flag8) { base.Listener.DebugReturn(DebugLevel.WARNING, string.Concat(new object[] { "Timeout-disconnect! Command: ", ncommand, " now: ", this.timeInt, " challenge: ", Convert.ToString(this.challenge, 16) })); } bool flag9 = this.CommandLog != null; if (flag9) { this.CommandLog.Enqueue(new CmdLogSentReliable(ncommand, this.timeInt, this.roundTripTime, this.roundTripTimeVariance, true)); base.CommandLogResize(); } this.peerConnectionState = PeerBase.ConnectionStateValue.Zombie; base.Listener.OnStatusChanged(StatusCode.TimeoutDisconnect); this.Disconnect(); return false; } this.commandsToResend.Enqueue(ncommand); } } while (this.commandsToResend.Count > 0) { NCommand ncommand2 = this.commandsToResend.Dequeue(); this.QueueOutgoingReliableCommand(ncommand2); this.sentReliableCommands.Remove(ncommand2); this.reliableCommandsRepeated++; bool flag10 = base.debugOut >= DebugLevel.INFO; if (flag10) { base.Listener.DebugReturn(DebugLevel.INFO, string.Format("Resending: {0}. times out after: {1} sent: {3} now: {2} rtt/var: {4}/{5} last recv: {6}", new object[] { ncommand2, ncommand2.roundTripTimeout, this.timeInt, ncommand2.commandSentTime, this.roundTripTime, this.roundTripTimeVariance, SupportClass.GetTickCount() - this.timestampOfLastReceive })); } } } } bool flag11 = !base.IsSendingOnlyAcks && this.peerConnectionState == PeerBase.ConnectionStateValue.Connected && base.timePingInterval > 0 && this.sentReliableCommands.Count == 0 && this.timeInt - this.timeLastAckReceive > base.timePingInterval && !this.AreReliableCommandsInTransit() && this.udpBufferIndex + 12 < this.udpBufferLength; if (flag11) { NCommand ncommand3 = new NCommand(this, 5, null, byte.MaxValue); this.QueueOutgoingReliableCommand(ncommand3); bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { base.TrafficStatsOutgoing.CountControlCommand(ncommand3.Size); } } bool flag12 = !base.IsSendingOnlyAcks; if (flag12) { EnetChannel[] array2 = this.channelArray; lock (array2) { for (int i = 0; i < this.channelArray.Length; i++) { EnetChannel enetChannel = this.channelArray[i]; num += this.SerializeToBuffer(enetChannel.outgoingReliableCommandsList); num += this.SerializeToBuffer(enetChannel.outgoingUnreliableCommandsList); } } } bool flag13 = this.udpCommandCount <= 0; if (flag13) { flag2 = false; } else { bool trafficStatsEnabled2 = base.TrafficStatsEnabled; if (trafficStatsEnabled2) { TrafficStats trafficStatsOutgoing = base.TrafficStatsOutgoing; int totalPacketCount = trafficStatsOutgoing.TotalPacketCount; trafficStatsOutgoing.TotalPacketCount = totalPacketCount + 1; base.TrafficStatsOutgoing.TotalCommandsInPackets += (int)this.udpCommandCount; } this.SendData(this.udpBuffer, this.udpBufferIndex); flag2 = num > 0; } } } } return flag2; } // Token: 0x0600015B RID: 347 RVA: 0x0000BD58 File Offset: 0x00009F58 private bool AreReliableCommandsInTransit() { EnetChannel[] array = this.channelArray; lock (array) { for (int i = 0; i < this.channelArray.Length; i++) { EnetChannel enetChannel = this.channelArray[i]; bool flag = enetChannel.outgoingReliableCommandsList.Count > 0; if (flag) { return true; } } } return false; } // Token: 0x0600015C RID: 348 RVA: 0x0000BDD4 File Offset: 0x00009FD4 internal override bool EnqueueOperation(Dictionary parameters, byte opCode, bool sendReliable, byte channelId, bool encrypt, PeerBase.EgMessageType messageType) { bool flag = this.peerConnectionState != PeerBase.ConnectionStateValue.Connected; bool flag3; if (flag) { bool flag2 = base.debugOut >= DebugLevel.ERROR; if (flag2) { base.Listener.DebugReturn(DebugLevel.ERROR, string.Concat(new object[] { "Cannot send op: ", opCode, " Not connected. PeerState: ", this.peerConnectionState })); } base.Listener.OnStatusChanged(StatusCode.SendError); flag3 = false; } else { bool flag4 = channelId >= base.ChannelCount; if (flag4) { bool flag5 = base.debugOut >= DebugLevel.ERROR; if (flag5) { base.Listener.DebugReturn(DebugLevel.ERROR, string.Concat(new object[] { "Cannot send op: Selected channel (", channelId, ")>= channelCount (", base.ChannelCount, ")." })); } base.Listener.OnStatusChanged(StatusCode.SendError); flag3 = false; } else { byte[] array = this.SerializeOperationToMessage(opCode, parameters, messageType, encrypt); flag3 = this.CreateAndEnqueueCommand(sendReliable ? 6 : 7, array, channelId); } } return flag3; } // Token: 0x0600015D RID: 349 RVA: 0x0000BF04 File Offset: 0x0000A104 private EnetChannel GetChannel(byte channelNumber) { return (channelNumber == byte.MaxValue) ? this.channelArray[this.channelArray.Length - 1] : this.channelArray[(int)channelNumber]; } // Token: 0x0600015E RID: 350 RVA: 0x0000BF3C File Offset: 0x0000A13C internal bool CreateAndEnqueueCommand(byte commandType, byte[] payload, byte channelNumber) { bool flag = payload == null; bool flag2; if (flag) { flag2 = false; } else { EnetChannel channel = this.GetChannel(channelNumber); this.ByteCountLastOperation = 0; int num = this.GetFragmentLength(); bool flag3 = payload.Length > num; if (flag3) { int num2 = (payload.Length + num - 1) / num; int num3 = channel.outgoingReliableSequenceNumber + 1; int num4 = 0; for (int i = 0; i < payload.Length; i += num) { bool flag4 = payload.Length - i < num; if (flag4) { num = payload.Length - i; } byte[] array = new byte[num]; Buffer.BlockCopy(payload, i, array, 0, num); NCommand ncommand = new NCommand(this, 8, array, channel.ChannelNumber); ncommand.fragmentNumber = num4; ncommand.startSequenceNumber = num3; ncommand.fragmentCount = num2; ncommand.totalLength = payload.Length; ncommand.fragmentOffset = i; this.QueueOutgoingReliableCommand(ncommand); this.ByteCountLastOperation += ncommand.Size; bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { base.TrafficStatsOutgoing.CountFragmentOpCommand(ncommand.Size); base.TrafficStatsGameLevel.CountOperation(ncommand.Size); } num4++; } } else { NCommand ncommand2 = new NCommand(this, commandType, payload, channel.ChannelNumber); bool flag5 = ncommand2.commandFlags == 1; if (flag5) { this.QueueOutgoingReliableCommand(ncommand2); this.ByteCountLastOperation = ncommand2.Size; bool trafficStatsEnabled2 = base.TrafficStatsEnabled; if (trafficStatsEnabled2) { base.TrafficStatsOutgoing.CountReliableOpCommand(ncommand2.Size); base.TrafficStatsGameLevel.CountOperation(ncommand2.Size); } } else { this.QueueOutgoingUnreliableCommand(ncommand2); this.ByteCountLastOperation = ncommand2.Size; bool trafficStatsEnabled3 = base.TrafficStatsEnabled; if (trafficStatsEnabled3) { base.TrafficStatsOutgoing.CountUnreliableOpCommand(ncommand2.Size); base.TrafficStatsGameLevel.CountOperation(ncommand2.Size); } } } flag2 = true; } return flag2; } // Token: 0x0600015F RID: 351 RVA: 0x0000C144 File Offset: 0x0000A344 internal override byte[] SerializeOperationToMessage(byte opCode, Dictionary parameters, PeerBase.EgMessageType messageType, bool encrypt) { encrypt = encrypt && !this.datagramEncryptedConnection; StreamBuffer serializeMemStream = this.SerializeMemStream; byte[] array2; lock (serializeMemStream) { this.SerializeMemStream.SetLength(0L); bool flag = !encrypt; if (flag) { this.SerializeMemStream.Write(EnetPeer.messageHeader, 0, EnetPeer.messageHeader.Length); } this.protocol.SerializeOperationRequest(this.SerializeMemStream, opCode, parameters, false); bool flag2 = encrypt; if (flag2) { byte[] array = this.CryptoProvider.Encrypt(this.SerializeMemStream.GetBuffer(), 0, (int)this.SerializeMemStream.Length); this.SerializeMemStream.SetLength(0L); this.SerializeMemStream.Write(EnetPeer.messageHeader, 0, EnetPeer.messageHeader.Length); this.SerializeMemStream.Write(array, 0, array.Length); } array2 = this.SerializeMemStream.ToArray(); } bool flag3 = messageType != PeerBase.EgMessageType.Operation; if (flag3) { array2[EnetPeer.messageHeader.Length - 1] = (byte)messageType; } bool flag4 = encrypt; if (flag4) { array2[EnetPeer.messageHeader.Length - 1] = array2[EnetPeer.messageHeader.Length - 1] | 128; } return array2; } // Token: 0x06000160 RID: 352 RVA: 0x0000C294 File Offset: 0x0000A494 internal int SerializeAckToBuffer() { this.outgoingAcknowledgementsPool.Seek(0L, SeekOrigin.Begin); while (this.outgoingAcknowledgementsPool.Position + 20L <= this.outgoingAcknowledgementsPool.Length) { bool flag = this.udpBufferIndex + 20 > this.udpBufferLength; if (flag) { bool flag2 = base.debugOut >= DebugLevel.INFO; if (flag2) { base.Listener.DebugReturn(DebugLevel.INFO, string.Concat(new object[] { "UDP package is full. Commands in Package: ", this.udpCommandCount, ". bytes left in queue: ", this.outgoingAcknowledgementsPool.Position })); } break; } int num; byte[] bufferAndAdvance = this.outgoingAcknowledgementsPool.GetBufferAndAdvance(20, out num); Buffer.BlockCopy(bufferAndAdvance, num, this.udpBuffer, this.udpBufferIndex, 20); this.udpBufferIndex += 20; this.udpCommandCount += 1; } this.outgoingAcknowledgementsPool.Compact(); this.outgoingAcknowledgementsPool.Position = this.outgoingAcknowledgementsPool.Length; return (int)this.outgoingAcknowledgementsPool.Length / 20; } // Token: 0x06000161 RID: 353 RVA: 0x0000C3D0 File Offset: 0x0000A5D0 internal int SerializeToBuffer(Queue commandList) { while (commandList.Count > 0) { NCommand ncommand = commandList.Peek(); bool flag = ncommand == null; if (flag) { commandList.Dequeue(); } else { bool flag2 = this.udpBufferIndex + ncommand.Size > this.udpBufferLength; if (flag2) { bool flag3 = base.debugOut >= DebugLevel.INFO; if (flag3) { base.Listener.DebugReturn(DebugLevel.INFO, string.Concat(new object[] { "UDP package is full. Commands in Package: ", this.udpCommandCount, ". Commands left in queue: ", commandList.Count })); } break; } ncommand.SerializeHeader(this.udpBuffer, ref this.udpBufferIndex); bool flag4 = ncommand.SizeOfPayload > 0; if (flag4) { Buffer.BlockCopy(ncommand.Serialize(), 0, this.udpBuffer, this.udpBufferIndex, ncommand.SizeOfPayload); this.udpBufferIndex += ncommand.SizeOfPayload; } this.udpCommandCount += 1; bool flag5 = (ncommand.commandFlags & 1) > 0; if (flag5) { this.QueueSentCommand(ncommand); bool flag6 = this.CommandLog != null; if (flag6) { this.CommandLog.Enqueue(new CmdLogSentReliable(ncommand, this.timeInt, this.roundTripTime, this.roundTripTimeVariance, false)); base.CommandLogResize(); } } commandList.Dequeue(); } } return commandList.Count; } // Token: 0x06000162 RID: 354 RVA: 0x0000C558 File Offset: 0x0000A758 internal void SendData(byte[] data, int length) { try { bool flag = this.datagramEncryptedConnection; if (flag) { this.SendDataEncrypted(data, length); } else { int num = 0; Protocol.Serialize(this.peerID, data, ref num); data[2] = (base.crcEnabled ? 204 : 0); data[3] = this.udpCommandCount; num = 4; Protocol.Serialize(this.timeInt, data, ref num); Protocol.Serialize(this.challenge, data, ref num); bool crcEnabled = base.crcEnabled; if (crcEnabled) { Protocol.Serialize(0, data, ref num); uint num2 = SupportClass.CalculateCrc(data, length); num -= 4; Protocol.Serialize((int)num2, data, ref num); } this.bytesOut += (long)length; this.SendToSocket(data, length); } } catch (Exception ex) { bool flag2 = base.debugOut >= DebugLevel.ERROR; if (flag2) { base.Listener.DebugReturn(DebugLevel.ERROR, ex.ToString()); } SupportClass.WriteStackTrace(ex); } } // Token: 0x06000163 RID: 355 RVA: 0x0000C65C File Offset: 0x0000A85C private void SendToSocket(byte[] data, int length) { bool isSimulationEnabled = base.NetworkSimulationSettings.IsSimulationEnabled; if (isSimulationEnabled) { byte[] array = new byte[length]; Buffer.BlockCopy(data, 0, array, 0, length); base.SendNetworkSimulated(array); } else { this.rt.Send(data, length); } } // Token: 0x06000164 RID: 356 RVA: 0x0000C6A8 File Offset: 0x0000A8A8 private void SendDataEncrypted(byte[] data, int length) { bool flag = this.bufferForEncryption == null || this.bufferForEncryption.Length != base.mtu; if (flag) { this.bufferForEncryption = new byte[base.mtu]; } byte[] array = this.bufferForEncryption; int num = 0; Protocol.Serialize(this.peerID, array, ref num); array[2] = 1; num++; Protocol.Serialize(this.challenge, array, ref num); data[0] = this.udpCommandCount; int num2 = 1; Protocol.Serialize(this.timeInt, data, ref num2); this.encryptor.Encrypt(data, length, array, ref num); Buffer.BlockCopy(this.encryptor.FinishHMAC(array, 0, num), 0, array, num, EnetPeer.HMAC_SIZE); this.SendToSocket(array, num + EnetPeer.HMAC_SIZE); } // Token: 0x06000165 RID: 357 RVA: 0x0000C770 File Offset: 0x0000A970 internal void QueueSentCommand(NCommand command) { command.commandSentTime = this.timeInt; command.commandSentCount += 1; bool flag = command.roundTripTimeout == 0; if (flag) { command.roundTripTimeout = this.roundTripTime + 4 * this.roundTripTimeVariance; command.timeoutTime = this.timeInt + base.DisconnectTimeout; } else { bool flag2 = command.commandSentCount <= base.QuickResendAttempts + 1; if (!flag2) { command.roundTripTimeout *= 2; } } List list = this.sentReliableCommands; lock (list) { bool flag3 = this.sentReliableCommands.Count == 0; if (flag3) { int num = command.commandSentTime + command.roundTripTimeout; bool flag4 = num < this.timeoutInt; if (flag4) { this.timeoutInt = num; } } this.reliableCommandsSent++; this.sentReliableCommands.Add(command); } } // Token: 0x06000166 RID: 358 RVA: 0x0000C884 File Offset: 0x0000AA84 internal void QueueOutgoingReliableCommand(NCommand command) { EnetChannel channel = this.GetChannel(command.commandChannelID); EnetChannel enetChannel = channel; lock (enetChannel) { bool flag = command.reliableSequenceNumber == 0; if (flag) { EnetChannel enetChannel2 = channel; int num = enetChannel2.outgoingReliableSequenceNumber + 1; enetChannel2.outgoingReliableSequenceNumber = num; command.reliableSequenceNumber = num; } channel.outgoingReliableCommandsList.Enqueue(command); } } // Token: 0x06000167 RID: 359 RVA: 0x0000C8F8 File Offset: 0x0000AAF8 internal void QueueOutgoingUnreliableCommand(NCommand command) { EnetChannel channel = this.GetChannel(command.commandChannelID); EnetChannel enetChannel = channel; lock (enetChannel) { command.reliableSequenceNumber = channel.outgoingReliableSequenceNumber; EnetChannel enetChannel2 = channel; int num = enetChannel2.outgoingUnreliableSequenceNumber + 1; enetChannel2.outgoingUnreliableSequenceNumber = num; command.unreliableSequenceNumber = num; channel.outgoingUnreliableCommandsList.Enqueue(command); } } // Token: 0x06000168 RID: 360 RVA: 0x0000C968 File Offset: 0x0000AB68 internal void QueueOutgoingAcknowledgement(NCommand readCommand, int sendTime) { StreamBuffer streamBuffer = this.outgoingAcknowledgementsPool; lock (streamBuffer) { int num; byte[] bufferAndAdvance = this.outgoingAcknowledgementsPool.GetBufferAndAdvance(20, out num); NCommand.CreateAck(bufferAndAdvance, num, readCommand, sendTime); } } // Token: 0x06000169 RID: 361 RVA: 0x0000C9BC File Offset: 0x0000ABBC internal override void ReceiveIncomingCommands(byte[] inBuff, int dataLength) { this.timestampOfLastReceive = SupportClass.GetTickCount(); try { int num = 0; short num2; Protocol.Deserialize(out num2, inBuff, ref num); byte b = inBuff[num++]; bool flag = b == 1; int num3; byte b2; if (flag) { bool flag2 = this.decryptor == null; if (flag2) { base.EnqueueDebugReturn(DebugLevel.ERROR, "Got encrypted packet, but encryption is not set up. Packet ignored"); return; } this.datagramEncryptedConnection = true; bool flag3 = !this.decryptor.CheckHMAC(inBuff, dataLength); if (flag3) { this.packetLossByCrc++; bool flag4 = this.peerConnectionState != PeerBase.ConnectionStateValue.Disconnected && base.debugOut >= DebugLevel.INFO; if (flag4) { base.EnqueueDebugReturn(DebugLevel.INFO, "Ignored package due to wrong HMAC."); } return; } Protocol.Deserialize(out num3, inBuff, ref num); inBuff = this.decryptor.DecryptBufferWithIV(inBuff, num, dataLength - num - EnetPeer.HMAC_SIZE, out dataLength); dataLength = inBuff.Length; num = 0; b2 = inBuff[num++]; Protocol.Deserialize(out this.serverSentTime, inBuff, ref num); this.bytesIn += (long)(12 + EnetPeer.IV_SIZE + EnetPeer.HMAC_SIZE + dataLength + (EnetPeer.BLOCK_SIZE - dataLength % EnetPeer.BLOCK_SIZE)); } else { bool flag5 = this.datagramEncryptedConnection; if (flag5) { base.EnqueueDebugReturn(DebugLevel.WARNING, "Got not encrypted packet, but expected only encrypted. Packet ignored"); return; } b2 = inBuff[num++]; Protocol.Deserialize(out this.serverSentTime, inBuff, ref num); Protocol.Deserialize(out num3, inBuff, ref num); bool flag6 = b == 204; if (flag6) { int num4; Protocol.Deserialize(out num4, inBuff, ref num); this.bytesIn += 4L; num -= 4; Protocol.Serialize(0, inBuff, ref num); uint num5 = SupportClass.CalculateCrc(inBuff, dataLength); bool flag7 = num4 != (int)num5; if (flag7) { this.packetLossByCrc++; bool flag8 = this.peerConnectionState != PeerBase.ConnectionStateValue.Disconnected && base.debugOut >= DebugLevel.INFO; if (flag8) { base.EnqueueDebugReturn(DebugLevel.INFO, string.Format("Ignored package due to wrong CRC. Incoming: {0:X} Local: {1:X}", (uint)num4, num5)); } return; } } this.bytesIn += 12L; } bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { TrafficStats trafficStatsIncoming = base.TrafficStatsIncoming; int totalPacketCount = trafficStatsIncoming.TotalPacketCount; trafficStatsIncoming.TotalPacketCount = totalPacketCount + 1; base.TrafficStatsIncoming.TotalCommandsInPackets += (int)b2; } bool flag9 = (int)b2 > this.commandBufferSize || b2 <= 0; if (flag9) { base.EnqueueDebugReturn(DebugLevel.ERROR, string.Concat(new object[] { "too many/few incoming commands in package: ", b2, " > ", this.commandBufferSize })); } bool flag10 = num3 != this.challenge; if (flag10) { this.packetLossByChallenge++; bool flag11 = this.peerConnectionState != PeerBase.ConnectionStateValue.Disconnected && base.debugOut >= DebugLevel.ALL; if (flag11) { base.EnqueueDebugReturn(DebugLevel.ALL, string.Concat(new object[] { "Info: Ignoring received package due to wrong challenge. Challenge in-package!=local:", num3, "!=", this.challenge, " Commands in it: ", b2 })); } } else { this.timeInt = SupportClass.GetTickCount() - this.timeBase; for (int i = 0; i < (int)b2; i++) { NCommand readCommand = new NCommand(this, inBuff, ref num); bool flag12 = readCommand.commandType != 1; if (flag12) { base.EnqueueActionForDispatch(delegate { this.ExecuteCommand(readCommand); }); } else { this.ExecuteCommand(readCommand); } bool flag13 = (readCommand.commandFlags & 1) > 0; if (flag13) { bool flag14 = this.InReliableLog != null; if (flag14) { this.InReliableLog.Enqueue(new CmdLogReceivedReliable(readCommand, this.timeInt, this.roundTripTime, this.roundTripTimeVariance, this.timeInt - this.timeLastSendOutgoing, this.timeInt - this.timeLastSendAck)); base.CommandLogResize(); } this.QueueOutgoingAcknowledgement(readCommand, this.serverSentTime); bool trafficStatsEnabled2 = base.TrafficStatsEnabled; if (trafficStatsEnabled2) { base.TrafficStatsIncoming.TimestampOfLastReliableCommand = SupportClass.GetTickCount(); base.TrafficStatsOutgoing.CountControlCommand(20); } } } } } catch (Exception ex) { bool flag15 = base.debugOut >= DebugLevel.ERROR; if (flag15) { base.EnqueueDebugReturn(DebugLevel.ERROR, string.Format("Exception while reading commands from incoming data: {0}", ex)); } SupportClass.WriteStackTrace(ex); } } // Token: 0x0600016A RID: 362 RVA: 0x0000CEA8 File Offset: 0x0000B0A8 internal bool ExecuteCommand(NCommand command) { bool flag = true; switch (command.commandType) { case 1: { bool trafficStatsEnabled = base.TrafficStatsEnabled; if (trafficStatsEnabled) { base.TrafficStatsIncoming.TimestampOfLastAck = SupportClass.GetTickCount(); base.TrafficStatsIncoming.CountControlCommand(command.Size); } this.timeLastAckReceive = this.timeInt; this.lastRoundTripTime = this.timeInt - command.ackReceivedSentTime; NCommand ncommand = this.RemoveSentReliableCommand(command.ackReceivedReliableSequenceNumber, (int)command.commandChannelID); bool flag2 = this.CommandLog != null; if (flag2) { this.CommandLog.Enqueue(new CmdLogReceivedAck(command, this.timeInt, this.roundTripTime, this.roundTripTimeVariance)); base.CommandLogResize(); } bool flag3 = ncommand != null; if (flag3) { bool flag4 = ncommand.commandType == 12; if (flag4) { bool flag5 = this.lastRoundTripTime <= this.roundTripTime; if (flag5) { this.serverTimeOffset = this.serverSentTime + (this.lastRoundTripTime >> 1) - SupportClass.GetTickCount(); this.serverTimeOffsetIsAvailable = true; } else { this.FetchServerTimestamp(); } } else { base.UpdateRoundTripTimeAndVariance(this.lastRoundTripTime); bool flag6 = ncommand.commandType == 4 && this.peerConnectionState == PeerBase.ConnectionStateValue.Disconnecting; if (flag6) { bool flag7 = base.debugOut >= DebugLevel.INFO; if (flag7) { base.EnqueueDebugReturn(DebugLevel.INFO, "Received disconnect ACK by server"); } base.EnqueueActionForDispatch(delegate { this.rt.Disconnect(); }); } else { bool flag8 = ncommand.commandType == 2; if (flag8) { this.roundTripTime = this.lastRoundTripTime; } } } } break; } case 2: case 5: { bool trafficStatsEnabled2 = base.TrafficStatsEnabled; if (trafficStatsEnabled2) { base.TrafficStatsIncoming.CountControlCommand(command.Size); } break; } case 3: { bool trafficStatsEnabled3 = base.TrafficStatsEnabled; if (trafficStatsEnabled3) { base.TrafficStatsIncoming.CountControlCommand(command.Size); } bool flag9 = this.peerConnectionState == PeerBase.ConnectionStateValue.Connecting; if (flag9) { byte[] array = base.PrepareConnectData(base.ServerAddress, this.AppId, this.CustomInitData); this.CreateAndEnqueueCommand(6, array, 0); this.peerConnectionState = PeerBase.ConnectionStateValue.Connected; } break; } case 4: { bool trafficStatsEnabled4 = base.TrafficStatsEnabled; if (trafficStatsEnabled4) { base.TrafficStatsIncoming.CountControlCommand(command.Size); } StatusCode statusCode = StatusCode.DisconnectByServer; bool flag10 = command.reservedByte == 1; if (flag10) { statusCode = StatusCode.DisconnectByServerLogic; } else { bool flag11 = command.reservedByte == 3; if (flag11) { statusCode = StatusCode.DisconnectByServerUserLimit; } } bool flag12 = base.debugOut >= DebugLevel.INFO; if (flag12) { base.Listener.DebugReturn(DebugLevel.INFO, string.Concat(new object[] { "Server ", base.ServerAddress, " sent disconnect. PeerId: ", (ushort)this.peerID, " RTT/Variance:", this.roundTripTime, "/", this.roundTripTimeVariance, " reason byte: ", command.reservedByte })); } PeerBase.ConnectionStateValue peerConnectionState = this.peerConnectionState; this.peerConnectionState = PeerBase.ConnectionStateValue.Disconnecting; base.Listener.OnStatusChanged(statusCode); this.peerConnectionState = peerConnectionState; this.Disconnect(); break; } case 6: { bool trafficStatsEnabled5 = base.TrafficStatsEnabled; if (trafficStatsEnabled5) { base.TrafficStatsIncoming.CountReliableOpCommand(command.Size); } bool flag13 = this.peerConnectionState == PeerBase.ConnectionStateValue.Connected; if (flag13) { flag = this.QueueIncomingCommand(command); } break; } case 7: { bool trafficStatsEnabled6 = base.TrafficStatsEnabled; if (trafficStatsEnabled6) { base.TrafficStatsIncoming.CountUnreliableOpCommand(command.Size); } bool flag14 = this.peerConnectionState == PeerBase.ConnectionStateValue.Connected; if (flag14) { flag = this.QueueIncomingCommand(command); } break; } case 8: { bool trafficStatsEnabled7 = base.TrafficStatsEnabled; if (trafficStatsEnabled7) { base.TrafficStatsIncoming.CountFragmentOpCommand(command.Size); } bool flag15 = this.peerConnectionState == PeerBase.ConnectionStateValue.Connected; if (flag15) { bool flag16 = command.fragmentNumber > command.fragmentCount || command.fragmentOffset >= command.totalLength || command.fragmentOffset + command.Payload.Length > command.totalLength; if (flag16) { bool flag17 = base.debugOut >= DebugLevel.ERROR; if (flag17) { base.Listener.DebugReturn(DebugLevel.ERROR, "Received fragment has bad size: " + command); } } else { flag = this.QueueIncomingCommand(command); bool flag18 = flag; if (flag18) { EnetChannel channel = this.GetChannel(command.commandChannelID); bool flag19 = command.reliableSequenceNumber == command.startSequenceNumber; if (flag19) { command.fragmentsRemaining--; int num = command.startSequenceNumber + 1; while (command.fragmentsRemaining > 0 && num < command.startSequenceNumber + command.fragmentCount) { bool flag20 = channel.ContainsReliableSequenceNumber(num++); if (flag20) { command.fragmentsRemaining--; } } } else { bool flag21 = channel.ContainsReliableSequenceNumber(command.startSequenceNumber); if (flag21) { NCommand ncommand2 = channel.FetchReliableSequenceNumber(command.startSequenceNumber); ncommand2.fragmentsRemaining--; } } } } } break; } } return flag; } // Token: 0x0600016B RID: 363 RVA: 0x0000D41C File Offset: 0x0000B61C internal bool QueueIncomingCommand(NCommand command) { EnetChannel channel = this.GetChannel(command.commandChannelID); bool flag = channel == null; bool flag3; if (flag) { bool flag2 = base.debugOut >= DebugLevel.ERROR; if (flag2) { base.Listener.DebugReturn(DebugLevel.ERROR, "Received command for non-existing channel: " + command.commandChannelID); } flag3 = false; } else { bool flag4 = base.debugOut >= DebugLevel.ALL; if (flag4) { base.Listener.DebugReturn(DebugLevel.ALL, string.Concat(new object[] { "queueIncomingCommand() ", command, " channel seq# r/u: ", channel.incomingReliableSequenceNumber, "/", channel.incomingUnreliableSequenceNumber })); } bool flag5 = command.commandFlags == 1; if (flag5) { bool flag6 = command.reliableSequenceNumber <= channel.incomingReliableSequenceNumber; if (flag6) { bool flag7 = base.debugOut >= DebugLevel.INFO; if (flag7) { base.Listener.DebugReturn(DebugLevel.INFO, string.Concat(new object[] { "incoming command ", command, " is old (not saving it). Dispatched incomingReliableSequenceNumber: ", channel.incomingReliableSequenceNumber })); } flag3 = false; } else { bool flag8 = channel.ContainsReliableSequenceNumber(command.reliableSequenceNumber); if (flag8) { bool flag9 = base.debugOut >= DebugLevel.INFO; if (flag9) { base.Listener.DebugReturn(DebugLevel.INFO, string.Concat(new object[] { "Info: command was received before! Old/New: ", channel.FetchReliableSequenceNumber(command.reliableSequenceNumber), "/", command, " inReliableSeq#: ", channel.incomingReliableSequenceNumber })); } flag3 = false; } else { channel.incomingReliableCommandsList.Add(command.reliableSequenceNumber, command); flag3 = true; } } } else { bool flag10 = command.commandFlags == 0; if (flag10) { bool flag11 = command.reliableSequenceNumber < channel.incomingReliableSequenceNumber; if (flag11) { bool flag12 = base.debugOut >= DebugLevel.INFO; if (flag12) { base.Listener.DebugReturn(DebugLevel.INFO, "incoming reliable-seq# < Dispatched-rel-seq#. not saved."); } flag3 = true; } else { bool flag13 = command.unreliableSequenceNumber <= channel.incomingUnreliableSequenceNumber; if (flag13) { bool flag14 = base.debugOut >= DebugLevel.INFO; if (flag14) { base.Listener.DebugReturn(DebugLevel.INFO, "incoming unreliable-seq# < Dispatched-unrel-seq#. not saved."); } flag3 = true; } else { bool flag15 = channel.ContainsUnreliableSequenceNumber(command.unreliableSequenceNumber); if (flag15) { bool flag16 = base.debugOut >= DebugLevel.INFO; if (flag16) { base.Listener.DebugReturn(DebugLevel.INFO, string.Concat(new object[] { "command was received before! Old/New: ", channel.incomingUnreliableCommandsList[command.unreliableSequenceNumber], "/", command })); } flag3 = false; } else { channel.incomingUnreliableCommandsList.Add(command.unreliableSequenceNumber, command); flag3 = true; } } } } else { flag3 = false; } } } return flag3; } // Token: 0x0600016C RID: 364 RVA: 0x0000D71C File Offset: 0x0000B91C internal NCommand RemoveSentReliableCommand(int ackReceivedReliableSequenceNumber, int ackReceivedChannel) { NCommand ncommand = null; List list = this.sentReliableCommands; lock (list) { foreach (NCommand ncommand2 in this.sentReliableCommands) { bool flag = ncommand2 != null && ncommand2.reliableSequenceNumber == ackReceivedReliableSequenceNumber && (int)ncommand2.commandChannelID == ackReceivedChannel; if (flag) { ncommand = ncommand2; break; } } bool flag2 = ncommand != null; if (flag2) { this.sentReliableCommands.Remove(ncommand); bool flag3 = this.sentReliableCommands.Count > 0; if (flag3) { this.timeoutInt = this.timeInt + 25; } } else { bool flag4 = base.debugOut >= DebugLevel.ALL && this.peerConnectionState != PeerBase.ConnectionStateValue.Connected && this.peerConnectionState != PeerBase.ConnectionStateValue.Disconnecting; if (flag4) { base.EnqueueDebugReturn(DebugLevel.ALL, string.Format("No sent command for ACK (Ch: {0} Sq#: {1}). PeerState: {2}.", ackReceivedReliableSequenceNumber, ackReceivedChannel, this.peerConnectionState)); } } } return ncommand; } // Token: 0x0600016D RID: 365 RVA: 0x0000D854 File Offset: 0x0000BA54 internal string CommandListToString(NCommand[] list) { bool flag = base.debugOut < DebugLevel.ALL; string text; if (flag) { text = string.Empty; } else { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < list.Length; i++) { stringBuilder.Append(i + "="); stringBuilder.Append(list[i]); stringBuilder.Append(" # "); } text = stringBuilder.ToString(); } return text; } // Token: 0x040000A9 RID: 169 private const int CRC_LENGTH = 4; // Token: 0x040000AA RID: 170 private static readonly int HMAC_SIZE = 32; // Token: 0x040000AB RID: 171 private static readonly int BLOCK_SIZE = 16; // Token: 0x040000AC RID: 172 private static readonly int IV_SIZE = 16; // Token: 0x040000AD RID: 173 private const int EncryptedDataGramHeaderSize = 7; // Token: 0x040000AE RID: 174 private const int EncryptedHeaderSize = 5; // Token: 0x040000AF RID: 175 private List sentReliableCommands = new List(); // Token: 0x040000B0 RID: 176 private StreamBuffer outgoingAcknowledgementsPool; // Token: 0x040000B1 RID: 177 internal readonly int windowSize = 128; // Token: 0x040000B2 RID: 178 private byte udpCommandCount; // Token: 0x040000B3 RID: 179 private byte[] udpBuffer; // Token: 0x040000B4 RID: 180 private int udpBufferIndex; // Token: 0x040000B5 RID: 181 private int udpBufferLength; // Token: 0x040000B6 RID: 182 private byte[] bufferForEncryption; // Token: 0x040000B7 RID: 183 internal int challenge; // Token: 0x040000B8 RID: 184 internal int reliableCommandsRepeated; // Token: 0x040000B9 RID: 185 internal int reliableCommandsSent; // Token: 0x040000BA RID: 186 internal int serverSentTime; // Token: 0x040000BB RID: 187 internal static readonly byte[] udpHeader0xF3 = new byte[] { 243, 2 }; // Token: 0x040000BC RID: 188 internal static readonly byte[] messageHeader = EnetPeer.udpHeader0xF3; // Token: 0x040000BD RID: 189 protected bool datagramEncryptedConnection; // Token: 0x040000BE RID: 190 private EnetChannel[] channelArray = new EnetChannel[0]; // Token: 0x040000BF RID: 191 private const byte ControlChannelNumber = 255; // Token: 0x040000C0 RID: 192 protected internal const short PeerIdForConnect = -1; // Token: 0x040000C1 RID: 193 protected internal const short PeerIdForConnectTrace = -2; // Token: 0x040000C2 RID: 194 private Queue commandsToRemove = new Queue(); // Token: 0x040000C3 RID: 195 private Queue commandsToResend = new Queue(); } }