📄 npc.h
字号:
// virtual BOOL CheckStatus (int nStatus) { return 0; }
virtual I64 GetEffect () { return m_i64Effect; }
virtual int GetPose () { return m_pData->GetInt(STATUARYDATA_POSE); }
virtual DWORD GetLev () { if(IsGoal()) return GetData(GOALNPC_LEVEL); return 0; }
virtual DWORD GetLife () { return m_pData->GetInt(NPCDATA_LIFE); }
virtual DWORD GetMaxLife () { return m_pData->GetInt(NPCDATA_MAXLIFE); }
virtual DWORD GetAtkHitRate () { ASSERT(!"GetAtkHitRate"); return 0; }
virtual int GetArmorTypeID ();
virtual int GetWeaponRTypeID ();
virtual int GetWeaponLTypeID ();
virtual int GetMountTypeID ();
// virtual CGameMap* GetMap () { CHECKF(m_pMap); return m_pMap; }
virtual DWORD GetSynID () { return m_pData->GetInt(NPCDATA_OWNERTYPE)==OWNER_SYN ? m_pData->GetInt(NPCDATA_OWNERID) : ID_NONE; }
virtual DWORD GetSynRankShow () { return m_pData->GetInt(STATUARYDATA_RANKSHOW_HAIR)>>16; }
public: // const
virtual bool IsAlive () { return !(IsDynaNpc() && m_pData->GetInt(NPCDATA_MAXLIFE)>0 && m_pData->GetInt(NPCDATA_LIFE)<=0 || IsDeleted()); } // NPCDATA_LIFE is a flag
virtual bool IsDelThis () { return IsDeleted() && m_tDie.IsTimeOut(); } // ASSERT(!IsAlive());
// return true: ppv返回对象指针
virtual bool QueryObj(OBJID idObjType, void** ppv) { if(idObjType==OBJ_NPC) return *ppv=this,true; return *ppv=NULL,false; }
virtual bool QueryRole(void** ppv) { return *ppv=QueryRole(),true; }
virtual CUser* QueryOwnerUser () { return NULL; } //@@@ 略
public: // modify attrib ------------------------------
virtual void SetStatus (int nStatus, bool bSynchro=true);
virtual void ClsStatus (int nStatus, bool bSynchro=true);
virtual bool AddAttrib (int idxAttr, __int64 i64Data, int bSynchro);
virtual void ProcessOnMove (int nMoveMode) {}
virtual IStatus* QueryStatus(OBJID idType) { ASSERT(IsDynaNpc()); return CRole::QueryStatus(idType); }
virtual IStatusSet* QueryStatusSet() { ASSERT(IsDynaNpc()); return CRole::QueryStatusSet(); }
public: // money --------------------------------
// virtual bool SpendMoney (DWORD nMoney, bool bSynchro) { return 0; }
// virtual bool GainMoney (DWORD nMoney, bool bSynchro) { return 0; }
public: // system
virtual void BroadcastRoomMsg(CNetMsg* pMsg, bool bSendSelf = false);
virtual void BroadcastRoomMsg(LPCTSTR szMsg, bool bSendSelf = false);
virtual void OnTimer(time_t tCurr);
public: // map
virtual bool MoveToward(int nDir) { return 0; }
virtual void TransPos(int nPosX, int nPosY);
virtual void JumpPos(int nPosX, int nPosY) {}
virtual bool SyncTrackTo(int nPosX, int nPosY, int nDir, DWORD dwAction) { return 0; }
virtual void GetFootPrint (int& nPosX, int& nPosY) { nPosX = GetPosX(); nPosY = GetPosY(); }
public: // fight ------------------------------
virtual void ClrAttackTarget () { SetAttackTarget(NULL); }
virtual bool SetAttackTarget(IRole* pTarget) { return true; }
virtual bool AutoSkillAttack(IRole* pTarget) { return false; }
virtual bool AdditionMagic(int nLifeLost, int nDamage) { return false; }
virtual int Attack(IRole* pTarget) { ASSERT(!"Attack"); return 0; }
virtual bool BeAttack(bool bMagic, IRole* pTarget, int nPower, bool bReflectEnable=true);
virtual bool MagicAttack(int nType, OBJID idTarget, int x, int y) { ASSERT(!"MagicAttack"); return 0; }
virtual void Kill(IRole* pTarget, DWORD dwDieWay) { ASSERT(!"Kill"); }
virtual void BeKill(IRole* pTarget = NULL);
virtual bool IsAtkable(IRole* pTarget, bool bSendHint=false) { return false; }
virtual bool IsBeAtkable();
virtual int GetAttackRange(int nTargetSizeAdd) { ASSERT(!"GetAttackRange"); return 0; }
virtual int GetSizeAdd() { if(IsSynFlag()) return SYNFLAG_SIZEADD; return DEFAULT_NPC_SIZEADD; }
virtual int GetLuck() { return 0; }
virtual void SendDamageMsg(OBJID idTarget, int nDamage) { ASSERT(!"SendDamageMsg"); }
private: // IRole ================================================================================
// int m_nPosX, m_nPosY;
public: // const
int GetSort() { return m_pData->GetInt(NPCDATA_SORT); }
int GetType() { return m_pData->GetInt(NPCDATA_TYPE); }
void ChangeDir(int nLook) { m_pData->SetInt(NPCDATA_LOOKFACE, MakeLookFace(MaskLook(GetLookFace()), MaskDir(nLook))); }
bool IsRecycleEnable() { return (GetSort() & NPCSORT_RECYCLE) != 0; }
enum { MATE_ENABLE=true };
bool IsOwnerOf(CUser* pUser, bool bMateEnable=false);
bool IsDieAction() { return (GetSort() & NPCSORT_DIEACTION) != 0; }
bool IsStatuary() { return GetType() == _STATUARY_NPC; } // 自动设置CGameMap::m_idSyn
bool IsGoal() { return GetType()==_WEAPONGOAL_NPC || GetType()==_MAGICGOAL_NPC || GetType()==_BOWGOAL_NPC; }
bool IsSynFlag() { return GetType() == _SYNFLAG_NPC; }
bool IsAwardScore() { return GetType() == _SYNFLAG_NPC; }
bool IsDelEnable();
bool IsSynNpc() { return GetInt(NPCDATA_OWNERTYPE)==OWNER_SYN && GetInt(NPCDATA_OWNERID)!=ID_NONE; }
bool IsUserNpc() { return GetInt(NPCDATA_OWNERTYPE)==OWNER_USER && GetInt(NPCDATA_OWNERID)!=ID_NONE; }
int GetStorageSize() { return GetData(STORAGENPC_SIZE); }
bool IsSynMoneyEmpty();
bool IsShelfNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _ROLE_SHELF_NPC; }
bool IsSynWarLetter() { return GetType() == _SYN_NPC_WARLETTER; }//是否是下战书的NPC
public: // application
bool SendSelfToBlock();
bool SendLeaveFromBlock();
bool ActivateNpc(IRole* pRole, int nAction); // 对物件进行操作
CItem* Recycle(OBJID idUser); //??? need call DelNpc() follow
bool DelNpc(); // call this mast !IsDeleted()
protected:
bool DeleteRecord() { CHECKF(IsDynaNpc()); return m_pData->DeleteRecord(); }
void CheckFightTime();
void RecruitLife();
void BroadcastScore();
public:
//---------- NPC 属性存取函数 --------------------------
int GetInt (NPCDATA idx) { CHECKF(m_pData); return m_pData->GetInt(idx); }
LPCTSTR GetStr (NPCDATA idx) { CHECKF(m_pData); return m_pData->GetStr(idx); }
int GetData (int idx) { CHECKF(m_pData); CHECKF(idx>=0 && idx<MAX_NPCDATA); return m_pData->GetInt(NPCDATA(NPCDATA_DATA0 + idx)); }
OBJID GetMapID ();
//---------- 修改NPC属性 ------------------
void SetInt (NPCDATA idx, int nData, bool bUpdate = false) { CHECK(m_pData && IsDynaNpc()); m_pData->SetInt(idx, nData); if(bUpdate) m_pData->Update(); }
void SetStr (NPCDATA idx, LPCTSTR szData, int nSize, bool bUpdate = false) { CHECK(m_pData && IsDynaNpc()); m_pData->SetStr(idx, szData, nSize); if(bUpdate) m_pData->Update(); }
void SetData (int idx, int nData, BOOL bUpdate) {
CHECK(m_pData && IsDynaNpc());
CHECK(idx < MAX_NPCDATA);
m_pData->SetInt(NPCDATA(NPCDATA_DATA0 + idx), nData);
if(bUpdate) m_pData->Update(); }
void SaveInfo ();
BOOL ChangePos (OBJID idMap, int nPosX, int nPosY);
bool SetSynOwnerID(OBJID idSyn, BOOL bWithLinkMap); // true: with link map
bool SetUserOwnerID(OBJID idUser, BOOL bWithLinkMap); // true: with link map
public: // 分类接口 ------------------------------------------------------------------
void SetOccupyTime();
int GetLostFixMoney();
int GetMaxFixMoney();
void OnFightEnd();
OBJID GetApplyAttackerSynID();
virtual bool IsShopNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _SHOPKEEPER_NPC; } // || (m_pData->GetInt(NPCDATA_SORT)&NPCSORT_SHOP)!=0
virtual CNpcShop* QueryShop() { CHECKF(m_pShop); return m_pShop; }
virtual bool IsTaskNpc() { return m_pData->GetInt(NPCDATA_TYPE)==_TASK_NPC || (m_pData->GetInt(NPCDATA_SORT)&NPCSORT_TASK)!=0; }
virtual CNpcTask* QueryTask() { CHECKF(m_pTask); return m_pTask; }
virtual bool IsStorageNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _STORAGE_NPC; }
// virtual bool IsAuctionStorageNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _AUCTION_NPC/*_AUCTION_STORAGE_NPC*/; }
virtual bool IsAuctionNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _AUCTION_NPC; }
virtual IAuction* QueryAuction() {CHECKF(m_pAuction);return m_pAuction/*->QueryInterface()*/;}
//不需要 virtual CNpcStorage* QueryStorage() { CHECKF(m_pStorage); return m_pStorage; }
virtual bool IsTrunkNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _TRUNCK_NPC || m_pData->GetInt(NPCDATA_TYPE) == _ROLE_SHELF_NPC; }
virtual CNpcTrunk* QueryTrunk() { if(!m_pTrunk) CreateFuncTrunk(m_idProcess); CHECKF(m_pTrunk); return m_pTrunk; }
// 幻兽孵化器NPC -- 借用Trunk的实现
virtual bool IsEudemonBrooderNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _EUDEMON_TRAINPLACE_NPC; }
virtual CNpcTrunk* QueryEudemonBrooder() { if (!m_pEudemonBrooder) CreateFuncEudemonBrooder(m_idProcess); CHECKF (m_pEudemonBrooder); return m_pEudemonBrooder; }
// 幻兽仓库NPC -- 借用Trunk的实现
virtual bool IsEudemonStorageNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _EUDEMON_TRAINPLACE_NPC; }
virtual CNpcTrunk* QueryEudemonStorage() { if (!m_pEudemonStorage) CreateFuncEudemonStorage(m_idProcess); CHECKF (m_pEudemonStorage); return m_pEudemonStorage; }
//?? 临时加载
virtual bool IsSceneNpc() { return (m_pData->GetInt(NPCDATA_SORT) & NPCSORT_SCENE) != 0; }
virtual CNpcScene* QueryScene() { CHECKF(m_pScene); return m_pScene; }
virtual bool IsLinkNpc() { return (m_pData->GetInt(NPCDATA_SORT) & NPCSORT_LINKMAP) != 0; }
virtual CNpcLink* QueryLinkMap() { CHECKF(m_pLinkMap); return m_pLinkMap; }
virtual CNpcTable* QueryTable() { return m_pTable; }
virtual bool IsBetNpc() { return m_pData->GetInt(NPCDATA_TYPE) == _ROLE_DICE_NPC; } // || (m_pData->GetInt(NPCDATA_SORT)&NPCSORT_BET)!=0
virtual CNpcBet* QueryBet() { CHECKF(m_pBet); return m_pBet; }
OBJID GetRecordID() { CHECKF(m_pData); return m_pData->GetID(); }
bool IsDeleted() { return m_tDie.IsActive(); }
bool IsDynaNpc() { return m_bDynaNpc; }
private:
bool CreateFuncObj(PROCESS_ID idProcess);
bool CreateFuncTrunk(PROCESS_ID idProcess);
bool CreateFuncEudemonBrooder(PROCESS_ID idProcess);
bool CreateFuncEudemonStorage(PROCESS_ID idProcess);
bool CheckSortMutex();
void UpdateHoldFloor(bool bEnter);
protected:
CNpcShop* m_pShop;
IAuction* m_pAuction;
CNpcTask* m_pTask;
// CNpcStorage* m_pStorage;
// CNpcTrunk* m_pUserAuctionStorage;
CNpcTrunk* m_pTrunk;
CNpcScene* m_pScene;
CNpcLink* m_pLinkMap;
CNpcBet* m_pBet;
CAutoPtr<CNpcTable> m_pTable;
CNpcTrunk* m_pEudemonBrooder;
CNpcTrunk* m_pEudemonStorage;
protected: // data
OBJID m_id;
INpcData* m_pData;
bool m_bDynaNpc;
// CGameMap* m_pMap; // fast reference
// IStatusSet* m_setStatus;
I64 m_i64Effect;
protected: // ctrl
CTimeOut m_tSynEvent;
CTimeOut m_tBroadcastScore;
CTimeOut m_tDie;
CTimeOut m_tSynWarLetter;//每间隔20分钟检查占领帮派是否到了7周
bool m_bFeeOK;
// PROCESS_ID m_idProcess;
MYHEAP_DECLARATION(s_heap)
};
#endif // !defined(AFX_TASKNPC_H__D7A2DFC3_2C2C_4F67_BB52_8F55409E76BC__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -