自定义网表

From Valve Developer Community
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)

自定义网表(Nettable)是一个强大的游戏服务器与客户端之间的数据通讯工具。与游戏时间不同,网表将持续进行储存,并可以随时查询,玩家断开并重连时将重新创建。

示例

注册表格

你必须将顶级表格的名字列在game/ADDON_NAME/scripts/custom_net_tables.txt。(如果此文件不在您的地图中您可以自行创建。)它使用这里所描述的:KeyValues3句法(en)

<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->;
 {
    custom_net_tables =
    [
        "example_nettable_1",
        "example_nettable_2"
    ]
}

在服务器中写入网表(Lua)

服务器代码可以使用以下函数设置表格的值: CustomNetTables:SetTableValue( string table_name, string key, table value ) 一个表格可以含有任意个字符串关键字,每一个都对应着一个Lua表格值。

Note.png注意:当一个关键字的值发生变化时,这个关键字的整个值都将传输到每一个客户端(表格中的其他值不会。)经常发生变化的值应该储存在单独的关键字中,以避免不必要的网络通信和客户端及服务器的计算量。
CustomNetTables:SetTableValue( "example_nettable_1", "key_1", {} );
CustomNetTables:SetTableValue( "example_nettable_1", "key_2", { value = "hello" } );
CustomNetTables:SetTableValue( "example_nettable_2", "key_1", { a = 1, b = 2 } );

读取客户端的网表(Javascript)

当服务器上的网表数据发生变化时,他将被复制到各个客户端。Javascript可以查表格中的当前值,然后订阅以获取表格变化的通知。

Note.png注意:延迟是通信系统中无法避免的一部分,必须要将其考虑在内。例如如果你使用自定义游戏事件(en)从客户端向服务器发送数据,而后修改网表,那么客户端获得更新的网表值将需要一段时间。
//--------------------------------------------------------------------------------------------------
// GetAllTableValues returns the entire nettable as a Javascript object
//--------------------------------------------------------------------------------------------------
$.Msg( CustomNetTables.GetAllTableValues( "example_nettable_1" ) );


//--------------------------------------------------------------------------------------------------
// GetTableValue returns the value associated with a particular key
//--------------------------------------------------------------------------------------------------
$.Msg( CustomNetTables.GetTableValue( "example_nettable_2", "key_1" ) );

//--------------------------------------------------------------------------------------------------
// SubscribeNetTableListener allows you to be notified when any value in a table changes
//--------------------------------------------------------------------------------------------------
function OnNettable2Changed( table_name, key, data )
{
	$.Msg( "Table ", table_name, " changed: '", key, "' = ", data );
}

CustomNetTables.SubscribeNetTableListener( "example_nettable_2", OnNettable2Changed );