/// <summary> /// Handles the initial packet sent by the server /// </summary> static public void Handle_SC_Initial(SC_Initial pkt, Client client) { CS_State csi = new CS_State(); csi.tickCount = (ushort)Environment.TickCount; csi.packetsSent = client._packetsSent; csi.packetsReceived = client._packetsReceived; client.send(csi); }
{ /// <summary> /// Handles the initial packet sent by the server /// </summary> static public void Handle_SC_Initial(SC_Initial pkt, Client client) { //We will be sending out state packet only once, as the sync doesn't //really matter on the Zone -> Database connection CS_State csi = new CS_State(); csi.tickCount = (ushort)Environment.TickCount; csi.packetsSent = client._packetsSent; csi.packetsReceived = client._packetsReceived; client.send(csi); }
/// <summary> /// Handles the client's state packet /// </summary> static public void Handle_CS_State(CS_State pkt, Client client) { //Update what we know of the client's connection state client._stats.clientCurrentUpdate = pkt.clientCurrentUpdate; client._stats.clientAverageUpdate = pkt.clientAverageUpdate; client._stats.clientShortestUpdate = pkt.clientShortestUpdate; client._stats.clientLongestUpdate = pkt.clientLongestUpdate; client._stats.clientLastUpdate = pkt.clientLastUpdate; client._stats.clientPacketsSent = pkt.packetsSent; client._stats.clientPacketsRecv = pkt.packetsReceived; client._stats.serverPacketsSent = client._packetsSent; client._stats.serverPacketsRecv = client._packetsReceived; //Prepare our reply SC_State sci = new SC_State(); sci.tickCount = pkt.tickCount; sci.serverTickCount = Environment.TickCount; sci.clientSentCount = pkt.packetsSent; sci.clientRecvCount = pkt.packetsReceived; sci.serverRecvCount = client._stats.serverPacketsRecv; sci.serverSentCount = client._stats.serverPacketsSent; client.send(sci); //Set our sync difference short wander = (short)client._timeDiff; int timeDiff = (sci.serverTickCount - pkt.tickCount) & 0xFFFF; client._timeDiff = (short)timeDiff; //Calculate the clock wander if (wander != 0) { wander = (short)Math.Abs(client._timeDiff - wander); client._stats.clockWander[client._stats.wanderIdx++ % 10] = wander; } //Adjust the client's data rates accordingly client.adjustRates(pkt.clientAverageUpdate); }
{ /// <summary> /// Creates a new system protocol packet. /// </summary> public PacketBase createSystemPacket(ushort typeID, byte[] buffer, int offset, int size) { //Ready our packet base PacketBase packet = null; offset++; size--; //What are we dealing with? switch (typeID) { case CS_Initial.TypeID: packet = new CS_Initial(typeID, buffer, offset, size); break; case BoxPacket.TypeID: packet = new BoxPacket(typeID, buffer, offset, size); break; case Disconnect.TypeID: packet = new Disconnect(typeID, buffer, offset, size); break; case PingPacket.TypeID: packet = new PingPacket(typeID, buffer, offset, size); break; case CS_State.TypeID: packet = new CS_State(typeID, buffer, offset, size); break; case Reliable.TypeID: packet = new Reliable(typeID, buffer, offset, size, 0); break; case Reliable.TypeID + 1: packet = new Reliable(typeID, buffer, offset, size, 1); break; case Reliable.TypeID + 2: packet = new Reliable(typeID, buffer, offset, size, 2); break; case Reliable.TypeID + 3: packet = new Reliable(typeID, buffer, offset, size, 3); break; case OutOfSync.TypeID: packet = new OutOfSync(typeID, buffer, offset, size, 0); break; case OutOfSync.TypeID + 1: packet = new OutOfSync(typeID, buffer, offset, size, 1); break; case OutOfSync.TypeID + 2: packet = new OutOfSync(typeID, buffer, offset, size, 2); break; case OutOfSync.TypeID + 3: packet = new OutOfSync(typeID, buffer, offset, size, 3); break; case ReliableEcho.TypeID: packet = new ReliableEcho(typeID, buffer, offset, size, 0); break; case ReliableEcho.TypeID + 1: packet = new ReliableEcho(typeID, buffer, offset, size, 1); break; case ReliableEcho.TypeID + 2: packet = new ReliableEcho(typeID, buffer, offset, size, 2); break; case ReliableEcho.TypeID + 3: packet = new ReliableEcho(typeID, buffer, offset, size, 3); break; case ReliableBox.TypeID: packet = new ReliableBox(typeID, buffer, offset, size, 0); break; case ReliableBox.TypeID + 1: packet = new ReliableBox(typeID, buffer, offset, size, 1); break; case ReliableBox.TypeID + 2: packet = new ReliableBox(typeID, buffer, offset, size, 2); break; case ReliableBox.TypeID + 3: packet = new ReliableBox(typeID, buffer, offset, size, 3); break; case DataPacketRcv.TypeID: packet = new DataPacketRcv(typeID, buffer, offset, size, 0); break; case DataPacketRcv.TypeID + 1: packet = new DataPacketRcv(typeID, buffer, offset, size, 1); break; case DataPacketRcv.TypeID + 2: packet = new DataPacketRcv(typeID, buffer, offset, size, 2); break; case DataPacketRcv.TypeID + 3: packet = new DataPacketRcv(typeID, buffer, offset, size, 3); break; default: //An undefined packet. packet = new PacketDummy(typeID, buffer, offset, size); break; } return(packet); }