⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npc.h

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 H
📖 第 1 页 / 共 2 页
字号:
//	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 + -