Пример #1
0
//解码
void	CMailManager::DecordFromByteArray(BYTE* pByte, long& pos,tagMailParam *pMailParam)
{
	char strTemp[2048];
	if (pMailParam==NULL)
		return;
	_GetBufferFromByteArray(pByte,pos,pMailParam->guid);	
	_GetStringFromByteArray(pByte,pos,strTemp);
	pMailParam->strSubject = strTemp;
	_GetStringFromByteArray(pByte,pos,strTemp);
	pMailParam->strWriter = strTemp;
	_GetStringFromByteArray(pByte,pos,strTemp);
	pMailParam->strText = strTemp;
	_GetStringFromByteArray(pByte,pos,strTemp);
	pMailParam->strExText = strTemp;

	pMailParam->lGold = _GetLongFromByteArray(pByte,pos);
	pMailParam->tRemainTime = time_t(_GetDwordFromByteArray(pByte,pos));		
	pMailParam->bRead = _GetByteFromByteArray(pByte,pos);
	pMailParam->lType = _GetLongFromByteArray(pByte,pos);
	pMailParam->bReject = _GetByteFromByteArray(pByte,pos);
	_GetStringFromByteArray(pByte,pos,strTemp);
	pMailParam->strReceiver = strTemp;
	_GetBufferFromByteArray(pByte,pos,pMailParam->ReceiverGuid);


	long  lSNum = _GetLongFromByteArray(pByte,pos);
	for (int i=0; i<lSNum; ++i)
	{
		tagSGoods *ptgSGoods = OBJ_CREATE(tagSGoods);
		ptgSGoods->lIndex = _GetLongFromByteArray(pByte,pos);
		ptgSGoods->lNum = _GetLongFromByteArray(pByte,pos);
		pMailParam->lSGoods.push_back(ptgSGoods);
	}
	long lCNum = _GetLongFromByteArray(pByte,pos);

	for (int i=0; i<lCNum; ++i)
	{
		tagCGoods *ptgCGoods = OBJ_CREATE(tagCGoods);
		_GetBufferFromByteArray(pByte,pos,ptgCGoods->goodsguid);
		ptgCGoods->lNum = _GetLongFromByteArray(pByte,pos);
		ptgCGoods->lContainerID = _GetLongFromByteArray(pByte,pos);
		ptgCGoods->lPos = _GetLongFromByteArray(pByte,pos);
		pMailParam->lCGoods.push_back(ptgCGoods);
	}

	long lGNum = _GetLongFromByteArray(pByte,pos);
	for (int i=0; i<lGNum; ++i)
	{
		CGoods *pGoods = CGoodsFactory::UnserializeGoods(pByte,pos,25);
		if( pGoods )
		{
			CGoodsFactory::UpdateEquipmentAttr(pGoods);
			pMailParam->vMailGoods.push_back(pGoods);
		}
	}

}
Пример #2
0
CPlayerPack::CPlayerPack(CPlayer* pPlayer)
:m_pPlayer(pPlayer)
,m_cWallet(GoodsSetup::GetGoldCoinIndex())
,m_cSilverWallet(GoodsSetup::GetSilverIndex())
,m_cGem(GoodsSetup::GetGemIndex())
{
    //原始背包
    m_pOrigGoodsContainer = OBJ_CREATE(CVolumeLimitGoodsContainer);
    m_pOrigGoodsContainer->SetContainerVolume(20);
    m_pSubpackContainer=OBJ_CREATE(CSubpackContainer);

    m_pOrigGoodsContainer->AddListener(m_pPlayer);
}
Пример #3
0
/// 针对竞技相位创建
void  PhaseManager::CreatePhase(const CGUID& first,const CGUID& second,
                                float size1, float size2,
                                eTrigger trigger,
                                const char* Scriptfile )
{
      /// 针对竞技的创建规则,不明确,没有注明
      /// 传进来的first,second 应该都是队伍Leader
      PhaseOpen(RNULL);

      CPlayer* fplayer = GetGame()->FindPlayer( first );
      CPlayer* splayer = GetGame()->FindPlayer( second);

      if ( fplayer->IsDied() || splayer->IsDied() ) return ;

      const CGUID& team_fid = fplayer->GetTeamID();
      const CGUID& team_sid = splayer->GetTeamID();

      GSTeam *teamf = GetOrganiCtrl()->GetGameTeamByID( team_fid );
      GSTeam *teams = GetOrganiCtrl()->GetGameTeamByID( team_sid );

      /// 相位初始化 new PhasePro();
      PhasePro* TempPro = OBJ_CREATE(PhasePro);
      if( TempPro != NULL )
      {   
          m_PhaseList[ TempPro->GetID() ] = TempPro;
          
          /// 建立2组队伍映射
          TempPro->Init(fplayer,teamf,2,size1,size2,ePk,trigger,splayer,teams);
          TempPro->RunScript(fplayer, Scriptfile );  

         Log4c::Trace(ROOT_MODULE, "Pk Phase { %s } Create Successed ! first leader % s , second leader %s", 
                    TempPro->GetID().tostring() , fplayer->GetName() , splayer->GetName() );
      }
}
Пример #4
0
//执行
void COpDestObjs::Execute(CMoveShape* pShape)
{
    if (m_Obj == Obj_Self)
    {
        pShape = m_pParam->pUser;
    }
    //添加目标
    if(m_Op == OP_Dest_Obj_Add && pShape)
    {
        list<stDestObj*>::iterator it = m_pParam->OperObjs.begin();
        for(; it!=m_pParam->OperObjs.end(); ++it)
        {
            if ((*it)->DestID==pShape->GetExID() && (*it)->nDestType==pShape->GetType())
            {
                return;
            }
        }
        stDestObj *obj = OBJ_CREATE(stDestObj);
        obj->DestID = pShape->GetExID();
        obj->nDestType = pShape->GetType();
        m_pParam->OperObjs.push_back(obj);
    }
    //清除一个目标
    else if(m_Op == OP_Dest_Obj_Del)
    {
    }
    //清除所有目标
    else if(m_Op == OP_Dest_Obj_Clear)
    {
        m_pParam->OperObjs.clear();
    }
}
Пример #5
0
void DoW2SMailSendResult( CMessage *pMsg )
{
	long lRet=0;
	BYTE *ByteData = NULL;
	CPlayer *pPlayer=NULL;
	CGUID WriterGuid;
	pMsg->GetGUID(WriterGuid);
	lRet = pMsg->GetLong();
	long lByteDataLen = pMsg->GetLong();					

	if (lRet==1)
	{
		ByteData = (BYTE*)M_ALLOC(sizeof(BYTE)*lByteDataLen);	
		pMsg->GetEx(ByteData,lByteDataLen);
		long Pos = 0;
		tagMailParam *pMailParam = OBJ_CREATE(tagMailParam);
		GameManager::GetInstance()->GetMailManager()->DecordMailMsgFromByteArray(ByteData,Pos,pMailParam);
		CMail *pMail = OBJ_CREATE_PVOID(CMail, (void*)pMailParam);
		pPlayer = GetGame()->FindPlayer(pMail->GetWriter().c_str());

		if (pPlayer)
		{
			int nRet = GameManager::GetInstance()->GetMailManager()->ReMoveGoldAndGoods(pMail,pPlayer);//--扣除物品和金钱
			GameManager::GetInstance()->GetMailManager()->SendMailToReceiver(pMail->GetExID(),nRet);
		}

		OBJ_RELEASE(CMail, pMail);			
		M_FREE(ByteData, sizeof(BYTE)*lByteDataLen);				
	}
	else
	{
		GameManager::GetInstance()->GetMailManager()->SendMailFailedToClient(WriterGuid,MAIL_SENDING_FAILED_INVALID_RECEIVER);//--非法收信人
	}
}
Пример #6
0
CMail::CMail(void)
{
	m_pBaseParam = OBJ_CREATE(tagMailParam);
	m_pBaseParam->lCGoods.clear();
	m_pBaseParam->vMailGoods.clear();
	m_pBaseParam->strExText.clear();
	m_pBaseParam->WriterGuid = NULL_GUID;
	m_pBaseParam->strReceiverList.clear();
	m_pBaseParam->strText.clear();
	m_pBaseParam->strSubject.clear();
	m_pBaseParam->bRead = 0;
	m_pBaseParam->lType = 0;
	m_pBaseParam->tRemainTime = 0;
	m_pBaseParam->lGold = 0;
	m_pBaseParam->tWriteTime = 0;
	m_pBaseParam->bSave = 0;
	m_pBaseParam->ReceiverGuid = NULL_GUID;
	m_pBaseParam->strWriter.clear();
	m_pBaseParam->lCGoods.clear();
	m_pBaseParam->lSGoods.clear();
	m_pBaseParam->ltgTimer.clear();
	m_pBaseParam->ltgMailEvent.clear();
	m_pBaseParam->vMailGoods.clear();
	m_pBaseParam->lMailCondition.clear();
	++g_lMailCount;
}
Пример #7
0
bool Script::SendSysMail( ulong mailID, const char *writer )
{
    CPlayer *player = FindPlayer( NULL );
    if( player == NULL ) return false;
    tagMailParam *mailParam = MailList::GetSysMail( mailID );
   //if( player->CheckSysMail( mailID ) )//--add
   // {
   //     return false;
   // }
    player->InsertSysMail( mailID, 1 );
    if( mailParam )
    {
        bool receive = false;
        if( mailParam->strReceiverList.size() == 0 )
        {
            receive = true;
            mailParam->strReceiverList.push_back( player->GetName() );		
        }

        mailParam->WriterGuid = NULL_GUID;
        mailParam->strWriter = writer;

        tagMailParam *pMailParam = OBJ_CREATE( tagMailParam );
        GameManager::GetInstance()->GetMailManager()->InitSysMailParam( pMailParam, mailParam );//为g_MailManager对象做初始化	

        if( receive )
            mailParam->strReceiverList.clear();

        //pMailParam->lType = mailID;//--modify by shixi

        CMail *pMail = OBJ_CREATE_PVOID( CMail, (void*)pMailParam );
        GameManager::GetInstance()->GetMailManager()->SendSysMailByScript( pMail );
    }
    return true;
}
//得到实例
CGlobalScriptTimer* CGlobalScriptTimer::GetInstance()
{
	if(instance == NULL)
	{
		instance = OBJ_CREATE(CGlobalScriptTimer);
	}
	return instance;
}
Пример #9
0
CPKSys* CPKSys::getInstance()
{
	if(pInstance == NULL)
	{
		pInstance = OBJ_CREATE(CPKSys);
	}
	return pInstance;
}
Пример #10
0
void DoW2SMailReceive( CMessage *pMsg )
{
	BYTE *ByteData = NULL;
	list<CGUID> lMailGuid;
	list<CMail*> lMailList;
	CGUID playerGuid;
	pMsg->GetGUID(playerGuid);

	long lByteDataLen = pMsg->GetLong();
	ByteData = (BYTE*)M_ALLOC(sizeof(BYTE)*lByteDataLen);	
	pMsg->GetEx(ByteData,lByteDataLen);
	time_t t_CurrentTime = time(NULL);

	CPlayer *pPlayer =  GetGame()->FindPlayer(playerGuid);
	if (pPlayer)
	{				
		long Pos = 0;
		long lNum = _GetLongFromByteArray(ByteData,Pos);
		for (int i=0; i<lNum; ++i)
		{
			tagMailParam *pMailParam = OBJ_CREATE(tagMailParam);
			GameManager::GetInstance()->GetMailManager()->DecordFromByteArray(ByteData,Pos,pMailParam);

			CMail *pMail = OBJ_CREATE_PVOID(CMail, (void*)pMailParam);

			if(!GameManager::GetInstance()->GetMailManager()->SetMapMail(pMail))
			{
				lMailGuid.push_back(pMailParam->guid);					
			}
			else
			{
				lMailList.push_back(pMail);
			}
		}
		if(lMailGuid.size()>0)
		{
			//删除邮件		
			GameManager::GetInstance()->GetMailManager()->DeleteMailToWS(lMailGuid,pPlayer);				
		}

		vector<BYTE> vectorByte;
		vectorByte.clear();

		_AddToByteArray(&vectorByte,(long)lMailList.size());
			
		pPlayer->SetReceiveMail(true);	
		for (list<CMail*>::iterator it=lMailList.begin();it!=lMailList.end();++it)
		{
			pPlayer->AddReceiveMailList((*it)->GetExID());
		}

		GameManager::GetInstance()->GetMailManager()->SendReceiveMail( pPlayer );
	}
	M_FREE(ByteData, lByteDataLen);
}
Пример #11
0
//初始化系统邮件参数
void	CMailManager::InitSysMailParam(tagMailParam *pParam,tagMailParam *pPamramList)
{
	pParam->bRead = pPamramList->bRead;
	pParam->lType = pPamramList->lType;

	pParam->strExText = pPamramList->strExText;
	pParam->strText  = pPamramList->strText;
	pParam->bReject = 0;
	pParam->tRemainTime = pPamramList->tRemainTime;

	pParam->strWriter = pPamramList->strWriter;
	pParam->WriterGuid = NULL_GUID;
	pParam->strSubject = pPamramList->strSubject;
	pParam->strReceiverList = pPamramList->strReceiverList;
	pParam->lGold = pPamramList->lGold;

	for (list<tagMailEvent*>::iterator it=pPamramList->ltgMailEvent.begin(); it!=pPamramList->ltgMailEvent.end(); ++it)
	{
		tagMailEvent *ptgMailEvent = OBJ_CREATE(tagMailEvent);
		ptgMailEvent->strEventName = (*it)->strEventName;
		ptgMailEvent->lBeginTime = (*it)->lBeginTime;
		ptgMailEvent->lEndTime = (*it)->lEndTime;
		pParam->ltgMailEvent.push_back(ptgMailEvent);
	}

	for (list<tagSGoods*>::iterator it=pPamramList->lSGoods.begin(); it!=pPamramList->lSGoods.end(); ++it)
	{
		tagSGoods *ptgSGoods = OBJ_CREATE(tagSGoods);
		ptgSGoods->lIndex = (*it)->lIndex;
		ptgSGoods->lNum = (*it)->lNum;
		pParam->lSGoods.push_back(ptgSGoods);
	}
	for (list<tagMailCondition*>::iterator it=pPamramList->lMailCondition.begin(); it!=pPamramList->lMailCondition.end(); ++it)
	{
		tagMailCondition *ptgMailCondition = OBJ_CREATE(tagMailCondition);
		ptgMailCondition->strName = (*it)->strName;
		ptgMailCondition->lValue = (*it)->lValue;
		pParam->lMailCondition.push_back(ptgMailCondition);
	}

}
Пример #12
0
	bool CShopManager::StartupTimer()
	{
		if( m_lUpdateBuyTimer != INVALID_TIMER )
		{
			return false;
		}
		unsigned long uInterval = GetInst( CConfiger ).GetGlobalCfg().uGoodsUpdateInter * 1000;
		tagTimerVar *pTimerVar = OBJ_CREATE(tagTimerVar);
		pTimerVar->TimerType = (eChildObjType)TT_UPDATE_BUY;
		// refresh immediately.
		m_lUpdateBuyTimer = GameManager::GetInstance()->Schedule( this, pTimerVar, timeGetTime(), 
			uInterval );
			
		return true;
	}
