最近在做一款棋牌源码的修复工作,一款常见的游戏,水果拉霸。由于整个源码是基于网狐的二次开发的,我以前也做过网狐二开,所以入手很快。不过这次的修复,前端稍微麻烦一点,我发现,前端与子游戏的后端是有一些不相符合的。所以依照游戏的游戏规则来修复游戏.
最主要的是子游戏的服务端向客户端传送Lua,lua接受到socket消息后,lua把data转换为结构体。这里是lua客户端的代码,在CMD_Game.lua子游戏中,
local SlotDef = {}
-- =========服务端数据==========
--空闲状态
SlotDef.CMD_S_StatusFree = {
{k = "cbBetCount", t = "byte"},
{k = "lBetScore", t ="double", l={10}},
{k = "lPlayerScore", t ="double" },
{k = "lJackPot", t ="double" },
}
这里k = cBetCount 为结构体中的变量名称,t=byte为 数据类型,这样,就定义好了一个结构体了
上面lua代码的结构体,对应与C++的结构体为:
//空闲状态
struct CMD_S_StatusFree
{
//下注值
BYTE cbBetCount; //下注数量
SCORE lBetScore[10]; //下注大小
SCORE lPlayerScore; //玩家钱数
SCORE lJackPot; //奖金池
};
然后lua,在socket处,就可读取data了:
下面的 dataBuffer 是socket读取的buffer,然后通过函数 ExternalFun.read_netdata 读取, ExternalFun是client->src->external->ExternalFun.lua.中的函数
local cmd_table = ExternalFun.read_netdata(SlotDef.CMD_S_StatusFree , dataBuffer)
然后就可以通过 cmd_table 使用其中的数据。
如获取下注次数:
local betcount = cmd_table.cbBetCount
然后给出ExternalFun.read_netdata的源码,这个应该可以在其他地方用到。
--[[
******
* 结构体描述
* {k = "key", t = "type", s = len, l = {}}
* k 表示字段名,对应C++结构体变量名
* t 表示字段类型,对应C++结构体变量类型
* s 针对string变量特有,描述长度
* l 针对数组特有,描述数组长度,以table形式,一维数组表示为{N},N表示数组长度,多维数组表示为{N,N},N表示数组长度
* d 针对table类型,即该字段为一个table类型,d表示该字段需要读取的table数据
* ptr 针对数组,此时s必须为实际长度
** egg
* 取数据的时候,针对一维数组,假如有字段描述为 {k = "a", t = "byte", l = {3}}
* 则表示为 变量a为一个byte型数组,长度为3
* 取第一个值的方式为 a[1][1],第二个值a[1][2],依此类推
* 取数据的时候,针对二维数组,假如有字段描述为 {k = "a", t = "byte", l = {3,3}}
* 则表示为 变量a为一个byte型二维数组,长度都为3
* 则取第一个数组的第一个数据的方式为 a[1][1], 取第二个数组的第一个数据的方式为 a[2][1]
******
]]
--读取网络消息
function ExternalFun.read_netdata( keyTable, dataBuffer )
local cmd_table = {};
--local cmd = cc.cCmd_Data:create()
--cmd:readscore(int64):getvalue()
--辅助读取int64
local int64 = Integer64.new();
for k,v in pairs(keyTable) do
local keys = v;
------
--读取数据
--类型
local keyType = string.lower(keys["t"]);
--键
local key = keys["k"];
--长度
local lenT = keys["l"];
local keyFun = nil;
if "byte" == keyType then
keyFun = function() return dataBuffer:readbyte(); end
elseif "int" == keyType then
keyFun = function() return dataBuffer:readint(); end
elseif "word" == keyType then
keyFun = function() return dataBuffer:readword(); end
elseif "dword" == keyType then
keyFun = function() return dataBuffer:readdword(); end
elseif "score" == keyType then
keyFun = function() return dataBuffer:readscore(int64):getvalue(); end
elseif "string" == keyType then
if nil ~= keys["s"] then
keyFun = function() return dataBuffer:readstring(keys["s"]); end
else
keyFun = function() return dataBuffer:readstring(); end
end
elseif "bool" == keyType then
keyFun = function() return dataBuffer:readbool(); end
elseif "table" == keyType then
cmd_table[key] = ExternalFun.readTableHelper({dTable = keys["d"], lentable = lenT, buffer = dataBuffer, strkey = key})
elseif "double" == keyType then
keyFun = function() return dataBuffer:readdouble(); end
elseif "float" == keyType then
keyFun = function() return dataBuffer:readfloat(); end
elseif "short" == keyType then
keyFun = function() return dataBuffer:readshort(); end
else
print("read_netdata error: key==>" .. key .. "; type==>" .. keyType);
end
if nil ~= keyFun then
cmd_table[key] = ExternalFun.read_datahelper({strkey = key, lentable = lenT, fun = keyFun});
end
end
return cmd_table;
end
以上就是lua读取C++通过