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

📄 ainpc.h

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 H
📖 第 1 页 / 共 2 页
字号:
// AINpc.h: interface for the CMonster class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_AINPC_H__52682938_5D82_4101_B888_6A4A3F30EB51__INCLUDED_)
#define AFX_AINPC_H__52682938_5D82_4101_B888_6A4A3F30EB51__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "define.h"
#include "gameobj.h"
#include "GameBlock.h"
#include "Timeout.h"
#include "Item.h"
#include "battlesystem.h"
#include "Myheap.h"
#include "GameMap.h"
#include "StatusMore.h"
#include "protocol.h"
#include "UserTable.h"
#include "autolink.h"
#include "maptrap.h"
#include "Role.h"
#include "Magic.h"
//////////////////////////////////////////////////////////////////////
enum {	ATKUSER_LEAVEONLY				= 0,				// 只会逃跑
		ATKUSER_PASSIVE					= 0x01,				// 被动攻击
		ATKUSER_ACTIVE					= 0x02,				// 主动攻击
		ATKUSER_RIGHTEOUS				= 0x04,				// 正义的(卫兵或玩家召唤和控制的怪物)
		ATKUSER_GUARD					= 0x08,				// 卫兵(无事回原位置)
		ATKUSER_PPKER					= 0x10,				// 追杀黑名
		ATKUSER_JUMP					= 0x20,				// 会跳
		ATKUSER_FIXED					= 0x40,				// 不会动的
		ATKUSER_FASTBACK				= 0x0080,				// 速归
		ATKUSER_LOCKUSER				= 0x0100,				// 锁定攻击指定玩家,玩家离开自动消失
		ATKUSER_LOCKONE					= 0x0200,				// 锁定攻击首先攻击自己的玩家
		ATKUSER_ADDLIFE					= 0x0400,				// 自动加血
		ATKUSER_EVIL_KILLER				= 0x0800,				// 白名杀手
		ATKUSER_WING					= 0x1000,				// 飞行状态
		ATKUSER_NEUTRAL					= 0x2000,				// 中立
		ATKUSER_ROAR					= 0x4000,				// 出生时全地图怒吼
		ATKUSER_NOESCAPE				= 0x8000,				// 不会逃跑
		ATKUSER_EQUALITY				= 0x00010000,				// 不藐视
};

//////////////////////////////////////////////////////////////////////
const int	MONSTERDROPITEM_RANGE		= 2;		// 2*2+1的4次方=625次搜索
const int	NPCDIEDELAY_SECS			= 10;		// MONSTER死亡多少秒后删除
const int	SIMPLEMAGIC_RECRUIT			= 1005;
const OBJID	TYPE_TASK_MONSTER			= 3000;
const bool	DEL_NOW						= true;


const int	DEFAULT_EUDEMON_POTENTIAL	= 50;		// 幻兽的缺省潜力值
const int	MAX_EUDEMON_POTENTIAL		= 100;		// 幻兽最大潜能值
const int	ADD_POTENTIAL_KILLNUM		= 100;		// 每杀死100个目标增加潜力值 
const int	ADD_POTENTIAL_PER_KILLNUM	= 1;
const int	ADD_POTENTIAL_LEVUP			= 5;

const int	ADD_RELATIONSHIP_KILLNUM	= 100;		// 每杀死100个目标增加关系值
const int	ADD_RELATIONSHIP_PER_TIME	= 1;		// 每次增减的关系值

//////////////////////////////////////////////////////////////////////
// 幻兽攻击类型
enum EATK_MODE {
	EATK_MODE_NONE	= 0,	// 无类型
	EATK_MODE_ATK,			// 攻击
	EATK_MODE_ATKDEF,		// 攻防
	EATK_MODE_DEF,			// 防御

	EATK_MODE_LIMIT,
};


//////////////////////////////////////////////////////////////////////
enum PETDATA{
		PETDATA_OWNERID=1,
		PETDATA_OWNERTYPE,
		PETDATA_GENID,
		PETDATA_TYPE,
		PETDATA_NAME,
		PETDATA_LIFE,
		PETDATA_MANA,
		PETDATA_MAPID,
		PETDATA_RECORD_X,
		PETDATA_RECORD_Y,
		PETDATA_DATA,						// 可用于神兽记录NPCID
};

//////////////////////////////////////////////////////////////////////
enum MONSTER_NAME_TYPE{
	NAME_GREEN,			// 绿名怪
	NAME_WHITE,			// 白名怪
	NAME_RED,			// 红名怪
	NAME_BLACK,			// 黑名怪
};

//////////////////////////////////////////////////////////////////////
enum MONSTER_MASKDATA {
	MASK_NONE				= 0,
	MASK_DISABLE_SORB_SOUL	= 1,	// 禁止吸魂
	MASK_DISABLE_STEAL_MONEY= 2,	// 禁止偷窃金钱
};

