📄 npc.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 + -