lua短连接

--[[
封装Socket短连,不在绑定view
]]


local targetPlatform = cc.Application:getInstance():getTargetPlatform()


local ExternalFun = appdf.req(appdf.EXTERNAL_SRC .. "ExternalFun")


local cmd_private = appdf.req(PriRoom.MODULE.PRIHEADER .. "CMD_Private")
local define_private = appdf.req(PriRoom.MODULE.PRIHEADER .. "Define_Private")
local struct_private = appdf.req(PriRoom.MODULE.PRIHEADER .. "Struct_Private")
local logincmd = appdf.req(appdf.HEADER_SRC .. "CMD_LogonServer")


-- 登陆服务器CMD
local cmd_pri_login = cmd_private.login
-- 游戏服务器CMD
local cmd_pri_game = cmd_private.game


local NetEvent = class("NetEvent")


function NetEvent:ctor(name,...)


print("NetEvent create:",name,...)





self._threadid  = nil
self._socket    = nil


self.m_tabCacheMsg = {}


self._callbackCount = 1 -- 返回消息数量,默认为1


return self:setEvent(name,...)
end


function NetEvent:setEvent(name,...)


self.eventName_ = name
self.params_ = {...}


print("NetEvent:setEvent",name,self.eventName_)
end


function NetEvent:setAddress(szUrl,nPort)
self._szServerUrl = szUrl
self._nServerPort = nPort
end


--网络错误
function NetEvent:onSocketError(pData)
if self._threadid == nil then
return
end
local cachemsg = cjson.encode(self.m_tabCacheMsg)
if nil ~= cachemsg then
if cc.PLATFORM_OS_WINDOWS == targetPlatform then
LogAsset:getInstance():logData(cachemsg or "",true)
else
buglyReportLuaException(cachemsg or "", debug.traceback())
end
end

self:onCloseSocket()


if not pData then
self:onErrorCallback("网络断开!")
elseif type(pData) == "string" then
self:onErrorCallback(pData)
else
local errorcode = pData:readword()
if errorcode == nil then
self:onErrorCallback("网络断开!")
elseif errorcode == 6 then
self:onErrorCallback("长时间无响应,网络断开!")
elseif errorcode == 3 then
self:onErrorCallback("网络连接超时, 请重试!")
-- 切换地址
if nil ~= yl.SERVER_LIST[yl.CURRENT_INDEX] then
yl.LOGONSERVER = yl.SERVER_LIST[yl.CURRENT_INDEX]
end
yl.CURRENT_INDEX = yl.CURRENT_INDEX + 1
if yl.CURRENT_INDEX > yl.TOTAL_COUNT then
yl.CURRENT_INDEX = 1
end
else
print("网络错误,code:",errorcode)
self:onErrorCallback("网络异常")
end
end


end


--启动网络
function  NetEvent:start()


print("NetEvent:start ... ")


--已存在连接
if self._socket ~= nil then
return self:onErrorCallback("此NetEvent已经启动过了")
end
--创建连接
local this = self


self._szServerUrl = self._szServerUrl or yl.LOGONSERVER
self._nServerPort = self._nServerPort or yl.LOGONPORT


print("NetEvent:start host",self._szServerUrl)
print("NetEvent:start port",self._nServerPort)


self._SocketFun = function(pData)
this:onSocketCallBack(pData)
end
self._socket = CClientSocket:createSocket(self._SocketFun)
self._socket:setwaittime(0)
self._sctime = os.time()
if self._socket:connectSocket(self._szServerUrl,self._nServerPort,yl.VALIDATE) == true then
self._threadid = 0
return true
else --创建失败
self:onCloseSocket() 
return self:onErrorCallback("创建Socket失败")
end
end


--网络消息回调
function NetEvent:onSocketCallBack(pData)
--无效数据
if  pData == nil then 
print("NetEvent onSocketCallBack pData == nil")
return
end

-- 连接命令
local main = pData:getmain()
local sub =pData:getsub()
print("NetEvent onSocketCallBack main:"..main.."#sub:"..sub)
if main == yl.MAIN_SOCKET_INFO then --网络状态
if sub == yl.SUB_SOCKET_CONNECT then
self._threadid = 1
print("NetEvent connect use time:",os.time() - self._sctime)
self:onConnected()
elseif sub == yl.SUB_SOCKET_ERROR then --网络错误
if self._threadid then
self:onSocketError(pData)
else
self:onCloseSocket()
end
else
self:onCloseSocket()
end
else
if 1 == self._threadid then--网络数据
self:onSocketEvent(main,sub,pData)
end
end
end


--关闭网络
function NetEvent:onCloseSocket()
if self._socket then
self._socket:relaseSocket()
self._socket = nil
end
if self._threadid then
self._threadid = nil
end
self._SocketFun = nil
end