//////////////////////////////////////////////////////////////////////
char	szPetTable[];
typedef		CGameData<PETDATA, szPetTable, szID>	CPetData;

//////////////////////////////////////////////////////////////////////
class CUser;
class CMonster : public CGameObj, public CRole
{
protected:
	CMonster();
	virtual ~CMonster();
public:
	static CMonster*	CreateNew() 	{ return new CMonster; }

	bool	Create(PROCESS_ID idProcess, CNpcType* pType, const struct ST_CREATENEWNPC* pInfo, LPCTSTR pszName=NULL);
	bool	Create(PROCESS_ID idProcess, CNpcType* pType, const struct ST_CREATENEWNPC* pInfo, CUser* pUser, OBJID idItem=ID_NONE);
	void	ReleaseByOwner()					{ delete this; }

	virtual		bool		FindAroundObj	(OBJID idObjType, OBJID idObj, void** pp)		{ return GetMap()->QueryObj(GetPosX(), GetPosY(), idObjType, idObj, pp); }
	virtual		IRole*		FindAroundRole	(OBJID id)		{ return GetMap()->QueryRole(GetPosX(), GetPosY(), id); }

	virtual CUser*		QueryOwnerUser		()				{ if(IsCallPet() || IsEudemon()) return m_pOwner; return NULL; }	//@@@ 暂略 if(m_pData && m_pData->GetInt(PETDATA_OWNERTYPE) == OWNER_USER) return m_pData->GetInt(PETDATA_OWNERID); 
protected:
	virtual bool		QueryRole(void** ppv)	{ return *ppv=(IRole*)this,true; }
	virtual bool		QueryObj(OBJID idObjType, void** ppv)			{ if(idObjType == OBJ_MONSTER) return *ppv=this,true; return *ppv=NULL,false; }
public:
	virtual IMapThing*	QueryMapThing()			{ return (IMapThing*)this; }
	IRole*				QueryRole()				{ return (IRole*)this; }

public: // IRole
//	virtual OBJID	GetID();
	virtual LPCTSTR	GetName();	//							{ return m_pType->GetStr(NPCTYPEDATA_NAME); }							
//	virtual LPCTSTR	GetMate()							{ return NOMATE_NAME; }
	virtual LPCTSTR	GetTitle()							{ return TITILE_NONE; }

	virtual DWORD 	GetHair				()				{ return 0; }
	virtual int 	GetPosX				()				{ return m_nPosX; }
	virtual int 	GetPosY				()				{ return m_nPosY; }
	virtual int 	GetDir				()				{ return m_nDir; }
//	virtual	BOOL	CheckStatus			(int nStatus);
	virtual I64		GetEffect			()				{ return m_i64Effect; }
	virtual int 	GetPose				()				{ return m_nPose; }
	// 幻兽不使用monstertype表中的等级属性字段 -- zlong 2004-02-24
	virtual DWORD	GetLev				()				{ if (IsEudemon() && m_pEudemonItem) return m_pEudemonItem->GetEudemonLevel(); return m_pType->GetInt(NPCTYPEDATA_LEVEL); }

	virtual	DWORD	GetLife				();	//			{ return m_nCurrLife; }
	virtual DWORD	GetMaxLife			();	//				{ return (m_AddInfo.nMaxLifeAdd + m_pType->GetInt(NPCTYPEDATA_LIFE)); }
//	virtual DWORD	GetMana				()				{ return m_nCurrMana; }
//	virtual DWORD	GetMaxMana			()				{ return m_pType->GetInt(NPCTYPEDATA_MANA); }
	virtual DWORD	GetMinAtk			();
	virtual DWORD	GetMaxAtk			();
	virtual DWORD	GetMgcMinAtk			();
	virtual DWORD	GetMgcMaxAtk			();
	virtual DWORD	GetAttack			()				{ return (GetMaxAtk()+GetMinAtk())/2; }	//{ return (m_pType->GetInt(NPCTYPEDATA_ATTACKMIN)+m_pType->GetInt(NPCTYPEDATA_ATTACKMAX))/2; }
	virtual DWORD	GetAtkHitRate		()				{ return (m_pType->GetInt(NPCTYPEDATA_ATK_HITRATE)); }
	virtual DWORD	GetDef				();
	virtual DWORD	GetDefence			()				{ return m_pType->GetInt(NPCTYPEDATA_DEFENCE); }
	virtual DWORD	GetDefence2			()				{ return m_pType->GetInt(NPCTYPEDATA_DEFENCE2); }
	virtual DWORD	GetDex				();
	virtual DWORD	GetDexterity		()				{ return m_pType->GetInt(NPCTYPEDATA_DEXTERITY); }
	virtual DWORD	GetDdg				();
	virtual DWORD	GetDodge			()				{ return m_pType->GetInt(NPCTYPEDATA_DODGE); }
//	virtual DWORD	GetMagicAtk			()				{ return 0; }
	virtual DWORD	GetMagicDef			();
	virtual	DWORD	GetInterAtkRate		();
	virtual	DWORD	GetIntervalAtkRate	()				{ return m_pType->GetInt(NPCTYPEDATA_ATKSPEED); }

