Results 1 to 3 of 3

Thread: float32?

  1. #1

    Thread Starter
    Hyperactive Member FUBAR's Avatar
    Join Date
    Jan 2000
    Posts
    307

    float32?

    im working on a program for a game called half-life my prog is written in vb, but i need help because the half-life server protocol is for C++ i can already recive player info from server, like name, and frags, i also want to be able to recive the player time in game, but the packet is float32 it says, and i dont know what to do with it...here is the server protocal thing

    look down under "players" see how it says the packet is float32 for the player time in game, i get 3 ascii characters back with each player, can somebody help me, asm me questions if u have to..here is protocol....



    Game servers will answer the following messages:
    Messages are sent to the server by sending 4 consecutive bytes of 255 (32-bit integer -1) and then the string command followed by a zero byte to terminate it

    "ping"
    Server responds with a single byte code ASCII 'j'

    "info"
    Server responds with the following packet:
    (int32) -1
    (byte) ASCII 'C' (info response, S2A_INFO)
    (string) net address of server
    (string) name of the host / server
    (string) name of the map
    (string) game directory (i.e. valve/)
    (string) Game description (e.g. "half-life multiplay")
    (byte) active client count
    (byte) maximum clients allowed
    (byte) protocol version (currently 7)

    "players"
    Server responds with the following packet:
    (int32) -1
    (byte) ASCII 'D' (players response, S2A_PLAYER)
    (byte) active client count

    for each active client
    (byte) client number / index
    (string) player name
    (int32) client's frag total
    (float32) client's total time in-game

    "rules"
    Server responds with the following packet:
    (int32) -1
    (byte) ASCII 'E' (rules response, S2A_RULES)
    (int16) number of rules

    for each rule
    (string) rule name
    (string) rule value


    -------------------

    Master server query protocol:

    Sent to master:

    (byte) ASCII 'c' ( A2M_GET_SERVERS )

    Response from master:

    (int32) -1
    (byte) ASCII 'd' ( M2A_SERVERS )
    (byte) unused

    // This is followed by as many 6 byte ip addresses as will fit in the message. The master currently feeds about 2K worth of IP address ( 300+ or so ), but we may up that # significantly in the near future.

    (4 x byte) ip address
    (int16) port #



    The old protocol is still valid, but there is a new, extended protocol:

    Here are both the old and new protocols ( the new one is the "details" message ):

    "info"
    Server responds with the following packet:
    (int32) -1
    (byte) ASCII 'C' (info response, S2A_INFO)
    (string) net address of server
    (string) name of the host / server
    (string) name of the map
    (string) game directory (i.e. valve/)
    (string) Game description (e.g. "half-life multiplay")
    (byte) active client count
    (byte) maximum clients allowed
    (byte) protocol version (currently 37)

    "details"
    (int32) -1
    (byte) ASCII 'm' ( S2A_INFO_DETAILED )
    (string) net address of server
    (string) name of the host / server
    (string) name of the map
    (string) game directory (i.e. valve/)
    (string) Game description (e.g. "half-life multiplay")
    (byte) active client count
    (byte) maximum clients allowed
    (byte) protocol version (currently 37)
    (byte) type of server == 'l' for listen or 'd' for dedicated
    (byte) os of server == 'w' for win32 or 'l' for linux
    (byte) password on server == 1 or yes, 0, for no
    (byte) is server running a mod? == 1 for yes, 0 for no

    IFF the server is running mod byte was 1:

    (string) URL for mod's "info" website
    (string) URL for mod's download ftp server
    (int32) mod version #
    (int32) mod download size ( in bytes, approx. )
    (byte) is the mod a server side only mod? 1 == yes, 0 == no
    (byte) does this server require you to have a custom client side .dll ( client.dll )? 1 == yes, 0 == no.



    Here is some code that uses the new protocol. The first function starts the protocol and the second services the message and requests more ip addresses:

    /*
    ==================
    Host_GetBatchServerList_f

    Request full server list from HL master server.
    ==================
    */
    void Host_GetBatchServerList_f( void )
    {
    unsigned char c[10];
    adrlist_t *p;
    int i = 0;

    // Request a server list from the master servers.
    NET_Config( true ); // Initialize networking

    if ( gfNoMasterServer )
    return;

    if ( !valvemaster_adr )
    return;

    c[0] = A2M_GET_SERVERS_BATCH; // ascii 'e'
    i++;

    *(int *)&c[1] = 0; // Request first batch.
    i += sizeof( int );

    p = valvemaster_adr;

    while ( p )
    {
    // send to valve master
    Con_Printf ("Requesting batch server list from %s\n", NET_AdrToString ( p->adr) );
    NET_SendPacket (NS_CLIENT, i, c, p->adr );
    p = p->next;
    }
    }

    // Upon receiving ( 5 bytes, 4 for the -1 and 1 byte for the 'f' character ):
    int32 -1
    M2A_SERVER_BATCH // Ascii 'f', the response to the above

    void CL_ParseBatchServerList( void )
    {
    char szAddress[128] = "";
    unsigned char cIP[4];
    int i;
    unsigned short iIPPort;
    int nNumAddresses;
    int count = 1;
    int unique = 0;

    MSG_ReadByte(); // Skip \r

    unique = MSG_ReadLong();

    // So far we have read 6 chars. Remainder of message length is iBytesRead - 6
    nNumAddresses = net_message.cursize - sizeof(int) - sizeof(unsigned char) - sizeof(byte);

    // Each address is 6 bytes long
    //
    nNumAddresses /= 6;

    while (nNumAddresses-- > 0)
    {
    memset(szAddress, 0, 128);

    for (i = 0; i < 4; i++)
    cIP[i] = MSG_ReadByte();

    sprintf( szAddress, "%i.%i.%i.%i"
    , (int)cIP[0]
    , (int)cIP[1]
    , (int)cIP[2]
    , (int)cIP[3]
    );

    iIPPort = BigShort((unsigned short)MSG_ReadShort());

    //if ( count <= 100 )
    // Con_Printf( "%4i: %s:%i\n", count, szAddress, iIPPort );

    count++;
    }

    Con_Printf( "%i servers\n", count );

    if ( unique != 0 ) // More servers left, send another request to master
    {
    unsigned char c[10];
    int i = 0;

    // Request a server list from the master servers.
    NET_Config( true ); // Initialize networking

    c[0] = A2M_GET_SERVERS_BATCH;
    i++;

    *(int *)&c[1] = unique; // Request servers starting after this unique id.
    i += sizeof( int );

    // send to valve master
    Con_DPrintf ("Requesting next batch ( %i ) server list from %s\n", unique, NET_AdrToString ( net_from ) );
    NET_SendPacket (NS_CLIENT, i, c, net_from );
    }
    else
    Con_Printf( "Done.\n" );
    }

  2. #2
    jim mcnamara
    Guest
    float32 is double in C++, so it would also be a double in VB.
    It's a 32 bit floating point number. I cannot guarantee that it will correctly map to VB double variable.

  3. #3
    Kitten CornedBee's Avatar
    Join Date
    Aug 2001
    Location
    In a microchip!
    Posts
    11,594
    double is 64-bit and maps to vb double. BUT float32 is a real float and therefore maps to single in VB
    All the buzzt
    CornedBee

    "Writing specifications is like writing a novel. Writing code is like writing poetry."
    - Anonymous, published by Raymond Chen

    Don't PM me with your problems, I scan most of the forums daily. If you do PM me, I will not answer your question.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width