--发送数据
function NetEvent:sendSocketData(pData)
if self._socket == nil then
self:onErrorCallback("发送数据失败,此Socket已经关闭")
return false
end
local tabCache = {}
tabCache["main"] = pData:getmain()
tabCache["sub"] = pData:getsub()
tabCache["len"] = pData:getlen()
tabCache["kindid"] = GlobalUserItem.nCurGameKind
table.insert( self.m_tabCacheMsg, tabCache )
if #self.m_tabCacheMsg > 5 then
table.remove(self.m_tabCacheMsg, 1)
end  
if not self._socket:sendData(pData) then
self:onSocketError("发送数据失败!")
return false
end
return true
end


--网络信息(短连接)
function NetEvent:onSocketEvent(main,sub,pData)

self._callbackCount = self._callbackCount - 1
if self._callbackCount <= 0 then
self:onCloseSocket()
end


self._tag = main .. "#" .. sub
print(self._tag)
-- 房卡模式的主命令
if main == cmd_pri_login.MDM_MB_PERSONAL_SERVICE then
if sub == cmd_pri_login.SUB_GR_USER_QUERY_ROOM_SCORE_RESULT then -- 参与的房间列表
return self:onSubJoinRoomList(pData)
elseif sub == cmd_pri_login.SUB_MB_QUERY_PERSONAL_ROOM_LIST_RESULT then -- 创建的房间列表
return self:onSubPrivateRoomList(pData)
-- elseif sub == cmd_pri_login.SUB_MB_PERSONAL_PARAMETER then -- 获取房间配置
-- return self:onQueryRoomParam(pData)
elseif sub == cmd_pri_login.SUB_MB_PERSONAL_PARAMETER then
return self:OnGetPriRoomProperty(pData)
elseif sub == cmd_pri_login.SUB_MB_PERSONAL_FEE_PARAMETER then
return self:OnGetPriRoomFee(pData)
elseif sub == cmd_pri_login.SUB_MB_QUERY_GAME_SERVER_RESULT then
return self:onSubGameServerResult(pData)
elseif sub == cmd_pri_login.SUB_MB_DISSUME_SEARCH_RESULT then -- 解散房间
return self:onSubDissumeSearchReasult(pData)
elseif sub == cmd_pri_login.SUB_MB_SEARCH_RESULT then                   -- 房间搜索结果
return self:onSubSearchRoomResult(pData)
elseif sub == cmd_pri_login.SUB_MB_QUERY_SHARE_RECORD then --推广奖励记录
return self:onSubShareRecode(pData)
elseif sub == cmd_pri_login.SUB_MB_QUERY_PERSONAL_ROOM_USER_INFO then --私人房请求玩家的房卡和游戏豆
return self:onSubQueryUserRoomCardBeans(pData)
end


elseif main == yl.MDM_GP_USER_SERVICE then
if sub == yl.SUB_GP_GAME_RECORD_LIST then -- 获取所有游戏的战绩列表
return self:onGetGameRecordList(pData)
elseif sub == yl.SUB_GP_GAME_RECORD_TOTAL then -- 获取指令recordid的战绩
return self:onGetGameRecord(pData)
elseif sub == yl.SUB_GP_GAME_RECORD_CHILD_ID then -- 获取指令详细的战绩
return self:onGetGameChildRecord(pData)
elseif sub == yl.SUB_GP_OPERATE_FAILURE then -- 获取指令详细的战绩
return self:onOperateFailure(pData)
end
end

return self:onErrorCallback("NetEvent 未注册的返回指令:" .. main .. "#" .. sub)
end
--连接OK
function NetEvent:onConnected()


print("NetEvent:onConnected",self.eventName_, self.eventName_ and self.params_)


if self.eventName_ and self.params_ then
local func = self[self.eventName_]
if type(func) == "function" then
return func(self,unpack(self.params_))
end
assert(false,"NetEvent eventName error, can not find function of:" .. self.eventName_)
end
end


function NetEvent:onOperateFailure(pData)
local lResultCode = pData:readint()
local szDescribe = pData:readstring()
self:onErrorCallback(szDescribe)
return self:onCloseSocket()
end


function NetEvent:onErrorCallback(errmsg)
print("onErrorCallback:",errmsg)
end


function NetEvent:onDataCallback(data,tag)
print("onDataCallback:",data,tag)
end


--=============================================================================================================
--=============================================================================================================
--=============================================================================================================
--=============================================================================================================


function NetEvent:getMyReword( list )
    if type(list) ~= "table" then
        return 0
    end
    for k,v in pairs(list) do
        if v["dwUserID"] == GlobalUserItem.dwUserID then
            return (tonumber(v.lScore) or 0)
        end
    end
    return 0
end


function NetEvent:sendQueryShareRecoder()
print("NetEvent sendQueryShareRecoder:")


