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

233 lines
6.0 KiB
C++

#pragma once
/**************************************
英雄系统
**************************************/
class CHero;
class CHeroSystem:
public CEntitySubSystem<enHeroSystemId,CHeroSystem,CActor>
{
public:
typedef CEntitySubSystem<enHeroSystemId,CHeroSystem,CActor> Inherid;
friend class CEntitySubSystem<enHeroSystemId,CHeroSystem,CActor>;
//英雄状态
enum eHeroState
{
psStateSleep, //休息状态
psStateNormal, //出战状态
psStateMerge, //合体状态
};
//英雄的数据修改的标记
enum eHeroData
{
edHeroBasicData, //基本数据
edHeroSkillData, //技能数据
edHeroEquipData, //装备数据
};
//英雄数据结构
typedef struct tagHeroData
{
HERODBDATA data;//DB里的数据
//英雄自身属性
CAttrCalc cal; //属性计算器
CAttrCalc basicCal; //基本的属性: 基础属性 + 装备属性
//加成到人物身上的属性
CAttrCalc mergeCal; //附体属性加成
CAttrCalc battleCal; //出战属性加成
float nMergeMaxAttackRate; //附体最大攻击比率
float nMergeMaxDefenceRate; //附体最大防御比率
CVector<HEROSKILLDATA> skills; //技能列表
CHeroEquip equips; //装备
EntityHandle handle; //句柄
unsigned long long nMaxExp; //最大的经验
unsigned int nBaseMaxHp; //基础的血 ,用于技能,暂时保持在这里
unsigned int nBaseMaxMp; //基础的蓝 ,用于技能,暂时保持在这里
unsigned int nFootAppear; //足迹外观
float fExpRate; //获得人物经验比例
tagHeroData()
{
equips.clear();
skills.clear();
}
}HERODATA,*PHERODATA;
CHeroSystem();
~CHeroSystem();
void Destroy() ;
virtual void OnEnterGame();
virtual bool Initialize(void *data,SIZE_T size);
virtual void OnTimeCheck(TICKCOUNT nTickCount);
void OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader & reader);
void Save(PACTORDBDATA pData);
//初始化的时候检测英雄
static void OnInitCheckHero();
void ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet );
//英雄属性附加到人物
CAttrCalc & CalcAttributes(CAttrCalc &cal);
//查看英雄
void ViewHeros(CActor * pActor);
//进入场景
void OnEnterScene();
//获取英雄列表
inline CVector<HERODATA> &GetHeroList() {return m_heros;}
//是否能增加英雄
bool CanAddHero(bool bWithTipmsg=false);
//添加英雄
int AddHero(int nHeroId , int nStage = 1, int nLevel =1);
//通过英雄的ID获取英雄的指针
inline HERODATA * GetHeroData(INT_PTR nHeroId)
{
BYTE bHeroId= (BYTE) nHeroId;
for(INT_PTR i=0; i< m_heros.count(); i++)
{
if(m_heros[i].data.bID == bHeroId)
{
return &m_heros[i];
}
}
return NULL;
}
//获取英雄数量
inline INT_PTR GetHeroCount()
{
return m_heros.count();
}
//获取战斗中英雄指针
CHero * GetBattleHeroPtr();
//获取战斗中的英雄ID
int GetBattleHeroId();
//设置英雄的数据改变
inline void SetHeroDataModifyFlag(INT_PTR nDataType,bool flag)
{
if(HasDbDataInit() ==false) return; //如果数据还没有装载,不能设置标记
switch(nDataType)
{
case edHeroBasicData:
m_HeroBasicDataHasModifed= flag;
break;
case edHeroSkillData:
m_heroskillHasModified =flag;
break;
default:
break;
}
}
//获取英雄存储位置 如果不存返回-1
INT_PTR GetHeroPos(INT_PTR nHeroId) ;
//重设所有英雄属性
void ResetAllHeroProperty(bool bNewHero = false,bool bRefeshAppear =false);
//英雄学习技能
bool LearnSkill(int nHeroID, int nSkillID);
//获取英雄技能等级
int GetSkillLevel(int nHeroId, int nSkillId);
//升级英雄技能
bool SkillLevelUp(int nHeroId,int nSkillId);
//英雄升阶
bool StageUp(int nHeroId, int nStage, int nBless);
//英雄出战
bool SetHeroBattle(INT_PTR nHeroId,bool boClient =true );
//收回英雄
bool SetHeroSleep(INT_PTR nHeroId,bool bClient =true);
//英雄被攻击
void OnAttacked(CAnimal *pEntity);
//英雄攻击
void OnAttackOther(CAnimal * pEntity);
//英雄跟随
void FollowEntity(CAnimal *pActor);
//玩家Death时英雄的处理
void OnDeath();
//添加经验
void OnAddExp(unsigned int nExp, bool boRate = true, int nHeroId = 0);
//重置英雄属性
void ResetProperty(INT_PTR nHeroPos,bool boNewHero =false,bool boRefAppear =false);
//收回出战英雄
void CallbackBattleHero(bool boClient);
//跨天清除祝福值
void EveryDayClearBless();
//改变英雄经验
bool RealChangeExp(INT_PTR nPos,unsigned int nAddExp);
//下发英雄数据(创建&&更新)
void SendHeroData(HERODATA &Hero);
private:
void HandError(CDataPacketReader &packet){}
void HandGetHeroList(CDataPacketReader &packet); //获取英雄列表
void HandChangeHeroName(CDataPacketReader &packet); //英雄改名
void HandHeroSkillLevelUp(CDataPacketReader &packet); //技能升级
void HandHeroStageUp(CDataPacketReader &packet);//英雄升阶
void HandSetHeroState(CDataPacketReader &packet); //英雄出战或收回
void HandViewHero(CDataPacketReader &packet); //查看英雄
void HandHeroLevelUp(CDataPacketReader &packet); //英雄升级
//计算英雄的属性
void CalHeroProp(HERODATA & Hero);
//下发英雄技能
void SendAllSkills();
//记录日志
void LogHero(const INT_PTR nLogIdent, const INT_PTR nHeroId, const INT_PTR nParam1, const INT_PTR nParam2);
//英雄改名
void ChangeHeroName(INT_PTR nPos,char * name);
//英雄事件
void TriggerEvent(INT_PTR nSubEvent,INT_PTR nParam1=-1,INT_PTR nParam2=-1,INT_PTR nParam3=-1,INT_PTR nParam4=-1);
//英雄合体
bool SetHeroMerge(INT_PTR nHeroId,bool bClient =true);
//下发英雄的经验
void SetClientHeroExp(HERODATA &Hero);
//下发英雄状态
void SendHeroStateChange(INT_PTR nPos);
public:
float m_fExpRate; //英雄的经验倍率
private:
CVector<HERODATA> m_heros; //玩家的英雄的数据
bool m_heroskillHasModified; //英雄的技能数据是否发生改变
bool m_HeroBasicDataHasModifed; //英雄的基本数据是否发生改变
};