Files
mir_server/server/LogicServer/scene/FuBenManager.h

264 lines
8.5 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
#define REUSEFB
#define MAX_NEWCREATEFUBEN 5
class CLogicEngine;
using namespace jxcomm::gameMap;
class CFuBen;
typedef struct tagMapData
{
char szFileName[256];
CAbstractMap* pMapData;
DECLARE_OBJECT_COUNTER(tagMapData)
}MAPDATA;
//保存地图障碍信息的列表
typedef CBaseList<MAPDATA*> MAPDATAVECTOR;
typedef CVector<CFuBen*> FUBENVECTOR;
typedef CHandleList<CFuBen*,UINT> FubenHandleList;
class CFuBenHandleMgr : public FuBenHandleMgr
{
typedef FuBenHandleMgr Inherited;
public:
CFuBenHandleMgr(LPCTSTR lpszDesc);
CFuBen* GetDataPtr( CFuBenHandle handle );
const CFuBen* GetDataPtr( CFuBenHandle handle ) const;
};
class FubenAllocator: public std::allocator<CFuBen>
{
typedef CFuBen* pointer;
pointer allocate(size_type _n, const void* = 0);
void deallocate(pointer _p, size_type);
void construct(pointer, const CFuBen&) { }
void destroy(pointer) { }
};
class CFuBenManager:
public CComponent
{
//执行刷怪需要的参数,保证刷怪占用的时间片
typedef struct tagRefreshPara
{
CFuBen* pFuben;//上次刷怪的副本
int nScenePos;//上次刷怪的场景这个不是场景id而是在副本中场景的索引
int nRefreshPos;//上次刷怪点的位置
VOID setFB(CFuBen* pFb)
{
pFuben = pFb;
nScenePos = 0;
nRefreshPos = 0;
}
VOID setScene(int i)
{
nScenePos = i;
nRefreshPos = 0;
}
}RefreshPara;
public:
CFuBenManager(void);
virtual ~CFuBenManager(void);
public:
//组件的销毁函数这里要消耗一些S分配的内存
VOID Destroy();
//创建一批空闲的副本备用
void CreateFreeFb();
/*
* Comments:
* Param CEntity * pEntity:
* Param unsigned int hFbHandle: handle
* Param unsigned int nScenceID: ID
* Param int nPosX: x
* Param int nPosY: y
* @Return bool: truefalse
*/
inline bool EnterFuBen(CEntity * pEntity,unsigned int hFbHandle,int nScenceID,int nPosX, int nPosY)
{
CFuBenHandle hHandle(hFbHandle);
CFuBen* pFuBen = m_FuBenMgr->GetDataPtr(hHandle) ;
return EnterFuBen(pEntity,pFuBen,nScenceID,nPosX,nPosY);
}
/*
* Comments:
* Param CEntity * pEntity:
* Param CFuBen * pFuBen:,NULL表示进入静态副本
* Param unsigned int nScenceID:ID
* Param int nPosX: x
* Param int nPosY: y
* Param int nType: 0-1-
* Param int nValue: 1ID
* Param int nParam: 1ID
* @Return bool: truefalse
*/
bool EnterFuBen(CEntity * pEntity,CFuBen* pFuBen ,INT_PTR nScenceID,INT_PTR nPosX, INT_PTR nPosY,int nType = 0, int nValue = 0, int nParam=-1);
/*
* Comments: 111
* Param unsigned int nFbId:
* @Return CFuBen *:
*/
inline CFuBen * GetFbStaticDataPtr(unsigned int nFbId)
{
if ((nFbId < 0) || (nFbId >= (UINT)m_vStaticFbList.count()))
{
OutputMsg(rmWaning,_T("Enter fb fail for fBid=%d is invalid"),nFbId);
return NULL;
}
return m_vStaticFbList[nFbId];
}
/*
* Comments: GM指令的传送
* Param LPCTSTR sSceneName:
* Param CFuBen * & pRetFb:
* Param CScene * & pRetScene:
* @Return bool: truefalse
* Remark:
*/
bool GetFbPtrBySceneName(LPCTSTR sSceneName, CFuBen *& pRetFb, CScene *& pRetScene);
/*
* Comments: ID返回副本的指针和场景的指针GM指令的传送
* Param INT_PTR nSceneID: ID
* Param CFuBen * & pRetFb:
* Param CScene * & pRetScene:
* @Return bool: truefalse
* Remark:
*/
bool GetFbPtrBySceneId( unsigned int nSceneID, CFuBen *& pRetFb, CScene *& pRetScene);
bool GetFbPtrBySceneId( unsigned int nFbId, int nSceneID, CFuBen *& pRetFb, CScene *& pRetScene);
//每次逻辑循环都需执行一次的操作
VOID RunOne();
inline FUBENVECTOR* GetFbList() {return &m_vStaticFbList;}
//生成一个新的副本
CFuBen* CreateFuBen(int nFbId);
CFuBen* AllocNewFb( int nFbId,bool boRun =true );
//删除一个副本,释放资源
VOID ReleaseFuBen(CFuBen* pFuBen);
//加一个静态副本到列表中,本列表中的副本不释放,作为其他副本的克隆原体
VOID AddStaticFuBen(CFuBen* pFb);
//根据文件名得到地图的障碍信息
//如果不存在列表中,则创建一个并加入到列表
CAbstractMap* GetMapData(const char* szFileName);
bool GetVisibleList(CEntity * pEntity,EntityVector& vVisibleList,int nLeft=-MOVE_GRID_COL_RADIO,int nRight=MOVE_GRID_COL_RADIO
,int nUp=-MOVE_GRID_ROW_RADIO,int nDown=MOVE_GRID_ROW_RADIO);
bool GetVisibleList(CEntity * pEntity,CObserverEntityList& vVisibleList,int nLeft=-MOVE_GRID_COL_RADIO,int nRight=MOVE_GRID_COL_RADIO
,int nUp=-MOVE_GRID_ROW_RADIO,int nDown=MOVE_GRID_ROW_RADIO, bool *pbActorInVisibleList = NULL);
// 获取有序的可见列表(按照句柄排序)
bool GetSeqVisibleList(CEntity * pEntity, SequenceEntityList& visibleList, int nLeft=-MOVE_GRID_COL_RADIO,int nRight=MOVE_GRID_COL_RADIO
,int nUp=-MOVE_GRID_ROW_RADIO,int nDown=MOVE_GRID_ROW_RADIO);
/*
* Comments:npc的脚本
* Param LPCTSTR szSceneName:NULL
* Param LPCTSTR szNpcName:NPC名NULLnpc的脚本
* @Return void:
*/
INT_PTR ReloadNpcScript(LPCTSTR szSceneName,LPCTSTR szNpcName);
/*
* Comments:
* Param int nFbid:
* @Return COMMONFUBENCONFIG*:
*/
COMMONFUBENCONFIG* GetConfig(int nFbid);
/*
* Comments:
* @Return void:
*/
void Trace();
//输出刷怪的位置
void TraceRefreshPos();
//重置副本的刷怪
void ResetFbRefresh();
/*
* Comments:id获取全服中这个副本的所有copy,handle
* Param UINT nFbid:id
* Param UINT * pList:
* Param size_t nBufSize:
* @Return int:
*/
int GetFbCountFromId(UINT nFbid,UINT* pList,size_t nBufSize);
/*
* Comments:
* @Return void:
* @Remark:
*/
void RefreshMonster();
/*
* Comments:
* @Return void:
* @Remark:
*/
unsigned int TotalAllSceneMonsterCount();
/*
* Comments: dump副本相关的统计信息
* @Return void:
* @Remark:
*/
void Dump();
/*
* Comments:
* @Return void:
* @Remark:
*/
void DumpFbDataAlloc(wylib::stream::CBaseStream& stream);
//判断是否需要初始化副本面板
bool IsNeedShowFubenForm(int nFbId);
//获取随机出生坐标
void GetRandomCreatePos(int nToken,int& nScenceID,int& nPosX,int& nPosY);
private:
FubenHandleList m_vAllFbList; // CHandleList<CFuBen*,UINT> 游戏中出现的所有副本copy,不包括m_vStaticFbList里面的
FUBENVECTOR m_vStaticFbList; // CVector<CFuBen*> 副本的静态实例其他副本都从这些副本中clone出来里面的实例都是new出来没有使用HandleManager内存管理
std::map<int, CFuBen*> m_vMuiltyFbMap; // 多人副本<fbidpFb>
CVector<FUBENVECTOR*> m_FreeFbList; // 保存空闲的副本列表,便于重用
// 空闲副本按照副本Id来保存的要求副本ID连续每个ID对应的可能有多个此副本对象
CTimer<200> m_RefTimer; // 副本刷新定时器
CTimer<300000> m_FreeFbTimer; // 定时释放多余的空闲副本
int m_anFubenCount[256]; // 统计每个副本数量
MAPDATAVECTOR m_vMapDataList; // 所有地图的障碍信息列表
public:
static CFuBenHandleMgr* m_FuBenMgr; //全局的副本管理内存块
static SceneHandleMgr* m_SceneMgr; //全局的场景管理内存块
static RefreshPara m_RefreshPara; //分片刷新
static EntityVector* m_pVisibleList; //临时用来保存可见的实体列表
};