Files
mir_server/server/LogicServer/team/Team.h

505 lines
13 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/***************************************************************/
/* 队伍的类,实现队伍的基本功能,包括队伍成员管理,队长管理
/* 队伍的物品的分配
/***************************************************************/
#define MAX_TEAM_BUFF 7 // 1个经验加成buff+6个组队buff
class CActor;
/// 队伍成员的数据结构
typedef struct tagTeamMember
{
unsigned int nActorID; ///< 玩家的actorID
CActor * pActor; ///< 玩家的指针
}TEAMMEMBER,*PTEAMMEMBER;
/// 离线玩家的基本信息,主要供一些入队的玩家查看用的
typedef struct tagOffLineTeamMember
{
unsigned int nActorID; ///< actorID
WORD wIconID; ///< 头像的id
BYTE btLevel; ///< 等级
BYTE btVocation; ///< 职业
BYTE btSex; ///< 性别
BYTE btCircle; ///< 转生
WORD wReserver; ///< 保留
ACTORNAME name; ///< 名字
unsigned int nVip; ///< vip
}OFFLINETEAMMEMBER, *POFFLINETEAMMEMBER;
class CTeam
{
public:
CTeam() : m_nBuffCount(0)
{
memset(this,0,sizeof(CTeam));
//m_bLootType = tmTeamIteamStyleFree; //默认就是自由拾取
m_bRoolItemMinLevel = CStdItem::iqItemWhite; //默认是绿装
m_nFbId = 0;
m_nChallengeId = 0;
m_bTeamMaxMmemberCount = MAX_TEAM_MEMBER_COUNT;
m_nTimerExpiredTime = 0;
ZeroMemory(m_BuffId, sizeof(m_BuffId));
m_CallInfo=std::make_tuple(0,0,0,0,0);
}
/*
* Comments:
* Param CActor * pActor:
* @Return bool: truefalse
*/
bool AddMember(CActor * pActor,bool isNewMember = true);
void SendMemberData(CActor* pActor, CActor* pMember = NULL, bool IsBroadcast = false);
/*
* Comments:线使
* Param unsigned int nActorID: actorID
* Param bool bNeedBroadcast: 广,广true广
* Param bool bNeedSelfDestroyTeam: ,true的话没人在线了就会删除队伍
* @Return bool: truefalse
*/
bool DelMember(unsigned int nActorID, bool bNeedBroadcast =true, bool bNeedSelfDestroyTeam = true);
//当队伍里面人员变动更新经验加成buf
bool UpdateBufMember();
//像组队队员发消息
VOID SendTeamChatMsg(char* msg, CActor* pActor = NULL);
//删掉一个玩家的经验加成buf
bool DelMemberBuf(CActor * pActor);
//获取一个玩家当前身上的组队经验buffId
int GetTeamKillMonsterExpBuffId(CActor* pActor);
/*
* Comments:
* Param CActor * pActor:
* @Return bool:truefalse
*/
bool SetCaptin(CActor * pActor);
//该队伍是否还有效
bool IsTeamValid();
/*
* Comments:线
* Param unsigned int nActorID: actorID
* @Return bool:truefalse
*/
bool SetUserOffline(CActor * pActor);
//重新选一个在线的人为队长, 选等级最大的
inline CActor * SelectCaptin();
/*
* Comments:
* @Return void:
*/
void DestroyTeam();
/*
* Comments: 线使
* @Return INT_PTR:线
*/
inline INT_PTR GetOnlineUserCount()
{
return m_bOnlinemMemberCount;
}
inline void SetTeamID( unsigned int nTeamID)
{
m_nTeamID = nTeamID;
}
inline unsigned int GetTeamID()const
{
return m_nTeamID;
}
/*
* Comments:
* @Return INT_PTR:
*/
inline INT_PTR GetMemberCount()
{
INT_PTR nCount = 0;
for(INT_PTR i = 0; i < MAX_TEAM_MEMBER_COUNT; ++i)
{
if( m_member[i].nActorID )
{
if(m_member[i].pActor )
{
if( ((CEntity*) m_member[i].pActor)->IsInited() ==false)
{
m_member[i].pActor = NULL;
m_member[i].nActorID =0; //如果数据出现了问题,那么清掉这个玩家的数据
}
else
{
++nCount;
}
}
else
{
++nCount;
}
}
}
return nCount;
}
/*
* Comments:
* @Return CActor *:
*/
inline CActor* GetCaptin()
{
return m_pCaptin;
}
/*
* Comments: 线广
* Param void * pData:
* Param INT_PTR nLen:
* @Return void:
*/
void BroadCast(LPCVOID pData, INT_PTR nLen);
/*
* Comments:线广,
* Param void * pData:
* Param INT_PTR nLen:
* Param int nMyId:id
* @Return void:
*/
void BroadCast(LPCVOID pData, INT_PTR nLen,INT_PTR nMyId);
/*
* Comments: 线广
* Param LPCVOID lpData:
* Param SIZE_T dwSize:
* @Return void:
*/
inline void SendData(LPCVOID lpData, SIZE_T dwSize)
{
return BroadCast(lpData, dwSize);
}
inline CActor * GetActorByID(unsigned int nActorID)
{
for(INT_PTR i=0 ;i < MAX_TEAM_MEMBER_COUNT; i++)
{
if(m_member[i].nActorID == nActorID)
{
if(m_member[i].pActor )
{
if(((CEntity*)m_member[i].pActor)->IsInited())
{
return m_member[i].pActor;
}
else
{
return NULL;
}
}
}
}
return NULL;
}
/*
* Comments:
* Param INT_PTR nTipmsgID:ID
* Param INT_PTR nTipmsgType:
* @Return void:
*/
void BroadcastTipmsg(INT_PTR nTipmsgID, INT_PTR nTipmsgType= ttTipmsgWindow);
/*
* Comments:
* @param uExcludeActorId id不用发
* Param INT_PTR nTipmsgID:ID
* Param INT_PTR nTipmsgType:
* Param ...:
* @Return void:
*/
void BroadcastTipmsgArgs(unsigned int uExcludeActorId, INT_PTR nTipmsgID, INT_PTR nTipmsgType= ttTipmsgWindow,...);
/*
* Comments:
* Param unsigned int nActorID: actorID
* @Return INT_PTR: -1
*/
inline INT_PTR GetActorIndex(unsigned int nActorID)
{
if(nActorID ==0) return -1; //如果输入0肯定是出了问题
for(INT_PTR i=0 ;i < MAX_TEAM_MEMBER_COUNT; i++)
{
if(m_member[i].nActorID && m_member[i].nActorID == nActorID )
{
return i;
}
}
return -1;
}
/*
* Comments:
* Param INT_PTR nTeamID:
* @Return bool:
*/
//bool HasTeamMemberNeedQuestItem(INT_PTR nTeamID);
/*
* Comments:
* Param CActor * pActor:
* Param unsigned int nActorID:actorID
* @Return void:
*/
void SaveOfflineMsg(CActor * pActor,unsigned int nActorID);
/*
* Comments: pMemberpMember不空的话
* Param CActor * pUser:
* Param CActor * * pMember:,
* @Return INT_PTR:
*/
INT_PTR GetNearTeamMember(CActor* pUser,CActor ** pMember =NULL);
/*
* Comments:
* @Return const TEAMMEMBER*:
*/
inline const TEAMMEMBER* GetMemberList() {return m_member;}
/*
* Comments: 广
* Param CDropBag * pBag:
* Param void * pData:
* Param INT_PTR nSize:
* @Return void:
*/
void BroadCastBagOwner(CDropBag * pBag, char * pData,SIZE_T nSize);
/*
* Comments:id
* @Return int:
*/
inline int GetFbId() {return m_nFbId;}
/*
* Comments:id
* Param int nFbId:
* @Return VOID:
*/
inline VOID SetFbId (int nFbId) { m_nFbId = nFbId;}
/*
* Comments:
* @Return INT_PTR:
*/
inline INT_PTR GetTeamMaxMemberCount()
{
if(m_bTeamMaxMmemberCount)
{
return m_bTeamMaxMmemberCount;
}
else
{
return MAX_TEAM_MEMBER_COUNT;
}
}
/*
* Comments:
* Param INT_PTR nCount:
* @Return bool:truefalse
*/
inline bool SetTeamMaxMeberCount(INT_PTR nCount)
{
if(nCount > MAX_TEAM_MEMBER_COUNT || nCount <= 0) return false;
if(nCount == m_bTeamMaxMmemberCount)
{
return true;
}
m_bTeamMaxMmemberCount = (BYTE)nCount;
return true;
}
/*
* Comments:线
* @Return INT_PTR:
*/
INT_PTR GetAllAvgLevel();
/*
* Comments: 线
* Param unsigned int nActorID:actorID
* @Return OFFLINETEAMMEMBER *:
*/
inline OFFLINETEAMMEMBER * GetOffLineMsg(unsigned int nActorID)
{
if(nActorID ==0) return NULL;
for(INT_PTR i=0; i< MAX_OFFLINE_MEMBER_COUNT; i++)
{
if(m_offLineMember[i].nActorID == nActorID)
{
return &m_offLineMember[i];
}
}
return NULL;
}
//获取本队伍的擂台id
inline unsigned int GetChallengeId() {return m_nChallengeId;}
//设置本队伍的擂台id
void SetChallengeId(unsigned int hHandle);
//队伍是否正在打擂台
inline bool IsChallenge() { return m_nChallengeId != 0;}
//获取变量对象
inline CCLVariant& GetVar() { return m_DynamicVar; }
void RunOne();
/*
* Comments:
* Param unsigned int nExpireTime:
* @Return void:
*/
void SetExpiredTime( unsigned int nExpireTime);
//广播更新玩家信息
void BroadcastUpdateMember(CActor* pActor, int nPropId);
//发送解散组队消息--客户端不好处理
void SendDestoyTeam(CActor* pActor);
private:
//广播新加玩家
void BroadcastAddMember(CActor * pActor, BYTE idx);
//广播玩家在线状态
void BroadcastMemberOnlineState(CActor* pActor, BYTE state);
/*
* Comments:
* Param CActor * pActor:
* Param unsigned int nActorID:
* Param CDataPacket & pack:
* @Return void:
*/
void WriteActorInfo(CActor * pActor,CDataPacket & pack, int isOnline);
/*
* Comments: 线
* Param OFFLINETEAMMEMBER * pMsg:
* Param CDataPacket & data:
* @Return void:
*/
void WriteOffLineActorInfo(OFFLINETEAMMEMBER * pMsg,CDataPacket & data, BYTE idx);
/*
* Comments:
* Param INT_PTR nItemID: id
* @Return bool:truefalse
*/
inline bool NeedAssigned(CDropItem &item)
{
if(item.btType <Item::itEquipMax /*&& (m_bLootType== tmTeamItemStyleTeam ||m_bLootType== tmTeamItemStyleCaptin )*/ )
{
return item.item.btQuality >= m_bRoolItemMinLevel;
}
else
{
return false;
}
}
/*
* Comments: 线
* Param unsigned int nActorID:
* @Return INT_PTR:
*/
inline INT_PTR GetOffLineActorIndex(unsigned int nActorID);
/*
* Comments: 线
* Param unsigned int nActorID:actorID
* @Return :
*/
inline void ClearOffLineMsg(unsigned int nActorID)
{
for(INT_PTR i=0 ;i < MAX_OFFLINE_MEMBER_COUNT ;i++)
{
if(m_offLineMember[i].nActorID == nActorID)
{
memset( &m_offLineMember[i],0,sizeof(m_offLineMember[i])); //把这段内存清空
}
}
}
// 队伍加入成员
void OnMemberAdded();
void AddFriendIntimacyWithMember(CActor *pActor);
public:
void SetCallMemInfo(unsigned int nActorId, int nSceneId, int nX, int nY, unsigned int nExpireTime)
{
m_CallInfo = std::make_tuple(nActorId, nSceneId, nX, nY, nExpireTime);
}
std::tuple<unsigned int,int,int,int,unsigned int>
GetCallMemInfo()
{
return m_CallInfo;
}
static int m_nMaxTeamLootDistanceSquare;// 最大的拾取距离的平分
private:
TEAMMEMBER m_member[MAX_TEAM_MEMBER_COUNT]; //5人的队伍名单
//BYTE m_bLootType; //队伍的物品的分配方式
BYTE m_bOnlinemMemberCount; //队伍在线的人数
BYTE m_nLastLootSlotID; //上一次获得物品的玩家的巢位,用于轮流拾取,从1到5才是有效的
BYTE m_bRoolItemMinLevel; // Roll物品的最低等级比如蓝装
BYTE m_bTeamMaxMmemberCount; //队伍最大的人数
BYTE m_bReserver;
WORD m_wReserver;
CActor* m_pCaptin; ///< 队长的指针
unsigned int m_nTeamID; ///< 自身的ID这个考虑到一些内部逻辑要使用
OFFLINETEAMMEMBER m_offLineMember[MAX_OFFLINE_MEMBER_COUNT]; //存离线玩家的基本信息,供查询用
//zac:记录这个队伍对应的副本id在创建副本队伍的时候设置默认是0表示本队伍没打算进入任何副本
//退出副本后要改回0
int m_nFbId;
unsigned int m_nChallengeId; ///< 擂台的id没有则为0
CCLVariant m_DynamicVar; ///< 导出给lua层用
UINT m_nTimerExpiredTime; ///< 过期时间
unsigned int m_nBuffCount; // 不包括经验buff
int m_BuffId[MAX_TEAM_BUFF]; // 保存,全部保存共享buff(不包含组队经验buff)
std::tuple<unsigned int,int,int,int,unsigned int> m_CallInfo; //召唤者id场景idx, y, 过期时间
};