Files
wnmj-normal/Classes/Mission/PrivateMission.cpp
2026-03-03 13:56:44 +08:00

452 lines
10 KiB
C++

#include "PrivateMission.h"
#include "PopScene.h"
#include "Utility.h"
#include "JniFun.h"
PrivateMission::PrivateMission()
{
m_pGameServerItem = nullptr;
m_wMeTableID = INVALID_TABLE;
m_wMeChairID = INVALID_CHAIR;
zeromemory(&m_kCreatePrivateNet, sizeof(m_kCreatePrivateNet));
zeromemory(&m_kAutoRoomInfo, sizeof(m_kAutoRoomInfo));
zeromemory(&m_kDelAutoRoomInfo, sizeof(CMD_GP_DelAutoRoomInfo));
}
// 设置回调接口
void PrivateMission::setMissionSink(IPrivateMissionSink* pSink)
{
m_pPrivateMissionSink = pSink;
}
//网络连接
void PrivateMission::onEventTCPSocketLink()
{
SendLogonPacket();
}
//网络关闭
void PrivateMission::onEventTCPSocketShut()
{
}
//网络错误
void PrivateMission::onEventTCPSocketError(int errorCode)
{
}
//网络消息读取
bool PrivateMission::onEventTCPSocketRead(int main, int sub, void* data, int dataSize)
{
switch (main)
{
//登录消息
case MDM_GR_LOGON: return OnSocketMainLogon(sub, data, dataSize);
//用户信息
case MDM_GR_USER: return OnSocketMainUser(sub, data, dataSize);
//系统消息
case MDM_CM_SYSTEM: return OnSocketMainSystem(sub, data, dataSize);
//私人场消息
case MDM_GR_PRIVATE:return OnSocketMainPrivate(sub, data, dataSize);
default:
break;
}
return true;
}
//登录消息
bool PrivateMission::OnSocketMainLogon(int sub, void* data, int dataSize)
{
switch (sub)
{
case SUB_GR_LOGON_FINISH:
{
if (m_wMeTableID != INVALID_TABLE)
{
EnterGameScene();
return true;
}
if (m_eLinkAction == Type_Link_Create)
{
SendSocketData(MDM_GR_PRIVATE, SUB_GR_CREATE_PRIVATE, &m_kCreatePrivateNet, sizeof(m_kCreatePrivateNet));
zeromemory(&m_kCreatePrivateNet, sizeof(m_kCreatePrivateNet));
}
else if (m_eLinkAction == Type_Link_Join)
{
CMD_GR_Join_Private kSendNet;
kSendNet.dwRoomNum = m_dwJoinRoomNum;
SendSocketData(MDM_GR_PRIVATE, SUB_GR_JOIN_PRIVATE, &kSendNet, sizeof(kSendNet));
}
else if (Type_Link_Auto == m_eLinkAction)
{
SendSocketData(MDM_GR_PRIVATE, SUB_GR_CREATE_AUTO_ROOM, &m_kAutoRoomInfo, sizeof(m_kAutoRoomInfo));
zeromemory(&m_kAutoRoomInfo, sizeof(m_kAutoRoomInfo));
}
else if (Type_Link_Del == m_eLinkAction)
{
SendSocketData(MDM_GR_PRIVATE, SUB_GR_DEL_AUTO_ROOM_INFO, &m_kDelAutoRoomInfo, sizeof(m_kDelAutoRoomInfo));
zeromemory(&m_kDelAutoRoomInfo, sizeof(m_kDelAutoRoomInfo));
}
m_eLinkAction = Type_Link_NULL;
}
break;
case SUB_GR_LOGON_FAILURE:
{
CMD_GR_LogonError* pGameServer = (CMD_GR_LogonError*)data;
PopScene::Instance().show(utility::a_u8(pGameServer->szErrorDescribe));
}
break;
case SUB_GR_UPDATE_NOTIFY:
{
auto callback = []{
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
};
PopScene::Instance().show(utility::a_u8("发现新版本,请前往官网下载并重新安装!"), callback);
this->stop();
}
break;
default:
break;
}
return true;
}
//用户信息
bool PrivateMission::OnSocketMainUser(int sub, void* data, int dataSize)
{
if (sub == SUB_GR_USER_ENTER)
{
tagUserInfoHead* pUserInfoHead = (tagUserInfoHead*)data;
if (pUserInfoHead->dwUserID == m_dwMeUserID)
{
m_wMeTableID = pUserInfoHead->wTableID;
m_wMeChairID = pUserInfoHead->wChairID;
}
}
else if (sub == SUB_GR_USER_STATUS)
{
//处理数据
CMD_GR_UserStatus * pUserStatus = (CMD_GR_UserStatus *)data;
if (pUserStatus->dwUserID == m_dwMeUserID &&
(pUserStatus->UserStatus.wTableID != INVALID_TABLE || pUserStatus->UserStatus.wChairID != INVALID_CHAIR))
{
EnterGameScene();
}
}
else if (sub == SUB_GR_SIT_FAILED)
{
//变量定义
CMD_GR_RequestFailure * pRequestFailure = (CMD_GR_RequestFailure *)data;
//效验参数
ASSERT(dataSize > (sizeof(CMD_GR_RequestFailure) - sizeof(pRequestFailure->szDescribeString)));
if (dataSize <= (sizeof(CMD_GR_RequestFailure) - sizeof(pRequestFailure->szDescribeString))) return false;
PopScene::Instance().show(a_u8c(pRequestFailure->szDescribeString));
this->stop();
}
return true;
}
//系统消息
bool PrivateMission::OnSocketMainSystem(int sub, void* data, int dataSize)
{
switch (sub)
{
//系统消息
case SUB_CM_SYSTEM_MESSAGE: return OnSocketSubSystemMessage(data, dataSize);
}
//错误断言
ASSERT(FALSE);
return true;
}
//系统消息
bool PrivateMission::OnSocketSubSystemMessage(void* data, int wDataSize)
{
cocos2d::log(("PrivateMission::OnSocketSubSystemMessage\n"));
CMD_CM_SystemMessage * pSystemMessage = (CMD_CM_SystemMessage *)data;
uint16 wHeadSize = sizeof(CMD_CM_SystemMessage) - sizeof(pSystemMessage->szString);
//效验参数
ASSERT((wDataSize > wHeadSize) && (wDataSize == (wHeadSize + pSystemMessage->wLength*sizeof(char))));
if ((wDataSize <= wHeadSize) || (wDataSize != (wHeadSize + pSystemMessage->wLength*sizeof(char)))) return false;
uint16 wType = pSystemMessage->wType;
this->stop();
PopScene::Instance().show(utility::a_u8(pSystemMessage->szString));
return true;
}
//
bool PrivateMission::OnSocketMainPrivate(int sub, void* data, int dataSize)
{
switch (sub)
{
//费用查询
case SUB_GR_PRIVATE_INFO:
{
return OnSocketSubPrivateInfo(data, dataSize);
}
case SUB_GR_CREATE_PRIVATE_SUCESS:
{
return OnSocketSubPrivateCreateSuceess(data, dataSize);
}
case SUB_GF_PRIVATE_ROOM_INFO:
{
return OnSocketSubPrivateRoomInfo(data, dataSize);
}
case SUB_GR_PRIVATE_HAS_CREATED:
{
EnterGameScene();
return true;
}
case SUB_GR_CREATE_AUTO_RESULTE:
{
return OnSocketSubCreateAutoResulte(data, dataSize);
}
case SUB_GR_DEL_AUTO_ROOM_INFO:
{
return OnSocketSubDelAutoResulte(data, dataSize);
}
case SUB_GR_AUTO_USER_READY:
{
return OnSocketSubAutoUserReady(data, dataSize);
}
}
return true;
}
//void PrivateMission::SendPrivateAgagin()
//{
// CMD_GR_Again_Private kNetInfo;
// SendSocketData(MDM_GR_PRIVATE, SUB_GR_RRIVATE_AGAIN, &kNetInfo, sizeof(kNetInfo));
//}
//
bool PrivateMission::OnSocketSubPrivateInfo(void* data, int dataSize)
{
cocos2d::log("PrivateMission::OnSocketSubPrivateInfo\n");
CMD_GR_Private_Info *pNetInfo = (CMD_GR_Private_Info*)data;
return true;
}
//创建成功
bool PrivateMission::OnSocketSubPrivateCreateSuceess(void* data, int dataSize)
{
cocos2d::log("PrivateMission::OnSocketSubPrivateCreateSuceess\n");
ASSERT(dataSize == sizeof(CMD_GR_Create_Private_Sucess));
if (dataSize != sizeof(CMD_GR_Create_Private_Sucess)) return false;
CMD_GR_Create_Private_Sucess *pNetInfo = (CMD_GR_Create_Private_Sucess*)data;
// 修改创建房间时不加入桌子, 创建完成客户端通过加入消息进入游戏(zhangxw 2017-08-24);
CMD_GR_Join_Private kSendNet;
kSendNet.dwRoomNum = pNetInfo->dwRoomNum;
SendSocketData(MDM_GR_PRIVATE, SUB_GR_JOIN_PRIVATE, &kSendNet, sizeof(kSendNet));
//EnterGameScene();
return true;
}
//私人场信息
bool PrivateMission::OnSocketSubPrivateRoomInfo(void* data, int dataSize)
{
cocos2d::log("PrivateMission::OnSocketSubPrivateRoomInfo\n");
DataStream kDataStream(data, dataSize);
CMD_GF_Private_Room_Info kNetInfo;
kNetInfo.StreamValue(kDataStream, false);
EnterGameScene();
return true;
}
//发送函数
bool PrivateMission::SendSocketData(uint16 wMainCmdID, uint16 wSubCmdID)
{
return SendSocketData(wMainCmdID, wSubCmdID, 0, 0);
}
//发送函数
bool PrivateMission::SendSocketData(uint16 wMainCmdID, uint16 wSubCmdID, void * data, uint16 dataSize)
{
return send(wMainCmdID, wSubCmdID, (unsigned char*)data, dataSize);
}
//发送登录
bool PrivateMission::SendLogonPacket()
{
//变量定义
CGlobalUserInfo * pGlobalUserInfo = CGlobalUserInfo::GetInstance();
tagGlobalUserData * pGlobalUserData = pGlobalUserInfo->GetGlobalUserData();
m_dwMeUserID = pGlobalUserData->dwUserID;
//变量定义
CMD_GR_LogonUserID LogonUserID;
zeromemory(&LogonUserID, sizeof(LogonUserID));
LogonUserID.wKindID = m_wGameKindID;
//游戏版本
//LogonUserID.dwProcessVersion = Helps::Instance()->GetGameVersion();
//LogonUserID.dwPlazaVersion = Helps::Instance()->GetPlazaVersion();
LogonUserID.dwPlazaVersion = JniFun::getVersionCode();
//登录信息
LogonUserID.dwUserID = m_dwMeUserID;
strncpy(LogonUserID.szPassword, pGlobalUserData->szPassword, countarray(LogonUserID.szPassword));
//发送数据
SendSocketData(MDM_GR_LOGON, SUB_GR_LOGON_USERID, &LogonUserID, sizeof(LogonUserID));
return true;
}
//网络心跳包
bool PrivateMission::onEventTCPHeartTick()
{
return true;
}
//进入游戏场景
void PrivateMission::EnterGameScene()
{
stop();
if (m_pPrivateMissionSink)
{
m_pPrivateMissionSink->StartGameScene(m_pGameServerItem);
}
}
//设置创建私人场房间信息
void PrivateMission::SetCreateInfo(CMD_GR_Create_Private* pInfo)
{
memcpy(&m_kCreatePrivateNet, pInfo, sizeof(CMD_GR_Create_Private));
m_eLinkAction = Type_Link_Create;
}
//设置创建代开房间信息
void PrivateMission::SetCreateAutoInfo(CMD_GR_AutoRoomInfo* pInfo)
{
memcpy(&m_kAutoRoomInfo, pInfo, sizeof(CMD_GR_AutoRoomInfo));
m_eLinkAction = Type_Link_Auto;
}
//设置删除代开房间信息
void PrivateMission::SetDelAutoInfo(CMD_GP_DelAutoRoomInfo* pInfo)
{
memcpy(&m_kDelAutoRoomInfo, pInfo, sizeof(CMD_GP_DelAutoRoomInfo));
m_eLinkAction = Type_Link_Del;
}
//设置加入私人场房间信息
void PrivateMission::SetJoinInfo(uint32 dwJoinRoomNum)
{
m_dwJoinRoomNum = dwJoinRoomNum;
m_eLinkAction = Type_Link_Join;
}
//连接服务器
void PrivateMission::ConnectServerByServerID(uint16 wServerID)
{
CGameServerItem* pServer = CServerListData::shared()->SearchGameServer(wServerID);
ConnectServer(pServer, true);
}
//连接服务器
void PrivateMission::ConnectServer(CGameServerItem* pServerItem, bool bServerID/* = false*/)
{
if (pServerItem)
{
m_pGameServerItem = pServerItem;
m_wGameKindID = pServerItem->m_GameServer.wKindID;
setUrl(pServerItem->m_GameServer.szServerAddr, pServerItem->m_GameServer.wServerPort);
start();
}
else
{
if (bServerID)
{
PopScene::Instance().show(utility::a_u8("房间号错误!"));
}
else
{
PopScene::Instance().show(a_u8c("连接游戏服务器失败!"));
}
}
}
//创建代开信息结果
bool PrivateMission::OnSocketSubCreateAutoResulte(void* data, int dataSize)
{
stop();
ASSERT(dataSize >= sizeof(SCORE));
if (dataSize < sizeof(SCORE)) return false;
CMD_GR_AutoResulte *pNetInfo = (CMD_GR_AutoResulte*)data;
if (m_pPrivateMissionSink)
{
m_pPrivateMissionSink->CreateAutoRoomInfoResulte(pNetInfo);
}
return true;
}
//删除代开信息完成
bool PrivateMission::OnSocketSubDelAutoResulte(void* data, int dataSize)
{
stop();
ASSERT(dataSize >= sizeof(SCORE));
if (dataSize < sizeof(SCORE)) return false;
CMD_GR_AutoResulte *pNetInfo = (CMD_GR_AutoResulte*)data;
if (m_pPrivateMissionSink)
{
m_pPrivateMissionSink->CreateAutoRoomInfoResulte(pNetInfo);
}
return true;
}
//自由人数开始状态;
bool PrivateMission::OnSocketSubAutoUserReady(void* data, int dataSize)
{
return true;
}