📄 targetfinder.h
字号:
#pragma once
#include "Character.h"
// 拳老捞抚 官层具 茄促. -_-;
//--------------------------------------------------------------------------------------------------------------
//
// TargetFinder
//
//--------------------------------------------------------------------------------------------------------------
// 漂沥 惑怕狼 某腐磐甫 茫绰促.
class TargetFinder
{
public :
TargetFinder() : m_eTargetType(SKILL_TARGET_NONE)
{
Init();
}
VOID Init()
{
m_pOwner = NULL;
m_pTarget = NULL;
}
virtual VOID SetOwner( Character* pOwner )
{
m_pOwner = pOwner;
pOwner->GetPos( &m_vOwnerPos );
m_fOwnerSight = pOwner->GetSightRange();
}
virtual VOID SetTargetType( eSKILL_TARGET_TYPE eType )
{
m_eTargetType = eType;
}
// 搬苞
Character *GetTarget() { return m_pTarget; }
virtual bool operator () ( Object* pObject ) = 0;
bool CheckTarget( Object* pObject )
{
Character* pTarget = dynamic_cast<Character*>(pObject);
if( !pTarget ) return false;
float fDist = pTarget->GetDist( m_vOwnerPos );
if( m_pOwner == pTarget ) return false;
if( fDist >= m_fOwnerSight ) return false;
if( !m_pOwner->IsCoincidentWithTargetType( pTarget, m_eTargetType ) ) return false;
return true;
}
protected :
Character* m_pOwner;
Character* m_pTarget;
eSKILL_TARGET_TYPE m_eTargetType; // 茫酒具且 鸥百 鸥涝
float m_fOwnerSight;
WzVector m_vOwnerPos;
};
//--------------------------------------------------------------------------------------------------------------
// NearestCharacterFinder
//--------------------------------------------------------------------------------------------------------------
class NearestTargetFinder : public TargetFinder
{
public :
NearestTargetFinder()
{
}
bool operator () (Object* pObject)
{
if( !CheckTarget( pObject ) ) return false;
Character* pTarget = dynamic_cast<Character*>(pObject);
if( pTarget->IsDead() ) return false;
if( !pTarget->CanBeAttacked() ) return false;
float fDist = pTarget->GetDist( m_vOwnerPos );
if( m_pTarget && fDist >= m_TargetDist ) return false;
m_pTarget = pTarget;
m_TargetDist = fDist;
return false;
}
private :
float m_TargetDist;
};
//--------------------------------------------------------------------------------------------------------------
// LowHPRatioTargetFinder
//--------------------------------------------------------------------------------------------------------------
class LowHPRatioTargetFinder : public TargetFinder
{
public :
virtual bool operator () (Object* pObject)
{
if( !CheckTarget( pObject ) ) return false;
Character* pTarget = dynamic_cast<Character*>(pObject);
if( pTarget->IsDead() ) return false;
if( !pTarget->CanBeAttacked() ) return false;
DWORD dwMaxHP = max( 1, pTarget->GetMaxHP() );
DWORD TargetHPRatio = pTarget->GetHP() * 100 / dwMaxHP;
if( m_pTarget && TargetHPRatio >= m_LowHPRatio ) return false;
m_pTarget = pTarget;
m_LowHPRatio = TargetHPRatio;
// not found --> continue
return false;
}
private :
DWORD m_LowHPRatio;
};
//--------------------------------------------------------------------------------------------------------------
// LowHPTargetFinder
//--------------------------------------------------------------------------------------------------------------
class LowHPTargetFinder : public TargetFinder
{
public :
virtual bool operator () (Object* pObject)
{
if( !CheckTarget( pObject ) ) return false;
Character* pTarget = dynamic_cast<Character*>(pObject);
if( pTarget->IsDead() ) return false;
if( !pTarget->CanBeAttacked() ) return false;
DWORD TargetHP = pTarget->GetHP();
if( m_pTarget && TargetHP >= m_LowHP ) return false;
m_pTarget = pTarget;
m_LowHP = TargetHP;
// not found --> continue
return false;
}
private :
DWORD m_LowHP;
};
//--------------------------------------------------------------------------------------------------------------
// LowLevelTargetFinder
//--------------------------------------------------------------------------------------------------------------
class LowLevelTargetFinder : public TargetFinder
{
public :
virtual bool operator () (Object* pObject)
{
if( !CheckTarget( pObject ) ) return false;
Character* pTarget = dynamic_cast<Character*>(pObject);
if( pTarget->IsDead() ) return false;
if( !pTarget->CanBeAttacked() ) return false;
LEVELTYPE TargetLevel = pTarget->GetLevel();
if( m_pTarget && TargetLevel >= m_LowLevel ) return false;
m_pTarget = pTarget;
m_LowLevel = TargetLevel;
// not found --> continue
return false;
}
private :
LEVELTYPE m_LowLevel;
};
//--------------------------------------------------------------------------------------------------------------
// HighMPTargetFinder
//--------------------------------------------------------------------------------------------------------------
class HighMPTargetFinder : public TargetFinder
{
public :
virtual bool operator () (Object* pObject)
{
if( !CheckTarget( pObject ) ) return false;
Character* pTarget = dynamic_cast<Character*>(pObject);
if( pTarget->IsDead() ) return false;
if( !pTarget->CanBeAttacked() ) return false;
DWORD TargetMP = pTarget->GetMP();
if( m_pTarget && TargetMP < m_HighMP ) return false;
m_pTarget = pTarget;
m_HighMP = TargetMP;
// not found --> continue
return false;
}
private :
DWORD m_HighMP;
};
//--------------------------------------------------------------------------------------------------------------
// DeadTargetFinder
//--------------------------------------------------------------------------------------------------------------
class DeadTargetFinder : public TargetFinder
{
public :
bool operator () (Object* pObject)
{
if( !CheckTarget( pObject ) ) return false;
Character* pTarget = dynamic_cast<Character*>(pObject);
if( pTarget->IsAlive() ) return false;
m_pTarget = pTarget;
// not found --> continue
return false;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -