This commit is contained in:
aixianling
2025-01-09 17:45:40 +08:00
commit 5c9f1dae4a
3482 changed files with 1146531 additions and 0 deletions

View File

@@ -0,0 +1,869 @@
#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<unsigned int>(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<int, bool> 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<int, bool>::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<unsigned int>(PROP_ENTITY_ID));
data.writeString(pAc->GetEntityName());
data << (int)(pAc->GetProperty<unsigned int>(PROP_CREATURE_LEVEL)); //等级
data << (BYTE)(pAc->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE)); //转生
data << (BYTE) (pAc->GetProperty<unsigned int>(PROP_ACTOR_VOCATION)); //职业
data << (BYTE) (pAc->GetProperty<unsigned int>(PROP_ACTOR_SEX)); //性别
data << (BYTE)1;
int nSceneId = pAc->GetSceneID();
data << nSceneId;//场景ID
data<< (unsigned int)pAc->GetProperty<unsigned int>(PROP_CREATURE_MAXHP); //MAXHP
data << (unsigned int)pAc->GetProperty<unsigned int>(PROP_CREATURE_HP); //
data << (unsigned int)(pAc->GetProperty<unsigned int>(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<unsigned int>(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<unsigned int>(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<unsigned int>(PROP_ENTITY_ID));
// data << state;
WriteActorInfo(pActor,data, 1);
BroadCast(data.getMemoryPtr(),data.getPosition(), (unsigned int)(pActor->GetProperty<unsigned int>(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<unsigned int>(PROP_CREATURE_LEVEL); //等级
data << (BYTE) pActor->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE); //转生
data << (BYTE) pActor->GetProperty<unsigned int>(PROP_ACTOR_VOCATION); //职业
data << (BYTE) pActor->GetProperty<unsigned int>(PROP_ACTOR_SEX); //性别
data << (BYTE)isOline;
data << (int) pActor->GetSceneID();//场景ID
data<< (unsigned int)pActor->GetProperty<unsigned int>(PROP_CREATURE_MAXHP); //MAXHP
data << (unsigned int)pActor->GetProperty<unsigned int>(PROP_CREATURE_HP); //
data << (unsigned int)pActor->GetProperty<unsigned int>(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<unsigned int>(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 <<actorid;
// }
// else
// {
// outPack.writeString(""); //把自己的名字写上去
// outPack.writeString(msg);
// outPack << (int)0;
// outPack <<(Uint64)0;
// }
// outPack << (BYTE)0;
// BroadCast(outPack.getMemoryPtr(), outPack.getPosition());
}
void CTeam::DestroyTeam()
{
//广播删除
char data[512];
CDataPacket dataPack(data, sizeof(data));
dataPack << (BYTE)enTeamSystemID << (BYTE) enTeamSystemsDestroyTeam;
for(INT_PTR i = 0; i < MAX_TEAM_MEMBER_COUNT; i++)
{
if(m_member[i].pActor && m_member[i].pActor->IsInited())
{
CActor* pActor = m_member[i].pActor;
pActor->SetProperty<unsigned int>(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<unsigned int>( PROP_CREATURE_LEVEL);
m_offLineMember[nIndex].btVocation = (BYTE)pActor->GetProperty<unsigned int>( PROP_ACTOR_VOCATION);
m_offLineMember[nIndex].wIconID = (WORD)pActor->GetProperty<unsigned int>( PROP_ENTITY_ICON);
m_offLineMember[nIndex].nActorID = pActor->GetProperty<unsigned int>( PROP_ENTITY_ID);
m_offLineMember[nIndex].btSex = (BYTE)pActor->GetProperty<unsigned int>( PROP_ACTOR_SEX); //性别
m_offLineMember[nIndex].nVip = (unsigned int)pActor->GetProperty<unsigned int>( 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<unsigned int>(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<int>(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<unsigned int>(PROP_CREATURE_LEVEL);
if (level > nMaxLv)
{
nMaxLv = level;
pNewCaption = pActor;
}
}
}
return pNewCaption;
}