Class: S2A_INFO2_Packet

Inherits:
Object
  • Object
show all
Includes:
S2A_INFO_BasePacket
Defined in:
lib/steam/packets/s2a_info2_packet.rb

Overview

This class represents a S2A_INFO_DETAILED response packet sent by a Source or GoldSrc server

Out-of-date (before 10/24/2008) GoldSrc servers use an older format (see S2A_INFO_DETAILED_Packet).

See Also:

Author:

  • Sebastian Staudt

Constant Summary collapse

EDF_GAME_ID =
0x01
EDF_GAME_PORT =
0x80
EDF_SERVER_ID =
0x10
EDF_SERVER_TAGS =
0x20
EDF_SOURCE_TV =
0x40

Constants included from SteamPacket

SteamPacket::A2M_GET_SERVERS_BATCH2_HEADER, SteamPacket::A2S_INFO_HEADER, SteamPacket::A2S_PLAYER_HEADER, SteamPacket::A2S_RULES_HEADER, SteamPacket::A2S_SERVERQUERY_GETCHALLENGE_HEADER, SteamPacket::C2M_CHECKMD5_HEADER, SteamPacket::M2A_SERVER_BATCH_HEADER, SteamPacket::M2C_ISVALIDMD5_HEADER, SteamPacket::M2S_REQUESTRESTART_HEADER, SteamPacket::RCON_GOLDSRC_CHALLENGE_HEADER, SteamPacket::RCON_GOLDSRC_NO_CHALLENGE_HEADER, SteamPacket::RCON_GOLDSRC_RESPONSE_HEADER, SteamPacket::S2A_INFO2_HEADER, SteamPacket::S2A_INFO_DETAILED_HEADER, SteamPacket::S2A_LOGSTRING_HEADER, SteamPacket::S2A_PLAYER_HEADER, SteamPacket::S2A_RULES_HEADER, SteamPacket::S2C_CHALLENGE_HEADER, SteamPacket::S2C_CONNREJECT_HEADER, SteamPacket::S2M_HEARTBEAT2_HEADER

Instance Method Summary collapse

Methods included from S2A_INFO_BasePacket

#info

Methods included from SteamPacket

#to_s

Constructor Details

#initialize(data) ⇒ S2A_INFO2_Packet

Creates a new S2A_INFO2 response object based on the given data

Parameters:

  • data (String)

    The raw packet data replied from the server

See Also:

  • S2A_INFO_BasePacket#generate_info_hash


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/steam/packets/s2a_info2_packet.rb', line 30

def initialize(data)
  super S2A_INFO2_HEADER, data

  info.merge!({
    :protocol_version => @content_data.byte,
    :server_name => @content_data.cstring,
    :map_name => @content_data.cstring,
    :game_directory => @content_data.cstring,
    :game_description => @content_data.cstring,
    :app_id => @content_data.short,
    :number_of_players => @content_data.byte,
    :max_players => @content_data.byte,
    :number_of_bots => @content_data.byte,
    :dedicated => @content_data.byte.chr,
    :operating_system => @content_data.byte.chr,
    :password_needed => @content_data.byte == 1,
    :secure => @content_data.byte == 1,
    :game_version => @content_data.cstring
  })

  if @content_data.remaining > 0
    extra_data_flag = @content_data.byte

    if extra_data_flag & EDF_GAME_PORT != 0
      info[:server_port] = @content_data.short
    end

    if extra_data_flag & EDF_SERVER_ID != 0
      info[:server_id] = @content_data.long | (@content_data.long << 32)
    end

    if extra_data_flag & EDF_SOURCE_TV != 0
      info[:tv_port] = @content_data.short
      info[:tv_name] = @content_data.cstring
    end

    if extra_data_flag & EDF_SERVER_TAGS != 0
      info[:server_tags] = @content_data.cstring
    end

    if extra_data_flag & EDF_GAME_ID != 0
      info[:game_id] = @content_data.long | (@content_data.long << 32)
    end
  end
end