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

📄 npc.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 H
字号:
// NPC.h: interface for the NPC class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_NPC_H__6A6486A6_D04B_4978_88CE_BD1C88F269F0__INCLUDED_)
#define AFX_NPC_H__6A6486A6_D04B_4978_88CE_BD1C88F269F0__INCLUDED_

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

#include "Character.h"
#include <map>
#include <Struct.h>
#include <Timer.h>
#include "Npcai\BattleRecord.h"
#include "ObjectGroup.h"
#include "Const.h"
#include "RatioSelector.h"
#include "misc.h"
#include "NPCAttrForUpdate.h"
#include "SCNPC.h"

struct AI_MSG;
class State;
class AIMessageQueue;
class ObjectGroup;
class Character;
class NPCStateManager;


struct PacketInfo
{
	BYTE	m_byCategory;
	BYTE	m_byProtocol;
	WORD	m_wSize;
	DWORD	m_dwCount;
};

typedef std::map<WORD, PacketInfo>		PACKETINFO_MAP;
typedef std::pair<WORD, PacketInfo>		PACKETINFO_MAP_PAIR;
typedef PACKETINFO_MAP::iterator		PACKETINFO_MAP_ITER;


class NPC : public Character, public SCNPC
{
public :
	typedef RatioSelector<SLOTCODE>	SkillSelector;

public:
	NPC();
	virtual ~NPC();

	virtual VOID				Update( DWORD dwDeltaTick );
	
	inline BASE_NPCINFO*		GetBaseInfo() { return m_pBaseInfo; }
	VOID						SetBaseInfo( BASE_NPCINFO* pNPCInfo );

	VOID						GetNPCRenderInfo( MONSTER_RENDER_INFO * OUT pRenderInfo );

	// 傈捧 包访
	virtual VOID				SetTargetChar( Character *pChar );
	virtual Character*			GetTargetChar() { return m_pTargetChar; }
	VOID						RemoveEnemy(DWORD leaveEnemyKey);
	VOID						SelectBestTarget();
	virtual BOOL				IsFriend( Character *pTarget );
	Character*					SelectSkillTarget( SLOTCODE SkillCode, BOOL bHeal=FALSE );
	virtual VOID				SpecialAction();	// 漂荐青悼
	virtual VOID				StatusResist();		// 惑怕历亲
	VOID						AllRegisterBattleRecord();	// 林函狼 鸥百阑 茫酒辑 BattleRecord俊 殿废秦霖促.

	DWORD						GetCurStateID();
	float						GetDistToTarget() const;
	float						GetDistToNewTarget( Character* pNewTargetChar ) const;

	// 颇扼固磐 包访
	virtual Attributes&			GetAttr()					{ return m_Attr; }
	virtual const Attributes&	GetAttr() const				{ return m_Attr; }

	virtual LEVELTYPE			GetLevel() const			{ return m_pBaseInfo->m_Level; }
	virtual LEVELTYPE			GetDisplayLevel() const		{ return m_pBaseInfo->m_DisplayLevel; }
	BYTE						GetGrade() const			{ return m_pBaseInfo->m_byGrade; }
	virtual float				GetAttackRange() const;
	virtual float				GetSkillRangeBonus() const	{ return (float)m_Attr.GetSkillRangeBonus()/10.0f; }
	virtual float				GetSightRange() const		{ return (float)m_Attr.GetSightRange()/10.0f; }
	virtual eARMOR_TYPE			GetArmorType() const		{ return (eARMOR_TYPE)m_pBaseInfo->m_wArmorType; }
	virtual eMELEE_TYPE			GetMeleeType() const		{ return (eMELEE_TYPE)m_pBaseInfo->m_wAttType; }
	virtual DWORD				GetHP() const				{ return m_dwHP; }
	virtual DWORD				GetMP() const				{ return m_dwMP; }
	virtual DWORD				GetMaxHP() const			{ return m_Attr.GetMaxHP(); }
	virtual DWORD				GetMaxMP() const			{ return m_Attr.GetMaxMP(); }
	virtual char*				GetCharName() const			{ return m_pBaseInfo->m_pszName; }
	virtual int					GetRegenHP() const			{ return m_Attr.GetRecoverHP(); }
	virtual int					GetRegenMP() const			{ return m_Attr.GetRecoverMP(); }
	virtual DWORD				GetPhysicalAvoidValue() const { return (DWORD)( GetLevel()/2.5f + m_Attr.GetPhysicalAvoidRate() ); }
	virtual float				GetPhysicalAttackSpeed() const { return m_Attr.GetAttSpeedRatio()/100.0f; }
	virtual int					GetMoveSpeedRatio() const	{ return m_Attr.GetMoveSpeedRatio(); }
	virtual int					GetAttSpeedRatio() const	{ return m_Attr.GetAttSpeedRatio(); }