Пример #13
0
//初始化系统邮件
void	CMailManager::InitSysMail()
{
	ClearSysMail();
	map<DWORD,tagMailParam*> mapMail = CMailList::GetSysMail();
	map<DWORD,tagMailParam*>::iterator it=mapMail.begin();
	for (;it!=mapMail.end();++it)
	{		
		CGUID guid;
		CGUID::CreateGUID(guid);
		tagMailParam *ptgMailParam = OBJ_CREATE(tagMailParam);
		InitSysMailParam(ptgMailParam,(*it).second);
		ptgMailParam->guid =guid;
		ptgMailParam->lType = (*it).first;

		CMail *pMail = MP_NEW CMail(ptgMailParam);
		AddSysMail((*it).first,pMail);	
	}
}
Пример #14
0
void DoW2SMailSend( CMessage *pMsg )
{
	BYTE *ByteData = NULL;	
	CGUID MailGuid;

	pMsg->GetGUID(MailGuid);

	long lByteDataLen = pMsg->GetLong();
	ByteData = (BYTE*)M_ALLOC(sizeof(BYTE)*lByteDataLen);	
	pMsg->GetEx(ByteData,lByteDataLen);
	long Pos = 0;
	tagMailParam *pMailParam = OBJ_CREATE(tagMailParam);

	GameManager::GetInstance()->GetMailManager()->DecordFromByteArray(ByteData,Pos,pMailParam);
	CMail *pMail = OBJ_CREATE_PVOID(CMail, (void*)pMailParam);//用pMailParam作为构造函数创建CMail对象
	GameManager::GetInstance()->GetMailManager()->SendMailToClient(pMail);
	M_FREE(ByteData, sizeof(BYTE)*lByteDataLen);
}
Пример #15
0
//付款收信
void	CMailManager::PayMoneyMail(CMail *pMail,CPlayer *pPlayer)							
{
	char   strSysMsg[128];	
	if (pPlayer==NULL || pMail->GetGold()==0)
		return;
	_snprintf(strSysMsg, 128, CStringReading::LoadString(IDS_WGS_SYSMAIL,STR_WS_SYSMAIL_SIXTH));

	long lPayGold = pMail->GetGold();
	string strReceiver;
	string strSubject = strSysMsg;
	strReceiver = pMail->GetWriter();
	tagMailParam *ptgMailParam = OBJ_CREATE(tagMailParam);
	ptgMailParam->lType = SENDGOLD_MAIL;
	ptgMailParam->lGold = lPayGold;
	ptgMailParam->strWriter = pPlayer->GetName();
	ptgMailParam->strReceiverList.push_back(strReceiver);
	ptgMailParam->WriterGuid = pPlayer->GetExID();
	ptgMailParam->strSubject=strSubject;

	CMail *pPayMail = MP_NEW CMail(ptgMailParam);
	if(AddMail(pPayMail,pPlayer))
	{
		pMail->SetGold(0);
		if (pMail->GetMGoodsContainer().size()>0)
		{
			pMail->SetType(AFFIX_MAIL);
		}
		else
		{
			pMail->SetType(COMMON_MAIL);
		}


		SendPayMailMsg(pMail->GetExID(),BYTE(AFFIX_MAIL),pPlayer);

		CMessage msg(MSG_S2W_MAIL_PAY);
		msg.Add(pMail->GetExID());
		msg.Send();

	}	
}
Пример #16
0
///  针对野战相位创建
void  PhaseManager::CreatePhase(CPlayer* player, 
                                float size1 ,
                                float size2 ,
                                eTrigger trigger,
                                const char* Scriptfile)
{
      PhaseOpen(RNULL);
  
      if (!player || player->GetPhaseID() != NULL_GUID )
      {
          Log4c::Error(ROOT_MODULE,"%-15s Player name %s ReCreatePhase",__FUNCTION__, player->GetName() );
          return ;
      }

      const CGUID& team_id = player->GetTeamID();
      GSTeam *team = GetOrganiCtrl()->GetGameTeamByID( team_id );

      /// 如果不是单独的一个人  而且 又不是队长不能创建相位
      if( team_id != NULL_GUID && (team == NULL || team->GetLeader()!= player->GetExID()) )
      {
          Log4c::Error(ROOT_MODULE,"%-15s eFight Phase Create Failed ! player % s is not team leader",__FUNCTION__, player->GetName() );
          return ;
      }

      if ( player->IsDied() ) return ;

      /// 相位初始化
      PhasePro* TempPro = OBJ_CREATE(PhasePro) ;// new PhasePro();
      if( TempPro != NULL )
      {   
          m_PhaseList[ TempPro->GetID() ] = TempPro;
          TempPro->Init(player,team, 0 , size1 , size2 , eFight,trigger);
          TempPro->RunScript(player, Scriptfile ); 

          Log4c::Trace(ROOT_MODULE, "eFight Phase { %s } Create Successed ! player % s is team leader" , 
              TempPro->GetID().tostring() , player->GetName() );
      }
}
Пример #17
0
//分配一个CMonster*
CBaseObject* GameManager::CreateObject(long typeID,const CGUID& guid, const char *pInfo)
{
	int *nNum = 0;
	CBaseObject* pObject = NULL;

	switch(typeID)
	{
	case TYPE_GOODS:		// 物品
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_GoodsList.end() == m_GoodsList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CGoods), pInfo);
			new(pObject)CGoods();*/
			pObject = OBJ_CREATE(CGoods);
			m_GoodsList[guid] = pObject;
		}
		break;

	case TYPE_COLLECTION:
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_CollectionList.end() == m_CollectionList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CCollection), pInfo);
			new(pObject)CCollection();*/
			pObject = OBJ_CREATE(CCollection);
			m_CollectionList[guid] = pObject;
		}
		break;

	case TYPE_MONSTER:		// 怪物
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_MonsterList.end() == m_MonsterList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CMonster), pInfo);
			new(pObject)CMonster;*/
			pObject = OBJ_CREATE(CMonster);
			m_MonsterList[guid] = pObject;
		}
		break;

	case TYPE_PLAYER:		// 玩家
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_PlayerList.end() == m_PlayerList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CPlayer), pInfo);
			new(pObject)CPlayer();*/
			pObject = OBJ_CREATE(CPlayer);
			m_PlayerList[guid] = pObject;
		}
		break;

	case TYPE_REGION:		// 地图
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_RegionList.end() == m_RegionList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CRegion), pInfo);
			new(pObject)CRegion(guid);*/
			pObject = OBJ_CREATE(CRegion);
			m_RegionList[guid] = pObject;
		}
		break;

	case TYPE_BUILD:
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_BuildList.end() == m_BuildList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CBuild), pInfo);
			new(pObject)CBuild();*/
			pObject = OBJ_CREATE(CBuild);
			m_BuildList[guid] = pObject;
		}
		break;

	case TYPE_CITYGATE:
		{
			//! 如果断言失败,说明为同一个GUID已经分配了一块内存,再次分配会产生内存泄露
			assert(m_GateList.end() == m_GateList.find(guid));

			/*pObject = (CBaseObject*)m_MultiMemPool.Multi_Alloc(sizeof(CGate), pInfo);
			new(pObject)CGate();*/
			pObject = OBJ_CREATE(CGate);
			m_GateList[guid] = pObject;
		}
		break;

	default:
		return NULL;
	}

	pObject->SetExID(guid);
	pObject->SetType(typeID);

	return pObject;
}
Пример #18
0
//同意赠送
void	CMailManager::AgreeToPresent(CMail *pMail,CPlayer *pPlayer,BYTE bType)
{
	long lNum = 0;//计算元宝数量
	if (pPlayer==NULL)
		return;

	if (bType==0)
	{
		if (CheckPresentGoods(pMail,pPlayer,lNum))
		{
			//成功
			CMessage msg(MSG_S2C_MAIL_PRESENT_OK);
			msg.Add(pMail->GetExID());
			msg.Add(lNum);
			msg.SendToPlayer(pPlayer->GetExID());
		} 
		else
		{
			//存在过期道具
			CMessage msg(MSG_S2C_MAIL_PRESENT_FAILED);
			msg.Add(pMail->GetExID());
			msg.Add((long)pMail->GetSGood().size());
			list<tagSGoods*>::iterator it=pMail->GetSGood().begin();
			for (; it!=pMail->GetSGood().end();++it)
			{
				msg.Add((*it)->lIndex);
				msg.Add((*it)->lNum);
			}
			msg.SendToPlayer(pPlayer->GetExID());
		}
	}
	else
	{	
		CheckPresentGoods(pMail,pPlayer,lNum);
		if (lNum>pPlayer->GetYuanbao())
		{
			char* strRes=CStringReading::LoadString(22,22);
			if(strRes)
				pPlayer->SendNotifyMessage(strRes);
			return;
		}
		char   strSysMsg[128];	
		
		_snprintf(strSysMsg, 128, CStringReading::LoadString(IDS_WGS_SYSMAIL,STR_WS_SYSMAIL_SEVENTH),pMail->GetSubject().c_str());

		tagMailParam *ptgMailParam = OBJ_CREATE(tagMailParam);
		CMail *pSendMail = MP_NEW CMail(ptgMailParam);
		string strReceiver = pMail->GetWriter();
		pSendMail->SetExID(pMail->GetExID());
		pSendMail->SetWriter(pPlayer->GetName());
		pSendMail->SetReceiverList(strReceiver.c_str());
		pSendMail->SetType(PRESENT_MAIL);
		pSendMail->SetSubject(strSysMsg);

		pSendMail->SetSGoods(pMail->GetSGood());

		if(AddMail(pSendMail))
		{
			list<CGUID> lGuid;
			lGuid.push_back(pMail->GetExID());
			DeleteMailToWS(lGuid,pPlayer);
		}		
	}		
}
Пример #19
0
void DoC2SMailSend( CMessage *pMsg )
{
	CPlayer *pPlayer = pMsg->GetPlayer();
	if (NULL == pPlayer)
	{
		return;
	}
	//玩家在交易或摆摊中不能交易
	if (pPlayer->GetCurrentProgress()==CPlayer::PROGRESS_OPEN_STALL || pPlayer->GetCurrentProgress()==CPlayer::PROGRESS_TRADING )
	{
		return;
	}

	CGUID NpcGuid = NULL_GUID;
	pMsg->GetGUID(NpcGuid);

	CServerRegion *pRegion = pMsg->GetRegion();
	if (NULL==pRegion)
	{
		return;
	}
	CBaseObject *pShape = pRegion->FindChildObject(TYPE_MONSTER,NpcGuid);

	CMonster *pMailNpc = dynamic_cast<CMonster*>(pShape);

	//if (pMailNpc && strcmp(pMailNpc->GetOriginName(),"10000Email")==0  && pMailNpc->Distance( pPlayer ) < 8)//  --attention
	//{


	tagMailParam *pMailParam = OBJ_CREATE(tagMailParam);

	long lReceiver	= pMsg->GetLong();						//收信人个数
	if (lReceiver > 100)
	{
		return;
	}

	for (int i=0; i<lReceiver; ++i)
	{
		char strReceiver[128];
		pMsg->GetStr(strReceiver,GlobalSetup::GetSetup()->lMaxName+1);

		if (lstrlen(strReceiver)>=GlobalSetup::GetSetup()->lMaxName)
		{
			GameManager::GetInstance()->GetMailManager()->SendMailFailedToClient(pPlayer->GetExID(),MAIL_SENDING_FAILED_INVALID_MAXNAME);
			continue;
		}
		list<string>::iterator it= find((pMailParam->strReceiverList).begin(),(pMailParam->strReceiverList).end(),strReceiver);//           (pMailParam->strReceiverList).f
		if (it==(pMailParam->strReceiverList).end())
		{
			(pMailParam->strReceiverList).push_back(strReceiver);
		}				
	}
	char strTemp[2048];
	pMsg->GetStr(strTemp,GlobalSetup::GetSetup()->lMaxSubject+1);								//主题
	if (lstrlen(strTemp)>=GlobalSetup::GetSetup()->lMaxSubject)
	{
		GameManager::GetInstance()->GetMailManager()->SendMailFailedToClient(pPlayer->GetExID(),MAIL_SENDING_FAILED_INVALID_MAXSUBJECT);
		return;
	}
	pMailParam->strSubject	= strTemp;


	pMsg->GetStr(strTemp,GlobalSetup::GetSetup()->lMaxText+1);							//内容
	if (lstrlen(strTemp)>=GlobalSetup::GetSetup()->lMaxText)
	{
		GameManager::GetInstance()->GetMailManager()->SendMailFailedToClient(pPlayer->GetExID(),MAIL_SENDING_FAILED_INVALID_MAXTEXT);
		return;
	}

	pMailParam->strText			= strTemp;

	pMailParam->lGold			= pMsg->GetLong();			//金币
	pMailParam->lType			= pMsg->GetByte();			//类型


	////普通物品
	long lCGoodNum	= pMsg->GetLong();	

	if (lCGoodNum>MAXGOODNUM)
	{
		char pszGuid[50]="";
		pPlayer->GetExID().tostring(pszGuid);
		Log4c::Warn(ROOT_MODULE,FormatText("GS_GOODS_91",pPlayer->GetName(),pszGuid,lCGoodNum));//%s(ID:%s) 玩家发送物品的数量:%d超过限制(此玩家利用非常规方式发送消息)

		OBJ_RELEASE(tagMailParam, pMailParam);
		return;
	}
	for (int i=0; i<lCGoodNum; ++i)
	{		
		listGoods *ptgGoods = OBJ_CREATE(listGoods);
		pMsg->GetGUID(ptgGoods->goodsguid);
		ptgGoods->lNum = pMsg->GetLong();
		ptgGoods->lContainerID = pMsg->GetDWord();
		ptgGoods->lPos	= pMsg->GetDWord();
		pMailParam->Goodslist.push_back(ptgGoods);
	}
	//}
	pMailParam->strWriter = pPlayer->GetName();
	pMailParam->WriterGuid = pPlayer->GetExID();
	pMailParam->bReject = 1;


	//! 发信			
	CMail *pMail = OBJ_CREATE_PVOID(CMail, (void*)pMailParam);

	if (pMail->GetType()==SYSTEM_MAIL || pMail->GetGold()<0 || pMail->GetType()>=SENDGOLD_MAIL)
	{
		pMail->DeleteMailGoods();
		OBJ_RELEASE(CMail, pMail);
		return;
	}			

	GameManager::GetInstance()->GetMailManager()->AddMail(pMail,pPlayer);//“在这里发送 MSG_S2W_MAIL_SEND 消息给 worldserver
	//	}
}