private void ParseOneByte(byte data)
        {
            int int_data = (int)(data & 0xFF);

            //int int_data = data;

            if (int_data == PKT_START && isStart)
            {
                //System.Console.WriteLine( "ProtocolParser : PKT_START" );
                counter = 0;
                isStart = false;
            }
            else if (int_data == PKT_END && counter == dataLength + PKT_HEADER_LEN)
            {
                Packet.Builder builder = new Packet.Builder();

                // 커맨드를 뽑는다.
                int cmd = nbuffer.GetByteToInt();

                // 길이를 뽑는다.
                int length = nbuffer.GetShort();

                // 커맨드, 길이를 제외한 나머지 바이트를 컨텐트로 지정
                byte[] content = nbuffer.GetBytes();

                PacketCreated(this, new PacketEventArgs(builder.cmd(cmd).data(content).Build()));

                dataLength = 0;
                counter    = 10;
                nbuffer.Clear();
                isStart = true;
            }
            else if (counter > PKT_MAX_LEN)
            {
                //System.Console.WriteLine( "ProtocolParser : PKT_MAX_LEN" );
                counter    = 10;
                dataLength = 0;
                isStart    = true;
            }
            else
            {
                if (counter == PKT_LENGTH_POS1)
                {
                    lbuffer[0] = data;
                }
                else if (counter == PKT_LENGTH_POS2)
                {
                    //System.Console.WriteLine( "ProtocolParser : PKT_LENGTH_POS2" );
                    lbuffer[1] = data;
                    dataLength = ByteConverter.ByteToShort(lbuffer);
                }

                if (!isStart)
                {
                    nbuffer.Put(data);
                    counter++;
                }
            }
        }
示例#2
0
 /**
  * Genera un paquete de respuesta genérico. El paquete de respuesta contiene
  * los siguientes campos, en este orden:
  *
  *	<ACK> <PacketType> <Endpoint> <Sequence>
  *
  * Donde el tipo de paquete, endpoint y número de secuencia se corresponden
  * con el request que originó este response.
  */
 protected Packet.Builder GetResponseHeader(Packet request, int payloadSize)
 {
     Packet.Builder response = new Packet.Builder(7 + payloadSize)
                               .AddPacketType(PacketType.ACK)
                               .AddPacketType(request.GetPacketType())
                               .AddEndpoint(request.GetEndpoint())
                               .AddInteger(request.GetInteger());
     request.Reset();
     return(response);
 }
示例#3
0
    public void Shoot(Vector3 position, Vector3 target)
    {
        Packet.Builder requestBuilder = GetRequestHeader(PacketType.FLOODING, Endpoint.SHOOT, 1);
        Debug.DrawRay(position, 10 * target, Color.red, 5);
        if (Physics.Raycast(position, target, out RaycastHit hit))
        {
            requestBuilder.AddByte((byte)hit.collider.gameObject.GetComponent <Enemy>().GetID());
        }
        else
        {
            requestBuilder.AddByte((byte)255);
        }
        Packet request = requestBuilder.Build();

        packets.Add(sequence - 1, request);
        output.Write(request);
    }
示例#4
0
    protected void Update()
    {
        Move();
        int currentTime = Mathf.FloorToInt(Time.unscaledTime / Δs);

        if (lastSnapshot < currentTime)
        {
            lastSnapshot = currentTime;
            //Debug.Log("Frame " + Time.frameCount + " -> " + Time.unscaledTime + " sec. | Secuencia: " + currentTime);
            Packet packet = new Packet.Builder(config.maxPacketSize)
                            .AddPacketType(PacketType.SNAPSHOT)
                            .AddInteger(currentTime++)
                            .AddFloat(Time.unscaledTime)
                            .AddVector(transform.position)
                            .AddQuaternion(transform.rotation)
                            .Build();
            output.Write(packet);
        }
    }
示例#5
0
 /**
  * Devuelve la representación en forma de paquete de bytes de esta snapshot.
  */
 public Packet ToPacket()
 {
     Packet.Builder builder = new Packet.Builder(13 + 72 * players)
                              .AddPacketType(PacketType.SNAPSHOT)
                              .AddInteger(sequence)
                              .AddFloat(timestamp)
                              .AddInteger(players);
     for (int k = 0; k < players; ++k)
     {
         builder.AddInteger(ids[k])
         .AddInteger(acks[k])
         .AddInteger(lifes[k])
         .AddVector(positions[k])
         .AddQuaternion(rotations[k])
         .AddFloat(gFuses[k])
         .AddVector(gPositions[k])
         .AddQuaternion(gRotations[k]);
     }
     // Otros datos...
     return(builder.Build());
 }
示例#6
0
    /**
     * Mueve un jugador en alguna dirección. No maneja el 'straferunning'. Se
     * encarga de aplicar predicción, en caso de que esté habilitada.
     */
    public void Move(List <Direction> directions)
    {
        BitBuffer bb = new BitBuffer();
        float     Δt = Time.deltaTime;

        if (config.usePrediction)
        {
            predictor.PredictMove(directions, Δt);
            predictor.SaveState(sequence);
        }
        bb.PutFloat(Δt, 0, 1, 0.0001f);
        bb.PutInt(directions.Count, 0, 10);
        Packet.Builder builder = GetRequestHeader(PacketType.FLOODING, Endpoint.MOVE, 8 + directions.Count);
        foreach (Direction direction in directions)
        {
            bb.PutDirection(direction);
        }
        builder.AddBitBuffer(bb);
        Packet request = builder.Build();

        packets.Add(sequence - 1, request);
        output.Write(request);
    }
示例#7
0
        public void Put(byte[] buff, int size)
        {
            byte[] test = new byte[size];

            //Array.Copy( buff, 0, test, 0, size );
            //System.Console.WriteLine( "Read Buffer : {0}", BitConverter.ToString( test ) );
            //System.Console.WriteLine();

            for (int i = 0; i < size; i++)
            {
                if (buff[i] == Const.PK_STX)
                {
                    // packet start
                    mBuffer = new ByteUtil();

                    IsEscape = false;
                }
                else if (buff[i] == Const.PK_ETX)
                {
                    // end of packet
                    Packet.Builder builder = new Packet.Builder();

                    int cmd = mBuffer.GetByteToInt();

                    string cmdstr = Enum.GetName(typeof(Cmd), cmd);

                    int result_size = cmdstr != null && cmdstr.EndsWith("RESPONSE") ? 1 : 0;

                    int result = result_size > 0 ? mBuffer.GetByteToInt() : -1;

                    int length = mBuffer.GetUShort();

                    byte[] data = mBuffer.GetBytes();

                    //System.Console.WriteLine( "length : {0}, data : {1}", length, data.Length );

                    builder.cmd(cmd)
                    .result(result)
                    .data(data);

                    //System.Console.WriteLine( "Read Packet : {0}", BitConverter.ToString( data ) );
                    //System.Console.WriteLine();

                    mBuffer.Clear();
                    mBuffer = null;

                    PacketCreated(this, new PacketEventArgs(builder.Build()));

                    IsEscape = false;
                }
                else if (buff[i] == Const.PK_DLE)
                {
                    if (i < size - 1)
                    {
                        mBuffer.Put((byte)(buff[++i] ^ 0x20));
                    }
                    else
                    {
                        IsEscape = true;
                    }
                }
                else if (IsEscape)
                {
                    mBuffer.Put((byte)(buff[i] ^ 0x20));

                    IsEscape = false;
                }
                else
                {
                    mBuffer.Put(buff[i]);
                }
            }
        }