#include "StdAfx.h" #include "../entity/Actor.h" #include "TeamSystem.h" /// 附近玩家最大人数 #define MAX_NEAR_ACTOR_COUNT 30 /// 一键邀请最大人数 #define MAX_NOTEAM_ACTOR_COUNT 10 template<> const CTeamSystem::Inherid::OnHandleSockPacket CTeamSystem::Inherid::Handlers[]= { &CTeamSystem::HandleError, // 0 &CTeamSystem::GetMyTeamInfo, //1 cGetMyTeamInfo 16-11 &CTeamSystem::HandleInvite, // 2 cInviteJoinTeam &CTeamSystem::HandleLeave, // 3 cLeaveTeam &CTeamSystem::HandleApplyJoinTeam, // 4 cApplyJoinTeam &CTeamSystem::HandleSetCaptin, // 5 cSetCaptin &CTeamSystem::HandleKickMember, // 6 cKickMember &CTeamSystem::HandleDestroyTeam, // 7 cDestroyTeam &CTeamSystem::HandleApplyJoinTeamReply, // 8 cApplyJoinTeamReply &CTeamSystem::HandleGetAllowTeamState, //9 cGetAllowTeamState &CTeamSystem::HandleSetIsAllow, // 10 cIsAutoTeam &CTeamSystem::GetNearTeamInfo, // 11 cAskNearTeamInfo附近队伍 }; void CTeamSystem::OnEnterGame() { nUpdataDt = GetGlobalLogicEngine()->getMiniDateTime(); CTeam* pTeam = m_pEntity->GetTeam(); //这个队伍在存在的话 if(pTeam) { if(pTeam->IsTeamValid()) { if(!pTeam->AddMember(m_pEntity, false)) { m_pEntity->SetProperty(PROP_ACTOR_TEAM_ID, 0); } pTeam->SendMemberData(m_pEntity); } else { m_pEntity->SetProperty(PROP_ACTOR_TEAM_ID, 0); } } m_nInit = true; } bool CTeamSystem::Initialize(void *data,SIZE_T size) { if(data ==NULL) return false; PACTORDBDATA pActorData = (ACTORDBDATA *)data; if(pActorData ==NULL || size != sizeof(ACTORDBDATA)) { OutputMsg(rmError,_T("data len error len=%d ,correct len=%d"),size, sizeof(ACTORDBDATA)); return false; } m_nUpdateActorListDt = 0; m_nAllowTeam = 0; m_nInit = false; m_NearTeam.clear(); m_NoTeamActor.clear(); //玩家上线的时候,如果在队伍里话,需要找到他的队伍 unsigned int nTeamID = pActorData->nTeamID; if(nTeamID == 0) return true; bool flag = false; // 是否加入了队伍 CTeam * pTeam = GetGlobalLogicEngine()->GetTeamMgr().GetTeam(nTeamID); //这个队伍在存在的话 if(pTeam) { if(pTeam->GetActorIndex( m_pEntity->GetProperty(PROP_ENTITY_ID) ) >=0 ) { flag = true; } } //如果玩家加入队伍失败,设置它的装备为没有加入队伍 if(!flag) { m_pEntity->SetProperty(PROP_ACTOR_TEAM_ID,0); m_pEntity->SetSocialMask(smTeamMember,false); } m_pEntity->SetSocialMask(smTeamCaptin,false); //上来肯定不是队长了 return true; } void CTeamSystem::BroadCast(void * data,SIZE_T size) { CTeam * pTeam = m_pEntity->GetTeam(); if(pTeam) { pTeam->BroadCast(data,size); } else { //CActor* pActor = (CActor*)m_pEntity; //int nTeamId = pActor->GetProperty(PROP_ACTOR_TEAMFUBEN_TEAMID); //FubenTeam *pTeam = GetGlobalLogicEngine()->GetFuBenMgr()->GetTeam(nTeamId); //if(pTeam) //{ // GetGlobalLogicEngine()->GetFuBenMgr()->TeamFubenBroadCast(pTeam,data,size); //} else //{ m_pEntity->SendTipmsgFormatWithId(tmTeamChatFail,tstFigthing); //提示对方无法使用队伍频道 //} } } void CTeamSystem::Destroy() { //玩家在下线的时候要通知队伍自己下线了 if(m_pEntity ==NULL) return; CTeam * pTeam = m_pEntity->GetTeam(); if(pTeam && m_nInit) { pTeam->SetUserOffline(m_pEntity); } } void CTeamSystem::ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet ) { if(m_pEntity == NULL) return; //系统没有初始化完毕 if(nCmd >= 0 && nCmd < ArrayCount(CTeamSystem::Inherid::Handlers)) { (this->*Handlers[nCmd] )(packet); } } void CTeamSystem::HandleGetAllowTeamState(CDataPacketReader& packet) { CActorPacket pack; CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(pack); data << (BYTE)enTeamSystemID <<(BYTE)enTeamSystemsGetAllowTeam <<(BYTE)m_nAllowTeam; pack.flush(); } //邀请加入队伍 void CTeamSystem::HandleInvite(CDataPacketReader &packet) { CEntityManager* pEntityMgr = GetGlobalLogicEngine()->GetEntityMgr(); int nOpenLevel = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nTeamOpenLevel; if (!m_pEntity->CheckLevel(nOpenLevel,0)) { m_pEntity->SendTipmsgFormatWithId(tmTeamLevelLimited,tstUI,nOpenLevel); return; } ACTORNAME name; unsigned int nActorId = 0; packet.readString(name,sizeof(name)); //读取名字 packet >> nActorId; CActor* pMember = NULL; if(nActorId > 0 ) { pMember = pEntityMgr->GetEntityPtrByActorID(nActorId); } if(!pMember) { pMember = pEntityMgr->GetActorPtrByName(name); } //pMember= pEntityMgr->GetActorPtrByName(name); if(pMember ==NULL) { m_pEntity->SendTipmsgFormatWithId(tmTeamOpOfflineUser,tstUI,name); return; } if(pMember == m_pEntity) { m_pEntity->SendTipmsgFormatWithId(tmCanNotOPOnSelf,tstUI); //不能对自己操作 return ; } if(((CActor *)pMember)->HasState(esStateTeamFuben) ) { m_pEntity->SendTipmsgFormatWithId(tpInTeamFuben,tstUI); return ; } InviteJoinTeam(pMember); // BYTE type; // packet >> type; // if (type) // { // ACTORNAME name; // packet.readString(name,sizeof(name)); //读取名字 // CActor *pMember= pEntityMgr->GetActorPtrByName(name); // if(pMember ==NULL) // { // m_pEntity->SendOldTipmsgFormatWithId(tpTeamOpOfflineUser,ttFlyTip,name); // return; // } // if(pMember == m_pEntity) // { // m_pEntity->SendOldTipmsgWithId(tpCanNotOPOnSelf,ttFlyTip); //不能对自己操作 // return ; // } // if(((CActor *)pMember)->HasState(esStateTeamFuben) ) // { // m_pEntity->SendOldTipmsgWithId(tpInTeamFuben,ttFlyTip); // return ; // } // InviteJoinTeam(pMember); // } // else // { // for (INT_PTR i = m_NoTeamActor.count() - 1; i >= 0; --i) // { // CActor *pMember = pEntityMgr->GetEntityPtrByActorID(m_NoTeamActor[i]); // if(pMember == NULL || pMember == m_pEntity) // continue; // if(pMember->HasState(esStateTeamFuben) ) // continue; // InviteJoinTeam(pMember); // } // } } //退出队伍 void CTeamSystem::HandleLeave(CDataPacketReader &packet) { //退出队伍 CTeam * pTeam = m_pEntity->GetTeam(); if(pTeam ) { if (pTeam->IsChallenge()) { m_pEntity->SendTipmsgFormatWithId(tmInChallengeCannotLeft,ttFlyTip); return; } pTeam->DelMember(m_pEntity->GetId()); } // SetAllowTeam(0); } //申请加入队伍 void CTeamSystem::HandleApplyJoinTeam(CDataPacketReader &packet) { int nOpenLevel = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nTeamOpenLevel; if (!m_pEntity->CheckLevel(nOpenLevel,0)) { m_pEntity->SendTipmsgFormatWithId(tmTeamLevelLimited,tstUI,nOpenLevel); return; } BYTE type = 1; CActor *pMember = nullptr; unsigned int nActorId = 0; if (type) { //自己申请加入别人的队伍 //packet.readString(name,sizeof(name)); //读取名字 packet >> nActorId; pMember = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorId); if(pMember ==NULL) { m_pEntity->SendTipmsgFormatWithId(tmTeamApplyOfflineUser,tstUI); return ; } /*CFuBen* pFb = pMember->GetFuBen(); if (pFb && pFb->IsFb()) { pMember->SendOldTipmsgWithId(tpInFubenCanNotJoinTeam); return; }*/ //在擂台不能加入 if(pMember == m_pEntity) { m_pEntity->SendTipmsgFormatWithId(tmCanNotOPOnSelf,tstUI); //不能对自己操作 return; } } //自己已经在队伍中了 if(m_pEntity->GetProperty(PROP_ACTOR_TEAM_ID) ) { m_pEntity->SendTipmsgFormatWithId(tmTeamSelfIsInTeam,tstUI); //不能对自己操作 return; } if (m_pEntity->HasState(esStateTeamFuben)) { m_pEntity->SendTipmsgFormatWithId(tmHasFubenTeam, tstUI); return ; } if (type) { CTeam * pTeam = pMember->GetTeam(); if(pTeam ==NULL) { m_pEntity->SendTipmsgFormatWithId(tmTeamApplyNotTeamUser,tstUI, pMember->GetEntityName()); return ; } ApplyJoinOneTeam(pTeam); } // else // 批量申请附近队伍 // { // CTeamManager& teamMgr = GetGlobalLogicEngine()->GetTeamMgr(); // for (std::map::const_iterator it = m_NearTeam.begin(); it != m_NearTeam.end(); ++it) // { // CTeam* pTeam = teamMgr.GetTeam(it->first); // if (pTeam && pTeam->GetMemberCount() < pTeam->GetTeamMaxMemberCount()) // { // ApplyJoinOneTeam(pTeam); // } // } // } } void CTeamSystem::ApplyJoinOneTeam(CTeam* pTeam) { if (!pTeam) return; if (pTeam->IsChallenge()) { m_pEntity->SendTipmsgFormatWithId(tmInChallengeCannotJoin,tstUI); return; } //队伍在副本中 /*if (pTeam->GetFubenStatus() == tsWar) { m_pEntity->SendOldTipmsgWithId(tpTeamInFubenCanNotAddMember); return; }*/ if(pTeam->GetMemberCount() >= pTeam->GetTeamMaxMemberCount()) { m_pEntity->SendTipmsgFormatWithId(tmTeamIsFull,tstUI); return; } CActor * pCaptin = pTeam->GetCaptin(); //队长 if(pCaptin ==NULL) return; //没有队长,出现了问题 // if (pCaptin->GetMiscSystem().GetGameSetting(GAME_SETTING_TYPE_BASE, GAME_SETTING_TYPE_BASE_AUTO_INVITETEAM) > 0) // { // pTeam->AddMember(m_pEntity); // } // else { //向队长发消息,申请入队 CActorPacket pack; CDataPacket &data = pCaptin->AllocPacket(pack); data << (BYTE)enTeamSystemID << (BYTE)enTeamSystemsApplyJoinTeam << (unsigned int) m_pEntity->GetId(); // data << (BYTE)m_pEntity->GetProperty(PROP_CREATURE_LEVEL); //等级 // data << (BYTE)m_pEntity->GetProperty(PROP_ACTOR_VOCATION); //职业 data.writeString(m_pEntity->GetEntityName()); pack.flush(); m_pEntity->SendTipmsgFormatWithId(tmTeamApplySuccess, tstUI); } SetAllowTeam(1); } //设置队长 void CTeamSystem::HandleSetCaptin(CDataPacketReader &packet) { unsigned int nActorID = 0; packet >> nActorID; CTeam * pTeam; bool isCaptin = CheckIsCaptin(pTeam); if(isCaptin) { //如果正在擂台,不能换队长 if (pTeam->IsChallenge()) { m_pEntity->SendTipmsgFormatWithId(tmInChallengeCannotChangeCaptin); return; } CActor* pActor = pTeam->GetActorByID(nActorID); if(pActor == NULL) { m_pEntity->SendTipmsgFormatWithId(tmTeamOfflineUserCannotCaptin,tstUI); return ; } if(pActor == m_pEntity) { m_pEntity->SendTipmsgFormatWithId(tmCanNotOPOnSelf,tstUI); //不能对自己操作 return ; } pTeam->SetCaptin(pActor);//设置这个玩家为队长 } } //踢人 void CTeamSystem::HandleKickMember(CDataPacketReader &packet) { unsigned int nActorID =0; packet >> nActorID; CTeam * pTeam; bool isCaptin = CheckIsCaptin(pTeam); if(isCaptin) { if (pTeam->IsChallenge()) { m_pEntity->SendTipmsgFormatWithId(tmInChallengeCannotDelMember,tstUI); return; } if(m_pEntity != pTeam->GetCaptin()) { m_pEntity->SendTipmsgFormatWithId(tmNotTeamFubenCaptain, tstUI); return; } if(nActorID == m_pEntity->GetId()) { m_pEntity->SendTipmsgFormatWithId(tmCanNotOPOnSelf, tstUI); return; } pTeam->DelMember(nActorID); //提出一个人出队伍 } } bool CTeamSystem::CheckIsCaptin(CTeam* & pTeam,bool bWithTipmsg) { pTeam = m_pEntity->GetTeam(); if(pTeam == NULL) { if(bWithTipmsg) { m_pEntity->SendTipmsgFormatWithId(tmTeamNotInTeam,tstUI); } return false; } //需要队长才能操作 else if(m_pEntity != pTeam->GetCaptin()) { if(bWithTipmsg) { m_pEntity->SendTipmsgFormatWithId(tmTeamNeedCaptin,tstUI); } return false; } else { return true; } } //解散队伍 void CTeamSystem::HandleDestroyTeam(CDataPacketReader &packet) { CTeam * pTeam; bool isCaptin = CheckIsCaptin(pTeam); if(isCaptin) { pTeam->DestroyTeam(); } } //回复申请入队 void CTeamSystem::HandleApplyJoinTeamReply(CDataPacketReader &packet) { CTeam * pTeam; bool isCaptin = CheckIsCaptin(pTeam); if(isCaptin) { unsigned int nActorID = 0; BYTE bReplyResult=0; //处理的结果 packet >> nActorID >> bReplyResult; CActor * pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorID); if(pActor ==NULL) { m_pEntity->SendTipmsgFormatWithId(tmTeamOpOfflineUser,tstUI, ""); //玩家不在线 return; } if(pTeam->GetMemberCount() >= pTeam->GetTeamMaxMemberCount()) { m_pEntity->SendTipmsgFormatWithId(tmTeamIsFull,tstUI); pActor->SendTipmsgFormatWithId(tmTeamIsFull,tstUI); return; } if(bReplyResult) { //这个玩家已经有队伍了,如果队伍是当前队伍的话,那么情况出现在玩家下线再上线的时候 CTeam *pCurrentTime = pActor->GetTeam(); if(pCurrentTime)//如果已经加入了别人的队伍 { return; } { pTeam->AddMember(pActor); } } else // 拒绝加入 { pActor->SendTipmsgFormatWithId(tmTeamRefuseApply,tstUI,m_pEntity->GetEntityName()); } } } void CTeamSystem::HandleSetIsAllow(CDataPacketReader& packet) { BYTE result = 0; packet >> result; m_nAllowTeam = (int)result; } void CTeamSystem::SetAllowTeam(int type) { m_nAllowTeam = type; } //回复邀请入队 void CTeamSystem::HandleInviteJoinTeamReply(CDataPacketReader &packet) { //自己已经在队伍中了,不能再加入别的队伍 CTeam* pMyTeam = m_pEntity->GetTeam(); if(pMyTeam && pMyTeam->GetMemberCount() > 0) { m_pEntity->SendTipmsgFormatWithId(tmTeamSelfIsInTeam,ttFlyTip); return; } ACTORNAME name; packet.readString(name,sizeof(name)); //读取名字 BYTE bResylt=0,bAuto = 0; //是否同意,0:非自动,1:自动同意 packet >> bResylt; // packet >> bAuto; CActor *pMember= GetGlobalLogicEngine()->GetEntityMgr()->GetActorPtrByName(name); if(pMember == NULL) { //邀请自己的人已经下线 m_pEntity->SendTipmsgFormatWithId(tmTeamOpOfflineUser,tstUI,name); return ; } if( !bResylt ) //如果是拒绝 { //xx拒绝绝加入队伍 pMember->SendTipmsgFormatWithId(tmOtherRefuseJoinTeam,tstUI,m_pEntity->GetEntityName()); return; } if (pMyTeam && pMyTeam->GetMemberCount() <= 1) { pMyTeam->DelMember(m_pEntity->GetId());//先退出自己的队伍 } CTeam * pTeam= pMember->GetTeam(); if( pTeam ) //队伍 { if(pTeam->GetMemberCount() >= pTeam->GetTeamMaxMemberCount()) { m_pEntity->SendTipmsgFormatWithId(tmTeamIsFull,tstUI); return; } ////如果队伍已经在副本中,不能新增队员 //int status = pTeam->GetFubenStatus(); //if ( status == tsReady) //{ // //判断能否加入队伍 // CScriptValueList paramList; // m_pEntity->InitEventScriptVaueList(paramList,aeAddToFubenTeam); // paramList << pTeam->GetTeamID(); // m_pEntity->OnEvent(paramList,paramList); //} //else { if (pTeam->AddMember(m_pEntity) ) { // if(bAuto) // { // CActor* pCaptin = pTeam->GetCaptin(); // LPCSTR sName = pCaptin?pCaptin->GetEntityName():""; // m_pEntity->SendTipmsgFormatWithId(tmTeamJoinTeam,stsUI,sName); // } } } } else //否则创建一个队伍 { pTeam = CreateTeam(pMember); //自己是个队员而已 if(pTeam!=NULL && pTeam->AddMember(m_pEntity) ) { // if (bAuto) // { // m_pEntity->SendTipmsgFormatWithId(tmTeamJoinTeam,tstUI,pMember->GetEntityName()); // } } } } void CTeamSystem::AskCreateTeam(CDataPacketReader & packet) { CreateTeam(); } //创建队伍 CTeam *CTeamSystem::CreateTeam(CActor* pMember) { int nOpenLevel = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nTeamOpenLevel; if (!m_pEntity->CheckLevel(nOpenLevel,0)) { m_pEntity->SendTipmsgFormatWithId(tmTeamLevelLimited,tstUI,nOpenLevel); return nullptr; } if (!pMember) { pMember = m_pEntity; } if(!pMember) return nullptr; CTeam* pTeam = pMember->GetTeam(); if (pTeam) // 已经有队伍 { return nullptr; } if (pMember->HasState(esStateTeamFuben)) { pMember->SendTipmsgFormatWithId(tmHasFubenTeam, tstUI); return nullptr; } CScene* pScene = pMember->GetScene(); int x,y; pMember->GetPosition(x,y); if (pScene && pScene->HasMapAttribute(x,y,aaNotCreateTeam)) { return nullptr; } unsigned int nTeamID; pTeam = GetGlobalLogicEngine()->GetTeamMgr().CreateTeam(nTeamID); if(!pTeam) return nullptr; //创建队伍失败 pTeam->AddMember(pMember); //自己是队长 pMember->SendTipmsgFormatWithId(tmTeamCreated, tstUI); return pTeam; } void CTeamSystem::TeamMoveBroadcast( ) { //如果没有初始化就不发 if (!m_pEntity || m_pEntity->IsInited() ==false) return; CTeam* pTeam = m_pEntity->GetTeam(); if (pTeam) { int nDis = GetLogicServer()->GetDataProvider()->GetGlobalConfig().teamLootMaxDistanceSquare; char data[32]; char Selfdata[32]; //发送给自己的信息,告诉自己和别人的关系 int nActorId = m_pEntity->GetProperty(PROP_ENTITY_ID); CDataPacket pack(data,sizeof(data)); CDataPacket selfPack(Selfdata,sizeof(Selfdata)); int x, y; m_pEntity->GetPosition(x,y); pack << (BYTE)enTeamSystemID << (BYTE)enTeamSystemsMemberMove << (unsigned int)nActorId << (int)m_pEntity->GetSceneID() << (WORD)x << (WORD)y; BYTE* pDis = (BYTE*)pack.getOffsetPtr(); pack << (BYTE)0;//是否超出了经验共享范围,0:超出,1未超出 selfPack << (BYTE)enTeamSystemID << (BYTE)enTeamSystemsMemberMove; unsigned int* pOtherId = (unsigned int*)selfPack.getOffsetPtr(); selfPack << (int)0; int* pSceneId = (int*)selfPack.getOffsetPtr(); selfPack << (int)0; WORD* pX = (WORD*)selfPack.getOffsetPtr(); selfPack << (WORD)0; WORD* pY = (WORD*)selfPack.getOffsetPtr(); selfPack << (WORD)0; BYTE* pSelfDis = (BYTE*)selfPack.getOffsetPtr(); selfPack << (BYTE)0;//是否超出了经验共享范围,0:超出,1未超出 const TEAMMEMBER* pMembers = pTeam->GetMemberList(); for (INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT ; i++) { CActor* pOtherActor = pMembers[i].pActor; if( pOtherActor && pOtherActor != m_pEntity && pOtherActor->IsInited() && pOtherActor->GetTeam() == pTeam) { *pDis = *pSelfDis = m_pEntity->GetEntityDistanceSquare(pOtherActor) <= nDis?1:0; pOtherActor->SendData(data,pack.getPosition()); *pOtherId = pOtherActor->GetProperty(PROP_ENTITY_ID); *pSceneId = (int)pOtherActor->GetSceneID(); pOtherActor->GetPosition(x,y); *pX = (WORD)x; *pY = (WORD)y; m_pEntity->SendData(Selfdata,selfPack.getPosition()); } } //pTeam->UpdateBufMember(); } } void CTeamSystem::InviteJoinTeam(CActor* pMember ) { if (!pMember) { return; } int nOpenLevel = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nTeamOpenLevel; if (!pMember->CheckLevel(nOpenLevel,0)) { m_pEntity->SendTipmsgFormatWithId(tmOtherTeamLevelLimited,tstUI,nOpenLevel); return; } CTeam* pMyTeam = m_pEntity->GetTeam(); if(pMyTeam) { if( pMyTeam->GetMemberCount() >= pMyTeam->GetTeamMaxMemberCount()) { m_pEntity->SendTipmsgFormatWithId(tmTeamIsFull,tstUI); return; } } CTeam* pTeam = pMember->GetTeam(); if (pTeam && pTeam->GetMemberCount() > 0) //队伍只有自己,可以直接退出原有的队伍,加入新队伍 { m_pEntity->SendTipmsgFormatWithId(tmTeamIsInTeam,ttFlyTip,pMember->GetEntityName()); return ; } if(pMember->GetTeamSystem().IsAllowTeam()) { if( pMyTeam ) //队伍 { ////如果队伍已经在副本中,不能新增队员 //int status = pTeam->GetFubenStatus(); //if ( status == tsReady) //{ // //判断能否加入队伍 // CScriptValueList paramList; // m_pEntity->InitEventScriptVaueList(paramList,aeAddToFubenTeam); // paramList << pTeam->GetTeamID(); // m_pEntity->OnEvent(paramList,paramList); //} //else CActor* pCaptin = pMyTeam->GetCaptin(); if(!pCaptin) return; if(pCaptin->GetProperty(PROP_ENTITY_ID) != m_pEntity->GetProperty(PROP_ENTITY_ID)) { m_pEntity->SendTipmsgFormatWithId(tmTeamNeedCaptin, tstUI); return; } if (pMyTeam->AddMember(pMember) ) { CActor* pCaptin = pMyTeam->GetCaptin(); LPCSTR sName = pCaptin?pCaptin->GetEntityName():""; pMember->SendTipmsgFormatWithId(tmTeamJoinTeam,tstUI,sName); pMyTeam->SendMemberData(pMember); } } else //否则创建一个队伍 { pTeam = CreateTeam(m_pEntity); if(pTeam!=NULL && pTeam->AddMember(pMember) ) { CActor* pCaptin = pTeam->GetCaptin(); if(!pCaptin) return; m_pEntity->SendTipmsgFormatWithId(tmTeamJoinTeam,tstUI,pCaptin->GetEntityName()); pTeam->SendMemberData(m_pEntity,pMember); } } }else { m_pEntity->SendTipmsgFormatWithId(tmTeamRefuseApply, tstUI); // CActorPacket pack; // CDataPacket &data = pMember->AllocPacket(pack); // data << (BYTE)enTeamSystemID << (BYTE)enTeamSystemsInviteJoinTeam ; // data.writeString(m_pEntity->GetEntityName()); // // 邀请者等级 // // data << (WORD)m_pEntity->GetProperty(PROP_CREATURE_LEVEL); // data << m_pEntity->GetId(); // // data << (BYTE)m_pEntity->GetProperty(PROP_ACTOR_VOCATION); // pack.flush(); } } void CTeamSystem::GetMyTeamInfo(CDataPacketReader& packet) { if(m_pEntity == NULL) return; CTeam* myTeam = m_pEntity->GetTeam(); if(myTeam) { if(myTeam->IsTeamValid()) { myTeam->SendMemberData(m_pEntity); return; } } CActorPacket ap; CDataPacket& data = ((CActor*)m_pEntity)->AllocPacket(ap); data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsInitTeam; data<< (BYTE)0; ap.flush(); } void CTeamSystem::GetNearTeamInfo(CDataPacketReader & packet) { if (m_pEntity == NULL) { return; } unsigned int nNowDt = GetGlobalLogicEngine()->getMiniDateTime(); if(nNowDt < nUpdataDt + 5) { //return; } nUpdataDt = nNowDt; int nTeamCount = 0; const CVector& entityList = m_pEntity->GetObserverSystem()->GetVisibleList(); m_NearTeam.clear(); CTeam* pMyTeam = ((CActor*)m_pEntity)->GetTeam(); if(pMyTeam != NULL) //不能有自己的队伍 { int nTeamId = pMyTeam->GetTeamID(); m_NearTeam[nTeamId] = 1; } CActorPacket pack; CDataPacket &data = m_pEntity->AllocPacket(pack); data << (BYTE)enTeamSystemID << (BYTE)enTeamSystemsSendNearTeamInfo; size_t pos = data.getPosition(); data << (BYTE)0; //先随便写个数字,后面会写个正确的进来 for (INT_PTR i = 0; i < entityList.count(); i++) { CEntity* pEntity = GetEntityFromHandle(entityList[i].m_handle); if (pEntity && pEntity->GetType() == enActor && pEntity != m_pEntity) { CTeam* pTeam = ((CActor*)pEntity)->GetTeam(); if(pTeam != NULL) { CActor* pActor = pTeam->GetCaptin(); unsigned int nTeamId = pTeam->GetTeamID(); if(pActor != NULL && m_NearTeam.find(nTeamId) == m_NearTeam.end()) { data << (unsigned int)pActor->GetProperty(PROP_ENTITY_ID); data.writeString(pActor->GetEntityName()); data << (int)pActor->GetProperty(PROP_CREATURE_LEVEL); data << (BYTE)pActor->GetProperty(PROP_ACTOR_CIRCLE); data << (BYTE)pTeam->GetMemberCount(); CGuild* pMyGuild = pActor->GetGuildSystem()->GetGuildPtr(); data.writeString(pMyGuild ? pMyGuild->m_sGuildname : ""); //队长的公会名字 nTeamCount++; m_NearTeam[nTeamId] = 1; // 标记已经读取过的队伍 } } } } BYTE* pCount = (BYTE*)data.getPositionPtr(pos); *pCount = nTeamCount; pack.flush(); } void CTeamSystem::GetNearActorsInfo(CDataPacketReader & packet){ if (m_pEntity == NULL) { return; } unsigned int nNowDt = GetGlobalLogicEngine()->getMiniDateTime(); if(m_nUpdateActorListDt && nNowDt < m_nUpdateActorListDt + 30) { //return; } m_nUpdateActorListDt = nNowDt; const CVector& entityList = m_pEntity->GetObserverSystem()->GetVisibleList(); unsigned int nActorCount = 0; CActorPacket pack; CDataPacket &data = m_pEntity->AllocPacket(pack); data << (BYTE)enTeamSystemID << (BYTE)enTeamSystemsSendNearActorInfo; size_t pos = data.getPosition(); data << nActorCount; //先随便写个数字,后面会写个正确的进来 m_NoTeamActor.clear(); int nNoTeamCount = 0; for (INT_PTR i = 0; nActorCount < MAX_NEAR_ACTOR_COUNT && i < entityList.count(); i++) { CEntity* pEntity = GetEntityFromHandle(entityList[i].m_handle); if (pEntity && pEntity->GetType() == enActor && pEntity != m_pEntity) { CActor* pActor = (CActor*)pEntity; data.writeString(pActor->GetEntityName()); data << (WORD)pActor->GetProperty(PROP_CREATURE_LEVEL); // 队长职业 data << (BYTE)pActor->GetProperty(PROP_ACTOR_VOCATION); //职业 CGuild* pMyGuild = pActor->GetGuildSystem()->GetGuildPtr(); data.writeString(pMyGuild ? pMyGuild->m_sGuildname : ""); //队长的公会名字 CTeam* pTeam = pActor->GetTeam(); if (!pTeam && nNoTeamCount < MAX_NOTEAM_ACTOR_COUNT) { m_NoTeamActor.add(pActor->GetId()); ++nNoTeamCount; } data << (BYTE)!!pTeam; ++nActorCount; } } unsigned int* pCount = (unsigned int*)data.getPositionPtr(pos); *pCount = nActorCount; pack.flush(); }