private int TrySendLatentPacket(LatentTransfer transfer) { if (this.activeTransferPlayers.Contains(transfer.Player) && transfer.Index == 0) { return(0); } var finalPosition = Math.Min(transfer.Index + transfer.Rate, transfer.Data.Length); var section = transfer.Data[transfer.Index..finalPosition];
public void HandlePacket(Client client, LatentLuaEventPacket packet) { LatentTransfer transfer; switch (packet.Flag) { case LatentEventFlag.Head: if (packet.Header == null) { throw new Exception("Latent transfer Head flag encountered without corresponding header"); } transfer = new LatentTransfer(packet.Id, client, packet.Header.Value.Category); this.transfers[client] = transfer; break; case LatentEventFlag.Cancel: this.transfers.Remove(client); return; default: transfer = this.transfers[client]; break; } if (transfer.Id != packet.Id) { throw new Exception("Latent transfer mismatch"); } foreach (var b in packet.Data) { transfer.Data.Add(b); } if (packet.Flag == LatentEventFlag.Tail) { if (transfer.Category == LatentEventCategory.Packet) { var data = transfer.Data.ToArray(); PacketId packetId = (PacketId)data[0]; var length = BitConverter.ToUInt32(data, 1); this.transfers.Remove(client); this.server.EnqueuePacketToClient(client, packetId, data.Skip(5).ToArray()); } } }