local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_GP_QueryShareRecoder)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_MB_QUERY_SHARE_RECORD)
    buffer:pushdword(GlobalUserItem.dwUserID)
    if not self:sendSocketData(buffer) then
        self:onErrorCallback("发送查询参与列表失败!",self._tag)
    end
end


function NetEvent:onSubShareRecode(pData)
local ta={}
local allLen = pData :getlen()
    local curLen = pData:getcurlen()
if 0 == allLen then
return self:onDataCallback(ta)
end

while(curLen < allLen)
do
ta[#ta +1] = ExternalFun.read_netdata(cmd_pri_login.CMD_GP_ShareRecoder,pData)
curLen =pData:getcurlen()
end


    return  self:onDataCallback(ta)
end


function NetEvent:onSubQueryUserRoomCardBeans(pData)
print("私人房请求玩家房卡和游戏豆")
local buffer = ExternalFun.create_netdata(cmd_pri_login.DBO_MB_PersonalRoomUserInfo)
dump(buffer)
end


-- 发送查询参与列表
function NetEvent:sendQueryJoinRoomList(gameKindID)
    local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_MB_QeuryPersonalRoomList)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_GR_USER_QUERY_ROOM_SCORE)
    buffer:pushdword(GlobalUserItem.dwUserID)
    buffer:pushdword(tonumber(gameKindID) or GlobalUserItem.nCurGameKind)
    if not self:sendSocketData(buffer) then
        self:onErrorCallback("发送查询参与列表失败!",self._tag)
    end
end
-- 返回参与列表
function NetEvent:onSubJoinRoomList( pData )
local m_tabJoinRecord = {}
    -- 计算数目
    local len = pData:getlen()
    local itemcount = math.floor(len/define_private.LEN_PERSONAL_ROOM_SCORE)
    -- print("NetEvent onSubJoinRoomList " .. itemcount)
    for i = 1, itemcount do
        local pServer = ExternalFun.read_netdata(struct_private.tagQueryPersonalRoomUserScore, pData)
        pServer.lScore = self:getMyReword(pServer["PersonalUserScoreInfo"][1])
        -- 时间戳
        local tt = pServer.sysDissumeTime
        pServer.sortTimeStmp = os.time({day=tt.wDay, month=tt.wMonth, year=tt.wYear, hour=tt.wHour, min=tt.wMinute, sec=tt.wSecond}) or 0
        pServer.bFlagOnGame = (pServer.sortTimeStmp == 0)
        pServer.nOnGameOrder = pServer.bFlagOnGame and 1 or 0
        tt = pServer.sysCreateTime
        pServer.sortCreateTimeStmp = os.time({day=tt.wDay, month=tt.wMonth, year=tt.wYear, hour=tt.wHour, min=tt.wMinute, sec=tt.wSecond}) or 0
        table.insert(m_tabJoinRecord, pServer)        
    end
    table.sort( m_tabJoinRecord, function(a, b)
        if a.bFlagOnGame ~= b.bFlagOnGame then
            if a.nOnGameOrder == b.nOnGameOrder then
                return a.sortCreateTimeStmp < b.sortCreateTimeStmp
            else
                return a.nOnGameOrder < b.nOnGameOrder
            end
        else
            return a.sortTimeStmp < b.sortTimeStmp
        end
    end )
    return  self:onDataCallback(m_tabJoinRecord,self._tag)
end


-- 发送查询私人房列表
function NetEvent:sendQueryRoomList(gameKindID)
print("NetEvent sendQueryRoomList:",gameKindID)
    local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_MB_QeuryPersonalRoomList)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_MB_QUERY_PERSONAL_ROOM_LIST)
    buffer:pushdword(GlobalUserItem.dwUserID)
    buffer:pushdword(tonumber(gameKindID) or GlobalUserItem.nCurGameKind)
    if not self:sendSocketData(buffer) and nil ~= self._callBack then
        self:onErrorCallback("发送查询房间列表失败!",self._tag)
    end
