Files
mir_server/server/robot/Entity/ClientEntity.h

378 lines
7.1 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
#include "util/Utility.h"
template<typename TPropType>
class CPropertySetOp
{
public:
template < class T>
inline T GetProperty(int nPropID) const
{
T temp=0;
const CPropertySet* set = GetPropertyPtr();
if(set ==NULL) return temp;
return *(T*)set->GetValuePtr(nPropID);
}
template < class T>
inline VOID SetProperty(int nPropID, const T& value)
{
T oldValue = GetProperty<T>(nPropID);
if(oldValue == value )return;
CPropertySet* set = GetPropertyPtr();
if(set ==NULL) return ;
set->SetValue(nPropID,value);
OnPropertyChange(nPropID,oldValue,value);
}
virtual CPropertySet* GetPropertyPtr()= 0;
virtual const CPropertySet* GetPropertyPtr() const = 0;
INT_PTR GetPropertySize() const
{
return sizeof(TPropType) - sizeof(CPropertySet);
}
inline const char* GetPropertyDataPtr() const
{
const CPropertySet* set = GetPropertyPtr();
if(set ==NULL) return NULL;
return set->GetValuePtr(0);
}
template < class T>
void OnPropertyChange(int nPropID, const T& oldValue,const T& value)
{
}
};
template<class PropType>
class EntityT : CPropertySetOp<PropType>
{
};
class CClientEntity
{
public:
CClientEntity()
{
m_handle = 0;
m_szShowName[0] = '\0';
m_State = 0;
}
template < class T>
inline T GetProperty(int nPropID) const
{
T temp=0;
const CPropertySet* set = GetPropertyPtr();
if(set ==NULL) return temp;
return *(T*)set->GetValuePtr(nPropID);
}
template < class T>
inline VOID SetProperty(int nPropID, const T& value)
{
T oldValue = GetProperty<T>(nPropID);
if(oldValue == value )return;
CPropertySet* set = GetPropertyPtr();
if(set ==NULL) return ;
set->SetValue(nPropID,value);
OnPropertyChange(nPropID,oldValue,value);
}
inline INT_PTR GetPropertySize() const
{
return GetPropertyTotalSize() - sizeof(CPropertySet);
}
inline const char* GetPropertyDataPtr() const
{
const CPropertySet* set = GetPropertyPtr();
if(set ==NULL) return NULL;
return set->GetValuePtr(0);
}
template < class T>
void OnPropertyChange(int nPropID, const T& oldValue,const T& value)
{
}
inline void SetHandle(EntityHandle hdl) { m_handle = hdl; }
inline EntityHandle GetHandle() const { return m_handle; }
inline const char* GetName() const { return m_szShowName; };
inline size_t GetNameBuffLen() const { return ArrayCount(m_szShowName); }
inline void SetName(const char* name)
{
CUtility::CopyCharArrayS(m_szShowName, name);
}
inline void GetPosition(int &x, int &y) const
{
x = GetProperty<int>(PROP_ENTITY_POSX);
y = GetProperty<int>(PROP_ENTITY_POSY);
}
bool IsMonster(INT_PTR nEntityType)
{
switch (nEntityType)
{
//case enNpc:
//case enMovingNPC:
case enMonster:
case enGatherMonster:
return true;
}
return false;
}
static INT_PTR GetDir(INT_PTR nSourceX, INT_PTR nSourceY, INT_PTR nTargetX, INT_PTR nTargetY)
{
INT_PTR nDir = DIR_UP;
INT_PTR nSelfPosx = nTargetX - nSourceX;
INT_PTR nSelfPosy = nTargetY - nSourceY;
if(nSelfPosx >0)
{
if( nSelfPosy >0 )
{
nDir =DIR_DOWN_RIGHT ;
}
else if(nSelfPosy ==0)
{
nDir = DIR_RIGHT;
}
else
{
nDir =DIR_UP_RIGHT ;
}
}
else if(nSelfPosx ==0)
{
if( nSelfPosy >0 )
{
nDir =DIR_DOWN ;
}
else if(nSelfPosy ==0)
{
nDir = DIR_STOP;
}
else
{
nDir =DIR_UP ;
}
}
else
{
if( nSelfPosy >0 )
{
nDir = DIR_DOWN_LEFT ;
}
else if(nSelfPosy ==0)
{
nDir = DIR_LEFT;
}
else
{
nDir = DIR_UP_LEFT;
}
}
return nDir;
}
inline bool IsDeath()
{
if (m_State & 0x01) return true;
return !!(GetProperty<unsigned int>(PROP_CREATURE_STATE) & (0x1 << esStateDeath) );
}
inline void SetStateDeath()
{
m_State |= 0x01;
}
protected:
virtual CPropertySet* GetPropertyPtr()= 0;
virtual const CPropertySet* GetPropertyPtr() const = 0;
virtual INT_PTR GetPropertyTotalSize() const = 0;
private:
EntityHandle m_handle; // 主玩家句柄
char m_szShowName[256]; // 主玩家显示名称(玩家名称+帮派名称+结拜名称等)
int m_State;//0x00:Idle 0x01:死亡
};
// 玩家数据
class CClientActor : public CClientEntity
{
public:
CClientActor()
{
}
inline int GetSceneId() const { return m_nSceneId; }
inline byte GetFubenId() const { return m_nFubenId;}
inline const char* GetSceneName() const { return m_szSceneName; }
inline const char* GetMapName() const { return m_szMapName; }
inline void SetSceneId(const int nId)
{
m_nSceneId = nId;
}
inline void SetFubenId( const int nFbId)
{
m_nFubenId = nFbId;
}
inline void SetTeamId( int nTeamId )
{
}
inline void SetSceneName(const char* sceneName)
{
CUtility::CopyCharArrayS(m_szSceneName, sceneName);
}
inline void SetMapName(const char* mapName)
{
CUtility::CopyCharArrayS(m_szMapName, mapName);
}
protected:
CPropertySet* GetPropertyPtr()
{
return &propertySet;
}
const CPropertySet* GetPropertyPtr() const
{
return &propertySet;
}
INT_PTR GetPropertyTotalSize() const
{
return sizeof(propertySet);
}
private:
CActorProperty propertySet; // 主玩家属性集
int m_nSceneId; // 玩家所在的场景Id
char m_szSceneName[32]; // 玩家所在场景名称
char m_szMapName[32]; // 场景所在地图名字
int m_nOldPosX; // 备份移动之前的坐标位置
int m_nOldPosY;
BYTE m_nFubenId; //是否在副本上
bool m_boTeam; //是否带有队伍标记
};
// 怪物数据
class CClientMonster : public CClientEntity
{
public:
CClientMonster()
{
}
void SetMonsterType(BYTE type) { nMonsterType = type; }
//是否为守卫
bool IsGuard() const { return nMonsterType == 7; }
protected:
CPropertySet* GetPropertyPtr()
{
return &propertySet;
}
const CPropertySet* GetPropertyPtr() const
{
return &propertySet;
}
INT_PTR GetPropertyTotalSize() const
{
return sizeof(propertySet);
}
private:
CMonsterProperty propertySet; // 怪物属性集
BYTE nMonsterType; //怪物类型1普通2精英3神boss4boss6练功7人形8世界boss
};
// NPC数据
class CClientNPC : public CClientEntity
{
public:
CClientNPC()
{
}
protected:
CPropertySet* GetPropertyPtr()
{
return &propertySet;
}
const CPropertySet* GetPropertyPtr() const
{
return &propertySet;
}
INT_PTR GetPropertyTotalSize() const
{
return sizeof(propertySet);
}
private:
CNPCProperty propertySet; // NPC属性集
};
// 宠物数据
class CClientPet : public CClientEntity
{
public:
CClientPet()
{
}
protected:
CPropertySet* GetPropertyPtr()
{
return &propertySet;
}
const CPropertySet* GetPropertyPtr() const
{
return &propertySet;
}
INT_PTR GetPropertyTotalSize() const
{
return sizeof(propertySet);
}
private:
CPetProperty propertySet; // 宠物属性集
};
// 传送门数据
class CClientTransfer : public CClientEntity
{
public:
CClientTransfer()
{
}
protected:
CPropertySet* GetPropertyPtr()
{
return &propertySet;
}
const CPropertySet* GetPropertyPtr() const
{
return &propertySet;
}
INT_PTR GetPropertyTotalSize() const
{
return sizeof(propertySet);
}
private:
CTransferProperty propertySet; // 传送门属性集
};