// 响应LOG消息 void OnLogMessage(CMessage* pMsg) { DWORD curTime = timeGetTime(); char pszLogingInfo[512]=""; switch(pMsg->GetType()) { case MSG_L2W_LOG_QUEST_PLAYERBASELIST://loginserver请求一个账号下的玩家基本信息列表 { char szCdkey[ACCOUNT_SIZE]; pMsg->GetStr(szCdkey,ACCOUNT_SIZE); //去掉字符串右边的空格 TrimRight(szCdkey); //_snprintf(pszLogingInfo,512,"the cdkey(%s) MSG_L2W_LOG_QUEST_PLAYERBASELIST!", szCdkey); //PutStringToFile("Login_WS_Info",pszLogingInfo); #ifdef _RUNSTACKINFO1_ CMessage::AsyWriteFile(GetGame().GetStatckFileName(),pszLogingInfo); #endif // 判断DBS是否准备好了 if (!GetGame().GetInitVarLoadFlag() || !GetGame().GetInitRegionLoadFlag() || !GetGame().GetInitFactionLoadFlag() || !GetGame().GetInitUnionLoadFlag() || !GetNetHandler().IsServerReady(NF_DB_SERVER) || !GetGame().GetInitPersonalHouseLoadFlag() || ( GetInst( Business::CBusinessManager ).IsEnable() && !GetInst( Business::CBusinessManager ).IsDBLoaded() ) || !GetInst( AH::OrderMgr ).IsDBLoaded() ) { Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGINMSG_40", szCdkey)); CMessage pMsga(MSG_W2L_LOG_ANSWER_PLAYERBASELIST); // 添加验证代码 pMsga.Add((long)0xFFFFFFFF); pMsga.Add((BYTE)2);// flag pMsga.Add((szCdkey));// cdkey pMsga.Add((short)0);// flag pMsga.SendToServer(NF_LOGIN_SERVER); return; } // 判断GS是否准备好了 if (!CMessage::IsGSReady(-1)) { CMessage pMsga(MSG_W2L_LOG_ANSWER_PLAYERBASELIST); // 添加验证代码 pMsga.Add((long)0xFFFFFFFF); pMsga.Add((BYTE)2);// flag pMsga.Add((szCdkey));// cdkey pMsga.Add((short)0);// flag pMsga.SendToServer(NF_LOGIN_SERVER); return; } Account* acc = GetGame().GetEntityManager()->FindAccount(szCdkey); // 现在LoginPlayer对象缓冲区查找 if(acc) { acc->ClearAllLoginPlayer(); acc->SetName(szCdkey); GetGame().GetEntityManager()->CreateLoadAccountSession(acc); } else // 未找到缓冲区中的对象 { // 创建session if(szCdkey[0] != '\0') { acc = new Account; if(acc) { CGUID accGuid; CGUID::CreateGUID(accGuid); acc->SetGUID(accGuid); acc->SetName(szCdkey); } GetGame().GetEntityManager()->CreateLoadAccountSession(acc); SAFE_DELETE(acc); } } } break; case MSG_L2W_LOG_QUEST_PLAYERDATA://loginserver请求玩家的详细信息 { // 取得验证码 long lTestSignCode = pMsg->GetLong(); char szCdkey[ACCOUNT_SIZE]; CGUID guid; pMsg->GetGUID(guid);//获取PLAYERID pMsg->GetStr(szCdkey,ACCOUNT_SIZE);//获取CDKEY // 检查验证码 Account* tLoginInfo = GetGame().GetEntityManager()->FindAccount(szCdkey); if(!tLoginInfo) { char szGUID[128]; guid.tostring(szGUID); // _snprintf(pszLogingInfo,512,"MSG_L2W_LOG_QUEST_PLAYERDATA! Account[%s] Is Null!", szGUID, szCdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Warn(ROOT_MODULE,"MSG_L2W_LOG_QUEST_PLAYERDATA! Account[%s] Is Null!", szCdkey); CMessage msg(MSG_W2L_LOG_ANSWER_PLAYERDATA); msg.Add((long)0xFFFFFFFF); msg.Add((char)LOGIN_QUEST_PLAYERDATA_FAILED); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } if(tLoginInfo->GetSignCode() != lTestSignCode) { char szGUID[128]; guid.tostring(szGUID); // _snprintf(pszLogingInfo,512,"MSG_W2L_LOG_ANSWER_PLAYERDATA 玩家ID[%s],Cdkey[%s] 验证码错误!", szGUID, szCdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,"MSG_W2L_LOG_ANSWER_PLAYERDATA 玩家ID[%s],Cdkey[%s] 验证码错误!", szGUID, szCdkey); // 现在CLoginPlayer中找,如果没有对象或者状态为OFFLINE表示非法登录 tLoginInfo->SetPlayerState(PLAYER_STATE_VOID); CMessage msg(MSG_W2L_LOG_ANSWER_PLAYERDATA); long tmpSignCode = 0; GetGame().GenerateSignCodeByTime(tmpSignCode); tLoginInfo->SetSignCode(tmpSignCode); msg.Add((long)tLoginInfo->GetSignCode()); msg.Add((char)LOGIN_QUEST_PLAYERDATA_SIGNCODE_ERROR); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } // 现在CLoginPlayer中找,如果没有对象或者状态为OFFLINE表示非法登录 CEntityGroup* lPlayer = (CEntityGroup*)tLoginInfo->FindLoginPlayer(guid); // 找到CDBLoginPlayer对象 if( lPlayer && (tLoginInfo->GetPlayerState() == PLAYER_STATE_LOADED_BASE_DATA) ) { if(GetGame().GetEntityManager()->ComputeLoginPlayerDelTime(lPlayer) != -1) { char szGUID[128]; guid.tostring(szGUID); // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_0"), szCdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_0", szCdkey)); CMessage msg(MSG_W2L_LOG_ANSWER_PLAYERDATA); msg.Add((long)-1); msg.Add((char)LOGIN_QUEST_PLAYERDATA_FAILED); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); tLoginInfo->SetPlayerState(PLAYER_STATE_VOID); return; } // 需要到数据库读取 GetGame().GetEntityManager()->CreateLoadPlayerDataSession(szCdkey, guid); GetGame().GetEntityManager()->CreateInitLoadMailSession(guid); } else { CMessage msg(MSG_W2L_LOG_ANSWER_PLAYERDATA); msg.Add((long)-1); msg.Add((char)LOGIN_QUEST_PLAYERDATA_FAILED); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); //char szGUID[128]; //guid.tostring(szGUID); /*_snprintf(pszLogingInfo,512, AppFrame::GetText("WS_LOGMESSAGE_QUESTPROPERTYNOCREATEORLOADBASE"), szGUID, szCdkey); PutStringToFile("Login_WS_Info",pszLogingInfo);*/ tLoginInfo->SetPlayerState(PLAYER_STATE_VOID); } } break; case MSG_S2W_LOG_QUEST_PLAYERDATA://gameserver请求某个玩家的详细属性 { long lTestSignCode = pMsg->GetLong(); CGUID guid; pMsg->GetGUID(guid); long lSocketIDC2S = pMsg->GetLong(); char szCdkey[128]; pMsg->GetStr(szCdkey, sizeof(szCdkey)); LONG lIP = pMsg->GetLong(); // 检查验证码 Account* tLoginInfo = GetGame().GetEntityManager()->FindAccount(szCdkey); if(!tLoginInfo) { CPlayer *pPlayer = GetGame().GetMapPlayer(guid); if(pPlayer) { GetGame().OnPlayerQuit(pPlayer, CMessage::GetGSIDBySocket(pPlayer->GetGsSocket()), 0L); } // _snprintf(pszLogingInfo,512, "MSG_S2W_LOG_QUEST_PLAYERDATA! Account[%s] Is Null!", szCdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Warn(ROOT_MODULE,"MSG_S2W_LOG_QUEST_PLAYERDATA! Account[%s] Is Null!", szCdkey); CMessage msg(MSG_W2S_LOG_ANSWER_PLAYERDATA); msg.Add((long)0xFFFFFFFF); msg.Add((long)-1); msg.Add(guid); msg.Add(lSocketIDC2S); msg.SendToSocket(pMsg->GetSocketID()); //send to gameserver return; } CEntityGroup* lPlayer = (CEntityGroup*)tLoginInfo->FindLoginPlayer(guid); if(!lPlayer) { CPlayer *pPlayer = GetGame().GetMapPlayer(guid); if(pPlayer) { GetGame().OnPlayerQuit(pPlayer, CMessage::GetGSIDBySocket(pPlayer->GetGsSocket()), 0L); } tLoginInfo->SetPlayerState(PLAYER_STATE_VOID); CMessage msg(MSG_W2S_LOG_ANSWER_PLAYERDATA); msg.Add((long)0xFFFFFFFF); msg.Add((long)-1); msg.Add(guid); msg.Add(lSocketIDC2S); msg.SendToSocket(pMsg->GetSocketID()); //send to gameserver return; } if(tLoginInfo->GetSignCode() != lTestSignCode) { char szGUID[128]; guid.tostring(szGUID); // _snprintf(pszLogingInfo,512, "MSG_S2W_LOG_QUEST_PLAYERDATA 玩家ID[%s],Cdkey[%s] 验证码错误!", szGUID, lPlayer->GetStringAttr(string("Account"))); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Warn(ROOT_MODULE,"MSG_S2W_LOG_QUEST_PLAYERDATA 玩家ID[%s],Cdkey[%s] 验证码错误!", szGUID, lPlayer->GetStringAttr(string("Account"))); CMessage msg(MSG_W2S_LOG_ANSWER_PLAYERDATA); msg.Add(lTestSignCode); msg.Add((long)-3); msg.Add(guid); msg.Add(lSocketIDC2S); msg.SendToSocket(pMsg->GetSocketID()); //send to gameserver return; } if( tLoginInfo->GetPlayerState() == PLAYER_STATE_LOADED_CHAR_DATA// 玩家已登录服务器并读取详细数据 || tLoginInfo->GetPlayerState() == PLAYER_STATE_CHANGING_SERVER || tLoginInfo->GetPlayerState() == PLAYER_STATE_ENTERING_GAME )//正在切换服务器 { CPlayer *pPlayer = GetGame().GetMapPlayer(guid); if(pPlayer) { long lPlayerState = tLoginInfo->GetPlayerState(); if(GetGame().OnPlayerEnter(pPlayer, tLoginInfo, lTestSignCode, lIP, pMsg->GetGSID(), lSocketIDC2S, pMsg->GetSocketID())) { CMessage msg(MSG_W2S_LOG_ANSWER_PLAYERDATA); msg.Add(lTestSignCode); msg.Add(1L);//添加标记 msg.Add(guid); msg.Add(lSocketIDC2S); DBWriteSet setWriteDB; msg.GetDBWriteSet(setWriteDB); pPlayer->CodeToDataBlock(setWriteDB); msg.SendToSocket(pMsg->GetSocketID()); //send to gameserver GetGame().OnPlayerEnterLateCode(pPlayer, tLoginInfo); tLoginInfo->SetPlayerState(PLAYER_STATE_ENTERED_GAME); tLoginInfo->SetLoginTimeoutValue(-1); } if(lPlayerState == PLAYER_STATE_CHANGING_SERVER) { pPlayer->SetGsSocket(pMsg->GetSocketID()); LinkmanSystem::GetInstance().OnPlayerChangeGs(pPlayer); } } } else { CPlayer *pPlayer = GetGame().GetMapPlayer(guid); if(pPlayer) { CMessage msg(MSG_W2S_OTHER_KICKPLAYER); msg.Add((BYTE)AT_ONCE_KICK); msg.Add(pPlayer->GetExID()); msg.SendToSocket(pPlayer->GetGsSocket()); } tLoginInfo->SetPlayerState(PLAYER_STATE_BACKTOLOGIN); CMessage msg(MSG_W2S_LOG_ANSWER_PLAYERDATA); msg.Add((long)0xFFFFFFFF); msg.Add((long)-1); msg.Add(guid); msg.Add(lSocketIDC2S); msg.SendToSocket(pMsg->GetSocketID()); //send to gameserver } } break; //gameserver通知worldserver一个玩家已退出游戏, 转发DBS存盘消息 case MSG_S2W_LOG_PLAYERQUIT: { CGUID PlayerGuid; pMsg->GetGUID(PlayerGuid); long lFlag = pMsg->GetLong(); DWORD dwServerKey[SERVER_KEY_DWORD_SIZE]; for (LONG i = 0; i < SERVER_KEY_DWORD_SIZE; ++i) { dwServerKey[i] = pMsg->GetDWord(); } char szGUID[128]=""; PlayerGuid.tostring(szGUID); switch(lFlag) { case 1: // 正常退出 { CPlayer* pPlayer = GetGame().GetMapPlayer(PlayerGuid); if(NULL == pPlayer) { pPlayer = GetGame().NewRawPlayer(ePlayerQuitMsg); pPlayer->SetExID(PlayerGuid); // 更新WS上该玩家数据 DBReadSet setReadDB; pMsg->GetDBReadSet(setReadDB); pPlayer->DecodeFromDataBlock(setReadDB); if(pPlayer) { if(GetNetHandler().IsServerReady(NF_DB_SERVER)) { CWorldServerSession pSession(5000); // 设置当前账号状态 Account* pAcc = NULL; CEntityGroup* tDBLoginPlayer = NULL; if(pPlayer->GetAccount()) pAcc = GetGame().GetEntityManager()->FindAccount(pPlayer->GetAccount()); if(pAcc) { if(pAcc->GetPlayerState() != PLAYER_STATE_VOID) pAcc->SetPlayerState(PLAYER_STATE_BACKTOLOGIN); pAcc->SetCurGamedPlayerGuid(NULL_GUID); tDBLoginPlayer = pAcc->FindLoginPlayer(pPlayer->GetExID()); pSession.NakeSendSaveLoginPlayerDataMsg(pPlayer, tDBLoginPlayer); } else { tDBLoginPlayer = (CEntityGroup*)GetGame().GetEntityManager()->NewBaseEntity(string("[loginplayer]"), pPlayer->GetExID()); pSession.NakeSendSaveLoginPlayerDataMsg(pPlayer, tDBLoginPlayer); GetGame().GetEntityManager()->DelBaseEntity((CBaseEntity*)tDBLoginPlayer); } CEntityGroup* tDBPlayer = (CEntityGroup*)GetGame().GetEntityManager()->NewBaseEntity(string("[player]"), pPlayer->GetExID()); pSession.NakeSendSavePlayerDataMsg(SAVE_DETAIL_ALL, pPlayer, tDBPlayer, true); GetGame().GetEntityManager()->DelBaseEntity((CBaseEntity*)tDBPlayer); GetGame().DelRawPlayer(pPlayer); } else GetGame().PushSavePlayer(pPlayer); } return; } else { // 更新WS上该玩家数据 DBReadSet setReadDB; pMsg->GetDBReadSet(setReadDB); pPlayer->DecodeFromDataBlock(setReadDB); pPlayer->SetPlayerLogin(false); pPlayer->SetFirstLogin(false); if(GetNetHandler().IsServerReady(NF_DB_SERVER)) { const char* szCdkey = pPlayer->GetAccount(); Account* pAcc = NULL; if(szCdkey) { pAcc = GetGame().GetEntityManager()->FindAccount(szCdkey); if(pAcc) { if(pAcc->GetPlayerState() != PLAYER_STATE_VOID) pAcc->SetPlayerState(PLAYER_STATE_BACKTOLOGIN); pAcc->SetCurGamedPlayerGuid(NULL_GUID); pAcc->SetLoginTimeoutValue(timeGetTime()); } } GetGame().GetEntityManager()->CreateSavePlayerDataSession(PlayerGuid, SAVE_DETAIL_ALL); GetGame().GetEntityManager()->CreateSaveLoginPlayerDataSession(PlayerGuid); } } GetGame().OnPlayerQuit(pPlayer, pMsg->GetGSID(), dwServerKey); } break; default: { char szGuid[128]; PlayerGuid.tostring(szGuid); // _snprintf(pszLogingInfo,512,"玩家[%s]退出时异常,退出标志[%d],请检查代码逻辑!",szGuid, lFlag); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Warn(ROOT_MODULE,"玩家[%s]退出时异常,退出标志[%d],请检查代码逻辑!",szGuid, lFlag); CPlayer* pPlayer = GetGame().GetMapPlayer(PlayerGuid); if(pPlayer) { Account* pAcc = GetGame().GetEntityManager()->FindAccount(pPlayer->GetAccount()); if(pAcc) { if(pAcc->GetPlayerState() != PLAYER_STATE_VOID) pAcc->SetPlayerState(PLAYER_STATE_BACKTOLOGIN); pAcc->SetCurGamedPlayerGuid(NULL_GUID); pAcc->SetLoginTimeoutValue(timeGetTime()); } GetGame().OnPlayerQuit(pPlayer, pMsg->GetGSID(), dwServerKey); } } break; } } break; case MSG_L2W_LOG_FCM_TIME: { char szCdkey[128]; pMsg->GetStr(szCdkey, 1228); long lTime = pMsg->GetLong(); if(szCdkey) { Account* pAcc = GetGame().GetEntityManager()->FindAccount(szCdkey); if(pAcc) { CPlayer* pPlayer = GetGame().GetMapPlayer(pAcc->GetCurGamedPlayerGuid()); if(pPlayer) { CMessage msg(MSG_W2S_LOG_FCM_TIME); msg.Add(pPlayer->GetExID()); msg.Add(lTime); msg.SendToSocket(pPlayer->GetGsSocket()); } } } } break; case MSG_L2W_LOG_FCM_BEGIN: { char szCdkey[128]; pMsg->GetStr(szCdkey, 1228); if(szCdkey) { Account* pAcc = GetGame().GetEntityManager()->FindAccount(szCdkey); if(pAcc) { CPlayer* pPlayer = GetGame().GetMapPlayer(pAcc->GetCurGamedPlayerGuid()); if(pPlayer) { CMessage msg(MSG_W2S_OTHER_KICKPLAYER); msg.Add((BYTE)FCM_KICK_PLAYER); msg.Add(pPlayer->GetExID()); msg.SendToSocket(pPlayer->GetGsSocket()); } } } } break; case MSG_L2W_LOG_KICKPLAYER://根据CDKEY踢出一个玩家 { char strCDKey[256]; pMsg->GetStr(strCDKey,256); Account* pAcc = GetGame().GetEntityManager()->FindAccount(strCDKey); if(pAcc && pAcc->GetPlayerState() != PLAYER_STATE_ENTERED_GAME) { pAcc->SetPlayerState(PLAYER_STATE_BACKTOLOGIN); pAcc->SetLoginTimeoutValue(timeGetTime()); } } break; case MSG_L2W_LOG_REPEAT_LOGIN: { char strCDKey[256]; pMsg->GetStr( strCDKey, 256 ); // 看该帐号是否有角色在游戏中 Account* tLoginInfo = GetGame().GetEntityManager()->FindAccount(strCDKey); if(tLoginInfo) { if(tLoginInfo->GetEntityGroupMap().size()) { CGUID CurGamedPlayerGuid = tLoginInfo->GetCurGamedPlayerGuid(); if( CurGamedPlayerGuid != NULL_GUID) { CPlayer* pPlayer = GetGame().GetMapPlayer(CurGamedPlayerGuid); if(pPlayer) { long gsid = GetGame().GetGlobalRgnManager()->FindGSIDByRgnID(pPlayer->GetRegionExID()); if(gsid != -1) { CMessage msg( MSG_W2S_LOG_REPEAT_LOGIN ); msg.Add( CurGamedPlayerGuid ); msg.SendToGS(gsid); } else { tLoginInfo->SetPlayerState(PLAYER_STATE_BACKTOLOGIN); CMessage msg(MSG_W2L_LOG_PLAYERQUIT); msg.Add(strCDKey); msg.Add(0L); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver } // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_12"), strCDKey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_12", strCDKey)); return; } } } } CMessage msg(MSG_W2L_LOG_PLAYERQUIT); msg.Add(strCDKey); msg.Add(0L); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver } break; case MSG_L2W_LOG_DELETEROLE://loginserver请求删除一个角色 { CGUID guid; DWORD dwIP; char szIP[64]; char cdkey[ACCOUNT_SIZE]; pMsg->GetStr(cdkey,ACCOUNT_SIZE); //cdkey pMsg->GetGUID(guid); //playerid dwIP = pMsg->GetDWord(); char szGUID[128]; guid.tostring(szGUID); CEntityGroup* lPlayer = NULL;//GetGame().GetEntityManager()->FindLoginPlayer(guid); Account* tLoginInfo = GetGame().GetEntityManager()->FindAccount(cdkey); if(!tLoginInfo) { // _snprintf(pszLogingInfo,512,"DeleteRole::未先创建账号对象[%s]!", cdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Warn(ROOT_MODULE,"DeleteRole::未先创建账号对象[%s]!", cdkey); CMessage msg(MSG_W2L_LOG_DELETEROLE); msg.Add((char)LOGIN_DELETEROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver return; } lPlayer = tLoginInfo->FindLoginPlayer(guid); if(NULL == lPlayer) { CMessage msg(MSG_W2L_LOG_DELETEROLE); msg.Add((char)LOGIN_DELETEROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_14"), cdkey, szGUID); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_14", cdkey, szGUID)); return; } if( tLoginInfo->GetPlayerState() != PLAYER_STATE_LOADED_BASE_DATA ) { CMessage msg(MSG_W2L_LOG_DELETEROLE); msg.Add((char)LOGIN_DELETEROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_15"), // tLoginInfo->GetPlayerState(), cdkey, szGUID); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_15",tLoginInfo->GetPlayerState(), cdkey, szGUID)); return; } sprintf(szIP, "%d.%d.%d.%d", LOBYTE(LOWORD(dwIP)), HIBYTE(LOWORD(dwIP)), LOBYTE(HIWORD(dwIP)), HIBYTE(HIWORD(dwIP))); time_t tDelDate; // 删除日期 time(&tDelDate); // 当前日期的DWORD //! 联系人系统 LinkmanSystem::GetInstance().OnPlayerDelStateChange(guid, TRUE); //删除玩家所在的帮会组织 int nResult = GetOrganiCtrl()->OnDeleteRole(guid); //拥有主城 if( nResult == 1 ) { CMessage msg(MSG_W2L_LOG_DELETEROLE); msg.Add((char)LOGIN_DELETEROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.Add((long)1); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver return; } //退出同盟 else if( nResult == 2 ) { CMessage msg(MSG_W2L_LOG_DELETEROLE); msg.Add((char)LOGIN_DELETEROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.Add((long)2); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver return; } //解散同盟 else if(nResult == 3) { CMessage msg(MSG_W2L_LOG_DELETEROLE); msg.Add((char)LOGIN_DELETEROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.Add((long)3); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver return; } // 以下数据加入MSG发送给DBS GetGame().GetEntityManager()->CreateUpdateLoginPlayerDelTimeSession(cdkey, guid); char szGuid[40] = {0}; guid.tostring(szGuid); // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_16"), szGuid); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_16", szGuid)); return; } break; case MSG_L2W_LOG_RESTOREROLE: { CGUID guid; char cdkey[ACCOUNT_SIZE]; pMsg->GetStr(cdkey,ACCOUNT_SIZE); //cdkey pMsg->GetGUID(guid); //playerid char szGUID[128]; guid.tostring(szGUID); CEntityGroup* lPlayer = NULL;//GetGame().GetEntityManager()->FindLoginPlayer(guid); Account* tLoginInfo = GetGame().GetEntityManager()->FindAccount(cdkey); if(!tLoginInfo) { // _snprintf(pszLogingInfo,512,"RestoreRole::未先创建账号对象[%s]!", cdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Warn(ROOT_MODULE,"RestoreRole::未先创建账号对象[%s]!", cdkey); CMessage msg(MSG_W2L_LOG_RESTOREROLE); msg.Add((char)LOGIN_RESTOREROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver return; } lPlayer = tLoginInfo->FindLoginPlayer(guid); if(NULL == lPlayer) { CMessage msg(MSG_W2L_LOG_RESTOREROLE); msg.Add((char)LOGIN_RESTOREROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_17"), cdkey, szGUID); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_17", cdkey, szGUID)); return; } if(tLoginInfo->GetPlayerState() != PLAYER_STATE_LOADED_BASE_DATA) { CMessage msg(MSG_W2L_LOG_RESTOREROLE); msg.Add((char)LOGIN_RESTOREROLE_FAILED); msg.Add(guid); msg.Add(cdkey); msg.SendToServer(NF_LOGIN_SERVER);//send to loginserver // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_18"), // tLoginInfo->GetPlayerState(), cdkey, szGUID); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_18", tLoginInfo->GetPlayerState(), cdkey, szGUID)); return; } //! 联系人系统 LinkmanSystem::GetInstance().OnPlayerDelStateChange(guid, TRUE); // 以下数据加入MSG发送给DBS GetGame().GetEntityManager()->CreateRestoreLoginPlayerDelTimeSession(cdkey, guid); } break; case MSG_L2W_LOG_CREATEROLE://loginserver请求创建一个角色 { char szName[50],szCdkey[ACCOUNT_SIZE]; pMsg->GetStr(szName,50); char nOccupation = pMsg->GetChar(); char nSex = pMsg->GetChar(); BYTE nHead = pMsg->GetByte(); BYTE nFace = pMsg->GetByte(); BYTE btCountry = pMsg->GetByte(); BYTE byConstellation = pMsg->GetByte(); //是否选择了推荐的国家 BYTE bySelectRecommCountry = pMsg->GetByte(); bool bSelectRecommCountry = (bySelectRecommCountry==0?false:true); BYTE btMaxCharactersNum = (BYTE)GlobalSetup::GetSetup()->btMaxCharactersNum; pMsg->GetStr(szCdkey,ACCOUNT_SIZE); if(szName[0] == '\0') // 名字为空 { CMessage msg(MSG_W2L_LOG_CREATEROLE); msg.Add((BYTE)LOGIN_CREATEROLE_NAMEINVALID); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } // 结合创建列表和数据库,检测角色是否被建满。 // 检测职业和性别是否符合条件 GlobalSetup::GetSetup()->btMaxCharactersNum; bool bValid = false; //判断职业是否合法 if(nOccupation < 0 || nOccupation >= OCC_Max) return; //判断性别是否合法 if( nSex < 0 || nSex >= PlayerList::SEX_NUMS) return; //判断星座 if(byConstellation < CONST_Aries || byConstellation > CONST_Pisces) return; // 检测国家 bValid = false; if( !GetCountryHandler()->GetCountry(btCountry) ) { CMessage msg(MSG_W2L_LOG_CREATEROLE); msg.Add((BYTE)LOGIN_CREATEROLE_DBERROR); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_19"),btCountry); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_19",btCountry)); return; } // 检测名字是否存在 string strName(szName); if (!CWordsFilter::GetInstance()->Check(strName)) { CMessage msg(MSG_W2L_LOG_CREATEROLE); msg.Add((BYTE)LOGIN_CREATEROLE_NAMEINVALID); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } // 角色名也被使用(先list和MapPlayer 最后DBS) if( GetGame().IsNameExistInMapPlayer(szName) ) { CMessage msg(MSG_W2L_LOG_CREATEROLE); msg.Add((BYTE)LOGIN_CREATEROLE_NAMEEXIST); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } // 再检查一次是否已有该玩家的创建请求(通过LoginPlayer查找) Account* tLoginInfo = GetGame().GetEntityManager()->FindAccount(szCdkey); if(!tLoginInfo) { // _snprintf(pszLogingInfo,512,"MSG_W2L_LOG_CREATEROLE! LoginInfo[%s] Is Null!", szCdkey); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,"MSG_W2L_LOG_CREATEROLE! LoginInfo[%s] Is Null!", szCdkey); CMessage msg(MSG_W2L_LOG_CREATEROLE); msg.Add((BYTE)LOGIN_CREATEROLE_FAILED); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } if(tLoginInfo->GetPlayerState() == PLAYER_STATE_CREATING) return; // 再到DB对象中查找一次 Account* pAcc = NULL; CEntityManager::AccountMapItr accItr = GetGame().GetEntityManager()->GetAccountMap().begin(); for(; accItr != GetGame().GetEntityManager()->GetAccountMap().end(); accItr++) { pAcc = accItr->second; if(pAcc->GetEntityGroupMap().size() == 1) { CEntityGroup* pLoginPlayerGroup = (CEntityGroup*)pAcc->GetEntityGroupMap().begin()->second; map<CGUID, CBaseEntity*>::iterator setItr; for(setItr=pLoginPlayerGroup->GetEntityGroupMap().begin(); setItr!=pLoginPlayerGroup->GetEntityGroupMap().end(); setItr++) { const char* szEPName = setItr->second->GetStringAttr(string("Name")); if(szEPName) { if(strcmp(szName, szEPName) == 0) { // 找到该玩家的LoginPlayer对象 丢弃该创建消息 CMessage msg(MSG_W2L_LOG_CREATEROLE); msg.Add((BYTE)LOGIN_CREATEROLE_NAMEEXIST); msg.Add(szCdkey); msg.SendToServer(NF_LOGIN_SERVER); return; } } } } } // 创建一个创建玩家会话 GetGame().GetEntityManager()->CreatePlayerCreateSession(szCdkey, szName, nOccupation, nSex, nHead, nFace, btCountry, btMaxCharactersNum,byConstellation,bSelectRecommCountry); // _snprintf(pszLogingInfo,512,AppFrame::GetText("WS_LOGMESSAGE_20"), szName); // PutStringToFile("Login_WS_Info",pszLogingInfo); Log4c::Trace(ROOT_MODULE,FormatText("WS_LOGMESSAGE_20", szName)); } break; } }