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

📄 friendfinder.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 H
字号:
#pragma once

#include "Character.h"

// 拳老捞抚 官层具 茄促. -_-;

//--------------------------------------------------------------------------------------------------------------
//
//										CharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 漂沥 惑怕狼 某腐磐甫 茫绰促.
class CharacterFinder
{
public :
	CharacterFinder() 
	{
		Init();
	}

	VOID			Init()
	{
		m_pOwner			= NULL;
		m_SkillCode			= SKILLCODE_INVALID;
		m_pTargetCharacter	= NULL;
		m_Value				= 0;
	}

	virtual VOID	SetOwner( Character* pOwner )		{ m_pOwner = pOwner; }
	VOID			SetSkillCode(CODETYPE skillCode)	{ m_SkillCode = skillCode; }
	VOID			SetValue( DWORD value )				{ m_Value = value; }

	// 搬苞
	Character*		GetTargetCharacter()				{ return m_pTargetCharacter;	}

	virtual bool	operator () (Object* pObject) = 0;

protected :
	Character*		m_pOwner;
	CODETYPE		m_SkillCode;
	Character*		m_pTargetCharacter;
	DWORD			m_Value;			// TODO: 捞芭绰 SkillCode俊辑 佬绢客具 且淀.
};

//--------------------------------------------------------------------------------------------------------------
//
//										WeakestCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 啊厘 眉仿捞 利篮 某腐磐 茫扁
class WeakestCharacterFinder : public CharacterFinder
{
public :
	virtual bool operator () (Object* pObject)
	{
		ASSERT( pObject != NULL );
		ASSERT( pObject->GetObjectType() & CHARACTER_OBJECT );

		Character* pCharacter = dynamic_cast<Character*>(pObject);
		ASSERT( pCharacter != NULL );

		DWORD dwMaxHP = max( 1, pCharacter->GetMaxHP() );
		DWORD RemainPercent = pCharacter->GetHP() * 100 / dwMaxHP;
		DWORD TargetRemainPercent = 100;
		if( m_pTargetCharacter )	
		{
			DWORD dwMaxHP = max( 1, m_pTargetCharacter->GetMaxHP() );
			TargetRemainPercent = m_pTargetCharacter->GetHP() * 100 / dwMaxHP;
		}

		if ( pCharacter->IsAlive()
			&& ( m_pTargetCharacter==NULL || RemainPercent < TargetRemainPercent ) )
		{
			m_pTargetCharacter = pCharacter;
		}		

		// not found --> continue
		return false;
	}
};


//--------------------------------------------------------------------------------------------------------------
//
//										DoBuffCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 滚橇甫 吧绢临父茄 某腐磐 茫扁
class DoBuffCharacterFinder : public CharacterFinder
{
public :
	virtual bool			operator () (Object* pObject)
	{
		ASSERT( pObject != NULL );
		ASSERT( pObject->GetObjectType() & CHARACTER_OBJECT );

		Character* pCharacter = dynamic_cast<Character*>(pObject);
		ASSERT( pCharacter != NULL );

		if (m_pTargetCharacter==NULL
			&& pCharacter->IsAlive())// && !m_pTargetCharacter->HasBuff(m_SkillCode) )
		{
			m_pTargetCharacter = pCharacter;

			return true;
		}		

		// not found --> continue
		return false;
	}
};



//--------------------------------------------------------------------------------------------------------------
//
//										DeadCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 磷篮 某腐磐 茫扁
class DeadCharacterFinder : public CharacterFinder
{
public :	
	bool			operator () (Object* pObject)
	{
		ASSERT( pObject != NULL );
		ASSERT( pObject->GetObjectType() & CHARACTER_OBJECT );

		Character* pCharacter = dynamic_cast<Character*>(pObject);
		ASSERT( pCharacter != NULL );

		if (m_pOwner != pCharacter
			&& !pCharacter->IsAlive())
		{
			m_pTargetCharacter = pCharacter;

			// found! --> break
			return true;
		}		

		// not found --> continue
		return false;
	}
};

//--------------------------------------------------------------------------------------------------------------
//
//										NearestCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
class NearestCharacterFinder : public CharacterFinder
{
public :	
	NearestCharacterFinder() : m_eTargetType(SKILL_TARGET_NONE)
	{	
	}

	bool			operator () (Object* pObject)
	{
		Character* pTarget = dynamic_cast<Character*>(pObject);
		if( !pTarget )	return false;

		float fDist = pTarget->GetDist( m_AttackerPos );
		
		if( m_pOwner == pTarget )		return false;
		if( pTarget->IsDead() )			return false;
		if( fDist >= m_AttackerSight )	return false;
		if( m_pTargetCharacter!=NULL && fDist >= m_TargetDist )					return false;
		if( !m_pOwner->IsCoincidentWithTargetType( pTarget, m_eTargetType ) )	return false;

		m_pTargetCharacter = pTarget;
		m_TargetDist = fDist;
		return false;
	}

	virtual VOID SetOwner( Character* pAttacker )
	{
		CharacterFinder::SetOwner(pAttacker);

		ASSERT( pAttacker != NULL );
		pAttacker->GetPos( &m_AttackerPos );
		m_AttackerSight = pAttacker->GetSightRange();
	}

	virtual VOID SetTargetType( eSKILL_TARGET_TYPE eType )
	{
		m_eTargetType = eType;
	}

private :
	float				m_AttackerSight;
	WzVector			m_AttackerPos;
	float				m_TargetDist;

	eSKILL_TARGET_TYPE	m_eTargetType;	// 茫酒具且 鸥百 鸥涝
};

//--------------------------------------------------------------------------------------------------------------
//
//										NearestCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
class SameObjectKeyFinder : public CharacterFinder
{
public :	
	SameObjectKeyFinder()
	{		
	}

	bool			operator () (Object* pObject)
	{
		Character* pCharacter = dynamic_cast<Character*>(pObject);
		ASSERT( pCharacter != NULL );

		if (pObject->GetObjectKey() == m_Value)
		{
			m_pTargetCharacter	= pCharacter;
			return true;
		}		

		// not found --> continue
		return false;
	}
};

//--------------------------------------------------------------------------------------------------------------
//
//										SelfCharacterFinder
//
//--------------------------------------------------------------------------------------------------------------
// 唱甫 茫绰促.
class SelfCharacterFinder : public CharacterFinder
{
public :
	SelfCharacterFinder() 
	{
	}

	bool			operator () (Object* pObject)
	{
		ASSERT(m_pOwner != NULL);
		m_pTargetCharacter	= m_pOwner;
		return true;
	}
};

⌨️ 快捷键说明

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