	virtual DWORD	GetPotential		()				{ return m_nPotential; }

	virtual int		AdjustExp(IRole* pTarget, int nRawExp, bool bNewbieBonusMsg=false);
	virtual void	AwardBattleExp		(int nExp, bool bGemEffect=true, bool bIncludeOwner=true);
	virtual int 	AdjustHitRate		(int nHitRate)	{ /*IStatus* pStatus = QueryStatus(STATUS_HITRATE); if(pStatus) return ::CutTrail(0, AdjustData(nHitRate, pStatus->GetPower()));*/ return nHitRate; }
	virtual int 	AdjustAttack		(int nAtk);
	virtual int 	AdjustDefence		(int nDef);
	virtual int 	AdjustMagicAtk		(int nAtk)		{ IStatus* pStatus = QueryStatus(STATUS_SUPER_MATK); if(pStatus) return ::CutTrail(0, AdjustData(nAtk, pStatus->GetPower())); return nAtk; }
	virtual int 	AdjustMagicDef		(int nDef);
	virtual int 	AdjustBowDefence	(int nDef)		{ /*IStatus* pStatus = QueryStatus(STATUS_BOWDEFENCE); if(pStatus) return ::CutTrail(0, AdjustData(nDef, pStatus->GetPower()));*/ return nDef; }
	virtual int 	AdjustWeaponDamage	(int nDamage);
	virtual int 	AdjustMagicDamage	(int nDamage);
	virtual void	SetFightPause		(int nInterval)			{ m_nFightPause = nInterval; }

	int				AdjustFrenzy2Dmg	(int nDamage);

	virtual DWORD	GetLookFace()						{ return m_pType->GetInt(NPCTYPEDATA_LOOKFACE); }
	virtual char	GetLength			()				{ return m_pType->GetInt(NPCTYPEDATA_LENGTH); }
	virtual char	GetFat				()				{ return m_pType->GetInt(NPCTYPEDATA_FAT); }

	virtual int		GetHelmetTypeID		()				{ return m_pType->GetInt(NPCTYPEDATA_HELMET_TYPE); }
	virtual int		GetArmorTypeID		()				{ return m_pType->GetInt(NPCTYPEDATA_ARMOR_TYPE); }
	virtual int 	GetWeaponRTypeID	()				{ return m_pType->GetInt(NPCTYPEDATA_WEAPONR_TYPE); }
	virtual int 	GetWeaponLTypeID	()				{ return m_pType->GetInt(NPCTYPEDATA_WEAPONL_TYPE); }

	virtual void	BroadcastRoomMsg(CNetMsg* pMsg, bool bSendSelf = false);
	virtual void	BroadcastRoomMsg(LPCTSTR szMsg, bool bSendSelf = false);
	virtual void	BroadcastMapMsg(CNetMsg* pMsg, bool bSendSelf = false);
	virtual void	BroadcastMapMsg(LPCTSTR szMsg, bool bSendSelf = false);
	virtual bool	SendMsg(CNetMsg* pMsg);
	virtual bool	SendSysMsg(const char* fmt, ...);
	virtual void	OnTimer(time_t tCurr);

	virtual DWORD	GetSynID			()				{ return m_pData && m_pData->GetInt(PETDATA_OWNERTYPE)==OWNER_SYN ? m_pData->GetInt(PETDATA_OWNERID) : ID_NONE; }
	virtual DWORD	GetSynRank			()				{ return RANK_NONE; }
	virtual DWORD	GetSynRankShow		()				{ return RANK_NONE; }

	virtual bool	IsSimpleMagicAtk	()				{ return m_pType->GetInt(NPCTYPEDATA_MAGIC_TYPE) != ID_NONE && m_pType->GetInt(NPCTYPEDATA_MAGIC_TYPE) != SIMPLEMAGIC_RECRUIT && m_pType->GetInt(NPCTYPEDATA_MAGIC_HITRATE) !=0; }
	virtual int 	GetSimpleMagicHitRate()				{ return m_pType->GetInt(NPCTYPEDATA_MAGIC_HITRATE); }
	int 			GetRecruitMagicPercent()			{ return m_pType->GetInt(NPCTYPEDATA_MAGIC_HITRATE); }

	virtual CMagic*	QueryMagic()						{ return m_pMagic; }
	virtual DWORD	GetProfession()						{ return m_pType->GetInt(NPCTYPEDATA_PROFESSION); }

public: // map
	bool	EnterMapGroup();
	bool	LeaveMapGroup();
//	virtual bool	MoveToward(int nDir);
//	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);	// 魔法轨迹同步
	virtual bool	SendSelfToBlock();
	bool	SendLeaveFromBlock();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -