Files
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

304 lines
8.8 KiB
C++
Raw Permalink 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
#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: 是副本返回true否则返回false那么就是普通场景
*/
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: 成功返回true否则返回false
*/
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名如果为NULL则重新读入所有npc的脚本
* @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;
};