예제 #1
0
    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());
            }
        }
    }