#pragma once #include "StdAfx.h" #include "Team.h" bool CTeam::DelMemberBuf(CActor * pActor) { if(pActor ==NULL) return false; int nBuffId = GetTeamKillMonsterExpBuffId(pActor); if (nBuffId > 0) { pActor->GetBuffSystem()->RemoveById(nBuffId); } // 删除头衔buff for (unsigned int i = 0; i < m_nBuffCount; ++i) { pActor->GetBuffSystem()->RemoveById(m_BuffId[i]); } return true; } int CTeam::GetTeamKillMonsterExpBuffId(CActor* pActor) { if(pActor ==NULL) return false; for(INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT; i++) { int nBuffId = GetLogicServer()->GetDataProvider()->GetTeamKillMonsterExp().GetTeamKillMonsterExpBufId(i+1); CDynamicBuff * pBuff = pActor->GetBuffSystem()->GetBuffById(nBuffId); if(pBuff) { return pBuff->GetId(); } } return 0; } bool CTeam::UpdateBufMember() { bool bNeedUpdate = false; INT_PTR nOnlineCount = GetOnlineUserCount(); if(nOnlineCount < 1) return false; for(INT_PTR j=0; j< MAX_TEAM_MEMBER_COUNT; j++) { if(m_member[j].pActor && m_member[j].pActor->IsInited()) //在线玩家 { CActor * pActor = m_member[j].pActor; int nTeamMemberCount = 0; for(INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT; i++) { if(m_member[i].pActor && m_member[i].pActor->IsInited()) { unsigned int nActorId = m_member[i].pActor->GetProperty(PROP_ENTITY_ID); if(pActor->GetId() != nActorId) { //是否超出了经验共享范围 int nDis = GetLogicServer()->GetDataProvider()->GetGlobalConfig().teamLootMaxDistanceSquare; if(pActor->GetEntityDistanceSquare(m_member[i].pActor) <= nDis) { nTeamMemberCount++; } } } } if(nTeamMemberCount == 0) { //DelMemberBuf(pActor); } else { int nBuffId = GetLogicServer()->GetDataProvider()->GetTeamKillMonsterExp().GetTeamKillMonsterExpBufId(nTeamMemberCount); if(pActor->GetBuffSystem()->GetBuffById(nBuffId) == NULL) { bNeedUpdate = true; pActor->GetBuffSystem()->Append(nBuffId); //OutputMsg(rmWaning,"%s append id = %d",pActor->GetEntityName(), nBuffId); } } } } // std::map newBuffIdMap; // int oldBuffId[MAX_TEAM_BUFF]; // memcpy(oldBuffId, m_BuffId, sizeof(oldBuffId)); // //获取其他组队共享buff // for(INT_PTR i = 0; i < MAX_TEAM_MEMBER_COUNT; i++) // { // CActor* pActor = m_member[i].pActor; // if(pActor && pActor->IsInited() ) // { // pActor->GetNewTitleSystem().GetTeamBuffIds(newBuffIdMap); // break; // } // } // m_nBuffCount = 0; // for (std::map::iterator it = newBuffIdMap.begin(); m_nBuffCount < MAX_TEAM_BUFF - 1 && it != newBuffIdMap.end(); ++it) // { // m_BuffId[m_nBuffCount] = it->first; // if (m_BuffId[m_nBuffCount] != oldBuffId[m_nBuffCount]) // { // bNeedUpdate = true; // } // m_nBuffCount++; // } // if (bNeedUpdate) // { // for(INT_PTR i=0 ;i < MAX_TEAM_MEMBER_COUNT; i++) // { // CActor* pActor = m_member[i].pActor; // if(pActor && pActor->IsInited() ) // { // for (unsigned int i = 0; i < m_nBuffCount; ++i) // { // if (oldBuffId[i] != m_BuffId[i]) // { // pActor->GetBuffSystem()->RemoveById(oldBuffId[i]); // if(!pActor->GetBuffSystem()->GetBuffById(m_BuffId[i])) // { // pActor->GetBuffSystem()->Append(m_BuffId[i]); // } // } // } // char buff[64]; // CDataPacket data(buff,sizeof(buff)); // data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsSendBuffIds ; // data << (BYTE)(m_nBuffCount + 1); // data << (unsigned int)GetTeamKillMonsterExpBuffId(pActor);//把组队经验buff也下发 // data.writeBuf(m_BuffId, sizeof(int) * (m_nBuffCount)); // pActor->SendData(data.getMemoryPtr(),data.getPosition()); // } // } // } return true; } void CTeam::AddFriendIntimacyWithMember(CActor *pActor) { } void CTeam::SendMemberData(CActor * pActor, CActor* pMember, bool IsBroadcast ) { char pdata[512]; CDataPacket data(pdata, sizeof(pdata)); data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsInitTeam; //发送队伍成员的信息 int nTotalCount = GetMemberCount(); //总人数 data << (BYTE)nTotalCount;//队友的人数,不包括自己 for(int i = 0; i < MAX_TEAM_MEMBER_COUNT; ++i) { if(m_member[i].pActor && m_member[i].pActor->IsInited() ) //在线玩家 { CActor* pAc = m_member[i].pActor; data << (unsigned int)(pAc->GetProperty(PROP_ENTITY_ID)); data.writeString(pAc->GetEntityName()); data << (int)(pAc->GetProperty(PROP_CREATURE_LEVEL)); //等级 data << (BYTE)(pAc->GetProperty(PROP_ACTOR_CIRCLE)); //转生 data << (BYTE) (pAc->GetProperty(PROP_ACTOR_VOCATION)); //职业 data << (BYTE) (pAc->GetProperty(PROP_ACTOR_SEX)); //性别 data << (BYTE)1; int nSceneId = pAc->GetSceneID(); data << nSceneId;//场景ID data<< (unsigned int)pAc->GetProperty(PROP_CREATURE_MAXHP); //MAXHP data << (unsigned int)pAc->GetProperty(PROP_CREATURE_HP); // data << (unsigned int)(pAc->GetProperty(PROP_ACTOR_SUPPER_PLAY_LVL)); } else //离线玩家 { OFFLINETEAMMEMBER * pMsg = GetOffLineMsg(m_member[i].nActorID); if(pMsg) { data << pMsg->nActorID; //actorID data.writeString(pMsg->name); //名字 data << (int)pMsg->btLevel; //等级 data << (BYTE)pMsg->btCircle;//转生 data << (BYTE) pMsg->btVocation; //职业 data << (BYTE) pMsg->btSex; //把性别 data <<(BYTE) 0; //非在线状态 data <<(int)0; //当前地图 data <<(unsigned int)0; //血量百分比 data <<(unsigned int)0; //血量百分比 data << (unsigned int)(pMsg->nVip); } } } if(m_pCaptin) { data <<(unsigned int) m_pCaptin->GetProperty(PROP_ENTITY_ID); //把队长的actorID写入 } else { data << (unsigned int) 0; //还没有队长 } if(pMember) { CActorPacket ap; CDataPacket& dataPack= pMember->AllocPacket(ap); dataPack.writeBuf(pdata, data.getPosition()); ap.flush(); } if(pActor) { CActorPacket pack; CDataPacket& dataPack= pActor->AllocPacket(pack); dataPack.writeBuf(pdata, data.getPosition()); pack.flush(); } if(IsBroadcast) { BroadCast(data.getMemoryPtr(),data.getPosition()); } } bool CTeam::AddMember(CActor * pActor, bool isNewMember) { if(pActor ==NULL ) return false; if( pActor->IsInited() ==false) return false; //这个玩家已经有队伍了,如果队伍是当前队伍的话,那么情况出现在玩家下线再上线的时候 CTeam *pCurrentTime = pActor->GetTeam(); if(pCurrentTime && pCurrentTime != this)//如果已经加入了别人的队伍 { return false; } unsigned int nActorID = pActor->GetId(); //玩家的actorID if(nActorID == 0) return false; //bool validFlag =false; bool isOldMember = false; INT_PTR nIndex = GetActorIndex(nActorID); if(nIndex < 0 || isNewMember) //这个玩家不存在该队伍里 { //如果不能再加人了 if( GetTeamMaxMemberCount() - GetMemberCount() <= 0 ) { return false; } for(INT_PTR i = 0; i < MAX_TEAM_MEMBER_COUNT; ++i) { if(m_member[i].nActorID ==0 ) //空位 { nIndex = i; AddFriendIntimacyWithMember(pActor); break; } } } else { isOldMember = true; if(m_member[nIndex].pActor && m_member[nIndex].pActor->IsInited() ) //重复加入队伍,玩家已经在这个队伍里了,就不让添加 { return false; } } if(nIndex < 0) return false; //没有位置了 INT_PTR nOnlineCount = GetOnlineUserCount(); //第1个加入的人就是队长 if(nOnlineCount == 0) { m_pCaptin = pActor; pActor->SetSocialMask(smTeamCaptin,true); pActor->SetSocialMask(smTeamMember,false); } else { pActor->SetSocialMask(smTeamMember,true); } //如果有在线的人,那么需要通知在线的人有一个人加入了 m_member[nIndex].pActor = pActor; // 真正加入 m_member[nIndex].nActorID = nActorID; m_bOnlinemMemberCount ++; if( nOnlineCount > 0) { if(isNewMember) { BroadcastAddMember(pActor, (BYTE)1); //向在线的人广播这个玩家加入了队伍 } else { BroadcastMemberOnlineState(pActor,1); } } if(isOldMember) { ClearOffLineMsg(nActorID); //上线的时候要清掉离线消息 } SendMemberData(pActor); pActor->SetProperty(PROP_ACTOR_TEAM_ID,m_nTeamID); UpdateNameClr_OnJoinOrLeaveTeam(pActor->GetHandle(), m_nTeamID, true); pActor->GetTeamSystem().TeamMoveBroadcast(); pActor->GetTeamSystem().SetAllowTeam(1); //允许组队 return true; } //判断一个队伍是否是非法的 bool CTeam::IsTeamValid() { if(m_pCaptin ==NULL ) return false; if(m_pCaptin->IsInited() ==false) return false; //队长的指针无效 INT_PTR nOnlineCount =0; for(INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT; i++) { if( m_member[i].pActor ) { if(m_member[i].pActor->IsInited() ==false) { return false; } else { nOnlineCount ++; } } } if( nOnlineCount <=0 ) { return false; } else { return true; } } void CTeam::BroadCast(LPCVOID pData, INT_PTR nLen) { for(INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT; i++) { if(m_member[i].pActor && m_member[i].pActor->IsInited() ) { m_member[i].pActor->SendData(pData,nLen); } } } //并且广播经验加成buf图标 void CTeam::BroadCast(LPCVOID pData, INT_PTR nLen,INT_PTR nMyId ) { for(INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT; i++) { if(m_member[i].pActor && m_member[i].nActorID != nMyId) { m_member[i].pActor->SendData(pData,nLen); } } } //广播新增玩家 void CTeam::BroadcastAddMember(CActor* pActor, BYTE idx) { if(!pActor)return; char buff[256]; CDataPacket data(buff,sizeof(buff)); data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsAddMember; WriteActorInfo(pActor,data, idx); BroadCast(data.getMemoryPtr(),data.getPosition()); char sText1[1024]; LPCTSTR sFormat1 = GetLogicServer()->GetDataProvider()->GetTipmsgConfig().GetTipmsg(tmAddTeamMember); sprintf_s(sText1, sizeof(sText1), sFormat1, ( char *)pActor->GetEntityName()); BroadcastTipmsgArgs(pActor->GetId(), tmAddTeamMember, tstUI, pActor->GetEntityName()); SendTeamChatMsg(sText1); pActor->SendTipmsgFormatWithId(tmSelfAddTeam, tstUI); } //广播一个玩家上线 void CTeam::BroadcastMemberOnlineState(CActor* pActor, BYTE state) { if(!pActor)return; char buff[256]; CDataPacket data(buff,sizeof(buff)); data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsMemOnlineState; // data << (unsigned int)(pActor->GetProperty(PROP_ENTITY_ID)); // data << state; WriteActorInfo(pActor,data, 1); BroadCast(data.getMemoryPtr(),data.getPosition(), (unsigned int)(pActor->GetProperty(PROP_ENTITY_ID))); } void CTeam::BroadcastUpdateMember(CActor* pActor, int nPropId) { if(!pActor)return; char buff[256]; CDataPacket data(buff,sizeof(buff)); // data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsUpdateMember; data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsMemOnlineState; WriteActorInfo(pActor,data, 1); BroadCast(data.getMemoryPtr(),data.getPosition()); } void CTeam::WriteOffLineActorInfo(OFFLINETEAMMEMBER * pMsg,CDataPacket & data, BYTE idx) { // data <<(Uint64)0; //handle data << pMsg->nActorID; //actorID data.writeString(pMsg->name); //名字 data << (BYTE)pMsg->btLevel; //等级 data << (BYTE)pMsg->btCircle;//转生 data << (BYTE) pMsg->btVocation; //职业 data << (BYTE) pMsg->btSex; //把性别 data <<(BYTE) 0; //非在线状态 data <<(BYTE)0; //当前地图 //血量百分比 data <<(unsigned int)0; // data <<(unsigned int)0; // } void CTeam::WriteActorInfo(CActor * pActor,CDataPacket & data, int isOline) { if(pActor && pActor->IsInited()) { data << (unsigned int)pActor->GetId(); data.writeString(pActor->GetEntityName()); data << (int) pActor->GetProperty(PROP_CREATURE_LEVEL); //等级 data << (BYTE) pActor->GetProperty(PROP_ACTOR_CIRCLE); //转生 data << (BYTE) pActor->GetProperty(PROP_ACTOR_VOCATION); //职业 data << (BYTE) pActor->GetProperty(PROP_ACTOR_SEX); //性别 data << (BYTE)isOline; data << (int) pActor->GetSceneID();//场景ID data<< (unsigned int)pActor->GetProperty(PROP_CREATURE_MAXHP); //MAXHP data << (unsigned int)pActor->GetProperty(PROP_CREATURE_HP); // data << (unsigned int)pActor->GetProperty(PROP_ACTOR_SUPPER_PLAY_LVL); //vip } } //删除队伍成员 bool CTeam::DelMember(unsigned int nActorID,bool bNeedBroadcast,bool bNeedSelfDestroyTeam) { INT_PTR nIndex = GetActorIndex(nActorID); if((nIndex < 0) || (nIndex >= MAX_TEAM_MEMBER_COUNT))return false; //没有这个玩家 CActor* pActor = m_member[nIndex].pActor; //广播删除 char buff[128]; CDataPacket data(buff,sizeof(buff)); unsigned int nOldTeamId = m_nTeamID; data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsDelMember; data << nActorID; if(bNeedBroadcast) { BroadCast(data.getMemoryPtr(),data.getPosition()); char text1[1024]; LPCTSTR sFormat = GetLogicServer()->GetDataProvider()->GetTipmsgConfig().GetTipmsg(tmDelTeamMember); sprintf_s(text1, sizeof(text1), sFormat, (char*)(pActor ? pActor->GetEntityName() : GetOffLineMsg(nActorID)->name)); SendTeamChatMsg(text1); BroadcastTipmsgArgs(nActorID, tmDelTeamMember, tstUI, pActor ? pActor->GetEntityName() : GetOffLineMsg(nActorID)->name); } if(pActor && pActor->IsInited()) { pActor->SendTipmsgFormatWithId(tmSelfLeavTeam,tstUI); } // if(pActor) // { // pActor->GetTeamSystem().SetAllowTeam(0); // } m_member[nIndex].nActorID = 0; m_member[nIndex].pActor = NULL; if(pActor ) { pActor->SetProperty(PROP_ACTOR_TEAM_ID,0); //设置为无队伍 pActor->SetSocialMask(smTeamMember,false); //设置玩家不在队伍 if(m_bOnlinemMemberCount > 0) { m_bOnlinemMemberCount --; } } bool bNeedDestroy = false; //需要删除 int nMemCount = GetMemberCount(); //没有人在线,或者总人数少于1个,那么就删除队伍 if(bNeedSelfDestroyTeam && nMemCount <= 1 ) { bNeedDestroy = true; if(pActor) pActor->SetSocialMask(smTeamCaptin,false); //DestroyTeam(); } else { ClearOffLineMsg(nActorID); //清除玩家的离线消息 if(pActor) { if( m_pCaptin == pActor)//如果队长退出队伍,需要新选择一个人为队长 { pActor->SetSocialMask(smTeamCaptin,false); //设置玩家不是队长 CActor* pCaptin= SelectCaptin(); if(pCaptin) { SetCaptin(pCaptin); //设置一个人为新队长 } else { m_pCaptin = NULL; bNeedDestroy = true; } } UpdateNameClr_OnJoinOrLeaveTeam(pActor->GetHandle(), m_nTeamID, false); } } //执行脚本,如果在队伍副本中,只剩下一个人,则要退出副本 // if(pActor && pActor->IsInited()) // { // CScriptValueList paramList; // //pActor->InitEventScriptVaueList(paramList,aeLeaveTeam); // paramList << this; // pActor->OnEvent(aeLeaveTeam,paramList,paramList); // } if(bNeedDestroy) { DestroyTeam(); //广播删除 } else { // 离开队伍,更新原队伍玩家平均等级发生变化,需要更新副本怪物强度 GetGlobalLogicEngine()->GetTeamMgr().updateTeamMemFubenAveragePlayerLvl(nOldTeamId); } //DelMemberBuf(pActor); //退队的人删掉经验加成buf //UpdateBufMember(); // SendDestoyTeam(pActor); return true; } void CTeam::SendDestoyTeam(CActor* pActor) { if(!pActor) return; // pActor->GetTeamSystem().SetAllowTeam(0); CActorPacket ap; CDataPacket& dataPack= pActor->AllocPacket(ap); dataPack << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsDestroyTeam; ap.flush(); } void CTeam::BroadCastBagOwner(CDropBag * pBag, char * pData,SIZE_T nSize) { for (INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT; i++) { if(m_member[i].pActor && m_member[i].pActor->IsInited() &&pBag->GetBagOwnerFlag(i)) { ((CActor*)m_member[i].pActor)->SendData(pData,nSize); } } } bool CTeam::SetCaptin(CActor* pActor) { if(!pActor || !pActor->IsInited()) return false; //防止数据出问题 unsigned int nActorID = pActor->GetId(); //玩家的actorID INT_PTR nIndex = GetActorIndex(nActorID); if((nIndex < 0) || (nIndex >= MAX_TEAM_MEMBER_COUNT))return false; //没有这个玩家 if(pActor == m_pCaptin ) return false; //已经是同一个人了 //这个队伍已经删除了 if(m_member[nIndex].pActor == NULL ) { return false; } if(m_pCaptin) { m_pCaptin->SetSocialMask(smTeamCaptin,false); m_pCaptin->SetSocialMask(smTeamMember,true); } m_pCaptin = pActor; pActor->SetSocialMask(smTeamCaptin,true); pActor->SetSocialMask(smTeamMember,false); //广播设置队长 char buff[64]; CDataPacket data(buff,sizeof(buff)); data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsSetCaptin ; data << nActorID; BroadCast(data.getMemoryPtr(),data.getPosition()); BroadcastTipmsgArgs(0, tmSetNewCaptin, tstUI,pActor->GetEntityName()); //队长已经移交给了xxx return true; } void CTeam::BroadcastTipmsg(INT_PTR nTipmsgID, INT_PTR nTipmsgType) { for(INT_PTR i = 0; i < MAX_TEAM_MEMBER_COUNT; i++) { if(m_member[i].pActor && m_member[i].pActor->IsInited()) { m_member[i].pActor->SendOldTipmsgWithId(nTipmsgID,nTipmsgType); } } } void CTeam::BroadcastTipmsgArgs(unsigned int uExcludeActorId, INT_PTR nTipmsgID, INT_PTR nTipmsgType,...) { LPCTSTR sFormat = GetLogicServer()->GetDataProvider()->GetTipmsgConfig().GetTipmsg(nTipmsgID); for(INT_PTR i =0 ;i < MAX_TEAM_MEMBER_COUNT ; i++) { if((!uExcludeActorId || uExcludeActorId != m_member[i].nActorID) && m_member[i].pActor && m_member[i].pActor->IsInited()) { va_list args; va_start(args, nTipmsgType); m_member[i].pActor->SendTipmsgWithArgs(sFormat,args,nTipmsgType); va_end(args); } } } VOID CTeam::SendTeamChatMsg(char* msg, CActor* pActor) { // char buff[1024]; // CDataPacket outPack(buff, sizeof(buff)); //下发的数据包 // outPack << (BYTE) enChatSystemID << (BYTE)sSendChat <<(BYTE)ciChannelTeam; // if(pActor) // { // outPack.writeString(pActor->GetEntityName()); //把自己的名字写上去 // outPack.writeString(msg); // outPack << pActor->GetLevel(); // Uint64 actorid = Uint64(pActor->GetHandle()); // outPack <IsInited()) { CActor* pActor = m_member[i].pActor; pActor->SetProperty(PROP_ACTOR_TEAM_ID,0); //设置为无队伍 pActor->SetSocialMask(smTeamMember,false); //设置玩家不在队伍 pActor->SetSocialMask(smTeamCaptin,true); CActorPacket ap; CDataPacket& dataPack= pActor->AllocPacket(ap); dataPack.writeBuf(data, dataPack.getPosition()); ap.flush(); // DelMember(m_member[i].nActorID,false,false); //这里不广播,只发给自己 } } //如果有进入副本,从fubenmaganger队列删除本队伍 //GetGlobalLogicEngine()->GetFuBenMgr()->DelTeam(this); //这里会执行删除,故上面就不需要去检测删除队伍了 GetGlobalLogicEngine()->GetTeamMgr().DestroyTeam(m_nTeamID); //申请删除一个队伍 } void CTeam::SaveOfflineMsg(CActor * pActor,unsigned int nActorID) { //已经存在这个玩家的离线信息就不要保存 INT_PTR nIndex =-1; for(INT_PTR i=0; i< MAX_OFFLINE_MEMBER_COUNT ;i++) { if(m_offLineMember[i].nActorID == 0) { nIndex = i; break; } } if(nIndex >=0) { m_offLineMember[nIndex].btLevel= (BYTE)pActor->GetProperty( PROP_CREATURE_LEVEL); m_offLineMember[nIndex].btVocation = (BYTE)pActor->GetProperty( PROP_ACTOR_VOCATION); m_offLineMember[nIndex].wIconID = (WORD)pActor->GetProperty( PROP_ENTITY_ICON); m_offLineMember[nIndex].nActorID = pActor->GetProperty( PROP_ENTITY_ID); m_offLineMember[nIndex].btSex = (BYTE)pActor->GetProperty( PROP_ACTOR_SEX); //性别 m_offLineMember[nIndex].nVip = (unsigned int)pActor->GetProperty( PROP_ACTOR_SUPPER_PLAY_LVL); //性别 strcpy( m_offLineMember[nIndex].name ,pActor->GetEntityName()); } } INT_PTR CTeam::GetNearTeamMember(CActor * pUser,CActor ** pMember ) { //拾取的距离的平分 int nDis=GetLogicServer()->GetDataProvider()->GetGlobalConfig().teamLootMaxDistanceSquare; if(m_bOnlinemMemberCount ==0) return 0; //没有在线的人 INT_PTR nCount=0; for (INT_PTR i=0; i< MAX_TEAM_MEMBER_COUNT ; i++) { if(m_member[i].pActor && m_member[i].pActor->IsInited()) { if(m_member[i].pActor != pUser && pUser->GetEntityDistanceSquare(m_member[i].pActor) <= nDis ) //在拾取范围里 { if(pMember != NULL) { pMember[nCount]= m_member[i].pActor; } nCount ++; //参加拾取的人 } } } return nCount; } bool CTeam::SetUserOffline(CActor * pActor) { if(pActor == NULL ) return false; //if(pActor->IsInited() ==false) return false; unsigned int nActorID = ((CEntity*)pActor)->GetProperty(PROP_ENTITY_ID);//获取玩家的actorid INT_PTR nIndex = GetActorIndex(nActorID); if((nIndex <0) || (nIndex >= MAX_TEAM_MEMBER_COUNT))return false; //没有这个玩家 if(m_member[nIndex].pActor == NULL) return false; //这个玩家没有在线 m_member[nIndex].pActor =NULL; m_bOnlinemMemberCount --; bool bNeedDestroy =false; if(m_bOnlinemMemberCount <=0) //如果所有的人都离线了,可以删除这个队伍了 { bNeedDestroy = true; } else { SaveOfflineMsg(pActor,nActorID); //保存离线消息 char buff[64]; CDataPacket data(buff,sizeof(buff)); data << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsMemberLogout ; data << nActorID ; BroadCast(data.getMemoryPtr(),data.getPosition()); if(m_pCaptin == pActor) //如果队长下线了,需要新选择一个人为队长 { CActor* pCaptin= SelectCaptin(); if(pCaptin) { SetCaptin(pCaptin); //设置一个人为新队长 } else { bNeedDestroy =true; //选不出队长了,就删除 } } } if(bNeedDestroy) { DestroyTeam(); } else { // 玩家(如果在队伍中)下线更新副本玩家平均等级 GetGlobalLogicEngine()->GetTeamMgr().updateTeamMemFubenAveragePlayerLvl(m_nTeamID); SendMemberData(NULL, NULL, true); } //UpdateBufMember(); return true; } INT_PTR CTeam::GetAllAvgLevel() { INT_PTR nTotal = 0; INT_PTR nCount = 0; for (INT_PTR i =0; i< MAX_TEAM_MEMBER_COUNT; i++) { if(m_member[i].pActor && m_member[i].pActor->IsInited()) { nTotal += m_member[i].pActor->GetProperty(PROP_CREATURE_LEVEL); nCount++; } //else if (m_member[i].nActorID != 0) //{ // OFFLINETEAMMEMBER * pMsg = GetOffLineMsg(m_member[i].nActorID); // if (pMsg) // { // nTotal += pMsg->btLevel; // nCount++; // } //} } return nCount?nTotal/nCount:0; } void CTeam::SetChallengeId(unsigned int hHandle) { m_nChallengeId = hHandle; // for(INT_PTR i=0 ;i < MAX_TEAM_MEMBER_COUNT; i++) // { // if(m_member[i].pActor && hHandle== 0 ) // { // m_member[i].pActor->RemoveState(esChallenge); // } // } } void CTeam::RunOne() { if ( m_nTimerExpiredTime ) { UINT nNow = GetGlobalLogicEngine()->getMiniDateTime(); if(nNow >= m_nTimerExpiredTime) { SetExpiredTime(0); /* CActor* pActor = GetCaptin(); if(pActor) { CScriptValueList paramList; pActor->InitEventScriptVaueList(paramList,aeTeamTimer); paramList << (unsigned int)m_nTeamID; pActor->OnEvent(paramList,paramList); } */ } } } void CTeam::SetExpiredTime( unsigned int nExpireTime ) { m_nTimerExpiredTime = nExpireTime; } CActor* CTeam::SelectCaptin() { unsigned int nMaxLv = 0; CActor* pNewCaption = nullptr; for(INT_PTR i = 0; i < MAX_TEAM_MEMBER_COUNT; i++) { CActor* pActor = m_member[i].pActor; if(pActor && pActor->IsInited() ) { unsigned int level = pActor->GetProperty(PROP_CREATURE_LEVEL); if (level > nMaxLv) { nMaxLv = level; pNewCaption = pActor; } } } return pNewCaption; }