378 lines
7.1 KiB
C
378 lines
7.1 KiB
C
|
|
#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; // 传送门属性集
|
|||
|
|
};
|