end
-- 返回私人房列表
function NetEvent:onSubPrivateRoomList( pData )
print("NetEvent onSubPrivateRoomList")
    local m_tabCreateRecord = {}


    local cmd_table = ExternalFun.read_netdata(cmd_pri_login.CMD_MB_PersonalRoomInfoList, pData)


    local listinfo = cmd_table.PersonalRoomInfo[1]


    for i = 1, define_private.MAX_CREATE_PERSONAL_ROOM do
        local info = listinfo[i]
        if info.szRoomID ~= "" then


        -- dump(info.PersonalUserScoreInfo)


            info.lScore = info.lTaxCount--self:getMyReword(info.PersonalUserScoreInfo[1])
            -- 时间戳
            local tt = info.sysDissumeTime
            info.sortTimeStmp = os.time({day=tt.wDay, month=tt.wMonth, year=tt.wYear, hour=tt.wHour, min=tt.wMinute, sec=tt.wSecond})
            tt = info.sysCreateTime
            info.createTimeStmp = os.time({day=tt.wDay, month=tt.wMonth, year=tt.wYear, hour=tt.wHour, min=tt.wMinute, sec=tt.wSecond})
            table.insert(m_tabCreateRecord, info)
        else
            break
        end
    end
    table.sort( m_tabCreateRecord, function(a, b)
        if a.cbIsDisssumRoom ~= b.cbIsDisssumRoom then
            return a.cbIsDisssumRoom > b.cbIsDisssumRoom
        elseif a.cbIsDisssumRoom == 0 and a.cbIsDisssumRoom == b.cbIsDisssumRoom then
            return a.createTimeStmp < b.createTimeStmp
        else
            return a.sortTimeStmp < b.sortTimeStmp
        end        
    end )
    return self:onDataCallback(m_tabCreateRecord,self._tag)
end


-- 发送请求配置
function NetEvent:sendQueryRoomParam(gameKindID)


self._callbackCount = 2


    local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_MB_GetPersonalParameter)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_MB_GET_PERSONAL_PARAMETER)
    buffer:pushdword(tonumber(gameKindID) or GlobalUserItem.nCurGameKind)
    if not self:sendSocketData(buffer) then
        self:onErrorCallback("发送请求配置失败!",self._tag)
    end
end


--取得私人房属性
function NetEvent:OnGetPriRoomProperty(pData)
local tempProperty = ExternalFun.read_netdata( struct_private.tagPersonalRoomOption, pData )
print("取得私人房属性:")
-- dump(tempProperty)
self._property = tempProperty
end
--取得私人房费用配置
function NetEvent:OnGetPriRoomFee(pData)

local feeConfingList={}
    local len = pData:getlen()
    local count = math.floor(len/define_private.LEN_PERSONAL_TABLE_PARAMETER)
    for idx = 1, count do
        local param = ExternalFun.read_netdata( struct_private.tagPersonalTableParameter, pData )
        table.insert(feeConfingList, param)
    end
    table.sort( feeConfingList, function(a, b)
        return a.dwDrawCountLimit < b.dwDrawCountLimit
    end )
print("取得私人房间费用配置")


local data = {}
data.property = self._property
data.freeConfingList = feeConfingList
return self:onDataCallback(data,self._tag)
end


-- 发送查询私人房
function NetEvent:sendSearchRoom(roomId,nCurGameKind)
    local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_MB_SerchServerTableEnter)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_MB_SEARCH_SERVER_TABLE)
    buffer:pushstring(roomId or 0, define_private.ROOM_ID_LEN)
    buffer:pushdword(nCurGameKind or GlobalUserItem.nCurGameKind)
    if not self:sendSocketData(buffer) then
        self:onErrorCallback("发送查询房间失败!")
    end
end
function NetEvent:onSubSearchRoomResult(pData)
local cmd_table = ExternalFun.read_netdata(cmd_pri_login.CMD_MB_SearchResult, pData)
    dump(cmd_table, "CMD_MB_SearchResult", 6)
    -- 0 == cmd_table.dwServerID
    return self:onDataCallback(cmd_table, self._tag)
end


--[[
-- 用户ID
    {t = "dword", k = "dwUserID"},
    -- 类型ID
    {t = "dword", k = "dwKindID"},
    -- 是否参与 (0 不参与; 1 参与)
    {t = "byte", k = "cbIsJoinGame"},
    {t = "byte", k = "cbPlayCostMode"}, -- 0 房主 2 AA
]]
-- 发送创建房间
function NetEvent:sendCreateRoom(gameKindID,pData,cbIsJoinGame,cbPlayCostMode)
local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_MB_QueryGameServer)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_MB_QUERY_GAME_SERVER)
    buffer:pushdword(GlobalUserItem.dwUserID)
    buffer:pushdword(tonumber(gameKindID) or GlobalUserItem.nCurGameKind)
    buffer:pushbyte(cbIsJoinGame or 0)
    local cbPlayCostMode = tonumber(cbPlayCostMode) or 0
    buffer:pushbyte(cbPlayCostMode ~= 0 and 2 or 0)
self._pData=pData
local leng = pData:getlen()
    if not self:sendSocketData(buffer) then
        self:onErrorCallback("发送创建房间失败!")
    end
end
-- -- 创建结果
function NetEvent:onSubGameServerResult( pData )
print("创建回调")
    local cmd_table = ExternalFun.read_netdata( cmd_pri_login.CMD_MB_QueryGameServerResult, pData )
    dump(cmd_table, "CMD_MB_QueryGameServerResult", 6)
    local tips = cmd_table.szErrDescrybe


    if false == cmd_table.bCanCreateRoom then
        if type(tips) == "string" then
            self:onErrorCallback(tips)
        end
        return true
    end
    if 0 == cmd_table.dwServerID and true == cmd_table.bCanCreateRoom then
        if type(tips) == "string" then
            self:onErrorCallback(tips)
        end
        return true
    end    


    self._loginEvent = "createRoom"


    -- 发送登陆
    self:LoginPrivRoom(cmd_table.dwServerID)
    return false