	virtual VOID				SetAttr( eATTR_TYPE eAttrType, eATTR_KIND eAttrKind, int iValue ) { m_Attr[eAttrType][eAttrKind] = iValue; m_Attr.UpdateEx(); }
	virtual VOID				SetHP( DWORD dwHP )	{ m_dwHP = BOUND_CHECK( 0, dwHP, GetMaxHP() ); }
	virtual VOID				SetMP( DWORD dwMP )	{ m_dwMP = BOUND_CHECK( 0, dwMP, GetMaxMP() ); }
	virtual VOID				SetHPAttackPowerAsParty( DWORD dwCurMemberNum ) { __UNUSED(dwCurMemberNum); }

	BOOL						IsHPMPRegenNPC();	// 磊悼 HP 府哩登绰 NPC牢啊?

	// 胶懦 包访
	BOOL						UseSkill( SLOTCODE SkillCode );
	virtual RC::eSKILL_RESULT	CanUseSkill( SLOTCODE SkillCode, BOOL bCoolTimerReset = TRUE );
	VOID						SelectSkill();
	VOID						SelectSkill( Character *pTarget, SLOTCODE SkillCode );
	inline SLOTCODE				GetSelectedSkill() const { return m_SelectedSkillCode; }
	inline VOID					ResetSelectedSkill() { m_SelectedSkillCode = SKILLCODE_INVALID; }
	inline WORD					GetSelectedSkillDelay() const { return m_wSelectedSkillDelay; }

	VOID						SetTrackSlot(int iSlot)	{ m_iTrackSlot = iSlot; }
	int							GetTrackSlot()				{ return m_iTrackSlot; }

	BOOL						IsSamePositionWithTarget();
	VOID						GetTrackPos( WzVector &wvDestPos );

	// 呈公 啊鳖快搁 钢绢瘤扁
	BOOL						IsTooCloseToTarget();
	BOOL						CanFallApartFromTarget();

	// target栏肺何磐 钢绢龙 鞘夸啊 乐绰 版快
	BOOL						NeedToRetreatFromTarget();

	// 剐府扁甫 贸府茄促.
	virtual BOOL				ExecuteThrust( BOOL bForcedMove, WzVector *pwvMoveDistance, WzVector &wvPosAfterThrust, float fMoveDistance, BOOL bDownAfterThrust );
	BOOL						IsOnGoodPositionToJump();

	// SendPacket
	virtual RC::ePACKET_SEND_RESULT	SendPacketAround( MSG_BASE_FORWARD * pMsg, WORD wSize, BOOL bSendToMe = TRUE );

	BOOL						MoveAndBroadcast( WzVector *pwvDestPos, eCHAR_MOVE_STATE moveState );
	BOOL						ThrustMoveAndBroadcast( WzVector *pwvDestPos, eCHAR_MOVE_STATE moveState, BOOL &bTouchedSomething, WzVector &wvRotatedVector );

	// 惑怕包访
	virtual	VOID				ChangeState( DWORD dwStateID, LPARAM param1 = 0, LPARAM param2 = 0, LPARAM param3 = 0 );

	VOID						SendAIMessage( AI_MSG *pMsg, WORD wSize, DWORD dwDelay = 0 );
	VOID						SendAIMessageToGroupExceptMe( AI_MSG *pMsg, WORD wSize, DWORD dwDelay = 0 );
	VOID						SendAIMessageAroundExceptMe( AI_MSG *pMsg, WORD wSize, DWORD dwDelay = 0 );

	VOID						GroupCmdAttackToGroup( Character* pTargetChar );
	VOID						GroupCmdStopAttackToGroup();

	virtual VOID				OnEnterField(Field* pField, WzVector* pwzVec);
	virtual VOID				OnLeaveField();

