/// <summary> /// Receive a packet and apply it. /// </summary> /// <param name="ID">The packet type ID</param> /// <param name="packet">The packet object itself</param> /// <param name="data">The data in the packet</param> public static void ReceivePacket(int ID, AbstractPacketIn packet, byte[] data, bool IsChunkPacket) { try { packet.IsChunkConnection = IsChunkPacket; if (packet.ReadBytes(data)) { packet.Apply(); } else { UIConsole.WriteLine(TextStyle.Color_Error + "Impure packet from server, ID " + ID + " ICP:" + IsChunkPacket); } } catch (Exception ex) { UIConsole.WriteLine(TextStyle.Color_Error + "Bad packet from server, ID " + ID + " ICP:" + IsChunkPacket + ": " + ex.ToString()); } }
/// <summary> /// Tick the entire network engine. /// </summary> public static void Tick() { if (!Connected) { return; } try { int waiting = Connection.Available; if (waiting > 1024 * 1024 - bufferpos) { waiting = 1024 * 1024 - bufferpos; } if (waiting > 0) { Connection.Receive(buffer, bufferpos, waiting, SocketFlags.None); bufferpos += waiting; while (true) { if (bufferpos < 5) { break; } if (!Connected) { break; } int recd = BitConverter.ToInt32(buffer, 0); if (bufferpos < 5 + recd) { break; } byte[] packet = new byte[recd]; Array.Copy(buffer, 5, packet, 0, recd); int ID = buffer[4]; Array.Copy(buffer, recd + 5, buffer, 0, bufferpos - (recd + 5)); bufferpos -= recd + 5; AbstractPacketIn apacket = null; switch (ID) { case 1: apacket = new PingPacketIn(); break; case 2: apacket = new ConfirmPositionPacketIn(); break; case 3: apacket = new MessagePacketIn(); break; case 4: apacket = new NewEntityPacketIn(); break; case 5: apacket = new DespawnEntityPacketIn(); break; case 6: apacket = new EntityPositionPacketIn(); break; case 255: apacket = new DisconnectPacketIn(); break; default: UIConsole.WriteLine("Invalid packet from server, ID " + ID); break; } if (apacket != null) { ReceivePacket(ID, apacket, packet, false); } } } } catch (Exception ex) { SysConsole.Output(OutputType.ERROR, "Networking: " + ex.ToString()); Disconnect(); } try { int waiting = ChunkConnection.Available; if (waiting > 1024 * 1024 - bufferpos2) { waiting = 1024 * 1024 - bufferpos2; } if (waiting > 0) { ChunkConnection.Receive(buffer2, bufferpos2, waiting, SocketFlags.None); bufferpos2 += waiting; while (true) { if (bufferpos2 < 5) { break; } if (!Connected) { break; } int recd = BitConverter.ToInt32(buffer2, 0); if (bufferpos2 < 5 + recd) { break; } byte[] packet = new byte[recd]; Array.Copy(buffer2, 5, packet, 0, recd); int ID = buffer2[4]; Array.Copy(buffer2, recd + 5, buffer2, 0, bufferpos2 - (recd + 5)); bufferpos2 -= recd + 5; AbstractPacketIn apacket = null; switch (ID) { case 0: apacket = new ChunkPacketIn(); break; case 1: apacket = new PingPacketIn(); break; case 4: apacket = new BlockPacketIn(); break; default: UIConsole.WriteLine("Invalid secondary packet from server, ID " + ID); break; } if (apacket != null) { ReceivePacket(ID, apacket, packet, true); } } } } catch (Exception ex) { SysConsole.Output(OutputType.ERROR, "Networking (Secondary): " + ex.ToString()); Disconnect(); } }