//处理战斗事件 CT_VOID CCCityEvent::DisposeFightEventAward(CCUser* pUser, const CMD_G_ApplyAwardEvent& awardEvent) { if (!pUser->m_userEvent.FindFightEvent(awardEvent.iIndex)) { DisposeEventTimeOut(pUser, awardEvent); CCLogMeg::getSingleton().WriteError("CCCityEvent::DisposeFightEventAward, 没有这个战斗事件 = %i", awardEvent.iIndex); return ; } if (pUser->m_userEvent.FindFightEvent(awardEvent.iIndex)) { MSC_Fighting_Info FightingInfo={0}; FightingInfo.dwUserID=awardEvent.dwUserID; FightingInfo.iWorldSceneID=awardEvent.iAwardID; FightingInfo.iSceneID=awardEvent.iIndex; FightingInfo.iSeed=rand()%RAND_MAX_EX; G_GetFightingData(pUser,FightingInfo.FightingData); pUser->m_userArmy.DeleteBoss(); CT_DWORD threadid = GAME_THREAD_FIGHT + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadFightNum; G_SendThreadInfo(threadid, MSC_MAIN_FIGHTING_EVENT, MSC_SUB_EVENT_FIGHTING, (CT_CHAR*)&FightingInfo, sizeof(FightingInfo)); //add by caihan //完成事件,增加事件任务判断 CMD_G_TaskEventInfo taskEventInfo = {0}; taskEventInfo.iTaskMainType = TASK_MAIN_TYPE_CITY; taskEventInfo.iTaskSubType = TASK_SUB_TYPE_CITY_EVENT; taskEventInfo.iSubType = awardEvent.et; pUser->m_userTask.DisposeTask(taskEventInfo); //end } }
CT_VOID CCCityEvent::OnClock(CT_DWORD timeID) { if(timeID == IDI_UPDATA_DATA) { //先刷新内存在更新数据库 //更新副本 CCUserManager::getSingleton().RefreshDuplicate(); //更新竞技场 CCUserManager::getSingleton().RefreshPVP(); //更新钻石祭祀次数 CCUserManager::getSingleton().RefreshWorship(); //更新战队排行 CCFightTeamManager::getSingleton().RefreshFightTeamTop(); //更新组队副本 CCUserManager::getSingleton().UpdataTeamFightingTimes(); //更新元素之塔 CCTowerResManager::getSingleton().UpdateSlotProduct(CT_TRUE); //更新元素塔通关数据 CCUserManager::getSingleton().RefreshTowerPass(); //清理战队召唤 CCFightTeamManager::getSingleton().ClearFightTeamSummon(); //更新体力购买次数 CCUserManager::getSingleton().UpdataBuyStaminaTimes(); //更新龙珠活动状态 CCUserManager::getSingleton().UpdataDragonBallStatus(); //更新探访信息 CCUserManager::getSingleton().UpdateSeekData(); //更新排行榜奖励状态 CCUserManager::getSingleton().UpdateTopReward(); G_SendThreadInfo(GAME_THREAD_DATABASE,MSC_MAIN_DB_UPDATEDATA,MSC_SUB_DB_UPDATA_DATA,0,0); } }
CT_VOID CCDBFriendEvent::DisposeFriendFind(CT_CHAR* pBuf,CT_DWORD len) { if(len != sizeof(CMD_G_Friend_ARG)) { CCLogMeg::getSingleton().WriteError("CCDBFriendEvent::DisposeFriendFind : len != sizeof(CMD_G_Friend_ARG)"); return; } CMD_G_Friend_ARG *pFriendARG=(CMD_G_Friend_ARG*)pBuf; m_dbConnector.Reset(); m_dbConnector.SetPcName("SP_GetUIDByName"); m_dbConnector.AddParm("_nickname", pFriendARG->cF_NickName); if(m_dbConnector.Exec()) { CCDBResult* pResult = m_dbConnector.GetResult(); if (pResult->GetResult()) { if (pResult->MoveNextRow()) { pResult->GetValue(0, pFriendARG->dwF_UID); } } pResult->Release(); }else { G_DBError(m_dbConnector, m_dwThread); CCDBLogMes::getSingleton().WriteInfo(0, "SP_GetUIDByName", "cNickName:%s", pFriendARG->cF_NickName ); } CT_DWORD threadid = GAME_THREAD_CITY + pFriendARG->dwUserID % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(threadid,MSC_MAIN_FRIEND_EVENT_DATA,MSC_SUB_DB_FRIEND_FIND,pBuf,sizeof(CMD_G_Friend_ARG)); }
//保存战报 CT_VOID CCUserPVPInfo::SaveFightingReacord() { if(m_PVPRecord[0].dwUserID == 0)return; CT_CHAR cBuf[MAX_BUFFER]={0}; CT_UCHAR ucIndex[PVPRECORD_INDEX]={0}; MSC_PVP_Fighting_Info FightingData={0}; MSC_DB_W_PVPFightingInfo FightingRecord={0}; if(MAX_BUFFER <= sizeof(ucIndex)+sizeof(FightingData)+sizeof(FightingRecord)) { CCLogMeg::getSingleton().WriteError("CCUserPVPInfo::SaveFightingReacord MAX_BUFFER <= sizeof(ucIndex)+sizeof(FightingData)+sizeof(FightingRecord)"); return; } sprintf((CT_CHAR*)ucIndex, "%d%d%d",m_RecordFightData[0].FightingData[0].dwUserID,m_RecordFightData[0].FightingData[1].dwUserID,time(0)); CCMD5::getSingleton().Encrypt(ucIndex,sizeof(ucIndex)-1,ucIndex,sizeof(ucIndex)-1); memcpy(&FightingData,&m_RecordFightData[0],sizeof(FightingData)); memcpy(&FightingRecord.PVPFightinginfo,&m_PVPRecord[0],sizeof(m_PVPRecord[0])); memcpy(cBuf,ucIndex,sizeof(ucIndex)); memcpy(cBuf+sizeof(ucIndex),&FightingData,sizeof(FightingData)); memcpy(cBuf+sizeof(FightingData)+sizeof(ucIndex),&FightingRecord,sizeof(FightingRecord)); CT_DWORD threadid = GAME_THREAD_DATABASE + m_pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadDataBaseNum; G_SendThreadInfo(threadid,MSC_MAIN_DB_PVP_DATA,MSC_SUB_DB_FIGHTING_END,cBuf,sizeof(MSC_PVP_Fighting_Info)+sizeof(MSC_DB_W_PVPFightingInfo)+sizeof(ucIndex)); return; }
//清退所有用户 CT_VOID CCUserManager::ExitAllUser() { _AUTOMUTEX(&m_mutex); UDM_IT it = m_userDataMap.begin(); UDM_IT endIT = m_userDataMap.end(); for (; it!=endIT; ++it) { (*it).second->GetNetInterface()->Send(MAIN_G_ENTER_ENV,SUB_G_FORCE_EXIT); CMD_G_LeaveGame LeaveGame= {0}; LeaveGame.dwUserID= (*it).second->GetUserID(); CT_DWORD dwThreadID=GAME_THREAD_CITY+(LeaveGame.dwUserID%((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum); G_SendThreadInfo(dwThreadID,MSC_MAIN_USER_EXIT,0,(CT_CHAR*)&LeaveGame,sizeof(LeaveGame)); } G_SendThreadInfo(GAME_THREAD_CITY, MSC_MAIN_RES_OCCUPY, MSC_SUB_SYS_EXIT, 0, 0); G_SendThreadInfo(GAME_THREAD_DATABASE, MSC_MAIN_DB_TOWER_DATA, MSC_SUB_DB_SYS_EXIT, 0, 0); }
CT_VOID CCUserManager::GetOnlineUserNum() { _AUTOMUTEX(&m_mutex); CT_DWORD threadid = 0; CT_INT32 iUserNum = 0; threadid = GAME_THREAD_LOGDATABASE ; iUserNum = m_userDataMap.size(); G_SendThreadInfo(threadid,MSC_MAIN_LOGDB_DATA,MSC_SUB_LOGDB_ONLINEUSER,(CT_CHAR*)&iUserNum,sizeof(CT_INT32)); }
//设置竞技度 CT_INT32 CCUserPVPInfo::SetPVPDegree(const CT_INT32 iDegree,CT_BOOL bSend) { _AUTOMUTEX(m_pMutex); G_ValueRange Degree={0}; if(!G_GetValueRange(VALUE_TYPE_PVPDEGREEMAX,&Degree)) { CCLogMeg::getSingleton().WriteError("CCUserPVPInfo::SetPVPDegree G_GetValueRange VALUE_TYPE_PVPDEGREEMAX"); return 0; } if(iDegree == -1) { m_PVPInfo.iPVPDegree=0; m_PVPInfo.cbChestStatus=CHEST_STATUS_CLOSE; } else { m_PVPInfo.iPVPDegree+=iDegree; if(Degree.fMinVal <= m_PVPInfo.iPVPDegree) { m_PVPInfo.iPVPDegree=(CT_INT32)Degree.fMinVal; m_PVPInfo.cbChestStatus=CHEST_STATUS_OPEN; } } if(bSend) { G_ValueRange vr={0}; if(!G_GetValueRange(VALUE_TYPE_PVPCHEST,&vr)) { CCLogMeg::getSingleton().WriteError("CCUserPVPInfo::GetPVPInfo G_GetValueRange VALUE_TYPE_PVPCHEST"); } CMD_G_PVPDegree PVPDegree={0}; PVPDegree.dwUserID=m_pUser->GetUserID(); PVPDegree.iPVPDegree=m_PVPInfo.iPVPDegree; PVPDegree.iDiamod=G_GetPVPChestDiamod(PVPDegree.iPVPDegree,vr.fMinVal); m_pUser->GetNetInterface()->Send(MAIN_G_PVP_EVENT,SUB_G_PVP_DEGREE,(CT_CHAR*)&PVPDegree,sizeof(PVPDegree)); //更新数据库 MSC_DB_W_PVPInfo DBPVPinfo={0}; DBPVPinfo.dwUserID=m_pUser->GetUserID(); DBPVPinfo.iFightingCount=m_PVPInfo.iFightingCount; DBPVPinfo.lRefreshTime=m_PVPInfo.lRefreshTime; DBPVPinfo.cbChestStatus=m_PVPInfo.cbChestStatus; DBPVPinfo.iPVPDegree=m_PVPInfo.iPVPDegree; DBPVPinfo.iPVPChestNum=m_PVPInfo.iPVPChestNum; CT_DWORD threadid = GAME_THREAD_DATABASE + m_pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadDataBaseNum; G_SendThreadInfo(threadid,MSC_MAIN_DB_PVP_DATA,MSC_SUB_DB_R_PVP_INFO,(CT_CHAR*)&DBPVPinfo,sizeof(DBPVPinfo)); } return m_PVPInfo.iPVPDegree; }
//用户定时器处理 CT_VOID CCCityEvent::OnTime(CT_DWORD timeID) { if (timeID == IDI_EVENT_TIMER) { CCUserManager::getSingleton().UpdateEvent(m_dwThread - GAME_THREAD_CITY, ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum ); } else if (timeID == IDI_ANNOUNCEMENT_UPDATA) { G_SendThreadInfo(GAME_THREAD_DATABASE,MSC_MAIN_DB_ANNOUNCEMENT, 0, 0, 0); } }
//网络连接进入 CT_VOID CCEnvThread::OnNetEventOpen(CCNetInterface* pNetHandle) { //((CCServerEvent*)m_pServerEvent)->OnNetEventOpen(pNetHandle); if (g_pPChargeServer == pNetHandle) { G_SendThreadInfo(GAME_THREAD_CITY, MSC_MAIN_MASTER,MSC_SUB_CHARGE_RESEND, 0, 0); } else if(g_pCorssServer == pNetHandle) { CMD_CS_RegisterServer rs={0}; rs.iGSID=((CCGameConfig&)CCConfig::getSingleton()).m_iGSID; rs.dwPort=((CCGameConfig&)CCConfig::getSingleton()).m_dwCSPort; memcpy(rs.cIP,((CCGameConfig&)CCConfig::getSingleton()).m_strCSIP.c_str(),IPAddrEx); g_pCorssServer->Send(MAIN_CS_GAME,SUB_CS_REGISTER_SERVER,(CT_CHAR*)&rs,sizeof(rs)); } }
//打开界面时,获得不在线好友信息 CT_VOID CCDBFriendEvent::DisposeFriendGetTitle(CT_CHAR* pBuf, CT_DWORD len) { if (len != sizeof(CMD_G_FriendDataLine)) { CCLogMeg::getSingleton().WriteError("CCDBFriendEvent::DisposeFriendGetInfo len != sizeof(CMD_G_FriendData)"); return ; } CMD_G_FriendDataLine* pFriendData = (CMD_G_FriendDataLine*)pBuf; m_dbConnector.Reset(); m_dbConnector.SetPcName("SP_GetTitle"); m_dbConnector.AddParm("_uid", pFriendData->dwF_UID); if(m_dbConnector.Exec()) { CCDBResult* pResult = m_dbConnector.GetResult(); if (pResult->GetResult()) { CT_INT32 iCurrent = time(0); while (pResult->MoveNextRow()) { CT_INT32 iTitleID = 0; CT_INT32 iStatus = 0; CT_INT32 iActiveTime = 0; CT_INT32 iEffectTime = 0; pResult->GetValue(0, iTitleID); pResult->GetValue(1, iStatus); if (iStatus == 2) { pFriendData->iTitleID = iTitleID; break; } } } pResult->Release(); }else { G_DBError(m_dbConnector, m_dwThread); CCDBLogMes::getSingleton().WriteInfo(0, "SP_GetTitle", "uid:%d", pFriendData->dwUserID ); } CT_DWORD threadid = GAME_THREAD_CITY + pFriendData->dwUserID % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(threadid,MSC_MAIN_FRIEND_EVENT_DATA,MSC_SUB_FRIEND_SEND_UNLINK,(CT_CHAR*)pFriendData,sizeof(CMD_G_FriendDataLine)); }
CT_VOID CCDBFriendEvent::DisposeFriendFindBlack(CT_CHAR* pBuf,CT_DWORD len) { if(len != sizeof(CMD_G_Friend_ARG)) { CCLogMeg::getSingleton().WriteError("CCDBFriendEvent::DisposeFriendFindBlack : len != sizeof(CMD_G_Friend_ARG)"); return; } CMD_G_Friend_ARG *pFriendARG=(CMD_G_Friend_ARG*)pBuf; CMD_G_FriendData friendData = {0}; friendData.dwUserID = pFriendARG->dwUserID; memcpy(friendData.cF_NickName, pFriendARG->cF_NickName, NAME_SIZE); friendData.iF_Status = 0; m_dbConnector.Reset(); m_dbConnector.SetPcName("SP_GetUIDByName"); m_dbConnector.AddParm("_nickname", pFriendARG->cF_NickName); if(m_dbConnector.Exec()) { CCDBResult* pResult = m_dbConnector.GetResult(); if (pResult->GetResult()) { if (pResult->MoveNextRow()) { pResult->GetValue(0, friendData.dwF_UID ); pResult->GetValue(1, friendData.iF_Grade); pResult->GetValue(2, friendData.iF_Occupation); pResult->GetValue(5, friendData.iTitleID); } } pResult->Release(); }else { G_DBError(m_dbConnector, m_dwThread); CCDBLogMes::getSingleton().WriteInfo(0, "SP_GetUIDByName", "cNickName:%s", pFriendARG->cF_NickName ); } CT_DWORD threadid = GAME_THREAD_CITY + pFriendARG->dwUserID % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(threadid,MSC_MAIN_FRIEND_EVENT_DATA,MSC_SUB_DB_FRIEND_FIND_BLACK,(CT_CHAR*)&friendData,sizeof(CMD_G_FriendData)); }
CT_VOID CCUserEnterEvent::UserEnter(CMD_G_EnterGame* pGeg, CCNetInterface* pNetHandle) { CCUser* pUser = CCUserManager::getSingleton().GetOneFreeUser(pGeg->dwUserID, pNetHandle); if (pUser == 0) { CCLogMeg::getSingleton().WriteInfo(" CCEnvThread::UserEnter: Fail to Apply user, id=%i", pGeg->dwUserID); pNetHandle->Close(); return ; } UserEnterInfo UserEnterinfo={0}; if(CCUserEnterManager::getSingleton().Find(pGeg->dwUserID,UserEnterinfo)) { pUser->SetTalk(UserEnterinfo.bTalk); } //正常登录 MSC_DB_UserEnter ue = {0}; ue.dwUserID = pGeg->dwUserID; ue.pNetInterface = pNetHandle; CT_DWORD threadid = GAME_THREAD_CITY + pGeg->dwUserID % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; ue.dwThreadID = threadid; CT_DWORD dbThreadID = GAME_THREAD_DATABASE + pGeg->dwUserID % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadDataBaseNum; G_SendThreadInfo(dbThreadID, MSC_MAIN_DB_LOGIN, MSC_SUB_DB_USRE_ENTER, (CT_CHAR*)&ue, sizeof(ue) ); }
//科技升级 CT_INT32 CCUserFightTeamNember::ScienceUpGrade(CT_INT32 iScienceID,CT_INT32 iItemCount) { _AUTOMUTEX(m_pMutex); CT_INT32 iGrade=0; ScienceInfoMap::iterator siit=m_DataMap.find(iScienceID); if(siit != m_DataMap.end()) { iGrade=(*siit).second.iScienceGrade; } G_FightTeamBless ftb={0}; if(!G_GetFightTeamBless(iScienceID,&ftb)) { CCLogMeg::getSingleton().WriteError("CCUserFightTeamNember::ScienceUpGrade iScienceID:%d",iScienceID); return FT_DATA_ERROR; } G_BlessUpgrade bug={0}; if(!G_GetBlessUpgrade(ftb.iUpGradeRule,iGrade+1,&bug)) { CCLogMeg::getSingleton().WriteError("CCUserFightTeamNember::ScienceUpGrade UpGradeRule:%d iScienceGrade:%d",ftb.iUpGradeRule,iGrade+1); return FT_DATA_ERROR; } if(iItemCount != 0) { //CT_DWORD threadid = GAME_THREAD_CITY + m_pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; //if(!m_pUser->m_userItem.AutoAddItemData(threadid,iGoods,iItemCount,1,ITEM_OP_MODE_CHECK)) //{ // return FT_NO_ITEM; //} } if(bug.fSuccessPer*100 /*+道具几率*/ >= rand()%100) { if(siit == m_DataMap.end()) { NemberScience ns={0}; ns.dwUserID=m_pUser->GetUserID(); ns.iScienceGrade=1; ns.iScienceID=iScienceID; m_DataMap.insert(ScienceInfoMap::value_type(ns.iScienceID,ns)); } else { (*siit).second.iScienceGrade+=1; } if (ftb.iAdditionType == FT_SCIENCE_FIGHTING && ftb.iAdditionObj < UNIT_ALL_ARMY) { m_pUser->UpdateAndSendMasterData(EMI_BATLLE); } MSC_DB_FightTeamScienceUpGrade ftsug={0}; ftsug.dwUserID=m_pUser->GetUserID(); ftsug.iScienceID=iScienceID; ftsug.iGrade=(siit != m_DataMap.end()?(*siit).second.iScienceGrade:1); CT_DWORD threadID = GAME_THREAD_DATABASE + ftsug.dwUserID % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadDataBaseNum; G_SendThreadInfo(threadID,MSC_MAIN_DB_FIGHTTEAM_DATA,MSC_SUB_DB_FIGHTTEAM_SCIENCE_UPGRADE,(CT_CHAR*)&ftsug,sizeof(ftsug)); //科技升级,判断指定科技升级任务 CMD_G_TaskSystemInfo taskSysInfo = {0}; taskSysInfo.iTaskMainType = TASK_MAIN_TYPE_SYS; taskSysInfo.iTaskSubType = TASK_SUB_TYPE_SYSTEM_SCIENCE_UP; taskSysInfo.arrayParam[0] = ftb.iAdditionType; //参数0:0不限定类型,1建筑,2战斗 taskSysInfo.arrayParam[1] = ftb.iAdditionObj; //参数1:建筑id/角色id taskSysInfo.arrayParam[2] = ftb.iAttrID; //参数2:战斗属性id(建筑不用) if (siit == m_DataMap.end()) { taskSysInfo.iProgress = 1; //刚开启旗帜时,等级为1 } else { taskSysInfo.iProgress = (*siit).second.iScienceGrade; } m_pUser->m_userTask.DisposeTask(taskSysInfo); return FT_SCIENCE_UP_GRADE_SUC; } return FT_SCIENCE_UP_GRADE_FAIL; }
//处理建造完成 CT_VOID CCCityUserBuildEvent::DisposeDBBuildingFinish(const MSC_DB_R_BuildUpgradeFinish& buildUpgradeFinish) { CCUser* pUser = 0; if(CCUserManager::getSingleton().Find(buildUpgradeFinish.dwUserID, &pUser)) { BuildingData buildData = {0}; buildData.iID = buildUpgradeFinish.iBID; buildData.iGrade = buildUpgradeFinish.iGrade; buildData.bChange= CT_TRUE; pUser->m_userBuilding.UpateBuildData(buildData); pUser->m_userBuilding.DeleteUpagradeBuildData(buildUpgradeFinish.iBID); pUser->CalMaxWorker(); //重新计算最大工人数目 pUser->CountFreeWorker(); MasterVariableData md = {0}; pUser->m_userBase.GetMasterData(md); //获取领主信息 CMD_G_UpgradeBuildingFinish uf; memset(&uf, 0, sizeof(uf)); uf.dwUserID = buildUpgradeFinish.dwUserID; uf.iBID = buildUpgradeFinish.iBID; uf.iGrade = buildUpgradeFinish.iGrade; uf.iMaxWorker = md.stRes.iMaxWorker; uf.iWorker = md.stRes.iWorker; G_BuildingType buildingType = {0}; CCBuildingScriptSetting::getSingleton().GetBuildTypeWithID(uf.iBID,&buildingType); //升级完成,获得文明度和领主经验 G_BuildingUpgrade buildUpgrade = {0}; if (!G_GetBuildingUpgradeData(buildingType.iID,buildUpgradeFinish.iGrade, &buildUpgrade)) { CCLogMeg::getSingleton().WriteError("CCCityUserBuildEvent::DisposeDBBuildingFinish G_GetBuildingUpgradeData %d",buildingType.iID); SendBuildError(pUser, MAIN_G_APPLY_UPGRADE_CITY, SUB_G_APPLY_UPGRADE_BUILD_FAIL, CBF_DATA_FAIL); return ; } MasterVariableData mvd = {0}; MasterData masterData = {0}; pUser->m_userBase.GetMasterData(masterData); mvd.stGrade.iCurrentExp = G_GetBuildUpgradeMasterXp(buildUpgrade.iXp,masterData.factor.fProductFactor); mvd.stCivili.iCurrentExp = buildUpgrade.iCiliviNum; pUser->m_userBase.AddMastData(mvd,SAVETAG_BUILD_UPGRADE_FINISH); //end memset(&mvd,0,sizeof(mvd)); pUser->m_userBase.GetMasterData(mvd); uf.iCivil = mvd.stCivili.iCurrentExp; uf.iXP = mvd.stGrade.iCurrentExp; pUser->GetNetInterface()->Send(MAIN_G_APPLY_UPGRADE_CITY,SUB_G_UPGRADE_BUILD_FINISH, (CT_CHAR*)&uf, sizeof(uf)); pUser->m_userBuilding.UpdateSaveBuildingData(CT_TRUE, CT_FALSE, CT_TRUE); //强制同步一次建筑数据到数据库,防止钻石加速数据被合并,这样的实现比较简单,但是效率低 //升级成功(升级完成),增加升级任务判断 //add by caihan 11-14 CMD_G_TaskEventInfo taskEventInfo = {0}; taskEventInfo.iTaskMainType = TASK_MAIN_TYPE_UPGRADE; taskEventInfo.iTaskSubType = TASK_SUB_TYPE_UPGRADE_BUILD; taskEventInfo.iSubType = buildUpgradeFinish.iBID; taskEventInfo.iLevel = uf.iGrade; pUser->m_userTask.DisposeTask(taskEventInfo); //增加指定类型建筑升级任务判断 CMD_G_TaskSystemInfo taskSysInfo = {0}; taskSysInfo.iTaskMainType = TASK_MAIN_TYPE_SYS; taskSysInfo.iTaskSubType = TASK_SUB_TYPE_SYSTEM_BUILD_UPGRADE; taskSysInfo.arrayParam[0] = buildingType.iID; //参数0:建筑类型 taskSysInfo.arrayParam[1] = uf.iBID; //参数1:建筑id taskSysInfo.iProgress = uf.iGrade; pUser->m_userTask.DisposeTask(taskSysInfo); //升级完成,增加城市任务判断 memset(&taskEventInfo,0,sizeof(taskEventInfo)); taskEventInfo.iTaskMainType = TASK_MAIN_TYPE_CITY; taskEventInfo.iTaskSubType = TASK_SUB_TYPE_CITY_BUILD; taskEventInfo.iSubType = buildingType.iID; pUser->m_userTask.DisposeTask(taskEventInfo); //end pUser->m_userDaily.UpdateQuestData(DAILY_BUILDIND_UPGRADE, 1); //建筑完成,如果是集市,推送商店消息 if(uf.iGrade == 1) { G_Building Build={0}; if(!G_GetBuildingData(uf.iBID,&Build)) { CCLogMeg::getSingleton().WriteError("CCCityUserBuildEvent::DisposeDBBuildingFinish G_GetBuildingData %d",uf.iBID); } if (Build.iID == CITY_TYPE_MARKET_BUILDID) { CCMarket::getSingleton().SendNormalMarketInfo(pUser); } else if(Build.iBT == CITY_TYPE_DUPLICATE) { MSC_Duplicate_Finish DuplicateFinish={0}; DuplicateFinish.dwUserID=pUser->GetUserID(); CT_INT32 threadID = GAME_THREAD_CITY + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(threadID, MSC_MAIN_DUPLICATE_EVENT, MSC_SUB_DUPLICATE_FINISH , (CT_CHAR*)&DuplicateFinish, sizeof(DuplicateFinish)); } else if(Build.iBT == CITY_TYPE_ARENA) { MSC_DB_Refresh Refresh={0}; Refresh.dwUserID=pUser->GetUserID(); CT_DWORD threadid = GAME_THREAD_DATABASE + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadDataBaseNum; G_SendThreadInfo(threadid,MSC_MAIN_DB_PVP_DATA,MSC_SUB_DB_W_REFRESH,(CT_CHAR*)&Refresh,sizeof(Refresh)); } else if(Build.iBT == CITY_TYPE_SOLDIER) { pUser->m_userArmy.UpDataOpenArmy(uf.iGrade); } } else if(uf.iGrade > 1) { G_Building Build={0}; if(!G_GetBuildingData(uf.iBID,&Build)) { CCLogMeg::getSingleton().WriteError("CCCityUserBuildEvent::DisposeDBBuildingFinish G_GetBuildingData %d",uf.iBID); } if(Build.iBT == CITY_TYPE_SOLDIER) { pUser->m_userArmy.UpDataOpenArmy(uf.iGrade); } //生产型建筑,升级完成后直接完成最低级生产 G_BuildingType bt = {0}; if(CCBuildingScriptSetting::getSingleton().GetBuildTypeWithID(buildUpgradeFinish.iBID, &bt)) { if (bt.iID == CITY_TYPE_RESIDENTIAL || CITY_TYPE_FARMLAND == bt.iID || CITY_TYPE_PANNING == bt.iID || CITY_TYPE_FOREST == bt.iID || CITY_TYPE_STONEORE == bt.iID || CITY_TYPE_IRONORE == bt.iID || CITY_TYPE_PATCAVE == bt.iID || CITY_TYPE_TAMEDRAGON==bt.iID) { ProductingBuilding bp = {0}; bp.iBid = buildUpgradeFinish.iBID; bp.iType = G_GetLeastProductTypeByBuildType(bt.iID); bp.llTime = time(0); bp.bSendCanHavest = CT_TRUE; bp.iWorker = 0; //民居不在这里处理 //if (buildType == CITY_TYPE_RESIDENTIAL) //{ // bp.iLastingTime = 0 ; //}else //{ // bp.iLastingTime = bpi.iTime; //} G_BuildingProductInfo bpi={0}; if (!CCBuildingScriptSetting::getSingleton().GetProductInfo(bp.iType, &bpi)) { CCLogMeg::getSingleton().WriteError("CCCityUserBuildEvent::DisposeDBBuildingFinish : fail to find producttype in FindProduct: %d",bp.iType ); return ; } bp.iLastingTime = 0; bp.iBType = bt.iID; bp.iBGrade = buildUpgradeFinish.iGrade; if (bt.iID == CITY_TYPE_RESIDENTIAL) { pUser->m_userBuilding.UpdateAutoBuilding(bp.iBid, bp); } else { pUser->m_userBuilding.InsertBuildingProductMap(bp); } CMD_G_ProductHarvest ch = {0}; MasterVariableData mvd = {0}; ch.dwUserID = pUser->GetUserID(); ch.iBuildID = buildUpgradeFinish.iBID; memset(&mvd,0,sizeof(mvd)); pUser->m_userBase.GetMasterData(mvd); ch.iWorker = mvd.stRes.iWorker; pUser->GetNetInterface()->Send(MAIN_G_BUILDING_EVENT_CITY, SUB_G_BUILDING_PRODUCT_CAN_HARVEST,(CT_CHAR*)&ch, sizeof(ch)); } } } // DisposeAutoBuilding(pUser, buildUpgradeFinish); } }
//处理升级成功 CT_VOID CCCityUserBuildEvent::DisposeDBUpgadeSuc(CCUser* pUser, const UpgradingBuildData& ubd) { MasterVariableData md; memset(&md, 0, sizeof(md)); // [9/11/2012 John] md.stRes.iDiamod += ubd.buildingUpgrade.iDiamond; md.stRes.iFood += ubd.buildingUpgrade.iFood; md.stRes.iGold += ubd.buildingUpgrade.iGold; md.stRes.iWorker += ubd.buildingUpgrade.iWorker; //md.stCivili.iCurrentExp += ubd.buildingUpgrade.iCiliviNum; //md.stGrade.iCurrentExp += ubd.buildingUpgrade.iXp; pUser->m_userBase.AddMastData(md, SAVETAG_BUILD_UPGRADE_FINISH); CT_INT32 iCount=0; CT_DWORD threadid = GAME_THREAD_CITY + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; if(ubd.buildingUpgrade.iProp1 != 0 && ubd.buildingUpgrade.iPropNum1 != 0) { iCount=ubd.buildingUpgrade.iPropNum1; pUser->m_userItem.AutoExpendItem(SAVETAG_BUILD_UPGRADE_FINISH,ubd.buildingUpgrade.iProp1,-iCount,ITEM_OP_MODE_EXEC); } if(ubd.buildingUpgrade.iProp2 != 0 && ubd.buildingUpgrade.iPropNum2 != 0) { iCount=ubd.buildingUpgrade.iPropNum2; pUser->m_userItem.AutoExpendItem(SAVETAG_BUILD_UPGRADE_FINISH,ubd.buildingUpgrade.iProp2,-iCount,ITEM_OP_MODE_EXEC); } if(ubd.buildingUpgrade.iProp3 != 0 && ubd.buildingUpgrade.iPropNum3 != 0) { iCount=ubd.buildingUpgrade.iPropNum3; pUser->m_userItem.AutoExpendItem(SAVETAG_BUILD_UPGRADE_FINISH,ubd.buildingUpgrade.iProp3,-iCount,ITEM_OP_MODE_EXEC); } if(ubd.buildingUpgrade.iProp4 != 0 && ubd.buildingUpgrade.iPropNum4 != 0) { iCount=ubd.buildingUpgrade.iPropNum4; pUser->m_userItem.AutoExpendItem(SAVETAG_BUILD_UPGRADE_FINISH,ubd.buildingUpgrade.iProp4,-iCount,ITEM_OP_MODE_EXEC); } //G_SaveMastVariableData(pUser, SAVETAG_BUILD_UPGRADE_FINISH); pUser->m_userBase.GetMasterData(md); CMD_G_UpgradeBuildingSuc bs; memset(&bs, 0, sizeof(bs)); bs.dwUserID = pUser->GetUserID(); bs.iBID = ubd.iID; bs.iLastingTime = ubd.buildingUpgrade.iNeedTime; bs.iGold = md.stRes.iGold; bs.iDiamod = md.stRes.iDiamod; bs.iMaxWorker = md.stRes.iMaxWorker; bs.iWorker = md.stRes.iWorker; bs.iFood = md.stRes.iFood; bs.iCiviNum = md.stCivili.iCurrentExp; //道具没有处理 pUser->GetNetInterface()->Send(MAIN_G_APPLY_UPGRADE_CITY, SUB_G_APPLY_UPGRADE_BUILD_SUC, (CT_CHAR*)&bs, sizeof(bs)); MSC_USR_AddItem ua = {0}; ua.dwUserID = pUser->GetUserID(); ua.iItemID = ubd.buildingUpgrade.iProp1; ua.iItemID = ubd.buildingUpgrade.iPropNum1; G_SendThreadInfo(m_dwThread, MSC_MAIN_USR_ITEM_UPDATE, MSC_SUB_USR_ADD_ITEM, (CT_CHAR*)&ua, sizeof(ua)); ua.iItemID = ubd.buildingUpgrade.iProp2; ua.iItemID = ubd.buildingUpgrade.iPropNum2; G_SendThreadInfo(m_dwThread, MSC_MAIN_USR_ITEM_UPDATE, MSC_SUB_USR_ADD_ITEM, (CT_CHAR*)&ua, sizeof(ua)); ua.iItemID = ubd.buildingUpgrade.iProp3; ua.iItemID = ubd.buildingUpgrade.iPropNum3; G_SendThreadInfo(m_dwThread, MSC_MAIN_USR_ITEM_UPDATE, MSC_SUB_USR_ADD_ITEM, (CT_CHAR*)&ua, sizeof(ua)); ua.iItemID = ubd.buildingUpgrade.iProp4; ua.iItemID = ubd.buildingUpgrade.iPropNum4; G_SendThreadInfo(m_dwThread, MSC_MAIN_USR_ITEM_UPDATE, MSC_SUB_USR_ADD_ITEM, (CT_CHAR*)&ua, sizeof(ua)); //升级请求成功,增加升级任务判断 //add by caihan 11-14 CMD_G_TaskEventInfo taskEventInfo = {0}; /*G_BuildingType buildingType = {0}; CCBuildingScriptSetting::getSingleton().GetBuildTypeWithID(bs.iBID,&buildingType);*/ taskEventInfo.iTaskMainType = TASK_MAIN_TYPE_UPGRADE; taskEventInfo.iTaskSubType = TASK_SUB_TYPE_UPGRADE_BUILD; taskEventInfo.iSubType = bs.iBID; taskEventInfo.iLevel = TASK_SUB_UN_CASE_VALUE; pUser->m_userTask.DisposeTask(taskEventInfo); //end };
//网络数据到来 CT_VOID CCEnvThread::OnNetEventRead(CCNetInterface* pNetHandle,CT_DWORD mainID, CT_DWORD subID, CT_CHAR* pBuf, CT_DWORD len) { switch (mainID) { //根据主消息判断那个线程处理 case MAIN_G_APPLY_UPGRADE_CITY: case MAIN_G_BUILDING_EVENT_CITY: case MAIN_G_MASTER_EVENT_CITY: case MAIN_G_EVENT_CITY: case MAIN_G_CHAT_CITY: case MAIN_G_REGION_EVENT_CITY: case MAIN_G_DUPLICATE_EVENT: case MAIN_G_TASK_EVENT_CITY: case MAIN_G_DAILY_EVENT: case MAIN_G_MARKET_EVENT_CITY: case MAIN_G_PVP_EVENT: case MAIN_G_PET_EVENT_CITY: case MAIN_G_HEART_BEAT: case MAIN_G_EMAIL_EVENT_CITY: case MAIN_G_VIP_EVENT_CITY: case MAIN_CH_CHARGE : case MAIN_G_ACTIVE_EVENT_CITY: case MAIN_G_WORSHIP_EVENT_CITY: case MAIN_G_CUSTOMER_FEEDBACK: case MAIN_G_FRIEND_EVENT: case MAIN_G_TEAM_DUPLICATE: case MAIN_G_FIGHTTEAM_EVENT: case MAIN_G_RES_GRAB: case MAIN_G_TOP_ENV: case MAIN_G_ELEMENT_TOWER: case MAIN_G_ELEMENT_POWER: case MAIN_G_WORLD_BOSS: case MAIN_G_LEAVE_ENV: case MAIN_C_GAME: case MAIN_CS_GAME: case MAIN_G_CROSS_SERVER: case MAIN_G_ISLAND: case MAIN_G_SEEK: { CT_INT32* pHead = (CT_INT32*)pBuf; CT_INT32 cityThreadID = GAME_THREAD_CITY + *pHead % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(cityThreadID, mainID, subID, (CT_CHAR*)pBuf, len); break; } case MAIN_G_ENTER_ENV: //城市线程特殊处理用户登录 彭文 { #define ENV_BUF_LEN (1024) CT_CHAR buf[ENV_BUF_LEN] = {0}; if (len + sizeof(CT_INT32) >= ENV_BUF_LEN ) { break; } memcpy(buf, pBuf, len); CT_INT32 iNetHandle = (CT_INT32)pNetHandle; memcpy(buf+len, &iNetHandle, sizeof(CT_INT32)); CT_INT32* pHead = (CT_INT32*)pBuf; CT_INT32 cityThreadID = GAME_THREAD_CITY + *pHead % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(cityThreadID, mainID, subID, (CT_CHAR*)buf, len + sizeof(CT_INT32)); break; } case MAIN_G_FIGHTING_EVENT: { CT_INT32* pHead = (CT_INT32*)pBuf; CT_INT32 FightingThreadID = GAME_THREAD_FIGHT + *pHead % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadFightNum; G_SendThreadInfo(FightingThreadID, mainID, subID, (CT_CHAR*)pBuf, len); break; } default: { m_GameMesManager.DeliverMes(mainID, subID, pBuf, len, (CT_DWORD)pNetHandle); break; } } }
//发送用户信息 CT_VOID CCUserEnterEvent::SendUserData(CT_DWORD userID, CCNetInterface* pNetHandle) { CT_CHAR buf[MAX_MES_MAX_BUFF_LEN]; memset(buf, 0, MAX_MES_MAX_BUFF_LEN); CT_INT32 bufLen = MAX_MES_MAX_BUFF_LEN; CCUser* pUser = 0; if (!CCUserManager::getSingleton().Find(userID, &pUser)) { CCLogMeg::getSingleton().WriteError("CCUserEnterEvent::SendUserData, fail to find %i", userID); return ; } //计算自动生产建筑 pUser->m_userBuilding. SysProductingBuilding(); //计算最大工作人数 pUser->CalMaxWorker(); //计算空闲工人数目 pUser->CountFreeWorker(); if( pUser->m_userBase.GetMasterData( buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_MASTER_INFO, (CT_CHAR*)buf, bufLen); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen=MAX_MES_MAX_BUFF_LEN; if(pUser->m_userBase.GetMasterFightAdd(buf,bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_MASTER_FIGHTADD,(CT_CHAR*)buf, bufLen); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if( pUser->m_userBuilding. GetBuildingData( buf, bufLen)) { if (bufLen > 0) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_BUILDING_INFO, buf, bufLen); } } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if( pUser->m_userBuilding. GetUpgardingBuildingData( buf, bufLen)) { if (bufLen > 0) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_UPGRADING_BUILDING_INFO, buf, bufLen); } } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userEvent.GetEvents(buf, bufLen)) { if (bufLen > 0) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_EVENTS, buf, bufLen); } } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userBuilding. GetProductingData(buf, bufLen)) { if (bufLen > 0) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_PRODUCTING_BUILDING_INFO, buf, bufLen); } } // 发送技能信息 pUser->m_userSkill.SendClientData(MAIN_G_ENTER_ENV, SUB_G_SKILL_INFO, buf, sizeof(buf)); // 发送潜能信息 pUser->m_userTalent.SendClientData(MAIN_G_ENTER_ENV, SUB_G_TALENT_INFO, buf, sizeof(buf)); // 发送道具信息 pUser->m_userItem.SendClientData(MAIN_G_ENTER_ENV, SUB_G_ITEM_INFO, buf, sizeof(buf)); // 发送装备信息 pUser->m_userEquip.SendClientData(MAIN_G_ENTER_ENV, SUB_G_EQUIP_INFO, buf, sizeof(buf)); // 发送元素之力信息 pUser->m_userElmPower.SendClientData(MAIN_G_ENTER_ENV, SUB_G_ELMPOWER_INFO, buf, sizeof(buf)); // 发送战旗信息 pUser->m_userBattleFlag.SendClientData(MAIN_G_ENTER_ENV, SUB_G_BATTLEFLAG_INFO, buf, sizeof(buf)); // 发送元素属性信息 pUser->m_userElmAttr.SendClientData(MAIN_G_ENTER_ENV, SUB_G_ELMATTR_INFO, buf, sizeof(buf)); // 发送增益信息 pUser->m_userBuff.SendClientData(MAIN_G_ENTER_ENV, SUB_G_BUFF_INFO, buf, sizeof(buf)); // 发送军队信息 pUser->m_userArmy.SendClientData(MAIN_G_ENTER_ENV, SUB_G_ARMY_INFO, buf, sizeof(buf)); //// 发送军队信息 //memset(buf, 0, MAX_MES_MAX_BUFF_LEN); //bufLen = MAX_MES_MAX_BUFF_LEN; //if (pUser->m_userArmy.GetArmyInfo(buf, bufLen)) //{ // pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ARMY_INFO, buf, bufLen); //} // 发送宠物信息 /*memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->GetPetData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_PET_INFO, buf, bufLen); }*/ // Begin [10/22/2012 wangchen] // 发送副本信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->GetDuplicateData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_DUPLICATE_INFO, buf, bufLen); } // End [10/22/2012 wangchen] //发送区域信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userRegion.GetUnlockRegionData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_REGION_INFO, buf, bufLen); } //发送未完成任务信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTask.GetUnFinishedTask(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_TASK_INFO, buf, bufLen); } // 发送日常任务信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userDaily.GetDailyQuestData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_DAILY_QUEST, buf, bufLen); } // 发送活跃度信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userDaily.GetActiveData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ACTIVE_DATA, buf, bufLen); } // 发送竞技场信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userPVPInfo.GetPVPInfo(buf, bufLen)) { CT_INT32 iOutLen=MAX_MES_MAX_BUFF_LEN; if(CCCompress::getSingleton().Compress(buf,bufLen,buf,iOutLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_PVP_INFO, buf, iOutLen); } } //发送竞技场战报 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pUser->m_userPVPInfo.GetPVPRectord(buf,bufLen)) { CT_INT32 iOutLen=MAX_MES_MAX_BUFF_LEN; if(CCCompress::getSingleton().Compress(buf,bufLen,buf,iOutLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_PVP_FIGHTING_RECORD, buf, iOutLen); } } //发送商店信息 CCMarket::getSingleton().SendUserMarketInfo(pUser); pUser->m_userBlackMarket.SendBlackRefreshTime(); // pUser->m_userBlackMarket.RefreshShopTime(); // 发送个人限购 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userBlackMarket.GetMarketPersonal(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_MARKET_PARSONAL, buf, bufLen); } // 发送能力冷却信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userBase. GetCooldownData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_COOLDOWN_INFO, buf, bufLen); } //发送宠物信息 pUser->m_userPet.SendUserPetInfo(); //发送vip信息 pUser->m_userVip.VipSendInfo(); //发送活动信息 pUser->m_userActive.SendUserActiveInfo(); //发送祭祀信息 pUser->m_userWorship.SendUserWorshipInfo(); // 发送附魔信息 pUser->m_userEnchant.SendClientData(MAIN_G_ENTER_ENV, SUB_G_ENCHANT_DATA, buf, sizeof(buf)); // 发送已获得附魔奖励 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userEnchant.GetEnchantReward(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ENCHANT_REWARD_DATA, buf, bufLen * sizeof(CT_INT32)); } // 发送好友信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userFriend.GetFriendData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FRIEND_INFO, buf, bufLen); } // 发送好友请求信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userFriend.GetFriendReq(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FRIEND_REQ, buf, bufLen); } // 发送好友黑名单信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userFriend.GetBlackName(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FRIEND_BLACKNAME, buf, bufLen); } //发送资源点场景开启信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCResourceGrabMgr::getSingleton().GetResourceScene(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_RESSPOT_SCENE_OPEN, buf, bufLen); } // 发送资源争夺场景信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCResourceGrabMgr::getSingleton().GetUserResData(userID, buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_RESSPOT_SCENCE_INFO, buf, bufLen); } //发送元素之塔信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCTowerResManager::getSingleton().GetUserResData(userID, buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ELEMENT_TOWER_SCENCE_INFO, buf, bufLen); } //元素塔通关数据 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTower.GetTowerData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_TOWER_DATA_INFO, buf, bufLen); } //占领点生产奖励 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTower.GetTowerSlotAward(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_TOWER_SLOTAWARD_INFO, buf, bufLen); } //系统留言 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTower.GetTowerMSG(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_TOWER_MSG_INFO, buf, bufLen); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTower.GetEventData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ELEMENT_TOWER_EVENT_INFO, buf, bufLen); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCTowerResManager::getSingleton().GetTowerFightExample(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_TOWER_FIGHT_INFO, buf, bufLen); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTower.GetHelpData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ELEMENT_TOWER_HELP_INFO, buf, bufLen); } //发送活动 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userActive.GetPresent(buf, bufLen) && bufLen > 0) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ACTIVE_PRESENT, buf, bufLen); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userActive.GetPresentDesc(buf, bufLen) && bufLen > 0) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ACTIVE_PRESENT_DESC, buf, bufLen); } //发送活动描述 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCActive::getSingleton().GetActiveDsc(buf,bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ACTIVE_DEC, buf, bufLen); } //发送未开启功能 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->GetFunctionOpen(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FUNCTION_OPEN, buf, bufLen); } //发送活动资源的 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(CCResourceGrabMgr::getSingleton().GetResActive()) { CMD_G_ResActive ra={0}; time_t t=time(0); ra.iTime=CCResourceGrabMgr::getSingleton().GetLastTime(); ra.iTime=(ra.iTime <= -1?-1:ra.iTime-t); memcpy(buf,&ra,sizeof(ra)); if (CCResourceGrabMgr::getSingleton().GetResActiveSpot(buf+sizeof(ra),bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_RESSPOT_ACTIVE_OPEN, buf, bufLen+sizeof(ra)); } } else { CMD_G_ResActive ra={0}; time_t t=time(0); ra.iTime=CCResourceGrabMgr::getSingleton().GetLastTime(); ra.iTime=(ra.iTime <= -1?-1:ra.iTime-t); if(ra.iTime != -1) pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_RESSPOT_ACTIVE_CLOSE, (CT_CHAR*)&ra, sizeof(ra)); } memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pUser->m_userBoss.GetRecord(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_WORLD_BOSS_RECORD, buf, bufLen); } //发送世界BOSS活动 CMD_G_BossActive ra={0}; ra.iTime=CCBossManager::getSingleton().GetLastTime(); ra.iTime=(ra.iTime <= -1?-1:ra.iTime-time(0)); ra.iAEID=CCBossManager::getSingleton().GetAEID(); ra.iHPMax=CCBossManager::getSingleton().GetBossHPMax(); ra.iHP=CCBossManager::getSingleton().GetBossHP(); ra.iBossGrade=CCBossManager::getSingleton().GetBossGrade(); if(CCBossManager::getSingleton().GetActive()) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_WORLD_BOSS_ACTIVE_OPEN, (CT_CHAR*)&ra, sizeof(ra)); } else { if(ra.iTime != -1) pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_WORLD_BOSS_ACTIVE_CLOSE, (CT_CHAR*)&ra, sizeof(ra)); else CCLogMeg::getSingleton().WriteError("CCUserEnterEvent::BOSS_ACTIVE, iTime == -1"); } CCBossManager::getSingleton().UserLogin(userID); memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCActive::getSingleton().GetReward(buf,bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ACTIVE_REWARD_UPDATE, buf, bufLen); } //副本信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pUser->m_userDuplicate.GetSceneInfo(buf,bufLen)) { CT_INT32 iOutLen=MAX_MES_MAX_BUFF_LEN; CMD_G_SceneInfo si={0}; memcpy(&si,buf,sizeof(si)); //si.iCompress=CT_TRUE; //memcpy(buf,&si,sizeof(si)); if(CCCompress::getSingleton().Compress(buf+sizeof(si),bufLen,buf+sizeof(si),iOutLen)) //if(CCCompress::getSingleton().Compress(buf,bufLen+sizeof(si),buf,iOutLen)) { si.iCompress=CT_TRUE; memcpy(buf,&si,sizeof(si)); pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_SCENE_INFO, buf, iOutLen+sizeof(si)); //pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_SCENE_INFO, buf, iOutLen); } else { si.iCompress=CT_FALSE; memcpy(buf,&si,sizeof(si)); pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_SCENE_INFO, buf, bufLen+sizeof(si)); } } //阵法信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pUser->m_userBattleArray.GetBattleArray(buf,bufLen)) { pUser->GetNetInterface()->Send(MAIN_G_ENTER_ENV,SUB_G_BATTLE_ARRAY_INFO,buf,bufLen); } //排行信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pUser->m_userBase.GetMasterTopInfo(buf,bufLen)) { pUser->GetNetInterface()->Send(MAIN_G_ENTER_ENV,SUB_G_RANKINGLIST_INFO,buf,bufLen); } // 更新战斗状态 - 要在其他数据完成之后更新 [10/15/2012 John] memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->GetBattleStatusData(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_BUTTLE_STATUS_INFO, buf, bufLen); } // 发送战队信息 UpdateBattleStatus()之后才有用户战斗力等数据 CMD_G_FightTeamBase fightTeamBase = {0}; CT_DWORD dwFTID=0; CCFightTeam *pFightTeam=0; dwFTID = CCFightTeamManager::getSingleton().GetFightTeamIDByUser(userID); if (CCFightTeamManager::getSingleton().Find(dwFTID, &pFightTeam)) { pFightTeam->GetFightTeamBase(&fightTeamBase); pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FIGHTTEAM_BASE, (CT_CHAR*)&fightTeamBase, sizeof(CMD_G_FightTeamBase)); //战队召唤boss FightTeamSummonBoss sb={0}; if(pFightTeam->GetSummonInfo(sb)) { CMD_G_FightTeamHelpSummonInfo hsInfo={0}; hsInfo.dwUserID=userID; hsInfo.iErrorID=(sb.iWiner == FT_SUMMON_WIN?sb.iWiner:FT_SUMMON_SUC); hsInfo.iBossIndex=sb.iBossIndex; memcpy(hsInfo.dwHelpSummonID,sb.dwUserID,sizeof(hsInfo.dwHelpSummonID)); pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FIGHTTEAM_SUMMON_BOSS_INFO, (CT_CHAR*)&hsInfo, sizeof(hsInfo)); } //召唤奖励 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pFightTeam->GetSummonRewardRes(userID, buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FIGHTTEAM_SUMMON_REWARD_INFO, buf, bufLen); } //召唤奖励 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pFightTeam->GetSummonRewardItem(userID, buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FIGHTTEAM_SUMMON_REWARD_ITEM, buf, bufLen); } //时限boss FTTimeBossInfo tbi={0}; CT_INT32 iHelpCount=0; pFightTeam->GetTimeBossInfo(tbi); for(CT_INT32 i=0;i<HELP_SUMMON_COUNT;++i) { if(tbi.iHelpUser[i] != 0) iHelpCount++; } G_ValueRange vrft={0}; if(!G_GetValueRange(VALUE_TYPE_FT_TIME_BOSS_FIGHTTIME,&vrft)) { CCLogMeg::getSingleton().WriteError("CCUserEnterEvent::SendUserData G_GetValueRange VALUE_TYPE_FT_TIME_BOSS_FIGHTTIME"); } G_ValueRange vrbs={0}; if(!G_GetValueRange(VALUE_TYPE_FT_TIME_BOSS_SUMMON,&vrbs)) { CCLogMeg::getSingleton().WriteError("CCUserEnterEvent::SendUserData G_GetValueRange VALUE_TYPE_FT_TIME_BOSS_SUMMON"); } //插入冷却时间 CooldownData cd={0}; CT_INT32 lTime=time(0); pUser->m_userBase.GetCooldownData(FTTIMEBOSS_SUMMON,cd); if(cd.leftTime+ cd.toggleTime <= lTime) { cd.iType=FTTIMEBOSS_SUMMON; cd.toggleTime=lTime; cd.leftTime=tbi.iSummonBeginTime+vrbs.fMaxVal-lTime; pUser->m_userBase.InsertCooldownData(cd); pUser->m_userBase.UpdateCooldown(FTTIMEBOSS_SUMMON,0); } if(tbi.iCurrentHP == pFightTeam->GetTBMaxHP() && tbi.iSummonBeginTime != 0 && iHelpCount < HELP_SUMMON_FIGHT_COUNT) { CMD_G_FTTimeBossInfo bi={0}; bi.dwUserID=pUser->GetUserID(); bi.iBossID=tbi.iIndex; memcpy(bi.dwHelpSummonID,tbi.iHelpUser,sizeof(bi.dwHelpSummonID)); pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_FIGHTTEAM_TIMEBOSS_INFO,(CT_CHAR*)&bi,sizeof(bi)); } else if(tbi.iCurrentHP <= pFightTeam->GetTBMaxHP() && tbi.iCurrentHP != 0) { CMD_G_FTTimeBossFightInfo bfi={0}; FTTimeBossMember bm={0}; CT_CHAR cBuf[MAX_MES_MAX_BUFF_LEN]={0}; CT_DWORD dwLen=MAX_MES_MAX_BUFF_LEN; pFightTeam->GetTimeBossMember(userID,bm); bfi.iBossID=tbi.iIndex; bfi.iBossMaxHP=pFightTeam->GetTBMaxHP(); bfi.iCurrentHP=tbi.iCurrentHP; bfi.iFTBossTime=tbi.iSummonBeginTime+vrft.fMaxVal-lTime; bfi.iFTContribute=bm.iFTContribute; bfi.iFTFood=bm.iFTFood; bfi.iFightNum=bm.iFightNum; pFightTeam->GetFightTeamMember(cBuf,dwLen); for(CT_INT32 i=0;i<dwLen/sizeof(CMD_G_FightTeamMember) && i < HELP_SUMMON_COUNT;++i) { CMD_G_FightTeamMember ftm={0}; memcpy(&ftm,cBuf+i*sizeof(CMD_G_FightTeamMember),sizeof(CMD_G_FightTeamMember)); bfi.dwUserID[i]=ftm.dwUserID; memset(&bm,0,sizeof(bm)); pFightTeam->GetTimeBossMember(ftm.dwUserID,bm); bfi.iHurt[i]=bm.iHurt; } for(CT_INT32 i=0;i<HELP_SUMMON_COUNT;++i) { if(tbi.iHelpUser[i] != 0) bfi.iMemberCount++; } pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_FIGHTTEAM_TIMEBOSS_FIGHT_INFO,(CT_CHAR*)&bfi,sizeof(bfi)); } else if(tbi.iIndex != 0) { CMD_G_FTTimeBossIndex tbbi={0}; tbbi.iIndex=tbi.iIndex; pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_FIGHTTEAM_TIMEBOSS_INDEX,(CT_CHAR*)&tbbi,sizeof(tbbi)); memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if(pFightTeam->GetTBReward(buf,bufLen)) pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_FIGHTTEAM_TIMEBOSS_REWARD_INFO,buf,bufLen); } } CCFightTeamManager::getSingleton().UserLoginEvent(userID); // 更新战队成员在线状态 //科技信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userFightTeamNember.GetNemberScience(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_FIGHTTEAM_SCIENCE_INFO, buf, bufLen); } //发送公告 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCBroadcastScriptSetting::getSingleton().GetAnnouncementByIndex(buf,bufLen,ANNONCEMENT_TOWN)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ANNOUNCEMENT, buf, bufLen); } //发送活动公告 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (CCBroadcastScriptSetting::getSingleton().GetAnnouncementByIndex(buf,bufLen,ANNONCEMENT_ACTIVE)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ACTIVENOTICE, buf, bufLen); } //跨服战 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; CMD_G_CrossBaseInfo cb={0}; cb.iStatus=CCCSFightData::getSingleton().GetStatus(); memcpy(buf,&cb,sizeof(cb)); bufLen-=sizeof(cb); CCCSFightData::getSingleton().GetUserReward(pUser->GetUserID(),buf+sizeof(cb),bufLen); pNetHandle->Send(MAIN_G_CROSS_SERVER,SUB_G_CROSS_SERVER_BASEINFO, buf, bufLen+sizeof(cb)); //头衔 pUser->m_userTitle.SendClientData(MAIN_G_ENTER_ENV, SUB_G_TITLE_DATA, buf, sizeof(buf)); memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userTitle.GetTitleList(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_TITLE_LIST, buf, bufLen); } //龙岛 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userIsland.GetIslandData(buf, bufLen, fightTeamBase.dwFTID)) { pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ISLAND_DATA, buf, bufLen); } //城墙加成信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userSeek.GetWallAddition(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_SEEK_WALL_ADDITION_INFO, buf, bufLen); } //城墙军队 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userSeek.GetWallArmy(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_SEEK_ARMY_INFO, buf, bufLen); } //探访信息 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userSeek.GetSeekInfo(buf, bufLen)) { pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_SEEK_DATA, buf, bufLen); } //发送完成(客户端未使用) //pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ENTER_SUC); //计算扫荡奖励 MSC_RaidsReward RaidsReward={0}; RaidsReward.dwUserID=pUser->GetUserID(); CT_DWORD threadid = GAME_THREAD_CITY + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(threadid,MSC_MAIN_DUPLICATE_EVENT,MSC_SUB_RAIDS_REWARD,(CT_CHAR*)&RaidsReward,sizeof(RaidsReward)); pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ENTER_FINISH); //上线广播 { MasterData masterData = {0}; pUser->m_userBase.GetMasterData(masterData); if(strlen(masterData.cNickName) == 0) return; // 战斗力排行广播 if (masterData.mvd.topData.TopInfo[TOP_TYPE_POWER].iRankingCur > 0 && masterData.mvd.topData.TopInfo[TOP_TYPE_POWER].iRankingCur < 4) { RollBroadcast rb[2]={0}; rb[0].SetValue(masterData.mvd.topData.TopInfo[TOP_TYPE_POWER].iRankingCur,""); rb[1].SetValue(userID, masterData.cNickName); //sprintf(cBroadcastMes+sizeof(iBroadcastType)+sizeof(iBroadcastTime), "{26}<6:%d>{17}<1:%d:%s>{27}",masterData.mvd.topData.TopInfo[TOP_TYPE_POWER].iRankingCur, userID, masterData.cNickName); G_SendRollBroadecast(26,2,1,(CT_CHAR*)rb,sizeof(rb)); } // 等级排行广播 if (masterData.mvd.topData.TopInfo[TOP_TYPE_GRADE].iRankingCur > 0 && masterData.mvd.topData.TopInfo[TOP_TYPE_GRADE].iRankingCur < 4) { RollBroadcast rb[2]={0}; rb[0].SetValue(masterData.mvd.topData.TopInfo[TOP_TYPE_GRADE].iRankingCur,""); rb[1].SetValue(userID, masterData.cNickName); //sprintf(cBroadcastMes+sizeof(iBroadcastType)+sizeof(iBroadcastTime), "{41}<6:%d>{17}<1:%d:%s>{27}",masterData.mvd.topData.TopInfo[TOP_TYPE_GRADE].iRankingCur,userID, masterData.cNickName); G_SendRollBroadecast(41,2,1,(CT_CHAR*)rb,sizeof(rb)); } // 装备拥有广播 memset(buf, 0, MAX_MES_MAX_BUFF_LEN); bufLen = MAX_MES_MAX_BUFF_LEN; if (pUser->m_userItem. GetEquipedItemData(buf, bufLen)) { CMD_G_ItemData *pItemData = 0; CT_INT32 iCount = bufLen / sizeof(CMD_G_ItemData); for(CT_INT32 i=0; i<iCount; ++i) { pItemData = (CMD_G_ItemData *)(buf + i * sizeof(CMD_G_ItemData)); if (G_BroadcastFilter(8, pItemData->iID)) { RollBroadcast rb[2]={0}; rb[0].SetValue(pItemData->iID,""); rb[1].SetValue(userID, masterData.cNickName); //sprintf(cBroadcastMes+sizeof(iBroadcastType)+sizeof(iBroadcastTime), "{36}<2:%d>{17}<1:%d:%s>{37}",pItemData->iID, userID, masterData.cNickName); G_SendRollBroadecast(36,2,1,(CT_CHAR*)rb,sizeof(rb)); } else if (G_BroadcastFilter(9, pItemData->iID)) { RollBroadcast rb[2]={0}; rb[0].SetValue(pItemData->iID,""); rb[1].SetValue(userID, masterData.cNickName); //sprintf(cBroadcastMes+sizeof(iBroadcastType)+sizeof(iBroadcastTime), "{36}<2:%d>{17}<1:%d:%s>{37}",pItemData->iID, userID, masterData.cNickName); G_SendRollBroadecast(129,2,1,(CT_CHAR*)rb,sizeof(rb)); } } } //头衔广播 if(pUser->m_userTitle.GetUseTitleID() == TITLE_CHOMPION_ID) { RollBroadcast rb={0}; rb.SetValue(pUser->GetUserID(),masterData.cNickName); G_SendRollBroadecast(132,2,1,(CT_CHAR*)&rb,sizeof(rb)); } else if(pUser->m_userTitle.GetUseTitleID() == TITLE_THE_BEST_TEAM_ID) { RollBroadcast rb={0}; rb.SetValue(pUser->GetUserID(),masterData.cNickName); G_SendRollBroadecast(133,2,1,(CT_CHAR*)&rb,sizeof(rb)); } else if(pUser->m_userTitle.GetUseTitleID() == TITLE_BIG_LOCAL_TYRANTS) { RollBroadcast rb={0}; rb.SetValue(pUser->GetUserID(),masterData.cNickName); G_SendRollBroadecast(134,2,1,(CT_CHAR*)&rb,sizeof(rb)); } else if(pUser->m_userTitle.GetUseTitleID() == TITLE_MOST_RICH) { RollBroadcast rb={0}; rb.SetValue(pUser->GetUserID(),masterData.cNickName); G_SendRollBroadecast(138,2,1,(CT_CHAR*)&rb,sizeof(rb)); } } }
//处理登陆 CT_VOID CCUserEnterEvent::DisposeEnter(CCNetInterface* pNetHandle, CT_DWORD subID, CT_CHAR* pBuf, CT_DWORD len) { if (len != sizeof(CMD_G_EnterGame)) { G_DisposeErrorMes(0, subID, "CCEnvThread::DisposeEnter : errorlen != sizeof(CMD_G_EnterGame)"); return; } CMD_G_EnterGame* pGeg = (CMD_G_EnterGame*)pBuf; CCLogMeg::getSingleton().WriteError("一个新用户进入, uid=%i, 服务器中的用户数目=%i", pGeg->dwUserID, CCUserManager::getSingleton().GetUserCount()); if(!CCTop::getSingleton().GetInit()) { CCLogMeg::getSingleton().WriteError("CCUserEnterEvent::DisposeEnter Init No Finish"); #ifndef _WIN32 //用户失效 CMD_G_EnterFail ef; ef.efReason = EF_SERVER_REFUSE; pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ENTER_FAIL, (CT_CHAR*)&ef, sizeof(CMD_G_EnterFail)); pNetHandle->Close(); return; #endif } #ifndef _DEBUG if(CCUserEnterManager::getSingleton().Validate(*pGeg)) #endif { //用户爆满 if(CCUserManager::getSingleton().GetUserCount() >= CCConfig::getSingleton().m_maxClientNum) { pNetHandle->Send(MAIN_G_ENTER_ENV,SUB_G_PLAY_FULL); pNetHandle->Close(); return; } CCUser *pUser=0; if(CCUserManager::getSingleton().Find(pGeg->dwUserID,&pUser)) { //当前用户下线 //CCUser *pUser=0; //if(CCUserManager::getSingleton().Find(pGeg->dwUserID,&pUser)) { if(pUser->GetNetInterface() != pNetHandle) { pUser->GetNetInterface()->Send(MAIN_G_ENTER_ENV,SUB_G_REPEAT_LOGIN); pUser->CloseNet(); } } pUser->ResetSyncTime(time(0)); if(pUser->GetInit()) { UserEnterInfo UserEnterinfo={0}; if(CCUserEnterManager::getSingleton().Find(pGeg->dwUserID,UserEnterinfo)) { pUser->SetTalk(UserEnterinfo.bTalk); } //断线重回 CCUserManager::getSingleton().SetNetHandle(pGeg->dwUserID, pNetHandle); // 重回后 [11/14/2012 John] CCUser* user = 0; if (CCUserManager::getSingleton().Find(pGeg->dwUserID, &user)) { user->m_userDaily.UpdateSignData(); } SendUserData(pGeg->dwUserID, pNetHandle); //组队副本 MSC_SUB_TeamDuplicateLeave TeamLeave={0}; TeamLeave.dwDstID=pGeg->dwUserID; TeamLeave.dwUserID=pGeg->dwUserID; CT_DWORD threadid = GAME_THREAD_CITY + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadCityNum; G_SendThreadInfo(threadid,MSC_MAIN_TEAMDUPLICATE,MSC_SUB_TEAMDUPLICATE_LEAVE,(CT_CHAR*)&TeamLeave,sizeof(TeamLeave)); return ; } } UserEnter(pGeg, pNetHandle); } #ifndef _DEBUG else { CCLogMeg::getSingleton().WriteError("用户验证码失效"); //用户失效 CMD_G_EnterFail ef; ef.efReason = EF_SERVER_REFUSE; pNetHandle->Send(MAIN_G_ENTER_ENV, SUB_G_ENTER_FAIL, (CT_CHAR*)&ef, sizeof(CMD_G_EnterFail)); pNetHandle->Close(); } #endif }
//处理用户奖励 CT_VOID CCCityEvent::DisposeApplyAwardEvent(CCUser* pUser, CT_INT32 eventID, CT_INT32 index, CT_INT32 awardID, ENUM_EventType et) { G_EventAward gea = {0}; if (!CCEventScriptSetting::getSingleton().GetEventAward(eventID, awardID, gea)) { CCLogMeg::getSingleton().WriteError("CCCityEvent::DisposeApplyAwardEvent, 在事件奖励中没有发现用户 id = %i, eventid=%i, awardid=%i", pUser->GetUserID(), eventID, awardID); return; } MasterData md = {0}; pUser->m_userBase.GetMasterData(md); MasterVariableData addValue = {0}; addValue.stRes.iGold += G_GetEventFinishAward(gea.fGold,md.mvd.stGrade.iLevel,md.factor.fProductFactor); addValue.stRes.iFood += G_GetEventFinishAward(gea.fFood,md.mvd.stGrade.iLevel,md.factor.fProductFactor); addValue.stCivili.iCurrentExp += gea.iCivi; addValue.stGrade.iCurrentExp += G_GetEventFinishAward(gea.fXp,md.mvd.stGrade.iLevel,md.factor.fProductFactor); pUser->m_userBase.AddMastData(addValue,SAVETAG_EVENT_AWARD); MasterVariableData mvd = {0}; pUser->m_userBase.GetMasterData(mvd); CMD_G_AwardEvent gae = {0}; gae.dwUserID = pUser->GetUserID(); gae.iCiviliNum = mvd.stCivili.iCurrentExp; gae.iFood = mvd.stRes.iFood; gae.iGold = mvd.stRes.iGold; gae.iXp = mvd.stGrade.iCurrentExp; gae.iIndex = index; gae.et = et; gae.iAwardID = awardID; CT_INT32 iNum = gea.iPropNum1; //if (pUser->m_userItem.AutoAddItemData(m_dwThread, gea.iProp1, iNum)) if (LOOT_SUC == pUser->LootItems(SAVETAG_EVENT_AWARD, &(gea.iProp1), &iNum)) { gae.iProp1 = gea.iProp1; } iNum = gea.iPropNum2; //if (pUser->m_userItem.AutoAddItemData(m_dwThread, gea.iProp2, iNum)) if (LOOT_SUC == pUser->LootItems(SAVETAG_EVENT_AWARD, &(gea.iProp2), &iNum)) { gae.iProp2 = gea.iProp2; } // G_SaveMastVariableData(pUser, SAVETAG_EVENT_REWARD); //发送消息 pUser->GetNetInterface()->Send(MAIN_G_EVENT_CITY, SUB_G_AWARD_EVENT, (CT_CHAR*)&gae, sizeof(gae)); //日志记录 MSC_LOGDB_EventReward EventReward={0}; EventReward.dwUserID=pUser->GetUserID(); EventReward.iXp=addValue.stGrade.iCurrentExp; EventReward.iFood=addValue.stRes.iFood; EventReward.iGold=addValue.stRes.iGold; EventReward.iProp1=gea.iProp1; EventReward.iProp2=gea.iProp2; EventReward.iNum1=gea.iPropNum1; EventReward.iNum2=gea.iPropNum2; CT_DWORD threadid = GAME_THREAD_LOGDATABASE + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadLogDataBaseNum; G_SendThreadInfo(threadid,MSC_MAIN_LOGDB_DATA,MSC_SUB_LOGDB_EVENTREWARD,(CT_CHAR*)&EventReward,sizeof(EventReward)); // MSC_DB_MasterSaveData msd = {0}; // pUser->m_userBase.GetMasterSaveData(msd); //MSC_DB_EventAward ea = {0}; //ea.dwUserID = pUser->GetUserID(); //ea.iCiviliNum = addValue.stCivili.iCurrentExp; //ea.iFood = addValue.stRes.iFood; //ea.iGold = addValue.stRes.iGold; //ea.iProp1 = gea.iProp1; //ea.iPropNum1 = gea.iPropNum1; //ea.iProp2 = gea.iProp2; //ea.iPropNum2 = gea.iPropNum2; //CT_DWORD threadid = GAME_THREAD_DATABASE + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadDataBaseNum; //G_SendThreadInfo(threadid, MSC_MAIN_DB_BUILDING_EVENT, MSC_SUB_DB_SAVE_AWARD_DATA, (CT_CHAR*)&ea, sizeof(ea) ); //数据记录 G_ItemBase ItemBase1={0}; G_ItemBase ItemBase2={0}; if(G_GetItemBase(gea.iProp1,&ItemBase1) && G_GetItemBase(gea.iProp2,&ItemBase2)) { MSC_LOGDB_EventAward EventAward={0}; EventAward.dwUserID = pUser->GetUserID(); EventAward.iCiviliNum = addValue.stCivili.iCurrentExp; EventAward.iFood = addValue.stRes.iFood; EventAward.iGold = addValue.stRes.iGold; EventAward.iProp1 = gea.iProp1; EventAward.iPropNum1 = gea.iPropNum1; EventAward.iProp2 = gea.iProp2; EventAward.iPropNum2 = gea.iPropNum2; memcpy(EventAward.cProp1Name,ItemBase1.szName,sizeof(EventAward.cProp1Name)); memcpy(EventAward.cProp2Name,ItemBase2.szName,sizeof(EventAward.cProp2Name)); CT_DWORD threadid = GAME_THREAD_LOGDATABASE + pUser->GetUserID() % ((CCGameConfig&)CCConfig::getSingleton()).m_gameThreadLogDataBaseNum; G_SendThreadInfo(threadid,MSC_MAIN_LOGDB_DATA,MSC_SUB_LOGDB_SAVEEVENTFINISH,(CT_CHAR*)&EventAward,sizeof(EventAward)); } }