end
--------------------------------------------------------------------------------
--这里做个测试创建房间PriRoom:getInstance():
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function NetEvent:LoginPrivRoom(dwServerID)
local ev = {}
NetEvent._gameList = NetEvent._gameList or PriRoom:getInstance()._scene:getApp()._gameList
for _,v in ipairs(GlobalUserItem.priRoomlist) do
-- dump(v)
if v.wServerID == dwServerID then
local kindID = tostring(v.wKindID)
self.temproomInfo = v
ev.host =v.szServerAddr
ev.port = v.wServerPort
for _,gameInfo in ipairs(NetEvent._gameList) do
if gameInfo._KindID == kindID then
dump(gameInfo)
ev._kindVersion = gameInfo._KindVersion
ev._wKindID = gameInfo._KindID
break
end
end
break
end
end
-- dump(ev)
if ev._kindVersion==nil or ev._wKindID==nil then
return self:onErrorCallback("游戏未配置")
end



ev._parent = self

--创建socket回调
function ev:socketCallback(pData)
local main = pData:getmain()
local sub =pData:getsub()
print("消息=========>main:"..main.." sub:"..sub)
if main == yl.MAIN_SOCKET_INFO then --main:0 网络状态
if sub == yl.SUB_SOCKET_CONNECT then --sub:1
return self:onConnected()
elseif sub == yl.SUB_SOCKET_ERROR then --网络错误
self._socket:relaseSocket()
self._socket = nil
return self._parent:onErrorCallback("创建链接Socket失败")
end
elseif main == yl.MDM_GR_LOGON then
return self:onSocketEvent(sub,pData)
elseif main == yl.MDM_GR_STATUS then -- 4 状态消息
return self:onSocketStatusEvent(sub,pData)
elseif main == cmd_private.game.MDM_GR_PERSONAL_TABLE then --210


if sub == cmd_private.game.SUB_GR_CREATE_SUCCESS then
return self:onSocketCreateRoomSuccess(pData)
elseif sub == cmd_private.game.SUB_GR_CURRECE_ROOMCARD_AND_BEAN then -- 强制解散桌子后的游戏豆和房卡数量
return self:onSubCancelTableScoreInfo( pData )
elseif sub == cmd_private.game.SUB_GR_CANCEL_TABLE_RESULT then -- 强制解散桌子结果
return self:onSubCancelTableResult( pData )
elseif sub == cmd_private.game.SUB_GR_CREATE_FAILURE then
return self:onSocketCreateRoomFail(pData)
end
end
print("未处理消息!!! main:",main," sub:",sub)
end
--链接
function ev:connect()
self._sctime = os.time()
self._socket = CClientSocket:createSocket(handler(self,self.socketCallback))
self._socket:setwaittime(0)


if not self._socket:connectSocket(self.host,self.port,yl.VALIDATE) then
return self._parent:onErrorCallback("创建链接Socket失败")
end
end
--链接成功后登陆
function ev:onConnected()
print("链接成功!")
print("开始发送登录...")


print("NetEvent sub ev connect use time:",os.time() - self._sctime)
self._sctime = os.time()


local dataBuffer = CCmd_Data:create(213)
--初始化参数 这里没有初始化参数
--self:onInitData()
dataBuffer:setcmdinfo(yl.MDM_GR_LOGON, yl.SUB_GR_LOGON_MOBILE)
dataBuffer:pushword(self._wKindID)
dataBuffer:pushdword(self._kindVersion)
print("KindId:",self._wKindID," ,KindVersion:" ,self._kindVersion)
dataBuffer:pushbyte(yl.DEVICE_TYPE)
dataBuffer:pushword(0x0011)
dataBuffer:pushword(255)


dataBuffer:pushdword(GlobalUserItem.dwUserID)
dataBuffer:pushstring(GlobalUserItem.szDynamicPass,33)
dataBuffer:pushstring(GlobalUserItem.szRoomPasswd,33)
dataBuffer:pushstring(GlobalUserItem.szMachine,33)


if not self._socket:sendData(dataBuffer) then
self._parent:onErrorCallback("发送数据失败!")
self._socket:relaseSocket()
self._socket = nil
return false
end
end
--登陆事件
function ev:onSocketEvent(sub,pData)
if sub == yl.SUB_GR_LOGON_FINISH then  --登陆完成
print("登陆完成:",event)
print("NetEvent sub ev logon use time:",os.time() - self._sctime)


local event = self._parent._loginEvent


