Ejemplo n.º 1
0
        private async Task HandleClientRequest()
        {
            var builder = new PacketBuilder();

            builder.AddInt16(0x0003);
            builder.AddBytes(new byte[6]);
            builder.AddByte(0x01);
            builder.AddString("Infantry", 9);
            builder.AddBytes(new byte[16]);

            var buffer = builder.GetBytes();

            await this.networkClient.SendAsync(buffer, buffer.Length);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Adds instance bytes to packet builder.
 /// </summary>
 protected override void AddInstanceBytes(PacketBuilder builder)
 {
     builder.AddUInt16((ushort)_commandType);
     builder.AddInt32(_sequence);
     builder.AddByte((byte)_code);
     builder.AddBytes(_data);
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Adds instance bytes to packet builder.
 /// </summary>
 protected override void AddInstanceBytes(PacketBuilder builder)
 {
     builder.AddUInt16((ushort)_commandType);
     builder.AddInt32(_sequence);
     builder.AddUInt16(_retryAttempt);
     builder.AddUInt32(_timeoutMs);
     builder.AddBytes(_data);
 }
Ejemplo n.º 4
0
        /// <summary>
        /// Answers a 'GetPlayers' request, responds with a list of connected players (of same game).
        /// </summary>
        private void Answer_GetPlayers(Client sourceClient, CommandRequestPacket packet)
        {
            try
            {
                //get source player
                NetworkPlayer player = NetworkPlayer.FromPacket(packet);

                //get list of connected players (not source player)
                List <NetworkPlayer> otherPlayers = GetMatchingPlayers(player.GameTitle, player.GameVersion)
                                                    .Where(p => p.PlayerKey != player.PlayerKey)
                                                    .ToList();

                //message
                Log.Write($"Sending '{packet.CommandType}' ({otherPlayers.Count} player{(otherPlayers.Count != 1 ? "s" : "")}) response to '{player.IP}'");

                //serialize list to bytes
                PacketBuilder builder = new PacketBuilder();
                builder.AddUInt16((ushort)otherPlayers.Count);
                foreach (NetworkPlayer p in otherPlayers)
                {
                    builder.AddBytes(p.ToBytes());
                }

                //create packet
                CommandResponsePacket response = new CommandResponsePacket(
                    gameTitle: player.GameTitle,
                    gameVersion: player.GameVersion,
                    sourceIP: _ip,
                    destinationIP: player.IP,
                    playerName: player.Name,
                    commandType: CommandType.GetPlayers,
                    sequence: packet.Sequence,
                    code: ResultCode.Accept,
                    data: builder.ToBytes());

                //send response back to source
                sourceClient.SendPacket(response);
            }
            catch (Exception ex)
            {
                Log.Write("Answer_GetPlayers: Error returning player list");
                ErrorHandler.LogError(ex);
            }
        }
Ejemplo n.º 5
0
        private async Task <ICollection <Zone> > HandleZoneListRequest()
        {
            var zones   = new List <Zone>();
            var builder = new PacketBuilder();

            builder.AddInt16(0x0005);
            builder.AddBytes(new byte[26]);

            var buffer = builder.GetBytes();

            await this.networkClient.SendAsync(buffer, buffer.Length);

            int chunkBufferLength;
            int chunk;
            int offset = 0;

            byte[]       chunkBuffer = null;
            PacketReader reader;

            do
            {
                buffer = await this.networkClient.ReceiveAsync();

                reader = new PacketReader(buffer);

                reader.ReadInt16();
                reader.ReadInt16();
                chunk = reader.ReadByte();
                reader.ReadBytes(7);
                chunkBufferLength = reader.ReadLittleEndianInt16();
                reader.ReadInt16();

                if (chunkBuffer == null)
                {
                    chunkBuffer = new byte[chunkBufferLength];
                }

                offset += reader.CopyBytes(chunkBuffer, offset);

                builder = new PacketBuilder();
                builder.AddInt16(0x000b);
                builder.AddInt16(0);
                builder.AddByte((byte)chunk);
                builder.AddPadding(3);

                buffer = builder.GetBytes();

                await this.networkClient.SendAsync(buffer, buffer.Length);

                chunk++;
            } while (offset < (chunkBufferLength));

            reader = new PacketReader(chunkBuffer);

            // Discard the 0x01 at the beginning
            reader.ReadByte();

            while (reader.CanRead())
            {
                var zone = new Zone();

                zone.ServerAddress = reader.ReadIPAddress();
                zone.ServerPort    = reader.ReadUInt16();
                reader.ReadBytes(6);
                zone.Name = reader.ReadString(32);
                reader.ReadInt16();
                zone.IsAdvanced = reader.ReadBoolean();
                reader.ReadBytes(29);
                zone.Description = reader.ReadString();

                zones.Add(zone);
            }

            return(zones);
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Adds instance bytes to packet builder.
 /// </summary>
 protected override void AddInstanceBytes(PacketBuilder builder)
 {
     builder.AddBytes(_data);
 }