Protobuf

From AlliedModders Wiki
Revision as of 00:01, 23 January 2013 by Psychonic (talk | contribs) (Protobuf natives)
Jump to: navigation, search

Intro

Unlike the serial bitbuffer-backed usermessages in older games, newer games such as CS:GO (and DOTA 2) now use Google's Protocol Buffers or "protobuf" to back net messages and usermessages.

Differences

Instead of having to be read or written in order, the protobuf usermessages use defined fields, accessible by name, in any order.

Starting, ending, and hooking usermessages remains unchanged. Reading and writing values to/from them is done using the Pb* set of natives in protobuf.inc instead of the Bf* natives in bitbuffer.inc.

You can tell which usermessage system is in use for the current game by checking GetUserMessageFormat(). Possible returns are USERMSG_BITBUF and USERMSG_PROTOBUF.


Basic fields ("optional" or "required") are single values and use the PbRead*/PbSet* natives.

Repeated fields are arrays of values, accessible by their 0-based index with the PbReadRepeated* natives or added with the PbAdd* natives. You can get the count of values in a repeated field with PbGetRepeatedFieldCount.


See the CS:GO Usermessages as defined in protobuf's proto format.

Multi-game usermessages example

From funcommands' drug.sp, using the Fade usermessage:

	new clients[2];
	clients[0] = client;	
 
	new duration = 255;
	new holdtime = 255;
	new flags = 0x0002;
	new color[4] = { 0, 0, 0, 128 };
	color[0] = GetRandomInt(0,255);
	color[1] = GetRandomInt(0,255);
	color[2] = GetRandomInt(0,255);
 
	new Handle:message = StartMessageEx(g_FadeUserMsgId, clients, 1);
 
	if (GetUserMessageType() == UM_Protobuf)
	{
		PbSetInt(message, "duration", duration);
		PbSetInt(message, "hold_time", holdtime);
		PbSetInt(message, "flags", flags);
		PbSetColor(message, "clr", color);
	}
	else
	{
		BfWriteShort(message, duration);
		BfWriteShort(message, holdtime);
		BfWriteShort(message, flags);
		BfWriteByte(message, color[0]);
		BfWriteByte(message, color[1]);
		BfWriteByte(message, color[2]);
		BfWriteByte(message, color[3]);
	}
 
	EndMessage();

Protobuf natives

See protobuf.inc