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

📄 targetfinder.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -