This commit is contained in:
niko
2026-06-04 11:42:34 +02:00
parent f39ba70a9f
commit e720b98cd1
7488 changed files with 2493818 additions and 0 deletions
@@ -0,0 +1,1755 @@
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<NCommand> list = this.sentReliableCommands;
lock (list)
{
this.sentReliableCommands = new List<NCommand>(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<NCommand> 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<PeerBase.MyAction> 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<NCommand> 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<NCommand> 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<byte, object> 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<byte, object> 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<NCommand> 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<NCommand> 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<NCommand> 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<NCommand> sentReliableCommands = new List<NCommand>();
// 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<int> commandsToRemove = new Queue<int>();
// Token: 0x040000C3 RID: 195
private Queue<NCommand> commandsToResend = new Queue<NCommand>();
}
}