if event == "createRoom" then -- 创建房间
self:sendCreateRoom()
elseif event == "dissumeRoom" then -- 解散房间
self:sendDissumeGame()
end
elseif sub == yl.SUB_MB_LOGON_FAILURE then --登陆失败
print("=========== 登录失败 ===========")
local cmd_table = ExternalFun.read_netdata(logincmd.CMD_MB_LogonFailure, pData)
if 10 == cmd_table.lResultCode then
GlobalUserItem.setBindingAccount()
end
self._socket:relaseSocket()
self._socket = nil
self._parent:onErrorCallback(cmd_table.szDescribeString,self._parent._tag)
end
end
--创建房间
function ev:sendCreateRoom()
if not self._socket:sendData(self._parent._pData) then
self._parent:onErrorCallback("发送数据失败!")
self._socket:relaseSocket()
self._socket = nil
return false
end
-- self._parent._pData:release()
end
--解散房间
function ev:sendDissumeGame()
   local buffer = ExternalFun.create_netdata(cmd_pri_game.CMD_GR_HostDissumeGame)
        buffer:setcmdinfo(cmd_pri_game.MDM_GR_PERSONAL_TABLE,cmd_pri_game.SUB_GR_HOSTL_DISSUME_TABLE)
        buffer:pushdword(GlobalUserItem.dwUserID)
        buffer:pushdword(self._parent._dwTableID or 0)
        if not self._socket:sendData(buffer) then
            self._parent:onErrorCallback("发送解散游戏失败!")
            self._socket:relaseSocket()
self._socket = nil
        end
end
--创建事件
function ev:onSocketCreateRoomSuccess(pData)
print("创建房间成功")
local cmd_table = ExternalFun.read_netdata(cmd_private.game.CMD_GR_CreateSuccess, pData)
-- dump(cmd_table)


self._socket:relaseSocket()
self._socket = nil


return self._parent:onDataCallback(cmd_table,self._parent._tag,pData)
end
--创建失败
function ev:onSocketCreateRoomFail(pData)
local cmd_table = ExternalFun.read_netdata(cmd_pri_game.CMD_GR_CreateFailure, pData)
self._socket:relaseSocket()
self._socket = nil
self._parent:onErrorCallback(cmd_table.szDescribeString,self._parent._tag)
end
-- 解散后财富信息
function ev:onSubCancelTableScoreInfo( pData )
   local cmd_table = ExternalFun.read_netdata(cmd_pri_game.CMD_GR_CurrenceRoomCardAndBeans, pData)
   -- 个人财富
   GlobalUserItem.dUserBeans = cmd_table.dbBeans
   GlobalUserItem.lRoomCard = cmd_table.lRoomCard
   -- 通知更新        
   local eventListener = cc.EventCustom:new(yl.RY_USERINFO_NOTIFY)
   eventListener.obj = yl.RY_MSG_USERWEALTH
   cc.Director:getInstance():getEventDispatcher():dispatchEvent(eventListener)
end
-- 私人房解散结果
function ev:onSubCancelTableResult( pData )
   local cmd_table = ExternalFun.read_netdata(cmd_pri_game.CMD_GR_DissumeTable, pData)


   self._socket:relaseSocket()
self._socket = nil


return self._parent:onDataCallback(cmd_table,self._tag,pData)
end
--状态事件
function ev:onSocketStatusEvent(sub,pData)
end
ev:connect()
end


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------


-- 解析战绩列表
function NetEvent:decodePrivateRandTotalRecordList(pData)
local recordList = {}


local dwUserID = pData:readdword()
local streamLen = pData:readint()


-- print("decodePrivateRandTotalRecordList dwUserID:",dwUserID)
-- print("decodePrivateRandTotalRecordList streamLen:",streamLen)


recordList.dwUserID = dwUserID
recordList.privateRandTotalRecord = {}


for i=1,streamLen do
recordList.privateRandTotalRecord[i] = self:decodePrivateRandTotalRecord(pData)
end
return recordList
end
-- 解析单局战绩
function NetEvent:decodePrivateRandTotalRecord(pData)
local info = {}


info.iRoomNum = pData:readint()


local kUserIDLen = pData:readint()


-- print("decodePrivateRandTotalRecord iRoomNum:",info.iRoomNum)
-- print("decodePrivateRandTotalRecord kUserIDLen:",kUserIDLen)


info.kUserIDs = {}
for i=1,kUserIDLen do
info.kUserIDs[i] = pData:readint()
end


info.kNickNames = {}
local kNickNameLen = pData:readint()
-- print(" kNickNameLen ",kNickNameLen)
for i=1,kNickNameLen do
local strlen = pData:readint()
local str = ""
for j=1,strlen do
str = str .. string.char(pData:readbyte())
end
info.kNickNames[i] = str
end


