function TFOLNetScriptPackage.sendGateMsgData(L: lua_State): Integer;
var
lvRequireMsgcode, lvCallbackEventID: Integer;
lvParamsTableName, lvParamName: string;
lvParamCount, i, lvVType: Integer;
lvMsgData: TSimpleMsgPack;
begin
{
param_1 = lua.self(?, ignore),
param_2 = requireMsgCode(integer),
param_3 = callbackEventID(integer),
param_4 = lua.tableName(string)
param_5 = lua.data(table)
lua.data = {
[1] = {type=integer, name=string, value=string/integer/float/boolean},
[2] = {type=integer, name=string, value=string/integer/float/boolean},
[3] = {type=integer, name=string, value=string/integer/float/boolean},
...
}
}
lvRequireMsgcode:= lua_tointeger(L, 2);
lvCallbackEventID:= lua_tointeger(L, 3);
lvMsgData:= TSimpleMsgPack.Create;
try
lvParamsTableName:= lua_tostring(L, 4);
lua_getglobal(L, PAnsiChar(AnsiString(lvParamsTableName)));
lvParamCount:= lua_rawlen(L, -1);
for i:= 1 to lvParamCount do
begin
//压入主表的第i条记录(一个table)
lua_pushinteger(L, i);
lua_rawget(L,-2);
//压入当前子表的第 1 个字段: type
lua_pushstring(L, 'type');
lua_rawget(L,-2);
lvVType:= lua_tointeger(L,-1);
lua_pop(L, 1);
//压入当前子表的第 2 个字段: name
lua_pushstring(L, 'name');
lua_rawget(L,-2);
lvParamName:= lua_tostring(L,-1);
lua_pop(L, 1);
//压入当前子表的第 3 个字段: value
lua_pushstring(L, 'value');
lua_rawget(L,-2);
case lvVType of
ord(mptString) : lvMsgData.Add(lvParamName,lua_tostring(L,-1));
ord(mptInteger): lvMsgData.Add(lvParamName,lua_tointeger(L,-1));
ord(mptFloat) : lvMsgData.Add(lvParamName,lua_tonumber(L,-1));
ord(mptBoolean): lvMsgData.Add(lvParamName,Boolean(lua_toboolean(L,-1)));
end;
lua_pop(L, 1);
//弹出本记录(一个table),不然取不到下一条记录
lua_pop(L, 1);
end;
gvNetManager.sendGateMsgData(lvRequireMsgcode,lvMsgData,lvCallbackEventID);
finally
FreeAndNil(lvMsgData);
end;
end;