Files
mir_server/server/LogicServer/base/OfflineUserMgr.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

255 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
/*
*离线玩家的消息管理器,将一些排名前面的玩家的信息放到组件里保存,用于玩家查询,可以缓存离线玩家的装备,基础信息
*以及宝物,宠物这些数据
需要同步的接口
OnOfflineSynchronizationData
OnLoadActorOther
*/
#include <map>
#include <vector>
#include <functional>
class CActor;
/*
*英雄的离线消息
*/
struct COfflineUserHero:
public HeroOfflineMsg
{
CEquipVessel equips; //宠物的装备
};
struct OfferLog
{
unsigned int nActorID; //对方玩家ID
ACTORNAME sName; //对方玩家NAME
char sItemName[32]; //物品名
int nItemId; //物品ID
int nColor; //物品配置(0-白色5-红色)
char sLog[100]; //操作logs
};
//离线玩家的信息管理器
struct COfflineUser:
public ActorOfflineMsg
{
CUserItem* m_Equips[itMaxEquipPos]; //装备信息
std::vector<CSkillSubSystem::SKILLDATA> m_Skilldata;// 技能信息
std::map<int, std::vector<StrengthInfo> > m_nStrengths;// 强化信息
std::vector<CNewTitleSystem::NEWTITLEDATA> m_NewTitleDataList;// 称号信息
std::vector<CAlmirahItem> m_Almirah; //时装信息
std::vector<GhostData> m_ghost; //神魔信息
std::vector<SoulWeaponNetData> vSoulWeapon; //兵魂信息
std::vector<CLootPetSystem::LOOTPETDATA> m_LootPetSystemDataList;//宠物系统非 ai宠物
std::vector<CNewTitleSystem::NEWTITLEDATA> m_CustomTitleDataList;// 称号信息
};
class COfflineUserMgr:
public CComponent
{
public:
COfflineUserMgr():m_FixedSizeAllocator(_T("OfflineUserAllocator")),
m_OfflineUserHeroAllocator(_T("OfflineUserHeroAllocator"))
{
}
typedef std::map<unsigned int,COfflineUser* > OfflineUserMap; //玩家数据查找的迭代器
typedef std::map<char, COfflineUserHero * > OfflineUserHeroMap; //英雄查找迭代
typedef std::map<unsigned int, OfflineUserHeroMap* > OfflineUserHerosMap; //英雄列表查找迭代
typedef std::map<unsigned int,BYTE > NeedBuyTypeMap; //[求购店]物品求购类型字段
/*
* Comments:添加一个离线玩家的列表
* Param unsigned int nActorId:玩家的actorid
*Parambool &isExist 是否存在这个玩家
* @Return COfflineUser *:返回玩家的指针
*/
COfflineUser * AddOffLineUser(unsigned int nActorId,bool &isExist);
/*
* Comments:添加一个离线玩家的英雄列表
* Param unsigned int nActorId:玩家的actorid
* Param unsigned int nHeroId:玩家英雄的nHeroId
*Parambool &isExist 是否存在这个玩家
* @Return COfflineUserHero *:返回玩家英雄的指针
*/
COfflineUserHero * AddOffLineUserHeros(unsigned int nActorId, unsigned int nHeroId, bool &isExist);
//里显示同步数据
void OnOfflineSynchronizationData(CActor* pActor);
//添加一个英雄到英雄列表
COfflineUserHero * AddOffLineUserHero(unsigned int nActorId, unsigned int nHeroId);
//DB返回数据了
void OnDbReturnData(INT_PTR nCmd,char * data,SIZE_T size);
//topackt
void ViewOffLineActorToPacket(unsigned int nActorId, CDataPacket& data);
/*
* Comments:通过玩家的actorid返回玩家的指针
* Param unsigned int nActorId:玩家的actorid
* Param bool loadWhenNotExist:如果不存在数据就去DB装载
* @Return COfflineUser *:玩家的指针
*/
inline COfflineUser * GetUserByActorId(unsigned int nActorId)
{
if(nActorId ==0) return NULL;
OfflineUserMap::iterator iter = m_actoridMap.find(nActorId);
if (iter == m_actoridMap.end())
{
return NULL;
}
return iter->second;
}
/*
* Comments:通过玩家的actorid返回玩家的指针
* Param unsigned int nActorId:玩家的actorid
* Param unsigned int nHeroId:玩家英雄的nHeroId
* Param bool loadWhenNotExist:如果不存在数据就去DB装载
* @Return COfflineUserHero *:玩家的英雄指针
*/
inline COfflineUserHero * GetUserHero(unsigned int nActorId, unsigned int nHeroId, bool &isExist, bool loadWhenNotExist=false)
{
if(nActorId == 0 || nHeroId == 0) return NULL;
OfflineUserHerosMap::iterator iter = m_actoridHerosMap.find(nActorId);
if (iter != m_actoridHerosMap.end())
{
OfflineUserHeroMap *pHeros = iter->second;
isExist = true;
OfflineUserHeroMap::iterator it = pHeros->find((char)nHeroId);
if (it != pHeros->end())
{
return it->second;
}
}
else
{
isExist = false;
}
if (loadWhenNotExist)
{
LoadUserHero(nActorId, nHeroId);
}
return NULL;
}
/*
* Comments:删除玩家的列表
* Param unsigned int nActorID: 玩家的actorid
* @Return void:
*/
void RemoveUser(unsigned int nActorID);
//删除一个英雄
void RemoveUserHero(unsigned int nHeroId, OfflineUserHeroMap *pHeros);
//删除了所有的玩家的信息
void RemoveAllUser();
//删除了所有的玩家英雄的信息
void RemoveAllUserHero();
//销毁组件
virtual VOID Destroy()
{
RemoveAllUser();
RemoveAllUserHero();
}
//初始化
bool Initialize()
{
return true;
}
using CallBack = std::function<void(CActor*)>;
//装载玩家的离线消息
void LoadUser(unsigned nActorId, unsigned nViewerId=0, int nsys = enEuipSystemID,int ncmd = sGetOtherEqip);
//装载玩家英雄的离线消息
void LoadUserHero(unsigned nActorId, unsigned int nHeroId);
//查看离线玩家的消息
void ViewActor(CActor *pActor,char *name);
//通过名字查询玩家的指针
COfflineUser * GetUserByName(const char * name);
void viewByOfflineUser(COfflineUser *pUser, unsigned int nActorId, int nsys = enEuipSystemID,int ncmd = sGetOtherEqip);
void viewByOnlineUser(CActor *pUser, CActor *pActor,int nsys = enEuipSystemID,int ncmd = sGetOtherEqip);
//Comments:查看离线玩家的信息 优先使用actorid 如果actorid==0 则使用name
void ViewOffLineActor(CActor *pActor, unsigned int nActorId, int nsys = enEuipSystemID,int ncmd = sGetOtherEqip);
//查看离线英雄信息
void ViewOffLineActorHero(CActor *pActor, unsigned int nActorId, unsigned int nHeroId, bool loadWhenNotExist=true, unsigned int nShowType=0);
void viewOnlineUserData(CActor* pUser, CDataPacket& data);
void viewOfflineUserData(COfflineUser *pUser, CDataPacket& data);
public:
//装载玩家的基本信息
void OnLoadActorBasic(unsigned int nActorId, CDataPacketReader &reader);
//装载玩家的装备信息
void OnLoadActorOther(unsigned int nActorId, CDataPacketReader &reader);
//装载英雄数据
void OnLoadActorHeroBasic(unsigned int nActorId, CDataPacketReader &reader);
//装载英雄装备数据
void OnLoadActorHeroEquips(unsigned int nActorId, CDataPacketReader &reader);
public:
/*
* Comments:发送悬赏任务日志
* @Return void:
*/
void SendOfferLog(CActor* pActor);
LPCSTR GetUserName(unsigned int nActorId);
public:
VOID AddNeedBuyType(unsigned int nItemId, BYTE nBuyType)
{
m_NeedBuyTypeMap.insert( std::make_pair(nItemId, nBuyType) );
}
BYTE GetNeedBuyType(unsigned int nItemId)
{
if( nItemId == 0 ) return 0;
NeedBuyTypeMap::iterator iter = m_NeedBuyTypeMap.find(nItemId);
if (iter == m_NeedBuyTypeMap.end())
{
return 0;
}
return iter->second;
}
private:
OfflineUserMap m_actoridMap; //玩家的actorid到数据的索引每天23点55分左右会重置
OfflineUserHerosMap m_actoridHerosMap; //英雄列表map
std::map<unsigned int, std::vector<std::function<void(COfflineUser*)>>> m_noticeMap; //通知的列表
std::map<unsigned int, std::vector<std::function<void(COfflineUser*)>>> m_noticeCenterMap; //通知的列表
CSingleObjectAllocator<COfflineUser> m_FixedSizeAllocator;
CSingleObjectAllocator<COfflineUserHero> m_OfflineUserHeroAllocator;
NeedBuyTypeMap m_NeedBuyTypeMap;
public:
//跨服相关
void ViewCenterOffLineActor(int nSrvId, unsigned int nActorId);
void SendCenterOfflineActor(COfflineUser* pUser,int nSrvId);
void SendCenterOnlineUser(CActor* pUser,int nSrvId);
void viewCenterOnlineUserData(CActor* pUser, CDataPacket& data);
};