Files

304 lines
8.8 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
#define MAXFBPARAM 32
#define MAXBOSSCOUNT 6
#define MAXPROGRESS 8
class CFuBenManager;
class CFuBen : public Counter<CFuBen>
{
public:
typedef CVector<CScene*> SceneList;
public:
CFuBen();
virtual ~CFuBen();
public:
//初始化的工作
VOID Init(bool boRun=true);
//重用那个时必须调用的函数
void Reset();
//从空闲列表中取出后必须做的一些工作
void OnReuse();
//判断是否空闲的内存
bool IsFree() { return m_boFree; }
void SetFreeFlag(bool boFlag);
inline VOID SetFbId(int id) {m_nFbId = id;}
inline int GetFbId(){return m_nFbId;}
inline int GetFbType() {return m_bType;}
inline void SetFbType(BYTE nType) { m_bType = nType;}
/*
* Comments:
* @Return bool: truefalse
*/
inline bool IsFb(){return m_nFbId !=0;}
//是否按照场景配置里的刷怪方式刷怪开关
//默认只有主场景使用默认刷怪方式
//副本刷怪可以手动启用
bool create_monster_flag = 0 ;
bool change_create_monster_flag(bool flag=0);
inline bool is_use_default_create_monster() {return create_monster_flag;}
VOID SetHandle(const CFuBenHandle& hHandle){m_hFbHandle = hHandle;}
CFuBenHandle GetHandle() {return m_hFbHandle;}
SceneList& GetSceneList() {return m_vSceneList;}
inline void AddScene(CScene* pScene){ m_vSceneList.add(pScene); }
inline void SetConfig(COMMONFUBENCONFIG* pConfig) {m_pConfig = pConfig;}
//每次逻辑循环都需要执行的函数
//每次执行只能有固定的时间内超出时间必须停止返回false表示正常停止true是超时停止
int RunOne();
//输出本副本的信息
void Trace();
/*
* Comments:
* Param INT_PTR nScenceID: ID
* Param INT_PTR nPosX: x
* Param INT_PTR nPosY:y
* @Return BOOL: truefalse
*/
bool Enter(CEntity * pEntity,INT_PTR nScenceID,INT_PTR nPosX, INT_PTR nPosY, INT_PTR nWeight = 0, INT_PTR nHeight = 0, int nType = 0,
int nValue = 0, int nParam=-1, CScene* pLastScene = NULL, CFuBen* pLastFb=NULL);
//克隆一个跟本副本一样的新的副本,DstFuBen是克隆本
void Clone(CFuBen& DstFuBen,bool boRun =true);
//往副本增加场景实例这里的场景不会被释放其他场景都从这里的场景clone出来
//本函数只应该在程序启动时读取配置数据的时候执行
BOOL AddStaticScene(SCENECONFIG* SceneData,CFuBenManager* pFbMgr,CObjectAllocator<char>& dataAlloc);
inline SceneConfigList* GetSceneConfig() {return m_vSceneConfig;}
inline COMMONFUBENCONFIG* GetConfig() { return m_pConfig;}
/*
* Comments: id的场景指针
* Param INT_PTR nScenceID:ID,
* @Return CScene*:
*/
CScene* GetScene(INT_PTR nScenceID);
CScene* GetSceneByName(LPCTSTR sName);
//重置副本的位置
void RefreshFbPos();
//判断是否含有这个id的场景
bool HasScene(int nSceneId);
/*
* Comments:
* Param UINT nActorid:id
* @Return void:
*/
void AddRefuseActor(UINT nActorid);
/*
* Comments:
* Param UINT nActorid:id
* @Return bool:
*/
bool IsRefuseActor(UINT nActorid);
unsigned int GetGuildId() {return m_nGuildId;};
void SetGuildId(unsigned int nGuildId) { m_nGuildId = nGuildId; }
/*
* Comments:
* @Return void:
*/
void ExitAllActor();
//获取副本玩家的数量
int GetFubenActorCount();
/**
* @brief:
*/
int getPlayerAverageLvl() const;
/*
* Comments:
* Param int nCount:
* @Return void:
*/
void updateFubenPlayerCount(int nCount);
/*
* Comments:
* @Return int:
*/
int getPlayerCount() const;
//脚本设置副本的相关的值
inline void SetFbValue(INT_PTR nIndex,int nValue)
{
if (nIndex < 0 || nIndex >= MAXFBPARAM) return;
m_nValues[nIndex] = nValue;
}
inline int GetFbValue(INT_PTR nIndex)
{
if (nIndex < 0 || nIndex >= MAXFBPARAM) return 0;
return m_nValues[nIndex];
}
//设置和获取副本剩余时间
UINT GetFubenTime();
void _SetFubenTime( UINT nTime, LPCSTR file, INT_PTR line );
#define SetFubenTime(nTime) _SetFubenTime(nTime, __FILE__, __LINE__)
/*
* Comments:
* Param CEntity * pEntity:
* Param bool bAdd:
* @Return void:
*/
void UpdateFbPlayerCountAndAverageLevel(CEntity *pEntity, bool bAdd);
/*
* Comments:
* Param int updateLevel:
* @Return void:
*/
void OnFbPlayerLevelChanged(int updateLevel);
//设置和获取在副本中角色死亡的次数
inline INT_PTR GetActorDieCount() { return m_ActorDieTime; }
inline void AddActorDieCount()
{
m_ActorDieTime++;
}
//设置杀死boss的玩家的名字
inline void AddKillBossName(LPCSTR sName)
{
if (m_KillNameCount < (MAXBOSSCOUNT-1))
{
_asncpytA(m_szKillBossName[m_KillNameCount],sName);
m_KillNameCount++;
}
}
//获取杀死boss的玩家的个数
inline INT_PTR GetKillBossCount()
{
return m_KillNameCount;
}
//获取杀死过boss的玩家的名字
LPCSTR GetKillBossActorName(INT_PTR nIndex)
{
if (nIndex >=0 && nIndex < m_KillNameCount)
{
return m_szKillBossName[nIndex];
}
return "";
}
//获取副本总共出现的怪物的总数
inline INT_PTR GetMonsterTotal() { return m_MonsterTotal; }
inline void AddMonsterTotal() { m_MonsterTotal++; }
unsigned int GetMonsterCount(int nMonsterId, int nScenId);
//获取和设置副本内被杀死的怪的数量
inline INT_PTR GetKillMonsterCount() { return m_KillMonsterCount; }
inline void AddKillMonsterCount() {m_KillMonsterCount++;}
/*
* Comments: 线广
* Param LPCVOID lpData:
* Param SIZE_T dwSize:
* @Return void:
*/
void SendData(LPCVOID lpData, SIZE_T dwSize);
/*
* Comments:npc的脚本
* Param LPCTSTR szSceneName:NULL
* Param LPCTSTR szNpcName:NPC名NULLnpc的脚本
* @Return void:
*/
INT_PTR ReloadNpcScript(LPCTSTR szSceneName,LPCTSTR szNpcName);
/*
* Comments:
* @Return void:
* @Remark:
*/
void RefreshMonster();
/*
* Comments:
* @Return void:
* @Remark:
*/
unsigned int TotalSceneMonsterCount();
//获取变量对象
inline CCLVariant& GetVar() { return m_DynamicVar; }
private:
/*
* Comments:
* Param CEntity * pEntity:
* @Return bool:
*/
bool CanEnter(CActor * pActor);
private:
// 副本基本属性数据
int m_nFbId; // 副本Id副本Id须保证是连续配置
CFuBenHandle m_hFbHandle; // 副本句柄
COMMONFUBENCONFIG* m_pConfig; // 副本静态配置
SceneList m_vSceneList; // 副本的场景对象列表
UINT m_DestoryTime; // 副本删除的时间,由于玩家掉线,副本会为他保留一段时间才删除
UINT m_restTime; // 副本的剩余时间用于限时的副本默认是0表示无限制
bool m_boFree; // 副本是否是自由状态。只针对动态副本提高动态进入FB效率采取预分配和池策略
CEntityList m_RefuseList; // 被拒绝进入的玩家列表,主要用于结婚副本中限定某些人进入,实际上这里保存的是角色的id
BYTE m_bType; // 副本的类型,比如结婚副本、擂台副本
// 用于FB内怪物属性的动态刷新数据
int m_nPlayerLevelSum; // 副本玩家等级和
int m_nPlayerCount; // 当前副本玩家人数,用于副本怪物动态刷新
// FB相关的统计数据
WORD m_ActorDieTime; // 玩家打副本过程中一共死亡的次数
int m_KillMonsterCount; // 一共杀死的怪物的数量
char m_szKillBossName[MAXBOSSCOUNT][32]; // 保存杀死boss的玩家的名字 这里有问题如果玩家不是顺序杀boss的话
BYTE m_KillNameCount; // 杀死boss的玩家的个数不能超过6个MAXBOSSCOUNT
int m_MonsterTotal; // 副本中一共出现过的怪物的总数
// 提供给脚本临时保存副本相关数据用的数据
CCLVariant m_DynamicVar; // 实体动态变量
int m_nValues[MAXFBPARAM]; // 给脚本使用的存储空间
CTimer<1000> m_1sTimer;
unsigned int m_nGuildId; //此副本是因为某个行会而创建出来的0-不属于某个行会
public:
//对应的场景配置信息
SceneConfigList* m_vSceneConfig;
};