Files
mir_server/server/robot/LogicSystem/DefaultSystem.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

157 lines
5.5 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
#include<map>
/***************************************************************/
/*
/* 默认子系统
/* 对应子系统ID为0的系统主要处理一些逻辑基本消息
/***************************************************************/
class CDefaultSystem:
public CEntitySystem<enDefaultEntitySystemID>
{
public:
/*
* Comments:收到了网络数据包的处理函数
* Param INT_PTR nCmd:数据包的命令
* Param CDataPacketReader & pack:读取器
*/
virtual void OnRecvData(INT_PTR nCmd,CDataPacketReader & pack);
//定时执行
virtual void OnTimeRun(TICKCOUNT currentTick );
// 某坐标位置是否有(某类型)实体
bool HasEntity(unsigned int nEntityType, int nPosX, int nPosY);
bool HasEntity(int nPosX, int nPosY);
// 获取某位置某类型实体
CClientEntity* GetEntity(unsigned int nEntityType, int nPosX, int nPosY,bool include_guard = false);
// 获取其他玩家数据
inline CClientActor* GetOtherData(EntityHandle handle)
{
if (m_OtherActor.find(handle) != m_OtherActor.end())
{
return &m_OtherActor[handle];
}
return NULL;
}
// 获取怪物数据
inline int GetMonsterCount() { return m_Monster.size(); }
inline CClientMonster* GetMonster(EntityHandle handle)
{
if (m_Monster.find(handle) != m_Monster.end())
{
return &m_Monster[handle];
}
return NULL;
}
CClientMonster* GetMonster(bool include_guard = false);
CClientMonster* GetMonsterNot(EntityHandle handle,bool include_guard = false);
CClientMonster* GetNearestMonster(int dis = 14,bool include_guard = false);
CClientMonster* GetNearestMonsterNot(EntityHandle handle,int dis = 14,bool include_guard = false);
// 获取宠物数据
inline CClientPet* GetPet(EntityHandle handle)
{
if (m_Pets.find(handle) != m_Pets.end())
{
return &m_Pets[handle];
}
return NULL;
}
// 获取自己的位置
void GetPosition(int &x, int &y) const;
// 获取其他玩家位置
bool GetOtherPos(EntityHandle handle, int& nX, int& nY);
// 获取怪物位置
bool GetMonsterPos(EntityHandle handle, int& nX, int& nY);
// 获取宠物位置
bool GetPetPos(EntityHandle handle, int& nX, int& nY);
// 获取实体位置
bool GetEntityPos(EntityHandle handle, int& nX, int& nY);
// 请求移动
void Move(int nX, int nY, int nStep, int nDir);
//移动到目标点
void MoveTo(int nEndX, int nEndY, INT_PTR nStep=2);
// 请求复活
void ReqRelive();
//获取距离
int GetDistance(int nPosX,int nPosy);
//获取距离(横纵最长的)
unsigned int GetMaxDistance(int nPosX,int nPosy);
inline static INT_PTR GetDisSqare(INT_PTR nCurrentPosX,INT_PTR nCurrentPosY,INT_PTR nTargetX, INT_PTR nTargetY)
{
nCurrentPosX -= nTargetX;
nCurrentPosY -= nTargetY;
return nCurrentPosX* nCurrentPosX + nCurrentPosY* nCurrentPosY;
}
//计算移动的方向和步子
inline bool CalculateMoveParam(INT_PTR nStartX,INT_PTR nStartY,INT_PTR nEndX, INT_PTR nEndY, INT_PTR & nDir,INT_PTR &nStep,INT_PTR nMinDisSquare=0,INT_PTR nMaxDisSquare =0);
bool GetFanAvailablePos(INT_PTR nCurrentPosX,INT_PTR nCurrentPosY, INT_PTR &nDir,INT_PTR &nStep);
private:
//处理心跳包
void ProcessHeartBeat(CDataPacketReader & recvPack);
//处理玩家登陆失败
void ProcessLoginFail(CDataPacketReader & recvPack);
//处理主角创建包
void ProcessMainActorCreated(CDataPacketReader & recvPack);
//其他玩家进入视野
void ProcessActorAppear(CDataPacketReader &packet);
//怪物进入视野
void ProcessMonsterAppear(CDataPacketReader &packet);
//NPC进入视野
void ProcessNPCAppear(CDataPacketReader &packet);
//宠物出现在视野
void ProcessPetAppear(CDataPacketReader &packet);
//其他实体出现在视野
void ProcessOtherAppear(CDataPacketReader &packet);
// 处理实体消失
void ProcessEntityDisappear(CDataPacketReader &packet);
// 处理主玩家属性变更
void ProcessMainActorPropChange(CDataPacketReader &packet);
// 处理其他实体属性变更
void ProcessOtherEntityPropChange(CDataPacketReader &packet);
// 处理玩家进入场景
void ProcessPlayerEnterScene(CDataPacketReader& packet);
// 处理公共操作结果
void ProcessCommonOpResult(CDataPacketReader& packet);
// 处理其他实体移动
void ProcessOtherEntityMove(CDataPacketReader& packet);
// 处理重设主角位置
void ProcessResetMainActorPos(CDataPacketReader& packet);
// 处理实体死亡
void ProcessEntityDeath(CDataPacketReader&);
// 处理实体瞬间移动
void ProcessEntityInstatnceMove(CDataPacketReader& packet);
// 处理传送
void ProcessEntityTransport(CDataPacketReader& packet);
// 更新实体属性实现函数
void UpdateEntityPropImpl(CClientEntity* pEntity, CDataPacketReader& packet);
// 更新玩家坐标。用于客户端和服务器走路不同步的时候,根据服务器位置来调整
void SetPosition(const int nX, const int nY);
// 地图坐标实体映射关系维护方法
void AddMap(CClientEntity* pEntity, int nPosX, int nPosY);
void DelMap(CClientEntity* pEntity, int nPosX, int nPosY);
void ChgMap(CClientEntity* pEntity, int nOldPosX, int nOldPosY, int nPosX, int nPosY);
private:
std::map<EntityHandle,CClientActor> m_OtherActor; //其他玩家
std::map<EntityHandle,CClientMonster> m_Monster; //怪物
std::map<EntityHandle,CClientNPC> m_Npc; //NPC
std::map<EntityHandle,CClientPet> m_Pets; //宠物
std::map<EntityHandle,CClientTransfer> m_Transfer; //传送门
std::map<int, std::vector<CClientEntity*>> m_PosiEntityMap; //地图坐标实体映射
int m_nMapWidth;
TICKCOUNT m_heartbeart;
};