info.kScores = {}
local kScoreLen = pData:readint()
for i=1,kScoreLen do
info.kScores[i] = pData:readint()
end


info.kPlayTime = {}
info.kPlayTime.wYear         = pData:readword()
info.kPlayTime.wMonth        = pData:readword()
info.kPlayTime.wDayOfWeek    = pData:readword()
info.kPlayTime.wDay          = pData:readword()
info.kPlayTime.wHour         = pData:readword()
info.kPlayTime.wMinute       = pData:readword()
info.kPlayTime.wSecond       = pData:readword()
info.kPlayTime.wMilliseconds = pData:readword()


-- 结束时间
info.kPlayTimeEnd = {}
info.kPlayTimeEnd.wYear         = pData:readword()
info.kPlayTimeEnd.wMonth        = pData:readword()
info.kPlayTimeEnd.wDayOfWeek    = pData:readword()
info.kPlayTimeEnd.wDay          = pData:readword()
info.kPlayTimeEnd.wHour         = pData:readword()
info.kPlayTimeEnd.wMinute       = pData:readword()
info.kPlayTimeEnd.wSecond       = pData:readword()
info.kPlayTimeEnd.wMilliseconds = pData:readword()


info.kRecordChilds = {}


local kRecordChildLen = pData:readint()
-- print("kRecordChildLen :",kRecordChildLen)


for i=1,kRecordChildLen do
info.kRecordChilds[i] = self:decodePrivateRandChildRecord(pData)
end


info.iRecordID = pData:readint()
local strlen = pData:readint()
local str = ""
for i=1,strlen do
str = str .. string.char(pData:readbyte())
end
info.kUserDefine = str
info.dwKindID = pData:readdword()
info.dwVersion = pData:readdword()
-- dump(info)
return info
end


local t2Cmd = {}
t2Cmd.__index = t2Cmd
function t2Cmd:__call()
local len = self._len or 0
local data = CCmd_Data:create(len)
for i=1,len do
-- data:pushbyte(self._data:byte(i))
data:pushbyte(self._data[i])
end
data:resetread()
return data
end
function t2Cmd:pushbyte(byte)
self._len = (self._len or 0) + 1
-- self._data = (self._data or "") .. string.char(byte)
self._data = self._data or {}
self._data[self._len] = byte
end
function t2Cmd:getlen()
return self._len or 0
end
-- 解析单局单个战绩
function NetEvent:decodePrivateRandChildRecord(pData)


-- print("decodePrivateRandChildRecord: curlen = ",pData:getcurlen())
-- print("decodePrivateRandChildRecord: getlen = ",pData:getlen())


local kRecordChild = {}


kRecordChild.iRecordID = pData:readint()
kRecordChild.iRecordChildID = pData:readint()


-- print("decodePrivateRandChildRecord iRecordID:",kRecordChild.iRecordID)
-- print("decodePrivateRandChildRecord iRecordChildID:",kRecordChild.iRecordChildID)


kRecordChild.kScores = {}
local kScoreLen = pData:readint()


-- print("decodePrivateRandChildRecord kScoreLen:",kScoreLen)


for i=1,kScoreLen do
kRecordChild.kScores[i] = pData:readint()
end


local kRecordGameLen = pData:readint()


-- print("decodePrivateRandChildRecord kRecordGameLen:",kRecordGameLen)


-- kRecordChild.kRecordGame = CCmd_Data:create(kRecordGameLen)
-- for i=1,kRecordGameLen do
-- kRecordChild.kRecordGame:pushbyte(pData:readbyte())
-- end
-- kRecordChild.kRecordGame:resetread()
--[[
CCmd_Data会自动释放内存,因此不宜长时保存
采用t2Cmd先数据保存,再通过t2Cmd()返回CCmd_Data
]]
kRecordChild.kRecordGame = setmetatable({},t2Cmd)
for i=1,kRecordGameLen do
kRecordChild.kRecordGame:pushbyte(pData:readbyte())
end


kRecordChild.kPlayTime = {}
kRecordChild.kPlayTime.wYear         = pData:readword()
kRecordChild.kPlayTime.wMonth        = pData:readword()
kRecordChild.kPlayTime.wDayOfWeek    = pData:readword()
kRecordChild.kPlayTime.wDay          = pData:readword()
kRecordChild.kPlayTime.wHour         = pData:readword()
kRecordChild.kPlayTime.wMinute       = pData:readword()
kRecordChild.kPlayTime.wSecond       = pData:readword()
kRecordChild.kPlayTime.wMilliseconds = pData:readword()


local strlen = pData:readint()
local str = ""
for i=1,strlen do
str = str .. string.char(pData:readbyte())
end
kRecordChild.kUserDefine = str


kRecordChild.dwKindID = pData:readdword()
kRecordChild.dwVersion = pData:readdword()