	virtual VOID				OnAttack( Character *pTarget, CODETYPE skillcode, DAMAGETYPE damage );
	virtual DAMAGETYPE			Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE damage );

	// 弊缝包访
	BOOL						JoinGroup( ObjectGroup* pGroup );
	BOOL						LeaveGroup();
	ObjectGroup*				GetGroup()						{ return m_pObjectGroup; }
	VOID						SetGroup( ObjectGroup* pGroup )	{ m_pObjectGroup = pGroup; }
	BOOL						IsMemberOfGroup();
	BOOL						IsLeaderOfGroup();
	BOOL						IsFollowerOfGroup();
	BOOL						IsLeaderAlive();
	inline ObjectGroup*			GetObjectGroup() { return m_pObjectGroup; }

	virtual VOID				Reuse()		{ Release(); }

	// BattleRecord
	BOOL						HasEnemy() const;
	virtual VOID				AddAttackPoint( Character* pAttacker, int attackPoint );
	virtual VOID				AddTotalPoint( Character* pAttacker, int TotalPoint );
	BattleRecord*				GetBattleRecord()		{ return m_pBattleRecord; }
	Character*					SearchTarget();

	// 老窜篮 公矫. 肪诀窍绰 NPC档 乐摆瘤?;
	virtual DWORD				GetExp() const		{ return 1; }

	// Skill
	template <class EnemyFinder>
	Character*					SearchEnemy(EnemyFinder& finder);

	template <class FriendFinder>
	Character*					SearchFriend(FriendFinder& finder);

	SkillSelector&				GetSkillSelector()				{ return m_SkillSelector; }

	virtual BOOL				OnResurrection( float fRecoverExp, float fRecoverHP, float fRecoverMP );
	virtual BOOL				OnDead();
	VOID						DistributeExp();		// 版氰摹甫 盒硅茄促.

	virtual VOID				SetReferencePlayerNum( int iCount ) { __UNUSED(iCount); }
	virtual BOOL				IsOutOfWanderRadius() const { return FALSE; }
	virtual BOOL				IsOutOfRegenLocationLimit( WzVector &vTargetPos ) const { return FALSE; }
	virtual VOID				SetRegenPos( const WzVector& regenPos )	{ __UNUSED(regenPos); }
	BOOL						SearchAreaPos( WzVector &vDestPos );

protected:
	virtual BOOL				Init();
	virtual VOID				Release();
	VOID						AIMsgProgress();
	virtual VOID				SetInitialState( DWORD dwStateID, LPARAM param1=NULL );

private:
	virtual VOID				AddDefaultSkill();		// NPC啊 荤侩啊瓷茄 胶懦甸阑 殿废茄促.

protected:
	BASE_NPCINFO*				m_pBaseInfo;	// NPCInfoParser俊 乐绰 沥焊甫 傍蜡窍绰 器牢磐捞骨肺 昏力窍瘤 富巴
	ObjectGroup					*m_pObjectGroup;

	// AI 包访
	Character					*m_pTargetChar;
	int							m_iTrackSlot;		// 郴啊 眠利窍妨绰 character狼 m_byTrackSlot(眠利窍妨绰 利捞 绝栏搁 -1肺 悸泼茄促.)
	AIMessageQueue				*m_pAIMessageQueue;
	AIMessageQueue				*m_pTempMessageQueue;
	BattleRecord				*m_pBattleRecord;
	SkillSelector				m_SkillSelector;
	Timer						*m_pAggroTimer;
	Timer						*m_pSkillSelectTimer;
	SLOTCODE					m_SelectedSkillCode;
	WORD						m_wSelectedSkillDelay;

	// 惑怕概聪历
	NPCStateManager*			m_pNPCStatusManager;

	// 颇扼固磐
	NPCAttrForUpdate			m_Attr;
	DWORD						m_dwHP;
	DWORD						m_dwMP;
};


// NPC啊 Characte* 措脚俊 DWORD key甫 爱霸 登搁 捞巴档 官层具 茄促.
template <class EnemyFinder>
Character* 
NPC::SearchEnemy(EnemyFinder& finder)
{
	BATTLE_RECORD* pRecord = m_pBattleRecord->Find( finder );
	if (pRecord != NULL)
	{
		DWORD targetObjectKey = pRecord->GetObjectKey();

		Field *pField = GetField();

		if( pField )
		{
			Character* pTarget = pField->FindCharacter( targetObjectKey );

			if (pTarget != GetTargetChar())
			{
				return pTarget;
			}
		}
	}

	return NULL;
}

template <class FriendFinder>
Character* 
NPC::SearchFriend(FriendFinder& finder)
{
	if (m_pObjectGroup!=NULL)
	{
		// 磊脚捞 加茄 弊缝捞唱
		m_pObjectGroup->Find( finder );
		
		// 泅犁 傍拜 措惑阑 鞍捞 傍拜窍绊 乐绰 局甸 吝俊辑 茫绰促
		if (GetTargetChar() != NULL)
		{
			GetTargetChar()->GetObservers().Find( finder );
		}

		return finder.GetTargetCharacter();
	}

	return NULL;
}

#endif // !defined(AFX_NPC_H__6A6486A6_D04B_4978_88CE_BD1C88F269F0__INCLUDED_)















⌨️ 快捷键说明

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