Exemple #1
0
//处理战斗事件
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
	}
}
Exemple #2
0
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;
}
Exemple #5
0
//清退所有用户
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);
}
Exemple #6
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;
}
Exemple #8
0
//用户定时器处理
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);
	}
}
Exemple #9
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

};
Exemple #16
0
//网络数据到来
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
}
Exemple #19
0
//处理用户奖励
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));
	}

}