-- 用户头像
local wFaceIDLen = pData:readint() or 0
-- print("wFaceIDLen:",wFaceIDLen)
kRecordChild.wFaceIDs = {}
for i=1,wFaceIDLen do
kRecordChild.wFaceIDs[i] = pData:readword()
-- print("kRecordChild.wFaceIDs ",i,kRecordChild.wFaceIDs[i])
end
local dwCustomIDLen = pData:readint() or 0
-- print("dwCustomIDLen:",dwCustomIDLen)
kRecordChild.dwCustomIDs = {}
for i=1,dwCustomIDLen do
kRecordChild.dwCustomIDs[i] = pData:readdword()
end


-- 用户昵称
local kNickNameLen = pData:readint() or 0
-- print("kNickNameLen:",kNickNameLen)
kRecordChild.kNickNames = {}
for i=1,kNickNameLen do
strlen = pData:readint()
str = ""
for i=1,strlen do
str = str .. string.char(pData:readbyte())
end
kRecordChild.kNickNames[i] = str
end


-- 用户ID
local kUserIDLen = pData:readint() or 0
-- print("kUserIDLen:",kUserIDLen)
kRecordChild.kUserIDs = {}
for i=1,kUserIDLen do
kRecordChild.kUserIDs[i] = pData:readint()
end


-- dump(kRecordChild)
return kRecordChild
end


-- 获取用户战绩列表
function NetEvent:sendGetGameRecordList(dwUserID)


assert(dwUserID,"sendGetGameRecordList params error")


local buffer = CCmd_Data:create(4)
buffer:setcmdinfo(yl.MDM_GP_USER_SERVICE,yl.SUB_GP_GAME_RECORD_LIST)
buffer:pushdword(dwUserID)
if not self:sendSocketData(buffer) then
print("获取用户战绩列表失败!")
self:onErrorCallback("获取用户战绩列表失败!",self._tag)
end
end
function NetEvent:onGetGameRecordList(pData)
print("onGetGameRecordList")


local data = self:decodePrivateRandTotalRecordList(pData)
-- dump(data)
return self:onDataCallback(data,self._tag,pData)
end


-- 获取用户战绩
function NetEvent:sendGetGameRecord(dwUserID,dwRecordID)


assert(dwUserID and dwRecordID,"sendGetGameRecordList params error")


local buffer = CCmd_Data:create(8)
buffer:setcmdinfo(yl.MDM_GP_USER_SERVICE,yl.SUB_GP_GAME_RECORD_TOTAL)
buffer:pushdword(dwUserID)
buffer:pushdword(dwRecordID)
if not self:sendSocketData(buffer) then
print("获取用户战绩失败!")
self:onErrorCallback("获取用户战绩失败!",self._tag)
end
end
function NetEvent:onGetGameRecord(pData)
local data = self:decodePrivateRandTotalRecord(pData)
-- dump(data)
return self:onDataCallback(data,self._tag,pData)
end
-- 获取用户详细战绩
function NetEvent:sendGetGameChildRecord(iRecordChildID)
local buffer = CCmd_Data:create(4)
buffer:setcmdinfo(yl.MDM_GP_USER_SERVICE,yl.SUB_GP_GAME_RECORD_CHILD_ID)
buffer:pushdword(iRecordChildID)
if not self:sendSocketData(buffer) then
print("获取用户战绩列表失败!")
self:onErrorCallback("获取用户战绩列表失败!",self._tag)
end
end


function NetEvent:onGetGameChildRecord(pData)
print("onGetGameChildRecord data len:",pData:getlen())


local data = self:decodePrivateRandChildRecord(pData)
-- dump(data)
return self:onDataCallback(data,self._tag,pData)
end


-- 解散房间
function NetEvent:sendDissumeRoom( roomId )
    local buffer = ExternalFun.create_netdata(cmd_pri_login.CMD_MB_SearchServerTable)
    buffer:setcmdinfo(cmd_pri_login.MDM_MB_PERSONAL_SERVICE,cmd_pri_login.SUB_MB_DISSUME_SEARCH_SERVER_TABLE)
    buffer:pushstring(roomId, define_private.ROOM_ID_LEN)
    if not self:sendSocketData(buffer) and nil ~= self._callBack then
        self:onErrorCallback("发送解散房间失败!",self._tag)
    end
end
function NetEvent:onSubDissumeSearchReasult(pData)
local cmd_table = ExternalFun.read_netdata(cmd_pri_login.CMD_MB_DissumeSearchResult, pData)
    dump(cmd_table, "CMD_MB_DissumeSearchResult", 6)


    -- 设置socket登入成功的事件
    self._loginEvent = "dissumeRoom"
    local dwServerID = cmd_table.dwServerID
    self._dwTableID = cmd_table.dwTableID
    return self:LoginPrivRoom(dwServerID)
end


return NetEvent
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值