[Snippet] Sending data to client/server

Sebastian

  • VC:MP Beta Tester
  • Something like this: hga hga hga
  • Posts: 884
[Snippet] Sending data to client/server
« on April 7th, 2017, 11:10 PM »Last edited
Function for sending data to client/server

I've seen you people using a low-cost function to send data to client/server ...
(which is limited only to few params, that had to be written in a specified way)

But I've created one that will do the job for as many params you want.
I'm using bytes for identification, because they are the most waste-less for the designated task.

SERVER - SendDataToClient( player, byte, ... )
(click to show/hide)
this is a server-side function!

Those dots ("...") replaces the unlimited params you can add to this function.
BUT BE AWARE: The first parameter after player must be the identification byte, which you will use in Server::ServerData

E.g.: Sending text, integer, float to client
SendDataToClient( player, 0x01, "blabla", 215, 12.33 )
(red parameter represents the identification byte)

The row of params after byte (in our case: 0x01) doesn't matter, because the function will proceed each one by it's type.
All you have to do is reading the params in client like you used to: in the row you written them.

If you need to send those things to all players online, all you have to do is replacing player with null.
E.g.: SendDataToClient( null, 0x01, "blabla", 215, 12.33 )
Code: [Select]
function SendDataToClient( player, ... )
{
    if( vargv[0] )
    {
        local   byte = vargv[0],
                len = vargv.len();
               
        if( 1 > len ) Message( "ToClent <" + byte + "> No params specified." );
        else
        {
            Stream.StartWrite();
            Stream.WriteByte( byte );

            for( local i = 1; i < len; i++ )
            {
                switch( typeof( vargv[i] ) )
                {
                    case "integer": Stream.WriteInt( vargv[i] ); break;
                    case "string": Stream.WriteString( vargv[i] ); break;
                    case "float": Stream.WriteFloat( vargv[i] ); break;
                }
            }
           
            if( player == null ) Stream.SendStream( null );
            else if( typeof( player ) == "instance" ) Stream.SendStream( player );
            else Message( "ToClient <" + byte + "> Player is not online." );
        }
    }
    else Message( "ToClient: Not even the byte was specified..." );
}

CLIENT - SendDataToServer( byte, ... )
(click to show/hide)
this is a client-side function!

It works the same way like SendDataToClient.
The only difference is that you don't need to set the target anymore. (player)

You just jump to the identification byte, then the rest of params.
E.g.: SendDataToServer( 0x02, "message", player.ID, pos.X)
Code: [Select]
function SendDataToServer( ... )
{
    if( vargv[0] )
    {
        local   byte = vargv[0],
                len = vargv.len();
               
        if( 1 > len ) Console.Print( "ToClent <" + byte + "> No params specified." );
        else
        {
            local pftStream = Stream();
            pftStream.WriteByte( byte );

            for( local i = 1; i < len; i++ )
            {
                switch( typeof( vargv[i] ) )
                {
                    case "integer": pftStream.WriteInt( vargv[i] ); break;
                    case "string": pftStream.WriteString( vargv[i] ); break;
                    case "float": pftStream.WriteFloat( vargv[i] ); break;
                }
            }
           
            Server.SendData( pftStream );
        }
    }
    else Console.Print( "ToClient: Not even the byte was specified..." );
}

PS: Don't be a pussy by not asking things you don't understand.

kennedyarz

  • Sr. Member
  • Making American Great Again
  • Posts: 334

Anik

  • Sr. Member
  • Posts: 353
[Snippet] Re: Sending data to client/server
« Reply #2, on April 8th, 2017, 10:29 AM »
I was looking for something like this. Thanks for it. Keep it up bro. :)